Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--intern/cycles/kernel/geom/geom_curve.h59
-rw-r--r--intern/cycles/kernel/svm/svm_closure.h8
2 files changed, 40 insertions, 27 deletions
diff --git a/intern/cycles/kernel/geom/geom_curve.h b/intern/cycles/kernel/geom/geom_curve.h
index e57bcd894a6..57fa0388842 100644
--- a/intern/cycles/kernel/geom/geom_curve.h
+++ b/intern/cycles/kernel/geom/geom_curve.h
@@ -438,6 +438,8 @@ ccl_device_inline bool bvh_cardinal_curve_intersect(KernelGlobals *kg, Intersect
* dP* is reversed if necessary.*/
float t = isect->t;
float u = 0.0f;
+ float gd = 0.0f;
+
if(flags & CURVE_KN_RIBBONS) {
float3 tg = (p_en - p_st);
float w = tg.x * tg.x + tg.y * tg.y;
@@ -508,7 +510,7 @@ ccl_device_inline bool bvh_cardinal_curve_intersect(KernelGlobals *kg, Intersect
}
/* --- */
float3 tg = (p_en - p_st) / l;
- float gd = (or2 - or1) / l;
+ gd = (or2 - or1) / l;
float difz = -dot(p_st,tg);
float cyla = 1.0f - (tg.z * tg.z * (1 + gd*gd));
float halfb = (-p_st.z - tg.z*(difz + gd*(difz*gd + or1)));
@@ -576,8 +578,8 @@ ccl_device_inline bool bvh_cardinal_curve_intersect(KernelGlobals *kg, Intersect
isect->object = object;
isect->type = type;
isect->u = u;
- isect->v = 0.0f;
- /*isect->v = 1.0f - coverage; */
+ isect->v = gd;
+ /*isect->transparency = 1.0f - coverage; */
isect->t = t;
hit = true;
}
@@ -812,13 +814,10 @@ ccl_device_inline bool bvh_curve_intersect(KernelGlobals *kg, Intersection *isec
isect->object = object;
isect->type = type;
isect->u = z*invl;
- isect->v = td/(4*a*a);
- /*isect->v = 1.0f - adjradius;*/
+ isect->v = gd;
+ /*isect->transparency = 1.0f - adjradius;*/
isect->t = t;
- if(backface)
- isect->u = -isect->u;
-
return true;
}
}
@@ -901,35 +900,41 @@ ccl_device_inline float3 bvh_curve_refine(KernelGlobals *kg, ShaderData *sd, con
motion_cardinal_curve_keys(kg, sd->object, sd->prim, sd->time, ka, k0, k1, kb, P_curve);
}
- float l = 1.0f;
- tg = normalize_len(float4_to_float3(P_curve[2] - P_curve[1]), &l);
- float r1 = P_curve[1].w;
- float r2 = P_curve[2].w;
- float gd = ((r2 - r1)/l);
-
- P = P + D*t;
-
float3 p[4];
p[0] = float4_to_float3(P_curve[0]);
p[1] = float4_to_float3(P_curve[1]);
p[2] = float4_to_float3(P_curve[2]);
p[3] = float4_to_float3(P_curve[3]);
+ P = P + D*t;
+
#ifdef __UV__
sd->u = isect->u;
sd->v = 0.0f;
#endif
- tg = normalize(curvetangent(isect->u, p[0], p[1], p[2], p[3]));
-
- if(kernel_data.curve.curveflags & CURVE_KN_RIBBONS)
+ if(kernel_data.curve.curveflags & CURVE_KN_RIBBONS) {
+ tg = normalize(curvetangent(isect->u, p[0], p[1], p[2], p[3]));
sd->Ng = normalize(-(D - tg * (dot(tg, D))));
+ }
else {
+ /* direction from inside to surface of curve */
float3 p_curr = curvepoint(isect->u, p[0], p[1], p[2], p[3]);
sd->Ng = normalize(P - p_curr);
- sd->Ng = sd->Ng - gd * tg;
- sd->Ng = normalize(sd->Ng);
+
+ /* adjustment for changing radius */
+ float gd = isect->v;
+
+ if(gd != 0.0f) {
+ tg = normalize(curvetangent(isect->u, p[0], p[1], p[2], p[3]));
+ sd->Ng = sd->Ng - gd * tg;
+ sd->Ng = normalize(sd->Ng);
+ }
}
+
+ /* todo: sometimes the normal is still so that this is detected as
+ * backfacing even if cull backfaces is enabled */
+
sd->N = sd->Ng;
}
else {
@@ -945,9 +950,6 @@ ccl_device_inline float3 bvh_curve_refine(KernelGlobals *kg, ShaderData *sd, con
float l = 1.0f;
tg = normalize_len(float4_to_float3(P_curve[1] - P_curve[0]), &l);
- float r1 = P_curve[0].w;
- float r2 = P_curve[1].w;
- float gd = ((r2 - r1)/l);
P = P + D*t;
@@ -963,9 +965,14 @@ ccl_device_inline float3 bvh_curve_refine(KernelGlobals *kg, ShaderData *sd, con
sd->Ng = normalize(sd->Ng);
}
else {
+ float gd = isect->v;
+
+ /* direction from inside to surface of curve */
sd->Ng = (dif - tg * sd->u * l) / (P_curve[0].w + sd->u * l * gd);
+
+ /* adjustment for changing radius */
if (gd != 0.0f) {
- sd->Ng = sd->Ng - gd * tg ;
+ sd->Ng = sd->Ng - gd * tg;
sd->Ng = normalize(sd->Ng);
}
}
@@ -980,7 +987,7 @@ ccl_device_inline float3 bvh_curve_refine(KernelGlobals *kg, ShaderData *sd, con
#endif
/*add fading parameter for minimum pixel width with transparency bsdf*/
- /*sd->curve_transparency = isect->v;*/
+ /*sd->curve_transparency = isect->transparency;*/
/*sd->curve_radius = sd->u * gd * l + r1;*/
if(isect->object != OBJECT_NONE) {
diff --git a/intern/cycles/kernel/svm/svm_closure.h b/intern/cycles/kernel/svm/svm_closure.h
index caae65487c4..fe3fe697bca 100644
--- a/intern/cycles/kernel/svm/svm_closure.h
+++ b/intern/cycles/kernel/svm/svm_closure.h
@@ -336,8 +336,14 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
if(sd->flag & SD_BACKFACING && sd->type & PRIMITIVE_ALL_CURVE) {
ShaderClosure *sc = svm_node_closure_get_bsdf(sd, mix_weight);
+
if(sc) {
- sc->weight = make_float3(1.0f,1.0f,1.0f);
+ /* todo: giving a fixed weight here will cause issues when
+ * mixing multiple BSDFS. energey will not be conserved and
+ * the throughput can blow up after multiple bounces. we
+ * better figure out a way to skip backfaces from rays
+ * spawned by transmission from the front */
+ sc->weight = make_float3(1.0f, 1.0f, 1.0f);
sc->N = N;
sd->flag |= bsdf_transparent_setup(sc);
}