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 SCENE_NODE_H_ 00026 #define SCENE_NODE_H_ 00027 00028 #include <Graphics/Scene/SceneObject.h> 00029 #include <Core/Primitive/Axis3.h> 00030 #include <Core/Container/ArrayList.h> 00031 #include <Graphics/Primitive/Visibility.h> 00032 00033 namespace Lamp{ 00034 00035 class LODSceneNode; 00036 00037 //------------------------------------------------------------------------------ 00038 /** 00039 * シーンノード 00040 */ 00041 class SceneNode : public SceneObject{ 00042 friend class SceneObjectManagerTemplate<SceneNode>; 00043 friend class SceneNodeManager; 00044 friend class LODSceneNode; 00045 public: 00046 /** 00047 * リファレンスカウントの取得 00048 * @return リファレンスカウント 00049 */ 00050 virtual int getReferenceCount() const{ 00051 if(parent_ != NULL){ return 1; } 00052 return 0; 00053 } 00054 00055 //-------------------------------------------------------------------------- 00056 /** 00057 * コピー 00058 * @param copyMask コピーマスク 00059 * @return コピーされたシーンノード 00060 */ 00061 virtual SceneNode* copy(u_int copyMask = 0) const; 00062 00063 /** 00064 * 再帰的破棄 00065 * @param sceneNode 破棄するシーンノード 00066 * @return 破棄したオブジェクト数 00067 */ 00068 static int recursiveDestroy(SceneNode* sceneNode); 00069 00070 /** 00071 * 子の再帰的破棄 00072 * @param sceneNode 子を破棄するシーンノード 00073 * @return 破棄したオブジェクト数 00074 */ 00075 static int recursiveDestroyChildren(SceneNode* sceneNode); 00076 00077 //-------------------------------------------------------------------------- 00078 /** 00079 * 親の取得 00080 * @return 親 00081 */ 00082 virtual SceneNode* getParent() const{ return parent_; } 00083 00084 //-------------------------------------------------------------------------- 00085 /** 00086 * 走査 00087 */ 00088 virtual void traverse(); 00089 00090 //-------------------------------------------------------------------------- 00091 /** 00092 * ワールド行列の取得 00093 * @return ワールド行列 00094 */ 00095 const Matrix34& getWorldMatrix() const{ return worldMatrix_; } 00096 00097 /** 00098 * ローカル行列の取得 00099 * @return ローカル行列 00100 */ 00101 const Matrix34& getLocalMatrix() const{ return axis_.getMatrix(); } 00102 00103 //-------------------------------------------------------------------------- 00104 /** 00105 * スケールの設定 00106 * @param scale スケール 00107 */ 00108 virtual void setScale(const Vector3& scale){ axis_.setScale(scale); } 00109 00110 /** 00111 * スケールの取得 00112 * @return スケール 00113 */ 00114 virtual const Vector3& getScale() const{ return axis_.getScale(); } 00115 00116 /** 00117 * スケールを使用しているか 00118 * @return スケールを使用しているならtrue 00119 */ 00120 virtual bool isScaled() const{ return axis_.isScaled(); } 00121 00122 /** 00123 * グローバルでスケールを使用しているか 00124 * @return グローバルでスケールを使用しているならtrue 00125 */ 00126 virtual bool isGlobalScaled() const{ return globalScaled_; } 00127 00128 //-------------------------------------------------------------------------- 00129 /** 00130 * XYZ回転の設定 00131 * @param rotation XYZ回転 00132 */ 00133 virtual void setRotationXYZ(const Vector3& rotation){ 00134 axis_.setRotationXYZ(rotation); 00135 } 00136 00137 /** 00138 * XYZ回転の取得 00139 * @return XYZ回転 00140 */ 00141 virtual const Vector3& getRotationXYZ(){ 00142 return axis_.getRotationXYZ(); 00143 } 00144 00145 //-------------------------------------------------------------------------- 00146 /** 00147 * 四元数回転の設定 00148 * @param rotation 四元数回転 00149 */ 00150 virtual void setRotationQuaternion(const Quaternion& rotation){ 00151 axis_.setRotationQuaternion(rotation); 00152 } 00153 00154 /** 00155 * 四元数回転の取得 00156 * @return 四元数回転 00157 */ 00158 virtual const Quaternion& getRotationQuaternion(){ 00159 return axis_.getRotationQuaternion(); 00160 } 00161 00162 //-------------------------------------------------------------------------- 00163 /** 00164 * 移動の設定 00165 * @param translation 移動 00166 */ 00167 virtual void setTranslation(const Vector3& translation){ 00168 axis_.setTranslation(translation); 00169 } 00170 00171 /** 00172 * 移動の取得 00173 * @return 移動 00174 */ 00175 virtual const Vector3& getTranslation() const{ 00176 return axis_.getTranslation(); 00177 } 00178 00179 //-------------------------------------------------------------------------- 00180 /** 00181 * 変更フラグの取得 00182 * @return 変更されていればtrue 00183 */ 00184 virtual bool isChanged() const{ return axis_.isChanged(); } 00185 00186 /** 00187 * グローバルでの変更フラグの取得 00188 * @return グローバルで変更されていればtrue 00189 */ 00190 virtual bool isGlobalChanged() const{ return globalChanged_; } 00191 00192 //-------------------------------------------------------------------------- 00193 /** 00194 * 有効、無効の設定 00195 * @param enabled trueなら有効、falseなら無効 00196 */ 00197 virtual void setEnabled(bool enabled){ enabled_ = enabled; } 00198 00199 /** 00200 * 有効、無効の取得 00201 * @return trueなら有効、falseなら無効 00202 */ 00203 virtual bool isEnabled() const{ return enabled_; } 00204 00205 /** 00206 * グローバルでの有効、無効の取得 00207 * @return trueなら有効、falseなら無効 00208 */ 00209 virtual bool isGlobalEnabled() const{ return globalEnabled_; } 00210 00211 //-------------------------------------------------------------------------- 00212 // シーンノードインターフェース 00213 //-------------------------------------------------------------------------- 00214 /** 00215 * シーンノードの追加 00216 * @param sceneNode 追加するシーンノード 00217 */ 00218 virtual void addSceneNode(SceneNode* sceneNode){ 00219 sceneNode->setParent(this); 00220 sceneNodes_.add(sceneNode); 00221 } 00222 00223 /** 00224 * シーンノードの削除 00225 * @param sceneNode 削除するシーンノード 00226 */ 00227 virtual void removeSceneNode(SceneNode* sceneNode){ 00228 sceneNode->removeParent(this); 00229 sceneNodes_.removeByValue(sceneNode); 00230 } 00231 00232 /** 00233 * シーンノード数の取得 00234 * @return シーンノード数 00235 */ 00236 virtual int getSceneNodeCount() const{ return sceneNodes_.getCount(); } 00237 00238 /** 00239 * シーンノードの取得 00240 * @param index インデックス 00241 * @return シーンノード 00242 */ 00243 virtual SceneNode* getSceneNode(int index) const{ 00244 Assert(index >= 0); 00245 Assert(index < getSceneNodeCount()); 00246 return sceneNodes_.get(index); 00247 } 00248 00249 //-------------------------------------------------------------------------- 00250 // シーンリーフインターフェース 00251 //-------------------------------------------------------------------------- 00252 /** 00253 * シーンリーフの追加 00254 * @param sceneLeaf 追加するシーンリーフ 00255 */ 00256 virtual void addSceneLeaf(SceneLeaf* sceneLeaf); 00257 00258 /** 00259 * シーンリーフの削除 00260 * @param sceneLeaf 削除するシーンリーフ 00261 */ 00262 virtual void removeSceneLeaf(SceneLeaf* sceneLeaf); 00263 00264 /** 00265 * シーンリーフ数の取得 00266 * @return シーンリーフ数 00267 */ 00268 virtual int getSceneLeafCount() const{ return sceneLeafs_.getCount(); } 00269 00270 /** 00271 * シーンリーフの取得 00272 * @param index インデックス 00273 * @return シーンリーフ 00274 */ 00275 virtual SceneLeaf* getSceneLeaf(int index) const{ 00276 Assert(index >= 0); 00277 Assert(index < getSceneLeafCount()); 00278 return sceneLeafs_.get(index); 00279 } 00280 00281 //-------------------------------------------------------------------------- 00282 // RTTI 00283 //-------------------------------------------------------------------------- 00284 /** 00285 * シーンノードかどうか 00286 * @return シーンノードならtrue 00287 */ 00288 virtual bool isSceneNode() const{ return true; } 00289 00290 //-------------------------------------------------------------------------- 00291 /** 00292 * レベルオブディティールシーンノードかどうか 00293 * @return レベルオブディティールシーンノードならtrue 00294 */ 00295 virtual bool isLODSceneNode() const{ return false; } 00296 00297 /** 00298 * レベルオブディティールシーンノードへのキャスト 00299 * @return レベルオブディティールシーンノード。型が違えばNULLを返す。 00300 */ 00301 virtual LODSceneNode* castLODSceneNode() const{ 00302 if(isLODSceneNode()){ return (LODSceneNode*)this; } 00303 return NULL; 00304 } 00305 00306 protected: 00307 //-------------------------------------------------------------------------- 00308 /** 00309 * コンストラクタ 00310 * @param name 名前 00311 * @param scene シーン 00312 */ 00313 SceneNode(const String& name, Scene* scene); 00314 00315 /** 00316 * デストラクタ 00317 */ 00318 virtual ~SceneNode(); 00319 00320 /** 00321 * シーンノードの値コピー 00322 * @param destination コピー先シーンノード 00323 * @param copyMask コピーマスク 00324 */ 00325 virtual void copySceneNodeValue( 00326 SceneNode* destination, u_int copyMask) const; 00327 00328 //-------------------------------------------------------------------------- 00329 /** 00330 * 走査 00331 * @param parentMatrix 親行列 00332 * @param cameraPosition カメラ位置 00333 * @param parentEnabled 親が有効か 00334 * @param parentScaled 親がスケールを使用しているか 00335 * @param parentChanged 親に変更があったか 00336 */ 00337 virtual void traverse(const Matrix34& parentMatrix, 00338 const Vector3& cameraPosition, bool parentEnabled, bool parentScaled, 00339 bool parentChanged); 00340 00341 /** 00342 * 行列の計算 00343 * @param parentMatrix 親行列 00344 * @param parentChanged 親に変更があったか 00345 * @return 変更があればtrue 00346 */ 00347 virtual bool calcMatrix(const Matrix34& parentMatrix, bool parentChanged); 00348 00349 /** 00350 * グローバルでの有効、無効の設定 00351 * @param globalEnabled trueなら有効、falseなら無効 00352 */ 00353 virtual void setGlobalEnabled(bool globalEnabled){ 00354 globalEnabled_ = globalEnabled; 00355 } 00356 00357 /** 00358 * グローバルでスケールを使用しているかの設定 00359 * @param globalScaled グローバルでスケールを使用しているならtrue 00360 */ 00361 virtual void setGlobalScaled(bool globalScaled){ 00362 globalScaled_ = globalScaled; 00363 } 00364 00365 /** 00366 * グローバルでの変更フラグの設定 00367 * @param globalChanged trueなら有効、falseなら無効 00368 */ 00369 virtual void setGlobalChanged(bool globalChanged){ 00370 globalChanged_ = globalChanged; 00371 } 00372 00373 //-------------------------------------------------------------------------- 00374 /** 00375 * 親の設定 00376 * @param parent 設定する親 00377 */ 00378 virtual void setParent(SceneNode* parent){ 00379 Assert(parent != NULL); 00380 Assert(parent_ == NULL); 00381 parent_ = parent; 00382 setGlobalEnabled(true); 00383 } 00384 00385 /** 00386 * 親の削除 00387 * @param parent 削除する親 00388 */ 00389 virtual void removeParent(SceneNode* parent){ 00390 Assert(parent_ != NULL); 00391 Assert(parent_ == parent); 00392 parent_ = NULL; 00393 setGlobalEnabled(true); 00394 } 00395 00396 private: 00397 //-------------------------------------------------------------------------- 00398 // 軸 00399 Axis3 axis_; 00400 // ワールド行列 00401 Matrix34 worldMatrix_; 00402 // シーンノード配列 00403 ArrayList<SceneNode*> sceneNodes_; 00404 // シーンリーフ配列 00405 ArrayList<SceneLeaf*> sceneLeafs_; 00406 // 親 00407 SceneNode* parent_; 00408 // 有効、無効フラグ 00409 bool enabled_; 00410 // グローバルでの有効無効フラグ 00411 bool globalEnabled_; 00412 // グローバルでのスケールフラグ 00413 bool globalScaled_; 00414 // グローバルでの変更フラグ 00415 bool globalChanged_; 00416 00417 }; 00418 00419 //------------------------------------------------------------------------------ 00420 } // End of namespace Lamp 00421 #endif // End of SCENE_NODE_H_ 00422 //------------------------------------------------------------------------------