From bc1007aa59fbf921b5fa944a93effd9e181c1c90 Mon Sep 17 00:00:00 2001 From: utkabobr Date: Sun, 6 Apr 2025 21:24:47 +0300 Subject: [PATCH] Use instanced shaders manager --- .../ru/ytkab0bp/slicebeam/SetupActivity.java | 7 ++++-- .../ytkab0bp/slicebeam/render/CoordAxes.java | 6 ++--- .../ytkab0bp/slicebeam/render/GLRenderer.java | 17 ++++++++----- .../ru/ytkab0bp/slicebeam/slic3r/Bed3D.java | 14 +++++------ .../slicebeam/slic3r/GLShadersManager.java | 25 +++++++++++++++---- 5 files changed, 46 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/ru/ytkab0bp/slicebeam/SetupActivity.java b/app/src/main/java/ru/ytkab0bp/slicebeam/SetupActivity.java index 4dee6a6..50b06d5 100644 --- a/app/src/main/java/ru/ytkab0bp/slicebeam/SetupActivity.java +++ b/app/src/main/java/ru/ytkab0bp/slicebeam/SetupActivity.java @@ -143,6 +143,7 @@ public class SetupActivity extends AppCompatActivity { private GLSurfaceView backgroundView; private GLModel backgroundModel; + private GLShadersManager shadersManager; private int titleY; private float backgroundProgress; @@ -396,7 +397,8 @@ public class SetupActivity extends AppCompatActivity { super.surfaceDestroyed(holder); backgroundModel.release(); backgroundModel = null; - GLShadersManager.clearShaders(); + shadersManager.clearShaders(); + shadersManager = null; } }; backgroundView.setEGLContextClientVersion(3); @@ -410,6 +412,7 @@ public class SetupActivity extends AppCompatActivity { if (backgroundModel == null) { backgroundModel = new GLModel(); backgroundModel.initBackgroundTriangles(); + shadersManager = new GLShadersManager(); } } @@ -426,7 +429,7 @@ public class SetupActivity extends AppCompatActivity { if (backgroundModel != null) { glDisable(GL_DEPTH_TEST); - GLShaderProgram shader = GLShadersManager.get(GLShadersManager.SHADER_BEAM_INTRO); + GLShaderProgram shader = shadersManager.get(GLShadersManager.SHADER_BEAM_INTRO); shader.startUsing(); int topColor = ThemesRepo.getColor(android.R.attr.colorAccent); int bottomColor = ThemesRepo.getColor(android.R.attr.windowBackground); diff --git a/app/src/main/java/ru/ytkab0bp/slicebeam/render/CoordAxes.java b/app/src/main/java/ru/ytkab0bp/slicebeam/render/CoordAxes.java index 28fa4ff..48b78cb 100644 --- a/app/src/main/java/ru/ytkab0bp/slicebeam/render/CoordAxes.java +++ b/app/src/main/java/ru/ytkab0bp/slicebeam/render/CoordAxes.java @@ -39,13 +39,13 @@ public class CoordAxes { arrow.render(); } - public void render(double[] viewMatrix, double[] projectionMatrix, float emissionFactor, float invZoom) { + public void render(GLShadersManager shadersManager, double[] viewMatrix, double[] projectionMatrix, float emissionFactor, float invZoom) { if (!arrow.isInitialized()) { arrow.stilizedArrow(tipRadius, tipLength, stemRadius, stemLength); } - GLShaderProgram currentShader = GLShadersManager.getCurrentShader(); - GLShaderProgram shader = GLShadersManager.get(GLShadersManager.SHADER_GOURAUD_LIGHT); + GLShaderProgram currentShader = shadersManager.getCurrentShader(); + GLShaderProgram shader = shadersManager.get(GLShadersManager.SHADER_GOURAUD_LIGHT); if (currentShader != null) { currentShader.stopUsing(); } diff --git a/app/src/main/java/ru/ytkab0bp/slicebeam/render/GLRenderer.java b/app/src/main/java/ru/ytkab0bp/slicebeam/render/GLRenderer.java index 7e47ca7..707a8c5 100644 --- a/app/src/main/java/ru/ytkab0bp/slicebeam/render/GLRenderer.java +++ b/app/src/main/java/ru/ytkab0bp/slicebeam/render/GLRenderer.java @@ -52,6 +52,7 @@ public class GLRenderer implements GLSurfaceView.Renderer { // Instance values, should be released private Bed3D bed; private int lastConfigUid; + private GLShadersManager shadersManager; private GLModel backgroundModel; private GLModel selectionModel; private List glModels = new ArrayList<>(); @@ -212,7 +213,7 @@ public class GLRenderer implements GLSurfaceView.Renderer { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDisable(GL_DEPTH_TEST); - GLShaderProgram shader = GLShadersManager.get(GLShadersManager.SHADER_BACKGROUND); + GLShaderProgram shader = shadersManager.get(GLShadersManager.SHADER_BACKGROUND); shader.startUsing(); shader.setUniformColor("top_color", ThemesRepo.getColor(R.attr.backgroundColorTop)); shader.setUniformColor("bottom_color", ThemesRepo.getColor(R.attr.backgroundColorBottom)); @@ -225,7 +226,7 @@ public class GLRenderer implements GLSurfaceView.Renderer { configureBed(); } if (bed.isValid()) { - bed.render(bottom, camera.getViewModelMatrix(), projectionMatrix, 1f / camera.getZoom()); + bed.render(shadersManager, bottom, camera.getViewModelMatrix(), projectionMatrix, 1f / camera.getZoom()); } if (isViewerEnabled) { @@ -239,7 +240,7 @@ public class GLRenderer implements GLSurfaceView.Renderer { viewer.render(camera.getViewModelMatrix(), projectionMatrix); } if (viewer == null && model != null) { - shader = GLShadersManager.get(GLShadersManager.SHADER_GOURAUD_LIGHT); + shader = shadersManager.get(GLShadersManager.SHADER_GOURAUD_LIGHT); shader.startUsing(); int color = ThemesRepo.getColor(android.R.attr.colorAccent); int hoverColor = ThemesRepo.getColor(R.attr.modelHoverColor); @@ -301,7 +302,7 @@ public class GLRenderer implements GLSurfaceView.Renderer { if (selected) { shader.stopUsing(); - GLShaderProgram flat = GLShadersManager.get(GLShadersManager.SHADER_FLAT); + GLShaderProgram flat = shadersManager.get(GLShadersManager.SHADER_FLAT); glLineWidth(ViewUtils.dp(1.5f)); flat.startUsing(); @@ -323,7 +324,7 @@ public class GLRenderer implements GLSurfaceView.Renderer { if (isInFlattenMode) { shader.stopUsing(); - GLShaderProgram flat = GLShadersManager.get(GLShadersManager.SHADER_FLAT); + GLShaderProgram flat = shadersManager.get(GLShadersManager.SHADER_FLAT); flat.startUsing(); glEnable(GL_BLEND); @@ -603,6 +604,7 @@ public class GLRenderer implements GLSurfaceView.Renderer { backgroundModel = new GLModel(); backgroundModel.initBackgroundTriangles(); + shadersManager = new GLShadersManager(); if (!bed.isValid()) return; if (cameraIsDirty) { @@ -625,7 +627,10 @@ public class GLRenderer implements GLSurfaceView.Renderer { } public void onDestroy() { - GLShadersManager.clearShaders(); + if (shadersManager != null) { + shadersManager.clearShaders(); + shadersManager = null; + } if (backgroundModel != null) { backgroundModel.release(); backgroundModel = null; diff --git a/app/src/main/java/ru/ytkab0bp/slicebeam/slic3r/Bed3D.java b/app/src/main/java/ru/ytkab0bp/slicebeam/slic3r/Bed3D.java index f2ae7aa..4465d18 100644 --- a/app/src/main/java/ru/ytkab0bp/slicebeam/slic3r/Bed3D.java +++ b/app/src/main/java/ru/ytkab0bp/slicebeam/slic3r/Bed3D.java @@ -83,7 +83,7 @@ public class Bed3D { return triangles.getRaycaster(); } - public void render(boolean bottom, double[] viewModelMatrix, double[] projectionMatrix, float invZoom) { + public void render(GLShadersManager shadersManager, boolean bottom, double[] viewModelMatrix, double[] projectionMatrix, float invZoom) { assertTrue(viewModelMatrix.length == 16); assertTrue(projectionMatrix.length == 16); @@ -92,12 +92,12 @@ public class Bed3D { DoubleMatrix.translateM(modelMatrix, 0, -getVolumeMin().x * 2, -getVolumeMin().y * 2, -getVolumeMin().z); } DoubleMatrix.multiplyMM(outModelMatrix, 0, viewModelMatrix, 0, modelMatrix, 0); - renderDefaultBed(bottom, outModelMatrix, projectionMatrix); - axes.render(viewModelMatrix, projectionMatrix, 0.25f, invZoom); + renderDefaultBed(shadersManager, bottom, outModelMatrix, projectionMatrix); + axes.render(shadersManager, viewModelMatrix, projectionMatrix, 0.25f, invZoom); } - private void renderDefaultBed(boolean bottom, double[] viewModelMatrix, double[] projectionMatrix) { - GLShaderProgram shader = GLShadersManager.get(GLShadersManager.SHADER_FLAT); + private void renderDefaultBed(GLShadersManager shadersManager, boolean bottom, double[] viewModelMatrix, double[] projectionMatrix) { + GLShaderProgram shader = shadersManager.get(GLShadersManager.SHADER_FLAT); shader.startUsing(); shader.setUniformMatrix4fv("view_model_matrix", viewModelMatrix); @@ -126,8 +126,8 @@ public class Bed3D { shader.stopUsing(); } - private void renderTexturedBed(boolean bottom, float[] viewModelMatrix, float[] projectionMatrix) { - GLShaderProgram shader = GLShadersManager.get(GLShadersManager.SHADER_PRINTBED); + private void renderTexturedBed(GLShadersManager shadersManager, boolean bottom, float[] viewModelMatrix, float[] projectionMatrix) { + GLShaderProgram shader = shadersManager.get(GLShadersManager.SHADER_PRINTBED); shader.startUsing(); shader.setUniform3f("view_model_matrix", viewModelMatrix); diff --git a/app/src/main/java/ru/ytkab0bp/slicebeam/slic3r/GLShadersManager.java b/app/src/main/java/ru/ytkab0bp/slicebeam/slic3r/GLShadersManager.java index 64c1b77..64ed2f3 100644 --- a/app/src/main/java/ru/ytkab0bp/slicebeam/slic3r/GLShadersManager.java +++ b/app/src/main/java/ru/ytkab0bp/slicebeam/slic3r/GLShadersManager.java @@ -8,7 +8,9 @@ import androidx.annotation.StringDef; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class GLShadersManager { @@ -52,7 +54,9 @@ public class GLShadersManager { @Retention(RetentionPolicy.SOURCE) public @interface ShaderType {} - private final static Map shaders = new HashMap() { + private final static List managers = new ArrayList<>(); + + private final Map shaders = new HashMap() { @Override public GLShaderProgram get(@Nullable Object key) { GLShaderProgram shader = super.get(key); @@ -61,24 +65,35 @@ public class GLShadersManager { } }; - public static void clearShaders() { + public GLShadersManager() { + managers.add(this); + } + + public void clearShaders() { for (GLShaderProgram program : shaders.values()) { program.release(); } shaders.clear(); + managers.remove(this); } - public static GLShaderProgram get(@ShaderType String key) { + public GLShaderProgram get(@ShaderType String key) { return shaders.get(key); } @Keep private static long getCurrentShaderPointer() { - GLShaderProgram prog = getCurrentShader(); + GLShaderProgram prog = null; + for (GLShadersManager manager : managers) { + prog = manager.getCurrentShader(); + if (prog != null) { + break; + } + } return prog != null ? prog.pointer : 0; } - public static GLShaderProgram getCurrentShader() { + public GLShaderProgram getCurrentShader() { int[] idRef = {0}; GLES30.glGetIntegerv(GLES30.GL_CURRENT_PROGRAM, idRef, 0); int id = idRef[0];