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; package com.bartlomiejpluta.base.core.gl.object.material;
import com.bartlomiejpluta.base.core.gl.object.texture.Texture; 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 lombok.Getter;
import org.joml.Vector2f; import org.joml.Vector2f;
import org.joml.Vector4f; import org.joml.Vector4f;
@Getter @Getter
public class Material { public class Material implements Renderable {
private final Vector4f color = new Vector4f(); private final Vector4f color = new Vector4f();
private final Vector2f spriteSize = new Vector2f(1, 1);
private final Vector2f spritePosition = new Vector2f(0, 0); private final Vector2f spritePosition = new Vector2f(0, 0);
private final Texture texture; private final Texture texture;
@@ -17,6 +21,21 @@ public class Material {
setColor(r, g, b, alpha); 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) { public void setAlpha(float alpha) {
this.color.w = alpha; this.color.w = alpha;
} }
@@ -35,33 +54,19 @@ public class Material {
color.w = alpha; 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) { public void setSpritePosition(Vector2f spritePosition) {
this.spritePosition.x = spritePosition.x; if(texture != null) {
this.spritePosition.y = spritePosition.y; 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) { public void setSpritePosition(float x, float y) {
this.spritePosition.x = x; if(texture != null) {
this.spritePosition.y = y; var size = texture.getSpriteFragment();
} this.spritePosition.x = size.x * x;
this.spritePosition.y = size.y * y;
public boolean hasTexture() {
return texture != null;
}
public void activateTextureIfExists() {
if(hasTexture()) {
texture.activate();
} }
} }

View File

@@ -11,9 +11,8 @@ public class Image extends RenderableObject {
private final int initialHeight; private final int initialHeight;
Image(Mesh mesh, Material texture, int initialWidth, int initialHeight) { Image(Mesh mesh, Material texture, int initialWidth, int initialHeight) {
super(mesh); super(mesh, texture);
this.initialWidth = initialWidth; this.initialWidth = initialWidth;
this.initialHeight = initialHeight; 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 com.bartlomiejpluta.base.core.world.object.RenderableObject;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.joml.Vector2f; import org.joml.Vector2f;
import org.joml.Vector2i;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public abstract class AnimationableObject extends RenderableObject { public abstract class AnimationableObject extends RenderableObject {
protected final Vector2i spriteSheetDimension;
public AnimationableObject(Mesh mesh, Material material, Vector2i spriteSheetDimension) { public AnimationableObject(Mesh mesh, Material material) {
super(mesh); super(mesh, material);
this.spriteSheetDimension = spriteSheetDimension;
material.setSpriteSize(1 / (float) spriteSheetDimension.y, 1 / (float) spriteSheetDimension.x);
setMaterial(material);
} }
// Returns time in ms between frames // Returns time in ms between frames
@@ -29,11 +23,6 @@ public abstract class AnimationableObject extends RenderableObject {
public abstract Vector2f[] getSpriteAnimationFramesPositions(); public abstract Vector2f[] getSpriteAnimationFramesPositions();
protected void setAnimationFrame(Vector2f framePosition) {
var spriteSize = getMaterial().getSpriteSize();
setSpritePosition(spriteSize.x * framePosition.x, spriteSize.y * framePosition.y);
}
@Override @Override
public void render(Window window, Camera camera, ShaderManager shaderManager) { public void render(Window window, Camera camera, ShaderManager shaderManager) {
animate(); animate();
@@ -46,7 +35,7 @@ public abstract class AnimationableObject extends RenderableObject {
var delay = getAnimationSpeed(); var delay = getAnimationSpeed();
var currentPosition = (int) (System.currentTimeMillis() % (positions.length * delay)) / delay; var currentPosition = (int) (System.currentTimeMillis() % (positions.length * delay)) / delay;
var current = positions[currentPosition]; 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); return setCoordinates(coordinates.x, coordinates.y);
} }
public MovableObject(Mesh mesh, Material material, Vector2f coordinateStepSize, Vector2i spriteSheetDimensions) { public MovableObject(Mesh mesh, Material material, Vector2f coordinateStepSize) {
super(mesh, material, spriteSheetDimensions); super(mesh, material);
this.coordinateStepSize = coordinateStepSize; this.coordinateStepSize = coordinateStepSize;
setCoordinates(0, 0); 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.ui.Window;
import com.bartlomiejpluta.base.core.world.camera.Camera; import com.bartlomiejpluta.base.core.world.camera.Camera;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.NonNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.Setter; import lombok.Setter;
import org.joml.Vector2f;
import org.joml.Vector4f;
@RequiredArgsConstructor @RequiredArgsConstructor
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public abstract class RenderableObject extends PositionableObject implements Renderable { public abstract class RenderableObject extends PositionableObject implements Renderable {
private final Mesh mesh; @NonNull
protected final Mesh mesh;
@Getter @NonNull
@Setter @Setter
private Material material; protected Material material;
@Override @Override
public void render(Window window, Camera camera, ShaderManager shaderManager) { 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_VIEW_MODEL_MATRIX, camera.computeViewModelMatrix(getModelMatrix()));
shaderManager.setUniform(UniformName.UNI_OBJECT_COLOR, material.getColor()); material.render(window, camera, shaderManager);
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());
mesh.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; private final int height;
Tile(Mesh mesh, Material material, int width, int height) { Tile(Mesh mesh, Material material, int width, int height) {
super(mesh); super(mesh, material);
this.width = width; this.width = width;
this.height = height; this.height = height;
setMaterial(material);
} }
} }

View File

@@ -32,7 +32,6 @@ public class TileSet {
public Tile getTile(int row, int column) { public Tile getTile(int row, int column) {
var material = Material.textured(texture); var material = Material.textured(texture);
material.setSpriteSize(columnStep, rowStep);
material.setSpritePosition(column * columnStep, row * rowStep); material.setSpritePosition(column * columnStep, row * rowStep);
return new Tile(mesh, material, tileWidth, tileHeight); 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 com.bartlomiejpluta.base.game.world.entity.model.Entity;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.joml.Vector2f;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;

View File

@@ -37,7 +37,7 @@ public class Entity extends MovableObject {
@Override @Override
public Vector2f[] getSpriteAnimationFramesPositions() { public Vector2f[] getSpriteAnimationFramesPositions() {
var row = spriteDirectionRows.get(faceDirection); var row = spriteDirectionRows.get(faceDirection);
var frames = spriteSheetDimension.y; var frames = material.getTexture().getRows();
var array = new Vector2f[frames]; var array = new Vector2f[frames];
for(int column=0; column<frames; ++column) { for(int column=0; column<frames; ++column) {
@@ -49,7 +49,7 @@ public class Entity extends MovableObject {
@Override @Override
protected void setDefaultAnimationFrame() { protected void setDefaultAnimationFrame() {
setAnimationFrame(new Vector2f(defaultSpriteColumn, spriteDirectionRows.get(faceDirection))); material.setSpritePosition(new Vector2f(defaultSpriteColumn, spriteDirectionRows.get(faceDirection)));
} }
@Override @Override
@@ -71,7 +71,7 @@ public class Entity extends MovableObject {
} }
public Entity(Mesh mesh, Material material, Vector2f coordinateStepSize, EntitySpriteConfiguration configuration) { 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.defaultSpriteColumn = configuration.getDefaultSpriteColumn();
this.spriteDirectionRows = configuration.getSpriteDirectionRows(); this.spriteDirectionRows = configuration.getSpriteDirectionRows();
this.faceDirection = Direction.DOWN; this.faceDirection = Direction.DOWN;