]> git.tdb.fi Git - libs/gl.git/commitdiff
Add an option to export colors as sRGB
authorMikko Rasa <tdb@tdb.fi>
Wed, 11 Sep 2013 09:31:28 +0000 (12:31 +0300)
committerMikko Rasa <tdb@tdb.fi>
Wed, 11 Sep 2013 09:31:28 +0000 (12:31 +0300)
blender/io_mspgl/__init__.py
blender/io_mspgl/export_mesh.py

index cf15002b096545b2e04b8783ff790407cc075f1e..e854134185f8cb938bff6406f0c60cbfc3e4f9ea 100644 (file)
@@ -100,6 +100,7 @@ class ExportMspGLObject(bpy.types.Operator, ExportMspGLMeshBase):
                        ("REF", "Referenced", "Reference external data"),
                        ("INLINE", "Inline", "Embed textures in the object")))
        material_tex = bpy.props.BoolProperty(name="Material texture", description="Generate a texture based on material colors", default=False)
+       srgb_colors = bpy.props.BoolProperty(name="sRGB colors", description="Export material colors as sRGB instead of linear", default=True)
 
        def prepare_exporter(self, exporter):
                super().prepare_exporter(exporter)
@@ -110,6 +111,7 @@ class ExportMspGLObject(bpy.types.Operator, ExportMspGLMeshBase):
                col = self.texturing_col
                col.prop(self, "textures")
                col.prop(self, "material_tex")
+               col.prop(self, "srgb_colors")
 
 class ExportMspGLArmature(bpy.types.Operator, ExportMspGLBase):
        bl_idname = "export.mspgl_armature"
index 3da09f9ab92d99cc918cf7375ed692e3f12aeb63..30a5b4630a145efaaa0829f1b118b176a5b4ff66 100644 (file)
@@ -2,6 +2,12 @@ import itertools
 import bpy
 from .outfile import OutFile
 
+def linear_to_srgb(l):
+       if l<0.0031308:
+               return 12.92*l
+       else:
+               return 1.055*(l**(1/2.4))-0.055
+
 class VertexCache:
        def __init__(self, size):
                self.size = size
@@ -47,6 +53,7 @@ class MeshExporter:
                self.compound = False
                self.object = False
                self.material_tex = False
+               self.srgb_colors = True
                self.textures = "REF"
                self.smoothing = "MSPGL"
                self.export_groups = False
@@ -363,6 +370,11 @@ class MeshExporter:
                        out_file.begin("technique")
                        out_file.begin("pass", '""')
                        if mesh.materials:
+                               if self.srgb_colors:
+                                       cm = linear_to_srgb
+                               else:
+                                       cm = lambda x: x
+
                                if self.material_tex:
                                        out_file.begin("material")
                                        out_file.write("diffuse", 1.0, 1.0, 1.0, 1.0)
@@ -378,7 +390,7 @@ class MeshExporter:
                                        out_file.write("storage", "RGB", len(mesh.materials), 1)
                                        texdata = '"'
                                        for m in mesh.materials:
-                                               color = [int(c*255) for c in m.diffuse_color]
+                                               color = [int(cm(c)*255) for c in m.diffuse_color]
                                                texdata += "\\x%02X\\x%02X\\x%02X"%tuple(color)
                                        texdata += '"'
                                        out_file.write("raw_data", texdata)
@@ -387,10 +399,15 @@ class MeshExporter:
                                else:
                                        mat = mesh.materials[0]
                                        out_file.begin("material")
-                                       diff = mat.diffuse_color
-                                       out_file.write("diffuse", diff.r, diff.g, diff.b, 1.0)
-                                       amb = diff*mat.ambient
-                                       out_file.write("ambient", amb.r, amb.g, amb.b, 1.0)
+                                       if any((s and s.use_map_color_diffuse) for s in mat.texture_slots):
+                                               out_file.write("diffuse", 1.0, 1.0, 1.0, 1.0)
+                                               amb = cm(mat.ambient)
+                                               out_file.write("ambient", amb, amb, amb, 1.0)
+                                       else:
+                                               diff = mat.diffuse_color
+                                               out_file.write("diffuse", cm(diff.r), cm(diff.g), cm(diff.b), 1.0)
+                                               amb = diff*mat.ambient
+                                               out_file.write("ambient", cm(amb.r), cm(amb.g), cm(amb.b), 1.0)
                                        spec = mat.specular_color*mat.specular_intensity
                                        out_file.write("specular", spec.r, spec.g, spec.b, 1.0)
                                        out_file.write("shininess", mat.specular_hardness);