[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