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)
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)
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)