You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
3.3 KiB
127 lines
3.3 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
|
|
#include "raytrace.h" |
|
#include <bspfile.h> |
|
#include "bsplib.h" |
|
|
|
static Vector VertCoord(dface_t const &f, int vnum) |
|
{ |
|
int eIndex = dsurfedges[f.firstedge+vnum]; |
|
int point; |
|
if( eIndex < 0 ) |
|
{ |
|
point = dedges[-eIndex].v[1]; |
|
} |
|
else |
|
{ |
|
point = dedges[eIndex].v[0]; |
|
} |
|
dvertex_t *v=dvertexes+point; |
|
return Vector(v->point[0],v->point[1],v->point[2]); |
|
|
|
} |
|
|
|
Vector colors[]={ |
|
Vector(0.5,0.5,1), |
|
Vector(0.5,1,0.5), |
|
Vector(0.5,1,1), |
|
Vector(1,0.5,0.5), |
|
Vector(1,0.5,1), |
|
Vector(1,1,1)}; |
|
|
|
void RayTracingEnvironment::AddBSPFace(int id,dface_t const &face) |
|
{ |
|
if (face.dispinfo!=-1) // displacements must be dealt with elsewhere |
|
return; |
|
texinfo_t *tx =(face.texinfo>=0)?&(texinfo[face.texinfo]):0; |
|
// if (tx && (tx->flags & (SURF_SKY|SURF_NODRAW))) |
|
// return; |
|
if (tx) |
|
{ |
|
printf("id %d flags=%x\n",id,tx->flags); |
|
} |
|
printf("side: "); |
|
for(int v=0;v<face.numedges;v++) |
|
{ |
|
printf("(%f %f %f) ",XYZ(VertCoord(face,v))); |
|
} |
|
printf("\n"); |
|
int ntris=face.numedges-2; |
|
for(int tri=0;tri<ntris;tri++) |
|
{ |
|
|
|
AddTriangle(id,VertCoord(face,0),VertCoord(face,(tri+1)%face.numedges), |
|
VertCoord(face,(tri+2)%face.numedges),Vector(1,1,1)); //colors[id % NELEMS(colors)]); |
|
} |
|
} |
|
|
|
void RayTracingEnvironment::InitializeFromLoadedBSP(void) |
|
{ |
|
// CUtlVector<uint8> PlanesToSkip; |
|
// SidesToSkip.EnsureCapacity(numplanes); |
|
// for(int s=0;s<numplanes;s++) |
|
// SidesToSkip.AddToTail(0); |
|
// for(int b=0;b<numbrushes;b++) |
|
// if ((dbrushes[b].contents & MASK_OPAQUE)==0) |
|
// { |
|
// // transparent brush - mark all its sides as "do not process" |
|
// for(int s=0;s<dbrushes[b].numsides;s++) |
|
// { |
|
// PlanesToSkip[s+dbrushes[b].firstside]=1; |
|
// } |
|
|
|
// } |
|
// // now, add all origfaces, omitting those whose sides are the ones we marked previously |
|
// for(int c=0;c<numorigfaces;c++) |
|
// { |
|
// dface_t const &f=dorigfaces[c]; |
|
// if (SidesToSkip[f.AddBSPFace(c,dorigfaces[c]); |
|
// } |
|
|
|
|
|
|
|
// // ugly - I want to traverse all the faces. but there is no way to get from a face back to it's |
|
// // original brush, and I need to get back to the face to the contents field of the brush. So I |
|
// // will create a temporary mapping from a "side" to its brush. I can get from the face to it |
|
// // side, which can get me back to its brush. |
|
|
|
// CUtlVector<uint8> OrigFaceVisited; |
|
// OrigFaceVisited.EnsureCapacity(numorigfaces); |
|
// int n_added=0; |
|
|
|
// for(int i=0;i<numorigfaces;i++) |
|
// OrigFaceVisited.AddToTail(0); |
|
|
|
// for(int l=0;l<numleafs;l++) |
|
// { |
|
// dleaf_t const &lf=dleafs[l]; |
|
// // if (lf.contents & MASK_OPAQUE) |
|
// { |
|
// for(int f=0;f<lf.numleaffaces;f++); |
|
// { |
|
// dface_t const &face=dfaces[f+lf.firstleafface]; |
|
// if (OrigFaceVisited[face.origFace]==0) |
|
// { |
|
// dface_t const &oface=dorigfaces[face.origFace]; |
|
// OrigFaceVisited[face.origFace]=1; |
|
// n_added++; |
|
// AddBSPFace(face.origFace,oface); |
|
// } |
|
// } |
|
// } |
|
// } |
|
// printf("added %d of %d\n",n_added,numorigfaces); |
|
// for(int c=0;c<numorigfaces;c++) |
|
// { |
|
// dface_t const &f=dorigfaces[c]; |
|
// AddBSPFace(c,dorigfaces[c]); |
|
// } |
|
for(int c=0;c<numfaces;c++) |
|
{ |
|
// dface_t const &f=dfaces[c]; |
|
AddBSPFace(c,dorigfaces[c]); |
|
} |
|
|
|
// AddTriangle(1234,Vector(51,145,-700),Vector(71,165,-700),Vector(51,165,-700),colors[5]); |
|
} |
|
|
|
|