Commit: b690f220e2305407e191b3d732d9759fa3d4dcfa
Author: Lukas Tönne
Date:   Wed Mar 25 18:07:03 2015 +0100
Branches: gooseberry
https://developer.blender.org/rBb690f220e2305407e191b3d732d9759fa3d4dcfa

Basic drawing code for strands loaded from caches.

This is entirely separate from particle systems and their insane
drawing function.

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

M       source/blender/blenkernel/BKE_strands.h
M       source/blender/editors/space_view3d/CMakeLists.txt
A       source/blender/editors/space_view3d/drawstrands.c
M       source/blender/editors/space_view3d/view3d_draw.c
M       source/blender/editors/space_view3d/view3d_intern.h
M       source/blender/pointcache/alembic/abc_particles.cpp
M       source/blender/pointcache/alembic/abc_particles.h

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

diff --git a/source/blender/blenkernel/BKE_strands.h 
b/source/blender/blenkernel/BKE_strands.h
index 22e9c4b..f19c137 100644
--- a/source/blender/blenkernel/BKE_strands.h
+++ b/source/blender/blenkernel/BKE_strands.h
@@ -53,6 +53,7 @@ BLI_INLINE void BKE_strand_iter_init(StrandIterator *iter, 
Strands *strands)
        iter->tot = strands->totcurves;
        iter->index = 0;
        iter->curve = strands->curves;
+       iter->verts = strands->verts;
 }
 
 BLI_INLINE bool BKE_strand_iter_valid(StrandIterator *iter)
diff --git a/source/blender/editors/space_view3d/CMakeLists.txt 
b/source/blender/editors/space_view3d/CMakeLists.txt
index ab69e67..7d36931 100644
--- a/source/blender/editors/space_view3d/CMakeLists.txt
+++ b/source/blender/editors/space_view3d/CMakeLists.txt
@@ -45,6 +45,7 @@ set(SRC
        drawmesh.c
        drawobject.c
        drawsimdebug.c
+       drawstrands.c
        drawvolume.c
        space_view3d.c
        view3d_buttons.c
diff --git a/source/blender/editors/space_view3d/drawstrands.c 
b/source/blender/editors/space_view3d/drawstrands.c
new file mode 100644
index 0000000..ccc5d67
--- /dev/null
+++ b/source/blender/editors/space_view3d/drawstrands.c
@@ -0,0 +1,121 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. 
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2014 by the Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Lukas Toenne
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/editors/space_view3d/drawsimdebug.c
+ *  \ingroup spview3d
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_view3d_types.h"
+#include "DNA_object_types.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_global.h"
+#include "BKE_strands.h"
+
+#include "view3d_intern.h"
+
+#include "BIF_gl.h"
+#include "BIF_glutil.h"
+
+#include "UI_resources.h"
+
+static void draw_strand_lines(Strands *strands, short dflag)
+{
+       GLint polygonmode[2];
+       StrandIterator it_strand;
+       
+       glGetIntegerv(GL_POLYGON_MODE, polygonmode);
+       glEnableClientState(GL_VERTEX_ARRAY);
+       
+       /* setup gl flags */
+//     glEnableClientState(GL_NORMAL_ARRAY);
+       
+       if ((dflag & DRAW_CONSTCOLOR) == 0) {
+//             if (part->draw_col == PART_DRAW_COL_MAT)
+//                     glEnableClientState(GL_COLOR_ARRAY);
+       }
+       
+       glColor3f(1,1,1);
+//     glEnable(GL_LIGHTING);
+//     glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
+//     glEnable(GL_COLOR_MATERIAL);
+       
+       for (BKE_strand_iter_init(&it_strand, strands); 
BKE_strand_iter_valid(&it_strand); BKE_strand_iter_next(&it_strand)) {
+               if (it_strand.tot <= 0)
+                       continue;
+               
+               glVertexPointer(3, GL_FLOAT, sizeof(StrandsVertex), 
it_strand.verts->co);
+//             glNormalPointer(GL_FLOAT, sizeof(StrandsVertex), 
it_strand.verts->nor);
+               if ((dflag & DRAW_CONSTCOLOR) == 0) {
+//                     if (part->draw_col == PART_DRAW_COL_MAT) {
+//                             glColorPointer(3, GL_FLOAT, 
sizeof(ParticleCacheKey), path->col);
+//                     }
+               }
+               
+               glDrawArrays(GL_LINE_STRIP, 0, it_strand.curve->numverts);
+       }
+       
+       /* restore & clean up */
+//     if (part->draw_col == PART_DRAW_COL_MAT)
+//             glDisableClientState(GL_COLOR_ARRAY);
+       glDisable(GL_COLOR_MATERIAL);
+       
+       glLineWidth(1.0f);
+       
+       glPolygonMode(GL_FRONT, polygonmode[0]);
+       glPolygonMode(GL_BACK, polygonmode[1]);
+}
+
+void draw_strands(Scene *UNUSED(scene), View3D *UNUSED(v3d), ARegion *ar, 
Object *ob, Strands *strands, short dflag)
+{
+       RegionView3D *rv3d = ar->regiondata;
+       float imat[4][4];
+       
+       invert_m4_m4(imat, rv3d->viewmatob);
+       
+//     glDepthMask(GL_FALSE);
+//     glEnable(GL_BLEND);
+       
+       glPushMatrix();
+       
+       glLoadMatrixf(rv3d->viewmat);
+       glMultMatrixf(ob->obmat);
+       
+       draw_strand_lines(strands, dflag);
+       
+       glPopMatrix();
+       
+//     glDepthMask(GL_TRUE);
+//     glDisable(GL_BLEND);
+}
diff --git a/source/blender/editors/space_view3d/view3d_draw.c 
b/source/blender/editors/space_view3d/view3d_draw.c
index 6aa05f0..47c8ea2 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -2071,6 +2071,20 @@ int dupli_ob_sort(void *arg1, void *arg2)
 }
 #endif
 
