Cycles / Math:
authorThomas Dinges <blender@dingto.org>
Sun, 12 May 2013 14:13:29 +0000 (14:13 +0000)
committerThomas Dinges <blender@dingto.org>
Sun, 12 May 2013 14:13:29 +0000 (14:13 +0000)
* Add M_2PI_F and M_4PI_F constants and use them inside the codebase.

15 files changed:
intern/cycles/blender/blender_curves.cpp
intern/cycles/kernel/closure/bsdf_microfacet.h
intern/cycles/kernel/closure/bsdf_phong_ramp.h
intern/cycles/kernel/closure/bsdf_ward.h
intern/cycles/kernel/closure/bsdf_westin.h
intern/cycles/kernel/closure/bssrdf.h
intern/cycles/kernel/kernel_light.h
intern/cycles/kernel/kernel_montecarlo.h
intern/cycles/kernel/svm/svm_closure.h
intern/cycles/kernel/svm/svm_gradient.h
intern/cycles/render/bssrdf.cpp
intern/cycles/render/camera.cpp
intern/cycles/render/light.cpp
intern/cycles/subd/subd_build.cpp
intern/cycles/util/util_math.h

index 584ac2f0ca411e5c2261694a265bcbd5f93331d5..df00c8fd92ed0e16f79a9dc1a46e98f53a9f1cdc 100644 (file)
@@ -669,7 +669,7 @@ void ExportCurveTriangleGeometry(Mesh *mesh, ParticleCurveData *CData, int inter
                                        if(CData->psys_closetip[sys] && (subv == segments) && (curvekey == CData->curve_firstkey[curve] + CData->curve_keynum[curve] - 2))
                                                radius = shaperadius(CData->psys_shape[sys], CData->psys_rootradius[sys], 0.0f, 0.95f);
 
-                                       float angle = 2 * M_PI_F / (float)resolution;
+                                       float angle = M_2PI_F / (float)resolution;
                                        for(int section = 0 ; section < resolution; section++) {
                                                float3 ickey_loc_shf = ickey_loc + radius * (cosf(angle * section) * xbasis + sinf(angle * section) * ybasis);
                                                mesh->verts.push_back(ickey_loc_shf);
index 7ebb22e64a75a8c88e8584e708a965d4f682ea93..915b9eafbc1f25cd1eb32d69d0491b04ce265cdc 100644 (file)
@@ -157,7 +157,7 @@ __device int bsdf_microfacet_ggx_sample(const ShaderClosure *sc, float3 Ng, floa
                float tanThetaM2 = alpha2 * randu / (1 - randu);
                float cosThetaM  = 1 / safe_sqrtf(1 + tanThetaM2);
                float sinThetaM  = cosThetaM * safe_sqrtf(tanThetaM2);
-               float phiM = 2 * M_PI_F * randv;
+               float phiM = M_2PI_F * randv;
                float3 m = (cosf(phiM) * sinThetaM) * X +
                                 (sinf(phiM) * sinThetaM) * Y +
                                                           cosThetaM  * Z;
@@ -386,7 +386,7 @@ __device int bsdf_microfacet_beckmann_sample(const ShaderClosure *sc, float3 Ng,
                }
 
                float sinThetaM = cosThetaM * tanThetaM;
-               float phiM = 2 * M_PI_F * randv;
+               float phiM = M_2PI_F * randv;
                float3 m = (cosf(phiM) * sinThetaM) * X +
                                 (sinf(phiM) * sinThetaM) * Y +
                                                           cosThetaM  * Z;
index ce163e933cfcfdb7e78dfe73ffc4eb0ef5f7a350..e518f3675c8e7f973683b209240ad6c1221e4796 100644 (file)
@@ -100,7 +100,7 @@ __device int bsdf_phong_ramp_sample(const ShaderClosure *sc, const float3 colors
                
                float3 T, B;
                make_orthonormals (R, &T, &B);
-               float phi = 2 * M_PI_F * randu;
+               float phi = M_2PI_F * randu;
                float cosTheta = powf(randv, 1 / (m_exponent + 1));
                float sinTheta2 = 1 - cosTheta * cosTheta;
                float sinTheta = sinTheta2 > 0 ? sqrtf(sinTheta2) : 0;
index 71be1ad88bb558dea5056c09406aeb770168f71b..0e5b0c544c7015ec73449e34852c26b4ed233636 100644 (file)
@@ -75,11 +75,11 @@ __device float3 bsdf_ward_eval_reflect(const ShaderClosure *sc, const float3 I,
                float doty = dot(H, Y) / m_ay;
                float dotn = dot(H, N);
                float exp_arg = (dotx * dotx + doty * doty) / (dotn * dotn);
-               float denom = (4 * M_PI_F * m_ax * m_ay * sqrtf(cosNO * cosNI));
+               float denom = (M_4PI_F * m_ax * m_ay * sqrtf(cosNO * cosNI));
                float exp_val = expf(-exp_arg);
                float out = cosNI * exp_val / denom;
                float oh = dot(H, I);
-               denom = 4 * M_PI_F * m_ax * m_ay * oh * dotn * dotn * dotn;
+               denom = M_4PI_F * m_ax * m_ay * oh * dotn * dotn * dotn;
                *pdf = exp_val / denom;
                return make_float3 (out, out, out);
        }
@@ -134,7 +134,7 @@ __device int bsdf_ward_sample(const ShaderClosure *sc, float3 Ng, float3 I, floa
                else {
                        float val = 1 - 4 * (1 - randu);
                        float tanPhi = alphaRatio * tanf(M_PI_2_F * val);
-                       // phi = 2 * M_PI_F - phi;
+                       // phi = M_2PI_F - phi;
                        cosPhi = 1 / sqrtf(1 + tanPhi * tanPhi);
                        sinPhi = -tanPhi * cosPhi;
                }
@@ -167,10 +167,10 @@ __device int bsdf_ward_sample(const ShaderClosure *sc, float3 Ng, float3 I, floa
 
                                // eq. 9
                                float exp_arg = (dotx * dotx + doty * doty) / (dotn * dotn);
-                               float denom = 4 * M_PI_F * m_ax * m_ay * oh * dotn * dotn * dotn;
+                               float denom = M_4PI_F * m_ax * m_ay * oh * dotn * dotn * dotn;
                                *pdf = expf(-exp_arg) / denom;
                                // compiler will reuse expressions already computed
-                               denom = (4 * M_PI_F * m_ax * m_ay * sqrtf(cosNO * cosNI));
+                               denom = (M_4PI_F * m_ax * m_ay * sqrtf(cosNO * cosNI));
                                float power = cosNI * expf(-exp_arg) / denom;
                                *eval = make_float3(power, power, power);
 #ifdef __RAY_DIFFERENTIALS__
index 29bfa85bcc13bcff0c8d5c44ccfde2da04c63082..9ad1c17571392cdb5696081228705a1cf8a92427 100644 (file)
@@ -91,7 +91,7 @@ __device int bsdf_westin_backscatter_sample(const ShaderClosure *sc, float3 Ng,
 #endif
                float3 T, B;
                make_orthonormals (I, &T, &B);
-               float phi = 2 * M_PI_F * randu;
+               float phi = M_2PI_F * randu;
                float cosTheta = powf(randv, 1 / (m_invroughness + 1));
                float sinTheta2 = 1 - cosTheta * cosTheta;
                float sinTheta = sinTheta2 > 0 ? sqrtf(sinTheta2) : 0;
index 1327fbd011eaf5b02bd0e4c2a454b90be3c14bf8..8916374cb1c893f694750a6fc742165359c54836 100644 (file)
@@ -145,7 +145,7 @@ __device float bssrdf_original(const BSSRDFParams *ss, float r)
        Rdr = ss->zr*(1.0f + ss->sigma_tr*sr)*expf(-ss->sigma_tr*sr)/(sr*sr*sr);
        Rdv = ss->zv*(1.0f + ss->sigma_tr*sv)*expf(-ss->sigma_tr*sv)/(sv*sv*sv);
 
-       return ss->alpha_*(1.0f/(4.0f*(float)M_PI))*(Rdr + Rdv);
+       return ss->alpha_*(1.0f/M_4PI_F)*(Rdr + Rdv);
 }
 
 CCL_NAMESPACE_END
index 88ee0155f5f427324adc083d9f9a066abfa43fa0..a4877acdc535a80d2618a6428a7e44cd146a24f9 100644 (file)
@@ -106,7 +106,7 @@ __device float3 background_light_sample(KernelGlobals *kg, float randu, float ra
        if(sin_theta == 0.0f || denom == 0.0f)
                *pdf = 0.0f;
        else
-               *pdf = (cdf_u.x * cdf_v.x)/(2.0f * M_PI_F * M_PI_F * sin_theta * denom);
+               *pdf = (cdf_u.x * cdf_v.x)/(M_2PI_F * M_PI_F * sin_theta * denom);
 
        *pdf *= kernel_data.integrator.pdf_lights;
 
@@ -140,7 +140,7 @@ __device float background_light_pdf(KernelGlobals *kg, float3 direction)
        float2 cdf_u = kernel_tex_fetch(__light_background_conditional_cdf, index_v * (res + 1) + index_u);
        float2 cdf_v = kernel_tex_fetch(__light_background_marginal_cdf, index_v);
 
-       float pdf = (cdf_u.x * cdf_v.x)/(2.0f * M_PI_F * M_PI_F * sin_theta * denom);
+       float pdf = (cdf_u.x * cdf_v.x)/(M_2PI_F * M_PI_F * sin_theta * denom);
 
        return pdf * kernel_data.integrator.pdf_lights;
 }
@@ -499,7 +499,7 @@ __device void curve_segment_light_sample(KernelGlobals *kg, int prim, int object
        float gd = ((r2 - r1)/l);
 
        /* normal currently ignores gradient */
-       ls->Ng = sinf(2 * M_PI_F * randv) * xc + cosf(2 * M_PI_F * randv) * yc;
+       ls->Ng = sinf(M_2PI_F * randv) * xc + cosf(M_2PI_F * randv) * yc;
        ls->P = randu * l * tg + (gd * l + r1) * ls->Ng;
        ls->object = object;
        ls->prim = prim;
index fb66501c33610f1dbfc4ccfe969cf2b22c951e0e..707c769f0cdf2e38e728239b2003291a2ca25b6d 100644 (file)
@@ -95,7 +95,7 @@ __device_inline void sample_uniform_hemisphere(const float3 N,
 {
        float z = randu;
        float r = sqrtf(max(0.0f, 1.0f - z*z));
-       float phi = 2.0f * M_PI_F * randv;
+       float phi = M_2PI_F * randv;
        float x = r * cosf(phi);
        float y = r * sinf(phi);
 
@@ -111,7 +111,7 @@ __device_inline void sample_uniform_cone(const float3 N, float angle,
 {
        float z = cosf(angle*randu);
        float r = sqrtf(max(0.0f, 1.0f - z*z));
-       float phi = 2.0f * M_PI_F * randv;
+       float phi = M_2PI_F * randv;
        float x = r * cosf(phi);
        float y = r * sinf(phi);
 
index 72e6a0471586103fe58f5a83f0cbe0c238f9a68a..d97e165c66d105c3b8015886704d786c165f25ab 100644 (file)
@@ -287,7 +287,7 @@ __device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *st
                                float rotation = stack_load_float(stack, data_node.w);
 
                                if(rotation != 0.0f)
-                                       sc->T = rotate_around_axis(sc->T, sc->N, rotation * 2.0f * M_PI_F);
+                                       sc->T = rotate_around_axis(sc->T, sc->N, rotation * M_2PI_F);
 
                                /* compute roughness */
                                float roughness = param1;
index 7fad1175c493c452d2ed3477fbf8203d05ad54b1..95c662ac28bc3b71b7a3a8fec6c9a491d4968350 100644 (file)
@@ -45,7 +45,7 @@ __device float svm_gradient(float3 p, NodeGradientType type)
                return (x + y)/2.0f;
        }
        else if(type == NODE_BLEND_RADIAL) {
-               return atan2f(y, x) / (2.0f * M_PI_F) + 0.5f;
+               return atan2f(y, x) / M_2PI_F + 0.5f;
        }
        else {
                float r = fmaxf(1.0f - sqrtf(x*x + y*y + z*z), 0.0f);
index f3f889f071a4fea11a1256822184cdf2e7060a93..8ec3c6a1384f85e4e3a99d843661328a1d43396e 100644 (file)
@@ -86,7 +86,7 @@ static void bssrdf_lookup_table_create(const BSSRDFParams *ss, vector<float>& sa
        /* adjust for area covered by each distance */
        for(int i = 0; i < pdf.size(); i++) {
                float x = (i*step)*max_radius;
-               pdf[i] *= 2*M_PI_F*x;
+               pdf[i] *= M_2PI_F*x;
        }
 
        /* normalize pdf, we multiply in reflectance later */
index c88b0f3dfbc4a36c61c3ae62c7ff616b2b0be625..861f6a45a18fe6f66bdf7e3e2d1216cbf91b968b 100644 (file)
@@ -44,7 +44,7 @@ Camera::Camera()
        panorama_type = PANORAMA_EQUIRECTANGULAR;
        fisheye_fov = M_PI_F;
        fisheye_lens = 10.5f;
-       fov = M_PI_F/4.0f;
+       fov = M_PI_4_F;
 
        sensorwidth = 0.036;
        sensorheight = 0.024;
index 4c3c0c7f6a44eeebcbeb0d1f6177a7e99cc7ff10..1d2acf79b6c9447492c1fb1a76cb7fed133c955e 100644 (file)
@@ -111,7 +111,7 @@ Light::Light()
 
        map_resolution = 512;
 
-       spot_angle = M_PI_F/4.0f;
+       spot_angle = M_PI_4_F;
        spot_smooth = 0.0f;
 
        cast_shadow = true;
index 8e84da7f019674a80c7c86b0d98fbd4151238739..f3c2837c37c3ebb04fe0495a2017a7d75cb51824 100644 (file)
@@ -413,10 +413,10 @@ void SubdAccBuilder::computeInteriorStencil(SubdFaceRing *ring, GregoryAccStenci
                }
                else {
                        SubdVert *e0 = edge->from();
-                       float costerm0 = cosf(2.0f * M_PI_F / pseudoValence(e0));
+                       float costerm0 = cosf(M_2PI_F / pseudoValence(e0));
 
                        SubdVert *f0 = edge->to();
-                       float costerm1 = cosf(2.0f * M_PI_F / pseudoValence(f0));
+                       float costerm1 = cosf(M_2PI_F / pseudoValence(f0));
 
                        /*  p0 +------+ q0
                         *       |        |
index f2e814527fd15cebe22264b5bd3eab90ae9bdd2a..6b85e06c25d9ad39c1284bf0ed13888a7e808a7c 100644 (file)
@@ -42,23 +42,35 @@ CCL_NAMESPACE_BEGIN
 
 /* Float Pi variations */
 
+/* Division */
 #ifndef M_PI_F
-#define M_PI_F         ((float)3.14159265358979323846264338327950288)
+#define M_PI_F         ((float)3.14159265358979323846264338327950288)          /* pi */
 #endif
 #ifndef M_PI_2_F
-#define M_PI_2_F       ((float)1.57079632679489661923132169163975144)
+#define M_PI_2_F       ((float)1.57079632679489661923132169163975144)          /* pi/2 */
 #endif
 #ifndef M_PI_4_F
-#define M_PI_4_F       ((float)0.785398163397448309615660845819875721)
+#define M_PI_4_F       ((float)0.785398163397448309615660845819875721)         /* pi/4 */
 #endif
 #ifndef M_1_PI_F
-#define M_1_PI_F       ((float)0.318309886183790671537767526745028724)
+#define M_1_PI_F       ((float)0.318309886183790671537767526745028724)         /* 1/pi */
 #endif
 #ifndef M_2_PI_F
-#define M_2_PI_F       ((float)0.636619772367581343075535053490057448)
+#define M_2_PI_F       ((float)0.636619772367581343075535053490057448)         /* 2/pi */
 #endif
+
+/* Multiplication */
+#ifndef M_2PI_F
+#define M_2PI_F                ((float)6.283185307179586476925286766559005768)         /* 2*pi */
+#endif
+#ifndef M_4PI_F
+#define M_4PI_F                ((float)12.56637061435917295385057353311801153)         /* 4*pi */
+#endif
+
+/* Float sqrt variations */
+
 #ifndef M_SQRT2_F
-#define M_SQRT2_F      ((float)1.41421356237309504880)
+#define M_SQRT2_F      ((float)1.41421356237309504880)                                         /* sqrt(2) */
 #endif