diff --git a/render_povray/__init__.py b/render_povray/__init__.py index a5a152d2a58546d90fc271c7efc2e6fbb5729e03..3b5980f0d3ffac9f1b008a16e6f9d007e872562b 100644 --- a/render_povray/__init__.py +++ b/render_povray/__init__.py @@ -23,7 +23,7 @@ bl_info = { "author": "Campbell Barton, Silvio Falcinelli, Maurice Raybaud, " "Constantin Rahn, Bastien Montagne, Leonid Desyatkov", "version": (0, 1, 0), - "blender": (2, 79, 0), + "blender": (2, 80, 0), "location": "Render > Engine > POV-Ray 3.7", "description": "Basic POV-Ray 3.7 integration for blender", "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/" @@ -40,6 +40,7 @@ if "bpy" in locals(): else: import bpy + from bpy.utils import register_class #import addon_utils # To use some other addons import nodeitems_utils #for Nodes from nodeitems_utils import NodeCategory, NodeItem #for Nodes @@ -2224,8 +2225,64 @@ class RenderPovSettingsCamera(PropertyGroup): "it points at. camera {} expected", default="") +############################################################################### +# World POV properties. +############################################################################### +class RenderPovSettingsWorld(PropertyGroup): + use_sky_blend: BoolProperty( + name="Blend Sky", description="Render background with natural progression from horizon to zenith", + default=False) + use_sky_paper: BoolProperty( + name="Blend Sky", description="Flatten blend or texture coordinates", + default=False) + use_sky_real: BoolProperty( + name="Blend Sky", description="Render background with a real horizon, relative to the camera angle", + default=False) + + horizon_color: FloatVectorProperty( + name="Horizon Color", + description="Color at the horizon", + precision=4, step=0.01, min=0, soft_max=1, + default=(0.0, 0.0, 0.0), options={'ANIMATABLE'}, subtype='COLOR', + ) + zenith_color: FloatVectorProperty( + name="Zenith Color", + description="Color at the zenith", + precision=4, step=0.01, min=0, soft_max=1, + default=(0.0, 0.0, 0.0), options={'ANIMATABLE'}, subtype='COLOR', + ) + ambient_color: FloatVectorProperty( + name="Ambient Color", + description="Ambient color of the world", + precision=4, step=0.01, min=0, soft_max=1, + default=(0.0, 0.0, 0.0), options={'ANIMATABLE'}, subtype='COLOR', + ) +''' +class WORLD_PT_POV_world(WorldButtonsPanel, Panel): + bl_label = "World" + #COMPAT_ENGINES = {'BLENDER_RENDER'} + + def draw(self, context): + layout = self.layout + + world = context.world + row = layout.row() + row.prop(world, "use_sky_paper") + row.prop(world, "use_sky_blend") + row.prop(world, "use_sky_real") + row = layout.row() + row.column().prop(world, "horizon_color") + col = row.column() + col.prop(world, "zenith_color") + col.active = world.use_sky_blend + row.column().prop(world, "ambient_color") + + row = layout.row() + row.prop(world, "exposure") + row.prop(world, "color_range") +''' ############################################################################### # Text POV properties. ############################################################################### @@ -2273,19 +2330,35 @@ class PovrayPreferences(AddonPreferences): def register(): - bpy.utils.register_module(__name__) - bpy.types.VIEW3D_MT_add.prepend(ui.menu_func_add) - bpy.types.TOPBAR_MT_file_import.append(ui.menu_func_import) - bpy.types.TEXT_MT_templates.append(ui.menu_func_templates) - bpy.types.RENDER_PT_povray_radiosity.prepend(ui.rad_panel_func) - bpy.types.LIGHT_PT_POV_light.prepend(ui.light_panel_func) - bpy.types.WORLD_PT_world.prepend(ui.world_panel_func) - # was used for parametric objects but made the other addon unreachable on - # unregister for other tools to use created a user action call instead - #addon_utils.enable("add_mesh_extra_objects", default_set=False, persistent=True) - - #bpy.types.TEXTURE_PT_context_texture.prepend(TEXTURE_PT_povray_type) + #bpy.utils.register_module(__name__) #DEPRECATED Now imported from bpy.utils import register_class + + render.register() + ui.register() + primitives.register() + nodes.register() + + register_class(PovrayPreferences) + register_class(RenderPovSettingsCamera) + register_class(RenderPovSettingsWorld) + register_class(RenderPovSettingsMaterial) + register_class(RenderPovSettingsObject) + register_class(RenderPovSettingsScene) + register_class(RenderPovSettingsText) + register_class(RenderPovSettingsTexture) + ''' + bpy.types.VIEW3D_MT_add.prepend(ui.menu_func_add) + bpy.types.TOPBAR_MT_file_import.append(ui.menu_func_import) + bpy.types.TEXT_MT_templates.append(ui.menu_func_templates) + bpy.types.RENDER_PT_povray_radiosity.prepend(ui.rad_panel_func) + bpy.types.LIGHT_PT_POV_light.prepend(ui.light_panel_func) + bpy.types.WORLD_PT_world.prepend(ui.world_panel_func) + # was used for parametric objects but made the other addon unreachable on + # unregister for other tools to use created a user action call instead + #addon_utils.enable("add_mesh_extra_objects", default_set=False, persistent=True) + + #bpy.types.TEXTURE_PT_context_texture.prepend(TEXTURE_PT_povray_type) + ''' bpy.types.NODE_HT_header.append(ui.menu_func_nodes) nodeitems_utils.register_node_categories("POVRAYNODES", node_categories) bpy.types.Scene.pov = PointerProperty(type=RenderPovSettingsScene) @@ -2294,6 +2367,7 @@ def register(): bpy.types.Texture.pov = PointerProperty(type=RenderPovSettingsTexture) bpy.types.Object.pov = PointerProperty(type=RenderPovSettingsObject) bpy.types.Camera.pov = PointerProperty(type=RenderPovSettingsCamera) + bpy.types.World.pov = PointerProperty(type=RenderPovSettingsWorld) bpy.types.Text.pov = PointerProperty(type=RenderPovSettingsText) @@ -2305,19 +2379,21 @@ def unregister(): del bpy.types.Texture.pov del bpy.types.Object.pov del bpy.types.Camera.pov + del bpy.types.World.pov del bpy.types.Text.pov nodeitems_utils.unregister_node_categories("POVRAYNODES") bpy.types.NODE_HT_header.remove(ui.menu_func_nodes) - + ''' #bpy.types.TEXTURE_PT_context_texture.remove(TEXTURE_PT_povray_type) #addon_utils.disable("add_mesh_extra_objects", default_set=False) - bpy.types.WORLD_PT_world.remove(ui.world_panel_func) + bpy.types.WORLD_PT_POV_world.remove(ui.world_panel_func) bpy.types.LIGHT_PT_POV_light.remove(ui.light_panel_func) bpy.types.RENDER_PT_povray_radiosity.remove(ui.rad_panel_func) bpy.types.TEXT_MT_templates.remove(ui.menu_func_templates) bpy.types.TOPBAR_MT_file_import.remove(ui.menu_func_import) bpy.types.VIEW3D_MT_add.remove(ui.menu_func_add) - bpy.utils.unregister_module(__name__) + ''' + #bpy.utils.unregister_module(__name__) if __name__ == "__main__": diff --git a/render_povray/nodes.py b/render_povray/nodes.py index ed31df902d1ea78ae6433692fe2a2c4b5d37e2fb..61e59c162d293df32d599f651dc84c9b33ed7639 100644 --- a/render_povray/nodes.py +++ b/render_povray/nodes.py @@ -20,9 +20,8 @@ import bpy +from bpy.utils import register_class from bpy.types import Node, ShaderNodeTree, CompositorNodeTree, TextureNodeTree#, NodeSocket - - from bpy.props import ( StringProperty, BoolProperty, @@ -1305,3 +1304,59 @@ class UpdatePreviewKey(bpy.types.Operator): map = conf.keymaps[mapstr] map.keymap_items.new("node.updatepreview",type='RIGHTMOUSE',value="PRESS") return {'FINISHED'} + +classes = ( + ObjectNodeTree, + PovrayOutputNode, + PovrayTextureNode, + PovrayFinishNode, + PovrayDiffuseNode, + PovrayPhongNode, + PovraySpecularNode, + PovrayMirrorNode, + PovrayAmbientNode, + PovrayIridescenceNode, + PovraySubsurfaceNode, + PovrayMappingNode, + PovrayMultiplyNode, + PovrayTransformNode, + PovrayValueNode, + PovrayModifierNode, + PovrayPigmentNode, + PovrayColorImageNode, + PovrayBumpMapNode, + PovrayImagePatternNode, + ShaderPatternNode, + ShaderTextureMapNode, + ShaderNormalMapNode, + ShaderNormalMapEntryNode, + IsoPropsNode, + PovrayFogNode, + PovraySlopeNode, + TextureOutputNode, + NODE_OT_iso_add, + NODE_OT_map_create, + NODE_OT_povray_node_texture_map_add, + NODE_OT_povray_node_output_add, + NODE_OT_povray_node_layered_add, + NODE_OT_povray_input_add, + NODE_OT_povray_input_remove, + NODE_OT_povray_image_open, + PovrayPatternNode, + UpdatePreviewMaterial, + UpdatePreviewKey, +) + + +def register(): + #from bpy.utils import register_class + + for cls in classes: + register_class(cls) + + +def unregister(): + from bpy.utils import unregister_class + + for cls in classes: + unregister_class(cls) \ No newline at end of file diff --git a/render_povray/primitives.py b/render_povray/primitives.py index ffdd6cd968e87e4115bbb569db341e3de39a7b1e..f9d3cd3992ead16bdf47f5af36ca408638c1fe10 100644 --- a/render_povray/primitives.py +++ b/render_povray/primitives.py @@ -24,6 +24,7 @@ import bpy import os.path from bpy_extras.io_utils import ImportHelper from bpy_extras import object_utils +from bpy.utils import register_class from math import atan, pi, degrees, sqrt, cos, sin @@ -1915,3 +1916,47 @@ class ImportPOV(bpy.types.Operator, ImportHelper): # track.up_axis = "UP_Y" # obj.location = (0,0,0) return {'FINISHED'} + +classes = ( + POVRAY_OT_lathe_add, + POVRAY_OT_superellipsoid_add, + POVRAY_OT_superellipsoid_update, + POVRAY_OT_supertorus_add, + POVRAY_OT_supertorus_update, + POVRAY_OT_loft_add, + POVRAY_OT_plane_add, + POVRAY_OT_box_add, + POVRAY_OT_cylinder_add, + POVRAY_OT_cylinder_update, + POVRAY_OT_sphere_add, + POVRAY_OT_sphere_update, + POVRAY_OT_cone_add, + POVRAY_OT_cone_update, + POVRAY_OT_isosurface_box_add, + POVRAY_OT_isosurface_sphere_add, + POVRAY_OT_sphere_sweep_add, + POVRAY_OT_blob_add, + POVRAY_OT_rainbow_add, + POVRAY_OT_height_field_add, + POVRAY_OT_torus_add, + POVRAY_OT_torus_update, + POVRAY_OT_prism_add, + POVRAY_OT_parametric_add, + POVRAY_OT_parametric_update, + POVRAY_OT_shape_polygon_to_circle_add, + ImportPOV, +) + + +def register(): + #from bpy.utils import register_class + + for cls in classes: + register_class(cls) + + +def unregister(): + from bpy.utils import unregister_class + + for cls in classes: + unregister_class(cls) diff --git a/render_povray/render.py b/render_povray/render.py index 2724b4af4da652efc044a104ad4971a4a0b2389f..126e6d271f16577732cfef7aa9178490537d0dc1 100644 --- a/render_povray/render.py +++ b/render_povray/render.py @@ -31,6 +31,7 @@ import subprocess# import tempfile #generate temporary files with random names from bpy.types import(Operator) from imghdr import what #imghdr is a python lib to identify image file types +from bpy.utils import register_class from . import df3 # for smoke rendering from . import shading # for BI POV haders emulation @@ -4400,3 +4401,24 @@ class RunPovTextRender(Operator): #empty text name property engain scene.pov.text_block = "" return {'FINISHED'} + + +classes = ( + PovrayRender, + RenderPovTexturePreview, + RunPovTextRender, +) + + +def register(): + #from bpy.utils import register_class + + for cls in classes: + register_class(cls) + + +def unregister(): + from bpy.utils import unregister_class + + for cls in classes: + unregister_class(cls) diff --git a/render_povray/ui.py b/render_povray/ui.py index 28cb81f481680ea7fda36cbdfdca4d3e913a82d2..12db23f6833db77fc531eae1896050b2a851b8ae 100644 --- a/render_povray/ui.py +++ b/render_povray/ui.py @@ -23,23 +23,43 @@ import sys #really import here and in render.py? import os #really import here and in render.py? from os.path import isfile from bl_operators.presets import AddPresetBase +from bpy.utils import register_class + +# Example of wrapping every class 'as is' +from bl_ui import properties_output +for member in dir(properties_output): + subclass = getattr(properties_output, member) + try: + subclass.COMPAT_ENGINES.add('POVRAY') + except: + pass +del properties_output + +from bl_ui import properties_view_layer +for member in dir(properties_view_layer): + subclass = getattr(properties_view_layer, member) + try: + subclass.COMPAT_ENGINES.add('POVRAY') + except: + pass +del properties_view_layer # Use some of the existing buttons. from bl_ui import properties_render -properties_render.RENDER_PT_render.COMPAT_ENGINES.add('POVRAY_RENDER') -properties_render.RENDER_PT_dimensions.COMPAT_ENGINES.add('POVRAY_RENDER') +#DEPRECATED#properties_render.RENDER_PT_render.COMPAT_ENGINES.add('POVRAY_RENDER') +#DEPRECATED#properties_render.RENDER_PT_dimensions.COMPAT_ENGINES.add('POVRAY_RENDER') # properties_render.RENDER_PT_antialiasing.COMPAT_ENGINES.add('POVRAY_RENDER') -properties_render.RENDER_PT_shading.COMPAT_ENGINES.add('POVRAY_RENDER') -properties_render.RENDER_PT_output.COMPAT_ENGINES.add('POVRAY_RENDER') +#TORECREATE##DEPRECATED#properties_render.RENDER_PT_shading.COMPAT_ENGINES.add('POVRAY_RENDER') +#DEPRECATED#properties_render.RENDER_PT_output.COMPAT_ENGINES.add('POVRAY_RENDER') del properties_render # Use only a subset of the world panels from bl_ui import properties_world -properties_world.WORLD_PT_preview.COMPAT_ENGINES.add('POVRAY_RENDER') +#TORECREATE##DEPRECATED#properties_world.WORLD_PT_preview.COMPAT_ENGINES.add('POVRAY_RENDER') properties_world.WORLD_PT_context_world.COMPAT_ENGINES.add('POVRAY_RENDER') -properties_world.WORLD_PT_world.COMPAT_ENGINES.add('POVRAY_RENDER') -properties_world.WORLD_PT_mist.COMPAT_ENGINES.add('POVRAY_RENDER') +#TORECREATE##DEPRECATED#properties_world.WORLD_PT_world.COMPAT_ENGINES.add('POVRAY_RENDER') +#TORECREATE##DEPRECATED#properties_world.WORLD_PT_mist.COMPAT_ENGINES.add('POVRAY_RENDER') del properties_world class POV_WORLD_MT_presets(bpy.types.Menu): @@ -83,15 +103,6 @@ class AddPresetWorld(AddPresetBase, bpy.types.Operator): # where to store the preset preset_subdir = "pov/world" -# Draw into an existing panel -def world_panel_func(self, context): - layout = self.layout - - row = layout.row(align=True) - row.menu(POV_WORLD_MT_presets.__name__, text=POV_WORLD_MT_presets.bl_label) - row.operator(AddPresetWorld.bl_idname, text="", icon='ZOOMIN') - row.operator(AddPresetWorld.bl_idname, text="", icon='ZOOMOUT').remove_active = True - classes = ( POV_WORLD_MT_presets, @@ -543,15 +554,15 @@ def light_panel_func(self, context): row = layout.row(align=True) row.menu(POV_LIGHT_MT_presets.__name__, text=POV_LIGHT_MT_presets.bl_label) - row.operator(AddPresetLamp.bl_idname, text="", icon='ZOOMIN') - row.operator(AddPresetLamp.bl_idname, text="", icon='ZOOMOUT').remove_active = True + row.operator(AddPresetLamp.bl_idname, text="", icon='ADD') + row.operator(AddPresetLamp.bl_idname, text="", icon='REMOVE').remove_active = True classes = ( POV_LIGHT_MT_presets, AddPresetLamp, ) - +'''#TORECREATE##DEPRECATED# class LIGHT_PT_POV_sunsky(PovLampButtonsPanel, bpy.types.Panel): bl_label = properties_data_light.DATA_PT_sunsky.bl_label @@ -563,11 +574,13 @@ class LIGHT_PT_POV_sunsky(PovLampButtonsPanel, bpy.types.Panel): draw = properties_data_light.DATA_PT_sunsky.draw + class LIGHT_PT_POV_shadow(PovLampButtonsPanel, bpy.types.Panel): bl_label = properties_data_light.DATA_PT_shadow.bl_label draw = properties_data_light.DATA_PT_shadow.draw +''' class LIGHT_PT_POV_area(PovLampButtonsPanel, bpy.types.Panel): bl_label = properties_data_light.DATA_PT_area.bl_label @@ -644,6 +657,36 @@ class OBJECT_PT_povray_obj_rainbow(PovLampButtonsPanel, bpy.types.Panel): del properties_data_light ############################################################################### +class WORLD_PT_POV_world(WorldButtonsPanel, bpy.types.Panel): + bl_label = "World" + COMPAT_ENGINES = {'POVRAY_RENDER'} + + def draw(self, context): + layout = self.layout + + world = context.world + + row = layout.row(align=True) + row.menu(POV_WORLD_MT_presets.__name__, text=POV_WORLD_MT_presets.bl_label) + row.operator(AddPresetWorld.bl_idname, text="", icon='ADD') + row.operator(AddPresetWorld.bl_idname, text="", icon='REMOVE').remove_active = True + + row = layout.row() + row.prop(world, "use_sky_paper") + row.prop(world, "use_sky_blend") + row.prop(world, "use_sky_real") + + row = layout.row() + row.column().prop(world, "horizon_color") + col = row.column() + col.prop(world, "zenith_color") + col.active = world.use_sky_blend + row.column().prop(world, "ambient_color") + + #row = layout.row() + #row.prop(world, "exposure") + #row.prop(world, "color_range") + class RENDER_PT_povray_export_settings(RenderButtonsPanel, bpy.types.Panel): bl_label = "INI Options" bl_options = {'DEFAULT_CLOSED'} @@ -844,9 +887,9 @@ class RENDER_PT_povray_radiosity(RenderButtonsPanel, bpy.types.Panel): def draw_header(self, context): scene = context.scene if scene.pov.radio_enable: - self.layout.prop(scene.pov, "radio_enable", text="", icon='RADIO') + self.layout.prop(scene.pov, "radio_enable", text="", icon='OUTLINER_OB_LIGHTPROBE') else: - self.layout.prop(scene.pov, "radio_enable", text="", icon='RADIOBUT_OFF') + self.layout.prop(scene.pov, "radio_enable", text="", icon='LIGHTPROBE_CUBEMAP') def draw(self, context): layout = self.layout @@ -944,8 +987,8 @@ def rad_panel_func(self, context): row = layout.row(align=True) row.menu(POV_RADIOSITY_MT_presets.__name__, text=POV_RADIOSITY_MT_presets.bl_label) - row.operator(AddPresetRadiosity.bl_idname, text="", icon='ZOOMIN') - row.operator(AddPresetRadiosity.bl_idname, text="", icon='ZOOMOUT').remove_active = True + row.operator(AddPresetRadiosity.bl_idname, text="", icon='ADD') + row.operator(AddPresetRadiosity.bl_idname, text="", icon='REMOVE').remove_active = True classes = ( @@ -2170,3 +2213,104 @@ class TEXT_MT_templates_pov(bpy.types.Menu): def menu_func_templates(self, context): # Do not depend on POV-Ray being active renderer here... self.layout.menu("TEXT_MT_templates_pov") + + +classes = ( + #POV_WORLD_MT_presets, + #AddPresetWorld, + #RenderButtonsPanel, + #ModifierButtonsPanel, + #MaterialButtonsPanel, + #TextureButtonsPanel, + #ObjectButtonsPanel, + #CameraDataButtonsPanel, + #WorldButtonsPanel, + #TextButtonsPanel, + #PovDataButtonsPanel, + DATA_PT_POV_normals, + DATA_PT_POV_texture_space, + DATA_PT_POV_vertex_groups, + DATA_PT_POV_shape_keys, + DATA_PT_POV_uv_texture, + DATA_PT_POV_vertex_colors, + DATA_PT_POV_customdata, + #PovLampButtonsPanel, + LIGHT_PT_POV_preview, + LIGHT_PT_POV_light, + POV_LIGHT_MT_presets, + AddPresetLamp, + OBJECT_PT_povray_obj_rainbow, + RENDER_PT_povray_export_settings, + RENDER_PT_povray_render_settings, + RENDER_PT_povray_photons, + RENDER_PT_povray_antialias, + RENDER_PT_povray_radiosity, + POV_RADIOSITY_MT_presets, + AddPresetRadiosity, + RENDER_PT_povray_media, + MODIFIERS_PT_povray_modifiers, + MATERIAL_PT_povray_activate_node, + MATERIAL_PT_povray_active_node, + MATERIAL_PT_povray_reflection, + MATERIAL_PT_povray_fade_color, + MATERIAL_PT_povray_caustics, + MATERIAL_PT_povray_replacement_text, + TEXTURE_PT_povray_type, + TEXTURE_PT_povray_preview, + TEXTURE_PT_povray_parameters, + TEXTURE_PT_povray_tex_gamma, + OBJECT_PT_povray_obj_parameters, + OBJECT_PT_povray_obj_sphere, + OBJECT_PT_povray_obj_cylinder, + OBJECT_PT_povray_obj_cone, + OBJECT_PT_povray_obj_superellipsoid, + OBJECT_PT_povray_obj_torus, + OBJECT_PT_povray_obj_supertorus, + OBJECT_PT_povray_obj_parametric, + OBJECT_PT_povray_replacement_text, + POVRAY_MT_primitives_add_menu, + BasicShapesMenu, + ImportMenu, + NodeMapCreateMenu, + CAMERA_PT_povray_cam_dof, + CAMERA_PT_povray_cam_nor, + CAMERA_PT_povray_replacement_text, + TEXT_OT_povray_insert, + TEXT_MT_insert, + TEXT_PT_povray_custom_code, + TEXT_MT_templates_pov, +) + + +def register(): + #from bpy.utils import register_class + + for cls in classes: + register_class(cls) + + bpy.types.VIEW3D_MT_add.prepend(menu_func_add) + bpy.types.TOPBAR_MT_file_import.append(menu_func_import) + bpy.types.TEXT_MT_templates.append(menu_func_templates) + bpy.types.RENDER_PT_povray_radiosity.prepend(rad_panel_func) + bpy.types.LIGHT_PT_POV_light.prepend(light_panel_func) + #bpy.types.WORLD_PT_POV_world.prepend(world_panel_func) + # was used for parametric objects but made the other addon unreachable on + # unregister for other tools to use created a user action call instead + #addon_utils.enable("add_mesh_extra_objects", default_set=False, persistent=True) + + #bpy.types.TEXTURE_PT_context_texture.prepend(TEXTURE_PT_povray_type) + +def unregister(): + #from bpy.utils import unregister_class + + for cls in classes: + unregister_class(cls) + + #bpy.types.TEXTURE_PT_context_texture.remove(TEXTURE_PT_povray_type) + #addon_utils.disable("add_mesh_extra_objects", default_set=False) + #bpy.types.WORLD_PT_POV_world.remove(world_panel_func) + bpy.types.LIGHT_PT_POV_light.remove(light_panel_func) + bpy.types.RENDER_PT_povray_radiosity.remove(rad_panel_func) + bpy.types.TEXT_MT_templates.remove(menu_func_templates) + bpy.types.TOPBAR_MT_file_import.remove(menu_func_import) + bpy.types.VIEW3D_MT_add.remove(menu_func_add) \ No newline at end of file