package source;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.graphics.g3d.utils.MeshPartBuilder;
import com.badlogic.gdx.graphics.g3d.utils.ModelBuilder;
import com.badlogic.gdx.graphics.VertexAttributes.Usage;
import com.badlogic.gdx.graphics.g3d.Material;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.g3d.attributes.TextureAttribute;
import scene3d.Actor3d;
import scene3d.Camera3d;
import scene3d.actions.Actions3d;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.Input.Keys;
import scene2d.*;
public class Game3d extends Scene {
Actor3d ship;
Actor3d skydome;
Actor3d knight;
Actor3d floor;
ModelBuilder builder;
public Game3d(){
ship = Asset.loadModelObj("ship");//loads an obj model
ship.scale(3f);
skydome = Asset.loadModel("skydome"); //loads a g3db model
builder = new ModelBuilder();
builder.begin();
MeshPartBuilder part = builder.part("floor", GL20.GL_TRIANGLES, Usage.Position |
Usage.TextureCoordinates | Usage.Normal, new Material());
for (float x = -200f; x < 200f; x += 10f) {
for (float z = -200f; z < 200f; z += 10f) {
part.rect(x, 0, z + 10f, x + 10f, 0, z + 10f, x + 10f, 0, z, x, 0, z, 0, 1, 0);
}
}
floor = new Actor3d(builder.end());
floor.materials.get(0).set(TextureAttribute.createDiffuse(Asset.tex("concrete").getTexture()));
knight = Asset.loadModel("knight");
knight.setPosition(-20f, 18f, 0f);
knight.setPitch(-90f);
addActor3d(floor);
addActor3d(skydome);
addActor3d(ship);
addActor3d(knight);
stage3d.getCamera().position.set(knight.getX()+ 13f, knight.getY() + 24f, knight.getZ() + 45f);
//Camera3d.followOffset(20f, 20f, -20f);
// Camera3d.followActor3d(knight, false);
}
float angle, angle2;
@Override
public void act(float delta){
super.act(delta);
angle = MathUtils.cosDeg(knight.getYaw() - 90); //90 degrees is correction factor
angle2 = -MathUtils.sinDeg(knight.getYaw() - 90);
if (upKey) {
knight.addAction3d(Actions3d.moveBy(angle, 0f, angle2, 1f));
stage3d.getCamera().translate(angle, 0f, angle2);
}
else if (downKey) {
knight.addAction3d(Actions3d.moveBy(-angle, 0f, -angle2, 1f));
stage3d.getCamera().translate(angle, 0f, angle2);
}
else if (rightKey) {
knight.rotateYaw(-2f);
if(stage3d.getCamera().direction.z > -0.76f)
Camera3d.rotateBy(-2f, 0f, 0f, 0f);
}
else if (leftKey) {
knight.rotateYaw(2f);
if(stage3d.getCamera().direction.z > -0.76f)
Camera3d.rotateBy(-2f, 0f, 0f, 0f);
}
}
@Override
public void onClick(Actor actor){
if(actor.getName().equals("Button1"))
ship.addAction3d(Actions3d.moveBy(1f, 0f, 0f, 0.4f));
}
@Override
public void onTouchDown(Actor actor){}
@Override
public void onTouchUp(){}
@Override
public void onDragged(){}
@Override
public void onGesture(GestureType type){}
@Override
public void onKeyTyped(char key){
}
boolean rightKey, leftKey, upKey, downKey, spaceKey;
@Override
public void onKeyUp(int keycode){
if (keycode == Keys.LEFT) leftKey = false;
if (keycode == Keys.RIGHT) rightKey = false;
if (keycode == Keys.UP) upKey = false;
if (keycode == Keys.DOWN) downKey = false;
if (keycode == Keys.SPACE) spaceKey = false;
}
@Override
public void onKeyDown(int keycode){
if (keycode == Keys.LEFT) leftKey = true;
if (keycode == Keys.RIGHT) rightKey = true;
if (keycode == Keys.UP) upKey = true;
if (keycode == Keys.DOWN) downKey = true;
if (keycode == Keys.SPACE) spaceKey = true;
}
@Override
public void onPause(){
}
@Override
public void onResume(){
}
@Override
public void onDispose(){
}
}