void TerrainMipMapLevel::Init( TerrainPatch* aPatch, HeightGrid* aGrid, float spacing, Screen3D* screen) { m_parentPatch = aPatch; m_baseGrid = aGrid->Duplicate(); m_simplifiedGrid = m_baseGrid->MakeSimplificationTarget(); m_spacing = spacing; m_interpolation = 0.0f; //CVar.WriteLine( "Creating vertex buffer... %d x %d", m_baseGrid->Size(), m_baseGrid->Size() ); m_screenPtr = screen; m_vertices = MakeVertices(); if( !m_vertexBuffer.Init ( *screen, 0, sizeof(TerrainLODVertex), m_baseGrid->Size()*m_baseGrid->Size(), false, true ) ) { CVar.WriteLine( "TerrainMipMapLevel: Failed to initialize vertex buffer" ); } if( !m_targetVertexBuffer.Init ( *screen, 0, sizeof(TerrainLODVertex), m_simplifiedGrid->Size()*m_simplifiedGrid->Size(), false, true ) ) { CVar.WriteLine( "TerrainMipMapLevel: Failed to initialize target vertex buffer" ); } m_indexBlock = new TerrainIndexBlock( screen, aGrid->Size() ); InitVertexHeights(); }
void GLWall::RenderWall(int textured) { gl_RenderState.Apply(); gl_RenderState.ApplyLightIndex(dynlightindex); if (gl.buffermethod != BM_DEFERRED) { MakeVertices(!(textured&RWF_NOSPLIT)); } else if (vertcount == 0) { // This should never happen but in case it actually does, use the quad drawer as fallback (without edge splitting.) // This way it at least gets drawn. FQuadDrawer qd; qd.Set(0, glseg.x1, zbottom[0], glseg.y1, tcs[LOLFT].u, tcs[LOLFT].v); qd.Set(1, glseg.x1, ztop[0], glseg.y1, tcs[UPLFT].u, tcs[UPLFT].v); qd.Set(2, glseg.x2, ztop[1], glseg.y2, tcs[UPRGT].u, tcs[UPRGT].v); qd.Set(3, glseg.x2, zbottom[1], glseg.y2, tcs[LORGT].u, tcs[LORGT].v); qd.Render(GL_TRIANGLE_FAN); vertexcount += 4; return; } GLRenderer->mVBO->RenderArray(GL_TRIANGLE_FAN, vertindex, vertcount); vertexcount += vertcount; }
void GLWall::RenderWall(int textured) { gl_RenderState.Apply(); gl_RenderState.ApplyLightIndex(dynlightindex); #ifdef NO_VBO bool nosplit = !!(textured&RWF_NOSPLIT); bool split = (gl_seamless && !nosplit && seg->sidedef != NULL && !(seg->sidedef->Flags & WALLF_POLYOBJ) && !(flags & GLWF_NOSPLIT)); #if 1 // A bit quicker due to batching, still not very fast.. glBegin(GL_TRIANGLE_FAN); // lower left corner if (textured&1) glTexCoord2f(tcs[0].u,tcs[0].v); glVertex3f(glseg.x1,zbottom[0],glseg.y1); //if (split && glseg.fracleft==0) SplitLeftEdge(tcs); // upper left corner if (textured&1) glTexCoord2f(tcs[1].u,tcs[1].v); glVertex3f(glseg.x1,ztop[0],glseg.y1); //if (split && !(flags & GLWF_NOSPLITUPPER)) SplitUpperEdge(tcs); // color for right side //if (color2) glColor4fv(color2); // upper right corner if (textured&1) glTexCoord2f(tcs[2].u,tcs[2].v); glVertex3f(glseg.x2,ztop[1],glseg.y2); //if (split && glseg.fracright==1) SplitRightEdge(tcs); // lower right corner if (textured&1) glTexCoord2f(tcs[3].u,tcs[3].v); glVertex3f(glseg.x2,zbottom[1],glseg.y2); //if (split && !(flags & GLWF_NOSPLITLOWER)) SplitLowerEdge(tcs); glEnd(); vertexcount+=4; #else static FFlatVertex vtx[100]; // Yes this is static. It's only used once, and I think it's faster as the address doesn't keep changing FFlatVertex *ptr = &vtx[0]; ptr->Set(glseg.x1, zbottom[0], glseg.y1, tcs[LOLFT].u, tcs[LOLFT].v); ptr++; if (split && glseg.fracleft == 0) SplitLeftEdge(ptr); ptr->Set(glseg.x1, ztop[0], glseg.y1, tcs[UPLFT].u, tcs[UPLFT].v); ptr++; if (split && !(flags & GLWF_NOSPLITUPPER)) SplitUpperEdge(ptr); ptr->Set(glseg.x2, ztop[1], glseg.y2, tcs[UPRGT].u, tcs[UPRGT].v); ptr++; if (split && glseg.fracright == 1) SplitRightEdge(ptr); ptr->Set(glseg.x2, zbottom[1], glseg.y2, tcs[LORGT].u, tcs[LORGT].v); ptr++; if (split && !(flags & GLWF_NOSPLITLOWER)) SplitLowerEdge(ptr); // We can workout how many from the difference in pointers vertcount = (ptr - &vtx[0]); glTexCoordPointer(2,GL_FLOAT, sizeof(FFlatVertex),&vtx[0].u); glVertexPointer (3,GL_FLOAT, sizeof(FFlatVertex),&vtx[0].x); glEnableClientState (GL_VERTEX_ARRAY); glEnableClientState (GL_TEXTURE_COORD_ARRAY); glDisableClientState (GL_COLOR_ARRAY); glBindBuffer (GL_ARRAY_BUFFER, 0); // NO VBO glDrawArrays (GL_TRIANGLE_FAN, 0, vertcount); vertexcount += vertcount; #endif #else if (gl.buffermethod != BM_DEFERRED) { MakeVertices(!!(textured&RWF_NOSPLIT)); } else if (vertcount == 0) { // This should never happen but in case it actually does, use the quad drawer as fallback (without edge splitting.) // This way it at least gets drawn. FQuadDrawer qd; qd.Set(0, glseg.x1, zbottom[0], glseg.y1, tcs[LOLFT].u, tcs[LOLFT].v); qd.Set(1, glseg.x1, ztop[0], glseg.y1, tcs[UPLFT].u, tcs[UPLFT].v); qd.Set(2, glseg.x2, ztop[1], glseg.y2, tcs[UPRGT].u, tcs[UPRGT].v); qd.Set(3, glseg.x2, zbottom[1], glseg.y2, tcs[LORGT].u, tcs[LORGT].v); qd.Render(GL_TRIANGLE_FAN); vertexcount += 4; return; } GLRenderer->mVBO->RenderArray(GL_TRIANGLE_FAN, vertindex, vertcount); vertexcount += vertcount; #endif }