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