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')
-rw-r--r--source/blender/blenkernel/BKE_DerivedMesh.h38
-rw-r--r--source/blender/blenkernel/BKE_customdata.h23
-rw-r--r--source/blender/blenkernel/BKE_displist.h3
-rw-r--r--source/blender/blenkernel/BKE_modifier.h29
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c166
-rw-r--r--source/blender/blenkernel/intern/anim.c8
-rw-r--r--source/blender/blenkernel/intern/customdata.c38
-rw-r--r--source/blender/blenkernel/intern/displist.c8
-rw-r--r--source/blender/blenkernel/intern/exotic.c4
-rw-r--r--source/blender/blenkernel/intern/mesh.c4
-rw-r--r--source/blender/blenkernel/intern/modifier.c113
-rw-r--r--source/blender/blenkernel/intern/object.c2
-rw-r--r--source/blender/blenkernel/intern/softbody.c8
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c4
-rw-r--r--source/blender/blenlib/BLI_editVert.h4
-rw-r--r--source/blender/makesdna/DNA_customdata_types.h12
-rw-r--r--source/blender/makesdna/DNA_object_types.h2
-rw-r--r--source/blender/python/api2_2x/Mesh.c4
-rw-r--r--source/blender/python/api2_2x/NMesh.c6
-rw-r--r--source/blender/render/intern/source/convertblender.c3
-rw-r--r--source/blender/src/drawimage.c3
-rw-r--r--source/blender/src/drawmesh.c4
-rw-r--r--source/blender/src/drawobject.c21
-rw-r--r--source/blender/src/editface.c2
-rw-r--r--source/blender/src/editmesh_mods.c2
-rw-r--r--source/blender/src/editobject.c2
-rw-r--r--source/blender/src/poseobject.c2
-rwxr-xr-xsource/blender/src/transform_conversions.c4
-rw-r--r--source/blender/src/verse_object.c4
-rw-r--r--source/blender/src/vpaint.c2
30 files changed, 418 insertions, 107 deletions
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index 8a72b9ae2a9..f7c771394b8 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -46,6 +46,7 @@
*/
#include "DNA_customdata_types.h"
+#include "BKE_customdata.h"
struct MVert;
struct MEdge;
@@ -295,6 +296,12 @@ int DM_release(DerivedMesh *dm);
*/
void DM_to_mesh(DerivedMesh *dm, struct Mesh *me);
+/* set the CD_FLAG_NOCOPY flag in custom data layers where the mask is
+ * zero for the layer type, so only layer types specified by the mask
+ * will be copied
+ */
+void DM_set_only_copy(DerivedMesh *dm, CustomDataMask mask);
+
/* adds a vertex/edge/face custom data layer to a DerivedMesh, optionally
* backed by an external data array
* if layer != NULL, it is used as the layer data array, otherwise new memory
@@ -337,7 +344,7 @@ void DM_set_face_data(struct DerivedMesh *dm, int index, int type, void *data);
/* custom data copy functions
* copy count elements from source_index in source to dest_index in dest
- * these copy all layers for which the LAYERFLAG_NOCOPY flag is not set
+ * these copy all layers for which the CD_FLAG_NOCOPY flag is not set
*/
void DM_copy_vert_data(struct DerivedMesh *source, struct DerivedMesh *dest,
int source_index, int dest_index, int count);
@@ -396,21 +403,34 @@ void DM_swap_face_data(struct DerivedMesh *dm, int index, int *corner_indices);
float *mesh_get_mapped_verts_nors(struct Object *ob);
/* */
-DerivedMesh *mesh_get_derived_final(struct Object *ob);
-DerivedMesh *mesh_get_derived_deform(struct Object *ob);
+DerivedMesh *mesh_get_derived_final(struct Object *ob,
+ CustomDataMask dataMask);
+DerivedMesh *mesh_get_derived_deform(struct Object *ob,
+ CustomDataMask dataMask);
DerivedMesh *mesh_create_derived_for_modifier(struct Object *ob, struct ModifierData *md);
-DerivedMesh *mesh_create_derived_render(struct Object *ob);
-DerivedMesh *mesh_create_derived_view(struct Object *ob); /* same as above but wont use render settings */
-DerivedMesh *mesh_create_derived_no_deform(struct Object *ob, float (*vertCos)[3]);
-DerivedMesh *mesh_create_derived_no_deform_render(struct Object *ob, float (*vertCos)[3]);
+DerivedMesh *mesh_create_derived_render(struct Object *ob,
+ CustomDataMask dataMask);
+/* same as above but wont use render settings */
+DerivedMesh *mesh_create_derived_view(struct Object *ob,
+ CustomDataMask dataMask);
+DerivedMesh *mesh_create_derived_no_deform(struct Object *ob,
+ float (*vertCos)[3],
+ CustomDataMask dataMask);
+DerivedMesh *mesh_create_derived_no_deform_render(struct Object *ob,
+ float (*vertCos)[3],
+ CustomDataMask dataMask);
DerivedMesh *editmesh_get_derived_base(void);
-DerivedMesh *editmesh_get_derived_cage(void);
-DerivedMesh *editmesh_get_derived_cage_and_final(DerivedMesh **final_r);
+DerivedMesh *editmesh_get_derived_cage(CustomDataMask dataMask);
+DerivedMesh *editmesh_get_derived_cage_and_final(DerivedMesh **final_r,
+ CustomDataMask dataMask);
void weight_to_rgb(float input, float *fr, float *fg, float *fb);
+/* determines required DerivedMesh data according to view and edit modes */
+CustomDataMask get_viewedit_datamask();
+
#endif
diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h
index ce32f06e320..d48340998e0 100644
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@ -36,9 +36,10 @@ struct CustomData;
struct CustomDataLayer;
typedef int CustomDataMask;
-extern CustomDataMask CD_MASK_MESH[];
-extern CustomDataMask CD_MASK_EDITMESH[];
-extern CustomDataMask CD_MASK_DERIVEDMESH[];
+extern const CustomDataMask CD_MASK_BAREMESH;
+extern const CustomDataMask CD_MASK_MESH;
+extern const CustomDataMask CD_MASK_EDITMESH;
+extern const CustomDataMask CD_MASK_DERIVEDMESH;
/* for ORIGINDEX layer type, indicates no original index for this element */
#define ORIGINDEX_NONE -1
@@ -54,15 +55,15 @@ extern CustomDataMask CD_MASK_DERIVEDMESH[];
#define CD_REFERENCE 3 /* reference original pointers, set layer flag NOFREE */
/* initialises a CustomData object with the same layer setup as source.
- * mask must be an array of length CD_NUMTYPES elements, that indicates
+ * mask is a bitfield where (mask & (1 << (layer type))) indicates
* if a layer should be copied or not. alloctype must be one of the above. */
void CustomData_copy(const struct CustomData *source, struct CustomData *dest,
- CustomDataMask *mask, int alloctype, int totelem);
+ CustomDataMask mask, int alloctype, int totelem);
/* same as the above, except that will preserve existing layers, and only add
* the layers that were not there yet */
void CustomData_merge(const struct CustomData *source, struct CustomData *dest,
- CustomDataMask *mask, int alloctype, int totelem);
+ CustomDataMask mask, int alloctype, int totelem);
/* frees data associated with a CustomData object (doesn't free the object
* itself, though)
@@ -105,6 +106,13 @@ int CustomData_has_layer(const struct CustomData *data, int type);
* returns the layer data */
void *CustomData_duplicate_referenced_layer(struct CustomData *data, int type);
+/* set the CD_FLAG_NOCOPY flag in custom data layers where the mask is
+ * zero for the layer type, so only layer types specified by the mask
+ * will be copied
+ */
+void CustomData_set_only_copy(const struct CustomData *data,
+ CustomDataMask mask);
+
/* copies data from one CustomData object to another
* objects need not be compatible, each source layer is copied to the
* first dest layer of correct type (if there is none, the layer is skipped)
@@ -191,4 +199,7 @@ void CustomData_from_em_block(const struct CustomData *source,
void CustomData_file_write_info(int type, char **structname, int *structnum);
int CustomData_sizeof(int type);
+/* get the name of a layer type */
+const char *CustomData_layertype_name(int type);
+
#endif
diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h
index 04f3aadbe3c..979ed31fb20 100644
--- a/source/blender/blenkernel/BKE_displist.h
+++ b/source/blender/blenkernel/BKE_displist.h
@@ -36,6 +36,7 @@
#define BKE_DISPLIST_H
#include "DNA_customdata_types.h"
+#include "BKE_customdata.h"
/* dl->type */
#define DL_POLY 0
@@ -109,7 +110,7 @@ extern void addnormalsDispList(struct Object *ob, struct ListBase *lb);
extern void count_displist(struct ListBase *lb, int *totvert, int *totface);
extern void freedisplist(struct ListBase *lb);
extern int displist_has_faces(struct ListBase *lb);
-extern void makeDerivedMesh(struct Object *ob);
+extern void makeDerivedMesh(struct Object *ob, CustomDataMask dataMask);
extern void makeDispListSurf(struct Object *ob, struct ListBase *dispbase, int forRender);
extern void makeDispListCurveTypes(struct Object *ob, int forOrco);
extern void makeDispListMBall(struct Object *ob);
diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h
index a4c050429e5..586ee4e8552 100644
--- a/source/blender/blenkernel/BKE_modifier.h
+++ b/source/blender/blenkernel/BKE_modifier.h
@@ -33,12 +33,15 @@
#ifndef BKE_MODIFIER_H
#define BKE_MODIFIER_H
+#include "BKE_customdata.h"
+
struct EditMesh;
struct DerivedMesh;
struct DagForest;
struct DagNode;
struct Object;
struct ListBase;
+struct LinkNode;
struct bArmature;
typedef enum {
@@ -102,7 +105,6 @@ typedef struct ModifierTypeInfo {
*/
void (*copyData)(ModifierData *md, ModifierData *target);
-
/********************* Deform modifier functions *********************/
/* Only for deform types, should apply the deformation
@@ -170,6 +172,24 @@ typedef struct ModifierTypeInfo {
*/
void (*initData)(ModifierData *md);
+ /* Should return a CustomDataMask indicating what data this
+ * modifier needs. If (mask & (1 << (layer type))) != 0, this modifier
+ * needs that custom data layer. This function's return value can change
+ * depending on the modifier's settings.
+ *
+ * Note that this means extra data (e.g. vertex groups) - it is assumed
+ * that all modifiers need mesh data and deform modifiers need vertex
+ * coordinates.
+ *
+ * Note that this limits the number of custom data layer types to 32.
+ *
+ * If this function is not present or it returns 0, it is assumed that
+ * no extra data is needed.
+ *
+ * This function is optional.
+ */
+ CustomDataMask (*requiredDataMask)(ModifierData *md);
+
/* Free internal modifier data variables, this function should
* not free the md variable itself.
*
@@ -253,6 +273,13 @@ struct Object *modifiers_isDeformedByArmature(struct Object *ob);
int modifiers_usesArmature(struct Object *ob, struct bArmature *arm);
int modifiers_isDeformed(struct Object *ob);
+/* Calculates and returns a linked list of CustomDataMasks indicating the
+ * data required by each modifier in the stack pointed to by md for correct
+ * evaluation, assuming the data indicated by dataMask is required at the
+ * end of the stack.
+ */
+struct LinkNode *modifiers_calcDataMasks(ModifierData *md,
+ CustomDataMask dataMask);
ModifierData *modifiers_getVirtualModifierList(struct Object *ob);
#endif
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 462a5c09387..8c3e807abd9 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -51,11 +51,15 @@
#include "DNA_object_force.h"
#include "DNA_object_fluidsim.h" // N_T
#include "DNA_scene_types.h" // N_T
+#include "DNA_view3d_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
#include "BLI_arithb.h"
#include "BLI_blenlib.h"
#include "BLI_edgehash.h"
#include "BLI_editVert.h"
+#include "BLI_linklist.h"
#include "BKE_utildefines.h"
#include "BKE_cdderivedmesh.h"
@@ -271,6 +275,13 @@ void DM_to_mesh(DerivedMesh *dm, Mesh *me)
*me = tmp;
}
+void DM_set_only_copy(DerivedMesh *dm, CustomDataMask mask)
+{
+ CustomData_set_only_copy(&dm->vertData, mask);
+ CustomData_set_only_copy(&dm->edgeData, mask);
+ CustomData_set_only_copy(&dm->faceData, mask);
+}
+
void DM_add_vert_layer(DerivedMesh *dm, int type, int flag, void *layer)
{
CustomData_add_layer(&dm->vertData, type, flag, layer, dm->numVertData);
@@ -1554,13 +1565,45 @@ DerivedMesh *mesh_create_derived_for_modifier(Object *ob, ModifierData *md)
return dm;
}
+CustomDataMask get_viewedit_datamask()
+{
+ CustomDataMask mask = CD_MASK_BAREMESH;
+ ScrArea *sa;
+
+ /* check if we need tfaces & mcols due to face select or texture paint */
+ if(G.f & G_FACESELECT || G.f & G_TEXTUREPAINT) {
+ mask |= CD_MASK_MTFACE | CD_MASK_MCOL;
+ } else {
+ /* check if we need tfaces & mcols due to view mode */
+ for(sa = G.curscreen->areabase.first; sa; sa = sa->next) {
+ if(sa->spacetype == SPACE_VIEW3D) {
+ View3D *view = sa->spacedata.first;
+ if(view->drawtype == OB_SHADED) {
+ /* this includes normals for mesh_create_shadedColors */
+ mask |= CD_MASK_MTFACE | CD_MASK_MCOL | CD_MASK_NORMAL;
+ }
+ if(view->drawtype == OB_TEXTURE) {
+ mask |= CD_MASK_MTFACE | CD_MASK_MCOL;
+ }
+ }
+ }
+ }
+
+ /* check if we need mcols due to vertex paint or weightpaint */
+ if(G.f & G_VERTEXPAINT || G.f & G_WEIGHTPAINT)
+ mask |= CD_MASK_MCOL;
+
+ return mask;
+}
+
static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3],
DerivedMesh **deform_r, DerivedMesh **final_r,
int useRenderParams, int useDeform,
- int needMapping)
+ int needMapping, CustomDataMask dataMask)
{
Mesh *me = ob->data;
ModifierData *md = modifiers_getVirtualModifierList(ob);
+ LinkNode *datamasks, *curr;
float (*deformedVerts)[3] = NULL;
DerivedMesh *dm;
int numVerts = me->totvert;
@@ -1569,6 +1612,12 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3],
modifiers_clearErrors(ob);
+ /* we always want to keep original indices */
+ dataMask |= CD_MASK_ORIGINDEX;
+
+ datamasks = modifiers_calcDataMasks(md, dataMask);
+ curr = datamasks;
+
if(deform_r) *deform_r = NULL;
*final_r = NULL;
@@ -1596,7 +1645,7 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3],
deformedVerts = mesh_getVertexCos(me, &numVerts);
/* Apply all leading deforming modifiers */
- for(; md; md = md->next) {
+ for(; md; md = md->next, curr = curr->next) {
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
if((md->mode & required_mode) != required_mode) continue;
@@ -1659,7 +1708,7 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3],
if(me->vnode) dm = derivedmesh_from_versemesh(me->vnode, deformedVerts);
#endif
- for(; md; md = md->next) {
+ for(; md; md = md->next, curr = curr->next) {
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
if((md->mode & required_mode) != required_mode) continue;
@@ -1717,6 +1766,9 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3],
}
}
+ /* set the DerivedMesh to only copy needed data */
+ DM_set_only_copy(dm, (CustomDataMask)curr->link);
+
ndm = mti->applyModifier(md, ob, dm, useRenderParams,
!inputVertexCos);
@@ -1772,6 +1824,8 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3],
if(deformedVerts && deformedVerts != inputVertexCos)
MEM_freeN(deformedVerts);
+ BLI_linklist_free(datamasks, NULL);
+
/* restore mesh in any case */
if(fluidsimMeshUsed) ob->data = ob->fluidsimSettings->orgMesh;
}
@@ -1790,7 +1844,9 @@ static float (*editmesh_getVertexCos(EditMesh *em, int *numVerts_r))[3]
return cos;
}
-static void editmesh_calc_modifiers(DerivedMesh **cage_r, DerivedMesh **final_r)
+static void editmesh_calc_modifiers(DerivedMesh **cage_r,
+ DerivedMesh **final_r,
+ CustomDataMask dataMask)
{
Object *ob = G.obedit;
EditMesh *em = G.editMesh;
@@ -1799,6 +1855,7 @@ static void editmesh_calc_modifiers(DerivedMesh **cage_r, DerivedMesh **final_r)
DerivedMesh *dm;
int i, numVerts = 0, cageIndex = modifiers_getCageIndex(ob, NULL);
int required_mode = eModifierMode_Realtime | eModifierMode_Editmode;
+ LinkNode *datamasks, *curr;
modifiers_clearErrors(ob);
@@ -1807,7 +1864,15 @@ static void editmesh_calc_modifiers(DerivedMesh **cage_r, DerivedMesh **final_r)
}
dm = NULL;
- for(i = 0, md = ob->modifiers.first; md; i++, md = md->next) {
+ md = ob->modifiers.first;
+
+ /* we always want to keep original indices */
+ dataMask |= CD_MASK_ORIGINDEX;
+
+ datamasks = modifiers_calcDataMasks(md, dataMask);
+
+ curr = datamasks;
+ for(i = 0; md; i++, md = md->next, curr = curr->next) {
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
if((md->mode & required_mode) != required_mode) continue;
@@ -1869,6 +1934,9 @@ static void editmesh_calc_modifiers(DerivedMesh **cage_r, DerivedMesh **final_r)
}
}
+ /* set the DerivedMesh to only copy needed data */
+ DM_set_only_copy(dm, (CustomDataMask)curr->link);
+
ndm = mti->applyModifierEM(md, ob, em, dm);
if (ndm) {
@@ -1898,6 +1966,8 @@ static void editmesh_calc_modifiers(DerivedMesh **cage_r, DerivedMesh **final_r)
}
}
+ BLI_linklist_free(datamasks, NULL);
+
/* Yay, we are done. If we have a DerivedMesh and deformed vertices need
* to apply these back onto the DerivedMesh. If we have no DerivedMesh
* then we need to build one.
@@ -2020,7 +2090,7 @@ static void clear_mesh_caches(Object *ob)
}
}
-static void mesh_build_data(Object *ob)
+static void mesh_build_data(Object *ob, CustomDataMask dataMask)
{
Mesh *me = ob->data;
float min[3], max[3];
@@ -2046,8 +2116,9 @@ static void mesh_build_data(Object *ob)
CustomData_add_layer(&me->fdata, CD_MCOL, CD_FLAG_NOFREE, wpcol, me->totface);
me->mcol= wpcol;
- mesh_calc_modifiers(ob, NULL, &ob->derivedDeform, &ob->derivedFinal, 0, 1,
- needMapping);
+ mesh_calc_modifiers(ob, NULL, &ob->derivedDeform,
+ &ob->derivedFinal, 0, 1,
+ needMapping, dataMask);
CustomData_free_layer(&me->fdata, CD_MCOL, me->totface);
if (wpcol) MEM_freeN(wpcol);
@@ -2057,7 +2128,8 @@ static void mesh_build_data(Object *ob)
me->mcol= mcol;
} else {
mesh_calc_modifiers(ob, NULL, &ob->derivedDeform,
- &ob->derivedFinal, 0, 1, needMapping);
+ &ob->derivedFinal, 0, 1,
+ needMapping, dataMask);
}
INIT_MINMAX(min, max);
@@ -2068,10 +2140,11 @@ static void mesh_build_data(Object *ob)
ob->derivedFinal->needsFree = 0;
ob->derivedDeform->needsFree = 0;
+ ob->lastDataMask = dataMask;
}
}
-static void editmesh_build_data(void)
+static void editmesh_build_data(CustomDataMask dataMask)
{
float min[3], max[3];
@@ -2092,7 +2165,8 @@ static void editmesh_build_data(void)
em->derivedCage = NULL;
}
- editmesh_calc_modifiers(&em->derivedCage, &em->derivedFinal);
+ editmesh_calc_modifiers(&em->derivedCage, &em->derivedFinal, dataMask);
+ em->lastDataMask = dataMask;
INIT_MINMAX(min, max);
@@ -2104,14 +2178,14 @@ static void editmesh_build_data(void)
em->derivedCage->needsFree = 0;
}
-void makeDerivedMesh(Object *ob)
+void makeDerivedMesh(Object *ob, CustomDataMask dataMask)
{
if (ob==G.obedit) {
- editmesh_build_data();
+ editmesh_build_data(dataMask);
} else {
PartEff *paf= give_parteff(ob);
- mesh_build_data(ob);
+ mesh_build_data(ob, dataMask);
if(paf) {
if((paf->flag & PAF_STATIC) || (ob->recalc & OB_RECALC_TIME)==0)
@@ -2122,23 +2196,29 @@ void makeDerivedMesh(Object *ob)
/***/
-DerivedMesh *mesh_get_derived_final(Object *ob)
+DerivedMesh *mesh_get_derived_final(Object *ob, CustomDataMask dataMask)
{
- if (!ob->derivedFinal)
- mesh_build_data(ob);
+ /* if there's no derived mesh or the last data mask used doesn't include
+ * the data we need, rebuild the derived mesh
+ */
+ if(!ob->derivedFinal || (dataMask & ob->lastDataMask) != dataMask)
+ mesh_build_data(ob, dataMask);
return ob->derivedFinal;
}
-DerivedMesh *mesh_get_derived_deform(Object *ob)
+DerivedMesh *mesh_get_derived_deform(Object *ob, CustomDataMask dataMask)
{
- if (!ob->derivedDeform)
- mesh_build_data(ob);
+ /* if there's no derived mesh or the last data mask used doesn't include
+ * the data we need, rebuild the derived mesh
+ */
+ if(!ob->derivedDeform || (dataMask & ob->lastDataMask) != dataMask)
+ mesh_build_data(ob, dataMask);
return ob->derivedDeform;
}
-DerivedMesh *mesh_create_derived_render(Object *ob)
+DerivedMesh *mesh_create_derived_render(Object *ob, CustomDataMask dataMask)
{
DerivedMesh *final;
Mesh *m= get_mesh(ob);
@@ -2150,7 +2230,7 @@ DerivedMesh *mesh_create_derived_render(Object *ob)
multires_set_level(ob,m);
}
- mesh_calc_modifiers(ob, NULL, NULL, &final, 1, 1, 0);
+ mesh_calc_modifiers(ob, NULL, NULL, &final, 1, 1, 0, dataMask);
/* Propagate the changes to render level - fails if mesh topology changed */
if(m->mr) {
@@ -2170,48 +2250,60 @@ DerivedMesh *mesh_create_derived_render(Object *ob)
return final;
}
-DerivedMesh *mesh_create_derived_view(Object *ob)
+DerivedMesh *mesh_create_derived_view(Object *ob, CustomDataMask dataMask)
{
DerivedMesh *final;
- mesh_calc_modifiers(ob, NULL, NULL, &final, 0, 1, 0);
+ mesh_calc_modifiers(ob, NULL, NULL, &final, 0, 1, 0, dataMask);
return final;
}
-DerivedMesh *mesh_create_derived_no_deform(Object *ob, float (*vertCos)[3])
+DerivedMesh *mesh_create_derived_no_deform(Object *ob, float (*vertCos)[3],
+ CustomDataMask dataMask)
{
DerivedMesh *final;
- mesh_calc_modifiers(ob, vertCos, NULL, &final, 0, 0, 0);
+ mesh_calc_modifiers(ob, vertCos, NULL, &final, 0, 0, 0, dataMask);
return final;
}
-DerivedMesh *mesh_create_derived_no_deform_render(Object *ob, float (*vertCos)[3])
+DerivedMesh *mesh_create_derived_no_deform_render(Object *ob,
+ float (*vertCos)[3],
+ CustomDataMask dataMask)
{
DerivedMesh *final;
- mesh_calc_modifiers(ob, vertCos, NULL, &final, 1, 0, 0);
+ mesh_calc_modifiers(ob, vertCos, NULL, &final, 1, 0, 0, dataMask);
return final;
}
/***/
-DerivedMesh *editmesh_get_derived_cage_and_final(DerivedMesh **final_r)
+DerivedMesh *editmesh_get_derived_cage_and_final(DerivedMesh **final_r,
+ CustomDataMask dataMask)
{
- if (!G.editMesh->derivedCage)
- editmesh_build_data();
+ /* if there's no derived mesh or the last data mask used doesn't include
+ * the data we need, rebuild the derived mesh
+ */
+ if(!G.editMesh->derivedCage ||
+ (G.editMesh->lastDataMask & dataMask) != dataMask)
+ editmesh_build_data(dataMask);
*final_r = G.editMesh->derivedFinal;
return G.editMesh->derivedCage;
}
-DerivedMesh *editmesh_get_derived_cage(void)
+DerivedMesh *editmesh_get_derived_cage(CustomDataMask dataMask)
{
- if (!G.editMesh->derivedCage)
- editmesh_build_data();
+ /* if there's no derived mesh or the last data mask used doesn't include
+ * the data we need, rebuild the derived mesh
+ */
+ if(!G.editMesh->derivedCage ||
+ (G.editMesh->lastDataMask & dataMask) != dataMask)
+ editmesh_build_data(dataMask);
return G.editMesh->derivedCage;
}
@@ -2258,7 +2350,7 @@ float *mesh_get_mapped_verts_nors(Object *ob)
if(ob->type!=OB_MESH || me->totvert==0)
return NULL;
- dm= mesh_get_derived_final(ob);
+ dm= mesh_get_derived_final(ob, CD_MASK_BAREMESH);
vertexcosnos= MEM_callocN(6*sizeof(float)*me->totvert, "vertexcosnos map");
if(dm->foreachMappedVert) {
@@ -2322,7 +2414,7 @@ void writeBobjgz(char *filename, struct Object *ob, int useGlobalCoords, int app
return;
}
- dm = mesh_create_derived_render(ob);
+ dm = mesh_create_derived_render(ob, CD_MASK_BAREMESH);
//dm = mesh_create_derived_no_deform(ob,NULL);
mvert = dm->getVertArray(dm);
@@ -2426,7 +2518,7 @@ void initElbeemMesh(struct Object *ob,
float *verts;
int *tris;
- dm = mesh_create_derived_render(ob);
+ dm = mesh_create_derived_render(ob, CD_MASK_BAREMESH);
//dm = mesh_create_derived_no_deform(ob,NULL);
if(!dm) { *numVertices = *numTriangles = 0; *triangles=NULL; *vertices=NULL; }
diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c
index ad97128bb37..849a7f316f2 100644
--- a/source/blender/blenkernel/intern/anim.c
+++ b/source/blender/blenkernel/intern/anim.c
@@ -410,9 +410,9 @@ static void vertex_duplilist(ListBase *lb, Scene *sce, Object *par)
lay= G.scene->lay;
if(par==G.obedit)
- dm= editmesh_get_derived_cage();
+ dm= editmesh_get_derived_cage(CD_MASK_BAREMESH);
else
- dm = mesh_get_derived_deform(par);
+ dm = mesh_get_derived_deform(par, CD_MASK_BAREMESH);
totvert = dm->getNumVerts(dm);
@@ -473,7 +473,7 @@ static void face_duplilist(ListBase *lb, Scene *sce, Object *par)
if(par==G.obedit) {
int totvert;
- dm= editmesh_get_derived_cage();
+ dm= editmesh_get_derived_cage(CD_MASK_BAREMESH);
totface= dm->getNumFaces(dm);
mface= MEM_mallocN(sizeof(MFace)*totface, "mface temp");
@@ -483,7 +483,7 @@ static void face_duplilist(ListBase *lb, Scene *sce, Object *par)
dm->copyVertArray(dm, mvert);
}
else {
- dm = mesh_get_derived_deform(par);
+ dm = mesh_get_derived_deform(par, CD_MASK_BAREMESH);
totface= dm->getNumFaces(dm);
mface= dm->getFaceArray(dm);
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index 422107fa273..508021ef74c 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -374,12 +374,17 @@ const char *LAYERTYPENAMES[CD_NUMTYPES] = {
"CDMVert", "CDMSticky", "CDMDeformVert", "CDMEdge", "CDMFace", "CDMTFace",
"CDMCol", "CDOrigIndex", "CDNormal", "CDFlags"};
-CustomDataMask CD_MASK_MESH[CD_NUMTYPES] = {
- 1, 1, 1, 1, 1, 1, 1, 0, 0, 0};
-CustomDataMask CD_MASK_EDITMESH[CD_NUMTYPES] = {
- 0, 1, 1, 0, 0, 1, 1, 0, 0, 0};
-CustomDataMask CD_MASK_DERIVEDMESH[CD_NUMTYPES] = {
- 0, 1, 1, 0, 0, 1, 1, 1, 0, 0};
+const CustomDataMask CD_MASK_BAREMESH =
+ CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE;
+const CustomDataMask CD_MASK_MESH =
+ CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE |
+ CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE | CD_MASK_MCOL;
+const CustomDataMask CD_MASK_EDITMESH =
+ CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE |
+ CD_MASK_MCOL;
+const CustomDataMask CD_MASK_DERIVEDMESH =
+ CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE |
+ CD_MASK_MCOL | CD_MASK_ORIGINDEX;
static const LayerTypeInfo *layerType_getInfo(int type)
{
@@ -412,7 +417,7 @@ static void CustomData_update_offsets(CustomData *data)
}
void CustomData_merge(const struct CustomData *source, struct CustomData *dest,
- CustomDataMask *mask, int alloctype, int totelem)
+ CustomDataMask mask, int alloctype, int totelem)
{
const LayerTypeInfo *typeInfo;
CustomDataLayer *layer;
@@ -424,7 +429,7 @@ void CustomData_merge(const struct CustomData *source, struct CustomData *dest,
typeInfo = layerType_getInfo(layer->type);
if(layer->flag & CD_FLAG_NOCOPY) continue;
- else if(mask && !mask[layer->type]) continue;
+ else if(!(mask & (1 << layer->type))) continue;
else if(CustomData_has_layer(dest, layer->type)) continue;
type = layer->type;
@@ -451,7 +456,7 @@ void CustomData_merge(const struct CustomData *source, struct CustomData *dest,
}
void CustomData_copy(const struct CustomData *source, struct CustomData *dest,
- CustomDataMask *mask, int alloctype, int totelem)
+ CustomDataMask mask, int alloctype, int totelem)
{
memset(dest, 0, sizeof(*dest));
@@ -650,6 +655,16 @@ int CustomData_compat(const CustomData *data1, const CustomData *data2)
return 1;
}
+void CustomData_set_only_copy(const struct CustomData *data,
+ CustomDataMask mask)
+{
+ int i;
+
+ for(i = 0; i < data->totlayer; ++i)
+ if(!(mask & (1 << data->layers[i].type)))
+ data->layers[i].flag |= CD_FLAG_NOCOPY;
+}
+
void CustomData_copy_data(const CustomData *source, CustomData *dest,
int source_index, int dest_index, int count)
{
@@ -1109,3 +1124,8 @@ int CustomData_sizeof(int type)
return type_info->size;
}
+
+const char *CustomData_layertype_name(int type)
+{
+ return layerType_getName(type);
+}
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index 763a4cdc0a0..1cedbe1338e 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -449,15 +449,17 @@ static void mesh_create_shadedColors(Render *re, Object *ob, int onlyForMesh, un
unsigned int *col1, *col2;
float *orco, *vnors, *nors, imat[3][3], mat[4][4], vec[3];
int a, i, need_orco, totface, totvert;
+ CustomDataMask dataMask = CD_MASK_BAREMESH | CD_MASK_MCOL
+ | CD_MASK_MTFACE | CD_MASK_NORMAL;
init_fastshade_for_ob(re, ob, &need_orco, mat, imat);
orco = (need_orco)? mesh_create_orco(ob): NULL;
if (onlyForMesh)
- dm = mesh_get_derived_deform(ob);
+ dm = mesh_get_derived_deform(ob, dataMask);
else
- dm = mesh_get_derived_final(ob);
+ dm = mesh_get_derived_final(ob, dataMask);
mvert = dm->getVertArray(dm);
mface = dm->getFaceArray(dm);
@@ -474,7 +476,7 @@ static void mesh_create_shadedColors(Render *re, Object *ob, int onlyForMesh, un
*col1_r = col1 = MEM_mallocN(sizeof(*col1)*totface*4, "col1");
if (col2_r && (me->flag & ME_TWOSIDED))
- col2 = MEM_mallocN(sizeof(*col2)*totface*4, "col1");
+ col2 = MEM_mallocN(sizeof(*col2)*totface*4, "col2");
else
col2 = NULL;
diff --git a/source/blender/blenkernel/intern/exotic.c b/source/blender/blenkernel/intern/exotic.c
index 0848d2b71a0..4946066e4b3 100644
--- a/source/blender/blenkernel/intern/exotic.c
+++ b/source/blender/blenkernel/intern/exotic.c
@@ -2495,7 +2495,7 @@ static int write_derivedmesh_stl(FILE *fpSTL, Object *ob, DerivedMesh *dm)
static int write_object_stl(FILE *fpSTL, Object *ob, Mesh *me)
{
int numfacets = 0;
- DerivedMesh *dm = mesh_get_derived_final(ob);
+ DerivedMesh *dm = mesh_get_derived_final(ob, CD_MASK_BAREMESH);
numfacets += write_derivedmesh_stl(fpSTL, ob, dm);
@@ -2649,7 +2649,7 @@ static void write_videoscape_mesh(Object *ob, char *str)
}
}
else {
- DerivedMesh *dm = mesh_get_derived_deform(ob);
+ DerivedMesh *dm = mesh_get_derived_deform(ob, CD_MASK_BAREMESH);
me= ob->data;
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 6de2717ba46..52c094acca4 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -505,9 +505,9 @@ static float *make_orco_mesh_internal(Object *ob, int render)
/* Apply orco-changing modifiers */
if (render) {
- dm = mesh_create_derived_no_deform_render(ob, vcos);
+ dm = mesh_create_derived_no_deform_render(ob, vcos, CD_MASK_BAREMESH);
} else {
- dm = mesh_create_derived_no_deform(ob, vcos);
+ dm = mesh_create_derived_no_deform(ob, vcos, CD_MASK_BAREMESH);
}
totvert = dm->getNumVerts(dm);
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index b1037da270e..43c513aaa1b 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -119,6 +119,17 @@ static void curveModifier_copyData(ModifierData *md, ModifierData *target)
strncpy(tcmd->name, cmd->name, 32);
}
+CustomDataMask curveModifier_requiredDataMask(ModifierData *md)
+{
+ CurveModifierData *cmd = (CurveModifierData *)md;
+ CustomDataMask dataMask = 0;
+
+ /* ask for vertexgroups if we need them */
+ if(cmd->name[0]) dataMask |= (1 << CD_MDEFORMVERT);
+
+ return dataMask;
+}
+
static int curveModifier_isDisabled(ModifierData *md)
{
CurveModifierData *cmd = (CurveModifierData*) md;
@@ -184,6 +195,17 @@ static void latticeModifier_copyData(ModifierData *md, ModifierData *target)
strncpy(tlmd->name, lmd->name, 32);
}
+CustomDataMask latticeModifier_requiredDataMask(ModifierData *md)
+{
+ LatticeModifierData *lmd = (LatticeModifierData *)md;
+ CustomDataMask dataMask = 0;
+
+ /* ask for vertexgroups if we need them */
+ if(lmd->name[0]) dataMask |= (1 << CD_MDEFORMVERT);
+
+ return dataMask;
+}
+
static int latticeModifier_isDisabled(ModifierData *md)
{
LatticeModifierData *lmd = (LatticeModifierData*) md;
@@ -2203,6 +2225,20 @@ static void displaceModifier_copyData(ModifierData *md, ModifierData *target)
*tdmd = *dmd;
}
+CustomDataMask displaceModifier_requiredDataMask(ModifierData *md)
+{
+ DisplaceModifierData *dmd = (DisplaceModifierData *)md;
+ CustomDataMask dataMask = 0;
+
+ /* ask for vertexgroups if we need them */
+ if(dmd->defgrp_name[0]) dataMask |= (1 << CD_MDEFORMVERT);
+
+ /* ask for UV coordinates if we need them */
+ if(dmd->texmapping == MOD_DISP_MAP_UV) dataMask |= (1 << CD_MTFACE);
+
+ return dataMask;
+}
+
static void displaceModifier_foreachObjectLink(ModifierData *md, Object *ob,
ObjectWalkFunc walk, void *userData)
{
@@ -2496,6 +2532,16 @@ static void uvprojectModifier_copyData(ModifierData *md, ModifierData *target)
tumd->aspecty = umd->aspecty;
}
+CustomDataMask uvprojectModifier_requiredDataMask(ModifierData *md)
+{
+ CustomDataMask dataMask = 0;
+
+ /* ask for UV coordinates */
+ dataMask |= (1 << CD_MTFACE);
+
+ return dataMask;
+}
+
static void uvprojectModifier_foreachObjectLink(ModifierData *md, Object *ob,
ObjectWalkFunc walk, void *userData)
{
@@ -3054,6 +3100,16 @@ static void armatureModifier_copyData(ModifierData *md, ModifierData *target)
strncpy(tamd->defgrp_name, amd->defgrp_name, 32);
}
+CustomDataMask armatureModifier_requiredDataMask(ModifierData *md)
+{
+ CustomDataMask dataMask = 0;
+
+ /* ask for vertexgroups */
+ dataMask |= (1 << CD_MDEFORMVERT);
+
+ return dataMask;
+}
+
static int armatureModifier_isDisabled(ModifierData *md)
{
ArmatureModifierData *amd = (ArmatureModifierData*) md;
@@ -3134,6 +3190,17 @@ static void hookModifier_copyData(ModifierData *md, ModifierData *target)
strncpy(thmd->name, hmd->name, 32);
}
+CustomDataMask hookModifier_requiredDataMask(ModifierData *md)
+{
+ HookModifierData *hmd = (HookModifierData *)md;
+ CustomDataMask dataMask = 0;
+
+ /* ask for vertexgroups if we need them */
+ if(!hmd->indexar && hmd->name[0]) dataMask |= (1 << CD_MDEFORMVERT);
+
+ return dataMask;
+}
+
static void hookModifier_freeData(ModifierData *md)
{
HookModifierData *hmd = (HookModifierData*) md;
@@ -3413,6 +3480,7 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
| eModifierTypeFlag_SupportsEditmode;
mti->initData = curveModifier_initData;
mti->copyData = curveModifier_copyData;
+ mti->requiredDataMask = curveModifier_requiredDataMask;
mti->isDisabled = curveModifier_isDisabled;
mti->foreachObjectLink = curveModifier_foreachObjectLink;
mti->updateDepgraph = curveModifier_updateDepgraph;
@@ -3424,6 +3492,7 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
mti->flags = eModifierTypeFlag_AcceptsCVs
| eModifierTypeFlag_SupportsEditmode;
mti->copyData = latticeModifier_copyData;
+ mti->requiredDataMask = latticeModifier_requiredDataMask;
mti->isDisabled = latticeModifier_isDisabled;
mti->foreachObjectLink = latticeModifier_foreachObjectLink;
mti->updateDepgraph = latticeModifier_updateDepgraph;
@@ -3490,6 +3559,7 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
mti->flags = eModifierTypeFlag_AcceptsMesh|eModifierTypeFlag_SupportsEditmode;
mti->initData = displaceModifier_initData;
mti->copyData = displaceModifier_copyData;
+ mti->requiredDataMask = displaceModifier_requiredDataMask;
mti->foreachObjectLink = displaceModifier_foreachObjectLink;
mti->foreachIDLink = displaceModifier_foreachIDLink;
mti->updateDepgraph = displaceModifier_updateDepgraph;
@@ -3505,6 +3575,7 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
| eModifierTypeFlag_EnableInEditmode;
mti->initData = uvprojectModifier_initData;
mti->copyData = uvprojectModifier_copyData;
+ mti->requiredDataMask = uvprojectModifier_requiredDataMask;
mti->foreachObjectLink = uvprojectModifier_foreachObjectLink;
mti->foreachIDLink = uvprojectModifier_foreachIDLink;
mti->updateDepgraph = uvprojectModifier_updateDepgraph;
@@ -3536,6 +3607,7 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
| eModifierTypeFlag_SupportsEditmode;
mti->initData = armatureModifier_initData;
mti->copyData = armatureModifier_copyData;
+ mti->requiredDataMask = armatureModifier_requiredDataMask;
mti->isDisabled = armatureModifier_isDisabled;
mti->foreachObjectLink = armatureModifier_foreachObjectLink;
mti->updateDepgraph = armatureModifier_updateDepgraph;
@@ -3548,6 +3620,7 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
| eModifierTypeFlag_SupportsEditmode;
mti->initData = hookModifier_initData;
mti->copyData = hookModifier_copyData;
+ mti->requiredDataMask = hookModifier_requiredDataMask;
mti->freeData = hookModifier_freeData;
mti->isDisabled = hookModifier_isDisabled;
mti->foreachObjectLink = hookModifier_foreachObjectLink;
@@ -3761,6 +3834,46 @@ int modifiers_isSoftbodyEnabled(Object *ob)
return (md && md->mode & (eModifierMode_Realtime | eModifierMode_Render));
}
+LinkNode *modifiers_calcDataMasks(ModifierData *md, CustomDataMask dataMask)
+{
+ LinkNode *dataMasks = NULL;
+ LinkNode *curr, *prev;
+
+ /* build a list of modifier data requirements in reverse order */
+ for(; md; md = md->next) {
+ ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+ CustomDataMask mask = 0;
+
+ if(mti->requiredDataMask) mask = mti->requiredDataMask(md);
+
+ BLI_linklist_prepend(&dataMasks, (void *)mask);
+ }
+
+ /* build the list of required data masks - each mask in the list must
+ * include all elements of the masks that follow it
+ *
+ * note the list is currently in reverse order, so "masks that follow it"
+ * actually means "masks that precede it" at the moment
+ */
+ for(curr = dataMasks, prev = NULL; curr; prev = curr, curr = curr->next) {
+ if(prev) {
+ CustomDataMask prev_mask = (CustomDataMask)prev->link;
+ CustomDataMask curr_mask = (CustomDataMask)curr->link;
+
+ curr->link = (void *)(curr_mask | prev_mask);
+ } else {
+ CustomDataMask curr_mask = (CustomDataMask)curr->link;
+
+ curr->link = (void *)(curr_mask | dataMask);
+ }
+ }
+
+ /* reverse the list so it's in the correct order */
+ BLI_linklist_reverse(&dataMasks);
+
+ return dataMasks;
+}
+
ModifierData *modifiers_getVirtualModifierList(Object *ob)
{
/* Kinda hacky, but should be fine since we are never
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index af2d562b331..a8bf87c966f 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -2007,7 +2007,7 @@ void object_handle_update(Object *ob)
/* includes all keys and modifiers */
if(ob->type==OB_MESH) {
- makeDerivedMesh(ob);
+ makeDerivedMesh(ob, get_viewedit_datamask());
}
else if(ob->type==OB_MBALL) {
makeDispListMBall(ob);
diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c
index acbf4df653a..ad3ea337c55 100644
--- a/source/blender/blenkernel/intern/softbody.c
+++ b/source/blender/blenkernel/intern/softbody.c
@@ -492,9 +492,9 @@ void ccd_build_deflector_hache(Object *vertexowner,GHash *hash)
DerivedMesh *dm= NULL;
if(ob->softflag & OB_SB_COLLFINAL) { /* so maybe someone wants overkill to collide with subsurfed */
- dm = mesh_get_derived_final(ob);
+ dm = mesh_get_derived_final(ob, CD_MASK_BAREMESH);
} else {
- dm = mesh_get_derived_deform(ob);
+ dm = mesh_get_derived_deform(ob, CD_MASK_BAREMESH);
}
if(dm){
@@ -534,9 +534,9 @@ void ccd_update_deflector_hache(Object *vertexowner,GHash *hash)
DerivedMesh *dm= NULL;
if(ob->softflag & OB_SB_COLLFINAL) { /* so maybe someone wants overkill to collide with subsurfed */
- dm = mesh_get_derived_final(ob);
+ dm = mesh_get_derived_final(ob, CD_MASK_BAREMESH);
} else {
- dm = mesh_get_derived_deform(ob);
+ dm = mesh_get_derived_deform(ob, CD_MASK_BAREMESH);
}
if(dm){
ccd_Mesh *ccdmesh = BLI_ghash_lookup(hash,ob);
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 44845ed706b..5f7b656d45a 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -507,7 +507,7 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
tface = NULL;
}
- if(useSubsurfUv && tface) {
+ if(useSubsurfUv && result->getFaceDataArray(result, CD_MTFACE)) {
uvss = _getSubSurf(NULL, ccgSubSurf_getSubdivisionLevels(ss),
0, 1, 0);
@@ -2141,7 +2141,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
}
ccgFaceIterator_free(fi);
- if(useSubsurfUv && tface) {
+ if(useSubsurfUv && dm->getFaceDataArray(&ccgdm->dm, CD_MTFACE)) {
/* not for editmesh currently */
uvss = _getSubSurf(NULL, ccgSubSurf_getSubdivisionLevels(ss),
0, 1, 0);
diff --git a/source/blender/blenlib/BLI_editVert.h b/source/blender/blenlib/BLI_editVert.h
index d39cd748fb1..e81e7db57ca 100644
--- a/source/blender/blenlib/BLI_editVert.h
+++ b/source/blender/blenlib/BLI_editVert.h
@@ -164,6 +164,10 @@ typedef struct EditMesh
* to derived final, care should be taken on release.
*/
struct DerivedMesh *derivedCage, *derivedFinal;
+ /* the custom data layer mask that was last used to calculate
+ * derivedCage and derivedFinal
+ */
+ int lastDataMask;
char retopo_mode; /* 0=OFF, 1=ON, 2=PAINT */
struct RetopoPaintData *retopo_paint_data;
diff --git a/source/blender/makesdna/DNA_customdata_types.h b/source/blender/makesdna/DNA_customdata_types.h
index 08b0345af8d..00c303c0357 100644
--- a/source/blender/makesdna/DNA_customdata_types.h
+++ b/source/blender/makesdna/DNA_customdata_types.h
@@ -62,6 +62,18 @@ typedef struct CustomData {
#define CD_FLAGS 9
#define CD_NUMTYPES 10
+/* Bits for CustomDataMask */
+#define CD_MASK_MVERT (1 << CD_MVERT)
+#define CD_MASK_MSTICKY (1 << CD_MSTICKY)
+#define CD_MASK_MDEFORMVERT (1 << CD_MDEFORMVERT)
+#define CD_MASK_MEDGE (1 << CD_MEDGE)
+#define CD_MASK_MFACE (1 << CD_MFACE)
+#define CD_MASK_MTFACE (1 << CD_MTFACE)
+#define CD_MASK_MCOL (1 << CD_MCOL)
+#define CD_MASK_ORIGINDEX (1 << CD_ORIGINDEX)
+#define CD_MASK_NORMAL (1 << CD_NORMAL)
+#define CD_MASK_FLAGS (1 << CD_FLAGS)
+
/* CustomData.flag */
/* indicates layer should not be copied by CustomData_from_template or
diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h
index f9055dfc11b..a27c6520787 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -210,6 +210,8 @@ typedef struct Object {
struct FluidsimSettings *fluidsimSettings; /* if fluidsim enabled, store additional settings */
struct DerivedMesh *derivedDeform, *derivedFinal;
+ int lastDataMask; /* the custom data layer mask that was last used to calculate derivedDeform and derivedFinal */
+ int pad;
/*#ifdef WITH_VERSE*/
void *vnode; /* pointer at object VerseNode */
diff --git a/source/blender/python/api2_2x/Mesh.c b/source/blender/python/api2_2x/Mesh.c
index 01fce68137d..8e0d5e93284 100644
--- a/source/blender/python/api2_2x/Mesh.c
+++ b/source/blender/python/api2_2x/Mesh.c
@@ -5573,9 +5573,9 @@ static PyObject *Mesh_getFromObject( BPy_Mesh * self, PyObject * args )
/* Write the display mesh into the dummy mesh */
if (render)
- dm = mesh_create_derived_render( ob );
+ dm = mesh_create_derived_render( ob, CD_MASK_MESH );
else
- dm = mesh_create_derived_view( ob );
+ dm = mesh_create_derived_view( ob, CD_MASK_MESH );
tmpmesh = add_mesh( );
DM_to_mesh( dm, tmpmesh );
diff --git a/source/blender/python/api2_2x/NMesh.c b/source/blender/python/api2_2x/NMesh.c
index 5df435ecb2a..7cd3d74673f 100644
--- a/source/blender/python/api2_2x/NMesh.c
+++ b/source/blender/python/api2_2x/NMesh.c
@@ -1455,7 +1455,7 @@ static PyObject *NMesh_update( PyObject *self, PyObject *a, PyObject *kwd )
}
/* recalculate the derived mesh before trying to use it */
- makeDerivedMesh(nmesh->object);
+ makeDerivedMesh(nmesh->object, CD_MASK_BAREMESH);
make_vertexcol(1);
countall();
@@ -2557,7 +2557,9 @@ static PyObject *M_NMesh_GetRawFromObject( PyObject * self, PyObject * args )
break;
case OB_MESH:
{
- DerivedMesh *dm = mesh_create_derived_render( ob );
+ CustomDataMask dataMask = CD_MASK_BAREMESH | CD_MASK_MTFACE
+ | CD_MASK_MCOL;
+ DerivedMesh *dm = mesh_create_derived_render( ob, dataMask );
nmesh = new_NMesh_internal( ob->data, dm );
dm->release(dm);
}
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index 7232e0e6e71..6268971bb79 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -1836,7 +1836,8 @@ static void init_render_mesh(Render *re, Object *ob, Object *par, int only_verts
ob->data= me;
}
- dm = mesh_create_derived_render(ob);
+ dm = mesh_create_derived_render(ob,
+ CD_MASK_BAREMESH | CD_MASK_MTFACE | CD_MASK_MCOL);
/* (Multires) Now switch the meshes back around */
if(me->mr) {
diff --git a/source/blender/src/drawimage.c b/source/blender/src/drawimage.c
index 3d11568a8bc..7e77432158e 100644
--- a/source/blender/src/drawimage.c
+++ b/source/blender/src/drawimage.c
@@ -401,7 +401,8 @@ void draw_tfaces(void)
DerivedMesh *dm;
/* draw final mesh with modifiers applied */
- dm = mesh_get_derived_final(OBACT);
+ dm = mesh_get_derived_final(OBACT,
+ CD_MASK_BAREMESH | CD_MASK_MTFACE);
glColor3ub(112, 112, 112);
if (dm->drawUVEdges) dm->drawUVEdges(dm);
diff --git a/source/blender/src/drawmesh.c b/source/blender/src/drawmesh.c
index ac9940f5a02..c6b0a874ff4 100644
--- a/source/blender/src/drawmesh.c
+++ b/source/blender/src/drawmesh.c
@@ -977,7 +977,7 @@ void draw_tface_mesh(Object *ob, Mesh *me, int dt)
if(me==NULL) return;
- dm = mesh_get_derived_final(ob);
+ dm = mesh_get_derived_final(ob, get_viewedit_datamask());
glShadeModel(GL_SMOOTH);
@@ -1031,7 +1031,7 @@ void draw_tface_mesh(Object *ob, Mesh *me, int dt)
/* drawing game engine text hack */
if (!editing && prop && me->tface) {
- DerivedMesh *ddm = mesh_get_derived_deform(ob);
+ DerivedMesh *ddm = mesh_get_derived_deform(ob, CD_MASK_BAREMESH);
MFace *mface= me->mface;
MTFace *tface= me->mtface;
MCol *mcol= me->mcol; /* why does mcol exist? */
diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c
index 5bc188c6ac6..94917c99671 100644
--- a/source/blender/src/drawobject.c
+++ b/source/blender/src/drawobject.c
@@ -1137,7 +1137,7 @@ static void mesh_foreachScreenVert__mapFunc(void *userData, int index, float *co
void mesh_foreachScreenVert(void (*func)(void *userData, EditVert *eve, int x, int y, int index), void *userData, int clipVerts)
{
struct { void (*func)(void *userData, EditVert *eve, int x, int y, int index); void *userData; int clipVerts; float pmat[4][4], vmat[4][4]; } data;
- DerivedMesh *dm = editmesh_get_derived_cage();
+ DerivedMesh *dm = editmesh_get_derived_cage(CD_MASK_BAREMESH);
data.func = func;
data.userData = userData;
@@ -1179,7 +1179,7 @@ static void mesh_foreachScreenEdge__mapFunc(void *userData, int index, float *v0
void mesh_foreachScreenEdge(void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index), void *userData, int clipVerts)
{
struct { void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index); void *userData; int clipVerts; float pmat[4][4], vmat[4][4]; } data;
- DerivedMesh *dm = editmesh_get_derived_cage();
+ DerivedMesh *dm = editmesh_get_derived_cage(CD_MASK_BAREMESH);
data.func = func;
data.userData = userData;
@@ -1209,7 +1209,7 @@ static void mesh_foreachScreenFace__mapFunc(void *userData, int index, float *ce
void mesh_foreachScreenFace(void (*func)(void *userData, EditFace *efa, int x, int y, int index), void *userData)
{
struct { void (*func)(void *userData, EditFace *efa, int x, int y, int index); void *userData; float pmat[4][4], vmat[4][4]; } data;
- DerivedMesh *dm = editmesh_get_derived_cage();
+ DerivedMesh *dm = editmesh_get_derived_cage(CD_MASK_BAREMESH);
data.func = func;
data.userData = userData;
@@ -2150,7 +2150,8 @@ static int draw_mesh_object(Base *base, int dt, int flag)
if (G.obedit!=ob)
finalDM = cageDM = editmesh_get_derived_base();
else
- cageDM = editmesh_get_derived_cage_and_final(&finalDM);
+ cageDM = editmesh_get_derived_cage_and_final(&finalDM,
+ get_viewedit_datamask());
if(dt>OB_WIRE) init_gl_materials(ob, 0); // no transp in editmode, the fancy draw over goes bad then
draw_em_fancy(ob, G.editMesh, cageDM, finalDM, dt);
@@ -2167,8 +2168,10 @@ static int draw_mesh_object(Base *base, int dt, int flag)
/* don't create boundbox here with mesh_get_bb(), the derived system will make it, puts deformed bb's OK */
if(me->totface<=4 || boundbox_clip(ob->obmat, me->bb)) {
- DerivedMesh *baseDM = mesh_get_derived_deform(ob);
- DerivedMesh *realDM = mesh_get_derived_final(ob);
+ DerivedMesh *baseDM
+ = mesh_get_derived_deform(ob, get_viewedit_datamask());
+ DerivedMesh *realDM
+ = mesh_get_derived_final(ob, get_viewedit_datamask());
if(dt==OB_SOLID) has_alpha= init_gl_materials(ob, (base->flag & OB_FROMDUPLI)==0);
if(baseDM && realDM) draw_mesh_fancy(base, baseDM, realDM, dt, flag);
@@ -4275,7 +4278,7 @@ static int bbs_mesh_wire__setDrawOpts(void *userData, int index)
static void bbs_mesh_solid(Object *ob)
{
- DerivedMesh *dm = mesh_get_derived_final(ob);
+ DerivedMesh *dm = mesh_get_derived_final(ob, get_viewedit_datamask());
Mesh *me = (Mesh*)ob->data;
glColor3ub(0, 0, 0);
@@ -4311,7 +4314,7 @@ void draw_object_backbufsel(Object *ob)
switch( ob->type) {
case OB_MESH:
if(ob==G.obedit) {
- DerivedMesh *dm = editmesh_get_derived_cage();
+ DerivedMesh *dm = editmesh_get_derived_cage(CD_MASK_BAREMESH);
EM_init_index_arrays(1, 1, 1);
@@ -4356,7 +4359,7 @@ void draw_object_instance(Object *ob, int dt, int outline)
if(G.obedit && ob->data==G.obedit->data)
edm= editmesh_get_derived_base();
else
- dm = mesh_get_derived_final(ob);
+ dm = mesh_get_derived_final(ob, CD_MASK_BAREMESH);
if(dt<=OB_WIRE) {
if(dm)
diff --git a/source/blender/src/editface.c b/source/blender/src/editface.c
index fa40d210303..ba9174f0c4d 100644
--- a/source/blender/src/editface.c
+++ b/source/blender/src/editface.c
@@ -1584,7 +1584,7 @@ void texpaint_pick_uv(Object *ob, Mesh *mesh, unsigned int faceindex, short *xy,
float v1[2], v2[2], v3[2], v4[2], p[2], w[3];
float absw, minabsw;
int nvert;
- DerivedMesh *dm = mesh_get_derived_final(ob);
+ DerivedMesh *dm = mesh_get_derived_final(ob, CD_MASK_BAREMESH);
int *index = dm->getFaceDataArray(dm, CD_ORIGINDEX);
MTFace *tface = dm->getFaceDataArray(dm, CD_MTFACE), *tf;
int numfaces = dm->getNumFaces(dm), a;
diff --git a/source/blender/src/editmesh_mods.c b/source/blender/src/editmesh_mods.c
index f0b1aa7ebd6..bd20e68830d 100644
--- a/source/blender/src/editmesh_mods.c
+++ b/source/blender/src/editmesh_mods.c
@@ -625,7 +625,7 @@ static void draw_dm_mapped_face_center(DerivedMesh *dm, EditFace *efa)
static void unified_select_draw(EditVert *eve, EditEdge *eed, EditFace *efa)
{
- DerivedMesh *dm = editmesh_get_derived_cage();
+ DerivedMesh *dm = editmesh_get_derived_cage(CD_MASK_BAREMESH);
glDrawBuffer(GL_FRONT);
diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c
index eef50449b8a..a22ed7674f7 100644
--- a/source/blender/src/editobject.c
+++ b/source/blender/src/editobject.c
@@ -2567,7 +2567,7 @@ void convertmenu(void)
G.totmesh++;
/* make new mesh data from the original copy */
- dm= mesh_get_derived_final(ob1);
+ dm= mesh_get_derived_final(ob1, CD_MASK_MESH);
/* dm= mesh_create_derived_no_deform(ob1, NULL); this was called original (instead of get_derived). man o man why! (ton) */
DM_to_mesh(dm, ob1->data);
diff --git a/source/blender/src/poseobject.c b/source/blender/src/poseobject.c
index aa82544217c..f2fe70737a8 100644
--- a/source/blender/src/poseobject.c
+++ b/source/blender/src/poseobject.c
@@ -755,7 +755,7 @@ void pose_adds_vgroups(Object *meshobj)
if(poseobj==NULL || (poseobj->flag & OB_POSEMODE)==0) return;
- dm = mesh_get_derived_final(meshobj);
+ dm = mesh_get_derived_final(meshobj, CD_MASK_BAREMESH);
map.meshobj= meshobj;
diff --git a/source/blender/src/transform_conversions.c b/source/blender/src/transform_conversions.c
index 395020ddb68..3dafd08d57e 100755
--- a/source/blender/src/transform_conversions.c
+++ b/source/blender/src/transform_conversions.c
@@ -1521,11 +1521,11 @@ static float *get_crazy_mapped_editverts(void)
/* this call disables subsurf and enables the underlying modifier to deform, apparently */
modifiers_setOnCage(G.obedit, md);
/* make it all over */
- makeDerivedMesh(G.obedit);
+ makeDerivedMesh(G.obedit, CD_MASK_BAREMESH);
}
/* now get the cage */
- dm= editmesh_get_derived_cage();
+ dm= editmesh_get_derived_cage(CD_MASK_BAREMESH);
vertexcos= MEM_mallocN(3*sizeof(float)*G.totvert, "vertexcos map");
dm->foreachMappedVert(dm, make_vertexcos__mapFunc, vertexcos);
diff --git a/source/blender/src/verse_object.c b/source/blender/src/verse_object.c
index 6f6113b75dc..2a285d828b9 100644
--- a/source/blender/src/verse_object.c
+++ b/source/blender/src/verse_object.c
@@ -414,7 +414,7 @@ void b_verse_unsubscribe(VNode *vnode)
}
/* reinitialize object derived mesh */
- makeDerivedMesh(ob);
+ makeDerivedMesh(ob, get_viewedit_datamask());
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
}
else if(vnode->type==V_NT_BITMAP) {
@@ -445,7 +445,7 @@ void post_link_set(VLink *vlink)
me = (Mesh*)((VGeomData*)target->data)->mesh;
if(ob && me && ob->data!=me) {
ob->data = me;
- makeDerivedMesh(ob);
+ makeDerivedMesh(ob, get_viewedit_datamask());
}
}
diff --git a/source/blender/src/vpaint.c b/source/blender/src/vpaint.c
index 916bca354e0..6ee817aeb5f 100644
--- a/source/blender/src/vpaint.c
+++ b/source/blender/src/vpaint.c
@@ -988,7 +988,7 @@ static void sample_wpaint(int mode)
extern float editbutvweight;
float w1, w2, w3, w4, co[3], fac;
- dm = mesh_get_derived_final(ob);
+ dm = mesh_get_derived_final(ob, CD_MASK_BAREMESH);
if(dm->getVertCo==NULL) {
notice("Not supported yet");
}