1 package de.lathanda.eos.robot.gui;
4 import java.nio.FloatBuffer;
5 import java.util.LinkedList;
6 import java.util.Map.Entry;
7 import java.util.TreeMap;
9 import com.jogamp.common.nio.Buffers;
10 import com.jogamp.opengl.GL;
11 import com.jogamp.opengl.GL2;
13 import de.lathanda.eos.robot.geom3d.Face;
14 import de.lathanda.eos.robot.geom3d.Material;
15 import de.lathanda.eos.robot.geom3d.Polyhedron;
18 private volatile boolean vboReady =
false;
22 FloatBuffer texCoords;
24 private int vOff, tOff, nOff, size;
26 private VBORenderer renderer;
28 TreeMap<Material, LinkedList<Face> > faceGroups =
new TreeMap<>();
30 LinkedList<Face> group;
31 if ( faceGroups.containsKey(f.
m)) {
32 group = faceGroups.get(f.
m);
34 group =
new LinkedList<Face>();
35 faceGroups.put(f.
m, group);
40 LinkedList<GLRenderObject> buffers =
new LinkedList<>();
41 for (Entry<
Material, LinkedList<Face> > entry : faceGroups.entrySet()) {
48 this.vCount = faces.size() * 3;
49 this.vertices = Buffers.newDirectFloatBuffer(vCount * 3);
50 this.normals = Buffers.newDirectFloatBuffer(vCount * 3);
51 for(
Face face: faces) {
52 for(
int i = 0; i < 3; i++) {
53 vertices.put(face.v[i].x);
54 vertices.put(face.v[i].y);
55 vertices.put(face.v[i].z);
56 normals.put(face.vn[i].dx);
57 normals.put(face.vn[i].dy);
58 normals.put(face.vn[i].dz);
62 if (m.
image ==
null) {
63 this.renderer =
new NoTextureRenderer();
64 this.texCoords =
null;
66 this.texCoords = Buffers.newDirectFloatBuffer(vCount * 2);
67 for(Face face: faces) {
68 for(
int i = 0; i < 3; i++) {
69 texCoords.put(face.vt[i].u);
70 texCoords.put(1 - face.vt[i].v);
73 this.renderer =
new TextureRenderer();
77 private void setupVBO(GL2 gl) {
80 int vSize = vertices.capacity() * 4;
81 int nSize = normals.capacity() * 4;
83 if (texCoords !=
null) {
85 tSize = texCoords.capacity() * 4;
94 int[] bufferId =
new int[1];
95 gl.glGenBuffers(1, bufferId, 0);
98 throw new RuntimeException(
"aquiring VBO id failed!");
100 gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vboId);
101 gl.glBufferData(GL2.GL_ARRAY_BUFFER, size,
null, GL2.GL_STATIC_DRAW);
102 gl.glBufferSubData(GL2.GL_ARRAY_BUFFER, vOff, vSize, vertices);
103 if (texCoords !=
null) {
104 gl.glBufferSubData(GL2.GL_ARRAY_BUFFER, tOff, tSize, texCoords);
106 gl.glBufferSubData(GL2.GL_ARRAY_BUFFER, nOff, nSize, normals);
107 gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, 0);
111 renderer.render(gl, base);
113 private static interface VBORenderer {
114 void render(GL2 gl, Color base);
116 private class TextureRenderer
implements VBORenderer {
118 public void render(GL2 gl, Color base) {
122 gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vboId);
123 gl.glEnableClientState(GL2.GL_VERTEX_ARRAY);
124 gl.glEnableClientState(GL2.GL_TEXTURE_COORD_ARRAY);
125 gl.glEnableClientState(GL2.GL_NORMAL_ARRAY);
126 gl.glVertexPointer(3, GL.GL_FLOAT, 0, vOff);
127 gl.glTexCoordPointer(2, GL.GL_FLOAT, 0, tOff);
128 gl.glNormalPointer(GL.GL_FLOAT,0 , nOff);
129 GLTextureBuffer texture = GLTextureBuffer.get(m, gl);
130 texture.openMaterial(base, gl);
131 gl.glDrawArrays(GL.GL_TRIANGLES,0, vCount);
132 texture.closeMaterial(gl);
133 gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
136 private class NoTextureRenderer
implements VBORenderer {
138 public void render(GL2 gl, Color base) {
142 gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vboId);
143 gl.glEnableClientState(GL2.GL_VERTEX_ARRAY);
144 gl.glEnableClientState(GL2.GL_NORMAL_ARRAY);
145 gl.glVertexPointer(3, GL.GL_FLOAT, 0, vOff);
146 gl.glNormalPointer(GL.GL_FLOAT,0 , nOff);
147 GLTextureBuffer texture = GLTextureBuffer.get(m, gl);
148 texture.openMaterial(base, gl);
149 gl.glDrawArrays(GL.GL_TRIANGLES,0, vCount);
150 texture.closeMaterial(gl);
151 gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
final LinkedList< Face > faces
void render(GL2 gl, Color base)
static LinkedList< GLRenderObject > create(Polyhedron poly)