Changeset 303 for trunk/thune/gl

Show
Ignore:
Timestamp:
10/30/06 02:55:53 (2 years ago)
Author:
krobillard
Message:

Thune GL - Shader parameters can now be used.

Location:
trunk/thune/gl
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • trunk/thune/gl/gx.c

    r301 r303  
    18481848    FIXED_ATOM( "specular", 8, UR_ATOM_SPECULAR ); 
    18491849    FIXED_ATOM( "pos",      3, UR_ATOM_POS ); 
     1850    FIXED_ATOM( "shader",   6, UR_ATOM_SHADER ); 
    18501851    FIXED_ATOM( "vertex",   6, UR_ATOM_VERTEX ); 
    18511852    FIXED_ATOM( "fragment", 8, UR_ATOM_FRAGMENT ); 
  • trunk/thune/gl/gx_atoms.h

    r302 r303  
    1818#define UR_ATOM_SPECULAR                316 
    1919#define UR_ATOM_POS             317 
    20 #define UR_ATOM_VERTEX          318 
    21 #define UR_ATOM_FRAGMENT                319 
     20#define UR_ATOM_SHADER          318 
     21#define UR_ATOM_VERTEX          319 
     22#define UR_ATOM_FRAGMENT                320 
  • trunk/thune/gl/shader.c

    r301 r303  
    3131#include "os.h" 
    3232#include "gx.h" 
     33#include "gx_atoms.h" 
    3334#include "shader.h" 
    3435 
     
    145146                                   &count ); 
    146147 
     148        // Collect non-gl parameters. 
     149 
    147150        pi = param; 
    148151        for( i = 0; i < count; ++i ) 
     
    161164        count = pi - param; 
    162165 
    163         bufN = ur_makeBuffer( UT_SHADER, sizeof(Shader) + (count - 1), &buf ); 
     166        if( count ) 
     167        { 
     168            ShaderParam* pend; 
     169            UCell* cval; 
     170 
     171            // We have parameters - make context to hold shader & params. 
     172 
     173            ur_makeContext( cell, count + 1 ); 
     174            ur_internWord( cell, UR_ATOM_SHADER ); 
     175 
     176            cval = ur_blockPtr( cell->ctx.valBlk )->ptr.cells; 
     177 
     178            pi = param; 
     179            pend = param + count; 
     180            while( pi != pend ) 
     181            { 
     182                ur_internWord( cell, pi->name ); 
     183 
     184                ++cval; 
     185                switch( pi->type ) 
     186                { 
     187                    case GL_FLOAT: 
     188                        ur_initType( cval, UT_DECIMAL ); 
     189                        ur_decimal( cval ) = 0.0; 
     190                        break; 
     191 
     192                    case GL_FLOAT_VEC2_ARB: 
     193                    case GL_FLOAT_VEC3_ARB: 
     194                    //case GL_FLOAT_VEC4_ARB: 
     195                        ur_initType( cval, UT_VEC3 ); 
     196                        cval->vec3.xyz[0] = 0.0f; 
     197                        cval->vec3.xyz[1] = 0.0f; 
     198                        cval->vec3.xyz[2] = 0.0f; 
     199                        break; 
     200 
     201                    case GL_INT: 
     202                        ur_initType( cval, UT_INT ); 
     203                        ur_int( cval ) = 0; 
     204                        break; 
     205 
     206                    case GL_INT_VEC2_ARB: 
     207                    case GL_INT_VEC3_ARB: 
     208                    //case GL_INT_VEC4_ARB: 
     209                        ur_initType( cval, UT_COORD ); 
     210                        break; 
     211 
     212                    case GL_BOOL_ARB: 
     213                        ur_initType( cval, UT_LOGIC ); 
     214                        ur_int( cval ) = 0; 
     215                        break; 
     216 
     217                    default: 
     218                        ur_initType( cval, UT_NONE ); 
     219                        break; 
     220                } 
     221 
     222                ++pi; 
     223            } 
     224        } 
     225 
     226        bufN = ur_makeBuffer( UT_SHADER, 
     227                          sizeof(Shader) + sizeof(ShaderParam) * (count - 1), 
     228                          &buf ); 
    164229        sh = (Shader*) buf->ptr; 
    165230 
     
    170235 
    171236        if( count ) 
     237        { 
    172238            memCpy( sh->param, param, sizeof(ShaderParam) * count ); 
     239 
     240            // First context value will be set to shader!. 
     241            cell = ur_blockPtr( cell->ctx.valBlk )->ptr.cells; 
     242        } 
    173243 
    174244        ur_initType( cell, UT_SHADER ); 
    175245        ur_setSeries( cell, bufN, 0 ); 
     246 
    176247        return 1; 
    177248    } 
     
    182253void loadShader( UCell* cell ) 
    183254{ 
    184     if( ur_is(cell, UT_SHADER) ) 
     255    if( ur_is(cell, UT_CONTEXT) ) 
     256    { 
     257        UCell* cval; 
     258        ShaderParam* pi; 
     259        ShaderParam* pend; 
     260 
     261        cval = ur_blockPtr( cell->ctx.valBlk )->ptr.cells; 
     262        if( cval && ur_is(cval, UT_SHADER) ) 
     263        { 
     264            Shader* sh = (Shader*) ur_bufPtr( cval->series.n )->ptr; 
     265            glUseProgramObjectARB( sh->program ); 
     266 
     267            pi   = sh->param; 
     268            pend = sh->param + sh->paramCount; 
     269            while( pi != pend ) 
     270            { 
     271                // There is no cell type checking or conversion here for speed. 
     272                // If the user loads bad types then we'll just get garbage. 
     273 
     274                ++cval; 
     275                switch( pi->type ) 
     276                { 
     277                    case GL_FLOAT: 
     278                        glUniform1fARB( pi->location, ur_decimal(cval) ); 
     279                        break; 
     280 
     281                    case GL_FLOAT_VEC2_ARB: 
     282                        glUniform2fvARB( pi->location, 1, cval->vec3.xyz ); 
     283                        break; 
     284 
     285                    case GL_FLOAT_VEC3_ARB: 
     286                        glUniform3fvARB( pi->location, 1, cval->vec3.xyz ); 
     287                        break; 
     288 
     289                    //case GL_FLOAT_VEC4_ARB: 
     290 
     291                    case GL_INT: 
     292                    case GL_BOOL_ARB: 
     293                        glUniform1iARB( pi->location, ur_int(cval) ); 
     294                        break; 
     295 
     296                    case GL_INT_VEC2_ARB: 
     297                        glUniform2iARB( pi->location, 
     298                                        cval->coord.elem[0], 
     299                                        cval->coord.elem[1] ); 
     300                        break; 
     301 
     302                    case GL_INT_VEC3_ARB: 
     303                        glUniform3iARB( pi->location, 
     304                                        cval->coord.elem[0], 
     305                                        cval->coord.elem[1], 
     306                                        cval->coord.elem[2] ); 
     307                        break; 
     308 
     309                    //case GL_INT_VEC4_ARB: 
     310                } 
     311                ++pi; 
     312            } 
     313            /* 
     314            glUniform1fARB( loc_specularCoeff, specular_coefficient ); 
     315            */ 
     316 
     317            return; 
     318        } 
     319    } 
     320    else if( ur_is(cell, UT_SHADER) ) 
    185321    { 
    186322        Shader* sh = (Shader*) ur_bufPtr( cell->series.n )->ptr; 
    187323        glUseProgramObjectARB( sh->program ); 
    188     } 
    189     else 
    190     { 
    191         glUseProgramObjectARB( 0 ); 
    192     } 
    193     /* 
    194     glUniform3fvARB( loc_lightDirOS, 1, &lightDir.x ); 
    195     glUniform1fARB( loc_specularCoeff, specular_coefficient ); 
    196     */ 
     324        return; 
     325    } 
     326 
     327    glUseProgramObjectARB( 0 ); 
    197328} 
    198329 
  • trunk/thune/gl/test.t

    r301 r303  
    4343 
    4444 
    45 "data/d7.gx" load draw-list.compile :d7-list 
    46 "data/test-shader.gx" load do 
    47  
     45[load shader! swap make] proc :load.shader   ; (file -- shader) 
     46 
     47"data/model/d7.gx" load draw-list.compile :d7-list 
     48 
     49"data/shader/brick.gx" 
     50;"data/shader/testA.gx" 
     51    load.shader :test-shader 
     52 
     53test-shader context! is-type? ift ( 
     54    1.0, 0.3, 0.2 :test-shader/brickcolor 
     55    0.9, 0.85     :test-shader/brickpct 
     56    1.0, 0.5      :test-shader/bricksize 
     57    0.8, 0.8, 0.8 :test-shader/mortarcolor 
     58) 
     59;test-shader . 
    4860 
    49610,0,0 :strobe 
     
    292304 
    293305 
    294 font! ["data/20thfont.ttf" 22] make :fontA 
    295 font! ["data/FederationBold_KR.ttf" 12 256,128] make :fontF 
     306font! ["data/font/20thfont.ttf" 22] make :fontA 
     307font! ["data/font/FederationBold_KR.ttf" 12 256,128] make :fontF 
    296308 
    2973090,0,155 display.swap