diff options
-rw-r--r-- | render_povray/render.py | 1003 | ||||
-rw-r--r-- | render_povray/shading.py | 1001 |
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 |