[Bf-blender-cvs] [8f79ab21470] cycles_embree: Cycles: Fixed a crash when setting up Embree hair curves

Stefan Werner noreply at git.blender.org
Sun Nov 26 23:11:38 CET 2017


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);



More information about the Bf-blender-cvs mailing list