| 91 | } |
| 92 | |
| 93 | void TerrainFile::_buildGridMap() |
| 94 | { |
| 95 | // The grid level count is the same as the |
| 96 | // most significant bit of the size. While |
| 97 | // we loop we take the time to calculate the |
| 98 | // grid memory pool size. |
| 99 | mGridLevels = 0; |
| 100 | U32 size = mSize; |
| 101 | U32 poolSize = size * size; |
| 102 | while ( size >>= 1 ) |
| 103 | { |
| 104 | poolSize += size * size; |
| 105 | mGridLevels++; |
| 106 | } |
| 107 | |
| 108 | mGridMapPool.setSize( poolSize ); |
| 109 | mGridMapPool.compact(); |
| 110 | mGridMap.setSize( mGridLevels + 1 ); |
| 111 | mGridMap.compact(); |
| 112 | |
| 113 | // Assign memory from the pool to each grid level. |
| 114 | TerrainSquare *grid = mGridMapPool.address(); |
| 115 | for ( S32 i = mGridLevels; i >= 0; i-- ) |
| 116 | { |
| 117 | mGridMap[i] = grid; |
| 118 | grid += 1 << ( 2 * ( mGridLevels - i ) ); |
| 119 | } |
| 120 | |
| 121 | for( S32 i = mGridLevels; i >= 0; i-- ) |
| 122 | { |
| 123 | S32 squareCount = 1 << ( mGridLevels - i ); |
| 124 | S32 squareSize = mSize / squareCount; |
| 125 | |
| 126 | for ( S32 squareX = 0; squareX < squareCount; squareX++ ) |
| 127 | { |
| 128 | for ( S32 squareY = 0; squareY < squareCount; squareY++ ) |
| 129 | { |
| 130 | U16 min = 0xFFFF; |
| 131 | U16 max = 0; |
| 132 | U16 mindev45 = 0; |
| 133 | U16 mindev135 = 0; |
| 134 | |
| 135 | // determine max error for both possible splits. |
| 136 | |
| 137 | const Point3F p1(0, 0, getHeight(squareX * squareSize, squareY * squareSize)); |
| 138 | const Point3F p2(0, (F32)squareSize, getHeight(squareX * squareSize, squareY * squareSize + squareSize)); |
| 139 | const Point3F p3((F32)squareSize, (F32)squareSize, getHeight(squareX * squareSize + squareSize, squareY * squareSize + squareSize)); |
| 140 | const Point3F p4((F32)squareSize, 0, getHeight(squareX * squareSize + squareSize, squareY * squareSize)); |
| 141 | |
| 142 | // pl1, pl2 = split45, pl3, pl4 = split135 |
| 143 | const PlaneF pl1(p1, p2, p3); |
| 144 | const PlaneF pl2(p1, p3, p4); |
| 145 | const PlaneF pl3(p1, p2, p4); |
| 146 | const PlaneF pl4(p2, p3, p4); |
| 147 | |
| 148 | bool parentSplit45 = false; |
| 149 | TerrainSquare *parent = NULL; |
| 150 | if ( i < mGridLevels ) |