Full onContact data+inlining

This commit is contained in:
bloeys
2022-02-18 03:39:11 +04:00
parent d143660a1f
commit dddb8a65d5
23 changed files with 439 additions and 121 deletions

View File

@ -10,7 +10,15 @@ extern "C" {
float hx, hy, hz;
};
CPxAPI CPxInline CSTRUCT CPxBoxGeometry NewCPxBoxGeometry(float hx, float hy, float hz);
CPxAPI CPxInline CSTRUCT CPxBoxGeometry NewCPxBoxGeometry(float hx, float hy, float hz)
{
CSTRUCT CPxBoxGeometry cbg;
cbg.hx = hx;
cbg.hy = hy;
cbg.hz = hz;
return cbg;
}
#ifdef __cplusplus
}

View File

@ -10,7 +10,13 @@ extern "C" {
CPxReal radius, halfHeight;
};
CPxAPI CPxInline CSTRUCT CPxCapsuleGeometry NewCPxCapsuleGeometry(CPxReal radius, CPxReal halfHeight);
CPxAPI CPxInline CSTRUCT CPxCapsuleGeometry NewCPxCapsuleGeometry(CPxReal radius, CPxReal halfHeight)
{
CSTRUCT CPxCapsuleGeometry c;
c.radius = radius;
c.halfHeight = halfHeight;
return c;
}
#ifdef __cplusplus
}

View File

@ -269,34 +269,55 @@ extern "C" {
CPxPairFlags_eTRIGGER_DEFAULT = CPxPairFlags_eNOTIFY_TOUCH_FOUND | CPxPairFlags_eNOTIFY_TOUCH_LOST | CPxPairFlags_eDETECT_DISCRETE_CONTACT
};
//TODO: uintxx_t not available again
struct CPxContactPairPoint
{
/**
\brief The position of the contact point between the shapes, in world space.
*/
CSTRUCT CPxVec3 position;
/**
\brief The separation of the shapes at the contact point. A negative separation denotes a penetration.
*/
CPxReal separation;
/**
\brief The normal of the contacting surfaces at the contact point. The normal direction points from the second shape to the first shape.
*/
CSTRUCT CPxVec3 normal;
/**
\brief The surface index of shape 0 at the contact point. This is used to identify the surface material.
*/
CPxU32 internalFaceIndex0;
/**
\brief The impulse applied at the contact point, in world space. Divide by the simulation time step to get a force value.
*/
CSTRUCT CPxVec3 impulse;
/**
\brief The surface index of shape 1 at the contact point. This is used to identify the surface material.
*/
CPxU32 internalFaceIndex1;
};
struct CPxContactPair
{
CSTRUCT CPxShape shapes[2];
char* contactPatches;
//const PxU8* contactPatches;
char* contactPoints;
//const PxU8* contactPoints;
CPxU8* contactPatches;
CPxU8* contactPoints;
CPxReal* contactImpulses;
CPxU32 requiredBufferSize;
CPxU8 contactCount;
CPxU8 patchCount;
CPxU16 contactStreamSize;
unsigned int requiredBufferSize;
//CPxU32 requiredBufferSize;
char contactCount;
//PxU8 contactCount;
char patchCount;
//PxU8 patchCount;
short contactStreamSize;
//PxU16 contactStreamSize;
CENUM CPxContactPairFlag flags;
CENUM CPxPairFlags events;
CENUM CPxContactPairFlag flags;
CSTRUCT CPxContactPairPoint* extractedContactPoints;
};
enum CPxContactPairHeaderFlag
@ -309,17 +330,13 @@ extern "C" {
{
CSTRUCT CPxRigidActor actors[2];
char* extraDataStream;
short extraDataStreamSize;
/*CPxU8* extraDataStream;
CPxU16 extraDataStreamSize;*/
CPxU8* extraDataStream;
CPxU16 extraDataStreamSize;
CENUM CPxContactPairHeaderFlag flags;
CSTRUCT CPxContactPair* pairs;
unsigned int nbPairs;
//CPxU32 nbPairs;
CPxU32 nbPairs;
};
#ifdef __cplusplus

View File

@ -1,20 +0,0 @@
#ifndef CPxDefaultSimulationFilterShader_H
#define CPxDefaultSimulationFilterShader_H
#ifdef __cplusplus
extern "C" {
#endif
struct CPxDefaultSimulationFilterShader
{
void* obj;
};
//CPxAPI CSTRUCT CPxDefaultSimulationFilterShader* NewCPxDefaultSimulationFilterShader();
//CPxAPI void FreeCPxDefaultSimulationFilterShader(CSTRUCT CPxDefaultSimulationFilterShader*);
#ifdef __cplusplus
}
#endif
#endif // !CPxDefaultSimulationFilterShader_H

View File

@ -1,22 +1,18 @@
#ifndef CPxFilterData_H
#define CPxFilterData_H
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
struct CPxFilterData
{
unsigned int word0;
unsigned int word1;
unsigned int word2;
unsigned int word3;
//TODO: For some reason only this file breaks with CPxU32 (uint32_t). Why?
/*CPxU32 word0;
CPxU32 word0;
CPxU32 word1;
CPxU32 word2;
CPxU32 word3;*/
CPxU32 word3;
};
#ifdef __cplusplus

View File

@ -28,14 +28,55 @@ extern "C" {
CENUM CPxGeometryType type;
};
CPxAPI CPxInline CSTRUCT CPxSphereGeometry CPxGeometry_toCPxSphereGeometry(CSTRUCT CPxGeometry);
CPxAPI CPxInline CSTRUCT CPxGeometry CPxSphereGeometry_toCPxGeometry(CSTRUCT CPxSphereGeometry*);
//
// CPxSphereGeometry
//
CPxAPI CPxInline CSTRUCT CPxSphereGeometry CPxGeometry_toCPxSphereGeometry(CSTRUCT CPxGeometry cg)
{
return *(CSTRUCT CPxSphereGeometry*)(cg.obj);
//return *static_cast<CSTRUCT CPxSphereGeometry*>(cg.obj);
}
CPxAPI CPxInline CSTRUCT CPxBoxGeometry CPxGeometry_toCPxBoxGeometry(CSTRUCT CPxGeometry);
CPxAPI CPxInline CSTRUCT CPxGeometry CPxBoxGeometry_toCPxGeometry(CSTRUCT CPxBoxGeometry*);
CPxAPI CPxInline CSTRUCT CPxGeometry CPxSphereGeometry_toCPxGeometry(CSTRUCT CPxSphereGeometry* csg)
{
CSTRUCT CPxGeometry g;
g.obj = csg;
g.type = CPxGeometryType_eSPHERE;
return g;
}
CPxAPI CPxInline CSTRUCT CPxCapsuleGeometry CPxGeometry_toCPxCapsuleGeometry(CSTRUCT CPxGeometry);
CPxAPI CPxInline CSTRUCT CPxGeometry CPxCapsuleGeometry_toCPxGeometry(CSTRUCT CPxCapsuleGeometry*);
//
// CPxBoxGeometry
//
CPxAPI CPxInline CSTRUCT CPxBoxGeometry CPxGeometry_toCPxBoxGeometry(CSTRUCT CPxGeometry cg)
{
return *(CSTRUCT CPxBoxGeometry*)(cg.obj);
//return *static_cast<CSTRUCT CPxBoxGeometry*>(cg.obj);
}
CPxAPI CPxInline CSTRUCT CPxGeometry CPxBoxGeometry_toCPxGeometry(CSTRUCT CPxBoxGeometry* cbg)
{
CSTRUCT CPxGeometry g;
g.obj = cbg;
g.type = CPxGeometryType_eBOX;
return g;
}
//
// CPxCapsuleGeometry
//
CPxAPI CPxInline CSTRUCT CPxCapsuleGeometry CPxGeometry_toCPxCapsuleGeometry(CSTRUCT CPxGeometry cg)
{
return *(CSTRUCT CPxCapsuleGeometry*)(cg.obj);
}
CPxAPI CPxInline CSTRUCT CPxGeometry CPxCapsuleGeometry_toCPxGeometry(CSTRUCT CPxCapsuleGeometry* ccg)
{
CSTRUCT CPxGeometry g;
g.obj = ccg;
g.type = CPxGeometryType_eCAPSULE;
return g;
}
#ifdef __cplusplus
}

