diff options
Diffstat (limited to 'source/blender/blenkernel/intern/dynamicpaint.c')
-rw-r--r-- | source/blender/blenkernel/intern/dynamicpaint.c | 158 |
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 |