00001 //------------------------------------------------------------------------------ 00002 // Lamp : Open source game middleware 00003 // Copyright (C) 2004 Junpei Ohtani ( Email : junpee@users.sourceforge.jp ) 00004 // 00005 // This library is free software; you can redistribute it and/or 00006 // modify it under the terms of the GNU Lesser General Public 00007 // License as published by the Free Software Foundation; either 00008 // version 2.1 of the License, or (at your option) any later version. 00009 // 00010 // This library is distributed in the hope that it will be useful, 00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 // Lesser General Public License for more details. 00014 // 00015 // You should have received a copy of the GNU Lesser General Public 00016 // License along with this library; if not, write to the Free Software 00017 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00018 //------------------------------------------------------------------------------ 00019 00020 /** @file 00021 * キャラクタモデルヘッダ 00022 * @author Junpee 00023 */ 00024 00025 #ifndef CHARACTER_MODEL_H_ 00026 #define CHARACTER_MODEL_H_ 00027 00028 #include <Graphics/Model/Model.h> 00029 #include <Graphics/Model/Bone.h> 00030 00031 namespace Lamp{ 00032 00033 //------------------------------------------------------------------------------ 00034 /** 00035 * キャラクタモデル 00036 */ 00037 class CharacterModel : public Model{ 00038 friend class ModelManager; 00039 public: 00040 //-------------------------------------------------------------------------- 00041 /// 最大ボーン数 00042 static const int maxBoneCount = 64; 00043 00044 //-------------------------------------------------------------------------- 00045 /** 00046 * キャラクタモデルかどうか 00047 * @return キャラクタモデルならtrue 00048 */ 00049 virtual bool isCharacterModel() const{ return true; } 00050 00051 //-------------------------------------------------------------------------- 00052 /** 00053 * コピー 00054 * @param copyMask コピーマスク 00055 * @return コピーされたシーンリーフ 00056 */ 00057 virtual SceneLeaf* copy(u_int copyMask = 0) const{ 00058 return copyCharacterModel(copyMask); 00059 } 00060 00061 /** 00062 * モデルのコピー 00063 * @param copyMask コピーマスク 00064 * @return コピーされたモデル 00065 */ 00066 virtual Model* copyModel(u_int copyMask = 0) const{ 00067 return copyCharacterModel(copyMask); 00068 } 00069 00070 /** 00071 * キャラクタモデルのコピー 00072 * @param copyMask コピーマスク 00073 * @return コピーされたモデル 00074 */ 00075 virtual CharacterModel* copyCharacterModel(u_int copyMask = 0) const; 00076 00077 //-------------------------------------------------------------------------- 00078 /** 00079 * ボーン行列の構築 00080 * @param forceCalculation 強制的に再計算する 00081 */ 00082 virtual void buildBoneMatrix(bool forceCalculation = false); 00083 00084 /** 00085 * ボーンにスケールが含まれるか 00086 * @return ボーンにスケールが含まれるならtrue 00087 */ 00088 virtual bool isBoneScaled() const{ return boneScaled_; } 00089 00090 //-------------------------------------------------------------------------- 00091 /** 00092 * 位置変形行列配列の取得 00093 * @param forceCalculation 強制的に再計算する 00094 * @return 位置変形行列配列 00095 */ 00096 virtual const Matrix34* getPositionDeformMatrixArray( 00097 bool forceCalculation = false); 00098 00099 /** 00100 * 法線変形行列配列の取得 00101 * @param forceCalculation 強制的に再計算する 00102 * @return 法線変形行列配列 00103 */ 00104 virtual const Matrix33* getNormalDeformMatrixArray( 00105 bool forceCalculation = false); 00106 00107 //-------------------------------------------------------------------------- 00108 // ボーンインターフェース 00109 //-------------------------------------------------------------------------- 00110 /** 00111 * ボーンの作成 00112 * 00113 * ボーンを作成し、ボーンリストの最後尾に追加します。 00114 * すでに同じ名前のボーンが存在するとエラーになります。 00115 * 空文字列を名前に指定するとエラーになります。 00116 * @param boneName ボーン名 00117 * @return 作成されたボーン 00118 */ 00119 virtual Bone* createBone(const String& boneName); 00120 00121 /** 00122 * ボーンの破棄 00123 * @param bone 破棄するボーン 00124 */ 00125 virtual void destroyBone(Bone* bone); 00126 00127 /** 00128 * ボーンのクリア 00129 * @return 削除したボーン数 00130 */ 00131 virtual int clearBone(); 00132 00133 /** 00134 * ボーン数の取得 00135 * @return ボーン数 00136 */ 00137 virtual int getBoneCount() const{ return boneArray_.getCount(); } 00138 00139 /** 00140 * ボーンの取得 00141 * @param index ボーンのインデクス 00142 * @return ボーン 00143 */ 00144 virtual Bone* getBone(int index) const{ 00145 Assert(index >= 0); 00146 Assert(index < boneArray_.getCount()); 00147 return boneArray_.get(index); 00148 } 00149 00150 /** 00151 * ボーンインデックスの取得 00152 * @param bone ボーン 00153 * @return ボーンインデックス。見つからなければ-1 00154 */ 00155 virtual int getBoneIndex(Bone* bone) const{ 00156 int boneCount = getBoneCount(); 00157 for(int i = 0; i < boneCount; i++){ 00158 if(getBone(i) == bone){ return i; } 00159 } 00160 return -1; 00161 } 00162 00163 /** 00164 * ボーンの検索 00165 * @param boneName 検索するボーン名 00166 * @return ボーン 00167 */ 00168 virtual Bone* searchBone(const String& boneName) const{ 00169 return boneHash_.get(boneName); 00170 } 00171 00172 //-------------------------------------------------------------------------- 00173 /** 00174 * メッシュの追加 00175 * @param mesh 追加するメッシュ 00176 */ 00177 virtual void addMesh(Mesh* mesh); 00178 00179 //-------------------------------------------------------------------------- 00180 protected: 00181 /** 00182 * コンストラクタ 00183 * @param name 名前 00184 * @param scene シーン 00185 */ 00186 CharacterModel(const String& name, Scene* scene); 00187 00188 /** 00189 * デストラクタ 00190 */ 00191 virtual ~CharacterModel(); 00192 00193 /** 00194 * 変形行列配列の構築 00195 */ 00196 virtual void buildDeformMatrixArray(); 00197 00198 /// ボーンハッシュ 00199 HashMap<String, Bone*> boneHash_; 00200 /// ボーン配列 00201 ArrayList<Bone*> boneArray_; 00202 /// 位置変形行列配列 00203 Matrix34* positionDeformMatrixArray_; 00204 /// 法線変形行列配列 00205 Matrix33* normalDeformMatrixArray_; 00206 /// 変形行列配列サイズ 00207 int deformMatrixArraySize_; 00208 /// ボーン行列の構築チック 00209 int buildBoneMatrixTick_; 00210 /// 変形行列配列チック 00211 int deformMatrixArrayTick_; 00212 /// ボーンにスケールが含まれるか 00213 bool boneScaled_; 00214 00215 //-------------------------------------------------------------------------- 00216 private: 00217 00218 }; 00219 00220 //------------------------------------------------------------------------------ 00221 } // End of namespace Lamp 00222 #endif // End of CHARACTER_MODEL_H_ 00223 //------------------------------------------------------------------------------ 00224