示例#1
0
            protected new void Start()
            {
                base.Start();

                var args = new CollisionEvents.DynamicColliderCreationEventArgs(this);

                CollisionEvents.FireEvent(CollisionEvents.EventType.DynamicColliderCreation, gameObject, args);
            }
示例#2
0
            protected new void Start()
            {
                base.Start();

                mShape = new CylinderShape(radius, halfHeight);

                var args = new CollisionEvents.DynamicColliderCreationEventArgs(this);

                CollisionEvents.FireEvent(CollisionEvents.EventType.DynamicColliderCreation, gameObject, args);
            }
示例#3
0
            /// <summary>
            /// Initialise the data needed for collision detection of <c>CSACollider</c>s.
            /// </summary>
            /// <remarks>
            /// This function calculates the bounding sphere, and reads the slices from a json file,
            /// then fire the <c>DynamicColliderCreation</c> event.
            /// </remarks>
            new void Start()
            {
                base.Start();

                if (slicesJsonFile != null)
                {
                    InitSlicesFromJson(slicesJsonFile.ToString());
                }

                CollisionEvents.DynamicColliderCreationEventArgs args = new CollisionEvents.DynamicColliderCreationEventArgs(this);
                CollisionEvents.FireEvent(CollisionEvents.EventType.DynamicColliderCreation, gameObject, args);
            }
            protected new void Start()
            {
                base.Start();

                mTriangles = new List <Triangle>();
                for (int i = 0; i < mMesh.triangles.Length; i += 3)
                {
                    mTriangles.Add(new Triangle(
                                       mMesh.vertices[mMesh.triangles[i]],
                                       mMesh.vertices[mMesh.triangles[i + 1]],
                                       mMesh.vertices[mMesh.triangles[i + 2]]
                                       ));
                }

                CollisionEvents.DynamicColliderCreationEventArgs args = new CollisionEvents.DynamicColliderCreationEventArgs(this);
                CollisionEvents.FireEvent(CollisionEvents.EventType.DynamicColliderCreation, gameObject, args);
            }
            /// <summary>
            /// Initialise the data needed for colliding with height maps and fires the
            /// <c>HeightMapTerrainColliderCreation</c> event.
            /// </summary>
            void Start()
            {
                heightMapTerrain = GetComponent <HeightMapTerrain>();
                Width            = heightMapTerrain.sourceRect.width;
                Height           = heightMapTerrain.sourceRect.height;
                CellSize         = heightMapTerrain.cellSize;
                TriMesh          = GetComponent <MeshFilter>().sharedMesh;

                TriGrid = new TriangleGrid(
                    TriMesh.vertices,
                    TriMesh.triangles,
                    Width - 1,
                    Height - 1,
                    CellSize,
                    transform.localScale,
                    transform.position
                    );

                var args = new CollisionEvents.HeightMapColliderCreationEventArgs(this);

                CollisionEvents.FireEvent(CollisionEvents.EventType.HeightMapTerrainColliderCreation, gameObject, args);
            }
示例#6
0
            /// <summary>
            /// Iterates throught the list of <c>HeightMap</c> and <c>CSACollider</c>
            /// to find the intersected points.
            /// </summary>
            /// <remarks>
            /// This function performs the Sphere-Triangle, Plane-Triangle, Curve-Triangle
            /// intersection tests. After found any contact points it sends toward the
            /// <c>PhysicsManager</c>.
            /// </remarks>
            void FixedUpdate()
            {
                debugSegments.Clear();
                debugPoints.Clear();
                debugVectors.Clear();
                segmentColor.Clear();
                foreach (HeightMapCollider hMapCollider in heightMapColliders)
                {
                    if (!hMapCollider.enabled)
                    {
                        continue;
                    }

                    colors = new Color[hMapCollider.TriMesh.vertexCount];
                    Color origCol = new Color(200f / 255f, 200f / 255f, 200f / 255f);
                    for (int i = 0; i < colors.Length; i++)
                    {
                        colors[i] = origCol;
                    }


                    foreach (DynamicCollider dynCollider in dynamicColliderList)
                    {
                        if (!dynCollider.enabled)
                        {
                            continue;
                        }

                        // creating a list of contacts for the physics manager
                        List <Contact> contacts       = new List <Contact>();
                        List <Segment> coarseContacts = new List <Segment>();

                        // position of bounding sphere in world coordinates
                        Vector3 spherePos = dynCollider.BoundingSphere.CenterW;
                        float   radius    = dynCollider.BoundingSphere.Radius;

                        // filtering the triangle grid with the sphere projection
                        hMapCollider.TriGrid.FilterBySphereProjection(spherePos, radius);

                        if (dynCollider is CSACollider)
                        {
                            HandleCSAVsHeightMapCollision(
                                dynCollider as CSACollider,
                                hMapCollider,
                                contacts,
                                coarseContacts);
                        }
                        else if (dynCollider is BruteForceCollider)
                        {
                            HandleBruteForceVsHeightMapCollision(
                                dynCollider as BruteForceCollider,
                                hMapCollider,
                                contacts,
                                coarseContacts);
                        }
                        else if (dynCollider is VertexCollider)
                        {
                            HandleVertexVsHeightMapCollision(
                                dynCollider as VertexCollider,
                                hMapCollider,
                                contacts,
                                coarseContacts);
                        }
                        else if (dynCollider is SAGJKCollider)
                        {
                            HandleSAGJKVsHeightMapCollision(
                                dynCollider as SAGJKCollider,
                                hMapCollider,
                                contacts,
                                coarseContacts);
                        }
                        else if (dynCollider is GJKCollider)
                        {
                            HandleGJKVsHeightMapCollision(
                                dynCollider as GJKCollider,
                                hMapCollider,
                                contacts,
                                coarseContacts);
                        }
                        else if (dynCollider is XenoCollider)
                        {
                            HandleXenoVsHeighMapCollision(
                                dynCollider as XenoCollider,
                                hMapCollider,
                                contacts,
                                coarseContacts);
                        }
                        else if (dynCollider is ConvDecompCollider)
                        {
                            HandleConvDecompVsHeighMapCollision(
                                dynCollider as ConvDecompCollider,
                                hMapCollider,
                                contacts,
                                coarseContacts);
                        }

                        // reset the filtering of the triangle grid
                        hMapCollider.TriGrid.Reset();


                        if (coarseContacts.Count > 0 && dynCollider.GetComponent <Rigidbody>() != null)
                        {
                            var args = new CollisionEvents.CoarseCollisionEventArgs(
                                dynCollider.GetComponent <RigidBody>(),
                                coarseContacts
                                );

                            CollisionEvents.FireEvent(CollisionEvents.EventType.CoarseCollision, this, args);
                        }

                        // if any contacts got caught, we send them to the physics manager by the collision event
                        if (contacts.Count > 0 && dynCollider.GetComponent <RigidBody>() != null)
                        {
                            var args = new CollisionEvents.CollisionEventArgs(
                                dynCollider.GetComponent <RigidBody>(),
                                contacts
                                );

                            CollisionEvents.FireEvent(CollisionEvents.EventType.Collision, this, args);
                        }
                    }

                    if (debugColors)
                    {
                        hMapCollider.TriMesh.colors = colors;
                    }
                }
            }