/// <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(); }
/// <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); }