[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31182] branches/soc-2010-nicolasbishop/ source/blender: == Ptex ==
Nicholas Bishop
nicholasbishop at gmail.com
Mon Aug 9 03:20:18 CEST 2010
Revision: 31182
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31182
Author: nicholasbishop
Date: 2010-08-09 03:20:13 +0200 (Mon, 09 Aug 2010)
Log Message:
-----------
== Ptex ==
* Enabled drawing of ptex on a multires mesh
* Enabled ptex painting on a multires mesh
Note that the multires level doesn't effect the ptex resolution; multires has no effect on ptex other than making the display smoother.
Modified Paths:
--------------
branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/subsurf_ccg.c
branches/soc-2010-nicolasbishop/source/blender/blenlib/BLI_pbvh.h
branches/soc-2010-nicolasbishop/source/blender/blenlib/intern/pbvh.c
branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_vertex.c
branches/soc-2010-nicolasbishop/source/blender/gpu/GPU_buffers.h
branches/soc-2010-nicolasbishop/source/blender/gpu/intern/gpu_buffers.c
Modified: branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/subsurf_ccg.c 2010-08-08 23:46:49 UTC (rev 31181)
+++ branches/soc-2010-nicolasbishop/source/blender/blenkernel/intern/subsurf_ccg.c 2010-08-09 01:20:13 UTC (rev 31182)
@@ -2490,17 +2490,24 @@
we build a pbvh over the modified mesh, in other cases the base mesh
is being sculpted, so we build a pbvh from that. */
if(grid_pbvh) {
+ int leaf_limit = PBVH_DEFAULT_LEAF_LIMIT;
+
+ /* TODO: set leaf limit more intelligently */
+ if(ob->mode & OB_MODE_VERTEX_PAINT)
+ leaf_limit = 1;
+
ccgdm_create_grids(dm);
gridSize = ccgDM_getGridSize(dm);
numGrids = ccgDM_getNumGrids(dm);
gridkey = ccgDM_getGridKey(dm);
- ob->paint->pbvh= ccgdm->pbvh = BLI_pbvh_new(PBVH_DEFAULT_LEAF_LIMIT);
+ ob->paint->pbvh= ccgdm->pbvh = BLI_pbvh_new(leaf_limit);
BLI_pbvh_build_grids(ccgdm->pbvh, ccgdm->gridData, ccgdm->gridAdjacency,
numGrids, gridSize, gridkey, (void**)ccgdm->gridFaces,
&me->vdata, &me->fdata,
- ss ? &ss->hidden_areas : NULL);
+ ss ? &ss->hidden_areas : NULL,
+ me->mface, me->totface);
ccgdm->pbvh_draw = 1;
}
else if(ob->type == OB_MESH) {
Modified: branches/soc-2010-nicolasbishop/source/blender/blenlib/BLI_pbvh.h
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/blenlib/BLI_pbvh.h 2010-08-08 23:46:49 UTC (rev 31181)
+++ branches/soc-2010-nicolasbishop/source/blender/blenlib/BLI_pbvh.h 2010-08-09 01:20:13 UTC (rev 31182)
@@ -51,6 +51,11 @@
float (*co)[3];
} PBVHProxyNode;
+typedef struct {
+ int face;
+ char offset;
+} GridToFace;
+
/* Callbacks */
/* returns 1 if the search should continue from this node, 0 otherwise */
@@ -77,7 +82,7 @@
struct DMGridAdjacency *gridadj, int totgrid,
int gridsize, struct GridKey *gridkey, void **gridfaces,
struct CustomData *vdata, struct CustomData *fdata,
- ListBase *hidden_areas);
+ ListBase *hidden_areas, struct MFace *mface, int totface);
void BLI_pbvh_free(PBVH *bvh);
/* Hierarchical Search in the BVH, two methods:
@@ -143,6 +148,7 @@
int BLI_pbvh_uses_grids(PBVH *bvh);
void BLI_pbvh_get_customdata(PBVH *pbvh, struct CustomData **vdata, struct CustomData **fdata);
+GridToFace *BLI_pbvh_get_grid_face_map(PBVH *pbvh);
void BLI_pbvh_node_get_faces(PBVH *bvh, PBVHNode *node,
struct MFace **faces,
@@ -150,7 +156,8 @@
int *totface);
void BLI_pbvh_node_get_grids(PBVH *bvh, PBVHNode *node,
int **grid_indices, int *totgrid, int *maxgrid, int *gridsize,
- struct DMGridData ***griddata, struct DMGridAdjacency **gridadj, struct GridKey **gridkey);
+ struct DMGridData ***griddata, struct DMGridAdjacency **gridadj,
+ struct GridKey **gridkey);
void BLI_pbvh_node_num_verts(PBVH *bvh, PBVHNode *node,
int *uniquevert, int *totvert);
void BLI_pbvh_node_get_verts(PBVH *bvh, PBVHNode *node,
Modified: branches/soc-2010-nicolasbishop/source/blender/blenlib/intern/pbvh.c
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/blenlib/intern/pbvh.c 2010-08-08 23:46:49 UTC (rev 31181)
+++ branches/soc-2010-nicolasbishop/source/blender/blenlib/intern/pbvh.c 2010-08-09 01:20:13 UTC (rev 31182)
@@ -122,6 +122,7 @@
int totgrid;
int gridsize;
struct GridKey *gridkey;
+ GridToFace *grid_face_map;
/* Used by both mesh and grid type */
CustomData *vdata;
@@ -673,12 +674,32 @@
pbvh_begin_build(bvh, totface, hidden_areas);
}
+static GridToFace *pbvh_build_grid_face_map(MFace *mface, int totface, int totgrid)
+{
+ GridToFace *map, *gtf;
+ int i, j;
+
+ map = MEM_callocN(sizeof(GridToFace) * totgrid, "PBVH.grid_face_map");
+
+ for(i = 0, gtf = map; i < totface; ++i) {
+ int S = mface[i].v4 ? 4 : 3;
+
+ for(j = 0; j < S; ++j, ++gtf) {
+ gtf->face = i;
+ gtf->offset = j;
+ }
+ }
+
+ return map;
+}
+
/* Do a full rebuild with on Grids data structure */
void BLI_pbvh_build_grids(PBVH *bvh, DMGridData **grids,
DMGridAdjacency *gridadj,
int totgrid, int gridsize, GridKey *gridkey,
void **gridfaces, CustomData *vdata,
- CustomData *fdata, ListBase *hidden_areas)
+ CustomData *fdata, ListBase *hidden_areas,
+ MFace *mface, int totface)
{
bvh->grids= grids;
bvh->gridadj= gridadj;
@@ -688,7 +709,8 @@
bvh->gridkey= gridkey;
bvh->vdata= vdata;
bvh->fdata= fdata;
- bvh->leaf_limit = MAX2(PBVH_DEFAULT_LEAF_LIMIT/((gridsize-1)*(gridsize-1)), 1);
+ bvh->leaf_limit = MAX2(bvh->leaf_limit/((gridsize-1)*(gridsize-1)), 1);
+ bvh->grid_face_map = pbvh_build_grid_face_map(mface, totface, totgrid);
if(totgrid)
pbvh_begin_build(bvh, totgrid, hidden_areas);
@@ -737,6 +759,9 @@
{
pbvh_free_nodes(bvh);
+ if(bvh->grid_face_map)
+ MEM_freeN(bvh->grid_face_map);
+
MEM_freeN(bvh->prim_indices);
MEM_freeN(bvh);
}
@@ -1168,14 +1193,18 @@
if(node->flag & PBVH_UpdateColorBuffers) {
if(bvh->grids) {
- GPU_update_grid_color_buffers(node->draw_buffers,
- bvh->grids,
- node->prim_indices,
- node->totprim,
- bvh->gridsize,
- bvh->gridkey,
- bvh->vdata,
- flags);
+ if(flags & GPU_DRAW_ACTIVE_MCOL)
+ GPU_update_grids_ptex(node->draw_buffers, bvh, node);
+ else {
+ GPU_update_grid_color_buffers(node->draw_buffers,
+ bvh->grids,
+ node->prim_indices,
+ node->totprim,
+ bvh->gridsize,
+ bvh->gridkey,
+ bvh->vdata,
+ flags);
+ }
}
else {
if(flags & GPU_DRAW_ACTIVE_MCOL)
@@ -1329,7 +1358,12 @@
if(fdata) *fdata = bvh->fdata;
}
+GridToFace *BLI_pbvh_get_grid_face_map(PBVH *pbvh)
+{
+ return pbvh->grid_face_map;
+}
+
/***************************** Node Access ***********************************/
void BLI_pbvh_node_mark_update(PBVHNode *node)
Modified: branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_vertex.c
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_vertex.c 2010-08-08 23:46:49 UTC (rev 31181)
+++ branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_vertex.c 2010-08-09 01:20:13 UTC (rev 31182)
@@ -1696,7 +1696,7 @@
}
static void vpaint_ptex_from_quad(Brush *brush, PaintStroke *stroke, PaintStrokeTest *test,
- MPtex *pt, int res[2], char *data,
+ MPtex *pt, int res[2], int rowlen, char *data,
float v1[3], float v2[3], float v3[3], float v4[3])
{
@@ -1706,8 +1706,8 @@
layersize = pt->channels * ptex_data_size(pt->type);
- sub_v3_v3v3(dtop, v1, v2);
- sub_v3_v3v3(dbot, v4, v3);;
+ sub_v3_v3v3(dtop, v3, v4);
+ sub_v3_v3v3(dbot, v2, v1);;
ustep = 1;
if(res[0] != 1)
ustep /= (res[0] - 1);
@@ -1719,10 +1719,10 @@
vstep /= (res[1] - 1);
for(v = 0, yinterp = 0; v < res[1]; ++v) {
- copy_v3_v3(co_top, v2);
- copy_v3_v3(co_bot, v3);
+ copy_v3_v3(co_top, v4);
+ copy_v3_v3(co_bot, v1);
- for(u = 0; u < res[0]; ++u, data += layersize) {
+ for(u = 0; u < res[0]; ++u) {
float co[3];
interp_v3_v3v3(co, co_bot, co_top, yinterp);
@@ -1730,13 +1730,14 @@
if(paint_stroke_test(test, co)) {
float strength;
float fcol[4];
+ char *elem = data + layersize*(v*rowlen + u);
strength = brush->alpha *
paint_stroke_combined_strength(stroke, test->dist, co, 0);
- ptex_elem_to_float4(pt->type, pt->channels, data, fcol);
+ ptex_elem_to_float4(pt->type, pt->channels, elem, fcol);
vpaint_blend(brush, stroke, fcol, strength, co);
- ptex_elem_from_float4(pt->type, pt->channels, data, fcol);
+ ptex_elem_from_float4(pt->type, pt->channels, elem, fcol);
}
add_v3_v3(co_bot, dbot);
@@ -1747,13 +1748,131 @@
}
}
-static void vpaint_nodes_faces(Brush *brush, PaintStroke *stroke,
- MFace *mface, MVert *mvert,
- CustomData *vdata, CustomData *fdata,
- int *face_indices, int totface)
+static void vpaint_node_grids(Brush *brush, PaintStroke *stroke,
+ DMGridData **grids, GridKey *gridkey,
+ GridToFace *grid_face_map,
+ CustomData *fdata,
+ int *grid_indices,
+ int totgrid, int gridsize)
{
PaintStrokeTest test;
MPtex *mptex;
+ int i, j;
+
+ mptex = CustomData_get_layer(fdata, CD_MPTEX);
+
+ paint_stroke_test_init(&test, stroke);
+
+ for(i = 0; i < totgrid; ++i) {
+ int g = grid_indices[i];
+ DMGridData *grid = grids[g];
+ GridToFace *gtf = &grid_face_map[g];
+ MPtex *pt = &mptex[gtf->face];
+ char *data = pt->data;
+ int layersize;
+ int ures, vres, res[2], rowlen;
+ int x, y, u, v, ustep, vstep, rot = 0;
+ int xstep, ystep, xstart, ystart, inverse;
+
+ layersize = pt->channels * ptex_data_size(pt->type);
+
+ if(pt->subfaces == 1) {
+ ures = pt->res[0][0] / 2;
+ vres = pt->res[0][1] / 2;
+ rowlen = pt->res[0][0];
+
+ if(gtf->offset == 1)
+ data += layersize * ures;
+ else if(gtf->offset == 3)
+ data += layersize * vres * rowlen;
+ else if(gtf->offset == 2)
+ data += layersize * (vres * rowlen + ures);
+
+ rot = gtf->offset;
+ }
+ else {
+ ures = pt->res[gtf->offset][0];
+ vres = pt->res[gtf->offset][1];
+ rowlen = pt->res[gtf->offset][0];
+
+ for(j = 0; j < gtf->offset; ++j)
+ data += layersize * pt->res[j][0] * pt->res[j][1];
+ }
+
+ ustep = MAX2(ures / (gridsize - 1), 1);
+ vstep = MAX2(vres / (gridsize - 1), 1);
+ res[0] = ustep, res[1] = vstep;
+
+ /* step through the grid in different directions based on
+ grid rotation relative to the ptex */
+ switch(rot) {
+ case 0:
+ xstep = -1;
+ ystep = -1;
+ inverse = 1;
+ break;
+ case 1:
+ xstep = 1;
+ ystep = -1;
+ inverse = 0;
+ break;
+ case 2:
+ xstep = 1;
+ ystep = 1;
+ inverse = 1;
+ break;
+ case 3:
+ xstep = -1;
+ ystep = 1;
+ inverse = 0;
+ break;
+ }
+
+ if(xstep == 1)
+ xstart = 0;
+ else
+ xstart = gridsize - 1;
+ if(ystep == 1)
+ ystart = 0;
+ else
+ ystart = gridsize - 1;
+
+ for(v = 0, y = ystart; v < vres; v += vstep, y += ystep) {
+ for(u = 0, x = xstart; u < ures; u += ustep, x += xstep) {
+ int r = y, c = x, rstep = ystep, cstep = xstep;
+
+ if(inverse) {
+ SWAP(int, r, c);
+ SWAP(int, rstep, cstep);
+ }
+
+ float *co[4] = {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list