Newer
Older
# ##### 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 = {
"author": "Vilem Duha, Petr Dlouhy",
"description": "Online BlenderKit library (materials, models, brushes and more). Connects to the internet.",
"doc_url": "{BLENDER_MANUAL_URL}/addons/add_mesh/blenderkit.html",
from importlib import reload
asset_inspector = reload(asset_inspector)
search = reload(search)
download = reload(download)
upload = reload(upload)
ratings = reload(ratings)
autothumb = reload(autothumb)
ui = reload(ui)
bg_blender = reload(bg_blender)
paths = reload(paths)
utils = reload(utils)
overrides = reload(overrides)
ui_panels = reload(ui_panels)
categories = reload(categories)
bkit_oauth = reload(bkit_oauth)
tasks_queue = reload(tasks_queue)
from blenderkit import asset_inspector, search, download, upload, ratings, autothumb, ui, icons, bg_blender, paths, \
utils, \
overrides, ui_panels, categories, bkit_oauth, tasks_queue, resolutions
import os
import math
import time
# import logging
import bpy
Vilém Duha
committed
import pathlib
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):
if not bpy.app.background:
search.load_previews()
ui_props = bpy.context.scene.blenderkitUI
ui_props.assetbar_on = False
ui_props.turn_off = False
preferences = bpy.context.preferences.addons['blenderkit'].preferences
preferences.login_attempt = False
def check_timers_timer():
''' checks if all timers are registered regularly. Prevents possible bugs from stopping the addon.'''
if not bpy.app.timers.is_registered(search.timer_update):
bpy.app.timers.register(search.timer_update)
if not bpy.app.timers.is_registered(download.timer_update):
bpy.app.timers.register(download.timer_update)
if not (bpy.app.timers.is_registered(tasks_queue.queue_worker)):
bpy.app.timers.register(tasks_queue.queue_worker)
if not bpy.app.timers.is_registered(bg_blender.bg_update):
bpy.app.timers.register(bg_blender.bg_update)
return 5.0
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'),
Vilem Duha
committed
('NONE', 'None', 'no more engine block'),
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
)
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', ''),
)
thumbnail_resolutions = (
('256', '256', ''),
('512', '512 - minimum for public', ''),
('1024', '1024', ''),
('2048', '2048', ''),
)
def udate_down_up(self, context):
"""Perform a search if results are empty."""
s = context.scene
props = s.blenderkitUI
if s['search results'] == None and props.down_up == 'SEARCH':
search.search()
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 == 'HDR':
s['search results'] = s.get('bkit hdr search')
s['search results orig'] = s.get('bkit hdr search orig')
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')
if not(context.sculpt_object or context.image_paint_object):
ui.add_report(
'Switch to paint or sculpt mode to search in BlenderKit brushes.')
if s['search results'] == None and props.down_up == 'SEARCH':
search.search()
'''
Returns
items for Enum property, depending on the down_up property - BlenderKit is either in search or in upload mode.
'''
user_preferences = bpy.context.preferences.addons['blenderkit'].preferences
if user_preferences.experimental_features:
if self.down_up == 'SEARCH':
items = (
('MODEL', 'Models', 'Find models in the BlenderKit online database', 'OBJECT_DATAMODE', 0),
('MATERIAL', 'Materials', 'Find materials in the BlenderKit online database', 'MATERIAL', 2),
# ('TEXTURE', 'Texture', 'Browse textures', 'TEXTURE', 3),
('SCENE', 'Scenes', 'Browse scenes', 'SCENE_DATA', 3),
('HDR', 'Hdrs', 'Browse hdrs', 'WORLD', 4),
('BRUSH', 'Brushes', 'Find brushes in the BlenderKit online database', 'BRUSH_DATA', 5)
)
else:
items = (
('MODEL', 'Model', 'Upload a model to BlenderKit', 'OBJECT_DATAMODE', 0),
# ('SCENE', 'SCENE', 'Browse scenes', 'SCENE_DATA', 1),
('MATERIAL', 'Material', 'Upload a material to BlenderKit', 'MATERIAL', 2),
# ('TEXTURE', 'Texture', 'Browse textures', 'TEXTURE', 3),
('SCENE', 'Scenes', 'Browse scenes', 'SCENE_DATA', 3),
('HDR', 'Hdrs', 'Browse hdrs', 'WORLD', 4),
('BRUSH', 'Brush', 'Upload a brush to BlenderKit', 'BRUSH_DATA', 5)
)
if self.down_up == 'SEARCH':
items = (
('MODEL', 'Models', 'Find models in the BlenderKit online database', 'OBJECT_DATAMODE', 0),
('MATERIAL', 'Materials', 'Find materials in the BlenderKit online database', 'MATERIAL', 2),
# ('TEXTURE', 'Texture', 'Browse textures', 'TEXTURE', 3),
('BRUSH', 'Brushes', 'Find brushes in the BlenderKit online database', 'BRUSH_DATA', 5)
)
else:
items = (
('MODEL', 'Model', 'Upload a model to BlenderKit', 'OBJECT_DATAMODE', 0),
# ('SCENE', 'SCENE', 'Browse scenes', 'SCENE_DATA', 1),
('MATERIAL', 'Material', 'Upload a material to BlenderKit', 'MATERIAL', 2),
# ('TEXTURE', 'Texture', 'Browse textures', 'TEXTURE', 3),
('BRUSH', 'Brush', 'Upload a brush to BlenderKit', 'BRUSH_DATA', 5)
)
class BlenderKitUIProps(PropertyGroup):
down_up: EnumProperty(
name="Download vs Upload",
items=(
('SEARCH', 'Search', 'Sctivate searching', 'VIEWZOOM', 0),
('UPLOAD', 'Upload', 'Activate uploading', 'COPYDOWN', 1),
# ('RATING', 'Rating', 'Activate rating', 'SOLO_ON', 2)
),
description="BLenderKit",
default="SEARCH",
name="BlenderKit Active Asset Type",
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="Highlight Margin", default=int(margin_def / 2), min=-10, max=256)
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
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)
hdr_upload_image: PointerProperty(name='Upload HDR',
type=bpy.types.Image,
description='Pick an image to upload')
# StringProperty(
# name="Upload HDR",
# description="Active HDR image to upload",
# default="")
def search_procedural_update(self, context):
if self.search_procedural in ('PROCEDURAL', 'BOTH'):
self.search_texture_resolution = False
search.search_update(self, context)
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)
own_only: BoolProperty(name="My Assets", description="Search only for your assets",
default=False, update=search.search_update)
search_advanced: BoolProperty(name="Advanced Search Options", description="use advanced search properties",
default=False, update=search.search_update)
search_error: BoolProperty(name="Search Error", description="last search had an error", default=False)
report: StringProperty(
name="Report",
description="errors and messages",
default="")
# TEXTURE RESOLUTION
search_texture_resolution: BoolProperty(name="Texture Resolution",
description="Span of the texture resolutions",
default=False,
update=search.search_update,
)
search_texture_resolution_min: IntProperty(name="Min Texture Resolution",
description="Minimum texture resolution",
default=256,
min=0,
max=32768,
update=search.search_update,
)
search_texture_resolution_max: IntProperty(name="Max Texture Resolution",
description="Maximum texture resolution",
default=4096,
min=0,
max=32768,
update=search.search_update,
)
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
# file_size
search_file_size: BoolProperty(name="File Size",
description="Span of the file sizes",
default=False,
update=search.search_update,
)
search_file_size_min: IntProperty(name="Min File Size",
description="Minimum file size",
default=0,
min=0,
max=2000,
update=search.search_update,
)
search_file_size_max: IntProperty(name="Max File Size",
description="Maximum file size",
default=500,
min=0,
max=2000,
update=search.search_update,
)
search_procedural: EnumProperty(
items=(
('BOTH', 'Both', ''),
('PROCEDURAL', 'Procedural', ''),
('TEXTURE_BASED', 'Texture based', ''),
),
default='BOTH',
description='Search only procedural/texture based assets',
update=search_procedural_update
)
search_verification_status: EnumProperty(
name="Verification status",
description="Search by verification status",
items=
(
('ALL', 'All', 'All'),
('UPLOADING', 'Uploading', 'Uploading'),
('UPLOADED', 'Uploaded', 'Uploaded'),
('READY', 'Ready for V.', 'Ready for validation (deprecated since 2.8)'),
('VALIDATED', 'Validated', 'Calidated'),
('ON_HOLD', 'On Hold', 'On Hold'),
('REJECTED', 'Rejected', 'Rejected'),
('DELETED', 'Deleted', 'Deleted'),
),
update=search.search_update,
# resolution download/import settings
resolution: EnumProperty(
name="Max resolution",
description="Cap texture sizes in the file to this resolution",
items=
(
# ('256', '256x256', ''),
('512', '512x512', ''),
('1024', '1024x1024', ''),
('2048', '2048x2048', ''),
('4096', '4096x4096', ''),
('8192', '8192x8192', ''),
('ORIGINAL', 'ORIGINAL FILE', ''),
),
default='1024',
)
unpack_files: BoolProperty(name="Unpack Files",
description="Unpack files after download",
default=True
)
unrated_only: BoolProperty(name="Unrated only", description="Show only unrated models",
default=False, update=search.search_update)
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.'''
utils.name_update()
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
def update_free(self, context):
if self.is_free == False:
self.is_free = True
title = "All BlenderKit materials are free"
message = "Any material uploaded to BlenderKit is free." \
" However, it can still earn money for the author," \
" based on our fair share system. " \
"Part of subscription is sent to artists based on usage by paying users."
utils.label_multiline(self.layout, text=message, icon='NONE', width=-1)
bpy.context.window_manager.popup_menu(draw_message, title=title, icon='INFO')
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",
Vilem Duha
committed
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"
Vilem Duha
committed
" 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_private: EnumProperty(
name="Thumbnail Style",
items=(
('PRIVATE', 'Private', "You asset will be hidden to public. The private assets are limited by a quota."),
('PUBLIC', 'Public', '"Your asset will go into the validation process automatically')
),
description="If not marked private, your asset will go into the validation process automatically\n"
"Private assets are limited by quota.",
default="PUBLIC",
)
is_procedural: BoolProperty(name="Procedural",
description="Asset is procedural - has no texture.",
default=True
)
node_count: IntProperty(name="Node count", description="Total nodes in the asset", default=0)
texture_count: IntProperty(name="Texture count", description="Total texture count in asset", default=0)
total_megapixels: IntProperty(name="Megapixels", description="Total megapixels of texture", default=0)
# is_private: BoolProperty(name="Asset is Private",
# description="If not marked private, your asset will go into the validation process automatically\n"
# "Private assets are limited by quota.",
# default=False)
is_free: BoolProperty(name="Free for Everyone",
Vilem Duha
committed
description="You consent you want to release this asset as free for everyone",
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
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=categories.get_category_enums
)
subcategory: EnumProperty(
name="Subcategory",
description="Subcategory to put into",
items=categories.get_subcategory_enums
subcategory1: EnumProperty(
name="Subcategory lvl2",
description="Subcategory to put into",
items=categories.get_subcategory1_enums
)
class BlenderKitRatingProps(PropertyGroup):
rating_quality: IntProperty(name="Quality",
description="quality of the material",
default=0,
min=-1, max=10,
update=ratings.update_ratings_quality)
# the following enum is only to ease interaction - enums support 'drag over' and enable to draw the stars easily.
rating_quality_ui: EnumProperty(name='rating_quality_ui',
items=ratings.stars_enum_callback,
description='Rating stars 0 - 10',
default=None,
update=ratings.update_quality_ui,
)
rating_work_hours: FloatProperty(name="Work Hours",
description="How many hours did this work take?",
min=0.0, max=1000, update=ratings.update_ratings_work_hours
# 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",
Vilem Duha
committed
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="",
append_method: EnumProperty(
name="Import Method",
items=(
('LINK', 'Link', "Link Material - will be in external file and can't be directly edited"),
('APPEND', 'Append', 'Append if you need to edit the material'),
),
description="Appended materials are editable in your scene. Linked assets are saved in original files, "
"aren't editable directly, but also don't increase your file size",
default="APPEND"
)
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
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="",
)
is_free: BoolProperty(name="Free for Everyone",
description="You consent you want to release this asset as free for everyone",
default=True, update=update_free
)
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 (for Glass only)",
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_resolution: EnumProperty(
name="Resolution",
items=thumbnail_resolutions,
description="Thumbnail resolution.",
default="512",
)
thumbnail_generator_type: EnumProperty(
name="Thumbnail Style",
items=(
('BALL', 'Ball', ""),
('BALL_COMPLEX', 'Ball complex', 'Complex ball to highlight edgewear or material thickness'),
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
('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 BlenderKitHDRUploadProps(PropertyGroup, BlenderKitCommonUploadProps):
pass;
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
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 '
Vilem Duha
committed
'finished mesh topology as start for modelling or similar',
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
)
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. Not you",
default="",
)
designer: StringProperty(
name="Designer",