def test_dump_objects_matrix(self):
     """ test dumping hierachy of nodes """
     room = concrete_room.ConcreteRoom()
     parent1 = room.add_child(None, "parent1")
     child1_1 = room.add_child("parent1", "child1_1", cgtypes.mat4(
                     1.0, 2.0, 3.0, 4.0,
                     5.0, 6.0, 7.0, 8.0,
                     9.0, 10.0, 11.0, 12.0,
                     13.0, 14.0, 15.0, 16.0))
     self.assertIsNotNone(parent1)
     self.assertIsNotNone(child1_1)
     room.generate_gltf("/tmp")
     with open("/tmp/room.gltf", "r") as room_file:
         obj = json.load(room_file)
     objects = obj["nodes"]
     self.assertEqual(objects,
     [
         {'children': [1]},
         {'name': 'parent1', 'children': [2]},
         {'name': 'child1_1', 'matrix': [
           1.0,              5.0,              9.0,              0,
           2.0,              6.0,              10.0,              0,
           3.0,              7.0,              11.0,              0,
           4.0,              8.0,              12.0,              1
           ],},
     ])
    def test_gravity_2_node2(self):
        """Test generating gravity for 2 nodes"""
        room = concrete_room.ConcreteRoom()
        parent1 = room.add_child(None, "parent1")
        parent2 = room.add_child(None, "parent2")
        child2_1 = room.add_child("parent2", "child2_1")
        child2_2 = room.add_child("parent2", "child2_2")
        self.assertIsNotNone(parent1)
        self.assertIsNotNone(parent2)
        self.assertIsNotNone(child2_1)
        self.assertIsNotNone(child2_2)

        child2_1.set_gravity_script("FOO", [ concrete_room.Node.GRAVITY_SIMPLE ])
        child2_2.set_gravity_script("BAR", [ concrete_room.Node.GRAVITY_SIMPLE ])

        PATH = "/tmp/gravity"
        pathlib.Path(PATH).mkdir(parents=True, exist_ok=True)
        room.generate_gltf(PATH)

        with open(PATH + "/script.lua", "r") as script_file:
            content = script_file.read()

        self.assertTrue("FOO" in content)
        self.assertTrue("BAR" in content)
        self.assertTrue("function gravity_child2_1(tab_in)" in content)
        self.assertTrue("function gravity_child2_2(tab_in)" in content)
 def test_dump_objects(self):
     """ test dumping hierachy of nodes """
     room = concrete_room.ConcreteRoom()
     parent1 = room.add_child(None, "parent1")
     parent2 = room.add_child(None, "parent2")
     child1_1 = room.add_child("parent1", "child1_1")
     child1_2 = room.add_child("parent1", "child1_2")
     child2_1 = room.add_child("parent2", "child2_1")
     child2_2 = room.add_child("parent2", "child2_2")
     self.assertIsNotNone(parent1)
     self.assertIsNotNone(parent2)
     self.assertIsNotNone(child2_1)
     self.assertIsNotNone(child2_2)
     self.assertIsNotNone(child1_1)
     self.assertIsNotNone(child1_2)
     room.generate_gltf("/tmp")
     with open("/tmp/room.gltf", "r") as room_file:
         obj = json.load(room_file)
     objects = obj["nodes"]
     self.assertEqual(objects,
     [
         {'children': [1, 2]},
         {'name': 'parent1', 'children': [3, 4] },
         {'name': 'parent2', 'children': [5, 6] },
         {'name': 'child1_1'},
         {'name': 'child1_2'},
         {'name': 'child2_1'},
         {'name': 'child2_2'}
     ])
    def test_merge(self):
        """
        test merging 2 concrete rooms. 2nd structure is linked to first
        by the name of one of its node's parent child.
        """
        default_tex = concrete_room.get_texture_definition(
                "texture.png")
        room1 = concrete_room.ConcreteRoom()
        parent1 = room1.add_child(None, "parent1")
        child1_1 = room1.add_child("parent1", "child1_1")
        child1_2 = room1.add_child("parent1", "child1_2")
        index0 = child1_1.add_structure_points([ cgtypes.vec3(0), cgtypes.vec3(1), cgtypes.vec3(2) ])
        self.assertEqual(0, index0)
        child1_1.add_structure_faces(
            index0,
            [ [0,1,2]],
            [concrete_room.Node.CATEGORY_PHYSICS], [concrete_room.Node.HINT_BUILDING], [ 0 ] )

        room2 = concrete_room.ConcreteRoom()
        parent2 = room2.add_child("child1_1", "parent2") # volontarily linked to previous
        child2_1 = room2.add_child("parent2", "child2_1")
        child2_2 = room2.add_child("parent2", "child1_2")
        index0 = child2_1.add_structure_points([ cgtypes.vec3(4), cgtypes.vec3(5), cgtypes.vec3(6) ])
        self.assertEqual(0, index0)
        child2_1.add_structure_faces(
            index0,
            [ [0,1,2]],
            [concrete_room.Node.CATEGORY_PHYSICS], [concrete_room.Node.HINT_BUILDING], [ 0 ] )

        room1.merge(room2)
        nodes = room1.get_objects()
        node_names = [ n.name for n in nodes]
        self.assertEqual(node_names, ['parent1', 'child1_1', 'child1_2', 'parent2', 'child2_1', 'child1_2'])
        room1.generate_gltf("/tmp/")
        with open("/tmp/room.gltf", "r") as room_file:
            obj = json.load(room_file)
        objects = obj["nodes"]
        print(objects)
        self.assertEqual(objects,
            [{'children': [1]},
            {'name': 'parent1', 'children': [2, 3]},
            {'name': 'child1_1', 'children': [4], 'extras': {'phys_faces': [{'data': [0], 'accessor': 1}], 'points': 0}},
            {'name': 'child1_2'},
            {'name': 'parent2', 'children': [5, 6]},
            {'name': 'child2_1', 'extras': {'phys_faces': [{'data': [0], 'accessor': 3}], 'points': 2}},
            {'name': 'child1_2'}])
