Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.example.box
- import com.badlogic.gdx.Gdx;
- import com.badlogic.gdx.ScreenAdapter;
- import com.badlogic.gdx.graphics.*;
- import com.badlogic.gdx.graphics.g2d.BitmapFont;
- import com.badlogic.gdx.graphics.g2d.SpriteBatch;
- import com.badlogic.gdx.graphics.g3d.*;
- import com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute;
- import com.badlogic.gdx.graphics.g3d.attributes.TextureAttribute;
- import com.badlogic.gdx.graphics.g3d.environment.DirectionalLight;
- import com.badlogic.gdx.graphics.g3d.utils.CameraInputController;
- import com.badlogic.gdx.graphics.g3d.utils.MeshPartBuilder;
- import com.badlogic.gdx.graphics.g3d.utils.ModelBuilder;
- import com.badlogic.gdx.graphics.g3d.utils.shapebuilders.BoxShapeBuilder;
- import com.badlogic.gdx.math.Intersector;
- import com.badlogic.gdx.math.MathUtils;
- import com.badlogic.gdx.math.Vector3;
- import com.badlogic.gdx.math.collision.BoundingBox;
- import com.badlogic.gdx.math.collision.Ray;
- public class CubeScreen extends ScreenAdapter {
- private final Camera camera;
- private final CameraInputController cameraController;
- private final SpriteBatch spriteBatch;
- private final BitmapFont font;
- private final Model boxModel;
- private final ModelInstance box;
- private final BoundingBox boundingBox;
- private final Environment environment;
- private final ModelBatch modelBatch;
- private final Texture woodBoxTexture;
- private boolean isBoxSelected = false;
- public CubeScreen() {
- camera = new PerspectiveCamera();
- camera.position.set(0f, 0f, 8f);
- camera.lookAt(Vector3.Zero);
- cameraController = new CameraInputController(camera);
- Gdx.input.setInputProcessor(cameraController);
- spriteBatch = new SpriteBatch();
- font = new BitmapFont();
- environment = new Environment();
- environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f, 1f));
- environment.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, -1f, -0.8f, -0.2f));
- woodBoxTexture = new Texture(Gdx.files.internal("wooden-box.jpg"));
- ModelBuilder modelBuilder = new ModelBuilder();
- modelBuilder.begin();
- modelBuilder.node().id = "box";
- int attributes = VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal | VertexAttributes.Usage.TextureCoordinates;
- MeshPartBuilder boxBuilder = modelBuilder.part("box", GL20.GL_TRIANGLES, attributes, new Material(TextureAttribute.createDiffuse(woodBoxTexture)));
- BoxShapeBuilder.build(boxBuilder, 0, 0, 0f, 4f, 4f, 4f);
- boxModel = modelBuilder.end();
- box = new ModelInstance(boxModel);
- boundingBox = new BoundingBox();
- box.calculateBoundingBox(boundingBox);
- modelBatch = new ModelBatch();
- }
- @Override
- public void render(float delta) {
- Gdx.gl.glClearColor(0, 0, 0f, 1f);
- Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
- cameraController.update();
- if (Gdx.input.justTouched()) {
- Ray pickRay = camera.getPickRay(Gdx.input.getX(), Gdx.input.getY());
- if (Intersector.intersectRayBoundsFast(pickRay, boundingBox)) {
- isBoxSelected = !isBoxSelected;
- }
- }
- modelBatch.begin(camera);
- modelBatch.render(box, environment);
- if (isBoxSelected) {
- // TODO highlight box
- spriteBatch.begin();
- font.draw(spriteBatch, "Box selected", 100f, 150f);
- spriteBatch.end();
- }
- modelBatch.end();
- }
- @Override
- public void resize(int width, int height) {
- float halfHeight = 5f * 0.5f;
- if (height > width) {
- halfHeight *= (float) height / (float) width;
- }
- float halfFovRadians = MathUtils.degreesToRadians * 67f * 0.5f;
- float distance = halfHeight / (float)Math.tan(halfFovRadians);
- camera.viewportWidth = width;
- camera.viewportHeight = height;
- camera.position.set(0, 0, distance);
- camera.lookAt(Vector3.Zero);
- camera.update();
- }
- @Override
- public void dispose() {
- boxModel.dispose();
- woodBoxTexture.dispose();
- modelBatch.dispose();
- spriteBatch.dispose();
- font.dispose();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment