Improve material, animations and sprite positions code

This commit is contained in:
2021-02-16 12:50:34 +01:00
parent f6e15724c4
commit 7e89bedffc
9 changed files with 47 additions and 91 deletions

View File

@@ -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;
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}
}

View File

@@ -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);
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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;