public FluidBox ReadNextFluidBox(Stream src) { FluidBox fbox = new FluidBox(); fbox.value = ReadNextFloat32(src); return(fbox); }
/// <summary> /// /// </summary> /// <param name="timeStep"></param> public override void PreStep(float timeStep) { float damping = (float)Math.Pow(Damping, timeStep); foreach (RigidBody body in bodies) { if (FluidBox.Contains(body.BoundingBox) != JBBox.ContainmentType.Disjoint) { JVector[] positions = samples[body.Shape]; float frac = 0.0f; JVector currentCoord = JVector.Zero; for (int i = 0; i < positions.Length; i++) { currentCoord = JVector.Transform(positions[i], body.Orientation); currentCoord = JVector.Add(currentCoord, body.Position); bool containsCoord = false; if (fluidArea == null) { containsCoord = FluidBox.Contains(ref currentCoord) != JBBox.ContainmentType.Disjoint; } else { containsCoord = fluidArea(ref currentCoord); } if (containsCoord) { body.AddForce((1.0f / positions.Length) * body.Mass * Flow); body.AddForce(-(1.0f / positions.Length) * body.Shape.Mass * Density * world.Gravity, currentCoord); frac += 1.0f / positions.Length; } } body.AngularVelocity *= damping; body.LinearVelocity *= damping; } } }