diff options
author | Peter Kim <pk15950@gmail.com> | 2021-07-24 12:10:55 +0300 |
---|---|---|
committer | Peter Kim <pk15950@gmail.com> | 2021-07-24 12:10:55 +0300 |
commit | fcf49e7cff1ab47cce9cbeeee1cf814e60fe62ad (patch) | |
tree | ce4cf53697e35c3eb0096b0427387012bd4ccae0 | |
parent | 64e3de5361a42b005dcc2238de17973437fb3409 (diff) | |
parent | 89ce3f1e1ca9f715b790cb3901001782d27bebea (diff) |
Merge branch 'master' into xr-controller-support
-rw-r--r-- | blenderkit/__init__.py | 8 | ||||
-rw-r--r-- | blenderkit/asset_bar_op.py | 2 | ||||
-rw-r--r-- | blenderkit/icons.py | 2 | ||||
-rw-r--r-- | blenderkit/paths.py | 2 | ||||
-rw-r--r-- | blenderkit/ratings_utils.py | 4 | ||||
-rw-r--r-- | blenderkit/search.py | 35 | ||||
-rw-r--r-- | blenderkit/thumbnails/filter.png | bin | 0 -> 525 bytes | |||
-rw-r--r-- | blenderkit/thumbnails/filter_active.png | bin | 0 -> 525 bytes | |||
-rw-r--r-- | blenderkit/ui.py | 2 | ||||
-rw-r--r-- | blenderkit/ui_panels.py | 35 | ||||
-rw-r--r-- | blenderkit/upload.py | 1 | ||||
-rw-r--r-- | blenderkit/utils.py | 38 | ||||
-rw-r--r-- | mesh_snap_utilities_line/__init__.py | 2 | ||||
-rw-r--r-- | mesh_snap_utilities_line/snap_context_l/mesh_drawing.py | 10 |
14 files changed, 112 insertions, 29 deletions
diff --git a/blenderkit/__init__.py b/blenderkit/__init__.py index 7b22279d..37e91a0a 100644 --- a/blenderkit/__init__.py +++ b/blenderkit/__init__.py @@ -459,8 +459,8 @@ class BlenderKitCommonSearchProps(object): default=False) own_only: BoolProperty(name="My Assets Only", 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) + use_filters: BoolProperty(name="Filters are on", description="some filters are used", + default=False) search_error: BoolProperty(name="Search Error", description="last search had an error", default=False) report: StringProperty( @@ -569,6 +569,10 @@ class BlenderKitCommonSearchProps(object): unrated_only: BoolProperty(name="Unrated only", description="Show only unrated models", default=False, update=search.search_update) + quality_limit: IntProperty(name="Quality limit", + description = 'Only show assets with a higher quality', + default=0, min=0, max=10, update=search.search_update) + def name_update(self, context): diff --git a/blenderkit/asset_bar_op.py b/blenderkit/asset_bar_op.py index 9c12b0f2..19f51682 100644 --- a/blenderkit/asset_bar_op.py +++ b/blenderkit/asset_bar_op.py @@ -605,7 +605,7 @@ class BlenderKitAssetBarOperator(BL_UI_OT_draw_operator): self.scroll_offset = min(self.scroll_offset, len(sr) - (self.wcount * self.hcount)) self.scroll_offset = max(self.scroll_offset, 0) self.update_images() - if len(sr) - self.scroll_offset < (self.wcount * self.hcount) + 10: + if len(sr) - self.scroll_offset < (self.wcount * self.hcount) + 15: self.search_more() def search_by_author(self, asset_index): diff --git a/blenderkit/icons.py b/blenderkit/icons.py index b8b86cba..09a1ba19 100644 --- a/blenderkit/icons.py +++ b/blenderkit/icons.py @@ -31,6 +31,8 @@ icons_read = { 'dumbbell.png': 'dumbbell', 'cc0.png': 'cc0', 'royalty_free.png': 'royalty_free', + 'filter.png': 'filter', + 'filter_active.png': 'filter_active', } verification_icons = { diff --git a/blenderkit/paths.py b/blenderkit/paths.py index b9847be2..e074d966 100644 --- a/blenderkit/paths.py +++ b/blenderkit/paths.py @@ -97,6 +97,8 @@ def get_categories_filepath(): return os.path.join(tempdir, 'categories.json') dirs_exist_dict = {}#cache these results since this is used very often +# this causes the function to fail if user deletes the directory while blender is running, +# but comes back when blender is restarted. def get_temp_dir(subdir=None): user_preferences = bpy.context.preferences.addons['blenderkit'].preferences diff --git a/blenderkit/ratings_utils.py b/blenderkit/ratings_utils.py index 37c1c971..67a79139 100644 --- a/blenderkit/ratings_utils.py +++ b/blenderkit/ratings_utils.py @@ -70,8 +70,8 @@ def send_rating_to_thread_work_hours(url, ratings, headers): def store_rating_local_empty(asset_id): context = bpy.context - context.window_manager['asset ratings'] = context.window_manager.get('asset ratings', {}) - context.window_manager['asset ratings'][asset_id] = context.window_manager['asset ratings'].get(asset_id, {}) + ar = context.window_manager['asset ratings'] + ar[asset_id] = ar.get(asset_id, {}) def store_rating_local(asset_id, type='quality', value=0): diff --git a/blenderkit/search.py b/blenderkit/search.py index d8344aca..940375fa 100644 --- a/blenderkit/search.py +++ b/blenderkit/search.py @@ -1081,6 +1081,9 @@ def build_query_common(query, props): query_common["files_size_gte"] = props.search_file_size_min * 1024 * 1024 query_common["files_size_lte"] = props.search_file_size_max * 1024 * 1024 + if props.quality_limit > 0: + query["quality_gte"] = props.quality_limit + query.update(query_common) @@ -1103,9 +1106,9 @@ def build_query_model(): # if props.free_only: # query["is_free"] = True - # if props.search_advanced: if props.search_condition != 'UNSPECIFIED': query["condition"] = props.search_condition + if props.search_design_year: query["designYear_gte"] = props.search_design_year_min query["designYear_lte"] = props.search_design_year_max @@ -1383,7 +1386,7 @@ def search(category='', get_next=False, author_id=''): # utils.p('searching') props.is_searching = True - page_size = min(40, ui_props.wcount * user_preferences.max_assetbar_rows) + page_size = min(30, ui_props.wcount * user_preferences.max_assetbar_rows) params = { 'scene_uuid': bpy.context.scene.get('uuid', None), @@ -1402,10 +1405,30 @@ def search(category='', get_next=False, author_id=''): props.report = 'BlenderKit searching....' +def update_filters(): + sprops = utils.get_search_props() + ui_props = bpy.context.scene.blenderkitUI + fcommon = sprops.own_only or \ + sprops.search_texture_resolution or\ + sprops.search_file_size or \ + sprops.search_procedural != 'BOTH' or \ + sprops.free_only or \ + sprops.quality_limit>0 + + if ui_props.asset_type =='MODEL': + sprops.use_filters = fcommon or \ + sprops.search_style != 'ANY' or \ + sprops.search_condition != 'UNSPECIFIED' or \ + sprops.search_design_year or \ + sprops.search_polycount + elif ui_props.asset_type == 'MATERIAL': + sprops.use_filters = fcommon + def search_update(self, context): utils.p('search updater') # if self.search_keywords != '': + update_filters() ui_props = bpy.context.scene.blenderkitUI if ui_props.down_up != 'SEARCH': ui_props.down_up = 'SEARCH' @@ -1458,6 +1481,12 @@ class SearchOperator(Operator): bl_description = "Search online for assets" bl_options = {'REGISTER', 'UNDO', 'INTERNAL'} + esc: BoolProperty(name="Escape window", + description="Escape window right after start", + default=False, + options={'SKIP_SAVE'} + ) + own: BoolProperty(name="own assets only", description="Find all own assets", default=False) @@ -1506,6 +1535,8 @@ class SearchOperator(Operator): def execute(self, context): # TODO ; this should all get transferred to properties of the search operator, so sprops don't have to be fetched here at all. + if self.esc: + bpy.ops.view3d.close_popup_button('INVOKE_DEFAULT') sprops = utils.get_search_props() if self.author_id != '': sprops.search_keywords = '' diff --git a/blenderkit/thumbnails/filter.png b/blenderkit/thumbnails/filter.png Binary files differnew file mode 100644 index 00000000..e128c35e --- /dev/null +++ b/blenderkit/thumbnails/filter.png diff --git a/blenderkit/thumbnails/filter_active.png b/blenderkit/thumbnails/filter_active.png Binary files differnew file mode 100644 index 00000000..de4fb3be --- /dev/null +++ b/blenderkit/thumbnails/filter_active.png diff --git a/blenderkit/ui.py b/blenderkit/ui.py index 5b4160c5..f402de51 100644 --- a/blenderkit/ui.py +++ b/blenderkit/ui.py @@ -1298,7 +1298,7 @@ class AssetBarOperator(bpy.types.Operator): # If there aren't any results, we need no interaction(yet) if sr is None: return {'PASS_THROUGH'} - if len(sr) - ui_props.scrolloffset < (ui_props.wcount * user_preferences.max_assetbar_rows) + 10: + if len(sr) - ui_props.scrolloffset < (ui_props.wcount * user_preferences.max_assetbar_rows) + 15: self.search_more() if event.type == 'WHEELUPMOUSE' or event.type == 'WHEELDOWNMOUSE' or event.type == 'TRACKPADPAN': diff --git a/blenderkit/ui_panels.py b/blenderkit/ui_panels.py index 292d8359..c763ba9e 100644 --- a/blenderkit/ui_panels.py +++ b/blenderkit/ui_panels.py @@ -819,6 +819,7 @@ class VIEW3D_PT_blenderkit_advanced_model_search(Panel): # AGE layout.prop(props, "search_condition", text='Condition') # , text ='condition of object new/old e.t.c.') + layout.prop(props, "quality_limit", slider=True) # , text ='condition of object new/old e.t.c.') # layout.prop(props, "search_procedural", expand=True) # ADULT @@ -867,7 +868,7 @@ class VIEW3D_PT_blenderkit_advanced_material_search(Panel): row = layout.row(align=True) row.prop(props, "search_file_size_min", text='Min') row.prop(props, "search_file_size_max", text='Max') - + layout.prop(props, "quality_limit", slider=True) class VIEW3D_PT_blenderkit_categories(Panel): bl_category = "BlenderKit" @@ -1206,6 +1207,7 @@ def draw_asset_context_menu(layout, context, asset_data, from_panel=False): op.author_id = author_id op = layout.operator('view3d.blenderkit_search', text='Search Similar') + op.esc = True op.tooltip = 'Search for similar assets in the library' # build search string from description and tags: op.keywords = asset_data['name'] @@ -1399,7 +1401,7 @@ def numeric_to_str(s): return s -def push_op_left(layout, strength =5): +def push_op_left(layout, strength =3): for a in range(0, strength): layout.label(text='') @@ -1416,7 +1418,7 @@ def label_or_url(layout, text='', tooltip='', url='', icon_value=None, icon=None op = layout.operator('wm.blenderkit_url', text=text) op.url = url op.tooltip = tooltip - push_op_left(layout) + push_op_left(layout, strength = 5) return if tooltip != '': @@ -1427,8 +1429,9 @@ def label_or_url(layout, text='', tooltip='', url='', icon_value=None, icon=None else: op = layout.operator('wm.blenderkit_tooltip', text=text) op.tooltip = tooltip + # these are here to move the text to left, since operators can only center text by default - push_op_left(layout) + push_op_left(layout, strength = 3) return if icon: layout.label(text=text, icon=icon) @@ -1664,6 +1667,16 @@ class AssetPopupCard(bpy.types.Operator, ratings_utils.RatingsProperties): date = self.asset_data['created'][:10] date = f"{date[8:10]}. {date[5:7]}. {date[:4]}" self.draw_property(box, 'Created', date) + if utils.asset_from_newer_blender_version(self.asset_data): + # row = box.row() + box.alert=True + self.draw_property(box, + 'Blender version', + self.asset_data['sourceAppVersion'], + # icon='ERROR', + tooltip='Asset is from a newer Blender version and might work incorrectly in your scene', + ) + box.alert = False box.separator() def draw_author_area(self, context, layout, width=330): @@ -1721,6 +1734,7 @@ class AssetPopupCard(bpy.types.Operator, ratings_utils.RatingsProperties): op.url = url op = button_row.operator('view3d.blenderkit_search', text="Find Assets By Author") + op.esc = True op.keywords = '' op.author_id = self.asset_data['author']['id'] @@ -2202,10 +2216,19 @@ def header_search_draw(self, context): layout.prop(props, "search_keywords", text="", icon='VIEWZOOM') draw_assetbar_show_hide(layout, props) layout.popover(panel="VIEW3D_PT_blenderkit_categories", text="", icon = 'OUTLINER') + + pcoll = icons.icon_collections["main"] + + if props.use_filters: + icon_id = pcoll['filter_active'].icon_id + else: + icon_id = pcoll['filter'].icon_id + if ui_props.asset_type=='MODEL': - layout.popover(panel="VIEW3D_PT_blenderkit_advanced_model_search", text="", icon = 'FILTER') + layout.popover(panel="VIEW3D_PT_blenderkit_advanced_model_search", text="", icon_value = icon_id) + elif ui_props.asset_type=='MATERIAL': - layout.popover(panel="VIEW3D_PT_blenderkit_advanced_material_search", text="", icon = 'FILTER') + layout.popover(panel="VIEW3D_PT_blenderkit_advanced_material_search", text="", icon_value = icon_id) def ui_message(title, message): diff --git a/blenderkit/upload.py b/blenderkit/upload.py index d4570bf3..887ffe57 100644 --- a/blenderkit/upload.py +++ b/blenderkit/upload.py @@ -63,6 +63,7 @@ def get_app_version(): return '%i.%i.%i' % (ver[0], ver[1], ver[2]) + def add_version(data): app_version = get_app_version() addon_version = version_checker.get_addon_version() diff --git a/blenderkit/utils.py b/blenderkit/utils.py index d5bdd84b..c16bc017 100644 --- a/blenderkit/utils.py +++ b/blenderkit/utils.py @@ -39,7 +39,9 @@ NORMAL_PRIORITY_CLASS = 0x00000020 REALTIME_PRIORITY_CLASS = 0x00000100 supported_material_click = ('MESH', 'CURVE', 'META', 'FONT', 'SURFACE', 'VOLUME', 'GPENCIL') -supported_material_drag = ('MESH', 'CURVE', 'META', 'FONT','SURFACE', 'VOLUME', 'GPENCIL') +supported_material_drag = ('MESH', 'CURVE', 'META', 'FONT', 'SURFACE', 'VOLUME', 'GPENCIL') + + # supported_material_drag = ('MESH') @@ -185,8 +187,8 @@ def get_search_props(): return props -def get_active_asset_by_type(asset_type = 'model'): - asset_type =asset_type.lower() +def get_active_asset_by_type(asset_type='model'): + asset_type = asset_type.lower() if asset_type == 'model': if bpy.context.view_layer.objects.active is not None: ob = get_active_model() @@ -206,6 +208,7 @@ def get_active_asset_by_type(asset_type = 'model'): return b return None + def get_active_asset(): scene = bpy.context.scene ui_props = scene.blenderkitUI @@ -341,8 +344,8 @@ def get_hidden_texture(name, force_reload=False): return t -def img_to_preview(img, copy_original = False): - if bpy.app.version[0]>=3: +def img_to_preview(img, copy_original=False): + if bpy.app.version[0] >= 3: img.preview_ensure() if not copy_original: return; @@ -352,6 +355,7 @@ def img_to_preview(img, copy_original = False): # img.preview.icon_size = (img.size[0], img.size[1]) # img.preview.icon_pixels_float = img.pixels[:] + def get_hidden_image(tpath, bdata_name, force_reload=False, colorspace='sRGB'): if bdata_name[0] == '.': hidden_name = bdata_name @@ -709,11 +713,13 @@ def name_update(props): # Here we actually rename assets datablocks, but don't do that with HDR's and possibly with others asset.name = fname + def fmt_length(prop): prop = str(round(prop, 2)) return prop -def get_param(asset_data, parameter_name, default = None): + +def get_param(asset_data, parameter_name, default=None): if not asset_data.get('parameters'): # this can appear in older version files. return default @@ -793,6 +799,7 @@ def profile_is_validator(): return True return False + def user_is_owner(asset_data=None): '''Checks if the current logged in user is owner of the asset''' profile = bpy.context.window_manager.get('bkit profile') @@ -802,6 +809,15 @@ def user_is_owner(asset_data=None): return True return False + +def asset_from_newer_blender_version(asset_data): + bver = bpy.app.version + aver = asset_data['sourceAppVersion'].split('.') + print(aver,bver) + bver_f = bver[0] + bver[1] * .01 + bver[2] * .0001 + aver_f = int(aver[0]) + int(aver[1]) * .01 + int(aver[2]) * .0001 + return aver_f>bver_f + def guard_from_crash(): ''' Blender tends to crash when trying to run some functions @@ -861,10 +877,11 @@ def get_fake_context(context, area_type='VIEW_3D'): # print(w,a,r) return C_dict + # def is_url(text): -def label_multiline(layout, text='', icon='NONE', width=-1, max_lines = 10): +def label_multiline(layout, text='', icon='NONE', width=-1, max_lines=10): ''' draw a ui label, but try to split it in multiple lines. @@ -882,7 +899,7 @@ def label_multiline(layout, text='', icon='NONE', width=-1, max_lines = 10): ''' if text.strip() == '': return - text = text.replace('\r\n','\n') + text = text.replace('\r\n', '\n') lines = text.split('\n') if width > 0: threshold = int(width / 5.5) @@ -891,7 +908,7 @@ def label_multiline(layout, text='', icon='NONE', width=-1, max_lines = 10): li = 0 for l in lines: # if is_url(l): - li+=1 + li += 1 while len(l) > threshold: i = l.rfind(' ', 0, threshold) if i < 1: @@ -907,10 +924,9 @@ def label_multiline(layout, text='', icon='NONE', width=-1, max_lines = 10): break; layout.label(text=l, icon=icon) icon = 'NONE' - if li>max_lines: + if li > max_lines: return True - def trace(): traceback.print_stack() diff --git a/mesh_snap_utilities_line/__init__.py b/mesh_snap_utilities_line/__init__.py index c22c5b02..98f88e76 100644 --- a/mesh_snap_utilities_line/__init__.py +++ b/mesh_snap_utilities_line/__init__.py @@ -21,7 +21,7 @@ bl_info = { "name": "Snap_Utilities_Line", "author": "Germano Cavalcante", - "version": (6, 9, 22), + "version": (6, 9, 23), "blender": (2, 93, 0), "location": "View3D > TOOLS > Line Tool", "description": "Extends Blender Snap controls", diff --git a/mesh_snap_utilities_line/snap_context_l/mesh_drawing.py b/mesh_snap_utilities_line/snap_context_l/mesh_drawing.py index 219d7311..d05becec 100644 --- a/mesh_snap_utilities_line/snap_context_l/mesh_drawing.py +++ b/mesh_snap_utilities_line/snap_context_l/mesh_drawing.py @@ -349,9 +349,13 @@ class GPU_Indices_Mesh(): far_ += depth_offset near += depth_offset - fn = (far_ - near) - winmat[2][2] = -(far_ + near) / fn - winmat[2][3] = (-2 * far_ * near) / fn + range = (far_ - near) + if is_persp: + winmat[2][2] = -(far_ + near) / range + winmat[2][3] = (-2 * far_ * near) / range + else: + winmat[2][3] = -(far_ + near) / range + gpu.matrix.load_projection_matrix(winmat) if self.draw_edges: |