1 /*
2     Copyright (c) 2008-2009 NetAllied Systems GmbH
3 
4     This file is part of COLLADAFramework.
5 
6     Licensed under the MIT Open Source License,
7     for details please see LICENSE file or the website
8     http://www.opensource.org/licenses/mit-license.php
9 */
10 
11 #ifndef __COLLADAFW_SKINCONTROLLERDATA_H__
12 #define __COLLADAFW_SKINCONTROLLERDATA_H__
13 
14 #include "COLLADAFWPrerequisites.h"
15 #include "COLLADAFWObject.h"
16 #include "COLLADAFWTypes.h"
17 #include "COLLADAFWUniqueId.h"
18 #include "COLLADAFWFloatOrDoubleArray.h"
19 
20 #include "Math/COLLADABUMathMatrix4.h"
21 
22 
23 namespace COLLADAFW
24 {
25 
26     /** Holds the data of a skin controller, i.e. the weights per vertex per joint */
27 	class SkinControllerData : public ObjectTemplate<COLLADA_TYPE::SKIN_DATA>
28 	{
29 	private:
30 
31         /**
32         * The original object id, if it in the original file format exist.
33         */
34         String mOriginalId;
35 
36         /** The name of the skin controller.*/
37         String mName;
38 
39 		/** The number of joints this controller can use.*/
40 		size_t mJointsCount;
41 
42 		/** Provides extra information about the position and orientation of the base mesh before binding.*/
43 		COLLADABU::Math::Matrix4 mBindShapeMatrix;
44 
45 		/** Array of the inverse bind matrices. One for each joint.*/
46 		Matrix4Array mInverseBindMatrices;
47 
48 		/** The weights of the skin controller. */
49 		FloatOrDoubleArray mWeights;
50 
51 		/** Defines how many joints are connected to a vertex. The length must be equal to mVertexCount.
52 		The i'th index corresponds to the i'th vertex of the source.*/
53 		UIntValuesArray mJointsPerVertex;
54 
55 		/** Indices of weights assigned to a joint/vertex pair. The number of pairs for the i'th vertex is
56 		given by the i'th value in mJointsPerVertex.*/
57 		UIntValuesArray mWeightIndices;
58 
59 		/** Indices of joints assigned to a joint/vertex pair. The number of pairs for the i'th vertex is
60 		given by the i'th value in mJointsPerVertex.*/
61 		IntValuesArray mJointIndices;
62 
63 	public:
64 
65         /** Constructor. */
66 		SkinControllerData( const UniqueId& uniqueId );
67 
68         /** Destructor. */
69 		virtual ~SkinControllerData();
70 
71         /**
72         * The original object id, if it in the original file format exist.
73         */
getOriginalId()74         const String& getOriginalId () const { return mOriginalId; }
75 
76         /**
77         * The original object id, if it in the original file format exist.
78         */
setOriginalId(const String & val)79         void setOriginalId ( const String& val ) { mOriginalId = val; }
80 
81         /** Returns name of the controller.*/
getName()82         const String& getName() const { return mName; }
83 
84         /** Sets name of the controller.*/
setName(const String & name)85         void setName(const String& name) { mName = name; }
86 
87 		/** Provides extra information about the position and orientation of the base mesh before binding.*/
getBindShapeMatrix()88 		const COLLADABU::Math::Matrix4& getBindShapeMatrix() const { return mBindShapeMatrix; }
89 
90 		/** Provides extra information about the position and orientation of the base mesh before binding.*/
setBindShapeMatrix(const COLLADABU::Math::Matrix4 & bindShapeMatrix)91 		void setBindShapeMatrix( const COLLADABU::Math::Matrix4& bindShapeMatrix) { mBindShapeMatrix = bindShapeMatrix; }
92 
93 		/** Array of the inverse bind matrices. One for each joint.*/
getInverseBindMatrices()94 		Matrix4Array& getInverseBindMatrices() { return mInverseBindMatrices; }
95 
96 		/** Array of the inverse bind matrices. One for each joint.*/
getInverseBindMatrices()97 		const Matrix4Array& getInverseBindMatrices() const { return mInverseBindMatrices; }
98 
99 		/** Returns the number of joints this controller can use.*/
getJointsCount()100 		size_t getJointsCount() const { return mJointsCount; }
101 
102 		/** Sets the number of joints this controller can use.*/
setJointsCount(size_t jointsCount)103 		void setJointsCount(size_t jointsCount) { mJointsCount = jointsCount; }
104 
105 		/** Returns the number of vertices of the mesh modified by this controller.*/
getVertexCount()106 		size_t getVertexCount() const { return mJointsPerVertex.getCount(); }
107 
108 		/** Returns the weights of the skin controller. */
getWeights()109 		const FloatOrDoubleArray& getWeights() const { return mWeights; }
getWeights()110 		FloatOrDoubleArray& getWeights() { return mWeights; }
111 
112 		/** Returns the array defining how many joints are connected to a vertex. The length must be equal to mVertexCount.
113 		The i'th index corresponds to the i'th vertex of the source.*/
getJointsPerVertex()114 		const UIntValuesArray& getJointsPerVertex() const { return mJointsPerVertex; }
getJointsPerVertex()115 		UIntValuesArray& getJointsPerVertex() { return mJointsPerVertex; }
116 
117 		/** Returns the indices of weights assigned to a joint/vertex pair. The number of pairs for the i'th vertex is
118 		given by the i'th value in mJointsPerVertex.*/
getWeightIndices()119 		const UIntValuesArray& getWeightIndices() const { return mWeightIndices; }
getWeightIndices()120 		UIntValuesArray& getWeightIndices() { return mWeightIndices; }
121 
122 		/** Returns the indices of joints assigned to a joint/vertex pair. The number of pairs for the i'th vertex is
123 		given by the i'th value in mJointsPerVertex.*/
getJointIndices()124 		const IntValuesArray& getJointIndices() const { return mJointIndices; }
getJointIndices()125 		IntValuesArray& getJointIndices() { return mJointIndices; }
126 
127 	private:
128 
129         /** Disable default copy ctor. */
130 		SkinControllerData( const SkinControllerData& pre );
131 
132         /** Disable default assignment operator. */
133 		const SkinControllerData& operator= ( const SkinControllerData& pre );
134 
135 	};
136 
137 } // namespace COLLADAFW
138 
139 #endif // __COLLADAFW_SKINCONTROLLERDATA_H__
140