| | 858 | typedef struct |
| | 859 | { |
| | 860 | const char* key; |
| | 861 | const char* ki; |
| | 862 | int ti; |
| | 863 | int ai; |
| | 864 | } |
| | 865 | PrimAttrIt; |
| | 866 | |
| | 867 | |
| | 868 | static 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 | |
| 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 | |
| | 965 | static 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 ); |
| 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 | } |