Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'render_povray/shading.py')
-rwxr-xr-x[-rw-r--r--]render_povray/shading.py2719
1 files changed, 1296 insertions, 1423 deletions
diff --git a/render_povray/shading.py b/render_povray/shading.py
index a3f907dc..680be99c 100644..100755
--- a/render_povray/shading.py
+++ b/render_povray/shading.py
@@ -22,248 +22,366 @@
import bpy
-def writeMaterial(using_uberpov, DEF_MAT_NAME, scene, tabWrite, safety, comments, uniqueName, materialNames, material):
+
+def write_object_material(material, ob, tab_write):
+ """Translate some object level material from Blender UI (VS data level)
+
+ to POV interior{} syntax and write it to exported file.
+ """
+ # DH - modified some variables to be function local, avoiding RNA write
+ # this should be checked to see if it is functionally correct
+
+ # Commented out: always write IOR to be able to use it for SSS, Fresnel reflections...
+ # if material and material.transparency_method == 'RAYTRACE':
+ if material:
+ # But there can be only one!
+ if material.pov_subsurface_scattering.use: # SSS IOR get highest priority
+ tab_write("interior {\n")
+ tab_write("ior %.6f\n" % material.pov_subsurface_scattering.ior)
+ # Then the raytrace IOR taken from raytrace transparency properties and used for
+ # reflections if IOR Mirror option is checked.
+ elif material.pov.mirror_use_IOR:
+ tab_write("interior {\n")
+ tab_write("ior %.6f\n" % material.pov_raytrace_transparency.ior)
+ elif material.pov.transparency_method == 'Z_TRANSPARENCY':
+ tab_write("interior {\n")
+ tab_write("ior 1.0\n")
+ else:
+ tab_write("interior {\n")
+ tab_write("ior %.6f\n" % material.pov_raytrace_transparency.ior)
+
+ pov_fake_caustics = False
+ pov_photons_refraction = False
+ pov_photons_reflection = False
+
+ if material.pov.photons_reflection:
+ pov_photons_reflection = True
+ if not material.pov.refraction_caustics:
+ pov_fake_caustics = False
+ pov_photons_refraction = False
+ elif material.pov.refraction_type == "1":
+ pov_fake_caustics = True
+ pov_photons_refraction = False
+ elif material.pov.refraction_type == "2":
+ pov_fake_caustics = False
+ pov_photons_refraction = True
+
+ # If only Raytrace transparency is set, its IOR will be used for refraction, but user
+ # can set up 'un-physical' fresnel reflections in raytrace mirror parameters.
+ # Last, if none of the above is specified, user can set up 'un-physical' fresnel
+ # reflections in raytrace mirror parameters. And pov IOR defaults to 1.
+ if material.pov.caustics_enable:
+ if pov_fake_caustics:
+ tab_write("caustics %.3g\n" % material.pov.fake_caustics_power)
+ if pov_photons_refraction:
+ # Default of 1 means no dispersion
+ tab_write("dispersion %.6f\n" % material.pov.photons_dispersion)
+ tab_write("dispersion_samples %.d\n" % material.pov.photons_dispersion_samples)
+ # TODO
+ # Other interior args
+ if material.pov.use_transparency and material.pov.transparency_method == 'RAYTRACE':
+ # fade_distance
+ # In Blender this value has always been reversed compared to what tooltip says.
+ # 100.001 rather than 100 so that it does not get to 0
+ # which deactivates the feature in POV
+ tab_write(
+ "fade_distance %.3g\n" % (100.001 - material.pov_raytrace_transparency.depth_max)
+ )
+ # fade_power
+ tab_write("fade_power %.3g\n" % material.pov_raytrace_transparency.falloff)
+ # fade_color
+ tab_write("fade_color <%.3g, %.3g, %.3g>\n" % material.pov.interior_fade_color[:])
+
+ # (variable) dispersion_samples (constant count for now)
+ tab_write("}\n")
+ if material.pov.photons_reflection or material.pov.refraction_type == "2":
+ tab_write("photons{")
+ tab_write("target %.3g\n" % ob.pov.spacing_multiplier)
+ if not ob.pov.collect_photons:
+ tab_write("collect off\n")
+ if pov_photons_refraction:
+ tab_write("refraction on\n")
+ if pov_photons_reflection:
+ tab_write("reflection on\n")
+ tab_write("}\n")
+
+
+def write_material(
+ using_uberpov, DEF_MAT_NAME, tab_write, safety, comments, unique_name, material_names, material
+):
"""Translate Blender material POV texture{} block and write to exported file."""
# 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)
+ name = material_names[name_orig] = unique_name(
+ bpy.path.clean_name(name_orig), material_names
+ )
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.pov.specular_color.s > 0.0) and (material.pov.diffuse_shader != 'MINNAERT'))
+ colored_specular_found = (material.pov.specular_color.s > 0.0) and (
+ material.pov.diffuse_shader != "MINNAERT"
+ )
##################
- # Several versions of the finish: Level conditions are variations for specular/Mirror
+ # Several versions of the finish: ref_level_bound 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
+ # ref_level_bound=1 Means No specular nor Mirror reflection
+ # ref_level_bound=2 Means translation of spec and mir levels for when no map influences them
+ # ref_level_bound=3 Means Maximum Spec and Mirror
- def povHasnoSpecularMaps(Level):
+ def pov_has_no_specular_maps(ref_level_bound):
"""Translate Blender specular map influence to POV finish map trick and write to file."""
- if Level == 1:
+ if ref_level_bound == 1:
if comments:
- tabWrite("//--No specular nor Mirror reflection--\n")
+ tab_write("//--No specular nor Mirror reflection--\n")
else:
- tabWrite("\n")
- tabWrite("#declare %s = finish {\n" % safety(name, Level=1))
+ tab_write("\n")
+ tab_write("#declare %s = finish {\n" % safety(name, ref_level_bound=1))
- elif Level == 2:
+ elif ref_level_bound == 2:
if comments:
- tabWrite("//--translation of spec and mir levels for when no map " \
- "influences them--\n")
+ tab_write(
+ "//--translation of spec and mir levels for when no map " "influences them--\n"
+ )
else:
- tabWrite("\n")
- tabWrite("#declare %s = finish {\n" % safety(name, Level=2))
+ tab_write("\n")
+ tab_write("#declare %s = finish {\n" % safety(name, ref_level_bound=2))
- elif Level == 3:
+ elif ref_level_bound == 3:
if comments:
- tabWrite("//--Maximum Spec and Mirror--\n")
+ tab_write("//--Maximum Spec and Mirror--\n")
else:
- tabWrite("\n")
- tabWrite("#declare %s = finish {\n" % safety(name, Level=3))
+ tab_write("\n")
+ tab_write("#declare %s = finish {\n" % safety(name, ref_level_bound=3))
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.pov.diffuse_intensity
- backDiffuse = material.pov.translucency
+ front_diffuse = material.pov.diffuse_intensity
+ back_diffuse = material.pov.translucency
if material.pov.conserve_energy:
- #Total should not go above one
- if (frontDiffuse + backDiffuse) <= 1.0:
+ # Total should not go above one
+ if (front_diffuse + back_diffuse) <= 1.0:
pass
- elif frontDiffuse == backDiffuse:
+ elif front_diffuse == back_diffuse:
# Try to respect the user's 'intention' by comparing the two values but
# bringing the total back to one.
- frontDiffuse = backDiffuse = 0.5
+ front_diffuse = back_diffuse = 0.5
# Let the highest value stay the highest value.
- elif frontDiffuse > backDiffuse:
+ elif front_diffuse > back_diffuse:
# clamps the sum below 1
- backDiffuse = min(backDiffuse, (1.0 - frontDiffuse))
+ back_diffuse = min(back_diffuse, (1.0 - front_diffuse))
else:
- frontDiffuse = min(frontDiffuse, (1.0 - backDiffuse))
+ front_diffuse = min(front_diffuse, (1.0 - back_diffuse))
# map hardness between 0.0 and 1.0
- roughness = ((1.0 - ((material.pov.specular_hardness - 1.0) / 510.0)))
+ roughness = 1.0 - ((material.pov.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)
+ roughness += 1.0 / 511.0
################################Diffuse Shader######################################
- # Not used for Full spec (Level=3) of the shader.
- if material.pov.diffuse_shader == 'OREN_NAYAR' and Level != 3:
+ # Not used for Full spec (ref_level_bound=3) of the shader.
+ if material.pov.diffuse_shader == "OREN_NAYAR" and ref_level_bound != 3:
# Blender roughness is what is generally called oren nayar Sigma,
# and brilliance in POV-Ray.
- tabWrite("brilliance %.3g\n" % (0.9 + material.roughness))
+ tab_write("brilliance %.3g\n" % (0.9 + material.roughness))
- if material.pov.diffuse_shader == 'TOON' and Level != 3:
- tabWrite("brilliance %.3g\n" % (0.01 + material.diffuse_toon_smooth * 0.25))
+ if material.pov.diffuse_shader == "TOON" and ref_level_bound != 3:
+ tab_write("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
+ front_diffuse *= 0.5
- if material.pov.diffuse_shader == 'MINNAERT' and Level != 3:
- #tabWrite("aoi %.3g\n" % material.darkness)
+ if material.pov.diffuse_shader == "MINNAERT" and ref_level_bound != 3:
+ # tab_write("aoi %.3g\n" % material.darkness)
pass # let's keep things simple for now
- if material.pov.diffuse_shader == 'FRESNEL' and Level != 3:
- #tabWrite("aoi %.3g\n" % material.diffuse_fresnel_factor)
+ if material.pov.diffuse_shader == "FRESNEL" and ref_level_bound != 3:
+ # tab_write("aoi %.3g\n" % material.diffuse_fresnel_factor)
pass # let's keep things simple for now
- if material.pov.diffuse_shader == 'LAMBERT' and Level != 3:
+ if material.pov.diffuse_shader == "LAMBERT" and ref_level_bound != 3:
# trying to best match lambert attenuation by that constant brilliance value
- tabWrite("brilliance 1\n")
+ tab_write("brilliance 1\n")
- if Level == 2:
+ if ref_level_bound == 2:
###########################Specular Shader######################################
# No difference between phong and cook torrence in blender HaHa!
- if (material.pov.specular_shader == 'COOKTORR' or
- material.pov.specular_shader == 'PHONG'):
- tabWrite("phong %.3g\n" % (material.pov.specular_intensity))
- tabWrite("phong_size %.3g\n" % (material.pov.specular_hardness /3.14))
+ if (
+ material.pov.specular_shader == "COOKTORR"
+ or material.pov.specular_shader == "PHONG"
+ ):
+ tab_write("phong %.3g\n" % (material.pov.specular_intensity))
+ tab_write("phong_size %.3g\n" % (material.pov.specular_hardness / 3.14))
# POV-Ray 'specular' keyword corresponds to a Blinn model, without the ior.
- elif material.pov.specular_shader == 'BLINN':
+ elif material.pov.specular_shader == "BLINN":
# Use blender Blinn's IOR just as some factor for spec intensity
- tabWrite("specular %.3g\n" % (material.pov.specular_intensity *
- (material.pov.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.pov.specular_shader == 'TOON':
- tabWrite("phong %.3g\n" % (material.pov.specular_intensity * 2.0))
+ tab_write(
+ "specular %.3g\n"
+ % (material.pov.specular_intensity * (material.pov.specular_ior / 4.0))
+ )
+ tab_write("roughness %.3g\n" % roughness)
+ # Could use brilliance 2(or varying around 2 depending on ior or factor) too.
+
+ elif material.pov.specular_shader == "TOON":
+ tab_write("phong %.3g\n" % (material.pov.specular_intensity * 2.0))
# use extreme phong_size
- tabWrite("phong_size %.3g\n" % (0.1 + material.pov.specular_toon_smooth / 2.0))
+ tab_write("phong_size %.3g\n" % (0.1 + material.pov.specular_toon_smooth / 2.0))
- elif material.pov.specular_shader == 'WARDISO':
+ elif material.pov.specular_shader == "WARDISO":
# find best suited default constant for brilliance Use both phong and
# specular for some values.
- tabWrite("specular %.3g\n" % (material.pov.specular_intensity /
- (material.pov.specular_slope + 0.0005)))
+ tab_write(
+ "specular %.3g\n"
+ % (material.pov.specular_intensity / (material.pov.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.pov.specular_slope / 10.0))
+ tab_write("roughness %.4g\n" % (0.0005 + material.pov.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.pov.specular_slope * 1.8))
+ tab_write("brilliance %.4g\n" % (1.8 - material.pov.specular_slope * 1.8))
####################################################################################
- elif Level == 1:
- if (material.pov.specular_shader == 'COOKTORR' or
- material.pov.specular_shader == 'PHONG'):
- tabWrite("phong 0\n")#%.3g\n" % (material.pov.specular_intensity/5))
- tabWrite("phong_size %.3g\n" % (material.pov.specular_hardness /3.14))
+ elif ref_level_bound == 1:
+ if (
+ material.pov.specular_shader == "COOKTORR"
+ or material.pov.specular_shader == "PHONG"
+ ):
+ tab_write("phong 0\n") #%.3g\n" % (material.pov.specular_intensity/5))
+ tab_write("phong_size %.3g\n" % (material.pov.specular_hardness / 3.14))
# POV-Ray 'specular' keyword corresponds to a Blinn model, without the ior.
- elif material.pov.specular_shader == 'BLINN':
+ elif material.pov.specular_shader == "BLINN":
# Use blender Blinn's IOR just as some factor for spec intensity
- tabWrite("specular %.3g\n" % (material.pov.specular_intensity *
- (material.pov.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.pov.specular_shader == 'TOON':
- tabWrite("phong %.3g\n" % (material.pov.specular_intensity * 2.0))
+ tab_write(
+ "specular %.3g\n"
+ % (material.pov.specular_intensity * (material.pov.specular_ior / 4.0))
+ )
+ tab_write("roughness %.3g\n" % roughness)
+ # Could use brilliance 2(or varying around 2 depending on ior or factor) too.
+
+ elif material.pov.specular_shader == "TOON":
+ tab_write("phong %.3g\n" % (material.pov.specular_intensity * 2.0))
# use extreme phong_size
- tabWrite("phong_size %.3g\n" % (0.1 + material.pov.specular_toon_smooth / 2.0))
+ tab_write("phong_size %.3g\n" % (0.1 + material.pov.specular_toon_smooth / 2.0))
- elif material.pov.specular_shader == 'WARDISO':
+ elif material.pov.specular_shader == "WARDISO":
# find best suited default constant for brilliance Use both phong and
# specular for some values.
- tabWrite("specular %.3g\n" % (material.pov.specular_intensity /
- (material.pov.specular_slope + 0.0005)))
+ tab_write(
+ "specular %.3g\n"
+ % (material.pov.specular_intensity / (material.pov.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.pov.specular_slope / 10.0))
+ tab_write("roughness %.4g\n" % (0.0005 + material.pov.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.pov.specular_slope * 1.8))
- elif Level == 3:
- # Spec must be Max at Level 3 so that white of mixing texture always shows specularity
+ tab_write("brilliance %.4g\n" % (1.8 - material.pov.specular_slope * 1.8))
+ elif ref_level_bound == 3:
+ # Spec must be Max at ref_level_bound 3 so that white of mixing texture always shows specularity
# That's why it's multiplied by 255. maybe replace by texture's brightest pixel value?
- tabWrite("specular %.3g\n" % ((material.pov.specular_intensity*material.pov.specular_color.v)*(255* slot.specular_factor)))
- tabWrite("roughness %.3g\n" % (1/material.pov.specular_hardness))
- tabWrite("diffuse %.3g %.3g\n" % (frontDiffuse, backDiffuse))
-
- tabWrite("ambient %.3g\n" % material.pov.ambient)
+ tab_write(
+ "specular %.3g\n"
+ % (
+ (material.pov.specular_intensity * material.pov.specular_color.v)
+ * (255 * slot.specular_factor)
+ )
+ )
+ tab_write("roughness %.3g\n" % (1 / material.pov.specular_hardness))
+ tab_write("diffuse %.3g %.3g\n" % (front_diffuse, back_diffuse))
+
+ tab_write("ambient %.3g\n" % material.pov.ambient)
# POV-Ray blends the global value
- #tabWrite("ambient rgb <%.3g, %.3g, %.3g>\n" % \
+ # tab_write("ambient rgb <%.3g, %.3g, %.3g>\n" % \
# tuple([c*material.pov.ambient for c in world.ambient_color]))
- tabWrite("emission %.3g\n" % material.pov.emit) # New in POV-Ray 3.7
+ tab_write("emission %.3g\n" % material.pov.emit) # New in POV-Ray 3.7
- #POV-Ray just ignores roughness if there's no specular keyword
- #tabWrite("roughness %.3g\n" % roughness)
+ # POV-Ray just ignores roughness if there's no specular keyword
+ # tab_write("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")
+ tab_write("conserve_energy\n")
- if colored_specular_found == True:
- tabWrite("metallic\n")
+ if colored_specular_found:
+ tab_write("metallic\n")
# 'phong 70.0 '
- if Level != 1:
+ if ref_level_bound != 1:
if material.pov_raytrace_mirror.use:
raytrace_mirror = material.pov_raytrace_mirror
if raytrace_mirror.reflect_factor:
- tabWrite("reflection {\n")
- tabWrite("rgb <%.3g, %.3g, %.3g>\n" % material.pov.mirror_color[:])
+ tab_write("reflection {\n")
+ tab_write("rgb <%.3g, %.3g, %.3g>\n" % material.pov.mirror_color[:])
if material.pov.mirror_metallic:
- tabWrite("metallic %.3g\n" % (raytrace_mirror.reflect_factor))
+ tab_write("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
+ # tab_write("#ifdef(unofficial) #if(unofficial = \"patch\") #if(patch(\"upov-reflection-roughness\") > 0)\n")
+ tab_write(
+ "roughness %.6f\n" % (0.000001 / raytrace_mirror.gloss_factor)
+ )
+ # tab_write("#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))
+ tab_write("fresnel 1 ")
+ tab_write(
+ "falloff %.3g exponent %.3g} "
+ % (raytrace_mirror.fresnel, raytrace_mirror.fresnel_factor)
+ )
if material.pov_subsurface_scattering.use:
subsurface_scattering = material.pov_subsurface_scattering
- tabWrite("subsurface { translucency <%.3g, %.3g, %.3g> }\n" % (
- (subsurface_scattering.radius[0]),
- (subsurface_scattering.radius[1]),
- (subsurface_scattering.radius[2]),
- )
- )
+ tab_write(
+ "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))
+ tab_write(
+ "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")
+ tab_write("diffuse 0.8\n")
+ tab_write("phong 70.0\n")
- #tabWrite("specular 0.2\n")
+ # tab_write("specular 0.2\n")
# This is written into the object
- '''
+ """
if material and material.pov.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.pov.specular_hardness/256.0) # Like hardness
+ # tab_write("crand 1.0\n") # Sand granyness
+ # tab_write("metallic %.6f\n" % material.spec)
+ # tab_write("phong %.6f\n" % material.spec)
+ # tab_write("phong_size %.6f\n" % material.spec)
+ # tab_write("brilliance %.6f " % (material.pov.specular_hardness/256.0) # Like hardness
- tabWrite("}\n\n")
+ tab_write("}\n\n")
- # Level=2 Means translation of spec and mir levels for when no map influences them
- povHasnoSpecularMaps(Level=2)
+ # ref_level_bound=2 Means translation of spec and mir levels for when no map influences them
+ pov_has_no_specular_maps(ref_level_bound=2)
if material:
special_texture_found = False
@@ -271,1495 +389,1181 @@ def writeMaterial(using_uberpov, DEF_MAT_NAME, scene, tabWrite, safety, comments
for t in material.pov_texture_slots:
tmpidx += 1
# index = material.pov.active_texture_index
- slot = material.pov_texture_slots[tmpidx] # [index]
- povtex = slot.texture # slot.name
+ slot = material.pov_texture_slots[tmpidx] # [index]
+ povtex = slot.texture # slot.name
tex = bpy.data.textures[povtex]
if t and t.use and tex is not None:
-
- if (tex.type == 'IMAGE' and tex.image) or tex.type != 'IMAGE':
- #validPath
- if(t and t.use and
- (t.use_map_specular or t.use_map_raymir or t.use_map_normal or t.use_map_alpha)):
+ if (tex.type == "IMAGE" and tex.image) or tex.type != "IMAGE":
+ # validPath
+ if (
+ t
+ and t.use
+ 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)
+ # ref_level_bound=1 Means No specular nor Mirror reflection
+ pov_has_no_specular_maps(ref_level_bound=1)
+
+ # ref_level_bound=3 Means Maximum Spec and Mirror
+ pov_has_no_specular_maps(ref_level_bound=3)
- # Level=3 Means Maximum Spec and Mirror
- povHasnoSpecularMaps(Level=3)
-def exportPattern(texture, string_strip_hyphen):
+def export_pattern(texture):
"""Translate Blender procedural textures to POV patterns and write to pov file.
Function Patterns can be used to better access sub components of a pattern like
- grey values for influence mapping"""
-
- tex=texture
+ grey values for influence mapping
+ """
+ tex = texture
pat = tex.pov
- PATname = "PAT_%s"%string_strip_hyphen(bpy.path.clean_name(tex.name))
- mappingDif = ("translate <%.4g,%.4g,%.4g> scale <%.4g,%.4g,%.4g>" % \
- (pat.tex_mov_x, pat.tex_mov_y, pat.tex_mov_z,
- 1.0 / pat.tex_scale_x, 1.0 / pat.tex_scale_y, 1.0 / pat.tex_scale_z))
- texStrg=""
- def exportColorRamp(texture):
- tex=texture
+ pat_name = "PAT_%s" % string_strip_hyphen(bpy.path.clean_name(tex.name))
+ mapping_dif = "translate <%.4g,%.4g,%.4g> scale <%.4g,%.4g,%.4g>" % (
+ pat.tex_mov_x,
+ pat.tex_mov_y,
+ pat.tex_mov_z,
+ 1.0 / pat.tex_scale_x,
+ 1.0 / pat.tex_scale_y,
+ 1.0 / pat.tex_scale_z,
+ )
+ text_strg = ""
+
+ def export_color_ramp(texture):
+ tex = texture
pat = tex.pov
- colRampStrg="color_map {\n"
- numColor=0
+ col_ramp_strg = "color_map {\n"
+ num_color = 0
for el in tex.color_ramp.elements:
- numColor+=1
+ num_color += 1
pos = el.position
- col=el.color
- colR,colG,colB,colA = col[0],col[1],col[2],1-col[3]
- if pat.tex_pattern_type not in {'checker', 'hexagon', 'square', 'triangular', 'brick'} :
- colRampStrg+="[%.4g color rgbf<%.4g,%.4g,%.4g,%.4g>] \n"%(pos,colR,colG,colB,colA)
- if pat.tex_pattern_type in {'brick','checker'} and numColor < 3:
- colRampStrg+="color rgbf<%.4g,%.4g,%.4g,%.4g> \n"%(colR,colG,colB,colA)
- if pat.tex_pattern_type == 'hexagon' and numColor < 4 :
- colRampStrg+="color rgbf<%.4g,%.4g,%.4g,%.4g> \n"%(colR,colG,colB,colA)
- if pat.tex_pattern_type == 'square' and numColor < 5 :
- colRampStrg+="color rgbf<%.4g,%.4g,%.4g,%.4g> \n"%(colR,colG,colB,colA)
- if pat.tex_pattern_type == 'triangular' and numColor < 7 :
- colRampStrg+="color rgbf<%.4g,%.4g,%.4g,%.4g> \n"%(colR,colG,colB,colA)
-
- colRampStrg+="} \n"
- #end color map
- return colRampStrg
- #much work to be done here only defaults translated for now:
- #pov noise_generator 3 means perlin noise
- if tex.type not in {'NONE', 'IMAGE'} and pat.tex_pattern_type == 'emulator':
- texStrg+="pigment {\n"
+ col = el.color
+ col_r, col_g, col_b, col_a = col[0], col[1], col[2], 1 - col[3]
+ if pat.tex_pattern_type not in {"checker", "hexagon", "square", "triangular", "brick"}:
+ col_ramp_strg += "[%.4g color rgbf<%.4g,%.4g,%.4g,%.4g>] \n" % (
+ pos,
+ col_r,
+ col_g,
+ col_b,
+ col_a,
+ )
+ if pat.tex_pattern_type in {"brick", "checker"} and num_color < 3:
+ col_ramp_strg += "color rgbf<%.4g,%.4g,%.4g,%.4g> \n" % (col_r, col_g, col_b, col_a)
+ if pat.tex_pattern_type == "hexagon" and num_color < 4:
+ col_ramp_strg += "color rgbf<%.4g,%.4g,%.4g,%.4g> \n" % (col_r, col_g, col_b, col_a)
+ if pat.tex_pattern_type == "square" and num_color < 5:
+ col_ramp_strg += "color rgbf<%.4g,%.4g,%.4g,%.4g> \n" % (col_r, col_g, col_b, col_a)
+ if pat.tex_pattern_type == "triangular" and num_color < 7:
+ col_ramp_strg += "color rgbf<%.4g,%.4g,%.4g,%.4g> \n" % (col_r, col_g, col_b, col_a)
+
+ col_ramp_strg += "} \n"
+ # end color map
+ return col_ramp_strg
+
+ # much work to be done here only defaults translated for now:
+ # pov noise_generator 3 means perlin noise
+ if tex.type not in {"NONE", "IMAGE"} and pat.tex_pattern_type == "emulator":
+ text_strg += "pigment {\n"
####################### EMULATE BLENDER VORONOI TEXTURE ####################
- if tex.type == 'VORONOI':
- texStrg+="crackle\n"
- texStrg+=" offset %.4g\n"%tex.nabla
- texStrg+=" form <%.4g,%.4g,%.4g>\n"%(tex.weight_1, tex.weight_2, tex.weight_3)
- if tex.distance_metric == 'DISTANCE':
- texStrg+=" metric 2.5\n"
- if tex.distance_metric == 'DISTANCE_SQUARED':
- texStrg+=" metric 2.5\n"
- texStrg+=" poly_wave 2\n"
- if tex.distance_metric == 'MINKOVSKY':
- texStrg+=" metric %s\n"%tex.minkovsky_exponent
- if tex.distance_metric == 'MINKOVSKY_FOUR':
- texStrg+=" metric 4\n"
- if tex.distance_metric == 'MINKOVSKY_HALF':
- texStrg+=" metric 0.5\n"
- if tex.distance_metric == 'CHEBYCHEV':
- texStrg+=" metric 10\n"
- if tex.distance_metric == 'MANHATTAN':
- texStrg+=" metric 1\n"
-
- if tex.color_mode == 'POSITION':
- texStrg+="solid\n"
- texStrg+="scale 0.25\n"
- if tex.use_color_ramp == True:
- texStrg+=exportColorRamp(tex)
+ if tex.type == "VORONOI":
+ text_strg += "crackle\n"
+ text_strg += " offset %.4g\n" % tex.nabla
+ text_strg += " form <%.4g,%.4g,%.4g>\n" % (tex.weight_1, tex.weight_2, tex.weight_3)
+ if tex.distance_metric == "DISTANCE":
+ text_strg += " metric 2.5\n"
+ if tex.distance_metric == "DISTANCE_SQUARED":
+ text_strg += " metric 2.5\n"
+ text_strg += " poly_wave 2\n"
+ if tex.distance_metric == "MINKOVSKY":
+ text_strg += " metric %s\n" % tex.minkovsky_exponent
+ if tex.distance_metric == "MINKOVSKY_FOUR":
+ text_strg += " metric 4\n"
+ if tex.distance_metric == "MINKOVSKY_HALF":
+ text_strg += " metric 0.5\n"
+ if tex.distance_metric == "CHEBYCHEV":
+ text_strg += " metric 10\n"
+ if tex.distance_metric == "MANHATTAN":
+ text_strg += " metric 1\n"
+
+ if tex.color_mode == "POSITION":
+ text_strg += "solid\n"
+ text_strg += "scale 0.25\n"
+ if tex.use_color_ramp:
+ text_strg += export_color_ramp(tex)
else:
- texStrg+="color_map {\n"
- texStrg+="[0 color rgbt<0,0,0,1>]\n"
- texStrg+="[1 color rgbt<1,1,1,0>]\n"
- texStrg+="}\n"
+ text_strg += "color_map {\n"
+ text_strg += "[0 color rgbt<0,0,0,1>]\n"
+ text_strg += "[1 color rgbt<1,1,1,0>]\n"
+ text_strg += "}\n"
####################### EMULATE BLENDER CLOUDS TEXTURE ####################
- if tex.type == 'CLOUDS':
- if tex.noise_type == 'SOFT_NOISE':
- texStrg+="wrinkles\n"
- texStrg+="scale 0.25\n"
+ if tex.type == "CLOUDS":
+ if tex.noise_type == "SOFT_NOISE":
+ text_strg += "wrinkles\n"
+ text_strg += "scale 0.25\n"
else:
- texStrg+="granite\n"
- if tex.use_color_ramp == True:
- texStrg+=exportColorRamp(tex)
+ text_strg += "granite\n"
+ if tex.use_color_ramp:
+ text_strg += export_color_ramp(tex)
else:
- texStrg+="color_map {\n"
- texStrg+="[0 color rgbt<0,0,0,1>]\n"
- texStrg+="[1 color rgbt<1,1,1,0>]\n"
- texStrg+="}\n"
+ text_strg += "color_map {\n"
+ text_strg += "[0 color rgbt<0,0,0,1>]\n"
+ text_strg += "[1 color rgbt<1,1,1,0>]\n"
+ text_strg += "}\n"
####################### EMULATE BLENDER WOOD TEXTURE ####################
- if tex.type == 'WOOD':
- if tex.wood_type == 'RINGS':
- texStrg+="wood\n"
- texStrg+="scale 0.25\n"
- if tex.wood_type == 'RINGNOISE':
- texStrg+="wood\n"
- texStrg+="scale 0.25\n"
- texStrg+="turbulence %.4g\n"%(tex.turbulence/100)
- if tex.wood_type == 'BANDS':
- texStrg+="marble\n"
- texStrg+="scale 0.25\n"
- texStrg+="rotate <45,-45,45>\n"
- if tex.wood_type == 'BANDNOISE':
- texStrg+="marble\n"
- texStrg+="scale 0.25\n"
- texStrg+="rotate <45,-45,45>\n"
- texStrg+="turbulence %.4g\n"%(tex.turbulence/10)
-
- if tex.noise_basis_2 == 'SIN':
- texStrg+="sine_wave\n"
- if tex.noise_basis_2 == 'TRI':
- texStrg+="triangle_wave\n"
- if tex.noise_basis_2 == 'SAW':
- texStrg+="ramp_wave\n"
- if tex.use_color_ramp == True:
- texStrg+=exportColorRamp(tex)
+ if tex.type == "WOOD":
+ if tex.wood_type == "RINGS":
+ text_strg += "wood\n"
+ text_strg += "scale 0.25\n"
+ if tex.wood_type == "RINGNOISE":
+ text_strg += "wood\n"
+ text_strg += "scale 0.25\n"
+ text_strg += "turbulence %.4g\n" % (tex.turbulence / 100)
+ if tex.wood_type == "BANDS":
+ text_strg += "marble\n"
+ text_strg += "scale 0.25\n"
+ text_strg += "rotate <45,-45,45>\n"
+ if tex.wood_type == "BANDNOISE":
+ text_strg += "marble\n"
+ text_strg += "scale 0.25\n"
+ text_strg += "rotate <45,-45,45>\n"
+ text_strg += "turbulence %.4g\n" % (tex.turbulence / 10)
+
+ if tex.noise_basis_2 == "SIN":
+ text_strg += "sine_wave\n"
+ if tex.noise_basis_2 == "TRI":
+ text_strg += "triangle_wave\n"
+ if tex.noise_basis_2 == "SAW":
+ text_strg += "ramp_wave\n"
+ if tex.use_color_ramp:
+ text_strg += export_color_ramp(tex)
else:
- texStrg+="color_map {\n"
- texStrg+="[0 color rgbt<0,0,0,0>]\n"
- texStrg+="[1 color rgbt<1,1,1,0>]\n"
- texStrg+="}\n"
+ text_strg += "color_map {\n"
+ text_strg += "[0 color rgbt<0,0,0,0>]\n"
+ text_strg += "[1 color rgbt<1,1,1,0>]\n"
+ text_strg += "}\n"
####################### EMULATE BLENDER STUCCI TEXTURE ####################
- if tex.type == 'STUCCI':
- texStrg+="bozo\n"
- texStrg+="scale 0.25\n"
- if tex.noise_type == 'HARD_NOISE':
- texStrg+="triangle_wave\n"
- if tex.use_color_ramp == True:
- texStrg+=exportColorRamp(tex)
+ if tex.type == "STUCCI":
+ text_strg += "bozo\n"
+ text_strg += "scale 0.25\n"
+ if tex.noise_type == "HARD_NOISE":
+ text_strg += "triangle_wave\n"
+ if tex.use_color_ramp:
+ text_strg += export_color_ramp(tex)
else:
- texStrg+="color_map {\n"
- texStrg+="[0 color rgbf<1,1,1,0>]\n"
- texStrg+="[1 color rgbt<0,0,0,1>]\n"
- texStrg+="}\n"
+ text_strg += "color_map {\n"
+ text_strg += "[0 color rgbf<1,1,1,0>]\n"
+ text_strg += "[1 color rgbt<0,0,0,1>]\n"
+ text_strg += "}\n"
else:
- if tex.use_color_ramp == True:
- texStrg+=exportColorRamp(tex)
+ if tex.use_color_ramp:
+ text_strg += export_color_ramp(tex)
else:
- texStrg+="color_map {\n"
- texStrg+="[0 color rgbf<0,0,0,1>]\n"
- texStrg+="[1 color rgbt<1,1,1,0>]\n"
- texStrg+="}\n"
+ text_strg += "color_map {\n"
+ text_strg += "[0 color rgbf<0,0,0,1>]\n"
+ text_strg += "[1 color rgbt<1,1,1,0>]\n"
+ text_strg += "}\n"
####################### EMULATE BLENDER MAGIC TEXTURE ####################
- if tex.type == 'MAGIC':
- texStrg+="leopard\n"
- if tex.use_color_ramp == True:
- texStrg+=exportColorRamp(tex)
+ if tex.type == "MAGIC":
+ text_strg += "leopard\n"
+ if tex.use_color_ramp:
+ text_strg += export_color_ramp(tex)
else:
- texStrg+="color_map {\n"
- texStrg+="[0 color rgbt<1,1,1,0.5>]\n"
- texStrg+="[0.25 color rgbf<0,1,0,0.75>]\n"
- texStrg+="[0.5 color rgbf<0,0,1,0.75>]\n"
- texStrg+="[0.75 color rgbf<1,0,1,0.75>]\n"
- texStrg+="[1 color rgbf<0,1,0,0.75>]\n"
- texStrg+="}\n"
- texStrg+="scale 0.1\n"
+ text_strg += "color_map {\n"
+ text_strg += "[0 color rgbt<1,1,1,0.5>]\n"
+ text_strg += "[0.25 color rgbf<0,1,0,0.75>]\n"
+ text_strg += "[0.5 color rgbf<0,0,1,0.75>]\n"
+ text_strg += "[0.75 color rgbf<1,0,1,0.75>]\n"
+ text_strg += "[1 color rgbf<0,1,0,0.75>]\n"
+ text_strg += "}\n"
+ text_strg += "scale 0.1\n"
####################### EMULATE BLENDER MARBLE TEXTURE ####################
- if tex.type == 'MARBLE':
- texStrg+="marble\n"
- texStrg+="turbulence 0.5\n"
- texStrg+="noise_generator 3\n"
- texStrg+="scale 0.75\n"
- texStrg+="rotate <45,-45,45>\n"
- if tex.use_color_ramp == True:
- texStrg+=exportColorRamp(tex)
+ if tex.type == "MARBLE":
+ text_strg += "marble\n"
+ text_strg += "turbulence 0.5\n"
+ text_strg += "noise_generator 3\n"
+ text_strg += "scale 0.75\n"
+ text_strg += "rotate <45,-45,45>\n"
+ if tex.use_color_ramp:
+ text_strg += export_color_ramp(tex)
else:
- if tex.marble_type == 'SOFT':
- texStrg+="color_map {\n"
- texStrg+="[0 color rgbt<0,0,0,0>]\n"
- texStrg+="[0.05 color rgbt<0,0,0,0>]\n"
- texStrg+="[1 color rgbt<0.9,0.9,0.9,0>]\n"
- texStrg+="}\n"
- elif tex.marble_type == 'SHARP':
- texStrg+="color_map {\n"
- texStrg+="[0 color rgbt<0,0,0,0>]\n"
- texStrg+="[0.025 color rgbt<0,0,0,0>]\n"
- texStrg+="[1 color rgbt<0.9,0.9,0.9,0>]\n"
- texStrg+="}\n"
+ if tex.marble_type == "SOFT":
+ text_strg += "color_map {\n"
+ text_strg += "[0 color rgbt<0,0,0,0>]\n"
+ text_strg += "[0.05 color rgbt<0,0,0,0>]\n"
+ text_strg += "[1 color rgbt<0.9,0.9,0.9,0>]\n"
+ text_strg += "}\n"
+ elif tex.marble_type == "SHARP":
+ text_strg += "color_map {\n"
+ text_strg += "[0 color rgbt<0,0,0,0>]\n"
+ text_strg += "[0.025 color rgbt<0,0,0,0>]\n"
+ text_strg += "[1 color rgbt<0.9,0.9,0.9,0>]\n"
+ text_strg += "}\n"
else:
- texStrg+="[0 color rgbt<0,0,0,0>]\n"
- texStrg+="[1 color rgbt<1,1,1,0>]\n"
- texStrg+="}\n"
- if tex.noise_basis_2 == 'SIN':
- texStrg+="sine_wave\n"
- if tex.noise_basis_2 == 'TRI':
- texStrg+="triangle_wave\n"
- if tex.noise_basis_2 == 'SAW':
- texStrg+="ramp_wave\n"
+ text_strg += "[0 color rgbt<0,0,0,0>]\n"
+ text_strg += "[1 color rgbt<1,1,1,0>]\n"
+ text_strg += "}\n"
+ if tex.noise_basis_2 == "SIN":
+ text_strg += "sine_wave\n"
+ if tex.noise_basis_2 == "TRI":
+ text_strg += "triangle_wave\n"
+ if tex.noise_basis_2 == "SAW":
+ text_strg += "ramp_wave\n"
####################### EMULATE BLENDER BLEND TEXTURE ####################
- if tex.type == 'BLEND':
- if tex.progression=='RADIAL':
- texStrg+="radial\n"
- if tex.use_flip_axis=='HORIZONTAL':
- texStrg+="rotate x*90\n"
+ if tex.type == "BLEND":
+ if tex.progression == "RADIAL":
+ text_strg += "radial\n"
+ if tex.use_flip_axis == "HORIZONTAL":
+ text_strg += "rotate x*90\n"
else:
- texStrg+="rotate <-90,0,90>\n"
- texStrg+="ramp_wave\n"
- elif tex.progression=='SPHERICAL':
- texStrg+="spherical\n"
- texStrg+="scale 3\n"
- texStrg+="poly_wave 1\n"
- elif tex.progression=='QUADRATIC_SPHERE':
- texStrg+="spherical\n"
- texStrg+="scale 3\n"
- texStrg+=" poly_wave 2\n"
- elif tex.progression=='DIAGONAL':
- texStrg+="gradient <1,1,0>\n"
- texStrg+="scale 3\n"
- elif tex.use_flip_axis=='HORIZONTAL':
- texStrg+="gradient x\n"
- texStrg+="scale 2.01\n"
- elif tex.use_flip_axis=='VERTICAL':
- texStrg+="gradient y\n"
- texStrg+="scale 2.01\n"
- #texStrg+="ramp_wave\n"
- #texStrg+="frequency 0.5\n"
- texStrg+="phase 0.5\n"
- if tex.use_color_ramp == True:
- texStrg+=exportColorRamp(tex)
+ text_strg += "rotate <-90,0,90>\n"
+ text_strg += "ramp_wave\n"
+ elif tex.progression == "SPHERICAL":
+ text_strg += "spherical\n"
+ text_strg += "scale 3\n"
+ text_strg += "poly_wave 1\n"
+ elif tex.progression == "QUADRATIC_SPHERE":
+ text_strg += "spherical\n"
+ text_strg += "scale 3\n"
+ text_strg += " poly_wave 2\n"
+ elif tex.progression == "DIAGONAL":
+ text_strg += "gradient <1,1,0>\n"
+ text_strg += "scale 3\n"
+ elif tex.use_flip_axis == "HORIZONTAL":
+ text_strg += "gradient x\n"
+ text_strg += "scale 2.01\n"
+ elif tex.use_flip_axis == "VERTICAL":
+ text_strg += "gradient y\n"
+ text_strg += "scale 2.01\n"
+ # text_strg+="ramp_wave\n"
+ # text_strg+="frequency 0.5\n"
+ text_strg += "phase 0.5\n"
+ if tex.use_color_ramp:
+ text_strg += export_color_ramp(tex)
else:
- texStrg+="color_map {\n"
- texStrg+="[0 color rgbt<1,1,1,0>]\n"
- texStrg+="[1 color rgbf<0,0,0,1>]\n"
- texStrg+="}\n"
- if tex.progression == 'LINEAR':
- texStrg+=" poly_wave 1\n"
- if tex.progression == 'QUADRATIC':
- texStrg+=" poly_wave 2\n"
- if tex.progression == 'EASING':
- texStrg+=" poly_wave 1.5\n"
-
+ text_strg += "color_map {\n"
+ text_strg += "[0 color rgbt<1,1,1,0>]\n"
+ text_strg += "[1 color rgbf<0,0,0,1>]\n"
+ text_strg += "}\n"
+ if tex.progression == "LINEAR":
+ text_strg += " poly_wave 1\n"
+ if tex.progression == "QUADRATIC":
+ text_strg += " poly_wave 2\n"
+ if tex.progression == "EASING":
+ text_strg += " poly_wave 1.5\n"
####################### EMULATE BLENDER MUSGRAVE TEXTURE ####################
# if tex.type == 'MUSGRAVE':
- # texStrg+="function{ f_ridged_mf( x, y, 0, 1, 2, 9, -0.5, 3,3 )*0.5}\n"
- # texStrg+="color_map {\n"
- # texStrg+="[0 color rgbf<0,0,0,1>]\n"
- # texStrg+="[1 color rgbf<1,1,1,0>]\n"
- # texStrg+="}\n"
+ # text_strg+="function{ f_ridged_mf( x, y, 0, 1, 2, 9, -0.5, 3,3 )*0.5}\n"
+ # text_strg+="color_map {\n"
+ # text_strg+="[0 color rgbf<0,0,0,1>]\n"
+ # text_strg+="[1 color rgbf<1,1,1,0>]\n"
+ # text_strg+="}\n"
# simplified for now:
- if tex.type == 'MUSGRAVE':
- texStrg+="bozo scale 0.25 \n"
- if tex.use_color_ramp == True:
- texStrg+=exportColorRamp(tex)
+ if tex.type == "MUSGRAVE":
+ text_strg += "bozo scale 0.25 \n"
+ if tex.use_color_ramp:
+ text_strg += export_color_ramp(tex)
else:
- texStrg+="color_map {[0.5 color rgbf<0,0,0,1>][1 color rgbt<1,1,1,0>]}ramp_wave \n"
+ text_strg += (
+ "color_map {[0.5 color rgbf<0,0,0,1>][1 color rgbt<1,1,1,0>]}ramp_wave \n"
+ )
####################### EMULATE BLENDER DISTORTED NOISE TEXTURE ####################
- if tex.type == 'DISTORTED_NOISE':
- texStrg+="average\n"
- texStrg+=" pigment_map {\n"
- texStrg+=" [1 bozo scale 0.25 turbulence %.4g\n" %tex.distortion
- if tex.use_color_ramp == True:
- texStrg+=exportColorRamp(tex)
+ if tex.type == "DISTORTED_NOISE":
+ text_strg += "average\n"
+ text_strg += " pigment_map {\n"
+ text_strg += " [1 bozo scale 0.25 turbulence %.4g\n" % tex.distortion
+ if tex.use_color_ramp:
+ text_strg += export_color_ramp(tex)
else:
- texStrg+="color_map {\n"
- texStrg+="[0 color rgbt<1,1,1,0>]\n"
- texStrg+="[1 color rgbf<0,0,0,1>]\n"
- texStrg+="}\n"
- texStrg+="]\n"
-
- if tex.noise_distortion == 'CELL_NOISE':
- texStrg+=" [1 cells scale 0.1\n"
- if tex.use_color_ramp == True:
- texStrg+=exportColorRamp(tex)
+ text_strg += "color_map {\n"
+ text_strg += "[0 color rgbt<1,1,1,0>]\n"
+ text_strg += "[1 color rgbf<0,0,0,1>]\n"
+ text_strg += "}\n"
+ text_strg += "]\n"
+
+ if tex.noise_distortion == "CELL_NOISE":
+ text_strg += " [1 cells scale 0.1\n"
+ if tex.use_color_ramp:
+ text_strg += export_color_ramp(tex)
else:
- texStrg+="color_map {\n"
- texStrg+="[0 color rgbt<1,1,1,0>]\n"
- texStrg+="[1 color rgbf<0,0,0,1>]\n"
- texStrg+="}\n"
- texStrg+="]\n"
- if tex.noise_distortion=='VORONOI_CRACKLE':
- texStrg+=" [1 crackle scale 0.25\n"
- if tex.use_color_ramp == True:
- texStrg+=exportColorRamp(tex)
+ text_strg += "color_map {\n"
+ text_strg += "[0 color rgbt<1,1,1,0>]\n"
+ text_strg += "[1 color rgbf<0,0,0,1>]\n"
+ text_strg += "}\n"
+ text_strg += "]\n"
+ if tex.noise_distortion == "VORONOI_CRACKLE":
+ text_strg += " [1 crackle scale 0.25\n"
+ if tex.use_color_ramp:
+ text_strg += export_color_ramp(tex)
else:
- texStrg+="color_map {\n"
- texStrg+="[0 color rgbt<1,1,1,0>]\n"
- texStrg+="[1 color rgbf<0,0,0,1>]\n"
- texStrg+="}\n"
- texStrg+="]\n"
- if tex.noise_distortion in ['VORONOI_F1','VORONOI_F2','VORONOI_F3','VORONOI_F4','VORONOI_F2_F1']:
- texStrg+=" [1 crackle metric 2.5 scale 0.25 turbulence %.4g\n" %(tex.distortion/2)
- if tex.use_color_ramp == True:
- texStrg+=exportColorRamp(tex)
+ text_strg += "color_map {\n"
+ text_strg += "[0 color rgbt<1,1,1,0>]\n"
+ text_strg += "[1 color rgbf<0,0,0,1>]\n"
+ text_strg += "}\n"
+ text_strg += "]\n"
+ if tex.noise_distortion in [
+ "VORONOI_F1",
+ "VORONOI_F2",
+ "VORONOI_F3",
+ "VORONOI_F4",
+ "VORONOI_F2_F1",
+ ]:
+ text_strg += " [1 crackle metric 2.5 scale 0.25 turbulence %.4g\n" % (
+ tex.distortion / 2
+ )
+ if tex.use_color_ramp:
+ text_strg += export_color_ramp(tex)
else:
- texStrg+="color_map {\n"
- texStrg+="[0 color rgbt<1,1,1,0>]\n"
- texStrg+="[1 color rgbf<0,0,0,1>]\n"
- texStrg+="}\n"
- texStrg+="]\n"
+ text_strg += "color_map {\n"
+ text_strg += "[0 color rgbt<1,1,1,0>]\n"
+ text_strg += "[1 color rgbf<0,0,0,1>]\n"
+ text_strg += "}\n"
+ text_strg += "]\n"
else:
- texStrg+=" [1 wrinkles scale 0.25\n"
- if tex.use_color_ramp == True:
- texStrg+=exportColorRamp(tex)
+ text_strg += " [1 wrinkles scale 0.25\n"
+ if tex.use_color_ramp:
+ text_strg += export_color_ramp(tex)
else:
- texStrg+="color_map {\n"
- texStrg+="[0 color rgbt<1,1,1,0>]\n"
- texStrg+="[1 color rgbf<0,0,0,1>]\n"
- texStrg+="}\n"
- texStrg+="]\n"
- texStrg+=" }\n"
+ text_strg += "color_map {\n"
+ text_strg += "[0 color rgbt<1,1,1,0>]\n"
+ text_strg += "[1 color rgbf<0,0,0,1>]\n"
+ text_strg += "}\n"
+ text_strg += "]\n"
+ text_strg += " }\n"
####################### EMULATE BLENDER NOISE TEXTURE ####################
- if tex.type == 'NOISE':
- texStrg+="cells\n"
- texStrg+="turbulence 3\n"
- texStrg+="omega 3\n"
- if tex.use_color_ramp == True:
- texStrg+=exportColorRamp(tex)
+ if tex.type == "NOISE":
+ text_strg += "cells\n"
+ text_strg += "turbulence 3\n"
+ text_strg += "omega 3\n"
+ if tex.use_color_ramp:
+ text_strg += export_color_ramp(tex)
else:
- texStrg+="color_map {\n"
- texStrg+="[0.75 color rgb<0,0,0,>]\n"
- texStrg+="[1 color rgb<1,1,1,>]\n"
- texStrg+="}\n"
+ text_strg += "color_map {\n"
+ text_strg += "[0.75 color rgb<0,0,0,>]\n"
+ text_strg += "[1 color rgb<1,1,1,>]\n"
+ text_strg += "}\n"
####################### IGNORE OTHER BLENDER TEXTURE ####################
- else: #non translated textures
+ else: # non translated textures
pass
- texStrg+="}\n\n"
-
- texStrg+="#declare f%s=\n"%PATname
- texStrg+="function{pigment{%s}}\n"%PATname
- texStrg+="\n"
-
- elif pat.tex_pattern_type != 'emulator':
- texStrg+="pigment {\n"
- texStrg+="%s\n"%pat.tex_pattern_type
- if pat.tex_pattern_type == 'agate':
- texStrg+="agate_turb %.4g\n"%pat.modifier_turbulence
- if pat.tex_pattern_type in {'spiral1', 'spiral2', 'tiling'}:
- texStrg+="%s\n"%pat.modifier_numbers
- if pat.tex_pattern_type == 'quilted':
- texStrg+="control0 %s control1 %s\n"%(pat.modifier_control0, pat.modifier_control1)
- if pat.tex_pattern_type == 'mandel':
- texStrg+="%s exponent %s \n"%(pat.f_iter, pat.f_exponent)
- if pat.tex_pattern_type == 'julia':
- texStrg+="<%.4g, %.4g> %s exponent %s \n"%(pat.julia_complex_1, pat.julia_complex_2, pat.f_iter, pat.f_exponent)
- if pat.tex_pattern_type == 'magnet' and pat.magnet_style == 'mandel':
- texStrg+="%s mandel %s \n"%(pat.magnet_type, pat.f_iter)
- if pat.tex_pattern_type == 'magnet' and pat.magnet_style == 'julia':
- texStrg+="%s julia <%.4g, %.4g> %s\n"%(pat.magnet_type, pat.julia_complex_1, pat.julia_complex_2, pat.f_iter)
- if pat.tex_pattern_type in {'mandel', 'julia', 'magnet'}:
- texStrg+="interior %s, %.4g\n"%(pat.f_ior, pat.f_ior_fac)
- texStrg+="exterior %s, %.4g\n"%(pat.f_eor, pat.f_eor_fac)
- if pat.tex_pattern_type == 'gradient':
- texStrg+="<%s, %s, %s> \n"%(pat.grad_orient_x, pat.grad_orient_y, pat.grad_orient_z)
- if pat.tex_pattern_type == 'pavement':
- numTiles=pat.pave_tiles
- numPattern=1
- if pat.pave_sides == '4' and pat.pave_tiles == 3:
- numPattern = pat.pave_pat_2
- if pat.pave_sides == '6' and pat.pave_tiles == 3:
- numPattern = pat.pave_pat_3
- if pat.pave_sides == '3' and pat.pave_tiles == 4:
- numPattern = pat.pave_pat_3
- if pat.pave_sides == '3' and pat.pave_tiles == 5:
- numPattern = pat.pave_pat_4
- if pat.pave_sides == '4' and pat.pave_tiles == 4:
- numPattern = pat.pave_pat_5
- if pat.pave_sides == '6' and pat.pave_tiles == 4:
- numPattern = pat.pave_pat_7
- if pat.pave_sides == '4' and pat.pave_tiles == 5:
- numPattern = pat.pave_pat_12
- if pat.pave_sides == '3' and pat.pave_tiles == 6:
- numPattern = pat.pave_pat_12
- if pat.pave_sides == '6' and pat.pave_tiles == 5:
- numPattern = pat.pave_pat_22
- if pat.pave_sides == '4' and pat.pave_tiles == 6:
- numPattern = pat.pave_pat_35
- if pat.pave_sides == '6' and pat.pave_tiles == 6:
- numTiles = 5
- texStrg+="number_of_sides %s number_of_tiles %s pattern %s form %s \n"%(pat.pave_sides, numTiles, numPattern, pat.pave_form)
- ################ functions #####################################################################################################
- if pat.tex_pattern_type == 'function':
- texStrg+="{ %s"%pat.func_list
- texStrg+="(x"
+ text_strg += "}\n\n"
+
+ text_strg += "#declare f%s=\n" % pat_name
+ text_strg += "function{pigment{%s}}\n" % pat_name
+ text_strg += "\n"
+
+ elif pat.tex_pattern_type != "emulator":
+ text_strg += "pigment {\n"
+ text_strg += "%s\n" % pat.tex_pattern_type
+ if pat.tex_pattern_type == "agate":
+ text_strg += "agate_turb %.4g\n" % pat.modifier_turbulence
+ if pat.tex_pattern_type in {"spiral1", "spiral2", "tiling"}:
+ text_strg += "%s\n" % pat.modifier_numbers
+ if pat.tex_pattern_type == "quilted":
+ text_strg += "control0 %s control1 %s\n" % (
+ pat.modifier_control0,
+ pat.modifier_control1,
+ )
+ if pat.tex_pattern_type == "mandel":
+ text_strg += "%s exponent %s \n" % (pat.f_iter, pat.f_exponent)
+ if pat.tex_pattern_type == "julia":
+ text_strg += "<%.4g, %.4g> %s exponent %s \n" % (
+ pat.julia_complex_1,
+ pat.julia_complex_2,
+ pat.f_iter,
+ pat.f_exponent,
+ )
+ if pat.tex_pattern_type == "magnet" and pat.magnet_style == "mandel":
+ text_strg += "%s mandel %s \n" % (pat.magnet_type, pat.f_iter)
+ if pat.tex_pattern_type == "magnet" and pat.magnet_style == "julia":
+ text_strg += "%s julia <%.4g, %.4g> %s\n" % (
+ pat.magnet_type,
+ pat.julia_complex_1,
+ pat.julia_complex_2,
+ pat.f_iter,
+ )
+ if pat.tex_pattern_type in {"mandel", "julia", "magnet"}:
+ text_strg += "interior %s, %.4g\n" % (pat.f_ior, pat.f_ior_fac)
+ text_strg += "exterior %s, %.4g\n" % (pat.f_eor, pat.f_eor_fac)
+ if pat.tex_pattern_type == "gradient":
+ text_strg += "<%s, %s, %s> \n" % (
+ pat.grad_orient_x,
+ pat.grad_orient_y,
+ pat.grad_orient_z,
+ )
+ if pat.tex_pattern_type == "pavement":
+ num_tiles = pat.pave_tiles
+ num_pattern = 1
+ if pat.pave_sides == "4" and pat.pave_tiles == 3:
+ num_pattern = pat.pave_pat_2
+ if pat.pave_sides == "6" and pat.pave_tiles == 3:
+ num_pattern = pat.pave_pat_3
+ if pat.pave_sides == "3" and pat.pave_tiles == 4:
+ num_pattern = pat.pave_pat_3
+ if pat.pave_sides == "3" and pat.pave_tiles == 5:
+ num_pattern = pat.pave_pat_4
+ if pat.pave_sides == "4" and pat.pave_tiles == 4:
+ num_pattern = pat.pave_pat_5
+ if pat.pave_sides == "6" and pat.pave_tiles == 4:
+ num_pattern = pat.pave_pat_7
+ if pat.pave_sides == "4" and pat.pave_tiles == 5:
+ num_pattern = pat.pave_pat_12
+ if pat.pave_sides == "3" and pat.pave_tiles == 6:
+ num_pattern = pat.pave_pat_12
+ if pat.pave_sides == "6" and pat.pave_tiles == 5:
+ num_pattern = pat.pave_pat_22
+ if pat.pave_sides == "4" and pat.pave_tiles == 6:
+ num_pattern = pat.pave_pat_35
+ if pat.pave_sides == "6" and pat.pave_tiles == 6:
+ num_tiles = 5
+ text_strg += "number_of_sides %s number_of_tiles %s pattern %s form %s \n" % (
+ pat.pave_sides,
+ num_tiles,
+ num_pattern,
+ pat.pave_form,
+ )
+ ################ functions ##########################################################
+ if pat.tex_pattern_type == "function":
+ text_strg += "{ %s" % pat.func_list
+ text_strg += "(x"
if pat.func_plus_x != "NONE":
- if pat.func_plus_x =='increase':
- texStrg+="*"
- if pat.func_plus_x =='plus':
- texStrg+="+"
- texStrg+="%.4g"%pat.func_x
- texStrg+=",y"
+ if pat.func_plus_x == "increase":
+ text_strg += "*"
+ if pat.func_plus_x == "plus":
+ text_strg += "+"
+ text_strg += "%.4g" % pat.func_x
+ text_strg += ",y"
if pat.func_plus_y != "NONE":
- if pat.func_plus_y =='increase':
- texStrg+="*"
- if pat.func_plus_y =='plus':
- texStrg+="+"
- texStrg+="%.4g"%pat.func_y
- texStrg+=",z"
+ if pat.func_plus_y == "increase":
+ text_strg += "*"
+ if pat.func_plus_y == "plus":
+ text_strg += "+"
+ text_strg += "%.4g" % pat.func_y
+ text_strg += ",z"
if pat.func_plus_z != "NONE":
- if pat.func_plus_z =='increase':
- texStrg+="*"
- if pat.func_plus_z =='plus':
- texStrg+="+"
- texStrg+="%.4g"%pat.func_z
+ if pat.func_plus_z == "increase":
+ text_strg += "*"
+ if pat.func_plus_z == "plus":
+ text_strg += "+"
+ text_strg += "%.4g" % pat.func_z
sort = -1
- if pat.func_list in {"f_comma","f_crossed_trough","f_cubic_saddle","f_cushion","f_devils_curve",
- "f_enneper","f_glob","f_heart","f_hex_x","f_hex_y","f_hunt_surface",
- "f_klein_bottle","f_kummer_surface_v1","f_lemniscate_of_gerono","f_mitre",
- "f_nodal_cubic","f_noise_generator","f_odd","f_paraboloid","f_pillow",
- "f_piriform","f_quantum","f_quartic_paraboloid","f_quartic_saddle",
- "f_sphere","f_steiners_roman","f_torus_gumdrop","f_umbrella"}:
+ if pat.func_list in {
+ "f_comma",
+ "f_crossed_trough",
+ "f_cubic_saddle",
+ "f_cushion",
+ "f_devils_curve",
+ "f_enneper",
+ "f_glob",
+ "f_heart",
+ "f_hex_x",
+ "f_hex_y",
+ "f_hunt_surface",
+ "f_klein_bottle",
+ "f_kummer_surface_v1",
+ "f_lemniscate_of_gerono",
+ "f_mitre",
+ "f_nodal_cubic",
+ "f_noise_generator",
+ "f_odd",
+ "f_paraboloid",
+ "f_pillow",
+ "f_piriform",
+ "f_quantum",
+ "f_quartic_paraboloid",
+ "f_quartic_saddle",
+ "f_sphere",
+ "f_steiners_roman",
+ "f_torus_gumdrop",
+ "f_umbrella",
+ }:
sort = 0
- if pat.func_list in {"f_bicorn","f_bifolia","f_boy_surface","f_superellipsoid","f_torus"}:
+ if pat.func_list in {
+ "f_bicorn",
+ "f_bifolia",
+ "f_boy_surface",
+ "f_superellipsoid",
+ "f_torus",
+ }:
sort = 1
- if pat.func_list in {"f_ellipsoid","f_folium_surface","f_hyperbolic_torus",
- "f_kampyle_of_eudoxus","f_parabolic_torus","f_quartic_cylinder","f_torus2"}:
+ if pat.func_list in {
+ "f_ellipsoid",
+ "f_folium_surface",
+ "f_hyperbolic_torus",
+ "f_kampyle_of_eudoxus",
+ "f_parabolic_torus",
+ "f_quartic_cylinder",
+ "f_torus2",
+ }:
sort = 2
- if pat.func_list in {"f_blob2","f_cross_ellipsoids","f_flange_cover","f_isect_ellipsoids",
- "f_kummer_surface_v2","f_ovals_of_cassini","f_rounded_box","f_spikes_2d","f_strophoid"}:
+ if pat.func_list in {
+ "f_blob2",
+ "f_cross_ellipsoids",
+ "f_flange_cover",
+ "f_isect_ellipsoids",
+ "f_kummer_surface_v2",
+ "f_ovals_of_cassini",
+ "f_rounded_box",
+ "f_spikes_2d",
+ "f_strophoid",
+ }:
sort = 3
- if pat.func_list in {"f_algbr_cyl1","f_algbr_cyl2","f_algbr_cyl3","f_algbr_cyl4","f_blob","f_mesh1","f_poly4","f_spikes"}:
+ if pat.func_list in {
+ "f_algbr_cyl1",
+ "f_algbr_cyl2",
+ "f_algbr_cyl3",
+ "f_algbr_cyl4",
+ "f_blob",
+ "f_mesh1",
+ "f_poly4",
+ "f_spikes",
+ }:
sort = 4
- if pat.func_list in {"f_devils_curve_2d","f_dupin_cyclid","f_folium_surface_2d","f_hetero_mf","f_kampyle_of_eudoxus_2d",
- "f_lemniscate_of_gerono_2d","f_polytubes","f_ridge","f_ridged_mf","f_spiral","f_witch_of_agnesi"}:
+ if pat.func_list in {
+ "f_devils_curve_2d",
+ "f_dupin_cyclid",
+ "f_folium_surface_2d",
+ "f_hetero_mf",
+ "f_kampyle_of_eudoxus_2d",
+ "f_lemniscate_of_gerono_2d",
+ "f_polytubes",
+ "f_ridge",
+ "f_ridged_mf",
+ "f_spiral",
+ "f_witch_of_agnesi",
+ }:
sort = 5
- if pat.func_list in {"f_helix1","f_helix2","f_piriform_2d","f_strophoid_2d"}:
+ if pat.func_list in {"f_helix1", "f_helix2", "f_piriform_2d", "f_strophoid_2d"}:
sort = 6
if pat.func_list == "f_helical_torus":
sort = 7
if sort > -1:
- texStrg+=",%.4g"%pat.func_P0
+ text_strg += ",%.4g" % pat.func_P0
if sort > 0:
- texStrg+=",%.4g"%pat.func_P1
+ text_strg += ",%.4g" % pat.func_P1
if sort > 1:
- texStrg+=",%.4g"%pat.func_P2
+ text_strg += ",%.4g" % pat.func_P2
if sort > 2:
- texStrg+=",%.4g"%pat.func_P3
+ text_strg += ",%.4g" % pat.func_P3
if sort > 3:
- texStrg+=",%.4g"%pat.func_P4
+ text_strg += ",%.4g" % pat.func_P4
if sort > 4:
- texStrg+=",%.4g"%pat.func_P5
+ text_strg += ",%.4g" % pat.func_P5
if sort > 5:
- texStrg+=",%.4g"%pat.func_P6
+ text_strg += ",%.4g" % pat.func_P6
if sort > 6:
- texStrg+=",%.4g"%pat.func_P7
- texStrg+=",%.4g"%pat.func_P8
- texStrg+=",%.4g"%pat.func_P9
- texStrg+=")}\n"
+ text_strg += ",%.4g" % pat.func_P7
+ text_strg += ",%.4g" % pat.func_P8
+ text_strg += ",%.4g" % pat.func_P9
+ text_strg += ")}\n"
############## end functions ###############################################################
- if pat.tex_pattern_type not in {'checker', 'hexagon', 'square', 'triangular', 'brick'}:
- texStrg+="color_map {\n"
- numColor=0
- if tex.use_color_ramp == True:
+ if pat.tex_pattern_type not in {"checker", "hexagon", "square", "triangular", "brick"}:
+ text_strg += "color_map {\n"
+ num_color = 0
+ if tex.use_color_ramp:
for el in tex.color_ramp.elements:
- numColor+=1
+ num_color += 1
pos = el.position
- col=el.color
- colR,colG,colB,colA = col[0],col[1],col[2],1-col[3]
- if pat.tex_pattern_type not in {'checker', 'hexagon', 'square', 'triangular', 'brick'} :
- texStrg+="[%.4g color rgbf<%.4g,%.4g,%.4g,%.4g>] \n"%(pos,colR,colG,colB,colA)
- if pat.tex_pattern_type in {'brick','checker'} and numColor < 3:
- texStrg+="color rgbf<%.4g,%.4g,%.4g,%.4g> \n"%(colR,colG,colB,colA)
- if pat.tex_pattern_type == 'hexagon' and numColor < 4 :
- texStrg+="color rgbf<%.4g,%.4g,%.4g,%.4g> \n"%(colR,colG,colB,colA)
- if pat.tex_pattern_type == 'square' and numColor < 5 :
- texStrg+="color rgbf<%.4g,%.4g,%.4g,%.4g> \n"%(colR,colG,colB,colA)
- if pat.tex_pattern_type == 'triangular' and numColor < 7 :
- texStrg+="color rgbf<%.4g,%.4g,%.4g,%.4g> \n"%(colR,colG,colB,colA)
+ col = el.color
+ col_r, col_g, col_b, col_a = col[0], col[1], col[2], 1 - col[3]
+ if pat.tex_pattern_type not in {
+ "checker",
+ "hexagon",
+ "square",
+ "triangular",
+ "brick",
+ }:
+ text_strg += "[%.4g color rgbf<%.4g,%.4g,%.4g,%.4g>] \n" % (
+ pos,
+ col_r,
+ col_g,
+ col_b,
+ col_a,
+ )
+ if pat.tex_pattern_type in {"brick", "checker"} and num_color < 3:
+ text_strg += "color rgbf<%.4g,%.4g,%.4g,%.4g> \n" % (col_r, col_g, col_b, col_a)
+ if pat.tex_pattern_type == "hexagon" and num_color < 4:
+ text_strg += "color rgbf<%.4g,%.4g,%.4g,%.4g> \n" % (col_r, col_g, col_b, col_a)
+ if pat.tex_pattern_type == "square" and num_color < 5:
+ text_strg += "color rgbf<%.4g,%.4g,%.4g,%.4g> \n" % (col_r, col_g, col_b, col_a)
+ if pat.tex_pattern_type == "triangular" and num_color < 7:
+ text_strg += "color rgbf<%.4g,%.4g,%.4g,%.4g> \n" % (col_r, col_g, col_b, col_a)
else:
- texStrg+="[0 color rgbf<0,0,0,1>]\n"
- texStrg+="[1 color rgbf<1,1,1,0>]\n"
- if pat.tex_pattern_type not in {'checker', 'hexagon', 'square', 'triangular', 'brick'} :
- texStrg+="} \n"
- if pat.tex_pattern_type == 'brick':
- texStrg+="brick_size <%.4g, %.4g, %.4g> mortar %.4g \n"%(pat.brick_size_x, pat.brick_size_y, pat.brick_size_z, pat.brick_mortar)
- texStrg+="%s \n"%mappingDif
- texStrg+="rotate <%.4g,%.4g,%.4g> \n"%(pat.tex_rot_x, pat.tex_rot_y, pat.tex_rot_z)
- texStrg+="turbulence <%.4g,%.4g,%.4g> \n"%(pat.warp_turbulence_x, pat.warp_turbulence_y, pat.warp_turbulence_z)
- texStrg+="octaves %s \n"%pat.modifier_octaves
- texStrg+="lambda %.4g \n"%pat.modifier_lambda
- texStrg+="omega %.4g \n"%pat.modifier_omega
- texStrg+="frequency %.4g \n"%pat.modifier_frequency
- texStrg+="phase %.4g \n"%pat.modifier_phase
- texStrg+="}\n\n"
- texStrg+="#declare f%s=\n"%PATname
- texStrg+="function{pigment{%s}}\n"%PATname
- texStrg+="\n"
- return(texStrg)
-
-
-def writeTextureInfluence(using_uberpov, mater, materialNames, LocalMaterialNames, path_image, lampCount,
- imageFormat, imgMap, imgMapTransforms, tabWrite, comments,
- string_strip_hyphen, safety, col, os, preview_dir, unpacked_images):
- """Translate Blender texture influences to various POV texture tricks and write to pov file."""
-
- material_finish = materialNames[mater.name]
- if mater.pov.use_transparency:
- trans = 1.0 - mater.pov.alpha
- else:
- trans = 0.0
- if ((mater.pov.specular_color.s == 0.0) or (mater.pov.diffuse_shader == 'MINNAERT')):
- # No layered texture because of aoi pattern used for minnaert and pov can't layer patterned
- colored_specular_found = False
- else:
- colored_specular_found = True
-
- if mater.pov.use_transparency and mater.pov.transparency_method == 'RAYTRACE':
- povFilter = mater.pov_raytrace_transparency.filter * (1.0 - mater.pov.alpha)
- trans = (1.0 - mater.pov.alpha) - povFilter
- else:
- povFilter = 0.0
-
- ##############SF
- texturesDif = ""
- texturesSpec = ""
- texturesNorm = ""
- texturesAlpha = ""
- #proceduralFlag=False
- tmpidx = -1
- for t in mater.pov_texture_slots:
-
-
- tmpidx += 1
- # index = mater.pov.active_texture_index
- slot = mater.pov_texture_slots[tmpidx] # [index]
- povtex = slot.texture # slot.name
- tex = bpy.data.textures[povtex]
-
- if t and (t.use and (tex is not None)):
- # 'NONE' ('NONE' type texture is different from no texture covered above)
- if (tex.type == 'NONE' and tex.pov.tex_pattern_type == 'emulator'):
- continue # move to next slot
- # PROCEDURAL
- elif (tex.type != 'IMAGE' and tex.type != 'NONE'):
- proceduralFlag=True
- image_filename = "PAT_%s"%string_strip_hyphen(bpy.path.clean_name(tex.name))
- if image_filename:
- if t.use_map_color_diffuse:
- texturesDif = image_filename
- # colvalue = t.default_value # UNUSED
- 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 # UNUSED
- t_spec = t
- if t.use_map_normal:
- texturesNorm = image_filename
- # colvalue = t.normal_factor/10 # UNUSED
- #textNormName=tex.image.name + ".normal"
- #was the above used? --MR
- t_nor = t
- if t.use_map_alpha:
- texturesAlpha = image_filename
- # colvalue = t.alpha_factor * 10.0 # UNUSED
- #textDispName=tex.image.name + ".displ"
- #was the above used? --MR
- t_alpha = t
-
- # RASTER IMAGE
- elif (tex.type == 'IMAGE' and tex.image and tex.pov.tex_pattern_type == 'emulator'):
- proceduralFlag=False
- #PACKED
- if tex.image.packed_file:
- orig_image_filename=tex.image.filepath_raw
- unpackedfilename= os.path.join(preview_dir,("unpacked_img_"+(string_strip_hyphen(bpy.path.clean_name(tex.name)))))
- if not os.path.exists(unpackedfilename):
- # record which images that were newly copied and can be safely
- # cleaned up
- unpacked_images.append(unpackedfilename)
- tex.image.filepath_raw=unpackedfilename
- tex.image.save()
- image_filename = unpackedfilename.replace("\\","/")
- # .replace("\\","/") to get only forward slashes as it's what POV prefers,
- # even on windows
- tex.image.filepath_raw=orig_image_filename
- #FILE
- else:
- image_filename = path_image(tex.image)
- # IMAGE SEQUENCE BEGINS
- if image_filename:
- if bpy.data.images[tex.image.name].source == 'SEQUENCE':
- korvaa = "." + str(tex.image_user.frame_offset + 1).zfill(3) + "."
- image_filename = image_filename.replace(".001.", korvaa)
- print(" seq debug ")
- print(image_filename)
- # IMAGE SEQUENCE ENDS
- imgGamma = ""
- if image_filename:
- texdata = bpy.data.textures[t.texture]
- if t.use_map_color_diffuse:
- texturesDif = image_filename
- # colvalue = t.default_value # UNUSED
- t_dif = t
- print (texdata)
- if texdata.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 # UNUSED
- t_spec = t
- if t.use_map_normal:
- texturesNorm = image_filename
- # colvalue = t.normal_factor/10 # UNUSED
- #textNormName=tex.image.name + ".normal"
- #was the above used? --MR
- t_nor = t
- if t.use_map_alpha:
- texturesAlpha = image_filename
- # colvalue = t.alpha_factor * 10.0 # UNUSED
- #textDispName=tex.image.name + ".displ"
- #was the above used? --MR
- t_alpha = t
-
- ####################################################################################
-
-
- tabWrite("\n")
- # THIS AREA NEEDS TO LEAVE THE TEXTURE OPEN UNTIL ALL MAPS ARE WRITTEN DOWN.
- # --MR
- currentMatName = string_strip_hyphen(materialNames[mater.name])
- LocalMaterialNames.append(currentMatName)
- tabWrite("\n#declare MAT_%s = \ntexture{\n" % currentMatName)
- ################################################################################
-
- if mater.pov.replacement_text != "":
- tabWrite("%s\n" % mater.pov.replacement_text)
- #################################################################################
- # XXX TODO: replace by new POV MINNAERT rather than aoi
- if mater.pov.diffuse_shader == 'MINNAERT':
- tabWrite("\n")
- tabWrite("aoi\n")
- tabWrite("texture_map {\n")
- tabWrite("[%.3g finish {diffuse %.3g}]\n" % \
- (mater.darkness / 2.0, 2.0 - mater.darkness))
- tabWrite("[%.3g\n" % (1.0 - (mater.darkness / 2.0)))
-
- if mater.pov.diffuse_shader == 'FRESNEL':
- # For FRESNEL diffuse in POV, we'll layer slope patterned textures
- # with lamp vector as the slope vector and nest one slope per lamp
- # into each texture map's entry.
-
- c = 1
- while (c <= lampCount):
- tabWrite("slope { lampTarget%s }\n" % (c))
- tabWrite("texture_map {\n")
- # Diffuse Fresnel value and factor go up to five,
- # other kind of values needed: used the number 5 below to remap
- tabWrite("[%.3g finish {diffuse %.3g}]\n" % \
- ((5.0 - mater.diffuse_fresnel) / 5,
- (mater.diffuse_intensity *
- ((5.0 - mater.diffuse_fresnel_factor) / 5))))
- tabWrite("[%.3g\n" % ((mater.diffuse_fresnel_factor / 5) *
- (mater.diffuse_fresnel / 5.0)))
- c += 1
-
- # if shader is a 'FRESNEL' or 'MINNAERT': slope pigment pattern or aoi
- # and texture map above, the rest below as one of its entry
-
- if texturesSpec != "" or texturesAlpha != "":
- if texturesSpec != "":
- # tabWrite("\n")
- tabWrite("pigment_pattern {\n")
-
- mappingSpec =imgMapTransforms(t_spec)
- if texturesSpec and texturesSpec.startswith("PAT_"):
- tabWrite("function{f%s(x,y,z).grey}\n" %texturesSpec)
- tabWrite("%s\n" % mappingSpec)
- else:
-
- tabWrite("uv_mapping image_map{%s \"%s\" %s}\n" % \
- (imageFormat(texturesSpec), texturesSpec, imgMap(t_spec)))
- tabWrite("%s\n" % mappingSpec)
- tabWrite("}\n")
- tabWrite("texture_map {\n")
- tabWrite("[0 \n")
-
- if texturesDif == "":
- if texturesAlpha != "":
- tabWrite("\n")
+ text_strg += "[0 color rgbf<0,0,0,1>]\n"
+ text_strg += "[1 color rgbf<1,1,1,0>]\n"
+ if pat.tex_pattern_type not in {"checker", "hexagon", "square", "triangular", "brick"}:
+ text_strg += "} \n"
+ if pat.tex_pattern_type == "brick":
+ text_strg += "brick_size <%.4g, %.4g, %.4g> mortar %.4g \n" % (
+ pat.brick_size_x,
+ pat.brick_size_y,
+ pat.brick_size_z,
+ pat.brick_mortar,
+ )
+ text_strg += "%s \n" % mapping_dif
+ text_strg += "rotate <%.4g,%.4g,%.4g> \n" % (pat.tex_rot_x, pat.tex_rot_y, pat.tex_rot_z)
+ text_strg += "turbulence <%.4g,%.4g,%.4g> \n" % (
+ pat.warp_turbulence_x,
+ pat.warp_turbulence_y,
+ pat.warp_turbulence_z,
+ )
+ text_strg += "octaves %s \n" % pat.modifier_octaves
+ text_strg += "lambda %.4g \n" % pat.modifier_lambda
+ text_strg += "omega %.4g \n" % pat.modifier_omega
+ text_strg += "frequency %.4g \n" % pat.modifier_frequency
+ text_strg += "phase %.4g \n" % pat.modifier_phase
+ text_strg += "}\n\n"
+ text_strg += "#declare f%s=\n" % pat_name
+ text_strg += "function{pigment{%s}}\n" % pat_name
+ text_strg += "\n"
+ return text_strg
- mappingAlpha = imgMapTransforms(t_alpha)
-
- if texturesAlpha and texturesAlpha.startswith("PAT_"):
- tabWrite("function{f%s(x,y,z).transmit}%s\n" %(texturesAlpha, mappingAlpha))
- else:
-
- tabWrite("pigment {pigment_pattern {uv_mapping image_map" \
- "{%s \"%s\" %s}%s" % \
- (imageFormat(texturesAlpha), texturesAlpha,
- imgMap(t_alpha), mappingAlpha))
- tabWrite("}\n")
- tabWrite("pigment_map {\n")
- tabWrite("[0 color rgbft<0,0,0,1,1>]\n")
- tabWrite("[1 color rgbft<%.3g, %.3g, %.3g, %.3g, %.3g>]\n" % \
- (col[0], col[1], col[2], povFilter, trans))
- tabWrite("}\n")
- tabWrite("}\n")
-
- else:
-
- tabWrite("pigment {rgbft<%.3g, %.3g, %.3g, %.3g, %.3g>}\n" % \
- (col[0], col[1], col[2], povFilter, trans))
-
- if texturesSpec != "":
- # Level 1 is no specular
- tabWrite("finish {%s}\n" % (safety(material_finish, Level=1)))
-
- else:
- # Level 2 is translated spec
- tabWrite("finish {%s}\n" % (safety(material_finish, Level=2)))
-
- else:
- mappingDif = imgMapTransforms(t_dif)
-
- if texturesAlpha != "":
- mappingAlpha = imgMapTransforms(t_alpha)
-
- tabWrite("pigment {\n")
- tabWrite("pigment_pattern {\n")
- if texturesAlpha and texturesAlpha.startswith("PAT_"):
- tabWrite("function{f%s(x,y,z).transmit}%s\n" %(texturesAlpha, mappingAlpha))
- else:
- tabWrite("uv_mapping image_map{%s \"%s\" %s}%s}\n" % \
- (imageFormat(texturesAlpha), texturesAlpha,
- imgMap(t_alpha), mappingAlpha))
- tabWrite("pigment_map {\n")
- tabWrite("[0 color rgbft<0,0,0,1,1>]\n")
- #if texturesAlpha and texturesAlpha.startswith("PAT_"):
- #tabWrite("[1 pigment{%s}]\n" %texturesDif)
- if texturesDif and not texturesDif.startswith("PAT_"):
- tabWrite("[1 uv_mapping image_map {%s \"%s\" %s} %s]\n" % \
- (imageFormat(texturesDif), texturesDif,
- (imgGamma + imgMap(t_dif)), mappingDif))
- elif texturesDif and texturesDif.startswith("PAT_"):
- tabWrite("[1 %s]\n" %texturesDif)
- tabWrite("}\n")
- tabWrite("}\n")
- if texturesAlpha and texturesAlpha.startswith("PAT_"):
- tabWrite("}\n")
-
- else:
- if texturesDif and texturesDif.startswith("PAT_"):
- tabWrite("pigment{%s}\n" %texturesDif)
- else:
- tabWrite("pigment {uv_mapping image_map {%s \"%s\" %s}%s}\n" % \
- (imageFormat(texturesDif), texturesDif,
- (imgGamma + imgMap(t_dif)), mappingDif))
-
- if texturesSpec != "":
- # Level 1 is no specular
- tabWrite("finish {%s}\n" % (safety(material_finish, Level=1)))
-
- else:
- # Level 2 is translated specular
- tabWrite("finish {%s}\n" % (safety(material_finish, Level=2)))
-
- ## scale 1 rotate y*0
- #imageMap = ("{image_map {%s \"%s\" %s }\n" % \
- # (imageFormat(textures),textures,imgMap(t_dif)))
- #tabWrite("uv_mapping pigment %s} %s finish {%s}\n" % \
- # (imageMap,mapping,safety(material_finish)))
- #tabWrite("pigment {uv_mapping image_map {%s \"%s\" %s}%s} " \
- # "finish {%s}\n" % \
- # (imageFormat(texturesDif), texturesDif, imgMap(t_dif),
- # mappingDif, safety(material_finish)))
- if texturesNorm != "":
- ## scale 1 rotate y*0
-
- mappingNor =imgMapTransforms(t_nor)
-
- if texturesNorm and texturesNorm.startswith("PAT_"):
- tabWrite("normal{function{f%s(x,y,z).grey} bump_size %.4g %s}\n" %(texturesNorm, ( - t_nor.normal_factor * 9.5), mappingNor))
- else:
- tabWrite("normal {\n")
- # XXX TODO: fix and propagate the micro normals reflection blur below to non textured materials
- if (mater.pov_raytrace_mirror.use and mater.pov_raytrace_mirror.gloss_factor < 1.0 and not using_uberpov):
- tabWrite("average\n")
- tabWrite("normal_map{\n")
- # 0.5 for entries below means a 50 percent mix
- # between the micro normal and user bump map
- # order seems indifferent as commutative
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(10/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.1]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.15]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.2]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.25]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.3]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.35]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.4]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.45]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.5]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[1.0 ") # Proceed with user bump...
- tabWrite("uv_mapping bump_map " \
- "{%s \"%s\" %s bump_size %.4g }%s" % \
- (imageFormat(texturesNorm), texturesNorm, imgMap(t_nor),
- ( - t_nor.normal_factor * 9.5), mappingNor))
- # ...Then close its last entry and the the normal_map itself
- if (mater.pov_raytrace_mirror.use and mater.pov_raytrace_mirror.gloss_factor < 1.0 and not using_uberpov):
- tabWrite("]}}\n")
- else:
- tabWrite("]}\n")
- if texturesSpec != "":
- tabWrite("]\n")
- ##################Second index for mapping specular max value###############
- tabWrite("[1 \n")
-
- if texturesDif == "" and mater.pov.replacement_text == "":
- if texturesAlpha != "":
- mappingAlpha = imgMapTransforms(t_alpha)
-
- if texturesAlpha and texturesAlpha.startswith("PAT_"):
- tabWrite("function{f%s(x,y,z).transmit %s}\n" %(texturesAlpha, mappingAlpha))
- else:
- tabWrite("pigment {pigment_pattern {uv_mapping image_map" \
- "{%s \"%s\" %s}%s}\n" % \
- (imageFormat(texturesAlpha), texturesAlpha, imgMap(t_alpha),
- mappingAlpha))
- tabWrite("pigment_map {\n")
- tabWrite("[0 color rgbft<0,0,0,1,1>]\n")
- tabWrite("[1 color rgbft<%.3g, %.3g, %.3g, %.3g, %.3g>]\n" % \
- (col[0], col[1], col[2], povFilter, trans))
- tabWrite("}\n")
- tabWrite("}\n")
-
- else:
- tabWrite("pigment {rgbft<%.3g, %.3g, %.3g, %.3g, %.3g>}\n" % \
- (col[0], col[1], col[2], povFilter, trans))
-
-
- if texturesSpec != "":
- # Level 3 is full specular
- tabWrite("finish {%s}\n" % (safety(material_finish, Level=3)))
-
- if mater.pov_raytrace_mirror.use and mater.pov_raytrace_mirror.gloss_factor < 1.0 and not using_uberpov:
- tabWrite("normal {\n")
- tabWrite("average\n")
- tabWrite("normal_map{\n")
- # 0.5 for entries below means a 50 percent mix
- # between the micro normal and user bump map
- # order seems indifferent as commutative
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(10/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.1]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.15]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.2]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.25]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.3]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.35]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.4]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.45]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.5]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- #XXX IF USER BUMP_MAP
- if texturesNorm != "":
- tabWrite("[1.0 ") # Blurry reflection or not Proceed with user bump in either case...
- tabWrite("uv_mapping bump_map " \
- "{%s \"%s\" %s bump_size %.4g }%s]\n" % \
- (imageFormat(texturesNorm), texturesNorm, imgMap(t_nor),
- ( - t_nor.normal_factor * 9.5), mappingNor))
- # ...Then close the normal_map itself if blurry reflection
- if mater.pov_raytrace_mirror.use and mater.pov_raytrace_mirror.gloss_factor < 1.0 and not using_uberpov:
- tabWrite("}}\n")
- else:
- tabWrite("}\n")
- elif colored_specular_found:
- # Level 1 is no specular
- tabWrite("finish {%s}\n" % (safety(material_finish, Level=1)))
-
- else:
- # Level 2 is translated specular
- tabWrite("finish {%s}\n" % (safety(material_finish, Level=2)))
-
- elif mater.pov.replacement_text == "":
- mappingDif = imgMapTransforms(t_dif)
-
- if texturesAlpha != "":
-
- mappingAlpha = imgMapTransforms(t_alpha)
-
- if texturesAlpha and texturesAlpha.startswith("PAT_"):
- tabWrite("pigment{pigment_pattern {function{f%s(x,y,z).transmit}%s}\n" %(texturesAlpha, mappingAlpha))
- else:
- tabWrite("pigment {pigment_pattern {uv_mapping image_map" \
- "{%s \"%s\" %s}%s}\n" % \
- (imageFormat(texturesAlpha), texturesAlpha, imgMap(t_alpha),
- mappingAlpha))
- tabWrite("pigment_map {\n")
- tabWrite("[0 color rgbft<0,0,0,1,1>]\n")
- if texturesAlpha and texturesAlpha.startswith("PAT_"):
- tabWrite("[1 function{f%s(x,y,z).transmit}%s]\n" %(texturesAlpha, mappingAlpha))
- elif texturesDif and not texturesDif.startswith("PAT_"):
- tabWrite("[1 uv_mapping image_map {%s \"%s\" %s} %s]\n" % \
- (imageFormat(texturesDif), texturesDif,
- (imgMap(t_dif) + imgGamma), mappingDif))
- elif texturesDif and texturesDif.startswith("PAT_"):
- tabWrite("[1 %s %s]\n" %(texturesDif, mappingDif))
- tabWrite("}\n")
- tabWrite("}\n")
-
- else:
- if texturesDif and texturesDif.startswith("PAT_"):
- tabWrite("pigment{%s %s}\n" %(texturesDif, mappingDif))
- else:
- tabWrite("pigment {\n")
- tabWrite("uv_mapping image_map {\n")
- #tabWrite("%s \"%s\" %s}%s\n" % \
- # (imageFormat(texturesDif), texturesDif,
- # (imgGamma + imgMap(t_dif)),mappingDif))
- tabWrite("%s \"%s\" \n" % (imageFormat(texturesDif), texturesDif))
- tabWrite("%s\n" % (imgGamma + imgMap(t_dif)))
- tabWrite("}\n")
- tabWrite("%s\n" % mappingDif)
- tabWrite("}\n")
-
- if texturesSpec != "":
- # Level 3 is full specular
- tabWrite("finish {%s}\n" % (safety(material_finish, Level=3)))
- else:
- # Level 2 is translated specular
- tabWrite("finish {%s}\n" % (safety(material_finish, Level=2)))
-
- ## scale 1 rotate y*0
- #imageMap = ("{image_map {%s \"%s\" %s }" % \
- # (imageFormat(textures), textures,imgMap(t_dif)))
- #tabWrite("\n\t\t\tuv_mapping pigment %s} %s finish {%s}" % \
- # (imageMap, mapping, safety(material_finish)))
- #tabWrite("\n\t\t\tpigment {uv_mapping image_map " \
- # "{%s \"%s\" %s}%s} finish {%s}" % \
- # (imageFormat(texturesDif), texturesDif,imgMap(t_dif),
- # mappingDif, safety(material_finish)))
- if texturesNorm != "" and mater.pov.replacement_text == "":
-
-
- mappingNor =imgMapTransforms(t_nor)
-
- if texturesNorm and texturesNorm.startswith("PAT_"):
- tabWrite("normal{function{f%s(x,y,z).grey} bump_size %.4g %s}\n" %(texturesNorm, ( - t_nor.normal_factor * 9.5), mappingNor))
- else:
- tabWrite("normal {\n")
- # XXX TODO: fix and propagate the micro normals reflection blur below to non textured materials
- if mater.pov_raytrace_mirror.use and mater.pov_raytrace_mirror.gloss_factor < 1.0 and not using_uberpov:
- tabWrite("average\n")
- tabWrite("normal_map{\n")
- # 0.5 for entries below means a 50 percent mix
- # between the micro normal and user bump map
- # order seems indifferent as commutative
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(10/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.1]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.15]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.2]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.25]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.3]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.35]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.4]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.45]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[0.025 bumps %.4g scale 0.1*%.4g phase 0.5]\n" %((10/(mater.pov_raytrace_mirror.gloss_factor+0.01)),(1/(mater.pov_raytrace_mirror.gloss_samples+0.001)))) # micronormals blurring
- tabWrite("[1.0 ") # Blurry reflection or not Proceed with user bump in either case...
- tabWrite("uv_mapping bump_map " \
- "{%s \"%s\" %s bump_size %.4g }%s]\n" % \
- (imageFormat(texturesNorm), texturesNorm, imgMap(t_nor),
- ( - t_nor.normal_factor * 9.5), mappingNor))
- # ...Then close the normal_map itself if blurry reflection
- if mater.pov_raytrace_mirror.use and mater.pov_raytrace_mirror.gloss_factor < 1.0 and not using_uberpov:
- tabWrite("}}\n")
- else:
- tabWrite("}\n")
- if texturesSpec != "" and mater.pov.replacement_text == "":
- tabWrite("]\n")
-
- tabWrite("}\n")
-
- #End of slope/ior texture_map
- if mater.pov.diffuse_shader == 'MINNAERT' and mater.pov.replacement_text == "":
- tabWrite("]\n")
- tabWrite("}\n")
- if mater.pov.diffuse_shader == 'FRESNEL' and mater.pov.replacement_text == "":
- c = 1
- while (c <= lampCount):
- tabWrite("]\n")
- tabWrite("}\n")
- c += 1
-
-
-
- # Close first layer of POV "texture" (Blender material)
- tabWrite("}\n")
-
- if ((mater.pov.specular_color.s > 0.0) and (mater.pov.diffuse_shader != 'MINNAERT')):
-
- colored_specular_found = True
- else:
- colored_specular_found = False
-
- # Write another layered texture using invisible diffuse and metallic trick
- # to emulate colored specular highlights
- special_texture_found = False
- tmpidx = -1
- for t in mater.pov_texture_slots:
- tmpidx += 1
- # index = mater.pov.active_texture_index
- slot = mater.pov_texture_slots[tmpidx] # [index]
- povtex = slot.texture # slot.name
- tex = bpy.data.textures[povtex]
- if(t and t.use and ((tex.type == 'IMAGE' and tex.image) or tex.type != 'IMAGE') and
- (t.use_map_specular or t.use_map_raymir)):
- # Specular mapped textures would conflict with colored specular
- # because POV can't layer over or under pigment patterned textures
- special_texture_found = True
-
- if colored_specular_found and not special_texture_found:
- if comments:
- tabWrite(" // colored highlights with a stransparent metallic layer\n")
- else:
- tabWrite("\n")
-
- tabWrite("texture {\n")
- tabWrite("pigment {rgbft<%.3g, %.3g, %.3g, 0, 1>}\n" % \
- (mater.pov.specular_color[0], mater.pov.specular_color[1], mater.pov.specular_color[2]))
- tabWrite("finish {%s}\n" % (safety(material_finish, Level=2))) # Level 2 is translated spec
-
- texturesNorm = ""
- for t in mater.pov_texture_slots:
-
- if t and tex.pov.tex_pattern_type != 'emulator':
- proceduralFlag=True
- image_filename = string_strip_hyphen(bpy.path.clean_name(tex.name))
- if (t and tex.type == 'IMAGE' and
- t.use and tex.image and
- tex.pov.tex_pattern_type == 'emulator'):
- proceduralFlag=False
- image_filename = path_image(tex.image)
- imgGamma = ""
- if image_filename:
- if t.use_map_normal:
- texturesNorm = image_filename
- # colvalue = t.normal_factor/10 # UNUSED XXX *-9.5 !
- #textNormName=tex.image.name + ".normal"
- #was the above used? --MR
- t_nor = t
- if proceduralFlag:
- tabWrite("normal{function" \
- "{f%s(x,y,z).grey} bump_size %.4g}\n" % \
- (texturesNorm,
- ( - t_nor.normal_factor * 9.5)))
- else:
- tabWrite("normal {uv_mapping bump_map " \
- "{%s \"%s\" %s bump_size %.4g }%s}\n" % \
- (imageFormat(texturesNorm),
- texturesNorm, imgMap(t_nor),
- ( - t_nor.normal_factor * 9.5),
- mappingNor))
-
- tabWrite("}\n") # THEN IT CAN CLOSE LAST LAYER OF TEXTURE
def string_strip_hyphen(name):
+ """POV naming schemes like to conform to most restrictive charsets."""
return name.replace("-", "")
+
+
# WARNING!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-def write_nodes(scene,povMatName,ntree,file):
- """translate Blender node trees to pov and write them to file"""
- declareNodes=[]
- scene=bpy.context.scene
+def write_nodes(scene, pov_mat_name, ntree, file):
+ """Translate Blender node trees to pov and write them to file."""
+ # such function local inlined import are official guidelines
+ # of Blender Foundation to lighten addons footprint at startup
+ from os import path
+
+ declare_nodes = []
+ scene = bpy.context.scene
for node in ntree.nodes:
- povNodeName=string_strip_hyphen(bpy.path.clean_name(node.name))+"_%s"%povMatName
+ pov_node_name = string_strip_hyphen(bpy.path.clean_name(node.name)) + "_%s" % pov_mat_name
if node.bl_idname == "PovrayFinishNode" and node.outputs["Finish"].is_linked:
- file.write('#declare %s = finish {\n'%povNodeName)
- emission=node.inputs["Emission"].default_value
+ file.write("#declare %s = finish {\n" % pov_node_name)
+ emission = node.inputs["Emission"].default_value
if node.inputs["Emission"].is_linked:
pass
- file.write(' emission %.4g\n'%emission)
+ file.write(" emission %.4g\n" % emission)
for link in ntree.links:
if link.to_node == node:
- if link.from_node.bl_idname == 'PovrayDiffuseNode':
- intensity=0
- albedo=""
- brilliance=0
- crand=0
+ if link.from_node.bl_idname == "PovrayDiffuseNode":
+ intensity = 0
+ albedo = ""
+ brilliance = 0
+ crand = 0
if link.from_node.inputs["Intensity"].is_linked:
pass
else:
- intensity=link.from_node.inputs["Intensity"].default_value
+ intensity = link.from_node.inputs["Intensity"].default_value
if link.from_node.inputs["Albedo"].is_linked:
pass
else:
- if link.from_node.inputs["Albedo"].default_value == True:
+ if link.from_node.inputs["Albedo"].default_value:
albedo = "albedo"
- file.write(' diffuse %s %.4g\n'%(albedo,intensity))
+ file.write(" diffuse %s %.4g\n" % (albedo, intensity))
if link.from_node.inputs["Brilliance"].is_linked:
pass
else:
- brilliance=link.from_node.inputs["Brilliance"].default_value
- file.write(' brilliance %.4g\n'%brilliance)
+ brilliance = link.from_node.inputs["Brilliance"].default_value
+ file.write(" brilliance %.4g\n" % brilliance)
if link.from_node.inputs["Crand"].is_linked:
pass
else:
- crand=link.from_node.inputs["Crand"].default_value
+ crand = link.from_node.inputs["Crand"].default_value
if crand > 0:
- file.write(' crand %.4g\n'%crand)
-
+ file.write(" crand %.4g\n" % crand)
- if link.from_node.bl_idname == 'PovraySubsurfaceNode':
+ if link.from_node.bl_idname == "PovraySubsurfaceNode":
if scene.povray.sslt_enable:
energy = 0
r = g = b = 0
if link.from_node.inputs["Translucency"].is_linked:
pass
else:
- r,g,b,a=link.from_node.inputs["Translucency"].default_value[:]
+ r, g, b, a = link.from_node.inputs["Translucency"].default_value[:]
if link.from_node.inputs["Energy"].is_linked:
pass
else:
- energy=link.from_node.inputs["Energy"].default_value
- file.write(' subsurface { translucency <%.4g,%.4g,%.4g>*%s }\n'%(r,g,b,energy))
-
-
-
- if link.from_node.bl_idname in {'PovraySpecularNode','PovrayPhongNode'}:
- intensity=0
- albedo=""
- roughness=0
- metallic=0
- phong_size=0
- highlight="specular"
+ energy = link.from_node.inputs["Energy"].default_value
+ file.write(
+ " subsurface { translucency <%.4g,%.4g,%.4g>*%s }\n"
+ % (r, g, b, energy)
+ )
+
+ if link.from_node.bl_idname in {"PovraySpecularNode", "PovrayPhongNode"}:
+ intensity = 0
+ albedo = ""
+ roughness = 0
+ metallic = 0
+ phong_size = 0
+ highlight = "specular"
if link.from_node.inputs["Intensity"].is_linked:
pass
else:
- intensity=link.from_node.inputs["Intensity"].default_value
+ intensity = link.from_node.inputs["Intensity"].default_value
if link.from_node.inputs["Albedo"].is_linked:
pass
else:
- if link.from_node.inputs["Albedo"].default_value == True:
+ if link.from_node.inputs["Albedo"].default_value:
albedo = "albedo"
- if link.from_node.bl_idname in {'PovrayPhongNode'}:
- highlight="phong"
- file.write(' %s %s %.4g\n'%(highlight,albedo,intensity))
+ if link.from_node.bl_idname in {"PovrayPhongNode"}:
+ highlight = "phong"
+ file.write(" %s %s %.4g\n" % (highlight, albedo, intensity))
- if link.from_node.bl_idname in {'PovraySpecularNode'}:
+ if link.from_node.bl_idname in {"PovraySpecularNode"}:
if link.from_node.inputs["Roughness"].is_linked:
pass
else:
- roughness=link.from_node.inputs["Roughness"].default_value
- file.write(' roughness %.6g\n'%roughness)
+ roughness = link.from_node.inputs["Roughness"].default_value
+ file.write(" roughness %.6g\n" % roughness)
- if link.from_node.bl_idname in {'PovrayPhongNode'}:
+ if link.from_node.bl_idname in {"PovrayPhongNode"}:
if link.from_node.inputs["Size"].is_linked:
pass
else:
- phong_size=link.from_node.inputs["Size"].default_value
- file.write(' phong_size %s\n'%phong_size)
+ phong_size = link.from_node.inputs["Size"].default_value
+ file.write(" phong_size %s\n" % phong_size)
if link.from_node.inputs["Metallic"].is_linked:
pass
else:
- metallic=link.from_node.inputs["Metallic"].default_value
- file.write(' metallic %.4g\n'%metallic)
-
- if link.from_node.bl_idname in {'PovrayMirrorNode'}:
- file.write(' reflection {\n')
- color=None
- exponent=0
- metallic=0
- falloff=0
- fresnel=""
- conserve=""
+ metallic = link.from_node.inputs["Metallic"].default_value
+ file.write(" metallic %.4g\n" % metallic)
+
+ if link.from_node.bl_idname in {"PovrayMirrorNode"}:
+ file.write(" reflection {\n")
+ color = None
+ exponent = 0
+ metallic = 0
+ falloff = 0
+ fresnel = ""
+ conserve = ""
if link.from_node.inputs["Color"].is_linked:
pass
else:
- color=link.from_node.inputs["Color"].default_value[:]
- file.write(' <%.4g,%.4g,%.4g>\n'%color)
+ color = link.from_node.inputs["Color"].default_value[:]
+ file.write(" <%.4g,%.4g,%.4g>\n" % color)
if link.from_node.inputs["Exponent"].is_linked:
pass
else:
- exponent=link.from_node.inputs["Exponent"].default_value
- file.write(' exponent %.4g\n'%exponent)
+ exponent = link.from_node.inputs["Exponent"].default_value
+ file.write(" exponent %.4g\n" % exponent)
if link.from_node.inputs["Falloff"].is_linked:
pass
else:
- falloff=link.from_node.inputs["Falloff"].default_value
- file.write(' falloff %.4g\n'%falloff)
+ falloff = link.from_node.inputs["Falloff"].default_value
+ file.write(" falloff %.4g\n" % falloff)
if link.from_node.inputs["Metallic"].is_linked:
pass
else:
- metallic=link.from_node.inputs["Metallic"].default_value
- file.write(' metallic %.4g'%metallic)
+ metallic = link.from_node.inputs["Metallic"].default_value
+ file.write(" metallic %.4g" % metallic)
if link.from_node.inputs["Fresnel"].is_linked:
pass
else:
- if link.from_node.inputs["Fresnel"].default_value==True:
- fresnel="fresnel"
+ if link.from_node.inputs["Fresnel"].default_value:
+ fresnel = "fresnel"
if link.from_node.inputs["Conserve energy"].is_linked:
pass
else:
- if link.from_node.inputs["Conserve energy"].default_value==True:
- conserve="conserve_energy"
+ if link.from_node.inputs["Conserve energy"].default_value:
+ conserve = "conserve_energy"
- file.write(' %s}\n %s\n'%(fresnel,conserve))
+ file.write(" %s}\n %s\n" % (fresnel, conserve))
- if link.from_node.bl_idname == 'PovrayAmbientNode':
- ambient=(0,0,0)
+ if link.from_node.bl_idname == "PovrayAmbientNode":
+ ambient = (0, 0, 0)
if link.from_node.inputs["Ambient"].is_linked:
pass
else:
- ambient=link.from_node.inputs["Ambient"].default_value[:]
- file.write(' ambient <%.4g,%.4g,%.4g>\n'%ambient)
-
- if link.from_node.bl_idname in {'PovrayIridescenceNode'}:
- file.write(' irid {\n')
- amount=0
- thickness=0
- turbulence=0
+ ambient = link.from_node.inputs["Ambient"].default_value[:]
+ file.write(" ambient <%.4g,%.4g,%.4g>\n" % ambient)
+
+ if link.from_node.bl_idname in {"PovrayIridescenceNode"}:
+ file.write(" irid {\n")
+ amount = 0
+ thickness = 0
+ turbulence = 0
if link.from_node.inputs["Amount"].is_linked:
pass
else:
- amount=link.from_node.inputs["Amount"].default_value
- file.write(' %.4g\n'%amount)
+ amount = link.from_node.inputs["Amount"].default_value
+ file.write(" %.4g\n" % amount)
if link.from_node.inputs["Thickness"].is_linked:
pass
else:
- exponent=link.from_node.inputs["Thickness"].default_value
- file.write(' thickness %.4g\n'%thickness)
+ exponent = link.from_node.inputs["Thickness"].default_value
+ file.write(" thickness %.4g\n" % thickness)
if link.from_node.inputs["Turbulence"].is_linked:
pass
else:
- falloff=link.from_node.inputs["Turbulence"].default_value
- file.write(' turbulence %.4g}\n'%turbulence)
+ falloff = link.from_node.inputs["Turbulence"].default_value
+ file.write(" turbulence %.4g}\n" % turbulence)
- file.write('}\n')
+ file.write("}\n")
for node in ntree.nodes:
- povNodeName=string_strip_hyphen(bpy.path.clean_name(node.name))+"_%s"%povMatName
+ pov_node_name = string_strip_hyphen(bpy.path.clean_name(node.name)) + "_%s" % pov_mat_name
if node.bl_idname == "PovrayTransformNode" and node.outputs["Transform"].is_linked:
- tx=node.inputs["Translate x"].default_value
- ty=node.inputs["Translate y"].default_value
- tz=node.inputs["Translate z"].default_value
- rx=node.inputs["Rotate x"].default_value
- ry=node.inputs["Rotate y"].default_value
- rz=node.inputs["Rotate z"].default_value
- sx=node.inputs["Scale x"].default_value
- sy=node.inputs["Scale y"].default_value
- sz=node.inputs["Scale z"].default_value
- file.write('#declare %s = transform {\n translate<%.4g,%.4g,%.4g>\n rotate<%.4g,%.4g,%.4g>\n scale<%.4g,%.4g,%.4g>}\n'%(povNodeName,tx,ty,tz,rx,ry,rz,sx,sy,sz))
+ tx = node.inputs["Translate x"].default_value
+ ty = node.inputs["Translate y"].default_value
+ tz = node.inputs["Translate z"].default_value
+ rx = node.inputs["Rotate x"].default_value
+ ry = node.inputs["Rotate y"].default_value
+ rz = node.inputs["Rotate z"].default_value
+ sx = node.inputs["Scale x"].default_value
+ sy = node.inputs["Scale y"].default_value
+ sz = node.inputs["Scale z"].default_value
+ file.write(
+ "#declare %s = transform {\n"
+ " translate<%.4g,%.4g,%.4g>\n"
+ " rotate<%.4g,%.4g,%.4g>\n"
+ " scale<%.4g,%.4g,%.4g>}\n" % (pov_node_name, tx, ty, tz, rx, ry, rz, sx, sy, sz)
+ )
for node in ntree.nodes:
- povNodeName=string_strip_hyphen(bpy.path.clean_name(node.name))+"_%s"%povMatName
+ pov_node_name = string_strip_hyphen(bpy.path.clean_name(node.name)) + "_%s" % pov_mat_name
if node.bl_idname == "PovrayColorImageNode" and node.outputs["Pigment"].is_linked:
- declareNodes.append(node.name)
+ declare_nodes.append(node.name)
if node.image == "":
- file.write('#declare %s = pigment { color rgb 0.8}\n'%(povNodeName))
+ file.write("#declare %s = pigment { color rgb 0.8}\n" % (pov_node_name))
else:
- im=bpy.data.images[node.image]
- if im.filepath and os.path.exists(bpy.path.abspath(im.filepath)):
+ im = bpy.data.images[node.image]
+ if im.filepath and path.exists(bpy.path.abspath(im.filepath)): # (os.path)
transform = ""
for link in ntree.links:
- if link.from_node.bl_idname=='PovrayTransformNode' and link.to_node==node:
- povTransName=string_strip_hyphen(bpy.path.clean_name(link.from_node.name))+"_%s"%povMatName
- transform="transform {%s}"%povTransName
- uv=""
- if node.map_type=="uv_mapping":
- uv="uv_mapping"
- filepath=bpy.path.abspath(im.filepath)
- file.write('#declare %s = pigment {%s image_map {\n'%(povNodeName,uv))
- premul="off"
+ if (
+ link.from_node.bl_idname == "PovrayTransformNode"
+ and link.to_node == node
+ ):
+ pov_trans_name = (
+ string_strip_hyphen(bpy.path.clean_name(link.from_node.name))
+ + "_%s" % pov_mat_name
+ )
+ transform = "transform {%s}" % pov_trans_name
+ uv = ""
+ if node.map_type == "uv_mapping":
+ uv = "uv_mapping"
+ filepath = bpy.path.abspath(im.filepath)
+ file.write("#declare %s = pigment {%s image_map {\n" % (pov_node_name, uv))
+ premul = "off"
if node.premultiplied:
- premul="on"
- once=""
+ premul = "on"
+ once = ""
if node.once:
- once="once"
- file.write(' "%s"\n gamma %.6g\n premultiplied %s\n'%(filepath,node.inputs["Gamma"].default_value,premul))
- file.write(' %s\n'%once)
- if node.map_type!="uv_mapping":
- file.write(' map_type %s\n'%(node.map_type))
- file.write(' interpolate %s\n filter all %.4g\n transmit all %.4g\n'%
- (node.interpolate,node.inputs["Filter"].default_value,node.inputs["Transmit"].default_value))
- file.write(' }\n')
- file.write(' %s\n'%transform)
- file.write(' }\n')
+ once = "once"
+ file.write(
+ ' "%s"\n gamma %.6g\n premultiplied %s\n'
+ % (filepath, node.inputs["Gamma"].default_value, premul)
+ )
+ file.write(" %s\n" % once)
+ if node.map_type != "uv_mapping":
+ file.write(" map_type %s\n" % (node.map_type))
+ file.write(
+ " interpolate %s\n filter all %.4g\n transmit all %.4g\n"
+ % (
+ node.interpolate,
+ node.inputs["Filter"].default_value,
+ node.inputs["Transmit"].default_value,
+ )
+ )
+ file.write(" }\n")
+ file.write(" %s\n" % transform)
+ file.write(" }\n")
for node in ntree.nodes:
- povNodeName=string_strip_hyphen(bpy.path.clean_name(node.name))+"_%s"%povMatName
+ pov_node_name = string_strip_hyphen(bpy.path.clean_name(node.name)) + "_%s" % pov_mat_name
if node.bl_idname == "PovrayImagePatternNode" and node.outputs["Pattern"].is_linked:
- declareNodes.append(node.name)
+ declare_nodes.append(node.name)
if node.image != "":
- im=bpy.data.images[node.image]
- if im.filepath and os.path.exists(bpy.path.abspath(im.filepath)):
+ im = bpy.data.images[node.image]
+ if im.filepath and path.exists(bpy.path.abspath(im.filepath)):
transform = ""
for link in ntree.links:
- if link.from_node.bl_idname=='PovrayTransformNode' and link.to_node==node:
- povTransName=string_strip_hyphen(bpy.path.clean_name(link.from_node.name))+"_%s"%povMatName
- transform="transform {%s}"%povTransName
- uv=""
- if node.map_type=="uv_mapping":
- uv="uv_mapping"
- filepath=bpy.path.abspath(im.filepath)
- file.write('#macro %s() %s image_pattern {\n'%(povNodeName,uv))
- premul="off"
+ if (
+ link.from_node.bl_idname == "PovrayTransformNode"
+ and link.to_node == node
+ ):
+ pov_trans_name = (
+ string_strip_hyphen(bpy.path.clean_name(link.from_node.name))
+ + "_%s" % pov_mat_name
+ )
+ transform = "transform {%s}" % pov_trans_name
+ uv = ""
+ if node.map_type == "uv_mapping":
+ uv = "uv_mapping"
+ filepath = bpy.path.abspath(im.filepath)
+ file.write("#macro %s() %s image_pattern {\n" % (pov_node_name, uv))
+ premul = "off"
if node.premultiplied:
- premul="on"
- once=""
+ premul = "on"
+ once = ""
if node.once:
- once="once"
- file.write(' "%s"\n gamma %.6g\n premultiplied %s\n'%(filepath,node.inputs["Gamma"].default_value,premul))
- file.write(' %s\n'%once)
- if node.map_type!="uv_mapping":
- file.write(' map_type %s\n'%(node.map_type))
- file.write(' interpolate %s\n'%node.interpolate)
- file.write(' }\n')
- file.write(' %s\n'%transform)
- file.write('#end\n')
+ once = "once"
+ file.write(
+ ' "%s"\n gamma %.6g\n premultiplied %s\n'
+ % (filepath, node.inputs["Gamma"].default_value, premul)
+ )
+ file.write(" %s\n" % once)
+ if node.map_type != "uv_mapping":
+ file.write(" map_type %s\n" % (node.map_type))
+ file.write(" interpolate %s\n" % node.interpolate)
+ file.write(" }\n")
+ file.write(" %s\n" % transform)
+ file.write("#end\n")
for node in ntree.nodes:
- povNodeName=string_strip_hyphen(bpy.path.clean_name(node.name))+"_%s"%povMatName
+ pov_node_name = string_strip_hyphen(bpy.path.clean_name(node.name)) + "_%s" % pov_mat_name
if node.bl_idname == "PovrayBumpMapNode" and node.outputs["Normal"].is_linked:
if node.image != "":
- im=bpy.data.images[node.image]
- if im.filepath and os.path.exists(bpy.path.abspath(im.filepath)):
+ im = bpy.data.images[node.image]
+ if im.filepath and path.exists(bpy.path.abspath(im.filepath)):
transform = ""
for link in ntree.links:
- if link.from_node.bl_idname=='PovrayTransformNode' and link.to_node==node:
- povTransName=string_strip_hyphen(bpy.path.clean_name(link.from_node.name))+"_%s"%povMatName
- transform="transform {%s}"%povTransName
- uv=""
- if node.map_type=="uv_mapping":
- uv="uv_mapping"
- filepath=bpy.path.abspath(im.filepath)
- file.write('#declare %s = normal {%s bump_map {\n'%(povNodeName,uv))
- once=""
+ if (
+ link.from_node.bl_idname == "PovrayTransformNode"
+ and link.to_node == node
+ ):
+ pov_trans_name = (
+ string_strip_hyphen(bpy.path.clean_name(link.from_node.name))
+ + "_%s" % pov_mat_name
+ )
+ transform = "transform {%s}" % pov_trans_name
+ uv = ""
+ if node.map_type == "uv_mapping":
+ uv = "uv_mapping"
+ filepath = bpy.path.abspath(im.filepath)
+ file.write("#declare %s = normal {%s bump_map {\n" % (pov_node_name, uv))
+ once = ""
if node.once:
- once="once"
- file.write(' "%s"\n'%filepath)
- file.write(' %s\n'%once)
- if node.map_type!="uv_mapping":
- file.write(' map_type %s\n'%(node.map_type))
- bump_size=node.inputs["Normal"].default_value
+ once = "once"
+ file.write(' "%s"\n' % filepath)
+ file.write(" %s\n" % once)
+ if node.map_type != "uv_mapping":
+ file.write(" map_type %s\n" % (node.map_type))
+ bump_size = node.inputs["Normal"].default_value
if node.inputs["Normal"].is_linked:
pass
- file.write(' interpolate %s\n bump_size %.4g\n'%(node.interpolate,bump_size))
- file.write(' }\n')
- file.write(' %s\n'%transform)
- file.write(' }\n')
- declareNodes.append(node.name)
-
-
+ file.write(
+ " interpolate %s\n bump_size %.4g\n" % (node.interpolate, bump_size)
+ )
+ file.write(" }\n")
+ file.write(" %s\n" % transform)
+ file.write(" }\n")
+ declare_nodes.append(node.name)
for node in ntree.nodes:
- povNodeName=string_strip_hyphen(bpy.path.clean_name(node.name))+"_%s"%povMatName
+ pov_node_name = string_strip_hyphen(bpy.path.clean_name(node.name)) + "_%s" % pov_mat_name
if node.bl_idname == "PovrayPigmentNode" and node.outputs["Pigment"].is_linked:
- declareNodes.append(node.name)
- r,g,b=node.inputs["Color"].default_value[:]
- f=node.inputs["Filter"].default_value
- t=node.inputs["Transmit"].default_value
+ declare_nodes.append(node.name)
+ r, g, b = node.inputs["Color"].default_value[:]
+ f = node.inputs["Filter"].default_value
+ t = node.inputs["Transmit"].default_value
if node.inputs["Color"].is_linked:
pass
- file.write('#declare %s = pigment{color srgbft <%.4g,%.4g,%.4g,%.4g,%.4g>}\n'%(povNodeName,r,g,b,f,t))
-
+ file.write(
+ "#declare %s = pigment{color srgbft <%.4g,%.4g,%.4g,%.4g,%.4g>}\n"
+ % (pov_node_name, r, g, b, f, t)
+ )
for node in ntree.nodes:
- povNodeName=string_strip_hyphen(bpy.path.clean_name(node.name))+"_%s"%povMatName
+ pov_node_name = string_strip_hyphen(bpy.path.clean_name(node.name)) + "_%s" % pov_mat_name
if node.bl_idname == "PovrayTextureNode" and node.outputs["Texture"].is_linked:
- declareNodes.append(node.name)
- r,g,b=node.inputs["Pigment"].default_value[:]
- povColName="color rgb <%.4g,%.4g,%.4g>"%(r,g,b)
+ declare_nodes.append(node.name)
+ r, g, b = node.inputs["Pigment"].default_value[:]
+ pov_col_name = "color rgb <%.4g,%.4g,%.4g>" % (r, g, b)
if node.inputs["Pigment"].is_linked:
for link in ntree.links:
- if link.to_node==node and link.to_socket.name=="Pigment":
- povColName=string_strip_hyphen(bpy.path.clean_name(link.from_node.name))+"_%s"%povMatName
- file.write('#declare %s = texture{\n pigment{%s}\n'%(povNodeName,povColName))
+ if link.to_node == node and link.to_socket.name == "Pigment":
+ pov_col_name = (
+ string_strip_hyphen(bpy.path.clean_name(link.from_node.name))
+ + "_%s" % pov_mat_name
+ )
+ file.write("#declare %s = texture{\n pigment{%s}\n" % (pov_node_name, pov_col_name))
if node.inputs["Normal"].is_linked:
for link in ntree.links:
- if link.to_node==node and link.to_socket.name=="Normal" and link.from_node.name in declareNodes:
- povNorName=string_strip_hyphen(bpy.path.clean_name(link.from_node.name))+"_%s"%povMatName
- file.write(' normal{%s}\n'%povNorName)
+ if (
+ link.to_node == node
+ and link.to_socket.name == "Normal"
+ and link.from_node.name in declare_nodes
+ ):
+ pov_nor_name = (
+ string_strip_hyphen(bpy.path.clean_name(link.from_node.name))
+ + "_%s" % pov_mat_name
+ )
+ file.write(" normal{%s}\n" % pov_nor_name)
if node.inputs["Finish"].is_linked:
for link in ntree.links:
- if link.to_node==node and link.to_socket.name=="Finish":
- povFinName=string_strip_hyphen(bpy.path.clean_name(link.from_node.name))+"_%s"%povMatName
- file.write(' finish{%s}\n'%povFinName)
- file.write('}\n')
- declareNodes.append(node.name)
+ if link.to_node == node and link.to_socket.name == "Finish":
+ pov_fin_name = (
+ string_strip_hyphen(bpy.path.clean_name(link.from_node.name))
+ + "_%s" % pov_mat_name
+ )
+ file.write(" finish{%s}\n" % pov_fin_name)
+ file.write("}\n")
+ declare_nodes.append(node.name)
- for i in range(0,len(ntree.nodes)):
+ for i in range(0, len(ntree.nodes)):
for node in ntree.nodes:
- if node.bl_idname in {"ShaderNodeGroup","ShaderTextureMapNode"}:
+ if node.bl_idname in {"ShaderNodeGroup", "ShaderTextureMapNode"}:
for output in node.outputs:
- if output.name=="Texture" and output.is_linked and (node.name not in declareNodes):
- declare=True
+ if (
+ output.name == "Texture"
+ and output.is_linked
+ and (node.name not in declare_nodes)
+ ):
+ declare = True
for link in ntree.links:
- if link.to_node==node and link.to_socket.name not in {"","Color ramp","Mapping","Transform","Modifier"}:
- if link.from_node.name not in declareNodes:
- declare=False
+ if link.to_node == node and link.to_socket.name not in {
+ "",
+ "Color ramp",
+ "Mapping",
+ "Transform",
+ "Modifier",
+ }:
+ if link.from_node.name not in declare_nodes:
+ declare = False
if declare:
- povNodeName=string_strip_hyphen(bpy.path.clean_name(node.name))+"_%s"%povMatName
- uv=""
- warp=""
+ pov_node_name = (
+ string_strip_hyphen(bpy.path.clean_name(node.name))
+ + "_%s" % pov_mat_name
+ )
+ uv = ""
+ warp = ""
for link in ntree.links:
- if link.to_node==node and link.from_node.bl_idname=='PovrayMappingNode' and link.from_node.warp_type!="NONE":
+ if (
+ link.to_node == node
+ and link.from_node.bl_idname == "PovrayMappingNode"
+ and link.from_node.warp_type != "NONE"
+ ):
w_type = link.from_node.warp_type
- if w_type=="uv_mapping":
- uv="uv_mapping"
+ if w_type == "uv_mapping":
+ uv = "uv_mapping"
else:
- tor=""
- if w_type=="toroidal":
- tor="major_radius %.4g"%link.from_node.warp_tor_major_radius
- orient=link.from_node.warp_orientation
- exp=link.from_node.warp_dist_exp
- warp="warp{%s orientation %s dist_exp %.4g %s}"%(w_type,orient,exp,tor)
- if link.from_node.warp_type=="planar":
- warp="warp{%s %s %.4g}"%(w_type,orient,exp)
- if link.from_node.warp_type=="cubic":
- warp="warp{%s}"%w_type
- file.write('#declare %s = texture {%s\n'%(povNodeName,uv))
- pattern=node.inputs[0].default_value
- advanced=""
+ tor = ""
+ if w_type == "toroidal":
+ tor = (
+ "major_radius %.4g"
+ % link.from_node.warp_tor_major_radius
+ )
+ orient = link.from_node.warp_orientation
+ exp = link.from_node.warp_dist_exp
+ warp = "warp{%s orientation %s dist_exp %.4g %s}" % (
+ w_type,
+ orient,
+ exp,
+ tor,
+ )
+ if link.from_node.warp_type == "planar":
+ warp = "warp{%s %s %.4g}" % (w_type, orient, exp)
+ if link.from_node.warp_type == "cubic":
+ warp = "warp{%s}" % w_type
+ file.write("#declare %s = texture {%s\n" % (pov_node_name, uv))
+ pattern = node.inputs[0].default_value
+ advanced = ""
if node.inputs[0].is_linked:
for link in ntree.links:
- if link.to_node==node and link.from_node.bl_idname=='ShaderPatternNode':
+ if (
+ link.to_node == node
+ and link.from_node.bl_idname == "ShaderPatternNode"
+ ):
########### advanced ###############################################
- lfn=link.from_node
- pattern=lfn.pattern
- if pattern == 'agate':
- advanced = 'agate_turb %.4g'%lfn.agate_turb
- if pattern == 'crackle':
- advanced="form <%.4g,%.4g,%.4g>"%(lfn.crackle_form_x,lfn.crackle_form_y,lfn.crackle_form_z)
- advanced+=" metric %.4g"%lfn.crackle_metric
+ lfn = link.from_node
+ pattern = lfn.pattern
+ if pattern == "agate":
+ advanced = "agate_turb %.4g" % lfn.agate_turb
+ if pattern == "crackle":
+ advanced = "form <%.4g,%.4g,%.4g>" % (
+ lfn.crackle_form_x,
+ lfn.crackle_form_y,
+ lfn.crackle_form_z,
+ )
+ advanced += " metric %.4g" % lfn.crackle_metric
if lfn.crackle_solid:
- advanced+=" solid"
- if pattern in {'spiral1', 'spiral2'}:
- advanced='%.4g'%lfn.spiral_arms
- if pattern in {'tiling'}:
- advanced='%.4g'%lfn.tiling_number
- if pattern in {'gradient'}:
- advanced='%s'%lfn.gradient_orient
- if link.to_node==node and link.from_node.bl_idname=='PovrayImagePatternNode':
- povMacroName=string_strip_hyphen(bpy.path.clean_name(link.from_node.name))+"_%s"%povMatName
- pattern = "%s()"%povMacroName
- file.write(' %s %s %s\n'%(pattern,advanced,warp))
-
- repeat=""
+ advanced += " solid"
+ if pattern in {"spiral1", "spiral2"}:
+ advanced = "%.4g" % lfn.spiral_arms
+ if pattern in {"tiling"}:
+ advanced = "%.4g" % lfn.tiling_number
+ if pattern in {"gradient"}:
+ advanced = "%s" % lfn.gradient_orient
+ if (
+ link.to_node == node
+ and link.from_node.bl_idname == "PovrayImagePatternNode"
+ ):
+ pov_macro_name = (
+ string_strip_hyphen(
+ bpy.path.clean_name(link.from_node.name)
+ )
+ + "_%s" % pov_mat_name
+ )
+ pattern = "%s()" % pov_macro_name
+ file.write(" %s %s %s\n" % (pattern, advanced, warp))
+
+ repeat = ""
for link in ntree.links:
- if link.to_node==node and link.from_node.bl_idname=='PovrayMultiplyNode':
+ if (
+ link.to_node == node
+ and link.from_node.bl_idname == "PovrayMultiplyNode"
+ ):
if link.from_node.amount_x > 1:
- repeat+="warp{repeat %.4g * x}"%link.from_node.amount_x
+ repeat += "warp{repeat %.4g * x}" % link.from_node.amount_x
if link.from_node.amount_y > 1:
- repeat+=" warp{repeat %.4g * y}"%link.from_node.amount_y
+ repeat += " warp{repeat %.4g * y}" % link.from_node.amount_y
if link.from_node.amount_z > 1:
- repeat+=" warp{repeat %.4g * z}"%link.from_node.amount_z
+ repeat += " warp{repeat %.4g * z}" % link.from_node.amount_z
- transform=""
+ transform = ""
for link in ntree.links:
- if link.to_node==node and link.from_node.bl_idname=='PovrayTransformNode':
- povTransName=string_strip_hyphen(bpy.path.clean_name(link.from_node.name))+"_%s"%povMatName
- transform="transform {%s}"%povTransName
- x=0
- y=0
- z=0
- d=0
- e=0
- f=0
- g=0
- h=0
- modifier=False
+ if (
+ link.to_node == node
+ and link.from_node.bl_idname == "PovrayTransformNode"
+ ):
+ pov_trans_name = (
+ string_strip_hyphen(
+ bpy.path.clean_name(link.from_node.name)
+ )
+ + "_%s" % pov_mat_name
+ )
+ transform = "transform {%s}" % pov_trans_name
+ x = 0
+ y = 0
+ z = 0
+ d = 0
+ e = 0
+ f = 0
+ g = 0
+ h = 0
+ modifier = False
for link in ntree.links:
- if link.to_node==node and link.from_node.bl_idname=='PovrayModifierNode':
- modifier=True
+ if (
+ link.to_node == node
+ and link.from_node.bl_idname == "PovrayModifierNode"
+ ):
+ modifier = True
if link.from_node.inputs["Turb X"].is_linked:
pass
else:
@@ -1800,66 +1604,135 @@ def write_nodes(scene,povMatName,ntree,file):
else:
h = link.from_node.inputs["Phase"].default_value
- turb = "turbulence <%.4g,%.4g,%.4g>"%(x,y,z)
- octv = "octaves %s"%d
- lmbd = "lambda %.4g"%e
- omg = "omega %.4g"%f
- freq = "frequency %.4g"%g
- pha = "phase %.4g"%h
-
-
- file.write('\n')
- if pattern not in {'checker', 'hexagon', 'square', 'triangular', 'brick'}:
- file.write(' texture_map {\n')
+ turb = "turbulence <%.4g,%.4g,%.4g>" % (x, y, z)
+ octv = "octaves %s" % d
+ lmbd = "lambda %.4g" % e
+ omg = "omega %.4g" % f
+ freq = "frequency %.4g" % g
+ pha = "phase %.4g" % h
+
+ file.write("\n")
+ if pattern not in {
+ "checker",
+ "hexagon",
+ "square",
+ "triangular",
+ "brick",
+ }:
+ file.write(" texture_map {\n")
if node.inputs["Color ramp"].is_linked:
for link in ntree.links:
- if link.to_node==node and link.from_node.bl_idname=="ShaderNodeValToRGB":
+ if (
+ link.to_node == node
+ and link.from_node.bl_idname == "ShaderNodeValToRGB"
+ ):
els = link.from_node.color_ramp.elements
- n=-1
+ n = -1
for el in els:
- n+=1
- povInMatName=string_strip_hyphen(bpy.path.clean_name(link.from_node.name))+"_%s_%s"%(n,povMatName)
- default=True
+ n += 1
+ pov_in_mat_name = string_strip_hyphen(
+ bpy.path.clean_name(link.from_node.name)
+ ) + "_%s_%s" % (n, pov_mat_name)
+ default = True
for ilink in ntree.links:
- if ilink.to_node==node and ilink.to_socket.name == str(n):
- default=False
- povInMatName=string_strip_hyphen(bpy.path.clean_name(ilink.from_node.name))+"_%s"%povMatName
+ if (
+ ilink.to_node == node
+ and ilink.to_socket.name == str(n)
+ ):
+ default = False
+ pov_in_mat_name = (
+ string_strip_hyphen(
+ bpy.path.clean_name(
+ ilink.from_node.name
+ )
+ )
+ + "_%s" % pov_mat_name
+ )
if default:
- r,g,b,a=el.color[:]
- file.write(' #declare %s = texture{pigment{color srgbt <%.4g,%.4g,%.4g,%.4g>}};\n'%(povInMatName,r,g,b,1-a))
- file.write(' [%s %s]\n'%(el.position,povInMatName))
+ r, g, b, a = el.color[:]
+ file.write(
+ " #declare %s = texture{"
+ "pigment{"
+ "color srgbt <%.4g,%.4g,%.4g,%.4g>}};\n"
+ % (pov_in_mat_name, r, g, b, 1 - a)
+ )
+ file.write(
+ " [%s %s]\n" % (el.position, pov_in_mat_name)
+ )
else:
- els=[[0,0,0,0],[1,1,1,1]]
- for i in range(0,2):
- povInMatName=string_strip_hyphen(bpy.path.clean_name(link.from_node.name))+"_%s_%s"%(i,povMatName)
- default=True
+ els = [[0, 0, 0, 0], [1, 1, 1, 1]]
+ for t in range(0, 2):
+ pov_in_mat_name = string_strip_hyphen(
+ bpy.path.clean_name(link.from_node.name)
+ ) + "_%s_%s" % (t, pov_mat_name)
+ default = True
for ilink in ntree.links:
- if ilink.to_node==node and ilink.to_socket.name == str(i):
- default=False
- povInMatName=string_strip_hyphen(bpy.path.clean_name(ilink.from_node.name))+"_%s"%povMatName
+ if ilink.to_node == node and ilink.to_socket.name == str(t):
+ default = False
+ pov_in_mat_name = (
+ string_strip_hyphen(
+ bpy.path.clean_name(ilink.from_node.name)
+ )
+ + "_%s" % pov_mat_name
+ )
if default:
- r,g,b=els[i][1],els[i][2],els[i][3]
- if pattern not in {'checker', 'hexagon', 'square', 'triangular', 'brick'}:
- file.write(' #declare %s = texture{pigment{color rgb <%.4g,%.4g,%.4g>}};\n'%(povInMatName,r,g,b))
+ r, g, b = els[t][1], els[t][2], els[t][3]
+ if pattern not in {
+ "checker",
+ "hexagon",
+ "square",
+ "triangular",
+ "brick",
+ }:
+ file.write(
+ " #declare %s = texture{pigment{color rgb <%.4g,%.4g,%.4g>}};\n"
+ % (pov_in_mat_name, r, g, b)
+ )
else:
- file.write(' texture{pigment{color rgb <%.4g,%.4g,%.4g>}}\n'%(r,g,b))
- if pattern not in {'checker', 'hexagon', 'square', 'triangular', 'brick'}:
- file.write(' [%s %s]\n'%(els[i][0],povInMatName))
+ file.write(
+ " texture{pigment{color rgb <%.4g,%.4g,%.4g>}}\n"
+ % (r, g, b)
+ )
+ if pattern not in {
+ "checker",
+ "hexagon",
+ "square",
+ "triangular",
+ "brick",
+ }:
+ file.write(" [%s %s]\n" % (els[t][0], pov_in_mat_name))
else:
- if default==False:
- file.write(' texture{%s}\n'%povInMatName)
- if pattern not in {'checker', 'hexagon', 'square', 'triangular', 'brick'}:
- file.write('}\n')
- if pattern == 'brick':
- file.write("brick_size <%.4g, %.4g, %.4g> mortar %.4g \n"%(node.brick_size_x,
- node.brick_size_y, node.brick_size_z, node.brick_mortar))
- file.write(' %s %s'%(repeat,transform))
+ if not default:
+ file.write(" texture{%s}\n" % pov_in_mat_name)
+ if pattern not in {
+ "checker",
+ "hexagon",
+ "square",
+ "triangular",
+ "brick",
+ }:
+ file.write("}\n")
+ if pattern == "brick":
+ file.write(
+ "brick_size <%.4g, %.4g, %.4g> mortar %.4g \n"
+ % (
+ node.brick_size_x,
+ node.brick_size_y,
+ node.brick_size_z,
+ node.brick_mortar,
+ )
+ )
+ file.write(" %s %s" % (repeat, transform))
if modifier:
- file.write(' %s %s %s %s %s %s'%(turb,octv,lmbd,omg,freq,pha))
- file.write('}\n')
- declareNodes.append(node.name)
+ file.write(
+ " %s %s %s %s %s %s" % (turb, octv, lmbd, omg, freq, pha)
+ )
+ file.write("}\n")
+ declare_nodes.append(node.name)
for link in ntree.links:
- if link.to_node.bl_idname == "PovrayOutputNode" and link.from_node.name in declareNodes:
- povMatNodeName=string_strip_hyphen(bpy.path.clean_name(link.from_node.name))+"_%s"%povMatName
- file.write('#declare %s = %s\n'%(povMatName,povMatNodeName))
+ if link.to_node.bl_idname == "PovrayOutputNode" and link.from_node.name in declare_nodes:
+ pov_mat_node_name = (
+ string_strip_hyphen(bpy.path.clean_name(link.from_node.name)) + "_%s" % pov_mat_name
+ )
+ file.write("#declare %s = %s\n" % (pov_mat_name, pov_mat_node_name))