120 lines
2.5 KiB
Java
120 lines
2.5 KiB
Java
package com.gnarwhal.ld46.engine.model;
|
|
|
|
import com.gnarwhal.ld46.engine.display.Camera;
|
|
import com.gnarwhal.ld46.engine.shaders.Shader;
|
|
import com.gnarwhal.ld46.engine.shaders.Shader2c;
|
|
import org.joml.Vector3f;
|
|
|
|
public class Circle {
|
|
|
|
private static Vao vao;
|
|
|
|
private Camera camera;
|
|
private Shader2c shader;
|
|
private Vector3f position;
|
|
private float radius;
|
|
private float r, g, b, a;
|
|
|
|
public Circle(Camera camera, float x, float y, float z, float radius) {
|
|
this.camera = camera;
|
|
position = new Vector3f(x, y, z);
|
|
this.radius = radius;
|
|
shader = Shader.SHADER2C;
|
|
r = 1;
|
|
g = 0;
|
|
b = 0;
|
|
a = 1;
|
|
if(vao == null)
|
|
initVao();
|
|
}
|
|
|
|
private void initVao() {
|
|
final int NUM_POINTS = 30;
|
|
float[] cVertices = new float[NUM_POINTS * 3];
|
|
int[] cIndices = new int[(NUM_POINTS - 2) * 3];
|
|
for (int i = 0; i < cVertices.length; i += 3) {
|
|
double angle = Math.PI * 2 * i / (NUM_POINTS * 3);
|
|
cVertices[i ] = (float) Math.cos(angle);
|
|
cVertices[i + 1] = (float) Math.sin(angle);
|
|
cVertices[i + 2] = 0;
|
|
}
|
|
for (int i = 0; i < cIndices.length; i += 3) {
|
|
cIndices[i ] = 0;
|
|
cIndices[i + 1] = i / 3 + 1;
|
|
cIndices[i + 2] = i / 3 + 2;
|
|
}
|
|
vao = new Vao(cVertices, cIndices);
|
|
}
|
|
|
|
public void render() {
|
|
shader.enable();
|
|
shader.setMVP(camera.getMatrix().translate(position).scale(radius));
|
|
shader.setColor(r, g, b, a);
|
|
vao.render();
|
|
}
|
|
|
|
public Vector3f getPosition() {
|
|
return position;
|
|
}
|
|
|
|
public void setX(float x) {
|
|
position.x = x;
|
|
}
|
|
|
|
public void setY(float y) {
|
|
position.y = y;
|
|
}
|
|
|
|
public void setZ(float z) {
|
|
position.z = z;
|
|
}
|
|
|
|
public void setPosition(float x, float y) {
|
|
position.x = x;
|
|
position.y = y;
|
|
}
|
|
|
|
public void setPosition(float x, float y, float z) {
|
|
position.x = x;
|
|
position.y = y;
|
|
position.z = z;
|
|
}
|
|
|
|
public void setPosition(Vector3f position) {
|
|
this.position.set(position);
|
|
}
|
|
|
|
public void translate(float x, float y) {
|
|
position.x += x;
|
|
position.y += y;
|
|
}
|
|
|
|
public void translate(float x, float y, float z) {
|
|
position.x += x;
|
|
position.y += y;
|
|
position.z += z;
|
|
}
|
|
|
|
public void translate(Vector3f position) {
|
|
this.position.add(position);
|
|
}
|
|
|
|
public void setRadius(float radius) {
|
|
this.radius = radius;
|
|
}
|
|
|
|
public void setDiameter(float diameter) {
|
|
this.radius = diameter / 2;
|
|
}
|
|
|
|
public void setColor(float r, float g, float b, float a) {
|
|
this.r = r;
|
|
this.g = g;
|
|
this.b = b;
|
|
this.a = a;
|
|
}
|
|
|
|
public boolean contains(Vector3f vector) {
|
|
return (position.sub(vector, new Vector3f()).lengthSquared() < radius * radius);
|
|
}
|
|
}
|