]> git.tdb.fi Git - libs/gl.git/blobdiff - blender/io_mspgl/export_material.py
Always export texture data inline if there's no image file
[libs/gl.git] / blender / io_mspgl / export_material.py
index 3f0117d40a210909ce5075ec9b952e68619d661a..956f51d430b41acb8e48f2fdc42376971c2f3453 100644 (file)
@@ -1,27 +1,14 @@
 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.textures = 'REF'
+               self.single_file = True
+               self.use_textures = True
 
        def create_texture_exporter(self):
                from .export_texture import TextureExporter
                texture_export = TextureExporter()
-               if self.textures=='INLINE':
-                       texture_export.pixels = 'INLINE'
+               texture_export.inline_data = self.single_file
                return texture_export
 
        def export_technique_resources(self, material, resources):
@@ -31,7 +18,7 @@ class MaterialExporter:
                if mat_name not in resources:
                        resources[mat_name] = self.export_material(material)
 
-               if self.textures!='NONE':
+               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"
@@ -44,7 +31,7 @@ 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:
@@ -53,13 +40,16 @@ class MaterialExporter:
                                        textures["normal_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:
@@ -67,18 +57,21 @@ class MaterialExporter:
                        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':
+                               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)
@@ -90,7 +83,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)
@@ -105,3 +100,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