00001 #ifndef PHCHANGEOBJECT_H 00002 #define PHCHANGEOBJECT_H 00003 00004 #include <Collision/CDFramePair.h> 00005 #include <Collision/CDCollisionEngine.h> 00006 #include "PHSolid.h" 00007 00008 namespace Spr{; 00009 00010 /** Solidの入れ替えを行うクラスの基本クラス.PHChangeObjectContainerが持つ */ 00011 class PHChangeObject:public SGObject{ 00012 SGOBJECTDEFABST(PHChangeObject); 00013 protected: 00014 00015 public: 00016 UTRef<PHSolid> solid[2]; ///< 入れ替え前[0]と入れ替え後[1]の剛体 00017 00018 /// IsChange()の結果に応じてChange()を実行する.PHChangeObjectContainer::Step()から呼ばれる 00019 void Step(); 00020 /// Solidの入れ替えを行う 00021 void Change(); 00022 /// 入れ替え処理を行うかどうか判断する 00023 virtual bool IsChange()=0; 00024 /// クリア 00025 virtual void Clear()=0; 00026 }; 00027 00028 /// PHChangeObjectの配列 00029 class PHChangeObjects:public std::vector< UTRef<PHChangeObject> >{ 00030 }; 00031 00032 /** チェンジオブジェクトコンテナ.BehaviorEngineの一種 */ 00033 class PHChangeObjectContainer:public SGBehaviorEngine{ 00034 SGOBJECTDEF(PHChangeObjectContainer); 00035 public: 00036 PHChangeObjects cos; 00037 /// 00038 bool AddChildObject(SGObject* o, SGScene* s); 00039 /// 00040 int GetPriority() const {return SGBP_CHANGEOBJECT;} 00041 virtual void Step(SGScene* s); 00042 virtual void Loaded(SGScene* scene); 00043 virtual void Clear(SGScene* s){ cos.clear(); } 00044 virtual size_t NChildObjects(){ return cos.size(); } 00045 virtual SGObject* ChildObject(size_t i){ return cos[i]; } 00046 }; 00047 00048 /** 指定フレームへの衝突の有無で,入れ替え処理を行うか判断 */ 00049 class PHChangeObjectCollision:public PHChangeObject, CDCollisionListener { 00050 SGOBJECTDEF(PHChangeObjectCollision); 00051 00052 public: 00053 UTRef<SGFrame> detectorFrame; ///< 検出用フレーム 00054 bool bCollision; ///< 接触フラグ 00055 protected: 00056 int listenerPos; ///< リスナの位置 00057 00058 public: 00059 /// 00060 bool AddChildObject(SGObject* o, SGScene* s); 00061 /// 接触時にCDCollisionEngine::Step()から呼ばれるコールバック.接触フラグをTRUEにする 00062 void After(SGScene* scene, CDFramePairWithRecord* fr); 00063 /// クリア 00064 virtual void Clear(); 00065 /// 接触フラグの結果を返し,次のステップに備えてフラグをFALSEに初期化する 00066 virtual bool IsChange(); 00067 /// ロード完了時の処理,CDCollisionEngine にコールバックを登録する.CDCollisionEngine がなければ作る. 00068 virtual void Loaded(SGScene* scene); 00069 }; 00070 00071 /** Solidの姿勢と比較用姿勢行列を比べて,入れ替え処理を行うか判断 */ 00072 class PHChangeObjectOrientation:public PHChangeObject { 00073 SGOBJECTDEF(PHChangeObjectOrientation); 00074 00075 public: 00076 Matrix3d comparativeOrientation; ///< 比較用姿勢行列 00077 UTRef<SGFrame> comparativeFrame; ///< 比較用フレーム(データファイルに記述されているときだけ使う) 00078 Vec3d selectedAxis; ///< 比較する軸の選択(x,y,z) この軸はSolidの座標系 00079 Vec3d targetedInnerProduct; ///< 目標内積値(xの内積,yの内積,内積) 00080 Vec3d accuracy; ///< 目標内積値の精度 00081 public: 00082 /// 00083 bool AddChildObject(SGObject* o, SGScene* s); 00084 /// クリア 00085 virtual void Clear(); 00086 /// 入れ替えを行うかどうかの判定 00087 virtual bool IsChange(); 00088 }; 00089 00090 /** データのロード・セーブ用の構造体 */ 00091 struct PHChangeObjectOrientationInfo{ 00092 Vec3f selectedAxis; 00093 Matrix3f comparativeOrientation; 00094 Vec3f targetedInnerProduct; 00095 Vec3f accuracy; 00096 }; 00097 00098 }; 00099 #endif