2
0
Эх сурвалжийг харах

Refacto LOD code into hmd/Data.hx

clementlandrin 6 сар өмнө
parent
commit
ea8b2be334

+ 42 - 0
hxd/fmt/hmd/Data.hx

@@ -154,6 +154,48 @@ class Model {
 	public var collider : Null<Index<Collider>>;
 	public function new() {
 	}
+
+	public function getObjectName() {
+		if ( name == null )
+			return name;
+		var reg = ~/_*-*LOD0/;
+		return reg.replace(name, '');
+	}
+
+	public function isLOD() {
+		return name.indexOf("LOD0") < 0;
+	}
+
+	public function isLOD0(modelName : String) {
+		return name != null && StringTools.contains(name, modelName) && StringTools.contains(name, "LOD0");
+	}
+
+	public function getLODInfos() : { lodLevel : Int , modelName : String } {
+		var keyword = "LOD";
+		if ( name == null || name.length <= keyword.length )
+			return { lodLevel : -1, modelName : null };
+
+		// Test prefix
+		if ( name.substr(0, keyword.length) == keyword) {
+			var parsedInt = Std.parseInt(name.substr( keyword.length, 1 ));
+			if (parsedInt != null) {
+				if ( Std.parseInt( name.substr( keyword.length + 1, 1 ) ) != null )
+					throw 'Did not expect a second number after LOD in ${name}';
+				return { lodLevel : parsedInt, modelName : name.substr(keyword.length) };
+			}
+		}
+
+		// Test suffix
+		var maxCursor = name.length - keyword.length - 1;
+		if ( name.substr( maxCursor, keyword.length ) == keyword ) {
+			var parsedInt = Std.parseInt( name.charAt( name.length - 1) );
+			if ( parsedInt != null ) {
+				return { lodLevel : parsedInt, modelName : name.substr( 0, maxCursor ) };
+			}
+		}
+
+		return { lodLevel : -1, modelName : null };
+	}
 }
 
 enum AnimationFlag {

+ 5 - 35
hxd/fmt/hmd/Library.hx

@@ -275,16 +275,15 @@ class Library {
 		var lods : Array<Model> = null;
 		var hasLod = model.lods != null;
 		if ( hasLod ) {
-			var isLod = model.name.indexOf("LOD0") < 0;
-			if ( isLod )
+			if ( model.isLOD() )
 				return null;
 			lods = [for ( lod in model.lods) header.models[lod]];
 			patchLodsMaterials(model, lods);
 		} else {
-			var lodInfos = getLODInfos( model );
+			var lodInfos = model.getLODInfos();
 			if ( lodInfos.lodLevel > 0) {
 				for ( m in header.models )
-					if ( m.name != null && StringTools.contains(m.name, lodInfos.modelName) && StringTools.contains(m.name, "LOD0"))
+					if ( m.isLOD0(lodInfos.modelName) )
 						return null;
 				throw "No LOD0 found for " + lodInfos.modelName + " in " + resource.name;
 			}
@@ -392,40 +391,12 @@ class Library {
 		return def;
 	}
 
-	public function getLODInfos( model : Model ) : { lodLevel : Int , modelName : String } {
-		var modelName : String = model.name;
-		var keyword = "LOD";
-		if ( modelName == null || modelName.length <= keyword.length )
-			return { lodLevel : -1, modelName : null };
-
-		// Test prefix
-		if ( modelName.substr(0, keyword.length) == keyword) {
-			var parsedInt = Std.parseInt(modelName.substr( keyword.length, 1 ));
-			if (parsedInt != null) {
-				if ( Std.parseInt( modelName.substr( keyword.length + 1, 1 ) ) != null )
-					throw 'Did not expect a second number after LOD in ${modelName}';
-				return { lodLevel : parsedInt, modelName : modelName.substr(keyword.length) };
-			}
-		}
-
-		// Test suffix
-		var maxCursor = modelName.length - keyword.length - 1;
-		if ( modelName.substr( maxCursor, keyword.length ) == keyword ) {
-			var parsedInt = Std.parseInt( modelName.charAt( modelName.length - 1) );
-			if ( parsedInt != null ) {
-				return { lodLevel : parsedInt, modelName : modelName.substr( 0, maxCursor ) };
-			}
-		}
-
-		return { lodLevel : -1, modelName : null };
-	}
-
 	public function findLODs( modelName : String, lod0 : Model ) : Array<Model> {
 		if ( modelName == null )
 			return null;
 		var lods : Array<Model> = [];
 		for ( curModel in header.models ) {
-			var lodInfos = getLODInfos( curModel );
+			var lodInfos = curModel.getLODInfos();
 			if ( lodInfos.lodLevel < 1 )
 				continue;
 			if ( lodInfos.modelName == modelName ) {
@@ -434,7 +405,6 @@ class Library {
 				lods[lodInfos.lodLevel - 1] = curModel;
 			}
 		}
-
 		return lods;
 	}
 
@@ -486,7 +456,7 @@ class Library {
 				else
 					obj = new h3d.scene.MultiMaterial(prim, [for( mat in m.materials ) makeMaterial(m, mat, loadTexture)]);
 			}
-			obj.name = m.name;
+			obj.name = m.getObjectName();
 			obj.defaultTransform = m.position.toMatrix();
 			objs.push(obj);
 			var p = objs[m.parent];