Guest User

LibGDX selectable box

a guest
Feb 23rd, 2023
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.32 KB | None | 0 0
  1. package com.example.box
  2.  
  3. import com.badlogic.gdx.Gdx;
  4. import com.badlogic.gdx.ScreenAdapter;
  5. import com.badlogic.gdx.graphics.*;
  6. import com.badlogic.gdx.graphics.g2d.BitmapFont;
  7. import com.badlogic.gdx.graphics.g2d.SpriteBatch;
  8. import com.badlogic.gdx.graphics.g3d.*;
  9. import com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute;
  10. import com.badlogic.gdx.graphics.g3d.attributes.TextureAttribute;
  11. import com.badlogic.gdx.graphics.g3d.environment.DirectionalLight;
  12. import com.badlogic.gdx.graphics.g3d.utils.CameraInputController;
  13. import com.badlogic.gdx.graphics.g3d.utils.MeshPartBuilder;
  14. import com.badlogic.gdx.graphics.g3d.utils.ModelBuilder;
  15. import com.badlogic.gdx.graphics.g3d.utils.shapebuilders.BoxShapeBuilder;
  16. import com.badlogic.gdx.math.Intersector;
  17. import com.badlogic.gdx.math.MathUtils;
  18. import com.badlogic.gdx.math.Vector3;
  19. import com.badlogic.gdx.math.collision.BoundingBox;
  20. import com.badlogic.gdx.math.collision.Ray;
  21.  
  22. public class CubeScreen extends ScreenAdapter {
  23.  
  24.     private final Camera camera;
  25.     private final CameraInputController cameraController;
  26.     private final SpriteBatch spriteBatch;
  27.     private final BitmapFont font;
  28.     private final Model boxModel;
  29.     private final ModelInstance box;
  30.     private final BoundingBox boundingBox;
  31.     private final Environment environment;
  32.     private final ModelBatch modelBatch;
  33.     private final Texture woodBoxTexture;
  34.     private boolean isBoxSelected = false;
  35.  
  36.     public CubeScreen() {
  37.         camera = new PerspectiveCamera();
  38.         camera.position.set(0f, 0f, 8f);
  39.         camera.lookAt(Vector3.Zero);
  40.         cameraController = new CameraInputController(camera);
  41.         Gdx.input.setInputProcessor(cameraController);
  42.  
  43.         spriteBatch = new SpriteBatch();
  44.  
  45.         font = new BitmapFont();
  46.  
  47.         environment = new Environment();
  48.         environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f, 1f));
  49.         environment.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, -1f, -0.8f, -0.2f));
  50.  
  51.         woodBoxTexture = new Texture(Gdx.files.internal("wooden-box.jpg"));
  52.  
  53.         ModelBuilder modelBuilder = new ModelBuilder();
  54.         modelBuilder.begin();
  55.         modelBuilder.node().id = "box";
  56.         int attributes = VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal | VertexAttributes.Usage.TextureCoordinates;
  57.         MeshPartBuilder boxBuilder = modelBuilder.part("box", GL20.GL_TRIANGLES, attributes, new Material(TextureAttribute.createDiffuse(woodBoxTexture)));
  58.         BoxShapeBuilder.build(boxBuilder, 0, 0, 0f, 4f, 4f, 4f);
  59.         boxModel = modelBuilder.end();
  60.         box = new ModelInstance(boxModel);
  61.         boundingBox = new BoundingBox();
  62.         box.calculateBoundingBox(boundingBox);
  63.  
  64.         modelBatch = new ModelBatch();
  65.     }
  66.  
  67.     @Override
  68.     public void render(float delta) {
  69.         Gdx.gl.glClearColor(0, 0, 0f, 1f);
  70.         Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
  71.  
  72.         cameraController.update();
  73.  
  74.         if (Gdx.input.justTouched()) {
  75.             Ray pickRay = camera.getPickRay(Gdx.input.getX(), Gdx.input.getY());
  76.             if (Intersector.intersectRayBoundsFast(pickRay, boundingBox)) {
  77.                 isBoxSelected = !isBoxSelected;
  78.             }
  79.         }
  80.  
  81.         modelBatch.begin(camera);
  82.         modelBatch.render(box, environment);
  83.         if (isBoxSelected) {
  84.             // TODO highlight box
  85.             spriteBatch.begin();
  86.             font.draw(spriteBatch, "Box selected", 100f, 150f);
  87.             spriteBatch.end();
  88.         }
  89.         modelBatch.end();
  90.     }
  91.  
  92.     @Override
  93.     public void resize(int width, int height) {
  94.         float halfHeight = 5f * 0.5f;
  95.         if (height > width) {
  96.             halfHeight *= (float) height / (float) width;
  97.         }
  98.         float halfFovRadians = MathUtils.degreesToRadians * 67f * 0.5f;
  99.         float distance = halfHeight / (float)Math.tan(halfFovRadians);
  100.  
  101.         camera.viewportWidth = width;
  102.         camera.viewportHeight = height;
  103.         camera.position.set(0, 0, distance);
  104.         camera.lookAt(Vector3.Zero);
  105.         camera.update();
  106.     }
  107.  
  108.     @Override
  109.     public void dispose() {
  110.         boxModel.dispose();
  111.         woodBoxTexture.dispose();
  112.         modelBatch.dispose();
  113.         spriteBatch.dispose();
  114.         font.dispose();
  115.     }
  116. }
  117.  
Advertisement
Add Comment
Please, Sign In to add comment