gamnit: don't load the same .mat material more than once
authorAlexis Laferrière <alexis.laf@xymus.net>
Wed, 31 May 2017 13:06:01 +0000 (09:06 -0400)
committerAlexis Laferrière <alexis.laf@xymus.net>
Sun, 4 Jun 2017 13:55:52 +0000 (09:55 -0400)
Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

lib/gamnit/depth/more_models.nit
lib/gamnit/model_parsers/obj.nit

index 8d7d8a1..482f282 100644 (file)
@@ -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
@@ -381,6 +381,9 @@ redef class Sys
        # Textures loaded from .mtl files for models
        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]
 
index abd573d..e9f8499 100644 (file)
@@ -155,7 +155,7 @@ class ObjDef
        # Faces
        var faces = new Array[ObjFace]
 
-       # Referenced material libraries
+       # Relative paths to referenced material libraries
        fun material_libs: Set[String] do
                var libs = new Set[String]
                for face in faces do