Beispiel #5
0
 def generate(self):
     selector = selector_regular.SelectorRegular()
     custom_brick = brick.Brick(def_0, selector)
     custom_brick.structure_personalization()
     custom_brick.dressing_instantiation()
     custom_brick.dressing_personalization()
     concrete = concrete_room.ConcreteRoom()
     custom_brick.finalize(concrete)
     return concrete
    def test_trigger_box(self):
        """Test a trigger box"""
        room = concrete_room.ConcreteRoom()
        parent1 = room.add_child(None, "parent1")
        parent2 = room.add_child(None, "parent2")
        self.assertIsNotNone(parent1)
        self.assertIsNotNone(parent2)

        parent1.add_trigger_box(
                    concrete_room.Node.TRIGGER_LEAVE_BOX,
                    concrete_room.Node.TRIGGER_SET_FALSE,
                    cgtypes.vec3(1.0,    2.0,   3.0),
                    cgtypes.vec3(4.0,    5.0,   6.0),
                    "my_event")
        parent1.add_trigger_box(
                    concrete_room.Node.TRIGGER_ENTER_BOX,
                    concrete_room.Node.TRIGGER_SET_TRUE,
                    cgtypes.vec3(7.0,    8.0,   9.0),
                    cgtypes.vec3(10.0,  11.0,  12.0),
                    "my_event_2")

        PATH = "/tmp/triggers"
        pathlib.Path(PATH).mkdir(parents=True, exist_ok=True)
        room.generate_gltf(PATH)

        with open("/tmp/triggers/room.gltf", "r") as room_file:
            obj = json.load(room_file)
        parent_1_object = obj["nodes"][1]
        parent_2_object = obj["nodes"][2]

        print(parent_1_object)
        print(parent_2_object)

        self.assertFalse("extras" in parent_2_object)
        self.assertTrue("extras" in parent_1_object)

        extras = parent_1_object["extras"]
        self.assertTrue("triggers" in extras)
        triggers = extras["triggers"]
        print(triggers)
        self.assertEquals(triggers,
            [
                {
                    'box': [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]],
                    'set_trigger': 'my_event',
                    'is_box_mode_enter': False,
                    'target_value': False
                },
                {
                    'box': [[7.0, 8.0, 9.0], [10.0, 11.0, 12.0]],
                    'set_trigger': 'my_event_2',
                    'is_box_mode_enter': True,
                    'target_value': True
                }
            ])
    def test_get_visual_faces(self):
        """test that we can get visuals only"""
        room = concrete_room.ConcreteRoom()
        parent = room.add_child(None, "parent")
        table_points = [ cgtypes.vec3(0),
                cgtypes.vec3(1),
                cgtypes.vec3(2),
                cgtypes.vec3(3),
                cgtypes.vec3(4),
                cgtypes.vec3(5),
                cgtypes.vec3(6),
                cgtypes.vec3(7),
                ]
        index0 = parent.add_structure_points(table_points)

        list_phys_building = [ [0,1,2], [0,1,3] ]
        parent.add_structure_faces(
            index0,
            list_phys_building,
            concrete_room.Node.CAT_PHYS, [concrete_room.Node.HINT_BUILDING], [ 0 ] )

        list_vis_ceiling = [ [1,2,3], [1,3,4]]
        parent.add_structure_faces(
            index0,
            list_vis_ceiling,
            concrete_room.Node.CAT_VIS, [concrete_room.Node.HINT_CEILING], [ 1 ] )

        list_phys_vis_building = [ [2,3,4], [2,4,5]]
        parent.add_structure_faces(
            index0,
            list_phys_vis_building,
            concrete_room.Node.CAT_PHYS_VIS, [concrete_room.Node.HINT_BUILDING], [ 1 ] )

        list_phys_vis_ceiling = [ [2,3,4], [2,4,5]]
        parent.add_structure_faces(
            index0,
            list_phys_vis_ceiling,
            concrete_room.Node.CAT_PHYS_VIS, [concrete_room.Node.HINT_CEILING], [ 1 ] )

        # check it returns 1 element that matches
        list_building = parent.get_visual_face([concrete_room.Node.HINT_BUILDING])
        self.assertEqual(1, len(list_building))
        self.assertListEqual(list_building[0]["faces"], list_phys_vis_building)

        # check it returns 2 elements that match
        list_ceiling = parent.get_visual_face([concrete_room.Node.HINT_CEILING])
        self.assertEqual(2, len(list_ceiling))
        self.assertListEqual(list_ceiling[0]["faces"], list_vis_ceiling)
        self.assertListEqual(list_ceiling[1]["faces"], list_phys_vis_ceiling)

        # check it returns 0 elements
        list_building_ceiling = parent.get_visual_face(
            [concrete_room.Node.HINT_BUILDING,
            concrete_room.Node.HINT_CEILING])
        self.assertEqual(0, len(list_building_ceiling))
    def test_set_root_node(self):
        """Test setting the root node for all children that don't have a parent"""
        room = concrete_room.ConcreteRoom()
        parent1 = room.add_child(None, "parent1")
        child1_1 = room.add_child("parent1", "child1_1")
        self.assertIsNotNone(parent1)
        self.assertIsNotNone(child1_1)

        room.set_root("my_parent")
        self.assertEqual(room.objects[0].parent, "my_parent")
        self.assertEqual(room.objects[1].parent, "parent1")
    def create_cube(self):
        """ create a cube for future use """
        room = concrete_room.ConcreteRoom()
        parent = room.add_child(None, "parent")
        self.assertIsNotNone(parent)
        parent.add_dressing_faces(
            [
            cgtypes.vec3(0,0,0),
            cgtypes.vec3(0,0,1),
            cgtypes.vec3(0,1,1),
            cgtypes.vec3(0,1,0),

            cgtypes.vec3(1,0,0),
            cgtypes.vec3(1,0,1),
            cgtypes.vec3(1,1,1),
            cgtypes.vec3(1,1,0),
            ],
            [
                # X,Y
                [5,6,2,1],
                [0,3,7,4],
             ],
            concrete_room.get_texture_definition(
                "common/basic/wall.jpg",
                axes=[ ["x",],["y"] ],
                scale=1.0 ))

        parent.add_dressing_faces(
            [
            cgtypes.vec3(0,0,0),
            cgtypes.vec3(0,0,1),
            cgtypes.vec3(0,1,1),
            cgtypes.vec3(0,1,0),

            cgtypes.vec3(1,0,0),
            cgtypes.vec3(1,0,1),
            cgtypes.vec3(1,1,1),
            cgtypes.vec3(1,1,0),
            ],
            [
                # Y,Z
                [0,1,2,3],
                [7,6,5,4],

                # X,Z
                [4,5,1,0],
                [6,7,3,2],
             ],
            concrete_room.get_texture_definition(
                "common/basic/ground.jpg",
                axes=[ ["x", "y"],["z"] ],
                scale=1.0 ))
        return room
 def test_dressing_face_with_function(self):
     """Test creating a simple impl with 1 node with multiple points and faces sets
     for dressing. This tests both multi-textures and merging of faces with the same texture"""
     room = concrete_room.ConcreteRoom()
     self.assertIsNotNone(room)
     parent = room.add_child(None, "parent")
     self.assertIsNotNone(parent)
     parent.add_dressing_faces(
         [ cgtypes.vec3(0), cgtypes.vec3(1), cgtypes.vec3(2) , cgtypes.vec3(3) ],
         [ [0,1,2], [1,2,3] ],
         get_texture_definition_with_function("my_filename_toto", my_helper_mapper, 1))
     parent.add_dressing_faces(
         [  cgtypes.vec3(2) , cgtypes.vec3(3) , cgtypes.vec3(4) ],
         [ [0,1,2] ],
         get_texture_definition_with_function("my_filename_toto", my_helper_mapper, 1))
     parent.add_dressing_faces(
         [ cgtypes.vec3(0), cgtypes.vec3(1), cgtypes.vec3(2) , cgtypes.vec3(3) ],
         [ [0,1,2], [1,2,3], [2,3,0]],
         get_texture_definition_with_function("my_filename_toto2", my_helper_mapper, 1))
     j = json.loads(room.dump_to_json())
     faces = j["objects"][0]["dressing"]
     print(json.dumps(faces, indent=4, sort_keys=True))
     self.assertEqual(faces,
         {
             "my_filename_toto": {
              "faces": [ [ 0,1,2], [3,4,5], [6,7,8] ],
              'points': [
                     {'x': 0.0, 'y': 0.0, 'z': 0.0, 'u': 1.0, 'v': 1.0},
                     {'x': 1.0, 'y': 1.0, 'z': 1.0, 'u': 2.0, 'v': 2.0},
                     {'x': 2.0, 'y': 2.0, 'z': 2.0, 'u': 3.0, 'v': 3.0},
                     {'x': 1.0, 'y': 1.0, 'z': 1.0, 'u': 2.0, 'v': 2.0},
                     {'x': 2.0, 'y': 2.0, 'z': 2.0, 'u': 3.0, 'v': 3.0},
                     {'x': 3.0, 'y': 3.0, 'z': 3.0, 'u': 4.0, 'v': 4.0},
                     {'x': 2.0, 'y': 2.0, 'z': 2.0, 'u': 3.0, 'v': 3.0},
                     {'x': 3.0, 'y': 3.0, 'z': 3.0, 'u': 4.0, 'v': 4.0},
                     {'x': 4.0, 'y': 4.0, 'z': 4.0, 'u': 5.0, 'v': 5.0}]
         }, "my_filename_toto2": {
             "faces": [ [ 0,1,2], [3,4,5], [6,7,8] ],
             'points': [
                     {'x': 0.0, 'y': 0.0, 'z': 0.0, 'u': 1.0, 'v': 1.0},
                     {'x': 1.0, 'y': 1.0, 'z': 1.0, 'u': 2.0, 'v': 2.0},
                     {'x': 2.0, 'y': 2.0, 'z': 2.0, 'u': 3.0, 'v': 3.0},
                     {'x': 1.0, 'y': 1.0, 'z': 1.0, 'u': 2.0, 'v': 2.0},
                     {'x': 2.0, 'y': 2.0, 'z': 2.0, 'u': 3.0, 'v': 3.0},
                     {'x': 3.0, 'y': 3.0, 'z': 3.0, 'u': 4.0, 'v': 4.0},
                     {'x': 2.0, 'y': 2.0, 'z': 2.0, 'u': 3.0, 'v': 3.0},
                     {'x': 3.0, 'y': 3.0, 'z': 3.0, 'u': 4.0, 'v': 4.0},
                     {'x': 0.0, 'y': 0.0, 'z': 0.0, 'u': 1.0, 'v': 1.0}],
         }})
