gamnit: don't load the same .mat material more than once
[nit.git] / lib / gamnit / depth / more_models.nit
index a126223..482f282 100644 (file)
@@ -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