Fix light support

This commit is contained in:
2025-07-20 12:46:27 +02:00
parent 9f463cf553
commit 39a91ad4ac
13 changed files with 30 additions and 96 deletions

View File

@@ -27,8 +27,6 @@ public class Material implements Renderable {
if (texture != null) {
shaderManager.setUniform(UniformName.UNI_HAS_OBJECT_TEXTURE, true);
shaderManager.setUniform(UniformName.UNI_SPRITE_SIZE, texture.getSpriteFragment());
shaderManager.setUniform(UniformName.UNI_SPRITE_POSITION, spritePosition);
shaderManager.setUniform(UniformName.UNI_TEXTURE_SAMPLER, 0);
texture.activate();
} else {

View File

@@ -8,14 +8,13 @@ import java.util.function.Consumer;
@RequiredArgsConstructor
public enum Shader {
DEFAULT("default", "/shaders/default.vs", "/shaders/default.fs", shaderManager -> {
shaderManager.createUniform(UniformName.UNI_VIEW_MODEL_MATRIX)
shaderManager
.createUniform(UniformName.UNI_MODEL_MATRIX)
.createUniform(UniformName.UNI_VIEW_MODEL_MATRIX)
.createUniform(UniformName.UNI_PROJECTION_MATRIX)
.createUniform(UniformName.UNI_OBJECT_COLOR)
.createUniform(UniformName.UNI_HAS_OBJECT_TEXTURE)
.createUniform(UniformName.UNI_OBJECT_COLOR)
.createUniform(UniformName.UNI_TEXTURE_SAMPLER)
.createUniform(UniformName.UNI_SPRITE_SIZE)
.createUniform(UniformName.UNI_SPRITE_POSITION)
.createUniform(UniformName.UNI_AMBIENT)
.createUniform(UniformName.UNI_ACTIVE_LIGHTS)
.createCounter(CounterName.LIGHT);
@@ -27,13 +26,6 @@ public enum Shader {
shaderManager.createUniform(UniformName.UNI_LIGHTS + "[" + i + "].linearAttenuation");
shaderManager.createUniform(UniformName.UNI_LIGHTS + "[" + i + "].quadraticAttenuation");
}
}),
BATCH("batch", "/shaders/batch.vs", "/shaders/batch.fs", shaderManager -> {
shaderManager
.createUniform(UniformName.UNI_VIEW_MODEL_MATRIX)
.createUniform(UniformName.UNI_PROJECTION_MATRIX)
.createUniform(UniformName.UNI_TEXTURE_SAMPLER);
});
public final String name;

View File

@@ -7,8 +7,6 @@ public interface UniformName {
String UNI_OBJECT_COLOR = "objectColor";
String UNI_HAS_OBJECT_TEXTURE = "hasTexture";
String UNI_TEXTURE_SAMPLER = "sampler";
String UNI_SPRITE_SIZE = "spriteSize";
String UNI_SPRITE_POSITION = "spritePosition";
String UNI_LIGHTS = "lights";
String UNI_ACTIVE_LIGHTS = "activeLights";
String UNI_AMBIENT = "ambient";

View File

@@ -3,10 +3,9 @@ package com.bartlomiejpluta.base.engine.world.map.layer.autotile;
import com.bartlomiejpluta.base.api.camera.Camera;
import com.bartlomiejpluta.base.api.map.model.GameMap;
import com.bartlomiejpluta.base.api.screen.Screen;
import com.bartlomiejpluta.base.engine.core.gl.object.texture.Texture;
import com.bartlomiejpluta.base.engine.world.autotile.model.AutoTileSet;
import com.bartlomiejpluta.base.engine.world.map.layer.base.BaseLayer;
import com.bartlomiejpluta.base.engine.world.map.layer.tile.ChunkManager;
import com.bartlomiejpluta.base.engine.world.map.layer.util.ChunkManager;
import com.bartlomiejpluta.base.internal.render.ShaderManager;
import lombok.NonNull;
import org.joml.Vector2f;
@@ -112,6 +111,7 @@ public abstract class BaseAutoTileLayer extends BaseLayer {
}
chunkManager.render(screen, camera, shaderManager);
// super.render(screen, camera, shaderManager);
super.render(screen, camera, shaderManager);
}
}

View File

@@ -106,19 +106,17 @@ public class DefaultImageLayer extends BaseLayer implements ImageLayer {
@Override
public void render(Screen screen, Camera camera, ShaderManager shaderManager) {
if (image != null) {
if (parallax) {
var cameraPosition = camera.getPosition();
image.setPosition(cameraPosition.x() + x, cameraPosition.y() + y);
}
if (mode == ImageLayerMode.FIT_SCREEN) {
image.setScale(screen.getWidth() / imageWidth, screen.getHeight() / imageHeight);
}
image.render(screen, camera, shaderManager);
if (parallax) {
var cameraPosition = camera.getPosition();
image.setPosition(cameraPosition.x() + x, cameraPosition.y() + y);
}
if (mode == ImageLayerMode.FIT_SCREEN) {
image.setScale(screen.getWidth() / imageWidth, screen.getHeight() / imageHeight);
}
image.render(screen, camera, shaderManager);
super.render(screen, camera, shaderManager);
}
}

View File

@@ -4,22 +4,19 @@ import com.bartlomiejpluta.base.api.camera.Camera;
import com.bartlomiejpluta.base.api.map.layer.tile.TileLayer;
import com.bartlomiejpluta.base.api.map.model.GameMap;
import com.bartlomiejpluta.base.api.screen.Screen;
import com.bartlomiejpluta.base.engine.core.gl.object.texture.Texture;
import com.bartlomiejpluta.base.engine.world.map.layer.base.BaseLayer;
import com.bartlomiejpluta.base.engine.world.map.layer.util.ChunkManager;
import com.bartlomiejpluta.base.engine.world.tileset.model.TileSet;
import com.bartlomiejpluta.base.internal.render.ShaderManager;
import lombok.NonNull;
public class DefaultTileLayer extends BaseLayer implements TileLayer {
private final Texture tileSet;
private final ChunkManager chunkManager;
public DefaultTileLayer(@NonNull GameMap map, @NonNull TileSet tileSet, int rows, int columns) {
super(map);
this.tileSet = tileSet.getTileSet();
this.chunkManager = new ChunkManager(tileSet.getTileSet(), rows, columns);
this.chunkManager = new ChunkManager(tileSet.texture(), rows, columns);
}
@Override
@@ -35,5 +32,6 @@ public class DefaultTileLayer extends BaseLayer implements TileLayer {
@Override
public void render(Screen screen, Camera camera, ShaderManager shaderManager) {
chunkManager.render(screen, camera, shaderManager);
super.render(screen, camera, shaderManager);
}
}

View File

@@ -1,4 +1,4 @@
package com.bartlomiejpluta.base.engine.world.map.layer.tile;
package com.bartlomiejpluta.base.engine.world.map.layer.util;
import com.bartlomiejpluta.base.api.camera.Camera;
import com.bartlomiejpluta.base.api.screen.Screen;

View File

@@ -1,7 +1,8 @@
package com.bartlomiejpluta.base.engine.world.map.layer.tile;
package com.bartlomiejpluta.base.engine.world.map.layer.util;
import com.bartlomiejpluta.base.api.camera.Camera;
import com.bartlomiejpluta.base.api.screen.Screen;
import com.bartlomiejpluta.base.engine.core.gl.object.material.Material;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.Mesh;
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.QuadTemplate;
import com.bartlomiejpluta.base.engine.core.gl.object.texture.Texture;
@@ -16,6 +17,7 @@ import com.bartlomiejpluta.base.internal.render.ShaderManager;
public class TileChunk extends Model implements Placeable, Renderable, Disposable, BoundingBox {
private final Texture tileSet;
private final Material material;
private final Mesh mesh;
private final int chunkSize;
private final QuadTemplate template;
@@ -28,6 +30,7 @@ public class TileChunk extends Model implements Placeable, Renderable, Disposabl
public TileChunk(Texture tileSet, int chunkSize, float originX, float originY) {
this.tileSet = tileSet;
this.material = Material.textured(tileSet);
this.chunkSize = chunkSize;
this.mesh = new Mesh(chunkSize * chunkSize);
this.template = new QuadTemplate(tileSet.getSpriteSize().x(), tileSet.getSpriteSize().y(), originX, originY);
@@ -61,15 +64,13 @@ public class TileChunk extends Model implements Placeable, Renderable, Disposabl
@Override
public void render(Screen screen, Camera camera, ShaderManager shaderManager) {
tileSet.activate();
material.render(screen, camera, shaderManager);
shaderManager.activateShader(Shader.BATCH.name);
shaderManager.setUniform(UniformName.UNI_MODEL_MATRIX, getModelMatrix());
shaderManager.setUniform(UniformName.UNI_PROJECTION_MATRIX, camera.getProjectionMatrix());
shaderManager.setUniform(UniformName.UNI_VIEW_MODEL_MATRIX, camera.computeViewModelMatrix(getModelMatrix()));
shaderManager.setUniform(UniformName.UNI_TEXTURE_SAMPLER, 0);
mesh.render(screen, camera, shaderManager);
shaderManager.deactivateShader();
}
@Override
@@ -81,7 +82,7 @@ public class TileChunk extends Model implements Placeable, Renderable, Disposabl
@Override
public float getMaxX() {
float scaledOriginX = originX * scaleX;
float scaledChunkWidth = chunkSize * tileSet.getSpriteSize().x() *scaleX;
float scaledChunkWidth = chunkSize * tileSet.getSpriteSize().x() * scaleX;
return getPosition().x() + scaledChunkWidth - scaledOriginX;
}

View File

@@ -92,15 +92,12 @@ public abstract class Sprite extends LocationableModel implements Renderable, Bo
return;
}
material.getTexture().activate();
shaderManager.activateShader(Shader.BATCH.name);
material.render(screen, camera, shaderManager);
shaderManager.setUniform(UniformName.UNI_MODEL_MATRIX, getModelMatrix());
shaderManager.setUniform(UniformName.UNI_PROJECTION_MATRIX, camera.getProjectionMatrix());
shaderManager.setUniform(UniformName.UNI_VIEW_MODEL_MATRIX, camera.computeViewModelMatrix(getModelMatrix()));
shaderManager.setUniform(UniformName.UNI_TEXTURE_SAMPLER, 0);
quad.render(screen, camera, shaderManager);
shaderManager.deactivateShader();
}
}

View File

@@ -1,25 +1,7 @@
package com.bartlomiejpluta.base.engine.world.tileset.model;
import com.bartlomiejpluta.base.engine.core.gl.object.material.Material;
import com.bartlomiejpluta.base.engine.core.gl.object.texture.Texture;
import lombok.Getter;
import lombok.NonNull;
@Getter
public class TileSet {
private final Texture tileSet;
private final Material material;
public TileSet(@NonNull Texture tileSet) {
this.tileSet = tileSet;
this.material = Material.textured(tileSet);
}
public Tile tileById(int id) {
return new Tile(tileSet, id);
}
public Tile tileAt(int row, int column) {
return new Tile(tileSet, row, column);
}
public record TileSet(@NonNull Texture texture) {
}

View File

@@ -1,15 +0,0 @@
#version 330
in vec2 fragmentTexCoord;
uniform sampler2D sampler;
out vec4 fragColor;
void main() {
fragColor = texture(sampler, fragmentTexCoord);
if (fragColor.a < 0.1) {
discard;
}
}

View File

@@ -1,15 +0,0 @@
#version 330
uniform mat4 viewModelMatrix;
uniform mat4 projectionMatrix;
layout(location=0) in vec2 position;
layout(location=1) in vec2 texCoord;
out vec2 fragmentTexCoord;
void main()
{
gl_Position = projectionMatrix * viewModelMatrix * vec4(position, 0.0, 1.0);
fragmentTexCoord = texCoord;
}

View File

@@ -25,7 +25,7 @@ out vec4 fragColor;
void main()
{
vec4 color = hasTexture == 1 ? objectColor * texture(sampler, fragmentTexCoord * spriteSize + spritePosition) : objectColor;
vec4 color = hasTexture == 1 ? objectColor * texture(sampler, fragmentTexCoord) : objectColor;
vec4 total = vec4(color.rgb * ambient, color.a);
for(int i=0; i<activeLights; ++i)