Revision: 17695
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17695
Author:   campbellbarton
Date:     2008-12-03 17:17:59 +0100 (Wed, 03 Dec 2008)

Log Message:
-----------
* remove warnings
* style fits with blenders more
* use rctf and rcti and rctf types rather then float[4]
* some loops were confusing, use for loops rather then while or do/while

Modified Paths:
--------------
    branches/projection-paint/source/blender/src/imagepaint.c

Modified: branches/projection-paint/source/blender/src/imagepaint.c
===================================================================
--- branches/projection-paint/source/blender/src/imagepaint.c   2008-12-03 
15:49:41 UTC (rev 17694)
+++ branches/projection-paint/source/blender/src/imagepaint.c   2008-12-03 
16:17:59 UTC (rev 17695)
@@ -181,12 +181,6 @@
 /* vert flags */
 #define PROJ_VERT_CULL 1
 
-/* only for readability */
-#define PROJ_BUCKET_LEFT       0
-#define PROJ_BUCKET_RIGHT      1
-#define PROJ_BUCKET_BOTTOM     2
-#define PROJ_BUCKET_TOP                3
-
 /* This is mainly a convenience struct used so we can keep an array of images 
we use
  * Thir imbufs, etc, in 1 array, When using threads this array is copied for 
each thread
  * because 'partRedrawRect' and 'touch' values would not be thread safe */
@@ -219,14 +213,14 @@
        MemArena *arena_mt[BLENDER_MAX_THREADS];                /* Same as 
above but use for multithreading */
        LinkNode **bucketRect;                          /* screen sized 2D 
array, each pixel has a linked list of ProjPixel's */
        LinkNode **bucketFaces;                         /* bucketRect alligned 
array linkList of faces overlapping each bucket */
-       char *bucketFlags;                                      /* store if the 
bucks have been initialized  */
+       unsigned char *bucketFlags;                                     /* 
store if the bucks have been initialized  */
 #ifndef PROJ_DEBUG_NOSEAMBLEED
        char *faceSeamFlags;                            /* store info about 
faces, if they are initialized etc*/
        float (*faceSeamUVs)[4][2];                     /* expanded UVs for 
faces to use as seams */
        LinkNode **vertFaces;                           /* Only needed for when 
seam_bleed_px is enabled, use to find UV seams */
        char *vertFlags;                                        /* store 
options per vert, now only store if the vert is pointing away from the view */
 #endif
-       int buckets_x;                                          /* The size of 
the bucket grid, the grid span's screen_min/screen_max so you can paint outsize 
the screen or with 2 brushes at once */
+       int buckets_x;                                          /* The size of 
the bucket grid, the grid span's screenMin/screenMax so you can paint outsize 
the screen or with 2 brushes at once */
        int buckets_y;
        
        ProjPaintImage *projImages;
@@ -235,6 +229,11 @@
        
        float (*screenCoords)[4];       /* verts projected into floating point 
screen space */
        
+       float screenMin[2];                     /* 2D bounds for mesh verts on 
the screen's plane (screenspace) */
+       float screenMax[2]; 
+       float screen_width;                     /* Calculated from screenMin & 
screenMax */
+       float screen_height;
+       
        /* options for projection painting */
        short do_occlude;                       /* Use raytraced occlusion? - 
ortherwise will paint right through to the back*/
        short do_backfacecull;  /* ignore faces with normals pointing away, 
skips a lot of raycasts if your normals are correctly flipped */
@@ -246,7 +245,7 @@
        float seam_bleed_px;
 #endif
        /* clone vars */
-       float clone_offset[2];
+       float cloneOffset[2];
        int clone_layer;                        /* -1 when not in use */
        
        float projectMat[4][4];         /* Projection matrix, use for getting 
screen coords */
@@ -255,15 +254,10 @@
        float viewPos[3];                       /* View location in object 
relative 3D space, so can compare to verts  */
        float clipsta, clipend;
        
-       float screen_min[2];                    /* 2D bounds for mesh verts on 
the screen's plane (screenspace) */
-       float screen_max[2]; 
-       float screen_width;                     /* Calculated from screen_min & 
screen_max */
-       float screen_height;
-       
        /* threads */
        int thread_tot;
-       int bucket_min[2];
-       int bucket_max[2];
+       int bucketMin[2];
+       int bucketMax[2];
        int context_bucket_x, context_bucket_y; /* must lock threads while 
accessing these */
 } ProjPaintState;
 
@@ -488,14 +482,14 @@
         * ps->bucketRect[x + (y*ps->buckets_y)] */
        
        /* please explain?
-        * projCoSS[0] - ps->screen_min[0]      : zero origin
+        * projCoSS[0] - ps->screenMin[0]       : zero origin
         * ... / ps->screen_width                               : range from 
0.0 to 1.0
         * ... * ps->buckets_x          : use as a bucket index
         *
         * Second multiplication does similar but for vertical offset
         */
