You are not logged in.
Pages: 1
Сижу вот и думаю, может быть это метод RwV3d ? Который выполняет нормализацию.
Пока так написал, но внутри видел какую-то проверку на ноль.
void RwV3dNormalize(RwV3d * V3d) { float inv_lng = 1.0f / sqrt(V3d->x*V3d->x + V3d->y*V3d->y + V3d->z*V3d->z); V3d->x = V3d->x * inv_lng; V3d->y = V3d->y * inv_lng; V3d->z = V3d->z * inv_lng; }
Last edited by VintProg_Pro (20-08-2013 17:15)
Offline
У RwV3d нет методов, это просто структура x y z. Другое дело CVector - там и перегруженные операторы, и те же Normalise и Length.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
У RwV3d нет методов, это просто структура x y z. Другое дело CVector - там и перегруженные операторы, и те же Normalise и Length.
т.е CVector - эта обвертка, значит имеет методы? Вообще может быть, я не немножко не так переписал ее?
Offline
Надо сверять с нулём, т.к. корень нельзя взять из отрицательного числа + на 0 нельзя делить.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Ну все понял, а то я думал зачем еще туда всунули во внутрь: fcomp
Сама картинка такая:
.text:004DFEA0 RwV3D__normalize proc near ; CODE XREF: sub_4114E0+FBp .text:004DFEA0 ; sub_413DE0+231p .text:004DFEA0 ; sub_414470+BFEp .text:004DFEA0 ; sub_4165B0+E1p ... .text:004DFEA0 .text:004DFEA0 var_8 = dword ptr -8 .text:004DFEA0 .text:004DFEA0 000 83 EC 08 sub esp, 8 .text:004DFEA3 008 D9 41 04 fld [ecx+RwV3d.y] .text:004DFEA6 008 D9 C0 fld st .text:004DFEA8 008 D8 C8 fmul st, st ; y * y .text:004DFEAA 008 D9 01 fld [ecx+RwV3d.x] .text:004DFEAC 008 DD DA fstp st(2) .text:004DFEAE 008 D9 C1 fld st(1) .text:004DFEB0 008 D8 C8 fmul st, st .text:004DFEB2 008 DE C1 faddp st(1), st .text:004DFEB4 008 D9 41 08 fld [ecx+RwV3d.z] .text:004DFEB7 008 DD DA fstp st(2) .text:004DFEB9 008 D9 C1 fld st(1) .text:004DFEBB 008 D8 C8 fmul st, st .text:004DFEBD 008 DE C1 faddp st(1), st .text:004DFEBF 008 DD D1 fst st(1) .text:004DFEC1 008 D8 1D 70 15 69 00 fcomp flt_691570 .text:004DFEC7 008 DF E0 fnstsw ax .text:004DFEC9 008 F6 C4 04 test ah, 4 .text:004DFECC 008 75 14 jnz short loc_4DFEE2 .text:004DFECE 008 80 E4 45 and ah, 69 .text:004DFED1 008 F6 C4 41 test ah, 65 .text:004DFED4 008 74 0C jz short loc_4DFEE2 .text:004DFED6 008 C7 01 00 00 80 3F mov [ecx+RwV3d.x], 1.0 .text:004DFEDC 008 83 C4 08 add esp, 8 .text:004DFEDF 000 DD D8 fstp st .text:004DFEE1 000 C3 retn .text:004DFEE2 ; --------------------------------------------------------------------------- .text:004DFEE2 .text:004DFEE2 loc_4DFEE2: ; CODE XREF: RwV3D__normalize+2Cj .text:004DFEE2 ; RwV3D__normalize+34j .text:004DFEE2 008 D9 C0 fld st .text:004DFEE4 008 D9 FA fsqrt .text:004DFEE6 008 D9 1C 24 fstp [esp+8+var_8] .text:004DFEE9 008 D9 04 24 fld [esp+8+var_8] .text:004DFEEC 008 DD D9 fstp st(1) .text:004DFEEE 008 D9 05 74 15 69 00 fld flt_691574 .text:004DFEF4 008 D8 F1 fdiv st, st(1) .text:004DFEF6 008 DD D9 fstp st(1) .text:004DFEF8 008 D9 01 fld [ecx+RwV3d.x] .text:004DFEFA 008 D8 C9 fmul st, st(1) .text:004DFEFC 008 D9 19 fstp [ecx+RwV3d.x] .text:004DFEFE 008 D9 41 04 fld [ecx+RwV3d.y] .text:004DFF01 008 D8 C9 fmul st, st(1) .text:004DFF03 008 D9 59 04 fstp [ecx+RwV3d.y] .text:004DFF06 008 D9 41 08 fld [ecx+RwV3d.z] .text:004DFF09 008 D8 C9 fmul st, st(1) .text:004DFF0B 008 D9 59 08 fstp [ecx+RwV3d.z] .text:004DFF0E 008 DD D8 fstp st .text:004DFF10 008 83 C4 08 add esp, 8 .text:004DFF13 000 C3 retn .text:004DFF13 RwV3D__normalize endp
Offline
В базе SA все функции на Rw, Rp, Rs - часть Renderware SDK. Можно сверятся ней, какая-то версия лежит на паблике. Сама SDK написана в Carmack style C - так что, ванильный RwV3d методов не имеет.
В коде R* также присутсвует метод CVector::Normalise(void).
Ваш кусок кода - это именно CVector::Normalise, т.к. RwV3dNormalise принимает 2 параметра - in и out, в то время как CVector::Normalise выполняет inplace преобразование.
Offline
Да тут, компилятор не плохо тоже поработал.
Offline
void CVector::Normalize() { float l = this->y * this->y + this->x * this->x + this->z * this->z; if(l > 0.0) { l = 1.0 / sqrt(l); this->x *= l; this->y *= l; this->z *= l; } else this->x = 1.0; }
Last edited by DK22Pac (20-08-2013 18:01)
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Pages: 1