diff options
Diffstat (limited to 'source/blender/blenkernel/intern/dynamicpaint.c')
-rw-r--r-- | source/blender/blenkernel/intern/dynamicpaint.c | 104 |
1 files changed, 49 insertions, 55 deletions
diff --git a/source/blender/blenkernel/intern/dynamicpaint.c b/source/blender/blenkernel/intern/dynamicpaint.c index e0ae3f42be6..5cc1da276d5 100644 --- a/source/blender/blenkernel/intern/dynamicpaint.c +++ b/source/blender/blenkernel/intern/dynamicpaint.c @@ -201,7 +201,7 @@ typedef struct PaintBakeData { * 3 float dir vec + 1 float str */ float *brush_velocity; /** copy of previous frame vertices. used to observe surface movement. */ - MVert *prev_verts; + float (*prev_positions)[3]; /** Previous frame object matrix. */ float prev_obmat[4][4]; /** flag to check if surface was cleared/reset -> have to redo velocity etc. */ @@ -900,8 +900,8 @@ static void free_bakeData(PaintSurfaceData *data) if (bData->grid) { freeGrid(data); } - if (bData->prev_verts) { - MEM_freeN(bData->prev_verts); + if (bData->prev_positions) { + MEM_freeN(bData->prev_positions); } if (bData->velocity) { MEM_freeN(bData->velocity); @@ -1774,7 +1774,7 @@ typedef struct DynamicPaintModifierApplyData { const DynamicPaintSurface *surface; Object *ob; - MVert *mvert; + float (*positions)[3]; const float (*vert_normals)[3]; const MLoop *mloop; const MPoly *mpoly; @@ -1791,13 +1791,11 @@ static void dynamic_paint_apply_surface_displace_cb(void *__restrict userdata, const DynamicPaintModifierApplyData *data = userdata; const DynamicPaintSurface *surface = data->surface; - MVert *mvert = data->mvert; const float *value = (float *)surface->data->type_data; const float val = value[i] * surface->disp_factor; - /* same as 'mvert[i].co[0] -= normal[0] * val' etc. */ - madd_v3_v3fl(mvert[i].co, data->vert_normals[i], -val); + madd_v3_v3fl(data->positions[i], data->vert_normals[i], -val); } /* apply displacing vertex surface to the derived mesh */ @@ -1811,11 +1809,11 @@ static void dynamicPaint_applySurfaceDisplace(DynamicPaintSurface *surface, Mesh /* displace paint */ if (surface->type == MOD_DPAINT_SURFACE_T_DISPLACE) { - MVert *mvert = BKE_mesh_verts_for_write(result); + float(*positions)[3] = BKE_mesh_positions_for_write(result); DynamicPaintModifierApplyData data = { .surface = surface, - .mvert = mvert, + .positions = positions, .vert_normals = BKE_mesh_vertex_normals_ensure(result), }; TaskParallelSettings settings; @@ -1882,9 +1880,8 @@ static void dynamic_paint_apply_surface_wave_cb(void *__restrict userdata, const DynamicPaintModifierApplyData *data = userdata; PaintWavePoint *wPoint = (PaintWavePoint *)data->surface->data->type_data; - MVert *mvert = data->mvert; - madd_v3_v3fl(mvert[i].co, data->vert_normals[i], wPoint[i].height); + madd_v3_v3fl(data->positions[i], data->vert_normals[i], wPoint[i].height); } /* @@ -2010,11 +2007,11 @@ static Mesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData *pmd, Object * } /* wave simulation */ else if (surface->type == MOD_DPAINT_SURFACE_T_WAVE) { - MVert *mvert = BKE_mesh_verts_for_write(result); + float(*positions)[3] = BKE_mesh_positions_for_write(result); DynamicPaintModifierApplyData data = { .surface = surface, - .mvert = mvert, + .positions = positions, .vert_normals = BKE_mesh_vertex_normals_ensure(result), }; TaskParallelSettings settings; @@ -2961,7 +2958,6 @@ int dynamicPaint_createUVSurface(Scene *scene, BKE_mesh_vert_looptri_map_create(&vert_to_looptri_map, &vert_to_looptri_map_mem, - BKE_mesh_verts_for_write(mesh), mesh->totvert, mlooptri, tottri, @@ -3413,16 +3409,16 @@ static void mesh_tris_spherecast_dp(void *userdata, BVHTreeRayHit *hit) { const BVHTreeFromMesh *data = (BVHTreeFromMesh *)userdata; - const MVert *vert = data->vert; + const float(*positions)[3] = data->positions; const MLoopTri *mlooptri = data->looptri; const MLoop *mloop = data->loop; const float *t0, *t1, *t2; float dist; - t0 = vert[mloop[mlooptri[index].tri[0]].v].co; - t1 = vert[mloop[mlooptri[index].tri[1]].v].co; - t2 = vert[mloop[mlooptri[index].tri[2]].v].co; + t0 = positions[mloop[mlooptri[index].tri[0]].v]; + t1 = positions[mloop[mlooptri[index].tri[1]].v]; + t2 = positions[mloop[mlooptri[index].tri[2]].v]; dist = bvhtree_ray_tri_intersection(ray, hit->dist, t0, t1, t2); @@ -3445,15 +3441,15 @@ static void mesh_tris_nearest_point_dp(void *userdata, BVHTreeNearest *nearest) { const BVHTreeFromMesh *data = (BVHTreeFromMesh *)userdata; - const MVert *vert = data->vert; + const float(*positions)[3] = data->positions; const MLoopTri *mlooptri = data->looptri; const MLoop *mloop = data->loop; float nearest_tmp[3], dist_sq; const float *t0, *t1, *t2; - t0 = vert[mloop[mlooptri[index].tri[0]].v].co; - t1 = vert[mloop[mlooptri[index].tri[1]].v].co; - t2 = vert[mloop[mlooptri[index].tri[2]].v].co; + t0 = positions[mloop[mlooptri[index].tri[0]].v]; + t1 = positions[mloop[mlooptri[index].tri[1]].v]; + t2 = positions[mloop[mlooptri[index].tri[2]].v]; closest_on_tri_to_point_v3(nearest_tmp, co, t0, t1, t2); dist_sq = len_squared_v3v3(co, nearest_tmp); @@ -3709,8 +3705,8 @@ static bool meshBrush_boundsIntersect(Bounds3D *b1, typedef struct DynamicPaintBrushVelocityData { Vec3f *brush_vel; - const MVert *mvert_p; - const MVert *mvert_c; + const float (*positions_p)[3]; + const float (*positions_c)[3]; float (*obmat)[4]; float (*prev_obmat)[4]; @@ -3726,8 +3722,8 @@ static void dynamic_paint_brush_velocity_compute_cb(void *__restrict userdata, Vec3f *brush_vel = data->brush_vel; - const MVert *mvert_p = data->mvert_p; - const MVert *mvert_c = data->mvert_c; + const float(*positions_p)[3] = data->positions_p; + const float(*positions_c)[3] = data->positions_c; float(*obmat)[4] = data->obmat; float(*prev_obmat)[4] = data->prev_obmat; @@ -3736,10 +3732,10 @@ static void dynamic_paint_brush_velocity_compute_cb(void *__restrict userdata, float p1[3], p2[3]; - copy_v3_v3(p1, mvert_p[i].co); + copy_v3_v3(p1, positions_p[i]); mul_m4_v3(prev_obmat, p1); - copy_v3_v3(p2, mvert_c[i].co); + copy_v3_v3(p2, positions_c[i]); mul_m4_v3(obmat, p2); sub_v3_v3v3(brush_vel[i].v, p2, p1); @@ -3755,7 +3751,6 @@ static void dynamicPaint_brushMeshCalculateVelocity(Depsgraph *depsgraph, { float prev_obmat[4][4]; Mesh *mesh_p, *mesh_c; - MVert *mvert_p, *mvert_c; int numOfVerts_p, numOfVerts_c; float cur_sfra = scene->r.subframe; @@ -3782,7 +3777,7 @@ static void dynamicPaint_brushMeshCalculateVelocity(Depsgraph *depsgraph, mesh_p = BKE_mesh_copy_for_eval(dynamicPaint_brush_mesh_get(brush), false); numOfVerts_p = mesh_p->totvert; - mvert_p = BKE_mesh_verts_for_write(mesh_p); + float(*positions_p)[3] = BKE_mesh_positions_for_write(mesh_p); copy_m4_m4(prev_obmat, ob->object_to_world); /* current frame mesh */ @@ -3798,7 +3793,7 @@ static void dynamicPaint_brushMeshCalculateVelocity(Depsgraph *depsgraph, eModifierType_DynamicPaint); mesh_c = dynamicPaint_brush_mesh_get(brush); numOfVerts_c = mesh_c->totvert; - mvert_c = BKE_mesh_verts_for_write(mesh_c); + float(*positions_c)[3] = BKE_mesh_positions_for_write(mesh_c); (*brushVel) = (struct Vec3f *)MEM_mallocN(numOfVerts_c * sizeof(Vec3f), "Dynamic Paint brush velocity"); @@ -3808,14 +3803,14 @@ static void dynamicPaint_brushMeshCalculateVelocity(Depsgraph *depsgraph, /* if mesh is constructive -> num of verts has changed, only use current frame derived mesh */ if (numOfVerts_p != numOfVerts_c) { - mvert_p = mvert_c; + positions_p = positions_c; } /* calculate speed */ DynamicPaintBrushVelocityData data = { .brush_vel = *brushVel, - .mvert_p = mvert_p, - .mvert_c = mvert_c, + .positions_p = positions_p, + .positions_c = positions_c, .obmat = ob->object_to_world, .prev_obmat = prev_obmat, .timescale = timescale, @@ -3886,7 +3881,7 @@ typedef struct DynamicPaintPaintData { const int c_index; Mesh *mesh; - const MVert *mvert; + const float (*positions)[3]; const MLoop *mloop; const MLoopTri *mlooptri; const float brush_radius; @@ -3919,7 +3914,7 @@ static void dynamic_paint_paint_mesh_cell_point_cb_ex( const float timescale = data->timescale; const int c_index = data->c_index; - const MVert *mvert = data->mvert; + const float(*positions)[3] = data->positions; const MLoop *mloop = data->mloop; const MLoopTri *mlooptri = data->mlooptri; const float brush_radius = data->brush_radius; @@ -4000,7 +3995,7 @@ static void dynamic_paint_paint_mesh_cell_point_cb_ex( }; float dot; - normal_tri_v3(hit.no, mvert[vtri[0]].co, mvert[vtri[1]].co, mvert[vtri[2]].co); + normal_tri_v3(hit.no, positions[vtri[0]], positions[vtri[1]], positions[vtri[2]]); dot = dot_v3v3(ray_dir, hit.no); /* If ray and hit face normal are facing same direction @@ -4149,7 +4144,7 @@ static void dynamic_paint_paint_mesh_cell_point_cb_ex( const int v3 = mloop[mlooptri[hitTri].tri[2]].v; /* calculate barycentric weights for hit point */ - interp_weights_tri_v3(weights, mvert[v1].co, mvert[v2].co, mvert[v3].co, hitCoord); + interp_weights_tri_v3(weights, positions[v1], positions[v2], positions[v3], hitCoord); /* Simple check based on brush surface velocity, * TODO: perhaps implement something that handles volume movement as well. */ @@ -4245,7 +4240,6 @@ static bool dynamicPaint_paintMesh(Depsgraph *depsgraph, PaintBakeData *bData = sData->bData; Mesh *mesh = NULL; Vec3f *brushVelocity = NULL; - MVert *mvert = NULL; const MLoopTri *mlooptri = NULL; const MLoop *mloop = NULL; @@ -4269,7 +4263,7 @@ static bool dynamicPaint_paintMesh(Depsgraph *depsgraph, VolumeGrid *grid = bData->grid; mesh = BKE_mesh_copy_for_eval(brush_mesh, false); - mvert = BKE_mesh_verts_for_write(mesh); + float(*positions)[3] = BKE_mesh_positions_for_write(mesh); const float(*vert_normals)[3] = BKE_mesh_vertex_normals_ensure(mesh); mlooptri = BKE_mesh_runtime_looptri_ensure(mesh); mloop = BKE_mesh_loops(mesh); @@ -4279,8 +4273,8 @@ static bool dynamicPaint_paintMesh(Depsgraph *depsgraph, * (Faster than transforming per surface point * coordinates and normals to object space) */ for (ii = 0; ii < numOfVerts; ii++) { - mul_m4_v3(brushOb->object_to_world, mvert[ii].co); - boundInsert(&mesh_bb, mvert[ii].co); + mul_m4_v3(brushOb->object_to_world, positions[ii]); + boundInsert(&mesh_bb, positions[ii]); /* for proximity project calculate average normal */ if (brush->flags & MOD_DPAINT_PROX_PROJECT && brush->collision != MOD_DPAINT_COL_VOLUME) { @@ -4325,7 +4319,7 @@ static bool dynamicPaint_paintMesh(Depsgraph *depsgraph, .timescale = timescale, .c_index = c_index, .mesh = mesh, - .mvert = mvert, + .positions = positions, .mloop = mloop, .mlooptri = mlooptri, .brush_radius = brush_radius, @@ -4758,7 +4752,7 @@ static bool dynamicPaint_paintSinglePoint( } const Mesh *brush_mesh = dynamicPaint_brush_mesh_get(brush); - const MVert *mvert = BKE_mesh_verts(brush_mesh); + const float(*positions)[3] = BKE_mesh_positions(brush_mesh); /* * Loop through every surface point @@ -4769,7 +4763,7 @@ static bool dynamicPaint_paintSinglePoint( .brushOb = brushOb, .scene = scene, .timescale = timescale, - .mvert = mvert, + .positions = positions, .brush_radius = brush_radius, .brushVelocity = &brushVel, .pointCoord = pointCoord, @@ -5861,11 +5855,11 @@ static bool dynamicPaint_surfaceHasMoved(DynamicPaintSurface *surface, Object *o PaintSurfaceData *sData = surface->data; PaintBakeData *bData = sData->bData; Mesh *mesh = dynamicPaint_canvas_mesh_get(surface->canvas); - const MVert *mvert = BKE_mesh_verts(mesh); + const float(*positions)[3] = BKE_mesh_positions(mesh); int numOfVerts = mesh->totvert; - if (!bData->prev_verts) { + if (!bData->prev_positions) { return true; } @@ -5876,7 +5870,7 @@ static bool dynamicPaint_surfaceHasMoved(DynamicPaintSurface *surface, Object *o /* vertices */ for (int i = 0; i < numOfVerts; i++) { - if (!equals_v3v3(bData->prev_verts[i].co, mvert[i].co)) { + if (!equals_v3v3(bData->prev_positions[i], positions[i])) { return true; } } @@ -5889,7 +5883,7 @@ typedef struct DynamicPaintGenerateBakeData { const DynamicPaintSurface *surface; Object *ob; - const MVert *mvert; + const float (*positions)[3]; const float (*vert_normals)[3]; const Vec3f *canvas_verts; @@ -6021,7 +6015,7 @@ static bool dynamicPaint_generateBakeData(DynamicPaintSurface *surface, const bool do_accel_data = (surface->effect & MOD_DPAINT_EFFECT_DO_DRIP) != 0; int canvasNumOfVerts = mesh->totvert; - const MVert *mvert = BKE_mesh_verts(mesh); + const float(*positions)[3] = BKE_mesh_positions(mesh); Vec3f *canvas_verts; if (bData) { @@ -6067,8 +6061,8 @@ static bool dynamicPaint_generateBakeData(DynamicPaintSurface *surface, bData->s_num = MEM_mallocN(sData->total_points * sizeof(uint), "Dynamic Paint bData s_num"); bData->realCoord = (struct Vec3f *)MEM_mallocN(surface_totalSamples(surface) * sizeof(Vec3f), "Dynamic Paint point coords"); - bData->prev_verts = MEM_mallocN(canvasNumOfVerts * sizeof(MVert), - "Dynamic Paint bData prev_verts"); + bData->prev_positions = MEM_mallocN(canvasNumOfVerts * sizeof(float[3]), + "Dynamic Paint bData prev_positions"); /* if any allocation failed, free everything */ if (!bData->bNormal || !bData->s_pos || !bData->s_num || !bData->realCoord || !canvas_verts) { @@ -6112,7 +6106,7 @@ static bool dynamicPaint_generateBakeData(DynamicPaintSurface *surface, */ bData->mesh_bounds.valid = false; for (index = 0; index < canvasNumOfVerts; index++) { - copy_v3_v3(canvas_verts[index].v, mvert[index].co); + copy_v3_v3(canvas_verts[index].v, positions[index]); mul_m4_v3(ob->object_to_world, canvas_verts[index].v); boundInsert(&bData->mesh_bounds, canvas_verts[index].v); } @@ -6123,7 +6117,7 @@ static bool dynamicPaint_generateBakeData(DynamicPaintSurface *surface, DynamicPaintGenerateBakeData data = { .surface = surface, .ob = ob, - .mvert = mvert, + .positions = positions, .vert_normals = BKE_mesh_vertex_normals_ensure(mesh), .canvas_verts = canvas_verts, .do_velocity_data = do_velocity_data, @@ -6144,7 +6138,7 @@ static bool dynamicPaint_generateBakeData(DynamicPaintSurface *surface, /* Copy current frame vertices to check against in next frame */ copy_m4_m4(bData->prev_obmat, ob->object_to_world); - memcpy(bData->prev_verts, mvert, canvasNumOfVerts * sizeof(MVert)); + memcpy(bData->prev_positions, positions, canvasNumOfVerts * sizeof(float[3])); bData->clear = 0; |