#1 20-08-2013 17:06

VintProg_Pro
Registered: 17-06-2010
Posts: 153

RwV3D_Normalize - вопрос.

Сижу вот и думаю, может быть это метод 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

#2 20-08-2013 17:15

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: RwV3D_Normalize - вопрос.

У 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

#3 20-08-2013 17:17

VintProg_Pro
Registered: 17-06-2010
Posts: 153

Re: RwV3D_Normalize - вопрос.

У RwV3d нет методов, это просто структура x y z. Другое дело CVector - там и перегруженные операторы, и те же Normalise и Length.

т.е CVector - эта обвертка, значит имеет методы? Вообще может быть, я не немножко не так переписал ее?

Offline

#4 20-08-2013 17:30

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: RwV3D_Normalize - вопрос.

Надо сверять с нулём, т.к. корень нельзя взять из отрицательного числа + на 0 нельзя делить.


Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Offline

#5 20-08-2013 17:33

VintProg_Pro
Registered: 17-06-2010
Posts: 153

Re: RwV3D_Normalize - вопрос.

Ну все понял, а то я думал зачем еще туда всунули во внутрь: 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

#6 20-08-2013 17:37

Alien
Registered: 12-10-2008
Posts: 564

Re: RwV3D_Normalize - вопрос.

В базе 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

#7 20-08-2013 17:48

VintProg_Pro
Registered: 17-06-2010
Posts: 153

Re: RwV3D_Normalize - вопрос.

Да тут, компилятор не плохо тоже поработал.

Offline

#8 20-08-2013 17:59

DK22Pac
From: Ukraine
Registered: 26-03-2010
Posts: 447
Website

Re: RwV3D_Normalize - вопрос.

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

Board footer

Powered by FluxBB