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 COLLISION_SCENE_H_ 00026 #define COLLISION_SCENE_H_ 00027 00028 #include <Core/Renamer/Renamer.h> 00029 #include <Core/Container/HashMap.h> 00030 #include <Core/Container/ArrayList.h> 00031 00032 namespace Lamp{ 00033 00034 class IntersectionResult; 00035 class CollisionObject; 00036 class CollisionNode; 00037 class CollisionLeaf; 00038 class StaticSphereCollision; 00039 class StaticDeformedMeshCollision; 00040 00041 //------------------------------------------------------------------------------ 00042 /** 00043 * コリジョンシーン 00044 */ 00045 class CollisionScene{ 00046 public: 00047 //-------------------------------------------------------------------------- 00048 // 生成、破棄 00049 //-------------------------------------------------------------------------- 00050 /** 00051 * コンストラクタ 00052 */ 00053 CollisionScene(); 00054 00055 /** 00056 * デストラクタ 00057 */ 00058 virtual ~CollisionScene(); 00059 00060 //-------------------------------------------------------------------------- 00061 // シーン関連 00062 //-------------------------------------------------------------------------- 00063 /** 00064 * 走査 00065 */ 00066 virtual void traverse(); 00067 00068 /** 00069 * ルートノードの取得 00070 * @return ルートノード 00071 */ 00072 virtual CollisionNode* getRootNode(){ return rootNode_; } 00073 00074 //-------------------------------------------------------------------------- 00075 /** 00076 * チックの設定 00077 * @param tick チック 00078 */ 00079 virtual void setTick(int tick){ tick_ = tick; } 00080 00081 /** 00082 * チックの取得 00083 * @return チック 00084 */ 00085 virtual int getTick() const{ return tick_; } 00086 00087 //-------------------------------------------------------------------------- 00088 // 交差 00089 //-------------------------------------------------------------------------- 00090 /** 00091 * 球交差 00092 * @param result 交差結果 00093 * @param sphere 球 00094 * @param collisionMask コリジョンマスク 00095 */ 00096 virtual void intersection(IntersectionResult* result, const Sphere& sphere, 00097 u_int collisionMask = 0xffffffff); 00098 00099 /** 00100 * 球コリジョン交差 00101 * @param result 交差結果 00102 * @param sphere 球コリジョン 00103 * @param collisionMask コリジョンマスク 00104 */ 00105 virtual void intersection(IntersectionResult* result, 00106 StaticSphereCollision* sphere, u_int collisionMask = 0xffffffff); 00107 00108 //-------------------------------------------------------------------------- 00109 // 衝突 00110 //-------------------------------------------------------------------------- 00111 00112 //-------------------------------------------------------------------------- 00113 // コリジョンノード生成 00114 //-------------------------------------------------------------------------- 00115 /** 00116 * コリジョンノードの作成 00117 * 00118 * すでに同じ名前のコリジョンオブジェクトが存在するとエラーになります。 00119 * 空文字列を名前に指定するとエラーになります。 00120 * @param name 名前 00121 * @return コリジョンノード 00122 */ 00123 CollisionNode* createCollisionNode(const String& name); 00124 00125 //-------------------------------------------------------------------------- 00126 // 静的コリジョンリーフ生成 00127 //-------------------------------------------------------------------------- 00128 /** 00129 * 静的球コリジョンの作成 00130 * 00131 * すでに同じ名前のコリジョンオブジェクトが存在するとエラーになります。 00132 * 空文字列を名前に指定するとエラーになります。 00133 * @param name 名前 00134 * @return 静的球コリジョン 00135 */ 00136 StaticSphereCollision* createStaticSphereCollision(const String& name); 00137 00138 //-------------------------------------------------------------------------- 00139 /** 00140 * 静的変形メッシュコリジョンの作成 00141 * 00142 * すでに同じ名前のコリジョンオブジェクトが存在するとエラーになります。 00143 * 空文字列を名前に指定するとエラーになります。 00144 * @param name 名前 00145 * @return 静的変形メッシュコリジョン 00146 */ 00147 StaticDeformedMeshCollision* createStaticDeformedMeshCollision( 00148 const String& name); 00149 00150 //-------------------------------------------------------------------------- 00151 // コリジョンオブジェクト破棄 00152 //-------------------------------------------------------------------------- 00153 /** 00154 * ノードオブジェクトの破棄 00155 * @param node 破棄するノードオブジェクト 00156 */ 00157 virtual void destroyNode(CollisionNode* node); 00158 00159 /** 00160 * リーフオブジェクトの破棄 00161 * @param leaf 破棄するリーフオブジェクト 00162 */ 00163 virtual void destroyLeaf(CollisionLeaf* leaf); 00164 00165 /** 00166 * クリア 00167 * @return 削除したコリジョンオブジェクト数 00168 */ 00169 virtual int clear(); 00170 00171 //-------------------------------------------------------------------------- 00172 // コリジョンオブジェクトの操作 00173 //-------------------------------------------------------------------------- 00174 /** 00175 * ノードオブジェクト数の取得 00176 * @return ノードオブジェクト数 00177 */ 00178 virtual int getNodeCount(){ return nodeArray_.getCount(); } 00179 00180 /** 00181 * ノードオブジェクトの取得 00182 * @param index ノードオブジェクトのインデクス 00183 * @return ノードオブジェクト 00184 */ 00185 virtual CollisionNode* getNode(int index){ return nodeArray_.get(index); } 00186 00187 /** 00188 * ノードオブジェクトの検索 00189 * @param name 検索するノードオブジェクト名 00190 * @return ノードオブジェクト 00191 */ 00192 virtual CollisionNode* searchNode(const String& name){ 00193 return nodeDatabase_.get(name); 00194 } 00195 00196 /** 00197 * ノード名が存在するかどうか 00198 * @param name 存在するかどうか調べる名前 00199 * @return ノード名が存在すればtrue 00200 */ 00201 virtual bool existNodeName(const String& name){ 00202 return (searchNode(name) != NULL); 00203 } 00204 00205 //-------------------------------------------------------------------------- 00206 /** 00207 * リーフオブジェクト数の取得 00208 * @return リーフオブジェクト数 00209 */ 00210 virtual int getLeafCount(){ return leafArray_.getCount(); } 00211 00212 /** 00213 * リーフオブジェクトの取得 00214 * @param index リーフオブジェクトのインデクス 00215 * @return リーフオブジェクト 00216 */ 00217 virtual CollisionLeaf* getLeaf(int index){ return leafArray_.get(index); } 00218 00219 /** 00220 * リーフオブジェクトの検索 00221 * @param name 検索するリーフオブジェクト名 00222 * @return リーフオブジェクト 00223 */ 00224 virtual CollisionLeaf* searchLeaf(const String& name){ 00225 return leafDatabase_.get(name); 00226 } 00227 00228 /** 00229 * リーフ名が存在するかどうか 00230 * @param name 存在するかどうか調べる名前 00231 * @return リーフ名が存在すればtrue 00232 */ 00233 virtual bool existLeafName(const String& name){ 00234 return (searchLeaf(name) != NULL); 00235 } 00236 00237 //-------------------------------------------------------------------------- 00238 // リネーム関係 00239 //-------------------------------------------------------------------------- 00240 /** 00241 * ノードのリネーム 00242 * @param name 元となる名前 00243 * @return 重複していない名前 00244 */ 00245 virtual String renameNode(const String& name){ 00246 return nodeRenamer_->rename(&nodeRenamerCallback_, name); 00247 } 00248 00249 /** 00250 * ノードリネーマの設定 00251 * @param renamer 設定するノードリネーマ 00252 */ 00253 virtual void setNodeRenamer(Renamer* renamer){ 00254 Assert((renamer != NULL) && (nodeRenamer_ != NULL)); 00255 SafeDelete(nodeRenamer_); 00256 nodeRenamer_ = renamer; 00257 } 00258 00259 //-------------------------------------------------------------------------- 00260 /** 00261 * リーフのリネーム 00262 * @param name 元となる名前 00263 * @return 重複していない名前 00264 */ 00265 virtual String renameLeaf(const String& name){ 00266 return leafRenamer_->rename(&leafRenamerCallback_, name); 00267 } 00268 00269 /** 00270 * リーフリネーマの設定 00271 * @param renamer 設定するリーフリネーマ 00272 */ 00273 virtual void setLeafRenamer(Renamer* renamer){ 00274 Assert((renamer != NULL) && (leafRenamer_ != NULL)); 00275 SafeDelete(leafRenamer_); 00276 leafRenamer_ = renamer; 00277 } 00278 00279 protected: 00280 //-------------------------------------------------------------------------- 00281 // リネーマ 00282 //-------------------------------------------------------------------------- 00283 /// ノードリネーマコールバック 00284 class NodeRenamerCallback : public Renamer::Database{ 00285 friend class CollisionScene; 00286 private: 00287 /** 00288 * 名前が存在するかどうか 00289 * @param name 存在するかどうか調べる名前 00290 * @return 名前が存在すればtrue 00291 */ 00292 virtual bool existName(const String& name){ 00293 return scene_->existNodeName(name); 00294 } 00295 00296 // シーン 00297 CollisionScene* scene_; 00298 }; 00299 00300 //-------------------------------------------------------------------------- 00301 /// リーフリネーマコールバック 00302 class LeafRenamerCallback : public Renamer::Database{ 00303 friend class CollisionScene; 00304 private: 00305 /** 00306 * 名前が存在するかどうか 00307 * @param name 存在するかどうか調べる名前 00308 * @return 名前が存在すればtrue 00309 */ 00310 virtual bool existName(const String& name){ 00311 return scene_->existLeafName(name); 00312 } 00313 00314 // シーン 00315 CollisionScene* scene_; 00316 }; 00317 00318 //-------------------------------------------------------------------------- 00319 // ユーティリティ 00320 //-------------------------------------------------------------------------- 00321 /** 00322 * リーフの名前チェック 00323 * @param name チェックする名前 00324 * @return 正常な名前ならtrueを返す 00325 */ 00326 bool checkLeafName(const String& name); 00327 00328 private: 00329 //-------------------------------------------------------------------------- 00330 // コピーコンストラクタの隠蔽 00331 CollisionScene(const CollisionScene& copy); 00332 00333 // 代入コピーの隠蔽 00334 void operator =(const CollisionScene& copy); 00335 00336 //-------------------------------------------------------------------------- 00337 // ノードデータベース 00338 HashMap<String, CollisionNode*> nodeDatabase_; 00339 // ノード配列 00340 ArrayList<CollisionNode*> nodeArray_; 00341 // ノードリネーマ 00342 Renamer* nodeRenamer_; 00343 // ノードリネーマコールバック 00344 NodeRenamerCallback nodeRenamerCallback_; 00345 // リーフデータベース 00346 HashMap<String, CollisionLeaf*> leafDatabase_; 00347 // リーフ配列 00348 ArrayList<CollisionLeaf*> leafArray_; 00349 // リーフリネーマ 00350 Renamer* leafRenamer_; 00351 // リーフリネーマコールバック 00352 LeafRenamerCallback leafRenamerCallback_; 00353 // ルートノード 00354 CollisionNode* rootNode_; 00355 // チック 00356 int tick_; 00357 00358 }; 00359 00360 //------------------------------------------------------------------------------ 00361 } // End of namespace Lamp 00362 #endif // End of COLLISION_SCENE_H_ 00363 //------------------------------------------------------------------------------