feat: Add KoikatsuBlenderPipeline addon with import/export functionality
- Add core addon files (__init__.py, KKPanel.py, preferences.py, common.py) - Add import pipeline with armature, mesh, and material modification modules - Add export pipeline with material baking and FBX preparation utilities - Add material combiner tool for texture atlas generation and optimization - Add extras utilities for animation, rigging, and asset management - Add bone orientation data from better_fbx for accurate skeletal structure - Add comprehensive documentation and wiki with multi-language support (EN, JP, ZH) - Add animation library retargeting lists for ARP and Rokoko motion capture - Add Rigify integration scripts for advanced rigging workflows - Add shader file (KK Shader V8.0.blend) for material rendering - Add manifest and license files for addon distribution - Add changelog documenting version history and improvements - Initialize complete Blender addon project for Koikatsu character import/export
This commit is contained in:
189
preferences.py
Normal file
189
preferences.py
Normal file
@@ -0,0 +1,189 @@
|
||||
#The preferences for the plugin
|
||||
|
||||
import bpy
|
||||
from bpy.props import BoolProperty, EnumProperty, StringProperty, IntProperty
|
||||
|
||||
from .interface.dictionary_en import t
|
||||
|
||||
from .interface.dictionary_en import t
|
||||
|
||||
class KKBPPreferences(bpy.types.AddonPreferences):
|
||||
# this must match the add-on name, use '__package__'
|
||||
# when defining this in a submodule of a python package.
|
||||
bl_idname = __package__
|
||||
|
||||
sfw_mode : BoolProperty(
|
||||
description=t('sfw_mode_tt'),
|
||||
default = False)
|
||||
|
||||
fix_seams : BoolProperty(
|
||||
description=t('seams_tt'),
|
||||
default = True)
|
||||
|
||||
use_single_outline : BoolProperty(
|
||||
description= t('outline_tt'),
|
||||
default = False)
|
||||
|
||||
use_material_fake_user : BoolProperty(
|
||||
description=t('keep_templates_tt'),
|
||||
default = True)
|
||||
|
||||
old_bake_bool : BoolProperty(
|
||||
description=t('old_bake_tt'),
|
||||
default = False)
|
||||
|
||||
armature_dropdown : EnumProperty(
|
||||
items=(
|
||||
("A", t('arm_drop_A'), t('arm_drop_A_tt')),
|
||||
("B", t('arm_drop_B'), t('arm_drop_B_tt')),
|
||||
("C", t('arm_drop_C'), t('arm_drop_C_tt')),
|
||||
("D", t('arm_drop_D'), t('arm_drop_D_tt')),
|
||||
), name="", default="A", description=t('arm_drop'))
|
||||
|
||||
categorize_dropdown : EnumProperty(
|
||||
items=(
|
||||
("A", t('cat_drop_A'), t('cat_drop_A_tt')),
|
||||
("B", t('cat_drop_B'), t('cat_drop_B_tt')),
|
||||
), name="", default="A", description=t('cat_drop'))
|
||||
|
||||
colors_dropdown : BoolProperty(
|
||||
description=t('dark_F_tt'),
|
||||
default = True)
|
||||
|
||||
bake_light_bool : BoolProperty(
|
||||
description=t('bake_light_tt'),
|
||||
default = True)
|
||||
|
||||
bake_dark_bool : BoolProperty(
|
||||
description=t('bake_dark_tt'),
|
||||
default = True)
|
||||
|
||||
bake_norm_bool : BoolProperty(
|
||||
description=t('bake_norm_tt'),
|
||||
default = False)
|
||||
|
||||
use_atlas : BoolProperty(
|
||||
description=t('use_atlas'),
|
||||
default = False)
|
||||
|
||||
delete_cache : BoolProperty(
|
||||
description=t('delete_cache'),
|
||||
default = False)
|
||||
|
||||
prep_dropdown : EnumProperty(
|
||||
items=(
|
||||
("A", t('prep_drop_A'), t('prep_drop_A_tt')),
|
||||
#("C", "MikuMikuDance - PMX compatible", " "),
|
||||
("D", t('prep_drop_D'), t('prep_drop_D_tt')),
|
||||
("B", t('prep_drop_B'), t('prep_drop_B_tt')),
|
||||
), name="", default="A", description=t('prep_drop'))
|
||||
|
||||
simp_dropdown : EnumProperty(
|
||||
items=(
|
||||
("A", t('simp_drop_A'), t('simp_drop_A_tt')),
|
||||
("B", t('simp_drop_B'), t('simp_drop_B_tt')),
|
||||
("C", t('simp_drop_C'), t('simp_drop_C_tt')),
|
||||
), name="", default="A", description=t('simp_drop'))
|
||||
|
||||
bake_light_bool : BoolProperty(
|
||||
description=t('bake_light_tt'),
|
||||
default = True)
|
||||
|
||||
bake_dark_bool : BoolProperty(
|
||||
description=t('bake_dark_tt'),
|
||||
default = True)
|
||||
|
||||
bake_norm_bool : BoolProperty(
|
||||
description=t('bake_norm_tt'),
|
||||
default = False)
|
||||
|
||||
shapekeys_dropdown : EnumProperty(
|
||||
items=(
|
||||
("A", t('shape_A'), t('shape_A_tt')),
|
||||
("B", t('shape_B'), t('shape_B_tt')),
|
||||
("C", t('shape_C'), t('shape_C_tt')),
|
||||
), name="", default="A", description="")
|
||||
|
||||
shader_dropdown : EnumProperty(
|
||||
items=(
|
||||
("A", t('shader_A'), ''),
|
||||
("B", t('shader_B'), ''),
|
||||
("D", t('shader_D'), ''),
|
||||
("C", t('shader_C'), t('shader_C_tt')),
|
||||
), name="", default="A", description="Shader")
|
||||
|
||||
max_thread_num: IntProperty(
|
||||
min=1, max = 64,
|
||||
default=8,
|
||||
description=t('max_thread_num_tt'))
|
||||
|
||||
max_image_num: IntProperty(
|
||||
min=1, max = 10,
|
||||
default=2,
|
||||
description=t('max_image_num_tt'))
|
||||
|
||||
batch_rows: IntProperty(
|
||||
min=256, max = 4096,
|
||||
default=512,
|
||||
description=t('batch_rows_tt'))
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
splitfac = 0.5
|
||||
|
||||
col = layout.column(align=True)
|
||||
row = col.row(align=True)
|
||||
row.label(text='Change the default options for the KKBP Importer below:')
|
||||
row = col.row(align=True)
|
||||
split = row.split(align = True, factor=splitfac)
|
||||
split.prop(self, "categorize_dropdown")
|
||||
split.prop(self, "armature_dropdown")
|
||||
|
||||
row = col.row(align=True)
|
||||
split = row.split(align = True, factor=splitfac)
|
||||
split.prop(self, "shapekeys_dropdown")
|
||||
split.prop(self, "shader_dropdown")
|
||||
|
||||
row = col.row(align=True)
|
||||
split = row.split(align = True, factor=splitfac)
|
||||
split.prop(self, "colors_dropdown", toggle=True, text = t('dark_F'))
|
||||
split.prop(self, "delete_cache", toggle=True, text = t('delete_cache'))
|
||||
|
||||
row = col.row(align=True)
|
||||
split = row.split(align = True, factor=splitfac)
|
||||
split.prop(self, "fix_seams", toggle=True, text = t('seams'))
|
||||
split.prop(self, "use_material_fake_user", toggle=True, text = t('keep_templates'))
|
||||
|
||||
row = col.row(align=True)
|
||||
split = row.split(align = True, factor=splitfac)
|
||||
split.prop(self, "use_single_outline", toggle=True, text = t('outline'))
|
||||
split.prop(self, "sfw_mode", toggle=True, text = t('sfw_mode'))
|
||||
|
||||
col = layout.column(align=True)
|
||||
row = col.row(align=True)
|
||||
split = row.split(align=True, factor=0.33)
|
||||
split.prop(self, "bake_light_bool", toggle=True, text = t('bake_light'))
|
||||
split.prop(self, "bake_dark_bool", toggle=True, text = t('bake_dark'))
|
||||
split.prop(self, "bake_norm_bool", toggle=True, text = t('bake_norm'))
|
||||
row = col.row(align=True)
|
||||
split = row.split(align=True, factor=splitfac)
|
||||
split.prop(self, 'old_bake_bool', toggle=True, text = t('old_bake'))
|
||||
row = col.row(align = True)
|
||||
split = row.split(align=True, factor=splitfac)
|
||||
split.prop(self, "use_atlas", toggle=True, text = t('use_atlas'))
|
||||
|
||||
col = layout.column(align=True)
|
||||
row = col.row(align=True)
|
||||
split = row.split(align=True, factor=splitfac)
|
||||
split.prop(self, "simp_dropdown")
|
||||
split.prop(self, "prep_dropdown")
|
||||
|
||||
col = layout.column(align=True)
|
||||
row = col.row(align=True)
|
||||
row.label(text='Change these options based on your computer specs to speed up the import process:')
|
||||
row = col.row(align=True)
|
||||
split = row.split(align=True, factor=0.33)
|
||||
split.prop(self, "max_thread_num", text = t('max_thread_num'))
|
||||
split.prop(self, "max_image_num", text = t('max_image_num'))
|
||||
split.prop(self, "batch_rows", text = t('batch_rows'))
|
||||
|
||||
Reference in New Issue
Block a user