Beispiel #11
0
    def finalize(self, level_directory=None, preview=False):
        """ Perform final generate and dressing on one room."""

        concrete = concrete_room.ConcreteRoom()

        for brick in self.values["bricks"]:
            logger.info("in brick %s" % brick.values.b_id)
            concrete_brick = concrete_room.ConcreteRoom()
            brick.finalize(concrete_brick)
            concrete_brick.append_prefix(brick.values.b_id + "_")
            if "root_pad" in brick.values:
                root_id = brick.values.root_pad.ref_b_id + "_" + brick.values.root_pad.ref_pad_id
                logger.info("set root pad to: %s", root_id)
                concrete_brick.set_root(root_id)
            concrete.merge(concrete_brick)

        if level_directory == None:
            level_directory = self.level_directory
        room_path = level_directory + "/" + self.name
        pathlib.Path(room_path).mkdir(parents=True, exist_ok=True)
        concrete.generate_gltf(room_path)
        if preview:
            concrete_room.preview(room_path + "/room.gltf",
                                  room_path + "/room_preview.gltf")
    def test_parent_child(self):
        """Test creating a simple impl with parent/child relationships for nodes"""
        room = concrete_room.ConcreteRoom()
        mat_parent2 = cgtypes.mat4(2.0)
        parent1 = room.add_child(None, "parent1")
        parent2 = room.add_child(None, "parent2" , mat_parent2)
        child2_1 = room.add_child("parent2", "child2_1")
        child2_2 = room.add_child("parent2", "child2_2")
        self.assertIsNotNone(parent1)
        self.assertIsNotNone(parent2)
        self.assertIsNotNone(child2_1)
        self.assertIsNotNone(child2_2)

        j = room.dump_to_json()
        print(j)
