Revision: 29871
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29871
Author:   jwilkins
Date:     2010-07-02 14:39:39 +0200 (Fri, 02 Jul 2010)

Log Message:
-----------
* overlay texture now only updates when the texture has changed
* overlay does not delete/recreate the texture slot, but uses glTexSubImage to 
update the existing texture
* overlay texture now has alpha so that blacker areas are also more transparent
* overlay texture size increased to 512x512
* added a 'changed_timestamp' field to the texture preview structure to allow 
notification if the preview has changed to be monitored by more parts of the 
program than just the icon renderer
* All of this is the first step in unifying the overlay with a new texcache
* Also first steps in making the overlay a seperate operator

Modified Paths:
--------------
    branches/soc-2010-jwilkins/source/blender/blenkernel/intern/brush.c
    branches/soc-2010-jwilkins/source/blender/blenkernel/intern/icons.c
    
branches/soc-2010-jwilkins/source/blender/editors/interface/interface_icons.c
    
branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/paint_stroke.c
    branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt.c
    branches/soc-2010-jwilkins/source/blender/makesdna/DNA_ID.h
    branches/soc-2010-jwilkins/source/blender/makesdna/DNA_brush_types.h

Modified: branches/soc-2010-jwilkins/source/blender/blenkernel/intern/brush.c
===================================================================
--- branches/soc-2010-jwilkins/source/blender/blenkernel/intern/brush.c 
2010-07-02 11:26:12 UTC (rev 29870)
+++ branches/soc-2010-jwilkins/source/blender/blenkernel/intern/brush.c 
2010-07-02 12:39:39 UTC (rev 29871)
@@ -101,8 +101,6 @@
        /* BRUSH TEXTURE SETTINGS */
        brush->texture_sample_bias = 0; /* value to added to texture samples */
 
-       brush->overlay_texture = 0; /* toggles whether the texture is shown as 
an overlay when not sculpting 0 is off */
-
        brush->autosmooth_factor = 0;
 
        brush->crease_pinch_factor = 2.0f/3.0f;
@@ -957,7 +955,7 @@
 
        memset(&texres, 0, sizeof(TexResult));
        
-       if(mtex && mtex->tex) {
+       if(mtex->tex) {
                float x, y, step = 2.0 / side, co[3];
 
                texcache = MEM_callocN(sizeof(int) * side * side, "Brush 
texture cache");

Modified: branches/soc-2010-jwilkins/source/blender/blenkernel/intern/icons.c
===================================================================
--- branches/soc-2010-jwilkins/source/blender/blenkernel/intern/icons.c 
2010-07-02 11:26:12 UTC (rev 29870)
+++ branches/soc-2010-jwilkins/source/blender/blenkernel/intern/icons.c 
2010-07-02 12:39:39 UTC (rev 29871)
@@ -121,6 +121,7 @@
 
        for (i=0; i<PREVIEW_MIPMAPS; ++i) {
                prv_img->changed[i] = 1;
+               prv_img->changed_timestamp[i] = 0;
        }
        return prv_img;
 }
@@ -248,6 +249,7 @@
                        int i;
                        for (i=0; i<PREVIEW_MIPMAPS; ++i) {
                                prv->changed[i] = 1;
+                               prv->changed_timestamp[i]++;
                        }
                }
        }       

Modified: 
branches/soc-2010-jwilkins/source/blender/editors/interface/interface_icons.c
===================================================================
--- 
branches/soc-2010-jwilkins/source/blender/editors/interface/interface_icons.c   
    2010-07-02 11:26:12 UTC (rev 29870)
+++ 
branches/soc-2010-jwilkins/source/blender/editors/interface/interface_icons.c   
    2010-07-02 12:39:39 UTC (rev 29871)
@@ -767,6 +767,7 @@
                prv_img->w[miplevel] = size;
                prv_img->h[miplevel] = size;
                prv_img->changed[miplevel] = 1;
+               prv_img->changed_timestamp[miplevel] = 0;
                prv_img->rect[miplevel] = MEM_callocN(size*size*sizeof(unsigned 
int), "prv_rect"); 
        }
 }

Modified: 
branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/paint_stroke.c
===================================================================
--- 
branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/paint_stroke.c   
    2010-07-02 11:26:12 UTC (rev 29870)
+++ 
branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/paint_stroke.c   
    2010-07-02 12:39:39 UTC (rev 29871)
