97
98
static void createFacepa(ExplodeModifierData *emd,
98
ParticleSystemModifierData *psmd,
99
ParticleSystemModifierData *psmd,
101
ParticleSystem *psys=psmd->psys;
102
MFace *fa=NULL, *mface=NULL;
102
ParticleSystem *psys = psmd->psys;
103
MFace *fa = NULL, *mface = NULL;
103
104
MVert *mvert = NULL;
104
105
ParticleData *pa;
106
107
float center[3], co[3];
107
int *facepa=NULL,*vertpa=NULL,totvert=0,totface=0,totpart=0;
108
int i,p,v1,v2,v3,v4=0;
108
int *facepa = NULL, *vertpa = NULL, totvert = 0, totface = 0, totpart = 0;
109
int i, p, v1, v2, v3, v4 = 0;
110
111
mvert = dm->getVertArray(dm);
111
112
mface = dm->getTessFaceArray(dm);
112
totface= dm->getNumTessFaces(dm);
113
totvert= dm->getNumVerts(dm);
114
totpart= psmd->psys->totpart;
113
totface = dm->getNumTessFaces(dm);
114
totvert = dm->getNumVerts(dm);
115
totpart = psmd->psys->totpart;
116
117
BLI_srandom(psys->seed);
119
120
MEM_freeN(emd->facepa);
121
facepa = emd->facepa = MEM_callocN(sizeof(int)*totface, "explode_facepa");
122
facepa = emd->facepa = MEM_callocN(sizeof(int) * totface, "explode_facepa");
123
vertpa = MEM_callocN(sizeof(int)*totvert, "explode_vertpa");
124
vertpa = MEM_callocN(sizeof(int) * totvert, "explode_vertpa");
125
126
/* initialize all faces & verts to no particle */
126
for (i=0; i<totface; i++)
127
for (i = 0; i < totface; i++)
129
for (i=0; i<totvert; i++)
130
for (i = 0; i < totvert; i++)
132
133
/* set protected verts */
133
134
if (emd->vgroup) {
134
135
MDeformVert *dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
136
const int defgrp_index= emd->vgroup-1;
137
for (i=0; i<totvert; i++, dvert++) {
137
const int defgrp_index = emd->vgroup - 1;
138
for (i = 0; i < totvert; i++, dvert++) {
138
139
float val = BLI_frand();
139
val = (1.0f-emd->protect)*val + emd->protect*0.5f;
140
val = (1.0f - emd->protect) * val + emd->protect * 0.5f;
140
141
if (val < defvert_find_weight(dvert, defgrp_index))
146
147
/* make tree of emitter locations */
147
tree=BLI_kdtree_new(totpart);
148
for (p=0,pa=psys->particles; p<totpart; p++,pa++) {
149
psys_particle_on_emitter(psmd,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,NULL,NULL,NULL,NULL,NULL);
148
tree = BLI_kdtree_new(totpart);
149
for (p = 0, pa = psys->particles; p < totpart; p++, pa++) {
150
psys_particle_on_emitter(psmd, psys->part->from, pa->num, pa->num_dmcache, pa->fuv, pa->foffset, co, NULL, NULL, NULL, NULL, NULL);
150
151
BLI_kdtree_insert(tree, p, co, NULL);
152
153
BLI_kdtree_balance(tree);
154
155
/* set face-particle-indexes to nearest particle to face center */
155
for (i=0,fa=mface; i<totface; i++,fa++) {
156
add_v3_v3v3(center,mvert[fa->v1].co,mvert[fa->v2].co);
156
for (i = 0, fa = mface; i < totface; i++, fa++) {
157
add_v3_v3v3(center, mvert[fa->v1].co, mvert[fa->v2].co);
157
158
add_v3_v3(center, mvert[fa->v3].co);
159
160
add_v3_v3(center, mvert[fa->v4].co);
160
mul_v3_fl(center,0.25);
161
mul_v3_fl(center, 0.25);
163
mul_v3_fl(center,0.3333f);
165
p= BLI_kdtree_find_nearest(tree,center,NULL,NULL);
164
mul_v3_fl(center, 1.0f / 3.0f);
166
p = BLI_kdtree_find_nearest(tree, center, NULL, NULL);
173
if (v1>=0 && v2>=0 && v3>=0 && (fa->v4==0 || v4>=0))
176
if (v1>=0) vertpa[fa->v1]=p;
177
if (v2>=0) vertpa[fa->v2]=p;
178
if (v3>=0) vertpa[fa->v3]=p;
179
if (fa->v4 && v4>=0) vertpa[fa->v4]=p;
174
if (v1 >= 0 && v2 >= 0 && v3 >= 0 && (fa->v4 == 0 || v4 >= 0))
177
if (v1 >= 0) vertpa[fa->v1] = p;
178
if (v2 >= 0) vertpa[fa->v2] = p;
179
if (v3 >= 0) vertpa[fa->v3] = p;
180
if (fa->v4 && v4 >= 0) vertpa[fa->v4] = p;
182
183
if (vertpa) MEM_freeN(vertpa);
545
static DerivedMesh * cutEdges(ExplodeModifierData *emd, DerivedMesh *dm)
547
static DerivedMesh *cutEdges(ExplodeModifierData *emd, DerivedMesh *dm)
547
549
DerivedMesh *splitdm;
548
MFace *mf=NULL,*df1=NULL;
549
MFace *mface=dm->getTessFaceArray(dm);
550
MFace *mf = NULL, *df1 = NULL;
551
MFace *mface = dm->getTessFaceArray(dm);
550
552
MVert *dupve, *mv;
551
553
EdgeHash *edgehash;
552
554
EdgeHashIterator *ehi;
553
int totvert=dm->getNumVerts(dm);
554
int totface=dm->getNumTessFaces(dm);
555
int totvert = dm->getNumVerts(dm);
556
int totface = dm->getNumTessFaces(dm);
556
int *facesplit = MEM_callocN(sizeof(int)*totface,"explode_facesplit");
557
int *vertpa = MEM_callocN(sizeof(int)*totvert,"explode_vertpa2");
558
int *facesplit = MEM_callocN(sizeof(int) * totface, "explode_facesplit");
559
int *vertpa = MEM_callocN(sizeof(int) * totvert, "explode_vertpa2");
558
560
int *facepa = emd->facepa;
559
int *fs, totesplit=0,totfsplit=0,curdupface=0;
561
int *fs, totesplit = 0, totfsplit = 0, curdupface = 0;
560
562
int i, v1, v2, v3, v4, esplit,
561
563
v[4] = {0, 0, 0, 0}, /* To quite gcc barking... */
562
564
uv[4] = {0, 0, 0, 0}; /* To quite gcc barking... */
564
566
unsigned int ed_v1, ed_v2;
566
edgehash= BLI_edgehash_new();
568
edgehash = BLI_edgehash_new();
568
570
/* recreate vertpa from facepa calculation */
569
for (i=0,mf=mface; i<totface; i++,mf++) {
570
vertpa[mf->v1]=facepa[i];
571
vertpa[mf->v2]=facepa[i];
572
vertpa[mf->v3]=facepa[i];
571
for (i = 0, mf = mface; i < totface; i++, mf++) {
572
vertpa[mf->v1] = facepa[i];
573
vertpa[mf->v2] = facepa[i];
574
vertpa[mf->v3] = facepa[i];
574
vertpa[mf->v4]=facepa[i];
576
vertpa[mf->v4] = facepa[i];
577
579
/* mark edges for splitting and how to split faces */
578
for (i=0,mf=mface,fs=facesplit; i<totface; i++,mf++,fs++) {
580
for (i = 0, mf = mface, fs = facesplit; i < totface; i++, mf++, fs++) {
584
586
BLI_edgehash_insert(edgehash, mf->v1, mf->v2, NULL);
589
591
BLI_edgehash_insert(edgehash, mf->v2, mf->v3, NULL);
597
599
BLI_edgehash_insert(edgehash, mf->v3, mf->v4, NULL);
602
604
BLI_edgehash_insert(edgehash, mf->v1, mf->v4, NULL);
650
652
* later interpreted as tri's, for this to work right I think we probably
651
653
* have to stop using tessface - campbell */
653
facepa= MEM_callocN(sizeof(int)*(totface+(totfsplit * 2)),"explode_facepa");
654
//memcpy(facepa,emd->facepa,totface*sizeof(int));
655
facepa = MEM_callocN(sizeof(int) * (totface + (totfsplit * 2)), "explode_facepa");
656
//memcpy(facepa, emd->facepa, totface*sizeof(int));
657
emd->facepa = facepa;
657
659
/* create new verts */
658
ehi= BLI_edgehashIterator_new(edgehash);
660
ehi = BLI_edgehashIterator_new(edgehash);
659
661
for (; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) {
660
662
BLI_edgehashIterator_getKey(ehi, &ed_v1, &ed_v2);
661
esplit= GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi));
662
mv=CDDM_get_vert(splitdm, ed_v2);
663
dupve=CDDM_get_vert(splitdm,esplit);
665
DM_copy_vert_data(splitdm,splitdm, ed_v2, esplit,1);
669
mv=CDDM_get_vert(splitdm, ed_v1);
671
add_v3_v3(dupve->co, mv->co);
672
mul_v3_fl(dupve->co, 0.5f);
663
esplit = GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi));
664
mv = CDDM_get_vert(splitdm, ed_v2);
665
dupve = CDDM_get_vert(splitdm, esplit);
667
DM_copy_vert_data(splitdm, splitdm, ed_v2, esplit, 1);
671
mv = CDDM_get_vert(splitdm, ed_v1);
673
mid_v3_v3v3(dupve->co, dupve->co, mv->co);
674
675
BLI_edgehashIterator_free(ehi);
676
677
/* create new faces */
677
curdupface=0;//=totface;
678
curdupface = 0; //=totface;
678
679
//curdupin=totesplit;
679
for (i=0,fs=facesplit; i<totface; i++,fs++) {
680
for (i = 0, fs = facesplit; i < totface; i++, fs++) {
680
681
mf = dm->getTessFaceData(dm, i, CD_MFACE);
687
SET_VERTS(1, 2, 3, 4);
692
SET_VERTS(2, 3, 4, 1);
696
SET_VERTS(4, 1, 2, 3);
700
SET_VERTS(3, 4, 1, 2);
704
SET_VERTS(1, 2, 3, 4);
707
SET_VERTS(2, 3, 1, 4);
710
SET_VERTS(3, 1, 2, 4);
719
remap_faces_3_6_9_12(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2], v[3]);
721
remap_uvs_3_6_9_12(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2], uv[3]);
725
remap_faces_5_10(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2], v[3]);
727
remap_uvs_5_10(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2], uv[3]);
730
remap_faces_15(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2], v[3]);
732
remap_uvs_15(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2], uv[3]);
738
remap_faces_7_11_13_14(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2], v[3]);
740
remap_uvs_7_11_13_14(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2], uv[3]);
745
remap_faces_19_21_22(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2]);
747
remap_uvs_19_21_22(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2]);
750
remap_faces_23(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2]);
752
remap_uvs_23(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2]);
756
df1 = get_dface(dm, splitdm, curdupface, i, mf);
757
facepa[curdupface] = vertpa[mf->v1];
760
df1->flag |= ME_FACE_SEL;
762
df1->flag &= ~ME_FACE_SEL;
766
curdupface += add_faces[*fs]+1;
688
SET_VERTS(1, 2, 3, 4);
693
SET_VERTS(2, 3, 4, 1);
697
SET_VERTS(4, 1, 2, 3);
701
SET_VERTS(3, 4, 1, 2);
705
SET_VERTS(1, 2, 3, 4);
708
SET_VERTS(2, 3, 1, 4);
711
SET_VERTS(3, 1, 2, 4);
720
remap_faces_3_6_9_12(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2], v[3]);
722
remap_uvs_3_6_9_12(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2], uv[3]);
726
remap_faces_5_10(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2], v[3]);
728
remap_uvs_5_10(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2], uv[3]);
731
remap_faces_15(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2], v[3]);
733
remap_uvs_15(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2], uv[3]);
739
remap_faces_7_11_13_14(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2], v[3]);
741
remap_uvs_7_11_13_14(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2], uv[3]);
746
remap_faces_19_21_22(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2]);
748
remap_uvs_19_21_22(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2]);
751
remap_faces_23(dm, splitdm, mf, facepa, vertpa, i, edgehash, curdupface, v[0], v[1], v[2]);
753
remap_uvs_23(dm, splitdm, numlayer, i, curdupface, uv[0], uv[1], uv[2]);
757
df1 = get_dface(dm, splitdm, curdupface, i, mf);
758
facepa[curdupface] = vertpa[mf->v1];
761
df1->flag |= ME_FACE_SEL;
763
df1->flag &= ~ME_FACE_SEL;
767
curdupface += add_faces[*fs] + 1;
769
for (i=0; i<curdupface; i++) {
770
for (i = 0; i < curdupface; i++) {
770
771
mf = CDDM_get_tessface(splitdm, i);
771
772
test_index_face(mf, &splitdm->faceData, i, (mf->flag & ME_FACE_SEL ? 4 : 3));
783
static DerivedMesh * explodeMesh(ExplodeModifierData *emd,
784
ParticleSystemModifierData *psmd, Scene *scene, Object *ob,
785
DerivedMesh *to_explode)
784
static DerivedMesh *explodeMesh(ExplodeModifierData *emd,
785
ParticleSystemModifierData *psmd, Scene *scene, Object *ob,
786
DerivedMesh *to_explode)
787
DerivedMesh *explode, *dm=to_explode;
788
MFace *mf= NULL, *mface;
788
DerivedMesh *explode, *dm = to_explode;
789
MFace *mf = NULL, *mface;
789
790
/* ParticleSettings *part=psmd->psys->part; */ /* UNUSED */
790
ParticleSimulationData sim= {NULL};
791
ParticleData *pa=NULL, *pars=psmd->psys->particles;
791
ParticleSimulationData sim = {NULL};
792
ParticleData *pa = NULL, *pars = psmd->psys->particles;
792
793
ParticleKey state, birth;
793
794
EdgeHash *vertpahash;
794
795
EdgeHashIterator *ehi;
795
float *vertco= NULL, imat[4][4];
796
float *vertco = NULL, imat[4][4];
798
799
/* float timestep; */
799
int *facepa=emd->facepa;
800
int totdup=0,totvert=0,totface=0,totpart=0,delface=0;
800
int *facepa = emd->facepa;
801
int totdup = 0, totvert = 0, totface = 0, totpart = 0, delface = 0;
802
unsigned int ed_v1, ed_v2, mindex=0;
803
unsigned int ed_v1, ed_v2, mindex = 0;
803
804
MTFace *mtface = NULL, *mtf;
805
totface= dm->getNumTessFaces(dm);
806
totvert= dm->getNumVerts(dm);
807
mface= dm->getTessFaceArray(dm);
808
totpart= psmd->psys->totpart;
812
sim.psys= psmd->psys;
815
/* timestep= psys_get_timestep(&sim); */
817
cfra= BKE_curframe(scene);
806
totface = dm->getNumTessFaces(dm);
807
totvert = dm->getNumVerts(dm);
808
mface = dm->getTessFaceArray(dm);
809
totpart = psmd->psys->totpart;
813
sim.psys = psmd->psys;
816
/* timestep = psys_get_timestep(&sim); */
818
cfra = BKE_scene_frame_get(scene);
819
820
/* hash table for vertice <-> particle relations */
820
vertpahash= BLI_edgehash_new();
821
vertpahash = BLI_edgehash_new();
822
for (i=0; i<totface; i++) {
823
for (i = 0; i < totface; i++) {
823
824
if (facepa[i] != totpart) {
824
825
pa = pars + facepa[i];
972
973
if (psmd->psys->lattice) {
973
974
end_latt_deform(psmd->psys->lattice);
974
psmd->psys->lattice= NULL;
975
psmd->psys->lattice = NULL;
980
static ParticleSystemModifierData * findPrecedingParticlesystem(Object *ob, ModifierData *emd)
981
static ParticleSystemModifierData *findPrecedingParticlesystem(Object *ob, ModifierData *emd)
982
983
ModifierData *md;
983
ParticleSystemModifierData *psmd= NULL;
984
ParticleSystemModifierData *psmd = NULL;
985
for (md=ob->modifiers.first; emd!=md; md=md->next) {
986
if (md->type==eModifierType_ParticleSystem)
987
psmd= (ParticleSystemModifierData*) md;
986
for (md = ob->modifiers.first; emd != md; md = md->next) {
987
if (md->type == eModifierType_ParticleSystem)
988
psmd = (ParticleSystemModifierData *) md;
991
static DerivedMesh * applyModifier(ModifierData *md, Object *ob,
992
DerivedMesh *derivedData,
993
int UNUSED(useRenderParams),
994
int UNUSED(isFinalCalc))
992
static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
993
DerivedMesh *derivedData,
994
ModifierApplyFlag UNUSED(flag))
996
996
DerivedMesh *dm = derivedData;
997
ExplodeModifierData *emd= (ExplodeModifierData*) md;
998
ParticleSystemModifierData *psmd=findPrecedingParticlesystem(ob,md);
997
ExplodeModifierData *emd = (ExplodeModifierData *) md;
998
ParticleSystemModifierData *psmd = findPrecedingParticlesystem(ob, md);
1000
1000
DM_ensure_tessface(dm); /* BMESH - UNTIL MODIFIER IS UPDATED FOR MPoly */
1003
ParticleSystem * psys=psmd->psys;
1003
ParticleSystem *psys = psmd->psys;
1005
if (psys==NULL || psys->totpart==0) return derivedData;
1006
if (psys->part==NULL || psys->particles==NULL) return derivedData;
1007
if (psmd->dm==NULL) return derivedData;
1005
if (psys == NULL || psys->totpart == 0) return derivedData;
1006
if (psys->part == NULL || psys->particles == NULL) return derivedData;
1007
if (psmd->dm == NULL) return derivedData;
1009
1009
/* 1. find faces to be exploded if needed */
1010
1010
if (emd->facepa == NULL ||
1011
psmd->flag&eParticleSystemFlag_Pars ||
1012
emd->flag&eExplodeFlag_CalcFaces ||
1011
psmd->flag & eParticleSystemFlag_Pars ||
1012
emd->flag & eExplodeFlag_CalcFaces ||
1013
1013
MEM_allocN_len(emd->facepa) / sizeof(int) != dm->getNumTessFaces(dm))
1015
1015
if (psmd->flag & eParticleSystemFlag_Pars)