+static void draw_dupli_object(Scene *scene, ARegion *ar, View3D *v3d, Base 
*base, DupliObject *UNUSED(dob), DupliObjectData *dob_data, short dflag)
+{
+       draw_object(scene, ar, v3d, base, dflag);
+       
+       if (dob_data) {
+               LinkData *link;
+               
+               for (link = dob_data->strands.first; link; link = link->next) {
+                       struct Strands *strands = link->data;
+                       
+                       draw_strands(scene, v3d, ar, base->object, strands, 
dflag);
+               }
+       }
+}
 
 static DupliObject *dupli_step(DupliObject *dob)
 {
@@ -2120,6 +2134,7 @@ static void draw_dupli_objects_color(
 
        for (; dob; dob_prev = dob, dob = dob_next, dob_next = dob_next ? 
dupli_step(dob_next->next) : NULL) {
                /* for restoring after override */
+               DupliObjectData *dob_data = NULL;
                DerivedMesh *store_final_dm;
 
                tbase.object = dob->ob;
@@ -2164,7 +2179,7 @@ static void draw_dupli_objects_color(
                bb_tmp = NULL;
                tbase.object->transflag &= ~OB_IS_DUPLI_CACHE;
                if (base->object->dup_cache) {
-                       DupliObjectData *dob_data = 
BKE_dupli_cache_find_data(base->object->dup_cache, tbase.object);
+                       dob_data = 
BKE_dupli_cache_find_data(base->object->dup_cache, tbase.object);
                        if (dob_data->dm) {
                                tbase.object->transflag |= OB_IS_DUPLI_CACHE;
                                
@@ -2221,7 +2236,7 @@ static void draw_dupli_objects_color(
                                        
                                        displist = glGenLists(1);
                                        glNewList(displist, GL_COMPILE);
-                                       draw_object(scene, ar, v3d, &tbase, 
dflag_dupli);
+                                       draw_dupli_object(scene, ar, v3d, 
&tbase, dob, dob_data, dflag_dupli);
                                        glEndList();
                                        
                                        use_displist = true;
@@ -2237,7 +2252,7 @@ static void draw_dupli_objects_color(
                        }       
                        else {
                                copy_m4_m4(dob->ob->obmat, dob->mat);
-                               draw_object(scene, ar, v3d, &tbase, 
dflag_dupli);
+                               draw_dupli_object(scene, ar, v3d, &tbase, dob, 
dob_data, dflag_dupli);
                        }
                }
                
diff --git a/source/blender/editors/space_view3d/view3d_intern.h 
b/source/blender/editors/space_view3d/view3d_intern.h
index 046f057..6e12296 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -49,6 +49,7 @@ struct bPoseChannel;
 struct bScreen;
 struct Mesh;
 struct SimDebugData;
+struct Strands;
 struct wmNDOFMotionData;
 struct wmOperatorType;
 struct wmWindowManager;
@@ -184,6 +185,9 @@ void draw_mesh_paint(View3D *v3d, RegionView3D *rv3d,
 /* drawsimdebug.c */
 void draw_sim_debug_data(Scene *scene, View3D *v3d, ARegion *ar);
 
+/* drawstrands.c */
+void draw_strands(Scene *scene, View3D *v3d, ARegion *ar, struct Object *ob, 
struct Strands *strands, short dflag);
+
 /* view3d_draw.c */
 void view3d_main_area_draw(const struct bContext *C, struct ARegion *ar);
 void ED_view3d_draw_depth(Scene *scene, struct ARegion *ar, View3D *v3d, bool 
alphaoverride);
diff --git a/source/blender/pointcache/alembic/abc_particles.cpp 
b/source/blender/pointcache/alembic/abc_particles.cpp
index 43f7e19..14f7e53 100644
--- a/source/blender/pointcache/alembic/abc_particles.cpp
+++ b/source/blender/pointcache/alembic/abc_particles.cpp
@@ -137,6 +137,7 @@ struct ParticleHairSample {
 AbcHairWriter::AbcHairWriter(const std::string &name, Object *ob, 
ParticleSystem *psys) :
     ParticlesWriter(ob, psys, name)
 {
+       m_psmd = psys_get_modifier(ob, psys);
 }
 
 AbcHairWriter::~AbcHairWriter()
@@ -169,7 +170,7 @@ static int hair_count_totverts(ParticleSystem *psys)
        return totverts;
 }
 
-static void hair_create_sample(ParticleSystem *psys, ParticleHairSample 
&sample, bool do_numverts)
+static void hair_create_sample(Object *ob, DerivedMesh *dm, ParticleSystem 
*psys, ParticleHairSample &sample, bool do_numverts)
 {
        int totpart = psys->totpart;
        int totverts = hair_count_totverts(psys);
@@ -193,8 +194,17 @@ static void hair_create_sample(ParticleSystem *psys, 
ParticleHairSample &sample,
                
                for (k = 0; k < numverts; ++k) {
                        HairKey *key = &pa->hair[k];
+                       float hairmat[4][4];
+                       float co[3];
                        
-                       sample.positions.push_back(V3f(key->co[0], key->co[1], 
key->co[2]));
+                       /* hair keys are in "hair space" relative to the mesh,
+                        * store them in object space for compatibility and to 
avoid
+                        * complexities of how particles work.
+                        */
+                       psys_mat_hair_to_object(ob, dm, psys->part->from, pa, 
hairmat);
+                       mul_v3_m4v3(co, hairmat, key->co);
+                       
+                       sample.positions.push_back(V3f(co[0], co[1], co[2]));
                        sample.times.push_back(key->time);
                        sample.weights.push_back(key->weight);
                }
@@ -205,6 +215,8 @@ void AbcHairWriter::write_sample()
 {
        if (!m_curves)
                return;
+       if (!m_psmd || !m_psmd->dm)
+               return;
        
        OCurvesSchema &schema = m_curves.getSchema();
        
@@ -212,11 +224,11 @@ void AbcHairWriter::write_sample()
        OCurvesSchema::Sample sample;
        if (schema.getNumSamples() == 0) {
                /* write curve sizes only first time, assuming they are 
constant! */
-               hair_create_sample(m_psys, hair_sample, true);
+               hair_create_sample(m_ob, m_psmd->dm, m_psys, hair_sample, true);
                sample = OCurvesSchema::Sample(hair_sample.positions, 
hair_sample.numverts);
        }
        else {
-               hair_create_sample(m_psys, hair_sample, false);
+               hair_create_sample(m_ob, m_psmd->dm, m_psys, hair_sample, 
false);
                sample = OCurvesSchema::Sample(hair_sample.positions);
        }
        schema.set(sample);
diff --git a/source/blender/pointcache/alembic/abc_particles.h 
b/source/blender/pointcache/alembic/abc_particles.h
index 4cf1676..31d87cd 100644
--- a/source/blender/pointcache/alembic/abc_particles.h
+++ b/source

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to