예제 #1
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)
예제 #2
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)
예제 #3
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)
예제 #4
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
""",
        )
예제 #5
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"]
""",
        )
예제 #6
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)
    """
예제 #7
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)
예제 #8
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)
    """