@@ -171,13 +171,13 @@
 
 static void load_grid(Brush* brush)
 {
-       static int loaded = 0;
+       static GLint overlay_texture;
 
-       if (!loaded) {
+       if (!overlay_texture) {
                //GLfloat largest_supported_anisotropy;
 
-               glGenTextures(1, (GLint*)(&(brush->overlay_texture)));
-               glBindTexture(GL_TEXTURE_2D, brush->overlay_texture);
+               glGenTextures(1, &overlay_texture);
+               glBindTexture(GL_TEXTURE_2D, overlay_texture);
                glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 16, 0, GL_RGBA, 
GL_UNSIGNED_BYTE, grid_texture0);
                glTexImage2D(GL_TEXTURE_2D, 1, GL_RGB,  8,  8, 0, GL_RGBA, 
GL_UNSIGNED_BYTE, grid_texture1);
                glTexImage2D(GL_TEXTURE_2D, 2, GL_RGB,  4,  4, 0, GL_RGBA, 
GL_UNSIGNED_BYTE, grid_texture2);
@@ -193,77 +193,142 @@
 
                //glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, 
&largest_supported_anisotropy);
                //glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 
largest_supported_anisotropy);
-
-               loaded = 1;
        }
 }
 
 extern float get_tex_pixel(Brush* br, float u, float v);
 
-static void load_tex(Brush* brush, ViewContext* vc)
+typedef struct Snapshot {
+       float size[3];
+       float ofs[3];
+       float rot;
+       int brush_size;
+       int winx;
+       int winy;
+} Snapshot;
+
+static int same_snap(Snapshot* snap, Brush* brush, ViewContext* vc)
 {
-       float* buffer;
+       MTex* mtex = &brush->mtex;
+
+       return 
+               mtex->ofs[0] == snap->ofs[0] &&
+               mtex->ofs[1] == snap->ofs[1] &&
+               mtex->ofs[2] == snap->ofs[2] &&
+               mtex->size[0] == snap->size[0] &&
+               mtex->size[1] == snap->size[1] &&
+               mtex->size[2] == snap->size[2] &&
+               mtex->rot == snap->rot &&
+               brush->size == snap->brush_size &&
+               vc->ar->winx == snap->winx &&
+               vc->ar->winy == snap->winy;
+}
+
+static void make_snap(Snapshot* snap, Brush* brush, ViewContext* vc)
+{
+       copy_v3_v3(snap->ofs, brush->mtex.ofs);
+       copy_v3_v3(snap->size, brush->mtex.size);
+       snap->rot = brush->mtex.rot;
+       snap->brush_size = brush->size;
+       snap->winx = vc->ar->winx;
+       snap->winy = vc->ar->winy;
+}
+
+static int load_tex(Brush* brush, ViewContext* vc)
+{
+       static GLint overlay_texture = 0;
+       static int init = 0;
+       static int changed_timestamp = -1;
+       static Snapshot snap;
+
+       float* buffer = 0;
        float* p;
 
        int width, height;
        float x, y;
        int i, j;
        float xlim, ylim;
+       int refresh;
 
-       if (brush->overlay_texture) glDeleteTextures(1, 
(GLint*)(&brush->overlay_texture));
+       if (!brush->mtex.tex) return 0;
 
-       width = height = 256;
+       refresh = 
+               !overlay_texture ||
+               !brush->mtex.tex->preview ||
+               brush->mtex.tex->preview->changed_timestamp[0] != 
changed_timestamp ||
+               !same_snap(&snap, brush, vc);
 
-       p = buffer = MEM_mallocN(sizeof(float)*width*height, "load_tex");
+       if (refresh) {
+               if (brush->mtex.tex->preview)
+                       changed_timestamp = 
brush->mtex.tex->preview->changed_timestamp[0];
 
-       xlim = brush->size / (float)vc->ar->winx  *  width;
-       ylim = brush->size / (float)vc->ar->winy  *  height;
+               make_snap(&snap, brush, vc);
 
-       for (j = 0, y = 0; j < height; j++, y = j/ylim) {
-               for (i = 0, x = 0; i < width; i++, x = i/xlim) {
+               width = height = 512;
 
-                       // largely duplicated from tex_strength
+               p = buffer = MEM_mallocN(2*sizeof(float)*width*height, 
"load_tex");
 
-                       const float rotation = -brush->mtex.rot;
-                       float diameter = brush->size;
+               xlim = brush->size / (float)vc->ar->winx  *  width;
+               ylim = brush->size / (float)vc->ar->winy  *  height;
 
-                       x = (float)i/width;
-                       y = (float)j/height;
+               for (j = 0, y = 0; j < height; j++, y = j/ylim) {
+                       for (i = 0, x = 0; i < width; i++, x = i/xlim) {
 
-                       x -= 0.5f;
-                       y -= 0.5f;
-                       
-                       x *= vc->ar->winx / diameter;
-                       y *= vc->ar->winy / diameter;
+                               // largely duplicated from tex_strength
 
-                       /* it is probably worth optimizing for those cases 
where 
-                          the texture is not rotated by skipping the calls to
-                          atan2, sqrtf, sin, and cos. */
-                       if (rotation > 0.001 || rotation < -0.001) {
-                               const float angle    = atan2(y, x) + rotation;
-                               const float flen     = sqrtf(x*x + y*y);
+                               const float rotation = -brush->mtex.rot;
+                               float diameter = brush->size;
 
-                               x = flen * cos(angle);
-                               y = flen * sin(angle);
-                       }
+                               x = (float)i/width;
+                               y = (float)j/height;
 
-                       x *= brush->mtex.size[0];
-                       y *= brush->mtex.size[1];
+                               x -= 0.5f;
+                               y -= 0.5f;
+                               
+                               x *= vc->ar->winx / diameter;
+                               y *= vc->ar->winy / diameter;
 
-                       x += brush->mtex.ofs[0];
-                       y += brush->mtex.ofs[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. */
+                               if (rotation > 0.001 || rotation < -0.001) {
+                                       const float angle    = atan2(y, x) + 
rotation;
+                                       const float flen     = sqrtf(x*x + y*y);
 
-                       *p = get_tex_pixel(brush, x, y);
+                                       x = flen * cos(angle);
+                                       y = flen * sin(angle);
+                               }
 
-                       p++;
+                               x *= brush->mtex.size[0];
+                               y *= brush->mtex.size[1];
+
+                               x += brush->mtex.ofs[0];
+                               y += brush->mtex.ofs[1];
+
+                               *p = *(p+1) = get_tex_pixel(brush, x, y);
+
+                               p += 2;
+                       }
                }
+
+               if (!overlay_texture)
+                       glGenTextures(1, &overlay_texture);
        }
 
-       glGenTextures(1, (GLint*)(&(brush->overlay_texture)));
+       glBindTexture(GL_TEXTURE_2D, overlay_texture);
 
-       glBindTexture(GL_TEXTURE_2D, brush->overlay_texture);
+       if (refresh) {
+               if (!init) {
+                       glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 
width, height, 0, GL_LUMINANCE_ALPHA, GL_FLOAT, buffer);
+                       init = 1;
+               }
+               else {
+                       glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, 
GL_LUMINANCE_ALPHA, GL_FLOAT, buffer);
+               }
 
-       glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, width, height, 0, 
GL_LUMINANCE, GL_FLOAT, buffer);
+               if (buffer)
+                       MEM_freeN(buffer);
+       }
 
        glEnable(GL_TEXTURE_2D);
 
@@ -271,7 +336,7 @@
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 
-       MEM_freeN(buffer);
+       return 1;
 }
 
 /* Convert a point in model coordinates to 2D screen coordinates. */
