std::list<Str> exclusionList; // whole brush exclusion
std::list<Str> exclusionList_Face; // single face exclusion
-bool el1Loaded = false;
-bool el2Loaded = false;
-bool clrLst1Loaded = false;
-bool clrLst2Loaded = false;
-
-DBobView *g_PathView = NULL;
-DVisDrawer *g_VisView = NULL;
-DTrainDrawer *g_TrainView = NULL;
-DTreePlanter *g_TreePlanter = NULL;
+bool el1Loaded = false;
+bool el2Loaded = false;
+bool clrLst1Loaded = false;
+bool clrLst2Loaded = false;
+
+DBobView* g_PathView = NULL;
+DVisDrawer* g_VisView = NULL;
+DTrainDrawer* g_TrainView = NULL;
+DTreePlanter* g_TreePlanter = NULL;
// -------------
//========================//
// Helper Functions //
//========================//
-void LoadLists()
-{
- char buffer[256];
+void LoadLists(){
+ char buffer[256];
- if (!el1Loaded) {
- el1Loaded = LoadExclusionList(GetFilename(buffer, "bt/bt-el1.txt"), &exclusionList);
- }
- if (!el2Loaded) {
- el2Loaded = LoadExclusionList(GetFilename(buffer, "bt/bt-el2.txt"), &exclusionList_Face);
- }
+ if ( !el1Loaded ) {
+ el1Loaded = LoadExclusionList( GetFilename( buffer, "bt/bt-el1.txt" ), &exclusionList );
+ }
+ if ( !el2Loaded ) {
+ el2Loaded = LoadExclusionList( GetFilename( buffer, "bt/bt-el2.txt" ), &exclusionList_Face );
+ }
}
// Main Functions //
//========================//
-void DoIntersect()
-{
- UndoableCommand undo("bobToolz.intersect");
- IntersectRS rs;
-
- if (DoIntersectBox(&rs) == eIDCANCEL) {
- return;
- }
-
- if (rs.nBrushOptions == BRUSH_OPT_SELECTED) {
- if (GlobalSelectionSystem().countSelected() < 2) {
- //DoMessageBox("Invalid number of brushes selected, choose at least 2", "Error", eMB_OK);
- globalErrorStream() << "bobToolz Intersect: Invalid number of brushes selected, choose at least 2.\n";
- return;
- }
- }
-
- DEntity world;
- switch (rs.nBrushOptions) {
- case BRUSH_OPT_SELECTED: {
-
- world.LoadFromEntity(GlobalRadiant().getMapWorldEntity(), false);
- world.LoadSelectedBrushes();
- break;
- }
- case BRUSH_OPT_WHOLE_MAP: {
- world.LoadFromEntity(GlobalRadiant().getMapWorldEntity(), false);
- break;
- }
- }
- world.RemoveNonCheckBrushes(&exclusionList, rs.bUseDetail);
-
- bool *pbSelectList;
- if (rs.bDuplicateOnly) {
- pbSelectList = world.BuildDuplicateList();
- } else {
- pbSelectList = world.BuildIntersectList();
- }
-
- world.SelectBrushes(pbSelectList);
- int brushCount = GlobalSelectionSystem().countSelected();
- globalOutputStream() << "bobToolz Intersect: " << brushCount << " intersecting brushes found.\n";
- delete[] pbSelectList;
+void DoIntersect(){
+ UndoableCommand undo( "bobToolz.intersect" );
+ IntersectRS rs;
+
+ if ( DoIntersectBox( &rs ) == eIDCANCEL ) {
+ return;
+ }
+
+ if ( rs.nBrushOptions == BRUSH_OPT_SELECTED ) {
+ if ( GlobalSelectionSystem().countSelected() < 2 ) {
+ //DoMessageBox("Invalid number of brushes selected, choose at least 2", "Error", eMB_OK);
+ globalErrorStream() << "bobToolz Intersect: Invalid number of brushes selected, choose at least 2.\n";
+ return;
+ }
+ }
+
+ DEntity world;
+ switch ( rs.nBrushOptions )
+ {
+ case BRUSH_OPT_SELECTED:
+ {
+
+ world.LoadFromEntity( GlobalRadiant().getMapWorldEntity(), false );
+ world.LoadSelectedBrushes();
+ break;
+ }
+ case BRUSH_OPT_WHOLE_MAP:
+ {
+ world.LoadFromEntity( GlobalRadiant().getMapWorldEntity(), false );
+ break;
+ }
+ }
+ world.RemoveNonCheckBrushes( &exclusionList, rs.bUseDetail );
+
+ bool* pbSelectList;
+ if ( rs.bDuplicateOnly ) {
+ pbSelectList = world.BuildDuplicateList();
+ }
+ else{
+ pbSelectList = world.BuildIntersectList();
+ }
+
+ world.SelectBrushes( pbSelectList );
+ int brushCount = GlobalSelectionSystem().countSelected();
+ globalOutputStream() << "bobToolz Intersect: " << brushCount << " intersecting brushes found.\n";
+ delete[] pbSelectList;
}
-void DoPolygonsTB()
-{
- DoPolygons();
+void DoPolygonsTB(){
+ DoPolygons();
}
-void DoPolygons()
-{
- UndoableCommand undo("bobToolz.polygons");
- // ensure we have something selected
- if (GlobalSelectionSystem().countSelected() != 1) {
- //DoMessageBox("Invalid number of brushes selected, choose 1 only", "Error", eMB_OK);
- globalErrorStream() << "bobToolz Polygons: Invalid number of brushes selected, choose 1 only.\n";
- return;
- }
-
- PolygonRS rs;
- scene::Instance &instance = GlobalSelectionSystem().ultimateSelected();
- if (!Node_isBrush(instance.path().top())) {
- //DoMessageBox("No brush selected, select ONLY one brush", "Error", eMB_OK);
- globalErrorStream() << "bobToolz Polygons: No brush selected, select ONLY one brush.\n";
- return;
- }
- // ask user for type, size, etc....
- if (DoPolygonBox(&rs) == eIDOK) {
- DShape poly;
-
- vec3_t vMin, vMax;
-
- {
-
- VectorSubtract(instance.worldAABB().origin, instance.worldAABB().extents, vMin);
- VectorAdd(instance.worldAABB().origin, instance.worldAABB().extents, vMax);
-
- Path_deleteTop(instance.path());
- }
-
- if (rs.bInverse) {
- poly.BuildInversePrism(vMin, vMax, rs.nSides, rs.bAlignTop);
- } else {
- if (rs.bUseBorder) {
- poly.BuildBorderedPrism(vMin, vMax, rs.nSides, rs.nBorderWidth, rs.bAlignTop);
- } else {
- poly.BuildRegularPrism(vMin, vMax, rs.nSides, rs.bAlignTop);
- }
-
- }
-
- poly.Commit();
- }
+void DoPolygons(){
+ UndoableCommand undo( "bobToolz.polygons" );
+ // ensure we have something selected
+ if ( GlobalSelectionSystem().countSelected() != 1 ) {
+ //DoMessageBox("Invalid number of brushes selected, choose 1 only", "Error", eMB_OK);
+ globalErrorStream() << "bobToolz Polygons: Invalid number of brushes selected, choose 1 only.\n";
+ return;
+ }
+
+ PolygonRS rs;
+ scene::Instance& instance = GlobalSelectionSystem().ultimateSelected();
+ if ( !Node_isBrush( instance.path().top() ) ) {
+ //DoMessageBox("No brush selected, select ONLY one brush", "Error", eMB_OK);
+ globalErrorStream() << "bobToolz Polygons: No brush selected, select ONLY one brush.\n";
+ return;
+ }
+ // ask user for type, size, etc....
+ if ( DoPolygonBox( &rs ) == eIDOK ) {
+ DShape poly;
+
+ vec3_t vMin, vMax;
+
+ {
+
+ VectorSubtract( instance.worldAABB().origin, instance.worldAABB().extents, vMin );
+ VectorAdd( instance.worldAABB().origin, instance.worldAABB().extents, vMax );
+
+ Path_deleteTop( instance.path() );
+ }
+
+ if ( rs.bInverse ) {
+ poly.BuildInversePrism( vMin, vMax, rs.nSides, rs.bAlignTop );
+ }
+ else
+ {
+ if ( rs.bUseBorder ) {
+ poly.BuildBorderedPrism( vMin, vMax, rs.nSides, rs.nBorderWidth, rs.bAlignTop );
+ }
+ else{
+ poly.BuildRegularPrism( vMin, vMax, rs.nSides, rs.bAlignTop );
+ }
+
+ }
+
+ poly.Commit();
+ }
}
-void DoFixBrushes()
-{
- UndoableCommand undo("bobToolz.fixBrushes");
- DMap world;
- world.LoadAll();
+void DoFixBrushes(){
+ UndoableCommand undo( "bobToolz.fixBrushes" );
+ DMap world;
+ world.LoadAll();
- int count = world.FixBrushes();
+ int count = world.FixBrushes();
- globalOutputStream() << "bobToolz FixBrushes: " << count << " invalid/duplicate planes removed.\n";
+ globalOutputStream() << "bobToolz FixBrushes: " << count << " invalid/duplicate planes removed.\n";
}
-void DoResetTextures()
-{
- UndoableCommand undo("bobToolz.resetTextures");
- static ResetTextureRS rs;
-
- const char *texName;
- if (1 /*g_SelectedFaceTable.m_pfnGetSelectedFaceCount() != 1*/ ) {
- texName = NULL;
- } else {
- texName = GetCurrentTexture();
- strcpy(rs.textureName, GetCurrentTexture());
- }
-
- EMessageBoxReturn ret;
- if ((ret = DoResetTextureBox(&rs)) == eIDCANCEL) {
- return;
- }
-
- if (rs.bResetTextureName) {
- texName = rs.textureName;
- }
-
- if (ret == eIDOK) {
- DEntity world;
- world.LoadSelectedBrushes();
- world.ResetTextures(texName, rs.fScale, rs.fShift, rs.rotation, rs.newTextureName,
- rs.bResetTextureName, rs.bResetScale, rs.bResetShift, rs.bResetRotation, true);
- } else {
- DMap world;
- world.LoadAll(true);
- world.ResetTextures(texName, rs.fScale, rs.fShift, rs.rotation, rs.newTextureName,
- rs.bResetTextureName, rs.bResetScale, rs.bResetShift, rs.bResetRotation);
- }
+void DoResetTextures(){
+ UndoableCommand undo( "bobToolz.resetTextures" );
+ static ResetTextureRS rs;
+
+ const char* texName;
+ if ( 1 /*g_SelectedFaceTable.m_pfnGetSelectedFaceCount() != 1*/ ) {
+ texName = NULL;
+ }
+ else
+ {
+ texName = GetCurrentTexture();
+ strcpy( rs.textureName, GetCurrentTexture() );
+ }
+
+ EMessageBoxReturn ret;
+ if ( ( ret = DoResetTextureBox( &rs ) ) == eIDCANCEL ) {
+ return;
+ }
+
+ if ( rs.bResetTextureName ) {
+ texName = rs.textureName;
+ }
+
+ if ( ret == eIDOK ) {
+ DEntity world;
+ world.LoadSelectedBrushes();
+ world.ResetTextures( texName, rs.fScale, rs.fShift, rs.rotation, rs.newTextureName,
+ rs.bResetTextureName, rs.bResetScale, rs.bResetShift, rs.bResetRotation, true );
+ }
+ else
+ {
+ DMap world;
+ world.LoadAll( true );
+ world.ResetTextures( texName, rs.fScale, rs.fShift, rs.rotation, rs.newTextureName,
+ rs.bResetTextureName, rs.bResetScale, rs.bResetShift, rs.bResetRotation );
+ }
}
-void DoBuildStairs()
-{
- UndoableCommand undo("bobToolz.buildStairs");
- BuildStairsRS rs;
-
- strcpy(rs.mainTexture, GetCurrentTexture());
-
- // ensure we have something selected
- if (GlobalSelectionSystem().countSelected() != 1) {
- //DoMessageBox("Invalid number of brushes selected, choose 1 only", "Error", eMB_OK);
- globalErrorStream() << "bobToolz BuildStairs: Invalid number of brushes selected, choose 1 only.\n";
- return;
- }
-
- // ask user for type, size, etc....
- if (DoBuildStairsBox(&rs) == eIDOK) {
- vec3_t vMin, vMax;
-
- {
- scene::Instance &instance = GlobalSelectionSystem().ultimateSelected();
- VectorSubtract(instance.worldAABB().origin, instance.worldAABB().extents, vMin);
- VectorAdd(instance.worldAABB().origin, instance.worldAABB().extents, vMax);
- }
-
- // calc brush size
- vec3_t size;
- VectorSubtract(vMax, vMin, size);
-
- if (((int) size[2] % rs.stairHeight) != 0) {
- // stairs must fit evenly into brush
- //DoMessageBox("Invalid stair height\nHeight of block must be divisable by stair height", "Error", eMB_OK);
- globalErrorStream()
- << "bobToolz BuildStairs: Invalid stair height. Height of block must be divisable by stair height.\n";
- } else {
- {
- scene::Instance &instance = GlobalSelectionSystem().ultimateSelected();
- Path_deleteTop(instance.path());
- }
-
- // Get Step Count
- int numSteps = (int) size[2] / rs.stairHeight;
-
- if (rs.style == STYLE_CORNER) {
- BuildCornerStairs(vMin, vMax, numSteps, rs.mainTexture, rs.riserTexture);
- } else {
-
- // Get Step Dimensions
- float stairHeight = (float) rs.stairHeight;
- float stairWidth;
- if ((rs.direction == MOVE_EAST) || (rs.direction == MOVE_WEST)) {
- stairWidth = (size[0]) / numSteps;
- } else {
- stairWidth = (size[1]) / numSteps;
- }
-
-
- // Build Base For Stair (bob's style)
- if (rs.style == STYLE_BOB) {
- Build_Wedge(rs.direction, vMin, vMax, true);
- }
-
-
- // Set First Step Starting Position
- vMax[2] = vMin[2] + stairHeight;
- SetInitialStairPos(rs.direction, vMin, vMax, stairWidth);
-
-
- // Build The Steps
- for (int i = 0; i < numSteps; i++) {
- if (rs.style == STYLE_BOB) {
- Build_StairStep_Wedge(rs.direction, vMin, vMax, rs.mainTexture, rs.riserTexture, rs.bUseDetail);
- } else if (rs.style == STYLE_ORIGINAL) {
- Build_StairStep(vMin, vMax, rs.mainTexture, rs.riserTexture, rs.direction);
- }
-
- // get step into next position
- MoveBlock(rs.direction, vMin, vMax, stairWidth);
- vMax[2] += stairHeight;
- if (rs.style == STYLE_BOB) {
- vMin[2] += stairHeight; // wedge bottom must be raised
- }
- }
- }
- }
- }
+void DoBuildStairs(){
+ UndoableCommand undo( "bobToolz.buildStairs" );
+ BuildStairsRS rs;
+
+ strcpy( rs.mainTexture, GetCurrentTexture() );
+
+ // ensure we have something selected
+ if ( GlobalSelectionSystem().countSelected() != 1 ) {
+ //DoMessageBox("Invalid number of brushes selected, choose 1 only", "Error", eMB_OK);
+ globalErrorStream() << "bobToolz BuildStairs: Invalid number of brushes selected, choose 1 only.\n";
+ return;
+ }
+
+ // ask user for type, size, etc....
+ if ( DoBuildStairsBox( &rs ) == eIDOK ) {
+ vec3_t vMin, vMax;
+
+ {
+ scene::Instance& instance = GlobalSelectionSystem().ultimateSelected();
+ VectorSubtract( instance.worldAABB().origin, instance.worldAABB().extents, vMin );
+ VectorAdd( instance.worldAABB().origin, instance.worldAABB().extents, vMax );
+ }
+
+ // calc brush size
+ vec3_t size;
+ VectorSubtract( vMax, vMin, size );
+
+ if ( ( (int)size[2] % rs.stairHeight ) != 0 ) {
+ // stairs must fit evenly into brush
+ //DoMessageBox("Invalid stair height\nHeight of block must be divisable by stair height", "Error", eMB_OK);
+ globalErrorStream() << "bobToolz BuildStairs: Invalid stair height. Height of block must be divisable by stair height.\n";
+ }
+ else
+ {
+ {
+ scene::Instance& instance = GlobalSelectionSystem().ultimateSelected();
+ Path_deleteTop( instance.path() );
+ }
+
+ // Get Step Count
+ int numSteps = (int)size[2] / rs.stairHeight;
+
+ if ( rs.style == STYLE_CORNER ) {
+ BuildCornerStairs( vMin, vMax, numSteps, rs.mainTexture, rs.riserTexture );
+ }
+ else
+ {
+
+ // Get Step Dimensions
+ float stairHeight = (float)rs.stairHeight;
+ float stairWidth;
+ if ( ( rs.direction == MOVE_EAST ) || ( rs.direction == MOVE_WEST ) ) {
+ stairWidth = ( size[0] ) / numSteps;
+ }
+ else{
+ stairWidth = ( size[1] ) / numSteps;
+ }
+
+
+ // Build Base For Stair (bob's style)
+ if ( rs.style == STYLE_BOB ) {
+ Build_Wedge( rs.direction, vMin, vMax, true );
+ }
+
+
+ // Set First Step Starting Position
+ vMax[2] = vMin[2] + stairHeight;
+ SetInitialStairPos( rs.direction, vMin, vMax, stairWidth );
+
+
+ // Build The Steps
+ for ( int i = 0; i < numSteps; i++ )
+ {
+ if ( rs.style == STYLE_BOB ) {
+ Build_StairStep_Wedge( rs.direction, vMin, vMax, rs.mainTexture, rs.riserTexture, rs.bUseDetail );
+ }
+ else if ( rs.style == STYLE_ORIGINAL ) {
+ Build_StairStep( vMin, vMax, rs.mainTexture, rs.riserTexture, rs.direction );
+ }
+
+ // get step into next position
+ MoveBlock( rs.direction, vMin, vMax, stairWidth );
+ vMax[2] += stairHeight;
+ if ( rs.style == STYLE_BOB ) {
+ vMin[2] += stairHeight; // wedge bottom must be raised
+ }
+ }
+ }
+ }
+ }
}
-void DoBuildDoors()
-{
- UndoableCommand undo("bobToolz.buildDoors");
- // ensure we have something selected
- if (GlobalSelectionSystem().countSelected() != 1) {
- //DoMessageBox("Invalid number of brushes selected, choose 1 only", "Error", eMB_OK);
- globalErrorStream() << "bobToolz BuildDoors: Invalid number of brushes selected, choose 1 only.\n";
- return;
- }
-
- DoorRS rs;
- strcpy(rs.mainTexture, GetCurrentTexture());
-
- if (DoDoorsBox(&rs) == eIDOK) {
- vec3_t vMin, vMax;
-
- {
- scene::Instance &instance = GlobalSelectionSystem().ultimateSelected();
- VectorSubtract(instance.worldAABB().origin, instance.worldAABB().extents, vMin);
- VectorAdd(instance.worldAABB().origin, instance.worldAABB().extents, vMax);
- Path_deleteTop(instance.path());
- }
-
- BuildDoorsX2(vMin, vMax,
- rs.bScaleMainH, rs.bScaleMainV,
- rs.bScaleTrimH, rs.bScaleTrimV,
- rs.mainTexture, rs.trimTexture,
- rs.nOrientation); // shapes.cpp
- }
+void DoBuildDoors(){
+ UndoableCommand undo( "bobToolz.buildDoors" );
+ // ensure we have something selected
+ if ( GlobalSelectionSystem().countSelected() != 1 ) {
+ //DoMessageBox("Invalid number of brushes selected, choose 1 only", "Error", eMB_OK);
+ globalErrorStream() << "bobToolz BuildDoors: Invalid number of brushes selected, choose 1 only.\n";
+ return;
+ }
+
+ DoorRS rs;
+ strcpy( rs.mainTexture, GetCurrentTexture() );
+
+ if ( DoDoorsBox( &rs ) == eIDOK ) {
+ vec3_t vMin, vMax;
+
+ {
+ scene::Instance& instance = GlobalSelectionSystem().ultimateSelected();
+ VectorSubtract( instance.worldAABB().origin, instance.worldAABB().extents, vMin );
+ VectorAdd( instance.worldAABB().origin, instance.worldAABB().extents, vMax );
+ Path_deleteTop( instance.path() );
+ }
+
+ BuildDoorsX2( vMin, vMax,
+ rs.bScaleMainH, rs.bScaleMainV,
+ rs.bScaleTrimH, rs.bScaleTrimV,
+ rs.mainTexture, rs.trimTexture,
+ rs.nOrientation ); // shapes.cpp
+ }
}
-void DoPathPlotter()
-{
- UndoableCommand undo("bobToolz.pathPlotter");
- PathPlotterRS rs;
- EMessageBoxReturn ret = DoPathPlotterBox(&rs);
- if (ret == eIDCANCEL) {
- return;
- }
- if (ret == eIDNO) {
- if (g_PathView) {
- delete g_PathView;
- }
- return;
- }
-
- // ensure we have something selected
- /*
- if( GlobalSelectionSystem().countSelected() != 1 )
- {
- //DoMessageBox("Invalid number of brushes selected, choose 1 only", "Error", eMB_OK);
- globalOutputStream() << "bobToolz PathPlotter: Invalid number of entities selected, choose 1 trigger_push entity only.\n";
- return;
- }
- */
- Entity *entity = Node_getEntity(GlobalSelectionSystem().ultimateSelected().path().top());
- if (entity != 0) {
- DBobView_setEntity(*entity, rs.fMultiplier, rs.nPoints, rs.fGravity, rs.bNoUpdate, rs.bShowExtra);
- } else {
- globalErrorStream()
- << "bobToolz PathPlotter: No trigger_push entitity selected, select 1 only (Use list to select it).\n";
- }
- return;
+void DoPathPlotter(){
+ UndoableCommand undo( "bobToolz.pathPlotter" );
+ PathPlotterRS rs;
+ EMessageBoxReturn ret = DoPathPlotterBox( &rs );
+ if ( ret == eIDCANCEL ) {
+ return;
+ }
+ if ( ret == eIDNO ) {
+ if ( g_PathView ) {
+ delete g_PathView;
+ }
+ return;
+ }
+
+ // ensure we have something selected
+ /*
+ if( GlobalSelectionSystem().countSelected() != 1 )
+ {
+ //DoMessageBox("Invalid number of brushes selected, choose 1 only", "Error", eMB_OK);
+ globalOutputStream() << "bobToolz PathPlotter: Invalid number of entities selected, choose 1 trigger_push entity only.\n";
+ return;
+ }
+ */
+ Entity* entity = Node_getEntity( GlobalSelectionSystem().ultimateSelected().path().top() );
+ if ( entity != 0 ) {
+ DBobView_setEntity( *entity, rs.fMultiplier, rs.nPoints, rs.fGravity, rs.bNoUpdate, rs.bShowExtra );
+ }
+ else{ globalErrorStream() << "bobToolz PathPlotter: No trigger_push entitity selected, select 1 only (Use list to select it).\n"; }
+ return;
}
-void DoPitBuilder()
-{
- UndoableCommand undo("bobToolz.pitBuilder");
- // ensure we have something selected
- if (GlobalSelectionSystem().countSelected() != 1) {
- //DoMessageBox("Invalid number of brushes selected, choose 1 only", "Error", eMB_OK);
- globalErrorStream() << "bobToolz PitBuilder: Invalid number of brushes selected, choose 1 only.\n";
- return;
- }
-
- vec3_t vMin, vMax;
-
- scene::Instance &instance = GlobalSelectionSystem().ultimateSelected();
- //seems it does this also with a patch with valid dimensions.. but probably better to enforce a brush.
- if (!Node_isBrush(instance.path().top())) {
- //DoMessageBox("No brush selected, select ONLY one brush", "Error", eMB_OK);
- globalErrorStream() << "bobToolz PitBuilder: No brush selected, select ONLY 1 brush.\n";
- return;
- }
-
- VectorSubtract(instance.worldAABB().origin, instance.worldAABB().extents, vMin);
- VectorAdd(instance.worldAABB().origin, instance.worldAABB().extents, vMax);
-
- DShape pit;
-
- if (pit.BuildPit(vMin, vMax)) {
- pit.Commit();
- Path_deleteTop(instance.path());
- } else {
- //DoMessageBox("Failed To Make Pit\nTry Making The Brush Bigger", "Error", eMB_OK);
- globalErrorStream() << "bobToolz PitBuilder: Failed to make Pit, try making the brush bigger.\n";
- }
+void DoPitBuilder(){
+ UndoableCommand undo( "bobToolz.pitBuilder" );
+ // ensure we have something selected
+ if ( GlobalSelectionSystem().countSelected() != 1 ) {
+ //DoMessageBox("Invalid number of brushes selected, choose 1 only", "Error", eMB_OK);
+ globalErrorStream() << "bobToolz PitBuilder: Invalid number of brushes selected, choose 1 only.\n";
+ return;
+ }
+
+ vec3_t vMin, vMax;
+
+ scene::Instance& instance = GlobalSelectionSystem().ultimateSelected();
+ //seems it does this also with a patch with valid dimensions.. but probably better to enforce a brush.
+ if ( !Node_isBrush( instance.path().top() ) ) {
+ //DoMessageBox("No brush selected, select ONLY one brush", "Error", eMB_OK);
+ globalErrorStream() << "bobToolz PitBuilder: No brush selected, select ONLY 1 brush.\n";
+ return;
+ }
+
+ VectorSubtract( instance.worldAABB().origin, instance.worldAABB().extents, vMin );
+ VectorAdd( instance.worldAABB().origin, instance.worldAABB().extents, vMax );
+
+ DShape pit;
+
+ if ( pit.BuildPit( vMin, vMax ) ) {
+ pit.Commit();
+ Path_deleteTop( instance.path() );
+ }
+ else
+ {
+ //DoMessageBox("Failed To Make Pit\nTry Making The Brush Bigger", "Error", eMB_OK);
+ globalErrorStream() << "bobToolz PitBuilder: Failed to make Pit, try making the brush bigger.\n";
+ }
}
-void DoMergePatches()
-{
- UndoableCommand undo("bobToolz.mergePatches");
- patch_merge_t merge_info;
- DPatch mrgPatches[2];
- int i;
-
- // ensure we have something selected
- if (GlobalSelectionSystem().countSelected() != 2) {
- globalErrorStream() << "bobToolz MergePatches: Invalid number of patches selected, choose 2 only.\n";
- //DoMessageBox("Invalid number of patches selected, choose 2 only", "Error", eMB_OK);
- return;
- }
-
- scene::Instance *patches[2];
- patches[0] = &GlobalSelectionSystem().ultimateSelected();
- patches[1] = &GlobalSelectionSystem().penultimateSelected();
-
- for (i = 0; i < 2; i++) {
- if (!Node_isPatch(patches[i]->path().top())) {
- //DoMessageBox("No patches selected, select ONLY patches", "Error", eMB_OK);
- globalErrorStream()
- << "bobToolz MergePatches: Invalid number of patches selected, choose ONLY 2 patches.\n";
- return;
- }
-
- mrgPatches[i].LoadFromPatch(*patches[i]);
- }
-
- /* mrgPatches[0].Transpose();
- mrgPatches[0].RemoveFromRadiant();
- mrgPatches[0].BuildInRadiant();*/
-
- merge_info = mrgPatches[0].IsMergable(&mrgPatches[1]);
-
- if (merge_info.mergable) {
- globalOutputStream() << merge_info.pos1 << " " << merge_info.pos2;
- //Message removed, No tools give feedback on success.
- //globalOutputStream() << "bobToolz MergePatches: Patches Mergable.\n";
- DPatch *newPatch = mrgPatches[0].MergePatches(merge_info, &mrgPatches[0], &mrgPatches[1]);
-
- /* mrgPatches[0].RemoveFromRadiant();
- mrgPatches[0].BuildInRadiant();
-
- mrgPatches[1].RemoveFromRadiant();
- mrgPatches[1].BuildInRadiant();
-
-
- delete newPatch;*/
-
- if (!newPatch) {
- } else {
- Path_deleteTop(patches[0]->path());
- Path_deleteTop(patches[1]->path());
-
- newPatch->BuildInRadiant();
- delete newPatch;
- }
- } else {
- globalErrorStream() << "bobToolz.mergePatch: The selected patches are not mergable.\n";
-
- }
+void DoMergePatches(){
+ UndoableCommand undo( "bobToolz.mergePatches" );
+ patch_merge_t merge_info;
+ DPatch mrgPatches[2];
+ int i;
+
+ // ensure we have something selected
+ if ( GlobalSelectionSystem().countSelected() != 2 ) {
+ globalErrorStream() << "bobToolz MergePatches: Invalid number of patches selected, choose 2 only.\n";
+ //DoMessageBox("Invalid number of patches selected, choose 2 only", "Error", eMB_OK);
+ return;
+ }
+
+ scene::Instance* patches[2];
+ patches[0] = &GlobalSelectionSystem().ultimateSelected();
+ patches[1] = &GlobalSelectionSystem().penultimateSelected();
+
+ for ( i = 0; i < 2; i++ )
+ {
+ if ( !Node_isPatch( patches[i]->path().top() ) ) {
+ //DoMessageBox("No patches selected, select ONLY patches", "Error", eMB_OK);
+ globalErrorStream() << "bobToolz MergePatches: Invalid number of patches selected, choose ONLY 2 patches.\n";
+ return;
+ }
+
+ mrgPatches[i].LoadFromPatch( *patches[i] );
+ }
+
+ /* mrgPatches[0].Transpose();
+ mrgPatches[0].RemoveFromRadiant();
+ mrgPatches[0].BuildInRadiant();*/
+
+ merge_info = mrgPatches[0].IsMergable( &mrgPatches[1] );
+
+ if ( merge_info.mergable ) {
+ globalOutputStream() << merge_info.pos1 << " " << merge_info.pos2;
+ //Message removed, No tools give feedback on success.
+ //globalOutputStream() << "bobToolz MergePatches: Patches Mergable.\n";
+ DPatch* newPatch = mrgPatches[0].MergePatches( merge_info, &mrgPatches[0], &mrgPatches[1] );
+
+ /* mrgPatches[0].RemoveFromRadiant();
+ mrgPatches[0].BuildInRadiant();
+
+ mrgPatches[1].RemoveFromRadiant();
+ mrgPatches[1].BuildInRadiant();
+
+
+ delete newPatch;*/
+
+ if ( !newPatch ) {
+ }
+ else
+ {
+ Path_deleteTop( patches[0]->path() );
+ Path_deleteTop( patches[1]->path() );
+
+ newPatch->BuildInRadiant();
+ delete newPatch;
+ }
+ }
+ else
+ {
+ globalErrorStream() << "bobToolz.mergePatch: The selected patches are not mergable.\n";
+
+ }
}
-void DoSplitPatch()
-{
- UndoableCommand undo("bobToolz.splitPatch");
+void DoSplitPatch() {
+ UndoableCommand undo( "bobToolz.splitPatch" );
- DPatch patch;
+ DPatch patch;
- // ensure we have something selected
- if (GlobalSelectionSystem().countSelected() != 1) {
- //DoMessageBox("Invalid number of patches selected, choose 1 only", "Error", eMB_OK);
- globalErrorStream() << "bobToolz SplitPatch: Invalid number of patches selected, choose only 1 patch.\n";
- return;
- }
+ // ensure we have something selected
+ if ( GlobalSelectionSystem().countSelected() != 1 ) {
+ //DoMessageBox("Invalid number of patches selected, choose 1 only", "Error", eMB_OK);
+ globalErrorStream() << "bobToolz SplitPatch: Invalid number of patches selected, choose only 1 patch.\n";
+ return;
+ }
- scene::Instance &instance = GlobalSelectionSystem().ultimateSelected();
+ scene::Instance& instance = GlobalSelectionSystem().ultimateSelected();
- if (!Node_isPatch(instance.path().top())) {
- //DoMessageBox("No patch selected, select ONLY one patch", "Error", eMB_OK);
- globalErrorStream() << "bobToolz SplitPatch: No patch selected, select ONLY 1 patch.\n";
- return;
- }
+ if ( !Node_isPatch( instance.path().top() ) ) {
+ //DoMessageBox("No patch selected, select ONLY one patch", "Error", eMB_OK);
+ globalErrorStream() << "bobToolz SplitPatch: No patch selected, select ONLY 1 patch.\n";
+ return;
+ }
- patch.LoadFromPatch(instance);
+ patch.LoadFromPatch( instance );
- std::list<DPatch> patchList = patch.Split();
- for (std::list<DPatch>::iterator patches = patchList.begin(); patches != patchList.end(); patches++) {
- (*patches).BuildInRadiant();
- }
+ std::list<DPatch> patchList = patch.Split();
+ for ( std::list<DPatch>::iterator patches = patchList.begin(); patches != patchList.end(); patches++ ) {
+ ( *patches ).BuildInRadiant();
+ }
- Path_deleteTop(instance.path());
+ Path_deleteTop( instance.path() );
}
-void DoSplitPatchCols()
-{
- UndoableCommand undo("bobToolz.splitPatchCols");
+void DoSplitPatchCols() {
+ UndoableCommand undo( "bobToolz.splitPatchCols" );
- DPatch patch;
+ DPatch patch;
- // ensure we have something selected
- if (GlobalSelectionSystem().countSelected() != 1) {
- //DoMessageBox("Invalid number of patches selected, choose 1 only", "Error", eMB_OK);
- globalErrorStream() << "bobToolz SplitPatchCols: Invalid number of patches selected, choose 1 only.\n";
- return;
- }
+ // ensure we have something selected
+ if ( GlobalSelectionSystem().countSelected() != 1 ) {
+ //DoMessageBox("Invalid number of patches selected, choose 1 only", "Error", eMB_OK);
+ globalErrorStream() << "bobToolz SplitPatchCols: Invalid number of patches selected, choose 1 only.\n";
+ return;
+ }
- scene::Instance &instance = GlobalSelectionSystem().ultimateSelected();
+ scene::Instance& instance = GlobalSelectionSystem().ultimateSelected();
- if (!Node_isPatch(instance.path().top())) {
- //DoMessageBox("No patch selected, select ONLY one patch", "Error", eMB_OK);
- globalErrorStream() << "bobToolz SplitPatchCols: No patch selected, select ONLY 1 patch.\n";
- return;
- }
+ if ( !Node_isPatch( instance.path().top() ) ) {
+ //DoMessageBox("No patch selected, select ONLY one patch", "Error", eMB_OK);
+ globalErrorStream() << "bobToolz SplitPatchCols: No patch selected, select ONLY 1 patch.\n";
+ return;
+ }
- patch.LoadFromPatch(instance);
+ patch.LoadFromPatch( instance );
- std::list<DPatch> patchList = patch.SplitCols();
- for (std::list<DPatch>::iterator patches = patchList.begin(); patches != patchList.end(); patches++) {
- (*patches).BuildInRadiant();
- }
+ std::list<DPatch> patchList = patch.SplitCols();
+ for ( std::list<DPatch>::iterator patches = patchList.begin(); patches != patchList.end(); patches++ ) {
+ ( *patches ).BuildInRadiant();
+ }
- Path_deleteTop(instance.path());
+ Path_deleteTop( instance.path() );
}
-void DoSplitPatchRows()
-{
- UndoableCommand undo("bobToolz.splitPatchRows");
+void DoSplitPatchRows() {
+ UndoableCommand undo( "bobToolz.splitPatchRows" );
- DPatch patch;
+ DPatch patch;
- // ensure we have something selected
- if (GlobalSelectionSystem().countSelected() != 1) {
- //DoMessageBox("Invalid number of patches selected, choose 1 only", "Error", eMB_OK);
- globalErrorStream() << "bobToolz SplitPatchRows: Invalid number of patches selected, choose 1 only.\n";
- return;
- }
+ // ensure we have something selected
+ if ( GlobalSelectionSystem().countSelected() != 1 ) {
+ //DoMessageBox("Invalid number of patches selected, choose 1 only", "Error", eMB_OK);
+ globalErrorStream() << "bobToolz SplitPatchRows: Invalid number of patches selected, choose 1 only.\n";
+ return;
+ }
- scene::Instance &instance = GlobalSelectionSystem().ultimateSelected();
+ scene::Instance& instance = GlobalSelectionSystem().ultimateSelected();
- if (!Node_isPatch(instance.path().top())) {
- //DoMessageBox("No patch selected, select ONLY one patch", "Error", eMB_OK);
- globalErrorStream() << "bobToolz SplitPatchRows: No patch selected, select ONLY 1 patch.\n";
- return;
- }
+ if ( !Node_isPatch( instance.path().top() ) ) {
+ //DoMessageBox("No patch selected, select ONLY one patch", "Error", eMB_OK);
+ globalErrorStream() << "bobToolz SplitPatchRows: No patch selected, select ONLY 1 patch.\n";
+ return;
+ }
- patch.LoadFromPatch(instance);
+ patch.LoadFromPatch( instance );
- std::list<DPatch> patchList = patch.SplitRows();
- for (std::list<DPatch>::iterator patches = patchList.begin(); patches != patchList.end(); patches++) {
- (*patches).BuildInRadiant();
- }
+ std::list<DPatch> patchList = patch.SplitRows();
+ for ( std::list<DPatch>::iterator patches = patchList.begin(); patches != patchList.end(); patches++ ) {
+ ( *patches ).BuildInRadiant();
+ }
- Path_deleteTop(instance.path());
+ Path_deleteTop( instance.path() );
}
-void DoVisAnalyse()
-{
- char filename[1024];
-
- if (GlobalSelectionSystem().countSelected() == 0) {
- globalErrorStream() << "bobToolz VisAnalyse: Invalid number of objects selected, choose 1 only.\n";
- if (g_VisView) {
- delete g_VisView;
- return;
- }
- }
-
- // ensure we have something selected
- if (GlobalSelectionSystem().countSelected() != 1) {
- //DoMessageBox("Invalid number of objects selected, choose 1 only", "Error", eMB_OK);
- globalErrorStream() << "bobToolz VisAnalyse: Invalid number of objects selected, choose 1 only.\n";
- return;
- }
-
- scene::Instance &brush = GlobalSelectionSystem().ultimateSelected();
- //ensure we have a brush selected
- if (!Node_isBrush(brush.path().top())) {
- //DoMessageBox("No brush selected, select ONLY one brush", "Error", eMB_OK);
- globalErrorStream() << "bobToolz VisAnalyse: No brush selected, select ONLY 1 brush.\n";
- return;
- }
- DBrush orgBrush;
- orgBrush.LoadFromBrush(brush, false);
-
- orgBrush.BuildBounds();
- vec3_t origin;
- origin[0] = (orgBrush.bbox_max[0] + orgBrush.bbox_min[0]) / 2.f;
- origin[1] = (orgBrush.bbox_max[1] + orgBrush.bbox_min[1]) / 2.f;
- origin[2] = (orgBrush.bbox_max[2] + orgBrush.bbox_min[2]) / 2.f;
-
-
- const char *rad_filename = GlobalRadiant().getMapName();
- if (!rad_filename) {
- //DoMessageBox("An ERROR occurred while trying\n to get the map filename", "Error", eMB_OK);
- globalErrorStream() << "bobToolz VisAnalyse: An ERROR occurred while trying to get the map filename.\n";
- return;
- }
-
- strcpy(filename, rad_filename);
-
- char *ext = strrchr(filename, '.') + 1;
- strcpy(ext, "bsp"); // rename the extension
-
- std::list<DWinding *> *pointList = BuildTrace(filename, origin);
-
- if (!g_VisView) {
- g_VisView = new DVisDrawer;
- }
-
- g_VisView->SetList(pointList);
+void DoVisAnalyse(){
+ char filename[1024];
+
+ if ( GlobalSelectionSystem().countSelected() == 0 ) {
+ globalErrorStream() << "bobToolz VisAnalyse: Invalid number of objects selected, choose 1 only.\n";
+ if ( g_VisView ) {
+ delete g_VisView;
+ return;
+ }
+ }
+
+ // ensure we have something selected
+ if ( GlobalSelectionSystem().countSelected() != 1 ) {
+ //DoMessageBox("Invalid number of objects selected, choose 1 only", "Error", eMB_OK);
+ globalErrorStream() << "bobToolz VisAnalyse: Invalid number of objects selected, choose 1 only.\n";
+ return;
+ }
+
+ scene::Instance& brush = GlobalSelectionSystem().ultimateSelected();
+ //ensure we have a brush selected
+ if ( !Node_isBrush( brush.path().top() ) ) {
+ //DoMessageBox("No brush selected, select ONLY one brush", "Error", eMB_OK);
+ globalErrorStream() << "bobToolz VisAnalyse: No brush selected, select ONLY 1 brush.\n";
+ return;
+ }
+ DBrush orgBrush;
+ orgBrush.LoadFromBrush( brush, false );
+
+ orgBrush.BuildBounds();
+ vec3_t origin;
+ origin[0] = ( orgBrush.bbox_max[0] + orgBrush.bbox_min[0] ) / 2.f;
+ origin[1] = ( orgBrush.bbox_max[1] + orgBrush.bbox_min[1] ) / 2.f;
+ origin[2] = ( orgBrush.bbox_max[2] + orgBrush.bbox_min[2] ) / 2.f;
+
+
+ const char* rad_filename = GlobalRadiant().getMapName();
+ if ( !rad_filename ) {
+ //DoMessageBox("An ERROR occurred while trying\n to get the map filename", "Error", eMB_OK);
+ globalErrorStream() << "bobToolz VisAnalyse: An ERROR occurred while trying to get the map filename.\n";
+ return;
+ }
+
+ strcpy( filename, rad_filename );
+
+ char* ext = strrchr( filename, '.' ) + 1;
+ strcpy( ext, "bsp" ); // rename the extension
+
+ std::list<DWinding*> *pointList = BuildTrace( filename, origin );
+
+ if ( !g_VisView ) {
+ g_VisView = new DVisDrawer;
+ }
+
+ g_VisView->SetList( pointList );
}
-void DoTrainPathPlot()
-{
- if (g_TrainView) {
- delete g_TrainView;
- g_TrainView = NULL;
- }
+void DoTrainPathPlot() {
+ if ( g_TrainView ) {
+ delete g_TrainView;
+ g_TrainView = NULL;
+ }
- g_TrainView = new DTrainDrawer();
+ g_TrainView = new DTrainDrawer();
}
-void DoCaulkSelection()
-{
- UndoableCommand undo("bobToolz.caulkSelection");
- DEntity world;
+void DoCaulkSelection() {
+ UndoableCommand undo( "bobToolz.caulkSelection" );
+ DEntity world;
- float fScale[2] = {0.5f, 0.5f};
- float fShift[2] = {0.0f, 0.0f};
+ float fScale[2] = { 0.5f, 0.5f };
+ float fShift[2] = { 0.0f, 0.0f };
- int bResetScale[2] = {false, false};
- int bResetShift[2] = {false, false};
+ int bResetScale[2] = { false, false };
+ int bResetShift[2] = { false, false };
- world.LoadSelectedBrushes();
- world.LoadSelectedPatches();
- world.ResetTextures(NULL, fScale, fShift, 0, "textures/common/caulk", true, bResetScale, bResetShift, false, true);
+ world.LoadSelectedBrushes();
+ world.LoadSelectedPatches();
+ world.ResetTextures( NULL, fScale, fShift, 0, "textures/common/caulk", true, bResetScale, bResetShift, false, true );
}
-void DoTreePlanter()
-{
- UndoableCommand undo("bobToolz.treePlanter");
- if (g_TreePlanter) {
- delete g_TreePlanter;
- g_TreePlanter = NULL;
- return;
- }
+void DoTreePlanter() {
+ UndoableCommand undo( "bobToolz.treePlanter" );
+ if ( g_TreePlanter ) {
+ delete g_TreePlanter;
+ g_TreePlanter = NULL;
+ return;
+ }
- g_TreePlanter = new DTreePlanter();
+ g_TreePlanter = new DTreePlanter();
}
-void DoDropEnts()
-{
- UndoableCommand undo("bobToolz.dropEntities");
- if (g_TreePlanter) {
- g_TreePlanter->DropEntsToGround();
- }
+void DoDropEnts() {
+ UndoableCommand undo( "bobToolz.dropEntities" );
+ if ( g_TreePlanter ) {
+ g_TreePlanter->DropEntsToGround();
+ }
}
-void DoMakeChain()
-{
- MakeChainRS rs;
- if (DoMakeChainBox(&rs) == eIDOK) {
- if (rs.linkNum > 1001) {
- globalErrorStream() << "bobToolz MakeChain: " << rs.linkNum << " to many Elemets, limited to 1000.\n";
- return;
- }
- UndoableCommand undo("bobToolz.makeChain");
- DTreePlanter pl;
- pl.MakeChain(rs.linkNum, rs.linkName);
- }
+void DoMakeChain() {
+ MakeChainRS rs;
+ if ( DoMakeChainBox( &rs ) == eIDOK ) {
+ if ( rs.linkNum > 1001 ) {
+ globalErrorStream() << "bobToolz MakeChain: " << rs.linkNum << " to many Elemets, limited to 1000.\n";
+ return;
+ }
+ UndoableCommand undo( "bobToolz.makeChain" );
+ DTreePlanter pl;
+ pl.MakeChain( rs.linkNum,rs.linkName );
+ }
}
-typedef DPoint *pntTripple[3];
+typedef DPoint* pntTripple[3];
bool bFacesNoTop[6] = {true, true, true, true, true, false};
-void DoFlipTerrain()
-{
- UndoableCommand undo("bobToolz.flipTerrain");
- vec3_t vUp = {0.f, 0.f, 1.f};
- int i;
-
- // ensure we have something selected
- if (GlobalSelectionSystem().countSelected() != 2) {
- //DoMessageBox("Invalid number of objects selected, choose 2 only", "Error", eMB_OK);
- globalErrorStream() << "bobToolz FlipTerrain: Invalid number of objects selected, choose 2 only.\n";
- return;
- }
-
- scene::Instance *brushes[2];
- brushes[0] = &GlobalSelectionSystem().ultimateSelected();
- brushes[1] = &GlobalSelectionSystem().penultimateSelected();
- //ensure we have only Brushes selected.
- for (i = 0; i < 2; i++) {
- if (!Node_isBrush(brushes[i]->path().top())) {
- //DoMessageBox("No brushes selected, select ONLY brushes", "Error", eMB_OK);
- globalErrorStream() << "bobToolz FlipTerrain: No brushes selected, select ONLY 2 brushes.\n";
- return;
- }
- }
- DBrush Brushes[2];
- DPlane *Planes[2];
- pntTripple Points[2];
- for (i = 0; i < 2; i++) {
- Brushes[i].LoadFromBrush(*brushes[i], false);
- if (!(Planes[i] = Brushes[i].FindPlaneWithClosestNormal(vUp)) ||
- Brushes[i].FindPointsForPlane(Planes[i], Points[i], 3) != 3) {
- //DoMessageBox("Error", "Error", eMB_OK);
- globalErrorStream() << "bobToolz FlipTerrain: ERROR (FindPlaneWithClosestNormal/FindPointsForPlane).\n";
- return;
- }
- }
-
- vec3_t mins1, mins2, maxs1, maxs2;
- Brushes[0].GetBounds(mins1, maxs1);
- Brushes[1].GetBounds(mins2, maxs2);
-
-
- int dontmatch[2] = {-1, -1};
- bool found = false;
- for (i = 0; i < 3; i++) {
- for (int j = 0; j < 3 && !found; j++) {
- if (VectorCompare((Points[0])[i]->_pnt, (Points[1])[j]->_pnt)) {
- found = true;
- break;
- }
- }
- if (!found) {
- dontmatch[0] = i;
- break;
- }
- found = false;
- }
- if (dontmatch[0] == -1) {
- //DoMessageBox("Error", "Error", eMB_OK);
- globalErrorStream() << "bobToolz FlipTerrain: ERROR (dontmatch[0]).\n";
- return;
- }
-
- for (i = 0; i < 3; i++) {
- for (int j = 0; j < 3 && !found; j++) {
- if (VectorCompare((Points[1])[i]->_pnt, (Points[0])[j]->_pnt)) {
- found = true;
- break;
- }
- }
- if (!found) {
- dontmatch[1] = i;
- break;
- }
- found = false;
- }
- if (dontmatch[1] == -1) {
- //DoMessageBox("Error", "Error", eMB_OK);
- globalErrorStream() << "bobToolz FlipTerrain: ERROR (dontmatch[1]).\n";
- return;
- }
-
- vec3_t plnpnts1[3];
- vec3_t plnpnts2[3];
- vec3_t plnpntsshr[3];
-
- VectorCopy((Points[0])[dontmatch[0]]->_pnt, plnpnts1[0]);
- for (i = 0; i < 3; i++) {
- if (dontmatch[0] != i) {
- VectorCopy((Points[0])[i]->_pnt, plnpnts1[1]);
- break;
- }
- }
- VectorCopy((Points[1])[dontmatch[1]]->_pnt, plnpnts1[2]);
-
- VectorCopy((Points[1])[dontmatch[1]]->_pnt, plnpnts2[0]);
- for (i = 0; i < 3; i++) {
- if (dontmatch[1] != i && !VectorCompare((Points[1])[i]->_pnt, plnpnts1[1])) {
- VectorCopy((Points[1])[i]->_pnt, plnpnts2[1]);
- break;
- }
- }
- VectorCopy((Points[0])[dontmatch[0]]->_pnt, plnpnts2[2]);
-
- VectorCopy((Points[0])[dontmatch[0]]->_pnt, plnpntsshr[0]);
- VectorCopy((Points[1])[dontmatch[1]]->_pnt, plnpntsshr[1]);
- if ((Points[1])[dontmatch[1]]->_pnt[2] < (Points[0])[dontmatch[0]]->_pnt[2]) {
- VectorCopy((Points[1])[dontmatch[1]]->_pnt, plnpntsshr[2]);
- } else {
- VectorCopy((Points[0])[dontmatch[0]]->_pnt, plnpntsshr[2]);
- }
- plnpntsshr[2][2] -= 16;
-
- for (i = 0; i < 3; i++) {
- if (mins2[i] < mins1[i]) {
- mins1[i] = mins2[i];
- }
- if (maxs2[i] > maxs1[i]) {
- maxs1[i] = maxs2[i];
- }
- }
-
- DBrush *newBrushes[2];
- newBrushes[0] = DShape::GetBoundingCube_Ext(mins1, maxs1, "textures/common/caulk", bFacesAll, true);
- newBrushes[1] = DShape::GetBoundingCube_Ext(mins1, maxs1, "textures/common/caulk", bFacesAll, true);
-
- vec3_t normal;
- MakeNormal(plnpnts1[0], plnpnts1[1], plnpnts1[2], normal);
- if (normal[2] >= 0) {
- newBrushes[0]->AddFace(plnpnts1[0], plnpnts1[1], plnpnts1[2], "textures/common/terrain", true);
- } else {
- newBrushes[0]->AddFace(plnpnts1[2], plnpnts1[1], plnpnts1[0], "textures/common/terrain", true);
- }
-
- MakeNormal(plnpnts2[0], plnpnts2[1], plnpnts2[2], normal);
- if (normal[2] >= 0) {
- newBrushes[1]->AddFace(plnpnts2[0], plnpnts2[1], plnpnts2[2], "textures/common/terrain", true);
- } else {
- newBrushes[1]->AddFace(plnpnts2[2], plnpnts2[1], plnpnts2[0], "textures/common/terrain", true);
- }
-
- vec3_t vec;
- MakeNormal(plnpntsshr[0], plnpntsshr[1], plnpntsshr[2], normal);
-
- VectorSubtract(plnpnts1[2], plnpnts1[1], vec);
- if (DotProduct(vec, normal) >= 0) {
- newBrushes[0]->AddFace(plnpntsshr[0], plnpntsshr[1], plnpntsshr[2], "textures/common/caulk", true);
- } else {
- newBrushes[0]->AddFace(plnpntsshr[2], plnpntsshr[1], plnpntsshr[0], "textures/common/caulk", true);
- }
-
- VectorSubtract(plnpnts2[2], plnpnts2[1], vec);
- if (DotProduct(vec, normal) >= 0) {
- newBrushes[1]->AddFace(plnpntsshr[0], plnpntsshr[1], plnpntsshr[2], "textures/common/caulk", true);
- } else {
- newBrushes[1]->AddFace(plnpntsshr[2], plnpntsshr[1], plnpntsshr[0], "textures/common/caulk", true);
- }
-
- for (i = 0; i < 2; i++) {
- newBrushes[i]->RemoveRedundantPlanes();
- newBrushes[i]->BuildInRadiant(false, NULL, brushes[i]->path().parent().get_pointer());
- Path_deleteTop(brushes[i]->path());
- delete newBrushes[i];
- }
+void DoFlipTerrain() {
+ UndoableCommand undo( "bobToolz.flipTerrain" );
+ vec3_t vUp = { 0.f, 0.f, 1.f };
+ int i;
+
+ // ensure we have something selected
+ if ( GlobalSelectionSystem().countSelected() != 2 ) {
+ //DoMessageBox("Invalid number of objects selected, choose 2 only", "Error", eMB_OK);
+ globalErrorStream() << "bobToolz FlipTerrain: Invalid number of objects selected, choose 2 only.\n";
+ return;
+ }
+
+ scene::Instance* brushes[2];
+ brushes[0] = &GlobalSelectionSystem().ultimateSelected();
+ brushes[1] = &GlobalSelectionSystem().penultimateSelected();
+ //ensure we have only Brushes selected.
+ for ( i = 0; i < 2; i++ )
+ {
+ if ( !Node_isBrush( brushes[i]->path().top() ) ) {
+ //DoMessageBox("No brushes selected, select ONLY brushes", "Error", eMB_OK);
+ globalErrorStream() << "bobToolz FlipTerrain: No brushes selected, select ONLY 2 brushes.\n";
+ return;
+ }
+ }
+ DBrush Brushes[2];
+ DPlane* Planes[2];
+ pntTripple Points[2];
+ for ( i = 0; i < 2; i++ ) {
+ Brushes[i].LoadFromBrush( *brushes[i], false );
+ if ( !( Planes[i] = Brushes[i].FindPlaneWithClosestNormal( vUp ) ) || Brushes[i].FindPointsForPlane( Planes[i], Points[i], 3 ) != 3 ) {
+ //DoMessageBox("Error", "Error", eMB_OK);
+ globalErrorStream() << "bobToolz FlipTerrain: ERROR (FindPlaneWithClosestNormal/FindPointsForPlane).\n";
+ return;
+ }
+ }
+
+ vec3_t mins1, mins2, maxs1, maxs2;
+ Brushes[0].GetBounds( mins1, maxs1 );
+ Brushes[1].GetBounds( mins2, maxs2 );
+
+
+
+ int dontmatch[2] = { -1, -1 };
+ bool found = false;
+ for ( i = 0; i < 3; i++ ) {
+ for ( int j = 0; j < 3 && !found; j++ ) {
+ if ( VectorCompare( ( Points[0] )[i]->_pnt, ( Points[1] )[j]->_pnt ) ) {
+ found = true;
+ break;
+ }
+ }
+ if ( !found ) {
+ dontmatch[0] = i;
+ break;
+ }
+ found = false;
+ }
+ if ( dontmatch[0] == -1 ) {
+ //DoMessageBox("Error", "Error", eMB_OK);
+ globalErrorStream() << "bobToolz FlipTerrain: ERROR (dontmatch[0]).\n";
+ return;
+ }
+
+ for ( i = 0; i < 3; i++ ) {
+ for ( int j = 0; j < 3 && !found; j++ ) {
+ if ( VectorCompare( ( Points[1] )[i]->_pnt, ( Points[0] )[j]->_pnt ) ) {
+ found = true;
+ break;
+ }
+ }
+ if ( !found ) {
+ dontmatch[1] = i;
+ break;
+ }
+ found = false;
+ }
+ if ( dontmatch[1] == -1 ) {
+ //DoMessageBox("Error", "Error", eMB_OK);
+ globalErrorStream() << "bobToolz FlipTerrain: ERROR (dontmatch[1]).\n";
+ return;
+ }
+
+ vec3_t plnpnts1[3];
+ vec3_t plnpnts2[3];
+ vec3_t plnpntsshr[3];
+
+ VectorCopy( ( Points[0] )[dontmatch[0]]->_pnt, plnpnts1[0] );
+ for ( i = 0; i < 3; i++ ) {
+ if ( dontmatch[0] != i ) {
+ VectorCopy( ( Points[0] )[i]->_pnt, plnpnts1[1] );
+ break;
+ }
+ }
+ VectorCopy( ( Points[1] )[dontmatch[1]]->_pnt, plnpnts1[2] );
+
+ VectorCopy( ( Points[1] )[dontmatch[1]]->_pnt, plnpnts2[0] );
+ for ( i = 0; i < 3; i++ ) {
+ if ( dontmatch[1] != i && !VectorCompare( ( Points[1] )[i]->_pnt, plnpnts1[1] ) ) {
+ VectorCopy( ( Points[1] )[i]->_pnt, plnpnts2[1] );
+ break;
+ }
+ }
+ VectorCopy( ( Points[0] )[dontmatch[0]]->_pnt, plnpnts2[2] );
+
+ VectorCopy( ( Points[0] )[dontmatch[0]]->_pnt, plnpntsshr[0] );
+ VectorCopy( ( Points[1] )[dontmatch[1]]->_pnt, plnpntsshr[1] );
+ if ( ( Points[1] )[dontmatch[1]]->_pnt[2] < ( Points[0] )[dontmatch[0]]->_pnt[2] ) {
+ VectorCopy( ( Points[1] )[dontmatch[1]]->_pnt, plnpntsshr[2] );
+ }
+ else {
+ VectorCopy( ( Points[0] )[dontmatch[0]]->_pnt, plnpntsshr[2] );
+ }
+ plnpntsshr[2][2] -= 16;
+
+ for ( i = 0; i < 3; i++ ) {
+ if ( mins2[i] < mins1[i] ) {
+ mins1[i] = mins2[i];
+ }
+ if ( maxs2[i] > maxs1[i] ) {
+ maxs1[i] = maxs2[i];
+ }
+ }
+
+ DBrush* newBrushes[2];
+ newBrushes[0] = DShape::GetBoundingCube_Ext( mins1, maxs1, "textures/common/caulk", bFacesAll, true );
+ newBrushes[1] = DShape::GetBoundingCube_Ext( mins1, maxs1, "textures/common/caulk", bFacesAll, true );
+
+ vec3_t normal;
+ MakeNormal( plnpnts1[0], plnpnts1[1], plnpnts1[2], normal );
+ if ( normal[2] >= 0 ) {
+ newBrushes[0]->AddFace( plnpnts1[0], plnpnts1[1], plnpnts1[2], "textures/common/terrain", true );
+ }
+ else {
+ newBrushes[0]->AddFace( plnpnts1[2], plnpnts1[1], plnpnts1[0], "textures/common/terrain", true );
+ }
+
+ MakeNormal( plnpnts2[0], plnpnts2[1], plnpnts2[2], normal );
+ if ( normal[2] >= 0 ) {
+ newBrushes[1]->AddFace( plnpnts2[0], plnpnts2[1], plnpnts2[2], "textures/common/terrain", true );
+ }
+ else {
+ newBrushes[1]->AddFace( plnpnts2[2], plnpnts2[1], plnpnts2[0], "textures/common/terrain", true );
+ }
+
+ vec3_t vec;
+ MakeNormal( plnpntsshr[0], plnpntsshr[1], plnpntsshr[2], normal );
+
+ VectorSubtract( plnpnts1[2], plnpnts1[1], vec );
+ if ( DotProduct( vec, normal ) >= 0 ) {
+ newBrushes[0]->AddFace( plnpntsshr[0], plnpntsshr[1], plnpntsshr[2], "textures/common/caulk", true );
+ }
+ else {
+ newBrushes[0]->AddFace( plnpntsshr[2], plnpntsshr[1], plnpntsshr[0], "textures/common/caulk", true );
+ }
+
+ VectorSubtract( plnpnts2[2], plnpnts2[1], vec );
+ if ( DotProduct( vec, normal ) >= 0 ) {
+ newBrushes[1]->AddFace( plnpntsshr[0], plnpntsshr[1], plnpntsshr[2], "textures/common/caulk", true );
+ }
+ else {
+ newBrushes[1]->AddFace( plnpntsshr[2], plnpntsshr[1], plnpntsshr[0], "textures/common/caulk", true );
+ }
+
+ for ( i = 0; i < 2; i++ ) {
+ newBrushes[i]->RemoveRedundantPlanes();
+ newBrushes[i]->BuildInRadiant( false, NULL, brushes[i]->path().parent().get_pointer() );
+ Path_deleteTop( brushes[i]->path() );
+ delete newBrushes[i];
+ }
}