Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/draw/engines/gpencil/gpencil_cache_utils.c42
-rw-r--r--source/blender/draw/engines/gpencil/gpencil_engine.c3
2 files changed, 42 insertions, 3 deletions
diff --git a/source/blender/draw/engines/gpencil/gpencil_cache_utils.c b/source/blender/draw/engines/gpencil/gpencil_cache_utils.c
index cf3025302ef..972ada22b50 100644
--- a/source/blender/draw/engines/gpencil/gpencil_cache_utils.c
+++ b/source/blender/draw/engines/gpencil/gpencil_cache_utils.c
@@ -31,6 +31,7 @@
#include "BKE_library.h"
#include "BKE_gpencil.h"
+#include "BKE_object.h"
#include "gpencil_engine.h"
@@ -38,7 +39,33 @@
#include "DEG_depsgraph.h"
- /* add a gpencil object to cache to defer drawing */
+/* verify if exist a non instanced version of the object */
+static bool gpencil_has_noninstanced_object(Object *ob_instance)
+{
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ const ViewLayer *view_layer = draw_ctx->view_layer;
+ Object *ob = NULL;
+ for (Base *base = view_layer->object_bases.first; base; base = base->next) {
+ ob = base->object;
+ if (ob->type != OB_GPENCIL) {
+ continue;
+ }
+ /* object must be visible (invisible objects don't create VBO data) */
+ if (!(DRW_object_visibility_in_active_context(ob) & OB_VISIBLE_SELF)) {
+ continue;
+ }
+ /* is not duplicated and the name is equals */
+ if ((ob->base_flag & BASE_FROM_DUPLI) == 0) {
+ if (STREQ(ob->id.name, ob_instance->id.name)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+/* add a gpencil object to cache to defer drawing */
tGPencilObjectCache *gpencil_object_cache_add(
tGPencilObjectCache *cache_array, Object *ob,
int *gp_cache_size, int *gp_cache_used)
@@ -76,7 +103,18 @@ tGPencilObjectCache *gpencil_object_cache_add(
cache_elem->idx = *gp_cache_used;
/* object is duplicated (particle) */
- cache_elem->is_dup_ob = ob->base_flag & BASE_FROM_DUPLI;
+ if (ob->base_flag & BASE_FROM_DUPLI) {
+ /* Check if the original object is not in the viewlayer
+ * and cannot be managed as dupli. This is slower, but required to keep
+ * the particle drawing FPS and display instanced objects in scene
+ * without the original object */
+ bool has_original = gpencil_has_noninstanced_object(ob);
+ cache_elem->is_dup_ob = (has_original) ? ob->base_flag & BASE_FROM_DUPLI : false;
+ }
+ else {
+ cache_elem->is_dup_ob = false;
+ }
+
cache_elem->scale = mat4_to_scale(ob->obmat);
/* save FXs */
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index 303178c1a5e..d1a8f40a428 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -620,7 +620,8 @@ void GPENCIL_cache_populate(void *vedata, Object *ob)
/* enable instance loop */
if (!stl->g_data->do_instances) {
- stl->g_data->do_instances = ob->base_flag & BASE_FROM_DUPLI;
+ tGPencilObjectCache *cache_ob = &stl->g_data->gp_object_cache[stl->g_data->gp_cache_used - 1];
+ stl->g_data->do_instances = cache_ob->is_dup_ob;
}
/* load drawing data */