package com.igorcrevar.rolloverchuck.objects;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;
import com.badlogic.gdx.math.Matrix4;
import com.badlogic.gdx.math.Vector3;
import com.igorcrevar.rolloverchuck.GameConsts;
import com.igorcrevar.rolloverchuck.GameData;
import com.igorcrevar.rolloverchuck.GameManager;
import com.igorcrevar.rolloverchuck.mesh.IMesh;
import com.igorcrevar.rolloverchuck.objects.boxes.IBoxRegion;
import com.igorcrevar.rolloverchuck.objects.boxes.IBoxType;
import com.igorcrevar.rolloverchuck.utils.Mathf;
public class BoxObject {
private static final float MinAlpha = 0.2f;
private static final float MaxAlpha = 0.9f;
private IMesh mesh;
private ShaderProgram sp;
private Matrix4 modelMatrix;
private Color color = new Color();
private Vector3 position = new Vector3();
private float angle;
private float currentTime;
private float timeToLive;
private IBoxRegion boxRegion;
private IBoxType boxType;
private float baseScale;
public BoxObject(GameManager gameManager) {
mesh = gameManager.getMesh("cube_with_normals");
sp = gameManager.getShader("light");
modelMatrix = new Matrix4();
baseScale = gameManager.getGameData().CubeScale;
}
public void init(IBoxRegion boxRegion, float timeToLive, IBoxType boxType) {
this.boxRegion = boxRegion;
this.boxRegion.populatePosition(this.position);
this.boxRegion.take();
this.color.set(boxType.getColor());
this.color.a = MaxAlpha;
this.timeToLive = timeToLive;
this.boxType = boxType;
this.currentTime = 0.0f;
}
public boolean update(float deltaTime) {
color.a = Mathf.lerp(MaxAlpha, MinAlpha, currentTime / timeToLive);
float scale = boxType.getScale() * baseScale;
modelMatrix.idt().translate(GameData.ObjectZero).translate(position.x, 0.5f * scale, position.z);
modelMatrix.scale(scale, scale, scale);
modelMatrix.mul(new Matrix4().rotate(com.badlogic.gdx.math.Vector3.Y, angle));
currentTime += deltaTime;
angle += boxType.getRotationSpeed() * deltaTime;
return currentTime < timeToLive;
}
public void draw(Matrix4 projViewMatrix, Matrix4 viewMatrix, Vector3 lightPos) {
projViewMatrix.mul(modelMatrix);
viewMatrix.mul(modelMatrix);
sp.begin();
sp.setUniformMatrix(GameConsts.ProjectionMatrixName, projViewMatrix);
sp.setUniformf("u_color_factor", color);
sp.setUniformMatrix(GameConsts.ViewModelMatrixName, viewMatrix);
sp.setUniformf(GameConsts.LightPosName, lightPos);
mesh.draw(sp);
sp.end();
}
public void destroy() {
boxRegion.free();
}
public void drawShadow(ShaderProgram sp, Matrix4 projViewMatrix) {
if (currentTime > timeToLive) {
return;
}
sp.setUniformMatrix("u_modelMatrix", modelMatrix);
sp.setUniformMatrix(GameConsts.ProjectionMatrixName, projViewMatrix);
mesh.draw(sp);
}
public Vector3 GetPosition() {
return position;
}
public float getScale() {
return boxType.getScale() * baseScale;
}
public int getPoints() {
return boxType.getPoint();
}
public void applyUpgrade(ChuckObject co) {
boxType.applyUpgrade(co);
}
}