Esempio n. 1
0
        /// <summary>
        /// 响应鼠标的操作
        /// </summary>
        public void Fire()
        {
            if (Start)
            {
                PhysicsWorld.RemoveObject(_elasticatedNet);
                DrawQueue.Remove(_elasticatedNet);
            }

            // 创建弹性网并加入到物理世界和绘制队列
            _elasticatedNet = new ElasticatedNet(
                new Vector2D(40, 120).ToSimUnits(),
                Width, Height, GridSize, Factor
                );
            DrawQueue.Add(_elasticatedNet);
            PhysicsWorld.AddObject(_elasticatedNet);

            // 拉扯弹性网
            var net = _elasticatedNet.Net;

            for (int i = 0; i < Width; i++)
            {
                net[i, Height - 1].Velocity    = new Vector2D(0, 0.1) * 4 * (i >= Width / 2 ? -1 : 1);
                net[i, Height - 1].InverseMass = 0;
            }

            Start = true;
        }
Esempio n. 2
0
        public ContactDemo(Image image)
            : base(image)
        {
            Settings.ContactIteration = 1;

            const int num = 5;

            for (int i = 0; i < num; i++)
            {
                var fB = PhysicsWorld.CreateFixedParticle((new Vector2D(160 + 40 * i, 0)).ToSimUnits());
                var pB = PhysicsWorld.CreateParticle((new Vector2D(160 + 40 * i, 200)).ToSimUnits(), new Vector2D(0, 0), 2);

                var ball = new Ball
                {
                    FixedParticle = fB,
                    Particle      = pB,
                    R             = 20
                };

                // 为质体绑定形状
                ball.Particle.BindShape(new Circle(ball.R.ToSimUnits()));

                PhysicsWorld.CreateRope(200.ToSimUnits(), 0, fB, pB);
                DrawQueue.Add(ball);
                _ballList.Add(ball);
            }

            // 增加重力和空气阻力
            PhysicsWorld.CreateGlobalZone(new ParticleGravity(new Vector2D(0, 40)));
            PhysicsWorld.CreateParticle(Vector2D.Zero, new Vector2D(1, 0), 1);
            Slot = 1 / 120.0;

            Start = true;
        }
Esempio n. 3
0
 public FluidDemo(Image image)
     : base(image)
 {
     // 创建液体容器
     _water = new Water((int)image.Width, (int)image.Height);
     // 添加到绘制队列
     DrawQueue.Add(_water);
 }
Esempio n. 4
0
        public void DrawQueueTest_CheckBasicAdd_NumberAndContentOfRequestsOK()
        {
            var messenger = Substitute.For <IFrameworkMessenger>();
            IComparerCollection comparers = new ComparerCollection();

            IDrawQueue queue = new DrawQueue(messenger, comparers, 32, 4, false);

            for (var n = 0; n < 10; n++)
            {
                var even   = n % 2 == 0;
                var target = even ? CoordinateSpace.Screen : CoordinateSpace.World;
                var fill   = even ? FillType.Coloured : FillType.Textured;
                if (n == 1)
                {
                    fill = FillType.DualTextured;
                }
                var val    = 0.1f * n;
                var colour = new Colour(val, val, val, val);
                var verts  = new Vertex2D[] { new Vertex2D {
                                                  Colour = Colour.White, Position = Vector2.Zero, TexCoord0 = Vector2.Zero, TexCoord1 = Vector2.One, TexWeighting = 0.9f
                                              } };
                var indices  = new int[] { 0, 1, 0 };
                var texture0 = (ulong)n;
                var texture1 = (ulong)n;
                var texMode0 = TextureCoordinateMode.Mirror;
                var texMode1 = TextureCoordinateMode.Wrap;
                var depth    = 0.05f * n;
                var layer    = n;

                queue.Add(
                    ref target,
                    ref fill,
                    ref colour,
                    ref verts,
                    ref indices,
                    ref texture0,
                    ref texture1,
                    ref texMode0,
                    ref texMode1,
                    ref depth,
                    ref layer);
            }

            Assert.Equal(10, queue.Data.NumRequests);

            var data = queue.Data;

            //Test values in single request
            Assert.Equal(CoordinateSpace.World, data.Targets[5]);
            Assert.Equal(FillType.Textured, data.Types[5]);
            Assert.Equal(0.5f, data.BaseColours[5].R, 5);
            Assert.Equal(0.9f, data.Vertices[data.FirstVertexPosition[5]].TexWeighting, 5);
            Assert.Equal(1, data.Indices[data.FirstIndexPosition[5] + 1]);
            Assert.Equal((ulong)5, data.Texture1[5]);
            Assert.Equal(0.25f, data.Depths[5], 5);
            Assert.Equal(5, data.Layers[5]);
        }
