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:
-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
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderGL.cpp16
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderGL.h4
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderPolyMaterial.cpp4
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderPolyMaterial.h14
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp13
-rw-r--r--source/gameengine/Converter/BL_BlenderDataConversion.cpp136
-rw-r--r--source/gameengine/GamePlayer/common/GPC_PolygonMaterial.cpp10
-rw-r--r--source/gameengine/GamePlayer/common/GPC_PolygonMaterial.h8
-rw-r--r--source/gameengine/GamePlayer/common/GPC_RenderTools.cpp24
-rw-r--r--source/gameengine/GamePlayer/common/GPC_RenderTools.h3
-rw-r--r--source/gameengine/Ketsji/BL_Material.h10
-rw-r--r--source/gameengine/Ketsji/KX_BlenderMaterial.cpp10
-rw-r--r--source/gameengine/Ketsji/KX_BlenderMaterial.h5
-rw-r--r--source/gameengine/Ketsji/KX_PolygonMaterial.cpp14
-rw-r--r--source/gameengine/Ketsji/KX_PolygonMaterial.h15
89 files changed, 3067 insertions, 5581 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
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp b/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
index af367f1797e..da3bda0a220 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
@@ -110,8 +110,8 @@ void BL_SwapBuffers()
myswapbuffers();
}
-void BL_RenderText(int mode,const char* textstr,int textlen,struct TFace* tface,
- float v1[3],float v2[3],float v3[3],float v4[3])
+void BL_RenderText(int mode,const char* textstr,int textlen,struct MTFace* tface,
+ unsigned int *col,float v1[3],float v2[3],float v3[3],float v4[3])
{
Image* ima;
@@ -131,6 +131,8 @@ void BL_RenderText(int mode,const char* textstr,int textlen,struct TFace* tface,
characters = 0;
}
+ if(!col) glColor3f(1.0f, 1.0f, 1.0f);
+
glPushMatrix();
for (index = 0; index < characters; index++) {
// lets calculate offset stuff
@@ -140,30 +142,30 @@ void BL_RenderText(int mode,const char* textstr,int textlen,struct TFace* tface,
// character = character - ' ' + 1;
matrixGlyph(ima->ibuf, character, & centerx, &centery, &sizex, &sizey, &transx, &transy, &movex, &movey, &advance);
-
+
glBegin(GL_POLYGON);
// printf(" %c %f %f %f %f\n", character, tface->uv[0][0], tface->uv[0][1], );
// glTexCoord2f((tface->uv[0][0] - centerx) * sizex + transx, (tface->uv[0][1] - centery) * sizey + transy);
glTexCoord2f((tface->uv[0][0] - centerx) * sizex + transx, (tface->uv[0][1] - centery) * sizey + transy);
- spack(tface->col[0]);
+ if(col) spack(col[0]);
// glVertex3fv(v1);
glVertex3f(sizex * v1[0] + movex, sizey * v1[1] + movey, v1[2]);
glTexCoord2f((tface->uv[1][0] - centerx) * sizex + transx, (tface->uv[1][1] - centery) * sizey + transy);
- spack(tface->col[1]);
+ if(col) spack(col[1]);
// glVertex3fv(v2);
glVertex3f(sizex * v2[0] + movex, sizey * v2[1] + movey, v2[2]);
glTexCoord2f((tface->uv[2][0] - centerx) * sizex + transx, (tface->uv[2][1] - centery) * sizey + transy);
- spack(tface->col[2]);
+ if(col) spack(col[2]);
// glVertex3fv(v3);
glVertex3f(sizex * v3[0] + movex, sizey * v3[1] + movey, v3[2]);
if(v4) {
// glTexCoord2f((tface->uv[3][0] - centerx) * sizex + transx, 1.0 - (1.0 - tface->uv[3][1]) * sizey - transy);
glTexCoord2f((tface->uv[3][0] - centerx) * sizex + transx, (tface->uv[3][1] - centery) * sizey + transy);
- spack(tface->col[3]);
+ if(col) spack(col[3]);
// glVertex3fv(v4);
glVertex3f(sizex * v4[0] + movex, sizey * v4[1] + movey, v4[2]);
}
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderGL.h b/source/gameengine/BlenderRoutines/KX_BlenderGL.h
index e7cc220f88c..b0f97f1a76c 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderGL.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderGL.h
@@ -49,8 +49,8 @@ void BL_HideMouse();
void BL_NormalMouse();
void BL_WaitMouse();
-void BL_RenderText(int mode,const char* textstr,int textlen,struct TFace* tface,
- float v1[3],float v2[3],float v3[3],float v4[3]);
+void BL_RenderText(int mode,const char* textstr,int textlen,struct MTFace* tface,
+ unsigned int *col,float v1[3],float v2[3],float v3[3],float v4[3]);
void BL_print_gamedebug_line(char* text, int xco, int yco, int width, int height);
void BL_print_gamedebug_line_padded(char* text, int xco, int yco, int width, int height);
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderPolyMaterial.cpp b/source/gameengine/BlenderRoutines/KX_BlenderPolyMaterial.cpp
index df96ae55691..cdb6ce5b829 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderPolyMaterial.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderPolyMaterial.cpp
@@ -48,7 +48,7 @@ KX_BlenderPolyMaterial::KX_BlenderPolyMaterial(const STR_String &texname,
int lightlayer,
bool bIsTriangle,
void* clientobject,
- struct TFace* tface)
+ struct MTFace* tface)
: RAS_IPolyMaterial(texname,
false,
matname,
@@ -79,7 +79,7 @@ void KX_BlenderPolyMaterial::Activate(RAS_IRasterizer* rasty, TCachingInfo& cach
if ((m_drawingmode & 4)&& (rasty->GetDrawingMode() == RAS_IRasterizer::KX_TEXTURED))
{
- update_realtime_texture((struct TFace*) m_tface, rasty->GetTime());
+ update_realtime_texture((struct MTFace*) m_tface, rasty->GetTime());
set_tpage(m_tface);
rasty->EnableTextures(true);
}
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderPolyMaterial.h b/source/gameengine/BlenderRoutines/KX_BlenderPolyMaterial.h
index fd6d39cc8e3..1dab77cb901 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderPolyMaterial.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderPolyMaterial.h
@@ -35,14 +35,14 @@
#include "RAS_MaterialBucket.h"
#include "RAS_IRasterizer.h"
-struct TFace;
-extern "C" int set_tpage(TFace* tface); /* Worst hack ever */
+struct MTFace;
+extern "C" int set_tpage(MTFace* tface); /* Worst hack ever */
#if 0
class KX_BlenderPolyMaterial : public RAS_IPolyMaterial
{
/** Blender texture face structure. */
- TFace* m_tface;
+ MTFace* m_tface;
public:
@@ -58,7 +58,7 @@ public:
int lightlayer,
bool bIsTriangle,
void* clientobject,
- struct TFace* tface);
+ struct MTFace* tface);
/**
* Returns the caching information for this material,
@@ -80,20 +80,20 @@ public:
* Returns the Blender texture face structure that is used for this material.
* @return The material's texture face.
*/
- TFace* GetTFace(void) const;
+ MTFace* GetMTFace(void) const;
protected:
private:
};
-inline TFace* KX_BlenderPolyMaterial::GetTFace(void) const
+inline MTFace* KX_BlenderPolyMaterial::GetMTFace(void) const
{
return m_tface;
}
inline RAS_IPolyMaterial::TCachingInfo KX_BlenderPolyMaterial::GetCachingInfo(void) const
{
- return GetTFace();
+ return GetMTFace();
}
#endif
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
index 9ceae753908..caf3d120fab 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
@@ -256,17 +256,20 @@ void KX_BlenderRenderTools::RenderText(int mode,RAS_IPolyMaterial* polymat,float
STR_String mytext = ((CValue*)m_clientobject)->GetPropertyText("Text");
const unsigned int flag = polymat->GetFlag();
- struct TFace* tface = 0;
+ struct MTFace* tface = 0;
+ unsigned int *col = 0;
if(flag & RAS_BLENDERMAT) {
KX_BlenderMaterial *bl_mat = static_cast<KX_BlenderMaterial*>(polymat);
- tface = bl_mat->GetTFace();
+ tface = bl_mat->GetMTFace();
+ col = bl_mat->GetMCol();
} else {
KX_PolygonMaterial* blenderpoly = static_cast<KX_PolygonMaterial*>(polymat);
- tface = blenderpoly->GetTFace();
+ tface = blenderpoly->GetMTFace();
+ col = blenderpoly->GetMCol();
}
- BL_RenderText( mode,mytext,mytext.Length(),tface,v1,v2,v3,v4);
+ BL_RenderText( mode,mytext,mytext.Length(),tface,col,v1,v2,v3,v4);
}
@@ -445,7 +448,7 @@ RAS_IPolyMaterial* KX_BlenderRenderTools::CreateBlenderPolyMaterial(
texname,
ba,matname,tile,tilexrep,tileyrep,mode,transparant,zsort, lightlayer
- ,bIsTriangle,clientobject,(struct TFace*)tface);*/
+ ,bIsTriangle,clientobject,(struct MTFace*)tface);*/
return NULL;
}
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
index 0399d4e61c1..b0986aeca50 100644
--- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp
+++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
@@ -227,7 +227,6 @@ static void GetRGB(short type,
MFace* mface,
MCol* mmcol,
Material *mat,
- TFace *tface,
unsigned int &c0,
unsigned int &c1,
unsigned int &c2,
@@ -236,7 +235,7 @@ static void GetRGB(short type,
unsigned int colour = 0xFFFFFFFFL;
switch(type)
{
- case 0: // vertex colors?
+ case 0: // vertex colors
{
if(mmcol) {
c0 = KX_Mcol2uint_new(mmcol[0]);
@@ -244,7 +243,6 @@ static void GetRGB(short type,
c2 = KX_Mcol2uint_new(mmcol[2]);
if (mface->v4)
c3 = KX_Mcol2uint_new(mmcol[3]);
- mmcol += 4;
}else // backup white
{
c0 = KX_rgbaint2uint_new(colour);
@@ -276,26 +274,7 @@ static void GetRGB(short type,
c3 = KX_rgbaint2uint_new(colour);
} break;
- case 2: // vertex colors
- {
- if(tface ) {
- c0 = KX_rgbaint2uint_new(tface->col[0]);
- c1 = KX_rgbaint2uint_new(tface->col[1]);
- c2 = KX_rgbaint2uint_new(tface->col[2]);
-
- if (mface->v4) {
- c3 = KX_rgbaint2uint_new(tface->col[3]);
- }
- }else {
- c0 = KX_rgbaint2uint_new(colour);
- c1 = KX_rgbaint2uint_new(colour);
- c2 = KX_rgbaint2uint_new(colour);
- if (mface->v4)
- c3 = KX_rgbaint2uint_new( colour );
- }
- } break;
-
- case 3: // white
+ default: // white
{
c0 = KX_rgbaint2uint_new(colour);
c1 = KX_rgbaint2uint_new(colour);
@@ -307,20 +286,18 @@ static void GetRGB(short type,
}
// ------------------------------------
-BL_Material* ConvertMaterial( Mesh* mesh, Material *mat, TFace* tface, MFace* mface, MCol* mmcol, int lightlayer, Object* blenderobj )
+BL_Material* ConvertMaterial( Mesh* mesh, Material *mat, MTFace* tface, MFace* mface, MCol* mmcol, int lightlayer, Object* blenderobj )
{
//this needs some type of manager
BL_Material *material = new BL_Material();
int numchan = -1;
bool validmat = (mat!=0);
- bool validface = (mesh->tface && tface);
+ bool validface = (mesh->mtface && tface);
short type = 0;
if( validmat )
type = 1; // material color
- else if(mesh->tface && tface)
- type = 2; // vertex colors
material->IdMode = DEFAULT_BLENDER;
@@ -328,8 +305,8 @@ BL_Material* ConvertMaterial( Mesh* mesh, Material *mat, TFace* tface, MFace*
if(validmat) {
// use vertex colors by explicitly setting
- if(mat->mode &MA_VERTEXCOLP)
- type = 2;
+ if(mat->mode &MA_VERTEXCOLP)
+ type = 0;
// use lighting?
material->ras_mode |= ( mat->mode & MA_SHLESS )?0:USE_LIGHT;
@@ -593,7 +570,7 @@ BL_Material* ConvertMaterial( Mesh* mesh, Material *mat, TFace* tface, MFace*
material->tile = 0;
}
unsigned int rgb[4];
- GetRGB(type,mface,mmcol,mat,tface,rgb[0],rgb[1],rgb[2], rgb[3]);
+ GetRGB(type,mface,mmcol,mat,rgb[0],rgb[1],rgb[2], rgb[3]);
material->SetConversionRGB(rgb);
material->SetConversionUV(uv);
@@ -632,7 +609,7 @@ static void BL_ComputeTriTangentSpace(const MT_Vector3 &v1, const MT_Vector3 &v2
static MT_Vector4* BL_ComputeMeshTangentSpace(Mesh* mesh)
{
MFace* mface = static_cast<MFace*>(mesh->mface);
- TFace* tface = static_cast<TFace*>(mesh->tface);
+ MTFace* tface = static_cast<MTFace*>(mesh->mtface);
MT_Vector3 *tan1 = new MT_Vector3[mesh->totvert];
MT_Vector3 *tan2 = new MT_Vector3[mesh->totvert];
@@ -696,7 +673,7 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools*
int lightlayer = blenderobj->lay;
MFace* mface = static_cast<MFace*>(mesh->mface);
- TFace* tface = static_cast<TFace*>(mesh->tface);
+ MTFace* tface = static_cast<MTFace*>(mesh->mtface);
MCol* mmcol = mesh->mcol;
MT_assert(mface || mesh->totface == 0);
@@ -808,10 +785,10 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools*
{
ma = give_current_material(blenderobj, 1);
- Image* bima = ((mesh->tface && tface) ? (Image*) tface->tpage : NULL);
+ Image* bima = ((mesh->mtface && tface) ? (Image*) tface->tpage : NULL);
STR_String imastr =
- ((mesh->tface && tface) ?
+ ((mesh->mtface && tface) ?
(bima? (bima)->id.name : "" ) : "" );
char transp=0;
@@ -825,7 +802,7 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools*
}
- if (mesh->tface && tface)
+ if (mesh->mtface && tface)
{
// Use texface colors if available
//TF_DYNAMIC means the polygon is a collision face
@@ -839,76 +816,59 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools*
uv0 = MT_Point2(tface->uv[0]);
uv1 = MT_Point2(tface->uv[1]);
uv2 = MT_Point2(tface->uv[2]);
- rgb0 = KX_rgbaint2uint_new(tface->col[0]);
- rgb1 = KX_rgbaint2uint_new(tface->col[1]);
- rgb2 = KX_rgbaint2uint_new(tface->col[2]);
if (mface->v4)
- {
uv3 = MT_Point2(tface->uv[3]);
- rgb3 = KX_rgbaint2uint_new(tface->col[3]);
- }
}
- else
+ if (mmcol)
{
- //
- if (mmcol)
- {
- // Use vertex colours
- rgb0 = KX_Mcol2uint_new(mmcol[0]);
- rgb1 = KX_Mcol2uint_new(mmcol[1]);
- rgb2 = KX_Mcol2uint_new(mmcol[2]);
-
-
- if (mface->v4)
- {
- rgb3 = KX_Mcol2uint_new(mmcol[3]);
-
- }
+ // Use vertex colours
+ rgb0 = KX_Mcol2uint_new(mmcol[0]);
+ rgb1 = KX_Mcol2uint_new(mmcol[1]);
+ rgb2 = KX_Mcol2uint_new(mmcol[2]);
- mmcol += 4;
- }
- else
+ if (mface->v4)
+ rgb3 = KX_Mcol2uint_new(mmcol[3]);
+ }
+ else
+ {
+ // If there are no vertex colors OR texfaces,
+ // Initialize face to white and set COLLSION true and everything else FALSE
+ unsigned int colour = 0xFFFFFFFFL;
+ mode = default_face_mode;
+ transp = TF_SOLID;
+ tile = 0;
+ if (ma)
{
- // If there are no vertex colors OR texfaces,
- // Initialize face to white and set COLLSION true and everything else FALSE
- unsigned int colour = 0xFFFFFFFFL;
- mode = default_face_mode;
- transp = TF_SOLID;
- tile = 0;
- if (ma)
+ // If we have a material, take the default colour from the material.
+ union
{
- // If we have a material, take the default colour from the material.
- union
- {
- unsigned char cp[4];
- unsigned int integer;
- } col_converter;
-
- col_converter.cp[3] = (unsigned char) (ma->r*255.0);
- col_converter.cp[2] = (unsigned char) (ma->g*255.0);
- col_converter.cp[1] = (unsigned char) (ma->b*255.0);
- col_converter.cp[0] = (unsigned char) (ma->alpha*255.0);
-
- colour = col_converter.integer;
- }
+ unsigned char cp[4];
+ unsigned int integer;
+ } col_converter;
- rgb0 = KX_rgbaint2uint_new(colour);
- rgb1 = KX_rgbaint2uint_new(colour);
- rgb2 = KX_rgbaint2uint_new(colour);
+ col_converter.cp[3] = (unsigned char) (ma->r*255.0);
+ col_converter.cp[2] = (unsigned char) (ma->g*255.0);
+ col_converter.cp[1] = (unsigned char) (ma->b*255.0);
+ col_converter.cp[0] = (unsigned char) (ma->alpha*255.0);
- if (mface->v4)
- rgb3 = KX_rgbaint2uint_new(colour);
+ colour = col_converter.integer;
}
- }
+ rgb0 = KX_rgbaint2uint_new(colour);
+ rgb1 = KX_rgbaint2uint_new(colour);
+ rgb2 = KX_rgbaint2uint_new(colour);
+
+ if (mface->v4)
+ rgb3 = KX_rgbaint2uint_new(colour);
+ }
bool istriangle = (mface->v4==0);
bool zsort = ma?(ma->mode & MA_ZTRA) != 0:false;
polymat = new KX_PolygonMaterial(imastr, ma,
tile, tilexrep, tileyrep,
- mode, transp, zsort, lightlayer, istriangle, blenderobj, tface);
+ mode, transp, zsort, lightlayer, istriangle, blenderobj, tface, (unsigned int*)mmcol);
if (ma)
{
@@ -985,6 +945,8 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools*
}
if (tface)
tface++;
+ if (mmcol)
+ mmcol+=4;
}
meshobj->UpdateMaterialList();
diff --git a/source/gameengine/GamePlayer/common/GPC_PolygonMaterial.cpp b/source/gameengine/GamePlayer/common/GPC_PolygonMaterial.cpp
index 9cad9fcf932..97cf89e963f 100644
--- a/source/gameengine/GamePlayer/common/GPC_PolygonMaterial.cpp
+++ b/source/gameengine/GamePlayer/common/GPC_PolygonMaterial.cpp
@@ -115,11 +115,11 @@ static void my_make_repbind(Image *ima)
}
}
-extern "C" int set_tpage(TFace *tface);
+extern "C" int set_tpage(MTFace *tface);
-int set_tpage(TFace *tface)
+int set_tpage(MTFace *tface)
{
- static TFace *lasttface= 0;
+ static MTFace *lasttface= 0;
Image *ima;
unsigned int *rect, *bind;
int tpx, tpy, tilemode, tileXRep,tileYRep;
@@ -368,7 +368,7 @@ GPC_PolygonMaterial::GPC_PolygonMaterial(const STR_String& texname, bool ba, con
int tile, int tileXrep, int tileYrep, int mode, bool transparant, bool zsort,
int lightlayer, bool bIsTriangle, void* clientobject, void* tpage) :
RAS_IPolyMaterial(texname, ba, matname, tile, tileXrep, tileYrep, mode,
- transparant, zsort, lightlayer, bIsTriangle, clientobject), m_tface((struct TFace*)tpage)
+ transparant, zsort, lightlayer, bIsTriangle, clientobject), m_tface((struct MTFace*)tpage)
{
// clear local caching info
my_set_tpage(0);
@@ -392,7 +392,7 @@ void GPC_PolygonMaterial::Activate(RAS_IRasterizer* rasty, TCachingInfo& caching
if ((m_drawingmode & 4)&& (rasty->GetDrawingMode() == RAS_IRasterizer::KX_TEXTURED) )
{
- update_realtime_texture((struct TFace*) m_tface, rasty->GetTime());
+ update_realtime_texture((struct MTFace*) m_tface, rasty->GetTime());
my_set_tpage(m_tface);
rasty->EnableTextures(true);
} else
diff --git a/source/gameengine/GamePlayer/common/GPC_PolygonMaterial.h b/source/gameengine/GamePlayer/common/GPC_PolygonMaterial.h
index a091ec6eea4..d9aa3ca4b7e 100644
--- a/source/gameengine/GamePlayer/common/GPC_PolygonMaterial.h
+++ b/source/gameengine/GamePlayer/common/GPC_PolygonMaterial.h
@@ -43,7 +43,7 @@ namespace GPC_PolygonMaterial
#if 0
class GPC_PolygonMaterial : public RAS_IPolyMaterial
{
- struct TFace* m_tface;
+ struct MTFace* m_tface;
public:
GPC_PolygonMaterial(const STR_String& texname, bool ba, const STR_String& matname,
@@ -72,20 +72,20 @@ public:
* Returns the Blender texture face structure that is used for this material.
* @return The material's texture face.
*/
- TFace* GetTFace(void) const;
+ MTFace* GetMTFace(void) const;
static void SetMipMappingEnabled(bool enabled = false);
};
-inline TFace* GPC_PolygonMaterial::GetTFace(void) const
+inline MTFace* GPC_PolygonMaterial::GetMTFace(void) const
{
return m_tface;
}
inline GPC_PolygonMaterial::TCachingInfo GPC_PolygonMaterial::GetCachingInfo(void) const
{
- return GetTFace();
+ return GetMTFace();
}
#endif
#endif // __GPC_POLYGONMATERIAL_H
diff --git a/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp b/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
index 43e823d59ac..59a49c05b3c 100644
--- a/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
+++ b/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
@@ -254,17 +254,20 @@ void GPC_RenderTools::RenderText(
STR_String mytext = ((CValue*)m_clientobject)->GetPropertyText("Text");
const unsigned int flag = polymat->GetFlag();
- struct TFace* tface = 0;
+ struct MTFace* tface = 0;
+ unsigned int* col = 0;
if(flag & RAS_BLENDERMAT) {
KX_BlenderMaterial *bl_mat = static_cast<KX_BlenderMaterial*>(polymat);
- tface = bl_mat->GetTFace();
+ tface = bl_mat->GetMTFace();
+ col = bl_mat->GetMCol();
} else {
KX_PolygonMaterial* blenderpoly = static_cast<KX_PolygonMaterial*>(polymat);
- tface = blenderpoly->GetTFace();
+ tface = blenderpoly->GetMTFace();
+ col = blenderpoly->GetMCol();
}
- BL_RenderText(mode, mytext, mytext.Length(), tface, v1, v2, v3, v4);
+ BL_RenderText(mode, mytext, mytext.Length(), tface, col, v1, v2, v3, v4);
}
@@ -276,7 +279,8 @@ void GPC_RenderTools::BL_RenderText(
int mode,
const char* textstr,
int textlen,
- struct TFace* tface,
+ struct MTFace* tface,
+ unsigned int* col,
float v1[3],float v2[3],float v3[3],float v4[3])
{
struct Image* ima;
@@ -298,6 +302,8 @@ void GPC_RenderTools::BL_RenderText(
characters = 0;
}
+ if(!col) glColor3f(1.0f, 1.0f, 1.0f);
+
glPushMatrix();
for (index = 0; index < characters; index++) {
// lets calculate offset stuff
@@ -313,24 +319,24 @@ void GPC_RenderTools::BL_RenderText(
// glTexCoord2f((tface->uv[0][0] - centerx) * sizex + transx, (tface->uv[0][1] - centery) * sizey + transy);
glTexCoord2f((tface->uv[0][0] - centerx) * sizex + transx, (tface->uv[0][1] - centery) * sizey + transy);
- BL_spack(tface->col[0]);
+ if(col) BL_spack(col[0]);
// glVertex3fv(v1);
glVertex3f(sizex * v1[0] + movex, sizey * v1[1] + movey, v1[2]);
glTexCoord2f((tface->uv[1][0] - centerx) * sizex + transx, (tface->uv[1][1] - centery) * sizey + transy);
- BL_spack(tface->col[1]);
+ if(col) BL_spack(col[1]);
// glVertex3fv(v2);
glVertex3f(sizex * v2[0] + movex, sizey * v2[1] + movey, v2[2]);
glTexCoord2f((tface->uv[2][0] - centerx) * sizex + transx, (tface->uv[2][1] - centery) * sizey + transy);
- BL_spack(tface->col[2]);
+ if(col) BL_spack(col[2]);
// glVertex3fv(v3);
glVertex3f(sizex * v3[0] + movex, sizey * v3[1] + movey, v3[2]);
if(v4) {
// glTexCoord2f((tface->uv[3][0] - centerx) * sizex + transx, 1.0 - (1.0 - tface->uv[3][1]) * sizey - transy);
glTexCoord2f((tface->uv[3][0] - centerx) * sizex + transx, (tface->uv[3][1] - centery) * sizey + transy);
- BL_spack(tface->col[3]);
+ if(col) BL_spack(col[3]);
// glVertex3fv(v4);
glVertex3f(sizex * v4[0] + movex, sizey * v4[1] + movey, v4[2]);
}
diff --git a/source/gameengine/GamePlayer/common/GPC_RenderTools.h b/source/gameengine/GamePlayer/common/GPC_RenderTools.h
index 3ff9479f9da..b7f73df3c34 100644
--- a/source/gameengine/GamePlayer/common/GPC_RenderTools.h
+++ b/source/gameengine/GamePlayer/common/GPC_RenderTools.h
@@ -157,7 +157,8 @@ protected:
int mode,
const char* textstr,
int textlen,
- struct TFace* tface,
+ struct MTFace* tface,
+ unsigned int* col,
float v1[3],float v2[3],float v3[3],float v4[3]);
void BL_spack(unsigned int ucol)
{
diff --git a/source/gameengine/Ketsji/BL_Material.h b/source/gameengine/Ketsji/BL_Material.h
index dbf482e2db3..2656f0d688a 100644
--- a/source/gameengine/Ketsji/BL_Material.h
+++ b/source/gameengine/Ketsji/BL_Material.h
@@ -8,7 +8,7 @@
struct MTex;
struct Material;
struct Image;
-struct TFace;
+struct MTFace;
struct MTex;
struct Material;
struct EnvMap;
@@ -37,9 +37,6 @@ public:
class BL_Material
{
private:
- unsigned int rgb[4];
- MT_Point2 uv[4];
-
int num_users;
bool share;
@@ -76,9 +73,12 @@ public:
Material* material;
- TFace* tface;
+ MTFace* tface;
Image* img[MAXTEX];
EnvMap* cubemap[MAXTEX];
+
+ unsigned int rgb[4];
+ MT_Point2 uv[4];
void SetConversionRGB(unsigned int *rgb);
void GetConversionRGB(unsigned int *rgb);
diff --git a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
index 195fd5bd35f..b505c9ec8dc 100644
--- a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
+++ b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
@@ -44,7 +44,7 @@ extern "C" {
#include "DNA_object_types.h"
#include "DNA_material_types.h"
#include "DNA_image_types.h"
-#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
#include "BKE_mesh.h"
// ------------------------------------
using namespace bgl;
@@ -118,13 +118,19 @@ KX_BlenderMaterial::~KX_BlenderMaterial()
}
-TFace* KX_BlenderMaterial::GetTFace(void) const
+MTFace* KX_BlenderMaterial::GetMTFace(void) const
{
// fonts on polys
MT_assert(mMaterial->tface);
return mMaterial->tface;
}
+unsigned int* KX_BlenderMaterial::GetMCol(void) const
+{
+ // fonts on polys
+ return mMaterial->rgb;
+}
+
void KX_BlenderMaterial::OnConstruction()
{
// for each unique material...
diff --git a/source/gameengine/Ketsji/KX_BlenderMaterial.h b/source/gameengine/Ketsji/KX_BlenderMaterial.h
index 4dac7f294ec..2b1264154d0 100644
--- a/source/gameengine/Ketsji/KX_BlenderMaterial.h
+++ b/source/gameengine/Ketsji/KX_BlenderMaterial.h
@@ -14,7 +14,7 @@
#include "MT_Vector3.h"
#include "MT_Vector4.h"
-struct TFace;
+struct MTFace;
class KX_Scene;
class KX_BlenderMaterial : public PyObjectPlus, public RAS_IPolyMaterial
@@ -61,7 +61,8 @@ public:
)const;
- TFace* GetTFace(void) const;
+ MTFace* GetMTFace(void) const;
+ unsigned int* GetMCol(void) const;
// for ipos
void UpdateIPO(
diff --git a/source/gameengine/Ketsji/KX_PolygonMaterial.cpp b/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
index 89c84d63913..5a15a0375dc 100644
--- a/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
+++ b/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
@@ -45,7 +45,7 @@ extern "C" {
#include "DNA_material_types.h"
#include "DNA_texture_types.h"
#include "DNA_image_types.h"
-#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
#include "IMB_imbuf_types.h"
@@ -67,7 +67,8 @@ KX_PolygonMaterial::KX_PolygonMaterial(const STR_String &texname,
int lightlayer,
bool bIsTriangle,
void* clientobject,
- struct TFace* tface,
+ struct MTFace* tface,
+ unsigned int* mcol,
PyTypeObject *T)
: PyObjectPlus(T),
RAS_IPolyMaterial(texname,
@@ -82,6 +83,7 @@ KX_PolygonMaterial::KX_PolygonMaterial(const STR_String &texname,
bIsTriangle,
clientobject),
m_tface(tface),
+ m_mcol(mcol),
m_material(material),
m_pymaterial(0),
m_pass(0)
@@ -146,7 +148,7 @@ void KX_PolygonMaterial::DefaultActivate(RAS_IRasterizer* rasty, TCachingInfo& c
if ((m_drawingmode & 4)&& (rasty->GetDrawingMode() == RAS_IRasterizer::KX_TEXTURED))
{
- update_realtime_texture((struct TFace*) m_tface, rasty->GetTime());
+ update_realtime_texture((struct MTFace*) m_tface, rasty->GetTime());
set_tpage(m_tface);
rasty->EnableTextures(true);
}
@@ -228,7 +230,7 @@ PyObject* KX_PolygonMaterial::_getattr(const STR_String& attr)
if (attr == "gl_texture")
{
- Image *ima = (Image*) m_tface->tpage;
+ Image *ima = m_tface->tpage;
int bind = 0;
if (ima)
bind = ima->bindcode;
@@ -383,7 +385,7 @@ KX_PYMETHODDEF_DOC(KX_PolygonMaterial, updateTexture, "updateTexture(tface, rast
PyObject *pyrasty, *pytface;
if (PyArg_ParseTuple(args, "O!O!", &PyCObject_Type, &pytface, &PyCObject_Type, &pyrasty))
{
- TFace *tface = (TFace*) PyCObject_AsVoidPtr(pytface);
+ MTFace *tface = (MTFace*) PyCObject_AsVoidPtr(pytface);
RAS_IRasterizer *rasty = (RAS_IRasterizer*) PyCObject_AsVoidPtr(pyrasty);
update_realtime_texture(tface, rasty->GetTime());
Py_Return;
@@ -397,7 +399,7 @@ KX_PYMETHODDEF_DOC(KX_PolygonMaterial, setTexture, "setTexture(tface)")
PyObject *pytface;
if (PyArg_ParseTuple(args, "O!", &PyCObject_Type, &pytface))
{
- TFace *tface = (TFace*) PyCObject_AsVoidPtr(pytface);
+ MTFace *tface = (MTFace*) PyCObject_AsVoidPtr(pytface);
set_tpage(tface);
Py_Return;
}
diff --git a/source/gameengine/Ketsji/KX_PolygonMaterial.h b/source/gameengine/Ketsji/KX_PolygonMaterial.h
index 46c60cab1f7..a9bcba98a78 100644
--- a/source/gameengine/Ketsji/KX_PolygonMaterial.h
+++ b/source/gameengine/Ketsji/KX_PolygonMaterial.h
@@ -37,7 +37,7 @@
#include "RAS_MaterialBucket.h"
#include "RAS_IRasterizer.h"
-struct TFace;
+struct MTFace;
struct Material;
struct MTex;
@@ -52,7 +52,8 @@ class KX_PolygonMaterial : public PyObjectPlus, public RAS_IPolyMaterial
Py_Header;
private:
/** Blender texture face structure. */
- TFace* m_tface;
+ MTFace* m_tface;
+ unsigned int* m_mcol;
Material* m_material;
PyObject* m_pymaterial;
@@ -71,7 +72,8 @@ public:
int lightlayer,
bool bIsTriangle,
void* clientobject,
- struct TFace* tface,
+ struct MTFace* tface,
+ unsigned int* mcol,
PyTypeObject *T = &Type);
virtual ~KX_PolygonMaterial();
@@ -99,10 +101,15 @@ public:
* Returns the Blender texture face structure that is used for this material.
* @return The material's texture face.
*/
- TFace* GetTFace(void) const
+ MTFace* GetMTFace(void) const
{
return m_tface;
}
+
+ unsigned int* GetMCol(void) const
+ {
+ return m_mcol;
+ }
KX_PYMETHOD_DOC(KX_PolygonMaterial, updateTexture);