[Bf-blender-cvs] [6621546] strand_gpu: Store a copy of the strand roots array in the strand edit data.
Lukas Tönne
noreply at git.blender.org
Wed Jul 6 16:48:40 CEST 2016
Commit: 6621546d0c2ed57dfb26681b878d45b75f257506
Author: Lukas Tönne
Date: Wed Jul 6 16:34:12 2016 +0200
Branches: strand_gpu
https://developer.blender.org/rB6621546d0c2ed57dfb26681b878d45b75f257506
Store a copy of the strand roots array in the strand edit data.
This will allow the edit mode to display render strands as well.
The roots may later be re-scattered or otherwise modified during editing,
and are eventually copied back to the Strands data when applying edits.
===================================================================
M source/blender/blenkernel/BKE_editstrands.h
M source/blender/blenkernel/intern/editstrands.c
M source/blender/editors/hair/hair_object_mesh.c
M source/blender/editors/hair/hair_object_particles.c
M source/blender/editors/hair/hair_object_strands.c
M source/blender/editors/hair/hair_undo.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_editstrands.h b/source/blender/blenkernel/BKE_editstrands.h
index b456666..7e56170 100644
--- a/source/blender/blenkernel/BKE_editstrands.h
+++ b/source/blender/blenkernel/BKE_editstrands.h
@@ -46,12 +46,16 @@ struct DerivedMesh;
struct Mesh;
struct Object;
struct Strands;
+struct StrandRoot;
typedef struct BMEditStrands {
BMEditMesh base;
+ /* Hair follicles */
+ struct StrandRoot *roots;
/* Scalp mesh for fixing root vertices */
struct DerivedMesh *root_dm;
+ int num_roots;
int flag;
@@ -63,7 +67,8 @@ typedef enum BMEditStrandsFlag {
BM_STRANDS_DIRTY_SEGLEN = 1,
} BMEditStrandsFlag;
-struct BMEditStrands *BKE_editstrands_create(struct BMesh *bm, struct DerivedMesh *root_dm);
+struct BMEditStrands *BKE_editstrands_create(struct BMesh *bm, struct DerivedMesh *root_dm,
+ struct StrandRoot *roots, int num_roots);
struct BMEditStrands *BKE_editstrands_copy(struct BMEditStrands *es);
struct BMEditStrands *BKE_editstrands_from_object(struct Object *ob);
void BKE_editstrands_update_linked_customdata(struct BMEditStrands *es);
diff --git a/source/blender/blenkernel/intern/editstrands.c b/source/blender/blenkernel/intern/editstrands.c
index 259cafd..8110aa8 100644
--- a/source/blender/blenkernel/intern/editstrands.c
+++ b/source/blender/blenkernel/intern/editstrands.c
@@ -60,12 +60,16 @@
#include "intern/bmesh_mesh_conv.h"
#include "intern/bmesh_strands_conv.h"
-BMEditStrands *BKE_editstrands_create(BMesh *bm, DerivedMesh *root_dm)
+BMEditStrands *BKE_editstrands_create(BMesh *bm, DerivedMesh *root_dm, StrandRoot *roots, int num_roots)
{
BMEditStrands *es = MEM_callocN(sizeof(BMEditStrands), __func__);
es->base.bm = bm;
es->root_dm = CDDM_copy(root_dm);
+ if (roots && num_roots > 0) {
+ es->roots = MEM_dupallocN(roots);
+ es->num_roots = num_roots;
+ }
return es;
}
@@ -77,6 +81,10 @@ 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);
+ if (es->roots) {
+ es_copy->roots = MEM_dupallocN(es->roots);
+ es_copy->num_roots = es->num_roots;
+ }
es_copy->gpu_buffer = NULL;
@@ -129,6 +137,8 @@ void BKE_editstrands_free(BMEditStrands *es)
BM_mesh_free(es->base.bm);
if (es->root_dm)
es->root_dm->release(es->root_dm);
+ if (es->roots)
+ MEM_freeN(es->roots);
if (es->gpu_buffer)
GPU_strands_buffer_free(es->gpu_buffer);
diff --git a/source/blender/editors/hair/hair_object_mesh.c b/source/blender/editors/hair/hair_object_mesh.c
index a1140c0..35df5a8 100644
--- a/source/blender/editors/hair/hair_object_mesh.c
+++ b/source/blender/editors/hair/hair_object_mesh.c
@@ -56,7 +56,7 @@ bool ED_hair_object_init_mesh_edit(Scene *UNUSED(scene), Object *ob)
BMesh *bm = BKE_editstrands_mesh_to_bmesh(ob, me);
DerivedMesh *root_dm = CDDM_new(0, 0, 0, 0, 0);
- me->edit_strands = BKE_editstrands_create(bm, root_dm);
+ me->edit_strands = BKE_editstrands_create(bm, root_dm, NULL, 0);
root_dm->release(root_dm);
}
diff --git a/source/blender/editors/hair/hair_object_particles.c b/source/blender/editors/hair/hair_object_particles.c
index b317763..8092290 100644
--- a/source/blender/editors/hair/hair_object_particles.c
+++ b/source/blender/editors/hair/hair_object_particles.c
@@ -73,7 +73,7 @@ bool ED_hair_object_init_particle_edit(Scene *scene, Object *ob)
else
dm = NULL;
- psys->hairedit = BKE_editstrands_create(bm, dm);
+ psys->hairedit = BKE_editstrands_create(bm, dm, NULL, 0);
}
return true;
}
diff --git a/source/blender/editors/hair/hair_object_strands.c b/source/blender/editors/hair/hair_object_strands.c
index 8c9104c..c5695ae 100644
--- a/source/blender/editors/hair/hair_object_strands.c
+++ b/source/blender/editors/hair/hair_object_strands.c
@@ -63,7 +63,7 @@ bool ED_hair_object_init_strands_edit(Scene *scene, Object *ob)
if (dm) {
BMesh *bm = BKE_editstrands_strands_to_bmesh(smd->strands, dm);
- smd->edit = BKE_editstrands_create(bm, dm);
+ smd->edit = BKE_editstrands_create(bm, dm, smd->roots, smd->num_roots);
return true;
}
@@ -83,15 +83,19 @@ bool ED_hair_object_apply_strands_edit(Scene *scene, Object *ob)
BKE_editstrands_strands_from_bmesh(smd->strands, smd->edit->base.bm, dm);
}
- BKE_editstrands_free(smd->edit);
- MEM_freeN(smd->edit);
- smd->edit = NULL;
-
/* invalidate roots */
if (smd->roots) {
MEM_freeN(smd->roots);
smd->roots = NULL;
}
+ if (smd->edit->num_roots) {
+ smd->roots = MEM_dupallocN(smd->edit->roots);
+ smd->num_roots = smd->edit->num_roots;
+ }
+
+ BKE_editstrands_free(smd->edit);
+ MEM_freeN(smd->edit);
+ smd->edit = NULL;
}
return true;
diff --git a/source/blender/editors/hair/hair_undo.c b/source/blender/editors/hair/hair_undo.c
index cb5ae43..01c3385 100644
--- a/source/blender/editors/hair/hair_undo.c
+++ b/source/blender/editors/hair/hair_undo.c
@@ -113,6 +113,8 @@ static void strands_undo_to_edit(void *undov, void *editv, void *UNUSED(obdata))
BMEditStrands *edit = editv, *edit_tmp;
Object *ob = edit->base.ob;
DerivedMesh *dm = edit->root_dm;
+ struct StrandRoot *roots_tmp;
+ int num_roots_tmp;
BMesh *bm;
// Key *key = ((Mesh *) obdata)->key;
struct BMeshFromMeshParams params = {0};
@@ -131,9 +133,15 @@ static void strands_undo_to_edit(void *undov, void *editv, void *UNUSED(obdata))
* because it owns the root_dm and we have to copy it before
* it gets released when freeing the old edit.
*/
- edit_tmp = BKE_editstrands_create(bm, dm);
+ edit_tmp = BKE_editstrands_create(bm, dm, NULL, 0);
+ /* keep roots array */
+ roots_tmp = edit->roots;
+ num_roots_tmp = edit->num_roots;
+
BKE_editstrands_free(edit);
*edit = *edit_tmp;
+ edit->roots = roots_tmp;
+ edit->num_roots = num_roots_tmp;
bm->selectmode = undo->selectmode;
edit->base.ob = ob;
More information about the Bf-blender-cvs
mailing list