diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2014-03-29 16:03:45 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2014-03-29 16:03:45 +0400 |
commit | 41d1675053b457370e70be137fd8105b9cd1890b (patch) | |
tree | 1c0567bc1441dd9bd55f9f5b184b7ce346aa2073 /intern/cycles/kernel/kernel_light.h | |
parent | 84470a1190b28cd37491e5002aea4695e4f26f44 (diff) |
Cycles code refactor: move more geometry code into per primitive files.
Diffstat (limited to 'intern/cycles/kernel/kernel_light.h')
-rw-r--r-- | intern/cycles/kernel/kernel_light.h | 60 |
1 files changed, 4 insertions, 56 deletions
diff --git a/intern/cycles/kernel/kernel_light.h b/intern/cycles/kernel/kernel_light.h index 79ef86a8662..8c3f558c3ea 100644 --- a/intern/cycles/kernel/kernel_light.h +++ b/intern/cycles/kernel/kernel_light.h @@ -458,8 +458,7 @@ ccl_device void triangle_light_sample(KernelGlobals *kg, int prim, int object, v = randv*randu; /* triangle, so get position, normal, shader */ - ls->P = triangle_point_MT(kg, prim, u, v); - ls->Ng = triangle_normal_MT(kg, prim, &ls->shader); + triangle_point_normal(kg, prim, u, v, &ls->P, &ls->Ng, &ls->shader); ls->object = object; ls->prim = prim; ls->lamp = ~0; @@ -485,52 +484,6 @@ ccl_device float triangle_light_pdf(KernelGlobals *kg, return t*t*pdf/cos_pi; } -/* Curve Light */ - -#ifdef __HAIR__ - -ccl_device void curve_segment_light_sample(KernelGlobals *kg, int prim, int object, - int segment, float randu, float randv, float time, LightSample *ls) -{ - /* this strand code needs completion */ - float4 v00 = kernel_tex_fetch(__curves, prim); - - int k0 = __float_as_int(v00.x) + segment; - int k1 = k0 + 1; - - float4 P1 = kernel_tex_fetch(__curve_keys, k0); - float4 P2 = kernel_tex_fetch(__curve_keys, k1); - - float l = len(float4_to_float3(P2) - float4_to_float3(P1)); - - float r1 = P1.w; - float r2 = P2.w; - float3 tg = (float4_to_float3(P2) - float4_to_float3(P1)) / l; - float3 xc = make_float3(tg.x * tg.z, tg.y * tg.z, -(tg.x * tg.x + tg.y * tg.y)); - if (is_zero(xc)) - xc = make_float3(tg.x * tg.y, -(tg.x * tg.x + tg.z * tg.z), tg.z * tg.y); - xc = normalize(xc); - float3 yc = cross(tg, xc); - float gd = ((r2 - r1)/l); - - /* normal currently ignores gradient */ - 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; - ls->lamp = ~0; - ls->t = 0.0f; - ls->u = randu; - ls->v = randv; - ls->type = LIGHT_STRAND; - ls->eval_fac = 1.0f; - ls->shader = __float_as_int(v00.z) | SHADER_USE_MIS; - - object_transform_light_sample(kg, ls, object, time); -} - -#endif - /* Light Distribution */ ccl_device int light_distribution_sample(KernelGlobals *kg, float randt) @@ -573,19 +526,14 @@ ccl_device void light_sample(KernelGlobals *kg, float randt, float randu, float if(prim >= 0) { int object = __float_as_int(l.w); -#ifdef __HAIR__ - int segment = __float_as_int(l.z) & SHADER_MASK; + int shader_flag = __float_as_int(l.z); - if(segment != SHADER_MASK) - curve_segment_light_sample(kg, prim, object, segment, randu, randv, time, ls); - else -#endif - triangle_light_sample(kg, prim, object, randu, randv, time, ls); + triangle_light_sample(kg, prim, object, randu, randv, time, ls); /* compute incoming direction, distance and pdf */ ls->D = normalize_len(ls->P - P, &ls->t); ls->pdf = triangle_light_pdf(kg, ls->Ng, -ls->D, ls->t); - ls->shader |= __float_as_int(l.z) & (~SHADER_MASK); + ls->shader |= shader_flag; } else { int lamp = -prim-1; |