Commit: 68d80478af236e6fd7f20dbff10c56d1ab20abb0
Author: Lukas Tönne
Date:   Wed Jan 21 17:20:47 2015 +0100
Branches: gooseberry
https://developer.blender.org/rB68d80478af236e6fd7f20dbff10c56d1ab20abb0

New draw mode 'HULL' for hair drawing.

Not implemented yet, currently uses just the child path drawing.

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

M       source/blender/editors/space_view3d/drawobject.c
M       source/blender/makesdna/DNA_particle_types.h
M       source/blender/makesrna/intern/rna_particle.c

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

diff --git a/source/blender/editors/space_view3d/drawobject.c 
b/source/blender/editors/space_view3d/drawobject.c
index bab19e4..80ac864 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -4480,6 +4480,77 @@ static bool drawDispList(Scene *scene, View3D *v3d, 
RegionView3D *rv3d, Base *ba
 }
 
 /* *********** drawing for particles ************* */
+
+static void draw_particle_hair_hull(Scene *scene, View3D *v3d, RegionView3D 
*rv3d,
+                                    Base *base, ParticleSystem *psys,
+                                    const char ob_dt, const short dflag)
+{
+       Object *ob = base->object;
+       ParticleSettings *part = psys->part;
+       /*Material *ma = give_current_material(ob, part->omat);*/
+       GLint polygonmode[2];
+       int totchild;
+       
+       ParticleData *pa;
+       ParticleCacheKey **cache, *path;
+       int p;
+       
+       if (part->type == PART_HAIR && !psys->childcache)
+               totchild = 0;
+       else
+               totchild = psys->totchild * part->disp / 100;
+       
+       if (v3d->zbuf)
+               glDepthMask(true);
+       
+       glGetIntegerv(GL_POLYGON_MODE, polygonmode);
+       glEnableClientState(GL_VERTEX_ARRAY);
+       glEnableClientState(GL_NORMAL_ARRAY);
+       
+       glEnable(GL_LIGHTING);
+       glEnable(GL_COLOR_MATERIAL);
+       glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
+       
+       
+#if 0
+       /* draw actual/parent particles */
+       cache = psys->pathcache;
+       for (p = 0, pa = psys->particles; p < totpart; ++p, ++pa) {
+               path = cache[p];
+               if (path->segments > 0) {
+                       glVertexPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), 
path->co);
+                       glNormalPointer(GL_FLOAT, sizeof(ParticleCacheKey), 
path->vel);
+                       
+                       glDrawArrays(GL_LINE_STRIP, 0, path->segments + 1);
+               }
+       }
+#endif
+       
+       /* draw child particles */
+       cache = psys->childcache;
+       for (p = 0; p < totchild; ++p) {
+               path = cache[p];
+               
+               glVertexPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), 
path->co);
+               glNormalPointer(GL_FLOAT, sizeof(ParticleCacheKey), path->vel);
+               
+               glDrawArrays(GL_LINE_STRIP, 0, path->segments + 1);
+       }
+       
+       
+       glDisable(GL_COLOR_MATERIAL);
+       glDisable(GL_LIGHTING);
+       
+       glDisableClientState(GL_VERTEX_ARRAY);
+       glDisableClientState(GL_NORMAL_ARRAY);
+       glPolygonMode(GL_FRONT, polygonmode[0]);
+       glPolygonMode(GL_BACK, polygonmode[1]);
+       
+       if ((base->flag & OB_FROMDUPLI) && (ob->flag & OB_FROMGROUP)) {
+               glLoadMatrixf(rv3d->viewmat);
+       }
+}
+
 static void draw_particle_arrays(int draw_as, int totpoint, int ob_dt, int 
select)
 {
        /* draw created data arrays */
@@ -4504,6 +4575,7 @@ static void draw_particle_arrays(int draw_as, int 
totpoint, int ob_dt, int selec
                        break;
        }
 }
+
 static void draw_particle(ParticleKey *state, int draw_as, short draw, float 
pixsize,
                           float imat[4][4], const float draw_line[2], 
ParticleBillboardData *bb, ParticleDrawData *pdd)
 {
@@ -4654,6 +4726,7 @@ static void draw_particle(ParticleKey *state, int 
draw_as, short draw, float pix
                }
        }
 }
