From 32117d0bf27e0a72165707fe4e56d231136e734b Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 16 Jan 2010 17:50:43 +0100 Subject: Use index buffers to render tiles --- src/de/gamezock/metacraft/data/TestTile.java | 114 +++++++++++++++++++++++++-- 1 file changed, 109 insertions(+), 5 deletions(-) (limited to 'src/de/gamezock/metacraft/data/TestTile.java') diff --git a/src/de/gamezock/metacraft/data/TestTile.java b/src/de/gamezock/metacraft/data/TestTile.java index 229f425..0516cec 100644 --- a/src/de/gamezock/metacraft/data/TestTile.java +++ b/src/de/gamezock/metacraft/data/TestTile.java @@ -1,18 +1,112 @@ 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 { - float[][] heightmap; + private List triangleData; + private float[][] heightmap; + private VertexBuffer vertexBuffer; + private IntBuffer indexBuffer; + public TestTile() { - heightmap = new float[getSize()][getSize()]; + heightmap = new float[getSize()+1][getSize()+1]; - for(int i = 0; i < getSize(); ++i) { - for(int j = 0; j < getSize(); ++j) { - heightmap[i][j] = 0.2f * ((i+j)%2); + 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; @@ -27,4 +121,14 @@ public class TestTile implements TileData { public TileType getType() { return new TileType(); } + + @Override + public List getTriangles() { + return triangleData; + } + + @Override + public IntBuffer getIndexBuffer() { + return indexBuffer; + } } -- cgit v1.2.3