From 7e89bedffcbe0190ffdbf7a58c57503610718cf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Tue, 16 Feb 2021 12:50:34 +0100 Subject: [PATCH] Improve material, animations and sprite positions code --- .../core/gl/object/material/Material.java | 55 ++++++++++--------- .../base/core/image/Image.java | 3 +- .../world/animation/AnimationableObject.java | 17 +----- .../core/world/movement/MovableObject.java | 4 +- .../core/world/object/RenderableObject.java | 48 ++-------------- .../base/core/world/tileset/model/Tile.java | 3 +- .../core/world/tileset/model/TileSet.java | 1 - .../entity/manager/DefaultEntityManager.java | 1 + .../base/game/world/entity/model/Entity.java | 6 +- 9 files changed, 47 insertions(+), 91 deletions(-) diff --git a/engine/src/main/java/com/bartlomiejpluta/base/core/gl/object/material/Material.java b/engine/src/main/java/com/bartlomiejpluta/base/core/gl/object/material/Material.java index c047d31f..4c052bcb 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/core/gl/object/material/Material.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/core/gl/object/material/Material.java @@ -1,14 +1,18 @@ package com.bartlomiejpluta.base.core.gl.object.material; import com.bartlomiejpluta.base.core.gl.object.texture.Texture; +import com.bartlomiejpluta.base.core.gl.render.Renderable; +import com.bartlomiejpluta.base.core.gl.shader.constant.UniformName; +import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager; +import com.bartlomiejpluta.base.core.ui.Window; +import com.bartlomiejpluta.base.core.world.camera.Camera; import lombok.Getter; import org.joml.Vector2f; import org.joml.Vector4f; @Getter -public class Material { +public class Material implements Renderable { private final Vector4f color = new Vector4f(); - private final Vector2f spriteSize = new Vector2f(1, 1); private final Vector2f spritePosition = new Vector2f(0, 0); private final Texture texture; @@ -17,6 +21,21 @@ public class Material { setColor(r, g, b, alpha); } + @Override + public void render(Window window, Camera camera, ShaderManager shaderManager) { + shaderManager.setUniform(UniformName.UNI_OBJECT_COLOR, color); + + 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 { + shaderManager.setUniform(UniformName.UNI_HAS_OBJECT_TEXTURE, false); + } + } + public void setAlpha(float alpha) { this.color.w = alpha; } @@ -35,33 +54,19 @@ public class Material { color.w = alpha; } - public void setSpriteSize(Vector2f spriteSize) { - this.spriteSize.x = spriteSize.x; - this.spriteSize.y = spriteSize.y; - } - - public void setSpriteSize(float w, float h) { - this.spriteSize.x = w; - this.spriteSize.y = h; - } - public void setSpritePosition(Vector2f spritePosition) { - this.spritePosition.x = spritePosition.x; - this.spritePosition.y = spritePosition.y; + if(texture != null) { + var size = texture.getSpriteFragment(); + this.spritePosition.x = size.x * spritePosition.x; + this.spritePosition.y = size.y * spritePosition.y; + } } public void setSpritePosition(float x, float y) { - this.spritePosition.x = x; - this.spritePosition.y = y; - } - - public boolean hasTexture() { - return texture != null; - } - - public void activateTextureIfExists() { - if(hasTexture()) { - texture.activate(); + if(texture != null) { + var size = texture.getSpriteFragment(); + this.spritePosition.x = size.x * x; + this.spritePosition.y = size.y * y; } } diff --git a/engine/src/main/java/com/bartlomiejpluta/base/core/image/Image.java b/engine/src/main/java/com/bartlomiejpluta/base/core/image/Image.java index 42c5ea77..aa3bcecf 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/core/image/Image.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/core/image/Image.java @@ -11,9 +11,8 @@ public class Image extends RenderableObject { private final int initialHeight; Image(Mesh mesh, Material texture, int initialWidth, int initialHeight) { - super(mesh); + super(mesh, texture); this.initialWidth = initialWidth; this.initialHeight = initialHeight; - setMaterial(texture); } } diff --git a/engine/src/main/java/com/bartlomiejpluta/base/core/world/animation/AnimationableObject.java b/engine/src/main/java/com/bartlomiejpluta/base/core/world/animation/AnimationableObject.java index e9edeb5a..2ed19916 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/core/world/animation/AnimationableObject.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/core/world/animation/AnimationableObject.java @@ -8,18 +8,12 @@ import com.bartlomiejpluta.base.core.world.camera.Camera; import com.bartlomiejpluta.base.core.world.object.RenderableObject; import lombok.EqualsAndHashCode; import org.joml.Vector2f; -import org.joml.Vector2i; @EqualsAndHashCode(callSuper = true) public abstract class AnimationableObject extends RenderableObject { - protected final Vector2i spriteSheetDimension; - public AnimationableObject(Mesh mesh, Material material, Vector2i spriteSheetDimension) { - super(mesh); - this.spriteSheetDimension = spriteSheetDimension; - - material.setSpriteSize(1 / (float) spriteSheetDimension.y, 1 / (float) spriteSheetDimension.x); - setMaterial(material); + public AnimationableObject(Mesh mesh, Material material) { + super(mesh, material); } // Returns time in ms between frames @@ -29,11 +23,6 @@ public abstract class AnimationableObject extends RenderableObject { public abstract Vector2f[] getSpriteAnimationFramesPositions(); - protected void setAnimationFrame(Vector2f framePosition) { - var spriteSize = getMaterial().getSpriteSize(); - setSpritePosition(spriteSize.x * framePosition.x, spriteSize.y * framePosition.y); - } - @Override public void render(Window window, Camera camera, ShaderManager shaderManager) { animate(); @@ -46,7 +35,7 @@ public abstract class AnimationableObject extends RenderableObject { var delay = getAnimationSpeed(); var currentPosition = (int) (System.currentTimeMillis() % (positions.length * delay)) / delay; var current = positions[currentPosition]; - setAnimationFrame(current); + material.setSpritePosition(current); } } } diff --git a/engine/src/main/java/com/bartlomiejpluta/base/core/world/movement/MovableObject.java b/engine/src/main/java/com/bartlomiejpluta/base/core/world/movement/MovableObject.java index 8c4b83b8..468c3231 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/core/world/movement/MovableObject.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/core/world/movement/MovableObject.java @@ -73,8 +73,8 @@ public abstract class MovableObject extends AnimationableObject implements Updat return setCoordinates(coordinates.x, coordinates.y); } - public MovableObject(Mesh mesh, Material material, Vector2f coordinateStepSize, Vector2i spriteSheetDimensions) { - super(mesh, material, spriteSheetDimensions); + public MovableObject(Mesh mesh, Material material, Vector2f coordinateStepSize) { + super(mesh, material); this.coordinateStepSize = coordinateStepSize; setCoordinates(0, 0); } diff --git a/engine/src/main/java/com/bartlomiejpluta/base/core/world/object/RenderableObject.java b/engine/src/main/java/com/bartlomiejpluta/base/core/world/object/RenderableObject.java index aa657c38..03720a71 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/core/world/object/RenderableObject.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/core/world/object/RenderableObject.java @@ -8,60 +8,24 @@ import com.bartlomiejpluta.base.core.gl.shader.manager.ShaderManager; import com.bartlomiejpluta.base.core.ui.Window; import com.bartlomiejpluta.base.core.world.camera.Camera; import lombok.EqualsAndHashCode; -import lombok.Getter; +import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.Setter; -import org.joml.Vector2f; -import org.joml.Vector4f; @RequiredArgsConstructor @EqualsAndHashCode(callSuper = true) public abstract class RenderableObject extends PositionableObject implements Renderable { - private final Mesh mesh; + @NonNull + protected final Mesh mesh; - @Getter + @NonNull @Setter - private Material material; + protected Material material; @Override public void render(Window window, Camera camera, ShaderManager shaderManager) { - material.activateTextureIfExists(); - shaderManager.setUniform(UniformName.UNI_VIEW_MODEL_MATRIX, camera.computeViewModelMatrix(getModelMatrix())); - shaderManager.setUniform(UniformName.UNI_OBJECT_COLOR, material.getColor()); - shaderManager.setUniform(UniformName.UNI_HAS_OBJECT_TEXTURE, material.hasTexture()); - shaderManager.setUniform(UniformName.UNI_TEXTURE_SAMPLER, 0); - shaderManager.setUniform(UniformName.UNI_SPRITE_SIZE, material.getSpriteSize()); - shaderManager.setUniform(UniformName.UNI_SPRITE_POSITION, material.getSpritePosition()); - + material.render(window, camera, shaderManager); mesh.render(window, camera, shaderManager); } - - public void setAlpha(float alpha) { - material.setAlpha(alpha); - } - - public void setColor(Vector4f color) { - material.setColor(color); - } - - public void setColor(float r, float g, float b, float alpha) { - material.setColor(r, g, b, alpha); - } - - public void setSpriteSize(Vector2f spriteSize) { - material.setSpriteSize(spriteSize); - } - - public void setSpriteSize(float w, float h) { - material.setSpriteSize(w, h); - } - - public void setSpritePosition(Vector2f spritePosition) { - material.setSpritePosition(spritePosition); - } - - public void setSpritePosition(float x, float y) { - material.setSpritePosition(x, y); - } } diff --git a/engine/src/main/java/com/bartlomiejpluta/base/core/world/tileset/model/Tile.java b/engine/src/main/java/com/bartlomiejpluta/base/core/world/tileset/model/Tile.java index 6680990c..6bdf9c29 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/core/world/tileset/model/Tile.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/core/world/tileset/model/Tile.java @@ -11,9 +11,8 @@ public class Tile extends RenderableObject { private final int height; Tile(Mesh mesh, Material material, int width, int height) { - super(mesh); + super(mesh, material); this.width = width; this.height = height; - setMaterial(material); } } diff --git a/engine/src/main/java/com/bartlomiejpluta/base/core/world/tileset/model/TileSet.java b/engine/src/main/java/com/bartlomiejpluta/base/core/world/tileset/model/TileSet.java index 463344cc..27b8fb1e 100644 --- a/engine/src/main/java/com/bartlomiejpluta/base/core/world/tileset/model/TileSet.java +++ b/engine/src/main/java/com/bartlomiejpluta/base/core/world/tileset/model/TileSet.java @@ -32,7 +32,6 @@ public class TileSet { public Tile getTile(int row, int column) { var material = Material.textured(texture); - material.setSpriteSize(columnStep, rowStep); material.setSpritePosition(column * columnStep, row * rowStep); return new Tile(mesh, material, tileWidth, tileHeight); } diff --git a/game/src/main/java/com/bartlomiejpluta/base/game/world/entity/manager/DefaultEntityManager.java b/game/src/main/java/com/bartlomiejpluta/base/game/world/entity/manager/DefaultEntityManager.java index c97cf455..8d623bd1 100644 --- a/game/src/main/java/com/bartlomiejpluta/base/game/world/entity/manager/DefaultEntityManager.java +++ b/game/src/main/java/com/bartlomiejpluta/base/game/world/entity/manager/DefaultEntityManager.java @@ -8,6 +8,7 @@ import com.bartlomiejpluta.base.game.world.entity.config.EntitySpriteConfigurati import com.bartlomiejpluta.base.game.world.entity.model.Entity; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.joml.Vector2f; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/game/src/main/java/com/bartlomiejpluta/base/game/world/entity/model/Entity.java b/game/src/main/java/com/bartlomiejpluta/base/game/world/entity/model/Entity.java index 31410432..0e4b9b88 100644 --- a/game/src/main/java/com/bartlomiejpluta/base/game/world/entity/model/Entity.java +++ b/game/src/main/java/com/bartlomiejpluta/base/game/world/entity/model/Entity.java @@ -37,7 +37,7 @@ public class Entity extends MovableObject { @Override public Vector2f[] getSpriteAnimationFramesPositions() { var row = spriteDirectionRows.get(faceDirection); - var frames = spriteSheetDimension.y; + var frames = material.getTexture().getRows(); var array = new Vector2f[frames]; for(int column=0; column