]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - contrib/bobtoolz/DMap.cpp
Merge branch 'NateEag-master-patch-12920' into 'master'
[xonotic/netradiant.git] / contrib / bobtoolz / DMap.cpp
index 3f70d5ee19d4f626f63a2ef628b2e1415e8b1e03..18edc3b1fee51870082c1336f6a43ab908b23d08 100644 (file)
 //
 //////////////////////////////////////////////////////////////////////
 
-#include "StdAfx.h"
 #include "DMap.h"
 
+#include "str.h"
+#include <list>
+
+#include "DPoint.h"
+#include "DPlane.h"
+#include "DBrush.h"
+#include "DEPair.h"
+#include "DPatch.h"
+#include "DEntity.h"
+
+#include "iundo.h"
+
+#include "generic/referencecounted.h"
+
+#include <vector>
+#include <list>
+#include <map>
+#include <algorithm>
+
+#include "scenelib.h"
+
 
 //////////////////////////////////////////////////////////////////////
 // Construction/Destruction
@@ -38,7 +58,7 @@ DMap::~DMap(){
        ClearEntities();
 }
 
-DEntity* DMap::AddEntity( char *classname, int ID ){
+DEntity* DMap::AddEntity( const char *classname, int ID ){
        DEntity* newEntity;
        if ( ID == -1 ) {
                newEntity = new DEntity( classname, m_nNextEntity++ );
@@ -55,7 +75,7 @@ DEntity* DMap::AddEntity( char *classname, int ID ){
 void DMap::ClearEntities(){
        m_nNextEntity = 1;
 
-       for ( list<DEntity *>::const_iterator deadEntity = entityList.begin(); deadEntity != entityList.end(); deadEntity++ )
+       for ( std::list<DEntity *>::const_iterator deadEntity = entityList.begin(); deadEntity != entityList.end(); deadEntity++ )
                delete *deadEntity;
 
        entityList.clear();
@@ -64,7 +84,7 @@ void DMap::ClearEntities(){
 DEntity* DMap::GetEntityForID( int ID ){
        DEntity* findEntity = NULL;
 
-       for ( list<DEntity *>::const_iterator chkEntity = entityList.begin(); chkEntity != entityList.end(); chkEntity++ )
+       for ( std::list<DEntity *>::const_iterator chkEntity = entityList.begin(); chkEntity != entityList.end(); chkEntity++ )
        {
                if ( ( *chkEntity )->m_nID == ID ) {
                        findEntity = ( *chkEntity );
@@ -85,54 +105,40 @@ DEntity* DMap::GetWorldSpawn(){
 }
 
 void DMap::BuildInRadiant( bool bAllowDestruction ){
-       for ( list<DEntity *>::const_iterator buildEntity = entityList.begin(); buildEntity != entityList.end(); buildEntity++ )
+       for ( std::list<DEntity *>::const_iterator buildEntity = entityList.begin(); buildEntity != entityList.end(); buildEntity++ )
                ( *buildEntity )->BuildInRadiant( bAllowDestruction );
 }
 
 void DMap::LoadAll( bool bLoadPatches ){
        ClearEntities();
 
-       g_FuncTable.m_pfnDeselectAllBrushes();
+       GlobalSelectionSystem().setSelectedAll( false );
 
-       int count = g_FuncTable.m_pfnGetEntityCount();
-
-       for ( int i = 0; i < count; i++ )
+       class load_entities_t : public scene::Traversable::Walker
        {
-               DEntity* loadEntity;
-
-               if ( i == 0 ) {
-                       loadEntity = GetWorldSpawn();
-               }
-               else{
-                       loadEntity = AddEntity( "", m_nNextEntity++ );
-               }
-
-               if ( !loadEntity->LoadFromEntity( i, bLoadPatches ) ) {
-                       delete loadEntity;
-                       entityList.pop_back();
+       DMap* m_map;
+       bool m_bLoadPatches;
+public:
+       load_entities_t( DMap* map, bool bLoadPatches )
+               : m_map( map ), m_bLoadPatches( bLoadPatches ){
+       }
+       bool pre( scene::Node& node ) const {
+               if ( Node_isEntity( node ) ) {
+                       DEntity* loadEntity = m_map->AddEntity( "", 0 );
+                       loadEntity->LoadFromEntity( node, m_bLoadPatches );
                }
+               return false;
        }
+       } load_entities( this, bLoadPatches );
+
+       Node_getTraversable( GlobalSceneGraph().root() )->traverse( load_entities );
 }
 
-int DMap::FixBrushes( bool rebuild ){
+int DMap::FixBrushes(){
        int count = 0;
-       for ( list<DEntity *>::const_iterator fixEntity = entityList.begin(); fixEntity != entityList.end(); fixEntity++ )
+       for ( std::list<DEntity *>::const_iterator fixEntity = entityList.begin(); fixEntity != entityList.end(); fixEntity++ )
        {
-               int cnt;
-
-               if ( !stricmp( "worldspawn", ( *fixEntity )->m_Classname ) ) {
-                       cnt = ( *fixEntity )->FixBrushes( rebuild );
-               }
-               else
-               {
-                       cnt = ( *fixEntity )->FixBrushes( FALSE );
-
-                       if ( cnt && rebuild ) {
-                               RebuildEntity( *fixEntity );
-                       }
-               }
-
-               count += cnt;
+               count += ( *fixEntity )->FixBrushes();
        }
 
        return count;
@@ -140,16 +146,16 @@ int DMap::FixBrushes( bool rebuild ){
 
 void DMap::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 ){
-       for ( list<DEntity *>::const_iterator texEntity = entityList.begin(); texEntity != entityList.end(); texEntity++ )
+       for ( std::list<DEntity *>::const_iterator texEntity = entityList.begin(); texEntity != entityList.end(); texEntity++ )
        {
-               if ( !stricmp( "worldspawn", ( *texEntity )->m_Classname ) ) {
+               if ( string_equal_nocase( "worldspawn", ( *texEntity )->m_Classname ) ) {
                        ( *texEntity )->ResetTextures( textureName,        fScale,       fShift,       rotation, newTextureName,
-                                                                                  bResetTextureName,  bResetScale,  bResetShift,  bResetRotation, TRUE );
+                                                                                  bResetTextureName,  bResetScale,  bResetShift,  bResetRotation, true );
                }
                else
                {
                        if ( ( *texEntity )->ResetTextures( textureName,        fScale,       fShift,       rotation, newTextureName,
-                                                                                               bResetTextureName,  bResetScale,  bResetShift,  bResetRotation, FALSE ) ) {
+                                                                                               bResetTextureName,  bResetScale,  bResetShift,  bResetRotation, false ) ) {
                                RebuildEntity( *texEntity );
                        }
                }
@@ -158,5 +164,5 @@ void DMap::ResetTextures( const char* textureName, float fScale[2],      float f
 
 void DMap::RebuildEntity( DEntity *ent ){
        ent->RemoveFromRadiant();
-       ent->BuildInRadiant( FALSE );
+       ent->BuildInRadiant( false );
 }