Merged changes in the trunk up to revision 47056.
[blender-staging.git] / source / blender / makesdna / DNA_meshdata_types.h
index 8a5cc8b8d9b053089d0d90f90a49532e65db0844..dc8115b556cadd4d9202c2a72b7806c30fa7d6d9 100644 (file)
@@ -29,8 +29,8 @@
  *  \ingroup DNA
  */
 
-#ifndef DNA_MESHDATA_TYPES_H
-#define DNA_MESHDATA_TYPES_H
+#ifndef __DNA_MESHDATA_TYPES_H__
+#define __DNA_MESHDATA_TYPES_H__
 
 #include "DNA_customdata_types.h"
 #include "DNA_listBase.h"
@@ -38,6 +38,7 @@
 struct Bone;
 struct Image;
 
+/*tessellation face, see MLoop/MPoly for the real face data*/
 typedef struct MFace {
        unsigned int v1, v2, v3, v4;
        short mat_nr;
@@ -67,16 +68,15 @@ typedef struct MVert {
        char flag, bweight;
 } MVert;
 
-/* at the moment alpha is abused for vertex painting
- * and not used for transperency, note that red and blue are swapped */
+/* tessellation vertex color data.
+ * at the moment alpha is abused for vertex painting
+ * and not used for transparency, note that red and blue are swapped */
 typedef struct MCol {
        char a, r, g, b;        
 } MCol;
 
-#ifdef USE_BMESH_FORWARD_COMPAT
-
-/*new face structure, replaces MFace, which is now
-  only used for storing tesselations.*/
+/* new face structure, replaces MFace, which is now
+ * only used for storing tessellations.*/
 typedef struct MPoly {
        /* offset into loop array and number of loops in the face */
        int loopstart;
@@ -85,30 +85,67 @@ typedef struct MPoly {
        char flag, pad;
 } MPoly;
 
-/*the e here is because we want to move away from
-  relying on edge hashes.*/
+/* the e here is because we want to move away from
* relying on edge hashes.*/
 typedef struct MLoop {
        unsigned int v; /*vertex index*/
        unsigned int e; /*edge index*/
 } MLoop;
 
-#endif /* USE_BMESH_FORWARD_COMPAT */
-
-/*bmesh custom data stuff*/
 typedef struct MTexPoly {
        struct Image *tpage;
        char flag, transp;
-       short mode,tile,unwrap;
+       short mode, tile, unwrap;
 } MTexPoly;
 
+/* can copy from/to MTexPoly/MTFace */
+#define ME_MTEXFACE_CPY(dst, src)   \
+{                                   \
+       (dst)->tpage  = (src)->tpage;   \
+       (dst)->flag   = (src)->flag;    \
+       (dst)->transp = (src)->transp;  \
+       (dst)->mode   = (src)->mode;    \
+       (dst)->tile   = (src)->tile;    \
+       (dst)->unwrap = (src)->unwrap;  \
+}
+
 typedef struct MLoopUV {
        float uv[2];
+       int flag;
 } MLoopUV;
 
+/*mloopuv->flag*/
+#define MLOOPUV_EDGESEL        1
+#define MLOOPUV_VERTSEL        2
+#define MLOOPUV_PINNED 4
+
+/* at the moment alpha is abused for vertex painting
+ * and not used for transparency, note that red and blue are swapped */
 typedef struct MLoopCol {
-       char a, r, g, b;
+       char r, g, b, a;
 } MLoopCol;
 
+#define MESH_MLOOPCOL_FROM_MCOL(_mloopcol, _mcol) \
+{                                                 \
+       MLoopCol   *mloopcol__tmp = _mloopcol;        \
+       const MCol *mcol__tmp     = _mcol;            \
+       mloopcol__tmp->r = mcol__tmp->b;              \
+       mloopcol__tmp->g = mcol__tmp->g;              \
+       mloopcol__tmp->b = mcol__tmp->r;              \
+       mloopcol__tmp->a = mcol__tmp->a;              \
+} (void)0
+
+
+#define MESH_MLOOPCOL_TO_MCOL(_mloopcol, _mcol) \
+{                                               \
+       const MLoopCol *mloopcol__tmp = _mloopcol;  \
+       MCol           *mcol__tmp     = _mcol;      \
+       mcol__tmp->b = mloopcol__tmp->r;            \
+       mcol__tmp->g = mloopcol__tmp->g;            \
+       mcol__tmp->r = mloopcol__tmp->b;            \
+       mcol__tmp->a = mloopcol__tmp->a;            \
+} (void)0
+
 typedef struct MSticky {
        float co[2];
 } MSticky;
@@ -118,6 +155,7 @@ typedef struct MSelect {
        int type; /* EDITVERT/EDITEDGE/EDITFACE */
 } MSelect;
 
+/*tessellation uv face data*/
 typedef struct MTFace {
        float uv[4][2];
        struct Image *tpage;
@@ -140,11 +178,21 @@ typedef struct OrigSpaceFace {
        float uv[4][2];
 } OrigSpaceFace;
 
+typedef struct OrigSpaceLoop {
+       float uv[2];
+} OrigSpaceLoop;
+
 typedef struct MDisps {
        /* Strange bug in SDNA: if disps pointer comes first, it fails to see totdisp */
        int totdisp;
-       char pad[4];
+       int level;
        float (*disps)[3];
+       
+       /* Used for hiding parts of a multires mesh. Essentially the multires
+        * equivalent of MVert.flag's ME_HIDE bit.
+        *
+        * This is a bitmap, keep in sync with type used in BLI_bitmap.h */
+       unsigned int *hidden;
 } MDisps;
 
 /** Multires structs kept for compatibility with old files **/
@@ -199,6 +247,37 @@ typedef struct MRecast {
        int             i;
 } MRecast;
 
+typedef struct GridPaintMask {
+       /* The data array contains gridsize*gridsize elements */
+       float *data;
+
+       /* The maximum multires level associated with this grid */
+       unsigned int level;
+
+       int pad;
+} GridPaintMask;
+
+typedef enum MVertSkinFlag {
+       /* Marks a vertex as the edge-graph root, used for calculating
+          rotations for all connected edges (recursively.) Also used to
+          choose a root when generating an armature. */
+       MVERT_SKIN_ROOT = 1,
+
+       /* Marks a branch vertex (vertex with more than two connected
+          edges) so that it's neighbors are directly hulled together,
+          rather than the default of generating intermediate frames. */
+       MVERT_SKIN_LOOSE = 2
+} MVertSkinFlag;
+
+typedef struct MVertSkin {
+       /* Radii of the skin, define how big the generated frames
+          are. Currently only the first two elements are used. */
+       float radius[3];
+
+       /* MVertSkinFlag */
+       int flag;
+} MVertSkin;
+
 /* mvert->flag (1=SELECT) */
 #define ME_SPHERETEST          2
 #define ME_VERT_TMP_TAG                4
@@ -209,7 +288,7 @@ typedef struct MRecast {
 /* medge->flag (1=SELECT)*/
 #define ME_EDGEDRAW                    (1<<1)
 #define ME_SEAM                                (1<<2)
-#define ME_FGON                                (1<<3)
+#define ME_FGON                                (1<<3) /* no longer used (now we have ngons), only defined so we can clear it */
                                                /* reserve 16 for ME_HIDE */
 #define ME_EDGERENDER          (1<<5)
 #define ME_LOOSEEDGE           (1<<7)
@@ -233,7 +312,16 @@ typedef struct MRecast {
 #define ME_SMOOTH                      1
 #define ME_FACE_SEL                    2
 #define ME_FREESTYLE_FACE      4
-                                               /* flag ME_HIDE==16 is used here too */ 
+/* flag ME_HIDE==16 is used here too */ 
+
+#define ME_POLY_LOOP_PREV(mloop, mp, i)  (&(mloop)[(mp)->loopstart + (((i) + (mp)->totloop - 1) % (mp)->totloop)])
+#define ME_POLY_LOOP_NEXT(mloop, mp, i)  (&(mloop)[(mp)->loopstart + (((i) + 1) % (mp)->totloop)])
+
+/* mselect->type */
+#define ME_VSEL        0
+#define ME_ESEL 1
+#define ME_FSEL 2
+
 /* mtface->flag */
 #define TF_SELECT      1 /* use MFace hide flag (after 2.43), should be able to reuse after 2.44 */
 #define TF_ACTIVE      2 /* deprecated! */