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:
authorVilem Duha <vilem.duha@gmail.com>2019-03-29 19:52:47 +0300
committerVilem Duha <vilem.duha@gmail.com>2019-03-29 19:52:47 +0300
commit50ea2790f91788f247225be88b8e7a97c7bfb937 (patch)
treedf7e480fe061f594823e882dca0a0a7118f4a718 /blenderkit/__init__.py
parent69c01cad71191de344dbfd66c45640d0ec281bc3 (diff)
BlenderKit initial commit.
BlenderKit add-on is the official addon of the BlenderKit service for Blender 3d. (www.blenderkit.com) It enables users to upload, search, download, and rate different assets for blender. It works together with BlenderKit server.
Diffstat (limited to 'blenderkit/__init__.py')
-rw-r--r--blenderkit/__init__.py1410
1 files changed, 1410 insertions, 0 deletions
diff --git a/blenderkit/__init__.py b/blenderkit/__init__.py
new file mode 100644
index 00000000..017da14d
--- /dev/null
+++ b/blenderkit/__init__.py
@@ -0,0 +1,1410 @@
+# ##### 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 #####
+
+bl_info = {
+ "name": "Blender Kit",
+ "author": "Vilem Duha",
+ "version": (1, 0, 22),
+ "blender": (2, 80, 0),
+ "location": "View3D > Properties > BlenderKit",
+ "description": "Online BlenderKit library (materials, models, brushes and more)",
+ "warning": "",
+ "wiki_url": "https://youtu.be/1hVgcQhIAo8"
+ "Scripts/Add_Mesh/BlenderKit",
+ "category": "Add Mesh",
+}
+
+if "bpy" in locals():
+ import importlib
+
+ importlib.reload(asset_inspector)
+ importlib.reload(search)
+ importlib.reload(download)
+ importlib.reload(ratings)
+ importlib.reload(autothumb)
+ importlib.reload(ui)
+ importlib.reload(bg_blender)
+ importlib.reload(paths)
+ importlib.reload(utils)
+else:
+ from blenderkit import asset_inspector, search, download, upload, ratings, autothumb, ui, bg_blender, paths, utils, \
+ overrides, ui_panels, categories
+
+import os
+import math
+import time
+# import logging
+import bpy
+
+from bpy.app.handlers import persistent
+import bpy.utils.previews
+import mathutils
+from mathutils import Vector
+from bpy.props import (
+ IntProperty,
+ FloatProperty,
+ FloatVectorProperty,
+ StringProperty,
+ EnumProperty,
+ BoolProperty,
+ PointerProperty,
+)
+from bpy.types import (
+ Operator,
+ Panel,
+ AddonPreferences,
+ PropertyGroup,
+)
+
+
+# logging.basicConfig(filename = 'blenderkit.log', level = logging.INFO,
+# format = ' %(asctime)s:%(filename)s:%(funcName)s:%(lineno)d:%(message)s')
+
+
+@persistent
+def scene_load(context):
+ search.load_previews()
+ ui_props = bpy.context.scene.blenderkitUI
+ ui_props.assetbar_on = False
+ ui_props.turn_off = False
+
+
+licenses = (
+ ('royalty_free', 'Royalty Free', 'royalty free commercial license'),
+ ('cc_zero', 'Creative Commons Zero', 'Creative Commons Zero'),
+)
+conditions = (
+ ('UNSPECIFIED', 'Unspecified', "Don't use this in search"),
+ ('NEW', 'New', 'Shiny new item'),
+ ('USED', 'Used', 'Casually used item'),
+ ('OLD', 'Old', 'Old item'),
+ ('DESOLATE', 'Desolate', 'Desolate item - dusty & rusty'),
+)
+model_styles = (
+ ('REALISTIC', 'Realistic', "photo realistic model"),
+ ('PAINTERLY', 'Painterly', 'hand painted with visible strokes, mostly for games'),
+ ('LOWPOLY', 'Lowpoly', "Lowpoly art -don't mix up with polycount!"),
+ ('ANIME', 'Anime', 'Anime style'),
+ ('2D VECTOR', '2d Vector', '2d vector'),
+ ('3D GRAPHICS', '3d Graphics', '3d graphics'),
+ ('OTHER', 'Other', 'Other style'),
+)
+search_model_styles = (
+ ('REALISTIC', 'Realistic', "photo realistic model"),
+ ('PAINTERLY', 'Painterly', 'hand painted with visible strokes, mostly for games'),
+ ('LOWPOLY', 'Lowpoly', "Lowpoly art -don't mix up with polycount!"),
+ ('ANIME', 'Anime', 'Anime style'),
+ ('2D VECTOR', '2d Vector', '2d vector'),
+ ('3D GRAPHICS', '3d Graphics', '3d graphics'),
+ ('OTHER', 'Other', 'Other Style'),
+ ('ANY', 'Any', 'Any Style'),
+)
+material_styles = (
+ ('REALISTIC', 'Realistic', "photo realistic model"),
+ ('NPR', 'Non photorealistic', 'hand painted with visible strokes, mostly for games'),
+ ('OTHER', 'Other', 'Other style'),
+)
+search_material_styles = (
+ ('REALISTIC', 'Realistic', "photo realistic model"),
+ ('NPR', 'Non photorealistic', 'hand painted with visible strokes, mostly for games'),
+ ('ANY', 'Any', 'Any'),
+)
+engines = (
+ ('CYCLES', 'Cycles', 'blender cycles pathtracer'),
+ ('EEVEE', 'Eevee', 'blender eevee renderer'),
+ ('OCTANE', 'Octane', 'octane render enginge'),
+ ('ARNOLD', 'Arnold', 'arnold render engine'),
+ ('V-RAY', 'V-Ray', 'V-Ray renderer'),
+ ('UNREAL', 'Unreal', 'Unreal engine'),
+ ('UNITY', 'Unity', 'Unity engine'),
+ ('GODOT', 'Godot', 'Godot engine'),
+ ('3D-PRINT', '3d printer', 'object can be 3d printed'),
+ ('OTHER', 'Other', 'any other engine'),
+ ('NONE', 'None', 'no more engine block.'),
+)
+pbr_types = (
+ ('METALLIC', 'Metallic-Roughness', 'Metallic/Roughness PBR material type'),
+ ('SPECULAR', 'Specular Glossy', ''),
+)
+
+mesh_poly_types = (
+ ('QUAD', 'quad', ''),
+ ('QUAD_DOMINANT', 'quad_dominant', ''),
+ ('TRI_DOMINANT', 'tri_dominant', ''),
+ ('TRI', 'tri', ''),
+ ('NGON', 'ngon_dominant', ''),
+ ('OTHER', 'other', ''),
+)
+
+thumbnail_angles = (
+ ('DEFAULT', 'default', ''),
+ ('FRONT', 'front', ''),
+ ('SIDE', 'side', ''),
+ ('TOP', 'top', ''),
+)
+
+thumbnail_snap = (
+ ('GROUND', 'ground', ''),
+ ('WALL', 'wall', ''),
+ ('CEILING', 'ceiling', ''),
+ ('FLOAT', 'floating', ''),
+)
+
+
+def get_upload_asset_type(self):
+ typemapper = {
+ BlenderKitModelUploadProps: 'model',
+ BlenderKitSceneUploadProps: 'scene',
+ BlenderKitMaterialUploadProps: 'material',
+ BlenderKitBrushUploadProps: 'brush'
+ }
+ asset_type = typemapper[type(self)]
+ return asset_type
+
+
+def get_subcategory_enums(self, context):
+ wm = bpy.context.window_manager
+ asset_type = get_upload_asset_type(self)
+ items = []
+ if self.category != '':
+ asset_categories = categories.get_category(wm['bkit_categories'], cat_path=(asset_type, self.category,))
+ for c in asset_categories['children']:
+ items.append((c['slug'], c['name'], c['description']))
+
+ return items
+
+
+def get_category_enums(self, context):
+ wm = bpy.context.window_manager
+ asset_type = get_upload_asset_type(self)
+ asset_categories = categories.get_category(wm['bkit_categories'], cat_path=(asset_type,))
+ items = []
+ for c in asset_categories['children']:
+ items.append((c['slug'], c['name'], c['description']))
+ return items
+
+
+def switch_search_results(self, context):
+ s = bpy.context.scene
+ props = s.blenderkitUI
+ if props.asset_type == 'MODEL':
+ s['search results'] = s.get('bkit model search')
+ elif props.asset_type == 'SCENE':
+ s['search results'] = s.get('bkit scene search')
+ elif props.asset_type == 'MATERIAL':
+ s['search results'] = s.get('bkit material search')
+ elif props.asset_type == 'TEXTURE':
+ s['search results'] = s.get('bkit texture search')
+ elif props.asset_type == 'BRUSH':
+ s['search results'] = s.get('bkit brush search')
+ search.load_previews()
+
+
+class BlenderKitUIProps(PropertyGroup):
+ down_up: EnumProperty(
+ name="Download vs Upload",
+ items=(
+ ('SEARCH', 'Search', 'Searching is active', 'VIEWZOOM', 0),
+ ('UPLOAD', 'Upload', 'Uploads are active', 'COPYDOWN', 1),
+ # ('RATING', 'Rating', 'Rating is active', 'SOLO_ON', 2)
+ ),
+ description="BLenderKit",
+ default="SEARCH",
+ )
+ asset_type: EnumProperty(
+ name="Active Asset Type",
+ items=(
+ ('MODEL', 'Model', 'Browse models', 'OBJECT_DATAMODE', 0),
+ ('SCENE', 'SCENE', 'Browse scenes', 'SCENE_DATA', 1),
+ ('MATERIAL', 'Material', 'Browse models', 'MATERIAL', 2),
+ # ('TEXTURE', 'Texture', 'Browse textures', 'TEXTURE', 3),
+ ('BRUSH', 'Brush', 'Browse brushes', 'BRUSH_DATA', 3)
+ ),
+ description="Activate asset in UI",
+ default="MATERIAL",
+ update=switch_search_results
+ )
+ # these aren't actually used ( by now, seems to better use globals in UI module:
+ draw_tooltip: BoolProperty(name="Draw Tooltip", default=False)
+ addon_update: BoolProperty(name="Should Update Addon", default=False)
+ tooltip: StringProperty(
+ name="Tooltip",
+ description="asset preview info",
+ default="")
+
+ ui_scale = 1
+
+ thumb_size_def = 96
+ margin_def = 0
+
+ thumb_size: IntProperty(name="Thumbnail Size", default=thumb_size_def, min=-1, max=256)
+
+ margin: IntProperty(name="Margin", default=margin_def, min=-1, max=256)
+ highlight_margin: IntProperty(name="Higlight Margin", default=int(margin_def / 2), min=-10, max=256)
+
+ bar_height: IntProperty(name="Bar Height", default=thumb_size_def + 2 * margin_def, min=-1, max=2048)
+ bar_x_offset: IntProperty(name="Bar X Offset", default=20, min=0, max=5000)
+ bar_y_offset: IntProperty(name="Bar Y Offset", default=80, min=0, max=5000)
+
+ bar_x: IntProperty(name="Bar X", default=100, min=0, max=5000)
+ bar_y: IntProperty(name="Bar Y", default=100, min=50, max=5000)
+ bar_end: IntProperty(name="Bar End", default=100, min=0, max=5000)
+ bar_width: IntProperty(name="Bar Width", default=100, min=0, max=5000)
+
+ wcount: IntProperty(name="Width Count", default=10, min=0, max=5000)
+ hcount: IntProperty(name="Rows", default=5, min=0, max=5000)
+
+ reports_y: IntProperty(name="Reports Y", default=5, min=0, max=5000)
+ reports_x: IntProperty(name="Reports X", default=5, min=0, max=5000)
+
+ assetbar_on: BoolProperty(name="Assetbar On", default=False)
+ turn_off: BoolProperty(name="Turn Off", default=False)
+
+ mouse_x: IntProperty(name="Mouse X", default=0)
+ mouse_y: IntProperty(name="Mouse Y", default=0)
+
+ active_index: IntProperty(name="Active Index", default=-3)
+ scrolloffset: IntProperty(name="Scroll Offset", default=0)
+ drawoffset: IntProperty(name="Draw Offset", default=0)
+
+ dragging: BoolProperty(name="Dragging", default=False)
+ drag_init: BoolProperty(name="Drag Initialisation", default=False)
+ drag_length: IntProperty(name="Drag length", default=0)
+ draw_drag_image: BoolProperty(name="Draw Drag Image", default=False)
+ draw_snapped_bounds: BoolProperty(name="Draw Snapped Bounds", default=False)
+
+ snapped_location: FloatVectorProperty(name="Snapped Location", default=(0, 0, 0))
+ snapped_bbox_min: FloatVectorProperty(name="Snapped Bbox Min", default=(0, 0, 0))
+ snapped_bbox_max: FloatVectorProperty(name="Snapped Bbox Max", default=(0, 0, 0))
+ snapped_normal: FloatVectorProperty(name="Snapped Normal", default=(0, 0, 0))
+
+ snapped_rotation: FloatVectorProperty(name="Snapped Rotation", default=(0, 0, 0), subtype='QUATERNION')
+
+ has_hit: BoolProperty(name="has_hit", default=False)
+ thumbnail_image = StringProperty(
+ name="Thumbnail Image",
+ description="",
+ default=paths.get_addon_thumbnail_path('thumbnail_notready.jpg'))
+
+ #### rating UI props
+ rating_ui_scale = ui_scale
+
+ rating_button_on: BoolProperty(name="Rating Button On", default=True)
+ rating_menu_on: BoolProperty(name="Rating Menu On", default=False)
+ rating_on: BoolProperty(name="Rating on", default=True)
+
+ rating_button_width: IntProperty(name="Rating Button Width", default=50 * ui_scale)
+ rating_button_height: IntProperty(name="Rating Button Height", default=50 * ui_scale)
+
+ rating_x: IntProperty(name="Rating UI X", default=10)
+ rating_y: IntProperty(name="Rating UI Y", default=10)
+
+ rating_ui_width: IntProperty(name="Rating UI Width", default=rating_ui_scale * 600)
+ rating_ui_height: IntProperty(name="Rating UI Heightt", default=rating_ui_scale * 256)
+
+ quality_stars_x: IntProperty(name="Rating UI Stars X", default=rating_ui_scale * 90)
+ quality_stars_y: IntProperty(name="Rating UI Stars Y", default=rating_ui_scale * 190)
+
+ star_size: IntProperty(name="Star Size", default=rating_ui_scale * 50)
+
+ workhours_bar_slider_size: IntProperty(name="Workhours Bar Slider Size", default=rating_ui_scale * 30)
+
+ workhours_bar_x: IntProperty(name="Workhours Bar X", default=rating_ui_scale * (100 - 15))
+ workhours_bar_y: IntProperty(name="Workhours Bar Y", default=rating_ui_scale * (45 - 15))
+
+ workhours_bar_x_max: IntProperty(name="Workhours Bar X Max", default=rating_ui_scale * (480 - 15))
+
+ dragging_rating: BoolProperty(name="Dragging Rating", default=False)
+ dragging_rating_quality: BoolProperty(name="Dragging Rating Quality", default=False)
+ dragging_rating_work_hours: BoolProperty(name="Dragging Rating Work Hours", default=False)
+ last_rating_time: FloatProperty(name="Last Rating Time", default=0.0)
+
+
+class BlenderKitCommonSearchProps(object):
+ # STATES
+ is_searching: BoolProperty(name="Searching", description="search is currently running (internal)", default=False)
+ is_downloading: BoolProperty(name="Downloading", description="download is currently running (internal)",
+ default=False)
+ search_done: BoolProperty(name="Search Completed", description="at least one search did run (internal)",
+ default=False)
+ search_error: BoolProperty(name="Search Error", description="last search had an error", default=False)
+ report: StringProperty(
+ name="Report",
+ description="errors and messages",
+ default="")
+
+
+def name_update(self, context):
+ ''' checks for name change, because it decides if whole asset has to be re-uploaded. Name is stored in the blend file
+ and that's the reason.'''
+ props = utils.get_upload_props()
+ if props.name_old != props.name:
+ props.name_changed = True
+ props.name_old = props.name
+ nname = props.name.strip()
+ nname = nname.replace('_', ' ')
+ if nname.isupper():
+ nname = nname.lower()
+ nname = nname[0].upper() + nname[1:]
+ props.name = nname
+
+
+def update_tags(self, context):
+ props = utils.get_upload_props()
+
+ commasep = props.tags.split(',')
+ ntags = []
+ for tag in commasep:
+ if len(tag) > 19:
+ short_tags = tag.split(' ')
+ for short_tag in short_tags:
+ if len(short_tag) > 19:
+ short_tag = short_tag[:18]
+ ntags.append(short_tag)
+ else:
+ ntags.append(tag)
+ if len(ntags) == 1:
+ ntags = ntags[0].split(' ')
+ ns = ''
+ for t in ntags:
+ if t != '':
+ ns += t + ','
+ ns = ns[:-1]
+ if props.tags != ns:
+ props.tags = ns
+
+
+class BlenderKitCommonUploadProps(object):
+ id: StringProperty(
+ name="Asset Version Id",
+ description="Unique name of the asset version(hidden)",
+ default="")
+ asset_base_id: StringProperty(
+ name="Asset Base Id",
+ description="Unique name of the asset (hidden)",
+ default="")
+ name: StringProperty(
+ name="Name",
+ description="Main name of the asset",
+ default="",
+ update=name_update
+ )
+ # this is to store name for purpose of checking if name has changed.
+ name_old: StringProperty(
+ name="Old Name",
+ description="Old name of the asset",
+ default="",
+ )
+
+ description: StringProperty(
+ name="Description",
+ description="Description of the asset.",
+ default="")
+ tags: StringProperty(
+ name="Tags",
+ description="List of tags, separated by commas (optional)",
+ default="",
+ update=update_tags
+ )
+
+ name_changed: BoolProperty(name="Name Changed",
+ description="Name has changed, the asset has to be re-uploaded with all data",
+ default=False)
+
+ pbr: BoolProperty(name="Pure PBR Compatible",
+ description="Is compatible with PBR standard. This means only image textures are used with no"
+ " procedurals and no color correction, only pbr shader is used.",
+ default=False)
+
+ pbr_type: EnumProperty(
+ name="PBR Type",
+ items=pbr_types,
+ description="PBR type",
+ default="METALLIC",
+ )
+ license: EnumProperty(
+ items=licenses,
+ default='royalty_free',
+ description='License. Please read our help for choosing the right licenses',
+ )
+
+ is_free: BoolProperty(name="Free for Everyone",
+ description="You consent you want to release this asset as free for everyone.",
+ default=False)
+
+ uploading: BoolProperty(name="Uploading",
+ description="True when background process is running",
+ default=False,
+ update=autothumb.update_upload_material_preview)
+ upload_state: StringProperty(
+ name="State Of Upload",
+ description="bg process reports for upload",
+ default='')
+
+ has_thumbnail: BoolProperty(name="Has Thumbnail", description="True when thumbnail was checked and loaded",
+ default=False)
+
+ thumbnail_generating_state: StringProperty(
+ name="Thumbnail Generating State",
+ description="bg process reports for thumbnail generation",
+ default='Please add thumbnail(jpg, at least 512x512)')
+
+ report: StringProperty(
+ name="Missing Upload Properties",
+ description="used to write down what's missing",
+ default='')
+
+ category: EnumProperty(
+ name="Category",
+ description="main category to put into",
+ items=get_category_enums
+ )
+ subcategory: EnumProperty(
+ name="Subcategory",
+ description="main category to put into",
+ items=get_subcategory_enums
+ )
+
+
+class BlenderKitRatingProps(PropertyGroup):
+ rating_quality: IntProperty(name="Quality", description="quality of the material", default=0, min=-1, max=10)
+ rating_work_hours: FloatProperty(name="Work Hours", description="How many hours did this work take?", default=0.01,
+ min=0.0, max=1000
+ )
+ rating_complexity: IntProperty(name="Complexity",
+ description="Complexity is a number estimating how much work was spent on the asset.aaa",
+ default=0, min=0, max=10)
+ rating_virtual_price: FloatProperty(name="Virtual Price",
+ description="How much would you pay for this object if buing it?",
+ default=0, min=0, max=10000)
+ rating_problems: StringProperty(
+ name="Problems",
+ description="Problems found/ why did you take points down - this will be available for the author."
+ " As short as possible",
+ default="",
+ )
+ rating_compliments: StringProperty(
+ name="Compliments",
+ description="Comliments - let the author know you like his work! "
+ " As short as possible",
+ default="",
+ )
+
+
+class BlenderKitMaterialSearchProps(PropertyGroup, BlenderKitCommonSearchProps):
+ search_keywords: StringProperty(
+ name="Search",
+ description="Search for these keywords",
+ default="",
+ update=search.search_update
+ )
+ search_style: EnumProperty(
+ name="Style",
+ items=search_material_styles,
+ description="Style of material",
+ default="ANY",
+ )
+ search_style_other: StringProperty(
+ name="Style Other",
+ description="Style not in the list",
+ default="",
+ )
+ search_engine: EnumProperty(
+ name='Engine',
+ items=engines,
+ default='NONE',
+ description='Output engine',
+ )
+ search_engine_other: StringProperty(
+ name="Engine",
+ description="engine not specified by addon",
+ default="",
+ )
+ automap: BoolProperty(name="Auto-Map",
+ description="reset object texture space and also add automatically a cube mapped UV "
+ "to the object. \n this allows most materials to apply instantly to any mesh",
+ default=True)
+
+
+class BlenderKitMaterialUploadProps(PropertyGroup, BlenderKitCommonUploadProps):
+ style: EnumProperty(
+ name="Style",
+ items=material_styles,
+ description="Style of material",
+ default="REALISTIC",
+ )
+ style_other: StringProperty(
+ name="Style Other",
+ description="Style not in the list",
+ default="",
+ )
+ engine: EnumProperty(
+ name='Engine',
+ items=engines,
+ default='CYCLES',
+ description='Output engine',
+ )
+ engine_other: StringProperty(
+ name="Engine Other",
+ description="engine not specified by addon",
+ default="",
+ )
+
+ shaders: StringProperty(
+ name="Shaders Used",
+ description="shaders used in asset, autofilled",
+ default="",
+ )
+
+ uv: BoolProperty(name="Needs UV", description="needs an UV set", default=False)
+ # printable_3d : BoolProperty( name = "3d printable", description = "can be 3d printed", default = False)
+ animated: BoolProperty(name="Animated", description="is animated", default=False)
+ texture_resolution_min: IntProperty(name="Texture Resolution Min", description="texture resolution minimum",
+ default=0)
+ texture_resolution_max: IntProperty(name="Texture Resolution Max", description="texture resolution maximum",
+ default=0)
+
+ texture_size_meters: FloatProperty(name="Texture Size in Meters", description="face count, autofilled",
+ default=1.0, min=0)
+
+ thumbnail_scale: FloatProperty(name="Thumbnail Object Size",
+ description="size of material preview object in meters "
+ "- change for materials that look better at sizes different than 1m",
+ default=1, min=0.00001, max=10)
+ thumbnail_background: BoolProperty(name="Thumbnail Background",
+ description="For refractive materials, you might need a background. "
+ "Don't use if thumbnail looks good without it!",
+ default=False)
+ thumbnail_background_lightness: FloatProperty(name="Thumbnail Background Lightness",
+ description="set to make your material stand out", default=.9,
+ min=0.00001, max=1)
+ thumbnail_samples: IntProperty(name="Cycles Samples",
+ description="cycles samples setting", default=150,
+ min=5, max=5000)
+ thumbnail_denoising: BoolProperty(name="Use Denoising",
+ description="Use denoising", default=True)
+ adaptive_subdivision: BoolProperty(name="Adaptive Subdivide",
+ description="Use adaptive displacement subdivision", default=False)
+
+ thumbnail_generator_type: EnumProperty(
+ name="Thumbnail Style",
+ items=(
+ ('BALL', 'Ball', ""),
+ ('CUBE', 'Cube', 'cube'),
+ ('FLUID', 'Fluid', 'Fluid'),
+ ('CLOTH', 'Cloth', 'Cloth'),
+ ('HAIR', 'Hair', 'Hair ')
+ ),
+ description="Style of asset",
+ default="BALL",
+ )
+
+ thumbnail: StringProperty(
+ name="Thumbnail",
+ description="Path to the thumbnail - 512x512 .jpg image",
+ subtype='FILE_PATH',
+ default="",
+ update=autothumb.update_upload_material_preview)
+
+ is_generating_thumbnail: BoolProperty(name="Generating Thumbnail",
+ description="True when background process is running", default=False,
+ update=autothumb.update_upload_material_preview)
+
+
+class BlenderKitTextureUploadProps(PropertyGroup, BlenderKitCommonUploadProps):
+ style: EnumProperty(
+ name="Style",
+ items=material_styles,
+ description="Style of texture",
+ default="REALISTIC",
+ )
+ style_other: StringProperty(
+ name="Style Other",
+ description="Style not in the list",
+ default="",
+ )
+
+ pbr: BoolProperty(name="PBR Compatible", description="Is compatible with PBR standard", default=False)
+
+ # printable_3d : BoolProperty( name = "3d printable", description = "can be 3d printed", default = False)
+ animated: BoolProperty(name="Animated", description="is animated", default=False)
+ resolution: IntProperty(name="Texture Resolution", description="texture resolution", default=0)
+
+
+class BlenderKitBrushSearchProps(PropertyGroup, BlenderKitCommonSearchProps):
+ search_keywords: StringProperty(
+ name="Search",
+ description="Search for these keywords",
+ default="",
+ update=search.search_update
+ )
+
+
+class BlenderKitBrushUploadProps(PropertyGroup, BlenderKitCommonUploadProps):
+ mode: EnumProperty(
+ name="Mode",
+ items=(
+ ('IMAGE', 'Texture paint', "Texture brush"),
+ ('SCULPT', 'Sculpt', 'Sculpt brush'),
+ ('VERTEX', 'Vertex paint', 'Vertex paint brush'),
+ ('WEIGHT', 'Weight paint', 'Weight paint brush'),
+ ),
+ description="Mode where the brush works",
+ default="SCULPT",
+ )
+
+
+# upload properties
+class BlenderKitModelUploadProps(PropertyGroup, BlenderKitCommonUploadProps):
+ style: EnumProperty(
+ name="Style",
+ items=model_styles,
+ description="Style of asset",
+ default="REALISTIC",
+ )
+ style_other: StringProperty(
+ name="Style Other",
+ description="Style not in the list",
+ default="",
+ )
+ engine: EnumProperty(
+ name='Engine',
+ items=engines,
+ default='CYCLES',
+ description='Output engine',
+ )
+
+ production_level: EnumProperty(
+ name='Production Level',
+ items=(
+ ('FINISHED', 'Finished', 'Render or animation ready asset'),
+ ('TEMPLATE', 'Template', 'Asset intended to help in creation of something else'),
+ ),
+ default='FINISHED',
+ description='Production state of the asset, \n also template should be actually finished, \n'
+ 'just the nature of it can be a template, like a thumbnailer scene, \n '
+ 'finished mesh topology as start for modelling or similar.',
+ )
+
+ engine_other: StringProperty(
+ name="Engine",
+ description="engine not specified by addon",
+ default="",
+ )
+
+ engine1: EnumProperty(
+ name='2nd Engine',
+ items=engines,
+ default='NONE',
+ description='Output engine',
+ )
+ engine2: EnumProperty(
+ name='3rd Engine',
+ items=engines,
+ default='NONE',
+ description='Output engine',
+ )
+ engine3: EnumProperty(
+ name='4th Engine',
+ items=engines,
+ default='NONE',
+ description='Output engine',
+ )
+
+ manufacturer: StringProperty(
+ name="Manufacturer",
+ description="Manufacturer, company making a design peace or product.",
+ default="",
+ )
+
+ designer: StringProperty(
+ name="Designer",
+ description="Author of the original design piece depicted.",
+ default="",
+ )
+
+ design_collection: StringProperty(
+ name="Design Collection",
+ description="Fill if this piece is part of a design collection.",
+ default="",
+ )
+
+ design_variant: StringProperty(
+ name="Variant",
+ description="Colour or material variant of the product.",
+ default="",
+ )
+
+ thumbnail: StringProperty(
+ name="Thumbnail",
+ description="Path to the thumbnail - 512x512 .jpg image",
+ subtype='FILE_PATH',
+ default="",
+ update=autothumb.update_upload_model_preview)
+
+ thumbnail_background_lightness: FloatProperty(name="Thumbnail Background Lightness",
+ description="set to make your material stand out", default=.9,
+ min=0.01, max=10)
+
+ thumbnail_angle: EnumProperty(
+ name='Thumbnail Angle',
+ items=thumbnail_angles,
+ default='DEFAULT',
+ description='thumbnailer angle',
+ )
+
+ thumbnail_snap_to: EnumProperty(
+ name='Model Snaps To:',
+ items=thumbnail_snap,
+ default='GROUND',
+ description='typical placing of the interior. Leave on ground for most objects that respect gravity :)',
+ )
+
+ thumbnail_samples: IntProperty(name="Cycles Samples",
+ description="cycles samples setting", default=200,
+ min=5, max=5000)
+ thumbnail_denoising: BoolProperty(name="Use Denoising",
+ description="Use denoising", default=True)
+
+ use_design_year: BoolProperty(name="Use Design Year",
+ description="When this thing came into world for the first time\n"
+ " e.g. for dinosaur, you set -240 million years ;) ",
+ default=False)
+ design_year: IntProperty(name="Design Year", description="when was this item designed", default=1960)
+ # use_age : BoolProperty( name = "use item age", description = "use item age", default = False)
+ condition: EnumProperty(
+ items=conditions,
+ default='UNSPECIFIED',
+ description='age of the object',
+ )
+
+ adult: BoolProperty(name="Adult Content", description="adult content", default=False)
+
+ work_hours: FloatProperty(name="Work Hours", description="How long did it take you to finish the asset?",
+ default=0.0, min=0.0, max=8760)
+
+ modifiers: StringProperty(
+ name="Modifiers Used",
+ description="if you need specific modifiers, autofilled",
+ default="",
+ )
+
+ materials: StringProperty(
+ name="Material Names",
+ description="names of materials in the file, autofilled",
+ default="",
+ )
+ shaders: StringProperty(
+ name="Shaders Used",
+ description="shaders used in asset, autofilled",
+ default="",
+ )
+
+ dimensions: FloatVectorProperty(
+ name="Dimensions",
+ description="dimensions of the whole asset hierarchy",
+ default=(0, 0, 0),
+ )
+ bbox_min: FloatVectorProperty(
+ name="Bbox Min",
+ description="dimensions of the whole asset hierarchy",
+ default=(-.25, -.25, 0),
+ )
+ bbox_max: FloatVectorProperty(
+ name="Bbox Max",
+ description="dimensions of the whole asset hierarchy",
+ default=(.25, .25, .5),
+ )
+
+ texture_resolution_min: IntProperty(name="Texture Resolution Min",
+ description="texture resolution min, autofilled", default=0)
+ texture_resolution_max: IntProperty(name="Texture Resolution Max",
+ description="texture resolution max, autofilled", default=0)
+
+ pbr: BoolProperty(name="PBR Compatible", description="Is compatible with PBR standard", default=False)
+
+ uv: BoolProperty(name="Has UV", description="has an UV set", default=False)
+ # printable_3d : BoolProperty( name = "3d printable", description = "can be 3d printed", default = False)
+ animated: BoolProperty(name="Animated", description="is animated", default=False)
+ face_count: IntProperty(name="Face count", description="face count, autofilled", default=0)
+ face_count_render: IntProperty(name="Render Face Count", description="render face count, autofilled", default=0)
+
+ object_count: IntProperty(name="Number of Objects", description="how many objects are in the asset, autofilled",
+ default=0)
+ mesh_poly_type: EnumProperty(
+ name='Dominant Poly Type',
+ items=mesh_poly_types,
+ default='OTHER',
+ description='',
+ )
+
+ manifold: BoolProperty(name="Manifold", description="asset is manifold, autofilled", default=False)
+
+ rig: BoolProperty(name="Rig", description="asset is rigged, autofilled", default=False)
+ simulation: BoolProperty(name="Simulation", description="asset uses simulation, autofilled", default=False)
+ '''
+ filepath : StringProperty(
+ name="Filepath",
+ description="file path",
+ default="",
+ )
+ '''
+
+ # THUMBNAIL STATES
+ is_generating_thumbnail: BoolProperty(name="Generating Thumbnail",
+ description="True when background process is running", default=False,
+ update=autothumb.update_upload_model_preview)
+
+ has_autotags: BoolProperty(name="Has Autotagging Done", description="True when autotagging done", default=False)
+
+
+class BlenderKitSceneUploadProps(PropertyGroup, BlenderKitCommonUploadProps):
+ style: EnumProperty(
+ name="Style",
+ items=model_styles,
+ description="Style of asset",
+ default="REALISTIC",
+ )
+ style_other: StringProperty(
+ name="Style Other",
+ description="Style not in the list",
+ default="",
+ )
+ engine: EnumProperty(
+ name='Engine',
+ items=engines,
+ default='CYCLES',
+ description='Output engine',
+ )
+
+ production_level: EnumProperty(
+ name='Production Level',
+ items=(
+ ('FINISHED', 'Finished', 'Render or animation ready asset'),
+ ('TEMPLATE', 'Template', 'Asset intended to help in creation of something else'),
+ ),
+ default='FINISHED',
+ description='Production state of the asset, \n also template should be actually finished, \n'
+ 'just the nature of it can be a template, like a thumbnailer scene, \n '
+ 'finished mesh topology as start for modelling or similar.',
+ )
+
+ engine_other: StringProperty(
+ name="Engine",
+ description="engine not specified by addon",
+ default="",
+ )
+
+ engine1: EnumProperty(
+ name='2nd Engine',
+ items=engines,
+ default='NONE',
+ description='Output engine',
+ )
+ engine2: EnumProperty(
+ name='3rd Engine',
+ items=engines,
+ default='NONE',
+ description='Output engine',
+ )
+ engine3: EnumProperty(
+ name='4th Engine',
+ items=engines,
+ default='NONE',
+ description='Output engine',
+ )
+
+ thumbnail: StringProperty(
+ name="Thumbnail",
+ description="Path to the thumbnail - 512x512 .jpg image",
+ subtype='FILE_PATH',
+ default="",
+ update=autothumb.update_upload_scene_preview)
+
+ use_design_year: BoolProperty(name="Use Design Year",
+ description="When this thing came into world for the first time\n"
+ " e.g. for dinosaur, you set -240 million years ;) ",
+ default=False)
+ design_year: IntProperty(name="Design Year", description="when was this item designed", default=1960)
+ # use_age : BoolProperty( name = "use item age", description = "use item age", default = False)
+ condition: EnumProperty(
+ items=conditions,
+ default='UNSPECIFIED',
+ description='age of the object',
+ )
+
+ adult: BoolProperty(name="Adult Content", description="adult content", default=False)
+
+ work_hours: FloatProperty(name="Work Hours", description="How long did it take you to finish the asset?",
+ default=0.0, min=0.0, max=8760)
+
+ modifiers: StringProperty(
+ name="Modifiers Used",
+ description="if you need specific modifiers, autofilled",
+ default="",
+ )
+
+ materials: StringProperty(
+ name="Material Names",
+ description="names of materials in the file, autofilled",
+ default="",
+ )
+ shaders: StringProperty(
+ name="Shaders Used",
+ description="shaders used in asset, autofilled",
+ default="",
+ )
+
+ dimensions: FloatVectorProperty(
+ name="Dimensions",
+ description="dimensions of the whole asset hierarchy",
+ default=(0, 0, 0),
+ )
+ bbox_min: FloatVectorProperty(
+ name="Dimensions",
+ description="dimensions of the whole asset hierarchy",
+ default=(-.25, -.25, 0),
+ )
+ bbox_max: FloatVectorProperty(
+ name="Dimensions",
+ description="dimensions of the whole asset hierarchy",
+ default=(.25, .25, .5),
+ )
+
+ texture_resolution_min: IntProperty(name="Texture Eesolution Min",
+ description="texture resolution min, autofilled", default=0)
+ texture_resolution_max: IntProperty(name="Texture Eesolution Max",
+ description="texture resolution max, autofilled", default=0)
+
+ pbr: BoolProperty(name="PBR Compatible", description="Is compatible with PBR standard", default=False)
+
+ uv: BoolProperty(name="Has UV", description="has an UV set", default=False)
+ # printable_3d : BoolProperty( name = "3d printable", description = "can be 3d printed", default = False)
+ animated: BoolProperty(name="Animated", description="is animated", default=False)
+ face_count: IntProperty(name="Face Count", description="face count, autofilled", default=0)
+ face_count_render: IntProperty(name="Render Face Count", description="render face count, autofilled", default=0)
+
+ object_count: IntProperty(name="Number of Objects", description="how many objects are in the asset, autofilled",
+ default=0)
+ mesh_poly_type: EnumProperty(
+ name='Dominant Poly Type',
+ items=mesh_poly_types,
+ default='OTHER',
+ description='',
+ )
+
+ rig: BoolProperty(name="Rig", description="asset is rigged, autofilled", default=False)
+ simulation: BoolProperty(name="Simulation", description="asset uses simulation, autofilled", default=False)
+
+ # THUMBNAIL STATES
+ is_generating_thumbnail: BoolProperty(name="Generating Thumbnail",
+ description="True when background process is running", default=False,
+ update=autothumb.update_upload_model_preview)
+
+ has_autotags: BoolProperty(name="Has Autotagging Done", description="True when autotagging done", default=False)
+
+
+class BlenderKitModelSearchProps(PropertyGroup, BlenderKitCommonSearchProps):
+ search_keywords: StringProperty(
+ name="Search",
+ description="Search for these keywords",
+ default="",
+ update=search.search_update
+ )
+ search_style: EnumProperty(
+ name="Style",
+ items=search_model_styles,
+ description="keywords defining style (realistic, painted, polygonal, other)",
+ default="ANY",
+ update=search.search_update
+ )
+ search_style_other: StringProperty(
+ name="Style",
+ description="Search style - other",
+ default="",
+ update=search.search_update
+ )
+ search_engine: EnumProperty(
+ items=engines,
+ default='CYCLES',
+ description='Output engine',
+ update=search.search_update
+ )
+ search_engine_other: StringProperty(
+ name="Engine",
+ description="engine not specified by addon",
+ default="",
+ update=search.search_update
+ )
+
+ search_advanced: BoolProperty(name="Advanced Search Options", description="use advanced search properties",
+ default=False)
+
+ # CONDITION
+ search_condition: EnumProperty(
+ items=conditions,
+ default='UNSPECIFIED',
+ description='condition of the object',
+ update=search.search_update
+ )
+
+ search_adult: BoolProperty(
+ name="Adult Content",
+ description="You're adult and agree with searching adult content",
+ default=False,
+ update=search.search_update
+ )
+
+ # DESIGN YEAR
+ search_design_year: BoolProperty(name="Sesigned in Year",
+ description="when the object was approximately designed",
+ default=False)
+
+ search_design_year_min: IntProperty(name="Min Age",
+ description="when the object was approximately designed",
+ default=1950, min=-100000000, max=1000000000)
+
+ search_design_year_max: IntProperty(name="Max Age",
+ description="when the object was approximately designed",
+ default=2017,
+ min=0,
+ max=10000000)
+
+ # TEXTURE RESOLUTION
+ search_texture_resolution: BoolProperty(name="Texture Resolution",
+ description="Span of the texture resolutions",
+ default=False)
+
+ search_texture_resolution_min: IntProperty(name="Min Texture Resolution",
+ description="when the object was approximately designed",
+ default=256,
+ min=0,
+ max=32768)
+
+ search_texture_resolution_max: IntProperty(name="Max Texture Resolution",
+ description="when the object was approximately designed",
+ default=4096,
+ min=0,
+ max=32768)
+
+ # POLYCOUNT
+ search_polycount: BoolProperty(name="Use Polycount",
+ description="use polycount of object search tag",
+ default=False)
+
+ search_polycount_min: IntProperty(name="Min Polycount",
+ description="polycount of the asset minimum",
+ default=0,
+ min=0,
+ max=100000000)
+
+ search_polycount_max: IntProperty(name="Max Polycount",
+ description="polycount of the asset maximum",
+ default=100000000,
+ min=0,
+ max=100000000)
+
+ append_method: EnumProperty(
+ name="Import Method",
+ items=(
+ ('LINK_GROUP', 'Link Group', ''),
+ ('APPEND_OBJECTS', 'Append Objects', ''),
+ ),
+ description="choose if the assets will be linked or appended",
+ default="LINK_GROUP"
+ )
+ append_link: EnumProperty(
+ name="How to Attach",
+ items=(
+ ('LINK', 'Link', ''),
+ ('APPEND', 'Append', ''),
+ ),
+ description="choose if the assets will be linked or appended",
+ default="LINK"
+ )
+ import_as: EnumProperty(
+ name="Import as",
+ items=(
+ ('GROUP', 'group', ''),
+ ('INDIVIDUAL', 'objects', ''),
+
+ ),
+ description="choose if the assets will be linked or appended",
+ default="GROUP"
+ )
+ randomize_rotation: BoolProperty(name='Randomize Rotation',
+ description="randomize rotation at placement",
+ default=False)
+ randomize_rotation_amount: FloatProperty(name="Randomization Max Angle",
+ description="maximum angle for random rotation",
+ default=math.pi / 36,
+ min=0,
+ max=2 * math.pi,
+ subtype='ANGLE')
+ offset_rotation_amount: FloatProperty(name="Offset Rotation",
+ description="offset rotation, hidden prop",
+ default=0,
+ min=0,
+ max=360,
+ subtype='ANGLE')
+ offset_rotation_step: FloatProperty(name="Offset Rotation Step",
+ description="offset rotation, hidden prop",
+ default=math.pi / 2,
+ min=0,
+ max=180,
+ subtype='ANGLE')
+
+
+class BlenderKitSceneSearchProps(PropertyGroup, BlenderKitCommonSearchProps):
+ search_keywords: StringProperty(
+ name="Search",
+ description="Search for these keywords",
+ default="",
+ update=search.search_update
+ )
+ search_style: EnumProperty(
+ name="Style",
+ items=search_model_styles,
+ description="keywords defining style (realistic, painted, polygonal, other)",
+ default="ANY",
+ update=search.search_update
+ )
+ search_style_other: StringProperty(
+ name="Style",
+ description="Search style - other",
+ default="",
+ update=search.search_update
+ )
+ search_engine: EnumProperty(
+ items=engines,
+ default='CYCLES',
+ description='Output engine',
+ update=search.search_update
+ )
+ search_engine_other: StringProperty(
+ name="Engine",
+ description="engine not specified by addon",
+ default="",
+ update=search.search_update
+ )
+
+
+class BlenderKitAddonPreferences(AddonPreferences):
+ # this must match the addon name, use '__package__'
+ # when defining this in a submodule of a python package.
+ bl_idname = __name__
+ from os.path import expanduser
+ home = expanduser("~")
+ default_global_dict = home + os.sep + 'blenderkit_data'
+
+ api_key: StringProperty(
+ name="BlenderKit API Key",
+ description="Your blenderkit API Key. Get it from your page on the website.",
+ default="",
+ subtype="PASSWORD",
+ update=utils.save_prefs
+ )
+
+ global_dir: StringProperty(
+ name="Global Files Directory",
+ description="Global storage for your assets, will use subdirectories for the contents.",
+ subtype='DIR_PATH',
+ default=default_global_dict,
+ update=utils.save_prefs
+ )
+
+ project_subdir: StringProperty(
+ name="Project Assets Subdirectory",
+ description="where data will be stored for individual projects.",
+ subtype='DIR_PATH',
+ default="//assets",
+ )
+
+ directory_behaviour: EnumProperty(
+ name="Use Directories",
+ items=(
+ ('BOTH', 'Global and subdir',
+ 'store files both in global lib and subdirectory of current project. '
+ 'Warning - each file can be many times on your harddrive, but helps you keep your projects in one piece.'),
+ ('GLOBAL', 'Global',
+ "store downloaded files only in global directory. \n "
+ "This can bring problems when moving your projects, \n"
+ "since assets won't be in subdirectory of current project"),
+ ('LOCAL', 'Local',
+ 'store downloaded files only in local directory.\n'
+ ' This can use more bandwidth when you reuse assets in different projects. ')
+
+ ),
+ description="Which directories will be used for storing downloaded data",
+ default="BOTH",
+ )
+ thumbnail_use_gpu: BoolProperty(
+ name="Use GPU for Thumbnails Rendering",
+ description="By default this is off so you can continue your work without any lag.",
+ default=True
+ )
+
+ panel_behaviour: EnumProperty(
+ name="Panels Locations",
+ items=(
+ ('BOTH', 'Both Types',
+ ''),
+ ('UNIFIED', 'Unified 3d View Panel',
+ ""),
+ ('LOCAL', 'Relative to Data',
+ '')
+
+ ),
+ description="Which directories will be used for storing downloaded data",
+ default="UNIFIED",
+ )
+
+ max_assetbar_rows: IntProperty(name="Max Assetbar Rows",
+ description="max rows of assetbar in the 3d view",
+ default=1,
+ min=0,
+ max=20)
+
+ # allow_proximity : BoolProperty(
+ # name="allow proximity data reports",
+ # description="This sends anonymized proximity data \n \
+ # and allows us to make relations between database objects \n \
+ # without user interaction.",
+ # default=False
+ # )
+
+ def draw(self, context):
+ layout = self.layout
+
+ if self.api_key.strip() == '':
+ op = layout.operator("wm.url_open", text="Register online and get your API Key",
+ icon='QUESTION')
+ op.url = paths.BLENDERKIT_SIGNUP_URL
+ layout.prop(self, "api_key", text='Your API Key')
+ # layout.label('After you paste API Key, categories are downloaded, so blender will freeze for a few seconds.')
+ layout.prop(self, "global_dir")
+ layout.prop(self, "project_subdir")
+ # layout.prop(self, "temp_dir")
+ layout.prop(self, "directory_behaviour")
+ layout.prop(self, "thumbnail_use_gpu")
+ # layout.prop(self, "allow_proximity")
+ # layout.prop(self, "panel_behaviour")
+ layout.prop(self, "max_assetbar_rows")
+
+
+# registration
+classes = (
+
+ BlenderKitAddonPreferences,
+ BlenderKitUIProps,
+
+ BlenderKitModelSearchProps,
+ BlenderKitModelUploadProps,
+
+ BlenderKitSceneSearchProps,
+ BlenderKitSceneUploadProps,
+
+ BlenderKitMaterialUploadProps,
+ BlenderKitMaterialSearchProps,
+
+ BlenderKitTextureUploadProps,
+
+ BlenderKitBrushSearchProps,
+ BlenderKitBrushUploadProps,
+
+ BlenderKitRatingProps,
+)
+
+
+def register():
+ for cls in classes:
+ bpy.utils.register_class(cls)
+
+ bpy.types.Scene.blenderkitUI = PointerProperty(
+ type=BlenderKitUIProps)
+
+ # MODELS
+ bpy.types.Scene.blenderkit_models = PointerProperty(
+ type=BlenderKitModelSearchProps)
+ bpy.types.Object.blenderkit = PointerProperty( # for uploads, not now...
+ type=BlenderKitModelUploadProps)
+ bpy.types.Object.bkit_ratings = PointerProperty( # for uploads, not now...
+ type=BlenderKitRatingProps)
+
+ # SCENES
+ bpy.types.Scene.blenderkit_scene = PointerProperty(
+ type=BlenderKitSceneSearchProps)
+ bpy.types.Scene.blenderkit = PointerProperty( # for uploads, not now...
+ type=BlenderKitSceneUploadProps)
+ bpy.types.Scene.bkit_ratings = PointerProperty( # for uploads, not now...
+ type=BlenderKitRatingProps)
+
+ # MATERIALS
+ bpy.types.Scene.blenderkit_mat = PointerProperty(
+ type=BlenderKitMaterialSearchProps)
+ bpy.types.Material.blenderkit = PointerProperty( # for uploads, not now...
+ type=BlenderKitMaterialUploadProps)
+ bpy.types.Material.bkit_ratings = PointerProperty( # for uploads, not now...
+ type=BlenderKitRatingProps)
+
+ # BRUSHES
+ bpy.types.Scene.blenderkit_brush = PointerProperty(
+ type=BlenderKitBrushSearchProps)
+ bpy.types.Brush.blenderkit = PointerProperty( # for uploads, not now...
+ type=BlenderKitBrushUploadProps)
+ bpy.types.Brush.bkit_ratings = PointerProperty( # for uploads, not now...
+ type=BlenderKitRatingProps)
+
+ search.register_search()
+ asset_inspector.register_asset_inspector()
+ download.register_download()
+ upload.register_upload()
+ ratings.register_ratings()
+ autothumb.register_thumbnailer()
+ ui.register_ui()
+ ui_panels.register_ui_panels()
+ bg_blender.register()
+ bpy.app.handlers.load_post.append(scene_load)
+ utils.load_prefs()
+ overrides.register_overrides()
+
+
+def unregister():
+ for cls in classes:
+ bpy.utils.unregister_class(cls)
+
+ del bpy.types.Scene.blenderkit_models
+ del bpy.types.Scene.blenderkit_scene
+ del bpy.types.Scene.blenderkit_brush
+ del bpy.types.Scene.blenderkit_mat
+
+ del bpy.types.Scene.blenderkit
+ del bpy.types.Object.blenderkit
+ del bpy.types.Material.blenderkit
+ del bpy.types.Brush.blenderkit
+
+ search.unregister_search()
+ asset_inspector.unregister_asset_inspector()
+ download.unregister_download()
+ upload.unregister_upload()
+ ratings.unregister_ratings()
+ autothumb.unregister_thumbnailer()
+ ui.unregister_ui()
+ ui_panels.unregister_ui_panels()
+ bg_blender.unregister()
+ overrides.unregister_overrides()