52 lines
1.7 KiB
GDScript
52 lines
1.7 KiB
GDScript
class_name M2RawModelRepository
|
|
extends RefCounted
|
|
|
|
## Reads raw static and animated M2 Dictionaries through the optional native
|
|
## M2Loader boundary. The repository is stateless and does not cache failures.
|
|
|
|
const NATIVE_LOADER_CLASS_NAME := "M2Loader"
|
|
|
|
|
|
## Loads one normalized static M2 path with the native `load_m2` method.
|
|
## Invalid input, unavailable native support and parse failures return `{}`.
|
|
func load_static_model_data(
|
|
extracted_directory: String,
|
|
normalized_relative_path: String) -> Dictionary:
|
|
return _load_model_data(
|
|
extracted_directory,
|
|
normalized_relative_path,
|
|
"load_m2"
|
|
)
|
|
|
|
|
|
## Loads one normalized animated M2 path with the native `load_m2_animated`
|
|
## method. Invalid input, unavailable support and parse failures return `{}`.
|
|
func load_animated_model_data(
|
|
extracted_directory: String,
|
|
normalized_relative_path: String) -> Dictionary:
|
|
return _load_model_data(
|
|
extracted_directory,
|
|
normalized_relative_path,
|
|
"load_m2_animated"
|
|
)
|
|
|
|
|
|
func _load_model_data(
|
|
extracted_directory: String,
|
|
normalized_relative_path: String,
|
|
native_method_name: StringName) -> Dictionary:
|
|
if normalized_relative_path.is_empty():
|
|
return {}
|
|
if not ClassDB.class_exists(NATIVE_LOADER_CLASS_NAME):
|
|
return {}
|
|
var absolute_path := ProjectSettings.globalize_path(
|
|
extracted_directory.path_join(normalized_relative_path)
|
|
)
|
|
if not FileAccess.file_exists(absolute_path):
|
|
return {}
|
|
var native_loader: Object = ClassDB.instantiate(NATIVE_LOADER_CLASS_NAME)
|
|
if native_loader == null or not native_loader.has_method(native_method_name):
|
|
return {}
|
|
var raw_model_data: Variant = native_loader.call(native_method_name, absolute_path)
|
|
return raw_model_data if raw_model_data is Dictionary else {}
|