Skip to content
Snippets Groups Projects
ui.py 142 KiB
Newer Older
Luca Bonavita's avatar
Luca Bonavita committed
# ##### 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>
Maurice Raybaud's avatar
Maurice Raybaud committed
"""User interface for the POV tools"""
Luca Bonavita's avatar
Luca Bonavita committed
import bpy
import sys  # really import here and in render.py?
import os  # really import here and in render.py?
from bl_operators.presets import AddPresetBase
from bpy.utils import register_class, unregister_class
from bpy.types import (
    Operator,
    UIList,
    Panel,
    Brush,
    Material,
    Light,
    World,
    ParticleSettings,
    FreestyleLineStyle,
)

# 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
Luca Bonavita's avatar
Luca Bonavita committed

# Use some of the existing buttons.
from bl_ui import properties_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')
# TORECREATE##DEPRECATED#properties_render.RENDER_PT_shading.COMPAT_ENGINES.add('POVRAY_RENDER')
# DEPRECATED#properties_render.RENDER_PT_output.COMPAT_ENGINES.add('POVRAY_RENDER')
Luca Bonavita's avatar
Luca Bonavita committed
del properties_render

Luca Bonavita's avatar
Luca Bonavita committed
# Use only a subset of the world panels
from bl_ui import properties_world

# TORECREATE##DEPRECATED#properties_world.WORLD_PT_preview.COMPAT_ENGINES.add('POVRAY_RENDER')
properties_world.WORLD_PT_context_world.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')
Luca Bonavita's avatar
Luca Bonavita committed
del properties_world

# Example of wrapping every class 'as is'
from bl_ui import properties_texture
from bl_ui.properties_texture import context_tex_datablock
from bl_ui.properties_texture import texture_filter_common
Luca Bonavita's avatar
Luca Bonavita committed
for member in dir(properties_texture):
    subclass = getattr(properties_texture, member)
    try:
        subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
Luca Bonavita's avatar
Luca Bonavita committed
    except:
        pass
del properties_texture

# Physics Main wrapping every class 'as is'
from bl_ui import properties_physics_common
for member in dir(properties_physics_common):
    subclass = getattr(properties_physics_common, member)
    try:
        subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
    except:
        pass
del properties_physics_common

# Physics Rigid Bodies wrapping every class 'as is'
from bl_ui import properties_physics_rigidbody
for member in dir(properties_physics_rigidbody):
    subclass = getattr(properties_physics_rigidbody, member)
    try:
        subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
    except:
        pass
del properties_physics_rigidbody

# Physics Rigid Body Constraint wrapping every class 'as is'
from bl_ui import properties_physics_rigidbody_constraint
for member in dir(properties_physics_rigidbody_constraint):
    subclass = getattr(properties_physics_rigidbody_constraint, member)
    try:
        subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
    except:
        pass
del properties_physics_rigidbody_constraint

# Physics Smoke wrapping every class 'as is'
from bl_ui import properties_physics_fluid
for member in dir(properties_physics_fluid):
    subclass = getattr(properties_physics_fluid, member)
    try:
        subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
    except:
        pass
del properties_physics_fluid

# Physics softbody wrapping every class 'as is'
from bl_ui import properties_physics_softbody
for member in dir(properties_physics_softbody):
    subclass = getattr(properties_physics_softbody, member)
    try:
        subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
    except:
        pass
del properties_physics_softbody

# Physics Fluid wrapping every class 'as is'
from bl_ui import properties_physics_fluid
for member in dir(properties_physics_fluid):
    subclass = getattr(properties_physics_fluid, member)
    try:
        subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
    except:
        pass
del properties_physics_fluid

# Physics Field wrapping every class 'as is'
from bl_ui import properties_physics_field
for member in dir(properties_physics_field):
    subclass = getattr(properties_physics_field, member)
    try:
        subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
    except:
        pass
del properties_physics_field

# Physics Cloth wrapping every class 'as is'
from bl_ui import properties_physics_cloth
for member in dir(properties_physics_cloth):
    subclass = getattr(properties_physics_cloth, member)
    try:
        subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
    except:
        pass
del properties_physics_cloth

# Physics Dynamic Paint wrapping every class 'as is'
from bl_ui import properties_physics_dynamicpaint
for member in dir(properties_physics_dynamicpaint):
    subclass = getattr(properties_physics_dynamicpaint, member)
    try:
        subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
    except:
        pass
