// MainFrm.cpp : implementation of the CMainFrame class // #include "stdafx.h" #include "includes.h" #include #include "ModView.h" #include "ModViewDoc.h" #include "ModViewView.h" #include "ModViewTreeView.h" #include "model.h" #include "wintalk.h" #include "text.h" #include "clipboard.h" #include "textures.h" #include "script.h" #include "image.h" #include "png/png.h" #include "r_image.h" #include "SOF2NPCViewer.h" #include "splash.h" #include "files.h" #include "r_common.h" // #include "MainFrm.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif static void XLS_To_SP(void); #define PLAY_LAME_WAV \ if ( !PlaySound("k:\\util\\bhr_l.bin", \ NULL, \ SND_FILENAME|SND_ASYNC \ ) \ ) \ { \ /* error, but ignore that */ \ } ///////////////////////////////////////////////////////////////////////////// // CMainFrame IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() ON_COMMAND(ID_FILE_OPEN, OnFileOpen) ON_COMMAND(ID_VIEW_WIREFRAME, OnViewWireframe) ON_UPDATE_COMMAND_UI(ID_VIEW_WIREFRAME, OnUpdateViewWireframe) ON_COMMAND(ID_VIEW_ALPHA, OnViewAlpha) ON_UPDATE_COMMAND_UI(ID_VIEW_ALPHA, OnUpdateViewAlpha) ON_COMMAND(ID_VIEW_INTERPOLATE, OnViewInterpolate) ON_UPDATE_COMMAND_UI(ID_VIEW_INTERPOLATE, OnUpdateViewInterpolate) ON_COMMAND(ID_VIEW_BILINEAR, OnViewBilinear) ON_UPDATE_COMMAND_UI(ID_VIEW_BILINEAR, OnUpdateViewBilinear) ON_COMMAND(ID_VIEW_SCREENSHOT_FILE, OnViewScreenshotFile) ON_COMMAND(ID_VIEW_SCREENSHOT_CLIPBOARD, OnViewScreenshotClipboard) ON_COMMAND(ID_EDIT_COPY, OnEditCopy) ON_COMMAND(ID_EDIT_PASTE, OnEditPaste) ON_COMMAND(ID_VIEW_ORIGIN, OnViewOrigin) ON_UPDATE_COMMAND_UI(ID_VIEW_ORIGIN, OnUpdateViewOrigin) ON_COMMAND(ID_VIEW_GLINFO, OnViewGlinfo) ON_COMMAND(ID_ANIMATION_START, OnAnimationStart) ON_COMMAND(ID_ANIMATION_STOP, OnAnimationStop) ON_COMMAND(ID_ANIMATION_REWIND, OnAnimationRewind) ON_COMMAND(ID_ANIMATION_FASTER, OnAnimationFaster) ON_COMMAND(ID_ANIMATION_SLOWER, OnAnimationSlower) ON_COMMAND(ID_ANIMATION_LERPING, OnAnimationLerping) ON_UPDATE_COMMAND_UI(ID_ANIMATION_LERPING, OnUpdateAnimationLerping) ON_UPDATE_COMMAND_UI(ID_FILE_SAVE, OnUpdateFileSave) ON_COMMAND(ID_MODEL_SAVE_AS, OnModelSaveAs) ON_COMMAND(ID_FILE_WRITEIDEAL, OnFileWriteideal) ON_COMMAND(ID_ANIMATION_NEXTFRAME, OnAnimationNextframe) ON_COMMAND(ID_ANIMATION_PREVFRAME, OnAnimationPrevframe) ON_COMMAND(ID_VIEW_LOD0, OnViewLod0) ON_COMMAND(ID_VIEW_LOD1, OnViewLod1) ON_COMMAND(ID_VIEW_LOD2, OnViewLod2) ON_COMMAND(ID_VIEW_LOD3, OnViewLod3) ON_COMMAND(ID_VIEW_LOD4, OnViewLod4) ON_COMMAND(ID_VIEW_LOD5, OnViewLod5) ON_COMMAND(ID_VIEW_LOD6, OnViewLod6) ON_COMMAND(ID_VIEW_LOD7, OnViewLod7) ON_COMMAND(ID_EDIT_BGRNDCOLOUR, OnEditBgrndcolour) ON_UPDATE_COMMAND_UI(ID_VIEW_BONEHILITE, OnUpdateViewBonehilite) ON_COMMAND(ID_VIEW_BONEHILITE, OnViewBonehilite) ON_COMMAND(ID_VIEW_NORMALS, OnViewNormals) ON_UPDATE_COMMAND_UI(ID_VIEW_NORMALS, OnUpdateViewNormals) ON_COMMAND(ID_VIEW_SURFACEHILITE, OnViewSurfacehilite) ON_UPDATE_COMMAND_UI(ID_VIEW_SURFACEHILITE, OnUpdateViewSurfacehilite) ON_COMMAND(ID_VIEW_VERTINDEXES, OnViewVertindexes) ON_UPDATE_COMMAND_UI(ID_VIEW_VERTINDEXES, OnUpdateViewVertindexes) ON_COMMAND(ID_VIEW_FOVCYCLE, OnViewFovcycle) ON_COMMAND(ID_FILE_READIDEAL, OnFileReadideal) ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste) ON_COMMAND(ID_FILE_REFRESHTEXTURES, OnFileRefreshtextures) ON_UPDATE_COMMAND_UI(ID_FILE_PRINT, OnUpdateFilePrint) ON_UPDATE_COMMAND_UI(ID_FILE_PRINT_PREVIEW, OnUpdateFilePrintPreview) ON_UPDATE_COMMAND_UI(ID_FILE_PRINT_SETUP, OnUpdateFilePrintSetup) ON_UPDATE_COMMAND_UI(ID_EDIT_TESTFUNCTION, OnUpdateEditTestfunction) ON_COMMAND(ID_EDIT_TESTFUNCTION, OnEditTestfunction) ON_COMMAND(ID_FILE_RESETVIEWPARAMS, OnFileResetviewparams) ON_COMMAND(ID_ANIMATION_STARTWITHWRAPFORCE, OnAnimationStartwithwrapforce) ON_COMMAND(ID_FILE_WRITESCRIPT, OnFileWritescript) ON_COMMAND(ID_FILE_READSCRIPT, OnFileReadscript) ON_UPDATE_COMMAND_UI(ID_FILE_WRITESCRIPT, OnUpdateFileWritescript) ON_COMMAND(ID_VIEW_SURFACEHILITEWITHBONEREFS, OnViewSurfacehilitewithbonerefs) ON_UPDATE_COMMAND_UI(ID_VIEW_SURFACEHILITEWITHBONEREFS, OnUpdateViewSurfacehilitewithbonerefs) ON_COMMAND(ID_VIEW_TAGSURFACES, OnViewTagsurfaces) ON_UPDATE_COMMAND_UI(ID_VIEW_TAGSURFACES, OnUpdateViewTagsurfaces) ON_COMMAND(ID_VIEW_TAGSASRGB, OnViewTagsasrgb) ON_UPDATE_COMMAND_UI(ID_VIEW_TAGSASRGB, OnUpdateViewTagsasrgb) ON_COMMAND(ID_PICMIP_0, OnPicmip0) ON_UPDATE_COMMAND_UI(ID_PICMIP_0, OnUpdatePicmip0) ON_COMMAND(ID_PICMIP_1, OnPicmip1) ON_UPDATE_COMMAND_UI(ID_PICMIP_1, OnUpdatePicmip1) ON_COMMAND(ID_PICMIP_2, OnPicmip2) ON_UPDATE_COMMAND_UI(ID_PICMIP_2, OnUpdatePicmip2) ON_COMMAND(ID_PICMIP_3, OnPicmip3) ON_UPDATE_COMMAND_UI(ID_PICMIP_3, OnUpdatePicmip3) ON_COMMAND(ID_PICMIP_4, OnPicmip4) ON_COMMAND(ID_PICMIP_5, OnPicmip5) ON_COMMAND(ID_PICMIP_6, OnPicmip6) ON_COMMAND(ID_PICMIP_7, OnPicmip7) ON_COMMAND(ID_VIEW_RULER, OnViewRuler) ON_UPDATE_COMMAND_UI(ID_VIEW_RULER, OnUpdateViewRuler) ON_COMMAND(ID_VIEW_FORCEWHITE, OnViewForcewhite) ON_UPDATE_COMMAND_UI(ID_VIEW_FORCEWHITE, OnUpdateViewForcewhite) ON_COMMAND(ID_VIEW_SCREENSHOT_CLEAN, OnViewScreenshotClean) ON_UPDATE_COMMAND_UI(ID_VIEW_SCREENSHOT_CLEAN, OnUpdateViewScreenshotClean) ON_COMMAND(ID_VIEW_VERTWEIGHTING, OnViewVertweighting) ON_UPDATE_COMMAND_UI(ID_VIEW_VERTWEIGHTING, OnUpdateViewVertweighting) ON_COMMAND(ID_VIEW_BBOX, OnViewBbox) ON_UPDATE_COMMAND_UI(ID_VIEW_BBOX, OnUpdateViewBbox) ON_COMMAND(ID_VIEW_FLOOR, OnViewFloor) ON_UPDATE_COMMAND_UI(ID_VIEW_FLOOR, OnUpdateViewFloor) ON_COMMAND(ID_EDIT_SETFLOOR_ABS, OnEditSetfloorAbs) ON_UPDATE_COMMAND_UI(ID_EDIT_SETFLOOR_ABS, OnUpdateEditSetfloorAbs) ON_COMMAND(ID_EDIT_SETFLOOR_CURRENT, OnEditSetfloorCurrent) ON_UPDATE_COMMAND_UI(ID_EDIT_SETFLOOR_CURRENT, OnUpdateEditSetfloorCurrent) ON_COMMAND(ID_VIEW_BONEFILTERING, OnViewBonefiltering) ON_UPDATE_COMMAND_UI(ID_VIEW_BONEFILTERING, OnUpdateViewBonefiltering) ON_COMMAND(ID_EDIT_SETBONEWEIGHT_THRESHHOLD, OnEditSetboneweightThreshhold) ON_UPDATE_COMMAND_UI(ID_EDIT_SETBONEWEIGHT_THRESHHOLD, OnUpdateEditSetboneweightThreshhold) ON_COMMAND(ID_BONEFILTER_INCTHRESHHOLD,OnEditBoneFilterINCThreshhold) ON_COMMAND(ID_BONEFILTER_DECTHRESHHOLD,OnEditBoneFilterDECThreshhold) ON_COMMAND(ID_VIEW_CRACKVIEWER, OnViewCrackviewer) ON_UPDATE_COMMAND_UI(ID_VIEW_CRACKVIEWER, OnUpdateViewCrackviewer) ON_COMMAND(ID_VIEW_UNSHADOWABLESURFACES, OnViewUnshadowablesurfaces) ON_UPDATE_COMMAND_UI(ID_VIEW_UNSHADOWABLESURFACES, OnUpdateViewUnshadowablesurfaces) ON_COMMAND(ID_FILE_VIEW_SOF2_NPCS, OnFileViewSof2Npcs) ON_UPDATE_COMMAND_UI(ID_FILE_VIEW_SOF2_NPCS, OnUpdateFileViewSof2Npcs) ON_COMMAND(IDM_EDIT_ALLOWSKELETONOVERRIDES, OnEditAllowskeletonoverrides) ON_UPDATE_COMMAND_UI(IDM_EDIT_ALLOWSKELETONOVERRIDES, OnUpdateEditAllowskeletonoverrides) ON_COMMAND(ID_VIEW_DOUBLESIDEDPOLYS, OnViewDoublesidedpolys) ON_UPDATE_COMMAND_UI(ID_VIEW_DOUBLESIDEDPOLYS, OnUpdateViewDoublesidedpolys) ON_COMMAND(IDM_EDIT_TOPMOST, OnEditTopmost) ON_UPDATE_COMMAND_UI(IDM_EDIT_TOPMOST, OnUpdateEditTopmost) ON_COMMAND(ID_VIEW_TRIINDEXES, OnViewTriindexes) ON_UPDATE_COMMAND_UI(ID_VIEW_TRIINDEXES, OnUpdateViewTriindexes) ON_COMMAND(ID_FILE_VIEW_JK2_BOTS, OnFileViewJk2Bots) ON_COMMAND(ID_ANIMATION_ENDFRAME, OnAnimationEndframe) //}}AFX_MSG_MAP ON_COMMAND(ID_FILE_BATCHCONVERT, OnFileBatchconvert) END_MESSAGE_MAP() static UINT indicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; ///////////////////////////////////////////////////////////////////////////// // CMainFrame construction/destruction CMainFrame::CMainFrame() { // TODO: add member initialization code here } CMainFrame::~CMainFrame() { } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create } if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0("Failed to create status bar\n"); return -1; // fail to create } // TODO: Delete these three lines if you don't want the toolbar to // be dockable m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); // CG: The following line was added by the Splash Screen component. CSplashWnd::ShowSplashScreen(this); return 0; } BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CMainFrame diagnostics #ifdef _DEBUG void CMainFrame::AssertValid() const { CFrameWnd::AssertValid(); } void CMainFrame::Dump(CDumpContext& dc) const { CFrameWnd::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMainFrame message handlers BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { if (!m_splitter.CreateStatic(this, 1, 2)) { return false; } if (!m_splitter.CreateView(0, 0, RUNTIME_CLASS(CModViewTreeView), CSize(150, 100), pContext)) { return false; } if (!m_splitter.CreateView(0, 1, RUNTIME_CLASS(CModViewView), CSize(200, 100), pContext)) { return false; } // m_splitter.Create(this,1,2,CSize(100,100),pContext); return true; } void CMainFrame::OnFileOpen() { LPCSTR psFullPathedFilename = InputLoadFileName("", // LPCSTR psInitialLoadName, "Load Model", // LPCSTR psCaption, Filename_PathOnly(Model_GetFullPrimaryFilename()), // "S:\\baseq3\\models\\test\\bonehier", // LPCSTR psInitialDir, Model_GetSupportedTypesFilter(true) // LPCSTR psFilter ); if (psFullPathedFilename) { GetActiveDocument()->OnOpenDocument(psFullPathedFilename); } } void CMainFrame::OnViewWireframe() { AppVars.bWireFrame = !AppVars.bWireFrame; m_splitter.Invalidate(false); } void CMainFrame::OnUpdateViewWireframe(CCmdUI* pCmdUI) { pCmdUI->SetCheck(AppVars.bWireFrame); } void CMainFrame::OnViewAlpha() { AppVars.bUseAlpha = !AppVars.bUseAlpha; m_splitter.Invalidate(false); } void CMainFrame::OnUpdateViewAlpha(CCmdUI* pCmdUI) { pCmdUI->SetCheck(AppVars.bUseAlpha); } void CMainFrame::OnViewInterpolate() { AppVars.bInterpolate = !AppVars.bInterpolate; m_splitter.Invalidate(false); } void CMainFrame::OnUpdateViewInterpolate(CCmdUI* pCmdUI) { pCmdUI->SetCheck(AppVars.bInterpolate); } // these 2 do the same thing as other functions, but it just seemed reasonable to also be in another menu... // void CMainFrame::OnAnimationLerping() { OnViewInterpolate(); } void CMainFrame::OnUpdateAnimationLerping(CCmdUI* pCmdUI) { OnUpdateViewInterpolate(pCmdUI); } void CMainFrame::OnViewBilinear() { AppVars.bBilinear = !AppVars.bBilinear; TextureList_SetFilter(); m_splitter.Invalidate(false); } void CMainFrame::OnUpdateViewBilinear(CCmdUI* pCmdUI) { pCmdUI->SetCheck(AppVars.bBilinear); } void CMainFrame::OnViewOrigin() { AppVars.bOriginLines = !AppVars.bOriginLines; m_splitter.Invalidate(false); } void CMainFrame::OnUpdateViewOrigin(CCmdUI* pCmdUI) { pCmdUI->SetCheck(AppVars.bOriginLines); } LPCSTR GetYearAsString(void) { static char sTemp[20]; time_t ltime; time( <ime ); struct tm *today = localtime( <ime ); strftime( sTemp, sizeof(sTemp), "%Y", today ); return &sTemp[0]; } void CMainFrame::OnViewScreenshotFile() { if (Model_Loaded()) { CWaitCursor wait; // slightly iffy here, I'm going to assume that the rendering context is still valid from last time. // I can't do much else because I need to supply DC shit that I don't have in order to issue an OnDraw // command to do it legally, so fuck it... // gbTextInhibit = AppVars.bCleanScreenShots; //true; { ModelList_Render( g_iScreenWidth, g_iScreenHeight ); // render to back buffer // generate a filename... // char sBaseName[MAX_PATH]; sprintf(sBaseName, Filename_WithoutPath(Filename_PathOnly(Model_GetFullPrimaryFilename()))); // // look for a numbered slot to snapshot to... // #define NUM_SAVE_SLOTS 1000 for (int iName=0; iNameEnable(false); } void CMainFrame::OnUpdateFileSaveAs(CCmdUI* pCmdUI) { // pCmdUI->Enable(true); } void CMainFrame::OnModelSaveAs() { LPCSTR psFullPathedFilename = InputSaveFileName(va("%s",Filename_WithoutExt(Model_GetFullPrimaryFilename())), "Save Model", // LPCSTR psCaption, Filename_PathOnly(Model_GetFullPrimaryFilename()), // "S:\\baseq3\\models\\test\\bonehier", // LPCSTR psInitialDir, Model_GetSupportedTypesFilter(true), // LPCSTR psFilter ".glm" ); if (psFullPathedFilename) { Model_Save(psFullPathedFilename); } } void CMainFrame::OnFileWriteideal() { if (GetYesNo(va("Write \".ideal\" file\n\nAre you sure?"))) { AppVars_WriteIdeal(); } } void CMainFrame::OnFileReadideal() { AppVars_ReadIdeal(); } void CMainFrame::OnAnimationNextframe() { ModelList_StepFrame(1); } void CMainFrame::OnAnimationPrevframe() { ModelList_StepFrame(-1); } void CMainFrame::OnViewLod0() { AppVars.iLOD = 0; m_splitter.Invalidate(false); } void CMainFrame::OnViewLod1() { AppVars.iLOD = 1; m_splitter.Invalidate(false); } void CMainFrame::OnViewLod2() { AppVars.iLOD = 2; m_splitter.Invalidate(false); } void CMainFrame::OnViewLod3() { AppVars.iLOD = 3; m_splitter.Invalidate(false); } void CMainFrame::OnViewLod4() { AppVars.iLOD = 4; m_splitter.Invalidate(false); } void CMainFrame::OnViewLod5() { AppVars.iLOD = 5; m_splitter.Invalidate(false); } void CMainFrame::OnViewLod6() { AppVars.iLOD = 6; m_splitter.Invalidate(false); } void CMainFrame::OnViewLod7() { AppVars.iLOD = 7; m_splitter.Invalidate(false); } void CMainFrame::OnEditBgrndcolour() { CHOOSECOLOR cc; static COLORREF crefs[16]; memset(&cc,0,sizeof(cc)); cc.lStructSize = sizeof(cc); cc.hwndOwner = AppVars.hWnd; // cc.hInstance = NULL; cc.lpCustColors = crefs; cc.rgbResult = AppVars._B<<16 | AppVars._G<<8 | AppVars._R; // COLORREF rgbResult; cc.Flags = CC_RGBINIT | CC_ANYCOLOR | CC_SOLIDCOLOR | /*CC_FULLOPEN | */ 0; if (ChooseColor(&cc)) { DWORD d = cc.rgbResult; AppVars._B = (cc.rgbResult>>16) & 0xFF; AppVars._G = (cc.rgbResult>>8 ) & 0xFF; AppVars._R = (cc.rgbResult>>0 ) & 0xFF; m_splitter.Invalidate(false); } } void CMainFrame::OnUpdateViewBonehilite(CCmdUI* pCmdUI) { pCmdUI->SetCheck(AppVars.bBoneHighlight); } void CMainFrame::OnViewBonehilite() { AppVars.bBoneHighlight = !AppVars.bBoneHighlight; m_splitter.Invalidate(false); } void CMainFrame::OnViewNormals() { AppVars.bVertexNormals = !AppVars.bVertexNormals; m_splitter.Invalidate(false); } void CMainFrame::OnUpdateViewNormals(CCmdUI* pCmdUI) { pCmdUI->SetCheck(AppVars.bVertexNormals); } void CMainFrame::OnViewSurfacehilite() { AppVars.bSurfaceHighlight = !AppVars.bSurfaceHighlight; m_splitter.Invalidate(false); } void CMainFrame::OnUpdateViewSurfacehilite(CCmdUI* pCmdUI) { pCmdUI->SetCheck( AppVars.bSurfaceHighlight ); } void CMainFrame::OnViewSurfacehilitewithbonerefs() { AppVars.bSurfaceHighlightShowsBoneWeighting = !AppVars.bSurfaceHighlightShowsBoneWeighting; m_splitter.Invalidate(false); } // only allow this option if surface highlighting is on... // void CMainFrame::OnUpdateViewSurfacehilitewithbonerefs(CCmdUI* pCmdUI) { pCmdUI->Enable ( AppVars.bSurfaceHighlight ); pCmdUI->SetCheck( AppVars.bSurfaceHighlightShowsBoneWeighting ); } void CMainFrame::OnViewVertindexes() { AppVars.bVertIndexes = !AppVars.bVertIndexes; m_splitter.Invalidate(false); } // only allow this option if surface highlighting is on... // void CMainFrame::OnUpdateViewVertindexes(CCmdUI* pCmdUI) { pCmdUI->Enable ( AppVars.bSurfaceHighlight ); pCmdUI->SetCheck( AppVars.bVertIndexes ); } void CMainFrame::OnViewFovcycle() { AppVars.dFOV = (AppVars.dFOV == 10.0f)?80.0f:(AppVars.dFOV == 80.0f)?90:10.0f; m_splitter.Invalidate(false); } void CMainFrame::OnUpdateEditPaste(CCmdUI* pCmdUI) { pCmdUI->Enable(false); } void CMainFrame::OnFileRefreshtextures() { TextureList_Refresh(); m_splitter.Invalidate(false); } void CMainFrame::OnUpdateFilePrint(CCmdUI* pCmdUI) { pCmdUI->Enable(false); } void CMainFrame::OnUpdateFilePrintPreview(CCmdUI* pCmdUI) { pCmdUI->Enable(false); } void CMainFrame::OnUpdateFilePrintSetup(CCmdUI* pCmdUI) { pCmdUI->Enable(false); } void CMainFrame::OnUpdateEditTestfunction(CCmdUI* pCmdUI) { // pCmdUI->Enable(!stricmp(scGetComputerName(),"SPOCK")); pCmdUI->Enable(!stricmp(scGetUserName(),"scork")); } #include "jpeg_interface.h" #include "Splash.h" void CMainFrame::OnEditTestfunction() { XLS_To_SP(); #if 0 // runtime watermarking stuff... // SetQdirFromPath( "w:/game/base/blah" ); LPCSTR psTexturename = "textures/tests/ste_special_test_data/merk3";//blank";//merk3"; TextureHandle_t hTexture = TextureHandle_ForName( psTexturename ); if (hTexture == -1) { hTexture = Texture_Load( psTexturename ); } Texture_t *pTexture = Texture_GetTextureData( hTexture ); //DStamp_MarkImage(pTexture, "JDoePCMagazine"); DStamp_AnalyseImage(pTexture); LPCSTR psOutputName = "c:\\test.tga"; TGA_Write(psOutputName, pTexture->pPixels, pTexture->iWidth, pTexture->iHeight, 32); // load it back in again... // /* byte *pPixels = NULL; int iWidth,iHeight; // LoadJPG( "textures/tests/ste_special_test_data/redlineattop.jpg", &pPixels, &iWidth, &iHeight ); // LoadTGA( "textures/tests/ste_special_test_data/redlineattop.tga", &pPixels, &iWidth, &iHeight ); extern bool bHackToAllowFullPathDuringTestFunc; bHackToAllowFullPathDuringTestFunc = true; { // LoadJPG( "c:\\test.jpg", &pPixels, &iWidth, &iHeight ); // SaveFile("c:\\test_jpg.bin", pPixels, iWidth * iHeight * 4); LoadTGA( psOutputName, &pPixels, &iWidth, &iHeight ); // TGA_Write("c:\\test2.tga", pPixels, iWidth, iHeight, 32); // SaveFile("c:\\test_tga.bin", pPixels, iWidth * iHeight * 4); } bHackToAllowFullPathDuringTestFunc = false; if (pPixels) { LPCSTR psMessage = DStamp_ReadImage(pPixels, iWidth, iHeight, 32); if (psMessage) { InfoBox(va("Found DStamp:\n\n\"%s\"",psMessage)); } else { ErrorBox("No Dstamp found"); } free(pPixels); } // PNG_Save("c:\\test.png", pTexture->pPixels, pTexture->iWidth, pTexture->iHeight, 4); */ /* CWaitCursor wait; if (Model_LoadPrimary("S:\\base\\models\\test\\jake\\jake.glm")) { if (Model_LoadBoltOn( "S:\\base\\models\\test\\conetree4\\conetree4.glm", AppVars.hModelLastLoaded, "boltpoint_righthand", true // bBoltIsBone ) ) { if (Model_LoadBoltOn( "S:\\base\\models\\test\\cube\\cube.glm", AppVars.hModelLastLoaded, "s_branch3_twig3", true // bBoltIsBone ) ) { // ... } } } */ #endif } void CMainFrame::OnFileResetviewparams() { AppVars_ResetViewParams(); m_splitter.Invalidate(false); } void CMainFrame::OnUpdateFileWritescript(CCmdUI* pCmdUI) { pCmdUI->Enable(Model_Loaded()); } extern void Filename_AddToMRU(LPCSTR psFilename); void CMainFrame::OnFileWritescript() { LPCSTR psFullPathedFilename = InputSaveFileName(va("%s%s",Filename_WithoutExt(Model_GetFullPrimaryFilename()),Script_GetExtension()), // LPCSTR psInitialSaveName, "Write Script", // LPCSTR psCaption, Filename_PathOnly(Model_GetFullPrimaryFilename()), //LPCSTR psInitialPath, Script_GetFilter(), // LPCSTR psFilter Script_GetExtension() // LPCSTR psExtension ); if (psFullPathedFilename) { CWaitCursor wait; if (Script_Write(psFullPathedFilename)) { Filename_AddToMRU(psFullPathedFilename); } } } void CMainFrame::OnFileReadscript() { LPCSTR psFullPathedFilename = InputLoadFileName("", // LPCSTR psInitialLoadName, "Read Script", // LPCSTR psCaption, Filename_PathOnly(Model_GetFullPrimaryFilename()), // "S:\\baseq3\\models\\test\\bonehier", // LPCSTR psInitialDir, Script_GetFilter() // LPCSTR psFilter ); if (psFullPathedFilename) { CWaitCursor wait; if (Script_Read(psFullPathedFilename)) { Filename_AddToMRU(psFullPathedFilename); } } } void CMainFrame::OnViewTagsurfaces() { AppVars.bShowTagSurfaces = !AppVars.bShowTagSurfaces; m_splitter.Invalidate(false); } void CMainFrame::OnUpdateViewTagsurfaces(CCmdUI* pCmdUI) { pCmdUI->SetCheck( AppVars.bShowTagSurfaces ); } void CMainFrame::OnViewTagsasrgb() { AppVars.bShowOriginsAsRGB = !AppVars.bShowOriginsAsRGB; m_splitter.Invalidate(false); } void CMainFrame::OnUpdateViewTagsasrgb(CCmdUI* pCmdUI) { pCmdUI->SetCheck( AppVars.bShowOriginsAsRGB ); } void CMainFrame::OnPicmip0() { TextureList_ReMip(0); m_splitter.Invalidate(false); } void CMainFrame::OnUpdatePicmip0(CCmdUI* pCmdUI) { pCmdUI->SetCheck(TextureList_GetMip() == 0); } void CMainFrame::OnPicmip1() { TextureList_ReMip(1); m_splitter.Invalidate(false); } void CMainFrame::OnUpdatePicmip1(CCmdUI* pCmdUI) { pCmdUI->SetCheck(TextureList_GetMip() == 1); } void CMainFrame::OnPicmip2() { TextureList_ReMip(2); m_splitter.Invalidate(false); } void CMainFrame::OnUpdatePicmip2(CCmdUI* pCmdUI) { pCmdUI->SetCheck(TextureList_GetMip() == 2); } void CMainFrame::OnPicmip3() { TextureList_ReMip(3); m_splitter.Invalidate(false); } void CMainFrame::OnUpdatePicmip3(CCmdUI* pCmdUI) { pCmdUI->SetCheck(TextureList_GetMip() == 3); } void CMainFrame::OnPicmip4() { TextureList_ReMip(4); m_splitter.Invalidate(false); } void CMainFrame::OnPicmip5() { TextureList_ReMip(5); m_splitter.Invalidate(false); } void CMainFrame::OnPicmip6() { TextureList_ReMip(6); m_splitter.Invalidate(false); } void CMainFrame::OnPicmip7() { TextureList_ReMip(7); m_splitter.Invalidate(false); } void CMainFrame::OnViewRuler() { AppVars.bRuler = !AppVars.bRuler; m_splitter.Invalidate(false); } void CMainFrame::OnUpdateViewRuler(CCmdUI* pCmdUI) { pCmdUI->SetCheck(AppVars.bRuler); } // psMessage can be NULL to mean "pick your own 'ready' message"... // extern bool gbMainFrameInitialised; extern bool gbSplashScreenRunning; void CMainFrame::StatusMessage(LPCTSTR psMessage) { if (this && gbMainFrameInitialised) { extern int giGalleryItemsRemaining; m_wndStatusBar.SetWindowText((psMessage && psMessage[0])?psMessage:(Gallery_Active()?va("( Gallery: %d remaining )", giGalleryItemsRemaining):"Ready")); } else { if (gbSplashScreenRunning) { CSplashWnd::StatusMessage(psMessage); } } } void CMainFrame::OnViewForcewhite() { AppVars.bForceWhite = !AppVars.bForceWhite; m_splitter.Invalidate(false); } void CMainFrame::OnUpdateViewForcewhite(CCmdUI* pCmdUI) { pCmdUI->SetCheck(AppVars.bForceWhite); } void CMainFrame::OnViewScreenshotClean() { AppVars.bCleanScreenShots = !AppVars.bCleanScreenShots; // m_splitter.Invalidate(false); // not needed for this bool } void CMainFrame::OnUpdateViewScreenshotClean(CCmdUI* pCmdUI) { pCmdUI->SetCheck(AppVars.bCleanScreenShots); } void CMainFrame::OnViewVertweighting() { AppVars.bVertWeighting = !AppVars.bVertWeighting; m_splitter.Invalidate(false); } void CMainFrame::OnUpdateViewVertweighting(CCmdUI* pCmdUI) { pCmdUI->SetCheck( AppVars.bVertWeighting ); pCmdUI->Enable ( AppVars.bVertIndexes ); } void CMainFrame::OnViewBbox() { AppVars.bBBox = !AppVars.bBBox; m_splitter.Invalidate(false); } void CMainFrame::OnUpdateViewBbox(CCmdUI* pCmdUI) { pCmdUI->SetCheck(AppVars.bBBox); } void CMainFrame::OnViewFloor() { AppVars.bFloor = !AppVars.bFloor; m_splitter.Invalidate(false); } void CMainFrame::OnUpdateViewFloor(CCmdUI* pCmdUI) { pCmdUI->SetCheck(AppVars.bFloor); } void CMainFrame::OnEditSetfloorAbs() { LPCSTR psPrompt = "Input new floor value, e.g. \"-50\""; LPCSTR psFloorZ = GetString(psPrompt); if (psFloorZ) { AppVars.fFloorZ = atof(psFloorZ); m_splitter.Invalidate(false); } } void CMainFrame::OnUpdateEditSetfloorAbs(CCmdUI* pCmdUI) { pCmdUI->Enable(AppVars.bFloor && Model_Loaded()); } void CMainFrame::OnEditSetfloorCurrent() { AppVars.fFloorZ = Model_GetLowestPointOnPrimaryModel(); m_splitter.Invalidate(false); } void CMainFrame::OnUpdateEditSetfloorCurrent(CCmdUI* pCmdUI) { pCmdUI->Enable(AppVars.bFloor && Model_Loaded()); } void CMainFrame::OnViewBonefiltering() { AppVars.bBoneWeightThreshholdingActive = !AppVars.bBoneWeightThreshholdingActive; m_splitter.Invalidate(false); } void CMainFrame::OnUpdateViewBonefiltering(CCmdUI* pCmdUI) { pCmdUI->SetCheck(AppVars.bBoneWeightThreshholdingActive); } void CMainFrame::OnEditSetboneweightThreshhold() { bool bAgain = true; do { LPCSTR psPrompt = "Input new bone-weight-threshhold percentage, e.g. \"50\", which will cause all bone-weights below that value to be ignored\n\n( Input must be within the range 0..100 )"; LPCSTR psPercent= GetString(psPrompt); if (psPercent) { AppVars.fBoneWeightThreshholdPercent = atof(psPercent); if (AppVars.fBoneWeightThreshholdPercent < 0.0f || AppVars.fBoneWeightThreshholdPercent > 100.0f ) { PLAY_LAME_WAV; ErrorBox(va("%f is not within the range 0..100 now, is it?\n\nDuh!!!!!!!!!!!",AppVars.fBoneWeightThreshholdPercent)); } else { bAgain = false; m_splitter.Invalidate(false); } } } while (bAgain); } void CMainFrame::OnUpdateEditSetboneweightThreshhold(CCmdUI* pCmdUI) { pCmdUI->Enable(AppVars.bBoneWeightThreshholdingActive && Model_Loaded()); //model_loaded check not nec., but matches others on menu } void CMainFrame::OnEditBoneFilterINCThreshhold() { if (AppVars.bBoneWeightThreshholdingActive) { AppVars.fBoneWeightThreshholdPercent += 1.0f; if (AppVars.fBoneWeightThreshholdPercent > 100.0f) AppVars.fBoneWeightThreshholdPercent = 100.0f; m_splitter.Invalidate(false); } } void CMainFrame::OnEditBoneFilterDECThreshhold() { if (AppVars.bBoneWeightThreshholdingActive) { AppVars.fBoneWeightThreshholdPercent -= 1.0f; if (AppVars.fBoneWeightThreshholdPercent < 0.0f) AppVars.fBoneWeightThreshholdPercent = 0.0f; m_splitter.Invalidate(false); } } void CMainFrame::OnViewCrackviewer() { if (!stricmp(scGetUserName(),"scork")) { AppVars.bCrackHighlight = !AppVars.bCrackHighlight; m_splitter.Invalidate(false); } } void CMainFrame::OnUpdateViewCrackviewer(CCmdUI* pCmdUI) { pCmdUI->SetCheck(AppVars.bCrackHighlight); pCmdUI->Enable(!stricmp(scGetUserName(),"scork")); } void CMainFrame::OnViewUnshadowablesurfaces() { AppVars.bShowUnshadowableSurfaces = !AppVars.bShowUnshadowableSurfaces; m_splitter.Invalidate(false); } void CMainFrame::OnUpdateViewUnshadowablesurfaces(CCmdUI* pCmdUI) { pCmdUI->SetCheck( AppVars.bShowUnshadowableSurfaces ); } #define sSOF2BASEDIR "s:\\base\\" void CMainFrame::OnFileViewSof2Npcs() { if (!gamedir[0]) { LPCSTR psBasePathToCopy = sSOF2BASEDIR; if (!GetYesNo("Warning: base path not known yet, shall I assume ' " sSOF2BASEDIR " ' ?")) { psBasePathToCopy = GetString("Enter suitable base path\n\n( format example: \"" sSOF2BASEDIR "\" )"); if (!psBasePathToCopy) return; } strcpy(gamedir,psBasePathToCopy); } CString strScript; CSOF2NPCViewer Viewer(true, &strScript, gamedir); Model_StopAnim(); // or the screen update stops the GDI stuff from showing up if (Viewer.DoModal() == IDOK) { if (Gallery_Active()) { // pick this up in the timer loop now... // // CString strCaption; // while (GalleryRead_ExtractEntry(strCaption, strScript)) // { // OutputDebugString(va("\"%s\" (script len %d)\n",(LPCSTR)strCaption,strScript.GetLength())); // } extern CString strGalleryErrors; extern CString strGalleryWarnings; extern CString strGalleryInfo; strGalleryErrors = strGalleryWarnings = strGalleryInfo = ""; Model_StopAnim(); gbTextInhibit = AppVars.bCleanScreenShots; //true; return; } else { // normal double-click on a single template list entry... // if (!strScript.IsEmpty()) { strScript += "\n\n\n"; //SendStringToNotepad(strScript,"temp.txt"); string strOutputFileName( va("%s\\%s",scGetTempPath(),"temp.mvs") ); int iReturn = SaveFile(strOutputFileName.c_str(),(LPCSTR)strScript, strScript.GetLength()); if (iReturn != -1) { extern bool Document_ModelLoadPrimary(LPCSTR psFilename); Document_ModelLoadPrimary(strOutputFileName.c_str()); } } } } } void CMainFrame::OnUpdateFileViewSof2Npcs(CCmdUI* pCmdUI) { } void CMainFrame::OnEditAllowskeletonoverrides() { AppVars.bAllowGLAOverrides = !AppVars.bAllowGLAOverrides; } void CMainFrame::OnUpdateEditAllowskeletonoverrides(CCmdUI* pCmdUI) { pCmdUI->SetCheck(AppVars.bAllowGLAOverrides); } void CMainFrame::OnViewDoublesidedpolys() { AppVars.bShowPolysAsDoubleSided = !AppVars.bShowPolysAsDoubleSided; m_splitter.Invalidate(false); } void CMainFrame::OnUpdateViewDoublesidedpolys(CCmdUI* pCmdUI) { pCmdUI->SetCheck(AppVars.bShowPolysAsDoubleSided); } void GetUsedIDs(set &UsedIDs, LPCSTR psLocalDir) { char **ppsFiles; int iFiles; // scan for skin files... // ppsFiles = Sys_ListFiles( psLocalDir, // const char *directory, ".sp", // const char *extension, NULL, // char *filter, &iFiles, // int *numfiles, qfalse // qboolean wantsubs ); if ( !ppsFiles || !iFiles ) { return; } // load and parse files... // for ( int i=0; i UsedIDs; GetUsedIDs(UsedIDs, psLocalWorkDir); GetUsedIDs(UsedIDs, psNetDir); for (int iID=1; iID<256; iID++) { if (!UsedIDs.count(iID)) return iID; } ErrorBox("Unable to find unique ID, all in use!\n"); return 0; } typedef struct { CString strLabel; int iLevel; CString strChar; int iCharSpeechNum; } SpeechLabel_t; typedef struct { SpeechLabel_t SpeechLabel; CString strCharacter; CString strSpeech; } Speech_t; typedef vector Speeches_t; typedef map SpeechesPerLevel_t; SpeechesPerLevel_t SpeechesPerLevel; static void XLS_To_SP(void) { SpeechesPerLevel.clear(); #define sWORKDIR "c:\\JK2Temp" #define sNETDIR "w:\\game\\base\\strip" CString strFileName_ExportedXLS (sWORKDIR "\\JK2_final_script.txt"); // CString strFileName_XRefLevelnames (sWORKDIR "\\JK2_LevelNamesInOrder.txt"); LPCSTR psError = NULL; char *psData_XLS = NULL; StatusMessage(va("Reading \"%s\"\n",(LPCSTR) strFileName_ExportedXLS)); int iSize = LoadFile(strFileName_ExportedXLS, (void**)&psData_XLS); if (iSize != -1) { CWaitCursor wait; CString strXLS(psData_XLS); free(psData_XLS); // heh... // CString strStatsOnly_LineCount(strXLS); int iStatsOnly_LinesRemaining = strStatsOnly_LineCount.Replace("\n",""); strStatsOnly_LineCount.Empty(); // tiny mem opt while (!strXLS.IsEmpty()) { iStatsOnly_LinesRemaining--; CString strThisLine; int iLoc = strXLS.Find('\n'); if (iLoc != -1) { strThisLine = strXLS.Left(iLoc); strXLS = strXLS.Mid(iLoc+1); } else { strThisLine = strXLS; strXLS.Empty(); } strThisLine.TrimRight(); strXLS.TrimRight(); if (!strThisLine.IsEmpty()) { CString strThisLineOriginalForErrorReporting(strThisLine); // line example: // // 02KYK004 Kyle Jan? I’ve found an exit. // // get the label... // iLoc = strThisLine.FindOneOf(" \t"); if (iLoc != -1) { CString strXLS_Label(strThisLine.Left(iLoc)); strThisLine = strThisLine.Mid(iLoc); strThisLine.TrimLeft(); // get the character name... // iLoc = strThisLine.FindOneOf(" \t"); if (iLoc != -1) { CString strXLS_Character(strThisLine.Left(iLoc)); strThisLine = strThisLine.Mid(iLoc); strThisLine.TrimLeft(); // get the speech... // CString strXLS_Speech(strThisLine); //strXLS_Speech.Replace("\"",""); strXLS_Speech.TrimLeft(); strXLS_Speech.TrimRight(); if (!strXLS_Speech.IsEmpty()) { // Lucas use a lot of stupid non-ascii chars, so we have to correct them... // // (smart quotes are left in after conversion, since they're normally for // stuff like {don't say "hello" to me} // // TCHAR versions of these won't fucking compile (thanks yet again, MS) // strXLS_Speech.Replace(va("%c",0x93),"\""); // smart quotes -> '"' strXLS_Speech.Replace(va("%c",0x94),"\""); // smart quotes -> '"' strXLS_Speech.Replace(va("%c",0x0B),"."); // full stop strXLS_Speech.Replace(va("%c",0x85),"..."); // "..."-char -> 3-char "..." strXLS_Speech.Replace(va("%c",0x91),va("%c",0x27)); // "'" strXLS_Speech.Replace(va("%c",0x92),va("%c",0x27)); // "'" strXLS_Speech.Replace(va("%c",0x96),va("%c",0x2D)); // "-" strXLS_Speech.Replace(va("%c",0x97),va("%c",0x2D)); // "-" // remove any leading or trailing double-quotes, but leave any in the middle, // so don't just blanket-delete them... // while (strXLS_Speech.GetAt(0) == '"') { strXLS_Speech = strXLS_Speech.Mid(1); } while (strXLS_Speech.GetAt(strXLS_Speech.GetLength()-1) == '"') { strXLS_Speech = strXLS_Speech.Left(strXLS_Speech.GetLength()-1); } // find any more crap lurking... // for (int i=0; i 127 ) { int z=1; } } if (!strXLS_Speech.IsEmpty()) { // OutputDebugString(va("Label: \"%s\", Char: \"%s\", Speech: \"%s\"\n",(LPCSTR)strXLS_Label, (LPCSTR)strXLS_Character, (LPCSTR) strXLS_Speech )); // now enter into table... // // CString strXLS_Label; // CString strXLS_Character; // CString strXLS_Speech; // // first, decode label into components... // CString strTemp = strXLS_Label.Left(2); int iLabel_Level = atoi(strTemp); CString strLabel_Char = strXLS_Label.Mid(2); strLabel_Char = strLabel_Char.Left(3); strTemp = strXLS_Label.Mid(5); int iLabel_CharSpeechNum = atoi(strTemp); // OutputDebugString(va("Level: %d, Char: \"%s\", Speech %d\n",iLabel_Level,(LPCSTR)strLabel_Char, iLabel_CharSpeechNum)); Speech_t Speech; Speech.SpeechLabel.strLabel = strXLS_Label; Speech.SpeechLabel.iLevel = iLabel_Level; Speech.SpeechLabel.strChar = strLabel_Char; Speech.SpeechLabel.iCharSpeechNum = iLabel_CharSpeechNum; Speech.strCharacter = strXLS_Character; Speech.strSpeech = strXLS_Speech; SpeechesPerLevel[iLabel_Level].push_back(Speech); StatusMessage(va("Lines remaining %d\n",iStatsOnly_LinesRemaining)); } else { WarningBox(va("Unable to get speech from line:\n%s\n",(LPCSTR)strThisLineOriginalForErrorReporting)); } } else { WarningBox(va("Unable to get speech from line:\n%s\n",(LPCSTR)strThisLineOriginalForErrorReporting)); } } else { WarningBox(va("Unable to get character name from line:\n%s\n",(LPCSTR)strThisLineOriginalForErrorReporting)); } } else { WarningBox(va("Unable to get label from line:\n%s\n",(LPCSTR)strThisLineOriginalForErrorReporting)); } } } StatusMessage("All speeches read\n"); // read in the levelnames cross-reference file... // CString strFileName_LevelNames(sWORKDIR "\\levelnames.txt"); char *psData_LevelNames = NULL; StatusMessage(va("Reading \"%s\"\n",(LPCSTR) strFileName_LevelNames)); iSize = LoadFile(strFileName_LevelNames, (void**)&psData_LevelNames); if (iSize != -1) { CWaitCursor wait; typedef map LevelNames_t; LevelNames_t LevelNames; CString strLevelNames(psData_LevelNames); free(psData_LevelNames); while (!strLevelNames.IsEmpty()) { CString strThisLine; int iLoc = strLevelNames.Find('\n'); if (iLoc != -1) { strThisLine = strLevelNames.Left(iLoc); strLevelNames = strLevelNames.Mid(iLoc+1); } else { strThisLine = strLevelNames; strLevelNames.Empty(); } if (!strThisLine.IsEmpty()) { // format example: // // 01 kejim_post // strThisLine.TrimLeft(); strThisLine.TrimRight(); int iLevelNumber = atoi(strThisLine); iLoc = strThisLine.FindOneOf(" \t"); if (iLoc != -1) { strThisLine = strThisLine.Mid(iLoc); strThisLine.TrimLeft(); strThisLine.MakeLower(); LevelNames[iLevelNumber] = strThisLine; } } } // now write them out as SP files... // for (SpeechesPerLevel_t::iterator itLevel = SpeechesPerLevel.begin(); itLevel != SpeechesPerLevel.end(); ++itLevel) { int iLevel = (*itLevel).first; Speeches_t &Speeches= (*itLevel).second; // simple stuff for now... // if (Speeches.size() > 256 ) { int z=1; } else { CString strStripEdFileNameBase((LevelNames.find(iLevel) != LevelNames.end())?(LPCSTR)LevelNames[iLevel]:"_unknown"); CString strStripEdText; StatusMessage(va("Constructing SP file \"%s\"\n",(LPCSTR)strStripEdFileNameBase)); // some basic stuff first... // strStripEdText += "VERSION 1\n"; strStripEdText += "CONFIG W:\\bin\\striped.cfg\n"; strStripEdText += va("ID %d\n",GetUniqueStripEdID( sWORKDIR, sNETDIR )); strStripEdText += va("REFERENCE %s\n",String_ToUpper(strStripEdFileNameBase)); strStripEdText += va("DESCRIPTION \"%s\"\n",String_ToLower(strStripEdFileNameBase)); strStripEdText += va("COUNT %d\n",Speeches.size()); for (int iSpeech=0; iSpeech < Speeches.size(); iSpeech++) { Speech_t &Speech = Speeches[iSpeech]; // OutputDebugString(va("%d/%d: \"%s\"\n",iSpeech,Speeches.size(),(LPCSTR) Speeches[iSpeech].strSpeech)); StatusMessage(va("%s: Adding string %d\n",(LPCSTR)strStripEdFileNameBase,iSpeech)); strStripEdText += va("INDEX %d\n",iSpeech); strStripEdText += "{\n"; strStripEdText += va(" REFERENCE %s\n",String_ToUpper(Speech.SpeechLabel.strLabel)); strStripEdText += va(" TEXT_LANGUAGE1 \"%s\"\n",Speech.strSpeech); strStripEdText += "}\n"; } CString strOutputFileName(va("%s\\%s.sp",sWORKDIR,(LPCSTR)strStripEdFileNameBase)); StatusMessage(va("Writing \"%s\"... \n",(LPCSTR) strOutputFileName)); strStripEdText.Replace("\n","\r\n"); // make it suitable for binary write SaveFile((LPCSTR) strOutputFileName, (LPCSTR) strStripEdText, strStripEdText.GetLength() ); } } } else { ErrorBox(va("Unable to open \"%s\"!",(LPCSTR)strFileName_LevelNames)); } } else { ErrorBox(va("Unable to open \"%s\"!",(LPCSTR)strFileName_ExportedXLS)); } StatusMessage(NULL); } void CMainFrame::OnEditTopmost() { AppVars.bAlwaysOnTop = !AppVars.bAlwaysOnTop; SetWindowPos(AppVars.bAlwaysOnTop?&wndTopMost:&wndNoTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE); } void CMainFrame::OnUpdateEditTopmost(CCmdUI* pCmdUI) { pCmdUI->SetCheck(AppVars.bAlwaysOnTop); } void CMainFrame::OnViewTriindexes() { AppVars.bTriIndexes = !AppVars.bTriIndexes; m_splitter.Invalidate(false); } // only allow this option if surface highlighting is on... // void CMainFrame::OnUpdateViewTriindexes(CCmdUI* pCmdUI) { pCmdUI->Enable ( AppVars.bSurfaceHighlight ); pCmdUI->SetCheck( AppVars.bTriIndexes ); } #define sJK2BASEDIR "w:\\game\\base\\" void CMainFrame::OnFileViewJk2Bots() { if (!gamedir[0]) { LPCSTR psBasePathToCopy = sJK2BASEDIR; if (!GetYesNo("Warning: base path not known yet, shall I assume ' " sJK2BASEDIR " ' ?")) { psBasePathToCopy = GetString("Enter suitable base path\n\n( format example: \"" sJK2BASEDIR "\" )"); if (!psBasePathToCopy) return; } strcpy(gamedir,psBasePathToCopy); } CString strScript; CSOF2NPCViewer Viewer(false, &strScript, gamedir); Model_StopAnim(); // or the screen update stops the GDI stuff from showing up if (Viewer.DoModal() == IDOK) { if (Gallery_Active()) { // pick this up in the timer loop now... // // CString strCaption; // while (GalleryRead_ExtractEntry(strCaption, strScript)) // { // OutputDebugString(va("\"%s\" (script len %d)\n",(LPCSTR)strCaption,strScript.GetLength())); // } extern CString strGalleryErrors; extern CString strGalleryWarnings; extern CString strGalleryInfo; strGalleryErrors = strGalleryWarnings = strGalleryInfo = ""; Model_StopAnim(); gbTextInhibit = AppVars.bCleanScreenShots; //true; return; } else { // normal double-click on a single template list entry... // if (!strScript.IsEmpty()) { strScript += "\n\n\n"; //SendStringToNotepad(strScript,"temp.txt"); string strOutputFileName( va("%s\\%s",scGetTempPath(),"temp.mvs") ); int iReturn = SaveFile(strOutputFileName.c_str(),(LPCSTR)strScript, strScript.GetLength()); if (iReturn != -1) { extern bool Document_ModelLoadPrimary(LPCSTR psFilename); Document_ModelLoadPrimary(strOutputFileName.c_str()); } } } } } void CMainFrame::OnAnimationEndframe() { ModelList_GoToEndFrame(); } #define sJK3BASEDIR "c:\\ja\\base\\" void CMainFrame::OnFileBatchconvert() { LPCSTR psBasePathToCopy = sJK3BASEDIR; if (!GetYesNo("Warning: base path not known yet, shall I assume ' " sJK3BASEDIR " ' ?")) { psBasePathToCopy = GetString("Enter suitable base path\n\n( format example: \"" sJK3BASEDIR "\" )"); if (!psBasePathToCopy) return; } // Scan for list of available .GLM files char **ppsGLMFiles; int iGLMFiles; ppsGLMFiles = //ri.FS_ListFiles( "shaders", ".shader", &iSkinFiles ); Sys_ListFiles( psBasePathToCopy, // const char *directory, "/", // const char *extension, "*.glm", // char *filter, &iGLMFiles, // int *numfiles, qfalse // qboolean wantsubs ); if(!iGLMFiles) { WarningBox(va("WARNING: no GLM files found in '%s'\n",psBasePathToCopy )); return; } for ( int i=0; iOnOpenDocument(sFileName); // Save compressed GLM file StatusMessage( va("Saving compressed GLM file %d/%d: \"%s\"...",i+1,iGLMFiles,sFileName)); Model_Save(sFileName); } Sys_FreeFileList( ppsGLMFiles ); }