[Bf-blender-cvs] [4c70b84] hair_system: Very basic random distribution of render hairs.

Lukas Tönne noreply at git.blender.org
Mon Aug 11 18:08:04 CEST 2014


Commit: 4c70b843a808f9eb0c3db6f0daa1b752808f7c5a
Author: Lukas Tönne
Date:   Mon Aug 11 18:07:01 2014 +0200
Branches: hair_system
https://developer.blender.org/rB4c70b843a808f9eb0c3db6f0daa1b752808f7c5a

Very basic random distribution of render hairs.

Render hairs are grouped around a simulated hair in some way. Currently
this is a plain -1..1 box, but should probably be a
gaussian distribution.

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

M	source/blender/editors/space_view3d/drawhair.c
M	source/blender/makesrna/intern/rna_hair.c

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

diff --git a/source/blender/editors/space_view3d/drawhair.c b/source/blender/editors/space_view3d/drawhair.c
index 06f7a38..031e5f7 100644
--- a/source/blender/editors/space_view3d/drawhair.c
+++ b/source/blender/editors/space_view3d/drawhair.c
@@ -39,6 +39,7 @@
 
 #include "BLI_blenlib.h"
 #include "BLI_math.h"
+#include "BLI_rand.h"
 #include "BLI_utildefines.h"
 
 #include "BKE_global.h"
@@ -123,10 +124,33 @@ static int max_hair_points(HairSystem *hsys)
 	return max_points;
 }
 
+typedef struct HairRenderData {
+	float u, v;
+} HairRenderData;
+
+static HairRenderData *gen_render_hairs(HairParams *params, unsigned int seed)
+{
+	int num_render_hairs = params->num_render_hairs;
+	HairRenderData *hair, *data = MEM_mallocN(sizeof(HairRenderData) * num_render_hairs, "hair render data");
+	RNG *rng;
+	int i;
+	
+	rng = BLI_rng_new(seed);
+	
+	for (i = 0, hair = data; i < num_render_hairs; ++i, ++hair) {
+		hair->u = BLI_rng_get_float(rng)*2.0f - 1.0f;
+		hair->v = BLI_rng_get_float(rng)*2.0f - 1.0f;
+	}
+	
+	BLI_rng_free(rng);
+	
+	return data;
+}
+
 static void draw_hair_render(HairSystem *hsys)
 {
-	const float scale = 0.2f;
 	int num_render_hairs = hsys->params.num_render_hairs;
+	HairRenderData *render_data;
 	
 	static unsigned int vertex_glbuf = 0;
 	static unsigned int elem_glbuf = 0;
@@ -145,6 +169,11 @@ static void draw_hair_render(HairSystem *hsys)
 	if (maxelems < 1)
 		return;
 	
+	/* TODO handle seeds properly here ... */
+	render_data = gen_render_hairs(&hsys->params, 12345);
+	
+	glColor3f(0.4f, 0.7f, 1.0f);
+	
 #define USE_BUFFERS
 	
 #ifdef USE_BUFFERS
@@ -175,6 +204,7 @@ static void draw_hair_render(HairSystem *hsys)
 		int totelems = num_render_hairs * 2 * (totsteps-1);
 		unsigned int vertex_offset = 0;
 		unsigned int elem_offset = 0;
+		unsigned int start_vertex = 0;
 		float initial_frame[3][3];
 		
 		get_hair_root_frame(hair, initial_frame);
@@ -185,30 +215,31 @@ static void draw_hair_render(HairSystem *hsys)
 #endif
 		
 		for (HAIR_frame_iter_init(iter, hair, hair->avg_rest_length, hsys->params.curl_smoothing, initial_frame); HAIR_frame_iter_valid(iter); HAIR_frame_iter_next(iter)) {
-			HairPoint *point = hair->points + HAIR_frame_iter_index(iter);
+			int point_index = HAIR_frame_iter_index(iter);
+			HairPoint *point = hair->points + point_index;
+			float radius = point->radius;
 			int a;
 			float co[3], nor[3], tan[3], cotan[3];
 			
-			copy_v3_v3(co, point->co);
 			HAIR_frame_iter_get(iter, nor, tan, cotan);
-			mul_v3_fl(nor, scale);
-			mul_v3_fl(tan, scale);
-			mul_v3_fl(cotan, scale);
-			add_v3_v3(nor, co);
-			add_v3_v3(tan, co);
-			add_v3_v3(cotan, co);
+			
+			copy_v3_v3(co, point->co);
 			
 			for (a = 0; a < num_render_hairs; ++a) {
 				copy_v3_v3(vertex_data[vertex_offset], co);
+				madd_v3_v3fl(vertex_data[vertex_offset], tan, render_data[a].u * radius);
+				madd_v3_v3fl(vertex_data[vertex_offset], cotan, render_data[a].v * radius);
 				
 				if (HAIR_frame_iter_index(iter) < hair->totpoints - 1) {
-					elem_data[elem_offset] = vertex_offset;
-					elem_data[elem_offset + 1] = vertex_offset + 1;
+					elem_data[elem_offset] = start_vertex + a;
+					elem_data[elem_offset + 1] = start_vertex + a + num_render_hairs;
 				}
 				
 				vertex_offset += 1;
 				elem_offset += 2;
 			}
+			
+			start_vertex += num_render_hairs;
 		}
 		
 #ifdef USE_BUFFERS
@@ -244,6 +275,8 @@ static void draw_hair_render(HairSystem *hsys)
 	
 	HAIR_frame_iter_free(iter);
 	
+	MEM_freeN(render_data);
+	
 #undef USE_BUFFERS
 }
 
diff --git a/source/blender/makesrna/intern/rna_hair.c b/source/blender/makesrna/intern/rna_hair.c
index bebbcb0..35636a1 100644
--- a/source/blender/makesrna/intern/rna_hair.c
+++ b/source/blender/makesrna/intern/rna_hair.c
@@ -152,6 +152,7 @@ static void rna_def_hair_params(BlenderRNA *brna)
 	RNA_def_property_ui_range(prop, 1, 200, 1, 1);
 	RNA_def_property_int_default(prop, 100);
 	RNA_def_property_ui_text(prop, "Render Hairs", "Number of hairs rendered around each simulated hair");
+	RNA_def_property_update(prop, 0, "rna_HairParams_render_update");
 
 	prop = RNA_def_property(srna, "curl_smoothing", PROP_FLOAT, PROP_FACTOR);
 	RNA_def_property_float_sdna(prop, NULL, "curl_smoothing");




More information about the Bf-blender-cvs mailing list