/* ============== Tess_InstantQuad ============== */ void Tess_InstantQuad( vec4_t quadVerts[ 4 ] ) { GLimp_LogComment( "--- Tess_InstantQuad ---\n" ); tess.multiDrawPrimitives = 0; tess.numVertexes = 0; tess.numIndexes = 0; tess.attribsSet = 0; Tess_MapVBOs( false ); VectorCopy( quadVerts[ 0 ], tess.verts[ tess.numVertexes ].xyz ); Vector4Set( tess.verts[ tess.numVertexes ].color, 255, 255, 255, 255 ); tess.verts[ tess.numVertexes ].texCoords[ 0 ] = floatToHalf( 0.0f ); tess.verts[ tess.numVertexes ].texCoords[ 1 ] = floatToHalf( 0.0f ); tess.numVertexes++; VectorCopy( quadVerts[ 1 ], tess.verts[ tess.numVertexes ].xyz ); Vector4Set( tess.verts[ tess.numVertexes ].color, 255, 255, 255, 255 ); tess.verts[ tess.numVertexes ].texCoords[ 0 ] = floatToHalf( 1.0f ); tess.verts[ tess.numVertexes ].texCoords[ 1 ] = floatToHalf( 0.0f ); tess.numVertexes++; VectorCopy( quadVerts[ 2 ], tess.verts[ tess.numVertexes ].xyz ); Vector4Set( tess.verts[ tess.numVertexes ].color, 255, 255, 255, 255 ); tess.verts[ tess.numVertexes ].texCoords[ 0 ] = floatToHalf( 1.0f ); tess.verts[ tess.numVertexes ].texCoords[ 1 ] = floatToHalf( 1.0f ); tess.numVertexes++; VectorCopy( quadVerts[ 3 ], tess.verts[ tess.numVertexes ].xyz ); Vector4Set( tess.verts[ tess.numVertexes ].color, 255, 255, 255, 255 ); tess.verts[ tess.numVertexes ].texCoords[ 0 ] = floatToHalf( 0.0f ); tess.verts[ tess.numVertexes ].texCoords[ 1 ] = floatToHalf( 1.0f ); tess.numVertexes++; tess.indexes[ tess.numIndexes++ ] = 0; tess.indexes[ tess.numIndexes++ ] = 1; tess.indexes[ tess.numIndexes++ ] = 2; tess.indexes[ tess.numIndexes++ ] = 0; tess.indexes[ tess.numIndexes++ ] = 2; tess.indexes[ tess.numIndexes++ ] = 3; Tess_UpdateVBOs( ); GL_VertexAttribsState( ATTR_POSITION | ATTR_TEXCOORD | ATTR_COLOR ); Tess_DrawElements(); tess.multiDrawPrimitives = 0; tess.numVertexes = 0; tess.numIndexes = 0; tess.attribsSet = 0; GL_CheckErrors(); }
static void DrawSkyBox( shader_t *shader ) { int i; sky_min = 0; sky_max = 1; Com_Memset( s_skyTexCoords, 0, sizeof( s_skyTexCoords ) ); // set up for drawing tess.multiDrawPrimitives = 0; tess.numIndexes = 0; tess.numVertexes = 0; GL_State( GLS_DEFAULT ); for ( i = 0; i < 6; i++ ) { int sky_mins_subd[ 2 ], sky_maxs_subd[ 2 ]; int s, t; sky_mins[ 0 ][ i ] = floor( sky_mins[ 0 ][ i ] * HALF_SKY_SUBDIVISIONS ) / HALF_SKY_SUBDIVISIONS; sky_mins[ 1 ][ i ] = floor( sky_mins[ 1 ][ i ] * HALF_SKY_SUBDIVISIONS ) / HALF_SKY_SUBDIVISIONS; sky_maxs[ 0 ][ i ] = ceil( sky_maxs[ 0 ][ i ] * HALF_SKY_SUBDIVISIONS ) / HALF_SKY_SUBDIVISIONS; sky_maxs[ 1 ][ i ] = ceil( sky_maxs[ 1 ][ i ] * HALF_SKY_SUBDIVISIONS ) / HALF_SKY_SUBDIVISIONS; if ( ( sky_mins[ 0 ][ i ] >= sky_maxs[ 0 ][ i ] ) || ( sky_mins[ 1 ][ i ] >= sky_maxs[ 1 ][ i ] ) ) { continue; } sky_mins_subd[ 0 ] = sky_mins[ 0 ][ i ] * HALF_SKY_SUBDIVISIONS; sky_mins_subd[ 1 ] = sky_mins[ 1 ][ i ] * HALF_SKY_SUBDIVISIONS; sky_maxs_subd[ 0 ] = sky_maxs[ 0 ][ i ] * HALF_SKY_SUBDIVISIONS; sky_maxs_subd[ 1 ] = sky_maxs[ 1 ][ i ] * HALF_SKY_SUBDIVISIONS; if ( sky_mins_subd[ 0 ] < -HALF_SKY_SUBDIVISIONS ) { sky_mins_subd[ 0 ] = -HALF_SKY_SUBDIVISIONS; } else if ( sky_mins_subd[ 0 ] > HALF_SKY_SUBDIVISIONS ) { sky_mins_subd[ 0 ] = HALF_SKY_SUBDIVISIONS; } if ( sky_mins_subd[ 1 ] < -HALF_SKY_SUBDIVISIONS ) { sky_mins_subd[ 1 ] = -HALF_SKY_SUBDIVISIONS; } else if ( sky_mins_subd[ 1 ] > HALF_SKY_SUBDIVISIONS ) { sky_mins_subd[ 1 ] = HALF_SKY_SUBDIVISIONS; } if ( sky_maxs_subd[ 0 ] < -HALF_SKY_SUBDIVISIONS ) { sky_maxs_subd[ 0 ] = -HALF_SKY_SUBDIVISIONS; } else if ( sky_maxs_subd[ 0 ] > HALF_SKY_SUBDIVISIONS ) { sky_maxs_subd[ 0 ] = HALF_SKY_SUBDIVISIONS; } if ( sky_maxs_subd[ 1 ] < -HALF_SKY_SUBDIVISIONS ) { sky_maxs_subd[ 1 ] = -HALF_SKY_SUBDIVISIONS; } else if ( sky_maxs_subd[ 1 ] > HALF_SKY_SUBDIVISIONS ) { sky_maxs_subd[ 1 ] = HALF_SKY_SUBDIVISIONS; } // iterate through the subdivisions for ( t = sky_mins_subd[ 1 ] + HALF_SKY_SUBDIVISIONS; t <= sky_maxs_subd[ 1 ] + HALF_SKY_SUBDIVISIONS; t++ ) { for ( s = sky_mins_subd[ 0 ] + HALF_SKY_SUBDIVISIONS; s <= sky_maxs_subd[ 0 ] + HALF_SKY_SUBDIVISIONS; s++ ) { MakeSkyVec( ( s - HALF_SKY_SUBDIVISIONS ) / ( float ) HALF_SKY_SUBDIVISIONS, ( t - HALF_SKY_SUBDIVISIONS ) / ( float ) HALF_SKY_SUBDIVISIONS, i, s_skyTexCoords[ t ][ s ], s_skyPoints[ t ][ s ] ); } } //DrawSkySide(shader->sky.outerbox[sky_texorder[i]], sky_mins_subd, sky_maxs_subd); // only add indexes for first stage FillCloudySkySide( sky_mins_subd, sky_maxs_subd, qtrue ); } // Tr3B: FIXME analyze required vertex attribs by the current material Tess_UpdateVBOs( 0 ); Tess_DrawElements(); }
/* ============= RE_StretchRaw FIXME: not exactly backend Stretches a raw 32 bit power of 2 bitmap image over the given screen rectangle. Used for cinematics. ============= */ void RE_StretchRaw( int x, int y, int w, int h, int cols, int rows, const byte *data, int client, qboolean dirty ) { int i, j; int start, end; if ( !tr.registered ) { return; } R_SyncRenderThread(); // we definitely want to sync every frame for the cinematics #if defined( USE_D3D10 ) // TODO #else qglFinish(); #endif start = end = 0; if ( r_speeds->integer ) { #if defined( USE_D3D10 ) // TODO #else qglFinish(); #endif start = ri.Milliseconds(); } // make sure rows and cols are powers of 2 for ( i = 0; ( 1 << i ) < cols; i++ ) { } for ( j = 0; ( 1 << j ) < rows; j++ ) { } if ( ( 1 << i ) != cols || ( 1 << j ) != rows ) { ri.Error( ERR_DROP, "Draw_StretchRaw: size not a power of 2: %i by %i", cols, rows ); } #if defined( USE_D3D10 ) // TODO #else RB_SetGL2D(); qglVertexAttrib4fARB( ATTR_INDEX_NORMAL, 0, 0, 1, 1 ); qglVertexAttrib4fARB( ATTR_INDEX_COLOR, tr.identityLight, tr.identityLight, tr.identityLight, 1 ); GL_BindProgram( &tr.genericSingleShader ); // set uniforms GLSL_SetUniform_TCGen_Environment( &tr.genericSingleShader, qfalse ); GLSL_SetUniform_ColorGen( &tr.genericSingleShader, CGEN_VERTEX ); GLSL_SetUniform_AlphaGen( &tr.genericSingleShader, AGEN_VERTEX ); //GLSL_SetUniform_Color(&tr.genericSingleShader, colorWhite); if ( glConfig.vboVertexSkinningAvailable ) { GLSL_SetUniform_VertexSkinning( &tr.genericSingleShader, qfalse ); } GLSL_SetUniform_DeformGen( &tr.genericSingleShader, DGEN_NONE ); GLSL_SetUniform_AlphaTest( &tr.genericSingleShader, 0 ); GLSL_SetUniform_ModelViewProjectionMatrix( &tr.genericSingleShader, glState.modelViewProjectionMatrix[ glState.stackIndex ] ); // bind u_ColorMap GL_SelectTexture( 0 ); GL_Bind( tr.scratchImage[ client ] ); GLSL_SetUniform_ColorTextureMatrix( &tr.genericSingleShader, matrixIdentity ); // if the scratchImage isn't in the format we want, specify it as a new texture if ( cols != tr.scratchImage[ client ]->width || rows != tr.scratchImage[ client ]->height ) { tr.scratchImage[ client ]->width = tr.scratchImage[ client ]->uploadWidth = cols; tr.scratchImage[ client ]->height = tr.scratchImage[ client ]->uploadHeight = rows; qglTexImage2D( GL_TEXTURE_2D, 0, GL_RGB8, cols, rows, 0, GL_RGBA, GL_UNSIGNED_BYTE, data ); qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP ); qglTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP ); } else { if ( dirty ) { // otherwise, just subimage upload it so that drivers can tell we are going to be changing // it and don't try and do a texture compression qglTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, cols, rows, GL_RGBA, GL_UNSIGNED_BYTE, data ); } } #endif // #if defined(USE_D3D10) if ( r_speeds->integer ) { #if defined( USE_D3D10 ) // TODO #else qglFinish(); #endif end = ri.Milliseconds(); ri.Printf( PRINT_ALL, "qglTexSubImage2D %i, %i: %i msec\n", cols, rows, end - start ); } tess.numVertexes = 0; tess.numIndexes = 0; tess.xyz[ tess.numVertexes ][ 0 ] = x; tess.xyz[ tess.numVertexes ][ 1 ] = y; tess.xyz[ tess.numVertexes ][ 2 ] = 0; tess.xyz[ tess.numVertexes ][ 3 ] = 1; tess.texCoords[ tess.numVertexes ][ 0 ] = 0.5f / cols; tess.texCoords[ tess.numVertexes ][ 1 ] = 0.5f / rows; tess.texCoords[ tess.numVertexes ][ 2 ] = 0; tess.texCoords[ tess.numVertexes ][ 3 ] = 1; tess.numVertexes++; tess.xyz[ tess.numVertexes ][ 0 ] = x + w; tess.xyz[ tess.numVertexes ][ 1 ] = y; tess.xyz[ tess.numVertexes ][ 2 ] = 0; tess.xyz[ tess.numVertexes ][ 3 ] = 1; tess.texCoords[ tess.numVertexes ][ 0 ] = ( cols - 0.5f ) / cols; tess.texCoords[ tess.numVertexes ][ 1 ] = 0.5f / rows; tess.texCoords[ tess.numVertexes ][ 2 ] = 0; tess.texCoords[ tess.numVertexes ][ 3 ] = 1; tess.numVertexes++; tess.xyz[ tess.numVertexes ][ 0 ] = x + w; tess.xyz[ tess.numVertexes ][ 1 ] = y + h; tess.xyz[ tess.numVertexes ][ 2 ] = 0; tess.xyz[ tess.numVertexes ][ 3 ] = 1; tess.texCoords[ tess.numVertexes ][ 0 ] = ( cols - 0.5f ) / cols; tess.texCoords[ tess.numVertexes ][ 1 ] = ( rows - 0.5f ) / rows; tess.texCoords[ tess.numVertexes ][ 2 ] = 0; tess.texCoords[ tess.numVertexes ][ 3 ] = 1; tess.numVertexes++; tess.xyz[ tess.numVertexes ][ 0 ] = x; tess.xyz[ tess.numVertexes ][ 1 ] = y + h; tess.xyz[ tess.numVertexes ][ 2 ] = 0; tess.xyz[ tess.numVertexes ][ 3 ] = 1; tess.texCoords[ tess.numVertexes ][ 0 ] = 0.5f / cols; tess.texCoords[ tess.numVertexes ][ 1 ] = ( rows - 0.5f ) / rows; tess.texCoords[ tess.numVertexes ][ 2 ] = 0; tess.texCoords[ tess.numVertexes ][ 3 ] = 1; tess.numVertexes++; tess.indexes[ tess.numIndexes++ ] = 0; tess.indexes[ tess.numIndexes++ ] = 1; tess.indexes[ tess.numIndexes++ ] = 2; tess.indexes[ tess.numIndexes++ ] = 0; tess.indexes[ tess.numIndexes++ ] = 2; tess.indexes[ tess.numIndexes++ ] = 3; Tess_UpdateVBOs( ATTR_POSITION | ATTR_TEXCOORD ); Tess_DrawElements(); tess.numVertexes = 0; tess.numIndexes = 0; #if defined( USE_D3D10 ) // TODO #else GL_CheckErrors(); #endif }
static void DrawSkyBox() { int i; sky_min = 0; sky_max = 1; Com_Memset( s_skyTexCoords, 0, sizeof( s_skyTexCoords ) ); // set up for drawing tess.multiDrawPrimitives = 0; tess.numIndexes = 0; tess.numVertexes = 0; tess.attribsSet = 0; GL_State( GLS_DEFAULT ); Tess_MapVBOs( false ); for ( i = 0; i < 6; i++ ) { int sky_mins_subd[ 2 ], sky_maxs_subd[ 2 ]; int s, t; sky_mins[ 0 ][ i ] = floor( sky_mins[ 0 ][ i ] * HALF_SKY_SUBDIVISIONS ) / HALF_SKY_SUBDIVISIONS; sky_mins[ 1 ][ i ] = floor( sky_mins[ 1 ][ i ] * HALF_SKY_SUBDIVISIONS ) / HALF_SKY_SUBDIVISIONS; sky_maxs[ 0 ][ i ] = ceil( sky_maxs[ 0 ][ i ] * HALF_SKY_SUBDIVISIONS ) / HALF_SKY_SUBDIVISIONS; sky_maxs[ 1 ][ i ] = ceil( sky_maxs[ 1 ][ i ] * HALF_SKY_SUBDIVISIONS ) / HALF_SKY_SUBDIVISIONS; if ( ( sky_mins[ 0 ][ i ] >= sky_maxs[ 0 ][ i ] ) || ( sky_mins[ 1 ][ i ] >= sky_maxs[ 1 ][ i ] ) ) { continue; } sky_mins_subd[ 0 ] = sky_mins[ 0 ][ i ] * HALF_SKY_SUBDIVISIONS; sky_mins_subd[ 1 ] = sky_mins[ 1 ][ i ] * HALF_SKY_SUBDIVISIONS; sky_maxs_subd[ 0 ] = sky_maxs[ 0 ][ i ] * HALF_SKY_SUBDIVISIONS; sky_maxs_subd[ 1 ] = sky_maxs[ 1 ][ i ] * HALF_SKY_SUBDIVISIONS; if ( sky_mins_subd[ 0 ] < -HALF_SKY_SUBDIVISIONS ) { sky_mins_subd[ 0 ] = -HALF_SKY_SUBDIVISIONS; } else if ( sky_mins_subd[ 0 ] > HALF_SKY_SUBDIVISIONS ) { sky_mins_subd[ 0 ] = HALF_SKY_SUBDIVISIONS; } if ( sky_mins_subd[ 1 ] < -HALF_SKY_SUBDIVISIONS ) { sky_mins_subd[ 1 ] = -HALF_SKY_SUBDIVISIONS; } else if ( sky_mins_subd[ 1 ] > HALF_SKY_SUBDIVISIONS ) { sky_mins_subd[ 1 ] = HALF_SKY_SUBDIVISIONS; } if ( sky_maxs_subd[ 0 ] < -HALF_SKY_SUBDIVISIONS ) { sky_maxs_subd[ 0 ] = -HALF_SKY_SUBDIVISIONS; } else if ( sky_maxs_subd[ 0 ] > HALF_SKY_SUBDIVISIONS ) { sky_maxs_subd[ 0 ] = HALF_SKY_SUBDIVISIONS; } if ( sky_maxs_subd[ 1 ] < -HALF_SKY_SUBDIVISIONS ) { sky_maxs_subd[ 1 ] = -HALF_SKY_SUBDIVISIONS; } else if ( sky_maxs_subd[ 1 ] > HALF_SKY_SUBDIVISIONS ) { sky_maxs_subd[ 1 ] = HALF_SKY_SUBDIVISIONS; } // iterate through the subdivisions for ( t = sky_mins_subd[ 1 ] + HALF_SKY_SUBDIVISIONS; t <= sky_maxs_subd[ 1 ] + HALF_SKY_SUBDIVISIONS; t++ ) { for ( s = sky_mins_subd[ 0 ] + HALF_SKY_SUBDIVISIONS; s <= sky_maxs_subd[ 0 ] + HALF_SKY_SUBDIVISIONS; s++ ) { MakeSkyVec( ( s - HALF_SKY_SUBDIVISIONS ) / ( float ) HALF_SKY_SUBDIVISIONS, ( t - HALF_SKY_SUBDIVISIONS ) / ( float ) HALF_SKY_SUBDIVISIONS, i, s_skyTexCoords[ t ][ s ], s_skyPoints[ t ][ s ] ); } } // only add indexes for first stage FillCloudySkySide( sky_mins_subd, sky_maxs_subd, true ); } Tess_UpdateVBOs( ); GL_VertexAttribsState( tess.attribsSet ); Tess_DrawElements(); }
static void DrawSkyBox(shader_t * shader) { int i; sky_min = 0; sky_max = 1; Com_Memset(s_skyTexCoords, 0, sizeof(s_skyTexCoords)); // set up for drawing tess.multiDrawPrimitives = 0; tess.numIndexes = 0; tess.numVertexes = 0; #if defined(USE_D3D10) // TODO #else GL_State( GLS_DEFAULT ); #endif for(i = 0; i < 6; i++) { int sky_mins_subd[2], sky_maxs_subd[2]; int s, t; sky_mins[0][i] = floor(sky_mins[0][i] * HALF_SKY_SUBDIVISIONS) / HALF_SKY_SUBDIVISIONS; sky_mins[1][i] = floor(sky_mins[1][i] * HALF_SKY_SUBDIVISIONS) / HALF_SKY_SUBDIVISIONS; sky_maxs[0][i] = ceil(sky_maxs[0][i] * HALF_SKY_SUBDIVISIONS) / HALF_SKY_SUBDIVISIONS; sky_maxs[1][i] = ceil(sky_maxs[1][i] * HALF_SKY_SUBDIVISIONS) / HALF_SKY_SUBDIVISIONS; if((sky_mins[0][i] >= sky_maxs[0][i]) || (sky_mins[1][i] >= sky_maxs[1][i])) { continue; } sky_mins_subd[0] = sky_mins[0][i] * HALF_SKY_SUBDIVISIONS; sky_mins_subd[1] = sky_mins[1][i] * HALF_SKY_SUBDIVISIONS; sky_maxs_subd[0] = sky_maxs[0][i] * HALF_SKY_SUBDIVISIONS; sky_maxs_subd[1] = sky_maxs[1][i] * HALF_SKY_SUBDIVISIONS; if(sky_mins_subd[0] < -HALF_SKY_SUBDIVISIONS) sky_mins_subd[0] = -HALF_SKY_SUBDIVISIONS; else if(sky_mins_subd[0] > HALF_SKY_SUBDIVISIONS) sky_mins_subd[0] = HALF_SKY_SUBDIVISIONS; if(sky_mins_subd[1] < -HALF_SKY_SUBDIVISIONS) sky_mins_subd[1] = -HALF_SKY_SUBDIVISIONS; else if(sky_mins_subd[1] > HALF_SKY_SUBDIVISIONS) sky_mins_subd[1] = HALF_SKY_SUBDIVISIONS; if(sky_maxs_subd[0] < -HALF_SKY_SUBDIVISIONS) sky_maxs_subd[0] = -HALF_SKY_SUBDIVISIONS; else if(sky_maxs_subd[0] > HALF_SKY_SUBDIVISIONS) sky_maxs_subd[0] = HALF_SKY_SUBDIVISIONS; if(sky_maxs_subd[1] < -HALF_SKY_SUBDIVISIONS) sky_maxs_subd[1] = -HALF_SKY_SUBDIVISIONS; else if(sky_maxs_subd[1] > HALF_SKY_SUBDIVISIONS) sky_maxs_subd[1] = HALF_SKY_SUBDIVISIONS; // iterate through the subdivisions for(t = sky_mins_subd[1] + HALF_SKY_SUBDIVISIONS; t <= sky_maxs_subd[1] + HALF_SKY_SUBDIVISIONS; t++) { for(s = sky_mins_subd[0] + HALF_SKY_SUBDIVISIONS; s <= sky_maxs_subd[0] + HALF_SKY_SUBDIVISIONS; s++) { MakeSkyVec((s - HALF_SKY_SUBDIVISIONS) / (float)HALF_SKY_SUBDIVISIONS, (t - HALF_SKY_SUBDIVISIONS) / (float)HALF_SKY_SUBDIVISIONS, i, s_skyTexCoords[t][s], s_skyPoints[t][s]); } } //DrawSkySide(shader->sky.outerbox[sky_texorder[i]], sky_mins_subd, sky_maxs_subd); // only add indexes for first stage FillCloudySkySide(sky_mins_subd, sky_maxs_subd, qtrue); } Tess_DrawElements(); }