From 7b1bf6637be453822ad0f77349e22095156b4a10 Mon Sep 17 00:00:00 2001 From: Ketmar Dark Date: Fri, 28 Oct 2016 00:20:10 +0300 Subject: [PATCH] removed some unused code --- b2dlite.d | 86 +++++++++++++++++++-------------------------------------------- xmain.d | 2 +- 2 files changed, 26 insertions(+), 62 deletions(-) diff --git a/b2dlite.d b/b2dlite.d index c27b473..8393a1e 100644 --- a/b2dlite.d +++ b/b2dlite.d @@ -18,7 +18,6 @@ private: public import iv.vmath; version = b2dlite_use_bvh; -//version = b2dlite_clear_arbiters; // ////////////////////////////////////////////////////////////////////////// // @@ -130,16 +129,16 @@ private: private: version(b2dlite_use_bvh) { DynamicAABBTree bvh; - bool[ArbiterKey] overbodies; // overlapped nodes; actively reused } + uint frameNum; + public: BodyBase[] bodies; Joint[] joints; Arbiter[ArbiterKey] arbiters; Vec2 gravity; int iterations; - Arbiter xarb; // temporary // the following are world options static bool accumulateImpulses = true; @@ -158,7 +157,6 @@ public: this() (in auto ref Vec2 agravity, int aiterations) { gravity = agravity; iterations = aiterations; - xarb = new Arbiter(); version(b2dlite_use_bvh) bvh = new DynamicAABBTree(VFloatNum!0.2); // gap } @@ -185,6 +183,8 @@ public: } void step (VFloat dt) { + if (dt <= VFloatNum!0) return; + ++frameNum; // new frame (used to track arbiters) VFloat invDt = (dt > VFloatNum!0 ? VFloatNum!1/dt : VFloatNum!0); // determine overlapping bodies and update contact points broadPhase(); @@ -195,11 +195,15 @@ public: b.angularVelocity += dt*b.invI*b.torque; } // perform pre-steps - foreach (Arbiter arb; arbiters.byValue) arb.preStep(invDt); + foreach (Arbiter arb; arbiters.byValue) { + if (arb.frameNum == frameNum && arb.active) arb.preStep(invDt); + } foreach (Joint j; joints) j.preStep(invDt); // perform iterations foreach (immutable itnum; 0..iterations) { - foreach (Arbiter arb; arbiters.byValue) arb.applyImpulse(); + foreach (Arbiter arb; arbiters.byValue) { + if (arb.frameNum == frameNum && arb.active) arb.applyImpulse(); + } foreach (Joint j; joints) j.applyImpulse(); } // integrate velocities @@ -215,43 +219,29 @@ public: void broadPhase () { version(b2dlite_use_bvh) { - overbodies.clear(); - version(b2dlite_clear_arbiters) foreach (Arbiter arb; arbiters.byValue) arb.clear(); - //{ import core.stdc.stdio; printf("======================\n"); } foreach (immutable idx, BodyBase bi; bodies) { - //if (bi in overbodies) continue; - //overbodies[bi] = true; auto aabb = bi.getAABB(); - //{ import core.stdc.stdio; printf(" checking body #%u\n", bi.midx); } bvh.reportAllShapesOverlappingWithAABB(aabb, (int nodeid) { - //{ import core.stdc.stdio; printf("nodeid=%d\n", nodeid); } auto bj = bvh.getNodeBody(nodeid); if (bj == bi) return; + if (bi.invMass == VFloatNum!0 && bj.invMass == VFloatNum!0) return; auto ak = ArbiterKey(bi, bj); - if (ak !in overbodies) { - //{ import core.stdc.stdio; printf(" collistion with body #%u\n", bj.midx); } - overbodies[ak] = true; - if (bi.invMass == VFloatNum!0 && bj.invMass == VFloatNum!0) return; - if (auto arb = ak in arbiters) { - arb.setup(bi, bj); - } else { - arbiters[ak] = new Arbiter(bi, bj); - } + if (auto arb = ak in arbiters) { + if (arb.frameNum != frameNum) arb.setup(bi, bj, frameNum); + } else { + arbiters[ak] = new Arbiter(bi, bj, frameNum); } }); } } else { // O(n^2) broad-phase - version(b2dlite_clear_arbiters) foreach (Arbiter arb; arbiters.byValue) arb.clear(); foreach (immutable idx, BodyBase bi; bodies) { foreach (BodyBase bj; bodies[idx+1..$]) { if (bi.invMass == VFloatNum!0 && bj.invMass == VFloatNum!0) continue; if (auto arb = ArbiterKey(bi, bj) in arbiters) { - //xarb.setup(bi, bj); - //arb.update(xarb.contacts.ptr, xarb.numContacts); - arb.setup(bi, bj); + arb.setup(bi, bj, frameNum); } else { - arbiters[ArbiterKey(bi, bj)] = new Arbiter(bi, bj); + arbiters[ArbiterKey(bi, bj)] = new Arbiter(bi, bj, frameNum); } } } @@ -499,7 +489,7 @@ public: if (!isConvex()) throw new Exception("non-convex body"); // compute face normals - //norms.length = verts.length; + norms.reserve(verts.length); foreach (immutable i1; 0..verts.length) { immutable i2 = (i1+1)%verts.length; auto face = verts[i2]-verts[i1]; @@ -711,13 +701,18 @@ public: // combined friction VFloat friction; + uint frameNum; // used to track "frame touch" + public: this () {} - this (BodyBase b0, BodyBase b1) { setup(b0, b1); } + this (BodyBase b0, BodyBase b1, int aFrameNum) { setup(b0, b1, frameNum); } void clear () { numContacts = 0; } - void setup (BodyBase b0, BodyBase b1) { + @property bool active () { return (numContacts > 0); } + + void setup (BodyBase b0, BodyBase b1, int aFrameNum) { + frameNum = aFrameNum; import core.stdc.math : sqrtf; if (b0 < b1) { body0 = b0; @@ -739,37 +734,6 @@ public: } } - void update (Contact* newContacts, int numNewContacts) { - Contact[MaxContactPoints] mergedContacts; - assert(numNewContacts >= 0 && numNewContacts <= mergedContacts.length); - foreach (immutable idx; 0..numNewContacts) { - Contact* cNew = newContacts+idx; - int k = -1; - foreach (immutable j; 0..numContacts) { - Contact* cOld = contacts.ptr+j; - //!!0:if (cNew.feature.value == cOld.feature.value) { k = j; break; } - } - if (k > -1) { - Contact* c = mergedContacts.ptr+idx; - Contact* cOld = contacts.ptr+k; - *c = *cNew; - if (World.warmStarting) { - c.accimpN = cOld.accimpN; - c.accimpT = cOld.accimpT; - c.accimpNb = cOld.accimpNb; - } else { - c.accimpN = VFloatNum!0; - c.accimpT = VFloatNum!0; - c.accimpNb = VFloatNum!0; - } - } else { - mergedContacts[idx] = newContacts[idx]; - } - } - contacts[0..numNewContacts] = mergedContacts[0..numNewContacts]; - numContacts = numNewContacts; - } - void preStep (VFloat invDt) { import std.algorithm : min; enum AllowedPenetration = VFloatNum!(0.01); diff --git a/xmain.d b/xmain.d index 2226948..8324ca3 100644 --- a/xmain.d +++ b/xmain.d @@ -21,7 +21,7 @@ import iv.vmath; import b2dlite; -enum show_times = false; +enum show_times = true; // ////////////////////////////////////////////////////////////////////////// // -- 2.11.4.GIT