void FindReplaceTextures( const char* pFind, const char* pReplace, bool bSelected, bool bForce ) { brush_s* pList = ( bSelected ) ? &selected_brushes : &active_brushes; if ( !bSelected ) { Select_Deselect(); } for ( brush_s* pBrush = pList->next ; pBrush != pList; pBrush = pBrush->next ) { if ( pBrush->patchBrush ) { Patch_FindReplaceTexture( pBrush, pFind, pReplace, bForce ); } for ( face_s* pFace = pBrush->brush_faces; pFace; pFace = pFace->next ) { if ( bForce || strcmpi( pFace->texdef.name, pFind ) == 0 ) { pFace->d_texture = Texture_ForName( pReplace ); //strcpy(pFace->texdef.name, pReplace); pFace->texdef.SetName( pReplace ); } } Brush_Build( pBrush ); } Sys_UpdateWindows( W_CAMERA ); }
void Select_MakeDetail( void ) { brush_s* b; face_s* f; for ( b = selected_brushes.next ; b != &selected_brushes ; b = b->next ) for ( f = b->brush_faces ; f ; f = f->next ) f->texdef.contents |= CONTENTS_DETAIL; Select_Deselect(); Sys_UpdateWindows( W_ALL ); }
void CEntityListDlg::OnSelect() { int index = listEntities.GetCurSel(); if( index != LB_ERR ) { entity_t *ent = reinterpret_cast<entity_t *>( listEntities.GetItemDataPtr( index ) ); if( ent ) { Select_Deselect(); Select_Brush( ent->brushes.onext ); } } Sys_UpdateWindows( W_ALL ); }
BOOL CDialogTextures::PreTranslateMessage(MSG* pMsg) { if (pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_RETURN)) { if (pMsg->wParam == VK_ESCAPE) { g_pParentWnd->GetCamera()->SetFocus(); Select_Deselect(); } return TRUE; } return CDialog::PreTranslateMessage(pMsg); }
/* =============== ConnectEntities Sets target / targetname on the two entities selected from the first selected to the secon =============== */ void ConnectEntities( void ){ entity_t *e1, *e2; const char *target; char *newtarg = NULL; if ( g_qeglobals.d_select_count != 2 ) { Sys_Status( "Must have two brushes selected", 0 ); Sys_Beep(); return; } e1 = g_qeglobals.d_select_order[0]->owner; e2 = g_qeglobals.d_select_order[1]->owner; if ( e1 == world_entity || e2 == world_entity ) { Sys_Status( "Can't connect to the world", 0 ); Sys_Beep(); return; } if ( e1 == e2 ) { Sys_Status( "Brushes are from same entity", 0 ); Sys_Beep(); return; } target = ValueForKey( e1, "target" ); if ( target && target[0] ) { newtarg = g_strdup( target ); } else { target = ValueForKey( e2, "targetname" ); if ( target && target[0] ) { newtarg = g_strdup( target ); } else{ Entity_Connect( e1, e2 ); } } if ( newtarg != NULL ) { SetKeyValue( e1, "target", newtarg ); SetKeyValue( e2, "targetname", newtarg ); g_free( newtarg ); } Sys_UpdateWindows( W_XY | W_CAMERA ); Select_Deselect(); Select_Brush( g_qeglobals.d_select_order[1] ); }
BOOL CNewTexWnd::PreTranslateMessage(MSG* pMsg) { if (pMsg->message == WM_KEYDOWN) { if (pMsg->wParam == VK_ESCAPE) { g_pParentWnd->GetCamera()->SetFocus(); Select_Deselect(); return TRUE; } if (pMsg->wParam == VK_RIGHT || pMsg->wParam == VK_LEFT || pMsg->wParam == VK_UP || pMsg->wParam == VK_DOWN) { g_pParentWnd->PostMessage(WM_KEYDOWN, pMsg->wParam); return TRUE; } } return CWnd::PreTranslateMessage(pMsg); }
void Select_MakeDetail (bool bDeselectAfterwards /* = true */) { brush_t *b; face_t *f; for (b=selected_brushes.next ; b != &selected_brushes ; b=b->next) for (f=b->brush_faces ; f ; f=f->next) f->texdef.contents |= CONTENTS_DETAIL; if (bDeselectAfterwards) { Select_Deselect (); } Sys_UpdateWindows (W_ALL); }
void Map_ImportBuffer( char *buf ){ Select_Deselect(); Undo_Start( "import buffer" ); MemStream stream; stream.Write( buf, strlen( buf ) ); Map_Import( &stream, "xmap" ); stream.Close(); Sys_UpdateWindows( W_ALL ); Sys_MarkMapModified(); Undo_End(); }
void Select_MakeNonSolid(void) { brush_t *b; face_t *f; for (b=selected_brushes.next ; b != &selected_brushes ; b=b->next) { for (f=b->brush_faces ; f ; f=f->next) f->texdef.flags |= SURF_NONSOLID; if (b->patchBrush) { Patch_MakeNonSolid(b); } } Select_Deselect (); Sys_UpdateWindows (W_ALL); }
trace_t Test_Ray( vec3_t origin, vec3_t dir, int flags ) { brush_s* brush; face_s* face; float dist; trace_t t; memset( &t, 0, sizeof( t ) ); t.dist = DIST_START; if ( flags & SF_CYCLE ) { CPtrArray array; brush_s* pToSelect = ( selected_brushes.next != &selected_brushes ) ? selected_brushes.next : NULL; Select_Deselect(); // go through active brushes and accumulate all "hit" brushes for ( brush = active_brushes.next ; brush != &active_brushes ; brush = brush->next ) { //if ( (flags & SF_ENTITIES_FIRST) && brush->owner == world_entity) // continue; if ( FilterBrush( brush ) ) continue; if ( !g_PrefsDlg.m_bSelectCurves && brush->patchBrush ) continue; if ( !g_PrefsDlg.m_bSelectTerrain && brush->terrainBrush ) continue; //if (!g_bShowPatchBounds && brush->patchBrush) // continue; face = Brush_Ray( origin, dir, brush, &dist ); if ( face ) { array.Add( brush ); } } int nSize = array.GetSize(); if ( nSize > 0 ) { bool bFound = false; for ( int i = 0; i < nSize; i++ ) { brush_s* b = reinterpret_cast<brush_s*>( array.GetAt( i ) ); // did we hit the last one selected yet ? if ( b == pToSelect ) { // yes we want to select the next one in the list int n = ( i > 0 ) ? i - 1 : nSize - 1; pToSelect = reinterpret_cast<brush_s*>( array.GetAt( n ) ); bFound = true; break; } } if ( !bFound ) pToSelect = reinterpret_cast<brush_s*>( array.GetAt( 0 ) ); } if ( pToSelect ) { face = Brush_Ray( origin, dir, pToSelect, &dist ); t.dist = dist; t.brush = pToSelect; t.face = face; t.selected = false; return t; } } if ( !( flags & SF_SELECTED_ONLY ) ) { for ( brush = active_brushes.next ; brush != &active_brushes ; brush = brush->next ) { if ( ( flags & SF_ENTITIES_FIRST ) && brush->owner == world_entity ) continue; if ( FilterBrush( brush ) ) continue; if ( !g_PrefsDlg.m_bSelectCurves && brush->patchBrush ) continue; if ( !g_PrefsDlg.m_bSelectTerrain && brush->terrainBrush ) continue; //if (!g_bShowPatchBounds && brush->patchBrush) // continue; face = Brush_Ray( origin, dir, brush, &dist ); if ( dist > 0 && dist < t.dist ) { t.dist = dist; t.brush = brush; t.face = face; t.selected = false; } } } for ( brush = selected_brushes.next ; brush != 0 && brush != &selected_brushes ; brush = brush->next ) { if ( ( flags & SF_ENTITIES_FIRST ) && brush->owner == world_entity ) continue; if ( FilterBrush( brush ) ) continue; if ( !g_PrefsDlg.m_bSelectCurves && brush->patchBrush ) continue; if ( !g_PrefsDlg.m_bSelectTerrain && brush->terrainBrush ) continue; face = Brush_Ray( origin, dir, brush, &dist ); if ( dist > 0 && dist < t.dist ) { t.dist = dist; t.brush = brush; t.face = face; t.selected = true; } } // if entites first, but didn't find any, check regular if ( ( flags & SF_ENTITIES_FIRST ) && t.brush == NULL ) return Test_Ray( origin, dir, flags - SF_ENTITIES_FIRST ); return t; }
void Select_AllOfType() { brush_s* b, *next; entity_s* e; if ( ( selected_brushes.next == &selected_brushes ) || ( selected_brushes.next->next != &selected_brushes ) ) { CString strName; if ( g_ptrSelectedFaces.GetSize() == 0 ) { strName = g_qeglobals.d_texturewin.texdef.name; } else { face_s* selFace = reinterpret_cast<face_s*>( g_ptrSelectedFaces.GetAt( 0 ) ); strName = selFace->texdef.name; } Select_Deselect(); for ( b = active_brushes.next ; b != &active_brushes ; b = next ) { next = b->next; if ( FilterBrush( b ) ) continue; if ( b->patchBrush ) { if ( strcmpi( strName, b->pPatch->d_texture->name ) == 0 ) { Brush_RemoveFromList( b ); Brush_AddToList( b, &selected_brushes ); } } else { for ( face_s* pFace = b->brush_faces; pFace; pFace = pFace->next ) { if ( strcmpi( strName, pFace->texdef.name ) == 0 ) { Brush_RemoveFromList( b ); Brush_AddToList( b, &selected_brushes ); } } } } Sys_UpdateWindows( W_ALL ); return; } b = selected_brushes.next; e = b->owner; if ( e != NULL ) { if ( e != world_entity ) { CString strName = e->eclass->name; CString strKey, strVal; bool bCriteria = GetSelectAllCriteria( strKey, strVal ); Sys_Printf( "Selecting all %s(s)\n", strName ); Select_Deselect(); for ( b = active_brushes.next ; b != &active_brushes ; b = next ) { next = b->next; if ( FilterBrush( b ) ) continue; e = b->owner; if ( e != NULL ) { if ( strcmpi( e->eclass->name, strName ) == 0 ) { bool doIt = true; if ( bCriteria ) { CString str = ValueForKey( e, strKey ); if ( str.CompareNoCase( strVal ) != 0 ) { doIt = false; } } if ( doIt ) { Brush_RemoveFromList( b ); Brush_AddToList( b, &selected_brushes ); } } } } } } Sys_UpdateWindows( W_ALL ); }
/* handle all WM_COMMAND messages here */ LONG WINAPI CommandHandler ( HWND hWnd, WPARAM wParam, LPARAM lParam) { HMENU hMenu; switch (LOWORD(wParam)) { // // file menu // case ID_FILE_EXIT: /* exit application */ if (!ConfirmModified()) return TRUE; PostMessage (hWnd, WM_CLOSE, 0, 0L); break; case ID_FILE_OPEN: if (!ConfirmModified()) return TRUE; OpenDialog (); break; case ID_FILE_NEW: if (!ConfirmModified()) return TRUE; Map_New (); break; case ID_FILE_SAVE: if (!strcmp(currentmap, "unnamed.map")) SaveAsDialog (); else Map_SaveFile (currentmap, false); // ignore region break; case ID_FILE_SAVEAS: SaveAsDialog (); break; case ID_FILE_LOADPROJECT: if (!ConfirmModified()) return TRUE; ProjectDialog (); break; case ID_FILE_POINTFILE: if (g_qeglobals.d_pointfile_display_list) Pointfile_Clear (); else Pointfile_Check (); break; // // view menu // case ID_VIEW_ENTITY: SetInspectorMode(W_ENTITY); break; case ID_VIEW_CONSOLE: SetInspectorMode(W_CONSOLE); break; case ID_VIEW_TEXTURE: SetInspectorMode(W_TEXTURE); break; case ID_VIEW_100: g_qeglobals.d_xy.scale = 1; Sys_UpdateWindows (W_XY|W_XY_OVERLAY); break; case ID_VIEW_ZOOMIN: g_qeglobals.d_xy.scale *= 5.0/4; if (g_qeglobals.d_xy.scale > 16) g_qeglobals.d_xy.scale = 16; Sys_UpdateWindows (W_XY|W_XY_OVERLAY); break; case ID_VIEW_ZOOMOUT: g_qeglobals.d_xy.scale *= 4.0/5; if (g_qeglobals.d_xy.scale < 0.1) g_qeglobals.d_xy.scale = 0.1; Sys_UpdateWindows (W_XY|W_XY_OVERLAY); break; case ID_VIEW_Z100: z.scale = 1; Sys_UpdateWindows (W_Z|W_Z_OVERLAY); break; case ID_VIEW_ZZOOMIN: z.scale *= 5.0/4; if (z.scale > 4) z.scale = 4; Sys_UpdateWindows (W_Z|W_Z_OVERLAY); break; case ID_VIEW_ZZOOMOUT: z.scale *= 4.0/5; if (z.scale < 0.125) z.scale = 0.125; Sys_UpdateWindows (W_Z|W_Z_OVERLAY); break; case ID_VIEW_CENTER: camera.angles[ROLL] = camera.angles[PITCH] = 0; camera.angles[YAW] = 22.5 * floor( (camera.angles[YAW]+11)/22.5 ); Sys_UpdateWindows (W_CAMERA|W_XY_OVERLAY); break; case ID_VIEW_UPFLOOR: Cam_ChangeFloor (true); break; case ID_VIEW_DOWNFLOOR: Cam_ChangeFloor (false); break; case ID_VIEW_SHOWNAMES: g_qeglobals.d_savedinfo.show_names = !g_qeglobals.d_savedinfo.show_names; CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWNAMES, MF_BYCOMMAND | (g_qeglobals.d_savedinfo.show_names ? MF_CHECKED : MF_UNCHECKED) ); Map_BuildBrushData(); Sys_UpdateWindows (W_XY); break; case ID_VIEW_SHOWCOORDINATES: g_qeglobals.d_savedinfo.show_coordinates ^= 1; CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWCOORDINATES, MF_BYCOMMAND | (g_qeglobals.d_savedinfo.show_coordinates ? MF_CHECKED : MF_UNCHECKED) ); Sys_UpdateWindows (W_XY); break; case ID_VIEW_SHOWBLOCKS: g_qeglobals.show_blocks ^= 1; CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWBLOCKS, MF_BYCOMMAND | (g_qeglobals.show_blocks ? MF_CHECKED : MF_UNCHECKED) ); Sys_UpdateWindows (W_XY); break; case ID_VIEW_SHOWLIGHTS: if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_LIGHTS ) & EXCLUDE_LIGHTS ) CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWLIGHTS, MF_BYCOMMAND | MF_UNCHECKED ); else CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWLIGHTS, MF_BYCOMMAND | MF_CHECKED ); Sys_UpdateWindows (W_XY|W_CAMERA); break; case ID_VIEW_SHOWPATH: if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_PATHS ) & EXCLUDE_PATHS ) CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWPATH, MF_BYCOMMAND | MF_UNCHECKED ); else CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWPATH, MF_BYCOMMAND | MF_CHECKED ); Sys_UpdateWindows (W_XY|W_CAMERA); break; case ID_VIEW_SHOWENT: if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_ENT ) & EXCLUDE_ENT ) CheckMenuItem( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWENT, MF_BYCOMMAND | MF_UNCHECKED); else CheckMenuItem( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWENT, MF_BYCOMMAND | MF_CHECKED); Sys_UpdateWindows (W_XY|W_CAMERA); break; case ID_VIEW_SHOWWATER: if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_WATER ) & EXCLUDE_WATER ) CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWWATER, MF_BYCOMMAND | MF_UNCHECKED ); else CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWWATER, MF_BYCOMMAND | MF_CHECKED ); Sys_UpdateWindows (W_XY|W_CAMERA); break; case ID_VIEW_SHOWCLIP: if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_CLIP ) & EXCLUDE_CLIP ) CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWCLIP, MF_BYCOMMAND | MF_UNCHECKED ); else CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWCLIP, MF_BYCOMMAND | MF_CHECKED ); Sys_UpdateWindows (W_XY|W_CAMERA); break; case ID_VIEW_SHOWDETAIL: if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_DETAIL ) & EXCLUDE_DETAIL ) { CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWDETAIL, MF_BYCOMMAND | MF_UNCHECKED ); SetWindowText (g_qeglobals.d_hwndCamera, "Camera View (DETAIL EXCLUDED)"); } else { CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWDETAIL, MF_BYCOMMAND | MF_CHECKED ); SetWindowText (g_qeglobals.d_hwndCamera, "Camera View"); } Sys_UpdateWindows (W_XY|W_CAMERA); break; case ID_VIEW_SHOWWORLD: if ( ( g_qeglobals.d_savedinfo.exclude ^= EXCLUDE_WORLD ) & EXCLUDE_WORLD ) CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWWORLD, MF_BYCOMMAND | MF_UNCHECKED ); else CheckMenuItem ( GetMenu(g_qeglobals.d_hwndMain), ID_VIEW_SHOWWORLD, MF_BYCOMMAND | MF_CHECKED ); Sys_UpdateWindows (W_XY|W_CAMERA); break; // // grid menu // case ID_GRID_1: case ID_GRID_2: case ID_GRID_4: case ID_GRID_8: case ID_GRID_16: case ID_GRID_32: case ID_GRID_64: { hMenu = GetMenu(hWnd); CheckMenuItem(hMenu, ID_GRID_1, MF_BYCOMMAND | MF_UNCHECKED); CheckMenuItem(hMenu, ID_GRID_2, MF_BYCOMMAND | MF_UNCHECKED); CheckMenuItem(hMenu, ID_GRID_4, MF_BYCOMMAND | MF_UNCHECKED); CheckMenuItem(hMenu, ID_GRID_8, MF_BYCOMMAND | MF_UNCHECKED); CheckMenuItem(hMenu, ID_GRID_16, MF_BYCOMMAND | MF_UNCHECKED); CheckMenuItem(hMenu, ID_GRID_32, MF_BYCOMMAND | MF_UNCHECKED); CheckMenuItem(hMenu, ID_GRID_64, MF_BYCOMMAND | MF_UNCHECKED); switch (LOWORD(wParam)) { case ID_GRID_1: g_qeglobals.d_gridsize = 0; break; case ID_GRID_2: g_qeglobals.d_gridsize = 1; break; case ID_GRID_4: g_qeglobals.d_gridsize = 2; break; case ID_GRID_8: g_qeglobals.d_gridsize = 3; break; case ID_GRID_16: g_qeglobals.d_gridsize = 4; break; case ID_GRID_32: g_qeglobals.d_gridsize = 5; break; case ID_GRID_64: g_qeglobals.d_gridsize = 6; break; } g_qeglobals.d_gridsize = 1 << g_qeglobals.d_gridsize; CheckMenuItem(hMenu, LOWORD(wParam), MF_BYCOMMAND | MF_CHECKED); Sys_UpdateWindows (W_XY|W_Z); break; } // // texture menu // case ID_VIEW_NEAREST: case ID_VIEW_NEARESTMIPMAP: case ID_VIEW_LINEAR: case ID_VIEW_BILINEAR: case ID_VIEW_BILINEARMIPMAP: case ID_VIEW_TRILINEAR: case ID_TEXTURES_WIREFRAME: case ID_TEXTURES_FLATSHADE: Texture_SetMode (LOWORD(wParam)); break; case ID_TEXTURES_SHOWINUSE: Sys_BeginWait (); Texture_ShowInuse (); SetInspectorMode(W_TEXTURE); break; case ID_TEXTURES_INSPECTOR: DoSurface (); break; case CMD_TEXTUREWAD: case CMD_TEXTUREWAD+1: case CMD_TEXTUREWAD+2: case CMD_TEXTUREWAD+3: case CMD_TEXTUREWAD+4: case CMD_TEXTUREWAD+5: case CMD_TEXTUREWAD+6: case CMD_TEXTUREWAD+7: case CMD_TEXTUREWAD+8: case CMD_TEXTUREWAD+9: case CMD_TEXTUREWAD+10: case CMD_TEXTUREWAD+11: case CMD_TEXTUREWAD+12: case CMD_TEXTUREWAD+13: case CMD_TEXTUREWAD+14: case CMD_TEXTUREWAD+15: case CMD_TEXTUREWAD+16: case CMD_TEXTUREWAD+17: case CMD_TEXTUREWAD+18: case CMD_TEXTUREWAD+19: case CMD_TEXTUREWAD+20: case CMD_TEXTUREWAD+21: case CMD_TEXTUREWAD+22: case CMD_TEXTUREWAD+23: case CMD_TEXTUREWAD+24: case CMD_TEXTUREWAD+25: case CMD_TEXTUREWAD+26: case CMD_TEXTUREWAD+27: case CMD_TEXTUREWAD+28: case CMD_TEXTUREWAD+29: case CMD_TEXTUREWAD+30: case CMD_TEXTUREWAD+31: Sys_BeginWait (); Texture_ShowDirectory (LOWORD(wParam)); SetInspectorMode(W_TEXTURE); break; // // bsp menu // case CMD_BSPCOMMAND: case CMD_BSPCOMMAND+1: case CMD_BSPCOMMAND+2: case CMD_BSPCOMMAND+3: case CMD_BSPCOMMAND+4: case CMD_BSPCOMMAND+5: case CMD_BSPCOMMAND+6: case CMD_BSPCOMMAND+7: case CMD_BSPCOMMAND+8: case CMD_BSPCOMMAND+9: case CMD_BSPCOMMAND+10: case CMD_BSPCOMMAND+11: case CMD_BSPCOMMAND+12: case CMD_BSPCOMMAND+13: case CMD_BSPCOMMAND+14: case CMD_BSPCOMMAND+15: case CMD_BSPCOMMAND+16: case CMD_BSPCOMMAND+17: case CMD_BSPCOMMAND+18: case CMD_BSPCOMMAND+19: case CMD_BSPCOMMAND+20: case CMD_BSPCOMMAND+21: case CMD_BSPCOMMAND+22: case CMD_BSPCOMMAND+23: case CMD_BSPCOMMAND+24: case CMD_BSPCOMMAND+25: case CMD_BSPCOMMAND+26: case CMD_BSPCOMMAND+27: case CMD_BSPCOMMAND+28: case CMD_BSPCOMMAND+29: case CMD_BSPCOMMAND+30: case CMD_BSPCOMMAND+31: { extern char *bsp_commands[256]; RunBsp (bsp_commands[LOWORD(wParam-CMD_BSPCOMMAND)]); } break; // // misc menu // case ID_MISC_BENCHMARK: SendMessage ( g_qeglobals.d_hwndCamera, WM_USER+267, 0, 0); break; case ID_TEXTUREBK: DoColor(COLOR_TEXTUREBACK); Sys_UpdateWindows (W_ALL); break; case ID_MISC_SELECTENTITYCOLOR: { extern int inspector_mode; if ( ( inspector_mode == W_ENTITY ) && DoColor(COLOR_ENTITY) == true ) { extern void AddProp( void ); char buffer[100]; sprintf( buffer, "%f %f %f", g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][0], g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][1], g_qeglobals.d_savedinfo.colors[COLOR_ENTITY][2] ); SetWindowText( hwndEnt[EntValueField], buffer ); SetWindowText( hwndEnt[EntKeyField], "_color" ); AddProp(); } Sys_UpdateWindows( W_ALL ); } break; case ID_MISC_PRINTXY: WXY_Print(); break; case ID_COLORS_XYBK: DoColor(COLOR_GRIDBACK); Sys_UpdateWindows (W_ALL); break; case ID_COLORS_MAJOR: DoColor(COLOR_GRIDMAJOR); Sys_UpdateWindows (W_ALL); break; case ID_COLORS_MINOR: DoColor(COLOR_GRIDMINOR); Sys_UpdateWindows (W_ALL); break; case ID_MISC_GAMMA: DoGamma(); break; case ID_MISC_FINDBRUSH: DoFind(); break; case ID_MISC_NEXTLEAKSPOT: Pointfile_Next(); break; case ID_MISC_PREVIOUSLEAKSPOT: Pointfile_Prev(); break; // // brush menu // case ID_BRUSH_3SIDED: Brush_MakeSided (3); break; case ID_BRUSH_4SIDED: Brush_MakeSided (4); break; case ID_BRUSH_5SIDED: Brush_MakeSided (5); break; case ID_BRUSH_6SIDED: Brush_MakeSided (6); break; case ID_BRUSH_7SIDED: Brush_MakeSided (7); break; case ID_BRUSH_8SIDED: Brush_MakeSided (8); break; case ID_BRUSH_9SIDED: Brush_MakeSided (9); break; case ID_BRUSH_ARBITRARYSIDED: DoSides (); break; // // select menu // case ID_BRUSH_FLIPX: Select_FlipAxis (0); break; case ID_BRUSH_FLIPY: Select_FlipAxis (1); break; case ID_BRUSH_FLIPZ: Select_FlipAxis (2); break; case ID_BRUSH_ROTATEX: Select_RotateAxis (0, 90); break; case ID_BRUSH_ROTATEY: Select_RotateAxis (1, 90); break; case ID_BRUSH_ROTATEZ: Select_RotateAxis (2, 90); break; case ID_SELECTION_ARBITRARYROTATION: DoRotate (); break; case ID_SELECTION_UNGROUPENTITY: Select_Ungroup (); break; case ID_SELECTION_CONNECT: ConnectEntities (); break; case ID_SELECTION_DRAGVERTECIES: if (g_qeglobals.d_select_mode == sel_vertex) { g_qeglobals.d_select_mode = sel_brush; Sys_UpdateWindows (W_ALL); } else { SetupVertexSelection (); if (g_qeglobals.d_numpoints) g_qeglobals.d_select_mode = sel_vertex; } break; case ID_SELECTION_DRAGEDGES: if (g_qeglobals.d_select_mode == sel_edge) { g_qeglobals.d_select_mode = sel_brush; Sys_UpdateWindows (W_ALL); } else { SetupVertexSelection (); if (g_qeglobals.d_numpoints) g_qeglobals.d_select_mode = sel_edge; } break; case ID_SELECTION_SELECTPARTIALTALL: Select_PartialTall (); break; case ID_SELECTION_SELECTCOMPLETETALL: Select_CompleteTall (); break; case ID_SELECTION_SELECTTOUCHING: Select_Touching (); break; case ID_SELECTION_SELECTINSIDE: Select_Inside (); break; case ID_SELECTION_CSGSUBTRACT: CSG_Subtract (); break; case ID_SELECTION_MAKEHOLLOW: CSG_MakeHollow (); break; case ID_SELECTION_CLONE: Select_Clone (); break; case ID_SELECTION_DELETE: Select_Delete (); break; case ID_SELECTION_DESELECT: Select_Deselect (); break; case ID_SELECTION_MAKE_DETAIL: Select_MakeDetail (); break; case ID_SELECTION_MAKE_STRUCTURAL: Select_MakeStructural (); break; // // region menu // case ID_REGION_OFF: Map_RegionOff (); break; case ID_REGION_SETXY: Map_RegionXY (); break; case ID_REGION_SETTALLBRUSH: Map_RegionTallBrush (); break; case ID_REGION_SETBRUSH: Map_RegionBrush (); break; case ID_REGION_SETSELECTION: Map_RegionSelectedBrushes (); break; case IDMRU+1: case IDMRU+2: case IDMRU+3: case IDMRU+4: case IDMRU+5: case IDMRU+6: case IDMRU+7: case IDMRU+8: case IDMRU+9: DoMru(hWnd,LOWORD(wParam)); break; // // help menu // case ID_HELP_ABOUT: DoAbout(); break; default: return FALSE; } return TRUE; }
/* =============== ConnectEntities Sets target / targetname on the two entities selected from the first selected to the secon =============== */ void ConnectEntities (void) { entity_t *e1, *e2, *e; char *target, *tn; int maxtarg, targetnum; char newtarg[32]; if (g_qeglobals.d_select_count != 2) { Sys_Status ("Must have two brushes selected.", 0); Sys_Beep (); return; } e1 = g_qeglobals.d_select_order[0]->owner; e2 = g_qeglobals.d_select_order[1]->owner; if (e1 == world_entity || e2 == world_entity) { Sys_Status ("Can't connect to the world.", 0); Sys_Beep (); return; } if (e1 == e2) { Sys_Status ("Brushes are from same entity.", 0); Sys_Beep (); return; } target = ValueForKey (e1, "target"); if (target && target[0]) strcpy (newtarg, target); else { target = ValueForKey (e2, "targetname"); if (target && target[0]) strcpy (newtarg, target); else { // make a unique target value maxtarg = 0; for (e=entities.next ; e != &entities ; e=e->next) { tn = ValueForKey (e, "targetname"); if (tn && tn[0]) { targetnum = atoi(tn+1); if (targetnum > maxtarg) maxtarg = targetnum; } } sprintf (newtarg, "t%i", maxtarg+1); } } SetKeyValue (e1, "target", newtarg); SetKeyValue (e2, "targetname", newtarg); Sys_UpdateWindows (W_XY | W_CAMERA); Select_Deselect(); Select_Brush (g_qeglobals.d_select_order[1]); }
/* ======================================================================================================================= ConnectEntities Sets target / name on the two entities selected from the first selected to the secon ======================================================================================================================= */ void ConnectEntities(void) { entity_t *e1; const char *target; idStr strTarget; int i, t; if (g_qeglobals.d_select_count < 2) { Sys_Status("Must have at least two brushes selected.", 0); Sys_Beep(); return; } e1 = g_qeglobals.d_select_order[0]->owner; for (i = 0; i < g_qeglobals.d_select_count; i++) { if (g_qeglobals.d_select_order[i]->owner == world_entity) { Sys_Status("Can't connect to the world.", 0); Sys_Beep(); return; } } for (i = 1; i < g_qeglobals.d_select_count; i++) { if (e1 == g_qeglobals.d_select_order[i]->owner) { Sys_Status("Brushes are from same entity.", 0); Sys_Beep(); return; } } target = ValueForKey(e1, "target"); if ( target && *target) { for (t = 1; t < 2048; t++) { target = ValueForKey(e1, va("target%i", t)); if (target && *target) { continue; } else { break; } } } else { t = 0; } for (i = 1; i < g_qeglobals.d_select_count; i++) { target = ValueForKey(g_qeglobals.d_select_order[i]->owner, "name"); if (target && *target) { strTarget = target; } else { UniqueTargetName(strTarget); } if (t == 0) { SetKeyValue(e1, "target", strTarget); } else { SetKeyValue(e1, va("target%i", t), strTarget); } t++; } Sys_UpdateWindows(W_XY | W_CAMERA); Select_Deselect(); Select_Brush(g_qeglobals.d_select_order[1]); }
void DoTower(void) { brush_t* brush1 = NULL; brush_t* brush2 = NULL; brush_t* newBrush = NULL; brush_t* tempBrush = NULL; face_t* topFace = NULL; face_t* bottomFace = NULL; face_t* curFace; face_t* faceList; int zFlag = 0; int i = 0; // loop counter if (g_qeglobals.d_select_count != 2) { Sys_Printf ("Error: you must have exactly 2 brushes selected\n"); Sys_Beep (); return; } brush1 = selected_brushes.next; brush2 = selected_brushes.next->next; // establish brush1 as the upper brush if (brush2->maxs[2] > brush1->mins[2]) { tempBrush = brush1; brush1 = brush2; brush2 = tempBrush; } // test to insure brushes do not "overlap" in the Z direction if (brush2->maxs[2] > brush1->mins[2]) { Sys_Printf ("Brushes are not separated in the Z direction!"); Sys_Beep(); return; } // find the bottom Z plane (topFace) in 1 and top Z plane in 2 (bottomFace) topFace = brush1->brush_faces; while (topFace != NULL) { zFlag = 0; for (i = 0; i<3; i++) { if (abs(topFace->planepts[i][2] - brush1->mins[2]) < TOWER_EPSILON) { zFlag++; } } if (zFlag == 3) { break; } else { topFace = topFace->next; } } if (topFace == NULL) { Sys_Printf("Couldn't find flat bottom-face in top brush", 0); Sys_Beep(); return; } bottomFace = brush2->brush_faces; while (bottomFace != NULL) { zFlag = 0; for (i = 0; i<3; i++) { if (abs(bottomFace->planepts[i][2] - brush2->maxs[2]) < TOWER_EPSILON) { zFlag++; } } if (zFlag == 3) { break; } else { bottomFace = bottomFace->next; } } if (bottomFace == NULL) { Sys_Printf ("Couldn't find flat top-face in bottom brush", 0); Sys_Beep(); return; } // count vertices on top and bottom planes to make sure they are equal if (topFace->face_winding->numpoints != bottomFace->face_winding->numpoints) { Sys_Printf ("Top and Bottom faces don't have same #'s of vertices!", 0); Sys_Beep(); return; } // put top and bottom faces on brush // reverse winding for top and bottom faceList = Face_Alloc(); for ( i = 0; i<3; i++) { VectorCopy(topFace->planepts[2-i],faceList->planepts[i]); } curFace = Face_Alloc(); for ( i = 0; i < 3; i++) { VectorCopy(bottomFace->planepts[2-i],curFace->planepts[i]); } curFace->next = faceList; faceList = curFace; curFace = MakePlaneList(topFace, bottomFace); if (curFace == NULL) { Sys_Printf ("Couldn't make planes for tower!", 0); Sys_Beep(); return; } else { faceList->next->next = curFace; } newBrush = (brush_t*)qmalloc(sizeof(brush_t)); newBrush->brush_faces = faceList; Select_Deselect(); Brush_AddToList (newBrush, &selected_brushes); Entity_LinkBrush (world_entity, newBrush); Brush_Build(newBrush); // UNDO_FinishBrushAdd("&Undo Tower"); Sys_UpdateWindows(W_ALL); return; }
// return is simply a count of how many texture replacements took place, only used for friendly-stats on completion... // // the arg list for this is getting pretty gay now, the reason being that the various update-windows routines that // radiant has don't work like windows ones, where paint messages are just issued then it returns instantly // (and eliminates dup paint calls), radiant actually goes off and performs them, so I need to stop it doing that // when calling this in the middle of a loop... // int FindReplaceTextures(const char* pFind, const char* pReplace, bool bSelected, bool bForce, bool bReScale, bool bSelectOnlyNoReplace, bool bInhibitCameraUpdate /*= false*/, bool bCalledDuringLoopAndNotFirstTime /*= false*/ // sigh, but saves an update-all-windows call ) { int iReplacedCount = 0; if (bSelectOnlyNoReplace) { bSelected = false; bForce = false; } const brush_t* const pList = (bSelected) ? &selected_brushes : &active_brushes; if (!bSelected) { if (!bCalledDuringLoopAndNotFirstTime) Select_Deselect(); } const qtexture_t * const pReplaceTex = Texture_ForName(pReplace); // count them first, so I can show progress.. // int iBrushCount = 0; for (brush_t* pBrush = pList->next ; pBrush != pList; pBrush = pBrush->next) { iBrushCount++; } Sys_Printf("\n"); brush_t* pNextBrush = pList->next->prev; // doesn't matter what value assigned here really. Note sneaky workaround here because can't point at non-const item, so use next->prev for (pBrush = pList->next ; pBrush != pList; pBrush = pNextBrush) { pNextBrush = pBrush->next; // just so they don't think it's locked up... // if ( !((iBrushCount--) & 15)) { Sys_Printf("."); } OutputDebugString(va("iBrushCount = %d\n",iBrushCount)); if (pBrush->patchBrush) { if (bSelectOnlyNoReplace) { if (!stricmp(pFind,Patch_FromBrush_GetTextureName(pBrush))) { g_bScreenUpdates = false; // !!!!!!!!!!!!!!!!!!!!!!!!!!!! Select_Brush(pBrush, false); g_bScreenUpdates = true; // !!!!!!!!!!!!!!!!!!!!!!!!!!!! continue; } } else { iReplacedCount += (Patch_FindReplaceTexture(pBrush, pFind, pReplace, bForce))?1:0; } } for (face_t* pFace = pBrush->brush_faces; pFace; pFace = pFace->next) { if(bForce || strcmpi(pFace->texdef.name, pFind) == 0) { iReplacedCount++; if (bSelectOnlyNoReplace) { g_bScreenUpdates = false; // !!!!!!!!!!!!!!!!!!!!!!!!!!!! Select_Brush(pBrush, false); g_bScreenUpdates = true; // !!!!!!!!!!!!!!!!!!!!!!!!!!!! break; } else { if (bReScale) { if (pFace->d_texture == pReplaceTex) {//not changing textures, so reset the scale instead const float fXAspect = fTEXTURE_SCALE / (float) pFace->texdef.scale[0]; const float fYAspect = fTEXTURE_SCALE / (float) pFace->texdef.scale[1]; pFace->texdef.scale[0] = fTEXTURE_SCALE; pFace->texdef.scale[1] = fTEXTURE_SCALE; pFace->texdef.shift[0] /= fXAspect; pFace->texdef.shift[1] /= fYAspect; } else { const float fXAspect = (float)(pFace->d_texture->width) / (float) pReplaceTex->width; const float fYAspect = (float)(pFace->d_texture->height) / (float) pReplaceTex->height; pFace->texdef.scale[0] *= fXAspect; pFace->texdef.scale[1] *= fYAspect; pFace->texdef.shift[0] /= fXAspect; pFace->texdef.shift[1] /= fYAspect; } } strcpy(pFace->texdef.name, pReplace); pFace->d_texture = (qtexture_t *)pReplaceTex; } } } if (!bSelectOnlyNoReplace) { Brush_Build(pBrush); } } Sys_Printf("\n"); if (!bInhibitCameraUpdate) { Sys_UpdateWindows (W_CAMERA); } return iReplacedCount; }
/* ============= Undo_Redo ============= */ void Undo_Redo(void) { undo_t *redo; brush_t *pBrush, *pNextBrush; entity_t *pEntity, *pNextEntity, *pRedoEntity; if (!g_lastredo) { Sys_Status("Nothing left to redo.\n"); return; } if (g_lastundo) { if (!g_lastundo->done) { Sys_Status("WARNING: last undo not finished.\n"); } } // get the last redo redo = g_lastredo; if (g_lastredo->prev) g_lastredo->prev->next = NULL; else g_redolist = NULL; g_lastredo = g_lastredo->prev; // Undo_GeneralStart(redo->operation); // remove current selection Select_Deselect(); // move "created" brushes back to the last undo for (pBrush = active_brushes.next; pBrush != NULL && pBrush != &active_brushes; pBrush = pNextBrush) { pNextBrush = pBrush->next; if (pBrush->redoId == redo->id) { //move the brush to the undo Brush_RemoveFromList(pBrush); Brush_AddToList(pBrush, &g_lastundo->brushlist); g_undoMemorySize += Brush_MemorySize(pBrush); pBrush->ownerId = pBrush->owner->entityId; Entity_UnlinkBrush(pBrush); } } // move "created" entities back to the last undo for (pEntity = entities.next; pEntity != NULL && pEntity != &entities; pEntity = pNextEntity) { pNextEntity = pEntity->next; if (pEntity->redoId == redo->id) { // check if this entity is in the redo for (pRedoEntity = redo->entitylist.next; pRedoEntity != NULL && pRedoEntity != &redo->entitylist; pRedoEntity = pRedoEntity->next) { // move brushes to the redo entity if (pRedoEntity->entityId == pEntity->entityId) { pRedoEntity->brushes.next = pEntity->brushes.next; pRedoEntity->brushes.prev = pEntity->brushes.prev; pEntity->brushes.next = &pEntity->brushes; pEntity->brushes.prev = &pEntity->brushes; } } // //Entity_Free(pEntity); //move the entity to the redo Entity_RemoveFromList(pEntity); Entity_AddToList(pEntity, &g_lastundo->entitylist); g_undoMemorySize += Entity_MemorySize(pEntity); } } // add the undo entities back into the entity list for (pEntity = redo->entitylist.next; pEntity != NULL && pEntity != &redo->entitylist; pEntity = redo->entitylist.next) { //if this is the world entity if (pEntity->entityId == world_entity->entityId) { //free the epairs of the world entity Entity_FreeEpairs(world_entity); //set back the original epairs world_entity->epairs = pEntity->epairs; //free the world_entity clone that stored the epairs Entity_Free(pEntity); } else { Entity_RemoveFromList(pEntity); Entity_AddToList(pEntity, &entities); } } // add the redo brushes back into the selected brushes for (pBrush = redo->brushlist.next; pBrush != NULL && pBrush != &redo->brushlist; pBrush = redo->brushlist.next) { Brush_RemoveFromList(pBrush); Brush_AddToList(pBrush, &active_brushes); for (pEntity = entities.next; pEntity != NULL && pEntity != &entities; pEntity = pEntity->next) { if (pEntity->entityId == pBrush->ownerId) { Entity_LinkBrush(pEntity, pBrush); break; } } //if the brush is not linked then it should be linked into the world entity if (pEntity == NULL || pEntity == &entities) { Entity_LinkBrush(world_entity, pBrush); } //build the brush //Brush_Build(pBrush); Select_Brush(pBrush); } // Undo_End(); // common->Printf("%s redone.\n", redo->operation); // g_redoId--; // free the undo Mem_Free(redo); // g_bScreenUpdates = true; Sys_UpdateWindows(W_ALL); }
/* ============= Undo_Undo ============= */ void Undo_Undo(boolean bSilent) { // spog - disable undo if undo levels = 0 if (g_PrefsDlg.m_nUndoLevels == 0) { Sys_Printf("Undo_Undo: undo is disabled.\n"); return; } undo_t *undo, *redo; brush_t *pBrush, *pNextBrush; entity_t *pEntity, *pNextEntity, *pUndoEntity; if (!g_lastundo) { Sys_Printf("Nothing left to undo.\n"); return; } if (!g_lastundo->done) { Sys_Printf("Undo_Undo: WARNING: last undo not yet finished!\n"); } // get the last undo undo = g_lastundo; if (g_lastundo->prev) g_lastundo->prev->next = NULL; else g_undolist = NULL; g_lastundo = g_lastundo->prev; //allocate a new redo redo = (undo_t *) malloc(sizeof(undo_t)); if (!redo) return; memset(redo, 0, sizeof(undo_t)); redo->brushlist.next = &redo->brushlist; redo->brushlist.prev = &redo->brushlist; redo->entitylist.next = &redo->entitylist; redo->entitylist.prev = &redo->entitylist; if (g_lastredo) g_lastredo->next = redo; else g_redolist = redo; redo->prev = g_lastredo; redo->next = NULL; g_lastredo = redo; redo->time = Sys_DoubleTime(); redo->id = g_redoId++; redo->done = true; redo->operation = undo->operation; //reset the redo IDs of all brushes using the new ID for (pBrush = active_brushes.next; pBrush != NULL && pBrush != &active_brushes; pBrush = pBrush->next) { if (pBrush->redoId == redo->id) { pBrush->redoId = 0; } } for (pBrush = selected_brushes.next; pBrush != NULL && pBrush != &selected_brushes; pBrush = pBrush->next) { if (pBrush->redoId == redo->id) { pBrush->redoId = 0; } } //reset the redo IDs of all entities using thew new ID for (pEntity = entities.next; pEntity != NULL && pEntity != &entities; pEntity = pEntity->next) { if (pEntity->redoId == redo->id) { pEntity->redoId = 0; } } // deselect current sutff Select_Deselect(); // move "created" brushes to the redo for (pBrush = active_brushes.next; pBrush != NULL && pBrush != &active_brushes; pBrush=pNextBrush) { pNextBrush = pBrush->next; if (pBrush->undoId == undo->id) { //Brush_Free(pBrush); //move the brush to the redo Brush_RemoveFromList(pBrush); Brush_AddToList(pBrush, &redo->brushlist); //make sure the ID of the owner is stored pBrush->ownerId = pBrush->owner->entityId; //unlink the brush from the owner entity Entity_UnlinkBrush(pBrush); } } // move "created" entities to the redo for (pEntity = entities.next; pEntity != NULL && pEntity != &entities; pEntity = pNextEntity) { pNextEntity = pEntity->next; if (pEntity->undoId == undo->id) { // check if this entity is in the undo for (pUndoEntity = undo->entitylist.next; pUndoEntity != NULL && pUndoEntity != &undo->entitylist; pUndoEntity = pUndoEntity->next) { // move brushes to the undo entity if (pUndoEntity->entityId == pEntity->entityId) { pUndoEntity->brushes.next = pEntity->brushes.next; pUndoEntity->brushes.prev = pEntity->brushes.prev; pEntity->brushes.next = &pEntity->brushes; pEntity->brushes.prev = &pEntity->brushes; } } // //Entity_Free(pEntity); //move the entity to the redo Entity_RemoveFromList(pEntity); Entity_AddToList(pEntity, &redo->entitylist); } } // add the undo entities back into the entity list for (pEntity = undo->entitylist.next; pEntity != NULL && pEntity != &undo->entitylist; pEntity = undo->entitylist.next) { g_undoMemorySize -= Entity_MemorySize(pEntity); //if this is the world entity if (pEntity->entityId == world_entity->entityId) { epair_t* tmp = world_entity->epairs; world_entity->epairs = pEntity->epairs; pEntity->epairs = tmp; Entity_Free(pEntity); } else { Entity_RemoveFromList(pEntity); Entity_AddToList(pEntity, &entities); pEntity->redoId = redo->id; } } // add the undo brushes back into the selected brushes for (pBrush = undo->brushlist.next; pBrush != NULL && pBrush != &undo->brushlist; pBrush = undo->brushlist.next) { //Sys_Printf("Owner ID: %i\n",pBrush->ownerId); g_undoMemorySize -= Brush_MemorySize(pBrush); Brush_RemoveFromList(pBrush); Brush_AddToList(pBrush, &active_brushes); for (pEntity = entities.next; pEntity != NULL && pEntity != &entities; pEntity = pEntity->next) // fixes broken undo on entities { //Sys_Printf("Entity ID: %i\n",pEntity->entityId); if (pEntity->entityId == pBrush->ownerId) { Entity_LinkBrush(pEntity, pBrush); break; } } //if the brush is not linked then it should be linked into the world entity //++timo FIXME: maybe not, maybe we've lost this entity's owner! if (pEntity == NULL || pEntity == &entities) { Entity_LinkBrush(world_entity, pBrush); } //build the brush //Brush_Build(pBrush); Select_Brush(pBrush); pBrush->redoId = redo->id; } if (!bSilent) Sys_Printf("%s undone.\n", undo->operation); // free the undo g_undoMemorySize -= sizeof(undo_t); free(undo); g_undoSize--; g_undoId--; if (g_undoId <= 0) g_undoId = 2 * g_undoMaxSize; // g_bScreenUpdates = true; UpdateSurfaceDialog(); Sys_UpdateWindows(W_ALL); }
void WINAPI QERApp_DeselectAllBrushes () { AFX_MANAGE_STATE(AfxGetStaticModuleState()); Select_Deselect(); Sys_UpdateWindows(W_ALL); }
/* ======================================================================================================================= Map_LoadFile ======================================================================================================================= */ void Map_LoadFile(const char *filename) { entity_t *ent; CWaitDlg dlg; idStr fileStr, status; idMapFile mapfile; Sys_BeginWait(); Select_Deselect(); dlg.AllowCancel( true ); idStr( filename ).ExtractFileName( fileStr ); sprintf( status, "Loading %s...", fileStr.c_str() ); dlg.SetWindowText( status ); sprintf( status, "Reading file %s...", fileStr.c_str() ); dlg.SetText( status ); // SetInspectorMode(W_CONSOLE); fileStr = filename; fileStr.BackSlashesToSlashes(); common->Printf( "Map_LoadFile: %s\n", fileStr.c_str() ); Map_Free(); g_qeglobals.d_parsed_brushes = 0; strcpy( currentmap, filename ); if(mapfile.Parse(filename, true, true)) { g_qeglobals.bNeedConvert = false; g_qeglobals.bOldBrushes = false; g_qeglobals.bPrimitBrushes = false; g_qeglobals.mapVersion = 1.0; long lastUpdate = 0; int count = mapfile.GetNumEntities(); for (int i = 0; i < count; i++) { idMapEntity *mapent = mapfile.GetEntity(i); if (mapent) { idStr classname = mapent->epairs.GetString("classname"); // Update 20 times a second if ( (GetTickCount() - lastUpdate) > 50 ) { lastUpdate = GetTickCount(); sprintf(status, "Loading entity %i (%s)...", i, classname.c_str()); dlg.SetText(status); } if ( dlg.CancelPressed() ) { Sys_Status("Map load cancelled.\n"); Map_New(); return; } if (classname == "worldspawn") { world_entity = EntityFromMapEntity(mapent, &dlg); Entity_PostParse(world_entity, &active_brushes); } else { ent = EntityFromMapEntity(mapent, &dlg); Entity_PostParse(ent, &active_brushes); Entity_Name(ent, true); // add the entity to the end of the entity list ent->next = &entities; ent->prev = entities.prev; entities.prev->next = ent; entities.prev = ent; g_qeglobals.d_num_entities++; } } } } if (!world_entity) { Sys_Status("No worldspawn in map.\n"); Map_New(); return; } common->Printf("--- LoadMapFile ---\n"); common->Printf("%s\n", fileStr.c_str()); common->Printf("%5i brushes\n", g_qeglobals.d_parsed_brushes); common->Printf("%5i entities\n", g_qeglobals.d_num_entities); dlg.SetText("Restoring Between"); Map_RestoreBetween(); dlg.SetText("Building Brush Data"); common->Printf("Map_BuildAllDisplayLists\n"); Map_BuildBrushData(); // // reset the "need conversion" flag conversion to the good format done in // Map_BuildBrushData // g_qeglobals.bNeedConvert = false; // move the view to a start position ent = AngledEntity(); g_pParentWnd->GetCamera()->Camera().angles[PITCH] = 0; if (ent) { GetVectorForKey(ent, "origin", g_pParentWnd->GetCamera()->Camera().origin); GetVectorForKey(ent, "origin", g_pParentWnd->GetXYWnd()->GetOrigin()); g_pParentWnd->GetCamera()->Camera().angles[YAW] = FloatForKey(ent, "angle"); } else { g_pParentWnd->GetCamera()->Camera().angles[YAW] = 0; VectorCopy(vec3_origin, g_pParentWnd->GetCamera()->Camera().origin); VectorCopy(vec3_origin, g_pParentWnd->GetXYWnd()->GetOrigin()); } Map_RegionOff(); mapModified = 0; if (GetFileAttributes(filename) & FILE_ATTRIBUTE_READONLY) { fileStr += " (read only) "; } Sys_SetTitle(fileStr); Texture_ShowInuse(); if (g_pParentWnd->GetCamera()->GetRenderMode()) { g_pParentWnd->GetCamera()->BuildRendererState(); } Sys_EndWait(); Sys_UpdateWindows(W_ALL); }
// // ======================================================================================================================= // Map_ImportFile Timo 09/01/99:: called by CXYWnd::Paste & Map_ImportFile if Map_ImportFile ( prefab ), the buffer // may contain brushes in old format ( conversion needed ) // ======================================================================================================================= // void Map_ImportBuffer(char *buf, bool renameEntities) { entity_t *ent; brush_t *b = NULL; CPtrArray ptrs; Select_Deselect(); Undo_Start("import buffer"); g_qeglobals.d_parsed_brushes = 0; if (buf) { CMapStringToString mapStr; StartTokenParsing(buf); g_qeglobals.d_num_entities = 0; // // Timo will be used in Entity_Parse to detect if a conversion between brush // formats is needed // g_qeglobals.bNeedConvert = false; g_qeglobals.bOldBrushes = false; g_qeglobals.bPrimitBrushes = false; g_qeglobals.mapVersion = 1.0; if (GetToken(true)) { if (stricmp(token, "Version") == 0) { GetToken(false); g_qeglobals.mapVersion = atof(token); common->Printf("Map version: %1.2f\n", g_qeglobals.mapVersion); } else { UngetToken(); } } idDict RemappedNames; // since I can't use "map <string, string>"... sigh. So much for STL... while (1) { // // use the selected brushes list as it's handy ent = Entity_Parse (false, // &selected_brushes); // ent = Entity_Parse(false, &active_brushes); if (!ent) { break; } // end entity for undo Undo_EndEntity(ent); // end brushes for undo for (b = ent->brushes.onext; b && b != &ent->brushes; b = b->onext) { Undo_EndBrush(b); } if (!strcmp(ValueForKey(ent, "classname"), "worldspawn")) { // world brushes need to be added to the current world entity b = ent->brushes.onext; while (b && b != &ent->brushes) { brush_t *bNext = b->onext; Entity_UnlinkBrush(b); Entity_LinkBrush(world_entity, b); ptrs.Add(b); b = bNext; } } else { // the following bit remaps conflicting target/targetname key/value pairs CString str = ValueForKey(ent, "target"); CString strKey; CString strTarget(""); if (str.GetLength() > 0) { if (FindEntity("target", str.GetBuffer(0))) { if (!mapStr.Lookup(str, strKey)) { idStr key; UniqueTargetName(key); strKey = key; mapStr.SetAt(str, strKey); } strTarget = strKey; SetKeyValue(ent, "target", strTarget.GetBuffer(0)); } } /* * str = ValueForKey(ent, "name"); if (str.GetLength() > 0) { if * (FindEntity("name", str.GetBuffer(0))) { if (!mapStr.Lookup(str, strKey)) { * UniqueTargetName(strKey); mapStr.SetAt(str, strKey); } Entity_SetName(ent, * strKey.GetBuffer(0)); } } */ CString cstrNameOld = ValueForKey(ent, "name"); Entity_Name(ent, renameEntities); CString cstrNameNew = ValueForKey(ent, "name"); if (cstrNameOld != cstrNameNew) { RemappedNames.Set(cstrNameOld, cstrNameNew); } // // if (strTarget.GetLength() > 0) SetKeyValue(ent, "target", // strTarget.GetBuffer(0)); // add the entity to the end of the entity list // ent->next = &entities; ent->prev = entities.prev; entities.prev->next = ent; entities.prev = ent; g_qeglobals.d_num_entities++; for (b = ent->brushes.onext; b != &ent->brushes; b = b->onext) { ptrs.Add(b); } } } // now iterate through the remapped names, and see if there are any target-connections that need remaking... // // (I could probably write this in half the size with STL, but WTF, work with what we have...) // int iNumKeyVals = RemappedNames.GetNumKeyVals(); for (int iKeyVal=0; iKeyVal < iNumKeyVals; iKeyVal++) { const idKeyValue *pKeyVal = RemappedNames.GetKeyVal( iKeyVal ); LPCSTR psOldName = pKeyVal->GetKey().c_str(); LPCSTR psNewName = pKeyVal->GetValue().c_str(); entity_t *pEntOld = FindEntity("name", psOldName); // original ent we cloned from entity_t *pEntNew = FindEntity("name", psNewName); // cloned ent if (pEntOld && pEntNew) { CString cstrTargetNameOld = ValueForKey(pEntOld, "target"); if (!cstrTargetNameOld.IsEmpty()) { // ok, this ent was targeted at another ent, so it's clone needs updating to point to // the clone of that target, so... // entity_t *pEntOldTarget = FindEntity("name", cstrTargetNameOld); if ( pEntOldTarget ) { LPCSTR psNewTargetName = RemappedNames.GetString( cstrTargetNameOld ); if (psNewTargetName && psNewTargetName[0]) { SetKeyValue(pEntNew, "target", psNewTargetName); } } } } } } // // ::ShowWindow(g_qeglobals.d_hwndEntity, FALSE); // ::LockWindowUpdate(g_qeglobals.d_hwndEntity); // g_bScreenUpdates = false; for (int i = 0; i < ptrs.GetSize(); i++) { Brush_Build(reinterpret_cast < brush_t * > (ptrs[i]), true, false); Select_Brush(reinterpret_cast < brush_t * > (ptrs[i]), true, false); } // ::LockWindowUpdate(NULL); g_bScreenUpdates = true; ptrs.RemoveAll(); // // reset the "need conversion" flag conversion to the good format done in // Map_BuildBrushData // g_qeglobals.bNeedConvert = false; Sys_UpdateWindows(W_ALL); // Sys_MarkMapModified(); mapModified = 1; Undo_End(); }
void CreateEntity(void) { eclass_t *pecNew; entity_t *petNew; int i; HWND hwnd; char sz[1024]; // check to make sure we have a brush if (selected_brushes.next == &selected_brushes) { MessageBox(g_qeglobals.d_hwndMain, "You must have a selected brush to create an entity" , "info", 0); return; } // find out what type of entity we are trying to create hwnd = hwndEnt[EntList]; i = SendMessage(hwndEnt[EntList], LB_GETCURSEL, 0, 0); if (i < 0) { MessageBox(g_qeglobals.d_hwndMain, "You must have a selected class to create an entity" , "info", 0); return; } SendMessage(hwnd, LB_GETTEXT, i, (LPARAM)sz); if (!stricmp(sz, "worldspawn")) { MessageBox(g_qeglobals.d_hwndMain, "Can't create an entity with worldspawn.", "info", 0); return; } pecNew = Eclass_ForName(sz, false); // create it petNew = Entity_Create(pecNew); if (petNew == NULL) { MessageBox(g_qeglobals.d_hwndMain, "Failed to create entity.", "info", 0); return; } if (selected_brushes.next == &selected_brushes) edit_entity = world_entity; else edit_entity = selected_brushes.next->owner; SetKeyValuePairs(); Select_Deselect (); Select_Brush (edit_entity->brushes.onext); Sys_UpdateWindows(W_ALL); }
/* ================ Map_LoadFile ================ */ void Map_LoadFile( const char *filename ){ clock_t start, finish; double elapsed_time; start = clock(); Sys_BeginWait(); Select_Deselect(); /*! \todo FIXME TTimo why is this commented out? stability issues maybe? or duplicate feature? forcing to show the console during map load was a good thing IMO */ //SetInspectorMode(W_CONSOLE); Sys_Printf( "Loading map from %s\n", filename ); Map_Free(); //++timo FIXME: maybe even easier to have Group_Init called from Map_Free? Group_Init(); g_qeglobals.d_num_entities = 0; g_qeglobals.d_parsed_brushes = 0; // cancel the map loading process // used when conversion between standard map format and BP format is required and the user cancels the process g_bCancel_Map_LoadFile = false; strcpy( currentmap, filename ); g_bScreenUpdates = false; // leo: avoid redraws while loading the map (see fenris:1952) // prepare to let the map module do the parsing FileStream file; const char* type = strrchr( filename,'.' ); if ( type != NULL ) { type++; } // NOTE TTimo opening has binary doesn't make a lot of sense // but opening as text confuses the scriptlib parser // this may be a problem if we "rb" and use the XML parser, might have an incompatibility if ( file.Open( filename, "rb" ) ) { Map_Import( &file, type ); } else{ Sys_FPrintf( SYS_ERR, "ERROR: failed to open %s for read\n", filename ); } file.Close(); g_bScreenUpdates = true; if ( g_bCancel_Map_LoadFile ) { Sys_Printf( "Map_LoadFile canceled\n" ); Map_New(); Sys_EndWait(); return; } if ( !world_entity ) { Sys_Printf( "No worldspawn in map.\n" ); Map_New(); Sys_EndWait(); return; } finish = clock(); elapsed_time = (double)( finish - start ) / CLOCKS_PER_SEC; Sys_Printf( "--- LoadMapFile ---\n" ); Sys_Printf( "%s\n", filename ); Sys_Printf( "%5i brushes\n", g_qeglobals.d_parsed_brushes ); Sys_Printf( "%5i entities\n", g_qeglobals.d_num_entities ); Sys_Printf( "%5.2f second(s) load time\n", elapsed_time ); Sys_EndWait(); Map_RestoreBetween(); // // move the view to a start position // Map_StartPosition(); Map_RegionOff(); modified = false; Sys_SetTitle( filename ); Texture_ShowInuse(); QERApp_SortActiveShaders(); Sys_UpdateWindows( W_ALL ); }
void CSelectMsg::Highlight(){ Select_Deselect(); SelectBrush( entitynum, brushnum ); }
BOOL CConsoleDlg::PreTranslateMessage(MSG* pMsg) { if (pMsg->hwnd == editInput.GetSafeHwnd()) { if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE ) { Select_Deselect(); g_pParentWnd->SetFocus (); return TRUE; } if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN ) { ExecuteCommand(); return TRUE; } if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE ) { if (pMsg->wParam == VK_ESCAPE) { g_pParentWnd->GetCamera()->SetFocus(); Select_Deselect(); } return TRUE; } if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_UP ) { //save off the current in-progress command so we can get back to it if ( saveCurrentCommand == true ) { CString str; editInput.GetWindowText ( str ); currentCommand = str.GetBuffer ( 0 ); saveCurrentCommand = false; } if ( consoleHistory.Num () > 0 ) { editInput.SetWindowText ( consoleHistory[currentHistoryPosition] ); int selLocation = consoleHistory[currentHistoryPosition].Length (); editInput.SetSel ( selLocation , selLocation + 1); } if ( currentHistoryPosition > 0) { --currentHistoryPosition; } return TRUE; } if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_DOWN ) { int selLocation = 0; if ( currentHistoryPosition < consoleHistory.Num () - 1 ) { ++currentHistoryPosition; editInput.SetWindowText ( consoleHistory[currentHistoryPosition] ); selLocation = consoleHistory[currentHistoryPosition].Length (); } else { editInput.SetWindowText ( currentCommand ); selLocation = currentCommand.Length (); currentCommand.Clear (); saveCurrentCommand = true; } editInput.SetSel ( selLocation , selLocation + 1); return TRUE; } if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_TAB ) { common->Printf ( "Command History\n----------------\n" ); for ( int i = 0 ; i < consoleHistory.Num ();i++ ) { common->Printf ( "[cmd %d]: %s\n" , i , consoleHistory[i].c_str() ); } common->Printf ( "----------------\n" ); } if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_NEXT) { editConsole.LineScroll ( 10 ); } if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_PRIOR ) { editConsole.LineScroll ( -10 ); } if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_HOME ) { editConsole.LineScroll ( -editConsole.GetLineCount() ); } if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_END ) { editConsole.LineScroll ( editConsole.GetLineCount() ); } } return CDialog::PreTranslateMessage(pMsg); }
/* =========== Drag_Begin //++timo test three button mouse and three button emulation here ? =========== */ void Drag_Begin (int x, int y, int buttons, vec3_t xaxis, vec3_t yaxis, vec3_t origin, vec3_t dir) { trace_t t; drag_ok = false; VectorCopy (vec3_origin, pressdelta); VectorCopy (vec3_origin, vPressStart); drag_first = true; peLink = NULL; // shift LBUTTON = select entire brush if (buttons == (MK_LBUTTON | MK_SHIFT) && g_qeglobals.d_select_mode != sel_curvepoint) { int nFlag = (static_cast<bool>(::GetAsyncKeyState(VK_MENU))) ? SF_CYCLE : 0; if (dir[0] == 0 || dir[1] == 0 || dir[2] == 0) // extremely low chance of this happening from camera Select_Ray (origin, dir, nFlag | SF_ENTITIES_FIRST); // hack for XY else Select_Ray (origin, dir, nFlag); return; } // ctrl-shift LBUTTON = select single face if (buttons == (MK_LBUTTON | MK_CONTROL | MK_SHIFT) && g_qeglobals.d_select_mode != sel_curvepoint) { Sys_Printf ("Face Selection?\n"); Select_Deselect (!static_cast<bool>(::GetAsyncKeyState(VK_MENU))); Select_Ray (origin, dir, SF_SINGLEFACE); return; } // LBUTTON + all other modifiers = manipulate selection if (buttons & MK_LBUTTON) { // Drag_Setup (x, y, buttons, xaxis, yaxis, origin, dir); return; } // JONATHAN: stuff to add here int nMouseButton = g_PrefsDlg.m_nMouseButtons == 2 ? MK_RBUTTON : MK_MBUTTON; // middle button = grab texture if (buttons == nMouseButton) { t = Test_Ray (origin, dir, false); if (t.face) { //++timo clean #if 0 // g_qeglobals.d_new_brush_bottom_z = t.brush->mins[2]; // g_qeglobals.d_new_brush_top_z = t.brush->maxs[2]; // g_pParentWnd->ActiveXY()->GetViewType() // cf VIEWTYPE definition: enum VIEWTYPE {YZ, XZ, XY}; // we fit our work zone to the brush int nViewType = g_pParentWnd->ActiveXY()->GetViewType(); int nDim1 = (nViewType == YZ) ? 1 : 0; int nDim2 = (nViewType == XY) ? 1 : 2; g_qeglobals.d_work_min[nDim1] = t.brush->mins[nDim1]; g_qeglobals.d_work_max[nDim1] = t.brush->maxs[nDim1]; g_qeglobals.d_work_min[nDim2] = t.brush->mins[nDim2]; g_qeglobals.d_work_max[nDim2] = t.brush->maxs[nDim2]; #endif // JONATHAN:: On ALT-Middle mouse // Fit texture to face SHORT altdown = (GetKeyState(VK_MENU) & 0x8000); if (altdown) { // Fit Texture to brush face Face_FitTexture(t.face, 1, 1); // Build Brush to apply update Brush_Build(t.brush); //? // Update Camera View Sys_UpdateWindows (W_CAMERA); } else { UpdateWorkzone_ForBrush( t.brush ); // use a local brushprimit_texdef fitted to a default 2x2 texture brushprimit_texdef_t bp_local; ConvertTexMatWithQTexture( &t.face->brushprimit_texdef, t.face->d_texture, &bp_local, NULL ); Texture_SetTexture ( &t.face->texdef, &bp_local, false, GETPLUGINTEXDEF(t.face)); UpdateSurfaceDialog(); UpdatePatchInspector(); } } else Sys_Printf ("Did not select a texture\n"); return; } // ctrl-middle button = set entire brush to texture if (buttons == (nMouseButton|MK_CONTROL) ) { t = Test_Ray (origin, dir, false); if (t.brush) { if (t.brush->brush_faces->texdef.name[0] == '(') Sys_Printf ("Can't change an entity texture\n"); else { Brush_SetTexture (t.brush, &g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef, false, static_cast<IPluginTexdef *>( g_qeglobals.d_texturewin.pTexdef ) ); Sys_UpdateWindows (W_ALL); } } else Sys_Printf ("Didn't hit a btrush\n"); return; } // JONATHAN:HERE // ctrl-shift-middle button = set single face to texture if (buttons == (nMouseButton|MK_SHIFT|MK_CONTROL) ) { t = Test_Ray (origin, dir, false); if (t.brush) { if (t.brush->brush_faces->texdef.name[0] == '(') Sys_Printf ("Can't change an entity texture\n"); else { SetFaceTexdef (t.brush, t.face, &g_qeglobals.d_texturewin.texdef, &g_qeglobals.d_texturewin.brushprimit_texdef); Brush_Build( t.brush ); Sys_UpdateWindows (W_ALL); } } else Sys_Printf ("Didn't hit a btrush\n"); return; } if (buttons == (nMouseButton | MK_SHIFT)) { Sys_Printf("Set brush face texture info\n"); t = Test_Ray (origin, dir, false); if (t.brush) { if (t.brush->brush_faces->texdef.name[0] == '(') { if (t.brush->owner->eclass->nShowFlags & ECLASS_LIGHT) { CString strBuff; qtexture_t* pTex = g_qeglobals.d_texturewin.pShader->getTexture(); if (pTex) { vec3_t vColor; VectorCopy(pTex->color, vColor); float fLargest = 0.0f; for (int i = 0; i < 3; i++) { if (vColor[i] > fLargest) fLargest = vColor[i]; } if (fLargest == 0.0f) { vColor[0] = vColor[1] = vColor[2] = 1.0f; } else { float fScale = 1.0f / fLargest; for (int i = 0; i < 3; i++) { vColor[i] *= fScale; } } strBuff.Format("%f %f %f",pTex->color[0], pTex->color[1], pTex->color[2]); SetKeyValue(t.brush->owner, "_color", strBuff.GetBuffer(0)); Sys_UpdateWindows (W_ALL); } } else { Sys_Printf ("Can't select an entity brush face\n"); } } else { //strcpy(t.face->texdef.name,g_qeglobals.d_texturewin.texdef.name); t.face->texdef.SetName(g_qeglobals.d_texturewin.texdef.name); Brush_Build(t.brush); Sys_UpdateWindows (W_ALL); } } else Sys_Printf ("Didn't hit a brush\n"); return; } }
/* ============= Undo_Undo ============= */ void Undo_Undo(void) { undo_t *undo, *redo; brush_t *pBrush, *pNextBrush; entity_t *pEntity, *pNextEntity, *pUndoEntity; if (!g_lastundo) { Sys_Status("Nothing left to undo.\n"); return; } if (!g_lastundo->done) { Sys_Status("Undo_Undo: WARNING: last undo not yet finished!\n"); } // get the last undo undo = g_lastundo; if (g_lastundo->prev) g_lastundo->prev->next = NULL; else g_undolist = NULL; g_lastundo = g_lastundo->prev; //allocate a new redo redo = (undo_t *) Mem_ClearedAlloc(sizeof(undo_t), TAG_TOOLS); if (!redo) return; memset(redo, 0, sizeof(undo_t)); redo->brushlist.next = &redo->brushlist; redo->brushlist.prev = &redo->brushlist; redo->entitylist.next = &redo->entitylist; redo->entitylist.prev = &redo->entitylist; if (g_lastredo) g_lastredo->next = redo; else g_redolist = redo; redo->prev = g_lastredo; redo->next = NULL; g_lastredo = redo; redo->time = Sys_DoubleTime(); redo->id = g_redoId++; redo->done = true; redo->operation = undo->operation; //reset the redo IDs of all brushes using the new ID for (pBrush = active_brushes.next; pBrush != NULL && pBrush != &active_brushes; pBrush = pBrush->next) { if (pBrush->redoId == redo->id) { pBrush->redoId = 0; } } for (pBrush = selected_brushes.next; pBrush != NULL && pBrush != &selected_brushes; pBrush = pBrush->next) { if (pBrush->redoId == redo->id) { pBrush->redoId = 0; } } //reset the redo IDs of all entities using thew new ID for (pEntity = entities.next; pEntity != NULL && pEntity != &entities; pEntity = pEntity->next) { if (pEntity->redoId == redo->id) { pEntity->redoId = 0; } } // remove current selection Select_Deselect(); // move "created" brushes to the redo for (pBrush = active_brushes.next; pBrush != NULL && pBrush != &active_brushes; pBrush=pNextBrush) { pNextBrush = pBrush->next; if (pBrush->undoId == undo->id) { //Brush_Free(pBrush); //move the brush to the redo Brush_RemoveFromList(pBrush); Brush_AddToList(pBrush, &redo->brushlist); //make sure the ID of the owner is stored pBrush->ownerId = pBrush->owner->entityId; //unlink the brush from the owner entity Entity_UnlinkBrush(pBrush); } } // move "created" entities to the redo for (pEntity = entities.next; pEntity != NULL && pEntity != &entities; pEntity = pNextEntity) { pNextEntity = pEntity->next; if (pEntity->undoId == undo->id) { // check if this entity is in the undo for (pUndoEntity = undo->entitylist.next; pUndoEntity != NULL && pUndoEntity != &undo->entitylist; pUndoEntity = pUndoEntity->next) { // move brushes to the undo entity if (pUndoEntity->entityId == pEntity->entityId) { pUndoEntity->brushes.next = pEntity->brushes.next; pUndoEntity->brushes.prev = pEntity->brushes.prev; pEntity->brushes.next = &pEntity->brushes; pEntity->brushes.prev = &pEntity->brushes; } } // //Entity_Free(pEntity); //move the entity to the redo Entity_RemoveFromList(pEntity); Entity_AddToList(pEntity, &redo->entitylist); } } // add the undo entities back into the entity list for (pEntity = undo->entitylist.next; pEntity != NULL && pEntity != &undo->entitylist; pEntity = undo->entitylist.next) { g_undoMemorySize -= Entity_MemorySize(pEntity); //if this is the world entity if (pEntity->entityId == world_entity->entityId) { //free the epairs of the world entity Entity_FreeEpairs(world_entity); //set back the original epairs world_entity->epairs = pEntity->epairs; //free the world_entity clone that stored the epairs Entity_Free(pEntity); } else { Entity_RemoveFromList(pEntity); Entity_AddToList(pEntity, &entities); pEntity->redoId = redo->id; } } // add the undo brushes back into the selected brushes for (pBrush = undo->brushlist.next; pBrush != NULL && pBrush != &undo->brushlist; pBrush = undo->brushlist.next) { g_undoMemorySize -= Brush_MemorySize(pBrush); Brush_RemoveFromList(pBrush); Brush_AddToList(pBrush, &active_brushes); for (pEntity = entities.next; pEntity != NULL && pEntity != &entities; pEntity = pEntity->next) { if (pEntity->entityId == pBrush->ownerId) { Entity_LinkBrush(pEntity, pBrush); break; } } //if the brush is not linked then it should be linked into the world entity if (pEntity == NULL || pEntity == &entities) { Entity_LinkBrush(world_entity, pBrush); } //build the brush //Brush_Build(pBrush); Select_Brush(pBrush); pBrush->redoId = redo->id; } // common->Printf("%s undone.\n", undo->operation); // free the undo g_undoMemorySize -= sizeof(undo_t); Mem_Free(undo); g_undoSize--; g_undoId--; if (g_undoId <= 0) g_undoId = 2 * g_undoMaxSize; // Sys_BeginWait(); brush_t *b, *next; for (b = active_brushes.next ; b != NULL && b != &active_brushes ; b=next) { next = b->next; Brush_Build( b, true, false, false ); } for (b = selected_brushes.next ; b != NULL && b != &selected_brushes ; b=next) { next = b->next; Brush_Build( b, true, false, false ); } Sys_EndWait(); g_bScreenUpdates = true; Sys_UpdateWindows(W_ALL); }
BOOL CEntityDlg::PreTranslateMessage(MSG* pMsg) { // ---> sikk - Added //if ( pMsg->message == WM_LBUTTONDOWN || pMsg->message == WM_RBUTTONDOWN || pMsg->message == WM_MBUTTONDOWN ) { // g_Inspectors->BringWindowToTop(); //} // <--- sikk - Added if (pMsg->hwnd == editVal.GetSafeHwnd()) { if (pMsg->message == WM_LBUTTONDOWN) { editVal.SetFocus(); // return TRUE; // sikk - Don't return so we can do default message handling } } if (pMsg->hwnd == editKey.GetSafeHwnd()) { if (pMsg->message == WM_LBUTTONDOWN) { editKey.SetFocus(); // return TRUE; // sikk - Don't return so we can do default message handling } } if (GetFocus() == &editVal || GetFocus() == &editKey) { if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN ) { AddProp(); return TRUE; } } if (GetFocus() == listKeyVal.GetEditBox()) { if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN ) { listKeyVal.OnChangeEditBox(); listKeyVal.OnSelchange(); listKeyVal.OnKillfocusEditBox(); AddProp(); SetKeyValPairs(); return TRUE; } } if (GetFocus() == &listKeyVal) { if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_DELETE && editEntity) { DelProp(); return TRUE; } } if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE) { if (pMsg->wParam == VK_ESCAPE) { g_pParentWnd->GetCamera()->SetFocus(); Select_Deselect(); } return TRUE; } if ( pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN ) { // keeps ENTER from closing the dialog return TRUE; } if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_TAB) { if (GetFocus()) { int id = GetFocus()->GetDlgCtrlID(); for (int i = 0; i < TabCount; i++) { if (TabOrder[i] == id) { i++; if (i >= TabCount) { i = 0; } CWnd *next = GetDlgItem(TabOrder[i]); if (next) { next->SetFocus(); if (TabOrder[i] == IDC_EDIT_VAL) { editVal.SetSel(0, -1); } return TRUE; } } } } } if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RIGHT && pMsg->hwnd == slFrameSlider.GetSafeHwnd()) { int pos = slFrameSlider.GetPos() + 1; pos = (pos % slFrameSlider.GetRangeMax()); slFrameSlider.SetPos ( pos ); UpdateFromAnimationFrame (); return TRUE; } if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_LEFT && pMsg->hwnd == slFrameSlider.GetSafeHwnd()) { int pos = slFrameSlider.GetPos() - 1; if ( pos < 1 ) { pos = slFrameSlider.GetRangeMax(); } slFrameSlider.SetPos ( pos ); UpdateFromAnimationFrame (); return TRUE; } return CDialog::PreTranslateMessage(pMsg); }
// // ======================================================================================================================= // CreateEntity Creates a new entity based on the currently selected brush and entity type. // ======================================================================================================================= // void CEntityDlg::CreateEntity() { entity_t *petNew; bool forceFixed = false; // check to make sure we have a brush CXYWnd *pWnd = g_pParentWnd->ActiveXY(); if (pWnd) { CRect rctZ; pWnd->GetClientRect(rctZ); brush_t *pBrush; if (selected_brushes.next == &selected_brushes) { pBrush = CreateEntityBrush(g_nSmartX, rctZ.Height() - 1 - g_nSmartY, pWnd); forceFixed = true; } } else { if (selected_brushes.next == &selected_brushes) { MessageBox("You must have a selected brush to create an entity", "info", 0); return; } } int index = comboClass.GetCurSel(); if (index == LB_ERR) { MessageBox("You must have a selected class to create an entity", "info", 0); return; } CString str; comboClass.GetLBText(index, str); if (!stricmp(str, "worldspawn")) { MessageBox("Can't create an entity with worldspawn.", "info", 0); return; } eclass_t *pecNew = Eclass_ForName (str, false); // create it if ((GetAsyncKeyState(VK_CONTROL) & 0x8000)) { // MAJOR hack for xian extern void Brush_CopyList(brush_t *pFrom, brush_t *pTo); brush_t temp_brushes; temp_brushes.next = &temp_brushes; Brush_CopyList(&selected_brushes, &temp_brushes); Select_Deselect(); brush_t *pBrush = temp_brushes.next; while (pBrush != NULL && pBrush != &temp_brushes) { brush_t *pNext = pBrush->next; Brush_RemoveFromList(pBrush); Brush_AddToList(pBrush, &selected_brushes); pBrush = pNext; petNew = Entity_Create(pecNew, forceFixed); Select_Deselect(); } } else if ((GetAsyncKeyState(VK_SHIFT) & 0x8000)) { Select_Ungroup(); petNew = Entity_Create(pecNew, forceFixed); } else { petNew = Entity_Create(pecNew, forceFixed); } if (petNew == NULL) { MessageBox("Failed to create entity.", "info", 0); return; } if (selected_brushes.next == &selected_brushes) { editEntity = world_entity; } else { editEntity = selected_brushes.next->owner; } SetKeyValPairs(); Select_Deselect(); Select_Brush(editEntity->brushes.onext); Sys_UpdateWindows(W_ALL); }
/* ============= Undo_Redo ============= */ void Undo_Redo( void ){ // spog - disable undo if undo levels = 0 if ( g_PrefsDlg.m_nUndoLevels == 0 ) { Sys_Printf( "Undo_Redo: undo is disabled.\n" ); return; } undo_t *redo; brush_t *pBrush, *pNextBrush; entity_t *pEntity, *pNextEntity, *pRedoEntity; if ( !g_lastredo ) { Sys_Printf( "Nothing left to redo.\n" ); return; } if ( g_lastundo ) { if ( !g_lastundo->done ) { Sys_Printf( "WARNING: last undo not finished.\n" ); } } // get the last redo redo = g_lastredo; if ( g_lastredo->prev ) { g_lastredo->prev->next = NULL; } else{g_redolist = NULL; } g_lastredo = g_lastredo->prev; // Undo_GeneralStart( redo->operation ); // remove current selection Select_Deselect(); // move "created" brushes back to the last undo for ( pBrush = active_brushes.next; pBrush != NULL && pBrush != &active_brushes; pBrush = pNextBrush ) { pNextBrush = pBrush->next; if ( pBrush->redoId == redo->id ) { //move the brush to the undo Brush_RemoveFromList( pBrush ); Brush_AddToList( pBrush, &g_lastundo->brushlist ); g_undoMemorySize += Brush_MemorySize( pBrush ); pBrush->ownerId = pBrush->owner->entityId; Entity_UnlinkBrush( pBrush ); } } // move "created" entities back to the last undo for ( pEntity = entities.next; pEntity != NULL && pEntity != &entities; pEntity = pNextEntity ) { pNextEntity = pEntity->next; if ( pEntity->redoId == redo->id ) { // check if this entity is in the redo for ( pRedoEntity = redo->entitylist.next; pRedoEntity != NULL && pRedoEntity != &redo->entitylist; pRedoEntity = pRedoEntity->next ) { // move brushes to the redo entity if ( pRedoEntity->entityId == pEntity->entityId ) { pRedoEntity->brushes.next = pEntity->brushes.next; pRedoEntity->brushes.prev = pEntity->brushes.prev; pEntity->brushes.next = &pEntity->brushes; pEntity->brushes.prev = &pEntity->brushes; } } // //Entity_Free(pEntity); //move the entity to the redo Entity_RemoveFromList( pEntity ); Entity_AddToList( pEntity, &g_lastundo->entitylist ); g_undoMemorySize += Entity_MemorySize( pEntity ); } } // add the undo entities back into the entity list for ( pEntity = redo->entitylist.next; pEntity != NULL && pEntity != &redo->entitylist; pEntity = redo->entitylist.next ) { //if this is the world entity if ( pEntity->entityId == world_entity->entityId ) { epair_t* tmp = world_entity->epairs; world_entity->epairs = pEntity->epairs; pEntity->epairs = tmp; Entity_Free( pEntity ); } else { Entity_RemoveFromList( pEntity ); Entity_AddToList( pEntity, &entities ); } } // add the redo brushes back into the selected brushes for ( pBrush = redo->brushlist.next; pBrush != NULL && pBrush != &redo->brushlist; pBrush = redo->brushlist.next ) { Brush_RemoveFromList( pBrush ); Brush_AddToList( pBrush, &active_brushes ); for ( pEntity = entities.next; pEntity != NULL && pEntity != &entities; pEntity = pEntity->next ) // fixes broken undo on entities { if ( pEntity->entityId == pBrush->ownerId ) { Entity_LinkBrush( pEntity, pBrush ); break; } } //if the brush is not linked then it should be linked into the world entity if ( pEntity == NULL || pEntity == &entities ) { Entity_LinkBrush( world_entity, pBrush ); } //build the brush //Brush_Build(pBrush); Select_Brush( pBrush ); } // Undo_End(); // Sys_Printf( "%s redone.\n", redo->operation ); // g_redoId--; // free the undo free( redo ); // g_bScreenUpdates = true; UpdateSurfaceDialog(); Sys_UpdateWindows( W_ALL ); }