-       return  (       (int)(( (projCoSS[0] - ps->screen_min[0]) / 
ps->screen_width)  * ps->buckets_x)) + 
-               (       (       (int)(( (projCoSS[1] - ps->screen_min[1])  / 
ps->screen_height) * ps->buckets_y)) * ps->buckets_x );
+       return  (       (int)(((projCoSS[0] - ps->screenMin[0]) / 
ps->screen_width)  * ps->buckets_x)) + 
+               (       (       (int)(((projCoSS[1] - ps->screenMin[1])  / 
ps->screen_height) * ps->buckets_y)) * ps->buckets_x);
 }
 
 static int project_bucket_offset_safe(const ProjPaintState *ps, const float 
projCoSS[2])
@@ -504,13 +498,15 @@
        
        if (bucket_index < 0 || bucket_index >= ps->buckets_x*ps->buckets_y) {  
                return -1;
-       } else {
+       }
+       else {
                return bucket_index;
        }
 }
 
 /* The point must be inside the triangle */
-static void BarycentricWeightsSimple2f(const float v1[2], const float v2[2], 
const float v3[2], const float pt[2], float w[3]) {
+static void BarycentricWeightsSimple2f(float v1[2], float v2[2], float v3[2], 
float pt[2], float w[3])
+{
        float wtot, wtot_inv;
        w[0] = AreaF2Dfl(v2, v3, pt);
        w[1] = AreaF2Dfl(v3, v1, pt);
@@ -521,14 +517,16 @@
                w[0]*=wtot_inv;
                w[1]*=wtot_inv;
                w[2]*=wtot_inv;
-       } else {
+       }
+       else {
                w[0] = w[1] = w[2] = 1.0/3.0; /* dummy values for zero area 
face */
        }
 }
 
 /* also works for points outside the triangle */
-#define SIDE_OF_LINE(pa,pb,pp) 
((pa[0]-pp[0])*(pb[1]-pp[1]))-((pb[0]-pp[0])*(pa[1]-pp[1]))
-static void BarycentricWeights2f(const float v1[2], const float v2[2], const 
float v3[2], const float pt[2], float w[3]) {
+#define SIDE_OF_LINE(pa, pb, pp)       
((pa[0]-pp[0])*(pb[1]-pp[1]))-((pb[0]-pp[0])*(pa[1]-pp[1]))
+static void BarycentricWeights2f(float v1[2], float v2[2], float v3[2], float 
pt[2], float w[3])
+{
        float wtot_inv, wtot = AreaF2Dfl(v1, v2, v3);
        if (wtot > 0.0f) {
                wtot_inv = 1.0f / wtot;
@@ -545,16 +543,18 @@
 
                if ((SIDE_OF_LINE(v1,v2, pt)>0.0f) != (SIDE_OF_LINE(v1,v2, 
v3)>0.0f))   w[2]*= -wtot_inv;
                else                                                            
                                                                w[2]*=  
wtot_inv;
-       } else {
+       }
+       else {
                w[0] = w[1] = w[2] = 1.0f/3.0f; /* dummy values for zero area 
face */
        }
 }
 
 /* still use 2D X,Y space but this works for verts transformed by a 
perspective matrix, using their 4th component as a weight */
 
-static void BarycentricWeightsPersp2f(const float v1[4], const float v2[4], 
const float v3[4], const float pt[2], float w[3]) {
+static void BarycentricWeightsPersp2f(float v1[4], float v2[4], float v3[4], 
float pt[2], float w[3])
+{
        float persp_tot, persp_tot_inv;
-       BarycentricWeights2f(v1,v2,v3,pt,w);
+       BarycentricWeights2f(v1, v2, v3, pt, w);
        
        w[0] /= v1[3];
        w[1] /= v2[3];
@@ -566,15 +566,16 @@
                w[0] *= persp_tot_inv;
                w[1] *= persp_tot_inv;
                w[2] *= persp_tot_inv;
-       } else {
+       }
+       else {
                w[0] = w[1] = w[2] = 1.0f/3.0f; /* dummy values for zero area 
face */
        }
 }
 
-static void BarycentricWeightsSimplePersp2f(const float v1[4], const float 
v2[4], const float v3[4], const float pt[2], float w[3])
+static void BarycentricWeightsSimplePersp2f(float v1[4], float v2[4], float 
v3[4], float pt[2], float w[3])
 {
        float persp_tot_inv, persp_tot;
-       BarycentricWeightsSimple2f(v1,v2,v3,pt,w);
+       BarycentricWeightsSimple2f(v1, v2, v3, pt, w);
        
        w[0] /= v1[3];
        w[1] /= v2[3];
@@ -586,7 +587,8 @@
                w[0] *= persp_tot_inv;
                w[1] *= persp_tot_inv;
                w[2] *= persp_tot_inv;
-       } else {
+       }
+       else {
                w[0] = w[1] = w[2] = 1.0f/3.0f; /* dummy values for zero area 
face */
        }
 }
