diff options
Diffstat (limited to 'source')
48 files changed, 628 insertions, 423 deletions
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h index 65e7d47c46c..333ceefa4a1 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.h +++ b/source/blender/blenkernel/BKE_DerivedMesh.h @@ -96,7 +96,6 @@ struct MCol; struct ColorBand; struct GPUVertexAttribs; struct GPUDrawObject; -struct BMEditMesh; struct PBVH; /* number of sub-elements each mesh element has (for interpolation) */ @@ -474,25 +473,17 @@ struct DerivedMesh { void (*release)(DerivedMesh *dm); }; -/** utility function to initialize a DerivedMesh's function pointers to - * the default implementation (for those functions which have a default) - */ void DM_init_funcs(DerivedMesh *dm); -/** utility function to initialize a DerivedMesh for the desired number - * of vertices, edges and faces (doesn't allocate memory for them, just - * sets up the custom data layers) - */ -void DM_init(DerivedMesh *dm, DerivedMeshType type, int numVerts, int numEdges, - int numFaces, int numLoops, int numPolys); +void DM_init( + DerivedMesh *dm, DerivedMeshType type, int numVerts, int numEdges, + int numFaces, int numLoops, int numPolys); -/** utility function to initialize a DerivedMesh for the desired number - * of vertices, edges and faces, with a layer setup copied from source - */ -void DM_from_template(DerivedMesh *dm, DerivedMesh *source, - DerivedMeshType type, - int numVerts, int numEdges, int numFaces, - int numLoops, int numPolys); +void DM_from_template( + DerivedMesh *dm, DerivedMesh *source, + DerivedMeshType type, + int numVerts, int numEdges, int numFaces, + int numLoops, int numPolys); /** utility function to release a DerivedMesh's layers * returns 1 if DerivedMesh has to be released by the backend, 0 otherwise @@ -503,8 +494,9 @@ int DM_release(DerivedMesh *dm); */ void DM_to_mesh(DerivedMesh *dm, struct Mesh *me, struct Object *ob, CustomDataMask mask, bool take_ownership); -struct BMEditMesh *DM_to_editbmesh(struct DerivedMesh *dm, - struct BMEditMesh *existing, const bool do_tessellate); +struct BMEditMesh *DM_to_editbmesh( + struct DerivedMesh *dm, + struct BMEditMesh *existing, const bool do_tessellate); /* conversion to bmesh only */ void DM_to_bmesh_ex(struct DerivedMesh *dm, struct BMesh *bm, const bool calc_face_normal); @@ -514,10 +506,6 @@ struct BMesh *DM_to_bmesh(struct DerivedMesh *dm, const bool calc_face_normal); /** Utility function to convert a DerivedMesh to a shape key block */ void DM_to_meshkey(DerivedMesh *dm, struct Mesh *me, struct KeyBlock *kb); -/** set the CD_FLAG_NOCOPY flag in custom data layers where the mask is - * zero for the layer type, so only layer types specified by the mask - * will be copied - */ void DM_set_only_copy(DerivedMesh *dm, CustomDataMask mask); /* adds a vertex/edge/face custom data layer to a DerivedMesh, optionally @@ -525,16 +513,21 @@ void DM_set_only_copy(DerivedMesh *dm, CustomDataMask mask); * alloctype defines how the layer is allocated or copied, and how it is * freed, see BKE_customdata.h for the different options */ -void DM_add_vert_layer(struct DerivedMesh *dm, int type, int alloctype, - void *layer); -void DM_add_edge_layer(struct DerivedMesh *dm, int type, int alloctype, - void *layer); -void DM_add_tessface_layer(struct DerivedMesh *dm, int type, int alloctype, - void *layer); -void DM_add_loop_layer(DerivedMesh *dm, int type, int alloctype, - void *layer); -void DM_add_poly_layer(struct DerivedMesh *dm, int type, int alloctype, - void *layer); +void DM_add_vert_layer( + struct DerivedMesh *dm, int type, int alloctype, + void *layer); +void DM_add_edge_layer( + struct DerivedMesh *dm, int type, int alloctype, + void *layer); +void DM_add_tessface_layer( + struct DerivedMesh *dm, int type, int alloctype, + void *layer); +void DM_add_loop_layer( + DerivedMesh *dm, int type, int alloctype, + void *layer); +void DM_add_poly_layer( + struct DerivedMesh *dm, int type, int alloctype, + void *layer); /* custom data access functions * return pointer to data from first layer which matches type @@ -569,16 +562,21 @@ void DM_set_tessface_data(struct DerivedMesh *dm, int index, int type, void *dat * copy count elements from source_index in source to dest_index in dest * these copy all layers for which the CD_FLAG_NOCOPY flag is not set */ -void DM_copy_vert_data(struct DerivedMesh *source, struct DerivedMesh *dest, - int source_index, int dest_index, int count); -void DM_copy_edge_data(struct DerivedMesh *source, struct DerivedMesh *dest, - int source_index, int dest_index, int count); -void DM_copy_tessface_data(struct DerivedMesh *source, struct DerivedMesh *dest, - int source_index, int dest_index, int count); -void DM_copy_loop_data(struct DerivedMesh *source, struct DerivedMesh *dest, - int source_index, int dest_index, int count); -void DM_copy_poly_data(struct DerivedMesh *source, struct DerivedMesh *dest, - int source_index, int dest_index, int count); +void DM_copy_vert_data( + struct DerivedMesh *source, struct DerivedMesh *dest, + int source_index, int dest_index, int count); +void DM_copy_edge_data( + struct DerivedMesh *source, struct DerivedMesh *dest, + int source_index, int dest_index, int count); +void DM_copy_tessface_data( + struct DerivedMesh *source, struct DerivedMesh *dest, + int source_index, int dest_index, int count); +void DM_copy_loop_data( + struct DerivedMesh *source, struct DerivedMesh *dest, + int source_index, int dest_index, int count); +void DM_copy_poly_data( + struct DerivedMesh *source, struct DerivedMesh *dest, + int source_index, int dest_index, int count); /* custom data free functions * free count elements, starting at index @@ -601,49 +599,36 @@ void DM_update_tessface_data(DerivedMesh *dm); void DM_update_materials(DerivedMesh *dm, struct Object *ob); struct MTFace *DM_paint_uvlayer_active_get(DerivedMesh *dm, int mat_nr); -/** interpolates vertex data from the vertices indexed by src_indices in the - * source mesh using the given weights and stores the result in the vertex - * indexed by dest_index in the dest mesh - */ -void DM_interp_vert_data(struct DerivedMesh *source, struct DerivedMesh *dest, - int *src_indices, float *weights, - int count, int dest_index); - -/** interpolates edge data from the edges indexed by src_indices in the - * source mesh using the given weights and stores the result in the edge indexed - * by dest_index in the dest mesh. - * if weights is NULL, all weights default to 1. - * if vert_weights is non-NULL, any per-vertex edge data is interpolated using - * vert_weights[i] multiplied by weights[i]. - */ +void DM_interp_vert_data( + struct DerivedMesh *source, struct DerivedMesh *dest, + int *src_indices, float *weights, + int count, int dest_index); + typedef float EdgeVertWeight[SUB_ELEMS_EDGE][SUB_ELEMS_EDGE]; -void DM_interp_edge_data(struct DerivedMesh *source, struct DerivedMesh *dest, - int *src_indices, - float *weights, EdgeVertWeight *vert_weights, - int count, int dest_index); - -/** interpolates face data from the faces indexed by src_indices in the - * source mesh using the given weights and stores the result in the face indexed - * by dest_index in the dest mesh. - * if weights is NULL, all weights default to 1. - * if vert_weights is non-NULL, any per-vertex face data is interpolated using - * vert_weights[i] multiplied by weights[i]. - */ +void DM_interp_edge_data( + struct DerivedMesh *source, struct DerivedMesh *dest, + int *src_indices, + float *weights, EdgeVertWeight *vert_weights, + int count, int dest_index); + typedef float FaceVertWeight[SUB_ELEMS_FACE][SUB_ELEMS_FACE]; -void DM_interp_tessface_data(struct DerivedMesh *source, struct DerivedMesh *dest, - int *src_indices, - float *weights, FaceVertWeight *vert_weights, - int count, int dest_index); +void DM_interp_tessface_data( + struct DerivedMesh *source, struct DerivedMesh *dest, + int *src_indices, + float *weights, FaceVertWeight *vert_weights, + int count, int dest_index); void DM_swap_tessface_data(struct DerivedMesh *dm, int index, const int *corner_indices); -void DM_interp_loop_data(struct DerivedMesh *source, struct DerivedMesh *dest, - int *src_indices, - float *weights, int count, int dest_index); +void DM_interp_loop_data( + struct DerivedMesh *source, struct DerivedMesh *dest, + int *src_indices, + float *weights, int count, int dest_index); -void DM_interp_poly_data(struct DerivedMesh *source, struct DerivedMesh *dest, - int *src_indices, - float *weights, int count, int dest_index); +void DM_interp_poly_data( + struct DerivedMesh *source, struct DerivedMesh *dest, + int *src_indices, + float *weights, int count, int dest_index); /* Temporary? A function to give a colorband to derivedmesh for vertexcolor ranges */ void vDM_ColorBand_store(const struct ColorBand *coba, const char alert_color[4]); @@ -658,56 +643,67 @@ DMCoNo *mesh_get_mapped_verts_nors(struct Scene *scene, struct Object *ob); void mesh_get_mapped_verts_coords(DerivedMesh *dm, float (*r_cos)[3], const int totcos); /* */ -DerivedMesh *mesh_get_derived_final(struct Scene *scene, struct Object *ob, - CustomDataMask dataMask); -DerivedMesh *mesh_get_derived_deform(struct Scene *scene, struct Object *ob, - CustomDataMask dataMask); +DerivedMesh *mesh_get_derived_final( + struct Scene *scene, struct Object *ob, + CustomDataMask dataMask); +DerivedMesh *mesh_get_derived_deform( + struct Scene *scene, struct Object *ob, + CustomDataMask dataMask); -DerivedMesh *mesh_create_derived_for_modifier(struct Scene *scene, struct Object *ob, - struct ModifierData *md, int build_shapekey_layers); +DerivedMesh *mesh_create_derived_for_modifier( + struct Scene *scene, struct Object *ob, + struct ModifierData *md, int build_shapekey_layers); -DerivedMesh *mesh_create_derived_render(struct Scene *scene, struct Object *ob, - CustomDataMask dataMask); +DerivedMesh *mesh_create_derived_render( + struct Scene *scene, struct Object *ob, + CustomDataMask dataMask); -DerivedMesh *getEditDerivedBMesh(struct BMEditMesh *em, struct Object *ob, - float (*vertexCos)[3]); +DerivedMesh *getEditDerivedBMesh( + struct BMEditMesh *em, struct Object *ob, + float (*vertexCos)[3]); -DerivedMesh *mesh_create_derived_index_render(struct Scene *scene, struct Object *ob, CustomDataMask dataMask, int index); +DerivedMesh *mesh_create_derived_index_render( + struct Scene *scene, struct Object *ob, + CustomDataMask dataMask, int index); /* same as above but wont use render settings */ DerivedMesh *mesh_create_derived(struct Mesh *me, float (*vertCos)[3]); -DerivedMesh *mesh_create_derived_view(struct Scene *scene, struct Object *ob, - CustomDataMask dataMask); -DerivedMesh *mesh_create_derived_no_deform(struct Scene *scene, struct Object *ob, - float (*vertCos)[3], - CustomDataMask dataMask); -DerivedMesh *mesh_create_derived_no_deform_render(struct Scene *scene, struct Object *ob, - float (*vertCos)[3], - CustomDataMask dataMask); +DerivedMesh *mesh_create_derived_view( + struct Scene *scene, struct Object *ob, + CustomDataMask dataMask); +DerivedMesh *mesh_create_derived_no_deform( + struct Scene *scene, struct Object *ob, + float (*vertCos)[3], + CustomDataMask dataMask); +DerivedMesh *mesh_create_derived_no_deform_render( + struct Scene *scene, struct Object *ob, + float (*vertCos)[3], + CustomDataMask dataMask); /* for gameengine */ -DerivedMesh *mesh_create_derived_no_virtual(struct Scene *scene, struct Object *ob, float (*vertCos)[3], - CustomDataMask dataMask); -DerivedMesh *mesh_create_derived_physics(struct Scene *scene, struct Object *ob, float (*vertCos)[3], - CustomDataMask dataMask); - -DerivedMesh *editbmesh_get_derived_base(struct Object *, struct BMEditMesh *em); -DerivedMesh *editbmesh_get_derived_cage(struct Scene *scene, struct Object *, - struct BMEditMesh *em, CustomDataMask dataMask); -DerivedMesh *editbmesh_get_derived_cage_and_final(struct Scene *scene, struct Object *, - struct BMEditMesh *em, DerivedMesh **r_final, - CustomDataMask dataMask); +DerivedMesh *mesh_create_derived_no_virtual( + struct Scene *scene, struct Object *ob, float (*vertCos)[3], + CustomDataMask dataMask); +DerivedMesh *mesh_create_derived_physics( + struct Scene *scene, struct Object *ob, float (*vertCos)[3], + CustomDataMask dataMask); + +DerivedMesh *editbmesh_get_derived_base( + struct Object *, struct BMEditMesh *em); +DerivedMesh *editbmesh_get_derived_cage( + struct Scene *scene, struct Object *, + struct BMEditMesh *em, CustomDataMask dataMask); +DerivedMesh *editbmesh_get_derived_cage_and_final( + struct Scene *scene, struct Object *, + struct BMEditMesh *em, CustomDataMask dataMask, + DerivedMesh **r_final); DerivedMesh *object_get_derived_final(struct Object *ob, const bool for_render); float (*editbmesh_get_vertex_cos(struct BMEditMesh *em, int *r_numVerts))[3]; bool editbmesh_modifier_is_enabled(struct Scene *scene, struct ModifierData *md, DerivedMesh *dm); -void makeDerivedMesh(struct Scene *scene, struct Object *ob, struct BMEditMesh *em, - CustomDataMask dataMask, int build_shapekey_layers); - -/** returns an array of deform matrices for crazyspace correction, and the - * number of modifiers left */ -int editbmesh_get_first_deform_matrices(struct Scene *, struct Object *, struct BMEditMesh *em, - float (**deformmats)[3][3], float (**deformcos)[3]); +void makeDerivedMesh( + struct Scene *scene, struct Object *ob, struct BMEditMesh *em, + CustomDataMask dataMask, const bool build_shapekey_layers); void weight_to_rgb(float r_rgb[3], const float weight); /** Update the weight MCOL preview layer. @@ -717,8 +713,9 @@ void weight_to_rgb(float r_rgb[3], const float weight); * Else, it must be of num length, as indices, which contains vertices' idx to apply weights to. * (other vertices are assumed zero weight). */ -void DM_update_weight_mcol(struct Object *ob, struct DerivedMesh *dm, int const draw_flag, - float *weights, int num, const int *indices); +void DM_update_weight_mcol( + struct Object *ob, struct DerivedMesh *dm, int const draw_flag, + float *weights, int num, const int *indices); /** convert layers requested by a GLSL material to actually available layers in * the DerivedMesh, with both a pointer for arrays and an offset for editmesh */ @@ -746,8 +743,9 @@ typedef struct DMVertexAttribs { int tottface, totmcol, tottang, totorco; } DMVertexAttribs; -void DM_vertex_attributes_from_gpu(DerivedMesh *dm, - struct GPUVertexAttribs *gattribs, DMVertexAttribs *attribs); +void DM_vertex_attributes_from_gpu( + DerivedMesh *dm, + struct GPUVertexAttribs *gattribs, DMVertexAttribs *attribs); void DM_draw_attrib_vertex(DMVertexAttribs *attribs, int a, int index, int vert); @@ -768,9 +766,11 @@ void DM_debug_print_cdlayers(CustomData *cdata); bool DM_is_valid(DerivedMesh *dm); #endif -BLI_INLINE int DM_origindex_mface_mpoly(const int *index_mf_to_mpoly, const int *index_mp_to_orig, const int i) ATTR_NONNULL(1); +BLI_INLINE int DM_origindex_mface_mpoly( + const int *index_mf_to_mpoly, const int *index_mp_to_orig, const int i) ATTR_NONNULL(1); -BLI_INLINE int DM_origindex_mface_mpoly(const int *index_mf_to_mpoly, const int *index_mp_to_orig, const int i) +BLI_INLINE int DM_origindex_mface_mpoly( + const int *index_mf_to_mpoly, const int *index_mp_to_orig, const int i) { const int j = index_mf_to_mpoly[i]; return (j != ORIGINDEX_NONE) ? (index_mp_to_orig ? index_mp_to_orig[j] : j) : ORIGINDEX_NONE; diff --git a/source/blender/blenkernel/BKE_crazyspace.h b/source/blender/blenkernel/BKE_crazyspace.h index 98bcdc5cfaa..ee6c5c57678 100644 --- a/source/blender/blenkernel/BKE_crazyspace.h +++ b/source/blender/blenkernel/BKE_crazyspace.h @@ -40,13 +40,22 @@ struct BMEditMesh; struct Mesh; /* crazyspace.c */ -float (*BKE_crazyspace_get_mapped_editverts(struct Scene *scene, struct Object *obedit))[3]; +float (*BKE_crazyspace_get_mapped_editverts( + struct Scene *scene, struct Object *obedit))[3]; void BKE_crazyspace_set_quats_editmesh( struct BMEditMesh *em, float (*origcos)[3], float (*mappedcos)[3], float (*quats)[4], const bool use_select); -void BKE_crazyspace_set_quats_mesh(struct Mesh *me, float (*origcos)[3], float (*mappedcos)[3], float (*quats)[4]); -int BKE_sculpt_get_first_deform_matrices(struct Scene *scene, struct Object *ob, float (**deformmats)[3][3], float (**deformcos)[3]); -void BKE_crazyspace_build_sculpt(struct Scene *scene, struct Object *ob, float (**deformmats)[3][3], float (**deformcos)[3]); +void BKE_crazyspace_set_quats_mesh( + struct Mesh *me, float (*origcos)[3], float (*mappedcos)[3], float (*quats)[4]); +int BKE_crazyspace_get_first_deform_matrices_editbmesh( + struct Scene *, struct Object *, struct BMEditMesh *em, + float (**deformmats)[3][3], float (**deformcos)[3]); +int BKE_sculpt_get_first_deform_matrices( + struct Scene *scene, struct Object *ob, + float (**deformmats)[3][3], float (**deformcos)[3]); +void BKE_crazyspace_build_sculpt( + struct Scene *scene, struct Object *ob, + float (**deformmats)[3][3], float (**deformcos)[3]); #ifdef __cplusplus } diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 0f3a87b19e2..7ced227f5b7 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -245,6 +245,10 @@ static CustomData *dm_getPolyCData(DerivedMesh *dm) return &dm->polyData; } +/** + * Utility function to initialize a DerivedMesh's function pointers to + * the default implementation (for those functions which have a default) + */ void DM_init_funcs(DerivedMesh *dm) { /* default function implementations */ @@ -278,8 +282,14 @@ void DM_init_funcs(DerivedMesh *dm) bvhcache_init(&dm->bvhCache); } -void DM_init(DerivedMesh *dm, DerivedMeshType type, int numVerts, int numEdges, - int numTessFaces, int numLoops, int numPolys) +/** + * Utility function to initialize a DerivedMesh for the desired number + * of vertices, edges and faces (doesn't allocate memory for them, just + * sets up the custom data layers) + */ +void DM_init( + DerivedMesh *dm, DerivedMeshType type, int numVerts, int numEdges, + int numTessFaces, int numLoops, int numPolys) { dm->type = type; dm->numVertData = numVerts; @@ -302,9 +312,14 @@ void DM_init(DerivedMesh *dm, DerivedMeshType type, int numVerts, int numEdges, copy_vn_i(dm->polyData.typemap, CD_NUMTYPES, -1); } -void DM_from_template(DerivedMesh *dm, DerivedMesh *source, DerivedMeshType type, - int numVerts, int numEdges, int numTessFaces, - int numLoops, int numPolys) +/** + * Utility function to initialize a DerivedMesh for the desired number + * of vertices, edges and faces, with a layer setup copied from source + */ +void DM_from_template( + DerivedMesh *dm, DerivedMesh *source, DerivedMeshType type, + int numVerts, int numEdges, int numTessFaces, + int numLoops, int numPolys) { CustomData_copy(&source->vertData, &dm->vertData, CD_MASK_DERIVEDMESH, CD_CALLOC, numVerts); @@ -678,7 +693,9 @@ void DM_to_meshkey(DerivedMesh *dm, Mesh *me, KeyBlock *kb) float *fp; MVert *mvert; - if (totvert == 0 || me->totvert == 0 || me->totvert != totvert) return; + if (totvert == 0 || me->totvert == 0 || me->totvert != totvert) { + return; + } if (kb->data) MEM_freeN(kb->data); kb->data = MEM_mallocN(me->key->elemsize * me->totvert, "kb->data"); @@ -692,6 +709,11 @@ void DM_to_meshkey(DerivedMesh *dm, Mesh *me, KeyBlock *kb) } } +/** + * set the CD_FLAG_NOCOPY flag in custom data layers where the mask is + * zero for the layer type, so only layer types specified by the mask + * will be copied + */ void DM_set_only_copy(DerivedMesh *dm, CustomDataMask mask) { CustomData_set_only_copy(&dm->vertData, mask); @@ -865,27 +887,51 @@ void DM_free_poly_data(struct DerivedMesh *dm, int index, int count) CustomData_free_elem(&dm->polyData, index, count); } -void DM_interp_vert_data(DerivedMesh *source, DerivedMesh *dest, - int *src_indices, float *weights, - int count, int dest_index) +/** + * interpolates vertex data from the vertices indexed by src_indices in the + * source mesh using the given weights and stores the result in the vertex + * indexed by dest_index in the dest mesh + */ +void DM_interp_vert_data( + DerivedMesh *source, DerivedMesh *dest, + int *src_indices, float *weights, + int count, int dest_index) { CustomData_interp(&source->vertData, &dest->vertData, src_indices, weights, NULL, count, dest_index); } -void DM_interp_edge_data(DerivedMesh *source, DerivedMesh *dest, - int *src_indices, - float *weights, EdgeVertWeight *vert_weights, - int count, int dest_index) +/** + * interpolates edge data from the edges indexed by src_indices in the + * source mesh using the given weights and stores the result in the edge indexed + * by dest_index in the dest mesh. + * if weights is NULL, all weights default to 1. + * if vert_weights is non-NULL, any per-vertex edge data is interpolated using + * vert_weights[i] multiplied by weights[i]. + */ +void DM_interp_edge_data( + DerivedMesh *source, DerivedMesh *dest, + int *src_indices, + float *weights, EdgeVertWeight *vert_weights, + int count, int dest_index) { CustomData_interp(&source->edgeData, &dest->edgeData, src_indices, weights, (float *)vert_weights, count, dest_index); } -void DM_interp_tessface_data(DerivedMesh *source, DerivedMesh *dest, - int *src_indices, - float *weights, FaceVertWeight *vert_weights, - int count, int dest_index) +/** + * interpolates face data from the faces indexed by src_indices in the + * source mesh using the given weights and stores the result in the face indexed + * by dest_index in the dest mesh. + * if weights is NULL, all weights default to 1. + * if vert_weights is non-NULL, any per-vertex face data is interpolated using + * vert_weights[i] multiplied by weights[i]. + */ +void DM_interp_tessface_data( + DerivedMesh *source, DerivedMesh *dest, + int *src_indices, + float *weights, FaceVertWeight *vert_weights, + int count, int dest_index) { CustomData_interp(&source->faceData, &dest->faceData, src_indices, weights, (float *)vert_weights, count, dest_index); @@ -896,23 +942,24 @@ void DM_swap_tessface_data(DerivedMesh *dm, int index, const int *corner_indices CustomData_swap(&dm->faceData, index, corner_indices); } -void DM_interp_loop_data(DerivedMesh *source, DerivedMesh *dest, - int *src_indices, - float *weights, int count, int dest_index) +void DM_interp_loop_data( + DerivedMesh *source, DerivedMesh *dest, + int *src_indices, + float *weights, int count, int dest_index) { CustomData_interp(&source->loopData, &dest->loopData, src_indices, weights, NULL, count, dest_index); } -void DM_interp_poly_data(DerivedMesh *source, DerivedMesh *dest, - int *src_indices, - float *weights, int count, int dest_index) +void DM_interp_poly_data( + DerivedMesh *source, DerivedMesh *dest, + int *src_indices, + float *weights, int count, int dest_index) { CustomData_interp(&source->polyData, &dest->polyData, src_indices, weights, NULL, count, dest_index); } -/// DerivedMesh *mesh_create_derived(Mesh *me, float (*vertCos)[3]) { DerivedMesh *dm = CDDM_from_mesh(me); @@ -927,8 +974,9 @@ DerivedMesh *mesh_create_derived(Mesh *me, float (*vertCos)[3]) return dm; } -DerivedMesh *mesh_create_derived_for_modifier(Scene *scene, Object *ob, - ModifierData *md, int build_shapekey_layers) +DerivedMesh *mesh_create_derived_for_modifier( + Scene *scene, Object *ob, + ModifierData *md, int build_shapekey_layers) { Mesh *me = ob->data; const ModifierTypeInfo *mti = modifierType_getInfo(md->type); @@ -937,8 +985,13 @@ DerivedMesh *mesh_create_derived_for_modifier(Scene *scene, Object *ob, md->scene = scene; - if (!(md->mode & eModifierMode_Realtime)) return NULL; - if (mti->isDisabled && mti->isDisabled(md, 0)) return NULL; + if (!(md->mode & eModifierMode_Realtime)) { + return NULL; + } + + if (mti->isDisabled && mti->isDisabled(md, 0)) { + return NULL; + } if (build_shapekey_layers && me->key && (kb = BLI_findlink(&me->key->block, ob->shapenr - 1))) { BKE_keyblock_convert_to_mesh(kb, me); @@ -1028,8 +1081,12 @@ static DerivedMesh *create_orco_dm(Object *ob, Mesh *me, BMEditMesh *em, int lay float (*orco)[3]; int free; - if (em) dm = CDDM_from_editbmesh(em, false, false); - else dm = CDDM_from_mesh(me); + if (em) { + dm = CDDM_from_editbmesh(em, false, false); + } + else { + dm = CDDM_from_mesh(me); + } orco = get_orco_coords_dm(ob, em, layer, &free); @@ -1041,8 +1098,9 @@ static DerivedMesh *create_orco_dm(Object *ob, Mesh *me, BMEditMesh *em, int lay return dm; } -static void add_orco_dm(Object *ob, BMEditMesh *em, DerivedMesh *dm, - DerivedMesh *orcodm, int layer) +static void add_orco_dm( + Object *ob, BMEditMesh *em, DerivedMesh *dm, + DerivedMesh *orcodm, int layer) { float (*orco)[3], (*layerorco)[3]; int totvert, free; @@ -1233,13 +1291,16 @@ void vDM_ColorBand_store(const ColorBand *coba, const char alert_color[4]) G_dm_wcinfo.alert_color = alert_color; } -/* return an array of vertex weight colors, caller must free. +/** + * return an array of vertex weight colors, caller must free. * - * note that we could save some memory and allocate RGB only but then we'd need to + * \note that we could save some memory and allocate RGB only but then we'd need to * re-arrange the colors when copying to the face since MCol has odd ordering, - * so leave this as is - campbell */ -static void calc_weightpaint_vert_array(Object *ob, DerivedMesh *dm, int const draw_flag, DMWeightColorInfo *dm_wcinfo, - unsigned char (*r_wtcol_v)[4]) + * so leave this as is - campbell + */ +static void calc_weightpaint_vert_array( + Object *ob, DerivedMesh *dm, int const draw_flag, DMWeightColorInfo *dm_wcinfo, + unsigned char (*r_wtcol_v)[4]) { MDeformVert *dv = DM_get_vert_data_layer(dm, CD_MDEFORMVERT); int numVerts = dm->getNumVerts(dm); @@ -1280,13 +1341,15 @@ static void calc_weightpaint_vert_array(Object *ob, DerivedMesh *dm, int const d } } -/* return an array of vertex weight colors from given weights, caller must free. +/** return an array of vertex weight colors from given weights, caller must free. * - * note that we could save some memory and allocate RGB only but then we'd need to + * \note that we could save some memory and allocate RGB only but then we'd need to * re-arrange the colors when copying to the face since MCol has odd ordering, - * so leave this as is - campbell */ -static void calc_colors_from_weights_array(const int num, const float *weights, - unsigned char (*r_wtcol_v)[4]) + * so leave this as is - campbell + */ +static void calc_colors_from_weights_array( + const int num, const float *weights, + unsigned char (*r_wtcol_v)[4]) { unsigned char (*wc)[4] = r_wtcol_v; int i; @@ -1296,8 +1359,9 @@ static void calc_colors_from_weights_array(const int num, const float *weights, } } -void DM_update_weight_mcol(Object *ob, DerivedMesh *dm, int const draw_flag, - float *weights, int num, const int *indices) +void DM_update_weight_mcol( + Object *ob, DerivedMesh *dm, int const draw_flag, + float *weights, int num, const int *indices) { BMEditMesh *em = (dm->type == DM_TYPE_EDITBMESH) ? BKE_editmesh_from_object(ob) : NULL; unsigned char (*wtcol_v)[4]; @@ -1491,16 +1555,21 @@ static void dm_ensure_display_normals(DerivedMesh *dm) CDDM_calc_normals_mapping_ex(dm, (dm->dirty & DM_DIRTY_NORMALS) ? false : true); } } -/* new value for useDeform -1 (hack for the gameengine): + +/** + * new value for useDeform -1 (hack for the gameengine): + * * - apply only the modifier stack of the object, skipping the virtual modifiers, * - don't apply the key * - apply deform modifiers and input vertexco */ -static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos)[3], - DerivedMesh **deform_r, DerivedMesh **final_r, - int useRenderParams, int useDeform, - int needMapping, CustomDataMask dataMask, - int index, int useCache, int build_shapekey_layers) +static void mesh_calc_modifiers( + Scene *scene, Object *ob, float (*inputVertexCos)[3], + const bool useRenderParams, int useDeform, + const bool need_mapping, CustomDataMask dataMask, + const int index, const bool useCache, const bool build_shapekey_layers, + /* return args */ + DerivedMesh **r_deform, DerivedMesh **r_final) { Mesh *me = ob->data; ModifierData *firstmd, *md, *previewmd = NULL; @@ -1510,7 +1579,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos float (*deformedVerts)[3] = NULL; DerivedMesh *dm = NULL, *orcodm, *clothorcodm, *finaldm; int numVerts = me->totvert; - int required_mode; + const int required_mode = useRenderParams ? eModifierMode_Render : eModifierMode_Realtime; bool isPrevDeform = false; const bool skipVirtualArmature = (useDeform < 0); MultiresModifierData *mmd = get_multires_modifier(scene, ob, 0); @@ -1537,6 +1606,8 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos ModifierApplyFlag app_flags = useRenderParams ? MOD_APPLY_RENDER : 0; ModifierApplyFlag deform_app_flags = app_flags; + + if (useCache) app_flags |= MOD_APPLY_USECACHE; if (useDeform) @@ -1556,9 +1627,6 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos modifiers_clearErrors(ob); - if (useRenderParams) required_mode = eModifierMode_Render; - else required_mode = eModifierMode_Realtime; - if (do_mod_wmcol || do_mod_mcol) { /* Find the last active modifier generating a preview, or NULL if none. */ /* XXX Currently, DPaint modifier just ignores this. @@ -1577,8 +1645,10 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos datamasks = modifiers_calcDataMasks(scene, ob, md, dataMask, required_mode, previewmd, previewmask); curr = datamasks; - if (deform_r) *deform_r = NULL; - *final_r = NULL; + if (r_deform) { + *r_deform = NULL; + } + *r_final = NULL; if (useDeform) { if (inputVertexCos) @@ -1590,8 +1660,13 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos md->scene = scene; - if (!modifier_isEnabled(scene, md, required_mode)) continue; - if (useDeform < 0 && mti->dependsOnTime && mti->dependsOnTime(md)) continue; + if (!modifier_isEnabled(scene, md, required_mode)) { + continue; + } + + if (useDeform < 0 && mti->dependsOnTime && mti->dependsOnTime(md)) { + continue; + } if (mti->type == eModifierTypeType_OnlyDeform && !sculpt_dyntopo) { if (!deformedVerts) @@ -1604,7 +1679,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos } /* grab modifiers until index i */ - if ((index >= 0) && (BLI_findindex(&ob->modifiers, md) >= index)) + if ((index != -1) && (BLI_findindex(&ob->modifiers, md) >= index)) break; } @@ -1612,14 +1687,14 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos * places that wish to use the original mesh but with deformed * coordinates (vpaint, etc.) */ - if (deform_r) { - *deform_r = CDDM_from_mesh(me); + if (r_deform) { + *r_deform = CDDM_from_mesh(me); if (build_shapekey_layers) add_shapekey_layers(dm, me, ob); if (deformedVerts) { - CDDM_apply_vert_coords(*deform_r, deformedVerts); + CDDM_apply_vert_coords(*r_deform, deformedVerts); } } } @@ -1644,12 +1719,19 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos md->scene = scene; - if (!modifier_isEnabled(scene, md, required_mode)) continue; - if (mti->type == eModifierTypeType_OnlyDeform && !useDeform) continue; + if (!modifier_isEnabled(scene, md, required_mode)) { + continue; + } + + if (mti->type == eModifierTypeType_OnlyDeform && !useDeform) { + continue; + } + if ((mti->flags & eModifierTypeFlag_RequiresOriginalData) && dm) { modifier_setError(md, "Modifier requires original data, bad stack position"); continue; } + if (sculpt_mode && (!has_multires || multires_applied || sculpt_dyntopo)) { @@ -1657,8 +1739,9 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos if (md->type == eModifierType_Multires && ((MultiresModifierData *)md)->sculptlvl == 0) { /* If multires is on level 0 skip it silently without warning message. */ - if (!sculpt_dyntopo) + if (!sculpt_dyntopo) { continue; + } } if (sculpt_dyntopo && !useRenderParams) @@ -1680,8 +1763,14 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos modifier_setError(md, "Hide, Mask and optimized display disabled"); } } - if (needMapping && !modifier_supportsMapping(md)) continue; - if (useDeform < 0 && mti->dependsOnTime && mti->dependsOnTime(md)) continue; + + if (need_mapping && !modifier_supportsMapping(md)) { + continue; + } + + if (useDeform < 0 && mti->dependsOnTime && mti->dependsOnTime(md)) { + continue; + } /* add an orco layer if needed by this modifier */ if (mti->requiredDataMask) @@ -1766,7 +1855,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos * requests it, this way Mirror, Solidify etc will keep ORIGINDEX * data by using generic DM_copy_vert_data() functions. */ - if (needMapping || (nextmask & CD_MASK_ORIGINDEX)) { + if (need_mapping || (nextmask & CD_MASK_ORIGINDEX)) { /* calc */ DM_add_vert_layer(dm, CD_ORIGINDEX, CD_CALLOC, NULL); DM_add_edge_layer(dm, CD_ORIGINDEX, CD_CALLOC, NULL); @@ -1790,7 +1879,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos /* needMapping check here fixes bug [#28112], otherwise its * possible that it wont be copied */ mask |= append_mask; - DM_set_only_copy(dm, mask | (needMapping ? CD_MASK_ORIGINDEX : 0)); + DM_set_only_copy(dm, mask | (need_mapping ? CD_MASK_ORIGINDEX : 0)); /* add cloth rest shape key if need */ if (mask & CD_MASK_CLOTH_ORCO) @@ -1854,7 +1943,9 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos if (ndm) { /* if the modifier returned a new dm, release the old one */ - if (clothorcodm && clothorcodm != ndm) clothorcodm->release(clothorcodm); + if (clothorcodm && clothorcodm != ndm) { + clothorcodm->release(clothorcodm); + } clothorcodm = ndm; } } @@ -1873,7 +1964,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos isPrevDeform = (mti->type == eModifierTypeType_OnlyDeform); /* grab modifiers until index i */ - if ((index >= 0) && (BLI_findindex(&ob->modifiers, md) >= index)) + if ((index != -1) && (BLI_findindex(&ob->modifiers, md) >= index)) break; if (sculpt_mode && md->type == eModifierType_Multires) { @@ -1930,8 +2021,8 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos if (dataMask & CD_MASK_ORCO) { add_orco_dm(ob, NULL, finaldm, orcodm, CD_ORCO); - if (deform_r && *deform_r) - add_orco_dm(ob, NULL, *deform_r, NULL, CD_ORCO); + if (r_deform && *r_deform) + add_orco_dm(ob, NULL, *r_deform, NULL, CD_ORCO); } if (do_loop_normals) { @@ -1968,7 +2059,7 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos } #endif /* WITH_GAMEENGINE */ - *final_r = finaldm; + *r_final = finaldm; if (orcodm) orcodm->release(orcodm); @@ -2002,9 +2093,12 @@ float (*editbmesh_get_vertex_cos(BMEditMesh *em, int *r_numVerts))[3] bool editbmesh_modifier_is_enabled(Scene *scene, ModifierData *md, DerivedMesh *dm) { const ModifierTypeInfo *mti = modifierType_getInfo(md->type); - int required_mode = eModifierMode_Realtime | eModifierMode_Editmode; + const int required_mode = eModifierMode_Realtime | eModifierMode_Editmode; + + if (!modifier_isEnabled(scene, md, required_mode)) { + return false; + } - if (!modifier_isEnabled(scene, md, required_mode)) return 0; if ((mti->flags & eModifierTypeFlag_RequiresOriginalData) && dm) { modifier_setError(md, "Modifier requires original data, bad stack position"); return false; @@ -2013,9 +2107,11 @@ bool editbmesh_modifier_is_enabled(Scene *scene, ModifierData *md, DerivedMesh * return true; } -static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, DerivedMesh **cage_r, - DerivedMesh **final_r, - CustomDataMask dataMask) +static void editbmesh_calc_modifiers( + Scene *scene, Object *ob, BMEditMesh *em, + CustomDataMask dataMask, + /* return args */ + DerivedMesh **r_cage, DerivedMesh **r_final) { ModifierData *md, *previewmd = NULL; float (*deformedVerts)[3] = NULL; @@ -2023,7 +2119,7 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D DerivedMesh *dm = NULL, *orcodm = NULL; int i, numVerts = 0, cageIndex = modifiers_getCageIndex(scene, ob, NULL, 1); CDMaskLink *datamasks, *curr; - int required_mode = eModifierMode_Realtime | eModifierMode_Editmode; + const int required_mode = eModifierMode_Realtime | eModifierMode_Editmode; int draw_flag = dm_drawflag_calc(scene->toolsettings); // const bool do_mod_mcol = true; // (ob->mode == OB_MODE_OBJECT); @@ -2041,8 +2137,8 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D modifiers_clearErrors(ob); - if (cage_r && cageIndex == -1) { - *cage_r = getEditDerivedBMesh(em, ob, NULL); + if (r_cage && cageIndex == -1) { + *r_cage = getEditDerivedBMesh(em, ob, NULL); } md = modifiers_getVirtualModifierList(ob, &virtualModifierData); @@ -2064,8 +2160,9 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D md->scene = scene; - if (!editbmesh_modifier_is_enabled(scene, md, dm)) + if (!editbmesh_modifier_is_enabled(scene, md, dm)) { continue; + } /* add an orco layer if needed by this modifier */ if (dm && mti->requiredDataMask) { @@ -2109,14 +2206,15 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D if (dm) { if (deformedVerts) { DerivedMesh *tdm = CDDM_copy(dm); - if (!(cage_r && dm == *cage_r)) dm->release(dm); + if (!(r_cage && dm == *r_cage)) { + dm->release(dm); + } dm = tdm; CDDM_apply_vert_coords(dm, deformedVerts); } - else if (cage_r && dm == *cage_r) { - /* dm may be changed by this modifier, so we need to copy it - */ + else if (r_cage && dm == *r_cage) { + /* dm may be changed by this modifier, so we need to copy it */ dm = CDDM_copy(dm); } @@ -2196,18 +2294,18 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D append_mask |= CD_MASK_PREVIEW_MLOOPCOL; } - if (cage_r && i == cageIndex) { + if (r_cage && i == cageIndex) { if (dm && deformedVerts) { - *cage_r = CDDM_copy(dm); - CDDM_apply_vert_coords(*cage_r, deformedVerts); + *r_cage = CDDM_copy(dm); + CDDM_apply_vert_coords(*r_cage, deformedVerts); } else if (dm) { - *cage_r = dm; + *r_cage = dm; } else { - *cage_r = - getEditDerivedBMesh(em, ob, - deformedVerts ? MEM_dupallocN(deformedVerts) : NULL); + *r_cage = getEditDerivedBMesh( + em, ob, + deformedVerts ? MEM_dupallocN(deformedVerts) : NULL); } } } @@ -2219,42 +2317,44 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D * then we need to build one. */ if (dm && deformedVerts) { - *final_r = CDDM_copy(dm); + *r_final = CDDM_copy(dm); - if (!(cage_r && dm == *cage_r)) dm->release(dm); + if (!(r_cage && dm == *r_cage)) { + dm->release(dm); + } - CDDM_apply_vert_coords(*final_r, deformedVerts); + CDDM_apply_vert_coords(*r_final, deformedVerts); } else if (dm) { - *final_r = dm; + *r_final = dm; } - else if (!deformedVerts && cage_r && *cage_r) { + else if (!deformedVerts && r_cage && *r_cage) { /* cage should already have up to date normals */ - *final_r = *cage_r; + *r_final = *r_cage; /* In this case, we should never have weight-modifying modifiers in stack... */ if (do_init_wmcol) - DM_update_weight_mcol(ob, *final_r, draw_flag, NULL, 0, NULL); + DM_update_weight_mcol(ob, *r_final, draw_flag, NULL, 0, NULL); if (do_init_statvis) - DM_update_statvis_color(scene, ob, *final_r); + DM_update_statvis_color(scene, ob, *r_final); } else { /* this is just a copy of the editmesh, no need to calc normals */ - *final_r = getEditDerivedBMesh(em, ob, deformedVerts); + *r_final = getEditDerivedBMesh(em, ob, deformedVerts); deformedVerts = NULL; /* In this case, we should never have weight-modifying modifiers in stack... */ if (do_init_wmcol) - DM_update_weight_mcol(ob, *final_r, draw_flag, NULL, 0, NULL); + DM_update_weight_mcol(ob, *r_final, draw_flag, NULL, 0, NULL); if (do_init_statvis) - DM_update_statvis_color(scene, ob, *final_r); + DM_update_statvis_color(scene, ob, *r_final); } if (do_loop_normals) { /* Compute loop normals */ - DM_calc_loop_normals(*final_r, do_loop_normals, loop_normals_split_angle); - if (cage_r && *cage_r && (*cage_r != *final_r)) { - DM_calc_loop_normals(*cage_r, do_loop_normals, loop_normals_split_angle); + DM_calc_loop_normals(*r_final, do_loop_normals, loop_normals_split_angle); + if (r_cage && *r_cage && (*r_cage != *r_final)) { + DM_calc_loop_normals(*r_cage, do_loop_normals, loop_normals_split_angle); } } @@ -2263,13 +2363,13 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D * but don't recalculate if the last modifier in the stack gives us tessfaces * check if the derived meshes are DM_TYPE_EDITBMESH before calling, this isn't essential * but quiets annoying error messages since tessfaces wont be created. */ - if ((*final_r)->type != DM_TYPE_EDITBMESH) { - DM_ensure_tessface(*final_r); + if ((*r_final)->type != DM_TYPE_EDITBMESH) { + DM_ensure_tessface(*r_final); } - if (cage_r && *cage_r) { - if ((*cage_r)->type != DM_TYPE_EDITBMESH) { - if (*cage_r != *final_r) { - DM_ensure_tessface(*cage_r); + if (r_cage && *r_cage) { + if ((*r_cage)->type != DM_TYPE_EDITBMESH) { + if (*r_cage != *r_final) { + DM_ensure_tessface(*r_cage); } } } @@ -2277,12 +2377,12 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D /* same as mesh_calc_modifiers (if using loop normals, poly nors have already been computed). */ if (!do_loop_normals) { - dm_ensure_display_normals(*final_r); + dm_ensure_display_normals(*r_final); } /* add an orco layer if needed */ if (dataMask & CD_MASK_ORCO) - add_orco_dm(ob, em, *final_r, orcodm, CD_ORCO); + add_orco_dm(ob, em, *r_final, orcodm, CD_ORCO); if (orcodm) orcodm->release(orcodm); @@ -2291,24 +2391,25 @@ static void editbmesh_calc_modifiers(Scene *scene, Object *ob, BMEditMesh *em, D MEM_freeN(deformedVerts); } -static void mesh_build_data(Scene *scene, Object *ob, CustomDataMask dataMask, - int build_shapekey_layers, int needMapping) +static void mesh_build_data( + Scene *scene, Object *ob, CustomDataMask dataMask, + const bool build_shapekey_layers, const bool need_mapping) { BLI_assert(ob->type == OB_MESH); BKE_object_free_derived_caches(ob); BKE_object_sculpt_modifiers_changed(ob); - mesh_calc_modifiers(scene, ob, NULL, &ob->derivedDeform, - &ob->derivedFinal, 0, 1, - needMapping, dataMask, -1, 1, build_shapekey_layers); + mesh_calc_modifiers( + scene, ob, NULL, false, 1, need_mapping, dataMask, -1, true, build_shapekey_layers, + &ob->derivedDeform, &ob->derivedFinal); DM_set_object_boundbox(ob, ob->derivedFinal); ob->derivedFinal->needsFree = 0; ob->derivedDeform->needsFree = 0; ob->lastDataMask = dataMask; - ob->lastNeedMapping = needMapping; + ob->lastNeedMapping = need_mapping; if ((ob->mode & OB_MODE_SCULPT) && ob->sculpt) { /* create PBVH immediately (would be created on the fly too, @@ -2327,7 +2428,10 @@ static void editbmesh_build_data(Scene *scene, Object *obedit, BMEditMesh *em, C BKE_editmesh_free_derivedmesh(em); - editbmesh_calc_modifiers(scene, obedit, em, &em->derivedCage, &em->derivedFinal, dataMask); + editbmesh_calc_modifiers( + scene, obedit, em, dataMask, + &em->derivedCage, &em->derivedFinal); + DM_set_object_boundbox(obedit, em->derivedFinal); em->lastDataMask = dataMask; @@ -2337,20 +2441,22 @@ static void editbmesh_build_data(Scene *scene, Object *obedit, BMEditMesh *em, C BLI_assert(!(em->derivedFinal->dirty & DM_DIRTY_NORMALS)); } -static CustomDataMask object_get_datamask(const Scene *scene, Object *ob, int *r_needmapping) +static CustomDataMask object_get_datamask(const Scene *scene, Object *ob, bool *r_need_mapping) { Object *actob = scene->basact ? scene->basact->object : NULL; CustomDataMask mask = ob->customdata_mask; bool editing = BKE_paint_select_face_test(ob); - if (r_needmapping) - *r_needmapping = 0; + if (r_need_mapping) { + *r_need_mapping = false; + } if (ob == actob) { /* weight paint and face select need original indices because of selection buffer drawing */ - if (r_needmapping) - *r_needmapping = (editing || (ob->mode & (OB_MODE_WEIGHT_PAINT | OB_MODE_VERTEX_PAINT))); + if (r_need_mapping) { + *r_need_mapping = (editing || (ob->mode & (OB_MODE_WEIGHT_PAINT | OB_MODE_VERTEX_PAINT))); + } /* check if we need tfaces & mcols due to face select or texture paint */ if ((ob->mode & OB_MODE_TEXTURE_PAINT) || editing) { @@ -2373,17 +2479,18 @@ static CustomDataMask object_get_datamask(const Scene *scene, Object *ob, int *r return mask; } -void makeDerivedMesh(Scene *scene, Object *ob, BMEditMesh *em, - CustomDataMask dataMask, int build_shapekey_layers) +void makeDerivedMesh( + Scene *scene, Object *ob, BMEditMesh *em, + CustomDataMask dataMask, const bool build_shapekey_layers) { - int needMapping; - dataMask |= object_get_datamask(scene, ob, &needMapping); + bool need_mapping; + dataMask |= object_get_datamask(scene, ob, &need_mapping); if (em) { editbmesh_build_data(scene, ob, em, dataMask); } else { - mesh_build_data(scene, ob, dataMask, build_shapekey_layers, needMapping); + mesh_build_data(scene, ob, dataMask, build_shapekey_layers, need_mapping); } } @@ -2394,11 +2501,15 @@ DerivedMesh *mesh_get_derived_final(Scene *scene, Object *ob, CustomDataMask dat /* if there's no derived mesh or the last data mask used doesn't include * the data we need, rebuild the derived mesh */ - int needMapping; - dataMask |= object_get_datamask(scene, ob, &needMapping); + bool need_mapping; + dataMask |= object_get_datamask(scene, ob, &need_mapping); - if (!ob->derivedFinal || (dataMask & ob->lastDataMask) != dataMask || (needMapping != ob->lastNeedMapping)) - mesh_build_data(scene, ob, dataMask, 0, needMapping); + if (!ob->derivedFinal || + ((dataMask & ob->lastDataMask) != dataMask) || + (need_mapping != ob->lastNeedMapping)) + { + mesh_build_data(scene, ob, dataMask, false, need_mapping); + } if (ob->derivedFinal) { BLI_assert(!(ob->derivedFinal->dirty & DM_DIRTY_NORMALS)); } return ob->derivedFinal; @@ -2409,12 +2520,16 @@ DerivedMesh *mesh_get_derived_deform(Scene *scene, Object *ob, CustomDataMask da /* if there's no derived mesh or the last data mask used doesn't include * the data we need, rebuild the derived mesh */ - int needmapping; + bool need_mapping; - dataMask |= object_get_datamask(scene, ob, &needmapping); + dataMask |= object_get_datamask(scene, ob, &need_mapping); - if (!ob->derivedDeform || (dataMask & ob->lastDataMask) != dataMask || (needmapping != ob->lastNeedMapping)) - mesh_build_data(scene, ob, dataMask, 0, needmapping); + if (!ob->derivedDeform || + ((dataMask & ob->lastDataMask) != dataMask) || + (need_mapping != ob->lastNeedMapping)) + { + mesh_build_data(scene, ob, dataMask, false, need_mapping); + } return ob->derivedDeform; } @@ -2423,7 +2538,9 @@ DerivedMesh *mesh_create_derived_render(Scene *scene, Object *ob, CustomDataMask { DerivedMesh *final; - mesh_calc_modifiers(scene, ob, NULL, NULL, &final, 1, 1, 0, dataMask, -1, 0, 0); + mesh_calc_modifiers( + scene, ob, NULL, true, 1, false, dataMask, -1, false, false, + NULL, &final); return final; } @@ -2431,13 +2548,17 @@ DerivedMesh *mesh_create_derived_render(Scene *scene, Object *ob, CustomDataMask DerivedMesh *mesh_create_derived_index_render(Scene *scene, Object *ob, CustomDataMask dataMask, int index) { DerivedMesh *final; - - mesh_calc_modifiers(scene, ob, NULL, NULL, &final, 1, 1, 0, dataMask, index, 0, 0); + + mesh_calc_modifiers( + scene, ob, NULL, true, 1, false, dataMask, index, false, false, + NULL, &final); return final; } -DerivedMesh *mesh_create_derived_view(Scene *scene, Object *ob, CustomDataMask dataMask) +DerivedMesh *mesh_create_derived_view( + Scene *scene, Object *ob, + CustomDataMask dataMask) { DerivedMesh *final; @@ -2447,58 +2568,75 @@ DerivedMesh *mesh_create_derived_view(Scene *scene, Object *ob, CustomDataMask d */ ob->transflag |= OB_NO_PSYS_UPDATE; - mesh_calc_modifiers(scene, ob, NULL, NULL, &final, 0, 1, 0, dataMask, -1, 0, 0); + mesh_calc_modifiers( + scene, ob, NULL, false, 1, false, dataMask, -1, false, false, + NULL, &final); ob->transflag &= ~OB_NO_PSYS_UPDATE; return final; } -DerivedMesh *mesh_create_derived_no_deform(Scene *scene, Object *ob, float (*vertCos)[3], - CustomDataMask dataMask) +DerivedMesh *mesh_create_derived_no_deform( + Scene *scene, Object *ob, float (*vertCos)[3], + CustomDataMask dataMask) { DerivedMesh *final; - mesh_calc_modifiers(scene, ob, vertCos, NULL, &final, 0, 0, 0, dataMask, -1, 0, 0); + mesh_calc_modifiers( + scene, ob, vertCos, false, 0, false, dataMask, -1, false, false, + NULL, &final); return final; } -DerivedMesh *mesh_create_derived_no_virtual(Scene *scene, Object *ob, float (*vertCos)[3], - CustomDataMask dataMask) +DerivedMesh *mesh_create_derived_no_virtual( + Scene *scene, Object *ob, float (*vertCos)[3], + CustomDataMask dataMask) { DerivedMesh *final; - mesh_calc_modifiers(scene, ob, vertCos, NULL, &final, 0, -1, 0, dataMask, -1, 0, 0); + mesh_calc_modifiers( + scene, ob, vertCos, false, -1, false, dataMask, -1, false, false, + NULL, &final); return final; } -DerivedMesh *mesh_create_derived_physics(Scene *scene, Object *ob, float (*vertCos)[3], - CustomDataMask dataMask) +DerivedMesh *mesh_create_derived_physics( + Scene *scene, Object *ob, float (*vertCos)[3], + CustomDataMask dataMask) { DerivedMesh *final; - mesh_calc_modifiers(scene, ob, vertCos, NULL, &final, 0, -1, 1, dataMask, -1, 0, 0); + mesh_calc_modifiers( + scene, ob, vertCos, false, -1, true, dataMask, -1, false, false, + NULL, &final); return final; } -DerivedMesh *mesh_create_derived_no_deform_render(Scene *scene, Object *ob, - float (*vertCos)[3], - CustomDataMask dataMask) +DerivedMesh *mesh_create_derived_no_deform_render( + Scene *scene, Object *ob, + float (*vertCos)[3], + CustomDataMask dataMask) { DerivedMesh *final; - mesh_calc_modifiers(scene, ob, vertCos, NULL, &final, 1, 0, 0, dataMask, -1, 0, 0); + mesh_calc_modifiers( + scene, ob, vertCos, true, 0, false, dataMask, -1, false, false, + NULL, &final); return final; } /***/ -DerivedMesh *editbmesh_get_derived_cage_and_final(Scene *scene, Object *obedit, BMEditMesh *em, DerivedMesh **r_final, - CustomDataMask dataMask) +DerivedMesh *editbmesh_get_derived_cage_and_final( + Scene *scene, Object *obedit, BMEditMesh *em, + CustomDataMask dataMask, + /* return args */ + DerivedMesh **r_final) { /* if there's no derived mesh or the last data mask used doesn't include * the data we need, rebuild the derived mesh @@ -2627,8 +2765,9 @@ typedef struct { BLI_bitmap *vertex_visit; } MappedUserData; -static void make_vertexcos__mapFunc(void *userData, int index, const float co[3], - const float UNUSED(no_f[3]), const short UNUSED(no_s[3])) +static void make_vertexcos__mapFunc( + void *userData, int index, const float co[3], + const float UNUSED(no_f[3]), const short UNUSED(no_s[3])) { MappedUserData *mappedData = (MappedUserData *)userData; @@ -2851,16 +2990,24 @@ void DM_calc_auto_bump_scale(DerivedMesh *dm) /* discard degenerate faces */ is_degenerate = 0; - if (equals_v3v3(verts[0], verts[1]) || equals_v3v3(verts[0], verts[2]) || equals_v3v3(verts[1], verts[2]) || - equals_v2v2(tex_coords[0], tex_coords[1]) || equals_v2v2(tex_coords[0], tex_coords[2]) || equals_v2v2(tex_coords[1], tex_coords[2])) + if (equals_v3v3(verts[0], verts[1]) || + equals_v3v3(verts[0], verts[2]) || + equals_v3v3(verts[1], verts[2]) || + equals_v2v2(tex_coords[0], tex_coords[1]) || + equals_v2v2(tex_coords[0], tex_coords[2]) || + equals_v2v2(tex_coords[1], tex_coords[2])) { is_degenerate = 1; } /* verify last vertex as well if this is a quad */ if (is_degenerate == 0 && nr_verts == 4) { - if (equals_v3v3(verts[3], verts[0]) || equals_v3v3(verts[3], verts[1]) || equals_v3v3(verts[3], verts[2]) || - equals_v2v2(tex_coords[3], tex_coords[0]) || equals_v2v2(tex_coords[3], tex_coords[1]) || equals_v2v2(tex_coords[3], tex_coords[2])) + if (equals_v3v3(verts[3], verts[0]) || + equals_v3v3(verts[3], verts[1]) || + equals_v3v3(verts[3], verts[2]) || + equals_v2v2(tex_coords[3], tex_coords[0]) || + equals_v2v2(tex_coords[3], tex_coords[1]) || + equals_v2v2(tex_coords[3], tex_coords[2])) { is_degenerate = 1; } @@ -3413,8 +3560,9 @@ void DM_init_origspace(DerivedMesh *dm) #ifndef NDEBUG #include "BLI_dynstr.h" -static void dm_debug_info_layers(DynStr *dynstr, DerivedMesh *dm, CustomData *cd, - void *(*getElemDataArray)(DerivedMesh *, int)) +static void dm_debug_info_layers( + DynStr *dynstr, DerivedMesh *dm, CustomData *cd, + void *(*getElemDataArray)(DerivedMesh *, int)) { int type; diff --git a/source/blender/blenkernel/intern/crazyspace.c b/source/blender/blenkernel/intern/crazyspace.c index 392aac13999..c8de0786697 100644 --- a/source/blender/blenkernel/intern/crazyspace.c +++ b/source/blender/blenkernel/intern/crazyspace.c @@ -108,7 +108,7 @@ float (*BKE_crazyspace_get_mapped_editverts(Scene *scene, Object *obedit))[3] /* disable subsurf temporal, get mapped cos, and enable it */ if (modifiers_disable_subsurf_temporary(obedit)) { /* need to make new derivemesh */ - makeDerivedMesh(scene, obedit, me->edit_btmesh, CD_MASK_BAREMESH, 0); + makeDerivedMesh(scene, obedit, me->edit_btmesh, CD_MASK_BAREMESH, false); } /* now get the cage */ @@ -247,7 +247,9 @@ void BKE_crazyspace_set_quats_mesh(Mesh *me, float (*origcos)[3], float (*mapped } } -int editbmesh_get_first_deform_matrices(Scene *scene, Object *ob, BMEditMesh *em, +/** returns an array of deform matrices for crazyspace correction, and the + * number of modifiers left */ +int BKE_crazyspace_get_first_deform_matrices_editbmesh(Scene *scene, Object *ob, BMEditMesh *em, float (**deformmats)[3][3], float (**deformcos)[3]) { ModifierData *md; diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c index fbce501f57f..63cec629bf3 100644 --- a/source/blender/blenkernel/intern/editderivedmesh.c +++ b/source/blender/blenkernel/intern/editderivedmesh.c @@ -2359,7 +2359,7 @@ float (*BKE_editmesh_vertexCos_get(BMEditMesh *em, Scene *scene, int *r_numVerts struct CageUserData data; float (*cos_cage)[3]; - cage = editbmesh_get_derived_cage_and_final(scene, em->ob, em, &final, CD_MASK_BAREMESH); + cage = editbmesh_get_derived_cage_and_final(scene, em->ob, em, CD_MASK_BAREMESH, &final); cos_cage = MEM_callocN(sizeof(*cos_cage) * em->bm->totvert, "bmbvh cos_cage"); /* when initializing cage verts, we only want the first cage coordinate for each vertex, diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c index 09fbf392590..077afe5ef62 100644 --- a/source/blender/blenkernel/intern/fcurve.c +++ b/source/blender/blenkernel/intern/fcurve.c @@ -335,6 +335,7 @@ FCurve *rna_get_fcurve_context_ui(bContext *C, PointerRNA *ptr, PropertyRNA *pro /* there must be some RNA-pointer + property combon */ if (prop && tptr.id.data && RNA_property_animateable(&tptr, prop)) { AnimData *adt = BKE_animdata_from_id(tptr.id.data); + AnimData *adt_initial = adt; int step = C ? 2 : 1; /* Always 1 in case we have no context (can't check in 'ancestors' of given RNA ptr). */ char *path = NULL; @@ -391,11 +392,15 @@ FCurve *rna_get_fcurve_context_ui(bContext *C, PointerRNA *ptr, PropertyRNA *pro } /* if we still haven't found anything, check whether it's a "special" property */ - if ((fcu == NULL) && (adt && adt->nla_tracks.first)) { + /* NOTE: Need to go back to the original AnimData (vs one further up the chain, + * that we'd get after the loop above failed), or else this check will not + * work for Materials + */ + if ((fcu == NULL) && (adt_initial && adt_initial->nla_tracks.first)) { NlaTrack *nlt; const char *propname = RNA_property_identifier(prop); - for (nlt = adt->nla_tracks.first; nlt; nlt = nlt->next) { + for (nlt = adt_initial->nla_tracks.first; nlt; nlt = nlt->next) { NlaStrip *strip; if (fcu) diff --git a/source/blender/blenkernel/intern/object_update.c b/source/blender/blenkernel/intern/object_update.c index 6752beb6d3b..6ac3f624355 100644 --- a/source/blender/blenkernel/intern/object_update.c +++ b/source/blender/blenkernel/intern/object_update.c @@ -202,10 +202,10 @@ void BKE_object_handle_data_update(EvaluationContext *eval_ctx, } #endif if (em) { - makeDerivedMesh(scene, ob, em, data_mask, 0); /* was CD_MASK_BAREMESH */ + makeDerivedMesh(scene, ob, em, data_mask, false); /* was CD_MASK_BAREMESH */ } else { - makeDerivedMesh(scene, ob, NULL, data_mask, 0); + makeDerivedMesh(scene, ob, NULL, data_mask, false); } break; } diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c index c9af73ce4a9..f2d5c853ef7 100644 --- a/source/blender/blenkernel/intern/sequencer.c +++ b/source/blender/blenkernel/intern/sequencer.c @@ -1125,7 +1125,7 @@ const char *BKE_sequence_give_name(Sequence *seq) const char *name = give_seqname_by_type(seq->type); if (!name) { - if (seq->type < SEQ_TYPE_EFFECT) { + if (!(seq->type & SEQ_TYPE_EFFECT)) { return seq->strip->dir; } else { @@ -4273,7 +4273,7 @@ void BKE_sequence_single_fix(Sequence *seq) bool BKE_sequence_tx_test(Sequence *seq) { - return (seq->type < SEQ_TYPE_EFFECT) || (BKE_sequence_effect_get_num_inputs(seq->type) == 0); + return !(seq->type & SEQ_TYPE_EFFECT) || (BKE_sequence_effect_get_num_inputs(seq->type) == 0); } static bool seq_overlap(Sequence *seq1, Sequence *seq2) @@ -5296,13 +5296,11 @@ static Sequence *seq_dupli(Scene *scene, Scene *scene_to, Sequence *seq, int dup seqn->strip->stripdata = MEM_dupallocN(seq->strip->stripdata); } - else if (seq->type >= SEQ_TYPE_EFFECT) { - if (seq->type & SEQ_TYPE_EFFECT) { - struct SeqEffectHandle sh; - sh = BKE_sequence_get_effect(seq); - if (sh.copy) - sh.copy(seq, seqn); - } + else if (seq->type & SEQ_TYPE_EFFECT) { + struct SeqEffectHandle sh; + sh = BKE_sequence_get_effect(seq); + if (sh.copy) + sh.copy(seq, seqn); seqn->strip->stripdata = NULL; @@ -5325,7 +5323,7 @@ static void seq_new_fix_links_recursive(Sequence *seq) { SequenceModifierData *smd; - if (seq->type >= SEQ_TYPE_EFFECT) { + if (seq->type & SEQ_TYPE_EFFECT) { if (seq->seq1 && seq->seq1->tmp) seq->seq1 = seq->seq1->tmp; if (seq->seq2 && seq->seq2->tmp) seq->seq2 = seq->seq2->tmp; if (seq->seq3 && seq->seq3->tmp) seq->seq3 = seq->seq3->tmp; diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h index d462b9e7ad3..b6b72ad4fff 100644 --- a/source/blender/editors/include/ED_screen.h +++ b/source/blender/editors/include/ED_screen.h @@ -61,11 +61,14 @@ void ED_region_tag_redraw_partial(struct ARegion *ar, const struct rcti *rct) void ED_region_tag_redraw_overlay(struct ARegion *ar); void ED_region_tag_refresh_ui(struct ARegion *ar); void ED_region_panels_init(struct wmWindowManager *wm, struct ARegion *ar); -void ED_region_panels(const struct bContext *C, struct ARegion *ar, int vertical, const char *context, int contextnr); +void ED_region_panels( + const struct bContext *C, struct ARegion *ar, + const char *context, int contextnr, + const bool vertical); void ED_region_header_init(struct ARegion *ar); void ED_region_header(const struct bContext *C, struct ARegion *ar); void ED_region_toggle_hidden(struct bContext *C, struct ARegion *ar); -void ED_region_info_draw(struct ARegion *ar, const char *text, int block, float fill_color[4]); +void ED_region_info_draw(struct ARegion *ar, const char *text, float fill_color[4], const bool full_redraw); void ED_region_image_metadata_draw(int x, int y, struct ImBuf *ibuf, rctf frame, float zoomx, float zoomy); void ED_region_grid_draw(struct ARegion *ar, float zoomx, float zoomy); void ED_region_draw_backdrop_view3d(const struct bContext *C, struct Object *camera, const float alpha, diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c index c2d2bffbbe5..560dacf72b2 100644 --- a/source/blender/editors/object/object_relations.c +++ b/source/blender/editors/object/object_relations.c @@ -145,7 +145,7 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op) /* derivedMesh might be needed for solving parenting, * so re-create it here */ - makeDerivedMesh(scene, obedit, em, CD_MASK_BAREMESH | CD_MASK_ORIGINDEX, 0); + makeDerivedMesh(scene, obedit, em, CD_MASK_BAREMESH | CD_MASK_ORIGINDEX, false); BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) { if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) { diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index 74aedcba4aa..2b3493ade92 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -792,13 +792,13 @@ static void clean_viewport_memory(Main *bmain, Scene *scene, int renderlay) if ((base->lay & renderlay) == 0) { continue; } - if (RE_allow_render_generic_object(base->object)) { base->object->id.flag &= ~LIB_DOIT; } } - for (object = bmain->object.first; object; object = object->id.next) { + for (SETLOOPER(scene, sce_iter, base)) { + object = base->object; if ((object->id.flag & LIB_DOIT) == 0) { continue; } diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c index 0da78eee86b..aeba68f7a47 100644 --- a/source/blender/editors/screen/area.c +++ b/source/blender/editors/screen/area.c @@ -1818,7 +1818,7 @@ int ED_area_header_switchbutton(const bContext *C, uiBlock *block, int yco) /************************ standard UI regions ************************/ -void ED_region_panels(const bContext *C, ARegion *ar, int vertical, const char *context, int contextnr) +void ED_region_panels(const bContext *C, ARegion *ar, const char *context, int contextnr, const bool vertical) { ScrArea *sa = CTX_wm_area(C); uiStyle *style = UI_style_get_dpi(); @@ -2132,7 +2132,7 @@ int ED_area_headersize(void) return (int)(HEADERY * UI_DPI_FAC); } -void ED_region_info_draw(ARegion *ar, const char *text, int block, float fill_color[4]) +void ED_region_info_draw(ARegion *ar, const char *text, float fill_color[4], const bool full_redraw) { const int header_height = UI_UNIT_Y; uiStyle *style = UI_style_get_dpi(); @@ -2145,7 +2145,7 @@ void ED_region_info_draw(ARegion *ar, const char *text, int block, float fill_co rect.ymin = BLI_rcti_size_y(&ar->winrct) - header_height; /* box fill entire width or just around text */ - if (!block) + if (!full_redraw) rect.xmax = min_ii(rect.xmax, rect.xmin + BLF_width(fontid, text, BLF_DRAW_STR_DUMMY_MAX) + 1.2f * U.widget_unit); rect.ymax = BLI_rcti_size_y(&ar->winrct); diff --git a/source/blender/editors/space_buttons/space_buttons.c b/source/blender/editors/space_buttons/space_buttons.c index a778df4b783..6704431c705 100644 --- a/source/blender/editors/space_buttons/space_buttons.c +++ b/source/blender/editors/space_buttons/space_buttons.c @@ -137,38 +137,38 @@ static void buttons_main_area_draw(const bContext *C, ARegion *ar) { /* draw entirely, view changes should be handled here */ SpaceButs *sbuts = CTX_wm_space_buts(C); - int vertical = (sbuts->align == BUT_VERTICAL); + const bool vertical = (sbuts->align == BUT_VERTICAL); buttons_context_compute(C, sbuts); if (sbuts->mainb == BCONTEXT_SCENE) - ED_region_panels(C, ar, vertical, "scene", sbuts->mainb); + ED_region_panels(C, ar, "scene", sbuts->mainb, vertical); else if (sbuts->mainb == BCONTEXT_RENDER) - ED_region_panels(C, ar, vertical, "render", sbuts->mainb); + ED_region_panels(C, ar, "render", sbuts->mainb, vertical); else if (sbuts->mainb == BCONTEXT_RENDER_LAYER) - ED_region_panels(C, ar, vertical, "render_layer", sbuts->mainb); + ED_region_panels(C, ar, "render_layer", sbuts->mainb, vertical); else if (sbuts->mainb == BCONTEXT_WORLD) - ED_region_panels(C, ar, vertical, "world", sbuts->mainb); + ED_region_panels(C, ar, "world", sbuts->mainb, vertical); else if (sbuts->mainb == BCONTEXT_OBJECT) - ED_region_panels(C, ar, vertical, "object", sbuts->mainb); + ED_region_panels(C, ar, "object", sbuts->mainb, vertical); else if (sbuts->mainb == BCONTEXT_DATA) - ED_region_panels(C, ar, vertical, "data", sbuts->mainb); + ED_region_panels(C, ar, "data", sbuts->mainb, vertical); else if (sbuts->mainb == BCONTEXT_MATERIAL) - ED_region_panels(C, ar, vertical, "material", sbuts->mainb); + ED_region_panels(C, ar, "material", sbuts->mainb, vertical); else if (sbuts->mainb == BCONTEXT_TEXTURE) - ED_region_panels(C, ar, vertical, "texture", sbuts->mainb); + ED_region_panels(C, ar, "texture", sbuts->mainb, vertical); else if (sbuts->mainb == BCONTEXT_PARTICLE) - ED_region_panels(C, ar, vertical, "particle", sbuts->mainb); + ED_region_panels(C, ar, "particle", sbuts->mainb, vertical); else if (sbuts->mainb == BCONTEXT_PHYSICS) - ED_region_panels(C, ar, vertical, "physics", sbuts->mainb); + ED_region_panels(C, ar, "physics", sbuts->mainb, vertical); else if (sbuts->mainb == BCONTEXT_BONE) - ED_region_panels(C, ar, vertical, "bone", sbuts->mainb); + ED_region_panels(C, ar, "bone", sbuts->mainb, vertical); else if (sbuts->mainb == BCONTEXT_MODIFIER) - ED_region_panels(C, ar, vertical, "modifier", sbuts->mainb); + ED_region_panels(C, ar, "modifier", sbuts->mainb, vertical); else if (sbuts->mainb == BCONTEXT_CONSTRAINT) - ED_region_panels(C, ar, vertical, "constraint", sbuts->mainb); + ED_region_panels(C, ar, "constraint", sbuts->mainb, vertical); else if (sbuts->mainb == BCONTEXT_BONE_CONSTRAINT) - ED_region_panels(C, ar, vertical, "bone_constraint", sbuts->mainb); + ED_region_panels(C, ar, "bone_constraint", sbuts->mainb, vertical); sbuts->re_align = 0; sbuts->mainbo = sbuts->mainb; diff --git a/source/blender/editors/space_clip/clip_draw.c b/source/blender/editors/space_clip/clip_draw.c index e6c05bbdda2..74a9eb480b7 100644 --- a/source/blender/editors/space_clip/clip_draw.c +++ b/source/blender/editors/space_clip/clip_draw.c @@ -252,11 +252,11 @@ static void draw_movieclip_notes(SpaceClip *sc, ARegion *ar) MovieClip *clip = ED_space_clip_get_clip(sc); MovieTracking *tracking = &clip->tracking; char str[256] = {0}; - bool block = false; + bool full_redraw = false; if (tracking->stats) { BLI_strncpy(str, tracking->stats->message, sizeof(str)); - block = true; + full_redraw = true; } else { if (sc->flag & SC_LOCK_SELECTION) @@ -265,7 +265,7 @@ static void draw_movieclip_notes(SpaceClip *sc, ARegion *ar) if (str[0]) { float fill_color[4] = {0.0f, 0.0f, 0.0f, 0.6f}; - ED_region_info_draw(ar, str, block, fill_color); + ED_region_info_draw(ar, str, fill_color, full_redraw); } } diff --git a/source/blender/editors/space_clip/space_clip.c b/source/blender/editors/space_clip/space_clip.c index 5ba82f7f71f..f119fe23c12 100644 --- a/source/blender/editors/space_clip/space_clip.c +++ b/source/blender/editors/space_clip/space_clip.c @@ -1445,7 +1445,7 @@ static void clip_tools_area_init(wmWindowManager *wm, ARegion *ar) static void clip_tools_area_draw(const bContext *C, ARegion *ar) { - ED_region_panels(C, ar, 1, NULL, -1); + ED_region_panels(C, ar, NULL, -1, true); } /****************** tool properties region ******************/ @@ -1492,7 +1492,7 @@ static void clip_properties_area_draw(const bContext *C, ARegion *ar) BKE_movieclip_update_scopes(sc->clip, &sc->user, &sc->scopes); - ED_region_panels(C, ar, 1, NULL, -1); + ED_region_panels(C, ar, NULL, -1, true); } static void clip_properties_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn) diff --git a/source/blender/editors/space_file/space_file.c b/source/blender/editors/space_file/space_file.c index c662d759397..d498176f9c4 100644 --- a/source/blender/editors/space_file/space_file.c +++ b/source/blender/editors/space_file/space_file.c @@ -562,7 +562,7 @@ static void file_tools_area_init(wmWindowManager *wm, ARegion *ar) static void file_tools_area_draw(const bContext *C, ARegion *ar) { - ED_region_panels(C, ar, 1, NULL, -1); + ED_region_panels(C, ar, NULL, -1, true); } static void file_tools_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *UNUSED(ar), wmNotifier *UNUSED(wmn)) diff --git a/source/blender/editors/space_graph/space_graph.c b/source/blender/editors/space_graph/space_graph.c index 4fd6276a28f..5bbd13fa949 100644 --- a/source/blender/editors/space_graph/space_graph.c +++ b/source/blender/editors/space_graph/space_graph.c @@ -414,7 +414,7 @@ static void graph_buttons_area_init(wmWindowManager *wm, ARegion *ar) static void graph_buttons_area_draw(const bContext *C, ARegion *ar) { - ED_region_panels(C, ar, 1, NULL, -1); + ED_region_panels(C, ar, NULL, -1, true); } static void graph_region_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn) diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c index 34e32c150d6..b157d1c7627 100644 --- a/source/blender/editors/space_image/image_draw.c +++ b/source/blender/editors/space_image/image_draw.c @@ -99,7 +99,7 @@ static void draw_render_info(const bContext *C, if (rr && rr->text) { float fill_color[4] = {0.0f, 0.0f, 0.0f, 0.25f}; - ED_region_info_draw(ar, rr->text, 1, fill_color); + ED_region_info_draw(ar, rr->text, fill_color, true); } BKE_image_release_renderresult(stats_scene, ima); diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c index a9a5e601e10..928e064b730 100644 --- a/source/blender/editors/space_image/space_image.c +++ b/source/blender/editors/space_image/space_image.c @@ -835,7 +835,7 @@ static void image_buttons_area_init(wmWindowManager *wm, ARegion *ar) static void image_buttons_area_draw(const bContext *C, ARegion *ar) { - ED_region_panels(C, ar, 1, NULL, -1); + ED_region_panels(C, ar, NULL, -1, true); } static void image_buttons_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn) @@ -908,7 +908,7 @@ static void image_tools_area_draw(const bContext *C, ARegion *ar) } ED_space_image_release_buffer(sima, ibuf, lock); - ED_region_panels(C, ar, 1, NULL, -1); + ED_region_panels(C, ar, NULL, -1, true); } static void image_tools_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn) diff --git a/source/blender/editors/space_logic/space_logic.c b/source/blender/editors/space_logic/space_logic.c index 733cac7794e..34a5fee88eb 100644 --- a/source/blender/editors/space_logic/space_logic.c +++ b/source/blender/editors/space_logic/space_logic.c @@ -282,7 +282,7 @@ static void logic_buttons_area_init(wmWindowManager *wm, ARegion *ar) static void logic_buttons_area_draw(const bContext *C, ARegion *ar) { - ED_region_panels(C, ar, 1, NULL, -1); + ED_region_panels(C, ar, NULL, -1, true); } /************************* header region **************************/ diff --git a/source/blender/editors/space_nla/space_nla.c b/source/blender/editors/space_nla/space_nla.c index ec584525aeb..9fc7b5d6f8f 100644 --- a/source/blender/editors/space_nla/space_nla.c +++ b/source/blender/editors/space_nla/space_nla.c @@ -349,7 +349,7 @@ static void nla_buttons_area_init(wmWindowManager *wm, ARegion *ar) static void nla_buttons_area_draw(const bContext *C, ARegion *ar) { - ED_region_panels(C, ar, 1, NULL, -1); + ED_region_panels(C, ar, NULL, -1, true); } static void nla_region_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn) diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c index a1980c88d7e..9c61ce997e6 100644 --- a/source/blender/editors/space_node/space_node.c +++ b/source/blender/editors/space_node/space_node.c @@ -603,7 +603,7 @@ static void node_buttons_area_init(wmWindowManager *wm, ARegion *ar) static void node_buttons_area_draw(const bContext *C, ARegion *ar) { - ED_region_panels(C, ar, 1, NULL, -1); + ED_region_panels(C, ar, NULL, -1, true); } /* add handlers, stuff you only do once or on area/region changes */ @@ -619,7 +619,7 @@ static void node_toolbar_area_init(wmWindowManager *wm, ARegion *ar) static void node_toolbar_area_draw(const bContext *C, ARegion *ar) { - ED_region_panels(C, ar, 1, NULL, -1); + ED_region_panels(C, ar, NULL, -1, true); } static void node_cursor(wmWindow *win, ScrArea *sa, ARegion *ar) diff --git a/source/blender/editors/space_outliner/outliner_tree.c b/source/blender/editors/space_outliner/outliner_tree.c index d4bef06cca9..0c1d6318638 100644 --- a/source/blender/editors/space_outliner/outliner_tree.c +++ b/source/blender/editors/space_outliner/outliner_tree.c @@ -988,7 +988,7 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i te->directdata = seq; te->name = seq->name + 2; - if (seq->type < SEQ_TYPE_EFFECT) { + if (!(seq->type & SEQ_TYPE_EFFECT)) { /* * This work like the sequence. * If the sequence have a name (not default name) diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c index eb00c37a483..69ef20584d0 100644 --- a/source/blender/editors/space_sequencer/sequencer_draw.c +++ b/source/blender/editors/space_sequencer/sequencer_draw.c @@ -412,7 +412,7 @@ static void draw_seq_handle(View2D *v2d, Sequence *seq, const float handsize_cla } /* draw! */ - if (seq->type < SEQ_TYPE_EFFECT || + if (!(seq->type & SEQ_TYPE_EFFECT) || BKE_sequence_effect_get_num_inputs(seq->type) == 0) { glEnable(GL_BLEND); diff --git a/source/blender/editors/space_sequencer/sequencer_select.c b/source/blender/editors/space_sequencer/sequencer_select.c index 4fbe0c6a241..c9fdb4ac5f5 100644 --- a/source/blender/editors/space_sequencer/sequencer_select.c +++ b/source/blender/editors/space_sequencer/sequencer_select.c @@ -1044,15 +1044,15 @@ static bool select_grouped_effect(Editing *ed, Sequence *actseq) { Sequence *seq; bool changed = false; - bool effects[SEQ_TYPE_EFFECT_MAX + 1]; + bool effects[SEQ_TYPE_MAX + 1]; int i; - for (i = 0; i <= SEQ_TYPE_EFFECT_MAX; i++) + for (i = 0; i <= SEQ_TYPE_MAX; i++) effects[i] = false; SEQP_BEGIN (ed, seq) { - if (ELEM(actseq, seq->seq1, seq->seq2, seq->seq3)) { + if ((seq->type & SEQ_TYPE_EFFECT) && ELEM(actseq, seq->seq1, seq->seq2, seq->seq3)) { effects[seq->type] = true; } } diff --git a/source/blender/editors/space_sequencer/space_sequencer.c b/source/blender/editors/space_sequencer/space_sequencer.c index 92a16ce6b7b..482b5b378ab 100644 --- a/source/blender/editors/space_sequencer/space_sequencer.c +++ b/source/blender/editors/space_sequencer/space_sequencer.c @@ -672,7 +672,7 @@ static void sequencer_buttons_area_init(wmWindowManager *wm, ARegion *ar) static void sequencer_buttons_area_draw(const bContext *C, ARegion *ar) { - ED_region_panels(C, ar, 1, NULL, -1); + ED_region_panels(C, ar, NULL, -1, true); } static void sequencer_buttons_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn) diff --git a/source/blender/editors/space_text/space_text.c b/source/blender/editors/space_text/space_text.c index d890b9f9b4d..ff53d306e69 100644 --- a/source/blender/editors/space_text/space_text.c +++ b/source/blender/editors/space_text/space_text.c @@ -541,7 +541,7 @@ static void text_properties_area_draw(const bContext *C, ARegion *ar) { SpaceText *st = CTX_wm_space_text(C); - ED_region_panels(C, ar, 1, NULL, -1); + ED_region_panels(C, ar, NULL, -1, true); /* this flag trick is make sure buttons have been added already */ if (st->flags & ST_FIND_ACTIVATE) { diff --git a/source/blender/editors/space_userpref/space_userpref.c b/source/blender/editors/space_userpref/space_userpref.c index f986e909c7f..b5a6821d147 100644 --- a/source/blender/editors/space_userpref/space_userpref.c +++ b/source/blender/editors/space_userpref/space_userpref.c @@ -113,7 +113,7 @@ static void userpref_main_area_init(wmWindowManager *wm, ARegion *ar) static void userpref_main_area_draw(const bContext *C, ARegion *ar) { - ED_region_panels(C, ar, 1, NULL, -1); + ED_region_panels(C, ar, NULL, -1, true); } static void userpref_operatortypes(void) diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 4636fd5d968..848362f91d7 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -4315,8 +4315,9 @@ static bool draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3 if (obedit != ob) finalDM = cageDM = editbmesh_get_derived_base(ob, em); else - cageDM = editbmesh_get_derived_cage_and_final(scene, ob, em, &finalDM, - scene->customdata_mask); + cageDM = editbmesh_get_derived_cage_and_final( + scene, ob, em, scene->customdata_mask, + &finalDM); DM_update_materials(finalDM, ob); if (cageDM != finalDM) { diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c index e4f3e1d75ea..bfce6e927a6 100644 --- a/source/blender/editors/space_view3d/space_view3d.c +++ b/source/blender/editors/space_view3d/space_view3d.c @@ -1268,7 +1268,7 @@ static void view3d_buttons_area_init(wmWindowManager *wm, ARegion *ar) static void view3d_buttons_area_draw(const bContext *C, ARegion *ar) { - ED_region_panels(C, ar, 1, NULL, -1); + ED_region_panels(C, ar, NULL, -1, true); } static void view3d_buttons_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn) @@ -1374,7 +1374,7 @@ static void view3d_tools_area_init(wmWindowManager *wm, ARegion *ar) static void view3d_tools_area_draw(const bContext *C, ARegion *ar) { - ED_region_panels(C, ar, 1, CTX_data_mode_string(C), -1); + ED_region_panels(C, ar, CTX_data_mode_string(C), -1, true); } static void view3d_props_area_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn) diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index 5ccb16e514c..f933e0778a8 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -3743,7 +3743,7 @@ static void view3d_main_area_draw_engine_info(View3D *v3d, RegionView3D *rv3d, A fill_color[3] = 1.0f; } - ED_region_info_draw(ar, rv3d->render_engine->text, 1, fill_color); + ED_region_info_draw(ar, rv3d->render_engine->text, fill_color, true); } static bool view3d_stereo3d_active(const bContext *C, Scene *scene, View3D *v3d, RegionView3D *rv3d) diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c index e9cb6dcdc44..9d687360e8b 100644 --- a/source/blender/editors/space_view3d/view3d_view.c +++ b/source/blender/editors/space_view3d/view3d_view.c @@ -50,6 +50,7 @@ #include "BKE_main.h" #include "BKE_report.h" #include "BKE_scene.h" +#include "BKE_screen.h" #include "BIF_gl.h" #include "BIF_glutil.h" @@ -1601,7 +1602,6 @@ static int game_engine_poll(bContext *C) if (CTX_wm_window(C) == NULL) return 0; if ((screen = CTX_wm_screen(C)) == NULL) return 0; - if (CTX_wm_area(C) == NULL) return 0; if (CTX_data_mode_enum(C) != CTX_MODE_OBJECT) return 0; @@ -1619,20 +1619,18 @@ bool ED_view3d_context_activate(bContext *C) ARegion *ar; /* sa can be NULL when called from python */ - if (sa == NULL || sa->spacetype != SPACE_VIEW3D) - for (sa = sc->areabase.first; sa; sa = sa->next) - if (sa->spacetype == SPACE_VIEW3D) - break; + if (sa == NULL || sa->spacetype != SPACE_VIEW3D) { + sa = BKE_screen_find_big_area(sc, SPACE_VIEW3D, 0); + } - if (!sa) + if (sa == NULL) { return false; + } - for (ar = sa->regionbase.first; ar; ar = ar->next) - if (ar->regiontype == RGN_TYPE_WINDOW) - break; - - if (!ar) + ar = BKE_area_find_region_active_win(sa); + if (ar == NULL) { return false; + } /* bad context switch .. */ CTX_wm_area_set(C, sa); diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index 65c0e413c4a..d8e5f99232d 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -2576,7 +2576,7 @@ static void createTransEditVerts(TransInfo *t) if (modifiers_isCorrectableDeformed(t->scene, t->obedit)) { /* check if we can use deform matrices for modifier from the * start up to stack, they are more accurate than quats */ - totleft = editbmesh_get_first_deform_matrices(t->scene, t->obedit, em, &defmats, &defcos); + totleft = BKE_crazyspace_get_first_deform_matrices_editbmesh(t->scene, t->obedit, em, &defmats, &defcos); } /* if we still have more modifiers, also do crazyspace diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index 25f5c8884e5..80d1e0bb34f 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -710,12 +710,6 @@ static void recalcData_objects(TransInfo *t) { Base *base = t->scene->basact; - if (t->state != TRANS_CANCEL) { - if (ELEM(t->tsnap.mode, SCE_SNAP_MODE_INCREMENT, SCE_SNAP_MODE_GRID) && t->tsnap.snap_spatial_grid) { - applyGridAbsolute(t); - } - } - if (t->obedit) { if (ELEM(t->obedit->type, OB_CURVE, OB_SURF)) { Curve *cu = t->obedit->data; diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c index 2bf4baab1bb..fd13a686978 100644 --- a/source/blender/editors/transform/transform_snap.c +++ b/source/blender/editors/transform/transform_snap.c @@ -2468,7 +2468,7 @@ static void applyGridIncrement(TransInfo *t, float *val, int max_index, const fl } /* absolute snapping on grid based on global center */ - if ((t->tsnap.mode == SCE_SNAP_MODE_GRID) && (t->mode == TFM_TRANSLATION)) { + if ((t->tsnap.snap_spatial_grid) && (t->mode == TFM_TRANSLATION)) { for (i = 0; i <= max_index; i++) { /* do not let unconstrained axis jump to absolute grid increments */ if (!(t->con.mode & CON_APPLY) || t->con.mode & (CON_AXIS0 << i)) { diff --git a/source/blender/editors/uvedit/uvedit_draw.c b/source/blender/editors/uvedit/uvedit_draw.c index b2c4970479a..9431d754b5f 100644 --- a/source/blender/editors/uvedit/uvedit_draw.c +++ b/source/blender/editors/uvedit/uvedit_draw.c @@ -598,7 +598,9 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit) /* first try existing derivedmesh */ if (!draw_uvs_dm_shadow(em->derivedFinal)) { /* create one if it does not exist */ - cagedm = editbmesh_get_derived_cage_and_final(scene, obedit, me->edit_btmesh, &finaldm, CD_MASK_BAREMESH | CD_MASK_MTFACE); + cagedm = editbmesh_get_derived_cage_and_final( + scene, obedit, me->edit_btmesh, CD_MASK_BAREMESH | CD_MASK_MTFACE, + &finaldm); /* when sync selection is enabled, all faces are drawn (except for hidden) * so if cage is the same as the final, theres no point in drawing this */ diff --git a/source/blender/makesdna/DNA_sequence_types.h b/source/blender/makesdna/DNA_sequence_types.h index d45467373d6..7b342d30ca1 100644 --- a/source/blender/makesdna/DNA_sequence_types.h +++ b/source/blender/makesdna/DNA_sequence_types.h @@ -471,7 +471,7 @@ enum { SEQ_TYPE_MULTICAM = 30, SEQ_TYPE_ADJUSTMENT = 31, SEQ_TYPE_GAUSSIAN_BLUR = 40, - SEQ_TYPE_EFFECT_MAX = 40 + SEQ_TYPE_MAX = 40 }; #define SEQ_MOVIECLIP_RENDER_UNDISTORTED (1 << 0) diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 97cb00b7872..a588040ad82 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -2221,7 +2221,8 @@ static void rna_def_tool_settings(BlenderRNA *brna) prop = RNA_def_property(srna, "use_snap_grid_absolute", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "snap_flag", SCE_SNAP_ABS_GRID); - RNA_def_property_ui_text(prop, "Absolute Grid Snap", "Grid align vertices during transform"); + RNA_def_property_ui_text(prop, "Absolute Grid Snap", + "Absolute grid alignment while translating (based on the pivot center)"); RNA_def_property_ui_icon(prop, ICON_SNAP_INCREMENT, 0); RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* header redraw */ diff --git a/source/blender/modifiers/intern/MOD_meshdeform.c b/source/blender/modifiers/intern/MOD_meshdeform.c index 22148d1f5ae..5bd33d2a49f 100644 --- a/source/blender/modifiers/intern/MOD_meshdeform.c +++ b/source/blender/modifiers/intern/MOD_meshdeform.c @@ -318,7 +318,7 @@ static void meshdeformModifier_do( */ if (mmd->object == md->scene->obedit) { BMEditMesh *em = BKE_editmesh_from_object(mmd->object); - tmpdm = editbmesh_get_derived_cage_and_final(md->scene, mmd->object, em, &cagedm, 0); + tmpdm = editbmesh_get_derived_cage_and_final(md->scene, mmd->object, em, 0, &cagedm); if (tmpdm) tmpdm->release(tmpdm); } diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c index 5e29dc2e166..fba9b4824b4 100644 --- a/source/blender/windowmanager/intern/wm_init_exit.c +++ b/source/blender/windowmanager/intern/wm_init_exit.c @@ -173,12 +173,13 @@ void WM_init(bContext *C, int argc, const char **argv) /* get the default database, plus a wm */ wm_homefile_read(C, NULL, G.factory_startup, NULL); - /* sets 3D mouse deadzone */ - WM_ndof_deadzone_set(U.ndof_deadzone); BLF_lang_set(NULL); if (!G.background) { + /* sets 3D mouse deadzone */ + WM_ndof_deadzone_set(U.ndof_deadzone); + GPU_init(); GPU_set_mipmap(!(U.gameflags & USER_DISABLE_MIPMAP)); diff --git a/source/creator/creator.c b/source/creator/creator.c index 663a0f60be0..38e0f8878bd 100644 --- a/source/creator/creator.c +++ b/source/creator/creator.c @@ -327,6 +327,7 @@ static int print_help(int UNUSED(argc), const char **UNUSED(argv), void *data) BLI_argsPrintArgDoc(ba, "--debug-depsgraph"); BLI_argsPrintArgDoc(ba, "--debug-depsgraph-no-threads"); + BLI_argsPrintArgDoc(ba, "--debug-gpumem"); BLI_argsPrintArgDoc(ba, "--debug-wm"); BLI_argsPrintArgDoc(ba, "--debug-all"); @@ -338,7 +339,6 @@ static int print_help(int UNUSED(argc), const char **UNUSED(argv), void *data) printf("Misc Options:\n"); BLI_argsPrintArgDoc(ba, "--factory-startup"); printf("\n"); - BLI_argsPrintArgDoc(ba, "--env-system-config"); BLI_argsPrintArgDoc(ba, "--env-system-datafiles"); BLI_argsPrintArgDoc(ba, "--env-system-scripts"); BLI_argsPrintArgDoc(ba, "--env-system-python"); @@ -368,21 +368,22 @@ static int print_help(int UNUSED(argc), const char **UNUSED(argv), void *data) BLI_argsPrintArgDoc(ba, "--enable-new-depsgraph"); printf("Argument Parsing:\n"); - printf("\targuments must be separated by white space. eg\n"); - printf("\t\t\"blender -ba test.blend\"\n"); + printf("\tArguments must be separated by white space, eg:\n"); + printf("\t# blender -ba test.blend\n"); printf("\t...will ignore the 'a'\n"); - printf("\t\t\"blender -b test.blend -f8\"\n"); - printf("\t...will ignore 8 because there is no space between the -f and the frame value\n\n"); + printf("\t# blender -b test.blend -f8\n"); + printf("\t...will ignore '8' because there is no space between the '-f' and the frame value\n\n"); printf("Argument Order:\n"); - printf("\targuments are executed in the order they are given. eg\n"); - printf("\t\t\"blender --background test.blend --render-frame 1 --render-output /tmp\"\n"); - printf("\t...will not render to /tmp because '--render-frame 1' renders before the output path is set\n"); - printf("\t\t\"blender --background --render-output /tmp test.blend --render-frame 1\"\n"); - printf("\t...will not render to /tmp because loading the blend file overwrites the render output that was set\n"); - printf("\t\t\"blender --background test.blend --render-output /tmp --render-frame 1\" works as expected.\n\n"); - - printf("\nEnvironment Variables:\n"); + printf("\tArguments are executed in the order they are given. eg:\n"); + printf("\t# blender --background test.blend --render-frame 1 --render-output '/tmp'\n"); + printf("\t...will not render to '/tmp' because '--render-frame 1' renders before the output path is set\n"); + printf("\t# blender --background --render-output /tmp test.blend --render-frame 1\n"); + printf("\t...will not render to '/tmp' because loading the blend file overwrites the render output that was set\n"); + printf("\t# blender --background test.blend --render-output /tmp --render-frame 1\n"); + printf("\t...works as expected.\n\n"); + + printf("Environment Variables:\n"); printf(" $BLENDER_USER_CONFIG Directory for user configuration files.\n"); printf(" $BLENDER_USER_SCRIPTS Directory for user scripts.\n"); printf(" $BLENDER_SYSTEM_SCRIPTS Directory for system wide scripts.\n"); @@ -1449,15 +1450,17 @@ static void setupArguments(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle) { static char output_doc[] = "<path>" "\n\tSet the render path and file name." - "\n\tUse // at the start of the path to" - "\n\t\trender relative to the blend file." - "\n\tThe # characters are replaced by the frame number, and used to define zero padding." - "\n\t\tani_##_test.png becomes ani_01_test.png" - "\n\t\ttest-######.png becomes test-000001.png" - "\n\t\tWhen the filename does not contain #, The suffix #### is added to the filename" - "\n\tThe frame number will be added at the end of the filename." - "\n\t\teg: blender -b foobar.blend -o //render_ -F PNG -x 1 -a" - "\n\t\t//render_ becomes //render_####, writing frames as //render_0001.png//"; + "\n\tUse '//' at the start of the path to render relative to the blend file." + "\n" + "\n\tThe '#' characters are replaced by the frame number, and used to define zero padding." + "\n\t* 'ani_##_test.png' becomes 'ani_01_test.png'" + "\n\t* 'test-######.png' becomes 'test-000001.png'" + "\n" + "\n\tWhen the filename does not contain '#', The suffix '####' is added to the filename." + "\n" + "\n\tThe frame number will be added at the end of the filename, eg:" + "\n\t# blender -b foobar.blend -o //render_ -F PNG -x 1 -a" + "\n\t'//render_' becomes '//render_####', writing frames as '//render_0001.png'"; static char format_doc[] = "<format>" "\n\tSet the render format, Valid options are..." @@ -1484,12 +1487,12 @@ static void setupArguments(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle) static char debug_doc[] = "\n\tTurn debugging on\n" "\n\t* Prints every operator call and their arguments" "\n\t* Disables mouse grab (to interact with a debugger in some cases)" - "\n\t* Keeps python sys.stdin rather than setting it to None"; + "\n\t* Keeps Python's 'sys.stdin' rather than setting it to None"; //BLI_argsAdd(ba, pass, short_arg, long_arg, doc, cb, C); /* end argument processing after -- */ - BLI_argsAdd(ba, -1, "--", NULL, "\n\tEnds option processing, following arguments passed unchanged. Access via python's sys.argv", end_arguments, NULL); + BLI_argsAdd(ba, -1, "--", NULL, "\n\tEnds option processing, following arguments passed unchanged. Access via Python's 'sys.argv'", end_arguments, NULL); /* first pass: background mode, disable python and commands that exit after usage */ BLI_argsAdd(ba, 1, "-h", "--help", "\n\tPrint this help text and exit", print_help, ba); @@ -1507,8 +1510,8 @@ static void setupArguments(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle) # define PY_DISABLE_AUTO ", (compiled as non-standard default)" #endif - BLI_argsAdd(ba, 1, "-y", "--enable-autoexec", "\n\tEnable automatic python script execution" PY_ENABLE_AUTO, enable_python, NULL); - BLI_argsAdd(ba, 1, "-Y", "--disable-autoexec", "\n\tDisable automatic python script execution (pydrivers & startup scripts)" PY_DISABLE_AUTO, disable_python, NULL); + BLI_argsAdd(ba, 1, "-y", "--enable-autoexec", "\n\tEnable automatic Python script execution" PY_ENABLE_AUTO, enable_python, NULL); + BLI_argsAdd(ba, 1, "-Y", "--disable-autoexec", "\n\tDisable automatic Python script execution (pydrivers & startup scripts)" PY_DISABLE_AUTO, disable_python, NULL); BLI_argsAdd(ba, 1, NULL, "--disable-crash-handler", "\n\tDisable the crash handler", disable_crash_handler, NULL); BLI_argsAdd(ba, 1, NULL, "--disable-abort-handler", "\n\tDisable the abort handler", disable_abort_handler, NULL); @@ -1530,7 +1533,7 @@ static void setupArguments(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle) BLI_argsAdd(ba, 1, NULL, "--debug-freestyle", "\n\tEnable debug/profiling messages from Freestyle rendering", debug_mode_generic, (void *)G_DEBUG_FREESTYLE); #endif - BLI_argsAdd(ba, 1, NULL, "--debug-python", "\n\tEnable debug messages for python", debug_mode_generic, (void *)G_DEBUG_PYTHON); + BLI_argsAdd(ba, 1, NULL, "--debug-python", "\n\tEnable debug messages for Python", debug_mode_generic, (void *)G_DEBUG_PYTHON); BLI_argsAdd(ba, 1, NULL, "--debug-events", "\n\tEnable debug messages for the event system", debug_mode_generic, (void *)G_DEBUG_EVENTS); BLI_argsAdd(ba, 1, NULL, "--debug-handlers", "\n\tEnable debug messages for event handling", debug_mode_generic, (void *)G_DEBUG_HANDLERS); BLI_argsAdd(ba, 1, NULL, "--debug-wm", "\n\tEnable debug messages for the window manager", debug_mode_generic, (void *)G_DEBUG_WM); @@ -1556,7 +1559,7 @@ static void setupArguments(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle) BLI_argsAdd(ba, 1, NULL, "--verbose", "<verbose>\n\tSet logging verbosity level.", set_verbosity, NULL); - BLI_argsAdd(ba, 1, NULL, "--factory-startup", "\n\tSkip reading the "STRINGIFY (BLENDER_STARTUP_FILE)" in the users home directory", set_factory_startup, NULL); + BLI_argsAdd(ba, 1, NULL, "--factory-startup", "\n\tSkip reading the " STRINGIFY(BLENDER_STARTUP_FILE) " in the users home directory", set_factory_startup, NULL); /* TODO, add user env vars? */ BLI_argsAdd(ba, 1, NULL, "--env-system-datafiles", "\n\tSet the "STRINGIFY_ARG (BLENDER_SYSTEM_DATAFILES)" environment variable", set_env, NULL); diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp index 9e53d9e1569..253646a8a0e 100644 --- a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp +++ b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp @@ -1082,6 +1082,7 @@ bool KX_BlenderSceneConverter::FreeBlendFile(Main *maggie) if (IS_TAGGED(action)) { STR_HashedString an = action->name + 2; mapStringToActions.remove(an); + m_map_blender_to_gameAdtList.remove(CHashedPtr(action)); i--; } } @@ -1110,6 +1111,7 @@ bool KX_BlenderSceneConverter::FreeBlendFile(Main *maggie) } } else { + gameobj->RemoveTaggedActions(); /* free the mesh, we could be referecing a linked one! */ int mesh_index = gameobj->GetMeshCount(); while (mesh_index--) { @@ -1359,14 +1361,18 @@ bool KX_BlenderSceneConverter::MergeScene(KX_Scene *to, KX_Scene *from) } MaterialCache::iterator matcacheit = m_mat_cache.find(from); - // Merge cached BL_Material map. - m_mat_cache[to].insert(matcacheit->second.begin(), matcacheit->second.end()); - m_mat_cache.erase(matcacheit); + if (matcacheit != m_mat_cache.end()) { + // Merge cached BL_Material map. + m_mat_cache[to].insert(matcacheit->second.begin(), matcacheit->second.end()); + m_mat_cache.erase(matcacheit); + } PolyMaterialCache::iterator polymatcacheit = m_polymat_cache.find(from); - // Merge cached RAS_IPolyMaterial map. - m_polymat_cache[to].insert(polymatcacheit->second.begin(), polymatcacheit->second.end()); - m_polymat_cache.erase(polymatcacheit); + if (polymatcacheit != m_polymat_cache.end()) { + // Merge cached RAS_IPolyMaterial map. + m_polymat_cache[to].insert(polymatcacheit->second.begin(), polymatcacheit->second.end()); + m_polymat_cache.erase(polymatcacheit); + } return true; } diff --git a/source/gameengine/Ketsji/BL_ActionManager.cpp b/source/gameengine/Ketsji/BL_ActionManager.cpp index c3d0f9e9ad0..975f9ea6da8 100644 --- a/source/gameengine/Ketsji/BL_ActionManager.cpp +++ b/source/gameengine/Ketsji/BL_ActionManager.cpp @@ -26,6 +26,9 @@ #include "BL_Action.h" #include "BL_ActionManager.h" +#include "DNA_ID.h" + +#define IS_TAGGED(_id) ((_id) && (((ID *)_id)->flag & LIB_DOIT)) BL_ActionManager::BL_ActionManager(class KX_GameObject *obj): m_obj(obj), @@ -123,6 +126,18 @@ void BL_ActionManager::StopAction(short layer) if (action) action->Stop(); } +void BL_ActionManager::RemoveTaggedActions() +{ + for (BL_ActionMap::iterator it = m_layers.begin(); it != m_layers.end();) { + if (IS_TAGGED(it->second->GetAction())) { + delete it->second; + m_layers.erase(it++); + } + else + ++it; + } +} + bool BL_ActionManager::IsActionDone(short layer) { BL_Action *action = GetAction(layer); diff --git a/source/gameengine/Ketsji/BL_ActionManager.h b/source/gameengine/Ketsji/BL_ActionManager.h index 45bcd104826..00e536655c7 100644 --- a/source/gameengine/Ketsji/BL_ActionManager.h +++ b/source/gameengine/Ketsji/BL_ActionManager.h @@ -110,6 +110,11 @@ public: void StopAction(short layer); /** + * Remove playing tagged actions. + */ + void RemoveTaggedActions(); + + /** * Check if an action has finished playing */ bool IsActionDone(short layer); diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp index 5701d0e54a0..d98669cc5b4 100644 --- a/source/gameengine/Ketsji/KX_GameObject.cpp +++ b/source/gameengine/Ketsji/KX_GameObject.cpp @@ -469,6 +469,11 @@ void KX_GameObject::StopAction(short layer) GetActionManager()->StopAction(layer); } +void KX_GameObject::RemoveTaggedActions() +{ + GetActionManager()->RemoveTaggedActions(); +} + bool KX_GameObject::IsActionDone(short layer) { return GetActionManager()->IsActionDone(layer); diff --git a/source/gameengine/Ketsji/KX_GameObject.h b/source/gameengine/Ketsji/KX_GameObject.h index 670fcd6fb6e..3639d73d1e5 100644 --- a/source/gameengine/Ketsji/KX_GameObject.h +++ b/source/gameengine/Ketsji/KX_GameObject.h @@ -302,6 +302,11 @@ public: void StopAction(short layer); /** + * Remove playing tagged actions. + */ + void RemoveTaggedActions(); + + /** * Check if an action has finished playing */ bool IsActionDone(short layer); diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp index d3ee219b2f4..3a596548cfa 100644 --- a/source/gameengine/Ketsji/KX_Scene.cpp +++ b/source/gameengine/Ketsji/KX_Scene.cpp @@ -1994,6 +1994,10 @@ static void MergeScene_GameObject(KX_GameObject* gameobj, KX_Scene *to, KX_Scene if (gameobj->GetGameObjectType() == SCA_IObject::OBJ_CAMERA) to->AddCamera((KX_Camera*)gameobj); + // All armatures should be in the animated object list to be umpdated. + if (gameobj->GetGameObjectType() == SCA_IObject::OBJ_ARMATURE) + to->AddAnimatedObject(gameobj); + /* Add the object to the scene's logic manager */ to->GetLogicManager()->RegisterGameObjectName(gameobj->GetName(), gameobj); to->GetLogicManager()->RegisterGameObj(gameobj->GetBlenderObject(), gameobj); diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp index 692704b5080..8ecb586f77e 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp @@ -700,7 +700,7 @@ CcdPhysicsController::~CcdPhysicsController() void CcdPhysicsController::SimulationTick(float timestep) { btRigidBody *body = GetRigidBody(); - if (!body && body->isStaticObject()) + if (!body || body->isStaticObject()) return; // Clamp linear velocity |