public void Run(EcsSystems systems) { var mToP = renderData.MetersToPixels; var canvasHeight = renderData.CanvasHeight; var gfxBuffer = renderData.gfxBuffer; var springCompressedPen = renderData.SpringCompressedPen; var springRestPen = renderData.SpringRestPen; var springExtendedPen = renderData.SpringExtendedPen; foreach (var entity in springsBodyBody) { var spring = springsBodyBodyPool.Get(entity); DrawSpring( Pose.Transform(spring.AttachmentPointBodyA, poses.Get(spring.BodyA)), Pose.Transform(spring.AttachmentPointBodyB, poses.Get(spring.BodyB)), spring.RestLength); } foreach (var entity in springsBodySpace) { var spring = springsBodySpacePool.Get(entity); DrawSpring( Pose.Transform(spring.AttachmentPointBody, poses.Get(spring.Body)), spring.AttachmentPointSpace, spring.RestLength); } void DrawSpring(Vector2 positionA, Vector2 positionB, float restLength) { var v = positionA - positionB; var distance = v.Length(); if (distance < restLength) { Renderer.DrawSegment( positionA * mToP, positionB * mToP, springCompressedPen, gfxBuffer, canvasHeight); } else { Renderer.DrawSegment( positionA * mToP, positionB * mToP, springExtendedPen, gfxBuffer, canvasHeight); Renderer.DrawSegment( positionB * mToP, (positionB + v / distance * restLength) * mToP, springRestPen, gfxBuffer, canvasHeight); } } }
public void Run(EcsSystems systems) { var dt = systems.GetShared <PhysicsData>().GetDt(); foreach (var entity in bodies) { ref var pose = ref poses.Get(entity); ref var rigidBody = ref rigidBodies.Get(entity);
public void Run(EcsSystems systems) { foreach (var evt in contacts) { SolveContact(contactsPool.Get(evt)); contactsPool.Del(evt); } }
public void Run(EcsSystems systems) { foreach (var evt in possibleContacts) { TestPair(possibleContactsPool.Get(evt)); possibleContactsPool.Del(evt); } }
public void Run(EcsSystems systems) { // possible optimization: // if spring.RestLength == 0, k = spring.ElasticityCoefficient // no need to calc diff.Length foreach (var entity in springsBodyBody) { ref var spring = ref springsBodyBodyPool.Get(entity); ref var poseA = ref poses.Get(spring.BodyA);
public void Run(EcsSystems systems) { var gravity = gameplayData.Gravity; foreach (var entity in bodies) { ref var rigidBody = ref rigidBodies.Get(entity); var gravityForce = gravity * rigidBody.Mass; Velocity.ApplyForceLinear(ref velocities.Get(entity), gravityForce); }
public void Run(EcsSystems systems) { var physicsData = systems.GetShared <PhysicsData>(); var testersMatrix = physicsData.ContactTestersMatrix; var solversMatrix = physicsData.ContactSolversMatrix; SortBoundingBoxes(); var bodiesEntities = bodies.GetRawEntities(); var bodiesCount = bodies.GetEntitiesCount(); for (var i = 0; i < bodiesCount; ++i) { var bodyA = bodiesEntities[i]; ref var bboxA = ref boundingBoxes.Get(bodyA); for (var k = i + 1; k < bodiesCount; ++k) { var bodyB = bodiesEntities[k]; ref var bboxB = ref boundingBoxes.Get(bodyB); // this bboxB and every next one cannot intersect with bboxA if (bboxB.Min.X > bboxA.Max.X) { break; } // we already know that bboxes intersect on X axis, so test only Y axis if (bboxA.Max.Y >= bboxB.Min.Y && bboxB.Max.Y >= bboxA.Min.Y) { var maskA = bodyMasks.Get(bodyA); var maskB = bodyMasks.Get(bodyB); var testerReference = testersMatrix[maskA.ShapeTypeId][maskB.ShapeTypeId]; var solverReference = solversMatrix[maskA.TagTypeId][maskB.TagTypeId]; // some shape pairs cannot be tested, some tag pairs cannot be solved if (testerReference != null && solverReference != null) { testerReference.AddTask(bodyA, bodyB, maskA, maskB); } } }
public void Run(EcsSystems systems) { var worldConstraints = systems.GetWorld(PhysicsWorldNames.Constraints); var sharedData = systems.GetShared <SharedData>(); var factory = sharedData.ObjectsFactory; var keys = sharedData.Keys; var mousePositionWorld = keys.GetMousePosition() * sharedData.RenderData.PixelsToMeters; if (isActive && keys[MouseButtons.Left]) { ref var spring = ref springsBodySpace.Get(springEntity); spring.AttachmentPointSpace = mousePositionWorld; }
public void Run(EcsSystems systems) { var mToP = renderData.MetersToPixels; var canvasHeight = renderData.CanvasHeight; var gfxBuffer = renderData.gfxBuffer; var segmentPen = renderData.SegmentPen; foreach (var entity in segments) { ref var segment = ref segmentShapes.Get(entity); Renderer.DrawSegment( segment.A * mToP, segment.B * mToP, segmentPen, gfxBuffer, canvasHeight); }
public void Run(EcsSystems systems) { var mToP = renderData.MetersToPixels; var canvasHeight = renderData.CanvasHeight; var gfxBuffer = renderData.gfxBuffer; var bboxPen = renderData.BBoxPen; foreach (var entity in boundingBoxes) { ref var bbox = ref boundingBoxesPool.Get(entity); Renderer.DrawBoundingBox( bbox.Min * mToP, bbox.Max * mToP, bboxPen, gfxBuffer, canvasHeight); }
public void Run(EcsSystems systems) { var mToP = renderData.MetersToPixels; var canvasHeight = renderData.CanvasHeight; var gfxBuffer = renderData.gfxBuffer; var brush = renderData.MeshBrush; foreach (var entity in aaboxes) { ref var boundingBox = ref boundingBoxesPool.Get(entity); Renderer.DrawAABox( boundingBox.Min * mToP, boundingBox.Max * mToP, brush, gfxBuffer, canvasHeight); }
public void Run(EcsSystems systems) { var mToP = renderData.MetersToPixels; var canvasHeight = renderData.CanvasHeight; var gfxBuffer = renderData.gfxBuffer; var bboxPen = renderData.BBoxPen; foreach (var entity in boundingCircles) { ref var bcircle = ref bcircles.Get(entity); Renderer.DrawBoundingCircle( bcircle.Center * mToP, bcircle.Radius * mToP, bboxPen, gfxBuffer, canvasHeight); }
public void Run(EcsSystems systems) { var mToP = renderData.MetersToPixels; var canvasHeight = renderData.CanvasHeight; var gfxBuffer = renderData.gfxBuffer; var massCenterBrush = renderData.MeshMassCenterBrush; var massCenterRadius = renderData.DebugClosestPointRadius; foreach (var entity in meshes) { ref var pose = ref poses.Get(entity); Renderer.DrawCircle( pose.Position * mToP, massCenterRadius * mToP, massCenterBrush, gfxBuffer, canvasHeight); }
public void Run(EcsSystems systems) { var mToP = renderData.MetersToPixels; var canvasHeight = renderData.CanvasHeight; var gfxBuffer = renderData.gfxBuffer; var velocityBrush = renderData.VelocityBrush; var pen = renderData.BBoxPen; foreach (var entity in circles) { var velocity = velocities.Get(entity).Linear *mToP / 4; var particleSpeed = 220 - Math.Min((int)velocity.Length(), 220); HsvToRgb(particleSpeed, 1, 1, out var r, out var g, out var b); velocityBrush.Color = Color.FromArgb(255, r, g, b); ref var pose = ref poses.Get(entity); ref var circleShape = ref circleShapes.Get(entity);
public void Run(EcsSystems systems) { var mToP = renderData.MetersToPixels; var canvasHeight = renderData.CanvasHeight; var gfxBuffer = renderData.gfxBuffer; var segmentPen = renderData.SegmentPen; var meshBrush = renderData.MeshBrush; foreach (var entity in meshes) { var triangles = meshShapes.Get(entity).Triangles; ref var pose = ref poses.Get(entity); for (var i = 0; i < triangles.Length; ++i) { ref var triangle = ref triangles[i]; Renderer.DrawTriangle( Pose.Transform(triangle.A, pose) * mToP, Pose.Transform(triangle.B, pose) * mToP, Pose.Transform(triangle.C, pose) * mToP, segmentPen, meshBrush, gfxBuffer, canvasHeight); }
public void Run(EcsSystems systems) { foreach (var entity in shapes) { ref var shape = ref shapesPool.Get(entity); ref var boundingBox = ref boundingBoxes.Get(entity);