// collide() pits particles against triangles in an all-out grudge match void collide(float dt) { // WORKING VECTORS (allocate only once) // see "INL:" comments for places where inlining has occurred and alternate syntax Vec3 nextpos = new Vec3(); Vec3 offset = new Vec3(); // TRIANGLE OUTER LOOP for (int it=0; it 0f) continue; // nope // CALCULATE DISTANCE TO COLLISION float nv = vel.dot(trinorm); float ht = -distold / nv; // CALCULATE HIT LOCATION // INL: Vec3 hit = pos.add(vel.mul(ht)); float hitx = pos.x + vel.x * ht; float hity = pos.y + vel.y * ht; float hitz = pos.z + vel.z * ht; // CALCULATE OFFSET IN UV COORDS // INL: Vec3 offset = hit.sub(trip1); offset.x = hitx - trip1.x; offset.y = hity - trip1.y; offset.z = hitz - trip1.z; // DID PARTICLE PASS THROUGH TRIANGLE? float upos = offset.dot(vw); float vpos = offset.dot(uw); if ((upos < 0f) || (vpos < 0f) || (upos+vpos > 1f)) continue; // nope // COLLISION RESPONSE // INL: Vec3 vnorm = trinorm.mul(nv); float vnormx = trinorm.x * nv; float vnormy = trinorm.y * nv; float vnormz = trinorm.z * nv; // UPDATE VELOCITY // INL: vel.subby(vnorm.mul(2f)); vel.x -= vnormx * 2f; vel.y -= vnormy * 2f; vel.z -= vnormz * 2f; } // END OF PARTICLE LOOP } // END OF TRIANGLE LOOP }