@@ -118,7 +118,7 @@ private void UpdateRenderModel(ModelComponent modelComponent, RenderModel render
118118 }
119119 }
120120
121- private void UpdateMaterial ( RenderMesh renderMesh , MaterialPass materialPass , MaterialInstance modelMaterialInstance , ModelComponent modelComponent )
121+ private void UpdateMaterial ( RenderMesh renderMesh , MaterialPass materialPass , MaterialInstance modelMaterialInstance , ModelComponent modelComponent , Mesh sourceMesh )
122122 {
123123 var isShadowCaster = modelComponent . IsShadowCaster ;
124124 if ( modelMaterialInstance != null )
@@ -132,6 +132,8 @@ private void UpdateMaterial(RenderMesh renderMesh, MaterialPass materialPass, Ma
132132 }
133133
134134 renderMesh . MaterialPass = materialPass ;
135+ // Account for any changes made to the individual meshes
136+ renderMesh . Mesh = sourceMesh ;
135137 }
136138
137139 private Material FindMaterial ( Material materialOverride , MaterialInstance modelMaterialInstance )
@@ -141,46 +143,46 @@ private Material FindMaterial(Material materialOverride, MaterialInstance modelM
141143
142144 private void CheckMeshes ( ModelComponent modelComponent , RenderModel renderModel )
143145 {
144- // Check if model changed
146+ // Check if model changed to update our cached data
145147 var model = modelComponent . Model ;
146- if ( renderModel . Model == model )
147- {
148- // Check if any material pass count changed
149- if ( model != null )
150- {
151- // Number of meshes changed in the model?
152- if ( model . Meshes . Count != renderModel . UniqueMeshCount )
153- goto RegenerateMeshes ;
148+ if ( renderModel . Model != model )
149+ goto RegenerateMeshes ;
154150
155- if ( modelComponent . Enabled )
156- {
157- // Check materials
158- var modelComponentMaterials = modelComponent . Materials ;
159- for ( int sourceMeshIndex = 0 ; sourceMeshIndex < model . Meshes . Count ; sourceMeshIndex ++ )
160- {
161- ref var material = ref renderModel . Materials [ sourceMeshIndex ] ;
162- var materialIndex = model . Meshes [ sourceMeshIndex ] . MaterialIndex ;
163-
164- var newMaterial = FindMaterial ( modelComponentMaterials . SafeGet ( materialIndex ) , model . Materials . GetItemOrNull ( materialIndex ) ) ;
165-
166- // If material changed or its number of pass changed, trigger a full regeneration of RenderMeshes (note: we could do partial later)
167- if ( ( newMaterial ? . Passes . Count ?? 1 ) != material . MeshCount )
168- goto RegenerateMeshes ;
169-
170- // Update materials
171- material . Material = newMaterial ;
172- int meshIndex = material . MeshStartIndex ;
173- for ( int pass = 0 ; pass < material . MeshCount ; ++ pass , ++ meshIndex )
174- {
175- UpdateMaterial ( renderModel . Meshes [ meshIndex ] , newMaterial ? . Passes [ pass ] , model . Materials . GetItemOrNull ( materialIndex ) , modelComponent ) ;
176- }
177- }
178- }
179- }
151+ if ( model == null )
152+ return ;
153+
154+ // Number of meshes changed in the model?
155+ if ( model . Meshes . Count != renderModel . UniqueMeshCount )
156+ goto RegenerateMeshes ;
180157
158+ if ( ! modelComponent . Enabled )
181159 return ;
160+
161+ // Check materials
162+ var modelComponentMaterials = modelComponent . Materials ;
163+ for ( int sourceMeshIndex = 0 ; sourceMeshIndex < model . Meshes . Count ; sourceMeshIndex ++ )
164+ {
165+ ref var material = ref renderModel . Materials [ sourceMeshIndex ] ;
166+ var materialIndex = model . Meshes [ sourceMeshIndex ] . MaterialIndex ;
167+
168+ var baseMaterial = model . Materials . GetItemOrNull ( materialIndex ) ;
169+ var newMaterial = FindMaterial ( modelComponentMaterials . SafeGet ( materialIndex ) , baseMaterial ) ;
170+
171+ // If material changed or its number of pass changed, trigger a full regeneration of RenderMeshes (note: we could do partial later)
172+ if ( ( newMaterial ? . Passes . Count ?? 1 ) != material . MeshCount )
173+ goto RegenerateMeshes ;
174+
175+ // Update materials
176+ material . Material = newMaterial ;
177+ int meshIndex = material . MeshStartIndex ;
178+ for ( int pass = 0 ; pass < material . MeshCount ; ++ pass , ++ meshIndex )
179+ {
180+ UpdateMaterial ( renderModel . Meshes [ meshIndex ] , newMaterial ? . Passes [ pass ] , baseMaterial , modelComponent , model . Meshes [ sourceMeshIndex ] ) ;
181+ }
182182 }
183183
184+ return ;
185+
184186 RegenerateMeshes :
185187 renderModel . Model = model ;
186188
@@ -228,11 +230,10 @@ private void CheckMeshes(ModelComponent modelComponent, RenderModel renderModel)
228230 {
229231 Source = modelComponent ,
230232 RenderModel = renderModel ,
231- Mesh = mesh ,
232233 } ;
233234
234235 // Update material
235- UpdateMaterial ( renderMeshes [ meshIndex ] , material . Material ? . Passes [ pass ] , model . Materials . GetItemOrNull ( materialIndex ) , modelComponent ) ;
236+ UpdateMaterial ( renderMeshes [ meshIndex ] , material . Material ? . Passes [ pass ] , model . Materials . GetItemOrNull ( materialIndex ) , modelComponent , mesh ) ;
236237 }
237238 }
238239
0 commit comments