diff options
author | Maurice Raybaud <mauriceraybaud@hotmail.fr> | 2021-05-26 02:34:50 +0300 |
---|---|---|
committer | Maurice Raybaud <mauriceraybaud@hotmail.fr> | 2021-05-26 02:34:50 +0300 |
commit | fad5186bb6880aadbb0cd9d983035c7890801aa7 (patch) | |
tree | 60e57ddcefbf423cde567e296e9128ace77e6ed3 /render_povray/object_properties.py | |
parent | 051d4f7d5951924015d7c2e6bddeb28fac229f1c (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-x | render_povray/object_properties.py | 670 |
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) |