Use new git-based patching mechanism.
To build the example program:
To build the example program:
-4. Download "Cubism 5 SDK for Native R4.1" from the Live2D website:
+4. Download "Cubism 5 SDK for Native R5" from the Live2D website:
<https://www.live2d.com/en/sdk/download/native/>.
<https://www.live2d.com/en/sdk/download/native/>.
- Extract the archive -- put the "CubismSdkForNative-5-r.4.1" folder under
+ Extract the archive -- put the "CubismSdkForNative-5-r.5" 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
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-5-r.4.1/Samples/OpenGL/thirdParty/scripts"
+ "example/CubismSdkForNative-5-r.5/Samples/OpenGL/thirdParty/scripts"
directory and run
./setup_glew_glfw
directory and run
./setup_glew_glfw
#!/bin/sh -e
mkdir -p demo_build
#!/bin/sh -e
mkdir -p demo_build
-cp -r CubismSdkForNative-5-r.4.1/Samples/OpenGL/Demo/proj.linux.cmake/* ./demo_build/
-patch -d demo_build -p2 < demo.patch
-./demo_build/scripts/make_gcc
+cp -r CubismSdkForNative-5-r.5/Samples/OpenGL/Demo/proj.linux.cmake/* ./demo_build/
+cd demo_build
+git init
+git add .
+git commit -m "Original example from CubismSdkForNative"
+git apply ../demo.patch
+./scripts/make_gcc
-diff -pruN --exclude build ./demo_clean/CMakeLists.txt ./demo_dev/CMakeLists.txt
---- ./demo_clean/CMakeLists.txt 2025-05-30 00:59:58.252401066 +0100
-+++ ./demo_dev/CMakeLists.txt 2025-05-30 01:05:35.538986524 +0100
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 45c4b1a..a850115 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
@@ -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}/../../../..)
@@ -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-5-r.4.1)
++set(SDK_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../CubismSdkForNative-5-r.5)
set(CORE_PATH ${SDK_ROOT_PATH}/Core)
set(FRAMEWORK_PATH ${SDK_ROOT_PATH}/Framework)
set(THIRD_PARTY_PATH ${SDK_ROOT_PATH}/Samples/OpenGL/thirdParty)
set(CORE_PATH ${SDK_ROOT_PATH}/Core)
set(FRAMEWORK_PATH ${SDK_ROOT_PATH}/Framework)
set(THIRD_PARTY_PATH ${SDK_ROOT_PATH}/Samples/OpenGL/thirdParty)
-@@ -35,7 +35,7 @@ set(GLFW_INSTALL OFF CACHE BOOL "" FORCE
+@@ -35,7 +35,7 @@ set(GLFW_INSTALL OFF CACHE BOOL "" FORCE)
set(BUILD_UTILS OFF CACHE BOOL "" FORCE)
# Specify version of compiler.
set(BUILD_UTILS OFF CACHE BOOL "" FORCE)
# Specify version of compiler.
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
-@@ -67,6 +67,11 @@ target_link_libraries(Framework Live2DCu
+@@ -67,6 +67,11 @@ target_link_libraries(Framework Live2DCubismCore glew_s)
# Find opengl libraries.
find_package(OpenGL REQUIRED)
# Find opengl libraries.
find_package(OpenGL REQUIRED)
# Copy resource directory to build directory.
add_custom_command(
# 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 2025-05-30 00:59:58.252401066 +0100
-+++ ./demo_dev/scripts/make_gcc 2023-05-28 09:11:29.467788463 +0100
+diff --git a/scripts/make_gcc b/scripts/make_gcc
+index 4441a91..71adb1a 100755
+--- a/scripts/make_gcc
++++ b/scripts/make_gcc
@@ -5,42 +5,9 @@ set -ue
SCRIPT_PATH=$(cd $(dirname $0) && pwd)
CMAKE_PATH=$SCRIPT_PATH/..
@@ -5,42 +5,9 @@ set -ue
SCRIPT_PATH=$(cd $(dirname $0) && pwd)
CMAKE_PATH=$SCRIPT_PATH/..
-cd "$BUILD_PATH" && make
+ -D CMAKE_BUILD_TYPE=Release
+cd "$BUILD_PATH" && make -j4
-cd "$BUILD_PATH" && make
+ -D CMAKE_BUILD_TYPE=Release
+cd "$BUILD_PATH" && make -j4
-diff -pruN --exclude build ./demo_clean/src/LAppDefine.cpp ./demo_dev/src/LAppDefine.cpp
---- ./demo_clean/src/LAppDefine.cpp 2025-05-30 00:59:58.252401066 +0100
-+++ ./demo_dev/src/LAppDefine.cpp 2025-05-30 01:07:49.665920483 +0100
+diff --git a/src/LAppDefine.cpp b/src/LAppDefine.cpp
+index d7226d2..b534fb7 100644
+--- a/src/LAppDefine.cpp
++++ b/src/LAppDefine.cpp
@@ -60,11 +60,11 @@ namespace LAppDefine {
const csmInt32 PriorityForce = 3;
@@ -60,11 +60,11 @@ namespace LAppDefine {
const csmInt32 PriorityForce = 3;
// デフォルトのレンダーターゲットサイズ
const csmInt32 RenderTargetWidth = 1900;
// デフォルトのレンダーターゲットサイズ
const csmInt32 RenderTargetWidth = 1900;
-diff -pruN --exclude build ./demo_clean/src/LAppDelegate.cpp ./demo_dev/src/LAppDelegate.cpp
---- ./demo_clean/src/LAppDelegate.cpp 2025-05-30 00:59:58.252401066 +0100
-+++ ./demo_dev/src/LAppDelegate.cpp 2025-05-30 01:09:31.843395630 +0100
+diff --git a/src/LAppDelegate.cpp b/src/LAppDelegate.cpp
+index 242e3ca..2da992d 100644
+--- a/src/LAppDelegate.cpp
++++ b/src/LAppDelegate.cpp
@@ -46,7 +46,8 @@ void LAppDelegate::ReleaseInstance()
s_instance = NULL;
}
@@ -46,7 +46,8 @@ void LAppDelegate::ReleaseInstance()
s_instance = NULL;
}
// ウィンドウサイズ記憶
int width, height;
glfwGetWindowSize(LAppDelegate::GetInstance()->GetWindow(), &width, &height);
// ウィンドウサイズ記憶
int width, height;
glfwGetWindowSize(LAppDelegate::GetInstance()->GetWindow(), &width, &height);
-diff -pruN --exclude build ./demo_clean/src/LAppDelegate.hpp ./demo_dev/src/LAppDelegate.hpp
---- ./demo_clean/src/LAppDelegate.hpp 2025-05-30 00:59:58.252401066 +0100
-+++ ./demo_dev/src/LAppDelegate.hpp 2025-05-30 01:10:00.192935412 +0100
+diff --git a/src/LAppDelegate.hpp b/src/LAppDelegate.hpp
+index 89ea99b..50279fd 100644
+--- a/src/LAppDelegate.hpp
++++ b/src/LAppDelegate.hpp
@@ -40,7 +40,8 @@ public:
/**
* @brief APPに必要なものを初期化する。
@@ -40,7 +40,8 @@ public:
/**
* @brief APPに必要なものを初期化する。
-diff -pruN --exclude build ./demo_clean/src/LAppLive2DManager.cpp ./demo_dev/src/LAppLive2DManager.cpp
---- ./demo_clean/src/LAppLive2DManager.cpp 2025-05-30 00:59:58.252401066 +0100
-+++ ./demo_dev/src/LAppLive2DManager.cpp 2025-05-30 01:12:18.865322293 +0100
+diff --git a/src/LAppLive2DManager.cpp b/src/LAppLive2DManager.cpp
+index ac3d356..4a5fed6 100644
+--- a/src/LAppLive2DManager.cpp
++++ b/src/LAppLive2DManager.cpp
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <Rendering/CubismRenderer.hpp>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <Rendering/CubismRenderer.hpp>
-@@ -68,12 +62,11 @@ void LAppLive2DManager::ReleaseInstance(
+@@ -69,12 +63,11 @@ void LAppLive2DManager::ReleaseInstance()
LAppLive2DManager::LAppLive2DManager()
: _viewMatrix(NULL)
LAppLive2DManager::LAppLive2DManager()
: _viewMatrix(NULL)
}
LAppLive2DManager::~LAppLive2DManager()
}
LAppLive2DManager::~LAppLive2DManager()
-@@ -92,60 +85,6 @@ void LAppLive2DManager::ReleaseAllModel(
+@@ -94,60 +87,6 @@ void LAppLive2DManager::ReleaseAllModel()
LAppModel* LAppLive2DManager::GetModel(csmUint32 no) const
{
if (no < _models.GetSize())
LAppModel* LAppLive2DManager::GetModel(csmUint32 no) const
{
if (no < _models.GetSize())
-@@ -172,26 +111,6 @@ void LAppLive2DManager::OnTap(csmFloat32
+@@ -184,26 +123,6 @@ void LAppLive2DManager::OnTap(csmFloat32 x, csmFloat32 y)
{
LAppPal::PrintLogLn("[APP]tap point: {x:%.2f y:%.2f}", x, y);
}
{
LAppPal::PrintLogLn("[APP]tap point: {x:%.2f y:%.2f}", x, y);
}
}
void LAppLive2DManager::OnUpdate() const
}
void LAppLive2DManager::OnUpdate() const
-@@ -215,12 +134,15 @@ void LAppLive2DManager::OnUpdate() const
+@@ -230,12 +149,15 @@ void LAppLive2DManager::OnUpdate() const
{
// 横に長いモデルを縦長ウィンドウに表示する際モデルの横サイズでscaleを算出する
model->GetModelMatrix()->SetWidth(2.0f);
{
// 横に長いモデルを縦長ウィンドウに表示する際モデルの横サイズでscaleを算出する
model->GetModelMatrix()->SetWidth(2.0f);
// 必要があればここで乗算
if (_viewMatrix != NULL)
// 必要があればここで乗算
if (_viewMatrix != NULL)
-@@ -237,37 +159,15 @@ void LAppLive2DManager::OnUpdate() const
- }
+@@ -257,37 +179,15 @@ void LAppLive2DManager::OnUpdate() const
+ Csm::Rendering::CubismOffscreenManager_OpenGLES2::GetInstance()->ReleaseStaleRenderTextures();
}
-void LAppLive2DManager::NextScene()
}
-void LAppLive2DManager::NextScene()
/*
* モデル半透明表示を行うサンプルを提示する。
/*
* モデル半透明表示を行うサンプルを提示する。
-@@ -288,8 +188,8 @@ void LAppLive2DManager::ChangeScene(Csm:
+@@ -308,8 +208,8 @@ void LAppLive2DManager::ChangeScene(Csm::csmInt32 index)
#if defined(USE_RENDER_TARGET) || defined(USE_MODEL_RENDER_TARGET)
// モデル個別にαを付けるサンプルとして、もう1体モデルを作成し、少し位置をずらす
#if defined(USE_RENDER_TARGET) || defined(USE_MODEL_RENDER_TARGET)
// モデル個別にαを付けるサンプルとして、もう1体モデルを作成し、少し位置をずらす
_models[1]->GetModelMatrix()->TranslateX(0.2f);
#endif
_models[1]->GetModelMatrix()->TranslateX(0.2f);
#endif
-@@ -317,3 +217,20 @@ void LAppLive2DManager::SetViewMatrix(Cu
+@@ -337,3 +237,20 @@ void LAppLive2DManager::SetViewMatrix(CubismMatrix44* m)
_viewMatrix->GetArray()[i] = m->GetArray()[i];
}
}
_viewMatrix->GetArray()[i] = m->GetArray()[i];
}
}
+ _translateX = translateX;
+ _translateY = translateY;
+}
+ _translateX = translateX;
+ _translateY = translateY;
+}
-diff -pruN --exclude build ./demo_clean/src/LAppLive2DManager.hpp ./demo_dev/src/LAppLive2DManager.hpp
---- ./demo_clean/src/LAppLive2DManager.hpp 2025-05-30 00:59:58.256401196 +0100
-+++ ./demo_dev/src/LAppLive2DManager.hpp 2025-05-30 01:12:54.056756547 +0100
+diff --git a/src/LAppLive2DManager.hpp b/src/LAppLive2DManager.hpp
+index 2c9939c..5907a82 100644
+--- a/src/LAppLive2DManager.hpp
++++ b/src/LAppLive2DManager.hpp
@@ -6,12 +6,15 @@
*/
#pragma once
@@ -6,12 +6,15 @@
*/
#pragma once
/**
* @brief サンプルアプリケーションにおいてCubismModelを管理するクラス<br>
* モデル生成と破棄、タップイベントの処理、モデル切り替えを行う。
/**
* @brief サンプルアプリケーションにおいてCubismModelを管理するクラス<br>
* モデル生成と破棄、タップイベントの処理、モデル切り替えを行う。
-@@ -36,24 +39,6 @@ public:
+@@ -35,24 +38,6 @@ public:
+ */
static void ReleaseInstance();
static void ReleaseInstance();
- * @brief Resources フォルダにあるモデルフォルダ名をセットする
- *
- */
- * @brief Resources フォルダにあるモデルフォルダ名をセットする
- *
- */
- */
- Csm::csmInt32 GetModelDirSize() const;
-
- */
- Csm::csmInt32 GetModelDirSize() const;
-
* @brief 現在のシーンで保持しているモデルを返す
*
* @brief 現在のシーンで保持しているモデルを返す
*
- * @param[in] no モデルリストのインデックス値
-@@ -90,16 +75,14 @@ public:
+@@ -98,16 +83,14 @@ public:
void OnUpdate() const;
/**
void OnUpdate() const;
/**
-@@ -112,6 +95,24 @@ public:
+@@ -120,6 +103,24 @@ public:
*/
void SetViewMatrix(Live2D::Cubism::Framework::CubismMatrix44* m);
*/
void SetViewMatrix(Live2D::Cubism::Framework::CubismMatrix44* m);
private:
/**
* @brief コンストラクタ
private:
/**
* @brief コンストラクタ
-@@ -125,7 +126,8 @@ private:
+@@ -133,7 +134,8 @@ private:
Csm::CubismMatrix44* _viewMatrix; ///< モデル描画に用いるView行列
Csm::csmVector<LAppModel*> _models; ///< モデルインスタンスのコンテナ
Csm::CubismMatrix44* _viewMatrix; ///< モデル描画に用いるView行列
Csm::csmVector<LAppModel*> _models; ///< モデルインスタンスのコンテナ
+ float _translateX;
+ float _translateY;
};
+ float _translateX;
+ float _translateY;
};
-diff -pruN --exclude build ./demo_clean/src/LAppModel.cpp ./demo_dev/src/LAppModel.cpp
---- ./demo_clean/src/LAppModel.cpp 2025-05-30 00:59:58.256401196 +0100
-+++ ./demo_dev/src/LAppModel.cpp 2025-05-30 01:17:12.780545257 +0100
-@@ -21,26 +21,32 @@
- #include "LAppTextureManager.hpp"
- #include "LAppDelegate.hpp"
+diff --git a/src/LAppModel.cpp b/src/LAppModel.cpp
+index 7b8e0ea..14b9754 100644
+--- a/src/LAppModel.cpp
++++ b/src/LAppModel.cpp
+@@ -28,27 +28,33 @@
+ #include "Motion/CubismPhysicsUpdater.hpp"
+ #include "Motion/CubismPoseUpdater.hpp"
+#include "mouse_cursor_tracker.h"
+
+#include "mouse_cursor_tracker.h"
+
: LAppModel_Common()
, _modelSetting(NULL)
, _userTimeSeconds(0.0f)
: LAppModel_Common()
, _modelSetting(NULL)
, _userTimeSeconds(0.0f)
+ , _motionUpdated(false)
+ , _tracker(nullptr)
+ , _useOldParamId(useOldParamId)
{
+ , _tracker(nullptr)
+ , _useOldParamId(useOldParamId)
{
}
LAppModel::~LAppModel()
}
LAppModel::~LAppModel()
-@@ -179,7 +185,7 @@ void LAppModel::SetupModel(ICubismModelS
+@@ -207,7 +213,7 @@ void LAppModel::SetupModel(ICubismModelSetting* setting)
breathParameters.PushBack(CubismBreath::BreathParameterData(_idParamAngleY, 0.0f, 8.0f, 3.5345f, 0.5f));
breathParameters.PushBack(CubismBreath::BreathParameterData(_idParamAngleZ, 0.0f, 10.0f, 5.5345f, 0.5f));
breathParameters.PushBack(CubismBreath::BreathParameterData(_idParamBodyAngleX, 0.0f, 4.0f, 15.5345f, 0.5f));
breathParameters.PushBack(CubismBreath::BreathParameterData(_idParamAngleY, 0.0f, 8.0f, 3.5345f, 0.5f));
breathParameters.PushBack(CubismBreath::BreathParameterData(_idParamAngleZ, 0.0f, 10.0f, 5.5345f, 0.5f));
breathParameters.PushBack(CubismBreath::BreathParameterData(_idParamBodyAngleX, 0.0f, 4.0f, 15.5345f, 0.5f));
+ breathParameters.PushBack(CubismBreath::BreathParameterData(CubismFramework::GetIdManager()->GetId(_(ParamBreath)), 0.5f, 0.5f, 3.2345f, 0.5f));
_breath->SetParameters(breathParameters);
+ breathParameters.PushBack(CubismBreath::BreathParameterData(CubismFramework::GetIdManager()->GetId(_(ParamBreath)), 0.5f, 0.5f, 3.2345f, 0.5f));
_breath->SetParameters(breathParameters);
+
+@@ -241,9 +247,6 @@ void LAppModel::SetupModel(ICubismModelSetting* setting)
+ {
+ _lipSyncIds.PushBack(_modelSetting->GetLipSyncParameterId(i));
+ }
+-
+- CubismLipSyncUpdater* lipSync = CSM_NEW CubismLipSyncUpdater(_lipSyncIds, _wavFileHandler);
+- _updateScheduler.AddUpdatableList(lipSync);
-@@ -322,86 +328,117 @@ void LAppModel::Update()
+
+ // Look
+@@ -377,27 +380,122 @@ void LAppModel::Update()
const csmFloat32 deltaTimeSeconds = LAppPal::GetDeltaTime();
_userTimeSeconds += deltaTimeSeconds;
const csmFloat32 deltaTimeSeconds = LAppPal::GetDeltaTime();
_userTimeSeconds += deltaTimeSeconds;
-- _dragManager->Update(deltaTimeSeconds);
-- _dragX = _dragManager->GetX();
-- _dragY = _dragManager->GetY();
--
-- csmBool motionUpdated = false;
+- _motionUpdated = false;
-
- //-----------------------------------------------------------------
- _model->LoadParameters(); // 前回セーブされた状態をロード
- if (_motionManager->IsFinished())
-
- //-----------------------------------------------------------------
- _model->LoadParameters(); // 前回セーブされた状態をロード
- if (_motionManager->IsFinished())
-- {
-- // モーションの再生がない場合、待機モーションの中からランダムで再生する
-- StartRandomMotion(MotionGroupIdle, PriorityIdle);
-- }
-- else
-- motionUpdated = _motionManager->UpdateMotion(_model, deltaTimeSeconds); // モーションを更新
-- }
-- _model->SaveParameters(); // 状態を保存
-- //-----------------------------------------------------------------
+- // モーションの再生がない場合、待機モーションの中からランダムで再生する
+- StartRandomMotion(MotionGroupIdle, PriorityIdle);
+ auto idMan = CubismFramework::GetIdManager();
+ auto params = _tracker->getParams();
+ auto idMan = CubismFramework::GetIdManager();
+ auto params = _tracker->getParams();
-
-- // 不透明度
-- _opacity = _model->GetModelOpacity();
+ _model->LoadParameters(); // 前回セーブされた状態をロード
+ _model->LoadParameters(); // 前回セーブされた状態をロード
-
-- // まばたき
-- if (!motionUpdated)
-- {
-- if (_eyeBlink != NULL)
+ int paramsMotionPriority = static_cast<int>(params.motionPriority);
+
+ if (paramsMotionPriority != PriorityNone)
+ int paramsMotionPriority = static_cast<int>(params.motionPriority);
+
+ if (paramsMotionPriority != PriorityNone)
- {
-- // メインモーションの更新がないとき
-- _eyeBlink->UpdateParameters(_model, deltaTimeSeconds); // 目パチ
+ StartMotion(params.motionGroup.c_str(), params.motionNumber,
+ paramsMotionPriority);
+ StartMotion(params.motionGroup.c_str(), params.motionNumber,
+ paramsMotionPriority);
+ else if (params.randomIdleMotion && _motionManager->IsFinished())
+ {
+ // モーションの再生がない場合、待機モーションの中からランダムで再生する
+ else if (params.randomIdleMotion && _motionManager->IsFinished())
+ {
+ // モーションの再生がない場合、待機モーションの中からランダムで再生する
+ _motionManager->UpdateMotion(_model, deltaTimeSeconds); // モーションを更新
+ }
+ _model->SaveParameters(); // 状態を保存
+ _motionManager->UpdateMotion(_model, deltaTimeSeconds); // モーションを更新
+ }
+ _model->SaveParameters(); // 状態を保存
-
-- if (_expressionManager != NULL)
-- {
-- _expressionManager->UpdateMotion(_model, deltaTimeSeconds); // 表情でパラメータ更新(相対変化)
-- }
+ if (params.expression != "")
+ {
+ SetExpression(params.expression.c_str());
+ if (params.expression != "")
+ {
+ SetExpression(params.expression.c_str());
+ {
+ _expressionManager->UpdateMotion(_model, deltaTimeSeconds); // 表情でパラメータ更新(相対変化)
+ }
+ {
+ _expressionManager->UpdateMotion(_model, deltaTimeSeconds); // 表情でパラメータ更新(相対変化)
+ }
-
-- //ドラッグによる変化
-- //ドラッグによる顔の向きの調整
-- _model->AddParameterValue(_idParamAngleX, _dragX * 30); // -30から30の値を加える
-- _model->AddParameterValue(_idParamAngleY, _dragY * 30);
-- _model->AddParameterValue(_idParamAngleZ, _dragX * _dragY * -30);
+ bool autoBlink = params.autoBlink && _eyeBlink;
+ auto eyeLOpenIt = params.live2d.find("ParamEyeLOpen");
+ auto eyeROpenIt = params.live2d.find("ParamEyeROpen");
+ bool autoBlink = params.autoBlink && _eyeBlink;
+ auto eyeLOpenIt = params.live2d.find("ParamEyeLOpen");
+ auto eyeROpenIt = params.live2d.find("ParamEyeROpen");
-
-- //ドラッグによる体の向きの調整
-- _model->AddParameterValue(_idParamBodyAngleX, _dragX * 10); // -10から10の値を加える
+ if (autoBlink)
+ {
+ // Handle blink first
+ _eyeBlink->UpdateParameters(_model, deltaTimeSeconds);
+ }
+ if (autoBlink)
+ {
+ // Handle blink first
+ _eyeBlink->UpdateParameters(_model, deltaTimeSeconds);
+ }
-
-- //ドラッグによる目の向きの調整
-- _model->AddParameterValue(_idParamEyeBallX, _dragX); // -1から1の値を加える
-- _model->AddParameterValue(_idParamEyeBallY, _dragY);
+ if (eyeLOpenIt != params.live2d.end())
+ {
+ // If value specified, override blinking
+ if (eyeLOpenIt != params.live2d.end())
+ {
+ // If value specified, override blinking
+ {
+ // If no value specified and no auto blink, set to 1
+ _model->SetParameterValue(idMan->GetId(_("ParamEyeLOpen")), 1);
+ {
+ // If no value specified and no auto blink, set to 1
+ _model->SetParameterValue(idMan->GetId(_("ParamEyeLOpen")), 1);
-
-- // 呼吸など
-- if (_breath != NULL)
-- {
-- _breath->UpdateParameters(_model, deltaTimeSeconds);
-- }
-
-- // 物理演算の設定
-- if (_physics != NULL)
-- {
-- _physics->Evaluate(_model, deltaTimeSeconds);
-- }
+ if (eyeROpenIt != params.live2d.end())
+ {
+ _model->SetParameterValue(idMan->GetId(_("ParamEyeROpen")),
+ if (eyeROpenIt != params.live2d.end())
+ {
+ _model->SetParameterValue(idMan->GetId(_("ParamEyeROpen")),
+ {
+ _model->SetParameterValue(idMan->GetId(_("ParamEyeROpen")), 1);
+ }
+ {
+ _model->SetParameterValue(idMan->GetId(_("ParamEyeROpen")), 1);
+ }
-
-- // リップシンクの設定
-- if (_lipSync)
-- {
-- // リアルタイムでリップシンクを行う場合、システムから音量を取得して0〜1の範囲で値を入力します。
-- csmFloat32 value = 0.0f;
-
-- // 状態更新/RMS値取得
-- _wavFileHandler.Update(deltaTimeSeconds);
-- value = _wavFileHandler.GetRms();
-+ if (params.useLipSync && _lipSync)
++
++
++ if (params.useLipSync)
+ {
+ csmFloat32 value = params.lipSyncParam; // 0 to 1
+ {
+ csmFloat32 value = params.lipSyncParam; // 0 to 1
-
-- for (csmUint32 i = 0; i < _lipSyncIds.GetSize(); ++i)
+ for (csmUint32 i = 0; i < _lipSyncIds.GetSize(); ++i)
+ {
+ _model->AddParameterValue(_lipSyncIds[i], value, 0.8f);
+ for (csmUint32 i = 0; i < _lipSyncIds.GetSize(); ++i)
+ {
+ _model->AddParameterValue(_lipSyncIds[i], value, 0.8f);
+ }
+
+ if (params.autoBreath && _breath)
+ }
+
+ if (params.autoBreath && _breath)
- {
-- _model->AddParameterValue(_lipSyncIds[i], value, 0.8f);
+ // Note: _model->LoadParameters and SaveParameters is needed
+ // before - see above.
+ _breath->UpdateParameters(_model, deltaTimeSeconds);
+ // Note: _model->LoadParameters and SaveParameters is needed
+ // before - see above.
+ _breath->UpdateParameters(_model, deltaTimeSeconds);
+ // 物理演算の設定
+ if (_physics != NULL)
+ // 物理演算の設定
+ if (_physics != NULL)
+ {
+- _motionUpdated = _motionManager->UpdateMotion(_model, deltaTimeSeconds); // モーションを更新
+ _physics->Evaluate(_model, deltaTimeSeconds);
+ _physics->Evaluate(_model, deltaTimeSeconds);
+ }
+- _model->SaveParameters(); // 状態を保存
+- //-----------------------------------------------------------------
+
+- // 不透明度
+- _opacity = _model->GetModelOpacity();
+-
+- _updateScheduler.OnLateUpdate(_model, deltaTimeSeconds);
++ // ポーズの設定
++ if (_pose != NULL)
++ {
++ _pose->UpdateParameters(_model, deltaTimeSeconds);
-+
- // ポーズの設定
- if (_pose != NULL)
- {
-@@ -464,7 +501,6 @@ CubismMotionQueueEntryHandle LAppModel::
+
+ _model->Update();
+
+@@ -455,7 +553,6 @@ CubismMotionQueueEntryHandle LAppModel::StartMotion(const csmChar* group, csmInt
{
csmString path = voice;
path = _modelHomeDir + path;
{
csmString path = voice;
path = _modelHomeDir + path;
-@@ -616,3 +652,42 @@ Csm::Rendering::CubismOffscreenSurface_O
+@@ -607,3 +704,42 @@ Csm::Rendering::CubismRenderTarget_OpenGLES2& LAppModel::GetRenderBuffer()
{
return _renderBuffer;
}
{
return _renderBuffer;
}
+ return csmString(ans.c_str());
+}
+
+ return csmString(ans.c_str());
+}
+
-diff -pruN --exclude build ./demo_clean/src/LAppModel.hpp ./demo_dev/src/LAppModel.hpp
---- ./demo_clean/src/LAppModel.hpp 2025-05-30 00:59:58.252401066 +0100
-+++ ./demo_dev/src/LAppModel.hpp 2025-05-30 01:15:06.963872011 +0100
+diff --git a/src/LAppModel.hpp b/src/LAppModel.hpp
+index 2637a54..1cddb56 100644
+--- a/src/LAppModel.hpp
++++ b/src/LAppModel.hpp
@@ -12,8 +12,8 @@
#include <Type/csmRectF.hpp>
@@ -12,8 +12,8 @@
#include <Type/csmRectF.hpp>
- #include <Rendering/OpenGL/CubismOffscreenSurface_OpenGLES2.hpp>
+ #include <Rendering/OpenGL/CubismRenderTarget_OpenGLES2.hpp>
-#include "LAppWavFileHandler_Common.hpp"
#include "LAppModel_Common.hpp"
-#include "LAppWavFileHandler_Common.hpp"
#include "LAppModel_Common.hpp"
/**
* @brief ユーザーが実際に使用するモデルの実装クラス<br>
/**
* @brief ユーザーが実際に使用するモデルの実装クラス<br>
-@@ -25,8 +25,11 @@ class LAppModel : public LAppModel_Commo
+@@ -25,8 +25,11 @@ class LAppModel : public LAppModel_Common
public:
/**
* @brief コンストラクタ
public:
/**
* @brief コンストラクタ
* @brief デストラクタ
@@ -116,6 +119,15 @@ public:
*/
* @brief デストラクタ
@@ -116,6 +119,15 @@ public:
*/
- Csm::Rendering::CubismOffscreenSurface_OpenGLES2& GetRenderBuffer();
+ Csm::Rendering::CubismRenderTarget_OpenGLES2& GetRenderBuffer();
+ /**
+ * @brief Set the pointer to the MouseCursorTracker instance
+ /**
+ * @brief Set the pointer to the MouseCursorTracker instance
Csm::ICubismModelSetting* _modelSetting; ///< モデルセッティング情報
Csm::csmString _modelHomeDir; ///< モデルセッティングが置かれたディレクトリ
Csm::csmFloat32 _userTimeSeconds; ///< デルタ時間の積算値[秒]
Csm::ICubismModelSetting* _modelSetting; ///< モデルセッティング情報
Csm::csmString _modelHomeDir; ///< モデルセッティングが置かれたディレクトリ
Csm::csmFloat32 _userTimeSeconds; ///< デルタ時間の積算値[秒]
-@@ -185,7 +208,7 @@ private:
- const Csm::CubismId* _idParamEyeBallX; ///< パラメータID: ParamEyeBallX
- const Csm::CubismId* _idParamEyeBallY; ///< パラメータID: ParamEyeBallXY
+@@ -187,7 +210,7 @@ private:
+
+ Csm::csmBool _motionUpdated; ///< モーション更新フラグ
- LAppWavFileHandler_Common _wavFileHandler; ///< wavファイルハンドラ
- LAppWavFileHandler_Common _wavFileHandler; ///< wavファイルハンドラ
--
- Csm::Rendering::CubismOffscreenSurface_OpenGLES2 _renderBuffer; ///< フレームバッファ以外の描画先
-+
++ Csm::Rendering::CubismRenderTarget_OpenGLES2 _renderBuffer; ///< フレームバッファ以外の描画先 Csm::Rendering::CubismOffscreenSurface_OpenGLES2 _renderBuffer; ///< フレームバッファ以外の描画先
+
+- Csm::Rendering::CubismRenderTarget_OpenGLES2 _renderBuffer; ///< フレームバッファ以外の描画先
+ MouseCursorTracker *_tracker;
};
+ MouseCursorTracker *_tracker;
};
-diff -pruN --exclude build ./demo_clean/src/LAppTextureManager.cpp ./demo_dev/src/LAppTextureManager.cpp
---- ./demo_clean/src/LAppTextureManager.cpp 2025-05-30 00:59:58.252401066 +0100
-+++ ./demo_dev/src/LAppTextureManager.cpp 2025-05-30 01:18:50.733874528 +0100
-@@ -96,6 +96,46 @@ LAppTextureManager::TextureInfo* LAppTex
+diff --git a/src/LAppTextureManager.cpp b/src/LAppTextureManager.cpp
+index 97cec74..191bdc0 100644
+--- a/src/LAppTextureManager.cpp
++++ b/src/LAppTextureManager.cpp
+@@ -96,6 +96,46 @@ LAppTextureManager::TextureInfo* LAppTextureManager::CreateTextureFromPngFile(st
void LAppTextureManager::ReleaseTextures()
{
for (Csm::csmUint32 i = 0; i < _texturesInfo.GetSize(); i++)
void LAppTextureManager::ReleaseTextures()
{
for (Csm::csmUint32 i = 0; i < _texturesInfo.GetSize(); i++)
-diff -pruN --exclude build ./demo_clean/src/LAppTextureManager.hpp ./demo_dev/src/LAppTextureManager.hpp
---- ./demo_clean/src/LAppTextureManager.hpp 2025-05-30 00:59:58.252401066 +0100
-+++ ./demo_dev/src/LAppTextureManager.hpp 2025-05-30 01:19:14.566288429 +0100
+diff --git a/src/LAppTextureManager.hpp b/src/LAppTextureManager.hpp
+index a6713df..a42a112 100644
+--- a/src/LAppTextureManager.hpp
++++ b/src/LAppTextureManager.hpp
@@ -41,6 +41,8 @@ public:
*/
TextureInfo* CreateTextureFromPngFile(std::string fileName);
@@ -41,6 +41,8 @@ public:
*/
TextureInfo* CreateTextureFromPngFile(std::string fileName);
-diff -pruN --exclude build ./demo_clean/src/LAppView.cpp ./demo_dev/src/LAppView.cpp
---- ./demo_clean/src/LAppView.cpp 2025-05-30 00:59:58.252401066 +0100
-+++ ./demo_dev/src/LAppView.cpp 2025-05-30 01:24:23.734104120 +0100
-@@ -81,9 +81,6 @@ void LAppView::Initialize(int width, int
+diff --git a/src/LAppView.cpp b/src/LAppView.cpp
+index 4e42040..2ee08db 100644
+--- a/src/LAppView.cpp
++++ b/src/LAppView.cpp
+@@ -84,9 +84,6 @@ void LAppView::Initialize(int width, int height)
void LAppView::Render()
{
_back->Render();
void LAppView::Render()
{
_back->Render();
LAppLive2DManager* Live2DManager = LAppLive2DManager::GetInstance();
LAppLive2DManager* Live2DManager = LAppLive2DManager::GetInstance();
-@@ -125,35 +122,17 @@ void LAppView::InitializeSprite()
+@@ -128,36 +125,17 @@ void LAppView::InitializeSprite()
glfwGetWindowSize(LAppDelegate::GetInstance()->GetWindow(), &width, &height);
LAppTextureManager* textureManager = LAppDelegate::GetInstance()->GetTextureManager();
glfwGetWindowSize(LAppDelegate::GetInstance()->GetWindow(), &width, &height);
LAppTextureManager* textureManager = LAppDelegate::GetInstance()->GetTextureManager();
float x = width * 0.5f;
float y = height * 0.5f;
float x = width * 0.5f;
float y = height * 0.5f;
-- float fWidth = static_cast<float>(backgroundTexture->width * 2.0f);
- float fHeight = static_cast<float>(height) * 0.95f;
- float fHeight = static_cast<float>(height) * 0.95f;
+- float ratio = fHeight / static_cast<float>(backgroundTexture->height);
+- float fWidth = static_cast<float>(backgroundTexture->width) * ratio;
+ float fWidth = static_cast<float>(width);
+ float fHeight = static_cast<float>(height);
_back = new LAppSprite(x, y, fWidth, fHeight, backgroundTexture->id, programId);
+ float fWidth = static_cast<float>(width);
+ float fHeight = static_cast<float>(height);
_back = new LAppSprite(x, y, fWidth, fHeight, backgroundTexture->id, programId);
// 画面全体を覆うサイズ
x = width * 0.5f;
y = height * 0.5f;
// 画面全体を覆うサイズ
x = width * 0.5f;
y = height * 0.5f;
-@@ -192,18 +171,6 @@ void LAppView::OnTouchesEnded(float px,
+@@ -196,18 +174,6 @@ void LAppView::OnTouchesEnded(float px, float py) const
LAppPal::PrintLogLn("[APP]touchesEnded x:%.2f y:%.2f", x, y);
}
live2DManager->OnTap(x, y);
LAppPal::PrintLogLn("[APP]touchesEnded x:%.2f y:%.2f", x, y);
}
live2DManager->OnTap(x, y);
-@@ -329,32 +296,4 @@ void LAppView::ResizeSprite()
+@@ -334,41 +300,6 @@ void LAppView::ResizeSprite()
_back->ResetRect(x, y, fWidth, fHeight);
}
}
_back->ResetRect(x, y, fWidth, fHeight);
}
}
- _gear->ResetRect(x, y, fWidth, fHeight);
- }
- }
- _gear->ResetRect(x, y, fWidth, fHeight);
- }
- }
+-
+- if (_renderSprite)
+- {
+- x = width * 0.5f;
+- y = height * 0.5f;
+- _renderSprite->ResetRect(x, y, static_cast<float>(width), static_cast<float>(height));
+- }
-diff -pruN --exclude build ./demo_clean/src/main.cpp ./demo_dev/src/main.cpp
---- ./demo_clean/src/main.cpp 2025-05-30 00:59:58.252401066 +0100
-+++ ./demo_dev/src/main.cpp 2025-05-30 01:19:44.722858078 +0100
+
+ void LAppView::DestroySpriteRenderTarget()
+diff --git a/src/main.cpp b/src/main.cpp
+index b65c1f0..7da9d0a 100644
+--- a/src/main.cpp
++++ b/src/main.cpp
@@ -5,18 +5,186 @@
* that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.
*/
@@ -5,18 +5,186 @@
* that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.
*/
-mkdir -p demo_clean
-cp -p -r CubismSdkForNative-5-r.4.1/Samples/OpenGL/Demo/proj.linux.cmake/* ./demo_clean/
-diff -pruN --exclude build ./demo_clean ./demo_dev > ./demo.patch
+git -C demo_dev diff orig > ./demo.patch
--- /dev/null
+#!/bin/bash -e
+
+if [[ "$1" == "-h" || "$1" == "--help" ]]; then
+ echo "Example usage:"
+ echo "./upgrade.sh ./CubismSdkForNative-5-r.5"
+ exit 0
+fi
+
+git -C demo_dev checkout orig
+cp -r "$1"/Samples/OpenGL/Demo/proj.linux.cmake/* ./demo_dev/
+cd demo_dev
+git add .
+git commit -m "$(basename $1)"
+git checkout master
+git merge orig
+
+echo "Now resolve conflicts, build, and test..."