From 9cb41d127063297432f768f7cb0f466b76921103 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Mon, 18 Jan 2010 21:18:07 +0100 Subject: Give up tile based maps; maps look much better now --- src/de/gamezock/metacraft/data/Map.java | 116 +++++++++++++++++++++++++------- 1 file changed, 92 insertions(+), 24 deletions(-) (limited to 'src/de/gamezock/metacraft/data/Map.java') diff --git a/src/de/gamezock/metacraft/data/Map.java b/src/de/gamezock/metacraft/data/Map.java index c6d306b..79c591a 100644 --- a/src/de/gamezock/metacraft/data/Map.java +++ b/src/de/gamezock/metacraft/data/Map.java @@ -1,33 +1,105 @@ package de.gamezock.metacraft.data; +import java.nio.IntBuffer; +import java.util.List; +import java.util.Vector; -public class Map { - Tile[][] tiles; +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 Map() { - int width = 5; - int height = 5; + public IntBuffer getIndexBuffer() { + return indexBuffer; + } + + protected void createMapData(float[][] heightmap) { + this.heightmap = heightmap; + + List triangleData = new Vector(); - heightmap = new float[width][height]; - tiles = new Tile[width][height]; + vertexBuffer = new VertexBuffer(getWidth()*getHeight() + (getWidth()-1)*(getHeight()-1)); - for(int i = 0; i < width; ++i) { - for(int j = 0; j < height; ++j) { - //heightmap[i][j] = ((i-2)*(i-2)+(j-2)*(j-2))*0.5f; - heightmap[i][j] = 0; - tiles[i][j] = new Tile(new TestTile()); + 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); + } } } - } - - public Tile getTile(int x, int y) { - return tiles[x][y]; - } - - public float getTileHeight(int x, int y) { - return heightmap[x][y]; + + 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() { @@ -37,8 +109,4 @@ public class Map { public int getHeight() { return heightmap[0].length; } - - public int getTileSize() { - return tiles[0][0].getData().getSize(); - } } -- cgit v1.2.3