59 lines
1.9 KiB
C
59 lines
1.9 KiB
C
// SPDX-FileCopyrightText: 2023 Erin Catto
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
#pragma once
|
|
|
|
#include "array.h"
|
|
#include "bitset.h"
|
|
#include "constants.h"
|
|
|
|
typedef struct b2Body b2Body;
|
|
typedef struct b2ContactSim b2ContactSim;
|
|
typedef struct b2Contact b2Contact;
|
|
typedef struct b2ContactConstraint b2ContactConstraint;
|
|
typedef struct b2ContactConstraintSIMD b2ContactConstraintSIMD;
|
|
typedef struct b2JointSim b2JointSim;
|
|
typedef struct b2Joint b2Joint;
|
|
typedef struct b2StepContext b2StepContext;
|
|
typedef struct b2World b2World;
|
|
|
|
// This holds constraints that cannot fit the graph color limit. This happens when a single dynamic body
|
|
// is touching many other bodies.
|
|
#define B2_OVERFLOW_INDEX (B2_GRAPH_COLOR_COUNT - 1)
|
|
|
|
typedef struct b2GraphColor
|
|
{
|
|
// This bitset is indexed by bodyId so this is over-sized to encompass static bodies
|
|
// however I never traverse these bits or use the bit count for anything
|
|
// This bitset is unused on the overflow color.
|
|
// todo consider having a uint_16 per body that tracks the graph color membership
|
|
b2BitSet bodySet;
|
|
|
|
// cache friendly arrays
|
|
b2ContactSimArray contactSims;
|
|
b2JointSimArray jointSims;
|
|
|
|
// transient
|
|
union
|
|
{
|
|
b2ContactConstraintSIMD* simdConstraints;
|
|
b2ContactConstraint* overflowConstraints;
|
|
};
|
|
} b2GraphColor;
|
|
|
|
typedef struct b2ConstraintGraph
|
|
{
|
|
// including overflow at the end
|
|
b2GraphColor colors[B2_GRAPH_COLOR_COUNT];
|
|
} b2ConstraintGraph;
|
|
|
|
void b2CreateGraph( b2ConstraintGraph* graph, int bodyCapacity );
|
|
void b2DestroyGraph( b2ConstraintGraph* graph );
|
|
|
|
void b2AddContactToGraph( b2World* world, b2ContactSim* contactSim, b2Contact* contact );
|
|
void b2RemoveContactFromGraph( b2World* world, int bodyIdA, int bodyIdB, int colorIndex, int localIndex );
|
|
|
|
b2JointSim* b2CreateJointInGraph( b2World* world, b2Joint* joint );
|
|
void b2AddJointToGraph( b2World* world, b2JointSim* jointSim, b2Joint* joint );
|
|
void b2RemoveJointFromGraph( b2World* world, int bodyIdA, int bodyIdB, int colorIndex, int localIndex );
|