This is an automated email from the git hooks/post-receive script. smcv pushed a commit to annotated tag 1.5a in repository iortcw.
commit c9d29d4f4072b8805c76b8d4ca93ee3017741392 Author: MAN-AT-ARMS <m4n4t4...@gmail.com> Date: Mon Aug 15 16:11:10 2016 -0400 All: Rend2: Preallocate grid surfaces like other BSP surfaces --- MP/code/rend2/tr_bsp.c | 104 ++++++++++++++++++++++------------------------- MP/code/rend2/tr_curve.c | 68 ++++++++++++------------------- MP/code/rend2/tr_local.h | 8 ++-- SP/code/rend2/tr_bsp.c | 104 ++++++++++++++++++++++------------------------- SP/code/rend2/tr_curve.c | 68 ++++++++++++------------------- SP/code/rend2/tr_local.h | 8 ++-- 6 files changed, 156 insertions(+), 204 deletions(-) diff --git a/MP/code/rend2/tr_bsp.c b/MP/code/rend2/tr_bsp.c index eef7f0f..2289bc2 100644 --- a/MP/code/rend2/tr_bsp.c +++ b/MP/code/rend2/tr_bsp.c @@ -869,7 +869,7 @@ ParseMesh =============== */ static void ParseMesh ( dsurface_t *ds, drawVert_t *verts, float *hdrVertColors, msurface_t *surf ) { - srfBspSurface_t *grid; + srfBspSurface_t *grid = (srfBspSurface_t *)surf->data; int i, j; int width, height, numPoints; srfVert_t points[MAX_PATCH_SIZE*MAX_PATCH_SIZE]; @@ -950,8 +950,7 @@ static void ParseMesh ( dsurface_t *ds, drawVert_t *verts, float *hdrVertColors, } // pre-tesseleate - grid = R_SubdividePatchToGrid( width, height, points ); - surf->data = (surfaceType_t *)grid; + R_SubdividePatchToGrid( grid, width, height, points ); // copy the level of detail origin, which is the center // of the group of all curves that must subdivide the same @@ -964,6 +963,12 @@ static void ParseMesh ( dsurface_t *ds, drawVert_t *verts, float *hdrVertColors, VectorScale( bounds[1], 0.5f, grid->lodOrigin ); VectorSubtract( bounds[0], grid->lodOrigin, tmpVec ); grid->lodRadius = VectorLength( tmpVec ); + + surf->cullinfo.type = CULLINFO_BOX | CULLINFO_SPHERE; + VectorCopy(grid->cullBounds[0], surf->cullinfo.bounds[0]); + VectorCopy(grid->cullBounds[1], surf->cullinfo.bounds[1]); + VectorCopy(grid->cullOrigin, surf->cullinfo.localOrigin); + surf->cullinfo.radius = grid->cullRadius; } /* @@ -1124,6 +1129,8 @@ static void ParseFlare( dsurface_t *ds, drawVert_t *verts, msurface_t *surf, int flare->color[i] = LittleFloat( ds->lightmapVecs[0][i] ); flare->normal[i] = LittleFloat( ds->lightmapVecs[2][i] ); } + + surf->cullinfo.type = CULLINFO_NONE; } @@ -1450,8 +1457,8 @@ int R_StitchPatches( int grid1num, int grid2num ) { if ( m ) { row = grid2->height - 1; } else { row = 0;} - grid2 = R_GridInsertColumn( grid2, l + 1, row, - grid1->verts[k + 1 + offset1].xyz, grid1->widthLodError[k + 1] ); + R_GridInsertColumn( grid2, l + 1, row, + grid1->verts[k + 1 + offset1].xyz, grid1->widthLodError[k + 1] ); grid2->lodStitched = qfalse; s_worldData.surfaces[grid2num].data = (void *) grid2; return qtrue; @@ -1506,8 +1513,8 @@ int R_StitchPatches( int grid1num, int grid2num ) { if ( m ) { column = grid2->width - 1; } else { column = 0;} - grid2 = R_GridInsertRow( grid2, l + 1, column, - grid1->verts[k + 1 + offset1].xyz, grid1->widthLodError[k + 1] ); + R_GridInsertRow( grid2, l + 1, column, + grid1->verts[k + 1 + offset1].xyz, grid1->widthLodError[k + 1] ); grid2->lodStitched = qfalse; s_worldData.surfaces[grid2num].data = (void *) grid2; return qtrue; @@ -1573,8 +1580,8 @@ int R_StitchPatches( int grid1num, int grid2num ) { if ( m ) { row = grid2->height - 1; } else { row = 0;} - grid2 = R_GridInsertColumn( grid2, l + 1, row, - grid1->verts[grid1->width * ( k + 1 ) + offset1].xyz, grid1->heightLodError[k + 1] ); + R_GridInsertColumn( grid2, l + 1, row, + grid1->verts[grid1->width * ( k + 1 ) + offset1].xyz, grid1->heightLodError[k + 1] ); grid2->lodStitched = qfalse; s_worldData.surfaces[grid2num].data = (void *) grid2; return qtrue; @@ -1629,8 +1636,8 @@ int R_StitchPatches( int grid1num, int grid2num ) { if ( m ) { column = grid2->width - 1; } else { column = 0;} - grid2 = R_GridInsertRow( grid2, l + 1, column, - grid1->verts[grid1->width * ( k + 1 ) + offset1].xyz, grid1->heightLodError[k + 1] ); + R_GridInsertRow( grid2, l + 1, column, + grid1->verts[grid1->width * ( k + 1 ) + offset1].xyz, grid1->heightLodError[k + 1] ); grid2->lodStitched = qfalse; s_worldData.surfaces[grid2num].data = (void *) grid2; return qtrue; @@ -1697,8 +1704,8 @@ int R_StitchPatches( int grid1num, int grid2num ) { if ( m ) { row = grid2->height - 1; } else { row = 0;} - grid2 = R_GridInsertColumn( grid2, l + 1, row, - grid1->verts[k - 1 + offset1].xyz, grid1->widthLodError[k + 1] ); + R_GridInsertColumn( grid2, l + 1, row, + grid1->verts[k - 1 + offset1].xyz, grid1->widthLodError[k + 1] ); grid2->lodStitched = qfalse; s_worldData.surfaces[grid2num].data = (void *) grid2; return qtrue; @@ -1753,8 +1760,8 @@ int R_StitchPatches( int grid1num, int grid2num ) { if ( m ) { column = grid2->width - 1; } else { column = 0;} - grid2 = R_GridInsertRow( grid2, l + 1, column, - grid1->verts[k - 1 + offset1].xyz, grid1->widthLodError[k + 1] ); + R_GridInsertRow( grid2, l + 1, column, + grid1->verts[k - 1 + offset1].xyz, grid1->widthLodError[k + 1] ); if ( !grid2 ) { break; } @@ -1823,8 +1830,8 @@ int R_StitchPatches( int grid1num, int grid2num ) { if ( m ) { row = grid2->height - 1; } else { row = 0;} - grid2 = R_GridInsertColumn( grid2, l + 1, row, - grid1->verts[grid1->width * ( k - 1 ) + offset1].xyz, grid1->heightLodError[k + 1] ); + R_GridInsertColumn( grid2, l + 1, row, + grid1->verts[grid1->width * ( k - 1 ) + offset1].xyz, grid1->heightLodError[k + 1] ); grid2->lodStitched = qfalse; s_worldData.surfaces[grid2num].data = (void *) grid2; return qtrue; @@ -1879,8 +1886,8 @@ int R_StitchPatches( int grid1num, int grid2num ) { if ( m ) { column = grid2->width - 1; } else { column = 0;} - grid2 = R_GridInsertRow( grid2, l + 1, column, - grid1->verts[grid1->width * ( k - 1 ) + offset1].xyz, grid1->heightLodError[k + 1] ); + R_GridInsertRow( grid2, l + 1, column, + grid1->verts[grid1->width * ( k - 1 ) + offset1].xyz, grid1->heightLodError[k + 1] ); grid2->lodStitched = qfalse; s_worldData.surfaces[grid2num].data = (void *) grid2; return qtrue; @@ -1981,10 +1988,11 @@ R_MovePatchSurfacesToHunk =============== */ void R_MovePatchSurfacesToHunk( void ) { - int i, size; - srfBspSurface_t *grid, *hunkgrid; + int i; + srfBspSurface_t *grid; for ( i = 0; i < s_worldData.numsurfaces; i++ ) { + void *copyFrom; // grid = (srfBspSurface_t *) s_worldData.surfaces[i].data; // if this surface is not a grid @@ -1992,27 +2000,25 @@ void R_MovePatchSurfacesToHunk( void ) { continue; } // - size = sizeof(*grid); - hunkgrid = ri.Hunk_Alloc(size, h_low); - Com_Memcpy( hunkgrid, grid, size ); - - hunkgrid->widthLodError = ri.Hunk_Alloc( grid->width * 4, h_low ); - Com_Memcpy( hunkgrid->widthLodError, grid->widthLodError, grid->width * 4 ); - - hunkgrid->heightLodError = ri.Hunk_Alloc( grid->height * 4, h_low ); - Com_Memcpy( hunkgrid->heightLodError, grid->heightLodError, grid->height * 4 ); - - hunkgrid->numIndexes = grid->numIndexes; - hunkgrid->indexes = ri.Hunk_Alloc(grid->numIndexes * sizeof(glIndex_t), h_low); - Com_Memcpy(hunkgrid->indexes, grid->indexes, grid->numIndexes * sizeof(glIndex_t)); - - hunkgrid->numVerts = grid->numVerts; - hunkgrid->verts = ri.Hunk_Alloc(grid->numVerts * sizeof(srfVert_t), h_low); - Com_Memcpy(hunkgrid->verts, grid->verts, grid->numVerts * sizeof(srfVert_t)); - - R_FreeSurfaceGridMesh( grid ); - - s_worldData.surfaces[i].data = (void *) hunkgrid; + copyFrom = grid->widthLodError; + grid->widthLodError = ri.Hunk_Alloc( grid->width * 4, h_low ); + Com_Memcpy(grid->widthLodError, copyFrom, grid->width * 4); + ri.Free(copyFrom); + + copyFrom = grid->heightLodError; + grid->heightLodError = ri.Hunk_Alloc(grid->height * 4, h_low); + Com_Memcpy(grid->heightLodError, copyFrom, grid->height * 4); + ri.Free(copyFrom); + + copyFrom = grid->indexes; + grid->indexes = ri.Hunk_Alloc(grid->numIndexes * sizeof(glIndex_t), h_low); + Com_Memcpy(grid->indexes, copyFrom, grid->numIndexes * sizeof(glIndex_t)); + ri.Free(copyFrom); + + copyFrom = grid->verts; + grid->verts = ri.Hunk_Alloc(grid->numVerts * sizeof(srfVert_t), h_low); + Com_Memcpy(grid->verts, copyFrom, grid->numVerts * sizeof(srfVert_t)); + ri.Free(copyFrom); } } @@ -2516,7 +2522,7 @@ static void R_LoadSurfaces( lump_t *surfs, lump_t *verts, lump_t *indexLump ) { for ( i = 0 ; i < count ; i++, in++, out++ ) { switch ( LittleLong( in->surfaceType ) ) { case MST_PATCH: - // FIXME: do this + out->data = ri.Hunk_Alloc( sizeof(srfBspSurface_t), h_low); break; case MST_TRIANGLE_SOUP: out->data = ri.Hunk_Alloc( sizeof(srfBspSurface_t), h_low); @@ -2538,15 +2544,6 @@ static void R_LoadSurfaces( lump_t *surfs, lump_t *verts, lump_t *indexLump ) { switch ( LittleLong( in->surfaceType ) ) { case MST_PATCH: ParseMesh ( in, dv, hdrVertColors, out ); - { - srfBspSurface_t *surface = (srfBspSurface_t *)out->data; - - out->cullinfo.type = CULLINFO_BOX | CULLINFO_SPHERE; - VectorCopy(surface->cullBounds[0], out->cullinfo.bounds[0]); - VectorCopy(surface->cullBounds[1], out->cullinfo.bounds[1]); - VectorCopy(surface->cullOrigin, out->cullinfo.localOrigin); - out->cullinfo.radius = surface->cullRadius; - } numMeshes++; break; case MST_TRIANGLE_SOUP: @@ -2559,9 +2556,6 @@ static void R_LoadSurfaces( lump_t *surfs, lump_t *verts, lump_t *indexLump ) { break; case MST_FLARE: ParseFlare( in, dv, out, indexes ); - { - out->cullinfo.type = CULLINFO_NONE; - } numFlares++; break; default: diff --git a/MP/code/rend2/tr_curve.c b/MP/code/rend2/tr_curve.c index ca7683d..30547ce 100644 --- a/MP/code/rend2/tr_curve.c +++ b/MP/code/rend2/tr_curve.c @@ -260,14 +260,11 @@ static void MakeMeshTangentVectors(int width, int height, srfVert_t ctrl[MAX_GRI } #endif -static int MakeMeshIndexes(int width, int height, srfVert_t ctrl[MAX_GRID_SIZE][MAX_GRID_SIZE], - glIndex_t indexes[(MAX_GRID_SIZE-1)*(MAX_GRID_SIZE-1)*2*3]) +static int MakeMeshIndexes(int width, int height, glIndex_t indexes[(MAX_GRID_SIZE-1)*(MAX_GRID_SIZE-1)*2*3]) { int i, j; int numIndexes; int w, h; - srfVert_t *dv; - static srfVert_t ctrl2[MAX_GRID_SIZE * MAX_GRID_SIZE]; h = height - 1; w = width - 1; @@ -294,16 +291,6 @@ static int MakeMeshIndexes(int width, int height, srfVert_t ctrl[MAX_GRID_SIZE][ } } - // FIXME: use more elegant way - for(i = 0; i < width; i++) - { - for(j = 0; j < height; j++) - { - dv = &ctrl2[j * width + i]; - *dv = ctrl[j][i]; - } - } - return numIndexes; } @@ -381,22 +368,18 @@ static void PutPointsOnCurve( srfVert_t ctrl[MAX_GRID_SIZE][MAX_GRID_SIZE], R_CreateSurfaceGridMesh ================= */ -srfBspSurface_t *R_CreateSurfaceGridMesh(int width, int height, +void R_CreateSurfaceGridMesh(srfBspSurface_t *grid, int width, int height, srfVert_t ctrl[MAX_GRID_SIZE][MAX_GRID_SIZE], float errorTable[2][MAX_GRID_SIZE], int numIndexes, glIndex_t indexes[(MAX_GRID_SIZE-1)*(MAX_GRID_SIZE-1)*2*3]) { - int i, j, size; + int i, j; srfVert_t *vert; vec3_t tmpVec; - srfBspSurface_t *grid; // copy the results out to a grid - size = (width * height - 1) * sizeof( srfVert_t ) + sizeof( *grid ); + Com_Memset(grid, 0, sizeof(*grid)); #ifdef PATCH_STITCHING - grid = /*ri.Hunk_Alloc*/ ri.Z_Malloc( size ); - Com_Memset( grid, 0, size ); - grid->widthLodError = /*ri.Hunk_Alloc*/ ri.Z_Malloc( width * 4 ); memcpy( grid->widthLodError, errorTable[0], width * 4 ); @@ -410,9 +393,6 @@ srfBspSurface_t *R_CreateSurfaceGridMesh(int width, int height, grid->numVerts = (width * height); grid->verts = ri.Z_Malloc(grid->numVerts * sizeof(srfVert_t)); #else - grid = ri.Hunk_Alloc( size, h_low ); - memset( grid, 0, size ); - grid->widthLodError = ri.Hunk_Alloc( width * 4, h_low ); memcpy( grid->widthLodError, errorTable[0], width * 4 ); @@ -448,20 +428,18 @@ srfBspSurface_t *R_CreateSurfaceGridMesh(int width, int height, VectorCopy( grid->cullOrigin, grid->lodOrigin ); grid->lodRadius = grid->cullRadius; // - return grid; } /* ================= -R_FreeSurfaceGridMesh +R_FreeSurfaceGridMeshData ================= */ -void R_FreeSurfaceGridMesh( srfBspSurface_t *grid ) { +void R_FreeSurfaceGridMeshData( srfBspSurface_t *grid ) { ri.Free( grid->widthLodError ); ri.Free( grid->heightLodError ); ri.Free( grid->indexes ); ri.Free( grid->verts ); - ri.Free( grid ); } /* @@ -469,7 +447,7 @@ void R_FreeSurfaceGridMesh( srfBspSurface_t *grid ) { R_SubdividePatchToGrid ================= */ -srfBspSurface_t *R_SubdividePatchToGrid( int width, int height, +void R_SubdividePatchToGrid( srfBspSurface_t *grid, int width, int height, srfVert_t points[MAX_PATCH_SIZE*MAX_PATCH_SIZE] ) { int i, j, k, l; srfVert_t_cleared( prev ); @@ -635,7 +613,7 @@ srfBspSurface_t *R_SubdividePatchToGrid( int width, int height, #endif // calculate indexes - numIndexes = MakeMeshIndexes(width, height, ctrl, indexes); + numIndexes = MakeMeshIndexes(width, height, indexes); // calculate normals MakeMeshNormals( width, height, ctrl ); @@ -643,7 +621,7 @@ srfBspSurface_t *R_SubdividePatchToGrid( int width, int height, MakeMeshTangentVectors(width, height, ctrl, numIndexes, indexes); #endif - return R_CreateSurfaceGridMesh(width, height, ctrl, errorTable, numIndexes, indexes); + R_CreateSurfaceGridMesh(grid, width, height, ctrl, errorTable, numIndexes, indexes); } /* @@ -651,7 +629,7 @@ srfBspSurface_t *R_SubdividePatchToGrid( int width, int height, R_GridInsertColumn =============== */ -srfBspSurface_t *R_GridInsertColumn( srfBspSurface_t *grid, int column, int row, vec3_t point, float loderror ) { +void R_GridInsertColumn( srfBspSurface_t *grid, int column, int row, vec3_t point, float loderror ) { int i, j; int width, height, oldwidth; srfVert_t ctrl[MAX_GRID_SIZE][MAX_GRID_SIZE]; @@ -664,7 +642,7 @@ srfBspSurface_t *R_GridInsertColumn( srfBspSurface_t *grid, int column, int row, oldwidth = 0; width = grid->width + 1; if ( width > MAX_GRID_SIZE ) { - return NULL; + return; } height = grid->height; for ( i = 0; i < width; i++ ) { @@ -692,20 +670,22 @@ srfBspSurface_t *R_GridInsertColumn( srfBspSurface_t *grid, int column, int row, //PutPointsOnCurve( ctrl, width, height ); // calculate indexes - numIndexes = MakeMeshIndexes(width, height, ctrl, indexes); + numIndexes = MakeMeshIndexes(width, height, indexes); // calculate normals MakeMeshNormals( width, height, ctrl ); +#ifdef USE_VERT_TANGENT_SPACE + MakeMeshTangentVectors(width, height, ctrl, numIndexes, indexes); +#endif VectorCopy( grid->lodOrigin, lodOrigin ); lodRadius = grid->lodRadius; // free the old grid - R_FreeSurfaceGridMesh( grid ); + R_FreeSurfaceGridMeshData(grid); // create a new grid - grid = R_CreateSurfaceGridMesh(width, height, ctrl, errorTable, numIndexes, indexes); + R_CreateSurfaceGridMesh(grid, width, height, ctrl, errorTable, numIndexes, indexes); grid->lodRadius = lodRadius; VectorCopy( lodOrigin, grid->lodOrigin ); - return grid; } /* @@ -713,7 +693,7 @@ srfBspSurface_t *R_GridInsertColumn( srfBspSurface_t *grid, int column, int row, R_GridInsertRow =============== */ -srfBspSurface_t *R_GridInsertRow( srfBspSurface_t *grid, int row, int column, vec3_t point, float loderror ) { +void R_GridInsertRow( srfBspSurface_t *grid, int row, int column, vec3_t point, float loderror ) { int i, j; int width, height, oldheight; srfVert_t ctrl[MAX_GRID_SIZE][MAX_GRID_SIZE]; @@ -727,7 +707,7 @@ srfBspSurface_t *R_GridInsertRow( srfBspSurface_t *grid, int row, int column, ve width = grid->width; height = grid->height + 1; if ( height > MAX_GRID_SIZE ) { - return NULL; + return; } for ( i = 0; i < height; i++ ) { if ( i == row ) { @@ -754,18 +734,20 @@ srfBspSurface_t *R_GridInsertRow( srfBspSurface_t *grid, int row, int column, ve //PutPointsOnCurve( ctrl, width, height ); // calculate indexes - numIndexes = MakeMeshIndexes(width, height, ctrl, indexes); + numIndexes = MakeMeshIndexes(width, height, indexes); // calculate normals MakeMeshNormals( width, height, ctrl ); +#ifdef USE_VERT_TANGENT_SPACE + MakeMeshTangentVectors(width, height, ctrl, numIndexes, indexes); +#endif VectorCopy( grid->lodOrigin, lodOrigin ); lodRadius = grid->lodRadius; // free the old grid - R_FreeSurfaceGridMesh( grid ); + R_FreeSurfaceGridMeshData(grid); // create a new grid - grid = R_CreateSurfaceGridMesh(width, height, ctrl, errorTable, numIndexes, indexes); + R_CreateSurfaceGridMesh(grid, width, height, ctrl, errorTable, numIndexes, indexes); grid->lodRadius = lodRadius; VectorCopy( lodOrigin, grid->lodOrigin ); - return grid; } diff --git a/MP/code/rend2/tr_local.h b/MP/code/rend2/tr_local.h index ecd2fd4..ee25e17 100644 --- a/MP/code/rend2/tr_local.h +++ b/MP/code/rend2/tr_local.h @@ -2390,11 +2390,11 @@ CURVE TESSELATION #define PATCH_STITCHING -srfBspSurface_t *R_SubdividePatchToGrid( int width, int height, +void R_SubdividePatchToGrid( srfBspSurface_t *grid, int width, int height, srfVert_t points[MAX_PATCH_SIZE*MAX_PATCH_SIZE] ); -srfBspSurface_t *R_GridInsertColumn( srfBspSurface_t *grid, int column, int row, vec3_t point, float loderror ); -srfBspSurface_t *R_GridInsertRow( srfBspSurface_t *grid, int row, int column, vec3_t point, float loderror ); -void R_FreeSurfaceGridMesh( srfBspSurface_t *grid ); +void R_GridInsertColumn( srfBspSurface_t *grid, int column, int row, vec3_t point, float loderror ); +void R_GridInsertRow( srfBspSurface_t *grid, int row, int column, vec3_t point, float loderror ); +void R_FreeSurfaceGridMeshData( srfBspSurface_t *grid ); /* ============================================================ diff --git a/SP/code/rend2/tr_bsp.c b/SP/code/rend2/tr_bsp.c index 06e4e8e..c609a67 100644 --- a/SP/code/rend2/tr_bsp.c +++ b/SP/code/rend2/tr_bsp.c @@ -866,7 +866,7 @@ ParseMesh =============== */ static void ParseMesh ( dsurface_t *ds, drawVert_t *verts, float *hdrVertColors, msurface_t *surf ) { - srfBspSurface_t *grid; + srfBspSurface_t *grid = (srfBspSurface_t *)surf->data; int i, j; int width, height, numPoints; srfVert_t points[MAX_PATCH_SIZE*MAX_PATCH_SIZE]; @@ -947,8 +947,7 @@ static void ParseMesh ( dsurface_t *ds, drawVert_t *verts, float *hdrVertColors, } // pre-tesseleate - grid = R_SubdividePatchToGrid( width, height, points ); - surf->data = (surfaceType_t *)grid; + R_SubdividePatchToGrid( grid, width, height, points ); // copy the level of detail origin, which is the center // of the group of all curves that must subdivide the same @@ -961,6 +960,12 @@ static void ParseMesh ( dsurface_t *ds, drawVert_t *verts, float *hdrVertColors, VectorScale( bounds[1], 0.5f, grid->lodOrigin ); VectorSubtract( bounds[0], grid->lodOrigin, tmpVec ); grid->lodRadius = VectorLength( tmpVec ); + + surf->cullinfo.type = CULLINFO_BOX | CULLINFO_SPHERE; + VectorCopy(grid->cullBounds[0], surf->cullinfo.bounds[0]); + VectorCopy(grid->cullBounds[1], surf->cullinfo.bounds[1]); + VectorCopy(grid->cullOrigin, surf->cullinfo.localOrigin); + surf->cullinfo.radius = grid->cullRadius; } /* @@ -1120,6 +1125,8 @@ static void ParseFlare( dsurface_t *ds, drawVert_t *verts, msurface_t *surf, int flare->color[i] = LittleFloat( ds->lightmapVecs[0][i] ); flare->normal[i] = LittleFloat( ds->lightmapVecs[2][i] ); } + + surf->cullinfo.type = CULLINFO_NONE; } @@ -1446,8 +1453,8 @@ int R_StitchPatches( int grid1num, int grid2num ) { if ( m ) { row = grid2->height - 1; } else { row = 0;} - grid2 = R_GridInsertColumn( grid2, l + 1, row, - grid1->verts[k + 1 + offset1].xyz, grid1->widthLodError[k + 1] ); + R_GridInsertColumn( grid2, l + 1, row, + grid1->verts[k + 1 + offset1].xyz, grid1->widthLodError[k + 1] ); grid2->lodStitched = qfalse; s_worldData.surfaces[grid2num].data = (void *) grid2; return qtrue; @@ -1502,8 +1509,8 @@ int R_StitchPatches( int grid1num, int grid2num ) { if ( m ) { column = grid2->width - 1; } else { column = 0;} - grid2 = R_GridInsertRow( grid2, l + 1, column, - grid1->verts[k + 1 + offset1].xyz, grid1->widthLodError[k + 1] ); + R_GridInsertRow( grid2, l + 1, column, + grid1->verts[k + 1 + offset1].xyz, grid1->widthLodError[k + 1] ); grid2->lodStitched = qfalse; s_worldData.surfaces[grid2num].data = (void *) grid2; return qtrue; @@ -1569,8 +1576,8 @@ int R_StitchPatches( int grid1num, int grid2num ) { if ( m ) { row = grid2->height - 1; } else { row = 0;} - grid2 = R_GridInsertColumn( grid2, l + 1, row, - grid1->verts[grid1->width * ( k + 1 ) + offset1].xyz, grid1->heightLodError[k + 1] ); + R_GridInsertColumn( grid2, l + 1, row, + grid1->verts[grid1->width * ( k + 1 ) + offset1].xyz, grid1->heightLodError[k + 1] ); grid2->lodStitched = qfalse; s_worldData.surfaces[grid2num].data = (void *) grid2; return qtrue; @@ -1625,8 +1632,8 @@ int R_StitchPatches( int grid1num, int grid2num ) { if ( m ) { column = grid2->width - 1; } else { column = 0;} - grid2 = R_GridInsertRow( grid2, l + 1, column, - grid1->verts[grid1->width * ( k + 1 ) + offset1].xyz, grid1->heightLodError[k + 1] ); + R_GridInsertRow( grid2, l + 1, column, + grid1->verts[grid1->width * ( k + 1 ) + offset1].xyz, grid1->heightLodError[k + 1] ); grid2->lodStitched = qfalse; s_worldData.surfaces[grid2num].data = (void *) grid2; return qtrue; @@ -1693,8 +1700,8 @@ int R_StitchPatches( int grid1num, int grid2num ) { if ( m ) { row = grid2->height - 1; } else { row = 0;} - grid2 = R_GridInsertColumn( grid2, l + 1, row, - grid1->verts[k - 1 + offset1].xyz, grid1->widthLodError[k + 1] ); + R_GridInsertColumn( grid2, l + 1, row, + grid1->verts[k - 1 + offset1].xyz, grid1->widthLodError[k + 1] ); grid2->lodStitched = qfalse; s_worldData.surfaces[grid2num].data = (void *) grid2; return qtrue; @@ -1749,8 +1756,8 @@ int R_StitchPatches( int grid1num, int grid2num ) { if ( m ) { column = grid2->width - 1; } else { column = 0;} - grid2 = R_GridInsertRow( grid2, l + 1, column, - grid1->verts[k - 1 + offset1].xyz, grid1->widthLodError[k + 1] ); + R_GridInsertRow( grid2, l + 1, column, + grid1->verts[k - 1 + offset1].xyz, grid1->widthLodError[k + 1] ); if ( !grid2 ) { break; } @@ -1819,8 +1826,8 @@ int R_StitchPatches( int grid1num, int grid2num ) { if ( m ) { row = grid2->height - 1; } else { row = 0;} - grid2 = R_GridInsertColumn( grid2, l + 1, row, - grid1->verts[grid1->width * ( k - 1 ) + offset1].xyz, grid1->heightLodError[k + 1] ); + R_GridInsertColumn( grid2, l + 1, row, + grid1->verts[grid1->width * ( k - 1 ) + offset1].xyz, grid1->heightLodError[k + 1] ); grid2->lodStitched = qfalse; s_worldData.surfaces[grid2num].data = (void *) grid2; return qtrue; @@ -1875,8 +1882,8 @@ int R_StitchPatches( int grid1num, int grid2num ) { if ( m ) { column = grid2->width - 1; } else { column = 0;} - grid2 = R_GridInsertRow( grid2, l + 1, column, - grid1->verts[grid1->width * ( k - 1 ) + offset1].xyz, grid1->heightLodError[k + 1] ); + R_GridInsertRow( grid2, l + 1, column, + grid1->verts[grid1->width * ( k - 1 ) + offset1].xyz, grid1->heightLodError[k + 1] ); grid2->lodStitched = qfalse; s_worldData.surfaces[grid2num].data = (void *) grid2; return qtrue; @@ -1977,10 +1984,11 @@ R_MovePatchSurfacesToHunk =============== */ void R_MovePatchSurfacesToHunk( void ) { - int i, size; - srfBspSurface_t *grid, *hunkgrid; + int i; + srfBspSurface_t *grid; for ( i = 0; i < s_worldData.numsurfaces; i++ ) { + void *copyFrom; // grid = (srfBspSurface_t *) s_worldData.surfaces[i].data; // if this surface is not a grid @@ -1988,27 +1996,25 @@ void R_MovePatchSurfacesToHunk( void ) { continue; } // - size = sizeof(*grid); - hunkgrid = ri.Hunk_Alloc(size, h_low); - Com_Memcpy( hunkgrid, grid, size ); - - hunkgrid->widthLodError = ri.Hunk_Alloc( grid->width * 4, h_low ); - Com_Memcpy( hunkgrid->widthLodError, grid->widthLodError, grid->width * 4 ); - - hunkgrid->heightLodError = ri.Hunk_Alloc( grid->height * 4, h_low ); - Com_Memcpy( hunkgrid->heightLodError, grid->heightLodError, grid->height * 4 ); - - hunkgrid->numIndexes = grid->numIndexes; - hunkgrid->indexes = ri.Hunk_Alloc(grid->numIndexes * sizeof(glIndex_t), h_low); - Com_Memcpy(hunkgrid->indexes, grid->indexes, grid->numIndexes * sizeof(glIndex_t)); - - hunkgrid->numVerts = grid->numVerts; - hunkgrid->verts = ri.Hunk_Alloc(grid->numVerts * sizeof(srfVert_t), h_low); - Com_Memcpy(hunkgrid->verts, grid->verts, grid->numVerts * sizeof(srfVert_t)); - - R_FreeSurfaceGridMesh( grid ); - - s_worldData.surfaces[i].data = (void *) hunkgrid; + copyFrom = grid->widthLodError; + grid->widthLodError = ri.Hunk_Alloc( grid->width * 4, h_low ); + Com_Memcpy(grid->widthLodError, copyFrom, grid->width * 4); + ri.Free(copyFrom); + + copyFrom = grid->heightLodError; + grid->heightLodError = ri.Hunk_Alloc(grid->height * 4, h_low); + Com_Memcpy(grid->heightLodError, copyFrom, grid->height * 4); + ri.Free(copyFrom); + + copyFrom = grid->indexes; + grid->indexes = ri.Hunk_Alloc(grid->numIndexes * sizeof(glIndex_t), h_low); + Com_Memcpy(grid->indexes, copyFrom, grid->numIndexes * sizeof(glIndex_t)); + ri.Free(copyFrom); + + copyFrom = grid->verts; + grid->verts = ri.Hunk_Alloc(grid->numVerts * sizeof(srfVert_t), h_low); + Com_Memcpy(grid->verts, copyFrom, grid->numVerts * sizeof(srfVert_t)); + ri.Free(copyFrom); } } @@ -2504,7 +2510,7 @@ static void R_LoadSurfaces( lump_t *surfs, lump_t *verts, lump_t *indexLump ) { for ( i = 0 ; i < count ; i++, in++, out++ ) { switch ( LittleLong( in->surfaceType ) ) { case MST_PATCH: - // FIXME: do this + out->data = ri.Hunk_Alloc( sizeof(srfBspSurface_t), h_low); break; case MST_TRIANGLE_SOUP: out->data = ri.Hunk_Alloc( sizeof(srfBspSurface_t), h_low); @@ -2526,15 +2532,6 @@ static void R_LoadSurfaces( lump_t *surfs, lump_t *verts, lump_t *indexLump ) { switch ( LittleLong( in->surfaceType ) ) { case MST_PATCH: ParseMesh ( in, dv, hdrVertColors, out ); - { - srfBspSurface_t *surface = (srfBspSurface_t *)out->data; - - out->cullinfo.type = CULLINFO_BOX | CULLINFO_SPHERE; - VectorCopy(surface->cullBounds[0], out->cullinfo.bounds[0]); - VectorCopy(surface->cullBounds[1], out->cullinfo.bounds[1]); - VectorCopy(surface->cullOrigin, out->cullinfo.localOrigin); - out->cullinfo.radius = surface->cullRadius; - } numMeshes++; break; case MST_TRIANGLE_SOUP: @@ -2547,9 +2544,6 @@ static void R_LoadSurfaces( lump_t *surfs, lump_t *verts, lump_t *indexLump ) { break; case MST_FLARE: ParseFlare( in, dv, out, indexes ); - { - out->cullinfo.type = CULLINFO_NONE; - } numFlares++; break; default: diff --git a/SP/code/rend2/tr_curve.c b/SP/code/rend2/tr_curve.c index 6886c69..54349cd 100644 --- a/SP/code/rend2/tr_curve.c +++ b/SP/code/rend2/tr_curve.c @@ -261,14 +261,11 @@ static void MakeMeshTangentVectors(int width, int height, srfVert_t ctrl[MAX_GRI #endif -static int MakeMeshIndexes(int width, int height, srfVert_t ctrl[MAX_GRID_SIZE][MAX_GRID_SIZE], - glIndex_t indexes[(MAX_GRID_SIZE-1)*(MAX_GRID_SIZE-1)*2*3]) +static int MakeMeshIndexes(int width, int height, glIndex_t indexes[(MAX_GRID_SIZE-1)*(MAX_GRID_SIZE-1)*2*3]) { int i, j; int numIndexes; int w, h; - srfVert_t *dv; - static srfVert_t ctrl2[MAX_GRID_SIZE * MAX_GRID_SIZE]; h = height - 1; w = width - 1; @@ -295,16 +292,6 @@ static int MakeMeshIndexes(int width, int height, srfVert_t ctrl[MAX_GRID_SIZE][ } } - // FIXME: use more elegant way - for(i = 0; i < width; i++) - { - for(j = 0; j < height; j++) - { - dv = &ctrl2[j * width + i]; - *dv = ctrl[j][i]; - } - } - return numIndexes; } @@ -382,21 +369,17 @@ static void PutPointsOnCurve( srfVert_t ctrl[MAX_GRID_SIZE][MAX_GRID_SIZE], R_CreateSurfaceGridMesh ================= */ -srfBspSurface_t *R_CreateSurfaceGridMesh(int width, int height, +void R_CreateSurfaceGridMesh(srfBspSurface_t *grid, int width, int height, srfVert_t ctrl[MAX_GRID_SIZE][MAX_GRID_SIZE], float errorTable[2][MAX_GRID_SIZE], int numIndexes, glIndex_t indexes[(MAX_GRID_SIZE-1)*(MAX_GRID_SIZE-1)*2*3]) { - int i, j, size; + int i, j; srfVert_t *vert; vec3_t tmpVec; - srfBspSurface_t *grid; // copy the results out to a grid - size = (width * height - 1) * sizeof( srfVert_t ) + sizeof( *grid ); + Com_Memset(grid, 0, sizeof(*grid)); #ifdef PATCH_STITCHING - grid = malloc( size ); - Com_Memset( grid, 0, size ); - grid->widthLodError = malloc( width * 4 ); memcpy( grid->widthLodError, errorTable[0], width * 4 ); @@ -410,9 +393,6 @@ srfBspSurface_t *R_CreateSurfaceGridMesh(int width, int height, grid->numVerts = (width * height); grid->verts = ri.Z_Malloc(grid->numVerts * sizeof(srfVert_t)); #else - grid = ri.Hunk_Alloc( size, h_low ); - memset( grid, 0, size ); - grid->widthLodError = ri.Hunk_Alloc( width * 4, h_low ); memcpy( grid->widthLodError, errorTable[0], width * 4 ); @@ -448,20 +428,18 @@ srfBspSurface_t *R_CreateSurfaceGridMesh(int width, int height, VectorCopy( grid->cullOrigin, grid->lodOrigin ); grid->lodRadius = grid->cullRadius; // - return grid; } /* ================= -R_FreeSurfaceGridMesh +R_FreeSurfaceGridMeshData ================= */ -void R_FreeSurfaceGridMesh( srfBspSurface_t *grid ) { +void R_FreeSurfaceGridMeshData( srfBspSurface_t *grid ) { ri.Free( grid->widthLodError ); ri.Free( grid->heightLodError ); ri.Free( grid->indexes ); ri.Free( grid->verts ); - ri.Free( grid ); } /* @@ -469,7 +447,7 @@ void R_FreeSurfaceGridMesh( srfBspSurface_t *grid ) { R_SubdividePatchToGrid ================= */ -srfBspSurface_t *R_SubdividePatchToGrid( int width, int height, +void R_SubdividePatchToGrid( srfBspSurface_t *grid, int width, int height, srfVert_t points[MAX_PATCH_SIZE*MAX_PATCH_SIZE] ) { int i, j, k, l; srfVert_t_cleared( prev ); @@ -635,7 +613,7 @@ srfBspSurface_t *R_SubdividePatchToGrid( int width, int height, #endif // calculate indexes - numIndexes = MakeMeshIndexes(width, height, ctrl, indexes); + numIndexes = MakeMeshIndexes(width, height, indexes); // calculate normals MakeMeshNormals( width, height, ctrl ); @@ -643,7 +621,7 @@ srfBspSurface_t *R_SubdividePatchToGrid( int width, int height, MakeMeshTangentVectors(width, height, ctrl, numIndexes, indexes); #endif - return R_CreateSurfaceGridMesh(width, height, ctrl, errorTable, numIndexes, indexes); + R_CreateSurfaceGridMesh(grid, width, height, ctrl, errorTable, numIndexes, indexes); } /* @@ -651,7 +629,7 @@ srfBspSurface_t *R_SubdividePatchToGrid( int width, int height, R_GridInsertColumn =============== */ -srfBspSurface_t *R_GridInsertColumn( srfBspSurface_t *grid, int column, int row, vec3_t point, float loderror ) { +void R_GridInsertColumn( srfBspSurface_t *grid, int column, int row, vec3_t point, float loderror ) { int i, j; int width, height, oldwidth; srfVert_t ctrl[MAX_GRID_SIZE][MAX_GRID_SIZE]; @@ -664,7 +642,7 @@ srfBspSurface_t *R_GridInsertColumn( srfBspSurface_t *grid, int column, int row, oldwidth = 0; width = grid->width + 1; if ( width > MAX_GRID_SIZE ) { - return NULL; + return; } height = grid->height; for ( i = 0; i < width; i++ ) { @@ -692,20 +670,22 @@ srfBspSurface_t *R_GridInsertColumn( srfBspSurface_t *grid, int column, int row, //PutPointsOnCurve( ctrl, width, height ); // calculate indexes - numIndexes = MakeMeshIndexes(width, height, ctrl, indexes); + numIndexes = MakeMeshIndexes(width, height, indexes); // calculate normals MakeMeshNormals( width, height, ctrl ); +#ifdef USE_VERT_TANGENT_SPACE + MakeMeshTangentVectors(width, height, ctrl, numIndexes, indexes); +#endif VectorCopy( grid->lodOrigin, lodOrigin ); lodRadius = grid->lodRadius; // free the old grid - R_FreeSurfaceGridMesh( grid ); + R_FreeSurfaceGridMeshData(grid); // create a new grid - grid = R_CreateSurfaceGridMesh(width, height, ctrl, errorTable, numIndexes, indexes); + R_CreateSurfaceGridMesh(grid, width, height, ctrl, errorTable, numIndexes, indexes); grid->lodRadius = lodRadius; VectorCopy( lodOrigin, grid->lodOrigin ); - return grid; } /* @@ -713,7 +693,7 @@ srfBspSurface_t *R_GridInsertColumn( srfBspSurface_t *grid, int column, int row, R_GridInsertRow =============== */ -srfBspSurface_t *R_GridInsertRow( srfBspSurface_t *grid, int row, int column, vec3_t point, float loderror ) { +void R_GridInsertRow( srfBspSurface_t *grid, int row, int column, vec3_t point, float loderror ) { int i, j; int width, height, oldheight; srfVert_t ctrl[MAX_GRID_SIZE][MAX_GRID_SIZE]; @@ -727,7 +707,7 @@ srfBspSurface_t *R_GridInsertRow( srfBspSurface_t *grid, int row, int column, ve width = grid->width; height = grid->height + 1; if ( height > MAX_GRID_SIZE ) { - return NULL; + return; } for ( i = 0; i < height; i++ ) { if ( i == row ) { @@ -754,19 +734,21 @@ srfBspSurface_t *R_GridInsertRow( srfBspSurface_t *grid, int row, int column, ve //PutPointsOnCurve( ctrl, width, height ); // calculate indexes - numIndexes = MakeMeshIndexes(width, height, ctrl, indexes); + numIndexes = MakeMeshIndexes(width, height, indexes); // calculate normals MakeMeshNormals( width, height, ctrl ); +#ifdef USE_VERT_TANGENT_SPACE + MakeMeshTangentVectors(width, height, ctrl, numIndexes, indexes); +#endif VectorCopy( grid->lodOrigin, lodOrigin ); lodRadius = grid->lodRadius; // free the old grid - R_FreeSurfaceGridMesh( grid ); + R_FreeSurfaceGridMeshData(grid); // create a new grid - grid = R_CreateSurfaceGridMesh(width, height, ctrl, errorTable, numIndexes, indexes); + R_CreateSurfaceGridMesh(grid, width, height, ctrl, errorTable, numIndexes, indexes); grid->lodRadius = lodRadius; VectorCopy( lodOrigin, grid->lodOrigin ); - return grid; } diff --git a/SP/code/rend2/tr_local.h b/SP/code/rend2/tr_local.h index fd31689..01bd9dc 100644 --- a/SP/code/rend2/tr_local.h +++ b/SP/code/rend2/tr_local.h @@ -2420,11 +2420,11 @@ CURVE TESSELATION #define PATCH_STITCHING -srfBspSurface_t *R_SubdividePatchToGrid( int width, int height, +void R_SubdividePatchToGrid( srfBspSurface_t *grid, int width, int height, srfVert_t points[MAX_PATCH_SIZE*MAX_PATCH_SIZE] ); -srfBspSurface_t *R_GridInsertColumn( srfBspSurface_t *grid, int column, int row, vec3_t point, float loderror ); -srfBspSurface_t *R_GridInsertRow( srfBspSurface_t *grid, int row, int column, vec3_t point, float loderror ); -void R_FreeSurfaceGridMesh( srfBspSurface_t *grid ); +void R_GridInsertColumn( srfBspSurface_t *grid, int column, int row, vec3_t point, float loderror ); +void R_GridInsertRow( srfBspSurface_t *grid, int row, int column, vec3_t point, float loderror ); +void R_FreeSurfaceGridMeshData( srfBspSurface_t *grid ); /* ============================================================ -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/iortcw.git _______________________________________________ Pkg-games-commits mailing list Pkg-games-commits@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-games-commits