extends Node var PATH = "res://scoom/" var EXTERNAL_PATH = "res://scoom/" const ENTITY_CONFIG = "entity.cfg" func _ready(): if(not OS.has_feature("editor")): EXTERNAL_PATH = OS.get_executable_path().get_base_dir() + "/scoom/" func get_all_children(in_node, arr = []): arr.push_back(in_node) for child in in_node.get_children(): arr = get_all_children(child,arr) return arr func load_gltf(file, parent = self, hasCollision = false, trimesh = false): if(file == null): printerr("No model provided to load") return var gltf := GLTFDocument.new() var gltf_state := GLTFState.new() var snd_file = FileAccess.open(EXTERNAL_PATH + file, FileAccess.READ) var fileBytes = PackedByteArray() fileBytes = snd_file.get_buffer(snd_file.get_length()) gltf.append_from_buffer(fileBytes, "", gltf_state) print("Loading ", EXTERNAL_PATH + file) var node = gltf.generate_scene(gltf_state) parent.add_child(node) get_all_entities(node) if not hasCollision: return node for o in get_all_children(node): if o is MeshInstance3D: if(trimesh): o.create_trimesh_collision() else: o.create_convex_collision() return node func get_all_entities(at_node): var entity_count = 0 for o in get_all_children(at_node): if o.name.begins_with("entity_"): print("Loading entity ", o.name) if loadEntity(o): entity_count += 1; if(entity_count > 0): print("Loaded ", entity_count, " entities.") func loadEntity(node): var config = ConfigFile.new() var err = config.load(PATH + ENTITY_CONFIG) if err != OK: printerr("COULD NOT LOAD ENTITY : ", node.name) return false if(not config.has_section(node.name)): printerr("NO CONFIG FOUND FOR ENTITY : ", node.name) return false var model = config.get_value(node.name, "model") var has_collision = config.get_value(node.name, "has_collision") var has_trimesh_col = config.get_value(node.name, "has_trimesh_col") var entity = load_gltf(model, node.get_parent(), has_collision, has_trimesh_col) as Node3D if(entity == null): printerr("ENTITY COULD NOT BE CREATED : ", node.name) return false entity.transform.origin = node.transform.origin entity.scale = config.get_value(node.name, "scale") node.queue_free() return true func loadPCK(file): var success = ProjectSettings.load_resource_pack(EXTERNAL_PATH + file) if success: print("Resource pack loaded ", EXTERNAL_PATH + file) func loadConfig(file): var config = ConfigFile.new() var err = config.load(EXTERNAL_PATH + file) if err != OK: printerr("FAILED LOADING CONFIG DATA @ ",EXTERNAL_PATH + file) return config func loadScene(file, parent = self): var res = load(PATH + file) as PackedScene var scene = res.instantiate() get_all_entities(scene) parent.add_child(scene) return scene