Fix light support
This commit is contained in:
@@ -27,8 +27,6 @@ public class Material implements Renderable {
|
|||||||
|
|
||||||
if (texture != null) {
|
if (texture != null) {
|
||||||
shaderManager.setUniform(UniformName.UNI_HAS_OBJECT_TEXTURE, true);
|
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);
|
shaderManager.setUniform(UniformName.UNI_TEXTURE_SAMPLER, 0);
|
||||||
texture.activate();
|
texture.activate();
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -8,14 +8,13 @@ import java.util.function.Consumer;
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public enum Shader {
|
public enum Shader {
|
||||||
DEFAULT("default", "/shaders/default.vs", "/shaders/default.fs", shaderManager -> {
|
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_MODEL_MATRIX)
|
||||||
|
.createUniform(UniformName.UNI_VIEW_MODEL_MATRIX)
|
||||||
.createUniform(UniformName.UNI_PROJECTION_MATRIX)
|
.createUniform(UniformName.UNI_PROJECTION_MATRIX)
|
||||||
.createUniform(UniformName.UNI_OBJECT_COLOR)
|
|
||||||
.createUniform(UniformName.UNI_HAS_OBJECT_TEXTURE)
|
.createUniform(UniformName.UNI_HAS_OBJECT_TEXTURE)
|
||||||
|
.createUniform(UniformName.UNI_OBJECT_COLOR)
|
||||||
.createUniform(UniformName.UNI_TEXTURE_SAMPLER)
|
.createUniform(UniformName.UNI_TEXTURE_SAMPLER)
|
||||||
.createUniform(UniformName.UNI_SPRITE_SIZE)
|
|
||||||
.createUniform(UniformName.UNI_SPRITE_POSITION)
|
|
||||||
.createUniform(UniformName.UNI_AMBIENT)
|
.createUniform(UniformName.UNI_AMBIENT)
|
||||||
.createUniform(UniformName.UNI_ACTIVE_LIGHTS)
|
.createUniform(UniformName.UNI_ACTIVE_LIGHTS)
|
||||||
.createCounter(CounterName.LIGHT);
|
.createCounter(CounterName.LIGHT);
|
||||||
@@ -27,13 +26,6 @@ public enum Shader {
|
|||||||
shaderManager.createUniform(UniformName.UNI_LIGHTS + "[" + i + "].linearAttenuation");
|
shaderManager.createUniform(UniformName.UNI_LIGHTS + "[" + i + "].linearAttenuation");
|
||||||
shaderManager.createUniform(UniformName.UNI_LIGHTS + "[" + i + "].quadraticAttenuation");
|
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;
|
public final String name;
|
||||||
|
|||||||
@@ -7,8 +7,6 @@ public interface UniformName {
|
|||||||
String UNI_OBJECT_COLOR = "objectColor";
|
String UNI_OBJECT_COLOR = "objectColor";
|
||||||
String UNI_HAS_OBJECT_TEXTURE = "hasTexture";
|
String UNI_HAS_OBJECT_TEXTURE = "hasTexture";
|
||||||
String UNI_TEXTURE_SAMPLER = "sampler";
|
String UNI_TEXTURE_SAMPLER = "sampler";
|
||||||
String UNI_SPRITE_SIZE = "spriteSize";
|
|
||||||
String UNI_SPRITE_POSITION = "spritePosition";
|
|
||||||
String UNI_LIGHTS = "lights";
|
String UNI_LIGHTS = "lights";
|
||||||
String UNI_ACTIVE_LIGHTS = "activeLights";
|
String UNI_ACTIVE_LIGHTS = "activeLights";
|
||||||
String UNI_AMBIENT = "ambient";
|
String UNI_AMBIENT = "ambient";
|
||||||
|
|||||||
@@ -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.camera.Camera;
|
||||||
import com.bartlomiejpluta.base.api.map.model.GameMap;
|
import com.bartlomiejpluta.base.api.map.model.GameMap;
|
||||||
import com.bartlomiejpluta.base.api.screen.Screen;
|
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.autotile.model.AutoTileSet;
|
||||||
import com.bartlomiejpluta.base.engine.world.map.layer.base.BaseLayer;
|
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 com.bartlomiejpluta.base.internal.render.ShaderManager;
|
||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
import org.joml.Vector2f;
|
import org.joml.Vector2f;
|
||||||
@@ -112,6 +111,7 @@ public abstract class BaseAutoTileLayer extends BaseLayer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
chunkManager.render(screen, camera, shaderManager);
|
chunkManager.render(screen, camera, shaderManager);
|
||||||
// super.render(screen, camera, shaderManager);
|
|
||||||
|
super.render(screen, camera, shaderManager);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -106,19 +106,17 @@ public class DefaultImageLayer extends BaseLayer implements ImageLayer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void render(Screen screen, Camera camera, ShaderManager shaderManager) {
|
public void render(Screen screen, Camera camera, ShaderManager shaderManager) {
|
||||||
if (image != null) {
|
if (parallax) {
|
||||||
if (parallax) {
|
var cameraPosition = camera.getPosition();
|
||||||
var cameraPosition = camera.getPosition();
|
image.setPosition(cameraPosition.x() + x, cameraPosition.y() + y);
|
||||||
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 (mode == ImageLayerMode.FIT_SCREEN) {
|
||||||
|
image.setScale(screen.getWidth() / imageWidth, screen.getHeight() / imageHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
image.render(screen, camera, shaderManager);
|
||||||
|
|
||||||
super.render(screen, camera, shaderManager);
|
super.render(screen, camera, shaderManager);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.layer.tile.TileLayer;
|
||||||
import com.bartlomiejpluta.base.api.map.model.GameMap;
|
import com.bartlomiejpluta.base.api.map.model.GameMap;
|
||||||
import com.bartlomiejpluta.base.api.screen.Screen;
|
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.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.engine.world.tileset.model.TileSet;
|
||||||
import com.bartlomiejpluta.base.internal.render.ShaderManager;
|
import com.bartlomiejpluta.base.internal.render.ShaderManager;
|
||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
|
|
||||||
public class DefaultTileLayer extends BaseLayer implements TileLayer {
|
public class DefaultTileLayer extends BaseLayer implements TileLayer {
|
||||||
private final Texture tileSet;
|
|
||||||
private final ChunkManager chunkManager;
|
private final ChunkManager chunkManager;
|
||||||
|
|
||||||
public DefaultTileLayer(@NonNull GameMap map, @NonNull TileSet tileSet, int rows, int columns) {
|
public DefaultTileLayer(@NonNull GameMap map, @NonNull TileSet tileSet, int rows, int columns) {
|
||||||
super(map);
|
super(map);
|
||||||
|
|
||||||
this.tileSet = tileSet.getTileSet();
|
this.chunkManager = new ChunkManager(tileSet.texture(), rows, columns);
|
||||||
|
|
||||||
this.chunkManager = new ChunkManager(tileSet.getTileSet(), rows, columns);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -35,5 +32,6 @@ public class DefaultTileLayer extends BaseLayer implements TileLayer {
|
|||||||
@Override
|
@Override
|
||||||
public void render(Screen screen, Camera camera, ShaderManager shaderManager) {
|
public void render(Screen screen, Camera camera, ShaderManager shaderManager) {
|
||||||
chunkManager.render(screen, camera, shaderManager);
|
chunkManager.render(screen, camera, shaderManager);
|
||||||
|
super.render(screen, camera, shaderManager);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.camera.Camera;
|
||||||
import com.bartlomiejpluta.base.api.screen.Screen;
|
import com.bartlomiejpluta.base.api.screen.Screen;
|
||||||
@@ -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.camera.Camera;
|
||||||
import com.bartlomiejpluta.base.api.screen.Screen;
|
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.Mesh;
|
||||||
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.QuadTemplate;
|
import com.bartlomiejpluta.base.engine.core.gl.object.mesh.QuadTemplate;
|
||||||
import com.bartlomiejpluta.base.engine.core.gl.object.texture.Texture;
|
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 {
|
public class TileChunk extends Model implements Placeable, Renderable, Disposable, BoundingBox {
|
||||||
private final Texture tileSet;
|
private final Texture tileSet;
|
||||||
|
private final Material material;
|
||||||
private final Mesh mesh;
|
private final Mesh mesh;
|
||||||
private final int chunkSize;
|
private final int chunkSize;
|
||||||
private final QuadTemplate template;
|
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) {
|
public TileChunk(Texture tileSet, int chunkSize, float originX, float originY) {
|
||||||
this.tileSet = tileSet;
|
this.tileSet = tileSet;
|
||||||
|
this.material = Material.textured(tileSet);
|
||||||
this.chunkSize = chunkSize;
|
this.chunkSize = chunkSize;
|
||||||
this.mesh = new Mesh(chunkSize * chunkSize);
|
this.mesh = new Mesh(chunkSize * chunkSize);
|
||||||
this.template = new QuadTemplate(tileSet.getSpriteSize().x(), tileSet.getSpriteSize().y(), originX, originY);
|
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
|
@Override
|
||||||
public void render(Screen screen, Camera camera, ShaderManager shaderManager) {
|
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_PROJECTION_MATRIX, camera.getProjectionMatrix());
|
||||||
shaderManager.setUniform(UniformName.UNI_VIEW_MODEL_MATRIX, camera.computeViewModelMatrix(getModelMatrix()));
|
shaderManager.setUniform(UniformName.UNI_VIEW_MODEL_MATRIX, camera.computeViewModelMatrix(getModelMatrix()));
|
||||||
shaderManager.setUniform(UniformName.UNI_TEXTURE_SAMPLER, 0);
|
|
||||||
|
|
||||||
mesh.render(screen, camera, shaderManager);
|
mesh.render(screen, camera, shaderManager);
|
||||||
shaderManager.deactivateShader();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -81,7 +82,7 @@ public class TileChunk extends Model implements Placeable, Renderable, Disposabl
|
|||||||
@Override
|
@Override
|
||||||
public float getMaxX() {
|
public float getMaxX() {
|
||||||
float scaledOriginX = originX * scaleX;
|
float scaledOriginX = originX * scaleX;
|
||||||
float scaledChunkWidth = chunkSize * tileSet.getSpriteSize().x() *scaleX;
|
float scaledChunkWidth = chunkSize * tileSet.getSpriteSize().x() * scaleX;
|
||||||
return getPosition().x() + scaledChunkWidth - scaledOriginX;
|
return getPosition().x() + scaledChunkWidth - scaledOriginX;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,15 +92,12 @@ public abstract class Sprite extends LocationableModel implements Renderable, Bo
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
material.getTexture().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_PROJECTION_MATRIX, camera.getProjectionMatrix());
|
||||||
shaderManager.setUniform(UniformName.UNI_VIEW_MODEL_MATRIX, camera.computeViewModelMatrix(getModelMatrix()));
|
shaderManager.setUniform(UniformName.UNI_VIEW_MODEL_MATRIX, camera.computeViewModelMatrix(getModelMatrix()));
|
||||||
shaderManager.setUniform(UniformName.UNI_TEXTURE_SAMPLER, 0);
|
|
||||||
|
|
||||||
quad.render(screen, camera, shaderManager);
|
quad.render(screen, camera, shaderManager);
|
||||||
|
|
||||||
shaderManager.deactivateShader();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,25 +1,7 @@
|
|||||||
package com.bartlomiejpluta.base.engine.world.tileset.model;
|
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 com.bartlomiejpluta.base.engine.core.gl.object.texture.Texture;
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
|
|
||||||
@Getter
|
public record TileSet(@NonNull Texture texture) {
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
@@ -25,7 +25,7 @@ out vec4 fragColor;
|
|||||||
|
|
||||||
void main()
|
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);
|
vec4 total = vec4(color.rgb * ambient, color.a);
|
||||||
|
|
||||||
for(int i=0; i<activeLights; ++i)
|
for(int i=0; i<activeLights; ++i)
|
||||||
|
|||||||
Reference in New Issue
Block a user