diff options
Diffstat (limited to 'o3d/core/cross/skin.h')
-rw-r--r-- | o3d/core/cross/skin.h | 385 |
1 files changed, 0 insertions, 385 deletions
diff --git a/o3d/core/cross/skin.h b/o3d/core/cross/skin.h deleted file mode 100644 index 70193db..0000000 --- a/o3d/core/cross/skin.h +++ /dev/null @@ -1,385 +0,0 @@ -/* - * Copyright 2009, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -// This file contains the declaration of class Skin. - -#ifndef O3D_CORE_CROSS_SKIN_H_ -#define O3D_CORE_CROSS_SKIN_H_ - -#include <vector> -#include "core/cross/buffer.h" -#include "core/cross/param_object.h" -#include "core/cross/vertex_source.h" -#include "core/cross/param_array.h" - -namespace o3d { - -class MemoryReadStream; -class RawData; - -// A Skin holds an array of matrix indices and influences for vertices in a skin -// as well as the inverse bind pose matrices for each bone. -class Skin : public NamedObject { - public: - typedef SmartPointer<Skin> Ref; - typedef WeakPointer<Skin> WeakPointerType; - - // A four-character identifier used in the binary serialization format - // (not exposed to Javascript) - static const char *kSerializationID; - - // One matrix-weight pair. - struct Influence { - Influence() - : matrix_index(0), - weight(0) { - } - Influence(unsigned index, float weight) - : matrix_index(index), - weight(weight) { - } - unsigned matrix_index; - float weight; - }; - - typedef std::vector<Influence> Influences; - typedef std::vector<Influences> InfluencesArray; - - typedef std::vector<Matrix4> MatrixArray; - - const InfluencesArray& influences() const { - return influences_array_; - } - - // Sets the data for an individual vertex. - // Parameters: - // vertex_index: Index of vertex to set. - // influences: The matrix-weight pairs. - void SetVertexInfluences(unsigned vertex_index, - const Influences& influences); - - // Gets the data for an individual vertex. - // Parameters: - // vertex_index: Index of vertex to set. - // Returns: - // The influence data for the requested vertex or NULL if the index is out - // of range. - const Influences* GetVertexInfluences(unsigned vertex_index) const; - - // Gets the highest matrix index referenced by the influences. - // Returns: - // The highest matrix index referenced by the influences. - unsigned GetHighestMatrixIndex() const; - - // Gets the highest number of influences on any vertex. - // Returns: - // The highest number of influences on any vertex. - unsigned GetHighestInfluences() const; - - // Sets the inverse bind pose matrix for a particular joint/bone/transform. - // Parameters: - // index: index of bone/joint/transform - // matrix: Inverse bind pose matrix for that joint. - void SetInverseBindPoseMatrix(unsigned index, const Matrix4& matrix); - - // Gets the vector of inverse bind pose matrices. - // Returns: - // the vector of inverse bind pose matrices. - const MatrixArray& inverse_bind_pose_matrices() const { - return inverse_bind_pose_matrices_; - } - - // Sete the vector of inverse bind pose matrices. - void set_inverse_bind_pose_matrices(const MatrixArray& matrices) { - inverse_bind_pose_matrices_ = matrices; - } - - // Gets a weak pointer to us. - WeakPointerType GetWeakPointer() const { - return weak_pointer_manager_.GetWeakPointer(); - } - - // De-serializes the data contained in |raw_data| - // The entire contents of |raw_data| from start to finish will - // be used - bool Set(o3d::RawData *raw_data); - - // De-serializes the data contained in |raw_data| - // starting at byte offset |offset| and using |length| - // bytes - bool Set(o3d::RawData *raw_data, - size_t offset, - size_t length); - - // De-serializes a skin from its persistent binary representation - bool LoadFromBinaryData(MemoryReadStream *stream); - - private: - explicit Skin(ServiceLocator* service_locator); - - friend class IClassManager; - static ObjectBase::Ref Create(ServiceLocator* service_locator); - - // Update the highest influences and highest matrix index. - void UpdateInfo() const; - - // Frees all the influences and matrices. - void FreeAll(); - - // The vertex influences. - InfluencesArray influences_array_; - - // The inverse bind poses. - MatrixArray inverse_bind_pose_matrices_; - - // The highest matrix index. - mutable unsigned highest_matrix_index_; - - // The highest number of influences. - mutable unsigned highest_influences_; - - // True of the highest matrix index and highest influences is valid. - mutable bool info_valid_; - - // Manager for weak pointers to us. - WeakPointerType::WeakPointerManager weak_pointer_manager_; - - O3D_DECL_CLASS(Skin, NamedObject); - DISALLOW_COPY_AND_ASSIGN(Skin); -}; - -// A Param that holds a weak reference to a Skin. -class ParamSkin : public TypedRefParam<Skin> { - public: - typedef SmartPointer<ParamSkin> Ref; - - ParamSkin(ServiceLocator* service_locator, bool dynamic, bool read_only) - : TypedRefParam<Skin>(service_locator, dynamic, read_only) {} - - private: - friend class IClassManager; - static ObjectBase::Ref Create(ServiceLocator* service_locator); - - O3D_DECL_CLASS(ParamSkin, RefParamBase); -}; - -// A SkinEval is a VertexSource that takes its Streams, a ParamArray of Matrix4s -// and a Skin and skins the vertices in its streams storing the results in bound -// output streams. -class SkinEval : public VertexSource { - public: - static const char* kMatricesParamName; - static const char* kSkinParamName; - static const char* kBaseParamName; - - Skin* skin() const { - return skin_param_->value(); - } - - void set_skin(Skin* skin) { - skin_param_->set_value(skin); - } - - ParamArray* matrices() const { - return matrices_param_->value(); - } - - void set_matrices(ParamArray* matrices) { - matrices_param_->set_value(matrices); - } - - Matrix4 base() const { - return base_param_->value(); - } - - void set_base(const Matrix4& base) { - base_param_->set_value(base); - } - - // Binds the field of SourceBuffer and defines how the data in the buffer - // should be accessed and interpreted. - bool SetVertexStream(Stream::Semantic semantic, - int semantic_index, - Field* field, - unsigned int start_index); - - // Removes a vertex stream from this primitive. - // Returns true if the specified stream existed. - bool RemoveVertexStream(Stream::Semantic stream_semantic, - int semantic_index); - - // Searches the vertex streams bound to the shape for one with the given - // stream semantic. If a stream is not found then it returns NULL. - const Stream* GetVertexStream(Stream::Semantic stream_semantic, - int semantic_index) const; - - // Updates all the VertexBuffers bound to streams on this VertexSource. - void UpdateStreams(); - - // Updates the VertexBuffers bound to streams on this VertexSource. - void UpdateOutputs(); - - // Overriden from VertexSource. - virtual ParamVertexBufferStream* GetVertexStreamParam( - Stream::Semantic semantic, - int semantic_index) const; - - const StreamParamVector& vertex_stream_params() const { - return vertex_stream_params_; - } - - protected: - // Overridden from ParamObject - // For the given Param, returns all the inputs that affect that param through - // this ParamObject. - virtual void ConcreteGetInputsForParam(const Param* param, - ParamVector* inputs) const; - - // Overridden from ParamCollection - // For the given Param, returns all the outputs that the given param will - // affect through this ParamObject. - virtual void ConcreteGetOutputsForParam(const Param* param, - ParamVector* outputs) const; - - private: - class SlaveParamVertexBufferStream : public ParamVertexBufferStream { - public: - SlaveParamVertexBufferStream(ServiceLocator* service_locator, - SkinEval* master, - Stream* stream) - : ParamVertexBufferStream(service_locator, stream, true, false), - master_(master) { - set_owner(master); - } - - virtual void ComputeValue() { - master_->UpdateOutputs(); - } - - private: - SkinEval* master_; - DISALLOW_COPY_AND_ASSIGN(SlaveParamVertexBufferStream); - }; - - typedef std::vector<Matrix4> Matrix4Vector; - - explicit SkinEval(ServiceLocator* service_locator); - - friend class IClassManager; - static ObjectBase::Ref Create(ServiceLocator* service_locator); - - // Returns true if param is one of the Stream params on this SkinEval. - bool ParamIsStreamParam(const Param* param) const; - - void DoSkinning(Skin* skin); - - // The streams on this SkinEval - StreamParamVector vertex_stream_params_; - - // The array of bone matrices - ParamParamArray::Ref matrices_param_; - - // The base matrix that will be used to keep the vertices in object space. - ParamMatrix4::Ref base_param_; - - // The skin - ParamSkin::Ref skin_param_; - - // A place to store the bone calulations. We keep this in the struct - // so we don't have to allocate it every time. - Matrix4Vector bones_; - - // This class helps manage each stream. Because allocating memory is slow - // we keep these around across calls and reuse them in place by calling - // Init. - class StreamInfo { - public: - StreamInfo(); - - // Locks the stream. - bool Init(const Stream& stream, Buffer::AccessMode access_mode); - - // Unlocks the stream. - void Uninit(); - - // Multiplies the current value by the matrix and stores it in result and - // advances to the next value. - void Compute(const Matrix4& matrix) { - compute_function_(&result_[0], values_, matrix); - Advance(); - } - - // Copies the result from source and advances to the next value. - void Copy(const StreamInfo& source) { - copy_function_(values_, &source.result_[0]); - Advance(); - } - - private: - // Advances the internal counter to the next set. - void Advance() { - values_ = reinterpret_cast<float*>(reinterpret_cast<char*>( - values_) + stride_); - } - - // A pointer to function the multipies the source by the matrix and stores - // the result in destination. - typedef void (*ComputeFunction)(float* destination, - const float* source, - const Matrix4& matrix); - - // A pointer to a function that copies a 3 or 4 floats from the source to - // the destination. - typedef void (*CopyFunction)(float* destination, const float* source); - - ComputeFunction compute_function_; - CopyFunction copy_function_; - void* data_; - Buffer* buffer_; - float* values_; - unsigned stride_; - float result_[4]; - }; - - typedef std::vector<StreamInfo> StreamInfoVector; - typedef std::vector<StreamInfoVector> StreamInfoVectorVector; - - StreamInfoVector input_stream_infos_; - StreamInfoVectorVector output_stream_infos_; - - O3D_DECL_CLASS(SkinEval, VertexSource); - DISALLOW_COPY_AND_ASSIGN(SkinEval); -}; - -} // namespace o3d - -#endif // O3D_CORE_CROSS_SKIN_H_ |