[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18617] branches/blender2.5/blender/source /blender: * Fixed some crashiness with sculpt file loading
Nicholas Bishop
nicholasbishop at gmail.com
Thu Jan 22 05:22:27 CET 2009
Revision: 18617
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18617
Author: nicholasbishop
Date: 2009-01-22 05:22:26 +0100 (Thu, 22 Jan 2009)
Log Message:
-----------
* Fixed some crashiness with sculpt file loading
* Added undo push for toggling sculpt mode
* Little optimization for brush texture, was generating quite large textures unecessarily
Modified Paths:
--------------
branches/blender2.5/blender/source/blender/blenkernel/BKE_sculpt.h
branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
branches/blender2.5/blender/source/blender/editors/sculpt/sculpt.c
Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_sculpt.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_sculpt.h 2009-01-22 01:58:38 UTC (rev 18616)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_sculpt.h 2009-01-22 04:22:26 UTC (rev 18617)
@@ -51,7 +51,7 @@
ListBase damaged_verts;
/* Used to cache the render of the active texture */
- unsigned int texcache_w, texcache_h, *texcache;
+ unsigned int texcache_side, *texcache, texcache_actual;
void *cursor; /* wm handle */
Modified: branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c 2009-01-22 01:58:38 UTC (rev 18616)
+++ branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c 2009-01-22 04:22:26 UTC (rev 18617)
@@ -3689,6 +3689,9 @@
sce->ima= newlibadr_us(fd, sce->id.lib, sce->ima);
sce->toolsettings->imapaint.brush=
newlibadr_us(fd, sce->id.lib, sce->toolsettings->imapaint.brush);
+ if(sce->toolsettings->sculpt)
+ sce->toolsettings->sculpt->brush=
+ newlibadr_us(fd, sce->id.lib, sce->toolsettings->sculpt->brush);
for(base= sce->base.first; base; base= next) {
next= base->next;
@@ -3781,7 +3784,7 @@
sce->toolsettings->wpaint= newdataadr(fd, sce->toolsettings->wpaint);
sce->toolsettings->sculpt= newdataadr(fd, sce->toolsettings->sculpt);
if(sce->toolsettings->sculpt)
- sce->toolsettings->sculpt->session= NULL;
+ sce->toolsettings->sculpt->session= MEM_callocN(sizeof(SculptSession), "reload sculpt session");
}
if(sce->ed) {
Modified: branches/blender2.5/blender/source/blender/editors/sculpt/sculpt.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/sculpt/sculpt.c 2009-01-22 01:58:38 UTC (rev 18616)
+++ branches/blender2.5/blender/source/blender/editors/sculpt/sculpt.c 2009-01-22 04:22:26 UTC (rev 18617)
@@ -98,9 +98,6 @@
/* Number of vertices to average in order to determine the flatten distance */
#define FLATTEN_SAMPLE_SIZE 10
-/* Texture cache size */
-#define TC_SIZE 256
-
/* ===== STRUCTS =====
*
*/
@@ -642,28 +639,28 @@
static unsigned char get_texcache_pixel(const SculptSession *ss, int px, int py)
{
unsigned *p;
- p = ss->texcache + py * ss->texcache_w + px;
+ p = ss->texcache + py * ss->texcache_side + px;
return ((unsigned char*)(p))[0];
}
static float get_texcache_pixel_bilinear(const SculptSession *ss, float u, float v)
{
int x, y, x2, y2;
- const int tc_max = TC_SIZE - 1;
+ const int tc_max = ss->texcache_side - 1;
float urat, vrat, uopp;
if(u < 0) u = 0;
- else if(u >= TC_SIZE) u = tc_max;
+ else if(u >= ss->texcache_side) u = tc_max;
if(v < 0) v = 0;
- else if(v >= TC_SIZE) v = tc_max;
+ else if(v >= ss->texcache_side) v = tc_max;
x = floor(u);
y = floor(v);
x2 = x + 1;
y2 = y + 1;
- if(x2 > TC_SIZE) x2 = tc_max;
- if(y2 > TC_SIZE) y2 = tc_max;
+ if(x2 > ss->texcache_side) x2 = tc_max;
+ if(y2 > ss->texcache_side) y2 = tc_max;
urat = u - x;
vrat = v - y;
@@ -738,7 +735,7 @@
px %= sx-1;
if(sy != 1)
py %= sy-1;
- avg= get_texcache_pixel_bilinear(ss, TC_SIZE*px/sx, TC_SIZE*py/sy);
+ avg= get_texcache_pixel_bilinear(ss, ss->texcache_side*px/sx, ss->texcache_side*py/sy);
} else {
float fx= (point_2d[0] - ss->cache->mouse[0]) / bsize;
float fy= (point_2d[1] - ss->cache->mouse[1]) / bsize;
@@ -749,7 +746,7 @@
fx = flen * cos(angle) + 0.5;
fy = flen * sin(angle) + 0.5;
- avg= get_texcache_pixel_bilinear(ss, fx * TC_SIZE, fy * TC_SIZE);
+ avg= get_texcache_pixel_bilinear(ss, fx * ss->texcache_side, fy * ss->texcache_side);
}
}
@@ -1025,7 +1022,6 @@
Brush *br = sd->brush;
MTex *mtex = br->mtex[br->texact];
TexResult texres;
- float x, y, step=2.0/TC_SIZE, co[3];
int hasrgb, ix, iy;
memset(&texres, 0, sizeof(TexResult));
@@ -1037,16 +1033,22 @@
MEM_freeN(ss->texcache);
ss->texcache= NULL;
}
-
- ss->texcache_w = ss->texcache_h = TC_SIZE;
- ss->texcache = MEM_callocN(sizeof(int) * ss->texcache_w * ss->texcache_h, "Sculpt Texture cache");
-
+
+ /* Need to allocate a bigger buffer for bigger brush size */
+ ss->texcache_side = sd->brush->size * 2;
+ if(!ss->texcache || ss->texcache_side > ss->texcache_actual) {
+ ss->texcache = MEM_callocN(sizeof(int) * ss->texcache_side * ss->texcache_side, "Sculpt Texture cache");
+ ss->texcache_actual = ss->texcache_side;
+ }
+
if(mtex && mtex->tex) {
+ float x, y, step = 2.0 / ss->texcache_side, co[3];
+
BKE_image_get_ibuf(br->mtex[br->texact]->tex->ima, NULL);
/*do normalized cannonical view coords for texture*/
- for (y=-1.0, iy=0; iy<TC_SIZE; iy++, y += step) {
- for (x=-1.0, ix=0; ix<TC_SIZE; ix++, x += step) {
+ for (y=-1.0, iy=0; iy<ss->texcache_side; iy++, y += step) {
+ for (x=-1.0, ix=0; ix<ss->texcache_side; ix++, x += step) {
co[0]= x;
co[1]= y;
co[2]= 0.0f;
@@ -1063,10 +1065,10 @@
texres.tg + 0.2 * texres.tb);
texres.tin = texres.tin * 255.0;
- ((char*)ss->texcache)[(iy*TC_SIZE+ix)*4] = (char)texres.tin;
- ((char*)ss->texcache)[(iy*TC_SIZE+ix)*4+1] = (char)texres.tin;
- ((char*)ss->texcache)[(iy*TC_SIZE+ix)*4+2] = (char)texres.tin;
- ((char*)ss->texcache)[(iy*TC_SIZE+ix)*4+3] = (char)texres.tin;
+ ((char*)ss->texcache)[(iy*ss->texcache_side+ix)*4] = (char)texres.tin;
+ ((char*)ss->texcache)[(iy*ss->texcache_side+ix)*4+1] = (char)texres.tin;
+ ((char*)ss->texcache)[(iy*ss->texcache_side+ix)*4+2] = (char)texres.tin;
+ ((char*)ss->texcache)[(iy*ss->texcache_side+ix)*4+3] = (char)texres.tin;
}
}
}
@@ -1104,7 +1106,7 @@
Sculpt *sd= sculpt_data();
SculptSession *ss= sculpt_session();
int i, j;
- const int tsz = TC_SIZE;
+ const int tsz = ss->texcache_side;
float *texdata= MEM_mallocN(sizeof(float)*tsz*tsz, "Brush preview");
GLuint tex;
@@ -1648,6 +1650,7 @@
view3d_operator_needs_opengl(C);
sculpt_update_cache_invariants(sd, C, op);
+ sculptmode_update_all_projverts(sd->session);
sculpt_update_tex(sd);
RNA_BEGIN(op->ptr, itemptr, "stroke") {
@@ -1736,6 +1739,8 @@
WM_paint_cursor_end(CTX_wm_manager(C), ts->sculpt->session->cursor);
sculptsession_free(ts->sculpt);
+
+ ED_undo_push(C, "Exit sculpt");
}
else {
MTex *mtex; // XXX: temporary
@@ -1770,6 +1775,8 @@
mtex->tex = G.main->tex.first;
mtex->size[0] = mtex->size[1] = mtex->size[2] = 50;
}
+
+ ED_undo_push(C, "Enter sculpt");
}
return OPERATOR_FINISHED;
More information about the Bf-blender-cvs
mailing list