Added color multiplier stack to shaders, fixed dynamic font colors

- ShapeFragment.glsl now declares uniformColorMultiplier, which is used
as an additional fragment color multiplier (independent from VBAs)
  - Managed with a new stack by ShapeRenderHelper
- Fixed dynamic font colors
This commit is contained in:
OLEGSHA 2021-01-05 19:08:53 +03:00
parent d197c0a73e
commit 008e8b33a5
4 changed files with 50 additions and 10 deletions

View File

@ -117,13 +117,13 @@ public abstract class SpriteTypeface extends Typeface {
return output.set(resultWidth, height); return output.set(resultWidth, height);
} }
private Shape createCharShape(char c, Vec4 color) { private Shape createCharShape(char c) {
return new Shape( return new Shape(
Usage.STATIC, getProgram(), Usage.STATIC, getProgram(),
Faces.createRectangle( Faces.createRectangle(
getProgram(), getProgram(),
getTexture(c), getTexture(c),
color, Colors.WHITE,
Vectors.ZERO_3, Vectors.ZERO_3,
new Vec3(getWidth(c), 0, 0), new Vec3(getWidth(c), 0, 0),
new Vec3(0, getHeight(), 0), new Vec3(0, getHeight(), 0),
@ -182,7 +182,7 @@ public abstract class SpriteTypeface extends Typeface {
private Shape getShape(char c) { private Shape getShape(char c) {
Shape shape = charShapes.get(c); Shape shape = charShapes.get(c);
if (shape == null) { if (shape == null) {
shape = createCharShape(c, this.color); shape = createCharShape(c);
charShapes.put(c, shape); charShapes.put(c, shape);
} }
return shape; return shape;
@ -195,14 +195,18 @@ public abstract class SpriteTypeface extends Typeface {
@Override @Override
public void drawChar(char c, Vec4 color, Mat4 transform) { public void drawChar(char c, Vec4 color, Mat4 transform) {
workspace.renderer.pushTransform().mul(transform); workspace.renderer.pushTransform().mul(transform);
workspace.renderer.pushColorMultiplier().mul(color);
getShape(c).render(workspace.renderer); getShape(c).render(workspace.renderer);
workspace.renderer.popColorMultiplier();
workspace.renderer.popTransform(); workspace.renderer.popTransform();
} }
@Override @Override
public void drawRectangle(Vec2 size, Vec4 color, Mat4 transform) { public void drawRectangle(Vec2 size, Vec4 color, Mat4 transform) {
workspace.renderer.pushTransform().mul(transform).scale(size.x, size.y, 1); workspace.renderer.pushTransform().mul(transform).scale(size.x, size.y, 1);
workspace.renderer.pushColorMultiplier().mul(color);
unitLine.render(workspace.renderer); unitLine.render(workspace.renderer);
workspace.renderer.popColorMultiplier();
workspace.renderer.popTransform(); workspace.renderer.popTransform();
} }

View File

@ -18,18 +18,26 @@
package ru.windcorp.progressia.client.graphics.model; package ru.windcorp.progressia.client.graphics.model;
import glm.mat._4.Mat4; import glm.mat._4.Mat4;
import glm.vec._4.Vec4;
import ru.windcorp.progressia.client.graphics.Colors;
import ru.windcorp.progressia.common.util.StashingStack; import ru.windcorp.progressia.common.util.StashingStack;
public class ShapeRenderHelper { public class ShapeRenderHelper {
protected static final int TRANSFORM_STACK_SIZE = 64; protected static final int TRANSFORM_STACK_SIZE = 64;
protected static final int COLOR_MULTIPLIER_STACK_SIZE = TRANSFORM_STACK_SIZE;
protected final StashingStack<Mat4> transformStack = new StashingStack<>( protected final StashingStack<Mat4> transformStack = new StashingStack<>(
TRANSFORM_STACK_SIZE, Mat4::new TRANSFORM_STACK_SIZE, Mat4::new
); );
protected final StashingStack<Vec4> colorMultiplierStack = new StashingStack<>(
COLOR_MULTIPLIER_STACK_SIZE, Vec4::new
);
{ {
transformStack.push().identity(); transformStack.push().identity();
colorMultiplierStack.push().set(Colors.WHITE);
} }
public Mat4 pushTransform() { public Mat4 pushTransform() {
@ -49,9 +57,28 @@ public class ShapeRenderHelper {
return getTransform(); return getTransform();
} }
public Vec4 pushColorMultiplier() {
Vec4 previous = colorMultiplierStack.getHead();
return colorMultiplierStack.push().set(previous);
}
public void popColorMultiplier() {
colorMultiplierStack.removeHead();
}
public Vec4 getColorMultiplier() {
return colorMultiplierStack.getHead();
}
public Vec4 getFinalColorMultiplier() {
return getColorMultiplier();
}
public void reset() { public void reset() {
transformStack.removeAll(); transformStack.removeAll();
transformStack.push().identity(); transformStack.push().identity();
colorMultiplierStack.removeAll();
colorMultiplierStack.push().set(Colors.WHITE);
} }
} }

View File

@ -54,13 +54,15 @@ public class ShapeRenderProgram extends Program {
private static final String private static final String
FINAL_TRANSFORM_UNIFORM_NAME = "finalTransform", FINAL_TRANSFORM_UNIFORM_NAME = "finalTransform",
POSITIONS_ATTRIBUTE_NAME = "inputPositions", POSITIONS_ATTRIBUTE_NAME = "inputPositions",
COLOR_MULTIPLER_ATTRIBUTE_NAME = "inputColorMultiplier", UNIFORM_COLOR_MULTIPLER_ATTRIBUTE_NAME = "uniformColorMultiplier",
ATTRIBUTE_COLOR_MULTIPLER_ATTRIBUTE_NAME = "inputColorMultiplier",
TEXTURE_COORDS_ATTRIBUTE_NAME = "inputTextureCoords", TEXTURE_COORDS_ATTRIBUTE_NAME = "inputTextureCoords",
USE_TEXTURE_UNIFORM_NAME = "useTexture", USE_TEXTURE_UNIFORM_NAME = "useTexture",
TEXTURE_SLOT_UNIFORM_NAME = "textureSlot"; TEXTURE_SLOT_UNIFORM_NAME = "textureSlot";
private final Uniform4Matrix finalTransformUniform; private final Uniform4Matrix finalTransformUniform;
private final AttributeVertexArray positionsAttribute; private final AttributeVertexArray positionsAttribute;
private final Uniform4Float colorsUniform;
private final AttributeVertexArray colorsAttribute; private final AttributeVertexArray colorsAttribute;
private final AttributeVertexArray textureCoordsAttribute; private final AttributeVertexArray textureCoordsAttribute;
private final Uniform1Int useTextureUniform; private final Uniform1Int useTextureUniform;
@ -85,8 +87,11 @@ public class ShapeRenderProgram extends Program {
this.positionsAttribute = this.positionsAttribute =
getAttribute(POSITIONS_ATTRIBUTE_NAME).asVertexArray(); getAttribute(POSITIONS_ATTRIBUTE_NAME).asVertexArray();
this.colorsUniform =
getUniform(UNIFORM_COLOR_MULTIPLER_ATTRIBUTE_NAME).as4Float();
this.colorsAttribute = this.colorsAttribute =
getAttribute(COLOR_MULTIPLER_ATTRIBUTE_NAME).asVertexArray(); getAttribute(ATTRIBUTE_COLOR_MULTIPLER_ATTRIBUTE_NAME).asVertexArray();
this.textureCoordsAttribute = this.textureCoordsAttribute =
getAttribute(TEXTURE_COORDS_ATTRIBUTE_NAME).asVertexArray(); getAttribute(TEXTURE_COORDS_ATTRIBUTE_NAME).asVertexArray();
@ -140,6 +145,7 @@ public class ShapeRenderProgram extends Program {
protected void configure(ShapeRenderHelper helper) { protected void configure(ShapeRenderHelper helper) {
finalTransformUniform.set(helper.getFinalTransform()); finalTransformUniform.set(helper.getFinalTransform());
colorsUniform.set(helper.getFinalColorMultiplier());
} }
protected int bindVertices(VertexBufferObject vertices) { protected int bindVertices(VertexBufferObject vertices) {

View File

@ -1,5 +1,7 @@
#version 120 #version 120
uniform vec4 uniformColorMultiplier;
varying vec4 varyingColorMultiplier; varying vec4 varyingColorMultiplier;
varying vec2 varyingTextureCoords; varying vec2 varyingTextureCoords;
@ -17,6 +19,7 @@ void applyTexture() {
void applyColorMultiplier() { void applyColorMultiplier() {
gl_FragColor *= varyingColorMultiplier; gl_FragColor *= varyingColorMultiplier;
gl_FragColor *= uniformColorMultiplier;
} }
void applyAlpha() { void applyAlpha() {