Commit: 5fc2055c1568978603041194fb079c06f2efbe5b
Author: Antonio Vazquez
Date:   Sun Jun 18 17:24:01 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rB5fc2055c1568978603041194fb079c06f2efbe5b

WIP: zfighting al most fixed.

Need a way to fix the problem of zdepth  and precision

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

M       source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
M       source/blender/draw/engines/gpencil/gpencil_engine.c
M       source/blender/draw/engines/gpencil/gpencil_engine.h
M       source/blender/draw/engines/gpencil/shaders/gpencil_fill_frag.glsl
M       source/blender/draw/engines/gpencil/shaders/gpencil_stroke_geom.glsl

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

diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c 
b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
index d7fb5afe2fa..788952454af 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
@@ -44,76 +44,6 @@
 #include "draw_cache_impl.h"
 #include "gpencil_engine.h"
 
-/* allocate cache to store GP objects */
-tGPencilObjectCache *gpencil_object_cache_allocate(tGPencilObjectCache *cache, 
int *gp_cache_size, int *gp_cache_used)
-{
-       tGPencilObjectCache *p = NULL;
-
-       /* By default a cache is created with one block with a predefined 
number of free slots,
-       if the size is not enough, the cache is reallocated adding a new block 
of free slots.
-       This is done in order to keep cache small */
-       if (*gp_cache_used + 1 > *gp_cache_size) {
-               if ((*gp_cache_size == 0) || (cache == NULL)) {
-                       p = MEM_callocN(sizeof(struct tGPencilObjectCache) * 
GP_CACHE_BLOCK_SIZE, "tGPencilObjectCache");
-                       *gp_cache_size = GP_CACHE_BLOCK_SIZE;
-               }
-               else {
-                       *gp_cache_size += GP_CACHE_BLOCK_SIZE;
-                       p = MEM_recallocN(cache, sizeof(struct 
tGPencilObjectCache) * *gp_cache_size);
-               }
-               cache = p;
-       }
-       return cache;
-}
-
-/* add a gpencil object to cache to defer drawing */
-void gpencil_object_cache_add(tGPencilObjectCache *cache, RegionView3D *rv3d, 
Object *ob, int *gp_cache_used)
-{
-       /* save object */
-       cache[*gp_cache_used].ob = ob;
-
-       /* calculate zdepth from point of view */
-       float zdepth = 0.0;
-       if (rv3d->is_persp) {
-               zdepth = ED_view3d_calc_zfac(rv3d, ob->loc, NULL);
-       }
-       else {
-               zdepth = -dot_v3v3(rv3d->viewinv[2], ob->loc);
-       }
-       cache[*gp_cache_used].zdepth = zdepth;
-
-       /* increase slots used in cache */
-       ++*gp_cache_used;
-}
-
-/* helper function to sort gpencil objects using qsort */
-static int gpencil_object_cache_compare_zdepth(const void *a1, const void *a2)
-{
-       const tGPencilObjectCache *ps1 = a1, *ps2 = a2;
-
-       if (ps1->zdepth > ps2->zdepth) return 1;
-       else if (ps1->zdepth < ps2->zdepth) return -1;
-
-       return 0;
-}
-
-/* draw objects in cache from back to from */
-void gpencil_object_cache_draw(GPENCIL_e_data *e_data, GPENCIL_Data *vedata, 
ToolSettings *ts,
-       Scene *scene, tGPencilObjectCache *cache, int gp_cache_used)
-{
-       if (gp_cache_used > 0) {
-               /* sort by zdepth */
-               qsort(cache, gp_cache_used, sizeof(tGPencilObjectCache), 
gpencil_object_cache_compare_zdepth);
-               /* inverse loop to draw from back to front */
-               for (int i = gp_cache_used; i > 0; --i) {
-                       Object *ob = cache[i - 1].ob;
-                       DRW_gpencil_populate_datablock(e_data, vedata, scene, 
ob, ts, ob->gpd);
-               }
-       }
-       /* free memory */
-       MEM_SAFE_FREE(cache);
-}
-
 /* verify if cache is valid */
 static bool gpencil_batch_cache_valid(bGPdata *gpd, int cfra)
 {
@@ -258,7 +188,7 @@ static DRWShadingGroup 
*DRW_gpencil_shgroup_fill_create(GPENCIL_Data *vedata, DR
        DRW_shgroup_uniform_int(grp, "t_flip", &stl->shgroups[id].t_flip, 1);
 
        DRW_shgroup_uniform_int(grp, "xraymode", (const int *) &gpd->xray_mode, 
1);
-
+       DRW_shgroup_uniform_int(grp, "sort", (const int 
*)&stl->shgroups[id].sort, 1);
        /* image texture */
        if ((palcolor->fill_style == FILL_STYLE_TEXTURE) || 
(palcolor->fill_style == FILL_STYLE_PATTERN) || (palcolor->flag & 
PAC_COLOR_TEX_MIX)) {
                ImBuf *ibuf;
@@ -297,7 +227,7 @@ DRWShadingGroup 
*DRW_gpencil_shgroup_point_volumetric_create(DRWPass *pass, GPUS
 }
 
 /* create shading group for strokes */
-DRWShadingGroup *DRW_gpencil_shgroup_stroke_create(GPENCIL_Data *vedata, 
DRWPass *pass, GPUShader *shader, Object *ob, bGPdata *gpd)
+DRWShadingGroup *DRW_gpencil_shgroup_stroke_create(GPENCIL_Data *vedata, 
DRWPass *pass, GPUShader *shader, Object *ob, bGPdata *gpd, int id)
 {
        GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
        const float *viewport_size = DRW_viewport_size_get();
@@ -335,6 +265,13 @@ DRWShadingGroup 
*DRW_gpencil_shgroup_stroke_create(GPENCIL_Data *vedata, DRWPass
                /* for drawing always on front */
                DRW_shgroup_uniform_int(grp, "xraymode", &stl->storage->xray, 
1);
        }
+       if (id > -1) {
+               DRW_shgroup_uniform_int(grp, "sort", (const int 
*)&stl->shgroups[id].sort, 1);
+       }
+       else {
+               stl->storage->sort = 0;
+               DRW_shgroup_uniform_int(grp, "sort", &stl->storage->sort, 1);
+       }
 
        return grp;
 }
@@ -485,10 +422,12 @@ static void gpencil_draw_strokes(GpencilBatchCache 
*cache, GPENCIL_e_data *e_dat
 #endif
                if (gps->totpoints > 1) {
                        int id = stl->storage->pal_id;
+                       stl->shgroups[id].sort = stl->g_data->main_sort;
                        stl->shgroups[id].shgrps_fill = 
DRW_gpencil_shgroup_fill_create(vedata, psl->stroke_pass, 
e_data->gpencil_fill_sh, gpd, gps->palcolor, id);
-                       stl->shgroups[id].shgrps_stroke = 
DRW_gpencil_shgroup_stroke_create(vedata, psl->stroke_pass, 
e_data->gpencil_stroke_sh, ob, gpd);
+                       stl->shgroups[id].shgrps_stroke = 
DRW_gpencil_shgroup_stroke_create(vedata, psl->stroke_pass, 
e_data->gpencil_stroke_sh, ob, gpd, id);
                        ++stl->storage->pal_id;
-                       
+                       stl->g_data->main_sort += 6; 
+
                        fillgrp = stl->shgroups[id].shgrps_fill;
                        strokegrp = stl->shgroups[id].shgrps_stroke;
                }
@@ -626,6 +565,8 @@ void DRW_gpencil_populate_datablock(GPENCIL_e_data *e_data, 
void *vedata, Scene
        if (G.debug_value == 668) {
                printf("DRW_gpencil_populate_datablock for %s\n", gpd->id.name);
        }
+       GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
+       stl->g_data->main_sort = 0;
 
        GpencilBatchCache *cache = gpencil_batch_cache_get(gpd, CFRA);
        cache->cache_idx = 0;
@@ -645,6 +586,9 @@ void DRW_gpencil_populate_datablock(GPENCIL_e_data *e_data, 
void *vedata, Scene
                }
                /* draw normal strokes */
                gpencil_draw_strokes(cache, e_data, vedata, ts, ob, gpd, gpl, 
gpf, gpl->opacity, gpl->tintcolor, false, false);
+               
+               /* separate layers */
+               stl->g_data->main_sort += 20;
        }
        /* draw current painting strokes */
        gpencil_draw_buffer_strokes(cache, vedata, ts, gpd);
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c 
b/source/blender/draw/engines/gpencil/gpencil_engine.c
index ed71ac5fe00..9b7f3fd2cf8 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -100,6 +100,7 @@ static void GPENCIL_cache_init(void *vedata)
                /* Alloc transient pointers */
                stl->g_data = MEM_mallocN(sizeof(g_data), "g_data");
                stl->g_data->scene_draw = false;
+               stl->g_data->main_sort = 0;
                stl->storage->xray = GP_XRAY_FRONT; /* used for drawing */
        }
        if (!stl->shgroups) {
@@ -111,13 +112,8 @@ static void GPENCIL_cache_init(void *vedata)
                stl->shgroups = MEM_mallocN(sizeof(GPENCIL_shgroup) * 
GPENCIL_MAX_SHGROUPS, "GPENCIL_shgroup");
        }
        {
-               /* init gp objects cache */
-               stl->g_data->gp_cache_used = 0;
-               stl->g_data->gp_cache_size = 0;
-               stl->g_data->gp_object_cache = NULL;
-
                /* Stroke pass */
-               DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND | 
DRW_STATE_DEPTH_LESS;
+               DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND | 
DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS;
                psl->stroke_pass = DRW_pass_create("Gpencil Stroke Pass", 
state);
                stl->storage->pal_id = 0;
                stl->g_data->shgrps_point_volumetric = 
DRW_gpencil_shgroup_point_volumetric_create(psl->stroke_pass, 
e_data.gpencil_volumetric_sh);
@@ -129,7 +125,7 @@ static void GPENCIL_cache_init(void *vedata)
 
                /* drawing buffer pass */
                psl->drawing_pass = DRW_pass_create("Gpencil Drawing Pass", 
state);
-               stl->g_data->shgrps_drawing_stroke = 
DRW_gpencil_shgroup_stroke_create(vedata, psl->drawing_pass, 
e_data.gpencil_stroke_sh, NULL, NULL);
+               stl->g_data->shgrps_drawing_stroke = 
DRW_gpencil_shgroup_stroke_create(vedata, psl->drawing_pass, 
e_data.gpencil_stroke_sh, NULL, NULL, -1);
                stl->g_data->shgrps_drawing_fill = 
DRW_gpencil_shgroup_drawing_fill_create(psl->drawing_pass, 
e_data.gpencil_drawing_fill_sh);
        }
 }
@@ -139,7 +135,6 @@ static void GPENCIL_cache_populate(void *vedata, Object *ob)
        GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
        const DRWContextState *draw_ctx = DRW_context_state_get();
        Scene *scene = draw_ctx->scene;
-       RegionView3D *rv3d = draw_ctx->rv3d;
        ToolSettings *ts = scene->toolsettings;
 
        /* scene datablock (only once) */
@@ -152,34 +147,18 @@ static void GPENCIL_cache_populate(void *vedata, Object 
*ob)
                        DRW_gpencil_populate_datablock(&e_data, vedata, scene, 
NULL, ts, scene->gpd);
                }
        }
