[Bf-blender-cvs] [679113fbd5e] strand_editmode: Basic drawing code for hair edit mode in the new 2.8 draw engine system.

Lukas Tönne noreply at git.blender.org
Sat Jul 22 13:36:27 CEST 2017


Commit: 679113fbd5ecef72850b572535534ffde1f03f11
Author: Lukas Tönne
Date:   Sat Jul 22 12:35:40 2017 +0100
Branches: strand_editmode
https://developer.blender.org/rB679113fbd5ecef72850b572535534ffde1f03f11

Basic drawing code for hair edit mode in the new 2.8 draw engine system.

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

M	release/scripts/startup/bl_ui/space_view3d.py
M	source/blender/blenkernel/BKE_editstrands.h
M	source/blender/blenkernel/intern/editstrands.c
M	source/blender/blenkernel/intern/mesh_sample.c
M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/eevee/eevee_materials.c
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_strands.c
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/modes/draw_mode_engines.h
A	source/blender/draw/modes/edit_strands_mode.c
M	source/blender/editors/hair/hair_cursor.c
M	source/blender/editors/hair/hair_edit.c
M	source/blender/editors/transform/transform_conversions.c

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

diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index da4d7d39fc5..4846cf151d4 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -3788,6 +3788,7 @@ classes = (
     VIEW3D_MT_select_pose,
     VIEW3D_MT_select_pose_more_less,
     VIEW3D_MT_select_particle,
+    VIEW3D_MT_select_hair,
     VIEW3D_MT_edit_mesh,
     VIEW3D_MT_edit_mesh_select_similar,
     VIEW3D_MT_edit_mesh_select_by_trait,
@@ -3838,6 +3839,7 @@ classes = (
     VIEW3D_MT_particle,
     VIEW3D_MT_particle_specials,
     VIEW3D_MT_particle_showhide,
+    VIEW3D_MT_hair,
     VIEW3D_MT_pose,
     VIEW3D_MT_pose_transform,
     VIEW3D_MT_pose_slide,
diff --git a/source/blender/blenkernel/BKE_editstrands.h b/source/blender/blenkernel/BKE_editstrands.h
index cc641918dbc..90f86701e5d 100644
--- a/source/blender/blenkernel/BKE_editstrands.h
+++ b/source/blender/blenkernel/BKE_editstrands.h
@@ -57,6 +57,7 @@ typedef struct BMEditStrands {
 	unsigned int vertex_glbuf;
 	unsigned int elem_glbuf;
 	unsigned int dot_glbuf;
+	void *batch_cache;
 } BMEditStrands;
 
 /* BMEditStrands->flag */
@@ -70,7 +71,7 @@ struct BMEditStrands *BKE_editstrands_from_object(struct Object *ob);
 void BKE_editstrands_update_linked_customdata(struct BMEditStrands *es);
 void BKE_editstrands_free(struct BMEditStrands *es);
 
-/* === constraints === */
+/* === Constraints === */
 
 /* Stores vertex locations for temporary reference:
  * Vertex locations get modified by tools, but then need to be corrected
@@ -83,13 +84,20 @@ void BKE_editstrands_free_locations(BMEditStrandsLocations locs);
 void BKE_editstrands_solve_constraints(struct Object *ob, struct BMEditStrands *es, BMEditStrandsLocations orig);
 void BKE_editstrands_ensure(struct BMEditStrands *es);
 
-/* === particle conversion === */
+/* === Particle Conversion === */
 
 struct BMesh *BKE_editstrands_particles_to_bmesh(struct Object *ob, struct ParticleSystem *psys);
 void BKE_editstrands_particles_from_bmesh(struct Object *ob, struct ParticleSystem *psys);
 
-/* === mesh conversion === */
+/* === Mesh Conversion === */
 struct BMesh *BKE_editstrands_mesh_to_bmesh(struct Object *ob, struct Mesh *me);
 void BKE_editstrands_mesh_from_bmesh(struct Object *ob);
 
+/* === Draw Cache === */
+enum {
+	BKE_STRANDS_BATCH_DIRTY_ALL = 0,
+};
+void BKE_editstrands_batch_cache_dirty(struct BMEditStrands *es, int mode);
+void BKE_editstrands_batch_cache_free(struct BMEditStrands *es);
+
 #endif
diff --git a/source/blender/blenkernel/intern/editstrands.c b/source/blender/blenkernel/intern/editstrands.c
index 799c55b8b35..d1494d2a997 100644
--- a/source/blender/blenkernel/intern/editstrands.c
+++ b/source/blender/blenkernel/intern/editstrands.c
@@ -64,6 +64,8 @@ BMEditStrands *BKE_editstrands_create(BMesh *bm, DerivedMesh *root_dm)
 	es->base.bm = bm;
 	es->root_dm = CDDM_copy(root_dm);
 	
+	BKE_editstrands_batch_cache_dirty(es, BKE_STRANDS_BATCH_DIRTY_ALL);
+	
 	return es;
 }
 
@@ -75,6 +77,8 @@ BMEditStrands *BKE_editstrands_copy(BMEditStrands *es)
 	es_copy->base.bm = BM_mesh_copy(es->base.bm);
 	es_copy->root_dm = CDDM_copy(es->root_dm);
 	
+	BKE_editstrands_batch_cache_dirty(es_copy, BKE_STRANDS_BATCH_DIRTY_ALL);
+	
 	return es_copy;
 }
 
