[Gcblue-commits] gcb_wx/src/graphics ObjectUpdater.cpp,1.16,1.17 tc3DModel.cpp,1.24,1.25 tc3DViewer.
Status: Alpha
Brought to you by:
ddcforge
|
From: Dewitt C. <ddc...@us...> - 2005-05-17 00:22:18
|
Update of /cvsroot/gcblue/gcb_wx/src/graphics In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32418/src/graphics Modified Files: ObjectUpdater.cpp tc3DModel.cpp tc3DViewer.cpp tcSmoker.cpp Log Message: New feature to display 3D models for sensor tracks based on track position (only generic models for now) Index: tcSmoker.cpp =================================================================== RCS file: /cvsroot/gcblue/gcb_wx/src/graphics/tcSmoker.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** tcSmoker.cpp 31 Mar 2005 03:51:13 -0000 1.3 --- tcSmoker.cpp 17 May 2005 00:20:40 -0000 1.4 *************** *** 127,132 **** void tcSmoker::UpdateSmokePosition(float x, float y, float z) { - wxASSERT(gameObj); - // create rotation matrix (using euler angles for now) const osg::Vec3 xaxis(-1, 0, 0); --- 127,130 ---- *************** *** 139,146 **** osg::Matrixf rotation; ! rotation.makeRotate(gameObj->mcKin.mfHeading_rad, zaxis, gameObj->mcKin.mfPitch_rad, xaxis, gameObj->mcKin.mfRoll_rad, yaxis); ! size_t nSmoke = smokeTrails.size(); --- 137,150 ---- osg::Matrixf rotation; ! if (gameObj) ! { ! rotation.makeRotate(gameObj->mcKin.mfHeading_rad, zaxis, gameObj->mcKin.mfPitch_rad, xaxis, gameObj->mcKin.mfRoll_rad, yaxis); ! } ! else ! { ! rotation.makeRotate(0, zaxis, 0, xaxis, 0, yaxis); ! } size_t nSmoke = smokeTrails.size(); Index: ObjectUpdater.cpp =================================================================== RCS file: /cvsroot/gcblue/gcb_wx/src/graphics/ObjectUpdater.cpp,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** ObjectUpdater.cpp 29 Apr 2005 18:52:53 -0000 1.16 --- ObjectUpdater.cpp 17 May 2005 00:20:40 -0000 1.17 *************** *** 106,122 **** void ObjectUpdater::UpdateTrack(Node* node) { ! tcGameObject* gameObject = model->GetGameObj(); ! wxASSERT(gameObject); ! ! unsigned int ownAlliance = simState->mpUserInfo->GetOwnAlliance(); ! tcSensorMapTrack* track = sensorMap->GetSensorMapTrack(gameObject->mnID, ownAlliance); ! ! int n3DCheatMode = tcOptions::Get()->mn3DCheatMode; ! if ((n3DCheatMode == 0) || (track == 0) || (track->IsBearingOnly())) { ! model->SetGenericMode(tc3DModel::DISABLE_MODEL); return; } int genericMode = 0; --- 106,118 ---- void ObjectUpdater::UpdateTrack(Node* node) { ! tcSensorMapTrack* track = model->GetSensorTrack(); ! if (track == 0) { ! fprintf(stderr, "ObjectUpdater::UpdateTrack - null sensorTrack\n"); ! wxASSERT(false); return; } + int genericMode = 0; *************** *** 132,157 **** ! ! float yaw, pitch, roll; ! float x, y, z; ! yaw = track->mfHeading_rad; ! pitch = 0; ! roll = 0; ! ! // if object is close to camera, use predicted track for position ! if (distanceFromCamera < 10e3) ! { ! tcTrack predicted; ! track->GetPrediction(predicted, simState->GetTime()); ! x = viewer->LonToX(predicted.mfLon_rad); ! y = viewer->LatToY(predicted.mfLat_rad); ! z = predicted.GetOrGuessAltitude(); ! } ! else ! { ! x = viewer->LonToX(track->mfLon_rad); ! y = viewer->LatToY(track->mfLat_rad); ! z = track->GetOrGuessAltitude(); ! } --- 128,141 ---- ! tc3DModel::LocationParams p; ! model->GetLocationParams(p); ! ! float& x = p.x; ! float& y = p.y; ! float& z = p.z; ! float& yaw = p.yaw; ! float& pitch = p.pitch; ! float& roll = p.roll; ! bool& isVisible = p.isVisible; *************** *** 184,222 **** void ObjectUpdater::UpdateTrue(Node* node) { ! float yaw, pitch, roll; ! float x, y, z; ! bool isVisible = true; ! ! tcGameObject* gameObject = model->GetGameObj(); model->SetGenericMode(tc3DModel::USE_TRUE_MODEL); - if (!gameObject->parent) - { - tcKinematics* kin = &gameObject->mcKin; - yaw = kin->mfHeading_rad; - pitch = kin->mfPitch_rad; - roll = kin->mfRoll_rad; - x = viewer->LonToX(kin->mfLon_rad); - y = viewer->LatToY(kin->mfLat_rad); - z = kin->mfAlt_m; - - - } - else - { - tsRelativePosition *pos = &gameObject->rel_pos; - yaw = pos->yaw; - pitch = pos->pitch; - roll = pos->roll; - x = pos->dx; - y = pos->dy; - z = pos->dz; - isVisible = pos->isVisible; - if (!isVisible) - { - z = -50000.0f; - } - } // not correct for child objects --- 168,184 ---- void ObjectUpdater::UpdateTrue(Node* node) { ! tc3DModel::LocationParams p; ! model->GetLocationParams(p); ! ! float& x = p.x; ! float& y = p.y; ! float& z = p.z; ! float& yaw = p.yaw; ! float& pitch = p.pitch; ! float& roll = p.roll; ! bool& isVisible = p.isVisible; model->SetGenericMode(tc3DModel::USE_TRUE_MODEL); // not correct for child objects *************** *** 225,229 **** model->SetDistanceFromCamera(distanceFromCamera); ! if (model->IsSmokeEnabled()) { --- 187,192 ---- model->SetDistanceFromCamera(distanceFromCamera); ! if (!isVisible) return; ! if (model->IsSmokeEnabled()) { *************** *** 236,244 **** osg::Matrix::rotate(-osg::inRadians(yaw),0.0f,0.0f,1.0f)*osg::Matrix::translate(x,y,z) ; ! if (isVisible) ! { ! UpdaterCallbackVisitor cv(m); ! node->accept(cv); ! } } --- 199,207 ---- osg::Matrix::rotate(-osg::inRadians(yaw),0.0f,0.0f,1.0f)*osg::Matrix::translate(x,y,z) ; ! ! ! UpdaterCallbackVisitor cv(m); ! node->accept(cv); ! } *************** *** 253,256 **** --- 216,221 ---- { tcGameObject* gameObject = model->GetGameObj(); + tcSensorMapTrack* sensorTrack = model->GetSensorTrack(); + int displayMode = tcOptions::Get()->mn3DCheatMode; *************** *** 263,267 **** else { ! UpdateTrack(node); } --- 228,232 ---- else { ! wxASSERT(false); } *************** *** 271,274 **** --- 236,247 ---- NodeCallback::traverse(node,nv); } + else if (sensorTrack) + { + UpdateTrack(node); + UpdateAnimations(); + + // must call any nested node callbacks and continue subgraph traversal. + NodeCallback::traverse(node,nv); + } else // no game object available { Index: tc3DModel.cpp =================================================================== RCS file: /cvsroot/gcblue/gcb_wx/src/graphics/tc3DModel.cpp,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** tc3DModel.cpp 4 Mar 2005 00:46:16 -0000 1.24 --- tc3DModel.cpp 17 May 2005 00:20:40 -0000 1.25 *************** *** 35,38 **** --- 35,41 ---- #include "tcSound.h" #include "tcGenericDBObject.h" + #include "tcSensorMapTrack.h" + #include "tcSimState.h" + #include "tc3DViewer.h" #include "common/tinyxml.h" #include <osg/MatrixTransform> *************** *** 50,53 **** --- 53,58 ---- #endif + using Sensor::tcSensorMapTrack; + // started with CSP ModelProcessor class /** *************** *** 242,246 **** osg::ref_ptr<osg::Group> tc3DModel::world; ! osg::ref_ptr<osg::Node> tc3DModel::unknownAll; osg::ref_ptr<osg::Node> tc3DModel::unknownAir; --- 247,251 ---- osg::ref_ptr<osg::Group> tc3DModel::world; ! tc3DViewer* tc3DModel::viewer = 0; osg::ref_ptr<osg::Node> tc3DModel::unknownAll; osg::ref_ptr<osg::Node> tc3DModel::unknownAir; *************** *** 367,370 **** --- 372,437 ---- } + + void tc3DModel::GetLocationParams(LocationParams& p) + { + + if (gameObj) + { + if (!gameObj->parent) + { + tcKinematics* kin = &gameObj->mcKin; + p.yaw = kin->mfHeading_rad; + p.pitch = kin->mfPitch_rad; + p.roll = kin->mfRoll_rad; + p.x = viewer->LonToX(kin->mfLon_rad); + p.y = viewer->LatToY(kin->mfLat_rad); + p.z = kin->mfAlt_m; + p.isVisible = true; + } + else + { + tsRelativePosition *pos = &gameObj->rel_pos; + p.yaw = pos->yaw; + p.pitch = pos->pitch; + p.roll = pos->roll; + p.x = pos->dx; + p.y = pos->dy; + p.z = pos->dz; + p.isVisible = pos->isVisible; + if (!p.isVisible) + { + p.z = -50000.0f; + } + } + } + else if (sensorTrack) + { + // if object is close to camera, use predicted track for position + if (distanceFromCamera < 10e3) + { + tcTrack predicted; + sensorTrack->GetPrediction(predicted, tcSimState::Get()->GetTime()); + p.x = viewer->LonToX(predicted.mfLon_rad); + p.y = viewer->LatToY(predicted.mfLat_rad); + p.z = predicted.GetOrGuessAltitude(); + p.yaw = predicted.mfHeading_rad; + p.pitch = predicted.mfClimbAngle_rad; + p.roll = 0; + } + else + { + p.x = viewer->LonToX(sensorTrack->mfLon_rad); + p.y = viewer->LatToY(sensorTrack->mfLat_rad); + p.z = sensorTrack->GetOrGuessAltitude(); + p.yaw = sensorTrack->mfHeading_rad; + p.pitch = 0; + p.roll = 0; + } + + p.isVisible = true; + } + } + + osg::ref_ptr<osg::Node> tc3DModel::GetNode() { *************** *** 410,413 **** --- 477,485 ---- } + tcSensorMapTrack* tc3DModel::GetSensorTrack() const + { + return sensorTrack; + } + /** * @return true if smokeTrails object is active *************** *** 710,713 **** --- 782,786 ---- wxASSERT(modelTransform->getUpdateCallback() == NULL); gameObj = obj; + sensorTrack = 0; modelTransform->setUpdateCallback(new ObjectUpdater(this)); *************** *** 716,727 **** /** * Call outside of scene graph traversal */ void tc3DModel::UpdateEffects() { ! wxASSERT(gameObj); bool disableSmoke = ((smokeMode == tcParticleEffect::OFF) || ! (gameObj->parent) || (distanceFromCamera > 2000)); bool smokeDisabled = !IsSmokeEnabled(); --- 789,813 ---- /** + * Version to update using a sensor track + */ + void tc3DModel::SetupUpdate(tcSensorMapTrack* track) + { + wxASSERT(modelTransform->getUpdateCallback() == NULL); + gameObj = 0; + sensorTrack = track; + modelTransform->setUpdateCallback(new ObjectUpdater(this)); + + smokeTrails.SetGameObject(0); + } + + /** * Call outside of scene graph traversal */ void tc3DModel::UpdateEffects() { ! wxASSERT(gameObj || sensorTrack); bool disableSmoke = ((smokeMode == tcParticleEffect::OFF) || ! (gameObj && gameObj->parent) || (distanceFromCamera > 2000)); bool smokeDisabled = !IsSmokeEnabled(); *************** *** 750,753 **** --- 836,841 ---- */ tc3DModel::tc3DModel() + : gameObj(0), + sensorTrack(0) { } *************** *** 758,762 **** */ tc3DModel::tc3DModel(const tc3DModel* source) ! : distanceFromCamera(1e10) { static int addCount = 0; --- 846,852 ---- */ tc3DModel::tc3DModel(const tc3DModel* source) ! : distanceFromCamera(1e10), ! gameObj(source->gameObj), ! sensorTrack(source->sensorTrack) { static int addCount = 0; Index: tc3DViewer.cpp =================================================================== RCS file: /cvsroot/gcblue/gcb_wx/src/graphics/tc3DViewer.cpp,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** tc3DViewer.cpp 29 Apr 2005 18:52:53 -0000 1.15 --- tc3DViewer.cpp 17 May 2005 00:20:40 -0000 1.16 *************** *** 63,66 **** --- 63,68 ---- #include "tc3DModel.h" #include "tcParticleEffect.h" + #include "tcSensorTrackIterator.h" + *************** *** 1122,1126 **** tnPoolIndex nKey; unsigned int i = 0; ! while (i++ < nSize) { --- 1124,1130 ---- tnPoolIndex nKey; unsigned int i = 0; ! ! bool isServer = simState->IsMultiplayerServer(); ! while (i++ < nSize) { *************** *** 1128,1140 **** simState->maPlatformState.GetNextAssoc(poolpos,nKey,gameObj); wxASSERT(gameObj->model); // model should be created with gameObj ! if (gameObj->model->GetNumParents()==0) ! { ! worldObjects->addChild(gameObj->model->GetNode().get()); ! } ! UpdateChildModels(gameObj); } } /** * Calculate distance from camera to origin. If the --- 1132,1181 ---- simState->maPlatformState.GetNextAssoc(poolpos,nKey,gameObj); wxASSERT(gameObj->model); // model should be created with gameObj ! if (isServer || gameObj->IsOwnAlliance()) ! { ! if (gameObj->model->GetNumParents()==0) ! { ! worldObjects->addChild(gameObj->model->GetNode().get()); ! } ! UpdateChildModels(gameObj); ! } } } + + /** + * Load models for new sensor tracks + */ + void tc3DViewer::UpdateSensorModels(unsigned int alliance) + { + using Sensor::tcSensorTrackIterator; + tcSensorTrackIterator iter(alliance, 0xFFFF); + + for (iter.First();iter.NotDone();iter.Next()) + { + tcSensorMapTrack* track = iter.Get(); + + wxASSERT(track); + tc3DModel* model = track->GetModel(); + if (model) + { + if (model->GetNumParents() == 0) + { + worldObjects->addChild(model->GetNode().get()); + } + } + else + { + model = defaultSensorModel->Clone(); + track->SetModel(model); + model->SetupUpdate(track); + + worldObjects->addChild(model->GetNode().get()); + } + } + + } + /** * Calculate distance from camera to origin. If the *************** *** 1761,1764 **** --- 1802,1810 ---- UpdateModels(); + if (!simState->IsMultiplayerServer()) + { + UpdateSensorModels(tcUserInfo::Get()->GetOwnAlliance()); + } + UpdateCamera(); *************** *** 1849,1852 **** --- 1895,1899 ---- hookID = NULL_INDEX; ObjectUpdater::AttachViewer(this); + tc3DModel::AttachViewer(this); InitSceneView(pos, size); *************** *** 1898,1901 **** --- 1945,1952 ---- shakeAirCamera = tcOptions::Get()->OptionStringExists("ShakeAirCamera"); + defaultSensorModel = new tc3DModel(); + defaultSensorModel->LoadXml("unknown.xml"); + + // rootnode->addChild(tcSound::Get()->GetSoundRoot()); } *************** *** 1904,1906 **** --- 1955,1958 ---- { if (terrainManager) delete terrainManager; + if (defaultSensorModel) delete defaultSensorModel; } |