package de.gamezock.metacraft.data; import java.nio.IntBuffer; import java.util.List; import java.util.Vector; import javax.vecmath.Point3f; import javax.vecmath.Vector3f; public abstract class Map { private float[][] heightmap; private VertexBuffer vertexBuffer; private IntBuffer indexBuffer; private void setVertex(int x, int y, Point3f vertex) { vertexBuffer.setVertex(getVertexIndex(x, y), vertex); } private Point3f getVertex(int x, int y) { return vertexBuffer.getVertex(getVertexIndex(x, y)); } private int getVertexIndex(int x, int y) { if(y >= getHeight()) { return getWidth()*getHeight() + (y-getHeight())*(getWidth()-1) + x; } else { return y*getWidth() + x; } } public VertexBuffer getVertexBuffer() { return vertexBuffer; } public IntBuffer getIndexBuffer() { return indexBuffer; } protected void createMapData(float[][] heightmap) { this.heightmap = heightmap; List triangleData = new Vector(); vertexBuffer = new VertexBuffer(getWidth()*getHeight() + (getWidth()-1)*(getHeight()-1)); for(int x = 0; x < getWidth(); ++x) { for(int y = 0; y < getHeight(); ++y) { setVertex(x, y, new Point3f(x, y, heightmap[x][y])); if(x > 0 && y > 0) { Point3f center = new Point3f(); center.add(getVertex(x-1, y-1)); center.add(getVertex(x, y-1)); center.add(getVertex(x-1, y)); center.add(getVertex(x, y)); center.scale(0.25f); setVertex(x-1, getHeight()+y-1, center); } } } for(int x = 0; x < getWidth()-1; ++x) { for(int y = 0; y < getHeight()-1; ++y) { for(int i = 0; i < 4; ++i) { int i_1 = (i+1)%4; int i_2 = (i+2)%4; int v1 = getVertexIndex(x + i_1/2, y + i/2); int v2 = getVertexIndex(x, getHeight()+y); int v3 = getVertexIndex(x + i_2/2, y + i_1/2); triangleData.add(new IndexedTriangle(vertexBuffer, v1, v2, v3)); } } } indexBuffer = IntBuffer.allocate(3 * triangleData.size()); for(IndexedTriangle t : triangleData) { Vector3f normal = t.getNormal(); for(int i = 0; i < 3; ++i) { int index = t.getIndex(i); Vector3f vNormal = vertexBuffer.getNormal(index); vNormal.add(normal); vertexBuffer.setNormal(index, vNormal); indexBuffer.put(index); } } for(int i = 0; i < vertexBuffer.getSize(); ++i) { Vector3f normal = vertexBuffer.getNormal(i); normal.normalize(); vertexBuffer.setNormal(i, normal); } } public int getWidth() { return heightmap.length; } public int getHeight() { return heightmap[0].length; } }