1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
|
//
// Generated by dtk
// Translation Unit: d_jnt_hit.cpp
//
#include "d/dolzel.h" // IWYU pragma: keep
#include "d/d_jnt_hit.h"
#include "m_Do/m_Do_mtx.h"
#include "SSystem/SComponent/c_math.h"
#include "SSystem/SComponent/c_lib.h"
/* 80060BE8-80060C44 .text __ct__12JntHit_HIO_cFv */
JntHit_HIO_c::JntHit_HIO_c() {
m06 = 0;
m08 = 0;
m0C = 50.0f;
m10 = cXyz::Zero;
m1C = 0.0f;
m20 = 0.0f;
m24 = 100.0f;
mNo = -1;
}
/* 80060C44-80060EC4 .text CreateInit__8JntHit_cFv */
BOOL JntHit_c::CreateInit() {
__jnt_hit_data_c* pHitData = mpSearchData;
int posCount = 0;
int i;
for (i = 0; i < mMaxNum; i++) {
if (isCylinder(pHitData->mShapeType)) {
posCount += 2;
} else if (isSphere(pHitData->mShapeType)) {
posCount += 1;
}
pHitData++;
}
mpShapeTypes = new s16[mMaxNum];
mpOffsets = new cXyz[posCount];
mpRadiuses = new f32[mMaxNum];
mpJointIndexes = new s16[mMaxNum];
if (!mpShapeTypes || !mpOffsets || !mpRadiuses || !mpJointIndexes) {
return FALSE;
}
pHitData = mpSearchData;
s16* pShapeType = mpShapeTypes;
s16* pJointIndex = mpJointIndexes;
f32* pRadius = mpRadiuses;
cXyz* pOffset = mpOffsets;
for (i = 0; i < mMaxNum;) {
pShapeType[0] = pHitData->mShapeType;
pJointIndex[0] = pHitData->mJointIndex;
pRadius[0] = pHitData->mRadius;
if (isCylinder(pShapeType[0])) {
pOffset[0] = pHitData->mpOffsets[0];
pOffset[1] = pHitData->mpOffsets[1];
pOffset++;
} else if (isSphere(pShapeType[0])) {
pOffset[0] = pHitData->mpOffsets[0];
}
pOffset++;
i++;
pHitData++;
pShapeType++;
pJointIndex++;
pRadius++;
}
return TRUE;
}
/* 80060EC4-80061440 .text CylHitPosAngleOffset__8JntHit_cFP4cXyzP5csXyzP4cXyzP5csXyz4cXyz4cXyzf */
BOOL JntHit_c::CylHitPosAngleOffset(cXyz* r27, csXyz* r28, cXyz* r29, csXyz* r30, cXyz r31, cXyz r9, f32 f28) {
cXyz r1_100 = r9 - r31;
cXyz r1_F4 = r1_100.normZP();
f32 f30 = r1_100.abs();
f32 f1 = r27->inprod(r1_F4);
cXyz r1_E8;
cXyz r1_DC = *r27;
cXyz r1_D0 = r1_F4;
r1_D0 *= f1;
r1_DC -= r1_D0;
f32 sinX = cM_ssin(r28->x);
f32 cosX = cM_scos(r28->x);
f32 sinY = cM_ssin(r28->y);
f32 cosY = cM_scos(r28->y);
cXyz r1_C4(cosX * sinY, -sinX, cosX * cosY);
f1 = r1_C4.inprod(r1_F4);
cXyz r1_B8 = r1_C4;
r1_D0 = r1_F4;
r1_D0 *= f1;
r1_B8 -= r1_D0;
if (r1_B8.normalizeRS()) {
f32 f31 = r1_DC.inprod(r1_B8);
f32 temp = f31*f31 + f28*f28 - r1_DC.abs2();
if (temp < 0.0f)
temp = 0.0f;
f32 temp2 = (-f31 - std::sqrtf(temp));
r1_E8 = r1_C4 * temp2;
r1_E8 += *r27;
if (temp == 0.0f) {
cXyz r1_AC = r1_E8;
r1_AC -= r1_F4 * r1_E8.inprod(r1_F4);
r1_AC.normalizeZP();
r1_AC = r1_AC * f28;
r1_AC += r1_F4 * r1_E8.inprod(r1_F4);
r1_E8 = r1_AC;
}
} else {
r1_E8 = *r27;
cXyz r1_A0 = *r27;
r1_A0 -= r1_F4 * r1_E8.inprod(r1_F4);
r1_A0.normalizeZP();
r1_A0 = r1_A0 * f28;
r1_A0 += r1_F4 * r1_E8.inprod(r1_F4);
r1_E8 = r1_A0;
}
f32 temp = r1_E8.inprod(r1_F4);
f32 temp2 = 0.0f;
if (temp < 0.0f)
temp2 = -temp;
else if (temp > f30)
temp2 = f30 - temp;
r1_E8 += r1_F4 * temp2;
r1_E8 += r31;
mDoMtx_stack_c::inverse();
mDoMtx_stack_c::transM(r1_E8);
mDoMtx_stack_c::ZXYrotM(*r28);
mDoMtx_stack_c::multVecZero(r29);
mDoMtx_MtxToRot(mDoMtx_stack_c::get(), r30);
return TRUE;
}
/* 80061440-80061830 .text Cyl2HitPosAngleOffset__8JntHit_cFP4cXyzP5csXyzP4cXyzP5csXyz4cXyz4cXyzf */
BOOL JntHit_c::Cyl2HitPosAngleOffset(cXyz* r27, csXyz* r29, cXyz* r30, csXyz* r31, cXyz r28, cXyz r9, f32 f31) {
cXyz r1_94 = r9 - r28;
cXyz r1_88 = r1_94.normZP();
f32 f29 = r1_94.abs();
f32 f30 = r27->inprod(r1_88);
f32 sinX = cM_ssin(r29->x);
f32 cosX = cM_scos(r29->x);
f32 sinY = cM_ssin(r29->y);
f32 cosY = cM_scos(r29->y);
cXyz r1_7C;
cXyz r1_70(cosX * sinY, -sinX, cosX * cosY);
f32 f1 = r1_70.inprod(r1_88);
if (!cLib_IsZero(f1)) {
if (f1 > 0.0f) {
f1 = -f30 / f1;
} else {
f1 = (f29 - f30) / f1;
}
cXyz r1_64 = r1_70;
r1_64 *= f1;
r1_7C = *r27 + r1_64;
} else {
r1_7C = *r27;
}
cXyz r1_58 = r1_7C;
f32 temp = r1_58.inprod(r1_88);
cXyz r1_4C = r1_88;
r1_4C *= temp;
r1_58 -= r1_4C;
cXyz r1_40 = r1_58;
if (r1_58.abs() > f31 && r1_58.normalizeRS()) {
r1_58 *= f31;
r1_58 = r1_40 - r1_58;
r1_7C -= r1_58;
}
r1_7C += r28;
mDoMtx_stack_c::inverse();
mDoMtx_stack_c::transM(r1_7C);
mDoMtx_stack_c::ZXYrotM(*r29);
mDoMtx_stack_c::multVecZero(r30);
mDoMtx_MtxToRot(mDoMtx_stack_c::get(), r31);
return TRUE;
}
/* 80061830-80061ACC .text SphHitPosAngleOffset__8JntHit_cFP4cXyzP5csXyzP4cXyzP5csXyz4cXyzf */
BOOL JntHit_c::SphHitPosAngleOffset(cXyz* r27, csXyz* r29, cXyz* r30, csXyz* r31, cXyz r28, f32 f30) {
f32 sinX = cM_ssin(r29->x);
f32 cosX = cM_scos(r29->x);
f32 sinY = cM_ssin(r29->y);
f32 cosY = cM_scos(r29->y);
cXyz r1_34(cosX * sinY, -sinX, cosX * cosY);
f32 f31 = r27->inprod(r1_34);
f32 temp = f31*f31 + f30*f30 - r27->abs2();
if (temp < 0.0f)
temp = 0.0f;
f32 temp2 = (-f31 - std::sqrtf(temp));
cXyz r1_28 = r1_34 * temp2;
r1_28 += *r27;
if (r1_28.abs() > f30) {
r1_28.normalizeZP();
r1_28 *= f30;
}
r1_28 += r28;
mDoMtx_stack_c::inverse();
mDoMtx_stack_c::transM(r1_28);
mDoMtx_stack_c::ZXYrotM(*r29);
mDoMtx_stack_c::multVecZero(r30);
mDoMtx_MtxToRot(mDoMtx_stack_c::get(), r31);
return TRUE;
}
/* 80061ACC-80061C28 .text HitBufferUpdate__8JntHit_cFPiP4cXyziP5csXyzP4cXyz */
BOOL JntHit_c::HitBufferUpdate(int* r28, cXyz* r29, int r30, csXyz* r31, cXyz* r27) {
mDoMtx_stack_c::copy(mpModel->getAnmMtx(r30));
cXyz r1_2C;
mDoMtx_stack_c::multVec(r27, &r1_2C);
if (*r28 >= 0) {
cXyz r1_20(
cM_scos(r31->x) * cM_ssin(r31->y),
-cM_ssin(r31->x),
cM_scos(r31->x) * cM_scos(r31->y)
);
cXyz r1_14 = r1_2C - *r29;
if (r1_14.inprod(r1_20) < 0.0f) {
*r28 = r30;
*r29 = r1_2C;
return TRUE;
} else {
return FALSE;
}
} else {
*r28 = r30;
*r29 = r1_2C;
return TRUE;
}
}
/* 80061C28-800627DC .text searchJntHitPosAngleOffset__8JntHit_cFP4cXyzP5csXyzP4cXyzP5csXyz */
s32 JntHit_c::searchJntHitPosAngleOffset(cXyz* r18, csXyz* r28, cXyz* r29, csXyz* r30) {
cXyz r1_1A0;
cXyz r1_194;
cXyz r1_188;
cXyz r1_17C;
cXyz r1_170;
cXyz r1_164;
cXyz r1_158;
cXyz r1_14C;
cXyz r1_140;
cXyz r1_134;
cXyz r1_128;
cXyz r1_11C;
cXyz r1_110;
cXyz r1_104;
csXyz r1_24;
J3DModel* model = mpModel;
f32 f31 = 10000.0f;
int j = 0;
int jointIndex = JntHitIdx_NONE_e;
s16* pShapeType = mpShapeTypes;
s16* pJointIndex = mpJointIndexes;
f32* pRadius = mpRadiuses;
cXyz* pOffset = mpOffsets;
int i = 0;
int posIndex = 0;
int hitIndex = 0;
int hitPosIndex = 0;
int tmp = JntHitIdx_NONE_e;
int r1_20 = tmp;
for (; j++ < mMaxNum; i++) {
mDoMtx_stack_c::copy(model->getAnmMtx(*pJointIndex));
if (isCylinder(*pShapeType)) {
mDoMtx_stack_c::multVec(pOffset, &r1_17C);
mDoMtx_stack_c::multVec(pOffset+1, &r1_170);
r1_164 = r1_170 - r1_17C;
r1_158 = r1_164;
r1_1A0 = *r18 - r1_17C;
if (!r1_158.normalizeRS()) {
f32 temp = cLib_minLimit(r1_1A0.abs() - *pRadius, 0.0f);
if (temp <= f31) {
jointIndex = *pJointIndex;
f31 = temp;
hitIndex = i;
hitPosIndex = posIndex;
if (f31 < *pRadius) {
SphHitPosAngleOffset(&r1_1A0, r28, r29, r30, r1_17C, *pRadius);
if (HitBufferUpdate(&r1_20, &r1_194, jointIndex, r28, r29)) {
r1_188 = *r29;
r1_24 = *r30;
}
}
}
} else {
r1_14C = r1_158.outprod(r1_1A0);
f32 f29 = cLib_minLimit(r1_14C.abs() - *pRadius, 0.0f);
f32 f30 = r1_158.inprod(r1_1A0);
f32 f5;
if (f30 < 0.0f) {
f5 = -f30;
} else {
if (f30 > r1_164.abs()) {
f5 = f30 - r1_164.abs();
} else {
f5 = 0.0f;
}
}
f32 f4 = std::sqrtf(f5*f5 + f29*f29);
if (f4 <= f31) {
jointIndex = *pJointIndex;
f31 = f4;
hitIndex = i;
hitPosIndex = posIndex;
if (cLib_IsZero(f5) && cLib_IsZero(f29)) {
if (!isThrow(*pShapeType)) {
if (*pShapeType == JntHitType_CYL_e) {
CylHitPosAngleOffset(&r1_1A0, r28, r29, r30, r1_17C, r1_170, *pRadius);
} else if (*pShapeType == JntHitType_CYL2_e) {
Cyl2HitPosAngleOffset(&r1_1A0, r28, r29, r30, r1_17C, r1_170, *pRadius);
}
if (isDelete(*pShapeType)) {
return JntHitIdx_DELETE_e;
}
if (HitBufferUpdate(&r1_20, &r1_194, jointIndex, r28, r29)) {
r1_188 = *r29;
r1_24 = *r30;
}
}
}
}
}
pOffset += 2;
posIndex += 2;
} else if (isSphere(*pShapeType)) {
mDoMtx_stack_c::multVec(pOffset, &r1_140);
r1_1A0 = *r18 - r1_140;
f32 temp = cLib_minLimit(r1_1A0.abs() - *pRadius, 0.0f);
if (temp <= f31) {
jointIndex = *pJointIndex;
f31 = temp;
hitIndex = i;
hitPosIndex = posIndex;
if (cLib_IsZero(f31)) {
SphHitPosAngleOffset(&r1_1A0, r28, r29, r30, r1_140, *pRadius);
if (isDelete(*pShapeType)) {
jointIndex = JntHitIdx_DELETE_e;
return jointIndex;
} else if (isThrow(*pShapeType)) {
// Do nothing
} else if (HitBufferUpdate(&r1_20, &r1_194, jointIndex, r28, r29)) {
r1_188 = *r29;
r1_24 = *r30;
}
}
}
pOffset += 1;
posIndex += 1;
}
pShapeType++;
pJointIndex++;
pRadius++;
}
if (r1_20 >= 0) {
*r29 = r1_188;
*r30 = r1_24;
return r1_20;
}
pShapeType = mpShapeTypes;
pRadius = mpRadiuses;
pOffset = mpOffsets;
mDoMtx_stack_c::copy(model->getAnmMtx(jointIndex));
if (isThrow(pShapeType[hitIndex])) {
jointIndex = JntHitIdx_NONE_e;
} else if (isDelete(pShapeType[hitIndex])) {
jointIndex = JntHitIdx_DELETE_e;
} else if (pShapeType[hitIndex] == JntHitType_CYL_e) {
mDoMtx_stack_c::multVec(&pOffset[hitPosIndex], &r1_134);
mDoMtx_stack_c::multVec(&pOffset[hitPosIndex+1], &r1_128);
r1_1A0 = *r18 - r1_134;
CylHitPosAngleOffset(&r1_1A0, r28, r29, r30, r1_134, r1_128, pRadius[hitIndex]);
} else if (pShapeType[hitIndex] == JntHitType_SPH_e) {
mDoMtx_stack_c::multVec(&pOffset[hitPosIndex], &r1_11C);
r1_1A0 = *r18 - r1_11C;
SphHitPosAngleOffset(&r1_1A0, r28, r29, r30, r1_11C, pRadius[hitIndex]);
} else { // JntHitType_CYL2_e
mDoMtx_stack_c::multVec(&pOffset[hitPosIndex], &r1_110);
mDoMtx_stack_c::multVec(&pOffset[hitPosIndex+1], &r1_104);
r1_1A0 = *r18 - r1_110;
Cyl2HitPosAngleOffset(&r1_1A0, r28, r29, r30, r1_110, r1_104, pRadius[hitIndex]);
}
return jointIndex;
}
/* 800627DC-8006286C .text JntHit_create__FP8J3DModelP16__jnt_hit_data_cs */
JntHit_c* JntHit_create(J3DModel* model, __jnt_hit_data_c* jntHitData, s16 hitDataCount) {
JntHit_c * pJntHit = new JntHit_c();
if (pJntHit != NULL) {
pJntHit->setSearchData(jntHitData);
pJntHit->setMdlPtr(model);
pJntHit->setMaxNum(hitDataCount);
if (pJntHit->CreateInit())
return pJntHit;
}
return NULL;
}
|