This Trac instance is not used for development anymore!

We migrated our development workflow to git and Gitea.
To test the future redirection, replace trac by ariadne in the page URL.

Changeset 10106 for ps


Ignore:
Timestamp:
08/27/11 16:31:24 (13 years ago)
Author:
philip
Message:

Render territory borders in non-shader render path.
Add basic support for fixed-function implementations of shader API.

Location:
ps/trunk/source
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • ps/trunk/source/graphics/ShaderManager.cpp

    r9410 r10106  
    6363
    6464    CShaderProgramPtr program;
    65     if (NewProgram(name, defines, program) != PSRETURN_OK)
     65    if (!NewProgram(name, defines, program))
    6666    {
    6767        LOGERROR(L"Failed to load shader '%hs'", name);
     
    7575bool CShaderManager::NewProgram(const char* name, const std::map<CStr, CStr>& baseDefines, CShaderProgramPtr& program)
    7676{
     77    if (strncmp(name, "fixed:", 6) == 0)
     78    {
     79        program = CShaderProgramPtr(CShaderProgram::ConstructFFP(name+6));
     80        if (!program)
     81            return false;
     82        program->Reload();
     83        return true;
     84    }
     85
    7786    VfsPath xmlFilename = L"shaders/" + wstring_from_utf8(name) + L".xml";
    7887
     
    185194    m_HotloadFiles[fragmentFile].insert(program);
    186195
    187     return PSRETURN_OK;
     196    return true;
    188197}
    189198
  • ps/trunk/source/graphics/ShaderProgram.cpp

    r9123 r10106  
    198198    }
    199199
    200     virtual void Uniform(uniform_id_t id, int v)
    201     {
    202         Uniform(Binding(GetUniformVertexIndex(id), GetUniformFragmentIndex(id)), (float)v, (float)v, (float)v, (float)v);
    203     }
    204 
    205     virtual void Uniform(Binding id, int v)
    206     {
    207         Uniform(id, (float)v, (float)v, (float)v, (float)v);
    208     }
    209 
    210     virtual void Uniform(uniform_id_t id, float v)
    211     {
    212         Uniform(Binding(GetUniformVertexIndex(id), GetUniformFragmentIndex(id)), v, v, v, v);
    213     }
    214 
    215     virtual void Uniform(Binding id, float v)
    216     {
    217         Uniform(id, v, v, v, v);
    218     }
    219 
    220     virtual void Uniform(uniform_id_t id, float v0, float v1, float v2, float v3)
    221     {
    222         Uniform(Binding(GetUniformVertexIndex(id), GetUniformFragmentIndex(id)), v0, v1, v2, v3);
    223     }
    224 
    225200    virtual void Uniform(Binding id, float v0, float v1, float v2, float v3)
    226201    {
     
    230205        if (id.fragment != -1)
    231206            pglProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, (GLuint)id.fragment, v0, v1, v2, v3);
    232     }
    233 
    234     virtual void Uniform(uniform_id_t id, const CVector3D& v)
    235     {
    236         Uniform(Binding(GetUniformVertexIndex(id), GetUniformFragmentIndex(id)), v.X, v.Y, v.Z, 0.0f);
    237     }
    238 
    239     virtual void Uniform(Binding id, const CVector3D& v)
    240     {
    241         Uniform(id, v.X, v.Y, v.Z, 0.0f);
    242     }
    243 
    244     virtual void Uniform(uniform_id_t id, const CColor& v)
    245     {
    246         Uniform(Binding(GetUniformVertexIndex(id), GetUniformFragmentIndex(id)), v.r, v.g, v.b, v.a);
    247     }
    248 
    249     virtual void Uniform(Binding id, const CColor& v)
    250     {
    251         Uniform(id, v.r, v.g, v.b, v.a);
    252     }
    253 
    254     virtual void Uniform(uniform_id_t id, const CMatrix3D& v)
    255     {
    256         Uniform(Binding(GetUniformVertexIndex(id), GetUniformFragmentIndex(id)), v);
    257207    }
    258208
     
    312262    return m_StreamFlags;
    313263}
     264
     265void CShaderProgram::Uniform(Binding id, int v)
     266{
     267    Uniform(id, (float)v, (float)v, (float)v, (float)v);
     268}
     269
     270void CShaderProgram::Uniform(Binding id, float v)
     271{
     272    Uniform(id, v, v, v, v);
     273}
     274
     275void CShaderProgram::Uniform(Binding id, const CVector3D& v)
     276{
     277    Uniform(id, v.X, v.Y, v.Z, 0.0f);
     278}
     279
     280void CShaderProgram::Uniform(Binding id, const CColor& v)
     281{
     282    Uniform(id, v.r, v.g, v.b, v.a);
     283}
     284
     285void CShaderProgram::Uniform(uniform_id_t id, int v)
     286{
     287    Uniform(GetUniformBinding(id), (float)v, (float)v, (float)v, (float)v);
     288}
     289
     290void CShaderProgram::Uniform(uniform_id_t id, float v)
     291{
     292    Uniform(GetUniformBinding(id), v, v, v, v);
     293}
     294
     295void CShaderProgram::Uniform(uniform_id_t id, const CVector3D& v)
     296{
     297    Uniform(GetUniformBinding(id), v.X, v.Y, v.Z, 0.0f);
     298}
     299
     300void CShaderProgram::Uniform(uniform_id_t id, const CColor& v)
     301{
     302    Uniform(GetUniformBinding(id), v.r, v.g, v.b, v.a);
     303}
     304
     305void CShaderProgram::Uniform(uniform_id_t id, float v0, float v1, float v2, float v3)
     306{
     307    Uniform(GetUniformBinding(id), v0, v1, v2, v3);
     308}
     309
     310void CShaderProgram::Uniform(uniform_id_t id, const CMatrix3D& v)
     311{
     312    Uniform(GetUniformBinding(id), v);
     313}
  • ps/trunk/source/graphics/ShaderProgram.h

    r10017 r10106  
    3030class CVector3D;
    3131
     32// Vertex data stream flags
     33enum
     34{
     35    STREAM_POS = (1 << 0),
     36    STREAM_NORMAL = (1 << 1),
     37    STREAM_COLOR = (1 << 2),
     38    STREAM_UV0 = (1 << 3),
     39    STREAM_UV1 = (1 << 4),
     40    STREAM_UV2 = (1 << 5),
     41    STREAM_UV3 = (1 << 6),
     42    STREAM_POSTOUV0 = (1 << 7),
     43    STREAM_POSTOUV1 = (1 << 8),
     44    STREAM_POSTOUV2 = (1 << 9),
     45    STREAM_POSTOUV3 = (1 << 10)
     46};
     47
    3248/**
    3349 * A compiled vertex+fragment shader program.
     
    5369        int streamflags);
    5470
     71    /**
     72     * Construct an instance of a pre-defined fixed-function pipeline setup.
     73     */
     74    static CShaderProgram* ConstructFFP(const std::string& id);
     75
    5576    typedef const char* attrib_id_t;
    5677    typedef const char* texture_id_t;
     
    6283    struct Binding
    6384    {
    64         friend class CShaderProgramARB;
    65     private:
    6685        Binding(int v, int f) : vertex((i16)v), fragment((i16)f) { }
    67         i16 vertex;
    68         i16 fragment;
    69     public:
     86
    7087        Binding() : vertex(-1), fragment(-1) { }
    7188
     
    7592         */
    7693        bool Active() { return vertex != -1 || fragment != -1; }
     94
     95        i16 vertex;
     96        i16 fragment;
    7797    };
    7898
     
    117137    virtual Binding GetUniformBinding(uniform_id_t id) = 0;
    118138
    119     virtual void Uniform(uniform_id_t id, int v) = 0;
    120     virtual void Uniform(uniform_id_t id, float v) = 0;
    121     virtual void Uniform(uniform_id_t id, float v0, float v1, float v2, float v3) = 0;
    122     virtual void Uniform(uniform_id_t id, const CVector3D& v) = 0;
    123     virtual void Uniform(uniform_id_t id, const CColor& v) = 0;
    124     virtual void Uniform(uniform_id_t id, const CMatrix3D& v) = 0;
     139    // Uniform-setting methods that subclasses must define:
     140    virtual void Uniform(Binding id, float v0, float v1, float v2, float v3) = 0;
     141    virtual void Uniform(Binding id, const CMatrix3D& v) = 0;
    125142
    126     virtual void Uniform(Binding id, int v) = 0;
    127     virtual void Uniform(Binding id, float v) = 0;
    128     virtual void Uniform(Binding id, float v0, float v1, float v2, float v3) = 0;
    129     virtual void Uniform(Binding id, const CVector3D& v) = 0;
    130     virtual void Uniform(Binding id, const CColor& v) = 0;
    131     virtual void Uniform(Binding id, const CMatrix3D& v) = 0;
     143    // Convenient uniform-setting wrappers:
     144
     145    void Uniform(Binding id, int v);
     146    void Uniform(Binding id, float v);
     147    void Uniform(Binding id, const CVector3D& v);
     148    void Uniform(Binding id, const CColor& v);
     149
     150    void Uniform(uniform_id_t id, int v);
     151    void Uniform(uniform_id_t id, float v);
     152    void Uniform(uniform_id_t id, const CVector3D& v);
     153    void Uniform(uniform_id_t id, const CColor& v);
     154    void Uniform(uniform_id_t id, float v0, float v1, float v2, float v3);
     155    void Uniform(uniform_id_t id, const CMatrix3D& v);
    132156
    133157protected:
  • ps/trunk/source/renderer/OverlayRenderer.cpp

    r9929 r10106  
    169169    PROFILE("render overlays (after water)");
    170170
    171     // Only supported in shader modes
    172     // (TODO: should support in non-shader too)
    173     if (g_Renderer.GetRenderPath() != CRenderer::RP_SHADER)
    174         return;
    175 
    176171    if (!m->texlines.empty())
    177172    {
     
    180175        glDepthMask(0);
    181176
    182         glEnableClientState(GL_VERTEX_ARRAY);
    183         glEnableClientState(GL_TEXTURE_COORD_ARRAY);
     177        const char* shaderName;
     178        if (g_Renderer.GetRenderPath() == CRenderer::RP_SHADER)
     179            shaderName = "overlayline";
     180        else
     181            shaderName = "fixed:overlayline";
    184182
    185183        CShaderManager& shaderManager = g_Renderer.GetShaderManager();
    186         CShaderProgramPtr shaderTexLine(shaderManager.LoadProgram("overlayline", std::map<CStr, CStr>()));
     184        CShaderProgramPtr shaderTexLine(shaderManager.LoadProgram(shaderName, std::map<CStr, CStr>()));
    187185
    188186        shaderTexLine->Bind();
     187
     188        int streamflags = shaderTexLine->GetStreamFlags();
     189
     190        if (streamflags & STREAM_POS)
     191            glEnableClientState(GL_VERTEX_ARRAY);
     192
     193        if (streamflags & STREAM_UV0)
     194        {
     195            pglClientActiveTextureARB(GL_TEXTURE0);
     196            glEnableClientState(GL_TEXTURE_COORD_ARRAY);
     197        }
     198
     199        if (streamflags & STREAM_UV1)
     200        {
     201            pglClientActiveTextureARB(GL_TEXTURE1);
     202            glEnableClientState(GL_TEXTURE_COORD_ARRAY);
     203        }
    189204
    190205        CLOSTexture& los = g_Renderer.GetScene().GetLOSTexture();
     
    207222            CTexturedLineRData::SVertex* base = reinterpret_cast<CTexturedLineRData::SVertex*>(rdata->m_VB->m_Owner->Bind());
    208223
    209             glVertexPointer(3, GL_FLOAT, stride, &base->m_Position[0]);
    210             glTexCoordPointer(2, GL_SHORT, stride, &base->m_UVs[0]);
     224            if (streamflags & STREAM_POS)
     225                glVertexPointer(3, GL_FLOAT, stride, &base->m_Position[0]);
     226
     227            if (streamflags & STREAM_UV0)
     228            {
     229                pglClientActiveTextureARB(GL_TEXTURE0);
     230                glTexCoordPointer(2, GL_SHORT, stride, &base->m_UVs[0]);
     231            }
     232
     233            if (streamflags & STREAM_UV1)
     234            {
     235                pglClientActiveTextureARB(GL_TEXTURE1);
     236                glTexCoordPointer(2, GL_SHORT, stride, &base->m_UVs[0]);
     237            }
    211238
    212239            u8* indexBase = rdata->m_VBIndices->m_Owner->Bind();
     
    224251        CVertexBuffer::Unbind();
    225252        glDisableClientState(GL_VERTEX_ARRAY);
     253        pglClientActiveTextureARB(GL_TEXTURE1);
     254        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
     255        pglClientActiveTextureARB(GL_TEXTURE0);
    226256        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    227257
  • ps/trunk/source/renderer/Renderer.h

    r9929 r10106  
    5151// transparency modes
    5252enum ETransparentMode { TRANSPARENT, TRANSPARENT_OPAQUE, TRANSPARENT_BLEND };
    53 
    54 // stream flags
    55 #define STREAM_POS (1 << 0)
    56 #define STREAM_NORMAL (1 << 1)
    57 #define STREAM_COLOR (1 << 2)
    58 #define STREAM_UV0 (1 << 3)
    59 #define STREAM_UV1 (1 << 4)
    60 #define STREAM_UV2 (1 << 5)
    61 #define STREAM_UV3 (1 << 6)
    62 #define STREAM_POSTOUV0 (1 << 7)
    63 #define STREAM_POSTOUV1 (1 << 8)
    64 #define STREAM_POSTOUV2 (1 << 9)
    65 #define STREAM_POSTOUV3 (1 << 10)
    6653
    6754// access to sole renderer object
Note: See TracChangeset for help on using the changeset viewer.