mirror of
https://github.com/id-Software/DOOM-3-BFG.git
synced 2024-12-03 09:22:45 +00:00
Added utility functions for dmap
This commit is contained in:
parent
277964f074
commit
08cacdfe17
1 changed files with 116 additions and 1 deletions
|
@ -3,6 +3,7 @@
|
|||
|
||||
Doom 3 BFG Edition GPL Source Code
|
||||
Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company.
|
||||
Copyright (C) 2013-2014 Robert Beckebans
|
||||
|
||||
This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code").
|
||||
|
||||
|
@ -349,7 +350,7 @@ R_DeriveLightData
|
|||
Fills everything in based on light->parms
|
||||
=================
|
||||
*/
|
||||
static void R_DeriveLightData( idRenderLightLocal* light )
|
||||
void R_DeriveLightData( idRenderLightLocal* light )
|
||||
{
|
||||
|
||||
// decide which light shader we are going to use
|
||||
|
@ -528,6 +529,120 @@ void R_FreeLightDefDerivedData( idRenderLightLocal* ldef )
|
|||
ldef->references = NULL;
|
||||
}
|
||||
|
||||
// RB begin
|
||||
void R_RenderLightFrustum( const renderLight_t& renderLight, idPlane lightFrustum[6] )
|
||||
{
|
||||
idRenderLightLocal fakeLight;
|
||||
|
||||
memset( &fakeLight, 0, sizeof( fakeLight ) );
|
||||
fakeLight.parms = renderLight;
|
||||
|
||||
R_DeriveLightData( &fakeLight );
|
||||
|
||||
idRenderMatrix::GetFrustumPlanes( lightFrustum, fakeLight.baseLightProject, true, true );
|
||||
|
||||
// the DOOM 3 frustum planes point outside the frustum
|
||||
for( int i = 0; i < 6; i++ )
|
||||
{
|
||||
lightFrustum[i] = -lightFrustum[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
=====================
|
||||
R_PolytopeSurface
|
||||
|
||||
Generate vertexes and indexes for a polytope, and optionally returns the polygon windings.
|
||||
The positive sides of the planes will be visible.
|
||||
=====================
|
||||
*/
|
||||
srfTriangles_t* R_PolytopeSurface( int numPlanes, const idPlane* planes, idWinding** windings )
|
||||
{
|
||||
int i, j;
|
||||
srfTriangles_t* tri;
|
||||
|
||||
const int MAX_POLYTOPE_PLANES = 6;
|
||||
|
||||
idFixedWinding planeWindings[MAX_POLYTOPE_PLANES];
|
||||
int numVerts, numIndexes;
|
||||
|
||||
if( numPlanes > MAX_POLYTOPE_PLANES )
|
||||
{
|
||||
common->Error( "R_PolytopeSurface: more than %d planes", MAX_POLYTOPE_PLANES );
|
||||
}
|
||||
|
||||
numVerts = 0;
|
||||
numIndexes = 0;
|
||||
for( i = 0; i < numPlanes; i++ )
|
||||
{
|
||||
const idPlane& plane = planes[i];
|
||||
idFixedWinding& w = planeWindings[i];
|
||||
|
||||
w.BaseForPlane( plane );
|
||||
for( j = 0; j < numPlanes; j++ )
|
||||
{
|
||||
const idPlane& plane2 = planes[j];
|
||||
if( j == i )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if( !w.ClipInPlace( -plane2, ON_EPSILON ) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
if( w.GetNumPoints() <= 2 )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
numVerts += w.GetNumPoints();
|
||||
numIndexes += ( w.GetNumPoints() - 2 ) * 3;
|
||||
}
|
||||
|
||||
// allocate the surface
|
||||
tri = R_AllocStaticTriSurf();
|
||||
R_AllocStaticTriSurfVerts( tri, numVerts );
|
||||
R_AllocStaticTriSurfIndexes( tri, numIndexes );
|
||||
|
||||
// copy the data from the windings
|
||||
for( i = 0; i < numPlanes; i++ )
|
||||
{
|
||||
idFixedWinding& w = planeWindings[i];
|
||||
if( !w.GetNumPoints() )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
for( j = 0 ; j < w.GetNumPoints() ; j++ )
|
||||
{
|
||||
tri->verts[tri->numVerts + j ].Clear();
|
||||
tri->verts[tri->numVerts + j ].xyz = w[j].ToVec3();
|
||||
}
|
||||
|
||||
for( j = 1 ; j < w.GetNumPoints() - 1 ; j++ )
|
||||
{
|
||||
tri->indexes[ tri->numIndexes + 0 ] = tri->numVerts;
|
||||
tri->indexes[ tri->numIndexes + 1 ] = tri->numVerts + j;
|
||||
tri->indexes[ tri->numIndexes + 2 ] = tri->numVerts + j + 1;
|
||||
tri->numIndexes += 3;
|
||||
}
|
||||
tri->numVerts += w.GetNumPoints();
|
||||
|
||||
// optionally save the winding
|
||||
if( windings )
|
||||
{
|
||||
windings[i] = new idWinding( w.GetNumPoints() );
|
||||
*windings[i] = w;
|
||||
}
|
||||
}
|
||||
|
||||
R_BoundTriSurf( tri );
|
||||
|
||||
return tri;
|
||||
}
|
||||
// RB end
|
||||
|
||||
/*
|
||||
===============
|
||||
WindingCompletelyInsideLight
|
||||
|
|
Loading…
Reference in a new issue