Overview
This example shows how to create an agent for an object and create an instance of the agent in a driver. It creates a distributed object, DtExampleObject, that loads a model and rotates it using an agent.
Expected Result
Distributed Object Result
Example details
To fully appreciate this example, use the Distributed Code Generator to generate the agent classes.
The object is defined as follows:
class DtExampleObject
{
public:
virtual ~DtExampleObject();
void loadModel(const std::string& filename);
void setRotationAngle(double rotationAngleInDegrees);
To generate the agent files:
-
Run ./bin64/dcgen.exe. The Distributed Code Generator opens.
-
Choose Files -> Open. An Open dialog box opens.
-
Select ./examples/exampleDistributedObject/DtExampleObject.ocdx.
-
Examine the object class definition and compare it to the object code to see how functions for the agent were chosen.
-
Choose Build -> Set Output Directory.
-
Specify a directory for the output files. Be careful not to overwrite the files shipped with VR-Vantage.
-
Choose Build -> Generate Files. (You can also generate files from the command line or from within your IDE. For details, please see VR-Vantage Developer's Guide.)
To add the agent to the driver:
Drivers get ticked every frame. In our driver's tick method, we will tell the agent to rotate to a certain degree:
Building the Example
VR-Vantage includes pre-built versions of the example application. To build it yourself, follow the instructions at Building VR-Vantage Examples, Applications, and Plug-ins.
Running the Example
This example is a plugin. You can run it by running ./bin64/exampleDistributedObject_stealth.bat (on Windows) or ./bin64/exampleDistributedObject_stealth.sh (on Linux). For more information about running examples, please see Running Applications and Examples.
Example Source Files
DtExampleObject.h
#ifndef DtExampleObject_H_
#define DtExampleObject_H_
#include <osg/PositionAttitudeTransform>
#include <string>
namespace makVrv
{
class DtExampleObject
{
public:
protected:
osg::ref_ptr<osg::PositionAttitudeTransform>
myPat;
};
}
#endif
DtExampleObject.cxx
#include <osg/Group>
#include <osg/Node>
#include <osgDB/ReadFile>
#include <osg/ShapeDrawable>
#include <osg/Geode>
namespace makVrv
{
: myDe(de)
, myPat(0)
{
}
DtExampleObject::~DtExampleObject()
{
if (myPat)
{
myPat->removeChild(0,1);
}
myPat = 0;
}
void DtExampleObject::loadModel( const std::string& filename )
{
osg::ref_ptr<osg::Node> modelNode = osgDB::readNodeFile(filename);
myPat = new osg::PositionAttitudeTransform();
myPat->addChild(modelNode.get());
myPat->setPosition(osg::Vec3(0.0,45.0,-5.0));
const DtModelSetRealizationManager& manager = myDe.sharedState().modelSetRealizationManager();
DtModelSetRealizationManager::ModelSetRealizations::const_iterator iter = manager.modelSetRealizations().begin();
DtModelSetRealizationManager::ModelSetRealizations::const_iterator end = manager.modelSetRealizations().end();
while (iter != end)
{
if (iter->second)
{
((DtOsgRenderer&)myDe.renderer()).addNodeToRoot(myPat.get(),
DtOsgRenderer::visualizerTypeRoot( iter->first, 0 ) );
}
++iter;
}
}
void DtExampleObject::setRotationAngle( double rotationAngleInDegrees )
{
myPat->setAttitude(osg::Quat(
osg::DegreesToRadians(0.0), osg::Vec3d(1.0, 0.0, 0.0),
osg::DegreesToRadians(0.0), osg::Vec3d(0.0, 1.0, 0.0),
osg::DegreesToRadians(rotationAngleInDegrees), osg::Vec3d(0.0, 0.0, 1.0)));
}
}
exampleDistributedObjectPlugin.cxx
#include "DtExampleObjectAgent.hpp"
#include <functional>
using namespace makVrv;
static vrvSignalsLib::connection postInitializeConnection;
{
public:
, myAgent(0)
, myRotationDegree(0.0)
{
setAutoStart(true);
}
{
if(myAgent)
delete myAgent;
myAgent = 0;
}
virtual const std::string& className() const
{
static std::string name = "DtExampleDriver";
return name;
}
virtual bool onStart()
{
myAgent = DtExampleObjectAgent::create(myAgentManager);
std::string sharedDataPath = myAgentManager.de().dePathConfiguration().sharedDataPath();
myAgent->loadModel( sharedDataPath + "/ModelData/Vehicles/Surface/FishingVessel/FishingVessel.medf");
return true;
}
virtual bool onStop()
{
if (myAgent)
{
delete myAgent;
myAgent = 0;
}
return true;
}
virtual bool onTick()
{
myAgent->setRotationAngle(myRotationDegree);
myRotationDegree += 0.15;
if(myRotationDegree > 360.0)
{
myRotationDegree = 0.0;
}
return true;
}
protected:
virtual void slot_displayEngineAdded(
const DtDeRecord& igRecord)
{
{
stop();
start();
}
}
DtExampleObjectAgent* myAgent;
double myRotationDegree;
};
{
{
}
}
{
return true;
}
{
postInitializeConnection.disconnect();
}
[<< Examples] [Home] [Top of Page]