Revision: 29261
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29261
Author:   nicholasbishop
Date:     2010-06-06 08:10:54 +0200 (Sun, 06 Jun 2010)

Log Message:
-----------
* Changed CCGSubSurf's Vert macros into functions that operate on any number of 
floats, rather than just three.
* Added a new field to CCGMeshIFC to control how many floats those functions 
will operate on.
* For now it's always three, so there should be no visible change in behavior.

Modified Paths:
--------------
    
branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/CCGSubSurf.c
    
branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/CCGSubSurf.h
    
branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/subsurf_ccg.c

Modified: 
branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/CCGSubSurf.c
===================================================================
--- 
branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/CCGSubSurf.c   
    2010-06-06 01:31:37 UTC (rev 29260)
+++ 
branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/CCGSubSurf.c   
    2010-06-06 06:10:54 UTC (rev 29261)
@@ -211,6 +211,8 @@
 static int VertDataEqual(float *a, float *b) {
        return a[0]==b[0] && a[1]==b[1] && a[2]==b[2];
 }
+
+#if 0
 #define VertDataZero(av)                               { float *_a = (float*) 
av; _a[0] = _a[1] = _a[2] = 0.0f; }
 #define VertDataCopy(av, bv)                   { float *_a = (float*) av, *_b 
= (float*) bv; _a[0] =_b[0]; _a[1] =_b[1]; _a[2] =_b[2]; }
 #define VertDataAdd(av, bv)                            { float *_a = (float*) 
av, *_b = (float*) bv; _a[0]+=_b[0]; _a[1]+=_b[1]; _a[2]+=_b[2]; }
@@ -223,6 +225,51 @@
                _t[1] = (_a[1]+_b[1]+_c[1]+_d[1])*.25; \
                _t[2] = (_a[2]+_b[2]+_c[2]+_d[2])*.25; \
        }
+#else
+
+static inline void VertDataZero(void *a, const int n)
+{
+       int i;
+       for(i = 0; i < n; ++i)
+               ((float*)a)[i] = 0;
+}
+
+static inline void VertDataCopy(void *a, void *b, int n)
+{
+       int i;
+       for(i = 0; i < n; ++i)
+               ((float*)a)[i] = ((float*)b)[i];
+}
+
+static inline void VertDataAdd(void *a, void *b, int n)
+{
+       int i;
+       for(i = 0; i < n; ++i)
+               ((float*)a)[i] += ((float*)b)[i];
+}
+
+static inline void VertDataSub(void *a, void *b, int n)
+{
+       int i;
+       for(i = 0; i < n; ++i)
+               ((float*)a)[i] -= ((float*)b)[i];
+}
+
+static inline void VertDataMulN(void *a, float b, int n)
+{
+       int i;
+       for(i = 0; i < n; ++i)
+               ((float*)a)[i] *= b;
+}
+
+static inline void VertDataAvg4(void *t, void *a, void *b, void *c, void *d, 
int n)
+{
+       int i;
+       for(i = 0; i < n; ++i)
+               ((float*)t)[i] = (((float*)a)[i] + ((float*)b)[i] + 
((float*)c)[i] + ((float*)d)[i]) * 0.25f;
+}
+#endif
+
 #define NormZero(av)                                   { float *_a = (float*) 
av; _a[0] = _a[1] = _a[2] = 0.0f; }
 #define NormCopy(av, bv)                               { float *_a = (float*) 
av, *_b = (float*) bv; _a[0] =_b[0]; _a[1] =_b[1]; _a[2] =_b[2]; }
 #define NormAdd(av, bv)                                        { float *_a = 
(float*) av, *_b = (float*) bv; _a[0]+=_b[0]; _a[1]+=_b[1]; _a[2]+=_b[2]; }
@@ -314,7 +361,7 @@
 
        void *q, *r;
                
-               // data for calc vert normals
+       // data for calc vert normals
        int calcVertNormals;
        int normalDataOffset;
 
