extends Spatial var animation_object = null var orientation = 0.0 var blend_shapes = {} func search_animation( obj ) -> bool: var ret:bool = false for i in obj.get_children(): if i.get_name() == "AnimationPlayer": animation_object = i return true else: ret = search_animation(i) if ret == true: return ret return false func list_child( obj, father = "" ): for i in obj.get_children(): var root = father + "." + str(i.name) Config.msg_debug(root) if i is MeshInstance: Config.msg_debug(root + " -> MeshInstance") for key in i.get_property_list(): Config.msg_debug( "property:" + str(key)) list_child( i, root) func list_blend_shapes( obj, father = "" ) -> Array: var ret:Array for i in obj.get_children(): var root = father + "." + str(i.name) if i is MeshInstance: for key in i.get_property_list(): if key.name.substr(0, 13) == "blend_shapes/": # Config.msg_debug( father + "." + i.name + " - " + key.name.substr(13) ) ret.append(key.name.substr(13)) list_blend_shapes( i, root) return ret func update_blend_shapes_step( obj, father = "" ): for i in obj.get_children(): var root = father + str(i.name) + "." if i is MeshInstance: for key in i.get_property_list(): if key.name.substr(0, 13) == "blend_shapes/": var blend = key.name.substr(13) # Config.msg_debug( father + i.name + " - " + key.name.substr(13) ) if not blend_shapes.has(blend): blend_shapes[blend] = [] blend_shapes[blend].append(i) update_blend_shapes_step( i, root) func update_blend_shapes( obj ): blend_shapes = {} update_blend_shapes_step(obj, "") # for key in blend_shapes: # Config.msg_debug("key:" + key + " = " + str(blend_shapes[key])) $control.update_property(blend_shapes) func _ready(): $control.connect("update_blend" , self, "_on_update_property") $control.connect( "select_race", self, "_on_select_race" ) self.change_creature( "res://scenes/creature_creation/arche.tscn" ) search_animation(self) update_blend_shapes($creature) func _process( delta ): animation_object.play( "idle" ) func _input( event ): # Config.msg_debug(str(event)) if event is InputEventMouseMotion and Input.is_mouse_button_pressed( 2 ): if $creature: $creature.rotate_y( event.relative.x *0.01 ) func change_creature( new_model_path ): if $creature: var old_model = $creature self.remove_child( old_model ) old_model.queue_free() var new_model = load( new_model_path ) if new_model: new_model = new_model.instance() new_model.name = "creature" self.add_child( new_model ) #new_model.connect( "animation_finished", self, "_on_creature_animation_finished" ) #new_model.duplicate_meshes() func _on_select_race( race ): Config.msg_debug(race) match race: "arche": self.change_creature( "res://scenes/creature_creation/arche.tscn" ) "isidor": self.change_creature( "res://scenes/creature_creation/isidor.tscn" ) _: self.change_creature( "res://scenes/creature_creation/arche.tscn" ) search_animation(self) update_blend_shapes($creature) # for child in $creature.get_children(): # Config.msg_debug("Child / name:" + child.name) # list_child($creature) # var skeleton = child.get_node( "skeleton" ) # for node in skeleton.get_children(): # if node is MeshInstance: # Config.msg_debug("Node / name:" + node.name) # #node.set( "blend_shapes/"+p_blend_shape_name, p_value ) func _on_update_property(name_property, value): Config.msg_debug( name_property + ": " + str(value) ) for i in blend_shapes[name_property]: i.set( "blend_shapes/"+name_property, value )