www.pudn.com > Falcon.zip > AcmiView.cpp, change:1999-10-01,size:15640b
#pragma optimize( "", off ) #include#include "resource.h" #include "Graphics\include\renderwire.h" #include "Graphics\include\terrtex.h" #include "Graphics\include\rViewPnt.h" #include "Graphics\include\loader.h" #include "Graphics\include\drawbsp.h" #include "Graphics\include\drawpole.h" #include "Graphics\include\drawpnt.h" #include "ui95/chandler.h" #include "ui95/cthook.h" #include "ClassTbl.h" #include "Entity.h" #include "fsound.h" #include "f4vu.h" #include "camp2sim.h" #include "f4error.h" #include "falclib\include\f4find.h" #include "dispcfg.h" #include "acmiUI.h" #include "playerop.h" #include "sim\include\simbase.h" #include "codelib\tools\lists\lists.h" #include "acmitape.h" #include "AcmiView.h" extern DeviceManager devmgr; extern ACMIView *acmiView; extern int DisplayFullScreen; extern int DeviceNumber; extern C_Handler *gMainHandler; extern TESTBUTTONPUSH; extern LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam); LRESULT CALLBACK ACMIWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); void CalcTransformMatrix(SimBaseClass* theObject); void CreateObject(SimBaseClass*); //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ACMIView::ACMIView() { _platform = NULL; _win = NULL; _tape = NULL; _entityUIMappings = NULL; _isReady = FALSE; _tapeHasLoaded = FALSE; _pannerX = 0.0f; _pannerY = 0.0f; _pannerZ = 0.0f; _pannerAz = 0.0f; _pannerEl = 0.0f; _chaseX = 0.0f; _chaseY = 0.0f; _chaseZ = 0.0f; _tracking = FALSE; _doWireFrame = 0; _doLockLine = 0; _camYaw = 0.0f; _camPitch = 0.0f; _camRoll = 0.0f; Init(); } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// ACMIView::~ACMIView() { Init(); acmiView = NULL; } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// void ACMIView::Init() { StopGraphicsLoop(); UnloadTape( FALSE ); _drawing = FALSE; _drawingFinished = TRUE; _viewPoint = NULL; _renderer = NULL; _objectScale = 1.0F; //LRKLUDGE _doWeather = FALSE; memset(_fileName, 0, 40); InitUIVector(); } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// void ACMIView::ToggleLabel(int doIDTags) { DrawableBSP::drawLabels = doIDTags ? TRUE : FALSE; } void ACMIView::ToggleHeading(int val) { DrawablePoled::drawHeading = val ? TRUE : FALSE; } void ACMIView::ToggleAltitude(int val) { DrawablePoled::drawAlt = val ? TRUE : FALSE; } void ACMIView::ToggleAirSpeed(int val) { DrawablePoled::drawSpeed = val ? TRUE : FALSE; } void ACMIView::ToggleTurnRate(int val) { DrawablePoled::drawTurnRate = val ? TRUE : FALSE; } void ACMIView::ToggleTurnRadius(int val) { DrawablePoled::drawTurnRadius = val ? TRUE : FALSE; } void ACMIView::ToggleWireFrame(int val) { _doWireFrame = val; } void ACMIView::ToggleLockLines(int val) { _doLockLine = val; } void ACMIView::ToggleScreenShot() { _takeScreenShot ^= 1; _tape->SetScreenCapturing( _takeScreenShot ); }; void ACMIView::TogglePoles(int val) { DrawablePoled::drawPole = val ? TRUE : FALSE; } // BING - TRYING TO SET THE OBJECTS NAME LABEL - FOR UNIQUE NAMES. void ACMIView::SetObjectName(SimBaseClass* theObject, char *tmpStr) { Falcon4EntityClassType *classPtr = (Falcon4EntityClassType*)theObject->EntityType(); if(classPtr->dataType == DTYPE_VEHICLE) { //sprintf(tmpStr, "%s",((VehicleClassDataType*)(classPtr->dataPtr))->Name); sprintf(((VehicleClassDataType*)(classPtr->dataPtr))->Name,"%s",tmpStr); } else if(classPtr->dataType == DTYPE_WEAPON) { //sprintf(tmpStr, "%s",((WeaponClassDataType*)(classPtr->dataPtr))->Name); sprintf(((WeaponClassDataType*)(classPtr->dataPtr))->Name,"%s",tmpStr); } } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// void ACMIView::SetupEntityUIMappings() { int i, numEntities; // BING 3-21-98 TCHAR tmpStr[60]; SimTapeEntity *ep; ACMIEntityData *e; // _tape->_simTapeEntities[i].name; F4Assert(_entityUIMappings == NULL); F4Assert(_tape != NULL && _tape->IsLoaded()); numEntities = _tape->NumEntities(); _entityUIMappings = new ACMIEntityUIMap[numEntities]; F4Assert(_entityUIMappings != NULL); for(i = 0; i < numEntities; i++) { _entityUIMappings[i].listboxId = -1; _entityUIMappings[i].menuId = -1; _entityUIMappings[i].name[0] = 0; ep = Tape()->GetSimTapeEntity(i); // we don't want to put chaff and flares into the list boxes if ( ep->flags & ( ENTITY_FLAG_CHAFF | ENTITY_FLAG_FLARE ) ) continue; GetObjectName(ep->objBase, _entityUIMappings[i].name); if ( _entityUIMappings[i].name[0] == 0 ) continue; e = Tape()->EntityData( i ); sprintf (tmpStr, "%d %s",e->count, _entityUIMappings[i].name); // Update the entityUIMappings... sprintf(_entityUIMappings[i].name,tmpStr); ((DrawableBSP*)(ep->objBase->drawPointer))->SetLabel (_entityUIMappings[i].name, ((DrawableBSP*)(ep->objBase->drawPointer))->LabelColor()); } } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// BOOL ACMIView::LoadTape(char *fname, BOOL reload ) { _tapeHasLoaded = FALSE; F4Assert(_tape == NULL); if ( fname[0] ) memcpy(_fileName, fname, 40); // do we have a file name? if(_fileName[0] == 0) return FALSE; // create the tape from the file _tape = new ACMITape(_fileName, _renderer, _viewPoint); F4Assert(_tape != NULL); // do something go wrong? if(!_tape->IsLoaded()) { delete _tape; _tape = NULL; MonoPrint ( "InitACMIFile() --> Could not load ACMI Tape: %s.\n", _fileName ); return FALSE; } if ( reload == FALSE ) { // Setup our entity UI mappings. SetupEntityUIMappings(); // Set our camera objects. SetCameraObject(0); SetTrackingObject(0); ResetPanner(); } else { SetupEntityUIMappings(); } _tapeHasLoaded = TRUE; return TRUE; } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// void ACMIView::UnloadTape( BOOL reload ) { _tapeHasLoaded = FALSE; if ( reload == FALSE ) { if(_entityUIMappings) { delete [] _entityUIMappings; _entityUIMappings = NULL; } } if(_tape) { delete _tape; _tape = NULL; } } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// char *ACMIView::SetListBoxID(int objectNum, long listID) { _entityUIMappings[objectNum].listboxId = listID; return(_entityUIMappings[objectNum].name); } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// long ACMIView::ListBoxID(int objectNum, long filter) { long menuID = -1; switch(filter) { case INTERNAL_CAM: menuID = _entityUIMappings[objectNum].listboxId; break; case EXTERNAL_CAM: menuID = _entityUIMappings[objectNum].listboxId; break; case CHASE_CAM: menuID = _entityUIMappings[objectNum].listboxId; break; case WING_CAM: /* if(_tape->EntityGroup(objectNum) == 0) { menuID = _entityUIMappings[objectNum].listboxId; } break; */ case BANDIT_CAM: /* if(_tape->EntityGroup(objectNum) == 1) { menuID = _entityUIMappings[objectNum].listboxId; } break; */ case FRIEND_CAM: /* if(_tape->EntityGroup(objectNum) == 0) { menuID = _entityUIMappings[objectNum].listboxId; } break; */ case GVEHICLE_CAM: menuID = _entityUIMappings[objectNum].listboxId; break; case THREAT_CAM: menuID = _entityUIMappings[objectNum].listboxId; break; case WEAPON_CAM: menuID = _entityUIMappings[objectNum].listboxId; break; case TARGET_CAM: menuID = _entityUIMappings[objectNum].listboxId; break; case SAT_CAM: menuID = _entityUIMappings[objectNum].listboxId; break; case REPLAY_CAM: menuID = _entityUIMappings[objectNum].listboxId; break; case DIRECTOR_CAM: menuID = _entityUIMappings[objectNum].listboxId; break; case FREE_CAM: menuID = _entityUIMappings[objectNum].listboxId; break; // default: }; return(menuID); } //////////////////////////////////////////////////////////////////////////////////// void ACMIView::GetObjectName(SimBaseClass* theObject, char *tmpStr) { Falcon4EntityClassType *classPtr = (Falcon4EntityClassType*)theObject->EntityType(); memset(tmpStr, 0, 40); if(classPtr->dataType == DTYPE_VEHICLE || classPtr->dataType == DTYPE_WEAPON) { strcpy(tmpStr, ((DrawableBSP*)theObject->drawPointer)->Label()); if(strlen(tmpStr) == 0) { if(classPtr->dataType == DTYPE_VEHICLE) { sprintf(tmpStr, "%s",((VehicleClassDataType*)(classPtr->dataPtr))->Name); } else if(classPtr->dataType == DTYPE_WEAPON) { sprintf(tmpStr, "%s",((WeaponClassDataType*)(classPtr->dataPtr))->Name); } } } } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// void ACMIView::InitGraphics(C_Window *win) { Tpoint viewPos; Trotation viewRotation; float l, t, r, b, sw, sh; // Preload objects which will need to be instant access // DrawableBSP::LockAndLoad(2); //BING 3-20-98 // SET UP FOR TOGGELING OF LABELS. // int doIDTags; // doIDTags = 1; DrawableBSP::drawLabels = TRUE; DrawablePoint::drawLabels = FALSE; // Load the terrain texture override image // edg: need to put in switch for wireframe terrain if ( _doWireFrame ) { wireTexture.LoadAndCreate( "WireTile.GIF", MPR_TI_PALETTE ); wireTexture.FreeImage(); TheTerrTextures.SetOverrideTexture( wireTexture.TexHandle() ); _renderer = new RenderWire; } else { _renderer = new RenderOTW; } _viewPoint = new RViewPoint; if ( _doWireFrame == FALSE ) { _viewPoint->Setup( 0.75f * PlayerOptions.TerrainDistance() * FEET_PER_KM, PlayerOptions.MaxTerrainLevel(), 4, 0.0f ); _renderer->Setup(gMainHandler->GetFront(), _viewPoint); _renderer->SetTerrainTextureLevel( PlayerOptions.TextureLevel() ); _renderer->SetSmoothShadingMode( PlayerOptions.GouraudOn() ); _renderer->SetHazeMode(PlayerOptions.HazingOn()); _renderer->SetDitheringMode( PlayerOptions.HazingOn() ); _renderer->SetFilteringMode( PlayerOptions.FilteringOn() ); _renderer->SetObjectDetail(PlayerOptions.ObjectDetailLevel() ); _renderer->SetAlphaMode(PlayerOptions.AlphaOn()); _renderer->SetObjectTextureState(PlayerOptions.ObjectTexturesOn()); } else { _viewPoint->Setup( 20.0f * FEET_PER_KM, 0, 2, 0.0f ); _renderer->Setup(gMainHandler->GetFront(), _viewPoint); _renderer->SetTerrainTextureLevel(2); _renderer->SetSmoothShadingMode(FALSE); } sw = (float)gMainHandler->GetFront()->targetXres(); sh = (float)gMainHandler->GetFront()->targetYres(); l = -1.0f +((float) win->GetX() /(sw * 0.5F)); t = 1.0f -((float) win->GetY() /(sh * 0.5F)); r = 1.0f -((float)(sw-(win->GetX() + win->GetW())) /(sw * 0.5F)); b = -1.0f +((float)(sh -(win->GetY() + win->GetH())) /(sh * 0.5F)); _renderer->SetViewport(l, t, r, b); _isReady = TRUE; _drawing = TRUE; _drawingFinished = FALSE; _takeScreenShot = FALSE; _objectScale = 1.0F; viewRotation = IMatrix; // Update object position viewPos.x = 110000.0F; viewPos.y = 137000.0F; viewPos.z = -15000.0F; _drawingFinished = FALSE; _initialGraphicsLoad = TRUE; _drawing = TRUE; } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// void ACMIView::StopGraphicsLoop() { if(_isReady) { _drawing = FALSE; _drawingFinished = TRUE; // This really scares me. What is this here? Are we asking for a race condition??? Sleep(100); // Remove all references to the display device if(_renderer) { _renderer->Cleanup(); delete _renderer; _renderer = NULL; } if(_viewPoint) { _viewPoint->Cleanup(); delete _viewPoint; _viewPoint = NULL; } // Get rid of our texture override if ( _doWireFrame ) { TheTerrTextures.SetOverrideTexture( NULL ); wireTexture.FreeAll(); } _drawingFinished = TRUE; _isReady = FALSE; } } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// int ACMIView::ExitGraphics() { StopGraphicsLoop(); return(1); } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// void ACMIView::DrawIDTags() { } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// void ACMIView::SetPannerXYZ( float x, float y, float z) { _pannerX += x; _pannerY += y; _pannerZ += z; } void ACMIView::SetPannerAzEl( float az, float el ) { _pannerAz += az; _pannerEl += el; } void ACMIView::ResetPanner( void ) { _pannerAz = 0.0f; _pannerEl = 0.0f; _pannerX = 0.0f; _pannerY = 0.0f; _pannerZ = 0.0f; }