Commit: 9c4837d8e9f03c2d04b3c6497c10bcc515c69101
Author: Lukas Tönne
Date:   Mon Aug 11 15:18:50 2014 +0200
Branches: hair_system
https://developer.blender.org/rB9c4837d8e9f03c2d04b3c6497c10bcc515c69101

"Render" draw mode for hair, currently just drawing the coordinate
frames.

The average hair segment rest length is now calculated in advance in the
DNA data, so the drawing/rendering can use it for smoothing as well.

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

M       release/scripts/startup/bl_ui/properties_data_modifier.py
M       source/blender/blenkernel/BKE_hair.h
M       source/blender/blenkernel/intern/hair.c
M       source/blender/editors/physics/hair_ops.c
M       source/blender/editors/space_view3d/drawhair.c
M       source/blender/hair/HAIR_capi.cpp
M       source/blender/hair/HAIR_capi.h
M       source/blender/hair/intern/HAIR_scene.cpp
M       source/blender/hair/intern/HAIR_smoothing.h
M       source/blender/hair/intern/HAIR_solver.cpp
M       source/blender/makesdna/DNA_hair_types.h
M       source/blender/makesrna/intern/rna_hair.c

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

diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py 
b/release/scripts/startup/bl_ui/properties_data_modifier.py
index e81210a..f748057 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -1262,6 +1262,11 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
         
         col.separator()
         
+        col.label("Render:")
+        col2.prop(params, "curl_smoothing")
+        
+        col.separator()
+        
         col.label("Display:")
         row = col.row()
         row.prop(display, "mode", expand=True)
