From 61bf934744d4ba7ffa1c89012019ed1b022dd13b Mon Sep 17 00:00:00 2001
From: Maurice Raybaud <mauriceraybaud@hotmail.fr>
Date: Sun, 9 Jan 2011 19:58:13 +0000
Subject: [PATCH] Added Atmospheric Media and custom image gamma fixed two typo
 errors and a compatibility for gamma syntax

---
 render_povray/__init__.py | 33 +++++++++++++++++++++--
 render_povray/render.py   | 21 ++++++++++-----
 render_povray/ui.py       | 55 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 100 insertions(+), 9 deletions(-)

diff --git a/render_povray/__init__.py b/render_povray/__init__.py
index ef8e63daa..177e1a90b 100644
--- a/render_povray/__init__.py
+++ b/render_povray/__init__.py
@@ -28,7 +28,7 @@ bl_addon_info = {
     "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.5/Py/"\
         "Scripts/Render/PovRay",
     "tracker_url": "https://projects.blender.org/tracker/index.php?"\
-        "func=detail&aid=22717",
+        "func=detail&atid=468&aid=22717&group_id=153",
     "category": "Render"}
 
 
@@ -55,6 +55,16 @@ def register():
             name="Advanced Options",
             description="Show advanced options",
             default=False)
+    Scene.pov_media_enable = BoolProperty(
+        name="Enable Media",
+        description="Enable povrays atmospheric media",
+        default=False)
+    Scene.pov_media_samples = IntProperty(
+            name="Samples", description="Number of samples taken from camera to first object encountered along ray path for media calculation",
+            min=1, max=100, default=35)
+    Scene.pov_media_color = FloatProperty(
+            name="Media Color", description="The atmospheric media color. Grey value for now",
+            min=0.00, max=1.00, soft_min=0.01, soft_max=1.00, default=0.01)
     Scene.pov_baking_enable = BoolProperty(
             name="Enable Baking",
             description="Enable povrays texture baking",
@@ -185,13 +195,27 @@ def register():
                    ],
             name="Refractive",
             description="use fake caustics (fast) or true photons for refractive Caustics",
-            default="1")#ui.py has to be loaded before render.py with this. 
+            default="1")#ui.py has to be loaded before render.py with this.
+    
+    ########################################################################################
+    #Custom texture gamma
+    Tex = bpy.types.Texture 
+    Tex.pov_tex_gamma_enable = BoolProperty(
+            name="Enable custom texture gamma",
+            description="Notify some custom gamma for which texture has been precorrected without the file format carrying it and only if it differs from your OS expected standard (see pov doc)",
+            default=False)
+    Tex.pov_tex_gamma_value = FloatProperty(
+            name="Custom texture gamma",
+            description="value for which the file was issued e.g. a Raw photo is gamma 1.0",
+            min=0.45, max=5.00, soft_min=1.00, soft_max=2.50, default=1.00)
+    
     ######################################EndMR#####################################
 
 def unregister():
     import bpy
     Scene = bpy.types.Scene
     Mat = bpy.types.Material # MR
+    Tex = bpy.types.Texture # MR
     del Scene.pov_radio_enable
     del Scene.pov_radio_display_advanced
     del Scene.pov_radio_adc_bailout
@@ -206,6 +230,9 @@ def unregister():
     del Scene.pov_radio_nearest_count
     del Scene.pov_radio_normal
     del Scene.pov_radio_recursion_limit
+    del Scene.pov_media_enable # MR
+    del Scene.pov_media_samples # MR
+    del Scene.pov_media_color # MR
     del Scene.pov_baking_enable # MR
     del Mat.pov_irid_enable # MR
     del Mat.pov_mirror_use_IOR # MR
@@ -221,6 +248,8 @@ def unregister():
     del Mat.pov_photons_dispersion # MR  
     del Mat.pov_photons_reflection # MR 
     del Mat.pov_refraction_type # MR
+    del Tex.pov_tex_gamma_enable # MR
+    del Tex.pov_tex_gamma_value # MR
 
 if __name__ == "__main__":
     register()
diff --git a/render_povray/render.py b/render_povray/render.py
index 1e500e91d..9f1be317d 100644
--- a/render_povray/render.py
+++ b/render_povray/render.py
@@ -778,11 +778,14 @@ def write_pov(filename, scene=None, info_callback=None):
                 for t in material.texture_slots:
                     if t and t.texture.type == 'IMAGE' and t.use and t.texture.image: 
                         image_filename = path_image(t.texture.image.filepath)
+                        imgGamma = ''
                         if image_filename:
                             if t.use_map_color_diffuse: 
                                 texturesDif = image_filename
                                 colvalue = t.default_value
                                 t_dif = t
+                                if t_dif.texture.pov_tex_gamma_enable:
+                                    imgGamma = (" gamma %.3g " % t_dif.texture.pov_tex_gamma_value)
                             if t.use_map_specular or t.use_map_raymir: 
                                 texturesSpec = image_filename
                                 colvalue = t.default_value
