diff --git a/CHANGELOG.md b/CHANGELOG.md index bf7fcdf..dd4ea7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,31 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## [5-r.1] - 2024-03-26 + +### Added + +* Add a OpenGL shader setup class. + +### Changed + +* Change so that `LAppSprite` does not depend on `LAppDelegate`. +* Change to read shader source codes from files. + +### Fixed + +* Fix a problem where two application icons are generated when installing the Minimum sample application on a device. + +### Removed + +* Remove description of CMake from development environment in README files. + * CMake is not actually used. +* Remove the unnecessary `if` branch due to raising the minimum API version. +* Remove the description of NDK version. + * Because of not using NDK. +* Remove the unnecessary variables in the `LAppSprite` class. + + ## [5-r.1-beta.3] - 2024-01-18 ### Changed @@ -114,6 +139,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). * New released! + +[5-r.1]: https://github.com/Live2D/CubismJavaSamples/compare/5-r.1-beta.3...5-r.1 [5-r.1-beta.3]: https://github.com/Live2D/CubismJavaSamples/compare/5-r.1-beta.2...5-r.1-beta.3 [5-r.1-beta.2]: https://github.com/Live2D/CubismJavaSamples/compare/5-r.1-beta.1...5-r.1-beta.2 [5-r.1-beta.1]: https://github.com/Live2D/CubismJavaSamples/compare/4-r.1...5-r.1-beta.1 diff --git a/Core/CHANGELOG.md b/Core/CHANGELOG.md index 3ca60c4..afe4260 100644 --- a/Core/CHANGELOG.md +++ b/Core/CHANGELOG.md @@ -5,6 +5,21 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 2024-03-26 + +### Remove + +* [Unity] Remove built with Emscripten 1.38.48. + * Unity 2021.2 or later uses only Core under `Assets/Live2D/Cubism/Plugins/Experimental/Emscripten/latest`. + + +## 2023-09-28 + +### Remove + +* Remove bitcode from IOS build. + + ## 2023-08-17 ### Added diff --git a/Core/README.ja.md b/Core/README.ja.md index 47f2b9f..8ef4db5 100644 --- a/Core/README.ja.md +++ b/Core/README.ja.md @@ -18,6 +18,6 @@ Javaで開発する場合は、このファイルを使用してください。 | プラットフォーム | アーキテクチャ | jar | aar | パス | 注記 | | --- |----------|---|-----|---|-----| | Android | ARM64 | | ✓ | android/Live2DCubismCore.aar | | -| Android | ARMv7 | | ✓ | android/Live2DCubismCore.aar | | +| Android | ARMv7 | | ✓ | android/Live2DCubismCore.aar | このライブラリは現在非推奨で、近日中に削除される予定です。 | | Android | x86 | | ✓ | android/Live2DCubismCore.aar | | | Android | x86_64 | | ✓ | android/Live2DCubismCore.aar | | diff --git a/Core/README.md b/Core/README.md index 82071bd..cd34619 100644 --- a/Core/README.md +++ b/Core/README.md @@ -18,6 +18,6 @@ Use this file when developing with Java. | Platform | Architecture | jar | aar | Path | Note | | --- | --- | --- | --- |------------------------------| --- | | Android | ARM64 | |✓ | android/Live2DCubismCore.aar | | -| Android | ARMv7 | | ✓ | android/Live2DCubismCore.aar | | +| Android | ARMv7 | | ✓ | android/Live2DCubismCore.aar | This library is currently deprecated and will be removed in the near future. | | Android | x86 | | ✓ | android/Live2DCubismCore.aar | | | Android | x86_64 | | ✓ | android/Live2DCubismCore.aar | | diff --git a/Framework b/Framework index fa02ff6..6eafb99 160000 --- a/Framework +++ b/Framework @@ -1 +1 @@ -Subproject commit fa02ff60af812efe8fdc5ce84965da5f8ccb5b2e +Subproject commit 6eafb99cd5f9c58ee9486fcdddfe74fead1ba41f diff --git a/README.ja.md b/README.ja.md index 12cc66a..9b13549 100644 --- a/README.ja.md +++ b/README.ja.md @@ -25,10 +25,10 @@ Cubism 5 Editorに搭載された新機能のSDK対応については [こちら . ├─ Core # Live2D Cubism Core Javaが含まれるディレクトリ ├─ Framework # レンダリングやアニメーション機能などのソースコードが含まれるディレクトリ -└─ Samples +└─ Sample/src ├─ full # フルバージョンのサンプルアプリ ├─ main # full, minimumに共通するコード - └─ assets # モデルのファイルや画像などのリソースが含まれるディレクトリ + └─ assets # モデルのファイルや画像などのリソースが含まれるディレクトリ └─ minimum # 機能を減らしシンプルにしたサンプルアプリ ``` @@ -61,23 +61,19 @@ Android Studioでプロジェクトを開きビルドすることを推奨しま ## 変更履歴 -当リポジトリの変更履歴については [CHANGELOG.md](CHANGELOG.md) を参照ください。 +Samples : [CHANGELOG.md](CHANGELOG.md) + +Framework : [CHANGELOG.md](Framework/CHANGELOG.md) + +Core : [CHANGELOG.md](Core/CHANGELOG.md) ## 開発環境 | 開発ツール | バージョン | |----------------|------------------| -| Android Studio | Hedgehog 2023.1.1 | -| CMake | 3.1.0 | +| Android Studio | Iguana 2023.2.1 | | Gradle | 8.2 | - -### Android - -| Android SDK tools | バージョン | -| --- |--------------| -| Android NDK | 21.4.7075529 | | Android SDK | 34.0.0 | -| CMake | 3.1.0 | ## 動作確認環境 @@ -100,7 +96,7 @@ Android Studioでプロジェクトを開きビルドすることを推奨しま ### フォークとプルリクエスト -修正、改善、さらには新機能をもたらすかどうかにかかわらず、プルリクエストに感謝します。ただし、ラッパーは可能な限り軽量で浅くなるように設計されているため、バグ修正とメモリ/パフォーマンスの改善のみを行う必要があることに注意してください。メインリポジトリを可能な限りクリーンに保つために、必要に応じて個人用フォークと機能ブランチを作成してください。 +修正、改善、さらには新機能をもたらすかどうかにかかわらず、プルリクエストに感謝します。メインリポジトリを可能な限りクリーンに保つために、必要に応じて個人用フォークと機能ブランチを作成してください。 ### バグ diff --git a/README.md b/README.md index 7045fca..418b1c1 100644 --- a/README.md +++ b/README.md @@ -26,11 +26,11 @@ For compatibility with previous versions of Cubism SDK, please refer to [here](h . ├─ Core # Directory containing Live2D Cubism Core Java ├─ Framework # Directory containing source code for rendering and animation functions -└─ Samples - ├─ full # Full version of sample application - ├─ main # Common code for full and minimum - └─ assets # Directory containing resources such as model files and images - ├─ minimum # Sample application with reduced and simplified functions +└─ Sample/src + ├─ full # Full version of sample application + ├─ main # Common code for full and minimum + └─ assets # Directory containing resources such as model files and images + └─ minimum # Sample application with reduced and simplified functions ``` ## Cubism Java Framework @@ -61,23 +61,19 @@ It is recommended to open and build the project in Android Studio. Other IDEs do ## Changelog -Please refer to [CHANGELOG.md](CHANGELOG.md) for the changelog of this repository. +Samples : [CHANGELOG.md](CHANGELOG.md) + +Framework : [CHANGELOG.md](Framework/CHANGELOG.md) + +Core : [CHANGELOG.md](Core/CHANGELOG.md) ## Development environment | Development Tools | Version | |-------------------|--| -| Android Studio | Hedgehog 2023.1.1 | -| CMake | 3.1.0 | +| Android Studio | Iguana 2023.2.1 | | Gradle | 8.2 | - -### Android - -| Android SDK tools | Version | -| --- |--------------| -| Android NDK | 21.4.7075529 | | Android SDK | 34.0.0 | -| CMake | 3.1.0 | ## Operation environment @@ -101,7 +97,7 @@ There are many ways to contribute to the project: logging bugs, submitting pull ### Forking And Pull Requests -We very much appreciate your pull requests, whether they bring fixes, improvements, or even new features. Note, however, that the wrapper is designed to be as lightweight and shallow as possible and should therefore only be subject to bug fixes and memory/performance improvements. To keep the main repository as clean as possible, create a personal fork and feature branches there as needed. +We very much appreciate your pull requests, whether they bring fixes, improvements, or even new features. To keep the main repository as clean as possible, create a personal fork and feature branches there as needed. ### Bugs diff --git a/Sample/src/full/java/com/live2d/demo/full/LAppDelegate.java b/Sample/src/full/java/com/live2d/demo/full/LAppDelegate.java index a50eded..ef58672 100644 --- a/Sample/src/full/java/com/live2d/demo/full/LAppDelegate.java +++ b/Sample/src/full/java/com/live2d/demo/full/LAppDelegate.java @@ -53,7 +53,9 @@ public void onPause() { } public void onStop() { - view = null; + if (view != null) { + view.close(); + } textureManager = null; LAppLive2DManager.releaseInstance(); @@ -75,9 +77,6 @@ public void onSurfaceCreated() { // Initialize Cubism SDK framework CubismFramework.initialize(); - - // シェーダーの初期化 - view.initializeShader(); } public void onSurfaceChanged(int width, int height) { @@ -113,9 +112,7 @@ public void run() { // アプリケーションを非アクティブにする if (!isActive) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - activity.finishAndRemoveTask(); - } + activity.finishAndRemoveTask(); System.exit(0); } } @@ -150,51 +147,6 @@ public void onTouchMoved(float x, float y) { } } - // シェーダーを登録する - public int createShader() { - int vertexShaderId = glCreateShader(GLES20.GL_VERTEX_SHADER); - final String vertexShader = - "#version 100\n" - + "attribute vec3 position;" - + "attribute vec2 uv;" - + "varying vec2 vuv;" - + "void main(void){" - + "gl_Position = vec4(position, 1.0);" - + "vuv = uv;" - + "}"; - - GLES20.glShaderSource(vertexShaderId, vertexShader); - GLES20.glCompileShader(vertexShaderId); - - // フラグメントシェーダのコンパイル - int fragmentShaderId = glCreateShader(GLES20.GL_FRAGMENT_SHADER); - final String fragmentShader = - "#version 100\n" - + "precision mediump float;" - + "uniform sampler2D texture;" - + "varying vec2 vuv;" - + "uniform vec4 baseColor;" - + "void main(void){" - + "gl_FragColor = texture2D(texture, vuv) * baseColor;" - + "}"; - - GLES20.glShaderSource(fragmentShaderId, fragmentShader); - GLES20.glCompileShader(fragmentShaderId); - - // プログラムオブジェクトの作成 - int programId = GLES20.glCreateProgram(); - - // Programのシェーダーを設定 - GLES20.glAttachShader(programId, vertexShaderId); - GLES20.glAttachShader(programId, fragmentShaderId); - - GLES20.glLinkProgram(programId); - - GLES20.glUseProgram(programId); - - return programId; - } - // getter, setter群 public Activity getActivity() { return activity; diff --git a/Sample/src/full/java/com/live2d/demo/full/LAppSprite.java b/Sample/src/full/java/com/live2d/demo/full/LAppSprite.java index 3c3d1b0..5cbc307 100644 --- a/Sample/src/full/java/com/live2d/demo/full/LAppSprite.java +++ b/Sample/src/full/java/com/live2d/demo/full/LAppSprite.java @@ -41,11 +41,6 @@ public LAppSprite( spriteColor[1] = 1.0f; spriteColor[2] = 1.0f; spriteColor[3] = 1.0f; - - // this projection matrix is applied to object coordinates - // in the onDrawFrame() method - int windowWidth = LAppDelegate.getInstance().getWindowWidth(); - int windowHeight = LAppDelegate.getInstance().getWindowHeight(); } public void render() { @@ -65,10 +60,6 @@ public void render() { GLES20.glUniform1i(textureLocation, 0); - // 画面サイズを取得する - int maxWidth = LAppDelegate.getInstance().getWindowWidth(); - int maxHeight = LAppDelegate.getInstance().getWindowHeight(); - // 頂点データ positionVertex[0] = (rect.right - maxWidth * 0.5f) / (maxWidth * 0.5f); positionVertex[1] = (rect.up - maxHeight * 0.5f) / (maxHeight * 0.5f); @@ -121,10 +112,6 @@ public void renderImmediate(int textureId, final float[] uvVertex) { // uniform属性の登録 GLES20.glUniform1i(textureLocation, 0); - // 画面サイズを取得する - int maxWidth = LAppDelegate.getInstance().getWindowWidth(); - int maxHeight = LAppDelegate.getInstance().getWindowHeight(); - // 頂点データ float[] positionVertex = { (rect.right - maxWidth * 0.5f) / (maxWidth * 0.5f), (rect.up - maxHeight * 0.5f) / (maxHeight * 0.5f), @@ -176,9 +163,6 @@ public void resize(float x, float y, float width, float height) { * @return 当たっていればtrue */ public boolean isHit(float pointX, float pointY) { - // 画面高さを取得する - int maxHeight = LAppDelegate.getInstance().getWindowHeight(); - // y座標は変換する必要あり float y = maxHeight - pointY; @@ -192,6 +176,17 @@ public void setColor(float r, float g, float b, float a) { spriteColor[3] = a; } + /** + * ウィンドウサイズを設定する。 + * + * @param width 横幅 + * @param height 高さ + */ + public void setWindowSize(int width, int height) { + maxWidth = width; + maxHeight = height; + } + /** * Rectクラス */ @@ -224,10 +219,6 @@ private static class Rect { private final int colorLocation; // カラーアトリビュート private final float[] spriteColor = new float[4]; // 表示カラー - // vpMatrix is an abbreviation for "Model View Projection Matrix" - private final float[] mVPMatrix = new float[16]; - private final float[] projectionMatrix = new float[16]; - private final float[] viewMatrix = new float[16]; - - private int vPMatrixHandle; + private int maxWidth; // ウィンドウ幅 + private int maxHeight; // ウィンドウ高さ } diff --git a/Sample/src/full/java/com/live2d/demo/full/LAppSpriteShader.java b/Sample/src/full/java/com/live2d/demo/full/LAppSpriteShader.java new file mode 100644 index 0000000..1208bed --- /dev/null +++ b/Sample/src/full/java/com/live2d/demo/full/LAppSpriteShader.java @@ -0,0 +1,123 @@ +package com.live2d.demo.full; + +import android.opengl.GLES20; + +import com.live2d.demo.LAppDefine; +import com.live2d.sdk.cubism.framework.utils.CubismDebug; + +/** + * スプライト用のシェーダー設定を保持するクラス + */ +public class LAppSpriteShader implements AutoCloseable { + /** + * コンストラクタ + */ + public LAppSpriteShader() { + programId = createShader(); + } + + @Override + public void close() { + GLES20.glDeleteShader(programId); + } + + /** + * シェーダーIDを取得する。 + * + * @return シェーダーID + */ + public int getShaderId() { + return programId; + } + + /** + * シェーダーを作成する。 + * + * @return シェーダーID。正常に作成できなかった場合は0を返す。 + */ + private int createShader() { + // シェーダーのパスの作成 + String vertShaderFile = LAppDefine.ResourcePath.SHADER_ROOT.getPath(); + vertShaderFile += ("/" + LAppDefine.ResourcePath.VERT_SHADER.getPath()); + + String fragShaderFile = LAppDefine.ResourcePath.SHADER_ROOT.getPath(); + fragShaderFile += ("/" + LAppDefine.ResourcePath.FRAG_SHADER.getPath()); + + // シェーダーのコンパイル + int vertexShaderId = compileShader(vertShaderFile, GLES20.GL_VERTEX_SHADER); + int fragmentShaderId = compileShader(fragShaderFile, GLES20.GL_FRAGMENT_SHADER); + + if (vertexShaderId == 0 || fragmentShaderId == 0) { + return 0; + } + + // プログラムオブジェクトの作成 + int programId = GLES20.glCreateProgram(); + + // Programのシェーダーを設定 + GLES20.glAttachShader(programId, vertexShaderId); + GLES20.glAttachShader(programId, fragmentShaderId); + + GLES20.glLinkProgram(programId); + GLES20.glUseProgram(programId); + + // 不要になったシェーダーオブジェクトの削除 + GLES20.glDeleteShader(vertexShaderId); + GLES20.glDeleteShader(fragmentShaderId); + + return programId; + } + + /** + * CreateShader内部関数。エラーチェックを行う。 + * + * @param shaderId シェーダーID + * @return エラーチェック結果。trueの場合、エラーなし。 + */ + private boolean checkShader(int shaderId) { + int[] logLength = new int[1]; + GLES20.glGetShaderiv(shaderId, GLES20.GL_INFO_LOG_LENGTH, logLength, 0); + + if (logLength[0] > 0) { + String log = GLES20.glGetShaderInfoLog(shaderId); + CubismDebug.cubismLogError("Shader compile log: %s", log); + } + + int[] status = new int[1]; + GLES20.glGetShaderiv(shaderId, GLES20.GL_COMPILE_STATUS, status, 0); + + if (status[0] == GLES20.GL_FALSE) { + GLES20.glDeleteShader(shaderId); + return false; + } + + return true; + } + + + /** + * シェーダーをコンパイルする。 + * コンパイルに成功したら0を返す。 + * + * @param fileName シェーダーファイル名 + * @param shaderType 作成するシェーダーの種類 + * @return シェーダーID。正常に作成できなかった場合は0を返す。 + */ + private int compileShader(String fileName, int shaderType) { + // ファイル読み込み + byte[] shaderBuffer = LAppPal.loadFileAsBytes(fileName); + + // コンパイル + int shaderId = GLES20.glCreateShader(shaderType); + GLES20.glShaderSource(shaderId, new String(shaderBuffer)); + GLES20.glCompileShader(shaderId); + + if (!checkShader(shaderId)) { + return 0; + } + + return shaderId; + } + + private final int programId; // シェーダーID +} diff --git a/Sample/src/full/java/com/live2d/demo/full/LAppView.java b/Sample/src/full/java/com/live2d/demo/full/LAppView.java index e26b349..70ce3f0 100644 --- a/Sample/src/full/java/com/live2d/demo/full/LAppView.java +++ b/Sample/src/full/java/com/live2d/demo/full/LAppView.java @@ -14,7 +14,7 @@ import static com.live2d.demo.LAppDefine.*; -public class LAppView { +public class LAppView implements AutoCloseable { /** * LAppModelのレンダリング先 */ @@ -31,9 +31,9 @@ public LAppView() { clearColor[3] = 0.0f; } - // シェーダーを初期化する - public void initializeShader() { - programId = LAppDelegate.getInstance().createShader(); + @Override + public void close() { + spriteShader.close(); } // ビューを初期化する @@ -74,6 +74,8 @@ public void initialize() { MaxLogicalView.BOTTOM.getValue(), MaxLogicalView.TOP.getValue() ); + + spriteShader = new LAppSpriteShader(); } // 画像を初期化する @@ -93,6 +95,8 @@ public void initializeSprite() { float fWidth = backgroundTexture.width * 2.0f; float fHeight = windowHeight * 0.95f; + int programId = spriteShader.getShaderId(); + if (backSprite == null) { backSprite = new LAppSprite(x, y, fWidth, fHeight, backgroundTexture.id, programId); } else { @@ -142,6 +146,14 @@ public void initializeSprite() { // 描画する public void render() { + // 画面サイズを取得する。 + int maxWidth = LAppDelegate.getInstance().getWindowWidth(); + int maxHeight = LAppDelegate.getInstance().getWindowHeight(); + + backSprite.setWindowSize(maxWidth, maxHeight); + gearSprite.setWindowSize(maxWidth, maxHeight); + powerSprite.setWindowSize(maxWidth, maxHeight); + // UIと背景の描画 backSprite.render(); gearSprite.render(); @@ -172,6 +184,7 @@ public void render() { renderingSprite.setColor(1.0f, 1.0f, 1.0f, alpha); if (model != null) { + renderingSprite.setWindowSize(maxWidth, maxHeight); renderingSprite.renderImmediate(model.getRenderingBuffer().getColorBuffer()[0], uvVertex); } } @@ -236,6 +249,12 @@ public void postModelDraw(LAppModel refModel) { 1.0f, 0.0f }; renderingSprite.setColor(1.0f, 1.0f, 1.0f, getSpriteAlpha(0)); + + // 画面サイズを取得する。 + int maxWidth = LAppDelegate.getInstance().getWindowWidth(); + int maxHeight = LAppDelegate.getInstance().getWindowHeight(); + + renderingSprite.setWindowSize(maxWidth, maxHeight); renderingSprite.renderImmediate(useTarget.getColorBuffer()[0], uvVertex); } } @@ -401,7 +420,6 @@ public RenderingTarget getRenderingTarget() { private final CubismMatrix44 deviceToScreen = CubismMatrix44.create(); // デバイス座標からスクリーン座標に変換するための行列 private final CubismViewMatrix viewMatrix = new CubismViewMatrix(); // 画面表示の拡縮や移動の変換を行う行列 - private int programId; private int windowWidth; private int windowHeight; @@ -427,4 +445,9 @@ public RenderingTarget getRenderingTarget() { private boolean isChangedModel; private final TouchManager touchManager = new TouchManager(); + + /** + * シェーダー作成委譲クラス + */ + private LAppSpriteShader spriteShader; } diff --git a/Sample/src/full/java/com/live2d/demo/full/MainActivity.java b/Sample/src/full/java/com/live2d/demo/full/MainActivity.java index 0e429f2..33c3d3f 100644 --- a/Sample/src/full/java/com/live2d/demo/full/MainActivity.java +++ b/Sample/src/full/java/com/live2d/demo/full/MainActivity.java @@ -38,9 +38,7 @@ protected void onCreate(Bundle savedInstanceState) { | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN - | (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT - ? View.SYSTEM_UI_FLAG_LOW_PROFILE - : View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) + | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY ); } else { getWindow().getInsetsController().hide(WindowInsets.Type.navigationBars() | WindowInsets.Type.statusBars()); diff --git a/Sample/src/main/AndroidManifest.xml b/Sample/src/main/AndroidManifest.xml index 944f4f0..b81da27 100644 --- a/Sample/src/main/AndroidManifest.xml +++ b/Sample/src/main/AndroidManifest.xml @@ -12,17 +12,6 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@android:style/Theme.NoTitleBar"> - - - - - - - diff --git a/Sample/src/main/assets/Shaders/FragSprite.frag b/Sample/src/main/assets/Shaders/FragSprite.frag new file mode 100644 index 0000000..0df817d --- /dev/null +++ b/Sample/src/main/assets/Shaders/FragSprite.frag @@ -0,0 +1,12 @@ +#version 100 + +precision mediump float; + +varying vec2 vuv; +uniform sampler2D texture; +uniform vec4 baseColor; + +void main(void) +{ + gl_FragColor = texture2D(texture, vuv) * baseColor; +} diff --git a/Sample/src/main/assets/Shaders/VertSprite.vert b/Sample/src/main/assets/Shaders/VertSprite.vert new file mode 100644 index 0000000..eb37c93 --- /dev/null +++ b/Sample/src/main/assets/Shaders/VertSprite.vert @@ -0,0 +1,11 @@ +#version 100 + +attribute vec3 position; +attribute vec2 uv; +varying vec2 vuv; + +void main(void) +{ + gl_Position = vec4(position, 1.0); + vuv = uv; +} diff --git a/Sample/src/main/java/com/live2d/demo/LAppDefine.java b/Sample/src/main/java/com/live2d/demo/LAppDefine.java index 189555c..73d8669 100644 --- a/Sample/src/main/java/com/live2d/demo/LAppDefine.java +++ b/Sample/src/main/java/com/live2d/demo/LAppDefine.java @@ -113,6 +113,10 @@ public enum ResourcePath { * Relative path of the material directory */ ROOT(""), + /** + * Relative path of shader directory + */ + SHADER_ROOT("Shaders"), /** * Background image file */ @@ -124,7 +128,15 @@ public enum ResourcePath { /** * Power button image file */ - POWER_IMAGE("close.png"); + POWER_IMAGE("close.png"), + /** + * Vertex shader file + */ + VERT_SHADER("VertSprite.vert"), + /** + * Fragment shader file + */ + FRAG_SHADER("FragSprite.frag"); private final String path; diff --git a/Sample/src/minimum/java/com.live2d.demo.minimum/LAppMinimumDelegate.java b/Sample/src/minimum/java/com.live2d.demo.minimum/LAppMinimumDelegate.java index 39fea06..78eef39 100644 --- a/Sample/src/minimum/java/com.live2d.demo.minimum/LAppMinimumDelegate.java +++ b/Sample/src/minimum/java/com.live2d.demo.minimum/LAppMinimumDelegate.java @@ -41,7 +41,9 @@ public void onStart(Activity activity) { } public void onStop() { - view = null; + if (view != null) { + view.close(); + } textureManager = null; LAppMinimumLive2DManager.releaseInstance(); @@ -63,9 +65,6 @@ public void onSurfaceCreated() { // Initialize Cubism SDK framework CubismFramework.initialize(); - - // シェーダーの初期化 - view.initializeShader(); } public void onSurfaceChanged(int width, int height) { @@ -96,9 +95,7 @@ public void run() { // アプリケーションを非アクティブにする if (!isActive) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - activity.finishAndRemoveTask(); - } + activity.finishAndRemoveTask(); System.exit(0); } } @@ -132,49 +129,6 @@ public void onTouchMoved(float x, float y) { } } - // シェーダーを登録する - public int createShader() { - int vertexShaderId = glCreateShader(GLES20.GL_VERTEX_SHADER); - final String vertexShader = - "attribute vec3 position;" + - "attribute vec2 uv;" + - "varying vec2 vuv;" + - "void main(void){" + - "gl_Position = vec4(position, 1.0);" + - "vuv = uv;" + - "}"; - - GLES20.glShaderSource(vertexShaderId, vertexShader); - GLES20.glCompileShader(vertexShaderId); - - // フラグメントシェーダのコンパイル - int fragmentShaderId = glCreateShader(GLES20.GL_FRAGMENT_SHADER); - final String fragmentShader = - "precision mediump float;" + - "uniform sampler2D texture;" + - "varying vec2 vuv;" + - "uniform vec4 baseColor;" + - "void main(void){" + - "gl_FragColor = texture2D(texture, vuv);" + - "}"; - - GLES20.glShaderSource(fragmentShaderId, fragmentShader); - GLES20.glCompileShader(fragmentShaderId); - - // プログラムオブジェクトの作成 - int programId = GLES20.glCreateProgram(); - - // Programのシェーダーを設定 - GLES20.glAttachShader(programId, vertexShaderId); - GLES20.glAttachShader(programId, fragmentShaderId); - - GLES20.glLinkProgram(programId); - - GLES20.glUseProgram(programId); - - return programId; - } - // getter, setter群 public LAppMinimumTextureManager getTextureManager() { return textureManager; diff --git a/Sample/src/minimum/java/com.live2d.demo.minimum/LAppMinimumSprite.java b/Sample/src/minimum/java/com.live2d.demo.minimum/LAppMinimumSprite.java index 8647ce1..a80ae29 100644 --- a/Sample/src/minimum/java/com.live2d.demo.minimum/LAppMinimumSprite.java +++ b/Sample/src/minimum/java/com.live2d.demo.minimum/LAppMinimumSprite.java @@ -40,12 +40,6 @@ public LAppMinimumSprite( spriteColor[1] = 1.0f; spriteColor[2] = 1.0f; spriteColor[3] = 1.0f; - - // this projection matrix is applied to object coordinates - // in the onDrawFrame() method - int windowWidth = LAppMinimumDelegate.getInstance().getWindowWidth(); - int windowHeight = LAppMinimumDelegate.getInstance().getWindowHeight(); - float ratio = (float) windowWidth / (float) windowHeight; } /** @@ -62,10 +56,6 @@ public void renderImmediate(int textureId, final float[] uvVertex) { // uniform属性の登録 GLES20.glUniform1i(textureLocation, 0); - // 画面サイズを取得する - int maxWidth = LAppMinimumDelegate.getInstance().getWindowWidth(); - int maxHeight = LAppMinimumDelegate.getInstance().getWindowHeight(); - // 頂点データ float[] positionVertex = { (rect.right - maxWidth * 0.5f) / (maxWidth * 0.5f), (rect.up - maxHeight * 0.5f) / (maxHeight * 0.5f), @@ -100,6 +90,17 @@ public void setColor(float r, float g, float b, float a) { spriteColor[3] = a; } + /** + * ウィンドウサイズを設定する。 + * + * @param width 横幅 + * @param height 高さ + */ + public void setWindowSize(int width, int height) { + maxWidth = width; + maxHeight = height; + } + /** * Rectクラス */ @@ -122,4 +123,7 @@ private static final class Rect { private final int textureLocation; // テクスチャアトリビュート private final int colorLocation; // カラーアトリビュート private final float[] spriteColor = new float[4]; // 表示カラー + + private int maxWidth; // ウィンドウ幅 + private int maxHeight; // ウィンドウ高さ } diff --git a/Sample/src/minimum/java/com.live2d.demo.minimum/LAppMinimumSpriteShader.java b/Sample/src/minimum/java/com.live2d.demo.minimum/LAppMinimumSpriteShader.java new file mode 100644 index 0000000..6f27476 --- /dev/null +++ b/Sample/src/minimum/java/com.live2d.demo.minimum/LAppMinimumSpriteShader.java @@ -0,0 +1,88 @@ +package com.live2d.demo.minimum; + +import android.opengl.GLES20; + +import com.live2d.demo.LAppDefine; +import com.live2d.sdk.cubism.framework.utils.CubismDebug; + +/** + * スプライト用のシェーダー設定を保持するクラス + */ +public class LAppMinimumSpriteShader implements AutoCloseable { + /** + * コンストラクタ + */ + public LAppMinimumSpriteShader() { + programId = createShader(); + } + + @Override + public void close() { + GLES20.glDeleteShader(programId); + } + + /** + * シェーダーIDを取得する。 + * + * @return シェーダーID + */ + public int getShaderId() { + return programId; + } + + /** + * シェーダーを作成する。 + * + * @return シェーダーID。正常に作成できなかった場合は0を返す。 + */ + private int createShader() { + // シェーダーのパスの作成 + String vertShaderFile = LAppDefine.ResourcePath.SHADER_ROOT.getPath(); + vertShaderFile += ("/" + LAppDefine.ResourcePath.VERT_SHADER.getPath()); + + String fragShaderFile = LAppDefine.ResourcePath.SHADER_ROOT.getPath(); + fragShaderFile += ("/" + LAppDefine.ResourcePath.FRAG_SHADER.getPath()); + + // シェーダーのコンパイル + int vertexShaderId = compileShader(vertShaderFile, GLES20.GL_VERTEX_SHADER); + int fragmentShaderId = compileShader(fragShaderFile, GLES20.GL_FRAGMENT_SHADER); + + // プログラムオブジェクトの作成 + int programId = GLES20.glCreateProgram(); + + // Programのシェーダーを設定 + GLES20.glAttachShader(programId, vertexShaderId); + GLES20.glAttachShader(programId, fragmentShaderId); + + GLES20.glLinkProgram(programId); + GLES20.glUseProgram(programId); + + // 不要になったシェーダーオブジェクトの削除 + GLES20.glDeleteShader(vertexShaderId); + GLES20.glDeleteShader(fragmentShaderId); + + return programId; + } + + /** + * シェーダーをコンパイルする。 + * コンパイルに成功したら0を返す。 + * + * @param fileName シェーダーファイル名 + * @param shaderType 作成するシェーダーの種類 + * @return シェーダーID。正常に作成できなかった場合は0を返す。 + */ + private int compileShader(String fileName, int shaderType) { + // ファイル読み込み + byte[] shaderBuffer = LAppMinimumPal.loadFileAsBytes(fileName); + + // コンパイル + int shaderId = GLES20.glCreateShader(shaderType); + GLES20.glShaderSource(shaderId, new String(shaderBuffer)); + GLES20.glCompileShader(shaderId); + + return shaderId; + } + + private final int programId; // シェーダーID +} diff --git a/Sample/src/minimum/java/com.live2d.demo.minimum/LAppMinimumView.java b/Sample/src/minimum/java/com.live2d.demo.minimum/LAppMinimumView.java index 877057a..996d7b3 100644 --- a/Sample/src/minimum/java/com.live2d.demo.minimum/LAppMinimumView.java +++ b/Sample/src/minimum/java/com.live2d.demo.minimum/LAppMinimumView.java @@ -13,7 +13,7 @@ import com.live2d.sdk.cubism.framework.math.CubismViewMatrix; import com.live2d.sdk.cubism.framework.rendering.android.CubismOffscreenSurfaceAndroid; -public class LAppMinimumView { +public class LAppMinimumView implements AutoCloseable { public LAppMinimumView() { clearColor[0] = 1.0f; clearColor[1] = 1.0f; @@ -21,9 +21,9 @@ public LAppMinimumView() { clearColor[3] = 0.0f; } - // シェーダーを初期化する - public void initializeShader() { - programId = LAppMinimumDelegate.getInstance().createShader(); + @Override + public void close() { + spriteShader.close(); } // ビューを初期化する @@ -64,6 +64,8 @@ public void initialize() { LAppDefine.LogicalView.BOTTOM.getValue(), LAppDefine.MaxLogicalView.TOP.getValue() ); + + spriteShader = new LAppMinimumSpriteShader(); } // 画像を初期化する @@ -76,7 +78,7 @@ public void initializeSprite() { float y = windowHeight * 0.5f; if (renderingSprite == null) { - renderingSprite = new LAppMinimumSprite(x, y, windowWidth, windowHeight, 0, programId); + renderingSprite = new LAppMinimumSprite(x, y, windowWidth, windowHeight, 0, spriteShader.getShaderId()); } else { renderingSprite.resize(x, y, windowWidth, windowHeight); } @@ -159,7 +161,6 @@ public float transformViewY(float deviceY) { private final CubismMatrix44 deviceToScreen = CubismMatrix44.create(); // デバイス座標からスクリーン座標に変換するための行列 private final CubismViewMatrix viewMatrix = new CubismViewMatrix(); // 画面表示の拡縮や移動の変換を行う行列 - private int programId; /** * レンダリングターゲットのクリアカラー @@ -171,4 +172,9 @@ public float transformViewY(float deviceY) { private LAppMinimumSprite renderingSprite; private final TouchManager touchManager = new TouchManager(); + + /** + * シェーダー作成委譲クラス + */ + private LAppMinimumSpriteShader spriteShader; }