[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46515] trunk/blender/source/blender: Replace hardcoded DMGridData structure with CCGElem/CCGKey.
Nicholas Bishop
nicholasbishop at gmail.com
Thu May 10 22:33:10 CEST 2012
Revision: 46515
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46515
Author: nicholasbishop
Date: 2012-05-10 20:33:09 +0000 (Thu, 10 May 2012)
Log Message:
-----------
Replace hardcoded DMGridData structure with CCGElem/CCGKey.
* Changes to DerivedMesh interface: DMGridData has been removed,
getGridData() now returns an array of CCGElem pointers. Also added
getGridKey() to initialize a CCGKey (implemented only by
CCGDerivedMesh.)
* PBVH: added BLI_pbvh_get_grid_key().
* A lot of code is affected, but mainly is just replacing
DMGridData.co, DMGridData.no, and sizeof(DMGridData) with the
CCG_*_elem functions, removing the reliance on grid elements of
exactly six floats.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
trunk/blender/source/blender/blenkernel/BKE_subsurf.h
trunk/blender/source/blender/blenkernel/intern/multires.c
trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c
trunk/blender/source/blender/blenlib/BLI_pbvh.h
trunk/blender/source/blender/blenlib/intern/pbvh.c
trunk/blender/source/blender/editors/object/object_bake.c
trunk/blender/source/blender/editors/sculpt_paint/paint_hide.c
trunk/blender/source/blender/editors/sculpt_paint/sculpt.c
trunk/blender/source/blender/editors/sculpt_paint/sculpt_undo.c
trunk/blender/source/blender/gpu/GPU_buffers.h
trunk/blender/source/blender/gpu/intern/gpu_buffers.c
Modified: trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h 2012-05-10 20:32:51 UTC (rev 46514)
+++ trunk/blender/source/blender/blenkernel/BKE_DerivedMesh.h 2012-05-10 20:33:09 UTC (rev 46515)
@@ -74,6 +74,8 @@
#include "BKE_customdata.h"
#include "BKE_bvhutils.h"
+struct CCGElem;
+struct CCGKey;
struct MVert;
struct MEdge;
struct MFace;
@@ -102,11 +104,6 @@
* Also, the mface origindex layer indexes mpolys, not mfaces.
*/
-typedef struct DMGridData {
- float co[3];
- float no[3];
-} DMGridData;
-
typedef struct DMGridAdjacency {
int index[4];
int rotation[4];
@@ -250,9 +247,10 @@
/* optional grid access for subsurf */
int (*getNumGrids)(DerivedMesh *dm);
int (*getGridSize)(DerivedMesh *dm);
- DMGridData **(*getGridData)(DerivedMesh *dm);
+ struct CCGElem **(*getGridData)(DerivedMesh *dm);
DMGridAdjacency *(*getGridAdjacency)(DerivedMesh *dm);
int *(*getGridOffset)(DerivedMesh *dm);
+ void (*getGridKey)(DerivedMesh *dm, struct CCGKey *key);
DMFlagMat *(*getGridFlagMats)(DerivedMesh *dm);
unsigned int **(*getGridHidden)(DerivedMesh *dm);
Modified: trunk/blender/source/blender/blenkernel/BKE_subsurf.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_subsurf.h 2012-05-10 20:32:51 UTC (rev 46514)
+++ trunk/blender/source/blender/blenkernel/BKE_subsurf.h 2012-05-10 20:33:09 UTC (rev 46515)
@@ -34,9 +34,9 @@
/* struct DerivedMesh is used directly */
#include "BKE_DerivedMesh.h"
+struct CCGElem;
struct DMFlagMat;
struct DMGridAdjacency;
-struct DMGridData;
struct DerivedMesh;
struct MeshElemMap;
struct Mesh;
@@ -51,7 +51,6 @@
struct CCGVert;
struct EdgeHash;
struct PBVH;
-struct DMGridData;
struct DMGridAdjacency;
/**************************** External *****************************/
@@ -115,7 +114,7 @@
struct MeshElemMap *pmap;
int *pmap_mem;
- struct DMGridData **gridData;
+ struct CCGElem **gridData;
struct DMGridAdjacency *gridAdjacency;
int *gridOffset;
struct CCGFace **gridFaces;
Modified: trunk/blender/source/blender/blenkernel/intern/multires.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/multires.c 2012-05-10 20:32:51 UTC (rev 46514)
+++ trunk/blender/source/blender/blenkernel/intern/multires.c 2012-05-10 20:33:09 UTC (rev 46515)
@@ -46,6 +46,7 @@
#include "BLI_pbvh.h"
#include "BLI_utildefines.h"
+#include "BKE_ccg.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
@@ -75,7 +76,7 @@
} DispOp;
static void multires_mvert_to_ss(DerivedMesh *dm, MVert *mvert);
-static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, DerivedMesh *dm2, DispOp op, DMGridData **oldGridData, int totlvl);
+static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, DerivedMesh *dm2, DispOp op, CCGElem **oldGridData, int totlvl);
/** Customdata **/
@@ -569,23 +570,27 @@
}
}
-static void multires_copy_dm_grid(DMGridData *gridA, DMGridData *gridB, int sizeA, int sizeB)
+static void multires_copy_dm_grid(CCGElem *gridA, CCGElem *gridB, CCGKey *keyA, CCGKey *keyB)
{
int x, y, j, skip;
- if (sizeA > sizeB) {
- skip = (sizeA - 1) / (sizeB - 1);
+ if (keyA->grid_size > keyB->grid_size) {
+ skip = (keyA->grid_size - 1) / (keyB->grid_size - 1);
- for (j = 0, y = 0; y < sizeB; y++)
- for (x = 0; x < sizeB; x++, j++)
- copy_v3_v3(gridA[y * skip * sizeA + x * skip].co, gridB[j].co);
+ for (j = 0, y = 0; y < keyB->grid_size; y++)
+ for (x = 0; x < keyB->grid_size; x++, j++)
+ memcpy(CCG_elem_offset_co(keyA, gridA, y * skip * keyA->grid_size + x * skip),
+ CCG_elem_offset_co(keyB, gridB, j),
+ sizeof(float) * keyA->num_layers);
}
else {
- skip = (sizeB - 1) / (sizeA - 1);
+ skip = (keyB->grid_size - 1) / (keyA->grid_size - 1);
- for (j = 0, y = 0; y < sizeA; y++)
- for (x = 0; x < sizeA; x++, j++)
- copy_v3_v3(gridA[j].co, gridB[y * skip * sizeB + x * skip].co);
+ for (j = 0, y = 0; y < keyA->grid_size; y++)
+ for (x = 0; x < keyA->grid_size; x++, j++)
+ memcpy(CCG_elem_offset_co(keyA, gridA, j),
+ CCG_elem_offset_co(keyB, gridB, y * skip * keyB->grid_size + x*skip),
+ sizeof(float) * keyA->num_layers);
}
}
@@ -850,9 +855,10 @@
if (mdisps->disps && !updateblock && totlvl > 1) {
/* upsample */
DerivedMesh *lowdm, *cddm, *highdm;
- DMGridData **highGridData, **lowGridData, **subGridData;
+ CCGElem **highGridData, **lowGridData, **subGridData;
+ CCGKey highGridKey, lowGridKey;
CCGSubSurf *ss;
- int i, numGrids, highGridSize, lowGridSize;
+ int i, numGrids, highGridSize;
/* create subsurf DM from original mesh at high level */
cddm = CDDM_from_mesh(me, NULL);
@@ -867,18 +873,19 @@
numGrids = highdm->getNumGrids(highdm);
highGridSize = highdm->getGridSize(highdm);
highGridData = highdm->getGridData(highdm);
- lowGridSize = lowdm->getGridSize(lowdm);
+ highdm->getGridKey(highdm, &highGridKey);
lowGridData = lowdm->getGridData(lowdm);
+ lowdm->getGridKey(lowdm, &lowGridKey);
subGridData = MEM_callocN(sizeof(float *) * numGrids, "subGridData*");
for (i = 0; i < numGrids; ++i) {
/* backup subsurf grids */
- subGridData[i] = MEM_callocN(sizeof(DMGridData) * highGridSize * highGridSize, "subGridData");
- memcpy(subGridData[i], highGridData[i], sizeof(DMGridData) * highGridSize * highGridSize);
+ subGridData[i] = MEM_callocN(highGridKey.elem_size * highGridSize * highGridSize, "subGridData");
+ memcpy(subGridData[i], highGridData[i], highGridKey.elem_size*highGridSize * highGridSize);
/* overwrite with current displaced grids */
- multires_copy_dm_grid(highGridData[i], lowGridData[i], highGridSize, lowGridSize);
+ multires_copy_dm_grid(highGridData[i], lowGridData[i], &highGridKey, &lowGridKey);
}
/* low lower level dm no longer needed at this point */
@@ -914,34 +921,35 @@
multires_subdivide(mmd, ob, mmd->totlvl + 1, updateblock, simple);
}
-void grid_tangent(int gridSize, int index, int x, int y, int axis, DMGridData **gridData, float t[3])
+void grid_tangent(const CCGKey *key, int x, int y, int axis, CCGElem *grid, float t[3])
{
if (axis == 0) {
- if (x == gridSize - 1) {
- if (y == gridSize - 1)
- sub_v3_v3v3(t, gridData[index][x + gridSize * (y - 1)].co, gridData[index][x - 1 + gridSize * (y - 1)].co);
+ if (x == key->grid_size - 1) {
+ if (y == key->grid_size - 1)
+ sub_v3_v3v3(t, CCG_grid_elem_co(key, grid, x, y - 1), CCG_grid_elem_co(key, grid, x - 1, y - 1));
else
- sub_v3_v3v3(t, gridData[index][x + gridSize * y].co, gridData[index][x - 1 + gridSize * y].co);
+ sub_v3_v3v3(t, CCG_grid_elem_co(key, grid, x, y), CCG_grid_elem_co(key, grid, x - 1, y));
}
else
- sub_v3_v3v3(t, gridData[index][x + 1 + gridSize * y].co, gridData[index][x + gridSize * y].co);
+ sub_v3_v3v3(t, CCG_grid_elem_co(key, grid, x + 1, y), CCG_grid_elem_co(key, grid, x, y));
}
else if (axis == 1) {
- if (y == gridSize - 1) {
- if (x == gridSize - 1)
- sub_v3_v3v3(t, gridData[index][x - 1 + gridSize * y].co, gridData[index][x - 1 + gridSize * (y - 1)].co);
+ if (y == key->grid_size - 1) {
+ if (x == key->grid_size - 1)
+ sub_v3_v3v3(t, CCG_grid_elem_co(key, grid, x - 1, y), CCG_grid_elem_co(key, grid, x - 1, (y - 1)));
else
- sub_v3_v3v3(t, gridData[index][x + gridSize * y].co, gridData[index][x + gridSize * (y - 1)].co);
+ sub_v3_v3v3(t, CCG_grid_elem_co(key, grid, x, y), CCG_grid_elem_co(key, grid, x, (y - 1)));
}
else
- sub_v3_v3v3(t, gridData[index][x + gridSize * (y + 1)].co, gridData[index][x + gridSize * y].co);
+ sub_v3_v3v3(t, CCG_grid_elem_co(key, grid, x, (y + 1)), CCG_grid_elem_co(key, grid, x, y));
}
}
-static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, DerivedMesh *dm2, DispOp op, DMGridData **oldGridData, int totlvl)
+static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, DerivedMesh *dm2, DispOp op, CCGElem **oldGridData, int totlvl)
{
CCGDerivedMesh *ccgdm = (CCGDerivedMesh *)dm;
- DMGridData **gridData, **subGridData;
+ CCGElem **gridData, **subGridData;
+ CCGKey key;
MPoly *mpoly = me->mpoly;
MDisps *mdisps = CustomData_get_layer(&me->ldata, CD_MDISPS);
int *gridOffset;
@@ -971,7 +979,8 @@
gridSize = dm->getGridSize(dm);
gridData = dm->getGridData(dm);
gridOffset = dm->getGridOffset(dm);
- subGridData = (oldGridData) ? oldGridData : gridData;
+ dm->getGridKey(dm, &key);
+ subGridData = (oldGridData) ? oldGridData: gridData;
dGridSize = multires_side_tot[totlvl];
dSkip = (dGridSize - 1) / (gridSize - 1);
@@ -986,8 +995,8 @@
for (S = 0; S < numVerts; ++S, ++gIndex, ++k) {
MDisps *mdisp = &mdisps[mpoly[i].loopstart + S];
- DMGridData *grid = gridData[gIndex];
- DMGridData *subgrid = subGridData[gIndex];
+ CCGElem *grid = gridData[gIndex];
+ CCGElem *subgrid = subGridData[gIndex];
float (*dispgrid)[3] = NULL;
/* when adding new faces in edit mode, need to allocate disps */
@@ -1001,17 +1010,17 @@
for (y = 0; y < gridSize; y++) {
for (x = 0; x < gridSize; x++) {
- float *co = grid[x + y * gridSize].co;
- float *sco = subgrid[x + y * gridSize].co;
- float *no = subgrid[x + y * gridSize].no;
+ float *co = CCG_grid_elem_co(&key, grid, x, y);
+ float *sco = CCG_grid_elem_co(&key, subgrid, x, y);
+ float *no = CCG_grid_elem_no(&key, subgrid, x, y);
float *data = dispgrid[dGridSize * y * dSkip + x * dSkip];
float mat[3][3], tx[3], ty[3], disp[3], d[3];
/* construct tangent space matrix */
- grid_tangent(gridSize, gIndex, x, y, 0, subGridData, tx);
+ grid_tangent(&key, x, y, 0, subGridData[gIndex], tx);
normalize_v3(tx);
- grid_tangent(gridSize, gIndex, x, y, 1, subGridData, ty);
+ grid_tangent(&key, x, y, 1, subGridData[gIndex], ty);
normalize_v3(ty);
//mul_v3_fl(tx, 1.0f/(gridSize-1));
@@ -1075,7 +1084,8 @@
if (lvl < totlvl) {
Mesh *me = ob->data;
DerivedMesh *lowdm, *cddm, *highdm;
- DMGridData **highGridData, **lowGridData, **subGridData, **gridData, *diffGrid;
+ CCGElem **highGridData, **lowGridData, **subGridData, **gridData, *diffGrid;
+ CCGKey highGridKey, lowGridKey;
CCGSubSurf *ss;
int i, j, numGrids, highGridSize, lowGridSize;
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list