void Patch::UpdateHeightMap(const SRectangle& rect) { if (vertices.empty()) { vertices.resize(3 * (PATCH_SIZE + 1) * (PATCH_SIZE + 1)); unsigned int index = 0; // initialize vertices for (int z = coors.y; z <= (coors.y + PATCH_SIZE); z++) { for (int x = coors.x; x <= (coors.x + PATCH_SIZE); x++) { vertices[index++] = x * SQUARE_SIZE; vertices[index++] = 0.0f; vertices[index++] = z * SQUARE_SIZE; } } } const float* hMap = readMap->GetCornerHeightMapUnsynced(); for (int z = rect.z1; z <= rect.z2; z++) { for (int x = rect.x1; x <= rect.x2; x++) { const int vindex = (z * (PATCH_SIZE + 1) + x) * 3; const int xw = x + coors.x; const int zw = z + coors.y; // only update y-coord vertices[vindex + 1] = hMap[zw * mapDims.mapxp1 + xw]; } } VBOUploadVertices(); isDirty = true; }
void Patch::Upload() { switch (renderMode) { case DL: { glNewList(triList, GL_COMPILE); glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, 0, &vertices[0]); glDrawRangeElements(GL_TRIANGLES, 0, vertices.size(), indices.size(), GL_UNSIGNED_INT, &indices[0]); glDisableClientState(GL_VERTEX_ARRAY); glEndList(); } break; case VBO: { if (!vboVerticesUploaded) VBOUploadVertices(); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, vertexIndexBuffer); glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, indices.size() * sizeof(unsigned), &indices[0], GL_DYNAMIC_DRAW_ARB); /* int bufferSize = 0; glGetBufferParameterivARB(GL_ELEMENT_ARRAY_BUFFER_ARB, GL_BUFFER_SIZE_ARB, &bufferSize); if(rend != bufferSize) { glDeleteBuffersARB(1, &vertexIndexBuffer); LOG( "[createVBO()] Data size is mismatch with input array\n" ); } */ glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); } break; default: { } break; } }
void Patch::UpdateHeightMap(const SRectangle& rect) { if (vertices.empty()) { // Initialize vertices.resize(3 * (PATCH_SIZE + 1) * (PATCH_SIZE + 1)); int index = 0; for (int z = m_WorldY; z <= (m_WorldY + PATCH_SIZE); z++) { for (int x = m_WorldX; x <= (m_WorldX + PATCH_SIZE); x++) { vertices[index++] = x * SQUARE_SIZE; vertices[index++] = 0.0f; vertices[index++] = z * SQUARE_SIZE; } } } static const float* hMap = readmap->GetCornerHeightMapUnsynced(); for (int z = rect.z1; z <= rect.z2; z++) { for (int x = rect.x1; x <= rect.x2; x++) { const float& h = hMap[(z + m_WorldY) * gs->mapxp1 + (x + m_WorldX)]; const int vindex = (z * (PATCH_SIZE + 1) + x) * 3; vertices[vindex + 1] = h; // only update Y coord //if (h < minHeight) minHeight = h; //if (h > maxHeight) maxHeight = h; } } VBOUploadVertices(); m_isDirty = true; }