Beispiel #13
0
 def test_generate_0_pad(self):
     """generate one rectangular with no pad"""
     stream_handler = logging.StreamHandler(sys.stdout)
     logger.addHandler(stream_handler)
     selector = selector_regular.SelectorRegular()
     custom_brick = brick.Brick(brick_0_pad, selector)
     custom_brick.structure = sphere.BrickSphere().get_instance(
         custom_brick)
     custom_brick.dressing = basic.DressingBasic().get_instance(
         custom_brick)
     custom_brick.structure_personalization()
     custom_brick.dressing_instantiation()
     custom_brick.dressing_personalization()
     concrete = concrete_room.ConcreteRoom()
     custom_brick.finalize(concrete)
     self.assertEqual(len(concrete.objects), 1)
    def test_append_prefix(self):
        """Test setting a prefix to all nodes"""
        room = concrete_room.ConcreteRoom()
        parent1 = room.add_child(None, "parent1")
        parent2 = room.add_child(None, "parent2")
        child2_1 = room.add_child("parent2", "child2_1")
        child2_2 = room.add_child("parent2", "child2_2")
        self.assertIsNotNone(parent1)
        self.assertIsNotNone(parent2)
        self.assertIsNotNone(child2_1)
        self.assertIsNotNone(child2_2)

        room.append_prefix("prefix:")
        self.assertEqual(room.objects[0].name, "prefix:parent1")
        self.assertEqual(room.objects[1].name, "prefix:parent2")
        self.assertEqual(room.objects[2].name, "prefix:child2_1")
        self.assertEqual(room.objects[3].name, "prefix:child2_2")
 def test_generate_0_pad_values(self):
     """generate one rectangular with no pad"""
     stream_handler = logging.StreamHandler(sys.stdout)
     logger.addHandler(stream_handler)
     selector = selector_regular.SelectorRegular()
     custom_brick = brick.Brick(brick_1_pad_values, selector)
     custom_brick.structure = rectangular.BrickRectangular().get_instance(custom_brick)
     custom_brick.dressing = basic.DressingBasic().get_instance(custom_brick)
     custom_brick.structure_personalization()
     logger.info(custom_brick.values.parameters)
     self.assertEqual(custom_brick.values.parameters.structure_private ,
                      {'size': [1.0, 2.0, 3.0]})
     custom_brick.dressing_instantiation()
     custom_brick.dressing_personalization()
     concrete = concrete_room.ConcreteRoom()
     custom_brick.finalize(concrete)
     self.assertEqual(len(concrete.objects) , 1)
 def test_structure_faces(self):
     """Test creating a simple impl with 1 node with multiple points and faces
     sets for structure"""
     room = concrete_room.ConcreteRoom()
     self.assertIsNotNone(room)
     parent = room.add_child(None, "parent")
     self.assertIsNotNone(parent)
     index0 = parent.add_structure_points([ cgtypes.vec3(0), cgtypes.vec3(1), cgtypes.vec3(2) ])
     self.assertEqual(0, index0)
     index1 = parent.add_structure_points([ cgtypes.vec3(3), cgtypes.vec3(4), cgtypes.vec3(5) ])
     self.assertEqual(3, index1)
     parent.add_structure_faces(
         index1,
         [ [0,1,2], [3,4,5], [6,7,8] ],
         [concrete_room.Node.CATEGORY_PHYSICS], [concrete_room.Node.HINT_BUILDING], [ 0 ] )
     parent.add_structure_faces(
         index1,
         [ [9,10,11], [12,13,14]],
         [concrete_room.Node.CATEGORY_PHYSICS], [concrete_room.Node.HINT_CEILING], [ 1 ] )
     j = json.loads(room.dump_to_json())
     points = j["objects"][0]["structure_points"]
     self.assertEqual(points,
     [{'x': 0.0, 'y': 0.0, 'z': 0.0},
     {'x': 1.0, 'y': 1.0, 'z': 1.0},
     {'x': 2.0, 'y': 2.0, 'z': 2.0},
     {'x': 3.0, 'y': 3.0, 'z': 3.0},
     {'x': 4.0, 'y': 4.0, 'z': 4.0},
     {'x': 5.0, 'y': 5.0, 'z': 5.0}])
     faces = j["objects"][0]["structure_faces"]
     self.assertEqual(faces,
         [
             {
                 'faces': [[3, 4, 5], [6, 7, 8], [9, 10, 11]],
                 'category': ['phy'],
                 'hints': ['building'],
                 'physics': [0]
             },
             {
                 'faces': [[12, 13, 14], [15, 16, 17]],
                 'category': ['phy'],
                 'hints': ['ceiling'],
                 'physics': [1]
             }
         ])
 def test_dump_1_face_3_points(self):
     """ test dumping 1 face with 3 points (aka triangle)  """
     room = concrete_room.ConcreteRoom()
     parent = room.add_child(None, "parent")
     self.assertIsNotNone(parent)
     parent.add_dressing_faces(
         [cgtypes.vec3(0,0,0),
         cgtypes.vec3(0,0,1),
         cgtypes.vec3(0,1,0) ],
         [ [0,1,2] ],
         concrete_room.get_texture_definition(
             "texture.png",
             axes=[ ["y"],["z"] ],
             scale=1.0 ))
     room.generate_gltf("/tmp")
     with open("/tmp/room.gltf", "r") as room_file:
         obj = json.load(room_file)
     parent_object = obj["nodes"][1]
     print(parent_object)
 def test_dressing_faces(self):
     """Test creating a simple impl with 1 node with multiple points and faces sets
     for dressing. This tests both multi-textures and merging of faces with the same texture"""
     room = concrete_room.ConcreteRoom()
     self.assertIsNotNone(room)
     parent = room.add_child(None, "parent")
     self.assertIsNotNone(parent)
     parent.add_dressing_faces(
         [ cgtypes.vec3(0), cgtypes.vec3(1), cgtypes.vec3(2) , cgtypes.vec3(3) ],
         [ [0,1,2], [1,2,3], [2,3,0] ],
         concrete_room.get_texture_definition("myfilename"))
     parent.add_dressing_faces(
         [  cgtypes.vec3(2) , cgtypes.vec3(3) , cgtypes.vec3(4) ],
         [ [0,1,2] ],
         concrete_room.get_texture_definition("myfilename"))
     parent.add_dressing_faces(
         [ cgtypes.vec3(0), cgtypes.vec3(1), cgtypes.vec3(2) , cgtypes.vec3(3) ],
         [ [0,1,2], [1,2,3], [2,3,0]],
         concrete_room.get_texture_definition("myfilename2"))
     j = json.loads(room.dump_to_json())
     faces = j["objects"][0]["dressing"]
     print(faces)
     self.assertEqual(faces, {
         'myfilename': {
             'points': [
                 {'x': 0.0, 'y': 0.0, 'z': 0.0, 'u': 0.0, 'v': 0.0},
                 {'x': 1.0, 'y': 1.0, 'z': 1.0, 'u': 1.0, 'v': 1.0},
                 {'x': 2.0, 'y': 2.0, 'z': 2.0, 'u': 2.0, 'v': 2.0},
                 {'x': 3.0, 'y': 3.0, 'z': 3.0, 'u': 3.0, 'v': 3.0},
                 {'x': 4.0, 'y': 4.0, 'z': 4.0, 'u': 4.0, 'v': 4.0}],
             'faces': [
                 [0, 1, 2], [1, 2, 3], [2, 3, 0], [2, 3, 4]]},
         'myfilename2': {
             'points': [
                 {'x': 0.0, 'y': 0.0, 'z': 0.0, 'u': 0.0, 'v': 0.0},
                 {'x': 1.0, 'y': 1.0, 'z': 1.0, 'u': 1.0, 'v': 1.0},
                 {'x': 2.0, 'y': 2.0, 'z': 2.0, 'u': 2.0, 'v': 2.0},
                 {'x': 3.0, 'y': 3.0, 'z': 3.0, 'u': 3.0, 'v': 3.0}],
             'faces': [
                 [0, 1, 2], [1, 2, 3], [2, 3, 0]
         ]}}
     )
    def test_dressing_face_with_simple_mapper(self):
        """Test creating a simple impl with 1 node with multiple points and faces sets
        for dressing. This tests both multi-textures and merging of faces with the same texture"""
        room = concrete_room.ConcreteRoom()
        self.assertIsNotNone(room)
        parent = room.add_child(None, "parent")
        self.assertIsNotNone(parent)
        parent.add_dressing_faces(
            [
             cgtypes.vec3(0.0, 0.0, 0.0), # O
             cgtypes.vec3(1.0, 0.0, 0.0), # Ox
             cgtypes.vec3(0.0, 1.0, 0.0), # Oy
             cgtypes.vec3(0.0, 0.0, 1.0)  # Oz
            ],
            [ [0, 1, 2, 3], [0, 2, 1], [0, 3, 1] ],
            gltf_helper.get_texture_definition_function_simple_mapper("my_filename_toto"))
        j = json.loads(room.dump_to_json())
        faces = j["objects"][0]["dressing"]
        print(json.dumps(faces, indent=4, sort_keys=True))
        self.assertEqual(faces,
            {
    "my_filename_toto": {
        "faces": [
            [ 0,1,2,3], [4,5,6], [7,8,9]
        ],
        "points": [
            { "u": 0.0, "v": 0.0, "x": 0.0, "y": 0.0, "z": 0.0 },
            { "u": 1.0, "v": 0.0, "x": 1.0, "y": 0.0, "z": 0.0 },
            { "u": 0.0, "v": 0.0, "x": 0.0, "y": 1.0, "z": 0.0 },
            { "u": 0.0, "v": 1.0, "x": 0.0, "y": 0.0, "z": 1.0 },
            { "u": 0.0, "v": 0.0, "x": 0.0, "y": 0.0, "z": 0.0 },
            { "u": 1.0, "v": 0.0, "x": 0.0, "y": 1.0, "z": 0.0 },
            { "u": 0.0, "v": 1.0, "x": 1.0, "y": 0.0, "z": 0.0 },
            { "u": 0.0, "v": 0.0, "x": 0.0, "y": 0.0, "z": 0.0 },
            { "u": 1.0, "v": 0.0, "x": 0.0, "y": 0.0, "z": 1.0 },
            { "u": 0.0, "v": 1.0, "x": 1.0, "y": 0.0, "z": 0.0 }
        ]
    }
}

)
 def test_dressing_filter_points(self):
     """test filtering points when adding faces, so that only useful points are kept
     and there is no useless data"""
     room = concrete_room.ConcreteRoom()
     self.assertIsNotNone(room)
     parent = room.add_child(None, "parent")
     self.assertIsNotNone(parent)
     parent.add_dressing_faces(
         [
             cgtypes.vec3(0),
             cgtypes.vec3(1),
             cgtypes.vec3(1),
             cgtypes.vec3(2),
             cgtypes.vec3(3),
             cgtypes.vec3(4),
             cgtypes.vec3(5),
             cgtypes.vec3(6),
             cgtypes.vec3(7),
             cgtypes.vec3(8),
             cgtypes.vec3(9),
             cgtypes.vec3(10)
         ],
         [ [1,2,3], [2,3,4], [6,7,8]],
         concrete_room.get_texture_definition("myfilename"))
     j = json.loads(room.dump_to_json())
     faces = j["objects"][0]["dressing"]
     print(faces)
     self.assertEqual(faces, {
         'myfilename': {
             'points': [
                 {'x': 1.0, 'y': 1.0, 'z': 1.0, 'u': 1.0, 'v': 1.0},
                 {'x': 2.0, 'y': 2.0, 'z': 2.0, 'u': 2.0, 'v': 2.0},
                 {'x': 3.0, 'y': 3.0, 'z': 3.0, 'u': 3.0, 'v': 3.0},
                 {'x': 5.0, 'y': 5.0, 'z': 5.0, 'u': 5.0, 'v': 5.0},
                 {'x': 6.0, 'y': 6.0, 'z': 6.0, 'u': 6.0, 'v': 6.0},
                 {'x': 7.0, 'y': 7.0, 'z': 7.0, 'u': 7.0, 'v': 7.0}],
             'faces': [
                 [0, 0, 1],
                 [0, 1, 2],
                 [3, 4, 5]]}})
