Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/main/java/rs117/hd/HdPlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@
import rs117.hd.utils.ResourcePath;
import rs117.hd.utils.ShaderRecompile;
import rs117.hd.utils.buffer.GLBuffer;
import rs117.hd.utils.buffer.GLTextureBuffer;
import rs117.hd.utils.jobs.GenericJob;
import rs117.hd.utils.jobs.JobSystem;

Expand Down Expand Up @@ -901,6 +902,7 @@ public ShaderIncludes getShaderIncludes() {
var includes = new ShaderIncludes()
.addIncludePath(SHADER_PATH)
.addInclude("VERSION_HEADER", OSType.getOSType() == OSType.Linux ? LINUX_VERSION_HEADER : WINDOWS_VERSION_HEADER)
.define("TEXEL_SIZE", GLTextureBuffer.isRGBASupported() ? 4 : 3)
.define("UI_SCALING_MODE", config.uiScalingMode())
.define("COLOR_BLINDNESS", config.colorBlindness())
.define("APPLY_COLOR_FILTER", configColorFilter != ColorFilter.NONE)
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/rs117/hd/opengl/shader/SceneShaderProgram.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@
import static rs117.hd.HdPlugin.TEXTURE_UNIT_GAME;
import static rs117.hd.HdPlugin.TEXTURE_UNIT_SHADOW_MAP;
import static rs117.hd.HdPlugin.TEXTURE_UNIT_TILED_LIGHTING_MAP;
import static rs117.hd.renderer.zone.ZoneRenderer.TEXTURE_UNIT_MODEL_DATA;
import static rs117.hd.renderer.zone.ZoneRenderer.TEXTURE_UNIT_TEXTURED_FACES;

public class SceneShaderProgram extends ShaderProgram {
protected final UniformTexture uniTextureArray = addUniformTexture("textureArray");
protected final UniformTexture uniShadowMap = addUniformTexture("shadowMap");
protected final UniformTexture uniTiledLightingTextureArray = addUniformTexture("tiledLightingArray");
protected final UniformTexture uniTextureFaces = addUniformTexture("textureFaces");
protected final UniformTexture uniModelData = addUniformTexture("modelData");

public SceneShaderProgram() {
super(t -> t
Expand All @@ -25,12 +27,14 @@ protected void initialize() {
uniShadowMap.set(TEXTURE_UNIT_SHADOW_MAP);
uniTiledLightingTextureArray.set(TEXTURE_UNIT_TILED_LIGHTING_MAP);
uniTextureFaces.set(TEXTURE_UNIT_TEXTURED_FACES);
uniModelData.set(TEXTURE_UNIT_MODEL_DATA);
}

public static class Legacy extends SceneShaderProgram {
Legacy() {
shaderTemplate.add(GL_GEOMETRY_SHADER, "scene_geom.glsl");
uniTextureFaces.ignoreMissing = true;
uniModelData.ignoreMissing = true;
}
}
}
5 changes: 5 additions & 0 deletions src/main/java/rs117/hd/opengl/shader/ShadowShaderProgram.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@

import static org.lwjgl.opengl.GL33C.*;
import static rs117.hd.HdPlugin.TEXTURE_UNIT_GAME;
import static rs117.hd.renderer.zone.ZoneRenderer.TEXTURE_UNIT_MODEL_DATA;
import static rs117.hd.renderer.zone.ZoneRenderer.TEXTURE_UNIT_TEXTURED_FACES;

public abstract class ShadowShaderProgram extends ShaderProgram {
protected final UniformTexture uniTextureArray = addUniformTexture("textureArray");
protected final UniformTexture uniTextureFaces = addUniformTexture("textureFaces");
protected final UniformTexture uniModelData = addUniformTexture("modelData");

protected ShadowMode mode;

Expand All @@ -23,6 +25,7 @@ public abstract class ShadowShaderProgram extends ShaderProgram {
protected void initialize() {
uniTextureArray.set(TEXTURE_UNIT_GAME);
uniTextureFaces.set(TEXTURE_UNIT_TEXTURED_FACES);
uniModelData.set(TEXTURE_UNIT_MODEL_DATA);
}

@Override
Expand All @@ -47,6 +50,8 @@ public static class Legacy extends ShadowShaderProgram {
public Legacy setMode(ShadowMode mode) {
this.mode = mode;
uniTextureArray.ignoreMissing = mode != ShadowMode.DETAILED;
uniTextureFaces.ignoreMissing = true;
uniModelData.ignoreMissing = true;
return this;
}

Expand Down
45 changes: 30 additions & 15 deletions src/main/java/rs117/hd/renderer/zone/DynamicModelVAO.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import static rs117.hd.HdPlugin.NVIDIA_GPU;
import static rs117.hd.HdPlugin.SUPPORTS_INDIRECT_DRAW;
import static rs117.hd.HdPlugin.SUPPORTS_STORAGE_BUFFERS;
import static rs117.hd.renderer.zone.ZoneRenderer.TEXTURE_UNIT_MODEL_DATA;
import static rs117.hd.renderer.zone.ZoneRenderer.TEXTURE_UNIT_TEXTURED_FACES;
import static rs117.hd.utils.MathUtils.*;
import static rs117.hd.utils.buffer.GLBuffer.STORAGE_IMMUTABLE;
Expand Down Expand Up @@ -44,13 +45,15 @@ public class DynamicModelVAO implements Destructible {

private final GLBuffer vboRender;
private final GLBuffer vboStaging;
private final GLTextureBuffer tbo;
private final GLTextureBuffer tboF;
private final GLTextureBuffer tboM;

private final ArrayDeque<View> usedViews = new ArrayDeque<>();
private final ArrayDeque<View> freeViews = new ArrayDeque<>();

private final GLMappedBufferIntWriter vboWriter;
private final GLMappedBufferIntWriter tboWriter;
private final GLMappedBufferIntWriter tboFWriter;
private final GLMappedBufferIntWriter tboMWriter;

private boolean isMapped = false;
private int[] drawOffsets = new int[16];
Expand Down Expand Up @@ -81,15 +84,18 @@ public class DynamicModelVAO implements Destructible {
}
this.vboWriter = new GLMappedBufferIntWriter(this.vboStaging);

this.tbo = new GLTextureBuffer("VAO::TBO::" + name, GL_STREAM_DRAW, STORAGE_PERSISTENT | STORAGE_IMMUTABLE | STORAGE_WRITE);
this.tboWriter = new GLMappedBufferIntWriter(this.tbo);
this.tboF = new GLTextureBuffer("VAO::TexturedFaces::" + name, GL_STREAM_DRAW, STORAGE_PERSISTENT | STORAGE_IMMUTABLE | STORAGE_WRITE);
this.tboM = new GLTextureBuffer("VAO::ModelData::" + name, GL_STREAM_DRAW, STORAGE_PERSISTENT | STORAGE_IMMUTABLE | STORAGE_WRITE);
this.tboFWriter = new GLMappedBufferIntWriter(this.tboF);
this.tboMWriter = new GLMappedBufferIntWriter(this.tboM);
}

public boolean hasStagingBuffer() { return vboRender != vboStaging; }

void initialize() {
vao = glGenVertexArrays();
tbo.initialize(INITIAL_SIZE);
tboF.initialize(INITIAL_SIZE);
tboM.initialize(INITIAL_SIZE);
vboRender.initialize(INITIAL_SIZE);
if (vboRender != vboStaging)
vboStaging.initialize(INITIAL_SIZE);
Expand Down Expand Up @@ -143,7 +149,8 @@ void bindRenderVAO() {

void map() {
vboWriter.map(false);
tboWriter.map(false);
tboFWriter.map(false);
tboMWriter.map(false);

reset();
isMapped = true;
Expand All @@ -152,7 +159,8 @@ void map() {
synchronized void unmap(boolean coalesce) {
final int renderVBOId = vboRender.id;
long vboWrittenBytes = vboWriter.flush();
tboWriter.flush();
tboFWriter.flush();
tboMWriter.flush();

if (drawRangeCount > 0) {
mergeRanges();
Expand Down Expand Up @@ -192,10 +200,12 @@ synchronized void unmap(boolean coalesce) {
@Override
public void destroy() {
vboWriter.destroy();
tboWriter.destroy();
tboFWriter.destroy();
tboMWriter.destroy();
vboRender.destroy();
vboStaging.destroy();
tbo.destroy();
tboF.destroy();
tboM.destroy();

if (vao != 0)
glDeleteVertexArrays(vao);
Expand Down Expand Up @@ -231,9 +241,11 @@ public synchronized View beginDraw(int drawIdx, int faceCount) {
if (view == null)
view = new View();
view.vbo = vboWriter.reserve(faceCount * 3 * VERT_SIZE_INTS);
view.tbo = tboWriter.reserve(faceCount * 9);
view.tboF = tboFWriter.reserve(faceCount * 4);
view.tboM = tboMWriter.reserve(4);
view.vao = vao;
view.tboTexId = tbo.getTexId();
view.tboFId = tboF.getTexId();
view.tboMId = tboM.getTexId();
view.drawIdx = drawIdx;

return view;
Expand All @@ -252,7 +264,7 @@ private synchronized void endDraw(View view) {

// Clear ReservedViews before returning to pool
view.vbo = null;
view.tbo = null;
view.tboF = null;

usedViews.add(view);
}
Expand Down Expand Up @@ -280,7 +292,8 @@ void draw(CommandBuffer cmd) {
return;

cmd.BindVertexArray(vao);
cmd.BindTextureUnit(GL_TEXTURE_BUFFER, tbo.getTexId(), TEXTURE_UNIT_TEXTURED_FACES);
cmd.BindTextureUnit(GL_TEXTURE_BUFFER, tboF.getTexId(), TEXTURE_UNIT_TEXTURED_FACES);
cmd.BindTextureUnit(GL_TEXTURE_BUFFER, tboM.getTexId(), TEXTURE_UNIT_MODEL_DATA);

if (drawRangeCount == 1) {
if (GL_CAPS.OpenGL40 && SUPPORTS_INDIRECT_DRAW) {
Expand All @@ -307,9 +320,11 @@ void reset() {

public final class View {
public ReservedView vbo;
public ReservedView tbo;
public ReservedView tboF;
public ReservedView tboM;
public int vao;
public int tboTexId;
public int tboFId;
public int tboMId;
private int drawIdx;

public int getStartOffset() {
Expand Down
16 changes: 16 additions & 0 deletions src/main/java/rs117/hd/renderer/zone/ModelStreamingManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -328,12 +328,15 @@ private void uploadTempModel(
(!sceneManager.isRoot(ctx) || zone.inShadowFrustum)
) {
final DynamicModelVAO.View shadowView = ctx.beginDraw(VAO_SHADOW, culledFaces.length);
int shadowModelIdx = SceneUploader.writeModelData(shadowView.tboM.getBuffer(), x, y, z, m, modelOverride);
sceneUploader.uploadTempModel(
culledFaces,
m,
modelOverride,
preOrientation,
orientation,
shadowModelIdx,
shadowModelIdx,
true,
shadowView,
shadowView
Expand All @@ -351,12 +354,17 @@ private void uploadTempModel(
final DynamicModelVAO.View opaqueView = ctx.beginDraw(isPlayer ? VAO_PLAYER : VAO_OPAQUE, drawIndex, opaqueFaceCount);
final DynamicModelVAO.View alphaView = alphaFaceCount > 0 ? ctx.beginDraw(VAO_ALPHA, alphaFaceCount) : opaqueView;

final int opaqueModelIdx = SceneUploader.writeModelData(opaqueView.tboM.getBuffer(), x, y, z, m, modelOverride);
final int alphaModelIdx = alphaFaceCount > 0 ? SceneUploader.writeModelData(alphaView.tboM.getBuffer(), x, y, z, m, modelOverride) : opaqueModelIdx;

sceneUploader.uploadTempModel(
visibleFaces,
m,
modelOverride,
preOrientation,
orientation,
opaqueModelIdx,
alphaModelIdx,
isSquashed,
opaqueView,
alphaView
Expand Down Expand Up @@ -590,12 +598,15 @@ private void uploadDynamicModel(
(!sceneManager.isRoot(ctx) || zone.inShadowFrustum)
) {
final DynamicModelVAO.View shadowView = ctx.beginDraw(VAO_SHADOW, culledFaces.length);
final int shadowModelIdx = SceneUploader.writeModelData(shadowView.tboM.getBuffer(), x, y, z, m, modelOverride);
sceneUploader.uploadTempModel(
culledFaces,
m,
modelOverride,
preOrientation,
orient,
shadowModelIdx,
shadowModelIdx,
true,
shadowView,
shadowView
Expand All @@ -610,12 +621,17 @@ private void uploadDynamicModel(
final DynamicModelVAO.View opaqueView = ctx.beginDraw(VAO_OPAQUE, drawIndex, opaqueFaceCount);
final DynamicModelVAO.View alphaView = alphaFaceCount > 0 ? ctx.beginDraw(VAO_ALPHA, alphaFaceCount) : opaqueView;

final int opaqueModelIdx = SceneUploader.writeModelData(opaqueView.tboM.getBuffer(), x, y, z, m, modelOverride);
final int alphaModelIdx = alphaFaceCount > 0 ? SceneUploader.writeModelData(alphaView.tboM.getBuffer(), x, y, z, m, modelOverride) : opaqueModelIdx;

sceneUploader.uploadTempModel(
visibleFaces,
m,
modelOverride,
preOrientation,
orient,
opaqueModelIdx,
alphaModelIdx,
isSquashed,
opaqueView,
alphaView
Expand Down
Loading