diff --git a/source/blender/blenkernel/BKE_hair.h 
b/source/blender/blenkernel/BKE_hair.h
index 0cc463b..9d7e4d7 100644
--- a/source/blender/blenkernel/BKE_hair.h
+++ b/source/blender/blenkernel/BKE_hair.h
@@ -51,6 +51,8 @@ struct HairPoint *BKE_hair_point_insert_multi(struct 
HairSystem *hsys, struct Ha
 void BKE_hair_point_remove(struct HairSystem *hsys, struct HairCurve *hair, 
struct HairPoint *point);
 void BKE_hair_point_remove_position(struct HairSystem *hsys, struct HairCurve 
*hair, int pos);
 
+void BKE_hair_calculate_rest(struct HairSystem *hsys);
+
 void BKE_hair_debug_data_free(struct HairDebugData *debug_data);
 
 #endif
diff --git a/source/blender/blenkernel/intern/hair.c 
b/source/blender/blenkernel/intern/hair.c
index 3f86e84..b07775a 100644
--- a/source/blender/blenkernel/intern/hair.c
+++ b/source/blender/blenkernel/intern/hair.c
@@ -33,6 +33,7 @@
 
 #include "MEM_guardedalloc.h"
 
+#include "BLI_math.h"
 #include "BLI_utildefines.h"
 
 #include "DNA_hair_types.h"
@@ -192,6 +193,25 @@ void BKE_hair_point_remove_position(HairSystem 
*UNUSED(hsys), HairCurve *hair, i
        hair->totpoints = ntotpoints;
 }
 
+void BKE_hair_calculate_rest(HairSystem *hsys)
+{
+       HairCurve *hair;
+       int i;
+       
+       for (i = 0, hair = hsys->curves; i < hsys->totcurves; ++i, ++hair) {
+               HairPoint *point;
+               int k;
+               float tot_rest_length;
+               
+               tot_rest_length = 0.0f;
+               for (k = 1, point = hair->points + 1; k < hair->totpoints; ++k, 
++point) {
+                       tot_rest_length += len_v3v3((point-1)->rest_co, 
point->rest_co);
+               }
+               if (hair->totpoints > 1)
+                       hair->avg_rest_length = tot_rest_length / 
(float)(hair->totpoints-1);
+       }
+}
+
 void BKE_hair_debug_data_free(HairDebugData *debug_data)
 {
        if (debug_data) {
diff --git a/source/blender/editors/physics/hair_ops.c 
b/source/blender/editors/physics/hair_ops.c
index 9bf00c6..15a08ae 100644
--- a/source/blender/editors/physics/hair_ops.c
+++ b/source/blender/editors/physics/hair_ops.c
@@ -276,6 +276,8 @@ static int hair_copy_from_particles_exec(bContext *C, 
wmOperator *op)
                hmd->flag &= ~MOD_HAIR_SOLVER_DATA_VALID;
        }
        
+       BKE_hair_calculate_rest(hsys);
+       
        WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
        return OPERATOR_FINISHED;
 }
diff --git a/source/blender/editors/space_view3d/drawhair.c 
b/source/blender/editors/space_view3d/drawhair.c
index f37e022..5d3bfbe 100644
--- a/source/blender/editors/space_view3d/drawhair.c
+++ b/source/blender/editors/space_view3d/drawhair.c
@@ -57,30 +57,99 @@
 
 /* TODO vertex/index buffers, etc. etc., avoid direct mode ... */
 
-static void draw_hair_curve(HairSystem *UNUSED(hsys), HairCurve *hair)
+static void draw_hair_line(HairSystem *hsys)
 {
-       HairPoint *point;
-       int k;
+       HairCurve *hair;
+       int i;
        
-       glColor3f(0.4f, 0.7f, 1.0f);
+       for (hair = hsys->curves, i = 0; i < hsys->totcurves; ++hair, ++i) {
+               HairPoint *point;
+               int k;
+               
+               glColor3f(0.4f, 0.7f, 1.0f);
+               
+               glBegin(GL_LINE_STRIP);
+               for (point = hair->points, k = 0; k < hair->totpoints; ++point, 
++k) {
+                       glVertex3fv(point->co);
+               }
+               glEnd();
+               
+               glPointSize(2.5f);
+               glBegin(GL_POINTS);
+               for (point = hair->points, k = 0; k < hair->totpoints; ++point, 
++k) {
+                       if (k == 0)
+                               glColor3f(1.0f, 0.0f, 1.0f);
+                       else
+                               glColor3f(0.2f, 0.0f, 1.0f);
+                       glVertex3fv(point->co);
+               }
+               glEnd();
+               glPointSize(1.0f);
+       }
+}
+
+static void get_hair_root_frame(HairCurve *hair, float frame[3][3])
+{
+       const float up[3] = {0.0f, 0.0f, 1.0f};
+       float normal[3];
        
-       glBegin(GL_LINE_STRIP);
-       for (point = hair->points, k = 0; k < hair->totpoints; ++point, ++k) {
-               glVertex3fv(point->co);
+       if (hair->totpoints >= 2) {
+               sub_v3_v3v3(normal, hair->points[1].co, hair->points[0].co);
+               normalize_v3(normal);
+               
+               copy_v3_v3(frame[0], normal);
+               madd_v3_v3v3fl(frame[1], up, normal, -dot_v3v3(up, normal));
+               normalize_v3(frame[1]);
+               cross_v3_v3v3(frame[2], frame[0], frame[1]);
        }
-       glEnd();
+       else {
+               unit_m3(frame);
+       }
+}
+
+static void draw_hair_render(HairSystem *hsys)
+{
+       const float scale = 0.2f;
        
-       glPointSize(2.5f);
-       glBegin(GL_POINTS);
-       for (point = hair->points, k = 0; k < hair->totpoints; ++point, ++k) {
-               if (k == 0)
-                       glColor3f(1.0f, 0.0f, 1.0f);
-               else
-                       glColor3f(0.2f, 0.0f, 1.0f);
-               glVertex3fv(point->co);
+       struct HAIR_FrameIterator *iter = HAIR_frame_iter_new();
+       int i;
+       
+       glBegin(GL_LINES);
+       
+       for (i = 0; i < hsys->totcurves; ++i) {
+               HairCurve *hair = hsys->curves + i;
+               float initial_frame[3][3];
+               
+               get_hair_root_frame(hair, initial_frame);
+               
+               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);
+                       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);
+                       
+                       glColor3f(1.0f, 0.0f, 0.0f);
+                       glVertex3fv(co);
+                       glVertex3fv(nor);
+                       glColor3f(0.0f, 1.0f, 0.0f);
+                       glVertex3fv(co);
+                       glVertex3fv(tan);
+                       glColor3f(0.0f, 0.0f, 1.0f);
+                       glVertex3fv(co);
+                       glVertex3fv(cotan);
+               }
        }
+       
        glEnd();
-       glPointSize(1.0f);
+       
+       HAIR_frame_iter_free(iter);
 }
 
 static void count_hairs(HairSystem *hsys, int *totpoints, int *validhairs)
