Prune segments with empty triangle strips. ZE and most versions of ZETools require triangle strips.
This commit is contained in:
		@@ -8,6 +8,25 @@ import math
 | 
				
			|||||||
from mathutils import Vector, Matrix
 | 
					from mathutils import Vector, Matrix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Convert model with geometry to null.
 | 
				
			||||||
 | 
					# Currently not used, but could be necessary in the future.
 | 
				
			||||||
 | 
					def make_null(model : Model):
 | 
				
			||||||
 | 
					    model.model_type = ModelType.NULL
 | 
				
			||||||
 | 
					    bone_map = None
 | 
				
			||||||
 | 
					    geometry = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# I think this is all we need to check for to avoid 
 | 
				
			||||||
 | 
					# common ZE/ZETools crashes...
 | 
				
			||||||
 | 
					def validate_geometry_segment(segment : GeometrySegment) -> bool:
 | 
				
			||||||
 | 
					    if not segment.positions or not segment.triangle_strips:
 | 
				
			||||||
 | 
					        return False
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        return True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def inject_dummy_data(model : Model):
 | 
					def inject_dummy_data(model : Model):
 | 
				
			||||||
    """  Adds a triangle and material to the model (scene root).  Needed to export zenasst-compatible skeletons. """
 | 
					    """  Adds a triangle and material to the model (scene root).  Needed to export zenasst-compatible skeletons. """
 | 
				
			||||||
    model.hidden = True
 | 
					    model.hidden = True
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@ from mathutils import Vector
 | 
				
			|||||||
from .msh_model import Model, Animation, ModelType
 | 
					from .msh_model import Model, Animation, ModelType
 | 
				
			||||||
from .msh_scene import Scene, SceneAABB
 | 
					from .msh_scene import Scene, SceneAABB
 | 
				
			||||||
from .msh_model_gather import gather_models
 | 
					from .msh_model_gather import gather_models
 | 
				
			||||||
from .msh_model_utilities import sort_by_parent, has_multiple_root_models, reparent_model_roots, get_model_world_matrix, inject_dummy_data
 | 
					from .msh_model_utilities import make_null, validate_geometry_segment, sort_by_parent, has_multiple_root_models, reparent_model_roots, get_model_world_matrix, inject_dummy_data
 | 
				
			||||||
from .msh_model_triangle_strips import create_models_triangle_strips
 | 
					from .msh_model_triangle_strips import create_models_triangle_strips
 | 
				
			||||||
from .msh_material import *
 | 
					from .msh_material import *
 | 
				
			||||||
from .msh_material_gather import gather_materials
 | 
					from .msh_material_gather import gather_materials
 | 
				
			||||||
@@ -53,6 +53,20 @@ def create_scene(generate_triangle_strips: bool, apply_modifiers: bool, export_t
 | 
				
			|||||||
                for segment in model.geometry:
 | 
					                for segment in model.geometry:
 | 
				
			||||||
                    segment.triangle_strips = segment.triangles
 | 
					                    segment.triangle_strips = segment.triangles
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # After generating triangle strips we must prune any segments that don't have
 | 
				
			||||||
 | 
					    # them, or else ZE and most versions of ZETools will crash.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # We could also make models with no valid segments nulls, since they might as well be, 
 | 
				
			||||||
 | 
					    # but that could have unforseeable consequences further down the modding pipeline
 | 
				
			||||||
 | 
					    # and is not necessary to avoid the aforementioned crashes...
 | 
				
			||||||
 | 
					    for model in scene.models:
 | 
				
			||||||
 | 
					        if model.geometry is not None:
 | 
				
			||||||
 | 
					            # Doing this in msh_model_gather would be messy and the presence/absence
 | 
				
			||||||
 | 
					            # of triangle strips is required for a validity check.
 | 
				
			||||||
 | 
					            model.geometry = [segment for segment in model.geometry if validate_geometry_segment(segment)]
 | 
				
			||||||
 | 
					            #if not model.geometry:
 | 
				
			||||||
 | 
					            #    make_null(model)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if has_multiple_root_models(scene.models):
 | 
					    if has_multiple_root_models(scene.models):
 | 
				
			||||||
        scene.models = reparent_model_roots(scene.models)
 | 
					        scene.models = reparent_model_roots(scene.models)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user