示例#1
0
        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);
                }
            }
        }
示例#2
0
        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);
示例#3
0
 public void Run(EcsSystems systems)
 {
     foreach (var evt in contacts)
     {
         SolveContact(contactsPool.Get(evt));
         contactsPool.Del(evt);
     }
 }
示例#4
0
 public void Run(EcsSystems systems)
 {
     foreach (var evt in possibleContacts)
     {
         TestPair(possibleContactsPool.Get(evt));
         possibleContactsPool.Del(evt);
     }
 }
示例#5
0
 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);
示例#6
0
        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);
            }
示例#7
0
        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);
                        }
                    }
                }
示例#8
0
        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;
            }
示例#9
0
        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);
            }
示例#10
0
        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);
            }
示例#11
0
        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);
            }
示例#12
0
        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);
            }
示例#13
0
        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);
            }
示例#14
0
        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);
示例#15
0
        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);
                }
示例#16
0
 public void Run(EcsSystems systems)
 {
     foreach (var entity in shapes)
     {
         ref var shape       = ref shapesPool.Get(entity);
         ref var boundingBox = ref boundingBoxes.Get(entity);