VR-Forces 4.1 Class Documentation
exampleVisualDefinitionSet

By using this example, you will learn:

The code fragments are from exampleVisualDefinitionSetPluginInit.cxx code.

  1. Register the menu items and indicator visualizer to display with the entity

void postInitialize(DtDe& de)
{
de.signal_preTick.disconnect(boost::bind(&postInitialize, _1));
DtStateVisualizerFactory::instance(de).addStateVisualizerCreator(de,
}
void init(DtDe& de)
{
// First make sure that the vrvCoreQt module is init'ed.
// Register the DtExampleMenu.
DtQtMenuAssembler::instance(de).registerMenu(new DtExampleMenu(de));
//Add example menu and example page item.
if(igApp)
{
makVrv::DtMenuPath::mainMenu("DtExampleMenu"));
makVrv::DtMenuPath::mainMenu("DtExampleMenu").item("DtCreateObjectMenuItem"));
DtQtMenuAssembler::instance(de).registerMenu(new DtExampleMenu(de));
DtQtMenuAssembler::instance(de).registerMenu(new DtCreateObjectMenuItem(de));

  1. Implement the functionality to create the entity from visualizers

void DtCreateObjectMenuItem::on_triggered()

  1. Create the indicator visualizer to display the information about the associated entity.

Building the Example

VR-Vantage includes pre-built versions of the example plug-in. To build it yourself, follow the instructions at Building VR-Vantage Examples, Applications, and Plug-ins.

Running the Example

This example is a plug-in. You can run it by running ./bin/exampleVisualDefinitionSet_stealth.bat (on Windows) or ./bin/exampleVisualDefinitionSet_stealth.sh (on Linux). For more information about running examples, please see Running Applications and Examples.

Example Source Files


DtExampleIndicatorVisualizer.cxx

/******************************************************************************
** Copyright (c) 2009 MAK Technologies, Inc.
** All rights reserved.
******************************************************************************/
/******************************************************************************
** $RCSfile: DtExampleIndicatorVisualizer.cxx,v $ $Revision: 1.43 $ $State: Exp $
******************************************************************************/
#include <boost/bind.hpp>
#include <matrix/geodCoord.h>
#include <stdio.h>
namespace makVrv
{
namespace vrvExampleVisualDefinitionSetPlugin
{
DtExampleIndicatorVisualizer::DtExampleIndicatorVisualizer(DtBaseConnection& simulation, DtStateListener& listener, int modelSet)
: DtEntityIndicatorVisualizer(simulation, listener, modelSet)
, myEntityListener(dynamic_cast<DtEntityStateListener*>(&listener))
{
myConnections.manageConnection(
myEntityListener->signal_velocitySet.connect(boost::bind(&DtExampleIndicatorVisualizer::setUpdateInfo,this, true)));
myConnections.manageConnection(
myEntityListener->signal_locationSet.connect(boost::bind(&DtExampleIndicatorVisualizer::setUpdateInfo,this, true)));
myConnections.manageConnection(
myEntityListener->signal_orientationSet.connect(boost::bind(&DtExampleIndicatorVisualizer::setUpdateInfo,this, true)));
}
DtExampleIndicatorVisualizer::~DtExampleIndicatorVisualizer()
{
}
void DtExampleIndicatorVisualizer::setUpdateInfo(bool b)
{
DtEntityIndicatorVisualizer::setUpdateInfo(b);
postUpdate();
}
DtUnicode DtExampleIndicatorVisualizer::generateInfoString() const
{
const char* entityFormatString =
"Speed :%.2f m/s\n" //Speed
"Heading :%.2f Deg\n" //Heading
"Location(x, y, z) :%.3f, %.3f, %.1f m above sea level\n";
std::string buffer;
buffer.resize(1024,'0');
int charsWritten = sprintf(const_cast<char*>(buffer.c_str()),entityFormatString,
sqrtf((float)myEntityListener->velocity().magnitudeSquared()),
DtRad2Deg(myEntityListener->orientation().psi()),
myEntityListener->location().x(), myEntityListener->location().y(), myEntityListener->location().z()
);
buffer.resize(charsWritten,'0');
return DtUnicode::fromAscii(buffer);
}
}
}

DtExampleIndicatorVisualizer.h

/******************************************************************************
** Copyright (c) 2009 MAK Technologies, Inc.
** All rights reserved.
******************************************************************************/
/******************************************************************************
** $RCSfile: DtExampleIndicatorVisualizer.h,v $ $Revision: 1.43 $ $State: Exp $
******************************************************************************/
#ifndef DtExampleIndicatorVisualizer_H_
#define DtExampleIndicatorVisualizer_H_
namespace makVrv
{
class DtEntityStateListener;
namespace vrvExampleVisualDefinitionSetPlugin
{
class DtExampleIndicatorVisualizer : public DtEntityIndicatorVisualizer
{
public:
DtExampleIndicatorVisualizer(DtBaseConnection& simulation, DtStateListener& listener, int modelSet);
virtual DtUnicode generateInfoString() const;
protected:
virtual void setUpdateInfo(bool);
protected:
DtEntityStateListener* myEntityListener;
};
typedef DtStateVisualizerCreatorTemplate<DtExampleIndicatorVisualizer> DtExampleIndicatorVisualizerCreator;
}
}
#endif

exampleVisualDefinitionSetPluginInit.cxx

/******************************************************************************
** Copyright (c) 2009 MAK Technologies, Inc.
** All rights reserved.
******************************************************************************/
/******************************************************************************
** $RCSfile: exampleVisualDefinitionSetPluginInit.cxx,v $ $Revision: 1.3 $ $State: Exp $
******************************************************************************/
#include "DtExampleMenu.h"
#include <vrvCore/DtDe.h>
{
return true;
}
namespace makVrv
{
namespace vrvExampleVisualDefinitionSetPlugin
{
void postInitialize(DtDe& de)
{
de.signal_preTick.disconnect(boost::bind(&postInitialize, _1));
}
void init(DtDe& de)
{
// First make sure that the vrvCoreQt module is init'ed.
// Register the DtExampleMenu.
DtQtMenuAssembler::instance(de).registerMenu(new DtExampleMenu(de));
//Add example menu and example page item.
if(igApp)
{
makVrv::DtMenuPath::mainMenu("DtExampleMenu"));
makVrv::DtMenuPath::mainMenu("DtExampleMenu").item("DtCreateObjectMenuItem"));
DtQtMenuAssembler::instance(de).registerMenu(new DtExampleMenu(de));
de.signal_preTick.connect(boost::bind(postInitialize, _1));
}
}
}
}

