POV : fix registering

Fix : Removed some duplicate class that caused addon register /
unregister to fail after previous commit
This commit is contained in:
Maurice Raybaud 2021-05-27 18:36:18 +02:00
parent 73c752effe
commit a885950276
Notes: blender-bot 2023-02-14 18:06:55 +01:00
Referenced by commit e25068ef: Revert "POV : fix registering"
Referenced by commit e25068ef, Revert "POV : fix registering"
16 changed files with 263 additions and 189 deletions

View File

@ -250,7 +250,8 @@ class POV_OT_update_addon(bpy.types.Operator):
with tempfile.TemporaryDirectory() as temp_dir_path:
temp_zip_path = os.path.join(temp_dir_path, 'master.zip')
# Download zip archive of latest addons master branch commit (So we also get presets)
# Download zip archive of latest addons master branch commit
# More work needed so we also get the pov presets from addons shared folder.
# switch this URL back to the BF hosted one as soon as gitweb snapshot gets fixed
url = 'https://github.com/blender/blender-addons/archive/refs/heads/master.zip'
try:
@ -397,7 +398,10 @@ class PovrayPreferences(bpy.types.AddonPreferences):
layout.operator("pov.update_addon", icon='FILE_REFRESH')
classes = (POV_OT_update_addon, PovrayPreferences)
classes = (
POV_OT_update_addon, # already registered as a subclass
PovrayPreferences
)
def register():
@ -410,7 +414,7 @@ def register():
texturing_properties.register()
object_properties.register()
scripting_properties.register()
scenography.register()
#scenography.register()
render.register()
base_ui.register()
scripting.register()
@ -422,7 +426,7 @@ def unregister():
scripting.unregister()
base_ui.unregister()
render.unregister()
scenography.unregister()
#scenography.unregister()
scripting_properties.unregister()
object_properties.unregister()
texturing_properties.unregister()
@ -430,7 +434,7 @@ def unregister():
scenography_properties.unregister()
render_properties.unregister()
for cls in reversed(classes):
for cls in classes:
unregister_class(cls)

View File

@ -34,8 +34,11 @@ from bl_ui import properties_data_modifier
for member in dir(properties_data_modifier):
subclass = getattr(properties_data_modifier, member)
if hasattr(subclass, "COMPAT_ENGINES"):
try:
subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
except BaseException as e:
print(e.__doc__)
print('An exception occurred: {}'.format(e))
del properties_data_modifier

View File

@ -1769,5 +1769,5 @@ def register():
def unregister():
for cls in classes:
for cls in reversed(classes):
unregister_class(cls)

View File

@ -17,7 +17,9 @@
# #**** END GPL LICENSE BLOCK #****
# <pep8 compliant>
"""Wirte the POV file using this file's functions and some from other modules then render it."""
import bpy
import subprocess
import os
@ -1807,7 +1809,11 @@ class RunPovTextRender(Operator):
return {'FINISHED'}
classes = (PovrayRender, RenderPovTexturePreview, RunPovTextRender)
classes = (
PovrayRender,
RenderPovTexturePreview,
RunPovTextRender,
)
def register():

View File

