mirror of
https://github.com/bloeys/physx-go.git
synced 2025-12-29 16:08:20 +00:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 07bf698c2c | |||
| c740204bd5 | |||
| 8c12404511 | |||
| fdb8fbbccf | |||
| 3d0a4f977b | |||
| 5a55870493 |
28
main.go
28
main.go
@ -2,12 +2,17 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
"github.com/bloeys/physx-go/pgo"
|
"github.com/bloeys/physx-go/pgo"
|
||||||
)
|
)
|
||||||
|
|
||||||
func contactHandler(cph pgo.ContactPairHeader) {
|
func contactHandler(cph pgo.ContactPairHeader) {
|
||||||
|
|
||||||
|
// ra1 := cph.GetRigidActors()[0]
|
||||||
|
// ra2 := cph.GetRigidActors()[1]
|
||||||
|
// fmt.Printf("Collision! User data 1: %v; User data 2: %v\n", ra1.GetUserData(), ra2.GetUserData())
|
||||||
|
|
||||||
// pairs := cph.GetPairs()
|
// pairs := cph.GetPairs()
|
||||||
// for i := 0; i < len(pairs); i++ {
|
// for i := 0; i < len(pairs); i++ {
|
||||||
|
|
||||||
@ -138,6 +143,21 @@ func main() {
|
|||||||
raycastBuffer := pgo.NewRaycastBuffer(1)
|
raycastBuffer := pgo.NewRaycastBuffer(1)
|
||||||
defer raycastBuffer.Release()
|
defer raycastBuffer.Release()
|
||||||
|
|
||||||
|
// Example of correct usage of user data
|
||||||
|
x := new(int64)
|
||||||
|
*x = 1095
|
||||||
|
ra.SetUserData(unsafe.Pointer(x))
|
||||||
|
z := (*int64)(ra.GetUserData())
|
||||||
|
fmt.Println("User data:", *z)
|
||||||
|
|
||||||
|
// The rigid actor might get garbage collected after this point (as its no longer used), but that will now cause
|
||||||
|
// a memory leak and a crash since the user data got pinned (i.e. GC will not move or free it) when we used SetUserData above, but can no longer be unpinned as the runtime.Pinner object will get garbage collected with the rigid actor.
|
||||||
|
//
|
||||||
|
// To solve this we have 2 options:
|
||||||
|
// 1. The pinner is unpinned before it is garbage collected by calling ClearUserData
|
||||||
|
// 2. The object holding the active pinner (the rigid actor on which SetUserData was used) must remain alive (e.g. by pinning it, putting it in file scope, in a long lived object etc)
|
||||||
|
ra.ClearUserData()
|
||||||
|
|
||||||
scene.SetScratchBuffer(4)
|
scene.SetScratchBuffer(4)
|
||||||
for {
|
for {
|
||||||
scene.Collide(1 / 50.0)
|
scene.Collide(1 / 50.0)
|
||||||
@ -147,10 +167,10 @@ func main() {
|
|||||||
|
|
||||||
scene.RaycastWithHitBuffer(pgo.NewVec3(0, 0, 0), pgo.NewVec3(0, 1, 0), 9, raycastBuffer, 1)
|
scene.RaycastWithHitBuffer(pgo.NewVec3(0, 0, 0), pgo.NewVec3(0, 1, 0), 9, raycastBuffer, 1)
|
||||||
if raycastBuffer.HasBlock() {
|
if raycastBuffer.HasBlock() {
|
||||||
block := raycastBuffer.GetBlock()
|
// block := raycastBuffer.GetBlock()
|
||||||
d := block.GetDistance()
|
// d := block.GetDistance()
|
||||||
pos := block.GetPos()
|
// pos := block.GetPos()
|
||||||
fmt.Printf("Raycast hit at dist (%v) and post %v\n", d, pos.String())
|
// fmt.Printf("Raycast hit at dist (%v) and post %v\n", d, pos.String())
|
||||||
}
|
}
|
||||||
// fmt.Printf("\nRaycast hit: %v\n", rHit)
|
// fmt.Printf("\nRaycast hit: %v\n", rHit)
|
||||||
// fmt.Println("Press enter...")
|
// fmt.Println("Press enter...")
|
||||||
|
|||||||
26
pgo/callbackExports.go
Executable file
26
pgo/callbackExports.go
Executable file
@ -0,0 +1,26 @@
|
|||||||
|
package pgo
|
||||||
|
|
||||||
|
/*
|
||||||
|
#include "wrap.c"
|
||||||
|
*/
|
||||||
|
import "C"
|
||||||
|
import "unsafe"
|
||||||
|
|
||||||
|
//export goOnContactCallback
|
||||||
|
func goOnContactCallback(p unsafe.Pointer) {
|
||||||
|
contactCallback(ContactPairHeader{cCPH: (*C.struct_CPxContactPairHeader)(p)})
|
||||||
|
}
|
||||||
|
|
||||||
|
//export goOnTriggerCallback
|
||||||
|
func goOnTriggerCallback(p unsafe.Pointer, count uint32) {
|
||||||
|
|
||||||
|
// @PERF
|
||||||
|
triggerPairs := make([]TriggerPair, count)
|
||||||
|
tPairs := unsafe.Slice((*C.struct_CPxTriggerPair)(p), count)
|
||||||
|
|
||||||
|
for i := 0; i < len(triggerPairs); i++ {
|
||||||
|
triggerPairs[i].cTp = &tPairs[i]
|
||||||
|
}
|
||||||
|
|
||||||
|
triggerCallback(triggerPairs)
|
||||||
|
}
|
||||||
@ -1,10 +1,18 @@
|
|||||||
package pgo
|
package pgo
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
#include <stdint.h> // Needed for uint32_t
|
||||||
|
|
||||||
void goOnContactCallback_cgo(void* pairHeader)
|
void goOnContactCallback_cgo(void* pairHeader)
|
||||||
{
|
{
|
||||||
void goOnContactCallback(void*);
|
void goOnContactCallback(void*);
|
||||||
goOnContactCallback(pairHeader);
|
goOnContactCallback(pairHeader);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void goOnTriggerCallback_cgo(void* triggerPairs, uint32_t count)
|
||||||
|
{
|
||||||
|
void goOnTriggerCallback(void*, uint32_t);
|
||||||
|
goOnTriggerCallback(triggerPairs, count);
|
||||||
|
}
|
||||||
*/
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
|
|||||||
@ -1,12 +0,0 @@
|
|||||||
package pgo
|
|
||||||
|
|
||||||
/*
|
|
||||||
#include "wrap.c"
|
|
||||||
*/
|
|
||||||
import "C"
|
|
||||||
import "unsafe"
|
|
||||||
|
|
||||||
//export goOnContactCallback
|
|
||||||
func goOnContactCallback(p unsafe.Pointer) {
|
|
||||||
contactCallback(ContactPairHeader{cCPH: (*C.struct_CPxContactPairHeader)(p)})
|
|
||||||
}
|
|
||||||
Binary file not shown.
Binary file not shown.
134
pgo/pgo.go
134
pgo/pgo.go
@ -13,9 +13,11 @@ package pgo
|
|||||||
|
|
||||||
//simulation event callbacks forward declarations. Actual definitions MUST be in a go different file
|
//simulation event callbacks forward declarations. Actual definitions MUST be in a go different file
|
||||||
void goOnContactCallback_cgo(void* pairHeader);
|
void goOnContactCallback_cgo(void* pairHeader);
|
||||||
|
void goOnTriggerCallback_cgo(void* triggerPairs, CPxU32 count);
|
||||||
*/
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
import (
|
import (
|
||||||
|
"runtime"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/bloeys/gglm/gglm"
|
"github.com/bloeys/gglm/gglm"
|
||||||
@ -23,6 +25,7 @@ import (
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
contactCallback func(ContactPairHeader) = func(ContactPairHeader) {}
|
contactCallback func(ContactPairHeader) = func(ContactPairHeader) {}
|
||||||
|
triggerCallback func([]TriggerPair) = func([]TriggerPair) {}
|
||||||
)
|
)
|
||||||
|
|
||||||
type Foundation struct {
|
type Foundation struct {
|
||||||
@ -395,11 +398,18 @@ func (sd *SceneDesc) SetCpuDispatcher(cd CpuDispatcher) {
|
|||||||
C.CPxSceneDesc_set_cpuDispatcher(sd.cSD, cd.cCpuDisp)
|
C.CPxSceneDesc_set_cpuDispatcher(sd.cSD, cd.cCpuDisp)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetOnContactCallback sets the GLOBAL contact callback handler. Physx-c currently only supports 1 contact callback handler.
|
// SetOnContactCallback sets the GLOBAL contact callback handler. We currently only supports 1 contact callback handler.
|
||||||
// Setting a contact callback handler overrides the previous one. Only the most recent one gets called.
|
// Setting a contact callback handler overrides the previous one. Only the most recent one gets called.
|
||||||
func (sd *SceneDesc) SetOnContactCallback(cb func(ContactPairHeader)) {
|
func (sd *SceneDesc) SetOnContactCallback(cb func(ContactPairHeader)) {
|
||||||
contactCallback = cb
|
contactCallback = cb
|
||||||
C.CPxSceneDesc_set_onContactCallback(sd.cSD, (C.CPxonContactCallback)(unsafe.Pointer(C.goOnContactCallback_cgo)))
|
C.CPxSceneDesc_set_onContactCallback(sd.cSD, (C.CPxOnContactCallback)(unsafe.Pointer(C.goOnContactCallback_cgo)))
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetOnTriggerCallback sets the GLOBAL trigger callback handler. We currently only supports 1 trugger callback handler.
|
||||||
|
// Setting a handler overrides the previous one. Only the most recent one gets called.
|
||||||
|
func (sd *SceneDesc) SetOnTriggerCallback(cb func([]TriggerPair)) {
|
||||||
|
triggerCallback = cb
|
||||||
|
C.CPxSceneDesc_set_onTriggerCallback(sd.cSD, (C.CPxOnTriggerCallback)(unsafe.Pointer(C.goOnTriggerCallback_cgo)))
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSceneDesc(ts TolerancesScale) SceneDesc {
|
func NewSceneDesc(ts TolerancesScale) SceneDesc {
|
||||||
@ -509,6 +519,42 @@ func (cpp *ContactPairPoint) GetInternalFaceIndices() (float32, float32) {
|
|||||||
return float32(cpp.cCpp.internalFaceIndex0), float32(cpp.cCpp.internalFaceIndex1)
|
return float32(cpp.cCpp.internalFaceIndex0), float32(cpp.cCpp.internalFaceIndex1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type TriggerPair struct {
|
||||||
|
cTp *C.struct_CPxTriggerPair
|
||||||
|
}
|
||||||
|
|
||||||
|
func (tp *TriggerPair) TriggerShape() Shape {
|
||||||
|
return Shape{
|
||||||
|
cShape: tp.cTp.triggerShape,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (tp *TriggerPair) TriggerActor() RigidActor {
|
||||||
|
return RigidActor{
|
||||||
|
cRa: tp.cTp.triggerActor,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (tp *TriggerPair) OtherShape() Shape {
|
||||||
|
return Shape{
|
||||||
|
cShape: tp.cTp.otherShape,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (tp *TriggerPair) OtherActor() RigidActor {
|
||||||
|
return RigidActor{
|
||||||
|
cRa: tp.cTp.otherActor,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (tp *TriggerPair) Status() PairFlags {
|
||||||
|
return PairFlags(tp.cTp.status)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (tp *TriggerPair) Flags() TriggerPairFlag {
|
||||||
|
return TriggerPairFlag(tp.cTp.flags)
|
||||||
|
}
|
||||||
|
|
||||||
type PvdSceneFlag uint32
|
type PvdSceneFlag uint32
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -544,7 +590,6 @@ type Quat struct {
|
|||||||
cQ C.struct_CPxQuat
|
cQ C.struct_CPxQuat
|
||||||
}
|
}
|
||||||
|
|
||||||
// CPxAPI CPxInline CSTRUCT CPxQuat NewCPxQuat(float angleRads, float x, float y, float z);
|
|
||||||
func NewQuat(angleRads, x, y, z float32) *Quat {
|
func NewQuat(angleRads, x, y, z float32) *Quat {
|
||||||
return &Quat{
|
return &Quat{
|
||||||
cQ: C.NewCPxQuat(C.float(angleRads), C.float(x), C.float(y), C.float(z)),
|
cQ: C.NewCPxQuat(C.float(angleRads), C.float(x), C.float(y), C.float(z)),
|
||||||
@ -555,6 +600,50 @@ type Transform struct {
|
|||||||
cT C.struct_CPxTransform
|
cT C.struct_CPxTransform
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *Transform) Pos() Vec3 {
|
||||||
|
return Vec3{cV: t.cT.p}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Transform) PosX() float32 {
|
||||||
|
return float32(t.cT.p.x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Transform) PosY() float32 {
|
||||||
|
return float32(t.cT.p.y)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Transform) PosZ() float32 {
|
||||||
|
return float32(t.cT.p.z)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Transform) SetPos(v *Vec3) {
|
||||||
|
t.cT.p = v.cV
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Transform) Rot() Quat {
|
||||||
|
return Quat{cQ: t.cT.q}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Transform) RotX() float32 {
|
||||||
|
return float32(t.cT.q.x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Transform) RotY() float32 {
|
||||||
|
return float32(t.cT.q.y)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Transform) RotZ() float32 {
|
||||||
|
return float32(t.cT.q.z)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Transform) RotW() float32 {
|
||||||
|
return float32(t.cT.q.w)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *Transform) SetRot(r *Quat) {
|
||||||
|
t.cT.q = r.cQ
|
||||||
|
}
|
||||||
|
|
||||||
// struct CPxTransform NewCPxTransform(struct CPxVec3*, struct CPxQuat*);
|
// struct CPxTransform NewCPxTransform(struct CPxVec3*, struct CPxQuat*);
|
||||||
func NewTransform(v *Vec3, q *Quat) *Transform {
|
func NewTransform(v *Vec3, q *Quat) *Transform {
|
||||||
return &Transform{
|
return &Transform{
|
||||||
@ -661,14 +750,49 @@ type Actor struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type RigidActor struct {
|
type RigidActor struct {
|
||||||
cRa C.struct_CPxRigidActor
|
cRa C.struct_CPxRigidActor
|
||||||
|
pinner runtime.Pinner
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ra *RigidActor) SetSimFilterData(fd *FilterData) {
|
func (ra *RigidActor) SetSimFilterData(fd *FilterData) {
|
||||||
C.CPxRigidActor_setSimFilterData(ra.cRa, fd.cFilterData)
|
C.CPxRigidActor_setSimFilterData(ra.cRa, fd.cFilterData)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CPxAPI void CPxRigidActor_setSimFilterData(CSTRUCT CPxRigidActor* cra, CSTRUCT CPxFilterData* cfd);
|
// SetUserData sets the void* field on the rigid actor which can be used for any purpose.
|
||||||
|
// For example, it can be used to store an id or pointer that ties this rigid actor to some other object
|
||||||
|
//
|
||||||
|
// Note-1: The passed pointer will be stored in C and as such needs to be pinned, which this function will do.
|
||||||
|
// You can refer to this for notes on pinning and pointer rules: Refer to: https://pkg.go.dev/cmd/cgo#hdr-Passing_pointers
|
||||||
|
//
|
||||||
|
// Note-2: Since this RigidActor object is the one that pinned the user data, it MUST be kept alive at least until ClearUserData is used, at which point the data is unpinned and cleared.
|
||||||
|
// If this RigidActor object gets garabage collected before clear, the pinner will detect its getting collected with stuff still pinned (which is a leak) and will panic.
|
||||||
|
func (ra *RigidActor) SetUserData(userData unsafe.Pointer) {
|
||||||
|
|
||||||
|
// Note: Do NOT use interfaces here, as we need to ensure the original value
|
||||||
|
// pointed to is pinned, not the pointer to the interface (i.e. pinning the interface).
|
||||||
|
// Better avoid crazy to debug issues
|
||||||
|
|
||||||
|
// User data is a Go pointer stored in C/C++ code, and as such MUST be pinned
|
||||||
|
// before that is done, and must be unpinned when no longer stored in C/C++.
|
||||||
|
//
|
||||||
|
// Here we assume every write is of a different object, and so we always unpin before storing
|
||||||
|
// the new object.
|
||||||
|
//
|
||||||
|
// Refer to: https://pkg.go.dev/cmd/cgo#hdr-Passing_pointers
|
||||||
|
ra.pinner.Unpin()
|
||||||
|
ra.pinner.Pin(userData)
|
||||||
|
|
||||||
|
C.CPxRigidActor_set_userData(ra.cRa, userData)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ra *RigidActor) GetUserData() unsafe.Pointer {
|
||||||
|
return C.CPxRigidActor_get_userData(ra.cRa)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ra *RigidActor) ClearUserData() {
|
||||||
|
ra.pinner.Unpin()
|
||||||
|
C.CPxRigidActor_set_userData(ra.cRa, nil)
|
||||||
|
}
|
||||||
|
|
||||||
type RigidStatic struct {
|
type RigidStatic struct {
|
||||||
cRs C.struct_CPxRigidStatic
|
cRs C.struct_CPxRigidStatic
|
||||||
|
|||||||
@ -2,6 +2,7 @@
|
|||||||
#define CPxContactPairHeader_H
|
#define CPxContactPairHeader_H
|
||||||
|
|
||||||
#include "CPxShape.h"
|
#include "CPxShape.h"
|
||||||
|
#include "CPxPairFlag.h"
|
||||||
#include "CPxRigidActor.h"
|
#include "CPxRigidActor.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
@ -53,222 +54,6 @@ extern "C" {
|
|||||||
CPxContactPairFlag_eINTERNAL_CONTACTS_ARE_FLIPPED = (1 << 5)
|
CPxContactPairFlag_eINTERNAL_CONTACTS_ARE_FLIPPED = (1 << 5)
|
||||||
};
|
};
|
||||||
|
|
||||||
enum CPxPairFlags
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
\brief Process the contacts of this collision pair in the dynamics solver.
|
|
||||||
|
|
||||||
\note Only takes effect if the colliding actors are rigid bodies.
|
|
||||||
*/
|
|
||||||
CPxPairFlags_eSOLVE_CONTACT = (1 << 0),
|
|
||||||
|
|
||||||
/**
|
|
||||||
\brief Call contact modification callback for this collision pair
|
|
||||||
|
|
||||||
\note Only takes effect if the colliding actors are rigid bodies.
|
|
||||||
|
|
||||||
@see PxContactModifyCallback
|
|
||||||
*/
|
|
||||||
CPxPairFlags_eMODIFY_CONTACTS = (1 << 1),
|
|
||||||
|
|
||||||
/**
|
|
||||||
\brief Call contact report callback or trigger callback when this collision pair starts to be in contact.
|
|
||||||
|
|
||||||
If one of the two collision objects is a trigger shape (see #PxShapeFlag::eTRIGGER_SHAPE)
|
|
||||||
then the trigger callback will get called as soon as the other object enters the trigger volume.
|
|
||||||
If none of the two collision objects is a trigger shape then the contact report callback will get
|
|
||||||
called when the actors of this collision pair start to be in contact.
|
|
||||||
|
|
||||||
\note Only takes effect if the colliding actors are rigid bodies.
|
|
||||||
|
|
||||||
\note Only takes effect if eDETECT_DISCRETE_CONTACT or eDETECT_CCD_CONTACT is raised
|
|
||||||
|
|
||||||
@see PxSimulationEventCallback.onContact() PxSimulationEventCallback.onTrigger()
|
|
||||||
*/
|
|
||||||
CPxPairFlags_eNOTIFY_TOUCH_FOUND = (1 << 2),
|
|
||||||
|
|
||||||
/**
|
|
||||||
\brief Call contact report callback while this collision pair is in contact
|
|
||||||
|
|
||||||
If none of the two collision objects is a trigger shape then the contact report callback will get
|
|
||||||
called while the actors of this collision pair are in contact.
|
|
||||||
|
|
||||||
\note Triggers do not support this event. Persistent trigger contacts need to be tracked separately by observing eNOTIFY_TOUCH_FOUND/eNOTIFY_TOUCH_LOST events.
|
|
||||||
|
|
||||||
\note Only takes effect if the colliding actors are rigid bodies.
|
|
||||||
|
|
||||||
\note No report will get sent if the objects in contact are sleeping.
|
|
||||||
|
|
||||||
\note Only takes effect if eDETECT_DISCRETE_CONTACT or eDETECT_CCD_CONTACT is raised
|
|
||||||
|
|
||||||
\note If this flag gets enabled while a pair is in touch already, there will be no eNOTIFY_TOUCH_PERSISTS events until the pair loses and regains touch.
|
|
||||||
|
|
||||||
@see PxSimulationEventCallback.onContact() PxSimulationEventCallback.onTrigger()
|
|
||||||
*/
|
|
||||||
CPxPairFlags_eNOTIFY_TOUCH_PERSISTS = (1 << 3),
|
|
||||||
|
|
||||||
/**
|
|
||||||
\brief Call contact report callback or trigger callback when this collision pair stops to be in contact
|
|
||||||
|
|
||||||
If one of the two collision objects is a trigger shape (see #PxShapeFlag::eTRIGGER_SHAPE)
|
|
||||||
then the trigger callback will get called as soon as the other object leaves the trigger volume.
|
|
||||||
If none of the two collision objects is a trigger shape then the contact report callback will get
|
|
||||||
called when the actors of this collision pair stop to be in contact.
|
|
||||||
|
|
||||||
\note Only takes effect if the colliding actors are rigid bodies.
|
|
||||||
|
|
||||||
\note This event will also get triggered if one of the colliding objects gets deleted.
|
|
||||||
|
|
||||||
\note Only takes effect if eDETECT_DISCRETE_CONTACT or eDETECT_CCD_CONTACT is raised
|
|
||||||
|
|
||||||
@see PxSimulationEventCallback.onContact() PxSimulationEventCallback.onTrigger()
|
|
||||||
*/
|
|
||||||
CPxPairFlags_eNOTIFY_TOUCH_LOST = (1 << 4),
|
|
||||||
|
|
||||||
/**
|
|
||||||
\brief Call contact report callback when this collision pair is in contact during CCD passes.
|
|
||||||
|
|
||||||
If CCD with multiple passes is enabled, then a fast moving object might bounce on and off the same
|
|
||||||
object multiple times. Hence, the same pair might be in contact multiple times during a simulation step.
|
|
||||||
This flag will make sure that all the detected collision during CCD will get reported. For performance
|
|
||||||
reasons, the system can not always tell whether the contact pair lost touch in one of the previous CCD
|
|
||||||
passes and thus can also not always tell whether the contact is new or has persisted. eNOTIFY_TOUCH_CCD
|
|
||||||
just reports when the two collision objects were detected as being in contact during a CCD pass.
|
|
||||||
|
|
||||||
\note Only takes effect if the colliding actors are rigid bodies.
|
|
||||||
|
|
||||||
\note Trigger shapes are not supported.
|
|
||||||
|
|
||||||
\note Only takes effect if eDETECT_CCD_CONTACT is raised
|
|
||||||
|
|
||||||
@see PxSimulationEventCallback.onContact() PxSimulationEventCallback.onTrigger()
|
|
||||||
*/
|
|
||||||
CPxPairFlags_eNOTIFY_TOUCH_CCD = (1 << 5),
|
|
||||||
|
|
||||||
/**
|
|
||||||
\brief Call contact report callback when the contact force between the actors of this collision pair exceeds one of the actor-defined force thresholds.
|
|
||||||
|
|
||||||
\note Only takes effect if the colliding actors are rigid bodies.
|
|
||||||
|
|
||||||
\note Only takes effect if eDETECT_DISCRETE_CONTACT or eDETECT_CCD_CONTACT is raised
|
|
||||||
|
|
||||||
@see PxSimulationEventCallback.onContact()
|
|
||||||
*/
|
|
||||||
CPxPairFlags_eNOTIFY_THRESHOLD_FORCE_FOUND = (1 << 6),
|
|
||||||
|
|
||||||
/**
|
|
||||||
\brief Call contact report callback when the contact force between the actors of this collision pair continues to exceed one of the actor-defined force thresholds.
|
|
||||||
|
|
||||||
\note Only takes effect if the colliding actors are rigid bodies.
|
|
||||||
|
|
||||||
\note If a pair gets re-filtered and this flag has previously been disabled, then the report will not get fired in the same frame even if the force threshold has been reached in the
|
|
||||||
previous one (unless #eNOTIFY_THRESHOLD_FORCE_FOUND has been set in the previous frame).
|
|
||||||
|
|
||||||
\note Only takes effect if eDETECT_DISCRETE_CONTACT or eDETECT_CCD_CONTACT is raised
|
|
||||||
|
|
||||||
@see PxSimulationEventCallback.onContact()
|
|
||||||
*/
|
|
||||||
CPxPairFlags_eNOTIFY_THRESHOLD_FORCE_PERSISTS = (1 << 7),
|
|
||||||
|
|
||||||
/**
|
|
||||||
\brief Call contact report callback when the contact force between the actors of this collision pair falls below one of the actor-defined force thresholds (includes the case where this collision pair stops being in contact).
|
|
||||||
|
|
||||||
\note Only takes effect if the colliding actors are rigid bodies.
|
|
||||||
|
|
||||||
\note If a pair gets re-filtered and this flag has previously been disabled, then the report will not get fired in the same frame even if the force threshold has been reached in the
|
|
||||||
previous one (unless #eNOTIFY_THRESHOLD_FORCE_FOUND or #eNOTIFY_THRESHOLD_FORCE_PERSISTS has been set in the previous frame).
|
|
||||||
|
|
||||||
\note Only takes effect if eDETECT_DISCRETE_CONTACT or eDETECT_CCD_CONTACT is raised
|
|
||||||
|
|
||||||
@see PxSimulationEventCallback.onContact()
|
|
||||||
*/
|
|
||||||
CPxPairFlags_eNOTIFY_THRESHOLD_FORCE_LOST = (1 << 8),
|
|
||||||
|
|
||||||
/**
|
|
||||||
\brief Provide contact points in contact reports for this collision pair.
|
|
||||||
|
|
||||||
\note Only takes effect if the colliding actors are rigid bodies and if used in combination with the flags eNOTIFY_TOUCH_... or eNOTIFY_THRESHOLD_FORCE_...
|
|
||||||
|
|
||||||
\note Only takes effect if eDETECT_DISCRETE_CONTACT or eDETECT_CCD_CONTACT is raised
|
|
||||||
|
|
||||||
@see PxSimulationEventCallback.onContact() PxContactPair PxContactPair.extractContacts()
|
|
||||||
*/
|
|
||||||
CPxPairFlags_eNOTIFY_CONTACT_POINTS = (1 << 9),
|
|
||||||
|
|
||||||
/**
|
|
||||||
\brief This flag is used to indicate whether this pair generates discrete collision detection contacts.
|
|
||||||
|
|
||||||
\note Contacts are only responded to if eSOLVE_CONTACT is enabled.
|
|
||||||
*/
|
|
||||||
CPxPairFlags_eDETECT_DISCRETE_CONTACT = (1 << 10),
|
|
||||||
|
|
||||||
/**
|
|
||||||
\brief This flag is used to indicate whether this pair generates CCD contacts.
|
|
||||||
|
|
||||||
\note The contacts will only be responded to if eSOLVE_CONTACT is enabled on this pair.
|
|
||||||
\note The scene must have PxSceneFlag::eENABLE_CCD enabled to use this feature.
|
|
||||||
\note Non-static bodies of the pair should have PxRigidBodyFlag::eENABLE_CCD specified for this feature to work correctly.
|
|
||||||
\note This flag is not supported with trigger shapes. However, CCD trigger events can be emulated using non-trigger shapes
|
|
||||||
and requesting eNOTIFY_TOUCH_FOUND and eNOTIFY_TOUCH_LOST and not raising eSOLVE_CONTACT on the pair.
|
|
||||||
|
|
||||||
@see PxRigidBodyFlag::eENABLE_CCD
|
|
||||||
@see PxSceneFlag::eENABLE_CCD
|
|
||||||
*/
|
|
||||||
CPxPairFlags_eDETECT_CCD_CONTACT = (1 << 11),
|
|
||||||
|
|
||||||
/**
|
|
||||||
\brief Provide pre solver velocities in contact reports for this collision pair.
|
|
||||||
|
|
||||||
If the collision pair has contact reports enabled, the velocities of the rigid bodies before contacts have been solved
|
|
||||||
will be provided in the contact report callback unless the pair lost touch in which case no data will be provided.
|
|
||||||
|
|
||||||
\note Usually it is not necessary to request these velocities as they will be available by querying the velocity from the provided
|
|
||||||
PxRigidActor object directly. However, it might be the case that the velocity of a rigid body gets set while the simulation is running
|
|
||||||
in which case the PxRigidActor would return this new velocity in the contact report callback and not the velocity the simulation used.
|
|
||||||
|
|
||||||
@see PxSimulationEventCallback.onContact(), PxContactPairVelocity, PxContactPairHeader.extraDataStream
|
|
||||||
*/
|
|
||||||
CPxPairFlags_ePRE_SOLVER_VELOCITY = (1 << 12),
|
|
||||||
|
|
||||||
/**
|
|
||||||
\brief Provide post solver velocities in contact reports for this collision pair.
|
|
||||||
|
|
||||||
If the collision pair has contact reports enabled, the velocities of the rigid bodies after contacts have been solved
|
|
||||||
will be provided in the contact report callback unless the pair lost touch in which case no data will be provided.
|
|
||||||
|
|
||||||
@see PxSimulationEventCallback.onContact(), PxContactPairVelocity, PxContactPairHeader.extraDataStream
|
|
||||||
*/
|
|
||||||
CPxPairFlags_ePOST_SOLVER_VELOCITY = (1 << 13),
|
|
||||||
|
|
||||||
/**
|
|
||||||
\brief Provide rigid body poses in contact reports for this collision pair.
|
|
||||||
|
|
||||||
If the collision pair has contact reports enabled, the rigid body poses at the contact event will be provided
|
|
||||||
in the contact report callback unless the pair lost touch in which case no data will be provided.
|
|
||||||
|
|
||||||
\note Usually it is not necessary to request these poses as they will be available by querying the pose from the provided
|
|
||||||
PxRigidActor object directly. However, it might be the case that the pose of a rigid body gets set while the simulation is running
|
|
||||||
in which case the PxRigidActor would return this new pose in the contact report callback and not the pose the simulation used.
|
|
||||||
Another use case is related to CCD with multiple passes enabled, A fast moving object might bounce on and off the same
|
|
||||||
object multiple times. This flag can be used to request the rigid body poses at the time of impact for each such collision event.
|
|
||||||
|
|
||||||
@see PxSimulationEventCallback.onContact(), PxContactPairPose, PxContactPairHeader.extraDataStream
|
|
||||||
*/
|
|
||||||
CPxPairFlags_eCONTACT_EVENT_POSE = (1 << 14),
|
|
||||||
|
|
||||||
CPxPairFlags_eNEXT_FREE = (1 << 15), //!< For internal use only.
|
|
||||||
|
|
||||||
/**
|
|
||||||
\brief Provided default flag to do simple contact processing for this collision pair.
|
|
||||||
*/
|
|
||||||
CPxPairFlags_eCONTACT_DEFAULT = CPxPairFlags_eSOLVE_CONTACT | CPxPairFlags_eDETECT_DISCRETE_CONTACT,
|
|
||||||
|
|
||||||
/**
|
|
||||||
\brief Provided default flag to get commonly used trigger behavior for this collision pair.
|
|
||||||
*/
|
|
||||||
CPxPairFlags_eTRIGGER_DEFAULT = CPxPairFlags_eNOTIFY_TOUCH_FOUND | CPxPairFlags_eNOTIFY_TOUCH_LOST | CPxPairFlags_eDETECT_DISCRETE_CONTACT
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CPxContactPairPoint
|
struct CPxContactPairPoint
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
@ -314,7 +99,7 @@ extern "C" {
|
|||||||
CPxU8 patchCount;
|
CPxU8 patchCount;
|
||||||
CPxU16 contactStreamSize;
|
CPxU16 contactStreamSize;
|
||||||
|
|
||||||
CENUM CPxPairFlags events;
|
CENUM CPxPairFlag events;
|
||||||
CENUM CPxContactPairFlag flags;
|
CENUM CPxContactPairFlag flags;
|
||||||
|
|
||||||
CSTRUCT CPxContactPairPoint* extractedContactPoints;
|
CSTRUCT CPxContactPairPoint* extractedContactPoints;
|
||||||
@ -343,4 +128,4 @@ extern "C" {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // !1
|
#endif
|
||||||
228
pgo/physx-c/CPxPairFlag.h
Executable file
228
pgo/physx-c/CPxPairFlag.h
Executable file
@ -0,0 +1,228 @@
|
|||||||
|
#ifndef CPxPairFlag_H
|
||||||
|
#define CPxPairFlag_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
enum CPxPairFlag
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
\brief Process the contacts of this collision pair in the dynamics solver.
|
||||||
|
|
||||||
|
\note Only takes effect if the colliding actors are rigid bodies.
|
||||||
|
*/
|
||||||
|
CPxPairFlags_eSOLVE_CONTACT = (1 << 0),
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Call contact modification callback for this collision pair
|
||||||
|
|
||||||
|
\note Only takes effect if the colliding actors are rigid bodies.
|
||||||
|
|
||||||
|
@see PxContactModifyCallback
|
||||||
|
*/
|
||||||
|
CPxPairFlags_eMODIFY_CONTACTS = (1 << 1),
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Call contact report callback or trigger callback when this collision pair starts to be in contact.
|
||||||
|
|
||||||
|
If one of the two collision objects is a trigger shape (see #PxShapeFlag::eTRIGGER_SHAPE)
|
||||||
|
then the trigger callback will get called as soon as the other object enters the trigger volume.
|
||||||
|
If none of the two collision objects is a trigger shape then the contact report callback will get
|
||||||
|
called when the actors of this collision pair start to be in contact.
|
||||||
|
|
||||||
|
\note Only takes effect if the colliding actors are rigid bodies.
|
||||||
|
|
||||||
|
\note Only takes effect if eDETECT_DISCRETE_CONTACT or eDETECT_CCD_CONTACT is raised
|
||||||
|
|
||||||
|
@see PxSimulationEventCallback.onContact() PxSimulationEventCallback.onTrigger()
|
||||||
|
*/
|
||||||
|
CPxPairFlags_eNOTIFY_TOUCH_FOUND = (1 << 2),
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Call contact report callback while this collision pair is in contact
|
||||||
|
|
||||||
|
If none of the two collision objects is a trigger shape then the contact report callback will get
|
||||||
|
called while the actors of this collision pair are in contact.
|
||||||
|
|
||||||
|
\note Triggers do not support this event. Persistent trigger contacts need to be tracked separately by observing eNOTIFY_TOUCH_FOUND/eNOTIFY_TOUCH_LOST events.
|
||||||
|
|
||||||
|
\note Only takes effect if the colliding actors are rigid bodies.
|
||||||
|
|
||||||
|
\note No report will get sent if the objects in contact are sleeping.
|
||||||
|
|
||||||
|
\note Only takes effect if eDETECT_DISCRETE_CONTACT or eDETECT_CCD_CONTACT is raised
|
||||||
|
|
||||||
|
\note If this flag gets enabled while a pair is in touch already, there will be no eNOTIFY_TOUCH_PERSISTS events until the pair loses and regains touch.
|
||||||
|
|
||||||
|
@see PxSimulationEventCallback.onContact() PxSimulationEventCallback.onTrigger()
|
||||||
|
*/
|
||||||
|
CPxPairFlags_eNOTIFY_TOUCH_PERSISTS = (1 << 3),
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Call contact report callback or trigger callback when this collision pair stops to be in contact
|
||||||
|
|
||||||
|
If one of the two collision objects is a trigger shape (see #PxShapeFlag::eTRIGGER_SHAPE)
|
||||||
|
then the trigger callback will get called as soon as the other object leaves the trigger volume.
|
||||||
|
If none of the two collision objects is a trigger shape then the contact report callback will get
|
||||||
|
called when the actors of this collision pair stop to be in contact.
|
||||||
|
|
||||||
|
\note Only takes effect if the colliding actors are rigid bodies.
|
||||||
|
|
||||||
|
\note This event will also get triggered if one of the colliding objects gets deleted.
|
||||||
|
|
||||||
|
\note Only takes effect if eDETECT_DISCRETE_CONTACT or eDETECT_CCD_CONTACT is raised
|
||||||
|
|
||||||
|
@see PxSimulationEventCallback.onContact() PxSimulationEventCallback.onTrigger()
|
||||||
|
*/
|
||||||
|
CPxPairFlags_eNOTIFY_TOUCH_LOST = (1 << 4),
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Call contact report callback when this collision pair is in contact during CCD passes.
|
||||||
|
|
||||||
|
If CCD with multiple passes is enabled, then a fast moving object might bounce on and off the same
|
||||||
|
object multiple times. Hence, the same pair might be in contact multiple times during a simulation step.
|
||||||
|
This flag will make sure that all the detected collision during CCD will get reported. For performance
|
||||||
|
reasons, the system can not always tell whether the contact pair lost touch in one of the previous CCD
|
||||||
|
passes and thus can also not always tell whether the contact is new or has persisted. eNOTIFY_TOUCH_CCD
|
||||||
|
just reports when the two collision objects were detected as being in contact during a CCD pass.
|
||||||
|
|
||||||
|
\note Only takes effect if the colliding actors are rigid bodies.
|
||||||
|
|
||||||
|
\note Trigger shapes are not supported.
|
||||||
|
|
||||||
|
\note Only takes effect if eDETECT_CCD_CONTACT is raised
|
||||||
|
|
||||||
|
@see PxSimulationEventCallback.onContact() PxSimulationEventCallback.onTrigger()
|
||||||
|
*/
|
||||||
|
CPxPairFlags_eNOTIFY_TOUCH_CCD = (1 << 5),
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Call contact report callback when the contact force between the actors of this collision pair exceeds one of the actor-defined force thresholds.
|
||||||
|
|
||||||
|
\note Only takes effect if the colliding actors are rigid bodies.
|
||||||
|
|
||||||
|
\note Only takes effect if eDETECT_DISCRETE_CONTACT or eDETECT_CCD_CONTACT is raised
|
||||||
|
|
||||||
|
@see PxSimulationEventCallback.onContact()
|
||||||
|
*/
|
||||||
|
CPxPairFlags_eNOTIFY_THRESHOLD_FORCE_FOUND = (1 << 6),
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Call contact report callback when the contact force between the actors of this collision pair continues to exceed one of the actor-defined force thresholds.
|
||||||
|
|
||||||
|
\note Only takes effect if the colliding actors are rigid bodies.
|
||||||
|
|
||||||
|
\note If a pair gets re-filtered and this flag has previously been disabled, then the report will not get fired in the same frame even if the force threshold has been reached in the
|
||||||
|
previous one (unless #eNOTIFY_THRESHOLD_FORCE_FOUND has been set in the previous frame).
|
||||||
|
|
||||||
|
\note Only takes effect if eDETECT_DISCRETE_CONTACT or eDETECT_CCD_CONTACT is raised
|
||||||
|
|
||||||
|
@see PxSimulationEventCallback.onContact()
|
||||||
|
*/
|
||||||
|
CPxPairFlags_eNOTIFY_THRESHOLD_FORCE_PERSISTS = (1 << 7),
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Call contact report callback when the contact force between the actors of this collision pair falls below one of the actor-defined force thresholds (includes the case where this collision pair stops being in contact).
|
||||||
|
|
||||||
|
\note Only takes effect if the colliding actors are rigid bodies.
|
||||||
|
|
||||||
|
\note If a pair gets re-filtered and this flag has previously been disabled, then the report will not get fired in the same frame even if the force threshold has been reached in the
|
||||||
|
previous one (unless #eNOTIFY_THRESHOLD_FORCE_FOUND or #eNOTIFY_THRESHOLD_FORCE_PERSISTS has been set in the previous frame).
|
||||||
|
|
||||||
|
\note Only takes effect if eDETECT_DISCRETE_CONTACT or eDETECT_CCD_CONTACT is raised
|
||||||
|
|
||||||
|
@see PxSimulationEventCallback.onContact()
|
||||||
|
*/
|
||||||
|
CPxPairFlags_eNOTIFY_THRESHOLD_FORCE_LOST = (1 << 8),
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Provide contact points in contact reports for this collision pair.
|
||||||
|
|
||||||
|
\note Only takes effect if the colliding actors are rigid bodies and if used in combination with the flags eNOTIFY_TOUCH_... or eNOTIFY_THRESHOLD_FORCE_...
|
||||||
|
|
||||||
|
\note Only takes effect if eDETECT_DISCRETE_CONTACT or eDETECT_CCD_CONTACT is raised
|
||||||
|
|
||||||
|
@see PxSimulationEventCallback.onContact() PxContactPair PxContactPair.extractContacts()
|
||||||
|
*/
|
||||||
|
CPxPairFlags_eNOTIFY_CONTACT_POINTS = (1 << 9),
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief This flag is used to indicate whether this pair generates discrete collision detection contacts.
|
||||||
|
|
||||||
|
\note Contacts are only responded to if eSOLVE_CONTACT is enabled.
|
||||||
|
*/
|
||||||
|
CPxPairFlags_eDETECT_DISCRETE_CONTACT = (1 << 10),
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief This flag is used to indicate whether this pair generates CCD contacts.
|
||||||
|
|
||||||
|
\note The contacts will only be responded to if eSOLVE_CONTACT is enabled on this pair.
|
||||||
|
\note The scene must have PxSceneFlag::eENABLE_CCD enabled to use this feature.
|
||||||
|
\note Non-static bodies of the pair should have PxRigidBodyFlag::eENABLE_CCD specified for this feature to work correctly.
|
||||||
|
\note This flag is not supported with trigger shapes. However, CCD trigger events can be emulated using non-trigger shapes
|
||||||
|
and requesting eNOTIFY_TOUCH_FOUND and eNOTIFY_TOUCH_LOST and not raising eSOLVE_CONTACT on the pair.
|
||||||
|
|
||||||
|
@see PxRigidBodyFlag::eENABLE_CCD
|
||||||
|
@see PxSceneFlag::eENABLE_CCD
|
||||||
|
*/
|
||||||
|
CPxPairFlags_eDETECT_CCD_CONTACT = (1 << 11),
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Provide pre solver velocities in contact reports for this collision pair.
|
||||||
|
|
||||||
|
If the collision pair has contact reports enabled, the velocities of the rigid bodies before contacts have been solved
|
||||||
|
will be provided in the contact report callback unless the pair lost touch in which case no data will be provided.
|
||||||
|
|
||||||
|
\note Usually it is not necessary to request these velocities as they will be available by querying the velocity from the provided
|
||||||
|
PxRigidActor object directly. However, it might be the case that the velocity of a rigid body gets set while the simulation is running
|
||||||
|
in which case the PxRigidActor would return this new velocity in the contact report callback and not the velocity the simulation used.
|
||||||
|
|
||||||
|
@see PxSimulationEventCallback.onContact(), PxContactPairVelocity, PxContactPairHeader.extraDataStream
|
||||||
|
*/
|
||||||
|
CPxPairFlags_ePRE_SOLVER_VELOCITY = (1 << 12),
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Provide post solver velocities in contact reports for this collision pair.
|
||||||
|
|
||||||
|
If the collision pair has contact reports enabled, the velocities of the rigid bodies after contacts have been solved
|
||||||
|
will be provided in the contact report callback unless the pair lost touch in which case no data will be provided.
|
||||||
|
|
||||||
|
@see PxSimulationEventCallback.onContact(), PxContactPairVelocity, PxContactPairHeader.extraDataStream
|
||||||
|
*/
|
||||||
|
CPxPairFlags_ePOST_SOLVER_VELOCITY = (1 << 13),
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Provide rigid body poses in contact reports for this collision pair.
|
||||||
|
|
||||||
|
If the collision pair has contact reports enabled, the rigid body poses at the contact event will be provided
|
||||||
|
in the contact report callback unless the pair lost touch in which case no data will be provided.
|
||||||
|
|
||||||
|
\note Usually it is not necessary to request these poses as they will be available by querying the pose from the provided
|
||||||
|
PxRigidActor object directly. However, it might be the case that the pose of a rigid body gets set while the simulation is running
|
||||||
|
in which case the PxRigidActor would return this new pose in the contact report callback and not the pose the simulation used.
|
||||||
|
Another use case is related to CCD with multiple passes enabled, A fast moving object might bounce on and off the same
|
||||||
|
object multiple times. This flag can be used to request the rigid body poses at the time of impact for each such collision event.
|
||||||
|
|
||||||
|
@see PxSimulationEventCallback.onContact(), PxContactPairPose, PxContactPairHeader.extraDataStream
|
||||||
|
*/
|
||||||
|
CPxPairFlags_eCONTACT_EVENT_POSE = (1 << 14),
|
||||||
|
|
||||||
|
CPxPairFlags_eNEXT_FREE = (1 << 15), //!< For internal use only.
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Provided default flag to do simple contact processing for this collision pair.
|
||||||
|
*/
|
||||||
|
CPxPairFlags_eCONTACT_DEFAULT = CPxPairFlags_eSOLVE_CONTACT | CPxPairFlags_eDETECT_DISCRETE_CONTACT,
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Provided default flag to get commonly used trigger behavior for this collision pair.
|
||||||
|
*/
|
||||||
|
CPxPairFlags_eTRIGGER_DEFAULT = CPxPairFlags_eNOTIFY_TOUCH_FOUND | CPxPairFlags_eNOTIFY_TOUCH_LOST | CPxPairFlags_eDETECT_DISCRETE_CONTACT
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
@ -14,6 +14,8 @@ extern "C" {
|
|||||||
|
|
||||||
//Sets the CPxFilterData on all the shapes of the actor.
|
//Sets the CPxFilterData on all the shapes of the actor.
|
||||||
CPxAPI void CPxRigidActor_setSimFilterData(CSTRUCT CPxRigidActor cra, CSTRUCT CPxFilterData cfd);
|
CPxAPI void CPxRigidActor_setSimFilterData(CSTRUCT CPxRigidActor cra, CSTRUCT CPxFilterData cfd);
|
||||||
|
CPxAPI void CPxRigidActor_set_userData(CSTRUCT CPxRigidActor cra, void* userData);
|
||||||
|
CPxAPI void* CPxRigidActor_get_userData(CSTRUCT CPxRigidActor cra);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,7 +30,17 @@ extern "C" {
|
|||||||
CPxAPI CPxReal CPxRigidDynamic_getAngularDamping(CSTRUCT CPxRigidDynamic crd);
|
CPxAPI CPxReal CPxRigidDynamic_getAngularDamping(CSTRUCT CPxRigidDynamic crd);
|
||||||
|
|
||||||
CPxAPI CSTRUCT CPxVec3 CPxRigidDynamic_getLinearVelocity(CSTRUCT CPxRigidDynamic crd);
|
CPxAPI CSTRUCT CPxVec3 CPxRigidDynamic_getLinearVelocity(CSTRUCT CPxRigidDynamic crd);
|
||||||
|
CPxAPI void CPxRigidDynamic_setLinearVelocity(CSTRUCT CPxRigidDynamic crd, CSTRUCT CPxVec3* velocity, bool autoAwake);
|
||||||
|
|
||||||
|
CPxAPI CPxReal CPxRigidDynamic_getMaxLinearVelocity(CSTRUCT CPxRigidDynamic crd);
|
||||||
|
CPxAPI void CPxRigidDynamic_setMaxLinearVelocity(CSTRUCT CPxRigidDynamic crd, CPxReal maxLinearVelocity);
|
||||||
|
|
||||||
|
|
||||||
CPxAPI CSTRUCT CPxVec3 CPxRigidDynamic_getAngularVelocity(CSTRUCT CPxRigidDynamic crd);
|
CPxAPI CSTRUCT CPxVec3 CPxRigidDynamic_getAngularVelocity(CSTRUCT CPxRigidDynamic crd);
|
||||||
|
CPxAPI void CPxRigidDynamic_setAngularVelocity(CSTRUCT CPxRigidDynamic crd, CSTRUCT CPxVec3* velocity, bool autoAwake);
|
||||||
|
|
||||||
|
CPxAPI CPxReal CPxRigidDynamic_getMaxAngularVelocity(CSTRUCT CPxRigidDynamic crd);
|
||||||
|
CPxAPI void CPxRigidDynamic_setMaxAngularVelocity(CSTRUCT CPxRigidDynamic crd, CPxReal maxAngularVelocity);
|
||||||
|
|
||||||
CPxAPI void CPxRigidDynamic_setMass(CSTRUCT CPxRigidDynamic crd, CPxReal mass);
|
CPxAPI void CPxRigidDynamic_setMass(CSTRUCT CPxRigidDynamic crd, CPxReal mass);
|
||||||
CPxAPI CPxReal CPxRigidDynamic_getMass(CSTRUCT CPxRigidDynamic crd);
|
CPxAPI CPxReal CPxRigidDynamic_getMass(CSTRUCT CPxRigidDynamic crd);
|
||||||
|
|||||||
@ -13,7 +13,8 @@ extern "C" {
|
|||||||
void* obj;
|
void* obj;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef void (*CPxonContactCallback)(void* pairHeader);
|
typedef void (*CPxOnContactCallback)(void* pairHeader);
|
||||||
|
typedef void (*CPxOnTriggerCallback)(void* triggerPairs, CPxU32 count);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a SceneDesc with a custom filterShader that uses word0/word1 as groups shapes can belong to, word2 as a mask on word0, and word3 as a mask on word1.
|
/// Creates a SceneDesc with a custom filterShader that uses word0/word1 as groups shapes can belong to, word2 as a mask on word0, and word3 as a mask on word1.
|
||||||
@ -25,12 +26,20 @@ extern "C" {
|
|||||||
CPxAPI void CPxSceneDesc_set_cpuDispatcher(CSTRUCT CPxSceneDesc, CSTRUCT CPxCpuDispatcher);
|
CPxAPI void CPxSceneDesc_set_cpuDispatcher(CSTRUCT CPxSceneDesc, CSTRUCT CPxCpuDispatcher);
|
||||||
|
|
||||||
|
|
||||||
//CPxSceneDesc_set_onContactCallback sets the contact callback handler of the given scene descriptor.
|
// CPxSceneDesc_set_onContactCallback sets the on-contact callback handler of the given scene descriptor.
|
||||||
//The callback is sent an object of type 'CPxContactPairHeader*'. This object is only valid for the duration of the callback handler.
|
// The callback is sent an object of type 'CPxContactPairHeader*'. This object is only valid for the duration of the callback handler.
|
||||||
//Therefore, the callback handler MUST copy data it wishes to keep for longer than the lifetime of the callback handler, as the memory it was handed might be reused/freed.
|
// Therefore, the callback handler MUST copy data it wishes to keep for longer than the lifetime of the callback handler, as the memory it was handed might be reused/freed.
|
||||||
//
|
//
|
||||||
//NOTE: This function assumes you are using the default physx-c callback handler. Do NOT use this function if you set 'sceneDesc->simulationEventCallback' with your own custom implementation.
|
// NOTE: This function assumes you are using the default physx-c callback handler. Do NOT use this function if you set 'sceneDesc->simulationEventCallback' with your own custom implementation.
|
||||||
CPxAPI void CPxSceneDesc_set_onContactCallback(CSTRUCT CPxSceneDesc, CPxonContactCallback cb);
|
CPxAPI void CPxSceneDesc_set_onContactCallback(CSTRUCT CPxSceneDesc, CPxOnContactCallback cb);
|
||||||
|
|
||||||
|
// CPxSceneDesc_set_onTriggerCallback sets the on-trigger callback handler of the given scene descriptor.
|
||||||
|
// The callback is sent an object of type 'CPxTriggerPairHeader*'. This object is only valid for the duration of the callback handler.
|
||||||
|
// Therefore, the callback handler MUST copy data it wishes to keep for longer than the lifetime of the callback handler, as the memory it was handed might be reused/freed.
|
||||||
|
//
|
||||||
|
// NOTE: This function assumes you are using the default physx-c callback handler. Do NOT use this function if you set 'sceneDesc->simulationEventCallback' with your own custom implementation.
|
||||||
|
CPxAPI void CPxSceneDesc_set_onTriggerCallback(CSTRUCT CPxSceneDesc csd, CPxOnTriggerCallback cb);
|
||||||
|
|
||||||
CPxAPI void FreeCPxSceneDesc(CSTRUCT CPxSceneDesc);
|
CPxAPI void FreeCPxSceneDesc(CSTRUCT CPxSceneDesc);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
27
pgo/physx-c/CPxTriggerPair.h
Executable file
27
pgo/physx-c/CPxTriggerPair.h
Executable file
@ -0,0 +1,27 @@
|
|||||||
|
#ifndef CPxTriggerPair_H
|
||||||
|
#define CPxTriggerPair_H
|
||||||
|
|
||||||
|
#include "CPxShape.h"
|
||||||
|
#include "CPxPairFlag.h"
|
||||||
|
#include "CPxRigidActor.h"
|
||||||
|
#include "CPxTriggerPairFlag.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct CPxTriggerPair
|
||||||
|
{
|
||||||
|
CSTRUCT CPxShape triggerShape; //!< The shape that has been marked as a trigger.
|
||||||
|
CSTRUCT CPxRigidActor triggerActor; //!< The actor to which triggerShape is attached
|
||||||
|
CSTRUCT CPxShape otherShape; //!< The shape causing the trigger event. \deprecated (see #PxSimulationEventCallback::onTrigger()) If collision between trigger shapes is enabled, then this member might point to a trigger shape as well.
|
||||||
|
CSTRUCT CPxRigidActor otherActor; //!< The actor to which otherShape is attached
|
||||||
|
CENUM CPxPairFlag status; //!< Type of trigger event (eNOTIFY_TOUCH_FOUND or eNOTIFY_TOUCH_LOST). eNOTIFY_TOUCH_PERSISTS events are not supported.
|
||||||
|
CENUM CPxTriggerPairFlag flags; //!< Additional information on the pair (see #PxTriggerPairFlag)
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
20
pgo/physx-c/CPxTriggerPairFlag.h
Executable file
20
pgo/physx-c/CPxTriggerPairFlag.h
Executable file
@ -0,0 +1,20 @@
|
|||||||
|
#ifndef CPxTriggerPairFlag_H
|
||||||
|
#define CPxTriggerPairFlag_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
enum CPxTriggerPairFlag
|
||||||
|
{
|
||||||
|
eREMOVED_SHAPE_TRIGGER = (1 << 0), //!< The trigger shape has been removed from the actor/scene.
|
||||||
|
eREMOVED_SHAPE_OTHER = (1 << 1), //!< The shape causing the trigger event has been removed from the actor/scene.
|
||||||
|
eNEXT_FREE = (1 << 2) //!< For internal use only.
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
@ -29,14 +29,14 @@ func (rd *RigidDynamic) SetLinearDamping(damping float32) {
|
|||||||
C.CPxRigidDynamic_setLinearDamping(rd.cRd, C.float(damping))
|
C.CPxRigidDynamic_setLinearDamping(rd.cRd, C.float(damping))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rd *RigidDynamic) SetAngularDamping(damping float32) {
|
|
||||||
C.CPxRigidDynamic_setAngularDamping(rd.cRd, C.float(damping))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (rd *RigidDynamic) GetLinearDamping() float32 {
|
func (rd *RigidDynamic) GetLinearDamping() float32 {
|
||||||
return float32(C.CPxRigidDynamic_getLinearDamping(rd.cRd))
|
return float32(C.CPxRigidDynamic_getLinearDamping(rd.cRd))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (rd *RigidDynamic) SetAngularDamping(damping float32) {
|
||||||
|
C.CPxRigidDynamic_setAngularDamping(rd.cRd, C.float(damping))
|
||||||
|
}
|
||||||
|
|
||||||
func (rd *RigidDynamic) GetAngularDamping() float32 {
|
func (rd *RigidDynamic) GetAngularDamping() float32 {
|
||||||
return float32(C.CPxRigidDynamic_getAngularDamping(rd.cRd))
|
return float32(C.CPxRigidDynamic_getAngularDamping(rd.cRd))
|
||||||
}
|
}
|
||||||
@ -47,12 +47,36 @@ func (rd *RigidDynamic) GetLinearVelocity() Vec3 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (rd *RigidDynamic) SetLinearVelocity(vel *Vec3, autoWake bool) {
|
||||||
|
C.CPxRigidDynamic_setLinearVelocity(rd.cRd, &vel.cV, C._Bool(autoWake))
|
||||||
|
}
|
||||||
|
|
||||||
func (rd *RigidDynamic) GetAngularVelocity() Vec3 {
|
func (rd *RigidDynamic) GetAngularVelocity() Vec3 {
|
||||||
return Vec3{
|
return Vec3{
|
||||||
cV: C.CPxRigidDynamic_getAngularVelocity(rd.cRd),
|
cV: C.CPxRigidDynamic_getAngularVelocity(rd.cRd),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (rd *RigidDynamic) SetAngularVelocity(vel *Vec3, autoWake bool) {
|
||||||
|
C.CPxRigidDynamic_setAngularVelocity(rd.cRd, &vel.cV, C._Bool(autoWake))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rd *RigidDynamic) GetMaxLinearVelocity() float32 {
|
||||||
|
return float32(C.CPxRigidDynamic_getMaxLinearVelocity(rd.cRd))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rd *RigidDynamic) SetMaxLinearVelocity(vel float32) {
|
||||||
|
C.CPxRigidDynamic_setMaxLinearVelocity(rd.cRd, C.float(vel))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rd *RigidDynamic) GetMaxAngularVelocity() float32 {
|
||||||
|
return float32(C.CPxRigidDynamic_getMaxAngularVelocity(rd.cRd))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rd *RigidDynamic) SetMaxAngularVelocity(vel float32) {
|
||||||
|
C.CPxRigidDynamic_setMaxAngularVelocity(rd.cRd, C.float(vel))
|
||||||
|
}
|
||||||
|
|
||||||
func (rd *RigidDynamic) SetMass(mass float32) {
|
func (rd *RigidDynamic) SetMass(mass float32) {
|
||||||
C.CPxRigidDynamic_setMass(rd.cRd, C.float(mass))
|
C.CPxRigidDynamic_setMass(rd.cRd, C.float(mass))
|
||||||
}
|
}
|
||||||
@ -122,6 +146,13 @@ func (rd *RigidDynamic) ToRigidActor() RigidActor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func CreateDynamic(p Physics, t *Transform, g Geometry, m Material, density float32, shapeOffset *Transform) RigidDynamic {
|
func CreateDynamic(p Physics, t *Transform, g Geometry, m Material, density float32, shapeOffset *Transform) RigidDynamic {
|
||||||
|
|
||||||
|
if shapeOffset == nil {
|
||||||
|
return RigidDynamic{
|
||||||
|
cRd: C.CPxCreateDynamic(p.cPhysics, &t.cT, g.cG, m.cM, C.float(density), nil),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return RigidDynamic{
|
return RigidDynamic{
|
||||||
cRd: C.CPxCreateDynamic(p.cPhysics, &t.cT, g.cG, m.cM, C.float(density), &shapeOffset.cT),
|
cRd: C.CPxCreateDynamic(p.cPhysics, &t.cT, g.cG, m.cM, C.float(density), &shapeOffset.cT),
|
||||||
}
|
}
|
||||||
|
|||||||
9
pgo/triggerPairFlag.go
Executable file
9
pgo/triggerPairFlag.go
Executable file
@ -0,0 +1,9 @@
|
|||||||
|
package pgo
|
||||||
|
|
||||||
|
type TriggerPairFlag uint32
|
||||||
|
|
||||||
|
const (
|
||||||
|
TriggerPairFlag_eREMOVED_SHAPE_TRIGGER TriggerPairFlag = (1 << 0) //!< The trigger shape has been removed from the actor/scene.
|
||||||
|
TriggerPairFlag_eREMOVED_SHAPE_OTHER TriggerPairFlag = (1 << 1) //!< The shape causing the trigger event has been removed from the actor/scene.
|
||||||
|
TriggerPairFlag_eNEXT_FREE TriggerPairFlag = (1 << 2) //!< For internal use only.
|
||||||
|
)
|
||||||
@ -39,4 +39,5 @@
|
|||||||
|
|
||||||
#include <CPxSimpleFactory.h>
|
#include <CPxSimpleFactory.h>
|
||||||
|
|
||||||
|
#include <CPxTriggerPair.h>
|
||||||
#include <CPxContactPairHeader.h>
|
#include <CPxContactPairHeader.h>
|
||||||
Reference in New Issue
Block a user