del properties_physics_dynamicpaint

# Example of wrapping every class 'as is'
from bl_ui import properties_data_modifier
for member in dir(properties_data_modifier):
    subclass = getattr(properties_data_modifier, member)
    try:
        subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
    except:
        pass
del properties_data_modifier

# Example of wrapping every class 'as is' except some
from bl_ui import properties_material
for member in dir(properties_material):
    subclass = getattr(properties_material, member)
Maurice Raybaud's avatar
Maurice Raybaud committed
        # mat=bpy.context.active_object.active_material
Maurice Raybaud's avatar
Maurice Raybaud committed
        # if (mat and mat.pov.type == "SURFACE"
        # and not (mat.pov.material_use_nodes or mat.use_nodes)):
Maurice Raybaud's avatar
Maurice Raybaud committed
        # and (engine in cls.COMPAT_ENGINES)) if subclasses were sorted
        subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
from bl_ui import properties_data_camera
Luca Bonavita's avatar
Luca Bonavita committed
for member in dir(properties_data_camera):
    subclass = getattr(properties_data_camera, member)
    try:
        subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
Luca Bonavita's avatar
Luca Bonavita committed
    except:
        pass
del properties_data_camera

from bl_ui import properties_particle as properties_particle

for member in dir(
    properties_particle
):  # add all "particle" panels from blender
    subclass = getattr(properties_particle, member)
    try:
        subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
    except:
        pass
del properties_particle

# 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_RENDER')
    except:
        pass
del properties_output
class WORLD_MT_POV_presets(bpy.types.Menu):
    bl_label = "World Presets"
    preset_subdir = "pov/world"
    preset_operator = "script.execute_preset"
    draw = bpy.types.Menu.draw_preset


