From b3f8bb10798225f4a87f078bd19205b5bd46b2e1 Mon Sep 17 00:00:00 2001 From: zbx1425 Date: Sat, 8 Jun 2024 14:18:40 +0800 Subject: [PATCH] Add DynamicModelHolder --- .../render/scripting/ScriptHolder.java | 2 +- .../eyecandy/EyeCandyScriptContext.java | 1 + .../scripting/train/TrainScriptContext.java | 2 ++ .../scripting/util/DynamicModelHolder.java | 36 +++++++++++++++++++ .../zbx1425/sowcerext/model/ModelCluster.java | 17 +++++++++ .../model/integration/RawMeshBuilder.java | 17 ++++++--- .../model/integration/RawModelBuilder.java | 17 --------- 7 files changed, 70 insertions(+), 22 deletions(-) create mode 100644 common/src/main/java/cn/zbx1425/mtrsteamloco/render/scripting/util/DynamicModelHolder.java delete mode 100644 common/src/main/java/cn/zbx1425/sowcerext/model/integration/RawModelBuilder.java diff --git a/common/src/main/java/cn/zbx1425/mtrsteamloco/render/scripting/ScriptHolder.java b/common/src/main/java/cn/zbx1425/mtrsteamloco/render/scripting/ScriptHolder.java index c4cd6419..45cadaa3 100644 --- a/common/src/main/java/cn/zbx1425/mtrsteamloco/render/scripting/ScriptHolder.java +++ b/common/src/main/java/cn/zbx1425/mtrsteamloco/render/scripting/ScriptHolder.java @@ -16,7 +16,6 @@ import net.minecraft.server.packs.resources.ResourceManager; import vendor.cn.zbx1425.mtrsteamloco.org.mozilla.javascript.*; -import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -68,6 +67,7 @@ public void load(String name, String contextTypeName, ResourceManager resourceMa scope.put("RawModel", scope, new NativeJavaClass(scope, RawModel.class)); scope.put("RawMesh", scope, new NativeJavaClass(scope, RawMesh.class)); scope.put("RawMeshBuilder", scope, new NativeJavaClass(scope, RawMeshBuilder.class)); + scope.put("DynamicModelHolder", scope, new NativeJavaClass(scope, DynamicModelHolder.class)); scope.put("Matrices", scope, new NativeJavaClass(scope, Matrices.class)); scope.put("Matrix4f", scope, new NativeJavaClass(scope, Matrix4f.class)); scope.put("Vector3f", scope, new NativeJavaClass(scope, Vector3f.class)); diff --git a/common/src/main/java/cn/zbx1425/mtrsteamloco/render/scripting/eyecandy/EyeCandyScriptContext.java b/common/src/main/java/cn/zbx1425/mtrsteamloco/render/scripting/eyecandy/EyeCandyScriptContext.java index 464a1bd2..ed4e2c67 100644 --- a/common/src/main/java/cn/zbx1425/mtrsteamloco/render/scripting/eyecandy/EyeCandyScriptContext.java +++ b/common/src/main/java/cn/zbx1425/mtrsteamloco/render/scripting/eyecandy/EyeCandyScriptContext.java @@ -43,6 +43,7 @@ public boolean isBearerAlive() { } public void drawModel(ModelCluster model, Matrices poseStack) { + if (model == null) return; scriptResultWriting.addModel(model, poseStack == null ? Matrix4f.IDENTITY : poseStack.last().copy()); } diff --git a/common/src/main/java/cn/zbx1425/mtrsteamloco/render/scripting/train/TrainScriptContext.java b/common/src/main/java/cn/zbx1425/mtrsteamloco/render/scripting/train/TrainScriptContext.java index 692a9d75..439e1898 100644 --- a/common/src/main/java/cn/zbx1425/mtrsteamloco/render/scripting/train/TrainScriptContext.java +++ b/common/src/main/java/cn/zbx1425/mtrsteamloco/render/scripting/train/TrainScriptContext.java @@ -66,10 +66,12 @@ public void extraFinished() { } public void drawCarModel(ModelCluster model, int carIndex, Matrices poseStack) { + if (model == null) return; scriptResultWriting.addCarModel(carIndex, model, poseStack == null ? Matrix4f.IDENTITY : poseStack.last().copy()); } public void drawConnModel(ModelCluster model, int carIndex, Matrices poseStack) { + if (model == null) return; scriptResultWriting.addConnModel(carIndex, model, poseStack == null ? Matrix4f.IDENTITY : poseStack.last().copy()); } diff --git a/common/src/main/java/cn/zbx1425/mtrsteamloco/render/scripting/util/DynamicModelHolder.java b/common/src/main/java/cn/zbx1425/mtrsteamloco/render/scripting/util/DynamicModelHolder.java new file mode 100644 index 00000000..b0cb461e --- /dev/null +++ b/common/src/main/java/cn/zbx1425/mtrsteamloco/render/scripting/util/DynamicModelHolder.java @@ -0,0 +1,36 @@ +package cn.zbx1425.mtrsteamloco.render.scripting.util; + +import cn.zbx1425.sowcer.util.GlStateTracker; +import cn.zbx1425.sowcerext.model.ModelCluster; +import cn.zbx1425.sowcerext.model.RawModel; +import cn.zbx1425.sowcerext.reuse.ModelManager; +import com.mojang.blaze3d.systems.RenderSystem; + +public class DynamicModelHolder { + + private static ModelCluster uploadedModel; + + public void uploadLater(RawModel rawModel) { + RawModel finalRawModel = rawModel.copyForMaterialChanges(); + finalRawModel.sourceLocation = null; + RenderSystem.recordRenderCall(() -> { + boolean needProtection = !GlStateTracker.isStateProtected; + if (needProtection) GlStateTracker.capture(); + uploadedModel = new ModelCluster(finalRawModel, ModelManager.DEFAULT_MAPPING); + if (needProtection) GlStateTracker.restore(); + }); + } + + public ModelCluster getUploadedModel() { + return uploadedModel; + } + + public void close() { + RenderSystem.recordRenderCall(() -> { + if (uploadedModel != null) { + uploadedModel.close(); + uploadedModel = null; + } + }); + } +} diff --git a/common/src/main/java/cn/zbx1425/sowcerext/model/ModelCluster.java b/common/src/main/java/cn/zbx1425/sowcerext/model/ModelCluster.java index f44ed4bb..75eb6644 100644 --- a/common/src/main/java/cn/zbx1425/sowcerext/model/ModelCluster.java +++ b/common/src/main/java/cn/zbx1425/sowcerext/model/ModelCluster.java @@ -38,6 +38,23 @@ public ModelCluster(RawModel source, VertAttrMapping mapping, ModelManager model modelManager.uploadModel(translucentParts), mapping, null); } + public ModelCluster(RawModel source, VertAttrMapping mapping) { + // Untracked variant + this.translucentParts = new RawModel(); + this.opaqueParts = new RawModel(); + for (RawMesh mesh : source.meshList.values()) { + if (mesh.materialProp.translucent) { + translucentParts.append(mesh); + } else { + opaqueParts.append(mesh); + } + } + this.uploadedOpaqueParts = VertArrays.createAll( + opaqueParts.upload(mapping), mapping, null); + this.uploadedTranslucentParts = VertArrays.createAll( + translucentParts.upload(mapping), mapping, null); + } + private ModelCluster(VertArrays uploadedOpaqueParts, RawModel opaqueParts, VertArrays uploadedTranslucentParts, RawModel translucentParts) { this.uploadedOpaqueParts = uploadedOpaqueParts; this.opaqueParts = opaqueParts; diff --git a/common/src/main/java/cn/zbx1425/sowcerext/model/integration/RawMeshBuilder.java b/common/src/main/java/cn/zbx1425/sowcerext/model/integration/RawMeshBuilder.java index 19ef25e9..6aca9666 100644 --- a/common/src/main/java/cn/zbx1425/sowcerext/model/integration/RawMeshBuilder.java +++ b/common/src/main/java/cn/zbx1425/sowcerext/model/integration/RawMeshBuilder.java @@ -21,6 +21,7 @@ public RawMeshBuilder(int faceSize, String renderType, ResourceLocation texture) this.mesh = new RawMesh(new MaterialProp()); mesh.setRenderType(renderType); mesh.materialProp.texture = texture; + mesh.materialProp.attrState.setColor(255, 255, 255, 255); } public RawMesh getMesh() { @@ -30,7 +31,7 @@ public RawMesh getMesh() { public RawMeshBuilder reset() { mesh.vertices.clear(); mesh.faces.clear(); - buildingVertex = new Vertex(); + setNewDefaultVertex(); return this; } @@ -55,12 +56,13 @@ public RawMeshBuilder uv(float f, float g) { return this; } - public void endVertex() { + public RawMeshBuilder endVertex() { mesh.vertices.add(buildingVertex); - buildingVertex = new Vertex(); + setNewDefaultVertex(); if (mesh.vertices.size() % faceSize == 0) { - mesh.faces.add(new Face(IntStream.range(mesh.vertices.size() - faceSize, mesh.vertices.size()).toArray())); + mesh.faces.addAll(Face.triangulate(IntStream.range(mesh.vertices.size() - faceSize, mesh.vertices.size()).toArray(), false)); } + return this; } public RawMeshBuilder color(int r, int g, int b, int a) { @@ -72,4 +74,11 @@ public RawMeshBuilder lightMapUV(short u, short v) { mesh.materialProp.attrState.setLightmapUV(u, v); return this; } + + private void setNewDefaultVertex() { + buildingVertex = new Vertex(); + buildingVertex.normal = new Vector3f(0, 1, 0); + buildingVertex.u = 0; + buildingVertex.v = 0; + } } diff --git a/common/src/main/java/cn/zbx1425/sowcerext/model/integration/RawModelBuilder.java b/common/src/main/java/cn/zbx1425/sowcerext/model/integration/RawModelBuilder.java deleted file mode 100644 index 62e443fb..00000000 --- a/common/src/main/java/cn/zbx1425/sowcerext/model/integration/RawModelBuilder.java +++ /dev/null @@ -1,17 +0,0 @@ -package cn.zbx1425.sowcerext.model.integration; - -import cn.zbx1425.sowcerext.model.RawModel; -import com.mojang.blaze3d.vertex.VertexConsumer; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; - -public class RawModelBuilder implements MultiBufferSource { - - public RawModel model; - - @Override - public VertexConsumer getBuffer(RenderType renderType) { - - return null; - } -}