X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=contrib%2Fbobtoolz%2FDEntity.cpp;h=f03b489e786e14c4794bc7f3e185878c57efcfdd;hb=bfc8a12a6b315ae261101a34db8ba1b682c67bb7;hp=4d3610c82629d7d75d48a4e9d1ef4c1288f2adab;hpb=b1bfb19ecd5ec8355065b2028a6de0c850197b2d;p=xonotic%2Fnetradiant.git diff --git a/contrib/bobtoolz/DEntity.cpp b/contrib/bobtoolz/DEntity.cpp index 4d3610c8..f03b489e 100644 --- a/contrib/bobtoolz/DEntity.cpp +++ b/contrib/bobtoolz/DEntity.cpp @@ -21,18 +21,39 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // ////////////////////////////////////////////////////////////////////// -#include "StdAfx.h" +#include "DEntity.h" -#ifdef _WIN32 +#ifdef WIN32 #pragma warning(disable : 4786) #endif -#include "DEntity.h" +#include +#include "str.h" + +#include "DPoint.h" +#include "DPlane.h" +#include "DBrush.h" +#include "DEPair.h" +#include "DPatch.h" -#include "dialogs-gtk.h" +#include "dialogs/dialogs-gtk.h" #include "misc.h" #include "CPortals.h" +#include "iundo.h" +#include "ientity.h" +#include "ieclass.h" + +#include "generic/referencecounted.h" + +#include +#include +#include +#include + +#include "scenelib.h" + + const char* brushEntityList[] = { "worldspawn", "trigger_always", @@ -57,7 +78,7 @@ const char* brushEntityList[] = { // Construction/Destruction ////////////////////////////////////////////////////////////////////// -DEntity::DEntity(char *classname, int ID) +DEntity::DEntity(const char *classname, int ID) { SetClassname(classname); m_nID = ID; @@ -77,7 +98,7 @@ DEntity::~DEntity() void DEntity::ClearBrushes() { - for(list::const_iterator deadBrush=brushList.begin(); deadBrush!=brushList.end(); deadBrush++) + for(std::list::const_iterator deadBrush=brushList.begin(); deadBrush!=brushList.end(); deadBrush++) { delete *deadBrush; } @@ -86,7 +107,7 @@ void DEntity::ClearBrushes() void DEntity::ClearPatches() { - for(list::const_iterator deadPatch=patchList.begin(); deadPatch!=patchList.end(); deadPatch++) + for(std::list::const_iterator deadPatch=patchList.begin(); deadPatch!=patchList.end(); deadPatch++) { delete *deadPatch; } @@ -131,7 +152,7 @@ bool DEntity::LoadFromPrt(char *filename) portals.Load(); if(portals.node_count == 0) - return FALSE; + return false; ClearBrushes(); ClearEPairs(); @@ -168,15 +189,15 @@ bool DEntity::LoadFromPrt(char *filename) } if(!build) - brush->AddFace(portals.node[i].portal[j].point[2].p, portals.node[i].portal[j].point[1].p, portals.node[i].portal[j].point[0].p, "textures/common/caulk", FALSE); + brush->AddFace(portals.node[i].portal[j].point[2].p, portals.node[i].portal[j].point[1].p, portals.node[i].portal[j].point[0].p, "textures/common/caulk", false); else - brush->AddFace(portals.node[i].portal[j].point[0].p, portals.node[i].portal[j].point[1].p, portals.node[i].portal[j].point[2].p, "textures/common/caulk", FALSE); + brush->AddFace(portals.node[i].portal[j].point[0].p, portals.node[i].portal[j].point[1].p, portals.node[i].portal[j].point[2].p, "textures/common/caulk", false); } if(build) - brush->BuildInRadiant(FALSE, NULL); + brush->BuildInRadiant(false, NULL); } - return TRUE; + return true; } DPlane* DEntity::AddFaceToBrush(vec3_t va, vec3_t vb, vec3_t vc, _QERFaceData* faceData, int ID) @@ -190,7 +211,7 @@ DBrush* DEntity::GetBrushForID(int ID) { DBrush* buildBrush = NULL; - for(list::const_iterator chkBrush=brushList.begin(); chkBrush!=brushList.end(); chkBrush++) + for(std::list::const_iterator chkBrush=brushList.begin(); chkBrush!=brushList.end(); chkBrush++) { if((*chkBrush)->m_nBrushID == ID) { @@ -205,43 +226,82 @@ DBrush* DEntity::GetBrushForID(int ID) return buildBrush; } +template +class BrushSelectedVisitor : public SelectionSystem::Visitor +{ + const Functor& m_functor; +public: + BrushSelectedVisitor(const Functor& functor) : m_functor(functor) + { + } + void visit(scene::Instance& instance) const + { + if(Node_isBrush(instance.path().top())) + { + m_functor(instance); + } + } +}; + +template +inline const Functor& Scene_forEachSelectedBrush(const Functor& functor) +{ + GlobalSelectionSystem().foreachSelected(BrushSelectedVisitor(functor)); + return functor; +} + +void DEntity_loadBrush(DEntity& entity, scene::Instance& brush) +{ + DBrush* loadBrush = entity.NewBrush(static_cast(entity.brushList.size())); + loadBrush->LoadFromBrush(brush, true); +} +typedef ReferenceCaller1 DEntityLoadBrushCaller; + void DEntity::LoadSelectedBrushes() { ClearBrushes(); ClearEPairs(); - int count = g_FuncTable.m_pfnAllocateSelectedBrushHandles(); - - for(int i = 0; i < count; i++) { - brush_t *brush = (brush_t*)g_FuncTable.m_pfnGetSelectedBrushHandle(i); + Scene_forEachSelectedBrush(DEntityLoadBrushCaller(*this)); +} - if(brush->pPatch) - continue; +template +class PatchSelectedVisitor : public SelectionSystem::Visitor +{ + const Functor& m_functor; +public: + PatchSelectedVisitor(const Functor& functor) : m_functor(functor) + { + } + void visit(scene::Instance& instance) const + { + if(Node_isPatch(instance.path().top())) + { + m_functor(instance); + } + } +}; - DBrush* loadBrush = NewBrush(i); - loadBrush->LoadFromBrush_t(brush, TRUE); - } +template +inline const Functor& Scene_forEachSelectedPatch(const Functor& functor) +{ + GlobalSelectionSystem().foreachSelected(PatchSelectedVisitor(functor)); + return functor; +} - g_FuncTable.m_pfnReleaseSelectedBrushHandles(); +void DEntity_loadPatch(DEntity& entity, scene::Instance& patch) +{ + DPatch* loadPatch = entity.NewPatch(); + loadPatch->LoadFromPatch(patch); } +typedef ReferenceCaller1 DEntityLoadPatchCaller; void DEntity::LoadSelectedPatches() { ClearPatches(); ClearEPairs(); - int count = g_FuncTable.m_pfnAllocateSelectedPatchHandles(); - - for(int i = 0; i < count; i++) - { - //$ FIXME: m_pfnGetPatchHandle - patchMesh_t *pmesh = (patchMesh_t*)g_FuncTable.m_pfnGetPatchData(i); - - DPatch* loadPatch = NewPatch(); - loadPatch->LoadFromBrush_t(pmesh->pSymbiot); - } - - g_FuncTable.m_pfnReleasePatchHandles(); + Scene_forEachSelectedPatch(DEntityLoadPatchCaller(*this)); } bool* DEntity::BuildIntersectList() @@ -253,15 +313,15 @@ bool* DEntity::BuildIntersectList() bool* pbIntList = new bool[max]; memset(pbIntList, 0, sizeof(bool)*(max)); - for(list::const_iterator pB1=brushList.begin(); pB1!=brushList.end(); pB1++) + for(std::list::const_iterator pB1=brushList.begin(); pB1!=brushList.end(); pB1++) { - list::const_iterator pB2=pB1; + std::list::const_iterator pB2=pB1; for(pB2++; pB2!=brushList.end(); pB2++) { if((*pB1)->IntersectsWith((*pB2))) { - pbIntList[(*pB1)->m_nBrushID] = TRUE; - pbIntList[(*pB2)->m_nBrushID] = TRUE; + pbIntList[(*pB1)->m_nBrushID] = true; + pbIntList[(*pB2)->m_nBrushID] = true; } } } @@ -278,15 +338,15 @@ bool* DEntity::BuildDuplicateList() bool* pbDupList = new bool[max]; memset(pbDupList, 0, sizeof(bool)*(max)); - for(list::const_iterator pB1=brushList.begin(); pB1!=brushList.end(); pB1++) + for(std::list::const_iterator pB1=brushList.begin(); pB1!=brushList.end(); pB1++) { - list::const_iterator pB2=pB1; + std::list::const_iterator pB2=pB1; for(pB2++; pB2!=brushList.end(); pB2++) { if(**pB1 == *pB2) { - pbDupList[(*pB1)->m_nBrushID] = TRUE; - pbDupList[(*pB2)->m_nBrushID] = TRUE; + pbDupList[(*pB1)->m_nBrushID] = true; + pbDupList[(*pB2)->m_nBrushID] = true; } } } @@ -299,81 +359,87 @@ void DEntity::SelectBrushes(bool *selectList) if(selectList == NULL) return; - g_FuncTable.m_pfnDeselectAllBrushes(); + GlobalSelectionSystem().setSelectedAll(false); - g_FuncTable.m_pfnAllocateActiveBrushHandles(); + scene::Path path(NodeReference(GlobalSceneGraph().root())); + path.push(NodeReference(*QER_Entity)); for(std::list::const_iterator pBrush=brushList.begin(); pBrush!=brushList.end(); pBrush++) { if(selectList[(*pBrush)->m_nBrushID]) - g_FuncTable.m_pfnSelectBrush((*pBrush)->QER_brush); + { + path.push(NodeReference(*(*pBrush)->QER_brush)); + Instance_getSelectable(*GlobalSceneGraph().find(path))->setSelected(true); + path.pop(); + } } - g_FuncTable.m_pfnReleaseActiveBrushHandles(); -} - -bool DEntity::LoadFromEntity(int id, bool bLoadPatches) { - return LoadFromEntity((entity_t*)g_FuncTable.m_pfnGetEntityHandle(id), bLoadPatches); } -bool DEntity::LoadFromEntity(entity_t* ent, bool bLoadPatches) { +bool DEntity::LoadFromEntity(scene::Node& ent, bool bLoadPatches) { ClearPatches(); ClearBrushes(); ClearEPairs(); - QER_Entity = ent; + QER_Entity = &ent; - epair_t* epl = *g_EntityTable.m_pfnGetEntityKeyValList(QER_Entity); - LoadEPairList(epl); + LoadEPairList(Node_getEntity(ent)); - bool keep = FALSE; + bool keep = false; int i; for(i = 0; brushEntityList[i]; i++) { - if(!stricmp(brushEntityList[i], m_Classname)) + if(string_equal_nocase(brushEntityList[i], m_Classname)) { - keep = TRUE; + keep = true; break; } } if(!keep) - return FALSE; - - int count = g_FuncTable.m_pfnAllocateEntityBrushHandles(QER_Entity); - - for(i = 0; i < count; i++) - { - - brush_t *brush = (brush_t*)g_FuncTable.m_pfnGetEntityBrushHandle(i); + return false; - if(brush == NULL) { - DoMessageBox("GTKRadiant returned a NULL pointer, NOT a good sign", "WARNING!!!", MB_OK); - continue; - } + if(Node_getTraversable(ent)) + { + class load_brushes_t : public scene::Traversable::Walker + { + DEntity* m_entity; + mutable int m_count; + public: + load_brushes_t(DEntity* entity) + : m_entity(entity), m_count(0) + { + } + bool pre(scene::Node& node) const + { + scene::Path path(NodeReference(GlobalSceneGraph().root())); + path.push(NodeReference(*m_entity->QER_Entity)); + path.push(NodeReference(node)); + scene::Instance* instance = GlobalSceneGraph().find(path); + ASSERT_MESSAGE(instance != 0, ""); - if(brush->pPatch) - { - if(bLoadPatches) - { - DPatch* loadPatch = NewPatch(); - loadPatch->LoadFromBrush_t(brush); - } - } - else - { - DBrush* loadBrush = NewBrush(i); - loadBrush->LoadFromBrush_t(brush, TRUE); - } - } + if(Node_isPatch(node)) + { + DPatch* loadPatch = m_entity->NewPatch(); + loadPatch->LoadFromPatch(*instance); + } + else if(Node_isBrush(node)) + { + DBrush* loadBrush = m_entity->NewBrush(m_count++); + loadBrush->LoadFromBrush(*instance, true); + } + return false; + } + } load_brushes(this); - g_FuncTable.m_pfnReleaseEntityBrushHandles(); + Node_getTraversable(ent)->traverse(load_brushes); + } - return TRUE; + return true; } -void DEntity::RemoveNonCheckBrushes(list* exclusionList, bool useDetail) +void DEntity::RemoveNonCheckBrushes(std::list* exclusionList, bool useDetail) { - list::iterator chkBrush=brushList.begin(); + std::list::iterator chkBrush=brushList.begin(); while( chkBrush!=brushList.end() ) { @@ -387,7 +453,7 @@ void DEntity::RemoveNonCheckBrushes(list* exclusionList, bool useDetail) } } - list::iterator eTexture; + std::list::iterator eTexture; for( eTexture=exclusionList->begin(); eTexture!=exclusionList->end(); eTexture++ ) { @@ -404,38 +470,24 @@ void DEntity::RemoveNonCheckBrushes(list* exclusionList, bool useDetail) } } -void DEntity::ResetChecks(list* exclusionList) +void DEntity::ResetChecks(std::list* exclusionList) { - for(list::const_iterator resetBrush=brushList.begin(); resetBrush!=brushList.end(); resetBrush++) + for(std::list::const_iterator resetBrush=brushList.begin(); resetBrush!=brushList.end(); resetBrush++) { (*resetBrush)->ResetChecks(exclusionList); } } -int DEntity::FixBrushes(bool rebuild) +int DEntity::FixBrushes() { - g_FuncTable.m_pfnAllocateActiveBrushHandles(); - - int cnt = 0; + int count = 0; - for(list::const_iterator fixBrush=brushList.begin(); fixBrush!=brushList.end(); fixBrush++) + for(std::list::const_iterator fixBrush=brushList.begin(); fixBrush!=brushList.end(); fixBrush++) { - int count = (*fixBrush)->RemoveRedundantPlanes(); - if(count) - { - cnt += count; - if(rebuild) - { - g_FuncTable.m_pfnDeleteBrushHandle((*fixBrush)->QER_brush); - - (*fixBrush)->BuildInRadiant(FALSE, NULL); - } - } + count += (*fixBrush)->RemoveRedundantPlanes(); } - g_FuncTable.m_pfnReleaseActiveBrushHandles(); - - return cnt; + return count; } void DEntity::BuildInRadiant(bool allowDestruction) @@ -444,35 +496,29 @@ void DEntity::BuildInRadiant(bool allowDestruction) if(makeEntity) { - entity_t* pE = (entity_t*)g_FuncTable.m_pfnCreateEntityHandle(); - - epair_t* pEpS = GetNextChainItem(NULL, "classname", m_Classname); + NodeSmartReference node(GlobalEntityCreator().createEntity(GlobalEntityClassManager().findOrInsert(m_Classname.GetBuffer(), !brushList.empty() || !patchList.empty()))); - epair_t* pEp = pEpS; - - for(list::const_iterator buildEPair=epairList.begin(); buildEPair!=epairList.end(); buildEPair++) + for(std::list::const_iterator buildEPair=epairList.begin(); buildEPair!=epairList.end(); buildEPair++) { - pEp = GetNextChainItem(pEp, (*buildEPair)->key, (*buildEPair)->value); + Node_getEntity(node)->setKeyValue((*buildEPair)->key, (*buildEPair)->value); } - g_EntityTable.m_pfnSetEntityKeyValList(pE, pEpS); - - g_FuncTable.m_pfnCommitEntityHandleToMap(pE); + Node_getTraversable(GlobalSceneGraph().root())->insert(node); - for(list::const_iterator buildBrush=brushList.begin(); buildBrush!=brushList.end(); buildBrush++) - (*buildBrush)->BuildInRadiant(allowDestruction, NULL, pE); + for(std::list::const_iterator buildBrush=brushList.begin(); buildBrush!=brushList.end(); buildBrush++) + (*buildBrush)->BuildInRadiant(allowDestruction, NULL, node.get_pointer()); - for(list::const_iterator buildPatch=patchList.begin(); buildPatch!=patchList.end(); buildPatch++) - (*buildPatch)->BuildInRadiant(pE); + for(std::list::const_iterator buildPatch=patchList.begin(); buildPatch!=patchList.end(); buildPatch++) + (*buildPatch)->BuildInRadiant(node.get_pointer()); - QER_Entity = pE; + QER_Entity = node.get_pointer(); } else { - for(list::const_iterator buildBrush=brushList.begin(); buildBrush!=brushList.end(); buildBrush++) + for(std::list::const_iterator buildBrush=brushList.begin(); buildBrush!=brushList.end(); buildBrush++) (*buildBrush)->BuildInRadiant(allowDestruction, NULL); - for(list::const_iterator buildPatch=patchList.begin(); buildPatch!=patchList.end(); buildPatch++) + for(std::list::const_iterator buildPatch=patchList.begin(); buildPatch!=patchList.end(); buildPatch++) (*buildPatch)->BuildInRadiant(); } } @@ -481,14 +527,14 @@ void DEntity::BuildInRadiant(bool allowDestruction) int DEntity::GetIDMax( void ) { int max = -1; - for(list::const_iterator cntBrush=brushList.begin(); cntBrush!=brushList.end(); cntBrush++) { + for(std::list::const_iterator cntBrush=brushList.begin(); cntBrush!=brushList.end(); cntBrush++) { if((*cntBrush)->m_nBrushID > max) max = (*cntBrush)->m_nBrushID; } return max+1; } -void DEntity::SetClassname( char *classname ) { +void DEntity::SetClassname( const char *classname ) { m_Classname = classname; } @@ -498,12 +544,12 @@ void DEntity::SaveToFile(FILE *pFile) fprintf(pFile, "\"classname\" \"%s\"\n", (const char *)m_Classname); - for(list::const_iterator ep=epairList.begin(); ep!=epairList.end(); ep++) + for(std::list::const_iterator ep=epairList.begin(); ep!=epairList.end(); ep++) { fprintf(pFile, "\"%s\" \"%s\"\n", (const char *)(*ep)->key, (const char *)(*ep)->value); } - for(list::const_iterator bp=brushList.begin(); bp!=brushList.end(); bp++) + for(std::list::const_iterator bp=brushList.begin(); bp!=brushList.end(); bp++) { (*bp)->SaveToFile(pFile); } @@ -513,14 +559,14 @@ void DEntity::SaveToFile(FILE *pFile) void DEntity::ClearEPairs() { - for(list::const_iterator deadEPair=epairList.begin(); deadEPair!=epairList.end(); deadEPair++) + for(std::list::const_iterator deadEPair=epairList.begin(); deadEPair!=epairList.end(); deadEPair++) { delete (*deadEPair); } epairList.clear(); } -void DEntity::AddEPair(char *key, char *value) { +void DEntity::AddEPair(const char *key, const char *value) { DEPair* newEPair; newEPair = FindEPairByKey( key ); if(!newEPair) { @@ -532,79 +578,74 @@ void DEntity::AddEPair(char *key, char *value) { } } -void DEntity::LoadEPairList(epair_t *epl) +void DEntity::LoadEPairList(Entity *epl) { - epair_t* ep = epl; - while(ep) - { - if(!strcmp(ep->key, "classname")) - SetClassname(ep->value); - else - AddEPair(ep->key, ep->value); + class load_epairs_t : public Entity::Visitor + { + DEntity* m_entity; + public: + load_epairs_t(DEntity* entity) + : m_entity(entity) + { + } + void visit(const char* key, const char* value) + { + if(strcmp(key, "classname") == 0) + m_entity->SetClassname(value); + else + m_entity->AddEPair(key, value); + } - ep = ep->next; - } + } load_epairs(this); + + epl->forEachKeyValue(load_epairs); } bool DEntity::ResetTextures(const char* textureName, float fScale[2], float fShift[2], int rotation, const char* newTextureName, int bResetTextureName, int bResetScale[2], int bResetShift[2], int bResetRotation, bool rebuild) { - g_FuncTable.m_pfnDeselectAllBrushes(); + bool reset = false; - g_FuncTable.m_pfnAllocateActiveBrushHandles(); - - bool reset = FALSE; - - for(list::const_iterator resetBrush=brushList.begin(); resetBrush!=brushList.end(); resetBrush++) + for(std::list::const_iterator resetBrush=brushList.begin(); resetBrush!=brushList.end(); resetBrush++) { bool tmp = (*resetBrush)->ResetTextures(textureName, fScale, fShift, rotation, newTextureName, bResetTextureName, bResetScale, bResetShift, bResetRotation); if(tmp) { - reset = TRUE; - + reset = true; if(rebuild) { - entity_t *pE = (*resetBrush)->QER_brush->owner; - g_FuncTable.m_pfnDeleteBrushHandle((*resetBrush)->QER_brush); - (*resetBrush)->BuildInRadiant(FALSE, NULL, pE->entityId == 0 ? NULL : pE); - - if( pE->entityId == 0 ? NULL : pE ) - { - } + Node_getTraversable(*(*resetBrush)->QER_entity)->erase(*(*resetBrush)->QER_brush); + (*resetBrush)->BuildInRadiant(false, NULL, (*resetBrush)->QER_entity); } } } if(bResetTextureName) { - for(list::const_iterator resetPatch=patchList.begin(); resetPatch!=patchList.end(); resetPatch++) + for(std::list::const_iterator resetPatch=patchList.begin(); resetPatch!=patchList.end(); resetPatch++) { bool tmp = (*resetPatch)->ResetTextures(textureName, newTextureName); if(tmp) { - reset = TRUE; - + reset = true; if(rebuild) { - entity_t *pE = (*resetPatch)->QER_brush->owner; - g_FuncTable.m_pfnDeleteBrushHandle((*resetPatch)->QER_brush); - (*resetPatch)->BuildInRadiant(pE->entityId == 0 ? NULL : pE); + Node_getTraversable(*(*resetPatch)->QER_entity)->erase(*(*resetPatch)->QER_brush); + (*resetPatch)->BuildInRadiant((*resetPatch)->QER_entity); } } } } - g_FuncTable.m_pfnReleaseActiveBrushHandles(); - return reset; } DEPair* DEntity::FindEPairByKey(const char* keyname) { - for(list::const_iterator ep=epairList.begin(); ep!=epairList.end(); ep++) + for(std::list::const_iterator ep=epairList.begin(); ep!=epairList.end(); ep++) { char* c = (*ep)->key; if(!strcmp(c, keyname)) @@ -615,7 +656,7 @@ DEPair* DEntity::FindEPairByKey(const char* keyname) void DEntity::RemoveFromRadiant() { - g_EntityTable.m_pfnEntity_Free( (entity_t*)QER_Entity ); + Node_getTraversable(GlobalSceneGraph().root())->erase(*QER_Entity); QER_Entity = NULL; } @@ -644,9 +685,9 @@ void DEntity::SpawnFloat(const char* key, const char* defaultstring, float* out) { DEPair* pEP = FindEPairByKey(key); if(pEP) { - *out = static_cast< float >( atof( pEP->value ) ); + *out = static_cast(atof(pEP->value)); } else { - *out = static_cast< float >( atof(defaultstring) ); + *out = static_cast(atof(defaultstring)); } } @@ -661,13 +702,13 @@ void DEntity::SpawnVector(const char* key, const char* defaultstring, vec_t* out } int DEntity::GetBrushCount( void ) { - return brushList.size(); + return static_cast(brushList.size()); } -DBrush* DEntity::FindBrushByPointer( brush_t* brush ) { - for(list::const_iterator listBrush = brushList.begin(); listBrush != brushList.end(); listBrush++) { +DBrush* DEntity::FindBrushByPointer( scene::Node& brush ) { + for(std::list::const_iterator listBrush = brushList.begin(); listBrush != brushList.end(); listBrush++) { DBrush* pBrush = (*listBrush); - if(pBrush->QER_brush == brush) { + if(pBrush->QER_brush == &brush) { return pBrush; } }