本文整理汇总了C++中AddPointToBounds函数的典型用法代码示例。如果您正苦于以下问题:C++ AddPointToBounds函数的具体用法?C++ AddPointToBounds怎么用?C++ AddPointToBounds使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了AddPointToBounds函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: R_LoadMDM
//.........这里部分代码省略.........
}
// find the next surface
mdmSurf = ( mdmSurface_t * )(( byte * ) mdmSurf + mdmSurf->ofsEnd);
}
// loading is done now calculate the bounding box and tangent spaces
ClearBounds(mdmModel->bounds[0], mdmModel->bounds[1]);
for (i = 0, surf = mdmModel->surfaces; i < mdmModel->numSurfaces; i++, surf++)
{
for (j = 0, v = surf->verts; j < surf->numVerts; j++, v++)
{
vec3_t tmpVert;
md5Weight_t *w;
VectorClear(tmpVert);
for (k = 0, w = v->weights[0]; k < v->numWeights; k++, w++)
{
//vec3_t offsetVec;
//VectorClear(offsetVec);
//bone = &md5->bones[w->boneIndex];
//QuatTransformVector(bone->rotation, w->offset, offsetVec);
//VectorAdd(bone->origin, offsetVec, offsetVec);
VectorMA(tmpVert, w->boneWeight, w->offset, tmpVert);
}
VectorCopy(tmpVert, v->position);
AddPointToBounds(tmpVert, mdmModel->bounds[0], mdmModel->bounds[1]);
}
// calc tangent spaces
#if 0
{
const float *v0, *v1, *v2;
const float *t0, *t1, *t2;
vec3_t tangent;
vec3_t binormal;
vec3_t normal;
for (j = 0, v = surf->verts; j < surf->numVerts; j++, v++)
{
VectorClear(v->tangent);
VectorClear(v->binormal);
VectorClear(v->normal);
}
for (j = 0, tri = surf->triangles; j < surf->numTriangles; j++, tri++)
{
v0 = surf->verts[tri->indexes[0]].position;
v1 = surf->verts[tri->indexes[1]].position;
v2 = surf->verts[tri->indexes[2]].position;
t0 = surf->verts[tri->indexes[0]].texCoords;
t1 = surf->verts[tri->indexes[1]].texCoords;
t2 = surf->verts[tri->indexes[2]].texCoords;
#if 1
R_CalcTangentSpace(tangent, binormal, normal, v0, v1, v2, t0, t1, t2);
#else
R_CalcNormalForTriangle(normal, v0, v1, v2);
示例2: FogDrawSurfaces
void FogDrawSurfaces(entity_t * e)
{
int i, j, k, fogNum;
fog_t *fog;
mapDrawSurface_t *ds;
vec3_t mins, maxs;
int fogged, numFogged;
int numBaseDrawSurfs;
/* note it */
Sys_FPrintf(SYS_VRB, "----- FogDrawSurfs -----\n");
/* reset counters */
numFogged = 0;
numFogFragments = 0;
/* walk fog list */
for(fogNum = 0; fogNum < numMapFogs; fogNum++)
{
/* get fog */
fog = &mapFogs[fogNum];
/* clip each surface into this, but don't clip any of the resulting fragments to the same brush */
numBaseDrawSurfs = numMapDrawSurfs;
for(i = 0; i < numBaseDrawSurfs; i++)
{
/* get the drawsurface */
ds = &mapDrawSurfs[i];
/* no fog? */
if(ds->shaderInfo->noFog)
continue;
/* global fog doesn't have a brush */
if(fog->brush == NULL)
{
/* don't re-fog already fogged surfaces */
if(ds->fogNum >= 0)
continue;
fogged = 1;
}
else
{
/* find drawsurface bounds */
ClearBounds(mins, maxs);
for(j = 0; j < ds->numVerts; j++)
AddPointToBounds(ds->verts[j].xyz, mins, maxs);
/* check against the fog brush */
for(k = 0; k < 3; k++)
{
if(mins[k] > fog->brush->maxs[k])
break;
if(maxs[k] < fog->brush->mins[k])
break;
}
/* no intersection? */
if(k < 3)
continue;
/* ydnar: gs mods: handle the various types of surfaces */
switch (ds->type)
{
/* handle brush faces */
case SURFACE_FACE:
fogged = ChopFaceSurfaceByBrush(e, ds, fog->brush);
break;
/* handle patches */
case SURFACE_PATCH:
fogged = ChopPatchSurfaceByBrush(e, ds, fog->brush);
break;
/* handle triangle surfaces (fixme: split triangle surfaces) */
case SURFACE_TRIANGLES:
case SURFACE_FORCED_META:
case SURFACE_META:
fogged = 1;
break;
/* no fogging */
default:
fogged = 0;
break;
}
}
/* is this surface fogged? */
if(fogged)
{
numFogged += fogged;
ds->fogNum = fogNum;
}
}
}
/* emit some statistics */
Sys_FPrintf(SYS_VRB, "%9d fog polygon fragments\n", numFogFragments);
//.........这里部分代码省略.........
示例3: ExpandBrush
/*
============
ExpandBrush
=============
*/
void ExpandBrush (int hullnum)
{
int i, x, s;
vec3_t corner;
winding_t *w;
plane_t plane;
int j, k, numwindings;
vec_t r;
winding_t **windings;
plane_t clipplane, faceplane;
mface_t *mf;
vec3_t point;
vec3_t mins, maxs;
if (!numbrushfaces)
return;
num_hull_points = 0;
num_hull_edges = 0;
ClearBounds( mins, maxs );
// generate windings and bounds data
numwindings = 0;
windings = calloc(numbrushfaces, sizeof(*windings));
for (i = 0;i < numbrushfaces;i++)
{
mf = &faces[i];
windings[i] = NULL;
faceplane = mf->plane;
w = BaseWindingForPlane (&faceplane);
for (j = 0;j < numbrushfaces && w;j++)
{
clipplane = faces[j].plane;
if( j == i )
continue;
// flip the plane, because we want to keep the back side
VectorNegate(clipplane.normal, clipplane.normal);
clipplane.dist *= -1;
w = ClipWindingEpsilon (w, &clipplane, ON_EPSILON, true);
}
if (!w)
continue; // overcontrained plane
for (j = 0;j < w->numpoints;j++)
{
for (k = 0;k < 3;k++)
{
point[k] = w->points[j][k];
r = Q_rint( point[k] );
if ( fabs( point[k] - r ) < ZERO_EPSILON)
w->points[j][k] = r;
else
w->points[j][k] = point[k];
// check for incomplete brushes
if( w->points[j][k] >= BOGUS_RANGE || w->points[j][k] <= -BOGUS_RANGE )
return;
}
AddPointToBounds( w->points[j], mins, maxs );
}
windings[i] = w;
}
// add all of the corner offsets
for (i = 0;i < numwindings;i++)
{
w = windings[i];
for (j = 0;j < w->numpoints;j++)
AddHullPoint(w->points[j], hullnum);
}
// expand the face planes
for (i = 0;i < numbrushfaces;i++)
{
mf = &faces[i];
for (x=0 ; x<3 ; x++)
{
if (mf->plane.normal[x] > 0)
corner[x] = -hullinfo.hullsizes[hullnum][0][x];
else if (mf->plane.normal[x] < 0)
corner[x] = -hullinfo.hullsizes[hullnum][1][x];
}
mf->plane.dist += DotProduct (corner, mf->plane.normal);
}
// add any axis planes not contained in the brush to bevel off corners
//.........这里部分代码省略.........
示例4: R_MarkFragments
/*
=================
R_MarkFragments
=================
*/
int R_MarkFragments( int numPoints, const vec3_t *points, const vec3_t projection,
int maxPoints, vec3_t pointBuffer, int maxFragments, markFragment_t *fragmentBuffer )
{
int numsurfaces, numPlanes;
int i, j, k, m, n;
surfaceType_t *surfaces[ 64 ];
vec3_t mins, maxs;
int returnedFragments;
int returnedPoints;
vec3_t normals[ MAX_VERTS_ON_POLY + 2 ];
float dists[ MAX_VERTS_ON_POLY + 2 ];
vec3_t clipPoints[ 2 ][ MAX_VERTS_ON_POLY ];
int numClipPoints;
float *v;
srfSurfaceFace_t *face;
srfGridMesh_t *cv;
srfTriangles_t *trisurf;
srfVert_t *dv;
srfTriangle_t *tri;
vec3_t normal;
vec3_t projectionDir;
vec3_t v1, v2;
//increment view count for double check prevention
tr.viewCountNoReset++;
//
VectorNormalize2( projection, projectionDir );
// find all the brushes that are to be considered
ClearBounds( mins, maxs );
for ( i = 0; i < numPoints; i++ )
{
vec3_t temp;
AddPointToBounds( points[ i ], mins, maxs );
VectorAdd( points[ i ], projection, temp );
AddPointToBounds( temp, mins, maxs );
// make sure we get all the leafs (also the one(s) in front of the hit surface)
VectorMA( points[ i ], -20, projectionDir, temp );
AddPointToBounds( temp, mins, maxs );
}
if ( numPoints > MAX_VERTS_ON_POLY )
{
numPoints = MAX_VERTS_ON_POLY;
}
// create the bounding planes for the to be projected polygon
for ( i = 0; i < numPoints; i++ )
{
VectorSubtract( points[( i + 1 ) % numPoints ], points[ i ], v1 );
VectorAdd( points[ i ], projection, v2 );
VectorSubtract( points[ i ], v2, v2 );
CrossProduct( v1, v2, normals[ i ] );
VectorNormalizeFast( normals[ i ] );
dists[ i ] = DotProduct( normals[ i ], points[ i ] );
}
// add near and far clipping planes for projection
VectorCopy( projectionDir, normals[ numPoints ] );
dists[ numPoints ] = DotProduct( normals[ numPoints ], points[ 0 ] ) - 32;
VectorCopy( projectionDir, normals[ numPoints + 1 ] );
VectorInverse( normals[ numPoints + 1 ] );
dists[ numPoints + 1 ] = DotProduct( normals[ numPoints + 1 ], points[ 0 ] ) - 20;
numPlanes = numPoints + 2;
numsurfaces = 0;
R_BoxSurfaces_r( tr.world->nodes, mins, maxs, surfaces, 64, &numsurfaces, projectionDir );
returnedPoints = 0;
returnedFragments = 0;
for ( i = 0; i < numsurfaces; i++ )
{
if ( *surfaces[ i ] == SF_GRID )
{
cv = ( srfGridMesh_t * ) surfaces[ i ];
for ( m = 0; m < cv->height - 1; m++ )
{
for ( n = 0; n < cv->width - 1; n++ )
{
// We triangulate the grid and chop all triangles within
// the bounding planes of the to be projected polygon.
// LOD is not taken into account, not such a big deal though.
//
// It's probably much nicer to chop the grid itself and deal
// with this chopped grid as an SF_GRID surface, so LOD will
// be applied. However the LOD of that chopped grid must
// be synced with the LOD of the original curve.
// One way to do this; the chopped grid shares vertices with
// the original curve. When LOD is applied to the original
// curve the unused vertices are flagged. Now the chopped curve
//.........这里部分代码省略.........
示例5: AAS_StoreArea
//===========================================================================
//
// Parameter: -
// Returns: -
// Changes Globals: -
//===========================================================================
int AAS_StoreArea( tmp_area_t *tmparea ) {
int side, edgenum, i;
plane_t *plane;
tmp_face_t *tmpface;
aas_area_t *aasarea;
aas_edge_t *edge;
aas_face_t *aasface;
aas_faceindex_t aasfacenum;
vec3_t facecenter;
winding_t *w;
//when the area is merged go to the merged area
//FIXME: this isn't necessary anymore because the tree
// is refreshed after area merging
while ( tmparea->mergedarea ) tmparea = tmparea->mergedarea;
//
if ( tmparea->invalid ) {
Error( "AAS_StoreArea: tried to store invalid area" );
}
//if there is an aas area already stored for this tmp area
if ( tmparea->aasareanum ) {
return -tmparea->aasareanum;
}
//
if ( ( *aasworld ).numareas >= max_aas.max_areas ) {
Error( "AAS_MAX_AREAS = %d", max_aas.max_areas );
} //end if
//area zero is a dummy
if ( ( *aasworld ).numareas == 0 ) {
( *aasworld ).numareas = 1;
}
//create an area from this leaf
aasarea = &( *aasworld ).areas[( *aasworld ).numareas];
aasarea->areanum = ( *aasworld ).numareas;
aasarea->numfaces = 0;
aasarea->firstface = ( *aasworld ).faceindexsize;
ClearBounds( aasarea->mins, aasarea->maxs );
VectorClear( aasarea->center );
//
// Log_Write("tmparea %d became aasarea %d\r\n", tmparea->areanum, aasarea->areanum);
//store the aas area number at the tmp area
tmparea->aasareanum = aasarea->areanum;
//
for ( tmpface = tmparea->tmpfaces; tmpface; tmpface = tmpface->next[side] )
{
side = tmpface->frontarea != tmparea;
//if there's an aas face created for the tmp face already
if ( tmpface->aasfacenum ) {
//we're at the back of the face so use a negative index
aasfacenum = -tmpface->aasfacenum;
#ifdef DEBUG
if ( tmpface->aasfacenum < 0 || tmpface->aasfacenum > max_aas.max_faces ) {
Error( "AAS_CreateTree_r: face number out of range" );
} //end if
#endif //DEBUG
aasface = &( *aasworld ).faces[tmpface->aasfacenum];
aasface->backarea = aasarea->areanum;
} //end if
else
{
plane = &mapplanes[tmpface->planenum ^ side];
if ( side ) {
w = tmpface->winding;
tmpface->winding = ReverseWinding( tmpface->winding );
} //end if
if ( !AAS_GetFace( tmpface->winding, plane, 0, &aasfacenum ) ) {
continue;
}
if ( side ) {
FreeWinding( tmpface->winding );
tmpface->winding = w;
} //end if
aasface = &( *aasworld ).faces[aasfacenum];
aasface->frontarea = aasarea->areanum;
aasface->backarea = 0;
aasface->faceflags = tmpface->faceflags;
//set the face number at the tmp face
tmpface->aasfacenum = aasfacenum;
} //end else
//add face points to the area bounds and
//calculate the face 'center'
VectorClear( facecenter );
for ( edgenum = 0; edgenum < aasface->numedges; edgenum++ )
{
edge = &( *aasworld ).edges[abs( ( *aasworld ).edgeindex[aasface->firstedge + edgenum] )];
for ( i = 0; i < 2; i++ )
{
AddPointToBounds( ( *aasworld ).vertexes[edge->v[i]], aasarea->mins, aasarea->maxs );
VectorAdd( ( *aasworld ).vertexes[edge->v[i]], facecenter, facecenter );
} //end for
} //end for
VectorScale( facecenter, 1.0 / ( aasface->numedges * 2.0 ), facecenter );
//add the face 'center' to the area 'center'
VectorAdd( aasarea->center, facecenter, aasarea->center );
//.........这里部分代码省略.........
示例6: R_LoadMD5
//.........这里部分代码省略.........
for (k = 0; k < v->numWeights; k++)
{
v->weights[k] = surf->weights + (v->firstWeight + k);
}
}
}
// loading is done now calculate the bounding box and tangent spaces
ClearBounds(md5->bounds[0], md5->bounds[1]);
for (i = 0, surf = md5->surfaces; i < md5->numSurfaces; i++, surf++)
{
for (j = 0, v = surf->verts; j < surf->numVerts; j++, v++)
{
vec3_t tmpVert;
md5Weight_t *w;
VectorClear(tmpVert);
for (k = 0, w = v->weights[0]; k < v->numWeights; k++, w++)
{
vec3_t offsetVec;
bone = &md5->bones[w->boneIndex];
QuatTransformVector(bone->rotation, w->offset, offsetVec);
VectorAdd(bone->origin, offsetVec, offsetVec);
VectorMA(tmpVert, w->boneWeight, offsetVec, tmpVert);
}
VectorCopy(tmpVert, v->position);
AddPointToBounds(tmpVert, md5->bounds[0], md5->bounds[1]);
}
// calc tangent spaces
#if 1
{
const float *v0, *v1, *v2;
const float *t0, *t1, *t2;
vec3_t tangent;
vec3_t binormal;
vec3_t normal;
for (j = 0, v = surf->verts; j < surf->numVerts; j++, v++)
{
VectorClear(v->tangent);
VectorClear(v->binormal);
VectorClear(v->normal);
}
for (j = 0, tri = surf->triangles; j < surf->numTriangles; j++, tri++)
{
v0 = surf->verts[tri->indexes[0]].position;
v1 = surf->verts[tri->indexes[1]].position;
v2 = surf->verts[tri->indexes[2]].position;
t0 = surf->verts[tri->indexes[0]].texCoords;
t1 = surf->verts[tri->indexes[1]].texCoords;
t2 = surf->verts[tri->indexes[2]].texCoords;
#if 1
R_CalcTangentSpace(tangent, binormal, normal, v0, v1, v2, t0, t1, t2);
#else
R_CalcNormalForTriangle(normal, v0, v1, v2);
示例7: BuildST
/*
============
BuildST
Builds the triangle_st array for the base frame and
model.skinwidth / model.skinheight
FIXME: allow this to be loaded from a file for
arbitrary mappings
============
*/
void BuildST (triangle_t *ptri, int numtri)
{
int i, j;
int width, height, iwidth, iheight, swidth;
float basex, basey;
float s_scale, t_scale;
float scale;
vec3_t mins, maxs;
float *pbasevert;
vec3_t vtemp1, vtemp2, normal;
//
// find bounds of all the verts on the base frame
//
ClearBounds (mins, maxs);
for (i=0 ; i<numtri ; i++)
for (j=0 ; j<3 ; j++)
AddPointToBounds (ptri[i].verts[j], mins, maxs);
for (i=0 ; i<3 ; i++)
{
mins[i] = floor(mins[i]);
maxs[i] = ceil(maxs[i]);
}
width = maxs[0] - mins[0];
height = maxs[2] - mins[2];
if (!g_fixedwidth)
{ // old style
scale = 8;
if (width*scale >= 150)
scale = 150.0 / width;
if (height*scale >= 190)
scale = 190.0 / height;
s_scale = t_scale = scale;
iwidth = ceil(width*s_scale);
iheight = ceil(height*t_scale);
iwidth += 4;
iheight += 4;
}
else
{ // new style
iwidth = g_fixedwidth / 2;
iheight = g_fixedheight;
s_scale = (float)(iwidth-4) / width;
t_scale = (float)(iheight-4) / height;
}
//
// determine which side of each triangle to map the texture to
//
for (i=0 ; i<numtri ; i++)
{
VectorSubtract (ptri[i].verts[0], ptri[i].verts[1], vtemp1);
VectorSubtract (ptri[i].verts[2], ptri[i].verts[1], vtemp2);
CrossProduct (vtemp1, vtemp2, normal);
if (normal[1] > 0)
{
basex = iwidth + 2;
}
else
{
basex = 2;
}
basey = 2;
for (j=0 ; j<3 ; j++)
{
pbasevert = ptri[i].verts[j];
triangle_st[i][j][0] = Q_rint((pbasevert[0] - mins[0]) * s_scale + basex);
triangle_st[i][j][1] = Q_rint((maxs[2] - pbasevert[2]) * t_scale + basey);
}
}
// make the width a multiple of 4; some hardware requires this, and it ensures
// dword alignment for each scan
swidth = iwidth*2;
model.skinwidth = (swidth + 3) & ~3;
model.skinheight = iheight;
}
示例8: RE_AddPolyToScene
/*
=====================
RE_AddPolyToScene
=====================
*/
void RE_AddPolyToScene( qhandle_t hShader, int numVerts, const polyVert_t *verts, int numPolys ) {
srfPoly_t *poly;
int i, j;
int fogIndex;
fog_t *fog;
vec3_t bounds[2];
if ( !tr.registered ) {
return;
}
if ( !hShader ) {
ri.Printf( PRINT_WARNING, "WARNING: RE_AddPolyToScene: NULL poly shader\n");
return;
}
for ( j = 0; j < numPolys; j++ ) {
if ( r_numpolyverts + numVerts > max_polyverts || r_numpolys >= max_polys ) {
/*
NOTE TTimo this was initially a PRINT_WARNING
but it happens a lot with high fighting scenes and particles
since we don't plan on changing the const and making for room for those effects
simply cut this message to developer only
*/
ri.Printf( PRINT_DEVELOPER, "WARNING: RE_AddPolyToScene: r_max_polys or r_max_polyverts reached\n");
return;
}
poly = &backEndData[tr.smpFrame]->polys[r_numpolys];
poly->surfaceType = SF_POLY;
poly->hShader = hShader;
poly->numVerts = numVerts;
poly->verts = &backEndData[tr.smpFrame]->polyVerts[r_numpolyverts];
Com_Memcpy( poly->verts, &verts[numVerts*j], numVerts * sizeof( *verts ) );
if ( glConfig.hardwareType == GLHW_RAGEPRO ) {
poly->verts->modulate[0] = 255;
poly->verts->modulate[1] = 255;
poly->verts->modulate[2] = 255;
poly->verts->modulate[3] = 255;
}
// done.
r_numpolys++;
r_numpolyverts += numVerts;
// if no world is loaded
if ( tr.world == NULL ) {
fogIndex = 0;
}
// see if it is in a fog volume
else if ( tr.world->numfogs == 1 ) {
fogIndex = 0;
} else {
// find which fog volume the poly is in
VectorCopy( poly->verts[0].xyz, bounds[0] );
VectorCopy( poly->verts[0].xyz, bounds[1] );
for ( i = 1 ; i < poly->numVerts ; i++ ) {
AddPointToBounds( poly->verts[i].xyz, bounds[0], bounds[1] );
}
for ( fogIndex = 1 ; fogIndex < tr.world->numfogs ; fogIndex++ ) {
fog = &tr.world->fogs[fogIndex];
if ( bounds[1][0] >= fog->bounds[0][0]
&& bounds[1][1] >= fog->bounds[0][1]
&& bounds[1][2] >= fog->bounds[0][2]
&& bounds[0][0] <= fog->bounds[1][0]
&& bounds[0][1] <= fog->bounds[1][1]
&& bounds[0][2] <= fog->bounds[1][2] ) {
break;
}
}
if ( fogIndex == tr.world->numfogs ) {
fogIndex = 0;
}
}
poly->fogIndex = fogIndex;
}
}
示例9: RE_AddPolyToScene
/*
=======================================================================================================================================
RE_AddPolyToScene
=======================================================================================================================================
*/
void RE_AddPolyToScene(qhandle_t hShader, int numVerts, const polyVert_t *verts) {
srfPoly_t *poly;
int i;
int fogIndex;
fog_t *fog;
vec3_t bounds[2];
if (!tr.registered) {
return;
}
if (!hShader) {
// This isn't a useful warning, and an hShader of zero isn't a null shader, it's
// the default shader.
//ri.Printf(PRINT_WARNING, "WARNING: RE_AddPolyToScene: NULL poly shader\n");
//return;
}
if (((r_numpolyverts + numVerts) >= max_polyverts) || (r_numpolys >= max_polys)) {
return;
}
poly = &backEndData->polys[r_numpolys];
poly->surfaceType = SF_POLY;
poly->hShader = hShader;
poly->numVerts = numVerts;
poly->verts = &backEndData->polyVerts[r_numpolyverts];
memcpy(poly->verts, verts, numVerts * sizeof(*verts));
// Ridah
if (glConfig.hardwareType == GLHW_RAGEPRO) {
poly->verts->modulate[0] = 255;
poly->verts->modulate[1] = 255;
poly->verts->modulate[2] = 255;
poly->verts->modulate[3] = 255;
}
// done.
r_numpolys++;
r_numpolyverts += numVerts;
// see if it is in a fog volume
if (tr.world->numfogs == 1) {
fogIndex = 0;
} else {
// find which fog volume the poly is in
VectorCopy(poly->verts[0].xyz, bounds[0]);
VectorCopy(poly->verts[0].xyz, bounds[1]);
for (i = 1 ; i < poly->numVerts ; i++) {
AddPointToBounds(poly->verts[i].xyz, bounds[0], bounds[1]);
}
for (fogIndex = 1 ; fogIndex < tr.world->numfogs ; fogIndex++) {
fog = &tr.world->fogs[fogIndex];
if (bounds[1][0] >= fog->bounds[0][0]
&& bounds[1][1] >= fog->bounds[0][1]
&& bounds[1][2] >= fog->bounds[0][2]
&& bounds[0][0] <= fog->bounds[1][0]
&& bounds[0][1] <= fog->bounds[1][1]
&& bounds[0][2] <= fog->bounds[1][2]) {
break;
}
}
if (fogIndex == tr.world->numfogs) {
fogIndex = 0;
}
}
poly->fogIndex = fogIndex;
}
示例10: R_MarkFragments
/*
=================
R_MarkFragments
=================
*/
int R_MarkFragments( int orientation, const vec3_t *points, const vec3_t projection,
int maxPoints, vec3_t pointBuffer, int maxFragments, markFragment_t *fragmentBuffer ) {
int numsurfaces, numPlanes;
int i, j, k, m, n;
surfaceType_t *surfaces[4096];
vec3_t mins, maxs;
int returnedFragments;
int returnedPoints;
vec3_t normals[MAX_VERTS_ON_POLY + 2];
float dists[MAX_VERTS_ON_POLY + 2];
vec3_t clipPoints[2][MAX_VERTS_ON_POLY];
int numClipPoints;
float *v;
srfGridMesh_t *cv;
drawVert_t *dv;
vec3_t normal;
vec3_t projectionDir;
vec3_t v1, v2;
int *indexes;
float radius;
vec3_t center; // center of original mark
int numPoints = 4; // Ridah, we were only ever passing in 4, so I made this local and used the parameter for the orientation
qboolean oldMapping = qfalse;
if (numPoints <= 0) {
return 0;
}
//increment view count for double check prevention
tr.viewCount++;
// RF, negative maxFragments means we want original mapping
if ( maxFragments < 0 ) {
maxFragments = -maxFragments;
oldMapping = qtrue;
}
VectorClear( center );
for ( i = 0 ; i < numPoints ; i++ ) {
VectorAdd( points[i], center, center );
}
VectorScale( center, 1.0 / numPoints, center );
//
radius = VectorNormalize2( projection, projectionDir ) / 2.0;
bestdist = 0;
VectorNegate( projectionDir, bestnormal );
// find all the brushes that are to be considered
ClearBounds( mins, maxs );
for ( i = 0 ; i < numPoints ; i++ ) {
vec3_t temp;
AddPointToBounds( points[i], mins, maxs );
VectorMA( points[i], 1 * ( 1 + oldMapping * radius * 4 ), projection, temp );
AddPointToBounds( temp, mins, maxs );
// make sure we get all the leafs (also the one(s) in front of the hit surface)
VectorMA( points[i], -20 * ( 1.0 + (float)oldMapping * ( radius / 20.0 ) * 4 ), projectionDir, temp );
AddPointToBounds( temp, mins, maxs );
}
if ( numPoints > MAX_VERTS_ON_POLY ) {
numPoints = MAX_VERTS_ON_POLY;
}
// create the bounding planes for the to be projected polygon
for ( i = 0 ; i < numPoints ; i++ ) {
VectorSubtract( points[( i + 1 ) % numPoints], points[i], v1 );
VectorAdd( points[i], projection, v2 );
VectorSubtract( points[i], v2, v2 );
CrossProduct( v1, v2, normals[i] );
VectorNormalize( normals[i] );
dists[i] = DotProduct( normals[i], points[i] );
}
// add near and far clipping planes for projection
VectorCopy( projectionDir, normals[numPoints] );
dists[numPoints] = DotProduct( normals[numPoints], points[0] ) - radius * ( 1 + oldMapping * 10 );
VectorCopy( projectionDir, normals[numPoints + 1] );
VectorInverse( normals[numPoints + 1] );
dists[numPoints + 1] = DotProduct( normals[numPoints + 1], points[0] ) - radius * ( 1 + oldMapping * 10 );
numPlanes = numPoints + 2;
numsurfaces = 0;
R_BoxSurfaces_r( tr.world->nodes, mins, maxs, surfaces, 4096, &numsurfaces, projectionDir );
returnedPoints = 0;
returnedFragments = 0;
// find the closest surface to center the decal there, and wrap around other surfaces
if ( !oldMapping ) {
VectorNegate( bestnormal, bestnormal );
}
for ( i = 0 ; i < numsurfaces ; i++ ) {
if ( *surfaces[i] == SF_GRID ) {
//.........这里部分代码省略.........
示例11: BeginModel
void BeginModel( void ){
bspModel_t *mod;
brush_t *b;
entity_t *e;
vec3_t mins, maxs;
vec3_t lgMins, lgMaxs; /* ydnar: lightgrid mins/maxs */
parseMesh_t *p;
int i;
/* test limits */
if ( numBSPModels == MAX_MAP_MODELS ) {
Error( "MAX_MAP_MODELS" );
}
/* get model and entity */
mod = &bspModels[ numBSPModels ];
e = &entities[ mapEntityNum ];
/* ydnar: lightgrid mins/maxs */
ClearBounds( lgMins, lgMaxs );
/* bound the brushes */
ClearBounds( mins, maxs );
for ( b = e->brushes; b; b = b->next )
{
/* ignore non-real brushes (origin, etc) */
if ( b->numsides == 0 ) {
continue;
}
AddPointToBounds( b->mins, mins, maxs );
AddPointToBounds( b->maxs, mins, maxs );
/* ydnar: lightgrid bounds */
if ( b->compileFlags & C_LIGHTGRID ) {
AddPointToBounds( b->mins, lgMins, lgMaxs );
AddPointToBounds( b->maxs, lgMins, lgMaxs );
}
}
/* bound patches */
for ( p = e->patches; p; p = p->next )
{
for ( i = 0; i < ( p->mesh.width * p->mesh.height ); i++ )
AddPointToBounds( p->mesh.verts[i].xyz, mins, maxs );
}
/* ydnar: lightgrid mins/maxs */
if ( lgMins[ 0 ] < 99999 ) {
/* use lightgrid bounds */
VectorCopy( lgMins, mod->mins );
VectorCopy( lgMaxs, mod->maxs );
}
else
{
/* use brush/patch bounds */
VectorCopy( mins, mod->mins );
VectorCopy( maxs, mod->maxs );
}
/* note size */
Sys_FPrintf( SYS_VRB, "BSP bounds: { %f %f %f } { %f %f %f }\n", mins[ 0 ], mins[ 1 ], mins[ 2 ], maxs[ 0 ], maxs[ 1 ], maxs[ 2 ] );
Sys_FPrintf( SYS_VRB, "Lightgrid bounds: { %f %f %f } { %f %f %f }\n", lgMins[ 0 ], lgMins[ 1 ], lgMins[ 2 ], lgMaxs[ 0 ], lgMaxs[ 1 ], lgMaxs[ 2 ] );
/* set firsts */
mod->firstBSPSurface = numBSPDrawSurfaces;
mod->firstBSPBrush = numBSPBrushes;
}
示例12: R_LoadMD5
//.........这里部分代码省略.........
for ( k = 0; k < v->numWeights; k++ )
{
v->weights[ k ] = surf->weights + ( v->firstWeight + k );
}
}
}
// loading is done now calculate the bounding box and tangent spaces
ClearBounds( md5->bounds[ 0 ], md5->bounds[ 1 ] );
for ( i = 0, surf = md5->surfaces; i < md5->numSurfaces; i++, surf++ )
{
for ( j = 0, v = surf->verts; j < surf->numVerts; j++, v++ )
{
vec3_t tmpVert;
md5Weight_t *w;
VectorClear( tmpVert );
for ( k = 0, w = v->weights[ 0 ]; k < v->numWeights; k++, w++ )
{
vec3_t offsetVec;
bone = &md5->bones[ w->boneIndex ];
QuatTransformVector( bone->rotation, w->offset, offsetVec );
VectorAdd( bone->origin, offsetVec, offsetVec );
VectorMA( tmpVert, w->boneWeight, offsetVec, tmpVert );
}
VectorCopy( tmpVert, v->position );
AddPointToBounds( tmpVert, md5->bounds[ 0 ], md5->bounds[ 1 ] );
}
// calc normals
{
const float *v0, *v1, *v2;
const float *t0, *t1, *t2;
vec3_t normal;
for ( j = 0, v = surf->verts; j < surf->numVerts; j++, v++ )
{
VectorClear( v->tangent );
VectorClear( v->binormal );
VectorClear( v->normal );
}
for ( j = 0, tri = surf->triangles; j < surf->numTriangles; j++, tri++ )
{
v0 = surf->verts[ tri->indexes[ 0 ] ].position;
v1 = surf->verts[ tri->indexes[ 1 ] ].position;
v2 = surf->verts[ tri->indexes[ 2 ] ].position;
t0 = surf->verts[ tri->indexes[ 0 ] ].texCoords;
t1 = surf->verts[ tri->indexes[ 1 ] ].texCoords;
t2 = surf->verts[ tri->indexes[ 2 ] ].texCoords;
R_CalcNormalForTriangle( normal, v0, v1, v2 );
for ( k = 0; k < 3; k++ )
{
float *v;
v = surf->verts[ tri->indexes[ k ] ].normal;
示例13: sizeof
/*
=================
R_CreateSurfaceGridMesh
=================
*/
static srfGridMesh_t *R_CreateSurfaceGridMesh( int width, int height,
srfVert_t ctrl[ MAX_GRID_SIZE ][ MAX_GRID_SIZE ],
float errorTable[ 2 ][ MAX_GRID_SIZE ],
int numTriangles, srfTriangle_t triangles[ SHADER_MAX_TRIANGLES ] )
{
int i, j, size;
srfVert_t *vert;
vec3_t tmpVec;
srfGridMesh_t *grid;
// copy the results out to a grid
size = sizeof( *grid );
if ( r_stitchCurves->integer )
{
grid = (srfGridMesh_t*)/*ri.Hunk_Alloc */ Com_Allocate( size );
Com_Memset( grid, 0, size );
grid->widthLodError = (float*)/*ri.Hunk_Alloc */ Com_Allocate( width * 4 );
Com_Memcpy( grid->widthLodError, errorTable[ 0 ], width * 4 );
grid->heightLodError = (float*)/*ri.Hunk_Alloc */ Com_Allocate( height * 4 );
Com_Memcpy( grid->heightLodError, errorTable[ 1 ], height * 4 );
grid->numTriangles = numTriangles;
grid->triangles = (srfTriangle_t*) Com_Allocate( grid->numTriangles * sizeof( srfTriangle_t ) );
Com_Memcpy( grid->triangles, triangles, numTriangles * sizeof( srfTriangle_t ) );
grid->numVerts = ( width * height );
grid->verts = (srfVert_t*) Com_Allocate( grid->numVerts * sizeof( srfVert_t ) );
}
else
{
grid = (srfGridMesh_t*) ri.Hunk_Alloc( size, ha_pref::h_low );
Com_Memset( grid, 0, size );
grid->widthLodError = (float*) ri.Hunk_Alloc( width * 4, ha_pref::h_low );
Com_Memcpy( grid->widthLodError, errorTable[ 0 ], width * 4 );
grid->heightLodError = (float*) ri.Hunk_Alloc( height * 4, ha_pref::h_low );
Com_Memcpy( grid->heightLodError, errorTable[ 1 ], height * 4 );
grid->numTriangles = numTriangles;
grid->triangles = (srfTriangle_t*) ri.Hunk_Alloc( grid->numTriangles * sizeof( srfTriangle_t ), ha_pref::h_low );
Com_Memcpy( grid->triangles, triangles, numTriangles * sizeof( srfTriangle_t ) );
grid->numVerts = ( width * height );
grid->verts = (srfVert_t*) ri.Hunk_Alloc( grid->numVerts * sizeof( srfVert_t ), ha_pref::h_low );
}
grid->width = width;
grid->height = height;
grid->surfaceType = surfaceType_t::SF_GRID;
ClearBounds( grid->bounds[ 0 ], grid->bounds[ 1 ] );
for ( i = 0; i < width; i++ )
{
for ( j = 0; j < height; j++ )
{
vert = &grid->verts[ j * width + i ];
*vert = ctrl[ j ][ i ];
AddPointToBounds( vert->xyz, grid->bounds[ 0 ], grid->bounds[ 1 ] );
}
}
// compute local origin and bounds
VectorAdd( grid->bounds[ 0 ], grid->bounds[ 1 ], grid->origin );
VectorScale( grid->origin, 0.5f, grid->origin );
VectorSubtract( grid->bounds[ 0 ], grid->origin, tmpVec );
grid->radius = VectorLength( tmpVec );
VectorCopy( grid->origin, grid->lodOrigin );
grid->lodRadius = grid->radius;
//
return grid;
}
示例14: R_UpdatePortalSurface
/*
* R_UpdatePortalSurface
*/
void R_UpdatePortalSurface( portalSurface_t *portalSurface, const mesh_t *mesh,
const vec3_t mins, const vec3_t maxs, const shader_t *shader ) {
unsigned int i;
float dist;
cplane_t plane, untransformed_plane;
vec3_t v[3];
const entity_t *ent;
if( !mesh || !portalSurface ) {
return;
}
ent = portalSurface->entity;
for( i = 0; i < 3; i++ ) {
VectorCopy( mesh->xyzArray[mesh->elems[i]], v[i] );
}
PlaneFromPoints( v, &untransformed_plane );
untransformed_plane.dist += DotProduct( ent->origin, untransformed_plane.normal );
untransformed_plane.dist += 1; // nudge along the normal a bit
CategorizePlane( &untransformed_plane );
if( shader->flags & SHADER_AUTOSPRITE ) {
vec3_t centre;
// autosprites are quads, facing the viewer
if( mesh->numVerts < 4 ) {
return;
}
// compute centre as average of 4 vertices
VectorCopy( mesh->xyzArray[mesh->elems[3]], centre );
for( i = 0; i < 3; i++ )
VectorAdd( centre, v[i], centre );
VectorMA( ent->origin, 0.25, centre, centre );
VectorNegate( &rn.viewAxis[AXIS_FORWARD], plane.normal );
plane.dist = DotProduct( plane.normal, centre );
CategorizePlane( &plane );
} else {
vec3_t temp;
mat3_t entity_rotation;
// regular surfaces
if( !Matrix3_Compare( ent->axis, axis_identity ) ) {
Matrix3_Transpose( ent->axis, entity_rotation );
for( i = 0; i < 3; i++ ) {
VectorCopy( v[i], temp );
Matrix3_TransformVector( entity_rotation, temp, v[i] );
VectorMA( ent->origin, ent->scale, v[i], v[i] );
}
PlaneFromPoints( v, &plane );
CategorizePlane( &plane );
} else {
plane = untransformed_plane;
}
}
if( ( dist = PlaneDiff( rn.viewOrigin, &plane ) ) <= BACKFACE_EPSILON ) {
// behind the portal plane
if( !( shader->flags & SHADER_PORTAL_CAPTURE2 ) ) {
return;
}
// we need to render the backplane view
}
// check if portal view is opaque due to alphagen portal
if( shader->portalDistance && dist > shader->portalDistance ) {
return;
}
portalSurface->plane = plane;
portalSurface->untransformed_plane = untransformed_plane;
AddPointToBounds( mins, portalSurface->mins, portalSurface->maxs );
AddPointToBounds( maxs, portalSurface->mins, portalSurface->maxs );
VectorAdd( portalSurface->mins, portalSurface->maxs, portalSurface->centre );
VectorScale( portalSurface->centre, 0.5, portalSurface->centre );
}
示例15: RE_BuildSkeleton
//.........这里部分代码省略.........
#if defined(REFBONE_NAMES)
Q_strncpyz(skel->bones[i].name, channel->name, sizeof(skel->bones[i].name));
#endif
}
skel->numBones = anim->numChannels;
skel->type = SK_RELATIVE;
return qtrue;
}
else if (skelAnim->type == AT_PSA && skelAnim->psa)
{
int i;
psaAnimation_t *anim = skelAnim->psa;
axAnimationKey_t *newKey, *oldKey;
axReferenceBone_t *refBone;
vec3_t newOrigin, oldOrigin, lerpedOrigin;
quat_t newQuat, oldQuat, lerpedQuat;
refSkeleton_t skeleton;
Q_clamp(startFrame, 0, anim->info.numRawFrames - 1);
Q_clamp(endFrame, 0, anim->info.numRawFrames - 1);
ClearBounds(skel->bounds[0], skel->bounds[1]);
skel->numBones = anim->info.numBones;
for (i = 0, refBone = anim->bones; i < anim->info.numBones; i++, refBone++)
{
oldKey = &anim->keys[startFrame * anim->info.numBones + i];
newKey = &anim->keys[endFrame * anim->info.numBones + i];
VectorCopy(newKey->position, newOrigin);
VectorCopy(oldKey->position, oldOrigin);
quat_copy(newKey->quat, newQuat);
quat_copy(oldKey->quat, oldQuat);
//QuatCalcW(oldQuat);
//QuatNormalize(oldQuat);
//QuatCalcW(newQuat);
//QuatNormalize(newQuat);
VectorLerp(oldOrigin, newOrigin, frac, lerpedOrigin);
quat_slerp(oldQuat, newQuat, frac, lerpedQuat);
// copy lerped information to the bone + extra data
skel->bones[i].parentIndex = refBone->parentIndex;
if (refBone->parentIndex < 0 && clearOrigin)
{
VectorClear(skel->bones[i].origin);
QuatClear(skel->bones[i].rotation);
// move bounding box back
VectorSubtract(skel->bounds[0], lerpedOrigin, skel->bounds[0]);
VectorSubtract(skel->bounds[1], lerpedOrigin, skel->bounds[1]);
}
else
{
VectorCopy(lerpedOrigin, skel->bones[i].origin);
}
quat_copy(lerpedQuat, skel->bones[i].rotation);
#if defined(REFBONE_NAMES)
Q_strncpyz(skel->bones[i].name, refBone->name, sizeof(skel->bones[i].name));
#endif
// calculate absolute values for the bounding box approximation
VectorCopy(skel->bones[i].origin, skeleton.bones[i].origin);
quat_copy(skel->bones[i].rotation, skeleton.bones[i].rotation);
if (refBone->parentIndex >= 0)
{
vec3_t rotated;
quat_t quat;
refBone_t *bone = &skeleton.bones[i];
refBone_t *parent = &skeleton.bones[refBone->parentIndex];
QuatTransformVector(parent->rotation, bone->origin, rotated);
VectorAdd(parent->origin, rotated, bone->origin);
QuatMultiply1(parent->rotation, bone->rotation, quat);
quat_copy(quat, bone->rotation);
AddPointToBounds(bone->origin, skel->bounds[0], skel->bounds[1]);
}
}
skel->numBones = anim->info.numBones;
skel->type = SK_RELATIVE;
return qtrue;
}
//Ren_Warning( "RE_BuildSkeleton: bad animation '%s' with handle %i\n", anim->name, hAnim);
// FIXME: clear existing bones and bounds?
return qfalse;
}