@@ -899,13 +946,13 @@
                v = _ehash_lookupWithPrev(ss->vMap, vHDL, &prevp);
                if (!v) {
                        v = _vert_new(vHDL, ss);
-                       VertDataCopy(_vert_getCo(v,0,ss->meshIFC.vertDataSize), 
vertData);
+                       VertDataCopy(_vert_getCo(v,0,ss->meshIFC.vertDataSize), 
vertData, ss->meshIFC.finterpCount);
                        _ehash_insert(ss->vMap, (EHEntry*) v);
                        v->flags = Vert_eEffected|seamflag;
                } else if (!VertDataEqual(vertData, _vert_getCo(v, 0, 
ss->meshIFC.vertDataSize)) || ((v->flags & Vert_eSeam) != seamflag)) {
                        int i, j;
 
-                       VertDataCopy(_vert_getCo(v,0,ss->meshIFC.vertDataSize), 
vertData);
+                       VertDataCopy(_vert_getCo(v,0,ss->meshIFC.vertDataSize), 
vertData, ss->meshIFC.finterpCount);
                        v->flags = Vert_eEffected|seamflag;
 
                        for (i=0; i<v->numEdges; i++) {
@@ -928,13 +975,13 @@
                v = _ehash_lookupWithPrev(ss->oldVMap, vHDL, &prevp);
                if (!v) {
                        v = _vert_new(vHDL, ss);
-                       VertDataCopy(_vert_getCo(v,0,ss->meshIFC.vertDataSize), 
vertData);
+                       VertDataCopy(_vert_getCo(v,0,ss->meshIFC.vertDataSize), 
vertData, ss->meshIFC.finterpCount);
                        _ehash_insert(ss->vMap, (EHEntry*) v);
                        v->flags = Vert_eEffected|seamflag;
                } else if (!VertDataEqual(vertData, _vert_getCo(v, 0, 
ss->meshIFC.vertDataSize)) || ((v->flags & Vert_eSeam) != seamflag)) {
                        *prevp = v->next;
                        _ehash_insert(ss->vMap, (EHEntry*) v);
-                       VertDataCopy(_vert_getCo(v,0,ss->meshIFC.vertDataSize), 
vertData);
+                       VertDataCopy(_vert_getCo(v,0,ss->meshIFC.vertDataSize), 
vertData, ss->meshIFC.finterpCount);
                        v->flags = Vert_eEffected|Vert_eChanged|seamflag;
                } else {
                        *prevp = v->next;
@@ -1313,7 +1360,7 @@
                        }
 
                        VertDataCopy((float*)((byte*)FACE_getCenterData(f) + 
normalDataOffset),
-                               FACE_getIFNo(f, lvl, S, 0, 0));
+                                    FACE_getIFNo(f, lvl, S, 0, 0), 3);
 
                        for (x=1; x<gridSize-1; x++)
                                NormCopy(FACE_getIENo(f, lvl, S, x),
@@ -1349,6 +1396,7 @@
        int nextLvl = curLvl+1;
        int ptrIdx, cornerIdx, i;
        int vertDataSize = ss->meshIFC.vertDataSize;
+       int finterpCount = ss->meshIFC.finterpCount;
        void *q = ss->q, *r = ss->r;
 
        //#pragma omp parallel for private(ptrIdx) schedule(static)
@@ -1370,7 +1418,7 @@
                                        void *co3 = FACE_getIFCo(f, curLvl, S, 
x+0, y+1);
                                        void *co = FACE_getIFCo(f, nextLvl, S, 
fx, fy);
 
-                                       VertDataAvg4(co, co0, co1, co2, co3);
+                                       VertDataAvg4(co, co0, co1, co2, co3, 
finterpCount);
                                }
                        }
                }
@@ -1388,7 +1436,7 @@
                                void *co3 = FACE_getIFCo(f, nextLvl, S, fx, 1);
                                void *co = FACE_getIECo(f, nextLvl, S, fx);
                                