@ -36,26 +36,38 @@ from bl_ui import properties_output
for member in dir(properties_output):
subclass = getattr(properties_output, member)
if hasattr(subclass, "COMPAT_ENGINES"):
try:
subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
except BaseException as e:
print(e.__doc__)
print('An exception occurred: {}'.format(e))
pass
del properties_output
from bl_ui import properties_freestyle
for member in dir(properties_freestyle):
subclass = getattr(properties_freestyle, member)
if hasattr(subclass, "COMPAT_ENGINES"):
try:
if not (subclass.bl_space_type == 'PROPERTIES' and subclass.bl_context == "render"):
subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
# subclass.bl_parent_id = "RENDER_PT_POV_filter"
except BaseException as e:
print(e.__doc__)
print('An exception occurred: {}'.format(e))
pass
del properties_freestyle
from bl_ui import properties_view_layer
for member in dir(properties_view_layer):
subclass = getattr(properties_view_layer, member)
if hasattr(subclass, "COMPAT_ENGINES"):
try:
subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
except BaseException as e:
print(e.__doc__)
print('An exception occurred: {}'.format(e))
pass
del properties_view_layer
# Use some of the existing buttons.
@ -440,13 +452,17 @@ if check_render_freestyle_svg():
'''
for member in dir(render_freestyle_svg):
subclass = getattr(render_freestyle_svg, member)
if hasattr(subclass, "COMPAT_ENGINES"):
try:
subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
if subclass.bl_idname == "RENDER_PT_SVGExporterPanel":
subclass.bl_parent_id = "RENDER_PT_POV_filter"
subclass.bl_options = {'HIDE_HEADER'}
# subclass.bl_order = 11
print(subclass.bl_info)
except BaseException as e:
print(e.__doc__)
print('An exception occurred: {}'.format(e))
pass
# del render_freestyle_svg.RENDER_PT_SVGExporterPanel.bl_parent_id
@ -537,10 +553,10 @@ classes = (
def register():
for cls in classes:
register_class(cls)
bpy.types.RENDER_PT_POV_radiosity.prepend(rad_panel_func)
RENDER_PT_POV_radiosity.prepend(rad_panel_func)
def unregister():
bpy.types.RENDER_PT_POV_radiosity.remove(rad_panel_func)
RENDER_PT_POV_radiosity.remove(rad_panel_func)
for cls in reversed(classes):
unregister_class(cls)

View File

@ -672,7 +672,9 @@ class RenderPovSettingsScene(PropertyGroup):
)
classes = (RenderPovSettingsScene,)
classes = (
RenderPovSettingsScene,
)
def register():

View File

@ -23,7 +23,7 @@
with world, sky, atmospheric effects such as rainbows or smoke """
import bpy
from bpy.utils import register_class, unregister_class
import os
from imghdr import what # imghdr is a python lib to identify image file types
from math import atan, pi, sqrt, degrees
@ -832,16 +832,3 @@ def export_smoke(file, smoke_obj_name, smoke_path, comments, global_matrix, writ
# file.write(" frequency 0\n")
# file.write(" }\n")
# file.write("}\n")
classes = ()
def register():
for cls in classes:
register_class(cls)
def unregister():
for cls in classes:
unregister_class(cls)

View File

@ -31,8 +31,12 @@ from bl_ui import properties_data_camera
for member in dir(properties_data_camera):
subclass = getattr(properties_data_camera, member)
if hasattr(subclass, "COMPAT_ENGINES"):
try:
subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
except BaseException as e:
print(e.__doc__)
print('An exception occurred: {}'.format(e))
pass
del properties_data_camera
# ##################################
@ -50,8 +54,12 @@ from bl_ui import properties_physics_common
for member in dir(properties_physics_common):
subclass = getattr(properties_physics_common, member)
if hasattr(subclass, "COMPAT_ENGINES"):
try:
subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
except BaseException as e:
print(e.__doc__)
print('An exception occurred: {}'.format(e))
pass
del properties_physics_common
# Physics Rigid Bodies wrapping every class 'as is'
@ -59,8 +67,12 @@ from bl_ui import properties_physics_rigidbody
for member in dir(properties_physics_rigidbody):
subclass = getattr(properties_physics_rigidbody, member)
if hasattr(subclass, "COMPAT_ENGINES"):
try:
subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
except BaseException as e:
print(e.__doc__)
print('An exception occurred: {}'.format(e))
pass
del properties_physics_rigidbody
# Physics Rigid Body Constraint wrapping every class 'as is'
@ -68,8 +80,12 @@ from bl_ui import properties_physics_rigidbody_constraint
for member in dir(properties_physics_rigidbody_constraint):
subclass = getattr(properties_physics_rigidbody_constraint, member)
if hasattr(subclass, "COMPAT_ENGINES"):
try:
subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
except BaseException as e:
print(e.__doc__)
print('An exception occurred: {}'.format(e))
pass
del properties_physics_rigidbody_constraint
# Physics Smoke and fluids wrapping every class 'as is'
@ -77,8 +93,12 @@ from bl_ui import properties_physics_fluid
for member in dir(properties_physics_fluid):
subclass = getattr(properties_physics_fluid, member)
if hasattr(subclass, "COMPAT_ENGINES"):
try:
subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
except BaseException as e:
print(e.__doc__)
print('An exception occurred: {}'.format(e))
pass
del properties_physics_fluid
# Physics softbody wrapping every class 'as is'
@ -86,8 +106,12 @@ from bl_ui import properties_physics_softbody
for member in dir(properties_physics_softbody):
subclass = getattr(properties_physics_softbody, member)
if hasattr(subclass, "COMPAT_ENGINES"):
try:
subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
except BaseException as e:
print(e.__doc__)
print('An exception occurred: {}'.format(e))
pass
del properties_physics_softbody
# Physics Field wrapping every class 'as is'
@ -95,8 +119,12 @@ from bl_ui import properties_physics_field
for member in dir(properties_physics_field):
subclass = getattr(properties_physics_field, member)
if hasattr(subclass, "COMPAT_ENGINES"):
try:
subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
except BaseException as e:
print(e.__doc__)
print('An exception occurred: {}'.format(e))
pass
del properties_physics_field
# Physics Cloth wrapping every class 'as is'
@ -104,8 +132,12 @@ from bl_ui import properties_physics_cloth
for member in dir(properties_physics_cloth):
subclass = getattr(properties_physics_cloth, member)
if hasattr(subclass, "COMPAT_ENGINES"):
try:
subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
except BaseException as e:
print(e.__doc__)
print('An exception occurred: {}'.format(e))
pass
del properties_physics_cloth
# Physics Dynamic Paint wrapping every class 'as is'
@ -113,16 +145,24 @@ from bl_ui import properties_physics_dynamicpaint
for member in dir(properties_physics_dynamicpaint):
subclass = getattr(properties_physics_dynamicpaint, member)
if hasattr(subclass, "COMPAT_ENGINES"):
try:
subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
except BaseException as e:
print(e.__doc__)
print('An exception occurred: {}'.format(e))
pass
del properties_physics_dynamicpaint
from bl_ui import properties_particle
for member in dir(properties_particle): # add all "particle" panels from blender
subclass = getattr(properties_particle, member)
if hasattr(subclass, "COMPAT_ENGINES"):
try:
subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
except BaseException as e:
print(e.__doc__)
print('An exception occurred: {}'.format(e))
pass
del properties_particle
@ -750,12 +790,10 @@ def register():
for cls in classes:
register_class(cls)
bpy.types.LIGHT_PT_POV_light.prepend(light_panel_func)
LIGHT_PT_POV_light.prepend(light_panel_func)
def unregister():
bpy.types.LIGHT_PT_POV_light.remove(light_panel_func)
LIGHT_PT_POV_light.remove(light_panel_func)
for cls in reversed(classes):
unregister_class(cls)

View File

@ -352,6 +352,128 @@ class RenderPovSettingsWorld(PropertyGroup):
name="Index for texture_slots", default=0, update=brush_texture_update
)
###############################################################################
# Texture slots (World context) exported as POV texture properties.
###############################################################################
class WorldTextureSlot(PropertyGroup):
"""Declare world texture slot level properties for UI and translated to POV."""
bl_idname = ("pov_texture_slots",)
bl_description = ("Texture_slots from Blender-2.79",)
# Adding a "real" texture datablock as property is not possible
# (or at least not easy through a dynamically populated EnumProperty).
# That's why we'll use a prop_search() UILayout function in texturing_gui.py.
# So we'll assign the name of the needed texture datablock to the below StringProperty.
texture: StringProperty(update=active_texture_name_from_uilist)
# and use another temporary StringProperty to change the linked data
texture_search: StringProperty(
name="", update=active_texture_name_from_search, description="Browse Texture to be linked"
)
blend_factor: FloatProperty(
name="Blend",
description="Amount texture affects color progression of the " "background",
soft_min=0.0,
soft_max=1.0,
default=1.0,
)
horizon_factor: FloatProperty(
name="Horizon",
description="Amount texture affects color of the horizon",
soft_min=0.0,
soft_max=1.0,
default=1.0,
)
object: StringProperty(
name="Object",
description="Object to use for mapping with Object texture coordinates",
default="",
)
offset: FloatVectorProperty(
name="Offset",
description=("Fine tune of the texture mapping X, Y and Z locations "),
precision=4,
step=0.1,
soft_min=-100.0,
soft_max=100.0,
default=(0.0, 0.0, 0.0),
options={"ANIMATABLE"},
subtype="TRANSLATION",
)
scale: FloatVectorProperty(
name="Size",
subtype="XYZ",
size=3,
description="Set scaling for the textures X, Y and Z sizes ",
precision=4,
step=0.1,
soft_min=-100.0,
soft_max=100.0,
default=(1.0, 1.0, 1.0),
options={"ANIMATABLE"},
)
texture_coords: EnumProperty(
name="Coordinates",
description="Texture coordinates used to map the texture onto the background",
items=(
("VIEW", "View", "Use view vector for the texture coordinates"),
(
"GLOBAL",
"Global",
"Use global coordinates for the texture coordinates (interior mist)",
),
(
"ANGMAP",
"AngMap",
"Use 360 degree angular coordinates, e.g. for spherical light probes",
),
("SPHERE", "Sphere", "For 360 degree panorama sky, spherical mapped, only top half"),
("EQUIRECT", "Equirectangular", "For 360 degree panorama sky, equirectangular mapping"),
("TUBE", "Tube", "For 360 degree panorama sky, cylindrical mapped, only top half"),
("OBJECT", "Object", "Use linked objects coordinates for texture coordinates"),
),
default="VIEW",
)
use_map_blend: BoolProperty(
name="Blend Map", description="Affect the color progression of the background", default=True
)
use_map_horizon: BoolProperty(
name="Horizon Map", description="Affect the color of the horizon", default=False
)
use_map_zenith_down: BoolProperty(
name="", description="Affect the color of the zenith below", default=False
)
use_map_zenith_up: BoolProperty(
name="Zenith Up Map", description="Affect the color of the zenith above", default=False
)
zenith_down_factor: FloatProperty(
name="Zenith Down",
description="Amount texture affects color of the zenith below",
soft_min=0.0,
soft_max=1.0,
default=1.0,
)
zenith_up_factor: FloatProperty(
name="Zenith Up",
description="Amount texture affects color of the zenith above",
soft_min=0.0,
soft_max=1.0,
default=1.0,
)
"""
# class WORLD_TEXTURE_SLOTS_UL_layerlist(bpy.types.UIList):
@ -371,6 +493,7 @@ classes = (
RenderPovSettingsCamera,
RenderPovSettingsLight,
RenderPovSettingsWorld,
WorldTextureSlot,
)
@ -381,12 +504,14 @@ def register():
bpy.types.Camera.pov = PointerProperty(type=RenderPovSettingsCamera)
bpy.types.Light.pov = PointerProperty(type=RenderPovSettingsLight)
bpy.types.World.pov = PointerProperty(type=RenderPovSettingsWorld)
bpy.types.World.pov_texture_slots = CollectionProperty(type=WorldTextureSlot)
def unregister():
del bpy.types.Camera.pov
del bpy.types.Light.pov
del bpy.types.World.pov
del bpy.types.World.pov_texture_slots
for cls in reversed(classes):
unregister_class(cls)

View File

@ -25,6 +25,7 @@ load, create or edit"""
import bpy
from bpy.props import StringProperty, BoolProperty, CollectionProperty
from bpy_extras.io_utils import ImportHelper
from bpy.utils import register_class, unregister_class
from mathutils import Vector
from math import pi
@ -520,10 +521,16 @@ class ImportPOV(bpy.types.Operator, ImportHelper):
# obj.location = (0,0,0)
return {'FINISHED'}
classes = (
ImportPOV,
)
def register():
bpy.utils.register_class(ImportPOV)
for cls in classes:
register_class(cls)
def unregister():
bpy.utils.unregister_class(ImportPOV)
for cls in reversed(classes):
unregister_class(cls)

View File

@ -251,7 +251,6 @@ classes = (
def register():
for cls in classes:
register_class(cls)
@ -260,7 +259,6 @@ def register():
def unregister():
bpy.types.TEXT_MT_templates.remove(menu_func_templates)
bpy.types.TOPBAR_MT_file_import.remove(menu_func_import)

View File

@ -17,10 +17,10 @@
# ##### END GPL LICENSE BLOCK #####
# <pep8 compliant>
import bpy
"""Declare pov native file syntax properties controllable in UI hooks and text blocks"""
import bpy
from bpy.utils import register_class, unregister_class
from bpy.types import PropertyGroup
from bpy.props import EnumProperty, PointerProperty
@ -42,7 +42,9 @@ class RenderPovSettingsText(PropertyGroup):
)
classes = (RenderPovSettingsText,)
classes = (
RenderPovSettingsText,
)
def register():

View File

@ -29,8 +29,16 @@ from bl_ui import properties_material
for member in dir(properties_material):
subclass = getattr(properties_material, member)
if hasattr(subclass, "COMPAT_ENGINES"):
try:
# mat=bpy.context.active_object.active_material
# if (mat and mat.pov.type == "SURFACE"
# and not (mat.pov.material_use_nodes or mat.use_nodes)):
# and (engine in cls.COMPAT_ENGINES)) if subclasses were sorted
subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
except BaseException as e:
print(e.__doc__)
print('An exception occurred: {}'.format(e))
pass
del properties_material
from .shading_properties import check_material
@ -44,8 +52,7 @@ def simple_material(mat):
class MaterialButtonsPanel:
"""Use this class to define buttons from the material tab of
properties window."""
"""Use this class to define buttons from the material tab of properties window."""
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
@ -669,12 +676,10 @@ classes = (
def register():
for cls in classes:
register_class(cls)
def unregister():
for cls in reversed(classes):
unregister_class(cls)

View File

@ -1995,17 +1995,15 @@ classes = (
def register():
# from bpy.utils import register_class
bpy.types.NODE_HT_header.append(menu_func_nodes)
nodeitems_utils.register_node_categories("POVRAYNODES", node_categories)
for cls in classes:
register_class(cls)
nodeitems_utils.register_node_categories("POVRAYNODES", node_categories)
bpy.types.NODE_HT_header.append(menu_func_nodes)
def unregister():
# from bpy.utils import unregister_class
bpy.types.NODE_HT_header.remove(menu_func_nodes)
nodeitems_utils.unregister_node_categories("POVRAYNODES")
for cls in reversed(classes):
unregister_class(cls)
nodeitems_utils.unregister_node_categories("POVRAYNODES")
bpy.types.NODE_HT_header.remove(menu_func_nodes)

View File

@ -49,8 +49,12 @@ from bl_ui import properties_texture
for member in dir(properties_texture):
subclass = getattr(properties_texture, member)
if hasattr(subclass, "COMPAT_ENGINES"):
try:
subclass.COMPAT_ENGINES.add('POVRAY_RENDER')
except BaseException as e:
print(e.__doc__)
print('An exception occurred: {}'.format(e))
pass
del properties_texture
@ -1224,6 +1228,7 @@ class TEXTURE_PT_POV_tex_gamma(TextureButtonsPanel, Panel):
classes = (
WORLD_TEXTURE_SLOTS_UL_POV_layerlist,
TEXTURE_MT_POV_specials,
#TEXTURE_PT_context,
TEXTURE_PT_POV_context_texture,
TEXTURE_PT_colors,
TEXTURE_PT_POV_type,
@ -1239,7 +1244,6 @@ classes = (
def register():
for cls in classes:
register_class(cls)

View File

@ -17,6 +17,7 @@
# ##### END GPL LICENSE BLOCK #####
# <pep8 compliant>
"""Declare texturing properties controllable in UI."""
import bpy
@ -461,128 +462,6 @@ class MaterialTextureSlot(PropertyGroup):
)
###############################################################################
# Texture slots (World context) exported as POV texture properties.
###############################################################################
class WorldTextureSlot(PropertyGroup):
"""Declare world texture slot level properties for UI and translated to POV."""
bl_idname = ("pov_texture_slots",)
bl_description = ("Texture_slots from Blender-2.79",)
# Adding a "real" texture datablock as property is not possible
# (or at least not easy through a dynamically populated EnumProperty).
# That's why we'll use a prop_search() UILayout function in ui.py.
# So we'll assign the name of the needed texture datablock to the below StringProperty.
texture: StringProperty(update=active_texture_name_from_uilist)
# and use another temporary StringProperty to change the linked data
texture_search: StringProperty(
name="", update=active_texture_name_from_search, description="Browse Texture to be linked"
)
blend_factor: FloatProperty(
name="Blend",
description="Amount texture affects color progression of the " "background",
soft_min=0.0,
soft_max=1.0,
default=1.0,
)
horizon_factor: FloatProperty(
name="Horizon",
description="Amount texture affects color of the horizon",
soft_min=0.0,
soft_max=1.0,
default=1.0,
)
object: StringProperty(
name="Object",
description="Object to use for mapping with Object texture coordinates",
default="",
)
offset: FloatVectorProperty(
name="Offset",
description=("Fine tune of the texture mapping X, Y and Z locations "),
precision=4,
step=0.1,
soft_min=-100.0,
soft_max=100.0,
default=(0.0, 0.0, 0.0),
options={"ANIMATABLE"},
subtype="TRANSLATION",
)
scale: FloatVectorProperty(
name="Size",
subtype="XYZ",
size=3,
description="Set scaling for the textures X, Y and Z sizes ",
precision=4,
step=0.1,
soft_min=-100.0,
soft_max=100.0,
default=(1.0, 1.0, 1.0),
options={"ANIMATABLE"},
)
texture_coords: EnumProperty(
name="Coordinates",
description="Texture coordinates used to map the texture onto the background",
items=(
("VIEW", "View", "Use view vector for the texture coordinates"),
(
"GLOBAL",
"Global",
"Use global coordinates for the texture coordinates (interior mist)",
),
(
"ANGMAP",
"AngMap",
"Use 360 degree angular coordinates, e.g. for spherical light probes",
),
("SPHERE", "Sphere", "For 360 degree panorama sky, spherical mapped, only top half"),
("EQUIRECT", "Equirectangular", "For 360 degree panorama sky, equirectangular mapping"),
("TUBE", "Tube", "For 360 degree panorama sky, cylindrical mapped, only top half"),
("OBJECT", "Object", "Use linked objects coordinates for texture coordinates"),
),
default="VIEW",
)
use_map_blend: BoolProperty(
name="Blend Map", description="Affect the color progression of the background", default=True
)
use_map_horizon: BoolProperty(
name="Horizon Map", description="Affect the color of the horizon", default=False
)
use_map_zenith_down: BoolProperty(
name="", description="Affect the color of the zenith below", default=False
)
use_map_zenith_up: BoolProperty(
name="Zenith Up Map", description="Affect the color of the zenith above", default=False
)
zenith_down_factor: FloatProperty(
name="Zenith Down",
description="Amount texture affects color of the zenith below",
soft_min=0.0,
soft_max=1.0,
default=1.0,
)
zenith_up_factor: FloatProperty(
name="Zenith Up",
description="Amount texture affects color of the zenith above",
soft_min=0.0,
soft_max=1.0,
default=1.0,
)
###############################################################################
# Space properties from removed former Blender Internal
###############################################################################
@ -1116,7 +995,9 @@ class RenderPovSettingsTexture(PropertyGroup):
tex_scale_z: FloatProperty(name="Scale Z", description="", min=0.0, max=10000.0, default=1.0)
classes = (MaterialTextureSlot, WorldTextureSlot, RenderPovSettingsTexture)
classes = (
MaterialTextureSlot,
RenderPovSettingsTexture)
def register():
@ -1124,13 +1005,11 @@ def register():
register_class(cls)
bpy.types.Material.pov_texture_slots = CollectionProperty(type=MaterialTextureSlot)
bpy.types.World.pov_texture_slots = CollectionProperty(type=WorldTextureSlot)
bpy.types.Texture.pov = PointerProperty(type=RenderPovSettingsTexture)
def unregister():
del bpy.types.Texture.pov
del bpy.types.World.pov_texture_slots
del bpy.types.Material.pov_texture_slots
for cls in reversed(classes):