Changeset 492

Show
Ignore:
Timestamp:
10/21/07 03:27:30 (12 months ago)
Author:
krobillard
Message:

Draw list primitive ops now accept an int! count argument.

Location:
trunk/thune/gl
Files:
2 modified

Legend:

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

    r486 r492  
    856856 
    857857 
     858typedef struct 
     859{ 
     860    const char* key; 
     861    const char* ki; 
     862    int ti; 
     863    int ai; 
     864} 
     865PrimAttrIt; 
     866 
     867 
     868static void _primAttr( /*UThread* ut,*/ PrimAttrIt* pa, int i ) 
     869{ 
     870    switch( *pa->ki ) 
     871    { 
     872        case 'a': 
     873        { 
     874            GrVertexAttribute* attr = _state.attr + pa->ai; 
     875            ++pa->ai; 
     876            switch( attr->count ) 
     877            { 
     878            case 1: 
     879                glVertexAttrib1fv( attr->loc, attr->vals + i ); 
     880                break; 
     881            case 2: 
     882                glVertexAttrib2fv( attr->loc, attr->vals + i * 2 ); 
     883                break; 
     884            case 3: 
     885                glVertexAttrib3fv( attr->loc, attr->vals + i * 3 ); 
     886                break; 
     887            case 4: 
     888                glVertexAttrib4fv( attr->loc, attr->vals + i * 4 ); 
     889                break; 
     890            } 
     891        } 
     892            break; 
     893 
     894        case 'c': 
     895        { 
     896            UCell* col = _state.colorVals + i; 
     897            if( ur_is(col, UT_COORD) ) 
     898            { 
     899                glColor3ub( col->coord.elem[0], 
     900                            col->coord.elem[1], 
     901                            col->coord.elem[2] ); 
     902            } 
     903            else if( ur_is(col, UT_VEC3) ) 
     904            { 
     905                glColor3fv( col->vec3.xyz ); 
     906            } 
     907        } 
     908            break; 
     909 
     910        case 'n': 
     911            //_getVectord( 3, _state.normVals + *it * 3, vec ); 
     912            //glNormal3dv( vec ); 
     913            glNormal3fv( _state.normVals + i * 3 ); 
     914            break; 
     915 
     916        case 'v': 
     917            //_getVectord( 3, _state.vertVals + *it * 3, vec ); 
     918            //glVertex3dv( vec ); 
     919            glVertex3fv( _state.vertVals + i * 3 ); 
     920            break; 
     921 
     922        case 't': 
     923        { 
     924            float* uv = _state.uvVals + i * 2; 
     925            //glMultiTexCoord2fv( GL_TEXTURE0, uv ); 
     926            glMultiTexCoord2f( GL_TEXTURE0 + pa->ti, uv[0], 1.0f - uv[1] ); 
     927            ++pa->ti; 
     928        } 
     929            break; 
     930    } 
     931 
     932    ++pa->ki; 
     933    if( *pa->ki == '\0' ) 
     934    { 
     935        pa->ki = pa->key; 
     936        pa->ti = 0; 
     937        pa->ai = 0; 
     938    } 
     939} 
     940 
     941 
    858942/* 
    859    icell is an int array! 
     943   icell is an array! of int. 
    860944*/ 
    861945static void _drawPrims( UThread* ut, UCell* icell, const char* key ) 
    862946{ 
    863     //GLdouble vec[3]; 
    864     const char* ki; 
    865     int ti, ai; 
    866     UCell* col; 
     947    PrimAttrIt pa; 
    867948    int32_t* it; 
    868949    int32_t* end; 
     
    872953    end = arr->ptr.i + arr->used; 
    873954 
    874     ki = key; 
    875     ti = 0; 
    876     ai = 0; 
     955    pa.key = key; 
     956    pa.ki  = key; 
     957    pa.ti  = 0; 
     958    pa.ai  = 0; 
    877959 
    878960    while( it != end ) 
    879     { 
    880         switch( *ki ) 
    881         { 
    882             case 'a': 
    883             { 
    884                 GrVertexAttribute* attr = _state.attr + ai; 
    885                 ++ai; 
    886                 switch( attr->count ) 
    887                 { 
    888                 case 1: 
    889                     glVertexAttrib1fv( attr->loc, attr->vals + *it ); 
    890                     break; 
    891                 case 2: 
    892                     glVertexAttrib2fv( attr->loc, attr->vals + *it * 2 ); 
    893                     break; 
    894                 case 3: 
    895                     glVertexAttrib3fv( attr->loc, attr->vals + *it * 3 ); 
    896                     break; 
    897                 case 4: 
    898                     glVertexAttrib4fv( attr->loc, attr->vals + *it * 4 ); 
    899                     break; 
    900                 } 
    901             } 
    902                 break; 
    903  
    904             case 'c': 
    905                 col = _state.colorVals + *it; 
    906                 if( ur_is(col, UT_COORD) ) 
    907                 { 
    908                     glColor3ub( col->coord.elem[0], 
    909                                 col->coord.elem[1], 
    910                                 col->coord.elem[2] ); 
    911                 } 
    912                 else if( ur_is(col, UT_VEC3) ) 
    913                 { 
    914                     glColor3fv( col->vec3.xyz ); 
    915                 } 
    916                 break; 
    917  
    918             case 'n': 
    919                 //_getVectord( 3, _state.normVals + *it * 3, vec ); 
    920                 //glNormal3dv( vec ); 
    921                 glNormal3fv( _state.normVals + *it * 3 ); 
    922                 break; 
    923  
    924             case 'v': 
    925                 //_getVectord( 3, _state.vertVals + *it * 3, vec ); 
    926                 //glVertex3dv( vec ); 
    927                 glVertex3fv( _state.vertVals + *it * 3 ); 
    928                 break; 
    929  
    930             case 't': 
    931             { 
    932                 float* uv = _state.uvVals + *it * 2; 
    933                 //glMultiTexCoord2fv( GL_TEXTURE0, uv ); 
    934                 glMultiTexCoord2f( GL_TEXTURE0 + ti, uv[0], 1.0f - uv[1] ); 
    935                 ++ti; 
    936             } 
    937                 break; 
    938         } 
    939  
    940         ++ki; 
    941         if( *ki == '\0' ) 
    942         { 
    943             ki = key; 
    944             ti = 0; 
    945             ai = 0; 
    946         } 
    947  
    948         ++it; 
     961        _primAttr( &pa, *it++ ); 
     962} 
     963 
     964 
     965static void _drawPrimsN( const char* key, int keyLen, 
     966                         int primType, int primCount ) 
     967{ 
     968    PrimAttrIt pa; 
     969    int i; 
     970    int ac; 
     971 
     972    pa.key = key; 
     973    pa.ki  = key; 
     974    pa.ti  = 0; 
     975    pa.ai  = 0; 
     976 
     977    // Convert primCount to vertex count. 
     978    switch( primType ) 
     979    { 
     980        case GL_POINTS:          break; 
     981        case GL_LINES:           primCount *= 2; break; 
     982        case GL_LINE_STRIP:      primCount += 1; break; 
     983        case GL_TRIANGLES:       primCount *= 3; break; 
     984        case GL_TRIANGLE_STRIP:  primCount += 2; break; 
     985        case GL_TRIANGLE_FAN:    primCount += 2; break; 
     986        case GL_QUADS:           primCount *= 4; break; 
     987        case GL_QUAD_STRIP:      primCount  = primCount * 2 + 2; break; 
     988        default: return; 
     989    } 
     990 
     991    for( i = 0; i < primCount; ++i ) 
     992    { 
     993        for( ac = 0; ac < keyLen; ++ac ) 
     994            _primAttr( &pa, i ); 
    949995    } 
    950996} 
     
    13781424            case DOP_QUAD_STRIP: 
    13791425                pc += 2; 
    1380                 if( ur_is(pc-1, UT_WORD) && 
    1381                     ur_is(pc, UT_VECTOR) && (ur_vectorDT(pc) == UT_INT) && 
    1382                     _state.vertVals ) 
    1383                 { 
    1384                     glBegin( _primBegin[ ur_opcode(pc-2) - DOP_POINTS ] ); 
    1385                     _drawPrims( ut, pc, ur_atomCStr( ur_atom(pc-1), 0 ) ); 
    1386                     glEnd(); 
     1426                if( ur_is(pc-1, UT_WORD) && _state.vertVals ) 
     1427                { 
     1428                    if( ur_is(pc, UT_VECTOR) && (ur_vectorDT(pc) == UT_INT) ) 
     1429                    { 
     1430                        glBegin( _primBegin[ ur_opcode(pc-2) - DOP_POINTS ] ); 
     1431                        _drawPrims( ut, pc, ur_atomCStr( ur_atom(pc-1), 0 ) ); 
     1432                        glEnd(); 
     1433                    } 
     1434                    else if( ur_is(pc, UT_INT) ) 
     1435                    { 
     1436                        int ptype; 
     1437                        int keyLen; 
     1438                        const char* astr; 
     1439 
     1440                        ptype = _primBegin[ ur_opcode(pc-2) - DOP_POINTS ]; 
     1441                        glBegin( ptype ); 
     1442                        astr = ur_atomCStr( ur_atom(pc-1), &keyLen ); 
     1443                        _drawPrimsN( astr, keyLen, ptype, ur_int(pc) ); 
     1444                        glEnd(); 
     1445                    } 
    13871446                } 
    13881447                break; 
  • trunk/thune/gl/scripts/view.t

    r491 r492  
    6666            samples-begin 
    6767            shader sun-sh 
    68             points v #[0] 
     68            points v 1 
    6969        ][ 
    7070            ;dup . 
     
    8080        disable/d 
    8181        shader flare 
    82         points tcv #[0 0 0] 
     82        points tcv 1 
    8383        particle/off 
    8484    ]