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.c104
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;