Improve material, animations and sprite positions code
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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<frames; ++column) {
|
||||
@@ -49,7 +49,7 @@ public class Entity extends MovableObject {
|
||||
|
||||
@Override
|
||||
protected void setDefaultAnimationFrame() {
|
||||
setAnimationFrame(new Vector2f(defaultSpriteColumn, spriteDirectionRows.get(faceDirection)));
|
||||
material.setSpritePosition(new Vector2f(defaultSpriteColumn, spriteDirectionRows.get(faceDirection)));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -71,7 +71,7 @@ public class Entity extends MovableObject {
|
||||
}
|
||||
|
||||
public Entity(Mesh mesh, Material material, Vector2f coordinateStepSize, EntitySpriteConfiguration configuration) {
|
||||
super(mesh, material, coordinateStepSize, configuration.getDimension().asVector());
|
||||
super(mesh, material, coordinateStepSize);
|
||||
this.defaultSpriteColumn = configuration.getDefaultSpriteColumn();
|
||||
this.spriteDirectionRows = configuration.getSpriteDirectionRows();
|
||||
this.faceDirection = Direction.DOWN;
|
||||
|
||||
Reference in New Issue
Block a user