UpdateUniform 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #ifndef OSGANIMATION_UPDATE_UNIFORM
  2. #define OSGANIMATION_UPDATE_UNIFORM 1
  3. #include <osgAnimation/AnimationUpdateCallback>
  4. #include <osgAnimation/Export>
  5. #include <osg/NodeVisitor>
  6. #include <osg/Uniform>
  7. namespace osgAnimation
  8. {
  9. template <typename T>
  10. class UpdateUniform : public AnimationUpdateCallback<osg::UniformCallback>
  11. {
  12. protected:
  13. osg::ref_ptr< TemplateTarget<T> > _uniformTarget;
  14. public:
  15. UpdateUniform(const std::string& aName = "")
  16. : AnimationUpdateCallback<osg::UniformCallback>(aName)
  17. {
  18. _uniformTarget = new TemplateTarget<T>(); // NOTE: initial value is undefined
  19. }
  20. UpdateUniform(const UpdateUniform& updateuniform,
  21. const osg::CopyOp& copyop) :
  22. AnimationUpdateCallback<osg::UniformCallback>(updateuniform, copyop)
  23. {
  24. _uniformTarget = new TemplateTarget<T>(*(updateuniform._uniformTarget));
  25. }
  26. META_Object(osgAnimation, UpdateUniform<T>);
  27. /** Callback method called by the NodeVisitor when visiting a node.*/
  28. virtual void operator () (osg::Uniform* uniform, osg::NodeVisitor* nv)
  29. {
  30. if (nv && nv->getVisitorType() == osg::NodeVisitor::UPDATE_VISITOR)
  31. update(*uniform);
  32. traverse(uniform, nv);
  33. }
  34. bool link(Channel* channel)
  35. {
  36. if (channel->getName().find("uniform") != std::string::npos)
  37. return channel->setTarget(_uniformTarget.get());
  38. else
  39. OSG_WARN << "Channel " << channel->getName() << " does not contain a valid symbolic name for this class " << className() << std::endl;
  40. return false;
  41. }
  42. void update(osg::Uniform& uniform)
  43. {
  44. T value = _uniformTarget->getValue();
  45. uniform.set(value);
  46. }
  47. };
  48. // float
  49. struct UpdateFloatUniform : public UpdateUniform<float>
  50. {
  51. UpdateFloatUniform(const std::string& aName = "") : UpdateUniform<float>(aName) { }
  52. UpdateFloatUniform(const UpdateFloatUniform& ufu,
  53. const osg::CopyOp& copyop) :
  54. osg::Object(ufu, copyop), // copy name
  55. UpdateUniform<float>(ufu, copyop) { }
  56. META_Object(osgAnimation, UpdateFloatUniform);
  57. };
  58. // Vec2f
  59. struct UpdateVec2fUniform : public UpdateUniform<osg::Vec2f>
  60. {
  61. UpdateVec2fUniform(const std::string& aName = "") : UpdateUniform<osg::Vec2f>(aName) { }
  62. UpdateVec2fUniform(const UpdateVec2fUniform& uv2fu,
  63. const osg::CopyOp& copyop) :
  64. osg::Object(uv2fu, copyop), // copy name
  65. UpdateUniform<osg::Vec2f>(uv2fu, copyop) { }
  66. META_Object(osgAnimation, UpdateVec2fUniform);
  67. };
  68. // Vec3f
  69. struct UpdateVec3fUniform : public UpdateUniform<osg::Vec3f>
  70. {
  71. UpdateVec3fUniform(const std::string& aName = "") : UpdateUniform<osg::Vec3f>(aName) { }
  72. UpdateVec3fUniform(const UpdateVec3fUniform& uv3fu,
  73. const osg::CopyOp& copyop) :
  74. osg::Object(uv3fu, copyop), // copy name
  75. UpdateUniform<osg::Vec3f>(uv3fu, copyop) { }
  76. META_Object(osgAnimation, UpdateVec3fUniform);
  77. };
  78. // Vec4f
  79. struct UpdateVec4fUniform : public UpdateUniform<osg::Vec4f>
  80. {
  81. UpdateVec4fUniform(const std::string& aName = "") : UpdateUniform<osg::Vec4f>(aName) { }
  82. UpdateVec4fUniform(const UpdateVec4fUniform& uv4fu,
  83. const osg::CopyOp& copyop) :
  84. osg::Object(uv4fu, copyop), // copy name
  85. UpdateUniform<osg::Vec4f>(uv4fu, copyop) { }
  86. META_Object(osgAnimation, UpdateVec4fUniform);
  87. };
  88. // Matrixf
  89. struct UpdateMatrixfUniform : public UpdateUniform<osg::Matrixf>
  90. {
  91. UpdateMatrixfUniform(const std::string& aName = "") : UpdateUniform<osg::Matrixf>(aName) { }
  92. UpdateMatrixfUniform(const UpdateMatrixfUniform& umfu,
  93. const osg::CopyOp& copyop) :
  94. osg::Object(umfu, copyop), // copy name
  95. UpdateUniform<osg::Matrixf>(umfu, copyop) { }
  96. META_Object(osgAnimation, UpdateMatrixfUniform);
  97. };
  98. }
  99. #endif