So, hier das KSKB.
Ich habe jeden Punkt doppelt gemacht, um zu testen, ob das mit der Problematik aus dem alten Thread auch funktioniert. Außerdem updatet sich das Mesh nicht, wenn man einen Punkt löscht und es flimmert(Ich weiß nicht woran diese Dinge liegen). Aber aus dem Konsolenoutput sollte relativ schnell klar werden worin das Problem besteht: es wird zuviel gelöscht.
import static org.lwjgl.opengl.GL15.*;
import static org.lwjgl.opengl.GL11.*;
import java.nio.FloatBuffer;
import java.nio.IntBuffer;
import java.util.ArrayList;
import org.lwjgl.BufferUtils;
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.ContextAttribs;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL15;
import org.lwjgl.opengl.PixelFormat;
import org.lwjgl.util.glu.GLU;
import org.lwjgl.util.vector.Vector3f;
public class KSKB {
float[] coords = {
-1, -1, -1,
-1, -1, -1,
1, -1, -1,
1, -1, -1,
-1, 1, -1,
-1, 1, -1,
1, 1, -1,
1, 1, -1,
-1, -1, 1,
-1, -1, 1,
1, -1, 1,
1, -1, 1,
-1, 1, 1,
-1, 1, 1,
1, 1, 1,
1, 1, 1
};
int[] indexe = {
0, 2, 4, 5, 3, 7,
8, 10, 12, 13, 11, 15,
0, 2, 8, 9, 3, 11,
0, 4, 8, 9, 5, 13,
2, 6, 10, 11, 7, 15,
4, 6, 12, 13, 7, 15
};
private FloatBuffer vertexBuffer;
private int vboID;
private IntBuffer indexBuffer;
private FloatBuffer modelMatrix = BufferUtils.createFloatBuffer(16);
private FloatBuffer projectionMatrix = BufferUtils.createFloatBuffer(16);
private IntBuffer viewport = BufferUtils.createIntBuffer(16);
private int geklickterPunkt;
private boolean punktLöschen;
public KSKB(){
final int GL_MAJOR_VERSION = 1;
final int GL_MINOR_VERSION = 0;
final DisplayMode displayMode = new DisplayMode(854, 480);
final PixelFormat pixelFormat = new PixelFormat();
final ContextAttribs contextAttribs = new ContextAttribs(GL_MAJOR_VERSION, GL_MINOR_VERSION);
try {
Display.setDisplayMode(displayMode);
Display.create(pixelFormat, contextAttribs);
} catch (LWJGLException e) {
e.printStackTrace();
}
Display.setLocation(760, 210);
Display.setTitle("KSKB");
Display.setResizable(true);
init(coords, indexe);
projectionMatrix = BufferUtils.createFloatBuffer(16);
projectionMatrix.put(projection(45, Display.getWidth()/Display.getHeight(), 0.1f, 100));
projectionMatrix.flip();
while(!Display.isCloseRequested()){
zeugMitMaus();
glViewport(0, 0, Display.getWidth(), Display.getHeight());
glGetInteger(GL_VIEWPORT, viewport);
glClear(GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
GLU.gluPerspective(45, Display.getWidth()/Display.getHeight(), 0.1f, 100);
glMatrixMode(GL_MODELVIEW);
glTranslatef(0, 0, -5);
glRotatef(45, 1, 0, 0);
glGetFloat(GL_MODELVIEW_MATRIX, modelMatrix);
glColor4f(1, 1, 1, 1);
glEnableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glVertexPointer(3, GL_FLOAT, 0, 0);
glDrawElements(GL_TRIANGLES, indexBuffer);
glColor4f(1, 0, 0, 1);
glPointSize(5f);
glClear(GL_DEPTH_BUFFER_BIT);
for(int i = 0; i < coords.length/3; i++){
glDrawArrays(GL_POINTS, i, 1);
}
glDisableClientState(GL_VERTEX_ARRAY);
Display.update();
}
}
public static float[] projection(final float fovy, final float aspect, final float zNear, final float zFar) {
final double f = (1.0 / Math.tan(Math.toRadians(fovy / 2.0)));
final float[] m = new float[16];
m[0] = (float) (f / aspect);
m[5] = (float) (f);
m[10] = (zFar + zNear) / (zNear - zFar);
m[11] = (-1);
m[14] = (2 * zFar * zNear) / (zNear - zFar);
m[15] = 0;
return m;
}
private void zeugMitMaus() {
if(Mouse.isButtonDown(0)){
for(int i = 0; i < coords.length; i+=3){
FloatBuffer punktPos = BufferUtils.createFloatBuffer(3);
GLU.gluProject(coords**, coords[i+1], coords[i+2], modelMatrix, projectionMatrix, viewport, punktPos);
if(punktPos.get(0) > Mouse.getX()-10 && punktPos.get(0) < Mouse.getX()+10 &&
punktPos.get(1) > Display.getHeight()-Mouse.getY()-10 && punktPos.get(1) < Display.getHeight()-Mouse.getY()+10){
geklickterPunkt = i/3;
punktLöschen = true;
break;
}else{
punktLöschen = false;
}
}
}
if(punktLöschen){
punktLöschen(geklickterPunkt);
init(coords, indexe);
punktLöschen = false;
}
}
private void init(float[] coords, int[] indexe) {
vertexBuffer = BufferUtils.createFloatBuffer(coords.length);
vertexBuffer.put(coords);
vertexBuffer.flip();
vboID = createVBO(vertexBuffer, vboID);
indexBuffer = BufferUtils.createIntBuffer(indexe.length);
indexBuffer.put(indexe);
indexBuffer.flip();
}
public static void main(String[] args){
new KSKB();
}
private int[] getGleichePunkte(int punktIndex) {
ArrayList<Integer> indexe = new ArrayList<Integer>();
Vector3f vergleich = new Vector3f(vertexBuffer.get(punktIndex), vertexBuffer.get(punktIndex+1), vertexBuffer.get(punktIndex+2));
for(int i = 0; i < vertexBuffer.capacity(); i+=3){
Vector3f vec = new Vector3f(vertexBuffer.get(i), vertexBuffer.get(i+1), vertexBuffer.get(i+2));
if(vec.x == vergleich.x && vec.y == vergleich.y && vec.z == vergleich.z){
indexe.add(i);
}
}
int[] inds = new int[indexe.size()];
for(int i = 0; i < inds.length; i++){
inds** = indexe.get(i);
}
return inds;
}
public void punktLöschen(int punktIndex) {
int[] inds = getGleichePunkte(punktIndex);
System.out.println("Folgender Punkt wurde geklickt: "+punktIndex);
System.out.println("Der Punkt kommt "+inds.length+" Mal vor");
System.out.println("Vorher:");
ArrayList<Float[]> coords = new ArrayList<Float[]>();
for(int i = 0; i < this.coords.length; i+=3){
coords.add(new Float[]{this.coords**, this.coords[i+1], this.coords[i+2]});
System.out.println(this.coords**+" "+this.coords[i+1]+" "+this.coords[i+2]);
}
for(int z = 0; z < inds.length; z++){
int gelöschterPunkt = inds[z];
for(int i = 0; i < coords.size(); i++){
if(i==gelöschterPunkt){
coords.remove(i);
i--;
if(inds[z] < coords.size()-1){
for(int a = 0; a < inds.length; a++){
inds[a]--;
}
}
}
}
}
int a = 0;
System.out.println("Nachher:");
this.coords = new float[coords.size()*3];
for(int i = 0; i < coords.size(); i+=3){
this.coords** = coords.get(a)[0];
this.coords[i+1] = coords.get(a)[1];
this.coords[i+2] = coords.get(a)[2];
System.out.println(this.coords**+" "+this.coords[i+1]+" "+this.coords[i+2]);
a++;
}
}
private int createVBO(FloatBuffer b, int id) {
GL15.glDeleteBuffers(id);
id = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, id);
glBufferData(GL_ARRAY_BUFFER, b, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
return id;
}
}