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