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:
2025-12-06 15:26:19 +08:00
commit 5d9e09e9c3
122 changed files with 22683 additions and 0 deletions

189
preferences.py Normal file
View 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'))