[Bf-blender-cvs] [42ce5da09d9] asset-greasepencil: GPencil: (WIP) First steps to implement datablock preview
Antonio Vazquez
noreply at git.blender.org
Thu Jul 8 17:14:52 CEST 2021
Commit: 42ce5da09d95165b69f2b61725957ad9c8c5247f
Author: Antonio Vazquez
Date: Thu Jul 8 17:14:46 2021 +0200
Branches: asset-greasepencil
https://developer.blender.org/rB42ce5da09d95165b69f2b61725957ad9c8c5247f
GPencil: (WIP) First steps to implement datablock preview
The preview is not working and Blender keeps locked when closing.
Also, it looks the browser does not display this type.
===================================================================
M source/blender/blenkernel/intern/icons.cc
M source/blender/editors/render/render_preview.c
===================================================================
diff --git a/source/blender/blenkernel/intern/icons.cc b/source/blender/blenkernel/intern/icons.cc
index 7e9f81f9c83..c98404d98a6 100644
--- a/source/blender/blenkernel/intern/icons.cc
+++ b/source/blender/blenkernel/intern/icons.cc
@@ -1,4 +1,4 @@
-/*
+/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
@@ -371,6 +371,7 @@ PreviewImage **BKE_previewimg_id_get_p(const ID *id)
ID_PRV_CASE(ID_IM, Image);
ID_PRV_CASE(ID_BR, Brush);
ID_PRV_CASE(ID_OB, Object);
+ ID_PRV_CASE(ID_GD, bGPdata);
ID_PRV_CASE(ID_GR, Collection);
ID_PRV_CASE(ID_SCE, Scene);
ID_PRV_CASE(ID_SCR, bScreen);
@@ -434,7 +435,7 @@ void BKE_previewimg_id_custom_set(ID *id, const char *path)
bool BKE_previewimg_id_supports_jobs(const ID *id)
{
- return ELEM(GS(id->name), ID_OB, ID_MA, ID_TE, ID_LA, ID_WO, ID_IM, ID_BR);
+ return ELEM(GS(id->name), ID_OB, ID_MA, ID_TE, ID_LA, ID_WO, ID_IM, ID_BR, ID_GD);
}
void BKE_previewimg_deferred_release(PreviewImage *prv)
diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c
index e8f69aded5b..f88bf07a2b6 100644
--- a/source/blender/editors/render/render_preview.c
+++ b/source/blender/editors/render/render_preview.c
@@ -45,6 +45,7 @@
#include "DNA_brush_types.h"
#include "DNA_camera_types.h"
#include "DNA_collection_types.h"
+#include "DNA_gpencil_types.h"
#include "DNA_light_types.h"
#include "DNA_material_types.h"
#include "DNA_node_types.h"
@@ -322,6 +323,7 @@ static ID *duplicate_ids(ID *id, const bool allow_failure)
case ID_MA:
case ID_TE:
case ID_LA:
+ case ID_GD:
case ID_WO: {
BLI_assert(BKE_previewimg_id_supports_jobs(id));
ID *id_copy = BKE_id_copy_ex(
@@ -687,6 +689,8 @@ struct ObjectPreviewData {
/* Copy of the object to create the preview for. The copy is for thread safety (and to insert it
* into an own main). */
Object *object;
+ /* Datablock copy. Can be NULL. */
+ void *datablock;
int sizex;
int sizey;
};
@@ -764,6 +768,7 @@ static void object_preview_render(IconPreview *preview, IconPreviewSize *preview
.pr_main = preview_main,
/* Act on a copy. */
.object = (Object *)preview->id_copy,
+ .datablock = NULL,
.sizex = preview_sized->sizex,
.sizey = preview_sized->sizey,
};
@@ -862,6 +867,106 @@ static void action_preview_render(IconPreview *preview, IconPreviewSize *preview
/** \} */
+/* -------------------------------------------------------------------- */
+/** \name Grease Pencil Preview
+ * \{ */
+
+static Scene *gpencil_preview_scene_create(const struct ObjectPreviewData *preview_data,
+ Depsgraph **r_depsgraph)
+{
+ Scene *scene = BKE_scene_add(preview_data->pr_main, "Object preview scene");
+ ViewLayer *view_layer = scene->view_layers.first;
+ Depsgraph *depsgraph = DEG_graph_new(
+ preview_data->pr_main, scene, view_layer, DAG_EVAL_VIEWPORT);
+
+ /* Grease pencil draw engine needs an object to draw the datablock. */
+ bGPdata *gpd = (bGPdata *)preview_data->datablock;
+ Object *ob_temp = BKE_object_add_for_data(
+ preview_data->pr_main, view_layer, OB_GPENCIL, "preview_object", &gpd->id, false);
+
+ BLI_assert(ob_temp != NULL);
+ BLI_addtail(&preview_data->pr_main->objects, ob_temp);
+
+ BKE_collection_object_add(preview_data->pr_main, scene->master_collection, ob_temp);
+
+ Object *camera_object = object_preview_camera_create(preview_data->pr_main, view_layer, ob_temp);
+
+ scene->camera = camera_object;
+ scene->r.xsch = preview_data->sizex;
+ scene->r.ysch = preview_data->sizey;
+ scene->r.size = 100;
+
+ Base *preview_base = BKE_view_layer_base_find(view_layer, ob_temp);
+ /* For 'view selected' below. */
+ preview_base->flag |= BASE_SELECTED;
+
+ DEG_graph_build_from_view_layer(depsgraph);
+ DEG_evaluate_on_refresh(depsgraph);
+
+ ED_view3d_camera_to_view_selected(preview_data->pr_main, depsgraph, scene, camera_object);
+
+ BKE_scene_graph_update_tagged(depsgraph, preview_data->pr_main);
+
+ *r_depsgraph = depsgraph;
+ return scene;
+}
+
+/* Render a grease pencil datablock. As the Draw Engine needs an object, the datablock is assigned
+ * to a temporary object, just for render. */
+static void gpencil_preview_render(IconPreview *preview, IconPreviewSize *preview_sized)
+{
+ Main *preview_main = BKE_main_new();
+ const float pixelsize_old = U.pixelsize;
+ char err_out[256] = "unknown";
+
+ BLI_assert(preview->id_copy && (preview->id_copy != preview->id));
+
+ struct ObjectPreviewData preview_data = {
+ .pr_main = preview_main,
+ /* Act on a copy. */
+ .object = NULL,
+ .datablock = (bGPdata *)preview->id_copy,
+ .sizex = preview_sized->sizex,
+ .sizey = preview_sized->sizey,
+ };
+ Depsgraph *depsgraph;
+ Scene *scene = gpencil_preview_scene_create(&preview_data, &depsgraph);
+
+ /* Ownership is now ours. */
+ preview->id_copy = NULL;
+
+ U.pixelsize = 2.0f;
+
+ View3DShading shading;
+ BKE_screen_view3d_shading_init(&shading);
+
+ ImBuf *ibuf = ED_view3d_draw_offscreen_imbuf_simple(
+ depsgraph,
+ DEG_get_evaluated_scene(depsgraph),
+ &shading,
+ OB_TEXTURE,
+ DEG_get_evaluated_object(depsgraph, scene->camera),
+ preview_sized->sizex,
+ preview_sized->sizey,
+ IB_rect,
+ V3D_OFSDRAW_OVERRIDE_SCENE_SETTINGS,
+ R_ALPHAPREMUL,
+ NULL,
+ NULL,
+ err_out);
+
+ U.pixelsize = pixelsize_old;
+
+ if (ibuf) {
+ icon_copy_rect(ibuf, preview_sized->sizex, preview_sized->sizey, preview_sized->rect);
+ IMB_freeImBuf(ibuf);
+ }
+
+ DEG_graph_free(depsgraph);
+ BKE_main_free(preview_main);
+}
+/** \} */
+
/* -------------------------------------------------------------------- */
/** \name New Shader Preview System
* \{ */
@@ -1523,6 +1628,9 @@ static void icon_preview_startjob_all_sizes(void *customdata,
case ID_AC:
action_preview_render(ip, cur_size);
continue;
+ case ID_GD:
+ gpencil_preview_render(ip, cur_size);
+ continue;
default:
/* Fall through to the same code as the `ip->id == NULL` case. */
break;
More information about the Bf-blender-cvs
mailing list