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 class TestTile implements TileData { private List triangleData; private float[][] heightmap; private VertexBuffer vertexBuffer; private IntBuffer indexBuffer; public TestTile() { heightmap = new float[getSize()+1][getSize()+1]; for(int i = 0; i <= getSize(); ++i) { for(int j = 0; j <= getSize(); ++j) { heightmap[i][j] = ((i-4)*(i-4)+(j-4)*(j-4))*0.05f; } } createTileData(); } 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 > getSize()) { return (getSize()+1)*(getSize()+1) + (y-getSize()-1)*getSize() + x; } else { return y*(getSize()+1) + x; } } private void createTileData() { triangleData = new Vector(); vertexBuffer = new VertexBuffer((getSize()+1)*(getSize()+1) + getSize()*getSize()); for(int x = 0; x < heightmap.length; ++x) { for(int y = 0; y < heightmap[x].length; ++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, y+getSize(), center); } } } for(int x = 0; x < heightmap.length-1; ++x) { for(int y = 0; y < heightmap[x].length-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, y+getSize()+1); int v3 = getVertexIndex(x + i_2/2, y + i_1/2); triangleData.add(new IndexedTriangle(vertexBuffer, v1, v2, v3)); } } } 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); } } for(int i = 0; i < vertexBuffer.getSize(); ++i) { Vector3f normal = vertexBuffer.getNormal(i); normal.normalize(); vertexBuffer.setNormal(i, normal); } indexBuffer = IntBuffer.allocate(3 * triangleData.size()); for(IndexedTriangle t : triangleData) { for(int i = 0; i < 3; ++i) { indexBuffer.put(t.getIndex(i)); } } } @Override public int getSize() { return 8; } @Override public float[][] getHeightmap() { return heightmap; } @Override public TileType getType() { return new TileType(); } @Override public List getTriangles() { return triangleData; } @Override public IntBuffer getIndexBuffer() { return indexBuffer; } }