@@ -643,48 +708,34 @@
                                        GL_VIEWPORT_BIT|
                                        GL_TEXTURE_BIT);
 
-                               glColor4f(col[0], col[1], col[2], alpha);
+                               if (load_tex(brush, &vc)) {
+                                       glColor4f(col[0], col[1], col[2], 
alpha);
 
-                               glEnable(GL_BLEND);
+                                       glEnable(GL_BLEND);
 
-                               load_tex(brush, &vc);
+                                       glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, 
GL_TRUE);
+                                       glDepthMask(GL_FALSE);
+                                       glDepthFunc(GL_ALWAYS);
 
-                               glEnable(GL_TEXTURE_2D);
-                               glBindTexture(GL_TEXTURE_2D, 
brush->overlay_texture);
+                                       glMatrixMode(GL_TEXTURE);
+                                       glLoadIdentity();
 
-                               glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, 
GL_FALSE);
-                               glDepthMask(GL_FALSE);
-                               glDepthFunc(GL_ALWAYS);
+                                       glColor4f(1.0f, 1.0f, 1.0f, 
brush->texture_overlay_alpha / 100.0f);
+                                       glBegin(GL_QUADS);
+                                               glTexCoord2f(0, 0);
+                                               glVertex2f(0, 0);
 
-                               glMatrixMode(GL_TEXTURE);
-                               glLoadIdentity();
+                                               glTexCoord2f(1, 0);
+                                               glVertex2f(viewport[2], 0);
 
-                               glColor4f(1.0f, 1.0f, 1.0f, 
brush->texture_overlay_alpha / 100.0f);
-                               glBegin(GL_QUADS);
-                                       glTexCoord2f(0, 0);
-                                       glVertex2f(0, 0);
+                                               glTexCoord2f(1, 1);
+                                               glVertex2f(viewport[2], 
viewport[3]);
 
-                                       glTexCoord2f(1, 0);
-                                       glVertex2f(viewport[2], 0);
+                                               glTexCoord2f(0, 1);
+                                               glVertex2f(0, viewport[3]);
+                                       glEnd();
+                               }
 
-                                       glTexCoord2f(1, 1);
-                                       glVertex2f(viewport[2], viewport[3]);
-
-                                       glTexCoord2f(0, 1);
-                                       glVertex2f(0, viewport[3]);
-                               glEnd();
-
-                               glLoadIdentity();
-
-                               glMatrixMode(GL_MODELVIEW);
-
-                               glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
-
-                               glDisable(GL_TEXTURE_2D);
-
-                               glDepthMask(GL_TRUE);
-                               glDepthFunc(GL_LEQUAL);
-
                                glPopAttrib();
                        }
                }

Modified: 
branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt.c
===================================================================
--- branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt.c     
2010-07-02 11:26:12 UTC (rev 29870)

@@ 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