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:
authorMaurice Raybaud <mauriceraybaud@hotmail.fr>2016-04-29 19:11:48 +0300
committerMaurice Raybaud <mauriceraybaud@hotmail.fr>2016-04-29 19:11:48 +0300
commit59ea4fc9f11f47922aaec7f48ea0f2633ad4dc80 (patch)
tree2c000a25640fedad7a66eaa14acf2d90a556503f
parentdbb54eee76d38e6936f0a32fd21a14844800f498 (diff)
fixed:
*transmit value removed from ambient light to avoid parse warning How do we generate a transparent background now ? *name 'using_uberpov' was not defined in shading.py added: *moved exportPattern(texture) from render.py to shading.py *moved texture influences from render.py to a function in shading.py
-rw-r--r--render_povray/render.py1003
-rw-r--r--render_povray/shading.py1001
2 files changed, 1009 insertions, 995 deletions
diff --git a/render_povray/render.py b/render_povray/render.py
index acc27a03..822e1be7 100644
--- a/render_povray/render.py
+++ b/render_povray/render.py
@@ -52,8 +52,8 @@ def imageFormat(imgF):
'HDR': "hdr",
}.get(os.path.splitext(imgF)[-1].upper(), "")
- if not ext:
- print(" WARNING: texture image format not supported ")
+ #if not ext:
+ #print(" WARNING: texture image has no extension") #too verbose
return ext
@@ -312,477 +312,7 @@ def write_object_modifiers(scene,ob,File):
# if scene.pov.photon_enable == False:
# File.write("caustics %.4g\n"%ob.pov.fake_caustics_power)
-def exportPattern(texture):
- 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 = tex.pov
- colRampStrg="color_map {\n"
- numColor=0
- for el in tex.color_ramp.elements:
- numColor+=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 pat.tex_pattern_type == 'emulator':
- texStrg+="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)
- 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"
- ####################### EMULATE BLENDER CLOUDS TEXTURE ####################
- if tex.type == 'CLOUDS':
- if tex.noise_type == 'SOFT_NOISE':
- texStrg+="wrinkles\n"
- texStrg+="scale 0.25\n"
- else:
- texStrg+="granite\n"
- if tex.use_color_ramp == True:
- texStrg+=exportColorRamp(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"
- ####################### 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)
- 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"
- ####################### 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)
- 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"
- else:
- if tex.use_color_ramp == True:
- texStrg+=exportColorRamp(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"
- ####################### EMULATE BLENDER MAGIC TEXTURE ####################
- if tex.type == 'MAGIC':
- texStrg+="leopard\n"
- if tex.use_color_ramp == True:
- texStrg+=exportColorRamp(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"
- ####################### 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)
- 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"
- 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"
- ####################### 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"
- 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)
- 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"
- ####################### 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"
- # simplified for now:
-
- if tex.type == 'MUSGRAVE':
- texStrg+="bozo scale 0.25 \n"
- if tex.use_color_ramp == True:
- texStrg+=exportColorRamp(tex)
- else:
- texStrg+="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)
- 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)
- 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)
- 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)
- 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"
- else:
- texStrg+=" [1 wrinkles scale 0.25\n"
- if tex.use_color_ramp == True:
- texStrg+=exportColorRamp(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"
- ####################### 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)
- else:
- texStrg+="color_map {\n"
- texStrg+="[0.75 color rgb<0,0,0,>]\n"
- texStrg+="[1 color rgb<1,1,1,>]\n"
- texStrg+="}\n"
-
- ####################### IGNORE OTHER BLENDER TEXTURE ####################
- else: #non translated textures
- pass
- texStrg+="}\n\n"
- texStrg+="#declare f%s=\n"%PATname
- texStrg+="function{pigment{%s}}\n"%PATname
- texStrg+="\n"
-
- else:
- 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"
- 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_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_z != "NONE":
- if pat.func_plus_z =='increase':
- texStrg+="*"
- if pat.func_plus_z =='plus':
- texStrg+="+"
- texStrg+="%.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"}:
- sort = 0
- 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"}:
- 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"}:
- 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"}:
- 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"}:
- sort = 5
- 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
- if sort > 0:
- texStrg+=",%.4g"%pat.func_P1
- if sort > 1:
- texStrg+=",%.4g"%pat.func_P2
- if sort > 2:
- texStrg+=",%.4g"%pat.func_P3
- if sort > 3:
- texStrg+=",%.4g"%pat.func_P4
- if sort > 4:
- texStrg+=",%.4g"%pat.func_P5
- if sort > 5:
- texStrg+=",%.4g"%pat.func_P6
- if sort > 6:
- texStrg+=",%.4g"%pat.func_P7
- texStrg+=",%.4g"%pat.func_P8
- texStrg+=",%.4g"%pat.func_P9
- texStrg+=")}\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:
- for el in tex.color_ramp.elements:
- numColor+=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)
- 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 write_pov(filename, scene=None, info_callback=None):
import mathutils
@@ -3175,516 +2705,16 @@ def write_pov(filename, scene=None, info_callback=None):
trans = 0.0
else:
- material_finish = materialNames[mater.name]
- if mater.use_transparency:
- trans = 1.0 - mater.alpha
- else:
- trans = 0.0
- if (mater.specular_color.s == 0.0):
- colored_specular_found = False
- else:
- colored_specular_found = True
-
- if mater.use_transparency and mater.transparency_method == 'RAYTRACE':
- povFilter = mater.raytrace_transparency.filter * (1.0 - mater.alpha)
- trans = (1.0 - mater.alpha) - povFilter
- else:
- povFilter = 0.0
-
- ##############SF
- texturesDif = ""
- texturesSpec = ""
- texturesNorm = ""
- texturesAlpha = ""
- #proceduralFlag=False
- for t in mater.texture_slots:
- if t and t.use and t.texture.type != 'IMAGE' and t.texture.type != 'NONE':
- proceduralFlag=True
- image_filename = "PAT_%s"%string_strip_hyphen(bpy.path.clean_name(t.texture.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.0 # UNUSED
- #textNormName=t.texture.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=t.texture.image.name + ".displ"
- #was the above used? --MR
- t_alpha = t
-
- if t and t.texture.type == 'IMAGE' and t.use and t.texture.image and t.texture.pov.tex_pattern_type == 'emulator':
- proceduralFlag=False
- if t.texture.image.packed_file:
- orig_image_filename=t.texture.image.filepath_raw
- unpackedfilename= os.path.join(preview_dir,("unpacked_img_"+(string_strip_hyphen(bpy.path.clean_name(t.texture.name)))))
- if not os.path.exists(unpackedfilename):
- # record which images that were newly copied and can be safely
- # cleaned up
- unpacked_images.append(unpackedfilename)
- t.texture.image.filepath_raw=unpackedfilename
- t.texture.image.save()
- image_filename = unpackedfilename
- t.texture.image.filepath_raw=orig_image_filename
- else:
- image_filename = path_image(t.texture.image)
- # IMAGE SEQUENCE BEGINS
- if image_filename:
- if bpy.data.images[t.texture.image.name].source == 'SEQUENCE':
- korvaa = "." + str(bpy.data.textures[t.texture.name].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:
- 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.0 # UNUSED
- #textNormName=t.texture.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=t.texture.image.name + ".displ"
- #was the above used? --MR
- t_alpha = t
-
- ####################################################################################
-
-
- file.write("\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)
- file.write("\n #declare MAT_%s = \ntexture{\n" % currentMatName)
-
- ################################################################################
-
- if mater.pov.replacement_text != "":
- file.write("%s\n" % mater.pov.replacement_text)
- #################################################################################
- if mater.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.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")
- if texturesSpec and texturesSpec.startswith("PAT_"):
- tabWrite("function{f%s(x,y,z).grey}" %texturesSpec)
- else:
- # POV-Ray "scale" is not a number of repetitions factor, but its
- # inverse, a standard scale factor.
- # Offset seems needed relatively to scale so probably center of the
- # scale is not the same in blender and POV
- mappingSpec =imgMapTransforms(t_spec)
- # mappingSpec = "translate <%.4g,%.4g,%.4g> scale <%.4g,%.4g,%.4g>\n" % \
- # (-t_spec.offset.x, t_spec.offset.y, t_spec.offset.z,
- # 1.0 / t_spec.scale.x, 1.0 / t_spec.scale.y,
- # 1.0 / t_spec.scale.z)
- 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")
- if texturesAlpha and texturesAlpha.startswith("PAT_"):
- tabWrite("function{f%s(x,y,z).transmit}\n" %texturesAlpha)
- else:
- # POV-Ray "scale" is not a number of repetitions factor, but its
- # inverse, a standard scale factor.
- # Offset seems needed relatively to scale so probably center of the
- # scale is not the same in blender and POV
- mappingAlpha = imgMapTransforms(t_alpha)
- # mappingAlpha = " translate <%.4g, %.4g, %.4g> " \
- # "scale <%.4g, %.4g, %.4g>\n" % \
- # (-t_alpha.offset.x, -t_alpha.offset.y,
- # t_alpha.offset.z, 1.0 / t_alpha.scale.x,
- # 1.0 / t_alpha.scale.y, 1.0 / t_alpha.scale.z)
- 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)
- # mappingAlpha = " translate <%.4g,%.4g,%.4g> " \
- # "scale <%.4g,%.4g,%.4g>" % \
- # (-t_alpha.offset.x, -t_alpha.offset.y,
- # t_alpha.offset.z, 1.0 / t_alpha.scale.x,
- # 1.0 / t_alpha.scale.y, 1.0 / t_alpha.scale.z)
- tabWrite("pigment {\n")
- tabWrite("pigment_pattern {\n")
- if texturesAlpha and texturesAlpha.startswith("PAT_"):
- tabWrite("function{f%s(x,y,z).transmit}\n" %texturesAlpha)
- 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
- # POV-Ray "scale" is not a number of repetitions factor, but its
- # inverse, a standard scale factor.
- # Offset seems needed relatively to scale so probably center of the
- # scale is not the same in blender and POV
- mappingNor =imgMapTransforms(t_nor)
- # mappingNor = " translate <%.4g,%.4g,%.4g> scale <%.4g,%.4g,%.4g>" % \
- # (-t_nor.offset.x, -t_nor.offset.y, t_nor.offset.z,
- # 1.0 / t_nor.scale.x, 1.0 / t_nor.scale.y,
- # 1.0 / t_nor.scale.z)
- #imageMapNor = ("{bump_map {%s \"%s\" %s mapping}" % \
- # (imageFormat(texturesNorm),texturesNorm,imgMap(t_nor)))
- #We were not using the above maybe we should?
- if texturesNorm and texturesNorm.startswith("PAT_"):
- tabWrite("normal{function{f%s(x,y,z).grey} bump_size %.4g}\n" %(texturesNorm, t_nor.normal_factor * 10))
- 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 * 10, mappingNor))
- if texturesSpec != "":
- tabWrite("]\n")
- ##################Second index for mapping specular max value###############
- tabWrite("[1 \n")
-
- if texturesDif == "" and mater.pov.replacement_text == "":
- if texturesAlpha != "":
- # POV-Ray "scale" is not a number of repetitions factor, but its inverse,
- # a standard scale factor.
- # Offset seems needed relatively to scale so probably center of the scale
- # is not the same in blender and POV
- # Strange that the translation factor for scale is not the same as for
- # translate.
- # TODO: verify both matches with blender internal.
- mappingAlpha = imgMapTransforms(t_alpha)
- # mappingAlpha = " translate <%.4g,%.4g,%.4g> scale <%.4g,%.4g,%.4g>\n" % \
- # (-t_alpha.offset.x, -t_alpha.offset.y, t_alpha.offset.z,
- # 1.0 / t_alpha.scale.x, 1.0 / t_alpha.scale.y,
- # 1.0 / t_alpha.scale.z)
- if texturesAlpha and texturesAlpha.startswith("PAT_"):
- tabWrite("function{f%s(x,y,z).transmit}\n" %texturesAlpha)
- 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)))
-
- 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)
- # mappingDif = ("scale <%.4g,%.4g,%.4g> translate <%.4g,%.4g,%.4g>" % \
- # ( 1.0 / t_dif.scale.x,
- # 1.0 / t_dif.scale.y,
- # 1.0 / t_dif.scale.z,
- # 0.5-(0.5/t_dif.scale.x) + t_dif.offset.x,
- # 0.5-(0.5/t_dif.scale.y) + t_dif.offset.y,
- # 0.5-(0.5/t_dif.scale.z) + t_dif.offset.z))
- if texturesAlpha != "":
- # Strange that the translation factor for scale is not the same as for
- # translate.
- # TODO: verify both matches with blender internal.
- mappingAlpha = imgMapTransforms(t_alpha)
- # mappingAlpha = "translate <%.4g,%.4g,%.4g> scale <%.4g,%.4g,%.4g>" % \
- # (-t_alpha.offset.x, -t_alpha.offset.y, t_alpha.offset.z,
- # 1.0 / t_alpha.scale.x, 1.0 / t_alpha.scale.y,
- # 1.0 / t_alpha.scale.z)
- if texturesAlpha and texturesAlpha.startswith("PAT_"):
- tabWrite("pigment{pigment_pattern {function{f%s(x,y,z).transmit}}\n" %texturesAlpha)
- 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}]\n" %texturesAlpha)
- 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]\n" %texturesDif)
- tabWrite("}\n")
- tabWrite("}\n")
-
- else:
- if texturesDif and texturesDif.startswith("PAT_"):
- tabWrite("pigment{%s}\n" %texturesDif)
- 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)))
- #file.write("\n\t\t\tuv_mapping pigment %s} %s finish {%s}" % \
- # (imageMap, mapping, safety(material_finish)))
- #file.write("\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 == "":
- ## scale 1 rotate y*0
- # POV-Ray "scale" is not a number of repetitions factor, but its inverse,
- # a standard scale factor.
- # Offset seems needed relatively to scale so probably center of the scale is
- # not the same in blender and POV
- mappingNor =imgMapTransforms(t_nor)
- # mappingNor = (" translate <%.4g,%.4g,%.4g> scale <%.4g,%.4g,%.4g>" % \
- # (-t_nor.offset.x, -t_nor.offset.y, t_nor.offset.z,
- # 1.0 / t_nor.scale.x, 1.0 / t_nor.scale.y, 1.0 / t_nor.scale.z))
- #imageMapNor = ("{bump_map {%s \"%s\" %s mapping}" % \
- # (imageFormat(texturesNorm),texturesNorm,imgMap(t_nor)))
- #We were not using the above maybe we should?
- if texturesNorm and texturesNorm.startswith("PAT_"):
- tabWrite("normal{function{f%s(x,y,z).grey} bump_size %.4g}\n" %(texturesNorm, t_nor.normal_factor * 10))
- 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 * 10.0, mappingNor))
- if texturesSpec != "" and mater.pov.replacement_text == "":
- tabWrite("]\n")
-
- tabWrite("}\n")
-
- #End of slope/ior texture_map
- if mater.diffuse_shader == 'MINNAERT' and mater.pov.replacement_text == "":
- tabWrite("]\n")
- tabWrite("}\n")
- if mater.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.specular_color.s > 0.0):
- 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
- for t in mater.texture_slots:
- if(t and t.use and ((t.texture.type == 'IMAGE' and t.texture.image) or t.texture.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:
- file.write(" // colored highlights with a stransparent metallic layer\n")
- else:
- tabWrite("\n")
-
- tabWrite("texture {\n")
- tabWrite("pigment {rgbft<%.3g, %.3g, %.3g, 0, 1>}\n" % \
- (mater.specular_color[0], mater.specular_color[1], mater.specular_color[2]))
- tabWrite("finish {%s}\n" % (safety(material_finish, Level=2))) # Level 2 is translated spec
-
- texturesNorm = ""
- for t in mater.texture_slots:
-
- if t and t.texture.pov.tex_pattern_type != 'emulator':
- proceduralFlag=True
- image_filename = string_strip_hyphen(bpy.path.clean_name(t.texture.name))
- if (t and t.texture.type == 'IMAGE' and
- t.use and t.texture.image and
- t.texture.pov.tex_pattern_type == 'emulator'):
- proceduralFlag=False
- image_filename = path_image(t.texture.image)
- imgGamma = ""
- if image_filename:
- if t.use_map_normal:
- texturesNorm = image_filename
- # colvalue = t.normal_factor * 10.0 # UNUSED
- #textNormName=t.texture.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 * 10))
- 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 * 10,
- mappingNor))
-
- tabWrite("}\n") # THEN IT CAN CLOSE LAST LAYER OF TEXTURE
-
-
+ shading.writeTextureInfluence(mater, materialNames,
+ LocalMaterialNames,
+ path_image, imageFormat,
+ imgMap, imgMapTransforms,
+ file, tabWrite,
+ string_strip_hyphen,
+ safety, col)
###################################################################
index[0] = idx
- idx += 1
-
+ idx += 1
@@ -4068,7 +3098,7 @@ def write_pov(filename, scene=None, info_callback=None):
onceSss = 0
if world and onceAmbient:
- tabWrite("ambient_light rgbt<%.3g, %.3g, %.3g,1>\n" % world.ambient_color[:])
+ tabWrite("ambient_light rgb<%.3g, %.3g, %.3g>\n" % world.ambient_color[:])
onceAmbient = 0
if (oncePhotons and
@@ -4123,8 +3153,8 @@ def write_pov(filename, scene=None, info_callback=None):
#string_strip_hyphen(patternNames[texture.name]) #maybe instead of the above
LocalPatternNames.append(currentPatName)
#use above list to prevent writing texture instances several times and assign in mats?
- file.write("\n #declare PAT_%s = \n" % currentPatName)
- file.write(exportPattern(texture))
+ file.write("\n#declare PAT_%s = \n" % currentPatName)
+ file.write(shading.exportPattern(texture, string_strip_hyphen))
file.write("\n")
if comments:
file.write("\n//--Background--\n\n")
@@ -4159,10 +3189,11 @@ def write_pov(filename, scene=None, info_callback=None):
file.write("#default{ pigment{ color rgb 0.8 }}\n")
# Convert all materials to strings we can access directly per vertex.
#exportMaterials()
- shading.writeMaterial(DEF_MAT_NAME, scene, tabWrite, safety, comments, uniqueName, materialNames, None) # default material
+ shading.writeMaterial(using_uberpov, DEF_MAT_NAME, scene, tabWrite, safety, comments, uniqueName, materialNames, None) # default material
for material in bpy.data.materials:
if material.users > 0:
- shading.writeMaterial(DEF_MAT_NAME, scene, tabWrite, safety, comments, uniqueName, materialNames, material)
+ shading.writeMaterial(using_uberpov, DEF_MAT_NAME, scene, tabWrite, safety, comments, uniqueName, materialNames, material)
+ # attributes are all the variables needed by the other python file...
if comments:
file.write("\n")
@@ -4715,7 +3746,7 @@ class RenderPovTexturePreview(Operator):
filePov=open("%s"%inputPrevFile,"w")
PATname = "PAT_"+string_strip_hyphen(bpy.path.clean_name(tex.name))
filePov.write("#declare %s = \n"%PATname)
- filePov.write(exportPattern(tex))
+ filePov.write(shading.exportPattern(tex, string_strip_hyphen))
filePov.write("#declare Plane =\n")
filePov.write("mesh {\n")
diff --git a/render_povray/shading.py b/render_povray/shading.py
index d882bfec..1939cbe9 100644
--- a/render_povray/shading.py
+++ b/render_povray/shading.py
@@ -1,7 +1,7 @@
# For BI > POV shaders emulation
import bpy
-def writeMaterial(DEF_MAT_NAME, scene, tabWrite, safety, comments, uniqueName, materialNames, material):
+def writeMaterial(using_uberpov, DEF_MAT_NAME, scene, tabWrite, safety, comments, uniqueName, materialNames, material):
# Assumes only called once on each material
if material:
name_orig = material.name
@@ -23,25 +23,26 @@ def writeMaterial(DEF_MAT_NAME, scene, tabWrite, safety, comments, uniqueName, m
def povHasnoSpecularMaps(Level):
if Level == 1:
- tabWrite("#declare %s = finish {" % safety(name, Level=1))
if comments:
- file.write(" //No specular nor Mirror reflection\n")
+ tabWrite("//--No specular nor Mirror reflection--\n")
else:
tabWrite("\n")
+ tabWrite("#declare %s = finish {\n" % safety(name, Level=1))
+
elif Level == 2:
- tabWrite("#declare %s = finish {" % safety(name, Level=2))
if comments:
- file.write(" //translation of spec and mir levels for when no map " \
- "influences them\n")
+ tabWrite("//--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))
+
elif Level == 3:
- tabWrite("#declare %s = finish {" % safety(name, Level=3))
if comments:
- file.write(" //Maximum Spec and Mirror\n")
+ tabWrite("//--Maximum Spec and Mirror--\n")
else:
tabWrite("\n")
-
+ tabWrite("#declare %s = finish {\n" % safety(name, Level=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)
@@ -229,3 +230,985 @@ def writeMaterial(DEF_MAT_NAME, scene, tabWrite, safety, comments, uniqueName, m
# Level=3 Means Maximum Spec and Mirror
povHasnoSpecularMaps(Level=3)
+
+
+def exportPattern(texture, string_strip_hyphen):
+ 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 = tex.pov
+ colRampStrg="color_map {\n"
+ numColor=0
+ for el in tex.color_ramp.elements:
+ numColor+=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 pat.tex_pattern_type == 'emulator':
+ texStrg+="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)
+ 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"
+ ####################### EMULATE BLENDER CLOUDS TEXTURE ####################
+ if tex.type == 'CLOUDS':
+ if tex.noise_type == 'SOFT_NOISE':
+ texStrg+="wrinkles\n"
+ texStrg+="scale 0.25\n"
+ else:
+ texStrg+="granite\n"
+ if tex.use_color_ramp == True:
+ texStrg+=exportColorRamp(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"
+ ####################### 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)
+ 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"
+ ####################### 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)
+ 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"
+ else:
+ if tex.use_color_ramp == True:
+ texStrg+=exportColorRamp(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"
+ ####################### EMULATE BLENDER MAGIC TEXTURE ####################
+ if tex.type == 'MAGIC':
+ texStrg+="leopard\n"
+ if tex.use_color_ramp == True:
+ texStrg+=exportColorRamp(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"
+ ####################### 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)
+ 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"
+ 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"
+ ####################### 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"
+ 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)
+ 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"
+ ####################### 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"
+ # simplified for now:
+
+ if tex.type == 'MUSGRAVE':
+ texStrg+="bozo scale 0.25 \n"
+ if tex.use_color_ramp == True:
+ texStrg+=exportColorRamp(tex)
+ else:
+ texStrg+="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)
+ 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)
+ 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)
+ 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)
+ 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"
+ else:
+ texStrg+=" [1 wrinkles scale 0.25\n"
+ if tex.use_color_ramp == True:
+ texStrg+=exportColorRamp(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"
+ ####################### 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)
+ else:
+ texStrg+="color_map {\n"
+ texStrg+="[0.75 color rgb<0,0,0,>]\n"
+ texStrg+="[1 color rgb<1,1,1,>]\n"
+ texStrg+="}\n"
+
+ ####################### IGNORE OTHER BLENDER TEXTURE ####################
+ else: #non translated textures
+ pass
+ texStrg+="}\n\n"
+
+ texStrg+="#declare f%s=\n"%PATname
+ texStrg+="function{pigment{%s}}\n"%PATname
+ texStrg+="\n"
+
+ else:
+ 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"
+ 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_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_z != "NONE":
+ if pat.func_plus_z =='increase':
+ texStrg+="*"
+ if pat.func_plus_z =='plus':
+ texStrg+="+"
+ texStrg+="%.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"}:
+ sort = 0
+ 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"}:
+ 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"}:
+ 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"}:
+ 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"}:
+ sort = 5
+ 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
+ if sort > 0:
+ texStrg+=",%.4g"%pat.func_P1
+ if sort > 1:
+ texStrg+=",%.4g"%pat.func_P2
+ if sort > 2:
+ texStrg+=",%.4g"%pat.func_P3
+ if sort > 3:
+ texStrg+=",%.4g"%pat.func_P4
+ if sort > 4:
+ texStrg+=",%.4g"%pat.func_P5
+ if sort > 5:
+ texStrg+=",%.4g"%pat.func_P6
+ if sort > 6:
+ texStrg+=",%.4g"%pat.func_P7
+ texStrg+=",%.4g"%pat.func_P8
+ texStrg+=",%.4g"%pat.func_P9
+ texStrg+=")}\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:
+ for el in tex.color_ramp.elements:
+ numColor+=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)
+ 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(mater, materialNames, LocalMaterialNames, path_image,
+ imageFormat, imgMap, imgMapTransforms, file,
+ tabWrite, string_strip_hyphen, safety, col):
+ material_finish = materialNames[mater.name]
+ if mater.use_transparency:
+ trans = 1.0 - mater.alpha
+ else:
+ trans = 0.0
+ if (mater.specular_color.s == 0.0):
+ colored_specular_found = False
+ else:
+ colored_specular_found = True
+
+ if mater.use_transparency and mater.transparency_method == 'RAYTRACE':
+ povFilter = mater.raytrace_transparency.filter * (1.0 - mater.alpha)
+ trans = (1.0 - mater.alpha) - povFilter
+ else:
+ povFilter = 0.0
+
+ ##############SF
+ texturesDif = ""
+ texturesSpec = ""
+ texturesNorm = ""
+ texturesAlpha = ""
+ #proceduralFlag=False
+ for t in mater.texture_slots:
+ if t and t.use and t.texture.type != 'IMAGE' and t.texture.type != 'NONE':
+ proceduralFlag=True
+ image_filename = "PAT_%s"%string_strip_hyphen(bpy.path.clean_name(t.texture.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.0 # UNUSED
+ #textNormName=t.texture.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=t.texture.image.name + ".displ"
+ #was the above used? --MR
+ t_alpha = t
+
+ if t and t.texture.type == 'IMAGE' and t.use and t.texture.image and t.texture.pov.tex_pattern_type == 'emulator':
+ proceduralFlag=False
+ if t.texture.image.packed_file:
+ orig_image_filename=t.texture.image.filepath_raw
+ unpackedfilename= os.path.join(preview_dir,("unpacked_img_"+(string_strip_hyphen(bpy.path.clean_name(t.texture.name)))))
+ if not os.path.exists(unpackedfilename):
+ # record which images that were newly copied and can be safely
+ # cleaned up
+ unpacked_images.append(unpackedfilename)
+ t.texture.image.filepath_raw=unpackedfilename
+ t.texture.image.save()
+ image_filename = unpackedfilename
+ t.texture.image.filepath_raw=orig_image_filename
+ else:
+ image_filename = path_image(t.texture.image)
+ # IMAGE SEQUENCE BEGINS
+ if image_filename:
+ if bpy.data.images[t.texture.image.name].source == 'SEQUENCE':
+ korvaa = "." + str(bpy.data.textures[t.texture.name].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:
+ 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.0 # UNUSED
+ #textNormName=t.texture.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=t.texture.image.name + ".displ"
+ #was the above used? --MR
+ t_alpha = t
+
+ ####################################################################################
+
+
+ file.write("\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)
+ file.write("\n#declare MAT_%s = \ntexture{\n" % currentMatName)
+
+ ################################################################################
+
+ if mater.pov.replacement_text != "":
+ file.write("%s\n" % mater.pov.replacement_text)
+ #################################################################################
+ if mater.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.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")
+ if texturesSpec and texturesSpec.startswith("PAT_"):
+ tabWrite("function{f%s(x,y,z).grey}" %texturesSpec)
+ else:
+ # POV-Ray "scale" is not a number of repetitions factor, but its
+ # inverse, a standard scale factor.
+ # Offset seems needed relatively to scale so probably center of the
+ # scale is not the same in blender and POV
+ mappingSpec =imgMapTransforms(t_spec)
+ # mappingSpec = "translate <%.4g,%.4g,%.4g> scale <%.4g,%.4g,%.4g>\n" % \
+ # (-t_spec.offset.x, t_spec.offset.y, t_spec.offset.z,
+ # 1.0 / t_spec.scale.x, 1.0 / t_spec.scale.y,
+ # 1.0 / t_spec.scale.z)
+ 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")
+ if texturesAlpha and texturesAlpha.startswith("PAT_"):
+ tabWrite("function{f%s(x,y,z).transmit}\n" %texturesAlpha)
+ else:
+ # POV-Ray "scale" is not a number of repetitions factor, but its
+ # inverse, a standard scale factor.
+ # Offset seems needed relatively to scale so probably center of the
+ # scale is not the same in blender and POV
+ mappingAlpha = imgMapTransforms(t_alpha)
+ # mappingAlpha = " translate <%.4g, %.4g, %.4g> " \
+ # "scale <%.4g, %.4g, %.4g>\n" % \
+ # (-t_alpha.offset.x, -t_alpha.offset.y,
+ # t_alpha.offset.z, 1.0 / t_alpha.scale.x,
+ # 1.0 / t_alpha.scale.y, 1.0 / t_alpha.scale.z)
+ 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)
+ # mappingAlpha = " translate <%.4g,%.4g,%.4g> " \
+ # "scale <%.4g,%.4g,%.4g>" % \
+ # (-t_alpha.offset.x, -t_alpha.offset.y,
+ # t_alpha.offset.z, 1.0 / t_alpha.scale.x,
+ # 1.0 / t_alpha.scale.y, 1.0 / t_alpha.scale.z)
+ tabWrite("pigment {\n")
+ tabWrite("pigment_pattern {\n")
+ if texturesAlpha and texturesAlpha.startswith("PAT_"):
+ tabWrite("function{f%s(x,y,z).transmit}\n" %texturesAlpha)
+ 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
+ # POV-Ray "scale" is not a number of repetitions factor, but its
+ # inverse, a standard scale factor.
+ # Offset seems needed relatively to scale so probably center of the
+ # scale is not the same in blender and POV
+ mappingNor =imgMapTransforms(t_nor)
+ # mappingNor = " translate <%.4g,%.4g,%.4g> scale <%.4g,%.4g,%.4g>" % \
+ # (-t_nor.offset.x, -t_nor.offset.y, t_nor.offset.z,
+ # 1.0 / t_nor.scale.x, 1.0 / t_nor.scale.y,
+ # 1.0 / t_nor.scale.z)
+ #imageMapNor = ("{bump_map {%s \"%s\" %s mapping}" % \
+ # (imageFormat(texturesNorm),texturesNorm,imgMap(t_nor)))
+ #We were not using the above maybe we should?
+ if texturesNorm and texturesNorm.startswith("PAT_"):
+ tabWrite("normal{function{f%s(x,y,z).grey} bump_size %.4g}\n" %(texturesNorm, t_nor.normal_factor * 10))
+ 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 * 10, mappingNor))
+ if texturesSpec != "":
+ tabWrite("]\n")
+ ##################Second index for mapping specular max value###############
+ tabWrite("[1 \n")
+
+ if texturesDif == "" and mater.pov.replacement_text == "":
+ if texturesAlpha != "":
+ # POV-Ray "scale" is not a number of repetitions factor, but its inverse,
+ # a standard scale factor.
+ # Offset seems needed relatively to scale so probably center of the scale
+ # is not the same in blender and POV
+ # Strange that the translation factor for scale is not the same as for
+ # translate.
+ # TODO: verify both matches with blender internal.
+ mappingAlpha = imgMapTransforms(t_alpha)
+ # mappingAlpha = " translate <%.4g,%.4g,%.4g> scale <%.4g,%.4g,%.4g>\n" % \
+ # (-t_alpha.offset.x, -t_alpha.offset.y, t_alpha.offset.z,
+ # 1.0 / t_alpha.scale.x, 1.0 / t_alpha.scale.y,
+ # 1.0 / t_alpha.scale.z)
+ if texturesAlpha and texturesAlpha.startswith("PAT_"):
+ tabWrite("function{f%s(x,y,z).transmit}\n" %texturesAlpha)
+ 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)))
+
+ 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)
+ # mappingDif = ("scale <%.4g,%.4g,%.4g> translate <%.4g,%.4g,%.4g>" % \
+ # ( 1.0 / t_dif.scale.x,
+ # 1.0 / t_dif.scale.y,
+ # 1.0 / t_dif.scale.z,
+ # 0.5-(0.5/t_dif.scale.x) + t_dif.offset.x,
+ # 0.5-(0.5/t_dif.scale.y) + t_dif.offset.y,
+ # 0.5-(0.5/t_dif.scale.z) + t_dif.offset.z))
+ if texturesAlpha != "":
+ # Strange that the translation factor for scale is not the same as for
+ # translate.
+ # TODO: verify both matches with blender internal.
+ mappingAlpha = imgMapTransforms(t_alpha)
+ # mappingAlpha = "translate <%.4g,%.4g,%.4g> scale <%.4g,%.4g,%.4g>" % \
+ # (-t_alpha.offset.x, -t_alpha.offset.y, t_alpha.offset.z,
+ # 1.0 / t_alpha.scale.x, 1.0 / t_alpha.scale.y,
+ # 1.0 / t_alpha.scale.z)
+ if texturesAlpha and texturesAlpha.startswith("PAT_"):
+ tabWrite("pigment{pigment_pattern {function{f%s(x,y,z).transmit}}\n" %texturesAlpha)
+ 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}]\n" %texturesAlpha)
+ 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]\n" %texturesDif)
+ tabWrite("}\n")
+ tabWrite("}\n")
+
+ else:
+ if texturesDif and texturesDif.startswith("PAT_"):
+ tabWrite("pigment{%s}\n" %texturesDif)
+ 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)))
+ #file.write("\n\t\t\tuv_mapping pigment %s} %s finish {%s}" % \
+ # (imageMap, mapping, safety(material_finish)))
+ #file.write("\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 == "":
+ ## scale 1 rotate y*0
+ # POV-Ray "scale" is not a number of repetitions factor, but its inverse,
+ # a standard scale factor.
+ # Offset seems needed relatively to scale so probably center of the scale is
+ # not the same in blender and POV
+ mappingNor =imgMapTransforms(t_nor)
+ # mappingNor = (" translate <%.4g,%.4g,%.4g> scale <%.4g,%.4g,%.4g>" % \
+ # (-t_nor.offset.x, -t_nor.offset.y, t_nor.offset.z,
+ # 1.0 / t_nor.scale.x, 1.0 / t_nor.scale.y, 1.0 / t_nor.scale.z))
+ #imageMapNor = ("{bump_map {%s \"%s\" %s mapping}" % \
+ # (imageFormat(texturesNorm),texturesNorm,imgMap(t_nor)))
+ #We were not using the above maybe we should?
+ if texturesNorm and texturesNorm.startswith("PAT_"):
+ tabWrite("normal{function{f%s(x,y,z).grey} bump_size %.4g}\n" %(texturesNorm, t_nor.normal_factor * 10))
+ 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 * 10.0, mappingNor))
+ if texturesSpec != "" and mater.pov.replacement_text == "":
+ tabWrite("]\n")
+
+ tabWrite("}\n")
+
+ #End of slope/ior texture_map
+ if mater.diffuse_shader == 'MINNAERT' and mater.pov.replacement_text == "":
+ tabWrite("]\n")
+ tabWrite("}\n")
+ if mater.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.specular_color.s > 0.0):
+ 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
+ for t in mater.texture_slots:
+ if(t and t.use and ((t.texture.type == 'IMAGE' and t.texture.image) or t.texture.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:
+ file.write(" // colored highlights with a stransparent metallic layer\n")
+ else:
+ tabWrite("\n")
+
+ tabWrite("texture {\n")
+ tabWrite("pigment {rgbft<%.3g, %.3g, %.3g, 0, 1>}\n" % \
+ (mater.specular_color[0], mater.specular_color[1], mater.specular_color[2]))
+ tabWrite("finish {%s}\n" % (safety(material_finish, Level=2))) # Level 2 is translated spec
+
+ texturesNorm = ""
+ for t in mater.texture_slots:
+
+ if t and t.texture.pov.tex_pattern_type != 'emulator':
+ proceduralFlag=True
+ image_filename = string_strip_hyphen(bpy.path.clean_name(t.texture.name))
+ if (t and t.texture.type == 'IMAGE' and
+ t.use and t.texture.image and
+ t.texture.pov.tex_pattern_type == 'emulator'):
+ proceduralFlag=False
+ image_filename = path_image(t.texture.image)
+ imgGamma = ""
+ if image_filename:
+ if t.use_map_normal:
+ texturesNorm = image_filename
+ # colvalue = t.normal_factor * 10.0 # UNUSED
+ #textNormName=t.texture.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 * 10))
+ 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 * 10,
+ mappingNor))
+
+ tabWrite("}\n") # THEN IT CAN CLOSE LAST LAYER OF TEXTURE