diff options
author | Maurice Raybaud <mauriceraybaud@hotmail.fr> | 2015-12-29 18:54:44 +0300 |
---|---|---|
committer | Maurice Raybaud <mauriceraybaud@hotmail.fr> | 2015-12-29 18:54:44 +0300 |
commit | 9d7cb8d53798944f56b044fc12efa94a229406e0 (patch) | |
tree | 8c014294bb458df0ea299d5f7be05cd7e6b73f31 | |
parent | 77a55970d67fef57b6557e9c969a184b59eb3a23 (diff) |
Separated writeMaterial() function to its own python file
-rw-r--r-- | render_povray/__init__.py | 18 | ||||
-rw-r--r-- | render_povray/render.py | 237 | ||||
-rw-r--r-- | render_povray/shading.py | 231 |
3 files changed, 236 insertions, 250 deletions
diff --git a/render_povray/__init__.py b/render_povray/__init__.py index 8723af17..f3f217cc 100644 --- a/render_povray/__init__.py +++ b/render_povray/__init__.py @@ -36,7 +36,6 @@ if "bpy" in locals(): import importlib importlib.reload(ui) importlib.reload(render) - importlib.reload(primitives) importlib.reload(update_files) else: @@ -60,7 +59,6 @@ else: from . import ( ui, render, - primitives, update_files, ) @@ -1479,14 +1477,6 @@ def register(): bpy.types.Material.pov = PointerProperty(type=RenderPovSettingsMaterial) bpy.types.Texture.pov = PointerProperty(type=RenderPovSettingsTexture) bpy.types.Object.pov = PointerProperty(type=RenderPovSettingsObject) - #bpy.types.Object.povsuperellipsoid = CollectionProperty(type=RenderPovSettingsSuperellipsoid_add) - #bpy.types.Object.povsupertorus = CollectionProperty(type=RenderPovSettingsSupertorus_add) - #bpy.types.Object.povloft = CollectionProperty(type=RenderPovSettingsLoft_add) - #bpy.types.Object.povrainbow = CollectionProperty(type=RenderPovSettingsRainbow_add) - #bpy.types.Object.povheightfield = CollectionProperty(type=RenderPovSettingsHeightField_add) - #bpy.types.Object.povtorus = CollectionProperty(type=RenderPovSettingsTorus_add) - #bpy.types.Object.povprism = CollectionProperty(type=RenderPovSettingsPrism_add) - #bpy.types.Object.povpolygontocircle = CollectionProperty(type=RenderPovSettingsPolygonToCircle_add) bpy.types.Camera.pov = PointerProperty(type=RenderPovSettingsCamera) bpy.types.Text.pov = PointerProperty(type=RenderPovSettingsText) @@ -1498,14 +1488,6 @@ def unregister(): del bpy.types.Material.pov del bpy.types.Texture.pov del bpy.types.Object.pov - #del bpy.types.Object.povsuperellipsoid - #del bpy.types.Object.povsupertorus - #del bpy.types.Object.povloft - #del bpy.types.Object.povrainbow - #del bpy.types.Object.povheightfield - #del bpy.types.Object.povtorus - #del bpy.types.Object.povprism - #del bpy.types.Object.povpolygontocircle del bpy.types.Camera.pov del bpy.types.Text.pov diff --git a/render_povray/render.py b/render_povray/render.py index bb4bda6c..acc27a03 100644 --- a/render_povray/render.py +++ b/render_povray/render.py @@ -32,6 +32,8 @@ from bpy.types import(Operator) from . import df3 # for smoke rendering +from . import shading # for BI POV haders emulation +from . import primitives # for import and export of POV specific primitives ##############################SF########################### ##############find image texture def imageFormat(imgF): @@ -943,236 +945,7 @@ def write_pov(filename, scene=None, info_callback=None): materialNames = {} DEF_MAT_NAME = "" #or "Default"? - - def writeMaterial(material): - # Assumes only called once on each material - if material: - name_orig = material.name - name = materialNames[name_orig] = uniqueName(bpy.path.clean_name(name_orig), materialNames) - else: - name = name_orig = DEF_MAT_NAME - - - if material: - # If saturation(.s) is not zero, then color is not grey, and has a tint - colored_specular_found = (material.specular_color.s > 0.0) - - ################## - # Several versions of the finish: Level conditions are variations for specular/Mirror - # texture channel map with alternative finish of 0 specular and no mirror reflection. - # Level=1 Means No specular nor Mirror reflection - # Level=2 Means translation of spec and mir levels for when no map influences them - # Level=3 Means Maximum Spec and Mirror - - def povHasnoSpecularMaps(Level): - if Level == 1: - tabWrite("#declare %s = finish {" % safety(name, Level=1)) - if comments: - file.write(" //No specular nor Mirror reflection\n") - else: - tabWrite("\n") - elif Level == 2: - tabWrite("#declare %s = finish {" % safety(name, Level=2)) - if comments: - file.write(" //translation of spec and mir levels for when no map " \ - "influences them\n") - else: - tabWrite("\n") - elif Level == 3: - tabWrite("#declare %s = finish {" % safety(name, Level=3)) - if comments: - file.write(" //Maximum Spec and Mirror\n") - else: - tabWrite("\n") - - if material: - # POV-Ray 3.7 now uses two diffuse values respectively for front and back shading - # (the back diffuse is like blender translucency) - frontDiffuse = material.diffuse_intensity - backDiffuse = material.translucency - - if material.pov.conserve_energy: - - #Total should not go above one - if (frontDiffuse + backDiffuse) <= 1.0: - pass - elif frontDiffuse == backDiffuse: - # Try to respect the user's 'intention' by comparing the two values but - # bringing the total back to one. - frontDiffuse = backDiffuse = 0.5 - # Let the highest value stay the highest value. - elif frontDiffuse > backDiffuse: - # clamps the sum below 1 - backDiffuse = min(backDiffuse, (1.0 - frontDiffuse)) - else: - frontDiffuse = min(frontDiffuse, (1.0 - backDiffuse)) - - # map hardness between 0.0 and 1.0 - roughness = ((1.0 - ((material.specular_hardness - 1.0) / 510.0))) - ## scale from 0.0 to 0.1 - roughness *= 0.1 - # add a small value because 0.0 is invalid. - roughness += (1.0 / 511.0) - - ################################Diffuse Shader###################################### - # Not used for Full spec (Level=3) of the shader. - if material.diffuse_shader == 'OREN_NAYAR' and Level != 3: - # Blender roughness is what is generally called oren nayar Sigma, - # and brilliance in POV-Ray. - tabWrite("brilliance %.3g\n" % (0.9 + material.roughness)) - - if material.diffuse_shader == 'TOON' and Level != 3: - tabWrite("brilliance %.3g\n" % (0.01 + material.diffuse_toon_smooth * 0.25)) - # Lower diffuse and increase specular for toon effect seems to look better - # in POV-Ray. - frontDiffuse *= 0.5 - - if material.diffuse_shader == 'MINNAERT' and Level != 3: - #tabWrite("aoi %.3g\n" % material.darkness) - pass # let's keep things simple for now - if material.diffuse_shader == 'FRESNEL' and Level != 3: - #tabWrite("aoi %.3g\n" % material.diffuse_fresnel_factor) - pass # let's keep things simple for now - if material.diffuse_shader == 'LAMBERT' and Level != 3: - # trying to best match lambert attenuation by that constant brilliance value - tabWrite("brilliance 1.8\n") - - if Level == 2: - ###########################Specular Shader###################################### - # No difference between phong and cook torrence in blender HaHa! - if (material.specular_shader == 'COOKTORR' or - material.specular_shader == 'PHONG'): - tabWrite("phong %.3g\n" % (material.specular_intensity)) - tabWrite("phong_size %.3g\n" % (material.specular_hardness / 2 + 0.25)) - - # POV-Ray 'specular' keyword corresponds to a Blinn model, without the ior. - elif material.specular_shader == 'BLINN': - # Use blender Blinn's IOR just as some factor for spec intensity - tabWrite("specular %.3g\n" % (material.specular_intensity * - (material.specular_ior / 4.0))) - tabWrite("roughness %.3g\n" % roughness) - #Could use brilliance 2(or varying around 2 depending on ior or factor) too. - - elif material.specular_shader == 'TOON': - tabWrite("phong %.3g\n" % (material.specular_intensity * 2.0)) - # use extreme phong_size - tabWrite("phong_size %.3g\n" % (0.1 + material.specular_toon_smooth / 2.0)) - - elif material.specular_shader == 'WARDISO': - # find best suited default constant for brilliance Use both phong and - # specular for some values. - tabWrite("specular %.3g\n" % (material.specular_intensity / - (material.specular_slope + 0.0005))) - # find best suited default constant for brilliance Use both phong and - # specular for some values. - tabWrite("roughness %.4g\n" % (0.0005 + material.specular_slope / 10.0)) - # find best suited default constant for brilliance Use both phong and - # specular for some values. - tabWrite("brilliance %.4g\n" % (1.8 - material.specular_slope * 1.8)) - - #################################################################################### - elif Level == 1: - tabWrite("specular 0\n") - elif Level == 3: - tabWrite("specular 1\n") - tabWrite("diffuse %.3g %.3g\n" % (frontDiffuse, backDiffuse)) - - tabWrite("ambient %.3g\n" % material.ambient) - # POV-Ray blends the global value - #tabWrite("ambient rgb <%.3g, %.3g, %.3g>\n" % \ - # tuple([c*material.ambient for c in world.ambient_color])) - tabWrite("emission %.3g\n" % material.emit) # New in POV-Ray 3.7 - - #POV-Ray just ignores roughness if there's no specular keyword - #tabWrite("roughness %.3g\n" % roughness) - - if material.pov.conserve_energy: - # added for more realistic shading. Needs some checking to see if it - # really works. --Maurice. - tabWrite("conserve_energy\n") - - if colored_specular_found == True: - tabWrite("metallic\n") - - # 'phong 70.0 ' - if Level != 1: - if material.raytrace_mirror.use: - raytrace_mirror = material.raytrace_mirror - if raytrace_mirror.reflect_factor: - tabWrite("reflection {\n") - tabWrite("rgb <%.3g, %.3g, %.3g>\n" % material.mirror_color[:]) - if material.pov.mirror_metallic: - tabWrite("metallic %.3g\n" % (raytrace_mirror.reflect_factor)) - # Blurry reflections for UberPOV - if using_uberpov and raytrace_mirror.gloss_factor < 1.0: - #tabWrite("#ifdef(unofficial) #if(unofficial = \"patch\") #if(patch(\"upov-reflection-roughness\") > 0)\n") - tabWrite("roughness %.6f\n" % \ - (0.000001/raytrace_mirror.gloss_factor)) - #tabWrite("#end #end #end\n") # This and previous comment for backward compatibility, messier pov code - if material.pov.mirror_use_IOR: # WORKING ? - # Removed from the line below: gives a more physically correct - # material but needs proper IOR. --Maurice - tabWrite("fresnel 1 ") - tabWrite("falloff %.3g exponent %.3g} " % \ - (raytrace_mirror.fresnel, raytrace_mirror.fresnel_factor)) - - if material.subsurface_scattering.use: - subsurface_scattering = material.subsurface_scattering - tabWrite("subsurface { translucency <%.3g, %.3g, %.3g> }\n" % ( - (subsurface_scattering.radius[0]), - (subsurface_scattering.radius[1]), - (subsurface_scattering.radius[2]), - ) - ) - - if material.pov.irid_enable: - tabWrite("irid { %.4g thickness %.4g turbulence %.4g }" % \ - (material.pov.irid_amount, material.pov.irid_thickness, - material.pov.irid_turbulence)) - - else: - tabWrite("diffuse 0.8\n") - tabWrite("phong 70.0\n") - - #tabWrite("specular 0.2\n") - - # This is written into the object - ''' - if material and material.transparency_method=='RAYTRACE': - 'interior { ior %.3g} ' % material.raytrace_transparency.ior - ''' - - #tabWrite("crand 1.0\n") # Sand granyness - #tabWrite("metallic %.6f\n" % material.spec) - #tabWrite("phong %.6f\n" % material.spec) - #tabWrite("phong_size %.6f\n" % material.spec) - #tabWrite("brilliance %.6f " % (material.specular_hardness/256.0) # Like hardness - - tabWrite("}\n\n") - - # Level=2 Means translation of spec and mir levels for when no map influences them - povHasnoSpecularMaps(Level=2) - - if material: - special_texture_found = False - for t in material.texture_slots: - if t and t.use: - if (t.texture.type == 'IMAGE' and t.texture.image) or t.texture.type != 'IMAGE': - validPath=True - else: - validPath=False - if(t and t.use and validPath and - (t.use_map_specular or t.use_map_raymir or t.use_map_normal or t.use_map_alpha)): - special_texture_found = True - continue # Some texture found - - if special_texture_found or colored_specular_found: - # Level=1 Means No specular nor Mirror reflection - povHasnoSpecularMaps(Level=1) - - # Level=3 Means Maximum Spec and Mirror - povHasnoSpecularMaps(Level=3) - + def exportCamera(): camera = scene.camera @@ -4386,10 +4159,10 @@ def write_pov(filename, scene=None, info_callback=None): file.write("#default{ pigment{ color rgb 0.8 }}\n") # Convert all materials to strings we can access directly per vertex. #exportMaterials() - writeMaterial(None) # default material + shading.writeMaterial(DEF_MAT_NAME, scene, tabWrite, safety, comments, uniqueName, materialNames, None) # default material for material in bpy.data.materials: if material.users > 0: - writeMaterial(material) + shading.writeMaterial(DEF_MAT_NAME, scene, tabWrite, safety, comments, uniqueName, materialNames, material) if comments: file.write("\n") diff --git a/render_povray/shading.py b/render_povray/shading.py new file mode 100644 index 00000000..d882bfec --- /dev/null +++ b/render_povray/shading.py @@ -0,0 +1,231 @@ +# For BI > POV shaders emulation +import bpy + +def writeMaterial(DEF_MAT_NAME, scene, tabWrite, safety, comments, uniqueName, materialNames, material): + # Assumes only called once on each material + if material: + name_orig = material.name + name = materialNames[name_orig] = uniqueName(bpy.path.clean_name(name_orig), materialNames) + else: + name = name_orig = DEF_MAT_NAME + + + if material: + # If saturation(.s) is not zero, then color is not grey, and has a tint + colored_specular_found = (material.specular_color.s > 0.0) + + ################## + # Several versions of the finish: Level conditions are variations for specular/Mirror + # texture channel map with alternative finish of 0 specular and no mirror reflection. + # Level=1 Means No specular nor Mirror reflection + # Level=2 Means translation of spec and mir levels for when no map influences them + # Level=3 Means Maximum Spec and Mirror + + def povHasnoSpecularMaps(Level): + if Level == 1: + tabWrite("#declare %s = finish {" % safety(name, Level=1)) + if comments: + file.write(" //No specular nor Mirror reflection\n") + else: + tabWrite("\n") + elif Level == 2: + tabWrite("#declare %s = finish {" % safety(name, Level=2)) + if comments: + file.write(" //translation of spec and mir levels for when no map " \ + "influences them\n") + else: + tabWrite("\n") + elif Level == 3: + tabWrite("#declare %s = finish {" % safety(name, Level=3)) + if comments: + file.write(" //Maximum Spec and Mirror\n") + else: + tabWrite("\n") + + if material: + # POV-Ray 3.7 now uses two diffuse values respectively for front and back shading + # (the back diffuse is like blender translucency) + frontDiffuse = material.diffuse_intensity + backDiffuse = material.translucency + + if material.pov.conserve_energy: + + #Total should not go above one + if (frontDiffuse + backDiffuse) <= 1.0: + pass + elif frontDiffuse == backDiffuse: + # Try to respect the user's 'intention' by comparing the two values but + # bringing the total back to one. + frontDiffuse = backDiffuse = 0.5 + # Let the highest value stay the highest value. + elif frontDiffuse > backDiffuse: + # clamps the sum below 1 + backDiffuse = min(backDiffuse, (1.0 - frontDiffuse)) + else: + frontDiffuse = min(frontDiffuse, (1.0 - backDiffuse)) + + # map hardness between 0.0 and 1.0 + roughness = ((1.0 - ((material.specular_hardness - 1.0) / 510.0))) + ## scale from 0.0 to 0.1 + roughness *= 0.1 + # add a small value because 0.0 is invalid. + roughness += (1.0 / 511.0) + + ################################Diffuse Shader###################################### + # Not used for Full spec (Level=3) of the shader. + if material.diffuse_shader == 'OREN_NAYAR' and Level != 3: + # Blender roughness is what is generally called oren nayar Sigma, + # and brilliance in POV-Ray. + tabWrite("brilliance %.3g\n" % (0.9 + material.roughness)) + + if material.diffuse_shader == 'TOON' and Level != 3: + tabWrite("brilliance %.3g\n" % (0.01 + material.diffuse_toon_smooth * 0.25)) + # Lower diffuse and increase specular for toon effect seems to look better + # in POV-Ray. + frontDiffuse *= 0.5 + + if material.diffuse_shader == 'MINNAERT' and Level != 3: + #tabWrite("aoi %.3g\n" % material.darkness) + pass # let's keep things simple for now + if material.diffuse_shader == 'FRESNEL' and Level != 3: + #tabWrite("aoi %.3g\n" % material.diffuse_fresnel_factor) + pass # let's keep things simple for now + if material.diffuse_shader == 'LAMBERT' and Level != 3: + # trying to best match lambert attenuation by that constant brilliance value + tabWrite("brilliance 1.8\n") + + if Level == 2: + ###########################Specular Shader###################################### + # No difference between phong and cook torrence in blender HaHa! + if (material.specular_shader == 'COOKTORR' or + material.specular_shader == 'PHONG'): + tabWrite("phong %.3g\n" % (material.specular_intensity)) + tabWrite("phong_size %.3g\n" % (material.specular_hardness / 2 + 0.25)) + + # POV-Ray 'specular' keyword corresponds to a Blinn model, without the ior. + elif material.specular_shader == 'BLINN': + # Use blender Blinn's IOR just as some factor for spec intensity + tabWrite("specular %.3g\n" % (material.specular_intensity * + (material.specular_ior / 4.0))) + tabWrite("roughness %.3g\n" % roughness) + #Could use brilliance 2(or varying around 2 depending on ior or factor) too. + + elif material.specular_shader == 'TOON': + tabWrite("phong %.3g\n" % (material.specular_intensity * 2.0)) + # use extreme phong_size + tabWrite("phong_size %.3g\n" % (0.1 + material.specular_toon_smooth / 2.0)) + + elif material.specular_shader == 'WARDISO': + # find best suited default constant for brilliance Use both phong and + # specular for some values. + tabWrite("specular %.3g\n" % (material.specular_intensity / + (material.specular_slope + 0.0005))) + # find best suited default constant for brilliance Use both phong and + # specular for some values. + tabWrite("roughness %.4g\n" % (0.0005 + material.specular_slope / 10.0)) + # find best suited default constant for brilliance Use both phong and + # specular for some values. + tabWrite("brilliance %.4g\n" % (1.8 - material.specular_slope * 1.8)) + + #################################################################################### + elif Level == 1: + tabWrite("specular 0\n") + elif Level == 3: + tabWrite("specular 1\n") + tabWrite("diffuse %.3g %.3g\n" % (frontDiffuse, backDiffuse)) + + tabWrite("ambient %.3g\n" % material.ambient) + # POV-Ray blends the global value + #tabWrite("ambient rgb <%.3g, %.3g, %.3g>\n" % \ + # tuple([c*material.ambient for c in world.ambient_color])) + tabWrite("emission %.3g\n" % material.emit) # New in POV-Ray 3.7 + + #POV-Ray just ignores roughness if there's no specular keyword + #tabWrite("roughness %.3g\n" % roughness) + + if material.pov.conserve_energy: + # added for more realistic shading. Needs some checking to see if it + # really works. --Maurice. + tabWrite("conserve_energy\n") + + if colored_specular_found == True: + tabWrite("metallic\n") + + # 'phong 70.0 ' + if Level != 1: + if material.raytrace_mirror.use: + raytrace_mirror = material.raytrace_mirror + if raytrace_mirror.reflect_factor: + tabWrite("reflection {\n") + tabWrite("rgb <%.3g, %.3g, %.3g>\n" % material.mirror_color[:]) + if material.pov.mirror_metallic: + tabWrite("metallic %.3g\n" % (raytrace_mirror.reflect_factor)) + # Blurry reflections for UberPOV + if using_uberpov and raytrace_mirror.gloss_factor < 1.0: + #tabWrite("#ifdef(unofficial) #if(unofficial = \"patch\") #if(patch(\"upov-reflection-roughness\") > 0)\n") + tabWrite("roughness %.6f\n" % \ + (0.000001/raytrace_mirror.gloss_factor)) + #tabWrite("#end #end #end\n") # This and previous comment for backward compatibility, messier pov code + if material.pov.mirror_use_IOR: # WORKING ? + # Removed from the line below: gives a more physically correct + # material but needs proper IOR. --Maurice + tabWrite("fresnel 1 ") + tabWrite("falloff %.3g exponent %.3g} " % \ + (raytrace_mirror.fresnel, raytrace_mirror.fresnel_factor)) + + if material.subsurface_scattering.use: + subsurface_scattering = material.subsurface_scattering + tabWrite("subsurface { translucency <%.3g, %.3g, %.3g> }\n" % ( + (subsurface_scattering.radius[0]), + (subsurface_scattering.radius[1]), + (subsurface_scattering.radius[2]), + ) + ) + + if material.pov.irid_enable: + tabWrite("irid { %.4g thickness %.4g turbulence %.4g }" % \ + (material.pov.irid_amount, material.pov.irid_thickness, + material.pov.irid_turbulence)) + + else: + tabWrite("diffuse 0.8\n") + tabWrite("phong 70.0\n") + + #tabWrite("specular 0.2\n") + + # This is written into the object + ''' + if material and material.transparency_method=='RAYTRACE': + 'interior { ior %.3g} ' % material.raytrace_transparency.ior + ''' + + #tabWrite("crand 1.0\n") # Sand granyness + #tabWrite("metallic %.6f\n" % material.spec) + #tabWrite("phong %.6f\n" % material.spec) + #tabWrite("phong_size %.6f\n" % material.spec) + #tabWrite("brilliance %.6f " % (material.specular_hardness/256.0) # Like hardness + + tabWrite("}\n\n") + + # Level=2 Means translation of spec and mir levels for when no map influences them + povHasnoSpecularMaps(Level=2) + + if material: + special_texture_found = False + for t in material.texture_slots: + if t and t.use: + if (t.texture.type == 'IMAGE' and t.texture.image) or t.texture.type != 'IMAGE': + validPath=True + else: + validPath=False + if(t and t.use and validPath and + (t.use_map_specular or t.use_map_raymir or t.use_map_normal or t.use_map_alpha)): + special_texture_found = True + continue # Some texture found + + if special_texture_found or colored_specular_found: + # Level=1 Means No specular nor Mirror reflection + povHasnoSpecularMaps(Level=1) + + # Level=3 Means Maximum Spec and Mirror + povHasnoSpecularMaps(Level=3) |