X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=blender%2Fio_mspgl%2Fexport_material.py;h=8619142e9b4dff53d4543c2b8a3e31dde6cff016;hp=86fce780c00b22e151aaa04ee79f0941d2ddf3a8;hb=5c3e77f72d30b93ab775eb41eba4efcdabb0f074;hpb=725fccf49be5669a5a74f267eb409bf2fc071e05 diff --git a/blender/io_mspgl/export_material.py b/blender/io_mspgl/export_material.py index 86fce780..8619142e 100644 --- a/blender/io_mspgl/export_material.py +++ b/blender/io_mspgl/export_material.py @@ -1,38 +1,24 @@ import os -def linear_to_srgb(l): - if l<0.0031308: - return 12.92*l - else: - return 1.055*(l**(1/2.4))-0.055 - -def get_colormap(srgb): - if srgb: - return linear_to_srgb - else: - return lambda x: x - -def image_name(i): - fp = i.filepath - if fp: - return os.path.split(fp)[1] - else: - return i.name - - class MaterialExporter: def __init__(self): - self.textures = 'REF' + self.single_file = True + self.use_textures = True - def export_technique_resources(self, material, resources): + def create_texture_exporter(self): from .export_texture import TextureExporter texture_export = TextureExporter() + texture_export.inline_data = self.single_file + return texture_export + + def export_technique_resources(self, material, resources): + texture_export = self.create_texture_exporter() mat_name = material.name+".mat" if mat_name not in resources: resources[mat_name] = self.export_material(material) - if self.textures=='INLINE': + if self.use_textures: for s in material.texture_slots: if s and s.texture.type=='IMAGE' and s.texture.image: tex_name = s.texture.name+".tex2d" @@ -45,35 +31,50 @@ class MaterialExporter: mat_res = resources[material.name+".mat"] textures = {} - if self.textures!='NONE': + if self.use_textures: image_texture_slots = [s for s in material.texture_slots if s and s.texture.type=='IMAGE' and s.texture.image] for s in image_texture_slots: if s.use_map_color_diffuse: textures["diffuse_map"] = s.texture elif s.use_map_normal: - textures["normal_map"] = s.texture + if s.texture.use_normal_map: + textures["normal_map"] = s.texture + else: + textures["displace_map"] = s.texture if material.technique: - if not obj.inherit_tech: - return [] + if not material.inherit_tech: + return tech_res + + if self.single_file: + raise Exception("Can't export inherited technique to a single file") st = Statement("inherit", material.technique) for s, t in textures.items(): - st.sub.append(Statement("texture", s, image_name(t.image))) + if t.default_filter and t.image.filepath: + st.sub.append(Statement("texture", s, os.path.basename(t.image.filepath))) + else: + st.sub.append(tech_res.create_reference_statement("texture", s, resources[t.name+".tex2d"])) if material.override_material: st.sub.append(tech_res.create_reference_statement("material", "surface", mat_res)) tech_res.statements.append(st) else: st = Statement("pass", "") - st.sub.append(tech_res.create_embed_statement("material", mat_res)) + if self.single_file: + st.sub.append(tech_res.create_embed_statement("material", mat_res)) + else: + st.sub.append(tech_res.create_reference_statement("material", mat_res)) if "diffuse_map" in textures: diffuse_tex = textures["diffuse_map"] + tex_res = resources[diffuse_tex.name+".tex2d"] ss = Statement("texunit", 0) - if self.textures=='INLINE': - ss.sub.append(tech_res.create_embed_statement("texture2d", resources[diffuse_tex.name+".tex2d"])) + if self.single_file: + ss.sub.append(tech_res.create_embed_statement("texture2d", tex_res)) + elif diffuse_tex.default_filter and diffuse_tex.image.filepath: + ss.sub.append(Statement("texture", os.path.basename(diffuse_tex.image.filepath))) else: - ss.sub.append(Statement("texture", image_name(diffuse_tex.image))) + ss.sub.append(tech_res.create_reference_statement("texture", tex_res)) st.sub.append(ss) tech_res.statements.append(st) @@ -85,7 +86,9 @@ class MaterialExporter: mat_res = Resource(material.name+".mat") statements = mat_res.statements + from .util import get_colormap cm = get_colormap(material.srgb_colors) + if any(s.use_map_color_diffuse for s in material.texture_slots if s): statements.append(Statement("diffuse", 1.0, 1.0, 1.0, 1.0)) amb = cm(material.ambient) @@ -100,3 +103,60 @@ class MaterialExporter: statements.append(Statement("shininess", material.specular_hardness)) return mat_res + + +class MaterialMapExporter: + def __init__(self): + self.single_file = True + + def export_technique_resources(self, material_map, resources): + from .datafile import Resource, Statement, Token + diffuse_name = material_map.name+"_diffuse.tex2d" + if diffuse_name not in resources: + diffuse_res = Resource(diffuse_name) + + fmt = 'SRGB_ALPHA' if material_map.srgb_colors else 'RGBA' + + diffuse_res.statements.append(Statement("min_filter", Token('NEAREST'))) + diffuse_res.statements.append(Statement("mag_filter", Token('NEAREST'))) + diffuse_res.statements.append(Statement("storage", Token(fmt), *material_map.size)) + diffuse_res.statements.append(Statement("raw_data", material_map.diffuse_data)) + + resources[diffuse_name] = diffuse_res + + if "basic_white.mat" not in resources: + mat_res = Resource("basic_white.mat") + mat_res.statements.append(Statement("diffuse", 1.0, 1.0, 1.0, 1.0)) + + resources["basic_white.mat"] = mat_res + + def export_technique(self, material_map, *, resources=None): + from .datafile import Resource, Statement + tech_res = Resource(material_map.name+".tech") + + mat_res = resources["basic_white.mat"] + diffuse_res = resources[material_map.name+"_diffuse.tex2d"] + + if material_map.technique: + if self.single_file: + raise Exception("Can't export inherited technique to a single file") + + st = Statement("inherit", material_map.technique) + st.sub.append(tech_res.create_reference_statement("texture", "diffuse_map", diffuse_res)) + st.sub.append(tech_res.create_reference_statement("material", "surface", mat_res)) + tech_res.statements.append(st) + else: + st = Statement("pass", "") + if self.single_file: + st.sub.append(tech_res.create_embed_statement("material", mat_res)) + else: + st.sub.append(tech_res.create_reference_statement("material", mat_res)) + ss = Statement("texunit", 0) + if self.single_file: + ss.sub.append(tech_res.create_embed_statement("texture2d", diffuse_res)) + else: + ss.sub.append(tech_res.create_reference_statement("texture", diffuse_res)) + st.sub.append(ss) + tech_res.statements.append(st) + + return tech_res