Thread: [Gcblue-commits] gcb_wx/src/sim Game.cpp,1.54,1.55 tc3DViewer.cpp,1.27,1.28 tcMapView.cpp,1.15,1.16
Status: Alpha
Brought to you by:
ddcforge
From: <ddc...@us...> - 2004-01-20 03:02:57
|
Update of /cvsroot/gcblue/gcb_wx/src/sim In directory sc8-pr-cvs1:/tmp/cvs-serv12457/src/sim Modified Files: Game.cpp tc3DViewer.cpp tcMapView.cpp tcSimState.cpp Log Message: Index: Game.cpp =================================================================== RCS file: /cvsroot/gcblue/gcb_wx/src/sim/Game.cpp,v retrieving revision 1.54 retrieving revision 1.55 diff -C2 -d -r1.54 -r1.55 *** Game.cpp 18 Jan 2004 18:42:41 -0000 1.54 --- Game.cpp 20 Jan 2004 03:02:53 -0000 1.55 *************** *** 37,41 **** #include "tcCustomControl.h" #include "commandlist.h" // for custom command queue handler - #include "tcrendersurface.h" #include "tcHookInfo.h" #include "tcOOBView.h" --- 37,40 ---- *************** *** 106,109 **** --- 105,111 ---- Show(FALSE); + glCanvas = new wxGLCanvas(this, -1, wxPoint(0,0), size, 0, "GLCanvas", 0, wxNullPalette); + glCanvas->SetBackgroundColour(*wxBLACK); + pythonInterface = new tcSimPythonInterface(); goalTracker = mcSimState.GetGoalTracker(); *************** *** 333,337 **** /*** Init edit control ***/ ! editControl = new tcEditControl(this, wxPoint(200,200),wxSize(100,50)); mcDatabase.LoadDBCSV(); --- 335,339 ---- /*** Init edit control ***/ ! editControl = new tcEditControl(glCanvas, wxPoint(200,200),wxSize(100,50)); mcDatabase.LoadDBCSV(); *************** *** 375,378 **** --- 377,382 ---- meGameMode = GM_START; meScreenMode = START; + + wxWindow::Show(TRUE); } catch(std::string s) *************** *** 392,399 **** void tcGame::Initialize3DViewer() { smallViewerPosition = wxPoint(mnWidth - 380, 0); smallViewerSize = wxSize(380, 200); ! viewer = new tc3DViewer(this, smallViewerPosition, smallViewerSize); viewer->SetActive(false); --- 396,405 ---- void tcGame::Initialize3DViewer() { + wxASSERT(glCanvas); + smallViewerPosition = wxPoint(mnWidth - 380, 0); smallViewerSize = wxSize(380, 200); ! viewer = new tc3DViewer(glCanvas, smallViewerPosition, smallViewerSize); viewer->SetActive(false); *************** *** 428,432 **** void tcGame::InitializeStartView() { ! startView = new tcStartView(this, wxPoint(0,0), frameSize); startView->SetYMirror(mnHeight); --- 434,440 ---- void tcGame::InitializeStartView() { ! wxASSERT(glCanvas); ! ! startView = new tcStartView(glCanvas, wxPoint(0,0), frameSize); startView->SetYMirror(mnHeight); *************** *** 455,459 **** void tcGame::InitializeOptionsView() { ! optionsView = new tcOptionsView(this, wxPoint(0,0), frameSize); optionsView->SetYMirror(mnHeight); --- 463,467 ---- void tcGame::InitializeOptionsView() { ! optionsView = new tcOptionsView(glCanvas, wxPoint(0,0), frameSize); optionsView->SetYMirror(mnHeight); *************** *** 482,486 **** { int leftConsoleHeight = mnHeight-mnBottomMargin; ! briefingConsoleLeft = new tcButtonConsole(this, wxPoint(0,0), wxSize(mnBriefingWidth,leftConsoleHeight)); if (!briefingConsoleLeft) --- 490,494 ---- { int leftConsoleHeight = mnHeight-mnBottomMargin; ! briefingConsoleLeft = new tcButtonConsole(glCanvas, wxPoint(0,0), wxSize(mnBriefingWidth,leftConsoleHeight)); if (!briefingConsoleLeft) *************** *** 507,511 **** briefingConsoleLeft->AddButton(wxRect(10,leftConsoleHeight-20,50,14), ID_SKIPBRIEFING, " SKIP"); ! briefingConsoleBottom = new tcSoundConsole(this, wxPoint(0,mnHeight-mnBottomMargin), wxSize(mnWidth,mnBottomMargin)); if (!briefingConsoleBottom) --- 515,519 ---- briefingConsoleLeft->AddButton(wxRect(10,leftConsoleHeight-20,50,14), ID_SKIPBRIEFING, " SKIP"); ! briefingConsoleBottom = new tcSoundConsole(glCanvas, wxPoint(0,mnHeight-mnBottomMargin), wxSize(mnWidth,mnBottomMargin)); if (!briefingConsoleBottom) *************** *** 536,540 **** void tcGame::InitializeCreditView() { ! creditView = new tcCreditView(this, wxPoint(0,0), frameSize); creditView->SetYMirror(mnHeight); --- 544,548 ---- void tcGame::InitializeCreditView() { ! creditView = new tcCreditView(glCanvas, wxPoint(0,0), frameSize); creditView->SetYMirror(mnHeight); *************** *** 575,579 **** void tcGame::InitializeScenarioSelectView() { ! scenarioSelectView = new tcScenarioSelectView(this, wxPoint(0,0), frameSize); scenarioSelectView->SetYMirror(mnHeight); --- 583,587 ---- void tcGame::InitializeScenarioSelectView() { ! scenarioSelectView = new tcScenarioSelectView(glCanvas, wxPoint(0,0), frameSize); scenarioSelectView->SetYMirror(mnHeight); *************** *** 602,606 **** mrectMap.right = mnWidth; //GetSystemMetrics(SM_CXFULLSCREEN); mrectMap.bottom = mnHeight - 200; //GetSystemMetrics(SM_CYFULLSCREEN); ! tacticalMap = new tcTacticalMapView(this, wxPoint(mrectMap.left,mrectMap.top), wxSize(mrectMap.right-mrectMap.left, mrectMap.bottom-mrectMap.top)); tacticalMapSize = TM_LARGE; --- 610,614 ---- mrectMap.right = mnWidth; //GetSystemMetrics(SM_CXFULLSCREEN); mrectMap.bottom = mnHeight - 200; //GetSystemMetrics(SM_CYFULLSCREEN); ! tacticalMap = new tcTacticalMapView(glCanvas, wxPoint(mrectMap.left,mrectMap.top), wxSize(mrectMap.right-mrectMap.left, mrectMap.bottom-mrectMap.top)); tacticalMapSize = TM_LARGE; *************** *** 635,639 **** mrectLowerLeft.bottom = mnHeight; ! infoConsole = new tcSoundConsole(this, wxPoint(mrectLowerLeft.left,mrectLowerLeft.top), wxSize(200,200)); if (!infoConsole) --- 643,647 ---- mrectLowerLeft.bottom = mnHeight; ! infoConsole = new tcSoundConsole(glCanvas, wxPoint(mrectLowerLeft.left,mrectLowerLeft.top), wxSize(200,200)); if (!infoConsole) *************** *** 660,664 **** /* ** hookInfo init * **/ ! hookInfo = new tcHookInfo(this, wxPoint(mrectLowerLeft.right,mrectLowerLeft.top), wxSize(200,200)); --- 668,672 ---- /* ** hookInfo init * **/ ! hookInfo = new tcHookInfo(glCanvas, wxPoint(mrectLowerLeft.right,mrectLowerLeft.top), wxSize(200,200)); *************** *** 684,688 **** // objectControl init ! objectControl = new tcObjectControl(this, wxPoint(mrectLowerLeft.right+200,mrectLowerLeft.top), wxSize(mnWidth-400,200)); if (!objectControl) --- 692,696 ---- // objectControl init ! objectControl = new tcObjectControl(glCanvas, wxPoint(mrectLowerLeft.right+200,mrectLowerLeft.top), wxSize(mnWidth-400,200)); if (!objectControl) *************** *** 712,716 **** mrectOOB.right = 200; mrectOOB.bottom = mnHeight-200; ! oobView = new tcOOBView(this, wxPoint(mrectOOB.left,mrectOOB.top), wxSize(mrectOOB.right-mrectOOB.left, mrectOOB.bottom-mrectOOB.top)); if (!oobView) --- 720,724 ---- mrectOOB.right = 200; mrectOOB.bottom = mnHeight-200; ! oobView = new tcOOBView(glCanvas, wxPoint(mrectOOB.left,mrectOOB.top), wxSize(mrectOOB.right-mrectOOB.left, mrectOOB.bottom-mrectOOB.top)); if (!oobView) *************** *** 741,745 **** rpopup.bottom = 700; ! popupControl = new tcPopupControl(this, wxPoint(rpopup.left, rpopup.top), wxSize(rpopup.right - rpopup.left, rpopup.bottom - rpopup.top)); if (!popupControl) --- 749,753 ---- rpopup.bottom = 700; ! popupControl = new tcPopupControl(glCanvas, wxPoint(rpopup.left, rpopup.top), wxSize(rpopup.right - rpopup.left, rpopup.bottom - rpopup.top)); if (!popupControl) *************** *** 760,763 **** --- 768,772 ---- popupControl->SetActive(false); popupControl->SetBlend(true); + popupControl->Show(true); // to prevent artifact when displaying for first time popupControl->SetSkipCount(0); popupControl->Raise(); // bring popup to top of windows hierarchy to receive mouse events *************** *** 936,940 **** } ! void tcGame::SetTacticalMapSize(teTacticalMapSize mapSize) { if (mapSize == tacticalMapSize) return; --- 945,949 ---- } ! void tcGame::SetTacticalMapSize(tcGame::teTacticalMapSize mapSize) { if (mapSize == tacticalMapSize) return; Index: tc3DViewer.cpp =================================================================== RCS file: /cvsroot/gcblue/gcb_wx/src/sim/tc3DViewer.cpp,v retrieving revision 1.27 retrieving revision 1.28 diff -C2 -d -r1.27 -r1.28 *** tc3DViewer.cpp 18 Jan 2004 18:42:41 -0000 1.27 --- tc3DViewer.cpp 20 Jan 2004 03:02:53 -0000 1.28 *************** *** 28,38 **** #endif #include "tc3DViewer.h" - #include "tcrendersurface.h" #include "math_constants.h" ! #include <Producer/Camera> ! #include <Producer/CameraGroup> ! #include <Producer/CameraConfig> ! #include <Producer/Math> #include <osg/CullStack> #include <osg/Depth> --- 28,36 ---- #endif + #include "wx/glcanvas.h" + #include "tc3DViewer.h" #include "math_constants.h" ! #include <osg/BlendFunc> #include <osg/CullStack> #include <osg/Depth> *************** *** 43,49 **** #include <osgDB/Registry> #include <osgDB/ReadFile> - #include <osgProducer/OsgCameraGroup> #include <osg/PositionAttitudeTransform> #include <osgUtil/CullVisitor> #include <osgUtil/UpdateVisitor> #include <osgText/Font> --- 41,47 ---- #include <osgDB/Registry> #include <osgDB/ReadFile> #include <osg/PositionAttitudeTransform> #include <osgUtil/CullVisitor> + #include <osgUtil/SceneView> #include <osgUtil/UpdateVisitor> #include <osgText/Font> *************** *** 168,172 **** void tc3DViewer::OnRButtonDown(wxMouseEvent& event) { ! event.Skip(); } --- 166,170 ---- void tc3DViewer::OnRButtonDown(wxMouseEvent& event) { ! // event.Skip(); // stop event to suppress popup } *************** *** 182,188 **** int parentHeight = parentSize.GetHeight(); int correctedY = parentHeight - (pos.y + size.GetHeight()); ! camera->setProjectionRectangle(pos.x,correctedY,size.GetWidth(),size.GetHeight()); mnWidth = size.GetWidth(); mnHeight = size.GetHeight(); // update orthographic projection for HUD objects orthoProjection->setMatrix(osg::Matrix::ortho2D(0,(double)size.GetWidth(),0,(double)size.GetHeight())); --- 180,190 ---- int parentHeight = parentSize.GetHeight(); int correctedY = parentHeight - (pos.y + size.GetHeight()); ! sceneView->setViewport(pos.x,correctedY,size.GetWidth(),size.GetHeight()); ! mnWidth = size.GetWidth(); mnHeight = size.GetHeight(); + + UpdateProjectionMatrix(size); + // update orthographic projection for HUD objects orthoProjection->setMatrix(osg::Matrix::ortho2D(0,(double)size.GetWidth(),0,(double)size.GetHeight())); *************** *** 359,369 **** foggedObjects->setStateSet(fogState); ! worldObjects = new osg::Group; terrainManager = new tc3DTerrain(); osg::ref_ptr<osg::Node> terrainNode = terrainManager->GetTerrainNode().get(); osg::StateSet *terrainState = terrainNode->getOrCreateStateSet(); terrainState->setMode(GL_LIGHTING, osg::StateAttribute::ON); skyTransform = new osg::PositionAttitudeTransform; --- 361,392 ---- foggedObjects->setStateSet(fogState); + { + worldObjects = new osg::Group; ! osg::StateSet *objectState = worldObjects->getOrCreateStateSet(); ! osg::BlendFunc *blendFunction = new osg::BlendFunc; ! blendFunction->setFunction(osg::BlendFunc::SRC_ALPHA, osg::BlendFunc::ONE_MINUS_SRC_ALPHA); ! objectState->setAttributeAndModes(blendFunction, osg::StateAttribute::ON); ! ! ! // osg::Depth* depth = new osg::Depth(osg::Depth::LESS, zmin, zmax); ! // objectState->setAttributeAndModes(depth, osg::StateAttribute::OFF ); ! } terrainManager = new tc3DTerrain(); osg::ref_ptr<osg::Node> terrainNode = terrainManager->GetTerrainNode().get(); + osg::StateSet *terrainState = terrainNode->getOrCreateStateSet(); terrainState->setMode(GL_LIGHTING, osg::StateAttribute::ON); + terrainState->setMode(GL_CULL_FACE, StateAttribute::OFF); + osg::Depth* depth = new osg::Depth; + depth->setFunction(osg::Depth::LESS); + depth->setRange(0, 1); + depth->setWriteMask(true); + terrainState->setAttributeAndModes(depth,StateAttribute::ON); + // terrainState->setRenderBinDetails(0, "RenderBin"); + + //osg::Depth* tdepth = new osg::Depth(osg::Depth::LESS, 2.0, 200000.0); + //terrainState->setAttributeAndModes(tdepth, osg::StateAttribute::ON ); skyTransform = new osg::PositionAttitudeTransform; *************** *** 386,390 **** void tc3DViewer::CreateSky() { ! osg::StateSet* globalStateSet = camera_group->getGlobalStateSet(); wxASSERT(globalStateSet); --- 409,413 ---- void tc3DViewer::CreateSky() { ! osg::StateSet* globalStateSet = sceneView->getGlobalStateSet(); wxASSERT(globalStateSet); *************** *** 448,451 **** --- 471,476 ---- void tc3DViewer::Frame() { + wxASSERT(sceneView.valid()); + if (isFrozen && isActive) { *************** *** 453,463 **** isFrozen = false; } ! if (isActive && camera_group.valid()) { ! camera_group->frame(); } else { ! if (render_surface.valid()) render_surface->swapBuffers(); } } --- 478,492 ---- isFrozen = false; } ! if (isActive && sceneView.valid()) { ! sceneView->update(); ! sceneView->cull(); ! sceneView->draw(); ! glFinish(); ! Swap(); } else { ! Swap(); } } *************** *** 509,513 **** if (!obj) return; ! Producer::Vec3 targetPosition; if (lookAtTarget || moveWithTarget) { --- 538,542 ---- if (!obj) return; ! osg::Vec3 targetPosition; if (lookAtTarget || moveWithTarget) { *************** *** 516,520 **** if (moveWithTarget) { ! Producer::Vec3 camOffset; if (usePolarOffset) { --- 545,549 ---- if (moveWithTarget) { ! osg::Vec3 camOffset; if (usePolarOffset) { *************** *** 522,526 **** float camy = cosf(cameraEl)*cosf(cameraAz); float camz = sinf(cameraEl); ! camOffset = Producer::Vec3(camx,camy,camz)*cameraRange; } else --- 551,555 ---- float camy = cosf(cameraEl)*cosf(cameraAz); float camz = sinf(cameraEl); ! camOffset = osg::Vec3(camx,camy,camz)*cameraRange; } else *************** *** 528,532 **** camOffset = cameraPositionOffset; } ! Producer::Matrix m = Producer::Matrix::translate(camOffset); cameraPosition = targetPosition*m; } --- 557,561 ---- camOffset = cameraPositionOffset; } ! osg::Matrix m = osg::Matrix::translate(camOffset); cameraPosition = targetPosition*m; } *************** *** 545,554 **** float camy = cosf(cameraLookEl)*cosf(cameraLookAz); float camz = sinf(cameraLookEl); ! Producer::Vec3 lookOffset = Producer::Vec3(camx,camy,camz); ! Producer::Matrix m = Producer::Matrix::translate(lookOffset); cameraTarget = cameraPosition*m; } ! ! camera->setViewByLookat(cameraPosition, cameraTarget, Producer::Vec3(0,0,1)); // update skyTransform based on camera position --- 574,582 ---- float camy = cosf(cameraLookEl)*cosf(cameraLookAz); float camz = sinf(cameraLookEl); ! osg::Vec3 lookOffset(camx,camy,camz); ! osg::Matrix m = osg::Matrix::translate(lookOffset); cameraTarget = cameraPosition*m; } ! sceneView->setViewMatrixAsLookAt(cameraPosition, cameraTarget, osg::Vec3(0,0,1)); // update skyTransform based on camera position *************** *** 612,617 **** * distance exceeds shiftDistance, then set the origin * to current camera position. */ ! void tc3DViewer::UpdateOrigin() { float camx = cameraPosition.x(); --- 640,646 ---- * distance exceeds shiftDistance, then set the origin * to current camera position. + * @return true if updated */ ! bool tc3DViewer::UpdateOrigin() { float camx = cameraPosition.x(); *************** *** 619,623 **** float camRadius = sqrtf(camx*camx + camy*camy); ! if (camRadius >= shiftDistance) { double newLon = XToLon(cameraPosition.x()); --- 648,652 ---- float camRadius = sqrtf(camx*camx + camy*camy); ! if ((camRadius >= shiftDistance)&&(isActive)) { double newLon = XToLon(cameraPosition.x()); *************** *** 628,632 **** --- 657,663 ---- cameraPosition.y() = 0; SetOrigin(newLon, newLat); + return true; } + return false; } *************** *** 640,649 **** * @return camera position in world coordinates. */ ! Producer::Vec3 tc3DViewer::GetCameraPosition() { float x = LonToX(cameraLongitude); float y = LatToY(cameraLatitude); float z = cameraAltitude; ! return Producer::Vec3(x,y,z); } --- 671,680 ---- * @return camera position in world coordinates. */ ! osg::Vec3 tc3DViewer::GetCameraPosition() { float x = LonToX(cameraLongitude); float y = LatToY(cameraLatitude); float z = cameraAltitude; ! return osg::Vec3(x,y,z); } *************** *** 651,660 **** * @return object position in world coordinates. */ ! Producer::Vec3 tc3DViewer::GetObjectPosition(tcGameObject *obj) { float x = LonToX(obj->mcKin.mfLon_rad); float y = LatToY(obj->mcKin.mfLat_rad); float z = obj->mcKin.mfAlt_m; ! return Producer::Vec3(x,y,z); } --- 682,691 ---- * @return object position in world coordinates. */ ! osg::Vec3 tc3DViewer::GetObjectPosition(tcGameObject *obj) { float x = LonToX(obj->mcKin.mfLon_rad); float y = LatToY(obj->mcKin.mfLat_rad); float z = obj->mcKin.mfAlt_m; ! return osg::Vec3(x,y,z); } *************** *** 678,716 **** } ! /** ! * This didn't accomplish anything useful. I tried to use ! * this to automatically undo the OpenGL state changes applied ! * by tcGraphicsEngine to do the 2D drawing. ! */ ! void tc3DViewer::DirtyAll() { - osgProducer::OsgCameraGroup::SceneHandlerList& shvec = camera_group->getSceneHandlerList(); - Producer::ref_ptr<osgProducer::OsgSceneHandler> sh = shvec.at(0); - osgUtil::SceneView* sv = sh->getSceneView(); - sv->getState()->dirtyAllModes(); - sv->getState()->dirtyAllAttributes(); - } ! void tc3DViewer::InitSceneView() ! { ! osgProducer::OsgCameraGroup::SceneHandlerList& shvec = camera_group->getSceneHandlerList(); ! if (shvec.size() != 1) ! { ! wxMessageBox("Bad scenehandlerlist in camera_group"); ! return; ! } ! Producer::ref_ptr<osgProducer::OsgSceneHandler> sh = shvec.at(0); ! osgUtil::SceneView* sv = sh->getSceneView(); ! sv->setDefaults(); ! // set up the clear mask. ! osgUtil::RenderStage *stage = sv->getRenderStage(); ! stage->setClearDepth(1e6); ! sv->setComputeNearFarMode(osgUtil::CullVisitor::DO_NOT_COMPUTE_NEAR_FAR); ! sv->setLightingMode(osgUtil::SceneView::NO_SCENEVIEW_LIGHT); ! //sv->setComputeNearFarMode(osgUtil::CullVisitor::COMPUTE_NEAR_FAR_USING_BOUNDING_VOLUMES); /* NO_CULLING = 0x0, --- 709,740 ---- } ! void tc3DViewer::InitSceneView(wxPoint pos, wxSize size) { ! sceneView = new osgUtil::SceneView(); ! wxASSERT(sceneView->getDisplaySettings()==NULL); ! displaySettings = new osg::DisplaySettings; ! // displaySettings->setRGB(true); ! //displaySettings->setDoubleBuffer(true); ! displaySettings->setDepthBuffer(true); ! //displaySettings->setMinimumNumAlphaBits(4); ! sceneView->setDisplaySettings(displaySettings.get()); ! sceneView->setDefaults(); ! wxWindow *parent = wxWindow::GetParent(); ! wxSize parentSize = parent->GetSize(); ! int parentHeight = parentSize.GetHeight(); ! int correctedY = parentHeight - (pos.y + size.GetHeight()); ! UpdateProjectionMatrix(size); ! ! sceneView->setViewport(pos.x,correctedY,size.GetWidth(),size.GetHeight()); ! sceneView->setComputeNearFarMode(osgUtil::CullVisitor::DO_NOT_COMPUTE_NEAR_FAR); ! sceneView->setLightingMode(osgUtil::SceneView::NO_SCENEVIEW_LIGHT); ! sceneView->setBackgroundColor(osg::Vec4(0, 0, 0, 1.0f)); ! ! //sceneView->setComputeNearFarMode(osgUtil::CullVisitor::COMPUTE_NEAR_FAR_USING_BOUNDING_VOLUMES); /* NO_CULLING = 0x0, *************** *** 722,747 **** ENABLE_ALL_CULLING */ ! sv->setCullingMode( ! osg::CullStack::FAR_PLANE_CULLING | ! osg::CullStack::NEAR_PLANE_CULLING //osg::CullStack::VIEW_FRUSTUM_CULLING // osg::CullStack::SMALL_FEATURE_CULLING ); ! } void tc3DViewer::InitState() { ! // set the global state (taken from osgProducer::Viewer::setUpViewer ) ! osg::ref_ptr<osg::StateSet> globalStateSet = new osg::StateSet; ! camera_group->setGlobalStateSet(globalStateSet.get()); { ! #if 0 ! globalStateSet->setGlobalDefaults(); // enable depth testing by default. ! osg::Depth* depth = new osg::Depth(osg::Depth::LEQUAL, 8.0, 100000.0); globalStateSet->setAttributeAndModes(depth, osg::StateAttribute::ON ); ! globalStateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON); #endif --- 746,790 ---- ENABLE_ALL_CULLING */ ! sceneView->setCullingMode( ! osg::CullStack::FAR_PLANE_CULLING ! | osg::CullStack::NEAR_PLANE_CULLING //osg::CullStack::VIEW_FRUSTUM_CULLING // osg::CullStack::SMALL_FEATURE_CULLING ); ! // set up the clear mask. ! osgUtil::RenderStage *stage = sceneView->getRenderStage(); ! stage->setClearMask(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); ! stage->setClearDepth(1.0f); ! stage->setClearColor(osg::Vec4(0,0,0,1.0f)); ! ! frameStamp = new osg::FrameStamp; ! frameStamp->setReferenceTime(gameTime); ! sceneView->setFrameStamp(frameStamp.get()); + updateVisitor = new osgUtil::UpdateVisitor(); + updateVisitor->setFrameStamp(frameStamp.get()); + sceneView->setUpdateVisitor(updateVisitor.get()); + } + /** + * set global state at root node + */ void tc3DViewer::InitState() { ! osg::StateSet * globalStateSet = sceneView->getGlobalStateSet(); ! if (!globalStateSet) { ! globalStateSet = new osg::StateSet; ! sceneView->setGlobalStateSet(globalStateSet); ! } ! { ! ! #if 1 ! //globalStateSet->setGlobalDefaults(); // enable depth testing by default. ! osg::Depth* depth = new osg::Depth(osg::Depth::LESS, 0, 1); globalStateSet->setAttributeAndModes(depth, osg::StateAttribute::ON ); ! //globalStateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON); #endif *************** *** 757,766 **** globalStateSet->setMode(GL_LIGHTING, osg::StateAttribute::ON); // set up an alphafunc by default to speed up blending operations. osg::AlphaFunc* alphafunc = new osg::AlphaFunc; alphafunc->setFunction(osg::AlphaFunc::GREATER,0.0f); globalStateSet->setAttributeAndModes(alphafunc, osg::StateAttribute::ON); - - rootnode->setStateSet(globalStateSet.get()); } } --- 800,814 ---- globalStateSet->setMode(GL_LIGHTING, osg::StateAttribute::ON); + /* + osg::BlendFunc *blendFunction = new osg::BlendFunc; + blendFunction->setFunction(osg::BlendFunc::SRC_ALPHA, osg::BlendFunc::ONE_MINUS_SRC_ALPHA); + globalStateSet->setAttributeAndModes(blendFunction, osg::StateAttribute::ON); + globalStateSet->setMode(GL_CULL_FACE, StateAttribute::OFF); + */ + // set up an alphafunc by default to speed up blending operations. osg::AlphaFunc* alphafunc = new osg::AlphaFunc; alphafunc->setFunction(osg::AlphaFunc::GREATER,0.0f); globalStateSet->setAttributeAndModes(alphafunc, osg::StateAttribute::ON); } } *************** *** 785,789 **** textState->setMode(GL_LIGHTING, osg::StateAttribute::OFF); textState->setMode(GL_FOG, osg::StateAttribute::OFF); ! textGeode->setStateSet(textState); textGeode->addDrawable(viewerText.get()); --- 833,846 ---- textState->setMode(GL_LIGHTING, osg::StateAttribute::OFF); textState->setMode(GL_FOG, osg::StateAttribute::OFF); ! textState->setMode(GL_DEPTH, osg::StateAttribute::OFF); ! textState->setMode(GL_BLEND, osg::StateAttribute::OFF); ! ! /* ! osg::Depth* depth = new osg::Depth; ! depth->setFunction(osg::Depth::ALWAYS); ! depth->setRange(1.0, 1.0); ! depth->setWriteMask(false); ! textState->setAttributeAndModes(depth,StateAttribute::OFF); ! */ textGeode->addDrawable(viewerText.get()); *************** *** 796,799 **** --- 853,861 ---- } + void tc3DViewer::Swap() + { + glCanvas->SwapBuffers(); + } + void tc3DViewer::ToggleFog() { *************** *** 833,838 **** if (!simState) return; - UpdateModels(); - if (lastHook != hookID) { --- 895,898 ---- *************** *** 849,872 **** } ! UpdateOrigin(); UpdateCamera(); UpdateSky(dateZulu); ! camera_group->getFrameStamp()->setFrameNumber(camera_group->getFrameStamp()->getFrameNumber()+1); ! static double simtime = 0; ! camera_group->getFrameStamp()->setReferenceTime(simtime+=0.02); ! updateVisitor->setTraversalNumber(camera_group->getFrameStamp()->getFrameNumber()); ! // update the scene by traversing it with the the update visitor which will ! // call all node update callbacks and animations. ! camera_group->getSceneData()->accept(*updateVisitor); } ! tc3DViewer::tc3DViewer(wxWindow *parent, const wxPoint& pos, const wxSize& size, const wxString& name) : ! wxWindow(parent, -1, pos, size, wxTRANSPARENT_WINDOW, name), mnHeight(size.GetHeight()), mnWidth(size.GetWidth()) { SetBackgroundColour(*wxBLACK); Show(FALSE); --- 909,949 ---- } ! UpdateModels(); ! UpdateCamera(); + + if (UpdateOrigin()) + { + UpdateModels(); + UpdateCamera(); + } + + UpdateSky(dateZulu); ! frameStamp->setFrameNumber(frameStamp->getFrameNumber()+1); ! frameStamp->setReferenceTime(gameTime); ! updateVisitor->setTraversalNumber(frameStamp->getFrameNumber()); ! } ! ! /** ! * Updates sceneView projection matrix. Call once at initialization ! * and once after any window size change. ! */ ! void tc3DViewer::UpdateProjectionMatrix(const wxSize& windowSize) ! { ! wxASSERT(sceneView.valid()); + float aspectRatio = (float)windowSize.GetWidth() / (float)windowSize.GetHeight(); + sceneView->setProjectionMatrixAsPerspective(45.0, aspectRatio, zmin, zmax); } ! tc3DViewer::tc3DViewer(wxGLCanvas *parent, const wxPoint& pos, const wxSize& size, const wxString& name) : ! wxWindow(parent, -1, pos, size, wxTRANSPARENT_WINDOW | wxNO_FULL_REPAINT_ON_RESIZE, name), mnHeight(size.GetHeight()), mnWidth(size.GetWidth()) { + glCanvas = parent; SetBackgroundColour(*wxBLACK); Show(FALSE); *************** *** 878,881 **** --- 955,961 ---- latOrigin_rad = 0; lonOrigin_rad = 0; + zmin = 2.0f; + zmax = 131072.0f; + shiftDistance = 50000.0f; *************** *** 902,942 **** ObjectUpdater::AttachViewer(this); ! camera = new Producer::Camera(); ! ! // causes warning C4312: 'type cast' : conversion from 'WXWidget' to 'HWND' of greater size ! // but no known problems with this ! HWND hwnd = (HWND)parent->GetHandle(); // returns handle to this window ! ! render_surface = new tcRenderSurface(hwnd); // leaks memory! ! render_surface.get()->ref(); // prevents heap exception in debug mode, memory is modified after delete ! camera->setRenderSurface(render_surface.get()); ! ! // OSG convention is X east, Y north, Z up ! camera->setViewByLookat( 0.0f, 200.0f, 300.0f, /// Position of the eye ! 0.0f, 0.0f, 0.0f, /// Point the eye is looking at ! 0.0f, 0.0f, 1.0f ); /// Up ! ! wxSize parentSize = parent->GetSize(); ! int parentHeight = parentSize.GetHeight(); ! int correctedY = parentHeight - (pos.y + size.GetHeight()); ! ! camera->setProjectionRectangle(pos.x,correctedY,size.GetWidth(),size.GetHeight()); ! ! // If using camera group, use this code ! camera_config = new Producer::CameraConfig(); ! camera_config->addCamera("Camera 1", camera.get()); ! ! camera_group = new osgProducer::OsgCameraGroup(camera_config.get()); ! ! camera_group->realize(Producer::CameraGroup::SingleThreaded); // other option is Producer::CameraGroup::ThreadPerCamera ! camera_group->setInstrumentationMode(FALSE); osgDB::Registry::instance()->setDataFilePathList("3d"); ! updateVisitor = new osgUtil::UpdateVisitor(); ! updateVisitor->setFrameStamp(camera_group->getFrameStamp()); rootnode = new osg::Group; ! camera_group->setSceneData(rootnode.get()); hudObjects = new osg::MatrixTransform; --- 982,997 ---- ObjectUpdater::AttachViewer(this); ! InitSceneView(pos, size); osgDB::Registry::instance()->setDataFilePathList("3d"); ! #ifndef _DEBUG ! // to suppress "Number display lists deleted" stdout text ! // doesn't work with OSG 0.9.5, should work with 0.9.6 and beyond ! osg::setNotifyLevel(osg::NOTICE); ! #endif rootnode = new osg::Group; ! sceneView->setSceneData(rootnode.get()); hudObjects = new osg::MatrixTransform; *************** *** 953,958 **** CreateScene(); - - InitSceneView(); } --- 1008,1011 ---- Index: tcMapView.cpp =================================================================== RCS file: /cvsroot/gcblue/gcb_wx/src/sim/tcMapView.cpp,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** tcMapView.cpp 9 Jan 2004 21:48:40 -0000 1.15 --- tcMapView.cpp 20 Jan 2004 03:02:53 -0000 1.16 *************** *** 163,166 **** --- 163,167 ---- // mnWidth and mnHeight updated by tcWindow::OnSize terrainView->SetSize(wxRect(pos.x,pos.y,mnWidth,mnHeight)); + CalcViewParameters(); } *************** *** 539,543 **** else if (mnGameMode == GAMEMODE_PAUSED) { ! sText.Format("%s (PAUSED)",dateTime.c_str()); mpBrush->SetColor(Color(254,125,125,255)); } --- 540,544 ---- else if (mnGameMode == GAMEMODE_PAUSED) { ! sText.Format("%s ",dateTime.c_str()); mpBrush->SetColor(Color(254,125,125,255)); } Index: tcSimState.cpp =================================================================== RCS file: /cvsroot/gcblue/gcb_wx/src/sim/tcSimState.cpp,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -d -r1.23 -r1.24 *** tcSimState.cpp 10 Jan 2004 21:55:31 -0000 1.23 --- tcSimState.cpp 20 Jan 2004 03:02:53 -0000 1.24 *************** *** 263,267 **** } /********************************************************************/ ! void tcSimState::UpdateWeaponHits() { long aKeyList[512]; int nCount; --- 263,271 ---- } /********************************************************************/ ! /** ! * break this up, too many nested conditionals ! */ ! void tcSimState::UpdateWeaponHits() ! { long aKeyList[512]; int nCount; *************** *** 272,300 **** nCount = GetAllWeaponObjects(aKeyList,512); ! for(int k=0;k<nCount;k++) { bFound = maPlatformState.Lookup(aKeyList[k],pobj); tcMissileObject *pMissileObj = dynamic_cast<tcMissileObject*>(pobj); ! if (bFound&&(pMissileObj != NULL)) { bool bTarget = (pMissileObj->GetGuidanceParameters(gp) == 1); bFound = (bTarget) ? maPlatformState.Lookup(gp.mnTargetID,ptarget) : false; ! if (bFound) { fRange_m = 1000.0f*pobj->mcKin.RangeToKmAlt(ptarget->mcKin); ! float fFactor = 0.0005f*(pobj->mcKin.mfSpeed_kts + ptarget->mcKin.mfSpeed_kts + 2000.0f); ! if (fRange_m < fFactor*50.0f) { ! float fDamage = pMissileObj->mpDBObject->mfDamage; ! float fDamageFract = GetFractionalDamage(fDamage, ptarget); ! ptarget->mfDamageLevel += fDamageFract; ! pobj->mfDamageLevel += 1.0f; // missile destroys itself on impact ! tcString s; ! s.Format("weapon %d hit target %d, range %3.1f m, time %.1f s", ! aKeyList[k],gp.mnTargetID,fRange_m,mfSimTime); ! WTL(s.GetBuffer()); ! if (mpUserInfo->IsOwnAlliance(ptarget->mnAlliance)) { ! mpSound->PlayEffect(SEFFECT_IMPLOSION); ! } ! else { ! mpSound->PlayEffect(SEFFECT_EXPLOSION2); } } } --- 276,328 ---- nCount = GetAllWeaponObjects(aKeyList,512); ! for(int k=0;k<nCount;k++) ! { bFound = maPlatformState.Lookup(aKeyList[k],pobj); tcMissileObject *pMissileObj = dynamic_cast<tcMissileObject*>(pobj); ! if (bFound&&(pMissileObj != NULL)) ! { bool bTarget = (pMissileObj->GetGuidanceParameters(gp) == 1); bFound = (bTarget) ? maPlatformState.Lookup(gp.mnTargetID,ptarget) : false; ! if (bFound) ! { fRange_m = 1000.0f*pobj->mcKin.RangeToKmAlt(ptarget->mcKin); ! float fFactor = 0.01f*(pobj->mcKin.mfSpeed_kts + ptarget->mcKin.mfSpeed_kts + 2000.0f); ! if (fRange_m < fFactor) ! { ! float dx,dy,dz,tclosest; ! tclosest = ptarget->mcKin.CalculateCollisionPoint(pMissileObj->mcKin, ! dx,dy,dz); ! if (tclosest <= 0.03) ! { ! float trueRange2 = dx*dx + dy*dy + dz*dz; ! if (trueRange2 < 64.0f) // 8.0 m range ! { ! tcString s; ! s.Format("weapon %d hit target %d, range^2: %3.1f m, time %.1f s", ! aKeyList[k],gp.mnTargetID,trueRange2,mfSimTime); ! WTL(s.GetBuffer()); ! std::cout << s.GetBuffer(); ! fprintf(stdout," collision relative time: %f, dx:%f dy:%f dz:%f\n", ! tclosest,dx,dy,dz); ! float fDamage = pMissileObj->mpDBObject->mfDamage; ! float fDamageFract = GetFractionalDamage(fDamage, ptarget); ! ptarget->mfDamageLevel += fDamageFract; ! pobj->mfDamageLevel += 1.0f; // missile destroys itself on impact ! ! ! if (mpUserInfo->IsOwnAlliance(ptarget->mnAlliance)) ! { ! mpSound->PlayEffect(SEFFECT_IMPLOSION); ! } ! else ! { ! mpSound->PlayEffect(SEFFECT_EXPLOSION2); ! } ! } } + + + } } |