Show
Ignore:
Timestamp:
10/27/09 16:37:13 (5 years ago)
Author:
cedricpinson
Message:

From Cedric Pinson, The following commit include:
* Refactore of RigGeometry? to support hardware skinning
* Refactore of Timeline to split Action in differents files
* Add example how to use hardware skinning

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/include/osgAnimation/RigGeometry

    r10344 r10693  
    11/*  -*-c++-*-  
    2  *  Copyright (C) 2008 Cedric Pinson <mornifle@plopbyte.net> 
     2 *  Copyright (C) 2008 Cedric Pinson <cedric.pinson@plopbyte.net> 
    33 * 
    44 * This library is open source and may be redistributed and/or modified under   
     
    1717 
    1818#include <osgAnimation/Export> 
    19 #include <osgAnimation/Skinning> 
    2019#include <osgAnimation/Skeleton> 
     20#include <osgAnimation/RigTransform> 
    2121#include <osg/Geometry> 
    2222 
     
    3434        META_Object(osgAnimation, RigGeometry); 
    3535 
    36         void setInfluenceMap(osgAnimation::VertexInfluenceMap* vertexInfluenceMap) { _vertexInfluenceMap = vertexInfluenceMap; } 
    37         const osgAnimation::VertexInfluenceMap* getInfluenceMap() const { return _vertexInfluenceMap.get();} 
    38         osgAnimation::VertexInfluenceMap* getInfluenceMap() { return _vertexInfluenceMap.get();} 
     36        void setInfluenceMap(VertexInfluenceMap* vertexInfluenceMap) { _vertexInfluenceMap = vertexInfluenceMap; } 
     37        const VertexInfluenceMap* getInfluenceMap() const { return _vertexInfluenceMap.get();} 
     38        VertexInfluenceMap* getInfluenceMap() { return _vertexInfluenceMap.get();} 
    3939  
    4040        const Skeleton* getSkeleton() const; 
    4141        Skeleton* getSkeleton(); 
     42        // will be used by the update callback to init correctly the rig mesh 
     43        void setSkeleton(Skeleton*); 
    4244         
    4345        void setNeedToComputeMatrix(bool state) { _needToComputeMatrix = state;} 
    4446        bool getNeedToComputeMatrix() const { return _needToComputeMatrix;} 
    4547         
    46         void buildVertexSet(); 
    47         void buildTransformer(Skeleton* root); 
     48 
     49        // this build the internal database about vertex influence and bones 
     50        void buildVertexInfluenceSet(); 
     51        const VertexInfluenceSet& getVertexInfluenceSet() const; 
     52 
    4853        void computeMatrixFromRootSkeleton(); 
    4954 
    50         virtual void transformSoftwareMethod(); 
    51         const osgAnimation::VertexInfluenceSet& getVertexInfluenceSet() const { return _vertexInfluenceSet;} 
    5255 
    53         const std::vector<osg::Vec3>& getPositionSource() const { return _positionSource;} 
    54         const std::vector<osg::Vec3>& getNormalSource() const { return _normalSource;} 
     56        // set implementation of rig method 
     57        void setRigTransformImplementation(RigTransform*); 
     58        RigTransform* getRigTransformImplementation(); 
     59 
     60        virtual void drawImplementation(osg::RenderInfo& renderInfo) const; 
     61        void update(); 
     62 
     63        const osg::Matrix& getMatrixFromSkeletonToGeometry() const; 
     64        const osg::Matrix& getInvMatrixFromSkeletonToGeometry() const; 
    5565 
    5666    protected: 
    5767 
    58         std::vector<osg::Vec3> _positionSource; 
    59         std::vector<osg::Vec3> _normalSource; 
     68        osg::ref_ptr<RigTransform> _rigTransformImplementation; 
    6069 
    61         osgAnimation::VertexInfluenceSet _vertexInfluenceSet; 
    62         osg::ref_ptr<osgAnimation::VertexInfluenceMap> _vertexInfluenceMap; 
    63         osgAnimation::TransformVertexFunctor _transformVertexes; 
     70        VertexInfluenceSet _vertexInfluenceSet; 
     71        osg::ref_ptr<VertexInfluenceMap> _vertexInfluenceMap; 
    6472 
    6573        osg::Matrix _matrixFromSkeletonToGeometry; 
     
    6775        osg::observer_ptr<Skeleton> _root; 
    6876        bool _needToComputeMatrix; 
    69  
    7077  
    7178        struct FindNearestParentSkeleton : public osg::NodeVisitor 
    7279        { 
    73             osg::ref_ptr<osgAnimation::Skeleton> _root; 
     80            osg::ref_ptr<Skeleton> _root; 
    7481            FindNearestParentSkeleton() : osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_PARENTS) {} 
    7582            void apply(osg::Transform& node)  
     
    99106                    if (!finder._root.valid()) 
    100107                        return; 
    101                     geom->buildVertexSet(); 
    102                     geom->buildTransformer(finder._root.get()); 
     108                    geom->buildVertexInfluenceSet(); 
     109                    geom->setSkeleton(finder._root.get()); 
    103110                } 
    104111 
     
    108115                if (geom->getNeedToComputeMatrix()) 
    109116                    geom->computeMatrixFromRootSkeleton(); 
    110                 geom->transformSoftwareMethod(); 
     117 
     118                geom->update(); 
    111119            } 
    112120        }; 
    113  
    114         /** BuildVertexTransformerVisitor is used to setup RigGeometry drawable 
    115          *  throw a subgraph.  
    116          */ 
    117         struct BuildVertexTransformerVisitor : public osg::NodeVisitor 
    118         { 
    119             osg::ref_ptr<Skeleton> _root; 
    120             BuildVertexTransformerVisitor(Skeleton* root): osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) { _root = root;} 
    121  
    122             META_NodeVisitor("osgAnimation","BuildVertexTransformerVisitor") 
    123  
    124             void apply(osg::Geode& node)  
    125             {  
    126                 int num = node.getNumDrawables(); 
    127                 for (int i = 0; i < num; i++) { 
    128                     RigGeometry* geom = dynamic_cast<RigGeometry*>(node.getDrawable(i)); 
    129                     if (geom)  
    130                     { 
    131                         geom->buildVertexSet(); 
    132                         geom->buildTransformer(_root.get()); 
    133                     } 
    134                 } 
    135             } 
    136         }; 
    137  
    138121   }; 
    139122