X-Git-Url: http://nitlanguage.org diff --git a/lib/gamnit/depth/more_models.nit b/lib/gamnit/depth/more_models.nit index a126223..482f282 100644 --- a/lib/gamnit/depth/more_models.nit +++ b/lib/gamnit/depth/more_models.nit @@ -50,7 +50,7 @@ class ModelAsset if leaves.is_empty then # Nothing was loaded, use a cube with the default material - var leaf = new LeafModel(new Cube, new SmoothMaterial.default) + var leaf = placeholder_model leaves.add leaf end end @@ -62,7 +62,7 @@ class ModelAsset var content = text_asset.to_s if content.is_empty then print_error "Model failed to load: Asset empty at '{self.path}'" - leaves.add new LeafModel(new Cube, new SmoothMaterial.default) + leaves.add new LeafModel(new Cube, new Material) return end @@ -71,7 +71,7 @@ class ModelAsset var obj_def = parser.parse if obj_def == null then print_error "Model failed to load: .obj format error on '{self.path}'" - leaves.add new LeafModel(new Cube, new SmoothMaterial.default) + leaves.add new LeafModel(new Cube, new Material) return end @@ -113,12 +113,11 @@ private class ModelFromObj end # Load material libs - # TODO do not load each libs more than once - var mtl_libs = new Map[String, Map[String, MtlDef]] + var mtl_libs = sys.mtl_libs var lib_names = obj_def.material_libs for name in lib_names do - var lib_path = self.path.dirname / name - var lib_asset = new TextAsset(lib_path) + var asset_path = self.path.dirname / name + var lib_asset = new TextAsset(asset_path) lib_asset.load var error = lib_asset.error @@ -129,7 +128,7 @@ private class ModelFromObj var mtl_parser = new MtlFileParser(lib_asset.to_s) var mtl_lib = mtl_parser.parse - mtl_libs[name] = mtl_lib + mtl_libs[asset_path] = mtl_lib end # Create 1 mesh per material, and prepare materials @@ -149,7 +148,8 @@ private class ModelFromObj var mtl_lib_name = faces.first.material_lib var mtl_name = faces.first.material_name if mtl_lib_name != null and mtl_name != null then - var mtl_lib = mtl_libs[mtl_lib_name] + var asset_path = self.path.dirname / mtl_lib_name + var mtl_lib = mtl_libs[asset_path] var mtl = mtl_lib.get_or_null(mtl_name) if mtl != null then mtl_def = mtl @@ -168,7 +168,7 @@ private class ModelFromObj # Load textures need for these materials for name in texture_names do if not asset_textures_by_name.keys.has(name) then - var tex = new GamnitAssetTexture(name) + var tex = new TextureAsset(name) asset_textures_by_name[name] = tex end end @@ -212,7 +212,7 @@ private class ModelFromObj # Create models and store them for mesh, mtl_def in mesh_to_mtl do var material = materials.get_or_null(mtl_def) - if material == null then material = new SmoothMaterial.default + if material == null then material = new Material var model = new LeafModel(mesh, material) array.add model @@ -379,8 +379,16 @@ end redef class Sys # Textures loaded from .mtl files for models - var asset_textures_by_name = new Map[String, GamnitAssetTexture] + var asset_textures_by_name = new Map[String, TextureAsset] + + # Loaded .mtl material definitions, sorted by path in assets and material name + private var mtl_libs = new Map[String, Map[String, MtlDef]] # All instantiated asset models var models = new Set[ModelAsset] + + # Blue cube of 1 unit on each side, acting as placeholder for models failing to load + # + # This model can be freely used by any `Actor` as placeholder or for debugging. + var placeholder_model = new LeafModel(new Cube, new Material) is lazy end