[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23020] branches/blender2.5/blender: Disconnect/connect hair:
Janne Karhu
jhkarh at utu.fi
Sat Sep 5 22:12:09 CEST 2009
Revision: 23020
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23020
Author: jhk
Date: 2009-09-05 22:12:08 +0200 (Sat, 05 Sep 2009)
Log Message:
-----------
Disconnect/connect hair:
- Moves hair from face-space to global space and back.
- Allows for editing of emitter mesh after hair combing.
- Disconnect hair before doing topology changing changes in mesh edit mode, connect after changes.
- Notes:
* The closest location on emitter surface to the hair root is used to connect the hair.
* Emitter deflection, sticky roots and add brush don't apply for disconnect hair in particle mode.
- Todo for future:
* Copy disconnected hair from object to another (when 2.5 has proper copy operators again).
* Possible automatic disconnect/connect with topology changing operations in mesh edit mode.
Other changes/fixes:
- Proper subtypes for some particle mode notifiers.
- Particle mode selections didn't draw correctly because of using lighting for the paths.
Modified Paths:
--------------
branches/blender2.5/blender/release/ui/buttons_particle.py
branches/blender2.5/blender/source/blender/blenkernel/BKE_pointcache.h
branches/blender2.5/blender/source/blender/blenkernel/intern/particle.c
branches/blender2.5/blender/source/blender/blenkernel/intern/particle_system.c
branches/blender2.5/blender/source/blender/editors/physics/editparticle.c
branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_intern.h
branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_ops.c
branches/blender2.5/blender/source/blender/editors/space_buttons/space_buttons.c
branches/blender2.5/blender/source/blender/editors/space_view3d/drawobject.c
branches/blender2.5/blender/source/blender/editors/space_view3d/view3d_header.c
branches/blender2.5/blender/source/blender/editors/transform/transform_conversions.c
branches/blender2.5/blender/source/blender/makesrna/intern/rna_particle.c
branches/blender2.5/blender/source/blender/makesrna/intern/rna_sculpt_paint.c
Modified: branches/blender2.5/blender/release/ui/buttons_particle.py
===================================================================
--- branches/blender2.5/blender/release/ui/buttons_particle.py 2009-09-05 09:54:01 UTC (rev 23019)
+++ branches/blender2.5/blender/release/ui/buttons_particle.py 2009-09-05 20:12:08 UTC (rev 23020)
@@ -151,6 +151,11 @@
row = split.row()
row.enabled = particle_panel_enabled(psys)
row.itemR(part, "hair_step")
+ if psys.edited==True:
+ if psys.global_hair:
+ layout.itemO("particle.connect_hair")
+ else:
+ layout.itemO("particle.disconnect_hair")
elif part.type=='REACTOR':
split.enabled = particle_panel_enabled(psys)
split.itemR(psys, "reactor_target_object")
Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_pointcache.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_pointcache.h 2009-09-05 09:54:01 UTC (rev 23019)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_pointcache.h 2009-09-05 20:12:08 UTC (rev 23020)
@@ -192,6 +192,7 @@
struct ParticleData *particles;
struct KDTree *emitter_field;
float *emitter_cosnos;
+ int psys_flag;
/* cache stuff */
struct ListBase mem_cache;
Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/particle.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/particle.c 2009-09-05 09:54:01 UTC (rev 23019)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/particle.c 2009-09-05 20:12:08 UTC (rev 23020)
@@ -418,7 +418,7 @@
edit->pathcache= NULL;
edit->totcached= 0;
}
- else {
+ if(psys) {
psys_free_path_cache_buffers(psys->pathcache, &psys->pathcachebufs);
psys->pathcache= NULL;
psys->totcached= 0;
@@ -2676,7 +2676,7 @@
baked = psys->pointcache->flag & PTCACHE_BAKED;
/* clear out old and create new empty path cache */
- psys_free_path_cache(psys, NULL);
+ psys_free_path_cache(psys, psys->edit);
cache= psys->pathcache= psys_alloc_path_cache_buffers(&psys->pathcachebufs, totpart, steps+1);
if(psys->soft && psys->softflag & OB_SB_ENABLE) {
@@ -2891,7 +2891,7 @@
if(!cache || edit->totpoint != edit->totcached) {
/* clear out old and create new empty path cache */
- psys_free_path_cache(NULL, edit);
+ psys_free_path_cache(edit->psys, edit);
cache= edit->pathcache= psys_alloc_path_cache_buffers(&edit->pathcachebufs, totpart, steps+1);
}
@@ -2946,7 +2946,7 @@
do_particle_interpolation(psys, i, pa, t, frs_sec, &pind, &result);
/* non-hair points are allready in global space */
- if(psys)
+ if(psys && !(psys->flag & PSYS_GLOBAL_HAIR))
Mat4MulVecfl(hairmat, result.co);
VECCOPY(ca->co, result.co);
Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/particle_system.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/particle_system.c 2009-09-05 09:54:01 UTC (rev 23019)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/particle_system.c 2009-09-05 20:12:08 UTC (rev 23020)
@@ -158,7 +158,7 @@
psys->totchild= 0;
/* reset path cache */
- psys_free_path_cache(psys, NULL);
+ psys_free_path_cache(psys, psys->edit);
/* reset point cache */
psys->pointcache->flag &= ~PTCACHE_SIMULATION_VALID;
Modified: branches/blender2.5/blender/source/blender/editors/physics/editparticle.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/physics/editparticle.c 2009-09-05 09:54:01 UTC (rev 23019)
+++ branches/blender2.5/blender/source/blender/editors/physics/editparticle.c 2009-09-05 20:12:08 UTC (rev 23020)
@@ -555,7 +555,7 @@
Mat4One(mat);
LOOP_VISIBLE_POINTS {
- if(edit->psys) {
+ if(edit->psys && !(edit->psys->flag & PSYS_GLOBAL_HAIR)) {
psys_mat_hair_to_global(data->ob, psmd->dm, psys->part->from, psys->particles + p, mat);
Mat4Invert(imat,mat);
}
@@ -812,7 +812,7 @@
float *vec, *nor, dvec[3], dot, dist_1st;
float hairimat[4][4], hairmat[4][4];
- if(edit==NULL || edit->psys==NULL || (pset->flag & PE_DEFLECT_EMITTER)==0)
+ if(edit==NULL || edit->psys==NULL || (pset->flag & PE_DEFLECT_EMITTER)==0 || (edit->psys->flag & PSYS_GLOBAL_HAIR))
return;
psys = edit->psys;
@@ -876,6 +876,9 @@
if(edit==0 || (pset->flag & PE_KEEP_LENGTHS)==0)
return;
+ if(edit->psys && edit->psys->flag & PSYS_GLOBAL_HAIR)
+ return;
+
LOOP_EDITED_POINTS {
LOOP_KEYS {
if(k) {
@@ -899,10 +902,10 @@
float dv1[3]= {0.0f, 0.0f, 0.0f};
float dv2[3]= {0.0f, 0.0f, 0.0f};
- if(edit==0)
+ if(edit==0 || (pset->flag & PE_KEEP_LENGTHS)==0)
return;
- if((pset->flag & PE_KEEP_LENGTHS)==0)
+ if(edit->psys && edit->psys->flag & PSYS_GLOBAL_HAIR)
return;
LOOP_EDITED_POINTS {
@@ -1057,11 +1060,13 @@
return;
LOOP_POINTS {
- psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, psys->particles+p, hairmat);
+ if(!(psys->flag & PSYS_GLOBAL_HAIR))
+ psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, psys->particles+p, hairmat);
LOOP_KEYS {
VECCOPY(key->world_co,key->co);
- Mat4MulVecfl(hairmat, key->world_co);
+ if(!(psys->flag & PSYS_GLOBAL_HAIR))
+ Mat4MulVecfl(hairmat, key->world_co);
}
}
}
@@ -1480,7 +1485,7 @@
Mat4One(mat);
LOOP_VISIBLE_POINTS {
- if(edit->psys)
+ if(edit->psys && !(psys->flag & PSYS_GLOBAL_HAIR))
psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, psys->particles + p, mat);
if(pset->selectmode==SCE_SELECT_POINT) {
@@ -1777,7 +1782,8 @@
for(k=0, key=pa->hair; k<pa->totkey; k++, key++, ekey++) {
ekey->co= key->co;
ekey->time= &key->time;
- ekey->flag |= PEK_USE_WCO;
+ if(!(psys->flag & PSYS_GLOBAL_HAIR))
+ ekey->flag |= PEK_USE_WCO;
}
pa->flag &= ~PARS_REKEY;
@@ -2059,7 +2065,9 @@
nekey->co= nkey->co;
nekey->time= &nkey->time;
- nekey->flag |= (PEK_SELECT|PEK_USE_WCO);
+ nekey->flag |= PEK_SELECT;
+ if(!(psys->flag & PSYS_GLOBAL_HAIR))
+ nekey->flag |= PEK_USE_WCO;
nekey++;
nkey++;
@@ -2129,6 +2137,9 @@
float mat[4][4], co[3], threshold= RNA_float_get(op->ptr, "threshold");
int n, totn, removed, flag, totremoved;
+ if(psys->flag & PSYS_GLOBAL_HAIR)
+ return OPERATOR_CANCELLED;
+
edit= psys->edit;
psmd= psys_get_modifier(ob, psys);
totremoved= 0;
@@ -2400,6 +2411,9 @@
int *mirrorfaces;
int rotation, totpart, newtotpart;
+ if(psys->flag & PSYS_GLOBAL_HAIR)
+ return;
+
psmd= psys_get_modifier(ob, psys);
mirrorfaces= mesh_get_x_mirror_faces(ob, NULL);
@@ -2750,7 +2764,7 @@
float mat[4][4], imat[4][4];
float lastco[3], rootco[3], co[3], nor[3], kco[3], dco[3], fac, length;
- if(psys) {
+ if(psys && !(psys->flag & PSYS_GLOBAL_HAIR)) {
psys_mat_hair_to_global(data->ob, data->dm, psys->part->from, psys->particles + point_index, mat);
Mat4Invert(imat,mat);
}
@@ -2849,6 +2863,9 @@
DerivedMesh *dm=0;
Mat4Invert(imat,ob->obmat);
+ if(psys->flag & PSYS_GLOBAL_HAIR)
+ return;
+
BLI_srandom(psys->seed+data->mval[0]+data->mval[1]);
/* painting onto the deformed mesh, could be an option? */
@@ -3070,6 +3087,7 @@
float vec[3], mousef[2];
short mval[2], mvalo[2];
int flip, mouse[2], dx, dy, removed= 0, selected= 0;
+ int lock_root = pset->flag & PE_LOCK_FIRST;
if(!PE_start_edit(edit))
return;
@@ -3093,6 +3111,10 @@
mvalo[0]= bedit->lastmouse[0];
mvalo[1]= bedit->lastmouse[1];
+ /* disable locking temporatily for disconnected hair */
+ if(edit->psys && edit->psys->flag & PSYS_GLOBAL_HAIR)
+ pset->flag &= ~PE_LOCK_FIRST;
+
if(((pset->brushtype == PE_BRUSH_ADD) ?
(sqrt(dx * dx + dy * dy) > pset->brush[PE_BRUSH_ADD].step) : (dx != 0 || dy != 0))
|| bedit->first) {
@@ -3248,6 +3270,8 @@
bedit->lastmouse[1]= mouse[1];
bedit->first= 0;
}
+
+ pset->flag |= lock_root;
}
static void brush_edit_exit(bContext *C, wmOperator *op)
@@ -3382,6 +3406,8 @@
for(i=0; i<edit->totpoint; i++, pa++)
pa->hair= MEM_dupallocN(pa->hair);
+
+ undo->psys_flag = edit->psys->flag;
}
else {
PTCacheMem *pm;
@@ -3449,6 +3475,8 @@
hkey++;
}
}
+
+ psys->flag = undo->psys_flag;
}
else {
PTCacheMem *pm;
@@ -3704,7 +3732,8 @@
key->co= hkey->co;
key->time= &hkey->time;
key->flag= hkey->editflag;
- key->flag |= PEK_USE_WCO;
+ if(!(psys->flag & PSYS_GLOBAL_HAIR))
+ key->flag |= PEK_USE_WCO;
hkey++;
}
pa++;
@@ -3828,6 +3857,7 @@
psys->free_edit = NULL;
psys->recalc |= PSYS_RECALC_RESET;
+ psys->flag &= ~PSYS_GLOBAL_HAIR;
psys_reset(psys, PSYS_RESET_DEPSGRAPH);
DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
Modified: branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_intern.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_intern.h 2009-09-05 09:54:01 UTC (rev 23019)
+++ branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_intern.h 2009-09-05 20:12:08 UTC (rev 23020)
@@ -85,6 +85,8 @@
void PARTICLE_OT_remove_target(struct wmOperatorType *ot);
void PARTICLE_OT_target_move_up(struct wmOperatorType *ot);
void PARTICLE_OT_target_move_down(struct wmOperatorType *ot);
+void PARTICLE_OT_connect_hair(struct wmOperatorType *ot);
+void PARTICLE_OT_disconnect_hair(struct wmOperatorType *ot);
void SCENE_OT_render_layer_add(struct wmOperatorType *ot);
void SCENE_OT_render_layer_remove(struct wmOperatorType *ot);
Modified: branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_ops.c 2009-09-05 09:54:01 UTC (rev 23019)
+++ branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_ops.c 2009-09-05 20:12:08 UTC (rev 23020)
@@ -35,6 +35,8 @@
#include "DNA_group_types.h"
#include "DNA_object_types.h"
#include "DNA_material_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
#include "DNA_node_types.h"
#include "DNA_texture_types.h"
#include "DNA_scene_types.h"
@@ -42,8 +44,11 @@
#include "DNA_space_types.h"
#include "DNA_world_types.h"
+#include "BKE_bvhutils.h"
+#include "BKE_cdderivedmesh.h"
#include "BKE_context.h"
#include "BKE_depsgraph.h"
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list