1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
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<IndexedTriangle> 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<IndexedTriangle>();
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<IndexedTriangle> getTriangles() {
return triangleData;
}
@Override
public IntBuffer getIndexBuffer() {
return indexBuffer;
}
}
|