From 43aab9f0fd06f077dd0c32b4c7b7528579f78c95 Mon Sep 17 00:00:00 2001 From: tzdwindows 7 <3076584115@qq.com> Date: Sun, 26 Oct 2025 07:09:58 +0800 Subject: [PATCH] =?UTF-8?q?refactor(render):=E4=BC=98=E5=8C=96=E6=B8=B2?= =?UTF-8?q?=E6=9F=93=E7=B3=BB=E7=BB=9F=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E4=B8=8E=E5=AD=97=E4=BD=93=E5=8A=A0=E8=BD=BD=E9=80=BB=E8=BE=91?= =?UTF-8?q?-=20=E7=AE=80=E5=8C=96=E6=A8=A1=E5=9E=8B=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E7=9B=91=E5=90=AC=E5=99=A8=E4=B8=BA=20lambda=20=E8=A1=A8?= =?UTF-8?q?=E8=BE=BE=E5=BC=8F-=20=E7=A7=BB=E9=99=A4=E6=9C=AA=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E7=9A=84=20Mesh2D=20=E5=92=8C=20ModelClickListener=20?= =?UTF-8?q?=E5=AF=BC=E5=85=A5-=20=E4=BD=BF=E7=94=A8=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E5=BC=95=E7=94=A8=E6=9B=BF=E6=8D=A2=E5=8C=BF=E5=90=8D=E6=B8=B2?= =?UTF-8?q?=E6=9F=93=E8=B0=83=E7=94=A8-=20=E9=87=8D=E5=91=BD=E5=90=8D=20ge?= =?UTF-8?q?tProgrami=20=E6=96=B9=E6=B3=95=E4=B8=BA=20getProgram=20-=20?= =?UTF-8?q?=E6=94=B9=E8=BF=9B=E5=AD=97=E4=BD=93=E5=8A=A0=E8=BD=BD=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E6=94=AF=E6=8C=81=E5=A4=9A=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E6=9F=A5=E6=89=BE=20-=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=AD=97=E4=BD=93=E6=96=87=E4=BB=B6=E4=B8=8D=E5=AD=98=E5=9C=A8?= =?UTF-8?q?=E6=97=B6=E7=9A=84=E6=97=A5=E5=BF=97=E8=AD=A6=E5=91=8A-=20?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=9D=80=E8=89=B2=E5=99=A8=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E9=93=BE=E6=8E=A5=E4=B8=8E=E9=AA=8C=E8=AF=81=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E8=B0=83=E7=94=A8=E6=96=B0=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle/wrapper/gradle-wrapper.properties | 2 +- .../vivid2D/render/systems/RenderSystem.java | 62 +++++++++++++++---- .../systems/sources/ShaderManagement.java | 4 +- .../vivid2D/test/ModelLayerPanelTest.java | 21 +++---- 4 files changed, 60 insertions(+), 29 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bf8819e..f212d14 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Tue Feb 04 17:20:23 CST 2025 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip +distributionUrl=https://mirrors.aliyun.com/macports/distfiles/gradle/gradle-8.5-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/com/chuangzhou/vivid2D/render/systems/RenderSystem.java b/src/main/java/com/chuangzhou/vivid2D/render/systems/RenderSystem.java index 28925f6..0470811 100644 --- a/src/main/java/com/chuangzhou/vivid2D/render/systems/RenderSystem.java +++ b/src/main/java/com/chuangzhou/vivid2D/render/systems/RenderSystem.java @@ -7,9 +7,12 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; +import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.function.IntSupplier; @@ -703,7 +706,7 @@ public final class RenderSystem { public static void enableBlend() { if (!isOnRenderThread()) { - recordRenderCall(() -> _enableBlend()); + recordRenderCall(RenderSystem::_enableBlend); } else { _enableBlend(); } @@ -716,7 +719,7 @@ public final class RenderSystem { public static void disableBlend() { if (!isOnRenderThread()) { - recordRenderCall(() -> _disableBlend()); + recordRenderCall(RenderSystem::_disableBlend); } else { _disableBlend(); } @@ -789,7 +792,7 @@ public final class RenderSystem { GL20.glLinkProgram(program); } - public static int getProgrami(int program, int pname) { + public static int getProgram(int program, int pname) { if (!isOnRenderThread()) { throw new IllegalStateException("Program queries must be on render thread"); } @@ -832,18 +835,51 @@ public final class RenderSystem { } public static ByteBuffer loadFont(String fontFileName) throws IOException { - Path path = Path.of("C:/Windows/Fonts/" + fontFileName); - try (FileChannel fc = FileChannel.open(path, StandardOpenOption.READ)) { - ByteBuffer buffer = ByteBuffer.allocateDirect((int) fc.size()); - while (buffer.hasRemaining()) { - fc.read(buffer); + List possiblePaths = getFontPaths(fontFileName); + + for (Path fontPath : possiblePaths) { + if (Files.exists(fontPath)) { + try (FileChannel fc = FileChannel.open(fontPath, StandardOpenOption.READ)) { + ByteBuffer buffer = ByteBuffer.allocateDirect((int) fc.size()); + while (buffer.hasRemaining()) { + fc.read(buffer); + } + buffer.flip(); + return buffer; + } } - buffer.flip(); - return buffer; } + + logger.warn("无法加载字体: {}", fontFileName); + return null; + } + + private static List getFontPaths(String fontFileName) { + String os = System.getProperty("os.name").toLowerCase(); + List paths = new ArrayList<>(); + + if (os.contains("win")) { + paths.add(Path.of("C:/Windows/Fonts/" + fontFileName)); + for (char drive = 'C'; drive <= 'E'; drive++) { + paths.add(Path.of(drive + ":/Windows/Fonts/" + fontFileName)); + } + } else if (os.contains("mac")) { + paths.add(Path.of(System.getProperty("user.home"), "Library", "Fonts", fontFileName)); + paths.add(Path.of("/Library", "Fonts", fontFileName)); + paths.add(Path.of("/System", "Library", "Fonts", fontFileName)); + } else if (os.contains("nix") || os.contains("nux") || os.contains("aix")) { + paths.add(Path.of("/usr/share/fonts", fontFileName)); + paths.add(Path.of("/usr/local/share/fonts", fontFileName)); + paths.add(Path.of(System.getProperty("user.home"), ".local/share/fonts", fontFileName)); + paths.add(Path.of(System.getProperty("user.home"), ".fonts", fontFileName)); + paths.add(Path.of("/usr/X11R6/lib/X11/fonts", fontFileName)); + } else { + paths.add(Path.of(System.getProperty("user.home"), "fonts", fontFileName)); + } + + return paths; } - // 完整的程序链接方法 public static int linkProgram(int vertexShader, int fragmentShader) { assertOnRenderThread(); @@ -852,7 +888,7 @@ public final class RenderSystem { attachShader(program, fragmentShader); linkProgram(program); - int status = getProgrami(program, GL20.GL_LINK_STATUS); + int status = getProgram(program, GL20.GL_LINK_STATUS); if (status == GL11.GL_FALSE) { String log = getProgramInfoLog(program); deleteProgram(program); @@ -880,7 +916,7 @@ public final class RenderSystem { attachShader(program, fragmentShader); linkProgram(program); - int status = getProgrami(program, GL20.GL_LINK_STATUS); + int status = getProgram(program, GL20.GL_LINK_STATUS); if (status == GL11.GL_FALSE) { String log = getProgramInfoLog(program); deleteProgram(program); diff --git a/src/main/java/com/chuangzhou/vivid2D/render/systems/sources/ShaderManagement.java b/src/main/java/com/chuangzhou/vivid2D/render/systems/sources/ShaderManagement.java index fbcb9c9..aef5604 100644 --- a/src/main/java/com/chuangzhou/vivid2D/render/systems/sources/ShaderManagement.java +++ b/src/main/java/com/chuangzhou/vivid2D/render/systems/sources/ShaderManagement.java @@ -154,7 +154,7 @@ public class ShaderManagement { RenderSystem.linkProgram(programId); // 检查链接状态 - if (RenderSystem.getProgrami(programId, RenderSystem.GL_LINK_STATUS) != RenderSystem.GL_TRUE) { + if (RenderSystem.getProgram(programId, RenderSystem.GL_LINK_STATUS) != RenderSystem.GL_TRUE) { String log = RenderSystem.getProgramInfoLog(programId); RenderSystem.deleteProgram(programId); throw new RuntimeException("着色器程序链接失败 [" + programName + "]:\n" + log); @@ -170,7 +170,7 @@ public class ShaderManagement { * 自定义程序验证方法 */ private static void validateProgram(int programId, String programName) { - int validateStatus = RenderSystem.getProgrami(programId, RenderSystem.GL_VALIDATE_STATUS); + int validateStatus = RenderSystem.getProgram(programId, RenderSystem.GL_VALIDATE_STATUS); if (validateStatus != RenderSystem.GL_TRUE) { String log = RenderSystem.getProgramInfoLog(programId); logger.warn("着色器程序验证警告 [{}]: {}", programName, log); diff --git a/src/main/java/com/chuangzhou/vivid2D/test/ModelLayerPanelTest.java b/src/main/java/com/chuangzhou/vivid2D/test/ModelLayerPanelTest.java index 119b24a..f74e548 100644 --- a/src/main/java/com/chuangzhou/vivid2D/test/ModelLayerPanelTest.java +++ b/src/main/java/com/chuangzhou/vivid2D/test/ModelLayerPanelTest.java @@ -1,12 +1,10 @@ package com.chuangzhou.vivid2D.test; -import com.chuangzhou.vivid2D.render.awt.ModelClickListener; import com.chuangzhou.vivid2D.render.awt.ModelLayerPanel; import com.chuangzhou.vivid2D.render.awt.ModelRenderPanel; import com.chuangzhou.vivid2D.render.awt.TransformPanel; import com.chuangzhou.vivid2D.render.model.Model2D; import com.chuangzhou.vivid2D.render.model.ModelPart; -import com.chuangzhou.vivid2D.render.model.util.Mesh2D; import javax.swing.*; import java.awt.*; @@ -108,19 +106,16 @@ public class ModelLayerPanelTest { frame.add(bottom, BorderLayout.SOUTH); // 添加模型点击监听器,自动更新变换面板的选中部件 - renderPanel.addModelClickListener(new ModelClickListener() { - @Override - public void onModelClicked(Mesh2D mesh, float modelX, float modelY, int screenX, int screenY) { - if (mesh == null) return; - System.out.println("点击了模型:" + mesh.getName() + ",模型坐标:" + modelX + ", " + modelY + ",屏幕坐标:" + screenX + ", " + screenY); + renderPanel.addModelClickListener((mesh, modelX, modelY, screenX, screenY) -> { + if (mesh == null) return; + System.out.println("点击了模型:" + mesh.getName() + ",模型坐标:" + modelX + ", " + modelY + ",屏幕坐标:" + screenX + ", " + screenY); - // 自动更新变换面板的选中部件 - List selectedPart = renderPanel.getSelectedParts(); - transformPanel.setSelectedParts(selectedPart); + // 自动更新变换面板的选中部件 + List selectedPart = renderPanel.getSelectedParts(); + transformPanel.setSelectedParts(selectedPart); - // 切换到变换控制选项卡 - rightTabbedPane.setSelectedIndex(1); - } + // 切换到变换控制选项卡 + rightTabbedPane.setSelectedIndex(1); }); // 监听窗口关闭,确保释放 GL 资源