[Bf-blender-cvs] [25a83cb3cbf] hair_guides: Fix indexing of vertex buffers for Cycles hair.
Lukas Tönne
noreply at git.blender.org
Sun May 13 10:47:05 CEST 2018
Commit: 25a83cb3cbf02324a9fba45324a7ef97408cbc4b
Author: Lukas Tönne
Date: Sun May 13 09:46:31 2018 +0100
Branches: hair_guides
https://developer.blender.org/rB25a83cb3cbf02324a9fba45324a7ef97408cbc4b
Fix indexing of vertex buffers for Cycles hair.
===================================================================
M intern/cycles/blender/blender_curves.cpp
M source/blender/blenkernel/intern/hair_draw.c
===================================================================
diff --git a/intern/cycles/blender/blender_curves.cpp b/intern/cycles/blender/blender_curves.cpp
index f773548286f..f547ed7ef1a 100644
--- a/intern/cycles/blender/blender_curves.cpp
+++ b/intern/cycles/blender/blender_curves.cpp
@@ -346,33 +346,46 @@ static void ObtainCacheDataFromHairSystem(Mesh *mesh,
}
// Allocate buffers
- const size_t firstkey_start = CData->curve_firstkey.size();
- const size_t keynum_start = CData->curve_keynum.size();
- const size_t length_start = CData->curve_length.size();
- const size_t co_start = CData->curvekey_co.size();
- const size_t time_start = CData->curvekey_time.size();
- CData->curve_firstkey.resize(firstkey_start + totcurves);
- CData->curve_keynum.resize(keynum_start + totcurves);
- CData->curve_length.resize(length_start + totcurves);
- CData->curvekey_co.resize(co_start + totverts);
- CData->curvekey_time.resize(time_start + totverts);
+ int *firstkey_data;
+ int *keynum_data;
+ float *length_data;
+ float3 *co_data;
+ float *time_data;
+ {
+ const size_t firstkey_start = CData->curve_firstkey.size();
+ const size_t keynum_start = CData->curve_keynum.size();
+ const size_t length_start = CData->curve_length.size();
+ const size_t co_start = CData->curvekey_co.size();
+ const size_t time_start = CData->curvekey_time.size();
+ CData->curve_firstkey.resize(firstkey_start + totcurves);
+ CData->curve_keynum.resize(keynum_start + totcurves);
+ CData->curve_length.resize(length_start + totcurves);
+ CData->curvekey_co.resize(co_start + totverts);
+ CData->curvekey_time.resize(time_start + totverts);
+ firstkey_data = CData->curve_firstkey.data() + firstkey_start;
+ keynum_data = CData->curve_keynum.data() + keynum_start;
+ length_data = CData->curve_length.data() + length_start;
+ co_data = CData->curvekey_co.data() + co_start;
+ time_data = CData->curvekey_time.data() + time_start;
+ }
// Import render curves from hair system
BKE_hair_render_fill_buffers(
hair_cache,
(int)sizeof(float3),
- CData->curve_firstkey.data() + firstkey_start,
- CData->curve_keynum.data() + keynum_start,
- (float*)(CData->curvekey_co.data() + co_start));
+ firstkey_data,
+ keynum_data,
+ (float*)co_data);
// Compute curve length and key times
for(int c = 0; c < totcurves; ++c) {
- const int keynum = CData->curve_keynum[keynum_start + c];
+ const int firstkey = firstkey_data[c];
+ const int keynum = keynum_data[c];
float curve_length = 0.0f;
float3 pcKey;
for(int v = 0; v < keynum; v++) {
- float3 cKey = CData->curvekey_co[co_start + v];
+ float3 cKey = co_data[firstkey + v];
cKey = transform_point(&itfm, cKey);
if(v > 0) {
float step_length = len(cKey - pcKey);
@@ -381,15 +394,16 @@ static void ObtainCacheDataFromHairSystem(Mesh *mesh,
curve_length += step_length;
}
- CData->curvekey_time.push_back_slow(curve_length);
+ co_data[firstkey + v] = cKey;
+ time_data[v] = curve_length;
pcKey = cKey;
}
- CData->curve_length.push_back_slow(curve_length);
+ firstkey_data[c] = *keyno;
+ length_data[c] = curve_length;
+ *keyno += keynum;
}
-
*curvenum += totcurves;
- *keyno += totverts;
BKE_hair_export_cache_free(hair_cache);
}
diff --git a/source/blender/blenkernel/intern/hair_draw.c b/source/blender/blenkernel/intern/hair_draw.c
index 8c7a29f8210..1d48b358dc3 100644
--- a/source/blender/blenkernel/intern/hair_draw.c
+++ b/source/blender/blenkernel/intern/hair_draw.c
@@ -234,10 +234,6 @@ static void hair_fiber_interpolate_vertex(
float r_tangent[3],
float r_target_matrix[3][3])
{
- zero_v3(r_co);
- zero_v3(r_tangent);
- unit_m3(r_target_matrix);
-
float pco[3], ptang[3], pnor[3];
interpolate_parent_curve(
curve_param,
@@ -272,8 +268,16 @@ static void hair_fiber_interpolate(
const float dcurve_param = 1.0f / (numverts - 1);
const float *rootco = cache->fiber_root_position[fiber_index];
- // Add weighted data from each parent
+ // Initialize
+ {
+ float *vert = r_vertco;
+ for (int i = 0; i < numverts; ++i, vert = POINTER_OFFSET(vert, vertco_stride))
+ {
+ zero_v3(vert);
+ }
+ }
+ // Add weighted data from each parent
for (int k = 0; k < 4; ++k)
{
const unsigned int parent_index = cache->follicles[fiber_index].parent_index[k];
@@ -291,7 +295,7 @@ static void hair_fiber_interpolate(
float *vert = r_vertco;
float curve_param = 0.0f;
- for (int i = 0; i < numverts; ++i, vert += vertco_stride)
+ for (int i = 0; i < numverts; ++i, vert = POINTER_OFFSET(vert, vertco_stride))
{
float tangent[3];
float target_matrix[3][3];
@@ -315,7 +319,7 @@ static void hair_fiber_interpolate(
* Normalize tangents
*/
float *vert = r_vertco;
- for (int i = 0; i < numverts; ++i, vert += vertco_stride)
+ for (int i = 0; i < numverts; ++i, vert = POINTER_OFFSET(vert, vertco_stride))
{
add_v3_v3(vert, rootco);
// r_tangent = normalize(r_tangent);
@@ -344,17 +348,17 @@ void BKE_hair_render_fill_buffers(
int *r_curvelen,
float *r_vertco)
{
+ int vertstart = 0;
+ float *vert = r_vertco;
+ for (int i = 0; i < cache->totfibercurves; ++i)
{
- int vertstart = 0;
- for (int i = 0; i < cache->totfibercurves; ++i)
- {
- const int numverts = cache->fiber_numverts[i];
- r_curvestart[i] = vertstart;
- r_curvelen[i] = numverts;
-
- hair_fiber_interpolate(cache, i, vertco_stride, &r_vertco[vertstart]);
-
- vertstart += numverts;
- }
+ const int numverts = cache->fiber_numverts[i];
+ r_curvestart[i] = vertstart;
+ r_curvelen[i] = numverts;
+
+ hair_fiber_interpolate(cache, i, vertco_stride, vert);
+
+ vertstart += numverts;
+ vert = POINTER_OFFSET(vert, vertco_stride * numverts);
}
}
More information about the Bf-blender-cvs
mailing list