diff --git a/app/src/main/java/com/hmwl/face_sdk/Motion.java b/app/src/main/java/com/hmwl/face_sdk/Motion.java
index 29d5f5d..ee0a7e8 100644
--- a/app/src/main/java/com/hmwl/face_sdk/Motion.java
+++ b/app/src/main/java/com/hmwl/face_sdk/Motion.java
@@ -1,4 +1,5 @@
package com.hmwl.face_sdk;
+import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
@@ -12,7 +13,11 @@ public class Motion {
try {
JSONObject jsonObject = new JSONObject();
jsonObject.put("type", type);
- jsonObject.put("png_names", png_names);
+ JSONArray ja = new JSONArray();
+ for(int i = 0; i < png_names.size(); ++i){
+ ja.put(png_names.get(i));
+ }
+ jsonObject.put("png_names", ja);
return jsonObject;
} catch (Exception e) {
e.printStackTrace();
diff --git a/example/build.gradle b/example/build.gradle
index f84d4e7..f69bb44 100644
--- a/example/build.gradle
+++ b/example/build.gradle
@@ -7,7 +7,7 @@ android {
compileSdk 36
defaultConfig {
- applicationId "com.hmwl.f20251030"
+ applicationId "com.hmwl.f20251101"
minSdk 30
targetSdk 36
versionCode 1
diff --git a/example/src/main/assets/pic/motion_data.json b/example/src/main/assets/pic/motion_data.json
index 2026574..5ddb15a 100644
--- a/example/src/main/assets/pic/motion_data.json
+++ b/example/src/main/assets/pic/motion_data.json
@@ -2,6 +2,33 @@
"11": [
"11.png"
],
+ "action24": [
+ "000000.png",
+ "000001.png",
+ "000002.png",
+ "000003.png",
+ "000004.png",
+ "000005.png",
+ "000006.png",
+ "000007.png",
+ "000008.png",
+ "000009.png",
+ "000010.png",
+ "000011.png",
+ "000012.png",
+ "000013.png",
+ "000014.png",
+ "000015.png",
+ "000016.png",
+ "000017.png",
+ "000018.png",
+ "000019.png",
+ "000020.png",
+ "000021.png",
+ "000022.png",
+ "000023.png",
+ "000024.png"
+ ],
"12": [
"12.png"
],
@@ -94,32 +121,5 @@
],
"81": [
"81.png"
- ],
- "action24": [
- "000000.png",
- "000001.png",
- "000002.png",
- "000003.png",
- "000004.png",
- "000005.png",
- "000006.png",
- "000007.png",
- "000008.png",
- "000009.png",
- "000010.png",
- "000011.png",
- "000012.png",
- "000013.png",
- "000014.png",
- "000015.png",
- "000016.png",
- "000017.png",
- "000018.png",
- "000019.png",
- "000020.png",
- "000021.png",
- "000022.png",
- "000023.png",
- "000024.png"
]
}
\ No newline at end of file
diff --git a/example/src/main/java/com/hmwl/example/MainActivity.java b/example/src/main/java/com/hmwl/example/MainActivity.java
index 65fa4ca..d3b05ab 100644
--- a/example/src/main/java/com/hmwl/example/MainActivity.java
+++ b/example/src/main/java/com/hmwl/example/MainActivity.java
@@ -33,10 +33,10 @@ public class MainActivity extends FaceActivity
protected void onCreate(Bundle savedInstanceState)
{
Motion motion = new Motion();
- motion.type = "4";
- motion.png_names.add("4.png");
+ motion.type = "11";
+ motion.png_names.add("11.png");
InitArg initArg = new InitArg();
- initArg.action_fps = 3;
+ initArg.action_fps = 10;
initArg.zoom = 1.5f;
initArg.motion = motion;
SetInitArg(initArg.toJson());
@@ -44,12 +44,13 @@ public class MainActivity extends FaceActivity
super.onCreate(savedInstanceState);
FaceInit(this);
- Toast.makeText(this, "4.png", Toast.LENGTH_LONG).show();
+ Toast.makeText(this, "11.png", Toast.LENGTH_LONG).show();
}
String GetCurMotionState(int index)
{
Motion motion = new Motion();
+ motion.type = pngFilesByFolder.get(index).folderName;
motion.png_names = pngFilesByFolder.get(index).getFileList();
return motion.toJson();
}
diff --git a/example/src/main/res/values/strings.xml b/example/src/main/res/values/strings.xml
index eff1c07..dac959a 100644
--- a/example/src/main/res/values/strings.xml
+++ b/example/src/main/res/values/strings.xml
@@ -1,3 +1,3 @@
- f20251030
+ f20251101
\ No newline at end of file
diff --git a/vulkan/Application.h b/vulkan/Application.h
index 1c71661..32416c6 100644
--- a/vulkan/Application.h
+++ b/vulkan/Application.h
@@ -39,7 +39,7 @@ public:
void createRenderPass();
void recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex, long long frameTime);
void createSyncObjects();
- void drawFrame(long long frameTime);
+ virtual void drawFrame(long long frameTime);
virtual void render(VkCommandBuffer commandBuffer, long long frameTime);
virtual bool isInited() { return inited; }
@@ -89,4 +89,6 @@ protected:
void destroy_texture(Texture texture);
std::mutex mtx;
long long _lastDrawFrameTime;
+
+ std::mutex changeMotionMtx;
};
\ No newline at end of file
diff --git a/vulkan/FaceApp.cpp b/vulkan/FaceApp.cpp
index b1f3f6d..91fbdef 100644
--- a/vulkan/FaceApp.cpp
+++ b/vulkan/FaceApp.cpp
@@ -456,34 +456,7 @@ void FaceApp::create_face_pipelines()
VK_CHECK(vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &pipeline_create_info, nullptr, &m_graphicsPipeline));
}
-void FaceApp::setup_descriptor_pool()
-{
- // 保守估计:假设每个描述符集可能有多个绑定
- const uint32_t setsCount = kMaxTexture;
- //const uint32_t multiplier = 3; // 安全系数
- std::vector pool_sizes = {
- {
- .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
- .descriptorCount = 3
- },
- {
- .type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
- .descriptorCount = setsCount + 4
- },
- // 如果需要其他类型的描述符,在这里添加
- };
-
- VkDescriptorPoolCreateInfo descriptor_pool_info{};
- descriptor_pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
- descriptor_pool_info.poolSizeCount = static_cast(pool_sizes.size());
- descriptor_pool_info.pPoolSizes = pool_sizes.data();
- descriptor_pool_info.maxSets = setsCount + 7; // 额外预留一些集合
- descriptor_pool_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
-
- VK_CHECK(vkCreateDescriptorPool(device, &descriptor_pool_info, nullptr, &descriptor_pool));
-
-}
@@ -553,6 +526,32 @@ void FaceApp::setup_descriptor_set_layout()
VK_CHECK(vkCreatePipelineLayout(device, &pipeline_layout_create_info, nullptr, &m_pipelineLayout));
}
+void FaceApp::setup_descriptor_pool()
+{
+
+ std::vector pool_sizes = {
+ {
+ .type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
+ .descriptorCount = kMaxTexture
+ },
+ {
+ .type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
+ .descriptorCount = (kMaxTexture + 1)
+ },
+ // 如果需要其他类型的描述符,在这里添加
+ };
+
+ VkDescriptorPoolCreateInfo descriptor_pool_info{};
+ descriptor_pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
+ descriptor_pool_info.poolSizeCount = static_cast(pool_sizes.size());
+ descriptor_pool_info.pPoolSizes = pool_sizes.data();
+ descriptor_pool_info.maxSets = kMaxTexture + (kMaxTexture + 1);
+ descriptor_pool_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
+
+ VK_CHECK(vkCreateDescriptorPool(device, &descriptor_pool_info, nullptr, &descriptor_pool));
+
+}
+
void FaceApp::setup_descriptor_set()
{
m_descriptor_sets.resize(kMaxTexture);
@@ -646,21 +645,10 @@ void FaceApp::setup_descriptor_set()
void FaceApp::render(VkCommandBuffer commandBuffer, long long frameTime)
{
- static long long game_time = 0;
- game_time += frameTime;
- long long actionTime = (1000 / _initArg.action_fps);
- if (game_time > actionTime)
- {
- _curTexIndex++;
- if (_curTexIndex >= _curMotion.png_names.size())
- {
- _curTexIndex = 0;
- }
- game_time = game_time - actionTime;
- }
std::unique_lock lock(mtx);
std::unique_lock lock_point(mtx_point);
+
//Application::render(commandBuffer);
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipelineLayout_bg, 0, 1, &m_descriptor_set_bg, 0, NULL);
@@ -926,7 +914,7 @@ void FaceApp::createUniformBuffer()
void FaceApp::create_pipelines_bg()
-{
+ {
VkPipelineInputAssemblyStateCreateInfo input_assembly_state{};
input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
@@ -1137,6 +1125,23 @@ void FaceApp::SetInitArg(const char* arg)
}
+void FaceApp::drawFrame(long long frameTime)
+{
+ std::unique_lock lock(changeMotionMtx);
+ static long long game_time = 0;
+ game_time += frameTime;
+ long long actionTime = (1000 / _initArg.action_fps);
+ if (game_time > actionTime)
+ {
+ _curTexIndex++;
+ if (_curTexIndex >= _curMotion.png_names.size())
+ {
+ _curTexIndex = 0;
+ }
+ game_time = game_time - actionTime;
+ }
+ Application::drawFrame(frameTime);
+}
void FaceApp::changeMotion(const char* json)
{
@@ -1150,6 +1155,7 @@ void FaceApp::changeMotion(Motion& motion)
{
return;
}
+ std::unique_lock lock_changeMotion(changeMotionMtx);
_curMotion = motion;
for (int i = 0; i < _curMotion.png_names.size(); ++i)
{
diff --git a/vulkan/FaceApp.h b/vulkan/FaceApp.h
index ef18ee0..cc84793 100644
--- a/vulkan/FaceApp.h
+++ b/vulkan/FaceApp.h
@@ -100,7 +100,7 @@ private:
VkPipelineLayout m_pipelineLayout = VK_NULL_HANDLE;
VkDescriptorSetLayout m_descriptorSetLayout = VK_NULL_HANDLE;
vector m_descriptor_sets;
- const int kMaxTexture = 30;
+ const uint32_t kMaxTexture = 30;
vector m_texs;
vector m_texs_ex;
@@ -141,6 +141,8 @@ public:
Motion _curMotion;
int _curTexIndex = 0;
void SetInitArg(const char* arg);
+
+ void drawFrame(long long frameTime)override;
};
#endif