Example #1
0
        def add_object(obj, matrix, id):
            if obj.display_type in [
                    'TEXTURED', 'SOLID'
            ] and obj.type in ('MESH', 'CURVE', 'SURFACE', 'META', 'FONT'):
                name = MaltMeshes.get_mesh_name(obj)
                if depsgraph.mode == 'RENDER':
                    name = '___F12___' + name

                if name not in meshes:
                    # (Uses obj.original) Malt Parameters are not present in the evaluated mesh
                    parameters = obj.original.data.malt_parameters.get_parameters(
                        overrides, scene.proxys)
                    malt_mesh = None

                    if depsgraph.mode == 'VIEWPORT':
                        malt_mesh = MaltMeshes.get_mesh(obj)
                    else:  #always load the mesh for final renders
                        malt_mesh = MaltMeshes.load_mesh(obj, name)

                    if malt_mesh:
                        meshes[name] = [
                            Scene.Mesh(submesh, parameters)
                            for submesh in malt_mesh
                        ]
                        for i, mesh in enumerate(meshes[name]):
                            scene.proxys[('mesh', name, i)] = mesh.mesh
                    else:
                        meshes[name] = None

                mesh = meshes[name]
                if mesh is None:
                    return

                scale = matrix.to_scale()
                mirror_scale = scale[0] * scale[1] * scale[2] < 0.0
                matrix = flatten_matrix(matrix)

                obj_parameters = obj.malt_parameters.get_parameters(
                    overrides, scene.proxys)
                obj_parameters['ID'] = id

                if len(obj.material_slots) > 0:
                    for i, slot in enumerate(obj.material_slots):
                        material = default_material
                        if slot.material and slot.material.malt.get_source_path(
                        ) != '':
                            material_name = slot.material.name_full
                            material_key = ('material', material_name)
                            if material_key not in scene.proxys.keys():
                                path = slot.material.malt.get_source_path()
                                shader_parameters = slot.material.malt.parameters.get_parameters(
                                    overrides, scene.proxys)
                                material_parameters = slot.material.malt_parameters.get_parameters(
                                    overrides, scene.proxys)
                                from Bridge.Proxys import MaterialProxy
                                scene.proxys[material_key] = MaterialProxy(
                                    path, shader_parameters,
                                    material_parameters)
                            material = scene.proxys[material_key]
                        if override_material: material = override_material
                        result = Scene.Object(matrix, mesh[i], material,
                                              obj_parameters, mirror_scale)
                        scene.objects.append(result)
                else:
                    material = default_material
                    if override_material: material = override_material
                    result = Scene.Object(matrix, mesh[0], material,
                                          obj_parameters, mirror_scale)
                    scene.objects.append(result)

            elif obj.type == 'LIGHT':
                if obj.data.type == 'AREA':
                    return  #Not supported

                malt_light = obj.data.malt

                light = Scene.Light()
                light.color = tuple(obj.data.color * malt_light.strength)
                light.position = tuple(obj.matrix_world.translation)
                light.direction = tuple(
                    obj.matrix_world.to_quaternion() @ Vector(
                        (0.0, 0.0, -1.0)))
                light.radius = malt_light.radius
                light.spot_angle = malt_light.spot_angle
                light.spot_blend = malt_light.spot_blend_angle
                light.parameters = obj.data.malt_parameters.get_parameters(
                    overrides, scene.proxys)

                types = {
                    'SUN': 1,
                    'POINT': 2,
                    'SPOT': 3,
                }
                light.type = types[obj.data.type]

                if light.type == types['SUN']:
                    light.matrix = flatten_matrix(
                        matrix.to_quaternion().to_matrix().to_4x4().inverted())
                else:
                    #Scaling too ????
                    light.matrix = flatten_matrix(matrix.inverted())

                scene.lights.append(light)
