gamnit :: ModelAsset :: defaultinit
# Model loaded from a file in the asset folder
#
# In case of error, `error` is set accordingly.
# If the error is on the mesh, `mesh` is set to a default `new Cube`.
# If the material is missing or it failed to load, `material` is set to the blueish `new Material`.
class ModelAsset
super Model
super Asset
init do models.add self
private var loaded = false
redef fun load
do
if loaded then return
var ext = path.file_extension
if ext == "obj" then
load_obj_file
else
errors.add new Error("Model at '{path}' failed to load: Extension '{ext or else "null"}' unrecognized")
end
if leaves_cache.is_empty then
# Nothing was loaded, use a cube with the default material
var leaf = placeholder_model
leaves_cache.add leaf
end
loaded = true
end
private fun lazy_load
do
if loaded then return
# 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
private fun load_obj_file
do
# Read .obj description from assets
var text_asset = new TextAsset(path)
var content = text_asset.to_s
if content.is_empty then
errors.add new Error("Model failed to load: Asset empty at '{self.path}'")
leaves_cache.add new LeafModel(new Cube, new Material)
return
end
# Parse .obj description
var parser = new ObjFileParser(content)
var obj_def = parser.parse
if obj_def == null then
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
# Check for errors
if debug_gamnit then assert obj_def.is_coherent
# Build models
var converter = new BuildModelFromObj(path, obj_def)
converter.fill_leaves self
errors.add_all converter.errors
end
redef fun leaves
do
lazy_load
return leaves_cache
end
private var leaves_cache = new Array[LeafModel]
redef fun named_parts
do
lazy_load
return named_leaves_cache
end
private var named_leaves_cache = new Map[String, Model]
end
lib/gamnit/depth/more_models.nit:31,1--124,3