@@ -873,16 +876,15 @@ def write_pov(filename, scene=None, info_callback=None):
 
                 else:
                     mappingDif = (" translate <%.4g-0.75,%.4g-0.75,%.4g-0.75> scale <%.4g,%.4g,%.4g>" % (t_dif.offset.x / 10 ,t_dif.offset.y / 10 ,t_dif.offset.z / 10, t_dif.scale.x / 2.25, t_dif.scale.y / 2.25, t_dif.scale.z / 2.25)) #strange that the translation factor for scale is not the same as for translate. ToDo: verify both matches with blender internal. 
-
                     if texturesAlpha !='':
                         mappingAlpha = (" translate <%.4g-0.75,%.4g-0.75,%.4g-0.75> scale <%.4g,%.4g,%.4g>" % (t_alpha.offset.x / 10 ,t_alpha.offset.y / 10 ,t_alpha.offset.z / 10, t_alpha.scale.x / 2.25, t_alpha.scale.y / 2.25, t_alpha.scale.z / 2.25)) #strange that the translation factor for scale is not the same as for translate. ToDo: verify both matches with blender internal. 
                         file.write('\n\t\t\t\tpigment {pigment_pattern {uv_mapping image_map{%s \"%s\" %s}%s}' % (imageFormat(texturesAlpha),texturesAlpha,imgMap(t_alpha),mappingAlpha))
                         file.write('\n\t\t\t\t\tpigment_map {\n\t\t\t\t\t\t[0 color rgbft<0,0,0,1,1>]')
-                        file.write('\n\t\t\t\t\t\t[1 uv_mapping image_map {%s \"%s\" %s}%s]\n\t\t\t\t}' % (imageFormat(texturesDif),texturesDif,imgMap(t_dif),mappingDif))
+                        file.write('\n\t\t\t\t\t\t[1 uv_mapping image_map {%s \"%s\" %s}%s]\n\t\t\t\t}' % (imageFormat(texturesDif),texturesDif,(imgGamma + imgMap(t_dif)),mappingDif))
                         file.write('\n\t\t\t\t}')
 
                     else:
-                        file.write("\n\t\t\t\tpigment {uv_mapping image_map {%s \"%s\" %s}%s}" % (imageFormat(texturesDif),texturesDif,imgMap(t_dif),mappingDif))
+                        file.write("\n\t\t\t\tpigment {uv_mapping image_map {%s \"%s\" %s}%s}" % (imageFormat(texturesDif),texturesDif,(imgGamma + imgMap(t_dif)),mappingDif))
 
                     if texturesSpec !='':
                         file.write('finish {%s}' % (safety(material_finish, Level=1)))# Level 1 is no specular
@@ -924,17 +926,16 @@ def write_pov(filename, scene=None, info_callback=None):
                         file.write('finish {%s}' % (safety(material_finish, Level=2)))# Level 2 is translated specular
 
                 else:
-                    mappingDif = (" translate <%.4g-0.75,%.4g-0.75,%.4g-0.75> scale <%.4g,%.4g,%.4g>" % (t_dif.offset.x / 10 ,t_dif.offset.y / 10 ,t_dif.offset.z / 10, t_dif.scale.x / 2.25, t_dif.scale.y / 2.25, t_dif.scale.z / 2.25)) #strange that the translation factor for scale is not the same as for translate. ToDo: verify both matches with blender internal. 
-
+                    mappingDif = (" translate <%.4g-0.75,%.4g-0.75,%.4g-0.75> scale <%.4g,%.4g,%.4g>" % (t_dif.offset.x / 10 ,t_dif.offset.y / 10 ,t_dif.offset.z / 10, t_dif.scale.x / 2.25, t_dif.scale.y / 2.25, t_dif.scale.z / 2.25)) #strange that the translation factor for scale is not the same as for translate. ToDo: verify both matches with blender internal.
                     if texturesAlpha !='':
                         mappingAlpha = (" translate <%.4g-0.75,%.4g-0.75,%.4g-0.75> scale <%.4g,%.4g,%.4g>" % (t_alpha.offset.x / 10 ,t_alpha.offset.y / 10 ,t_alpha.offset.z / 10, t_alpha.scale.x / 2.25, t_alpha.scale.y / 2.25, t_alpha.scale.z / 2.25)) #strange that the translation factor for scale is not the same as for translate. ToDo: verify both matches with blender internal. 
                         file.write('\n\t\t\t\tpigment {pigment_pattern {uv_mapping image_map{%s \"%s\" %s}%s}' % (imageFormat(texturesAlpha),texturesAlpha,imgMap(t_alpha),mappingAlpha))
                         file.write('\n\t\t\t\tpigment_map {\n\t\t\t\t\t[0 color rgbft<0,0,0,1,1>]')