class WORLD_OT_POV_add_preset(AddPresetBase, Operator):
    '''Add a World Preset'''
    bl_idname = "object.world_preset_add"
    bl_label = "Add World Preset"
    preset_menu = "WORLD_MT_POV_presets"

    # variable used for all preset values
    preset_defines = ["scene = bpy.context.scene"]

    # properties to store in the preset
    preset_values = [
        "scene.world.use_sky_blend",
        "scene.world.horizon_color",
        "scene.world.zenith_color",
        "scene.world.ambient_color",
        "scene.world.mist_settings.use_mist",
        "scene.world.mist_settings.intensity",
        "scene.world.mist_settings.depth",
        "scene.world.mist_settings.start",
        "scene.pov.media_enable",
        "scene.pov.media_scattering_type",
        "scene.pov.media_samples",
        "scene.pov.media_diffusion_scale",
        "scene.pov.media_diffusion_color",
        "scene.pov.media_absorption_scale",
        "scene.pov.media_absorption_color",
        "scene.pov.media_eccentricity",

    # where to store the preset
    preset_subdir = "pov/world"
def check_material(mat):
    if mat is not None:
        if mat.use_nodes:
            if (
                not mat.node_tree
            ):  # FORMERLY : #mat.active_node_material is not None:
                return True
            return False
        return True
    return False

Maurice Raybaud's avatar
Maurice Raybaud committed
    """Test if a material uses nodes"""
    if (mat is not None) and (not mat.use_nodes):
        return True
    return False
Maurice Raybaud's avatar
Maurice Raybaud committed
    """Test if Add mesh extra objects addon is activated
Maurice Raybaud's avatar
Maurice Raybaud committed
    This addon is currently used to generate the proxy for POV parametric
    surface which is almost the same priciple as its Math xyz surface
    """
    if "add_mesh_extra_objects" in bpy.context.preferences.addons.keys():
Maurice Raybaud's avatar
Maurice Raybaud committed
    """POV can be installed with some include files.
Maurice Raybaud's avatar
Maurice Raybaud committed
    Get their path as defined in user preferences or registry keys for
    the user to be able to invoke them."""
    addon_prefs = bpy.context.preferences.addons[__package__].preferences
    # Use the system preference if its set.
    pov_documents = addon_prefs.docpath_povray
    if pov_documents:
        if os.path.exists(pov_documents):
            return pov_documents
        else:
            print(
                "User Preferences path to povray documents %r NOT FOUND, checking $PATH"
                % pov_documents
            )

    # Windows Only
    if sys.platform[:3] == "win":
        import winreg
            win_reg_key = winreg.OpenKey(
                winreg.HKEY_CURRENT_USER, "Software\\POV-Ray\\v3.7\\Windows"
            )
            win_docpath = winreg.QueryValueEx(win_reg_key, "DocPath")[0]
            pov_documents = os.path.join(win_docpath, "Insert Menu")
            if os.path.exists(pov_documents):
                return pov_documents
        except FileNotFoundError:
    # search the path all os's
    pov_documents_default = "include"

    os_path_ls = os.getenv("PATH").split(':') + [""]

    for dir_name in os_path_ls:
        pov_documents = os.path.join(dir_name, pov_documents_default)
        if os.path.exists(pov_documents):
            return pov_documents
    return ""
Maurice Raybaud's avatar
Maurice Raybaud committed
def pov_context_tex_datablock(context):
Maurice Raybaud's avatar
Maurice Raybaud committed
    """Texture context type recreated as deprecated in blender 2.8"""
    idblock = context.brush
Maurice Raybaud's avatar
Maurice Raybaud committed
    if idblock and bpy.context.scene.texture_context == 'OTHER':
Maurice Raybaud's avatar
Maurice Raybaud committed
        return idblock

    # idblock = bpy.context.active_object.active_material
    idblock = bpy.context.scene.view_layers[
        "View Layer"
    ].objects.active.active_material
Maurice Raybaud's avatar
Maurice Raybaud committed
    if idblock:
        return idblock

    idblock = context.world
Maurice Raybaud's avatar
Maurice Raybaud committed
    if idblock:
        return idblock
    idblock = context.light
Maurice Raybaud's avatar
Maurice Raybaud committed
    if idblock:
        return idblock

    if context.particle_system:
        idblock = context.particle_system.settings

    return idblock

    idblock = context.line_style
    if idblock:
        return idblock

class RenderButtonsPanel:
Maurice Raybaud's avatar
Maurice Raybaud committed
    """Use this class to define buttons from the render tab of
    properties window."""
Luca Bonavita's avatar
Luca Bonavita committed
    bl_space_type = 'PROPERTIES'
    bl_region_type = 'WINDOW'
    bl_context = "render"
    # COMPAT_ENGINES must be defined in each subclass, external engines can add themselves here

    @classmethod
    def poll(cls, context):
Luca Bonavita's avatar
Luca Bonavita committed
        rd = context.scene.render
        return rd.engine in cls.COMPAT_ENGINES
Luca Bonavita's avatar
Luca Bonavita committed


class ModifierButtonsPanel:
Maurice Raybaud's avatar
Maurice Raybaud committed
    """Use this class to define buttons from the modifier tab of
    properties window."""
    bl_space_type = 'PROPERTIES'
    bl_region_type = 'WINDOW'
    bl_context = "modifier"
    # COMPAT_ENGINES must be defined in each subclass, external engines can add themselves here

    @classmethod
    def poll(cls, context):
        mods = context.object.modifiers
        rd = context.scene.render
        return mods and (rd.engine in cls.COMPAT_ENGINES)

class MaterialButtonsPanel:
Maurice Raybaud's avatar
Maurice Raybaud committed
    """Use this class to define buttons from the material tab of
    properties window."""
Maurice Raybaud's avatar
Maurice Raybaud committed
    bl_space_type = 'PROPERTIES'
    bl_region_type = 'WINDOW'
    bl_context = "material"
    # COMPAT_ENGINES must be defined in each subclass, external engines can add themselves here

    @classmethod
    def poll(cls, context):
        mat = context.material
        rd = context.scene.render
        return mat and (rd.engine in cls.COMPAT_ENGINES)
class TextureButtonsPanel:
Maurice Raybaud's avatar
Maurice Raybaud committed
    """Use this class to define buttons from the texture tab of
    properties window."""
    bl_space_type = 'PROPERTIES'
    bl_region_type = 'WINDOW'
    bl_context = "texture"
    # COMPAT_ENGINES must be defined in each subclass, external engines can add themselves here

    @classmethod
    def poll(cls, context):
        tex = context.texture
        rd = context.scene.render
        return tex and (rd.engine in cls.COMPAT_ENGINES)
Loading
Loading full blame...