VR-Forces 4.8 Class Documentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
Human Set Controller

This subclass of the DtHumanSetController registers for the new DtSetSpeedAndHeadingRequest and sets the appropriate values into the VRF state repository.


Header file:

/*******************************************************************************
** Copyright (c) 2010 MAK Technologies, Inc.
** All rights reserved.
*******************************************************************************/

//\file myHumanSetController.h
//\brief MyHumanSetController; handles new DtSetSpeedAndHeadingRequest


#pragma once

#include "vrfmodel/humanSetController.h"
#include "vrfobjcore/simRadio.h"

namespace vrfAddSetExample
{
   //\brief MyLocalEntitySetController is a controller that handles new
   //DtSetSpeedAndHeadingRequest. It replaces the existing DtHumanSetController.
   //
   //Uses Descriptor Type: DtComponentDescriptor

   class MyHumanSetController : public DtHumanSetController
   {

   public:

      //\copydoc DtSimComponent(const DtString&,DtVrfObject*,DtSimManager*,
      //DtComponentDescriptor*,DtReaderWriterRegistry* parentRegistry)
   MyHumanSetController(const DtString& name, 
      DtVrfObject* owner,
      DtSimManager* simManager, 
      DtComponentDescriptor* desc = 0,
      DtReaderWriterRegistry* parentRegistry = 0);

      //destructor
   virtual ~MyHumanSetController();

   virtual void processSetSpeedAndHeading(DtSimMessage * msg);

   static void setSpeedAndHeadingCallback(DtSimMessage * msg, void * usrData);

      //\copydoc DtSimComponent(const DtString&,DtVrfObject*,DtSimManager*,
      //DtComponentDescriptor*,DtReaderWriterRegistry* parentRegistry)
      //\return New instance of this class.
   static DtSimComponent * creator(const DtString& name, 
      DtVrfObject* owner,
      DtSimManager* simManager, 
      DtComponentDescriptor* desc = 0,
      DtReaderWriterRegistry* parentRegistry = 0);

   private:
      //Default constructor; should not be called.  Here because the compiler
      //will generate an unprotected one otherwise.
   MyHumanSetController();

      //copy constructor
   MyHumanSetController(const MyHumanSetController& orig);

      //assignment operator
   const MyHumanSetController & operator=(const 
      MyHumanSetController& orig);


   protected:
      //Overrides this so it can register its interest in the set commands.
   virtual void setRadio(DtSimRadio * radio);
   };
}


Implementation:

/*******************************************************************************
** Copyright (c) 2010 MAK Technologies, Inc.
** All rights reserved.
*******************************************************************************/

//
//File:        myHumanSetController.cxx
//
//Class:       MyHumanSetController
//

#include "myHumanSetController.h"
#include "vrfcore/simManager.h"
#include "vrfobjcore/vrfObjectManager.h"

#include "vrfobjcore/simComponentTypes.h"
#include "vrfobjcore/simRadio.h"
#include "vrftasks/setDataTypes.h"
#include "vrfobjcore/setDataManager.h"
#include "vrfobjcore/vrfMovingObjectStateRepository.h"

#include "vrfmsgs/setDataRequestMessage.h"
#include "setSpeedAndHeading.h"

namespace vrfAddSetExample
{
   //constructor
   MyHumanSetController::MyHumanSetController(
   const DtString& name, 
   DtVrfObject* owner,
   DtSimManager* simManager, 
   DtComponentDescriptor* desc, 
   DtReaderWriterRegistry* parentRegistry) :
   DtHumanSetController(name, owner, simManager, desc, parentRegistry)
   {
   }

   //destructor
   MyHumanSetController::~MyHumanSetController()
   {
   entity()->setDataManager()->removeSetDataCallback(DtSetSpeedAndHeadingType, 
      setSpeedAndHeadingCallback, (void *) this);
   }

   void MyHumanSetController::processSetSpeedAndHeading(DtSimMessage* msg)
   {
   DtSetDataRequestMessage* drMsg = static_cast<DtSetDataRequestMessage*>(msg);
   DtSetSpeedAndHeadingRequest* req = 
      static_cast<DtSetSpeedAndHeadingRequest*>(drMsg->setDataRequest());
   DtVrfMovingObjectStateRepository* movingSR = 
      DtVrfMovingObjectStateRepository::isVrfMovingObjectStateRepository(
      localStateRepository());

   if (movingSR)
   {
      movingSR->setOrderedSpeed(req->speed());
   }

   //Make sure that the required terrain data is available. In most cases
   //rotating an entity would not cause its support points to be on different
   //pages but this is an important measure to insure that no blocking terrain
   //calls are made.
   bool dataAvailable = false;
   myLocalEntity->place(req->heading(), &dataAvailable, true);
   if (dataAvailable)
   {
      objectConsoleInfo() << "Setting heading: " << req->heading() << 
         " and speed: " << req->speed() << std::endl;
      setHeading(req->heading());
   }
   else
   {
      //Queue the set heading request for processing by
      //DtLocalEntitySetController::tick once the terrain data is available.
      myProcessState->setPendingSetHeadingRequest(true);
      myProcessState->setPendingSetHeading(req->heading());
   }
   }

   void MyHumanSetController::setSpeedAndHeadingCallback(DtSimMessage* msg, 
   void* usrData)
   {
   ((MyHumanSetController *)usrData)->processSetSpeedAndHeading(msg);
   }

   //overrides this so it can register it's interest in the set commands
   void MyHumanSetController::setRadio(DtSimRadio* radio)
   {
   DtHumanSetController::setRadio(radio);

   entity()->setDataManager()->addSetDataProcessorCallback(
      DtSetSpeedAndHeadingType, setSpeedAndHeadingCallback, (void*)this);
   }

   DtSimComponent* MyHumanSetController::creator(
   const DtString& name, 
   DtVrfObject* owner,
   DtSimManager* simManager, 
   DtComponentDescriptor* desc, 
   DtReaderWriterRegistry* parentRegistry)
   {
   return new MyHumanSetController(name, owner, simManager, desc,
      parentRegistry);
   }

}

Document ID: Generated on Thu Aug 27 10:56:05 EDT 2020 from SVN revision 217100
Copyright © 2005-2020 MAK Technologies. All Rights Reserved (www.mak.com)