feat(model): 添加模型姿态管理系统- 新增 ModelPose 类用于管理模型部件的姿态数据

- 在 Model2D 中实现姿态保存、应用和混合功能- 支持姿态的序列化和反序列化
- 添加日志记录替代原有的 System.out 和 System.err 输出-优化网格和模型部件的调试信息输出
- 引入 PartPoseData 和 PoseData用于姿态数据持久化- 实现姿态间的平滑过渡和插值计算
- 增加默认姿态初始化和管理机制
This commit is contained in:
tzdwindows 7
2025-10-12 08:41:34 +08:00
parent fb1db942ed
commit b501da0254
8 changed files with 825 additions and 22 deletions

View File

@@ -11,6 +11,8 @@ import org.joml.Vector2f;
import org.joml.Vector4f;
import org.lwjgl.opengl.*;
import org.lwjgl.system.MemoryUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.ByteBuffer;
import java.nio.FloatBuffer;
@@ -25,7 +27,7 @@ import static org.lwjgl.opengl.GL20.glGetUniformLocation;
* @author tzdwindows 7
*/
public final class ModelRender {
private static final Logger logger = LoggerFactory.getLogger(ModelRender.class);
private ModelRender() { /* no instances */ }
// ================== 全局状态 ==================
@@ -33,8 +35,8 @@ public final class ModelRender {
private static int viewportWidth = 800;
private static int viewportHeight = 600;
private static final Vector4f CLEAR_COLOR = new Vector4f(0.0f, 0.0f, 0.0f, 1.0f);
private static boolean enableDepthTest = false;
private static boolean enableBlending = true;
private static final boolean enableDepthTest = false;
private static final boolean enableBlending = true;
// 着色器与资源
private static final Map<String, ShaderProgram> shaderMap = new HashMap<>();
@@ -80,7 +82,7 @@ public final class ModelRender {
int loc = glGetUniformLocation(programId, k);
if (loc == -1) {
// debug 时可以打开
// System.err.println("Warning: uniform not found: " + k);
logger.warn("Warning: uniform not found: {}", k);
}
return loc;
});
@@ -271,7 +273,7 @@ public final class ModelRender {
public static synchronized void initialize() {
if (initialized) return;
System.out.println("Initializing ModelRender...");
logger.info("Initializing ModelRender...");
// 需要在外部创建 OpenGL 上下文并调用 GL.createCapabilities()
logGLInfo();
@@ -283,7 +285,7 @@ public final class ModelRender {
try {
compileDefaultShader();
} catch (RuntimeException ex) {
System.err.println("Failed to compile default shader: " + ex.getMessage());
logger.error("Failed to compile default shader: {}", ex.getMessage());
throw ex;
}
@@ -294,14 +296,14 @@ public final class ModelRender {
GL11.glViewport(0, 0, viewportWidth, viewportHeight);
initialized = true;
System.out.println("ModelRender initialized successfully");
logger.info("ModelRender initialized successfully");
}
private static void logGLInfo() {
System.out.println("OpenGL Vendor: " + GL11.glGetString(GL11.GL_VENDOR));
System.out.println("OpenGL Renderer: " + GL11.glGetString(GL11.GL_RENDERER));
System.out.println("OpenGL Version: " + GL11.glGetString(GL11.GL_VERSION));
System.out.println("GLSL Version: " + GL20.glGetString(GL20.GL_SHADING_LANGUAGE_VERSION));
logger.info("OpenGL Vendor: {}", GL11.glGetString(GL11.GL_VENDOR));
logger.info("OpenGL Renderer: {}", GL11.glGetString(GL11.GL_RENDERER));
logger.info("OpenGL Version: {}", GL11.glGetString(GL11.GL_VERSION));
logger.info("GLSL Version: {}", GL20.glGetString(GL20.GL_SHADING_LANGUAGE_VERSION));
}
private static void uploadLightsToShader(ShaderProgram sp, Model2D model) {
@@ -438,7 +440,7 @@ public final class ModelRender {
public static synchronized void cleanup() {
if (!initialized) return;
System.out.println("Cleaning up ModelRender...");
logger.info("Cleaning up ModelRender...");
// mesh resources
for (MeshGLResources r : meshResources.values()) r.dispose();
@@ -456,7 +458,7 @@ public final class ModelRender {
}
initialized = false;
System.out.println("ModelRender cleaned up");
logger.info("ModelRender cleaned up");
}
// ================== 渲染流程 (已修改) ==================
@@ -790,7 +792,7 @@ public final class ModelRender {
private static void checkGLError(String op) {
int e = GL11.glGetError();
if (e != GL11.GL_NO_ERROR) {
System.err.println("OpenGL error during " + op + ": " + getGLErrorString(e));
logger.error("OpenGL error during {}: {}", op, getGLErrorString(e));
}
}