Skip to content
Snippets Groups Projects
render.py 104 KiB
Newer Older
  • Learn to ignore specific revisions
  • Luca Bonavita's avatar
    Luca Bonavita committed
                        material_index = f.material_index
                        material = me_materials[material_index]
    
    
                        if material and material.use_vertex_color_paint:
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
                            col = vcol_layer[fi]
    
                            if len(faces_verts[fi]) == 4:
                                cols = col.color1, col.color2, col.color3, col.color4
                            else:
                                cols = col.color1, col.color2, col.color3
    
                            for col in cols:
    
                                key = col[0], col[1], col[2], material_index  # Material index!
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                                vertCols[key] = [-1]
    
                        else:
                            if material:
    
                                diffuse_color = material.diffuse_color[:]
    
                                key = diffuse_color[0], diffuse_color[1], diffuse_color[2], \
                                      material_index
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                                vertCols[key] = [-1]
    
                else:
                    # No vertex colours, so write material colours as vertex colours
                    for i, material in enumerate(me_materials):
    
                        if material:
    
                            diffuse_color = material.diffuse_color[:]
    
                            key = diffuse_color[0], diffuse_color[1], diffuse_color[2], i  # i == f.mat
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                            vertCols[key] = [-1]
    
                # Vert Colours
    
                file.write(tabStr + "%s" % (len(vertCols)))  # vert count
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                idx = 0
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                for col, index in vertCols.items():
                    if me_materials:
                        material = me_materials[col[3]]
                        material_finish = materialNames[material.name]
    
    
                        if material.use_transparency:
                            trans = 1.0 - material.alpha
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                        else:
                            trans = 0.0
    
    
                        if material.use_transparency and material.transparency_method == 'RAYTRACE':
                            povFilter = material.raytrace_transparency.filter * (1.0 - material.alpha)
                            trans = (1.0 - material.alpha) - povFilter
                        else:
                            povFilter = 0.0
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                    else:
    
                        material_finish = DEF_MAT_NAME  # not working properly,
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                        trans = 0.0
    
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
                    ##############SF
    
                    texturesDif = ""
                    texturesSpec = ""
                    texturesNorm = ""
                    texturesAlpha = ""
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
                    for t in material.texture_slots:
    
                        if t and t.texture.type == 'IMAGE' and t.use and t.texture.image:
    
                            image_filename = path_image(t.texture.image.filepath)
    
                                if t.use_map_color_diffuse:
    
                                    texturesDif = image_filename
                                    colvalue = t.default_value
                                    t_dif = t
    
                                    if t_dif.texture.pov.tex_gamma_enable:
                                        imgGamma = (" gamma %.3g " % t_dif.texture.pov.tex_gamma_value)
    
                                if t.use_map_specular or t.use_map_raymir:
    
                                    texturesSpec = image_filename
                                    colvalue = t.default_value
                                    t_spec = t
    
                                if t.use_map_normal:
    
                                    texturesNorm = image_filename
                                    colvalue = t.normal_factor * 10.0
    
                                    #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
    
                                    #textDispName=t.texture.image.name + ".displ"
    
                                    #was the above used? --MR
                                    t_alpha = t
    
                    ####################################################################################
    
                        file.write(" texture{%s}\n" % material.pov.replacement_text)
    
                        # THIS AREA NEEDS TO LEAVE THE TEXTURE OPEN UNTIL ALL MAPS ARE WRITTEN DOWN.
                        # --MR
                        tabWrite("texture {\n")
    
                        ################################################################################
    
                        if material.diffuse_shader == 'MINNAERT':
                            tabWrite("\n")
                            tabWrite("aoi\n")
                            tabWrite("texture_map {\n")
    
                            tabWrite("[%.3g finish {diffuse %.3g}]\n" % \
                                     (material.darkness / 2.0, 2.0 - material.darkness))
    
                            tabWrite("[%.3g\n" % (1.0 - (material.darkness / 2.0)))
    
                        if material.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 - material.diffuse_fresnel) / 5,
    
                                           ((5.0 - material.diffuse_fresnel_factor) / 5))))
                                tabWrite("[%.3g\n" % ((material.diffuse_fresnel_factor / 5) *
                                                      (material.diffuse_fresnel / 5.0)))
    
                        # 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")
    
                                # 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 = "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)))
    
                            if texturesDif == "":
                                if texturesAlpha != "":
                                    tabWrite("\n")
    
                                    # 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 = " 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("pigment {rgbft<%.3g, %.3g, %.3g, %.3g, %.3g>}\n" % \
                                             (col[0], col[1], col[2], povFilter, trans))
    
                                    # Level 1 is no specular
                                    tabWrite("finish {%s}\n" % (safety(material_finish, Level=1)))
    
                                    # Level 2 is translated spec
                                    tabWrite("finish {%s}\n" % (safety(material_finish, Level=2)))
    
                                # 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
                                mappingDif = ("translate <%.4g,%.4g,%.4g> scale <%.4g,%.4g,%.4g>" % \
                                              (-t_dif.offset.x, -t_dif.offset.y, t_dif.offset.z,
                                               1.0 / t_dif.scale.x, 1.0 / t_dif.scale.y,
                                               1.0 / t_dif.scale.z))
    
                                    # 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 = " 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")
    
                                    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")
    
                                    tabWrite("[1 uv_mapping image_map {%s \"%s\" %s} %s]\n" % \
                                             (imageFormat(texturesDif), texturesDif,
                                              (imgGamma + imgMap(t_dif)), mappingDif))
    
                                    tabWrite("pigment {uv_mapping image_map {%s \"%s\" %s}%s}\n" % \
                                             (imageFormat(texturesDif), texturesDif,
                                              (imgGamma + imgMap(t_dif)), mappingDif))
    
                                    # Level 1 is no specular
                                    tabWrite("finish {%s}\n" % (safety(material_finish, Level=1)))
    
                                    # Level 2 is translated specular
                                    tabWrite("finish {%s}\n" % (safety(material_finish, Level=2)))
    
                                #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)))
    
                                # 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 = " 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)))
    
                                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 != "":
    
                            ##################Second index for mapping specular max value###############
    
                    if texturesDif == "" and material.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 = " 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}\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("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)))
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
                        else:
    
                            # Level 2 is translated specular
                            tabWrite("finish {%s}\n" % (safety(material_finish, Level=2)))
    
                    elif material.pov.replacement_text == "":
                        # 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.
                        mappingDif = ("translate <%.4g,%.4g,%.4g> scale <%.4g,%.4g,%.4g>" % \
                                      (-t_dif.offset.x, -t_dif.offset.y, t_dif.offset.z,
                                       1.0 / t_dif.scale.x, 1.0 / t_dif.scale.y, 1.0 / t_dif.scale.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 = "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 {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 uv_mapping image_map {%s \"%s\" %s} %s]\n" % \
                                     (imageFormat(texturesDif), texturesDif,
                                      (imgMap(t_dif) + imgGamma), mappingDif))
    
                            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)))
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
                        else:
    
                            # Level 2 is translated specular
                            tabWrite("finish {%s}\n" % (safety(material_finish, Level=2)))
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
    
                        ## 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 material.pov.replacement_text == "":
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
                        ## 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 = (" 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)))
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
                        #We were not using the above maybe we should?
    
                        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 material.pov.replacement_text == "":
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
    
                    #End of slope/ior texture_map
    
                    if material.diffuse_shader == 'MINNAERT' and material.pov.replacement_text == "":
    
                        tabWrite("]\n")
                        tabWrite("}\n")
    
                    if material.diffuse_shader == 'FRESNEL' and material.pov.replacement_text == "":
    
                        c = 1
                        while (c <= lampCount):
                            tabWrite("]\n")
                            tabWrite("}\n")
                            c += 1
    
                    ####################################################################################
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                    index[0] = idx
                    idx += 1
    
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
                tabWrite("face_indices {\n")
                tabWrite("%d" % (len(me_faces) + quadCount))  # faces count
    
                for fi, f in enumerate(me_faces):
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                    fv = faces_verts[fi]
                    material_index = f.material_index
                    if len(fv) == 4:
    
                        indices = (0, 1, 2), (0, 2, 3)
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                    else:
    
                        indices = ((0, 1, 2),)
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
                    if vcol_layer:
                        col = vcol_layer[fi]
    
                        if len(fv) == 4:
                            cols = col.color1, col.color2, col.color3, col.color4
                        else:
                            cols = col.color1, col.color2, col.color3
    
    
                    if not me_materials or me_materials[material_index] is None:  # No materials
    
                        for i1, i2, i3 in indices:
    
                            if not scene.pov.tempfiles_enable and scene.pov.list_lf_enable:
    
                                file.write(",\n")
    
                                # vert count
                                file.write(tabStr + "<%d,%d,%d>" % (fv[i1], fv[i2], fv[i3]))
    
                            else:
                                file.write(", ")
                                file.write("<%d,%d,%d>" % (fv[i1], fv[i2], fv[i3]))  # vert count
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                    else:
                        material = me_materials[material_index]
    
                        for i1, i2, i3 in indices:
    
                            if me.vertex_colors and material.use_vertex_color_paint:
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                                # Colour per vertex - vertex colour
    
                                col1 = cols[i1]
                                col2 = cols[i2]
                                col3 = cols[i3]
    
                                ci1 = vertCols[col1[0], col1[1], col1[2], material_index][0]
                                ci2 = vertCols[col2[0], col2[1], col2[2], material_index][0]
                                ci3 = vertCols[col3[0], col3[1], col3[2], material_index][0]
                            else:
                                # Colour per material - flat material colour
                                diffuse_color = material.diffuse_color
    
                                ci1 = ci2 = ci3 = vertCols[diffuse_color[0], diffuse_color[1], \
                                                  diffuse_color[2], f.material_index][0]
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
                            if not scene.pov.tempfiles_enable and scene.pov.list_lf_enable:
    
                                file.write(",\n")
    
                                file.write(tabStr + "<%d,%d,%d>, %d,%d,%d" % \
                                           (fv[i1], fv[i2], fv[i3], ci1, ci2, ci3))  # vert count
    
                            else:
                                file.write(", ")
    
                                file.write("<%d,%d,%d>, %d,%d,%d" % \
                                           (fv[i1], fv[i2], fv[i3], ci1, ci2, ci3))  # vert count
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
                # normal_indices indices
    
                tabWrite("normal_indices {\n")
                tabWrite("%d" % (len(me_faces) + quadCount))  # faces count
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                for fi, fv in enumerate(faces_verts):
    
                    if len(fv) == 4:
    
                        indices = (0, 1, 2), (0, 2, 3)
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                    else:
    
                        indices = ((0, 1, 2),)
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
                    for i1, i2, i3 in indices:
    
                        if me_faces[fi].use_smooth:
    
                            if not scene.pov.tempfiles_enable and scene.pov.list_lf_enable:
    
                                file.write(",\n")
                                file.write(tabStr + "<%d,%d,%d>" %\
                                (uniqueNormals[verts_normals[fv[i1]]][0],\
                                 uniqueNormals[verts_normals[fv[i2]]][0],\
                                 uniqueNormals[verts_normals[fv[i3]]][0]))  # vert count
                            else:
                                file.write(", ")
                                file.write("<%d,%d,%d>" %\
                                (uniqueNormals[verts_normals[fv[i1]]][0],\
                                 uniqueNormals[verts_normals[fv[i2]]][0],\
                                 uniqueNormals[verts_normals[fv[i3]]][0]))  # vert count
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                        else:
                            idx = uniqueNormals[faces_normals[fi]][0]
    
                            if not scene.pov.tempfiles_enable and scene.pov.list_lf_enable:
    
                                file.write(",\n")
                                file.write(tabStr + "<%d,%d,%d>" % (idx, idx, idx))  # vert count
                            else:
                                file.write(", ")
                                file.write("<%d,%d,%d>" % (idx, idx, idx))  # vert count
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
                if uv_layer:
    
                    tabWrite("uv_indices {\n")
                    tabWrite("%d" % (len(me_faces) + quadCount))  # faces count
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                    for fi, fv in enumerate(faces_verts):
    
                        if len(fv) == 4:
    
                            indices = (0, 1, 2), (0, 2, 3)
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                        else:
    
                            indices = ((0, 1, 2),)
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
                        uv = uv_layer[fi]
                        if len(faces_verts[fi]) == 4:
    
                            uvs = uv.uv1[:], uv.uv2[:], uv.uv3[:], uv.uv4[:]
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                        else:
    
                            uvs = uv.uv1[:], uv.uv2[:], uv.uv3[:]
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
                        for i1, i2, i3 in indices:
    
                            if not scene.pov.tempfiles_enable and scene.pov.list_lf_enable:
    
                                file.write(",\n")
                                file.write(tabStr + "<%d,%d,%d>" % (
                                         uniqueUVs[uvs[i1]][0],\
                                         uniqueUVs[uvs[i2]][0],\
                                         uniqueUVs[uvs[i3]][0]))
                            else:
                                file.write(", ")
                                file.write("<%d,%d,%d>" % (
                                         uniqueUVs[uvs[i1]][0],\
                                         uniqueUVs[uvs[i2]][0],\
                                         uniqueUVs[uvs[i3]][0]))
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
                if me.materials:
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
                    try:
    
                        material = me.materials[0]  # dodgy
    
                        writeObjectMaterial(material, ob)
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
                    except IndexError:
                        print(me)
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
                #Importance for radiosity sampling added here:
    
                tabWrite("radiosity { \n")
                tabWrite("importance %3g \n" % importance)
                tabWrite("}\n")
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
    
    
                tabWrite("}\n")  # End of mesh block
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
                bpy.data.meshes.remove(me)
    
    
            for data_name, inst in data_ref.items():
                for ob_name, matrix_str in inst:
                    tabWrite("//----Blender Object Name:%s----\n" % ob_name)
                    tabWrite("object { \n")
                    tabWrite("%s\n" % data_name)
                    tabWrite("%s\n" % matrix_str)
                    tabWrite("}\n")
    
    
    Luca Bonavita's avatar
    Luca Bonavita committed
        def exportWorld(world):
    
            render = scene.render
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            camera = scene.camera
    
            matrix = global_matrix * camera.matrix_world
    
    Luca Bonavita's avatar
    Luca Bonavita committed
            if not world:
                return
    
            #############Maurice####################################
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            #These lines added to get sky gradient (visible with PNG output)
            if world:
                #For simple flat background:
                if not world.use_sky_blend:
    
                    # Non fully transparent background could premultiply alpha and avoid anti-aliasing
                    # display issue:
    
    Maurice Raybaud's avatar
     
    Maurice Raybaud committed
                    if render.alpha_mode == 'PREMUL':
    
                        tabWrite("background {rgbt<%.3g, %.3g, %.3g, 0.75>}\n" % \
                                 (world.horizon_color[:]))
    
                    #Currently using no alpha with Sky option:
                    elif render.alpha_mode == 'SKY':
    
                        tabWrite("background {rgbt<%.3g, %.3g, %.3g, 0>}\n" % (world.horizon_color[:]))
    
                        tabWrite("background {rgbt<%.3g, %.3g, %.3g, 1>}\n" % (world.horizon_color[:]))
    
                worldTexCount = 0
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
                #For Background image textures
    
                for t in world.texture_slots:  # risk to write several sky_spheres but maybe ok.
    
                    if t and t.texture.type is not None:
    
                        worldTexCount += 1
    
                    # XXX No enable checkbox for world textures yet (report it?)
                    #if t and t.texture.type == 'IMAGE' and t.use:
                    if t and t.texture.type == 'IMAGE':
    
                        image_filename = path_image(t.texture.image.filepath)
                        if t.texture.image.filepath != image_filename:
                            t.texture.image.filepath = image_filename
    
                        if image_filename != "" and t.use_map_blend:
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
                            texturesBlend = image_filename
                            #colvalue = t.default_value
                            t_blend = t
    
                        # Commented below was an idea to make the Background image oriented as camera
                        # taken here:
    #http://news.povray.org/povray.newusers/thread/%3Cweb.4a5cddf4e9c9822ba2f93e20@news.povray.org%3E/
                        # Replace 4/3 by the ratio of each image found by some custom or existing
                        # function
                        #mappingBlend = (" translate <%.4g,%.4g,%.4g> rotate z*degrees" \
                        #                "(atan((camLocation - camLookAt).x/(camLocation - " \
                        #                "camLookAt).y)) rotate x*degrees(atan((camLocation - " \
                        #                "camLookAt).y/(camLocation - camLookAt).z)) rotate y*" \
                        #                "degrees(atan((camLocation - camLookAt).z/(camLocation - " \
                        #                "camLookAt).x)) scale <%.4g,%.4g,%.4g>b" % \
                        #                (t_blend.offset.x / 10 , t_blend.offset.y / 10 ,
                        #                 t_blend.offset.z / 10, t_blend.scale.x ,
                        #                 t_blend.scale.y , t_blend.scale.z))
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
                        #using camera rotation valuesdirectly from blender seems much easier
    
                        if t_blend.texture_coords == 'ANGMAP':
                            mappingBlend = ""
    
                            mappingBlend = " translate <%.4g-0.5,%.4g-0.5,%.4g-0.5> rotate<0,0,0>  " \
                                           "scale <%.4g,%.4g,%.4g>" % \
                                           (t_blend.offset.x / 10.0, t_blend.offset.y / 10.0,
                                            t_blend.offset.z / 10.0, t_blend.scale.x * 0.85,
                                            t_blend.scale.y * 0.85, t_blend.scale.z * 0.85)
    
                            # The initial position and rotation of the pov camera is probably creating
                            # the rotation offset should look into it someday but at least background
                            # won't rotate with the camera now.
                        # Putting the map on a plane would not introduce the skysphere distortion and
                        # allow for better image scale matching but also some waay to chose depth and
                        # size of the plane relative to camera.
    
                        tabWrite("sky_sphere {\n")
                        tabWrite("pigment {\n")
    
                        tabWrite("image_map{%s \"%s\" %s}\n" % \
                                 (imageFormat(texturesBlend), texturesBlend, imgMapBG(t_blend)))
    
                        tabWrite("}\n")
                        tabWrite("%s\n" % (mappingBlend))
    
                        # The following layered pigment opacifies to black over the texture for
                        # transmit below 1 or otherwise adds to itself
    
                        tabWrite("pigment {rgb 0 transmit %s}\n" % (t.texture.intensity))
    
                        tabWrite("}\n")
                        #tabWrite("scale 2\n")
                        #tabWrite("translate -1\n")
    
    
                #For only Background gradient
    
                if worldTexCount == 0:
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
                    if world.use_sky_blend:
    
                        tabWrite("sky_sphere {\n")
                        tabWrite("pigment {\n")
    
                        # maybe Should follow the advice of POV doc about replacing gradient
                        # for skysphere..5.5
                        tabWrite("gradient y\n")
    
                        if render.alpha_mode == 'STRAIGHT':
    
                            tabWrite("[0.0 rgbt<%.3g, %.3g, %.3g, 1>]\n" % (world.horizon_color[:]))
                            tabWrite("[1.0 rgbt<%.3g, %.3g, %.3g, 1>]\n" % (world.zenith_color[:]))
    
                        elif render.alpha_mode == 'PREMUL':
    
                            tabWrite("[0.0 rgbt<%.3g, %.3g, %.3g, 0.99>]\n" % (world.horizon_color[:]))
    
                            # aa premult not solved with transmit 1
                            tabWrite("[1.0 rgbt<%.3g, %.3g, %.3g, 0.99>]\n" % (world.zenith_color[:]))
    
                            tabWrite("[0.0 rgbt<%.3g, %.3g, %.3g, 0>]\n" % (world.horizon_color[:]))
                            tabWrite("[1.0 rgbt<%.3g, %.3g, %.3g, 0>]\n" % (world.zenith_color[:]))
                        tabWrite("}\n")
                        tabWrite("}\n")
                        tabWrite("}\n")
    
                        # Sky_sphere alpha (transmit) is not translating into image alpha the same
                        # way as 'background'
    
                #if world.light_settings.use_indirect_light:
    
                # Maybe change the above to a funtion copyInternalRenderer settings when
                # user pushes a button, then:
                #scene.pov.radio_enable = world.light_settings.use_indirect_light
                # and other such translations but maybe this would not be allowed either?
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
    
            ###############################################################
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
    Campbell Barton's avatar
    Campbell Barton committed
            mist = world.mist_settings
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
            if mist.use_mist:
    
                tabWrite("fog {\n")
                tabWrite("distance %.6f\n" % mist.depth)
    
                tabWrite("color rgbt<%.3g, %.3g, %.3g, %.3g>\n" % \
                         (world.horizon_color[:] + (1.0 - mist.intensity,)))
    
                #tabWrite("fog_offset %.6f\n" % mist.start)
                #tabWrite("fog_alt 5\n")
                #tabWrite("turbulence 0.2\n")
                #tabWrite("turb_depth 0.3\n")
                tabWrite("fog_type 1\n")
                tabWrite("}\n")
    
                tabWrite("scattering { 1, rgb <%.4g, %.4g, %.4g>}\n" % scene.pov.media_color[:])
                tabWrite("samples %.d\n" % scene.pov.media_samples)
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
        def exportGlobalSettings(scene):
    
    
            tabWrite("global_settings {\n")
            tabWrite("assumed_gamma 1.0\n")
    
            tabWrite("max_trace_level %d\n" % scene.pov.max_trace_level)
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
                tabWrite("adc_bailout %.4g\n" % scene.pov.radio_adc_bailout)
                tabWrite("always_sample %d\n" % scene.pov.radio_always_sample)
                tabWrite("brightness %.4g\n" % scene.pov.radio_brightness)
                tabWrite("count %d\n" % scene.pov.radio_count)
                tabWrite("error_bound %.4g\n" % scene.pov.radio_error_bound)
                tabWrite("gray_threshold %.4g\n" % scene.pov.radio_gray_threshold)
                tabWrite("low_error_factor %.4g\n" % scene.pov.radio_low_error_factor)
                tabWrite("media %d\n" % scene.pov.radio_media)
                tabWrite("minimum_reuse %.4g\n" % scene.pov.radio_minimum_reuse)
                tabWrite("nearest_count %d\n" % scene.pov.radio_nearest_count)
                tabWrite("normal %d\n" % scene.pov.radio_normal)
                tabWrite("pretrace_start %.3g\n" % scene.pov.radio_pretrace_start)
                tabWrite("pretrace_end %.3g\n" % scene.pov.radio_pretrace_end)
                tabWrite("recursion_limit %d\n" % scene.pov.radio_recursion_limit)
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            for material in bpy.data.materials:
    
                if material.subsurface_scattering.use and onceSss:
    
                    # In pov, the scale has reversed influence compared to blender. these number
                    # should correct that
                    tabWrite("mm_per_unit %.6f\n" % \
                             (material.subsurface_scattering.scale * (-100.0) + 15.0))
                    # In POV-Ray, the scale factor for all subsurface shaders needs to be the same
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
                    tabWrite("ambient_light rgb<%.3g, %.3g, %.3g>\n" % world.ambient_color[:])
    
                if (material.pov.photons_refraction or material.pov.photons_reflection)and oncePhotons:
    
                    tabWrite("photons {\n")
                    tabWrite("spacing %.6f\n" % scene.pov.photon_spacing)
                    tabWrite("max_trace_level %d\n" % scene.pov.photon_max_trace_level)
                    tabWrite("adc_bailout %.3g\n" % scene.pov.photon_adc_bailout)
                    tabWrite("gather %d, %d\n" % (scene.pov.photon_gather_min, scene.pov.photon_gather_max))
                    tabWrite("}\n")
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
                    # Why are the newlines needed?
                    file.write("\n")
                    file.write(txt.as_string())
                    file.write("\n")
    
        sel = renderable_objects(scene)
    
        comments = scene.pov.comments_enable
        if not scene.pov.tempfiles_enable and comments:
            file.write("//----------------------------------------------\n" \
                       "//--Exported with POV-Ray exporter for Blender--\n" \
                       "//----------------------------------------------\n\n")
    
        if not scene.pov.tempfiles_enable and comments:
    
            file.write("\n//--CUSTOM CODE--\n\n")
        exportCustomCode()
    
        if not scene.pov.tempfiles_enable and comments:
    
            file.write("\n//--Global settings and background--\n\n")
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        exportGlobalSettings(scene)
    
        if not scene.pov.tempfiles_enable and comments:
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        exportWorld(scene.world)
    
        if not scene.pov.tempfiles_enable and comments:
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        exportCamera()
    
        if not scene.pov.tempfiles_enable and comments:
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        exportLamps([l for l in sel if l.type == 'LAMP'])
    
        if not scene.pov.tempfiles_enable and comments:
    
            file.write("\n//--Material Definitions--\n\n")
    
    Luca Bonavita's avatar
    Luca Bonavita committed
        # Convert all materials to strings we can access directly per vertex.
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        #exportMaterials()
    
        writeMaterial(None)  # default material
    
    Luca Bonavita's avatar
    Luca Bonavita committed
        for material in bpy.data.materials:
    
            if material.users > 0:
    
        if not scene.pov.tempfiles_enable and comments:
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        exportMeta([l for l in sel if l.type == 'META'])
    
        if not scene.pov.tempfiles_enable and comments:
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        #What follow used to happen here:
        #exportCamera()
        #exportWorld(scene.world)
        #exportGlobalSettings(scene)
    
        # MR:..and the order was important for an attempt to implement pov 3.7 baking
        #      (mesh camera) comment for the record
    
        # CR: Baking should be a special case than. If "baking", than we could change the order.
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
        #print("pov file closed %s" % file.closed)
    
    Luca Bonavita's avatar
    Luca Bonavita committed
        file.close()
    
        #print("pov file closed %s" % file.closed)
    
    def write_pov_ini(scene, filename_ini, filename_pov, filename_image):
        #scene = bpy.data.scenes[0]
    
    Luca Bonavita's avatar
    Luca Bonavita committed
        render = scene.render
    
    Luca Bonavita's avatar
    Luca Bonavita committed
        x = int(render.resolution_x * render.resolution_percentage * 0.01)
        y = int(render.resolution_y * render.resolution_percentage * 0.01)
    
    
        file = open(filename_ini, "w")
    
        file.write("Input_File_Name='%s'\n" % filename_pov)
        file.write("Output_File_Name='%s'\n" % filename_image)
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
        file.write("Width=%d\n" % x)
        file.write("Height=%d\n" % y)
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
        # Border render.
        if render.use_border:
            file.write("Start_Column=%4g\n" % render.border_min_x)
            file.write("End_Column=%4g\n" % (render.border_max_x))
    
    
    Campbell Barton's avatar
    Campbell Barton committed
            file.write("Start_Row=%4g\n" % (1.0 - render.border_max_y))
            file.write("End_Row=%4g\n" % (1.0 - render.border_min_y))
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
        file.write("Bounding_Method=2\n")  # The new automatic BSP is faster in most scenes
    
        # Activated (turn this back off when better live exchange is done between the two programs
        # (see next comment)
        file.write("Display=1\n")
    
        # PNG, with POV-Ray 3.7, can show background color with alpha. In the long run using the
        # POV-Ray interactive preview like bishop 3D could solve the preview for all formats.
        file.write("Output_File_Type=N\n")
    
        #file.write("Output_File_Type=T\n") # TGA, best progressive loading
        file.write("Output_Alpha=1\n")
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
        if scene.pov.antialias_enable:
            # method 2 (recursive) with higher max subdiv forced because no mipmapping in POV-Ray
            # needs higher sampling.
            # aa_mapping = {"5": 2, "8": 3, "11": 4, "16": 5}
    
            method = {"0": 1, "1": 2}
            file.write("Antialias=on\n")
    
            file.write("Sampling_Method=%s\n" % method[scene.pov.antialias_method])
            file.write("Antialias_Depth=%d\n" % scene.pov.antialias_depth)
            file.write("Antialias_Threshold=%.3g\n" % scene.pov.antialias_threshold)
            file.write("Antialias_Gamma=%.3g\n" % scene.pov.antialias_gamma)
            if scene.pov.jitter_enable:
    
                file.write("Jitter_Amount=%3g\n" % scene.pov.jitter_amount)
    
                file.write("Jitter=off\n")  # prevent animation flicker
    
    Luca Bonavita's avatar
    Luca Bonavita committed
        else:
    
            file.write("Antialias=off\n")
        #print("ini file closed %s" % file.closed)
    
    Luca Bonavita's avatar
    Luca Bonavita committed
        file.close()
    
        #print("ini file closed %s" % file.closed)
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
    class PovrayRender(bpy.types.RenderEngine):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
        bl_idname = 'POVRAY_RENDER'
    
        def _export(self, scene, povPath, renderImagePath):
    
    Luca Bonavita's avatar
    Luca Bonavita committed
            import tempfile
    
                self._temp_file_in = tempfile.NamedTemporaryFile(suffix=".pov", delete=False).name
    
                # PNG with POV 3.7, can show the background color with alpha. In the long run using the
                # POV-Ray interactive preview like bishop 3D could solve the preview for all formats.
                self._temp_file_out = tempfile.NamedTemporaryFile(suffix=".png", delete=False).name
    
                #self._temp_file_out = tempfile.NamedTemporaryFile(suffix=".tga", delete=False).name
                self._temp_file_ini = tempfile.NamedTemporaryFile(suffix=".ini", delete=False).name
            else:
                self._temp_file_in = povPath + ".pov"
    
                # PNG with POV 3.7, can show the background color with alpha. In the long run using the
                # POV-Ray interactive preview like bishop 3D could solve the preview for all formats.
                self._temp_file_out = renderImagePath + ".png"
    
                #self._temp_file_out = renderImagePath + ".tga"
                self._temp_file_ini = povPath + ".ini"
                '''
                self._temp_file_in = "/test.pov"
    
                # PNG with POV 3.7, can show the background color with alpha. In the long run using the
                # POV-Ray interactive preview like bishop 3D could solve the preview for all formats.
                self._temp_file_out = "/test.png"
    
                #self._temp_file_out = "/test.tga"
                self._temp_file_ini = "/test.ini"
                '''
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
            def info_callback(txt):
    
                self.update_stats("", "POV-Ray 3.7: " + txt)
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
            write_pov(self._temp_file_in, scene, info_callback)
    
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
            try:
    
                os.remove(self._temp_file_out)  # so as not to load the old file
    
    Campbell Barton's avatar
    Campbell Barton committed
            except OSError:
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                pass
    
    
            write_pov_ini(scene, self._temp_file_ini, self._temp_file_in, self._temp_file_out)
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
            if scene.pov.command_line_switches != "":
                for newArg in scene.pov.command_line_switches.split(" "):
    
            if sys.platform[:3] == "win":
    
                self._is_windows = True
                #extra_args.append("/EXIT")
    
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                import winreg
    
                import platform as pltfrm
                if pltfrm.architecture()[0] == "64bit":
                    bitness = 64
                else:
                    bitness = 32
    
    
                regKey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\\POV-Ray\\v3.7\\Windows")
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                if bitness == 64:
    
                        pov_binary = winreg.QueryValueEx(regKey, "Home")[0] + "\\bin\\pvengine64"
    
                        self._process = subprocess.Popen(
                                [pov_binary, self._temp_file_ini] + extra_args,
                                stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    
                        # This would work too but means we have to wait until its done:
                        # os.system("%s %s" % (pov_binary, self._temp_file_ini))
    
    Campbell Barton's avatar
    Campbell Barton committed
    
    
                    except OSError:
                        # someone might run povray 32 bits on a 64 bits blender machine
                        try:
    
                            pov_binary = winreg.QueryValueEx(regKey, "Home")[0] + "\\bin\\pvengine"
    
                            self._process = subprocess.Popen(
                                    [pov_binary, self._temp_file_ini] + extra_args,
                                    stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    
    Campbell Barton's avatar
    Campbell Barton committed
    
    
                            print("POV-Ray 3.7: could not execute '%s', possibly POV-Ray isn't " \
                                  "installed" % pov_binary)
    
                            import traceback
                            traceback.print_exc()
                            print ("***-DONE-***")
                            return False
    
    Campbell Barton's avatar
    Campbell Barton committed
    
    
                        else:
                            print("POV-Ray 3.7 64 bits could not execute, running 32 bits instead")
    
                            print("Command line arguments passed: " + str(extra_args))
                            return True
    
    Campbell Barton's avatar
    Campbell Barton committed
    
    
                    else:
                        print("POV-Ray 3.7 64 bits found")
    
                        print("Command line arguments passed: " + str(extra_args))
                        return True
    
    Campbell Barton's avatar
    Campbell Barton committed
    
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                else:
    
                        pov_binary = winreg.QueryValueEx(regKey, "Home")[0] + "\\bin\\pvengine"
    
                        self._process = subprocess.Popen(
                                [pov_binary, self._temp_file_ini] + extra_args,
                                stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    
    Campbell Barton's avatar
    Campbell Barton committed
    
    
                    # someone might also run povray 64 bits with a 32 bits build of blender.
    
                            pov_binary = winreg.QueryValueEx(regKey, "Home")[0] + "\\bin\\pvengine64"
    
                            self._process = subprocess.Popen(
                                    [pov_binary, self._temp_file_ini] + extra_args,
                                    stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    
    Campbell Barton's avatar
    Campbell Barton committed
    
    
                            print("POV-Ray 3.7: could not execute '%s', possibly POV-Ray isn't " \
                                  "installed" % pov_binary)