//
//////////////////////////////////////////////////////////////////////
-#include "StdAfx.h"
+#include "DBrush.h"
#ifdef WIN32
#pragma warning(disable : 4786)
#endif
-#include "StdAfx.h"
-
-#include "gtkr_list.h"
+#include <list>
#include "str.h"
#include "DPoint.h"
#include "DPlane.h"
-#include "DBrush.h"
#include "DEPair.h"
#include "DPatch.h"
#include "DEntity.h"
#include "DWinding.h"
-#include "dialogs-gtk.h"
+#include "dialogs/dialogs-gtk.h"
#include "misc.h"
#include "iundo.h"
-#include "refcounted_ptr.h"
+#include "generic/referencecounted.h"
#include "scenelib.h"
DBrush::DBrush(int ID)
{
m_nBrushID = ID;
- bBoundsBuilt = FALSE;
+ bBoundsBuilt = false;
+ QER_entity = NULL;
QER_brush = NULL;
}
// Implementation
//////////////////////////////////////////////////////////////////////
-DPlane* DBrush::AddFace(vec3_t va, vec3_t vb, vec3_t vc, _QERFaceData* texData)
+DPlane* DBrush::AddFace(const vec3_t va, const vec3_t vb, const vec3_t vc, const _QERFaceData* texData)
{
#ifdef _DEBUG
// Sys_Printf("(%f %f %f) (%f %f %f) (%f %f %f)\n", va[0], va[1], va[2], vb[0], vb[1], vb[2], vc[0], vc[1], vc[2]);
#endif
- bBoundsBuilt = FALSE;
+ bBoundsBuilt = false;
DPlane* newFace = new DPlane(va, vb, vc, texData);
faceList.push_back(newFace);
if(faceList.size() <= 3) // if less than 3 faces, there can be no points
return 0; // with only 3 faces u can't have a bounded soild
- for(list<DPlane *>::const_iterator p1=faceList.begin(); p1!=faceList.end(); p1++)
+ for(std::list<DPlane *>::const_iterator p1=faceList.begin(); p1!=faceList.end(); p1++)
{
- list<DPlane *>::const_iterator p2=p1;
+ std::list<DPlane *>::const_iterator p2=p1;
for(p2++; p2!=faceList.end(); p2++)
{
- list<DPlane *>::const_iterator p3=p2;
+ std::list<DPlane *>::const_iterator p3=p2;
for(p3++; p3!=faceList.end(); p3++)
{
vec3_t pnt;
if(pos == POINT_IN_BRUSH)
{ // ???? shouldn't happen here
- Sys_Printf("ERROR:: Build Brush Points: Point IN brush!!!\n");
+ globalErrorStream() << "ERROR:: Build Brush Points: Point IN brush!!!\n";
}
else if(pos == POINT_ON_BRUSH)
{ // normal point
// Sys_Printf("%i points on brush\n", pointList.size());
#endif
- return pointList.size();
+ return static_cast<int>(pointList.size());
}
-void DBrush::LoadFromBrush(scene::Node* brush, bool textured)
+void DBrush_addFace(DBrush& brush, const _QERFaceData& faceData)
{
- ClearFaces();
- ClearPoints();
+ brush.AddFace(vector3_to_array(faceData.m_p0), vector3_to_array(faceData.m_p1), vector3_to_array(faceData.m_p2), 0);
+}
+typedef ReferenceCaller1<DBrush, const _QERFaceData&, DBrush_addFace> DBrushAddFaceCaller;
-#if 0
- for(int i = g_FuncTable.m_pfnGetFaceCount(brush)-1; i >= 0 ; i--)
- { // running backwards so i dont have to use the count function each time (OPT)
- _QERFaceData* faceData = g_FuncTable.m_pfnGetFaceData(brush, i);
+void DBrush_addFaceTextured(DBrush& brush, const _QERFaceData& faceData)
+{
+ brush.AddFace(vector3_to_array(faceData.m_p0), vector3_to_array(faceData.m_p1), vector3_to_array(faceData.m_p2), &faceData);
+}
+typedef ReferenceCaller1<DBrush, const _QERFaceData&, DBrush_addFaceTextured> DBrushAddFaceTexturedCaller;
- if(faceData == NULL)
- DoMessageBox("Null pointer returned", "WARNING!", MB_OK);
+void DBrush::LoadFromBrush(scene::Instance& brush, bool textured)
+{
+ ClearFaces();
+ ClearPoints();
- if(textured)
- AddFace(faceData->m_v1, faceData->m_v2, faceData->m_v3, faceData);
- else
- AddFace(faceData->m_v1, faceData->m_v2, faceData->m_v3, NULL);
- }
-#endif
+ GlobalBrushCreator().Brush_forEachFace(brush.path().top(), textured ? BrushFaceDataCallback(DBrushAddFaceTexturedCaller(*this)) : BrushFaceDataCallback(DBrushAddFaceCaller(*this)));
- QER_brush = brush;
+ QER_entity = brush.path().parent().get_pointer();
+ QER_brush = brush.path().top().get_pointer();
}
int DBrush::PointPosition(vec3_t pnt)
{
int state = POINT_IN_BRUSH; // if nothing happens point is inside brush
- for(list<DPlane *>::const_iterator chkPlane=faceList.begin(); chkPlane!=faceList.end(); chkPlane++)
+ for(std::list<DPlane *>::const_iterator chkPlane=faceList.begin(); chkPlane!=faceList.end(); chkPlane++)
{
float dist = (*chkPlane)->DistanceToPoint(pnt);
void DBrush::ClearPoints()
{
- for(list<DPoint *>::const_iterator deadPoint=pointList.begin(); deadPoint!=pointList.end(); deadPoint++) {
+ for(std::list<DPoint *>::const_iterator deadPoint=pointList.begin(); deadPoint!=pointList.end(); deadPoint++) {
delete *deadPoint;
}
pointList.clear();
void DBrush::ClearFaces()
{
- bBoundsBuilt = FALSE;
- for(list<DPlane *>::const_iterator deadPlane=faceList.begin(); deadPlane!=faceList.end(); deadPlane++)
+ bBoundsBuilt = false;
+ for(std::list<DPlane *>::const_iterator deadPlane=faceList.begin(); deadPlane!=faceList.end(); deadPlane++)
{
delete *deadPlane;
}
bool DBrush::HasPoint(vec3_t pnt)
{
- for(list<DPoint *>::const_iterator chkPoint=pointList.begin(); chkPoint!=pointList.end(); chkPoint++)
+ for(std::list<DPoint *>::const_iterator chkPoint=pointList.begin(); chkPoint!=pointList.end(); chkPoint++)
{
if(**chkPoint == pnt)
- return TRUE;
+ return true;
}
- return FALSE;
+ return false;
}
int DBrush::RemoveRedundantPlanes()
{
int cnt = 0;
- list<DPlane *>::iterator chkPlane;
+ std::list<DPlane *>::iterator chkPlane;
// find duplicate planes
- list<DPlane *>::iterator p1=faceList.begin();
+ std::list<DPlane *>::iterator p1=faceList.begin();
while( p1!=faceList.end() )
{
- list<DPlane *>::iterator p2 = p1;
+ std::list<DPlane *>::iterator p2 = p1;
for(p2++; p2!=faceList.end(); p2++)
{
if(**p1 == **p2)
{
- if(!strcmp((*p1)->texInfo.m_texdef.GetName(), "textures/common/caulk"))
+ if(!strcmp((*p1)->m_shader.c_str(), "textures/common/caulk"))
{
delete *p1;
p1 = faceList.erase(p1); // duplicate plane
BuildBounds();
if(!bBoundsBuilt)
- return FALSE;
+ return false;
VectorCopy(bbox_min, min);
VectorCopy(bbox_max, max);
- return TRUE;
+ return true;
}
bool DBrush::BBoxCollision(DBrush* chkBrush)
chkBrush->GetBounds(min2, max2);
if(min1[0] >= max2[0])
- return FALSE;
+ return false;
if(min1[1] >= max2[1])
- return FALSE;
+ return false;
if(min1[2] >= max2[2])
- return FALSE;
+ return false;
if(max1[0] <= min2[0])
- return FALSE;
+ return false;
if(max1[1] <= min2[1])
- return FALSE;
+ return false;
if(max1[2] <= min2[2])
- return FALSE;
+ return false;
- return TRUE;
+ return true;
}
DPlane* DBrush::HasPlane(DPlane* chkPlane)
{
- for(list<DPlane *>::const_iterator brushPlane=faceList.begin(); brushPlane!=faceList.end(); brushPlane++)
+ for(std::list<DPlane *>::const_iterator brushPlane=faceList.begin(); brushPlane!=faceList.end(); brushPlane++)
{
if(**brushPlane == *chkPlane)
return *brushPlane;
if(pointList.size() == 0)
if(BuildPoints() == 0)
- return FALSE;
+ return false;
- list<DPoint *>::const_iterator chkPnt = pointList.begin();
+ std::list<DPoint *>::const_iterator chkPnt = pointList.begin();
if(chkPnt == pointList.end())
- return FALSE;
+ return false;
float dist = cuttingPlane->DistanceToPoint((*chkPnt)->_pnt);
if(dist > MAX_ROUND_ERROR)
- isInFront = FALSE;
+ isInFront = false;
else if(dist < MAX_ROUND_ERROR)
- isInFront = TRUE;
+ isInFront = true;
else
- return TRUE;
+ return true;
for(chkPnt++=pointList.begin(); chkPnt!=pointList.end(); chkPnt++)
{
if(dist > MAX_ROUND_ERROR)
{
if(isInFront)
- return TRUE;
+ return true;
}
else if(dist < MAX_ROUND_ERROR)
{
if(!isInFront)
- return TRUE;
+ return true;
}
else
- return TRUE;
+ return true;
}
- return FALSE;
+ return false;
}
+
scene::Node* DBrush::BuildInRadiant(bool allowDestruction, int* changeCnt, scene::Node* entity)
{
if(allowDestruction)
{
- bool kill = TRUE;
+ bool kill = true;
- for(list<DPlane *>::const_iterator chkPlane=faceList.begin(); chkPlane!=faceList.end(); chkPlane++)
+ for(std::list<DPlane *>::const_iterator chkPlane=faceList.begin(); chkPlane!=faceList.end(); chkPlane++)
{
if((*chkPlane)->m_bChkOk)
{
- kill = FALSE;
+ kill = false;
break;
}
}
//+djbob: fixed bug when brush had no faces "phantom brush" in radiant.
if(faceList.size() < 4)
{
- Sys_Printf("Possible Phantom Brush Found, will not rebuild\n");
+ globalErrorStream() << "Possible Phantom Brush Found, will not rebuild\n";
return NULL;
}
//-djbob
- NodePtr node(Brush_AllocNode());
+ NodeSmartReference node(GlobalBrushCreator().createBrush());
- for(list<DPlane *>::const_iterator buildPlane=faceList.begin(); buildPlane!=faceList.end(); buildPlane++) {
- if((*buildPlane)->AddToBrush(node->m_brush) && changeCnt) {
+ for(std::list<DPlane *>::const_iterator buildPlane=faceList.begin(); buildPlane!=faceList.end(); buildPlane++) {
+ if((*buildPlane)->AddToBrush(node) && changeCnt) {
(*changeCnt)++;
}
}
if(entity) {
- entity->m_traverse->insert(node);
+ Node_getTraversable(*entity)->insert(node);
} else {
- GetWorldspawn()->m_traverse->insert(node);
+ Node_getTraversable(GlobalRadiant().getMapWorldEntity())->insert(node);
}
- return node;
+ QER_entity = entity;
+ QER_brush = node.get_pointer();
+
+ return node.get_pointer();
}
void DBrush::CutByPlane(DPlane *cutPlane, DBrush **newBrush1, DBrush **newBrush2)
DBrush* b1 = new DBrush;
DBrush* b2 = new DBrush;
- for(list<DPlane *>::const_iterator parsePlane=faceList.begin(); parsePlane!=faceList.end(); parsePlane++)
+ for(std::list<DPlane *>::const_iterator parsePlane=faceList.begin(); parsePlane!=faceList.end(); parsePlane++)
{
b1->AddFace((*parsePlane)->points[0], (*parsePlane)->points[1], (*parsePlane)->points[2], NULL);
b2->AddFace((*parsePlane)->points[0], (*parsePlane)->points[1], (*parsePlane)->points[2], NULL);
{
if(pointList.size() == 0)
if(BuildPoints() == 0)
- return FALSE; // invalid brush!!!!
+ return false; // invalid brush!!!!
if(chkBrush->pointList.size() == 0)
if(chkBrush->BuildPoints() == 0)
- return FALSE; // invalid brush!!!!
+ return false; // invalid brush!!!!
if(!BBoxCollision(chkBrush))
- return FALSE;
+ return false;
- list<DPlane *>::const_iterator iplPlane;
+ std::list<DPlane *>::const_iterator iplPlane;
for( iplPlane=faceList.begin(); iplPlane!=faceList.end(); iplPlane++)
{
- bool allInFront = TRUE;
- for(list<DPoint *>::const_iterator iPoint=chkBrush->pointList.begin(); iPoint!=chkBrush->pointList.end(); iPoint++)
+ bool allInFront = true;
+ for(std::list<DPoint *>::const_iterator iPoint=chkBrush->pointList.begin(); iPoint!=chkBrush->pointList.end(); iPoint++)
{
if((*iplPlane)->DistanceToPoint((*iPoint)->_pnt) < -MAX_ROUND_ERROR)
{
- allInFront = FALSE;
+ allInFront = false;
break;
}
}
if(allInFront)
- return FALSE;
+ return false;
}
for( iplPlane=chkBrush->faceList.begin(); iplPlane!=chkBrush->faceList.end(); iplPlane++)
{
- bool allInFront = TRUE;
- for(list<DPoint *>::const_iterator iPoint=pointList.begin(); iPoint!=pointList.end(); iPoint++)
+ bool allInFront = true;
+ for(std::list<DPoint *>::const_iterator iPoint=pointList.begin(); iPoint!=pointList.end(); iPoint++)
{
if((*iplPlane)->DistanceToPoint((*iPoint)->_pnt) < -MAX_ROUND_ERROR)
{
- allInFront = FALSE;
+ allInFront = false;
break;
}
}
if(allInFront)
- return FALSE;
+ return false;
}
- return TRUE;
+ return true;
}
bool DBrush::IntersectsWith(DPlane* p1, DPlane* p2, vec3_t v) {
vec3_t vDown = { 0, 0, -1 };
- list<DPlane *>::const_iterator iplPlane;
+ std::list<DPlane *>::const_iterator iplPlane;
for( iplPlane = faceList.begin(); iplPlane != faceList.end(); iplPlane++) {
DPlane* p = (*iplPlane);
}
if(p->PlaneIntersection(p1, p2, v)) {
if(PointPosition( v ) != POINT_OUT_BRUSH) {
- return TRUE;
+ return true;
}
}
}
- return FALSE;
+ return false;
}
void DBrush::BuildBounds()
if(BuildPoints() == 0)
return;
- list<DPoint *>::const_iterator first = pointList.begin();
+ std::list<DPoint *>::const_iterator first = pointList.begin();
VectorCopy((*first)->_pnt, bbox_min);
VectorCopy((*first)->_pnt, bbox_max);
- list<DPoint *>::const_iterator point=pointList.begin();
+ std::list<DPoint *>::const_iterator point=pointList.begin();
for( point++; point!=pointList.end(); point++)
{
if((*point)->_pnt[0] > bbox_max[0])
bbox_min[2] = (*point)->_pnt[2];
}
- bBoundsBuilt = TRUE;
+ bBoundsBuilt = true;
}
}
chkBrush->GetBounds(min2, max2);
if((min1[0] - max2[0]) > MAX_ROUND_ERROR)
- return FALSE;
+ return false;
if((min1[1] - max2[1]) > MAX_ROUND_ERROR)
- return FALSE;
+ return false;
if((min1[2] - max2[2]) > MAX_ROUND_ERROR)
- return FALSE;
+ return false;
if((min2[0] - max1[0]) > MAX_ROUND_ERROR)
- return FALSE;
+ return false;
if((min2[1] - max1[1]) > MAX_ROUND_ERROR)
- return FALSE;
+ return false;
if((min2[2] - max1[2]) > MAX_ROUND_ERROR)
- return FALSE;
+ return false;
int cnt = 0;
cnt++;
if(cnt > 1)
- return FALSE;
+ return false;
- return TRUE;
+ return true;
}
-void DBrush::ResetChecks(list<Str>* exclusionList)
+void DBrush::ResetChecks(std::list<Str>* exclusionList)
{
- for(list<DPlane *>::const_iterator resetPlane=faceList.begin(); resetPlane!=faceList.end(); resetPlane++)
+ for(std::list<DPlane *>::const_iterator resetPlane=faceList.begin(); resetPlane!=faceList.end(); resetPlane++)
{
- bool set = FALSE;
+ bool set = false;
if(exclusionList)
{
- for(list<Str>::iterator eTexture = exclusionList->begin(); eTexture != exclusionList->end(); eTexture++)
+ for(std::list<Str>::iterator eTexture = exclusionList->begin(); eTexture != exclusionList->end(); eTexture++)
{
- if(strstr((*resetPlane)->texInfo.m_texdef.GetName(), eTexture->GetBuffer()))
+ if(strstr((*resetPlane)->m_shader.c_str(), eTexture->GetBuffer()))
{
- set = TRUE;
+ set = true;
break;
}
}
DPlane* DBrush::HasPlaneInverted(DPlane *chkPlane)
{
- for(list<DPlane *>::const_iterator brushPlane=faceList.begin(); brushPlane!=faceList.end(); brushPlane++)
+ for(std::list<DPlane *>::const_iterator brushPlane=faceList.begin(); brushPlane!=faceList.end(); brushPlane++)
{
if(**brushPlane != *chkPlane)
{
bool DBrush::HasTexture(const char *textureName)
{
- for(list<DPlane *>::const_iterator chkPlane=faceList.begin(); chkPlane!=faceList.end(); chkPlane++)
+ for(std::list<DPlane *>::const_iterator chkPlane=faceList.begin(); chkPlane!=faceList.end(); chkPlane++)
{
- if(strstr((*chkPlane)->texInfo.m_texdef.GetName(), textureName))
- return TRUE;
+ if(strstr((*chkPlane)->m_shader.c_str(), textureName))
+ return true;
}
- return FALSE;
+ return false;
}
bool DBrush::IsDetail()
{
- for(list<DPlane *>::const_iterator chkPlane=faceList.begin(); chkPlane!=faceList.end(); chkPlane++)
+ for(std::list<DPlane *>::const_iterator chkPlane=faceList.begin(); chkPlane!=faceList.end(); chkPlane++)
{
- if((*chkPlane)->texInfo.m_texdef.contents & FACE_DETAIL)
- return TRUE;
+ if((*chkPlane)->texInfo.contents & FACE_DETAIL)
+ return true;
}
- return FALSE;
+ return false;
}
void DBrush::BuildFromWinding(DWinding *w)
{
if(w->numpoints < 3)
{
- Sys_ERROR("Winding has invalid number of points");
+ globalErrorStream() << "Winding has invalid number of points";
return;
}
{
fprintf(pFile, "{\n");
- for(list<DPlane *>::const_iterator pp=faceList.begin(); pp!=faceList.end(); pp++)
+ for(std::list<DPlane *>::const_iterator pp=faceList.begin(); pp!=faceList.end(); pp++)
{
char buffer[512];
(*pp)->points[0][0], (*pp)->points[0][1], (*pp)->points[0][2],
(*pp)->points[1][0], (*pp)->points[1][1], (*pp)->points[1][2],
(*pp)->points[2][0], (*pp)->points[2][1], (*pp)->points[2][2],
- (*pp)->texInfo.m_texdef.GetName(),
+ (*pp)->m_shader.c_str(),
(*pp)->texInfo.m_texdef.shift[0], (*pp)->texInfo.m_texdef.shift[1],
(*pp)->texInfo.m_texdef.scale[0], (*pp)->texInfo.m_texdef.scale[0],
(*pp)->texInfo.m_texdef.rotate);
void DBrush::Rotate(vec3_t vOrigin, vec3_t vRotation)
{
- for(list<DPlane *>::const_iterator rotPlane=faceList.begin(); rotPlane!=faceList.end(); rotPlane++)
+ for(std::list<DPlane *>::const_iterator rotPlane=faceList.begin(); rotPlane!=faceList.end(); rotPlane++)
{
for(int i = 0; i < 3; i++)
VectorRotate((*rotPlane)->points[i], vRotation, vOrigin);
{
if(textureName)
{
- bool changed = FALSE;
- for(list<DPlane *>::const_iterator resetPlane=faceList.begin(); resetPlane!=faceList.end(); resetPlane++)
+ bool changed = false;
+ for(std::list<DPlane *>::const_iterator resetPlane=faceList.begin(); resetPlane!=faceList.end(); resetPlane++)
{
- if(!strcmp((*resetPlane)->texInfo.m_texdef.GetName(), textureName))
+ if(!strcmp((*resetPlane)->m_shader.c_str(), textureName))
{
if(bResetTextureName)
- (*resetPlane)->texInfo.m_texdef.SetName(newTextureName);
+ (*resetPlane)->m_shader = newTextureName;
if(bResetScale[0])
(*resetPlane)->texInfo.m_texdef.scale[0] = fScale[0];
if(bResetRotation)
(*resetPlane)->texInfo.m_texdef.rotate = (float)rotation;
- changed = TRUE;
+ changed = true;
}
}
return changed; // no point rebuilding unless we need to, only slows things down
}
else
{
- for(list<DPlane *>::const_iterator resetPlane=faceList.begin(); resetPlane!=faceList.end(); resetPlane++)
+ for(std::list<DPlane *>::const_iterator resetPlane=faceList.begin(); resetPlane!=faceList.end(); resetPlane++)
{
if(bResetTextureName)
- (*resetPlane)->texInfo.m_texdef.SetName(newTextureName);
+ (*resetPlane)->m_shader = newTextureName;
if(bResetScale[0])
(*resetPlane)->texInfo.m_texdef.scale[0] = fScale[0];
if(bResetRotation)
(*resetPlane)->texInfo.m_texdef.rotate = (float)rotation;
}
- return TRUE;
+ return true;
}
}
bool DBrush::operator ==(DBrush* other)
{
- list<DPlane *>::const_iterator chkPlane;
+ std::list<DPlane *>::const_iterator chkPlane;
for(chkPlane=faceList.begin(); chkPlane!=faceList.end(); chkPlane++)
{
if(!other->HasPlane((*chkPlane)))
- return FALSE;
+ return false;
}
for(chkPlane=faceList.begin(); chkPlane!=faceList.end(); chkPlane++)
{
if(!HasPlane((*chkPlane)))
- return FALSE;
+ return false;
}
- return TRUE;
+ return true;
}
-DPlane* DBrush::AddFace(vec3_t va, vec3_t vb, vec3_t vc, const char *textureName, bool bDetail)
+DPlane* DBrush::AddFace(const vec3_t va, const vec3_t vb, const vec3_t vc, const char *textureName, bool bDetail)
{
- bBoundsBuilt = FALSE;
+ bBoundsBuilt = false;
DPlane* newFace = new DPlane(va, vb, vc, textureName, bDetail);
faceList.push_back(newFace);
DPlane* DBrush::FindPlaneWithClosestNormal( vec_t* normal ) {
vec_t bestDot = -2;
DPlane* bestDotPlane = NULL;
- list<DPlane *>::const_iterator chkPlane;
+ std::list<DPlane *>::const_iterator chkPlane;
for( chkPlane = faceList.begin(); chkPlane != faceList.end(); chkPlane++ ) {
DPlane* pPlane = (*chkPlane);
BuildPoints();
- for( list<DPoint *>::const_iterator points = pointList.begin(); points != pointList.end(); points++ ) {
+ for( std::list<DPoint *>::const_iterator points = pointList.begin(); points != pointList.end(); points++ ) {
DPoint* point = (*points);
if( fabs(plane->DistanceToPoint( point->_pnt )) < MAX_ROUND_ERROR ) {
}
void DBrush::RemovePlane( DPlane* plane ) {
- bBoundsBuilt = FALSE;
- for( list<DPlane *>::const_iterator deadPlane = faceList.begin(); deadPlane != faceList.end(); deadPlane++ ) {
+ bBoundsBuilt = false;
+ for( std::list<DPlane *>::const_iterator deadPlane = faceList.begin(); deadPlane != faceList.end(); deadPlane++ ) {
if(*deadPlane == plane) {
delete *deadPlane;
faceList.remove( plane );
}
}
}
-
-void DBrush::RemoveFromRadiant( void ) {
- if(QER_brush) {
-#if 0
- g_FuncTable.m_pfnDeleteBrushHandle(QER_brush);
-#endif
- }
-}