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.
#include <matrix/vlVector.h>
namespace makVrv
{
namespace exampleTacticalGraphics
{
enum ModelSets
{
ModelSet_3D = 0,
ModelSet_3DColorized = 1,
ModelSet_2DIcons = 5,
};
static DtVector theSimpleLineVertices[] = {
DtVector(2811.45, 3429.92, 10.0), DtVector(2837.62, 3429.92, 10.0),
DtVector(2852.64, 3445.10, 10.0), DtVector(2877.22, 3445.53, 10.0)
};
static DtVector theAirAxisVertices[] = {
DtVector(624.67, 914.33, 1000.0), DtVector(1438.62, 928.41, 1212.05),
DtVector(2418.68, 1204.80, 1125.62)
};
static DtVector theLineWithArrow[] = {
DtVector(1286.91, 1040.0, 190.0), DtVector(1454.0, 1040.0, 190.0)
};
static DtVector theFortifiedLine[] = {
DtVector(2170.30, 1312.0, 119.0), DtVector(2217.71, 1217.85, 122.53),
DtVector(2315.01, 1211.53, 124.79)
};
static DtVector theSimpleAreaVertices[] = {
DtVector(1563.0, 943.0, 10.0), DtVector(1563.0, 895.0, 10.0),
DtVector(1617.0, 895.0, 10.0), DtVector(1617.0, 943.0, 10.0)
};
static DtVector theFortifiedAreaVertices[] = {
DtVector(1572.0, 1375.0, 260.0), DtVector(1572.0, 1320.0, 260.0),
DtVector(1652.0, 1320.0, 260.0), DtVector(1652.0, 1375.0, 260.0)
};
static DtVector thePatternFilledAreaVertices[] = {
DtVector(3000.0, 3700.0, 10.0), DtVector(3000.0, 3600.0, 10.0),
DtVector(3050.0, 3600.0, 10.0), DtVector(3050.0, 3700.0, 10.0)
};
static bool is2D(int modelSet)
{
return ( modelSet == ModelSet_2DIcons );
}
static std::vector<DtVector> convertToPointVector(int numVertices, DtVector* pointVector)
{
int i;
for (i = 0; i < numVertices; i++)
{
points.push_back(pointVector[i]);
}
}
: makVrv::DtDriver( am, "DtExampleSymbolDriver" )
, myCreateFacades(true)
{
}
DtExampleTacticalGraphicsDriver::~DtExampleTacticalGraphicsDriver()
{
DtExampleTacticalGraphicsDriver::onStop();
}
const std::string& DtExampleTacticalGraphicsDriver::className()
const
{
static std::string name =
"DtExampleTacticalGraphicsDriver";
}
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<DtLineFacadeInterface*>::iterator lineIter = myLineFacades.begin();
while (lineIter != myLineFacades.end())
{
delete *lineIter;
++lineIter;
}
myLineFacades.clear();
std::vector<DtAreaFacadeInterface*>::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;
}
DtLineFacadeInterface* DtExampleTacticalGraphicsDriver::createSimpleLineFacade(int modelSet, std::vector<DtVector> pointVector)
{
DtLineFacadeInterface* 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;
}
DtLineFacadeInterface* DtExampleTacticalGraphicsDriver::createAirAxisLine(int modelSet, std::vector<DtVector> pointVector)
{
DtLineFacadeInterface* lineFacadeInterface = createSimpleLineFacade(modelSet, pointVector);
lineFacadeInterface->setArrowSize(25.0);
return lineFacadeInterface;
}
DtLineFacadeInterface* DtExampleTacticalGraphicsDriver::createFortifiedLine(int modelSet, std::vector<DtVector> pointVector)
{
DtLineFacadeInterface* lineFacadeInterface = createSimpleLineFacade(modelSet, pointVector);
lineFacadeInterface->setModelDefinition("fort");
lineFacadeInterface->setColor(1.0f, 0.0f, 0.0f, 0.777f);
return lineFacadeInterface;
}
DtLineFacadeInterface* DtExampleTacticalGraphicsDriver::createLineWithArrow(int modelSet, std::vector<DtVector> pointVector)
{
DtLineFacadeInterface* 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,
DtLineFacadeInterface* lineFacade )
{
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,
DtAreaFacadeInterface* areaFacade)
{
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)
{
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() );
}
}
}
DtAreaFacadeInterface* DtExampleTacticalGraphicsDriver::createSimpleAreaFacade(int modelSet, std::vector<DtVector> pointVector)
{
DtAreaFacadeInterface* 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;
}
DtAreaFacadeInterface* DtExampleTacticalGraphicsDriver::createFortifiedArea(int modelSet, std::vector<DtVector> pointVector)
{
DtAreaFacadeInterface* areaFacadeInterface = createSimpleAreaFacade(modelSet, pointVector);
areaFacadeInterface->setModelDefinition("fort");
areaFacadeInterface->setColor(0.0f, 1.0f, 0.0f, 0.777f);
return areaFacadeInterface;
}
DtAreaFacadeInterface* DtExampleTacticalGraphicsDriver::createPatternFilledArea(int modelSet, std::vector<DtVector> pointVector)
{
DtAreaFacadeInterface* 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();
}
}
}