Commit: 10aee127d4b003c2d910999ed5cb0d699bf4ba7b
Author: Antony Riakiotakis
Date:   Fri Jan 2 13:38:04 2015 +0100
Branches: vertex_paint_pbvh
https://developer.blender.org/rB10aee127d4b003c2d910999ed5cb0d699bf4ba7b

WIP incorrect inconvenient code that is supposed to draw PBVH colors.

===================================================================

M       source/blender/blenkernel/BKE_pbvh.h
M       source/blender/blenkernel/intern/cdderivedmesh.c
M       source/blender/blenkernel/intern/pbvh.c
M       source/blender/blenkernel/intern/pbvh_intern.h
M       source/blender/blenkernel/intern/subsurf_ccg.c
M       source/blender/gpu/GPU_buffers.h
M       source/blender/gpu/intern/gpu_buffers.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_pbvh.h 
b/source/blender/blenkernel/BKE_pbvh.h
index c8c693f..63d207a 100644
--- a/source/blender/blenkernel/BKE_pbvh.h
+++ b/source/blender/blenkernel/BKE_pbvh.h
@@ -62,7 +62,7 @@ typedef void (*BKE_pbvh_HitOccludedCallback)(PBVHNode *node, 
void *data, float *
 
 PBVH *BKE_pbvh_new(void);
 void BKE_pbvh_build_mesh(PBVH *bvh, struct MFace *faces, struct MVert *verts,
-                         int totface, int totvert, struct CustomData *vdata);
+                         int totface, int totvert, struct CustomData *vdata, 
struct CustomData *ldata);
 void BKE_pbvh_build_grids(PBVH *bvh, struct CCGElem **grid_elems,
                           struct DMGridAdjacency *gridadj, int totgrid,
                           struct CCGKey *key, void **gridfaces, struct 
DMFlagMat *flagmats,
@@ -115,7 +115,7 @@ void BKE_pbvh_draw(PBVH *bvh, float (*planes)[4], float 
(*face_nors)[3],
                    int (*setMaterial)(int matnr, void *attribs), bool 
wireframe);
 
 /* PBVH Access */
-typedef enum {
+typedef enum PBVHType {
        PBVH_FACES,
        PBVH_GRIDS,
        PBVH_BMESH
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c 
b/source/blender/blenkernel/intern/cdderivedmesh.c
index f6df071..feb11e0 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -307,7 +307,7 @@ static PBVH *cdDM_getPBVH(Object *ob, DerivedMesh *dm)
                BKE_mesh_tessface_ensure(me);
                
                BKE_pbvh_build_mesh(cddm->pbvh, me->mface, me->mvert,
-                                   me->totface, me->totvert, &me->vdata);
+                                   me->totface, me->totvert, &me->vdata, 
&me->ldata);
 
                if (ss) {
                        pbvh_show_diffuse_color_set(cddm->pbvh, 
ss->show_diffuse_color);
diff --git a/source/blender/blenkernel/intern/pbvh.c 
b/source/blender/blenkernel/intern/pbvh.c
index bd95389..75e327c 100644
--- a/source/blender/blenkernel/intern/pbvh.c
+++ b/source/blender/blenkernel/intern/pbvh.c
@@ -538,7 +538,7 @@ static void pbvh_build(PBVH *bvh, BB *cb, BBC *prim_bbc, 
int totprim)
 }
 
 /* Do a full rebuild with on Mesh data structure */
-void BKE_pbvh_build_mesh(PBVH *bvh, MFace *faces, MVert *verts, int totface, 
int totvert, struct CustomData *vdata)
+void BKE_pbvh_build_mesh(PBVH *bvh, MFace *faces, MVert *verts, int totface, 
int totvert, struct CustomData *vdata, CustomData *ldata)
 {
        BBC *prim_bbc = NULL;
        BB cb;
@@ -551,7 +551,11 @@ void BKE_pbvh_build_mesh(PBVH *bvh, MFace *faces, MVert 
*verts, int totface, int
        bvh->totvert = totvert;
        bvh->leaf_limit = LEAF_LIMIT;
        bvh->vdata = vdata;
-
+       bvh->ldata = ldata;
+       
+       if (bvh->ldata) {
+               bvh->drawtype |= PBVH_DRAW_NO_INDEXED;
+       }
        BB_reset(&cb);
 
        /* For each face, store the AABB and the AABB centroid */
@@ -1095,7 +1099,7 @@ static void pbvh_update_draw_buffers(PBVH *bvh, PBVHNode 
**nodes, int totnode)
                                                
GPU_build_mesh_pbvh_buffers(node->face_vert_indices,
                                                                   bvh->faces, 
bvh->verts,
                                                                   
node->prim_indices,
-                                                                  
node->totprim);
+                                                                  
node->totprim, (bvh->drawtype & PBVH_DRAW_NO_INDEXED) != 0);
                                        break;
                                case PBVH_BMESH:
                                        node->draw_buffers =
@@ -1126,6 +1130,8 @@ static void pbvh_update_draw_buffers(PBVH *bvh, PBVHNode 
**nodes, int totnode)
                                                                
node->face_verts,
                                                                
CustomData_get_layer(bvh->vdata,
                                                                                
     CD_PAINT_MASK),
+                                                               
CustomData_get_layer(bvh->ldata,
+                                                                               
         CD_MLOOPCOL),
                                                                
node->face_vert_indices,
                                                                
bvh->show_diffuse_color);
                                        break;
diff --git a/source/blender/blenkernel/intern/pbvh_intern.h 
b/source/blender/blenkernel/intern/pbvh_intern.h
index 6b3ef8e..696d9e8 100644
--- a/source/blender/blenkernel/intern/pbvh_intern.h
+++ b/source/blender/blenkernel/intern/pbvh_intern.h
@@ -116,11 +116,18 @@ typedef enum {
        PBVH_DYNTOPO_SMOOTH_SHADING = 1
 } PBVHFlags;
 
+/* don't use indexed drawing even if smooth shaded because we need to sample 
per face face data */
+typedef enum {
+       PBVH_DRAW_NO_INDEXED = 1
+} PBVHDraw;
+
 typedef struct PBVHBMeshLog PBVHBMeshLog;
+typedef enum PBVHType PBVHType;
 
 struct PBVH {
        PBVHType type;
        PBVHFlags flags;
+       PBVHDraw drawtype;
 
        PBVHNode *nodes;
        int node_mem_count, totnode;
@@ -135,6 +142,7 @@ struct PBVH {
        MVert *verts;
        MFace *faces;
        CustomData *vdata;
+       CustomData *ldata;
 
        /* Grid Data */
        CCGKey gridkey;
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c 
b/source/blender/blenkernel/intern/subsurf_ccg.c
index f14b7ee..a964057 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -3389,10 +3389,11 @@ static struct PBVH *ccgDM_getPBVH(Object *ob, 
DerivedMesh *dm)
        }
        else if (ob->type == OB_MESH) {
                Mesh *me = ob->data;
+               void *ldata = (ob->mode & OB_MODE_VERTEX_PAINT) ? &me->ldata : 
NULL;
                ob->paint->pbvh = ccgdm->pbvh = BKE_pbvh_new();
                BLI_assert(!(me->mface == NULL && me->mpoly != NULL)); /* BMESH 
ONLY complain if mpoly is valid but not mface */
                BKE_pbvh_build_mesh(ccgdm->pbvh, me->mface, me->mvert,
-                                   me->totface, me->totvert, &me->vdata);
+                                   me->totface, me->totvert, &me->vdata, 
ldata);
        }
 
        if (ccgdm->pbvh && ob->paint->sculpt)
diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h
index e9b600a..0dc6646 100644
--- a/source/blender/gpu/GPU_buffers.h
+++ b/source/blender/gpu/GPU_buffers.h
@@ -165,7 +165,7 @@ typedef struct GPU_PBVH_Buffers GPU_PBVH_Buffers;
 /* build */
 GPU_PBVH_Buffers *GPU_build_mesh_pbvh_buffers(int (*face_vert_indices)[4],
                                     struct MFace *mface, struct MVert *mvert,
-                                    int *face_indices, int totface);
+                                    int *face_indices, int totface, bool 
no_indexed);
 
 GPU_PBVH_Buffers *GPU_build_grid_pbvh_buffers(int *grid_indices, int totgrid,
                                     unsigned int **grid_hidden, int gridsize);
@@ -175,7 +175,7 @@ GPU_PBVH_Buffers *GPU_build_bmesh_pbvh_buffers(int 
smooth_shading);
 /* update */
 
 void GPU_update_mesh_pbvh_buffers(GPU_PBVH_Buffers *buffers, MVert *mvert,
-                                                        int *vert_indices, int 
totvert, const float *vmask,
+                                                        int *vert_indices, int 
totvert, const float *vmask, const int *lcol,
                                                         int 
(*face_vert_indices)[4], bool show_diffuse_color);
 
 void GPU_update_bmesh_pbvh_buffers(GPU_PBVH_Buffers *buffers,
diff --git a/source/blender/gpu/intern/gpu_buffers.c 
b/source/blender/gpu/intern/gpu_buffers.c
index f0ef55a..f3e223e 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -1573,7 +1573,7 @@ static void gpu_color_from_mask_quad_set(const CCGKey 
*key,
 }
 
 void GPU_update_mesh_pbvh_buffers(GPU_PBVH_Buffers *buffers, MVert *mvert,
-                             int *vert_indices, int totvert, const float 
*vmask,
+                             int *vert_indices, int totvert, const float 
*vmask, const int *lcol,
                              int (*face_vert_indices)[4], bool 
show_diffuse_color)
 {
        VertexBufferFormat *vert_data;
@@ -1623,7 +1623,11 @@ void GPU_update_mesh_pbvh_buffers(GPU_PBVH_Buffers 
*buffers, MVert *mvert,
                                        VertexBufferFormat *out = vert_data + 
face_vert_indices[face][index]; \
                                        if (vmask) \
                                                
gpu_color_from_mask_copy(vmask[vertex], diffuse_color, out->color); \
-                                       else \
+                                       else if (lcol) { \
+                                               char *lc = (char *)(lcol + 
vertex); \
+                                               copy_v3_v3_char((char 
*)out->color, lc); \
+                                               printf("updating vcol\n"); \
+                                       } else \
                                                rgb_float_to_uchar(out->color, 
diffuse_color); \
                                } (void)0
 
@@ -1688,9 +1692,13 @@ void GPU_update_mesh_pbvh_buffers(GPU_PBVH_Buffers 
*buffers, MVert *mvert,
 
                                                        if (vmask)
                                                                
gpu_color_from_mask_copy(fmask, diffuse_color, out->color);
-                                                       else
+                                                       if (lcol) {
+                                                               char *lc = 
(char *)(lcol + fv[vi[j][k]]);
+                                                               
copy_v3_v3_char((char *)out->color, lc);
+                                                               
printf("updating vcol\n");
+                                                       } else
                                                                
rgb_float_to_uchar(out->color, diffuse_color);
-
+                                                       
                                                        vert_data++;
                                                }
                                        }
@@ -1713,7 +1721,7 @@ void GPU_update_mesh_pbvh_buffers(GPU_PBVH_Buffers 
*buffers, MVert *mvert,
 GPU_PBVH_Buffers *GPU_build_mesh_pbvh_buffers(int (*face_vert_indices)[4],
                                     MFace *mface, MVert *mvert,
                                     int *face_indices,
-                                    int totface)
+                                    int totface, bool no_indexed)
 {
        GPU_PBVH_Buffers *buffers;
        unsigned short *tri_data;
@@ -1721,7 +1729,7 @@ GPU_PBVH_Buffers *GPU_build_mesh_pbvh_buffers(int 
(*face_vert_indices)[4],
 
        buffers = MEM_callocN(sizeof(GPU_PBVH_Buffers), "GPU_Buffers");
        buffers->index_type = GL_UNSIGNED_SHORT;
-       buffers->smooth = mface[face_indices[0]].flag & ME_SMOOTH;
+       buffers->smooth = (mface[face_indices[0]].flag & ME_SMOOTH) && 
!no_indexed;
 
        buffers->show_diffuse_color = false;
        buffers->use_matcaps = false;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to