Can't add nodes to children of root node in import script?

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By cgardner
:warning: Old Version Published before Godot 3 was released.

Hi!

I’m writing a custom import script for .dae scenes coming out of Blender, and I’m having some issues adding new nodes to anything other than the root node. Here is my example code:

tool
extends EditorScenePostImport

func post_import( scene ):

    # adding something to root node
    var new_node = Spatial.new()
    scene.add_child(new_node)
    new_node.set_owner(scene)

    # adding something to child of root
    var new_node2 = Node.new()
    scene.get_node("Parent").add_child(new_node2)
    new_node2.set_owner(scene.get_node("Parent"))

    # adding something to grandchild of root
    var new_node3 = Area.new()
    scene.get_node("Parent/Child").add_child(new_node3)
    new_node3.set_owner(scene.get_node("Parent/Child"))

return scene

The sample .dae coming from blender is a Cube named “Parent,” with child Cone named “Child.” It looks like this in Blender: It looks like this in Blender:

Only the first block, adding something to root, actually works. The other blocks just do nothing.

I also tried a few other things on different scene setups, like accessing multiple children of the scene root with scene.get_children() and iterating through to add new nodes to each one, but that also did nothing - no errors or anything.

I am using the Better Collada plugin for Blender, and Godot 2.1.3. The documentation on import scripts is a little sparse, can someone provide some direction on how to accomplish this? Can nodes only be added to the root node from an import script?

Thank you so much!

:bust_in_silhouette: Reply From: MaximeG

Hello there,

Not that I am an expert or anything, but I think a similar scenario worked for me when I added_child() “normally” in the tree, but set the owner to the scene root instead of the actual parent.

The following worked for me :

tool
extends EditorScenePostImport

func post_import(scene):
	# Adding the 'root' script
	scene.set_script(preload("res://MyScript.gd"))
	
	# Creating an 'Area', child of 'root'.
	var area = Area.new()
	scene.add_child(area)
	area.set_owner(scene)
	
	# Removing the 'shape' from a rigid body imported from Blender
	var shape = scene.get_node("Collision/shape")
	scene.get_node("Collision").remove_child(shape)
	
	# Adding the shape to my script generated 'Area'
	area.add_child(shape)
	# Setting 'root' as the owner of the 'shape'.
	shape.set_owner(scene)
	
	return scene

I think the rationale behind this is the ‘owner’ must be the main object(scene) described by your *.scn file; but that’s really my two cents.