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:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2006-11-20 07:28:02 +0300
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2006-11-20 07:28:02 +0300
commite435fbc3c5a00e5b63c1cd2609ab6828187660d3 (patch)
tree3f1da9c51451dee55a203cd001d37f8774d2582f /source/blender
parent0a7c43c6e5fc7d5d75a4645eca1164cede2d03a6 (diff)
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are still used of course, but allocating, copying or freeing these arrays should be done through the CustomData API. Work in progress documentation on this is here: http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData Replaced TFace by MTFace: This is the same struct, except that it does not contain color, that now always stays separated in MCol. This was not a good design decision to begin with, and it is needed for adding multiple color layers later. Note that this does mean older Blender versions will not be able to read UV coordinates from the next release, due to an SDNA limitation. Removed DispListMesh: This now fully replaced by DerivedMesh. To provide access to arrays of vertices, edges and faces, like DispListMesh does. The semantics of the DerivedMesh.getVertArray() and similar functions were changed to return a pointer to an array if one exists, or otherwise allocate a temporary one. On releasing the DerivedMesh, this temporary array will be removed automatically. Removed ssDM and meshDM DerivedMesh backends: The ssDM backend was for DispListMesh, so that became obsolete automatically. The meshDM backend was replaced by the custom data backend, that now figures out which layers need to be modified, and only duplicates those. This changes code in many places, and overall removes 2514 lines of code. So, there's a good chance this might break some stuff, although I've been testing it for a few days now. The good news is, adding multiple color and uv layers should now become easy.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/BKE_DerivedMesh.h69
-rw-r--r--source/blender/blenkernel/BKE_bad_level_calls.h2
-rw-r--r--source/blender/blenkernel/BKE_cdderivedmesh.h25
-rw-r--r--source/blender/blenkernel/BKE_customdata.h103
-rw-r--r--source/blender/blenkernel/BKE_displist.h31
-rw-r--r--source/blender/blenkernel/BKE_mesh.h13
-rw-r--r--source/blender/blenkernel/BKE_subsurf.h3
-rw-r--r--source/blender/blenkernel/bad_level_call_stubs/stubs.c1
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c1723
-rw-r--r--source/blender/blenkernel/intern/anim.c8
-rw-r--r--source/blender/blenkernel/intern/armature.c4
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c814
-rw-r--r--source/blender/blenkernel/intern/customdata.c593
-rw-r--r--source/blender/blenkernel/intern/displist.c213
-rw-r--r--source/blender/blenkernel/intern/exotic.c168
-rw-r--r--source/blender/blenkernel/intern/lattice.c10
-rw-r--r--source/blender/blenkernel/intern/mesh.c179
-rw-r--r--source/blender/blenkernel/intern/modifier.c225
-rw-r--r--source/blender/blenkernel/intern/object.c4
-rw-r--r--source/blender/blenkernel/intern/softbody.c66
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c996
-rw-r--r--source/blender/blenloader/intern/readfile.c143
-rw-r--r--source/blender/blenloader/intern/writefile.c45
-rw-r--r--source/blender/include/BDR_drawmesh.h4
-rw-r--r--source/blender/include/BDR_editface.h7
-rw-r--r--source/blender/include/BDR_vpaint.h2
-rw-r--r--source/blender/include/BIF_editmesh.h2
-rw-r--r--source/blender/include/BSE_types.h2
-rw-r--r--source/blender/makesdna/DNA_customdata_types.h44
-rw-r--r--source/blender/makesdna/DNA_mesh_types.h70
-rw-r--r--source/blender/makesdna/DNA_meshdata_types.h55
-rw-r--r--source/blender/makesdna/intern/makesdna.c2
-rw-r--r--source/blender/python/api2_2x/Mesh.c532
-rw-r--r--source/blender/python/api2_2x/NMesh.c226
-rw-r--r--source/blender/radiosity/extern/include/radio_types.h12
-rw-r--r--source/blender/radiosity/intern/source/radio.c11
-rw-r--r--source/blender/radiosity/intern/source/radpostprocess.c86
-rw-r--r--source/blender/radiosity/intern/source/radpreprocess.c25
-rw-r--r--source/blender/render/intern/include/render_types.h4
-rw-r--r--source/blender/render/intern/source/convertblender.c144
-rw-r--r--source/blender/render/intern/source/rendercore.c2
-rw-r--r--source/blender/src/booleanops.c70
-rw-r--r--source/blender/src/buttons_editing.c66
-rw-r--r--source/blender/src/drawimage.c37
-rw-r--r--source/blender/src/drawmesh.c66
-rw-r--r--source/blender/src/drawobject.c71
-rw-r--r--source/blender/src/drawview.c2
-rw-r--r--source/blender/src/editdeform.c14
-rw-r--r--source/blender/src/editface.c335
-rw-r--r--source/blender/src/editmesh.c139
-rw-r--r--source/blender/src/editmesh_lib.c12
-rw-r--r--source/blender/src/editmesh_mods.c25
-rw-r--r--source/blender/src/editmesh_tools.c70
-rw-r--r--source/blender/src/editobject.c31
-rw-r--r--source/blender/src/editsima.c110
-rw-r--r--source/blender/src/editview.c5
-rw-r--r--source/blender/src/filesel.c5
-rw-r--r--source/blender/src/fluidsim.c59
-rw-r--r--source/blender/src/header_view3d.c18
-rw-r--r--source/blender/src/imagepaint.c2
-rw-r--r--source/blender/src/meshtools.c154
-rw-r--r--source/blender/src/multires.c98
-rw-r--r--source/blender/src/poseobject.c5
-rw-r--r--source/blender/src/sculptmode.c50
-rw-r--r--source/blender/src/space.c2
-rwxr-xr-xsource/blender/src/transform_conversions.c13
-rw-r--r--source/blender/src/unwrapper.c24
-rw-r--r--source/blender/src/verse_mesh.c46
-rw-r--r--source/blender/src/verse_object.c10
-rw-r--r--source/blender/src/vpaint.c137
-rwxr-xr-xsource/blender/yafray/intern/export_File.cpp6
-rw-r--r--source/blender/yafray/intern/export_Plugin.cpp8
-rw-r--r--source/blender/yafray/intern/export_Plugin.h2
-rw-r--r--source/blender/yafray/intern/yafray_Render.cpp2
74 files changed, 2929 insertions, 5433 deletions
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index 4506f5740fb..8a72b9ae2a9 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -50,12 +50,12 @@
struct MVert;
struct MEdge;
struct MFace;
-struct TFace;
+struct MTFace;
struct Object;
struct Mesh;
struct EditMesh;
-struct DispListMesh;
struct ModifierData;
+struct MCol;
/* number of sub-elements each mesh element has (for interpolation) */
#define SUB_ELEMS_VERT 0
@@ -64,8 +64,10 @@ struct ModifierData;
typedef struct DerivedMesh DerivedMesh;
struct DerivedMesh {
- /* custom data for verts, edges & faces */
+ /* Private DerivedMesh data, only for internal DerivedMesh use */
CustomData vertData, edgeData, faceData;
+ int numVertData, numEdgeData, numFaceData;
+ int needsFree; /* checked on ->release, is set to 0 for cached results */
/* Misc. Queries */
@@ -77,18 +79,29 @@ struct DerivedMesh {
int (*getNumEdges)(DerivedMesh *dm);
/* copy a single vert/edge/face from the derived mesh into
- * *{vert/edge/face}_r
+ * *{vert/edge/face}_r. note that the current implementation
+ * of this function can be quite slow, iterating over all
+ * elements (editmesh, verse mesh)
*/
void (*getVert)(DerivedMesh *dm, int index, struct MVert *vert_r);
void (*getEdge)(DerivedMesh *dm, int index, struct MEdge *edge_r);
void (*getFace)(DerivedMesh *dm, int index, struct MFace *face_r);
+ /* return a pointer to the entire array of verts/edges/face from the
+ * derived mesh. if such an array does not exist yet, it will be created,
+ * and freed on the next ->release(). consider using getVert/Edge/Face if
+ * you are only interested in a few verts/edges/faces.
+ */
+ struct MVert *(*getVertArray)(DerivedMesh *dm);
+ struct MEdge *(*getEdgeArray)(DerivedMesh *dm);
+ struct MFace *(*getFaceArray)(DerivedMesh *dm);
+
/* copy all verts/edges/faces from the derived mesh into
* *{vert/edge/face}_r (must point to a buffer large enough)
*/
- void (*getVertArray)(DerivedMesh *dm, struct MVert *vert_r);
- void (*getEdgeArray)(DerivedMesh *dm, struct MEdge *edge_r);
- void (*getFaceArray)(DerivedMesh *dm, struct MFace *face_r);
+ void (*copyVertArray)(DerivedMesh *dm, struct MVert *vert_r);
+ void (*copyEdgeArray)(DerivedMesh *dm, struct MEdge *edge_r);
+ void (*copyFaceArray)(DerivedMesh *dm, struct MFace *face_r);
/* return a copy of all verts/edges/faces from the derived mesh
* it is the caller's responsibility to free the returned pointer
@@ -142,16 +155,6 @@ struct DerivedMesh {
float *cent, float *no),
void *userData);
- /* Convert to new DispListMesh, should be free'd by caller.
- *
- * If allowShared is true then the caller is committing to not free'ng
- * the DerivedMesh before free'ng the DispListMesh, which means that
- * certain fields of the returned DispListMesh can safely be share with
- * the DerivedMesh's internal data.
- */
- struct DispListMesh* (*convertToDispListMesh)(DerivedMesh *dm,
- int allowShared);
-
/* Iterate over all vertex points, calling DO_MINMAX with given args.
*
* Also called in Editmode
@@ -205,11 +208,12 @@ struct DerivedMesh {
void (*drawFacesColored)(DerivedMesh *dm, int useTwoSided,
unsigned char *col1, unsigned char *col2);
- /* Draw all faces using TFace
+ /* Draw all faces using MTFace
* o Drawing options too complicated to enumerate, look at code.
*/
void (*drawFacesTex)(DerivedMesh *dm,
- int (*setDrawOptions)(struct TFace *tface, int matnr));
+ int (*setDrawOptions)(struct MTFace *tface,
+ struct MCol *mcol, int matnr));
/* Draw mapped faces (no color, or texture)
* o Only if !setDrawOptions or
@@ -229,7 +233,7 @@ struct DerivedMesh {
int *drawSmooth_r),
void *userData, int useColors);
- /* Draw mapped faces using TFace
+ /* Draw mapped faces using MTFace
* o Drawing options too complicated to enumerate, look at code.
*/
void (*drawMappedFacesTex)(DerivedMesh *dm,
@@ -260,6 +264,8 @@ struct DerivedMesh {
float t),
void *userData);
+ /* Release reference to the DerivedMesh. This function decides internally
+ * if the DerivedMesh will be freed, or cached for later use. */
void (*release)(DerivedMesh *dm);
};
@@ -281,8 +287,9 @@ void DM_from_template(DerivedMesh *dm, DerivedMesh *source,
int numVerts, int numEdges, int numFaces);
/* utility function to release a DerivedMesh's layers
+ * returns 1 if DerivedMesh has to be released by the backend, 0 otherwise
*/
-void DM_release(DerivedMesh *dm);
+int DM_release(DerivedMesh *dm);
/* utility function to convert a DerivedMesh to a Mesh
*/
@@ -381,16 +388,16 @@ void DM_interp_face_data(struct DerivedMesh *source, struct DerivedMesh *dest,
float *weights, FaceVertWeight *vert_weights,
int count, int dest_index);
- /* Simple function to get me->totvert amount of vertices/normals,
- correctly deformed and subsurfered. Needed especially when vertexgroups are involved.
- In use now by vertex/weigt paint and particles */
-float *mesh_get_mapped_verts_nors(struct Object *ob);
+void DM_swap_face_data(struct DerivedMesh *dm, int index, int *corner_indices);
- /* Internal function, just temporarily exposed */
-DerivedMesh *derivedmesh_from_displistmesh(struct DispListMesh *dlm, float (*vertexCos)[3]);
+/* Simple function to get me->totvert amount of vertices/normals,
+ correctly deformed and subsurfered. Needed especially when vertexgroups are involved.
+ In use now by vertex/weigt paint and particles */
+float *mesh_get_mapped_verts_nors(struct Object *ob);
-DerivedMesh *mesh_get_derived_final(struct Object *ob, int *needsFree_r);
-DerivedMesh *mesh_get_derived_deform(struct Object *ob, int *needsFree_r);
+ /* */
+DerivedMesh *mesh_get_derived_final(struct Object *ob);
+DerivedMesh *mesh_get_derived_deform(struct Object *ob);
DerivedMesh *mesh_create_derived_for_modifier(struct Object *ob, struct ModifierData *md);
@@ -400,8 +407,8 @@ 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 *editmesh_get_derived_base(void);
-DerivedMesh *editmesh_get_derived_cage(int *needsFree_r);
-DerivedMesh *editmesh_get_derived_cage_and_final(DerivedMesh **final_r, int *cageNeedsFree_r, int *finalNeedsFree_r);
+DerivedMesh *editmesh_get_derived_cage(void);
+DerivedMesh *editmesh_get_derived_cage_and_final(DerivedMesh **final_r);
void weight_to_rgb(float input, float *fr, float *fg, float *fb);
diff --git a/source/blender/blenkernel/BKE_bad_level_calls.h b/source/blender/blenkernel/BKE_bad_level_calls.h
index 91268ffe243..7eeb0c4b1d9 100644
--- a/source/blender/blenkernel/BKE_bad_level_calls.h
+++ b/source/blender/blenkernel/BKE_bad_level_calls.h
@@ -145,11 +145,9 @@ void bglVertex3fv(float *vec);
void bglVertex3f(float x, float y, float z);
void bglEnd(void);
-struct DispListMesh;
struct Object;
/* booleanops.c */
-struct DispListMesh *NewBooleanMeshDLM(struct Object *ob, struct Object *ob_select, int int_op_type);
struct DerivedMesh *NewBooleanDerivedMesh(struct Object *ob,
struct Object *ob_select, int int_op_type);
diff --git a/source/blender/blenkernel/BKE_cdderivedmesh.h b/source/blender/blenkernel/BKE_cdderivedmesh.h
index b8313440551..a570b4fe598 100644
--- a/source/blender/blenkernel/BKE_cdderivedmesh.h
+++ b/source/blender/blenkernel/BKE_cdderivedmesh.h
@@ -40,12 +40,16 @@
struct DerivedMesh;
struct EditMesh;
struct Mesh;
+struct Object;
/* creates a new CDDerivedMesh */
struct DerivedMesh *CDDM_new(int numVerts, int numEdges, int numFaces);
-/* creates a CDDerivedMesh from the given Mesh */
-struct DerivedMesh *CDDM_from_mesh(struct Mesh *mesh);
+/* creates a CDDerivedMesh from the given Mesh, this will reference the
+ original data in Mesh, but it is safe to apply vertex coordinates or
+ calculate normals as those functions will automtically create new
+ data to not overwrite the original */
+struct DerivedMesh *CDDM_from_mesh(struct Mesh *mesh, struct Object *ob);
/* creates a CDDerivedMesh from the given EditMesh */
struct DerivedMesh *CDDM_from_editmesh(struct EditMesh *em, struct Mesh *me);
@@ -62,11 +66,14 @@ struct DerivedMesh *CDDM_copy(struct DerivedMesh *dm);
struct DerivedMesh *CDDM_from_template(struct DerivedMesh *source,
int numVerts, int numEdges, int numFaces);
-/* applies vertex coordinates to a CDDerivedMesh
+/* applies vertex coordinates or normals to a CDDerivedMesh. if the MVert
+ * layer is a referenced layer, it will be duplicate to not overwrite the
+ * original
*/
void CDDM_apply_vert_coords(struct DerivedMesh *cddm, float (*vertCoords)[3]);
+void CDDM_apply_vert_normals(struct DerivedMesh *cddm, short (*vertNormals)[3]);
-/* recalculates normals for a CDDerivedMesh
+/* recalculates vertex and face normals for a CDDerivedMesh
*/
void CDDM_calc_normals(struct DerivedMesh *dm);
@@ -75,12 +82,12 @@ void CDDM_calc_normals(struct DerivedMesh *dm);
*/
void CDDM_calc_edges(struct DerivedMesh *dm);
-/* sets the number of vertices/edges/faces in a CDDerivedMesh
- * if the value given is more than the maximum, the maximum is used
+/* lowers the number of vertices/edges/faces in a CDDerivedMesh
+ * the layer data stays the same size
*/
-void CDDM_set_num_verts(struct DerivedMesh *dm, int numVerts);
-void CDDM_set_num_edges(struct DerivedMesh *dm, int numEdges);
-void CDDM_set_num_faces(struct DerivedMesh *dm, int numFaces);
+void CDDM_lower_num_verts(struct DerivedMesh *dm, int numVerts);
+void CDDM_lower_num_edges(struct DerivedMesh *dm, int numEdges);
+void CDDM_lower_num_faces(struct DerivedMesh *dm, int numFaces);
/* vertex/edge/face access functions
* should always succeed if index is within bounds
diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h
index b36ab67f5e1..ce32f06e320 100644
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@ -33,36 +33,44 @@
#define BKE_CUSTOMDATA_H
struct CustomData;
+struct CustomDataLayer;
+typedef int CustomDataMask;
-#define ORIGINDEX_NONE -1 /* indicates no original index for this element */
+extern CustomDataMask CD_MASK_MESH[];
+extern CustomDataMask CD_MASK_EDITMESH[];
+extern CustomDataMask CD_MASK_DERIVEDMESH[];
-/* layer flags - to be used with CustomData_add_layer */
+/* for ORIGINDEX layer type, indicates no original index for this element */
+#define ORIGINDEX_NONE -1
-/* indicates layer should not be copied by CustomData_from_template or
- * CustomData_copy_data (for temporary utility layers)
- */
-#define LAYERFLAG_NOCOPY 1<<0
+/* initialises a CustomData object with the same layer setup as source and
+ * memory space for totelem elements. mask must be an array of length
+ * CD_NUMTYPES elements, that indicate if a layer can be copied. */
-/* indicates layer should not be freed (for layers backed by external data)
- */
-#define LAYERFLAG_NOFREE 1<<1
+/* copy/merge allocation types */
+#define CD_CALLOC 0 /* allocate blank memory for all layers */
+#define CD_DEFAULT 1 /* allocate layers and set them to their defaults */
+#define CD_DUPLICATE 2 /* do a full copy of all layer */
+#define CD_REFERENCE 3 /* reference original pointers, set layer flag NOFREE */
-/* initialises a CustomData object with space for the given number
- * of data layers and the given number of elements per layer
- */
-void CustomData_init(struct CustomData *data,
- int maxLayers, int maxElems, int subElems);
+/* initialises a CustomData object with the same layer setup as source.
+ * mask must be an array of length CD_NUMTYPES elements, that 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);
-/* initialises a CustomData object with the same layer setup as source
- * and memory space for maxElems elements. flag is added to all layer flags
- */
-void CustomData_from_template(const struct CustomData *source,
- struct CustomData *dest, int flag, int maxElems);
+/* 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);
/* frees data associated with a CustomData object (doesn't free the object
* itself, though)
*/
-void CustomData_free(struct CustomData *data);
+void CustomData_free(struct CustomData *data, int totelem);
+
+/* frees all layers with flag LAYERFLAG_TEMPORARY */
+void CustomData_free_temporary(struct CustomData *data, int totelem);
/* adds a data layer of the given type to the CustomData object, optionally
* backed by an external data array
@@ -70,20 +78,19 @@ void CustomData_free(struct CustomData *data);
* is allocated
* the layer data will be freed by CustomData_free unless
* (flag & LAYERFLAG_NOFREE) is true
- * grows the number of layers in data if data->maxLayers has been reached
- * returns 1 on success, 0 on failure
+ * returns the data of the layer
*
* in editmode, use EM_add_data_layer instead of this function
*/
-int CustomData_add_layer(struct CustomData *data, int type, int flag,
- void *layer);
+void *CustomData_add_layer(struct CustomData *data, int type, int flag,
+ void *layer, int totelem);
/* frees the first data layer with the give type.
* returns 1 on succes, 0 if no layer with the given type is found
*
* in editmode, use EM_free_data_layer instead of this function
*/
-int CustomData_free_layer(struct CustomData *data, int type);
+int CustomData_free_layer(struct CustomData *data, int type, int totelem);
/* returns 1 if the two objects are compatible (same layer types and
* flags in the same order), 0 if not
@@ -94,22 +101,26 @@ int CustomData_compat(const struct CustomData *data1,
/* returns 1 if a layer with the specified type exists */
int CustomData_has_layer(const struct CustomData *data, int type);
+/* duplicate data of a layer with flag NOFREE, and remove that flag.
+ * returns the layer data */
+void *CustomData_duplicate_referenced_layer(struct CustomData *data, int type);
+
/* 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)
* return 1 on success, 0 on failure
*/
-int CustomData_copy_data(const struct CustomData *source,
- struct CustomData *dest, int source_index,
- int dest_index, int count);
-int CustomData_em_copy_data(const struct CustomData *source,
+void CustomData_copy_data(const struct CustomData *source,
+ struct CustomData *dest, int source_index,
+ int dest_index, int count);
+void CustomData_em_copy_data(const struct CustomData *source,
struct CustomData *dest, void *src_block,
void **dest_block);
/* frees data in a CustomData object
* return 1 on success, 0 on failure
*/
-int CustomData_free_elem(struct CustomData *data, int index, int count);
+void CustomData_free_elem(struct CustomData *data, int index, int count);
/* interpolates data from one CustomData object to another
* objects need not be compatible, each source layer is interpolated to the
@@ -125,12 +136,17 @@ int CustomData_free_elem(struct CustomData *data, int index, int count);
*
* returns 1 on success, 0 on failure
*/
-int CustomData_interp(const struct CustomData *source, struct CustomData *dest,
- int *src_indices, float *weights, float *sub_weights,
- int count, int dest_index);
-int CustomData_em_interp(struct CustomData *data, void **src_blocks,
- float *weights, float *sub_weights, int count,
- void *dest_block);
+void CustomData_interp(const struct CustomData *source, struct CustomData *dest,
+ int *src_indices, float *weights, float *sub_weights,
+ int count, int dest_index);
+void CustomData_em_interp(struct CustomData *data, void **src_blocks,
+ float *weights, float *sub_weights, int count,
+ void *dest_block);
+
+/* swaps the data in the element corners, to new corners with indices as
+ specified in corner_indices. for edges this is an array of length 2, for
+ faces an array of length 4 */
+void CustomData_swap(struct CustomData *data, int index, int *corner_indices);
/* gets a pointer to the data element at index from the first layer of type
* returns NULL if there is no layer of type
@@ -143,6 +159,11 @@ void *CustomData_em_get(const struct CustomData *data, void *block, int type);
*/
void *CustomData_get_layer(const struct CustomData *data, int type);
+/* set the pointer of to the first layer of type. the old data is not freed.
+ * returns the value of ptr if the layer is found, NULL otherwise
+ */
+void *CustomData_set_layer(const struct CustomData *data, int type, void *ptr);
+
/* copies the data from source to the data element at index in the first
* layer of type
* no effect if there is no layer of type
@@ -152,10 +173,8 @@ void CustomData_set(const struct CustomData *data, int index, int type,
void CustomData_em_set(struct CustomData *data, void *block, int type,
void *source);
-/* sets the number of elements in a CustomData object
- * if the value given is more than the maximum, the maximum is used
- */
-void CustomData_set_num_elems(struct CustomData *data, int numElems);
+/* set data layers that have a non-zero default value to their defaults */
+void CustomData_set_default(struct CustomData *data, int index, int count);
/* alloc/free a block of custom data attached to one element in editmode */
void CustomData_em_set_default(struct CustomData *data, void **block);
@@ -168,4 +187,8 @@ void CustomData_to_em_block(const struct CustomData *source,
void CustomData_from_em_block(const struct CustomData *source,
struct CustomData *dest, void *block, int index);
+/* query info over types */
+void CustomData_file_write_info(int type, char **structname, int *structnum);
+int CustomData_sizeof(int type);
+
#endif
diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h
index 0bb74ca94b5..4bcd5d8955c 100644
--- a/source/blender/blenkernel/BKE_displist.h
+++ b/source/blender/blenkernel/BKE_displist.h
@@ -35,6 +35,8 @@
#ifndef BKE_DISPLIST_H
#define BKE_DISPLIST_H
+#include "DNA_customdata_types.h"
+
/* dl->type */
#define DL_POLY 0
#define DL_SEGM 1
@@ -82,30 +84,6 @@ struct ListBase;
struct Material;
struct Bone;
struct Mesh;
-struct TFace;
-struct EditMesh;
-struct EditEdge;
-struct EditFace;
-
-typedef struct DispListMesh DispListMesh;
-struct DispListMesh {
- int totvert, totedge, totface;
- struct MVert *mvert;
- struct MEdge *medge;
- struct MCol *mcol;
- struct MFace *mface;
- struct TFace *tface;
- float *nors; // facenormals
-
- int dontFreeVerts, dontFreeNors, dontFreeOther;
-};
-
-void displistmesh_free(DispListMesh *dlm);
-
-void displistmesh_to_mesh(DispListMesh *dlm, struct Mesh *me);
-
-DispListMesh *displistmesh_copy(DispListMesh *odlm);
-DispListMesh *displistmesh_copyShared(DispListMesh *odlm);
/*
* All the different DispList.type's use the
@@ -141,7 +119,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 makeDispListMesh(struct Object *ob);
+extern void makeDerivedMesh(struct Object *ob);
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);
@@ -154,8 +132,5 @@ void filldisplist(struct ListBase *dispbase, struct ListBase *to);
void fastshade_free_render(void);
-
-void displistmesh_add_edges(DispListMesh *dlm);
-
#endif
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index e8d9dbe0681..f7cbe5810f6 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -45,8 +45,9 @@ struct MFace;
struct MVert;
struct MCol;
struct Object;
-struct TFace;
+struct MTFace;
struct VecNor;
+struct CustomData;
#ifdef __cplusplus
extern "C" {
@@ -56,23 +57,21 @@ void unlink_mesh(struct Mesh *me);
void free_mesh(struct Mesh *me);
struct Mesh *add_mesh(void);
struct Mesh *copy_mesh(struct Mesh *me);
+void mesh_update_customdata_pointers(struct Mesh *me);
void make_local_tface(struct Mesh *me);
void make_local_mesh(struct Mesh *me);
void boundbox_mesh(struct Mesh *me, float *loc, float *size);
void tex_space_mesh(struct Mesh *me);
float *mesh_create_orco_render(struct Object *ob);
float *mesh_create_orco(struct Object *ob);
-void test_index_face(struct MFace *mface, struct MCol *mc, struct TFace *tface, int nr);
+void test_index_face(struct MFace *mface, struct CustomData *mfdata, int mfindex, int nr);
struct Mesh *get_mesh(struct Object *ob);
void set_mesh(struct Object *ob, struct Mesh *me);
void mball_to_mesh(struct ListBase *lb, struct Mesh *me);
void nurbs_to_mesh(struct Object *ob);
-void mcol_to_tface(struct Mesh *me, int freedata);
-struct MCol *tface_to_mcol_p(struct TFace *tface, int totface);
-void tface_to_mcol(struct Mesh *me);
void free_dverts(struct MDeformVert *dvert, int totvert);
void copy_dverts(struct MDeformVert *dst, struct MDeformVert *src, int totvert); /* __NLA */
-int update_realtime_texture(struct TFace *tface, double time);
+int update_realtime_texture(struct MTFace *tface, double time);
void mesh_delete_material_index(struct Mesh *me, int index);
void mesh_set_smooth_flag(struct Object *meshOb, int enableSmooth);
@@ -103,7 +102,7 @@ typedef struct UvMapVert {
unsigned char tfindex, separate;
} UvMapVert;
-UvVertMap *make_uv_vert_map(struct MFace *mface, struct TFace *tface, unsigned int totface, unsigned int totvert, int selected, float *limit);
+UvVertMap *make_uv_vert_map(struct MFace *mface, struct MTFace *tface, unsigned int totface, unsigned int totvert, int selected, float *limit);
UvMapVert *get_uv_map_vert(UvVertMap *vmap, unsigned int v);
void free_uv_vert_map(UvVertMap *vmap);
diff --git a/source/blender/blenkernel/BKE_subsurf.h b/source/blender/blenkernel/BKE_subsurf.h
index 3d1ffd3e52f..459519913c5 100644
--- a/source/blender/blenkernel/BKE_subsurf.h
+++ b/source/blender/blenkernel/BKE_subsurf.h
@@ -37,9 +37,6 @@ struct DerivedMesh;
struct EditMesh;
struct SubsurfModifierData;
-struct DerivedMesh *subsurf_make_derived_from_editmesh(struct EditMesh *em, struct SubsurfModifierData *smd, float (*vertexCos)[3]);
-struct DerivedMesh *subsurf_make_derived_from_dlm_em(struct DispListMesh *dlm, struct SubsurfModifierData *smd, float (*vertCos)[3]);
-struct DerivedMesh *subsurf_make_derived_from_mesh(struct Mesh *me, struct DispListMesh *dlm, struct SubsurfModifierData *smd, int useRenderParams, float (*vertCos)[3], int isFinalCalc);
struct DerivedMesh *subsurf_make_derived_from_derived(
struct DerivedMesh *dm,
struct SubsurfModifierData *smd,
diff --git a/source/blender/blenkernel/bad_level_call_stubs/stubs.c b/source/blender/blenkernel/bad_level_call_stubs/stubs.c
index 824c1566100..61e38521cf5 100644
--- a/source/blender/blenkernel/bad_level_call_stubs/stubs.c
+++ b/source/blender/blenkernel/bad_level_call_stubs/stubs.c
@@ -220,7 +220,6 @@ void bglVertex3f(float x, float y, float z) {}
void bglEnd(void) {}
/* booleanops.c */
-struct DispListMesh *NewBooleanMeshDLM(struct Object *ob, struct Object *ob_select, int int_op_type) { return 0; }
struct DerivedMesh *NewBooleanDerivedMesh(struct Object *ob, struct Object *ob_select, int int_op_type) { return 0; }
// bobj read/write debug messages
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index f1285032802..dcf19128e5b 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -88,14 +88,52 @@
///////////////////////////////////
///////////////////////////////////
-#define DERIVEDMESH_INITIAL_LAYERS 5
+
+MVert *dm_getVertArray(DerivedMesh *dm)
+{
+ MVert *mvert = CustomData_get_layer(&dm->vertData, CD_MVERT);
+
+ if (!mvert) {
+ mvert = CustomData_add_layer(&dm->vertData, CD_MVERT,
+ CD_FLAG_TEMPORARY, NULL, dm->getNumVerts(dm));
+ dm->copyVertArray(dm, mvert);
+ }
+
+ return mvert;
+}
+
+MEdge *dm_getEdgeArray(DerivedMesh *dm)
+{
+ MEdge *medge = CustomData_get_layer(&dm->edgeData, CD_MEDGE);
+
+ if (!medge) {
+ medge = CustomData_add_layer(&dm->edgeData, CD_MEDGE,
+ CD_FLAG_TEMPORARY, NULL, dm->getNumEdges(dm));
+ dm->copyEdgeArray(dm, medge);
+ }
+
+ return medge;
+}
+
+MFace *dm_getFaceArray(DerivedMesh *dm)
+{
+ MFace *mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
+
+ if (!mface) {
+ mface = CustomData_add_layer(&dm->faceData, CD_MFACE,
+ CD_FLAG_TEMPORARY, NULL, dm->getNumFaces(dm));
+ dm->copyFaceArray(dm, mface);
+ }
+
+ return mface;
+}
MVert *dm_dupVertArray(DerivedMesh *dm)
{
MVert *tmp = MEM_callocN(sizeof(*tmp) * dm->getNumVerts(dm),
"dm_dupVertArray tmp");
- if(tmp) dm->getVertArray(dm, tmp);
+ if(tmp) dm->copyVertArray(dm, tmp);
return tmp;
}
@@ -105,7 +143,7 @@ MEdge *dm_dupEdgeArray(DerivedMesh *dm)
MEdge *tmp = MEM_callocN(sizeof(*tmp) * dm->getNumEdges(dm),
"dm_dupEdgeArray tmp");
- if(tmp) dm->getEdgeArray(dm, tmp);
+ if(tmp) dm->copyEdgeArray(dm, tmp);
return tmp;
}
@@ -115,7 +153,7 @@ MFace *dm_dupFaceArray(DerivedMesh *dm)
MFace *tmp = MEM_callocN(sizeof(*tmp) * dm->getNumFaces(dm),
"dm_dupFaceArray tmp");
- if(tmp) dm->getFaceArray(dm, tmp);
+ if(tmp) dm->copyFaceArray(dm, tmp);
return tmp;
}
@@ -123,6 +161,9 @@ MFace *dm_dupFaceArray(DerivedMesh *dm)
void DM_init_funcs(DerivedMesh *dm)
{
/* default function implementations */
+ dm->getVertArray = dm_getVertArray;
+ dm->getEdgeArray = dm_getEdgeArray;
+ dm->getFaceArray = dm_getFaceArray;
dm->dupVertArray = dm_dupVertArray;
dm->dupEdgeArray = dm_dupEdgeArray;
dm->dupFaceArray = dm_dupFaceArray;
@@ -138,104 +179,111 @@ void DM_init_funcs(DerivedMesh *dm)
void DM_init(DerivedMesh *dm,
int numVerts, int numEdges, int numFaces)
{
- CustomData_init(&dm->vertData, DERIVEDMESH_INITIAL_LAYERS, numVerts,
- SUB_ELEMS_VERT);
- CustomData_init(&dm->edgeData, DERIVEDMESH_INITIAL_LAYERS, numEdges,
- SUB_ELEMS_EDGE);
- CustomData_init(&dm->faceData, DERIVEDMESH_INITIAL_LAYERS, numFaces,
- SUB_ELEMS_FACE);
+ CustomData_add_layer(&dm->vertData, CD_ORIGINDEX, 0, NULL, numVerts);
+ CustomData_add_layer(&dm->edgeData, CD_ORIGINDEX, 0, NULL, numEdges);
+ CustomData_add_layer(&dm->faceData, CD_ORIGINDEX, 0, NULL, numFaces);
- CustomData_add_layer(&dm->vertData, LAYERTYPE_ORIGINDEX, 0, NULL);
- CustomData_add_layer(&dm->edgeData, LAYERTYPE_ORIGINDEX, 0, NULL);
- CustomData_add_layer(&dm->faceData, LAYERTYPE_ORIGINDEX, 0, NULL);
+ dm->numVertData = numVerts;
+ dm->numEdgeData = numEdges;
+ dm->numFaceData = numFaces;
DM_init_funcs(dm);
+
+ dm->needsFree = 1;
}
void DM_from_template(DerivedMesh *dm, DerivedMesh *source,
int numVerts, int numEdges, int numFaces)
{
- CustomData_from_template(&source->vertData, &dm->vertData, 0, numVerts);
- CustomData_from_template(&source->edgeData, &dm->edgeData, 0, numEdges);
- CustomData_from_template(&source->faceData, &dm->faceData, 0, numFaces);
+ CustomData_copy(&source->vertData, &dm->vertData, CD_MASK_DERIVEDMESH,
+ CD_CALLOC, numVerts);
+ CustomData_copy(&source->edgeData, &dm->edgeData, CD_MASK_DERIVEDMESH,
+ CD_CALLOC, numEdges);
+ CustomData_copy(&source->faceData, &dm->faceData, CD_MASK_DERIVEDMESH,
+ CD_CALLOC, numFaces);
+
+ dm->numVertData = numVerts;
+ dm->numEdgeData = numEdges;
+ dm->numFaceData = numFaces;
DM_init_funcs(dm);
+
+ dm->needsFree = 1;
}
-void DM_release(DerivedMesh *dm)
+int DM_release(DerivedMesh *dm)
{
- CustomData_free(&dm->vertData);
- CustomData_free(&dm->edgeData);
- CustomData_free(&dm->faceData);
+ if (dm->needsFree) {
+ CustomData_free(&dm->vertData, dm->numVertData);
+ CustomData_free(&dm->edgeData, dm->numEdgeData);
+ CustomData_free(&dm->faceData, dm->numFaceData);
+
+ return 1;
+ }
+ else {
+ CustomData_free_temporary(&dm->vertData, dm->numVertData);
+ CustomData_free_temporary(&dm->edgeData, dm->numEdgeData);
+ CustomData_free_temporary(&dm->faceData, dm->numFaceData);
+
+ return 0;
+ }
}
void DM_to_mesh(DerivedMesh *dm, Mesh *me)
{
/* dm might depend on me, so we need to do everything with a local copy */
- Mesh tmp_me = *me;
- int numVerts = dm->getNumVerts(dm);
-
- tmp_me.dvert = NULL;
- tmp_me.tface = NULL;
- tmp_me.mcol = NULL;
-
- tmp_me.totvert = numVerts;
- tmp_me.totedge = dm->getNumEdges(dm);
- tmp_me.totface = dm->getNumFaces(dm);
-
- tmp_me.mvert = dm->dupVertArray(dm);
- tmp_me.medge = dm->dupEdgeArray(dm);
- tmp_me.mface = dm->dupFaceArray(dm);
-
- if(dm->getFaceDataArray(dm, LAYERTYPE_TFACE))
- tmp_me.tface = MEM_dupallocN(dm->getFaceDataArray(dm,
- LAYERTYPE_TFACE));
- if(dm->getFaceDataArray(dm, LAYERTYPE_MCOL))
- tmp_me.mcol = MEM_dupallocN(dm->getFaceDataArray(dm,
- LAYERTYPE_MCOL));
- if(dm->getVertDataArray(dm, LAYERTYPE_MDEFORMVERT)) {
- int i;
- MDeformVert *dv;
+ Mesh tmp = *me;
+ int totvert, totedge, totface;
- tmp_me.dvert = MEM_dupallocN(
- dm->getVertDataArray(dm, LAYERTYPE_MDEFORMVERT));
+ memset(&tmp.vdata, 0, sizeof(tmp.vdata));
+ memset(&tmp.edata, 0, sizeof(tmp.edata));
+ memset(&tmp.fdata, 0, sizeof(tmp.fdata));
- for(i = 0, dv = tmp_me.dvert; i < numVerts; ++i, ++dv)
- dv->dw = MEM_dupallocN(dv->dw);
- }
+ totvert = tmp.totvert = dm->getNumVerts(dm);
+ totedge = tmp.totedge = dm->getNumEdges(dm);
+ totface = tmp.totface = dm->getNumFaces(dm);
- if(me->mvert) MEM_freeN(me->mvert);
- if(me->dvert) free_dverts(me->dvert, me->totvert);
- if(me->mface) MEM_freeN(me->mface);
- if(me->tface) MEM_freeN(me->tface);
- if(me->mcol) MEM_freeN(me->mcol);
- if(me->medge) MEM_freeN(me->medge);
+ CustomData_copy(&dm->vertData, &tmp.vdata, CD_MASK_MESH, CD_DUPLICATE, totvert);
+ CustomData_copy(&dm->edgeData, &tmp.edata, CD_MASK_MESH, CD_DUPLICATE, totedge);
+ CustomData_copy(&dm->faceData, &tmp.fdata, CD_MASK_MESH, CD_DUPLICATE, totface);
- /* if the number of verts has changed, remove invalid data */
- if(numVerts != me->totvert) {
- if(me->msticky) MEM_freeN(me->msticky);
- me->msticky = NULL;
+ /* not all DerivedMeshes store their verts/edges/faces in CustomData, so
+ we set them here in case they are missing */
+ if(!CustomData_has_layer(&tmp.vdata, CD_MVERT))
+ CustomData_add_layer(&tmp.vdata, CD_MVERT, 0, dm->dupVertArray(dm), totvert);
+ if(!CustomData_has_layer(&tmp.edata, CD_MEDGE))
+ CustomData_add_layer(&tmp.edata, CD_MEDGE, 0, dm->dupEdgeArray(dm), totedge);
+ if(!CustomData_has_layer(&tmp.fdata, CD_MFACE))
+ CustomData_add_layer(&tmp.fdata, CD_MFACE, 0, dm->dupFaceArray(dm), totface);
+
+ mesh_update_customdata_pointers(&tmp);
+ CustomData_free(&me->vdata, me->totvert);
+ CustomData_free(&me->edata, me->totedge);
+ CustomData_free(&me->fdata, me->totface);
+
+ /* if the number of verts has changed, remove invalid data */
+ if(tmp.totvert != me->totvert) {
if(me->key) me->key->id.us--;
me->key = NULL;
}
- *me = tmp_me;
+ *me = tmp;
}
void DM_add_vert_layer(DerivedMesh *dm, int type, int flag, void *layer)
{
- CustomData_add_layer(&dm->vertData, type, flag, layer);
+ CustomData_add_layer(&dm->vertData, type, flag, layer, dm->numVertData);
}
void DM_add_edge_layer(DerivedMesh *dm, int type, int flag, void *layer)
{
- CustomData_add_layer(&dm->edgeData, type, flag, layer);
+ CustomData_add_layer(&dm->edgeData, type, flag, layer, dm->numEdgeData);
}
void DM_add_face_layer(DerivedMesh *dm, int type, int flag, void *layer)
{
- CustomData_add_layer(&dm->faceData, type, flag, layer);
+ CustomData_add_layer(&dm->faceData, type, flag, layer, dm->numFaceData);
}
void *DM_get_vert_data(DerivedMesh *dm, int index, int type)
@@ -287,24 +335,21 @@ void DM_copy_vert_data(DerivedMesh *source, DerivedMesh *dest,
int source_index, int dest_index, int count)
{
CustomData_copy_data(&source->vertData, &dest->vertData,
- source_index, dest_index,
- count);
+ source_index, dest_index, count);
}
void DM_copy_edge_data(DerivedMesh *source, DerivedMesh *dest,
int source_index, int dest_index, int count)
{
CustomData_copy_data(&source->edgeData, &dest->edgeData,
- source_index, dest_index,
- count);
+ source_index, dest_index, count);
}
void DM_copy_face_data(DerivedMesh *source, DerivedMesh *dest,
int source_index, int dest_index, int count)
{
CustomData_copy_data(&source->faceData, &dest->faceData,
- source_index, dest_index,
- count);
+ source_index, dest_index, count);
}
void DM_free_vert_data(struct DerivedMesh *dm, int index, int count)
@@ -348,618 +393,45 @@ void DM_interp_face_data(DerivedMesh *source, DerivedMesh *dest,
weights, (float*)vert_weights, count, dest_index);
}
-typedef struct {
- DerivedMesh dm;
-
- Object *ob;
- Mesh *me;
- MVert *verts;
- float *nors;
- MCol *wpaintMCol;
-
- int freeNors, freeVerts;
-} MeshDerivedMesh;
-
-static DispListMesh *meshDM_convertToDispListMesh(DerivedMesh *dm, int allowShared)
-{
- MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
- Mesh *me = mdm->me;
- DispListMesh *dlm = MEM_callocN(sizeof(*dlm), "dlm");
-
- dlm->totvert = me->totvert;
- dlm->totedge = me->totedge;
- dlm->totface = me->totface;
- dlm->mvert = mdm->verts;
- dlm->medge = me->medge;
- dlm->mface = me->mface;
- dlm->tface = me->tface;
- dlm->mcol = me->mcol;
- dlm->nors = mdm->nors;
- dlm->dontFreeVerts = dlm->dontFreeOther = dlm->dontFreeNors = 1;
-
- if (!allowShared) {
- dlm->mvert = MEM_dupallocN(dlm->mvert);
- if (dlm->nors) dlm->nors = MEM_dupallocN(dlm->nors);
-
- dlm->dontFreeVerts = dlm->dontFreeNors = 0;
- }
-
- return dlm;
-}
-
-static void meshDM_getMinMax(DerivedMesh *dm, float min_r[3], float max_r[3])
-{
- MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
- Mesh *me = mdm->me;
- int i;
-
- if (me->totvert) {
- for (i=0; i<me->totvert; i++) {
- DO_MINMAX(mdm->verts[i].co, min_r, max_r);
- }
- } else {
- min_r[0] = min_r[1] = min_r[2] = max_r[0] = max_r[1] = max_r[2] = 0.0;
- }
-}
-
-static void meshDM_getVertCos(DerivedMesh *dm, float (*cos_r)[3])
-{
- MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
- Mesh *me = mdm->me;
- int i;
-
- for (i=0; i<me->totvert; i++) {
- cos_r[i][0] = mdm->verts[i].co[0];
- cos_r[i][1] = mdm->verts[i].co[1];
- cos_r[i][2] = mdm->verts[i].co[2];
- }
-}
-
-static void meshDM_getVertCo(DerivedMesh *dm, int index, float co_r[3])
-{
- MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
-
- VECCOPY(co_r, mdm->verts[index].co);
-}
-
-static void meshDM_getVertNo(DerivedMesh *dm, int index, float no_r[3])
-{
- MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
- short *no = mdm->verts[index].no;
-
- no_r[0] = no[0]/32767.f;
- no_r[1] = no[1]/32767.f;
- no_r[2] = no[2]/32767.f;
-}
-
-static void meshDM_drawVerts(DerivedMesh *dm)
-{
- MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
- Mesh *me = mdm->me;
- int i;
-
- glBegin(GL_POINTS);
- for(i=0; i<me->totvert; i++) {
- glVertex3fv(mdm->verts[i].co);
- }
- glEnd();
-}
-static void meshDM_drawUVEdges(DerivedMesh *dm)
-{
- MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
- Mesh *me = mdm->me;
- int i;
-
- if (me->tface) {
- glBegin(GL_LINES);
- for (i=0; i<me->totface; i++) {
- TFace *tf = &me->tface[i];
-
- if (!(tf->flag&TF_HIDE)) {
- glVertex2fv(tf->uv[0]);
- glVertex2fv(tf->uv[1]);
-
- glVertex2fv(tf->uv[1]);
- glVertex2fv(tf->uv[2]);
-
- if (!me->mface[i].v4) {
- glVertex2fv(tf->uv[2]);
- glVertex2fv(tf->uv[0]);
- } else {
- glVertex2fv(tf->uv[2]);
- glVertex2fv(tf->uv[3]);
-
- glVertex2fv(tf->uv[3]);
- glVertex2fv(tf->uv[0]);
- }
- }
- }
- glEnd();
- }
-}
-static void meshDM_drawEdges(DerivedMesh *dm, int drawLooseEdges)
-{
- MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
- Mesh *me= mdm->me;
- MEdge *medge= me->medge;
- int i;
-
- glBegin(GL_LINES);
- for(i=0; i<me->totedge; i++, medge++) {
- if ((medge->flag&ME_EDGEDRAW) && (drawLooseEdges || !(medge->flag&ME_LOOSEEDGE))) {
- glVertex3fv(mdm->verts[medge->v1].co);
- glVertex3fv(mdm->verts[medge->v2].co);
- }
- }
- glEnd();
-}
-static void meshDM_drawMappedEdges(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index), void *userData)
-{
- MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
- Mesh *me= mdm->me;
- int i;
-
- glBegin(GL_LINES);
- for (i=0; i<me->totedge; i++) {
- if (!setDrawOptions || setDrawOptions(userData, i)) {
- glVertex3fv(mdm->verts[me->medge[i].v1].co);
- glVertex3fv(mdm->verts[me->medge[i].v2].co);
- }
- }
- glEnd();
-}
-static void meshDM_drawLooseEdges(DerivedMesh *dm)
-{
- MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
- Mesh *me= mdm->me;
- MEdge *medge= me->medge;
- int i;
-
- glBegin(GL_LINES);
- for (i=0; i<me->totedge; i++, medge++) {
- if (medge->flag&ME_LOOSEEDGE) {
- glVertex3fv(mdm->verts[medge->v1].co);
- glVertex3fv(mdm->verts[medge->v2].co);
- }
- }
- glEnd();
-}
-static void meshDM_drawFacesSolid(DerivedMesh *dm, int (*setMaterial)(int))
-{
- MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
- Mesh *me = mdm->me;
- MVert *mvert= mdm->verts;
- MFace *mface= me->mface;
- float *nors = mdm->nors;
- int a;
- int glmode=-1, shademodel=-1, matnr=-1, drawCurrentMat=1;
-
-#define PASSVERT(index) { \
- if (shademodel==GL_SMOOTH) { \
- short *no = mvert[index].no; \
- glNormal3sv(no); \
- } \
- glVertex3fv(mvert[index].co); \
-}
-
- glBegin(glmode=GL_QUADS);
- for(a=0; a<me->totface; a++, mface++, nors+=3) {
- int new_glmode, new_matnr, new_shademodel;
-
- new_glmode = mface->v4?GL_QUADS:GL_TRIANGLES;
- new_matnr = mface->mat_nr+1;
- new_shademodel = (mface->flag & ME_SMOOTH)?GL_SMOOTH:GL_FLAT;
-
- if (new_glmode!=glmode || new_matnr!=matnr || new_shademodel!=shademodel) {
- glEnd();
-
- drawCurrentMat = setMaterial(matnr=new_matnr);
-
- glShadeModel(shademodel=new_shademodel);
- glBegin(glmode=new_glmode);
- }
-
- if (drawCurrentMat) {
- if(shademodel==GL_FLAT)
- glNormal3fv(nors);
-
- PASSVERT(mface->v1);
- PASSVERT(mface->v2);
- PASSVERT(mface->v3);
- if (mface->v4) {
- PASSVERT(mface->v4);
- }
- }
- }
- glEnd();
-
- glShadeModel(GL_FLAT);
-#undef PASSVERT
-}
-
-static void meshDM_drawFacesColored(DerivedMesh *dm, int useTwoSide, unsigned char *col1, unsigned char *col2)
-{
- MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
- Mesh *me= mdm->me;
- MFace *mface= me->mface;
- int a, glmode;
- unsigned char *cp1, *cp2;
-
- cp1= col1;
- if(col2) {
- cp2= col2;
- } else {
- cp2= NULL;
- useTwoSide= 0;
- }
-
- /* there's a conflict here... twosided colors versus culling...? */
- /* defined by history, only texture faces have culling option */
- /* we need that as mesh option builtin, next to double sided lighting */
- if(col1 && col2)
- glEnable(GL_CULL_FACE);
-
- glShadeModel(GL_SMOOTH);
- glBegin(glmode=GL_QUADS);
- for(a=0; a<me->totface; a++, mface++, cp1+= 16) {
- int new_glmode= mface->v4?GL_QUADS:GL_TRIANGLES;
-
- if (new_glmode!=glmode) {
- glEnd();
- glBegin(glmode= new_glmode);
- }
-
- glColor3ub(cp1[3], cp1[2], cp1[1]);
- glVertex3fv( mdm->verts[mface->v1].co );
- glColor3ub(cp1[7], cp1[6], cp1[5]);
- glVertex3fv( mdm->verts[mface->v2].co );
- glColor3ub(cp1[11], cp1[10], cp1[9]);
- glVertex3fv( mdm->verts[mface->v3].co );
- if(mface->v4) {
- glColor3ub(cp1[15], cp1[14], cp1[13]);
- glVertex3fv( mdm->verts[mface->v4].co );
- }
-
- if(useTwoSide) {
- glColor3ub(cp2[11], cp2[10], cp2[9]);
- glVertex3fv( mdm->verts[mface->v3].co );
- glColor3ub(cp2[7], cp2[6], cp2[5]);
- glVertex3fv( mdm->verts[mface->v2].co );
- glColor3ub(cp2[3], cp2[2], cp2[1]);
- glVertex3fv( mdm->verts[mface->v1].co );
- if(mface->v4) {
- glColor3ub(cp2[15], cp2[14], cp2[13]);
- glVertex3fv( mdm->verts[mface->v4].co );
- }
- }
- if(col2) cp2+= 16;
- }
- glEnd();
-
- glShadeModel(GL_FLAT);
- glDisable(GL_CULL_FACE);
-}
-
-static void meshDM_drawFacesTex_common(DerivedMesh *dm, int (*drawParams)(TFace *tface, int matnr), int (*drawParamsMapped)(void *userData, int index), void *userData)
-{
- MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
- Mesh *me = mdm->me;
- MVert *mvert= mdm->verts;
- MFace *mface= me->mface;
- TFace *tface = me->tface;
- float *nors = mdm->nors;
- int i;
-
- for (i=0; i<me->totface; i++) {
- MFace *mf= &mface[i];
- TFace *tf = tface?&tface[i]:NULL;
- int flag;
- unsigned char *cp= NULL;
-
- if (drawParams)
- flag = drawParams(tf, mf->mat_nr);
- else
- flag = drawParamsMapped(userData, i);
-
- if (flag==0) {
- continue;
- } else if (flag==1) {
- if (mdm->wpaintMCol) {
- cp= (unsigned char*) &mdm->wpaintMCol[i*4];
- } else if (tf) {
- cp= (unsigned char*) tf->col;
- } else if (me->mcol) {
- cp= (unsigned char*) &me->mcol[i*4];
- }
- }
-
- if (!(mf->flag&ME_SMOOTH)) {
- glNormal3fv(&nors[i*3]);
- }
-
- glBegin(mf->v4?GL_QUADS:GL_TRIANGLES);
- if (tf) glTexCoord2fv(tf->uv[0]);
- if (cp) glColor3ub(cp[3], cp[2], cp[1]);
- if (mf->flag&ME_SMOOTH) glNormal3sv(mvert[mf->v1].no);
- glVertex3fv(mvert[mf->v1].co);
-
- if (tf) glTexCoord2fv(tf->uv[1]);
- if (cp) glColor3ub(cp[7], cp[6], cp[5]);
- if (mf->flag&ME_SMOOTH) glNormal3sv(mvert[mf->v2].no);
- glVertex3fv(mvert[mf->v2].co);
-
- if (tf) glTexCoord2fv(tf->uv[2]);
- if (cp) glColor3ub(cp[11], cp[10], cp[9]);
- if (mf->flag&ME_SMOOTH) glNormal3sv(mvert[mf->v3].no);
- glVertex3fv(mvert[mf->v3].co);
-
- if(mf->v4) {
- if (tf) glTexCoord2fv(tf->uv[3]);
- if (cp) glColor3ub(cp[15], cp[14], cp[13]);
- if (mf->flag&ME_SMOOTH) glNormal3sv(mvert[mf->v4].no);
- glVertex3fv(mvert[mf->v4].co);
- }
- glEnd();
- }
-}
-static void meshDM_drawFacesTex(DerivedMesh *dm, int (*setDrawParams)(TFace *tface, int matnr))
-{
- meshDM_drawFacesTex_common(dm, setDrawParams, NULL, NULL);
-}
-static void meshDM_drawMappedFacesTex(DerivedMesh *dm, int (*setDrawParams)(void *userData, int index), void *userData)
-{
- meshDM_drawFacesTex_common(dm, NULL, setDrawParams, userData);
-}
-
-static void meshDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int useColors)
-{
- MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
- Mesh *me = mdm->me;
- MVert *mvert= mdm->verts;
- MFace *mface= me->mface;
- float *nors= mdm->nors;
- int i;
-
- for (i=0; i<me->totface; i++) {
- MFace *mf= &mface[i];
- int drawSmooth = (mf->flag & ME_SMOOTH);
-
- if (!setDrawOptions || setDrawOptions(userData, i, &drawSmooth)) {
- unsigned char *cp = NULL;
-
- if (useColors) {
- if (mdm->wpaintMCol) {
- cp= (unsigned char*) &mdm->wpaintMCol[i*4];
- } else if (me->tface) {
- cp= (unsigned char*) me->tface[i].col;
- } else if (me->mcol) {
- cp= (unsigned char*) &me->mcol[i*4];
- }
- }
-
- glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
- glBegin(mf->v4?GL_QUADS:GL_TRIANGLES);
-
- if (!drawSmooth) {
- glNormal3fv(&nors[i*3]);
-
- if (cp) glColor3ub(cp[3], cp[2], cp[1]);
- glVertex3fv(mvert[mf->v1].co);
- if (cp) glColor3ub(cp[7], cp[6], cp[5]);
- glVertex3fv(mvert[mf->v2].co);
- if (cp) glColor3ub(cp[11], cp[10], cp[9]);
- glVertex3fv(mvert[mf->v3].co);
- if(mf->v4) {
- if (cp) glColor3ub(cp[15], cp[14], cp[13]);
- glVertex3fv(mvert[mf->v4].co);
- }
- } else {
- if (cp) glColor3ub(cp[3], cp[2], cp[1]);
- glNormal3sv(mvert[mf->v1].no);
- glVertex3fv(mvert[mf->v1].co);
- if (cp) glColor3ub(cp[7], cp[6], cp[5]);
- glNormal3sv(mvert[mf->v2].no);
- glVertex3fv(mvert[mf->v2].co);
- if (cp) glColor3ub(cp[11], cp[10], cp[9]);
- glNormal3sv(mvert[mf->v3].no);
- glVertex3fv(mvert[mf->v3].co);
- if(mf->v4) {
- if (cp) glColor3ub(cp[15], cp[14], cp[13]);
- glNormal3sv(mvert[mf->v4].no);
- glVertex3fv(mvert[mf->v4].co);
- }
- }
-
- glEnd();
- }
- }
-}
-static int meshDM_getNumVerts(DerivedMesh *dm)
-{
- MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
- Mesh *me = mdm->me;
-
- return me->totvert;
-}
-
-static int meshDM_getNumEdges(DerivedMesh *dm)
-{
- MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
- Mesh *me = mdm->me;
-
- return me->totedge;
-}
-
-static int meshDM_getNumFaces(DerivedMesh *dm)
+void DM_swap_face_data(DerivedMesh *dm, int index, int *corner_indices)
{
- MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
- Mesh *me = mdm->me;
-
- return me->totface;
-}
-
-void meshDM_getVert(DerivedMesh *dm, int index, MVert *vert_r)
-{
- MVert *verts = ((MeshDerivedMesh *)dm)->verts;
-
- *vert_r = verts[index];
-}
-
-void meshDM_getEdge(DerivedMesh *dm, int index, MEdge *edge_r)
-{
- Mesh *me = ((MeshDerivedMesh *)dm)->me;
-
- *edge_r = me->medge[index];
-}
-
-void meshDM_getFace(DerivedMesh *dm, int index, MFace *face_r)
-{
- Mesh *me = ((MeshDerivedMesh *)dm)->me;
-
- *face_r = me->mface[index];
-}
-
-void meshDM_getVertArray(DerivedMesh *dm, MVert *vert_r)
-{
- MeshDerivedMesh *mdm = (MeshDerivedMesh *)dm;
- memcpy(vert_r, mdm->verts, sizeof(*vert_r) * mdm->me->totvert);
-}
-
-void meshDM_getEdgeArray(DerivedMesh *dm, MEdge *edge_r)
-{
- MeshDerivedMesh *mdm = (MeshDerivedMesh *)dm;
- memcpy(edge_r, mdm->me->medge, sizeof(*edge_r) * mdm->me->totedge);
-}
-
-void meshDM_getFaceArray(DerivedMesh *dm, MFace *face_r)
-{
- MeshDerivedMesh *mdm = (MeshDerivedMesh *)dm;
- memcpy(face_r, mdm->me->mface, sizeof(*face_r) * mdm->me->totface);
-}
-
-static void meshDM_release(DerivedMesh *dm)
-{
- MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
-
- DM_release(dm);
-
- if (mdm->wpaintMCol) MEM_freeN(mdm->wpaintMCol);
- if (mdm->freeNors) MEM_freeN(mdm->nors);
- if (mdm->freeVerts) MEM_freeN(mdm->verts);
- MEM_freeN(mdm);
+ CustomData_swap(&dm->faceData, index, corner_indices);
}
static DerivedMesh *getMeshDerivedMesh(Mesh *me, Object *ob, float (*vertCos)[3])
{
- MeshDerivedMesh *mdm = MEM_callocN(sizeof(*mdm), "mdm");
-
- DM_init(&mdm->dm, me->totvert, me->totedge, me->totface);
-
- mdm->dm.getMinMax = meshDM_getMinMax;
-
- mdm->dm.convertToDispListMesh = meshDM_convertToDispListMesh;
- mdm->dm.getNumVerts = meshDM_getNumVerts;
- mdm->dm.getNumEdges = meshDM_getNumEdges;
- mdm->dm.getNumFaces = meshDM_getNumFaces;
+ DerivedMesh *dm = CDDM_from_mesh(me, ob);
+ int i, dofluidsim;
- mdm->dm.getVert = meshDM_getVert;
- mdm->dm.getEdge = meshDM_getEdge;
- mdm->dm.getFace = meshDM_getFace;
- mdm->dm.getVertArray = meshDM_getVertArray;
- mdm->dm.getEdgeArray = meshDM_getEdgeArray;
- mdm->dm.getFaceArray = meshDM_getFaceArray;
+ dofluidsim = ((ob->fluidsimFlag & OB_FLUIDSIM_ENABLE) &&
+ (ob->fluidsimSettings->type & OB_FLUIDSIM_DOMAIN)&&
+ (ob->fluidsimSettings->meshSurface) &&
+ (1) && (!give_parteff(ob)) && // doesnt work together with particle systems!
+ (me->totvert == ((Mesh *)(ob->fluidsimSettings->meshSurface))->totvert));
- mdm->dm.getVertCos = meshDM_getVertCos;
- mdm->dm.getVertCo = meshDM_getVertCo;
- mdm->dm.getVertNo = meshDM_getVertNo;
+ if (vertCos && !dofluidsim)
+ CDDM_apply_vert_coords(dm, vertCos);
- mdm->dm.drawVerts = meshDM_drawVerts;
+ CDDM_calc_normals(dm);
- mdm->dm.drawUVEdges = meshDM_drawUVEdges;
- mdm->dm.drawEdges = meshDM_drawEdges;
- mdm->dm.drawLooseEdges = meshDM_drawLooseEdges;
-
- mdm->dm.drawFacesSolid = meshDM_drawFacesSolid;
- mdm->dm.drawFacesColored = meshDM_drawFacesColored;
- mdm->dm.drawFacesTex = meshDM_drawFacesTex;
- mdm->dm.drawMappedFaces = meshDM_drawMappedFaces;
- mdm->dm.drawMappedFacesTex = meshDM_drawMappedFacesTex;
-
- mdm->dm.drawMappedEdges = meshDM_drawMappedEdges;
- mdm->dm.drawMappedFaces = meshDM_drawMappedFaces;
-
- mdm->dm.release = meshDM_release;
-
- /* add appropriate data layers (don't copy, just reference) */
- if(me->msticky)
- DM_add_vert_layer(&mdm->dm, LAYERTYPE_MSTICKY,
- LAYERFLAG_NOFREE, me->msticky);
- if(me->dvert)
- DM_add_vert_layer(&mdm->dm, LAYERTYPE_MDEFORMVERT,
- LAYERFLAG_NOFREE, me->dvert);
-
- if(me->tface)
- DM_add_face_layer(&mdm->dm, LAYERTYPE_TFACE,
- LAYERFLAG_NOFREE, me->tface);
- if(me->mcol)
- DM_add_face_layer(&mdm->dm, LAYERTYPE_MCOL,
- LAYERFLAG_NOFREE, me->mcol);
-
- /* Works in conjunction with hack during modifier calc */
- if ((G.f & G_WEIGHTPAINT) && ob==(G.scene->basact?G.scene->basact->object:NULL)) {
- mdm->wpaintMCol = MEM_dupallocN(me->mcol);
- }
-
- mdm->ob = ob;
- mdm->me = me;
- mdm->verts = me->mvert;
- mdm->nors = NULL;
- mdm->freeNors = 0;
- mdm->freeVerts = 0;
-
- if((ob->fluidsimFlag & OB_FLUIDSIM_ENABLE) &&
- (ob->fluidsimSettings->type & OB_FLUIDSIM_DOMAIN)&&
- (ob->fluidsimSettings->meshSurface) &&
- (1) && (!give_parteff(ob)) && // doesnt work together with particle systems!
- (me->totvert == ((Mesh *)(ob->fluidsimSettings->meshSurface))->totvert) ) {
- // dont recompute for fluidsim mesh, use from readBobjgz
+ /* apply fluidsim normals */
+ if (dofluidsim) {
+ // use normals from readBobjgz
// TODO? check for modifiers!?
- int i;
- mesh_calc_normals(mdm->verts, me->totvert, me->mface, me->totface, &mdm->nors);
- mdm->freeNors = 1;
+ MVert *fsvert = ob->fluidsimSettings->meshSurfNormals;
+ short (*normals)[3] = MEM_mallocN(sizeof(short)*3*me->totvert, "fluidsim nor");
+
for (i=0; i<me->totvert; i++) {
- MVert *mv= &mdm->verts[i];
- MVert *fsv;
- fsv = &ob->fluidsimSettings->meshSurfNormals[i];
- VECCOPY(mv->no, fsv->no);
+ VECCOPY(normals[i], fsvert[i].no);
//mv->no[0]= 30000; mv->no[1]= mv->no[2]= 0; // DEBUG fixed test normals
}
- } else {
- // recompute normally
- if (vertCos) {
- int i;
+ CDDM_apply_vert_normals(dm, normals);
- /* copy the original verts to preserve flag settings; if this is too
- * costly, must at least use MEM_callocN to clear flags */
- mdm->verts = MEM_dupallocN( me->mvert );
- for (i=0; i<me->totvert; i++) {
- VECCOPY(mdm->verts[i].co, vertCos[i]);
- }
- mesh_calc_normals(mdm->verts, me->totvert, me->mface, me->totface, &mdm->nors);
- mdm->freeNors = 1;
- mdm->freeVerts = 1;
- } else {
- // XXX this is kinda hacky because we shouldn't really be editing
- // the mesh here, however, we can't just call mesh_build_faceNormals(ob)
- // because in the case when a key is applied to a mesh the vertex normals
- // would never be correctly computed.
- mesh_calc_normals(mdm->verts, me->totvert, me->mface, me->totface, &mdm->nors);
- mdm->freeNors = 1;
- }
- } // fs TEST
+ MEM_freeN(normals);
+ }
- return (DerivedMesh*) mdm;
+ return dm;
}
///
@@ -1088,11 +560,11 @@ static void emDM_drawUVEdges(DerivedMesh *dm)
{
EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
EditFace *efa;
- TFace *tf;
+ MTFace *tf;
glBegin(GL_LINES);
for(efa= emdm->em->faces.first; efa; efa= efa->next) {
- tf = CustomData_em_get(&emdm->em->fdata, efa->data, LAYERTYPE_TFACE);
+ tf = CustomData_em_get(&emdm->em->fdata, efa->data, CD_MTFACE);
if(tf && !(tf->flag&TF_HIDE)) {
glVertex2fv(tf->uv[0]);
@@ -1360,10 +832,10 @@ void emDM_getFace(DerivedMesh *dm, int index, MFace *face_r)
}
}
- test_index_face(face_r, NULL, NULL, ef->v4?4:3);
+ test_index_face(face_r, NULL, 0, ef->v4?4:3);
}
-void emDM_getVertArray(DerivedMesh *dm, MVert *vert_r)
+void emDM_copyVertArray(DerivedMesh *dm, MVert *vert_r)
{
EditVert *ev = ((EditMeshDerivedMesh *)dm)->em->verts.first;
@@ -1380,7 +852,7 @@ void emDM_getVertArray(DerivedMesh *dm, MVert *vert_r)
}
}
-void emDM_getEdgeArray(DerivedMesh *dm, MEdge *edge_r)
+void emDM_copyEdgeArray(DerivedMesh *dm, MEdge *edge_r)
{
EditMesh *em = ((EditMeshDerivedMesh *)dm)->em;
EditEdge *ee = em->edges.first;
@@ -1411,7 +883,7 @@ void emDM_getEdgeArray(DerivedMesh *dm, MEdge *edge_r)
ev->prev = prevev;
}
-void emDM_getFaceArray(DerivedMesh *dm, MFace *face_r)
+void emDM_copyFaceArray(DerivedMesh *dm, MFace *face_r)
{
EditMesh *em = ((EditMeshDerivedMesh *)dm)->em;
EditFace *ef = em->faces.first;
@@ -1432,7 +904,7 @@ void emDM_getFaceArray(DerivedMesh *dm, MFace *face_r)
if(ef->v4) face_r->v4 = (int)ef->v4->prev;
else face_r->v4 = 0;
- test_index_face(face_r, NULL, NULL, ef->v4?4:3);
+ test_index_face(face_r, NULL, 0, ef->v4?4:3);
}
/* restore prev pointers */
@@ -1444,15 +916,15 @@ static void emDM_release(DerivedMesh *dm)
{
EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
- DM_release(dm);
+ if (DM_release(dm)) {
+ if (emdm->vertexCos) {
+ MEM_freeN(emdm->vertexCos);
+ MEM_freeN(emdm->vertexNos);
+ MEM_freeN(emdm->faceNos);
+ }
- if (emdm->vertexCos) {
- MEM_freeN(emdm->vertexCos);
- MEM_freeN(emdm->vertexNos);
- MEM_freeN(emdm->faceNos);
+ MEM_freeN(emdm);
}
-
- MEM_freeN(emdm);
}
static DerivedMesh *getEditMeshDerivedMesh(EditMesh *em, Object *ob,
@@ -1472,9 +944,9 @@ static DerivedMesh *getEditMeshDerivedMesh(EditMesh *em, Object *ob,
emdm->dm.getVert = emDM_getVert;
emdm->dm.getEdge = emDM_getEdge;
emdm->dm.getFace = emDM_getFace;
- emdm->dm.getVertArray = emDM_getVertArray;
- emdm->dm.getEdgeArray = emDM_getEdgeArray;
- emdm->dm.getFaceArray = emDM_getFaceArray;
+ emdm->dm.copyVertArray = emDM_copyVertArray;
+ emdm->dm.copyEdgeArray = emDM_copyEdgeArray;
+ emdm->dm.copyFaceArray = emDM_copyFaceArray;
emdm->dm.foreachMappedVert = emDM_foreachMappedVert;
emdm->dm.foreachMappedEdge = emDM_foreachMappedEdge;
@@ -1491,15 +963,15 @@ static DerivedMesh *getEditMeshDerivedMesh(EditMesh *em, Object *ob,
emdm->em = em;
emdm->vertexCos = vertexCos;
- if(CustomData_has_layer(&em->vdata, LAYERTYPE_MDEFORMVERT)) {
+ if(CustomData_has_layer(&em->vdata, CD_MDEFORMVERT)) {
EditVert *eve;
int i;
- DM_add_vert_layer(&emdm->dm, LAYERTYPE_MDEFORMVERT, 0, NULL);
+ DM_add_vert_layer(&emdm->dm, CD_MDEFORMVERT, 0, NULL);
for(eve = em->verts.first, i = 0; eve; eve = eve->next, ++i)
- DM_set_vert_data(&emdm->dm, i, LAYERTYPE_MDEFORMVERT,
- CustomData_em_get(&em->vdata, eve->data, LAYERTYPE_MDEFORMVERT));
+ DM_set_vert_data(&emdm->dm, i, CD_MDEFORMVERT,
+ CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT));
}
if(vertexCos) {
@@ -1552,578 +1024,6 @@ static DerivedMesh *getEditMeshDerivedMesh(EditMesh *em, Object *ob,
return (DerivedMesh*) emdm;
}
-///
-
-typedef struct {
- DerivedMesh dm;
-
- DispListMesh *dlm;
-} SSDerivedMesh;
-
-static void ssDM_foreachMappedVert(DerivedMesh *dm, void (*func)(void *userData, int index, float *co, float *no_f, short *no_s), void *userData)
-{
- SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
- DispListMesh *dlm = ssdm->dlm;
- int i;
- int *index = dm->getVertDataArray(dm, LAYERTYPE_ORIGINDEX);
-
- for (i=0; i<dlm->totvert; i++, index++) {
- MVert *mv = &dlm->mvert[i];
-
- if(*index != ORIGINDEX_NONE)
- func(userData, *index, mv->co, NULL, mv->no);
- }
-}
-static void ssDM_foreachMappedEdge(DerivedMesh *dm, void (*func)(void *userData, int index, float *v0co, float *v1co), void *userData)
-{
- SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
- DispListMesh *dlm = ssdm->dlm;
- int i;
- int *index = dm->getEdgeDataArray(dm, LAYERTYPE_ORIGINDEX);
-
- for (i=0; i<dlm->totedge; i++, index++) {
- MEdge *med = &dlm->medge[i];
-
- if(*index != ORIGINDEX_NONE)
- func(userData, *index, dlm->mvert[med->v1].co,
- dlm->mvert[med->v2].co);
- }
-}
-static void ssDM_drawMappedEdges(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index), void *userData)
-{
- SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
- DispListMesh *dlm = ssdm->dlm;
- int i;
- int *index = dm->getEdgeDataArray(dm, LAYERTYPE_ORIGINDEX);
-
- glBegin(GL_LINES);
- for(i=0; i<dlm->totedge; i++, index++) {
- MEdge *med = &dlm->medge[i];
-
- if(*index != ORIGINDEX_NONE
- && (!setDrawOptions || setDrawOptions(userData, *index))) {
- glVertex3fv(dlm->mvert[med->v1].co);
- glVertex3fv(dlm->mvert[med->v2].co);
- }
- }
- glEnd();
-}
-
-static void ssDM_foreachMappedFaceCenter(DerivedMesh *dm, void (*func)(void *userData, int index, float *co, float *no), void *userData)
-{
- SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
- DispListMesh *dlm = ssdm->dlm;
- int i;
- int *index = dm->getFaceDataArray(dm, LAYERTYPE_ORIGINDEX);
-
- for (i=0; i<dlm->totface; i++, index++) {
- MFace *mf = &dlm->mface[i];
-
- if(*index != ORIGINDEX_NONE) {
- float cent[3];
- float no[3];
-
- VECCOPY(cent, dlm->mvert[mf->v1].co);
- VecAddf(cent, cent, dlm->mvert[mf->v2].co);
- VecAddf(cent, cent, dlm->mvert[mf->v3].co);
-
- if (mf->v4) {
- CalcNormFloat4(dlm->mvert[mf->v1].co, dlm->mvert[mf->v2].co, dlm->mvert[mf->v3].co, dlm->mvert[mf->v4].co, no);
- VecAddf(cent, cent, dlm->mvert[mf->v4].co);
- VecMulf(cent, 0.25f);
- } else {
- CalcNormFloat(dlm->mvert[mf->v1].co, dlm->mvert[mf->v2].co, dlm->mvert[mf->v3].co, no);
- VecMulf(cent, 0.33333333333f);
- }
-
- func(userData, *index, cent, no);
- }
- }
-}
-static void ssDM_drawVerts(DerivedMesh *dm)
-{
- SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
- DispListMesh *dlm = ssdm->dlm;
- MVert *mvert= dlm->mvert;
- int i;
-
- bglBegin(GL_POINTS);
- for (i=0; i<dlm->totvert; i++) {
- bglVertex3fv(mvert[i].co);
- }
- bglEnd();
-}
-static void ssDM_drawUVEdges(DerivedMesh *dm)
-{
- SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
- DispListMesh *dlm = ssdm->dlm;
- int i;
-
- if (dlm->tface) {
- glBegin(GL_LINES);
- for (i=0; i<dlm->totface; i++) {
- TFace *tf = &dlm->tface[i];
-
- if (!(tf->flag&TF_HIDE)) {
- glVertex2fv(tf->uv[0]);
- glVertex2fv(tf->uv[1]);
-
- glVertex2fv(tf->uv[1]);
- glVertex2fv(tf->uv[2]);
-
- if (!dlm->mface[i].v4) {
- glVertex2fv(tf->uv[2]);
- glVertex2fv(tf->uv[0]);
- } else {
- glVertex2fv(tf->uv[2]);
- glVertex2fv(tf->uv[3]);
-
- glVertex2fv(tf->uv[3]);
- glVertex2fv(tf->uv[0]);
- }
- }
- }
- glEnd();
- }
-}
-static void ssDM_drawLooseEdges(DerivedMesh *dm)
-{
- SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
- DispListMesh *dlm = ssdm->dlm;
- MVert *mvert = dlm->mvert;
- MEdge *medge= dlm->medge;
- int i;
-
- glBegin(GL_LINES);
- for (i=0; i<dlm->totedge; i++, medge++) {
- if (medge->flag&ME_LOOSEEDGE) {
- glVertex3fv(mvert[medge->v1].co);
- glVertex3fv(mvert[medge->v2].co);
- }
- }
- glEnd();
-}
-static void ssDM_drawEdges(DerivedMesh *dm, int drawLooseEdges)
-{
- SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
- DispListMesh *dlm = ssdm->dlm;
- MVert *mvert= dlm->mvert;
- MEdge *medge= dlm->medge;
- int i;
-
- glBegin(GL_LINES);
- for (i=0; i<dlm->totedge; i++, medge++) {
- if ((medge->flag&ME_EDGEDRAW) && (drawLooseEdges || !(medge->flag&ME_LOOSEEDGE))) {
- glVertex3fv(mvert[medge->v1].co);
- glVertex3fv(mvert[medge->v2].co);
- }
- }
- glEnd();
-}
-static void ssDM_drawFacesSolid(DerivedMesh *dm, int (*setMaterial)(int))
-{
- SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
- DispListMesh *dlm = ssdm->dlm;
- float *nors = dlm->nors;
- int glmode=-1, shademodel=-1, matnr=-1, drawCurrentMat=1;
- int i;
-
-#define PASSVERT(ind) { \
- if (shademodel==GL_SMOOTH) \
- glNormal3sv(dlm->mvert[(ind)].no); \
- glVertex3fv(dlm->mvert[(ind)].co); \
-}
-
- glBegin(glmode=GL_QUADS);
- for (i=0; i<dlm->totface; i++) {
- MFace *mf= &dlm->mface[i];
- int new_glmode = mf->v4?GL_QUADS:GL_TRIANGLES;
- int new_shademodel = (mf->flag&ME_SMOOTH)?GL_SMOOTH:GL_FLAT;
- int new_matnr = mf->mat_nr+1;
-
- if(new_glmode!=glmode || new_shademodel!=shademodel || new_matnr!=matnr) {
- glEnd();
-
- drawCurrentMat = setMaterial(matnr=new_matnr);
-
- glShadeModel(shademodel=new_shademodel);
- glBegin(glmode=new_glmode);
- }
-
- if (drawCurrentMat) {
- if (shademodel==GL_FLAT)
- glNormal3fv(&nors[i*3]);
-
- PASSVERT(mf->v1);
- PASSVERT(mf->v2);
- PASSVERT(mf->v3);
- if (mf->v4)
- PASSVERT(mf->v4);
- }
- }
- glEnd();
-
-#undef PASSVERT
-}
-static void ssDM_drawFacesColored(DerivedMesh *dm, int useTwoSided, unsigned char *vcols1, unsigned char *vcols2)
-{
- SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
- DispListMesh *dlm = ssdm->dlm;
- int i, lmode;
-
- glShadeModel(GL_SMOOTH);
- if (vcols2) {
- glEnable(GL_CULL_FACE);
- } else {
- useTwoSided = 0;
- }
-
-#define PASSVERT(vidx, fidx) { \
- unsigned char *col= &colbase[fidx*4]; \
- glColor3ub(col[3], col[2], col[1]); \
- glVertex3fv(dlm->mvert[(vidx)].co); \
-}
-
- glBegin(lmode= GL_QUADS);
- for (i=0; i<dlm->totface; i++) {
- MFace *mf= &dlm->mface[i];
- int nmode= mf->v4?GL_QUADS:GL_TRIANGLES;
- unsigned char *colbase= &vcols1[i*16];
-
- if (nmode!=lmode) {
- glEnd();
- glBegin(lmode= nmode);
- }
-
- PASSVERT(mf->v1, 0);
- PASSVERT(mf->v2, 1);
- PASSVERT(mf->v3, 2);
- if (mf->v4)
- PASSVERT(mf->v4, 3);
-
- if (useTwoSided) {
- unsigned char *colbase= &vcols2[i*16];
-
- if (mf->v4)
- PASSVERT(mf->v4, 3);
- PASSVERT(mf->v3, 2);
- PASSVERT(mf->v2, 1);
- PASSVERT(mf->v1, 0);
- }
- }
- glEnd();
-
- if (vcols2)
- glDisable(GL_CULL_FACE);
-
-#undef PASSVERT
-}
-
-static void ssDM_drawFacesTex_common(DerivedMesh *dm, int (*drawParams)(TFace *tface, int matnr), int (*drawParamsMapped)(void *userData, int index), void *userData)
-{
- SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
- DispListMesh *dlm = ssdm->dlm;
- MVert *mvert= dlm->mvert;
- MFace *mface= dlm->mface;
- TFace *tface = dlm->tface;
- float *nors = dlm->nors;
- int a;
- int *index = dm->getFaceDataArray(dm, LAYERTYPE_ORIGINDEX);
-
- for (a=0; a<dlm->totface; a++, index++) {
- MFace *mf= &mface[a];
- TFace *tf = tface?&tface[a]:NULL;
- int flag = 0;
- unsigned char *cp= NULL;
-
- if (drawParams) {
- flag = drawParams(tf, mf->mat_nr);
- }
- else {
- if(*index != ORIGINDEX_NONE)
- flag = drawParamsMapped(userData, *index);
- }
-
- if (flag==0) {
- continue;
- } else if (flag==1) {
- if (tf) {
- cp= (unsigned char*) tf->col;
- } else if (dlm->mcol) {
- cp= (unsigned char*) &dlm->mcol[a*4];
- }
- }
-
- if (!(mf->flag&ME_SMOOTH)) {
- glNormal3fv(&nors[a*3]);
- }
-
- glBegin(mf->v4?GL_QUADS:GL_TRIANGLES);
- if (tf) glTexCoord2fv(tf->uv[0]);
- if (cp) glColor3ub(cp[3], cp[2], cp[1]);
- if (mf->flag&ME_SMOOTH) glNormal3sv(mvert[mf->v1].no);
- glVertex3fv((mvert+mf->v1)->co);
-
- if (tf) glTexCoord2fv(tf->uv[1]);
- if (cp) glColor3ub(cp[7], cp[6], cp[5]);
- if (mf->flag&ME_SMOOTH) glNormal3sv(mvert[mf->v2].no);
- glVertex3fv((mvert+mf->v2)->co);
-
- if (tf) glTexCoord2fv(tf->uv[2]);
- if (cp) glColor3ub(cp[11], cp[10], cp[9]);
- if (mf->flag&ME_SMOOTH) glNormal3sv(mvert[mf->v3].no);
- glVertex3fv((mvert+mf->v3)->co);
-
- if(mf->v4) {
- if (tf) glTexCoord2fv(tf->uv[3]);
- if (cp) glColor3ub(cp[15], cp[14], cp[13]);
- if (mf->flag&ME_SMOOTH) glNormal3sv(mvert[mf->v4].no);
- glVertex3fv((mvert+mf->v4)->co);
- }
- glEnd();
- }
-}
-static void ssDM_drawFacesTex(DerivedMesh *dm, int (*setDrawParams)(TFace *tface, int matnr))
-{
- ssDM_drawFacesTex_common(dm, setDrawParams, NULL, NULL);
-}
-static void ssDM_drawMappedFacesTex(DerivedMesh *dm, int (*setDrawParams)(void *userData, int index), void *userData)
-{
- ssDM_drawFacesTex_common(dm, NULL, setDrawParams, userData);
-}
-
-static void ssDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int useColors)
-{
- SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
- DispListMesh *dlm = ssdm->dlm;
- MVert *mvert= dlm->mvert;
- MFace *mface= dlm->mface;
- float *nors = dlm->nors;
- int i;
- int *index = dm->getFaceDataArray(dm, LAYERTYPE_ORIGINDEX);
-
- for (i=0; i<dlm->totface; i++, index++) {
- MFace *mf = &mface[i];
- int drawSmooth = (mf->flag & ME_SMOOTH);
-
- if(*index != ORIGINDEX_NONE
- && (!setDrawOptions
- || setDrawOptions(userData, *index, &drawSmooth))) {
- unsigned char *cp = NULL;
-
- if (useColors) {
- if (dlm->tface) {
- cp= (unsigned char*) dlm->tface[i].col;
- } else if (dlm->mcol) {
- cp= (unsigned char*) &dlm->mcol[i*4];
- }
- }
-
- glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
- glBegin(mf->v4?GL_QUADS:GL_TRIANGLES);
-
- if (!drawSmooth) {
- glNormal3fv(&nors[i*3]);
-
- if (cp) glColor3ub(cp[3], cp[2], cp[1]);
- glVertex3fv(mvert[mf->v1].co);
- if (cp) glColor3ub(cp[7], cp[6], cp[5]);
- glVertex3fv(mvert[mf->v2].co);
- if (cp) glColor3ub(cp[11], cp[10], cp[9]);
- glVertex3fv(mvert[mf->v3].co);
- if(mf->v4) {
- if (cp) glColor3ub(cp[15], cp[14], cp[13]);
- glVertex3fv(mvert[mf->v4].co);
- }
- } else {
- if (cp) glColor3ub(cp[3], cp[2], cp[1]);
- glNormal3sv(mvert[mf->v1].no);
- glVertex3fv(mvert[mf->v1].co);
- if (cp) glColor3ub(cp[7], cp[6], cp[5]);
- glNormal3sv(mvert[mf->v2].no);
- glVertex3fv(mvert[mf->v2].co);
- if (cp) glColor3ub(cp[11], cp[10], cp[9]);
- glNormal3sv(mvert[mf->v3].no);
- glVertex3fv(mvert[mf->v3].co);
- if(mf->v4) {
- if (cp) glColor3ub(cp[15], cp[14], cp[13]);
- glNormal3sv(mvert[mf->v4].no);
- glVertex3fv(mvert[mf->v4].co);
- }
- }
-
- glEnd();
- }
- }
-}
-static void ssDM_getMinMax(DerivedMesh *dm, float min_r[3], float max_r[3])
-{
- SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
- int i;
-
- if (ssdm->dlm->totvert) {
- for (i=0; i<ssdm->dlm->totvert; i++) {
- DO_MINMAX(ssdm->dlm->mvert[i].co, min_r, max_r);
- }
- } else {
- min_r[0] = min_r[1] = min_r[2] = max_r[0] = max_r[1] = max_r[2] = 0.0;
- }
-}
-
-static void ssDM_getVertCos(DerivedMesh *dm, float (*cos_r)[3])
-{
- SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
- int i;
-
- for (i=0; i<ssdm->dlm->totvert; i++) {
- cos_r[i][0] = ssdm->dlm->mvert[i].co[0];
- cos_r[i][1] = ssdm->dlm->mvert[i].co[1];
- cos_r[i][2] = ssdm->dlm->mvert[i].co[2];
- }
-}
-
-static int ssDM_getNumVerts(DerivedMesh *dm)
-{
- SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
-
- return ssdm->dlm->totvert;
-}
-
-static int ssDM_getNumEdges(DerivedMesh *dm)
-{
- SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
-
- return ssdm->dlm->totedge;
-}
-
-static int ssDM_getNumFaces(DerivedMesh *dm)
-{
- SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
-
- return ssdm->dlm->totface;
-}
-
-void ssDM_getVert(DerivedMesh *dm, int index, MVert *vert_r)
-{
- *vert_r = ((SSDerivedMesh *)dm)->dlm->mvert[index];
-}
-
-void ssDM_getEdge(DerivedMesh *dm, int index, MEdge *edge_r)
-{
- *edge_r = ((SSDerivedMesh *)dm)->dlm->medge[index];
-}
-
-void ssDM_getFace(DerivedMesh *dm, int index, MFace *face_r)
-{
- *face_r = ((SSDerivedMesh *)dm)->dlm->mface[index];
-}
-
-void ssDM_getVertArray(DerivedMesh *dm, MVert *vert_r)
-{
- SSDerivedMesh *ssdm = (SSDerivedMesh *)dm;
- memcpy(vert_r, ssdm->dlm->mvert, sizeof(*vert_r) * ssdm->dlm->totvert);
-}
-
-void ssDM_getEdgeArray(DerivedMesh *dm, MEdge *edge_r)
-{
- SSDerivedMesh *ssdm = (SSDerivedMesh *)dm;
- memcpy(edge_r, ssdm->dlm->medge, sizeof(*edge_r) * ssdm->dlm->totedge);
-}
-
-void ssDM_getFaceArray(DerivedMesh *dm, MFace *face_r)
-{
- SSDerivedMesh *ssdm = (SSDerivedMesh *)dm;
- memcpy(face_r, ssdm->dlm->mface, sizeof(*face_r) * ssdm->dlm->totface);
-}
-
-static DispListMesh *ssDM_convertToDispListMesh(DerivedMesh *dm, int allowShared)
-{
- SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
-
- if (allowShared) {
- return displistmesh_copyShared(ssdm->dlm);
- } else {
- return displistmesh_copy(ssdm->dlm);
- }
-}
-
-static void ssDM_release(DerivedMesh *dm)
-{
- SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
-
- DM_release(dm);
-
- displistmesh_free(ssdm->dlm);
-
- MEM_freeN(dm);
-}
-
-DerivedMesh *derivedmesh_from_displistmesh(DispListMesh *dlm, float (*vertexCos)[3])
-{
- SSDerivedMesh *ssdm = MEM_callocN(sizeof(*ssdm), "ssdm");
-
- DM_init(&ssdm->dm, dlm->totvert, dlm->totedge, dlm->totface);
-
- ssdm->dm.getMinMax = ssDM_getMinMax;
-
- ssdm->dm.getNumVerts = ssDM_getNumVerts;
- ssdm->dm.getNumEdges = ssDM_getNumEdges;
- ssdm->dm.getNumFaces = ssDM_getNumFaces;
-
- ssdm->dm.getVert = ssDM_getVert;
- ssdm->dm.getEdge = ssDM_getEdge;
- ssdm->dm.getFace = ssDM_getFace;
- ssdm->dm.getVertArray = ssDM_getVertArray;
- ssdm->dm.getEdgeArray = ssDM_getEdgeArray;
- ssdm->dm.getFaceArray = ssDM_getFaceArray;
-
- ssdm->dm.convertToDispListMesh = ssDM_convertToDispListMesh;
-
- ssdm->dm.getVertCos = ssDM_getVertCos;
-
- ssdm->dm.drawVerts = ssDM_drawVerts;
-
- ssdm->dm.drawUVEdges = ssDM_drawUVEdges;
- ssdm->dm.drawEdges = ssDM_drawEdges;
- ssdm->dm.drawLooseEdges = ssDM_drawLooseEdges;
-
- ssdm->dm.drawFacesSolid = ssDM_drawFacesSolid;
- ssdm->dm.drawFacesColored = ssDM_drawFacesColored;
- ssdm->dm.drawFacesTex = ssDM_drawFacesTex;
- ssdm->dm.drawMappedFaces = ssDM_drawMappedFaces;
- ssdm->dm.drawMappedFacesTex = ssDM_drawMappedFacesTex;
-
- /* EM functions */
-
- ssdm->dm.foreachMappedVert = ssDM_foreachMappedVert;
- ssdm->dm.foreachMappedEdge = ssDM_foreachMappedEdge;
- ssdm->dm.foreachMappedFaceCenter = ssDM_foreachMappedFaceCenter;
-
- ssdm->dm.drawMappedEdges = ssDM_drawMappedEdges;
- ssdm->dm.drawMappedEdgesInterp = NULL; // no way to implement this one
-
- ssdm->dm.release = ssDM_release;
-
- ssdm->dlm = dlm;
-
- if (vertexCos) {
- int i;
-
- for (i=0; i<dlm->totvert; i++) {
- VECCOPY(dlm->mvert[i].co, vertexCos[i]);
- }
-
- if (dlm->nors && !dlm->dontFreeNors) {
- MEM_freeN(dlm->nors);
- dlm->nors = 0;
- }
-
- mesh_calc_normals(dlm->mvert, dlm->totvert, dlm->mface, dlm->totface, &dlm->nors);
- }
-
- return (DerivedMesh*) ssdm;
-}
-
#ifdef WITH_VERSE
/* verse derived mesh */
@@ -2251,11 +1151,11 @@ void vDM_getFace(DerivedMesh *dm, int index, MFace *face_r)
}
}
- test_index_face(face_r, NULL, NULL, vface->vvert3?4:3);
+ test_index_face(face_r, NULL, 0, vface->vvert3?4:3);
}
/* fill array of mvert */
-void vDM_getVertArray(DerivedMesh *dm, MVert *vert_r)
+void vDM_copyVertArray(DerivedMesh *dm, MVert *vert_r)
{
VerseVert *vvert = ((VDerivedMesh *)dm)->vertex_layer->dl.lb.first;
@@ -2272,12 +1172,12 @@ void vDM_getVertArray(DerivedMesh *dm, MVert *vert_r)
}
/* dummy function, edges arent supported in verse mesh */
-void vDM_getEdgeArray(DerivedMesh *dm, MEdge *edge_r)
+void vDM_copyEdgeArray(DerivedMesh *dm, MEdge *edge_r)
{
}
/* fill array of mfaces */
-void vDM_getFaceArray(DerivedMesh *dm, MFace *face_r)
+void vDM_copyFaceArray(DerivedMesh *dm, MFace *face_r)
{
VerseFace *vface = ((VDerivedMesh*)dm)->polygon_layer->dl.lb.first;
VerseVert *vvert = ((VDerivedMesh*)dm)->vertex_layer->dl.lb.first;
@@ -2297,124 +1197,8 @@ void vDM_getFaceArray(DerivedMesh *dm, MFace *face_r)
if(vface->vvert3) face_r->v4 = vface->vvert3->tmp.index;
else face_r->v4 = 0;
- test_index_face(face_r, NULL, NULL, vface->vvert3?4:3);
- }
-}
-
-/* create diplist mesh from verse mesh */
-static DispListMesh* vDM_convertToDispListMesh(DerivedMesh *dm, int allowShared)
-{
- VDerivedMesh *vdm = (VDerivedMesh*)dm;
- DispListMesh *dlm = MEM_callocN(sizeof(*dlm), "dlm");
- struct VerseVert *vvert;
- struct VerseFace *vface;
- struct MVert *mvert=NULL;
- struct MFace *mface=NULL;
- float *norms;
- unsigned int i;
- EdgeHash *edges;
-
- if(!vdm->vertex_layer || !vdm->polygon_layer) {
- dlm->totvert = 0;
- dlm->totedge = 0;
- dlm->totface = 0;
- dlm->dontFreeVerts = dlm->dontFreeOther = dlm->dontFreeNors = 0;
-
- return dlm;
- };
-
- /* number of vertexes, edges and faces */
- dlm->totvert = vdm->vertex_layer->dl.da.count;
- dlm->totface = vdm->polygon_layer->dl.da.count;
-
- /* create dynamic array of mverts */
- mvert = (MVert*)MEM_mallocN(sizeof(MVert)*dlm->totvert, "dlm verts");
- dlm->mvert = mvert;
- vvert = (VerseVert*)vdm->vertex_layer->dl.lb.first;
- i = 0;
- while(vvert) {
- VECCOPY(mvert->co, vdm->verts ? vvert->cos : vvert->co);
- VECCOPY(mvert->no, vvert->no);
- mvert->mat_nr = 0;
- mvert->flag = 0;
-
- vvert->tmp.index = i++;
- mvert++;
- vvert = vvert->next;
- }
-
- edges = BLI_edgehash_new();
-
- /* create dynamic array of faces */
- mface = (MFace*)MEM_mallocN(sizeof(MFace)*dlm->totface, "dlm faces");
- dlm->mface = mface;
- vface = (VerseFace*)vdm->polygon_layer->dl.lb.first;
- i = 0;
- while(vface) {
- mface->v1 = vface->vvert0->tmp.index;
- mface->v2 = vface->vvert1->tmp.index;
- mface->v3 = vface->vvert2->tmp.index;
- if(!BLI_edgehash_haskey(edges, mface->v1, mface->v2))
- BLI_edgehash_insert(edges, mface->v1, mface->v2, NULL);
- if(!BLI_edgehash_haskey(edges, mface->v2, mface->v3))
- BLI_edgehash_insert(edges, mface->v2, mface->v3, NULL);
- if(vface->vvert3) {
- mface->v4 = vface->vvert3->tmp.index;
- if(!BLI_edgehash_haskey(edges, mface->v3, mface->v4))
- BLI_edgehash_insert(edges, mface->v3, mface->v4, NULL);
- if(!BLI_edgehash_haskey(edges, mface->v4, mface->v1))
- BLI_edgehash_insert(edges, mface->v4, mface->v1, NULL);
- } else {
- mface->v4 = 0;
- if(!BLI_edgehash_haskey(edges, mface->v3, mface->v1))
- BLI_edgehash_insert(edges, mface->v3, mface->v1, NULL);
- }
-
- mface->pad = 0;
- mface->mat_nr = 0;
- mface->flag = 0;
- mface->edcode = 0;
-
- test_index_face(mface, NULL, NULL, vface->vvert3?4:3);
-
- mface++;
- vface = vface->next;
+ test_index_face(face_r, NULL, 0, vface->vvert3?4:3);
}
-
- dlm->totedge = BLI_edgehash_size(edges);
-
- if(dlm->totedge) {
- EdgeHashIterator *i;
- MEdge *medge = dlm->medge = (MEdge *)MEM_mallocN(sizeof(MEdge)*dlm->totedge, "mesh_from_verse edge");
-
- for(i = BLI_edgehashIterator_new(edges); !BLI_edgehashIterator_isDone(i); BLI_edgehashIterator_step(i), ++medge) {
- BLI_edgehashIterator_getKey(i, (int*)&medge->v1, (int*)&medge->v2);
- medge->crease = medge->pad = medge->flag = 0;
- }
- BLI_edgehashIterator_free(i);
- }
-
- BLI_edgehash_free(edges, NULL);
-
- /* textures and verex colors aren't supported yet */
- dlm->tface = NULL;
- dlm->mcol = NULL;
-
- /* faces normals */
- norms = (float*)MEM_mallocN(sizeof(float)*3*dlm->totface, "dlm norms");
- dlm->nors = norms;
-
- vface = (VerseFace*)vdm->polygon_layer->dl.lb.first;
- while(vface){
- VECCOPY(norms, vface->no);
- norms += 3;
- vface = vface->next;
- }
-
- /* free everything, nothing is shared */
- dlm->dontFreeVerts = dlm->dontFreeOther = dlm->dontFreeNors = 0;
-
- return dlm;
}
/* return coordination of vertex with index ... I suppose, that it will
@@ -2566,7 +1350,7 @@ static void vDM_drawFacesSolid(DerivedMesh *dm, int (*setMaterial)(int))
}
/* thsi function should draw mesh with mapped texture, but it isn't supported yet */
-static void vDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(struct TFace *tface, int matnr))
+static void vDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace *tface, MCol *mcol, int matnr))
{
VDerivedMesh *vdm = (VDerivedMesh*)dm;
struct VerseFace *vface;
@@ -2675,10 +1459,10 @@ static void vDM_release(DerivedMesh *dm)
{
VDerivedMesh *vdm = (VDerivedMesh*)dm;
- DM_release(dm);
-
- if(vdm->verts) MEM_freeN(vdm->verts);
- MEM_freeN(vdm);
+ if (DM_release(dm)) {
+ if(vdm->verts) MEM_freeN(vdm->verts);
+ MEM_freeN(vdm);
+ }
}
/* create derived mesh from verse mesh ... it is used in object mode, when some other client can
@@ -2706,16 +1490,14 @@ DerivedMesh *derivedmesh_from_versemesh(VNode *vnode, float (*vertexCos)[3])
vdm->dm.getVert = vDM_getVert;
vdm->dm.getEdge = vDM_getEdge;
vdm->dm.getFace = vDM_getFace;
- vdm->dm.getVertArray = vDM_getVertArray;
- vdm->dm.getEdgeArray = vDM_getEdgeArray;
- vdm->dm.getFaceArray = vDM_getFaceArray;
+ vdm->dm.copyVertArray = vDM_copyVertArray;
+ vdm->dm.copyEdgeArray = vDM_copyEdgeArray;
+ vdm->dm.copyFaceArray = vDM_copyFaceArray;
vdm->dm.foreachMappedVert = vDM_foreachMappedVert;
vdm->dm.foreachMappedEdge = vDM_foreachMappedEdge;
vdm->dm.foreachMappedFaceCenter = vDM_foreachMappedFaceCenter;
- vdm->dm.convertToDispListMesh = vDM_convertToDispListMesh;
-
vdm->dm.getVertCos = vDM_getVertCos;
vdm->dm.getVertCo = vDM_getVertCo;
vdm->dm.getVertNo = vDM_getVertNo;
@@ -2865,14 +1647,14 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3],
#ifdef WITH_VERSE
if(me->vnode) *deform_r = derivedmesh_from_versemesh(me->vnode, deformedVerts);
else {
- *deform_r = CDDM_from_mesh(me);
+ *deform_r = CDDM_from_mesh(me, ob);
if(deformedVerts) {
CDDM_apply_vert_coords(*deform_r, deformedVerts);
CDDM_calc_normals(*deform_r);
}
}
#else
- *deform_r = CDDM_from_mesh(me);
+ *deform_r = CDDM_from_mesh(me, ob);
if(deformedVerts) {
CDDM_apply_vert_coords(*deform_r, deformedVerts);
CDDM_calc_normals(*deform_r);
@@ -2954,7 +1736,7 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3],
CDDM_calc_normals(dm);
}
} else {
- dm = CDDM_from_mesh(me);
+ dm = CDDM_from_mesh(me, ob);
if(deformedVerts) {
CDDM_apply_vert_coords(dm, deformedVerts);
@@ -2999,14 +1781,14 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3],
if(me->vnode)
*final_r = derivedmesh_from_versemesh(me->vnode, deformedVerts);
else {
- *final_r = CDDM_from_mesh(me);
+ *final_r = CDDM_from_mesh(me, ob);
if(deformedVerts) {
CDDM_apply_vert_coords(*final_r, deformedVerts);
CDDM_calc_normals(*final_r);
}
}
#else
- *final_r = CDDM_from_mesh(me);
+ *final_r = CDDM_from_mesh(me, ob);
if(deformedVerts) {
CDDM_apply_vert_coords(*final_r, deformedVerts);
CDDM_calc_normals(*final_r);
@@ -3254,10 +2036,12 @@ static void clear_mesh_caches(Object *ob)
freedisplist(&ob->disp);
if (ob->derivedFinal) {
+ ob->derivedFinal->needsFree = 1;
ob->derivedFinal->release(ob->derivedFinal);
ob->derivedFinal= NULL;
}
if (ob->derivedDeform) {
+ ob->derivedDeform->needsFree = 1;
ob->derivedDeform->release(ob->derivedDeform);
ob->derivedDeform= NULL;
}
@@ -3277,21 +2061,27 @@ static void mesh_build_data(Object *ob)
if( (G.f & G_WEIGHTPAINT) && ob==obact ) {
MCol *mcol = me->mcol;
- TFace *tface = me->tface;
+ MCol *wpcol = (MCol*)calc_weightpaint_colors(ob);
- me->mcol = (MCol*) calc_weightpaint_colors(ob);
- if(me->tface) {
- me->tface = MEM_dupallocN(me->tface);
- mcol_to_tface(me, 1);
+ /* ugly hack here, we replace mcol with weight paint colors, then
+ CDDM_from_mesh duplicates it, and uses that instead of mcol */
+ if (mcol) {
+ CustomData_set_layer(&me->fdata, CD_MCOL, NULL);
+ CustomData_free_layer(&me->fdata, CD_MCOL, me->totface);
}
+ 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);
- if(me->mcol) MEM_freeN(me->mcol);
- if(me->tface) MEM_freeN(me->tface);
- me->mcol = mcol;
- me->tface = tface;
+ CustomData_free_layer(&me->fdata, CD_MCOL, me->totface);
+ if (wpcol) MEM_freeN(wpcol);
+
+ if (mcol)
+ me->mcol= CustomData_add_layer(&me->fdata, CD_MCOL, 0, mcol, me->totface);
+ me->mcol= mcol;
} else {
mesh_calc_modifiers(ob, NULL, &ob->derivedDeform,
&ob->derivedFinal, 0, 1, needMapping);
@@ -3302,6 +2092,9 @@ static void mesh_build_data(Object *ob)
ob->derivedFinal->getMinMax(ob->derivedFinal, min, max);
boundbox_set_from_min_max(mesh_get_bb(ob->data), min, max);
+
+ ob->derivedFinal->needsFree = 0;
+ ob->derivedDeform->needsFree = 0;
}
}
@@ -3315,11 +2108,13 @@ static void editmesh_build_data(void)
if (em->derivedFinal) {
if (em->derivedFinal!=em->derivedCage) {
+ em->derivedFinal->needsFree = 1;
em->derivedFinal->release(em->derivedFinal);
}
em->derivedFinal = NULL;
}
if (em->derivedCage) {
+ em->derivedCage->needsFree = 1;
em->derivedCage->release(em->derivedCage);
em->derivedCage = NULL;
}
@@ -3331,9 +2126,12 @@ static void editmesh_build_data(void)
em->derivedFinal->getMinMax(em->derivedFinal, min, max);
boundbox_set_from_min_max(mesh_get_bb(G.obedit->data), min, max);
+
+ em->derivedFinal->needsFree = 0;
+ em->derivedCage->needsFree = 0;
}
-void makeDispListMesh(Object *ob)
+void makeDerivedMesh(Object *ob)
{
if (ob==G.obedit) {
editmesh_build_data();
@@ -3351,23 +2149,19 @@ void makeDispListMesh(Object *ob)
/***/
-DerivedMesh *mesh_get_derived_final(Object *ob, int *needsFree_r)
+DerivedMesh *mesh_get_derived_final(Object *ob)
{
- if (!ob->derivedFinal) {
+ if (!ob->derivedFinal)
mesh_build_data(ob);
- }
- *needsFree_r = 0;
return ob->derivedFinal;
}
-DerivedMesh *mesh_get_derived_deform(Object *ob, int *needsFree_r)
+DerivedMesh *mesh_get_derived_deform(Object *ob)
{
- if (!ob->derivedDeform) {
+ if (!ob->derivedDeform)
mesh_build_data(ob);
- }
- *needsFree_r = 0;
return ob->derivedDeform;
}
@@ -3390,7 +2184,7 @@ DerivedMesh *mesh_create_derived_render(Object *ob)
if(final->getNumVerts(final) == m->totvert &&
final->getNumFaces(final) == m->totface) {
for(i=0; i<m->totvert; ++i)
- memcpy(&m->mvert[i], CustomData_get(&final->vertData, i, LAYERTYPE_MVERT), sizeof(MVert));
+ memcpy(&m->mvert[i], CustomData_get(&final->vertData, i, CD_MVERT), sizeof(MVert));
final->release(final);
@@ -3398,7 +2192,7 @@ DerivedMesh *mesh_create_derived_render(Object *ob)
multires_set_level(ob,m);
final= getMeshDerivedMesh(m,ob,NULL);
}
- }
+ }
return final;
}
@@ -3432,10 +2226,8 @@ DerivedMesh *mesh_create_derived_no_deform_render(Object *ob, float (*vertCos)[3
/***/
-DerivedMesh *editmesh_get_derived_cage_and_final(DerivedMesh **final_r, int *cageNeedsFree_r, int *finalNeedsFree_r)
+DerivedMesh *editmesh_get_derived_cage_and_final(DerivedMesh **final_r)
{
- *cageNeedsFree_r = *finalNeedsFree_r = 0;
-
if (!G.editMesh->derivedCage)
editmesh_build_data();
@@ -3443,10 +2235,8 @@ DerivedMesh *editmesh_get_derived_cage_and_final(DerivedMesh **final_r, int *cag
return G.editMesh->derivedCage;
}
-DerivedMesh *editmesh_get_derived_cage(int *needsFree_r)
+DerivedMesh *editmesh_get_derived_cage(void)
{
- *needsFree_r = 0;
-
if (!G.editMesh->derivedCage)
editmesh_build_data();
@@ -3490,13 +2280,12 @@ float *mesh_get_mapped_verts_nors(Object *ob)
Mesh *me= ob->data;
DerivedMesh *dm;
float *vertexcosnos;
- int needsFree;
/* lets prevent crashing... */
if(ob->type!=OB_MESH || me->totvert==0)
return NULL;
- dm= mesh_get_derived_final(ob, &needsFree);
+ dm= mesh_get_derived_final(ob);
vertexcosnos= MEM_callocN(6*sizeof(float)*me->totvert, "vertexcosnos map");
if(dm->foreachMappedVert) {
@@ -3512,7 +2301,7 @@ float *mesh_get_mapped_verts_nors(Object *ob)
}
}
- if (needsFree) dm->release(dm);
+ dm->release(dm);
return vertexcosnos;
}
@@ -3531,14 +2320,14 @@ float *mesh_get_mapped_verts_nors(Object *ob)
void writeBobjgz(char *filename, struct Object *ob, int useGlobalCoords, int append, float time)
{
char debugStrBuffer[256];
- int wri,i,j;
+ int wri,i,j,totvert,totface;
float wrf;
gzFile gzf;
- DispListMesh *dlm = NULL;
DerivedMesh *dm;
float vec[3];
float rotmat[3][3];
- MFace *mface = NULL;
+ MVert *mvert;
+ MFace *mface;
//if(append)return; // DEBUG
if(!ob->data || (ob->type!=OB_MESH)) {
@@ -3562,8 +2351,11 @@ void writeBobjgz(char *filename, struct Object *ob, int useGlobalCoords, int app
dm = mesh_create_derived_render(ob);
//dm = mesh_create_derived_no_deform(ob,NULL);
- dlm = dm->convertToDispListMesh(dm, 1);
- mface = dlm->mface;
+
+ mvert = dm->getVertArray(dm);
+ mface = dm->getFaceArray(dm);
+ totvert = dm->getNumVerts(dm);
+ totface = dm->getNumFaces(dm);
// write time value for appended anim mesh
if(append) {
@@ -3572,10 +2364,11 @@ void writeBobjgz(char *filename, struct Object *ob, int useGlobalCoords, int app
// continue with verts/norms
if(sizeof(wri)!=4) { snprintf(debugStrBuffer,256,"Writing GZ_BOBJ, Invalid int size %d...\n", wri); elbeemDebugOut(debugStrBuffer); return; } // paranoia check
- wri = dlm->totvert;
+ wri = dm->getNumVerts(dm);
+ mvert = dm->getVertArray(dm);
gzwrite(gzf, &wri, sizeof(wri));
for(i=0; i<wri;i++) {
- VECCOPY(vec, dlm->mvert[i].co);
+ VECCOPY(vec, mvert[i].co);
if(useGlobalCoords) { Mat4MulVecfl(ob->obmat, vec); }
for(j=0; j<3; j++) {
wrf = vec[j];
@@ -3584,11 +2377,11 @@ void writeBobjgz(char *filename, struct Object *ob, int useGlobalCoords, int app
}
// should be the same as Vertices.size
- wri = dlm->totvert;
+ wri = totvert;
gzwrite(gzf, &wri, sizeof(wri));
EulToMat3(ob->rot, rotmat);
for(i=0; i<wri;i++) {
- VECCOPY(vec, dlm->mvert[i].no);
+ VECCOPY(vec, mvert[i].no);
Normalise(vec);
if(useGlobalCoords) { Mat3MulVecfl(rotmat, vec); }
for(j=0; j<3; j++) {
@@ -3604,12 +2397,12 @@ void writeBobjgz(char *filename, struct Object *ob, int useGlobalCoords, int app
// compute no. of triangles
wri = 0;
- for(i=0; i<dlm->totface; i++) {
+ for(i=0; i<totface; i++) {
wri++;
if(mface[i].v4) { wri++; }
}
gzwrite(gzf, &wri, sizeof(wri));
- for(i=0; i<dlm->totface; i++) {
+ for(i=0; i<totface; i++) {
int face[4];
face[0] = mface[i].v1;
@@ -3617,15 +2410,15 @@ void writeBobjgz(char *filename, struct Object *ob, int useGlobalCoords, int app
face[2] = mface[i].v3;
face[3] = mface[i].v4;
//snprintf(debugStrBuffer,256,"F %s %d = %d,%d,%d,%d \n",ob->id.name, i, face[0],face[1],face[2],face[3] ); elbeemDebugOut(debugStrBuffer);
- //VecSubf(side1, dlm->mvert[face[1]].co,dlm->mvert[face[0]].co);
- //VecSubf(side2, dlm->mvert[face[2]].co,dlm->mvert[face[0]].co);
+ //VecSubf(side1, mvert[face[1]].co,mvert[face[0]].co);
+ //VecSubf(side2, mvert[face[2]].co,mvert[face[0]].co);
//Crossf(norm1,side1,side2);
gzwrite(gzf, &(face[0]), sizeof( face[0] ));
gzwrite(gzf, &(face[1]), sizeof( face[1] ));
gzwrite(gzf, &(face[2]), sizeof( face[2] ));
if(face[3]) {
- //VecSubf(side1, dlm->mvert[face[2]].co,dlm->mvert[face[0]].co);
- //VecSubf(side2, dlm->mvert[face[3]].co,dlm->mvert[face[0]].co);
+ //VecSubf(side1, mvert[face[2]].co,mvert[face[0]].co);
+ //VecSubf(side2, mvert[face[3]].co,mvert[face[0]].co);
//Crossf(norm2,side1,side2);
//inpf = Inpf(norm1,norm2);
//if(inpf>0.) {
@@ -3641,11 +2434,10 @@ void writeBobjgz(char *filename, struct Object *ob, int useGlobalCoords, int app
}
}
- snprintf(debugStrBuffer,256,"Done. #Vertices: %d, #Triangles: %d\n", dlm->totvert, dlm->totface );
+ snprintf(debugStrBuffer,256,"Done. #Vertices: %d, #Triangles: %d\n", totvert, totface );
elbeemDebugOut(debugStrBuffer);
gzclose( gzf );
- if(dlm) displistmesh_free(dlm);
dm->release(dm);
}
@@ -3654,36 +2446,38 @@ void initElbeemMesh(struct Object *ob,
int *numTriangles, int **triangles,
int useGlobalCoords)
{
- DispListMesh *dlm = NULL;
DerivedMesh *dm = NULL;
- MFace *mface = NULL;
- int countTris=0, i;
+ MVert *mvert;
+ MFace *mface;
+ int countTris=0, i, totvert, totface;
float *verts;
int *tris;
dm = mesh_create_derived_render(ob);
//dm = mesh_create_derived_no_deform(ob,NULL);
if(!dm) { *numVertices = *numTriangles = 0; *triangles=NULL; *vertices=NULL; }
- dlm = dm->convertToDispListMesh(dm, 1);
- if(!dlm) { dm->release(dm); *numVertices = *numTriangles = 0; *triangles=NULL; *vertices=NULL; }
- mface = dlm->mface;
-
- *numVertices = dlm->totvert;
- verts = MEM_callocN( dlm->totvert*3*sizeof(float), "elbeemmesh_vertices");
- for(i=0; i<dlm->totvert; i++) {
- VECCOPY( &verts[i*3], dlm->mvert[i].co);
+
+ mvert = dm->getVertArray(dm);
+ mface = dm->getFaceArray(dm);
+ totvert = dm->getNumVerts(dm);
+ totface = dm->getNumFaces(dm);
+
+ *numVertices = totvert;
+ verts = MEM_callocN( totvert*3*sizeof(float), "elbeemmesh_vertices");
+ for(i=0; i<totvert; i++) {
+ VECCOPY( &verts[i*3], mvert[i].co);
if(useGlobalCoords) { Mat4MulVecfl(ob->obmat, &verts[i*3]); }
}
*vertices = verts;
- for(i=0; i<dlm->totface; i++) {
+ for(i=0; i<totface; i++) {
countTris++;
if(mface[i].v4) { countTris++; }
}
*numTriangles = countTris;
tris = MEM_callocN( countTris*3*sizeof(int), "elbeemmesh_triangles");
countTris = 0;
- for(i=0; i<dlm->totface; i++) {
+ for(i=0; i<totface; i++) {
int face[4];
face[0] = mface[i].v1;
face[1] = mface[i].v2;
@@ -3703,7 +2497,6 @@ void initElbeemMesh(struct Object *ob,
}
*triangles = tris;
- if(dlm) displistmesh_free(dlm);
dm->release(dm);
}
@@ -3735,14 +2528,16 @@ Mesh* readBobjgz(char *filename, Mesh *orgmesh, float* bbstart, float *bbsize) /
newmesh->mvert= NULL;
newmesh->medge= NULL;
newmesh->mface= NULL;
- newmesh->tface= NULL;
- newmesh->dface= NULL;
+ newmesh->mtface= NULL;
newmesh->dvert = NULL;
newmesh->mcol= NULL;
newmesh->msticky= NULL;
newmesh->texcomesh= NULL;
+ memset(&newmesh->vdata, 0, sizeof(newmesh->vdata));
+ memset(&newmesh->edata, 0, sizeof(newmesh->edata));
+ memset(&newmesh->fdata, 0, sizeof(newmesh->fdata));
newmesh->key= NULL;
newmesh->totface = 0;
@@ -3764,7 +2559,7 @@ Mesh* readBobjgz(char *filename, Mesh *orgmesh, float* bbstart, float *bbsize) /
//if(sizeof(wri)!=4) { snprintf(debugStrBuffer,256,"Reading GZ_BOBJ, Invalid int size %d...\n", wri); return NULL; } // paranoia check
gotBytes = gzread(gzf, &wri, sizeof(wri));
newmesh->totvert = wri;
- newmesh->mvert = MEM_callocN(sizeof(MVert)*newmesh->totvert, "fluidsimDerivedMesh_bobjvertices");
+ newmesh->mvert = CustomData_add_layer(&newmesh->vdata, CD_MVERT, 0, NULL, newmesh->totvert);
if(debugBobjRead){ snprintf(debugStrBuffer,256,"#vertices %d ", newmesh->totvert); elbeemDebugOut(debugStrBuffer); } //DEBUG
for(i=0; i<newmesh->totvert;i++) {
//if(debugBobjRead) snprintf(debugStrBuffer,256,"V %d = ",i);
@@ -3780,7 +2575,7 @@ Mesh* readBobjgz(char *filename, Mesh *orgmesh, float* bbstart, float *bbsize) /
gotBytes = gzread(gzf, &wri, sizeof(wri));
if(wri != newmesh->totvert) {
// complain #vertices has to be equal to #normals, reset&abort
- MEM_freeN(newmesh->mvert);
+ CustomData_free_layer(&newmesh->vdata, CD_MVERT, newmesh->totvert);
MEM_freeN(newmesh);
snprintf(debugStrBuffer,256,"Reading GZ_BOBJ, #normals=%d, #vertices=%d, aborting...\n", wri,newmesh->totvert );
return NULL;
@@ -3800,7 +2595,7 @@ Mesh* readBobjgz(char *filename, Mesh *orgmesh, float* bbstart, float *bbsize) /
/* compute no. of triangles */
gotBytes = gzread(gzf, &wri, sizeof(wri));
newmesh->totface = wri;
- newmesh->mface = MEM_callocN(sizeof(MFace)*newmesh->totface, "fluidsimDerivedMesh_bobjfaces");
+ newmesh->mface = CustomData_add_layer(&newmesh->fdata, CD_MFACE, 0, NULL, newmesh->totface);
if(debugBobjRead){ snprintf(debugStrBuffer,256,"#faces %d ", newmesh->totface); elbeemDebugOut(debugStrBuffer); } //DEBUG
fsface = newmesh->mface;
for(i=0; i<newmesh->totface; i++) {
@@ -3925,9 +2720,9 @@ void loadFluidsimMesh(Object *srcob, int useRenderParams)
Mesh *freeFsMesh = srcob->fluidsimSettings->meshSurface;
// similar to free_mesh(...) , but no things like unlink...
- if(freeFsMesh->mvert){ MEM_freeN(freeFsMesh->mvert); freeFsMesh->mvert=NULL; }
- if(freeFsMesh->medge){ MEM_freeN(freeFsMesh->medge); freeFsMesh->medge=NULL; }
- if(freeFsMesh->mface){ MEM_freeN(freeFsMesh->mface); freeFsMesh->mface=NULL; }
+ CustomData_free(&freeFsMesh->vdata, freeFsMesh->totvert);
+ CustomData_free(&freeFsMesh->edata, freeFsMesh->totedge);
+ CustomData_free(&freeFsMesh->fdata, freeFsMesh->totface);
MEM_freeN(freeFsMesh);
if(srcob->data == srcob->fluidsimSettings->meshSurface)
@@ -4067,13 +2862,13 @@ void fluidsimGetAxisAlignedBB(struct Mesh *mesh, float obmat[][4],
else { newmesh = *bbmesh; }
newmesh->totvert = 8;
- if(!newmesh->mvert) newmesh->mvert = MEM_callocN(sizeof(MVert)*newmesh->totvert, "fluidsimBBMesh_bobjvertices");
+ if(!newmesh->mvert) newmesh->mvert = CustomData_add_layer(&newmesh->vdata, CD_MVERT, 0, NULL, newmesh->totvert);
for(i=0; i<8; i++) {
for(j=0; j<3; j++) newmesh->mvert[i].co[j] = start[j];
}
newmesh->totface = 6;
- if(!newmesh->mface) newmesh->mface = MEM_callocN(sizeof(MFace)*newmesh->totface, "fluidsimBBMesh_bobjfaces");
+ if(!newmesh->mface) newmesh->mface = CustomData_add_layer(&newmesh->fdata, CD_MFACE, 0, NULL, newmesh->totface);
*bbmesh = newmesh;
}
diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c
index 4d58e2b46b6..162cca32b72 100644
--- a/source/blender/blenkernel/intern/anim.c
+++ b/source/blender/blenkernel/intern/anim.c
@@ -403,7 +403,6 @@ static void vertex_duplilist(ListBase *lb, Scene *sce, Object *par)
Base *base;
float vec[3], no[3], pmat[4][4];
int lay, totvert, a;
- int dmNeedsFree;
DerivedMesh *dm;
Mat4CpyMat4(pmat, par->obmat);
@@ -411,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(&dmNeedsFree);
+ dm= editmesh_get_derived_cage();
else
- dm = mesh_get_derived_deform(par, &dmNeedsFree);
+ dm = mesh_get_derived_deform(par);
totvert = dm->getNumVerts(dm);
@@ -455,8 +454,7 @@ static void vertex_duplilist(ListBase *lb, Scene *sce, Object *par)
base= base->next;
}
- if (dmNeedsFree)
- dm->release(dm);
+ dm->release(dm);
}
static void particle_duplilist(ListBase *lb, Scene *sce, Object *par, PartEff *paf)
diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c
index 21f833fb32f..7fb3f9a260b 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -699,7 +699,7 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
}
/* if we have a DerivedMesh, only use dverts if it has them */
if(dm)
- if(dm->getVertData(dm, 0, LAYERTYPE_MDEFORMVERT))
+ if(dm->getVertData(dm, 0, CD_MDEFORMVERT))
use_dverts = 1;
else use_dverts = 0;
else if(dverts) use_dverts = 1;
@@ -734,7 +734,7 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
Mat4MulVecfl(premat, co);
if(use_dverts || armature_def_nr >= 0) {
- if(dm) dvert = dm->getVertData(dm, i, LAYERTYPE_MDEFORMVERT);
+ if(dm) dvert = dm->getVertData(dm, i, CD_MDEFORMVERT);
else if(i < target_totvert) dvert = dverts + i;
else dvert = NULL;
} else
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index faa20180290..78ee6bb40e2 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -40,6 +40,7 @@
#include "BKE_customdata.h"
#include "BKE_DerivedMesh.h"
#include "BKE_displist.h"
+#include "BKE_global.h"
#include "BKE_mesh.h"
#include "BKE_utildefines.h"
@@ -51,212 +52,138 @@
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
#include "MEM_guardedalloc.h"
#include <string.h>
#include <limits.h>
+typedef struct {
+ DerivedMesh dm;
+
+ /* these point to data in the DerivedMesh custom data layers,
+ they are only here for efficiency and convenience **/
+ MVert *mvert;
+ MEdge *medge;
+ MFace *mface;
+} CDDerivedMesh;
/**************** DerivedMesh interface functions ****************/
static int cdDM_getNumVerts(DerivedMesh *dm)
{
- return dm->vertData.numElems;
+ return dm->numVertData;
}
-static int cdDM_getNumFaces(DerivedMesh *dm)
+static int cdDM_getNumEdges(DerivedMesh *dm)
{
- return dm->faceData.numElems;
+ return dm->numEdgeData;
}
-static int cdDM_getNumEdges(DerivedMesh *dm)
+static int cdDM_getNumFaces(DerivedMesh *dm)
{
- return dm->edgeData.numElems;
+ return dm->numFaceData;
}
static void cdDM_getVert(DerivedMesh *dm, int index, MVert *vert_r)
{
- *vert_r = *CDDM_get_vert(dm, index);
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ *vert_r = cddm->mvert[index];
}
static void cdDM_getEdge(DerivedMesh *dm, int index, MEdge *edge_r)
{
- *edge_r = *CDDM_get_edge(dm, index);
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ *edge_r = cddm->medge[index];
}
static void cdDM_getFace(DerivedMesh *dm, int index, MFace *face_r)
{
- *face_r = *CDDM_get_face(dm, index);
-}
-
-static void cdDM_getVertArray(DerivedMesh *dm, MVert *vert_r)
-{
- memcpy(vert_r, CDDM_get_verts(dm), sizeof(*vert_r) * dm->getNumVerts(dm));
-}
-
-static void cdDM_getEdgeArray(DerivedMesh *dm, MEdge *edge_r)
-{
- memcpy(edge_r, CDDM_get_edges(dm), sizeof(*edge_r) * dm->getNumEdges(dm));
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ *face_r = cddm->mface[index];
}
-static void cdDM_getFaceArray(DerivedMesh *dm, MFace *face_r)
+static void cdDM_copyVertArray(DerivedMesh *dm, MVert *vert_r)
{
- memcpy(face_r, CDDM_get_faces(dm), sizeof(*face_r) * dm->getNumFaces(dm));
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ memcpy(vert_r, cddm->mvert, sizeof(*vert_r) * dm->numVertData);
}
-static void cdDM_foreachMappedVert(
- DerivedMesh *dm,
- void (*func)(void *userData, int index, float *co,
- float *no_f, short *no_s),
- void *userData)
+static void cdDM_copyEdgeArray(DerivedMesh *dm, MEdge *edge_r)
{
- int i;
- int maxVerts = dm->getNumVerts(dm);
- MVert *mv = CDDM_get_verts(dm);
- int *index = DM_get_vert_data_layer(dm, LAYERTYPE_ORIGINDEX);
-
- for(i = 0; i < maxVerts; i++, mv++, index++) {
- if(*index == ORIGINDEX_NONE) continue;
-
- func(userData, *index, mv->co, NULL, mv->no);
- }
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ memcpy(edge_r, cddm->medge, sizeof(*edge_r) * dm->numEdgeData);
}
-static void cdDM_foreachMappedEdge(
- DerivedMesh *dm,
- void (*func)(void *userData, int index,
- float *v0co, float *v1co),
- void *userData)
+void cdDM_copyFaceArray(DerivedMesh *dm, MFace *face_r)
{
- int i;
- int maxEdges = dm->getNumEdges(dm);
- MEdge *med = CDDM_get_edges(dm);
- MVert *mv = CDDM_get_verts(dm);
- int *index = DM_get_edge_data_layer(dm, LAYERTYPE_ORIGINDEX);
-
- for(i = 0; i < maxEdges; i++, med++, index++) {
- if(*index == ORIGINDEX_NONE) continue;
-
- func(userData, *index, mv[med->v1].co, mv[med->v2].co);
- }
-}
-
-static void cdDM_foreachMappedFaceCenter(
- DerivedMesh *dm,
- void (*func)(void *userData, int index,
- float *cent, float *no),
- void *userData)
-{
- int i;
- int maxFaces = dm->getNumFaces(dm);
- MFace *mf = CDDM_get_faces(dm);
- MVert *mv = CDDM_get_verts(dm);
- int *index = DM_get_face_data_layer(dm, LAYERTYPE_ORIGINDEX);
-
- for(i = 0; i < maxFaces; i++, mf++, index++) {
- float cent[3];
- float no[3];
-
- if(*index == ORIGINDEX_NONE) continue;
-
- VECCOPY(cent, mv[mf->v1].co);
- VecAddf(cent, cent, mv[mf->v2].co);
- VecAddf(cent, cent, mv[mf->v3].co);
-
- if (mf->v4) {
- CalcNormFloat4(mv[mf->v1].co, mv[mf->v2].co,
- mv[mf->v3].co, mv[mf->v4].co, no);
- VecAddf(cent, cent, mv[mf->v4].co);
- VecMulf(cent, 0.25f);
- } else {
- CalcNormFloat(mv[mf->v1].co, mv[mf->v2].co,
- mv[mf->v3].co, no);
- VecMulf(cent, 0.33333333333f);
- }
-
- func(userData, *index, cent, no);
- }
-}
-
-static DispListMesh *cdDM_convertToDispListMesh(DerivedMesh *dm,
- int allowShared)
-{
- DispListMesh *dlm = MEM_callocN(sizeof(*dlm),
- "cdDM_convertToDispListMesh dlm");
-
- dlm->totvert = dm->vertData.numElems;
- dlm->totedge = dm->edgeData.numElems;
- dlm->totface = dm->faceData.numElems;
- dlm->mvert = dm->dupVertArray(dm);
- dlm->medge = dm->dupEdgeArray(dm);
- dlm->mface = dm->dupFaceArray(dm);
-
- dlm->tface = dm->getFaceDataArray(dm, LAYERTYPE_TFACE);
- if(dlm->tface)
- dlm->tface = MEM_dupallocN(dlm->tface);
-
- dlm->mcol = dm->getFaceDataArray(dm, LAYERTYPE_MCOL);
- if(dlm->mcol)
- dlm->mcol = MEM_dupallocN(dlm->mcol);
-
- dlm->nors = NULL;
- dlm->dontFreeVerts = dlm->dontFreeOther = dlm->dontFreeNors = 0;
-
- return dlm;
+ CDDerivedMesh *cddm = (CDDerivedMesh *)dm;
+ memcpy(face_r, cddm->mface, sizeof(*face_r) * dm->numFaceData);
}
static void cdDM_getMinMax(DerivedMesh *dm, float min_r[3], float max_r[3])
{
+ CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
int i;
- for(i = 0; i < dm->vertData.numElems; i++) {
- DO_MINMAX(CDDM_get_vert(dm, i)->co, min_r, max_r);
+ if (dm->numVertData) {
+ for (i=0; i<dm->numVertData; i++) {
+ DO_MINMAX(cddm->mvert[i].co, min_r, max_r);
+ }
+ } else {
+ min_r[0] = min_r[1] = min_r[2] = max_r[0] = max_r[1] = max_r[2] = 0.0;
}
}
static void cdDM_getVertCo(DerivedMesh *dm, int index, float co_r[3])
{
- VECCOPY(co_r, CDDM_get_vert(dm, index)->co);
+ CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
+
+ VECCOPY(co_r, cddm->mvert[index].co);
}
static void cdDM_getVertCos(DerivedMesh *dm, float (*cos_r)[3])
{
- int i;
MVert *mv = CDDM_get_verts(dm);
+ int i;
- for(i = 0; i < dm->vertData.numElems; i++, mv++)
+ for(i = 0; i < dm->numVertData; i++, mv++)
VECCOPY(cos_r[i], mv->co);
}
static void cdDM_getVertNo(DerivedMesh *dm, int index, float no_r[3])
{
- short *no = CDDM_get_vert(dm, index)->no;
+ CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
+ short *no = cddm->mvert[index].no;
- no_r[0] = no[0] / 32767.f;
- no_r[1] = no[1] / 32767.f;
- no_r[2] = no[2] / 32767.f;
+ no_r[0] = no[0]/32767.f;
+ no_r[1] = no[1]/32767.f;
+ no_r[2] = no[2]/32767.f;
}
static void cdDM_drawVerts(DerivedMesh *dm)
{
+ CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
+ MVert *mv = cddm->mvert;
int i;
- MVert *mv = CDDM_get_verts(dm);
glBegin(GL_POINTS);
- for(i = 0; i < dm->vertData.numElems; i++, mv++)
+ for(i = 0; i < dm->numVertData; i++, mv++)
glVertex3fv(mv->co);
glEnd();
}
static void cdDM_drawUVEdges(DerivedMesh *dm)
{
+ CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
+ MTFace *tf = DM_get_face_data_layer(dm, CD_MTFACE);
+ MFace *mf = cddm->mface;
int i;
- TFace *tf = DM_get_face_data_layer(dm, LAYERTYPE_TFACE);
- MFace *mf = CDDM_get_faces(dm);
if(tf) {
glBegin(GL_LINES);
- for(i = 0; i < dm->faceData.numElems; i++, tf++, mf++) {
+ for(i = 0; i < dm->numFaceData; i++, tf++, mf++) {
if(!(tf->flag&TF_HIDE)) {
glVertex2fv(tf->uv[0]);
glVertex2fv(tf->uv[1]);
@@ -282,12 +209,13 @@ static void cdDM_drawUVEdges(DerivedMesh *dm)
static void cdDM_drawEdges(DerivedMesh *dm, int drawLooseEdges)
{
+ CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
+ MVert *mvert = cddm->mvert;
+ MEdge *medge = cddm->medge;
int i;
- MEdge *medge = CDDM_get_edges(dm);
- MVert *mvert = CDDM_get_verts(dm);
glBegin(GL_LINES);
- for(i = 0; i < dm->edgeData.numElems; i++, medge++) {
+ for(i = 0; i < dm->numEdgeData; i++, medge++) {
if((medge->flag&ME_EDGEDRAW)
&& (drawLooseEdges || !(medge->flag&ME_LOOSEEDGE))) {
glVertex3fv(mvert[medge->v1].co);
@@ -299,12 +227,13 @@ static void cdDM_drawEdges(DerivedMesh *dm, int drawLooseEdges)
static void cdDM_drawLooseEdges(DerivedMesh *dm)
{
- MEdge *medge = CDDM_get_edges(dm);
- MVert *mvert = CDDM_get_verts(dm);
+ CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
+ MVert *mvert = cddm->mvert;
+ MEdge *medge = cddm->medge;
int i;
glBegin(GL_LINES);
- for(i = 0; i < dm->edgeData.numElems; i++, medge++) {
+ for(i = 0; i < dm->numEdgeData; i++, medge++) {
if(medge->flag&ME_LOOSEEDGE) {
glVertex3fv(mvert[medge->v1].co);
glVertex3fv(mvert[medge->v2].co);
@@ -315,10 +244,11 @@ static void cdDM_drawLooseEdges(DerivedMesh *dm)
static void cdDM_drawFacesSolid(DerivedMesh *dm, int (*setMaterial)(int))
{
- int a;
- int glmode = -1, shademodel = -1, matnr = -1, drawCurrentMat = 1;
- MFace *mface = CDDM_get_faces(dm);
- MVert *mvert = CDDM_get_verts(dm);
+ CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
+ MVert *mvert = cddm->mvert;
+ MFace *mface = cddm->mface;
+ float *nors= dm->getFaceDataArray(dm, CD_NORMAL);
+ int a, glmode = -1, shademodel = -1, matnr = -1, drawCurrentMat = 1;
#define PASSVERT(index) { \
if(shademodel == GL_SMOOTH) { \
@@ -329,7 +259,7 @@ static void cdDM_drawFacesSolid(DerivedMesh *dm, int (*setMaterial)(int))
}
glBegin(glmode = GL_QUADS);
- for(a = 0; a < dm->faceData.numElems; a++, mface++) {
+ for(a = 0; a < dm->numFaceData; a++, mface++) {
int new_glmode, new_matnr, new_shademodel;
new_glmode = mface->v4?GL_QUADS:GL_TRIANGLES;
@@ -347,18 +277,24 @@ static void cdDM_drawFacesSolid(DerivedMesh *dm, int (*setMaterial)(int))
}
if(drawCurrentMat) {
- /* TODO make this better (cache facenormals as layer?) */
if(shademodel == GL_FLAT) {
- float nor[3];
- if(mface->v4) {
- CalcNormFloat4(mvert[mface->v1].co, mvert[mface->v2].co,
- mvert[mface->v3].co, mvert[mface->v4].co,
- nor);
- } else {
- CalcNormFloat(mvert[mface->v1].co, mvert[mface->v2].co,
- mvert[mface->v3].co, nor);
+ if (nors) {
+ glNormal3fv(nors);
+ nors += 3;
+ }
+ else {
+ /* TODO make this better (cache facenormals as layer?) */
+ float nor[3];
+ if(mface->v4) {
+ CalcNormFloat4(mvert[mface->v1].co, mvert[mface->v2].co,
+ mvert[mface->v3].co, mvert[mface->v4].co,
+ nor);
+ } else {
+ CalcNormFloat(mvert[mface->v1].co, mvert[mface->v2].co,
+ mvert[mface->v3].co, nor);
+ }
+ glNormal3fv(nor);
}
- glNormal3fv(nor);
}
PASSVERT(mface->v1);
@@ -377,10 +313,11 @@ static void cdDM_drawFacesSolid(DerivedMesh *dm, int (*setMaterial)(int))
static void cdDM_drawFacesColored(DerivedMesh *dm, int useTwoSided, unsigned char *col1, unsigned char *col2)
{
+ CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
int a, glmode;
unsigned char *cp1, *cp2;
- MFace *mface = CDDM_get_faces(dm);
- MVert *mvert = CDDM_get_verts(dm);
+ MVert *mvert = cddm->mvert;
+ MFace *mface = cddm->mface;
cp1 = col1;
if(col2) {
@@ -398,7 +335,7 @@ static void cdDM_drawFacesColored(DerivedMesh *dm, int useTwoSided, unsigned cha
glShadeModel(GL_SMOOTH);
glBegin(glmode = GL_QUADS);
- for(a = 0; a < dm->faceData.numElems; a++, mface++, cp1 += 16) {
+ for(a = 0; a < dm->numFaceData; a++, mface++, cp1 += 16) {
int new_glmode = mface->v4?GL_QUADS:GL_TRIANGLES;
if(new_glmode != glmode) {
@@ -438,50 +375,59 @@ static void cdDM_drawFacesColored(DerivedMesh *dm, int useTwoSided, unsigned cha
}
static void cdDM_drawFacesTex_common(DerivedMesh *dm,
- int (*drawParams)(TFace *tface, int matnr),
+ int (*drawParams)(MTFace *tface, MCol *mcol, int matnr),
int (*drawParamsMapped)(void *userData, int index),
void *userData)
{
- int i;
- MFace *mf = CDDM_get_faces(dm);
- TFace *tf = DM_get_face_data_layer(dm, LAYERTYPE_TFACE);
- MVert *mv = CDDM_get_verts(dm);
- int *index = DM_get_face_data_layer(dm, LAYERTYPE_ORIGINDEX);
-
- for(i = 0; i < dm->faceData.numElems; i++, mf++, index++) {
+ CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
+ MVert *mv = cddm->mvert;
+ MFace *mf = cddm->mface;
+ MCol *mcol = dm->getFaceDataArray(dm, CD_MCOL);
+ float *nors= dm->getFaceDataArray(dm, CD_NORMAL);
+ MTFace *tf = DM_get_face_data_layer(dm, CD_MTFACE);
+ int i, orig, *index = DM_get_face_data_layer(dm, CD_ORIGINDEX);
+
+ for(i = 0; i < dm->numFaceData; i++, mf++) {
MVert *mvert;
int flag;
unsigned char *cp = NULL;
- if(drawParams)
- if(tf) flag = drawParams(&tf[i], mf->mat_nr);
- else flag = drawParams(NULL, mf->mat_nr);
- else if(*index != ORIGINDEX_NONE)
- flag = drawParamsMapped(userData, *index);
- else
- flag = 0;
-
- if(flag == 0) {
- continue;
- } else if(flag == 1) {
- if(tf) {
- cp = (unsigned char *)tf[i].col;
- } else {
- cp = DM_get_face_data(dm, i, LAYERTYPE_MCOL);
+ if(drawParams) {
+ flag = drawParams(tf? &tf[i]: NULL, mcol? &mcol[i*4]: NULL, mf->mat_nr);
+ }
+ else {
+ if(index) {
+ orig = *index++;
+ if(orig == ORIGINDEX_NONE) continue;
+ flag = drawParamsMapped(userData, orig);
}
+ else
+ flag = drawParamsMapped(userData, i);
}
- /* TODO make this better (cache facenormals as layer?) */
+ if(flag == 0)
+ continue;
+ else if (flag==1 && mcol)
+ cp= (unsigned char*) &mcol[i*4];
+
if(!(mf->flag&ME_SMOOTH)) {
- float nor[3];
- if(mf->v4) {
- CalcNormFloat4(mv[mf->v1].co, mv[mf->v2].co,
- mv[mf->v3].co, mv[mf->v4].co, nor);
- } else {
- CalcNormFloat(mv[mf->v1].co, mv[mf->v2].co,
- mv[mf->v3].co, nor);
+ if (nors) {
+ glNormal3fv(nors);
+ nors += 3;
+ }
+ else {
+ /* TODO make this better (cache facenormals as layer?) */
+ float nor[3];
+ if(mf->v4) {
+ CalcNormFloat4(mv[mf->v1].co, mv[mf->v2].co,
+ mv[mf->v3].co, mv[mf->v4].co,
+ nor);
+ } else {
+ CalcNormFloat(mv[mf->v1].co, mv[mf->v2].co,
+ mv[mf->v3].co, nor);
+ }
+ glNormal3fv(nor);
}
- glNormal3fv(nor);
}
glBegin(mf->v4?GL_QUADS:GL_TRIANGLES);
@@ -514,50 +460,57 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm,
}
}
-static void cdDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(TFace *tface, int matnr))
+static void cdDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace *tface, MCol *mcol, int matnr))
{
cdDM_drawFacesTex_common(dm, setDrawOptions, NULL, NULL);
}
static void cdDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int useColors)
{
- int i;
- MFace *mf = CDDM_get_faces(dm);
- MVert *mv = CDDM_get_verts(dm);
- int *index = DM_get_face_data_layer(dm, LAYERTYPE_ORIGINDEX);
- TFace *tf = DM_get_face_data_layer(dm, LAYERTYPE_TFACE);
- MCol *mc = DM_get_face_data_layer(dm, LAYERTYPE_MCOL);
-
- for(i = 0; i < dm->faceData.numElems; i++, mf++, index++) {
+ CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
+ MVert *mv = cddm->mvert;
+ MFace *mf = cddm->mface;
+ MCol *mc = DM_get_face_data_layer(dm, CD_MCOL);
+ float *nors= dm->getFaceDataArray(dm, CD_NORMAL);
+ int i, orig, *index = DM_get_face_data_layer(dm, CD_ORIGINDEX);
+
+ for(i = 0; i < dm->numFaceData; i++, mf++) {
int drawSmooth = (mf->flag & ME_SMOOTH);
- if(setDrawOptions && *index == ORIGINDEX_NONE) continue;
+ if(index) {
+ orig = *index++;
+ if(setDrawOptions && orig == ORIGINDEX_NONE) continue;
+ }
+ else
+ orig = i;
- if(!setDrawOptions || setDrawOptions(userData, *index, &drawSmooth)) {
+ if(!setDrawOptions || setDrawOptions(userData, orig, &drawSmooth)) {
unsigned char *cp = NULL;
- if(useColors) {
- if(tf) {
- cp = (unsigned char *)tf[i].col;
- } else if(mc) {
- cp = (unsigned char *)&mc[i * 4];
- }
- }
+ if(useColors && mc)
+ cp = (unsigned char *)&mc[i * 4];
glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
glBegin(mf->v4?GL_QUADS:GL_TRIANGLES);
- if(!drawSmooth) {
- /* TODO make this better (cache facenormals as layer?) */
- float nor[3];
- if(mf->v4) {
- CalcNormFloat4(mv[mf->v1].co, mv[mf->v2].co,
- mv[mf->v3].co, mv[mf->v4].co, nor);
- } else {
- CalcNormFloat(mv[mf->v1].co, mv[mf->v2].co,
- mv[mf->v3].co, nor);
+ if (!drawSmooth) {
+ if (nors) {
+ glNormal3fv(nors);
+ nors += 3;
+ }
+ else {
+ /* TODO make this better (cache facenormals as layer?) */
+ float nor[3];
+ if(mf->v4) {
+ CalcNormFloat4(mv[mf->v1].co, mv[mf->v2].co,
+ mv[mf->v3].co, mv[mf->v4].co,
+ nor);
+ } else {
+ CalcNormFloat(mv[mf->v1].co, mv[mf->v2].co,
+ mv[mf->v3].co, nor);
+ }
+ glNormal3fv(nor);
}
- glNormal3fv(nor);
if(cp) glColor3ub(cp[3], cp[2], cp[1]);
glVertex3fv(mv[mf->v1].co);
@@ -598,17 +551,21 @@ static void cdDM_drawMappedFacesTex(DerivedMesh *dm, int (*setDrawOptions)(void
static void cdDM_drawMappedEdges(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index), void *userData)
{
- int i;
- int *index = DM_get_edge_data_layer(dm, LAYERTYPE_ORIGINDEX);
- MEdge *edge = CDDM_get_edges(dm);
- MVert *vert = CDDM_get_verts(dm);
+ CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
+ MVert *vert = cddm->mvert;
+ MEdge *edge = cddm->medge;
+ int i, orig, *index = DM_get_edge_data_layer(dm, CD_ORIGINDEX);
glBegin(GL_LINES);
- for(i = 0; i < dm->edgeData.numElems; i++, edge++, index++) {
-
- if(setDrawOptions && *index == ORIGINDEX_NONE) continue;
+ for(i = 0; i < dm->numEdgeData; i++, edge++) {
+ if(index) {
+ orig = *index++;
+ if(setDrawOptions && orig == ORIGINDEX_NONE) continue;
+ }
+ else
+ orig = i;
- if(!setDrawOptions || setDrawOptions(userData, *index)) {
+ if(!setDrawOptions || setDrawOptions(userData, orig)) {
glVertex3fv(vert[edge->v1].co);
glVertex3fv(vert[edge->v2].co);
}
@@ -616,27 +573,108 @@ static void cdDM_drawMappedEdges(DerivedMesh *dm, int (*setDrawOptions)(void *us
glEnd();
}
-static void cdDM_release(DerivedMesh *dm)
+static void cdDM_foreachMappedVert(
+ DerivedMesh *dm,
+ void (*func)(void *userData, int index, float *co,
+ float *no_f, short *no_s),
+ void *userData)
{
- CustomData_free(&dm->vertData);
- CustomData_free(&dm->edgeData);
- CustomData_free(&dm->faceData);
+ MVert *mv = CDDM_get_verts(dm);
+ int i, orig, *index = DM_get_vert_data_layer(dm, CD_ORIGINDEX);
+
+ for(i = 0; i < dm->numVertData; i++, mv++) {
+ if(index) {
+ orig = *index++;
+ if(orig == ORIGINDEX_NONE) continue;
+ func(userData, orig, mv->co, NULL, mv->no);
+ }
+ else
+ func(userData, i, mv->co, NULL, mv->no);
+ }
+}
+
+static void cdDM_foreachMappedEdge(
+ DerivedMesh *dm,
+ void (*func)(void *userData, int index,
+ float *v0co, float *v1co),
+ void *userData)
+{
+ CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
+ MVert *mv = cddm->mvert;
+ MEdge *med = cddm->medge;
+ int i, orig, *index = DM_get_edge_data_layer(dm, CD_ORIGINDEX);
+
+ for(i = 0; i < dm->numEdgeData; i++, med++) {
+ if (index) {
+ orig = *index++;
+ if(orig == ORIGINDEX_NONE) continue;
+ func(userData, orig, mv[med->v1].co, mv[med->v2].co);
+ }
+ else
+ func(userData, i, mv[med->v1].co, mv[med->v2].co);
+ }
+}
+
+static void cdDM_foreachMappedFaceCenter(
+ DerivedMesh *dm,
+ void (*func)(void *userData, int index,
+ float *cent, float *no),
+ void *userData)
+{
+ CDDerivedMesh *cddm = (CDDerivedMesh*)dm;
+ MVert *mv = cddm->mvert;
+ MFace *mf = cddm->mface;
+ int i, orig, *index = DM_get_face_data_layer(dm, CD_ORIGINDEX);
+
+ for(i = 0; i < dm->numFaceData; i++, mf++) {
+ float cent[3];
+ float no[3];
+
+ if (index) {
+ orig = *index++;
+ if(orig == ORIGINDEX_NONE) continue;
+ }
+ else
+ orig = i;
+
+ VECCOPY(cent, mv[mf->v1].co);
+ VecAddf(cent, cent, mv[mf->v2].co);
+ VecAddf(cent, cent, mv[mf->v3].co);
+
+ if (mf->v4) {
+ CalcNormFloat4(mv[mf->v1].co, mv[mf->v2].co,
+ mv[mf->v3].co, mv[mf->v4].co, no);
+ VecAddf(cent, cent, mv[mf->v4].co);
+ VecMulf(cent, 0.25f);
+ } else {
+ CalcNormFloat(mv[mf->v1].co, mv[mf->v2].co,
+ mv[mf->v3].co, no);
+ VecMulf(cent, 0.33333333333f);
+ }
- MEM_freeN(dm);
+ func(userData, orig, cent, no);
+ }
}
+static void cdDM_release(DerivedMesh *dm)
+{
+ CDDerivedMesh *cddm = (CDDerivedMesh*)dm;
+
+ if (DM_release(dm))
+ MEM_freeN(cddm);
+}
/**************** CDDM interface functions ****************/
-static DerivedMesh *cdDM_create(const char *desc)
+static CDDerivedMesh *cdDM_create(const char *desc)
{
+ CDDerivedMesh *cddm;
DerivedMesh *dm;
- dm = MEM_callocN(sizeof(*dm), desc);
+ cddm = MEM_callocN(sizeof(*cddm), desc);
+ dm = &cddm->dm;
dm->getMinMax = cdDM_getMinMax;
- dm->convertToDispListMesh = cdDM_convertToDispListMesh;
-
dm->getNumVerts = cdDM_getNumVerts;
dm->getNumFaces = cdDM_getNumFaces;
dm->getNumEdges = cdDM_getNumEdges;
@@ -644,9 +682,9 @@ static DerivedMesh *cdDM_create(const char *desc)
dm->getVert = cdDM_getVert;
dm->getEdge = cdDM_getEdge;
dm->getFace = cdDM_getFace;
- dm->getVertArray = cdDM_getVertArray;
- dm->getEdgeArray = cdDM_getEdgeArray;
- dm->getFaceArray = cdDM_getFaceArray;
+ dm->copyVertArray = cdDM_copyVertArray;
+ dm->copyEdgeArray = cdDM_copyEdgeArray;
+ dm->copyFaceArray = cdDM_copyFaceArray;
dm->getVertData = DM_get_vert_data;
dm->getEdgeData = DM_get_edge_data;
dm->getFaceData = DM_get_face_data;
@@ -677,64 +715,61 @@ static DerivedMesh *cdDM_create(const char *desc)
dm->release = cdDM_release;
- return dm;
+ return cddm;
}
DerivedMesh *CDDM_new(int numVerts, int numEdges, int numFaces)
{
- DerivedMesh *dm = cdDM_create("CDDM_new dm");
+ CDDerivedMesh *cddm = cdDM_create("CDDM_new dm");
+ DerivedMesh *dm = &cddm->dm;
+
DM_init(dm, numVerts, numEdges, numFaces);
- CustomData_add_layer(&dm->vertData, LAYERTYPE_MVERT, LAYERFLAG_NOCOPY,
- NULL);
- CustomData_add_layer(&dm->edgeData, LAYERTYPE_MEDGE, LAYERFLAG_NOCOPY,
- NULL);
- CustomData_add_layer(&dm->faceData, LAYERTYPE_MFACE, LAYERFLAG_NOCOPY,
- NULL);
+ cddm->mvert = CustomData_add_layer(&dm->vertData, CD_MVERT, 0, 0, numVerts);
+ cddm->medge = CustomData_add_layer(&dm->edgeData, CD_MEDGE, 0, 0, numEdges);
+ cddm->mface = CustomData_add_layer(&dm->faceData, CD_MFACE, 0, 0, numFaces);
return dm;
}
-DerivedMesh *CDDM_from_mesh(Mesh *mesh)
+DerivedMesh *CDDM_from_mesh(Mesh *mesh, Object *ob)
{
- DerivedMesh *dm = CDDM_new(mesh->totvert, mesh->totedge, mesh->totface);
- int i;
-
- if(mesh->msticky)
- CustomData_add_layer(&dm->vertData, LAYERTYPE_MSTICKY, 0, NULL);
- if(mesh->dvert)
- CustomData_add_layer(&dm->vertData, LAYERTYPE_MDEFORMVERT, 0, NULL);
+ CDDerivedMesh *cddm = cdDM_create("CDDM_from_mesh dm");
+ DerivedMesh *dm = &cddm->dm;
+ int i, *index;
- if(mesh->tface)
- CustomData_add_layer(&dm->faceData, LAYERTYPE_TFACE, 0, NULL);
- if(mesh->mcol)
- CustomData_add_layer(&dm->faceData, LAYERTYPE_MCOL, 0, NULL);
+ /* this does a referenced copy, the only new layers being ORIGINDEX */
- for(i = 0; i < mesh->totvert; ++i) {
- DM_set_vert_data(dm, i, LAYERTYPE_MVERT, &mesh->mvert[i]);
- if(mesh->msticky)
- DM_set_vert_data(dm, i, LAYERTYPE_MSTICKY, &mesh->msticky[i]);
- if(mesh->dvert)
- DM_set_vert_data(dm, i, LAYERTYPE_MDEFORMVERT, &mesh->dvert[i]);
+ DM_init(dm, mesh->totvert, mesh->totedge, mesh->totface);
- DM_set_vert_data(dm, i, LAYERTYPE_ORIGINDEX, &i);
- }
+ CustomData_merge(&mesh->vdata, &dm->vertData, CD_MASK_MESH, CD_REFERENCE,
+ mesh->totvert);
+ CustomData_merge(&mesh->edata, &dm->edgeData, CD_MASK_MESH, CD_REFERENCE,
+ mesh->totedge);
+ CustomData_merge(&mesh->fdata, &dm->faceData, CD_MASK_MESH, CD_REFERENCE,
+ mesh->totface);
- for(i = 0; i < mesh->totedge; ++i) {
- DM_set_edge_data(dm, i, LAYERTYPE_MEDGE, &mesh->medge[i]);
+ cddm->mvert = CustomData_get_layer(&dm->vertData, CD_MVERT);
+ cddm->medge = CustomData_get_layer(&dm->edgeData, CD_MEDGE);
+ cddm->mface = CustomData_get_layer(&dm->faceData, CD_MFACE);
- DM_set_edge_data(dm, i, LAYERTYPE_ORIGINDEX, &i);
- }
+ index = CustomData_get_layer(&dm->vertData, CD_ORIGINDEX);
+ for(i = 0; i < mesh->totvert; ++i, ++index)
+ *index = i;
- for(i = 0; i < mesh->totface; ++i) {
- DM_set_face_data(dm, i, LAYERTYPE_MFACE, &mesh->mface[i]);
- if(mesh->tface)
- DM_set_face_data(dm, i, LAYERTYPE_TFACE, &mesh->tface[i]);
- if(mesh->mcol)
- DM_set_face_data(dm, i, LAYERTYPE_MCOL, &mesh->mcol[i * 4]);
+ index = CustomData_get_layer(&dm->edgeData, CD_ORIGINDEX);
+ for(i = 0; i < mesh->totedge; ++i, ++index)
+ *index = i;
- DM_set_face_data(dm, i, LAYERTYPE_ORIGINDEX, &i);
- }
+ index = CustomData_get_layer(&dm->faceData, CD_ORIGINDEX);
+ for(i = 0; i < mesh->totface; ++i, ++index)
+ *index = i;
+
+ /* works in conjunction with hack during modifier calc, where mcol is
+ temporarily replaced by weight paint colors */
+ if ((G.f & G_WEIGHTPAINT) &&
+ (ob && ob==(G.scene->basact?G.scene->basact->object:NULL)))
+ CustomData_duplicate_referenced_layer(&dm->faceData, CD_MCOL);
return dm;
}
@@ -744,29 +779,26 @@ DerivedMesh *CDDM_from_editmesh(EditMesh *em, Mesh *me)
DerivedMesh *dm = CDDM_new(BLI_countlist(&em->verts),
BLI_countlist(&em->edges),
BLI_countlist(&em->faces));
+ CDDerivedMesh *cddm = (CDDerivedMesh*)dm;
EditVert *eve;
EditEdge *eed;
EditFace *efa;
- MVert *mvert = CDDM_get_verts(dm);
- MEdge *medge = CDDM_get_edges(dm);
- MFace *mface = CDDM_get_faces(dm);
- int i, hassticky = 0, hasdvert = 0, hastface = 0, hasmcol = 0;
- int *index;
+ MVert *mvert = cddm->mvert;
+ MEdge *medge = cddm->medge;
+ MFace *mface = cddm->mface;
+ int i, *index;
+
+ CustomData_merge(&em->vdata, &dm->vertData, CD_MASK_DERIVEDMESH,
+ CD_CALLOC, dm->numVertData);
+ /* CustomData_merge(&em->edata, &dm->edgeData, CD_MASK_DERIVEDMESH,
+ CD_CALLOC, dm->numEdgeData); */
+ CustomData_merge(&em->fdata, &dm->faceData, CD_MASK_DERIVEDMESH,
+ CD_CALLOC, dm->numFaceData);
/* set eve->hash to vert index */
for(i = 0, eve = em->verts.first; eve; eve = eve->next, ++i)
eve->tmp.l = i;
- /* check for availability of layers */
- if(CustomData_has_layer(&em->vdata, LAYERTYPE_MSTICKY))
- hassticky= CustomData_add_layer(&dm->vertData, LAYERTYPE_MSTICKY, 0, NULL);
- if(CustomData_has_layer(&em->vdata, LAYERTYPE_MDEFORMVERT))
- hasdvert= CustomData_add_layer(&dm->vertData, LAYERTYPE_MDEFORMVERT, 0, NULL);
- if(CustomData_has_layer(&em->vdata, LAYERTYPE_TFACE))
- hastface= CustomData_add_layer(&dm->vertData, LAYERTYPE_TFACE, 0, NULL);
- if(CustomData_has_layer(&em->vdata, LAYERTYPE_MCOL))
- hasmcol= CustomData_add_layer(&dm->vertData, LAYERTYPE_MCOL, 0, NULL);
-
/* Need to be able to mark loose edges */
for(eed = em->edges.first; eed; eed = eed->next) {
eed->f2 = 0;
@@ -778,8 +810,8 @@ DerivedMesh *CDDM_from_editmesh(EditMesh *em, Mesh *me)
if(efa->e4) efa->e4->f2 = 1;
}
- index = dm->getVertDataArray(dm, LAYERTYPE_ORIGINDEX);
- for(i = 0, eve = em->verts.first; i < dm->vertData.numElems;
+ index = dm->getVertDataArray(dm, CD_ORIGINDEX);
+ for(i = 0, eve = em->verts.first; i < dm->numVertData;
i++, eve = eve->next, index++) {
MVert *mv = &mvert[i];
@@ -794,16 +826,11 @@ DerivedMesh *CDDM_from_editmesh(EditMesh *em, Mesh *me)
*index = i;
- if(hassticky)
- DM_set_vert_data(dm, i, LAYERTYPE_MSTICKY,
- CustomData_em_get(&em->vdata, eve->data, LAYERTYPE_MSTICKY));
- if(hasdvert)
- DM_set_vert_data(dm, i, LAYERTYPE_MDEFORMVERT,
- CustomData_em_get(&em->vdata, eve->data, LAYERTYPE_MDEFORMVERT));
+ CustomData_from_em_block(&em->vdata, &dm->vertData, eve->data, i);
}
- index = dm->getEdgeDataArray(dm, LAYERTYPE_ORIGINDEX);
- for(i = 0, eed = em->edges.first; i < dm->edgeData.numElems;
+ index = dm->getEdgeDataArray(dm, CD_ORIGINDEX);
+ for(i = 0, eed = em->edges.first; i < dm->numEdgeData;
i++, eed = eed->next, index++) {
MEdge *med = &medge[i];
@@ -817,10 +844,12 @@ DerivedMesh *CDDM_from_editmesh(EditMesh *em, Mesh *me)
if(!eed->f2) med->flag |= ME_LOOSEEDGE;
*index = i;
+
+ /* CustomData_from_em_block(&em->edata, &dm->edgeData, eed->data, i); */
}
- index = dm->getFaceDataArray(dm, LAYERTYPE_ORIGINDEX);
- for(i = 0, efa = em->faces.first; i < dm->faceData.numElems;
+ index = dm->getFaceDataArray(dm, CD_ORIGINDEX);
+ for(i = 0, efa = em->faces.first; i < dm->numFaceData;
i++, efa = efa->next, index++) {
MFace *mf = &mface[i];
@@ -830,16 +859,11 @@ DerivedMesh *CDDM_from_editmesh(EditMesh *em, Mesh *me)
mf->v4 = efa->v4 ? efa->v4->tmp.l : 0;
mf->mat_nr = efa->mat_nr;
mf->flag = efa->flag;
- test_index_face(mf, NULL, NULL, efa->v4?4:3);
*index = i;
- if(hastface)
- DM_set_face_data(dm, i, LAYERTYPE_TFACE,
- CustomData_em_get(&em->fdata, efa->data, LAYERTYPE_TFACE));
- if(hasmcol)
- DM_set_face_data(dm, i, LAYERTYPE_MCOL,
- CustomData_em_get(&em->fdata, efa->data, LAYERTYPE_MCOL));
+ CustomData_from_em_block(&em->fdata, &dm->faceData, efa->data, i);
+ test_index_face(mf, &dm->faceData, i, efa->v4?4:3);
}
return dm;
@@ -847,73 +871,104 @@ DerivedMesh *CDDM_from_editmesh(EditMesh *em, Mesh *me)
DerivedMesh *CDDM_copy(DerivedMesh *source)
{
- DerivedMesh *dest = CDDM_from_template(source,
- source->vertData.numElems,
- source->edgeData.numElems,
- source->faceData.numElems);
-
- CustomData_copy_data(&source->vertData, &dest->vertData, 0, 0,
- source->vertData.numElems);
- CustomData_copy_data(&source->edgeData, &dest->edgeData, 0, 0,
- source->edgeData.numElems);
- CustomData_copy_data(&source->faceData, &dest->faceData, 0, 0,
- source->faceData.numElems);
-
- /* copy vert/face/edge data from source */
- source->getVertArray(source, CDDM_get_verts(dest));
- source->getEdgeArray(source, CDDM_get_edges(dest));
- source->getFaceArray(source, CDDM_get_faces(dest));
-
- return dest;
+ CDDerivedMesh *cddm = cdDM_create("CDDM_copy cddm");
+ DerivedMesh *dm = &cddm->dm;
+ int numVerts = source->numVertData;
+ int numEdges = source->numEdgeData;
+ int numFaces = source->numFaceData;
+
+ /* this initializes dm, and copies all non mvert/medge/mface layers */
+ DM_from_template(dm, source, numVerts, numEdges, numFaces);
+
+ CustomData_copy_data(&source->vertData, &dm->vertData, 0, 0, numVerts);
+ CustomData_copy_data(&source->edgeData, &dm->edgeData, 0, 0, numEdges);
+ CustomData_copy_data(&source->faceData, &dm->faceData, 0, 0, numFaces);
+
+ /* now add mvert/medge/mface layers */
+ cddm->mvert = source->dupVertArray(source);
+ cddm->medge = source->dupEdgeArray(source);
+ cddm->mface = source->dupFaceArray(source);
+
+ CustomData_add_layer(&dm->vertData, CD_MVERT, 0, cddm->mvert, numVerts);
+ CustomData_add_layer(&dm->edgeData, CD_MEDGE, 0, cddm->medge, numEdges);
+ CustomData_add_layer(&dm->faceData, CD_MFACE, 0, cddm->mface, numFaces);
+
+ return dm;
}
DerivedMesh *CDDM_from_template(DerivedMesh *source,
int numVerts, int numEdges, int numFaces)
{
- DerivedMesh *dest = cdDM_create("CDDM_from_template dest");
- DM_from_template(dest, source, numVerts, numEdges, numFaces);
-
- /* if no vert/face/edge layers in custom data, add them */
- if(!CDDM_get_verts(dest))
- CustomData_add_layer(&dest->vertData, LAYERTYPE_MVERT,
- LAYERFLAG_NOCOPY, NULL);
- if(!CDDM_get_edges(dest))
- CustomData_add_layer(&dest->edgeData, LAYERTYPE_MEDGE,
- LAYERFLAG_NOCOPY, NULL);
- if(!CDDM_get_faces(dest))
- CustomData_add_layer(&dest->faceData, LAYERTYPE_MFACE,
- LAYERFLAG_NOCOPY, NULL);
-
- return dest;
+ CDDerivedMesh *cddm = cdDM_create("CDDM_from_template dest");
+ DerivedMesh *dm = &cddm->dm;
+
+ /* this does a copy of all non mvert/medge/mface layers */
+ DM_from_template(dm, source, numVerts, numEdges, numFaces);
+
+ /* now add mvert/medge/mface layers */
+ cddm->mvert = CustomData_add_layer(&dm->vertData, CD_MVERT, 0, 0, numVerts);
+ cddm->medge = CustomData_add_layer(&dm->edgeData, CD_MEDGE, 0, 0, numEdges);
+ cddm->mface = CustomData_add_layer(&dm->faceData, CD_MFACE, 0, 0, numFaces);
+
+ return dm;
}
void CDDM_apply_vert_coords(DerivedMesh *dm, float (*vertCoords)[3])
{
+ CDDerivedMesh *cddm = (CDDerivedMesh*)dm;
+ MVert *vert;
int i;
- MVert *vert = CDDM_get_verts(dm);
- for(i = 0; i < dm->vertData.numElems; ++i, ++vert)
+ /* this will just return the pointer if it wasn't a referenced layer */
+ vert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT);
+ cddm->mvert = vert;
+
+ for(i = 0; i < dm->numVertData; ++i, ++vert)
VECCOPY(vert->co, vertCoords[i]);
}
+void CDDM_apply_vert_normals(DerivedMesh *dm, short (*vertNormals)[3])
+{
+ CDDerivedMesh *cddm = (CDDerivedMesh*)dm;
+ MVert *vert;
+ int i;
+
+ /* this will just return the pointer if it wasn't a referenced layer */
+ vert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT);
+ cddm->mvert = vert;
+
+ for(i = 0; i < dm->numVertData; ++i, ++vert)
+ VECCOPY(vert->no, vertNormals[i]);
+}
+
/* adapted from mesh_calc_normals */
void CDDM_calc_normals(DerivedMesh *dm)
{
+ CDDerivedMesh *cddm = (CDDerivedMesh*)dm;
float (*temp_nors)[3];
float (*face_nors)[3];
int i;
- int numVerts = dm->getNumVerts(dm);
- int numFaces = dm->getNumFaces(dm);
+ int numVerts = dm->numVertData;
+ int numFaces = dm->numFaceData;
MFace *mf;
- MVert *mv = CDDM_get_verts(dm);
+ MVert *mv;
- if(!mv) return;
+ if(numVerts == 0) return;
temp_nors = MEM_callocN(numVerts * sizeof(*temp_nors),
"CDDM_calc_normals temp_nors");
- face_nors = MEM_mallocN(numFaces * sizeof(*face_nors),
- "CDDM_calc_normals face_nors");
+ /* we don't want to overwrite any referenced layers */
+ mv = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT);
+ cddm->mvert = mv;
+
+ /* make a face normal layer if not present */
+ face_nors = CustomData_get_layer(&dm->faceData, CD_NORMAL);
+ if(!face_nors)
+ face_nors = CustomData_add_layer(&dm->faceData, CD_NORMAL, 0, NULL,
+ dm->numFaceData);
+
+ /* calculate face normals and add to vertex normals */
mf = CDDM_get_faces(dm);
for(i = 0; i < numFaces; i++, mf++) {
float *f_no = face_nors[i];
@@ -932,6 +987,7 @@ void CDDM_calc_normals(DerivedMesh *dm)
VecAddf(temp_nors[mf->v4], temp_nors[mf->v4], f_no);
}
+ /* normalize vertex normals and assign */
for(i = 0; i < numVerts; i++, mv++) {
float *no = temp_nors[i];
@@ -946,20 +1002,17 @@ void CDDM_calc_normals(DerivedMesh *dm)
}
MEM_freeN(temp_nors);
-
- /* TODO maybe cache face normals here? */
- MEM_freeN(face_nors);
}
void CDDM_calc_edges(DerivedMesh *dm)
{
+ CDDerivedMesh *cddm = (CDDerivedMesh*)dm;
CustomData edgeData;
- EdgeHash *eh = BLI_edgehash_new();
EdgeHashIterator *ehi;
- int i;
- int maxFaces = dm->getNumFaces(dm);
- MFace *mf = CDDM_get_faces(dm);
+ MFace *mf = cddm->mface;
MEdge *med;
+ EdgeHash *eh = BLI_edgehash_new();
+ int i, numEdges, maxFaces = dm->numFaceData;
for (i = 0; i < maxFaces; i++, mf++) {
if (!BLI_edgehash_haskey(eh, mf->v1, mf->v2))
@@ -978,14 +1031,14 @@ void CDDM_calc_edges(DerivedMesh *dm)
}
}
- CustomData_from_template(&dm->edgeData, &edgeData, 0, BLI_edgehash_size(eh));
-
- if(!CustomData_get_layer(&edgeData, LAYERTYPE_MEDGE))
- CustomData_add_layer(&edgeData, LAYERTYPE_MEDGE,
- LAYERFLAG_NOCOPY, NULL);
+ numEdges = BLI_edgehash_size(eh);
+ /* write new edges into a temporary CustomData */
+ memset(&edgeData, 0, sizeof(edgeData));
+ CustomData_add_layer(&edgeData, CD_MEDGE, 0, NULL, numEdges);
+
ehi = BLI_edgehashIterator_new(eh);
- med = CustomData_get_layer(&edgeData, LAYERTYPE_MEDGE);
+ med = CustomData_get_layer(&edgeData, CD_MEDGE);
for(i = 0; !BLI_edgehashIterator_isDone(ehi);
BLI_edgehashIterator_step(ehi), ++i, ++med) {
BLI_edgehashIterator_getKey(ehi, (int*)&med->v1, (int*)&med->v2);
@@ -994,54 +1047,67 @@ void CDDM_calc_edges(DerivedMesh *dm)
}
BLI_edgehashIterator_free(ehi);
- CustomData_free(&dm->edgeData);
+ /* free old CustomData and assign new one */
+ CustomData_free(&dm->edgeData, dm->numVertData);
dm->edgeData = edgeData;
+ dm->numEdgeData = numEdges;
+
+ cddm->medge = CustomData_get_layer(&dm->edgeData, CD_MEDGE);
BLI_edgehash_free(eh, NULL);
}
-void CDDM_set_num_verts(DerivedMesh *dm, int numVerts)
+void CDDM_lower_num_verts(DerivedMesh *dm, int numVerts)
{
- CustomData_set_num_elems(&dm->vertData, numVerts);
+ if (numVerts < dm->numVertData)
+ CustomData_free_elem(&dm->vertData, numVerts, dm->numVertData - numVerts);
+
+ dm->numVertData = numVerts;
}
-void CDDM_set_num_edges(DerivedMesh *dm, int numEdges)
+void CDDM_lower_num_edges(DerivedMesh *dm, int numEdges)
{
- CustomData_set_num_elems(&dm->edgeData, numEdges);
+ if (numEdges < dm->numEdgeData)
+ CustomData_free_elem(&dm->edgeData, numEdges, dm->numEdgeData - numEdges);
+
+ dm->numEdgeData = numEdges;
}
-void CDDM_set_num_faces(DerivedMesh *dm, int numFaces)
+void CDDM_lower_num_faces(DerivedMesh *dm, int numFaces)
{
- CustomData_set_num_elems(&dm->faceData, numFaces);
+ if (numFaces < dm->numFaceData)
+ CustomData_free_elem(&dm->faceData, numFaces, dm->numFaceData - numFaces);
+
+ dm->numFaceData = numFaces;
}
MVert *CDDM_get_vert(DerivedMesh *dm, int index)
{
- return CustomData_get(&dm->vertData, index, LAYERTYPE_MVERT);
+ return &((CDDerivedMesh*)dm)->mvert[index];
}
MEdge *CDDM_get_edge(DerivedMesh *dm, int index)
{
- return CustomData_get(&dm->edgeData, index, LAYERTYPE_MEDGE);
+ return &((CDDerivedMesh*)dm)->medge[index];
}
MFace *CDDM_get_face(DerivedMesh *dm, int index)
{
- return CustomData_get(&dm->faceData, index, LAYERTYPE_MFACE);
+ return &((CDDerivedMesh*)dm)->mface[index];
}
MVert *CDDM_get_verts(DerivedMesh *dm)
{
- return CustomData_get_layer(&dm->vertData, LAYERTYPE_MVERT);
+ return ((CDDerivedMesh*)dm)->mvert;
}
MEdge *CDDM_get_edges(DerivedMesh *dm)
{
- return CustomData_get_layer(&dm->edgeData, LAYERTYPE_MEDGE);
+ return ((CDDerivedMesh*)dm)->medge;
}
MFace *CDDM_get_faces(DerivedMesh *dm)
{
- return CustomData_get_layer(&dm->faceData, LAYERTYPE_MFACE);
+ return ((CDDerivedMesh*)dm)->mface;
}
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index c626c79bdcc..21b77f671e4 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -37,7 +37,7 @@
#include "BLI_linklist.h"
#include "DNA_customdata_types.h"
-#include "DNA_mesh_types.h"
+#include "DNA_listbase.h"
#include "DNA_meshdata_types.h"
#include "MEM_guardedalloc.h"
@@ -49,7 +49,9 @@
/********************* Layer type information **********************/
typedef struct LayerTypeInfo {
- int size; /* the memory size of one element of this layer's data */
+ int size; /* the memory size of one element of this layer's data */
+ char *structname; /* name of the struct used, for file writing */
+ int structnum; /* number of structs per element, for file writing */
/* a function to copy count elements of this layer's data
* (deep copy if appropriate)
@@ -78,9 +80,12 @@ typedef struct LayerTypeInfo {
void (*interp)(void **sources, float *weights, float *sub_weights,
int count, void *dest);
+ /* a function to swap the data in corners of the element */
+ void (*swap)(void *data, int *corner_indices);
+
/* a function to set a layer's data to default values. if NULL, the
default is assumed to be all zeros */
- void (*set_default)(void *data);
+ void (*set_default)(void *data, int count);
} LayerTypeInfo;
static void layerCopy_mdeformvert(const void *source, void *dest,
@@ -110,6 +115,7 @@ static void layerFree_mdeformvert(void *data, int count, int size)
if(dvert->dw) {
MEM_freeN(dvert->dw);
dvert->dw = NULL;
+ dvert->totweight = 0;
}
}
}
@@ -176,10 +182,33 @@ static void layerInterp_mdeformvert(void **sources, float *weights,
BLI_linklist_free(dest_dw, linklist_free_simple);
}
+
+static void layerInterp_msticky(void **sources, float *weights,
+ float *sub_weights, int count, void *dest)
+{
+ float co[2], w;
+ MSticky *mst;
+ int i;
+
+ co[0] = co[1] = 0.0f;
+ for(i = 0; i < count; i++) {
+ w = weights ? weights[i] : 1.0f;
+ mst = (MSticky*)sources[i];
+
+ co[0] += w*mst->co[0];
+ co[1] += w*mst->co[1];
+ }
+
+ mst = (MSticky*)dest;
+ mst->co[0] = co[0];
+ mst->co[1] = co[1];
+}
+
+
static void layerCopy_tface(const void *source, void *dest, int count, int size)
{
- const TFace *source_tf = (const TFace*)source;
- TFace *dest_tf = (TFace*)dest;
+ const MTFace *source_tf = (const MTFace*)source;
+ MTFace *dest_tf = (MTFace*)dest;
int i;
for(i = 0; i < count; ++i) {
@@ -191,70 +220,66 @@ static void layerCopy_tface(const void *source, void *dest, int count, int size)
static void layerInterp_tface(void **sources, float *weights,
float *sub_weights, int count, void *dest)
{
- TFace *tf = dest;
+ MTFace *tf = dest;
int i, j, k;
float uv[4][2];
- float col[4][4];
float *sub_weight;
if(count <= 0) return;
memset(uv, 0, sizeof(uv));
- memset(col, 0, sizeof(col));
sub_weight = sub_weights;
for(i = 0; i < count; ++i) {
float weight = weights ? weights[i] : 1;
- TFace *src = sources[i];
+ MTFace *src = sources[i];
for(j = 0; j < 4; ++j) {
if(sub_weights) {
for(k = 0; k < 4; ++k, ++sub_weight) {
float w = (*sub_weight) * weight;
- char *tmp_col = (char *)&src->col[k];
float *tmp_uv = src->uv[k];
uv[j][0] += tmp_uv[0] * w;
uv[j][1] += tmp_uv[1] * w;
-
- col[j][0] += tmp_col[0] * w;
- col[j][1] += tmp_col[1] * w;
- col[j][2] += tmp_col[2] * w;
- col[j][3] += tmp_col[3] * w;
}
} else {
- char *tmp_col = (char *)&src->col[j];
uv[j][0] += src->uv[j][0] * weight;
uv[j][1] += src->uv[j][1] * weight;
-
- col[j][0] += tmp_col[0] * weight;
- col[j][1] += tmp_col[1] * weight;
- col[j][2] += tmp_col[2] * weight;
- col[j][3] += tmp_col[3] * weight;
}
}
}
- *tf = *(TFace *)sources[0];
+ *tf = *(MTFace *)sources[0];
for(j = 0; j < 4; ++j) {
- char *tmp_col = (char *)&tf->col[j];
-
tf->uv[j][0] = uv[j][0];
tf->uv[j][1] = uv[j][1];
+ }
+}
+
+static void layerSwap_tface(void *data, int *corner_indices)
+{
+ MTFace *tf = data;
+ float uv[4][2];
+ int j;
- tmp_col[0] = (int)col[j][0];
- tmp_col[1] = (int)col[j][1];
- tmp_col[2] = (int)col[j][2];
- tmp_col[3] = (int)col[j][3];
+ for(j = 0; j < 4; ++j) {
+ uv[j][0] = tf->uv[corner_indices[j]][0];
+ uv[j][1] = tf->uv[corner_indices[j]][1];
}
+
+ memcpy(tf->uv, uv, sizeof(tf->uv));
}
-static void layerDefault_tface(void *data)
+static void layerDefault_tface(void *data, int count)
{
- static TFace default_tf = {NULL, {{0, 1}, {0, 0}, {1, 0}, {1, 1}},
- {~0, ~0, ~0, ~0}, TF_SELECT, 0, TF_DYNAMIC, 0, 0};
+ static MTFace default_tf = {{{0, 1}, {0, 0}, {1, 0}, {1, 1}}, NULL,
+ TF_SELECT, 0, TF_DYNAMIC, 0, 0};
+ MTFace *tf = (MTFace*)data;
+ int i;
- *((TFace*)data) = default_tf;
+ for(i = 0; i < count; i++)
+ tf[i] = default_tf;
}
static void layerInterp_mcol(void **sources, float *weights,
@@ -305,111 +330,164 @@ static void layerInterp_mcol(void **sources, float *weights,
}
}
-static void layerDefault_mcol(void *data)
+static void layerSwap_mcol(void *data, int *corner_indices)
+{
+ MCol *mcol = data;
+ MCol col[4];
+ int j;
+
+ for(j = 0; j < 4; ++j)
+ col[j] = mcol[corner_indices[j]];
+
+ memcpy(mcol, col, sizeof(col));
+}
+
+static void layerDefault_mcol(void *data, int count)
{
static MCol default_mcol = {255, 255, 255, 255};
MCol *mcol = (MCol*)data;
+ int i;
+
+ for(i = 0; i < 4*count; i++)
+ mcol[i] = default_mcol;
+}
- mcol[0]= default_mcol;
- mcol[1]= default_mcol;
- mcol[2]= default_mcol;
- mcol[3]= default_mcol;
-}
-
-const LayerTypeInfo LAYERTYPEINFO[LAYERTYPE_NUMTYPES] = {
- {sizeof(MVert), NULL, NULL, NULL, NULL},
- {sizeof(MSticky), NULL, NULL, NULL, NULL},
- {sizeof(MDeformVert), layerCopy_mdeformvert,
- layerFree_mdeformvert, layerInterp_mdeformvert, NULL},
- {sizeof(MEdge), NULL, NULL, NULL, NULL},
- {sizeof(MFace), NULL, NULL, NULL, NULL},
- {sizeof(TFace), layerCopy_tface, NULL, layerInterp_tface,
- layerDefault_tface},
+const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
+ {sizeof(MVert), "MVert", 1, NULL, NULL, NULL, NULL, NULL},
+ {sizeof(MSticky), "MSticky", 1, NULL, NULL, layerInterp_msticky, NULL, NULL},
+ {sizeof(MDeformVert), "MDeformVert", 1, layerCopy_mdeformvert,
+ layerFree_mdeformvert, layerInterp_mdeformvert, NULL, NULL},
+ {sizeof(MEdge), "MEdge", 1, NULL, NULL, NULL, NULL, NULL},
+ {sizeof(MFace), "MFace", 1, NULL, NULL, NULL, NULL, NULL},
+ {sizeof(MTFace), "MTFace", 1, layerCopy_tface, NULL, layerInterp_tface,
+ layerSwap_tface, layerDefault_tface},
/* 4 MCol structs per face */
- {sizeof(MCol) * 4, NULL, NULL, layerInterp_mcol, layerDefault_mcol},
- {sizeof(int), NULL, NULL, NULL, NULL},
+ {sizeof(MCol)*4, "MCol", 4, NULL, NULL, layerInterp_mcol, layerSwap_mcol,
+ layerDefault_mcol},
+ {sizeof(int), "", 0, NULL, NULL, NULL, NULL, NULL},
/* 3 floats per normal vector */
- {sizeof(float) * 3, NULL, NULL, NULL, NULL},
- {sizeof(int), NULL, NULL, NULL, NULL},
+ {sizeof(float)*3, "", 0, NULL, NULL, NULL, NULL, NULL},
+ {sizeof(int), "", 0, NULL, NULL, NULL, NULL, NULL},
};
+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};
+
static const LayerTypeInfo *layerType_getInfo(int type)
{
- if(type < 0 || type >= LAYERTYPE_NUMTYPES) return NULL;
+ if(type < 0 || type >= CD_NUMTYPES) return NULL;
return &LAYERTYPEINFO[type];
}
-/********************* CustomData functions *********************/
-void CustomData_init(CustomData *data,
- int maxLayers, int maxElems, int subElems)
+static const char *layerType_getName(int type)
{
- data->layers = MEM_callocN(maxLayers * sizeof(*data->layers),
- "CustomData->layers");
- data->numLayers = 0;
- data->maxLayers = maxLayers;
- data->numElems = maxElems;
- data->maxElems = maxElems;
- data->subElems = subElems;
+ if(type < 0 || type >= CD_NUMTYPES) return NULL;
+
+ return LAYERTYPENAMES[type];
}
+/********************* CustomData functions *********************/
static void CustomData_update_offsets(CustomData *data)
{
const LayerTypeInfo *typeInfo;
int i, offset = 0;
- for(i = 0; i < data->numLayers; ++i) {
+ for(i = 0; i < data->totlayer; ++i) {
typeInfo = layerType_getInfo(data->layers[i].type);
data->layers[i].offset = offset;
offset += typeInfo->size;
}
- data->totSize = offset;
+ data->totsize = offset;
}
-void CustomData_from_template(const CustomData *source, CustomData *dest,
- int flag, int maxElems)
+void CustomData_merge(const struct CustomData *source, struct CustomData *dest,
+ CustomDataMask *mask, int alloctype, int totelem)
{
- int i, layerflag;
+ const LayerTypeInfo *typeInfo;
+ CustomDataLayer *layer;
+ int i, flag, type;
+ void *data;
- CustomData_init(dest, source->maxLayers, maxElems, source->subElems);
+ for(i = 0; i < source->totlayer; ++i) {
+ layer = &source->layers[i];
+ typeInfo = layerType_getInfo(layer->type);
- for(i = 0; i < source->numLayers; ++i) {
- if(source->layers[i].flag & LAYERFLAG_NOCOPY) continue;
+ if(layer->flag & CD_FLAG_NOCOPY) continue;
+ else if(mask && !mask[layer->type]) continue;
+ else if(CustomData_has_layer(dest, layer->type)) continue;
- layerflag = (source->layers[i].flag & ~LAYERFLAG_NOFREE) | flag;
- CustomData_add_layer(dest, source->layers[i].type, layerflag, NULL);
+ type = layer->type;
+ flag = layer->flag & ~CD_FLAG_NOFREE;
+ data = layer->data;
+
+ if (alloctype == CD_CALLOC) {
+ CustomData_add_layer(dest, type, flag, NULL, totelem);
+ }
+ else if (alloctype == CD_REFERENCE) {
+ CustomData_add_layer(dest, type, flag|CD_FLAG_NOFREE, data, totelem);
+ }
+ else if (alloctype == CD_DUPLICATE) {
+ CustomData_add_layer(dest, type, flag, MEM_dupallocN(data), totelem);
+ }
+ else if (alloctype == CD_DEFAULT) {
+ data = CustomData_add_layer(dest, type, flag, NULL, totelem);
+ if(typeInfo->set_default)
+ typeInfo->set_default((char*)data, totelem);
+ }
}
CustomData_update_offsets(dest);
+
}
-void CustomData_free(CustomData *data)
+void CustomData_copy(const struct CustomData *source, struct CustomData *dest,
+ CustomDataMask *mask, int alloctype, int totelem)
+{
+ memset(dest, 0, sizeof(*dest));
+
+ CustomData_merge(source, dest, mask, alloctype, totelem);
+}
+
+static void CustomData_free_layer__internal(CustomDataLayer *layer, int totelem)
{
- int i;
const LayerTypeInfo *typeInfo;
- for(i = 0; i < data->numLayers; ++i) {
- if(!(data->layers[i].flag & LAYERFLAG_NOFREE)) {
- typeInfo = layerType_getInfo(data->layers[i].type);
- if(typeInfo->free)
- typeInfo->free(data->layers[i].data, data->numElems,
- typeInfo->size);
+ if(!(layer->flag & CD_FLAG_NOFREE) && layer->data) {
+ typeInfo = layerType_getInfo(layer->type);
- if(data->layers[i].data)
- MEM_freeN(data->layers[i].data);
- }
+ if(typeInfo->free)
+ typeInfo->free(layer->data, totelem, typeInfo->size);
+
+ if(layer->data)
+ MEM_freeN(layer->data);
}
+}
- data->numLayers = 0;
+void CustomData_free(CustomData *data, int totelem)
+{
+ int i;
+
+ for(i = 0; i < data->totlayer; ++i)
+ CustomData_free_layer__internal(&data->layers[i], totelem);
- if(data->layers) {
+ if(data->layers)
MEM_freeN(data->layers);
- data->layers = NULL;
- }
+
+ memset(data, 0, sizeof(*data));
}
+
/* gets index of first layer matching type after start_index
* if start_index < 0, starts searching at 0
* returns -1 if there is no layer of type
@@ -421,7 +499,7 @@ static int CustomData_find_next(const CustomData *data, int type,
if(i < 0) i = 0;
- for(; i < data->numLayers; ++i)
+ for(; i < data->totlayer; ++i)
if(data->layers[i].type == type) return i;
return -1;
@@ -429,26 +507,28 @@ static int CustomData_find_next(const CustomData *data, int type,
static int customData_resize(CustomData *data, int amount)
{
- CustomDataLayer *tmp = MEM_callocN(sizeof(*tmp)*(data->maxLayers + amount),
+ CustomDataLayer *tmp = MEM_callocN(sizeof(*tmp)*(data->maxlayer + amount),
"CustomData->layers");
if(!tmp) return 0;
- data->maxLayers += amount;
- memcpy(tmp, data->layers, sizeof(*tmp) * data->numLayers);
-
- MEM_freeN(data->layers);
+ data->maxlayer += amount;
+ if (data->layers) {
+ memcpy(tmp, data->layers, sizeof(*tmp) * data->totlayer);
+ MEM_freeN(data->layers);
+ }
data->layers = tmp;
return 1;
}
-static int customData_add_layer__internal(CustomData *data, int type,
- int flag, void *layer)
+static int customData_add_layer__internal(CustomData *data, int type, int flag,
+ void *layer)
{
- int index = data->numLayers;
+ int index = data->totlayer;
- if(index >= data->maxLayers)
- if(!customData_resize(data, CUSTOMDATA_GROW)) return 0;
+ if(index >= data->maxlayer)
+ if(!customData_resize(data, CUSTOMDATA_GROW))
+ return 0;
/* keep layers ordered by type */
for( ; index > 0 && data->layers[index - 1].type > type; --index)
@@ -458,42 +538,46 @@ static int customData_add_layer__internal(CustomData *data, int type,
data->layers[index].flag = flag;
data->layers[index].data = layer;
- data->numLayers++;
+ data->totlayer++;
CustomData_update_offsets(data);
return 1;
}
-int CustomData_add_layer(CustomData *data, int type, int flag, void *layer)
+void *CustomData_add_layer(CustomData *data, int type, int flag,
+ void *layerdata, int totelem)
{
- int size = layerType_getInfo(type)->size * data->numElems;
- void *tmp_layer = layer;
+ int size = layerType_getInfo(type)->size * totelem;
+ void *tmpdata = layerdata;
- if(!layer) tmp_layer = MEM_callocN(size, "CustomDataLayer.data");
+ if(!tmpdata)
+ tmpdata = MEM_callocN(size, layerType_getName(type));
+ if(!tmpdata)
+ return NULL;
- if(!tmp_layer) return 0;
-
- if(customData_add_layer__internal(data, type, flag, tmp_layer))
- return 1;
- else {
- MEM_freeN(tmp_layer);
- return 0;
+ if(!customData_add_layer__internal(data, type, flag, tmpdata)) {
+ MEM_freeN(tmpdata);
+ return NULL;
}
+
+ return tmpdata;
}
-int CustomData_free_layer(CustomData *data, int type)
+int CustomData_free_layer(CustomData *data, int type, int totelem)
{
int index = CustomData_find_next(data, type, -1);
if (index < 0) return 0;
- for(++index; index < data->numLayers; ++index)
+ CustomData_free_layer__internal(&data->layers[index], totelem);
+
+ for(++index; index < data->totlayer; ++index)
data->layers[index - 1] = data->layers[index];
- data->numLayers--;
+ data->totlayer--;
- if(data->numLayers <= data->maxLayers-CUSTOMDATA_GROW)
+ if(data->totlayer <= data->maxlayer-CUSTOMDATA_GROW)
customData_resize(data, -CUSTOMDATA_GROW);
CustomData_update_offsets(data);
@@ -501,18 +585,62 @@ int CustomData_free_layer(CustomData *data, int type)
return 1;
}
-int CustomData_has_layer(const struct CustomData *data, int type)
+int CustomData_has_layer(const CustomData *data, int type)
{
return (CustomData_find_next(data, type, -1) != -1);
}
+void *CustomData_duplicate_referenced_layer(struct CustomData *data, int type)
+{
+ CustomDataLayer *layer;
+ int layer_index;
+
+ /* get the layer index of the first layer of type */
+ layer_index = CustomData_find_next(data, type, -1);
+ if(layer_index < 0) return NULL;
+
+ layer = &data->layers[layer_index];
+
+ if (layer->flag & CD_FLAG_NOFREE) {
+ layer->data = MEM_dupallocN(layer->data);
+ layer->flag &= ~CD_FLAG_NOFREE;
+ }
+
+ return layer->data;
+}
+
+void CustomData_free_temporary(CustomData *data, int totelem)
+{
+ CustomDataLayer *layer;
+ int i, j;
+
+ for(i = 0, j = 0; i < data->totlayer; ++i) {
+ layer = &data->layers[i];
+
+ if (i != j)
+ data->layers[j] = data->layers[i];
+
+ if ((layer->flag & CD_FLAG_TEMPORARY) == CD_FLAG_TEMPORARY)
+ CustomData_free_layer__internal(layer, totelem);
+ else
+ j++;
+ }
+
+ data->totlayer = j;
+
+ if(data->totlayer <= data->maxlayer-CUSTOMDATA_GROW)
+ customData_resize(data, -CUSTOMDATA_GROW);
+
+ CustomData_update_offsets(data);
+}
+
int CustomData_compat(const CustomData *data1, const CustomData *data2)
{
int i;
- if(data1->numLayers != data2->numLayers) return 0;
+ if(data1->totlayer != data2->totlayer) return 0;
- for(i = 0; i < data1->numLayers; ++i) {
+ for(i = 0; i < data1->totlayer; ++i) {
if(data1->layers[i].type != data2->layers[i].type) return 0;
if(data1->layers[i].flag != data2->layers[i].flag) return 0;
}
@@ -520,34 +648,28 @@ int CustomData_compat(const CustomData *data1, const CustomData *data2)
return 1;
}
-int CustomData_copy_data(const CustomData *source, CustomData *dest,
- int source_index, int dest_index, int count)
+void CustomData_copy_data(const CustomData *source, CustomData *dest,
+ int source_index, int dest_index, int count)
{
const LayerTypeInfo *type_info;
int src_i, dest_i;
int src_offset;
int dest_offset;
- if(count < 0) return 0;
- if(source_index < 0 || (source_index + count) > source->numElems)
- return 0;
- if(dest_index < 0 || (dest_index + count) > dest->numElems)
- return 0;
-
/* copies a layer at a time */
dest_i = 0;
- for(src_i = 0; src_i < source->numLayers; ++src_i) {
- if(source->layers[src_i].flag & LAYERFLAG_NOCOPY) continue;
+ for(src_i = 0; src_i < source->totlayer; ++src_i) {
+ if(source->layers[src_i].flag & CD_FLAG_NOCOPY) continue;
/* find the first dest layer with type >= the source type
* (this should work because layers are ordered by type)
*/
- while(dest_i < dest->numLayers
+ while(dest_i < dest->totlayer
&& dest->layers[dest_i].type < source->layers[src_i].type)
++dest_i;
/* if there are no more dest layers, we're done */
- if(dest_i >= dest->numLayers) return 1;
+ if(dest_i >= dest->totlayer) return;
/* if we found a matching layer, copy the data */
if(dest->layers[dest_i].type == source->layers[src_i].type) {
@@ -575,19 +697,15 @@ int CustomData_copy_data(const CustomData *source, CustomData *dest,
++dest_i;
}
}
-
- return 1;
}
-int CustomData_free_elem(CustomData *data, int index, int count)
+void CustomData_free_elem(CustomData *data, int index, int count)
{
int i;
const LayerTypeInfo *typeInfo;
- if(index < 0 || count <= 0 || index + count > data->numElems) return 0;
-
- for(i = 0; i < data->numLayers; ++i) {
- if(!(data->layers[i].flag & LAYERFLAG_NOFREE)) {
+ for(i = 0; i < data->totlayer; ++i) {
+ if(!(data->layers[i].flag & CD_FLAG_NOFREE)) {
typeInfo = layerType_getInfo(data->layers[i].type);
if(typeInfo->free) {
@@ -598,15 +716,13 @@ int CustomData_free_elem(CustomData *data, int index, int count)
}
}
}
-
- return 1;
}
#define SOURCE_BUF_SIZE 100
-int CustomData_interp(const CustomData *source, CustomData *dest,
- int *src_indices, float *weights, float *sub_weights,
- int count, int dest_index)
+void CustomData_interp(const CustomData *source, CustomData *dest,
+ int *src_indices, float *weights, float *sub_weights,
+ int count, int dest_index)
{
int src_i, dest_i;
int dest_offset;
@@ -614,9 +730,6 @@ int CustomData_interp(const CustomData *source, CustomData *dest,
void *source_buf[SOURCE_BUF_SIZE];
void **sources = source_buf;
- if(count <= 0) return 0;
- if(dest_index < 0 || dest_index >= dest->numElems) return 0;
-
/* slow fallback in case we're interpolating a ridiculous number of
* elements
*/
@@ -625,7 +738,7 @@ int CustomData_interp(const CustomData *source, CustomData *dest,
"CustomData_interp sources");
/* interpolates a layer at a time */
- for(src_i = 0; src_i < source->numLayers; ++src_i) {
+ for(src_i = 0; src_i < source->totlayer; ++src_i) {
CustomDataLayer *source_layer = &source->layers[src_i];
const LayerTypeInfo *type_info =
layerType_getInfo(source_layer->type);
@@ -647,7 +760,22 @@ int CustomData_interp(const CustomData *source, CustomData *dest,
}
if(count > SOURCE_BUF_SIZE) MEM_freeN(sources);
- return 1;
+}
+
+void CustomData_swap(struct CustomData *data, int index, int *corner_indices)
+{
+ const LayerTypeInfo *typeInfo;
+ int i;
+
+ for(i = 0; i < data->totlayer; ++i) {
+ typeInfo = layerType_getInfo(data->layers[i].type);
+
+ if(typeInfo->swap) {
+ int offset = typeInfo->size * index;
+
+ typeInfo->swap((char *)data->layers[i].data + offset, corner_indices);
+ }
+ }
}
void *CustomData_get(const CustomData *data, int index, int type)
@@ -655,8 +783,6 @@ void *CustomData_get(const CustomData *data, int index, int type)
int offset;
int layer_index;
- if(index < 0 || index > data->numElems) return NULL;
-
/* get the layer index of the first layer of type */
layer_index = CustomData_find_next(data, type, -1);
if(layer_index < 0) return NULL;
@@ -677,6 +803,18 @@ void *CustomData_get_layer(const CustomData *data, int type)
return data->layers[layer_index].data;
}
+void *CustomData_set_layer(const CustomData *data, int type, void *ptr)
+{
+ /* get the layer index of the first layer of type */
+ int layer_index = CustomData_find_next(data, type, -1);
+
+ if(layer_index < 0) return NULL;
+
+ data->layers[layer_index].data = ptr;
+
+ return ptr;
+}
+
void CustomData_set(const CustomData *data, int index, int type, void *source)
{
void *dest = CustomData_get(data, index, type);
@@ -690,11 +828,20 @@ void CustomData_set(const CustomData *data, int index, int type, void *source)
memcpy(dest, source, type_info->size);
}
-void CustomData_set_num_elems(CustomData *data, int numElems)
+void CustomData_set_default(CustomData *data, int index, int count)
{
- if(numElems < 0) return;
- if(numElems < data->maxElems) data->numElems = numElems;
- else data->numElems = data->maxElems;
+ const LayerTypeInfo *typeInfo;
+ int i;
+
+ for(i = 0; i < data->totlayer; ++i) {
+ typeInfo = layerType_getInfo(data->layers[i].type);
+
+ if(typeInfo->set_default) {
+ int offset = typeInfo->size * index;
+
+ typeInfo->set_default((char *)data->layers[i].data + offset, count);
+ }
+ }
}
/* EditMesh functions */
@@ -706,8 +853,8 @@ void CustomData_em_free_block(CustomData *data, void **block)
if(!*block) return;
- for(i = 0; i < data->numLayers; ++i) {
- if(!(data->layers[i].flag & LAYERFLAG_NOFREE)) {
+ for(i = 0; i < data->totlayer; ++i) {
+ if(!(data->layers[i].flag & CD_FLAG_NOFREE)) {
typeInfo = layerType_getInfo(data->layers[i].type);
if(typeInfo->free) {
@@ -728,13 +875,13 @@ static void CustomData_em_alloc_block(CustomData *data, void **block)
if (*block)
CustomData_em_free_block(data, block);
- if (data->totSize > 0)
- *block = MEM_callocN(data->totSize, "CustomData EM block");
+ if (data->totsize > 0)
+ *block = MEM_callocN(data->totsize, "CustomData EM block");
else
*block = NULL;
}
-int CustomData_em_copy_data(const CustomData *source, CustomData *dest,
+void CustomData_em_copy_data(const CustomData *source, CustomData *dest,
void *src_block, void **dest_block)
{
const LayerTypeInfo *type_info;
@@ -745,18 +892,18 @@ int CustomData_em_copy_data(const CustomData *source, CustomData *dest,
/* copies a layer at a time */
dest_i = 0;
- for(src_i = 0; src_i < source->numLayers; ++src_i) {
- if(source->layers[src_i].flag & LAYERFLAG_NOCOPY) continue;
+ for(src_i = 0; src_i < source->totlayer; ++src_i) {
+ if(source->layers[src_i].flag & CD_FLAG_NOCOPY) continue;
/* find the first dest layer with type >= the source type
* (this should work because layers are ordered by type)
*/
- while(dest_i < dest->numLayers
+ while(dest_i < dest->totlayer
&& dest->layers[dest_i].type < source->layers[src_i].type)
++dest_i;
/* if there are no more dest layers, we're done */
- if(dest_i >= dest->numLayers) return 1;
+ if(dest_i >= dest->totlayer) return;
/* if we found a matching layer, copy the data */
if(dest->layers[dest_i].type == source->layers[src_i].type) {
@@ -777,8 +924,6 @@ int CustomData_em_copy_data(const CustomData *source, CustomData *dest,
++dest_i;
}
}
-
- return 1;
}
void *CustomData_em_get(const CustomData *data, void *block, int type)
@@ -805,15 +950,13 @@ void CustomData_em_set(CustomData *data, void *block, int type, void *source)
memcpy(dest, source, type_info->size);
}
-int CustomData_em_interp(CustomData *data, void **src_blocks, float *weights,
- float *sub_weights, int count, void *dest_block)
+void CustomData_em_interp(CustomData *data, void **src_blocks, float *weights,
+ float *sub_weights, int count, void *dest_block)
{
int i, j;
void *source_buf[SOURCE_BUF_SIZE];
void **sources = source_buf;
- if(count <= 0) return 0;
-
/* slow fallback in case we're interpolating a ridiculous number of
* elements
*/
@@ -822,7 +965,7 @@ int CustomData_em_interp(CustomData *data, void **src_blocks, float *weights,
"CustomData_interp sources");
/* interpolates a layer at a time */
- for(i = 0; i < data->numLayers; ++i) {
+ for(i = 0; i < data->totlayer; ++i) {
CustomDataLayer *layer = &data->layers[i];
const LayerTypeInfo *type_info = layerType_getInfo(layer->type);
@@ -836,7 +979,6 @@ int CustomData_em_interp(CustomData *data, void **src_blocks, float *weights,
}
if(count > SOURCE_BUF_SIZE) MEM_freeN(sources);
- return 1;
}
void CustomData_em_set_default(CustomData *data, void **block)
@@ -847,13 +989,13 @@ void CustomData_em_set_default(CustomData *data, void **block)
if (!*block)
CustomData_em_alloc_block(data, block);
- for(i = 0; i < data->numLayers; ++i) {
+ for(i = 0; i < data->totlayer; ++i) {
int offset = data->layers[i].offset;
type_info = layerType_getInfo(data->layers[i].type);
if(type_info->set_default)
- type_info->set_default((char*)*block + offset);
+ type_info->set_default((char*)*block + offset, 1);
}
}
@@ -861,25 +1003,47 @@ void CustomData_to_em_block(const CustomData *source, CustomData *dest,
int src_index, void **dest_block)
{
const LayerTypeInfo *type_info;
- int i, src_offset;
+ int dest_i, src_i, src_offset;
if (!*dest_block)
CustomData_em_alloc_block(dest, dest_block);
/* copies a layer at a time */
- for(i = 0; i < dest->numLayers; ++i) {
- int offset = dest->layers[i].offset;
- char *src_data = source->layers[i].data;
- char *dest_data = (char*)*dest_block + offset;
+ dest_i = 0;
+ for(src_i = 0; src_i < source->totlayer; ++src_i) {
+ if(source->layers[src_i].flag & CD_FLAG_NOCOPY) continue;
+
+ /* find the first dest layer with type >= the source type
+ * (this should work because layers are ordered by type)
+ */
+ while(dest_i < dest->totlayer
+ && dest->layers[dest_i].type < source->layers[src_i].type)
+ ++dest_i;
- type_info = layerType_getInfo(dest->layers[i].type);
- src_offset = src_index * type_info->size;
+ /* if there are no more dest layers, we're done */
+ if(dest_i >= dest->totlayer) return;
- if(type_info->copy)
- type_info->copy(src_data + src_offset, dest_data, 1,
- type_info->size);
- else
- memcpy(dest_data, src_data + src_offset, type_info->size);
+ /* if we found a matching layer, copy the data */
+ if(dest->layers[dest_i].type == source->layers[src_i].type) {
+ int offset = dest->layers[dest_i].offset;
+ char *src_data = source->layers[src_i].data;
+ char *dest_data = (char*)*dest_block + offset;
+
+ type_info = layerType_getInfo(dest->layers[dest_i].type);
+ src_offset = src_index * type_info->size;
+
+ if(type_info->copy)
+ type_info->copy(src_data + src_offset, dest_data, 1,
+ type_info->size);
+ else
+ memcpy(dest_data, src_data + src_offset, type_info->size);
+
+ /* if there are multiple source & dest layers of the same type,
+ * we don't want to copy all source layers to the same dest, so
+ * increment dest_i
+ */
+ ++dest_i;
+ }
}
}
@@ -887,22 +1051,59 @@ void CustomData_from_em_block(const CustomData *source, CustomData *dest,
void *src_block, int dest_index)
{
const LayerTypeInfo *type_info;
- int i, dest_offset;
+ int dest_i, src_i, dest_offset;
/* copies a layer at a time */
- for(i = 0; i < dest->numLayers; ++i) {
- int offset = source->layers[i].offset;
- char *src_data = (char*)src_block + offset;
- char *dest_data = dest->layers[i].data;
+ dest_i = 0;
+ for(src_i = 0; src_i < source->totlayer; ++src_i) {
+ if(source->layers[src_i].flag & CD_FLAG_NOCOPY) continue;
+
+ /* find the first dest layer with type >= the source type
+ * (this should work because layers are ordered by type)
+ */
+ while(dest_i < dest->totlayer
+ && dest->layers[dest_i].type < source->layers[src_i].type)
+ ++dest_i;
- type_info = layerType_getInfo(dest->layers[i].type);
- dest_offset = dest_index * type_info->size;
+ /* if there are no more dest layers, we're done */
+ if(dest_i >= dest->totlayer) return;
- if(type_info->copy)
- type_info->copy(src_data, dest_data + dest_offset, 1,
- type_info->size);
- else
- memcpy(dest_data + dest_offset, src_data, type_info->size);
+ /* if we found a matching layer, copy the data */
+ if(dest->layers[dest_i].type == source->layers[src_i].type) {
+ int offset = source->layers[src_i].offset;
+ char *src_data = (char*)src_block + offset;
+ char *dest_data = dest->layers[dest_i].data;
+
+ type_info = layerType_getInfo(dest->layers[dest_i].type);
+ dest_offset = dest_index * type_info->size;
+
+ if(type_info->copy)
+ type_info->copy(src_data, dest_data + dest_offset, 1,
+ type_info->size);
+ else
+ memcpy(dest_data + dest_offset, src_data, type_info->size);
+
+ /* if there are multiple source & dest layers of the same type,
+ * we don't want to copy all source layers to the same dest, so
+ * increment dest_i
+ */
+ ++dest_i;
+ }
}
+
}
+void CustomData_file_write_info(int type, char **structname, int *structnum)
+{
+ const LayerTypeInfo *type_info = layerType_getInfo(type);
+
+ *structname = type_info->structname;
+ *structnum = type_info->structnum;
+}
+
+int CustomData_sizeof(int type)
+{
+ const LayerTypeInfo *type_info = layerType_getInfo(type);
+
+ return type_info->size;
+}
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index 5e3439da6bf..e8ac82fc596 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -86,6 +86,7 @@
#include "BKE_scene.h"
#include "BKE_subsurf.h"
#include "BKE_modifier.h"
+#include "BKE_customdata.h"
#include "RE_pipeline.h"
#include "RE_shader_ext.h"
@@ -93,90 +94,6 @@
static void boundbox_displist(Object *ob);
-void displistmesh_free(DispListMesh *dlm)
-{
- // also check on mvert and mface, can be NULL after decimator (ton)
- if (!dlm->dontFreeVerts && dlm->mvert) MEM_freeN(dlm->mvert);
- if (!dlm->dontFreeNors && dlm->nors) MEM_freeN(dlm->nors);
- if (!dlm->dontFreeOther) {
- if (dlm->medge) MEM_freeN(dlm->medge);
- if (dlm->mface) MEM_freeN(dlm->mface);
- if (dlm->mcol) MEM_freeN(dlm->mcol);
- if (dlm->tface) MEM_freeN(dlm->tface);
- }
- MEM_freeN(dlm);
-}
-
-DispListMesh *displistmesh_copy(DispListMesh *odlm)
-{
- DispListMesh *ndlm= MEM_dupallocN(odlm);
- ndlm->mvert= MEM_dupallocN(odlm->mvert);
- if (odlm->medge) ndlm->medge= MEM_dupallocN(odlm->medge);
- ndlm->mface= MEM_dupallocN(odlm->mface);
- if (odlm->nors) ndlm->nors = MEM_dupallocN(odlm->nors);
- if (odlm->mcol) ndlm->mcol= MEM_dupallocN(odlm->mcol);
- if (odlm->tface) ndlm->tface= MEM_dupallocN(odlm->tface);
-
- return ndlm;
-}
-
-DispListMesh *displistmesh_copyShared(DispListMesh *odlm)
-{
- DispListMesh *ndlm= MEM_dupallocN(odlm);
- ndlm->dontFreeNors = ndlm->dontFreeOther = ndlm->dontFreeVerts = 1;
-
- return ndlm;
-}
-
-void displistmesh_to_mesh(DispListMesh *dlm, Mesh *me)
-{
- /* We assume, rather courageously, that any
- * shared data came from the mesh itself and so
- * we can ignore the dlm->dontFreeOther flag.
- */
-
- if (me->mvert && dlm->mvert!=me->mvert) MEM_freeN(me->mvert);
- if (me->mface && dlm->mface!=me->mface) MEM_freeN(me->mface);
- if (me->tface && dlm->tface!=me->tface) MEM_freeN(me->tface);
- if (me->mcol && dlm->mcol!=me->mcol) MEM_freeN(me->mcol);
- if (me->medge && dlm->medge!=me->medge) MEM_freeN(me->medge);
-
- me->tface = NULL;
- me->mcol = NULL;
- me->medge = NULL;
-
- if (dlm->totvert!=me->totvert) {
- if (me->msticky) MEM_freeN(me->msticky);
- me->msticky = NULL;
-
- if (me->dvert) free_dverts(me->dvert, me->totvert);
- me->dvert = NULL;
-
- if(me->key) me->key->id.us--;
- me->key = NULL;
- }
-
- me->totface= dlm->totface;
- me->totvert= dlm->totvert;
- me->totedge= 0;
-
- me->mvert= dlm->mvert;
- me->mface= dlm->mface;
- if (dlm->tface)
- me->tface= dlm->tface;
- if (dlm->mcol)
- me->mcol= dlm->mcol;
-
- if(dlm->medge) {
- me->totedge= dlm->totedge;
- me->medge= dlm->medge;
- }
-
- if (dlm->nors && !dlm->dontFreeNors) MEM_freeN(dlm->nors);
-
- MEM_freeN(dlm);
-}
-
void free_disp_elem(DispList *dl)
{
if(dl) {
@@ -524,42 +441,50 @@ static void end_fastshade_for_ob(Object *ob)
static void mesh_create_shadedColors(Render *re, Object *ob, int onlyForMesh, unsigned int **col1_r, unsigned int **col2_r)
{
Mesh *me= ob->data;
- int dmNeedsFree;
DerivedMesh *dm;
- DispListMesh *dlm;
+ MCol *mcol;
+ MVert *mvert;
+ MFace *mface;
+ MTFace *mtface;
unsigned int *col1, *col2;
- float *orco, *vnors, imat[3][3], mat[4][4], vec[3];
- int a, i, need_orco;
+ float *orco, *vnors, *nors, imat[3][3], mat[4][4], vec[3];
+ int a, i, need_orco, totface, totvert;
init_fastshade_for_ob(re, ob, &need_orco, mat, imat);
- if (need_orco) {
- orco = mesh_create_orco(ob);
- } else {
- orco = NULL;
- }
+ orco = (need_orco)? mesh_create_orco(ob): NULL;
+
+ if (onlyForMesh)
+ dm = mesh_get_derived_deform(ob);
+ else
+ dm = mesh_get_derived_final(ob);
+
+ mvert = dm->getVertArray(dm);
+ mface = dm->getFaceArray(dm);
+ mcol = dm->getFaceDataArray(dm, CD_MCOL);
+ mtface = dm->getFaceDataArray(dm, CD_MTFACE);
+ nors = dm->getFaceDataArray(dm, CD_NORMAL);
+ totvert = dm->getNumVerts(dm);
+ totface = dm->getNumFaces(dm);
if (onlyForMesh) {
- dm = mesh_get_derived_deform(ob, &dmNeedsFree);
+ col1 = *col1_r;
+ col2 = NULL;
} else {
- dm = mesh_get_derived_final(ob, &dmNeedsFree);
- }
- dlm= dm->convertToDispListMesh(dm, 1);
+ *col1_r = col1 = MEM_mallocN(sizeof(*col1)*totface*4, "col1");
- col1 = MEM_mallocN(sizeof(*col1)*dlm->totface*4, "col1");
- if (col2_r && (me->flag & ME_TWOSIDED)) {
- col2 = MEM_mallocN(sizeof(*col2)*dlm->totface*4, "col1");
- } else {
- col2 = NULL;
+ if (col2_r && (me->flag & ME_TWOSIDED))
+ col2 = MEM_mallocN(sizeof(*col2)*totface*4, "col1");
+ else
+ col2 = NULL;
+
+ if (col2_r) *col2_r = col2;
}
-
- *col1_r = col1;
- if (col2_r) *col2_r = col2;
/* vertexnormals */
- vnors= MEM_mallocN(dlm->totvert*3*sizeof(float), "vnors disp");
- for (a=0; a<dlm->totvert; a++) {
- MVert *mv = &dlm->mvert[a];
+ vnors= MEM_mallocN(totvert*3*sizeof(float), "vnors disp");
+ for (a=0; a<totvert; a++) {
+ MVert *mv = &mvert[a];
float *vn= &vnors[a*3];
float xn= mv->no[0];
float yn= mv->no[1];
@@ -572,9 +497,9 @@ static void mesh_create_shadedColors(Render *re, Object *ob, int onlyForMesh, un
Normalise(vn);
}
- for (i=0; i<dlm->totface; i++) {
- MFace *mf= &dlm->mface[i];
- TFace *tface= dlm->tface?&dlm->tface[i]:NULL;
+ for (i=0; i<totface; i++) {
+ MFace *mf= &mface[i];
+ MTFace *tface= (mtface)? &mtface[i]: NULL;
Material *ma= give_current_material(ob, mf->mat_nr+1);
int j, vidx[4], nverts= mf->v4?4:3;
unsigned char *col1base= (unsigned char*) &col1[i*4];
@@ -584,26 +509,20 @@ static void mesh_create_shadedColors(Render *re, Object *ob, int onlyForMesh, un
if(ma==NULL) ma= &defmaterial;
- if (dlm->tface) {
- mcolbase = (unsigned char*) dlm->tface[i].col;
- } else if (dlm->mcol) {
- mcolbase = (unsigned char*) &dlm->mcol[i*4];
- } else {
- mcolbase = NULL;
- }
+ mcolbase = (mcol)? (unsigned char*)&mcol[i*4]: NULL;
vidx[0]= mf->v1;
vidx[1]= mf->v2;
vidx[2]= mf->v3;
vidx[3]= mf->v4;
- if (dlm->nors) {
- VECCOPY(nor, &dlm->nors[i*3]);
+ if (nors) {
+ VECCOPY(nor, &nors[i*3]);
} else {
if (mf->v4)
- CalcNormFloat4(dlm->mvert[mf->v1].co, dlm->mvert[mf->v2].co, dlm->mvert[mf->v3].co, dlm->mvert[mf->v4].co, nor);
+ CalcNormFloat4(mvert[mf->v1].co, mvert[mf->v2].co, mvert[mf->v3].co, mvert[mf->v4].co, nor);
else
- CalcNormFloat(dlm->mvert[mf->v1].co, dlm->mvert[mf->v2].co, dlm->mvert[mf->v3].co, nor);
+ CalcNormFloat(mvert[mf->v1].co, mvert[mf->v2].co, mvert[mf->v3].co, nor);
}
n1[0]= imat[0][0]*nor[0]+imat[0][1]*nor[1]+imat[0][2]*nor[2];
@@ -612,7 +531,7 @@ static void mesh_create_shadedColors(Render *re, Object *ob, int onlyForMesh, un
Normalise(n1);
for (j=0; j<nverts; j++) {
- MVert *mv= &dlm->mvert[vidx[j]];
+ MVert *mv= &mvert[vidx[j]];
char *col1= (char*)&col1base[j*4];
char *col2= (char*)(col2base?&col2base[j*4]:NULL);
char *mcol= (char*)(mcolbase?&mcolbase[j*4]:NULL);
@@ -628,13 +547,11 @@ static void mesh_create_shadedColors(Render *re, Object *ob, int onlyForMesh, un
}
}
MEM_freeN(vnors);
- displistmesh_free(dlm);
- if (orco) {
+ if (orco)
MEM_freeN(orco);
- }
- if (dmNeedsFree) dm->release(dm);
+ dm->release(dm);
end_fastshade_for_ob(ob);
}
@@ -642,7 +559,7 @@ static void mesh_create_shadedColors(Render *re, Object *ob, int onlyForMesh, un
void shadeMeshMCol(Object *ob, Mesh *me)
{
Render *re= fastshade_get_render();
- mesh_create_shadedColors(re, ob, 1, (unsigned int**)&me->mcol, NULL);
+ mesh_create_shadedColors(re, ob, 1, (unsigned int **)&me->mcol, NULL);
}
/* has base pointer, to check for layer */
@@ -1591,43 +1508,3 @@ static void boundbox_displist(Object *ob)
}
}
-void displistmesh_add_edges(DispListMesh *dlm)
-{
- EdgeHash *eh = BLI_edgehash_new();
- EdgeHashIterator *ehi;
- int i;
-
- for (i=0; i<dlm->totface; i++) {
- MFace *mf = &dlm->mface[i];
-
- if (!BLI_edgehash_haskey(eh, mf->v1, mf->v2))
- BLI_edgehash_insert(eh, mf->v1, mf->v2, NULL);
- if (!BLI_edgehash_haskey(eh, mf->v2, mf->v3))
- BLI_edgehash_insert(eh, mf->v2, mf->v3, NULL);
-
- if (mf->v4) {
- if (!BLI_edgehash_haskey(eh, mf->v3, mf->v4))
- BLI_edgehash_insert(eh, mf->v3, mf->v4, NULL);
- if (!BLI_edgehash_haskey(eh, mf->v4, mf->v1))
- BLI_edgehash_insert(eh, mf->v4, mf->v1, NULL);
- } else {
- if (!BLI_edgehash_haskey(eh, mf->v3, mf->v1))
- BLI_edgehash_insert(eh, mf->v3, mf->v1, NULL);
- }
- }
-
- dlm->totedge = BLI_edgehash_size(eh);
- dlm->medge = MEM_callocN(dlm->totedge*sizeof(*dlm->medge), "medge");
-
- ehi = BLI_edgehashIterator_new(eh);
- for (i=0; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) {
- MEdge *med = &dlm->medge[i++];
-
- BLI_edgehashIterator_getKey(ehi, (int*)&med->v1, (int*)&med->v2);
-
- med->flag = ME_EDGEDRAW|ME_EDGERENDER;
- }
- BLI_edgehashIterator_free(ehi);
-
- BLI_edgehash_free(eh, NULL);
-}
diff --git a/source/blender/blenkernel/intern/exotic.c b/source/blender/blenkernel/intern/exotic.c
index 140d01ec578..5c37f6b901f 100644
--- a/source/blender/blenkernel/intern/exotic.c
+++ b/source/blender/blenkernel/intern/exotic.c
@@ -120,6 +120,7 @@
#include "BKE_displist.h"
#include "BKE_DerivedMesh.h"
#include "BKE_curve.h"
+#include "BKE_customdata.h"
#include "BPY_extern.h"
@@ -297,10 +298,12 @@ static void read_stl_mesh_binary(char *str)
ob= add_object(OB_MESH);
me= ob->data;
- me->mvert = vertdata;
- me->mface = facedata;
- me->totface = totface;
me->totvert = totvert;
+ me->totface = totface;
+ me->mvert = CustomData_add_layer(&me->vdata, CD_MVERT, 0,
+ vertdata, totvert);
+ me->mface = CustomData_add_layer(&me->fdata, CD_MFACE, 0,
+ facedata, totface);
mesh_add_normals_flags(me);
make_edges(me, 0);
@@ -438,10 +441,13 @@ static void read_stl_mesh_ascii(char *str)
/* OK, lets create our mesh */
ob = add_object(OB_MESH);
me = ob->data;
- me->mvert = MEM_callocN(totvert*sizeof(MVert), "mverts");
- me->mface = MEM_callocN(totface*sizeof(MFace), "mface");
+
me->totface = totface;
me->totvert = totvert;
+ me->mvert = CustomData_add_layer(&me->vdata, CD_MVERT, 0,
+ NULL, totvert);
+ me->mface = CustomData_add_layer(&me->fdata, CD_MFACE, 0,
+ NULL, totface);
/* Copy vert coords and create topology */
mvert = me->mvert;
@@ -557,8 +563,10 @@ static void read_videoscape_mesh(char *str)
me->totvert= verts;
me->totface= totedge+tottria+totquad;
- me->mvert= MEM_callocN(me->totvert*sizeof(MVert), "mverts");
- if(me->totface) me->mface= MEM_callocN(me->totface*sizeof(MFace), "mface");
+ me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, 0,
+ NULL, me->totvert);
+ me->mface= CustomData_add_layer(&me->fdata, CD_MFACE, 0,
+ NULL, me->totface);
/* colors */
if(totcol) {
@@ -639,7 +647,7 @@ static void read_videoscape_mesh(char *str)
mface->v4= MIN2(nr, me->totvert-1);
}
- test_index_face(mface, NULL, NULL, poly);
+ test_index_face(mface, NULL, 0, poly);
mface++;
}
@@ -761,8 +769,11 @@ static void read_radiogour(char *str)
me->totvert= verts;
me->totface= totedge+tottria+totquad;
me->flag= 0;
- me->mvert= MEM_callocN(me->totvert*sizeof(MVert), "mverts");
- if(me->totface) me->mface= MEM_callocN(me->totface*sizeof(MFace), "mface");
+
+ me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, 0,
+ NULL, me->totvert);
+ me->mface= CustomData_add_layer(&me->fdata, CD_MFACE, 0,
+ NULL, me->totface);
/* verts */
@@ -808,7 +819,7 @@ static void read_radiogour(char *str)
mface->v4= MIN2(nr, me->totvert-1);
}
- test_index_face(mface, NULL, NULL, poly);
+ test_index_face(mface, NULL, 0, poly);
mface++;
}
@@ -2054,10 +2065,12 @@ static void displist_to_mesh(DispList *dlfirst)
printf("Import: %d vertices %d faces\n", totvert, totface);
- if(totvert) me->mvert= MEM_callocN(totvert*sizeof(MVert), "mvert");
- if(totface) me->mface= MEM_callocN(totface*sizeof(MFace), "mface");
me->totvert= totvert;
me->totface= totface;
+ me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, 0,
+ NULL, me->totvert);
+ me->mface= CustomData_add_layer(&me->fdata, CD_MFACE, 0,
+ NULL, me->totface);
maxvertidx= totvert-1;
mvert= me->mvert;
@@ -2099,7 +2112,7 @@ static void displist_to_mesh(DispList *dlfirst)
mface->v4= p3;
mface->mat_nr= colnr;
- test_index_face(mface, NULL, NULL, 4);
+ test_index_face(mface, NULL, 0, 4);
mface++;
@@ -2132,7 +2145,7 @@ static void displist_to_mesh(DispList *dlfirst)
mface->v2= startve+a*dl->nr+1;
mface->v3= startve+a*dl->nr+2;
mface->mat_nr= colnr;
- test_index_face(mface, NULL, NULL, 3);
+ test_index_face(mface, NULL, 0, 3);
mface++;
}
else {
@@ -2141,7 +2154,7 @@ static void displist_to_mesh(DispList *dlfirst)
mface->v3= startve+a*dl->nr+2;
mface->v4= startve+a*dl->nr+3;
mface->mat_nr= colnr;
- test_index_face(mface, NULL, NULL, 4);
+ test_index_face(mface, NULL, 0, 4);
mface++;
}
}
@@ -2196,7 +2209,7 @@ static void displist_to_mesh(DispList *dlfirst)
if (mface->v2>maxvertidx) mface->v2= maxvertidx;
if (mface->v3>maxvertidx) mface->v3= maxvertidx;
- test_index_face(mface, NULL, NULL, 3);
+ test_index_face(mface, NULL, 0, 3);
mface++;
idata+= 3;
}
@@ -2435,40 +2448,42 @@ int BKE_read_exotic(char *name)
char videosc_dir[160]= {0, 0};
-#define WRITEVERT(verts, ind) { \
- VECCOPY(vert, verts[(ind)].co); \
- Mat4MulVecfl(ob->obmat, vert); \
- if (G.order==B_ENDIAN) { \
- SWITCH_INT(vert[0]); \
- SWITCH_INT(vert[1]); \
- SWITCH_INT(vert[2]); \
- } \
- fwrite(vert, sizeof(float), 3, fpSTL); \
+static void write_vert_stl(Object *ob, MVert *verts, int index, FILE *fpSTL)
+{
+ float vert[3];
+
+ VECCOPY(vert, verts[(index)].co);
+ Mat4MulVecfl(ob->obmat, vert);
+
+ if (G.order==B_ENDIAN) {
+ SWITCH_INT(vert[0]);
+ SWITCH_INT(vert[1]);
+ SWITCH_INT(vert[2]);
+ }
+
+ fwrite(vert, sizeof(float), 3, fpSTL);
}
-static int write_displistmesh_stl(FILE *fpSTL, Object *ob, DispListMesh *dlm)
+static int write_derivedmesh_stl(FILE *fpSTL, Object *ob, DerivedMesh *dm)
{
-
- MFace *mface;
- int i, numfacets = 0;
+ MVert *mvert = dm->getVertArray(dm);
+ MFace *mface = dm->getFaceArray(dm);
+ int i, numfacets = 0, totface = dm->getNumFaces(dm);;
float zero[3] = {0.0f, 0.0f, 0.0f};
- float vert[3];
-
- for (i=0; i<dlm->totface; i++) {
- mface = &dlm->mface[i];
+ for (i=0; i<totface; i++, mface++) {
fwrite(zero, sizeof(float), 3, fpSTL);
- WRITEVERT(dlm->mvert, mface->v1);
- WRITEVERT(dlm->mvert, mface->v2);
- WRITEVERT(dlm->mvert, mface->v3);
+ write_vert_stl(ob, mvert, mface->v1, fpSTL);
+ write_vert_stl(ob, mvert, mface->v2, fpSTL);
+ write_vert_stl(ob, mvert, mface->v3, fpSTL);
fprintf(fpSTL, " ");
numfacets++;
if(mface->v4) { /* quad = 2 tri's */
fwrite(zero, sizeof(float), 3, fpSTL);
- WRITEVERT(dlm->mvert, mface->v1);
- WRITEVERT(dlm->mvert, mface->v3);
- WRITEVERT(dlm->mvert, mface->v4);
+ write_vert_stl(ob, mvert, mface->v1, fpSTL);
+ write_vert_stl(ob, mvert, mface->v3, fpSTL);
+ write_vert_stl(ob, mvert, mface->v4, fpSTL);
fprintf(fpSTL, " ");
numfacets++;
}
@@ -2480,14 +2495,11 @@ static int write_displistmesh_stl(FILE *fpSTL, Object *ob, DispListMesh *dlm)
static int write_object_stl(FILE *fpSTL, Object *ob, Mesh *me)
{
int numfacets = 0;
- int dmNeedsFree;
- DerivedMesh *dm = mesh_get_derived_final(ob, &dmNeedsFree);
- DispListMesh *dlm = dm->convertToDispListMesh(dm, 1);
+ DerivedMesh *dm = mesh_get_derived_final(ob);
- numfacets += write_displistmesh_stl(fpSTL, ob, dlm);
+ numfacets += write_derivedmesh_stl(fpSTL, ob, dm);
- displistmesh_free(dlm);
- if (dmNeedsFree) dm->release(dm);
+ dm->release(dm);
return numfacets;
}
@@ -2637,8 +2649,7 @@ static void write_videoscape_mesh(Object *ob, char *str)
}
}
else {
- int needsFree;
- DerivedMesh *dm = mesh_get_derived_deform(ob, &needsFree);
+ DerivedMesh *dm = mesh_get_derived_deform(ob);
me= ob->data;
@@ -2659,8 +2670,7 @@ static void write_videoscape_mesh(Object *ob, char *str)
}
}
- if (needsFree)
- dm->release(dm);
+ dm->release(dm);
}
fclose(fp);
@@ -2798,7 +2808,7 @@ static void write_mesh_vrml(FILE *fp, Mesh *me)
Material *ma;
MVert *mvert;
MFace *mface;
- TFace *tface;
+ MTFace *tface;
Image *ima;
int a, b, totcol, texind;
char str[32];
@@ -2808,8 +2818,8 @@ static void write_mesh_vrml(FILE *fp, Mesh *me)
fprintf(fp, "\tDEF %s\n", str);
fprintf(fp, "\tSeparator {\n");
- if(me->tface) {
- ima= ((TFace *)me->tface)->tpage;
+ if(me->mtface) {
+ ima= ((MTFace *)me->mtface)->tpage;
if(ima) {
fprintf(fp, "\t\tTexture2 {\n");
fprintf(fp, "\t\t\tfilename %s\n", ima->name);
@@ -2817,7 +2827,6 @@ static void write_mesh_vrml(FILE *fp, Mesh *me)
fprintf(fp, "\t\t\twrapT REPEAT \n");
fprintf(fp, "\t\t}\n");
}
- tface_to_mcol(me);
}
if(me->mcol) {
@@ -2874,13 +2883,13 @@ static void write_mesh_vrml(FILE *fp, Mesh *me)
}
}
- if(me->tface) {
+ if(me->mtface) {
fprintf(fp, "\t\tTextureCoordinate2 {\n");
fprintf(fp, "\t\t\tpoint [\n");
a= me->totface;
mface= me->mface;
- tface= me->tface;
+ tface= me->mtface;
while(a--) {
if(mface->mat_nr==b) {
fprintf(fp, "\t\t\t\t %f %f,\n", tface->uv[0][0], tface->uv[0][1]);
@@ -2909,7 +2918,7 @@ static void write_mesh_vrml(FILE *fp, Mesh *me)
}
fprintf(fp, "\t\t\t]\n");
- if(me->tface) {
+ if(me->mtface) {
fprintf(fp, "\t\t\ttextureCoordIndex [\n");
a= me->totface;
@@ -2933,12 +2942,6 @@ static void write_mesh_vrml(FILE *fp, Mesh *me)
}
fprintf(fp, "\t}\n");
-
- if(me->tface) {
- MEM_freeN(me->mcol);
- me->mcol= 0;
- }
-
}
static void write_camera_vrml(FILE *fp, Object *ob)
@@ -3637,8 +3640,8 @@ static void dxf_get_mesh(Mesh** m, Object** o, int noob)
}
me->totvert=0;
me->totface=0;
- me->mvert=NULL;
- me->mface=NULL;
+ me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, 0, NULL, 0);
+ me->mface= CustomData_add_layer(&me->fdata, CD_MFACE, 0, NULL, 0);
}
static void dxf_read_point(int noob) {
@@ -3673,7 +3676,8 @@ static void dxf_read_point(int noob) {
dxf_get_mesh(&me, &ob, noob);
me->totvert= 1;
me->mvert= MEM_callocN(me->totvert*sizeof(MVert), "mverts");
-
+ CustomData_set_layer(&me->vdata, CD_MVERT, me->mvert);
+
dxf_add_mat (ob, me, color, layname);
mvert= me->mvert;
@@ -3772,14 +3776,14 @@ static void dxf_read_line(int noob) {
memcpy(vtmp, me->mvert, (me->totvert-2)*sizeof(MVert));
MEM_freeN(me->mvert);
}
- me->mvert= vtmp;
+ me->mvert= CustomData_set_layer(&me->vdata, CD_MVERT, vtmp);
vtmp=NULL;
if(me->mface) {
memcpy(ftmp, me->mface, (me->totface-1)*sizeof(MFace));
MEM_freeN(me->mface);
}
- me->mface= ftmp;
+ me->mface= CustomData_set_layer(&me->fdata, CD_MFACE, ftmp);
ftmp=NULL;
mvert= &me->mvert[(me->totvert-2)];
@@ -3972,6 +3976,9 @@ static void dxf_read_ellipse(int noob)
me->mvert = (MVert*) MEM_callocN(me->totvert*sizeof(MVert), "mverts");
me->mface = (MFace*) MEM_callocN(me->totface*sizeof(MVert), "mface");
+ CustomData_set_layer(&me->vdata, CD_MVERT, me->mvert);
+ CustomData_set_layer(&me->fdata, CD_MFACE, me->mface);
+
printf("vertex and face buffers allocated\n");
for(v = 0; v <= tot; v++) {
@@ -4096,6 +4103,9 @@ static void dxf_read_arc(int noob)
me->mvert = (MVert*) MEM_callocN(me->totvert*sizeof(MVert), "mverts");
me->mface = (MFace*) MEM_callocN(me->totface*sizeof(MVert), "mface");
+ CustomData_set_layer(&me->vdata, CD_MVERT, me->mvert);
+ CustomData_set_layer(&me->fdata, CD_MFACE, me->mface);
+
for(v = 0; v <= tot; v++) {
epoint[0]= center[0]+dia*sin(phi);
@@ -4236,7 +4246,7 @@ static void dxf_read_polyline(int noob) {
memcpy (vtmp, me->mvert, (me->totvert-1)*sizeof(MVert));
MEM_freeN(me->mvert);
}
- me->mvert= vtmp;
+ me->mvert= CustomData_set_layer(&me->vdata, CD_MVERT, vtmp);
vtmp= NULL;
mvert= &me->mvert[me->totvert-1];
@@ -4258,7 +4268,7 @@ static void dxf_read_polyline(int noob) {
memcpy(ftmp, me->mface, oldtotface*sizeof(MFace));
MEM_freeN(me->mface);
}
- me->mface= ftmp;
+ me->mface= CustomData_set_layer(&me->fdata, CD_MFACE, ftmp);
ftmp=NULL;
mface= me->mface;
@@ -4348,7 +4358,7 @@ static void dxf_read_polyline(int noob) {
memcpy(vtmp, me->mvert, (me->totvert-1)*sizeof(MVert));
MEM_freeN(me->mvert);
}
- me->mvert= vtmp;
+ me->mvert= CustomData_set_layer(&me->vdata, CD_MVERT, vtmp);
vtmp=NULL;
mvert= &me->mvert[(me->totvert-1)];
@@ -4373,7 +4383,7 @@ static void dxf_read_polyline(int noob) {
memcpy(ftmp, me->mface, (me->totface-1)*sizeof(MFace));
MEM_freeN(me->mface);
}
- me->mface= ftmp;
+ me->mface= CustomData_set_layer(&me->fdata, CD_MFACE, ftmp);
ftmp=NULL;
mface= &(((MFace*)me->mface)[me->totface-1]);
@@ -4383,9 +4393,9 @@ static void dxf_read_polyline(int noob) {
if(vids[3] && vids[3]!=vids[0]) {
mface->v4= vids[3]-1;
- test_index_face(mface, NULL, NULL, 4);
+ test_index_face(mface, NULL, 0, 4);
}
- else test_index_face(mface, NULL, NULL, 3);
+ else test_index_face(mface, NULL, 0, 3);
mface->mat_nr= 0;
@@ -4458,9 +4468,13 @@ static void dxf_read_lwpolyline(int noob) {
me->totvert += nverts;
me->totface += nverts;
+
me->mvert = (MVert*) MEM_callocN(me->totvert*sizeof(MVert), "mverts");
me->mface = (MFace*) MEM_callocN(me->totface*sizeof(MVert), "mface");
+ CustomData_set_layer(&me->vdata, CD_MVERT, me->mvert);
+ CustomData_set_layer(&me->fdata, CD_MFACE, me->mface);
+
for (v = 0; v < nverts; v++) {
read_group(id,val);
if (id == 10) {
@@ -4668,14 +4682,14 @@ static void dxf_read_3dface(int noob)
memcpy(vtmp, me->mvert, (me->totvert-nverts)*sizeof(MVert));
MEM_freeN(me->mvert);
}
- me->mvert= vtmp;
+ me->mvert= CustomData_set_layer(&me->vdata, CD_MVERT, vtmp);
vtmp=NULL;
if(me->mface) {
memcpy(ftmp, me->mface, (me->totface-1)*sizeof(MFace));
MEM_freeN(me->mface);
}
- me->mface= ftmp;
+ me->mface= CustomData_set_layer(&me->fdata, CD_MFACE, ftmp);
ftmp=NULL;
mvert= &me->mvert[(me->totvert-nverts)];
@@ -4705,7 +4719,7 @@ static void dxf_read_3dface(int noob)
mface->mat_nr= 0;
- test_index_face(mface, NULL, NULL, nverts);
+ test_index_face(mface, NULL, 0, nverts);
hasbumped=1;
}
diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c
index 813cd428ab5..3eed967c0c9 100644
--- a/source/blender/blenkernel/intern/lattice.c
+++ b/source/blender/blenkernel/intern/lattice.c
@@ -623,7 +623,7 @@ void curve_deform_verts(Object *cuOb, Object *target, DerivedMesh *dm, float (*v
*/
if(target && target->type==OB_MESH) {
/* if there's derived data without deformverts, don't use vgroups */
- if(dm && !dm->getVertData(dm, 0, LAYERTYPE_MDEFORMVERT))
+ if(dm && !dm->getVertData(dm, 0, CD_MDEFORMVERT))
use_vgroups = 0;
else
use_vgroups = 1;
@@ -649,7 +649,7 @@ void curve_deform_verts(Object *cuOb, Object *target, DerivedMesh *dm, float (*v
INIT_MINMAX(cd.dmin, cd.dmax);
for(a = 0; a < numVerts; a++, dvert++) {
- if(dm) dvert = dm->getVertData(dm, a, LAYERTYPE_MDEFORMVERT);
+ if(dm) dvert = dm->getVertData(dm, a, CD_MDEFORMVERT);
for(j = 0; j < dvert->totweight; j++) {
if(dvert->dw[j].def_nr == index) {
@@ -662,7 +662,7 @@ void curve_deform_verts(Object *cuOb, Object *target, DerivedMesh *dm, float (*v
dvert = me->dvert;
for(a = 0; a < numVerts; a++, dvert++) {
- if(dm) dvert = dm->getVertData(dm, a, LAYERTYPE_MDEFORMVERT);
+ if(dm) dvert = dm->getVertData(dm, a, CD_MDEFORMVERT);
for(j = 0; j < dvert->totweight; j++) {
if(dvert->dw[j].def_nr == index) {
@@ -736,7 +736,7 @@ void lattice_deform_verts(Object *laOb, Object *target, DerivedMesh *dm,
*/
if(target && target->type==OB_MESH) {
/* if there's derived data without deformverts, don't use vgroups */
- if(dm && !dm->getVertData(dm, 0, LAYERTYPE_MDEFORMVERT))
+ if(dm && !dm->getVertData(dm, 0, CD_MDEFORMVERT))
use_vgroups = 0;
else
use_vgroups = 1;
@@ -758,7 +758,7 @@ void lattice_deform_verts(Object *laOb, Object *target, DerivedMesh *dm,
int j;
for(a = 0; a < numVerts; a++, dvert++) {
- if(dm) dvert = dm->getVertData(dm, a, LAYERTYPE_MDEFORMVERT);
+ if(dm) dvert = dm->getVertData(dm, a, CD_MDEFORMVERT);
for(j = 0; j < dvert->totweight; j++) {
if (dvert->dw[j].def_nr == index) {
calc_latt_deform(vertexCos[a], dvert->dw[j].weight);
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 1d443be5be2..43eb77ec867 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -57,6 +57,7 @@
#include "BDR_sculptmode.h"
+#include "BKE_customdata.h"
#include "BKE_depsgraph.h"
#include "BKE_main.h"
#include "BKE_DerivedMesh.h"
@@ -84,9 +85,7 @@
#include "multires.h"
-
-
-int update_realtime_texture(TFace *tface, double time)
+int update_realtime_texture(MTFace *tface, double time)
{
Image *ima;
int inc = 0;
@@ -125,6 +124,19 @@ int update_realtime_texture(TFace *tface, double time)
return inc;
}
+void mesh_update_customdata_pointers(Mesh *me)
+{
+ me->mvert = CustomData_get_layer(&me->vdata, CD_MVERT);
+ me->dvert = CustomData_get_layer(&me->vdata, CD_MDEFORMVERT);
+ me->msticky = CustomData_get_layer(&me->vdata, CD_MSTICKY);
+
+ me->medge = CustomData_get_layer(&me->edata, CD_MEDGE);
+
+ me->mface = CustomData_get_layer(&me->fdata, CD_MFACE);
+ me->mcol = CustomData_get_layer(&me->fdata, CD_MCOL);
+ me->mtface = CustomData_get_layer(&me->fdata, CD_MTFACE);
+}
+
/* Note: unlinking is called when me->id.us is 0, question remains how
* much unlinking of Library data in Mesh should be done... probably
* we need a more generic method, like the expand() functions in
@@ -165,14 +177,9 @@ void free_mesh(Mesh *me)
MEM_freeN(me->pv);
}
- if(me->mvert) MEM_freeN(me->mvert);
- if(me->medge) MEM_freeN(me->medge);
- if(me->mface) MEM_freeN(me->mface);
-
- if(me->tface) MEM_freeN(me->tface);
- if(me->dvert) free_dverts(me->dvert, me->totvert);
- if(me->mcol) MEM_freeN(me->mcol);
- if(me->msticky) MEM_freeN(me->msticky);
+ CustomData_free(&me->vdata, me->totvert);
+ CustomData_free(&me->edata, me->totedge);
+ CustomData_free(&me->fdata, me->totface);
if(me->mat) MEM_freeN(me->mat);
@@ -200,6 +207,7 @@ void copy_dverts(MDeformVert *dst, MDeformVert *src, int copycount)
}
}
+
void free_dverts(MDeformVert *dvert, int totvert)
{
/* Instead of freeing the verts directly,
@@ -249,26 +257,20 @@ Mesh *copy_mesh(Mesh *me)
}
id_us_plus((ID *)men->texcomesh);
- men->mvert= MEM_dupallocN(me->mvert);
- men->medge= MEM_dupallocN(me->medge);
- men->mface= MEM_dupallocN(me->mface);
- men->tface= MEM_dupallocN(me->tface);
- men->dface= NULL;
- men->mselect= NULL;
-
- if (me->dvert){
- men->dvert = MEM_mallocN (sizeof (MDeformVert)*me->totvert, "MDeformVert");
- copy_dverts(men->dvert, me->dvert, me->totvert);
- }
- if (me->tface){
+ CustomData_copy(&me->vdata, &men->vdata, CD_MASK_MESH, CD_DUPLICATE, men->totvert);
+ CustomData_copy(&me->edata, &men->edata, CD_MASK_MESH, CD_DUPLICATE, men->totedge);
+ CustomData_copy(&me->fdata, &men->fdata, CD_MASK_MESH, CD_DUPLICATE, men->totface);
+ mesh_update_customdata_pointers(men);
+
+ if (me->mtface){
/* ensure indirect linked data becomes lib-extern */
- TFace *tface= me->tface;
+ MTFace *tface= me->mtface;
for(a=0; a<me->totface; a++, tface++)
if(tface->tpage)
- id_lib_extern(tface->tpage);
+ id_lib_extern((ID*)tface->tpage);
}
- men->mcol= MEM_dupallocN(me->mcol);
- men->msticky= MEM_dupallocN(me->msticky);
+
+ men->mselect= NULL;
men->bb= MEM_dupallocN(men->bb);
@@ -284,14 +286,14 @@ Mesh *copy_mesh(Mesh *me)
void make_local_tface(Mesh *me)
{
- TFace *tface;
+ MTFace *tface;
Image *ima;
int a;
- if(me->tface==0) return;
+ if(me->mtface==0) return;
a= me->totface;
- tface= me->tface;
+ tface= me->mtface;
while(a--) {
/* special case: ima always local immediately */
@@ -325,7 +327,7 @@ void make_local_mesh(Mesh *me)
me->id.flag= LIB_LOCAL;
new_id(0, (ID *)me, 0);
- if(me->tface) make_local_tface(me);
+ if(me->mtface) make_local_tface(me);
return;
}
@@ -344,7 +346,7 @@ void make_local_mesh(Mesh *me)
me->id.flag= LIB_LOCAL;
new_id(0, (ID *)me, 0);
- if(me->tface) make_local_tface(me);
+ if(me->mtface) make_local_tface(me);
}
else if(local && lib) {
@@ -535,11 +537,9 @@ float *mesh_create_orco(Object *ob)
/* rotates the vertices of a face in case v[2] or v[3] (vertex index) is = 0.
this is necessary to make the if(mface->v4) check for quads work */
-#define UVSWAP(t, s) { SWAP(float, t[0], s[0]); SWAP(float, t[1], s[1]); }
-void test_index_face(MFace *mface, MCol *mc, TFace *tface, int nr)
+void test_index_face(MFace *mface, CustomData *fdata, int mfindex, int nr)
{
/* first test if the face is legal */
-
if(mface->v3 && mface->v3==mface->v4) {
mface->v4= 0;
nr--;
@@ -559,39 +559,22 @@ void test_index_face(MFace *mface, MCol *mc, TFace *tface, int nr)
/* prevent a zero at wrong index location */
if(nr==3) {
if(mface->v3==0) {
+ static int corner_indices[4] = {1, 2, 0, 3};
+
SWAP(int, mface->v1, mface->v2);
SWAP(int, mface->v2, mface->v3);
- if (tface) {
- UVSWAP(tface->uv[0], tface->uv[1]);
- UVSWAP(tface->uv[1], tface->uv[2]);
- SWAP(unsigned int, tface->col[0], tface->col[1]);
- SWAP(unsigned int, tface->col[1], tface->col[2]);
- }
-
- if (mc) {
- SWAP(MCol, mc[0], mc[1]);
- SWAP(MCol, mc[1], mc[2]);
- }
+ CustomData_swap(fdata, mfindex, corner_indices);
}
}
else if(nr==4) {
if(mface->v3==0 || mface->v4==0) {
+ static int corner_indices[4] = {2, 3, 0, 1};
+
SWAP(int, mface->v1, mface->v3);
SWAP(int, mface->v2, mface->v4);
-
- if (tface) {
- UVSWAP(tface->uv[0], tface->uv[2]);
- UVSWAP(tface->uv[1], tface->uv[3]);
- SWAP(unsigned int, tface->col[0], tface->col[2]);
- SWAP(unsigned int, tface->col[1], tface->col[3]);
- }
-
- if (mc) {
- SWAP(MCol, mc[0], mc[2]);
- SWAP(MCol, mc[1], mc[3]);
- }
+ CustomData_swap(fdata, mfindex, corner_indices);
}
}
}
@@ -652,7 +635,6 @@ static int vergedgesort(const void *v1, const void *v2)
return 0;
}
-
void make_edges(Mesh *me, int old)
{
MFace *mface;
@@ -669,7 +651,7 @@ void make_edges(Mesh *me, int old)
}
if(totedge==0) {
- /* flag that mesh has edges */
+ /* flag that mesh has edges */
me->medge = MEM_callocN(0, "make mesh edges");
me->totedge = 0;
return;
@@ -699,7 +681,8 @@ void make_edges(Mesh *me, int old)
}
final++;
- medge= me->medge= MEM_callocN(final*sizeof(MEdge), "make mesh edges");
+
+ medge= me->medge= CustomData_add_layer(&me->edata, CD_MEDGE, 0, NULL, final);
me->totedge= final;
for(a=totedge, ed=edsort; a>1; a--, ed++) {
@@ -736,8 +719,8 @@ void mesh_strip_loose_faces(Mesh *me)
if (me->mface[a].v3) {
if (a!=b) {
memcpy(&me->mface[b],&me->mface[a],sizeof(me->mface[b]));
- if (me->tface) memcpy(&me->tface[b],&me->tface[a],sizeof(me->tface[b]));
- if (me->mcol) memcpy(&me->mcol[b*4],&me->mcol[a*4],sizeof(me->mcol[b])*4);
+ CustomData_copy_data(&me->fdata, &me->fdata, a, b, 1);
+ CustomData_free_elem(&me->fdata, a, 1);
}
b++;
}
@@ -762,7 +745,11 @@ void mball_to_mesh(ListBase *lb, Mesh *me)
me->totvert= dl->nr;
me->totface= dl->parts;
- me->mvert=mvert= MEM_callocN(dl->nr*sizeof(MVert), "mverts");
+ mvert= CustomData_add_layer(&me->vdata, CD_MVERT, 0, NULL, dl->nr);
+ mface= CustomData_add_layer(&me->fdata, CD_MFACE, 0, NULL, dl->parts);
+ me->mvert= mvert;
+ me->mface= mface;
+
a= dl->nr;
nors= dl->nors;
verts= dl->verts;
@@ -776,7 +763,6 @@ void mball_to_mesh(ListBase *lb, Mesh *me)
verts+= 3;
}
- me->mface=mface= MEM_callocN(dl->parts*sizeof(MFace), "mface");
a= dl->parts;
index= dl->index;
while(a--) {
@@ -789,6 +775,8 @@ void mball_to_mesh(ListBase *lb, Mesh *me)
mface++;
index+= 4;
}
+
+ make_edges(me, 0); // all edges
}
}
@@ -845,8 +833,10 @@ void nurbs_to_mesh(Object *ob)
cu->mat= 0;
cu->totcol= 0;
- mvert=me->mvert= MEM_callocN(me->totvert*sizeof(MVert), "cumesh1");
- mface=me->mface= MEM_callocN(me->totface*sizeof(MFace), "cumesh2");
+ mvert= CustomData_add_layer(&me->vdata, CD_MVERT, 0, NULL, me->totvert);
+ mface= CustomData_add_layer(&me->fdata, CD_MFACE, 0, NULL, me->totface);
+ me->mvert= mvert;
+ me->mface= mface;
/* verts and faces */
vertcount= 0;
@@ -916,7 +906,7 @@ void nurbs_to_mesh(Object *ob)
mface->v2= startvert+index[1];
mface->v3= startvert+index[2];
mface->v4= 0;
- test_index_face(mface, NULL, NULL, 3);
+ test_index_face(mface, NULL, 0, 3);
mface++;
index+= 3;
@@ -964,7 +954,7 @@ void nurbs_to_mesh(Object *ob)
mface->v3= p4;
mface->v4= p2;
mface->mat_nr= (unsigned char)dl->col;
- test_index_face(mface, NULL, NULL, 4);
+ test_index_face(mface, NULL, 0, 4);
mface++;
p4= p3;
@@ -980,7 +970,7 @@ void nurbs_to_mesh(Object *ob)
}
make_edges(me, 0); // all edges
- mesh_strip_loose_faces(me);
+ mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
if(ob->data) {
free_libblock(&G.main->curve, ob->data);
@@ -1002,49 +992,6 @@ void nurbs_to_mesh(Object *ob)
}
-MCol *tface_to_mcol_p(TFace *tface, int totface)
-{
- unsigned int *mcol, *mcoldata;
- int a;
-
- mcol= mcoldata= MEM_mallocN(4*sizeof(int)*totface, "nepmcol");
-
- a= totface;
- while(a--) {
- memcpy(mcol, tface->col, 16);
- mcol+= 4;
- tface++;
- }
-
- return (MCol*) mcoldata;
-}
-
-void tface_to_mcol(Mesh *me)
-{
- me->mcol = tface_to_mcol_p(me->tface, me->totface);
-}
-
-void mcol_to_tface(Mesh *me, int freedata)
-{
- TFace *tface;
- unsigned int *mcol;
- int a;
-
- a= me->totface;
- tface= me->tface;
- mcol= (unsigned int *)me->mcol;
- while(a--) {
- memcpy(tface->col, mcol, 16);
- mcol+= 4;
- tface++;
- }
-
- if(freedata) {
- MEM_freeN(me->mcol);
- me->mcol= 0;
- }
-}
-
void mesh_delete_material_index(Mesh *me, int index) {
int i;
@@ -1077,7 +1024,7 @@ void mesh_calc_normals(MVert *mverts, int numVerts, MFace *mfaces, int numFaces,
float (*tnorms)[3]= MEM_callocN(numVerts*sizeof(*tnorms), "tnorms");
float *fnors= MEM_mallocN(sizeof(*fnors)*3*numFaces, "meshnormals");
int i;
-
+
for (i=0; i<numFaces; i++) {
MFace *mf= &mfaces[i];
float *f_no= &fnors[i*3];
@@ -1160,12 +1107,12 @@ struct UvVertMap {
struct UvMapVert *buf;
};
-UvVertMap *make_uv_vert_map(struct MFace *mface, struct TFace *tface, unsigned int totface, unsigned int totvert, int selected, float *limit)
+UvVertMap *make_uv_vert_map(struct MFace *mface, struct MTFace *tface, unsigned int totface, unsigned int totvert, int selected, float *limit)
{
UvVertMap *vmap;
UvMapVert *buf;
MFace *mf;
- TFace *tf;
+ MTFace *tf;
unsigned int a;
int i, totuv, nverts;
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index bc805bf1322..3b71f3e1bd8 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -93,77 +93,6 @@
#include "RE_shader_ext.h"
-/* helper function for modifiers - usage is of this is discouraged, but
- avoids duplicate modifier code for DispListMesh and EditMesh */
-
-DispListMesh *displistmesh_from_editmesh(EditMesh *em)
-{
- DispListMesh *outDLM = MEM_callocN(sizeof(*outDLM), "em_mod_dlm");
- EditVert *eve, *preveve;
- EditEdge *eed;
- EditFace *efa;
- int i;
-
- for (i=0,eve=em->verts.first; eve; eve= eve->next)
- eve->prev = (EditVert*) i++;
-
- outDLM->totvert = BLI_countlist(&em->verts);
- outDLM->totedge = BLI_countlist(&em->edges);
- outDLM->totface = BLI_countlist(&em->faces);
-
- outDLM->mvert = MEM_mallocN(sizeof(*outDLM->mvert)*outDLM->totvert,
- "em_mod_mv");
- outDLM->medge = MEM_mallocN(sizeof(*outDLM->medge)*outDLM->totedge,
- "em_mod_med");
- outDLM->mface = MEM_mallocN(sizeof(*outDLM->mface)*outDLM->totface,
- "em_mod_mf");
-
- /* Need to be able to mark loose edges */
- for (eed=em->edges.first; eed; eed=eed->next) {
- eed->f2 = 0;
- }
- for (efa=em->faces.first; efa; efa=efa->next) {
- efa->e1->f2 = 1;
- efa->e2->f2 = 1;
- efa->e3->f2 = 1;
- if (efa->e4) efa->e4->f2 = 1;
- }
-
- for (i=0,eve=em->verts.first; i<outDLM->totvert; i++,eve=eve->next) {
- MVert *mv = &outDLM->mvert[i];
-
- VECCOPY(mv->co, eve->co);
- mv->mat_nr = 0;
- mv->flag = 0;
- }
- for (i=0,eed=em->edges.first; i<outDLM->totedge; i++,eed=eed->next) {
- MEdge *med = &outDLM->medge[i];
-
- med->v1 = (int) eed->v1->prev;
- med->v2 = (int) eed->v2->prev;
- med->crease = (unsigned char) (eed->crease*255.0f);
- med->flag = ME_EDGEDRAW | ME_EDGERENDER;
-
- if (eed->seam) med->flag |= ME_SEAM;
- if (!eed->f2) med->flag |= ME_LOOSEEDGE;
- }
- for (i=0,efa=em->faces.first; i<outDLM->totface; i++,efa=efa->next) {
- MFace *mf = &outDLM->mface[i];
- mf->v1 = (int) efa->v1->prev;
- mf->v2 = (int) efa->v2->prev;
- mf->v3 = (int) efa->v3->prev;
- mf->v4 = efa->v4?(int) efa->v4->prev:0;
- mf->mat_nr = efa->mat_nr;
- mf->flag = efa->flag;
- test_index_face(mf, NULL, NULL, efa->v4?4:3);
- }
-
- for (preveve=NULL, eve=em->verts.first; eve; preveve=eve, eve= eve->next)
- eve->prev = preveve;
-
- return outDLM;
-}
-
/***/
static int noneModifier_isDisabled(ModifierData *md)
@@ -569,8 +498,6 @@ static DerivedMesh *buildModifier_applyModifier(ModifierData *md, Object *ob,
for(i = 0; i < numFaces; ++i) {
MFace source;
MFace *dest;
- TFace *tf;
- MCol *mc;
int orig_v4;
dm->getFace(dm, faceMap[i], &source);
@@ -587,9 +514,7 @@ static DerivedMesh *buildModifier_applyModifier(ModifierData *md, Object *ob,
DM_copy_face_data(dm, result, faceMap[i], i, 1);
*dest = source;
- tf = DM_get_face_data(result, i, LAYERTYPE_TFACE);
- mc = DM_get_face_data(result, i, LAYERTYPE_MCOL);
- test_index_face(dest, mc, tf, (orig_v4 ? 4 : 3));
+ test_index_face(dest, &result->faceData, i, (orig_v4 ? 4 : 3));
}
CDDM_calc_normals(result);
@@ -767,7 +692,7 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
indexMap = MEM_callocN(sizeof(*indexMap) * dm->getNumVerts(dm),
"indexmap");
- src_mvert = dm->dupVertArray(dm);
+ src_mvert = dm->getVertArray(dm);
maxVerts = dm->getNumVerts(dm);
@@ -976,17 +901,12 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
mface = CDDM_get_faces(result);
for (i=0; i < maxFaces; i++) {
MFace inMF;
- TFace *tf;
- MCol *mc;
MFace *mf = &mface[numFaces];
dm->getFace(dm, i, &inMF);
DM_copy_face_data(dm, result, i, numFaces, 1);
- tf = DM_get_face_data(result, numFaces, LAYERTYPE_TFACE);
- mc = DM_get_face_data(result, numFaces, LAYERTYPE_MCOL);
*mf = inMF;
- numFaces++;
mf->v1 = indexMap[inMF.v1].new;
mf->v2 = indexMap[inMF.v2].new;
@@ -1006,7 +926,8 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
if(inMF.v4 && indexMap[inMF.v4].merge_final)
mf->v4 = calc_mapping(indexMap, indexMap[inMF.v4].merge, count-2);
- test_index_face(mf, mc, tf, inMF.v4?4:3);
+ test_index_face(mf, &result->faceData, numFaces, inMF.v4?4:3);
+ numFaces++;
/* if the face has fewer than 3 vertices, don't create it */
if(mf->v3 == 0) {
@@ -1019,10 +940,7 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
MFace *mf2 = &mface[numFaces];
DM_copy_face_data(dm, result, i, numFaces, 1);
- tf = DM_get_face_data(result, numFaces, LAYERTYPE_TFACE);
- mc = DM_get_face_data(result, numFaces, LAYERTYPE_MCOL);
*mf2 = *mf;
- numFaces++;
mf2->v1 = calc_mapping(indexMap, inMF.v1, j);
mf2->v2 = calc_mapping(indexMap, inMF.v2, j);
@@ -1030,7 +948,8 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
if (inMF.v4)
mf2->v4 = calc_mapping(indexMap, inMF.v4, j);
- test_index_face(mf2, mc, tf, inMF.v4?4:3);
+ test_index_face(mf2, &result->faceData, numFaces, inMF.v4?4:3);
+ numFaces++;
/* if the face has fewer than 3 vertices, don't create it */
if(mf2->v3 == 0) {
@@ -1040,12 +959,11 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
}
}
- MEM_freeN(src_mvert);
MEM_freeN(indexMap);
- CDDM_set_num_verts(result, numVerts);
- CDDM_set_num_edges(result, numEdges);
- CDDM_set_num_faces(result, numFaces);
+ CDDM_lower_num_verts(result, numVerts);
+ CDDM_lower_num_edges(result, numEdges);
+ CDDM_lower_num_faces(result, numFaces);
return result;
}
@@ -1189,12 +1107,10 @@ static DerivedMesh *mirrorModifier__doMirror(MirrorModifierData *mmd,
|| indexMap[inMF.v3][1]
|| (mf->v4 && indexMap[inMF.v4][1])) {
MFace *mf2 = CDDM_get_face(result, numFaces);
- TFace *tf = DM_get_face_data(result, numFaces, LAYERTYPE_TFACE);
- MCol *mc = DM_get_face_data(result, numFaces, LAYERTYPE_MCOL);
+ static int corner_indices[4] = {2, 1, 0, 3};
DM_copy_face_data(dm, result, i, numFaces, 1);
*mf2 = *mf;
- numFaces++;
mf2->v1 += indexMap[inMF.v1][1];
mf2->v2 += indexMap[inMF.v2][1];
@@ -1203,23 +1119,18 @@ static DerivedMesh *mirrorModifier__doMirror(MirrorModifierData *mmd,
/* Flip face normal */
SWAP(int, mf2->v1, mf2->v3);
- if(tf) {
- SWAP(unsigned int, tf->col[0], tf->col[2]);
- SWAP(float, tf->uv[0][0], tf->uv[2][0]);
- SWAP(float, tf->uv[0][1], tf->uv[2][1]);
- } else if (mc) {
- SWAP(MCol, mc[0], mc[2]);
- }
+ DM_swap_face_data(result, numFaces, corner_indices);
- test_index_face(mf2, mc, tf, inMF.v4?4:3);
+ test_index_face(mf2, &result->faceData, numFaces, inMF.v4?4:3);
+ numFaces++;
}
}
MEM_freeN(indexMap);
- CDDM_set_num_verts(result, numVerts);
- CDDM_set_num_edges(result, numEdges);
- CDDM_set_num_faces(result, numFaces);
+ CDDM_lower_num_verts(result, numVerts);
+ CDDM_lower_num_edges(result, numEdges);
+ CDDM_lower_num_faces(result, numFaces);
return result;
}
@@ -1287,8 +1198,8 @@ typedef struct SmoothMesh {
/* Mesh data for edgesplit operation */
typedef struct SmoothVert {
LinkNode *faces; /* all faces which use this vert */
- int oldIndex; /* the index of the original DispListMesh vert */
- int newIndex; /* the index of the new DispListMesh vert */
+ int oldIndex; /* the index of the original DerivedMesh vert */
+ int newIndex; /* the index of the new DerivedMesh vert */
} SmoothVert;
static SmoothVert *smoothvert_copy(SmoothVert *vert, SmoothMesh *mesh)
@@ -1317,9 +1228,9 @@ static void smoothvert_free(void *vert)
typedef struct SmoothEdge {
SmoothVert *verts[SMOOTHEDGE_NUM_VERTS]; /* the verts used by this edge */
LinkNode *faces; /* all faces which use this edge */
- int oldIndex; /* the index of the original DispListMesh edge */
- int newIndex; /* the index of the new DispListMesh edge */
- short flag; /* the flags from the original DispListMesh edge */
+ int oldIndex; /* the index of the original DerivedMesh edge */
+ int newIndex; /* the index of the new DerivedMesh edge */
+ short flag; /* the flags from the original DerivedMesh edge */
} SmoothEdge;
static void smoothedge_free(void *edge)
@@ -1358,8 +1269,8 @@ typedef struct SmoothFace {
SmoothEdge *edges[SMOOTHFACE_MAX_EDGES]; /* nonexistent edges == NULL */
int flip[SMOOTHFACE_MAX_EDGES]; /* 1 = flip edge dir, 0 = don't flip */
float normal[3]; /* the normal of this face */
- int oldIndex; /* the index of the original DispListMesh face */
- int newIndex; /* the index of the new DispListMesh face */
+ int oldIndex; /* the index of the original DerivedMesh face */
+ int newIndex; /* the index of the new DerivedMesh face */
} SmoothFace;
static void smoothface_free(void *face)
@@ -2347,12 +2258,12 @@ static void get_texture_coords(DisplaceModifierData *dmd, Object *ob,
/* UVs need special handling, since they come from faces */
if(texmapping == MOD_DISP_MAP_UV) {
- if(dm->getFaceDataArray(dm, LAYERTYPE_TFACE)) {
- MFace *mface = dm->dupFaceArray(dm);
+ if(dm->getFaceDataArray(dm, CD_MTFACE)) {
+ MFace *mface = dm->getFaceArray(dm);
MFace *mf;
char *done = MEM_callocN(sizeof(*done) * numVerts,
"get_texture_coords done");
- TFace *tf = dm->getFaceDataArray(dm, LAYERTYPE_TFACE);
+ MTFace *tf = dm->getFaceDataArray(dm, CD_MTFACE);
int numFaces = dm->getNumFaces(dm);
/* verts are given the UV from the first face that uses them */
@@ -2390,7 +2301,6 @@ static void get_texture_coords(DisplaceModifierData *dmd, Object *ob,
}
MEM_freeN(done);
- MEM_freeN(mface);
return;
} else /* if there are no UVs, default to local */
texmapping = MOD_DISP_MAP_LOCAL;
@@ -2456,7 +2366,7 @@ static void displaceModifier_do(
mvert = CDDM_get_verts(dm);
if(defgrp_index >= 0)
- dvert = dm->getVertDataArray(dm, LAYERTYPE_MDEFORMVERT);
+ dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
tex_co = MEM_callocN(sizeof(*tex_co) * numVerts,
"displaceModifier_do tex_co");
@@ -2514,7 +2424,7 @@ static void displaceModifier_deformVerts(
DerivedMesh *dm;
if(derivedData) dm = CDDM_copy(derivedData);
- else if(ob->type==OB_MESH) dm = CDDM_from_mesh(ob->data);
+ else if(ob->type==OB_MESH) dm = CDDM_from_mesh(ob->data, ob);
else return;
CDDM_apply_vert_coords(dm, vertexCos);
@@ -2620,8 +2530,7 @@ static DerivedMesh *uvprojectModifier_do(UVProjectModifierData *umd,
Object *ob, DerivedMesh *dm)
{
float (*coords)[3], (*co)[3];
- TFace *tface;
- MCol *mcol = NULL;
+ MTFace *tface;
int i, numVerts, numFaces;
Image *image = umd->image;
MFace *mface, *mf;
@@ -2633,16 +2542,15 @@ static DerivedMesh *uvprojectModifier_do(UVProjectModifierData *umd,
if(umd->projectors[i])
projectors[num_projectors++].ob = umd->projectors[i];
- tface = dm->getFaceDataArray(dm, LAYERTYPE_TFACE);
+ tface = dm->getFaceDataArray(dm, CD_MTFACE);
if(num_projectors == 0) return dm;
if(!tface) {
if(!(umd->flags & MOD_UVPROJECT_ADDUVS)) return dm;
- DM_add_face_layer(dm, LAYERTYPE_TFACE, 0, NULL);
- tface = dm->getFaceDataArray(dm, LAYERTYPE_TFACE);
- mcol = dm->getFaceDataArray(dm, LAYERTYPE_MCOL);
+ DM_add_face_layer(dm, CD_MTFACE, 0, NULL);
+ tface = dm->getFaceDataArray(dm, CD_MTFACE);
new_tfaces = 1;
}
@@ -2688,7 +2596,7 @@ static DerivedMesh *uvprojectModifier_do(UVProjectModifierData *umd,
}
}
- mface = dm->dupFaceArray(dm);
+ mface = dm->getFaceArray(dm);
numFaces = dm->getNumFaces(dm);
/* apply coords as UVs, and apply image if tfaces are new */
@@ -2764,20 +2672,12 @@ static DerivedMesh *uvprojectModifier_do(UVProjectModifierData *umd,
}
if(new_tfaces) {
- /* make sure we don't overwrite vert colours */
- if(mcol) {
- memcpy(tface->col, mcol, 16); /* based on mcol_to_tface() */
- mcol += 4;
- } else
- memset(tface->col, 0xFF, 16);
-
tface->mode = TF_TEX;
if(image)
tface->tpage = image;
}
}
- MEM_freeN(mface);
MEM_freeN(coords);
return dm;
@@ -2824,19 +2724,17 @@ static DerivedMesh *decimateModifier_applyModifier(
int useRenderParams, int isFinalCalc)
{
DecimateModifierData *dmd = (DecimateModifierData*) md;
- DerivedMesh *dm = derivedData;
+ DerivedMesh *dm = derivedData, *result = NULL;
MVert *mvert;
MFace *mface;
- DispListMesh *ndlm=NULL, *dlm=NULL;
LOD_Decimation_Info lod;
int totvert, totface;
int a, numTris;
- dlm = dm->convertToDispListMesh(dm, 1);
- mvert = dlm->mvert;
- mface = dlm->mface;
- totvert = dlm->totvert;
- totface = dlm->totface;
+ mvert = dm->getVertArray(dm);
+ mface = dm->getFaceArray(dm);
+ totvert = dm->getNumVerts(dm);
+ totface = dm->getNumFaces(dm);
numTris = 0;
for (a=0; a<totface; a++) {
@@ -2894,57 +2792,50 @@ static DerivedMesh *decimateModifier_applyModifier(
if( LOD_CollapseEdge(&lod)==0) break;
}
- ndlm= MEM_callocN(sizeof(DispListMesh), "dispmesh");
- ndlm->mvert= MEM_callocN(lod.vertex_num*sizeof(MVert), "mvert");
- ndlm->totvert= lod.vertex_num;
if(lod.vertex_num>2) {
- ndlm->mface= MEM_callocN(lod.face_num*sizeof(MFace), "mface");
- ndlm->totface= dmd->faceCount = lod.face_num;
+ result = CDDM_new(lod.vertex_num, 0, lod.face_num);
+ dmd->faceCount = lod.face_num;
}
+ else
+ result = CDDM_new(lod.vertex_num, 0, 0);
+
+ mvert = CDDM_get_verts(result);
for(a=0; a<lod.vertex_num; a++) {
- MVert *mv = &ndlm->mvert[a];
+ MVert *mv = &mvert[a];
float *vbCo = &lod.vertex_buffer[a*3];
VECCOPY(mv->co, vbCo);
}
if(lod.vertex_num>2) {
+ mface = CDDM_get_faces(result);
for(a=0; a<lod.face_num; a++) {
- MFace *mf = &ndlm->mface[a];
+ MFace *mf = &mface[a];
int *tri = &lod.triangle_index_buffer[a*3];
mf->v1 = tri[0];
mf->v2 = tri[1];
mf->v3 = tri[2];
- test_index_face(mf, NULL, NULL, 3);
+ test_index_face(mf, NULL, 0, 3);
}
- displistmesh_add_edges(ndlm);
}
+
+ CDDM_calc_edges(result);
+ CDDM_calc_normals(result);
}
- else {
+ else
modifier_setError(md, "Out of memory.");
- }
LOD_FreeDecimationData(&lod);
}
- else {
+ else
modifier_setError(md, "Non-manifold mesh as input.");
- }
MEM_freeN(lod.vertex_buffer);
MEM_freeN(lod.vertex_normal_buffer);
MEM_freeN(lod.triangle_index_buffer);
exit:
- if (dlm) displistmesh_free(dlm);
-
- if (ndlm) {
- mesh_calc_normals(ndlm->mvert, ndlm->totvert, ndlm->mface,
- ndlm->totface, &ndlm->nors);
-
- return derivedmesh_from_displistmesh(ndlm, NULL);
- } else {
- return NULL;
- }
+ return result;
}
/* Wave */
@@ -3216,13 +3107,13 @@ static void hookModifier_deformVerts(
/* if DerivedMesh is present and has original index data,
* use it
*/
- if(dm && dm->getVertData(dm, 0, LAYERTYPE_ORIGINDEX)) {
+ if(dm && dm->getVertData(dm, 0, CD_ORIGINDEX)) {
int j;
int orig_index;
for(j = 0; j < numVerts; ++j) {
fac = hmd->force;
orig_index = *(int *)dm->getVertData(dm, j,
- LAYERTYPE_ORIGINDEX);
+ CD_ORIGINDEX);
if(orig_index == index) {
co = vertexCos[j];
if(hmd->falloff != 0.0) {
@@ -3265,7 +3156,7 @@ static void hookModifier_deformVerts(
if(!strcmp(curdef->name, hmd->name)) break;
if(dm)
- if(dm->getVertData(dm, 0, LAYERTYPE_MDEFORMVERT)) {
+ if(dm->getVertData(dm, 0, CD_MDEFORMVERT)) {
use_dverts = 1;
maxVerts = dm->getNumVerts(dm);
} else use_dverts = 0;
@@ -3279,7 +3170,7 @@ static void hookModifier_deformVerts(
int i, j;
for(i = 0; i < maxVerts; i++, dvert++) {
- if(dm) dvert = dm->getVertData(dm, i, LAYERTYPE_MDEFORMVERT);
+ if(dm) dvert = dm->getVertData(dm, i, CD_MDEFORMVERT);
for(j = 0; j < dvert->totweight; j++) {
if(dvert->dw[j].def_nr == index) {
float fac = hmd->force*dvert->dw[j].weight;
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index f314159a9f9..c75c2a0238c 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -170,10 +170,12 @@ void object_free_modifiers(Object *ob)
void object_free_display(Object *ob)
{
if(ob->derivedDeform) {
+ ob->derivedDeform->needsFree = 1;
ob->derivedDeform->release(ob->derivedDeform);
ob->derivedDeform= NULL;
}
if(ob->derivedFinal) {
+ ob->derivedFinal->needsFree = 1;
ob->derivedFinal->release(ob->derivedFinal);
ob->derivedFinal= NULL;
}
@@ -1984,7 +1986,7 @@ void object_handle_update(Object *ob)
/* includes all keys and modifiers */
if(ob->type==OB_MESH) {
- makeDispListMesh(ob);
+ makeDerivedMesh(ob);
}
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 11e7b5b3751..23b53171ec3 100644
--- a/source/blender/blenkernel/intern/softbody.c
+++ b/source/blender/blenkernel/intern/softbody.c
@@ -71,7 +71,6 @@ variables on the UI for now
#include "BLI_arithb.h"
#include "BLI_ghash.h"
#include "BKE_curve.h"
-#include "BKE_displist.h"
#include "BKE_effect.h"
#include "BKE_global.h"
#include "BKE_key.h"
@@ -218,7 +217,7 @@ typedef struct ccd_Mesh {
-ccd_Mesh *ccd_mesh_make(Object *ob, DispListMesh *dm)
+ccd_Mesh *ccd_mesh_make(Object *ob, DerivedMesh *dm)
{
ccd_Mesh *pccd_M = NULL;
ccdf_minmax *mima =NULL;
@@ -228,11 +227,11 @@ ccd_Mesh *ccd_mesh_make(Object *ob, DispListMesh *dm)
/* first some paranoia checks */
if (!dm) return NULL;
- if ((!dm->totface) || (!dm->totvert)) return NULL;
+ if (!dm->getNumVerts(dm) || !dm->getNumFaces(dm)) return NULL;
pccd_M = MEM_mallocN(sizeof(ccd_Mesh),"ccd_Mesh");
- pccd_M->totvert = dm->totvert;
- pccd_M->totface = dm->totface;
+ pccd_M->totvert = dm->getNumVerts(dm);
+ pccd_M->totface = dm->getNumVerts(dm);
pccd_M->savety = CCD_SAVETY;
pccd_M->bbmin[0]=pccd_M->bbmin[1]=pccd_M->bbmin[2]=1e30f;
pccd_M->bbmax[0]=pccd_M->bbmax[1]=pccd_M->bbmax[2]=-1e30f;
@@ -243,8 +242,7 @@ ccd_Mesh *ccd_mesh_make(Object *ob, DispListMesh *dm)
hull = MAX2(ob->pd->pdef_sbift,ob->pd->pdef_sboft);
/* alloc and copy verts*/
- pccd_M->mvert = MEM_mallocN(sizeof(MVert)*pccd_M->totvert,"ccd_Mesh_Vert");
- memcpy(pccd_M->mvert,dm->mvert,sizeof(MVert)*pccd_M->totvert);
+ pccd_M->mvert = dm->dupVertArray(dm);
/* ah yeah, put the verices to global coords once */
/* and determine the ortho BB on the fly */
for(i=0; i < pccd_M->totvert; i++){
@@ -262,8 +260,7 @@ ccd_Mesh *ccd_mesh_make(Object *ob, DispListMesh *dm)
}
/* alloc and copy faces*/
- pccd_M->mface = MEM_mallocN(sizeof(MFace)*pccd_M->totface,"ccd_Mesh_Faces");
- memcpy(pccd_M->mface,dm->mface,sizeof(MFace)*pccd_M->totface);
+ pccd_M->mface = dm->dupFaceArray(dm);
/* OBBs for idea1 */
pccd_M->mima = MEM_mallocN(sizeof(ccdf_minmax)*pccd_M->totface,"ccd_Mesh_Faces_mima");
@@ -317,7 +314,7 @@ ccd_Mesh *ccd_mesh_make(Object *ob, DispListMesh *dm)
}
return pccd_M;
}
-void ccd_mesh_update(Object *ob,ccd_Mesh *pccd_M, DispListMesh *dm)
+void ccd_mesh_update(Object *ob,ccd_Mesh *pccd_M, DerivedMesh *dm)
{
ccdf_minmax *mima =NULL;
MFace *mface=NULL;
@@ -326,10 +323,10 @@ void ccd_mesh_update(Object *ob,ccd_Mesh *pccd_M, DispListMesh *dm)
/* first some paranoia checks */
if (!dm) return ;
- if ((!dm->totface) || (!dm->totvert)) return ;
+ if (!dm->getNumVerts(dm) || !dm->getNumFaces(dm)) return ;
- if ((pccd_M->totvert != dm->totvert) ||
- (pccd_M->totface != dm->totface)) return;
+ if ((pccd_M->totvert != dm->getNumVerts(dm)) ||
+ (pccd_M->totface != dm->getNumFaces(dm))) return;
pccd_M->bbmin[0]=pccd_M->bbmin[1]=pccd_M->bbmin[2]=1e30f;
pccd_M->bbmax[0]=pccd_M->bbmax[1]=pccd_M->bbmax[2]=-1e30f;
@@ -342,8 +339,7 @@ void ccd_mesh_update(Object *ob,ccd_Mesh *pccd_M, DispListMesh *dm)
if(pccd_M->mprevvert) MEM_freeN(pccd_M->mprevvert);
pccd_M->mprevvert = pccd_M->mvert;
/* alloc and copy verts*/
- pccd_M->mvert = MEM_mallocN(sizeof(MVert)*pccd_M->totvert,"ccd_Mesh_Vert");
- memcpy(pccd_M->mvert,dm->mvert,sizeof(MVert)*pccd_M->totvert);
+ pccd_M->mvert = dm->dupVertArray(dm);
/* ah yeah, put the verices to global coords once */
/* and determine the ortho BB on the fly */
for(i=0; i < pccd_M->totvert; i++){
@@ -489,27 +485,19 @@ void ccd_build_deflector_hache(Object *vertexowner,GHash *hash)
/*+++ only with deflecting set */
if(ob->pd && ob->pd->deflect && BLI_ghash_lookup(hash, ob) == 0) {
DerivedMesh *dm= NULL;
- int dmNeedsFree;
if(ob->softflag & OB_SB_COLLFINAL) { /* so maybe someone wants overkill to collide with subsurfed */
- dm = mesh_get_derived_final(ob, &dmNeedsFree);
+ dm = mesh_get_derived_final(ob);
} else {
- dm = mesh_get_derived_deform(ob, &dmNeedsFree);
+ dm = mesh_get_derived_deform(ob);
}
+
if(dm){
- DispListMesh *disp_mesh= NULL;
- ccd_Mesh *ccdmesh = NULL;
- disp_mesh = dm->convertToDispListMesh(dm, 0);
- ccdmesh=ccd_mesh_make(ob,disp_mesh);
- BLI_ghash_insert(hash, ob,ccdmesh);
+ ccd_Mesh *ccdmesh = ccd_mesh_make(ob, dm);
+ BLI_ghash_insert(hash, ob, ccdmesh);
/* we did copy & modify all we need so give 'em away again */
- if (disp_mesh) {
- displistmesh_free(disp_mesh);
- }
- if (dm) {
- if (dmNeedsFree) dm->release(dm);
- }
+ dm->release(dm);
}
}/*--- only with deflecting set */
@@ -539,29 +527,19 @@ void ccd_update_deflector_hache(Object *vertexowner,GHash *hash)
/*+++ only with deflecting set */
if(ob->pd && ob->pd->deflect) {
DerivedMesh *dm= NULL;
- int dmNeedsFree;
if(ob->softflag & OB_SB_COLLFINAL) { /* so maybe someone wants overkill to collide with subsurfed */
- dm = mesh_get_derived_final(ob, &dmNeedsFree);
+ dm = mesh_get_derived_final(ob);
} else {
- dm = mesh_get_derived_deform(ob, &dmNeedsFree);
+ dm = mesh_get_derived_deform(ob);
}
if(dm){
- DispListMesh *disp_mesh= NULL;
ccd_Mesh *ccdmesh = BLI_ghash_lookup(hash,ob);
- if (ccdmesh){
- disp_mesh = dm->convertToDispListMesh(dm, 0);
- ccd_mesh_update(ob,ccdmesh,disp_mesh);
- }
+ if (ccdmesh)
+ ccd_mesh_update(ob,ccdmesh,dm);
/* we did copy & modify all we need so give 'em away again */
- if (disp_mesh) {
- displistmesh_free(disp_mesh);
- }
- if (dm) {
- if (dmNeedsFree) dm->release(dm);
- }
-
+ dm->release(dm);
}
}/*--- only with deflecting set */
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 3b6a7dba40b..c72ac868154 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -73,10 +73,9 @@ struct CCGDerivedMesh {
DerivedMesh dm;
CCGSubSurf *ss;
- int fromEditmesh, drawInteriorEdges, useSubsurfUv;
+ int drawInteriorEdges, useSubsurfUv;
Mesh *me;
- DispListMesh *dlm;
struct {int startVert; CCGVert *vert;} *vertMap;
struct {int startVert; int startEdge; CCGEdge *edge;} *edgeMap;
@@ -265,12 +264,12 @@ static void get_face_uv_map_vert(UvVertMap *vmap, struct MFace *mf, int fi, CCGV
}
}
-static int ss_sync_from_uv(CCGSubSurf *ss, CCGSubSurf *origss, Mesh *me, DispListMesh *dlm) {
- MFace *mface = dlm?dlm->mface:me->mface;
- TFace *tface = dlm?dlm->tface:me->tface;
- MVert *mvert = dlm?dlm->mvert:me->mvert;
- int totvert = dlm?dlm->totvert:me->totvert;
- int totface = dlm?dlm->totface:me->totface;
+static int ss_sync_from_uv(CCGSubSurf *ss, CCGSubSurf *origss, DerivedMesh *dm) {
+ MFace *mface = dm->getFaceArray(dm);
+ MVert *mvert = dm->getVertArray(dm);
+ MTFace *tface = dm->getFaceDataArray(dm, CD_MTFACE);
+ int totvert = dm->getNumVerts(dm);
+ int totface = dm->getNumFaces(dm);
int i, j, seam;
UvMapVert *v;
UvVertMap *vmap;
@@ -364,7 +363,7 @@ static int ss_sync_from_uv(CCGSubSurf *ss, CCGSubSurf *origss, Mesh *me, DispLis
}
#if 0
-static unsigned int ss_getEdgeFlags(CCGSubSurf *ss, CCGEdge *e, int ssFromEditmesh, DispListMesh *dlm, MEdge *medge, TFace *tface)
+static unsigned int ss_getEdgeFlags(CCGSubSurf *ss, CCGEdge *e, int ssFromEditmesh, DispListMesh *dlm, MEdge *medge, MTFace *tface)
{
unsigned int flags = 0;
int N = ccgSubSurf_getEdgeNumFaces(ss, e);
@@ -394,402 +393,6 @@ static unsigned int ss_getEdgeFlags(CCGSubSurf *ss, CCGEdge *e, int ssFromEditme
}
#endif
-static DispListMesh *ss_to_displistmesh(CCGSubSurf *ss, CCGDerivedMesh *ccgdm, int ssFromEditmesh, int drawInteriorEdges, int useSubsurfUv, Mesh *inMe, DispListMesh *inDLM) {
- DispListMesh *dlm = MEM_callocN(sizeof(*dlm), "dlm");
- int edgeSize = ccgSubSurf_getEdgeSize(ss);
- int gridSize = ccgSubSurf_getGridSize(ss);
- int edgeBase, faceBase;
- int i, j, k, S, x, y, index;
- int vertBase = 0;
- TFace *tface = NULL;
- MEdge *medge = NULL;
- MFace *mface = NULL;
- MCol *mcol = NULL;
- CCGVertIterator *vi;
- CCGEdgeIterator *ei;
- CCGFaceIterator *fi;
- CCGFace **faceMap2, **faceMap2Uv = NULL;
- CCGEdge **edgeMap2;
- CCGVert **vertMap2;
- int totvert, totedge, totface;
- CCGSubSurf *uvss= NULL;
-
- totvert = ccgSubSurf_getNumVerts(ss);
- vertMap2 = MEM_mallocN(totvert*sizeof(*vertMap2), "vertmap");
- vi = ccgSubSurf_getVertIterator(ss);
- for (; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
- CCGVert *v = ccgVertIterator_getCurrent(vi);
-
- if (ssFromEditmesh) {
- vertMap2[ccgDM_getVertMapIndex(ccgdm,ss,v)] = v;
- } else {
- vertMap2[(int) ccgSubSurf_getVertVertHandle(ss, v)] = v;
- }
- }
- ccgVertIterator_free(vi);
-
- totedge = ccgSubSurf_getNumEdges(ss);
- edgeMap2 = MEM_mallocN(totedge*sizeof(*edgeMap2), "edgemap");
- ei = ccgSubSurf_getEdgeIterator(ss);
- for (i=0; !ccgEdgeIterator_isStopped(ei); i++,ccgEdgeIterator_next(ei)) {
- CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
-
- if (ssFromEditmesh) {
- edgeMap2[ccgDM_getEdgeMapIndex(ccgdm,ss,e)] = e;
- } else {
- edgeMap2[(int) ccgSubSurf_getEdgeEdgeHandle(ss, e)] = e;
- }
- }
-
- totface = ccgSubSurf_getNumFaces(ss);
- faceMap2 = MEM_mallocN(totface*sizeof(*faceMap2), "facemap");
- fi = ccgSubSurf_getFaceIterator(ss);
- for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
- CCGFace *f = ccgFaceIterator_getCurrent(fi);
-
- if (ssFromEditmesh) {
- faceMap2[ccgDM_getFaceMapIndex(ccgdm,ss,f)] = f;
- } else {
- faceMap2[(int) ccgSubSurf_getFaceFaceHandle(ss, f)] = f;
- }
- }
- ccgFaceIterator_free(fi);
-
- if (!ssFromEditmesh) {
- if (inDLM) {
- tface = inDLM->tface;
- medge = inDLM->medge;
- mface = inDLM->mface;
- mcol = inDLM->mcol;
- } else if (inMe) {
- tface = inMe->tface;
- medge = inMe->medge;
- mface = inMe->mface;
- mcol = inMe->mcol;
- }
- }
-
- dlm->totvert = ccgSubSurf_getNumFinalVerts(ss);
- dlm->totedge = ccgSubSurf_getNumFinalEdges(ss);
- dlm->totface = ccgSubSurf_getNumFinalFaces(ss);
-
- dlm->mvert = MEM_callocN(dlm->totvert*sizeof(*dlm->mvert), "dlm->mvert");
- dlm->medge = MEM_callocN(dlm->totedge*sizeof(*dlm->medge), "dlm->medge");
- dlm->mface = MEM_callocN(dlm->totface*sizeof(*dlm->mface), "dlm->mface");
- if (!ssFromEditmesh && tface) {
- dlm->tface = MEM_callocN(dlm->totface*sizeof(*dlm->tface), "dlm->tface");
- dlm->mcol = NULL;
- } else if (!ssFromEditmesh && mcol) {
- dlm->tface = NULL;
- dlm->mcol = MEM_mallocN(dlm->totface*4*sizeof(*dlm->mcol), "dlm->mcol");
- } else {
- dlm->tface = NULL;
- dlm->mcol = NULL;
- }
-
-
- if (useSubsurfUv && tface) {
- /* not for editmesh currently */
- uvss= _getSubSurf(NULL, ccgSubSurf_getSubdivisionLevels(ss), 0, 1, 0);
-
- if (ss_sync_from_uv(uvss, ss, inMe, inDLM)) {
- faceMap2Uv = MEM_mallocN(totface*sizeof(*faceMap2Uv), "facemapuv");
-
- fi = ccgSubSurf_getFaceIterator(uvss);
- for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
- CCGFace *f = ccgFaceIterator_getCurrent(fi);
- faceMap2Uv[(int) ccgSubSurf_getFaceFaceHandle(uvss, f)] = f;
- }
- ccgFaceIterator_free(fi);
- }
- }
-
- /* Load vertices... we do in this funny order because
- * all "added" vertices" are required to appear first
- * in the displist (before STEPINDEX flags start). Also
- * note that the vertex with index 0 is always a face
- * center vert, this is relied upon to ensure we don't
- * need to do silly test_index_face calls.
- *
- * NOTE (artificer): The STEPINDEX flag has been removed, so this
- * funny order is no longer strictly necessary, but it works.
- */
-
- faceBase = i = 0;
- for (index=0; index<totface; index++) {
- CCGFace *f = faceMap2[index];
- int x, y, S, numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
-
- VecCopyf(dlm->mvert[i++].co, ccgSubSurf_getFaceCenterData(ss, f));
-
- for (S=0; S<numVerts; S++) {
- for (x=1; x<gridSize-1; x++) {
- VecCopyf(dlm->mvert[i++].co, ccgSubSurf_getFaceGridEdgeData(ss, f, S, x));
- }
- }
-
- for (S=0; S<numVerts; S++) {
- for (y=1; y<gridSize-1; y++) {
- for (x=1; x<gridSize-1; x++) {
- VecCopyf(dlm->mvert[i++].co, ccgSubSurf_getFaceGridData(ss, f, S, x, y));
- }
- }
- }
-
- *((int*) ccgSubSurf_getFaceUserData(ss, f)) = faceBase;
- faceBase += 1 + numVerts*((gridSize-2) + (gridSize-2)*(gridSize-2));
- }
-
- edgeBase = i;
- for (index=0; index<totedge; index++) {
- CCGEdge *e= edgeMap2[index];
- int x;
-
- for (x=1; x<edgeSize-1; x++) {
- VecCopyf(dlm->mvert[i++].co, ccgSubSurf_getEdgeData(ss, e, x));
- }
-
- *((int*) ccgSubSurf_getEdgeUserData(ss, e)) = edgeBase;
- edgeBase += edgeSize-2;
- }
-
- vertBase = i;
- for (index=0; index<totvert; index++) {
- CCGVert *v = vertMap2[index];
- VecCopyf(dlm->mvert[i].co, ccgSubSurf_getVertData(ss, v));
- *((int*) ccgSubSurf_getVertUserData(ss, v)) = i++;
- }
-
- // load edges
-
- i = 0;
- for (index=0; index<totface; index++) {
- CCGFace *f = faceMap2[index];
- int numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
-
- for (k=0; k<numVerts; k++) {
- for (x=0; x<gridSize-1; x++) {
- MEdge *med = &dlm->medge[i];
- if (drawInteriorEdges) med->flag = ME_EDGEDRAW|ME_EDGERENDER;
- med->v1 = getFaceIndex(ss, f, k, x, 0, edgeSize, gridSize);
- med->v2 = getFaceIndex(ss, f, k, x+1, 0, edgeSize, gridSize);
- i++;
- }
-
- for (x=1; x<gridSize-1; x++) {
- for (y=0; y<gridSize-1; y++) {
- MEdge *med;
-
- med = &dlm->medge[i];
- if (drawInteriorEdges) med->flag = ME_EDGEDRAW|ME_EDGERENDER;
- med->v1 = getFaceIndex(ss, f, k, x, y, edgeSize, gridSize);
- med->v2 = getFaceIndex(ss, f, k, x, y+1, edgeSize, gridSize);
- i++;
-
- med = &dlm->medge[i];
- if (drawInteriorEdges) med->flag = ME_EDGEDRAW|ME_EDGERENDER;
- med->v1 = getFaceIndex(ss, f, k, y, x, edgeSize, gridSize);
- med->v2 = getFaceIndex(ss, f, k, y+1, x, edgeSize, gridSize);
- i++;
- }
- }
- }
- }
-
- for (index=0; index<totedge; index++) {
- CCGEdge *e= edgeMap2[index];
- unsigned int flags = 0;
-
- if (!ccgSubSurf_getEdgeNumFaces(ss, e)) flags |= ME_LOOSEEDGE;
-
- if (ssFromEditmesh) {
- EditEdge *eed = ccgSubSurf_getEdgeEdgeHandle(ss, e);
-
- flags |= ME_EDGEDRAW|ME_EDGERENDER;
- if (eed->seam) {
- flags |= ME_SEAM;
- }
- } else if(medge){
- int edgeIdx = (int) ccgSubSurf_getEdgeEdgeHandle(ss, e);
-
- if (edgeIdx!=-1) {
- MEdge *origMed = &medge[edgeIdx];
-
- if (inDLM) {
- flags |= origMed->flag;
- } else {
- flags |= (origMed->flag&ME_SEAM)|ME_EDGEDRAW|ME_EDGERENDER;
- }
- }
- } else {
- flags |= ME_EDGEDRAW | ME_EDGERENDER;
- }
-
- for (x=0; x<edgeSize-1; x++) {
- MEdge *med = &dlm->medge[i];
- med->v1 = getEdgeIndex(ss, e, x, edgeSize);
- med->v2 = getEdgeIndex(ss, e, x+1, edgeSize);
- med->flag = flags;
- i++;
- }
- }
-
- // load faces
-
- i=0;
- for (index=0; index<totface; index++) {
- CCGFace *f = faceMap2[index];
- CCGFace *uvf = faceMap2Uv? faceMap2Uv[index]: NULL;
- int numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
- float edge_data[4][6];
- float corner_data[4][6];
- float center_data[6] = {0};
- int numDataComponents = 0;
- TFace *origTFace = NULL;
- int mat_nr;
- int flag;
-
- if (!ssFromEditmesh && mface) {
- int origIdx = (int) ccgSubSurf_getFaceFaceHandle(ss, f);
- MFace *origMFace = &mface[origIdx];
-
- if (tface) {
- origTFace = &tface[origIdx];
-
- for (S=0; S<numVerts; S++) {
- unsigned char *col = (unsigned char*) &origTFace->col[S];
- corner_data[S][0] = col[0]/255.0f;
- corner_data[S][1] = col[1]/255.0f;
- corner_data[S][2] = col[2]/255.0f;
- corner_data[S][3] = col[3]/255.0f;
- if (!uvf) {
- corner_data[S][4] = origTFace->uv[S][0];
- corner_data[S][5] = origTFace->uv[S][1];
- }
- }
- numDataComponents = uvf? 4: 6;
- } else if (mcol) {
- MCol *origMCol = &mcol[origIdx*4];
-
- for (S=0; S<numVerts; S++) {
- unsigned char *col = (unsigned char*) &origMCol[S];
- corner_data[S][0] = col[0]/255.0f;
- corner_data[S][1] = col[1]/255.0f;
- corner_data[S][2] = col[2]/255.0f;
- corner_data[S][3] = col[3]/255.0f;
- }
- numDataComponents = 4;
- }
-
- for (S=0; S<numVerts; S++) {
- for (k=0; k<numDataComponents; k++) {
- edge_data[S][k] = (corner_data[S][k] + corner_data[(S+1)%numVerts][k])*0.5f;
- center_data[k]+= corner_data[S][k];
- }
- }
- for (k=0; k<numDataComponents; k++) {
- center_data[k]/= numVerts;
- }
-
- mat_nr = origMFace->mat_nr;
- flag = origMFace->flag;
- } else if(ssFromEditmesh) {
- EditFace *ef = ccgSubSurf_getFaceFaceHandle(ss, f);
- mat_nr = ef->mat_nr;
- flag = ef->flag;
- } else {
- mat_nr = 0;
- flag = 0;
- }
-
- for (S=0; S<numVerts; S++) {
- int prevS= (S-1+numVerts)%numVerts;
-
- for (y=0; y<gridSize-1; y++) {
- for (x=0; x<gridSize-1; x++) {
- float smoothuv[4][3];
-
- MFace *mf = &dlm->mface[i];
- mf->v1 = getFaceIndex(ss, f, S, x+0, y+0, edgeSize, gridSize);
- mf->v2 = getFaceIndex(ss, f, S, x+0, y+1, edgeSize, gridSize);
- mf->v3 = getFaceIndex(ss, f, S, x+1, y+1, edgeSize, gridSize);
- mf->v4 = getFaceIndex(ss, f, S, x+1, y+0, edgeSize, gridSize);
- mf->mat_nr = mat_nr;
- mf->flag = flag;
-
- if(uvf) {
- VECCOPY(smoothuv[0], getFaceUV(uvss, uvf, S, x+0, y+0, edgeSize, gridSize));
- VECCOPY(smoothuv[1], getFaceUV(uvss, uvf, S, x+0, y+1, edgeSize, gridSize));
- VECCOPY(smoothuv[2], getFaceUV(uvss, uvf, S, x+1, y+1, edgeSize, gridSize));
- VECCOPY(smoothuv[3], getFaceUV(uvss, uvf, S, x+1, y+0, edgeSize, gridSize));
- }
-
- for (j=0; j<4; j++) {
- int fx = x + (j==2||j==3);
- int fy = y + (j==1||j==2);
- float x_v = (float) fx/(gridSize-1);
- float y_v = (float) fy/(gridSize-1);
- float data[6];
-
- for (k=0; k<numDataComponents; k++) {
- data[k] = (center_data[k]*(1.0f-x_v) + edge_data[S][k]*x_v)*(1.0f-y_v) +
- (edge_data[prevS][k]*(1.0f-x_v) + corner_data[S][k]*x_v)*y_v;
- }
-
- if (dlm->tface) {
- TFace *tf = &dlm->tface[i];
- unsigned char col[4];
- col[0] = (int) (data[0]*255);
- col[1] = (int) (data[1]*255);
- col[2] = (int) (data[2]*255);
- col[3] = (int) (data[3]*255);
- tf->col[j] = *((unsigned int*) col);
- if (uvf) {
- tf->uv[j][0] = smoothuv[j][0];
- tf->uv[j][1] = smoothuv[j][1];
- }
- else {
- tf->uv[j][0] = (float)(data[4]);
- tf->uv[j][1] = (float)(data[5]);
- }
- } else if (dlm->mcol) {
- unsigned char *col = (unsigned char*) &dlm->mcol[i*4+j];
- col[0] = (int) (data[0]*255);
- col[1] = (int) (data[1]*255);
- col[2] = (int) (data[2]*255);
- col[3] = (int) (data[3]*255);
- }
- }
-
- if (dlm->tface) {
- TFace *tf = &dlm->tface[i];
- tf->tpage = origTFace->tpage;
- tf->flag = origTFace->flag;
- tf->transp = origTFace->transp;
- tf->mode = origTFace->mode;
- tf->tile = origTFace->tile;
- }
-
- i++;
- }
- }
- }
- }
-
- MEM_freeN(faceMap2);
- MEM_freeN(edgeMap2);
- MEM_freeN(vertMap2);
-
- if(uvss) {
- ccgSubSurf_free(uvss);
- MEM_freeN(faceMap2Uv);
- }
-
- mesh_calc_normals(dlm->mvert, dlm->totvert, dlm->mface, dlm->totface, &dlm->nors);
-
- return dlm;
-}
-
/* face weighting - taken from Brecht's element data patch */
static void calc_ss_weights(int gridFaces,
FaceVertWeight **qweight, FaceVertWeight **tweight)
@@ -855,7 +458,7 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
MVert *mvert;
MEdge *med;
MFace *mf;
- TFace *tface;
+ MTFace *tface;
CCGSubSurf *uvss = NULL;
int *origIndex;
FaceVertWeight *qweight, *tweight;
@@ -869,11 +472,7 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
for(; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
CCGVert *v = ccgVertIterator_getCurrent(vi);
- if(ssFromEditmesh) {
- vertMap2[ccgDM_getVertMapIndex(NULL, ss, v)] = v;
- } else {
- vertMap2[(int) ccgSubSurf_getVertVertHandle(ss, v)] = v;
- }
+ vertMap2[(int) ccgSubSurf_getVertVertHandle(ss, v)] = v;
}
ccgVertIterator_free(vi);
@@ -883,11 +482,7 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
for(; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
- if(ssFromEditmesh) {
- edgeMap2[ccgDM_getEdgeMapIndex(NULL, ss, e)] = e;
- } else {
- edgeMap2[(int) ccgSubSurf_getEdgeEdgeHandle(ss, e)] = e;
- }
+ edgeMap2[(int) ccgSubSurf_getEdgeEdgeHandle(ss, e)] = e;
}
totface = ccgSubSurf_getNumFaces(ss);
@@ -896,11 +491,7 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
for(; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
CCGFace *f = ccgFaceIterator_getCurrent(fi);
- if(ssFromEditmesh) {
- faceMap2[ccgDM_getFaceMapIndex(NULL, ss, f)] = f;
- } else {
- faceMap2[(int) ccgSubSurf_getFaceFaceHandle(ss, f)] = f;
- }
+ faceMap2[(int) ccgSubSurf_getFaceFaceHandle(ss, f)] = f;
}
ccgFaceIterator_free(fi);
@@ -908,7 +499,7 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
result = CDDM_from_template(dm, ccgSubSurf_getNumFinalVerts(ss),
ccgSubSurf_getNumFinalEdges(ss),
ccgSubSurf_getNumFinalFaces(ss));
- tface = dm->getFaceDataArray(dm, LAYERTYPE_TFACE);
+ tface = dm->getFaceDataArray(dm, CD_MTFACE);
} else {
result = CDDM_new(ccgSubSurf_getNumFinalVerts(ss),
ccgSubSurf_getNumFinalEdges(ss),
@@ -917,20 +508,10 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
}
if(useSubsurfUv && tface) {
- /* slightly dodgy hack to use current ss_sync_from_uv function */
- DispListMesh dlm;
-
- dlm.mface = dm->dupFaceArray(dm);
- dlm.tface = tface;
- dlm.mvert = dm->dupVertArray(dm);
- dlm.totvert = dm->getNumVerts(dm);
- dlm.totface = dm->getNumFaces(dm);
-
- /* not for editmesh currently */
uvss = _getSubSurf(NULL, ccgSubSurf_getSubdivisionLevels(ss),
0, 1, 0);
- if(ss_sync_from_uv(uvss, ss, NULL, &dlm)) {
+ if(ss_sync_from_uv(uvss, ss, dm)) {
faceMap2Uv = MEM_mallocN(totface * sizeof(*faceMap2Uv),
"facemapuv");
@@ -941,15 +522,12 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
}
ccgFaceIterator_free(fi);
}
-
- MEM_freeN(dlm.mface);
- MEM_freeN(dlm.mvert);
}
// load verts
faceBase = i = 0;
mvert = CDDM_get_verts(result);
- origIndex = result->getVertData(result, 0, LAYERTYPE_ORIGINDEX);
+ origIndex = result->getVertData(result, 0, CD_ORIGINDEX);
for(index = 0; index < totface; index++) {
CCGFace *f = faceMap2[index];
@@ -960,10 +538,7 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
for(S = 0; S < numVerts; S++) {
CCGVert *v = ccgSubSurf_getFaceVert(ss, f, S);
- if(ssFromEditmesh)
- vertIdx[S] = ccgDM_getVertMapIndex(NULL, ss, v);
- else
- vertIdx[S] = (int)ccgSubSurf_getVertVertHandle(ss, v);
+ vertIdx[S] = (int)ccgSubSurf_getVertVertHandle(ss, v);
}
DM_interp_vert_data(dm, result, vertIdx, weight[0][0], numVerts, i);
@@ -1025,19 +600,11 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
int x;
int vertIdx[2];
- if(ssFromEditmesh) {
- CCGVert *v;
- v = ccgSubSurf_getEdgeVert0(ss, e);
- vertIdx[0] = ccgDM_getVertMapIndex(NULL, ss, v);
- v = ccgSubSurf_getEdgeVert1(ss, e);
- vertIdx[1] = ccgDM_getVertMapIndex(NULL, ss, v);
- } else {
- CCGVert *v;
- v = ccgSubSurf_getEdgeVert0(ss, e);
- vertIdx[0] = (int)ccgSubSurf_getVertVertHandle(ss, v);
- v = ccgSubSurf_getEdgeVert1(ss, e);
- vertIdx[1] = (int)ccgSubSurf_getVertVertHandle(ss, v);
- }
+ CCGVert *v;
+ v = ccgSubSurf_getEdgeVert0(ss, e);
+ vertIdx[0] = (int)ccgSubSurf_getVertVertHandle(ss, v);
+ v = ccgSubSurf_getEdgeVert1(ss, e);
+ vertIdx[1] = (int)ccgSubSurf_getVertVertHandle(ss, v);
for(x = 1; x < edgeSize - 1; x++) {
float w[2];
@@ -1060,10 +627,7 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
CCGVert *v = vertMap2[index];
int vertIdx;
- if(ssFromEditmesh)
- vertIdx = ccgDM_getVertMapIndex(NULL, ss, v);
- else
- vertIdx = (int)ccgSubSurf_getVertVertHandle(ss, v);
+ vertIdx = (int)ccgSubSurf_getVertVertHandle(ss, v);
DM_copy_vert_data(dm, result, vertIdx, i, 1);
VecCopyf(mvert->co, ccgSubSurf_getVertData(ss, v));
@@ -1078,7 +642,7 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
// load edges
i = 0;
med = CDDM_get_edges(result);
- origIndex = result->getEdgeData(result, 0, LAYERTYPE_ORIGINDEX);
+ origIndex = result->getEdgeData(result, 0, CD_ORIGINDEX);
for(index = 0; index < totface; index++) {
CCGFace *f = faceMap2[index];
@@ -1127,23 +691,13 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
if(!ccgSubSurf_getEdgeNumFaces(ss, e)) flags |= ME_LOOSEEDGE;
- if(ssFromEditmesh) {
- EditEdge *eed = ccgSubSurf_getEdgeEdgeHandle(ss, e);
-
- flags |= ME_EDGEDRAW | ME_EDGERENDER;
- if(eed->seam) {
- flags |= ME_SEAM;
- }
- if(eed->sharp) flags |= ME_SHARP;
- } else {
- int edgeIdx = (int)ccgSubSurf_getEdgeEdgeHandle(ss, e);
+ int edgeIdx = (int)ccgSubSurf_getEdgeEdgeHandle(ss, e);
- if(edgeIdx != -1 && dm) {
- MEdge origMed;
- dm->getEdge(dm, edgeIdx, &origMed);
+ if(edgeIdx != -1 && dm) {
+ MEdge origMed;
+ dm->getEdge(dm, edgeIdx, &origMed);
- flags |= origMed.flag;
- }
+ flags |= origMed.flag;
}
for(x = 0; x < edgeSize - 1; x++) {
@@ -1160,7 +714,7 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
// load faces
i = 0;
mf = CDDM_get_faces(result);
- origIndex = result->getFaceData(result, 0, LAYERTYPE_ORIGINDEX);
+ origIndex = result->getFaceData(result, 0, CD_ORIGINDEX);
for(index = 0; index < totface; index++) {
CCGFace *f = faceMap2[index];
@@ -1218,8 +772,8 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
}
if(uvf) {
- TFace *tf = DM_get_face_data(result, i,
- LAYERTYPE_TFACE);
+ MTFace *tf = DM_get_face_data(result, i,
+ CD_MTFACE);
float *newuv;
newuv = getFaceUV(uvss, uvf, S, x + 0, y + 0,
@@ -1262,77 +816,6 @@ DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
return result;
}
-static void ss_sync_from_mesh(CCGSubSurf *ss, Mesh *me, DispListMesh *dlm, float (*vertexCos)[3], int useFlatSubdiv) {
- float creaseFactor = (float) ccgSubSurf_getSubdivisionLevels(ss);
- CCGVertHDL fVerts[4];
- MVert *mvert = dlm?dlm->mvert:me->mvert;
- MEdge *medge = dlm?dlm->medge:me->medge;
- MFace *mface = dlm?dlm->mface:me->mface;
- int totvert = dlm?dlm->totvert:me->totvert;
- int totedge = dlm?dlm->totedge:me->totedge;
- int totface = dlm?dlm->totface:me->totface;
- int i, index;
-
- ccgSubSurf_initFullSync(ss);
-
- for (i=0,index=-1; i<totvert; i++) {
- CCGVert *v;
- ccgSubSurf_syncVert(ss, (CCGVertHDL) i, vertexCos?vertexCos[i]:mvert[i].co, 0, &v);
-
- if (!dlm) index++;
- ((int*) ccgSubSurf_getVertUserData(ss, v))[1] = index;
- }
-
- if (medge) {
- for (i=0, index=-1; i<totedge; i++) {
- MEdge *med = &medge[i];
- CCGEdge *e;
- float crease = useFlatSubdiv?creaseFactor:med->crease*creaseFactor/255.0f;
-
- ccgSubSurf_syncEdge(ss, (CCGEdgeHDL) i, (CCGVertHDL) med->v1, (CCGVertHDL) med->v2, crease, &e);
-
- if (!dlm) index++;
- ((int*) ccgSubSurf_getEdgeUserData(ss, e))[1] = index;
- }
- }
-
- for (i=0, index=-1; i<totface; i++) {
- MFace *mf = &((MFace*) mface)[i];
- CCGFace *f;
-
- if (!dlm) index++;
-
- fVerts[0] = (CCGVertHDL) mf->v1;
- fVerts[1] = (CCGVertHDL) mf->v2;
- fVerts[2] = (CCGVertHDL) mf->v3;
- fVerts[3] = (CCGVertHDL) mf->v4;
-
- // this is very bad, means mesh is internally consistent.
- // it is not really possible to continue without modifying
- // other parts of code significantly to handle missing faces.
- // since this really shouldn't even be possible we just bail.
- if (ccgSubSurf_syncFace(ss, (CCGFaceHDL) i, fVerts[3]?4:3, fVerts, &f)==eCCGError_InvalidValue) {
- static int hasGivenError = 0;
-
- if (!hasGivenError) {
- if (!me) {
- error("Unrecoverable error in SubSurf calculation, mesh is inconsistent.");
- } else {
- error("Unrecoverable error in SubSurf calculation, mesh(%s) is inconsistent.", me->id.name+2);
- }
-
- hasGivenError = 1;
- }
-
- return;
- }
-
- ((int*) ccgSubSurf_getFaceUserData(ss, f))[1] = index;
- }
-
- ccgSubSurf_processSync(ss);
-}
-
static void ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm,
float (*vertexCos)[3], int useFlatSubdiv)
{
@@ -1343,9 +826,9 @@ static void ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm,
int totface = dm->getNumFaces(dm);
int i;
int *index;
- MVert *mvert = dm->dupVertArray(dm);
- MEdge *medge = dm->dupEdgeArray(dm);
- MFace *mface = dm->dupFaceArray(dm);
+ MVert *mvert = dm->getVertArray(dm);
+ MEdge *medge = dm->getEdgeArray(dm);
+ MFace *mface = dm->getFaceArray(dm);
MVert *mv;
MEdge *me;
MFace *mf;
@@ -1353,7 +836,7 @@ static void ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm,
ccgSubSurf_initFullSync(ss);
mv = mvert;
- index = (int *)dm->getVertDataArray(dm, LAYERTYPE_ORIGINDEX);
+ index = (int *)dm->getVertDataArray(dm, CD_ORIGINDEX);
for(i = 0; i < totvert; i++, mv++, index++) {
CCGVert *v;
@@ -1367,7 +850,7 @@ static void ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm,
}
me = medge;
- index = (int *)dm->getEdgeDataArray(dm, LAYERTYPE_ORIGINDEX);
+ index = (int *)dm->getEdgeDataArray(dm, CD_ORIGINDEX);
for(i = 0; i < totedge; i++, me++, index++) {
CCGEdge *e;
float crease;
@@ -1382,7 +865,7 @@ static void ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm,
}
mf = mface;
- index = (int *)dm->getFaceDataArray(dm, LAYERTYPE_ORIGINDEX);
+ index = (int *)dm->getFaceDataArray(dm, CD_ORIGINDEX);
for (i = 0; i < totface; i++, mf++, index++) {
CCGFace *f;
@@ -1413,55 +896,6 @@ static void ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm,
}
ccgSubSurf_processSync(ss);
-
- MEM_freeN(mvert);
- MEM_freeN(medge);
- MEM_freeN(mface);
-}
-
-void ss_sync_from_editmesh(CCGSubSurf *ss, EditMesh *em, float (*vertCos)[3], int useFlatSubdiv)
-{
- float creaseFactor = (float) ccgSubSurf_getSubdivisionLevels(ss);
- EditVert *ev, *fVerts[4];
- EditEdge *ee;
- EditFace *ef;
- int i;
-
- ccgSubSurf_initFullSync(ss);
-
- if (vertCos) {
- for (i=0,ev=em->verts.first; ev; i++,ev=ev->next) {
- CCGVert *v;
- ccgSubSurf_syncVert(ss, ev, vertCos[i], 0, &v);
- ((int*) ccgSubSurf_getVertUserData(ss, v))[1] = i;
- }
- } else {
- for (i=0,ev=em->verts.first; ev; i++,ev=ev->next) {
- CCGVert *v;
- ccgSubSurf_syncVert(ss, ev, ev->co, 0, &v);
- ((int*) ccgSubSurf_getVertUserData(ss, v))[1] = i;
- }
- }
-
- for (i=0,ee=em->edges.first; ee; i++,ee=ee->next) {
- CCGEdge *e;
- ccgSubSurf_syncEdge(ss, ee, ee->v1, ee->v2, useFlatSubdiv?creaseFactor:ee->crease*creaseFactor, &e);
- ((int*) ccgSubSurf_getEdgeUserData(ss, e))[1] = i;
- }
-
- for (i=0,ef=em->faces.first; ef; i++,ef=ef->next) {
- CCGFace *f;
-
- fVerts[0] = ef->v1;
- fVerts[1] = ef->v2;
- fVerts[2] = ef->v3;
- fVerts[3] = ef->v4;
-
- ccgSubSurf_syncFace(ss, ef, ef->v4?4:3, (CCGVertHDL*) fVerts, &f);
- ((int*) ccgSubSurf_getFaceUserData(ss, f))[1] = i;
- }
-
- ccgSubSurf_processSync(ss);
}
/***/
@@ -1678,28 +1112,15 @@ static void ccgDM_getFinalEdge(DerivedMesh *dm, int edgeNum, MEdge *med)
med->v1 = getEdgeIndex(ss, e, x, edgeSize);
med->v2 = getEdgeIndex(ss, e, x+1, edgeSize);
- if(ccgdm->fromEditmesh) {
- EditEdge *eed = ccgSubSurf_getEdgeEdgeHandle(ss, e);
-
- flags |= ME_EDGEDRAW | ME_EDGERENDER;
- if(eed->seam) {
- flags |= ME_SEAM;
- }
- if(eed->sharp) flags |= ME_SHARP;
- } else if(ccgdm->dlm || ccgdm->me) {
+ if(ccgdm->me) {
int edgeIdx = (int) ccgSubSurf_getEdgeEdgeHandle(ss, e);
if(edgeIdx!=-1) {
- MEdge *medge = (ccgdm->dlm ? ccgdm->dlm->medge
- : ccgdm->me->medge);
+ MEdge *medge = ccgdm->me->medge;
MEdge *origMed = &medge[edgeIdx];
- if(ccgdm->dlm) {
- flags |= origMed->flag;
- } else {
- flags |= (origMed->flag & (ME_SEAM | ME_SHARP))
- | ME_EDGEDRAW | ME_EDGERENDER;
- }
+ flags |= (origMed->flag & (ME_SEAM | ME_SHARP))
+ | ME_EDGEDRAW | ME_EDGERENDER;
}
} else {
flags |= ME_EDGEDRAW | ME_EDGERENDER;
@@ -1724,7 +1145,7 @@ static void ccgDM_getFinalFace(DerivedMesh *dm, int faceNum, MFace *mf)
int grid;
int x, y;
int lastface = ccgSubSurf_getNumFaces(ss) - 1;
- int *faceFlags = dm->getFaceData(dm, faceNum, LAYERTYPE_FLAGS);
+ int *faceFlags = dm->getFaceData(dm, faceNum, CD_FLAGS);
memset(mf, 0, sizeof(*mf));
@@ -1746,11 +1167,11 @@ static void ccgDM_getFinalFace(DerivedMesh *dm, int faceNum, MFace *mf)
mf->v3 = getFaceIndex(ss, f, grid, x+1, y+1, edgeSize, gridSize);
mf->v4 = getFaceIndex(ss, f, grid, x+1, y+0, edgeSize, gridSize);
- if(faceFlags) mf->flag = *faceFlags;
+ if(faceFlags) mf->flag = faceFlags[i];
else mf->flag = ME_SMOOTH;
}
-static void ccgDM_getFinalVertArray(DerivedMesh *dm, MVert *mvert)
+static void ccgDM_copyFinalVertArray(DerivedMesh *dm, MVert *mvert)
{
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
CCGSubSurf *ss = ccgdm->ss;
@@ -1804,7 +1225,7 @@ static void ccgDM_getFinalVertArray(DerivedMesh *dm, MVert *mvert)
}
}
-static void ccgDM_getFinalEdgeArray(DerivedMesh *dm, MEdge *medge)
+static void ccgDM_copyFinalEdgeArray(DerivedMesh *dm, MEdge *medge)
{
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
CCGSubSurf *ss = ccgdm->ss;
@@ -1815,10 +1236,7 @@ static void ccgDM_getFinalEdgeArray(DerivedMesh *dm, MEdge *medge)
int i = 0;
MEdge *origEdges = NULL;
- if(!ccgdm->fromEditmesh) {
- if(ccgdm->dlm) origEdges = ccgdm->dlm->medge;
- else if(ccgdm->me) origEdges = ccgdm->me->medge;
- }
+ if(ccgdm->me) origEdges = ccgdm->me->medge;
totface = ccgSubSurf_getNumFaces(ss);
for(index = 0; index < totface; index++) {
@@ -1870,26 +1288,14 @@ static void ccgDM_getFinalEdgeArray(DerivedMesh *dm, MEdge *medge)
if(!ccgSubSurf_getEdgeNumFaces(ss, e)) flags |= ME_LOOSEEDGE;
- if(ccgdm->fromEditmesh) {
- EditEdge *eed = ccgSubSurf_getEdgeEdgeHandle(ss, e);
-
- flags |= ME_EDGEDRAW | ME_EDGERENDER;
- if (eed->seam) {
- flags |= ME_SEAM;
- }
- if(eed->sharp) flags |= ME_SHARP;
- } else if(origEdges){
+ if(origEdges){
int edgeIdx = (int)ccgSubSurf_getEdgeEdgeHandle(ss, e);
if(edgeIdx != -1) {
MEdge *origMed = &origEdges[edgeIdx];
- if(ccgdm->dlm) {
- flags |= origMed->flag;
- } else {
- flags |= (origMed->flag & (ME_SEAM | ME_SHARP))
- | ME_EDGEDRAW | ME_EDGERENDER;
- }
+ flags |= (origMed->flag & (ME_SEAM | ME_SHARP))
+ | ME_EDGEDRAW | ME_EDGERENDER;
}
} else {
flags |= ME_EDGEDRAW | ME_EDGERENDER;
@@ -1905,7 +1311,7 @@ static void ccgDM_getFinalEdgeArray(DerivedMesh *dm, MEdge *medge)
}
}
-static void ccgDM_getFinalFaceArray(DerivedMesh *dm, MFace *mface)
+static void ccgDM_copyFinalFaceArray(DerivedMesh *dm, MFace *mface)
{
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
CCGSubSurf *ss = ccgdm->ss;
@@ -1915,12 +1321,9 @@ static void ccgDM_getFinalFaceArray(DerivedMesh *dm, MFace *mface)
int edgeSize = ccgSubSurf_getEdgeSize(ss);
int i = 0;
MFace *origFaces = NULL;
- int *faceFlags = dm->getFaceDataArray(dm, LAYERTYPE_FLAGS);
+ int *faceFlags = dm->getFaceDataArray(dm, CD_FLAGS);
- if(!ccgdm->fromEditmesh) {
- if(ccgdm->dlm) origFaces = ccgdm->dlm->mface;
- else if(ccgdm->me) origFaces = ccgdm->me->mface;
- }
+ if(ccgdm->me) origFaces = ccgdm->me->mface;
totface = ccgSubSurf_getNumFaces(ss);
for(index = 0; index < totface; index++) {
@@ -1930,16 +1333,12 @@ static void ccgDM_getFinalFaceArray(DerivedMesh *dm, MFace *mface)
int flag = ME_SMOOTH; /* assume face is smooth by default */
if(!faceFlags) {
- if(!ccgdm->fromEditmesh && origFaces) {
+ if(origFaces) {
int origIdx = (int) ccgSubSurf_getFaceFaceHandle(ss, f);
MFace *origMFace = &origFaces[origIdx];
mat_nr = origMFace->mat_nr;
flag = origMFace->flag;
- } else if(ccgdm->fromEditmesh) {
- EditFace *ef = ccgSubSurf_getFaceFaceHandle(ss, f);
- mat_nr = ef->mat_nr;
- flag = ef->flag;
}
}
@@ -1956,7 +1355,7 @@ static void ccgDM_getFinalFaceArray(DerivedMesh *dm, MFace *mface)
mf->v4 = getFaceIndex(ss, f, S, x + 1, y + 0,
edgeSize, gridSize);
mf->mat_nr = mat_nr;
- if(faceFlags) mf->flag = faceFlags[i];
+ if(faceFlags) mf->flag = faceFlags[index];
else mf->flag = flag;
i++;
@@ -1986,11 +1385,7 @@ static void ccgdm_getVertCos(DerivedMesh *dm, float (*cos)[3]) {
for (; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
CCGVert *v = ccgVertIterator_getCurrent(vi);
- if (ccgdm->fromEditmesh) {
- vertMap2[ccgDM_getVertMapIndex(ccgdm,ss,v)] = v;
- } else {
- vertMap2[(int) ccgSubSurf_getVertVertHandle(ss, v)] = v;
- }
+ vertMap2[(int) ccgSubSurf_getVertVertHandle(ss, v)] = v;
}
ccgVertIterator_free(vi);
@@ -2000,11 +1395,7 @@ static void ccgdm_getVertCos(DerivedMesh *dm, float (*cos)[3]) {
for (i=0; !ccgEdgeIterator_isStopped(ei); i++,ccgEdgeIterator_next(ei)) {
CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
- if (ccgdm->fromEditmesh) {
- edgeMap2[ccgDM_getEdgeMapIndex(ccgdm,ss,e)] = e;
- } else {
- edgeMap2[(int) ccgSubSurf_getEdgeEdgeHandle(ss, e)] = e;
- }
+ edgeMap2[(int) ccgSubSurf_getEdgeEdgeHandle(ss, e)] = e;
}
totface = ccgSubSurf_getNumFaces(ss);
@@ -2013,11 +1404,7 @@ static void ccgdm_getVertCos(DerivedMesh *dm, float (*cos)[3]) {
for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
CCGFace *f = ccgFaceIterator_getCurrent(fi);
- if (ccgdm->fromEditmesh) {
- faceMap2[ccgDM_getFaceMapIndex(ccgdm,ss,f)] = f;
- } else {
- faceMap2[(int) ccgSubSurf_getFaceFaceHandle(ss, f)] = f;
- }
+ faceMap2[(int) ccgSubSurf_getFaceFaceHandle(ss, f)] = f;
}
ccgFaceIterator_free(fi);
@@ -2095,11 +1482,6 @@ static void ccgDM_foreachMappedEdge(DerivedMesh *dm, void (*func)(void *userData
ccgEdgeIterator_free(ei);
}
-static DispListMesh *ccgDM_convertToDispListMesh(DerivedMesh *dm, int allowShared) {
- CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
-
- return ss_to_displistmesh(ccgdm->ss, ccgdm, ccgdm->fromEditmesh, ccgdm->drawInteriorEdges, ccgdm->useSubsurfUv, ccgdm->me, ccgdm->dlm);
-}
static void ccgDM_drawVerts(DerivedMesh *dm) {
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
@@ -2240,7 +1622,7 @@ static void ccgDM_drawFacesSolid(DerivedMesh *dm, int (*setMaterial)(int)) {
CCGSubSurf *ss = ccgdm->ss;
CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss);
int gridSize = ccgSubSurf_getGridSize(ss);
- MFace *mface = ccgdm->dlm?ccgdm->dlm->mface:ccgdm->me->mface;
+ MFace *mface = ccgdm->me->mface;
for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
CCGFace *f = ccgFaceIterator_getCurrent(fi);
@@ -2364,7 +1746,7 @@ static void ccgDM_drawFacesColored(DerivedMesh *dm, int useTwoSided, unsigned ch
ccgFaceIterator_free(fi);
}
-static void ccgDM_drawFacesTex(DerivedMesh *dm, int (*setDrawParams)(TFace *tface, int matnr))
+static void ccgDM_drawFacesTex(DerivedMesh *dm, int (*setDrawParams)(MTFace *tface, MCol *mcol, int matnr))
{
/* unimplemented, no textures in editmode anyway */
}
@@ -2376,9 +1758,8 @@ static void ccgDM_drawMappedFacesTex(DerivedMesh *dm, int (*setDrawParams)(void
CCGSubSurf *ss = ccgdm->ss;
CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss);
int gridSize = ccgSubSurf_getGridSize(ss);
- MFace *mface = ccgdm->dlm?ccgdm->dlm->mface:ccgdm->me->mface;
- TFace *tface = ccgdm->dlm?ccgdm->dlm->tface:ccgdm->me->tface;
- MCol *mcol = ccgdm->dlm?ccgdm->dlm->mcol:ccgdm->me->mcol;
+ MFace *mface = ccgdm->me->mface;
+ MCol *mcol = ccgdm->me->mcol;
// float uv[4][2];
// float col[4][3];
@@ -2388,20 +1769,14 @@ static void ccgDM_drawMappedFacesTex(DerivedMesh *dm, int (*setDrawParams)(void
int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
int index = (int) ccgSubSurf_getFaceFaceHandle(ss, f);
MFace *mf = &mface[index];
- TFace *tf = tface?&tface[index]:NULL;
unsigned char *cp= NULL;
int findex = ccgDM_getFaceMapIndex(ccgdm, ss, f);
int flag = (findex == -1)? 0: setDrawParams(userData, findex);
- if (flag==0) {
+ if (flag==0)
continue;
- } else if (flag==1) {
- if (tf) {
- cp= (unsigned char*) tf->col;
- } else if (mcol) {
- cp= (unsigned char*) &mcol[index*4];
- }
- }
+ else if (flag==1 && mcol)
+ cp= (unsigned char*) &mcol[index*4];
for (S=0; S<numVerts; S++) {
VertData *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
@@ -2465,7 +1840,7 @@ static void ccgDM_drawMappedFacesTex(DerivedMesh *dm, int (*setDrawParams)(void
Mesh *me = mdm->me;
MVert *mvert= mdm->verts;
MFace *mface= me->mface;
- TFace *tface = me->tface;
+ MTFace *tface = me->mtface;
float *nors = mdm->nors;
int a;
@@ -2496,7 +1871,7 @@ static void ccgDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *u
CCGSubSurf *ss = ccgdm->ss;
CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss);
int i, gridSize = ccgSubSurf_getGridSize(ss);
- int *faceFlags = dm->getFaceDataArray(dm, LAYERTYPE_FLAGS);
+ int *faceFlags = dm->getFaceDataArray(dm, CD_FLAGS);
for (i=0; !ccgFaceIterator_isStopped(fi); i++,ccgFaceIterator_next(fi)) {
CCGFace *f = ccgFaceIterator_getCurrent(fi);
@@ -2504,12 +1879,9 @@ static void ccgDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *u
int drawSmooth, index = ccgDM_getFaceMapIndex(ccgdm, ss, f);
int origIndex;
- if(ccgdm->fromEditmesh) {
- origIndex = index;
- } else {
- origIndex = (int)ccgSubSurf_getFaceFaceHandle(ss, f);
- }
- if(faceFlags) drawSmooth = (*faceFlags & ME_SMOOTH);
+ origIndex = (int)ccgSubSurf_getFaceFaceHandle(ss, f);
+
+ if(faceFlags) drawSmooth = (faceFlags[origIndex] & ME_SMOOTH);
else drawSmooth = 1;
if (index!=-1 && (!setDrawOptions || setDrawOptions(userData, index, &drawSmooth))) {
@@ -2646,20 +2018,18 @@ static void ccgDM_foreachMappedFaceCenter(DerivedMesh *dm, void (*func)(void *us
static void ccgDM_release(DerivedMesh *dm) {
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
- DM_release(dm);
-
- if (ccgdm->dlm) displistmesh_free(ccgdm->dlm);
-
- MEM_freeN(ccgdm->vertMap);
- MEM_freeN(ccgdm->edgeMap);
- MEM_freeN(ccgdm->faceMap);
- MEM_freeN(ccgdm);
+ if (DM_release(dm)) {
+ MEM_freeN(ccgdm->vertMap);
+ MEM_freeN(ccgdm->edgeMap);
+ MEM_freeN(ccgdm->faceMap);
+ MEM_freeN(ccgdm);
+ }
}
-static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
+static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
int drawInteriorEdges,
int useSubsurfUv, Mesh *me,
- DispListMesh *dlm, DerivedMesh *dm)
+ DerivedMesh *dm)
{
CCGDerivedMesh *ccgdm = MEM_callocN(sizeof(*ccgdm), "ccgdm");
CCGVertIterator *vi;
@@ -2680,7 +2050,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
MVert *mvert = NULL;
MEdge *medge = NULL;
MFace *mface = NULL;
- TFace *tface;
+ MTFace *tface;
CCGSubSurf *uvss = NULL;
CCGFace **faceMap2Uv = NULL;
FaceVertWeight *qweight, *tweight;
@@ -2689,15 +2059,14 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
DM_from_template(&ccgdm->dm, dm, ccgSubSurf_getNumFinalVerts(ss),
ccgSubSurf_getNumFinalEdges(ss),
ccgSubSurf_getNumFinalFaces(ss));
- tface = dm->getFaceDataArray(dm, LAYERTYPE_TFACE);
- DM_add_face_layer(&ccgdm->dm, LAYERTYPE_FLAGS, LAYERFLAG_NOCOPY, NULL);
+ tface = dm->getFaceDataArray(dm, CD_MTFACE);
+ DM_add_face_layer(&ccgdm->dm, CD_FLAGS, CD_FLAG_NOCOPY, NULL);
} else {
DM_init(&ccgdm->dm, ccgSubSurf_getNumFinalVerts(ss),
ccgSubSurf_getNumFinalEdges(ss),
ccgSubSurf_getNumFinalFaces(ss));
- if(dlm) tface = dlm->tface;
- else if(me) tface = me->tface;
+ if(me) tface = me->mtface;
else tface = NULL;
}
@@ -2709,9 +2078,9 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
ccgdm->dm.getVert = ccgDM_getFinalVert;
ccgdm->dm.getEdge = ccgDM_getFinalEdge;
ccgdm->dm.getFace = ccgDM_getFinalFace;
- ccgdm->dm.getVertArray = ccgDM_getFinalVertArray;
- ccgdm->dm.getEdgeArray = ccgDM_getFinalEdgeArray;
- ccgdm->dm.getFaceArray = ccgDM_getFinalFaceArray;
+ ccgdm->dm.copyVertArray = ccgDM_copyFinalVertArray;
+ ccgdm->dm.copyEdgeArray = ccgDM_copyFinalEdgeArray;
+ ccgdm->dm.copyFaceArray = ccgDM_copyFinalFaceArray;
ccgdm->dm.getVertData = DM_get_vert_data;
ccgdm->dm.getEdgeData = DM_get_edge_data;
ccgdm->dm.getFaceData = DM_get_face_data;
@@ -2723,7 +2092,6 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
ccgdm->dm.foreachMappedVert = ccgDM_foreachMappedVert;
ccgdm->dm.foreachMappedEdge = ccgDM_foreachMappedEdge;
ccgdm->dm.foreachMappedFaceCenter = ccgDM_foreachMappedFaceCenter;
- ccgdm->dm.convertToDispListMesh = ccgDM_convertToDispListMesh;
ccgdm->dm.drawVerts = ccgDM_drawVerts;
ccgdm->dm.drawEdges = ccgDM_drawEdges;
@@ -2740,11 +2108,9 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
ccgdm->dm.release = ccgDM_release;
ccgdm->ss = ss;
- ccgdm->fromEditmesh = fromEditmesh;
ccgdm->drawInteriorEdges = drawInteriorEdges;
ccgdm->useSubsurfUv = useSubsurfUv;
ccgdm->me = me;
- ccgdm->dlm = dlm;
totvert = ccgSubSurf_getNumVerts(ss);
ccgdm->vertMap = MEM_mallocN(totvert * sizeof(*ccgdm->vertMap), "vertMap");
@@ -2752,11 +2118,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
for(; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
CCGVert *v = ccgVertIterator_getCurrent(vi);
- if(fromEditmesh) {
- ccgdm->vertMap[ccgDM_getVertMapIndex(ccgdm, ss, v)].vert = v;
- } else {
- ccgdm->vertMap[(int) ccgSubSurf_getVertVertHandle(ss, v)].vert = v;
- }
+ ccgdm->vertMap[(int) ccgSubSurf_getVertVertHandle(ss, v)].vert = v;
}
ccgVertIterator_free(vi);
@@ -2766,11 +2128,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
for(; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
- if(fromEditmesh) {
- ccgdm->edgeMap[ccgDM_getEdgeMapIndex(ccgdm,ss,e)].edge = e;
- } else {
- ccgdm->edgeMap[(int) ccgSubSurf_getEdgeEdgeHandle(ss, e)].edge = e;
- }
+ ccgdm->edgeMap[(int) ccgSubSurf_getEdgeEdgeHandle(ss, e)].edge = e;
}
totface = ccgSubSurf_getNumFaces(ss);
@@ -2779,29 +2137,16 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
for(; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
CCGFace *f = ccgFaceIterator_getCurrent(fi);
- if(fromEditmesh) {
- ccgdm->faceMap[ccgDM_getFaceMapIndex(ccgdm,ss,f)].face = f;
- } else {
- ccgdm->faceMap[(int) ccgSubSurf_getFaceFaceHandle(ss, f)].face = f;
- }
+ ccgdm->faceMap[(int) ccgSubSurf_getFaceFaceHandle(ss, f)].face = f;
}
ccgFaceIterator_free(fi);
if(useSubsurfUv && tface) {
- /* slightly dodgy hack to use current ss_sync_from_uv function */
- DispListMesh dlm;
-
- dlm.mface = dm->dupFaceArray(dm);
- dlm.tface = tface;
- dlm.mvert = dm->dupVertArray(dm);
- dlm.totvert = dm->getNumVerts(dm);
- dlm.totface = dm->getNumFaces(dm);
-
/* not for editmesh currently */
uvss = _getSubSurf(NULL, ccgSubSurf_getSubdivisionLevels(ss),
0, 1, 0);
- if(ss_sync_from_uv(uvss, ss, NULL, &dlm)) {
+ if(ss_sync_from_uv(uvss, ss, dm)) {
faceMap2Uv = MEM_mallocN(totface * sizeof(*faceMap2Uv),
"facemapuv");
@@ -2812,9 +2157,6 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
}
ccgFaceIterator_free(fi);
}
-
- MEM_freeN(dlm.mface);
- MEM_freeN(dlm.mvert);
}
edgeSize = ccgSubSurf_getEdgeSize(ss);
@@ -2832,24 +2174,20 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
faceNum = 0;
if(dm) {
- mvert = dm->dupVertArray(dm);
- medge = dm->dupEdgeArray(dm);
- mface = dm->dupFaceArray(dm);
- } else if(dlm) {
- mvert = dlm->mvert;
- medge = dlm->medge;
- mface = dlm->mface;
+ mvert = dm->getVertArray(dm);
+ medge = dm->getEdgeArray(dm);
+ mface = dm->getFaceArray(dm);
} else if(me) {
mvert = me->mvert;
medge = me->medge;
mface = me->mface;
}
- vertOrigIndex = DM_get_vert_data_layer(&ccgdm->dm, LAYERTYPE_ORIGINDEX);
- edgeOrigIndex = DM_get_edge_data_layer(&ccgdm->dm, LAYERTYPE_ORIGINDEX);
- faceOrigIndex = DM_get_face_data_layer(&ccgdm->dm, LAYERTYPE_ORIGINDEX);
+ vertOrigIndex = DM_get_vert_data_layer(&ccgdm->dm, CD_ORIGINDEX);
+ edgeOrigIndex = DM_get_edge_data_layer(&ccgdm->dm, CD_ORIGINDEX);
+ faceOrigIndex = DM_get_face_data_layer(&ccgdm->dm, CD_ORIGINDEX);
- faceFlags = DM_get_face_data_layer(&ccgdm->dm, LAYERTYPE_FLAGS);
+ faceFlags = DM_get_face_data_layer(&ccgdm->dm, CD_FLAGS);
for(index = 0; index < totface; ++index) {
CCGFace *f = ccgdm->faceMap[index].face;
@@ -2872,10 +2210,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
for(S = 0; S < numVerts; S++) {
CCGVert *v = ccgSubSurf_getFaceVert(ss, f, S);
- if(fromEditmesh)
- vertIdx[S] = ccgDM_getVertMapIndex(NULL, ss, v);
- else
- vertIdx[S] = (int)ccgSubSurf_getVertVertHandle(ss, v);
+ vertIdx[S] = (int)ccgSubSurf_getVertVertHandle(ss, v);
}
DM_interp_vert_data(dm, &ccgdm->dm, vertIdx, weight[0][0],
@@ -2924,7 +2259,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
for(i = 0; i < numFinalEdges; ++i)
*(int *)DM_get_edge_data(&ccgdm->dm, edgeNum + i,
- LAYERTYPE_ORIGINDEX) = ORIGINDEX_NONE;
+ CD_ORIGINDEX) = ORIGINDEX_NONE;
for(S = 0; S < numVerts; S++) {
int prevS = (S - 1 + numVerts) % numVerts;
@@ -2950,8 +2285,8 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
weight++;
if(uvf) {
- TFace *tf = DM_get_face_data(&ccgdm->dm, faceNum,
- LAYERTYPE_TFACE);
+ MTFace *tf = DM_get_face_data(&ccgdm->dm, faceNum,
+ CD_MTFACE);
float *newuv;
newuv = getFaceUV(uvss, uvf, S, x + 0, y + 0,
@@ -2969,18 +2304,15 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
}
*faceOrigIndex = mapIndex;
- if(mface)
- *faceFlags = mface[origIndex].flag;
- else
- *faceFlags = ME_SMOOTH;
++faceOrigIndex;
- ++faceFlags;
++faceNum;
}
}
}
+ faceFlags[index] = mface[origIndex].flag;
+
edgeNum += numFinalEdges;
}
@@ -2996,19 +2328,11 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
int x;
int vertIdx[2];
- if(fromEditmesh) {
- CCGVert *v;
- v = ccgSubSurf_getEdgeVert0(ss, e);
- vertIdx[0] = ccgDM_getVertMapIndex(NULL, ss, v);
- v = ccgSubSurf_getEdgeVert1(ss, e);
- vertIdx[1] = ccgDM_getVertMapIndex(NULL, ss, v);
- } else {
- CCGVert *v;
- v = ccgSubSurf_getEdgeVert0(ss, e);
- vertIdx[0] = (int)ccgSubSurf_getVertVertHandle(ss, v);
- v = ccgSubSurf_getEdgeVert1(ss, e);
- vertIdx[1] = (int)ccgSubSurf_getVertVertHandle(ss, v);
- }
+ CCGVert *v;
+ v = ccgSubSurf_getEdgeVert0(ss, e);
+ vertIdx[0] = (int)ccgSubSurf_getVertVertHandle(ss, v);
+ v = ccgSubSurf_getEdgeVert1(ss, e);
+ vertIdx[1] = (int)ccgSubSurf_getVertVertHandle(ss, v);
ccgdm->edgeMap[index].startVert = vertNum;
ccgdm->edgeMap[index].startEdge = edgeNum;
@@ -3028,7 +2352,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
for(i = 0; i < numFinalEdges; ++i)
*(int *)DM_get_edge_data(&ccgdm->dm, edgeNum + i,
- LAYERTYPE_ORIGINDEX) = mapIndex;
+ CD_ORIGINDEX) = mapIndex;
edgeNum += numFinalEdges;
}
@@ -3038,10 +2362,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
int mapIndex = ccgDM_getVertMapIndex(ccgdm, ccgdm->ss, v);
int vertIdx;
- if(fromEditmesh)
- vertIdx = ccgDM_getVertMapIndex(NULL, ss, v);
- else
- vertIdx = (int)ccgSubSurf_getVertVertHandle(ss, v);
+ vertIdx = (int)ccgSubSurf_getVertVertHandle(ss, v);
ccgdm->vertMap[index].startVert = vertNum;
@@ -3049,17 +2370,12 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
*((int*) ccgSubSurf_getVertUserData(ss, v)) = vertNum;
DM_copy_vert_data(dm, &ccgdm->dm, vertIdx, vertNum, 1);
+
*vertOrigIndex = mapIndex;
++vertOrigIndex;
++vertNum;
}
- if(dm) {
- MEM_freeN(mvert);
- MEM_freeN(medge);
- MEM_freeN(mface);
- }
-
MEM_freeN(qweight);
MEM_freeN(tweight);
@@ -3068,91 +2384,6 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh,
/***/
-DerivedMesh *subsurf_make_derived_from_editmesh(EditMesh *em, SubsurfModifierData *smd, float (*vertCos)[3]) {
- int useSimple = smd->subdivType==ME_SIMPLE_SUBSURF;
- int useAging = smd->flags&eSubsurfModifierFlag_DebugIncr;
- int drawInteriorEdges = !(smd->flags&eSubsurfModifierFlag_ControlEdges);
-
- smd->emCache = _getSubSurf(smd->emCache, smd->levels, useAging, 0, useSimple);
- ss_sync_from_editmesh(smd->emCache, em, vertCos, useSimple);
-
- return (DerivedMesh*) getCCGDerivedMesh(smd->emCache, 1, drawInteriorEdges, 0, NULL, NULL, NULL);
-}
-
-DerivedMesh *subsurf_make_derived_from_dlm_em(DispListMesh *dlm, SubsurfModifierData *smd, float (*vertCos)[3]) {
- int useSimple = smd->subdivType==ME_SIMPLE_SUBSURF;
- int useAging = smd->flags&eSubsurfModifierFlag_DebugIncr;
- int useSubsurfUv = smd->flags&eSubsurfModifierFlag_SubsurfUv;
- int drawInteriorEdges = !(smd->flags&eSubsurfModifierFlag_ControlEdges);
-
- smd->emCache = _getSubSurf(smd->emCache, smd->levels, useAging, 0, useSimple);
-
- ss_sync_from_mesh(smd->emCache, NULL, dlm, vertCos, useSimple);
-
- return (DerivedMesh*) getCCGDerivedMesh(smd->emCache, 0, drawInteriorEdges, useSubsurfUv, NULL, dlm, NULL);
-}
-
-DerivedMesh *subsurf_make_derived_from_mesh(Mesh *me, DispListMesh *dlm, SubsurfModifierData *smd, int useRenderParams, float (*vertCos)[3], int isFinalCalc) {
- int useSimple = smd->subdivType==ME_SIMPLE_SUBSURF;
- int useSubsurfUv = smd->flags&eSubsurfModifierFlag_SubsurfUv;
- int drawInteriorEdges = !(smd->flags&eSubsurfModifierFlag_ControlEdges);
- DispListMesh *ndlm;
-
- /* Do not use cache in render mode. */
- if (useRenderParams) {
- CCGSubSurf *ss = _getSubSurf(NULL, smd->renderLevels, 0, 1, useSimple);
-
- ss_sync_from_mesh(ss, me, dlm, vertCos, useSimple);
-
- ndlm = ss_to_displistmesh(ss, NULL, 0, drawInteriorEdges, useSubsurfUv, me, dlm);
- if (dlm) displistmesh_free(dlm);
-
- ccgSubSurf_free(ss);
-
- return derivedmesh_from_displistmesh(ndlm, NULL);
- } else {
- int useIncremental = (smd->flags&eSubsurfModifierFlag_Incremental);
- int useAging = smd->flags&eSubsurfModifierFlag_DebugIncr;
- CCGSubSurf *ss;
-
- /* It is quite possible there is a much better place to do this. It
- * depends a bit on how rigourously we expect this function to never
- * be called in editmode. In semi-theory we could share a single
- * cache, but the handles used inside and outside editmode are not
- * the same so we would need some way of converting them. Its probably
- * not worth the effort. But then why am I even writing this long
- * comment that no one will read? Hmmm. - zr
- */
- if (smd->emCache) {
- ccgSubSurf_free(smd->emCache);
- smd->emCache = NULL;
- }
-
- if (useIncremental && isFinalCalc) {
- smd->mCache = ss = _getSubSurf(smd->mCache, smd->levels, useAging, 0, useSimple);
-
- ss_sync_from_mesh(ss, me, dlm, vertCos, useSimple);
-
- return (DerivedMesh*) getCCGDerivedMesh(ss, 0, drawInteriorEdges, useSubsurfUv, me, dlm, NULL);
- } else {
- if (smd->mCache && isFinalCalc) {
- ccgSubSurf_free(smd->mCache);
- smd->mCache = NULL;
- }
-
- ss = _getSubSurf(NULL, smd->levels, 0, 1, useSimple);
- ss_sync_from_mesh(ss, me, dlm, vertCos, useSimple);
-
- ndlm = ss_to_displistmesh(ss, NULL, 0, drawInteriorEdges, useSubsurfUv, me, dlm);
-
- if (dlm) displistmesh_free(dlm);
- ccgSubSurf_free(ss);
-
- return derivedmesh_from_displistmesh(ndlm, NULL);
- }
- }
-}
-
struct DerivedMesh *subsurf_make_derived_from_derived(
struct DerivedMesh *dm,
struct SubsurfModifierData *smd,
@@ -3170,9 +2401,9 @@ struct DerivedMesh *subsurf_make_derived_from_derived(
useSimple);
ss_sync_from_derivedmesh(smd->emCache, dm, vertCos, useSimple);
- return (DerivedMesh *)getCCGDerivedMesh(smd->emCache, 0,
+ return (DerivedMesh *)getCCGDerivedMesh(smd->emCache,
drawInteriorEdges,
- useSubsurfUv, NULL, NULL, dm);
+ useSubsurfUv, NULL, dm);
} else if(useRenderParams) {
/* Do not use cache in render mode. */
CCGSubSurf *ss = _getSubSurf(NULL, smd->renderLevels, 0, 1, useSimple);
@@ -3240,8 +2471,9 @@ void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3])
CCGSubSurf *ss = _getSubSurf(NULL, 1, 0, 1, 0);
float edge_sum[3], face_sum[3];
CCGVertIterator *vi;
+ DerivedMesh *dm = CDDM_from_mesh(me, NULL);
- ss_sync_from_mesh(ss, me, NULL, NULL, 0);
+ ss_sync_from_derivedmesh(ss, dm, NULL, 0);
vi = ccgSubSurf_getVertIterator(ss);
for (; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
@@ -3272,5 +2504,7 @@ void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3])
ccgVertIterator_free(vi);
ccgSubSurf_free(ss);
+
+ dm->release(dm);
}
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 3a5ee29c456..dfcbfff5485 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -64,6 +64,7 @@
#include "DNA_controller_types.h"
#include "DNA_constraint_types.h"
#include "DNA_curve_types.h"
+#include "DNA_customdata_types.h"
#include "DNA_effect_types.h"
#include "DNA_fileglobal_types.h"
#include "DNA_group_types.h"
@@ -113,6 +114,7 @@
#include "BKE_armature.h"
#include "BKE_constraint.h"
#include "BKE_curve.h"
+#include "BKE_customdata.h"
#include "BKE_deform.h"
#include "BKE_depsgraph.h"
#include "BKE_effect.h" // for give_parteff
@@ -2346,17 +2348,16 @@ static void lib_link_mesh(FileData *fd, Main *main)
me->key= newlibadr_us(fd, me->id.lib, me->key);
me->texcomesh= newlibadr_us(fd, me->id.lib, me->texcomesh);
- if(me->tface) {
- TFace *tfaces= me->tface;
+ for (i=0; i<me->fdata.totlayer; i++) {
+ CustomDataLayer *layer = &me->fdata.layers[i];
- for (i=0; i<me->totface; i++) {
- TFace *tf= &tfaces[i];
+ if (layer->type == CD_MTFACE) {
+ MTFace *tf = layer->data;
- tf->tpage= newlibadr(fd, me->id.lib, tf->tpage);
- if(tf->tpage) {
- Image *ima= tf->tpage;
- if(ima->id.us==0)
- ima->id.us= 1;
+ for (i=0; i<me->totface; i++, tf++) {
+ tf->tpage= newlibadr(fd, me->id.lib, tf->tpage);
+ if(tf->tpage && tf->tpage->id.us==0)
+ tf->tpage->id.us= 1;
}
}
}
@@ -2380,6 +2381,27 @@ static void direct_link_dverts(FileData *fd, int count, MDeformVert *mdverts)
}
}
+static void direct_link_customdata(FileData *fd, CustomData *data, int count)
+{
+ int i = 0, removed;
+
+ data->layers= newdataadr(fd, data->layers);
+
+ while (i < data->totlayer) {
+ CustomDataLayer *layer = &data->layers[i];
+
+ if (layer->type < CD_NUMTYPES) {
+ layer->data = newdataadr(fd, layer->data);
+ i++;
+ }
+ else {
+ /* delete layer with unknown type */
+ layer->data = NULL;
+ CustomData_free_layer(data, layer->type, 0);
+ }
+ }
+}
+
static void direct_link_mesh(FileData *fd, Mesh *mesh)
{
mesh->mat= newdataadr(fd, mesh->mat);
@@ -2389,15 +2411,21 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh)
mesh->medge= newdataadr(fd, mesh->medge);
mesh->mface= newdataadr(fd, mesh->mface);
mesh->tface= newdataadr(fd, mesh->tface);
+ mesh->mtface= newdataadr(fd, mesh->mtface);
mesh->mcol= newdataadr(fd, mesh->mcol);
mesh->msticky= newdataadr(fd, mesh->msticky);
-
mesh->dvert= newdataadr(fd, mesh->dvert);
+
+ /* normally direct_link_dverts should be called in direct_link_customdata,
+ but for backwards compat in do_versions to work we do it here */
direct_link_dverts(fd, mesh->totvert, mesh->dvert);
+ direct_link_customdata(fd, &mesh->vdata, mesh->totvert);
+ direct_link_customdata(fd, &mesh->edata, mesh->totedge);
+ direct_link_customdata(fd, &mesh->fdata, mesh->totface);
+
mesh->bb= NULL;
mesh->oc= 0;
- mesh->dface= NULL;
mesh->mselect= NULL;
/* Multires data */
@@ -2425,19 +2453,15 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh)
mesh->pv->old_edges= newdataadr(fd, mesh->pv->old_edges);
}
- if (mesh->tface) {
- TFace *tfaces= mesh->tface;
+ if((fd->flags & FD_FLAGS_SWITCH_ENDIAN) && mesh->tface) {
+ TFace *tf= mesh->tface;
int i;
- for (i=0; i<mesh->totface; i++) {
- TFace *tf= &tfaces[i];
-
- if(fd->flags & FD_FLAGS_SWITCH_ENDIAN) {
- SWITCH_INT(tf->col[0]);
- SWITCH_INT(tf->col[1]);
- SWITCH_INT(tf->col[2]);
- SWITCH_INT(tf->col[3]);
- }
+ for (i=0; i<mesh->totface; i++, tf++) {
+ SWITCH_INT(tf->col[0]);
+ SWITCH_INT(tf->col[1]);
+ SWITCH_INT(tf->col[2]);
+ SWITCH_INT(tf->col[3]);
}
}
}
@@ -4048,6 +4072,57 @@ static void sort_shape_fix(Main *main)
}
}
+static void customdata_version_242(Mesh *me)
+{
+ MTFace *mtf;
+ MCol *mcol;
+ TFace *tf;
+ int a;
+
+ if (!me->vdata.totlayer) {
+ CustomData_add_layer(&me->vdata, CD_MVERT, 0, me->mvert, me->totvert);
+
+ if (me->msticky)
+ CustomData_add_layer(&me->vdata, CD_MSTICKY, 0, me->msticky, me->totvert);
+ if (me->dvert)
+ CustomData_add_layer(&me->vdata, CD_MDEFORMVERT, 0, me->dvert, me->totvert);
+ }
+
+ if (!me->edata.totlayer)
+ CustomData_add_layer(&me->edata, CD_MEDGE, 0, me->medge, me->totedge);
+
+ if (!me->fdata.totlayer) {
+ CustomData_add_layer(&me->fdata, CD_MFACE, 0, me->mface, me->totface);
+
+ if (me->mcol || me->tface)
+ me->mcol= CustomData_add_layer(&me->fdata, CD_MCOL, 0, me->mcol, me->totface);
+
+ if (me->tface) {
+ me->mtface= CustomData_add_layer(&me->fdata, CD_MTFACE, 0, NULL, me->totface);
+
+ mtf= me->mtface;
+ mcol= me->mcol;
+ tf= me->tface;
+
+ for (a=0; a < me->totface; a++, mtf++, tf++, mcol+=4) {
+ memcpy(mcol, tf->col, sizeof(tf->col));
+ memcpy(mtf->uv, tf->uv, sizeof(tf->uv));
+
+ mtf->flag= tf->flag;
+ mtf->unwrap= tf->unwrap;
+ mtf->mode= tf->mode;
+ mtf->tile= tf->tile;
+ mtf->tpage= tf->tpage;
+ mtf->transp= tf->transp;
+ }
+
+ MEM_freeN(me->tface);
+ me->tface= NULL;
+ }
+ }
+
+ mesh_update_customdata_pointers(me);
+}
static void do_versions(FileData *fd, Library *lib, Main *main)
{
@@ -5853,6 +5928,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
Object *ob;
Curve *cu;
Material *ma;
+ Mesh *me;
Group *group;
Nurb *nu;
BezTriple *bezt;
@@ -5966,6 +6042,9 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
if(ma->shad_alpha==0.0f)
ma->shad_alpha= 1.0f;
}
+
+ for(me=main->mesh.first; me; me=me->id.next)
+ customdata_version_242(me);
for(group= main->group.first; group; group= group->id.next)
if(group->layer==0)
@@ -5974,7 +6053,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
/* History fix (python?), shape key adrcode numbers have to be sorted */
sort_shape_fix(main);
}
-
+
/* WATCH IT!!!: pointers from libdata have not been converted yet here! */
/* WATCH IT 2!: Userdef struct init has to be in src/usiblender.c! */
@@ -6322,8 +6401,9 @@ static void expand_curve(FileData *fd, Main *mainvar, Curve *cu)
static void expand_mesh(FileData *fd, Main *mainvar, Mesh *me)
{
- int a;
- TFace *tface;
+ CustomDataLayer *layer;
+ TFace *tf;
+ int a, i;
for(a=0; a<me->totcol; a++) {
expand_doit(fd, mainvar, me->mat[a]);
@@ -6332,13 +6412,12 @@ static void expand_mesh(FileData *fd, Main *mainvar, Mesh *me)
expand_doit(fd, mainvar, me->key);
expand_doit(fd, mainvar, me->texcomesh);
- if(me->tface) {
- tface= me->tface;
- a= me->totface;
- while(a--) {
- if(tface->tpage) expand_doit(fd, mainvar, tface->tpage);
- tface++;
- }
+ for(a=0; a<me->fdata.totlayer; a++) {
+ layer= &me->fdata.layers[a];
+
+ for(i=0, tf=layer->data; i<me->totface; i++, tf++)
+ if(tf->tpage)
+ expand_doit(fd, mainvar, tf->tpage);
}
}
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 4fcf982970f..5cc40ae8ac9 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -106,11 +106,12 @@ Important to know is that 'streaming' has been added to files, for Blender Publi
#include "DNA_action_types.h"
#include "DNA_actuator_types.h"
#include "DNA_brush_types.h"
-#include "DNA_controller_types.h"
-#include "DNA_curve_types.h"
-#include "DNA_constraint_types.h"
#include "DNA_camera_types.h"
#include "DNA_color_types.h"
+#include "DNA_constraint_types.h"
+#include "DNA_controller_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_customdata_types.h"
#include "DNA_effect_types.h"
#include "DNA_group_types.h"
#include "DNA_image_types.h"
@@ -1064,6 +1065,31 @@ static void write_dverts(WriteData *wd, int count, MDeformVert *dvlist)
}
}
+static void write_customdata(WriteData *wd, int count, CustomData *data)
+{
+ int i;
+
+ writestruct(wd, DATA, "CustomDataLayer", data->maxlayer, data->layers);
+
+ for (i=0; i<data->totlayer; i++) {
+ CustomDataLayer *layer= &data->layers[i];
+ char *structname;
+ int structnum;
+
+ if (layer->type == CD_MDEFORMVERT) {
+ /* layer types that allocate own memory need special handling */
+ write_dverts(wd, count, layer->data);
+ }
+ else {
+ CustomData_file_write_info(layer->type, &structname, &structnum);
+ if (structnum)
+ writestruct(wd, DATA, structname, structnum*count, layer->data);
+ else
+ printf("error: this CustomDataLayer must not be written to file\n");
+ }
+ }
+}
+
static void write_meshs(WriteData *wd, ListBase *idbase)
{
Mesh *mesh;
@@ -1092,14 +1118,9 @@ static void write_meshs(WriteData *wd, ListBase *idbase)
writedata(wd, DATA, sizeof(void *)*mesh->totcol, mesh->mat);
- writestruct(wd, DATA, "MVert", mesh->pv?mesh->pv->totvert:mesh->totvert, mesh->mvert);
- writestruct(wd, DATA, "MEdge", mesh->totedge, mesh->medge);
- writestruct(wd, DATA, "MFace", mesh->totface, mesh->mface);
- writestruct(wd, DATA, "TFace", mesh->totface, mesh->tface);
- writestruct(wd, DATA, "MCol", 4*mesh->totface, mesh->mcol);
- writestruct(wd, DATA, "MSticky", mesh->totvert, mesh->msticky);
-
- write_dverts(wd, mesh->totvert, mesh->dvert);
+ write_customdata(wd, mesh->pv?mesh->pv->totvert:mesh->totvert, &mesh->vdata);
+ write_customdata(wd, mesh->totedge, &mesh->edata);
+ write_customdata(wd, mesh->totface, &mesh->fdata);
/* Multires data */
writestruct(wd, DATA, "Multires", 1, mesh->mr);
@@ -2024,7 +2045,7 @@ void BLO_write_runtime(char *file, char *exename) {
// remove existing file / bundle
//printf("Delete file %s\n", file);
- BLI_delete(file, NULL, TRUE);
+ BLI_delete(file, 0, TRUE);
if (!recursive_copy_runtime(file, exename, &cause))
goto cleanup;
diff --git a/source/blender/include/BDR_drawmesh.h b/source/blender/include/BDR_drawmesh.h
index b2b68b25d60..15e18135c67 100644
--- a/source/blender/include/BDR_drawmesh.h
+++ b/source/blender/include/BDR_drawmesh.h
@@ -34,7 +34,7 @@
#define BDR_DRAWMESH_H
struct Image;
-struct TFace;
+struct MTFace;
struct Object;
struct Mesh;
struct EdgeHash;
@@ -75,7 +75,7 @@ void update_realtime_image(struct Image *ima, int x, int y, int w, int h);
void free_realtime_image(struct Image *ima);
void free_all_realtime_images(void);
void make_repbind(struct Image *ima);
-int set_tpage(struct TFace *tface);
+int set_tpage(struct MTFace *tface);
void draw_tface_mesh(struct Object *ob, struct Mesh *me, int dt);
struct EdgeHash *get_tface_mesh_marked_edge_info(struct Mesh *me);
void init_realtime_GL(void);
diff --git a/source/blender/include/BDR_editface.h b/source/blender/include/BDR_editface.h
index d46f05667ba..5501709914e 100644
--- a/source/blender/include/BDR_editface.h
+++ b/source/blender/include/BDR_editface.h
@@ -33,13 +33,14 @@
#ifndef BDR_EDITFACE_H
#define BDR_EDITFACE_H
-struct TFace;
+struct MTFace;
struct Mesh;
+struct MCol;
-struct TFace *get_active_tface(void);
+struct MTFace *get_active_tface(struct MCol **mcol);
void calculate_uv_map(unsigned short mapmode);
void default_uv(float uv[][2], float size);
-void default_tface(struct TFace *tface);
+void default_tface(struct MTFace *tface);
void make_tfaces(struct Mesh *me);
void reveal_tface(void);
void hide_tface(void);
diff --git a/source/blender/include/BDR_vpaint.h b/source/blender/include/BDR_vpaint.h
index b7dd38707c3..d30a4daae00 100644
--- a/source/blender/include/BDR_vpaint.h
+++ b/source/blender/include/BDR_vpaint.h
@@ -38,7 +38,7 @@ struct MDeformVert; /* __NLA */
unsigned int vpaint_get_current_col(void);
unsigned int rgba_to_mcol(float r, float g, float b, float a);
void do_shared_vertexcol(struct Mesh *me);
-void make_vertexcol(void);
+void make_vertexcol(int shade);
void copy_vpaint_undo(unsigned int *mcol, int tot);
void vpaint_undo(void);
void clear_vpaint(void);
diff --git a/source/blender/include/BIF_editmesh.h b/source/blender/include/BIF_editmesh.h
index d08c6a39d7d..75115a4e22f 100644
--- a/source/blender/include/BIF_editmesh.h
+++ b/source/blender/include/BIF_editmesh.h
@@ -149,7 +149,7 @@ extern void reveal_mesh(void);
extern void vertices_to_sphere(void);
- /** Aligns the selected TFace's of @a me to the @a v3d,
+ /** Aligns the selected MTFace's of @a me to the @a v3d,
* using the given axis (0-2). Can give a user error.
*/
extern void faceselect_align_view_to_selected(struct View3D *v3d, struct Mesh *me, int axis);
diff --git a/source/blender/include/BSE_types.h b/source/blender/include/BSE_types.h
index 132289f02ee..591ea2f5168 100644
--- a/source/blender/include/BSE_types.h
+++ b/source/blender/include/BSE_types.h
@@ -47,7 +47,7 @@ struct IpoCurve;
struct Ipo;
struct IpoKey;
struct Mesh;
-struct TFace;
+struct MTFace;
struct Object;
struct TransOb;
struct TransVert;
diff --git a/source/blender/makesdna/DNA_customdata_types.h b/source/blender/makesdna/DNA_customdata_types.h
index 2886f012c8e..08b0345af8d 100644
--- a/source/blender/makesdna/DNA_customdata_types.h
+++ b/source/blender/makesdna/DNA_customdata_types.h
@@ -44,26 +44,32 @@ typedef struct CustomDataLayer {
* (vertices, edges or faces). The custom data is organised into a series of
* layers, each with a data type (e.g. TFace, MDeformVert, etc.). */
typedef struct CustomData {
- CustomDataLayer *layers; /* data layer descriptors, ordered by type */
- int numLayers; /* current number of layers */
- int maxLayers; /* maximum number of layers */
- int numElems; /* current number of elements */
- int maxElems; /* maximum number of elements */
- int subElems; /* number of sub-elements layers can have */
- int totSize; /* in editmode, total size of all data layers */
+ CustomDataLayer *layers; /* CustomDataLayers, ordered by type */
+ int totlayer, maxlayer; /* number of layers, size of layers array */
+ int totsize, pad; /* in editmode, total size of all data layers */
} CustomData;
-/* custom data types */
-#define LAYERTYPE_MVERT 0
-#define LAYERTYPE_MSTICKY 1
-#define LAYERTYPE_MDEFORMVERT 2
-#define LAYERTYPE_MEDGE 3
-#define LAYERTYPE_MFACE 4
-#define LAYERTYPE_TFACE 5
-#define LAYERTYPE_MCOL 6
-#define LAYERTYPE_ORIGINDEX 7
-#define LAYERTYPE_NORMAL 8
-#define LAYERTYPE_FLAGS 9
-#define LAYERTYPE_NUMTYPES 10
+/* CustomData.type */
+#define CD_MVERT 0
+#define CD_MSTICKY 1
+#define CD_MDEFORMVERT 2
+#define CD_MEDGE 3
+#define CD_MFACE 4
+#define CD_MTFACE 5
+#define CD_MCOL 6
+#define CD_ORIGINDEX 7
+#define CD_NORMAL 8
+#define CD_FLAGS 9
+#define CD_NUMTYPES 10
+
+/* CustomData.flag */
+
+/* indicates layer should not be copied by CustomData_from_template or
+ * CustomData_copy_data */
+#define CD_FLAG_NOCOPY (1<<0)
+/* indicates layer should not be freed (for layers backed by external data) */
+#define CD_FLAG_NOFREE (1<<1)
+/* indicates the layer is only temporary, also implies no copy */
+#define CD_FLAG_TEMPORARY ((1<<2)|CD_FLAG_NOCOPY)
#endif
diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h
index d0ef6724ff0..fae7c851343 100644
--- a/source/blender/makesdna/DNA_mesh_types.h
+++ b/source/blender/makesdna/DNA_mesh_types.h
@@ -34,9 +34,9 @@
#include "DNA_listBase.h"
#include "DNA_ID.h"
+#include "DNA_customdata_types.h"
struct DerivedMesh;
-struct DispListMesh;
struct Ipo;
struct Key;
struct Material;
@@ -50,17 +50,6 @@ struct OcInfo;
struct Multires;
struct PartialVisibility;
-typedef struct TFace {
-
- /* this one gets interpreted as a image in texture.c */
- void *tpage;
-
- float uv[4][2]; /* when you change this: also do function set_correct_uv in editmesh.c, and there are more locations that use the size of this part */
- unsigned int col[4];
- char flag, transp;
- short mode, tile, unwrap;
-} TFace;
-
typedef struct Mesh {
ID id;
@@ -73,8 +62,8 @@ typedef struct Mesh {
struct Material **mat;
struct MFace *mface;
- struct TFace *tface;
- void *dface;
+ struct MTFace *mtface;
+ struct TFace *tface; /* depecrated, use mtface */
struct MVert *mvert;
struct MEdge *medge;
struct MDeformVert *dvert; /* __NLA */
@@ -86,6 +75,8 @@ typedef struct Mesh {
struct OcInfo *oc; /* not written in file */
void *sumohandle;
+ struct CustomData vdata, edata, fdata;
+
int totvert, totedge, totface, totselect, pad2;
int texflag;
@@ -109,7 +100,14 @@ typedef struct Mesh {
/*#endif*/
} Mesh;
-
+/* deprecated by MTFace, only here for file reading */
+typedef struct TFace {
+ void *tpage;
+ float uv[4][2];
+ unsigned int col[4];
+ char flag, transp;
+ short mode, tile, unwrap;
+} TFace;
/* **************** MESH ********************* */
@@ -131,48 +129,6 @@ typedef struct Mesh {
#define ME_CC_SUBSURF 0
#define ME_SIMPLE_SUBSURF 1
-#define TF_DYNAMIC 1
-/* #define TF_INVISIBLE 2 */
-#define TF_TEX 4
-#define TF_SHAREDVERT 8
-#define TF_LIGHT 16
-
-#define TF_SHAREDCOL 64
-#define TF_TILES 128
-#define TF_BILLBOARD 256
-#define TF_TWOSIDE 512
-#define TF_INVISIBLE 1024
-
-#define TF_OBCOL 2048
-#define TF_BILLBOARD2 4096 /* with Z axis constraint */
-#define TF_SHADOW 8192
-#define TF_BMFONT 16384
-
-/* tface->flag: 1=select 2=active*/
-#define TF_SELECT 1
-#define TF_ACTIVE 2
-#define TF_SEL1 4
-#define TF_SEL2 8
-#define TF_SEL3 16
-#define TF_SEL4 32
-#define TF_HIDE 64
-
-/* tface->transp */
-#define TF_SOLID 0
-#define TF_ADD 1
-#define TF_ALPHA 2
-#define TF_SUB 3
-
-/* tface->unwrap */
-#define TF_DEPRECATED1 1
-#define TF_DEPRECATED2 2
-#define TF_DEPRECATED3 4
-#define TF_DEPRECATED4 8
-#define TF_PIN1 16
-#define TF_PIN2 32
-#define TF_PIN3 64
-#define TF_PIN4 128
-
#define MESH_MAX_VERTS 2000000000L
#endif
diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h
index a091a2d4ce7..c313b240b5a 100644
--- a/source/blender/makesdna/DNA_meshdata_types.h
+++ b/source/blender/makesdna/DNA_meshdata_types.h
@@ -33,6 +33,7 @@
#define DNA_MESHDATA_TYPES_H
struct Bone;
+struct Image;
typedef struct MFace {
unsigned int v1, v2, v3, v4;
@@ -76,6 +77,13 @@ typedef struct MSelect {
int type;
} MSelect;
+typedef struct MTFace {
+ float uv[4][2];
+ struct Image *tpage;
+ char flag, transp;
+ short mode, tile, unwrap;
+} MTFace;
+
/* Multiresolution modeling */
typedef struct MultiresCol {
float a, r, g, b, u, v;
@@ -171,9 +179,52 @@ typedef struct PartialVisibility {
#define ME_SMOOTH 1
#define ME_FACE_SEL 2
/* flag ME_HIDE==16 is used here too */
-
-#endif
/* mselect->type */
#define ME_VSEl 0
#define ME_ESEl 1
#define ME_FSEL 2
+
+/* mtface->flag */
+#define TF_SELECT 1
+#define TF_ACTIVE 2
+#define TF_SEL1 4
+#define TF_SEL2 8
+#define TF_SEL3 16
+#define TF_SEL4 32
+#define TF_HIDE 64
+
+/* mtface->mode */
+#define TF_DYNAMIC 1
+#define TF_DEPRECATED 2
+#define TF_TEX 4
+#define TF_SHAREDVERT 8
+#define TF_LIGHT 16
+
+#define TF_SHAREDCOL 64
+#define TF_TILES 128
+#define TF_BILLBOARD 256
+#define TF_TWOSIDE 512
+#define TF_INVISIBLE 1024
+
+#define TF_OBCOL 2048
+#define TF_BILLBOARD2 4096 /* with Z axis constraint */
+#define TF_SHADOW 8192
+#define TF_BMFONT 16384
+
+/* mtface->transp */
+#define TF_SOLID 0
+#define TF_ADD 1
+#define TF_ALPHA 2
+#define TF_SUB 3
+
+/* mtface->unwrap */
+#define TF_DEPRECATED1 1
+#define TF_DEPRECATED2 2
+#define TF_DEPRECATED3 4
+#define TF_DEPRECATED4 8
+#define TF_PIN1 16
+#define TF_PIN2 32
+#define TF_PIN3 64
+#define TF_PIN4 128
+
+#endif
diff --git a/source/blender/makesdna/intern/makesdna.c b/source/blender/makesdna/intern/makesdna.c
index e7abcb1508e..79e839a172f 100644
--- a/source/blender/makesdna/intern/makesdna.c
+++ b/source/blender/makesdna/intern/makesdna.c
@@ -126,6 +126,7 @@ char *includefiles[] = {
"DNA_node_types.h",
"DNA_color_types.h",
"DNA_brush_types.h",
+ "DNA_customdata_types.h",
// if you add files here, please add them at the end
// of makesdna.c (this file) as well
@@ -1135,4 +1136,5 @@ int main(int argc, char ** argv)
#include "DNA_node_types.h"
#include "DNA_color_types.h"
#include "DNA_brush_types.h"
+#include "DNA_customdata_types.h"
/* end of list */
diff --git a/source/blender/python/api2_2x/Mesh.c b/source/blender/python/api2_2x/Mesh.c
index c78f4e3053f..c30f974e457 100644
--- a/source/blender/python/api2_2x/Mesh.c
+++ b/source/blender/python/api2_2x/Mesh.c
@@ -54,13 +54,14 @@
#include "BIF_editmesh.h"
#include "BIF_meshtools.h"
+#include "BKE_customdata.h"
#include "BKE_deform.h"
+#include "BKE_displist.h"
#include "BKE_mesh.h"
#include "BKE_material.h"
#include "BKE_main.h"
#include "BKE_global.h"
#include "BKE_library.h"
-#include "BKE_displist.h"
#include "BKE_DerivedMesh.h"
#include "BKE_object.h"
#include "BKE_mball.h"
@@ -264,64 +265,6 @@ static void mesh_update( Mesh * mesh )
Object_updateDag( (void *) mesh );
}
-static void delete_dverts( Mesh *mesh, unsigned int *vert_table, int to_delete )
-{
- unsigned int *tmpvert;
- int i;
- char state;
- MDeformVert *newvert, *srcvert, *dstvert;
- int count;
-
- newvert = (MDeformVert *)MEM_mallocN(
- sizeof( MDeformVert )*( mesh->totvert-to_delete ), "MDeformVerts" );
-
- /*
- * do "smart compaction" of the table; find and copy groups of vertices
- * which are not being deleted
- */
-
- dstvert = newvert;
- srcvert = mesh->dvert;
- tmpvert = vert_table;
- count = 0;
- state = 1;
- for( i = 0; i < mesh->totvert; ++i, ++tmpvert ) {
- switch( state ) {
- case 0: /* skipping verts */
- if( *tmpvert == UINT_MAX )
- ++count;
- else {
- srcvert = mesh->dvert + i;
- count = 1;
- state = 1;
- }
- break;
- case 1: /* gathering verts */
- if( *tmpvert != UINT_MAX ) {
- ++count;
- } else {
- if( count ) {
- memcpy( dstvert, srcvert, sizeof( MDeformVert ) * count );
- dstvert += count;
- }
- count = 1;
- state = 0;
- }
- }
- if( !state && mesh->dvert[i].dw )
- MEM_freeN( mesh->dvert[i].dw );
- }
-
- /* if we were gathering verts at the end of the loop, copy those */
- if( state && count )
- memcpy( dstvert, srcvert, sizeof( MDeformVert ) * count );
-
- /* delete old vertex list, install the new one */
-
- MEM_freeN( mesh->dvert );
- mesh->dvert = newvert;
-}
-
/*
* delete vertices from mesh, then delete edges/keys/faces which used those
* vertices
@@ -359,34 +302,19 @@ static void delete_verts( Mesh *mesh, unsigned int *vert_table, int to_delete )
*/
unsigned int *tmpvert;
- int i;
- char state;
- MVert *newvert, *srcvert, *dstvert;
- int count;
- MSticky *newsticky = NULL, *srcsticky, *dststicky;
-
- /* is there are deformed verts also, delete them first */
- if( mesh->dvert )
- delete_dverts( mesh, vert_table, to_delete );
-
- newvert = (MVert *)MEM_mallocN(
- sizeof( MVert )*( mesh->totvert-to_delete ), "MVerts" );
+ CustomData vdata;
+ int i, count, state, dstindex, totvert;
- /* is there are UV verts, track them too */
- if( mesh->msticky )
- newsticky = (MSticky *)MEM_mallocN(
- sizeof( MSticky )*( mesh->totvert-to_delete ), "MStickies" );
+ totvert = mesh->totvert - to_delete;
+ CustomData_copy( &mesh->vdata, &vdata, CD_MASK_MESH, CD_CALLOC, totvert );
/*
* do "smart compaction" of the table; find and copy groups of vertices
* which are not being deleted
*/
- dstvert = newvert;
- srcvert = mesh->mvert;
+ dstindex = 0;
tmpvert = vert_table;
- dststicky = newsticky;
- srcsticky = mesh->msticky;
count = 0;
state = 1;
for( i = 0; i < mesh->totvert; ++i, ++tmpvert ) {
@@ -395,8 +323,6 @@ static void delete_verts( Mesh *mesh, unsigned int *vert_table, int to_delete )
if( *tmpvert == UINT_MAX ) {
++count;
} else {
- srcvert = mesh->mvert + i;
- srcsticky = mesh->msticky + i;
count = 1;
state = 1;
}
@@ -406,13 +332,9 @@ static void delete_verts( Mesh *mesh, unsigned int *vert_table, int to_delete )
++count;
} else {
if( count ) {
- memcpy( dstvert, srcvert, sizeof( MVert ) * count );
- dstvert += count;
- if( newsticky ) {
- memcpy( dststicky, srcsticky, sizeof( MSticky )
- * count );
- dststicky += count;
- }
+ CustomData_copy_data( &mesh->vdata, &vdata, i,
+ dstindex, count );
+ dstindex += count;
}
count = 1;
state = 0;
@@ -421,21 +343,14 @@ static void delete_verts( Mesh *mesh, unsigned int *vert_table, int to_delete )
}
/* if we were gathering verts at the end of the loop, copy those */
- if( state && count ) {
- memcpy( dstvert, srcvert, sizeof( MVert ) * count );
- if( newsticky )
- memcpy( dststicky, srcsticky, sizeof( MSticky ) * count );
- }
+ if( state && count )
+ CustomData_copy_data( &mesh->vdata, &vdata, i, dstindex, count );
/* delete old vertex list, install the new one, update vertex count */
-
- MEM_freeN( mesh->mvert );
- mesh->mvert = newvert;
- if( newsticky ) {
- MEM_freeN( mesh->msticky );
- mesh->msticky = newsticky;
- }
- mesh->totvert -= to_delete;
+ CustomData_free( &mesh->vdata, mesh->totvert );
+ mesh->vdata = vdata;
+ mesh->totvert = totvert;
+ mesh_update_customdata_pointers( mesh );
}
static void delete_edges( Mesh *mesh, unsigned int *vert_table, int to_delete )
@@ -456,21 +371,20 @@ static void delete_edges( Mesh *mesh, unsigned int *vert_table, int to_delete )
/* if there are edges to delete, handle it */
if( to_delete ) {
- MEdge *newedge, *srcedge, *dstedge;
- int count, state;
-
+ CustomData edata;
+ int count, state, dstindex, totedge;
+
/* allocate new edge list and populate */
- newedge = (MEdge *)MEM_mallocN(
- sizeof( MEdge )*( mesh->totedge-to_delete ), "MEdges" );
+ totedge = mesh->totedge - to_delete;
+ CustomData_copy( &mesh->edata, &edata, CD_MASK_MESH, CD_CALLOC, totedge);
/*
* do "smart compaction" of the edges; find and copy groups of edges
* which are not being deleted
*/
- dstedge = newedge;
- srcedge = mesh->medge;
- tmpedge = srcedge;
+ dstindex = 0;
+ tmpedge = mesh->medge;
count = 0;
state = 1;
for( i = 0; i < mesh->totedge; ++i, ++tmpedge ) {
@@ -479,7 +393,6 @@ static void delete_edges( Mesh *mesh, unsigned int *vert_table, int to_delete )
if( tmpedge->v1 == UINT_MAX ) {
++count;
} else {
- srcedge = tmpedge;
count = 1;
state = 1;
}
@@ -489,8 +402,9 @@ static void delete_edges( Mesh *mesh, unsigned int *vert_table, int to_delete )
++count;
} else {
if( count ) {
- memcpy( dstedge, srcedge, sizeof( MEdge ) * count );
- dstedge += count;
+ CustomData_copy_data( &mesh->edata, &edata, i,
+ dstindex, count );
+ dstindex += count;
}
count = 1;
state = 0;
@@ -501,12 +415,13 @@ static void delete_edges( Mesh *mesh, unsigned int *vert_table, int to_delete )
/* copy any pending good edges */
if( state && count )
- memcpy( dstedge, srcedge, sizeof( MEdge ) * count );
+ CustomData_copy_data( &mesh->edata, &edata, i, dstindex, count );
- /* delete old vertex list, install the new one, update vertex count */
- MEM_freeN( mesh->medge );
- mesh->medge = newedge;
- mesh->totedge -= to_delete;
+ /* delete old edge list, install the new one, update vertex count */
+ CustomData_free( &mesh->edata, mesh->totedge );
+ mesh->edata = edata;
+ mesh->totedge = totedge;
+ mesh_update_customdata_pointers( mesh );
}
/* if vertices were deleted, update edge's vertices */
@@ -519,85 +434,26 @@ static void delete_edges( Mesh *mesh, unsigned int *vert_table, int to_delete )
}
}
-/*
- * Since all faces must have 3 or 4 verts, we can't have v3 or v4 be zero.
- * If that happens during the deletion, we have to shuffle the vertices
- * around; otherwise it can cause an Eeekadoodle or worse. If there are
- * texture faces as well, they have to be shuffled as well.
- *
- * (code borrowed from test_index_face() in mesh.c, but since we know the
- * faces already have correct number of vertices, this is a little faster)
- */
-
-static void eeek_fix( MFace *mface, TFace *tface, int len4 )
-{
- /* if 4 verts, then neither v3 nor v4 can be zero */
- if( len4 ) {
- if( !mface->v3 || !mface->v4 ) {
- SWAP( int, mface->v1, mface->v3 );
- SWAP( int, mface->v2, mface->v4 );
- if( tface ) {
- SWAP( float, tface->uv[0][0], tface->uv[2][0] );
- SWAP( float, tface->uv[0][1], tface->uv[2][1] );
- SWAP( float, tface->uv[1][0], tface->uv[3][0] );
- SWAP( float, tface->uv[1][1], tface->uv[3][1] );
- SWAP( unsigned int, tface->col[0], tface->col[2] );
- SWAP( unsigned int, tface->col[1], tface->col[3] );
- }
- }
- } else if( !mface->v3 ) {
- /* if 2 verts, then just v3 cannot be zero (v4 MUST be zero) */
- SWAP( int, mface->v1, mface->v2 );
- SWAP( int, mface->v2, mface->v3 );
- if( tface ) {
- SWAP( float, tface->uv[0][0], tface->uv[1][0] );
- SWAP( float, tface->uv[0][1], tface->uv[1][1] );
- SWAP( float, tface->uv[2][0], tface->uv[1][0] );
- SWAP( float, tface->uv[2][1], tface->uv[1][1] );
- SWAP( unsigned int, tface->col[0], tface->col[1] );
- SWAP( unsigned int, tface->col[1], tface->col[2] );
- }
- }
-}
-
static void delete_faces( Mesh *mesh, unsigned int *vert_table, int to_delete )
{
int i;
MFace *tmpface;
- TFace *tmptface;
- MCol *tmpmcol;
/* if there are faces to delete, handle it */
if( to_delete ) {
- MFace *newface, *srcface, *dstface;
- TFace *newtface = NULL, *srctface, *dsttface;
- MCol *newmcol = NULL, *srcmcol, *dstmcol;
- char state;
- int count;
-
- newface = (MFace *)MEM_mallocN( ( mesh->totface-to_delete )
- * sizeof( MFace ), "MFace" );
- if( mesh->tface )
- newtface = (TFace *)MEM_mallocN( ( mesh->totface-to_delete )
- * sizeof( TFace ), "TFace" );
- else if( mesh->mcol )
- newmcol = (MCol *)MEM_mallocN( ( mesh->totface-to_delete )
- * 4 * sizeof( MCol ), "MCol" );
+ CustomData fdata;
+ int count, state, dstindex, totface;
+
+ totface = mesh->totface - to_delete;
+ CustomData_copy( &mesh->fdata, &fdata, CD_MASK_MESH, CD_CALLOC, totface );
/*
* do "smart compaction" of the faces; find and copy groups of faces
* which are not being deleted
*/
- dstface = newface;
- srcface = mesh->mface;
- tmpface = srcface;
- dsttface = newtface;
- srctface = mesh->tface;
- tmptface = srctface;
- dstmcol = newmcol;
- srcmcol = mesh->mcol;
- tmpmcol = srcmcol;
+ dstindex = 0;
+ tmpface = mesh->mface;
count = 0;
state = 1;
@@ -607,9 +463,6 @@ static void delete_faces( Mesh *mesh, unsigned int *vert_table, int to_delete )
if( tmpface->v1 == UINT_MAX ) {
++count;
} else {
- srcface = tmpface;
- srctface = tmptface;
- srcmcol = tmpmcol;
count = 1;
state = 1;
}
@@ -619,55 +472,34 @@ static void delete_faces( Mesh *mesh, unsigned int *vert_table, int to_delete )
++count;
} else {
if( count ) {
- memcpy( dstface, srcface, sizeof( MFace ) * count );
- dstface += count;
- if( newtface ) {
- memcpy( dsttface, srctface, sizeof( TFace )
- * count );
- dsttface += count;
- } else if( newmcol ) {
- memcpy( dstmcol, srcmcol, sizeof( MCol )
- * 4 * count );
- dstmcol += count;
- }
+ CustomData_copy_data( &mesh->fdata, &fdata, i,
+ dstindex, count );
+ dstindex += count;
}
count = 1;
state = 0;
}
}
++tmpface;
- ++tmptface;
- ++tmpmcol;
}
/* if we were gathering faces at the end of the loop, copy those */
- if ( state && count ) {
- memcpy( dstface, srcface, sizeof( MFace ) * count );
- if( newtface )
- memcpy( dsttface, srctface, sizeof( TFace ) * count );
- else if( newmcol )
- memcpy( dstmcol, srcmcol, sizeof( MCol ) * 4 * count );
- }
+ if ( state && count )
+ CustomData_copy_data( &mesh->fdata, &fdata, i, dstindex, count );
/* delete old face list, install the new one, update face count */
- MEM_freeN( mesh->mface );
- mesh->mface = newface;
- mesh->totface -= to_delete;
- if( newtface ) {
- MEM_freeN( mesh->tface );
- mesh->tface = newtface;
- } else if( newmcol ) {
- MEM_freeN( mesh->mcol );
- mesh->mcol = newmcol;
- }
+ CustomData_free( &mesh->fdata, mesh->totface );
+ mesh->fdata = fdata;
+ mesh->totface = totface;
+ mesh_update_customdata_pointers( mesh );
}
/* if vertices were deleted, update face's vertices */
if( vert_table ) {
tmpface = mesh->mface;
- tmptface = mesh->tface;
- for( i = mesh->totface; i--; ) {
+
+ for( i = 0; i<mesh->totface; ++i, ++tmpface ) {
int len4 = tmpface->v4;
tmpface->v1 = vert_table[tmpface->v1];
tmpface->v2 = vert_table[tmpface->v2];
@@ -677,11 +509,7 @@ static void delete_faces( Mesh *mesh, unsigned int *vert_table, int to_delete )
else
tmpface->v4 = 0;
- eeek_fix( tmpface, tmptface, len4 );
-
- ++tmpface;
- if( mesh->tface )
- ++tmptface;
+ test_index_face( tmpface, &mesh->fdata, i, len4? 4: 3);
}
}
}
@@ -1815,6 +1643,7 @@ static PyObject *MVertSeq_extend( BPy_MVertSeq * self, PyObject *args )
PyObject *tmp;
MVert *newvert, *tmpvert;
Mesh *mesh = self->mesh;
+ CustomData vdata;
/* make sure we get a sequence of tuples of something */
switch( PySequence_Size( args ) ) {
@@ -1858,8 +1687,16 @@ static PyObject *MVertSeq_extend( BPy_MVertSeq * self, PyObject *args )
Py_RETURN_NONE;
}
+ /* create custom vertex data arrays and copy existing vertices into it */
+
newlen = mesh->totvert + len;
- newvert = MEM_callocN( sizeof( MVert )*newlen, "MVerts" );
+ CustomData_copy( &mesh->vdata, &vdata, CD_MASK_MESH, CD_DUPLICATE, newlen );
+ CustomData_set_default( &vdata, mesh->totvert, len );
+
+ if ( !CustomData_has_layer( &vdata, CD_MVERT ) )
+ CustomData_add_layer( &vdata, CD_MVERT, 0, NULL, newlen );
+
+ newvert = CustomData_get_layer( &vdata, CD_MVERT );
/* scan the input list and insert the new vertices */
@@ -1869,7 +1706,7 @@ static PyObject *MVertSeq_extend( BPy_MVertSeq * self, PyObject *args )
tmp = PySequence_GetItem( args, i );
if( VectorObject_Check( tmp ) ) {
if( ((VectorObject *)tmp)->size != 3 ) {
- MEM_freeN( newvert );
+ CustomData_free( &vdata, newlen );
Py_DECREF ( tmp );
Py_DECREF ( args );
return EXPP_ReturnPyObjError( PyExc_ValueError,
@@ -1893,14 +1730,14 @@ static PyObject *MVertSeq_extend( BPy_MVertSeq * self, PyObject *args )
}
if( !ok ) {
- MEM_freeN( newvert );
+ CustomData_free( &vdata, newlen );
Py_DECREF ( args );
Py_DECREF ( tmp );
return EXPP_ReturnPyObjError( PyExc_ValueError,
"expected sequence triplet of floats" );
}
} else {
- MEM_freeN( newvert );
+ CustomData_free( &vdata, newlen );
Py_DECREF ( args );
Py_DECREF ( tmp );
return EXPP_ReturnPyObjError( PyExc_ValueError,
@@ -1917,31 +1754,9 @@ static PyObject *MVertSeq_extend( BPy_MVertSeq * self, PyObject *args )
++tmpvert;
}
- /*
- * if we got here we've added all the new verts, so just copy the old
- * verts over and we're done
- */
-
- if( mesh->mvert ) {
- memcpy( newvert, mesh->mvert, mesh->totvert*sizeof(MVert) );
- MEM_freeN( mesh->mvert );
- }
- mesh->mvert = newvert;
-
- /*
- * if there are UV vertives, have to fix those
- */
-
- if( mesh->msticky ) {
- MSticky *tmpsticky;
-
- tmpsticky = MEM_mallocN( newlen*sizeof( MSticky ), "sticky" );
- memset( tmpsticky +mesh->totvert, 255,
- (newlen-mesh->totvert)*sizeof( MSticky ) );
- memcpy( tmpsticky, mesh->msticky, mesh->totvert*sizeof( MSticky ) );
- MEM_freeN( mesh->msticky );
- mesh->msticky = tmpsticky;
- }
+ CustomData_free( &mesh->vdata, mesh->totvert );
+ mesh->vdata = vdata;
+ mesh_update_customdata_pointers( mesh );
/*
* if there are keys, have to fix those lists up
@@ -1976,18 +1791,6 @@ static PyObject *MVertSeq_extend( BPy_MVertSeq * self, PyObject *args )
}
}
- /*
- * if there are vertex groups, also have to fix them
- */
-
- if( mesh->dvert ) {
- MDeformVert *newdvert;
- newdvert = MEM_callocN( sizeof(MDeformVert)*newlen , "mesh defVert" );
- memcpy( newdvert, mesh->dvert, sizeof(MDeformVert)*mesh->totvert );
- MEM_freeN( mesh->dvert );
- mesh->dvert = newdvert;
- }
-
/* set final vertex list size */
mesh->totvert = newlen;
@@ -3052,17 +2855,20 @@ static PyObject *MEdgeSeq_extend( BPy_MEdgeSeq * self, PyObject *args )
/* if any new edges are left, add to list */
if( good_edges ) {
- int totedge = mesh->totedge+good_edges; /* new edge count */
+ CustomData edata;
+ int totedge = mesh->totedge+good_edges;
- /* allocate new edge list */
- tmpedge = MEM_callocN(totedge*sizeof(MEdge), "Mesh_addEdges");
+ /* create custom edge data arrays and copy existing edges into it */
+ CustomData_copy( &mesh->edata, &edata, CD_MASK_MESH, CD_DUPLICATE, totedge );
+ CustomData_set_default( &edata, mesh->totedge, good_edges );
- /* if we're appending, copy the old edge list and delete it */
- if( mesh->medge ) {
- memcpy( tmpedge, mesh->medge, mesh->totedge*sizeof(MEdge));
- MEM_freeN( mesh->medge );
- }
- mesh->medge = tmpedge; /* point to the new edge list */
+ if ( !CustomData_has_layer( &edata, CD_MEDGE ) )
+ CustomData_add_layer( &edata, CD_MEDGE, 0, NULL, totedge );
+
+ /* replace old with new data */
+ CustomData_free( &mesh->edata, mesh->totedge );
+ mesh->edata = edata;
+ mesh_update_customdata_pointers( mesh );
/* resort edges into original order */
qsort( newpair, new_edge_count, sizeof(SrchEdges), medge_index_comp );
@@ -3872,15 +3678,15 @@ static int MFace_setSelect( BPy_MFace * self, PyObject * value,
static PyObject *MFace_getImage( BPy_MFace *self )
{
- TFace *face;
- if( !self->mesh->tface )
+ MTFace *face;
+ if( !self->mesh->mtface )
return EXPP_ReturnPyObjError( PyExc_ValueError,
"face has no texture values" );
if( !MFace_get_pointer( self ) )
return NULL;
- face = &self->mesh->tface[self->index];
+ face = &self->mesh->mtface[self->index];
if( face->tpage )
return Image_CreatePyObject( face->tpage );
@@ -3894,12 +3700,12 @@ static PyObject *MFace_getImage( BPy_MFace *self )
static int MFace_setImage( BPy_MFace *self, PyObject *value )
{
- TFace *face;
+ MTFace *face;
if( !MFace_get_pointer( self ) )
return -1;
- if( !self->mesh->tface )
+ if( !self->mesh->mtface )
#if 0
return EXPP_ReturnIntError( PyExc_ValueError,
"face has no texture values" );
@@ -3907,7 +3713,7 @@ static int MFace_setImage( BPy_MFace *self, PyObject *value )
make_tfaces( self->mesh );
#endif
- face = &self->mesh->tface[self->index];
+ face = &self->mesh->mtface[self->index];
if( value == Py_None )
face->tpage = NULL; /* should memory be freed? */
else {
@@ -3930,14 +3736,14 @@ static int MFace_setImage( BPy_MFace *self, PyObject *value )
static PyObject *MFace_getFlag( BPy_MFace *self )
{
- if( !self->mesh->tface )
+ if( !self->mesh->mtface )
return EXPP_ReturnPyObjError( PyExc_ValueError,
"face has no texture values" );
if( !MFace_get_pointer( self ) )
return NULL;
- return PyInt_FromLong( (long) ( self->mesh->tface[self->index].flag
+ return PyInt_FromLong( (long) ( self->mesh->mtface[self->index].flag
& MFACE_FLAG_BITMASK ) );
}
@@ -3949,7 +3755,7 @@ static int MFace_setFlag( BPy_MFace *self, PyObject *value )
{
int param;
- if( !self->mesh->tface )
+ if( !self->mesh->mtface )
return EXPP_ReturnIntError( PyExc_ValueError,
"face has no texture values" );
@@ -3972,8 +3778,8 @@ static int MFace_setFlag( BPy_MFace *self, PyObject *value )
"invalid bit(s) set in mask" );
/* merge active setting with other new params */
- param |= (self->mesh->tface[self->index].flag & TF_ACTIVE);
- self->mesh->tface[self->index].flag = (char)param;
+ param |= (self->mesh->mtface[self->index].flag & TF_ACTIVE);
+ self->mesh->mtface[self->index].flag = (char)param;
return 0;
}
@@ -3986,14 +3792,14 @@ static PyObject *MFace_getMode( BPy_MFace *self )
{
PyObject *attr;
- if( !self->mesh->tface )
+ if( !self->mesh->mtface )
return EXPP_ReturnPyObjError( PyExc_ValueError,
"face has no texture values" );
if( !MFace_get_pointer( self ) )
return NULL;
- attr = PyInt_FromLong( self->mesh->tface[self->index].mode );
+ attr = PyInt_FromLong( self->mesh->mtface[self->index].mode );
if( attr )
return attr;
@@ -4023,7 +3829,7 @@ static int MFace_setMode( BPy_MFace *self, PyObject *value )
| TF_SHADOW
| TF_BMFONT;
- if( !self->mesh->tface )
+ if( !self->mesh->mtface )
return EXPP_ReturnIntError( PyExc_ValueError,
"face has no texture values" );
@@ -4050,7 +3856,7 @@ static int MFace_setMode( BPy_MFace *self, PyObject *value )
return EXPP_ReturnIntError( PyExc_ValueError,
"HALO and BILLBOARD cannot be enabled simultaneously" );
- self->mesh->tface[self->index].mode = (short)param;
+ self->mesh->mtface[self->index].mode = (short)param;
return 0;
}
@@ -4062,14 +3868,14 @@ static int MFace_setMode( BPy_MFace *self, PyObject *value )
static PyObject *MFace_getTransp( BPy_MFace *self )
{
PyObject *attr;
- if( !self->mesh->tface )
+ if( !self->mesh->mtface )
return EXPP_ReturnPyObjError( PyExc_ValueError,
"face has no texture values" );
if( !MFace_get_pointer( self ) )
return NULL;
- attr = PyInt_FromLong( self->mesh->tface[self->index].transp );
+ attr = PyInt_FromLong( self->mesh->mtface[self->index].transp );
if( attr )
return attr;
@@ -4084,7 +3890,7 @@ static PyObject *MFace_getTransp( BPy_MFace *self )
static int MFace_setTransp( BPy_MFace *self, PyObject *value )
{
- if( !self->mesh->tface )
+ if( !self->mesh->mtface )
return EXPP_ReturnIntError( PyExc_ValueError,
"face has no texture values" );
@@ -4092,7 +3898,7 @@ static int MFace_setTransp( BPy_MFace *self, PyObject *value )
return -1;
return EXPP_setIValueRange( value,
- &self->mesh->tface[self->index].transp, TF_SOLID, TF_SUB, 'b' );
+ &self->mesh->mtface[self->index].transp, TF_SOLID, TF_SUB, 'b' );
}
/*
@@ -4101,18 +3907,18 @@ static int MFace_setTransp( BPy_MFace *self, PyObject *value )
static PyObject *MFace_getUV( BPy_MFace * self )
{
- TFace *face;
+ MTFace *face;
PyObject *attr;
int length, i;
- if( !self->mesh->tface )
+ if( !self->mesh->mtface )
return EXPP_ReturnPyObjError( PyExc_ValueError,
"face has no texture values" );
if( !MFace_get_pointer( self ) )
return NULL;
- face = &self->mesh->tface[self->index];
+ face = &self->mesh->mtface[self->index];
length = self->mesh->mface[self->index].v4 ? 4 : 3;
attr = PyTuple_New( length );
@@ -4136,7 +3942,7 @@ static PyObject *MFace_getUV( BPy_MFace * self )
static int MFace_setUV( BPy_MFace * self, PyObject * value )
{
- TFace *face;
+ MTFace *face;
int length, i;
if( !MFace_get_pointer( self ) )
@@ -4152,7 +3958,7 @@ static int MFace_setUV( BPy_MFace * self, PyObject * value )
return EXPP_ReturnIntError( PyExc_TypeError,
"size of vertex and UV sequences differ" );
- if( !self->mesh->tface )
+ if( !self->mesh->mtface )
#if 0
return EXPP_ReturnIntError( PyExc_ValueError,
"face has no texture values" );
@@ -4160,7 +3966,7 @@ static int MFace_setUV( BPy_MFace * self, PyObject * value )
make_tfaces( self->mesh );
#endif
- face = &self->mesh->tface[self->index];
+ face = &self->mesh->mtface[self->index];
for( i=0; i<length; ++i ) {
VectorObject *vector = (VectorObject *)PySequence_ITEM( value, i );
face->uv[i][0] = vector->vec[0];
@@ -4176,18 +3982,18 @@ static int MFace_setUV( BPy_MFace * self, PyObject * value )
static PyObject *MFace_getUVSel( BPy_MFace * self )
{
- TFace *face;
+ MTFace *face;
PyObject *attr;
int length, i, mask;
- if( !self->mesh->tface )
+ if( !self->mesh->mtface )
return EXPP_ReturnPyObjError( PyExc_ValueError,
"face has no texture values" );
if( !MFace_get_pointer( self ) )
return NULL;
- face = &self->mesh->tface[self->index];
+ face = &self->mesh->mtface[self->index];
length = self->mesh->mface[self->index].v4 ? 4 : 3;
attr = PyTuple_New( length );
@@ -4216,7 +4022,7 @@ static PyObject *MFace_getUVSel( BPy_MFace * self )
static int MFace_setUVSel( BPy_MFace * self, PyObject * value )
{
- TFace *face;
+ MTFace *face;
int length, i, mask;
if( !MFace_get_pointer( self ) )
@@ -4231,7 +4037,7 @@ static int MFace_setUVSel( BPy_MFace * self, PyObject * value )
return EXPP_ReturnIntError( PyExc_TypeError,
"size of vertex and UV lists differ" );
- if( !self->mesh->tface )
+ if( !self->mesh->mtface )
#if 0
return EXPP_ReturnIntError( PyExc_ValueError,
"face has no texture values" );
@@ -4240,7 +4046,7 @@ static int MFace_setUVSel( BPy_MFace * self, PyObject * value )
#endif
/* set coord select state, one bit at a time */
- face = &self->mesh->tface[self->index];
+ face = &self->mesh->mtface[self->index];
mask = TF_SEL1;
for( i=0; i<length; ++i, mask <<= 1 ) {
PyObject *tmp = PySequence_GetItem( value, i ); /* adds a reference, remove below */
@@ -4259,7 +4065,7 @@ static int MFace_setUVSel( BPy_MFace * self, PyObject * value )
}
/*
- * get a face's vertex colors. note that if mesh->tfaces is defined, then
+ * get a face's vertex colors. note that if mesh->mtfaces is defined, then
* it takes precedent over mesh->mcol
*/
@@ -4271,17 +4077,14 @@ static PyObject *MFace_getCol( BPy_MFace * self )
/* if there's no mesh color vectors or texture faces, nothing to do */
- if( !self->mesh->mcol && !self->mesh->tface )
+ if( !self->mesh->mcol )
return EXPP_ReturnPyObjError( PyExc_ValueError,
"face has no vertex colors" );
if( !MFace_get_pointer( self ) )
return NULL;
- if( self->mesh->tface )
- mcol = (MCol *) self->mesh->tface[self->index].col;
- else
- mcol = &self->mesh->mcol[self->index*4];
+ mcol = &self->mesh->mcol[self->index*4];
length = self->mesh->mface[self->index].v4 ? 4 : 3;
attr = PyTuple_New( length );
@@ -4311,17 +4114,14 @@ static int MFace_setCol( BPy_MFace * self, PyObject *value )
/* if there's no mesh color vectors or texture faces, nothing to do */
- if( !self->mesh->mcol && !self->mesh->tface )
+ if( !self->mesh->mcol )
return EXPP_ReturnIntError( PyExc_ValueError,
"face has no vertex colors" );
if( !MFace_get_pointer( self ) )
return -1;
- if( self->mesh->tface )
- mcol = (MCol *) self->mesh->tface[self->index].col;
- else
- mcol = &self->mesh->mcol[self->index*4];
+ mcol = &self->mesh->mcol[self->index*4];
length = self->mesh->mface[self->index].v4 ? 4 : 3;
@@ -4875,7 +4675,7 @@ static PyObject *MFaceSeq_extend( BPy_MEdgeSeq * self, PyObject *args,
* go through some contortions to guarantee the third and fourth
* vertices are not index 0
*/
- eeek_fix( &tmpface, NULL, nverts==4 );
+ test_index_face( &tmpface, NULL, 0, nverts );
vert[0] = tmpface.v1;
vert[1] = tmpface.v2;
vert[2] = tmpface.v3;
@@ -5000,46 +4800,23 @@ static PyObject *MFaceSeq_extend( BPy_MEdgeSeq * self, PyObject *args,
/* if any new faces are left, add to list */
if( good_faces || return_list ) {
int totface = mesh->totface+good_faces; /* new face count */
+ CustomData fdata;
- /* if mesh has tfaces, reallocate them first */
- if( mesh->tface ) {
- TFace *tmptface;
+ CustomData_copy( &mesh->fdata, &fdata, CD_MASK_MESH, CD_DUPLICATE, totface );
+ CustomData_set_default( &fdata, mesh->totface, good_faces );
- tmptface = MEM_callocN(totface*sizeof(TFace), "Mesh_addFaces");
- memcpy( tmptface, mesh->tface, mesh->totface*sizeof(TFace));
- MEM_freeN( mesh->tface );
- mesh->tface = tmptface;
-
- /* make new faces tex faces have default tex values */
- tmptface= mesh->tface + mesh->totface;
- for( i = good_faces; i-- ; ) {
- default_tface(tmptface);
- tmptface++;
- }
-
- } else if( mesh->mcol ) {
- MCol *tmpmcol;
+ if ( !CustomData_has_layer( &fdata, CD_MFACE ) )
+ CustomData_add_layer( &fdata, CD_MFACE, 0, NULL, totface );
- tmpmcol = MEM_callocN(totface*4*sizeof(MCol), "Mesh_addFaces");
- memcpy( tmpmcol, mesh->mcol, mesh->totface*4*sizeof(MCol));
- MEM_freeN( mesh->mcol );
- mesh->mcol = tmpmcol;
- }
+ CustomData_free( &mesh->fdata, mesh->totface );
+ mesh->fdata = fdata;
+ mesh_update_customdata_pointers( mesh );
/* sort the faces back into their original input list order */
if( !ignore_dups )
qsort( newpair, new_face_count, sizeof(SrchFaces),
mface_index_comp );
- /* allocate new face list */
- tmpface = MEM_callocN(totface*sizeof(MFace), "Mesh_addFaces");
-
- /* if we're appending, copy the old face list and delete it */
- if( mesh->mface ) {
- memcpy( tmpface, mesh->mface, mesh->totface*sizeof(MFace));
- MEM_freeN( mesh->mface );
- }
- mesh->mface = tmpface; /* point to the new face list */
/* point to the first face we're going to add */
tmpface = &mesh->mface[mesh->totface];
@@ -5473,7 +5250,7 @@ static PyObject *Mesh_vertexShade( BPy_Mesh * self )
base->object->data == self->mesh ) {
base->flag |= SELECT;
set_active_base( base );
- make_vertexcol();
+ make_vertexcol(1);
countall();
return EXPP_incr_ret( Py_None );
}
@@ -5712,7 +5489,6 @@ static PyObject *Mesh_getFromObject( BPy_Mesh * self, PyObject * args )
ID tmpid;
Mesh *tmpmesh;
Curve *tmpcu = NULL;
- DispListMesh *dlm;
DerivedMesh *dm;
Object *tmpobj = NULL;
int cage = 0, render = 0, i;
@@ -5782,20 +5558,6 @@ static PyObject *Mesh_getFromObject( BPy_Mesh * self, PyObject * args )
tmpmesh = add_mesh();
mball_to_mesh( &ob->disp, tmpmesh );
- /*
- * mball_to_mesh doesn't create edges, which confuses Blender in
- * object mode. So this hack is necessary to quickly calculate the
- * edges from the face list.
- */
-
- dlm = MEM_callocN( sizeof(DispListMesh), "tmp displist");
- dlm->totface = tmpmesh->totface;
- dlm->mface = tmpmesh->mface;
- displistmesh_add_edges( dlm );
- tmpmesh->totedge = dlm->totedge;
- tmpmesh->medge = dlm->medge;
- MEM_freeN( dlm );
-
break;
case OB_MESH:
/* copies object and modifiers (but not the data) */
@@ -5812,9 +5574,8 @@ static PyObject *Mesh_getFromObject( BPy_Mesh * self, PyObject * args )
else
dm = mesh_create_derived_view( ob );
- dlm = dm->convertToDispListMesh( dm, 0 );
tmpmesh = add_mesh( );
- displistmesh_to_mesh( dlm, tmpmesh );
+ DM_to_mesh( dm, tmpmesh );
dm->release( dm );
}
@@ -6789,7 +6550,7 @@ static int Mesh_setVerts( BPy_Mesh * self, PyObject * args )
Mesh *me = self->mesh;
free_mesh( me );
me->mvert = NULL; me->medge = NULL; me->mface = NULL;
- me->tface = NULL; me->dvert = NULL; me->mcol = NULL;
+ me->mtface = NULL; me->dvert = NULL; me->mcol = NULL;
me->msticky = NULL; me->mat = NULL; me->bb = NULL;
me->totvert = me->totedge = me->totface = me->totcol = 0;
mesh_update( me );
@@ -7034,7 +6795,7 @@ static PyObject *Mesh_getFlag( BPy_Mesh * self, void *type )
switch( (long)type ) {
case MESH_HASFACEUV:
- attr = self->mesh->tface ? EXPP_incr_ret_True() :
+ attr = self->mesh->mtface ? EXPP_incr_ret_True() :
EXPP_incr_ret_False();
break;
case MESH_HASMCOL:
@@ -7068,16 +6829,15 @@ static int Mesh_setFlag( BPy_Mesh * self, PyObject *value, void *type )
"expected int argument in range [0,1]" );
/* sticky is independent of faceUV and vertUV */
- /* faceUV (tface) has priority over vertUV (mcol) */
switch( (long)type ) {
case MESH_HASFACEUV:
if( !param ) {
- if( mesh->tface ) {
- MEM_freeN( mesh->tface );
- mesh->tface = NULL;
+ if( mesh->mtface ) {
+ CustomData_free_layer( &mesh->fdata, CD_MTFACE, mesh->totface );
+ mesh->mtface = NULL;
}
- } else if( !mesh->tface ) {
+ } else if( !mesh->mtface ) {
if( !mesh->totface )
return EXPP_ReturnIntError( PyExc_RuntimeError,
"mesh has no faces" );
@@ -7087,29 +6847,27 @@ static int Mesh_setFlag( BPy_Mesh * self, PyObject *value, void *type )
case MESH_HASMCOL:
if( !param ) {
if( mesh->mcol ) {
- MEM_freeN( mesh->mcol );
+ CustomData_free_layer( &mesh->fdata, CD_MCOL, mesh->totface );
mesh->mcol = NULL;
}
} else if( !mesh->mcol ) {
/* TODO: mesh_create_shadedColors */
- mesh->mcol = MEM_callocN( sizeof(unsigned int)*mesh->totface*4,
- "mcol" );
+ mesh->mcol = CustomData_add_layer( &mesh->fdata, CD_MCOL, 0, NULL,
+ mesh->totface );
for( i = 0; i < mesh->totface*4; i++ )
mesh->mcol[i].a = 255;
- if( mesh->tface )
- mcol_to_tface( mesh, 1 );
}
return 0;
case MESH_HASVERTUV:
if( !param ) {
if( mesh->msticky ) {
- MEM_freeN( mesh->msticky );
+ CustomData_free_layer( &mesh->vdata, CD_MSTICKY, mesh->totvert );
mesh->msticky = NULL;
}
} else {
if( !mesh->msticky ) {
- mesh->msticky= MEM_mallocN( mesh->totvert*sizeof( MSticky ),
- "sticky" );
+ mesh->msticky = CustomData_add_layer( &mesh->vdata, CD_MSTICKY,
+ 0, NULL, mesh->totvert );
memset( mesh->msticky, 255, mesh->totvert*sizeof( MSticky ) );
/* TODO: rework RE_make_sticky() so we can calculate */
}
@@ -7166,14 +6924,14 @@ static PyObject *Mesh_getKey( BPy_Mesh * self )
static PyObject *Mesh_getActiveFace( BPy_Mesh * self )
{
- TFace *face;
+ MTFace *face;
int i, totface;
- if( !self->mesh->tface )
+ if( !self->mesh->mtface )
return EXPP_ReturnPyObjError( PyExc_ValueError,
"face has no texture values" );
- face = self->mesh->tface;
+ face = self->mesh->mtface;
totface = self->mesh->totface;
for( i = 0; i < totface; ++face, ++i )
@@ -7192,12 +6950,12 @@ static PyObject *Mesh_getActiveFace( BPy_Mesh * self )
static int Mesh_setActiveFace( BPy_Mesh * self, PyObject * value )
{
- TFace *face;
+ MTFace *face;
int param;
/* if no texture faces, error */
- if( !self->mesh->tface )
+ if( !self->mesh->mtface )
return EXPP_ReturnIntError( PyExc_ValueError,
"face has no texture values" );
@@ -7214,7 +6972,7 @@ static int Mesh_setActiveFace( BPy_Mesh * self, PyObject * value )
return EXPP_ReturnIntError( PyExc_TypeError,
"face index out of range" );
- face = self->mesh->tface;
+ face = self->mesh->mtface;
/* if requested face isn't already active, then inactivate all
* faces and activate the requested one */
@@ -7223,7 +6981,7 @@ static int Mesh_setActiveFace( BPy_Mesh * self, PyObject * value )
int i;
for( i = self->mesh->totface; i > 0; ++face, --i )
face->flag &= ~TF_ACTIVE;
- self->mesh->tface[param].flag |= TF_ACTIVE;
+ self->mesh->mtface[param].flag |= TF_ACTIVE;
}
return 0;
}
diff --git a/source/blender/python/api2_2x/NMesh.c b/source/blender/python/api2_2x/NMesh.c
index 4733bff2899..6f8bf1eb95a 100644
--- a/source/blender/python/api2_2x/NMesh.c
+++ b/source/blender/python/api2_2x/NMesh.c
@@ -52,14 +52,15 @@
#include "BIF_editview.h"
#include "BIF_space.h"
+#include "BKE_customdata.h"
#include "BKE_deform.h"
#include "BKE_mesh.h"
#include "BKE_material.h"
#include "BKE_main.h"
#include "BKE_global.h"
#include "BKE_library.h"
-#include "BKE_displist.h"
#include "BKE_DerivedMesh.h"
+#include "BKE_displist.h"
#include "BKE_object.h"
#include "BKE_mball.h"
#include "BKE_utildefines.h"
@@ -1272,14 +1273,14 @@ static PyObject *NMesh_getSelectedFaces( PyObject * self, PyObject * args )
Mesh *me = nm->mesh;
int flag = 0;
- TFace *tf;
+ MTFace *tf;
int i;
PyObject *l = PyList_New( 0 );
if( me == NULL )
return NULL;
- tf = me->tface;
+ tf = me->mtface;
if( tf == 0 )
return l;
@@ -1454,8 +1455,8 @@ static PyObject *NMesh_update( PyObject *self, PyObject *a, PyObject *kwd )
}
/* recalculate the derived mesh before trying to use it */
- makeDispListMesh (nmesh->object);
- make_vertexcol();
+ makeDerivedMesh(nmesh->object);
+ make_vertexcol(1);
countall();
}
@@ -1960,7 +1961,7 @@ PyTypeObject NMesh_Type = {
};
static BPy_NMFace *nmface_from_data( BPy_NMesh * mesh, int vidxs[4],
- char mat_nr, char flag, TFace * tface, MCol * col )
+ char mat_nr, char flag, MTFace * tface, MCol * col )
{
BPy_NMFace *newf = PyObject_NEW( BPy_NMFace, &NMFace_Type );
int i, len;
@@ -1994,7 +1995,6 @@ static BPy_NMFace *nmface_from_data( BPy_NMesh * mesh, int vidxs[4],
newf->mode = tface->mode; /* draw mode */
newf->flag = tface->flag; /* select flag */
newf->transp = tface->transp; /* transparency flag */
- col = ( MCol * ) ( tface->col ); /* weird, tface->col is uint[4] */
} else {
newf->mode = TF_DYNAMIC; /* just to initialize it to something meaninful, */
/* since without tfaces there are no tface->mode's, obviously. */
@@ -2062,13 +2062,13 @@ static BPy_NMVert *nmvert_from_data( MVert * vert, MSticky * st, float *co,
static int get_active_faceindex( Mesh * me )
{
- TFace *tf;
+ MTFace *tf;
int i;
if( me == NULL )
return -1;
- tf = me->tface;
+ tf = me->mtface;
if( tf == 0 )
return -1;
@@ -2321,7 +2321,7 @@ static PyObject *new_NMesh_displist(ListBase *lb, Object *ob)
}
static PyObject *new_NMesh_internal( Mesh * oldmesh,
- DispListMesh * dlm )
+ DerivedMesh *dm )
{
BPy_NMesh *me = PyObject_NEW( BPy_NMesh, &NMesh_Type );
me->flags = 0;
@@ -2343,7 +2343,7 @@ static PyObject *new_NMesh_internal( Mesh * oldmesh,
MVert *mverts;
MSticky *msticky;
MFace *mfaces;
- TFace *tfaces;
+ MTFace *tfaces;
MCol *mcols;
MEdge *medges;
int i, totvert, totface, totedge;
@@ -2357,22 +2357,22 @@ static PyObject *new_NMesh_internal( Mesh * oldmesh,
me->sel_face = get_active_faceindex( oldmesh );
- if( dlm ) {
+ if( dm ) {
msticky = NULL;
- mverts = dlm->mvert;
- mfaces = dlm->mface;
- tfaces = dlm->tface;
- mcols = dlm->mcol;
- medges = dlm->medge;
-
- totvert = dlm->totvert;
- totface = dlm->totface;
- totedge = dlm->totedge;
+ mverts = dm->getVertArray(dm);
+ mfaces = dm->getFaceArray(dm);
+ tfaces = dm->getFaceDataArray(dm, CD_MTFACE);
+ mcols = dm->getFaceDataArray(dm, CD_MCOL);
+ medges = dm->getEdgeArray(dm);
+
+ totvert = dm->getNumVerts(dm);
+ totedge = dm->getNumEdges(dm);
+ totface = dm->getNumFaces(dm);;
} else {
msticky = oldmesh->msticky;
mverts = oldmesh->mvert;
mfaces = oldmesh->mface;
- tfaces = oldmesh->tface;
+ tfaces = oldmesh->mtface;
mcols = oldmesh->mcol;
medges = oldmesh->medge;
@@ -2404,7 +2404,7 @@ static PyObject *new_NMesh_internal( Mesh * oldmesh,
me->faces = PyList_New( totface );
for( i = 0; i < totface; i++ ) {
- TFace *oldtf = tfaces ? &tfaces[i] : NULL;
+ MTFace *oldtf = tfaces ? &tfaces[i] : NULL;
MCol *oldmc = mcols ? &mcols[i * 4] : NULL;
MFace *oldmf = &mfaces[i];
int vidxs[4];
@@ -2558,9 +2558,7 @@ static PyObject *M_NMesh_GetRawFromObject( PyObject * self, PyObject * args )
case OB_MESH:
{
DerivedMesh *dm = mesh_create_derived_render( ob );
- DispListMesh *dlm = dm->convertToDispListMesh(dm, 1);
- nmesh = new_NMesh_internal( ob->data, dlm );
- displistmesh_free(dlm);
+ nmesh = new_NMesh_internal( ob->data, dm );
dm->release(dm);
}
break;
@@ -2595,43 +2593,7 @@ static void mvert_from_data( MVert * mv, MSticky * st, BPy_NMVert * from )
}
}
-/*@ TODO: this function is just a added hack. Don't look at the
- * RGBA/BRGA confusion, it just works, but will never work with
- * a restructured Blender */
-
-static void assign_perFaceColors( TFace * tf, BPy_NMFace * from )
-{
- MCol *col;
- int i;
-
- col = ( MCol * ) ( tf->col );
-
- if( col ) {
- int len = PySequence_Length( from->col );
-
- if( len > 4 )
- len = 4;
-
- for( i = 0; i < len; i++, col++ ) {
- BPy_NMCol *mc =
- ( BPy_NMCol * ) PySequence_GetItem( from->col,
- i );
- if( !BPy_NMCol_Check( mc ) ) {
- Py_DECREF( mc );
- continue;
- }
-
- col->r = mc->b;
- col->b = mc->r;
- col->g = mc->g;
- col->a = mc->a;
-
- Py_DECREF( mc );
- }
- }
-}
-
-static int assignFaceUV( TFace * tf, BPy_NMFace * nmface )
+static int assignFaceUV( MTFace * tf, BPy_NMFace * nmface )
{
PyObject *fuv, *tmp;
int i;
@@ -2671,15 +2633,15 @@ static int assignFaceUV( TFace * tf, BPy_NMFace * nmface )
tf->flag = (char)nmface->flag; /* copy flag */
tf->transp = nmface->transp; /* copy transp flag */
- /* assign vertex colours */
- assign_perFaceColors( tf, nmface );
return 1;
}
-static int mface_from_data( MFace * mf, TFace * tf, MCol * col,
+static int mface_from_data( MFace * mf, CustomData *fdata, int findex,
BPy_NMFace * from )
{
BPy_NMVert *nmv;
+ MTFace *tf = CustomData_get(fdata, findex, CD_MTFACE);
+ MCol *col = CustomData_get(fdata, findex, CD_MCOL);
int i = PyList_Size( from->v );
if( i != 3 && i != 4 ) { /* face can only have three or four verts */
@@ -2718,8 +2680,6 @@ static int mface_from_data( MFace * mf, TFace * tf, MCol * col,
if( !assignFaceUV( tf, from ) )
return 0;
- test_index_face(mf, NULL, tf, i );
-
mf->mat_nr = from->mat_nr;
mf->flag = from->mf_flag;
@@ -2746,6 +2706,9 @@ static int mface_from_data( MFace * mf, TFace * tf, MCol * col,
Py_DECREF( mc );
}
}
+
+ test_index_face(mf, fdata, findex, i );
+
return 1;
}
@@ -2798,22 +2761,19 @@ static void EXPP_unlink_mesh( Mesh * me )
static int unlink_existingMeshData( Mesh * mesh )
{
EXPP_unlink_mesh( mesh );
- if( mesh->mvert )
- MEM_freeN( mesh->mvert );
- if( mesh->medge ) {
- MEM_freeN( mesh->medge );
- mesh->totedge = 0;
- }
- if( mesh->mface )
- MEM_freeN( mesh->mface );
- if( mesh->mcol )
- MEM_freeN( mesh->mcol );
- if( mesh->msticky )
- MEM_freeN( mesh->msticky );
- if( mesh->mat )
+
+ CustomData_free( &mesh->vdata, mesh->totvert );
+ CustomData_free( &mesh->edata, mesh->totedge );
+ CustomData_free( &mesh->fdata, mesh->totface );
+ mesh_update_customdata_pointers( mesh );
+
+ mesh->totedge = 0;
+
+ if( mesh->mat ) {
MEM_freeN( mesh->mat );
- if( mesh->tface )
- MEM_freeN( mesh->tface );
+ mesh->mat = NULL;
+ }
+
return 1;
}
@@ -2919,8 +2879,9 @@ static void fill_medge_from_nmesh(Mesh * mesh, BPy_NMesh * nmesh)
tot_faces_edges=mesh->totedge;
tot_valid_faces_edges=tot_faces_edges;
- mesh->medge=NULL;
- mesh->totedge = 0;
+ mesh->medge= CustomData_set_layer(&mesh->edata, CD_MEDGE, NULL);
+ CustomData_free_layer(&mesh->edata, CD_MEDGE, mesh->totedge);
+ mesh->totedge = 0;
/* Flag each edge in faces_edges that is already in nmesh->edges list.
* Flaging an edge means MEdge v1=v2=0.
@@ -2964,7 +2925,7 @@ static void fill_medge_from_nmesh(Mesh * mesh, BPy_NMesh * nmesh)
/* Now we have the total count of valid edges */
mesh->totedge=tot_valid_nmedges+tot_valid_faces_edges;
- mesh->medge=MEM_callocN(mesh->totedge*sizeof(MEdge), "make mesh edges");
+ mesh->medge= CustomData_add_layer(&mesh->edata, CD_MEDGE, 0, NULL, mesh->totedge);
for ( i = 0; i < tot_valid_nmedges; ++i )
{
BPy_NMEdge *edge=valid_nmedges[i];
@@ -3030,21 +2991,11 @@ static void check_dverts(Mesh *me, int old_totvert)
static int convert_NMeshToMesh( Mesh * mesh, BPy_NMesh * nmesh)
{
MFace *newmf;
- TFace *newtf;
MVert *newmv;
MSticky *newst;
- MCol *newmc;
int nmeshtotedges;
int i, j, ok;
- mesh->mvert = NULL;
- mesh->medge = NULL;
- mesh->mface = NULL;
- mesh->mcol = NULL;
- mesh->msticky = NULL;
- mesh->tface = NULL;
- mesh->mat = NULL;
-
/* Minor note: we used 'mode' because 'flag' was already used internally
* by nmesh */
mesh->flag = nmesh->mode;
@@ -3052,21 +3003,15 @@ static int convert_NMeshToMesh( Mesh * mesh, BPy_NMesh * nmesh)
mesh->subdiv = nmesh->subdiv[0];
mesh->subdivr = nmesh->subdiv[1];
-
-
-
-
/*@ material assignment moved to PutRaw */
mesh->totvert = PySequence_Length( nmesh->verts );
if( mesh->totvert ) {
if( nmesh->flags & NMESH_HASVERTUV )
- mesh->msticky =
- MEM_callocN( sizeof( MSticky ) * mesh->totvert,
- "msticky" );
+ mesh->msticky = CustomData_add_layer( &mesh->vdata, CD_MSTICKY, 0,
+ NULL, mesh->totvert );
- mesh->mvert =
- MEM_callocN( sizeof( MVert ) * mesh->totvert,
- "mverts" );
+ mesh->mvert = CustomData_add_layer( &mesh->vdata, CD_MVERT, 0, NULL,
+ mesh->totvert );
}
if( mesh->totvert )
@@ -3075,24 +3020,12 @@ static int convert_NMeshToMesh( Mesh * mesh, BPy_NMesh * nmesh)
mesh->totface = 0;
if( mesh->totface ) {
-/*@ only create vertcol array if mesh has no texture faces */
-
-/*@ TODO: get rid of double storage of vertex colours. In a mesh,
- * vertex colors can be stored the following ways:
- * - per (TFace*)->col
- * - per (Mesh*)->mcol
- * This is stupid, but will reside for the time being -- at least until
- * a redesign of the internal Mesh structure */
-
- if( !( nmesh->flags & NMESH_HASFACEUV )
- && ( nmesh->flags & NMESH_HASMCOL ) )
- mesh->mcol =
- MEM_callocN( 4 * sizeof( MCol ) *
- mesh->totface, "mcol" );
-
- mesh->mface =
- MEM_callocN( sizeof( MFace ) * mesh->totface,
- "mfaces" );
+ if( nmesh->flags & NMESH_HASMCOL )
+ mesh->mcol = CustomData_add_layer( &mesh->fdata, CD_MCOL, 0, NULL,
+ mesh->totface );
+
+ mesh->mface = CustomData_add_layer( &mesh->fdata, CD_MFACE, 0, NULL,
+ mesh->totface );
}
/*@ This stuff here is to tag all the vertices referenced
@@ -3154,41 +3087,18 @@ static int convert_NMeshToMesh( Mesh * mesh, BPy_NMesh * nmesh)
* UV coordinate assigned, if yes, make tfaces */
if( ( nmesh->flags & NMESH_HASFACEUV )
|| ( check_validFaceUV( nmesh ) ) ) {
- make_tfaces( mesh ); /* initialize TFaces */
-
- newmc = mesh->mcol;
- newmf = mesh->mface;
- newtf = mesh->tface;
- for( i = 0; i < mesh->totface; i++ ) {
- PyObject *mf = PySequence_GetItem( nmesh->faces, i );
- ok = mface_from_data( newmf, newtf, newmc,
- ( BPy_NMFace * ) mf );
- Py_DECREF( mf );
- if( !ok )
- return 0;
-
- newtf++;
- newmf++;
- if( newmc )
- newmc += 4;
- }
-
+ make_tfaces( mesh ); /* initialize MTFaces */
nmesh->flags |= NMESH_HASFACEUV;
- } else {
- newmc = mesh->mcol;
- newmf = mesh->mface;
-
- for( i = 0; i < mesh->totface; i++ ) {
- PyObject *mf = PySequence_GetItem( nmesh->faces, i );
- ok = mface_from_data( newmf, 0, newmc,
- ( BPy_NMFace * ) mf );
- Py_DECREF( mf );
- if( !ok )
- return 0;
- newmf++;
- if( newmc )
- newmc += 4; /* there are 4 MCol's per face */
- }
+ }
+
+ newmf = mesh->mface;
+ for( i = 0; i < mesh->totface; i++ ) {
+ PyObject *mf = PySequence_GetItem( nmesh->faces, i );
+ ok = mface_from_data( newmf, &mesh->fdata, i, ( BPy_NMFace * ) mf );
+ Py_DECREF( mf );
+ if( !ok )
+ return 0;
+ newmf++;
}
/* Always do this to ensure no loose edges in faces */
diff --git a/source/blender/radiosity/extern/include/radio_types.h b/source/blender/radiosity/extern/include/radio_types.h
index 23ce17d9611..c9a0726e0d8 100644
--- a/source/blender/radiosity/extern/include/radio_types.h
+++ b/source/blender/radiosity/extern/include/radio_types.h
@@ -42,7 +42,7 @@
#include "DNA_material_types.h"
struct Render;
-struct TFace;
+struct CustomData;
#define DTWIRE 0
#define DTGOUR 2
@@ -88,14 +88,14 @@ typedef struct RNode { /* length: 104 */
float totrad[3], area;
unsigned int col;
- unsigned int orig; /* index in face elem data */
+ int orig; /* index in custom face data */
} RNode;
typedef struct Face { /* length: 52 */
float *v1, *v2, *v3, *v4;
unsigned int col, matindex;
- unsigned int orig; /* index in face elem data */
+ int orig; /* index in custom face data */
} Face;
/* rp->f1 */
@@ -156,8 +156,10 @@ typedef struct {
Material *matar[MAXMAT];
int totmat;
- struct RNode **mfdatanodes; /* nodes associated with the mfdata */
- struct TFace *tface;
+ /* for preserving face data */
+ int mfdatatot;
+ struct CustomData *mfdata;
+ struct RNode **mfdatanodes;
/* this part is a copy of struct Radio */
short hemires, maxiter;
diff --git a/source/blender/radiosity/intern/source/radio.c b/source/blender/radiosity/intern/source/radio.c
index 6426592244a..8d08632aedb 100644
--- a/source/blender/radiosity/intern/source/radio.c
+++ b/source/blender/radiosity/intern/source/radio.c
@@ -87,6 +87,7 @@
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
+#include "BKE_customdata.h"
#include "BKE_global.h"
#include "BKE_main.h"
@@ -144,13 +145,13 @@ void freeAllRad()
RG.facebase= 0;
}
- if(RG.mfdatanodes) {
+ if(RG.mfdata) {
+ CustomData_free(RG.mfdata, RG.mfdatatot);
+ MEM_freeN(RG.mfdata);
MEM_freeN(RG.mfdatanodes);
RG.mfdatanodes= NULL;
- if(RG.tface) {
- MEM_freeN(RG.tface);
- RG.tface= NULL;
- }
+ RG.mfdata= NULL;
+ RG.mfdatatot= 0;
}
RG.totelem= RG.totpatch= RG.totvert= RG.totface= RG.totlamp= RG.totmat= 0;
}
diff --git a/source/blender/radiosity/intern/source/radpostprocess.c b/source/blender/radiosity/intern/source/radpostprocess.c
index 16de4918742..36ac0445933 100644
--- a/source/blender/radiosity/intern/source/radpostprocess.c
+++ b/source/blender/radiosity/intern/source/radpostprocess.c
@@ -60,6 +60,7 @@
#include "DNA_object_types.h"
#include "DNA_radio_types.h"
+#include "BKE_customdata.h"
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_material.h"
@@ -71,7 +72,6 @@
#include "BIF_editview.h" /* deselectall */
#include "BDR_editobject.h" /* delete_obj */
-#include "BDR_editface.h" /* default_tface */
#include "radio.h"
@@ -684,23 +684,6 @@ void removeEqualNodes(short limit)
waitcursor(0);
}
-static void rad_interp_uv(float *v1, float *v2, float *v3, float *v4, float *co, TFace *tf, TFace *outtf, int j)
-{
- float *uv, w[4];
-
- uv = (float*)outtf->uv[j];
-
- InterpWeightsQ3Dfl(v1, v2, v3, v4, co, w);
-
- uv[0]= w[0]*tf->uv[0][0] + w[1]*tf->uv[1][0] + w[2]*tf->uv[2][0];
- uv[1]= w[0]*tf->uv[0][1] + w[1]*tf->uv[1][1] + w[2]*tf->uv[2][1];
-
- if (v4) {
- uv[0] += w[3]*tf->uv[3][0];
- uv[1] += w[3]*tf->uv[3][1];
- }
-}
-
void rad_addmesh(void)
{
Face *face = NULL;
@@ -708,11 +691,11 @@ void rad_addmesh(void)
Mesh *me;
MVert *mvert;
MFace *mf;
- TFace *tf;
Material *ma=0;
float **vco, **vertexco;
float cent[3], min[3], max[3];
int a, nvert, i;
+ unsigned int *mcol;
if(RG.totface==0)
return;
@@ -727,8 +710,11 @@ void rad_addmesh(void)
me->totvert= 0;
me->totface= RG.totface;
me->flag= 0;
- me->mface= MEM_callocN(me->totface*sizeof(MFace), "mface");
- me->tface= MEM_callocN(me->totface*sizeof(TFace), "tface");
+ me->mface= CustomData_add_layer(&me->fdata, CD_MFACE, 0, NULL, me->totface);
+ me->mcol= CustomData_add_layer(&me->fdata, CD_MCOL, 0, NULL, me->totface);
+
+ CustomData_merge(RG.mfdata, &me->fdata, CD_MASK_MESH, CD_CALLOC, me->totface);
+ mesh_update_customdata_pointers(me);
/* create materials and set vertex color flag */
for(a=0; a<RG.totmat; a++) {
@@ -737,21 +723,18 @@ void rad_addmesh(void)
if(ma) ma->mode |= MA_VERTEXCOL;
}
- /* load Face vertex colors into TFace, with alpha added */
- tf= me->tface;
- for(a=0; a<me->totface; a++, tf++) {
+ /* copy face data, load Face vertex colors into mcol, with alpha added */
+ mcol= (unsigned int*)me->mcol;
+ for(a=0; a<me->totface; a++, mcol+=4) {
RAD_NEXTFACE(a);
- if (RG.tface)
- *tf= RG.tface[face->orig];
- else
- default_tface(tf);
+ CustomData_copy_data(RG.mfdata, &me->fdata, face->orig, a, 1);
- tf->col[0]= *((unsigned int*)face->v1+3) | 0x1000000;
- tf->col[1]= *((unsigned int*)face->v2+3) | 0x1000000;
- tf->col[2]= *((unsigned int*)face->v3+3) | 0x1000000;
+ mcol[0]= *((unsigned int*)face->v1+3) | 0x1000000;
+ mcol[1]= *((unsigned int*)face->v2+3) | 0x1000000;
+ mcol[2]= *((unsigned int*)face->v3+3) | 0x1000000;
if(face->v4)
- tf->col[3]= *((unsigned int*)face->v4+3) | 0x1000000;
+ mcol[3]= *((unsigned int*)face->v4+3) | 0x1000000;
}
/* clear Face vertex color memory for vertex index assignment */
@@ -789,7 +772,8 @@ void rad_addmesh(void)
}
/* create vertices */
- mvert= me->mvert= MEM_callocN(me->totvert*sizeof(MVert), "mverts");
+ me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, 0, NULL, me->totvert);
+ mvert= me->mvert;
for(vco=vertexco, a=0; a<me->totvert; a++, mvert++, vco++) {
VECCOPY(mvert->co, *vco);
}
@@ -798,11 +782,10 @@ void rad_addmesh(void)
/* assign face data */
mf= me->mface;
- tf= me->tface;
- for(a=0; a<me->totface; a++, mf++, tf++) {
- TFace *origtf;
+ for(a=0; a<me->totface; a++, mf++ ) {
RNode *orignode;
+ float w[4][4];
float *subco;
RAD_NEXTFACE(a);
@@ -811,34 +794,31 @@ void rad_addmesh(void)
/* copy */
mf->mat_nr= face->matindex;
- /* UV interpolation */
- if (RG.tface) {
- origtf= &RG.tface[face->orig];
-
- orignode= RG.mfdatanodes[face->orig];
+ orignode= RG.mfdatanodes[face->orig];
- for(i=0; i<nvert; i++) {
- subco= (me->mvert + ((unsigned int*)&mf->v1)[i])->co;
+ for(i=0; i<nvert; i++) {
+ subco= (me->mvert + ((unsigned int*)&mf->v1)[i])->co;
- rad_interp_uv(orignode->v1, orignode->v2, orignode->v3,
- orignode->v4, subco, origtf, tf, i);
- }
+ InterpWeightsQ3Dfl(orignode->v1, orignode->v2, orignode->v3,
+ orignode->v4, subco, w[i]);
}
+
+ CustomData_interp(RG.mfdata, &me->fdata, &face->orig, NULL, (float*)w, 1, a);
}
/* restore vertex colors, and test_index */
mf= me->mface;
- tf= me->tface;
- for(a=0; a<me->totface; a++, mf++, tf++) {
+ mcol= (unsigned int*)me->mcol;
+ for(a=0; a<me->totface; a++, mf++, mcol+=4) {
RAD_NEXTFACE(a);
- *((unsigned int*)face->v1+3)= tf->col[0];
- *((unsigned int*)face->v2+3)= tf->col[1];
- *((unsigned int*)face->v3+3)= tf->col[2];
+ *((unsigned int*)face->v1+3)= mcol[0];
+ *((unsigned int*)face->v2+3)= mcol[1];
+ *((unsigned int*)face->v3+3)= mcol[2];
if(face->v4)
- *((unsigned int*)face->v4+3)= tf->col[3];
+ *((unsigned int*)face->v4+3)= mcol[3];
- test_index_face(mf, NULL, tf, face->v4? 4: 3);
+ test_index_face(mf, &me->fdata, a, face->v4? 4: 3);
}
/* boundbox and centre new */
diff --git a/source/blender/radiosity/intern/source/radpreprocess.c b/source/blender/radiosity/intern/source/radpreprocess.c
index 1a1cc6e76b3..6fe0e2bfdac 100644
--- a/source/blender/radiosity/intern/source/radpreprocess.c
+++ b/source/blender/radiosity/intern/source/radpreprocess.c
@@ -57,6 +57,7 @@
#include "DNA_scene_types.h"
#include "DNA_view3d_types.h"
+#include "BKE_customdata.h"
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_material.h"
@@ -309,13 +310,13 @@ void rad_collect_meshes()
Mesh *me;
MVert *mvert;
MFace *mface;
- TFace *tf, *tface;
+ MTFace *tf, *tface;
Material *ma = NULL, *noma= NULL;
RPatch *rp;
RNode *rn;
VeNoCo *vnc, **nodevert;
float *vd, *v1, *v2, *v3, *v4 = NULL;
- int a, b, offs, index, mfdatatot, hastface = 0;
+ int a, b, offs, index, mfdatatot;
if (G.vd==NULL) {
printf("Error, trying to collect radiosity meshes with no 3d view\n");
@@ -402,8 +403,6 @@ void rad_collect_meshes()
}
mfdatatot += me->totface;
- if (me->tface)
- hastface= 1;
}
}
base= base->next;
@@ -417,9 +416,9 @@ void rad_collect_meshes()
RG.size[2]= (RG.max[2]- RG.min[2]);
RG.maxsize= MAX3(RG.size[0],RG.size[1],RG.size[2]);
+ RG.mfdata= MEM_callocN(sizeof(CustomData), "radiomfdata");
RG.mfdatanodes= MEM_mallocN(sizeof(RNode*)*mfdatatot, "radiomfdatanodes");
- if (hastface)
- RG.tface= MEM_mallocN(sizeof(TFace)*mfdatatot, "radiotface");
+ RG.mfdatatot= mfdatatot;
/* make patches */
@@ -435,10 +434,13 @@ void rad_collect_meshes()
ob= base->object;
me= ob->data;
mface= me->mface;
- tface= me->tface;
+ tface= me->mtface;
index= -1;
+ CustomData_merge(&me->fdata, RG.mfdata, CD_MASK_DERIVEDMESH,
+ CD_DEFAULT, mfdatatot);
+
for(a=0; a<me->totface; a++, mface++) {
tf= tface? tface+a: NULL;
@@ -523,13 +525,8 @@ void rad_collect_meshes()
rn->orig= RG.totelem;
RG.mfdatanodes[RG.totelem]= rn;
- if (RG.tface) {
- if (tf)
- RG.tface[RG.totelem]= *tf;
- else
- default_tface(&RG.tface[RG.totelem]);
- }
-
+ CustomData_copy_data(&me->fdata, RG.mfdata, a, RG.totelem, 1);
+
RG.totelem++;
RG.totpatch++;
}
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h
index 1563f6a768d..d5b57cfffdc 100644
--- a/source/blender/render/intern/include/render_types.h
+++ b/source/blender/render/intern/include/render_types.h
@@ -244,7 +244,7 @@ struct halosort {
/* ------------------------------------------------------------------------- */
struct Material;
-struct TFace;
+struct MTFace;
typedef struct RadFace {
float unshot[3], totrad[3];
@@ -258,7 +258,7 @@ typedef struct VlakRen
unsigned int lay;
float n[3];
struct Material *mat;
- struct TFace *tface;
+ struct MTFace *tface;
unsigned int *vcol;
char snproj, puno;
char flag, ec;
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index c30d515608a..542fdfdd96f 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -65,6 +65,7 @@
#include "BKE_armature.h"
#include "BKE_action.h"
#include "BKE_curve.h"
+#include "BKE_customdata.h"
#include "BKE_constraint.h"
#include "BKE_displist.h"
#include "BKE_deform.h"
@@ -431,7 +432,7 @@ static void calc_edge_stress(Render *re, Mesh *me, int startvert, int startvlak)
/* gets tangent from tface or orco */
static void calc_tangent_vector(Render *re, VlakRen *vlr)
{
- TFace *tface= vlr->tface;
+ MTFace *tface= vlr->tface;
VertRen *v1=vlr->v1, *v2=vlr->v2, *v3=vlr->v3, *v4=vlr->v4;
float tang[3], tangv[3], ct[3], e1[3], e2[3], *tav;
float *uv1, *uv2, *uv3, *uv4;
@@ -1627,13 +1628,13 @@ static void init_render_mball(Render *re, Object *ob)
struct edgesort {
int v1, v2;
int has_mcol;
- TFace *tface;
+ MTFace *tface;
float uv1[2], uv2[2];
unsigned int mcol1, mcol2;
};
/* edges have to be added with lowest index first for sorting */
-static void to_edgesort(struct edgesort *ed, int i1, int i2, int v1, int v2, unsigned int *mcol, TFace *tface)
+static void to_edgesort(struct edgesort *ed, int i1, int i2, int v1, int v2, unsigned int *mcol, MTFace *tface)
{
if(v1<v2) {
ed->v1= v1; ed->v2= v2;
@@ -1649,9 +1650,6 @@ static void to_edgesort(struct edgesort *ed, int i1, int i2, int v1, int v2, uns
ed->uv1[1]= tface->uv[i1][1];
ed->uv2[0]= tface->uv[i2][0];
ed->uv2[1]= tface->uv[i2][1];
-
- ed->mcol1= tface->col[i1];
- ed->mcol2= tface->col[i2];
}
ed->has_mcol= mcol!=NULL;
if(mcol) {
@@ -1672,29 +1670,18 @@ static int vergedgesort(const void *v1, const void *v2)
return 0;
}
-static struct edgesort *make_mesh_edge_lookup(Mesh *me, DispListMesh *dlm, int *totedgesort)
+static struct edgesort *make_mesh_edge_lookup(DerivedMesh *dm, int *totedgesort)
{
MFace *mf, *mface;
- TFace *tface=NULL;
+ MTFace *tface=NULL;
struct edgesort *edsort, *ed;
unsigned int *mcol=NULL;
int a, totedge=0, totface;
- if (dlm) {
- mface= dlm->mface;
- totface= dlm->totface;
- if (dlm->tface)
- tface= dlm->tface;
- else if (dlm->mcol)
- mcol= (unsigned int *)dlm->mcol;
- } else {
- mface= me->mface;
- totface= me->totface;
- if (me->tface)
- tface= me->tface;
- else if (me->mcol)
- mcol= (unsigned int *)me->mcol;
- }
+ mface= dm->getFaceArray(dm);
+ totface= dm->getNumFaces(dm);
+ tface= dm->getFaceDataArray(dm, CD_MTFACE);
+ mcol= dm->getFaceDataArray(dm, CD_MCOL);
if(mcol==NULL && tface==NULL) return NULL;
@@ -1707,7 +1694,7 @@ static struct edgesort *make_mesh_edge_lookup(Mesh *me, DispListMesh *dlm, int *
ed= edsort= MEM_callocN(totedge*sizeof(struct edgesort), "edgesort");
- for(a= me->totface, mf= mface; a>0; a--, mf++) {
+ for(a= totface, mf= mface; a>0; a--, mf++) {
if(mface->v4 || mface->v3) {
to_edgesort(ed++, 0, 1, mf->v1, mf->v2, mcol, tface);
to_edgesort(ed++, 1, 2, mf->v2, mf->v3, mcol, tface);
@@ -1729,7 +1716,7 @@ static struct edgesort *make_mesh_edge_lookup(Mesh *me, DispListMesh *dlm, int *
return edsort;
}
-static void use_mesh_edge_lookup(Render *re, Mesh *me, DispListMesh *dlm, MEdge *medge, VlakRen *vlr, struct edgesort *edgetable, int totedge)
+static void use_mesh_edge_lookup(Render *re, MEdge *medge, VlakRen *vlr, struct edgesort *edgetable, int totedge)
{
struct edgesort ed, *edp;
@@ -1744,20 +1731,8 @@ static void use_mesh_edge_lookup(Render *re, Mesh *me, DispListMesh *dlm, MEdge
if(edp) {
/* since edges have different index ordering, we have to duplicate mcol and tface */
if(edp->tface) {
- vlr->tface= BLI_memarena_alloc(re->memArena, sizeof(TFace));
- vlr->vcol= vlr->tface->col;
- memcpy(vlr->tface, edp->tface, sizeof(TFace));
-
- if(edp->v1==medge->v1) {
- vlr->vcol[0]= edp->mcol1;
- vlr->vcol[1]= edp->mcol2;
- }
- else {
- vlr->vcol[0]= edp->mcol2;
- vlr->vcol[1]= edp->mcol1;
- }
- vlr->vcol[2]= vlr->vcol[1];
- vlr->vcol[3]= vlr->vcol[1];
+ vlr->tface= BLI_memarena_alloc(re->memArena, sizeof(MTFace));
+ memcpy(vlr->tface, edp->tface, sizeof(MTFace));
if(edp->v1==medge->v1) {
memcpy(vlr->tface->uv[0], edp->uv1, 2*sizeof(float));
@@ -1770,7 +1745,7 @@ static void use_mesh_edge_lookup(Render *re, Mesh *me, DispListMesh *dlm, MEdge
memcpy(vlr->tface->uv[2], vlr->tface->uv[1], 2*sizeof(float));
memcpy(vlr->tface->uv[3], vlr->tface->uv[1], 2*sizeof(float));
}
- else if(edp->has_mcol) {
+ if(edp->has_mcol) {
vlr->vcol= BLI_memarena_alloc(re->memArena, sizeof(MCol)*4);
vlr->vcol[0]= edp->mcol1;
vlr->vcol[1]= edp->mcol2;
@@ -1790,13 +1765,12 @@ static void init_render_mesh(Render *re, Object *ob, Object *par, int only_verts
Material *ma;
MSticky *ms = NULL;
PartEff *paf;
- DispListMesh *dlm = NULL;
DerivedMesh *dm;
unsigned int *vertcol;
float xn, yn, zn, imat[3][3], mat[4][4]; //nor[3],
float *orco=0;
int a, a1, ok, need_orco=0, need_stress=0, need_tangent=0, totvlako, totverto, vertofs;
- int end, do_autosmooth=0, totvert = 0, dm_needsfree;
+ int end, do_autosmooth=0, totvert = 0;
int useFluidmeshNormals= 0; // NT fluidsim, use smoothed normals?
int use_original_normals= 0;
@@ -1832,7 +1806,7 @@ static void init_render_mesh(Render *re, Object *ob, Object *par, int only_verts
/* qdn: normalmaps, test if tangents needed, separated from shading */
if ((ma->mode & MA_TANGENT_V) || (ma->mode & MA_NORMAP_TANG)) {
need_tangent= 1;
- if(me->tface==NULL)
+ if(me->mtface==NULL)
need_orco= 1;
}
/* radio faces need autosmooth, to separate shared vertices in corners */
@@ -1886,7 +1860,6 @@ static void init_render_mesh(Render *re, Object *ob, Object *par, int only_verts
}
dm = mesh_create_derived_render(ob);
- dm_needsfree= 1;
/* (Multires) Now switch the meshes back around */
if(me->mr) {
@@ -1903,13 +1876,11 @@ static void init_render_mesh(Render *re, Object *ob, Object *par, int only_verts
useFluidmeshNormals = 1;
}
- dlm = dm->convertToDispListMesh(dm, 1);
-
- mvert= dlm->mvert;
- totvert= dlm->totvert;
+ mvert= dm->getVertArray(dm);
+ totvert= dm->getNumVerts(dm);
/* attempt to autsmooth on original mesh, only without subsurf */
- if(do_autosmooth && me->totvert==totvert && me->totface==dlm->totface)
+ if(do_autosmooth && me->totvert==totvert && me->totface==dm->getNumFaces(dm))
use_original_normals= 1;
ms = (totvert==me->totvert)?me->msticky:NULL;
@@ -1973,35 +1944,17 @@ static void init_render_mesh(Render *re, Object *ob, Object *par, int only_verts
/* if wire material, and we got edges, don't do the faces */
if(ma->mode & MA_WIRE) {
- end= dlm?dlm->totedge:me->totedge;
+ end= dm->getNumEdges(dm);
if(end) ok= 0;
}
if(ok) {
- TFace *tface= NULL;
-
- end= dlm?dlm->totface:me->totface;
- if (dlm) {
- mface= dlm->mface;
- if (dlm->tface) {
- tface= dlm->tface;
- vertcol= NULL;
- } else if (dlm->mcol) {
- vertcol= (unsigned int *)dlm->mcol;
- } else {
- vertcol= NULL;
- }
- } else {
- mface= me->mface;
- if (me->tface) {
- tface= me->tface;
- vertcol= NULL;
- } else if (me->mcol) {
- vertcol= (unsigned int *)me->mcol;
- } else {
- vertcol= NULL;
- }
- }
+ MTFace *tface= NULL;
+
+ end= dm->getNumFaces(dm);
+ mface= dm->getFaceArray(dm);
+ tface= dm->getFaceDataArray(dm, CD_MTFACE);
+ vertcol= dm->getFaceDataArray(dm, CD_MCOL);
for(a=0; a<end; a++) {
int v1, v2, v3, v4, flag;
@@ -2050,24 +2003,13 @@ static void init_render_mesh(Render *re, Object *ob, Object *par, int only_verts
if(len==0) re->totvlak--;
else {
- if(dlm) {
- if(tface) {
- vlr->tface= BLI_memarena_alloc(re->memArena, sizeof(TFace));
- vlr->vcol= vlr->tface->col;
- memcpy(vlr->tface, tface, sizeof(TFace));
- }
- else if (vertcol) {
- vlr->vcol= BLI_memarena_alloc(re->memArena, sizeof(int)*4);
- memcpy(vlr->vcol, vertcol+4*a, sizeof(int)*4);
- }
- } else {
- if(tface) {
- vlr->vcol= tface->col;
- vlr->tface= tface;
- }
- else if (vertcol) {
- vlr->vcol= vertcol+4*a;
- }
+ if(tface) {
+ vlr->tface= BLI_memarena_alloc(re->memArena, sizeof(MTFace));
+ memcpy(vlr->tface, tface, sizeof(MTFace));
+ }
+ if (vertcol) {
+ vlr->vcol= BLI_memarena_alloc(re->memArena, sizeof(int)*4);
+ memcpy(vlr->vcol, vertcol+4*a, sizeof(int)*4);
}
}
}
@@ -2079,18 +2021,18 @@ static void init_render_mesh(Render *re, Object *ob, Object *par, int only_verts
}
/* exception... we do edges for wire mode. potential conflict when faces exist... */
- end= dlm?dlm->totedge:me->totedge;
- mvert= dlm?dlm->mvert:me->mvert;
+ end= dm->getNumEdges(dm);
+ mvert= dm->getVertArray(dm);
ma= give_render_material(re, ob, 1);
if(end && (ma->mode & MA_WIRE)) {
MEdge *medge;
struct edgesort *edgetable;
int totedge;
- medge= dlm?dlm->medge:me->medge;
+ medge= dm->getEdgeArray(dm);
/* we want edges to have UV and vcol too... */
- edgetable= make_mesh_edge_lookup(me, dlm, &totedge);
+ edgetable= make_mesh_edge_lookup(dm, &totedge);
for(a1=0; a1<end; a1++, medge++) {
if (medge->flag&ME_EDGERENDER) {
@@ -2105,7 +2047,7 @@ static void init_render_mesh(Render *re, Object *ob, Object *par, int only_verts
vlr->v4= NULL;
if(edgetable) {
- use_mesh_edge_lookup(re, me, dlm, medge, vlr, edgetable, totedge);
+ use_mesh_edge_lookup(re, medge, vlr, edgetable, totedge);
}
xn= -(v0->no[0]+v1->no[0]);
@@ -2150,8 +2092,7 @@ static void init_render_mesh(Render *re, Object *ob, Object *par, int only_verts
calc_edge_stress(re, me, totverto, totvlako);
}
- if(dlm) displistmesh_free(dlm);
- if(dm_needsfree) dm->release(dm);
+ dm->release(dm);
if(me_store) {
free_mesh(me_store);
MEM_freeN(me_store);
@@ -4073,8 +4014,9 @@ void RE_make_sticky(void)
me= ob->data;
mvert= me->mvert;
- if(me->msticky) MEM_freeN(me->msticky);
- me->msticky= MEM_mallocN(me->totvert*sizeof(MSticky), "sticky");
+ if(me->msticky)
+ CustomData_free_layer(&me->vdata, CD_MSTICKY, me->totvert);
+ me->msticky= CustomData_add_layer(&me->vdata, CD_MSTICKY, 0, NULL, me->totvert);
where_is_object(ob);
Mat4MulMat4(mat, ob->obmat, re->viewmat);
diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c
index 76accda4d09..e9103ed738c 100644
--- a/source/blender/render/intern/source/rendercore.c
+++ b/source/blender/render/intern/source/rendercore.c
@@ -3767,7 +3767,7 @@ static void do_bake_shade(void *handle, int x, int y, float u, float v)
/* already have tested for tface and ima */
static void shade_tface(BakeShade *bs, VlakRen *vlr)
{
- TFace *tface= vlr->tface;
+ MTFace *tface= vlr->tface;
Image *ima= tface->tpage;
ZSpan *zspan= (ZSpan *)ima->id.newid;
float vec[4][2];
diff --git a/source/blender/src/booleanops.c b/source/blender/src/booleanops.c
index 11a3577ec0d..2b412eedb77 100644
--- a/source/blender/src/booleanops.c
+++ b/source/blender/src/booleanops.c
@@ -35,6 +35,8 @@
#include "MEM_guardedalloc.h"
+#include "BLI_arithb.h"
+#include "BLI_blenlib.h"
#include "BLI_ghash.h"
#include "DNA_material_types.h"
@@ -47,6 +49,7 @@
#include "BKE_booleanops.h"
#include "BKE_cdderivedmesh.h"
+#include "BKE_customdata.h"
#include "BKE_depsgraph.h"
#include "BKE_DerivedMesh.h"
#include "BKE_global.h"
@@ -62,13 +65,6 @@
#include <math.h>
-// TODO check to see how many of these includes are necessary
-
-#include "BLI_blenlib.h"
-#include "BLI_arithb.h"
-#include "BLI_linklist.h"
-#include "BLI_memarena.h"
-
/**
* Here's the vertex iterator structure used to walk through
* the blender vertex structure.
@@ -286,23 +282,17 @@ static Object *AddNewBlenderMesh(Base *base)
return ob_new;
}
-/* editmode function, will be replaced soon once custom face data arrives */
-void interp_uv_vcol(float *v1, float *v2, float *v3, float *v4, float *co,
- TFace *tf, TFace *outtf, int j);
-
-static void ConvertCSGTFace(
+static void InterpCSGFace(
DerivedMesh *dm, Mesh *orig_me, int index, int orig_index, int nr,
- TFace *tface, TFace *orig_tface, float mapmat[][4])
+ float mapmat[][4])
{
- float obco[3], *co[4], *orig_co[4];
+ float obco[3], *co[4], *orig_co[4], w[4][4];
MFace *mface, *orig_mface;
int j;
mface = CDDM_get_face(dm, index);
orig_mface = orig_me->mface + orig_index;
- *tface = *orig_tface;
-
// get the vertex coordinates from the original mesh
orig_co[0] = (orig_me->mvert + orig_mface->v1)->co;
orig_co[1] = (orig_me->mvert + orig_mface->v2)->co;
@@ -322,9 +312,10 @@ static void ConvertCSGTFace(
else
VecCopyf(obco, co[j]);
- interp_uv_vcol(orig_co[0], orig_co[1], orig_co[2], orig_co[3], obco,
- orig_tface, tface, j);
+ InterpWeightsQ3Dfl(orig_co[0], orig_co[1], orig_co[2], orig_co[3], obco, w[j]);
}
+
+ CustomData_interp(&orig_me->fdata, &dm->faceData, &orig_index, NULL, (float*)w, 1, index);
}
/* Iterate over the CSG Output Descriptors and create a new DerivedMesh
@@ -348,14 +339,10 @@ static DerivedMesh *ConvertCSGDescriptorsToDerivedMesh(
// create a new DerivedMesh
dm = CDDM_new(vertex_it->num_elements, 0, face_it->num_elements);
- // add tface layers
- if (me1->mcol)
- mcol_to_tface(me1, 1);
- if (me2->mcol)
- mcol_to_tface(me2, 1);
-
- if (me1->tface || me2->tface)
- DM_add_face_layer(dm, LAYERTYPE_TFACE, 0, NULL);
+ CustomData_merge(&me1->fdata, &dm->faceData, CD_MASK_DERIVEDMESH, CD_DEFAULT,
+ face_it->num_elements);
+ CustomData_merge(&me2->fdata, &dm->faceData, CD_MASK_DERIVEDMESH, CD_DEFAULT,
+ face_it->num_elements);
// step through the vertex iterators:
for (i = 0; !vertex_it->Done(vertex_it->it); i++) {
@@ -383,8 +370,7 @@ static DerivedMesh *ConvertCSGDescriptorsToDerivedMesh(
Object *orig_ob;
Material *orig_mat;
CSG_IFace csgface;
- MFace *mface, *orig_mface;
- TFace *tface, *orig_tface;
+ MFace *mface;
int orig_index, mat_nr;
// retrieve a csg face from the boolean module
@@ -395,8 +381,9 @@ static DerivedMesh *ConvertCSGDescriptorsToDerivedMesh(
orig_me = (csgface.orig_face < me1->totface)? me1: me2;
orig_ob = (orig_me == me1)? ob1: ob2;
orig_index = (orig_me == me1)? csgface.orig_face: csgface.orig_face - me1->totface;
- orig_mface = orig_me->mface + orig_index;
- orig_mat= give_current_material(orig_ob, orig_mface->mat_nr+1);
+
+ // copy all face layers, including mface
+ CustomData_copy_data(&orig_me->fdata, &dm->faceData, orig_index, i, 1);
// set mface
mface = CDDM_get_face(dm, i);
@@ -404,9 +391,10 @@ static DerivedMesh *ConvertCSGDescriptorsToDerivedMesh(
mface->v2 = csgface.vertex_index[1];
mface->v3 = csgface.vertex_index[2];
mface->v4 = (csgface.vertex_number == 4)? csgface.vertex_index[3]: 0;
- mface->flag = orig_mface->flag;
// set material, based on lookup in hash table
+ orig_mat= give_current_material(orig_ob, mface->mat_nr+1);
+
if (mat && orig_mat) {
if (!BLI_ghash_haskey(material_hash, orig_mat)) {
mat[*totmat] = orig_mat;
@@ -419,24 +407,10 @@ static DerivedMesh *ConvertCSGDescriptorsToDerivedMesh(
else
mface->mat_nr = 0;
- // set tface
- if (me1->tface || me2->tface) {
- tface = DM_get_face_data(dm, i, LAYERTYPE_TFACE);;
-
- if (orig_me->tface) {
- orig_tface = orig_me->tface + orig_index;
-
- ConvertCSGTFace(dm, orig_me, i, orig_index,
- csgface.vertex_number, tface, orig_tface,
- (orig_me == me2)? mapmat: NULL);
- }
- else
- default_tface(tface);
- }
- else
- tface = NULL;
+ InterpCSGFace(dm, orig_me, i, orig_index, csgface.vertex_number,
+ (orig_me == me2)? mapmat: NULL);
- test_index_face(mface, NULL, tface, csgface.vertex_number);
+ test_index_face(mface, &dm->faceData, i, csgface.vertex_number);
}
if (material_hash)
diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c
index 7441fccd5bf..4a319791773 100644
--- a/source/blender/src/buttons_editing.c
+++ b/source/blender/src/buttons_editing.c
@@ -78,6 +78,7 @@
#include "BKE_blender.h"
#include "BKE_brush.h"
#include "BKE_curve.h"
+#include "BKE_customdata.h"
#include "BKE_colortools.h"
#include "BKE_depsgraph.h"
#include "BKE_global.h"
@@ -705,9 +706,9 @@ static void editing_panel_mesh_type(Object *ob, Mesh *me)
}
else uiDefBut(block, BUT, B_DELVERTCOL, "Delete", 80,50,84,19, 0, 0, 0, 0, 0, "Deletes vertex colors on active Mesh");
- if(me->tface) val= 1.0; else val= 0.0;
+ if(me->mtface) val= 1.0; else val= 0.0;
uiDefBut(block, LABEL, 0, "TexFace", 10,30,70,20, 0, val, 0, 0, 0, "");
- if(me->tface==NULL) {
+ if(me->mtface==NULL) {
uiDefBut(block, BUT, B_MAKE_TFACES, "Make", 80,30,84,19, 0, 0, 0, 0, 0, "Enables the active Mesh's faces for UV coordinate mapping");
}
else uiDefBut(block, BUT, B_DEL_TFACES, "Delete", 80,30,84,19, 0, 0, 0, 0, 0, "Deletes UV coordinates for active Mesh's faces");
@@ -3547,9 +3548,10 @@ void do_meshbuts(unsigned short event)
switch(event) {
case B_DELSTICKY:
-
- if(me->msticky) MEM_freeN(me->msticky);
- me->msticky= NULL;
+ if(me->msticky) {
+ CustomData_free_layer(&me->vdata, CD_MSTICKY, me->totvert);
+ me->msticky= NULL;
+ }
allqueue(REDRAWBUTSEDIT, 0);
break;
case B_MAKESTICKY:
@@ -3559,35 +3561,44 @@ void do_meshbuts(unsigned short event)
case B_MAKEVERTCOL:
if(G.obedit)
- EM_add_data_layer(&G.editMesh->fdata, LAYERTYPE_MCOL);
+ EM_add_data_layer(&G.editMesh->fdata, CD_MCOL);
else
- make_vertexcol();
+ make_vertexcol(1);
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
break;
case B_DELVERTCOL:
- if(G.obedit)
- EM_free_data_layer(&G.editMesh->fdata, LAYERTYPE_MCOL);
- if(me->mcol) MEM_freeN(me->mcol);
- me->mcol= NULL;
+ if(G.obedit) {
+ EM_free_data_layer(&G.editMesh->fdata, CD_MCOL);
+ }
+ else {
+ CustomData_free_layer(&me->fdata, CD_MCOL, me->totface);
+ me->mcol= NULL;
+ }
G.f &= ~G_VERTEXPAINT;
- freedisplist(&(ob->disp));
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
allqueue(REDRAWBUTSEDIT, 0);
allqueue(REDRAWVIEW3D, 0);
break;
case B_MAKE_TFACES:
if(G.obedit)
- EM_add_data_layer(&G.editMesh->fdata, LAYERTYPE_TFACE);
+ EM_add_data_layer(&G.editMesh->fdata, CD_MTFACE);
else
make_tfaces(me);
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
allqueue(REDRAWBUTSEDIT, 0);
break;
case B_DEL_TFACES:
- if(G.obedit)
- EM_free_data_layer(&G.editMesh->fdata, LAYERTYPE_TFACE);
- if(me->tface) MEM_freeN(me->tface);
- me->tface= 0;
+ if(G.obedit) {
+ EM_free_data_layer(&G.editMesh->fdata, CD_MTFACE);
+ }
+ else {
+ CustomData_free_layer(&me->fdata, CD_MTFACE, me->totface);
+ me->mtface= NULL;
+ }
G.f &= ~G_FACESELECT;
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
allqueue(REDRAWBUTSEDIT, 0);
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWIMAGE, 0);
@@ -4170,7 +4181,8 @@ void do_fpaintbuts(unsigned short event)
Mesh *me;
Object *ob;
bDeformGroup *defGroup;
- TFace *activetf, *tf;
+ MTFace *activetf, *tf;
+ MCol *activemcol;
int a;
SculptData *sd= &G.scene->sculptdata;
ID *id, *idtest;
@@ -4191,11 +4203,11 @@ void do_fpaintbuts(unsigned short event)
case B_COPY_TF_UV:
case B_COPY_TF_COL:
case B_COPY_TF_TEX:
- me = get_mesh(OBACT);
- activetf = get_active_tface();
+ me= get_mesh(OBACT);
+ activetf= get_active_tface(&activemcol);
if(me && activetf) {
- for (a=0, tf=me->tface; a < me->totface; a++, tf++) {
+ for (a=0, tf=me->mtface; a < me->totface; a++, tf++) {
if(tf!=activetf && (tf->flag & TF_SELECT)) {
if(event==B_COPY_TF_MODE) {
tf->mode= activetf->mode;
@@ -4217,8 +4229,8 @@ void do_fpaintbuts(unsigned short event)
if(activetf->mode & TF_TILES) tf->mode |= TF_TILES;
else tf->mode &= ~TF_TILES;
}
- else if(event==B_COPY_TF_COL)
- memcpy(tf->col, activetf->col, sizeof(tf->col));
+ else if(event==B_COPY_TF_COL && activemcol)
+ memcpy(&me->mcol[a], activemcol, sizeof(MCol)*4);
}
}
@@ -4246,7 +4258,7 @@ void do_fpaintbuts(unsigned short event)
break;
case B_TFACE_HALO:
- activetf = get_active_tface();
+ activetf = get_active_tface(NULL);
if(activetf) {
activetf->mode &= ~TF_BILLBOARD2;
allqueue(REDRAWBUTSEDIT, 0);
@@ -4254,7 +4266,7 @@ void do_fpaintbuts(unsigned short event)
break;
case B_TFACE_BILLB:
- activetf = get_active_tface();
+ activetf = get_active_tface(NULL);
if(activetf) {
activetf->mode &= ~TF_BILLBOARD;
allqueue(REDRAWBUTSEDIT, 0);
@@ -4614,12 +4626,12 @@ static void editing_panel_mesh_texface(void)
{
extern VPaint Gvp; /* from vpaint */
uiBlock *block;
- TFace *tf;
+ MTFace *tf;
block= uiNewBlock(&curarea->uiblocks, "editing_panel_mesh_texface", UI_EMBOSS, UI_HELV, curarea->win);
if(uiNewPanel(curarea, block, "Texture face", "Editing", 960, 0, 318, 204)==0) return;
- tf = get_active_tface();
+ tf = get_active_tface(NULL);
if(tf) {
uiBlockBeginAlign(block);
uiDefButBitS(block, TOG, TF_TEX, B_REDR_3D_IMA, "Tex", 600,160,60,19, &tf->mode, 0, 0, 0, 0, "Render face with texture");
diff --git a/source/blender/src/drawimage.c b/source/blender/src/drawimage.c
index 2a046a30be2..eef9bfbad08 100644
--- a/source/blender/src/drawimage.c
+++ b/source/blender/src/drawimage.c
@@ -241,7 +241,7 @@ void calc_image_view(SpaceImage *sima, char mode)
/* check for facelesect, and set active image */
void what_image(SpaceImage *sima)
{
- TFace *activetf;
+ MTFace *activetf;
Mesh *me;
if(sima->mode==SI_TEXTURE) {
@@ -268,9 +268,9 @@ void what_image(SpaceImage *sima)
sima->image= NULL;
me= get_mesh(OBACT);
- activetf = get_active_tface();
+ activetf = get_active_tface(NULL);
- if(me && me->tface && activetf && activetf->mode & TF_TEX) {
+ if(me && me->mtface && activetf && activetf->mode & TF_TEX) {
sima->image= activetf->tpage;
if(sima->flag & SI_EDITTILE);
@@ -290,7 +290,7 @@ void what_image(SpaceImage *sima)
/* called to assign images to UV faces */
void image_changed(SpaceImage *sima, int dotile)
{
- TFace *tface;
+ MTFace *tface;
Mesh *me;
int a;
@@ -310,9 +310,9 @@ void image_changed(SpaceImage *sima, int dotile)
}
me= get_mesh(OBACT);
- if(me && me->tface) {
+ if(me && me->mtface) {
- tface= me->tface;
+ tface= me->mtface;
a= me->totface;
while(a--) {
if(tface->flag & TF_SELECT) {
@@ -380,7 +380,7 @@ void uvco_to_areaco_noclip(float *vec, int *mval)
void draw_tfaces(void)
{
- TFace *tface,*activetface = NULL;
+ MTFace *tface,*activetface = NULL;
MFace *mface,*activemface = NULL;
Mesh *me;
int a;
@@ -390,7 +390,7 @@ void draw_tfaces(void)
if(G.f & G_FACESELECT) {
me= get_mesh(OBACT);
- if(me && me->tface) {
+ if(me && me->mtface) {
calc_image_view(G.sima, 'f'); /* float */
myortho2(G.v2d->cur.xmin, G.v2d->cur.xmax, G.v2d->cur.ymin, G.v2d->cur.ymax);
glLoadIdentity();
@@ -398,15 +398,14 @@ void draw_tfaces(void)
/* draw shadow mesh */
if ((G.sima->flag & SI_DRAWSHADOW) && !(G.obedit==OBACT)) {
DerivedMesh *dm;
- int dmNeedsFree;
/* draw final mesh with modifiers applied */
- dm = mesh_get_derived_final(OBACT, &dmNeedsFree);
+ dm = mesh_get_derived_final(OBACT);
glColor3ub(112, 112, 112);
if (dm->drawUVEdges) dm->drawUVEdges(dm);
- if (dmNeedsFree) dm->release(dm);
+ dm->release(dm);
}
else if((G.sima->flag & SI_DRAWTOOL) || (G.obedit==OBACT)) {
/* draw mesh without modifiers applied */
@@ -420,7 +419,7 @@ void draw_tfaces(void)
dm->release(dm);
}
else {
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
a= me->totface;
@@ -449,7 +448,7 @@ void draw_tfaces(void)
BIF_GetThemeColor4ubv(TH_FACE_SELECT, col2);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
a= me->totface;
while(a--) {
@@ -474,7 +473,7 @@ void draw_tfaces(void)
}
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
a= me->totface;
while(a--) {
@@ -561,7 +560,7 @@ void draw_tfaces(void)
glPointSize(pointsize);
bglBegin(GL_POINTS);
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
a= me->totface;
while(a--) {
@@ -585,7 +584,7 @@ void draw_tfaces(void)
cpack(0xFF);
bglBegin(GL_POINTS);
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
a= me->totface;
while(a--) {
@@ -608,7 +607,7 @@ void draw_tfaces(void)
glPointSize(pointsize);
bglBegin(GL_POINTS);
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
a= me->totface;
while(a--) {
@@ -762,7 +761,7 @@ static void image_editvertex_buts(uiBlock *block)
for (i=0; i<me->totface; i++) {
MFace *mf= &((MFace*) me->mface)[i];
- TFace *tf= &((TFace*) me->tface)[i];
+ MTFace *tf= &((MTFace*) me->mtface)[i];
if (!(tf->flag & TF_SELECT))
continue;
@@ -834,7 +833,7 @@ static void image_editvertex_buts(uiBlock *block)
for (i=0; i<me->totface; i++) {
MFace *mf= &((MFace*) me->mface)[i];
- TFace *tf= &((TFace*) me->tface)[i];
+ MTFace *tf= &((MTFace*) me->mtface)[i];
if (!(tf->flag & TF_SELECT))
continue;
diff --git a/source/blender/src/drawmesh.c b/source/blender/src/drawmesh.c
index a6e91169af2..2eae7b2ea5e 100644
--- a/source/blender/src/drawmesh.c
+++ b/source/blender/src/drawmesh.c
@@ -179,10 +179,10 @@ void clear_realtime_image_cache()
}
/* REMEMBER! Changes here must go into my_set_tpage() as well */
-int set_tpage(TFace *tface)
+int set_tpage(MTFace *tface)
{
static int alphamode= -1;
- static TFace *lasttface= 0;
+ static MTFace *lasttface= 0;
Image *ima;
unsigned int *rect=NULL, *bind;
int tpx=0, tpy=0, tilemode, tileXRep,tileYRep;
@@ -557,7 +557,7 @@ EdgeHash *get_tface_mesh_marked_edge_info(Mesh *me)
for (i=0; i<me->totface; i++) {
MFace *mf = &me->mface[i];
- TFace *tf = &me->tface[i];
+ MTFace *tf = &me->mtface[i];
if (mf->v3) {
if (!(tf->flag&TF_HIDE)) {
@@ -657,8 +657,8 @@ static int draw_tfaces3D__drawFaceOpts(void *userData, int index)
{
Mesh *me = (Mesh*)userData;
- if (me->tface) {
- TFace *tface = &me->tface[index];
+ if (me->mtface) {
+ MTFace *tface = &me->mtface[index];
if (!(tface->flag&TF_HIDE) && (tface->flag&TF_SELECT))
return 2; /* Don't set color */
else
@@ -800,19 +800,19 @@ static Material *give_current_material_or_def(Object *ob, int matnr)
return ma?ma:&defmaterial;
}
-static int set_draw_settings_cached(int clearcache, int textured, TFace *texface, int lit, Object *litob, int litmatnr, int doublesided)
+static int set_draw_settings_cached(int clearcache, int textured, MTFace *texface, int lit, Object *litob, int litmatnr, int doublesided)
{
static int c_textured;
static int c_lit;
static int c_doublesided;
- static TFace *c_texface;
+ static MTFace *c_texface;
static Object *c_litob;
static int c_litmatnr;
static int c_badtex;
if (clearcache) {
c_textured= c_lit= c_doublesided= -1;
- c_texface= (TFace*) -1;
+ c_texface= (MTFace*) -1;
c_litob= (Object*) -1;
c_litmatnr= -1;
c_badtex= 0;
@@ -879,7 +879,7 @@ static int g_draw_tface_mesh_islight = 0;
static int g_draw_tface_mesh_istex = 0;
static unsigned char g_draw_tface_mesh_obcol[4];
-static int draw_tface__set_draw(TFace *tface, int matnr)
+static int draw_tface__set_draw(MTFace *tface, MCol *mcol, int matnr)
{
if (tface && ((tface->flag&TF_HIDE) || (tface->mode&TF_INVISIBLE))) return 0;
@@ -889,23 +889,24 @@ static int draw_tface__set_draw(TFace *tface, int matnr)
} else if (tface && tface->mode&TF_OBCOL) {
glColor3ubv(g_draw_tface_mesh_obcol);
return 2; /* Don't set color */
- } else if (!tface) {
+ } else if (!mcol) {
Material *ma= give_current_material(g_draw_tface_mesh_ob, matnr+1);
if(ma) glColor3f(ma->r, ma->g, ma->b);
- else glColor3f(0.5, 0.5, 0.5);
- return 1; /* Set color from mcol if available */
+ else glColor3f(1.0, 1.0, 1.0);
+ return 2; /* Don't set color */
} else {
- return 1; /* Set color from tface */
+ return 1; /* Set color from mcol */
}
}
static int draw_tface_mapped__set_draw(void *userData, int index)
{
Mesh *me = (Mesh*)userData;
- TFace *tface = (me->tface)? &me->tface[index]: NULL;
+ MTFace *tface = (me->mtface)? &me->mtface[index]: NULL;
+ MCol *mcol = (me->mcol)? &me->mcol[index]: NULL;
int matnr = me->mface[index].mat_nr;
- return draw_tface__set_draw(tface, matnr);
+ return draw_tface__set_draw(tface, mcol, matnr);
}
void draw_tface_mesh(Object *ob, Mesh *me, int dt)
@@ -915,11 +916,10 @@ void draw_tface_mesh(Object *ob, Mesh *me, int dt)
int a;
short istex, solidtex=0;
DerivedMesh *dm;
- int dmNeedsFree;
if(me==NULL) return;
- dm = mesh_get_derived_final(ob, &dmNeedsFree);
+ dm = mesh_get_derived_final(ob);
glShadeModel(GL_SMOOTH);
@@ -951,7 +951,8 @@ void draw_tface_mesh(Object *ob, Mesh *me, int dt)
set_draw_settings_cached(1, 0, 0, 0, 0, 0, 0);
if(dt > OB_SOLID || g_draw_tface_mesh_islight==-1) {
- TFace *tface= me->tface;
+ MTFace *tface= me->mtface;
+ MCol *mcol= me->mcol;
MFace *mface= me->mface;
bProperty *prop = get_property(ob, "Text");
int editing= (G.f & (G_VERTEXPAINT+G_FACESELECT+G_TEXTUREPAINT+G_WEIGHTPAINT)) && (ob==((G.scene->basact) ? (G.scene->basact->object) : 0));
@@ -962,9 +963,9 @@ void draw_tface_mesh(Object *ob, Mesh *me, int dt)
/* verse-blender doesn't support uv mapping of textures yet */
dm->drawFacesTex(dm, NULL);
}
- else if(ob==OBACT && (G.f & G_FACESELECT) && me && me->tface)
+ else if(ob==OBACT && (G.f & G_FACESELECT) && me && me->mtface)
#else
- if(ob==OBACT && (G.f & G_FACESELECT) && me && me->tface)
+ if(ob==OBACT && (G.f & G_FACESELECT) && me && me->mtface)
#endif
dm->drawMappedFacesTex(dm, draw_tface_mapped__set_draw, (void*)me);
else
@@ -974,11 +975,11 @@ void draw_tface_mesh(Object *ob, Mesh *me, int dt)
totface = me->totface;
if (!editing && prop && tface) {
- int dmNeedsFree;
- DerivedMesh *dm = mesh_get_derived_deform(ob, &dmNeedsFree);
+ DerivedMesh *ddm = mesh_get_derived_deform(ob);
tface+= start;
- for (a=start; a<totface; a++, tface++) {
+ mcol+= start*4;
+ for (a=start; a<totface; a++, tface++, mcol+=4) {
MFace *mf= &mface[a];
int mode= tface->mode;
int matnr= mf->mat_nr;
@@ -995,10 +996,10 @@ void draw_tface_mesh(Object *ob, Mesh *me, int dt)
if (badtex)
continue;
- dm->getVertCo(dm, mf->v1, v1);
- dm->getVertCo(dm, mf->v2, v2);
- dm->getVertCo(dm, mf->v3, v3);
- if (mf->v4) dm->getVertCo(dm, mf->v4, v4);
+ ddm->getVertCo(ddm, mf->v1, v1);
+ ddm->getVertCo(ddm, mf->v2, v2);
+ ddm->getVertCo(ddm, mf->v3, v3);
+ if (mf->v4) ddm->getVertCo(ddm, mf->v4, v4);
// The BM_FONT handling code is duplicated in the gameengine
// Search for 'Frank van Beek' ;-)
@@ -1035,7 +1036,8 @@ void draw_tface_mesh(Object *ob, Mesh *me, int dt)
movex+= curpos;
if (tface->mode & TF_OBCOL) glColor3ubv(obcol);
- else cp= (char *)&(tface->col[0]);
+ else if (mcol) cp= (char *)mcol;
+ else glColor3ub(255, 255, 255);
glTexCoord2f((tface->uv[0][0] - centerx) * sizex + transx, (tface->uv[0][1] - centery) * sizey + transy);
if (cp) glColor3ub(cp[3], cp[2], cp[1]);
@@ -1061,7 +1063,7 @@ void draw_tface_mesh(Object *ob, Mesh *me, int dt)
}
}
- if (dmNeedsFree) dm->release(dm);
+ ddm->release(ddm);
}
/* switch off textures */
@@ -1070,7 +1072,7 @@ void draw_tface_mesh(Object *ob, Mesh *me, int dt)
glShadeModel(GL_FLAT);
glDisable(GL_CULL_FACE);
- if(ob==OBACT && (G.f & G_FACESELECT) && me && me->tface) {
+ if(ob==OBACT && (G.f & G_FACESELECT) && me && me->mtface) {
draw_tfaces3D(ob, me, dm);
}
@@ -1090,7 +1092,7 @@ void draw_tface_mesh(Object *ob, Mesh *me, int dt)
glFrontFace(GL_CCW);
- if(dt > OB_SOLID && !(ob==OBACT && (G.f & G_FACESELECT) && me && me->tface)) {
+ if(dt > OB_SOLID && !(ob==OBACT && (G.f & G_FACESELECT) && me && me->mtface)) {
if(ob->flag & SELECT) {
BIF_ThemeColor((ob==OBACT)?TH_ACTIVE:TH_SELECT);
} else {
@@ -1098,6 +1100,8 @@ void draw_tface_mesh(Object *ob, Mesh *me, int dt)
}
dm->drawLooseEdges(dm);
}
+
+ dm->release(dm);
}
void init_realtime_GL(void)
diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c
index 457f3e7d32d..81abe00320e 100644
--- a/source/blender/src/drawobject.c
+++ b/source/blender/src/drawobject.c
@@ -1136,8 +1136,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;
- int dmNeedsFree;
- DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree);
+ DerivedMesh *dm = editmesh_get_derived_cage();
data.func = func;
data.userData = userData;
@@ -1149,9 +1148,7 @@ void mesh_foreachScreenVert(void (*func)(void *userData, EditVert *eve, int x, i
dm->foreachMappedVert(dm, mesh_foreachScreenVert__mapFunc, &data);
EM_free_index_arrays();
- if (dmNeedsFree) {
- dm->release(dm);
- }
+ dm->release(dm);
}
static void mesh_foreachScreenEdge__mapFunc(void *userData, int index, float *v0co, float *v1co)
@@ -1181,8 +1178,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;
- int dmNeedsFree;
- DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree);
+ DerivedMesh *dm = editmesh_get_derived_cage();
data.func = func;
data.userData = userData;
@@ -1194,9 +1190,7 @@ void mesh_foreachScreenEdge(void (*func)(void *userData, EditEdge *eed, int x0,
dm->foreachMappedEdge(dm, mesh_foreachScreenEdge__mapFunc, &data);
EM_free_index_arrays();
- if (dmNeedsFree) {
- dm->release(dm);
- }
+ dm->release(dm);
}
static void mesh_foreachScreenFace__mapFunc(void *userData, int index, float *cent, float *no)
@@ -1214,8 +1208,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;
- int dmNeedsFree;
- DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree);
+ DerivedMesh *dm = editmesh_get_derived_cage();
data.func = func;
data.userData = userData;
@@ -1226,9 +1219,7 @@ void mesh_foreachScreenFace(void (*func)(void *userData, EditFace *efa, int x, i
dm->foreachMappedFaceCenter(dm, mesh_foreachScreenFace__mapFunc, &data);
EM_free_index_arrays();
- if (dmNeedsFree) {
- dm->release(dm);
- }
+ dm->release(dm);
}
void nurbs_foreachScreenVert(void (*func)(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, int x, int y), void *userData)
@@ -1591,7 +1582,7 @@ static void draw_em_fancy_edges(DerivedMesh *cageDM)
* draw some debug info about verse mesh (vertex indexes,
* face indexes, status of )
*/
-static draw_verse_debug(Object *ob, EditMesh *em)
+static void draw_verse_debug(Object *ob, EditMesh *em)
{
struct EditVert *eve=NULL;
struct EditFace *efa=NULL;
@@ -2066,7 +2057,7 @@ static void draw_mesh_fancy(Base *base, DerivedMesh *baseDM, DerivedMesh *dm, in
else if((G.f & (G_VERTEXPAINT+G_TEXTUREPAINT)) && me->mcol) {
dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 1);
}
- else if((G.f & (G_VERTEXPAINT+G_TEXTUREPAINT)) && me->tface) {
+ else if((G.f & (G_VERTEXPAINT+G_TEXTUREPAINT)) && me->mtface) {
dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 1);
}
else do_draw= 1;
@@ -2158,22 +2149,19 @@ static int draw_mesh_object(Base *base, int dt, int flag)
}
if(ob==G.obedit || drawlinked) {
- int cageNeedsFree, finalNeedsFree;
DerivedMesh *finalDM, *cageDM;
- if (G.obedit!=ob) {
+ if (G.obedit!=ob)
finalDM = cageDM = editmesh_get_derived_base();
- cageNeedsFree = 0;
- finalNeedsFree = 1;
- } else {
- cageDM = editmesh_get_derived_cage_and_final(&finalDM, &cageNeedsFree, &finalNeedsFree);
- }
+ else
+ cageDM = editmesh_get_derived_cage_and_final(&finalDM);
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);
- if (cageNeedsFree) cageDM->release(cageDM);
- if (finalNeedsFree) finalDM->release(finalDM);
+ if (cageDM != finalDM)
+ cageDM->release(cageDM);
+ finalDM->release(finalDM);
}
else if(!G.obedit && G.scene->sculptdata.active_ob == ob && !modifiers_getVirtualModifierList(ob)) {
sculptmode_draw_mesh(NULL);
@@ -2182,17 +2170,16 @@ 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)) {
- int baseDMneedsFree, realDMneedsFree;
- DerivedMesh *baseDM = mesh_get_derived_deform(ob, &baseDMneedsFree);
- DerivedMesh *realDM = mesh_get_derived_final(ob, &realDMneedsFree);
+ DerivedMesh *baseDM = mesh_get_derived_deform(ob);
+ DerivedMesh *realDM = mesh_get_derived_final(ob);
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);
if(me->totvert==0) retval= 1;
- if (baseDMneedsFree) baseDM->release(baseDM);
- if (realDMneedsFree) realDM->release(realDM);
+ baseDM->release(baseDM);
+ realDM->release(realDM);
}
}
@@ -4428,7 +4415,7 @@ static int bbs_mesh_solid__setDrawOpts(void *userData, int index, int *drawSmoot
{
Mesh *me = userData;
- if (!me->tface || !(me->tface[index].flag&TF_HIDE)) {
+ if (!me->mtface || !(me->mtface[index].flag&TF_HIDE)) {
set_framebuffer_index_color(index+1);
return 1;
} else {
@@ -4451,8 +4438,7 @@ static int bbs_mesh_wire__setDrawOpts(void *userData, int index)
static void bbs_mesh_solid(Object *ob)
{
- int dmNeedsFree;
- DerivedMesh *dm = mesh_get_derived_final(ob, &dmNeedsFree);
+ DerivedMesh *dm = mesh_get_derived_final(ob);
Mesh *me = (Mesh*)ob->data;
glColor3ub(0, 0, 0);
@@ -4460,7 +4446,7 @@ static void bbs_mesh_solid(Object *ob)
/* draw edges for seam marking in faceselect mode, but not when painting,
so that painting doesn't get interrupted on an edge */
- if ((G.f & G_FACESELECT) && !(G.f & (G_VERTEXPAINT|G_TEXTUREPAINT|G_WEIGHTPAINT)) && me->tface) {
+ if ((G.f & G_FACESELECT) && !(G.f & (G_VERTEXPAINT|G_TEXTUREPAINT|G_WEIGHTPAINT)) && me->mtface) {
struct { Mesh *me; EdgeHash *eh; int offset; } userData;
userData.me = me;
@@ -4474,8 +4460,7 @@ static void bbs_mesh_solid(Object *ob)
BLI_edgehash_free(userData.eh, NULL);
}
- if (dmNeedsFree)
- dm->release(dm);
+ dm->release(dm);
}
void draw_object_backbufsel(Object *ob)
@@ -4489,8 +4474,7 @@ void draw_object_backbufsel(Object *ob)
switch( ob->type) {
case OB_MESH:
if(ob==G.obedit) {
- int dmNeedsFree;
- DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree);
+ DerivedMesh *dm = editmesh_get_derived_cage();
EM_init_index_arrays(1, 1, 1);
@@ -4507,9 +4491,7 @@ void draw_object_backbufsel(Object *ob)
bglPolygonOffset(0.0);
- if (dmNeedsFree) {
- dm->release(dm);
- }
+ dm->release(dm);
EM_free_index_arrays();
}
@@ -4531,14 +4513,13 @@ void draw_object_backbufsel(Object *ob)
void draw_object_instance(Object *ob, int dt, int outline)
{
DerivedMesh *dm=NULL, *edm=NULL;
- int needsfree= 1;
if(ob==NULL || ob->type!=OB_MESH) return;
if(G.obedit && ob->data==G.obedit->data)
edm= editmesh_get_derived_base();
else
- dm = mesh_get_derived_final(ob, &needsfree);
+ dm = mesh_get_derived_final(ob);
if(dt<=OB_WIRE) {
if(dm)
@@ -4571,6 +4552,6 @@ void draw_object_instance(Object *ob, int dt, int outline)
}
if(edm) edm->release(edm);
- if(dm && needsfree) dm->release(dm);
+ if(dm) dm->release(dm);
}
diff --git a/source/blender/src/drawview.c b/source/blender/src/drawview.c
index ea4e6349140..45392c6cc71 100644
--- a/source/blender/src/drawview.c
+++ b/source/blender/src/drawview.c
@@ -1567,7 +1567,7 @@ static void v3d_editvertex_buts(uiBlock *block, Object *ob, float lim)
/* check for defgroups */
if(evedef)
- dvert= CustomData_em_get(&em->vdata, evedef->data, LAYERTYPE_MDEFORMVERT);
+ dvert= CustomData_em_get(&em->vdata, evedef->data, CD_MDEFORMVERT);
if(tot==1 && dvert && dvert->totweight) {
bDeformGroup *dg;
int i, max=1, init=1;
diff --git a/source/blender/src/editdeform.c b/source/blender/src/editdeform.c
index cea223f98df..0f13a6f4cae 100644
--- a/source/blender/src/editdeform.c
+++ b/source/blender/src/editdeform.c
@@ -81,7 +81,7 @@ void sel_verts_defgroup (int select)
switch (ob->type){
case OB_MESH:
for (eve=G.editMesh->verts.first; eve; eve=eve->next){
- dvert= CustomData_em_get(&G.editMesh->vdata, eve->data, LAYERTYPE_MDEFORMVERT);
+ dvert= CustomData_em_get(&G.editMesh->vdata, eve->data, CD_MDEFORMVERT);
if (dvert && dvert->totweight){
for (i=0; i<dvert->totweight; i++){
@@ -223,7 +223,7 @@ void del_defgroup (Object *ob)
MDeformVert *dvert;
for (eve=em->verts.first; eve; eve=eve->next){
- dvert= CustomData_em_get(&G.editMesh->vdata, eve->data, LAYERTYPE_MDEFORMVERT);
+ dvert= CustomData_em_get(&G.editMesh->vdata, eve->data, CD_MDEFORMVERT);
if (dvert)
for (i=0; i<dvert->totweight; i++)
@@ -267,7 +267,7 @@ void create_dverts(ID *id)
if( GS(id->name)==ID_ME) {
Mesh *me= (Mesh *)id;
- me->dvert= MEM_callocN(sizeof(MDeformVert)*me->totvert, "deformVert");
+ me->dvert= CustomData_add_layer(&me->vdata, CD_MDEFORMVERT, 0, NULL, me->totvert);
}
else if( GS(id->name)==ID_LT) {
Lattice *lt= (Lattice *)id;
@@ -506,12 +506,12 @@ void assign_verts_defgroup (void)
switch (ob->type){
case OB_MESH:
- if (!CustomData_has_layer(&G.editMesh->vdata, LAYERTYPE_MDEFORMVERT))
- EM_add_data_layer(&G.editMesh->vdata, LAYERTYPE_MDEFORMVERT);
+ if (!CustomData_has_layer(&G.editMesh->vdata, CD_MDEFORMVERT))
+ EM_add_data_layer(&G.editMesh->vdata, CD_MDEFORMVERT);
/* Go through the list of editverts and assign them */
for (eve=G.editMesh->verts.first; eve; eve=eve->next){
- dvert= CustomData_em_get(&G.editMesh->vdata, eve->data, LAYERTYPE_MDEFORMVERT);
+ dvert= CustomData_em_get(&G.editMesh->vdata, eve->data, CD_MDEFORMVERT);
if (dvert && (eve->f & 1)){
done=0;
@@ -618,7 +618,7 @@ void remove_verts_defgroup (int allverts)
switch (ob->type){
case OB_MESH:
for (eve=G.editMesh->verts.first; eve; eve=eve->next){
- dvert= CustomData_em_get(&G.editMesh->vdata, eve->data, LAYERTYPE_MDEFORMVERT);
+ dvert= CustomData_em_get(&G.editMesh->vdata, eve->data, CD_MDEFORMVERT);
if (dvert && dvert->dw && ((eve->f & 1) || allverts)){
for (i=0; i<dvert->totweight; i++){
diff --git a/source/blender/src/editface.c b/source/blender/src/editface.c
index 49194f3fb67..c235da1437c 100644
--- a/source/blender/src/editface.c
+++ b/source/blender/src/editface.c
@@ -124,7 +124,7 @@
/* returns 0 if not found, otherwise 1 */
int facesel_face_pick(Mesh *me, short *mval, unsigned int *index, short rect)
{
- if (!me || !me->tface || me->totface==0)
+ if (!me || !me->mtface || me->totface==0)
return 0;
if (G.vd->flag & V3D_NEEDBACKBUFDRAW) {
@@ -179,7 +179,7 @@ static void uv_calc_center_vector(float *result, Object *ob, Mesh *me)
{
float min[3], max[3], *cursx;
int a;
- TFace *tface;
+ MTFace *tface;
MFace *mface;
switch (G.vd->around)
@@ -188,7 +188,7 @@ static void uv_calc_center_vector(float *result, Object *ob, Mesh *me)
min[0]= min[1]= min[2]= 1e20f;
max[0]= max[1]= max[2]= -1e20f;
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
for(a=0; a<me->totface; a++, mface++, tface++) {
if(tface->flag & TF_SELECT) {
@@ -341,7 +341,7 @@ static void uv_calc_shift_project(float *target, float *shift, float rotmat[][4]
void calculate_uv_map(unsigned short mapmode)
{
Mesh *me;
- TFace *tface;
+ MTFace *tface;
MFace *mface;
Object *ob;
float dx, dy, rotatematrix[4][4], radius= 1.0, min[3], cent[3], max[3];
@@ -359,7 +359,7 @@ void calculate_uv_map(unsigned short mapmode)
}
me= get_mesh(ob=OBACT);
- if(me==0 || me->tface==0) return;
+ if(me==0 || me->mtface==0) return;
if(me->totface==0) return;
switch(mapmode) {
@@ -379,7 +379,7 @@ void calculate_uv_map(unsigned short mapmode)
uv_calc_center_vector(cent, ob, me);
uv_calc_map_matrix(rotatematrix, ob, upangledeg, sideangledeg, 1.0f);
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
for(a=0; a<me->totface; a++, mface++, tface++) {
if(tface->flag & TF_SELECT) {
@@ -395,7 +395,7 @@ void calculate_uv_map(unsigned short mapmode)
dx= (max[0]-min[0]);
dy= (max[1]-min[1]);
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
for(a=0; a<me->totface; a++, mface++, tface++) {
if(tface->flag & TF_SELECT) {
@@ -412,7 +412,7 @@ void calculate_uv_map(unsigned short mapmode)
cent[0] = cent[1] = cent[2] = 0.0;
Mat4CpyMat4(rotatematrix,ob->obmat);
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
for(a=0; a<me->totface; a++, mface++, tface++) {
if(tface->flag & TF_SELECT) {
@@ -435,7 +435,7 @@ void calculate_uv_map(unsigned short mapmode)
case B_UVAUTO_STD2: fac = 0.5; break;
}
- tface= me->tface;
+ tface= me->mtface;
for(a=0; a<me->totface; a++, tface++)
if(tface->flag & TF_SELECT)
default_uv(tface->uv, fac);
@@ -453,7 +453,7 @@ void calculate_uv_map(unsigned short mapmode)
else
uv_calc_map_matrix(rotatematrix,ob,upangledeg,sideangledeg,radius);
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
for(a=0; a<me->totface; a++, mface++, tface++) {
if(tface->flag & TF_SELECT) {
@@ -491,7 +491,7 @@ void calculate_uv_map(unsigned short mapmode)
MVert *mv= me->mvert;
float cubesize = G.scene->toolsettings->uvcalc_cubesize;
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
for(a=0; a<me->totface; a++, mface++, tface++) {
if(tface->flag & TF_SELECT) {
@@ -536,7 +536,7 @@ void calculate_uv_map(unsigned short mapmode)
/* clipping and wrapping */
if(G.sima && G.sima->flag & SI_CLIP_UV) {
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
for(a=0; a<me->totface; a++, mface++, tface++) {
if(!(tface->flag & TF_SELECT)) continue;
@@ -569,31 +569,41 @@ void calculate_uv_map(unsigned short mapmode)
allqueue(REDRAWIMAGE, 0);
}
-TFace *get_active_tface()
+MTFace *get_active_tface(MCol **mcol)
{
Mesh *me;
- TFace *tf;
+ MTFace *tf;
int a;
if(OBACT==NULL || OBACT->type!=OB_MESH)
return NULL;
me= get_mesh(OBACT);
- if(me==0 || me->tface==0)
+ if(me==0 || me->mtface==0)
return NULL;
- for(a=0, tf=me->tface; a < me->totface; a++, tf++)
- if(tf->flag & TF_ACTIVE)
+ for(a=0, tf=me->mtface; a < me->totface; a++, tf++) {
+ if(tf->flag & TF_ACTIVE) {
+ if(mcol) *mcol = (me->mcol)? &me->mcol[a]: NULL;
return tf;
+ }
+ }
- for(a=0, tf=me->tface; a < me->totface; a++, tf++)
- if(tf->flag & TF_SELECT)
+ for(a=0, tf=me->mtface; a < me->totface; a++, tf++) {
+ if(tf->flag & TF_SELECT) {
+ if(mcol) *mcol = (me->mcol)? &me->mcol[a]: NULL;
return tf;
+ }
+ }
- for(a=0, tf=me->tface; a < me->totface; a++, tf++)
- if((tf->flag & TF_HIDE)==0)
+ for(a=0, tf=me->mtface; a < me->totface; a++, tf++) {
+ if((tf->flag & TF_HIDE)==0) {
+ if(mcol) *mcol = (me->mcol)? &me->mcol[a]: NULL;
return tf;
-
+ }
+ }
+
+ if(mcol) *mcol = NULL;
return NULL;
}
@@ -616,16 +626,12 @@ void default_uv(float uv[][2], float size)
uv[3][0]= size;
uv[3][1]= size+dy;
-
-
}
-void default_tface(TFace *tface)
+void default_tface(MTFace *tface)
{
default_uv(tface->uv, 1.0);
- tface->col[0]= tface->col[1]= tface->col[2]= tface->col[3]= vpaint_get_current_col();
-
tface->mode= TF_TEX;
tface->mode= 0;
tface->flag= TF_SELECT;
@@ -635,32 +641,30 @@ void default_tface(TFace *tface)
void make_tfaces(Mesh *me)
{
- TFace *tface;
+ MTFace *tf;
int a;
-
- a= me->totface;
- if(a==0) return;
- tface= me->tface= MEM_callocN(a*sizeof(TFace), "tface");
- while(a--) {
- default_tface(tface);
- tface++;
- }
- if(me->mcol) {
- mcol_to_tface(me, 1);
- }
+
+ if(me->mtface)
+ return;
+
+ me->mtface= CustomData_add_layer(&me->fdata, CD_MTFACE, 0, 0, me->totface);
+
+ tf= me->mtface;
+ for (a=0; a<me->totface; a++, tf++)
+ default_tface(tf);
}
void reveal_tface()
{
Mesh *me;
- TFace *tface;
+ MTFace *tface;
int a;
me= get_mesh(OBACT);
- if(me==0 || me->tface==0 || me->totface==0) return;
+ if(me==0 || me->mtface==0 || me->totface==0) return;
- tface= me->tface;
+ tface= me->mtface;
a= me->totface;
while(a--) {
if(tface->flag & TF_HIDE) {
@@ -678,18 +682,18 @@ void reveal_tface()
void hide_tface()
{
Mesh *me;
- TFace *tface;
+ MTFace *tface;
int a;
me= get_mesh(OBACT);
- if(me==0 || me->tface==0 || me->totface==0) return;
+ if(me==0 || me->mtface==0 || me->totface==0) return;
if(G.qual & LR_ALTKEY) {
reveal_tface();
return;
}
- tface= me->tface;
+ tface= me->mtface;
a= me->totface;
while(a--) {
if(tface->flag & TF_HIDE);
@@ -720,7 +724,7 @@ void select_linked_tfaces(int mode)
ob = OBACT;
me = get_mesh(ob);
- if(me==0 || me->tface==0 || me->totface==0) return;
+ if(me==0 || me->mtface==0 || me->totface==0) return;
if (mode==0 || mode==1) {
if (!(ob->lay & G.vd->lay))
@@ -736,13 +740,13 @@ void select_linked_tfaces(int mode)
void deselectall_tface()
{
Mesh *me;
- TFace *tface;
+ MTFace *tface;
int a, sel;
me= get_mesh(OBACT);
- if(me==0 || me->tface==0) return;
+ if(me==0 || me->mtface==0) return;
- tface= me->tface;
+ tface= me->mtface;
a= me->totface;
sel= 0;
while(a--) {
@@ -751,7 +755,7 @@ void deselectall_tface()
tface++;
}
- tface= me->tface;
+ tface= me->mtface;
a= me->totface;
while(a--) {
if(tface->flag & TF_HIDE);
@@ -770,13 +774,13 @@ void deselectall_tface()
void selectswap_tface(void)
{
Mesh *me;
- TFace *tface;
+ MTFace *tface;
int a;
me= get_mesh(OBACT);
- if(me==0 || me->tface==0) return;
+ if(me==0 || me->mtface==0) return;
- tface= me->tface;
+ tface= me->mtface;
a= me->totface;
while(a--) {
if(tface->flag & TF_HIDE);
@@ -795,133 +799,143 @@ void selectswap_tface(void)
void rotate_uv_tface()
{
Mesh *me;
- TFace *tface;
- MFace *mface;
+ MFace *mf;
+ MCol *mcol;
+ MTFace *tf;
short mode;
int a;
me= get_mesh(OBACT);
- if(me==0 || me->tface==0) return;
+ if(me==0 || me->mtface==0) return;
mode= pupmenu("Rotate %t|UV Co-ordinates %x1|Vertex Colors %x2");
-
- if(mode<1) return;
-
- tface= me->tface;
- mface= me->mface;
- a= me->totface;
- while(a--) {
- if(tface->flag & TF_SELECT) {
- if(mode==1) {
- float u1= tface->uv[0][0];
- float v1= tface->uv[0][1];
+
+ if (mode == 1 && me->mtface) {
+ tf= me->mtface;
+ mf= me->mface;
+ for(a=0; a<me->totface; a++, tf++, mf++) {
+ if(tf->flag & TF_SELECT) {
+ float u1= tf->uv[0][0];
+ float v1= tf->uv[0][1];
- tface->uv[0][0]= tface->uv[1][0];
- tface->uv[0][1]= tface->uv[1][1];
+ tf->uv[0][0]= tf->uv[1][0];
+ tf->uv[0][1]= tf->uv[1][1];
- tface->uv[1][0]= tface->uv[2][0];
- tface->uv[1][1]= tface->uv[2][1];
+ tf->uv[1][0]= tf->uv[2][0];
+ tf->uv[1][1]= tf->uv[2][1];
- if(mface->v4) {
- tface->uv[2][0]= tface->uv[3][0];
- tface->uv[2][1]= tface->uv[3][1];
+ if(mf->v4) {
+ tf->uv[2][0]= tf->uv[3][0];
+ tf->uv[2][1]= tf->uv[3][1];
- tface->uv[3][0]= u1;
- tface->uv[3][1]= v1;
+ tf->uv[3][0]= u1;
+ tf->uv[3][1]= v1;
}
else {
- tface->uv[2][0]= u1;
- tface->uv[2][1]= v1;
+ tf->uv[2][0]= u1;
+ tf->uv[2][1]= v1;
}
}
- else if(mode==2) {
- unsigned int tcol= tface->col[0];
+ }
+
+ BIF_undo_push("Rotate UV face");
+ object_uvs_changed(OBACT);
+ }
+ else if (mode == 2 && me->mcol) {
+ tf= me->mtface;
+ mcol= me->mcol;
+ mf= me->mface;
+ for(a=0; a<me->totface; a++, tf++, mf++, mcol+=4) {
+ if(tf->flag & TF_SELECT) {
+ MCol tmpcol= mcol[0];
- tface->col[0]= tface->col[1];
- tface->col[1]= tface->col[2];
+ mcol[0]= mcol[1];
+ mcol[1]= mcol[2];
- if(mface->v4) {
- tface->col[2]= tface->col[3];
- tface->col[3]= tcol;
- }
- else {
- tface->col[2]= tcol;
+ if(mf->v4) {
+ mcol[2]= mcol[3];
+ mcol[3]= tmpcol;
}
+ else
+ mcol[2]= tmpcol;
}
}
- tface++;
- mface++;
- }
-
- BIF_undo_push("Rotate UV face");
- object_uvs_changed(OBACT);
+ BIF_undo_push("Rotate color face");
+ object_uvs_changed(OBACT);
+ }
}
void mirror_uv_tface()
{
Mesh *me;
- TFace *tface;
- MFace *mface;
+ MFace *mf;
+ MTFace *tf;
+ MCol *mcol;
short mode;
int a;
me= get_mesh(OBACT);
- if(me==0 || me->tface==0) return;
+ if(me==0 || me->mtface==0) return;
mode= pupmenu("Mirror %t|UV Co-ordinates %x1|Vertex Colors %x2");
- if(mode<1) return;
-
- tface= me->tface;
- mface= me->mface;
- a= me->totface;
- while(a--) {
- if(tface->flag & TF_SELECT) {
- if(mode==1) {
- float u1= tface->uv[0][0];
- float v1= tface->uv[0][1];
- if(mface->v4) {
- tface->uv[0][0]= tface->uv[3][0];
- tface->uv[0][1]= tface->uv[3][1];
+ if (mode==1 && me->mtface) {
+ mf= me->mface;
+ tf= me->mtface;
+
+ for (a=0; a<me->totface; a++, tf++, mf++) {
+ if(tf->flag & TF_SELECT) {
+ float u1= tf->uv[0][0];
+ float v1= tf->uv[0][1];
+ if(mf->v4) {
+ tf->uv[0][0]= tf->uv[3][0];
+ tf->uv[0][1]= tf->uv[3][1];
- tface->uv[3][0]= u1;
- tface->uv[3][1]= v1;
+ tf->uv[3][0]= u1;
+ tf->uv[3][1]= v1;
- u1= tface->uv[1][0];
- v1= tface->uv[1][1];
+ u1= tf->uv[1][0];
+ v1= tf->uv[1][1];
- tface->uv[1][0]= tface->uv[2][0];
- tface->uv[1][1]= tface->uv[2][1];
+ tf->uv[1][0]= tf->uv[2][0];
+ tf->uv[1][1]= tf->uv[2][1];
- tface->uv[2][0]= u1;
- tface->uv[2][1]= v1;
+ tf->uv[2][0]= u1;
+ tf->uv[2][1]= v1;
}
else {
- tface->uv[0][0]= tface->uv[2][0];
- tface->uv[0][1]= tface->uv[2][1];
- tface->uv[2][0]= u1;
- tface->uv[2][1]= v1;
+ tf->uv[0][0]= tf->uv[2][0];
+ tf->uv[0][1]= tf->uv[2][1];
+ tf->uv[2][0]= u1;
+ tf->uv[2][1]= v1;
}
}
- else if(mode==2) {
- unsigned int tcol= tface->col[0];
- if(mface->v4) {
- tface->col[0]= tface->col[3];
- tface->col[3]= tcol;
-
- tcol = tface->col[1];
- tface->col[1]= tface->col[2];
- tface->col[2]= tcol;
+ }
+ }
+ else if(mode==2 && me->mcol) {
+ mf= me->mface;
+ tf= me->mtface;
+ mcol= me->mcol;
+
+ for (a=0; a<me->totface; a++, tf++, mf++, mcol+=4) {
+ if(tf->flag & TF_SELECT) {
+ MCol tmpcol= mcol[0];
+
+ if(mf->v4) {
+ mcol[0]= mcol[3];
+ mcol[3]= tmpcol;
+
+ tmpcol = mcol[1];
+ mcol[1]= mcol[2];
+ mcol[2]= tmpcol;
}
else {
- tface->col[0]= tface->col[2];
- tface->col[2]= tcol;
+ mcol[0]= mcol[2];
+ mcol[2]= tmpcol;
}
}
}
- tface++;
- mface++;
}
BIF_undo_push("Mirror UV face");
@@ -934,7 +948,7 @@ void minmax_tface(float *min, float *max)
Object *ob;
Mesh *me;
MFace *mf;
- TFace *tf;
+ MTFace *tf;
MVert *mv;
int a;
float vec[3], bmat[3][3];
@@ -942,13 +956,13 @@ void minmax_tface(float *min, float *max)
ob = OBACT;
if (ob==0) return;
me= get_mesh(ob);
- if(me==0 || me->tface==0) return;
+ if(me==0 || me->mtface==0) return;
Mat3CpyMat4(bmat, ob->obmat);
mv= me->mvert;
mf= me->mface;
- tf= me->tface;
+ tf= me->mtface;
for (a=me->totface; a>0; a--, mf++, tf++) {
if (tf->flag & TF_HIDE || !(tf->flag & TF_SELECT))
continue;
@@ -1027,13 +1041,13 @@ static int seam_shortest_path(Mesh *me, int source, int target)
float *cost;
MEdge *med;
int a, *nedges, *edges, *prevedge, mednum = -1, nedgeswap = 0;
- TFace *tf;
+ MTFace *tf;
MFace *mf;
/* mark hidden edges as done, so we don't use them */
ehash = BLI_edgehash_new();
- for (a=0, mf=me->mface, tf=me->tface; a<me->totface; a++, tf++, mf++) {
+ for (a=0, mf=me->mface, tf=me->mtface; a<me->totface; a++, tf++, mf++) {
if (!(tf->flag & TF_HIDE)) {
BLI_edgehash_insert(ehash, mf->v1, mf->v2, NULL);
BLI_edgehash_insert(ehash, mf->v2, mf->v3, NULL);
@@ -1190,13 +1204,13 @@ void seam_edgehash_insert_face(EdgeHash *ehash, MFace *mf)
void seam_mark_clear_tface(short mode)
{
Mesh *me;
- TFace *tf;
+ MTFace *tf;
MFace *mf;
MEdge *med;
int a;
me= get_mesh(OBACT);
- if(me==0 || me->tface==0 || me->totface==0) return;
+ if(me==0 || me->mtface==0 || me->totface==0) return;
if (mode == 0)
mode = pupmenu("Seams%t|Mark Border Seam %x1|Clear Seam %x2");
@@ -1207,7 +1221,7 @@ void seam_mark_clear_tface(short mode)
if (mode == 2) {
EdgeHash *ehash = BLI_edgehash_new();
- for (a=0, mf=me->mface, tf=me->tface; a<me->totface; a++, tf++, mf++)
+ for (a=0, mf=me->mface, tf=me->mtface; a<me->totface; a++, tf++, mf++)
if (!(tf->flag & TF_HIDE) && (tf->flag & TF_SELECT))
seam_edgehash_insert_face(ehash, mf);
@@ -1222,7 +1236,7 @@ void seam_mark_clear_tface(short mode)
EdgeHash *ehash1 = BLI_edgehash_new();
EdgeHash *ehash2 = BLI_edgehash_new();
- for (a=0, mf=me->mface, tf=me->tface; a<me->totface; a++, tf++, mf++) {
+ for (a=0, mf=me->mface, tf=me->mtface; a<me->totface; a++, tf++, mf++) {
if ((tf->flag & TF_HIDE) || !(tf->flag & TF_SELECT))
seam_edgehash_insert_face(ehash1, mf);
else
@@ -1251,7 +1265,7 @@ void face_select()
{
Object *ob;
Mesh *me;
- TFace *tface, *tsel;
+ MTFace *tface, *tsel;
MFace *msel;
short mval[2];
unsigned int a, index;
@@ -1271,13 +1285,13 @@ void face_select()
if (!facesel_face_pick(me, mval, &index, 1)) return;
- tsel= (((TFace*)me->tface)+index);
+ tsel= (((MTFace*)me->mtface)+index);
msel= (((MFace*)me->mface)+index);
if (tsel->flag & TF_HIDE) return;
/* clear flags */
- tface = me->tface;
+ tface = me->mtface;
a = me->totface;
while (a--) {
if (G.qual & LR_SHIFTKEY)
@@ -1307,7 +1321,7 @@ void face_select()
void face_borderselect()
{
Mesh *me;
- TFace *tface;
+ MTFace *tface;
rcti rect;
struct ImBuf *ibuf;
unsigned int *rt;
@@ -1315,7 +1329,7 @@ void face_borderselect()
char *selar;
me= get_mesh(OBACT);
- if(me==0 || me->tface==0) return;
+ if(me==0 || me->mtface==0) return;
if(me->totface==0) return;
val= get_border(&rect, 3);
@@ -1347,7 +1361,7 @@ void face_borderselect()
rt++;
}
- tface= me->tface;
+ tface= me->mtface;
for(a=1; a<=me->totface; a++, tface++) {
if(selar[a]) {
if(tface->flag & TF_HIDE);
@@ -1454,7 +1468,7 @@ void set_faceselect() /* toggle */
}
else if (me && (ob->lay & G.vd->lay)) {
G.f |= G_FACESELECT;
- if(me->tface==NULL)
+ if(me->mtface==NULL)
make_tfaces(me);
setcursor_space(SPACE_VIEW3D, CURSOR_FACESEL);
@@ -1537,7 +1551,7 @@ static void texpaint_project(Object *ob, double *model, double *proj, GLint *vie
pco[1]= (float)winy;
}
-static int texpaint_projected_verts(Object *ob, MFace *mf, TFace *tf, MVert *mv, float *v1, float *v2, float *v3, float *v4)
+static int texpaint_projected_verts(Object *ob, MFace *mf, MTFace *tf, MVert *mv, float *v1, float *v2, float *v3, float *v4)
{
double model[16], proj[16];
GLint view[4];
@@ -1565,10 +1579,10 @@ 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, dmNeedsFree;
- DerivedMesh *dm = mesh_get_derived_final(ob, &dmNeedsFree);
- int *index = dm->getFaceDataArray(dm, LAYERTYPE_ORIGINDEX);
- TFace *tface = dm->getFaceDataArray(dm, LAYERTYPE_TFACE), *tf;
+ int nvert;
+ DerivedMesh *dm = mesh_get_derived_final(ob);
+ int *index = dm->getFaceDataArray(dm, CD_ORIGINDEX);
+ MTFace *tface = dm->getFaceDataArray(dm, CD_MTFACE), *tf;
int numfaces = dm->getNumFaces(dm), a;
MFace mf;
MVert mv[4];
@@ -1628,8 +1642,7 @@ void texpaint_pick_uv(Object *ob, Mesh *mesh, unsigned int faceindex, short *xy,
}
}
- if (dmNeedsFree)
- dm->release(dm);
+ dm->release(dm);
}
/* Selects all faces which have the same uv-texture as the active face
@@ -1642,7 +1655,7 @@ void get_same_uv(void)
{
Object *ob;
Mesh *me;
- TFace *tface;
+ MTFace *tface;
short a, foundtex=0;
Image *ima;
char uvname[160];
@@ -1656,7 +1669,7 @@ void get_same_uv(void)
/* Search for the active face with a UV-Texture */
- tface = me->tface;
+ tface = me->mtface;
a = me->totface;
while (a--) {
if(tface->flag & TF_ACTIVE){
@@ -1676,7 +1689,7 @@ void get_same_uv(void)
}
/* select everything with the same texture */
- tface = me->tface;
+ tface = me->mtface;
a = me->totface;
while (a--) {
ima=tface->tpage;
diff --git a/source/blender/src/editmesh.c b/source/blender/src/editmesh.c
index 820c6ca0f73..e66c42d902a 100644
--- a/source/blender/src/editmesh.c
+++ b/source/blender/src/editmesh.c
@@ -558,16 +558,18 @@ void free_editMesh(EditMesh *em)
if(em->faces.first) free_facelist(&em->faces);
if(em->selected.first) BLI_freelistN(&(em->selected));
- CustomData_free(&em->vdata);
- CustomData_free(&em->fdata);
+ CustomData_free(&em->vdata, 0);
+ CustomData_free(&em->fdata, 0);
if(em->derivedFinal) {
if (em->derivedFinal!=em->derivedCage) {
+ em->derivedFinal->needsFree= 1;
em->derivedFinal->release(em->derivedFinal);
}
em->derivedFinal= NULL;
}
if(em->derivedCage) {
+ em->derivedCage->needsFree= 1;
em->derivedCage->release(em->derivedCage);
em->derivedCage= NULL;
}
@@ -781,7 +783,7 @@ void make_editMesh()
Mesh *me= G.obedit->data;
EditMesh *em= G.editMesh;
MFace *mface;
- TFace *tface;
+ MTFace *tface;
MVert *mvert;
MSelect *mselect;
KeyBlock *actkey;
@@ -789,7 +791,6 @@ void make_editMesh()
EditFace *efa;
EditEdge *eed;
EditSelection *ese;
- CustomData mvdata, mfdata;
int tot, a, eekadoodle= 0;
#ifdef WITH_VERSE
@@ -822,11 +823,7 @@ void make_editMesh()
}
/* make editverts */
- CustomData_init(&mvdata, 0, me->totvert, SUB_ELEMS_VERT);
- if(me->dvert)
- CustomData_add_layer(&mvdata, LAYERTYPE_MDEFORMVERT, LAYERFLAG_NOFREE, me->dvert);
- CustomData_from_template(&mvdata, &em->vdata, 0, 0);
-
+ CustomData_copy(&me->vdata, &em->vdata, CD_MASK_EDITMESH, CD_CALLOC, 0);
mvert= me->mvert;
evlist= (EditVert **)MEM_mallocN(tot*sizeof(void *),"evlist");
@@ -849,11 +846,9 @@ void make_editMesh()
*/
eve->keyindex = a;
- CustomData_to_em_block(&mvdata, &em->vdata, a, &eve->data);
+ CustomData_to_em_block(&me->vdata, &em->vdata, a, &eve->data);
}
- CustomData_free(&mvdata);
-
if(actkey && actkey->totelem!=me->totvert);
else {
MEdge *medge= me->medge;
@@ -875,18 +870,11 @@ void make_editMesh()
}
}
- /* fill a CustomData, this is only temporary until Mesh get its own */
- CustomData_init(&mfdata, 0, me->totface, SUB_ELEMS_FACE);
- if(me->mcol)
- CustomData_add_layer(&mfdata, LAYERTYPE_MCOL, LAYERFLAG_NOFREE, me->mcol);
- if(me->tface)
- CustomData_add_layer(&mfdata, LAYERTYPE_TFACE, LAYERFLAG_NOFREE, me->tface);
-
- CustomData_from_template(&mfdata, &em->fdata, 0, 0);
-
+ CustomData_copy(&me->fdata, &em->fdata, CD_MASK_EDITMESH, CD_CALLOC, 0);
+
/* make faces */
mface= me->mface;
- tface= me->tface;
+ tface= me->mtface;
for(a=0; a<me->totface; a++, mface++) {
eve1= evlist[mface->v1];
@@ -898,7 +886,7 @@ void make_editMesh()
efa= addfacelist(eve1, eve2, eve3, eve4, NULL, NULL);
if(efa) {
- CustomData_to_em_block(&mfdata, &em->fdata, a, &efa->data);
+ CustomData_to_em_block(&me->fdata, &em->fdata, a, &efa->data);
efa->mat_nr= mface->mat_nr;
efa->flag= mface->flag & ~ME_HIDE;
@@ -910,7 +898,7 @@ void make_editMesh()
}
if(mface->flag & ME_HIDE) efa->h= 1;
}
- else if((tface = CustomData_get(&mfdata, a, LAYERTYPE_TFACE))) {
+ else if((tface = CustomData_get(&me->fdata, a, CD_MTFACE))) {
if(tface->flag & TF_HIDE)
efa->h= 1;
else if(tface->flag & TF_SELECT)
@@ -918,10 +906,8 @@ void make_editMesh()
}
}
- if(me->tface) tface++;
+ if(me->mtface) tface++;
}
-
- CustomData_free(&mfdata);
}
if(eekadoodle)
@@ -968,16 +954,14 @@ void load_editMesh(void)
MVert *mvert, *oldverts;
MEdge *medge;
MFace *mface;
- MSticky *ms;
MSelect *mselect;
- TFace *tf;
+ MTFace *tf;
EditVert *eve;
EditFace *efa;
EditEdge *eed;
EditSelection *ese;
float *fp, *newkey, *oldkey, nor[3];
int i, a, ototvert, totedge=0;
- CustomData mvdata, mfdata;
#ifdef WITH_VERSE
if(em->vnode) {
@@ -1014,41 +998,33 @@ void load_editMesh(void)
if(G.totface==0) mface= NULL;
else mface= MEM_callocN(G.totface*sizeof(MFace), "loadeditMesh face");
- /* free vertex and face data */
- if (me->dvert) {
- free_dverts(me->dvert, me->totvert);
- me->dvert= NULL;
- }
- if(me->tface) {
- MEM_freeN(me->tface);
- me->tface = NULL;
- }
- if(me->mcol) {
- MEM_freeN(me->mcol);
- me->mcol = NULL;
- }
-
/* lets save the old verts just in case we are actually working on
* a key ... we now do processing of the keys at the end */
- oldverts = me->mvert;
+ oldverts= me->mvert;
ototvert= me->totvert;
- /* put new data in Mesh */
- me->mvert= mvert;
- me->totvert= G.totvert;
+ for (i=0; i<me->vdata.totlayer; i++)
+ if (me->vdata.layers[i].type == CD_MVERT)
+ me->vdata.layers[i].flag |= CD_FLAG_NOFREE;
- if(me->medge) MEM_freeN(me->medge);
- me->medge= medge;
- me->totedge= totedge;
-
- if(me->mface) MEM_freeN(me->mface);
+ /* free custom data */
+ CustomData_free(&me->vdata, me->totvert);
+ CustomData_free(&me->edata, me->totedge);
+ CustomData_free(&me->fdata, me->totface);
- me->mface= mface;
+ /* add new custom data */
+ me->totvert= G.totvert;
+ me->totedge= totedge;
me->totface= G.totface;
- /* vertex and face data */
- CustomData_from_template(&em->vdata, &mvdata, LAYERFLAG_NOFREE, me->totvert);
- CustomData_from_template(&em->fdata, &mfdata, LAYERFLAG_NOFREE, me->totface);
+ CustomData_copy(&em->vdata, &me->vdata, CD_MASK_MESH, CD_CALLOC, me->totvert);
+ CustomData_copy(&em->fdata, &me->fdata, CD_MASK_MESH, CD_CALLOC, me->totface);
+
+ me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, 0, mvert, me->totvert);
+ me->medge= CustomData_add_layer(&me->edata, CD_MEDGE, 0, medge, me->totedge);
+ me->mface= CustomData_add_layer(&me->fdata, CD_MFACE, 0, mface, me->totface);
+
+ mesh_update_customdata_pointers(me);
/* the vertices, use ->tmp.l as counter */
eve= em->verts.first;
@@ -1065,7 +1041,7 @@ void load_editMesh(void)
/* note: it used to remove me->dvert when it was not in use, cancelled
that... annoying when you have a fresh vgroup */
- CustomData_from_em_block(&em->vdata, &mvdata, eve->data, a);
+ CustomData_from_em_block(&em->vdata, &me->vdata, eve->data, a);
eve->tmp.l = a++; /* counter */
@@ -1084,10 +1060,6 @@ void load_editMesh(void)
mvert++;
}
- /* from CustomData to dvert in Mesh */
- me->dvert = CustomData_get(&mvdata, 0, LAYERTYPE_MDEFORMVERT);
- CustomData_free(&mvdata);
-
/* the edges */
a= 0;
eed= em->edges.first;
@@ -1160,11 +1132,10 @@ void load_editMesh(void)
efa->e4->f2= 2;
}
- CustomData_from_em_block(&em->fdata, &mfdata, efa->data, i);
+ CustomData_from_em_block(&em->fdata, &me->fdata, efa->data, i);
/* no index '0' at location 3 or 4 */
- test_index_face(mface, CustomData_get(&mfdata, i, LAYERTYPE_MCOL),
- CustomData_get(&mfdata, i, LAYERTYPE_TFACE), efa->v4?4:3);
+ test_index_face(mface, &me->fdata, i, efa->v4?4:3);
#ifdef WITH_VERSE
if(efa->vface) {
@@ -1179,10 +1150,10 @@ void load_editMesh(void)
/* sync hide and select flags with faceselect mode */
if(G.f & G_FACESELECT) {
- if(CustomData_has_layer(&mfdata, LAYERTYPE_TFACE) && (me->totface > 0)) {
+ if(me->mtface && (me->totface > 0)) {
efa= em->faces.first;
for(a=0, efa=em->faces.first; efa; a++, efa=efa->next) {
- tf = CustomData_get(&mfdata, a, LAYERTYPE_TFACE);
+ tf = &me->mtface[a];
if(efa->h) tf->flag |= TF_HIDE;
else tf->flag &= ~TF_HIDE;
@@ -1192,10 +1163,6 @@ void load_editMesh(void)
}
}
- /* from CustomData to tface and mcol in Mesh */
- me->tface = CustomData_get(&mfdata, 0, LAYERTYPE_TFACE);
- me->mcol = CustomData_get(&mfdata, 0, LAYERTYPE_MCOL);
- CustomData_free(&mfdata);
/* patch hook indices and vertex parents */
{
@@ -1364,17 +1331,6 @@ void load_editMesh(void)
}
}
- /* sticky */
- if(me->msticky) {
- if (ototvert<me->totvert) {
- ms= MEM_callocN(me->totvert*sizeof(MSticky), "msticky");
- memcpy(ms, me->msticky, ototvert*sizeof(MSticky));
- MEM_freeN(me->msticky);
- me->msticky= ms;
- error("Sticky was too small");
- }
- }
-
mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
}
@@ -1872,8 +1828,8 @@ static void free_undoMesh(void *umv)
if(um->faces) MEM_freeN(um->faces);
if(um->selected) MEM_freeN(um->selected);
if(um->retopo_paint_data) retopo_free_paint_data(um->retopo_paint_data);
- CustomData_free(&um->vdata);
- CustomData_free(&um->fdata);
+ CustomData_free(&um->vdata, um->totvert);
+ CustomData_free(&um->fdata, um->totface);
MEM_freeN(um);
}
@@ -1906,8 +1862,8 @@ static void *editMesh_to_undoMesh(void)
if(um->totface) efac= um->faces= MEM_callocN(um->totface*sizeof(EditFaceC), "allfacesC");
if(um->totsel) esec= um->selected= MEM_callocN(um->totsel*sizeof(EditSelectionC), "allselections");
- if(um->totvert) CustomData_from_template(&em->vdata, &um->vdata, 0, um->totvert);
- if(um->totface) CustomData_from_template(&em->fdata, &um->fdata, 0, um->totface);
+ if(um->totvert) CustomData_copy(&em->vdata, &um->vdata, CD_MASK_EDITMESH, CD_CALLOC, um->totvert);
+ if(um->totface) CustomData_copy(&em->fdata, &um->fdata, CD_MASK_EDITMESH, CD_CALLOC, um->totface);
/* now copy vertices */
a = 0;
@@ -2006,9 +1962,13 @@ static void undoMesh_to_editMesh(void *umv)
G.editMesh->vnode = vnode;
#endif
+ CustomData_free(&em->vdata, 0);
+ CustomData_free(&em->fdata, 0);
+
+ CustomData_copy(&um->vdata, &em->vdata, CD_MASK_EDITMESH, CD_CALLOC, 0);
+ CustomData_copy(&um->fdata, &em->fdata, CD_MASK_EDITMESH, CD_CALLOC, 0);
+
/* now copy vertices */
- CustomData_free(&em->vdata);
- CustomData_from_template(&um->vdata, &em->vdata, 0, 0);
if(um->totvert) evar= MEM_mallocN(um->totvert*sizeof(EditVert *), "vertex ar");
for(a=0, evec= um->verts; a<um->totvert; a++, evec++) {
@@ -2036,9 +1996,6 @@ static void undoMesh_to_editMesh(void *umv)
}
/* copy faces */
- CustomData_free(&em->fdata);
- CustomData_from_template(&um->fdata, &em->fdata, 0, 0);
-
for(a=0, efac= um->faces; a<um->totface; a++, efac++) {
if(efac->v4 != -1)
efa= addfacelist(evar[efac->v1], evar[efac->v2], evar[efac->v3], evar[efac->v4], NULL, NULL);
diff --git a/source/blender/src/editmesh_lib.c b/source/blender/src/editmesh_lib.c
index d40ab35a4db..6e9fc7260f6 100644
--- a/source/blender/src/editmesh_lib.c
+++ b/source/blender/src/editmesh_lib.c
@@ -798,11 +798,11 @@ void EM_add_data_layer(CustomData *data, int type)
return;
olddata= *data;
- olddata.layers= MEM_dupallocN(olddata.layers);
- CustomData_add_layer(data, type, 0, NULL);
+ olddata.layers= (olddata.layers)? MEM_dupallocN(olddata.layers): NULL;
+ CustomData_add_layer(data, type, 0, NULL, 0);
update_data_blocks(&olddata, data);
- MEM_freeN(olddata.layers);
+ if (olddata.layers) MEM_freeN(olddata.layers);
}
void EM_free_data_layer(CustomData *data, int type)
@@ -813,11 +813,11 @@ void EM_free_data_layer(CustomData *data, int type)
return;
olddata= *data;
- olddata.layers= MEM_dupallocN(olddata.layers);
- CustomData_free_layer(data, type);
+ olddata.layers= (olddata.layers)? MEM_dupallocN(olddata.layers): NULL;
+ CustomData_free_layer(data, type, 0);
update_data_blocks(&olddata, data);
- MEM_freeN(olddata.layers);
+ if (olddata.layers) MEM_freeN(olddata.layers);
}
/* ******** EXTRUDE ********* */
diff --git a/source/blender/src/editmesh_mods.c b/source/blender/src/editmesh_mods.c
index 95a0e85a20d..f0b1aa7ebd6 100644
--- a/source/blender/src/editmesh_mods.c
+++ b/source/blender/src/editmesh_mods.c
@@ -625,8 +625,7 @@ static void draw_dm_mapped_face_center(DerivedMesh *dm, EditFace *efa)
static void unified_select_draw(EditVert *eve, EditEdge *eed, EditFace *efa)
{
- int dmNeedsFree;
- DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree);
+ DerivedMesh *dm = editmesh_get_derived_cage();
glDrawBuffer(GL_FRONT);
@@ -714,9 +713,7 @@ static void unified_select_draw(EditVert *eve, EditEdge *eed, EditFace *efa)
/* signal that frontbuf differs from back */
curarea->win_swap= WIN_FRONT_OK;
- if (dmNeedsFree) {
- dm->release(dm);
- }
+ dm->release(dm);
}
@@ -825,18 +822,18 @@ int facegroup_select(short mode)
}
}
} else if (mode==2) { /* same image */
- TFace *tf, *base_tf;
+ MTFace *tf, *base_tf;
- base_tf = (TFace*)CustomData_em_get(&em->fdata, base_efa->data,
- LAYERTYPE_TFACE);
+ base_tf = (MTFace*)CustomData_em_get(&em->fdata, base_efa->data,
+ CD_MTFACE);
if(!base_tf)
return selcount;
for(efa= em->faces.first; efa; efa= efa->next) {
if (!(efa->f & SELECT) && !efa->h) {
- tf = (TFace*)CustomData_em_get(&em->fdata, efa->data,
- LAYERTYPE_TFACE);
+ tf = (MTFace*)CustomData_em_get(&em->fdata, efa->data,
+ CD_MTFACE);
if(base_tf->tpage == tf->tpage) {
EM_select_face(efa, 1);
@@ -1172,14 +1169,14 @@ int vertgroup_select(short mode)
short i, j; /* weight index */
base_dvert= CustomData_em_get(&em->vdata, base_eve->data,
- LAYERTYPE_MDEFORMVERT);
+ CD_MDEFORMVERT);
if (!base_dvert || base_dvert->totweight == 0)
return selcount;
for(eve= em->verts.first; eve; eve= eve->next) {
dvert= CustomData_em_get(&em->vdata, eve->data,
- LAYERTYPE_MDEFORMVERT);
+ CD_MDEFORMVERT);
if (dvert && !(eve->f & SELECT) && !eve->h && dvert->totweight) {
/* do the extra check for selection in the following if, so were not
@@ -2903,7 +2900,7 @@ static void editmesh_calc_selvert_center(float cent_r[3])
}
}
-static int tface_is_selected(TFace *tf)
+static int tface_is_selected(MTFace *tf)
{
return (!(tf->flag & TF_HIDE) && (tf->flag & TF_SELECT));
}
@@ -2921,7 +2918,7 @@ void faceselect_align_view_to_selected(View3D *v3d, Mesh *me, int axis)
norm[0]= norm[1]= norm[2]= 0.0;
for (i=0; i<me->totface; i++) {
MFace *mf= ((MFace*) me->mface) + i;
- TFace *tf= ((TFace*) me->tface) + i;
+ MTFace *tf= ((MTFace*) me->mtface) + i;
if (tface_is_selected(tf)) {
float *v1, *v2, *v3, fno[3];
diff --git a/source/blender/src/editmesh_tools.c b/source/blender/src/editmesh_tools.c
index e0f01d0695d..9ab2bf30874 100644
--- a/source/blender/src/editmesh_tools.c
+++ b/source/blender/src/editmesh_tools.c
@@ -1277,40 +1277,6 @@ static void flipvertarray(EditVert** arr, short size)
}
}
-void interp_uv_vcol(float *v1, float *v2, float *v3, float *v4, float *co, TFace *tf, TFace *outtf, int j)
-{
- char *cp0, *cp1, *cp2, *cp3, *col;
- float *uv, w[4];
- int i, fac;
-
- col = (char*)&outtf->col[j];
- uv = (float*)outtf->uv[j];
-
- InterpWeightsQ3Dfl(v1, v2, v3, v4, co, w);
-
- uv[0]= w[0]*tf->uv[0][0] + w[1]*tf->uv[1][0] + w[2]*tf->uv[2][0];
- uv[1]= w[0]*tf->uv[0][1] + w[1]*tf->uv[1][1] + w[2]*tf->uv[2][1];
-
- if (v4) {
- uv[0] += w[3]*tf->uv[3][0];
- uv[1] += w[3]*tf->uv[3][1];
- }
-
- cp0= (char*)&(tf->col[0]);
- cp1= (char*)&(tf->col[1]);
- cp2= (char*)&(tf->col[2]);
- cp3= (char*)&(tf->col[3]);
-
- for(i=0; i < 4; i++) {
- if (v4)
- fac= (int)(w[0]*cp0[i] + w[1]*cp1[i] + w[2]*cp2[i] + w[3]*cp3[i]);
- else
- fac= (int)(w[0]*cp0[i] + w[1]*cp1[i] + w[2]*cp2[i]);
-
- col[i]= CLAMPIS(fac, 0, 255);
- }
-}
-
static void facecopy(EditFace *source, EditFace *target)
{
EditMesh *em= G.editMesh;
@@ -3245,10 +3211,10 @@ static int compareFaceUV(EditFace *f1, EditFace *f2)
{
EditVert **faceVert1, **faceVert2, *faceVerts1[5], *faceVerts2[5];
int i1, i2;
- TFace *tf1, *tf2;
+ MTFace *tf1, *tf2;
- tf1 = CustomData_em_get(&G.editMesh->fdata, f1->data, LAYERTYPE_TFACE);
- tf2 = CustomData_em_get(&G.editMesh->fdata, f2->data, LAYERTYPE_TFACE);
+ tf1 = CustomData_em_get(&G.editMesh->fdata, f1->data, CD_MTFACE);
+ tf2 = CustomData_em_get(&G.editMesh->fdata, f2->data, CD_MTFACE);
if(tf1 == NULL || tf2 == NULL) return 1;
else if(tf1->tpage == NULL && tf2->tpage == NULL)
@@ -3283,16 +3249,10 @@ static int compareFaceCol(EditFace *f1, EditFace *f2)
{
EditVert **faceVert1, **faceVert2, *faceVerts1[5], *faceVerts2[5];
int i1, i2;
- TFace *tf1, *tf2;
unsigned int *col1, *col2;
- tf1 = CustomData_em_get(&G.editMesh->fdata, f1->data, LAYERTYPE_TFACE);
- tf2 = CustomData_em_get(&G.editMesh->fdata, f2->data, LAYERTYPE_TFACE);
-
- if(tf1) col1 = tf1->col;
- else col1 = CustomData_em_get(&G.editMesh->fdata, f1->data, LAYERTYPE_MCOL);
- if(tf2) col2 = tf2->col;
- else col2 = CustomData_em_get(&G.editMesh->fdata, f2->data, LAYERTYPE_MCOL);
+ col1 = CustomData_em_get(&G.editMesh->fdata, f1->data, CD_MCOL);
+ col2 = CustomData_em_get(&G.editMesh->fdata, f2->data, CD_MCOL);
if(!col1 || !col2) return 1;
@@ -5876,7 +5836,7 @@ static void append_weldedUV(EditFace *efa, EditVert *eve, int tfindex, ListBase
wUV *curwvert, *newwvert;
wUVNode *newnode;
int found;
- TFace *tf = CustomData_em_get(&G.editMesh->fdata, efa->data, LAYERTYPE_TFACE);
+ MTFace *tf = CustomData_em_get(&G.editMesh->fdata, efa->data, CD_MTFACE);
found = 0;
@@ -5922,7 +5882,7 @@ static void append_weldedUVEdge(EditFace *efa, EditEdge *eed, ListBase *uvedges)
{
wUVEdge *curwedge, *newwedge;
int v1tfindex, v2tfindex, found;
- TFace *tf = CustomData_em_get(&G.editMesh->fdata, efa->data, LAYERTYPE_TFACE);
+ MTFace *tf = CustomData_em_get(&G.editMesh->fdata, efa->data, CD_MTFACE);
found = 0;
@@ -6003,7 +5963,7 @@ static void collapse_edgeuvs(void)
int curtag, balanced, collectionfound, vcount;
float avg[2];
- if (!CustomData_has_layer(&G.editMesh->fdata, LAYERTYPE_TFACE))
+ if (!CustomData_has_layer(&G.editMesh->fdata, CD_MTFACE))
return;
uvverts.first = uvverts.last = uvedges.first = uvedges.last = allcollections.first = allcollections.last = NULL;
@@ -6101,11 +6061,11 @@ static void collapse_edgeuvs(void)
static void collapseuvs(void)
{
EditFace *efa;
- TFace *tf;
+ MTFace *tf;
int uvcount;
float uvav[2];
- if (!CustomData_has_layer(&G.editMesh->fdata, LAYERTYPE_TFACE))
+ if (!CustomData_has_layer(&G.editMesh->fdata, CD_MTFACE))
return;
uvcount = 0;
@@ -6113,7 +6073,7 @@ static void collapseuvs(void)
uvav[1] = 0;
for(efa = G.editMesh->faces.first; efa; efa=efa->next){
- tf = CustomData_em_get(&G.editMesh->fdata, efa->data, LAYERTYPE_TFACE);
+ tf = CustomData_em_get(&G.editMesh->fdata, efa->data, CD_MTFACE);
if(efa->v1->f1){
uvav[0] += tf->uv[0][0];
@@ -6142,7 +6102,7 @@ static void collapseuvs(void)
uvav[1] /= uvcount;
for(efa = G.editMesh->faces.first; efa; efa=efa->next){
- tf = CustomData_em_get(&G.editMesh->fdata, efa->data, LAYERTYPE_TFACE);
+ tf = CustomData_em_get(&G.editMesh->fdata, efa->data, CD_MTFACE);
if(efa->v1->f1){
tf->uv[0][0] = uvav[0];
@@ -6213,7 +6173,7 @@ int collapseEdges(void)
VECCOPY(((EditEdge*)curredge->eed)->v2->co,avgcount);
}
- if (CustomData_has_layer(&G.editMesh->fdata, LAYERTYPE_TFACE)) {
+ if (CustomData_has_layer(&G.editMesh->fdata, CD_MTFACE)) {
/*uv collapse*/
for(eve=G.editMesh->verts.first; eve; eve=eve->next) eve->f1 = 0;
for(eed=G.editMesh->edges.first; eed; eed=eed->next) eed->f1 = 0;
@@ -6259,7 +6219,7 @@ int merge_firstlast(int first, int uvmerge)
}
}
- if(uvmerge && CustomData_has_layer(&G.editMesh->fdata, LAYERTYPE_TFACE)){
+ if(uvmerge && CustomData_has_layer(&G.editMesh->fdata, CD_MTFACE)){
for(eve=G.editMesh->verts.first; eve; eve=eve->next) eve->f1 = 0;
for(eve=G.editMesh->verts.first; eve; eve=eve->next){
@@ -6282,7 +6242,7 @@ int merge_target(int target, int uvmerge)
if(target) snap_sel_to_curs();
else snap_to_center();
- if(uvmerge && CustomData_has_layer(&G.editMesh->fdata, LAYERTYPE_TFACE)){
+ if(uvmerge && CustomData_has_layer(&G.editMesh->fdata, CD_MTFACE)){
for(eve=G.editMesh->verts.first; eve; eve=eve->next) eve->f1 = 0;
for(eve=G.editMesh->verts.first; eve; eve=eve->next){
if(eve->f&SELECT) eve->f1 = 1;
diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c
index 4195efc000c..4d6162d5483 100644
--- a/source/blender/src/editobject.c
+++ b/source/blender/src/editobject.c
@@ -371,7 +371,7 @@ static int return_editmesh_vgroup(char *name, float *cent)
/* find the vertices */
for(eve= em->verts.first; eve; eve= eve->next) {
- dvert= CustomData_em_get(&em->vdata, eve->data, LAYERTYPE_MDEFORMVERT);
+ dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
if(dvert) {
for(i=0; i<dvert->totweight; i++){
@@ -2139,14 +2139,14 @@ void special_editmenu(void)
}
else if(G.f & G_FACESELECT) {
Mesh *me= get_mesh(ob);
- TFace *tface;
+ MTFace *tface;
int a;
- if(me==0 || me->tface==0) return;
+ if(me==0 || me->mtface==0) return;
nr= pupmenu("Specials%t|Set Tex%x1| Shared%x2| Light%x3| Invisible%x4| Collision%x5| TwoSide%x6|Clr Tex%x7| Shared%x8| Light%x9| Invisible%x10| Collision%x11| TwoSide%x12");
- for(a=me->totface, tface= me->tface; a>0; a--, tface++) {
+ for(a=me->totface, tface= me->mtface; a>0; a--, tface++) {
if(tface->flag & SELECT) {
switch(nr) {
case 1:
@@ -2186,17 +2186,14 @@ void special_editmenu(void)
else if(G.f & G_VERTEXPAINT) {
Mesh *me= get_mesh(ob);
- if(me==0 || (me->mcol==NULL && me->tface==NULL) ) return;
+ if(me==0 || (me->mcol==NULL && me->mtface==NULL) ) return;
nr= pupmenu("Specials%t|Shared VertexCol%x1");
if(nr==1) {
- if(me->tface) tface_to_mcol(me);
-
copy_vpaint_undo( (unsigned int *)me->mcol, me->totface);
do_shared_vertexcol(me);
- if(me->tface) mcol_to_tface(me, 1);
BIF_undo_push("Shared VertexCol");
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
@@ -2489,7 +2486,7 @@ static void curvetomesh(Object *ob)
void convertmenu(void)
{
- Base *base, *basen, *basact, *basedel=NULL;
+ Base *base, *basen=NULL, *basact, *basedel=NULL;
Object *obact, *ob, *ob1;
Curve *cu;
Nurb *nu;
@@ -2548,7 +2545,6 @@ void convertmenu(void)
if(ob->flag & OB_DONE);
else if(ob->type==OB_MESH && ob->modifiers.first) { /* converting a mesh with no modifiers causes a segfault */
DerivedMesh *dm;
- int needsfree=0;
basedel = base;
@@ -2574,12 +2570,12 @@ void convertmenu(void)
G.totmesh++;
/* make new mesh data from the original copy */
- dm= mesh_get_derived_final(ob1, &needsfree);
+ dm= mesh_get_derived_final(ob1);
/* 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);
- if(needsfree) dm->release(dm);
+ dm->release(dm);
object_free_modifiers(ob1); /* after derivedmesh calls! */
/* If the original object is active then make this object active */
@@ -3263,13 +3259,15 @@ void copy_attr_tface(short event)
/* Face Select Mode */
Object *ob= OBACT;
Mesh *me= get_mesh(ob);
- TFace *tface;
- TFace *activetf= get_active_tface();
+ MTFace *tface;
+ MCol *activemcol;
+ MTFace *activetf= get_active_tface(&activemcol);
int a;
if(activetf==NULL) return;
- for(a=me->totface, tface= me->tface; a>0; a--, tface++) {
+ tface= me->mtface;
+ for(a=0; a<me->totface; a++, tface++) {
if(tface->flag & SELECT) {
switch(event) {
case 1:
@@ -3280,7 +3278,8 @@ void copy_attr_tface(short event)
case 2:
memcpy(tface->uv, activetf->uv, sizeof(tface->uv)); break;
case 3:
- memcpy(tface->col, activetf->col, sizeof(tface->col)); break;
+ if(activemcol)
+ memcpy(&me->mcol[a], activemcol, sizeof(MCol)*3); break;
case 4:
tface->mode = activetf->mode; break;
case 5:
diff --git a/source/blender/src/editsima.c b/source/blender/src/editsima.c
index 2a7df196bf0..46cdcad75db 100644
--- a/source/blender/src/editsima.c
+++ b/source/blender/src/editsima.c
@@ -102,7 +102,7 @@
/* local prototypes */
void clever_numbuts_sima(void);
-void sel_uvco_inside_radius(short , TFace *, int , float *, float *, short);
+void sel_uvco_inside_radius(short , MTFace *, int , float *, float *, short);
void uvedit_selectionCB(short , Object *, short *, float ); /* used in edit.c*/
void object_uvs_changed(Object *ob)
@@ -128,7 +128,7 @@ int is_uv_tface_editing_allowed_silent(void)
if(G.sima->mode!=SI_TEXTURE) return 0;
if(!(G.f & G_FACESELECT)) return 0;
me= get_mesh(OBACT);
- if(me==0 || me->tface==0) return 0;
+ if(me==0 || me->mtface==0) return 0;
return 1;
}
@@ -169,7 +169,7 @@ void clever_numbuts_sima(void)
for (i=0; i<me->totface; i++) {
MFace *mf= &((MFace*) me->mface)[i];
- TFace *tf= &((TFace*) me->tface)[i];
+ MTFace *tf= &((MTFace*) me->mtface)[i];
if (!(tf->flag & TF_SELECT))
continue;
@@ -213,7 +213,7 @@ void clever_numbuts_sima(void)
for (i=0; i<me->totface; i++) {
MFace *mf= &((MFace*) me->mface)[i];
- TFace *tf= &((TFace*) me->tface)[i];
+ MTFace *tf= &((MTFace*) me->mtface)[i];
if (!(tf->flag & TF_SELECT))
continue;
@@ -243,13 +243,13 @@ void clever_numbuts_sima(void)
void be_square_tface_uv(Mesh *me)
{
- TFace *tface;
+ MTFace *tface;
MFace *mface;
int a;
/* if 1 vertex selected: doit (with the selected vertex) */
mface= (MFace*)me->mface;
- tface= (TFace*)me->tface;
+ tface= (MTFace*)me->mtface;
for(a=me->totface; a>0; a--, tface++, mface++) {
if(mface->v4) {
if(tface->flag & TF_SELECT) {
@@ -349,7 +349,7 @@ void mirrormenu_tface_uv(void)
void weld_align_tface_uv(char tool)
{
MFace *mface;
- TFace *tface;
+ MTFace *tface;
Mesh *me;
float min[2], max[2], cent[2];
int a;
@@ -364,7 +364,7 @@ void weld_align_tface_uv(char tool)
cent[1]= (min[1]+max[1])/2.0;
if(tool == 'x' || tool == 'w') {
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
for(a=me->totface; a>0; a--, tface++, mface++) {
if(tface->flag & TF_SELECT) {
@@ -381,7 +381,7 @@ void weld_align_tface_uv(char tool)
}
if(tool == 'y' || tool == 'w') {
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
for(a=me->totface; a>0; a--, tface++, mface++) {
if(tface->flag & TF_SELECT) {
@@ -421,14 +421,14 @@ void weld_align_menu_tface_uv(void)
void select_swap_tface_uv(void)
{
Mesh *me;
- TFace *tface;
+ MTFace *tface;
MFace *mface;
int a, sel=0;
if( is_uv_tface_editing_allowed()==0 ) return;
me= get_mesh(OBACT);
- for(a=me->totface, tface= me->tface; a>0; a--, tface++) {
+ for(a=me->totface, tface= me->mtface; a>0; a--, tface++) {
if(tface->flag & TF_SELECT) {
if(tface->flag & (TF_SEL1+TF_SEL2+TF_SEL3+TF_SEL4)) {
sel= 1;
@@ -438,7 +438,7 @@ void select_swap_tface_uv(void)
}
mface= me->mface;
- for(a=me->totface, tface= me->tface; a>0; a--, tface++, mface++) {
+ for(a=me->totface, tface= me->mtface; a>0; a--, tface++, mface++) {
if(tface->flag & TF_SELECT) {
if(mface->v4) {
if(sel) tface->flag &= ~(TF_SEL1+TF_SEL2+TF_SEL3+TF_SEL4);
@@ -472,10 +472,10 @@ static int msel_hit(float *limit, unsigned int *hitarray, unsigned int vertexid,
return 0;
}
-static void find_nearest_tface(TFace **nearesttf, MFace **nearestmf)
+static void find_nearest_tface(MTFace **nearesttf, MFace **nearestmf)
{
Mesh *me;
- TFace *tf;
+ MTFace *tf;
MFace *mf;
int a, i, nverts, mindist, dist, fcenter[2], uval[2];
short mval[2];
@@ -488,7 +488,7 @@ static void find_nearest_tface(TFace **nearesttf, MFace **nearestmf)
me= get_mesh(OBACT);
mf= (MFace*)me->mface;
- tf= (TFace*)me->tface;
+ tf= (MTFace*)me->mtface;
for(a=me->totface; a>0; a--, tf++, mf++) {
if(tf->flag & TF_SELECT) {
@@ -514,7 +514,7 @@ static void find_nearest_tface(TFace **nearesttf, MFace **nearestmf)
}
}
-static int nearest_uv_between(TFace *tf, int nverts, int id, short *mval, int *uval)
+static int nearest_uv_between(MTFace *tf, int nverts, int id, short *mval, int *uval)
{
float m[3], v1[3], v2[3], c1, c2;
int id1, id2;
@@ -541,10 +541,10 @@ static int nearest_uv_between(TFace *tf, int nverts, int id, short *mval, int *u
return (c1*c2 >= 0.0f);
}
-static void find_nearest_uv(TFace **nearesttf, unsigned int *nearestv, int *nearestuv)
+static void find_nearest_uv(MTFace **nearesttf, unsigned int *nearestv, int *nearestuv)
{
Mesh *me;
- TFace *tf;
+ MTFace *tf;
MFace *mf;
int a, i, nverts, mindist, dist, uval[2];
short mval[2];
@@ -556,7 +556,7 @@ static void find_nearest_uv(TFace **nearesttf, unsigned int *nearestv, int *near
me= get_mesh(OBACT);
mf= (MFace*)me->mface;
- tf= (TFace*)me->tface;
+ tf= (MTFace*)me->mtface;
for(a=me->totface; a>0; a--, tf++, mf++) {
if(tf->flag & TF_SELECT) {
@@ -592,7 +592,7 @@ static void find_nearest_uv(TFace **nearesttf, unsigned int *nearestv, int *near
void mouse_select_sima(void)
{
Mesh *me;
- TFace *tf, *nearesttf;
+ MTFace *tf, *nearesttf;
MFace *mf, *nearestmf=NULL;
int a, selectsticky, sticky, actface, nearestuv, i;
unsigned int hitv[4], nearestv;
@@ -670,7 +670,7 @@ void mouse_select_sima(void)
/* (de)select sticky uv nodes */
if(sticky || actface) {
mf= (MFace*)me->mface;
- tf= (TFace*)me->tface;
+ tf= (MTFace*)me->mtface;
/* deselect */
if(selectsticky==0) {
for(a=me->totface; a>0; a--, tf++, mf++) {
@@ -714,7 +714,7 @@ void mouse_select_sima(void)
/* select face and deselect other faces */
if(actface) {
mf= (MFace*)me->mface;
- tf= (TFace*)me->tface;
+ tf= (MTFace*)me->mtface;
for(a=me->totface; a>0; a--, tf++, mf++) {
tf->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
if(nearesttf && tf!=nearesttf)
@@ -726,7 +726,7 @@ void mouse_select_sima(void)
/* deselect uvs, and select sticky uvs */
mf= (MFace*)me->mface;
- tf= (TFace*)me->tface;
+ tf= (MTFace*)me->mtface;
for(a=me->totface; a>0; a--, tf++, mf++) {
if(tf->flag & TF_SELECT) {
if(!actface) tf->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
@@ -757,7 +757,7 @@ void mouse_select_sima(void)
void borderselect_sima(short whichuvs)
{
Mesh *me;
- TFace *tface;
+ MTFace *tface;
MFace *mface;
rcti rect;
rctf rectf;
@@ -778,7 +778,7 @@ void borderselect_sima(short whichuvs)
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmax, &rectf.ymax);
mface= me->mface;
- for(a=me->totface, tface= me->tface; a>0; a--, tface++, mface++) {
+ for(a=me->totface, tface= me->mtface; a>0; a--, tface++, mface++) {
if(tface->flag & TF_SELECT) {
@@ -839,7 +839,7 @@ void borderselect_sima(short whichuvs)
* Just for readability...
*/
-void sel_uvco_inside_radius(short sel, TFace *tface, int index, float *offset, float *ell, short select_mask)
+void sel_uvco_inside_radius(short sel, MTFace *tface, int index, float *offset, float *ell, short select_mask)
{
// normalized ellipse: ell[0] = scaleX,
// [1] = scaleY
@@ -884,7 +884,7 @@ void uvedit_selectionCB(short selecting, Object *editobj, short *mval, float rad
float offset[2];
Mesh *me;
MFace *mface;
- TFace *tface;
+ MTFace *tface;
int i;
float ellipse[2]; // we need to deal with ellipses, as
@@ -900,7 +900,7 @@ void uvedit_selectionCB(short selecting, Object *editobj, short *mval, float rad
areamouseco_to_ipoco(G.v2d, mval, &offset[0], &offset[1]);
mface= me->mface;
- tface= me->tface;
+ tface= me->mtface;
if (selecting) {
for(i = 0; i < me->totface; i++) {
@@ -973,7 +973,7 @@ void mouseco_to_curtile(void)
void hide_tface_uv(int swap)
{
Mesh *me;
- TFace *tface;
+ MTFace *tface;
MFace *mface;
int a;
@@ -982,7 +982,7 @@ void hide_tface_uv(int swap)
if(swap) {
mface= me->mface;
- for(a=me->totface, tface= me->tface; a>0; a--, tface++, mface++) {
+ for(a=me->totface, tface= me->mtface; a>0; a--, tface++, mface++) {
if(tface->flag & TF_SELECT) {
if((tface->flag & (TF_SEL1|TF_SEL2|TF_SEL3))==0) {
if(!mface->v4)
@@ -994,7 +994,7 @@ void hide_tface_uv(int swap)
}
} else {
mface= me->mface;
- for(a=me->totface, tface= me->tface; a>0; a--, tface++, mface++) {
+ for(a=me->totface, tface= me->mtface; a>0; a--, tface++, mface++) {
if(tface->flag & TF_SELECT) {
if(tface->flag & (TF_SEL1|TF_SEL2|TF_SEL3))
tface->flag &= ~TF_SELECT;
@@ -1012,7 +1012,7 @@ void hide_tface_uv(int swap)
void reveal_tface_uv(void)
{
Mesh *me;
- TFace *tface;
+ MTFace *tface;
MFace *mface;
int a;
@@ -1020,7 +1020,7 @@ void reveal_tface_uv(void)
me= get_mesh(OBACT);
mface= me->mface;
- for(a=me->totface, tface= me->tface; a>0; a--, tface++, mface++)
+ for(a=me->totface, tface= me->mtface; a>0; a--, tface++, mface++)
if(!(tface->flag & TF_HIDE))
if(!(tface->flag & TF_SELECT))
tface->flag |= (TF_SELECT|TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
@@ -1033,7 +1033,7 @@ void reveal_tface_uv(void)
void stitch_uv_tface(int mode)
{
Mesh *me;
- TFace *tf;
+ MTFace *tf;
int a, vtot;
float newuv[2], limit[2];
UvMapVert *vlist, *iterv, *v;
@@ -1058,7 +1058,7 @@ void stitch_uv_tface(int mode)
limit[0]= limit[1]= limit[0]/256.0;
me= get_mesh(OBACT);
- tf= me->tface;
+ tf= me->mtface;
vmap= make_uv_vert_map(me->mface, tf, me->totface, me->totvert, 1, limit);
if(vmap == NULL)
@@ -1142,7 +1142,7 @@ void select_linked_tface_uv(int mode)
{
Mesh *me;
MFace *mf;
- TFace *tf, *nearesttf=NULL;
+ MTFace *tf, *nearesttf=NULL;
UvVertMap *vmap;
UvMapVert *vlist, *iterv, *startv;
unsigned int *stack, stacksize= 0, nearestv;
@@ -1166,7 +1166,7 @@ void select_linked_tface_uv(int mode)
}
get_connected_limit_tface_uv(limit);
- vmap= make_uv_vert_map(me->mface, me->tface, me->totface, me->totvert, 1, limit);
+ vmap= make_uv_vert_map(me->mface, me->mtface, me->totface, me->totvert, 1, limit);
if(vmap == NULL)
return;
@@ -1174,7 +1174,7 @@ void select_linked_tface_uv(int mode)
flag= MEM_callocN(sizeof(*flag)*me->totface, "UvLinkFlag");
if (mode == 2) {
- tf= me->tface;
+ tf= me->mtface;
for(a=0; a<me->totface; a++, tf++)
if(!(tf->flag & TF_HIDE) && (tf->flag & TF_SELECT))
if(tf->flag & (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4)) {
@@ -1184,7 +1184,7 @@ void select_linked_tface_uv(int mode)
}
}
else {
- tf= me->tface;
+ tf= me->mtface;
for(a=0; a<me->totface; a++, tf++)
if(tf == nearesttf) {
stack[stacksize]= a;
@@ -1198,7 +1198,7 @@ void select_linked_tface_uv(int mode)
stacksize--;
a= stack[stacksize];
mf= me->mface+a;
- tf= me->tface+a;
+ tf= me->mtface+a;
nverts= mf->v4? 4: 3;
@@ -1226,7 +1226,7 @@ void select_linked_tface_uv(int mode)
}
if(mode==0 || mode==2) {
- for(a=0, tf=me->tface; a<me->totface; a++, tf++)
+ for(a=0, tf=me->mtface; a<me->totface; a++, tf++)
if(flag[a])
tf->flag |= (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
else
@@ -1234,7 +1234,7 @@ void select_linked_tface_uv(int mode)
}
else if(mode==1) {
mf= me->mface;
- for(a=0, tf=me->tface; a<me->totface; a++, tf++, mf++) {
+ for(a=0, tf=me->mtface; a<me->totface; a++, tf++, mf++) {
if(flag[a]) {
if (mf->v4) {
if((tf->flag & (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4)))
@@ -1246,12 +1246,12 @@ void select_linked_tface_uv(int mode)
}
if (a<me->totface) {
- for(a=0, tf=me->tface; a<me->totface; a++, tf++)
+ for(a=0, tf=me->mtface; a<me->totface; a++, tf++)
if(flag[a])
tf->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
}
else {
- for(a=0, tf=me->tface; a<me->totface; a++, tf++)
+ for(a=0, tf=me->mtface; a<me->totface; a++, tf++)
if(flag[a])
tf->flag |= (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
}
@@ -1268,7 +1268,7 @@ void select_linked_tface_uv(int mode)
void unlink_selection(void)
{
Mesh *me;
- TFace *tface;
+ MTFace *tface;
MFace *mface;
int a;
@@ -1276,7 +1276,7 @@ void unlink_selection(void)
me= get_mesh(OBACT);
mface= me->mface;
- for(a=me->totface, tface= me->tface; a>0; a--, tface++, mface++) {
+ for(a=me->totface, tface= me->mtface; a>0; a--, tface++, mface++) {
if(tface->flag & TF_SELECT) {
if(mface->v4) {
if(~tface->flag & (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4))
@@ -1318,7 +1318,7 @@ void toggle_uv_select(int mode)
void pin_tface_uv(int mode)
{
Mesh *me;
- TFace *tface;
+ MTFace *tface;
MFace *mface;
int a;
@@ -1326,7 +1326,7 @@ void pin_tface_uv(int mode)
me= get_mesh(OBACT);
mface= me->mface;
- tface= me->tface;
+ tface= me->mtface;
for(a=me->totface; a>0; a--, tface++, mface++) {
if(tface->flag & TF_SELECT) {
if(mode ==1){
@@ -1353,7 +1353,7 @@ void pin_tface_uv(int mode)
void select_pinned_tface_uv(void)
{
Mesh *me;
- TFace *tface;
+ MTFace *tface;
MFace *mface;
int a;
@@ -1361,7 +1361,7 @@ void select_pinned_tface_uv(void)
me= get_mesh(OBACT);
mface= me->mface;
- tface= me->tface;
+ tface= me->mtface;
for(a=me->totface; a>0; a--, tface++, mface++) {
if(tface->flag & TF_SELECT) {
@@ -1382,7 +1382,7 @@ void select_pinned_tface_uv(void)
int minmax_tface_uv(float *min, float *max)
{
Mesh *me;
- TFace *tf;
+ MTFace *tf;
MFace *mf;
int a, sel;
@@ -1393,7 +1393,7 @@ int minmax_tface_uv(float *min, float *max)
sel= 0;
mf= (MFace*)me->mface;
- tf= (TFace*)me->tface;
+ tf= (MTFace*)me->mtface;
for(a=me->totface; a>0; a--, tf++, mf++) {
if(tf->flag & TF_HIDE);
else if(tf->flag & TF_SELECT) {
@@ -1547,7 +1547,7 @@ static void load_image_filesel(char *str) /* called from fileselect */
static void image_replace(Image *old, Image *new)
{
- TFace *tface;
+ MTFace *tface;
Mesh *me;
int a, rep=0;
@@ -1560,8 +1560,8 @@ static void image_replace(Image *old, Image *new)
me= G.main->mesh.first;
while(me) {
- if(me->tface) {
- tface= me->tface;
+ if(me->mtface) {
+ tface= me->mtface;
a= me->totface;
while(a--) {
if(tface->tpage==old) {
diff --git a/source/blender/src/editview.c b/source/blender/src/editview.c
index 2fa409b18f2..69e833442c1 100644
--- a/source/blender/src/editview.c
+++ b/source/blender/src/editview.c
@@ -52,6 +52,7 @@
#include "DNA_lattice_types.h"
#include "DNA_meta_types.h"
#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
@@ -162,7 +163,7 @@ void EM_backbuf_checkAndSelectFaces(EditMesh *em, int select)
void EM_backbuf_checkAndSelectTFaces(Mesh *me, int select)
{
- TFace *tface = me->tface;
+ MTFace *tface = me->mtface;
int a;
if (tface) {
@@ -538,7 +539,7 @@ static void do_lasso_select_facemode(short mcords[][2], short moves, short selec
rcti rect;
me= get_mesh(OBACT);
- if(me==NULL || me->tface==NULL) return;
+ if(me==NULL || me->mtface==NULL) return;
if(me->totface==0) return;
em_vertoffs= me->totface+1; /* max index array */
diff --git a/source/blender/src/filesel.c b/source/blender/src/filesel.c
index 0e76083c08e..7c646a94031 100644
--- a/source/blender/src/filesel.c
+++ b/source/blender/src/filesel.c
@@ -64,6 +64,7 @@
#include "DNA_ipo_types.h"
#include "DNA_material_types.h"
#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_texture_types.h"
#include "DNA_space_types.h"
@@ -1709,13 +1710,13 @@ static void replace_image(ID *oldblock, ID *newblock) {
}
for (me= G.main->mesh.first; me; me= me->id.next) {
- TFace *tfaces= me->tface;
+ MTFace *tfaces= me->mtface;
if (tfaces) {
int i;
for (i=0; i<me->totface; i++) {
- TFace *tf= &tfaces[i];
+ MTFace *tf= &tfaces[i];
if (tf->tpage == oldima) {
/* not change_id_link, tpage's aren't owners :(
diff --git a/source/blender/src/fluidsim.c b/source/blender/src/fluidsim.c
index 712548387b3..c1ec6eaee33 100644
--- a/source/blender/src/fluidsim.c
+++ b/source/blender/src/fluidsim.c
@@ -60,6 +60,7 @@
#include "BLI_arithb.h"
#include "MTC_matrixops.h"
+#include "BKE_customdata.h"
#include "BKE_displist.h"
#include "BKE_effect.h"
#include "BKE_global.h"
@@ -217,54 +218,52 @@ FluidsimSettings *fluidsimSettingsNew(struct Object *srcob)
}
/* duplicate struct, analogous to free */
+static Mesh *fluidsimCopyMesh(Mesh *me)
+{
+ Mesh *dup = MEM_dupallocN(me);
+
+ CustomData_copy(&me->vdata, &dup->vdata, CD_MASK_MESH, CD_DUPLICATE, me->totvert);
+ CustomData_copy(&me->vdata, &dup->vdata, CD_MASK_MESH, CD_DUPLICATE, me->totvert);
+ CustomData_copy(&me->vdata, &dup->vdata, CD_MASK_MESH, CD_DUPLICATE, me->totvert);
+
+ return dup;
+}
+
FluidsimSettings* fluidsimSettingsCopy(FluidsimSettings *fss)
{
FluidsimSettings *dupfss;
- Mesh *dupFsMesh = NULL;
if(!fss) return NULL;
dupfss = MEM_dupallocN(fss);
- dupFsMesh = fss->meshSurface;
- if(dupFsMesh) {
- dupfss->meshSurface = MEM_dupallocN(dupFsMesh);
- if(dupFsMesh->mvert) dupfss->meshSurface->mvert = MEM_dupallocN(dupFsMesh->mvert);
- if(dupFsMesh->medge) dupfss->meshSurface->medge = MEM_dupallocN(dupFsMesh->medge);
- if(dupFsMesh->mface) dupfss->meshSurface->mface = MEM_dupallocN(dupFsMesh->mface);
- }
-
- dupFsMesh = fss->meshBB;
- if(dupFsMesh) {
- dupfss->meshBB = MEM_dupallocN(dupFsMesh);
- if(dupFsMesh->mvert) dupfss->meshBB->mvert = MEM_dupallocN(dupFsMesh->mvert);
- if(dupFsMesh->medge) dupfss->meshBB->medge = MEM_dupallocN(dupFsMesh->medge);
- if(dupFsMesh->mface) dupfss->meshBB->mface = MEM_dupallocN(dupFsMesh->mface);
- }
+ if(fss->meshSurface)
+ dupfss->meshSurface = fluidsimCopyMesh(fss->meshSurface);
+ if(fss->meshBB)
+ dupfss->meshBB = fluidsimCopyMesh(fss->meshBB);
if(fss->meshSurfNormals) dupfss->meshSurfNormals = MEM_dupallocN(fss->meshSurfNormals);
return dupfss;
}
-
/* free struct */
+static void fluidsimFreeMesh(Mesh *me)
+{
+ CustomData_free(&me->vdata, me->totvert);
+ CustomData_free(&me->edata, me->totedge);
+ CustomData_free(&me->fdata, me->totface);
+
+ MEM_freeN(me);
+}
+
void fluidsimSettingsFree(FluidsimSettings *fss)
{
- Mesh *freeFsMesh = fss->meshSurface;
- if(freeFsMesh) {
- if(freeFsMesh->mvert){ MEM_freeN(freeFsMesh->mvert); freeFsMesh->mvert=NULL; }
- if(freeFsMesh->medge){ MEM_freeN(freeFsMesh->medge); freeFsMesh->medge=NULL; }
- if(freeFsMesh->mface){ MEM_freeN(freeFsMesh->mface); freeFsMesh->mface=NULL; }
- MEM_freeN(freeFsMesh);
+ if(fss->meshSurface) {
+ fluidsimFreeMesh(fss->meshSurface);
fss->meshSurface = NULL;
}
-
- freeFsMesh = fss->meshBB;
- if(freeFsMesh) { // same as before...
- if(freeFsMesh->mvert){ MEM_freeN(freeFsMesh->mvert); freeFsMesh->mvert=NULL; }
- if(freeFsMesh->medge){ MEM_freeN(freeFsMesh->medge); freeFsMesh->medge=NULL; }
- if(freeFsMesh->mface){ MEM_freeN(freeFsMesh->mface); freeFsMesh->mface=NULL; }
- MEM_freeN(freeFsMesh);
+ if(fss->meshBB) {
+ fluidsimFreeMesh(fss->meshBB);
fss->meshBB = NULL;
}
diff --git a/source/blender/src/header_view3d.c b/source/blender/src/header_view3d.c
index 18bd611ba4e..b282e861ec7 100644
--- a/source/blender/src/header_view3d.c
+++ b/source/blender/src/header_view3d.c
@@ -302,7 +302,7 @@ static void do_view3d_view_alignviewmenu(void *arg, int event)
if (obact && obact->type==OB_MESH) {
Mesh *me= obact->data;
- if (me->tface) {
+ if (me->mtface) {
faceselect_align_view_to_selected(v3d, me, event);
addqueue(v3d->area->win, REDRAW, 1);
}
@@ -3971,7 +3971,7 @@ uiBlock *view3d_sculptmenu(void *arg_unused_so_why_have_it/*?*/)
static void do_view3d_facesel_propertiesmenu(void *arg, int event)
{
- TFace *tf = get_active_tface();
+ MTFace *tf = get_active_tface(NULL);
if (tf) {
switch(event) {
@@ -4028,7 +4028,7 @@ static void do_view3d_facesel_propertiesmenu(void *arg, int event)
static uiBlock *view3d_facesel_propertiesmenu(void *arg_unused)
{
- TFace *tf = get_active_tface();
+ MTFace *tf = get_active_tface(NULL);
uiBlock *block;
short yco = 20, menuwidth = 120;
@@ -4129,7 +4129,8 @@ static void do_view3d_faceselmenu(void *arg, int event)
/* code copied from buttons.c :(
would be nice if it was split up into functions */
Mesh *me;
- TFace *tf, *activetf;
+ MTFace *tf, *activetf;
+ MCol *activemcol;
int a;
switch(event) {
@@ -4137,10 +4138,10 @@ static void do_view3d_faceselmenu(void *arg, int event)
case 1: /* copy UVs */
case 2: /* copy vertex colors */
me= get_mesh(OBACT);
- activetf = get_active_tface();
+ activetf = get_active_tface(&activemcol);
if (me && activetf) {
- for (a=0, tf=me->tface; a < me->totface; a++, tf++) {
+ for (a=0, tf=me->mtface; a < me->totface; a++, tf++) {
if(tf!=activetf && (tf->flag & TF_SELECT)) {
if(event==0) {
tf->mode= activetf->mode;
@@ -4153,8 +4154,9 @@ static void do_view3d_faceselmenu(void *arg, int event)
if(activetf->mode & TF_TILES) tf->mode |= TF_TILES;
else tf->mode &= ~TF_TILES;
- } else if(event==2)
- memcpy(tf->col, activetf->col, sizeof(tf->col));
+ }
+ else if(event==2 && activemcol)
+ memcpy(&me->mcol[a], activemcol, sizeof(MCol)*4);
}
}
diff --git a/source/blender/src/imagepaint.c b/source/blender/src/imagepaint.c
index a6b5f1654ef..0cb8c2feb66 100644
--- a/source/blender/src/imagepaint.c
+++ b/source/blender/src/imagepaint.c
@@ -546,7 +546,7 @@ static void imapaint_paint_stroke(ImagePaintState *s, BrushPainter *painter, sho
/* pick face and image */
if (facesel_face_pick(s->me, mval, &newfaceindex, 0)) {
- newimage = (Image*)((s->me->tface+newfaceindex)->tpage);
+ newimage = (Image*)((s->me->mtface+newfaceindex)->tpage);
texpaint_pick_uv(s->ob, s->me, newfaceindex, mval, newuv);
}
else
diff --git a/source/blender/src/meshtools.c b/source/blender/src/meshtools.c
index 91ad9e1a5fb..e8fd8d947c9 100644
--- a/source/blender/src/meshtools.c
+++ b/source/blender/src/meshtools.c
@@ -66,6 +66,7 @@ void sort_faces(void);
#include "BLI_arithb.h"
#include "BKE_depsgraph.h"
+#include "BKE_customdata.h"
#include "BKE_global.h"
#include "BKE_library.h"
#include "BKE_main.h"
@@ -99,27 +100,6 @@ void sort_faces(void);
/* * ********************** no editmode!!! *********** */
-
-/** tests whether selected mesh objects have tfaces */
-static int testSelected_TfaceMesh(void)
-{
- Base *base;
- Mesh *me;
-
- base = FIRSTBASE;
- while (base) {
- if TESTBASE(base) {
- if(base->object->type==OB_MESH) {
- me= base->object->data;
- if (me->tface)
- return 1;
- }
- }
- base= base->next;
- }
- return 0;
-}
-
/* join selected meshes into the active mesh, context sensitive
return 0 if no join is made (error) and 1 of the join is done */
int join_mesh(void)
@@ -131,14 +111,13 @@ int join_mesh(void)
MVert *mvert, *mvertmain;
MEdge *medge = NULL, *medgemain;
MFace *mface = NULL, *mfacemain;
- TFace *tface = NULL, *tfacemain;
- unsigned int *mcol=NULL, *mcolmain;
float imat[4][4], cmat[4][4];
int a, b, totcol, totedge=0, totvert=0, totface=0, ok=0, vertofs, map[MAXMAT];
- int i, j, index, haskey=0, hasdefgroup=0;
+ int i, j, index, haskey=0, edgeofs, faceofs;
bDeformGroup *dg, *odg;
- MDeformVert *dvert, *dvertmain;
-
+ MDeformVert *dvert;
+ CustomData vdata, edata, fdata;
+
if(G.obedit) return 0;
ob= OBACT;
@@ -225,8 +204,6 @@ int join_mesh(void)
// Join this object's vertex groups to the base one's
for (dg=base->object->defbase.first; dg; dg=dg->next){
- hasdefgroup= 1;
-
/* See if this group exists in the object */
for (odg=ob->defbase.first; odg; odg=odg->next){
if (!strcmp(odg->name, dg->name)){
@@ -266,32 +243,22 @@ int join_mesh(void)
}
me= ob->data;
- mvert= mvertmain= MEM_mallocN(totvert*sizeof(MVert), "joinmesh vert");
- if(totedge) medge= medgemain= MEM_callocN(totedge*sizeof(MEdge), "joinmesh edge");
- else medgemain= NULL;
+ memset(&vdata, 0, sizeof(vdata));
+ memset(&edata, 0, sizeof(edata));
+ memset(&fdata, 0, sizeof(fdata));
- if (totface) mface= mfacemain= MEM_mallocN(totface*sizeof(MFace), "joinmesh face");
- else mfacemain= NULL;
-
- if(me->mcol) mcol= mcolmain= MEM_callocN(totface*4*sizeof(int), "joinmesh mcol");
- else mcolmain= NULL;
+ mvertmain= mvert= CustomData_add_layer(&vdata, CD_MVERT, 0, NULL, totvert);
+ medgemain= medge= CustomData_add_layer(&edata, CD_MEDGE, 0, NULL, totedge);
+ mfacemain= mface= CustomData_add_layer(&fdata, CD_MFACE, 0, NULL, totface);
- /* if active object doesn't have Tfaces, but one in the selection does,
- make TFaces for active, so we don't lose texture information in the
- join process */
- if(me->tface || testSelected_TfaceMesh()) tface= tfacemain= MEM_callocN(totface*4*sizeof(TFace), "joinmesh4");
- else tfacemain= NULL;
- if(me->dvert || hasdefgroup)
- dvert= dvertmain= MEM_callocN(totvert*sizeof(MDeformVert), "joinmesh5");
- else dvert=dvertmain= NULL;
-
- vertofs= 0;
-
/* inverse transorm all selected meshes in this object */
Mat4Invert(imat, ob->obmat);
+ vertofs= 0;
+ edgeofs= 0;
+ faceofs= 0;
base= FIRSTBASE;
while(base) {
nextb= base->next;
@@ -301,13 +268,13 @@ int join_mesh(void)
me= base->object->data;
if(me->totvert) {
+ CustomData_merge(&me->fdata, &fdata, CD_MASK_MESH, CD_DEFAULT, totface);
+ CustomData_copy_data(&me->vdata, &vdata, 0, vertofs, me->totvert);
- memcpy(mvert, me->mvert, me->totvert*sizeof(MVert));
-
- copy_dverts(dvert, me->dvert, me->totvert);
+ dvert= CustomData_get(&vdata, vertofs, CD_MDEFORMVERT);
/* NEW VERSION */
- if (dvertmain){
+ if (dvert){
for (i=0; i<me->totvert; i++){
for (j=0; j<dvert[i].totweight; j++){
// Find the old vertex group
@@ -323,7 +290,6 @@ int join_mesh(void)
}
}
}
- dvert+=me->totvert;
}
if(base->object != ob) {
@@ -337,11 +303,6 @@ int join_mesh(void)
}
}
else mvert+= me->totvert;
-
- if(mcolmain) {
- if(me->mcol) memcpy(mcol, me->mcol, me->totface*4*4);
- mcol+= 4*me->totface;
- }
}
if(me->totface) {
@@ -359,50 +320,37 @@ int join_mesh(void)
}
}
- memcpy(mface, me->mface, me->totface*sizeof(MFace));
-
- a= me->totface;
- while(a--) {
+ CustomData_merge(&me->fdata, &fdata, CD_MASK_MESH, CD_DEFAULT, totface);
+ CustomData_copy_data(&me->fdata, &fdata, 0, vertofs, me->totface);
+
+ for(a=0; a<me->totface; a++, mface++) {
mface->v1+= vertofs;
mface->v2+= vertofs;
mface->v3+= vertofs;
if(mface->v4) mface->v4+= vertofs;
mface->mat_nr= map[(int)mface->mat_nr];
-
- mface++;
}
-
- if(tfacemain) {
- if(me->tface) {
- memcpy(tface, me->tface, me->totface*sizeof(TFace));
- tface+= me->totface;
- }
- else {
- for(a=0; a<me->totface; a++, tface++) {
- default_tface(tface);
- }
- }
- }
-
+
+ faceofs += me->totface;
}
if(me->totedge) {
- memcpy(medge, me->medge, me->totedge*sizeof(MEdge));
-
- a= me->totedge;
- while(a--) {
+ CustomData_merge(&me->edata, &edata, CD_MASK_MESH, CD_DEFAULT, totedge);
+ CustomData_copy_data(&me->edata, &edata, 0, vertofs, me->totedge);
+
+ for(a=0; a<me->totedge; a++, medge++) {
medge->v1+= vertofs;
medge->v2+= vertofs;
- medge++;
}
+
+ edgeofs += me->totedge;
}
- vertofs+= me->totvert;
+ vertofs += me->totvert;
- if(base->object!=ob) {
+ if(base->object!=ob)
free_and_unlink_base(base);
- }
}
}
base= nextb;
@@ -410,28 +358,20 @@ int join_mesh(void)
me= ob->data;
- if(me->mvert) MEM_freeN(me->mvert);
- me->mvert= mvertmain;
-
- if(me->medge) MEM_freeN(me->medge);
- me->medge= medgemain;
+ CustomData_free(&me->vdata, me->totvert);
+ CustomData_free(&me->edata, me->totedge);
+ CustomData_free(&me->fdata, me->totface);
- if(me->mface) MEM_freeN(me->mface);
- me->mface= mfacemain;
-
- if(me->dvert) free_dverts(me->dvert, me->totvert);
- me->dvert = dvertmain;
-
- if(me->mcol) MEM_freeN(me->mcol);
- me->mcol= (MCol *)mcolmain;
-
- if(me->tface) MEM_freeN(me->tface);
- me->tface= tfacemain;
-
me->totvert= totvert;
me->totedge= totedge;
me->totface= totface;
+ me->vdata= vdata;
+ me->edata= edata;
+ me->fdata= fdata;
+
+ mesh_update_customdata_pointers(me);
+
/* old material array */
for(a=1; a<=ob->totcol; a++) {
ma= ob->mat[a-1];
@@ -586,7 +526,7 @@ void sort_faces(void)
{
Object *ob= OBACT;
Mesh *me;
-
+ CustomDataLayer *layer;
int i, *index;
if(ob==0) return;
@@ -606,13 +546,13 @@ void sort_faces(void)
mfacebase = me->mface;
/* sort index list instead of faces itself
- and apply this permutation to the face list plus
- to the texture faces */
+ and apply this permutation to all face layers */
qsort(index, me->totface, sizeof(int), verg_mface);
- permutate(mfacebase, me->totface, sizeof(MFace), index);
- if (me->tface)
- permutate(me->tface, me->totface, sizeof(TFace), index);
+ for(i = 0; i < me->fdata.totlayer; i++) {
+ layer = &me->fdata.layers[i];
+ permutate(layer->data, me->totface, CustomData_sizeof(layer->type), index);
+ }
MEM_freeN(index);
diff --git a/source/blender/src/multires.c b/source/blender/src/multires.c
index b3bbd0f2972..ab5532b1ee3 100644
--- a/source/blender/src/multires.c
+++ b/source/blender/src/multires.c
@@ -43,6 +43,7 @@
#include "DNA_scene_types.h"
#include "DNA_vec_types.h"
+#include "BKE_customdata.h"
#include "BKE_depsgraph.h"
#include "BKE_global.h"
#include "BKE_mesh.h"
@@ -303,9 +304,8 @@ void convert_to_multires_col(MultiresCol *mrc, MCol *mcol)
mrc->g= mcol->g;
mrc->b= mcol->b;
}
-void convert_to_multires_uvcol(MultiresCol *mrc, TFace *t, const unsigned char j)
+void convert_to_multires_uv(MultiresCol *mrc, MTFace *t, const unsigned char j)
{
- convert_to_multires_col(mrc, (MCol*)(&t->col[j]));
mrc->u= t->uv[j][0];
mrc->v= t->uv[j][1];
}
@@ -335,11 +335,10 @@ void convert_from_multires_col(MultiresCol *mrc, MCol *mcol)
mcol->g= clamp_component(mrc->g);
mcol->b= clamp_component(mrc->b);
}
-void texcolface_to_tface(MultiresTexColFace *f, TFace *t)
+void texcolface_to_tface(MultiresTexColFace *f, MTFace *t)
{
unsigned i;
for(i=0; i<4; ++i) {
- convert_from_multires_col(&f->col[i], (MCol*)(&t->col[i]));
t->uv[i][0]= f->col[i].u;
t->uv[i][1]= f->col[i].v;
}
@@ -416,27 +415,21 @@ void multires_load_cols(Mesh *me)
MultiresLevel *lvl= BLI_findlink(&me->mr->levels,me->mr->current-1), *cur;
unsigned i,j;
- if(!me->mcol && !me->tface) return;
+ if(!me->mcol && !me->mtface) return;
/* Add texcol data */
for(cur= me->mr->levels.first; cur; cur= cur->next)
if(!cur->texcolfaces)
cur->texcolfaces= MEM_callocN(sizeof(MultiresTexColFace)*cur->totface,"TexColFaces");
- if(me->mcol) {
- me->mr->use_col= 1;
- for(i=0; i<me->totface; ++i)
- for(j=0; j<4; ++j)
- convert_to_multires_col(&lvl->texcolfaces[i].col[j],&me->mcol[i*4+j]);
- }
+ me->mr->use_col= (me->mcol != NULL);
+ me->mr->use_tex= (me->mtface != NULL);
- if(me->tface) {
- me->mr->use_tex= 1;
- for(i=0; i<me->totface; ++i) {
- MultiresTexColFace *f= &lvl->texcolfaces[i];
- TFace *t= &me->tface[i];
- for(j=0; j<4; ++j)
- convert_to_multires_uvcol(&f->col[j],t,j);
+ for(i=0; i<me->totface; ++i) {
+ MultiresTexColFace *f= &lvl->texcolfaces[i];
+
+ if(me->mtface) {
+ MTFace *t= &me->mtface[i];
f->tex_page= t->tpage;
f->tex_transp= t->transp;
@@ -444,6 +437,13 @@ void multires_load_cols(Mesh *me)
f->tex_tile= t->tile;
f->tex_unwrap= t->unwrap;
}
+
+ for(j=0; j<4; ++j) {
+ if(me->mcol)
+ convert_to_multires_col(&f->col[j],&me->mcol[i*4+j]);
+ if(me->mtface)
+ convert_to_multires_uv(&f->col[j],&me->mtface[i],j);
+ }
}
/* Update higher levels */
@@ -686,9 +686,9 @@ void check_colors(Mesh *me)
}
/* Check if texfaces have been deleted or added */
- if(me->mr->use_tex && !me->tface)
+ if(me->mr->use_tex && !me->mtface)
me->mr->use_tex= 0;
- else if(!me->mr->use_tex && me->tface) {
+ else if(!me->mr->use_tex && me->mtface) {
me->mr->use_tex= 1;
multires_load_cols(me);
}
@@ -911,18 +911,21 @@ void multires_level_to_mesh(Object *ob, Mesh *me)
int i,sm= G.f & G_SCULPTMODE;
if(sm) set_sculptmode();
- if(me->mvert) MEM_freeN(me->mvert);
- if(me->mface) MEM_freeN(me->mface);
- if(me->medge) MEM_freeN(me->medge);
- free_dverts(me->dvert, me->totvert);
+ CustomData_free_layer(&me->vdata, CD_MVERT, me->totvert);
+ CustomData_free_layer(&me->edata, CD_MEDGE, me->totedge);
+ CustomData_free_layer(&me->fdata, CD_MFACE, me->totface);
+ CustomData_free_layer(&me->vdata, CD_MDEFORMVERT, me->totvert);
+ CustomData_free_layer(&me->fdata, CD_MTFACE, me->totface);
+ CustomData_free_layer(&me->fdata, CD_MCOL, me->totface);
+ mesh_update_customdata_pointers(me);
me->totvert= lvl->totvert;
me->totface= lvl->totface;
me->totedge= lvl->totedge;
- me->mvert= MEM_callocN(sizeof(MVert)*me->totvert, "multires dlm mverts");
- me->mface= MEM_callocN(sizeof(MFace)*me->totface, "multires dlm mfaces");
- me->medge= MEM_callocN(sizeof(MEdge)*me->totedge, "multires dlm medges");
+ me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, 0, NULL, me->totvert);
+ me->medge= CustomData_add_layer(&me->edata, CD_MEDGE, 0, NULL, me->totedge);
+ me->mface= CustomData_add_layer(&me->fdata, CD_MFACE, 0, NULL, me->totface);
/* Vertices/Edges/Faces */
for(i=0; i<lvl->totvert; ++i)
@@ -941,7 +944,7 @@ void multires_level_to_mesh(Object *ob, Mesh *me)
/* Vertex groups */
if(me->mr->dverts && lvl==me->mr->levels.first) {
- me->dvert= MEM_mallocN(sizeof(MDeformVert)*me->totvert, "MDeformVert");
+ me->dvert= CustomData_add_layer(&me->vdata, CD_MDEFORMVERT, 0, NULL, me->totvert);
copy_dverts(me->dvert, me->mr->dverts, lvl->totvert);
} else if(me->mr->dverts) {
MultiresLevel *dlvl, *lvl1= me->mr->levels.first;
@@ -987,21 +990,20 @@ void multires_level_to_mesh(Object *ob, Mesh *me)
MEM_freeN(lvl_dverts[i]);
}
- me->dvert= lvl_dverts[dlvl_ndx-1];
+ me->dvert= CustomData_add_layer(&me->vdata, CD_MDEFORMVERT, 0, lvl_dverts[dlvl_ndx-1], me->totvert);
MEM_freeN(lvl_dverts);
}
if(me->mr->use_tex) {
- if(me->tface) MEM_freeN(me->tface);
- me->tface= MEM_callocN(sizeof(TFace)*me->totface, "multires dlm tface");
+ me->mtface= CustomData_add_layer(&me->fdata, CD_MTFACE, 0, NULL, me->totface);
for(i=0; i<lvl->totface; ++i)
- texcolface_to_tface(&lvl->texcolfaces[i],&me->tface[i]);
+ texcolface_to_tface(&lvl->texcolfaces[i],&me->mtface[i]);
- } else if(me->mr->use_col) {
- if(me->mcol) MEM_freeN(me->mcol);
- me->mcol= MEM_callocN(sizeof(MCol)*me->totface*4, "multires dlm mcol");
+ }
+ if(me->mr->use_col) {
+ me->mcol= CustomData_add_layer(&me->fdata, CD_MCOL, 0, NULL, me->totface);
for(i=0; i<lvl->totface; ++i)
multirestexcol_to_mcol(&lvl->texcolfaces[i], &me->mcol[i*4]);
@@ -1027,22 +1029,14 @@ void multires_update_colors(Mesh *me)
if(me->mr->use_col || me->mr->use_tex) {
/* Calc initial deltas */
cr_deltas= MEM_callocN(sizeof(MultiresCol)*lvl->totface*4,"initial color/uv deltas");
- if(me->mr->use_tex) {
- for(i=0; i<lvl->totface; ++i) {
- for(j=0; j<4; ++j) {
- MultiresCol col;
- convert_to_multires_uvcol(&col,&me->tface[i],j);
- cr_deltas[i*4+j].a= col.a - lvl->texcolfaces[i].col[j].a;
- cr_deltas[i*4+j].r= col.r - lvl->texcolfaces[i].col[j].r;
- cr_deltas[i*4+j].g= col.g - lvl->texcolfaces[i].col[j].g;
- cr_deltas[i*4+j].b= col.b - lvl->texcolfaces[i].col[j].b;
- cr_deltas[i*4+j].u= col.u - lvl->texcolfaces[i].col[j].u;
- cr_deltas[i*4+j].v= col.v - lvl->texcolfaces[i].col[j].v;
+
+ for(i=0; i<lvl->totface; ++i) {
+ for(j=0; j<4; ++j) {
+ if(me->mr->use_tex) {
+ cr_deltas[i*4+j].u= me->mtface[i].uv[j][0] - lvl->texcolfaces[i].col[j].u;
+ cr_deltas[i*4+j].v= me->mtface[i].uv[j][1] - lvl->texcolfaces[i].col[j].v;
}
- }
- } else if(me->mr->use_col) {
- for(i=0; i<lvl->totface; ++i) {
- for(j=0; j<4; ++j) {
+ if(me->mr->use_col) {
cr_deltas[i*4+j].a= me->mcol[i*4+j].a - lvl->texcolfaces[i].col[j].a;
cr_deltas[i*4+j].r= me->mcol[i*4+j].r - lvl->texcolfaces[i].col[j].r;
cr_deltas[i*4+j].g= me->mcol[i*4+j].g - lvl->texcolfaces[i].col[j].g;
@@ -1055,8 +1049,8 @@ void multires_update_colors(Mesh *me)
for(i=0; i<lvl->totface; ++i) {
for(j=0; j<4; ++j) {
if(me->mr->use_tex)
- convert_to_multires_uvcol(&lvl->texcolfaces[i].col[j],&me->tface[i],j);
- else
+ convert_to_multires_uv(&lvl->texcolfaces[i].col[j],&me->mtface[i],j);
+ if(me->mr->use_col)
convert_to_multires_col(&lvl->texcolfaces[i].col[j],&me->mcol[i*4+j]);
}
}
diff --git a/source/blender/src/poseobject.c b/source/blender/src/poseobject.c
index 432c7d9d4f0..9f9c1999a6f 100644
--- a/source/blender/src/poseobject.c
+++ b/source/blender/src/poseobject.c
@@ -752,11 +752,10 @@ void pose_adds_vgroups(Object *meshobj)
bPoseChannel *pchan;
Bone *bone;
bDeformGroup *dg, *curdef;
- int DMneedsFree;
if(poseobj==NULL || (poseobj->flag & OB_POSEMODE)==0) return;
- dm = mesh_get_derived_final(meshobj, &DMneedsFree);
+ dm = mesh_get_derived_final(meshobj);
map.meshobj= meshobj;
@@ -808,7 +807,7 @@ void pose_adds_vgroups(Object *meshobj)
}
}
- if (DMneedsFree) dm->release(dm);
+ dm->release(dm);
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWBUTSEDIT, 0);
diff --git a/source/blender/src/sculptmode.c b/source/blender/src/sculptmode.c
index b1f3bf520f2..d32d661ef37 100644
--- a/source/blender/src/sculptmode.c
+++ b/source/blender/src/sculptmode.c
@@ -53,6 +53,7 @@
#include "DNA_view3d_types.h"
#include "DNA_userdef_types.h"
+#include "BKE_customdata.h"
#include "BKE_DerivedMesh.h"
#include "BKE_depsgraph.h"
#include "BKE_global.h"
@@ -340,8 +341,9 @@ void sculptmode_undo_update(SculptUndoStep *newcur)
/* Verts */
if(newcur->verts) {
- MEM_freeN(me->mvert);
+ CustomData_free_layer(&me->vdata, CD_MVERT, me->totvert);
me->mvert= MEM_dupallocN(newcur->verts);
+ CustomData_add_layer(&me->vdata, CD_MVERT, 0, me->mvert, newcur->totvert);
}
/* Check if faces/edges have been modified between oldcur and newcur */
@@ -363,10 +365,14 @@ void sculptmode_undo_update(SculptUndoStep *newcur)
if(do_fe)
for(sus= newcur; sus; sus= sus->prev) {
if(sus->edges || sus->faces) {
- MEM_freeN(me->mface);
- MEM_freeN(me->medge);
+ CustomData_free_layer(&me->edata, CD_MEDGE, me->totedge);
+ CustomData_free_layer(&me->fdata, CD_MFACE, me->totface);
+
me->medge= MEM_dupallocN(sus->edges);
me->mface= MEM_dupallocN(sus->faces);
+ CustomData_add_layer(&me->edata, CD_MEDGE, 0, me->medge, sus->totedge);
+ CustomData_add_layer(&me->fdata, CD_MFACE, 0, me->mface, sus->totface);
+
me->totvert= sus->totvert;
me->totedge= sus->totedge;
me->totface= sus->totface;
@@ -1705,7 +1711,7 @@ void sculptmode_revert_pmv(Mesh *me)
{
if(me->pv) {
unsigned i;
- MVert *nve;
+ MVert *nve, *old_verts;
Object *ob= G.scene->sculptdata.active_ob;
/* Temporarily exit sculptmode */
@@ -1713,21 +1719,25 @@ void sculptmode_revert_pmv(Mesh *me)
/* Reorder vertices */
nve= me->mvert;
- me->mvert= MEM_mallocN(sizeof(MVert)*me->pv->totvert,"PMV revert verts");
- me->totvert= me->pv->totvert;
- for(i=0; i<me->totvert; ++i)
- me->mvert[i]= nve[me->pv->vert_map[i]];
- MEM_freeN(nve);
+ old_verts = MEM_mallocN(sizeof(MVert)*me->pv->totvert,"PMV revert verts");
+ for(i=0; i<me->pv->totvert; ++i)
+ old_verts[i]= nve[me->pv->vert_map[i]];
- /* Restore edges and faces */
- MEM_freeN(me->mface);
- MEM_freeN(me->medge);
- me->totface= me->pv->totface;
+ /* Restore verts, edges and faces */
+ CustomData_free_layer(&me->vdata, CD_MVERT, me->totvert);
+ CustomData_free_layer(&me->edata, CD_MEDGE, me->totedge);
+ CustomData_free_layer(&me->fdata, CD_MFACE, me->totface);
+
+ me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, 0, old_verts, me->pv->totvert);
+ me->medge= CustomData_add_layer(&me->edata, CD_MEDGE, 0, me->pv->old_edges, me->pv->totedge);
+ me->mface= CustomData_add_layer(&me->fdata, CD_MFACE, 0, me->pv->old_faces, me->pv->totface);
+
+ me->totvert= me->pv->totvert;
me->totedge= me->pv->totedge;
- me->mface= me->pv->old_faces;
- me->medge= me->pv->old_edges;
- me->pv->old_faces= NULL;
+ me->totface= me->pv->totface;
+
me->pv->old_edges= NULL;
+ me->pv->old_faces= NULL;
/* Free maps */
MEM_freeN(me->pv->edge_map);
@@ -1851,8 +1861,8 @@ void sculptmode_do_pmv(Object *ob, rcti *hb_2d, int mode)
++ndx_show;
}
}
- MEM_freeN(me->mvert);
- me->mvert= nve;
+ CustomData_free_layer(&me->vdata, CD_MVERT, me->pv->totvert);
+ me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, 0, nve, me->totvert);
/* Create new face array */
me->pv->old_faces= me->mface;
@@ -1879,11 +1889,12 @@ void sculptmode_do_pmv(Object *ob, rcti *hb_2d, int mode)
cr_f->v2= me->pv->vert_map[pr_f->v2];
cr_f->v3= me->pv->vert_map[pr_f->v3];
cr_f->v4= pr_f->v4 ? me->pv->vert_map[pr_f->v4] : 0;
- test_index_face(cr_f,NULL,NULL,pr_f->v4?4:3);
+ test_index_face(cr_f,NULL,0,pr_f->v4?4:3);
++face_ndx_show;
}
}
me->totface= face_cnt_show;
+ CustomData_set_layer(&me->fdata, CD_MFACE, me->mface);
/* Create new edge array */
me->pv->old_edges= me->medge;
@@ -1903,6 +1914,7 @@ void sculptmode_do_pmv(Object *ob, rcti *hb_2d, int mode)
else me->pv->edge_map[i]= -1;
}
me->totedge= edge_cnt_show;
+ CustomData_set_layer(&me->edata, CD_MEDGE, me->medge);
set_sculpt_object(ob);
diff --git a/source/blender/src/space.c b/source/blender/src/space.c
index 078c6f6a886..b43e90feb51 100644
--- a/source/blender/src/space.c
+++ b/source/blender/src/space.c
@@ -559,7 +559,7 @@ static void align_view_to_selected(View3D *v3d)
if (obact && obact->type==OB_MESH) {
Mesh *me= obact->data;
- if (me->tface) {
+ if (me->mtface) {
faceselect_align_view_to_selected(v3d, me, axis);
addqueue(v3d->area->win, REDRAW, 1);
}
diff --git a/source/blender/src/transform_conversions.c b/source/blender/src/transform_conversions.c
index e1c9726b6cf..d24e1277cef 100755
--- a/source/blender/src/transform_conversions.c
+++ b/source/blender/src/transform_conversions.c
@@ -1473,7 +1473,6 @@ static float *get_crazy_mapped_editverts(void)
DerivedMesh *dm;
ModifierData *md;
float *vertexcos;
- int needsFree;
int i;
for( i = 0, md=G.obedit->modifiers.first; md; ++i, md=md->next ) {
@@ -1485,16 +1484,16 @@ 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 */
- makeDispListMesh(G.obedit);
+ makeDerivedMesh(G.obedit);
}
/* now get the cage */
- dm= editmesh_get_derived_cage(&needsFree);
+ dm= editmesh_get_derived_cage();
vertexcos= MEM_mallocN(3*sizeof(float)*G.totvert, "vertexcos map");
dm->foreachMappedVert(dm, make_vertexcos__mapFunc, vertexcos);
- if (needsFree) dm->release(dm);
+ dm->release(dm);
if(md) {
/* set back the flag, no new cage needs to be built, transform does it */
@@ -1776,8 +1775,8 @@ static void createTransUVs(TransInfo *t)
TransData *td = NULL;
TransData2D *td2d = NULL;
Mesh *me;
- TFace *tf;
MFace *mf;
+ MTFace *tf;
int a, count=0, countsel=0;
int propmode = t->flag & T_PROP_EDIT;
@@ -1785,7 +1784,7 @@ static void createTransUVs(TransInfo *t)
me= get_mesh(OBACT);
/* count */
- tf= me->tface;
+ tf= me->mtface;
mf= me->mface;
for(a=me->totface; a>0; a--, tf++, mf++) {
if(mf->v3 && tf->flag & TF_SELECT) {
@@ -1812,7 +1811,7 @@ static void createTransUVs(TransInfo *t)
td= t->data;
td2d= t->data2d;
- tf= me->tface;
+ tf= me->mtface;
mf= me->mface;
for(a=me->totface; a>0; a--, tf++, mf++) {
if(mf->v3 && tf->flag & TF_SELECT) {
diff --git a/source/blender/src/unwrapper.c b/source/blender/src/unwrapper.c
index 851486de323..b0716b81b91 100644
--- a/source/blender/src/unwrapper.c
+++ b/source/blender/src/unwrapper.c
@@ -82,7 +82,7 @@ static void hash_add_face(EdgeHash *ehash, MFace *mf)
void select_linked_tfaces_with_seams(int mode, Mesh *me, unsigned int index)
{
- TFace *tf;
+ MTFace *tf;
MFace *mf;
int a, doit=1, mark=0;
char *linkflag;
@@ -105,7 +105,7 @@ void select_linked_tfaces_with_seams(int mode, Mesh *me, unsigned int index)
}
else {
/* fill array by selection */
- tf= me->tface;
+ tf= me->mtface;
mf= me->mface;
for(a=0; a<me->totface; a++, tf++, mf++) {
if(tf->flag & TF_HIDE);
@@ -120,7 +120,7 @@ void select_linked_tfaces_with_seams(int mode, Mesh *me, unsigned int index)
doit= 0;
/* expand selection */
- tf= me->tface;
+ tf= me->mtface;
mf= me->mface;
for(a=0; a<me->totface; a++, tf++, mf++) {
if(tf->flag & TF_HIDE)
@@ -161,24 +161,24 @@ void select_linked_tfaces_with_seams(int mode, Mesh *me, unsigned int index)
BLI_edgehash_free(seamhash, NULL);
if(mode==0 || mode==2) {
- for(a=0, tf=me->tface; a<me->totface; a++, tf++)
+ for(a=0, tf=me->mtface; a<me->totface; a++, tf++)
if(linkflag[a])
tf->flag |= TF_SELECT;
else
tf->flag &= ~TF_SELECT;
}
else if(mode==1) {
- for(a=0, tf=me->tface; a<me->totface; a++, tf++)
+ for(a=0, tf=me->mtface; a<me->totface; a++, tf++)
if(linkflag[a] && (tf->flag & TF_SELECT))
break;
if (a<me->totface) {
- for(a=0, tf=me->tface; a<me->totface; a++, tf++)
+ for(a=0, tf=me->mtface; a<me->totface; a++, tf++)
if(linkflag[a])
tf->flag &= ~TF_SELECT;
}
else {
- for(a=0, tf=me->tface; a<me->totface; a++, tf++)
+ for(a=0, tf=me->mtface; a<me->totface; a++, tf++)
if(linkflag[a])
tf->flag |= TF_SELECT;
}
@@ -195,7 +195,7 @@ void select_linked_tfaces_with_seams(int mode, Mesh *me, unsigned int index)
ParamHandle *construct_param_handle(Mesh *me, short implicit, short fill, short sel)
{
int a;
- TFace *tf;
+ MTFace *tf;
MFace *mf;
MVert *mv;
MEdge *medge;
@@ -205,7 +205,7 @@ ParamHandle *construct_param_handle(Mesh *me, short implicit, short fill, short
mv= me->mvert;
mf= me->mface;
- tf= me->tface;
+ tf= me->mtface;
for (a=0; a<me->totface; a++, mf++, tf++) {
ParamKey key, vkeys[4];
ParamBool pin[4], select[4];
@@ -282,7 +282,7 @@ void unwrap_lscm(short seamcut)
short fillholes = G.scene->toolsettings->uvcalc_flag & 1;
me= get_mesh(OBACT);
- if(me==0 || me->tface==0) return;
+ if(me==0 || me->mtface==0) return;
handle = construct_param_handle(me, 0, fillholes, seamcut == 0);
@@ -315,7 +315,7 @@ void minimize_stretch_tface_uv(void)
short fillholes = G.scene->toolsettings->uvcalc_flag & 1;
me = get_mesh(OBACT);
- if(me==0 || me->tface==0) return;
+ if(me==0 || me->mtface==0) return;
handle = construct_param_handle(me, 1, fillholes, 1);
@@ -409,7 +409,7 @@ void unwrap_lscm_live_begin(void)
short fillholes = G.scene->toolsettings->uvcalc_flag & 1;
me= get_mesh(OBACT);
- if(me==0 || me->tface==0) return;
+ if(me==0 || me->mtface==0) return;
liveHandle = construct_param_handle(me, 0, fillholes, 1);
diff --git a/source/blender/src/verse_mesh.c b/source/blender/src/verse_mesh.c
index 1445c5471d1..8a752150540 100644
--- a/source/blender/src/verse_mesh.c
+++ b/source/blender/src/verse_mesh.c
@@ -41,11 +41,12 @@
#include "BLI_edgehash.h"
#include "BLI_editVert.h"
+#include "BKE_customdata.h"
+#include "BKE_depsgraph.h"
#include "BKE_global.h"
-#include "BKE_verse.h"
#include "BKE_mesh.h"
-#include "BKE_depsgraph.h"
#include "BKE_utildefines.h"
+#include "BKE_verse.h"
#include "BIF_verse.h"
#include "BIF_editmesh.h"
@@ -1414,34 +1415,11 @@ void create_meshdata_from_geom_node(Mesh *me, VNode *vnode)
vert_vlayer = find_verse_layer_type((VGeomData*)vnode->data, VERTEX_LAYER);
face_vlayer = find_verse_layer_type((VGeomData*)vnode->data, POLYGON_LAYER);
- if(me->mvert) {
- MEM_freeN(me->mvert);
- me->mvert = NULL;
- }
- if(me->mface) {
- MEM_freeN(me->mface);
- me->mface = NULL;
- }
- if(me->tface) {
- MEM_freeN(me->tface);
- me->tface = NULL;
- }
- if(me->medge) {
- MEM_freeN(me->medge);
- me->medge = NULL;
- }
- if(me->dvert) {
- MEM_freeN(me->dvert);
- me->dvert = NULL;
- }
- if(me->mcol) {
- MEM_freeN(me->mcol);
- me->mcol = NULL;
- }
- if(me->msticky) {
- MEM_freeN(me->msticky);
- me->msticky = NULL;
- }
+ CustomData_free(&me->vdata, me->totvert);
+ CustomData_free(&me->edata, me->totedge);
+ CustomData_free(&me->fdata, me->totface);
+ mesh_update_customdata_pointers(me);
+
if(me->mselect) {
MEM_freeN(me->mselect);
me->mselect = NULL;
@@ -1451,8 +1429,8 @@ void create_meshdata_from_geom_node(Mesh *me, VNode *vnode)
me->totface = face_vlayer->dl.da.count;
me->totselect = 0;
- mvert = me->mvert = (MVert*)MEM_mallocN(sizeof(MVert)*me->totvert, "mesh_from_verse vert");
- mface = me->mface = (MFace*)MEM_mallocN(sizeof(MFace)*me->totface, "mesh_from_verse face");
+ mvert = me->mvert = CustomData_add_layer(&me->vdata, CD_MVERT, 0, NULL, me->totvert);
+ mface = me->mface = CustomData_add_layer(&me->fdata, CD_MFACE, 0, NULL, me->totface);
index = 0;
vvert = vert_vlayer->dl.lb.first;
@@ -1495,7 +1473,7 @@ void create_meshdata_from_geom_node(Mesh *me, VNode *vnode)
mface->edcode = 0;
/* index 0 isn't allowed at location 3 or 4 */
- test_index_face(mface, NULL, NULL, vface->vvert3?4:3);
+ test_index_face(mface, NULL, 0, vface->vvert3?4:3);
/* printf("\t mface: %d, %d, %d, %d\n", mface->v1, mface->v2, mface->v3, mface->v4);*/
vface = vface->next;
@@ -1506,7 +1484,7 @@ void create_meshdata_from_geom_node(Mesh *me, VNode *vnode)
if(me->totedge) {
EdgeHashIterator *i;
- MEdge *medge = me->medge = (MEdge *)MEM_mallocN(sizeof(MEdge)*me->totedge, "mesh_from_verse edge");
+ MEdge *medge = me->medge = CustomData_add_layer(&me->edata, CD_MEDGE, 0, NULL, me->totedge);
for(i = BLI_edgehashIterator_new(edges); !BLI_edgehashIterator_isDone(i); BLI_edgehashIterator_step(i), ++medge) {
BLI_edgehashIterator_getKey(i, (int*)&medge->v1, (int*)&medge->v2);
diff --git a/source/blender/src/verse_object.c b/source/blender/src/verse_object.c
index 1b7e2a5157e..6f6113b75dc 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 */
- makeDispListMesh(ob);
+ makeDerivedMesh(ob);
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;
- makeDispListMesh(ob);
+ makeDerivedMesh(ob);
}
}
@@ -573,11 +573,13 @@ void post_object_free_constraint(VNode *vnode)
struct Object *ob = (Object*)((VObjectData*)vnode->data)->object;
if(ob) {
if(ob->derivedFinal) {
- ((DerivedMesh*)ob->derivedFinal)->release((DerivedMesh*)ob->derivedFinal);
+ ob->derivedFinal->needsFree = 1;
+ ob->derivedFinal->release((DerivedMesh*)ob->derivedFinal);
ob->derivedFinal = NULL;
}
if(ob->derivedDeform) {
- ((DerivedMesh*)ob->derivedDeform)->release((DerivedMesh*)ob->derivedDeform);
+ ob->derivedDeform->needsFree = 1;
+ ob->derivedDeform->release((DerivedMesh*)ob->derivedDeform);
ob->derivedDeform = NULL;
}
}
diff --git a/source/blender/src/vpaint.c b/source/blender/src/vpaint.c
index 508b8c48d14..13fadc195fe 100644
--- a/source/blender/src/vpaint.c
+++ b/source/blender/src/vpaint.c
@@ -64,6 +64,7 @@
#include "BKE_armature.h"
#include "BKE_DerivedMesh.h"
+#include "BKE_customdata.h"
#include "BKE_depsgraph.h"
#include "BKE_deform.h"
#include "BKE_displist.h"
@@ -154,7 +155,7 @@ void do_shared_vertexcol(Mesh *me)
/* if no mcol: do not do */
/* if tface: only the involved faces, otherwise all */
MFace *mface;
- TFace *tface;
+ MTFace *tface;
int a;
short *scolmain, *scol;
char *mcol;
@@ -163,7 +164,7 @@ void do_shared_vertexcol(Mesh *me)
scolmain= MEM_callocN(4*sizeof(short)*me->totvert, "colmain");
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
mcol= (char *)me->mcol;
for(a=me->totface; a>0; a--, mface++, mcol+=16) {
@@ -193,7 +194,7 @@ void do_shared_vertexcol(Mesh *me)
scol+= 4;
}
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
mcol= (char *)me->mcol;
for(a=me->totface; a>0; a--, mface++, mcol+=16) {
@@ -215,16 +216,11 @@ void do_shared_vertexcol(Mesh *me)
MEM_freeN(scolmain);
}
-void make_vertexcol() /* single ob */
+void make_vertexcol(int shade) /* single ob */
{
Object *ob;
Mesh *me;
- /*
- * Always copies from shadedisplist to mcol.
- * When there are tfaces, it copies the colors and frees mcol
- */
-
if(G.obedit) {
error("Unable to perform function in Edit Mode");
return;
@@ -235,18 +231,21 @@ void make_vertexcol() /* single ob */
me= get_mesh(ob);
if(me==0) return;
- if(me->mcol) MEM_freeN(me->mcol);
- shadeMeshMCol(ob, me);
-
- if(me->tface) mcol_to_tface(me, 1);
-
+ /* copies from shadedisplist to mcol */
+ if(me->mcol == NULL)
+ me->mcol = CustomData_add_layer(&me->fdata, CD_MCOL, 0, NULL, me->totface);
+
+ if(shade)
+ shadeMeshMCol(ob, me);
+ else
+ memset(me->mcol, 255, sizeof(MCol)*me->totface);
+
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
allqueue(REDRAWBUTSEDIT, 0);
allqueue(REDRAWVIEW3D, 0);
}
-
void copy_vpaint_undo(unsigned int *mcol, int tot)
{
if(vpaintundobuf) MEM_freeN(vpaintundobuf);
@@ -272,11 +271,8 @@ void vpaint_undo()
ob= OBACT;
me= get_mesh(ob);
- if(me==0 || me->totface==0) return;
+ if(me==0 || me->mcol==0 || me->totface==0) return;
- if(me->tface) tface_to_mcol(me);
- else if(me->mcol==0) return;
-
a= MIN2(me->totface, totvpaintundo);
from= vpaintundobuf;
to= (unsigned int *)me->mcol;
@@ -290,7 +286,6 @@ void vpaint_undo()
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
allqueue(REDRAWVIEW3D, 0);
- if(me->tface) mcol_to_tface(me, 1);
}
void clear_vpaint()
@@ -306,10 +301,7 @@ void clear_vpaint()
me= get_mesh(ob);
if(!ob || ob->id.lib) return;
- if(me==0 || me->totface==0) return;
-
- if(me->tface) tface_to_mcol(me);
- if(me->mcol==0) return;
+ if(me==0 || me->mcol==0 || me->totface==0) return;
paintcol= vpaint_get_current_col();
@@ -324,33 +316,33 @@ void clear_vpaint()
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
allqueue(REDRAWVIEW3D, 0);
- if(me->tface) mcol_to_tface(me, 1);
}
void clear_vpaint_selectedfaces()
{
Mesh *me;
- TFace *tf;
+ MTFace *tf;
Object *ob;
- unsigned int paintcol;
+ unsigned int paintcol, *mcol;
int i;
ob= OBACT;
-
me= get_mesh(ob);
- tf = me->tface;
- if (!tf) return; /* should not happen, but you never know */
+ if(me==0 || me->mtface==0 || me->totface==0) return;
- if(me==0 || me->totface==0) return;
+ if(!me->mcol)
+ make_vertexcol(0);
paintcol= vpaint_get_current_col();
- for (i = 0; i < me->totface; i++) {
- if (tf[i].flag & TF_SELECT) {
- tf[i].col[0] = paintcol;
- tf[i].col[1] = paintcol;
- tf[i].col[2] = paintcol;
- tf[i].col[3] = paintcol;
+ tf = me->mtface;
+ mcol = (unsigned int*)me->mcol;
+ for (i = 0; i < me->totface; i++, tf++, mcol+=4) {
+ if (tf->flag & TF_SELECT) {
+ mcol[0] = paintcol;
+ mcol[1] = paintcol;
+ mcol[2] = paintcol;
+ mcol[3] = paintcol;
}
}
@@ -366,7 +358,7 @@ void clear_wpaint_selectedfaces()
extern float editbutvweight;
float paintweight= editbutvweight;
Mesh *me;
- TFace *tface;
+ MTFace *tface;
MFace *mface;
Object *ob;
int index, vgroup;
@@ -377,10 +369,10 @@ void clear_wpaint_selectedfaces()
ob= OBACT;
me= ob->data;
- if(me==0 || me->totface==0 || me->dvert==0 || !me->tface) return;
+ if(me==0 || me->totface==0 || me->dvert==0 || !me->mtface) return;
if(indexar==NULL) init_vertexpaint();
- for(index=0, tface=me->tface; index<me->totface; index++, tface++) {
+ for(index=0, tface=me->mtface; index<me->totface; index++, tface++) {
if((tface->flag & TF_SELECT)==0)
indexar[index]= 0;
else
@@ -480,10 +472,7 @@ void vpaint_dogamma()
ob= OBACT;
me= get_mesh(ob);
- if(me==0 || me->totface==0) return;
-
- if(me->tface) tface_to_mcol(me);
- else if(me->mcol==0) return;
+ if(me==0 || me->mcol==0 || me->totface==0) return;
copy_vpaint_undo((unsigned int *)me->mcol, me->totface);
@@ -511,8 +500,6 @@ void vpaint_dogamma()
cp+= 4;
}
allqueue(REDRAWVIEW3D, 0);
-
- if(me->tface) mcol_to_tface(me, 1);
}
/* used for both 3d view and image window */
@@ -874,7 +861,6 @@ void wpaint_undo (void)
{
Object *ob= OBACT;
Mesh *me;
- MDeformVert *swapbuf;
me = get_mesh(ob);
if (!me) return;
@@ -888,19 +874,9 @@ void wpaint_undo (void)
if (totwpaintundo != me->totvert)
return;
- swapbuf= me->dvert;
-
- /* copy undobuf to mesh */
- me->dvert= MEM_mallocN(sizeof(MDeformVert)*me->totvert, "deformVert");
- copy_dverts(me->dvert, wpaintundobuf, totwpaintundo);
-
- /* copy previous mesh to undo */
- free_dverts(wpaintundobuf, me->totvert);
- wpaintundobuf= MEM_mallocN(sizeof(MDeformVert)*me->totvert, "wpaintundo");
- copy_dverts(wpaintundobuf, swapbuf, totwpaintundo);
-
- /* now free previous mesh dverts */
- free_dverts(swapbuf, me->totvert);
+ /* simply swap pointers, and update the pointer in CustomData too */
+ SWAP(MDeformVert*, me->dvert, wpaintundobuf);
+ CustomData_set_layer(&me->vdata, CD_MDEFORMVERT, me->dvert);
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
DAG_object_flush_update(G.scene, modifiers_isDeformedByArmature(ob), OB_RECALC_DATA);
@@ -1074,9 +1050,8 @@ static void sample_wpaint(int mode)
MDeformWeight *dw;
extern float editbutvweight;
float w1, w2, w3, w4, co[3], fac;
- int needsFree;
- dm = mesh_get_derived_final(ob, &needsFree);
+ dm = mesh_get_derived_final(ob);
if(dm->getVertCo==NULL) {
notice("Not supported yet");
}
@@ -1120,9 +1095,8 @@ static void sample_wpaint(int mode)
if(dw) editbutvweight= dw->weight; else editbutvweight= 0.0f;
}
}
- if (needsFree)
- dm->release(dm);
}
+ dm->release(dm);
}
}
@@ -1169,7 +1143,7 @@ void weight_paint(void)
Object *ob;
Mesh *me;
MFace *mface;
- TFace *tface;
+ MTFace *tface;
float mat[4][4], imat[4][4], paintweight, *vertexcosnos;
int index, totindex, alpha, totw;
int vgroup_mirror= -1;
@@ -1240,7 +1214,6 @@ void weight_paint(void)
getmouseco_areawin(mvalo);
- if(me->tface) tface_to_mcol(me);
copy_vpaint_undo( (unsigned int *)me->mcol, me->totface);
copy_wpaint_undo(me->dvert, me->totvert);
@@ -1307,11 +1280,11 @@ void weight_paint(void)
}
}
- if((G.f & G_FACESELECT) && me->tface) {
+ if((G.f & G_FACESELECT) && me->mtface) {
for(index=0; index<totindex; index++) {
if(indexar[index] && indexar[index]<=me->totface) {
- tface= ((TFace *)me->tface) + (indexar[index]-1);
+ tface= ((MTFace *)me->mtface) + (indexar[index]-1);
if((tface->flag & TF_SELECT)==0) {
indexar[index]= 0;
@@ -1426,10 +1399,6 @@ void weight_paint(void)
}
}
- if(me->tface) {
- MEM_freeN(me->mcol);
- me->mcol= 0;
- }
if(vertexcosnos)
MEM_freeN(vertexcosnos);
@@ -1445,7 +1414,7 @@ void vertex_paint()
Object *ob;
Mesh *me;
MFace *mface;
- TFace *tface;
+ MTFace *tface;
float mat[4][4], imat[4][4], *vertexcosnos;
unsigned int paintcol=0, *mcol, *mcolorig, fcol1, fcol2;
int index, alpha, totindex;
@@ -1463,9 +1432,9 @@ void vertex_paint()
if(me==NULL || me->totface==0) return;
if(ob->lay & G.vd->lay); else error("Active object is not in this layer");
- if(me->tface==NULL && me->mcol==NULL) make_vertexcol();
+ if(me->mtface==NULL && me->mcol==NULL) make_vertexcol(1);
- if(me->tface==NULL && me->mcol==NULL) return;
+ if(me->mtface==NULL && me->mcol==NULL) return;
/* painting on subsurfs should give correct points too, this returns me->totvert amount */
vertexcosnos= mesh_get_mapped_verts_nors(ob);
@@ -1485,7 +1454,6 @@ void vertex_paint()
getmouseco_areawin(mvalo);
- if(me->tface) tface_to_mcol(me);
copy_vpaint_undo( (unsigned int *)me->mcol, me->totface);
getmouseco_areawin(mval);
@@ -1526,15 +1494,13 @@ void vertex_paint()
}
}
}
- if((G.f & G_FACESELECT) && me->tface) {
+ if((G.f & G_FACESELECT) && me->mtface) {
for(index=0; index<totindex; index++) {
if(indexar[index] && indexar[index]<=me->totface) {
+ tface= ((MTFace *)me->mtface) + (indexar[index]-1);
- tface= ((TFace *)me->tface) + (indexar[index]-1);
-
- if((tface->flag & TF_SELECT)==0) {
+ if((tface->flag & TF_SELECT)==0)
indexar[index]= 0;
- }
}
}
}
@@ -1578,9 +1544,6 @@ void vertex_paint()
MTC_Mat4SwapMat4(G.vd->persmat, mat);
do_shared_vertexcol(me);
- if(me->tface) {
- mcol_to_tface(me, 0);
- }
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
scrarea_do_windraw(curarea);
@@ -1600,10 +1563,6 @@ void vertex_paint()
else BIF_wait_for_statechange();
}
- if(me->tface) {
- MEM_freeN(me->mcol);
- me->mcol= 0;
- }
if(vertexcosnos)
MEM_freeN(vertexcosnos);
@@ -1688,7 +1647,7 @@ void set_vpaint(void) /* toggle */
return;
}
- if(me && me->tface==NULL && me->mcol==NULL) make_vertexcol();
+ if(me && me->mcol==NULL) make_vertexcol(1);
if(G.f & G_VERTEXPAINT){
G.f &= ~G_VERTEXPAINT;
diff --git a/source/blender/yafray/intern/export_File.cpp b/source/blender/yafray/intern/export_File.cpp
index f4ba9f59409..7d9f23a4e4c 100755
--- a/source/blender/yafray/intern/export_File.cpp
+++ b/source/blender/yafray/intern/export_File.cpp
@@ -1230,7 +1230,7 @@ void yafrayFileRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_li
string matname(face0mat->id.name);
// use name in imgtex_shader list if 'TexFace' enabled for this material
if (face0mat->mode & MA_FACETEXTURE) {
- TFace* tface = face0->tface;
+ MTFace* tface = face0->tface;
if (tface) {
Image* fimg = (Image*)tface->tpage;
if (fimg) matname = imgtex_shader[string(face0mat->id.name) + string(fimg->id.name)];
@@ -1412,7 +1412,7 @@ void yafrayFileRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_li
string fmatname(fmat->id.name);
// use name in imgtex_shader list if 'TexFace' enabled for this face material
if (fmat->mode & MA_FACETEXTURE) {
- TFace* tface = vlr->tface;
+ MTFace* tface = vlr->tface;
if (tface) {
Image* fimg = (Image*)tface->tpage;
if (fimg) fmatname = imgtex_shader[fmatname + string(fimg->id.name)];
@@ -1437,7 +1437,7 @@ void yafrayFileRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_li
}
else if (vlr->flag & R_FACE_SPLIT) { ui2++; ui3++; }
- TFace* uvc = vlr->tface; // possible uvcoords (v upside down)
+ MTFace* uvc = vlr->tface; // possible uvcoords (v upside down)
if (uvc) {
ostr << " u_a=\"" << uvc->uv[ui1][0] << "\" v_a=\"" << 1-uvc->uv[ui1][1] << "\""
<< " u_b=\"" << uvc->uv[ui2][0] << "\" v_b=\"" << 1-uvc->uv[ui2][1] << "\""
diff --git a/source/blender/yafray/intern/export_Plugin.cpp b/source/blender/yafray/intern/export_Plugin.cpp
index ff2599eecb9..d2ed7f66f32 100644
--- a/source/blender/yafray/intern/export_Plugin.cpp
+++ b/source/blender/yafray/intern/export_Plugin.cpp
@@ -1079,7 +1079,7 @@ void yafrayPluginRender_t::writeMaterialsAndModulators()
}
-void yafrayPluginRender_t::genUVcoords(vector<yafray::GFLOAT> &uvcoords, VlakRen *vlr, TFace* uvc, bool comple)
+void yafrayPluginRender_t::genUVcoords(vector<yafray::GFLOAT> &uvcoords, VlakRen *vlr, MTFace* uvc, bool comple)
{
if (uvc)
{
@@ -1148,7 +1148,7 @@ void yafrayPluginRender_t::genFace(vector<int> &faces,vector<string> &shaders,ve
string fmatname(fmat->id.name);
// use name in imgtex_shader list if 'TexFace' enabled for this face material
if (fmat->mode & MA_FACETEXTURE) {
- TFace* tface = vlr->tface;
+ MTFace* tface = vlr->tface;
if (tface) {
Image* fimg = (Image*)tface->tpage;
if (fimg) fmatname = imgtex_shader[fmatname + string(fimg->id.name)];
@@ -1168,7 +1168,7 @@ void yafrayPluginRender_t::genFace(vector<int> &faces,vector<string> &shaders,ve
shaders.push_back(fmatname);
faceshader.push_back(shaders.size()-1);
}
- TFace* uvc = vlr->tface; // possible uvcoords (v upside down)
+ MTFace* uvc = vlr->tface; // possible uvcoords (v upside down)
int idx1, idx2, idx3;
idx1 = vert_idx.find(vlr->v1)->second;
@@ -1193,7 +1193,7 @@ void yafrayPluginRender_t::genCompleFace(vector<int> &faces,/*vector<string> &sh
bool EXPORT_VCOL = ((fmat->mode & (MA_VERTEXCOL|MA_VERTEXCOLP))!=0);
faceshader.push_back(faceshader.back());
- TFace* uvc = vlr->tface; // possible uvcoords (v upside down)
+ MTFace* uvc = vlr->tface; // possible uvcoords (v upside down)
int idx1, idx2, idx3;
idx1 = vert_idx.find(vlr->v3)->second;
idx2 = vert_idx.find(vlr->v4)->second;
diff --git a/source/blender/yafray/intern/export_Plugin.h b/source/blender/yafray/intern/export_Plugin.h
index 28e71596d50..1ce4988a260 100644
--- a/source/blender/yafray/intern/export_Plugin.h
+++ b/source/blender/yafray/intern/export_Plugin.h
@@ -48,7 +48,7 @@ class yafrayPluginRender_t : public yafrayRender_t
virtual bool initExport();
virtual bool finishExport();
- void genUVcoords(std::vector<yafray::GFLOAT> &uvcoords,VlakRen *vlr,TFace* uvc, bool comple=false);
+ void genUVcoords(std::vector<yafray::GFLOAT> &uvcoords,VlakRen *vlr,MTFace* uvc, bool comple=false);
void genVcol(std::vector<yafray::CFLOAT> &vcol, VlakRen *vlr, bool comple=false);
void genFace(std::vector<int> &faces,std::vector<std::string> &shaders,std::vector<int> &faceshader,
std::vector<yafray::GFLOAT> &uvcoords,std::vector<yafray::CFLOAT> &vcol,
diff --git a/source/blender/yafray/intern/yafray_Render.cpp b/source/blender/yafray/intern/yafray_Render.cpp
index 32adc38543f..0d9757b19ad 100644
--- a/source/blender/yafray/intern/yafray_Render.cpp
+++ b/source/blender/yafray/intern/yafray_Render.cpp
@@ -134,7 +134,7 @@ bool yafrayRender_t::getAllMatTexObs()
renderobs[vlr->ob->id.name] = vlr->ob;
all_objects[vlr->ob].push_back(vlr);
if (vlr->tface) {
- Image* fc_img = (Image*)vlr->tface->tpage;
+ Image* fc_img = vlr->tface->tpage;
if (fc_img) {
Material* fmat = vlr->mat;
// only save if TexFace enabled