* brush planes normals snap: +fix of vector-is-close-to-be-ON-axis case, was breaking slivers collisions, drawsurfs
	* alphamod scale: works now
clean shiftBspMain
This commit is contained in:
Garux 2017-08-01 13:35:36 +03:00
parent f73cc19a61
commit a255fbd84e
3 changed files with 28 additions and 109 deletions

View File

@ -1508,7 +1508,7 @@ int ShiftBSPMain( int argc, char **argv ){
} }
} }
/* get scale */ /* get shift */
// if(argc-2 >= i) // always true // if(argc-2 >= i) // always true
scale[2] = scale[1] = scale[0] = atof( argv[ argc - 2 ] ); scale[2] = scale[1] = scale[0] = atof( argv[ argc - 2 ] );
if ( argc - 3 >= i ) { if ( argc - 3 >= i ) {
@ -1535,10 +1535,10 @@ int ShiftBSPMain( int argc, char **argv ){
Sys_Printf( "--- ShiftBSP ---\n" ); Sys_Printf( "--- ShiftBSP ---\n" );
Sys_FPrintf( SYS_VRB, "%9d entities\n", numEntities ); Sys_FPrintf( SYS_VRB, "%9d entities\n", numEntities );
/* scale entity keys */ /* shift entity keys */
for ( i = 0; i < numBSPEntities && i < numEntities; i++ ) for ( i = 0; i < numBSPEntities && i < numEntities; i++ )
{ {
/* scale origin */ /* shift origin */
GetVectorForKey( &entities[ i ], "origin", vec ); GetVectorForKey( &entities[ i ], "origin", vec );
if ( ( vec[ 0 ] || vec[ 1 ] || vec[ 2 ] ) ) { if ( ( vec[ 0 ] || vec[ 1 ] || vec[ 2 ] ) ) {
if ( !strncmp( ValueForKey( &entities[i], "classname" ), "info_player_", 12 ) ) { if ( !strncmp( ValueForKey( &entities[i], "classname" ), "info_player_", 12 ) ) {
@ -1556,7 +1556,7 @@ int ShiftBSPMain( int argc, char **argv ){
} }
/* scale models */ /* shift models */
for ( i = 0; i < numBSPModels; i++ ) for ( i = 0; i < numBSPModels; i++ )
{ {
bspModels[ i ].mins[0] += scale[0]; bspModels[ i ].mins[0] += scale[0];
@ -1567,7 +1567,7 @@ int ShiftBSPMain( int argc, char **argv ){
bspModels[ i ].maxs[2] += scale[2]; bspModels[ i ].maxs[2] += scale[2];
} }
/* scale nodes */ /* shift nodes */
for ( i = 0; i < numBSPNodes; i++ ) for ( i = 0; i < numBSPNodes; i++ )
{ {
bspNodes[ i ].mins[0] += scale[0]; bspNodes[ i ].mins[0] += scale[0];
@ -1578,7 +1578,7 @@ int ShiftBSPMain( int argc, char **argv ){
bspNodes[ i ].maxs[2] += scale[2]; bspNodes[ i ].maxs[2] += scale[2];
} }
/* scale leafs */ /* shift leafs */
for ( i = 0; i < numBSPLeafs; i++ ) for ( i = 0; i < numBSPLeafs; i++ )
{ {
bspLeafs[ i ].mins[0] += scale[0]; bspLeafs[ i ].mins[0] += scale[0];
@ -1588,118 +1588,37 @@ int ShiftBSPMain( int argc, char **argv ){
bspLeafs[ i ].maxs[1] += scale[1]; bspLeafs[ i ].maxs[1] += scale[1];
bspLeafs[ i ].maxs[2] += scale[2]; bspLeafs[ i ].maxs[2] += scale[2];
} }
/*
if ( texscale ) { /* shift drawverts */
Sys_Printf( "Using texture unlocking (and probably breaking texture alignment a lot)\n" );
old_xyzst = safe_malloc( sizeof( *old_xyzst ) * numBSPDrawVerts * 5 );
for ( i = 0; i < numBSPDrawVerts; i++ )
{
old_xyzst[5 * i + 0] = bspDrawVerts[i].xyz[0];
old_xyzst[5 * i + 1] = bspDrawVerts[i].xyz[1];
old_xyzst[5 * i + 2] = bspDrawVerts[i].xyz[2];
old_xyzst[5 * i + 3] = bspDrawVerts[i].st[0];
old_xyzst[5 * i + 4] = bspDrawVerts[i].st[1];
}
}
*/
/* scale drawverts */
for ( i = 0; i < numBSPDrawVerts; i++ ) for ( i = 0; i < numBSPDrawVerts; i++ )
{ {
bspDrawVerts[i].xyz[0] += scale[0]; bspDrawVerts[i].xyz[0] += scale[0];
bspDrawVerts[i].xyz[1] += scale[1]; bspDrawVerts[i].xyz[1] += scale[1];
bspDrawVerts[i].xyz[2] += scale[2]; bspDrawVerts[i].xyz[2] += scale[2];
// bspDrawVerts[i].normal[0] /= scale[0];
// bspDrawVerts[i].normal[1] /= scale[1];
// bspDrawVerts[i].normal[2] /= scale[2];
// VectorNormalize( bspDrawVerts[i].normal, bspDrawVerts[i].normal );
} }
/*
if ( texscale ) { /* shift planes */
for ( i = 0; i < numBSPDrawSurfaces; i++ )
{ vec3_t point;
switch ( bspDrawSurfaces[i].surfaceType )
{
case SURFACE_FACE:
case SURFACE_META:
if ( bspDrawSurfaces[i].numIndexes % 3 ) {
Error( "Not a triangulation!" );
}
for ( j = bspDrawSurfaces[i].firstIndex; j < bspDrawSurfaces[i].firstIndex + bspDrawSurfaces[i].numIndexes; j += 3 )
{
int ia = bspDrawIndexes[j] + bspDrawSurfaces[i].firstVert, ib = bspDrawIndexes[j + 1] + bspDrawSurfaces[i].firstVert, ic = bspDrawIndexes[j + 2] + bspDrawSurfaces[i].firstVert;
bspDrawVert_t *a = &bspDrawVerts[ia], *b = &bspDrawVerts[ib], *c = &bspDrawVerts[ic];
float *oa = &old_xyzst[ia * 5], *ob = &old_xyzst[ib * 5], *oc = &old_xyzst[ic * 5];
// extrapolate:
// a->xyz -> oa
// b->xyz -> ob
// c->xyz -> oc
ExtrapolateTexcoords(
&oa[0], &oa[3],
&ob[0], &ob[3],
&oc[0], &oc[3],
a->xyz, a->st,
b->xyz, b->st,
c->xyz, c->st );
}
break;
}
}
}
*/
/* scale planes */
for ( i = 0; i < numBSPPlanes; i++ ) for ( i = 0; i < numBSPPlanes; i++ )
{ {
if ( bspPlanes[ i ].dist > 0 ){ //find point on plane
if ( bspPlanes[ i ].normal[0] ){ for ( j=0; j<3; j++ ){
bspPlanes[ i ].dist += scale[0]; if ( fabs( bspPlanes[ i ].normal[j] ) > 0.5 ){
continue; point[j] = bspPlanes[ i ].dist / bspPlanes[ i ].normal[j];
} point[(j+1)%3] = point[(j+2)%3] = 0;
else if ( bspPlanes[ i ].normal[1] ){ break;
bspPlanes[ i ].dist += scale[1]; }
continue;
}
else if ( bspPlanes[ i ].normal[2] ){
bspPlanes[ i ].dist += scale[2];
continue;
}
} }
else{ //shift point
if ( bspPlanes[ i ].normal[0] ){ for ( j=0; j<3; j++ ){
bspPlanes[ i ].dist -= scale[0]; point[j] += scale[j];
continue;
}
else if ( bspPlanes[ i ].normal[1] ){
bspPlanes[ i ].dist -= scale[1];
continue;
}
else if ( bspPlanes[ i ].normal[2] ){
bspPlanes[ i ].dist -= scale[2];
continue;
}
} }
//calc new plane dist
bspPlanes[ i ].dist = DotProduct( point, bspPlanes[ i ].normal );
} }
/* if ( uniform ) {
for ( i = 0; i < numBSPPlanes; i++ )
{
bspPlanes[ i ].dist += scale[0];
}
}
else
{
for ( i = 0; i < numBSPPlanes; i++ )
{
// bspPlanes[ i ].normal[0] /= scale[0];
// bspPlanes[ i ].normal[1] /= scale[1];
// bspPlanes[ i ].normal[2] /= scale[2];
f = 1 / VectorLength( bspPlanes[i].normal );
VectorScale( bspPlanes[i].normal, f, bspPlanes[i].normal );
bspPlanes[ i ].dist *= f;
}
}*/
/* scale gridsize */ /* scale gridsize */
/* /*
GetVectorForKey( &entities[ 0 ], "gridsize", vec ); GetVectorForKey( &entities[ 0 ], "gridsize", vec );

View File

@ -164,10 +164,10 @@ qboolean SnapNormal( vec3_t normal ){
// normalized). The original SnapNormal() didn't snap such vectors - it // normalized). The original SnapNormal() didn't snap such vectors - it
// only snapped vectors that were near a perfect axis. // only snapped vectors that were near a perfect axis.
//adjusting vectors, that were near a perfect axis, with bigger epsilon //adjusting vectors, that are near perfect axis, with bigger epsilon
//they cause precision errors //they cause precision errors
/*
if ( ( normal[0] != 0.0 || normal[1] != 0.0 ) && fabs(normal[0]) < 0.00025 && fabs(normal[1]) < 0.00025){ if ( ( normal[0] != 0.0 || normal[1] != 0.0 ) && fabs(normal[0]) < 0.00025 && fabs(normal[1]) < 0.00025){
normal[0] = normal[1] = 0.0; normal[0] = normal[1] = 0.0;
adjusted = qtrue; adjusted = qtrue;
@ -180,7 +180,7 @@ qboolean SnapNormal( vec3_t normal ){
normal[2] = normal[1] = 0.0; normal[2] = normal[1] = 0.0;
adjusted = qtrue; adjusted = qtrue;
} }
*/
/* /*
for ( i=0; i<30; i++ ) for ( i=0; i<30; i++ )

View File

@ -70,7 +70,7 @@ void ColorMod( colorMod_t *cm, int numVerts, bspDrawVert_t *drawVerts ){
VectorSet( mult, 1.0f, 1.0f, 1.0f ); VectorSet( mult, 1.0f, 1.0f, 1.0f );
mult[ 3 ] = 1.0f; mult[ 3 ] = 1.0f;
VectorSet( add, 0.0f, 0.0f, 0.0f ); VectorSet( add, 0.0f, 0.0f, 0.0f );
mult[ 3 ] = 0.0f; add[ 3 ] = 0.0f;
/* switch on type */ /* switch on type */
switch ( cm2->type ) switch ( cm2->type )