Commit: 8f79ab214702b7f3a5e88b3fb6cabd317525ff4f
Author: Stefan Werner
Date:   Sun Oct 29 08:13:00 2017 +0100
Branches: cycles_embree
https://developer.blender.org/rB8f79ab214702b7f3a5e88b3fb6cabd317525ff4f

Cycles: Fixed a crash when setting up Embree hair curves

===================================================================

M       intern/cycles/bvh/bvh_embree.cpp

===================================================================

diff --git a/intern/cycles/bvh/bvh_embree.cpp b/intern/cycles/bvh/bvh_embree.cpp
index c60d6a2bdc3..2046db177bd 100644
--- a/intern/cycles/bvh/bvh_embree.cpp
+++ b/intern/cycles/bvh/bvh_embree.cpp
@@ -543,7 +543,7 @@ void BVHEmbree::update_curve_vertex_buffer(unsigned 
geom_id, const Mesh* mesh)
        for(int t = 0; t < num_motion_steps; t++) {
                RTCBufferType buffer_type = 
(RTCBufferType)(RTC_VERTEX_BUFFER+t);
                const float3 *verts;
-               if(t == t_mid) {
+               if(t == t_mid || attr_mP == NULL) {
                        verts = &mesh->curve_keys[0];
                } else {
                        int t_ = (t > t_mid) ? (t - 1) : t;
@@ -559,31 +559,29 @@ void BVHEmbree::update_curve_vertex_buffer(unsigned 
geom_id, const Mesh* mesh)
                                for(size_t j = 0; j < num_curves; j++) {
                                        Mesh::Curve c = mesh->get_curve(j);
                                        if(c.num_segments() > 0) {
+                                               const int& fk = c.first_key;
                                                /* Create Embree's cubic 
splines that equal the cardinal splines that cycles uses */
                                                //static float fc = 1.0f / 
((0.29f - 1.0f) * 6.0f);
                                                const float fc = 
-0.2347417840375f;
-                                               rtc_verts[0] = 
float3_to_float4(verts[0]);
-                                               rtc_verts[0].w = 
curve_radius[0];
-                                               rtc_verts[1] = 
float3_to_float4(-fc * (verts[1] - verts[0]) + verts[0]);
-                                               rtc_verts[1].w = 
lerp(curve_radius[0], curve_radius[1], 0.33f);
-                                               size_t idx = 2;
+                                               rtc_verts[0] = 
float3_to_float4(verts[fk]);
+                                               rtc_verts[0].w = 
curve_radius[fk];
+                                               rtc_verts[1] = 
float3_to_float4(-fc * (verts[fk+1] - verts[fk]) + verts[fk]);
+                                               rtc_verts[1].w = 
lerp(curve_radius[fk], curve_radius[fk+1], 0.33f);
                                                size_t k = 1;
                                                for(;k < c.num_segments(); k++) 
{
-                                                       const float3 d = 
(verts[k+1] - verts[k-1]);
-                                                       rtc_verts[k*3-1] = 
float3_to_float4(fc * d + verts[k]);
-                                                       rtc_verts[k*3-1].w = 
lerp(curve_radius[k-1], curve_radius[k], 0.66f);
-                                                       rtc_verts[k*3] = 
float3_to_float4(verts[k]);
-                                                       rtc_verts[k*3].w = 
curve_radius[k];
-                                                       rtc_verts[k*3+1] = 
float3_to_float4(-fc * d + verts[k]);
-                                                       rtc_verts[k*3+1].w = 
lerp(curve_radius[k], curve_radius[k+1], 0.33f);
+                                                       const float3 d = 
(verts[fk+k+1] - verts[fk+k-1]);
+                                                       rtc_verts[k*3-1] = 
float3_to_float4(fc * d + verts[fk+k]);
+                                                       rtc_verts[k*3-1].w = 
lerp(curve_radius[fk+k-1], curve_radius[fk+k], 0.66f);
+                                                       rtc_verts[k*3] = 
float3_to_float4(verts[fk+k]);
+                                                       rtc_verts[k*3].w = 
curve_radius[fk+k];
+                                                       rtc_verts[k*3+1] = 
float3_to_float4(-fc * d + verts[fk+k]);
+                                                       rtc_verts[k*3+1].w = 
lerp(curve_radius[fk+k], curve_radius[fk+k+1], 0.33f);
                                                }
-                                               rtc_verts[k*3-1] = 
float3_to_float4(fc * (verts[k] - verts[k-1]) + verts[k]);
-                                               rtc_verts[k*3-1].w = 
lerp(curve_radius[k-1], curve_radius[k], 0.66f);
-                                               rtc_verts[k*3] = 
float3_to_float4(verts[k]);
-                                               rtc_verts[k*3].w = 
curve_radius[k];
+                                               rtc_verts[k*3-1] = 
float3_to_float4(fc * (verts[fk+k] - verts[fk+k-1]) + verts[fk+k]);
+                                               rtc_verts[k*3-1].w = 
lerp(curve_radius[fk+k-1], curve_radius[fk+k], 0.66f);
+                                               rtc_verts[k*3] = 
float3_to_float4(verts[fk+k]);
+                                               rtc_verts[k*3].w = 
curve_radius[fk+k];
                                                rtc_verts += 
c.num_segments()*3+1;
-                                               verts += c.num_keys;
-                                               curve_radius += c.num_keys;
                                        }
                                        else {
                                                assert(0);

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to