def test_properties(self): """ Test for changing properties on a node """ scene = GDScene() scene.add_node("RootNode") with scene.use_tree() as tree: tree.root["vframes"] = 10 self.assertEqual(tree.root["vframes"], 10) tree.root["hframes"] = 10 del tree.root["hframes"] del tree.root["hframes"] self.assertIsNone(tree.root.get("hframes")) child = scene.find_section("node") self.assertEqual(child["vframes"], 10)
def test_insert_child(self): """ Test for insert_child() """ scene = GDScene() scene.add_node("RootNode") scene.add_node("Child1", parent=".") with scene.use_tree() as tree: child = Node("Child2", type="Node") tree.root.insert_child(0, child) child1 = scene.find_section("node", name="Child1") child2 = scene.find_section("node", name="Child2") idx1 = scene.get_sections().index(child1) idx2 = scene.get_sections().index(child2) print(scene.get_sections()) self.assertLess(idx2, idx1)
def test_remove_node(self): """ Test for remove_node() """ scene = GDScene() scene.add_node("RootNode") scene.add_node("Child", parent=".") node = scene.find_section("node", name="Child") self.assertIsNotNone(node) # Remove by name with scene.use_tree() as tree: tree.root.remove_child("Child") node = scene.find_section("node", name="Child") self.assertIsNone(node) # Remove by index scene.add_node("Child", parent=".") with scene.use_tree() as tree: tree.root.remove_child(0) node = scene.find_section("node", name="Child") self.assertIsNone(node) # Remove by reference scene.add_node("Child", parent=".") with scene.use_tree() as tree: node = tree.root.get_children()[0] tree.root.remove_child(node) node = scene.find_section("node", name="Child") self.assertIsNone(node) # Remove child scene.add_node("Child", parent=".") with scene.use_tree() as tree: node = tree.root.get_child(0) node.remove_from_parent() node = scene.find_section("node", name="Child") self.assertIsNone(node)
def test_tree_create(self): """Test creating a scene with the tree API""" scene = GDScene() with scene.use_tree() as tree: tree.root = Node("RootNode", type="Node2D") tree.root.add_child( Node("Child", type="Area2D", properties={"visible": False})) self.assertEqual( str(scene), """[gd_scene load_steps=1 format=2] [node name="RootNode" type="Node2D"] [node name="Child" type="Area2D" parent="."] visible = false """, )
def test_tree_deep_create(self): """Test creating a scene with nested children using the tree API""" scene = GDScene() with scene.use_tree() as tree: tree.root = Node("RootNode", type="Node2D") child = Node("Child", type="Node") tree.root.add_child(child) child.add_child(Node("ChildChild", type="Node")) child.add_child(Node("ChildChild2", type="Node")) self.assertEqual( str(scene), """[gd_scene load_steps=1 format=2] [node name="RootNode" type="Node2D"] [node name="Child" type="Node" parent="."] [node name="ChildChild" type="Node" parent="Child"] [node name="ChildChild2" type="Node" parent="Child"] """, )
def godot_export_scene(root, pipeline, logger): root.dump() scene = GDScene() extresources = {} with scene.use_tree() as tree: tree.root = Node("Scene", type="Node2D") idx = 0 rooms = root.find("/Rooms") rooms = rooms.individualize().flatten().clean() for obj in rooms.children: idx += 1 nodename = obj.name.replace(":", "_") polygon = GDObject( "PoolVector2Array", *coords_to_godot_vector2array(obj.geom.exterior.coords)) gdnode = Node(nodename + "_" + str(idx), type="Polygon2D", properties={'polygon': polygon}) tree.root.add_child(gdnode) if obj.get('uv', None): uvs = obj.get('uv') # TODO: Do not transpose here! transpose when assigining UVs (this was done to overcome uvmapping.path_2d working on Y not X) uvs = [(uv[1], uv[0]) for uv in uvs] uvs = GDObject("PoolVector2Array", *coords_to_godot_vector2array(uvs)) gdnode['uv'] = uvs if obj.extra.get('ddd:collider', False): gdstaticbody = Node("StaticBody2D", type="StaticBody2D", properties={'collision_layer': 16}) gdnode.add_child(gdstaticbody) gdcollider = Node("CollisionPolygon2D", type="CollisionPolygon2D", properties={'polygon': polygon}) gdstaticbody.add_child(gdcollider) if obj.extra.get('ddd:occluder', False): occluderpolygon_res = scene.add_sub_resource( "OccluderPolygon2D", polygon=polygon) gdstaticbody = Node( "LightOccluder2D", type="LightOccluder2D", properties={'occluder': occluderpolygon_res.reference}) gdnode.add_child(gdstaticbody) if obj.mat and obj.mat.color: gdnode['self_modulate'] = GDObject( "Color", *[x / 255.0 for x in obj.mat.color_rgba]) if obj.mat.texture: if obj.mat.texture not in extresources: extresources[obj.mat.texture] = scene.add_ext_resource( obj.mat.texture, "Texture") texture_res = extresources[obj.mat.texture] gdnode['texture'] = texture_res.reference gdnode['texture_scale'] = GDObject( "Vector2", 2.0, 1.0) # TODO: this is temp For grass tests if 'ddd:z_index' in obj.extra: gdnode['z_index'] = obj.extra['ddd:z_index'] gdnode['z_as_relative'] = False nodes = root.find("/Items") #nodes = nodes.individualize().flatten().clean() for obj in nodes.children: idx += 1 nodename = obj.name.replace(":", "_") gdnode = None if obj.extra.get('godot:instance', False): if obj.extra['godot:instance'] not in extresources: extresources[ obj.extra['godot:instance']] = scene.add_ext_resource( obj.extra['godot:instance'], "PackedScene") packedscene = extresources[obj.extra['godot:instance']] gdnode = Node(nodename + "_" + str(idx), instance=packedscene.id, properties={ 'position': GDObject("Vector2", obj.geom.coords[0][0], obj.geom.coords[0][1]) }) tree.root.add_child(gdnode) #if obj.mat and obj.mat.color: # gdnode['self_modulate'] = GDObject("Color", *[x / 255.0 for x in obj.mat.color_rgba]) if 'ddd:z_index' in obj.extra: gdnode['z_index'] = obj.extra['ddd:z_index'] gdnode['z_as_relative'] = False if 'ddd:angle' in obj.extra: gdnode['rotation'] = obj.extra['ddd:angle'] output_path = "/tmp/ddd-godot.tscn" logger.info("Writing to: %s" % (output_path, )) scene.write(output_path) """
def test_empty_scene(self): """ Empty scenes should not crash """ scene = GDScene() with scene.use_tree() as tree: n = tree.get_node("Any") self.assertIsNone(n)
def godot_export_scene(root, pipeline, logger): root.dump() scene = GDScene() extresources = {} with scene.use_tree() as tree: tree.root = Node("Scene", type="Node2D") idx = 0 rooms = root.find("/Rooms") rooms = rooms.individualize().flatten().clean() for obj in rooms.children: idx += 1 nodename = obj.name.replace(":", "_") # TODO: Resolve material and extra properties earlier, as this is copied in every place it's used. # TODO: Moreover, in this case, this is modifying object metadata directly. if obj.mat and obj.mat.extra: obj.extra.update({k: v for k, v in obj.mat.extra.items()}) if obj.extra.get('ddd:sprite', False): gdnode = Node(nodename + "_" + str(idx), type="Sprite", properties={ 'position': GDObject("Vector2", *obj.centroid().geom.coords[0]) }) tree.root.add_child(gdnode) if obj.extra.get('ddd:sprite:bounds', None): gdnode['region_enabled'] = True gdnode['region_rect'] = GDObject( "Rect2", obj.extra['ddd:sprite:bounds'][0], obj.extra['ddd:sprite:bounds'][1], obj.extra['ddd:sprite:bounds'][2] - obj.extra['ddd:sprite:bounds'][0], obj.extra['ddd:sprite:bounds'][3] - obj.extra['ddd:sprite:bounds'][1]) else: polygon = GDObject( "PoolVector2Array", *coords_to_godot_vector2array(obj.geom.exterior.coords)) gdnode = Node(nodename + "_" + str(idx), type="Polygon2D", properties={'polygon': polygon}) tree.root.add_child(gdnode) if obj.get('uv', None): uvs = obj.get('uv') # TODO: Do not transpose here! transpose when assigining UVs (this was done to overcome uvmapping.path_2d working on Y not X) uvs = [(uv[1], uv[0]) for uv in uvs] uvs = GDObject("PoolVector2Array", *coords_to_godot_vector2array(uvs)) gdnode['uv'] = uvs if obj.extra.get('ddd:collider', False): gdstaticbody = Node("StaticBody2D", type="StaticBody2D", properties={'collision_layer': 16}) gdnode.add_child(gdstaticbody) gdcollider = Node("CollisionPolygon2D", type="CollisionPolygon2D", properties={'polygon': polygon}) gdstaticbody.add_child(gdcollider) if obj.extra.get('ddd:occluder', False): occluderpolygon_res = scene.add_sub_resource( "OccluderPolygon2D", polygon=polygon) gdstaticbody = Node( "LightOccluder2D", type="LightOccluder2D", properties={'occluder': occluderpolygon_res.reference}) gdnode.add_child(gdstaticbody) if obj.mat: if obj.mat.color: gdnode['self_modulate'] = GDObject( "Color", *[x / 255.0 for x in obj.mat.color_rgba]) if obj.mat.texture: if obj.mat.texture not in extresources: extresources[obj.mat.texture] = scene.add_ext_resource( "res://" + obj.mat.texture, "Texture") texture_res = extresources[obj.mat.texture] gdnode['texture'] = texture_res.reference if obj.mat.texture_normal: if obj.mat.texture_normal not in extresources: extresources[ obj.mat. texture_normal] = scene.add_ext_resource( "res://" + obj.mat.texture_normal, "Texture") texture_res = extresources[obj.mat.texture_normal] gdnode['normal_map'] = texture_res.reference #gdnode['texture_scale'] = GDObject("Vector2", 2.0, 1.0) # TODO: this is temp For grass tests if obj.get('godot:material:resource', None): mat_res_path = obj.get('godot:material:resource') if mat_res_path not in extresources: extresources[mat_res_path] = scene.add_ext_resource( mat_res_path, "Material") mat_res = extresources[mat_res_path] gdnode['material'] = mat_res.reference if 'ddd:z_index' in obj.extra: gdnode['z_index'] = obj.extra['ddd:z_index'] gdnode['z_as_relative'] = False if 'ddd:angle' in obj.extra: gdnode['rotation'] = obj.extra['ddd:angle'] if 'godot:scale' in obj.extra: gdnode['scale'] = GDObject("Vector2", *obj.extra['godot:scale']) if 'godot:texture_rotation' in obj.extra: gdnode['texture_rotation'] = obj.extra[ 'godot:texture_rotation'] if 'godot:texture_scale' in obj.extra: gdnode['texture_scale'] = GDObject( "Vector2", *obj.extra['godot:texture_scale']) if 'godot:self_modulate' in obj.extra: gdnode['self_modulate'] = color_to_godot_color( obj.extra['godot:self_modulate']) if 'godot:light_mask' in obj.extra: gdnode['light_mask'] = obj.extra['godot:light_mask'] nodes = root.find("/Items") #nodes = nodes.individualize().flatten().clean() for obj in nodes.children: idx += 1 nodename = obj.name.replace(":", "_") gdnode = None if obj.extra.get('godot:instance', False): if obj.extra['godot:instance'] not in extresources: extresources[ obj.extra['godot:instance']] = scene.add_ext_resource( obj.extra['godot:instance'], "PackedScene") packedscene = extresources[obj.extra['godot:instance']] gdnode = Node(nodename + "_" + str(idx), instance=packedscene.id, properties={ 'position': GDObject("Vector2", obj.geom.coords[0][0], obj.geom.coords[0][1]) }) tree.root.add_child(gdnode) #if obj.mat and obj.mat.color: # gdnode['self_modulate'] = GDObject("Color", *[x / 255.0 for x in obj.mat.color_rgba]) if 'ddd:z_index' in obj.extra: gdnode['z_index'] = obj.extra['ddd:z_index'] gdnode['z_as_relative'] = False if 'ddd:angle' in obj.extra: gdnode['rotation'] = obj.extra['ddd:angle'] if 'godot:scale' in obj.extra: gdnode['scale'] = GDObject("Vector2", *obj.extra['godot:scale']) if 'godot:self_modulate' in obj.extra: gdnode['self_modulate'] = color_to_godot_color( obj.extra['godot:self_modulate']) if 'godot:light_mask' in obj.extra: gdnode['light_mask'] = obj.extra['godot:light_mask'] output_path = "/tmp/ddd-godot.tscn" logger.info("Writing to: %s" % (output_path, )) scene.write(output_path) """