[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