@@ -83,7 +87,7 @@ BMEditStrands *BKE_editstrands_copy(BMEditStrands *es)
  */
 BMEditStrands *BKE_editstrands_from_object(Object *ob)
 {
-	if (ob->type == OB_MESH) {
+	if (ob && ob->type == OB_MESH) {
 		Mesh *me = ob->data;
 		if (me->edit_strands)
 			return me->edit_strands;
@@ -105,13 +109,15 @@ void BKE_editstrands_update_linked_customdata(BMEditStrands *UNUSED(es))
 /*does not free the BMEditStrands struct itself*/
 void BKE_editstrands_free(BMEditStrands *es)
 {
+	BKE_editstrands_batch_cache_free(es);
+	
 	if (es->base.bm)
 		BM_mesh_free(es->base.bm);
 	if (es->root_dm)
 		es->root_dm->release(es->root_dm);
 }
 
-/* === constraints === */
+/* === Constraints === */
 
 BMEditStrandsLocations BKE_editstrands_get_locations(BMEditStrands *edit)
 {
@@ -139,6 +145,8 @@ void BKE_editstrands_solve_constraints(Object *ob, BMEditStrands *es, BMEditStra
 	BKE_editstrands_ensure(es);
 	
 	BPH_strands_solve_constraints(ob, es, orig);
+	
+	BKE_editstrands_batch_cache_dirty(es, BKE_STRANDS_BATCH_DIRTY_ALL);
 }
 
 static void editstrands_calc_segment_lengths(BMesh *bm)
@@ -170,7 +178,7 @@ void BKE_editstrands_ensure(BMEditStrands *es)
 }
 
 
-/* === particle conversion === */
+/* === Particle Conversion === */
 
 BMesh *BKE_editstrands_particles_to_bmesh(Object *ob, ParticleSystem *psys)
 {
@@ -214,7 +222,7 @@ void BKE_editstrands_particles_from_bmesh(Object *ob, ParticleSystem *psys)
 }
 
 
-/* === mesh conversion === */
+/* === Mesh Conversion === */
 
 BMesh *BKE_editstrands_mesh_to_bmesh(Object *ob, Mesh *me)
 {
@@ -258,3 +266,21 @@ void BKE_editstrands_mesh_from_bmesh(Object *ob)
 	 * avoid ending up with an invalid derived mesh then */
 	BKE_object_free_derived_caches(ob);
 }
+
+/* === Draw Cache === */
+void (*BKE_editstrands_batch_cache_dirty_cb)(BMEditStrands *es, int mode) = NULL;
+void (*BKE_editstrands_batch_cache_free_cb)(BMEditStrands *es) = NULL;
+
+void BKE_editstrands_batch_cache_dirty(BMEditStrands *es, int mode)
+{
+	if (es->batch_cache) {
+		BKE_editstrands_batch_cache_dirty_cb(es, mode);
+	}
+}
+
+void BKE_editstrands_batch_cache_free(BMEditStrands *es)
+{
+	if (es->batch_cache) {
+		BKE_editstrands_batch_cache_free_cb(es);
+	}
+}
diff --git a/source/blender/blenkernel/intern/mesh_sample.c b/source/blender/blenkernel/intern/mesh_sample.c
index 82efd568c21..554df6625e2 100644
--- a/source/blender/blenkernel/intern/mesh_sample.c
+++ b/source/blender/blenkernel/intern/mesh_sample.c
@@ -700,7 +700,7 @@ bool BKE_mesh_sample_from_particle(MeshSample *sample, ParticleSystem *psys, Der
 	}
 	
 	/* test both triangles of the face */
-	interp_weights_quad_v3(w, co1, co2, co3, NULL, vec);
+	interp_weights_tri_v3(w, co1, co2, co3, vec);
 	if (w[0] <= 1.0f && w[1] <= 1.0f && w[2] <= 1.0f) {
 		sample->orig_verts[0] = mface->v1;
 		sample->orig_verts[1] = mface->v2;
@@ -710,7 +710,7 @@ bool BKE_mesh_sample_from_particle(MeshSample *sample, ParticleSystem *psys, Der
 		return true;
 	}
 	else if (mface->v4) {
-		interp_weights_quad_v3(w, co3, co4, co1, NULL, vec);
+		interp_weights_tri_v3(w, co3, co4, co1, vec);
 		sample->orig_verts[0] = mface->v3;
 		sample->orig_verts[1] = mface->v4;
 		sample->orig_verts[2] = mface->v1;
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 4b760f68705..920b6140e2b 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -60,6 +60,7 @@ set(SRC
 	intern/draw_cache_impl_lattice.c
 	intern/draw_cache_impl_mesh.c
 	intern/draw_cache_impl_particles.c
+	intern/draw_cache_impl_strands.c
 	intern/draw_common.c
 	intern/draw_manager.c
 	intern/draw_manager_text.c
@@ -69,6 +70,7 @@ set(SRC
 	modes/edit_lattice_mode.c
 	modes/edit_mesh_mode.c
 	modes/edit_metaball_mode.c
+	modes/edit_strands_mode.c
 	modes/edit_surface_mode.c
 	modes/edit_text_mode.c
 	modes/object_mode.c
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index 46ed858603d..2f01a5fd966 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -1046,7 +1046,7 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_SceneLayerData *sl
 	}
 
 	if (ob->type == OB_MESH) {
-		if (ob != draw_ctx->scene->obedit) {
+		if (ob != draw_ctx->scene->obedit && !(ob->mode & OB_MODE_HAIR_EDIT)) {
 			material_hash = stl->g_data->hair_material_hash;
 
 			for (ModifierData *md = ob->modifiers.first; md; md = md->next) {
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index c0338de3d54..c6a5a85b4e8 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -2584,3 +2584,28 @@ Gwn_Batch *DRW_cache_particles_get_prim(int type)
 
 	return NULL;
 }
+
+/* -------------------------------------------------------------------- */
+
+/** \name Strands
+ * \{ */
+
+Gwn_Batch *DRW_cache_editstrands_get_tips(struct BMEditStrands *es)
+{
+	return DRW_editstrands_batch_cache_get_tips(es);
+}
+
+Gwn_Batch *DRW_cache_editstrands_get_roots(struct BMEditStrands *es)
+{
+	return DRW_editstrands_batch_cache_get_roots(es);
+}
+
+Gwn_Batch *DRW_cache_editstrands_get_points(struct BMEditStrands *es)
+{
+	return DRW_editstrands_batch_cache_get_points(es);
+}
+
+Gwn_Batch *DRW_cache_editstrands_get_wires(struct BMEditStrands *es)
+{
+	return DRW_editstrands_batch_cache_get_wires(es);
+}
diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h
index ac7062b3cc8..03ef1eae2eb 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 BMEditStrands;
 
 void DRW_shape_cache_free(void);
 
@@ -156,4 +157,10 @@ struct Gwn_Batch *DRW_cache_particles_get_hair(struct ParticleSystem *psys, stru
 struct Gwn_Batch *DRW_cache_particles_get_dots(struct ParticleSystem *psys);
 struct Gwn_Batch *DRW_cache_particles_get_prim(int type);
 
+/* Strands */
+struct Gwn_Batch *DRW_cache_editstrands_get_tips(struct BMEditStrands *es);
+struct Gwn_Batch *DRW_cache_editstrands_get_roots(struct BMEditStrands *es);
+struct Gwn_Batch *DRW_cache_editstrands_get_points(struct BMEditStrands *es);
+struct Gwn_Batch *DRW_cache_editstrands_get_wires(struct BMEditStrands *es);
+
 #endif /* __DRAW_CACHE_H__ */
diff --git a/source/blender/draw/intern/draw_cache_impl.h b/source/blender/draw/intern/draw_cache_impl.h
index f8feeb37b82..148839f9748 100644
--- a/source/blender/draw/intern/draw_cache_impl.h
+++ b/source/blender/draw/intern/draw_cache_impl.h
@@ -32,6 +32,7 @@ struct ListBase;
 struct CurveCache;
 struct ParticleSystem;
 struct ModifierData;
+struct BMEditStrands;
 
 struct Curve;
 struct Lattice;
@@ -50,6 +51,9 @@ void DRW_lattice_batch_cache_free(struct Lattice *lt);
 void DRW_particle_batch_cache_dirty(struct P

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list