nuclear@0: /* nuclear@0: Open Asset Import Library (assimp) nuclear@0: ---------------------------------------------------------------------- nuclear@0: nuclear@0: Copyright (c) 2006-2012, assimp team nuclear@0: All rights reserved. nuclear@0: nuclear@0: Redistribution and use of this software in source and binary forms, nuclear@0: with or without modification, are permitted provided that the nuclear@0: following conditions are met: nuclear@0: nuclear@0: * Redistributions of source code must retain the above nuclear@0: copyright notice, this list of conditions and the nuclear@0: following disclaimer. nuclear@0: nuclear@0: * Redistributions in binary form must reproduce the above nuclear@0: copyright notice, this list of conditions and the nuclear@0: following disclaimer in the documentation and/or other nuclear@0: materials provided with the distribution. nuclear@0: nuclear@0: * Neither the name of the assimp team, nor the names of its nuclear@0: contributors may be used to endorse or promote products nuclear@0: derived from this software without specific prior nuclear@0: written permission of the assimp team. nuclear@0: nuclear@0: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS nuclear@0: "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT nuclear@0: LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR nuclear@0: A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT nuclear@0: OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, nuclear@0: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT nuclear@0: LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, nuclear@0: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY nuclear@0: THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT nuclear@0: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE nuclear@0: OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. nuclear@0: nuclear@0: ---------------------------------------------------------------------- nuclear@0: */ nuclear@0: nuclear@0: /** @file Defines a helper class for the ASE and 3DS loaders to nuclear@0: help them compute camera and spot light animation channels */ nuclear@0: #ifndef AI_TARGET_ANIMATION_H_INC nuclear@0: #define AI_TARGET_ANIMATION_H_INC nuclear@0: nuclear@0: nuclear@0: namespace Assimp { nuclear@0: nuclear@0: nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: /** Helper class to iterate through all keys in an animation channel. nuclear@0: * nuclear@0: * Missing tracks are interpolated. This is a helper class for nuclear@0: * TargetAnimationHelper, but it can be freely used for other purposes. nuclear@0: */ nuclear@0: class KeyIterator nuclear@0: { nuclear@0: public: nuclear@0: nuclear@0: nuclear@0: // ------------------------------------------------------------------ nuclear@0: /** Constructs a new key iterator nuclear@0: * nuclear@0: * @param _objPos Object position track. May be NULL. nuclear@0: * @param _targetObjPos Target object position track. May be NULL. nuclear@0: * @param defaultObjectPos Default object position to be used if nuclear@0: * no animated track is available. May be NULL. nuclear@0: * @param defaultTargetPos Default target position to be used if nuclear@0: * no animated track is available. May be NULL. nuclear@0: */ nuclear@0: KeyIterator(const std::vector* _objPos, nuclear@0: const std::vector* _targetObjPos, nuclear@0: const aiVector3D* defaultObjectPos = NULL, nuclear@0: const aiVector3D* defaultTargetPos = NULL); nuclear@0: nuclear@0: // ------------------------------------------------------------------ nuclear@0: /** Returns true if all keys have been processed nuclear@0: */ nuclear@0: bool Finished() const nuclear@0: {return reachedEnd;} nuclear@0: nuclear@0: // ------------------------------------------------------------------ nuclear@0: /** Increment the iterator nuclear@0: */ nuclear@0: void operator++(); nuclear@0: inline void operator++(int) nuclear@0: {return ++(*this);} nuclear@0: nuclear@0: nuclear@0: nuclear@0: // ------------------------------------------------------------------ nuclear@0: /** Getters to retrieve the current state of the iterator nuclear@0: */ nuclear@0: inline const aiVector3D& GetCurPosition() const nuclear@0: {return curPosition;} nuclear@0: nuclear@0: inline const aiVector3D& GetCurTargetPosition() const nuclear@0: {return curTargetPosition;} nuclear@0: nuclear@0: inline double GetCurTime() const nuclear@0: {return curTime;} nuclear@0: nuclear@0: private: nuclear@0: nuclear@0: //! Did we reach the end? nuclear@0: bool reachedEnd; nuclear@0: nuclear@0: //! Represents the current position of the iterator nuclear@0: aiVector3D curPosition, curTargetPosition; nuclear@0: nuclear@0: double curTime; nuclear@0: nuclear@0: //! Input tracks and the next key to process nuclear@0: const std::vector* objPos,*targetObjPos; nuclear@0: nuclear@0: unsigned int nextObjPos, nextTargetObjPos; nuclear@0: std::vector defaultObjPos,defaultTargetObjPos; nuclear@0: }; nuclear@0: nuclear@0: // --------------------------------------------------------------------------- nuclear@0: /** Helper class for the 3DS and ASE loaders to compute camera and spot light nuclear@0: * animations. nuclear@0: * nuclear@0: * 3DS and ASE store the differently to Assimp - there is an animation nuclear@0: * channel for the camera/spot light itself and a separate position nuclear@0: * animation channels specifying the position of the camera/spot light nuclear@0: * look-at target */ nuclear@0: class TargetAnimationHelper nuclear@0: { nuclear@0: public: nuclear@0: nuclear@0: TargetAnimationHelper() nuclear@0: : targetPositions (NULL) nuclear@0: , objectPositions (NULL) nuclear@0: {} nuclear@0: nuclear@0: nuclear@0: // ------------------------------------------------------------------ nuclear@0: /** Sets the target animation channel nuclear@0: * nuclear@0: * This channel specifies the position of the camera/spot light nuclear@0: * target at a specific position. nuclear@0: * nuclear@0: * @param targetPositions Translation channel*/ nuclear@0: void SetTargetAnimationChannel (const nuclear@0: std::vector* targetPositions); nuclear@0: nuclear@0: nuclear@0: // ------------------------------------------------------------------ nuclear@0: /** Sets the main animation channel nuclear@0: * nuclear@0: * @param objectPositions Translation channel */ nuclear@0: void SetMainAnimationChannel ( const nuclear@0: std::vector* objectPositions); nuclear@0: nuclear@0: // ------------------------------------------------------------------ nuclear@0: /** Sets the main animation channel to a fixed value nuclear@0: * nuclear@0: * @param fixed Fixed value for the main animation channel*/ nuclear@0: void SetFixedMainAnimationChannel(const aiVector3D& fixed); nuclear@0: nuclear@0: nuclear@0: // ------------------------------------------------------------------ nuclear@0: /** Computes final animation channels nuclear@0: * @param distanceTrack Receive camera translation keys ... != NULL. */ nuclear@0: void Process( std::vector* distanceTrack ); nuclear@0: nuclear@0: nuclear@0: private: nuclear@0: nuclear@0: const std::vector* targetPositions,*objectPositions; nuclear@0: aiVector3D fixedMain; nuclear@0: }; nuclear@0: nuclear@0: nuclear@0: } // ! end namespace Assimp nuclear@0: nuclear@0: #endif // include guard