fix atan2f input conditional
authorMike Erwin <significant.bit@gmail.com>
Sat, 23 Jul 2016 00:59:31 +0000 (20:59 -0400)
committerMike Erwin <significant.bit@gmail.com>
Sat, 23 Jul 2016 01:00:12 +0000 (21:00 -0400)
Suspicious conditional found by PVS-Studio T48917

Original code (from Blender’s initial open-source commit!) looks like
it’s testing inputs to atan2f, to avoid undefined function values.
Passing xn=0 does *not* always evaluate to 0 though… I’m not sure if
this is a coding error or was done for a desired visual result.

Also changed xn==0 to xn>=0 to avoid function call in more cases.

Good description and visualization of atan2f function:
http://en.cppreference.com/w/c/numeric/math/atan2

source/blender/render/intern/source/renderdatabase.c

index d3d26011a57770e561daf795750307a7855626fe..76e6ca8d467edd84f28b4c3209112dee0bddc3fd 100644 (file)
@@ -1006,7 +1006,7 @@ HaloRen *RE_inithalo(Render *re, ObjectRen *obr, Material *ma,
 
                xn=  har->xs - 0.5f*re->winx*(hoco1[0]/hoco1[3]);
                yn=  har->ys - 0.5f*re->winy*(hoco1[1]/hoco1[3]);
-               if (xn==0.0f || (xn==0.0f && yn==0.0f)) zn= 0.0f;
+               if (yn == 0.0f && xn >= 0.0f) zn = 0.0f;
                else zn = atan2f(yn, xn);
 
                har->sin = sinf(zn);
@@ -1136,7 +1136,7 @@ HaloRen *RE_inithalo_particle(Render *re, ObjectRen *obr, DerivedMesh *dm, Mater
 
                xn=  har->xs - 0.5f*re->winx*(hoco1[0]/hoco1[3]);
                yn=  har->ys - 0.5f*re->winy*(hoco1[1]/hoco1[3]);
-               if (xn==0.0f || (xn==0.0f && yn==0.0f)) zn= 0.0;
+               if (yn == 0.0f && xn >= 0.0f) zn = 0.0f;
                else zn = atan2f(yn, xn);
 
                har->sin = sinf(zn);