/* * 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 ); } }
/* * 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 ); } }
/* * 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 ); }
/* * 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; }
/* * 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] ); } }
/* * 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 ); } }