@@ -39,6 +39,7 @@ private GraphicsBuffer
3939 private int m_nStepsJFA ;
4040 private Kernels m_Kernels ;
4141 private Mesh m_Mesh ;
42+ private bool m_OwnsMesh ;
4243 private RenderTexture m_textureVoxel , m_textureVoxelBis , m_DistanceTexture ;
4344 private GraphicsBuffer m_bufferVoxel ;
4445 private ComputeShader m_computeShader ;
@@ -173,6 +174,28 @@ public Vector3 GetActualBoxSize()
173174 return m_SizeBox ;
174175 }
175176
177+ private MeshToSDFBaker ( Vector3 sizeBox ,
178+ Vector3 center ,
179+ int maxRes ,
180+ Mesh mesh ,
181+ bool ownsMesh ,
182+ int signPassesCount ,
183+ float threshold ,
184+ float sdfOffset ,
185+ CommandBuffer cmd )
186+ {
187+ LoadRuntimeResources ( ) ;
188+ m_Mesh = mesh ;
189+ m_OwnsMesh = ownsMesh ;
190+ if ( cmd != null )
191+ {
192+ m_Cmd = cmd ;
193+ m_OwnsCommandBuffer = false ;
194+ }
195+ SetParameters ( sizeBox , center , maxRes , signPassesCount , threshold , sdfOffset ) ;
196+ Init ( ) ;
197+ }
198+
176199 /// <summary>
177200 /// Constructor of the class MeshToSDFBaker.
178201 /// </summary>
@@ -191,17 +214,9 @@ public MeshToSDFBaker(Vector3 sizeBox,
191214 int signPassesCount = 1 ,
192215 float threshold = 0.5f ,
193216 float sdfOffset = 0.0f ,
194- CommandBuffer cmd = null )
217+ CommandBuffer cmd = null ) :
218+ this ( sizeBox , center , maxRes , mesh , false , signPassesCount , threshold , sdfOffset , cmd )
195219 {
196- LoadRuntimeResources ( ) ;
197- m_Mesh = mesh ;
198- if ( cmd != null )
199- {
200- m_Cmd = cmd ;
201- m_OwnsCommandBuffer = false ;
202- }
203- SetParameters ( sizeBox , center , maxRes , signPassesCount , threshold , sdfOffset ) ;
204- Init ( ) ;
205220 }
206221
207222 /// <summary>
@@ -225,8 +240,10 @@ public MeshToSDFBaker(Vector3 sizeBox,
225240 float threshold = 0.5f ,
226241 float sdfOffset = 0.0f ,
227242 CommandBuffer cmd = null ) :
228- this ( sizeBox , center , maxRes , InitMeshFromList ( meshes , transforms ) , signPassesCount , threshold , sdfOffset , cmd )
243+ this ( sizeBox , center , maxRes , InitMeshFromList ( meshes , transforms ) , true , signPassesCount , threshold , sdfOffset , cmd )
229244 {
245+ if ( ! m_OwnsMesh )
246+ throw new InvalidOperationException ( "InitMeshFromList expects owns mesh flag to prevent leak" ) ;
230247 }
231248
232249 /// <summary>
@@ -240,6 +257,23 @@ public MeshToSDFBaker(Vector3 sizeBox,
240257 }
241258 }
242259
260+ private void Reinit ( Vector3 sizeBox ,
261+ Vector3 center ,
262+ int maxRes ,
263+ Mesh mesh ,
264+ bool ownsMesh ,
265+ int signPassesCount = 1 ,
266+ float threshold = 0.5f ,
267+ float sdfOffset = 0.0f )
268+ {
269+ ReleaseMeshIfOwned ( ) ;
270+ m_Mesh = mesh ;
271+ m_OwnsMesh = ownsMesh ;
272+
273+ SetParameters ( sizeBox , center , maxRes , signPassesCount , threshold , sdfOffset ) ;
274+ Init ( ) ;
275+ }
276+
243277 /// <summary>
244278 /// Reinitialize the baker with the new mesh and provided parameters.
245279 /// </summary>
@@ -258,9 +292,7 @@ public void Reinit(Vector3 sizeBox,
258292 float threshold = 0.5f ,
259293 float sdfOffset = 0.0f )
260294 {
261- m_Mesh = mesh ;
262- SetParameters ( sizeBox , center , maxRes , signPassesCount , threshold , sdfOffset ) ;
263- Init ( ) ;
295+ Reinit ( sizeBox , center , maxRes , mesh , false , signPassesCount , threshold , sdfOffset ) ;
264296 }
265297
266298 /// <summary>
@@ -283,7 +315,9 @@ public void Reinit(Vector3 sizeBox,
283315 float threshold = 0.5f ,
284316 float sdfOffset = 0.0f )
285317 {
286- Reinit ( sizeBox , center , maxRes , InitMeshFromList ( meshes , transforms ) , signPassesCount , threshold , sdfOffset ) ;
318+ Reinit ( sizeBox , center , maxRes , InitMeshFromList ( meshes , transforms ) , true , signPassesCount , threshold , sdfOffset ) ;
319+ if ( ! m_OwnsMesh )
320+ throw new InvalidOperationException ( "InitMeshFromList expects owns mesh flag to prevent leak" ) ;
287321 }
288322
289323 private void SetParameters ( Vector3 sizeBox , Vector3 center , int maxRes , int signPassesCount , float threshold , float sdfOffset )
@@ -773,7 +807,6 @@ public void BakeSDF()
773807
774808 private void InitMeshBuffers ( )
775809 {
776-
777810 if ( m_Mesh . GetVertexAttributeFormat ( VertexAttribute . Position ) != VertexAttributeFormat . Float32 )
778811 {
779812 throw new ArgumentException (
@@ -958,9 +991,22 @@ private void PerformDistanceTransformWinding()
958991 m_Cmd . EndSample ( "BakeSDF.DistanceTransform" ) ;
959992 }
960993
994+ private void ReleaseMeshIfOwned ( )
995+ {
996+ if ( m_Mesh && m_OwnsMesh )
997+ {
998+ if ( Application . isPlaying )
999+ Object . Destroy ( m_Mesh ) ;
1000+ else
1001+ Object . DestroyImmediate ( m_Mesh ) ;
1002+ m_Mesh = null ;
1003+ m_OwnsMesh = false ;
1004+ }
1005+ }
1006+
9611007 private void ReleaseBuffersAndTextures ( )
9621008 {
963- //Release textures.
1009+ //Release textures.
9641010 ReleaseRenderTexture ( ref m_textureVoxel ) ;
9651011 ReleaseRenderTexture ( ref m_textureVoxelBis ) ;
9661012 ReleaseRenderTexture ( ref m_DistanceTexture ) ;
@@ -979,7 +1025,7 @@ private void ReleaseBuffersAndTextures()
9791025 ReleaseRenderTexture ( ref m_RayMaps [ i ] ) ;
9801026 }
9811027
982- //Release buffers.
1028+ //Release buffers.
9831029 ReleaseGraphicsBuffer ( ref m_bufferVoxel ) ;
9841030 ReleaseGraphicsBuffer ( ref m_TrianglesUV ) ;
9851031 ReleaseGraphicsBuffer ( ref m_TrianglesInVoxels ) ;
@@ -1002,6 +1048,7 @@ private void ReleaseBuffersAndTextures()
10021048 /// </summary>
10031049 public void Dispose ( )
10041050 {
1051+ ReleaseMeshIfOwned ( ) ;
10051052 ReleaseBuffersAndTextures ( ) ;
10061053 GC . SuppressFinalize ( this ) ;
10071054 m_IsDisposed = true ;
0 commit comments