示例#1
0
        /// <summary>
        /// Removes the native geometry from the simulation.
        /// </summary>
        protected override void OnDestroy()
        {
            if (m_geometry != null && GetSimulation() != null)
            {
                GetSimulation().remove(m_geometry);
            }

            if (Simulation.Instance != null)
            {
                Simulation.Instance.StepCallbacks.PostSynchronizeTransforms -= OnPostSynchronizeTransformsCallback;
            }

            if (m_shape != null)
            {
                m_shape.Dispose();
            }
            m_shape = null;

            if (m_geometry != null)
            {
                m_geometry.Dispose();
            }
            m_geometry = null;

            m_transform = null;

            base.OnDestroy();
        }
示例#2
0
文件: Mesh.cs 项目: Algoryx/AGXUnity
        /// <summary>
        /// Merges all source objects to one mesh and creates a native trimesh.
        /// </summary>
        /// <param name="meshes">Source meshes.</param>
        /// <returns>Native trimesh.</returns>
        private agxCollide.Geometry Create(UnityEngine.Mesh[] meshes)
        {
            var geometry = new agxCollide.Geometry();

            if (m_precomputedCollisionMeshes.Count > 0)
            {
                // The vertices are assumed to be stored in local coordinates of the
                // given transform. For the scale to be correct w
                var toWorld = transform.localToWorldMatrix;
                Func <Vector3, Vector3> transformer = v =>
                {
                    return(transform.InverseTransformDirection(toWorld * v.ToLeftHanded()));
                };

                var mode = Options != null ? Options.Mode : CollisionMeshOptions.MeshMode.Trimesh;
                for (int i = 0; i < m_precomputedCollisionMeshes.Count; ++i)
                {
                    var collisionMesh = m_precomputedCollisionMeshes[i];
                    if (collisionMesh == null)
                    {
                        Debug.LogWarning($"AGXUnity.Collide.Mesh: Null precomputed collision mesh at index {i}.", this);
                        continue;
                    }

                    var shape = collisionMesh.CreateShape(transformer, mode);
                    if (shape == null)
                    {
                        Debug.LogWarning($"AGXUnity.Collide.Mesh: Precomputed collision mesh at index {i} resulted in an invalid shape.", this);
                        continue;
                    }

                    geometry.add(shape, GetNativeGeometryOffset());
                }
            }
            else
            {
                if (m_precomputedCollisionMeshes.Count > 0)
                {
                    Debug.LogWarning("AGXUnity.Mesh: Failed to create shapes from precomputed data - using Trimesh as fallback.", this);
                }

                var merger = MeshMerger.Merge(transform, meshes);
                geometry.add(new agxCollide.Trimesh(merger.Vertices,
                                                    merger.Indices,
                                                    "AGXUnity.Mesh: Trimesh"),
                             GetNativeGeometryOffset());
            }

            if (geometry.getShapes().Count == 0)
            {
                geometry.Dispose();
                geometry = null;
            }

            return(geometry);
        }