This example demonstrates how to tactical graphics to the scene in a PVD application.
The example creates a DtExampleTacticalGraphicsDriver for creating line and area symbols that will be displayed on the Makland database.
The driver creates the symbol by waiting for the first application tick, then creating appropriate 2D or 3D line facades according to the model set realized. For the purposes of this example, only 2D (projected) areas are created.
This example is a plug-in. You can run it by running ./bin64/exampleAccessory_stealth.bat (on Windows from cmd.exe) or ./bin64/exampleAccessory_stealth.sh (on Linux). For more information about running examples, please see Running Applications and Examples.
#include <matrix/vlVector.h>
namespace makVrv
{
namespace exampleTacticalGraphics
{
enum ModelSets
{
ModelSet_3D = 0,
ModelSet_3DColorized = 1,
ModelSet_2DIcons = 5,
};
static DtVector theSimpleLineVertices[] = {
};
static DtVector theAirAxisVertices[] = {
};
};
};
static DtVector theSimpleAreaVertices[] = {
};
static DtVector theFortifiedAreaVertices[] = {
};
static DtVector thePatternFilledAreaVertices[] = {
};
static bool is2D(int modelSet)
{
return ( modelSet == ModelSet_2DIcons );
}
static std::vector<DtVector> convertToPointVector(
int numVertices,
DtVector* pointVector)
{
int i;
std::vector<DtVector> points;
for (i = 0; i < numVertices; i++)
{
points.push_back(pointVector[i]);
}
return points;
}
: makVrv::DtDriver( am, "DtExampleSymbolDriver" )
, myCreateFacades(true)
{
}
DtExampleTacticalGraphicsDriver::~DtExampleTacticalGraphicsDriver()
{
DtExampleTacticalGraphicsDriver::onStop();
}
const std::string& DtExampleTacticalGraphicsDriver::className() const
{
static std::string name = "DtExampleTacticalGraphicsDriver";
return name;
}
bool DtExampleTacticalGraphicsDriver::onStart()
{
DtScene& sceneDriver = myAgentManager.de().scene();
std::string maklandPath = myAgentManager.de().dePathConfiguration().userPath();
maklandPath += "/terrains/Makland.mtf";
sceneDriver.loadTerrain( maklandPath );
DtTacticalGraphicOverlayManager& tgOverlayMgr =
DtTacticalGraphicOverlayManager::instance( myAgentManager.de() );
tgOverlayMgr.signal_tacticalGraphicVisibilityChanged.connect(
boost::bind(
&DtExampleTacticalGraphicsDriver::slot_tacticalGraphicVisibilityChanged, this, _1, _2 ) );
return true;
}
bool DtExampleTacticalGraphicsDriver::onStop()
{
std::vector<DtLineFacadeBase*>::iterator lineIter = myLineFacades.begin();
while (lineIter != myLineFacades.end())
{
delete *lineIter;
++lineIter;
}
myLineFacades.clear();
std::vector<DtAreaFacadeBase*>::iterator areaIter = myAreaFacades.begin();
while (areaIter != myAreaFacades.end())
{
delete *areaIter;
++areaIter;
}
myAreaFacades.clear();
DtTacticalGraphicOverlayManager& tgOverlayMgr =
DtTacticalGraphicOverlayManager::instance( myAgentManager.de() );
tgOverlayMgr.signal_tacticalGraphicVisibilityChanged.disconnect(
boost::bind(
&DtExampleTacticalGraphicsDriver::slot_tacticalGraphicVisibilityChanged, this, _1, _2 ) );
return true;
}
DtLineFacadeBase* DtExampleTacticalGraphicsDriver::createSimpleLineFacade(int modelSet, std::vector<DtVector> pointVector)
{
DtLineFacadeBase* lineFacadeInterface = 0;
if (is2D(modelSet))
{
lineFacadeInterface = new Dt2DLineFacade(myAgentManager, modelSet, 0, false);
}
else
{
lineFacadeInterface = new Dt3DLineFacade(myAgentManager, modelSet, 0, false);
}
lineFacadeInterface->setLineWidth(4.0);
lineFacadeInterface->setColor(1.0f, 0.0f, 0.0f, 0.777f);
lineFacadeInterface->setSolid(true);
lineFacadeInterface->setPoints(pointVector);
return lineFacadeInterface;
}
DtLineFacadeBase* DtExampleTacticalGraphicsDriver::createAirAxisLine(int modelSet, std::vector<DtVector> pointVector)
{
DtLineFacadeBase* lineFacadeInterface = createSimpleLineFacade(modelSet, pointVector);
lineFacadeInterface->setArrowSize(25.0);
return lineFacadeInterface;
}
DtLineFacadeBase* DtExampleTacticalGraphicsDriver::createFortifiedLine(int modelSet, std::vector<DtVector> pointVector)
{
DtLineFacadeBase* lineFacadeInterface = createSimpleLineFacade(modelSet, pointVector);
lineFacadeInterface->setModelDefinition("fort");
lineFacadeInterface->setColor(1.0f, 0.0f, 0.0f, 0.777f);
return lineFacadeInterface;
}
DtLineFacadeBase* DtExampleTacticalGraphicsDriver::createLineWithArrow(int modelSet, std::vector<DtVector> pointVector)
{
DtLineFacadeBase* lineFacadeInterface = createSimpleLineFacade(modelSet, pointVector);
lineFacadeInterface->setSegmentEndArrow(pointVector.size() - 2, true);
lineFacadeInterface->setArrowSize(25.0);
return lineFacadeInterface;
}
void DtExampleTacticalGraphicsDriver::createOverlays()
{
DtTacticalGraphicOverlayManager::instance( myAgentManager.de() ).addOverlay( "Lines" );
DtTacticalGraphicOverlayManager::instance( myAgentManager.de() ).addOverlay( "Areas" );
DtTacticalGraphicOverlayManager::instance( myAgentManager.de() ).addOverlay( "Symbols" );
}
void DtExampleTacticalGraphicsDriver::registerTacticalGraphic( const std::string& displayName,
DtLineFacadeBase* lineFacade )
{
std::string prefix = "";
switch( lineFacade->modelSet() )
{
case ModelSet_3D:
prefix = "3D ";
break;
case ModelSet_3DColorized:
prefix = "XR ";
break;
case ModelSet_2DIcons:
prefix = "2D ";
break;
}
DtTacticalGraphicOverlay* overlay = DtTacticalGraphicOverlayManager::instance( myAgentManager.de() ).findOverlay("Lines");
reportElementCreated(lineFacade->uniqueId(), (
DtUniqueID)0, DtElementEntry::GraphicShape);
reportElementAttribute(lineFacade->uniqueId(), name);
overlay->addGraphic( lineFacade->uniqueId() );
}
void DtExampleTacticalGraphicsDriver::registerTacticalGraphic( const std::string& displayName,
DtAreaFacadeBase* areaFacade)
{
std::string prefix = "";
switch( areaFacade->modelSet() )
{
case ModelSet_3D:
prefix = "3D ";
break;
case ModelSet_3DColorized:
prefix = "XR ";
break;
case ModelSet_2DIcons:
prefix = "2D ";
break;
}
DtTacticalGraphicOverlay* overlay = DtTacticalGraphicOverlayManager::instance( myAgentManager.de() ).findOverlay("Areas");
reportElementCreated(areaFacade->uniqueId(), (
DtUniqueID)0, DtElementEntry::GraphicShape);
reportElementAttribute( areaFacade->uniqueId(), name );
overlay->addGraphic( areaFacade->uniqueId() );
}
void DtExampleTacticalGraphicsDriver::registerTacticalGraphic( const std::string& displayName, DtEntity2dFacade* sym2525bFacade)
{
std::string prefix = "";
switch( sym2525bFacade->modelSet() )
{
case ModelSet_3D:
prefix = "3D ";
break;
case ModelSet_3DColorized:
prefix = "XR ";
break;
case ModelSet_2DIcons:
prefix = "2D ";
break;
}
DtTacticalGraphicOverlay* overlay = DtTacticalGraphicOverlayManager::instance( myAgentManager.de() ).findOverlay("Symbols");
reportElementCreated(sym2525bFacade->uniqueId(), (
DtUniqueID)0, DtElementEntry::GraphicPoint);
reportElementAttribute( sym2525bFacade->uniqueId(), name );
overlay->addGraphic( sym2525bFacade->uniqueId() );
}
void DtExampleTacticalGraphicsDriver::slot_tacticalGraphicVisibilityChanged(
{
for( int lCount = 0; lCount < myLineFacades.size(); ++lCount )
{
if ( myLineFacades[lCount]->uniqueId() == id )
{
myLineFacades[lCount]->setVisible( flag );
return;
}
}
for( int aCount = 0; aCount < myAreaFacades.size(); ++aCount )
{
if ( myAreaFacades[aCount]->uniqueId() == id )
{
myAreaFacades[aCount]->setVisible( flag );
return;
}
}
}
void DtExampleTacticalGraphicsDriver::createLineFacades()
{
DtModelSetRealizationManager::ModelSetRealizations::const_iterator iter;
DtModelSetRealizationManager::ModelSetRealizations::const_iterator end;
iter = myAgentManager.de().sharedState().modelSetRealizationManager().modelSetRealizations().begin();
end = myAgentManager.de().sharedState().modelSetRealizationManager().modelSetRealizations().end();
for ( ; iter != end; ++iter )
{
if ( iter->second )
{
myLineFacades.push_back(
createSimpleLineFacade(iter->first,
convertToPointVector(
sizeof(theSimpleLineVertices) /
sizeof(
DtVector), &theSimpleLineVertices[0])));
registerTacticalGraphic( "Simple Line", myLineFacades.back() );
myLineFacades.push_back(
createAirAxisLine(iter->first,
convertToPointVector(
sizeof(theAirAxisVertices) /
sizeof(
DtVector), &theAirAxisVertices[0])));
registerTacticalGraphic( "Air Axis", myLineFacades.back() );
myLineFacades.push_back(
createLineWithArrow(iter->first,
convertToPointVector(
sizeof(theLineWithArrow) /
sizeof(
DtVector), &theLineWithArrow[0])));
registerTacticalGraphic( "Arrow", myLineFacades.back() );
myLineFacades.push_back(
createFortifiedLine(iter->first,
convertToPointVector(
sizeof(theFortifiedLine) /
sizeof(
DtVector), &theFortifiedLine[0])));
registerTacticalGraphic( "Fortified Line", myLineFacades.back() );
}
}
}
DtAreaFacadeBase* DtExampleTacticalGraphicsDriver::createSimpleAreaFacade(int modelSet, std::vector<DtVector> pointVector)
{
DtAreaFacadeBase* areaFacadeInterface = 0;
areaFacadeInterface = new Dt2DAreaFacade(myAgentManager, modelSet, 0, false);
areaFacadeInterface->setLineWidth(4.0);
areaFacadeInterface->setColor(0.0f, 1.0f, 0.0f, 0.777f);
areaFacadeInterface->setPoints(pointVector);
return areaFacadeInterface;
}
DtAreaFacadeBase* DtExampleTacticalGraphicsDriver::createFortifiedArea(int modelSet, std::vector<DtVector> pointVector)
{
DtAreaFacadeBase* areaFacadeInterface = createSimpleAreaFacade(modelSet, pointVector);
areaFacadeInterface->setModelDefinition("fort");
areaFacadeInterface->setColor(0.0f, 1.0f, 0.0f, 0.777f);
return areaFacadeInterface;
}
DtAreaFacadeBase* DtExampleTacticalGraphicsDriver::createPatternFilledArea(int modelSet, std::vector<DtVector> pointVector)
{
DtAreaFacadeBase* areaFacadeInterface = createSimpleAreaFacade(modelSet, pointVector);
return areaFacadeInterface;
}
void DtExampleTacticalGraphicsDriver::createAreaFacades()
{
DtModelSetRealizationManager::ModelSetRealizations::const_iterator iter;
DtModelSetRealizationManager::ModelSetRealizations::const_iterator end;
iter = myAgentManager.de().sharedState().modelSetRealizationManager().modelSetRealizations().begin();
end = myAgentManager.de().sharedState().modelSetRealizationManager().modelSetRealizations().end();
for ( ; iter != end; ++iter )
{
if ( iter->second )
{
myAreaFacades.push_back(
createSimpleAreaFacade(iter->first,
convertToPointVector(
sizeof(theSimpleAreaVertices) /
sizeof(
DtVector), &theSimpleAreaVertices[0])));
registerTacticalGraphic( "Simple Area", myAreaFacades.back() );
myAreaFacades.push_back(
createFortifiedArea(iter->first,
convertToPointVector(
sizeof(theFortifiedAreaVertices) /
sizeof(
DtVector), &theFortifiedAreaVertices[0])));
registerTacticalGraphic( "Fortified Area", myAreaFacades.back() );
myAreaFacades.push_back(
createPatternFilledArea(iter->first,
convertToPointVector(
sizeof(thePatternFilledAreaVertices) /
sizeof(
DtVector), &thePatternFilledAreaVertices[0])));
registerTacticalGraphic( " Filled Area", myAreaFacades.back() );
}
}
}
bool DtExampleTacticalGraphicsDriver::onTick()
{
if (myCreateFacades)
{
myCreateFacades = false;
createOverlays();
createLineFacades();
createAreaFacades();
float friendlyColor[4] = {0.5f, 224.0f / 255.0f, 1.0f, 0.8f };
DtEntity2dFacade *sym2525bFacade = new DtEntity2dFacade( myAgentManager, 0, 0, false );
sym2525bFacade->setPosition(
DtVector( 624.67, 914.33, 1000.0 ) );
sym2525bFacade->setIconModelDefinition("2525bIcons");
sym2525bFacade->setOutlineGlyph(DtUnicodeChar((wchar_t)0x40C6));
sym2525bFacade->setFillGlyph(DtUnicodeChar((wchar_t)0x0022));
sym2525bFacade->setFillColor( friendlyColor );
my2525bFacades.push_back(sym2525bFacade);
registerTacticalGraphic( "FA-18 Hornet", sym2525bFacade );
sym2525bFacade = new DtEntity2dFacade( myAgentManager, 1, 0, false );
sym2525bFacade->setPosition(
DtVector( 624.67, 914.33, 1000.0 ) );
sym2525bFacade->setIconModelDefinition("2525bIcons");
sym2525bFacade->setOutlineGlyph(DtUnicodeChar((wchar_t)0x40C6));
sym2525bFacade->setFillGlyph(DtUnicodeChar((wchar_t)0x0022));
sym2525bFacade->setFillColor( friendlyColor );
my2525bFacades.push_back(sym2525bFacade);
registerTacticalGraphic( "FA-18 Hornet", sym2525bFacade );
sym2525bFacade = new DtEntity2dFacade( myAgentManager, 5, 0, false );
sym2525bFacade->setPosition(
DtVector( 624.67, 914.33, 1000.0 ) );
sym2525bFacade->setIconModelDefinition("2525bIcons");
sym2525bFacade->setOutlineGlyph(DtUnicodeChar((wchar_t)0x40C6));
sym2525bFacade->setFillGlyph(DtUnicodeChar((wchar_t)0x0022));
sym2525bFacade->setFillColor( friendlyColor );
my2525bFacades.push_back(sym2525bFacade);
registerTacticalGraphic( "FA-18 Hornet", sym2525bFacade );
}
return true;
}
void DtExampleTacticalGraphicsDriver::slot_displayEngineAdded( const DtDeRecord& igRecord )
{
stop();
start();
}
}
}