Changeset 25323

Timestamp:
Apr 26, 2021, 11:11:35 PM (3 years ago)
Author:
Vladislav Belov
Message:

Removes glBegin from scene rendering, removes GL matrix stack dependency from scene rendering.

Location:
ps/trunk/source/renderer
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • ps/trunk/source/renderer/DebugRenderer.cpp

    r25315 r25323  
    138138}
    139139
    140 void CDebugRenderer::DrawCameraFrustum(const CCamera& camera, int intermediates) const
     140void CDebugRenderer::DrawCameraFrustum(const CCamera& camera, int intermediates) const
    141141{
    142142#if CONFIG2_GLES
     
    154154    }
    155155
    156     // near plane
    157     glBegin(GL_POLYGON);
    158         glVertex3fv(&nearPoints[0].X);
    159         glVertex3fv(&nearPoints[1].X);
    160         glVertex3fv(&nearPoints[2].X);
    161         glVertex3fv(&nearPoints[3].X);
    162     glEnd();
    163 
    164     // far plane
    165     glBegin(GL_POLYGON);
    166         glVertex3fv(&farPoints[0].X);
    167         glVertex3fv(&farPoints[1].X);
    168         glVertex3fv(&farPoints[2].X);
    169         glVertex3fv(&farPoints[3].X);
    170     glEnd();
    171 
    172     // connection lines
    173     glBegin(GL_QUAD_STRIP);
    174         glVertex3fv(&nearPoints[0].X);
    175         glVertex3fv(&farPoints[0].X);
    176         glVertex3fv(&nearPoints[1].X);
    177         glVertex3fv(&farPoints[1].X);
    178         glVertex3fv(&nearPoints[2].X);
    179         glVertex3fv(&farPoints[2].X);
    180         glVertex3fv(&nearPoints[3].X);
    181         glVertex3fv(&farPoints[3].X);
    182         glVertex3fv(&nearPoints[0].X);
    183         glVertex3fv(&farPoints[0].X);
    184     glEnd();
    185 
    186     // intermediate planes
     156    CShaderTechniquePtr overlayTech =
     157        g_Renderer.GetShaderManager().LoadEffect(str_debug_line);
     158    overlayTech->BeginPass();
     159    CShaderProgramPtr overlayShader = overlayTech->GetShader();
     160
     161    overlayShader->Bind();
     162    overlayShader->Uniform(str_transform, g_Renderer.GetViewCamera().GetViewProjection());
     163    overlayShader->Uniform(str_color, color);
     164
     165    std::vector<float> vertices;
     166#define ADD(position) \
     167    vertices.emplace_back((position).X); \
     168    vertices.emplace_back((position).Y); \
     169    vertices.emplace_back((position).Z);
     170
     171    // Near plane.
     172    ADD(nearPoints[0]);
     173    ADD(nearPoints[1]);
     174    ADD(nearPoints[2]);
     175    ADD(nearPoints[3]);
     176
     177    // Far plane.
     178    ADD(farPoints[0]);
     179    ADD(farPoints[1]);
     180    ADD(farPoints[2]);
     181    ADD(farPoints[3]);
     182
     183    // Intermediate planes.
    187184    CVector3D intermediatePoints[4];
    188185    for(int i = 0; i < intermediates; ++i)
    189186    {
    190         float t = (i + 1.0f) / (intermediates + 1.0f);
     187        float t = (i + 1.0f) / (intermediates + 1.0f);
    191188
    192189        for(int j = 0; j < 4; ++j)
    193190            intermediatePoints[j] = nearPoints[j] * t + farPoints[j] * (1.0f - t);
    194191
    195         glBegin(GL_POLYGON);
    196             glVertex3fv(&intermediatePoints[0].X);
    197             glVertex3fv(&intermediatePoints[1].X);
    198             glVertex3fv(&intermediatePoints[2].X);
    199             glVertex3fv(&intermediatePoints[3].X);
    200         glEnd();
    201     }
     192        ADD(intermediatePoints[0]);
     193        ADD(intermediatePoints[1]);
     194        ADD(intermediatePoints[2]);
     195        ADD(intermediatePoints[3]);
     196    }
     197
     198    overlayShader->VertexPointer(3, GL_FLOAT, 0, vertices.data());
     199    overlayShader->AssertPointersBound();
     200    glDrawArrays(GL_QUADS, 0, vertices.size() / 3);
     201
     202    vertices.clear();
     203
     204    // Connection lines.
     205    ADD(nearPoints[0]);
     206    ADD(farPoints[0]);
     207    ADD(nearPoints[1]);
     208    ADD(farPoints[1]);
     209    ADD(nearPoints[2]);
     210    ADD(farPoints[2]);
     211    ADD(nearPoints[3]);
     212    ADD(farPoints[3]);
     213    ADD(nearPoints[0]);
     214    ADD(farPoints[0]);
     215
     216    overlayShader->VertexPointer(3, GL_FLOAT, 0, vertices.data());
     217    overlayShader->AssertPointersBound();
     218    glDrawArrays(GL_QUAD_STRIP, 0, vertices.size() / 3);
     219#undef ADD
     220
     221    overlayShader->Unbind();
     222    overlayTech->EndPass();
    202223#endif
    203224}
  • ps/trunk/source/renderer/DebugRenderer.h

    r25315 r25323  
    5353     * be hinted at between the near and far planes
    5454     */
    55     void DrawCameraFrustum(const CCamera& camera, int intermediates = 0) const;
     55    void DrawCameraFrustum(const CCamera& camera, int intermediates = 0) const;
    5656
    5757    /**
  • ps/trunk/source/renderer/TerrainOverlay.cpp

    r24154 r25323  
    1 /* Copyright (C) 2020 Wildfire Games.
     1/* Copyright (C) 202 Wildfire Games.
    22 * This file is part of 0 A.D.
    33 *
     
    2121
    2222#include "graphics/Color.h"
     23
     24
    2325#include "graphics/Terrain.h"
    2426#include "lib/bits.h"
     
    183185#else
    184186
    185     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
    186 
    187187    CVector3D pos[2][2];
    188188    for (int di = 0; di < 2; ++di)
     
    190190            m_Terrain->CalcPosition(i + di, j + dj, pos[di][dj]);
    191191
    192     glBegin(GL_TRIANGLES);
    193         glColor4fv(color.FloatArray());
    194         if (m_Terrain->GetTriangulationDir(i, j))
    195         {
    196             glVertex3fv(pos[0][0].GetFloatArray());
    197             glVertex3fv(pos[1][0].GetFloatArray());
    198             glVertex3fv(pos[0][1].GetFloatArray());
    199 
    200             glVertex3fv(pos[1][0].GetFloatArray());
    201             glVertex3fv(pos[1][1].GetFloatArray());
    202             glVertex3fv(pos[0][1].GetFloatArray());
    203         }
    204         else
    205         {
    206             glVertex3fv(pos[0][0].GetFloatArray());
    207             glVertex3fv(pos[1][0].GetFloatArray());
    208             glVertex3fv(pos[1][1].GetFloatArray());
    209 
    210             glVertex3fv(pos[1][1].GetFloatArray());
    211             glVertex3fv(pos[0][1].GetFloatArray());
    212             glVertex3fv(pos[0][0].GetFloatArray());
    213         }
    214     glEnd();
    215 
     192    std::vector<float> vertices;
     193#define ADD(position) \
     194    vertices.emplace_back((position).X); \
     195    vertices.emplace_back((position).Y); \
     196    vertices.emplace_back((position).Z);
     197
     198    if (m_Terrain->GetTriangulationDir(i, j))
     199    {
     200        ADD(pos[0][0]);
     201        ADD(pos[1][0]);
     202        ADD(pos[0][1]);
     203
     204        ADD(pos[1][0]);
     205        ADD(pos[1][1]);
     206        ADD(pos[0][1]);
     207    }
     208    else
     209    {
     210        ADD(pos[0][0]);
     211        ADD(pos[1][0]);
     212        ADD(pos[1][1]);
     213
     214        ADD(pos[1][1]);
     215        ADD(pos[0][1]);
     216        ADD(pos[0][0]);
     217    }
     218#undef ADD
     219
     220    CShaderTechniquePtr overlayTech =
     221        g_Renderer.GetShaderManager().LoadEffect(str_debug_line);
     222    overlayTech->BeginPass();
     223    CShaderProgramPtr overlayShader = overlayTech->GetShader();
     224
     225    overlayShader->Bind();
     226    overlayShader->Uniform(str_transform, g_Renderer.GetViewCamera().GetViewProjection());
     227    overlayShader->Uniform(str_color, color);
     228
     229    overlayShader->VertexPointer(3, GL_FLOAT, 0, vertices.data());
     230    overlayShader->AssertPointersBound();
     231
     232    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
     233    glDrawArrays(GL_TRIANGLES, 0, vertices.size() / 3);
     234
     235    overlayShader->Unbind();
     236    overlayTech->EndPass();
    216237#endif
    217238}
     
    244265        glLineWidth((float)line_width);
    245266
    246     CVector3D pos;
    247     glBegin(GL_QUADS);
    248         glColor4fv(color.FloatArray());
    249         m_Terrain->CalcPosition(i,   j,   pos); glVertex3fv(pos.GetFloatArray());
    250         m_Terrain->CalcPosition(i+1, j,   pos); glVertex3fv(pos.GetFloatArray());
    251         m_Terrain->CalcPosition(i+1, j+1, pos); glVertex3fv(pos.GetFloatArray());
    252         m_Terrain->CalcPosition(i,   j+1, pos); glVertex3fv(pos.GetFloatArray());
    253     glEnd();
     267    std::vector<float> vertices;
     268#define ADD(i, j) \
     269    m_Terrain->CalcPosition(i, j, position); \
     270    vertices.emplace_back(position.X); \
     271    vertices.emplace_back(position.Y); \
     272    vertices.emplace_back(position.Z);
     273
     274    CVector3D position;
     275    ADD(i,   j);
     276    ADD(i+1, j);
     277    ADD(i+1, j+1);
     278    ADD(i,   j+1);
     279#undef ADD
     280
     281    CShaderTechniquePtr overlayTech =
     282        g_Renderer.GetShaderManager().LoadEffect(str_debug_line);
     283    overlayTech->BeginPass();
     284    CShaderProgramPtr overlayShader = overlayTech->GetShader();
     285
     286    overlayShader->Bind();
     287    overlayShader->Uniform(str_transform, g_Renderer.GetViewCamera().GetViewProjection());
     288    overlayShader->Uniform(str_color, color);
     289
     290    overlayShader->VertexPointer(3, GL_FLOAT, 0, vertices.data());
     291    overlayShader->AssertPointersBound();
     292
     293    glDrawArrays(GL_QUADS, 0, vertices.size() / 3);
     294
     295    overlayShader->Unbind();
     296    overlayTech->EndPass();
    254297
    255298    if (line_width != 1)
    256299        glLineWidth(1.0f);
    257 
    258300#endif
    259301}
Note: See TracChangeset for help on using the changeset viewer.