/// <summary> /// Get the latest contact info from the simulation and parse that infor into easily readable arrays of structs</summary> public void Update() { IntPtr contactinfo = LPAPIContacts.UpdateContactListener(ContactListenerPtr); //find out how many contacts there were float[] info = new float[3]; Marshal.Copy(contactinfo, info, 0, 3); int fixfixnum = (int)info[0]; int fixpartnum = (int)info[1]; int partpartnum = (int)info[2]; //Debug.Log("fixfix "+fixfixnum +" fixpart "+fixpartnum+ " partpart "+partpartnum ); int totalnum = 3 + fixfixnum * ff + fixpartnum * pf + partpartnum * pp; float[] allinfo = new float[totalnum]; Marshal.Copy(contactinfo, allinfo, 0, totalnum); //Parse contacts into structsS FixtureFixtureContacts = new LPContactFixFix[fixfixnum]; for (int i = 0; i < fixfixnum; i++) { FixtureFixtureContacts[i] = new LPContactFixFix { BodyAIndex = (int)allinfo[3 + (i * ff)] , BodyBIndex = (int)allinfo[4 + (i * ff)] , FixtureAIndex = (int)allinfo[5 + (i * ff)] , FixtureBIndex = (int)allinfo[6 + (i * ff)] , ManifoldPoint1 = new Vector3(allinfo[7 + (i * ff)], allinfo[8 + (i * ff)]) , ManifoldPoint2 = new Vector3(allinfo[9 + (i * ff)], allinfo[10 + (i * ff)]) , Normal = new Vector3(allinfo[11 + (i * ff)], allinfo[12 + (i * ff)]) , IsTouching = floattoBool(allinfo[12 + (i * ff)]) }; } int start = 3 + (fixfixnum * ff); ParticleFixtureContacts = new LPContactPartFix[fixpartnum]; for (int i = 0; i < fixpartnum; i++) { ParticleFixtureContacts[i] = new LPContactPartFix { ParticleSystemIndex = (int)allinfo[start + (i * pf)] , ParticleIndex = (int)allinfo[start + (i * pf) + 1] , BodyIndex = (int)allinfo[start + (i * pf) + 2] , FixtureIndex = (int)allinfo[start + (i * pf) + 3] , Normal = new Vector3((int)allinfo[start + (i * pf) + 4], (int)allinfo[start + (i * pf) + 5]) }; } start = 3 + (fixfixnum * ff) + (fixpartnum * pf); ParticleParticleContacts = new LPContactPartPart[partpartnum]; for (int i = 0; i < partpartnum; i++) { ParticleParticleContacts[i] = new LPContactPartPart { ParticleSystemIndex = (int)allinfo[start + (i * pp)] , ParticleAIndex = (int)allinfo[start + (i * pp) + 1] , ParticleBIndex = (int)allinfo[start + (i * pp) + 2] //,Normal = new Vector3((int)allinfo[start+(i*pp)+3],(int)allinfo[start+(i*pp)+4]) }; } }
/// <summary> /// Create a contact listener object in the simulation</summary> public void Initialise(IntPtr worldptr) { ContactListenerPtr = LPAPIContacts.SetContactListener(worldptr); }