View File

@ -5,7 +5,7 @@
extern "C" {
#endif
//TODO: Maybe convert this into a value type like CPxSphereGeometry?
//NOTE: Maybe convert this into a value type like CPxSphereGeometry?
struct CPxPlane
{
void* obj;

View File

@ -10,8 +10,17 @@ extern "C" {
float x, y, z, w;
};
CPxAPI CPxInline CSTRUCT CPxQuat NewCPxQuat(float angleRads, float x, float y, float z);
CPxAPI CPxInline CSTRUCT CPxQuat NewCPxQuatXYZW(float x, float y, float z, float w);
CPxAPI CSTRUCT CPxQuat NewCPxQuat(float angleRads, float x, float y, float z);
CPxAPI CPxInline CSTRUCT CPxQuat NewCPxQuatXYZW(float x, float y, float z, float w)
{
CSTRUCT CPxQuat q;
q.x = x;
q.y = y;
q.z = z;
q.w = w;
return q;
}
#ifdef __cplusplus
}

View File

@ -11,11 +11,33 @@
extern "C" {
#endif
enum CPxHitFlag
{
CPxHitFlag_ePOSITION = (1 << 0), //!< "position" member of #PxQueryHit is valid
CPxHitFlag_eNORMAL = (1 << 1), //!< "normal" member of #PxQueryHit is valid
CPxHitFlag_eUV = (1 << 3), //!< "u" and "v" barycentric coordinates of #PxQueryHit are valid. Not applicable to sweep queries.
CPxHitFlag_eASSUME_NO_INITIAL_OVERLAP = (1 << 4), //!< Performance hint flag for sweeps when it is known upfront there's no initial overlap.
//!< NOTE: using this flag may cause undefined results if shapes are initially overlapping.
CPxHitFlag_eMESH_MULTIPLE = (1 << 5), //!< Report all hits for meshes rather than just the first. Not applicable to sweep queries.
CPxHitFlag_eMESH_ANY = (1 << 6), //!< Report any first hit for meshes. If neither eMESH_MULTIPLE nor eMESH_ANY is specified,
//!< a single closest hit will be reported for meshes.
CPxHitFlag_eMESH_BOTH_SIDES = (1 << 7), //!< Report hits with back faces of mesh triangles. Also report hits for raycast
//!< originating on mesh surface and facing away from the surface normal. Not applicable to sweep queries.
//!< Please refer to the user guide for heightfield-specific differences.
CPxHitFlag_ePRECISE_SWEEP = (1 << 8), //!< Use more accurate but slower narrow phase sweep tests.
//!< May provide better compatibility with PhysX 3.2 sweep behavior.
CPxHitFlag_eMTD = (1 << 9), //!< Report the minimum translation depth, normal and contact point.
CPxHitFlag_eFACE_INDEX = (1 << 10), //!< "face index" member of #PxQueryHit is valid
CPxHitFlag_eDEFAULT = CPxHitFlag_ePOSITION | CPxHitFlag_eNORMAL | CPxHitFlag_eFACE_INDEX,
/** \brief Only this subset of flags can be modified by pre-filter. Other modifications will be discarded. */
CPxHitFlag_eMODIFIABLE_FLAGS = CPxHitFlag_eMESH_MULTIPLE | CPxHitFlag_eMESH_BOTH_SIDES | CPxHitFlag_eASSUME_NO_INITIAL_OVERLAP | CPxHitFlag_ePRECISE_SWEEP
};
struct CPxRaycastHit
{
//CPxHitFlags flags; //!< Hit flags specifying which members contain valid values.
struct CPxVec3 position; //!< World-space hit position (flag: #PxHitFlag::ePOSITION)
struct CPxVec3 normal; //!< World-space hit normal (flag: #PxHitFlag::eNORMAL)
CENUM CPxHitFlag flags; //!< Hit flags specifying which members contain valid values.
CSTRUCT CPxVec3 position; //!< World-space hit position (flag: #PxHitFlag::ePOSITION)
CSTRUCT CPxVec3 normal; //!< World-space hit normal (flag: #PxHitFlag::eNORMAL)
/**
\brief Distance to hit.
@ -24,14 +46,14 @@ extern "C" {
CPxF32 distance;
CPxReal u, v;
CPxU32 faceIndex;
struct CPxShape shape;
struct CPxRigidActor actor;
CSTRUCT CPxShape shape;
CSTRUCT CPxRigidActor actor;
};
struct CPxRaycastBuffer
{
struct CPxRaycastHit block;
struct CPxRaycastHit* touches;
CSTRUCT CPxRaycastHit block;
CSTRUCT CPxRaycastHit* touches;
CPxU32 nbTouches;
bool hasBlock;
};
@ -58,7 +80,7 @@ extern "C" {
/// If multiples passed are zero then any existing buffers are cleared
/// </summary>
/// <returns></returns>
CPxAPI void CPxScene_setScratchBuffer(CSTRUCT CPxScene*, uint32_t multiplesOf16k);
CPxAPI void CPxScene_setScratchBuffer(CSTRUCT CPxScene*, CPxU32 multiplesOf16k);
CPxAPI void CPxScene_release(CSTRUCT CPxScene*);

View File

@ -10,7 +10,12 @@ extern "C" {
CPxReal radius;
};
CPxAPI CPxInline CSTRUCT CPxSphereGeometry NewCPxSphereGeometry(CPxReal radius);
CPxAPI CPxInline CSTRUCT CPxSphereGeometry NewCPxSphereGeometry(CPxReal radius)
{
CSTRUCT CPxSphereGeometry c;
c.radius = radius;
return c;
}
#ifdef __cplusplus
}

View File

@ -14,7 +14,14 @@ extern "C" {
CSTRUCT CPxQuat q;
};
CPxAPI CPxInline CSTRUCT CPxTransform NewCPxTransform(CSTRUCT CPxVec3*, CSTRUCT CPxQuat*);
CPxAPI CPxInline CSTRUCT CPxTransform NewCPxTransform(CSTRUCT CPxVec3* v, CSTRUCT CPxQuat* q)
{
CSTRUCT CPxTransform t;
t.p = *v;
t.q = *q;
return t;
}
#ifdef __cplusplus
}
#endif

View File

@ -9,7 +9,15 @@ extern "C" {
float x, y, z;
};
CPxAPI CPxInline CSTRUCT CPxVec3 NewCPxVec3(float x, float y, float z);
CPxAPI CPxInline CSTRUCT CPxVec3 NewCPxVec3(float x, float y, float z)
{
CSTRUCT CPxVec3 v;
v.x = x;
v.y = y;
v.z = z;
return v;
}
#ifdef __cplusplus
}