@@ -31,8 +31,6 @@ public class DMeshSO : BaseSO, SpatialQueryableSO
31
31
// a background thread, to avoid making mesh copies. Functions that
32
32
// internally modify .mesh will lock this first.
33
33
34
- IViewMeshManager viewMeshes ;
35
-
36
34
bool enable_spatial = true ;
37
35
DMeshAABBTree3 spatial ;
38
36
@@ -49,16 +47,49 @@ public virtual DMeshSO Create(DMesh3 mesh, SOMaterial setMaterial)
49
47
50
48
this . mesh = mesh ;
51
49
52
- //viewMeshes = new LinearDecompViewMeshManager(this);
53
- viewMeshes = new TrivialViewMeshManager ( this ) ;
50
+
54
51
55
52
on_mesh_changed ( ) ;
56
- viewMeshes . ValidateViewMeshes ( ) ;
53
+ validate_view_meshes ( ) ;
57
54
58
55
return this ;
59
56
}
60
57
61
58
59
+ const int mesh_decomp_size_thresh = 500000 ;
60
+ IViewMeshManager view_meshes = null ;
61
+ IViewMeshManager ViewMeshes {
62
+ get {
63
+ if ( view_meshes == null ) {
64
+ if ( Mesh . TriangleCount > mesh_decomp_size_thresh )
65
+ view_meshes = new LinearDecompViewMeshManager ( this ) { MaxSubmeshSize = 128000 } ;
66
+ else
67
+ view_meshes = new TrivialViewMeshManager ( this ) ;
68
+ }
69
+ return view_meshes ;
70
+ }
71
+ }
72
+ void release_view_meshes ( )
73
+ {
74
+ if ( view_meshes != null ) {
75
+ view_meshes . InvalidateViewMeshes ( ) ;
76
+ view_meshes . Dispose ( ) ;
77
+ view_meshes = null ;
78
+ }
79
+ }
80
+ void validate_view_meshes ( )
81
+ {
82
+ // if view meshes are invalid, and mesh is too big, create piecewise decomp panager
83
+ if ( ( view_meshes != null )
84
+ && ( view_meshes is TrivialViewMeshManager )
85
+ && ( view_meshes . AreMeshesValid == false )
86
+ && ( Mesh . TriangleCount > mesh_decomp_size_thresh ) ) {
87
+ release_view_meshes ( ) ;
88
+ }
89
+ ViewMeshes . ValidateViewMeshes ( ) ;
90
+ }
91
+
92
+
62
93
63
94
// To reduce memory usage, when we disconnect a DMeshSO we can
64
95
// discard temporary data structures. Also, when we destroy it,
@@ -67,13 +98,13 @@ public virtual DMeshSO Create(DMesh3 mesh, SOMaterial setMaterial)
67
98
override public void Connect ( bool bRestore )
68
99
{
69
100
if ( bRestore ) {
70
- viewMeshes . ValidateViewMeshes ( ) ;
101
+ validate_view_meshes ( ) ;
71
102
}
72
103
}
73
104
override public void Disconnect ( bool bDestroying )
74
105
{
75
106
this . spatial = null ;
76
- viewMeshes . InvalidateViewMeshes ( ) ;
107
+ release_view_meshes ( ) ;
77
108
if ( bDestroying ) {
78
109
this . mesh = null ;
79
110
}
@@ -185,7 +216,7 @@ public void ReplaceMesh(DMesh3 newMesh, bool bTakeOwnership = true)
185
216
}
186
217
187
218
on_mesh_changed ( ) ;
188
- viewMeshes . ValidateViewMeshes ( ) ;
219
+ validate_view_meshes ( ) ;
189
220
post_mesh_modified ( ) ;
190
221
}
191
222
@@ -262,9 +293,9 @@ public void UpdateVertices(DMesh3 sourceMesh, bool bNormals = true, bool bColors
262
293
263
294
// fast update of view meshes for vertex deformations/changes
264
295
void fast_mesh_update ( bool bNormals , bool bColors ) {
265
- viewMeshes . FastUpdateVertices ( bNormals , bColors ) ;
296
+ ViewMeshes . FastUpdateVertices ( bNormals , bColors ) ;
266
297
on_mesh_changed ( true , false ) ;
267
- viewMeshes . ValidateViewMeshes ( ) ;
298
+ validate_view_meshes ( ) ;
268
299
}
269
300
270
301
@@ -300,7 +331,7 @@ public void notify_mesh_edited(GeometryEditTypes editType)
300
331
fast_mesh_update ( true , true ) ;
301
332
} else {
302
333
on_mesh_changed ( ) ;
303
- viewMeshes . ValidateViewMeshes ( ) ;
334
+ validate_view_meshes ( ) ;
304
335
}
305
336
post_mesh_modified ( ) ;
306
337
}
@@ -312,7 +343,7 @@ void on_mesh_changed(bool bInvalidateSpatial = true, bool bInvalidateDecomp = tr
312
343
313
344
// discard existing mesh GOs
314
345
if ( bInvalidateDecomp ) {
315
- viewMeshes . InvalidateViewMeshes ( ) ;
346
+ ViewMeshes . InvalidateViewMeshes ( ) ;
316
347
}
317
348
}
318
349
0 commit comments