Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaurice Raybaud <mauriceraybaud@hotmail.fr>2021-05-26 02:34:50 +0300
committerMaurice Raybaud <mauriceraybaud@hotmail.fr>2021-05-26 02:34:50 +0300
commitfad5186bb6880aadbb0cd9d983035c7890801aa7 (patch)
tree60e57ddcefbf423cde567e296e9128ace77e6ed3 /render_povray/object_properties.py
parent051d4f7d5951924015d7c2e6bddeb28fac229f1c (diff)
Formatting and fixes
* Moved: some existing functions into new separate files to improve code readability (detailed in __init__.py docstring) * Remove: max_intersections deprecated in pov 3.8 * Add: Validate utf-8 characters with specific API function at session's first script init * Add : Icons to some text fields and inviting labels * Change default camera normal perturbation value to non zero since its use is first driven by a boolean toggle * Change: lists (vectors and indices) are now exported in one line by default for better manual scene overview and debugging * Change: a couple of tooltips corrections * Change : renamed many variables and functions to snake_case according to recommanded style guides * Fix : Heightfield primitive (forward slashes were expected for displacement texture path) * Fix : Text nippet insertion operator * Fix : added console print tip to check executable path on failure to process * Fix : tweaked finished render say command for Linux * Fix : interface of some shader nodes broken since 2.8 api changes * Fix : export hair particles
Diffstat (limited to 'render_povray/object_properties.py')
-rwxr-xr-xrender_povray/object_properties.py670
1 files changed, 670 insertions, 0 deletions
diff --git a/render_povray/object_properties.py b/render_povray/object_properties.py
new file mode 100755
index 00000000..8cea49af
--- /dev/null
+++ b/render_povray/object_properties.py
@@ -0,0 +1,670 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+"""Declare object level properties controllable in UI and translated to POV"""
+import bpy
+from bpy.utils import register_class, unregister_class
+from bpy.types import PropertyGroup
+from bpy.props import (
+ BoolProperty,
+ IntProperty,
+ FloatProperty,
+ FloatVectorProperty,
+ StringProperty,
+ EnumProperty,
+ PointerProperty,
+)
+
+
+###############################################################################
+# Object POV properties.
+###############################################################################
+
+
+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",
+ precision=4,
+ step=0.01,
+ min=0,
+ soft_max=1,
+ default=(0.001, 0.001, 0.5),
+ options={"ANIMATABLE"},
+ subtype="XYZ",
+ )
+
+ # Importance sampling
+ importance_value: FloatProperty(
+ name="Radiosity Importance",
+ description="Priority value relative to other objects for sampling radiosity rays. "
+ "Increase to get more radiosity rays at comparatively small yet "
+ "bright objects",
+ min=0.01,
+ max=1.00,
+ default=0.50,
+ )
+
+ # Collect photons
+ collect_photons: BoolProperty(
+ name="Receive Photon Caustics",
+ description="Enable object to collect photons from other objects caustics. Turn "
+ "off for objects that don't really need to receive caustics (e.g. objects"
+ " that generate caustics often don't need to show any on themselves)",
+ default=True,
+ )
+
+ # Photons spacing_multiplier
+ spacing_multiplier: FloatProperty(
+ name="Photons Spacing Multiplier",
+ description="Multiplier value relative to global spacing of photons. "
+ "Decrease by half to get 4x more photons at surface of "
+ "this object (or 8x media photons than specified in the globals",
+ min=0.01,
+ max=1.00,
+ default=1.00,
+ )
+
+ ##################################CustomPOV Code############################
+ # Only DUMMIES below for now:
+ replacement_text: StringProperty(
+ name="Declared name:",
+ description="Type the declared name in custom POV code or an external .inc "
+ "it points at. Any POV shape expected e.g: isosurface {}",
+ default="",
+ )
+
+ #############POV specific object properties.############################
+ object_as: StringProperty(maxlen=1024)
+
+ imported_loc: FloatVectorProperty(
+ name="Imported Pov location", precision=6, default=(0.0, 0.0, 0.0)
+ )
+
+ imported_loc_cap: FloatVectorProperty(
+ name="Imported Pov location", precision=6, default=(0.0, 0.0, 2.0)
+ )
+
+ unlock_parameters: BoolProperty(name="Lock", default=False)
+
+ # not in UI yet but used for sor (lathe) / prism... pov primitives
+ curveshape: EnumProperty(
+ name="Povray Shape Type",
+ items=(
+ ("birail", "Birail", ""),
+ ("cairo", "Cairo", ""),
+ ("lathe", "Lathe", ""),
+ ("loft", "Loft", ""),
+ ("prism", "Prism", ""),
+ ("sphere_sweep", "Sphere Sweep", ""),
+ ),
+ default="sphere_sweep",
+ )
+
+ mesh_write_as: EnumProperty(
+ name="Mesh Write As",
+ items=(("blobgrid", "Blob Grid", ""), ("grid", "Grid", ""), ("mesh", "Mesh", "")),
+ default="mesh",
+ )
+
+ object_ior: FloatProperty(name="IOR", description="IOR", min=1.0, max=10.0, default=1.0)
+
+ # shape_as_light = StringProperty(name="Light",maxlen=1024)
+ # fake_caustics_power = FloatProperty(
+ # name="Power", description="Fake caustics power",
+ # min=0.0, max=10.0,default=0.0)
+ # target = BoolProperty(name="Target",description="",default=False)
+ # target_value = FloatProperty(
+ # name="Value", description="",
+ # min=0.0, max=1.0,default=1.0)
+ # refraction = BoolProperty(name="Refraction",description="",default=False)
+ # dispersion = BoolProperty(name="Dispersion",description="",default=False)
+ # dispersion_value = FloatProperty(
+ # name="Dispersion", description="Good values are 1.01 to 1.1. ",
+ # min=1.0, max=1.2,default=1.01)
+ # dispersion_samples = IntProperty(name="Samples",min=2, max=100,default=7)
+ # reflection = BoolProperty(name="Reflection",description="",default=False)
+ # pass_through = BoolProperty(name="Pass through",description="",default=False)
+ no_shadow: BoolProperty(name="No Shadow", default=False)
+
+ no_image: BoolProperty(name="No Image", default=False)
+
+ no_reflection: BoolProperty(name="No Reflection", default=False)
+
+ no_radiosity: BoolProperty(name="No Radiosity", default=False)
+
+ inverse: BoolProperty(name="Inverse", default=False)
+
+ sturm: BoolProperty(name="Sturm", default=False)
+
+ double_illuminate: BoolProperty(name="Double Illuminate", default=False)
+
+ hierarchy: BoolProperty(name="Hierarchy", default=False)
+
+ hollow: BoolProperty(name="Hollow", default=False)
+
+ boundorclip: EnumProperty(
+ name="Boundorclip",
+ items=(
+ ("none", "None", ""),
+ ("bounded_by", "Bounded_by", ""),
+ ("clipped_by", "Clipped_by", ""),
+ ),
+ default="none",
+ )
+
+ boundorclipob: StringProperty(maxlen=1024)
+
+ addboundorclip: BoolProperty(description="", default=False)
+
+ blob_threshold: FloatProperty(name="Threshold", min=0.00, max=10.0, default=0.6)
+
+ blob_strength: FloatProperty(name="Strength", min=-10.00, max=10.0, default=1.00)
+
+ res_u: IntProperty(name="U", min=100, max=1000, default=500)
+
+ res_v: IntProperty(name="V", min=100, max=1000, default=500)
+
+ contained_by: EnumProperty(
+ name="Contained by", items=(("box", "Box", ""), ("sphere", "Sphere", "")), default="box"
+ )
+
+ container_scale: FloatProperty(name="Container Scale", min=0.0, max=10.0, default=1.00)
+
+ threshold: FloatProperty(name="Threshold", min=0.0, max=10.0, default=0.00)
+
+ accuracy: FloatProperty(name="Accuracy", min=0.0001, max=0.1, default=0.001)
+
+ max_gradient: FloatProperty(name="Max Gradient", min=0.0, max=100.0, default=5.0)
+
+ all_intersections: BoolProperty(name="All Intersections", default=False)
+
+ max_trace: IntProperty(name="Max Trace", min=1, max=100, default=1)
+
+ ###########Cylinder
+ 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_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,
+ )
+
+ imported_cyl_loc: FloatVectorProperty(
+ name="Imported Pov location", precision=6, default=(0.0, 0.0, 0.0)
+ )
+
+ imported_cyl_loc_cap: FloatVectorProperty(
+ name="Imported Pov location", precision=6, default=(0.0, 0.0, 2.0)
+ )
+
+ ###########Sphere
+ 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
+ )
+
+ ###########Cone
+ 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,
+ )
+
+ cone_segments: IntProperty(
+ name="Segments",
+ description="Radial segmentation of proxy mesh",
+ default=16,
+ min=3,
+ max=265,
+ update=prop_update_cone,
+ )
+
+ cone_height: FloatProperty(
+ name="Height",
+ description="Height of the cone",
+ 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", description="", default=0.0, update=prop_update_parametric)
+
+ v_min: FloatProperty(name="V Min", description="", default=0.0, update=prop_update_parametric)
+
+ u_max: FloatProperty(name="U Max", description="", default=6.28, update=prop_update_parametric)
+
+ v_max: FloatProperty(name="V Max", description="", default=12.57, update=prop_update_parametric)
+
+ x_eq: StringProperty(
+ maxlen=1024, default="cos(v)*(1+cos(u))*sin(v/8)", update=prop_update_parametric
+ )
+
+ y_eq: StringProperty(
+ maxlen=1024, default="sin(u)*sin(v/8)+cos(v/8)*1.5", update=prop_update_parametric
+ )
+
+ z_eq: StringProperty(
+ maxlen=1024, default="sin(v)*(1+cos(u))*sin(v/8)", update=prop_update_parametric
+ )
+
+ ###########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(
+ name="Segments",
+ description="Radial segmentation of proxy mesh",
+ default=48,
+ min=3,
+ max=720,
+ update=prop_update_torus,
+ )
+
+ torus_minor_segments: IntProperty(
+ name="Segments",
+ description="Cross-section segmentation of proxy mesh",
+ default=12,
+ min=3,
+ max=720,
+ update=prop_update_torus,
+ )
+
+ torus_major_radius: FloatProperty(
+ name="Major radius",
+ description="Major radius",
+ min=0.00,
+ max=100.00,
+ default=1.0,
+ update=prop_update_torus,
+ )
+
+ torus_minor_radius: FloatProperty(
+ name="Minor radius",
+ description="Minor radius",
+ min=0.00,
+ max=100.00,
+ default=0.25,
+ update=prop_update_torus,
+ )
+
+ ###########Rainbow
+ arc_angle: FloatProperty(
+ name="Arc angle",
+ description="The angle of the raynbow arc in degrees",
+ default=360,
+ min=0.01,
+ max=360.0,
+ )
+
+ falloff_angle: FloatProperty(
+ name="Falloff angle",
+ description="The angle after which rainbow dissolves into background",
+ default=360,
+ min=0.0,
+ max=360,
+ )
+
+ ###########HeightFields
+
+ quality: IntProperty(name="Quality", description="", default=100, min=1, max=100)
+
+ hf_filename: StringProperty(maxlen=1024)
+
+ hf_gamma: FloatProperty(name="Gamma", description="Gamma", min=0.0001, max=20.0, default=1.0)
+
+ hf_premultiplied: BoolProperty(name="Premultiplied", description="Premultiplied", default=True)
+
+ hf_smooth: BoolProperty(name="Smooth", description="Smooth", default=False)
+
+ hf_water: FloatProperty(
+ name="Water Level", description="Wather Level", min=0.00, max=1.00, default=0.0
+ )
+
+ hf_hierarchy: BoolProperty(name="Hierarchy", description="Height field hierarchy", default=True)
+
+ ##############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(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,
+ update=prop_update_superellipsoid,
+ )
+
+ se_v: IntProperty(
+ name="V-segments",
+ description="lateral segmentation",
+ default=20,
+ min=4,
+ max=265,
+ update=prop_update_superellipsoid,
+ )
+
+ se_n1: FloatProperty(
+ name="Ring manipulator",
+ description="Manipulates the shape of the Ring",
+ default=1.0,
+ min=0.01,
+ max=100.0,
+ update=prop_update_superellipsoid,
+ )
+
+ se_n2: FloatProperty(
+ name="Cross manipulator",
+ description="Manipulates the shape of the cross-section",
+ default=1.0,
+ min=0.01,
+ max=100.0,
+ update=prop_update_superellipsoid,
+ )
+
+ se_edit: EnumProperty(
+ items=[("NOTHING", "Nothing", ""), ("NGONS", "N-Gons", ""), ("TRIANGLES", "Triangles", "")],
+ name="Fill up and down",
+ description="",
+ default="TRIANGLES",
+ update=prop_update_superellipsoid,
+ )
+
+ #############Used for loft but also Superellipsoid, etc.
+ curveshape: EnumProperty(
+ name="Povray Shape Type",
+ items=(
+ ("birail", "Birail", ""),
+ ("cairo", "Cairo", ""),
+ ("lathe", "Lathe", ""),
+ ("loft", "Loft", ""),
+ ("prism", "Prism", ""),
+ ("sphere_sweep", "Sphere Sweep", ""),
+ ("sor", "Surface of Revolution", ""),
+ ),
+ default="sphere_sweep",
+ )
+
+ #############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(
+ name="Major radius",
+ description="Major radius",
+ min=0.00,
+ max=100.00,
+ default=1.0,
+ update=prop_update_supertorus,
+ )
+
+ st_minor_radius: FloatProperty(
+ name="Minor radius",
+ description="Minor radius",
+ min=0.00,
+ max=100.00,
+ default=0.25,
+ update=prop_update_supertorus,
+ )
+
+ st_ring: FloatProperty(
+ name="Ring",
+ description="Ring manipulator",
+ min=0.0001,
+ max=100.00,
+ default=1.00,
+ update=prop_update_supertorus,
+ )
+
+ st_cross: FloatProperty(
+ name="Cross",
+ description="Cross manipulator",
+ min=0.0001,
+ max=100.00,
+ default=1.00,
+ update=prop_update_supertorus,
+ )
+
+ st_accuracy: FloatProperty(
+ name="Accuracy", description="Supertorus accuracy", min=0.00001, max=1.00, default=0.001
+ )
+
+ st_max_gradient: FloatProperty(
+ name="Gradient",
+ description="Max gradient",
+ min=0.0001,
+ max=100.00,
+ default=10.00,
+ update=prop_update_supertorus,
+ )
+
+ st_R: FloatProperty(
+ name="big radius",
+ description="The radius inside the tube",
+ default=1.0,
+ min=0.01,
+ max=100.0,
+ update=prop_update_supertorus,
+ )
+
+ st_r: FloatProperty(
+ name="small radius",
+ description="The radius of the tube",
+ default=0.3,
+ min=0.01,
+ max=100.0,
+ update=prop_update_supertorus,
+ )
+
+ st_u: IntProperty(
+ name="U-segments",
+ description="radial segmentation",
+ default=16,
+ min=3,
+ max=265,
+ update=prop_update_supertorus,
+ )
+
+ st_v: IntProperty(
+ name="V-segments",
+ description="lateral segmentation",
+ default=8,
+ min=3,
+ max=265,
+ update=prop_update_supertorus,
+ )
+
+ st_n1: FloatProperty(
+ name="Ring manipulator",
+ description="Manipulates the shape of the Ring",
+ default=1.0,
+ min=0.01,
+ max=100.0,
+ update=prop_update_supertorus,
+ )
+
+ st_n2: FloatProperty(
+ name="Cross manipulator",
+ description="Manipulates the shape of the cross-section",
+ default=1.0,
+ min=0.01,
+ max=100.0,
+ update=prop_update_supertorus,
+ )
+
+ st_ie: BoolProperty(
+ name="Use Int.+Ext. radii",
+ description="Use internal and external radii",
+ default=False,
+ update=prop_update_supertorus,
+ )
+
+ st_edit: BoolProperty(
+ name="", description="", default=False, options={"HIDDEN"}, update=prop_update_supertorus
+ )
+
+ ########################Loft
+ loft_n: IntProperty(
+ name="Segments", description="Vertical segments", default=16, min=3, max=720
+ )
+
+ loft_rings_bottom: IntProperty(
+ name="Bottom", description="Bottom rings", default=5, min=2, max=100
+ )
+
+ loft_rings_side: IntProperty(name="Side", description="Side rings", default=10, min=2, max=100)
+
+ loft_thick: FloatProperty(
+ name="Thickness",
+ description="Manipulates the shape of the Ring",
+ default=0.3,
+ min=0.01,
+ max=1.0,
+ )
+
+ loft_r: FloatProperty(name="Radius", description="Radius", default=1, min=0.01, max=10)
+
+ loft_height: FloatProperty(
+ name="Height",
+ description="Manipulates the shape of the Ring",
+ default=2,
+ min=0.01,
+ max=10.0,
+ )
+
+ ###################Prism
+ prism_n: IntProperty(name="Sides", description="Number of sides", default=5, min=3, max=720)
+
+ prism_r: FloatProperty(name="Radius", description="Radius", default=1.0)
+
+ ##################Isosurface
+ iso_function_text: StringProperty(
+ name="Function Text", maxlen=1024
+ ) # ,update=iso_props_update_callback)
+
+ ##################PolygonToCircle
+ polytocircle_resolution: IntProperty(
+ name="Resolution", description="", default=3, min=0, max=256
+ )
+
+ polytocircle_ngon: IntProperty(name="NGon", description="", min=3, max=64, default=5)
+
+ polytocircle_ngonR: FloatProperty(name="NGon Radius", description="", default=0.3)
+
+ polytocircle_circleR: FloatProperty(name="Circle Radius", description="", default=1.0)
+
+ ###############################################################################
+ # Modifiers POV properties.
+ ###############################################################################
+ # class RenderPovSettingsModifier(PropertyGroup):
+ boolean_mod: EnumProperty(
+ name="Operation",
+ description="Choose the type of calculation for Boolean modifier",
+ items=(
+ ("BMESH", "Use the BMesh Boolean Solver", ""),
+ ("CARVE", "Use the Carve Boolean Solver", ""),
+ ("POV", "Use POV Constructive Solid Geometry", ""),
+ ),
+ default="BMESH",
+ )
+
+ #################Avogadro
+ # filename_ext = ".png"
+
+ # filter_glob = StringProperty(
+ # default="*.exr;*.gif;*.hdr;*.iff;*.jpeg;*.jpg;*.pgm;*.png;*.pot;*.ppm;*.sys;*.tga;*.tiff;*.EXR;*.GIF;*.HDR;*.IFF;*.JPEG;*.JPG;*.PGM;*.PNG;*.POT;*.PPM;*.SYS;*.TGA;*.TIFF",
+ # options={'HIDDEN'},
+ # )
+
+
+classes = (RenderPovSettingsObject,)
+
+
+def register():
+ for cls in classes:
+ register_class(cls)
+ bpy.types.Object.pov = PointerProperty(type=RenderPovSettingsObject)
+
+
+def unregister():
+ del bpy.types.Object.pov
+ for cls in reversed(classes):
+ unregister_class(cls)