[Bf-blender-cvs] [9660a2e2ddd] hair_guides: New draw engine for groom edit mode.

Lukas Tönne noreply at git.blender.org
Thu Dec 21 12:09:04 CET 2017


Commit: 9660a2e2ddd31d58ac5555664dab7b0fd2e8a70a
Author: Lukas Tönne
Date:   Thu Dec 21 11:08:30 2017 +0000
Branches: hair_guides
https://developer.blender.org/rB9660a2e2ddd31d58ac5555664dab7b0fd2e8a70a

New draw engine for groom edit mode.

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

M	source/blender/blenkernel/BKE_groom.h
M	source/blender/blenkernel/intern/groom.c
M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/intern/draw_cache.c
M	source/blender/draw/intern/draw_cache.h
M	source/blender/draw/intern/draw_cache_impl.h
A	source/blender/draw/intern/draw_cache_impl_groom.c
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/modes/draw_mode_engines.h
A	source/blender/draw/modes/edit_groom_mode.c
A	source/blender/draw/modes/shaders/edit_groom_overlay_frag.glsl
A	source/blender/draw/modes/shaders/edit_groom_overlay_loosevert_vert.glsl
M	source/blender/makesdna/DNA_groom_types.h

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

diff --git a/source/blender/blenkernel/BKE_groom.h b/source/blender/blenkernel/BKE_groom.h
index 202e0193855..367b328635c 100644
--- a/source/blender/blenkernel/BKE_groom.h
+++ b/source/blender/blenkernel/BKE_groom.h
@@ -49,4 +49,14 @@ void BKE_groom_make_local(struct Main *bmain, struct Groom *groom, const bool li
 bool BKE_groom_minmax(struct Groom *groom, float min[3], float max[3]);
 void BKE_groom_boundbox_calc(struct Groom *groom, float r_loc[3], float r_size[3]);
 
+
+/* === Draw Cache === */
+
+enum {
+	BKE_GROOM_BATCH_DIRTY_ALL = 0,
+	BKE_GROOM_BATCH_DIRTY_SELECT,
+};
+void BKE_groom_batch_cache_dirty(struct Groom *groom, int mode);
+void BKE_groom_batch_cache_free(struct Groom *groom);
+
 #endif /*  __BKE_GROOM_H__ */
diff --git a/source/blender/blenkernel/intern/groom.c b/source/blender/blenkernel/intern/groom.c
index 0e7fe7c6397..3594c6e9b44 100644
--- a/source/blender/blenkernel/intern/groom.c
+++ b/source/blender/blenkernel/intern/groom.c
@@ -83,6 +83,8 @@ static void groom_bundles_free(ListBase *bundles)
 /** Free (or release) any data used by this groom (does not free the groom itself). */
 void BKE_groom_free(Groom *groom)
 {
+	BKE_groom_batch_cache_free(groom);
+	
 	if (groom->editgroom)
 	{
 		EditGroom *edit = groom->editgroom;
@@ -170,3 +172,22 @@ void BKE_groom_boundbox_calc(Groom *groom, float r_loc[3], float r_size[3])
 	BKE_boundbox_init_from_minmax(groom->bb, min, max);
 	groom->bb->flag &= ~BOUNDBOX_DIRTY;
 }
+
+void (*BKE_groom_batch_cache_dirty_cb)(Groom* groom, int mode) = NULL;
+void (*BKE_groom_batch_cache_free_cb)(Groom* groom) = NULL;
+
+void BKE_groom_batch_cache_dirty(Groom* groom, int mode)
+{
+	if (groom->batch_cache)
+	{
+		BKE_groom_batch_cache_dirty_cb(groom, mode);
+	}
+}
+
+void BKE_groom_batch_cache_free(Groom *groom)
+{
+	if (groom->batch_cache)
+	{
+		BKE_groom_batch_cache_free_cb(groom);
+	}
+}
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 11bd2c4719d..c14ae2d4129 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -57,6 +57,7 @@ set(SRC
 	intern/draw_cache.c
 	intern/draw_cache_impl_curve.c
 	intern/draw_cache_impl_displist.c
+	intern/draw_cache_impl_groom.c
 	intern/draw_cache_impl_hair.c
 	intern/draw_cache_impl_lattice.c
 	intern/draw_cache_impl_mesh.c
@@ -70,6 +71,7 @@ set(SRC
 	intern/draw_view.c
 	modes/edit_armature_mode.c
 	modes/edit_curve_mode.c
+	modes/edit_groom_mode.c
 	modes/edit_lattice_mode.c
 	modes/edit_mesh_mode.c
 	modes/edit_mesh_mode_text.c
@@ -206,6 +208,8 @@ data_to_c_simple(modes/shaders/edit_mesh_overlay_facefill_vert.glsl SRC)
 data_to_c_simple(modes/shaders/edit_mesh_overlay_facefill_frag.glsl SRC)
 data_to_c_simple(modes/shaders/edit_curve_overlay_frag.glsl SRC)
 data_to_c_simple(modes/shaders/edit_curve_overlay_loosevert_vert.glsl SRC)
+data_to_c_simple(modes/shaders/edit_groom_overlay_frag.glsl SRC)
+data_to_c_simple(modes/shaders/edit_groom_overlay_loosevert_vert.glsl SRC)
 data_to_c_simple(modes/shaders/edit_lattice_overlay_frag.glsl SRC)
 data_to_c_simple(modes/shaders/edit_lattice_overlay_loosevert_vert.glsl SRC)
 data_to_c_simple(modes/shaders/edit_normals_vert.glsl SRC)
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index caf0a5e5053..2eb5f1dd1be 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -2479,6 +2479,37 @@ Gwn_Batch *DRW_cache_lattice_vert_overlay_get(Object *ob)
 
 /* -------------------------------------------------------------------- */
 
+/** \name Groom
+ * \{ */
+
+Gwn_Batch *DRW_cache_groom_verts_get(Object *ob)
+{
+	BLI_assert(ob->type == OB_GROOM);
+
+	struct Groom *groom = ob->data;
+	return DRW_groom_batch_cache_get_all_verts(groom);
+}
+
+Gwn_Batch *DRW_cache_groom_wire_get(Object *ob)
+{
+	BLI_assert(ob->type == OB_GROOM);
+
+	struct Groom *groom = ob->data;
+	return DRW_groom_batch_cache_get_all_edges(groom);
+}
+
+Gwn_Batch *DRW_cache_groom_vert_overlay_get(Object *ob)
+{
+	BLI_assert(ob->type == OB_GROOM);
+
+	struct Groom *groom = ob->data;
+	return DRW_groom_batch_cache_get_overlay_verts(groom);
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+
 /** \name Particles
  * \{ */
 
diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h
index b8b2cb3afec..9604001f6cf 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -30,6 +30,7 @@ struct Gwn_Batch;
 struct GPUMaterial;
 struct Object;
 struct ModifierData;
+struct Groom;
 struct HairSystem;
 struct DRWHairFiberTextureBuffer;
 struct DerivedMesh;
@@ -161,6 +162,11 @@ struct Gwn_Batch *DRW_cache_lattice_verts_get(struct Object *ob);
 struct Gwn_Batch *DRW_cache_lattice_wire_get(struct Object *ob, bool use_weight);
 struct Gwn_Batch *DRW_cache_lattice_vert_overlay_get(struct Object *ob);
 
+/* Groom */
+struct Gwn_Batch *DRW_cache_groom_verts_get(struct Object *ob);
+struct Gwn_Batch *DRW_cache_groom_wire_get(struct Object *ob);
+struct Gwn_Batch *DRW_cache_groom_vert_overlay_get(struct Object *ob);
+
 /* Particles */
 struct Gwn_Batch *DRW_cache_particles_get_hair(struct ParticleSystem *psys, struct ModifierData *md);
 struct Gwn_Batch *DRW_cache_particles_get_dots(struct ParticleSystem *psys);
diff --git a/source/blender/draw/intern/draw_cache_impl.h b/source/blender/draw/intern/draw_cache_impl.h
index cf6c186d10a..67599b51c96 100644
--- a/source/blender/draw/intern/draw_cache_impl.h
+++ b/source/blender/draw/intern/draw_cache_impl.h
@@ -34,6 +34,7 @@ struct Gwn_VertBuf;
 struct ListBase;
 struct ModifierData;
 struct ParticleSystem;
+struct Groom;
 struct HairSystem;
 struct DRWHairFiberTextureBuffer;
 struct DerivedMesh;
@@ -59,6 +60,9 @@ void DRW_lattice_batch_cache_free(struct Lattice *lt);
 void DRW_particle_batch_cache_dirty(struct ParticleSystem *psys, int mode);
 void DRW_particle_batch_cache_free(struct ParticleSystem *psys);
 
+void DRW_groom_batch_cache_dirty(struct Groom *groom, int mode);
+void DRW_groom_batch_cache_free(struct Groom *groom);
+
 void DRW_hair_batch_cache_dirty(struct HairSystem *hsys, int mode);
 void DRW_hair_batch_cache_free(struct HairSystem *hsys);
 
@@ -91,6 +95,11 @@ struct Gwn_Batch *DRW_lattice_batch_cache_get_all_edges(struct Lattice *lt, bool
 struct Gwn_Batch *DRW_lattice_batch_cache_get_all_verts(struct Lattice *lt);
 struct Gwn_Batch *DRW_lattice_batch_cache_get_overlay_verts(struct Lattice *lt);
 
+/* Groom */
+struct Gwn_Batch *DRW_groom_batch_cache_get_all_edges(struct Groom *groom);
+struct Gwn_Batch *DRW_groom_batch_cache_get_all_verts(struct Groom *groom);
+struct Gwn_Batch *DRW_groom_batch_cache_get_overlay_verts(struct Groom *groom);
+
 /* Mesh */
 
 struct Gwn_Batch **DRW_mesh_batch_cache_get_surface_shaded(
diff --git a/source/blender/draw/intern/draw_cache_impl_groom.c b/source/blender/draw/intern/draw_cache_impl_groom.c
new file mode 100644
index 00000000000..5a811b8a488
--- /dev/null
+++ b/source/blender/draw/intern/draw_cache_impl_groom.c
@@ -0,0 +1,424 @@
+/*
+ * ***** 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) Blender Foundation
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Lukas Toenne
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file draw_cache_impl_groom.c
+ *  \ingroup draw
+ *
+ * \brief Groom API for render engines
+ */
+
+#include <string.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_utildefines.h"
+#include "BLI_listbase.h"
+
+#include "DNA_groom_types.h"
+#include "DNA_userdef_types.h"
+
+#include "BKE_groom.h"
+
+#include "GPU_batch.h"
+
+#include "draw_cache_impl.h"  /* own include */
+
+#define SELECT   1
+
+static void groom_batch_cache_clear(Groom *groom);
+
+/* ---------------------------------------------------------------------- */
+/* Groom Gwn_Batch Cache */
+
+typedef struct GroomBatchCache {
+	Gwn_VertBuf *pos;
+	Gwn_IndexBuf *edges;
+
+	Gwn_Batch *all_verts;
+	Gwn_Batch *all_edges;
+
+	Gwn_Batch *overlay_verts;
+
+	/* settings to determine if cache is invalid */
+	bool is_dirty;
+
+	bool is_editmode;
+} GroomBatchCache;
+
+/* Gwn_Batch cache management. */
+
+static bool groom_batch_cache_valid(Groom *groom)
+{
+	GroomBatchCache *cache = groom->batch_cache;
+
+	if (cache == NULL) {
+		return false;
+	}
+
+	if (cache->is_editmode != (groom->editgroom != NULL)) {
+		return false;
+	}
+
+	if (cache->is_dirty == false) {
+		return true;
+	}
+	else {
+		if (cache->is_editmode) {
+			return false;
+		}
+	}
+
+	return true;
+}
+
+static void groom_batch_cache_init(Groom *groom)
+{
+	GroomBatchCache *cache = groom->batch_cache;
+
+	if (!cache) {
+		cache = groom->batch_cache = MEM_callocN(sizeof(*cache), __func__);
+	}
+	else {
+		memset(cache, 0, sizeof(*cache));
+	}
+
+	cache->is_editmode = (groom->editgroom != NULL);
+
+	cache->is_dirty = false;
+}
+
+static GroomBatchCache *groom_batch_cache_get(Groom *groom)
+{
+	if (!groom_batch_cache_valid(groom)) {
+		groom_batch_cache_clear(groom);
+		groom_batch_cache_init(groom);
+	}
+	return groom->batch_cache;
+}
+
+void DRW_groom_batch_cache_dirty(Groom *groom, int mode)
+{
+	GroomBatchCache *cache = groom->batch_cache;
+	if (cache == NULL) {
+		return;
+	}
+	switch (mode) {
+		case BKE_GROOM_BATCH_DIRTY_ALL:
+			cache->is_dirty = true;
+			break;
+		case BKE_GROOM_BATCH_DIRTY_SELECT:
+			/* TODO Separate Flag vbo */
+			GWN_BATCH_DISCARD_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list