~ubuntu-branches/ubuntu/trusty/blender/trusty

« back to all changes in this revision

Viewing changes to source/blender/blenkernel/intern/subsurf_ccg.c

  • Committer: Package Import Robot
  • Author(s): Jeremy Bicha
  • Date: 2013-03-06 12:08:47 UTC
  • mfrom: (1.5.1) (14.1.8 experimental)
  • Revision ID: package-import@ubuntu.com-20130306120847-frjfaryb2zrotwcg
Tags: 2.66a-1ubuntu1
* Resynchronize with Debian (LP: #1076930, #1089256, #1052743, #999024,
  #1122888, #1147084)
* debian/control:
  - Lower build-depends on libavcodec-dev since we're not
    doing the libav9 transition in Ubuntu yet

Show diffs side-by-side

added added

removed removed

Lines of Context:
50
50
#include "BLI_edgehash.h"
51
51
#include "BLI_math.h"
52
52
#include "BLI_memarena.h"
53
 
#include "BLI_pbvh.h"
54
53
 
 
54
#include "BKE_pbvh.h"
 
55
#include "BKE_ccg.h"
55
56
#include "BKE_cdderivedmesh.h"
56
57
#include "BKE_global.h"
57
58
#include "BKE_mesh.h"
110
111
typedef enum {
111
112
        CCG_USE_AGING = 1,
112
113
        CCG_USE_ARENA = 2,
113
 
        CCG_CALC_NORMALS = 4
 
114
        CCG_CALC_NORMALS = 4,
 
115
        /* add an extra four bytes for a mask layer */
 
116
        CCG_ALLOC_MASK = 8,
 
117
        CCG_SIMPLE_SUBDIV = 16
114
118
} CCGFlags;
115
119
 
116
 
static CCGSubSurf *_getSubSurf(CCGSubSurf *prevSS, int subdivLevels, CCGFlags flags)
 
120
static CCGSubSurf *_getSubSurf(CCGSubSurf *prevSS, int subdivLevels,
 
121
                               int numLayers, CCGFlags flags)
117
122
{
118
123
        CCGMeshIFC ifc;
119
124
        CCGSubSurf *ccgSS;
120
125
        int useAging = !!(flags & CCG_USE_AGING);
121
126
        int useArena = flags & CCG_USE_ARENA;
 
127
        int normalOffset = 0;
122
128
 
123
 
        /* subdivLevels==0 is not allowed */
 
129
        /* (subdivLevels == 0) is not allowed */
124
130
        subdivLevels = MAX2(subdivLevels, 1);
125
131
 
126
132
        if (prevSS) {
128
134
 
129
135
                ccgSubSurf_getUseAgeCounts(prevSS, &oldUseAging, NULL, NULL, NULL);
130
136
 
131
 
                if (oldUseAging != useAging) {
 
137
                if ((oldUseAging != useAging) ||
 
138
                        (ccgSubSurf_getSimpleSubdiv(prevSS) !=
 
139
                         !!(flags & CCG_SIMPLE_SUBDIV)))
 
140
                {
132
141
                        ccgSubSurf_free(prevSS);
133
142
                }
134
143
                else {
144
153
        else {
145
154
                ifc.vertUserSize = ifc.edgeUserSize = ifc.faceUserSize = 8;
146
155
        }
147
 
        ifc.vertDataSize = sizeof(float) * (flags & CCG_CALC_NORMALS ? 6 : 3);
 
156
        ifc.numLayers = numLayers;
 
157
        ifc.vertDataSize = sizeof(float) * numLayers;
 
158
        normalOffset += sizeof(float) * numLayers;
 
159
        if (flags & CCG_CALC_NORMALS)
 
160
                ifc.vertDataSize += sizeof(float) * 3;
 
161
        if (flags & CCG_ALLOC_MASK)
 
162
                ifc.vertDataSize += sizeof(float);
 
163
        ifc.simpleSubdiv = !!(flags & CCG_SIMPLE_SUBDIV);
148
164
 
149
165
        if (useArena) {
150
166
                CCGAllocatorIFC allocatorIFC;
165
181
                ccgSubSurf_setUseAgeCounts(ccgSS, 1, 8, 8, 8);
166
182
        }
167
183
 
 
184
        if (flags & CCG_ALLOC_MASK) {
 
185
                normalOffset += sizeof(float);
 
186
                /* mask is allocated after regular layers */
 
187
                ccgSubSurf_setAllocMask(ccgSS, 1, sizeof(float) * numLayers);
 
188
        }
 
189
        
168
190
        if (flags & CCG_CALC_NORMALS)
169
 
                ccgSubSurf_setCalcVertexNormals(ccgSS, 1, offsetof(DMGridData, no));
 
191
                ccgSubSurf_setCalcVertexNormals(ccgSS, 1, normalOffset);
170
192
        else
171
193
                ccgSubSurf_setCalcVertexNormals(ccgSS, 0, 0);
172
194
 
244
266
        int j, nverts = mpoly[fi].totloop;
245
267
 
246
268
        for (j = 0; j < nverts; j++) {
247
 
                for (nv = v = get_uv_map_vert(vmap, ml[j].v); v; v = v->next) {
 
269
                for (nv = v = BKE_mesh_uv_vert_map_get_vert(vmap, ml[j].v); v; v = v->next) {
248
270
                        if (v->separate)
249
271
                                nv = v;
250
272
                        if (v->f == fi)
273
295
        float uv[3] = {0.0f, 0.0f, 0.0f}; /* only first 2 values are written into */
274
296
 
275
297
        limit[0] = limit[1] = STD_UV_CONNECT_LIMIT;
276
 
        vmap = make_uv_vert_map(mpoly, mloop, mloopuv, totface, totvert, 0, limit);
 
298
        vmap = BKE_mesh_uv_vert_map_make(mpoly, mloop, mloopuv, totface, totvert, 0, limit);
277
299
        if (!vmap)
278
300
                return 0;
279
301
        
281
303
 
282
304
        /* create vertices */
283
305
        for (i = 0; i < totvert; i++) {
284
 
                if (!get_uv_map_vert(vmap, i))
 
306
                if (!BKE_mesh_uv_vert_map_get_vert(vmap, i))
285
307
                        continue;
286
308
 
287
 
                for (v = get_uv_map_vert(vmap, i)->next; v; v = v->next)
 
309
                for (v = BKE_mesh_uv_vert_map_get_vert(vmap, i)->next; v; v = v->next)
288
310
                        if (v->separate)
289
311
                                break;
290
312
 
291
313
                seam = (v != NULL) || ((mvert + i)->flag & ME_VERT_MERGED);
292
314
 
293
 
                for (v = get_uv_map_vert(vmap, i); v; v = v->next) {
 
315
                for (v = BKE_mesh_uv_vert_map_get_vert(vmap, i); v; v = v->next) {
294
316
                        if (v->separate) {
295
317
                                CCGVert *ssv;
296
318
                                int loopid = mpoly[v->f].loopstart + v->tfindex;
314
336
                MLoop *ml = mloop + mp->loopstart;
315
337
 
316
338
                BLI_array_empty(fverts);
317
 
                BLI_array_growitems(fverts, nverts);
 
339
                BLI_array_grow_items(fverts, nverts);
318
340
 
319
341
                get_face_uv_map_vert(vmap, mpoly, ml, i, fverts);
320
342
 
350
372
                CCGFace *f;
351
373
 
352
374
                BLI_array_empty(fverts);
353
 
                BLI_array_growitems(fverts, nverts);
 
375
                BLI_array_grow_items(fverts, nverts);
354
376
 
355
377
                get_face_uv_map_vert(vmap, mpoly, ml, i, fverts);
356
378
                ccgSubSurf_syncFace(ss, SET_INT_IN_POINTER(i), nverts, fverts, &f);
358
380
 
359
381
        BLI_array_free(fverts);
360
382
 
361
 
        free_uv_vert_map(vmap);
 
383
        BKE_mesh_uv_vert_map_free(vmap);
362
384
        ccgSubSurf_processSync(ss);
363
385
 
364
386
        return 1;
382
404
                return;
383
405
 
384
406
        /* create a CCGSubSurf from uv's */
385
 
        uvss = _getSubSurf(NULL, ccgSubSurf_getSubdivisionLevels(ss), CCG_USE_ARENA);
 
407
        uvss = _getSubSurf(NULL, ccgSubSurf_getSubdivisionLevels(ss), 2, CCG_USE_ARENA);
386
408
 
387
409
        if (!ss_sync_from_uv(uvss, ss, dm, dmloopuv)) {
388
410
                ccgSubSurf_free(uvss);
397
419
 
398
420
        /* make a map from original faces to CCGFaces */
399
421
        faceMap = MEM_mallocN(totface * sizeof(*faceMap), "facemapuv");
400
 
 
401
 
        fi = ccgSubSurf_getFaceIterator(uvss);
402
 
        for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
 
422
        for (fi = ccgSubSurf_getFaceIterator(uvss); !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
403
423
                CCGFace *f = ccgFaceIterator_getCurrent(fi);
404
424
                faceMap[GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f))] = f;
405
425
        }
414
434
                int numVerts = ccgSubSurf_getFaceNumVerts(f);
415
435
 
416
436
                for (S = 0; S < numVerts; S++) {
417
 
                        float (*faceGridData)[3] = ccgSubSurf_getFaceGridDataArray(uvss, f, S);
 
437
                        float (*faceGridData)[2] = ccgSubSurf_getFaceGridDataArray(uvss, f, S);
418
438
 
419
439
                        for (y = 0; y < gridFaces; y++) {
420
440
                                for (x = 0; x < gridFaces; x++) {
493
513
                                        w2 = (1.0f - fx + fac2 * fx * -fac) * (fy);
494
514
                                        w4 = (fx) * (1.0f - fy + -fac2 * fy * fac);
495
515
 
496
 
                                        fac2 = 1.0f - (w1 + w2 + w4);
497
 
                                        fac2 = fac2 / (float)(faceLen - 3);
498
 
                                        for (j = 0; j < faceLen; j++)
499
 
                                                w[j] = fac2;
 
516
                                        /* these values aren't used for tri's and cause divide by zero */
 
517
                                        if (faceLen > 3) {
 
518
                                                fac2 = 1.0f - (w1 + w2 + w4);
 
519
                                                fac2 = fac2 / (float)(faceLen - 3);
 
520
                                                for (j = 0; j < faceLen; j++) {
 
521
                                                        w[j] = fac2;
 
522
                                                }
 
523
                                        }
500
524
                                        
501
525
                                        w[i] = w1;
502
526
                                        w[(i - 1 + faceLen) % faceLen] = w2;
578
602
        }
579
603
 
580
604
        mp = mpoly;
581
 
        index = DM_get_poly_data_layer(dm, CD_ORIGINDEX);
 
605
        index = (int *)dm->getPolyDataArray(dm, CD_ORIGINDEX);
582
606
        for (i = 0; i < dm->numPolyData; i++, mp++) {
583
607
                CCGFace *f;
584
608
 
585
609
                BLI_array_empty(fVerts);
586
 
                BLI_array_growitems(fVerts, mp->totloop);
 
610
                BLI_array_grow_items(fVerts, mp->totloop);
587
611
 
588
612
                ml = mloop + mp->loopstart;
589
613
                for (j = 0; j < mp->totloop; j++, ml++) {
595
619
                 * other parts of code significantly to handle missing faces.
596
620
                 * since this really shouldn't even be possible we just bail.*/
597
621
                if (ccgSubSurf_syncFace(ss, SET_INT_IN_POINTER(i), mp->totloop,
598
 
                                        fVerts, &f) == eCCGError_InvalidValue) {
 
622
                                        fVerts, &f) == eCCGError_InvalidValue)
 
623
                {
599
624
                        static int hasGivenError = 0;
600
625
 
601
626
                        if (!hasGivenError) {
633
658
        return ((int *) ccgSubSurf_getFaceUserData(ss, f))[1];
634
659
}
635
660
 
 
661
static void minmax_v3_v3v3(const float vec[3], float min[3], float max[3])
 
662
{
 
663
        if (min[0] > vec[0]) min[0] = vec[0];
 
664
        if (min[1] > vec[1]) min[1] = vec[1];
 
665
        if (min[2] > vec[2]) min[2] = vec[2];
 
666
        if (max[0] < vec[0]) max[0] = vec[0];
 
667
        if (max[1] < vec[1]) max[1] = vec[1];
 
668
        if (max[2] < vec[2]) max[2] = vec[2];
 
669
}
 
670
 
636
671
static void ccgDM_getMinMax(DerivedMesh *dm, float min_r[3], float max_r[3])
637
672
{
638
673
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
639
674
        CCGSubSurf *ss = ccgdm->ss;
640
 
        CCGVertIterator *vi = ccgSubSurf_getVertIterator(ss);
641
 
        CCGEdgeIterator *ei = ccgSubSurf_getEdgeIterator(ss);
642
 
        CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss);
 
675
        CCGVertIterator *vi;
 
676
        CCGEdgeIterator *ei;
 
677
        CCGFaceIterator *fi;
 
678
        CCGKey key;
643
679
        int i, edgeSize = ccgSubSurf_getEdgeSize(ss);
644
680
        int gridSize = ccgSubSurf_getGridSize(ss);
645
681
 
 
682
        CCG_key_top_level(&key, ss);
 
683
 
646
684
        if (!ccgSubSurf_getNumVerts(ss))
647
685
                min_r[0] = min_r[1] = min_r[2] = max_r[0] = max_r[1] = max_r[2] = 0.0;
648
686
 
649
 
        for (; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
 
687
        for (vi = ccgSubSurf_getVertIterator(ss); !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
650
688
                CCGVert *v = ccgVertIterator_getCurrent(vi);
651
689
                float *co = ccgSubSurf_getVertData(ss, v);
652
690
 
653
 
                DO_MINMAX(co, min_r, max_r);
 
691
                minmax_v3_v3v3(co, min_r, max_r);
654
692
        }
 
693
        ccgVertIterator_free(vi);
655
694
 
656
 
        for (; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
 
695
        for (ei = ccgSubSurf_getEdgeIterator(ss); !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
657
696
                CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
658
 
                DMGridData *edgeData = ccgSubSurf_getEdgeDataArray(ss, e);
 
697
                CCGElem *edgeData = ccgSubSurf_getEdgeDataArray(ss, e);
659
698
 
660
699
                for (i = 0; i < edgeSize; i++)
661
 
                        DO_MINMAX(edgeData[i].co, min_r, max_r);
 
700
                        minmax_v3_v3v3(CCG_elem_offset_co(&key, edgeData, i), min_r, max_r);
662
701
        }
 
702
        ccgEdgeIterator_free(ei);
663
703
 
664
 
        for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
 
704
        for (fi = ccgSubSurf_getFaceIterator(ss); !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
665
705
                CCGFace *f = ccgFaceIterator_getCurrent(fi);
666
706
                int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(f);
667
707
 
668
708
                for (S = 0; S < numVerts; S++) {
669
 
                        DMGridData *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
 
709
                        CCGElem *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
670
710
 
671
711
                        for (y = 0; y < gridSize; y++)
672
712
                                for (x = 0; x < gridSize; x++)
673
 
                                        DO_MINMAX(faceGridData[y * gridSize + x].co, min_r, max_r);
 
713
                                        minmax_v3_v3v3(CCG_grid_elem_co(&key, faceGridData, x, y), min_r, max_r);
674
714
                }
675
715
        }
676
 
 
677
716
        ccgFaceIterator_free(fi);
678
 
        ccgEdgeIterator_free(ei);
679
 
        ccgVertIterator_free(vi);
680
717
}
681
718
 
682
719
static int ccgDM_getNumVerts(DerivedMesh *dm)
712
749
{
713
750
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
714
751
        CCGSubSurf *ss = ccgdm->ss;
715
 
        DMGridData *vd;
 
752
        CCGElem *vd;
 
753
        CCGKey key;
716
754
        int i;
717
755
 
 
756
        CCG_key_top_level(&key, ss);
718
757
        memset(mv, 0, sizeof(*mv));
719
758
 
720
759
        if ((vertNum < ccgdm->edgeMap[0].startVert) && (ccgSubSurf_getNumFaces(ss) > 0)) {
730
769
                int gridInternalEnd;
731
770
 
732
771
                i = 0;
733
 
                while (i < lastface && vertNum >= ccgdm->faceMap[i + 1].startVert)
734
 
                        ++i;
 
772
                while (i < lastface && vertNum >= ccgdm->faceMap[i + 1].startVert) {
 
773
                        i++;
 
774
                }
735
775
 
736
776
                f = ccgdm->faceMap[i].face;
737
777
                numVerts = ccgSubSurf_getFaceNumVerts(f);
745
785
                offset = vertNum - ccgdm->faceMap[i].startVert;
746
786
                if (offset < 1) {
747
787
                        vd = ccgSubSurf_getFaceCenterData(f);
748
 
                        copy_v3_v3(mv->co, vd->co);
749
 
                        normal_float_to_short_v3(mv->no, vd->no);
 
788
                        copy_v3_v3(mv->co, CCG_elem_co(&key, vd));
 
789
                        normal_float_to_short_v3(mv->no, CCG_elem_no(&key, vd));
750
790
                }
751
791
                else if (offset < gridSideEnd) {
752
792
                        offset -= 1;
753
793
                        grid = offset / gridSideVerts;
754
794
                        x = offset % gridSideVerts + 1;
755
795
                        vd = ccgSubSurf_getFaceGridEdgeData(ss, f, grid, x);
756
 
                        copy_v3_v3(mv->co, vd->co);
757
 
                        normal_float_to_short_v3(mv->no, vd->no);
 
796
                        copy_v3_v3(mv->co, CCG_elem_co(&key, vd));
 
797
                        normal_float_to_short_v3(mv->no, CCG_elem_no(&key, vd));
758
798
                }
759
799
                else if (offset < gridInternalEnd) {
760
800
                        offset -= gridSideEnd;
763
803
                        y = offset / gridSideVerts + 1;
764
804
                        x = offset % gridSideVerts + 1;
765
805
                        vd = ccgSubSurf_getFaceGridData(ss, f, grid, x, y);
766
 
                        copy_v3_v3(mv->co, vd->co);
767
 
                        normal_float_to_short_v3(mv->no, vd->no);
 
806
                        copy_v3_v3(mv->co, CCG_elem_co(&key, vd));
 
807
                        normal_float_to_short_v3(mv->no, CCG_elem_no(&key, vd));
768
808
                }
769
809
        }
770
810
        else if ((vertNum < ccgdm->vertMap[0].startVert) && (ccgSubSurf_getNumEdges(ss) > 0)) {
774
814
                int x;
775
815
 
776
816
                i = 0;
777
 
                while (i < lastedge && vertNum >= ccgdm->edgeMap[i + 1].startVert)
778
 
                        ++i;
 
817
                while (i < lastedge && vertNum >= ccgdm->edgeMap[i + 1].startVert) {
 
818
                        i++;
 
819
                }
779
820
 
780
821
                e = ccgdm->edgeMap[i].edge;
781
822
 
782
823
                x = vertNum - ccgdm->edgeMap[i].startVert + 1;
783
824
                vd = ccgSubSurf_getEdgeData(ss, e, x);
784
 
                copy_v3_v3(mv->co, vd->co);
785
 
                normal_float_to_short_v3(mv->no, vd->no);
 
825
                copy_v3_v3(mv->co, CCG_elem_co(&key, vd));
 
826
                normal_float_to_short_v3(mv->no, CCG_elem_no(&key, vd));
786
827
        }
787
828
        else {
788
829
                /* this vert comes from vert data */
791
832
 
792
833
                v = ccgdm->vertMap[i].vert;
793
834
                vd = ccgSubSurf_getVertData(ss, v);
794
 
                copy_v3_v3(mv->co, vd->co);
795
 
                normal_float_to_short_v3(mv->no, vd->no);
 
835
                copy_v3_v3(mv->co, CCG_elem_co(&key, vd));
 
836
                normal_float_to_short_v3(mv->no, CCG_elem_no(&key, vd));
796
837
        }
797
838
}
798
839
 
869
910
#endif
870
911
 
871
912
                i = 0;
872
 
                while (i < lastface && edgeNum >= ccgdm->faceMap[i + 1].startEdge)
873
 
                        ++i;
 
913
                while (i < lastface && edgeNum >= ccgdm->faceMap[i + 1].startEdge) {
 
914
                        i++;
 
915
                }
874
916
 
875
917
                f = ccgdm->faceMap[i].face;
876
918
                /* numVerts = ccgSubSurf_getFaceNumVerts(f); */ /*UNUSED*/
971
1013
                mf->flag = faceFlags[i].flag;
972
1014
                mf->mat_nr = faceFlags[i].mat_nr;
973
1015
        }
974
 
        else mf->flag = ME_SMOOTH;
 
1016
        else {
 
1017
                mf->flag = ME_SMOOTH;
 
1018
        }
 
1019
 
 
1020
        mf->edcode = 0;
975
1021
}
976
1022
 
977
1023
/* Translate GridHidden into the ME_HIDE flag for MVerts. Assumes
1012
1058
        }
1013
1059
}
1014
1060
 
 
1061
/* Translate GridPaintMask into vertex paint masks. Assumes vertices
 
1062
 * are in the order output by ccgDM_copyFinalVertArray. */
 
1063
void subsurf_copy_grid_paint_mask(DerivedMesh *dm, const MPoly *mpoly,
 
1064
                                  float *paint_mask,
 
1065
                                  const GridPaintMask *grid_paint_mask)
 
1066
{
 
1067
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh *)dm;
 
1068
        CCGSubSurf *ss = ccgdm->ss;
 
1069
        int level = ccgSubSurf_getSubdivisionLevels(ss);
 
1070
        int gridSize = ccgSubSurf_getGridSize(ss);
 
1071
        int edgeSize = ccgSubSurf_getEdgeSize(ss);
 
1072
        int totface = ccgSubSurf_getNumFaces(ss);
 
1073
        int i, j, x, y, factor, gpm_gridsize;
 
1074
        
 
1075
        for (i = 0; i < totface; i++) {
 
1076
                CCGFace *f = ccgdm->faceMap[i].face;
 
1077
                const MPoly *p = &mpoly[i];
 
1078
                
 
1079
                for (j = 0; j < p->totloop; j++) {
 
1080
                        const GridPaintMask *gpm = &grid_paint_mask[p->loopstart + j];
 
1081
                        if (!gpm->data)
 
1082
                                continue;
 
1083
 
 
1084
                        factor = ccg_factor(level, gpm->level);
 
1085
                        gpm_gridsize = ccg_gridsize(gpm->level);
 
1086
                        
 
1087
                        for (y = 0; y < gridSize; y++) {
 
1088
                                for (x = 0; x < gridSize; x++) {
 
1089
                                        int vndx, offset;
 
1090
                                        
 
1091
                                        vndx = getFaceIndex(ss, f, j, x, y, edgeSize, gridSize);
 
1092
                                        offset = y * factor * gpm_gridsize + x * factor;
 
1093
                                        paint_mask[vndx] = gpm->data[offset];
 
1094
                                }
 
1095
                        }
 
1096
                }
 
1097
        }
 
1098
}
 
1099
 
 
1100
/* utility functon */
 
1101
BLI_INLINE void ccgDM_to_MVert(MVert *mv, const CCGKey *key, CCGElem *elem)
 
1102
{
 
1103
        copy_v3_v3(mv->co, CCG_elem_co(key, elem));
 
1104
        normal_float_to_short_v3(mv->no, CCG_elem_no(key, elem));
 
1105
        mv->flag = mv->bweight = 0;
 
1106
}
 
1107
 
1015
1108
static void ccgDM_copyFinalVertArray(DerivedMesh *dm, MVert *mvert)
1016
1109
{
1017
1110
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
1018
1111
        CCGSubSurf *ss = ccgdm->ss;
1019
 
        DMGridData *vd;
 
1112
        CCGElem *vd;
 
1113
        CCGKey key;
1020
1114
        int index;
1021
1115
        int totvert, totedge, totface;
1022
1116
        int gridSize = ccgSubSurf_getGridSize(ss);
1023
1117
        int edgeSize = ccgSubSurf_getEdgeSize(ss);
1024
 
        int i = 0;
 
1118
        unsigned int i = 0;
 
1119
 
 
1120
        CCG_key_top_level(&key, ss);
1025
1121
 
1026
1122
        totface = ccgSubSurf_getNumFaces(ss);
1027
1123
        for (index = 0; index < totface; index++) {
1029
1125
                int x, y, S, numVerts = ccgSubSurf_getFaceNumVerts(f);
1030
1126
 
1031
1127
                vd = ccgSubSurf_getFaceCenterData(f);
1032
 
                copy_v3_v3(mvert[i].co, vd->co);
1033
 
                normal_float_to_short_v3(mvert[i].no, vd->no);
1034
 
                i++;
 
1128
                ccgDM_to_MVert(&mvert[i++], &key, vd);
1035
1129
                
1036
1130
                for (S = 0; S < numVerts; S++) {
1037
 
                        for (x = 1; x < gridSize - 1; x++, i++) {
 
1131
                        for (x = 1; x < gridSize - 1; x++) {
1038
1132
                                vd = ccgSubSurf_getFaceGridEdgeData(ss, f, S, x);
1039
 
                                copy_v3_v3(mvert[i].co, vd->co);
1040
 
                                normal_float_to_short_v3(mvert[i].no, vd->no);
 
1133
                                ccgDM_to_MVert(&mvert[i++], &key, vd);
1041
1134
                        }
1042
1135
                }
1043
1136
 
1044
1137
                for (S = 0; S < numVerts; S++) {
1045
1138
                        for (y = 1; y < gridSize - 1; y++) {
1046
 
                                for (x = 1; x < gridSize - 1; x++, i++) {
 
1139
                                for (x = 1; x < gridSize - 1; x++) {
1047
1140
                                        vd = ccgSubSurf_getFaceGridData(ss, f, S, x, y);
1048
 
                                        copy_v3_v3(mvert[i].co, vd->co);
1049
 
                                        normal_float_to_short_v3(mvert[i].no, vd->no);
 
1141
                                        ccgDM_to_MVert(&mvert[i++], &key, vd);
1050
1142
                                }
1051
1143
                        }
1052
1144
                }
1057
1149
                CCGEdge *e = ccgdm->edgeMap[index].edge;
1058
1150
                int x;
1059
1151
 
1060
 
                for (x = 1; x < edgeSize - 1; x++, i++) {
1061
 
                        vd = ccgSubSurf_getEdgeData(ss, e, x);
1062
 
                        copy_v3_v3(mvert[i].co, vd->co);
 
1152
                for (x = 1; x < edgeSize - 1; x++) {
1063
1153
                        /* This gives errors with -debug-fpe
1064
1154
                         * the normals don't seem to be unit length.
1065
1155
                         * this is most likely caused by edges with no
1066
1156
                         * faces which are now zerod out, see comment in:
1067
1157
                         * ccgSubSurf__calcVertNormals(), - campbell */
1068
 
                        normal_float_to_short_v3(mvert[i].no, vd->no);
 
1158
                        vd = ccgSubSurf_getEdgeData(ss, e, x);
 
1159
                        ccgDM_to_MVert(&mvert[i++], &key, vd);
1069
1160
                }
1070
1161
        }
1071
1162
 
1074
1165
                CCGVert *v = ccgdm->vertMap[index].vert;
1075
1166
 
1076
1167
                vd = ccgSubSurf_getVertData(ss, v);
1077
 
                copy_v3_v3(mvert[i].co, vd->co);
1078
 
                normal_float_to_short_v3(mvert[i].no, vd->no);
1079
 
                i++;
 
1168
                ccgDM_to_MVert(&mvert[i++], &key, vd);
1080
1169
        }
1081
1170
}
1082
1171
 
 
1172
 
 
1173
/* utility functon */
 
1174
BLI_INLINE void ccgDM_to_MEdge(MEdge *med, const int v1, const int v2, const short flag)
 
1175
{
 
1176
        med->v1 = v1;
 
1177
        med->v2 = v2;
 
1178
        med->crease = med->bweight = 0;
 
1179
        med->flag = flag;
 
1180
}
 
1181
 
1083
1182
static void ccgDM_copyFinalEdgeArray(DerivedMesh *dm, MEdge *medge)
1084
1183
{
1085
1184
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
1088
1187
        int totedge, totface;
1089
1188
        int gridSize = ccgSubSurf_getGridSize(ss);
1090
1189
        int edgeSize = ccgSubSurf_getEdgeSize(ss);
1091
 
        int i = 0;
 
1190
        unsigned int i = 0;
1092
1191
        short *edgeFlags = ccgdm->edgeFlags;
 
1192
        const short ed_interior_flag = ccgdm->drawInteriorEdges ? (ME_EDGEDRAW | ME_EDGERENDER) : 0;
1093
1193
 
1094
1194
        totface = ccgSubSurf_getNumFaces(ss);
1095
1195
        for (index = 0; index < totface; index++) {
1098
1198
 
1099
1199
                for (S = 0; S < numVerts; S++) {
1100
1200
                        for (x = 0; x < gridSize - 1; x++) {
1101
 
                                MEdge *med = &medge[i];
1102
 
 
1103
 
                                if (ccgdm->drawInteriorEdges)
1104
 
                                        med->flag = ME_EDGEDRAW | ME_EDGERENDER;
1105
 
                                med->v1 = getFaceIndex(ss, f, S, x, 0, edgeSize, gridSize);
1106
 
                                med->v2 = getFaceIndex(ss, f, S, x + 1, 0, edgeSize, gridSize);
1107
 
                                i++;
 
1201
                                ccgDM_to_MEdge(&medge[i++],
 
1202
                                               getFaceIndex(ss, f, S, x,     0, edgeSize, gridSize),
 
1203
                                               getFaceIndex(ss, f, S, x + 1, 0, edgeSize, gridSize),
 
1204
                                               ed_interior_flag);
1108
1205
                        }
1109
1206
 
1110
1207
                        for (x = 1; x < gridSize - 1; x++) {
1111
1208
                                for (y = 0; y < gridSize - 1; y++) {
1112
 
                                        MEdge *med;
1113
 
 
1114
 
                                        med = &medge[i];
1115
 
                                        if (ccgdm->drawInteriorEdges)
1116
 
                                                med->flag = ME_EDGEDRAW | ME_EDGERENDER;
1117
 
                                        med->v1 = getFaceIndex(ss, f, S, x, y,
1118
 
                                                               edgeSize, gridSize);
1119
 
                                        med->v2 = getFaceIndex(ss, f, S, x, y + 1,
1120
 
                                                               edgeSize, gridSize);
1121
 
                                        i++;
1122
 
 
1123
 
                                        med = &medge[i];
1124
 
                                        if (ccgdm->drawInteriorEdges)
1125
 
                                                med->flag = ME_EDGEDRAW | ME_EDGERENDER;
1126
 
                                        med->v1 = getFaceIndex(ss, f, S, y, x,
1127
 
                                                               edgeSize, gridSize);
1128
 
                                        med->v2 = getFaceIndex(ss, f, S, y + 1, x,
1129
 
                                                               edgeSize, gridSize);
1130
 
                                        i++;
 
1209
                                        ccgDM_to_MEdge(&medge[i++],
 
1210
                                                       getFaceIndex(ss, f, S, x, y,    edgeSize, gridSize),
 
1211
                                                       getFaceIndex(ss, f, S, x, y + 1, edgeSize, gridSize),
 
1212
                                                       ed_interior_flag);
 
1213
                                        ccgDM_to_MEdge(&medge[i++],
 
1214
                                                       getFaceIndex(ss, f, S, y, x,     edgeSize, gridSize),
 
1215
                                                       getFaceIndex(ss, f, S, y + 1, x, edgeSize, gridSize),
 
1216
                                                       ed_interior_flag);
1131
1217
                                }
1132
1218
                        }
1133
1219
                }
1136
1222
        totedge = ccgSubSurf_getNumEdges(ss);
1137
1223
        for (index = 0; index < totedge; index++) {
1138
1224
                CCGEdge *e = ccgdm->edgeMap[index].edge;
1139
 
                unsigned int flags = 0;
 
1225
                short ed_flag = 0;
1140
1226
                int x;
1141
1227
                int edgeIdx = GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(e));
1142
1228
 
1143
 
                if (!ccgSubSurf_getEdgeNumFaces(e)) flags |= ME_LOOSEEDGE;
 
1229
                if (!ccgSubSurf_getEdgeNumFaces(e)) {
 
1230
                        ed_flag |= ME_LOOSEEDGE;
 
1231
                }
1144
1232
 
1145
1233
                if (edgeFlags) {
1146
1234
                        if (edgeIdx != -1) {
1147
 
                                flags |= (edgeFlags[index] & (ME_SEAM | ME_SHARP))
1148
 
                                         | ME_EDGEDRAW | ME_EDGERENDER;
 
1235
                                ed_flag |= ((edgeFlags[index] & (ME_SEAM | ME_SHARP)) | ME_EDGEDRAW | ME_EDGERENDER);
1149
1236
                        }
1150
1237
                }
1151
1238
                else {
1152
 
                        flags |= ME_EDGEDRAW | ME_EDGERENDER;
 
1239
                        ed_flag |= ME_EDGEDRAW | ME_EDGERENDER;
1153
1240
                }
1154
1241
 
1155
1242
                for (x = 0; x < edgeSize - 1; x++) {
1156
 
                        MEdge *med = &medge[i];
1157
 
                        med->v1 = getEdgeIndex(ss, e, x, edgeSize);
1158
 
                        med->v2 = getEdgeIndex(ss, e, x + 1, edgeSize);
1159
 
                        med->flag = flags;
1160
 
                        i++;
 
1243
                        ccgDM_to_MEdge(&medge[i++],
 
1244
                                       getEdgeIndex(ss, e, x, edgeSize),
 
1245
                                       getEdgeIndex(ss, e, x + 1, edgeSize),
 
1246
                                       ed_flag);
1161
1247
                }
1162
1248
        }
1163
1249
}
1195
1281
                                                              edgeSize, gridSize);
1196
1282
                                        mf->mat_nr = mat_nr;
1197
1283
                                        mf->flag = flag;
 
1284
                                        mf->edcode = 0;
1198
1285
 
1199
1286
                                        i++;
1200
1287
                                }
1231
1318
        for (index = 0; index < totface; index++) {
1232
1319
                CCGFace *f = ccgdm->faceMap[index].face;
1233
1320
                int x, y, S, numVerts = ccgSubSurf_getFaceNumVerts(f);
1234
 
                /* int flag = (faceFlags)? faceFlags[index*2]: ME_SMOOTH; */ /* UNUSED */
1235
 
                /* int mat_nr = (faceFlags)? faceFlags[index*2+1]: 0; */ /* UNUSED */
 
1321
                /* int flag = (faceFlags) ? faceFlags[index * 2]: ME_SMOOTH; */ /* UNUSED */
 
1322
                /* int mat_nr = (faceFlags) ? faceFlags[index * 2 + 1]: 0; */ /* UNUSED */
1236
1323
 
1237
1324
                for (S = 0; S < numVerts; S++) {
1238
1325
                        for (y = 0; y < gridSize - 1; y++) {
1323
1410
        
1324
1411
        totvert = ccgSubSurf_getNumVerts(ss);
1325
1412
        vertMap2 = MEM_mallocN(totvert * sizeof(*vertMap2), "vertmap");
1326
 
        vi = ccgSubSurf_getVertIterator(ss);
1327
 
        for (; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
 
1413
        for (vi = ccgSubSurf_getVertIterator(ss); !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
1328
1414
                CCGVert *v = ccgVertIterator_getCurrent(vi);
1329
1415
 
1330
1416
                vertMap2[GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v))] = v;
1333
1419
 
1334
1420
        totedge = ccgSubSurf_getNumEdges(ss);
1335
1421
        edgeMap2 = MEM_mallocN(totedge * sizeof(*edgeMap2), "edgemap");
1336
 
        ei = ccgSubSurf_getEdgeIterator(ss);
1337
 
        for (i = 0; !ccgEdgeIterator_isStopped(ei); i++, ccgEdgeIterator_next(ei)) {
 
1422
        for (ei = ccgSubSurf_getEdgeIterator(ss), i = 0; !ccgEdgeIterator_isStopped(ei); i++, ccgEdgeIterator_next(ei)) {
1338
1423
                CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
1339
1424
 
1340
1425
                edgeMap2[GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(e))] = e;
1342
1427
 
1343
1428
        totface = ccgSubSurf_getNumFaces(ss);
1344
1429
        faceMap2 = MEM_mallocN(totface * sizeof(*faceMap2), "facemap");
1345
 
        fi = ccgSubSurf_getFaceIterator(ss);
1346
 
        for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
 
1430
        for (fi = ccgSubSurf_getFaceIterator(ss); !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
1347
1431
                CCGFace *f = ccgFaceIterator_getCurrent(fi);
1348
1432
 
1349
1433
                faceMap2[GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f))] = f;
1392
1476
}
1393
1477
 
1394
1478
static void ccgDM_foreachMappedVert(
1395
 
    DerivedMesh *dm,
1396
 
    void (*func)(void *userData, int index, const float co[3], const float no_f[3], const short no_s[3]),
1397
 
    void *userData)
 
1479
        DerivedMesh *dm,
 
1480
        void (*func)(void *userData, int index, const float co[3], const float no_f[3], const short no_s[3]),
 
1481
        void *userData)
1398
1482
{
1399
1483
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
1400
 
        CCGVertIterator *vi = ccgSubSurf_getVertIterator(ccgdm->ss);
 
1484
        CCGVertIterator *vi;
 
1485
        CCGKey key;
 
1486
        CCG_key_top_level(&key, ccgdm->ss);
1401
1487
 
1402
 
        for (; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
 
1488
        for (vi = ccgSubSurf_getVertIterator(ccgdm->ss); !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
1403
1489
                CCGVert *v = ccgVertIterator_getCurrent(vi);
1404
 
                DMGridData *vd = ccgSubSurf_getVertData(ccgdm->ss, v);
 
1490
                CCGElem *vd = ccgSubSurf_getVertData(ccgdm->ss, v);
1405
1491
                int index = ccgDM_getVertMapIndex(ccgdm->ss, v);
1406
1492
 
1407
1493
                if (index != -1)
1408
 
                        func(userData, index, vd->co, vd->no, NULL);
 
1494
                        func(userData, index, CCG_elem_co(&key, vd), CCG_elem_no(&key, vd), NULL);
1409
1495
        }
1410
1496
 
1411
1497
        ccgVertIterator_free(vi);
1412
1498
}
1413
1499
 
1414
1500
static void ccgDM_foreachMappedEdge(
1415
 
    DerivedMesh *dm,
1416
 
    void (*func)(void *userData, int index, const float v0co[3], const float v1co[3]),
1417
 
    void *userData)
 
1501
        DerivedMesh *dm,
 
1502
        void (*func)(void *userData, int index, const float v0co[3], const float v1co[3]),
 
1503
        void *userData)
1418
1504
{
1419
1505
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
1420
1506
        CCGSubSurf *ss = ccgdm->ss;
1421
 
        CCGEdgeIterator *ei = ccgSubSurf_getEdgeIterator(ss);
 
1507
        CCGEdgeIterator *ei;
 
1508
        CCGKey key;
1422
1509
        int i, edgeSize = ccgSubSurf_getEdgeSize(ss);
1423
1510
 
1424
 
        for (; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
 
1511
        CCG_key_top_level(&key, ss);
 
1512
 
 
1513
        for (ei = ccgSubSurf_getEdgeIterator(ss); !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
1425
1514
                CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
1426
 
                DMGridData *edgeData = ccgSubSurf_getEdgeDataArray(ss, e);
 
1515
                CCGElem *edgeData = ccgSubSurf_getEdgeDataArray(ss, e);
1427
1516
                int index = ccgDM_getEdgeMapIndex(ss, e);
1428
1517
 
1429
1518
                if (index != -1) {
1430
1519
                        for (i = 0; i < edgeSize - 1; i++)
1431
 
                                func(userData, index, edgeData[i].co, edgeData[i + 1].co);
 
1520
                                func(userData, index, CCG_elem_offset_co(&key, edgeData, i), CCG_elem_offset_co(&key, edgeData, i + 1));
1432
1521
                }
1433
1522
        }
1434
1523
 
1446
1535
        CCGFaceIterator *fi;
1447
1536
 
1448
1537
        glBegin(GL_POINTS);
1449
 
        vi = ccgSubSurf_getVertIterator(ss);
1450
 
        for (; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
 
1538
        for (vi = ccgSubSurf_getVertIterator(ss); !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
1451
1539
                CCGVert *v = ccgVertIterator_getCurrent(vi);
1452
1540
                glVertex3fv(ccgSubSurf_getVertData(ss, v));
1453
1541
        }
1454
1542
        ccgVertIterator_free(vi);
1455
1543
 
1456
 
        ei = ccgSubSurf_getEdgeIterator(ss);
1457
 
        for (; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
 
1544
        for (ei = ccgSubSurf_getEdgeIterator(ss); !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
1458
1545
                CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
1459
1546
                int x;
1460
1547
 
1463
1550
        }
1464
1551
        ccgEdgeIterator_free(ei);
1465
1552
 
1466
 
        fi = ccgSubSurf_getFaceIterator(ss);
1467
 
        for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
 
1553
        for (fi = ccgSubSurf_getFaceIterator(ss); !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
1468
1554
                CCGFace *f = ccgFaceIterator_getCurrent(fi);
1469
1555
                int x, y, S, numVerts = ccgSubSurf_getFaceNumVerts(f);
1470
1556
 
1487
1573
                CCGFace **faces;
1488
1574
                int totface;
1489
1575
 
1490
 
                BLI_pbvh_get_grid_updates(ccgdm->pbvh, 1, (void ***)&faces, &totface);
 
1576
                BKE_pbvh_get_grid_updates(ccgdm->pbvh, 1, (void ***)&faces, &totface);
1491
1577
                if (totface) {
1492
1578
                        ccgSubSurf_updateFromFaces(ccgdm->ss, 0, faces, totface);
1493
1579
                        ccgSubSurf_updateNormals(ccgdm->ss, faces, totface);
1500
1586
{
1501
1587
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
1502
1588
        CCGSubSurf *ss = ccgdm->ss;
 
1589
        CCGKey key;
1503
1590
        int i, j, edgeSize = ccgSubSurf_getEdgeSize(ss);
1504
1591
        int totedge = ccgSubSurf_getNumEdges(ss);
1505
1592
        int gridSize = ccgSubSurf_getGridSize(ss);
1506
1593
        int useAging;
1507
1594
 
 
1595
        CCG_key_top_level(&key, ss);
1508
1596
        ccgdm_pbvh_update(ccgdm);
1509
1597
 
1510
1598
        ccgSubSurf_getUseAgeCounts(ss, &useAging, NULL, NULL, NULL);
1511
1599
 
1512
1600
        for (j = 0; j < totedge; j++) {
1513
1601
                CCGEdge *e = ccgdm->edgeMap[j].edge;
1514
 
                DMGridData *edgeData = ccgSubSurf_getEdgeDataArray(ss, e);
 
1602
                CCGElem *edgeData = ccgSubSurf_getEdgeDataArray(ss, e);
1515
1603
 
1516
1604
                if (!drawLooseEdges && !ccgSubSurf_getEdgeNumFaces(e))
1517
1605
                        continue;
1526
1614
 
1527
1615
                glBegin(GL_LINE_STRIP);
1528
1616
                for (i = 0; i < edgeSize - 1; i++) {
1529
 
                        glVertex3fv(edgeData[i].co);
1530
 
                        glVertex3fv(edgeData[i + 1].co);
 
1617
                        glVertex3fv(CCG_elem_offset_co(&key, edgeData, i));
 
1618
                        glVertex3fv(CCG_elem_offset_co(&key, edgeData, i + 1));
1531
1619
                }
1532
1620
                glEnd();
1533
1621
        }
1544
1632
                        int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(f);
1545
1633
 
1546
1634
                        for (S = 0; S < numVerts; S++) {
1547
 
                                DMGridData *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
 
1635
                                CCGElem *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
1548
1636
 
1549
1637
                                glBegin(GL_LINE_STRIP);
1550
1638
                                for (x = 0; x < gridSize; x++)
1551
 
                                        glVertex3fv(faceGridData[x].co);
 
1639
                                        glVertex3fv(CCG_elem_offset_co(&key, faceGridData, x));
1552
1640
                                glEnd();
1553
1641
                                for (y = 1; y < gridSize - 1; y++) {
1554
1642
                                        glBegin(GL_LINE_STRIP);
1555
1643
                                        for (x = 0; x < gridSize; x++)
1556
 
                                                glVertex3fv(faceGridData[y * gridSize + x].co);
 
1644
                                                glVertex3fv(CCG_grid_elem_co(&key, faceGridData, x, y));
1557
1645
                                        glEnd();
1558
1646
                                }
1559
1647
                                for (x = 1; x < gridSize - 1; x++) {
1560
1648
                                        glBegin(GL_LINE_STRIP);
1561
1649
                                        for (y = 0; y < gridSize; y++)
1562
 
                                                glVertex3fv(faceGridData[y * gridSize + x].co);
 
1650
                                                glVertex3fv(CCG_grid_elem_co(&key, faceGridData, x, y));
1563
1651
                                        glEnd();
1564
1652
                                }
1565
1653
                        }
1571
1659
{
1572
1660
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
1573
1661
        CCGSubSurf *ss = ccgdm->ss;
 
1662
        CCGKey key;
1574
1663
        int totedge = ccgSubSurf_getNumEdges(ss);
1575
1664
        int i, j, edgeSize = ccgSubSurf_getEdgeSize(ss);
1576
1665
 
 
1666
        CCG_key_top_level(&key, ss);
 
1667
 
1577
1668
        for (j = 0; j < totedge; j++) {
1578
1669
                CCGEdge *e = ccgdm->edgeMap[j].edge;
1579
 
                DMGridData *edgeData = ccgSubSurf_getEdgeDataArray(ss, e);
 
1670
                CCGElem *edgeData = ccgSubSurf_getEdgeDataArray(ss, e);
1580
1671
 
1581
1672
                if (!ccgSubSurf_getEdgeNumFaces(e)) {
1582
1673
                        glBegin(GL_LINE_STRIP);
1583
1674
                        for (i = 0; i < edgeSize - 1; i++) {
1584
 
                                glVertex3fv(edgeData[i].co);
1585
 
                                glVertex3fv(edgeData[i + 1].co);
 
1675
                                glVertex3fv(CCG_elem_offset_co(&key, edgeData, i));
 
1676
                                glVertex3fv(CCG_elem_offset_co(&key, edgeData, i + 1));
1586
1677
                        }
1587
1678
                        glEnd();
1588
1679
                }
1608
1699
{
1609
1700
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
1610
1701
        CCGSubSurf *ss = ccgdm->ss;
 
1702
        CCGKey key;
1611
1703
        int gridSize = ccgSubSurf_getGridSize(ss);
1612
1704
        DMFlagMat *faceFlags = ccgdm->faceFlags;
1613
1705
        int step = (fast) ? gridSize - 1 : 1;
1614
1706
        int i, totface = ccgSubSurf_getNumFaces(ss);
1615
1707
        int drawcurrent = 0, matnr = -1, shademodel = -1;
1616
1708
 
 
1709
        CCG_key_top_level(&key, ss);
1617
1710
        ccgdm_pbvh_update(ccgdm);
1618
1711
 
1619
1712
        if (ccgdm->pbvh && ccgdm->multires.mmd && !fast) {
1620
1713
                if (dm->numTessFaceData) {
1621
 
                        BLI_pbvh_draw(ccgdm->pbvh, partial_redraw_planes, NULL, setMaterial);
 
1714
                        BKE_pbvh_draw(ccgdm->pbvh, partial_redraw_planes, NULL,
 
1715
                                      setMaterial, FALSE);
1622
1716
                        glShadeModel(GL_FLAT);
1623
1717
                }
1624
1718
 
1653
1747
                        continue;
1654
1748
 
1655
1749
                for (S = 0; S < numVerts; S++) {
1656
 
                        DMGridData *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
 
1750
                        CCGElem *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
1657
1751
 
1658
1752
                        if (shademodel == GL_SMOOTH) {
1659
1753
                                for (y = 0; y < gridSize - 1; y += step) {
1660
1754
                                        glBegin(GL_QUAD_STRIP);
1661
1755
                                        for (x = 0; x < gridSize; x += step) {
1662
 
                                                DMGridData *a = &faceGridData[(y + 0) * gridSize + x];
1663
 
                                                DMGridData *b = &faceGridData[(y + step) * gridSize + x];
 
1756
                                                CCGElem *a = CCG_grid_elem(&key, faceGridData, x, y + 0);
 
1757
                                                CCGElem *b = CCG_grid_elem(&key, faceGridData, x, y + step);
1664
1758
 
1665
 
                                                glNormal3fv(a->no);
1666
 
                                                glVertex3fv(a->co);
1667
 
                                                glNormal3fv(b->no);
1668
 
                                                glVertex3fv(b->co);
 
1759
                                                glNormal3fv(CCG_elem_no(&key, a));
 
1760
                                                glVertex3fv(CCG_elem_co(&key, a));
 
1761
                                                glNormal3fv(CCG_elem_no(&key, b));
 
1762
                                                glVertex3fv(CCG_elem_co(&key, b));
1669
1763
                                        }
1670
1764
                                        glEnd();
1671
1765
                                }
1674
1768
                                glBegin(GL_QUADS);
1675
1769
                                for (y = 0; y < gridSize - 1; y += step) {
1676
1770
                                        for (x = 0; x < gridSize - 1; x += step) {
1677
 
                                                float *a = faceGridData[(y + 0) * gridSize + x].co;
1678
 
                                                float *b = faceGridData[(y + 0) * gridSize + x + step].co;
1679
 
                                                float *c = faceGridData[(y + step) * gridSize + x + step].co;
1680
 
                                                float *d = faceGridData[(y + step) * gridSize + x].co;
 
1771
                                                float *a = CCG_grid_elem_co(&key, faceGridData, x, y + 0);
 
1772
                                                float *b = CCG_grid_elem_co(&key, faceGridData, x + step, y + 0);
 
1773
                                                float *c = CCG_grid_elem_co(&key, faceGridData, x + step, y + step);
 
1774
                                                float *d = CCG_grid_elem_co(&key, faceGridData, x, y + step);
1681
1775
 
1682
1776
                                                ccgDM_glNormalFast(a, b, c, d);
1683
1777
 
1701
1795
{
1702
1796
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
1703
1797
        CCGSubSurf *ss = ccgdm->ss;
 
1798
        CCGKey key;
1704
1799
        GPUVertexAttribs gattribs;
1705
1800
        DMVertexAttribs attribs = {{{NULL}}};
1706
1801
        /* MTFace *tf = dm->getTessFaceDataArray(dm, CD_MTFACE); */ /* UNUSED */
1708
1803
        int gridFaces = gridSize - 1;
1709
1804
        int edgeSize = ccgSubSurf_getEdgeSize(ss);
1710
1805
        DMFlagMat *faceFlags = ccgdm->faceFlags;
1711
 
        int a, b, i, doDraw, numVerts, matnr, new_matnr, totface;
 
1806
        int a, b, i, do_draw, numVerts, matnr, new_matnr, totface;
1712
1807
 
 
1808
        CCG_key_top_level(&key, ss);
1713
1809
        ccgdm_pbvh_update(ccgdm);
1714
1810
 
1715
 
        doDraw = 0;
 
1811
        do_draw = 0;
1716
1812
        matnr = -1;
1717
1813
 
1718
 
#define PASSATTRIB(dx, dy, vert) {                                              \
1719
 
        if (attribs.totorco) {                                                      \
1720
 
                index = getFaceIndex(ss, f, S, x + dx, y + dy, edgeSize, gridSize);     \
1721
 
                glVertexAttrib3fvARB(attribs.orco.glIndex, attribs.orco.array[index]);  \
1722
 
        }                                                                           \
1723
 
        for (b = 0; b < attribs.tottface; b++) {                                    \
1724
 
                MTFace *tf = &attribs.tface[b].array[a];                                \
1725
 
                glVertexAttrib2fvARB(attribs.tface[b].glIndex, tf->uv[vert]);           \
1726
 
        }                                                                           \
1727
 
        for (b = 0; b < attribs.totmcol; b++) {                                     \
1728
 
                MCol *cp = &attribs.mcol[b].array[a * 4 + vert];                        \
1729
 
                GLubyte col[4];                                                         \
1730
 
                col[0] = cp->b; col[1] = cp->g; col[2] = cp->r; col[3] = cp->a;         \
1731
 
                glVertexAttrib4ubvARB(attribs.mcol[b].glIndex, col);                    \
1732
 
        }                                                                           \
1733
 
        if (attribs.tottang) {                                                      \
1734
 
                float *tang = attribs.tang.array[a * 4 + vert];                         \
1735
 
                glVertexAttrib4fvARB(attribs.tang.glIndex, tang);                       \
1736
 
        }                                                                           \
1737
 
}
 
1814
#define PASSATTRIB(dx, dy, vert) {                                            \
 
1815
        if (attribs.totorco) {                                                    \
 
1816
                index = getFaceIndex(ss, f, S, x + dx, y + dy, edgeSize, gridSize);   \
 
1817
                glVertexAttrib3fvARB(attribs.orco.gl_index,                           \
 
1818
                                     attribs.orco.array[index]);                      \
 
1819
        }                                                                         \
 
1820
        for (b = 0; b < attribs.tottface; b++) {                                  \
 
1821
                MTFace *tf = &attribs.tface[b].array[a];                              \
 
1822
                glVertexAttrib2fvARB(attribs.tface[b].gl_index, tf->uv[vert]);        \
 
1823
        }                                                                         \
 
1824
        for (b = 0; b < attribs.totmcol; b++) {                                   \
 
1825
                MCol *cp = &attribs.mcol[b].array[a * 4 + vert];                      \
 
1826
                GLubyte col[4];                                                       \
 
1827
                col[0] = cp->b; col[1] = cp->g; col[2] = cp->r; col[3] = cp->a;       \
 
1828
                glVertexAttrib4ubvARB(attribs.mcol[b].gl_index, col);                 \
 
1829
        }                                                                         \
 
1830
        if (attribs.tottang) {                                                    \
 
1831
                float *tang = attribs.tang.array[a * 4 + vert];                       \
 
1832
                glVertexAttrib4fvARB(attribs.tang.gl_index, tang);                    \
 
1833
        }                                                                         \
 
1834
} (void)0
1738
1835
 
1739
1836
        totface = ccgSubSurf_getNumFaces(ss);
1740
1837
        for (a = 0, i = 0; i < totface; i++) {
1755
1852
                }
1756
1853
 
1757
1854
                if (new_matnr != matnr) {
1758
 
                        doDraw = setMaterial(matnr = new_matnr, &gattribs);
1759
 
                        if (doDraw)
 
1855
                        do_draw = setMaterial(matnr = new_matnr, &gattribs);
 
1856
                        if (do_draw)
1760
1857
                                DM_vertex_attributes_from_gpu(dm, &gattribs, &attribs);
1761
1858
                }
1762
1859
 
1763
 
                if (!doDraw || (setDrawOptions && (origIndex != ORIGINDEX_NONE) &&
 
1860
                if (!do_draw || (setDrawOptions && (origIndex != ORIGINDEX_NONE) &&
1764
1861
                                (setDrawOptions(userData, origIndex) == DM_DRAW_OPTION_SKIP)))
1765
1862
                {
1766
1863
                        a += gridFaces * gridFaces * numVerts;
1769
1866
 
1770
1867
                glShadeModel(drawSmooth ? GL_SMOOTH : GL_FLAT);
1771
1868
                for (S = 0; S < numVerts; S++) {
1772
 
                        DMGridData *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
1773
 
                        DMGridData *vda, *vdb;
 
1869
                        CCGElem *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
 
1870
                        CCGElem *vda, *vdb;
1774
1871
 
1775
1872
                        if (drawSmooth) {
1776
1873
                                for (y = 0; y < gridFaces; y++) {
1777
1874
                                        glBegin(GL_QUAD_STRIP);
1778
1875
                                        for (x = 0; x < gridFaces; x++) {
1779
 
                                                vda = &faceGridData[(y + 0) * gridSize + x];
1780
 
                                                vdb = &faceGridData[(y + 1) * gridSize + x];
 
1876
                                                vda = CCG_grid_elem(&key, faceGridData, x, y + 0);
 
1877
                                                vdb = CCG_grid_elem(&key, faceGridData, x, y + 1);
1781
1878
                                                
1782
1879
                                                PASSATTRIB(0, 0, 0);
1783
 
                                                glNormal3fv(vda->no);
1784
 
                                                glVertex3fv(vda->co);
 
1880
                                                glNormal3fv(CCG_elem_no(&key, vda));
 
1881
                                                glVertex3fv(CCG_elem_co(&key, vda));
1785
1882
 
1786
1883
                                                PASSATTRIB(0, 1, 1);
1787
 
                                                glNormal3fv(vdb->no);
1788
 
                                                glVertex3fv(vdb->co);
 
1884
                                                glNormal3fv(CCG_elem_no(&key, vdb));
 
1885
                                                glVertex3fv(CCG_elem_co(&key, vdb));
1789
1886
 
1790
1887
                                                if (x != gridFaces - 1)
1791
1888
                                                        a++;
1792
1889
                                        }
1793
1890
 
1794
 
                                        vda = &faceGridData[(y + 0) * gridSize + x];
1795
 
                                        vdb = &faceGridData[(y + 1) * gridSize + x];
 
1891
                                        vda = CCG_grid_elem(&key, faceGridData, x, y + 0);
 
1892
                                        vdb = CCG_grid_elem(&key, faceGridData, x, y + 1);
1796
1893
 
1797
1894
                                        PASSATTRIB(0, 0, 3);
1798
 
                                        glNormal3fv(vda->no);
1799
 
                                        glVertex3fv(vda->co);
 
1895
                                        glNormal3fv(CCG_elem_no(&key, vda));
 
1896
                                        glVertex3fv(CCG_elem_co(&key, vda));
1800
1897
 
1801
1898
                                        PASSATTRIB(0, 1, 2);
1802
 
                                        glNormal3fv(vdb->no);
1803
 
                                        glVertex3fv(vdb->co);
 
1899
                                        glNormal3fv(CCG_elem_no(&key, vdb));
 
1900
                                        glVertex3fv(CCG_elem_co(&key, vdb));
1804
1901
 
1805
1902
                                        glEnd();
1806
1903
 
1811
1908
                                glBegin(GL_QUADS);
1812
1909
                                for (y = 0; y < gridFaces; y++) {
1813
1910
                                        for (x = 0; x < gridFaces; x++) {
1814
 
                                                float *aco = faceGridData[(y + 0) * gridSize + x].co;
1815
 
                                                float *bco = faceGridData[(y + 0) * gridSize + x + 1].co;
1816
 
                                                float *cco = faceGridData[(y + 1) * gridSize + x + 1].co;
1817
 
                                                float *dco = faceGridData[(y + 1) * gridSize + x].co;
 
1911
                                                float *aco = CCG_grid_elem_co(&key, faceGridData, x, y);
 
1912
                                                float *bco = CCG_grid_elem_co(&key, faceGridData, x + 1, y);
 
1913
                                                float *cco = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 1);
 
1914
                                                float *dco = CCG_grid_elem_co(&key, faceGridData, x, y + 1);
1818
1915
 
1819
1916
                                                ccgDM_glNormalFast(aco, bco, cco, dco);
1820
1917
 
1844
1941
}
1845
1942
 
1846
1943
/* Only used by non-editmesh types */
1847
 
static void ccgDM_drawMappedFacesMat(DerivedMesh *dm, void (*setMaterial)(void *userData, int, void *attribs), int (*setFace)(void *userData, int index), void *userData)
 
1944
static void ccgDM_drawMappedFacesMat(DerivedMesh *dm,
 
1945
                                     void (*setMaterial)(void *userData, int, void *attribs),
 
1946
                                     int (*setFace)(void *userData, int index), void *userData)
1848
1947
{
1849
1948
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
1850
1949
        CCGSubSurf *ss = ccgdm->ss;
 
1950
        CCGKey key;
1851
1951
        GPUVertexAttribs gattribs;
1852
1952
        DMVertexAttribs attribs = {{{NULL}}};
1853
1953
        int gridSize = ccgSubSurf_getGridSize(ss);
1856
1956
        DMFlagMat *faceFlags = ccgdm->faceFlags;
1857
1957
        int a, b, i, numVerts, matnr, new_matnr, totface;
1858
1958
 
 
1959
        CCG_key_top_level(&key, ss);
1859
1960
        ccgdm_pbvh_update(ccgdm);
1860
1961
 
1861
1962
        matnr = -1;
1862
1963
 
1863
 
#define PASSATTRIB(dx, dy, vert) {                                              \
1864
 
        if (attribs.totorco) {                                                      \
1865
 
                index = getFaceIndex(ss, f, S, x + dx, y + dy, edgeSize, gridSize);     \
1866
 
                if (attribs.orco.glTexco)                                               \
1867
 
                        glTexCoord3fv(attribs.orco.array[index]);                           \
1868
 
                else                                                                    \
1869
 
                        glVertexAttrib3fvARB(attribs.orco.glIndex, attribs.orco.array[index]);  \
1870
 
        }                                                                           \
1871
 
        for (b = 0; b < attribs.tottface; b++) {                                    \
1872
 
                MTFace *tf = &attribs.tface[b].array[a];                                \
1873
 
                if (attribs.tface[b].glTexco)                                           \
1874
 
                        glTexCoord2fv(tf->uv[vert]);                                        \
1875
 
                else                                                                    \
1876
 
                        glVertexAttrib2fvARB(attribs.tface[b].glIndex, tf->uv[vert]);       \
1877
 
        }                                                                           \
1878
 
        for (b = 0; b < attribs.totmcol; b++) {                                     \
1879
 
                MCol *cp = &attribs.mcol[b].array[a * 4 + vert];                        \
1880
 
                GLubyte col[4];                                                         \
1881
 
                col[0] = cp->b; col[1] = cp->g; col[2] = cp->r; col[3] = cp->a;         \
1882
 
                glVertexAttrib4ubvARB(attribs.mcol[b].glIndex, col);                    \
1883
 
        }                                                                           \
1884
 
        if (attribs.tottang) {                                                      \
1885
 
                float *tang = attribs.tang.array[a * 4 + vert];                         \
1886
 
                glVertexAttrib4fvARB(attribs.tang.glIndex, tang);                       \
1887
 
        }                                                                           \
1888
 
}
 
1964
#define PASSATTRIB(dx, dy, vert) {                                            \
 
1965
        if (attribs.totorco) {                                                    \
 
1966
                index = getFaceIndex(ss, f, S, x + dx, y + dy, edgeSize, gridSize);   \
 
1967
                if (attribs.orco.gl_texco)                                            \
 
1968
                        glTexCoord3fv(attribs.orco.array[index]);                         \
 
1969
                else                                                                  \
 
1970
                        glVertexAttrib3fvARB(attribs.orco.gl_index,                       \
 
1971
                                             attribs.orco.array[index]);                  \
 
1972
        }                                                                         \
 
1973
        for (b = 0; b < attribs.tottface; b++) {                                  \
 
1974
                MTFace *tf = &attribs.tface[b].array[a];                              \
 
1975
                if (attribs.tface[b].gl_texco)                                        \
 
1976
                        glTexCoord2fv(tf->uv[vert]);                                      \
 
1977
                else                                                                  \
 
1978
                        glVertexAttrib2fvARB(attribs.tface[b].gl_index, tf->uv[vert]);    \
 
1979
        }                                                                         \
 
1980
        for (b = 0; b < attribs.totmcol; b++) {                                   \
 
1981
                MCol *cp = &attribs.mcol[b].array[a * 4 + vert];                      \
 
1982
                GLubyte col[4];                                                       \
 
1983
                col[0] = cp->b; col[1] = cp->g; col[2] = cp->r; col[3] = cp->a;       \
 
1984
                glVertexAttrib4ubvARB(attribs.mcol[b].gl_index, col);                 \
 
1985
        }                                                                         \
 
1986
        if (attribs.tottang) {                                                    \
 
1987
                float *tang = attribs.tang.array[a * 4 + vert];                       \
 
1988
                glVertexAttrib4fvARB(attribs.tang.gl_index, tang);                    \
 
1989
        }                                                                         \
 
1990
} (void)0
1889
1991
 
1890
1992
        totface = ccgSubSurf_getNumFaces(ss);
1891
1993
        for (a = 0, i = 0; i < totface; i++) {
1921
2023
                /* draw face*/
1922
2024
                glShadeModel(drawSmooth ? GL_SMOOTH : GL_FLAT);
1923
2025
                for (S = 0; S < numVerts; S++) {
1924
 
                        DMGridData *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
1925
 
                        DMGridData *vda, *vdb;
 
2026
                        CCGElem *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
 
2027
                        CCGElem *vda, *vdb;
1926
2028
 
1927
2029
                        if (drawSmooth) {
1928
2030
                                for (y = 0; y < gridFaces; y++) {
1929
2031
                                        glBegin(GL_QUAD_STRIP);
1930
2032
                                        for (x = 0; x < gridFaces; x++) {
1931
 
                                                vda = &faceGridData[(y + 0) * gridSize + x];
1932
 
                                                vdb = &faceGridData[(y + 1) * gridSize + x];
 
2033
                                                vda = CCG_grid_elem(&key, faceGridData, x, y);
 
2034
                                                vdb = CCG_grid_elem(&key, faceGridData, x, y + 1);
1933
2035
                                                
1934
2036
                                                PASSATTRIB(0, 0, 0);
1935
 
                                                glNormal3fv(vda->no);
1936
 
                                                glVertex3fv(vda->co);
 
2037
                                                glNormal3fv(CCG_elem_no(&key, vda));
 
2038
                                                glVertex3fv(CCG_elem_co(&key, vda));
1937
2039
 
1938
2040
                                                PASSATTRIB(0, 1, 1);
1939
 
                                                glNormal3fv(vdb->no);
1940
 
                                                glVertex3fv(vdb->co);
 
2041
                                                glNormal3fv(CCG_elem_no(&key, vdb));
 
2042
                                                glVertex3fv(CCG_elem_co(&key, vdb));
1941
2043
 
1942
2044
                                                if (x != gridFaces - 1)
1943
2045
                                                        a++;
1944
2046
                                        }
1945
2047
 
1946
 
                                        vda = &faceGridData[(y + 0) * gridSize + x];
1947
 
                                        vdb = &faceGridData[(y + 1) * gridSize + x];
 
2048
                                        vda = CCG_grid_elem(&key, faceGridData, x, y + 0);
 
2049
                                        vdb = CCG_grid_elem(&key, faceGridData, x, y + 1);
1948
2050
 
1949
2051
                                        PASSATTRIB(0, 0, 3);
1950
 
                                        glNormal3fv(vda->no);
1951
 
                                        glVertex3fv(vda->co);
 
2052
                                        glNormal3fv(CCG_elem_no(&key, vda));
 
2053
                                        glVertex3fv(CCG_elem_co(&key, vda));
1952
2054
 
1953
2055
                                        PASSATTRIB(0, 1, 2);
1954
 
                                        glNormal3fv(vdb->no);
1955
 
                                        glVertex3fv(vdb->co);
 
2056
                                        glNormal3fv(CCG_elem_no(&key, vdb));
 
2057
                                        glVertex3fv(CCG_elem_co(&key, vdb));
1956
2058
 
1957
2059
                                        glEnd();
1958
2060
 
1963
2065
                                glBegin(GL_QUADS);
1964
2066
                                for (y = 0; y < gridFaces; y++) {
1965
2067
                                        for (x = 0; x < gridFaces; x++) {
1966
 
                                                float *aco = faceGridData[(y + 0) * gridSize + x].co;
1967
 
                                                float *bco = faceGridData[(y + 0) * gridSize + x + 1].co;
1968
 
                                                float *cco = faceGridData[(y + 1) * gridSize + x + 1].co;
1969
 
                                                float *dco = faceGridData[(y + 1) * gridSize + x].co;
 
2068
                                                float *aco = CCG_grid_elem_co(&key, faceGridData, x, y + 0);
 
2069
                                                float *bco = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 0);
 
2070
                                                float *cco = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 1);
 
2071
                                                float *dco = CCG_grid_elem_co(&key, faceGridData, x, y + 1);
1970
2072
 
1971
2073
                                                ccgDM_glNormalFast(aco, bco, cco, dco);
1972
2074
 
1998
2100
{
1999
2101
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
2000
2102
        CCGSubSurf *ss = ccgdm->ss;
 
2103
        CCGKey key;
2001
2104
        MCol *mcol = dm->getTessFaceDataArray(dm, CD_PREVIEW_MCOL);
2002
2105
        MTFace *tf = DM_get_tessface_data_layer(dm, CD_MTFACE);
2003
2106
        DMFlagMat *faceFlags = ccgdm->faceFlags;
2007
2110
 
2008
2111
        (void) compareDrawOptions;
2009
2112
 
 
2113
        CCG_key_top_level(&key, ss);
2010
2114
        ccgdm_pbvh_update(ccgdm);
2011
2115
 
2012
2116
        if (!mcol)
2055
2159
                }
2056
2160
 
2057
2161
                for (S = 0; S < numVerts; S++) {
2058
 
                        DMGridData *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
2059
 
                        DMGridData *a, *b;
 
2162
                        CCGElem *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
 
2163
                        CCGElem *a, *b;
2060
2164
 
2061
2165
                        if (drawSmooth) {
2062
2166
                                glShadeModel(GL_SMOOTH);
2063
2167
                                for (y = 0; y < gridFaces; y++) {
2064
2168
                                        glBegin(GL_QUAD_STRIP);
2065
2169
                                        for (x = 0; x < gridFaces; x++) {
2066
 
                                                a = &faceGridData[(y + 0) * gridSize + x];
2067
 
                                                b = &faceGridData[(y + 1) * gridSize + x];
 
2170
                                                a = CCG_grid_elem(&key, faceGridData, x, y + 0);
 
2171
                                                b = CCG_grid_elem(&key, faceGridData, x, y + 1);
2068
2172
 
2069
2173
                                                if (tf) glTexCoord2fv(tf->uv[0]);
2070
2174
                                                if (cp) glColor3ub(cp[3], cp[2], cp[1]);
2071
 
                                                glNormal3fv(a->no);
2072
 
                                                glVertex3fv(a->co);
 
2175
                                                glNormal3fv(CCG_elem_no(&key, a));
 
2176
                                                glVertex3fv(CCG_elem_co(&key, a));
2073
2177
 
2074
2178
                                                if (tf) glTexCoord2fv(tf->uv[1]);
2075
2179
                                                if (cp) glColor3ub(cp[7], cp[6], cp[5]);
2076
 
                                                glNormal3fv(b->no);
2077
 
                                                glVertex3fv(b->co);
 
2180
                                                glNormal3fv(CCG_elem_no(&key, b));
 
2181
                                                glVertex3fv(CCG_elem_co(&key, b));
2078
2182
                                                
2079
2183
                                                if (x != gridFaces - 1) {
2080
2184
                                                        if (tf) tf++;
2082
2186
                                                }
2083
2187
                                        }
2084
2188
 
2085
 
                                        a = &faceGridData[(y + 0) * gridSize + x];
2086
 
                                        b = &faceGridData[(y + 1) * gridSize + x];
 
2189
                                        a = CCG_grid_elem(&key, faceGridData, x, y + 0);
 
2190
                                        b = CCG_grid_elem(&key, faceGridData, x, y + 1);
2087
2191
 
2088
2192
                                        if (tf) glTexCoord2fv(tf->uv[3]);
2089
2193
                                        if (cp) glColor3ub(cp[15], cp[14], cp[13]);
2090
 
                                        glNormal3fv(a->no);
2091
 
                                        glVertex3fv(a->co);
 
2194
                                        glNormal3fv(CCG_elem_no(&key, a));
 
2195
                                        glVertex3fv(CCG_elem_co(&key, a));
2092
2196
 
2093
2197
                                        if (tf) glTexCoord2fv(tf->uv[2]);
2094
2198
                                        if (cp) glColor3ub(cp[11], cp[10], cp[9]);
2095
 
                                        glNormal3fv(b->no);
2096
 
                                        glVertex3fv(b->co);
 
2199
                                        glNormal3fv(CCG_elem_no(&key, b));
 
2200
                                        glVertex3fv(CCG_elem_co(&key, b));
2097
2201
 
2098
2202
                                        if (tf) tf++;
2099
2203
                                        if (cp) cp += 16;
2102
2206
                                }
2103
2207
                        }
2104
2208
                        else {
2105
 
                                glShadeModel((cp)? GL_SMOOTH: GL_FLAT);
 
2209
                                glShadeModel((cp) ? GL_SMOOTH : GL_FLAT);
2106
2210
                                glBegin(GL_QUADS);
2107
2211
                                for (y = 0; y < gridFaces; y++) {
2108
2212
                                        for (x = 0; x < gridFaces; x++) {
2109
 
                                                float *a_co = faceGridData[(y + 0) * gridSize + x].co;
2110
 
                                                float *b_co = faceGridData[(y + 0) * gridSize + x + 1].co;
2111
 
                                                float *c_co = faceGridData[(y + 1) * gridSize + x + 1].co;
2112
 
                                                float *d_co = faceGridData[(y + 1) * gridSize + x].co;
 
2213
                                                float *a_co = CCG_grid_elem_co(&key, faceGridData, x, y + 0);
 
2214
                                                float *b_co = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 0);
 
2215
                                                float *c_co = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 1);
 
2216
                                                float *d_co = CCG_grid_elem_co(&key, faceGridData, x, y + 1);
2113
2217
 
2114
2218
                                                ccgDM_glNormalFast(a_co, b_co, c_co, d_co);
2115
2219
 
2197
2301
{
2198
2302
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
2199
2303
        CCGSubSurf *ss = ccgdm->ss;
 
2304
        CCGKey key;
2200
2305
        MCol *mcol = NULL;
2201
2306
        int i, gridSize = ccgSubSurf_getGridSize(ss);
2202
2307
        DMFlagMat *faceFlags = ccgdm->faceFlags;
2203
2308
        int useColors = flag & DM_DRAW_USE_COLORS;
2204
2309
        int gridFaces = gridSize - 1, totface;
2205
2310
 
 
2311
        CCG_key_top_level(&key, ss);
 
2312
 
2206
2313
        /* currently unused -- each original face is handled separately */
2207
2314
        (void)compareDrawOptions;
2208
2315
 
2250
2357
                                glShadeModel(GL_SMOOTH);
2251
2358
                                
2252
2359
                                for (S = 0; S < numVerts; S++) {
2253
 
                                        DMGridData *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
 
2360
                                        CCGElem *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
2254
2361
                                        if (drawSmooth) {
2255
2362
                                                for (y = 0; y < gridFaces; y++) {
2256
 
                                                        DMGridData *a, *b;
 
2363
                                                        CCGElem *a, *b;
2257
2364
                                                        glBegin(GL_QUAD_STRIP);
2258
2365
                                                        for (x = 0; x < gridFaces; x++) {
2259
 
                                                                a = &faceGridData[(y + 0) * gridSize + x];
2260
 
                                                                b = &faceGridData[(y + 1) * gridSize + x];
 
2366
                                                                a = CCG_grid_elem(&key, faceGridData, x, y + 0);
 
2367
                                                                b = CCG_grid_elem(&key, faceGridData, x, y + 1);
2261
2368
        
2262
2369
                                                                if (cp) glColor3ub(cp[3], cp[2], cp[1]);
2263
 
                                                                glNormal3fv(a->no);
2264
 
                                                                glVertex3fv(a->co);
 
2370
                                                                glNormal3fv(CCG_elem_no(&key, a));
 
2371
                                                                glVertex3fv(CCG_elem_co(&key, a));
2265
2372
                                                                if (cp) glColor3ub(cp[7], cp[6], cp[5]);
2266
 
                                                                glNormal3fv(b->no);
2267
 
                                                                glVertex3fv(b->co);
 
2373
                                                                glNormal3fv(CCG_elem_no(&key, b));
 
2374
                                                                glVertex3fv(CCG_elem_co(&key, b));
2268
2375
 
2269
2376
                                                                if (x != gridFaces - 1) {
2270
2377
                                                                        if (cp) cp += 16;
2271
2378
                                                                }
2272
2379
                                                        }
2273
2380
 
2274
 
                                                        a = &faceGridData[(y + 0) * gridSize + x];
2275
 
                                                        b = &faceGridData[(y + 1) * gridSize + x];
 
2381
                                                        a = CCG_grid_elem(&key, faceGridData, x, y + 0);
 
2382
                                                        b = CCG_grid_elem(&key, faceGridData, x, y + 1);
2276
2383
 
2277
2384
                                                        if (cp) glColor3ub(cp[15], cp[14], cp[13]);
2278
 
                                                        glNormal3fv(a->no);
2279
 
                                                        glVertex3fv(a->co);
 
2385
                                                        glNormal3fv(CCG_elem_no(&key, a));
 
2386
                                                        glVertex3fv(CCG_elem_co(&key, a));
2280
2387
                                                        if (cp) glColor3ub(cp[11], cp[10], cp[9]);
2281
 
                                                        glNormal3fv(b->no);
2282
 
                                                        glVertex3fv(b->co);
 
2388
                                                        glNormal3fv(CCG_elem_no(&key, b));
 
2389
                                                        glVertex3fv(CCG_elem_co(&key, b));
2283
2390
 
2284
2391
                                                        if (cp) cp += 16;
2285
2392
 
2290
2397
                                                glBegin(GL_QUADS);
2291
2398
                                                for (y = 0; y < gridFaces; y++) {
2292
2399
                                                        for (x = 0; x < gridFaces; x++) {
2293
 
                                                                float *a = faceGridData[(y + 0) * gridSize + x].co;
2294
 
                                                                float *b = faceGridData[(y + 0) * gridSize + x + 1].co;
2295
 
                                                                float *c = faceGridData[(y + 1) * gridSize + x + 1].co;
2296
 
                                                                float *d = faceGridData[(y + 1) * gridSize + x].co;
 
2400
                                                                float *a = CCG_grid_elem_co(&key, faceGridData, x, y + 0);
 
2401
                                                                float *b = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 0);
 
2402
                                                                float *c = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 1);
 
2403
                                                                float *d = CCG_grid_elem_co(&key, faceGridData, x, y + 1);
2297
2404
 
2298
2405
                                                                ccgDM_glNormalFast(a, b, c, d);
2299
2406
        
2325
2432
{
2326
2433
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
2327
2434
        CCGSubSurf *ss = ccgdm->ss;
2328
 
        CCGEdgeIterator *ei = ccgSubSurf_getEdgeIterator(ss);
 
2435
        CCGEdgeIterator *ei;
 
2436
        CCGKey key;
2329
2437
        int i, useAging, edgeSize = ccgSubSurf_getEdgeSize(ss);
2330
2438
 
 
2439
        CCG_key_top_level(&key, ss);
2331
2440
        ccgSubSurf_getUseAgeCounts(ss, &useAging, NULL, NULL, NULL);
2332
2441
 
2333
 
        for (; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
 
2442
        for (ei = ccgSubSurf_getEdgeIterator(ss); !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
2334
2443
                CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
2335
 
                DMGridData *edgeData = ccgSubSurf_getEdgeDataArray(ss, e);
 
2444
                CCGElem *edgeData = ccgSubSurf_getEdgeDataArray(ss, e);
2336
2445
                int index = ccgDM_getEdgeMapIndex(ss, e);
2337
2446
 
2338
2447
                glBegin(GL_LINE_STRIP);
2343
2452
                        }
2344
2453
 
2345
2454
                        for (i = 0; i < edgeSize - 1; i++) {
2346
 
                                glVertex3fv(edgeData[i].co);
2347
 
                                glVertex3fv(edgeData[i + 1].co);
 
2455
                                glVertex3fv(CCG_elem_offset_co(&key, edgeData, i));
 
2456
                                glVertex3fv(CCG_elem_offset_co(&key, edgeData, i + 1));
2348
2457
                        }
2349
2458
                }
2350
2459
                glEnd();
2360
2469
{
2361
2470
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
2362
2471
        CCGSubSurf *ss = ccgdm->ss;
2363
 
        CCGEdgeIterator *ei = ccgSubSurf_getEdgeIterator(ss);
 
2472
        CCGKey key;
 
2473
        CCGEdgeIterator *ei;
2364
2474
        int i, useAging, edgeSize = ccgSubSurf_getEdgeSize(ss);
2365
2475
 
 
2476
        CCG_key_top_level(&key, ss);
2366
2477
        ccgSubSurf_getUseAgeCounts(ss, &useAging, NULL, NULL, NULL);
2367
2478
 
2368
 
        for (; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
 
2479
        for (ei = ccgSubSurf_getEdgeIterator(ss); !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
2369
2480
                CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
2370
 
                DMGridData *edgeData = ccgSubSurf_getEdgeDataArray(ss, e);
 
2481
                CCGElem *edgeData = ccgSubSurf_getEdgeDataArray(ss, e);
2371
2482
                int index = ccgDM_getEdgeMapIndex(ss, e);
2372
2483
 
2373
2484
                glBegin(GL_LINE_STRIP);
2380
2491
                                        glColor3ub(0, ageCol > 0 ? ageCol : 0, 0);
2381
2492
                                }
2382
2493
 
2383
 
                                glVertex3fv(edgeData[i].co);
 
2494
                                glVertex3fv(CCG_elem_offset_co(&key, edgeData, i));
2384
2495
                        }
2385
2496
                }
2386
2497
                glEnd();
2390
2501
}
2391
2502
 
2392
2503
static void ccgDM_foreachMappedFaceCenter(
2393
 
    DerivedMesh *dm,
2394
 
    void (*func)(void *userData, int index, const float co[3], const float no[3]),
2395
 
    void *userData)
 
2504
        DerivedMesh *dm,
 
2505
        void (*func)(void *userData, int index, const float co[3], const float no[3]),
 
2506
        void *userData)
2396
2507
{
2397
2508
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
2398
2509
        CCGSubSurf *ss = ccgdm->ss;
2399
 
        CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss);
2400
 
 
2401
 
        for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
 
2510
        CCGKey key;
 
2511
        CCGFaceIterator *fi;
 
2512
 
 
2513
        CCG_key_top_level(&key, ss);
 
2514
 
 
2515
        for (fi = ccgSubSurf_getFaceIterator(ss); !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
2402
2516
                CCGFace *f = ccgFaceIterator_getCurrent(fi);
2403
2517
                int index = ccgDM_getFaceMapIndex(ss, f);
2404
2518
 
2405
2519
                if (index != -1) {
2406
2520
                        /* Face center data normal isn't updated atm. */
2407
 
                        DMGridData *vd = ccgSubSurf_getFaceGridData(ss, f, 0, 0, 0);
 
2521
                        CCGElem *vd = ccgSubSurf_getFaceGridData(ss, f, 0, 0, 0);
2408
2522
 
2409
 
                        func(userData, index, vd->co, vd->no);
 
2523
                        func(userData, index, CCG_elem_co(&key, vd), CCG_elem_no(&key, vd));
2410
2524
                }
2411
2525
        }
2412
2526
 
2423
2537
                        /* Check that mmd still exists */
2424
2538
                        if (!ccgdm->multires.local_mmd &&
2425
2539
                            BLI_findindex(&ccgdm->multires.ob->modifiers, ccgdm->multires.mmd) < 0)
 
2540
                        {
2426
2541
                                ccgdm->multires.mmd = NULL;
 
2542
                        }
2427
2543
                        
2428
2544
                        if (ccgdm->multires.mmd) {
2429
2545
                                if (ccgdm->multires.modified_flags & MULTIRES_COORDS_MODIFIED)
2595
2711
{
2596
2712
        if (type == CD_ORIGINDEX) {
2597
2713
                /* create origindex on demand to save memory */
 
2714
                int *origindex;
 
2715
 
 
2716
                /* Avoid re-creation if the layer exists already */
 
2717
                origindex = DM_get_tessface_data_layer(dm, CD_ORIGINDEX);
 
2718
                if (origindex) {
 
2719
                        return origindex;
 
2720
                }
 
2721
 
 
2722
                DM_add_tessface_layer(dm, CD_ORIGINDEX, CD_CALLOC, NULL);
 
2723
                origindex = DM_get_tessface_data_layer(dm, CD_ORIGINDEX);
 
2724
 
 
2725
                /* silly loop counting up */
 
2726
                range_vn_i(origindex, dm->getNumTessFaces(dm), 0);
 
2727
 
 
2728
                return origindex;
 
2729
        }
 
2730
 
 
2731
        return DM_get_tessface_data_layer(dm, type);
 
2732
}
 
2733
 
 
2734
static void *ccgDM_get_poly_data_layer(DerivedMesh *dm, int type)
 
2735
{
 
2736
        if (type == CD_ORIGINDEX) {
 
2737
                /* create origindex on demand to save memory */
2598
2738
                CCGDerivedMesh *ccgdm = (CCGDerivedMesh *)dm;
2599
2739
                CCGSubSurf *ss = ccgdm->ss;
2600
2740
                int *origindex;
2602
2742
                int gridFaces = ccgSubSurf_getGridSize(ss) - 1;
2603
2743
 
2604
2744
                /* Avoid re-creation if the layer exists already */
2605
 
                origindex = DM_get_tessface_data_layer(dm, CD_ORIGINDEX);
 
2745
                origindex = DM_get_poly_data_layer(dm, CD_ORIGINDEX);
2606
2746
                if (origindex) {
2607
2747
                        return origindex;
2608
2748
                }
2609
2749
 
2610
 
                DM_add_tessface_layer(dm, CD_ORIGINDEX, CD_CALLOC, NULL);
2611
 
                origindex = DM_get_tessface_data_layer(dm, CD_ORIGINDEX);
 
2750
                DM_add_poly_layer(dm, CD_ORIGINDEX, CD_CALLOC, NULL);
 
2751
                origindex = DM_get_poly_data_layer(dm, CD_ORIGINDEX);
2612
2752
 
2613
2753
                totface = ccgSubSurf_getNumFaces(ss);
2614
2754
 
2624
2764
                return origindex;
2625
2765
        }
2626
2766
 
2627
 
        return DM_get_tessface_data_layer(dm, type);
 
2767
        return DM_get_poly_data_layer(dm, type);
2628
2768
}
2629
2769
 
2630
2770
static void *ccgDM_get_vert_data(DerivedMesh *dm, int index, int type)
2657
2797
        return DM_get_tessface_data(dm, index, type);
2658
2798
}
2659
2799
 
 
2800
static void *ccgDM_get_poly_data(DerivedMesh *dm, int index, int type)
 
2801
{
 
2802
        if (type == CD_ORIGINDEX) {
 
2803
                /* ensure creation of CD_ORIGINDEX layer */
 
2804
                ccgDM_get_tessface_data_layer(dm, type);
 
2805
        }
 
2806
 
 
2807
        return DM_get_poly_data(dm, index, type);
 
2808
}
 
2809
 
2660
2810
static int ccgDM_getNumGrids(DerivedMesh *dm)
2661
2811
{
2662
2812
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh *)dm;
2717
2867
{
2718
2868
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh *)dm;
2719
2869
        CCGSubSurf *ss = ccgdm->ss;
2720
 
        DMGridData **gridData;
 
2870
        CCGElem **gridData;
2721
2871
        DMGridAdjacency *gridAdjacency, *adj;
2722
2872
        DMFlagMat *gridFlagMats;
2723
2873
        CCGFace **gridFaces;
2743
2893
        }
2744
2894
 
2745
2895
        /* compute grid data */
2746
 
        gridData = MEM_mallocN(sizeof(DMGridData *) * numGrids, "ccgdm.gridData");
 
2896
        gridData = MEM_mallocN(sizeof(CCGElem *) * numGrids, "ccgdm.gridData");
2747
2897
        gridAdjacency = MEM_mallocN(sizeof(DMGridAdjacency) * numGrids, "ccgdm.gridAdjacency");
2748
2898
        gridFaces = MEM_mallocN(sizeof(CCGFace *) * numGrids, "ccgdm.gridFaces");
2749
2899
        gridFlagMats = MEM_mallocN(sizeof(DMFlagMat) * numGrids, "ccgdm.gridFlagMats");
2782
2932
        ccgdm->gridFlagMats = gridFlagMats;
2783
2933
}
2784
2934
 
2785
 
static DMGridData **ccgDM_getGridData(DerivedMesh *dm)
 
2935
static CCGElem **ccgDM_getGridData(DerivedMesh *dm)
2786
2936
{
2787
2937
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh *)dm;
2788
2938
 
2806
2956
        return ccgdm->gridOffset;
2807
2957
}
2808
2958
 
 
2959
static void ccgDM_getGridKey(DerivedMesh *dm, CCGKey *key)
 
2960
{
 
2961
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh *)dm;
 
2962
        CCG_key_top_level(key, ccgdm->ss);
 
2963
}
 
2964
 
2809
2965
static DMFlagMat *ccgDM_getGridFlagMats(DerivedMesh *dm)
2810
2966
{
2811
2967
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh *)dm;
2852
3008
static struct PBVH *ccgDM_getPBVH(Object *ob, DerivedMesh *dm)
2853
3009
{
2854
3010
        CCGDerivedMesh *ccgdm = (CCGDerivedMesh *)dm;
2855
 
        int gridSize, numGrids, grid_pbvh;
 
3011
        CCGKey key;
 
3012
        int numGrids, grid_pbvh;
 
3013
 
 
3014
        CCG_key_top_level(&key, ccgdm->ss);
2856
3015
 
2857
3016
        if (!ob) {
2858
3017
                ccgdm->pbvh = NULL;
2871
3030
                         * when the ccgdm gets remade, the assumption is that the topology
2872
3031
                         * does not change. */
2873
3032
                        ccgdm_create_grids(dm);
2874
 
                        BLI_pbvh_grids_update(ob->sculpt->pbvh, ccgdm->gridData, ccgdm->gridAdjacency, (void **)ccgdm->gridFaces);
 
3033
                        BKE_pbvh_grids_update(ob->sculpt->pbvh, ccgdm->gridData, ccgdm->gridAdjacency, (void **)ccgdm->gridFaces,
 
3034
                                              ccgdm->gridFlagMats, ccgdm->gridHidden);
2875
3035
                }
2876
3036
 
2877
3037
                ccgdm->pbvh = ob->sculpt->pbvh;
2886
3046
        if (grid_pbvh) {
2887
3047
                ccgdm_create_grids(dm);
2888
3048
 
2889
 
                gridSize = ccgDM_getGridSize(dm);
2890
3049
                numGrids = ccgDM_getNumGrids(dm);
2891
3050
 
2892
 
                ob->sculpt->pbvh = ccgdm->pbvh = BLI_pbvh_new();
2893
 
                BLI_pbvh_build_grids(ccgdm->pbvh, ccgdm->gridData, ccgdm->gridAdjacency,
2894
 
                                     numGrids, gridSize, (void **)ccgdm->gridFaces, ccgdm->gridFlagMats, ccgdm->gridHidden);
 
3051
                ob->sculpt->pbvh = ccgdm->pbvh = BKE_pbvh_new();
 
3052
                BKE_pbvh_build_grids(ccgdm->pbvh, ccgdm->gridData, ccgdm->gridAdjacency,
 
3053
                                     numGrids, &key, (void **) ccgdm->gridFaces, ccgdm->gridFlagMats, ccgdm->gridHidden);
2895
3054
        }
2896
3055
        else if (ob->type == OB_MESH) {
2897
3056
                Mesh *me = ob->data;
2898
 
                ob->sculpt->pbvh = ccgdm->pbvh = BLI_pbvh_new();
 
3057
                ob->sculpt->pbvh = ccgdm->pbvh = BKE_pbvh_new();
2899
3058
                BLI_assert(!(me->mface == NULL && me->mpoly != NULL)); /* BMESH ONLY complain if mpoly is valid but not mface */
2900
 
                BLI_pbvh_build_mesh(ccgdm->pbvh, me->mface, me->mvert,
2901
 
                                    me->totface, me->totvert);
 
3059
                BKE_pbvh_build_mesh(ccgdm->pbvh, me->mface, me->mvert,
 
3060
                                    me->totface, me->totvert, &me->vdata);
2902
3061
        }
2903
3062
 
 
3063
        if (ccgdm->pbvh)
 
3064
                pbvh_show_diffuse_color_set(ccgdm->pbvh, ob->sculpt->show_diffuse_color);
 
3065
 
2904
3066
        return ccgdm->pbvh;
2905
3067
}
2906
3068
 
2976
3138
        }
2977
3139
 
2978
3140
        /* We absolutely need that layer, else it's no valid tessellated data! */
2979
 
        polyidx = CustomData_add_layer(&ccgdm->dm.faceData, CD_POLYINDEX, CD_CALLOC,
 
3141
        polyidx = CustomData_add_layer(&ccgdm->dm.faceData, CD_ORIGINDEX, CD_CALLOC,
2980
3142
                                       NULL, ccgSubSurf_getNumFinalFaces(ss));
2981
3143
 
2982
3144
        ccgdm->dm.getMinMax = ccgDM_getMinMax;
3004
3166
        ccgdm->dm.getVertData = ccgDM_get_vert_data;
3005
3167
        ccgdm->dm.getEdgeData = ccgDM_get_edge_data;
3006
3168
        ccgdm->dm.getTessFaceData = ccgDM_get_tessface_data;
 
3169
        ccgdm->dm.getPolyData = ccgDM_get_poly_data;
3007
3170
        ccgdm->dm.getVertDataArray = ccgDM_get_vert_data_layer;
3008
3171
        ccgdm->dm.getEdgeDataArray = ccgDM_get_edge_data_layer;
3009
3172
        ccgdm->dm.getTessFaceDataArray = ccgDM_get_tessface_data_layer;
 
3173
        ccgdm->dm.getPolyDataArray = ccgDM_get_poly_data_layer;
3010
3174
        ccgdm->dm.getNumGrids = ccgDM_getNumGrids;
3011
3175
        ccgdm->dm.getGridSize = ccgDM_getGridSize;
3012
3176
        ccgdm->dm.getGridData = ccgDM_getGridData;
3013
3177
        ccgdm->dm.getGridAdjacency = ccgDM_getGridAdjacency;
3014
3178
        ccgdm->dm.getGridOffset = ccgDM_getGridOffset;
 
3179
        ccgdm->dm.getGridKey = ccgDM_getGridKey;
3015
3180
        ccgdm->dm.getGridFlagMats = ccgDM_getGridFlagMats;
3016
3181
        ccgdm->dm.getGridHidden = ccgDM_getGridHidden;
3017
3182
        ccgdm->dm.getPolyMap = ccgDM_getPolyMap;
3053
3218
 
3054
3219
        totvert = ccgSubSurf_getNumVerts(ss);
3055
3220
        ccgdm->vertMap = MEM_mallocN(totvert * sizeof(*ccgdm->vertMap), "vertMap");
3056
 
        vi = ccgSubSurf_getVertIterator(ss);
3057
 
        for (; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
 
3221
        for (vi = ccgSubSurf_getVertIterator(ss); !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
3058
3222
                CCGVert *v = ccgVertIterator_getCurrent(vi);
3059
3223
 
3060
3224
                ccgdm->vertMap[GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v))].vert = v;
3063
3227
 
3064
3228
        totedge = ccgSubSurf_getNumEdges(ss);
3065
3229
        ccgdm->edgeMap = MEM_mallocN(totedge * sizeof(*ccgdm->edgeMap), "edgeMap");
3066
 
        ei = ccgSubSurf_getEdgeIterator(ss);
3067
 
        for (; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
 
3230
        for (ei = ccgSubSurf_getEdgeIterator(ss); !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
3068
3231
                CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
3069
3232
 
3070
3233
                ccgdm->edgeMap[GET_INT_FROM_POINTER(ccgSubSurf_getEdgeEdgeHandle(e))].edge = e;
3072
3235
 
3073
3236
        totface = ccgSubSurf_getNumFaces(ss);
3074
3237
        ccgdm->faceMap = MEM_mallocN(totface * sizeof(*ccgdm->faceMap), "faceMap");
3075
 
        fi = ccgSubSurf_getFaceIterator(ss);
3076
 
        for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
 
3238
        for (fi = ccgSubSurf_getFaceIterator(ss); !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
3077
3239
                CCGFace *f = ccgFaceIterator_getCurrent(fi);
3078
3240
 
3079
3241
                ccgdm->faceMap[GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f))].face = f;
3107
3269
 
3108
3270
        vertOrigIndex = DM_get_vert_data_layer(&ccgdm->dm, CD_ORIGINDEX);
3109
3271
        /*edgeOrigIndex = DM_get_edge_data_layer(&ccgdm->dm, CD_ORIGINDEX);*/
 
3272
 
3110
3273
        faceOrigIndex = DM_get_tessface_data_layer(&ccgdm->dm, CD_ORIGINDEX);
3111
 
 
3112
3274
        polyOrigIndex = DM_get_poly_data_layer(&ccgdm->dm, CD_ORIGINDEX);
3113
3275
 
3114
3276
#if 0
3122
3284
        has_edge_origindex = CustomData_has_layer(&ccgdm->dm.edgeData, CD_ORIGINDEX);
3123
3285
 
3124
3286
 
3125
 
        loopindex = loopindex2 = 0; //current loop index
 
3287
        loopindex = loopindex2 = 0; /* current loop index */
3126
3288
        for (index = 0; index < totface; index++) {
3127
3289
                CCGFace *f = ccgdm->faceMap[index].face;
3128
3290
                int numVerts = ccgSubSurf_getFaceNumVerts(f);
3148
3310
                *((int *)ccgSubSurf_getFaceUserData(ss, f)) = vertNum;
3149
3311
 
3150
3312
                BLI_array_empty(loopidx);
3151
 
                BLI_array_growitems(loopidx, numVerts);
 
3313
                BLI_array_grow_items(loopidx, numVerts);
3152
3314
                for (s = 0; s < numVerts; s++) {
3153
3315
                        loopidx[s] = loopindex++;
3154
3316
                }
3155
3317
                
3156
3318
                BLI_array_empty(vertidx);
3157
 
                BLI_array_growitems(vertidx, numVerts);
 
3319
                BLI_array_grow_items(vertidx, numVerts);
3158
3320
                for (s = 0; s < numVerts; s++) {
3159
3321
                        CCGVert *v = ccgSubSurf_getFaceVert(f, s);
3160
3322
                        vertidx[s] = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v));
3162
3324
                
3163
3325
 
3164
3326
                /*I think this is for interpolating the center vert?*/
3165
 
                w2 = w; // + numVerts*(g2_wid-1)*(g2_wid-1); //numVerts*((g2_wid-1)*g2_wid+g2_wid-1);
 
3327
                w2 = w; // + numVerts*(g2_wid-1) * (g2_wid-1); //numVerts*((g2_wid-1) * g2_wid+g2_wid-1);
3166
3328
                DM_interp_vert_data(dm, &ccgdm->dm, vertidx, w2,
3167
3329
                                    numVerts, vertNum);
3168
3330
                if (vertOrigIndex) {
3169
3331
                        *vertOrigIndex = ORIGINDEX_NONE;
3170
 
                        ++vertOrigIndex;
 
3332
                        vertOrigIndex++;
3171
3333
                }
3172
3334
 
3173
 
                ++vertNum;
 
3335
                vertNum++;
3174
3336
 
3175
3337
                /*interpolate per-vert data*/
3176
3338
                for (s = 0; s < numVerts; s++) {
3181
3343
 
3182
3344
                                if (vertOrigIndex) {
3183
3345
                                        *vertOrigIndex = ORIGINDEX_NONE;
3184
 
                                        ++vertOrigIndex;
 
3346
                                        vertOrigIndex++;
3185
3347
                                }
3186
3348
 
3187
 
                                ++vertNum;
 
3349
                                vertNum++;
3188
3350
                        }
3189
3351
                }
3190
3352
 
3198
3360
 
3199
3361
                                        if (vertOrigIndex) {
3200
3362
                                                *vertOrigIndex = ORIGINDEX_NONE;
3201
 
                                                ++vertOrigIndex;
 
3363
                                                vertOrigIndex++;
3202
3364
                                        }
3203
3365
 
3204
 
                                        ++vertNum;
 
3366
                                        vertNum++;
3205
3367
                                }
3206
3368
                        }
3207
3369
                }
3246
3408
                                        
3247
3409
                                        /*set original index data*/
3248
3410
                                        if (faceOrigIndex) {
3249
 
                                                *faceOrigIndex = origIndex;
 
3411
                                                /* reference the index in 'polyOrigIndex' */
 
3412
                                                *faceOrigIndex = faceNum;
3250
3413
                                                faceOrigIndex++;
3251
3414
                                        }
3252
3415
                                        if (polyOrigIndex) {
3297
3460
                        DM_interp_vert_data(dm, &ccgdm->dm, vertIdx, w, 2, vertNum);
3298
3461
                        if (vertOrigIndex) {
3299
3462
                                *vertOrigIndex = ORIGINDEX_NONE;
3300
 
                                ++vertOrigIndex;
 
3463
                                vertOrigIndex++;
3301
3464
                        }
3302
 
                        ++vertNum;
 
3465
                        vertNum++;
3303
3466
                }
3304
3467
 
3305
3468
                for (i = 0; i < numFinalEdges; ++i) {
3337
3500
 
3338
3501
                if (vertOrigIndex) {
3339
3502
                        *vertOrigIndex = mapIndex;
3340
 
                        ++vertOrigIndex;
 
3503
                        vertOrigIndex++;
3341
3504
                }
3342
 
                ++vertNum;
 
3505
                vertNum++;
3343
3506
        }
3344
3507
 
3345
3508
        ccgdm->dm.numVertData = vertNum;
3363
3526
struct DerivedMesh *subsurf_make_derived_from_derived(
3364
3527
        struct DerivedMesh *dm,
3365
3528
        struct SubsurfModifierData *smd,
3366
 
        int useRenderParams, float (*vertCos)[3],
3367
 
        int isFinalCalc, int forEditMode, int inEditMode)
 
3529
        float (*vertCos)[3],
 
3530
        SubsurfFlags flags)
3368
3531
{
3369
 
        int useSimple = smd->subdivType == ME_SIMPLE_SUBSURF;
 
3532
        int useSimple = (smd->subdivType == ME_SIMPLE_SUBSURF) ? CCG_SIMPLE_SUBDIV : 0;
3370
3533
        CCGFlags useAging = smd->flags & eSubsurfModifierFlag_DebugIncr ? CCG_USE_AGING : 0;
3371
3534
        int useSubsurfUv = smd->flags & eSubsurfModifierFlag_SubsurfUv;
3372
3535
        int drawInteriorEdges = !(smd->flags & eSubsurfModifierFlag_ControlEdges);
3373
3536
        CCGDerivedMesh *result;
3374
3537
 
3375
 
        if (forEditMode) {
 
3538
        if (flags & SUBSURF_FOR_EDIT_MODE) {
3376
3539
                int levels = (smd->modifier.scene) ? get_render_subsurf_level(&smd->modifier.scene->r, smd->levels) : smd->levels;
3377
3540
 
3378
 
                smd->emCache = _getSubSurf(smd->emCache, levels, useAging | CCG_CALC_NORMALS);
 
3541
                smd->emCache = _getSubSurf(smd->emCache, levels, 3, useSimple | useAging | CCG_CALC_NORMALS);
3379
3542
                ss_sync_from_derivedmesh(smd->emCache, dm, vertCos, useSimple);
3380
3543
 
3381
3544
                result = getCCGDerivedMesh(smd->emCache,
3382
3545
                                           drawInteriorEdges,
3383
3546
                                           useSubsurfUv, dm);
3384
3547
        }
3385
 
        else if (useRenderParams) {
 
3548
        else if (flags & SUBSURF_USE_RENDER_PARAMS) {
3386
3549
                /* Do not use cache in render mode. */
3387
3550
                CCGSubSurf *ss;
3388
3551
                int levels = (smd->modifier.scene) ? get_render_subsurf_level(&smd->modifier.scene->r, smd->renderLevels) : smd->renderLevels;
3390
3553
                if (levels == 0)
3391
3554
                        return dm;
3392
3555
                
3393
 
                ss = _getSubSurf(NULL, levels, CCG_USE_ARENA | CCG_CALC_NORMALS);
 
3556
                ss = _getSubSurf(NULL, levels, 3, useSimple | CCG_USE_ARENA | CCG_CALC_NORMALS);
3394
3557
 
3395
3558
                ss_sync_from_derivedmesh(ss, dm, vertCos, useSimple);
3396
3559
 
3415
3578
                 * Addendum: we can't really ensure that this is never called in edit
3416
3579
                 * mode, so now we have a parameter to verify it. - brecht
3417
3580
                 */
3418
 
                if (!inEditMode && smd->emCache) {
 
3581
                if (!(flags & SUBSURF_IN_EDIT_MODE) && smd->emCache) {
3419
3582
                        ccgSubSurf_free(smd->emCache);
3420
3583
                        smd->emCache = NULL;
3421
3584
                }
3422
3585
 
3423
 
                if (useIncremental && isFinalCalc) {
3424
 
                        smd->mCache = ss = _getSubSurf(smd->mCache, levels, useAging | CCG_CALC_NORMALS);
 
3586
                if (useIncremental && (flags & SUBSURF_IS_FINAL_CALC)) {
 
3587
                        smd->mCache = ss = _getSubSurf(smd->mCache, levels, 3, useSimple | useAging | CCG_CALC_NORMALS);
3425
3588
 
3426
3589
                        ss_sync_from_derivedmesh(ss, dm, vertCos, useSimple);
3427
3590
 
3430
3593
                                                   useSubsurfUv, dm);
3431
3594
                }
3432
3595
                else {
3433
 
                        if (smd->mCache && isFinalCalc) {
 
3596
                        CCGFlags ccg_flags = useSimple | CCG_USE_ARENA | CCG_CALC_NORMALS;
 
3597
                        
 
3598
                        if (smd->mCache && (flags & SUBSURF_IS_FINAL_CALC)) {
3434
3599
                                ccgSubSurf_free(smd->mCache);
3435
3600
                                smd->mCache = NULL;
3436
3601
                        }
3437
3602
 
3438
 
                        ss = _getSubSurf(NULL, levels, CCG_USE_ARENA | CCG_CALC_NORMALS);
 
3603
                        if (flags & SUBSURF_ALLOC_PAINT_MASK)
 
3604
                                ccg_flags |= CCG_ALLOC_MASK;
 
3605
 
 
3606
                        ss = _getSubSurf(NULL, levels, 3, ccg_flags);
3439
3607
                        ss_sync_from_derivedmesh(ss, dm, vertCos, useSimple);
3440
3608
 
3441
3609
                        result = getCCGDerivedMesh(ss, drawInteriorEdges, useSubsurfUv, dm);
3442
3610
 
3443
 
                        if (isFinalCalc)
 
3611
                        if (flags & SUBSURF_IS_FINAL_CALC)
3444
3612
                                smd->mCache = ss;
3445
3613
                        else
3446
3614
                                result->freeSS = 1;
 
3615
 
 
3616
                        if (flags & SUBSURF_ALLOC_PAINT_MASK)
 
3617
                                ccgSubSurf_setNumLayers(ss, 4);
3447
3618
                }
3448
3619
        }
3449
3620
 
3457
3628
         * calculated vert positions is incorrect for the verts 
3458
3629
         * on the boundary of the mesh.
3459
3630
         */
3460
 
        CCGSubSurf *ss = _getSubSurf(NULL, 1, CCG_USE_ARENA);
 
3631
        CCGSubSurf *ss = _getSubSurf(NULL, 1, 3, CCG_USE_ARENA);
3461
3632
        float edge_sum[3], face_sum[3];
3462
3633
        CCGVertIterator *vi;
3463
3634
        DerivedMesh *dm = CDDM_from_mesh(me, NULL);
3464
3635
 
3465
3636
        ss_sync_from_derivedmesh(ss, dm, NULL, 0);
3466
3637
 
3467
 
        vi = ccgSubSurf_getVertIterator(ss);
3468
 
        for (; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
 
3638
        for (vi = ccgSubSurf_getVertIterator(ss); !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
3469
3639
                CCGVert *v = ccgVertIterator_getCurrent(vi);
3470
3640
                int idx = GET_INT_FROM_POINTER(ccgSubSurf_getVertVertHandle(v));
3471
3641
                int N = ccgSubSurf_getVertNumEdges(v);
3473
3643
                float *co;
3474
3644
                int i;
3475
3645
 
3476
 
                edge_sum[0] = edge_sum[1] = edge_sum[2] = 0.0;
3477
 
                face_sum[0] = face_sum[1] = face_sum[2] = 0.0;
 
3646
                zero_v3(edge_sum);
 
3647
                zero_v3(face_sum);
3478
3648
 
3479
3649
                for (i = 0; i < N; i++) {
3480
3650
                        CCGEdge *e = ccgSubSurf_getVertEdge(v, i);