[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