summaryrefslogtreecommitdiffstats
path: root/src/de/gamezock/metacraft/data/TestTile.java
blob: 0516cecb19757a2bb5e0a406b378a4654e92ae7a (plain)
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;
  }
}