-                               VertDataAvg4(co, co0, co1, co2, co3);
+                               VertDataAvg4(co, co0, co1, co2, co3, 
finterpCount);
                        }
 
                                        /* interior face interior edge midpoints
@@ -1407,7 +1455,7 @@
                                        void *co3 = FACE_getIFCo(f, nextLvl, S, 
fx+1, fy);
                                        void *co = FACE_getIFCo(f, nextLvl, S, 
fx, fy);
 
-                                       VertDataAvg4(co, co0, co1, co2, co3);
+                                       VertDataAvg4(co, co0, co1, co2, co3, 
finterpCount);
                                }
                        }
 
@@ -1422,7 +1470,7 @@
                                        void *co3 = FACE_getIFCo(f, nextLvl, S, 
fx, fy+1);
                                        void *co = FACE_getIFCo(f, nextLvl, S, 
fx, fy);
 
-                                       VertDataAvg4(co, co0, co1, co2, co3);
+                                       VertDataAvg4(co, co0, co1, co2, co3, 
finterpCount);
                                }
                        }
                }
@@ -1444,9 +1492,9 @@
                                void *co1 = EDGE_getCo(e, curLvl, x+1);
                                void *co = EDGE_getCo(e, nextLvl, fx);
 
-                               VertDataCopy(co, co0);
-                               VertDataAdd(co, co1);
-                               VertDataMulN(co, 0.5);
+                               VertDataCopy(co, co0, finterpCount);
+                               VertDataAdd(co, co1, finterpCount);
+                               VertDataMulN(co, 0.5, finterpCount);
                        }
                } else {
                        for (x=0; x<edgeSize-1; x++) {
@@ -1456,25 +1504,25 @@
                                void *co = EDGE_getCo(e, nextLvl, fx);
                                int numFaces = 0;
 
-                               VertDataCopy(q, co0);
-                               VertDataAdd(q, co1);
+                               VertDataCopy(q, co0, finterpCount);
+                               VertDataAdd(q, co1, finterpCount);
 
                                for (j=0; j<e->numFaces; j++) {
                                        CCGFace *f = e->faces[j];
-                                       VertDataAdd(q, _face_getIFCoEdge(f, e, 
nextLvl, fx, 1, subdivLevels, vertDataSize));
+                                       VertDataAdd(q, _face_getIFCoEdge(f, e, 
nextLvl, fx, 1, subdivLevels, vertDataSize), finterpCount);
                                        numFaces++;
                                }
 
-                               VertDataMulN(q, 1.0f/(2.0f+numFaces));
+                               VertDataMulN(q, 1.0f/(2.0f+numFaces), 
finterpCount);
 
-                               VertDataCopy(r, co0);
-                               VertDataAdd(r, co1);
-                               VertDataMulN(r, 0.5);
+                               VertDataCopy(r, co0, finterpCount);
+                               VertDataAdd(r, co1, finterpCount);
+                               VertDataMulN(r, 0.5, finterpCount);
 
-                               VertDataCopy(co, q);
-                               VertDataSub(r, q);
-                               VertDataMulN(r, sharpness);
-                               VertDataAdd(co, r);
+                               VertDataCopy(co, q, finterpCount);
+                               VertDataSub(r, q, finterpCount);
+                               VertDataMulN(r, sharpness, finterpCount);
+                               VertDataAdd(co, r, finterpCount);
                        }
                }
        }
@@ -1518,51 +1566,51 @@
                        seam = 0;
 
                if (!v->numEdges) {
-                       VertDataCopy(nCo, co);
+                       VertDataCopy(nCo, co, finterpCount);
                } else if (_vert_isBoundary(v)) {
                        int numBoundary = 0;
 
-                       VertDataZero(r);
+                       VertDataZero(r, finterpCount);
                        for (j=0; j<v->numEdges; j++) {
                                CCGEdge *e = v->edges[j];
                                if (_edge_isBoundary(e)) {
-                                       VertDataAdd(r, _edge_getCoVert(e, v, 
curLvl, 1, vertDataSize));
+                                       VertDataAdd(r, _edge_getCoVert(e, v, 
curLvl, 1, vertDataSize), finterpCount);
                                        numBoundary++;
                                }
                        }
 
-                       VertDataCopy(nCo, co);
-                       VertDataMulN(nCo, 0.75);
-                       VertDataMulN(r, 0.25f/numBoundary);
-                       VertDataAdd(nCo, r);
+                       VertDataCopy(nCo, co, finterpCount);
+                       VertDataMulN(nCo, 0.75, finterpCount);
+                       VertDataMulN(r, 0.25f/numBoundary, finterpCount);
+                       VertDataAdd(nCo, r, finterpCount);
                } else {
                        int cornerIdx = (1 + (1<<(curLvl))) - 2;
                        int numEdges = 0, numFaces = 0;
 
-                       VertDataZero(q);
+                       VertDataZero(q, finterpCount);
                        for (j=0; j<v->numFaces; j++) {
                                CCGFace *f = v->faces[j];
-                               VertDataAdd(q, FACE_getIFCo(f, nextLvl, 
_face_getVertIndex(f,v), cornerIdx, cornerIdx));
+                               VertDataAdd(q, FACE_getIFCo(f, nextLvl, 
_face_getVertIndex(f,v), cornerIdx, cornerIdx), finterpCount);
                                numFaces++;
                        }
-                       VertDataMulN(q, 1.0f/numFaces);
-                       VertDataZero(r);
+                       VertDataMulN(q, 1.0f/numFaces, finterpCount);
+                       VertDataZero(r, finterpCount);
                        for (j=0; j<v->numEdges; j++) {
                                CCGEdge *e = v->edges[j];
-                               VertDataAdd(r, _edge_getCoVert(e, v, curLvl, 
1,vertDataSize));
+                               VertDataAdd(r, _edge_getCoVert(e, v, curLvl, 
1,vertDataSize), finterpCount);
                                numEdges++;
                        }
-                       VertDataMulN(r, 1.0f/numEdges);
+                       VertDataMulN(r, 1.0f/numEdges, finterpCount);
 
-                       VertDataCopy(nCo, co);
-                       VertDataMulN(nCo, numEdges-2.0f);
-                       VertDataAdd(nCo, q);
-                       VertDataAdd(nCo, r);
-                       VertDataMulN(nCo, 1.0f/numEdges);
+                       VertDataCopy(nCo, co, finterpCount);
+                       VertDataMulN(nCo, numEdges-2.0f, finterpCount);
+                       VertDataAdd(nCo, q, finterpCount);
+                       VertDataAdd(nCo, r, finterpCount);
+                       VertDataMulN(nCo, 1.0f/numEdges, finterpCount);
                }
 
                if ((sharpCount>1 && v->numFaces) || seam) {
-                       VertDataZero(q);
+                       VertDataZero(q, finterpCount);
 
                        if (seam) {
                                avgSharpness = 1.0f;
@@ -1576,32 +1624,32 @@
 
                                if (seam) {
                                        if (_edge_isBoundary(e))
-                                               VertDataAdd(q, 
_edge_getCoVert(e, v, curLvl, 1, vertDataSize));
+                                               VertDataAdd(q, 
_edge_getCoVert(e, v, curLvl, 1, vertDataSize), finterpCount);
                                } else if (sharpness != 0.0) {
-                                       VertDataAdd(q, _edge_getCoVert(e, v, 
curLvl, 1, vertDataSize));
+                                       VertDataAdd(q, _edge_getCoVert(e, v, 
curLvl, 1, vertDataSize), finterpCount);
                                }
                        }
 
-                       VertDataMulN(q, (float) 1/sharpCount);
+                       VertDataMulN(q, (float) 1/sharpCount, finterpCount);
 
                        if (sharpCount!=2 || allSharp) {
                                        // q = q + (co-q)*avgSharpness
-                               VertDataCopy(r, co);
-                               VertDataSub(r, q);
-                               VertDataMulN(r, avgSharpness);
-                               VertDataAdd(q, r);
+                               VertDataCopy(r, co, finterpCount);
+                               VertDataSub(r, q, finterpCount);
+                               VertDataMulN(r, avgSharpness, finterpCount);
+                               VertDataAdd(q, r, finterpCount);
                        }
 
                                // r = co*.75 + q*.25
-                       VertDataCopy(r, co);
-                       VertDataMulN(r, .75);
-                       VertDataMulN(q, .25);
-                       VertDataAdd(r, q);
+                       VertDataCopy(r, co, finterpCount);
+                       VertDataMulN(r, .75, finterpCount);
+                       VertDataMulN(q, .25, finterpCount);
+                       VertDataAdd(r, q, finterpCount);
 
                                // nCo = nCo  + (r-nCo)*avgSharpness
-                       VertDataSub(r, nCo);
-                       VertDataMulN(r, avgSharpness);

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to