コード例 #1
0
ファイル: CollisionManager.cs プロジェクト: MHDante/OrbitVR
 public void AddCollider(Collider collider)
 {
     if (collider.shape is Circle)
     {
         CollisionSetCircle.Add(collider);
     }
     else if (collider.shape is Polygon)
     {
         CollisionSetPolygon.Add(collider);
     }
 }
コード例 #2
0
ファイル: CollisionManager.cs プロジェクト: MHDante/OrbitVR
 public void RemoveCollider(Collider collider)
 {
     if (CollisionSetCircle.Contains(collider))
     {
         CollisionSetCircle.Remove(collider);
     }
     if (CollisionSetPolygon.Contains(collider))
     {
         CollisionSetPolygon.Remove(collider);
     }
 }
コード例 #3
0
ファイル: CollisionManager.cs プロジェクト: MHDante/OrbitVR
        public void Update()
        {
            if (algorithm >= 5)
            {
                gridsystemCollision.clearBuckets();
                foreach (var c in CollisionSetCircle) //.ToList()
                {
                    //if (skipOutsideGrid && (c.pos.Y < gridsystemCollision.position.Y || c.pos.Y > gridsystemCollision.position.Y + gridsystemCollision.gridHeight)) continue;

                    //if (ColorNodesInReach) c.parent.body.color = Color.White;
                    if (!c.parent.active)
                    {
                        continue;
                    }
                    gridsystemCollision.insertToBuckets(c);
                }
            }
            gridsystemCollision.alreadyVisited = new HashSet <Collider>();

            foreach (var c in CollisionSetPolygon.ToList())
            {
                if (c.parent.active)
                {
                    gridsystemCollision.alreadyVisited.Add(c);
                    int reach = (int)c.radius * 2;
                    if (c.shape is Circle) //todo fix the fact that circles are in the polygons list
                    {
                        reach = (int)(c.shape as Polygon).polyReach;
                    }
                    foreach (var otherCol in CollisionSetPolygon.ToList())
                    {
                        collideAction(c, otherCol);
                    }
                    foreach (var otherCol in CollisionSetCircle.ToList())
                    {
                        collideAction(c, otherCol);
                    }
                }
            }

            foreach (var c in CollisionSetCircle.ToList()) //.ToList()
            {
                //if (skipOutsideGrid && (c.pos.Y < gridsystemCollision.position.Y || c.pos.Y > gridsystemCollision.position.Y + gridsystemCollision.gridHeight)) continue;
                if (c.parent.active)
                {
                    gridsystemCollision.alreadyVisited.Add(c);
                    int reach = (int)c.radius * 2;
                    if (c.shape is Polygon)
                    {
                        reach = (int)(c.shape as Polygon).polyReach; //shouldnt have a polygon in the circle list
                        foreach (var otherCol in CollisionSetCircle.ToList())
                        {
                            collideAction(c, otherCol);
                        }
                    }
                    else if (algorithm == 7)
                    {
                        gridsystemCollision.retrieveOffsetArraysCollision(c, collideAction, c.radius * 2);
                    }
                    //else if (algorithm == 6)
                    //{
                    //    gridsystemCollision.retrieveFromAllOffsets(c, reach, collideAction);
                    //}
                }
            }
            //Testing.PrintTimer("insertion");
            //Testing.PrintTimer("retrieve");
            //Testing.PrintTimer("manifolds");
            //COLLISION
            foreach (Manifold m in contacts)
            {
                m.Initialize();
            }
            // \COLLISION
            //update velocity
            for (int ii = 0; ii < colIterations; ii++)
            {
                foreach (Manifold m in contacts)
                {
                    m.ApplyImpulse();
                    //m.a.parent.SetColor(Color.Green);
                    //m.b.parent.SetColor(Color.Yellow);
                }
            }
            foreach (Node n in room.MasterGroup.fullSet.ToList())
            {
                if (DebugFlags.skipOutsideGrid &&
                    n.body.pos.isWithin(gridsystemCollision.position,
                                        gridsystemCollision.position +
                                        new Vector2R(gridsystemCollision.gridWidth, gridsystemCollision.gridHeight)))
                {
                    continue;
                }
                n.movement.IntegrateVelocity();
                VMath.Set(ref n.body.force, 0, 0);
                n.body.torque = 0;
            }
            foreach (Manifold m in contacts)
            {
                m.PositionalCorrection();
            }

            if (contacts.Count > 0)
            {
                contacts = new List <Manifold>();
            }
            if (DebugFlags.drawCollisionGrid)
            {
                gridsystemCollision.addGridSystemLines();
            }
        }