DtExampleMenu.cxx

/******************************************************************************
** Copyright (c) 2008 MAK Technologies, Inc.
** All rights reserved.
******************************************************************************/
/******************************************************************************
** $RCSfile: DtExampleMenu.cxx,v $ $Revision: 1.1 $ $State: Exp $
******************************************************************************/
#include "DtExampleMenu.h"
#include <vrvCore/DtDe.h>
#include <vrvCore/DtTerrainPatchObjectAgent.hpp>
#include <vlpi/entityType.h>
#include <QtGui/QMenu>
namespace makVrv
{
: DtMenu(de, std::string("DtExampleMenu"))
{
}
DtExampleMenu::~DtExampleMenu()
{
}
QMenu* DtExampleMenu::createMenu( DtDe&, QWidget* parent )
{
QMenu* menu = new QMenu(QMenu::tr("&Examples"),parent);
return menu;
}
: DtMenuItem(std::string("DtCreateObjectMenuItem"))
, myDe(de)
{
myRandomNumberGenerator.setSeed(time(0));
}
{
}
void DtCreateObjectMenuItem::on_aboutToShow()
{
myAction->setEnabled(myDe.scene().terrain().terrainPatches().size() != 0);
}
QAction* DtCreateObjectMenuItem::createAction( DtDe&, QWidget* parent )
{
myAction = new QAction(parent);
myAction->setText(DtMenuItem::tr("&Create"));
return myAction;
}
const DtUnicode* DtCreateObjectMenuItem::chooseRandomString(const std::vector<DtUnicode>& definitions)
{
size_t s = definitions.size();
if(s == 0)
{
return 0;
}
else if(s == 1)
{
return &(definitions.front());
}
else
{
int index = myRandomNumberGenerator.generate(0,s-1);
return &(definitions[index]);
}
}
DtUnicode DtCreateObjectMenuItem::modelDefFromVisualSet( const DtVisualizerDefinitionSet& set )
{
std::vector<const DtVisualizerDefinition*> defs;
set.findVisualizerDefinitions(DtBuiltInSchemas::theDtModelSchema().name(),defs);
if(defs.size() == 0)
{
return DtUnicode();
}
const DtVisualizerDefinition* visDef = defs.front();
if ( visDef )
{
const DtVisualizerAttribute* attr = visDef->findAttribute("modeldefinition");
const DtVisualizerAttributeStringVector* multiDefs = dynamic_cast<const DtVisualizerAttributeStringVector*>(attr);
if (multiDefs)
{
const DtUnicode* modelDefinition = chooseRandomString(multiDefs->value());
if(modelDefinition)
{
return *modelDefinition;
}
}
else
{
const DtVisualizerAttributeString* singleDef = dynamic_cast<const DtVisualizerAttributeString*>(attr);
if (singleDef)
{
return singleDef->value();
}
}
}
return DtUnicode();
}
void DtCreateObjectMenuItem::on_triggered()
{
// DtEntityTypeMapper::const_iterator iter;
//
// {
// DtReadSettingsLock<DtSharedSimulationSettings> settings(DtSharedSettingsManager::instance(myDe));
// const DtEntityTypeMapper& mapper = settings->entityTypeMapper();
//
// do
// {
// iter = mapper.begin();
//
// int iIndex = myRandomNumberGenerator.generate(0, 400);
//
// while ((iIndex > -1) && (iter != mapper.end()))
// {
// ++iter;
// --iIndex;
// }
// } while ((iter == mapper.end()) ||
// ((iter->first.kind() != 1) &&
// (iter->first.kind() != 3)));
// }
//
// //! iter->second references an Element Definition. Find the Correct modeldefinition for model set
// // 0, given that.
// int mode = myDe.driverManager().inputDriver().currentObserver()->observerMode();
// int modelSet = DtObserverModeManager::instance(myDe).modelSet(mode);
//
// DtUnicode modelDefinition;
//
// const DtVisualDefinitionSet* cachedSet = 0;
// {
// DtReadSettingsLock<DtEntityElementDictionary> visualSetManager(DtSharedSettingsManager::instance(myDe));
// cachedSet = visualSetManager->findVisualDefinitionSet(iter->second[0], 0);
// }
//
// if ( cachedSet )
// {
// modelDefinition = modelDefFromVisualSet( *cachedSet );
// }
// else
// {
// DtVisualDefinitionSet defaultSet;
// {
// DtWriteSettingsLock<DtEntityElementDictionary> visualSetManager(DtSharedSettingsManager::instance(myDe));
// defaultSet = visualSetManager->visualDefinitionSet(iter->second[0], 0);
// modelDefinition = modelDefFromVisualSet( defaultSet );
// }
// }
//
// //! First, create the root kinematic state. This is needed to be able to move and articulate the model
// DtVisualDefinitionSet set;
//
// DtVisualDefinition kinState("DtKinStateVisualizer");
// kinState.addVisualAttribute("rootobject", DtVisualAttributeBool(true));
// kinState.addVisualAttribute("mandatory", DtVisualAttributeBool(true));
// kinState.addVisualAttribute("type", DtVisualAttributeString("DtEntityKinStateVisualizer"));
// kinState.addVisualAttribute("name", DtVisualAttributeString("Main Object"));
// set.addVisualDefinition(kinState);
//
// //! Now, create the model and attach it to the kinematic state. Set the model definition
// //! to the random one selected from above
//
// //! If the kind is a lifeform, use the DI Guy model visualizer, else the articulated part model visualizer
//
// if (iter->first.kind() == 3)
// {
// DtVisualDefinition diGuy("DtModelVisualizer");
// diGuy.addVisualAttribute("mandatory", DtVisualAttributeBool(true));
// diGuy.addVisualAttribute("type", DtVisualAttributeString("DtEntityDIGuyStateVisualizer"));
// diGuy.addVisualAttribute("parent", DtVisualAttributeString("Main Object"));
// diGuy.addVisualAttribute("modeldefinition", DtVisualAttributeString(modelDefinition));
// diGuy.addVisualAttribute("visualType", DtVisualAttributeString("main_model"));
// set.addVisualDefinition(diGuy);
// }
// else
// {
// DtVisualDefinition articulated("DtModelVisualizer");
// articulated.addVisualAttribute("mandatory", DtVisualAttributeBool(true));
// articulated.addVisualAttribute("type", DtVisualAttributeString("DtEntityArticulatedStateModelVisualizer"));
// articulated.addVisualAttribute("parent", DtVisualAttributeString("Main Object"));
// articulated.addVisualAttribute("modeldefinition", DtVisualAttributeString(modelDefinition));
// articulated.addVisualAttribute("visualType", DtVisualAttributeString("main_model"));
// set.addVisualDefinition(articulated);
// }
//
// //! Finally, attach the indicator and information item to the object
// DtVisualDefinition indicator("DtIndicatorVisualizer");
// indicator.addVisualAttribute("type", DtVisualAttributeString("DtExampleIndicatorVisualizer"));
// indicator.addVisualAttribute("parent", DtVisualAttributeString("Main Object"));
// indicator.addVisualAttribute("mandatory", DtVisualAttributeBool(true));
// indicator.addVisualAttribute("modelDefinition", DtVisualAttributeString("entityInfo"));
// indicator.addVisualAttribute("modelDefinitionSchema", DtVisualAttributeString("WidgetTheme"));
// set.addVisualDefinition(indicator);
//
// //! Now, set a random location based on extent and altitiude at that extent
// DtTerrain::TerrainPatches::const_iterator curIter = myDe.scene().terrain().terrainPatches().begin();
// DtVector nw, ne, sw, se;
// DtTerrainPatchObject* tso = (*curIter)->agent()->findObject();
// if(tso != 0)
// {
// tso->getTerrainExtents(nw, ne, sw, se);
//
// //! Now that the set is defined, pass it to the entity facade for creation
// DtEntityFacade* facade = new DtEntityFacade(myDe.agentManager(), modelSet);
//
// facade->visualize(set);
//
// int x = myRandomNumberGenerator.generate(sw.x(), ne.x());
// int y = myRandomNumberGenerator.generate(sw.y(), ne.y());
//
// DtVector d(x, y, 0.);
//
// DtIntersector::DtIntersections intersections;
//
// DtCoordinateConverter* conv = myDe.sharedState().coordinateSystem().converter();
// conv->setupTopoFrame( d );
// DtVector up = conv->up( d );
// DtIntersectorResult res;
//
// DtIntersectorManager::instance(myDe).modelSetIntersector(modelSet).findNearestIntersectionToPoint(
// d.x(), d.y(), d.z(), up.x(), up.y(), up.z(), res,
// DtIntersector::SupportNodes );
//
// d.setZ(res.z);
//
// facade->setPosition(d);
// facade->setVisible(true);
//
// //! Now, attach to this new object
//
// std::vector<DtUniqueID> objects;
// objects.push_back(facade->uniqueID());
// makVrv::DtObserver* currentObserver = myDe.driverManager().inputDriver().currentObserver();
// currentObserver->setPrimaryAttachment(objects);
// }
}
}

