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:
authorRohan Rathi <rohanrathi08@gmail.com>2018-05-29 08:40:54 +0300
committerRohan Rathi <rohanrathi08@gmail.com>2018-05-29 08:40:54 +0300
commit842245ac55ceca67863cdad252d8959cefb789c5 (patch)
tree3301dd7fc5324ccd8b2ceea0d389f7d55b413fa8 /source/blender/modifiers/intern
parent5d2d36b0686d7253f9d61c00a63d273aba17677a (diff)
parent6946c413402c05a838e98a3823bf926df8cfe8d1 (diff)
Merge branch 'blender2.8' into soc-2018-bevel
Diffstat (limited to 'source/blender/modifiers/intern')
-rw-r--r--source/blender/modifiers/intern/MOD_array.c4
-rw-r--r--source/blender/modifiers/intern/MOD_boolean.c20
-rw-r--r--source/blender/modifiers/intern/MOD_meshdeform.c12
-rw-r--r--source/blender/modifiers/intern/MOD_particlesystem.c51
-rw-r--r--source/blender/modifiers/intern/MOD_surfacedeform.c16
-rw-r--r--source/blender/modifiers/intern/MOD_uvproject.c22
-rw-r--r--source/blender/modifiers/intern/MOD_weightvgproximity.c2
7 files changed, 81 insertions, 46 deletions
diff --git a/source/blender/modifiers/intern/MOD_array.c b/source/blender/modifiers/intern/MOD_array.c
index 4a67b8318bb..e74d9087427 100644
--- a/source/blender/modifiers/intern/MOD_array.c
+++ b/source/blender/modifiers/intern/MOD_array.c
@@ -390,7 +390,7 @@ static Mesh *arrayModifier_doArray(
vgroup_start_cap_remap = BKE_object_defgroup_index_map_create(
amd->start_cap, ctx->object, &vgroup_start_cap_remap_len);
- start_cap_mesh = BKE_modifier_get_evaluated_mesh_from_object(amd->start_cap, ctx->flag);
+ start_cap_mesh = BKE_modifier_get_evaluated_mesh_from_object(ctx, amd->start_cap);
if (start_cap_mesh) {
start_cap_nverts = start_cap_mesh->totvert;
start_cap_nedges = start_cap_mesh->totedge;
@@ -402,7 +402,7 @@ static Mesh *arrayModifier_doArray(
vgroup_end_cap_remap = BKE_object_defgroup_index_map_create(
amd->end_cap, ctx->object, &vgroup_end_cap_remap_len);
- end_cap_mesh = BKE_modifier_get_evaluated_mesh_from_object(amd->end_cap, ctx->flag);
+ end_cap_mesh = BKE_modifier_get_evaluated_mesh_from_object(ctx, amd->end_cap);
if (end_cap_mesh) {
end_cap_nverts = end_cap_mesh->totvert;
end_cap_nedges = end_cap_mesh->totedge;
diff --git a/source/blender/modifiers/intern/MOD_boolean.c b/source/blender/modifiers/intern/MOD_boolean.c
index ebe5aacd888..73d1388d88f 100644
--- a/source/blender/modifiers/intern/MOD_boolean.c
+++ b/source/blender/modifiers/intern/MOD_boolean.c
@@ -56,6 +56,8 @@
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
+#include "DEG_depsgraph_query.h"
+
#include "MEM_guardedalloc.h"
#include "bmesh.h"
@@ -173,18 +175,19 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
if (!bmd->object)
return mesh;
- mesh_other = BKE_modifier_get_evaluated_mesh_from_object(bmd->object, ctx->flag);
-
+ mesh_other = BKE_modifier_get_evaluated_mesh_from_object(ctx, bmd->object);
if (mesh_other) {
Mesh *result;
+ Object *object_eval = DEG_get_evaluated_object(ctx->depsgraph, ctx->object);
+ Object *other_eval = DEG_get_evaluated_object(ctx->depsgraph, bmd->object);
/* when one of objects is empty (has got no faces) we could speed up
* calculation a bit returning one of objects' derived meshes (or empty one)
* Returning mesh is depended on modifiers operation (sergey) */
- result = get_quick_mesh(ctx->object, mesh, bmd->object, mesh_other, bmd->operation);
+ result = get_quick_mesh(object_eval, mesh, other_eval, mesh_other, bmd->operation);
if (result == NULL) {
- const bool is_flip = (is_negative_m4(ctx->object->obmat) != is_negative_m4(bmd->object->obmat));
+ const bool is_flip = (is_negative_m4(object_eval->obmat) != is_negative_m4(other_eval->obmat));
BMesh *bm;
const BMAllocTemplate allocsize = BMALLOC_TEMPLATE_FROM_ME(mesh, mesh_other);
@@ -231,8 +234,8 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
float imat[4][4];
float omat[4][4];
- invert_m4_m4(imat, ctx->object->obmat);
- mul_m4_m4m4(omat, imat, bmd->object->obmat);
+ invert_m4_m4(imat, object_eval->obmat);
+ mul_m4_m4m4(omat, imat, other_eval->obmat);
BMVert *eve;
i = 0;
@@ -254,10 +257,11 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
negate_m3(nmat);
}
- const short ob_src_totcol = bmd->object->totcol;
+ const short ob_src_totcol = other_eval->totcol;
short *material_remap = BLI_array_alloca(material_remap, ob_src_totcol ? ob_src_totcol : 1);
- BKE_material_remap_object_calc(ctx->object, bmd->object, material_remap);
+ /* Using original (not evaluated) object here since we are writing to it. */
+ BKE_material_remap_object_calc(ctx->object, other_eval, material_remap);
BMFace *efa;
i = 0;
diff --git a/source/blender/modifiers/intern/MOD_meshdeform.c b/source/blender/modifiers/intern/MOD_meshdeform.c
index 94adb3d9ebc..48653856178 100644
--- a/source/blender/modifiers/intern/MOD_meshdeform.c
+++ b/source/blender/modifiers/intern/MOD_meshdeform.c
@@ -275,7 +275,7 @@ static void meshdeform_vert_task(
}
static void meshdeformModifier_do(
- ModifierData *md, Object *ob, Mesh *mesh,
+ ModifierData *md, Depsgraph *depsgraph, Object *ob, Mesh *mesh,
float (*vertexCos)[3], int numVerts)
{
MeshDeformModifierData *mmd = (MeshDeformModifierData *) md;
@@ -307,7 +307,11 @@ static void meshdeformModifier_do(
free_cagemesh = true;
}
else {
- cagemesh = BKE_modifier_get_evaluated_mesh_from_object(ob, md->mode & eModifierMode_Render ? MOD_APPLY_RENDER : 0);
+ ModifierEvalContext ctx = {
+ .depsgraph = depsgraph,
+ .flag = md->mode & eModifierMode_Render ? MOD_APPLY_RENDER : 0,
+ };
+ cagemesh = BKE_modifier_get_evaluated_mesh_from_object(&ctx, ob);
}
/* if we don't have one computed, use derivedmesh from data
@@ -421,7 +425,7 @@ static void deformVerts(
modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */
- meshdeformModifier_do(md, ctx->object, mesh_src, vertexCos, numVerts);
+ meshdeformModifier_do(md, ctx->depsgraph, ctx->object, mesh_src, vertexCos, numVerts);
if (mesh_src && mesh_src != mesh) {
BKE_id_free(NULL, mesh_src);
@@ -437,7 +441,7 @@ static void deformVertsEM(
{
Mesh *mesh_src = get_mesh(ctx->object, NULL, mesh, NULL, false, false);
- meshdeformModifier_do(md, ctx->object, mesh_src, vertexCos, numVerts);
+ meshdeformModifier_do(md, ctx->depsgraph, ctx->object, mesh_src, vertexCos, numVerts);
if (mesh_src && mesh_src != mesh) {
BKE_id_free(NULL, mesh_src);
diff --git a/source/blender/modifiers/intern/MOD_particlesystem.c b/source/blender/modifiers/intern/MOD_particlesystem.c
index c2493e6d8f3..72bdcc779ea 100644
--- a/source/blender/modifiers/intern/MOD_particlesystem.c
+++ b/source/blender/modifiers/intern/MOD_particlesystem.c
@@ -42,6 +42,7 @@
#include "BKE_cdderivedmesh.h"
+#include "BKE_editmesh.h"
#include "BKE_mesh.h"
#include "BKE_library.h"
#include "BKE_modifier.h"
@@ -55,7 +56,7 @@ static void initData(ModifierData *md)
ParticleSystemModifierData *psmd = (ParticleSystemModifierData *) md;
psmd->psys = NULL;
psmd->mesh_final = NULL;
- psmd->mesh_deformed = NULL;
+ psmd->mesh_original = NULL;
psmd->totdmvert = psmd->totdmedge = psmd->totdmface = 0;
}
static void freeData(ModifierData *md)
@@ -65,9 +66,9 @@ static void freeData(ModifierData *md)
if (psmd->mesh_final) {
BKE_id_free(NULL, psmd->mesh_final);
psmd->mesh_final = NULL;
- if (psmd->mesh_deformed) {
- BKE_id_free(NULL, psmd->mesh_deformed);
- psmd->mesh_deformed = NULL;
+ if (psmd->mesh_original) {
+ BKE_id_free(NULL, psmd->mesh_original);
+ psmd->mesh_original = NULL;
}
}
psmd->totdmvert = psmd->totdmedge = psmd->totdmface = 0;
@@ -88,7 +89,7 @@ static void copyData(const ModifierData *md, ModifierData *target)
modifier_copyData_generic(md, target);
tpsmd->mesh_final = NULL;
- tpsmd->mesh_deformed = NULL;
+ tpsmd->mesh_original = NULL;
tpsmd->totdmvert = tpsmd->totdmedge = tpsmd->totdmface = 0;
}
@@ -129,9 +130,9 @@ static void deformVerts(
if (psmd->mesh_final) {
BKE_id_free(NULL, psmd->mesh_final);
psmd->mesh_final = NULL;
- if (psmd->mesh_deformed) {
- BKE_id_free(NULL, psmd->mesh_deformed);
- psmd->mesh_deformed = NULL;
+ if (psmd->mesh_original) {
+ BKE_id_free(NULL, psmd->mesh_original);
+ psmd->mesh_original = NULL;
}
}
else if (psmd->flag & eParticleSystemFlag_file_loaded) {
@@ -156,20 +157,40 @@ static void deformVerts(
BKE_mesh_tessface_ensure(psmd->mesh_final);
if (!psmd->mesh_final->runtime.deformed_only) {
- /* XXX Think we can assume here that if current DM is not only-deformed, ob->deformedOnly has been set.
- * This is awfully weak though. :| */
- if (ctx->object->derivedDeform) {
- DM_to_mesh(ctx->object->derivedDeform, psmd->mesh_deformed, ctx->object, CD_MASK_EVERYTHING, false);
+ /* Get the original mesh from the object, this is what the particles
+ * are attached to so in case of non-deform modifiers we need to remap
+ * them to the final mesh (typically subdivision surfaces). */
+ Mesh *mesh_original = NULL;
+
+ if (ctx->object->type == OB_MESH) {
+ BMEditMesh *edit_btmesh = BKE_editmesh_from_object(ctx->object);
+
+ if (edit_btmesh) {
+ /* In edit mode get directly from the edit mesh. */
+ psmd->mesh_original = BKE_bmesh_to_mesh_nomain(edit_btmesh->bm, &(struct BMeshToMeshParams){0});
+ }
+ else {
+ /* Otherwise get regular mesh. */
+ mesh_original = ctx->object->data;
+ }
}
- else { /* Can happen in some cases, e.g. when rendering from Edit mode... */
- BKE_id_copy_ex(NULL, &mesh_src->id, (ID **)&psmd->mesh_deformed,
+ else {
+ mesh_original = mesh_src;
+ }
+
+ if (mesh_original) {
+ /* Make a persistent copy of the mesh. We don't actually need
+ * all this data, just some topology for remapping. Could be
+ * optimized once. */
+ BKE_id_copy_ex(NULL, &mesh_original->id, (ID **)&psmd->mesh_original,
LIB_ID_CREATE_NO_MAIN |
LIB_ID_CREATE_NO_USER_REFCOUNT |
LIB_ID_CREATE_NO_DEG_TAG |
LIB_ID_COPY_NO_PREVIEW,
false);
}
- BKE_mesh_tessface_ensure(psmd->mesh_deformed);
+
+ BKE_mesh_tessface_ensure(psmd->mesh_original);
}
if (mesh_src != psmd->mesh_final && mesh_src != mesh) {
diff --git a/source/blender/modifiers/intern/MOD_surfacedeform.c b/source/blender/modifiers/intern/MOD_surfacedeform.c
index ab0b31812b2..f03ae73e2bb 100644
--- a/source/blender/modifiers/intern/MOD_surfacedeform.c
+++ b/source/blender/modifiers/intern/MOD_surfacedeform.c
@@ -1041,7 +1041,7 @@ static bool surfacedeformBind(
return data.success == 1;
}
-static Mesh *surfacedeform_get_mesh(SurfaceDeformModifierData *smd, bool *r_needsfree)
+static Mesh *surfacedeform_get_mesh(Depsgraph *depsgraph, SurfaceDeformModifierData *smd, bool *r_needsfree)
{
Mesh *mesh;
@@ -1052,8 +1052,11 @@ static Mesh *surfacedeform_get_mesh(SurfaceDeformModifierData *smd, bool *r_need
*r_needsfree = true;
}
else {
- mesh = BKE_modifier_get_evaluated_mesh_from_object(
- smd->target, smd->modifier.mode & eModifierMode_Render ? MOD_APPLY_RENDER : 0);
+ ModifierEvalContext ctx = {
+ .depsgraph = depsgraph,
+ .flag = smd->modifier.mode & eModifierMode_Render ? MOD_APPLY_RENDER : 0,
+ };
+ mesh = BKE_modifier_get_evaluated_mesh_from_object(&ctx, smd->target);
*r_needsfree = false;
}
@@ -1124,6 +1127,7 @@ static void deformVert(
static void surfacedeformModifier_do(
ModifierData *md,
+ const ModifierEvalContext *ctx,
float (*vertexCos)[3], unsigned int numverts, Object *ob)
{
SurfaceDeformModifierData *smd = (SurfaceDeformModifierData *)md;
@@ -1137,7 +1141,7 @@ static void surfacedeformModifier_do(
return;
}
- target = surfacedeform_get_mesh(smd, &free_target);
+ target = surfacedeform_get_mesh(ctx->depsgraph, smd, &free_target);
if (!target) {
modifier_setError(md, "No valid target mesh");
return;
@@ -1204,7 +1208,7 @@ static void deformVerts(
Mesh *UNUSED(mesh),
float (*vertexCos)[3], int numVerts)
{
- surfacedeformModifier_do(md, vertexCos, numVerts, ctx->object);
+ surfacedeformModifier_do(md, ctx, vertexCos, numVerts, ctx->object);
}
static void deformVertsEM(
@@ -1213,7 +1217,7 @@ static void deformVertsEM(
Mesh *UNUSED(mesh),
float (*vertexCos)[3], int numVerts)
{
- surfacedeformModifier_do(md, vertexCos, numVerts, ctx->object);
+ surfacedeformModifier_do(md, ctx, vertexCos, numVerts, ctx->object);
}
static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams))
diff --git a/source/blender/modifiers/intern/MOD_uvproject.c b/source/blender/modifiers/intern/MOD_uvproject.c
index 207c692071c..b491496caa4 100644
--- a/source/blender/modifiers/intern/MOD_uvproject.c
+++ b/source/blender/modifiers/intern/MOD_uvproject.c
@@ -55,7 +55,9 @@
#include "MEM_guardedalloc.h"
+#include "DEG_depsgraph.h"
#include "DEG_depsgraph_build.h"
+#include "DEG_depsgraph_query.h"
static void initData(ModifierData *md)
{
@@ -111,7 +113,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
}
typedef struct Projector {
- Object *ob; /* object this projector is derived from */
+ Object *ob_eval; /* object this projector is derived from */
float projmat[4][4]; /* projection matrix */
float normal[3]; /* projector normal in world space */
void *uci; /* optional uv-project info (panorama projection) */
@@ -119,6 +121,7 @@ typedef struct Projector {
static Mesh *uvprojectModifier_do(
UVProjectModifierData *umd,
+ Depsgraph *depsgraph,
Object *ob, Mesh *mesh)
{
float (*coords)[3], (*co)[3];
@@ -137,7 +140,7 @@ static Mesh *uvprojectModifier_do(
for (i = 0; i < umd->num_projectors; ++i)
if (umd->projectors[i])
- projectors[num_projectors++].ob = umd->projectors[i];
+ projectors[num_projectors++].ob_eval = DEG_get_evaluated_object(depsgraph, umd->projectors[i]);
if (num_projectors == 0) return mesh;
@@ -154,15 +157,14 @@ static Mesh *uvprojectModifier_do(
float offsetmat[4][4];
Camera *cam = NULL;
/* calculate projection matrix */
- invert_m4_m4(projectors[i].projmat, projectors[i].ob->obmat);
+ invert_m4_m4(projectors[i].projmat, projectors[i].ob_eval->obmat);
projectors[i].uci = NULL;
- if (projectors[i].ob->type == OB_CAMERA) {
-
- cam = (Camera *)projectors[i].ob->data;
+ if (projectors[i].ob_eval->type == OB_CAMERA) {
+ cam = (Camera *)projectors[i].ob_eval->data;
if (cam->type == CAM_PANO) {
- projectors[i].uci = BLI_uvproject_camera_info(projectors[i].ob, NULL, aspx, aspy);
+ projectors[i].uci = BLI_uvproject_camera_info(projectors[i].ob_eval, NULL, aspx, aspy);
BLI_uvproject_camera_info_scale(projectors[i].uci, scax, scay);
free_uci = 1;
}
@@ -171,7 +173,7 @@ static Mesh *uvprojectModifier_do(
/* setup parameters */
BKE_camera_params_init(&params);
- BKE_camera_params_from_object(&params, projectors[i].ob);
+ BKE_camera_params_from_object(&params, projectors[i].ob_eval);
/* compute matrix, viewplane, .. */
BKE_camera_params_compute_viewplane(&params, 1, 1, aspx, aspy);
@@ -200,7 +202,7 @@ static Mesh *uvprojectModifier_do(
projectors[i].normal[0] = 0;
projectors[i].normal[1] = 0;
projectors[i].normal[2] = 1;
- mul_mat3_m4_v3(projectors[i].ob->obmat, projectors[i].normal);
+ mul_mat3_m4_v3(projectors[i].ob_eval->obmat, projectors[i].normal);
}
numPolys = mesh->totpoly;
@@ -312,7 +314,7 @@ static Mesh *applyModifier(
Mesh *result;
UVProjectModifierData *umd = (UVProjectModifierData *) md;
- result = uvprojectModifier_do(umd, ctx->object, mesh);
+ result = uvprojectModifier_do(umd, ctx->depsgraph, ctx->object, mesh);
return result;
}
diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c
index 64133222c1e..9e77e0d3794 100644
--- a/source/blender/modifiers/intern/MOD_weightvgproximity.c
+++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c
@@ -506,7 +506,7 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
const bool use_trgt_faces = (wmd->proximity_flags & MOD_WVG_PROXIMITY_GEOM_FACES) != 0;
if (use_trgt_verts || use_trgt_edges || use_trgt_faces) {
- Mesh *target_mesh = BKE_modifier_get_evaluated_mesh_from_object(obr, ctx->flag);
+ Mesh *target_mesh = BKE_modifier_get_evaluated_mesh_from_object(ctx, obr);
/* We must check that we do have a valid target_mesh! */
if (target_mesh != NULL) {