Example #2
0
        def add_object(obj, matrix):
            if obj.display_type in [
                    'TEXTURED', 'SOLID'
            ] and obj.type in ('MESH', 'CURVE', 'SURFACE', 'FONT'):
                material = None
                if len(obj.material_slots
                       ) > 0 and obj.material_slots[0].material:
                    blend_material = obj.material_slots[0].material
                    material_name = blend_material.name_full
                    if material_name not in materials.keys():
                        #load material
                        shader = blend_material.malt.get_shader()
                        if shader:
                            pipeline_shaders = shader[
                                self.get_pipeline().__class__.__name__]
                            parameters = blend_material.malt_parameters.get_parameters(
                            )
                            materials[material_name] = Scene.Material(
                                pipeline_shaders, parameters)
                        else:
                            materials[material_name] = None
                    material = materials[material_name]

                if obj.name_full not in meshes:
                    # (Uses obj.original) Malt Parameters are not present in the evaluated mesh
                    parameters = obj.original.data.malt_parameters.get_parameters(
                    )
                    meshes[obj.name_full] = Scene.Mesh(None, parameters)
                    if depsgraph.mode == 'VIEWPORT':
                        meshes[obj.name_full].mesh = MaltMeshes.get_mesh(obj)
                    else:  #always load the mesh for final renders
                        meshes[obj.name_full].mesh = MaltMeshes.load_mesh(obj)

                mesh = meshes[obj.name_full]
                if mesh is None:
                    return
                scale = matrix.to_scale()
                matrix = flatten_matrix(matrix)
                result = Scene.Object(matrix, mesh, material,
                                      obj.malt_parameters.get_parameters())
                if scale[0] * scale[1] * scale[2] < 0.0:
                    result.negative_scale = True
                scene.objects.append(result)

            elif obj.type == 'LIGHT':
                if obj.data.type == 'AREA':
                    return  #Not supported

                malt_light = obj.data.malt

                light = Scene.Light()
                light.color = tuple(malt_light.color)
                light.position = tuple(obj.matrix_world.translation)
                light.direction = tuple(
                    obj.matrix_world.to_quaternion() @ Vector(
                        (0.0, 0.0, -1.0)))
                light.radius = malt_light.radius
                light.spot_angle = malt_light.spot_angle
                light.spot_blend = malt_light.spot_blend_angle
                light.parameters = obj.malt_parameters.get_parameters()

                types = {
                    'SUN': 1,
                    'POINT': 2,
                    'SPOT': 3,
                }
                light.type = types[obj.data.type]

                if light.type == types['SUN']:
                    light.matrix = flatten_matrix(
                        matrix.to_quaternion().to_matrix().to_4x4().inverted())
                else:
                    #Scaling too ????
                    light.matrix = flatten_matrix(matrix.inverted())

                scene.lights.append(light)
Example #3
0
        def add_object(obj, matrix):
            if obj.display_type in ['TEXTURED','SOLID'] and obj.type in ('MESH','CURVE','SURFACE','FONT'):
                name = MaltMeshes.get_mesh_name(obj)
                if name not in meshes:
                    # (Uses obj.original) Malt Parameters are not present in the evaluated mesh
                    parameters = obj.original.data.malt_parameters.get_parameters(overrides, resources)
                    malt_mesh = None
                    
                    if depsgraph.mode == 'VIEWPORT':
                        malt_mesh = MaltMeshes.get_mesh(obj)
                    else: #always load the mesh for final renders
                        malt_mesh = MaltMeshes.load_mesh(obj)
                    
                    if malt_mesh:
                        meshes[name] = [Scene.Mesh(submesh, parameters) for submesh in malt_mesh]
                    else:
                        meshes[name] = None

                mesh = meshes[name]
                if mesh is None:
                    return
                
                scale = matrix.to_scale()
                mirror_scale = scale[0]*scale[1]*scale[2] < 0.0
                matrix = flatten_matrix(matrix)

                obj_parameters = obj.malt_parameters.get_parameters(overrides, resources)
                
                if len(obj.material_slots) > 0:
                    for i, slot in enumerate(obj.material_slots):
                        material = None
                        if slot.material:
                            material_name = slot.material.name_full
                            if material_name not in materials.keys():
                                shader = {
                                    'path': bpy.path.abspath(slot.material.malt.shader_source),
                                    'parameters': slot.material.malt.parameters.get_parameters(overrides, resources)
                                }
                                parameters = slot.material.malt_parameters.get_parameters(overrides, resources)
                                materials[material_name] = Scene.Material(shader, parameters)
                            material = materials[material_name]
                        result = Scene.Object(matrix, mesh[i], material, obj_parameters, mirror_scale)
                        scene.objects.append(result)
                else:
                    result = Scene.Object(matrix, mesh[0], None, obj_parameters, mirror_scale)
                    scene.objects.append(result)
           
            elif obj.type == 'LIGHT':
                if obj.data.type == 'AREA':
                    return #Not supported

                malt_light = obj.data.malt

                light = Scene.Light()
                light.color = tuple(malt_light.color)
                light.position = tuple(obj.matrix_world.translation)
                light.direction = tuple(obj.matrix_world.to_quaternion() @ Vector((0.0,0.0,-1.0)))
                light.radius = malt_light.radius
                light.spot_angle = malt_light.spot_angle
                light.spot_blend = malt_light.spot_blend_angle
                light.parameters = obj.data.malt_parameters.get_parameters(overrides, resources)

                types = {
                    'SUN' : 1,
                    'POINT' : 2,
                    'SPOT' : 3,
                }
                light.type = types[obj.data.type]

                if light.type == types['SUN']:
                    light.matrix = flatten_matrix(matrix.to_quaternion().to_matrix().to_4x4().inverted())
                else:
                    #Scaling too ????
                    light.matrix = flatten_matrix(matrix.inverted())
                
                scene.lights.append(light)