Skip to content
Snippets Groups Projects
__init__.py 70.6 KiB
Newer Older
  • Learn to ignore specific revisions
  • Vilem Duha's avatar
    Vilem Duha committed
    # ##### BEGIN GPL LICENSE BLOCK #####
    #
    #  This program is free software; you can redistribute it and/or
    #  modify it under the terms of the GNU General Public License
    #  as published by the Free Software Foundation; either version 2
    #  of the License, or (at your option) any later version.
    #
    #  This program is distributed in the hope that it will be useful,
    #  but WITHOUT ANY WARRANTY; without even the implied warranty of
    #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    #  GNU General Public License for more details.
    #
    #  You should have received a copy of the GNU General Public License
    #  along with this program; if not, write to the Free Software Foundation,
    #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
    #
    # ##### END GPL LICENSE BLOCK #####
    
    bl_info = {
    
    Vilém Duha's avatar
    Vilém Duha committed
        "name": "BlenderKit Online Asset Library",
    
        "author": "Vilem Duha, Petr Dlouhy",
    
        "version": (2, 92, 0),
    
    Vilém Duha's avatar
    Vilém Duha committed
        "blender": (2, 92, 0),
    
    Vilem Duha's avatar
    Vilem Duha committed
        "location": "View3D > Properties > BlenderKit",
    
    Vilém Duha's avatar
    Vilém Duha committed
        "description": "Online BlenderKit library (materials, models, brushes and more). Connects to the internet.",
    
    Vilem Duha's avatar
    Vilem Duha committed
        "warning": "",
    
        "doc_url": "{BLENDER_MANUAL_URL}/addons/add_mesh/blenderkit.html",
    
    Vilém Duha's avatar
    Vilém Duha committed
        "category": "3D View",
    
    Vilem Duha's avatar
    Vilem Duha committed
    }
    
    if "bpy" in locals():
    
        from importlib import reload
    
        #alphabetically sorted all add-on modules since reload only happens from __init__.
        # modules with _bg are used for background computations in separate blender instance and that's why they don't need reload.
    
        append_link = reload(append_link)
    
        asset_bar_op = reload(asset_bar_op)
    
        asset_inspector = reload(asset_inspector)
        autothumb = reload(autothumb)
        bg_blender = reload(bg_blender)
        bkit_oauth = reload(bkit_oauth)
    
        categories = reload(categories)
        colors = reload(colors)
        download = reload(download)
        icons = reload(icons)
        image_utils = reload(image_utils)
        oauth = reload(oauth)
        overrides = reload(overrides)
        paths = reload(paths)
        ratings = reload(ratings)
    
    Vilém Duha's avatar
    Vilém Duha committed
        resolutions = reload(resolutions)
    
        search = reload(search)
        tasks_queue = reload(tasks_queue)
        ui = reload(ui)
        ui_bgl = reload(ui_bgl)
        ui_panels = reload(ui_panels)
        upload = reload(upload)
        utils = reload(utils)
    
    
        bl_ui_label = reload(bl_ui_label)
        bl_ui_button = reload(bl_ui_button)
        # bl_ui_checkbox = reload(bl_ui_checkbox)
        # bl_ui_slider = reload(bl_ui_slider)
        # bl_ui_up_down = reload(bl_ui_up_down)
        bl_ui_drag_panel = reload(bl_ui_drag_panel)
        bl_ui_draw_op = reload(bl_ui_draw_op)
        # bl_ui_textbox = reload(bl_ui_textbox)
    
    
    Vilem Duha's avatar
    Vilem Duha committed
    else:
    
        from blenderkit import append_link
    
        from blenderkit import asset_bar_op
    
        from blenderkit import asset_inspector
        from blenderkit import autothumb
        from blenderkit import bg_blender
        from blenderkit import bkit_oauth
        from blenderkit import categories
        from blenderkit import colors
        from blenderkit import download
        from blenderkit import icons
        from blenderkit import image_utils
        from blenderkit import oauth
        from blenderkit import overrides
        from blenderkit import paths
        from blenderkit import ratings
        from blenderkit import resolutions
        from blenderkit import search
        from blenderkit import tasks_queue
        from blenderkit import ui
        from blenderkit import ui_bgl
        from blenderkit import ui_panels
        from blenderkit import upload
        from blenderkit import utils
    
    
        from blenderkit.bl_ui_widgets import bl_ui_label 
        from blenderkit.bl_ui_widgets import bl_ui_button 
        # from blenderkit.bl_ui_widgets import bl_ui_checkbox
        # from blenderkit.bl_ui_widgets import bl_ui_slider
        # from blenderkit.bl_ui_widgets import bl_ui_up_down
        from blenderkit.bl_ui_widgets import bl_ui_drag_panel 
        from blenderkit.bl_ui_widgets import bl_ui_draw_op 
        # from blenderkit.bl_ui_widgets import bl_ui_textbox
    
    
    Vilem Duha's avatar
    Vilem Duha committed
    
    import os
    import math
    import time
    
    Vilem Duha's avatar
    Vilem Duha committed
    import bpy
    
    log = logging.getLogger(__name__)
    
    
    
    Vilem Duha's avatar
    Vilem Duha committed
    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,
    )
    
    
    Vilem Duha's avatar
    Vilem Duha committed
    # logging.basicConfig(filename = 'blenderkit.log', level = logging.INFO,
    #                     format = '	%(asctime)s:%(filename)s:%(funcName)s:%(lineno)d:%(message)s')
    
    
    @persistent
    def scene_load(context):
    
        print('loading in background')
        print(bpy.context.window_manager)
    
    Vilém Duha's avatar
    Vilém Duha committed
        if not bpy.app.background:
    
    Vilém Duha's avatar
    Vilém Duha committed
            search.load_previews()
    
    Vilem Duha's avatar
    Vilem Duha committed
        ui_props = bpy.context.scene.blenderkitUI
        ui_props.assetbar_on = False
        ui_props.turn_off = False
    
    Vilem Duha's avatar
    Vilem Duha committed
        preferences = bpy.context.preferences.addons['blenderkit'].preferences
        preferences.login_attempt = False
    
    Vilém Duha's avatar
    Vilém Duha committed
    @bpy.app.handlers.persistent
    
    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
    
    Vilém Duha's avatar
    Vilém Duha committed
    
    
    Vilem Duha's avatar
    Vilem Duha committed
    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'),
    
    Vilem Duha's avatar
    Vilem Duha committed
        ('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'),
    
    Vilem Duha's avatar
    Vilem Duha committed
        ('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's avatar
    Vilem Duha committed
        ('OTHER', 'Other', 'any other engine'),
    
    Vilem Duha's avatar
    Vilem Duha committed
    )
    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
    
        wm = bpy.context.window_manager
    
        props = s.blenderkitUI
    
        if wm.get('search results') == None and props.down_up == 'SEARCH':
    
            search.search()
    
    Vilém Duha's avatar
    Vilém Duha committed
    
    
    Vilem Duha's avatar
    Vilem Duha committed
    def switch_search_results(self, context):
        s = bpy.context.scene
    
        wm = bpy.context.window_manager
    
    Vilem Duha's avatar
    Vilem Duha committed
        props = s.blenderkitUI
        if props.asset_type == 'MODEL':
    
            wm['search results'] = wm.get('bkit model search')
            wm['search results orig'] = wm.get('bkit model search orig')
    
    Vilem Duha's avatar
    Vilem Duha committed
        elif props.asset_type == 'SCENE':
    
            wm['search results'] = wm.get('bkit scene search')
            wm['search results orig'] = wm.get('bkit scene search orig')
    
        elif props.asset_type == 'HDR':
    
            wm['search results'] = wm.get('bkit hdr search')
            wm['search results orig'] = wm.get('bkit hdr search orig')
    
    Vilem Duha's avatar
    Vilem Duha committed
        elif props.asset_type == 'MATERIAL':
    
            wm['search results'] = wm.get('bkit material search')
            wm['search results orig'] = wm.get('bkit material search orig')
    
    Vilem Duha's avatar
    Vilem Duha committed
        elif props.asset_type == 'TEXTURE':
    
            wm['search results'] = wm.get('bkit texture search')
            wm['search results orig'] = wm.get('bkit texture search orig')
    
    Vilem Duha's avatar
    Vilem Duha committed
        elif props.asset_type == 'BRUSH':
    
            wm['search results'] = wm.get('bkit brush search')
            wm['search results orig'] = wm.get('bkit brush search orig')
    
            if not(context.sculpt_object or context.image_paint_object):
                ui.add_report(
                    'Switch to paint or sculpt mode to search in BlenderKit brushes.')
    
    
    Vilem Duha's avatar
    Vilem Duha committed
        search.load_previews()
    
        if wm['search results'] == None and props.down_up == 'SEARCH':
    
            search.search()
    
    def asset_type_callback(self, context):
    
        '''
        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 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)
            )
    
            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)
            )
    
        return items
    
    Vilém Duha's avatar
    Vilém Duha committed
    
    
    Vilem Duha's avatar
    Vilem Duha committed
    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)
    
    Vilem Duha's avatar
    Vilem Duha committed
            ),
            description="BLenderKit",
            default="SEARCH",
    
            update = udate_down_up
    
    Vilem Duha's avatar
    Vilem Duha committed
        )
        asset_type: EnumProperty(
    
            name="BlenderKit Active Asset Type",
    
            items=asset_type_callback,
    
    Vilem Duha's avatar
    Vilem Duha committed
            description="Activate asset in UI",
    
            default=None,
    
    Vilem Duha's avatar
    Vilem Duha committed
            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)
    
    Vilem Duha's avatar
    Vilem Duha committed
    
        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)
    
    Vilem Duha's avatar
    Vilem Duha committed
    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)
    
    Vilém Duha's avatar
    Vilém Duha committed
        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)
    
    
    Vilem Duha's avatar
    Vilem Duha committed
        search_error: BoolProperty(name="Search Error", description="last search had an error", default=False)
        report: StringProperty(
            name="Report",
            description="errors and messages",
            default="")
    
    
    Vilém Duha's avatar
    Vilém Duha committed
        # 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,
                                                   )
    
    
        # 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'),
            ),
    
            default='ALL',
    
            update=search.search_update,
    
    Vilém Duha's avatar
    Vilém Duha committed
    
    
        # resolution download/import settings
    
    Vilém Duha's avatar
    Vilém Duha committed
        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',
        )
    
        free_only: BoolProperty(name="Free first", description="Show free models first",
                                default=False, update=search.search_update)
    
    Vilém Duha's avatar
    Vilém Duha committed
    
        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)
    
    
    Vilem Duha's avatar
    Vilem Duha committed
    
    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(self)
    
    Vilém Duha's avatar
    Vilém Duha committed
    
    
    def update_free(self, context):
        if self.is_free == False:
            self.is_free = True
    
            ui_panels.ui_message(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.")
    
    Vilém Duha's avatar
    Vilém Duha committed
    
    
    Vilem Duha's avatar
    Vilem Duha committed
    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's avatar
    Vilem Duha committed
            default="")
        tags: StringProperty(
            name="Tags",
            description="List of tags, separated by commas (optional)",
            default="",
    
            update=utils.update_tags
    
    Vilem Duha's avatar
    Vilem Duha committed
        )
    
        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",
    
    Vilem Duha's avatar
    Vilem Duha committed
                          default=False)
    
        pbr_type: EnumProperty(
            name="PBR Type",
            items=pbr_types,
            description="PBR type",
            default="METALLIC",
        )
        license: EnumProperty(
    
            items=upload.licenses,
    
    Vilem Duha's avatar
    Vilem Duha committed
            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.",
    
        is_procedural: BoolProperty(name="Procedural",
    
    Vilém Duha's avatar
    Vilém Duha committed
                                    description="Asset is procedural - has no texture.",
                                    default=True
                                    )
    
        node_count: IntProperty(name="Node count", description="Total nodes in the asset", default=0)
    
    Vilém Duha's avatar
    Vilém Duha committed
        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)
    
    Vilem Duha's avatar
    Vilem Duha committed
    
        is_free: BoolProperty(name="Free for Everyone",
    
                              description="You consent you want to release this asset as free for everyone",
    
    Vilem Duha's avatar
    Vilem Duha committed
                              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,
            update=categories.update_category_enums
    
    Vilem Duha's avatar
    Vilem Duha committed
        )
        subcategory: EnumProperty(
            name="Subcategory",
    
            description="Subcategory to put into",
    
            items=categories.get_subcategory_enums,
            update=categories.update_subcategory_enums
    
        subcategory1: EnumProperty(
            name="Subcategory lvl2",
            description="Subcategory to put into",
            items=categories.get_subcategory1_enums
        )
    
    Vilem Duha's avatar
    Vilem Duha committed
    
    
    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=150, 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)
    
    Vilem Duha's avatar
    Vilem Duha committed
        rating_problems: StringProperty(
            name="Problems",
    
            description="Problems found/ why did you take points down - this will be available for the author"
    
    Vilem Duha's avatar
    Vilem Duha committed
                        " 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",
    
    Vilém Duha's avatar
    Vilém Duha committed
            update=search.search_update,
    
    Vilem Duha's avatar
    Vilem Duha committed
        )
        search_style_other: StringProperty(
            name="Style Other",
            description="Style not in the list",
            default="",
    
    Vilém Duha's avatar
    Vilém Duha committed
            update=search.search_update,
    
    Vilem Duha's avatar
    Vilem Duha committed
        )
        search_engine: EnumProperty(
            name='Engine',
            items=engines,
            default='NONE',
            description='Output engine',
    
    Vilém Duha's avatar
    Vilém Duha committed
            update=search.search_update,
    
    Vilem Duha's avatar
    Vilem Duha committed
        )
        search_engine_other: StringProperty(
            name="Engine",
            description="engine not specified by addon",
            default="",
    
    Vilém Duha's avatar
    Vilém Duha committed
            update=search.search_update,
    
    Vilém Duha's avatar
    Vilém Duha committed
        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"
        )
    
    Vilem Duha's avatar
    Vilem Duha committed
        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
                              )
    
    Vilem Duha's avatar
    Vilem Duha committed
    
        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)",
    
    Vilem Duha's avatar
    Vilem Duha committed
                                           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",
        )
    
    
    Vilem Duha's avatar
    Vilem Duha committed
        thumbnail_generator_type: EnumProperty(
            name="Thumbnail Style",
            items=(
                ('BALL', 'Ball', ""),
    
                ('BALL_COMPLEX', 'Ball complex', 'Complex ball to highlight edgewear or material thickness'),
    
    Vilem Duha's avatar
    Vilem Duha committed
                ('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):
    
        texture_resolution_max: IntProperty(name="Texture Resolution Max", description="texture resolution maximum",
                                            default=0)
    
    Vilem Duha's avatar
    Vilem Duha committed
    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',
    
    Vilem Duha's avatar
    Vilem Duha committed
        )
    
        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',