+
 static void draw_particle_data(ParticleSystem *psys, RegionView3D *rv3d,
                                ParticleKey *state, int draw_as,
                                float imat[4][4], ParticleBillboardData *bb, 
ParticleDrawData *pdd,
@@ -4735,14 +4808,15 @@ static void draw_new_particle_system(Scene *scene, 
View3D *v3d, RegionView3D *rv
        /* don't draw normal paths in edit mode */
        if (psys_in_edit_mode(scene, psys) && (pset->flag & PE_DRAW_PART) == 0)
                return;
-
-       if (part->draw_as == PART_DRAW_REND)
-               draw_as = part->ren_as;
-       else
-               draw_as = part->draw_as;
-
-       if (draw_as == PART_DRAW_NOT)
+       
+       draw_as = part->draw_as == PART_DRAW_REND ? part->ren_as : 
part->draw_as;
+       if (draw_as == PART_DRAW_NOT) {
                return;
+       }
+       else if (draw_as == PART_DRAW_HULL) {
+               draw_particle_hair_hull(scene, v3d, rv3d, base, psys, ob_dt, 
dflag);
+               return;
+       }
 
 /* 2. */
        sim.scene = scene;
@@ -4943,7 +5017,7 @@ static void draw_new_particle_system(Scene *scene, View3D 
*v3d, RegionView3D *rv
        else if (psys->pdd) {
                psys_free_pdd(psys);
                MEM_freeN(psys->pdd);
-               pdd = psys->pdd = NULL;
+               psys->pdd = NULL;
        }
 
        if (pdd) {
diff --git a/source/blender/makesdna/DNA_particle_types.h 
b/source/blender/makesdna/DNA_particle_types.h
index 71ca02a..033cbb3 100644
--- a/source/blender/makesdna/DNA_particle_types.h
+++ b/source/blender/makesdna/DNA_particle_types.h
@@ -477,18 +477,21 @@ typedef enum eParticleChildFlag {
 
 /* part->draw_as */
 /* part->ren_as*/
-#define PART_DRAW_NOT          0
-#define PART_DRAW_DOT          1
-#define PART_DRAW_HALO         1
-#define PART_DRAW_CIRC         2
-#define PART_DRAW_CROSS                3
-#define PART_DRAW_AXIS         4
-#define PART_DRAW_LINE         5
-#define PART_DRAW_PATH         6
-#define PART_DRAW_OB           7
-#define PART_DRAW_GR           8
-#define PART_DRAW_BB           9
-#define PART_DRAW_REND         10
+typedef enum eParticleDrawMethod {
+       PART_DRAW_NOT           = 0,
+       PART_DRAW_DOT           = 1,
+       PART_DRAW_HALO          = 1,
+       PART_DRAW_CIRC          = 2,
+       PART_DRAW_CROSS         = 3,
+       PART_DRAW_AXIS          = 4,
+       PART_DRAW_LINE          = 5,
+       PART_DRAW_PATH          = 6,
+       PART_DRAW_OB            = 7,
+       PART_DRAW_GR            = 8,
+       PART_DRAW_BB            = 9,
+       PART_DRAW_REND          = 10,
+       PART_DRAW_HULL          = 11,
+} eParticleDrawMethod;
 
 /* part->integrator */
 #define PART_INT_EULER         0
diff --git a/source/blender/makesrna/intern/rna_particle.c 
b/source/blender/makesrna/intern/rna_particle.c
index a5ed3ff..0af22df 100644
--- a/source/blender/makesrna/intern/rna_particle.c
+++ b/source/blender/makesrna/intern/rna_particle.c
@@ -98,9 +98,10 @@ static EnumPropertyItem part_draw_as_items[] = {
 
 #ifdef RNA_RUNTIME
 static EnumPropertyItem part_hair_draw_as_items[] = {
-       {PART_DRAW_NOT, "NONE", 0, "None", ""},
-       {PART_DRAW_REND, "RENDER", 0, "Rendered", ""},
-       {PART_DRAW_PATH, "PATH", 0, "Path", ""},
+       {PART_DRAW_NOT, "NONE", 0, "None", "No hair drawing"},
+       {PART_DRAW_REND, "RENDER", 0, "Rendered", "Approximate render result in 
the viewport"},
+       {PART_DRAW_PATH, "PATH", 0, "Path", "Show path of hair particles"},
+       {PART_DRAW_HULL, "HULL", 0, "Hull", "Show convex hull of child particle 
paths"},
        {0, NULL, 0, NULL, NULL}
 };
 #endif

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to