5 using System.Collections.Generic;
6 using System.Collections.ObjectModel;
35 public ReadOnlyCollection<SurfaceObject> SurfaceObjects
37 get {
return surfaceObjects; }
40 public event EventHandler<DataEventArgs<SurfaceObject>>
SurfaceAdded;
49 protected readonly Type[] componentsRequiredForSurfaceMesh =
61 private readonly List<SurfaceObject> surfaceObjectsWriteable;
62 private readonly ReadOnlyCollection<SurfaceObject> surfaceObjects;
66 surfaceObjectsWriteable =
new List<SurfaceObject>();
67 surfaceObjects =
new ReadOnlyCollection<SurfaceObject>(surfaceObjectsWriteable);
88 Transform parentObject,
90 bool? drawVisualMeshesOverride = null,
91 bool? castShadowsOverride = null
95 surfaceObject.
ID = meshID;
97 surfaceObject.
Object =
new GameObject(objectName, componentsRequiredForSurfaceMesh);
98 surfaceObject.
Object.transform.SetParent(parentObject);
101 surfaceObject.
Filter = surfaceObject.
Object.GetComponent<MeshFilter>();
102 surfaceObject.
Filter.sharedMesh = mesh;
104 surfaceObject.
Renderer = surfaceObject.
Object.GetComponent<MeshRenderer>();
105 surfaceObject.
Renderer.sharedMaterial = RenderMaterial;
109 surfaceObject.
Collider = surfaceObject.
Object.GetComponent<MeshCollider>();
115 surfaceObject.
Collider.sharedMesh = null;
116 surfaceObject.
Collider.sharedMesh = surfaceObject.
Filter.sharedMesh;
118 return surfaceObject;
127 surfaceObjectsWriteable.Add(toAdd);
129 var handlers = SurfaceAdded;
130 if (handlers != null)
147 for (
int iSurface = 0; iSurface < surfaceObjectsWriteable.Count; iSurface++)
151 if (existing.
ID == toUpdateOrAdd.
ID)
153 surfaceObjectsWriteable[iSurface] = toUpdateOrAdd;
155 var handlers = SurfaceUpdated;
156 if (handlers != null)
163 destroyGameObjectIfReplaced,
164 destroyMeshesIfReplaced,
165 objectToPreserve: toUpdateOrAdd.
Object,
166 meshToPreserveA: toUpdateOrAdd.
Filter.sharedMesh,
167 meshToPreserveB: toUpdateOrAdd.
Collider.sharedMesh
175 if (replaced == null)
177 AddSurfaceObject(toUpdateOrAdd);
194 for (
int iSurface = 0; iSurface < surfaceObjectsWriteable.Count; iSurface++)
198 if (surface.
ID == surfaceID)
200 surfaceObjectsWriteable.RemoveAt(iSurface);
202 var handlers = SurfaceRemoved;
203 if (handlers != null)
208 CleanUpSurface(surface, destroyGameObject, destroyMeshes);
229 bool destroyGameObject =
true,
230 bool destroyMeshes =
true,
231 GameObject objectToPreserve = null,
232 Mesh meshToPreserveA = null,
233 Mesh meshToPreserveB = null
236 if (destroyGameObject
237 && (surface.
Object != null)
238 && (surface.
Object != objectToPreserve)
242 Debug.Assert(surface.GetType().IsValueType(),
"If surface is no longer a value type, you should probably set surface.Object to null.");
245 Mesh filterMesh = surface.
Filter.sharedMesh;
246 Mesh colliderMesh = surface.
Collider.sharedMesh;
249 && (filterMesh != null)
250 && (filterMesh != meshToPreserveA)
251 && (filterMesh != meshToPreserveB)
255 surface.
Filter.sharedMesh = null;
259 && (colliderMesh != null)
260 && (colliderMesh != filterMesh)
261 && (colliderMesh != meshToPreserveA)
262 && (colliderMesh != meshToPreserveB)
265 Destroy(colliderMesh);
275 protected void Cleanup(
bool destroyGameObjects =
true,
bool destroyMeshes =
true)
277 var handlers = RemovingAllSurfaces;
278 if (handlers != null)
280 handlers(
this, EventArgs.Empty);
283 for (
int index = 0; index < surfaceObjectsWriteable.Count; index++)
285 CleanUpSurface(surfaceObjectsWriteable[index], destroyGameObjects, destroyMeshes);
287 surfaceObjectsWriteable.Clear();
296 List<MeshFilter> meshFilters =
new List<MeshFilter>();
298 for (
int index = 0; index < surfaceObjectsWriteable.Count; index++)
300 if (surfaceObjectsWriteable[index].Filter != null &&
301 surfaceObjectsWriteable[index].Filter.sharedMesh != null &&
302 surfaceObjectsWriteable[index].Filter.sharedMesh.vertexCount > 2)
304 meshFilters.Add(surfaceObjectsWriteable[index].Filter);
317 List<MeshRenderer> meshRenderers =
new List<MeshRenderer>();
319 for (
int index = 0; index < surfaceObjectsWriteable.Count; index++)
321 if (surfaceObjectsWriteable[index].Renderer != null)
323 meshRenderers.Add(surfaceObjectsWriteable[index].Renderer);
327 return meshRenderers;