class_name ObjectPlaceTool extends EditorTool ## Places a new catalog object into the chunk at a given transform. ## ## `args`: `catalog_id` (String, required), `position` (Vector3), `rotation` ## (Vector4 quaternion, optional, default identity), `scale` (Vector3, ## optional, default ONE), `properties` (Dictionary, optional, merged in). ## ## Returns the new object's id (String) on success, or "" on failure ## (unknown catalog_id). func _init() -> void: tool_id = "object_place" func apply(core: EditorCore, args: Dictionary) -> Variant: var catalog_id: String = args.get("catalog_id", "") if catalog_id == "": push_error("ObjectPlaceTool: missing catalog_id") return "" var entry: Dictionary = {} if core.catalog != null: entry = core.catalog.resolve(catalog_id) if entry.is_empty(): push_error("ObjectPlaceTool: unknown catalog_id '%s'" % catalog_id) return "" var obj := ChunkDataDecoder.WorldObjectData.new() obj.id = core.model.generate_object_id() obj.type = entry.get("type", "prop") obj.asset_id = entry.get("asset_id", catalog_id) obj.position = args.get("position", Vector3.ZERO) obj.rotation = args.get("rotation", Vector4(0, 0, 0, 1)) obj.scale = args.get("scale", Vector3.ONE) var props: Dictionary = (args.get("properties", {}) as Dictionary).duplicate() if entry.has("display_name"): props["display_name"] = entry["display_name"] props["catalog_id"] = catalog_id obj.properties = props core.undo_redo.begin("Place '%s' (%s)" % [obj.id, catalog_id]) core.undo_redo.add_do(core.model.add_object_raw.bind(obj)) core.undo_redo.add_undo(core.model.remove_object_raw.bind(obj.id)) core.undo_redo.commit() core.selection.select(obj.id) return obj.id