From 2831edb9d44718e976b0cf21efefbe91e4e23678 Mon Sep 17 00:00:00 2001 From: bloeys Date: Mon, 14 Feb 2022 08:52:18 +0400 Subject: [PATCH] Receive onContact callbacks --- main.go | 9 ++++++++- pgo/ccallbacks.go | 10 ++++++++++ pgo/libs/libphysx-c.a | Bin 22204 -> 22500 bytes pgo/pgo.go | 18 +++++++++++++----- pgo/physx-c/CPxSceneDesc.h | 5 ++++- 5 files changed, 35 insertions(+), 7 deletions(-) create mode 100755 pgo/ccallbacks.go diff --git a/main.go b/main.go index 18cfa46..a700f07 100755 --- a/main.go +++ b/main.go @@ -22,6 +22,7 @@ func main() { sd := pgo.NewSceneDesc(ts) sd.SetGravity(pgo.NewVec3(0, -9.8, 0)) sd.SetCpuDispatcher(pgo.DefaultCpuDispatcherCreate(2, 0).ToCpuDispatcher()) + sd.SetOnContactCallback() s := p.CreateScene(sd) println("Scene:", s) @@ -63,19 +64,23 @@ func main() { ra = dynBox2.ToRigidActor() ra.SetSimFilterData(&fd) - s.AddActor(dynBox2.ToActor()) //Add sphere v = pgo.NewVec3(0, 16, 0) tr3 := pgo.NewTransform(v, qID) dynSphere := pgo.CreateDynamic(p, tr3, pgo.NewSphereGeometry(3).ToGeometry(), pMat, 1, shapeOffset) + + ra = dynSphere.ToRigidActor() + ra.SetSimFilterData(&fd) s.AddActor(dynSphere.ToActor()) //Add capsule v = pgo.NewVec3(0, 20, 0) tr4 := pgo.NewTransform(v, qID) dynCapsule := pgo.CreateDynamic(p, tr4, pgo.NewCapsuleGeometry(0.25, 0.5).ToGeometry(), pMat, 1, shapeOffset) + ra = dynCapsule.ToRigidActor() + ra.SetSimFilterData(&fd) s.AddActor(dynCapsule.ToActor()) //Add compound shape @@ -89,6 +94,8 @@ func main() { someShape = pgo.CreateExclusiveShape(dynComp.ToRigidActor(), pgo.NewSphereGeometry(2).ToGeometry(), pMat, pgo.ShapeFlags_eSCENE_QUERY_SHAPE|pgo.ShapeFlags_eSIMULATION_SHAPE|pgo.ShapeFlags_eVISUALIZATION) someShape.SetLocalPose(pgo.NewTransform(pgo.NewVec3(-5, 0, 0), qID)) + ra = dynComp.ToRigidActor() + ra.SetSimFilterData(&fd) s.AddActor(dynComp.ToActor()) //Make some changes and print info diff --git a/pgo/ccallbacks.go b/pgo/ccallbacks.go new file mode 100755 index 0000000..912f769 --- /dev/null +++ b/pgo/ccallbacks.go @@ -0,0 +1,10 @@ +package pgo + +/* +void goOnContactCallback_cgo(void* pairHeader) +{ + void goOnContactCallback(void*); + goOnContactCallback(pairHeader); +} +*/ +import "C" diff --git a/pgo/libs/libphysx-c.a b/pgo/libs/libphysx-c.a index 6681115aad52ae8d6ce9a029461b0fe46af84959..7da1bf374f29fb2fff5058315fc1dc09532be9d4 100755 GIT binary patch delta 1862 zcmbW%e@xV690%|>M&K8aAEyFE0lG%DNH~6T2izTZ9B{vXqqafFu1Pvria%n5!)DGu z)ZO;D)*lXSv&~seH_S1@rjwyDsjavpW0%rW0!Zd5rG*nqmS)9P4oKFsN?ROA;7;4fTB@`j z0}`?ssd-$np8zD&v=XySa$>TbQS97-WVR{I1`Z^XPieZ%f~lPgB;+!ZgGZLYV|0+0 zZ3zb%$-}}V*B!;pf+z;JgAe3gQe1uPK%P-0FvTMw=Yrx`<^ts0uY^5-2Z2+x zm-*ppAh`y}WXz}qwpId*?6b({Va8#`HrBqE8@x~Fjesu1=SJWVovs238-U}aV;(!g z$?melAaynYyI4g@3oykG<1}Nl1t_-xXRSb-Ux*AU<@2#t7DwZ}k0u^P!( zgD{fZ;y~VdEr#=2@I}w4w#gXo49gG{Ooa8eoAF4!F<`9c)NJDsoYTLbSmH zFCyqb5?1|Z`p3*(`#)zNyObYDDX>L%_jK)!4s<YSnM;xL(M91|ghLZS8@5 z%g-`1iX>N58@G(l$*e*2GqZo6x$qpbM)8AdhxYMn9-sE+mG*0L^=47zjix&;-Mk{_ zv?5ttF3J(y@LeSKBFvy0z-d(sW>49)OM z#v@J^Z=`GxalcRdWIX3rSwfqb_eZr#$KqddwRX`Fh^BwI<>BXYE{E)2oG0c2K5gjR zpO*63<`lKTE^YL1&hU2v0Z|s|N-ueL S;{!P^$ckbw<%)BWHU9uZAF5pd delta 1784 zcmbW%OH5o<7zgk_&vF?GOc@HKJVsipSh2t`v^?j*V_=xay)y%iriv*H(l#YwA?d;} ziS43p44t#Esl>ERjkQXRK)OJ!s4>Py2_*(e)s_$>4aG*3B^Cc??!=Xei6p=I?swkj z+;ds^DB;ubgwfiFwW`V-`+GSZ!27^~8$kIYa4-|7YSC2;08)T$Voozs<*crH36QKu zb=CdMsisd?HNkPHQq>(|lqwb?@`sJ$G&3L_;=s~jx2`@7kOFJEMwUwr_jHymK&l^( zTW6$(6FTb(7e>M9xBw$HMsD(lx;dECGNQ8=0#XYHmFyRF&F6raL`HHwh~rLO*7MBx(m`_p!RwkJJix)z9Xq_pU%R?NnKn_%rfJ$sC>>h=}akk^B_-_CpN&b(*wY1nymzus)3_cpr5g?2AE(QmF4OoV1aEH zSZ3DPmbshjOsfah*w@_%+-m@~EWj|!*69TE$O;FW4)TK1O*V3K6(cP`Ax~qA@gn27 zW+0IsxHu`DbpoqA?E%W>^JXhhYy(UV?tp!UnU67#GQZZuuZULLfk9gA0FKckFE`>t z1j&4u>I6nTKq<}pc=?zQvwVy@3Gsr@(SE+lD=K&F=cT3!K96!YQI;on0T=3k>$NPW zY3_U<^HRB6)-4nNOCSZ=$V3{Fu@fP9P=GxKC`d;UGGIg&a$rIL8dL<~7nk!Lue72K zPBg&|8yeA!dNjZRH#*RXcI@JIQ?UcPQG#N);Drxe=tcq(|7EiOn9KUV=9(-h2&7KF zS#n1av&M8WV>Al0F;!$4v&3u0w8@#WmrBJu9+NWpwCg*5zo-?Tc*4raP|DXu%<4p$ zH>`}GulY-6_2MmNw_ojB<26QuNb#LaNi4gyT`CfMxnij#O+giM=P^G#*u@?HDJ4AL_=8-CL%7ti z;rUZVcT1T$kt}THJTa@PDHiSi-E#4He{<7@ve3}<*L=YQ7$fP zIpRgu*9WwWH=5i3c$W2ToL*c?HH(Lp8RAl~Lf9)!%KDGnzsR+@gfSRa_U@gVlhe10 zNHA=ec_IHxIdBK3|DDqxuhRQDLnh_>eCHSWtaFQ=P>=Fkf5T6C%sRz4%(ll3kM}V1 zh=X0d%FidOZx=H2inqIZ4WId^XP#i@ #include //Needed for C.free + +//simulation event callbacks forward declarations. Actual definitions MUST be in a go different file +void goOnContactCallback_cgo(void* pairHeader); */ import "C" +import "unsafe" type PvdInstrumentationFlag uint32 @@ -99,8 +103,6 @@ func (s *Scene) Simulate(elapsedTime float32) { C.CPxScene_simulate(s.cS, C.float(elapsedTime)) } -// void CPxScene_advance(CSTRUCT CPxScene*); - func (s *Scene) Collide(elapsedTime float32) { C.CPxScene_collide(s.cS, C.float(elapsedTime)) } @@ -203,9 +205,6 @@ func (s *Shape) SetSimulationFilterData(fd *FilterData) { C.CPxShape_setSimulationFilterData(&s.cShape, &fd.cFilterData) } -// CPxAPI CSTRUCT CPxFilterData CPxShape_getSimulationFilterData(CSTRUCT CPxShape* cs); -// CPxAPI void CPxShape_setSimulationFilterData(CSTRUCT CPxShape* cs, CSTRUCT CPxFilterData cfd); - func CreateExclusiveShape(rigidActor RigidActor, geom *Geometry, mat *Material, shapeFlags ShapeFlags) Shape { return Shape{ cShape: C.createExclusiveShape(rigidActor.cRa, geom.cG, mat.cM, uint32(shapeFlags)), @@ -264,6 +263,15 @@ func (sd *SceneDesc) SetCpuDispatcher(cd *CpuDispatcher) { C.CPxSceneDesc_set_cpuDispatcher(sd.cSD, cd.cCpuDisp) } +//export goOnContactCallback +func goOnContactCallback(p unsafe.Pointer) { + println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") +} + +func (sd *SceneDesc) SetOnContactCallback() { + C.CPxSceneDesc_set_onContactCallback(sd.cSD, (C.CPxonContactCallback)(unsafe.Pointer(C.goOnContactCallback_cgo))) +} + func NewSceneDesc(ts *TolerancesScale) *SceneDesc { return &SceneDesc{ cSD: C.NewCPxSceneDesc(ts.cTolScale), diff --git a/pgo/physx-c/CPxSceneDesc.h b/pgo/physx-c/CPxSceneDesc.h index 094a800..221aed4 100755 --- a/pgo/physx-c/CPxSceneDesc.h +++ b/pgo/physx-c/CPxSceneDesc.h @@ -13,14 +13,17 @@ extern "C" { void* obj; }; + typedef void (*CPxonContactCallback)(void* pairHeader); + /// - /// Creates a SceneDesc with a custom filterShader that uses word0/word1 as groups shapes belong to, and word2/word3 as mask on the groups. + /// 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. /// /// /// CPxAPI CSTRUCT CPxSceneDesc* NewCPxSceneDesc(CSTRUCT CPxTolerancesScale); CPxAPI void CPxSceneDesc_set_gravity(CSTRUCT CPxSceneDesc*, CSTRUCT CPxVec3); CPxAPI void CPxSceneDesc_set_cpuDispatcher(CSTRUCT CPxSceneDesc*, CSTRUCT CPxCpuDispatcher*); + CPxAPI void CPxSceneDesc_set_onContactCallback(CSTRUCT CPxSceneDesc*, CPxonContactCallback cb); CPxAPI void FreeCPxSceneDesc(CSTRUCT CPxSceneDesc*); #ifdef __cplusplus