Revision: 48315
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48315
Author:   psy-fi
Date:     2012-06-26 16:15:16 +0000 (Tue, 26 Jun 2012)
Log Message:
-----------
Add code to properly support tiled mode overlay. Not functional yet but
I am positive it's a matter of a few glTexEnv tweaks

Modified Paths:
--------------
    
branches/soc-2012-bratwurst/source/blender/editors/sculpt_paint/paint_cursor.c

Modified: 
branches/soc-2012-bratwurst/source/blender/editors/sculpt_paint/paint_cursor.c
===================================================================
--- 
branches/soc-2012-bratwurst/source/blender/editors/sculpt_paint/paint_cursor.c  
    2012-06-26 15:29:22 UTC (rev 48314)
+++ 
branches/soc-2012-bratwurst/source/blender/editors/sculpt_paint/paint_cursor.c  
    2012-06-26 16:15:16 UTC (rev 48315)
@@ -119,17 +119,23 @@
 static int load_tex(Brush *br, ViewContext *vc)
 {
        static GLuint overlay_texture = 0;
+       static GLuint overlay_texture_curve = 0;
        static int init = 0;
+       static int init_curve = 0;
        static int tex_changed_timestamp = -1;
        static int curve_changed_timestamp = -1;
        static Snapshot snap;
        static int old_size = -1;
+       static int old_curve_size = -1;
 
        GLubyte *buffer = NULL;
+       GLubyte *curve_buffer = NULL;
 
+       char do_tiled = (br->mtex.brush_map_mode == MTEX_MAP_MODE_TILED);
        int size;
+       int curve_size;
        int j;
-       int refresh;
+       int refresh, refresh_curve;
 
        if (br->mtex.brush_map_mode == MTEX_MAP_MODE_TILED && !br->mtex.tex) 
return 0;
        
@@ -142,7 +148,15 @@
            br->curve->changed_timestamp != curve_changed_timestamp ||
            !same_snap(&snap, br, vc);
 
-       if (refresh) {
+       refresh_curve = do_tiled &&
+               ((snap.BKE_brush_size_get != BKE_brush_size_get(vc->scene, br)) 
||
+               !br->curve ||
+               br->curve->changed_timestamp != curve_changed_timestamp);
+
+       if (refresh || refresh_curve) {
+               int s = BKE_brush_size_get(vc->scene, br);
+               int r = 1;
+
                if (br->mtex.tex && br->mtex.tex->preview)
                        tex_changed_timestamp = 
br->mtex.tex->preview->changed_timestamp[0];
 
@@ -151,24 +165,26 @@
 
                make_snap(&snap, br, vc);
 
-               if (br->mtex.brush_map_mode == MTEX_MAP_MODE_VIEW) {
-                       int s = BKE_brush_size_get(vc->scene, br);
-                       int r = 1;
+               for (s >>= 1; s > 0; s >>= 1)
+                       r++;
 
-                       for (s >>= 1; s > 0; s >>= 1)
-                               r++;
+               size = (1 << r);
 
-                       size = (1 << r);
+               if (size < 256)
+                       size = 256;
 
-                       if (size < 256)
-                               size = 256;
+               if (size < old_size)
+                       size = old_size;
 
-                       if (size < old_size)
-                               size = old_size;
+               if(do_tiled) {
+                       curve_size = size;
+                       size = 512;
                }
-               else
-                       size = 512;
 
+               if(!refresh) {
+                       size = old_size;
+               }
+
                if (old_size != size) {
                        if (overlay_texture) {
                                glDeleteTextures(1, &overlay_texture);
@@ -180,8 +196,30 @@
                        old_size = size;
                }
 
+               if (old_curve_size != curve_size) {
+                       if (overlay_texture_curve) {
+                               glDeleteTextures(1, &overlay_texture_curve);
+                               overlay_texture_curve = 0;
+                       }
+
+                       init_curve = 0;
+
+                       old_curve_size = curve_size;
+               }
+       }
+
+       /* image texture refresh */
+       if(refresh)
                buffer = MEM_mallocN(sizeof(GLubyte) * size * size, "load_tex");
 
+       if(refresh_curve)
+               curve_buffer = MEM_mallocN(sizeof(GLubyte) * curve_size * 
curve_size, "load_tex");
+
+       if(refresh) {
+               /* dummy call to avoid generating curve tables in openmp, 
causes memory leaks since allocation
+                * is not thread safe */
+               BKE_brush_curve_strength(br, 0.5, 1);
+
                #pragma omp parallel for schedule(static)
                for (j = 0; j < size; j++) {
                        int i;
@@ -204,7 +242,7 @@
                                x -= 0.5f;
                                y -= 0.5f;
 
-                               if (br->mtex.brush_map_mode == 
MTEX_MAP_MODE_TILED) {
+                               if (do_tiled) {
                                        x *= vc->ar->winx / radius;
                                        y *= vc->ar->winy / radius;
                                }
@@ -215,7 +253,7 @@
 
                                len = sqrtf(x * x + y * y);
 
-                               if ((br->mtex.brush_map_mode == 
MTEX_MAP_MODE_TILED) || len <= 1) {
+                               if (do_tiled || len <= 1) {
                                        /* it is probably worth optimizing for 
those cases where 
                                         * the texture is not rotated by 
skipping the calls to
                                         * atan2, sqrtf, sin, and cos. */
@@ -250,9 +288,6 @@
                if (!overlay_texture)
                        glGenTextures(1, &overlay_texture);
        }
-       else {
-               size = old_size;
-       }
 
        glBindTexture(GL_TEXTURE_2D, overlay_texture);
 
@@ -280,6 +315,83 @@
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, 
GL_CLAMP_TO_BORDER);
        }
 
+       if(refresh_curve) {
+               /* dummy call to avoid generating curve tables in openmp, 
causes memory leaks since allocation
+                * is not thread safe */
+               BKE_brush_curve_strength(br, 0.5, 1);
+
+               #pragma omp parallel for schedule(static)
+               for (j = 0; j < size; j++) {
+                       int i;
+                       float y;
+                       float len;
+
+                       for (i = 0; i < curve_size; i++) {
+                               int index = j * size + i;
+                               float x;
+                               float avg;
+
+                               x = (float)i / curve_size;
+                               y = (float)j / curve_size;
+
+                               x -= 0.5f;
+                               y -= 0.5f;
+
+                               x *= 2;
+                               y *= 2;
+
+                               len = sqrtf(x * x + y * y);
+
+                               if (len <= 1) {
+                                       x *= br->mtex.size[0];
+                                       y *= br->mtex.size[1];
+
+                                       x += br->mtex.ofs[0];
+                                       y += br->mtex.ofs[1];
+
+                                       avg = BKE_brush_curve_strength(br, len, 
1);  /* Falloff curve */
+
+                                       curve_buffer[index] = 255 - 
(GLubyte)(255 * avg);
+                               }
+                               else {
+                                       curve_buffer[index] = 0;
+                               }
+                       }
+               }
+
+               if (!overlay_texture_curve)
+                       glGenTextures(1, &overlay_texture_curve);
+       } else
+               return 1;
+
+       /* switch to second texture unit */
+       glActiveTexture(GL_TEXTURE1);
+       glBindTexture(GL_TEXTURE_2D, overlay_texture_curve);
+
+       if (refresh_curve) {
+               if (!init_curve) {
+                       glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, curve_size, 
curve_size, 0, GL_ALPHA, GL_UNSIGNED_BYTE, curve_buffer);
+                       init_curve = 1;
+               }
+               else {
+                       glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, curve_size, 
curve_size, GL_ALPHA, GL_UNSIGNED_BYTE, curve_buffer);
+               }
+
+               if(curve_buffer)
+                       MEM_freeN(curve_buffer);
+       }
+
+       glEnable(GL_TEXTURE_2D);
+
+       glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
+
+       glActiveTexture(GL_TEXTURE0);
+
        return 1;
 }
 
@@ -432,10 +544,11 @@
                        }
                }
                else {
-                       quad.xmin = 0;
-                       quad.ymin = 0;
-                       quad.xmax = vc->ar->winrct.xmax - vc->ar->winrct.xmin;
-                       quad.ymax = vc->ar->winrct.ymax - vc->ar->winrct.ymin;
+                       const int radius = BKE_brush_size_get(vc->scene, brush);
+                       quad.xmin = x - radius;
+                       quad.ymin = y - radius;
+                       quad.xmax = x + radius;
+                       quad.ymax = y + radius;
                }
 
                /* set quad color */
@@ -446,16 +559,37 @@
 
                /* draw textured quad */
                glBegin(GL_QUADS);
-               glTexCoord2f(0, 0);
-               glVertex2f(quad.xmin, quad.ymin);
-               glTexCoord2f(1, 0);
-               glVertex2f(quad.xmax, quad.ymin);
-               glTexCoord2f(1, 1);
-               glVertex2f(quad.xmax, quad.ymax);
-               glTexCoord2f(0, 1);
-               glVertex2f(quad.xmin, quad.ymax);
+               if(brush->mtex.brush_map_mode == MTEX_MAP_MODE_VIEW) {
+                       glTexCoord2f(0, 0);
+                       glVertex2f(quad.xmin, quad.ymin);
+                       glTexCoord2f(1, 0);
+                       glVertex2f(quad.xmax, quad.ymin);
+                       glTexCoord2f(1, 1);
+                       glVertex2f(quad.xmax, quad.ymax);
+                       glTexCoord2f(0, 1);
+                       glVertex2f(quad.xmin, quad.ymax);
+               } else {
+                       short sizex = vc->ar->winrct.xmax - vc->ar->winrct.xmin;
+                       short sizey = vc->ar->winrct.ymax - vc->ar->winrct.ymin;
+                       glTexCoord2f(quad.xmin/sizex, quad.ymin/sizey);
+                       glMultiTexCoord2f(GL_TEXTURE1, 0, 0);
+                       glVertex2f(quad.xmin, quad.ymin);
+                       glTexCoord2f(quad.xmax/sizex, quad.ymin/sizey);
+                       glMultiTexCoord2f(GL_TEXTURE1, 1, 0);
+                       glVertex2f(quad.xmax, quad.ymin);
+                       glTexCoord2f(quad.xmax/sizex, quad.ymax/sizey);
+                       glMultiTexCoord2f(GL_TEXTURE1, 1, 1);
+                       glVertex2f(quad.xmax, quad.ymax);
+                       glTexCoord2f(quad.xmin/sizex, quad.ymax/sizey);
+                       glMultiTexCoord2f(GL_TEXTURE1, 0, 1);
+                       glVertex2f(quad.xmin, quad.ymax);
+               }
                glEnd();
 
+               /* should be caught by enable bits but do explicitly just in 
case..*/
+               glActiveTexture(GL_TEXTURE1);
+               glDisable(GL_TEXTURE_2D);
+
                glPopMatrix();
        }
 

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

Reply via email to