├── .gitignore ├── .gitmodules ├── Application.mk ├── README.md ├── CMakeLists.txt ├── LICENSE ├── .github └── workflows │ └── build.yml ├── Android.mk ├── KAIMyEntitySaba.h ├── com_kAIS_KAIMyEntity_NativeFunc.h ├── com_kAIS_KAIMyEntity_NativeFunc.cpp └── KAIMyEntitySaba.cpp /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | build 3 | obj 4 | libs -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "saba"] 2 | path = saba 3 | url = https://github.com/benikabocha/saba 4 | [submodule "bullet3"] 5 | path = bullet3 6 | url = https://github.com/bulletphysics/bullet3 7 | -------------------------------------------------------------------------------- /Application.mk: -------------------------------------------------------------------------------- 1 | APP_MODULES := libKAIMYEntitySaba 2 | APP_ABI := arm64-v8a 3 | APP_OPTIM := release 4 | APP_BUILD_SCRIPT := Android.mk 5 | APP_STL := c++_static 6 | APP_PLATFORM := android-26 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # KAIMyEntitySaba 2 | A native library use saba to load MMD Model for minecraft 3 | Can someone help us become "yet another VRChat"? 4 | ## How to build 5 | 6 | Please install CMake before the build. 7 | 8 | ### Required libraries 9 | 10 | Please prepare the following libraries. 11 | 12 | * OpenGL 13 | * [Bullet Physics](http://bulletphysics.org/wordpress/) 14 | * [GLFW](http://www.glfw.org/) 15 | * [JDK](https://adoptopenjdk.net/) -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.2) 2 | project(KAIMyEntitySaba VERSION 2.0) 3 | set(CMAKE_POSITION_INDEPENDENT_CODE ON) 4 | find_package(Bullet REQUIRED) 5 | find_package(JNI REQUIRED) 6 | include_directories(${JAVA_INCLUDE_PATH}) 7 | include_directories(${JAVA_INCLUDE_PATH2}) 8 | include_directories(${BULLET_INCLUDE_DIRS}) 9 | include_directories(${PROJECT_SOURCE_DIR}/saba/external/tinyobjloader/include) 10 | include_directories(${PROJECT_SOURCE_DIR}/saba/external/tinyxfileloader/include) 11 | include_directories(${PROJECT_SOURCE_DIR}/saba/src) 12 | include_directories(${PROJECT_SOURCE_DIR}/saba/external/spdlog/include) 13 | include_directories(${PROJECT_SOURCE_DIR}/saba/external/glm/include) 14 | include_directories(${PROJECT_SOURCE_DIR}/saba/external/stb/include) 15 | add_subdirectory(saba/src) 16 | add_library(KAIMyEntitySaba SHARED com_kAIS_KAIMyEntity_NativeFunc.cpp KAIMyEntitySaba.cpp) 17 | target_link_libraries(KAIMyEntitySaba PRIVATE ${BULLET_LIBRARIES} Saba) -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 kjkjkAIStudio 4 | Copyright (c) 2021 tarsin 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: KAIMyEntitySaba-build-actions 2 | on: [push] 3 | jobs: 4 | build-gcc: 5 | runs-on: ubuntu-latest 6 | steps: 7 | - uses: actions/checkout@v2 8 | - name: Install dependencies 9 | run: | 10 | sudo apt update 11 | sudo apt install -y cmake libbullet-dev libglu1-mesa-dev libx11-dev libxxf86vm-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libglfw3-dev openjdk-8-jdk 12 | - name: build 13 | run: | 14 | git submodule update --init --recursive 15 | mkdir build 16 | cd build 17 | cmake .. 18 | make -j2 19 | build-clang: 20 | runs-on: ubuntu-latest 21 | steps: 22 | - uses: actions/checkout@v2 23 | - name: Install dependencies 24 | run: | 25 | sudo apt update 26 | sudo apt install -y cmake libbullet-dev libglu1-mesa-dev libx11-dev libxxf86vm-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libglfw3-dev openjdk-8-jdk 27 | - name: build 28 | env: 29 | C_COMPILER: clang 30 | CXX_COMPILER: clang++ 31 | run: | 32 | git submodule update --init --recursive 33 | mkdir build 34 | cd build 35 | cmake .. 36 | make -j2 37 | build-ndk: 38 | runs-on: ubuntu-latest 39 | steps: 40 | - uses: actions/checkout@v2 41 | - name: Setup Android SDK Tools 42 | uses: android-actions/setup-android@v2 43 | - name: Install NDK 44 | run: | 45 | echo "y" | sudo ${ANDROID_HOME}/tools/bin/sdkmanager --install "ndk;24.0.8215888" --sdk_root=${ANDROID_SDK_ROOT} &> /dev/null 46 | - name: build 47 | run: | 48 | git submodule update --init --recursive 49 | ${ANDROID_HOME}/ndk/24.0.8215888/ndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=./Application.mk -j8 50 | -------------------------------------------------------------------------------- /Android.mk: -------------------------------------------------------------------------------- 1 | LOCAL_PATH := $(call my-dir) 2 | 3 | include $(CLEAR_VARS) 4 | 5 | LOCAL_MODULE := libKAIMYEntitySaba 6 | 7 | LOCAL_CPP_FEATURES += exceptions 8 | 9 | FILE_LIST := $(wildcard \ 10 | $(LOCAL_PATH)/bullet3/src \ 11 | $(LOCAL_PATH)/saba/src \ 12 | $(LOCAL_PATH)/saba/external/glm/include \ 13 | $(LOCAL_PATH)/saba/external/stb/include \ 14 | $(LOCAL_PATH)/saba/external/spdlog/include \ 15 | $(LOCAL_PATH)/saba/external/tinyxfileloader/include \ 16 | $(LOCAL_PATH)/saba/external/tinyobjloader/include \ 17 | ) 18 | 19 | LOCAL_C_INCLUDES := $(FILE_LIST) 20 | 21 | FILE_LIST := $(wildcard \ 22 | $(LOCAL_PATH)/*.cpp \ 23 | $(LOCAL_PATH)/saba/src/Saba/Base/*.cpp \ 24 | $(LOCAL_PATH)/saba/src/Saba/Model/MMD/*.cpp \ 25 | $(LOCAL_PATH)/saba/src/Saba/Model/OBJ/*.cpp \ 26 | $(LOCAL_PATH)/saba/src/Saba/Model/XFile/*.cpp \ 27 | ) 28 | 29 | LOCAL_SRC_FILES := $(FILE_LIST) 30 | 31 | # Bullet3 Sources 32 | LOCAL_BULLET3_PATH := $(LOCAL_PATH)/bullet3 33 | 34 | FILE_LIST := $(wildcard \ 35 | $(LOCAL_BULLET3_PATH)/src/LinearMath/*.cpp \ 36 | $(LOCAL_BULLET3_PATH)/src/Bullet3Common/*.cpp \ 37 | $(LOCAL_BULLET3_PATH)/src/BulletCollision/BroadphaseCollision/*.cpp \ 38 | $(LOCAL_BULLET3_PATH)/src/BulletCollision/CollisionDispatch/*.cpp \ 39 | $(LOCAL_BULLET3_PATH)/src/BulletCollision/CollisionShapes/*.cpp \ 40 | $(LOCAL_BULLET3_PATH)/src/BulletCollision/NarrowPhaseCollision/*.cpp \ 41 | $(LOCAL_BULLET3_PATH)/src/BulletDynamics/ConstraintSolver/*.cpp \ 42 | $(LOCAL_BULLET3_PATH)/src/BulletDynamics/Dynamics/*.cpp \ 43 | $(LOCAL_BULLET3_PATH)/src/BulletDynamics/Featherstone/*.cpp \ 44 | $(LOCAL_BULLET3_PATH)/src/BulletDynamics/MLCPSolvers/*.cpp \ 45 | $(LOCAL_BULLET3_PATH)/src/BulletDynamics/Vehicle/*.cpp \ 46 | $(LOCAL_BULLET3_PATH)/src/BulletDynamics/Character/*.cpp \ 47 | $(LOCAL_BULLET3_PATH)/src/BulletSoftBody/*.cpp \ 48 | $(LOCAL_BULLET3_PATH)/src/BulletSoftBody/BulletReducedDeformableBody/*.cpp \ 49 | $(LOCAL_BULLET3_PATH)/src/BulletInverseDynamics/*.cpp \ 50 | $(LOCAL_BULLET3_PATH)/src/BulletInverseDynamics/details/*.cpp \ 51 | ) 52 | 53 | LOCAL_SRC_FILES += $(FILE_LIST) 54 | 55 | include $(BUILD_SHARED_LIBRARY) 56 | -------------------------------------------------------------------------------- /KAIMyEntitySaba.h: -------------------------------------------------------------------------------- 1 | #ifndef _KAIMYENTITY_H_ 2 | #define _KAIMYENTITY_H_ 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | namespace KAIMyEntitySaba 10 | { 11 | struct Texture 12 | { 13 | uint8_t *data; 14 | int x, y; 15 | bool hasAlpha; 16 | }; 17 | 18 | struct Model 19 | { 20 | std::shared_ptr mmdModel; 21 | size_t vmdAnimCount; 22 | saba::VMDAnimation **vmdAnims; 23 | double *animTimes; 24 | double prevSabaTime; 25 | }; 26 | 27 | Model *LoadModelPMX(const char *filename, const char *dir, size_t layerCount); 28 | Model *LoadModelPMD(const char *filename, const char *dir, size_t layerCount); 29 | void DeleteModel(Model *model); 30 | void UpdateModel(Model *model); 31 | 32 | size_t GetVertexCount(Model *model); 33 | const void *GetPoss(Model *model); //float * 3 34 | const void *GetNormals(Model *model); //float * 3 35 | const void *GetUVs(Model *model); //float * 2 36 | size_t GetIndexElementSize(Model *model); 37 | size_t GetIndexCount(Model *model); 38 | const void *GetIndices(Model *model); 39 | size_t GetMaterialCount(Model *model); 40 | const char *GetMaterialTex(Model *model, size_t pos); 41 | const char *GetMaterialSpTex(Model *model, size_t pos); 42 | const char *GetMaterialToonTex(Model *model, size_t pos); 43 | const void *GetMaterialAmbient(Model *model, size_t pos); //float * 3 44 | const void *GetMaterialDiffuse(Model *model, size_t pos); //float * 3 45 | const void *GetMaterialSpecular(Model *model, size_t pos); //float * 3 46 | float GetMaterialSpecularPower(Model *model, size_t pos); 47 | float GetMaterialAlpha(Model *model, size_t pos); 48 | const void *GetMaterialTextureMulFactor(Model *model, size_t pos); //float * 4 49 | const void *GetMaterialTextureAddFactor(Model *model, size_t pos); //float * 4 50 | int GetMaterialSpTextureMode(Model *model, size_t pos); 51 | const void *GetMaterialSpTextureMulFactor(Model *model, size_t pos); //float * 4 52 | const void *GetMaterialSpTextureAddFactor(Model *model, size_t pos); //float * 4 53 | const void *GetMaterialToonTextureMulFactor(Model *model, size_t pos); //float * 4 54 | const void *GetMaterialToonTextureAddFactor(Model *model, size_t pos); //float * 4 55 | bool GetMaterialBothFace(Model *model, size_t pos); 56 | size_t GetSubMeshCount(Model *model); 57 | int GetSubMeshMaterialID(Model *model, size_t pos); 58 | int GetSubMeshBeginIndex(Model *model, size_t pos); 59 | int GetSubMeshVertexCount(Model *model, size_t pos); 60 | void ChangeModelAnim(Model *model, saba::VMDAnimation *anim, size_t layer); 61 | void ResetModelPhysics(Model *model); 62 | 63 | glm::mat4 *CreateMat(); 64 | void DeleteMat(glm::mat4 *mat); 65 | void GetRightHandMat(Model *model, glm::mat4 *mat); 66 | void GetLeftHandMat(Model *model, glm::mat4 *mat); 67 | 68 | Texture *LoadTexture(const char *filename); 69 | void DeleteTexture(Texture *tex); 70 | int GetTextureX(Texture *tex); 71 | int GetTextureY(Texture *tex); 72 | const void *GetTextureData(Texture *tex); 73 | bool TextureHasAlpha(Texture *tex); 74 | 75 | saba::VMDAnimation *LoadAnimation(Model *model, const char *filename); 76 | void DeleteAnimation(saba::VMDAnimation *anim); 77 | } 78 | 79 | #endif -------------------------------------------------------------------------------- /com_kAIS_KAIMyEntity_NativeFunc.h: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #ifndef _Included_com_kAIS_KAIMyEntity_NativeFunc 4 | #define _Included_com_kAIS_KAIMyEntity_NativeFunc 5 | #ifdef __cplusplus 6 | extern "C" { 7 | #endif 8 | 9 | JNIEXPORT jstring JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetVersion(JNIEnv* env, jobject obj); 10 | JNIEXPORT jbyte JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_ReadByte(JNIEnv* env, jobject obj, jlong data, jlong pos); 11 | JNIEXPORT void JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_CopyDataToByteBuffer(JNIEnv* env, jobject obj, jobject buffer, jlong data, jlong len); 12 | 13 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_LoadModelPMX(JNIEnv* env, jobject obj, jstring filename, jstring dir, jlong layerCount); 14 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_LoadModelPMD(JNIEnv* env, jobject obj, jstring filename, jstring dir, jlong layerCount); 15 | JNIEXPORT void JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_DeleteModel(JNIEnv* env, jobject obj, jlong model); 16 | JNIEXPORT void JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_UpdateModel(JNIEnv* env, jobject obj, jlong model); 17 | 18 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetVertexCount(JNIEnv* env, jobject obj, jlong model); 19 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetPoss(JNIEnv* env, jobject obj, jlong model); 20 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetNormals(JNIEnv* env, jobject obj, jlong model); 21 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetUVs(JNIEnv* env, jobject obj, jlong model); 22 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetIndexElementSize(JNIEnv* env, jobject obj, jlong model); 23 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetIndexCount(JNIEnv* env, jobject obj, jlong model); 24 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetIndices(JNIEnv* env, jobject obj, jlong model); 25 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialCount(JNIEnv* env, jobject obj, jlong model); 26 | JNIEXPORT jstring JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialTex(JNIEnv* env, jobject obj, jlong model, jlong pos); 27 | JNIEXPORT jstring JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialSpTex(JNIEnv* env, jobject obj, jlong model, jlong pos); 28 | JNIEXPORT jstring JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialToonTex(JNIEnv* env, jobject obj, jlong model, jlong pos); 29 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialAmbient(JNIEnv* env, jobject obj, jlong model, jlong pos); 30 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialDiffuse(JNIEnv* env, jobject obj, jlong model, jlong pos); 31 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialSpecular(JNIEnv* env, jobject obj, jlong model, jlong pos); 32 | JNIEXPORT jfloat JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialSpecularPower(JNIEnv* env, jobject obj, jlong model, jlong pos); 33 | JNIEXPORT jfloat JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialAlpha(JNIEnv* env, jobject obj, jlong model, jlong pos); 34 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialTextureMulFactor(JNIEnv* env, jobject obj, jlong model, jlong pos); 35 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialTextureAddFactor(JNIEnv* env, jobject obj, jlong model, jlong pos); 36 | JNIEXPORT jint JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialSpTextureMode(JNIEnv* env, jobject obj, jlong model, jlong pos); 37 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialSpTextureMulFactor(JNIEnv* env, jobject obj, jlong model, jlong pos); 38 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialSpTextureAddFactor(JNIEnv* env, jobject obj, jlong model, jlong pos); 39 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialToonTextureMulFactor(JNIEnv* env, jobject obj, jlong model, jlong pos); 40 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialToonTextureAddFactor(JNIEnv* env, jobject obj, jlong model, jlong pos); 41 | JNIEXPORT jboolean JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialBothFace(JNIEnv* env, jobject obj, jlong model, jlong pos); 42 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetSubMeshCount(JNIEnv* env, jobject obj, jlong model); 43 | JNIEXPORT jint JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetSubMeshMaterialID(JNIEnv* env, jobject obj, jlong model, jlong pos); 44 | JNIEXPORT jint JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetSubMeshBeginIndex(JNIEnv* env, jobject obj, jlong model, jlong pos); 45 | JNIEXPORT jint JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetSubMeshVertexCount(JNIEnv* env, jobject obj, jlong model, jlong pos); 46 | JNIEXPORT void JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_ChangeModelAnim(JNIEnv* env, jobject obj, jlong model, jlong anim, jlong layer); 47 | JNIEXPORT void JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_ResetModelPhysics(JNIEnv* env, jobject obj, jlong model); 48 | 49 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_CreateMat(JNIEnv* env, jobject obj); 50 | JNIEXPORT void JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_DeleteMat(JNIEnv* env, jobject obj, jlong mat); 51 | JNIEXPORT void JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetRightHandMat(JNIEnv* env, jobject obj, jlong model, jlong mat); 52 | JNIEXPORT void JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetLeftHandMat(JNIEnv* env, jobject obj, jlong model, jlong mat); 53 | 54 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_LoadTexture(JNIEnv* env, jobject obj, jstring filename); 55 | JNIEXPORT void JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_DeleteTexture(JNIEnv* env, jobject obj, jlong tex); 56 | JNIEXPORT jint JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetTextureX(JNIEnv* env, jobject obj, jlong tex); 57 | JNIEXPORT jint JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetTextureY(JNIEnv* env, jobject obj, jlong tex); 58 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetTextureData(JNIEnv* env, jobject obj, jlong tex); 59 | JNIEXPORT jboolean JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_TextureHasAlpha(JNIEnv* env, jobject obj, jlong tex); 60 | 61 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_LoadAnimation(JNIEnv* env, jobject obj, jlong model, jstring filename); 62 | JNIEXPORT void JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_DeleteAnimation(JNIEnv* env, jobject obj, jlong anim); 63 | 64 | #ifdef __cplusplus 65 | } 66 | #endif 67 | #endif 68 | -------------------------------------------------------------------------------- /com_kAIS_KAIMyEntity_NativeFunc.cpp: -------------------------------------------------------------------------------- 1 | #include "com_kAIS_KAIMyEntity_NativeFunc.h" 2 | 3 | #include "KAIMyEntitySaba.h" 4 | 5 | using namespace KAIMyEntitySaba; 6 | 7 | JNIEXPORT jstring JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetVersion(JNIEnv* env, jobject obj) 8 | { 9 | return env->NewStringUTF("vr-1.0"); 10 | } 11 | 12 | JNIEXPORT jbyte JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_ReadByte(JNIEnv* env, jobject obj, jlong data, jlong pos) 13 | { 14 | return (unsigned char)*(((unsigned char*)data) + pos); 15 | } 16 | 17 | JNIEXPORT void JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_CopyDataToByteBuffer(JNIEnv* env, jobject obj, jobject buffer, jlong data, jlong length) 18 | { 19 | unsigned char* p = (unsigned char*)env->GetDirectBufferAddress(buffer); 20 | for (int i = 0; i < length; ++i) 21 | (*(p + i)) = (*((unsigned char*)data + i)); 22 | } 23 | 24 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_LoadModelPMX(JNIEnv* env, jobject obj, jstring filename, jstring dir, jlong layerCount) 25 | { 26 | return (unsigned long long)LoadModelPMX(env->GetStringUTFChars(filename, JNI_FALSE), env->GetStringUTFChars(dir, JNI_FALSE), layerCount); 27 | } 28 | 29 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_LoadModelPMD(JNIEnv* env, jobject obj, jstring filename, jstring dir, jlong layerCount) 30 | { 31 | return (unsigned long long)LoadModelPMD(env->GetStringUTFChars(filename, JNI_FALSE), env->GetStringUTFChars(dir, JNI_FALSE), layerCount); 32 | } 33 | 34 | JNIEXPORT void JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_DeleteModel(JNIEnv* env, jobject obj, jlong model) 35 | { 36 | DeleteModel((Model*)model); 37 | } 38 | 39 | JNIEXPORT void JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_UpdateModel(JNIEnv* env, jobject obj, jlong model) 40 | { 41 | UpdateModel((Model*)model); 42 | } 43 | 44 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetVertexCount(JNIEnv* env, jobject obj, jlong model) 45 | { 46 | return GetVertexCount((Model*)model); 47 | } 48 | 49 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetPoss(JNIEnv* env, jobject obj, jlong model) 50 | { 51 | return (unsigned long long)GetPoss((Model*)model); 52 | } 53 | 54 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetNormals(JNIEnv* env, jobject obj, jlong model) 55 | { 56 | return (unsigned long long)GetNormals((Model*)model); 57 | } 58 | 59 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetUVs(JNIEnv* env, jobject obj, jlong model) 60 | { 61 | return (unsigned long long)GetUVs((Model*)model); 62 | } 63 | 64 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetIndexElementSize(JNIEnv* env, jobject obj, jlong model) 65 | { 66 | return GetIndexElementSize((Model*)model); 67 | } 68 | 69 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetIndexCount(JNIEnv* env, jobject obj, jlong model) 70 | { 71 | return GetIndexCount((Model*)model); 72 | } 73 | 74 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetIndices(JNIEnv* env, jobject obj, jlong model) 75 | { 76 | return (unsigned long long)GetIndices((Model*)model); 77 | } 78 | 79 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialCount(JNIEnv* env, jobject obj, jlong model) 80 | { 81 | return GetMaterialCount((Model*)model); 82 | } 83 | 84 | JNIEXPORT jstring JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialTex(JNIEnv* env, jobject obj, jlong model, jlong pos) 85 | { 86 | return env->NewStringUTF(GetMaterialTex((Model*)model, pos)); 87 | } 88 | 89 | JNIEXPORT jstring JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialSpTex(JNIEnv* env, jobject obj, jlong model, jlong pos) 90 | { 91 | return env->NewStringUTF(GetMaterialSpTex((Model*)model, pos)); 92 | } 93 | 94 | JNIEXPORT jstring JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialToonTex(JNIEnv* env, jobject obj, jlong model, jlong pos) 95 | { 96 | return env->NewStringUTF(GetMaterialToonTex((Model*)model, pos)); 97 | } 98 | 99 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialAmbient(JNIEnv* env, jobject obj, jlong model, jlong pos) 100 | { 101 | return (unsigned long long)GetMaterialAmbient((Model*)model, pos); 102 | } 103 | 104 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialDiffuse(JNIEnv* env, jobject obj, jlong model, jlong pos) 105 | { 106 | return (unsigned long long)GetMaterialDiffuse((Model*)model, pos); 107 | } 108 | 109 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialSpecular(JNIEnv* env, jobject obj, jlong model, jlong pos) 110 | { 111 | return (unsigned long long)GetMaterialSpecular((Model*)model, pos); 112 | } 113 | 114 | JNIEXPORT jfloat JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialSpecularPower(JNIEnv* env, jobject obj, jlong model, jlong pos) 115 | { 116 | return GetMaterialSpecularPower((Model*)model, pos); 117 | } 118 | 119 | JNIEXPORT jfloat JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialAlpha(JNIEnv* env, jobject obj, jlong model, jlong pos) 120 | { 121 | return GetMaterialAlpha((Model*)model, pos); 122 | } 123 | 124 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialTextureMulFactor(JNIEnv* env, jobject obj, jlong model, jlong pos) 125 | { 126 | return (unsigned long long)GetMaterialTextureMulFactor((Model*)model, pos); 127 | } 128 | 129 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialTextureAddFactor(JNIEnv* env, jobject obj, jlong model, jlong pos) 130 | { 131 | return (unsigned long long)GetMaterialTextureAddFactor((Model*)model, pos); 132 | } 133 | 134 | JNIEXPORT jint JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialSpTextureMode(JNIEnv* env, jobject obj, jlong model, jlong pos) 135 | { 136 | return GetMaterialSpTextureMode((Model*)model, pos); 137 | } 138 | 139 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialSpTextureMulFactor(JNIEnv* env, jobject obj, jlong model, jlong pos) 140 | { 141 | return (unsigned long long)GetMaterialSpTextureMulFactor((Model*)model, pos); 142 | } 143 | 144 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialSpTextureAddFactor(JNIEnv* env, jobject obj, jlong model, jlong pos) 145 | { 146 | return (unsigned long long)GetMaterialSpTextureAddFactor((Model*)model, pos); 147 | } 148 | 149 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialToonTextureMulFactor(JNIEnv* env, jobject obj, jlong model, jlong pos) 150 | { 151 | return (unsigned long long)GetMaterialToonTextureMulFactor((Model*)model, pos); 152 | } 153 | 154 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialToonTextureAddFactor(JNIEnv* env, jobject obj, jlong model, jlong pos) 155 | { 156 | return (unsigned long long)GetMaterialToonTextureAddFactor((Model*)model, pos); 157 | } 158 | 159 | JNIEXPORT jboolean JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetMaterialBothFace(JNIEnv* env, jobject obj, jlong model, jlong pos) 160 | { 161 | return GetMaterialBothFace((Model*)model, pos) ? JNI_TRUE : JNI_FALSE; 162 | } 163 | 164 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetSubMeshCount(JNIEnv* env, jobject obj, jlong model) 165 | { 166 | return GetSubMeshCount((Model*)model); 167 | } 168 | 169 | JNIEXPORT jint JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetSubMeshMaterialID(JNIEnv* env, jobject obj, jlong model, jlong pos) 170 | { 171 | return GetSubMeshMaterialID((Model*)model, pos); 172 | } 173 | 174 | JNIEXPORT jint JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetSubMeshBeginIndex(JNIEnv* env, jobject obj, jlong model, jlong pos) 175 | { 176 | return GetSubMeshBeginIndex((Model*)model, pos); 177 | } 178 | 179 | JNIEXPORT jint JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetSubMeshVertexCount(JNIEnv* env, jobject obj, jlong model, jlong pos) 180 | { 181 | return GetSubMeshVertexCount((Model*)model, pos); 182 | } 183 | 184 | JNIEXPORT void JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_ChangeModelAnim(JNIEnv* env, jobject obj, jlong model, jlong anim, jlong layer) 185 | { 186 | ChangeModelAnim((Model*)model, (saba::VMDAnimation*)anim, layer); 187 | } 188 | 189 | JNIEXPORT void JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_ResetModelPhysics(JNIEnv* env, jobject obj, jlong model) 190 | { 191 | ResetModelPhysics((Model*)model); 192 | } 193 | 194 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_CreateMat(JNIEnv* env, jobject obj) 195 | { 196 | return (unsigned long long)CreateMat(); 197 | } 198 | 199 | JNIEXPORT void JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_DeleteMat(JNIEnv* env, jobject obj, jlong mat) 200 | { 201 | DeleteMat((glm::mat4*)mat); 202 | } 203 | 204 | JNIEXPORT void JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetRightHandMat(JNIEnv* env, jobject obj, jlong model, jlong mat) 205 | { 206 | GetRightHandMat((Model*)model, (glm::mat4*)mat); 207 | } 208 | 209 | JNIEXPORT void JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetLeftHandMat(JNIEnv* env, jobject obj, jlong model, jlong mat) 210 | { 211 | GetLeftHandMat((Model*)model, (glm::mat4*)mat); 212 | } 213 | 214 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_LoadTexture(JNIEnv* env, jobject obj, jstring filename) 215 | { 216 | return (unsigned long long)LoadTexture(env->GetStringUTFChars(filename, JNI_FALSE)); 217 | } 218 | 219 | JNIEXPORT void JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_DeleteTexture(JNIEnv* env, jobject obj, jlong tex) 220 | { 221 | DeleteTexture((Texture*)tex); 222 | } 223 | 224 | JNIEXPORT jint JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetTextureX(JNIEnv* env, jobject obj, jlong tex) 225 | { 226 | return GetTextureX((Texture*)tex); 227 | } 228 | 229 | JNIEXPORT jint JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetTextureY(JNIEnv* env, jobject obj, jlong tex) 230 | { 231 | return GetTextureY((Texture*)tex); 232 | } 233 | 234 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_GetTextureData(JNIEnv* env, jobject obj, jlong tex) 235 | { 236 | return (unsigned long long)GetTextureData((Texture*)tex); 237 | } 238 | 239 | JNIEXPORT jboolean JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_TextureHasAlpha(JNIEnv* env, jobject obj, jlong tex) 240 | { 241 | return TextureHasAlpha((Texture*)tex) ? JNI_TRUE : JNI_FALSE; 242 | } 243 | 244 | JNIEXPORT jlong JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_LoadAnimation(JNIEnv* env, jobject obj, jlong model, jstring filename) 245 | { 246 | return (unsigned long long)LoadAnimation((Model*)model, env->GetStringUTFChars(filename, JNI_FALSE)); 247 | } 248 | 249 | JNIEXPORT void JNICALL Java_com_kAIS_KAIMyEntity_NativeFunc_DeleteAnimation(JNIEnv* env, jobject obj, jlong anim) 250 | { 251 | DeleteAnimation((saba::VMDAnimation*)anim); 252 | } -------------------------------------------------------------------------------- /KAIMyEntitySaba.cpp: -------------------------------------------------------------------------------- 1 | #include "KAIMyEntitySaba.h" 2 | 3 | #define STB_IMAGE_IMPLEMENTATION 4 | #define STB_IMAGE_STATIC 5 | #include 6 | #include 7 | 8 | using namespace KAIMyEntitySaba; 9 | 10 | const int FPS = 30; 11 | const float PHYSICS_ELAPSED = 1.0f / FPS; 12 | 13 | Model *KAIMyEntitySaba::LoadModelPMX(const char *filename, const char *dir, size_t layerCount) 14 | { 15 | auto model = std::make_unique(); 16 | if (!model->Load(filename, dir)) 17 | { 18 | model.reset(); 19 | return nullptr; 20 | } 21 | model->InitializeAnimation(); 22 | model->ResetPhysics(); 23 | 24 | auto vmdAnims = new saba::VMDAnimation *[layerCount]; 25 | for (size_t i = 0; i < layerCount; ++i) 26 | vmdAnims[i] = nullptr; 27 | auto animTimes = new double[layerCount]; 28 | for (int i = 0; i < layerCount; ++i) 29 | animTimes[i] = 0.0; 30 | 31 | Model *result = new Model; 32 | result->mmdModel = std::move(model); 33 | result->vmdAnims = vmdAnims; 34 | result->vmdAnimCount = layerCount; 35 | result->animTimes = animTimes; 36 | result->prevSabaTime = saba::GetTime(); 37 | 38 | return result; 39 | } 40 | 41 | Model *KAIMyEntitySaba::LoadModelPMD(const char *filename, const char *dir, size_t layerCount) 42 | { 43 | auto model = std::make_unique(); 44 | if (!model->Load(filename, dir)) 45 | { 46 | model.reset(); 47 | return nullptr; 48 | } 49 | model->InitializeAnimation(); 50 | model->ResetPhysics(); 51 | 52 | auto vmdAnims = new saba::VMDAnimation *[layerCount]; 53 | for (int i = 0; i < layerCount; ++i) 54 | vmdAnims[i] = nullptr; 55 | auto animTimes = new double[layerCount]; 56 | for (int i = 0; i < layerCount; ++i) 57 | animTimes[i] = 0.0; 58 | 59 | Model *result = new Model; 60 | result->mmdModel = std::move(model); 61 | result->vmdAnims = vmdAnims; 62 | result->vmdAnimCount = layerCount; 63 | result->animTimes = animTimes; 64 | result->prevSabaTime = saba::GetTime(); 65 | 66 | return result; 67 | } 68 | 69 | void KAIMyEntitySaba::DeleteModel(Model *model) 70 | { 71 | delete[] model->animTimes; 72 | delete[] model->vmdAnims; 73 | model->mmdModel.reset(); 74 | delete model; 75 | } 76 | 77 | void KAIMyEntitySaba::UpdateModel(Model *model) 78 | { 79 | int maxAnim = 0; 80 | double deltaTime = saba::GetTime() - model->prevSabaTime; 81 | model->prevSabaTime = saba::GetTime(); 82 | double elapsed = deltaTime; 83 | if (elapsed > PHYSICS_ELAPSED) 84 | elapsed = PHYSICS_ELAPSED; 85 | for (size_t i = 0; i < model->vmdAnimCount; ++i) 86 | { 87 | auto vmdAnim = model->vmdAnims[i]; 88 | if (vmdAnim != nullptr) 89 | { 90 | maxAnim = i; 91 | } 92 | } 93 | model->mmdModel->BeginAnimation(); 94 | for (size_t i = 0; i < model->vmdAnimCount; ++i) 95 | { 96 | auto vmdAnim = model->vmdAnims[i]; 97 | if (vmdAnim != nullptr) 98 | { 99 | double animTime = model->animTimes[i] + deltaTime; 100 | if (animTime * FPS > vmdAnim->GetMaxKeyTime()) 101 | animTime = 0.0; 102 | model->animTimes[i] = animTime; 103 | 104 | if (i == maxAnim) 105 | { 106 | model->mmdModel->UpdateAllAnimation(vmdAnim, animTime * FPS, elapsed); 107 | } 108 | else 109 | { 110 | float vmdFrame = animTime * FPS; 111 | if (vmdAnim != nullptr) 112 | { 113 | vmdAnim->Evaluate(vmdFrame); 114 | } 115 | model->mmdModel->UpdateMorphAnimation(); 116 | model->mmdModel->UpdateNodeAnimation(false); 117 | } 118 | 119 | } 120 | } 121 | model->mmdModel->EndAnimation(); 122 | model->mmdModel->Update(); 123 | } 124 | 125 | size_t KAIMyEntitySaba::GetVertexCount(Model *model) 126 | { 127 | return model->mmdModel->GetVertexCount(); 128 | } 129 | 130 | const void *KAIMyEntitySaba::GetPoss(Model *model) 131 | { 132 | return model->mmdModel->GetUpdatePositions(); 133 | } 134 | 135 | const void *KAIMyEntitySaba::GetNormals(Model *model) 136 | { 137 | return model->mmdModel->GetUpdateNormals(); 138 | } 139 | 140 | const void *KAIMyEntitySaba::GetUVs(Model *model) 141 | { 142 | return model->mmdModel->GetUpdateUVs(); 143 | } 144 | 145 | size_t KAIMyEntitySaba::GetIndexElementSize(Model *model) 146 | { 147 | return model->mmdModel->GetIndexElementSize(); 148 | } 149 | 150 | size_t KAIMyEntitySaba::GetIndexCount(Model *model) 151 | { 152 | return model->mmdModel->GetIndexCount(); 153 | } 154 | 155 | const void *KAIMyEntitySaba::GetIndices(Model *model) 156 | { 157 | return model->mmdModel->GetIndices(); 158 | } 159 | 160 | size_t KAIMyEntitySaba::GetMaterialCount(Model *model) 161 | { 162 | return model->mmdModel->GetMaterialCount(); 163 | } 164 | 165 | const char *KAIMyEntitySaba::GetMaterialTex(Model *model, size_t pos) 166 | { 167 | return model->mmdModel->GetMaterials()[pos].m_texture.c_str(); 168 | } 169 | 170 | const char *KAIMyEntitySaba::GetMaterialSpTex(Model *model, size_t pos) 171 | { 172 | return model->mmdModel->GetMaterials()[pos].m_spTexture.c_str(); 173 | } 174 | 175 | const char *KAIMyEntitySaba::GetMaterialToonTex(Model *model, size_t pos) 176 | { 177 | return model->mmdModel->GetMaterials()[pos].m_toonTexture.c_str(); 178 | } 179 | 180 | const void *KAIMyEntitySaba::GetMaterialAmbient(Model *model, size_t pos) 181 | { 182 | return &(model->mmdModel->GetMaterials()[pos].m_ambient); 183 | } 184 | 185 | const void *KAIMyEntitySaba::GetMaterialDiffuse(Model *model, size_t pos) 186 | { 187 | return &(model->mmdModel->GetMaterials()[pos].m_diffuse); 188 | } 189 | 190 | const void *KAIMyEntitySaba::GetMaterialSpecular(Model *model, size_t pos) 191 | { 192 | return &(model->mmdModel->GetMaterials()[pos].m_specular); 193 | } 194 | 195 | float KAIMyEntitySaba::GetMaterialSpecularPower(Model *model, size_t pos) 196 | { 197 | return model->mmdModel->GetMaterials()[pos].m_specularPower; 198 | } 199 | 200 | float KAIMyEntitySaba::GetMaterialAlpha(Model *model, size_t pos) 201 | { 202 | return model->mmdModel->GetMaterials()[pos].m_alpha; 203 | } 204 | 205 | const void *KAIMyEntitySaba::GetMaterialTextureMulFactor(Model *model, size_t pos) 206 | { 207 | return &(model->mmdModel->GetMaterials()[pos].m_textureMulFactor); 208 | } 209 | 210 | const void *KAIMyEntitySaba::GetMaterialTextureAddFactor(Model *model, size_t pos) 211 | { 212 | return &(model->mmdModel->GetMaterials()[pos].m_textureAddFactor); 213 | } 214 | 215 | int KAIMyEntitySaba::GetMaterialSpTextureMode(Model *model, size_t pos) 216 | { 217 | return (int)model->mmdModel->GetMaterials()[pos].m_spTextureMode; 218 | } 219 | 220 | const void *KAIMyEntitySaba::GetMaterialSpTextureMulFactor(Model *model, size_t pos) 221 | { 222 | return &(model->mmdModel->GetMaterials()[pos].m_spTextureMulFactor); 223 | } 224 | 225 | const void *KAIMyEntitySaba::GetMaterialSpTextureAddFactor(Model *model, size_t pos) 226 | { 227 | return &(model->mmdModel->GetMaterials()[pos].m_spTextureAddFactor); 228 | } 229 | 230 | const void *KAIMyEntitySaba::GetMaterialToonTextureMulFactor(Model *model, size_t pos) 231 | { 232 | return &(model->mmdModel->GetMaterials()[pos].m_toonTextureMulFactor); 233 | } 234 | 235 | const void *KAIMyEntitySaba::GetMaterialToonTextureAddFactor(Model *model, size_t pos) 236 | { 237 | return &(model->mmdModel->GetMaterials()[pos].m_toonTextureAddFactor); 238 | } 239 | 240 | bool KAIMyEntitySaba::GetMaterialBothFace(Model *model, size_t pos) 241 | { 242 | return model->mmdModel->GetMaterials()[pos].m_bothFace; 243 | } 244 | 245 | size_t KAIMyEntitySaba::GetSubMeshCount(Model *model) 246 | { 247 | return model->mmdModel->GetSubMeshCount(); 248 | } 249 | 250 | int KAIMyEntitySaba::GetSubMeshMaterialID(Model *model, size_t pos) 251 | { 252 | return model->mmdModel->GetSubMeshes()[pos].m_materialID; 253 | } 254 | 255 | int KAIMyEntitySaba::GetSubMeshBeginIndex(Model *model, size_t pos) 256 | { 257 | return model->mmdModel->GetSubMeshes()[pos].m_beginIndex; 258 | } 259 | 260 | int KAIMyEntitySaba::GetSubMeshVertexCount(Model *model, size_t pos) 261 | { 262 | return model->mmdModel->GetSubMeshes()[pos].m_vertexCount; 263 | } 264 | 265 | void KAIMyEntitySaba::ChangeModelAnim(Model *model, saba::VMDAnimation *anim, size_t layer) 266 | { 267 | model->mmdModel->InitializeAnimation(); 268 | model->vmdAnims[layer] = anim; 269 | model->prevSabaTime = saba::GetTime(); 270 | model->animTimes[layer] = 0.0; 271 | } 272 | 273 | void KAIMyEntitySaba::ResetModelPhysics(Model *model) 274 | { 275 | model->mmdModel->ResetPhysics(); 276 | } 277 | 278 | glm::mat4 *KAIMyEntitySaba::CreateMat() 279 | { 280 | glm::mat4 *result = new glm::mat4; 281 | return result; 282 | } 283 | 284 | void KAIMyEntitySaba::DeleteMat(glm::mat4 *mat) 285 | { 286 | delete mat; 287 | } 288 | 289 | void KAIMyEntitySaba::GetRightHandMat(Model *model, glm::mat4 *mat) 290 | { 291 | const char name[] = {static_cast(0xE5), static_cast(0x8F), static_cast(0xB3), static_cast(0xE4), static_cast(0xB8), static_cast(0xAD), static_cast(0xE6), static_cast(0x8C), static_cast(0x87), static_cast(0xEF), static_cast(0xBC), static_cast(0x91), 0x00}; //Japanese name of bone by UTF8 292 | saba::MMDNode *node = model->mmdModel->GetNodeManager()->GetMMDNode(name); 293 | if (node == nullptr) 294 | return; 295 | *mat = node->GetGlobalTransform(); 296 | } 297 | 298 | void KAIMyEntitySaba::GetLeftHandMat(Model *model, glm::mat4 *mat) 299 | { 300 | const char name[] = {static_cast(0xE5), static_cast(0xB7), static_cast(0xA6), static_cast(0xE4), static_cast(0xB8), static_cast(0xAD), static_cast(0xE6), static_cast(0x8C), static_cast(0x87), static_cast(0xEF), static_cast(0xBC), static_cast(0x91), 0x00}; //Japanese name of bone by UTF8 301 | saba::MMDNode *node = model->mmdModel->GetNodeManager()->GetMMDNode(name); 302 | if (node == nullptr) 303 | return; 304 | *mat = node->GetGlobalTransform(); 305 | } 306 | 307 | Texture *KAIMyEntitySaba::LoadTexture(const char *filename) 308 | { 309 | saba::File file; 310 | if (!file.Open(filename)) 311 | return nullptr; 312 | 313 | stbi_set_flip_vertically_on_load(true); 314 | int x, y, comp; 315 | int ret = stbi_info_from_file(file.GetFilePointer(), &x, &y, &comp); 316 | if (ret == 0) 317 | return nullptr; 318 | uint8_t *data; 319 | bool hasAlpha; 320 | if (comp != 4) 321 | { 322 | data = stbi_load_from_file(file.GetFilePointer(), &x, &y, &comp, STBI_rgb); 323 | hasAlpha = false; 324 | } 325 | else 326 | { 327 | data = stbi_load_from_file(file.GetFilePointer(), &x, &y, &comp, STBI_rgb_alpha); 328 | hasAlpha = true; 329 | } 330 | 331 | Texture *result = new Texture; 332 | result->data = data; 333 | result->x = x; 334 | result->y = y; 335 | result->hasAlpha = hasAlpha; 336 | return result; 337 | } 338 | 339 | void KAIMyEntitySaba::DeleteTexture(Texture *tex) 340 | { 341 | stbi_image_free(tex->data); 342 | delete tex; 343 | } 344 | 345 | int KAIMyEntitySaba::GetTextureX(Texture *tex) 346 | { 347 | return tex->x; 348 | } 349 | 350 | int KAIMyEntitySaba::GetTextureY(Texture *tex) 351 | { 352 | return tex->y; 353 | } 354 | 355 | const void *KAIMyEntitySaba::GetTextureData(Texture *tex) 356 | { 357 | return tex->data; 358 | } 359 | 360 | bool KAIMyEntitySaba::TextureHasAlpha(Texture *tex) 361 | { 362 | return tex->hasAlpha; 363 | } 364 | 365 | saba::VMDAnimation *KAIMyEntitySaba::LoadAnimation(Model *model, const char *filename) 366 | { 367 | saba::VMDFile vmd; 368 | if (!saba::ReadVMDFile(&vmd, filename)) 369 | return nullptr; 370 | saba::VMDAnimation *result = new saba::VMDAnimation; 371 | result->Create(model->mmdModel); 372 | result->Add(vmd); 373 | result->SyncPhysics(0.0f, FPS); 374 | 375 | return result; 376 | } 377 | 378 | void KAIMyEntitySaba::DeleteAnimation(saba::VMDAnimation *anim) 379 | { 380 | delete anim; 381 | } --------------------------------------------------------------------------------