@@ -285,8 +354,6 @@ bool draw_hair_system(Scene *UNUSED(scene), View3D 
*UNUSED(v3d), ARegion *ar, Ba
 {
        RegionView3D *rv3d = ar->regiondata;
        Object *ob = base->object;
-       HairCurve *hair;
-       int i;
        bool retval = true;
        
        glLoadMatrixf(rv3d->viewmat);
@@ -294,12 +361,10 @@ bool draw_hair_system(Scene *UNUSED(scene), View3D 
*UNUSED(v3d), ARegion *ar, Ba
        
        switch (hsys->display.mode) {
                case HAIR_DISPLAY_LINE:
-                       for (hair = hsys->curves, i = 0; i < hsys->totcurves; 
++hair, ++i) {
-                               draw_hair_curve(hsys, hair);
-                       }
+                       draw_hair_line(hsys);
                        break;
                case HAIR_DISPLAY_RENDER:
-                       // TODO
+                       draw_hair_render(hsys);
                        break;
                case HAIR_DISPLAY_HULL:
                        draw_hair_hulls(hsys);
diff --git a/source/blender/hair/HAIR_capi.cpp 
b/source/blender/hair/HAIR_capi.cpp
index 81186ca..91e5030 100644
--- a/source/blender/hair/HAIR_capi.cpp
+++ b/source/blender/hair/HAIR_capi.cpp
@@ -174,6 +174,9 @@ void HAIR_solver_apply(struct HAIR_Solver *csolver, Scene 
*scene, Object *ob, Ha
 struct HairCurveWalker {
        typedef float3 data_t;
        
+       HairCurveWalker()
+       {}
+       
        HairCurveWalker(HairCurve *curve) :
            curve(curve),
            i(0)
@@ -232,19 +235,21 @@ void HAIR_smoothing_iter_next(struct 
HAIR_SmoothingIteratorFloat3 *citer)
        iter->next();
 }
 
-#if 0
-struct HAIR_FrameIterator *HAIR_frame_iter_new(HairCurve *curve, float 
rest_length, float amount)
+struct HAIR_FrameIterator *HAIR_frame_iter_new(void)
 {
-       HairCurveFrameIterator *iter = new 
HairCurveFrameIterator(HairCurveWalker(curve), rest_length, amount);
-       
-       return (struct HAIR_FrameIterator *)iter;
+       return (struct HAIR_FrameIterator *)(new HairCurveFrameIterator());
 }
 
 void HAIR_frame_iter_free(struct HAIR_FrameIterator *citer)
 {
+       delete ((HairCurveFrameIterator *)citer);
+}
+
+void HAIR_frame_iter_init(struct HAIR_FrameIterator *citer, HairCurve *curve, 
float rest_length, float amount, float initial_frame[3][3])
+{
        HairCurveFrameIterator *iter = (HairCurveFrameIterator *)citer;
        
-       delete iter;
+       *iter = HairCurveFrameIterator(HairCurveWalker(curve), rest_length, 
amount, Frame(initial_frame[0], initial_frame[1], initial_frame[2]));
 }
 
 bool HAIR_frame_iter_valid(struct HAIR_FrameIterator *citer)
@@ -254,6 +259,13 @@ bool HAIR_frame_iter_valid(struct HAIR_FrameIterator 
*citer)
        return iter->valid();
 }
 
+int HAIR_frame_iter_index(struct HAIR_FrameIterator *citer)
+{
+       HairCurveFrameIterator *iter = (HairCurveFrameIterator *)citer;
+       
+       return iter->index();
+}
+
 void HAIR_frame_iter_get(struct HAIR_FrameIterator *citer, float cnor[3], 
float ctan[3], float ccotan[3])
 {
        HairCurveFrameIterator *iter = (HairCurveFrameIterator *)citer;
@@ -269,4 +281,3 @@ void HAIR_frame_iter_next(struct HAIR_FrameIterator *citer)
        
        iter->next();
 }
-#endif
diff --git a/source/blender/hair/HAIR_capi.h b/source/blender/hair/HAIR_capi.h
index d419478..0037384 100644
--- a/source/blender/hair/HAIR_capi.h
+++ b/source/blender/hair/HAIR_capi.h
@@ -69,13 +69,13 @@ bool HAIR_smoothing_iter_valid(struct 
HAIR_SmoothingIteratorFloat3 *iter);
 void HAIR_smoothing_iter_get(struct HAIR_SmoothingIteratorFloat3 *iter, float 
val[3]);
 void HAIR_smoothing_iter_next(struct HAIR_SmoothingIteratorFloat3 *iter);
 
-#if 0
-struct HAIR_FrameIterator *HAIR_frame_iter_new(struct HairCurve *curve, float 
rest_length, float amount);
+struct HAIR_FrameIterator *HAIR_frame_iter_new(void);
 void HAIR_frame_iter_free(struct HAIR_FrameIterator *iter);
+void HAIR_frame_iter_init(struct HAIR_FrameIterator *iter, struct HairCurve 
*curve, float rest_length, float amount, float initial_frame[3][3]);
 bool HAIR_frame_iter_valid(struct HAIR_FrameIterator *iter);
+int HAIR_frame_iter_index(struct HAIR_FrameIterator *citer);
 void HAIR_frame_iter_get(struct HAIR_FrameIterator *iter, float nor[3], float 
tan[3], float cotan[3]);
 void HAIR_frame_iter_next(struct HAIR_FrameIterator *iter);
-#endif
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/hair/intern/HAIR_scene.cpp 
b/source/blender/hair/intern/HAIR_scene.cpp
index c837a16..ebe8135 100644
--- a/source/blender/hair/intern/HAIR_scene.cpp
+++ b/source/blender/hair/intern/HAIR_scene.cpp
@@ -92,6 +92,7 @@ SolverData *SceneConverter::bui

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to