-
        /* object datablock (this is not draw now) */
        if (ob->type == OB_GPENCIL && ob->gpd) {
                if (G.debug_value == 668) {
                        printf("GPENCIL_cache_populate: Object\n");
                }
-               /* allocate memory for saving gp objects */
-               stl->g_data->gp_object_cache = 
gpencil_object_cache_allocate(stl->g_data->gp_object_cache, 
&stl->g_data->gp_cache_size, &stl->g_data->gp_cache_used);
-               /* add for drawing later */
-               gpencil_object_cache_add(stl->g_data->gp_object_cache, rv3d, 
ob, &stl->g_data->gp_cache_used);
+               DRW_gpencil_populate_datablock(&e_data, vedata, scene, ob, ts, 
ob->gpd);
        }
 }
 
 static void GPENCIL_cache_finish(void *vedata)
 {
-       if (G.debug_value == 668) {
-               printf("GPENCIL_cache_finish\n");
-       }
-
        GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
-       const DRWContextState *draw_ctx = DRW_context_state_get();
-       Scene *scene = draw_ctx->scene;
-       ToolSettings *ts = scene->toolsettings;
-
-       /* Draw all pending objects sorted by object location zdepth.For GP 
objects, the order of drawing 
-          is decided by location of the object that is used as a pivot point */
-       gpencil_object_cache_draw(&e_data, vedata, ts, scene, 
stl->g_data->gp_object_cache, stl->g_data->gp_cache_used);
-
        stl->g_data->scene_draw = false;
 }
 
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h 
b/source/blender/draw/engines/gpencil/gpencil_engine.h
index 38a85771535..937b0faa7a0 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -48,6 +48,7 @@ typedef struct GPENCIL_shgroup {
        int t_flip;
        int t_clamp;
        int fill_style;
+       int sort;
        struct DRWShadingGroup *shgrps_fill;
        struct DRWShadingGroup *shgrps_stroke;
 } GPENCIL_shgroup;
@@ -58,6 +59,7 @@ typedef struct GPENCIL_Storage {
        int is_persp;   /* rv3d->is_persp (1-yes) */
        int xray;
        float objscale;
+       in

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to