Beispiel #21
0
    def test_generate(self):
        """generate one simple door with no parameter"""
        stream_handler = logging.StreamHandler(sys.stdout)
        logger.addHandler(stream_handler)
        selector = selector_regular.SelectorRegular()
        custom_brick = brick.Brick(def_0, selector)
        custom_brick.structure_personalization()
        custom_brick.dressing_instantiation()
        custom_brick.dressing_personalization()
        concrete = concrete_room.ConcreteRoom()
        custom_brick.finalize(concrete)

        # check that it contains an object with expected parent
        objects = concrete.get_objects()
        self.assertEquals(len(objects), 1)
        object = objects[0]
        self.assertEquals(object.parent, None)

        # check there is a portal to an outer world (sounds nice, he ?)
        phys_faces = object.get_physical_faces()
        portal_faces = [ faces for faces in phys_faces if object.PHYS_TYPE_PORTAL == faces["physics"]["type"] ]
        self.assertEquals(len(portal_faces), 1)
        portal_face = portal_faces[0]
        self.assertEquals(portal_face["physics"], {'type': 'portal', 'connect': 'A', 'gate' : 'gate0'})
Beispiel #22
0
    def test_generate_1_physics_1_visual_1_both(self):
        """ test generate 1 phys, 1 vis, 1 both"""
        stream_handler = logging.StreamHandler(sys.stdout)
        logger.addHandler(stream_handler)

        concrete = concrete_room.ConcreteRoom()
        parent = concrete.add_child(None, "parent")
        points = [
            cgtypes.vec3(0.0, 0.0, 0.0),
            cgtypes.vec3(1.0, 0.0, 0.0),
            cgtypes.vec3(0.0, 1.0, 0.0),
            cgtypes.vec3(0.0, 0.0, 1.0)
        ]
        index0 = parent.add_structure_points(points)
        parent.add_structure_faces(index0, [[0, 1, 2]],
                                   concrete_room.Node.CAT_PHYS,
                                   [concrete_room.Node.HINT_WALL], [0])
        parent.add_structure_faces(index0, [[1, 2, 3]],
                                   concrete_room.Node.CAT_VIS,
                                   [concrete_room.Node.HINT_WALL], [0])
        parent.add_structure_faces(index0, [[2, 3, 0]],
                                   [concrete_room.Node.CAT_PHYS_VIS],
                                   [concrete_room.Node.HINT_WALL], [0])

        basic1 = basic.DressingBasic()

        basic1.generate(concrete)
        print(parent.dressing)

        path_gen = "/tmp/test_basic/output"
        pathlib.Path(path_gen).mkdir(parents=True, exist_ok=True)

        concrete.generate_gltf(path_gen)

        concrete_room.preview(path_gen + "/room.gltf",
                              path_gen + "/room_preview.gltf")
    def test_dump_cube(self):
        """ test dumping 1 face with 3 points (aka triangle) . Test preview dump """
        room = concrete_room.ConcreteRoom()
        parent = room.add_child(None, "parent")
        self.assertIsNotNone(parent)
        parent.add_dressing_faces(
            [
            cgtypes.vec3(0,0,0),
            cgtypes.vec3(0,0,1),
            cgtypes.vec3(0,1,1),
            cgtypes.vec3(0,1,0),

            cgtypes.vec3(1,0,0),
            cgtypes.vec3(1,0,1),
            cgtypes.vec3(1,1,1),
            cgtypes.vec3(1,1,0),
            ],
            [
                # X,Y
                [5,6,2,1],
                [0,3,7,4],
             ],
            concrete_room.get_texture_definition(
                "common/basic/wall.jpg",
                axes=[ ["x",],["y"] ],
                scale=1.0 ))

        parent.add_dressing_faces(
            [
            cgtypes.vec3(0,0,0),
            cgtypes.vec3(0,0,1),
            cgtypes.vec3(0,1,1),
            cgtypes.vec3(0,1,0),

            cgtypes.vec3(1,0,0),
            cgtypes.vec3(1,0,1),
            cgtypes.vec3(1,1,1),
            cgtypes.vec3(1,1,0),
            ],
            [
                # Y,Z
                [0,1,2,3],
                [7,6,5,4],

                # X,Z
                [4,5,1,0],
                [6,7,3,2],
             ],
            concrete_room.get_texture_definition(
                "common/basic/ground.jpg",
                axes=[ ["x", "y"],["z"] ],
                scale=1.0 ))

        path_gen = "/tmp/test_cube/output"
        pathlib.Path(path_gen).mkdir(parents=True, exist_ok=True)
        room.generate_gltf(path_gen)
        with open(path_gen + "/room.gltf", "r") as room_file:
            obj = json.load(room_file)
        parent_object = obj["nodes"][1]
        print(parent_object)
        concrete_room.preview(path_gen + "/room.gltf", path_gen + "/room_preview.gltf")
 def test_structure_faces_dump(self):
     """Test generation of structural faces in gltf file"""
     room = concrete_room.ConcreteRoom()
     parent = room.add_child(None, "parent")
     self.assertIsNotNone(parent)
     index0 = parent.add_structure_points([
         cgtypes.vec3(0),
         cgtypes.vec3(1),
         cgtypes.vec3(2),
         cgtypes.vec3(3),
         cgtypes.vec3(4),
         cgtypes.vec3(5),
         cgtypes.vec3(6),
         cgtypes.vec3(7),
         ])
     self.assertEqual(0, index0)
     data_0 = { "type":"gate", "gate_target":"roomX"} # intended to be added as is
     parent.add_structure_faces(
         index0,
         [ [0,1,2,3], [4,5,6,7] ],
         [concrete_room.Node.CATEGORY_PHYSICS], [concrete_room.Node.HINT_BUILDING], data_0 )
     data_1 = { "any_other_metadata" : 0 } # intended to be added as is
     parent.add_structure_faces(
         index0,
         [ [0,2,4]],
         [concrete_room.Node.CATEGORY_PHYSICS], [concrete_room.Node.HINT_BUILDING],
             data_1 )
     path_gen = "/tmp/test_dump_structure_faces"
     pathlib.Path(path_gen).mkdir(parents=True, exist_ok=True)
     room.generate_gltf(path_gen)
     with open(path_gen + "/room.gltf", "r") as room_file:
         obj = json.load(room_file)
     parent_object = obj["nodes"][1]
     self.assertEqual(parent_object, {
         'name': 'parent',
         'extras': {
             'phys_faces': [
                 {
                 'data': data_0,
                 'accessor': 1 # expect in call order, although not in contract
                 }, {
                 'data':data_1,
                 'accessor': 2 # expect in call order, although not in contract
                 }],
             'points': 0 # 'points first' not in contract
             }
         }
     )
     # check points
     data_points = self.get_data_from_accessor(obj, 0, path_gen)
     self.assertEquals(len(data_points), 8)
     self.assertEquals(data_points[0], cgtypes.vec3(0))
     self.assertEquals(data_points[1], cgtypes.vec3(1))
     self.assertEquals(data_points[2], cgtypes.vec3(2))
     self.assertEquals(data_points[3], cgtypes.vec3(3))
     self.assertEquals(data_points[4], cgtypes.vec3(4))
     self.assertEquals(data_points[5], cgtypes.vec3(5))
     self.assertEquals(data_points[6], cgtypes.vec3(6))
     self.assertEquals(data_points[7], cgtypes.vec3(7))
     # check 1st row of indexes
     data_points = self.get_data_from_accessor(obj, 1, path_gen)
     self.assertEquals(len(data_points), 10)
     self.assertEquals(data_points, [4, 0, 1, 2, 3, 4, 4, 5, 6, 7])
     # check 2nd row of indexes
     data_points = self.get_data_from_accessor(obj, 2, path_gen)
     self.assertEquals(len(data_points), 4)
     self.assertEquals(data_points, [3, 0, 2, 4])