diff --git a/src/DETHRACE/common/skidmark.c b/src/DETHRACE/common/skidmark.c index 30196c0a..13d65aa1 100644 --- a/src/DETHRACE/common/skidmark.c +++ b/src/DETHRACE/common/skidmark.c @@ -263,14 +263,29 @@ void StretchMark(tSkid* pMark, br_vector3* pFrom, br_vector3* pTo, br_scalar pTe br_scalar len; br_model* model; - rows = (br_vector3*)&pMark->actor->t.t.mat; - BrVector3Sub(&temp, pTo, pFrom); - len = BrVector3Length(&temp); + on_ground = pCar->susp_height[pWheel_num >> 1] > pCar->oldd[pWheel_num]; + if (!on_ground) { + pCar->special_start[pWheel_num].v[0] = FLT_MAX; + } +} - if (len < BR_SCALAR_EPSILON) { - rows[2].v[0] = pMark->normal.v[2] * temp.v[1] - pMark->normal.v[1] * temp.v[2]; - rows[2].v[1] = pMark->normal.v[0] * temp.v[2] - pMark->normal.v[2] * temp.v[0]; - rows[2].v[2] = pMark->normal.v[1] * temp.v[0] - pMark->normal.v[0] * temp.v[1]; +// IDA: int __usercall FarFromLine2D@(br_vector3 *pPt@, br_vector3 *pL1@, br_vector3 *pL2@) +// FUNCTION: CARM95 0x004020dc +int FarFromLine2D(br_vector3* pPt, br_vector3* pL1, br_vector3* pL2) { + br_vector2 line; + br_vector2 to_pt; + br_scalar line_len; + br_scalar cross; + + line.v[0] = BR_SUB(pL2->v[0], pL1->v[0]); + line.v[1] = BR_SUB(pL2->v[2], pL1->v[2]); + to_pt.v[0] = BR_SUB(pPt->v[0], pL2->v[0]); + to_pt.v[1] = BR_SUB(pPt->v[2], pL2->v[2]); + + cross = (-line.v[0]) * to_pt.v[1] + to_pt.v[0] * line.v[1]; + line_len = BrVector2Length(&line); + if (fabs(cross) > line_len * 0.05f) { + return 1; } else { rows[2].v[0] = pMark->normal.v[2] * temp.v[1] - pMark->normal.v[1] * temp.v[2]; rows[2].v[1] = pMark->normal.v[0] * temp.v[2] - pMark->normal.v[2] * temp.v[0];