vrecko
virtual reality framework
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Hook.h
Go to the documentation of this file.
1 
8 #pragma once
9 
10 #include "poa.h"
11 
13 #include <vreckoUtils\Menu.h>
14 #include "PhysXManager.h"
15 
16 namespace APDYNAMICART
17 {
18 
19 class HookObject : public PoA
20 {
21 public:
22  HookObject(Controller* contr, Hoop* hoop, const osg::Vec3& position, double width);
23 
25  virtual void createMenuStructure( osg::ref_ptr<vreckoUtils::MenuBase> parentMenu ) const;
26  virtual int load( XERCES_CPP_NAMESPACE_QUALIFIER DOMNode* PoANode );
27  virtual void save( XERCES_CPP_NAMESPACE_QUALIFIER DOMDocument* Document, XERCES_CPP_NAMESPACE_QUALIFIER DOMNode* poaNode );
28  virtual void GUIItemClicked( const char* itemID );
29  virtual void GUISliderChanged( const char* sliderID, float sliderPos ) {};
30  virtual void pointed( bool pointed ) { _highlight->setHighlighting(pointed); }
31  virtual void setColor( osg::Vec4 newColour ) {};
32  virtual void update() {};
33 
35  Hoop* getParentHoop() const { return _hoop.get(); }
36 
37 protected:
39  osg::observer_ptr<Hoop> _hoop;
40  osg::ref_ptr<vreckoUtils::HighlightCallback> _highlight;
41 };
42 
43 class HoopTrackerCallback : public osg::NodeCallback
44 {
45 public:
46  HoopTrackerCallback(PoA* poa, const osg::Vec3& offset, double scale) {
47  _poa = poa;
48  _offset = offset;
49  _scale = scale;
50  }
51 
52  virtual void operator()(osg::Node* node, osg::NodeVisitor* nv) {
53  update(node, nv);
54  traverse(node, nv);
55  }
56 
57 protected:
58  void update( osg::Node* node, osg::NodeVisitor* nv ) {
59  if(!_poa.valid()) return;
60  //if(PhysXManager::get()->isRunning()) return;
61 
62  osg::MatrixTransform* hook = dynamic_cast<osg::MatrixTransform*>(node);
63  if(!hook) return;
64 
65  osg::Quat inv_rot = _poa->getMatrix().getRotate().inverse();
66  osg::Quat inv_DA_rot = PhysXManager::getDAMatrix().getRotate().inverse();
67  hook->setMatrix(osg::Matrix::scale(osg::Vec3(_scale, _scale, _scale)) *
68  osg::Matrix::rotate(inv_DA_rot) *
69  osg::Matrix::rotate(inv_rot) *
70  osg::Matrix::translate(_offset) *
71  _poa->getMatrix());
72  }
73 
74  osg::observer_ptr<PoA> _poa;
75  osg::Vec3 _offset;
76  double _scale;
77 };
78 
79 }