diff options
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, ¢ery, &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); |