POV: added doc strings

Hoping it will help the code to be less repulsive to new  new developers.
This commit is contained in:
Maurice Raybaud 2019-12-08 21:41:58 +01:00
parent 90d3e69f65
commit 865d54f155
5 changed files with 522 additions and 235 deletions

View File

@ -18,6 +18,78 @@
# <pep8 compliant>
"""Import, export and render to POV engines.
These engines can be POV-Ray or Uberpov but others too, since POV is a
Scene Description Language. The script has been split in as few files
as possible :
___init__.py :
Initialize variables
update_files.py
Update new variables to values from older API. This file needs an update.
ui.py :
Provide property buttons for the user to set up the variables.
primitives.py :
Display some POV native primitives in 3D view for input and output.
shading.py
Translate shading properties to declared textures at the top of a pov file
nodes.py
Translate node trees to the pov file
df3.py
Render smoke to *.df3 files
render.py :
Translate geometry and UI properties (Blender and POV native) to the POV file
Along these essential files also coexist a few additional libraries to help make
Blender stand up to other POV IDEs such as povwin or QTPOV.
presets :
Material (sss)
apple.py ; chicken.py ; cream.py ; Ketchup.py ; marble.py ;
potato.py ; skim_milk.py ; skin1.py ; skin2.py ; whole_milk.py
Radiosity
01_Debug.py ; 02_Fast.py ; 03_Normal.py ; 04_Two_Bounces.py ;
05_Final.py ; 06_Outdoor_Low_Quality.py ; 07_Outdoor_High_Quality.py ;
08_Outdoor(Sun)Light.py ; 09_Indoor_Low_Quality.py ;
10_Indoor_High_Quality.py ;
World
01_Clear_Blue_Sky.py ; 02_Partly_Hazy_Sky.py ; 03_Overcast_Sky.py ;
04_Cartoony_Sky.py ; 05_Under_Water.py ;
Light
01_(5400K)_Direct_Sun.py ; 02_(5400K)_High_Noon_Sun.py ;
03_(6000K)_Daylight_Window.py ;
04_(6000K)_2500W_HMI_(Halogen_Metal_Iodide).py ;
05_(4000K)_100W_Metal_Halide.py ; 06_(3200K)_100W_Quartz_Halogen.py ;
07_(2850K)_100w_Tungsten.py ; 08_(2600K)_40w_Tungsten.py ;
09_(5000K)_75W_Full_Spectrum_Fluorescent_T12.py ;
10_(4300K)_40W_Vintage_Fluorescent_T12.py ;
11_(5000K)_18W_Standard_Fluorescent_T8 ;
12_(4200K)_18W_Cool_White_Fluorescent_T8.py ;
13_(3000K)_18W_Warm_Fluorescent_T8.py ;
14_(6500K)_54W_Grow_Light_Fluorescent_T5-HO.py ;
15_(3200K)_40W_Induction_Fluorescent.py ;
16_(2100K)_150W_High_Pressure_Sodium.py ;
17_(1700K)_135W_Low_Pressure_Sodium.py ;
18_(6800K)_175W_Mercury_Vapor.py ; 19_(5200K)_700W_Carbon_Arc.py ;
20_(6500K)_15W_LED_Spot.py ; 21_(2700K)_7W_OLED_Panel.py ;
22_(30000K)_40W_Black_Light_Fluorescent.py ;
23_(30000K)_40W_Black_Light_Bulb.py; 24_(1850K)_Candle.py
templates:
abyss.pov ; biscuit.pov ; bsp_Tango.pov ; chess2.pov ;
cornell.pov ; diffract.pov ; diffuse_back.pov ; float5 ;
gamma_showcase.pov ; grenadine.pov ; isocacti.pov ;
mediasky.pov ; patio-radio.pov ; subsurface.pov ; wallstucco.pov
"""
bl_info = {
"name": "Persistence of Vision",
"author": "Campbell Barton, "
@ -71,6 +143,7 @@ else:
)
def string_strip_hyphen(name):
"""Remove hyphen characters from a string to avoid POV errors."""
return name.replace("-", "")
def active_texture_name_from_uilist(self,context):
@ -98,6 +171,7 @@ def active_texture_name_from_search(self,context):
# Scene POV properties.
###############################################################################
class RenderPovSettingsScene(PropertyGroup):
"""Declare scene level properties controllable in UI and translated to POV."""
#Linux SDL-window enable
sdl_window_enable: BoolProperty(
name="Enable SDL window",
@ -583,6 +657,7 @@ class RenderPovSettingsScene(PropertyGroup):
# Material POV properties.
###############################################################################
class MaterialTextureSlot(PropertyGroup):
"""Declare material texture slot level properties for UI and translated to POV."""
bl_idname="pov_texture_slots",
bl_description="Texture_slots from Blender-2.79",
@ -984,7 +1059,8 @@ bpy.types.ID.active_texture_index = IntProperty(
default = 0)
class RenderPovSettingsMaterial(PropertyGroup):
######################Begin Old Blender Internal Props#########################
"""Declare material level properties controllable in UI and translated to POV."""
######################Begin Old Blender Internal Props#########################
#former Space properties from removed Blender Internal
use_limited_texture_context: BoolProperty(
name="",
@ -1558,7 +1634,8 @@ class RenderPovSettingsMaterial(PropertyGroup):
object_preview_rotate: FloatVectorProperty(name="Rotate", description="", min=-180.0, max=180.0,default=(0.0,0.0,0.0), subtype='XYZ')
object_preview_bgcontrast: FloatProperty(name="Contrast", min=0.0, max=1.0, default=0.5)
class MaterialRaytraceTransparency(PropertyGroup):
class MaterialRaytraceTransparency(PropertyGroup):
"""Declare transparency panel properties controllable in UI and translated to POV."""
depth: IntProperty(
name="Depth",
@ -1614,6 +1691,8 @@ class MaterialRaytraceTransparency(PropertyGroup):
min=-0.0, max=10.0, soft_min=0.25, soft_max=4.0, default=1.3)
class MaterialRaytraceMirror(PropertyGroup):
"""Declare reflection panel properties controllable in UI and translated to POV."""
bl_description = "Raytraced reflection settings for the Material",
use: BoolProperty(
name="Mirror",
@ -1689,6 +1768,8 @@ class MaterialRaytraceMirror(PropertyGroup):
min=0.0, max=1.0, soft_min=0.0, soft_max=1.0, default=1.0, precision=3)
class MaterialSubsurfaceScattering(PropertyGroup):
r"""Declare SSS/SSTL properties controllable in UI and translated to POV."""
bl_description = "Subsurface scattering settings for the material",
use: BoolProperty(
@ -1747,6 +1828,8 @@ class MaterialSubsurfaceScattering(PropertyGroup):
min=0.0, max=1.0, soft_min=0.0, soft_max=1.0, default=0.0, precision=3)
class MaterialStrandSettings(PropertyGroup):
"""Declare strand properties controllable in UI and translated to POV."""
bl_description = "Strand settings for the material",
blend_distance: FloatProperty(
@ -3099,6 +3182,8 @@ node_categories = [
# Texture POV properties.
###############################################################################
class RenderPovSettingsTexture(PropertyGroup):
"""Declare texture level properties controllable in UI and translated to POV."""
#former Space properties from removed Blender Internal
active_texture_index: IntProperty(
name = "Index for texture_slots",
@ -3618,6 +3703,8 @@ class RenderPovSettingsTexture(PropertyGroup):
###############################################################################
class RenderPovSettingsObject(PropertyGroup):
"""Declare object and primitives level properties controllable in UI and translated to POV."""
# Pov inside_vector used for CSG
inside_vector: FloatVectorProperty(
name="CSG Inside Vector", description="Direction to shoot CSG inside test rays at",
@ -3767,14 +3854,17 @@ class RenderPovSettingsObject(PropertyGroup):
def prop_update_cylinder(self, context):
"""Update POV cylinder primitive parameters not only at creation but anytime they are changed in UI."""
if bpy.ops.pov.cylinder_update.poll():
bpy.ops.pov.cylinder_update()
cylinder_radius: FloatProperty(name="Cylinder R",min=0.00, max=10.0, default=0.04, update=prop_update_cylinder)
cylinder_radius: FloatProperty(
name="Cylinder R",min=0.00, max=10.0, default=0.04, update=prop_update_cylinder)
cylinder_location_cap: FloatVectorProperty(
name="Cylinder Cap Location", subtype='TRANSLATION',
description="The position of the 'other' end of the cylinder (relative to object location)",
default=(0.0, 0.0, 2.0), update=prop_update_cylinder,
)
default=(0.0, 0.0, 2.0), update=prop_update_cylinder)
imported_cyl_loc: FloatVectorProperty(
name="Imported Pov location",
@ -3787,16 +3877,21 @@ class RenderPovSettingsObject(PropertyGroup):
default=(0.0, 0.0, 2.0))
def prop_update_sphere(self, context):
"""Update POV sphere primitive parameters not only at creation but anytime they are changed in UI."""
bpy.ops.pov.sphere_update()
sphere_radius: FloatProperty(name="Sphere radius",min=0.00, max=10.0, default=0.5, update=prop_update_sphere)
sphere_radius: FloatProperty(
name="Sphere radius",min=0.00, max=10.0, default=0.5, update=prop_update_sphere)
def prop_update_cone(self, context):
"""Update POV cone primitive parameters not only at creation but anytime they are changed in UI."""
bpy.ops.pov.cone_update()
cone_base_radius: FloatProperty(
name = "Base radius", description = "The first radius of the cone",
default = 1.0, min = 0.01, max = 100.0, update=prop_update_cone)
cone_cap_radius: FloatProperty(
name = "Cap radius", description = "The second radius of the cone",
default = 0.3, min = 0.0, max = 100.0, update=prop_update_cone)
@ -3810,10 +3905,12 @@ class RenderPovSettingsObject(PropertyGroup):
default = 2.0, min = 0.01, max = 100.0, update=prop_update_cone)
cone_base_z: FloatProperty()
cone_cap_z: FloatProperty()
###########Parametric
def prop_update_parametric(self, context):
"""Update POV parametric surface primitive parameters not only at creation but anytime they are changed in UI."""
bpy.ops.pov.parametric_update()
u_min: FloatProperty(name = "U Min",
@ -3838,6 +3935,7 @@ class RenderPovSettingsObject(PropertyGroup):
###########Torus
def prop_update_torus(self, context):
"""Update POV torus primitive parameters not only at creation but anytime they are changed in UI."""
bpy.ops.pov.torus_update()
torus_major_segments: IntProperty(
@ -3899,6 +3997,7 @@ class RenderPovSettingsObject(PropertyGroup):
##############Superellipsoid
def prop_update_superellipsoid(self, context):
"""Update POV superellipsoid primitive parameters not only at creation but anytime they are changed in UI."""
bpy.ops.pov.superellipsoid_update()
se_param1: FloatProperty(
@ -3948,6 +4047,7 @@ class RenderPovSettingsObject(PropertyGroup):
#############Supertorus
def prop_update_supertorus(self, context):
"""Update POV supertorus primitive parameters not only at creation but anytime they are changed in UI."""
bpy.ops.pov.supertorus_update()
st_major_radius: FloatProperty(
@ -4089,6 +4189,7 @@ class RenderPovSettingsObject(PropertyGroup):
# Camera POV properties.
###############################################################################
class RenderPovSettingsCamera(PropertyGroup):
"""Declare camera properties controllable in UI and translated to POV."""
#DOF Toggle
dof_enable: BoolProperty(
name="Depth Of Field", description="Enable POV Depth Of Field ",
@ -4153,6 +4254,7 @@ class RenderPovSettingsCamera(PropertyGroup):
# Light POV properties.
###############################################################################
class RenderPovSettingsLight(PropertyGroup):
"""Declare light properties controllable in UI and translated to POV."""
#former Space properties from removed Blender Internal
use_limited_texture_context: BoolProperty(
name="",
@ -4207,6 +4309,7 @@ class RenderPovSettingsLight(PropertyGroup):
# World POV properties.
###############################################################################
class RenderPovSettingsWorld(PropertyGroup):
"""Declare world properties controllable in UI and translated to POV."""
#former Space properties from removed Blender Internal
use_limited_texture_context: BoolProperty(
name="",
@ -4255,6 +4358,7 @@ class RenderPovSettingsWorld(PropertyGroup):
name = "Index for texture_slots",
default = 0)
class WorldTextureSlot(PropertyGroup):
"""Declare world texture slot properties controllable in UI and translated to POV."""
blend_factor: FloatProperty(
name="Blend",
description="Amount texture affects color progression of the "
@ -4352,6 +4456,7 @@ class MATERIAL_TEXTURE_SLOTS_UL_POV_layerlist(bpy.types.UIList):
# Text POV properties.
###############################################################################
class RenderPovSettingsText(PropertyGroup):
"""Declare text properties to use UI as an IDE or render text snippets to POV."""
custom_code: EnumProperty(
name="Custom Code",
description="rendered source: Both adds text at the "
@ -4365,6 +4470,7 @@ class RenderPovSettingsText(PropertyGroup):
# Povray Preferences.
###############################################################################
class PovrayPreferences(AddonPreferences):
"""Declare preference variables to set up POV binary."""
bl_idname = __name__
branch_feature_set_povray: EnumProperty(

View File

@ -47,6 +47,7 @@ from mathutils import (
#import collections
def pov_define_mesh(mesh, verts, edges, faces, name, hide_geometry=True):
"""Generate proxy mesh."""
if mesh is None:
mesh = bpy.data.meshes.new(name)
mesh.from_pydata(verts, edges, faces)
@ -60,6 +61,7 @@ def pov_define_mesh(mesh, verts, edges, faces, name, hide_geometry=True):
class POVRAY_OT_lathe_add(bpy.types.Operator):
"""Add the representation of POV lathe using a screw modifier."""
bl_idname = "pov.addlathe"
bl_label = "Lathe"
bl_options = {'REGISTER','UNDO'}
@ -91,123 +93,125 @@ class POVRAY_OT_lathe_add(bpy.types.Operator):
def pov_superellipsoid_define(context, op, ob):
"""Create the proxy mesh of a POV superellipsoid using the pov_superellipsoid_define() function."""
if op:
mesh = None
if op:
mesh = None
u = op.se_u
v = op.se_v
n1 = op.se_n1
n2 = op.se_n2
edit = op.se_edit
se_param1 = n2 # op.se_param1
se_param2 = n1 # op.se_param2
u = op.se_u
v = op.se_v
n1 = op.se_n1
n2 = op.se_n2
edit = op.se_edit
se_param1 = n2 # op.se_param1
se_param2 = n1 # op.se_param2
else:
assert(ob)
mesh = ob.data
else:
assert(ob)
mesh = ob.data
u = ob.pov.se_u
v = ob.pov.se_v
n1 = ob.pov.se_n1
n2 = ob.pov.se_n2
edit = ob.pov.se_edit
se_param1 = ob.pov.se_param1
se_param2 = ob.pov.se_param2
u = ob.pov.se_u
v = ob.pov.se_v
n1 = ob.pov.se_n1
n2 = ob.pov.se_n2
edit = ob.pov.se_edit
se_param1 = ob.pov.se_param1
se_param2 = ob.pov.se_param2
verts = []
r=1
verts = []
r=1
stepSegment=360/v*pi/180
stepRing=pi/u
angSegment=0
angRing=-pi/2
stepSegment=360/v*pi/180
stepRing=pi/u
angSegment=0
angRing=-pi/2
step=0
for ring in range(0,u-1):
angRing += stepRing
for segment in range(0,v):
step += 1
angSegment += stepSegment
x = r*(abs(cos(angRing))**n1)*(abs(cos(angSegment))**n2)
if (cos(angRing) < 0 and cos(angSegment) > 0) or \
(cos(angRing) > 0 and cos(angSegment) < 0):
x = -x
y = r*(abs(cos(angRing))**n1)*(abs(sin(angSegment))**n2)
if (cos(angRing) < 0 and sin(angSegment) > 0) or \
(cos(angRing) > 0 and sin(angSegment) < 0):
y = -y
z = r*(abs(sin(angRing))**n1)
if sin(angRing) < 0:
z = -z
x = round(x,4)
y = round(y,4)
z = round(z,4)
verts.append((x,y,z))
if edit == 'TRIANGLES':
verts.append((0,0,1))
verts.append((0,0,-1))
step=0
for ring in range(0,u-1):
angRing += stepRing
for segment in range(0,v):
step += 1
angSegment += stepSegment
x = r*(abs(cos(angRing))**n1)*(abs(cos(angSegment))**n2)
if (cos(angRing) < 0 and cos(angSegment) > 0) or \
(cos(angRing) > 0 and cos(angSegment) < 0):
x = -x
y = r*(abs(cos(angRing))**n1)*(abs(sin(angSegment))**n2)
if (cos(angRing) < 0 and sin(angSegment) > 0) or \
(cos(angRing) > 0 and sin(angSegment) < 0):
y = -y
z = r*(abs(sin(angRing))**n1)
if sin(angRing) < 0:
z = -z
x = round(x,4)
y = round(y,4)
z = round(z,4)
verts.append((x,y,z))
if edit == 'TRIANGLES':
verts.append((0,0,1))
verts.append((0,0,-1))
faces = []
faces = []
for i in range(0,u-2):
m=i*v
for p in range(0,v):
if p < v-1:
face=(m+p,1+m+p,v+1+m+p,v+m+p)
if p == v-1:
face=(m+p,m,v+m,v+m+p)
for i in range(0,u-2):
m=i*v
for p in range(0,v):
if p < v-1:
face=(m+p,1+m+p,v+1+m+p,v+m+p)
if p == v-1:
face=(m+p,m,v+m,v+m+p)
faces.append(face)
if edit == 'TRIANGLES':
indexUp=len(verts)-2
indexDown=len(verts)-1
indexStartDown=len(verts)-2-v
for i in range(0,v):
if i < v-1:
face=(indexDown,i,i+1)
faces.append(face)
if edit == 'TRIANGLES':
indexUp=len(verts)-2
indexDown=len(verts)-1
indexStartDown=len(verts)-2-v
for i in range(0,v):
if i < v-1:
face=(indexDown,i,i+1)
faces.append(face)
if i == v-1:
face=(indexDown,i,0)
faces.append(face)
for i in range(0,v):
if i < v-1:
face=(indexUp,i+indexStartDown,i+indexStartDown+1)
faces.append(face)
if i == v-1:
face=(indexUp,i+indexStartDown,indexStartDown)
faces.append(face)
if edit == 'NGONS':
face=[]
for i in range(0,v):
face.append(i)
faces.append(face)
face=[]
indexUp=len(verts)-1
for i in range(0,v):
face.append(indexUp-i)
faces.append(face)
mesh = pov_define_mesh(mesh, verts, [], faces, "SuperEllipsoid")
if i == v-1:
face=(indexDown,i,0)
faces.append(face)
for i in range(0,v):
if i < v-1:
face=(indexUp,i+indexStartDown,i+indexStartDown+1)
faces.append(face)
if i == v-1:
face=(indexUp,i+indexStartDown,indexStartDown)
faces.append(face)
if edit == 'NGONS':
face=[]
for i in range(0,v):
face.append(i)
faces.append(face)
face=[]
indexUp=len(verts)-1
for i in range(0,v):
face.append(indexUp-i)
faces.append(face)
mesh = pov_define_mesh(mesh, verts, [], faces, "SuperEllipsoid")
if not ob:
ob = object_utils.object_data_add(context, mesh, operator=None)
#engine = context.scene.render.engine what for?
ob = context.object
ob.name = ob.data.name = "PovSuperellipsoid"
ob.pov.object_as = 'SUPERELLIPSOID'
ob.pov.se_param1 = n2
ob.pov.se_param2 = n1
if not ob:
ob = object_utils.object_data_add(context, mesh, operator=None)
#engine = context.scene.render.engine what for?
ob = context.object
ob.name = ob.data.name = "PovSuperellipsoid"
ob.pov.object_as = 'SUPERELLIPSOID'
ob.pov.se_param1 = n2
ob.pov.se_param2 = n1
ob.pov.se_u = u
ob.pov.se_v = v
ob.pov.se_n1 = n1
ob.pov.se_n2 = n2
ob.pov.se_edit = edit
ob.pov.se_u = u
ob.pov.se_v = v
ob.pov.se_n1 = n1
ob.pov.se_n2 = n2
ob.pov.se_edit = edit
bpy.ops.object.mode_set(mode="EDIT")
bpy.ops.mesh.hide(unselected=False)
bpy.ops.object.mode_set(mode="OBJECT")
bpy.ops.object.mode_set(mode="EDIT")
bpy.ops.mesh.hide(unselected=False)
bpy.ops.object.mode_set(mode="OBJECT")
class POVRAY_OT_superellipsoid_add(bpy.types.Operator):
"""Add the representation of POV superellipsoid using the pov_superellipsoid_define() function."""
bl_idname = "pov.addsuperellipsoid"
bl_label = "Add SuperEllipsoid"
bl_description = "Create a SuperEllipsoid"
@ -258,6 +262,11 @@ class POVRAY_OT_superellipsoid_add(bpy.types.Operator):
return {'FINISHED'}
class POVRAY_OT_superellipsoid_update(bpy.types.Operator):
"""Update the superellipsoid.
Delete its previous proxy geometry and rerun pov_superellipsoid_define() function
with the new parameters"""
bl_idname = "pov.superellipsoid_update"
bl_label = "Update"
bl_description = "Update Superellipsoid"
@ -406,6 +415,8 @@ def pov_supertorus_define(context, op, ob):
ob.pov.st_edit = st_edit
class POVRAY_OT_supertorus_add(bpy.types.Operator):
"""Add the representation of POV supertorus using the pov_supertorus_define() function."""
bl_idname = "pov.addsupertorus"
bl_label = "Add Supertorus"
bl_description = "Create a SuperTorus"
@ -450,6 +461,10 @@ class POVRAY_OT_supertorus_add(bpy.types.Operator):
return {'FINISHED'}
class POVRAY_OT_supertorus_update(bpy.types.Operator):
"""Update the supertorus.
Delete its previous proxy geometry and rerun pov_supetorus_define() function
with the new parameters"""
bl_idname = "pov.supertorus_update"
bl_label = "Update"
bl_description = "Update SuperTorus"
@ -474,6 +489,8 @@ class POVRAY_OT_supertorus_update(bpy.types.Operator):
return {'FINISHED'}
#########################################################################################################
class POVRAY_OT_loft_add(bpy.types.Operator):
"""Create the representation of POV loft using Blender curves."""
bl_idname = "pov.addloft"
bl_label = "Add Loft Data"
bl_description = "Create a Curve data for Meshmaker"
@ -588,6 +605,11 @@ class POVRAY_OT_loft_add(bpy.types.Operator):
return {'FINISHED'}
class POVRAY_OT_plane_add(bpy.types.Operator):
"""Add the representation of POV infinite plane using just a very big Blender Plane.
Flag its primitive type with a specific pov.object_as attribute and lock edit mode
to keep proxy consistency by hiding edit geometry."""
bl_idname = "pov.addplane"
bl_label = "Plane"
bl_description = "Add Plane"
@ -609,6 +631,11 @@ class POVRAY_OT_plane_add(bpy.types.Operator):
return {'FINISHED'}
class POVRAY_OT_box_add(bpy.types.Operator):
"""Add the representation of POV box using a simple Blender mesh cube.
Flag its primitive type with a specific pov.object_as attribute and lock edit mode
to keep proxy consistency by hiding edit geometry."""
bl_idname = "pov.addbox"
bl_label = "Box"
bl_description = "Add Box"
@ -664,6 +691,9 @@ def pov_cylinder_define(context, op, ob, radius, loc, loc_cap):
class POVRAY_OT_cylinder_add(bpy.types.Operator):
"""Add the representation of POV cylinder using pov_cylinder_define() function.
Use imported_cyl_loc when this operator is run by POV importer."""
bl_idname = "pov.addcylinder"
bl_label = "Cylinder"
bl_description = "Add Cylinder"
@ -709,6 +739,11 @@ class POVRAY_OT_cylinder_add(bpy.types.Operator):
class POVRAY_OT_cylinder_update(bpy.types.Operator):
"""Update the POV cylinder.
Delete its previous proxy geometry and rerun pov_cylinder_define() function
with the new parameters"""
bl_idname = "pov.cylinder_update"
bl_label = "Update"
bl_description = "Update Cylinder"
@ -734,44 +769,53 @@ class POVRAY_OT_cylinder_update(bpy.types.Operator):
################################SPHERE##########################################
def pov_sphere_define(context, op, ob, loc):
if op:
R = op.R
loc = bpy.context.scene.cursor.location
else:
assert(ob)
R = ob.pov.sphere_radius
"""create the representation of POV sphere using a Blender icosphere.
#keep object rotation and location for the add object operator
obrot = ob.rotation_euler
#obloc = ob.location
obscale = ob.scale
Its nice platonic solid curvature better represents pov rendertime
tesselation than a UV sphere"""
bpy.ops.object.mode_set(mode="EDIT")
bpy.ops.mesh.reveal()
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.delete(type='VERT')
bpy.ops.mesh.primitive_ico_sphere_add(subdivisions=4, radius=ob.pov.sphere_radius, location=loc, rotation=obrot)
#bpy.ops.transform.rotate(axis=obrot,orient_type='GLOBAL')
bpy.ops.transform.resize(value=obscale)
#bpy.ops.transform.rotate(axis=obrot, proportional_size=1)
if op:
R = op.R
loc = bpy.context.scene.cursor.location
else:
assert(ob)
R = ob.pov.sphere_radius
#keep object rotation and location for the add object operator
obrot = ob.rotation_euler
#obloc = ob.location
obscale = ob.scale
bpy.ops.object.mode_set(mode="EDIT")
bpy.ops.mesh.reveal()
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.delete(type='VERT')
bpy.ops.mesh.primitive_ico_sphere_add(subdivisions=4, radius=ob.pov.sphere_radius, location=loc, rotation=obrot)
#bpy.ops.transform.rotate(axis=obrot,orient_type='GLOBAL')
bpy.ops.transform.resize(value=obscale)
#bpy.ops.transform.rotate(axis=obrot, proportional_size=1)
bpy.ops.mesh.hide(unselected=False)
bpy.ops.object.mode_set(mode="OBJECT")
bpy.ops.object.shade_smooth()
#bpy.ops.transform.rotate(axis=obrot,orient_type='GLOBAL')
bpy.ops.mesh.hide(unselected=False)
bpy.ops.object.mode_set(mode="OBJECT")
bpy.ops.object.shade_smooth()
#bpy.ops.transform.rotate(axis=obrot,orient_type='GLOBAL')
if not ob:
bpy.ops.mesh.primitive_ico_sphere_add(subdivisions=4, radius=R, location=loc)
ob = context.object
ob.name = ob.data.name = "PovSphere"
ob.pov.object_as = "SPHERE"
ob.pov.sphere_radius = R
bpy.ops.object.mode_set(mode="EDIT")
bpy.ops.mesh.hide(unselected=False)
bpy.ops.object.mode_set(mode="OBJECT")
if not ob:
bpy.ops.mesh.primitive_ico_sphere_add(subdivisions=4, radius=R, location=loc)
ob = context.object
ob.name = ob.data.name = "PovSphere"
ob.pov.object_as = "SPHERE"
ob.pov.sphere_radius = R
bpy.ops.object.mode_set(mode="EDIT")
bpy.ops.mesh.hide(unselected=False)
bpy.ops.object.mode_set(mode="OBJECT")
class POVRAY_OT_sphere_add(bpy.types.Operator):
"""Add the representation of POV sphere using pov_sphere_define() function.
Use imported_loc when this operator is run by POV importer."""
bl_idname = "pov.addsphere"
bl_label = "Sphere"
bl_description = "Add Sphere Shape"
@ -823,6 +867,11 @@ class POVRAY_OT_sphere_add(bpy.types.Operator):
# ob.name = ob.data.name = 'PovSphere'
# return {'FINISHED'}
class POVRAY_OT_sphere_update(bpy.types.Operator):
"""Update the POV sphere.
Delete its previous proxy geometry and rerun pov_sphere_define() function
with the new parameters"""
bl_idname = "pov.sphere_update"
bl_label = "Update"
bl_description = "Update Sphere"
@ -844,6 +893,9 @@ class POVRAY_OT_sphere_update(bpy.types.Operator):
####################################CONE#######################################
def pov_cone_define(context, op, ob):
"""Add the representation of POV cone using pov_define_mesh() function.
Blender cone does not offer the same features such as a second radius."""
verts = []
faces = []
if op:
@ -903,13 +955,15 @@ def pov_cone_define(context, op, ob):
class POVRAY_OT_cone_add(bpy.types.Operator):
"""Add the representation of POV cone using pov_cone_define() function."""
bl_idname = "pov.cone_add"
bl_label = "Cone"
bl_description = "Add Cone"
bl_options = {'REGISTER', 'UNDO'}
COMPAT_ENGINES = {'POVRAY_RENDER'}
# XXX Keep it in sync with __init__'s RenderPovSettingsConePrimitive
# XXX Keep it in sync with __init__.py's RenderPovSettingsConePrimitive
# If someone knows how to define operators' props from a func, I'd be delighted to learn it!
base: FloatProperty(
name = "Base radius", description = "The first radius of the cone",
@ -937,6 +991,11 @@ class POVRAY_OT_cone_add(bpy.types.Operator):
class POVRAY_OT_cone_update(bpy.types.Operator):
"""Update the POV cone.
Delete its previous proxy geometry and rerun pov_cone_define() function
with the new parameters"""
bl_idname = "pov.cone_update"
bl_label = "Update"
bl_description = "Update Cone"
@ -959,9 +1018,15 @@ class POVRAY_OT_cone_update(bpy.types.Operator):
pov_cone_define(context, None, context.object)
return {'FINISHED'}
#########################################################################################################
########################################ISOSURFACES##################################
class POVRAY_OT_isosurface_box_add(bpy.types.Operator):
"""Add the representation of POV isosurface box using also just a Blender mesh cube.
Flag its primitive type with a specific pov.object_as attribute and lock edit mode
to keep proxy consistency by hiding edit geometry."""
bl_idname = "pov.addisosurfacebox"
bl_label = "Isosurface Box"
bl_description = "Add Isosurface contained by Box"
@ -984,6 +1049,11 @@ class POVRAY_OT_isosurface_box_add(bpy.types.Operator):
return {'FINISHED'}
class POVRAY_OT_isosurface_sphere_add(bpy.types.Operator):
"""Add the representation of POV isosurface sphere by a Blender mesh icosphere.
Flag its primitive type with a specific pov.object_as attribute and lock edit mode
to keep proxy consistency by hiding edit geometry."""
bl_idname = "pov.addisosurfacesphere"
bl_label = "Isosurface Sphere"
bl_description = "Add Isosurface contained by Sphere"
@ -1007,6 +1077,11 @@ class POVRAY_OT_isosurface_sphere_add(bpy.types.Operator):
return {'FINISHED'}
class POVRAY_OT_sphere_sweep_add(bpy.types.Operator):
"""Add the representation of POV sphere_sweep using a Blender NURBS curve.
Flag its primitive type with a specific ob.pov.curveshape attribute and
leave access to edit mode to keep user editable handles."""
bl_idname = "pov.addspheresweep"
bl_label = "Sphere Sweep"
bl_description = "Create Sphere Sweep along curve"
@ -1027,6 +1102,11 @@ class POVRAY_OT_sphere_sweep_add(bpy.types.Operator):
return {'FINISHED'}
class POVRAY_OT_blob_add(bpy.types.Operator):
"""Add the representation of POV blob using a Blender meta ball.
No need to flag its primitive type as meta are exported to blobs
and leave access to edit mode to keep user editable thresholds."""
bl_idname = "pov.addblobsphere"
bl_label = "Blob Sphere"
bl_description = "Add Blob Sphere"
@ -1042,6 +1122,15 @@ class POVRAY_OT_blob_add(bpy.types.Operator):
class POVRAY_OT_rainbow_add(bpy.types.Operator):
"""Add the representation of POV rainbow using a Blender spot light.
Rainbows indeed propagate along a visibility cone.
Flag its primitive type with a specific ob.pov.object_as attribute
and leave access to edit mode to keep user editable handles.
Add a constraint to orient it towards camera because POV Rainbows
are view dependant and having it always initially visible is less
confusing """
bl_idname = "pov.addrainbow"
bl_label = "Rainbow"
bl_description = "Add Rainbow"
@ -1076,6 +1165,11 @@ class POVRAY_OT_rainbow_add(bpy.types.Operator):
return {'FINISHED'}
class POVRAY_OT_height_field_add(bpy.types.Operator, ImportHelper):
"""Add the representation of POV height_field using a displaced grid.
texture slot fix and displace modifier will be needed because noise
displace operator was deprecated in 2.8"""
bl_idname = "pov.addheightfield"
bl_label = "Height Field"
bl_description = "Add Height Field "
@ -1159,47 +1253,54 @@ class POVRAY_OT_height_field_add(bpy.types.Operator, ImportHelper):
############################TORUS############################################
def pov_torus_define(context, op, ob):
if op:
mas = op.mas
mis = op.mis
mar = op.mar
mir = op.mir
else:
assert(ob)
mas = ob.pov.torus_major_segments
mis = ob.pov.torus_minor_segments
mar = ob.pov.torus_major_radius
mir = ob.pov.torus_minor_radius
"""Add the representation of POV torus using just a Blender torus.
#keep object rotation and location for the add object operator
obrot = ob.rotation_euler
obloc = ob.location
But flag its primitive type with a specific pov.object_as attribute and lock edit mode
to keep proxy consistency by hiding edit geometry."""
bpy.ops.object.mode_set(mode="EDIT")
bpy.ops.mesh.reveal()
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.delete(type='VERT')
bpy.ops.mesh.primitive_torus_add(rotation = obrot, location = obloc, major_segments=mas, minor_segments=mis,major_radius=mar, minor_radius=mir)
if op:
mas = op.mas
mis = op.mis
mar = op.mar
mir = op.mir
else:
assert(ob)
mas = ob.pov.torus_major_segments
mis = ob.pov.torus_minor_segments
mar = ob.pov.torus_major_radius
mir = ob.pov.torus_minor_radius
#keep object rotation and location for the add object operator
obrot = ob.rotation_euler
obloc = ob.location
bpy.ops.object.mode_set(mode="EDIT")
bpy.ops.mesh.reveal()
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.delete(type='VERT')
bpy.ops.mesh.primitive_torus_add(rotation = obrot, location = obloc, major_segments=mas, minor_segments=mis,major_radius=mar, minor_radius=mir)
bpy.ops.mesh.hide(unselected=False)
bpy.ops.object.mode_set(mode="OBJECT")
bpy.ops.mesh.hide(unselected=False)
bpy.ops.object.mode_set(mode="OBJECT")
if not ob:
bpy.ops.mesh.primitive_torus_add(major_segments=mas, minor_segments=mis,major_radius=mar, minor_radius=mir)
ob = context.object
ob.name = ob.data.name = "PovTorus"
ob.pov.object_as = "TORUS"
ob.pov.torus_major_segments = mas
ob.pov.torus_minor_segments = mis
ob.pov.torus_major_radius = mar
ob.pov.torus_minor_radius = mir
bpy.ops.object.mode_set(mode="EDIT")
bpy.ops.mesh.hide(unselected=False)
bpy.ops.object.mode_set(mode="OBJECT")
if not ob:
bpy.ops.mesh.primitive_torus_add(major_segments=mas, minor_segments=mis,major_radius=mar, minor_radius=mir)
ob = context.object
ob.name = ob.data.name = "PovTorus"
ob.pov.object_as = "TORUS"
ob.pov.torus_major_segments = mas
ob.pov.torus_minor_segments = mis
ob.pov.torus_major_radius = mar
ob.pov.torus_minor_radius = mir
bpy.ops.object.mode_set(mode="EDIT")
bpy.ops.mesh.hide(unselected=False)
bpy.ops.object.mode_set(mode="OBJECT")
class POVRAY_OT_torus_add(bpy.types.Operator):
"""Add the representation of POV torus using using pov_torus_define() function."""
bl_idname = "pov.addtorus"
bl_label = "Torus"
bl_description = "Add Torus"
@ -1231,6 +1332,11 @@ class POVRAY_OT_torus_add(bpy.types.Operator):
class POVRAY_OT_torus_update(bpy.types.Operator):
"""Update the POV torus.
Delete its previous proxy geometry and rerun pov_torus_define() function
with the new parameters"""
bl_idname = "pov.torus_update"
bl_label = "Update"
bl_description = "Update Torus"
@ -1253,6 +1359,8 @@ class POVRAY_OT_torus_update(bpy.types.Operator):
class POVRAY_OT_prism_add(bpy.types.Operator):
"""Add the representation of POV prism using using an extruded curve."""
bl_idname = "pov.addprism"
bl_label = "Prism"
bl_description = "Create Prism"
@ -1300,65 +1408,70 @@ class POVRAY_OT_prism_add(bpy.types.Operator):
##############################PARAMETRIC######################################
def pov_parametric_define(context, op, ob):
if op:
u_min = op.u_min
u_max = op.u_max
v_min = op.v_min
v_max = op.v_max
x_eq = op.x_eq
y_eq = op.y_eq
z_eq = op.z_eq
"""Add the representation of POV parametric surfaces by math surface from add mesh extra objects addon."""
else:
assert(ob)
u_min = ob.pov.u_min
u_max = ob.pov.u_max
v_min = ob.pov.v_min
v_max = ob.pov.v_max
x_eq = ob.pov.x_eq
y_eq = ob.pov.y_eq
z_eq = ob.pov.z_eq
if op:
u_min = op.u_min
u_max = op.u_max
v_min = op.v_min
v_max = op.v_max
x_eq = op.x_eq
y_eq = op.y_eq
z_eq = op.z_eq
#keep object rotation and location for the updated object
obloc = ob.location
obrot = ob.rotation_euler # In radians
#Parametric addon has no loc rot, some extra work is needed
#in case cursor has moved
curloc = bpy.context.scene.cursor.location
else:
assert(ob)
u_min = ob.pov.u_min
u_max = ob.pov.u_max
v_min = ob.pov.v_min
v_max = ob.pov.v_max
x_eq = ob.pov.x_eq
y_eq = ob.pov.y_eq
z_eq = ob.pov.z_eq
#keep object rotation and location for the updated object
obloc = ob.location
obrot = ob.rotation_euler # In radians
#Parametric addon has no loc rot, some extra work is needed
#in case cursor has moved
curloc = bpy.context.scene.cursor.location
bpy.ops.object.mode_set(mode="EDIT")
bpy.ops.mesh.reveal()
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.delete(type='VERT')
bpy.ops.mesh.primitive_xyz_function_surface(x_eq=x_eq, y_eq=y_eq, z_eq=z_eq, range_u_min=u_min, range_u_max=u_max, range_v_min=v_min, range_v_max=v_max)
bpy.ops.mesh.select_all(action='SELECT')
#extra work:
bpy.ops.transform.translate(value=(obloc-curloc), proportional_size=1)
bpy.ops.transform.rotate(axis=obrot, proportional_size=1)
bpy.ops.object.mode_set(mode="EDIT")
bpy.ops.mesh.reveal()
bpy.ops.mesh.select_all(action='SELECT')
bpy.ops.mesh.delete(type='VERT')
bpy.ops.mesh.primitive_xyz_function_surface(x_eq=x_eq, y_eq=y_eq, z_eq=z_eq, range_u_min=u_min, range_u_max=u_max, range_v_min=v_min, range_v_max=v_max)
bpy.ops.mesh.select_all(action='SELECT')
#extra work:
bpy.ops.transform.translate(value=(obloc-curloc), proportional_size=1)
bpy.ops.transform.rotate(axis=obrot, proportional_size=1)
bpy.ops.mesh.hide(unselected=False)
bpy.ops.object.mode_set(mode="OBJECT")
bpy.ops.mesh.hide(unselected=False)
bpy.ops.object.mode_set(mode="OBJECT")
if not ob:
bpy.ops.mesh.primitive_xyz_function_surface(x_eq=x_eq, y_eq=y_eq, z_eq=z_eq, range_u_min=u_min, range_u_max=u_max, range_v_min=v_min, range_v_max=v_max)
ob = context.object
ob.name = ob.data.name = "PovParametric"
ob.pov.object_as = "PARAMETRIC"
if not ob:
bpy.ops.mesh.primitive_xyz_function_surface(x_eq=x_eq, y_eq=y_eq, z_eq=z_eq, range_u_min=u_min, range_u_max=u_max, range_v_min=v_min, range_v_max=v_max)
ob = context.object
ob.name = ob.data.name = "PovParametric"
ob.pov.object_as = "PARAMETRIC"
ob.pov.u_min = u_min
ob.pov.u_max = u_max
ob.pov.v_min = v_min
ob.pov.v_max = v_max
ob.pov.x_eq = x_eq
ob.pov.y_eq = y_eq
ob.pov.z_eq = z_eq
ob.pov.u_min = u_min
ob.pov.u_max = u_max
ob.pov.v_min = v_min
ob.pov.v_max = v_max
ob.pov.x_eq = x_eq
ob.pov.y_eq = y_eq
ob.pov.z_eq = z_eq
bpy.ops.object.mode_set(mode="EDIT")
bpy.ops.mesh.hide(unselected=False)
bpy.ops.object.mode_set(mode="OBJECT")
bpy.ops.object.mode_set(mode="EDIT")
bpy.ops.mesh.hide(unselected=False)
bpy.ops.object.mode_set(mode="OBJECT")
class POVRAY_OT_parametric_add(bpy.types.Operator):
"""Add the representation of POV parametric surfaces using pov_parametric_define() function."""
bl_idname = "pov.addparametric"
bl_label = "Parametric"
bl_description = "Add Paramertic"
@ -1400,6 +1513,11 @@ class POVRAY_OT_parametric_add(bpy.types.Operator):
return {'FINISHED'}
class POVRAY_OT_parametric_update(bpy.types.Operator):
"""Update the representation of POV parametric surfaces.
Delete its previous proxy geometry and rerun pov_parametric_define() function
with the new parameters"""
bl_idname = "pov.parametric_update"
bl_label = "Update"
bl_description = "Update parametric object"
@ -1418,7 +1536,10 @@ class POVRAY_OT_parametric_update(bpy.types.Operator):
return {'FINISHED'}
#######################################################################
class POVRAY_OT_shape_polygon_to_circle_add(bpy.types.Operator):
"""Add the proxy mesh for POV Polygon to circle lofting macro"""
bl_idname = "pov.addpolygontocircle"
bl_label = "Polygon To Circle Blending"
bl_description = "Add Polygon To Circle Blending Surface"

View File

@ -40,6 +40,8 @@ from . import nodes # for POV specific nodes
##############################SF###########################
##############find image texture
def imageFormat(imgF):
"""Identify input image filetypes to transmit to POV."""
# First use the below explicit extensions to identify image file prospects
ext = {
'JPG': "jpeg",
'JPEG': "jpeg",
@ -54,7 +56,7 @@ def imageFormat(imgF):
'EXR': "exr",
'HDR': "hdr",
}.get(os.path.splitext(imgF)[-1].upper(), "")
# Then, use imghdr to really identify the filetype as it can be different
if not ext:
#maybe add a check for if path exists here?
print(" WARNING: texture image has no extension") #too verbose
@ -64,6 +66,7 @@ def imageFormat(imgF):
def imgMap(ts):
"""Translate mapping type from Blender UI to POV syntax and return that string."""
image_map = ""
if ts.mapping == 'FLAT':
image_map = "map_type 0 "
@ -72,7 +75,7 @@ def imgMap(ts):
elif ts.mapping == 'TUBE':
image_map = "map_type 2 "
## map_type 3 and 4 in development (?)
## map_type 3 and 4 in development (?) (ENV in pov 3.8)
## for POV-Ray, currently they just seem to default back to Flat (type 0)
#elif ts.mapping=="?":
# image_map = " map_type 3 "
@ -93,6 +96,7 @@ def imgMap(ts):
def imgMapTransforms(ts):
"""Translate mapping transformations from Blender UI to POV syntax and return that string."""
# XXX TODO: unchecked textures give error of variable referenced before assignment XXX
# POV-Ray "scale" is not a number of repetitions factor, but ,its
# inverse, a standard scale factor.
@ -126,6 +130,7 @@ def imgMapTransforms(ts):
return image_map_transforms
def imgMapBG(wts):
"""Translate world mapping from Blender UI to POV syntax and return that string."""
image_mapBG = ""
# texture_coords refers to the mapping of world textures:
if wts.texture_coords == 'VIEW' or wts.texture_coords == 'GLOBAL':
@ -150,6 +155,7 @@ def imgMapBG(wts):
def path_image(image):
"""Conform a path string to POV syntax to avoid POV errors."""
return bpy.path.abspath(image.filepath, library=image.library).replace("\\","/")
# .replace("\\","/") to get only forward slashes as it's what POV prefers,
# even on windows
@ -158,16 +164,24 @@ def path_image(image):
def string_strip_hyphen(name):
"""Remove hyphen characters from a string to avoid POV errors."""
return name.replace("-", "")
def safety(name, Level):
# safety string name material
#
# Level=1 is for texture with No specular nor Mirror reflection
# Level=2 is for texture with translation of spec and mir levels
# for when no map influences them
# Level=3 is for texture with Maximum Spec and Mirror
"""append suffix characters to names of various material declinations.
Material declinations are necessary to POV syntax and used in shading.py
by the povHasnoSpecularMaps function to create the finish map trick and
the suffixes avoid name collisions.
Keyword arguments:
name -- the initial material name as a string
Level -- the enum number of the Level being written:
Level=1 is for texture with No specular nor Mirror reflection
Level=2 is for texture with translation of spec and mir levels
for when no map influences them
Level=3 is for texture with Maximum Spec and Mirror
"""
try:
if int(name) > 0:
@ -293,6 +307,11 @@ def write_global_setting(scene,file):
file.write("}\n")
'''
def write_object_modifiers(scene,ob,File):
"""Translate some object level POV statements from Blender UI
to POV syntax and write to exported file """
# Maybe return that string to be added instead of directly written.
'''XXX WIP
onceCSG = 0
for mod in ob.modifiers:
@ -352,6 +371,7 @@ def write_object_modifiers(scene,ob,File):
def write_pov(filename, scene=None, info_callback=None):
"""Main export process from Blender UI to POV syntax and write to exported file """
import mathutils
#file = filename
file = open(filename, "w")
@ -390,6 +410,7 @@ def write_pov(filename, scene=None, info_callback=None):
tab = setTab(scene.pov.indentation_character, scene.pov.indentation_spaces)
if not scene.pov.tempfiles_enable:
def tabWrite(str_o):
"""Indent POV syntax from brackets levels and write to exported file """
global tabLevel
brackets = str_o.count("{") - str_o.count("}") + str_o.count("[") - str_o.count("]")
if brackets < 0:
@ -404,9 +425,12 @@ def write_pov(filename, scene=None, info_callback=None):
tabLevel = tabLevel + brackets
else:
def tabWrite(str_o):
"""write directly to exported file if user checked autonamed temp files (faster)."""
file.write(str_o)
def uniqueName(name, nameSeq):
"""Increment any generated POV name that could get identical to avoid collisions"""
if name not in nameSeq:
name = string_strip_hyphen(name)
@ -421,6 +445,8 @@ def write_pov(filename, scene=None, info_callback=None):
return name
def writeMatrix(matrix):
"""Translate some tranform matrix from Blender UI
to POV syntax and write to exported file """
tabWrite("matrix <%.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f>\n" %
(matrix[0][0], matrix[1][0], matrix[2][0],
matrix[0][1], matrix[1][1], matrix[2][1],
@ -428,6 +454,8 @@ def write_pov(filename, scene=None, info_callback=None):
matrix[0][3], matrix[1][3], matrix[2][3]))
def MatrixAsPovString(matrix):
"""Translate some tranform matrix from Blender UI
to POV syntax and return that string """
sMatrix = ("matrix <%.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f, %.6f>\n" %
(matrix[0][0], matrix[1][0], matrix[2][0],
matrix[0][1], matrix[1][1], matrix[2][1],
@ -436,7 +464,9 @@ def write_pov(filename, scene=None, info_callback=None):
return sMatrix
def writeObjectMaterial(material, ob):
"""Translate some object level material from Blender UI (VS data level)
to POV interior{} syntax and write it to exported file """
# DH - modified some variables to be function local, avoiding RNA write
# this should be checked to see if it is functionally correct
@ -517,6 +547,7 @@ def write_pov(filename, scene=None, info_callback=None):
DEF_MAT_NAME = "" #or "Default"?
def exportCamera():
"""Translate camera from Blender UI to POV syntax and write to exported file."""
camera = scene.camera
# DH disabled for now, this isn't the correct context
@ -572,6 +603,7 @@ def write_pov(filename, scene=None, info_callback=None):
def exportLamps(lamps):
"""Translate lights from Blender UI to POV syntax and write to exported file."""
# Incremented after each lamp export to declare its target
# currently used for Fresnel diffuse shader as their slope vector:
global lampCount
@ -691,6 +723,7 @@ def write_pov(filename, scene=None, info_callback=None):
####################################################################################################
def exportRainbows(rainbows):
"""write all POV rainbows primitives to exported file """
for ob in rainbows:
povdataname = ob.data.name #enough?
angle = degrees(ob.data.spot_size/2.5) #radians in blender (2
@ -758,6 +791,7 @@ def write_pov(filename, scene=None, info_callback=None):
################################XXX LOFT, ETC.
def exportCurves(scene, ob):
"""write all curves based POV primitives to exported file """
name_orig = "OB" + ob.name
dataname_orig = "DATA" + ob.data.name
@ -1621,7 +1655,7 @@ def write_pov(filename, scene=None, info_callback=None):
def exportMeta(metas):
"""write all POV blob primitives and Blender Metas to exported file """
# TODO - blenders 'motherball' naming is not supported.
if comments and len(metas) >= 1:
@ -1802,6 +1836,7 @@ def write_pov(filename, scene=None, info_callback=None):
DEF_OBJ_NAME = "Default"
def exportMeshes(scene, sel, csg):
"""write all meshes as POV mesh2{} syntax to exported file """
# obmatslist = []
# def hasUniqueMaterial():
# # Grab materials attached to object instances ...
@ -3318,6 +3353,7 @@ def write_pov(filename, scene=None, info_callback=None):
tabWrite("}\n")
def exportWorld(world):
"""write world as POV backgrounbd and sky_sphere to exported file """
render = scene.pov
camera = scene.camera
matrix = global_matrix @ camera.matrix_world
@ -3482,7 +3518,7 @@ def write_pov(filename, scene=None, info_callback=None):
tabWrite("}\n")
def exportGlobalSettings(scene):
"""write all POV global settings to exported file """
tabWrite("global_settings {\n")
tabWrite("assumed_gamma 1.0\n")
tabWrite("max_trace_level %d\n" % scene.pov.max_trace_level)
@ -3570,6 +3606,7 @@ def write_pov(filename, scene=None, info_callback=None):
tabWrite("}\n")
def exportCustomCode():
"""write all POV user defined custom code to exported file """
# Write CurrentAnimation Frame for use in Custom POV Code
file.write("#declare CURFRAMENUM = %d;\n" % bpy.context.scene.frame_current)
#Change path and uncomment to add an animated include file by hand:
@ -3708,6 +3745,7 @@ def write_pov(filename, scene=None, info_callback=None):
def write_pov_ini(scene, filename_ini, filename_log, filename_pov, filename_image):
"""Write ini file."""
feature_set = bpy.context.preferences.addons[__package__].preferences.branch_feature_set_povray
using_uberpov = (feature_set=='uberpov')
#scene = bpy.data.scenes[0]
@ -3782,6 +3820,7 @@ def write_pov_ini(scene, filename_ini, filename_log, filename_pov, filename_imag
class PovrayRender(bpy.types.RenderEngine):
"""Define the external renderer"""
bl_idname = 'POVRAY_RENDER'
bl_label = "Persitence Of Vision"
bl_use_shading_nodes_custom = False
@ -3789,6 +3828,7 @@ class PovrayRender(bpy.types.RenderEngine):
@staticmethod
def _locate_binary():
"""Identify POV engine"""
addon_prefs = bpy.context.preferences.addons[__package__].preferences
# Use the system preference if its set.
@ -3839,6 +3879,7 @@ class PovrayRender(bpy.types.RenderEngine):
return ""
def _export(self, depsgraph, povPath, renderImagePath):
"""gather all necessary output files paths user defined and auto generated and export there"""
import tempfile
scene = bpy.context.scene
if scene.pov.tempfiles_enable:
@ -3877,6 +3918,7 @@ class PovrayRender(bpy.types.RenderEngine):
else:
pass
def _render(self, depsgraph):
"""Export necessary files and render image."""
scene = bpy.context.scene
try:
os.remove(self._temp_file_out) # so as not to load the old file
@ -3927,6 +3969,7 @@ class PovrayRender(bpy.types.RenderEngine):
# Now that we have a valid process
def _cleanup(self):
"""Delete temp files and unpacked ones"""
for f in (self._temp_file_in, self._temp_file_ini, self._temp_file_out):
for i in range(5):
try:
@ -3946,6 +3989,7 @@ class PovrayRender(bpy.types.RenderEngine):
# and Windows does not know how to delete a file in use!
time.sleep(self.DELAY)
def render(self, depsgraph):
"""Export necessary files from text editor and render image."""
import tempfile
scene = bpy.context.scene
r = scene.render
@ -4340,6 +4384,7 @@ class PovrayRender(bpy.types.RenderEngine):
#################################Operators########################################
##################################################################################
class RenderPovTexturePreview(Operator):
"""Export only files necessary to texture preview and render image."""
bl_idname = "tex.preview_update"
bl_label = "Update preview"
def execute(self, context):
@ -4432,6 +4477,7 @@ class RenderPovTexturePreview(Operator):
return {'FINISHED'}
class RunPovTextRender(Operator):
"""Export files depending on text editor options and render image."""
bl_idname = "text.run"
bl_label = "Run"
bl_context = "text"

View File

@ -1,7 +1,9 @@
# For BI > POV shaders emulation
"""Translate complex shaders to exported POV textures."""
import bpy
def writeMaterial(using_uberpov, DEF_MAT_NAME, scene, tabWrite, safety, comments, uniqueName, materialNames, material):
"""Translate Blender material POV texture{} block and write to exported file."""
# Assumes only called once on each material
if material:
name_orig = material.name
@ -22,6 +24,7 @@ def writeMaterial(using_uberpov, DEF_MAT_NAME, scene, tabWrite, safety, comments
# Level=3 Means Maximum Spec and Mirror
def povHasnoSpecularMaps(Level):
"""Translate Blender specular map influence to POV finish map trick and write to file."""
if Level == 1:
if comments:
tabWrite("//--No specular nor Mirror reflection--\n")
@ -268,6 +271,11 @@ def writeMaterial(using_uberpov, DEF_MAT_NAME, scene, tabWrite, safety, comments
povHasnoSpecularMaps(Level=3)
def exportPattern(texture, string_strip_hyphen):
"""Translate Blender procedural textures to POV patterns and write to pov file.
Function Patterns can be used to better access sub components of a pattern like
grey values for influence mapping"""
tex=texture
pat = tex.pov
PATname = "PAT_%s"%string_strip_hyphen(bpy.path.clean_name(tex.name))
@ -752,6 +760,8 @@ def exportPattern(texture, string_strip_hyphen):
def writeTextureInfluence(mater, materialNames, LocalMaterialNames, path_image, lampCount,
imageFormat, imgMap, imgMapTransforms, tabWrite, comments,
string_strip_hyphen, safety, col, os, preview_dir, unpacked_images):
"""Translate Blender texture influences to various POV texture tricks and write to pov file."""
material_finish = materialNames[mater.name]
if mater.pov.use_transparency:
trans = 1.0 - mater.pov.alpha
@ -1233,6 +1243,7 @@ def string_strip_hyphen(name):
return name.replace("-", "")
# WARNING!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
def write_nodes(scene,povMatName,ntree,file):
"""translate Blender node trees to pov and write them to file"""
declareNodes=[]
scene=bpy.context.scene
for node in ntree.nodes:

View File

@ -17,7 +17,10 @@
# ##### END GPL LICENSE BLOCK #####
# <pep8 compliant>
"""update new variables to values from older API.
It does not have a UI and used to be found with F3 search field.
This file needs an update."""
import bpy
from bpy.props import (