From 60a0d37104e3bc9c09b0037ce92048b2f7aaab55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20K=C3=B6hler?= Date: Mon, 14 May 2018 18:10:19 +0200 Subject: [PATCH 1/6] Updated readme --- README.md | 143 +++++++++++++++++++++++------------------------------- 1 file changed, 60 insertions(+), 83 deletions(-) diff --git a/README.md b/README.md index 879a7582..33733777 100644 --- a/README.md +++ b/README.md @@ -73,17 +73,17 @@ This tries to completely fix your model with one click. ##### Fix Model - Fixes your model automatically by: - - Reparenting bones - - Removing unnecessary bones - - Renaming and translating objects and bones - - Mixing weight paints - - Rotating the hips - - Joining meshes - - Removing rigidbodies, joints and bone groups - - Removing bone constraints - - Deleting unused vertex groups - - Using the correct shading - - Making it compatible with Full Body Tracking + - Reparenting bones + - Removing unnecessary bones + - Renaming and translating objects and bones + - Mixing weight paints + - Rotating the hips + - Joining meshes + - Removing rigidbodies, joints and bone groups + - Removing bone constraints + - Deleting unused vertex groups + - Using the correct shading + - Making it compatible with Full Body Tracking **special thanks to @ProfessorSnep#0001, @Mimi#4114, @persia#0123 and @Gallium#7020 <3 <3** @@ -135,31 +135,31 @@ Works by sending a request to the Google Translate service. This feature can be ##### Merge Armatures - Merges the selected armature into the selected base armature. - **How to use:** - - Use "Fix Model" on both armatures - - Ignore the "Bones are missing" warning if one of the armatures is incomplete (e.g hair only) - - If you don't want to use "Fix Model" make sure that the armature follows the CATS bone structure (https://i.imgur.com/F5KEt0M.png) - - DO NOT delete any main bones by yourself! CATS will merge them and deletes all unused bones afterwards - - Move the mesh (and only the mesh!) of the merge armature to the desired position - - You can use Move, Scale and Rotate - - CATS will position the bones according to the mesh automatically - - If you want multiple objects from the same model it is often better to duplicate the armature for each of them and merge them individually - - Select the base armature and the armature you want to merge into the base armature - - If CATS can't detect the bone structure automatically: select a bone you want to attach the new armature to - - E.g.: For a hair armature select "Head" as the bone - - Press the "Merge Armatures" button -> Done! + - Use "Fix Model" on both armatures + - Ignore the "Bones are missing" warning if one of the armatures is incomplete (e.g hair only) + - If you don't want to use "Fix Model" make sure that the armature follows the CATS bone structure (https://i.imgur.com/F5KEt0M.png) + - DO NOT delete any main bones by yourself! CATS will merge them and deletes all unused bones afterwards + - Move the mesh (and only the mesh!) of the merge armature to the desired position + - You can use Move, Scale and Rotate + - CATS will position the bones according to the mesh automatically + - If you want multiple objects from the same model it is often better to duplicate the armature for each of them and merge them individually + - Select the base armature and the armature you want to merge into the base armature + - If CATS can't detect the bone structure automatically: select a bone you want to attach the new armature to + - E.g.: For a hair armature select "Head" as the bone + - Press the "Merge Armatures" button -> Done! ##### Attach Mesh to Armature - Attaches the selected mesh to the selected armature. - **How to use:** - - Move the mesh to the desired position - - You can use Move, Scale and Rotate - - INFO: The mesh will only be assigned to the selected bone - - E.g.: A jacket won't work, because it requires multiple bones. - - E.g.: A ring on a finger works perfectly, because the ring only needs one bone to move with (the finger bone) - - Select the base armature and the mesh you want to attach to the base armature - - Select the bone you want to attach the mesh to - - Press the "Attach Mesh" button -> Done! - + - Move the mesh to the desired position + - You can use Move, Scale and Rotate + - INFO: The mesh will only be assigned to the selected bone + - E.g.: A jacket won't work, because it requires multiple bones. + - E.g.: A ring on a finger works perfectly, because the ring only needs one bone to move with (the finger bone) + - Select the base armature and the mesh you want to attach to the base armature + - Select the bone you want to attach the mesh to + - Press the "Attach Mesh" button -> Done! + ##### Useful tip: - You can change the rest position of your model by using this method: https://nixart.wordpress.com/2013/03/28/modifying-the-rest-pose-in-blender/ @@ -327,62 +327,39 @@ It checks for a new version automatically once every day. #### 0.8.0 - Model: - - Added "Merge Armatures" button! - - This merges two selected armatures together. - - Added "Attach mesh" button! - - This attaches a mesh to a selected bone in an armature. - - Custom avatars are a breeze now! - - Added support for Source Engine Models! - - Added new "Custom Model Creation" panel - - Moved some model options into a new "Model Options" panel - - Moved Translations into the new "Model Options" panel - - Added a lot of new model options to the "Model Options" panel - - "Fix Model" now sets the roll of all bones to 0 - - This fixes a lot of finger issues in Unity! - - "Fix Model" now removes the standard lamp, camera and cube - - Full Body Tracking Fix is not longer enabled by default - - More models are now compatible (please report non working models to us) - - Fixed: Undoing the operation after a model import no longer undoes the import as well + - Added "Merge Armatures" button! + - This merges two selected armatures together. + - Added "Attach mesh" button! + - This attaches a mesh to a selected bone in an armature. + - Custom avatars are a breeze now! + - Added support for Source Engine Models! + - Added new "Custom Model Creation" panel + - Moved some model options into a new "Model Options" panel + - Added a lot of new model options to that panel + - "Fix Model" now sets the roll of all bones to 0 + - This fixes a lot of finger issues in Unity! + - "Fix Model" now removes the standard lamp, camera and cube + - Full Body Tracking Fix is not longer enabled by default + - More models are now compatible (please report non working models to us) + - Fixed: Undoing the operation after a model import no longer undoes the import as well - Eye Tracking: - - Now shows a warning when important objects aren't named correctly + - Now shows a warning when important objects aren't named correctly - Copy Protection: - - Added Export button into the panel after enabling the protection - - Now automatically triangulates the model - - Fixes holes appearing after export to Unity - - Updated documentation - - Step 6 now shows how to fix all remaining lighting issues + - Added Export button into the panel after enabling the protection + - Now automatically triangulates the model + - Fixes holes appearing after export to Unity + - Updated documentation + - Step 6 now shows how to fix all remaining lighting issues - Atlas: - - Changed: Meshes no longer need an armature to be selectable + - Changed: Meshes no longer need an armature to be selectable - Supporters: - - The supporter list is now synced with an online repository - - It can now be updated on the fly without having to update the whole plugin - - New supporter list features are available now, check them out! + - The supporter list is now synced with an online repository + - It can now be updated on the fly without having to update the whole plugin + - New supporter list features are available now, check them out! - General: - - Mesh selections are no longer shown if there is only one mesh - - Updated mmd_tools - - Fixed lots of bugs and typos - -#### 0.7.2 -- Changed: Copy Protection: Does now work on multiple meshes. -- Fixed: Copy Protection: The lighting bugs are now gone! Therefore we removed the randomization options. - - Either use the Export button within Cats or set the export option by yourself: - Geometries > Smoothing > Set to "Face" -- Added: Model: "Fix Model" now sets the bone layer to 0. - - This means that shadow bones are now editable -- Added: Model: More models are now compatible (please report non working models to us) -- Added: Model: Now shows a small info box about the bone length warning when full body fix is enabled -- Fixed: Model: Separating by Loose Parts should no longer crash Blender. - - Instead it might lag (but that's better than crashing) -- Fixed: Model: "Fix Model" now disables Backface Culling -- Fixed: Atlas: Now unhides everything in edit mode -- Fixed: "Remove Doubles" causing an error -- Fixed: More bugs - -#### 0.7.1 -- Added: Model: The Full Body Fix is now a toggleable option - - If you get the "spine length zero" warning in Unity you can ignore it as it shouldn't break anything. - But if it really does cause issues, uncheck this option -- Added: Copy protection: Added "Go to Documentation" button + - Mesh selections are no longer shown if there is only one mesh + - Updated mmd_tools + - Fixed lots of bugs and typos See the full changelog [here](https://github.com/michaeldegroot/cats-blender-plugin/releases). From 66a9e7474e213941fc40bcf0e2482329fe32bc05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20K=C3=B6hler?= Date: Mon, 14 May 2018 20:04:43 +0200 Subject: [PATCH 2/6] Updated readme --- README.md | 2 +- resources/icons/supporters/BemVR.png | Bin 0 -> 2718 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 resources/icons/supporters/BemVR.png diff --git a/README.md b/README.md index 33733777..7632be36 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Cats Blender Plugin (0.8.0) A tool designed to shorten steps needed to import and optimize models into VRChat. -Compatible models are: MMD, XNALara, Mixamo, Unreal Engine, DAZ/Poser, Blender Rigify, Sims 2, Motion Builder, 3DS Max and potentially more +Compatible models are: MMD, XNALara, Mixamo, Source Engine, Unreal Engine, DAZ/Poser, Blender Rigify, Sims 2, Motion Builder, 3DS Max and potentially more With Cats it takes only a few minutes to upload your model into VRChat. All the hours long processes of fixing your models are compressed into a few functions! diff --git a/resources/icons/supporters/BemVR.png b/resources/icons/supporters/BemVR.png new file mode 100644 index 0000000000000000000000000000000000000000..0eb87dae11481e4a9f99d4d54f4daf77e4672170 GIT binary patch literal 2718 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 Date: Sun, 20 May 2018 12:12:28 +0200 Subject: [PATCH 3/6] Fixed multiple armature modifiers, fixed bone morphs not converting, fixed some other bugs, made news disableable --- __init__.py | 4 +-- resources/icons/supporters/Hizling.png | Bin 0 -> 3316 bytes resources/icons/supporters/Naatiivee1337.png | Bin 0 -> 2548 bytes resources/icons/supporters/fire.png | Bin 0 -> 1627 bytes resources/supporters.json | 18 ++++++++++-- tools/armature.py | 16 +++++----- tools/common.py | 5 ++++ tools/supporter.py | 8 +++++ tools/translate.py | 29 +++++-------------- 9 files changed, 46 insertions(+), 34 deletions(-) create mode 100644 resources/icons/supporters/Hizling.png create mode 100644 resources/icons/supporters/Naatiivee1337.png create mode 100644 resources/icons/supporters/fire.png diff --git a/__init__.py b/__init__.py index 5a98cc3a..ef3e1d16 100644 --- a/__init__.py +++ b/__init__.py @@ -102,7 +102,7 @@ 'warning': '', } -dev_branch = False +dev_branch = True version = copy.deepcopy(bl_info.get('version')) # List all the supporters here @@ -708,7 +708,7 @@ def draw(self, context): info = news.get('info') icon = news.get('icon') custom_icon = news.get('custom_icon') - if info: + if info and not news.get('disabled'): showed_info = True row = col.row(align=True) diff --git a/resources/icons/supporters/Hizling.png b/resources/icons/supporters/Hizling.png new file mode 100644 index 0000000000000000000000000000000000000000..740dc1ee4488bc700099fcd399b7c67ccff56c05 GIT binary patch literal 3316 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 T+?fVVf2Zkc8ERIk+eQ8hDD@TC literal 0 HcmV?d00001 diff --git a/resources/icons/supporters/Naatiivee1337.png b/resources/icons/supporters/Naatiivee1337.png new file mode 100644 index 0000000000000000000000000000000000000000..78d8aaf4dc9837097161deed216422fc1b4c0426 GIT binary patch literal 2548 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 literal 0 HcmV?d00001 diff --git a/resources/supporters.json b/resources/supporters.json index e1a7eef5..52d6dd37 100644 --- a/resources/supporters.json +++ b/resources/supporters.json @@ -1,12 +1,17 @@ { "news": [ { - "info2": "Welcome to the cats dev build!", + "info": "Have a nice weekend!", + "custom_icon": "fire" + }, + { + "info2": "Happy", "icon": "INFO" }, { "info2": "Happy Halloween!", - "custom_icon": "halloween" + "custom_icon": "halloween", + "disabled": false } ], "supporters": [ @@ -127,7 +132,8 @@ "startdate": "2018-04-05" },{ "displayname": "NekoNatsuki", - "startdate": "2018-04-05" + "startdate": "2018-04-05", + "description": "I do what I do, and make what I make. For the people I love and care so much about" },{ "displayname": "AlphaSatanOmega", "startdate": "2018-04-05" @@ -164,6 +170,12 @@ },{ "displayname": "BemVR", "startdate": "2018-05-14" + },{ + "displayname": "Hizling", + "startdate": "2018-05-14" + },{ + "displayname": "Naatiivee1337", + "startdate": "2018-05-20" } ] } \ No newline at end of file diff --git a/tools/armature.py b/tools/armature.py index b6b090ec..1a9098bf 100644 --- a/tools/armature.py +++ b/tools/armature.py @@ -32,17 +32,13 @@ import tools.common import tools.translate import tools.armature_bones as Bones +import mmd_tools_local.operators.morph from mmd_tools_local.translations import DictionaryEnum import math from mathutils import Matrix -mmd_tools_installed = False -try: - import mmd_tools_local - mmd_tools_installed = True -except: - pass +mmd_tools_installed = True class FixArmature(bpy.types.Operator): @@ -190,11 +186,14 @@ def execute(self, context): current_step = 0 wm.progress_begin(current_step, len(mmd_root.bone_morphs)) + armature.data.pose_position = 'POSE' for index, morph in enumerate(mmd_root.bone_morphs): current_step += 1 wm.progress_update(current_step) + armature.parent.mmd_root.active_morph = index - bpy.ops.mmd_tools.view_bone_morph() + mmd_tools_local.operators.morph.ViewBoneMorph.execute(None, context) + mesh = tools.common.get_meshes_objects()[0] tools.common.select(mesh) @@ -211,6 +210,9 @@ def execute(self, context): except (AttributeError, RuntimeError): pass + # Reset to default + tools.common.set_default_stage() + # Set better bone view armature.data.draw_type = 'OCTAHEDRAL' armature.draw_type = 'WIRE' diff --git a/tools/common.py b/tools/common.py index dbf3ea0a..d0633e55 100644 --- a/tools/common.py +++ b/tools/common.py @@ -545,10 +545,15 @@ def join_meshes(armature_name=None): mesh.name = 'Body' mesh.parent_type = 'OBJECT' + mod_count = 0 for mod in mesh.modifiers: mod.show_expanded = False if mod.type == 'ARMATURE': + if mod_count > 0: + bpy.ops.object.modifier_remove(modifier=mod.name) + continue mod.object = get_armature(armature_name=armature_name) + mod_count += 1 ShapekeyOrder.repair(mesh.name) break diff --git a/tools/supporter.py b/tools/supporter.py index cc1f2536..663263ca 100644 --- a/tools/supporter.py +++ b/tools/supporter.py @@ -162,6 +162,7 @@ def download_file(): except urllib.error.URLError: print("FILE COULD NOT BE DOWNLOADED") shutil.rmtree(downloads_dir) + finish_reloading() return print('DOWNLOAD FINISHED') @@ -169,6 +170,7 @@ def download_file(): if not os.path.isfile(supporter_zip_file): print("ZIP NOT FOUND!") shutil.rmtree(downloads_dir) + finish_reloading() return # Extract the downloaded zip @@ -181,6 +183,7 @@ def download_file(): if not os.path.isdir(extracted_zip_dir): print("EXTRACTED ZIP FOLDER NOT FOUND!") shutil.rmtree(downloads_dir) + finish_reloading() return # delete existing supporter list and icon folder @@ -315,6 +318,11 @@ def reload_supporters(): unregister_dynamic_buttons() register_dynamic_buttons() + # Finish reloading + finish_reloading() + + +def finish_reloading(): # Set running false global reloading reloading = False diff --git a/tools/translate.py b/tools/translate.py index 76dccb52..82521d6d 100644 --- a/tools/translate.py +++ b/tools/translate.py @@ -27,6 +27,7 @@ import re import bpy import tools.common +import requests.exceptions from googletrans import Translator from mmd_tools_local import utils @@ -65,13 +66,8 @@ def execute(self, context): translator = Translator() try: translations = translator.translate(to_translate) - except Exception as ex: - if type(ex).__name__ == 'ConnectionError': - self.report({'ERROR'}, 'Could not connect to Google. Please check your internet connection.') - return {'FINISHED'} - template = "Exception {0} occurred. Arguments:\n{1!r}" - message = template.format(type(ex).__name__, ex.args) - self.report({'ERROR'}, message) + except requests.exceptions.ConnectionError: + self.report({'ERROR'}, 'Could not connect to Google. Please check your internet connection.') return {'FINISHED'} for translation in translations: @@ -155,13 +151,8 @@ def execute(self, context): try: translations = translator.translate(to_translate) - except Exception as ex: - if type(ex).__name__ == 'ConnectionError': - self.report({'ERROR'}, 'Could not connect to Google. Please check your internet connection.') - return {'FINISHED'} - template = "Exception {0} occurred. Arguments:\n{1!r}" - message = template.format(type(ex).__name__, ex.args) - self.report({'ERROR'}, message) + except requests.exceptions.ConnectionError: + self.report({'ERROR'}, 'Could not connect to Google. Please check your internet connection.') return {'FINISHED'} for translation in translations: @@ -208,14 +199,8 @@ def execute(self, context): translator = Translator() try: translations = translator.translate(to_translate) - except Exception as ex: - if type(ex).__name__ == 'ConnectionError': - self.report({'ERROR'}, 'Could not connect to Google. Please check your internet connection.') - return {'FINISHED'} - - template = "Exception {0} occurred. Arguments:\n{1!r}" - message = template.format(type(ex).__name__, ex.args) - self.report({'ERROR'}, message) + except requests.exceptions.ConnectionError: + self.report({'ERROR'}, 'Could not connect to Google. Please check your internet connection.') return {'FINISHED'} for translation in translations: From 4390ff4a9d2a1ba0c7a9e05289e4e56a60a3e7ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20K=C3=B6hler?= Date: Sun, 20 May 2018 12:27:12 +0200 Subject: [PATCH 4/6] Improved mmd model and shader handling --- tools/armature.py | 92 ++++++++++++++++++----------------------------- 1 file changed, 35 insertions(+), 57 deletions(-) diff --git a/tools/armature.py b/tools/armature.py index 1a9098bf..26633141 100644 --- a/tools/armature.py +++ b/tools/armature.py @@ -149,66 +149,41 @@ def execute(self, context): print(key + " | " + name) print('DOUBLES END') - # mmd_tools specific operations - if mmd_tools_installed: - # Set correct mmd shading - try: - bpy.ops.mmd_tools.set_shadeless_glsl_shading() - for obj in bpy.data.objects: - if obj.parent is None and obj.type == 'EMPTY': - obj.mmd_root.use_toon_texture = False - obj.mmd_root.use_sphere_texture = False - break - except (AttributeError, RuntimeError): - pass + # Check if model is mmd model + mmd_root = None + try: + mmd_root = armature.parent.mmd_root + except AttributeError: + pass - # mmd_tools specific operations - shading_is_set = False - if mmd_tools_installed: + # Perform mmd specific operations + if mmd_root: # Set correct mmd shading - try: - bpy.ops.mmd_tools.set_shadeless_glsl_shading() - for obj in bpy.data.objects: - if obj.parent is None and obj.type == 'EMPTY': - obj.mmd_root.use_toon_texture = False - obj.mmd_root.use_sphere_texture = False - break - shading_is_set = True - except (AttributeError, RuntimeError): - pass - - # Convert mmd bone morph into shape keys - try: - mmd_root = armature.parent.mmd_root - if len(mmd_root.bone_morphs) > 0: - - current_step = 0 - wm.progress_begin(current_step, len(mmd_root.bone_morphs)) - - armature.data.pose_position = 'POSE' - for index, morph in enumerate(mmd_root.bone_morphs): - current_step += 1 - wm.progress_update(current_step) - - armature.parent.mmd_root.active_morph = index - mmd_tools_local.operators.morph.ViewBoneMorph.execute(None, context) - - mesh = tools.common.get_meshes_objects()[0] - tools.common.select(mesh) - - mod = mesh.modifiers.new(morph.name, 'ARMATURE') - mod.object = armature - bpy.ops.object.modifier_apply(apply_as='SHAPE', modifier=mod.name) - wm.progress_end() - except AttributeError: - pass - - if not shading_is_set: - try: - bpy.ops.xps_tools.set_shadeless_glsl_shading() - except (AttributeError, RuntimeError): - pass + mmd_root.use_toon_texture = False + mmd_root.use_sphere_texture = False + + # Convert mmd bone morphs into shape keys + if len(mmd_root.bone_morphs) > 0: + + current_step = 0 + wm.progress_begin(current_step, len(mmd_root.bone_morphs)) + + armature.data.pose_position = 'POSE' + for index, morph in enumerate(mmd_root.bone_morphs): + current_step += 1 + wm.progress_update(current_step) + + armature.parent.mmd_root.active_morph = index + mmd_tools_local.operators.morph.ViewBoneMorph.execute(None, context) + + mesh = tools.common.get_meshes_objects()[0] + tools.common.select(mesh) + + mod = mesh.modifiers.new(morph.name, 'ARMATURE') + mod.object = armature + bpy.ops.object.modifier_apply(apply_as='SHAPE', modifier=mod.name) + wm.progress_end() # Reset to default tools.common.set_default_stage() @@ -876,6 +851,9 @@ def add_eye_children(eye_bone, parent_name): # Armature should be named correctly (has to be at the end because of multiple armatures) tools.common.fix_armature_names() + # Fix shading + bpy.ops.mmd_tools.set_shadeless_glsl_shading() + wm.progress_end() if hierarchy_check_hips['result'] is False: From a2df46952d2e4cbe1f82d1abf59e7e4264c01f7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20K=C3=B6hler?= Date: Mon, 21 May 2018 00:58:21 +0200 Subject: [PATCH 5/6] Now straightens up the head bone and fixed some bugs --- README.md | 9 ++++- __init__.py | 1 + resources/icons/supporters/Highom.png | Bin 0 -> 3433 bytes resources/supporters.json | 4 ++ tools/armature.py | 13 ++++++- tools/eyetracking.py | 2 + tools/supporter.py | 54 +++++++++++--------------- 7 files changed, 49 insertions(+), 34 deletions(-) create mode 100644 resources/icons/supporters/Highom.png diff --git a/README.md b/README.md index 7632be36..a0f04fc2 100644 --- a/README.md +++ b/README.md @@ -325,6 +325,13 @@ It checks for a new version automatically once every day. ## Changelog +#### 0.8.1 +- **Model:** + - Now straightens up the head bone + - Fixed bone morphs not converting correctly + - Fixed bones rotating the mesh twice as far + - Fixed eye rotation testing no longer working after changing the eye movement scale + #### 0.8.0 - Model: - Added "Merge Armatures" button! @@ -361,7 +368,7 @@ It checks for a new version automatically once every day. - Updated mmd_tools - Fixed lots of bugs and typos -See the full changelog [here](https://github.com/michaeldegroot/cats-blender-plugin/releases). +Read the full changelog [here](https://github.com/michaeldegroot/cats-blender-plugin/releases). ## Roadmap diff --git a/__init__.py b/__init__.py index ef3e1d16..f404c3a6 100644 --- a/__init__.py +++ b/__init__.py @@ -102,6 +102,7 @@ 'warning': '', } +# TODO Change Highoms name back to Highom<3! dev_branch = True version = copy.deepcopy(bl_info.get('version')) diff --git a/resources/icons/supporters/Highom.png b/resources/icons/supporters/Highom.png new file mode 100644 index 0000000000000000000000000000000000000000..4382a2e25e81dd8fd1a27636908dc8e24d405f8a GIT binary patch literal 3433 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 LNkvXXu0mjf>xiT- literal 0 HcmV?d00001 diff --git a/resources/supporters.json b/resources/supporters.json index 52d6dd37..b2cc47ec 100644 --- a/resources/supporters.json +++ b/resources/supporters.json @@ -176,6 +176,10 @@ },{ "displayname": "Naatiivee1337", "startdate": "2018-05-20" + },{ + "displayname": "Highom", + "iconname": "Highom3 (Highom<3)", + "startdate": "2018-05-20" } ] } \ No newline at end of file diff --git a/tools/armature.py b/tools/armature.py index 26633141..2ff04d79 100644 --- a/tools/armature.py +++ b/tools/armature.py @@ -552,6 +552,12 @@ def execute(self, context): if neck.head[z_cord] == neck.tail[z_cord]: neck.tail[z_cord] += 0.1 + # Straighten up the head bone + if 'Head' in armature.data.edit_bones: + head = armature.data.edit_bones.get('Head') + head.tail[x_cord] = head.head[x_cord] + head.tail[y_cord] = head.head[y_cord] + # Correct arm bone positions for better looks tools.common.correct_bone_positions() @@ -851,8 +857,11 @@ def add_eye_children(eye_bone, parent_name): # Armature should be named correctly (has to be at the end because of multiple armatures) tools.common.fix_armature_names() - # Fix shading - bpy.ops.mmd_tools.set_shadeless_glsl_shading() + # Fix shading (check for runtime error because of ci tests) + try: + bpy.ops.mmd_tools.set_shadeless_glsl_shading() + except RuntimeError: + pass wm.progress_end() diff --git a/tools/eyetracking.py b/tools/eyetracking.py index ddf123e0..949a4dd9 100644 --- a/tools/eyetracking.py +++ b/tools/eyetracking.py @@ -681,6 +681,8 @@ def execute(self, context): return {'FINISHED'} armature = tools.common.set_default_stage() + armature.data.pose_position = 'POSE' + tools.common.switch('EDIT') new_eye_left = armature.data.edit_bones.get('LeftEye') diff --git a/tools/supporter.py b/tools/supporter.py index 663263ca..a6d365f2 100644 --- a/tools/supporter.py +++ b/tools/supporter.py @@ -248,27 +248,8 @@ def load_supporters(): # are regular py objects - you can use them to store custom data. pcoll = bpy.utils.previews.new() - # path to the folder where the icon is - # the path is calculated relative to this py file inside the addon folder - icons_dir = os.path.join(resources_dir, "icons") - icons_supporter_dir = os.path.join(icons_dir, "supporters") - - # load the supporters icons - if supporter_data: - for supporter in supporter_data['supporters']: - name = supporter['displayname'] - try: - pcoll.load(name, os.path.join(icons_supporter_dir, name + '.png'), 'IMAGE') - except KeyError: - pass - for news in supporter_data['news']: - custom_icon = news.get('custom_icon') - if not custom_icon or custom_icon in pcoll: - continue - try: - pcoll.load(custom_icon, os.path.join(icons_supporter_dir, custom_icon + '.png'), 'IMAGE') - except KeyError: - pass + # load the supporters and news icons + load_icons(pcoll) if preview_collections.get('supporter_icons'): bpy.utils.previews.remove(preview_collections['supporter_icons']) @@ -285,25 +266,44 @@ def reload_supporters(): else: pcoll = bpy.utils.previews.new() + # load the supporters and news icons + load_icons(pcoll) + + if not preview_collections.get('supporter_icons'): + preview_collections['supporter_icons'] = pcoll + + unregister_dynamic_buttons() + register_dynamic_buttons() + + # Finish reloading + finish_reloading() + + +def load_icons(pcoll): # path to the folder where the icon is # the path is calculated relative to this py file inside the addon folder icons_dir = os.path.join(resources_dir, "icons") icons_supporter_dir = os.path.join(icons_dir, "supporters") - # load the supporters icons if supporter_data: for supporter in supporter_data['supporters']: name = supporter['displayname'] + iconname = supporter.get('iconname') + + if not iconname: + iconname = name if name in pcoll: continue try: - pcoll.load(name, os.path.join(icons_supporter_dir, name + '.png'), 'IMAGE') + pcoll.load(name, os.path.join(icons_supporter_dir, iconname + '.png'), 'IMAGE') except KeyError: pass + for news in supporter_data['news']: custom_icon = news.get('custom_icon') + if not custom_icon or custom_icon in pcoll: continue @@ -312,14 +312,6 @@ def reload_supporters(): except KeyError: pass - if not preview_collections.get('supporter_icons'): - preview_collections['supporter_icons'] = pcoll - - unregister_dynamic_buttons() - register_dynamic_buttons() - - # Finish reloading - finish_reloading() def finish_reloading(): From b04fcc16fef00dfdc4558097081a82cbd00d738e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20K=C3=B6hler?= Date: Thu, 31 May 2018 16:26:23 +0200 Subject: [PATCH 6/6] Fixed some shading issues, updated mmd_tools, ready for 0.8.1 --- README.md | 5 +- __init__.py | 5 +- mmd_tools_local/bpyutils.py | 6 +- mmd_tools_local/core/material.py | 3 +- mmd_tools_local/core/pmx/exporter.py | 2 + mmd_tools_local/core/vmd/__init__.py | 92 +++++++++++++++++++++++- mmd_tools_local/core/vmd/exporter.py | 34 ++++++++- mmd_tools_local/core/vmd/importer.py | 13 +++- mmd_tools_local/operators/misc.py | 22 +++--- mmd_tools_local/operators/model.py | 32 ++++++--- mmd_tools_local/properties/material.py | 4 +- mmd_tools_local/translations.py | 2 +- resources/icons/supporters/Skashe.png | Bin 0 -> 1918 bytes resources/icons/supporters/Steinshy.png | Bin 0 -> 2462 bytes resources/supporters.json | 11 ++- tools/armature_bones.py | 8 ++- tools/armature_custom.py | 1 + tools/copy_protection.py | 8 +++ 18 files changed, 209 insertions(+), 39 deletions(-) create mode 100644 resources/icons/supporters/Skashe.png create mode 100644 resources/icons/supporters/Steinshy.png diff --git a/README.md b/README.md index a0f04fc2..c94bc732 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cats Blender Plugin (0.8.0) +# Cats Blender Plugin (0.8.1) A tool designed to shorten steps needed to import and optimize models into VRChat. Compatible models are: MMD, XNALara, Mixamo, Source Engine, Unreal Engine, DAZ/Poser, Blender Rigify, Sims 2, Motion Builder, 3DS Max and potentially more @@ -331,6 +331,9 @@ It checks for a new version automatically once every day. - Fixed bone morphs not converting correctly - Fixed bones rotating the mesh twice as far - Fixed eye rotation testing no longer working after changing the eye movement scale + - Fixed some shading issues after fixing the model +- **General:** + - Updated mmd_tools #### 0.8.0 - Model: diff --git a/__init__.py b/__init__.py index f404c3a6..f9b37f2a 100644 --- a/__init__.py +++ b/__init__.py @@ -95,15 +95,14 @@ 'author': 'GiveMeAllYourCats', 'location': 'View 3D > Tool Shelf > CATS', 'description': 'A tool designed to shorten steps needed to import and optimize MMD models into VRChat', - 'version': [0, 8, 0], # Only change this version and the dev branch var right before publishing the new update! + 'version': [0, 8, 1], # Only change this version and the dev branch var right before publishing the new update! 'blender': (2, 79, 0), 'wiki_url': 'https://github.com/michaeldegroot/cats-blender-plugin', 'tracker_url': 'https://github.com/michaeldegroot/cats-blender-plugin/issues', 'warning': '', } -# TODO Change Highoms name back to Highom<3! -dev_branch = True +dev_branch = False version = copy.deepcopy(bl_info.get('version')) # List all the supporters here diff --git a/mmd_tools_local/bpyutils.py b/mmd_tools_local/bpyutils.py index 6d044c29..4c719740 100644 --- a/mmd_tools_local/bpyutils.py +++ b/mmd_tools_local/bpyutils.py @@ -293,9 +293,13 @@ def __init__(self, obj): if bpy.app.version < (2, 75, 0): def shape_key_remove(self, key): obj = self.__obj + key_blocks = obj.data.shape_keys.key_blocks # key.id_data.key_blocks + relative_key_map = {k.name:getattr(k.relative_key, 'name', '') for k in key_blocks} + obj.active_shape_key_index = key_blocks.find(key.name) bpy.context.scene.objects.active = obj - obj.active_shape_key_index = key.id_data.key_blocks.find(key.name) bpy.ops.object.shape_key_remove() + for k in key_blocks: + k.relative_key = key_blocks.get(relative_key_map[k.name], key_blocks[0]) else: def shape_key_remove(self, key): self.__obj.shape_key_remove(key) diff --git a/mmd_tools_local/core/material.py b/mmd_tools_local/core/material.py index 7f44f9a3..6ebb2b2b 100644 --- a/mmd_tools_local/core/material.py +++ b/mmd_tools_local/core/material.py @@ -89,7 +89,7 @@ def material(self): def __same_image_file(self, image, filepath): if image and image.source == 'FILE': - img_filepath = image.filepath_from_user() + img_filepath = bpy.path.abspath(image.filepath) # image.filepath_from_user() if img_filepath == filepath: return True try: @@ -268,6 +268,7 @@ def update_diffuse_color(self): mat = self.__material mmd_mat = mat.mmd_material mat.diffuse_color = self._mixDiffuseAndAmbient(mmd_mat) + mat.diffuse_intensity = 0.8 def update_alpha(self): mat = self.__material diff --git a/mmd_tools_local/core/pmx/exporter.py b/mmd_tools_local/core/pmx/exporter.py index 10d6b732..fb9c584f 100644 --- a/mmd_tools_local/core/pmx/exporter.py +++ b/mmd_tools_local/core/pmx/exporter.py @@ -1090,9 +1090,11 @@ def get_uv_offsets(v): for i, kb in shape_key_list: shape_key_name = kb.name logging.info(' - processing shape key: %s', shape_key_name) + kb_mute, kb.mute = kb.mute, False meshObj.active_shape_key_index = i mesh = meshObj.to_mesh(bpy.context.scene, True, 'PREVIEW', False) mesh.transform(pmx_matrix) + kb.mute = kb_mute if len(mesh.vertices) != len(base_mesh.vertices): logging.warning(' * Error! vertex count mismatch!') continue diff --git a/mmd_tools_local/core/vmd/__init__.py b/mmd_tools_local/core/vmd/__init__.py index f224ea1a..d1ab78b9 100644 --- a/mmd_tools_local/core/vmd/__init__.py +++ b/mmd_tools_local/core/vmd/__init__.py @@ -24,6 +24,7 @@ def load(self, fin): if self.signature[:len(self.VMD_SIGN)] != self.VMD_SIGN: raise InvalidFileError('File signature "%s" is invalid.'%self.signature) self.model_name = _toShiftJisString(struct.unpack('<20s', fin.read(20))[0]) + print(self) def save(self, fin): fin.write(struct.pack('<30s', self.VMD_SIGN)) @@ -144,6 +145,65 @@ def __repr__(self): ) +class SelfShadowFrameKey: + def __init__(self): + self.frame_number = 0 + self.mode = 0 # 0: none, 1: mode1, 2: mode2 + self.distance = 0.0 + + def load(self, fin): + self.frame_number, = struct.unpack(''%( + str(self.frame_number), + str(self.mode), + str(self.distance), + ) + + +class PropertyFrameKey: + def __init__(self): + self.frame_number = 0 + self.visible = True + self.ik_states = [] # list of (ik_name, enable/disable) + + def load(self, fin): + self.frame_number, = struct.unpack(''%( + str(self.frame_number), + str(self.visible), + str(self.ik_states), + ) + + class _AnimationBase(collections.defaultdict): def __init__(self): collections.defaultdict.__init__(self, list) @@ -154,6 +214,7 @@ def frameClass(): def load(self, fin): count, = struct.unpack(' 1 else 0 pose_bones = armObj.pose.bones @@ -207,6 +211,11 @@ def __assignToArmature(self, armObj, action_name=None): def __assignToMesh(self, meshObj, action_name=None): + shapeKeyAnim = self.__vmdFile.shapeKeyAnimation + logging.info('---- morph animations:%5d target: %s', len(shapeKeyAnim), meshObj.name) + if len(shapeKeyAnim) < 1: + return + if meshObj.data.shape_keys is None: logging.warning('WARNING: mesh object %s does not have any shape key', meshObj.name) return @@ -215,8 +224,6 @@ def __assignToMesh(self, meshObj, action_name=None): action = bpy.data.actions.new(name=action_name) meshObj.data.shape_keys.animation_data_create().action = action - shapeKeyAnim = self.__vmdFile.shapeKeyAnimation - shapeKeyDict = {} for i in meshObj.data.shape_keys.key_blocks: shapeKeyDict[i.name] = i diff --git a/mmd_tools_local/operators/misc.py b/mmd_tools_local/operators/misc.py index ab1317bc..6bf51459 100644 --- a/mmd_tools_local/operators/misc.py +++ b/mmd_tools_local/operators/misc.py @@ -117,7 +117,6 @@ class SeparateByMaterials(Operator): name='Clean Shape Keys', description='Remove unused shape keys of separated objects', default=True, - options={'SKIP_SAVE'}, ) @classmethod @@ -162,11 +161,17 @@ class JoinMeshes(Operator): bl_description = 'Join the Model meshes into a single one' bl_options = {'REGISTER', 'UNDO'} + sort_shape_keys = bpy.props.BoolProperty( + name='Sort Shape Keys', + description='Sort shape keys in the order of vertex morph', + default=True, + ) + def execute(self, context): obj = context.active_object root = mmd_model.Model.findRoot(obj) if root is None: - self.report({ 'ERROR' }, 'Select a MMD model') + self.report({ 'ERROR' }, 'Select a MMD model') return { 'CANCELLED' } if root: @@ -177,6 +182,7 @@ def execute(self, context): rig = mmd_model.Model(root) meshes_list = sorted(rig.meshes(), key=lambda x: x.name) if not meshes_list: + self.report({ 'ERROR' }, 'The model does not have any meshes') return { 'CANCELLED' } active_mesh = meshes_list[0] @@ -189,17 +195,13 @@ def execute(self, context): if getattr(mat, 'name', None) not in active_mesh.data.materials[:]: active_mesh.data.materials.append(mat) - # Store the current order of shape keys (vertex morphs) - from collections import OrderedDict - __get_key_blocks = lambda x: x.data.shape_keys.key_blocks if x.data.shape_keys else [] - shape_key_names = OrderedDict((kb.name, None) for m in meshes_list for kb in __get_key_blocks(m)) - shape_key_names = sorted(shape_key_names.keys(), key=lambda x: root.mmd_root.vertex_morphs.find(x)) - FnMorph.storeShapeKeyOrder(active_mesh, shape_key_names) - active_mesh.active_shape_key_index = 0 - # Join selected meshes bpy.ops.object.join() + if self.sort_shape_keys: + FnMorph.fixShapeKeyOrder(active_mesh, root.mmd_root.vertex_morphs.keys()) + active_mesh.active_shape_key_index = 0 + if len(root.mmd_root.material_morphs) > 0: for morph in root.mmd_root.material_morphs: mo = FnMorph(morph, rig) diff --git a/mmd_tools_local/operators/model.py b/mmd_tools_local/operators/model.py index 47bc398c..34a17fe8 100644 --- a/mmd_tools_local/operators/model.py +++ b/mmd_tools_local/operators/model.py @@ -169,16 +169,24 @@ class ConvertToMMDModel(Operator): ], default='DIFFUSE', ) - edge_threshold = bpy.props.FloatProperty( name='Edge Threshold', description='MMD toon edge will not be enabled if freestyle line color alpha less than this value', min=0, - max=1, + max=1.001, precision=3, step=0.1, default=0.1, ) + edge_alpha_min = bpy.props.FloatProperty( + name='Minimum Edge Alpha', + description='Minimum alpha of MMD toon edge color', + min=0, + max=1, + precision=3, + step=0.1, + default=0.5, + ) @classmethod def poll(cls, context): @@ -247,26 +255,28 @@ def __configure_rig(self, rig): for m in {x for mesh in meshes for x in mesh.data.materials if x}: mmd_material = m.mmd_material - diffuse = m.diffuse_color[:] + map_diffuse = next((s.blend_type for s in m.texture_slots if s and s.use_map_color_diffuse), None) + use_diffuse = map_diffuse in {None, 'MULTIPLY'} + diffuse = m.diffuse_color*min(1.0, m.diffuse_intensity/0.8) if use_diffuse else (1.0, 1.0, 1.0) mmd_material.diffuse_color = diffuse if self.ambient_color_source == 'MIRROR': mmd_material.ambient_color = m.mirror_color else: mmd_material.ambient_color = [0.5*c for c in diffuse] - mmd_material.alpha = m.alpha - mmd_material.specular_color = m.specular_color + + map_alpha = next((s.blend_type for s in m.texture_slots if s and s.use_map_alpha), None) + if m.use_transparency and map_alpha in {None, 'MULTIPLY'}: + mmd_material.alpha = m.alpha + + mmd_material.specular_color = m.specular_color*min(1.0, m.specular_intensity/0.8) mmd_material.shininess = m.specular_hardness mmd_material.is_double_sided = m.game_settings.use_backface_culling mmd_material.enabled_self_shadow_map = m.use_cast_buffer_shadows and m.alpha > 1e-3 mmd_material.enabled_self_shadow = m.use_shadows if hasattr(m, 'line_color'): # freestyle line color line_color = list(m.line_color) - if line_color[3] < self.edge_threshold: - mmd_material.enabled_toon_edge = False - mmd_material.edge_color[:3] = line_color[:3] # skip alpha - else: - mmd_material.enabled_toon_edge = True - mmd_material.edge_color = line_color + mmd_material.enabled_toon_edge = line_color[3] >= self.edge_threshold + mmd_material.edge_color = line_color[:3] + [max(line_color[3], self.edge_alpha_min)] from mmd_tools_local.operators.display_item import DisplayItemQuickSetup DisplayItemQuickSetup.load_bone_groups(root.mmd_root, armature) diff --git a/mmd_tools_local/properties/material.py b/mmd_tools_local/properties/material.py index 18bcf355..240a0f53 100644 --- a/mmd_tools_local/properties/material.py +++ b/mmd_tools_local/properties/material.py @@ -139,7 +139,7 @@ class MMDMaterial(PropertyGroup): max=1, precision=3, step=0.1, - default=[1.0, 1.0, 1.0], + default=[0.625, 0.625, 0.625], update=_updateSpecularColor, ) @@ -208,7 +208,7 @@ class MMDMaterial(PropertyGroup): max=100, soft_max=2, step=1.0, - default=0.5, + default=1.0, update=_updateEdgeWeight, ) diff --git a/mmd_tools_local/translations.py b/mmd_tools_local/translations.py index 582d477b..b6e8a7d6 100644 --- a/mmd_tools_local/translations.py +++ b/mmd_tools_local/translations.py @@ -217,7 +217,7 @@ def sort(self): def update(self): from collections import OrderedDict count_old = len(self.__csv_tuples) - tuples_dict = OrderedDict((row[0], row) for row in self.__csv_tuples if len(row) >= 2) + tuples_dict = OrderedDict((row[0], row) for row in self.__csv_tuples if len(row) >= 2 and row[0]) self.__csv_tuples.clear() self.__csv_tuples.extend(tuples_dict.values()) print(' - removed items:', count_old-len(self.__csv_tuples), '(of %d)'%count_old) diff --git a/resources/icons/supporters/Skashe.png b/resources/icons/supporters/Skashe.png new file mode 100644 index 0000000000000000000000000000000000000000..89a2bfec909d77d95af2d7858cce8389651c9bd7 GIT binary patch literal 1918 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 literal 0 HcmV?d00001 diff --git a/resources/supporters.json b/resources/supporters.json index b2cc47ec..457e757a 100644 --- a/resources/supporters.json +++ b/resources/supporters.json @@ -1,7 +1,7 @@ { "news": [ { - "info": "Have a nice weekend!", + "info2": "Have a nice weekend!", "custom_icon": "fire" }, { @@ -70,6 +70,9 @@ },{ "displayname": "m o t h", "startdate": "2018-04-05" + },{ + "displayname": "Yorx", + "startdate": "2018-05-21" },{ "displayname": "Tomnautical", "startdate": "2018-04-05" @@ -180,6 +183,12 @@ "displayname": "Highom", "iconname": "Highom3 (Highom<3)", "startdate": "2018-05-20" + },{ + "displayname": "Skashe", + "startdate": "2018-05-24" + },{ + "displayname": "Steinshy", + "startdate": "2018-05-31" } ] } \ No newline at end of file diff --git a/tools/armature_bones.py b/tools/armature_bones.py index 55fb6ed2..a74995c6 100644 --- a/tools/armature_bones.py +++ b/tools/armature_bones.py @@ -165,7 +165,7 @@ (['Shoulder+_\L'], 'Shoulder_\L', 'Shoulder2_\L'), - (['Tg_\L'], '\Leg_\L', 'Knee_\L'), + (['Tg_\L'], 'Leg_\L', 'Knee_\L'), (['ShoulderParent1_\L', 'ShoulderParent2_\L'], 'Shoulder2_\L', '\Left shoulder'), (['ArmParent1_\L', 'ArmParent2_\L'], 'Arm2_\L', '\Left arm'), @@ -190,6 +190,8 @@ (['Strengthen_The_Spine'], 'Spine5', 'Backbone5'), (['Strengthen_The_Spine'], 'Spine6', 'Backbone6'), (['Strengthen_The_Spine'], 'Spine7', 'Backbone7'), + + # (['Elbowb_\L', 'Elbowc_\L'], 'Elbowa_\L', 'Arm05_\L'), ] bone_finger_list = [ 'Thumb0_', @@ -715,6 +717,7 @@ ] bone_reweight['Head'] = [ 'Neckx2', + 'Head_001', ] bone_reweight['\Left shoulder'] = [ 'ShoulderP_\L', @@ -811,6 +814,9 @@ '\LeftArmBend', '\L_Uptwist_A', '\L_Uptwist_B', + # 'Elbowb_\L', + # 'Elbowc_\L', + # 'Elbowd_\L', ] bone_reweight['Left arm'] = [ # This has apparently no side in the name 'エプロンArm', diff --git a/tools/armature_custom.py b/tools/armature_custom.py index ccab032b..0cae49fd 100644 --- a/tools/armature_custom.py +++ b/tools/armature_custom.py @@ -62,6 +62,7 @@ def execute(self, context): if merge_armature.parent: self.report({'ERROR'}, 'Please use the "Fix Model" feature on the selected armatures first!' + '\nMake sure to select the armature you want to fix above the "Fix Model" button!' '\nAfter that please only move the mesh (not the armature!) to the desired position.') return {'FINISHED'} if base_armature.parent: diff --git a/tools/copy_protection.py b/tools/copy_protection.py index e07e6cfe..e6dc3ebf 100644 --- a/tools/copy_protection.py +++ b/tools/copy_protection.py @@ -159,5 +159,13 @@ class ProtectionTutorialButton(bpy.types.Operator): def execute(self, context): webbrowser.open('https://github.com/michaeldegroot/cats-blender-plugin#copy-protection') + # mesh = tools.common.get_meshes_objects()[0] + # tools.common.select(mesh) + # tools.common.switch('OBJECT') + # + # for i, shapekey in enumerate(mesh.data.shape_keys.key_blocks): + # if i == 1: + # shapekey.value = 1.5 + self.report({'INFO'}, 'Documentation') return {'FINISHED'}