Esempio n. 5
0
        public void DrawQueueTest_CheckBasicClear_ConfirmZeroPostClear()
        {
            var messenger = Substitute.For <IFrameworkMessenger>();
            IComparerCollection comparers = new ComparerCollection();

            IDrawQueue queue = new DrawQueue(messenger, comparers, 32, 4, false);

            for (var n = 0; n < 10; n++)
            {
                var even   = n % 2 == 0;
                var target = even ? CoordinateSpace.Screen : CoordinateSpace.World;
                var fill   = even ? FillType.Coloured : FillType.Textured;
                if (n == 1)
                {
                    fill = FillType.DualTextured;
                }
                var val    = 0.1f * n;
                var colour = new Colour(val, val, val, val);
                var verts  = new Vertex2D[] { new Vertex2D {
                                                  Colour = Colour.White, Position = Vector2.Zero, TexCoord0 = Vector2.Zero, TexCoord1 = Vector2.One, TexWeighting = 0.9f
                                              } };
                var indices  = new int[] { 0, 1, 0 };
                var texture0 = (ulong)n;
                var texture1 = (ulong)n;
                var texMode0 = TextureCoordinateMode.Mirror;
                var texMode1 = TextureCoordinateMode.Wrap;
                var depth    = 0.05f * n;
                var layer    = n;

                queue.Add(
                    ref target,
                    ref fill,
                    ref colour,
                    ref verts,
                    ref indices,
                    ref texture0,
                    ref texture1,
                    ref texMode0,
                    ref texMode1,
                    ref depth,
                    ref layer);
            }

            Assert.Equal(10, queue.Data.NumRequests);

            queue.Clear();

            Assert.Equal(0, queue.Data.NumRequests);
        }
Esempio n. 6
0
 public CircleDemo(Image image)
     : base(image)
 {
     // 初始化中心点
     _centerObj = PhysicsWorld.CreateFixedParticle
                  (
         new Vector2D
         (
             250.ToSimUnits(),
             200.ToSimUnits()
         )
                  );
     // 注册绘制对象
     DrawQueue.Add(this);
 }
Esempio n. 7
0
        public FireworksDemo(Image image)
            : base(image)
        {
            DrawQueue.Add(this);

            _dragZone = new RectangleZone
                        (
                0.ToSimUnits(),
                (WorldHeight * 2 / 3.0).ToSimUnits(),
                500.ToSimUnits(),
                400.ToSimUnits()
                        );
            _dragZone.Add(_drag);

            _windZone = new RectangleZone
                        (
                0.ToSimUnits(),
                (WorldHeight * 1 / 3.0).ToSimUnits(),
                500.ToSimUnits(),
                (WorldHeight * 2 / 3.0).ToSimUnits()
                        );
            _windZone.Add(_wind);
        }
Esempio n. 8
0
        public RobDemo(Image image)
            : base(image)
        {
            Settings.ContactIteration = 20;

            _combinedParticle = new CombinedParticle(_vertexs, 3, 1, true);
            PhysicsWorld.AddObject(_combinedParticle);

            // 为顶点绑定形状
            foreach (var vertex in _combinedParticle.Vertexs)
            {
                vertex.BindShape(new Circle(4.ToSimUnits()));
            }

            // 增加边缘
            PhysicsWorld.CreatePolygonEdge(_edgePoints.ToArray());

            // 增加重力
            PhysicsWorld.CreateGravity(9.8);

            DrawQueue.Add(this);
            Start = true;
        }