/* ================== CM_FindPlane ================== */ static int CM_FindPlane( const float *p1, const float *p2, const float *p3 ) { float plane[4]; int dummy; if( !CM_PlaneFromPoints( plane, p1, p2, p3 )) return -1; return CM_FindPlane2( plane, &dummy ); }
/* ================== CM_FindPlane ================== */ static int CM_FindPlane(const float *p1, const float *p2, const float *p3) { float plane[4]; int i; if(!CM_PlaneFromPoints(plane, p1, p2, p3)) { return -1; } // use variable i as dummy return CM_FindPlane2(plane, &i); }
void CM_AddFacetBevels( facet_t *facet ) { int i, j, k, l; int axis, dir, order, flipped; float plane[4], d, newplane[4]; winding_t *w, *w2; vec3_t mins, maxs, vec, vec2; #ifndef ADDBEVELS return; #endif Vector4Copy( planes[ facet->surfacePlane ].plane, plane ); w = BaseWindingForPlane( plane, plane[3] ); for ( j = 0 ; j < facet->numBorders && w ; j++ ) { if ( facet->borderPlanes[j] == facet->surfacePlane ) { continue; } Vector4Copy( planes[ facet->borderPlanes[j] ].plane, plane ); if ( !facet->borderInward[j] ) { VectorSubtract( vec3_origin, plane, plane ); plane[3] = -plane[3]; } ChopWindingInPlace( &w, plane, plane[3], 0.1f ); } if ( !w ) { return; } WindingBounds( w, mins, maxs ); // add the axial planes order = 0; for ( axis = 0 ; axis < 3 ; axis++ ) { for ( dir = -1 ; dir <= 1 ; dir += 2, order++ ) { VectorClear( plane ); plane[axis] = dir; if ( dir == 1 ) { plane[3] = maxs[axis]; } else { plane[3] = -mins[axis]; } //if it's the surface plane if ( CM_PlaneEqual( &planes[facet->surfacePlane], plane, &flipped ) ) { continue; } // see if the plane is allready present for ( i = 0 ; i < facet->numBorders ; i++ ) { if ( CM_PlaneEqual( &planes[facet->borderPlanes[i]], plane, &flipped ) ) { break; } } if ( i == facet->numBorders ) { if ( facet->numBorders > 4 + 6 + 16 ) { Com_Printf( "ERROR: too many bevels\n" ); } facet->borderPlanes[facet->numBorders] = CM_FindPlane2( plane, &flipped ); facet->borderNoAdjust[facet->numBorders] = 0; facet->borderInward[facet->numBorders] = flipped; facet->numBorders++; } } } // // add the edge bevels // // test the non-axial plane edges for ( j = 0 ; j < w->numpoints ; j++ ) { k = ( j + 1 ) % w->numpoints; VectorSubtract( w->p[j], w->p[k], vec ); //if it's a degenerate edge if ( VectorNormalize( vec ) < 0.5 ) { continue; } CM_SnapVector( vec ); for ( k = 0; k < 3 ; k++ ) if ( vec[k] == -1 || vec[k] == 1 ) { break; } // axial if ( k < 3 ) { continue; // only test non-axial edges } // try the six possible slanted axials from this edge for ( axis = 0 ; axis < 3 ; axis++ ) { for ( dir = -1 ; dir <= 1 ; dir += 2 ) { // construct a plane VectorClear( vec2 ); vec2[axis] = dir; CrossProduct( vec, vec2, plane ); if ( VectorNormalize( plane ) < 0.5 ) { continue; } plane[3] = DotProduct( w->p[j], plane ); // if all the points of the facet winding are // behind this plane, it is a proper edge bevel for ( l = 0 ; l < w->numpoints ; l++ ) { d = DotProduct( w->p[l], plane ) - plane[3]; if ( d > 0.1 ) { break; // point in front } } if ( l < w->numpoints ) { continue; } //if it's the surface plane if ( CM_PlaneEqual( &planes[facet->surfacePlane], plane, &flipped ) ) { continue; } // see if the plane is allready present for ( i = 0 ; i < facet->numBorders ; i++ ) { if ( CM_PlaneEqual( &planes[facet->borderPlanes[i]], plane, &flipped ) ) { break; } } if ( i == facet->numBorders ) { if ( facet->numBorders > 4 + 6 + 16 ) { Com_Printf( "ERROR: too many bevels\n" ); } facet->borderPlanes[facet->numBorders] = CM_FindPlane2( plane, &flipped ); for ( k = 0 ; k < facet->numBorders ; k++ ) { if ( facet->borderPlanes[facet->numBorders] == facet->borderPlanes[k] ) { Com_Printf( "WARNING: bevel plane already used\n" ); } } facet->borderNoAdjust[facet->numBorders] = 0; facet->borderInward[facet->numBorders] = flipped; // w2 = CopyWinding( w ); Vector4Copy( planes[facet->borderPlanes[facet->numBorders]].plane, newplane ); if ( !facet->borderInward[facet->numBorders] ) { VectorNegate( newplane, newplane ); newplane[3] = -newplane[3]; } //end if ChopWindingInPlace( &w2, newplane, newplane[3], 0.1f ); if ( !w2 ) { // TTimo - can't stand this, useless and noisy //Com_DPrintf("WARNING: CM_AddFacetBevels... invalid bevel\n"); continue; } else { FreeWinding( w2 ); } // facet->numBorders++; //already got a bevel // break; } } } } FreeWinding( w ); #ifndef BSPC //add opposite plane facet->borderPlanes[facet->numBorders] = facet->surfacePlane; facet->borderNoAdjust[facet->numBorders] = 0; facet->borderInward[facet->numBorders] = qtrue; facet->numBorders++; #endif //BSPC }
/* ================== CM_AddFacetBevels ================== */ void CM_AddFacetBevels( facet_t *facet ) { int i, j, k, l; int axis, dir, order, flipped; planeDef_t plane,newplane; bfixed d; winding_t *w, *w2; bvec3_t mins, maxs; avec3_t vec, vec2; plane=planes[ facet->surfacePlane ].pd; w = BaseWindingForPlane( plane.normal, plane.dist ); for ( j = 0 ; j < facet->numBorders && w ; j++ ) { if (facet->borderPlanes[j] == facet->surfacePlane) continue; plane=planes[ facet->borderPlanes[j] ].pd; if ( !facet->borderInward[j] ) { VectorSubtract( avec3_origin, plane.normal, plane.normal ); plane.dist = -plane.dist; } ChopWindingInPlace( &w, plane.normal, plane.dist, BFIXED(0,1) ); } if ( !w ) { return; } WindingBounds(w, mins, maxs); // add the axial planes order = 0; for ( axis = 0 ; axis < 3 ; axis++ ) { for ( dir = -1 ; dir <= 1 ; dir += 2, order++ ) { VectorClear(plane.normal); plane.normal[axis] = MAKE_AFIXED(dir); if (dir == 1) { plane.dist = maxs[axis]; } else { plane.dist = -mins[axis]; } //if it's the surface plane if (CM_PlaneEqual(&planes[facet->surfacePlane], plane, &flipped)) { continue; } // see if the plane is allready present for ( i = 0 ; i < facet->numBorders ; i++ ) { if (CM_PlaneEqual(&planes[facet->borderPlanes[i]], plane, &flipped)) break; } if ( i == facet->numBorders ) { if (facet->numBorders > 4 + 6 + 16) Com_Printf("ERROR: too many bevels\n"); facet->borderPlanes[facet->numBorders] = CM_FindPlane2(plane, &flipped); facet->borderNoAdjust[facet->numBorders] = 0; facet->borderInward[facet->numBorders] = flipped; facet->numBorders++; } } } // // add the edge bevels // // test the non-axial plane edges for ( j = 0 ; j < w->numpoints ; j++ ) { k = (j+1)%w->numpoints; bvec3_t tmp; VectorSubtract (w->p[j], w->p[k], tmp); //if it's a degenerate edge if (VectorNormalizeB2A(tmp,vec) < BFIXED(0,5)) continue; CM_SnapVector(vec); for ( k = 0; k < 3 ; k++ ) if ( vec[k] == -AFIXED_1 || vec[k] == AFIXED_1 ) break; // axial if ( k < 3 ) continue; // only test non-axial edges // try the six possible slanted axials from this edge for ( axis = 0 ; axis < 3 ; axis++ ) { for ( dir = -1 ; dir <= 1 ; dir += 2 ) { // construct a plane VectorClear (vec2); vec2[axis] = MAKE_AFIXED(dir); CrossProduct (vec, vec2, plane.normal); if (VectorNormalize(plane.normal) < AFIXED(0,5)) continue; plane.dist = FIXED_VEC3DOT (w->p[j], plane.normal); // if all the points of the facet winding are // behind this plane, it is a proper edge bevel for ( l = 0 ; l < w->numpoints ; l++ ) { d = FIXED_VEC3DOT(w->p[l], plane.normal) - plane.dist; if (d > BFIXED(0,1)) break; // point in front } if ( l < w->numpoints ) continue; //if it's the surface plane if (CM_PlaneEqual(&planes[facet->surfacePlane], plane, &flipped)) { continue; } // see if the plane is allready present for ( i = 0 ; i < facet->numBorders ; i++ ) { if (CM_PlaneEqual(&planes[facet->borderPlanes[i]], plane, &flipped)) { break; } } if ( i == facet->numBorders ) { if (facet->numBorders > 4 + 6 + 16) Com_Printf("ERROR: too many bevels\n"); facet->borderPlanes[facet->numBorders] = CM_FindPlane2(plane, &flipped); for ( k = 0 ; k < facet->numBorders ; k++ ) { if (facet->borderPlanes[facet->numBorders] == facet->borderPlanes[k]) Com_Printf("WARNING: bevel plane already used\n"); } facet->borderNoAdjust[facet->numBorders] = 0; facet->borderInward[facet->numBorders] = flipped; // w2 = CopyWinding(w); newplane=planes[facet->borderPlanes[facet->numBorders]].pd; if (!facet->borderInward[facet->numBorders]) { VectorNegate(newplane.normal, newplane.normal); newplane.dist = -newplane.dist; } //end if ChopWindingInPlace( &w2, newplane.normal, newplane.dist, BFIXED(0,1) ); if (!w2) { Com_DPrintf("WARNING: CM_AddFacetBevels... invalid bevel\n"); continue; } else { FreeWinding(w2); } // facet->numBorders++; //already got a bevel // break; } } } } FreeWinding( w ); #ifndef BSPC //add opposite plane facet->borderPlanes[facet->numBorders] = facet->surfacePlane; facet->borderNoAdjust[facet->numBorders] = 0; facet->borderInward[facet->numBorders] = qtrue; facet->numBorders++; #endif //BSPC }
/* ================== CM_AddFacetBevels ================== */ static void CM_AddFacetBevels( cfacet_t *facet ) { int i, j, k, l; int axis, dir, order, flipped; float plane[4], d, newplane[4]; vec3_t mins, maxs, vec, vec2; cwinding_t *w, *w2; Vector4Copy( planes[facet->surfacePlane].plane, plane ); w = CM_BaseWindingForPlane( plane, plane[3] ); for( j = 0; j < facet->numBorders && w; j++ ) { if( facet->borderPlanes[j] == facet->surfacePlane ) continue; Vector4Copy( planes[facet->borderPlanes[j]].plane, plane ); if( !facet->borderInward[j] ) { VectorNegate( plane, plane ); plane[3] = -plane[3]; } CM_ChopWindingInPlace( &w, plane, plane[3], ON_EPSILON ); } if( !w ) return; CM_WindingBounds( w, mins, maxs ); // // add the axial planes // order = 0; for( axis = 0; axis < 3; axis++ ) { for( dir = -1; dir <= 1; dir += 2, order++ ) { VectorClear( plane ); plane[axis] = dir; if( dir == 1 ) plane[3] = maxs[axis]; else plane[3] = -mins[axis]; // if it's the surface plane if( CM_PlaneEqual( &planes[facet->surfacePlane], plane, &flipped )) continue; // see if the plane is allready present for( i = 0; i < facet->numBorders; i++ ) { if( CM_PlaneEqual( &planes[facet->borderPlanes[i]], plane, &flipped )) break; } if( i == facet->numBorders ) { if( facet->numBorders > MAX_FACET_BEVELS ) MsgDev( D_ERROR, "CM_AddFacetBevels: too many bevels\n" ); facet->borderPlanes[facet->numBorders] = CM_FindPlane2(plane, &flipped); facet->borderNoAdjust[facet->numBorders] = 0; facet->borderInward[facet->numBorders] = flipped; facet->numBorders++; } } } // // add the edge bevels // // test the non-axial plane edges for( j = 0; j < w->numpoints; j++ ) { k = (j + 1) % w->numpoints; VectorSubtract( w->p[j], w->p[k], vec ); // if it's a degenerate edge if( VectorNormalizeLength( vec ) < 0.5f ) continue; CM_SnapVector( vec ); for( k = 0; k < 3; k++ ) { if( vec[k] == -1 || vec[k] == 1 ) break; // axial } if( k < 3 ) continue; // only test non-axial edges // try the six possible slanted axials from this edge for( axis = 0; axis < 3; axis++ ) { for( dir = -1; dir <= 1; dir += 2 ) { // construct a plane VectorClear( vec2 ); vec2[axis] = dir; CrossProduct( vec, vec2, plane ); if( VectorNormalizeLength( plane ) < 0.5f ) continue; plane[3] = DotProduct( w->p[j], plane ); // if all the points of the facet winding are // behind this plane, it is a proper edge bevel for( l = 0; l < w->numpoints; l++ ) { d = DotProduct( w->p[l], plane ) - plane[3]; if( d > ON_EPSILON ) break; // point in front } if( l < w->numpoints ) continue; // if it's the surface plane if( CM_PlaneEqual( &planes[facet->surfacePlane], plane, &flipped )) continue; // see if the plane is allready present for( i = 0; i < facet->numBorders; i++ ) { if( CM_PlaneEqual( &planes[facet->borderPlanes[i]], plane, &flipped )) break; } if( i == facet->numBorders ) { if( facet->numBorders > MAX_FACET_BEVELS ) MsgDev( D_ERROR, "CM_AddFacetBevels: too many bevels\n" ); facet->borderPlanes[facet->numBorders] = CM_FindPlane2( plane, &flipped ); for( k = 0; k < facet->numBorders; k++ ) { if( facet->borderPlanes[facet->numBorders] == facet->borderPlanes[k] ) MsgDev( D_WARN, "CM_AddFacetBevels: bevel plane already used\n" ); } facet->borderNoAdjust[facet->numBorders] = 0; facet->borderInward[facet->numBorders] = flipped; w2 = CM_CopyWinding( w ); Vector4Copy( planes[facet->borderPlanes[facet->numBorders]].plane, newplane ); if( !facet->borderInward[facet->numBorders] ) { VectorNegate( newplane, newplane ); newplane[3] = -newplane[3]; } CM_ChopWindingInPlace( &w2, newplane, newplane[3], ON_EPSILON ); if( !w2 ) { cm.numInvalidBevels++; continue; } else CM_FreeWinding( w2 ); facet->numBorders++; // already got a bevel } } } } CM_FreeWinding( w ); // add opposite plane facet->borderPlanes[facet->numBorders] = facet->surfacePlane; facet->borderNoAdjust[facet->numBorders] = 0; facet->borderInward[facet->numBorders] = true; facet->numBorders++; }
/** * @brief CM_AddFacetBevels * @param[in,out] facet */ void CM_AddFacetBevels(facet_t *facet) { int i, j, k, l; int axis, dir, flipped; float plane[4], d, minBack, newplane[4]; winding_t *w, *w2; vec3_t mins, maxs, vec, vec2; #ifndef ADDBEVELS return; #endif Vector4Copy(planes[facet->surfacePlane].plane, plane); w = BaseWindingForPlane(plane, plane[3]); for (j = 0 ; j < facet->numBorders && w ; j++) { if (facet->borderPlanes[j] == facet->surfacePlane) { continue; } Vector4Copy(planes[facet->borderPlanes[j]].plane, plane); if (!facet->borderInward[j]) { VectorSubtract(vec3_origin, plane, plane); plane[3] = -plane[3]; } ChopWindingInPlace(&w, plane, plane[3], 0.1f); } if (!w) { return; } WindingBounds(w, mins, maxs); // add the axial planes for (axis = 0; axis < 3; axis++) { for (dir = -1; dir <= 1; dir += 2) { VectorClear(plane); plane[axis] = dir; if (dir == 1) { plane[3] = maxs[axis]; } else { plane[3] = -mins[axis]; } // if it's the surface plane if (CM_PlaneEqual(&planes[facet->surfacePlane], plane, &flipped)) { continue; } // see if the plane is already present for (i = 0; i < facet->numBorders; i++) { if (CM_PlaneEqual(&planes[facet->borderPlanes[i]], plane, &flipped)) { break; } } if (i == facet->numBorders) { if (facet->numBorders >= 4 + 6 + 16) { Com_Printf("CM_AddFacetBevels: ERROR - too many bevels\n"); continue; } facet->borderPlanes[facet->numBorders] = CM_FindPlane2(plane, &flipped); facet->borderNoAdjust[facet->numBorders] = 0; facet->borderInward[facet->numBorders] = flipped; facet->numBorders++; } } } // add the edge bevels // test the non-axial plane edges for (j = 0; j < w->numpoints; j++) { k = (j + 1) % w->numpoints; VectorSubtract(w->p[j], w->p[k], vec); // if it's a degenerate edge if (vec3_norm(vec) < 0.5f) { continue; } CM_SnapVector(vec); for (k = 0; k < 3; k++) { if (vec[k] == -1.0f || vec[k] == 1.0f || (vec[k] == 0.0f && vec[(k + 1) % 3] == 0.0f)) { break; // axial } } if (k < 3) { continue; // only test non-axial edges } // try the six possible slanted axials from this edge for (axis = 0 ; axis < 3 ; axis++) { for (dir = -1 ; dir <= 1 ; dir += 2) { // construct a plane VectorClear(vec2); vec2[axis] = dir; vec3_cross(vec, vec2, plane); if (vec3_norm(plane) < 0.5f) { continue; } plane[3] = DotProduct(w->p[j], plane); // if all the points of the facet winding are // behind this plane, it is a proper edge bevel minBack = 0.0f; for (l = 0; l < w->numpoints; l++) { d = DotProduct(w->p[l], plane) - plane[3]; if (d > 0.1f) { break; // point in front } if (d < minBack) { minBack = d; } } // if some point was at the front if (l < w->numpoints) { continue; } // if no points at the back then the winding is on the bevel plane if (minBack > -0.1f) { break; } // if it's the surface plane if (CM_PlaneEqual(&planes[facet->surfacePlane], plane, &flipped)) { continue; } // see if the plane is already present for (i = 0; i < facet->numBorders; i++) { if (CM_PlaneEqual(&planes[facet->borderPlanes[i]], plane, &flipped)) { break; } } if (i == facet->numBorders) { if (facet->numBorders >= 4 + 6 + 16) { Com_Printf("CM_AddFacetBevels: ERROR - too many bevels\n"); continue; } facet->borderPlanes[facet->numBorders] = CM_FindPlane2(plane, &flipped); for (k = 0; k < facet->numBorders; k++) { if (facet->borderPlanes[facet->numBorders] == facet->borderPlanes[k]) { Com_Printf("CM_AddFacetBevels: WARNING - bevel plane already used\n"); } } facet->borderNoAdjust[facet->numBorders] = 0; facet->borderInward[facet->numBorders] = flipped; // w2 = CopyWinding(w); Vector4Copy(planes[facet->borderPlanes[facet->numBorders]].plane, newplane); if (!facet->borderInward[facet->numBorders]) { VectorNegate(newplane, newplane); newplane[3] = -newplane[3]; } ChopWindingInPlace(&w2, newplane, newplane[3], 0.1f); if (!w2) { // any map load spams with this error .. don't print it anymore //Com_DPrintf("WARNING: CM_AddFacetBevels... invalid bevel\n"); continue; } else { FreeWinding(w2); } facet->numBorders++; // already got a bevel //break; } } } } FreeWinding(w); // add opposite plane if (facet->numBorders >= 4 + 6 + 16) { Com_Printf("CM_AddFacetBevels: ERROR - too many bevels at end\n"); return; } facet->borderPlanes[facet->numBorders] = facet->surfacePlane; facet->borderNoAdjust[facet->numBorders] = 0; facet->borderInward[facet->numBorders] = qtrue; facet->numBorders++; }