OROCHI
 
Loading...
Searching...
No Matches
GxUnitClothModel.h
Go to the documentation of this file.
1//===========================================================================
10//===========================================================================
11#pragma once
12
13GX_UTILITY_NAMESPACE_BEGIN()
14//===========================================================================
16//===========================================================================
18{
19 //-----------------------------------------------------------
21 //-----------------------------------------------------------
23public:
24 // RTTI宣言
25 GX_RTTI_CLASS_NAME(GxUnitClothModel, GxUnitClothBase, "モデル基準布")
26 // ClassBaseReference継承クラス用禁止宣言
28
29
30 enum class UCM_UPDATESTATE
31 {
32 RESET_TO_SIMULATION,
33 SIMULATION,
34 INTERPOLATION_TO_MOTION,
35 MOTION,
36 };
37
39
43 {
44 //-----------------------------------------------------------
46 //-----------------------------------------------------------
48
51
53 //-----------------------------------------------------------
55 //-----------------------------------------------------------
57
60 _quaternionOld(GxQuaternion::IDENTITY),
61 _jointIndex(-1),
62 _radius(0.0f),
63 _twistLimit(PI),
64 _isHitBack(false),
65 _twist(GxQuaternion::IDENTITY),
66 _angleLimit(PI),
67 _baseRatio(0.0f),
68 _windRatio(GxVector3::ONE),
69 _isEnableLink(true)
70 {}
71
73 //-----------------------------------------------------------
75 //-----------------------------------------------------------
77
81 f32 _radius;
92
94 };
95
97 //-----------------------------------------------------------
99 //-----------------------------------------------------------
101
103 GxUnitClothModel(void);
104
106 void cleanup(void) override;
107
109 //-----------------------------------------------------------
111 //-----------------------------------------------------------
113
115 void kill(void) override;
116
119
120protected:
122 b32 setup(void) override;
124 void postAsyncUpdate(void) override;
125
126protected:
128 void resetup(void);
130 b32 interpolateToMotion(void);
131
133 virtual void updateModel(void);
135 virtual void updateInterpolateModel(void);
136
137 // 以下、手法を変えるときのみオーバーライド
138
140 b32 isWarp(void) override;
142 void updateInitialize(void) override;
144 void interpolatePosition(f32 updateRatio, f32 updateRatioOld) override;
146 void calculateExternalForce(GxVector3& windDirect) override;
148 void calculateHitBackForce(f32 updateRatio, f32 updateRatioOld) override;
150 void updateConstraint(void) override;
152 virtual b32 analyseCollisionJoint(GxUnitSoftbodyCollision::GxHitBase* pHitBase);
154 virtual void updateCollisionAfterSimulation(void);
155
156#if GX_DEVELOP
158 void developRender(void) override;
159#endif //GX_DEVELOP
160
162 //-----------------------------------------------------------
164 //-----------------------------------------------------------
166public:
168 virtual void setAdditionalData(GxResSoftbodySimulation::GxSoftbodyClothAdditionalData * pResourceAdditionalData);
169
171 GX_FORCE_INLINE b32 isMotionGravity(void) const { return _isUseMotionGravity; }
173 GX_FORCE_INLINE void setIsMotionGravity(b32 enable) { _isUseMotionGravity = enable; }
174
176
183 void setMotionGravity(b32 enable, f32 gravityForce, const GxVector3& gravityDirection = -GxVector3::AXIS_Y);
184
186
189 constexpr void reset(void) { _updateState = UCM_UPDATESTATE::RESET_TO_SIMULATION; }
190
192 GX_FORCE_INLINE b32 isClothSimulation(void) const { return _isClothSimulation; }
194
198 GX_FORCE_INLINE void setIsClothSimulation(b32 enable) { _isClothSimulation = enable; }
199
201
205 GX_FORCE_INLINE b32 isInterpolateToMotion(void) const { return ( UCM_UPDATESTATE::INTERPOLATION_TO_MOTION == _updateState ); }
206
208 GX_FORCE_INLINE void forceDisableClothSimulation(void) { _isClothSimulation = false; _updateState = UCM_UPDATESTATE::MOTION; }
209
211 constexpr f32 getInterpolateTime(void) const { return _interpolateTime; }
213 constexpr void setInterpolateTime(f32 time) { _interpolateTime = time; }
214
215public:
217 GX_FORCE_INLINE const GxAdditionalData** getAdditionalData(void) const { return const_cast<const GxAdditionalData**>(_ppAdditionalData); }
218
220 constexpr s32 getJointIndex(u32 pointIndex, u32 lineIndex) const { return _ppAdditionalData[lineIndex][pointIndex]._jointIndex; }
222 constexpr void setJointIndex(u32 pointIndex, u32 lineIndex, s32 no) { _ppAdditionalData[lineIndex][pointIndex]._jointIndex = no; }
223
225 GX_FORCE_INLINE const GxQuaternion& getOldQuaternion(u32 pointIndex, u32 lineIndex) const { return _ppAdditionalData[lineIndex][pointIndex]._quaternionOld; }
227 GX_FORCE_INLINE void setOldQuaternion(u32 pointIndex, u32 lineIndex, GxQuaternion & quaternion) { _ppAdditionalData[lineIndex][pointIndex]._quaternionOld = quaternion; }
228
230 constexpr f32 getRadius(u32 pointIndex, u32 lineIndex) const { return _ppAdditionalData[lineIndex][pointIndex]._radius; }
232 constexpr void setRadius(u32 pointIndex, u32 lineIndex, f32 radius) { _ppAdditionalData[lineIndex][pointIndex]._radius = radius; }
233
235 GX_FORCE_INLINE const GxQuaternion& getTwist(u32 pointIndex, u32 lineIndex) const { return _ppAdditionalData[lineIndex][pointIndex]._twist; }
237 GX_FORCE_INLINE void setTwist(u32 pointIndex, u32 lineIndex, const GxQuaternion & twist) { _ppAdditionalData[lineIndex][pointIndex]._twist = twist; }
238
240 constexpr f32 getTwistLimit(u32 pointIndex, u32 lineIndex) const { return _ppAdditionalData[lineIndex][pointIndex]._twistLimit; }
242 constexpr void setTwistLimit(u32 pointIndex, u32 lineIndex, f32 limit) { _ppAdditionalData[lineIndex][pointIndex]._twistLimit = limit; }
243
245 GX_FORCE_INLINE const GxVector3& getHitBackDir(u32 pointIndex, u32 lineIndex) const { return _ppAdditionalData[lineIndex][pointIndex]._hitBackDirect; }
247 GX_FORCE_INLINE void setHitBackDir(u32 pointIndex, u32 lineIndex, const GxVector3 & direct) { _ppAdditionalData[lineIndex][pointIndex]._hitBackDirect = direct; }
248
250 GX_FORCE_INLINE b32 isHitBack(u32 pointIndex, u32 lineIndex) const { return _ppAdditionalData[lineIndex][pointIndex]._isHitBack; }
252 GX_FORCE_INLINE void setIsHitBack(u32 pointIndex, u32 lineIndex, b32 isHitBack) { _ppAdditionalData[lineIndex][pointIndex]._isHitBack = isHitBack; }
253
254 // Normal は GxCell と GxAdditionalData の両方に存在するので注意
256 GX_FORCE_INLINE const GxVector3& getAdditionalNormal(u32 pointIndex, u32 lineIndex) const { return _ppAdditionalData[lineIndex][pointIndex]._normal; }
258 GX_FORCE_INLINE void setAdditionalNormal(u32 pointIndex, u32 lineIndex, const GxVector3& normal) { _ppAdditionalData[lineIndex][pointIndex]._normal = normal; }
259
261 constexpr f32 getAngleLimit(u32 pointIndex, u32 lineIndex) const { return _ppAdditionalData[lineIndex][pointIndex]._angleLimit; }
263 constexpr void setAngleLimit(u32 pointIndex, u32 lineIndex, f32 limit) { _ppAdditionalData[lineIndex][pointIndex]._angleLimit = limit; }
264
266 GX_FORCE_INLINE const GxVector3& getAngleAxis(u32 pointIndex, u32 lineIndex) const { return _ppAdditionalData[lineIndex][pointIndex]._angleAxis; }
268 GX_FORCE_INLINE void setAngleAxis(u32 pointIndex, u32 lineIndex, const GxVector3& axis) { _ppAdditionalData[lineIndex][pointIndex]._angleAxis = axis; }
269
271 constexpr f32 getBaseRatio(u32 pointIndex, u32 lineIndex) const { return _ppAdditionalData[lineIndex][pointIndex]._baseRatio; }
273 constexpr void setBaseRatio(u32 pointIndex, u32 lineIndex, f32 baseRatio) { _ppAdditionalData[lineIndex][pointIndex]._baseRatio = baseRatio; }
274
276 GX_FORCE_INLINE GxVector3 getWindRatio(u32 pointIndex, u32 lineIndex) const { return _ppAdditionalData[lineIndex][pointIndex]._windRatio; }
278 GX_FORCE_INLINE void setWindRatio(u32 pointIndex, u32 lineIndex, GxVector3& windRatio) { _ppAdditionalData[lineIndex][pointIndex]._windRatio = windRatio; }
279
281 constexpr u32 getID(void) const { return _id; }
282
284 constexpr u32 getPointCount(void) const { return _pointCount; }
286 constexpr u32 getLineCount(void) const { return _lineCount; }
287
288#if GX_DEVELOP
290 GX_FORCE_INLINE void setSelectMassPointIndex(u32 pointIndex, u32 lineIndex){ _selectPointIndex = GxMath::getMin<u32>(_pointCount - 1, pointIndex); _selectLineIndex = GxMath::getMin<u32>(_lineCount - 1, lineIndex); }
292 constexpr void getSelectPointIndex(void* const pValue) { *static_cast<u32*>(pValue) = _selectPointIndex; }
294 GX_FORCE_INLINE void setSelectPointIndex(const void* const pValue){ _selectPointIndex = GxMath::getMin<u32>(_pointCount - 1, *static_cast<u32*>(const_cast<void*>(pValue))); }
296 constexpr void getSelectLineIndex(void* const pValue) { *static_cast<u32*>(pValue) = _selectLineIndex; }
298 GX_FORCE_INLINE void setSelectLineIndex(const void* const pValue){ _selectLineIndex = GxMath::getMin<u32>(_lineCount - 1, *static_cast<u32*>(const_cast<void*>(pValue))); }
300 GX_FORCE_INLINE b32 isForceDevelopRneder(void) const { return _isForceDevelopRneder; }
302 GX_FORCE_INLINE void setForceDevelopRneder(b32 enable) { _isForceDevelopRneder = enable; }
303#endif // GX_DEVELOP
304
306 //-----------------------------------------------------------
308 //-----------------------------------------------------------
310protected:
313
316
322
324
327
328#if GX_DEVELOP
329 u32 _selectPointIndex;
330 u32 _selectLineIndex;
331 b32 _isForceDevelopRneder;
332#endif // GX_DEVELOP
333
335};
336
337GX_UTILITY_NAMESPACE_END()
#define GX_PROHIBIT_CLASS_BASE_REFERENCE(__CLASS__)
GxClassBaseReference継承の禁止宣言(new以外の生成禁止 + コピー禁止)
Definition GxBase.h:244
@ MOTION
モーション
@ IDENTITY
基礎値で初期化
static GX_FORCE_INLINE T getMin(const T value0, const T value1)
小さいほうを取得
Definition GxMath.h:172
布用追加データ(質点個別データ)
Definition GxResSoftbodySimulation.h:424
布データクラス
Definition GxResSoftbodySimulation.h:196
基準布クラス
Definition GxUnitClothBase.h:18
モデルベース布クラス
Definition GxUnitClothModel.h:18
constexpr f32 getRadius(u32 pointIndex, u32 lineIndex) const
各質点の当たり半径を取得
Definition GxUnitClothModel.h:230
GX_FORCE_INLINE const GxAdditionalData ** getAdditionalData(void) const
モデル基準鎖追加情報取得
Definition GxUnitClothModel.h:217
constexpr void setRadius(u32 pointIndex, u32 lineIndex, f32 radius)
各質点の当たり半径を設定
Definition GxUnitClothModel.h:232
constexpr void setTwistLimit(u32 pointIndex, u32 lineIndex, f32 limit)
ねじれ回転限界角度設定
Definition GxUnitClothModel.h:242
GX_FORCE_INLINE GxVector3 getWindRatio(u32 pointIndex, u32 lineIndex) const
風を受ける割合を取得
Definition GxUnitClothModel.h:276
constexpr u32 getLineCount(void) const
列数を取得
Definition GxUnitClothModel.h:286
GX_FORCE_INLINE b32 isHitBack(u32 pointIndex, u32 lineIndex) const
ねじれ計算用当たり方向取得
Definition GxUnitClothModel.h:250
constexpr void setAngleLimit(u32 pointIndex, u32 lineIndex, f32 limit)
回転限界角度設定
Definition GxUnitClothModel.h:263
GxAdditionalData ** _ppAdditionalData
追加データ
Definition GxUnitClothModel.h:314
constexpr void reset(void)
外から呼べるリセット
Definition GxUnitClothModel.h:189
b32 _isUseMotionGravity
モーションに収束させるために重力方向を修正するかフラグ
Definition GxUnitClothModel.h:312
GX_FORCE_INLINE void setAngleAxis(u32 pointIndex, u32 lineIndex, const GxVector3 &axis)
回転角度基準軸設定
Definition GxUnitClothModel.h:268
GX_FORCE_INLINE void setAdditionalNormal(u32 pointIndex, u32 lineIndex, const GxVector3 &normal)
追加情報法線設定
Definition GxUnitClothModel.h:258
constexpr void setJointIndex(u32 pointIndex, u32 lineIndex, s32 no)
モデル関節番号設定
Definition GxUnitClothModel.h:222
UCM_UPDATESTATE
状態遷移
Definition GxUnitClothModel.h:31
GxUnitModelBase * _pParentModel
変更するモデル
Definition GxUnitClothModel.h:315
GX_FORCE_INLINE void setIsMotionGravity(b32 enable)
重力を修正してモーションへ収束させるか設定
Definition GxUnitClothModel.h:173
constexpr void setInterpolateTime(f32 time)
補間時間の設定(シミュレーション→モーションの補間にかける時間)
Definition GxUnitClothModel.h:213
GX_FORCE_INLINE b32 isClothSimulation(void) const
有効/無効の取得
Definition GxUnitClothModel.h:192
constexpr f32 getInterpolateTime(void) const
補間時間の取得(シミュレーション→モーションの補間にかける時間)
Definition GxUnitClothModel.h:211
UCM_UPDATESTATE _updateState
モデルの更新とモーションの切り替え状態
Definition GxUnitClothModel.h:318
GX_FORCE_INLINE b32 isMotionGravity(void) const
重力を修正してモーションへ収束させるか取得
Definition GxUnitClothModel.h:171
constexpr f32 getTwistLimit(u32 pointIndex, u32 lineIndex) const
ねじれ回転限界角度取得
Definition GxUnitClothModel.h:240
GX_FORCE_INLINE const GxVector3 & getAdditionalNormal(u32 pointIndex, u32 lineIndex) const
追加情報法線取得
Definition GxUnitClothModel.h:256
GX_FORCE_INLINE void setIsClothSimulation(b32 enable)
有効/無効の設定(シミュレーションとモーションを補間して遷移)
Definition GxUnitClothModel.h:198
b32 _isUseAdditionalData
追加データの有無フラグ
Definition GxUnitClothModel.h:311
constexpr void setBaseRatio(u32 pointIndex, u32 lineIndex, f32 baseRatio)
基姿勢の割合を設定
Definition GxUnitClothModel.h:273
b32 _isClothSimulation
クロスシミュレーションするかフラグ
Definition GxUnitClothModel.h:317
GX_FORCE_INLINE void setHitBackDir(u32 pointIndex, u32 lineIndex, const GxVector3 &direct)
追加情報による入力法線設定
Definition GxUnitClothModel.h:247
constexpr u32 getID(void) const
ID取得
Definition GxUnitClothModel.h:281
GX_FORCE_INLINE void setWindRatio(u32 pointIndex, u32 lineIndex, GxVector3 &windRatio)
風を受ける割合を設定
Definition GxUnitClothModel.h:278
GX_FORCE_INLINE const GxVector3 & getAngleAxis(u32 pointIndex, u32 lineIndex) const
回転角度基準軸取得
Definition GxUnitClothModel.h:266
GX_FORCE_INLINE void forceDisableClothSimulation(void)
シミュレーションを強制終了してモーションへ(補間しない)
Definition GxUnitClothModel.h:208
constexpr s32 getJointIndex(u32 pointIndex, u32 lineIndex) const
モデル関節番号取得
Definition GxUnitClothModel.h:220
constexpr u32 getPointCount(void) const
質点数を取得
Definition GxUnitClothModel.h:284
GX_FORCE_INLINE void setIsHitBack(u32 pointIndex, u32 lineIndex, b32 isHitBack)
ねじれ計算用当たり方向設定
Definition GxUnitClothModel.h:252
f32 _interpolateTime
補間にかける時間
Definition GxUnitClothModel.h:319
GX_FORCE_INLINE void setOldQuaternion(u32 pointIndex, u32 lineIndex, GxQuaternion &quaternion)
モーションへの補間のためのクォータニオンを設定
Definition GxUnitClothModel.h:227
GxVector3 * _pTailOffsetLocal
末端ボーンのオフセット ( Local Coodinate )
Definition GxUnitClothModel.h:325
GX_FORCE_INLINE const GxVector3 & getHitBackDir(u32 pointIndex, u32 lineIndex) const
追加情報による入力法線取得
Definition GxUnitClothModel.h:245
f32 _interpolateInnerTime
補間時間 ( 0.0f < t < 1.0f )
Definition GxUnitClothModel.h:320
constexpr f32 getAngleLimit(u32 pointIndex, u32 lineIndex) const
回転限界角度取得
Definition GxUnitClothModel.h:261
GX_FORCE_INLINE const GxQuaternion & getTwist(u32 pointIndex, u32 lineIndex) const
ねじれ回転取得
Definition GxUnitClothModel.h:235
b32 _isUpdateAllMatrix
UpdateWorldMatrix をするかフラグ
Definition GxUnitClothModel.h:321
GxVector3 * _pTailOffsetWorld
末端ボーンのオフセット ( World Coodinate )
Definition GxUnitClothModel.h:326
constexpr f32 getBaseRatio(u32 pointIndex, u32 lineIndex) const
基姿勢の割合を取得
Definition GxUnitClothModel.h:271
GX_FORCE_INLINE b32 isInterpolateToMotion(void) const
シミュレーションからモーションへ補間している状態かどうか取得
Definition GxUnitClothModel.h:205
GX_FORCE_INLINE void setTwist(u32 pointIndex, u32 lineIndex, const GxQuaternion &twist)
ねじれ回転設定
Definition GxUnitClothModel.h:237
f32 _twistInterpolateSpeed
ねじれ補間速度 ( 0.0f < t < 1.0f )
Definition GxUnitClothModel.h:323
GX_FORCE_INLINE const GxQuaternion & getOldQuaternion(u32 pointIndex, u32 lineIndex) const
モーションへの補間のためのクォータニオンを取得
Definition GxUnitClothModel.h:225
モデル基礎クラス
Definition GxUnitModelBase.h:19
クロスシミュレーション用コリジョンクラス : 基礎形状クラス
Definition GxUnitSoftbodyCollision.h:124
クォータニオン
Definition GxQuaternion.h:19
Definition GxBase.h:24
モデル基準布セルクラス
Definition GxUnitClothModel.h:43
GxQuaternion _twist
ねじれ回転、前フレームの値を保持
Definition GxUnitClothModel.h:86
GxVector3 _windRatio
風を受ける割合
Definition GxUnitClothModel.h:90
GxAdditionalData(void)
デフォルトコンストラクタ
Definition GxUnitClothModel.h:59
GxVector3 _angleAxis
回転角度基準軸
Definition GxUnitClothModel.h:87
GX_RTTI_STRUCT(GxUnitClothModel::GxAdditionalData)
RTTI宣言
f32 _radius
質点の当たり半径 // 一応ココでも保持
Definition GxUnitClothModel.h:81
f32 _twistLimit
ねじれ最大角度
Definition GxUnitClothModel.h:82
GxVector3 _hitBackDirect
ねじれ補間用当たり方向
Definition GxUnitClothModel.h:85
GxVector3 _normal
ねじれ用法線
Definition GxUnitClothModel.h:84
GxQuaternion _quaternionOld
布に必要なパラメータを追加
Definition GxUnitClothModel.h:79
f32 _angleLimit
回転角度限界
Definition GxUnitClothModel.h:88
s32 _jointIndex
準じるモデル関節の番号
Definition GxUnitClothModel.h:80
f32 _baseRatio
基姿勢の割合
Definition GxUnitClothModel.h:89
b32 _isEnableLink
列間の質点で繋がり(拘束)があるかどうか
Definition GxUnitClothModel.h:91
b32 _isHitBack
参照しているコリジョンに当たったかどうか
Definition GxUnitClothModel.h:83
3次元ベクトル
Definition GxVector.h:245
static const GxVector3 AXIS_Y
(0, 1, 0)
Definition GxVector.h:262
32bitブーリアン
Definition GxDefine.h:173