[Bf-extensions-cvs] [77a5597] master: separated pov native primitives to this other python file with operators for import and export.
Maurice Raybaud
noreply at git.blender.org
Mon Dec 28 19:02:38 CET 2015
Commit: 77a55970d67fef57b6557e9c969a184b59eb3a23
Author: Maurice Raybaud
Date: Mon Dec 28 19:02:16 2015 +0100
Branches: master
https://developer.blender.org/rBA77a55970d67fef57b6557e9c969a184b59eb3a23
separated pov native primitives to this other python file with operators for import and export.
===================================================================
A render_povray/primitives.py
===================================================================
diff --git a/render_povray/primitives.py b/render_povray/primitives.py
new file mode 100644
index 0000000..c668ed2
--- /dev/null
+++ b/render_povray/primitives.py
@@ -0,0 +1,1494 @@
+############ To get POV-Ray specific objects In and Out of Blender ###########
+
+import bpy
+#from . import render
+#from render import POVRAY_RENDER
+from bpy_extras.io_utils import ImportHelper
+from bpy_extras import object_utils
+from math import atan, pi, degrees, sqrt, cos, sin
+
+
+from bpy.props import (
+ StringProperty,
+ BoolProperty,
+ IntProperty,
+ FloatProperty,
+ FloatVectorProperty,
+ EnumProperty,
+ PointerProperty,
+ CollectionProperty,
+ )
+
+
+def pov_define_mesh(mesh, verts, edges, faces, name, hide_geometry=True):
+ if mesh is None:
+ mesh = bpy.data.meshes.new(name)
+ mesh.from_pydata(verts, edges, faces)
+ mesh.update()
+ mesh.validate(False) # Set it to True to see debug messages (helps ensure you generate valid geometry).
+ if hide_geometry:
+ mesh.vertices.foreach_set("hide", [True] * len(mesh.vertices))
+ mesh.edges.foreach_set("hide", [True] * len(mesh.edges))
+ mesh.polygons.foreach_set("hide", [True] * len(mesh.polygons))
+ return mesh
+
+
+class POVRAY_OT_lathe_add(bpy.types.Operator):
+ bl_idname = "pov.addlathe"
+ bl_label = "Lathe"
+ bl_options = {'REGISTER','UNDO'}
+ bl_description = "adds lathe"
+
+
+ def execute(self, context):
+ layers=[False]*20
+ layers[0]=True
+ bpy.ops.curve.primitive_bezier_curve_add(location=(0, 0, 0),
+ rotation=(0, 0, 0), layers=layers)
+ ob=context.scene.objects.active
+ ob.name = ob.data.name = "PovLathe"
+ ob.pov.object_as='LATHE'
+ bpy.ops.object.mode_set(mode='EDIT')
+ self.report({'WARNING'}, "This native POV-Ray primitive "
+ "won't have any vertex to show in edit mode")
+ bpy.ops.transform.rotate(value=-pi/2, axis=(0, 0, 1))
+ bpy.ops.object.mode_set(mode='OBJECT')
+ ob.pov.curveshape = "lathe"
+ bpy.ops.object.modifier_add(type='SCREW')
+ bpy.context.object.modifiers["Screw"].axis = 'Y'
+ bpy.context.object.modifiers["Screw"].show_render = False
+ return {'FINISHED'}
+
+
+
+def pov_superellipsoid_define(context, op, ob):
+
+ 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
+
+ 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
+
+ verts = []
+ r=1
+
+ 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))
+
+ 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)
+ 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 not ob:
+ ob_base = object_utils.object_data_add(context, mesh, operator=None)
+ ob = ob_base.object
+ #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
+
+ 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):
+ bl_idname = "pov.addsuperellipsoid"
+ bl_label = "Add SuperEllipsoid"
+ bl_description = "Create a SuperEllipsoid"
+ bl_options = {'REGISTER', 'UNDO'}
+ COMPAT_ENGINES = {'POVRAY_RENDER'}
+
+ # XXX Keep it in sync with __init__'s RenderPovSettingsConePrimitive
+ # If someone knows how to define operators' props from a func, I'd be delighted to learn it!
+ se_param1 = FloatProperty(
+ name="Parameter 1",
+ description="",
+ min=0.00, max=10.0, default=0.04)
+
+ se_param2 = FloatProperty(
+ name="Parameter 2",
+ description="",
+ min=0.00, max=10.0, default=0.04)
+
+ se_u = IntProperty(name = "U-segments",
+ description = "radial segmentation",
+ default = 20, min = 4, max = 265)
+ se_v = IntProperty(name = "V-segments",
+ description = "lateral segmentation",
+ default = 20, min = 4, max = 265)
+ se_n1 = FloatProperty(name = "Ring manipulator",
+ description = "Manipulates the shape of the Ring",
+ default = 1.0, min = 0.01, max = 100.0)
+ se_n2 = FloatProperty(name = "Cross manipulator",
+ description = "Manipulates the shape of the cross-section",
+ default = 1.0, min = 0.01, max = 100.0)
+ se_edit = EnumProperty(items=[("NOTHING", "Nothing", ""),
+ ("NGONS", "N-Gons", ""),
+ ("TRIANGLES", "Triangles", "")],
+ name="Fill up and down",
+ description="",
+ default='TRIANGLES')
+
+ @classmethod
+ def poll(cls, context):
+ engine = context.scene.render.engine
+ return (engine in cls.COMPAT_ENGINES)
+
+ def execute(self,context):
+ pov_superellipsoid_define(context, self, None)
+
+ self.report({'WARNING'}, "This native POV-Ray primitive won't have any vertex to show in edit mode")
+
+ return {'FINISHED'}
+
+class POVRAY_OT_superellipsoid_update(bpy.types.Operator):
+ bl_idname = "pov.superellipsoid_update"
+ bl_label = "Update"
+ bl_description = "Update Superellipsoid"
+ bl_options = {'REGISTER', 'UNDO'}
+ COMPAT_ENGINES = {'POVRAY_RENDER'}
+
+ @classmethod
+ def poll(cls, context):
+ engine = context.scene.render.engine
+ ob = context.object
+ return (ob and ob.data and ob.type == 'MESH' and engine in cls.COMPAT_ENGINES)
+
+ def execute(self, context):
+ 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.object.mode_set(mode="OBJECT")
+
+ pov_superellipsoid_define(context, None, context.object)
+
+ return {'FINISHED'}
+
+def createFaces(vertIdx1, vertIdx2, closed=False, flipped=False):
+ faces = []
+ if not vertIdx1 or not vertIdx2:
+ return None
+ if len(vertIdx1) < 2 and len(vertIdx2) < 2:
+ return None
+ fan = False
+ if (len(vertIdx1) != len(vertIdx2)):
+ if (len(vertIdx1) == 1 and len(vertIdx2) > 1):
+ fan = True
+ else:
+ return None
+ total = len(vertIdx2)
+ if closed:
+ if flipped:
+ face = [
+ vertIdx1[0],
+ vertIdx2[0],
+ vertIdx2[total - 1]]
+ if not fan:
+ face.append(vertIdx1[total - 1])
+ faces.append(face)
+
+ else:
+ face = [vertIdx2[0], vertIdx1[0]]
+ if not fan:
+ face.append(vertIdx1[total - 1])
+ face.append(vertIdx2[total - 1])
+ faces.append(face)
+ for num in range
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list