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
|
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<IndexedTriangle> triangleData = new Vector<IndexedTriangle>();
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;
}
}
|