Merged changes in the trunk up to revision 53584.
[blender.git] / source / blender / blenkernel / BKE_DerivedMesh.h
index 64512dcaac8fa7e3588162f45ccd141fc817ab5a..ed90c63d9493b6c4e2540872b6bc849cb43f5b66 100644 (file)
@@ -105,6 +105,11 @@ struct PBVH;
  *       Also, the mface origindex layer indexes mpolys, not mfaces.
  */
 
+typedef struct DMCoNo {
+       float co[3];
+       float no[3];
+} DMCoNo;
+
 typedef struct DMGridAdjacency {
        int index[4];
        int rotation[4];
@@ -148,6 +153,11 @@ typedef enum DMDrawFlag {
 typedef enum DMDirtyFlag {
        /* dm has valid tessellated faces, but tessellated CDDATA need to be updated. */
        DM_DIRTY_TESS_CDLAYERS = 1 << 0,
+       /* One of the MCOL layers have been updated, force updating of GPUDrawObject's colors buffer.
+        * This is necessary with modern, VBO draw code, as e.g. in vpaint mode me->mcol may be updated
+        * without actually rebuilding dm (hence by defautl keeping same GPUDrawObject, and same colors
+        * buffer, which prevents update during a stroke!). */
+       DM_DIRTY_MCOL_UPDATE_DRAW = 1 << 1,
 } DMDirtyFlag;
 
 typedef struct DerivedMesh DerivedMesh;
@@ -223,6 +233,7 @@ struct DerivedMesh {
        void *(*getVertData)(DerivedMesh * dm, int index, int type);
        void *(*getEdgeData)(DerivedMesh * dm, int index, int type);
        void *(*getTessFaceData)(DerivedMesh * dm, int index, int type);
+       void *(*getPolyData)(DerivedMesh * dm, int index, int type);
 
        /** Return a pointer to the entire array of vert/edge/face custom data
         * from the derived mesh (this gives a pointer to the actual data, not
@@ -231,7 +242,8 @@ struct DerivedMesh {
        void *(*getVertDataArray)(DerivedMesh * dm, int type);
        void *(*getEdgeDataArray)(DerivedMesh * dm, int type);
        void *(*getTessFaceDataArray)(DerivedMesh * dm, int type);
-       
+       void *(*getPolyDataArray)(DerivedMesh * dm, int type);
+
        /** Retrieves the base CustomData structures for
         * verts/edges/tessfaces/loops/facdes*/
        CustomData *(*getVertDataLayout)(DerivedMesh * dm);
@@ -493,6 +505,7 @@ void DM_add_poly_layer(struct DerivedMesh *dm, int type, int alloctype,
 void *DM_get_vert_data(struct DerivedMesh *dm, int index, int type);
 void *DM_get_edge_data(struct DerivedMesh *dm, int index, int type);
 void *DM_get_tessface_data(struct DerivedMesh *dm, int index, int type);
+void *DM_get_poly_data(struct DerivedMesh *dm, int index, int type);
 
 /* custom data layer access functions
  * return pointer to first data layer which matches type (a flat array)
@@ -595,7 +608,7 @@ void vDM_ColorBand_store(struct ColorBand *coba);
 /** Simple function to get me->totvert amount of vertices/normals,
  * correctly deformed and subsurfered. Needed especially when vertexgroups are involved.
  * In use now by vertex/weight paint and particles */
-float *mesh_get_mapped_verts_nors(struct Scene *scene, struct Object *ob);
+DMCoNo *mesh_get_mapped_verts_nors(struct Scene *scene, struct Object *ob);
 
 /* */
 DerivedMesh *mesh_get_derived_final(struct Scene *scene, struct Object *ob,
@@ -698,6 +711,19 @@ void DM_init_origspace(DerivedMesh *dm);
 #ifndef NDEBUG
 char *DM_debug_info(DerivedMesh *dm);
 void DM_debug_print(DerivedMesh *dm);
+void DM_debug_print_cdlayers(CustomData *cdata);
 #endif
 
+#ifdef __GNUC__
+BLI_INLINE int DM_origindex_mface_mpoly(const int *index_mf_to_mpoly, const int *index_mp_to_orig, const int i)
+       __attribute__((nonnull(1)))
+;
+#endif
+
+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;
+}
+
 #endif