void TerrainRenderer::UpdateTriangleColor(const MapPoint pt, const GameWorldViewer& gwv, const bool update) { unsigned int pos = GetTriangleIdx(pt); Color& clr0 = gl_colors[pos][0]; Color& clr1 = gl_colors[pos][1]; Color& clr2 = gl_colors[pos][2]; clr0.r = clr0.g = clr0.b = GetColor(gwv.GetNeighbour(pt, 4)); clr1.r = clr1.g = clr1.b = GetColor(pt); clr2.r = clr2.g = clr2.b = GetColor(gwv.GetNeighbour(pt, 5)); ++pos; Color& clr3 = gl_colors[pos][0]; Color& clr4 = gl_colors[pos][1]; Color& clr5 = gl_colors[pos][2]; clr3.r = clr3.g = clr3.b = GetColor(pt); clr4.r = clr4.g = clr4.b = GetColor(gwv.GetNeighbour(pt, 4)); clr5.r = clr5.g = clr5.b = GetColor(gwv.GetNeighbour(pt, 3)); /// Bei Vertexbuffern das die Daten aktualisieren if(update && vboBuffersUsed) { glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo_colors); glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, (pos - 1) * sizeof(ColorTriangle), 2 * sizeof(ColorTriangle), &gl_colors[pos - 1]); } }
void TerrainRenderer::VisibilityChanged(const MapPoint pt, const GameWorldViewer& gwv) { /// Noch kein Terrain gebaut? abbrechen if(vertices.empty()) return; UpdateVertexColor(pt, gwv); for(unsigned i = 0; i < 6; ++i) UpdateVertexColor(gwv.GetNeighbour(pt, i), gwv); // und für die Ränder UpdateBorderVertex(pt, gwv); for(unsigned i = 0; i < 6; ++i) UpdateBorderVertex(gwv.GetNeighbour(pt, i), gwv); // den selbst sowieso die Punkte darum updaten, da sich bei letzteren die Schattierung geändert haben könnte UpdateTriangleColor(pt, gwv, true); for(unsigned i = 0; i < 6; ++i) UpdateTriangleColor(gwv.GetNeighbour(pt, i), gwv, true); // und für die Ränder UpdateBorderTriangleColor(pt, gwv, true); for(unsigned i = 0; i < 6; ++i) UpdateBorderTriangleColor(gwv.GetNeighbour(pt, i), gwv, true); }
/// erzeugt Rand-Vertex void TerrainRenderer::UpdateBorderVertex(const MapPoint pt, const GameWorldViewer& gwv) { /// @todo GetTerrainX und Co durch GetTerrainXA ausdrücken Vertex& vertex = GetVertex(pt); vertex.borderPos[0] = ( GetTerrainAround(pt, 5) + GetTerrain(pt) + GetTerrainAround(pt, 4) ) / 3.0f; vertex.borderColor[0] = ( GetColor(gwv.GetNeighbour(pt, 5)) + GetColor(pt) + GetColor(gwv.GetNeighbour(pt, 4)) ) / 3.0f; vertex.borderPos[1] = ( GetTerrainAround(pt, 3) + GetTerrain(pt) + GetTerrainAround(pt, 4) ) / 3.0f; vertex.borderColor[1] = ( GetColor(gwv.GetNeighbour(pt, 3)) + GetColor(pt) + GetColor(gwv.GetNeighbour(pt, 4)) ) / 3.0f; }
void TerrainRenderer::AltitudeChanged(const MapPoint pt, const GameWorldViewer& gwv) { // den selbst sowieso die Punkte darum updaten, da sich bei letzteren die Schattierung geändert haben könnte UpdateVertexPos(pt, gwv); UpdateVertexColor(pt, gwv); for(unsigned i = 0; i < 6; ++i) UpdateVertexColor(gwv.GetNeighbour(pt, i), gwv); // und für die Ränder UpdateBorderVertex(pt, gwv); for(unsigned i = 0; i < 6; ++i) UpdateBorderVertex(gwv.GetNeighbour(pt, i), gwv); // den selbst sowieso die Punkte darum updaten, da sich bei letzteren die Schattierung geändert haben könnte UpdateTrianglePos(pt, gwv, true); UpdateTriangleColor(pt, gwv, true); for(unsigned i = 0; i < 6; ++i) { UpdateTrianglePos(gwv.GetNeighbour(pt, i), gwv, true); UpdateTriangleColor(gwv.GetNeighbour(pt, i), gwv, true); } // Auch im zweiten Kreis drumherum die Dreiecke neu berechnen, da die durch die Schattenänderung der umliegenden // Punkte auch geändert werden könnten for(unsigned i = 0; i < 12; ++i) UpdateTriangleColor(gwv.GetNeighbour2(pt, i), gwv, true); // und für die Ränder UpdateBorderTrianglePos(pt, gwv, true); UpdateBorderTriangleColor(pt, gwv, true); for(unsigned i = 0; i < 6; ++i) { UpdateBorderTrianglePos(gwv.GetNeighbour(pt, i), gwv, true); UpdateBorderTriangleColor(gwv.GetNeighbour(pt, i), gwv, true); } for(unsigned i = 0; i < 12; ++i) UpdateBorderTriangleColor(gwv.GetNeighbour2(pt, i), gwv, true); }
void TerrainRenderer::UpdateBorderTriangleColor(const MapPoint pt, const GameWorldViewer& gwv, const bool update) { unsigned int pos = GetVertexIdx(pt); // Für VBO-Aktualisierung: // Erzeugte Ränder zählen unsigned count_borders = 0; // Erstes Offset merken unsigned first_offset = 0; // Rand links - rechts for(unsigned char i = 0; i < 2; ++i) { if(!borders[pos].left_right[i]) continue; unsigned int offset = borders[pos].left_right_offset[i]; if(!first_offset) first_offset = offset; gl_colors[offset][i ? 0 : 2].r = gl_colors[offset][i ? 0 : 2].g = gl_colors[offset][i ? 0 : 2].b = GetColor(pt); //-V807 gl_colors[offset][1 ].r = gl_colors[offset][1 ].g = gl_colors[offset][1 ].b = GetColor(gwv.GetNeighbour(pt, 4)); //-V807 gl_colors[offset][i ? 2 : 0].r = gl_colors[offset][i ? 2 : 0].g = gl_colors[offset][i ? 2 : 0].b = GetBColor(pt, i); //-V807 ++count_borders; } // Rand rechts - links for(unsigned char i = 0; i < 2; ++i) { if(!borders[pos].right_left[i]) continue; unsigned int offset = borders[pos].right_left_offset[i]; if(!first_offset) first_offset = offset; gl_colors[offset][i ? 2 : 0].r = gl_colors[offset][i ? 2 : 0].g = gl_colors[offset][i ? 2 : 0].b = GetColor(gwv.GetNeighbour(pt, 4)); gl_colors[offset][1 ].r = gl_colors[offset][1 ].g = gl_colors[offset][1 ].b = GetColor(gwv.GetNeighbour(pt, 3)); MapPoint pt2(pt.x + i, pt.y); if(pt2.x >= width) pt2.x -= width; gl_colors[offset][i ? 0 : 2].r = gl_colors[offset][i ? 0 : 2].g = gl_colors[offset][i ? 0 : 2].b = GetBColor(pt2, i ? 0 : 1); ++count_borders; } // Rand oben - unten for(unsigned char i = 0; i < 2; ++i) { if(!borders[pos].top_down[i]) continue; unsigned int offset = borders[pos].top_down_offset[i]; if(!first_offset) first_offset = offset; gl_colors[offset][i ? 2 : 0].r = gl_colors[offset][i ? 2 : 0].g = gl_colors[offset][i ? 2 : 0].b = GetColor(gwv.GetNeighbour(pt, 5)); gl_colors[offset][1 ].r = gl_colors[offset][1 ].g = gl_colors[offset][1 ].b = GetColor(gwv.GetNeighbour(pt, 4)); if(i == 0) gl_colors[offset][2].r = gl_colors[offset][2].g = gl_colors[offset][2].b = GetBColor(pt, i); //-V807 else gl_colors[offset][0].r = gl_colors[offset][0].g = gl_colors[offset][0].b = GetBColor(gwv.GetNeighbour(pt, 5), i); //-V807 ++count_borders; } /// Bei Vertexbuffern das die Daten aktualisieren if(update && vboBuffersUsed) { glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo_colors); glBufferSubDataARB(GL_ARRAY_BUFFER_ARB, first_offset * sizeof(ColorTriangle), count_borders * sizeof(ColorTriangle), &gl_colors[first_offset]); } }