@@ -604,15 +606,16 @@
        p[1] = v1[1]*w[0] + v2[1]*w[1] + v3[1]*w[2];
 }
 
-static float tri_depth_2d(const float v1[3], const float v2[3], const float 
v3[3], const float pt[2], float w[3])
+static float tri_depth_2d(float v1[3], float v2[3], float v3[3], float pt[2], 
float w[3])
 {
-       BarycentricWeightsSimple2f(v1,v2,v3,pt,w);
+       BarycentricWeightsSimple2f(v1, v2, v3, pt, w);
        return (v1[2]*w[0]) + (v2[2]*w[1]) + (v3[2]*w[2]);
 }
 
 
 /* Return the top-most face index that the screen space coord 'pt' touches (or 
-1) */
-static int project_paint_PickFace(const ProjPaintState *ps, const float pt[2], 
float w[3], int *side) {
+static int project_paint_PickFace(const ProjPaintState *ps, float pt[2], float 
w[3], int *side)
+{
        LinkNode *node;
        float w_tmp[3];
        float *v1, *v2, *v3, *v4;
@@ -627,42 +630,41 @@
        if (bucket_index==-1)
                return -1;
        
-       node = ps->bucketFaces[bucket_index];
        
+       
        /* we could return 0 for 1 face buckets, as long as this function 
assumes
         * that the point its testing is only every originated from an existing 
face */
        
-       while (node) {
-               face_index = (int)node->link;
-               mf = ps->dm_mface + face_index;
+       for (node= ps->bucketFaces[bucket_index]; node; node= node->next) {
+               face_index = GET_INT_FROM_POINTER(node->link);
+               mf= ps->dm_mface + face_index;
                
-               v1 = ps->screenCoords[mf->v1];
-               v2 = ps->screenCoords[mf->v2];
-               v3 = ps->screenCoords[mf->v3];
+               v1= ps->screenCoords[mf->v1];
+               v2= ps->screenCoords[mf->v2];
+               v3= ps->screenCoords[mf->v3];
                
-               if ( IsectPT2Df(pt, v1, v2, v3) ) {
-                       z_depth = tri_depth_2d(v1,v2,v3,pt,w_tmp);
+               if (IsectPT2Df(pt, v1, v2, v3)) {
+                       z_depth= tri_depth_2d(v1, v2, v3, pt, w_tmp);
                        if (z_depth < z_depth_best) {
                                best_face_index = face_index;
                                best_side = 0;
                                z_depth_best = z_depth;
                                VECCOPY(w, w_tmp);
                        }
-               } else if (mf->v4) {
-                       v4 = ps->screenCoords[mf->v4];
+               }
+               else if (mf->v4) {
+                       v4= ps->screenCoords[mf->v4];
                        
-                       if ( IsectPT2Df(pt, v1, v3, v4) ) {
-                               z_depth = tri_depth_2d(v1,v3,v4,pt,w_tmp);
+                       if (IsectPT2Df(pt, v1, v3, v4)) {
+                               z_depth= tri_depth_2d(v1, v3, v4, pt, w_tmp);
                                if (z_depth < z_depth_best) {
                                        best_face_index = face_index;
-                                       best_side = 1;
+                                       best_side= 1;
                                        z_depth_best = z_depth;
                                        VECCOPY(w, w_tmp);
                                }
                        }
                }
-               
-               node = node->next;
        }
        
        *side = best_side;
@@ -670,17 +672,17 @@
 }
 
 /* Set the top-most face color that the screen space coord 'pt' touches (or 
return 0 if none touch) */
-static int project_paint_PickColor(const ProjPaintState *ps, const float 
pt[2], float *rgba_fp, unsigned char *rgba, const int interp)
+static int project_paint_PickColor(const ProjPaintState *ps, float pt[2], 
float *rgba_fp, unsigned char *rgba, const int interp)
 {
        float w[3], uv[2];
        int side;
        int face_index;
        MTFace *tf;
        ImBuf *ibuf;
-       int xi,yi;
+       int xi, yi;
        
        
-       face_index = project_paint_PickFace(ps,pt,w, &side);
+       face_index = project_paint_PickFace(ps, pt, w, &side);
        
        if (face_index == -1)
                return 0;
@@ -689,7 +691,8 @@
        
        if (side == 0) {
                Vec2Weightf(uv, tf->uv[0], tf->uv[1], tf->uv[2], w);
-       } else { /* QUAD */
+       }
+       else { /* QUAD */
                Vec2Weightf(uv, tf->uv[0], tf->uv[2], tf->uv[3], w);
        }
        
@@ -698,7 +701,7 @@
 
        
        if (interp) {
-               float x,y;
+               float x, y;

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to