X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=blender%2Fio_mspgl%2Fexport_material.py;h=8619142e9b4dff53d4543c2b8a3e31dde6cff016;hp=289fb8810d4beff83826d4a4905c11bdd71e3b39;hb=5c3e77f72d30b93ab775eb41eba4efcdabb0f074;hpb=f77259ba680e73daee6008f53dafe92e84a0b5f5 diff --git a/blender/io_mspgl/export_material.py b/blender/io_mspgl/export_material.py index 289fb881..8619142e 100644 --- a/blender/io_mspgl/export_material.py +++ b/blender/io_mspgl/export_material.py @@ -1,18 +1,5 @@ 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 - - class MaterialExporter: def __init__(self): self.single_file = True @@ -50,19 +37,22 @@ class MaterialExporter: 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(): - if t.default_filter: - 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: @@ -81,10 +71,10 @@ class MaterialExporter: ss = Statement("texunit", 0) if self.single_file: ss.sub.append(tech_res.create_embed_statement("texture2d", tex_res)) - elif not diffuse_tex.default_filter: - ss.sub.append(tech_res.create_reference_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) @@ -96,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) @@ -111,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