Beispiel #1
0
/*
* RB_RegisterStreamVBOs
*
* Allocate/keep alive dynamic vertex buffers object 
* we'll steam the dynamic geometry into
*/
void RB_RegisterStreamVBOs( void )
{
	int i;
	mesh_vbo_t *vbo;
	vbo_tag_t tags[RB_VBO_NUM_STREAMS] = {
		VBO_TAG_STREAM,
		VBO_TAG_STREAM,
		VBO_TAG_STREAM_STATIC_ELEMS,
		VBO_TAG_STREAM_STATIC_ELEMS
	};
	vattribmask_t vattribs[RB_VBO_NUM_STREAMS] = {
		VATTRIBS_MASK,
		COMPACT_STREAM_VATTRIBS,
		VATTRIBS_MASK,
		COMPACT_STREAM_VATTRIBS
	};

	// allocate stream VBO's
	for( i = 0; i < RB_VBO_NUM_STREAMS; i++ ) {
		vbo = rb.streamVBOs[i];
		if( vbo ) {
			R_TouchMeshVBO( vbo );
			continue;
		}
		rb.streamVBOs[i] = R_CreateMeshVBO( &rb, 
			MAX_STREAM_VBO_VERTS, MAX_STREAM_VBO_ELEMENTS, MAX_STREAM_VBO_INSTANCES,
			vattribs[i], tags[i], VATTRIB_TEXCOORDS_BIT|VATTRIB_NORMAL_BIT|VATTRIB_SVECTOR_BIT );
	}
}
Beispiel #2
0
/*
* Mod_SkeletalBuildStaticVBOForMesh
* 
* Builds a static vertex buffer object for given skeletal model mesh
*/
static void Mod_SkeletalBuildStaticVBOForMesh( mskmesh_t *mesh )
{
	mesh_t skmmesh;
	vattribmask_t vattribs;
	
	vattribs = VATTRIB_POSITION_BIT | VATTRIB_TEXCOORDS_BIT | VATTRIB_NORMAL_BIT | VATTRIB_SVECTOR_BIT;
	vattribs |= VATTRIB_BONES_BITS;
	vattribs |= mesh->skin.shader->vattribs;

	mesh->vbo = R_CreateMeshVBO( ( void * )mesh, 
		mesh->numverts, mesh->numtris * 3, 0, vattribs, VBO_TAG_MODEL, vattribs );

	if( !mesh->vbo ) {
		return;
	}

	memset( &skmmesh, 0, sizeof( skmmesh ) );

	skmmesh.elems = mesh->elems;
	skmmesh.numElems = mesh->numtris * 3;
	skmmesh.numVerts = mesh->numverts;

	skmmesh.xyzArray = mesh->xyzArray;
	skmmesh.stArray = mesh->stArray;
	skmmesh.normalsArray = mesh->normalsArray;
	skmmesh.sVectorsArray = mesh->sVectorsArray;

	R_UploadVBOVertexData( mesh->vbo, 0, vattribs, &skmmesh, VBO_HINT_NONE ); 
	R_UploadVBOElemData( mesh->vbo, 0, 0, &skmmesh, VBO_HINT_NONE );
	if( glConfig.maxGLSLBones > 0 ) {
	    R_UploadVBOBonesData( mesh->vbo, 0, mesh->numverts, mesh->blendIndices, mesh->blendWeights );
	}
}
Beispiel #3
0
/*
* Mod_AliasBuildStaticVBOForMesh
* 
* Builds a static vertex buffer object for given alias model mesh
*/
static void Mod_AliasBuildStaticVBOForMesh( maliasmesh_t *mesh )
{
	int i;
	mesh_t aliasmesh;
	vattribmask_t vattribs;
	
	vattribs = VATTRIB_TEXCOORDS_BIT | VATTRIB_NORMAL_BIT | VATTRIB_SVECTOR_BIT;
	for( i = 0; i < mesh->numskins; i++ ) {
		vattribs |= mesh->skins[i].shader->vattribs;
	}

	mesh->vbo = R_CreateMeshVBO( ( void * )mesh, 
		mesh->numverts, mesh->numtris * 3, 0, vattribs, VBO_TAG_MODEL );

	if( !mesh->vbo ) {
		return;
	}

	memset( &aliasmesh, 0, sizeof( aliasmesh ) );

	aliasmesh.elems = mesh->elems;
	aliasmesh.numElems = mesh->numtris * 3;
	aliasmesh.numVerts = mesh->numverts;

	aliasmesh.xyzArray = mesh->xyzArray;
	aliasmesh.stArray = mesh->stArray;
	aliasmesh.normalsArray = mesh->normalsArray;
	aliasmesh.sVectorsArray = mesh->sVectorsArray;

	R_UploadVBOVertexData( mesh->vbo, 0, vattribs, &aliasmesh, VBO_HINT_NONE );
	R_UploadVBOElemData( mesh->vbo, 0, 0, &aliasmesh, VBO_HINT_NONE );
}
Beispiel #4
0
/*
* R_CreateSkydome
*/
skydome_t *R_CreateSkydome( model_t *model )
{
	int i, size;
	mesh_t *mesh;
	skydome_t *skydome;
	qbyte *buffer;

	size = sizeof( skydome_t ) + sizeof( mesh_t ) * 6 +
		sizeof( elem_t ) * ELEM_LEN * 6 +
		sizeof( vec3_t ) * POINTS_LEN * 6 + sizeof( vec3_t ) * POINTS_LEN * 6 +
		sizeof( vec2_t ) * POINTS_LEN * 11;
	buffer = Mod_Malloc( model, size );

	skydome = ( skydome_t * )buffer; buffer += sizeof( skydome_t );
	skydome->meshes = ( mesh_t * )buffer; buffer += sizeof( mesh_t ) * 6;

	for( i = 0, mesh = skydome->meshes; i < 6; i++, mesh++ )
	{
		mesh->numElems = ELEM_LEN;
		mesh->elems = ( elem_t * )buffer; buffer += sizeof( elem_t ) * ELEM_LEN;

		mesh->numVerts = POINTS_LEN;
		mesh->xyzArray = ( vec3_t * )buffer; buffer += sizeof( vec3_t ) * POINTS_LEN;
		mesh->normalsArray = ( vec3_t * )buffer; buffer += sizeof( vec3_t ) * POINTS_LEN;

		if( i != 5 ) {
			skydome->sphereStCoords[i] = ( vec2_t * )buffer; buffer += sizeof( vec2_t ) * POINTS_LEN;
			skydome->sphereVbos[i] = R_CreateMeshVBO( mesh, mesh->numVerts, mesh->numElems, 0,
				SKYDOME_VATTRIBS, VBO_TAG_WORLD );
		}

		skydome->linearStCoords[i] = ( vec2_t * )buffer; buffer += sizeof( vec2_t ) * POINTS_LEN;
		skydome->linearVbos[i] = R_CreateMeshVBO( mesh, mesh->numVerts, mesh->numElems, 0,
			SKYDOME_VATTRIBS, VBO_TAG_WORLD );
	}

	Gen_Box( skydome );

	return skydome;
}
Beispiel #5
0
/*
* RB_RegisterStreamVBOs
*
* Allocate/keep alive dynamic vertex buffers object 
* we'll steam the dynamic geometry into
*/
void RB_RegisterStreamVBOs( void )
{
	int i;
	mesh_vbo_t *vbo;
	vbo_tag_t tags[RB_VBO_NUM_STREAMS] = {
		VBO_TAG_STREAM,
		VBO_TAG_STREAM_STATIC_ELEMS
	};

	// allocate stream VBO's
	for( i = 0; i < RB_VBO_NUM_STREAMS; i++ ) {
		vbo = rb.streamVBOs[i];
		if( vbo ) {
			R_TouchMeshVBO( vbo );
			continue;
		}
		rb.streamVBOs[i] = R_CreateMeshVBO( &rb, 
			MAX_STREAM_VBO_VERTS, MAX_STREAM_VBO_ELEMENTS, MAX_STREAM_VBO_INSTANCES,
			VATTRIBS_MASK, tags[i] );
	}
}
Beispiel #6
0
/*
* RB_RegisterStreamVBOs
*
* Allocate/keep alive dynamic vertex buffers object
* we'll steam the dynamic geometry into
*/
void RB_RegisterStreamVBOs( void )
{
    int i;
    rbDynamicStream_t *stream;
    vattribmask_t vattribs[RB_VBO_NUM_STREAMS] = {
        VATTRIBS_MASK & ~VATTRIB_INSTANCES_BITS,
        COMPACT_STREAM_VATTRIBS
    };

    // allocate stream VBO's
    for( i = 0; i < RB_VBO_NUM_STREAMS; i++ ) {
        stream = &rb.dynamicStreams[i];
        if( stream->vbo ) {
            R_TouchMeshVBO( stream->vbo );
            continue;
        }
        stream->vbo = R_CreateMeshVBO( &rb,
                                       MAX_STREAM_VBO_VERTS, MAX_STREAM_VBO_ELEMENTS, 0,
                                       vattribs[i], VBO_TAG_STREAM, VATTRIB_TEXCOORDS_BIT|VATTRIB_NORMAL_BIT|VATTRIB_SVECTOR_BIT );
        stream->vertexData = RB_Alloc( MAX_STREAM_VBO_VERTS * stream->vbo->vertexSize );
    }
}