[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37107] branches/soc-2011-onion/source/ blender/blenkernel/intern/multires.c: Revision: 28682
Jason Wilkins
Jason.A.Wilkins at gmail.com
Fri Jun 3 00:52:21 CEST 2011
Revision: 37107
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37107
Author: jwilkins
Date: 2011-06-02 22:52:20 +0000 (Thu, 02 Jun 2011)
Log Message:
-----------
Revision: 28682
Author: nicholasbishop
Date: 11:23:51 PM, Saturday, May 08, 2010
Message:
* Small refactoring to improve readability, no functionality changes.
* Replaced the invert and add parameters of disp_run to a single DispOp parameter. This makes explicit that we can CALC disps, APPLY disps, and ADD disps.
* Renamed "mat" in disp run.
Modified Paths:
--------------
branches/soc-2011-onion/source/blender/blenkernel/intern/multires.c
Modified: branches/soc-2011-onion/source/blender/blenkernel/intern/multires.c
===================================================================
--- branches/soc-2011-onion/source/blender/blenkernel/intern/multires.c 2011-06-02 17:34:01 UTC (rev 37106)
+++ branches/soc-2011-onion/source/blender/blenkernel/intern/multires.c 2011-06-02 22:52:20 UTC (rev 37107)
@@ -65,8 +65,14 @@
static const int multires_grid_tot[] = {0, 4, 9, 25, 81, 289, 1089, 4225, 16641, 66049, 263169, 1050625, 4198401, 16785409};
static const int multires_side_tot[] = {0, 2, 3, 5, 9, 17, 33, 65, 129, 257, 513, 1025, 2049, 4097};
+typedef enum {
+ APPLY_DISPS,
+ CALC_DISPS,
+ ADD_DISPS,
+} DispOp;
+
static void multires_mvert_to_ss(DerivedMesh *dm, MVert *mvert);
-static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, int invert, int add, DMGridData **oldGridData, int totlvl);
+static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, DispOp op, DMGridData **oldGridData, int totlvl);
DerivedMesh *get_multires_dm(Scene *scene, MultiresModifierData *mmd, Object *ob)
{
@@ -595,7 +601,7 @@
cddm->release(cddm);
/* calc disps */
- multiresModifier_disp_run(dispdm, me, 1, 0, origdm->getGridData(origdm), totlvl);
+ multiresModifier_disp_run(dispdm, me, CALC_DISPS, origdm->getGridData(origdm), totlvl);
origdm->release(origdm);
dispdm->release(dispdm);
@@ -662,7 +668,7 @@
multires_reallocate_mdisps(me, mdisps, totlvl);
/* compute displacements */
- multiresModifier_disp_run(highdm, me, 1, 0, subGridData, totlvl);
+ multiresModifier_disp_run(highdm, me, CALC_DISPS, subGridData, totlvl);
/* free */
highdm->release(highdm);
@@ -707,7 +713,7 @@
}
}
-static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, int invert, int add, DMGridData **oldGridData, int totlvl)
+static void multiresModifier_disp_run(DerivedMesh *dm, Mesh *me, DispOp op, DMGridData **oldGridData, int totlvl)
{
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*)dm;
DMGridData **gridData, **subGridData;
@@ -717,7 +723,7 @@
int i, /*numGrids,*/ gridSize, dGridSize, dSkip;
if(!mdisps) {
- if(invert)
+ if(op == CALC_DISPS)
mdisps = CustomData_add_layer(&me->fdata, CD_MDISPS, CD_DEFAULT, NULL, me->totface);
else
return;
@@ -756,7 +762,7 @@
float *sco = subgrid[x + y*gridSize].co;
float *no = subgrid[x + y*gridSize].no;
float *data = dispgrid[dGridSize*y*dSkip + x*dSkip];
- float mat[3][3], tx[3], ty[3], disp[3], d[3];
+ float tan_to_ob_mat[3][3], tx[3], ty[3], disp[3], d[3];
/* construct tangent space matrix */
grid_tangent(gridSize, gIndex, x, y, 0, subGridData, tx);
@@ -769,31 +775,36 @@
//mul_v3_fl(ty, 1.0f/(gridSize-1));
//cross_v3_v3v3(no, tx, ty);
- column_vectors_to_mat3(mat, tx, ty, no);
+ column_vectors_to_mat3(tan_to_ob_mat, tx, ty, no);
- if(!invert) {
- /* convert to object space and add */
- mul_v3_m3v3(disp, mat, data);
+ switch(op) {
+ case APPLY_DISPS:
+ /* Convert displacement to object space
+ and add to grid points */
+ mul_v3_m3v3(disp, tan_to_ob_mat, data);
add_v3_v3v3(co, sco, disp);
- }
- else if(!add) {
- /* convert difference to tangent space */
+ break;
+ case CALC_DISPS:
+ /* Calculate displacement between new and old
+ grid points and convert to tangent space. */
sub_v3_v3v3(disp, co, sco);
- invert_m3(mat);
- mul_v3_m3v3(data, mat, disp);
- }
- else {
- /* convert difference to tangent space */
- invert_m3(mat);
- mul_v3_m3v3(d, mat, co);
+ invert_m3(tan_to_ob_mat);
+ mul_v3_m3v3(data, tan_to_ob_mat, disp);
+ break;
+ case ADD_DISPS:
+ /* Convert subdivided displacements to tangent
+ space and add to the original displacements */
+ invert_m3(tan_to_ob_mat);
+ mul_v3_m3v3(d, tan_to_ob_mat, co);
add_v3_v3(data, d);
+ break;
}
}
}
}
}
- if(!invert) {
+ if(op == APPLY_DISPS) {
ccgSubSurf_stitchFaces(ccgdm->ss, 0, NULL, 0);
ccgSubSurf_updateNormals(ccgdm->ss, NULL, 0);
}
@@ -869,7 +880,7 @@
ccgSubSurf_updateLevels(ss, lvl, NULL, 0);
/* add to displacements */
- multiresModifier_disp_run(highdm, me, 1, 1, subGridData, mmd->totlvl);
+ multiresModifier_disp_run(highdm, me, ADD_DISPS, subGridData, mmd->totlvl);
/* free */
highdm->release(highdm);
@@ -887,7 +898,7 @@
subdm = subsurf_dm_create_local(ob, cddm, mmd->totlvl, mmd->simple, 0);
cddm->release(cddm);
- multiresModifier_disp_run(dm, me, 1, 0, subdm->getGridData(subdm), mmd->totlvl);
+ multiresModifier_disp_run(dm, me, CALC_DISPS, subdm->getGridData(subdm), mmd->totlvl);
subdm->release(subdm);
}
@@ -954,7 +965,7 @@
multires_set_tot_mdisps(me, mmd->totlvl);
CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface);
- multiresModifier_disp_run(result, ob->data, 0, 0, subGridData, mmd->totlvl);
+ multiresModifier_disp_run(result, ob->data, APPLY_DISPS, subGridData, mmd->totlvl);
for(i = 0; i < numGrids; i++)
MEM_freeN(subGridData[i]);
More information about the Bf-blender-cvs
mailing list