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.physics.SphereMoving;
import com.igorcrevar.rolloverchuck.utils.Mathf;
public class ChuckObject {
private IMesh mesh;
private ShaderProgram sp;
private Matrix4 modelMatrix;
private GameData gameData;
private SphereMoving sphereMoving = new SphereMoving();
private Color colorFactor = new Color(1.0f, 1.0f, 1.0f, 1.0f);
private float currentRadius;
private float prevFrameRadius;
private Vector3 prevFramePosition = new Vector3(); // we need because of physics
// radius size change
private float desiredRadius;
private float radiusTimer;
public ChuckObject(GameManager gameManager) {
mesh = gameManager.getMesh("sphere");
sp = gameManager.getShader("light");
modelMatrix = new Matrix4();
gameData = gameManager.getGameData();
}
public void init() {
sphereMoving.init(gameData.ChuckBoundaries, gameData.ChuckFriction, gameData.ChuckMaxVelocity, gameData.ChuckBouncingFactor);
prevFramePosition.set(sphereMoving.getPosition());
currentRadius = gameData.Chuck_r;
radiusTimer = gameData.ChuckRadiusChangeTime + 0.1f;
}
public void reflect(boolean rX, boolean rY) {
sphereMoving.reflect(rX, rY);
}
public void addMoving(float incX, float incZ) {
sphereMoving.addVelocity(incX, incZ);
}
public void setMaxVelocity(Vector3 maxVelocity) {
this.sphereMoving.setMaxVelocity(maxVelocity);
}
public void setFriction(Vector3 friction) {
this.sphereMoving.setFriction(friction);
}
public void makeChuckBig() {
desiredRadius = gameData.Chuck_rBig;
radiusTimer = 0.0f;
}
public void makeChuckSmall() {
desiredRadius = gameData.Chuck_rSmall;
radiusTimer = 0.0f;
}
public void update(float deltaTime) {
// remember old pos
prevFramePosition.set(sphereMoving.getPosition());
prevFrameRadius = currentRadius;
// radius update if needed
if (radiusTimer >= gameData.ChuckRadiusChangeTime) {
currentRadius = gameData.Chuck_r;
}
else {
currentRadius = Mathf.lerp(desiredRadius, gameData.Chuck_r, radiusTimer / gameData.ChuckRadiusChangeTime);
radiusTimer += deltaTime;
}
// update moving / rotation / etc
sphereMoving.update(deltaTime);
// create model matrix
modelMatrix.idt().translate(GameData.ObjectZero).translate(0.0f, gameData.Chuck_r, 0.0f);
sphereMoving.populateMatrix(modelMatrix, currentRadius / gameData.Chuck_r);
}
public void draw(Matrix4 projViewMatrix, Matrix4 viewMatrix, Vector3 lightPos) {
projViewMatrix.mul(modelMatrix);
viewMatrix.mul(modelMatrix);
sp.begin();
sp.setUniformMatrix(GameConsts.ProjectionMatrixName, projViewMatrix);
sp.setUniformMatrix(GameConsts.ViewModelMatrixName, viewMatrix);
sp.setUniformf(GameConsts.LightPosName, lightPos);
sp.setUniformf("u_color_factor", colorFactor);
mesh.draw(sp);
sp.end();
}
public void drawShadow(ShaderProgram sp, Matrix4 projViewMatrix) {
sp.setUniformMatrix("u_modelMatrix", modelMatrix);
sp.setUniformMatrix(GameConsts.ProjectionMatrixName, projViewMatrix);
mesh.draw(sp);
}
public Vector3 getPrevFramePosition() {
return prevFramePosition;
}
public Vector3 getCurrentPosition() {
return sphereMoving.getPosition();
}
public float getPrevFrameRadius() {
return prevFrameRadius;
}
public float getCurrentRadius() {
return currentRadius;
}
}