DtExampleMenu.h

/******************************************************************************
** Copyright (c) 2008 MAK Technologies, Inc.
** All rights reserved.
******************************************************************************/
/******************************************************************************
** $RCSfile: DtExampleMenu.h,v $ $Revision: 1.1 $ $State: Exp $
******************************************************************************/
#pragma once
#include <vrvCoreQt/DtMenu.h>
class QAction;
namespace makVrv
{
class DtVisualizerDefinitionSet;
class DT_DLL_EXAMPLEVISUALDEFINITIONSETPLUGIN DtExampleMenu : public DtMenu
{
public:
DtExampleMenu(DtDe& de);
virtual ~DtExampleMenu();
virtual QMenu* createMenu(DtDe&, QWidget* parent);
};
public DtMenuItem
{
public:
virtual QAction* createAction( DtDe&, QWidget* parent );
virtual void on_triggered();
virtual void on_aboutToShow();
protected:
DtUnicode modelDefFromVisualSet( const DtVisualizerDefinitionSet& set );
const DtUnicode* chooseRandomString(const std::vector<DtUnicode>& definitions);
protected:
DtDe& myDe;
QAction* myAction;
//The random number generator to pick model to display
DtRandomNumberGenerator myRandomNumberGenerator;
};
}

Document ID: Generated on Tue Jan 29 18:21:16 EST 2013 from SVN revision 123193
Copyright © 2005-2013 VT MÄK Inc. All Rights Reserved (www.mak.com)