From: Adrian Iain Lam Date: Sun, 2 Jan 2022 01:56:39 +0000 (+0000) Subject: Upgrade to Cubism 4 Release R4. No incompatible API changes. X-Git-Url: https://adrianiainlam.tk/git/?a=commitdiff_plain;h=cd5de0f5ae28f287a9d0f4e9e2ffc9a2340846f3;p=mouse-tracker-for-cubism.git Upgrade to Cubism 4 Release R4. No incompatible API changes. --- diff --git a/README.md b/README.md index a12d9c2..0a1a8d6 100644 --- a/README.md +++ b/README.md @@ -50,17 +50,17 @@ if you don't have C++17 support. To build the example program: -4. Download "Cubism 4 SDK for Native R3" from the Live2D website: +4. Download "Cubism 4 SDK for Native R4" from the Live2D website: . - Extract the archive -- put the "CubismSdkForNative-4-r.3" folder under + Extract the archive -- put the "CubismSdkForNative-4-r.4" folder under the "example" folder of this repo. Note: The Cubism SDK is the property of Live2D and is not part of this project. You must agree to Live2D's license agreements to use it. 5. Go into the - "example/CubismSdkForNative-4-r.3/Samples/OpenGL/thirdParty/scripts" + "example/CubismSdkForNative-4-r.4/Samples/OpenGL/thirdParty/scripts" directory and run ./setup_glew_glfw diff --git a/example/build.sh b/example/build.sh index b492043..25dcfb2 100755 --- a/example/build.sh +++ b/example/build.sh @@ -1,6 +1,6 @@ #!/bin/sh -e mkdir -p demo_build -cp -r CubismSdkForNative-4-r.3/Samples/OpenGL/Demo/proj.linux.cmake/* ./demo_build/ +cp -r CubismSdkForNative-4-r.4/Samples/OpenGL/Demo/proj.linux.cmake/* ./demo_build/ patch -d demo_build -p2 < demo.patch ./demo_build/scripts/make_gcc diff --git a/example/demo.patch b/example/demo.patch index 9c5f42c..cb40cc9 100644 --- a/example/demo.patch +++ b/example/demo.patch @@ -1,12 +1,12 @@ diff -pruN --exclude build ./demo_clean/CMakeLists.txt ./demo_dev/CMakeLists.txt ---- ./demo_clean/CMakeLists.txt 2021-02-17 01:23:17.000000000 +0000 -+++ ./demo_dev/CMakeLists.txt 2021-06-12 17:14:36.877121318 +0100 +--- ./demo_clean/CMakeLists.txt 2022-01-02 01:49:06.929909588 +0000 ++++ ./demo_dev/CMakeLists.txt 2022-01-02 01:49:31.334289944 +0000 @@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.16) # Set app name. set(APP_NAME Demo) # Set directory paths. -set(SDK_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../..) -+set(SDK_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../CubismSdkForNative-4-r.3) ++set(SDK_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../CubismSdkForNative-4-r.4) set(CORE_PATH ${SDK_ROOT_PATH}/Core) set(FRAMEWORK_PATH ${SDK_ROOT_PATH}/Framework) set(THIRD_PARTY_PATH ${SDK_ROOT_PATH}/Samples/OpenGL/thirdParty) @@ -54,35 +54,120 @@ diff -pruN --exclude build ./demo_clean/CMakeLists.txt ./demo_dev/CMakeLists.txt # Copy resource directory to build directory. add_custom_command( diff -pruN --exclude build ./demo_clean/scripts/make_gcc ./demo_dev/scripts/make_gcc ---- ./demo_clean/scripts/make_gcc 2021-02-17 01:23:17.000000000 +0000 +--- ./demo_clean/scripts/make_gcc 2022-01-02 01:49:06.929909588 +0000 +++ ./demo_dev/scripts/make_gcc 2021-04-28 12:18:50.948333190 +0100 -@@ -10,4 +10,4 @@ BUILD_PATH=$SCRIPT_PATH/../build/make_gc +@@ -5,41 +5,9 @@ set -ue + SCRIPT_PATH=$(cd $(dirname $0) && pwd) + CMAKE_PATH=$SCRIPT_PATH/.. + BUILD_PATH=$SCRIPT_PATH/../build/make_gcc +-MINIMUM_DEMO="OFF" +-DATA="" +- +-if [ "$#" -ne 0 ]; then +- DATA="$1" +-fi +- +-while : +-do +- +- if [ -z "$DATA" ]; then +- echo "Choose which format you would like to create the demo." +- echo "Full version : 1" +- echo "Minimum version : 2" +- read -p "Your Choice : " DATA +- fi +- +- case "$DATA" in +- "1" ) +- echo "Making Full Demo" +- MINIMUM_DEMO="OFF" +- break ;; +- "2" ) +- echo "Making Minimum Demo" +- MINIMUM_DEMO="ON" +- break ;; +- * ) +- echo "You need to enter a valid number." +- DATA="" ;; +- esac +-done + + # Run CMake. cmake -S "$CMAKE_PATH" \ -B "$BUILD_PATH" \ - -D CMAKE_BUILD_TYPE=Release +- -D CMAKE_BUILD_TYPE=Release \ +- -D CSM_MINIMUM_DEMO=$MINIMUM_DEMO -cd "$BUILD_PATH" && make ++ -D CMAKE_BUILD_TYPE=Release +cd "$BUILD_PATH" && make -j4 diff -pruN --exclude build ./demo_clean/src/CMakeLists.txt ./demo_dev/src/CMakeLists.txt ---- ./demo_clean/src/CMakeLists.txt 2021-02-17 01:23:17.000000000 +0000 +--- ./demo_clean/src/CMakeLists.txt 2022-01-02 01:49:06.929909588 +0000 +++ ./demo_dev/src/CMakeLists.txt 2021-04-28 12:21:56.795134807 +0100 -@@ -6,8 +6,6 @@ target_sources(${APP_NAME} +@@ -1,49 +1,22 @@ +-if (CSM_MINIMUM_DEMO) +- target_sources(${APP_NAME} ++target_sources(${APP_NAME} + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/LAppAllocator.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/LAppAllocator.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/LAppDefine.cpp ${CMAKE_CURRENT_SOURCE_DIR}/LAppDefine.hpp - ${CMAKE_CURRENT_SOURCE_DIR}/LAppDelegate.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/LAppDelegate.hpp -- ${CMAKE_CURRENT_SOURCE_DIR}/LAppWavFileHandler.cpp -- ${CMAKE_CURRENT_SOURCE_DIR}/LAppWavFileHandler.hpp - ${CMAKE_CURRENT_SOURCE_DIR}/LAppLive2DManager.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/LAppLive2DManager.hpp - ${CMAKE_CURRENT_SOURCE_DIR}/LAppModel.cpp -@@ -21,6 +19,4 @@ target_sources(${APP_NAME} - ${CMAKE_CURRENT_SOURCE_DIR}/LAppView.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/LAppView.hpp - ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp ++ ${CMAKE_CURRENT_SOURCE_DIR}/LAppDelegate.cpp ++ ${CMAKE_CURRENT_SOURCE_DIR}/LAppDelegate.hpp ++ ${CMAKE_CURRENT_SOURCE_DIR}/LAppLive2DManager.cpp ++ ${CMAKE_CURRENT_SOURCE_DIR}/LAppLive2DManager.hpp ++ ${CMAKE_CURRENT_SOURCE_DIR}/LAppModel.cpp ++ ${CMAKE_CURRENT_SOURCE_DIR}/LAppModel.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/LAppPal.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/LAppPal.hpp ++ ${CMAKE_CURRENT_SOURCE_DIR}/LAppSprite.cpp ++ ${CMAKE_CURRENT_SOURCE_DIR}/LAppSprite.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/LAppTextureManager.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/LAppTextureManager.hpp +- ${CMAKE_CURRENT_SOURCE_DIR}/mainMinimum.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/TouchManager.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/TouchManager.hpp - ) +- ${CMAKE_CURRENT_SOURCE_DIR}/CubismUserModelExtend.cpp +- ${CMAKE_CURRENT_SOURCE_DIR}/CubismUserModelExtend.hpp +- ${CMAKE_CURRENT_SOURCE_DIR}/CubismSampleViewMatrix.cpp +- ${CMAKE_CURRENT_SOURCE_DIR}/CubismSampleViewMatrix.hpp +- ${CMAKE_CURRENT_SOURCE_DIR}/MouseActionManager.cpp +- ${CMAKE_CURRENT_SOURCE_DIR}/MouseActionManager.hpp +- ) +-else () +- target_sources(${APP_NAME} +- PRIVATE +- ${CMAKE_CURRENT_SOURCE_DIR}/LAppAllocator.cpp +- ${CMAKE_CURRENT_SOURCE_DIR}/LAppAllocator.hpp +- ${CMAKE_CURRENT_SOURCE_DIR}/LAppDefine.cpp +- ${CMAKE_CURRENT_SOURCE_DIR}/LAppDefine.hpp +- ${CMAKE_CURRENT_SOURCE_DIR}/LAppDelegate.cpp +- ${CMAKE_CURRENT_SOURCE_DIR}/LAppDelegate.hpp +- ${CMAKE_CURRENT_SOURCE_DIR}/LAppWavFileHandler.cpp +- ${CMAKE_CURRENT_SOURCE_DIR}/LAppWavFileHandler.hpp +- ${CMAKE_CURRENT_SOURCE_DIR}/LAppLive2DManager.cpp +- ${CMAKE_CURRENT_SOURCE_DIR}/LAppLive2DManager.hpp +- ${CMAKE_CURRENT_SOURCE_DIR}/LAppModel.cpp +- ${CMAKE_CURRENT_SOURCE_DIR}/LAppModel.hpp +- ${CMAKE_CURRENT_SOURCE_DIR}/LAppPal.cpp +- ${CMAKE_CURRENT_SOURCE_DIR}/LAppPal.hpp +- ${CMAKE_CURRENT_SOURCE_DIR}/LAppSprite.cpp +- ${CMAKE_CURRENT_SOURCE_DIR}/LAppSprite.hpp +- ${CMAKE_CURRENT_SOURCE_DIR}/LAppTextureManager.cpp +- ${CMAKE_CURRENT_SOURCE_DIR}/LAppTextureManager.hpp +- ${CMAKE_CURRENT_SOURCE_DIR}/LAppView.cpp +- ${CMAKE_CURRENT_SOURCE_DIR}/LAppView.hpp +- ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp +- ${CMAKE_CURRENT_SOURCE_DIR}/TouchManager.cpp +- ${CMAKE_CURRENT_SOURCE_DIR}/TouchManager.hpp +- ) +-endif () ++ ${CMAKE_CURRENT_SOURCE_DIR}/LAppView.cpp ++ ${CMAKE_CURRENT_SOURCE_DIR}/LAppView.hpp ++ ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp ++) diff -pruN --exclude build ./demo_clean/src/LAppDefine.cpp ./demo_dev/src/LAppDefine.cpp ---- ./demo_clean/src/LAppDefine.cpp 2021-02-17 01:23:17.000000000 +0000 +--- ./demo_clean/src/LAppDefine.cpp 2022-01-02 01:49:06.929909588 +0000 +++ ./demo_dev/src/LAppDefine.cpp 2021-04-28 12:18:50.948333190 +0100 @@ -64,11 +64,11 @@ namespace LAppDefine { const csmInt32 PriorityForce = 3; @@ -99,7 +184,7 @@ diff -pruN --exclude build ./demo_clean/src/LAppDefine.cpp ./demo_dev/src/LAppDe // デフォルトのレンダーターゲットサイズ const csmInt32 RenderTargetWidth = 1900; diff -pruN --exclude build ./demo_clean/src/LAppDelegate.cpp ./demo_dev/src/LAppDelegate.cpp ---- ./demo_clean/src/LAppDelegate.cpp 2021-02-17 01:23:17.000000000 +0000 +--- ./demo_clean/src/LAppDelegate.cpp 2022-01-02 01:49:06.929909588 +0000 +++ ./demo_dev/src/LAppDelegate.cpp 2021-04-28 12:18:50.948333190 +0100 @@ -45,7 +45,8 @@ void LAppDelegate::ReleaseInstance() s_instance = NULL; @@ -126,7 +211,7 @@ diff -pruN --exclude build ./demo_clean/src/LAppDelegate.cpp ./demo_dev/src/LApp if (_window == NULL) { if (DebugLogEnable) -@@ -95,10 +102,6 @@ bool LAppDelegate::Initialize() +@@ -95,16 +102,11 @@ bool LAppDelegate::Initialize() glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -137,7 +222,13 @@ diff -pruN --exclude build ./demo_clean/src/LAppDelegate.cpp ./demo_dev/src/LApp // ウィンドウサイズ記憶 int width, height; glfwGetWindowSize(LAppDelegate::GetInstance()->GetWindow(), &width, &height); -@@ -111,8 +114,6 @@ bool LAppDelegate::Initialize() + _windowWidth = width; + _windowHeight = height; +- glViewport(0, 0, _windowWidth, _windowHeight); + + //AppViewの初期化 + _view->Initialize(); +@@ -112,8 +114,6 @@ bool LAppDelegate::Initialize() // Cubism3の初期化 InitializeCubism(); @@ -146,7 +237,15 @@ diff -pruN --exclude build ./demo_clean/src/LAppDelegate.cpp ./demo_dev/src/LApp //load model LAppLive2DManager::GetInstance(); -@@ -214,49 +215,6 @@ void LAppDelegate::InitializeCubism() +@@ -155,7 +155,6 @@ void LAppDelegate::Run() + _windowWidth = width; + _windowHeight = height; + } +- glViewport(0, 0, _windowWidth, _windowHeight); + + // 時間更新 + LAppPal::UpdateTime(); +@@ -216,49 +215,6 @@ void LAppDelegate::InitializeCubism() LAppPal::UpdateTime(); } @@ -196,7 +295,7 @@ diff -pruN --exclude build ./demo_clean/src/LAppDelegate.cpp ./demo_dev/src/LApp GLuint LAppDelegate::CreateShader() { //バーテックスシェーダのコンパイル -@@ -299,29 +257,9 @@ GLuint LAppDelegate::CreateShader() +@@ -301,29 +257,9 @@ GLuint LAppDelegate::CreateShader() return programId; } @@ -229,7 +328,7 @@ diff -pruN --exclude build ./demo_clean/src/LAppDelegate.cpp ./demo_dev/src/LApp Csm::csmVector LAppDelegate::Split(const std::string& baseString, char delimiter) diff -pruN --exclude build ./demo_clean/src/LAppDelegate.hpp ./demo_dev/src/LAppDelegate.hpp ---- ./demo_clean/src/LAppDelegate.hpp 2021-02-17 01:23:17.000000000 +0000 +--- ./demo_clean/src/LAppDelegate.hpp 2022-01-02 01:49:06.929909588 +0000 +++ ./demo_dev/src/LAppDelegate.hpp 2021-04-28 12:18:50.948333190 +0100 @@ -40,7 +40,8 @@ public: /** @@ -305,7 +404,7 @@ diff -pruN --exclude build ./demo_clean/src/LAppDelegate.hpp ./demo_dev/src/LApp - -}; diff -pruN --exclude build ./demo_clean/src/LAppLive2DManager.cpp ./demo_dev/src/LAppLive2DManager.cpp ---- ./demo_clean/src/LAppLive2DManager.cpp 2021-02-17 01:23:17.000000000 +0000 +--- ./demo_clean/src/LAppLive2DManager.cpp 2022-01-02 01:49:06.929909588 +0000 +++ ./demo_dev/src/LAppLive2DManager.cpp 2021-04-28 12:24:45.405646016 +0100 @@ -52,11 +52,11 @@ void LAppLive2DManager::ReleaseInstance( @@ -349,7 +448,17 @@ diff -pruN --exclude build ./demo_clean/src/LAppLive2DManager.cpp ./demo_dev/src } void LAppLive2DManager::OnUpdate() const -@@ -136,12 +116,15 @@ void LAppLive2DManager::OnUpdate() const +@@ -127,21 +107,24 @@ void LAppLive2DManager::OnUpdate() const + int width, height; + glfwGetWindowSize(LAppDelegate::GetInstance()->GetWindow(), &width, &height); + ++ CubismMatrix44 projection; + csmUint32 modelCount = _models.GetSize(); + for (csmUint32 i = 0; i < modelCount; ++i) + { +- CubismMatrix44 projection; + LAppModel* model = GetModel(i); + if (model->GetModel()->GetCanvasWidth() > 1.0f && width < height) { // 横に長いモデルを縦長ウィンドウに表示する際モデルの横サイズでscaleを算出する model->GetModelMatrix()->SetWidth(2.0f); @@ -433,7 +542,7 @@ diff -pruN --exclude build ./demo_clean/src/LAppLive2DManager.cpp ./demo_dev/src + _translateY = translateY; +} diff -pruN --exclude build ./demo_clean/src/LAppLive2DManager.hpp ./demo_dev/src/LAppLive2DManager.hpp ---- ./demo_clean/src/LAppLive2DManager.hpp 2021-02-17 01:23:17.000000000 +0000 +--- ./demo_clean/src/LAppLive2DManager.hpp 2022-01-02 01:49:06.929909588 +0000 +++ ./demo_dev/src/LAppLive2DManager.hpp 2021-04-28 12:18:50.948333190 +0100 @@ -6,12 +6,15 @@ */ @@ -512,7 +621,7 @@ diff -pruN --exclude build ./demo_clean/src/LAppLive2DManager.hpp ./demo_dev/src + float _translateY; }; diff -pruN --exclude build ./demo_clean/src/LAppModel.cpp ./demo_dev/src/LAppModel.cpp ---- ./demo_clean/src/LAppModel.cpp 2021-02-17 01:23:17.000000000 +0000 +--- ./demo_clean/src/LAppModel.cpp 2022-01-02 01:49:06.929909588 +0000 +++ ./demo_dev/src/LAppModel.cpp 2021-04-28 12:26:56.699586813 +0100 @@ -21,6 +21,10 @@ #include "LAppTextureManager.hpp" @@ -797,7 +906,7 @@ diff -pruN --exclude build ./demo_clean/src/LAppModel.cpp ./demo_dev/src/LAppMod +} + diff -pruN --exclude build ./demo_clean/src/LAppModel.hpp ./demo_dev/src/LAppModel.hpp ---- ./demo_clean/src/LAppModel.hpp 2021-02-17 01:23:17.000000000 +0000 +--- ./demo_clean/src/LAppModel.hpp 2022-01-02 01:49:06.929909588 +0000 +++ ./demo_dev/src/LAppModel.hpp 2021-04-28 12:27:55.836457680 +0100 @@ -13,7 +13,7 @@ #include @@ -868,7 +977,7 @@ diff -pruN --exclude build ./demo_clean/src/LAppModel.hpp ./demo_dev/src/LAppMod diff -pruN --exclude build ./demo_clean/src/LAppPal.cpp ./demo_dev/src/LAppPal.cpp ---- ./demo_clean/src/LAppPal.cpp 2021-02-17 01:23:17.000000000 +0000 +--- ./demo_clean/src/LAppPal.cpp 2022-01-02 01:49:06.929909588 +0000 +++ ./demo_dev/src/LAppPal.cpp 2021-04-28 12:18:50.952333251 +0100 @@ -6,6 +6,7 @@ */ @@ -899,7 +1008,7 @@ diff -pruN --exclude build ./demo_clean/src/LAppPal.cpp ./demo_dev/src/LAppPal.c } file.read(buf, size); diff -pruN --exclude build ./demo_clean/src/LAppTextureManager.cpp ./demo_dev/src/LAppTextureManager.cpp ---- ./demo_clean/src/LAppTextureManager.cpp 2021-02-17 01:23:17.000000000 +0000 +--- ./demo_clean/src/LAppTextureManager.cpp 2022-01-02 01:49:06.929909588 +0000 +++ ./demo_dev/src/LAppTextureManager.cpp 2021-04-28 12:18:50.952333251 +0100 @@ -96,6 +96,46 @@ LAppTextureManager::TextureInfo* LAppTex @@ -949,7 +1058,7 @@ diff -pruN --exclude build ./demo_clean/src/LAppTextureManager.cpp ./demo_dev/sr { for (Csm::csmUint32 i = 0; i < _textures.GetSize(); i++) diff -pruN --exclude build ./demo_clean/src/LAppTextureManager.hpp ./demo_dev/src/LAppTextureManager.hpp ---- ./demo_clean/src/LAppTextureManager.hpp 2021-02-17 01:23:17.000000000 +0000 +--- ./demo_clean/src/LAppTextureManager.hpp 2022-01-02 01:49:06.929909588 +0000 +++ ./demo_dev/src/LAppTextureManager.hpp 2021-04-28 12:18:50.952333251 +0100 @@ -72,6 +72,8 @@ public: */ @@ -961,7 +1070,7 @@ diff -pruN --exclude build ./demo_clean/src/LAppTextureManager.hpp ./demo_dev/sr * @brief 画像の解放 * diff -pruN --exclude build ./demo_clean/src/LAppView.cpp ./demo_dev/src/LAppView.cpp ---- ./demo_clean/src/LAppView.cpp 2021-02-17 01:23:17.000000000 +0000 +--- ./demo_clean/src/LAppView.cpp 2022-01-02 01:49:06.929909588 +0000 +++ ./demo_dev/src/LAppView.cpp 2021-04-28 12:18:50.952333251 +0100 @@ -13,7 +13,6 @@ #include "LAppLive2DManager.hpp" @@ -1138,7 +1247,7 @@ diff -pruN --exclude build ./demo_clean/src/LAppView.cpp ./demo_dev/src/LAppView - } } diff -pruN --exclude build ./demo_clean/src/LAppView.hpp ./demo_dev/src/LAppView.hpp ---- ./demo_clean/src/LAppView.hpp 2021-02-17 01:23:17.000000000 +0000 +--- ./demo_clean/src/LAppView.hpp 2022-01-02 01:49:06.929909588 +0000 +++ ./demo_dev/src/LAppView.hpp 2021-04-28 12:18:50.952333251 +0100 @@ -14,7 +14,6 @@ #include "CubismFramework.hpp" @@ -1194,7 +1303,7 @@ diff -pruN --exclude build ./demo_clean/src/LAppView.hpp ./demo_dev/src/LAppView // レンダリング先を別ターゲットにする方式の場合に使用 LAppSprite* _renderSprite; ///< モードによっては_renderBufferのテクスチャを描画 diff -pruN --exclude build ./demo_clean/src/main.cpp ./demo_dev/src/main.cpp ---- ./demo_clean/src/main.cpp 2021-02-17 01:23:17.000000000 +0000 +--- ./demo_clean/src/main.cpp 2022-01-02 01:49:06.929909588 +0000 +++ ./demo_dev/src/main.cpp 2021-04-28 12:28:55.845339613 +0100 @@ -5,18 +5,188 @@ * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. diff --git a/example/generate_patch.sh b/example/generate_patch.sh index 9ebe84e..73bb563 100755 --- a/example/generate_patch.sh +++ b/example/generate_patch.sh @@ -1,5 +1,5 @@ #!/bin/sh mkdir -p demo_clean -cp -p -r CubismSdkForNative-4-r.2/Samples/OpenGL/Demo/proj.linux.cmake/* ./demo_clean/ +cp -p -r CubismSdkForNative-4-r.4/Samples/OpenGL/Demo/proj.linux.cmake/* ./demo_clean/ diff -pruN --exclude build ./demo_clean ./demo_dev > ./demo.patch