[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