예제 #1
0
 def test_file_equality(self):
     """Tests for GDFile == GDFile"""
     s1 = GDScene(GDResourceSection())
     s2 = GDScene(GDResourceSection())
     self.assertEqual(s1, s2)
     resource = s1.find_section("resource")
     resource["key"] = "value"
     self.assertNotEqual(s1, s2)
예제 #2
0
 def test_add_ext_node(self):
     """Test GDScene.add_ext_node"""
     scene = GDScene()
     res = scene.add_ext_resource("res://Other.tscn", "PackedScene")
     node = scene.add_ext_node("Root", res.id)
     self.assertEqual(node.name, "Root")
     self.assertEqual(node.instance, res.id)
예제 #3
0
 def test_section_ordering(self):
     """Sections maintain an ordering"""
     scene = GDScene()
     node = scene.add_node("RootNode")
     scene.add_ext_resource("res://Other.tscn", "PackedScene")
     res = scene.find_section("ext_resource")
     self.assertEqual(scene.get_sections()[1:], [res, node])
예제 #4
0
 def test_invalid_tree(self):
     """ Raise exception when tree is invalid """
     scene = GDScene()
     scene.add_node("RootNode")
     scene.add_node("Child", parent="Missing")
     self.assertRaises(TreeMutationException,
                       lambda: scene.get_node("Child"))
예제 #5
0
 def test_remove_unused_resource(self):
     """Can remove unused resources"""
     scene = GDScene()
     res = scene.add_ext_resource("res://Res.tscn", "PackedScene")
     scene.remove_unused_resources()
     resources = scene.get_sections("ext_resource")
     self.assertEqual(len(resources), 0)
예제 #6
0
 def test_get_node(self):
     """ Test for get_node() """
     scene = GDScene()
     scene.add_node("RootNode")
     scene.add_node("Child", parent=".")
     child = scene.add_node("Child2", parent="Child")
     node = scene.get_node("Child/Child2")
     self.assertEqual(node, child)
예제 #7
0
 def test_write(self):
     """Test writing scene out to a file"""
     scene = GDScene()
     outfile = tempfile.mkstemp()[1]
     scene.write(outfile)
     with open(outfile, "r") as ifile:
         gen_scene = GDScene.parse(ifile.read())
     self.assertEqual(scene, gen_scene)
예제 #8
0
 def test_find_node(self):
     """Test GDScene.find_node"""
     scene = GDScene()
     n1 = scene.add_node("Root", "Node")
     n2 = scene.add_node("Child", "Node", parent=".")
     node = scene.find_node(name="Root")
     self.assertEqual(node, n1)
     node = scene.find_node(parent=".")
     self.assertEqual(node, n2)
예제 #9
0
    def test_ext_resource(self):
        """Test serializing a scene with an ext_resource"""
        scene = GDScene()
        scene.add_ext_resource("res://Other.tscn", "PackedScene")
        self.assertEqual(
            str(scene),
            """[gd_scene load_steps=2 format=2]

[ext_resource path="res://Other.tscn" type="PackedScene" id=1]
""",
        )
예제 #10
0
    def test_sub_resource(self):
        """Test serializing a scene with an sub_resource"""
        scene = GDScene()
        scene.add_sub_resource("Animation")
        self.assertEqual(
            str(scene),
            """[gd_scene load_steps=2 format=2]

[sub_resource type="Animation" id=1]
""",
        )
예제 #11
0
 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)
예제 #12
0
    def test_find_constraints(self):
        """Test for the find_section constraints"""
        scene = GDScene()
        res1 = scene.add_sub_resource("CircleShape2D", radius=1)
        res2 = scene.add_sub_resource("CircleShape2D", radius=2)

        found = list(scene.find_all("sub_resource"))
        self.assertCountEqual(found, [res1, res2])

        found = list(scene.find_all("sub_resource", id=res1.id))
        self.assertEqual(found, [res1])

        found = list(scene.find_all("sub_resource", {"radius": 2}))
        self.assertEqual(found, [res2])
예제 #13
0
 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)
예제 #14
0
    def test_node(self):
        """Test serializing a scene with a node"""
        scene = GDScene()
        scene.add_node("RootNode", type="Node2D")
        scene.add_node("Child", type="Area2D", parent=".")
        self.assertEqual(
            str(scene),
            """[gd_scene load_steps=1 format=2]

[node name="RootNode" type="Node2D"]

[node name="Child" type="Area2D" parent="."]
""",
        )
예제 #15
0
    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
""",
        )
예제 #16
0
    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"]
""",
        )
예제 #17
0
    def test_addremove_ext_res(self):
        """Test adding and removing an ext_resource"""
        scene = GDScene()
        res = scene.add_ext_resource("res://Res.tscn", "PackedScene")
        self.assertEqual(res.id, 1)
        res2 = scene.add_ext_resource("res://Sprite.png", "Texture")
        self.assertEqual(res2.id, 2)
        node = scene.add_node("Sprite", "Sprite")
        node["texture"] = res2.reference
        node["textures"] = [res2.reference]
        node["texture_map"] = {"tex": res2.reference}
        node["texture_pool"] = GDObject("ResourcePool", res2.reference)

        s = scene.find_section(path="res://Res.tscn")
        scene.remove_section(s)
        scene.renumber_resource_ids()

        s = scene.find_section("ext_resource")
        self.assertEqual(s.id, 1)
        self.assertEqual(node["texture"], s.reference)
        self.assertEqual(node["textures"][0], s.reference)
        self.assertEqual(node["texture_map"]["tex"], s.reference)
        self.assertEqual(node["texture_pool"].args[0], s.reference)
예제 #18
0
    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)
예제 #19
0
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)
    """
예제 #20
0
 def test_basic_scene(self):
     """Run the parsing test cases"""
     self.assertEqual(str(GDScene()), "[gd_scene load_steps=1 format=2]\n")
예제 #21
0
 def test_missing_root(self):
     """ Raise exception when GDScene is inherited but missing project_root """
     scene = GDScene()
     scene.add_ext_node("Root", 1)
     self.assertRaises(RuntimeError, lambda: scene.get_node("Root"))
예제 #22
0
 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)
예제 #23
0
 def test_get_missing_node(self):
     """ get_node on missing node should return None """
     scene = GDScene()
     scene.add_node("RootNode")
     node = scene.get_node("Foo/Bar/Baz")
     self.assertIsNone(node)
예제 #24
0
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)
    """
예제 #25
0
 def test_get_node_none(self):
     """get_node() works with no nodes"""
     scene = GDScene()
     n = scene.get_node()
     self.assertIsNone(n)