diff --git a/.gitignore b/.gitignore
index 3304e52..2377db6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -126,3 +126,4 @@ history.json
src/example.py
test/resources/サンプルモデル.pmx
test/resources/サンプルモーション.vmd
+配布/
diff --git a/archive/Readme.txt b/archive/Readme.txt
index 9a1e323..fef9d3d 100644
--- a/archive/Readme.txt
+++ b/archive/Readme.txt
@@ -208,6 +208,16 @@ https://github.com/miu200521358/vroid2pmx
@
----------------------------------------------------------------
+ver2.01.06 (2023/10/22)
+Evrm1.0ŏo͂ꍇ̃G[nhOlj
+E}eA팸ŏo͂ꍇ̃nhOlj
+@E}eA2܂łɍ팸Ǝs܂
+@E{[KɊ蓖ĂĂȂꍇAPmxTailorpݒC|[gJSONȂꍇ܂
+EVRoid Studiox[^łŃGNX|[gvrmxŏo͂ł悤
+@Evrm̃[tłƈقȂ邽߁Alj[t̐X[܂
+@@iVRoid StudioŐݒ肵[t͂̂܂܂̖Oŏo͂܂j
+@E`ɂĂPmxTailorpݒt@C̏o͂Ɏs\܂
+
ver2.01.05 (2023/04/22)
EVRoid Studio 1.22.0 ȍ~ŁA
@PmxTailorݒpGNX|[gōގȂ̃nhOlj
diff --git "a/archive/\316\262\347\211\210Readme.txt" "b/archive/\316\262\347\211\210Readme.txt"
index 4c3d56b..b337343 100644
--- "a/archive/\316\262\347\211\210Readme.txt"
+++ "b/archive/\316\262\347\211\210Readme.txt"
@@ -54,6 +54,20 @@
@rivision
----------------------------------------------------------------
+Vroid2Pmx_2.01.06_03 (2023/09/30)
+EVRoid StudiołŃGNX|[gvrm̕ϊɎsꍇ̂C
+
+Vroid2Pmx_2.01.06_02 (2023/09/27)
+EVRoid Studiox[^łŃGNX|[gvrmxŏo͂ł悤
+@Evrm̃[tłƈقȂ邽߁Alj[t̐X[܂
+@@iVRoid StudioŐݒ肵[t͂̂܂܂̖Oŏo͂܂j
+@E`ɂĂPmxTailorpݒt@C̏o͂Ɏs\܂
+
+Vroid2Pmx_2.01.06_01 (2023/09/26)
+Evrm1.0ŏo͂ꍇ̃G[nhOlj
+E}eA팸ŏo͂ꍇ̃nhOlj
+@{[KɊ蓖ĂĂȂꍇAPmxTailorpݒC|[gJSONȂꍇ܂
+
Vroid2Pmx_2.01.05_01 (2023/04/15)
EPmxTailorݒpGNX|[gŁAގȂ̃nhOlj
diff --git a/rivision.txt b/rivision.txt
index a963be4..952269e 100644
--- a/rivision.txt
+++ b/rivision.txt
@@ -1,4 +1,65 @@
+Vroid2Pmx_2.01.06_03 (2023/09/30)
+
+EVRoid StudiołŃGNX|[gvrm̕ϊɎsꍇ̂C
+
+ m|Xg
+()
+
+ zzꏊ
+https://fire.st/jVPUABu
+
+
+VRoid Studio 1.x ō쐬vrmf[^pmxiMMDpfjf[^ɕϊł uVroid2Pmxvx[^łAbvf[g܂I
+
+v2.01.06_02
+EVRoid Studiox[^łŃGNX|[gvrmxŏo͂ł悤
+@[tljΉ
+
+R~jeBzz
+https://com.nicovideo.jp/community/co5387214
+
+
+ VRoid Studiox[^ňꕔΉ
+
+VRoid Studiox[^łŃGNX|[gvrmAxŏo͂܂ł͂ł悤ɂĂ݂܂B
+A[tłƈقȂ邽߁Alj[t̐̓X[܂
+iVRoid StudioŐݒ肵[t͂̂܂܂̖Oŏo͂܂j
+PmxTailorpݒt@Co͂܂A܂ɌʂςȂ̂łӂ
+
+
+
+vrm1.0̉͂͌ݑΉĂȂ̂ŁAKȃbZ[Wo͏o悤nhOlj܂
+
+ }eA팸̃nhOlj
+
+vrmGNX|[gɃ}eA팸ꍇAo͂ɎssɑΉ܂
+ߑȂǂ̗hꕨݒ肪ȂȂĂꍇAPmxTailorpݒt@CJSONɂݒ肪lj܂
+
+
+
+ gUnXLbvlj
+
+gU͍\IɕGł܂ƂւʂɓȂꍇ邽߁AUO悤ɂ܂
+萔łgUꂽꍇ̓vOCœ꒼Ă
+
+
+ t@CC
+
+t@CPMXf𗬗pĂ̂łAɃt@CƂďo͂łȂꍇɃt@CpXŃG[Ă̂ŁAPMXft@CƂďo͂łȂ폜悤ɂ܂
+
+
+ VroidΉ
+
+Vroid2PmxoRi㔼g3j̃fŃtBbeBOYɂȂȂp^[̂CĂ܂
+ȑOYɃtBbeBOł悤ɂȂĂc͂ł
+
+
+
+
+
+
+
https://fire.st/RIy5ZY4
Vroid2Pmx_1.00.00_01 (2021/11/21)
EVK쐬
diff --git a/src/executor.py b/src/executor.py
index 563086f..41d8d34 100644
--- a/src/executor.py
+++ b/src/executor.py
@@ -12,7 +12,7 @@
from utils.MLogger import MLogger
from utils import MFileUtils
-VERSION_NAME = "2.01.05"
+VERSION_NAME = "2.01.06"
# 指数表記なし、有効小数点桁数6、30を超えると省略あり、一行の文字数200
np.set_printoptions(suppress=True, precision=6, threshold=30, linewidth=200)
diff --git a/src/locale/en_US/messages.json b/src/locale/en_US/messages.json
index f8d4eda..5210e65 100644
--- a/src/locale/en_US/messages.json
+++ b/src/locale/en_US/messages.json
@@ -411,5 +411,6 @@
"-- 身体剛体準備終了": "--Completion of body rigid body preparation",
"-- -- 身体剛体[%s]": "---- Body Rigid Body [ %s]",
"舌関連頂点が見つからなかったため、舌分離処理をスキップします": "No tongue-related vertices found, skipping tongue separation processing",
- "-- Aスタンス・親指調整終了": "-- Finished A stance/thumb adjustment"
+ "-- Aスタンス・親指調整終了": "-- Finished A stance/thumb adjustment",
+ "出力ソフト情報がないため、処理を中断します。\nvrm1.0でエクスポートした場合、vrm0.0でエクスポートし直してください。": "The process is aborted because there is no output software information. \nIf you exported with vrm1.0, please re-export with vrm0.0."
}
\ No newline at end of file
diff --git a/src/locale/ja_JP/messages.json b/src/locale/ja_JP/messages.json
index f42df0e..c2fec41 100644
--- a/src/locale/ja_JP/messages.json
+++ b/src/locale/ja_JP/messages.json
@@ -411,5 +411,6 @@
"-- 身体剛体準備終了": "-- 身体剛体準備終了",
"-- -- 身体剛体[%s]": "-- -- 身体剛体[%s]",
"舌関連頂点が見つからなかったため、舌分離処理をスキップします": "舌関連頂点が見つからなかったため、舌分離処理をスキップします",
- "-- Aスタンス・親指調整終了": "-- Aスタンス・親指調整終了"
+ "-- Aスタンス・親指調整終了": "-- Aスタンス・親指調整終了",
+ "出力ソフト情報がないため、処理を中断します。\nvrm1.0でエクスポートした場合、vrm0.0でエクスポートし直してください。": "出力ソフト情報がないため、処理を中断します。\nvrm1.0でエクスポートした場合、vrm0.0でエクスポートし直してください。"
}
\ No newline at end of file
diff --git a/src/locale/zh_CN/messages.json b/src/locale/zh_CN/messages.json
index 8489ea5..3f9a006 100644
--- a/src/locale/zh_CN/messages.json
+++ b/src/locale/zh_CN/messages.json
@@ -414,5 +414,6 @@
"-- 身体剛体準備終了": "--完成刚体刚体准备",
"-- -- 身体剛体[%s]": "---- Body 刚体 [%s]",
"舌関連頂点が見つからなかったため、舌分離処理をスキップします": "未找到舌相关顶点,跳过舌分离处理",
- "-- Aスタンス・親指調整終了": "-- 完成了姿势/拇指调整"
+ "-- Aスタンス・親指調整終了": "-- 完成了姿势/拇指调整",
+ "出力ソフト情報がないため、処理を中断します。\nvrm1.0でエクスポートした場合、vrm0.0でエクスポートし直してください。": "由于没有输出软件信息,进程被中止。 \n如果您已使用vrm1.0 导出,请使用 vrm0.0 重新导出。"
}
\ No newline at end of file
diff --git a/src/service/VroidExportService.py b/src/service/VroidExportService.py
index a079494..42072be 100644
--- a/src/service/VroidExportService.py
+++ b/src/service/VroidExportService.py
@@ -106,17 +106,25 @@ def execute(self):
except MKilledException:
return False
except SizingException as se:
- logger.error("Vroid2Pmx処理が処理できないデータで終了しました。\n\n%s", se.message, decoration=MLogger.DECORATION_BOX)
+ logger.error(
+ "Vroid2Pmx処理が処理できないデータで終了しました。\n\n%s\n%s",
+ "2.01.06",
+ se.message,
+ decoration=MLogger.DECORATION_BOX,
+ )
except Exception:
logger.critical(
- "Vroid2Pmx処理が意図せぬエラーで終了しました。\n\n%s", traceback.format_exc(), decoration=MLogger.DECORATION_BOX
+ "Vroid2Pmx処理が意図せぬエラーで終了しました。\n\n%s\n%s",
+ "2.01.06",
+ traceback.format_exc(),
+ decoration=MLogger.DECORATION_BOX,
)
finally:
logging.shutdown()
def vroid2pmx(self):
try:
- model, tex_dir_path, setting_dir_path = self.create_model()
+ model, tex_dir_path, setting_dir_path, is_vroid1 = self.create_model()
if not model:
return False
@@ -132,7 +140,7 @@ def vroid2pmx(self):
if not model:
return False
- model = self.convert_morph(model)
+ model = self.convert_morph(model, is_vroid1)
if not model:
return False
@@ -1032,7 +1040,7 @@ def calc_normal(self, bone_mat: MMatrix4x4, normal: MVector3D):
return MVector3D(np.sum(normal.data() * bone_invert_mat, axis=1)).normalized()
- def convert_morph(self, model: PmxModel):
+ def convert_morph(self, model: PmxModel, is_vroid1: bool):
# グループモーフ定義
if (
"extensions" not in model.json_data
@@ -1050,8 +1058,9 @@ def convert_morph(self, model: PmxModel):
logger.info("-- -- モーフ調整準備")
face_close_dict = {}
- for base_offset in target_morphs["Fcl_EYE_Close"].offsets:
- face_close_dict[base_offset.vertex_index] = base_offset.position_offset.copy().data()
+ if is_vroid1:
+ for base_offset in target_morphs["Fcl_EYE_Close"].offsets:
+ face_close_dict[base_offset.vertex_index] = base_offset.position_offset.copy().data()
face_material_index_vertices = []
face_left_close_index_vertices = []
@@ -1949,6 +1958,7 @@ def convert_mesh(self, model: PmxModel, bone_name_dict: dict, tex_dir_path: str)
indices_by_materials = {}
materials_by_type = {}
registed_material_names = []
+ midx = 0
for vertex_key, vertex_dict in vertex_blocks.items():
start_vidx = vertex_dict["start"]
@@ -2154,7 +2164,7 @@ def convert_mesh(self, model: PmxModel, bone_name_dict: dict, tex_dir_path: str)
if "vectorProperties" in material_ext and "_ShadeColor" in material_ext["vectorProperties"]:
toon_sharing_flag = 0
if material_ext["textureProperties"]["_MainTex"] < len(model.json_data["images"]):
- toon_img_name = f'{model.json_data["images"][material_ext["textureProperties"]["_MainTex"]]["name"]}_Toon.bmp'
+ toon_img_name = f'{model.json_data["images"][material_ext["textureProperties"]["_MainTex"]].get("name", f"M{midx:03d}")}_Toon.bmp'
else:
toon_img_name = f"{material_name}_Toon.bmp"
@@ -2220,6 +2230,7 @@ def convert_mesh(self, model: PmxModel, bone_name_dict: dict, tex_dir_path: str)
material.vertex_count += len(indices)
logger.info("-- 面・材質データ解析[%s-%s]", index_accessor, material_accessor)
+ midx += 1
# 材質を透過順に並べ替て設定
index_idx = 0
@@ -3003,8 +3014,11 @@ def create_model(self):
or "VRM" not in model.json_data["extensions"]
or "exporterVersion" not in model.json_data["extensions"]["VRM"]
):
- logger.error("出力ソフト情報がないため、処理を中断します。", decoration=MLogger.DECORATION_BOX)
- return None, None, None
+ logger.error(
+ "出力ソフト情報がないため、処理を中断します。\nvrm1.0でエクスポートした場合、vrm0.0でエクスポートし直してください。",
+ decoration=MLogger.DECORATION_BOX,
+ )
+ return None, None, None, None
if (
"extensions" not in model.json_data
@@ -3012,16 +3026,18 @@ def create_model(self):
or "meta" not in model.json_data["extensions"]["VRM"]
):
logger.error("メタ情報がないため、処理を中断します。", decoration=MLogger.DECORATION_BOX)
- return None, None, None
+ return None, None, None, None
- if "VRoidStudio-0." in model.json_data["extensions"]["VRM"]["exporterVersion"]:
- # VRoid Studioベータ版はNG
- logger.error(
- "VRoid Studio ベータ版 で出力されたvrmデータではあるため、処理を中断します。\n正式版でコンバートしてから再度試してください。\n出力元: %s",
- model.json_data["extensions"]["VRM"]["exporterVersion"],
- decoration=MLogger.DECORATION_BOX,
- )
- return None, None, None
+ # if "VRoidStudio-0." in model.json_data["extensions"]["VRM"]["exporterVersion"]:
+ # # VRoid Studioベータ版はNG
+ # logger.error(
+ # "VRoid Studio ベータ版 で出力されたvrmデータではあるため、処理を中断します。\n正式版でコンバートしてから再度試してください。\n出力元: %s",
+ # model.json_data["extensions"]["VRM"]["exporterVersion"],
+ # decoration=MLogger.DECORATION_BOX,
+ # )
+ # return None, None, None
+
+ is_vroid1 = True
if "VRoid Studio-1." not in model.json_data["extensions"]["VRM"]["exporterVersion"]:
# VRoid Studio正式版じゃなくても警告だけに留める
@@ -3030,6 +3046,7 @@ def create_model(self):
model.json_data["extensions"]["VRM"]["exporterVersion"],
decoration=MLogger.DECORATION_BOX,
)
+ is_vroid1 = False
if "title" in model.json_data["extensions"]["VRM"]["meta"]:
model.name = model.json_data["extensions"]["VRM"]["meta"]["title"]
@@ -3091,11 +3108,11 @@ def create_model(self):
if "images" not in model.json_data:
logger.error("変換可能な画像情報がないため、処理を中断します。", decoration=MLogger.DECORATION_BOX)
- return None, None, None
+ return None, None, None, None
# jsonデータの中に画像データの指定がある場合
image_offset = 0
- for image in model.json_data["images"]:
+ for iidx, image in enumerate(model.json_data["images"]):
if int(image["bufferView"]) < len(model.json_data["bufferViews"]):
image_buffer = model.json_data["bufferViews"][int(image["bufferView"])]
# 画像の開始位置はオフセット分ずらす
@@ -3103,7 +3120,10 @@ def create_model(self):
# 拡張子
ext = MIME_TYPE[image["mimeType"]]
# 画像名
- image_name = f"{image['name']}.{ext}"
+ if "name" in image:
+ image_name = f"{image['name']}.{ext}"
+ else:
+ image_name = f"T{iidx:03d}.{ext}"
with open(os.path.join(glft_dir_path, image_name), "wb") as ibf:
ibf.write(self.buffer[image_start : (image_start + image_buffer["byteLength"])])
# オフセット加算
@@ -3115,7 +3135,7 @@ def create_model(self):
logger.info("-- テクスチャデータ解析終了")
- return model, tex_dir_path, setting_dir_path
+ return model, tex_dir_path, setting_dir_path, is_vroid1
# アクセサ経由で値を取得する
# https://github.com/ft-lab/Documents_glTF/blob/master/structure.md
diff --git a/vroid2pmx.spec b/vroid2pmx.spec
index 36b7e21..4f3a9d8 100644
--- a/vroid2pmx.spec
+++ b/vroid2pmx.spec
@@ -57,7 +57,7 @@ exe = EXE(pyz,
a.zipfiles,
a.datas,
[],
- name='Vroid2Pmx_2.01.05',
+ name='Vroid2Pmx_2.01.06',
debug=False,
bootloader_ignore_signals=False,
strip=False,