From 3344705f6b07f41aea5e6541889e09aaa4cf6c8e Mon Sep 17 00:00:00 2001 From: bloeys Date: Mon, 14 Feb 2022 06:45:15 +0400 Subject: [PATCH] Simulation filtering --- main.go | 10 ++++++++++ pgo/libs/libphysx-c.a | Bin 21356 -> 22204 bytes pgo/pgo.go | 34 ++++++++++++++++++++++++++++++++++ pgo/physx-c/CPxFilterData.h | 26 ++++++++++++++++++++++++++ pgo/physx-c/CPxRigidActor.h | 5 +++++ pgo/physx-c/CPxSceneDesc.h | 2 +- pgo/physx-c/CPxShape.h | 3 +++ 7 files changed, 79 insertions(+), 1 deletion(-) create mode 100755 pgo/physx-c/CPxFilterData.h diff --git a/main.go b/main.go index 59a8839..18cfa46 100755 --- a/main.go +++ b/main.go @@ -38,6 +38,9 @@ func main() { groundPlane := pgo.CreatePlane(p, pgo.NewPlane(0, 1, 0, 0), pMat) s.AddActor(groundPlane.ToActor()) + //W0/W1 are filter groups the shape belongs to, and W2/W3 are a filter group mask + fd := pgo.NewFilterData(1, 1, 1, 1) + //Add box1 v := pgo.NewVec3(0, 10, 0) q := pgo.NewQuat(0, 0, 1, 0) @@ -48,12 +51,19 @@ func main() { box := pgo.NewBoxGeometry(0.5, 0.5, 0.5) dynBox := pgo.CreateDynamic(p, tr, box.ToGeometry(), pMat, 1, shapeOffset) + + ra := dynBox.ToRigidActor() + ra.SetSimFilterData(&fd) s.AddActor(dynBox.ToActor()) //Add box2 v = pgo.NewVec3(0.5, 12, 0) tr2 := pgo.NewTransform(v, qID) dynBox2 := pgo.CreateDynamic(p, tr2, box.ToGeometry(), pMat, 1, shapeOffset) + + ra = dynBox2.ToRigidActor() + ra.SetSimFilterData(&fd) + s.AddActor(dynBox2.ToActor()) //Add sphere diff --git a/pgo/libs/libphysx-c.a b/pgo/libs/libphysx-c.a index 70877f9dbd0bca9d013aba0dcc7cfe621cee4eb1..6681115aad52ae8d6ce9a029461b0fe46af84959 100755 GIT binary patch delta 2871 zcmcJQdu-F!7016MG07!Q;xvK08uB6`keBn09XpO4J5Fr>>;$S!v~B>?xFsL)uh9vvd8kx=9Ua z|IE_I=XcIM_uO-S_n!M(_~D9QPOKPf4AoXw=Y@Zdt^)8XQ1&{o=^{{(1XNp8D*FJ5 zmwm$QWyw^XQ>nQMNNTsL)a+!PsoSAaeTw5SRf;Fas=^4&Jgb+gLKrMHSapK;n#1>3jo_bd7}xp(~#s7}u;yXFEGE zPEJDN;Y1{ko(MB6nVw=5k~9E~CnE5KMy7%H zNYYfOqT}Qwn>m><*H~VopO(2M^P_KQ+S-)8-oRsl9j)7kf_r>}{-N$be|uopkbjS* zcc>RWU!Z@t@BU77ptNeTL3D}?b^7qG-l0Hn;6G7lI#v5H$NkCxIB<7g?{2^EvGBrQ zb@+1q`@2y~Nzvrd)Tg3CwYo1matj}d*UNy5n}DPWJ|MjDef)}6d4avmxhmjl4Y0Kq z*vWE79dL?$6t*k%zy1Ad30e#)~rh&A<&lG<{48Ki{?jxkezZl`G&mBdi~0 zeVp}ITKFWIbP2%VXCVzU-hu3X%|q7$l+xU091y zJOoxD2MJh>WN48FFFa7t4L2S@CbE!?HON37>QIXc=um(nRH6o(umS5)j4I@#5Y;Hh zMwFoxC1^lBn$QR<+F?cuOfbTLHZ((zRyfdsPS}ykuWDrou}H^*$b}6~xUd;pumVxb zWcvR})c8MVx=f<$ux|2n#-*tA<(qMGG_yP=;~t$t6V41enVRsxvVBHRugsgA&mD=m zS7=W`s^*@dr&DuicgZSxq$DnFx$u+0lA~Ixw5M%&p*MDkJC651M)vl7ZWfwp_G&(V zdg^yYbVQ#yp1hK5dXLynCob{LhzIFqeZM9cz4cN#9W<e&q(tAJx^DX%bz(%TgA#AgeC z;rjrEs@1qneE->9e=BE8QN$wX`6NL)aKE|YEGRgq=zk; zbTnJT`6*)0;?LifeiiIDEDrR){e@hwlC=VQ$z-Hft5%ag_xwT)UAC6fcdQ;U{CneH zW$xAVq4k^M*Ehd6C-c>XEBSG;hC=NRi5I5d`CubkYa-SZ>gmwaxyCe2^p6t%RZQ>N zvgj)B;$E8~R{nYFx;zDS^e5Y(c&N#@D7AWW+6NO3%=hje(FAJ~2kX9&S~F!i{PAapcg)Kz(IbYYQ`XXPha#d%f3=j) zHUr&t1VnV{@#`}E77BI-MdCkV@5tFky4mTEH$9`hE033nXFr*nMSHpw;h!~}mut7u zJ6-HMJP%)e7xKo#)E?@};(^2m8KXBN}To(x_7_`VQW@C4*V$ zHRqOanB%q1TQZFGzr)Ci>Ff`_hned6|O16SodFWI__{ta06-j4tP delta 2330 zcmc)K`%jzK83*uhD0X-;_e-ESfFVEtC){E#=3+1g8*F22lh7#b0!hlIWU1EDWut2v zZ&IXbQxqXT=`YFFHk#VfE=e=Fs;VeeXi~Lll+rZQ*vblNGihx%)Fv6LGN!`5$1j?+ zzhFooj?Z(RbIx<#^V%2Bu3LO*-K0Iz(9&dy|BWUC_zh4s3vA)XtxZ7PL0!!xpad@H z1}g!j_8Z-{Bp~i6TWUD2vmFDJx;b6#1oNqJP0dP#3$HL~&A<&nY2?C6)40xF2PlIl zb#08t8QD@pna=(k^QbjvO_VL!Qgp!sKwJV_3P+atkGiXM9ajORdrIeU1B%n8>pBN0 zy(iXWu%#{*r}S{MI2O=Dofmbk7XYRGn$9uJbt&RJ!-dIJs_W=u0o3WxwQuJHYFp5` zxj|e3Tk`O6$EC3)-$|W62~fP}b^W7&;%(RU&#*s(2>eHwNPYKoJ{F<`{5sZxxWjBI zIIHt7avlxr*44iWD535(ud}5Vo>FPPxn?I@YPzjhILM8Zdao{A!7EXC(r`4km|!y+ zM@IHP_V|eW)S9crPG~+&t`(=sLRD7mc=l5Xkp}yJU*jPbJX^(oTe!hi;2^JMvIe*i z04fK8Z)$<0ZNO1F-T)l40dvfmV0@wxSYhr8V>bqv%l>#1UtT+Kl5@w~03(%g-gAuQ zv;t9zq;SH4Ado=IVW65%;c5pk#n$cM%jX2nbpa=OfefnS=V%WXpo^Wr3ohUquV$LL zXP8^cejn#MIJTYf1#TL30|j){1EkSO9}mI@ciziu9PQ_O!Y4Sx_6URbcxRu2A~@d_R!O8ixT0U1a`5)zS$5c=^T zOwf>wLZl!QGMQ(L3?hI51mQ<63Sh=Yk;NdB<;DQnBu>r*>f*W4=5XKPJApwT8|E*Ad zmY4f~EXe{39*AAZ|2RQ@>Bx*-H|HeEFM_EuZnVS(Ek8<>J1I%hnqDfm%}vFm!sV)dt^Kx$DT2Bb|G-Gohw?e4k-q$_82O+@pQ9>;Bh#vr!U{M7l<_KNW>Pu4be( z9vR(ek^{X#?Z%E%f8e(Un;1Q0XbE2Uyhgs`w8*72O%l6<+Rxv<`#yhdQ68UVsW8X{ zqoalUK2fVz$Vc6W42PaIPdCa3-NjK;rabKmX?xG)u5RXVB`0Oee6mUY;R+e%-+1b8 zHS&=wPeyz8YOUY1&Z#A;#p&K4A8P4xr-$2p{pn|_NNYSg()+Ns+qSr*3fvNp_|wwl z^WKml#rn)&%j8mTfjs2ipihC!rtcB$k)#)|Z{cd&;?>(LGi1uw zF2@2nn%`XezPbsUyw?Ai;nn14uUqA}{bni5Ffk`ZKJ?a0k~c@I`r}*wvNEqpPJ5p; zWHudsr(AyR&6m}pB(eKK+R)O~Pm4I-BH|mbba>`Gm1VCPP8(R$cC_+O9{w42@~;+`qi6R_>LD!ege(?>+HP zwSrsaTk>Qf9Mq`bfF;{zmq^ zEIlyxW4RN0P!`(j%jGw?Sp&k3ROH-$3)Vu+?vSXh% f-&MA%b_huA@QBHFIr{@OZ;%y5tQ+LD;ne>CAe15~ diff --git a/pgo/pgo.go b/pgo/pgo.go index 67accf7..64b1508 100755 --- a/pgo/pgo.go +++ b/pgo/pgo.go @@ -164,6 +164,21 @@ func CreatePhysics(f *Foundation, ts *TolerancesScale, trackOutstandingAllocatio return p } +type FilterData struct { + cFilterData C.struct_CPxFilterData +} + +func NewFilterData(w0, w1, w2, w3 uint32) FilterData { + return FilterData{ + cFilterData: C.struct_CPxFilterData{ + word0: C.uint(w0), + word1: C.uint(w1), + word2: C.uint(w2), + word3: C.uint(w3), + }, + } +} + type Shape struct { cShape C.struct_CPxShape } @@ -178,6 +193,19 @@ func (s *Shape) SetLocalPose(tr *Transform) { C.CPxShape_setLocalPose(&s.cShape, &tr.cT) } +func (s *Shape) GetSimulationFilterData() FilterData { + return FilterData{ + cFilterData: C.CPxShape_getSimulationFilterData(&s.cShape), + } +} + +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)), @@ -356,6 +384,12 @@ type RigidActor struct { cRa C.struct_CPxRigidActor } +func (ra *RigidActor) SetSimFilterData(fd *FilterData) { + C.CPxRigidActor_setSimFilterData(&ra.cRa, &fd.cFilterData) +} + +// CPxAPI void CPxRigidActor_setSimFilterData(CSTRUCT CPxRigidActor* cra, CSTRUCT CPxFilterData* cfd); + type RigidStatic struct { cRs *C.struct_CPxRigidStatic } diff --git a/pgo/physx-c/CPxFilterData.h b/pgo/physx-c/CPxFilterData.h new file mode 100755 index 0000000..9ad8fab --- /dev/null +++ b/pgo/physx-c/CPxFilterData.h @@ -0,0 +1,26 @@ +#ifndef CPxFilterData_H +#define CPxFilterData_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 word1; + CPxU32 word2; + CPxU32 word3;*/ + }; + +#ifdef __cplusplus +} +#endif + +#endif // !CPxFilterData_H diff --git a/pgo/physx-c/CPxRigidActor.h b/pgo/physx-c/CPxRigidActor.h index 86cbbb6..4386b1b 100755 --- a/pgo/physx-c/CPxRigidActor.h +++ b/pgo/physx-c/CPxRigidActor.h @@ -1,6 +1,8 @@ #ifndef CPxRigidActor_H #define CPxRigidActor_H +#include "CPxFilterData.h" + #ifdef __cplusplus extern "C" { #endif @@ -10,6 +12,9 @@ extern "C" { void* obj; }; + //Sets the CPxFilterData on all the shapes of the actor. + CPxAPI void CPxRigidActor_setSimFilterData(CSTRUCT CPxRigidActor* cra, CSTRUCT CPxFilterData* cfd); + #ifdef __cplusplus } #endif diff --git a/pgo/physx-c/CPxSceneDesc.h b/pgo/physx-c/CPxSceneDesc.h index 84ba6d3..094a800 100755 --- a/pgo/physx-c/CPxSceneDesc.h +++ b/pgo/physx-c/CPxSceneDesc.h @@ -14,7 +14,7 @@ extern "C" { }; /// - /// Creates a SceneDesc with filterShader=physx::PxDefaultSimulationFilterShader + /// Creates a SceneDesc with a custom filterShader that uses word0/word1 as groups shapes belong to, and word2/word3 as mask on the groups. /// /// /// diff --git a/pgo/physx-c/CPxShape.h b/pgo/physx-c/CPxShape.h index 9b0992e..48ac2a4 100755 --- a/pgo/physx-c/CPxShape.h +++ b/pgo/physx-c/CPxShape.h @@ -2,6 +2,7 @@ #define CPxShape_H #include "CPxTransform.h" +#include "CPxFilterData.h" #ifdef __cplusplus extern "C" { @@ -14,6 +15,8 @@ extern "C" { CPxAPI void CPxShape_setLocalPose(CSTRUCT CPxShape* cs, CSTRUCT CPxTransform* tr); CPxAPI CSTRUCT CPxTransform CPxShape_getLocalPose(CSTRUCT CPxShape* cs); + CPxAPI CSTRUCT CPxFilterData CPxShape_getSimulationFilterData(CSTRUCT CPxShape* cs); + CPxAPI void CPxShape_setSimulationFilterData(CSTRUCT CPxShape* cs, CSTRUCT CPxFilterData* cfd); #ifdef __cplusplus }