-                        file.write('\n\t\t\t\t\t\t[1 uv_mapping image_map {%s \"%s\" %s}%s]\n\t\t\t\t\t}' % (imageFormat(texturesDif),texturesDif,imgMap(t_dif),mappingDif))
+                        file.write('\n\t\t\t\t\t\t[1 uv_mapping image_map {%s \"%s\" %s}%s]\n\t\t\t\t\t}' % (imageFormat(texturesDif),texturesDif,(imgMap(t_dif)+imgGamma),mappingDif))
                         file.write('\n\t\t\t\t}')
 
                     else:
-                        file.write("\n\t\t\tpigment {uv_mapping image_map {%s \"%s\" %s}%s}" % (imageFormat(texturesDif),texturesDif,imgMap(t_dif),mappingDif))
+                        file.write("\n\t\t\tpigment {uv_mapping image_map {%s \"%s\" %s}%s}" % (imageFormat(texturesDif),texturesDif,(imgGamma + imgMap(t_dif)),mappingDif))
                     if texturesSpec !='':
                         file.write('finish {%s}' % (safety(material_finish, Level=3)))# Level 3 is full specular
                     else:
@@ -1159,10 +1160,16 @@ def write_pov(filename, scene=None, info_callback=None):
             #file.write('\tturb_depth 0.3\n')
             file.write('\tfog_type 1\n')
             file.write('}\n')
+        if scene.pov_media_enable:
+            file.write('media {\n')
+            file.write('\tscattering { 1, rgb %.3g}\n' % scene.pov_media_color)
+            file.write('\tsamples %.d\n' % scene.pov_media_samples)
+            file.write('}\n')
 
     def exportGlobalSettings(scene):
 
         file.write('global_settings {\n')
+        file.write('\tassumed_gamma 1.0\n')
         file.write('\tmax_trace_level 7\n')
 
         if scene.pov_radio_enable:
diff --git a/render_povray/ui.py b/render_povray/ui.py
index d1c0b7697..95dc5e378 100644
--- a/render_povray/ui.py
+++ b/render_povray/ui.py
@@ -106,6 +106,17 @@ class MaterialButtonsPanel():
         rd = context.scene.render
         return mat and (rd.use_game_engine == False) and (rd.engine in cls.COMPAT_ENGINES)
 
+class TextureButtonsPanel():
+    bl_space_type = 'PROPERTIES'
+    bl_region_type = 'WINDOW'
+    bl_context = "texture"
+    # COMPAT_ENGINES must be defined in each subclass, external engines can add themselves here
+
+    @classmethod
+    def poll(cls, context):
+        tex = context.texture
+        rd = context.scene.render
+        return tex and (rd.use_game_engine == False) and (rd.engine in cls.COMPAT_ENGINES)
 ########################################MR######################################
 class MATERIAL_PT_povray_mirrorIOR(MaterialButtonsPanel, bpy.types.Panel):
     bl_label = "IOR Mirror"
@@ -289,6 +300,29 @@ class RENDER_PT_povray_radiosity(RenderButtonsPanel, bpy.types.Panel):
             col = split.column()
             col.prop(scene, "pov_radio_always_sample")
 
+class RENDER_PT_povray_media(RenderButtonsPanel, bpy.types.Panel):
+    bl_label = "Atmosphere Media"
+    COMPAT_ENGINES = {'POVRAY_RENDER'}
+
+    def draw_header(self, context):
+        scene = context.scene
+
+        self.layout.prop(scene, "pov_media_enable", text="")
+
+    def draw(self, context):
+        layout = self.layout
+
+        scene = context.scene
+        rd = scene.render
+
+        layout.active = scene.pov_media_enable
+        split = layout.split()
+
+        col = split.column()
+        col.prop(scene, "pov_media_samples", text="Samples")
+        col.prop(scene, "pov_media_color", text="Color")
+
+
 class RENDER_PT_povray_baking(RenderButtonsPanel, bpy.types.Panel):
     bl_label = "Baking"
     COMPAT_ENGINES = {'POVRAY_RENDER'}
@@ -305,3 +339,24 @@ class RENDER_PT_povray_baking(RenderButtonsPanel, bpy.types.Panel):
         rd = scene.render
 
         layout.active = scene.pov_baking_enable
+
+class TEXTURE_PT_povray_tex_gamma(TextureButtonsPanel, bpy.types.Panel):
+    bl_label = "Image Gamma"
+    COMPAT_ENGINES = {'POVRAY_RENDER'}
+
+    def draw_header(self, context):
+        tex = context.texture
+
+        self.layout.prop(tex, "pov_tex_gamma_enable", text="")
+
+    def draw(self, context):
+        layout = self.layout
+
+        tex = context.texture
+
+        layout.active = tex.pov_tex_gamma_enable
+        split = layout.split()
+
+        col = split.column()
+        col.prop(tex, "pov_tex_gamma_value", text="Gamma Value")
+        
-- 
GitLab