OROCHI
 
Loading...
Searching...
No Matches
GxAdjustHit.h
Go to the documentation of this file.
1//===========================================================================
10//===========================================================================
11#pragma once
12
14//===========================================================================
16//===========================================================================
18{
19 //-------------------------------------------------------------
21 //-------------------------------------------------------------
23public:
24 // RTTI定義
25 GX_RTTI_CLASS( GxAdjustHit, GxCollision )
26 // ClassBaseReference継承クラス用禁止宣言
28
29 class GxWorld;
30 class GxObject;
31
32protected:
35 {
36 END,
37 THROUGH_ONCE,
38 THROUGH_ONCE_OLD,
39 };
40
42 //-------------------------------------------------------------
44 //-------------------------------------------------------------
46
48 GxAdjustHit(void);
49
51 ~GxAdjustHit(void) override;
52
54 //-----------------------------------------------------------
56 //-----------------------------------------------------------
58
60 GxCollision::GxObject* allocObject(void) override;
61
63 GxObject* getObject(u32 index);
64
66 void initializeActiveOn(void) override;
67
69 void initializeActiveOff(void) override;
70
72 void initializeUpdate(void) override;
73
74private:
76 void initializeAdjustParameter( void );
77public:
79 virtual void initializeCheck(void);
80
87 virtual void checkOldPosition( GxRayResult& result, const GxVector3& moveVector, const GxVector3& offset, GxCollision::GxConditionInformation* pCondition = nullptr );
88
90 virtual const GxVector3& calculateAdjustVector( void );
91
92protected:
94 GX_FORCE_INLINE void setAdjustVector( const GxVector3& vector ) { _adjustVector = vector; }
95public:
97 GX_FORCE_INLINE const GxVector3& getAdjustVector(void) const { return _adjustVector; }
99 GX_FORCE_INLINE b32 isNeedAdjust(const GxVector3& vector) { return (vector.getLengthSquare() > FLT_EPSILON ) ? true : false; }
100
102 GX_FORCE_INLINE b32 isAdjustEnd(void) { return _adjustHitFlag.isFlag(ADJUST_FLAG_INDEX::END); }
104 GX_FORCE_INLINE void setAdjustEnd(b32 value) { _adjustHitFlag.setFlag(ADJUST_FLAG_INDEX::END, value); }
105
107 GX_FORCE_INLINE void setIsAdjustOldPositionThroughOnce(b32 value) { _adjustHitFlag.setFlag(ADJUST_FLAG_INDEX::THROUGH_ONCE, value); }
109 GX_FORCE_INLINE b32 isAdjustOldPositionThroughOnce(void) const { return _adjustHitFlag.isFlag(ADJUST_FLAG_INDEX::THROUGH_ONCE); }
110
112 void onAttributeAll(u32 attribute);
114 void offAttributeAll(u32 attribute);
115
116#if GX_DEVELOP
118 void developDrawObject(const GxColor& color = GxColor::WHITE, PRIMITIVE_FILL_MODE fillMode = PRIMITIVE_FILL_MODE::WIRE) override;
119#endif // GX_DEVELOP
120
121protected:
123 GxCollision::GxObject* addObject(void) override;
124
126 const GxVector3 calculateNormalAdjustVector(void);
127
129 //-----------------------------------------------------------
131 //-----------------------------------------------------------
133
135 constexpr static void setCheckMargin(f32 margin) { _checkMargin = margin; }
137 GX_FORCE_INLINE static f32 getCheckMargin(void) { return _checkMargin; }
138
140 void setObjectWeightAll(f32 weight);
141
142protected:
144 GX_FORCE_INLINE void getPropertyCheckMargin(void* const pValue) { *static_cast<f32*>(pValue) = _checkMargin; }
146 constexpr void setPropertyCheckMargin(const void* const pValue) { _checkMargin = *static_cast<f32*>(const_cast<void*>(pValue)); }
147
149 //-----------------------------------------------------------
151 //-----------------------------------------------------------
153protected:
154 static const f32 _distanceMin;
155 static const f32 _againstRadian;
156 static f32 _checkMargin;
157
158private:
159 GxVector3 _adjustVectorOld;
160 GxVector3 _adjustVector;
161 GxFlag32Index<ADJUST_FLAG_INDEX> _adjustHitFlag;
162
164};
165
166//===========================================================================
168//===========================================================================
170{
171 //-------------------------------------------------------------
173 //-------------------------------------------------------------
175public:
177 // ClassBaseReference継承クラス用禁止宣言
179
180protected:
183 {
184 //-----------------------------------------------------------
186 //-----------------------------------------------------------
188
190 GxAdjustInfo(void) : _normal(0.f, 0.f, 0.f), _adjustLength(0.0f){}
191
193 //-----------------------------------------------------------
195 //-----------------------------------------------------------
197
198 btVector3 _normal;
199 btScalar _adjustLength;
200#if GX_DEVELOP
201 btVector3 _hitOnB;
202#endif // GX_DEVELOP
203
205 };
206
208 //-----------------------------------------------------------
210 //-----------------------------------------------------------
212public:
214 GxWorld(void);
216 ~GxWorld( void ) override;
217
219 //-----------------------------------------------------------
221 //-----------------------------------------------------------
223
227 void check(void) override;
228
231 // note:旧hit()
232 void postBulletUpdate(void) override;
233
235 // note:旧adjust()
236 void executePostCheckCallback(void) override;
237
238protected:
240 void calculateAdjustInformation(btPersistentManifold* pPersistentManifold);
241
243 virtual void calculateAdjustVector( GxObject* pObjectA, GxObject* pObjectB, const GxAdjustInfo& adjustInfo );
244
246 void addAdjustInformation( GxObject* pObject, const f32 length, const GxVector3& normal );
247
249 virtual f32 calculateAdjustRate( GxObject* pObjectA, GxObject* pObjectB);
250
252 //-----------------------------------------------------------
254 //-----------------------------------------------------------
256
258
260};
261
262//===========================================================================
264//===========================================================================
266{
267 //-------------------------------------------------------------
269 //-------------------------------------------------------------
271public:
272 // RTTI定義
274 // ClassBaseReference継承クラス用禁止宣言
276
277protected:
287public:
295
296#if GX_DEVELOP
298 struct GxPenetration : public GxStructBase
299 {
300 //-------------------------------------------------------------
302 //-------------------------------------------------------------
304
305 // RTTI定義
306 GX_RTTI_STRUCT(GxPenetration);
307 // new, delete定義
308 GX_OPERATOR_NEW_DELETE_USE_ARRAY(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP);
309
311 //-----------------------------------------------------------
313 //-----------------------------------------------------------
315
317 GxPenetration(void) : _depth(0.f) {}
318
320 //-----------------------------------------------------------
322 //-----------------------------------------------------------
324
325 GxVector3 _hitPosition;
326 GxVector3 _normal;
327 f32 _depth;
328
330 };
331
333 static constexpr u32 HIT_TRIMESH_INDEX_INCREMENT = 10;
335 static constexpr u32 PENETRATION_MAX = 10;
336#endif //GX_DEVELOP
337
339 //-----------------------------------------------------------
341 //-----------------------------------------------------------
343
345 GxObject(void);
346
348 ~GxObject(void) override;
349
351 void initialize(b32 active, u32 id, const GxMatrixAffine* pMatrix0, const GxVector3& offset0, const GxMatrixAffine* pMatrix1, const GxVector3& offset1) override;
352
354 //-----------------------------------------------------------
356 //-----------------------------------------------------------
358
360 void initializeActiveOn(void) override;
361
363 void initializeActiveOff(void) override;
364
365private:
367 void initializeAdjustParameter( void );
368
369public:
371 void initializeUpdate(void) override;
372
374 void initializeCheck(void);
375
377 b32 isNeedCheck(GxCollision::GxObject* pCollisionObject) override;
378
380 b32 isAdjustEnd(void);
381
383 void checkOldPosition( GxRayResult& result, const GxVector3& moveVector, const GxVector3& offset, GxCollision::GxConditionInformation* pCondition );
384
385#if GX_DEVELOP
387 static GxGuiBase* createGui(GxProperty& property, GxTypedObject* pOwner, const GxRtti& rtti, u32 index = 0);
388
390 void developDraw(const GxColor& color, PRIMITIVE_FILL_MODE fillMode = PRIMITIVE_FILL_MODE::WIRE) override;
391
393 void developDrawTrimesh(GxShapeTrimesh* pTrimesh, const GxColor& color, PRIMITIVE_FILL_MODE fillMode = PRIMITIVE_FILL_MODE::WIRE) override;
394
396 void drawPenetration(const GxColor& color, const f32 ratio);
398 void addPenetration(const GxVector3& hitPosition, const f32 depth, const GxVector3& normal);
399#endif // GX_DEVELOP
400
402 //-----------------------------------------------------------
404 //-----------------------------------------------------------
406
408 constexpr u32 getAttribute(void) const { return _attribute; }
410 constexpr void setAttribute(u32 attribute) { _attribute = attribute; }
412 constexpr void onAttribute(u32 attribute) { _attribute |= attribute; }
414 constexpr void offAttribute(u32 attribute) { _attribute &= ~attribute; }
415
417 GX_FORCE_INLINE const GxVector3& getPlaneNormal(void) const { return _planeNormal; }
419 GX_FORCE_INLINE void setPlaneNormal(const GxVector3& normal) { _planeNormal = normal; }
420
422 GX_FORCE_INLINE const GxVector3& getAdjustVector(void) const { return _adjustVector; }
424 GX_FORCE_INLINE void setAdjustVector(const GxVector3& vector) { _adjustVector = vector; }
425
427 constexpr f32 getWeight(void) const { return _weight; }
429 constexpr void setWeight(f32 weight) { _weight = weight; }
430
431#if GX_DEVELOP
433 GX_FORCE_INLINE b32 isHitDevelop(void) const { return _isHitDevelop; }
435 GX_FORCE_INLINE void setIsHitDevelop(b32 isHit) { _isHitDevelop = isHit; }
437 constexpr u32 getCountHitTrimeshIndex(void) const { return _countHitTrimeshIndex; }
439 constexpr void setCountHitTrimeshIndex(u32 count) { _countHitTrimeshIndex = count; }
440
442 void getPropertyHitTrimeshIndex(void* pValue, u32 index);
444 void setPropertyHitTrimeshIndex(const void* pValue, u32 index);
446 u32 getPropertyHitTrimeshIndexCount(void) const;
448 void setPropertyHitTrimeshIndexCount(u32 count);
449
451 constexpr u32 getPenetrationIndex(void) const { return _penetrationIndex; }
453 GX_FORCE_INLINE const GxPenetration& getPenetration(u32 index) const { return _pPenetration[index]; }
454#endif //GX_DEVELOP
455
457 //-----------------------------------------------------------
459 //-----------------------------------------------------------
461private:
462 GxVector3 _planeNormal;
463 GxVector3 _adjustVector;
464 u32 _attribute;
465 f32 _weight;
466
467#if GX_DEVELOP
468 b32 _isHitDevelop;
469 s32* _pHitTrimeshIndex;
470 u32 _countHitTrimeshIndex;
471 u32 _maxHitTrimeshIndex;
472
473 GxPenetration* _pPenetration;
474 u32 _penetrationIndex;
475#endif // GX_DEVELOP
476
478};
479
480GX_PHYSICS_NAMESPACE_END()
#define GX_PROHIBIT_CLASS_BASE(__CLASS__)
GxClassBase継承の禁止宣言
Definition GxBase.h:240
void GxTypedObject
その他
Definition GxDefine.h:213
#define GX_PHYSICS_NAMESPACE_BEGIN()
ネームスペースマクロ
Definition GxPhysics.h:28
PRIMITIVE_FILL_MODE
塗りつぶしモード
Definition GxPrimitive.h:31
@ WIRE
ワイヤーフレーム
背景あたりオブジェクトクラス
Definition GxAdjustHit.h:266
GX_FORCE_INLINE void setPlaneNormal(const GxVector3 &normal)
乗っている面の法線の設定
Definition GxAdjustHit.h:419
constexpr u32 getAttribute(void) const
属性取得
Definition GxAdjustHit.h:408
void initializeActiveOff(void) override
アクティブOFF時のパラメータ初期化
Definition GxAdjustHit.cpp:649
b32 isAdjustEnd(void)
補正が終了したか判定
Definition GxAdjustHit.cpp:739
GX_FORCE_INLINE const GxVector3 & getPlaneNormal(void) const
乗っている面の法線の取得
Definition GxAdjustHit.h:417
constexpr void offAttribute(u32 attribute)
属性無効化
Definition GxAdjustHit.h:414
b32 isNeedCheck(GxCollision::GxObject *pCollisionObject) override
お互いの当たり判定が必要か判定
Definition GxAdjustHit.cpp:715
GX_FORCE_INLINE const GxVector3 & getAdjustVector(void) const
補正方向の取得
Definition GxAdjustHit.h:422
constexpr void setAttribute(u32 attribute)
属性設定
Definition GxAdjustHit.h:410
constexpr void setWeight(f32 weight)
重さの設定
Definition GxAdjustHit.h:429
constexpr void onAttribute(u32 attribute)
属性有効化
Definition GxAdjustHit.h:412
ATTRIBUTE
Definition GxAdjustHit.h:291
@ ATTRIBUTE_POSITION_OLD_CHECK
OLD位置とPOS位置でラインチェックを行う
Definition GxAdjustHit.h:292
@ ATTRIBUTE_DISABLE_POSITION_OLD_CHECK_ONCE
一度だけOLD->POSチェックをしない(ツールでは設定できない)
Definition GxAdjustHit.h:293
GX_FORCE_INLINE void setAdjustVector(const GxVector3 &vector)
補正方向の設定
Definition GxAdjustHit.h:424
void initialize(b32 active, u32 id, const GxMatrixAffine *pMatrix0, const GxVector3 &offset0, const GxMatrixAffine *pMatrix1, const GxVector3 &offset1) override
初期化
Definition GxAdjustHit.cpp:628
void initializeUpdate(void) override
更新時のパラメータ初期化(1フレームに複数回呼ばれる可能性もある)
Definition GxAdjustHit.cpp:668
constexpr f32 getWeight(void) const
重さの取得
Definition GxAdjustHit.h:427
SHIFT
属性定義用シフト量定義
Definition GxAdjustHit.h:280
@ ADJUST_HIT_DUMMY_0
補正当たりダミー
@ DISABLE_POSITION_OLD_CHECK_ONCE
前回の座標チェック無効
@ POSITION_OLD_CHECK
前回の座標チェック
@ ADJUST_HIT_MAX
補正当たり最大数
@ ADJUST_HIT_DUMMY_1
補正当たりダミー
~GxObject(void) override
デストラクタ
Definition GxAdjustHit.cpp:611
void checkOldPosition(GxRayResult &result, const GxVector3 &moveVector, const GxVector3 &offset, GxCollision::GxConditionInformation *pCondition)
現在位置と前回位置の貫通判定
Definition GxAdjustHit.cpp:757
GxObject(void)
デフォルトコンストラクタ
Definition GxAdjustHit.cpp:590
void initializeCheck(void)
チェック時のパラメータ初期化(1フレームに1回)
Definition GxAdjustHit.cpp:680
void initializeActiveOn(void) override
アクティブON時のパラメータ初期化
Definition GxAdjustHit.cpp:640
背景あたりワールドクラス
Definition GxAdjustHit.h:170
GxWorld(void)
デフォルトコンストラクタ
Definition GxAdjustHit.cpp:300
void calculateAdjustInformation(btPersistentManifold *pPersistentManifold)
ヒットしたオブジェクト同士の補正情報計算
Definition GxAdjustHit.cpp:415
virtual f32 calculateAdjustRate(GxObject *pObjectA, GxObject *pObjectB)
補正割合の計算
Definition GxAdjustHit.cpp:547
void check(void) override
Definition GxAdjustHit.cpp:318
void postBulletUpdate(void) override
Definition GxAdjustHit.cpp:360
void addAdjustInformation(GxObject *pObject, const f32 length, const GxVector3 &normal)
補正情報の追加
Definition GxAdjustHit.cpp:519
u32 _checkLoopMax
最大チェック回数(増やすとカドでのガタガタ等が減る。ただし重くなる。)
Definition GxAdjustHit.h:257
~GxWorld(void) override
デストラクタ
Definition GxAdjustHit.cpp:311
void executePostCheckCallback(void) override
チェック後コールバックを実行
Definition GxAdjustHit.cpp:386
補正あたりクラス
Definition GxAdjustHit.h:18
GX_FORCE_INLINE void setAdjustVector(const GxVector3 &vector)
補正ベクトルの設定
Definition GxAdjustHit.h:94
static const f32 _distanceMin
これ以上埋まっていないと補正しない
Definition GxAdjustHit.h:154
GX_FORCE_INLINE void getPropertyCheckMargin(void *const pValue)
当たり判定マージン取得
Definition GxAdjustHit.h:144
static const f32 _againstRadian
反対方向に押されているのかどうか
Definition GxAdjustHit.h:155
static constexpr void setCheckMargin(f32 margin)
当たり判定用マージン設定
Definition GxAdjustHit.h:135
GX_FORCE_INLINE b32 isAdjustEnd(void)
補正が終了したか判定
Definition GxAdjustHit.h:102
GX_FORCE_INLINE b32 isAdjustOldPositionThroughOnce(void) const
Pos~Old間のチェックを一度スルーする判定
Definition GxAdjustHit.h:109
GX_FORCE_INLINE const GxVector3 & getAdjustVector(void) const
補正ベクトルの取得
Definition GxAdjustHit.h:97
GX_FORCE_INLINE b32 isNeedAdjust(const GxVector3 &vector)
補正が必要か判定
Definition GxAdjustHit.h:99
GX_FORCE_INLINE void setIsAdjustOldPositionThroughOnce(b32 value)
Pos~Old間のチェックを一度スルーする設定
Definition GxAdjustHit.h:107
constexpr void setPropertyCheckMargin(const void *const pValue)
当たり判定マージン設定
Definition GxAdjustHit.h:146
GX_FORCE_INLINE void setAdjustEnd(b32 value)
補正が終了したか設定
Definition GxAdjustHit.h:104
static f32 _checkMargin
判定用マージン
Definition GxAdjustHit.h:156
ADJUST_FLAG_INDEX
補正用フラグ
Definition GxAdjustHit.h:35
static GX_FORCE_INLINE f32 getCheckMargin(void)
当たり判定用マージン取得
Definition GxAdjustHit.h:137
virtual const GxVector3 & calculateAdjustVector(void)
当たり判定後の補正処理
Definition GxAdjustHit.cpp:168
Definition GxCollision.h:806
Collision基本オブジェクトクラス
Definition GxCollision.h:489
Collision基本ワールドクラス
Definition GxCollision.h:236
コリジョン基本クラス
Definition GxCollision.h:20
プロパティクラス
Definition GxProperty.h:48
実行時型情報クラス
Definition GxRtti.h:154
三角メッシュ形状クラス
Definition GxShape.h:912
補正情報構造体
Definition GxAdjustHit.h:183
btScalar _adjustLength
補正距離
Definition GxAdjustHit.h:199
GxAdjustInfo(void)
デフォルトコンストラクタ
Definition GxAdjustHit.h:190
btVector3 _normal
補正方向
Definition GxAdjustHit.h:198
Definition GxColor.h:21
static const GxColor WHITE
Definition GxColor.h:37
インデックス指定型フラグ
Definition GxStruct.h:1294
アフィン変換行列(行優先)
Definition GxMatrix.h:330
Definition GxBase.h:24
3次元ベクトル
Definition GxVector.h:245
GX_FORCE_INLINE f32 getLengthSquare(void) const
長さの2乗を取得
Definition GxVector.inl:1392
32bitブーリアン
Definition GxDefine.h:173