diff --git a/.gitattributes b/.gitattributes index 05eb1a1..efa6362 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4,3 +4,4 @@ *.vroid filter=lfs diff=lfs merge=lfs -text *.fbx filter=lfs diff=lfs merge=lfs -text *.wav filter=lfs diff=lfs merge=lfs -text +*.ttf filter=lfs diff=lfs merge=lfs -text diff --git a/CMakeLists.txt b/CMakeLists.txt index 4df4f7c..e46d288 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -275,7 +275,7 @@ file(GLOB VRM_FILES RELATIVE ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/assets/vroi file(GLOB MIXAMO_FILES RELATIVE ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/assets/blender/mixamo/**/*.fbx) file(GLOB EDITED_BLENDS RELATIVE ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/assets/blender/edited-*.blend) set(VRM_SOURCE) -foreach(VRM_FILE ${VRM_FILES} ${MIXAMO_FILES} ${EDITED_BLENDS}) +foreach(VRM_FILE ${VRM_FILES} ${MIXAMO_FILES}) set(OUTPUT_FILE "${CMAKE_BINARY_DIR}/${VRM_FILE}") set(INPUT_FILE "${CMAKE_SOURCE_DIR}/${VRM_FILE}") add_custom_command(OUTPUT "${OUTPUT_FILE}" @@ -298,6 +298,30 @@ add_custom_command(OUTPUT ${VRM_IMPORTED_BLENDS} ${VRM_SOURCE} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) +set(EDITED_BLENDS_LIST + male + female +) +set(EDITED_BLEND_TARGETS) +foreach(EDITED_BLEND ${EDITED_BLENDS_LIST}) +add_custom_command( + OUTPUT ${CMAKE_BINARY_DIR}/assets/blender/edited-normal-${EDITED_BLEND}.blend + DEPENDS ${CMAKE_SOURCE_DIR}/assets/blender/edited-normal-${EDITED_BLEND}.blend + ${CMAKE_BINARY_DIR}/assets/blender/vrm-vroid-normal-${EDITED_BLEND}.blend + COMMAND ${CMAKE_COMMAND} + -E copy ${CMAKE_SOURCE_DIR}/assets/blender/edited-normal-${EDITED_BLEND}.blend + ${CMAKE_BINARY_DIR}/assets/blender/edited-normal-${EDITED_BLEND}.blend + COMMAND ${BLENDER} -b -Y + ${CMAKE_BINARY_DIR}/assets/blender/edited-normal-${EDITED_BLEND}.blend + -P ${CMAKE_SOURCE_DIR}/assets/blender/scripts/copy_animations.py -- + ${CMAKE_BINARY_DIR}/assets/blender/vrm-vroid-normal-male.blend + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} +) +list(APPEND EDITED_BLEND_TARGETS ${CMAKE_BINARY_DIR}/assets/blender/edited-normal-${EDITED_BLEND}.blend) +endforeach() + +add_custom_target(edited-blends DEPENDS ${EDITED_BLEND_TARGETS}) + set(CHARACTER_GLBS ${CMAKE_BINARY_DIR}/characters/male/normal-male.glb ${CMAKE_BINARY_DIR}/characters/female/normal-female.glb @@ -307,7 +331,7 @@ add_custom_command( COMMAND ${CMAKE_COMMAND} -E make_directory ${CREATE_DIRECTORIES} COMMAND ${BLENDER} -b -Y -P ${CMAKE_SOURCE_DIR}/assets/blender/scripts/export_models.py COMMAND ${CMAKE_COMMAND} -E touch ${CHARACTER_GLBS} - DEPENDS ${CMAKE_SOURCE_DIR}/assets/blender/scripts/export_models.py ${VRM_IMPORTED_BLENDS} ${EDITED_BLENDS} + DEPENDS ${CMAKE_SOURCE_DIR}/assets/blender/scripts/export_models.py ${VRM_IMPORTED_BLENDS} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}) #add_custom_command( # OUTPUT ${CMAKE_SOURCE_DIR}/characters/female/vroid-normal-female.scene @@ -330,7 +354,8 @@ add_custom_command( add_custom_target(stage_files ALL DEPENDS ${CMAKE_BINARY_DIR}/resources.cfg ${MATERIALS_OUTPUT} ${CMAKE_BINARY_DIR}/resources/terrain/world_map.png - ${CMAKE_BINARY_DIR}/resources/terrain/brushes.png) + ${CMAKE_BINARY_DIR}/resources/terrain/brushes.png + edited-blends) add_custom_target(remove_scenes COMMAND rm -f ${VRM_SOURCE} ${VRM_IMPORTED_BLENDS} ${CHARACTER_GLBS}) diff --git a/assets/blender/edited-vroid-normal-female.blend b/assets/blender/edited-normal-female.blend similarity index 100% rename from assets/blender/edited-vroid-normal-female.blend rename to assets/blender/edited-normal-female.blend diff --git a/assets/blender/scripts/copy_animations.py b/assets/blender/scripts/copy_animations.py new file mode 100644 index 0000000..2e6716b --- /dev/null +++ b/assets/blender/scripts/copy_animations.py @@ -0,0 +1,64 @@ +import bpy +import sys +import os + +argv = sys.argv +argv = argv[argv.index("--") + 1:] + +sys.path.insert(0, os.getcwd() + "/assets/blender/scripts") + +source_filepath = argv[0] +armature_name = argv[1] + +print("starting...") + +def copy_actions_and_create_nla_tracks(source_filepath, target_object_name): + """ + Copies actions from a source Blender file that do not exist in the current + file, creates NLA tracks for them on a target object, and saves the file. + + Args: + source_filepath (str): The full path to the source Blender file. + target_object_name (str): The name of the object in the current file + to which the actions and NLA tracks will be applied. + """ + + # 1. Link or Append Actions from the Source File + with bpy.data.libraries.load(source_filepath, link=False) as (data_from, data_to): + source_action_names = data_from.actions + current_action_names = {action.name for action in bpy.data.actions} + actions_to_append = [name for name in source_action_names if name not in current_action_names] + data_to.actions = actions_to_append + print(actions_to_append) + + # Get the target object + target_object = bpy.data.objects.get(target_object_name) + if not target_object: + print(f"Error: Object '{target_object_name}' not found in the current file.") + return + + # Ensure the object has an NLA editor + if not target_object.animation_data: + target_object.animation_data_create() + + # 2. Iterate through newly imported actions and create NLA tracks + for action in data_to.actions: + # Check if an action with the same name already exists in the current file + # Add the action to the NLA editor as a strip + nla_track = target_object.animation_data.nla_tracks.new() + nla_track.name = f"NLA_Track_{action.name}" + nla_track.strips.new(name=action.name, start=1, action=action) + print(f"Created NLA track for action: {action.name}") + + # 3. Save the current Blender file + bpy.ops.wm.save_as_mainfile(filepath=bpy.context.blend_data.filepath) + print(f"File saved: {bpy.context.blend_data.filepath}") + +# --- Usage Example --- +if __name__ == "__main__": + # Replace with your actual source file path and target object name + source_file = source_filepath + target_obj = armature_name + + copy_actions_and_create_nla_tracks(source_file, target_obj) + diff --git a/assets/fonts/Jupiteroid-Bold.ttf b/assets/fonts/Jupiteroid-Bold.ttf new file mode 100644 index 0000000..f2cfeb7 --- /dev/null +++ b/assets/fonts/Jupiteroid-Bold.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e49b8d43e46d6141d1ec776e3d57814d72493e4205b2eff77a2078c1db6e8466 +size 135800 diff --git a/assets/fonts/Jupiteroid-BoldItalic.ttf b/assets/fonts/Jupiteroid-BoldItalic.ttf new file mode 100644 index 0000000..0223f27 --- /dev/null +++ b/assets/fonts/Jupiteroid-BoldItalic.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4aa5a1d631cd001d861321e3ff8f6c8e40147c39e74faa0d6e3fd3701bafe589 +size 151884 diff --git a/assets/fonts/Jupiteroid-Italic.ttf b/assets/fonts/Jupiteroid-Italic.ttf new file mode 100644 index 0000000..d31ef55 --- /dev/null +++ b/assets/fonts/Jupiteroid-Italic.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:00df1d8dc2ec6ffbf42cccc188194c5d5be3d2e8c4c9fea1309516b65be2d0a2 +size 153224 diff --git a/assets/fonts/Jupiteroid-Light.ttf b/assets/fonts/Jupiteroid-Light.ttf new file mode 100644 index 0000000..d8d4cf4 --- /dev/null +++ b/assets/fonts/Jupiteroid-Light.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33f347d99765ef352a28fc7e5b833e6b1cd0687253796bfa842baf770db1e6b1 +size 137872 diff --git a/assets/fonts/Jupiteroid-LightItalic.ttf b/assets/fonts/Jupiteroid-LightItalic.ttf new file mode 100644 index 0000000..3d4571e --- /dev/null +++ b/assets/fonts/Jupiteroid-LightItalic.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d00b67f7833063a2e462c5a9fbe4f1d8efd1c2dfec432b22011066b3b3a9d17 +size 153440 diff --git a/assets/fonts/Jupiteroid-Regular.ttf b/assets/fonts/Jupiteroid-Regular.ttf new file mode 100644 index 0000000..caa48d1 --- /dev/null +++ b/assets/fonts/Jupiteroid-Regular.ttf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:665724b63831600e1231b583feca8400e036259d17b194e37a5dae0cd3548ba4 +size 138516