Esempio n. 1
0
            public override void reportFixtureAndParticle(FluidFixtureShape fixture, FluidParticle fp)
            {
                float   d;
                Vector2 n;

                fixture.computeDistance(fp, out d, out n);
                if ((d < fluidSystem.particleDiameter) &&
                    ((fp.flags & FluidParticleType.WallParticle) == 0))
                {
                    Rigidbody2D b = fixture.GetComponent <Rigidbody2D> ();
                    //Vector2 bp = b.transform.position;
                    float bm = b.mass;

                    //				b2Vec2 bp = b->GetWorldCenter();
                    //				float32 bI =
                    //				b->GetInertia() - bm * b->GetLocalCenter().LengthSquared();
                    float invBm = bm > 0 ? 1 / bm : 0;
                    //				float32 invBI = bI > 0 ? 1 / bI : 0;
                    float invAm = (fp.flags & FluidParticleType.WallParticle) > 0 ? 0 : fluidSystem.getParticleInvMass();
                    //Vector2 rp = fp.position - bp;
                    //				float rpn = rp * n;
                    //				float32 rpn = b2Cross(rp, n);
                    //				float32 invM = invAm + invBm + invBI * rpn * rpn;
                    float invM = invAm + invBm;

                    FluidParticleBodyContact contact = new FluidParticleBodyContact
                    {
                        fp      = fp,
                        body    = b,
                        fixture = fixture,
                        weight  = 1 - d * fluidSystem.inverseDiameter,
                        normal  = -n,
                        mass    = invM > 0 ? 1 / invM : 0
                    };

                    if (fixture.isTrigger())
                    {
                        fluidSystem.triggerContactBuffer.Add(contact);
                        fixture.notifyOnTrigger(contact);
                    }
                    else
                    {
                        fluidSystem.bodyContactBuffer.Add(contact);
                    }
                    //				m_system->DetectStuckParticle(a);
                }
            }