Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/blenkernel/intern/dynamicpaint.c')
-rw-r--r--source/blender/blenkernel/intern/dynamicpaint.c158
1 files changed, 76 insertions, 82 deletions
diff --git a/source/blender/blenkernel/intern/dynamicpaint.c b/source/blender/blenkernel/intern/dynamicpaint.c
index f93aee80ab8..b7acede4b7b 100644
--- a/source/blender/blenkernel/intern/dynamicpaint.c
+++ b/source/blender/blenkernel/intern/dynamicpaint.c
@@ -1233,9 +1233,9 @@ static void dynamicPaint_initAdjacencyData(DynamicPaintSurface *surface, int for
/* For vertex format, count every vertex that is connected by an edge */
int numOfEdges = surface->canvas->dm->getNumEdges(surface->canvas->dm);
- int numOfFaces = surface->canvas->dm->getNumFaces(surface->canvas->dm);
+ int numOfFaces = surface->canvas->dm->getNumTessFaces(surface->canvas->dm);
struct MEdge *edge = surface->canvas->dm->getEdgeArray(surface->canvas->dm);
- struct MFace *face = surface->canvas->dm->getFaceArray(surface->canvas->dm);
+ struct MFace *face = surface->canvas->dm->getTessFaceArray(surface->canvas->dm);
/* count number of edges per vertex */
for (i=0; i<numOfEdges; i++) {
@@ -1321,8 +1321,8 @@ void dynamicPaint_setInitialColor(DynamicPaintSurface *surface)
else if (surface->init_color_type == MOD_DPAINT_INITIAL_TEXTURE) {
Tex *tex = surface->init_texture;
MTFace *tface;
- MFace *mface = dm->getFaceArray(dm);
- int numOfFaces = dm->getNumFaces(dm);
+ MFace *mface = dm->getTessFaceArray(dm);
+ int numOfFaces = dm->getNumTessFaces(dm);
char uvname[MAX_CUSTOMDATA_LAYER_NAME];
if (!tex) return;
@@ -1396,8 +1396,8 @@ void dynamicPaint_setInitialColor(DynamicPaintSurface *surface)
/* for vertex surface, just copy colors from mcol */
if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
- MFace *mface = dm->getFaceArray(dm);
- int numOfFaces = dm->getNumFaces(dm);
+ MFace *mface = dm->getTessFaceArray(dm);
+ int numOfFaces = dm->getNumTessFaces(dm);
#pragma omp parallel for schedule(static)
for (i=0; i<numOfFaces; i++) {
@@ -1534,7 +1534,7 @@ static void dynamicPaint_applySurfaceDisplace(DynamicPaintSurface *surface, Deri
else return;
if (update_normals)
- CDDM_calc_normals(result);
+ CDDM_calc_normals_mapping(result);
}
/*
@@ -1544,7 +1544,7 @@ static struct DerivedMesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData
Object *ob,
DerivedMesh *dm)
{
- DerivedMesh *result = CDDM_copy(dm);
+ DerivedMesh *result = CDDM_copy(dm, 0);
if(pmd->canvas && !(pmd->canvas->flags & MOD_DPAINT_BAKING)) {
@@ -1564,11 +1564,11 @@ static struct DerivedMesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData
/* vertex color paint */
if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) {
- MFace *mface = result->getFaceArray(result);
- int numOfFaces = result->getNumFaces(result);
int i;
PaintPoint* pPoint = (PaintPoint*)sData->type_data;
- MCol *col;
+ MLoopCol *col = NULL;
+ MLoop *mloop = CDDM_get_loops(result);
+ int totloop = result->numLoopData;
/* paint is stored on dry and wet layers, so mix final color first */
float *fcolor = MEM_callocN(sizeof(float)*sData->total_points*4, "Temp paint color");
@@ -1580,27 +1580,31 @@ static struct DerivedMesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData
}
/* viewport preview */
- if (surface->flags & MOD_DPAINT_PREVIEW) {
- /* Save preview results to weight layer, to be
+ if (0 && surface->flags & MOD_DPAINT_PREVIEW) {
+ MPoly *mp = CDDM_get_polys(result);
+ int totpoly = result->numPolyData;
+
+ /* Save preview results to weight layer to be
* able to share same drawing methods */
- col = result->getFaceDataArray(result, CD_WEIGHT_MCOL);
- if (!col) col = CustomData_add_layer(&result->faceData, CD_WEIGHT_MCOL, CD_CALLOC, NULL, numOfFaces);
+ col = CustomData_get_layer(&dm->loopData, CD_WEIGHT_MLOOPCOL);
+ if (!col) col = CustomData_add_layer(&dm->loopData, CD_WEIGHT_MLOOPCOL, CD_CALLOC, NULL, totloop);
if (col) {
#pragma omp parallel for schedule(static)
- for (i=0; i<numOfFaces; i++) {
+ for (i=0; i<totpoly; i++) {
int j=0;
- Material *material = give_current_material(ob, mface[i].mat_nr+1);
+ Material *material = give_current_material(ob, mp[i].mat_nr+1);
- for (; j<((mface[i].v4)?4:3); j++) {
- int index = (j==0)?mface[i].v1: (j==1)?mface[i].v2: (j==2)?mface[i].v3: mface[i].v4;
+ for (; j<mp[i].totloop; j++) {
+ int l_index = mp[i].loopstart + j;
+ int v_index = mloop[l_index].v;
if (surface->preview_id == MOD_DPAINT_SURFACE_PREV_PAINT) {
float c[3];
- index *= 4;
+ v_index *= 4;
/* Apply material color as base vertex color for preview */
- col[i*4+j].a = 255;
+ col[l_index].a = 255;
if (material) {
c[0] = material->r;
c[1] = material->g;
@@ -1612,17 +1616,17 @@ static struct DerivedMesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData
c[2] = 0.65f;
}
/* mix surface color */
- interp_v3_v3v3(c, c, &fcolor[index], fcolor[index+3]);
+ interp_v3_v3v3(c, c, &fcolor[v_index], fcolor[v_index+3]);
- col[i*4+j].r = FTOCHAR(c[2]);
- col[i*4+j].g = FTOCHAR(c[1]);
- col[i*4+j].b = FTOCHAR(c[0]);
+ col[l_index].r = FTOCHAR(c[2]);
+ col[l_index].g = FTOCHAR(c[1]);
+ col[l_index].b = FTOCHAR(c[0]);
}
else {
- col[i*4+j].a = 255;
- col[i*4+j].r =
- col[i*4+j].g =
- col[i*4+j].b = FTOCHAR(pPoint[index].wetness);
+ col[l_index].a = 255;
+ col[l_index].r =
+ col[l_index].g =
+ col[l_index].b = FTOCHAR(pPoint[v_index].wetness);
}
}
}
@@ -1634,79 +1638,69 @@ static struct DerivedMesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData
/* save layer data to output layer */
/* paint layer */
- col = CustomData_get_layer_named(&result->faceData, CD_MCOL, surface->output_name);
+ col = CustomData_get_layer_named(&result->loopData, CD_MLOOPCOL, surface->output_name);
/* if output layer is lost from a constructive modifier, re-add it */
if (!col && dynamicPaint_outputLayerExists(surface, ob, 0))
- col = CustomData_add_layer_named(&result->faceData, CD_MCOL, CD_CALLOC, NULL, numOfFaces, surface->output_name);
+ col = CustomData_add_layer_named(&result->loopData, CD_MLOOPCOL, CD_CALLOC, NULL, totloop, surface->output_name);
/* apply color */
if (col) {
#pragma omp parallel for schedule(static)
- for (i=0; i<numOfFaces; i++) {
- int j=0;
- for (; j<((mface[i].v4)?4:3); j++) {
- int index = (j==0)?mface[i].v1: (j==1)?mface[i].v2: (j==2)?mface[i].v3: mface[i].v4;
- index *= 4;
-
- col[i*4+j].a = FTOCHAR(fcolor[index+3]);
- col[i*4+j].r = FTOCHAR(fcolor[index+2]);
- col[i*4+j].g = FTOCHAR(fcolor[index+1]);
- col[i*4+j].b = FTOCHAR(fcolor[index]);
- }
+ for (i=0; i<totloop; i++) {
+ int index = mloop[i].v*4;
+ col[i].a = FTOCHAR(fcolor[index+3]);
+ col[i].r = FTOCHAR(fcolor[index+2]);
+ col[i].g = FTOCHAR(fcolor[index+1]);
+ col[i].b = FTOCHAR(fcolor[index]);
}
}
MEM_freeN(fcolor);
/* wet layer */
- col = CustomData_get_layer_named(&result->faceData, CD_MCOL, surface->output_name2);
+ col = CustomData_get_layer_named(&result->loopData, CD_MLOOPCOL, surface->output_name2);
/* if output layer is lost from a constructive modifier, re-add it */
if (!col && dynamicPaint_outputLayerExists(surface, ob, 1))
- col = CustomData_add_layer_named(&result->faceData, CD_MCOL, CD_CALLOC, NULL, numOfFaces, surface->output_name2);
+ col = CustomData_add_layer_named(&result->loopData, CD_MLOOPCOL, CD_CALLOC, NULL, totloop, surface->output_name2);
/* apply color */
if (col) {
#pragma omp parallel for schedule(static)
- for (i=0; i<numOfFaces; i++) {
- int j=0;
-
- for (; j<((mface[i].v4)?4:3); j++) {
- int index = (j==0)?mface[i].v1: (j==1)?mface[i].v2: (j==2)?mface[i].v3: mface[i].v4;
- col[i*4+j].a = 255;
- col[i*4+j].r =
- col[i*4+j].g =
- col[i*4+j].b = FTOCHAR(pPoint[index].wetness);
- }
+ for (i=0; i<totloop; i++) {
+ int index = mloop[i].v;
+ col[i].a = 255;
+ col[i].r =
+ col[i].g =
+ col[i].b = FTOCHAR(pPoint[index].wetness);
}
}
}
/* vertex group paint */
else if (surface->type == MOD_DPAINT_SURFACE_T_WEIGHT) {
+ MLoop *mloop = CDDM_get_loops(result);
+ int totloop = result->numLoopData;
+
int defgrp_index = defgroup_name_index(ob, surface->output_name);
MDeformVert *dvert = result->getVertDataArray(result, CD_MDEFORMVERT);
float *weight = (float*)sData->type_data;
+
/* viewport preview */
- if (surface->flags & MOD_DPAINT_PREVIEW) {
- /* Save preview results to weight layer, to be
+ if (0 && surface->flags & MOD_DPAINT_PREVIEW) {
+ /* Save preview results to weight layer to be
* able to share same drawing methods */
- MFace *mface = result->getFaceArray(result);
- int numOfFaces = result->getNumFaces(result);
int i;
- MCol *col = result->getFaceDataArray(result, CD_WEIGHT_MCOL);
- if (!col) col = CustomData_add_layer(&result->faceData, CD_WEIGHT_MCOL, CD_CALLOC, NULL, numOfFaces);
+ MLoopCol *col = CustomData_get_layer(&dm->loopData, CD_WEIGHT_MLOOPCOL);
+ if (!col) col = CustomData_add_layer(&dm->loopData, CD_WEIGHT_MLOOPCOL, CD_CALLOC, NULL, totloop);
if (col) {
+ printf("doint weight preview\n");
#pragma omp parallel for schedule(static)
- for (i=0; i<numOfFaces; i++) {
+ for (i=0; i<totloop; i++) {
float temp_color[3];
- int j=0;
- for (; j<((mface[i].v4)?4:3); j++) {
- int index = (j==0)?mface[i].v1: (j==1)?mface[i].v2: (j==2)?mface[i].v3: mface[i].v4;
-
- weight_to_rgb(temp_color, weight[index]);
- col[i*4+j].r = FTOCHAR(temp_color[2]);
- col[i*4+j].g = FTOCHAR(temp_color[1]);
- col[i*4+j].b = FTOCHAR(temp_color[0]);
- col[i*4+j].a = 255;
- }
+ weight_to_rgb(temp_color, weight[mloop[i].v]);
+
+ col[i].a = 255;
+ col[i].r = FTOCHAR(temp_color[2]);
+ col[i].g = FTOCHAR(temp_color[1]);
+ col[i].b = FTOCHAR(temp_color[0]);
}
pmd->canvas->flags |= MOD_DPAINT_PREVIEW_READY;
}
@@ -1748,7 +1742,7 @@ static struct DerivedMesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData
normal_short_to_float_v3(normal, mvert[i].no);
madd_v3_v3fl(mvert[i].co, normal, wPoint[i].height);
}
- CDDM_calc_normals(result);
+ CDDM_calc_normals_mapping(result);
}
/* displace */
@@ -1760,7 +1754,7 @@ static struct DerivedMesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData
/* make a copy of dm to use as brush data */
if (pmd->brush) {
if (pmd->brush->dm) pmd->brush->dm->release(pmd->brush->dm);
- pmd->brush->dm = CDDM_copy(result);
+ pmd->brush->dm = CDDM_copy(result, 0);
}
return result;
@@ -1778,7 +1772,7 @@ void dynamicPaint_cacheUpdateFrames(DynamicPaintSurface *surface)
void canvas_copyDerivedMesh(DynamicPaintCanvasSettings *canvas, DerivedMesh *dm)
{
if (canvas->dm) canvas->dm->release(canvas->dm);
- canvas->dm = CDDM_copy(dm);
+ canvas->dm = CDDM_copy(dm, 0);
}
/*
@@ -1932,8 +1926,8 @@ static int dynamicPaint_findNeighbourPixel(PaintUVPoint *tempPoints, DerivedMesh
* TODO: Implement something more accurate / optimized?
*/
{
- int numOfFaces = dm->getNumFaces(dm);
- MFace *mface = dm->getFaceArray(dm);
+ int numOfFaces = dm->getNumTessFaces(dm);
+ MFace *mface = dm->getTessFaceArray(dm);
MTFace *tface = CustomData_get_layer_named(&dm->faceData, CD_MTFACE, uvname);
/* Get closest edge to that subpixel on UV map */
@@ -2099,8 +2093,8 @@ int dynamicPaint_createUVSurface(DynamicPaintSurface *surface)
if (!dm) return setError(canvas, "Canvas mesh not updated.");
if (surface->format != MOD_DPAINT_SURFACE_F_IMAGESEQ) return setError(canvas, "Can't bake non-\"image sequence\" formats.");
- numOfFaces = dm->getNumFaces(dm);
- mface = dm->getFaceArray(dm);
+ numOfFaces = dm->getNumPolys(dm);
+ mface = dm->getTessFaceArray(dm);
/* get uv map */
CustomData_validate_layer_name(&dm->faceData, CD_MTFACE, surface->uvlayer_name, uvname);
@@ -2698,7 +2692,7 @@ static void dynamicPaint_freeBrushMaterials(BrushMaterials *bMats)
void dynamicPaint_doMaterialTex(BrushMaterials *bMats, float color[3], float *alpha, Object *brushOb, const float volume_co[3], const float surface_co[3], int faceIndex, short isQuad, DerivedMesh *orcoDm)
{
Material *mat = bMats->mat;
- MFace *mface = orcoDm->getFaceArray(orcoDm);
+ MFace *mface = orcoDm->getTessFaceArray(orcoDm);
/* If no material defined, use the one assigned to the mesh face */
if (mat == NULL) {
@@ -3024,7 +3018,7 @@ static void dynamicPaint_brushMeshCalculateVelocity(Scene *scene, Object *ob, Dy
scene->r.subframe = prev_sfra;
subframe_updateObject(scene, ob, UPDATE_EVERYTHING, BKE_curframe(scene));
- dm_p = CDDM_copy(brush->dm);
+ dm_p = CDDM_copy(brush->dm, 0);
numOfVerts_p = dm_p->getNumVerts(dm_p);
mvert_p = dm_p->getVertArray(dm_p);
copy_m4_m4(prev_obmat, ob->obmat);
@@ -3128,9 +3122,9 @@ static int dynamicPaint_paintMesh(DynamicPaintSurface *surface,
Bounds3D mesh_bb = {0};
VolumeGrid *grid = bData->grid;
- dm = CDDM_copy(brush->dm);
+ dm = CDDM_copy(brush->dm, 0);
mvert = dm->getVertArray(dm);
- mface = dm->getFaceArray(dm);
+ mface = dm->getTessFaceArray(dm);
numOfVerts = dm->getNumVerts(dm);
/* Transform collider vertices to global space