diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/core/gl/object/material/Material.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/core/gl/object/material/Material.java index 2cbc7274..c855931f 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/core/gl/object/material/Material.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/core/gl/object/material/Material.java @@ -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 { diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/core/gl/shader/constant/Shader.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/core/gl/shader/constant/Shader.java index edd7062d..f3f66928 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/core/gl/shader/constant/Shader.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/core/gl/shader/constant/Shader.java @@ -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; diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/core/gl/shader/constant/UniformName.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/core/gl/shader/constant/UniformName.java index eb32964a..ad6dbdc9 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/core/gl/shader/constant/UniformName.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/core/gl/shader/constant/UniformName.java @@ -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"; diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/autotile/BaseAutoTileLayer.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/autotile/BaseAutoTileLayer.java index b6ab9e5b..3cbda7e3 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/autotile/BaseAutoTileLayer.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/autotile/BaseAutoTileLayer.java @@ -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); } } diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/image/DefaultImageLayer.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/image/DefaultImageLayer.java index 587a0c70..173317ba 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/image/DefaultImageLayer.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/image/DefaultImageLayer.java @@ -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); } } diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/tile/DefaultTileLayer.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/tile/DefaultTileLayer.java index 9d3706b6..44195835 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/tile/DefaultTileLayer.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/tile/DefaultTileLayer.java @@ -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); } } diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/tile/ChunkManager.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/util/ChunkManager.java similarity index 98% rename from engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/tile/ChunkManager.java rename to engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/util/ChunkManager.java index 4f025535..efa6a6fd 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/tile/ChunkManager.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/util/ChunkManager.java @@ -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; diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/tile/TileChunk.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/util/TileChunk.java similarity index 90% rename from engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/tile/TileChunk.java rename to engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/util/TileChunk.java index 49c4568a..d8719375 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/tile/TileChunk.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/map/layer/util/TileChunk.java @@ -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; } diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/object/Sprite.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/object/Sprite.java index 7b44900e..f2e809c7 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/object/Sprite.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/object/Sprite.java @@ -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(); } } diff --git a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/tileset/model/TileSet.java b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/tileset/model/TileSet.java index 50a8c2e1..1848653f 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/engine/world/tileset/model/TileSet.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/engine/world/tileset/model/TileSet.java @@ -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) { } diff --git a/engine/src/main/resources/shaders/batch.fs b/engine/src/main/resources/shaders/batch.fs deleted file mode 100644 index 483cc3a0..00000000 --- a/engine/src/main/resources/shaders/batch.fs +++ /dev/null @@ -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; - } -} diff --git a/engine/src/main/resources/shaders/batch.vs b/engine/src/main/resources/shaders/batch.vs deleted file mode 100644 index 5338568f..00000000 --- a/engine/src/main/resources/shaders/batch.vs +++ /dev/null @@ -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; -} diff --git a/engine/src/main/resources/shaders/default.fs b/engine/src/main/resources/shaders/default.fs index e81250b4..7656584b 100644 --- a/engine/src/main/resources/shaders/default.fs +++ b/engine/src/main/resources/shaders/default.fs @@ -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