[Bf-blender-cvs] [81436b95bdf] greasepencil-refactor: GPencil: Refactor: Implement Object sorting
Clément Foucault
noreply at git.blender.org
Thu Dec 12 22:33:44 CET 2019
Commit: 81436b95bdfb0268d177739c7e71bd6a79c9e4ba
Author: Clément Foucault
Date: Thu Dec 12 22:33:16 2019 +0100
Branches: greasepencil-refactor
https://developer.blender.org/rB81436b95bdfb0268d177739c7e71bd6a79c9e4ba
GPencil: Refactor: Implement Object sorting
===================================================================
M source/blender/draw/engines/gpencil/gpencil_cache_utils.c
M source/blender/draw/engines/gpencil/gpencil_engine.c
M source/blender/draw/engines/gpencil/gpencil_engine.h
===================================================================
diff --git a/source/blender/draw/engines/gpencil/gpencil_cache_utils.c b/source/blender/draw/engines/gpencil/gpencil_cache_utils.c
index 729ae0dcfa1..db84f4e044e 100644
--- a/source/blender/draw/engines/gpencil/gpencil_cache_utils.c
+++ b/source/blender/draw/engines/gpencil/gpencil_cache_utils.c
@@ -34,6 +34,7 @@
#include "BKE_object.h"
#include "BLI_memblock.h"
+#include "BLI_link_utils.h"
#include "gpencil_engine.h"
@@ -42,12 +43,15 @@
#include "DEG_depsgraph.h"
/* TODO remove the _new suffix. */
-GPENCIL_tObject *gpencil_object_cache_add_new(GPENCIL_PrivateData *pd, Object *UNUSED(ob))
+GPENCIL_tObject *gpencil_object_cache_add_new(GPENCIL_PrivateData *pd, Object *ob)
{
GPENCIL_tObject *tgp_ob = BLI_memblock_alloc(pd->gp_object_pool);
tgp_ob->layers.first = tgp_ob->layers.last = NULL;
tgp_ob->vfx.first = tgp_ob->vfx.last = NULL;
+ tgp_ob->camera_z = dot_v3v3(pd->camera_z_axis, ob->obmat[3]);
+
+ BLI_LINKS_APPEND(&pd->tobjects, tgp_ob);
return tgp_ob;
}
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index f5f157f8e55..05de8a888f7 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -306,6 +306,12 @@ static void GPENCIL_engine_init_new(void *ved)
stl->pd->gp_layer_pool = vldata->gp_layer_pool;
stl->pd->gp_vfx_pool = vldata->gp_vfx_pool;
stl->pd->last_material_pool = NULL;
+ stl->pd->tobjects.first = NULL;
+ stl->pd->tobjects.last = NULL;
+
+ float viewmatinv[4][4];
+ DRW_view_viewmat_get(NULL, viewmatinv, true);
+ copy_v3_v3(stl->pd->camera_z_axis, viewmatinv[2]);
}
void GPENCIL_engine_init(void *vedata)
@@ -965,6 +971,30 @@ void GPENCIL_cache_populate(void *vedata, Object *ob)
}
}
+#define SORT_IMPL_LINKTYPE GPENCIL_tObject
+
+#define SORT_IMPL_FUNC gpencil_tobject_sort_fn_r
+#include "../../blenlib/intern/list_sort_impl.h"
+#undef SORT_IMPL_FUNC
+
+#undef SORT_IMPL_LINKTYPE
+
+static int gpencil_tobject_dist_sort(const void *a, const void *b)
+{
+ const GPENCIL_tObject *ob_a = (const GPENCIL_tObject *)a;
+ const GPENCIL_tObject *ob_b = (const GPENCIL_tObject *)b;
+ /* Reminder, camera_z is negative in front of the camera. */
+ if (ob_a->camera_z > ob_b->camera_z) {
+ return 1;
+ }
+ else if (ob_a->camera_z < ob_b->camera_z) {
+ return -1;
+ }
+ else {
+ return 0;
+ }
+}
+
static void GPENCIL_cache_finish_new(void *ved)
{
GPENCIL_Data *vedata = (GPENCIL_Data *)ved;
@@ -979,7 +1009,8 @@ static void GPENCIL_cache_finish_new(void *ved)
GPU_uniformbuffer_update(pool->ubo, pool->mat_data);
}
- /* TODO sort */
+ /* Sort object by distance to the camera. */
+ pd->tobjects.first = gpencil_tobject_sort_fn_r(pd->tobjects.first, gpencil_tobject_dist_sort);
}
void GPENCIL_cache_finish(void *vedata)
@@ -1178,12 +1209,7 @@ static void GPENCIL_draw_scene_new(void *ved)
GPENCIL_Data *vedata = (GPENCIL_Data *)ved;
GPENCIL_PrivateData *pd = vedata->stl->pd;
- /* TODO iter in the right order. */
- BLI_memblock_iter iter;
- BLI_memblock_iternew(pd->gp_object_pool, &iter);
- GPENCIL_tObject *ob;
-
- while ((ob = (GPENCIL_tObject *)BLI_memblock_iterstep(&iter))) {
+ for (GPENCIL_tObject *ob = pd->tobjects.first; ob; ob = ob->next) {
DRW_stats_group_start("GPencil Object");
if (ob->vfx.first) {
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h
index 1fc3139a306..b5e3527f631 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -183,6 +183,9 @@ typedef struct GPENCIL_tLayer {
} GPENCIL_tLayer;
typedef struct GPENCIL_tObject {
+ /** Linklist */
+ struct GPENCIL_tObject *next;
+
struct {
GPENCIL_tLayer *first, *last;
} layers;
@@ -190,6 +193,9 @@ typedef struct GPENCIL_tObject {
struct {
GPENCIL_tVfx *first, *last;
} vfx;
+
+ /* Distance to camera. Used for sorting. */
+ float camera_z;
} GPENCIL_tObject;
/* *********** LISTS *********** */
@@ -388,8 +394,14 @@ typedef struct GPENCIL_PrivateData {
struct BLI_memblock *gp_material_pool;
/* Last used material pool. */
GPENCIL_MaterialPool *last_material_pool;
+ /* Linked list of tObjects. */
+ struct {
+ GPENCIL_tObject *first, *last;
+ } tobjects;
/* Current frame */
int cfra;
+ /* Used for computing object distance to camera. */
+ float camera_z_axis[3];
} GPENCIL_PrivateData;
/* flags for fast drawing support */
More information about the Bf-blender-cvs
mailing list