init do models.add self
+ private var loaded = false
+
redef fun load
do
var ext = path.file_extension
if ext == "obj" then
load_obj_file
else
- print_error "Model failed to load: Extension '{ext or else "null"}' unrecognized"
+ errors.add new Error("Model at '{path}' failed to load: Extension '{ext or else "null"}' unrecognized")
end
- if leaves.is_empty then
+ if leaves_cache.is_empty then
# Nothing was loaded, use a cube with the default material
var leaf = placeholder_model
- leaves.add leaf
+ leaves_cache.add leaf
end
+
+ loaded = true
end
private fun load_obj_file
var text_asset = new TextAsset(path)
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 Material)
+ errors.add new Error("Model failed to load: Asset empty at '{self.path}'")
+ leaves_cache.add new LeafModel(new Cube, new Material)
return
end
var parser = new ObjFileParser(content)
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 Material)
+ errors.add new Error("Model failed to load: .obj format error on '{self.path}'")
+ leaves_cache.add new LeafModel(new Cube, new Material)
return
end
# Build models
var converter = new ModelFromObj(path, obj_def)
- converter.models leaves
+ converter.models leaves_cache
+ errors.add_all converter.errors
+ end
+
+ redef fun leaves
+ do
+ if not loaded then
+ # Lazy load
+ load
+
+ # Print errors when lazy loading only
+ if errors.length == 1 then
+ print_error errors.first
+ else if errors.length > 1 then
+ print_error "Loading model at '{path}' raised {errors.length} errors:\n* "
+ print_error errors.join("\n* ")
+ end
+ end
+
+ return leaves_cache
end
- redef var leaves = new Array[LeafModel]
+ private var leaves_cache = new Array[LeafModel]
end
# Short-lived service to convert an `ObjDef` to `models`
# Parsed .obj definition
var obj_def: ObjDef
- fun models(array: Array[LeafModel])
+ # Errors raised by calls to `models`
+ var errors = new Array[Error]
+
+ # Fill `leaves` with models described in `obj_def`
+ fun models(leaves: Array[LeafModel])
do
# Sort faces by material
var mtl_to_faces = new MultiHashMap[String, ObjFace]
var error = lib_asset.error
if error != null then
- print_error error.to_s
+ errors.add error
continue
end
texture_names.add self.path.dirname / e
end
else
- print_error "mtl '{mtl_name}' not found in '{mtl_lib_name}'"
+ errors.add new Error("Error loading model at '{path}': mtl '{mtl_name}' not found in '{asset_path}'")
end
end
if not asset_textures_by_name.keys.has(name) then
var tex = new TextureAsset(name)
asset_textures_by_name[name] = tex
+
+ tex.load
+ var error = tex.error
+ if error != null then errors.add error
end
end
if material == null then material = new Material
var model = new LeafModel(mesh, material)
- array.add model
+ leaves.add model
end
end