Main Page | Namespace List | Class Hierarchy | Alphabetical List | Compound List | File List | Namespace Members | Compound Members | File Members

CollisionScene.h

Go to the documentation of this file.
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 //------------------------------------------------------------------------------

Generated on Wed Mar 16 10:29:29 2005 for Lamp by doxygen 1.3.2