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:
authorSergey Sharybin <sergey.vfx@gmail.com>2019-02-06 13:49:41 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2019-02-06 18:11:51 +0300
commit8c87af74409a3e6681698ba1bf150dd6155e202f (patch)
treea9549a2315fed37625e8bd126e91c8855a00147a /source/blender/editors
parente21ae0bb267a54482108ddd4feed99c89241804b (diff)
Improvements and fixes to Cycles metadata
This is a request by the studio here to make it possible to see how many samples were used to render a specific shot or a frame. It is a bit more tricky than simply stamping number of samples from a scene since rendering is happening in multiple ranges of samples. This change makes it so Cycles saves configured number of samples for the specific view layer, and also stores start sample and number of samples when rendering only a subrange of all samples. The format used is "cycles.<view_layer_name>.><field>", which allows to have information about all layers in a multi-layer EXR file. Ideally we can store simplified "cycles.<field>" if we know that there is only one render layer in the file, but detecting this is somewhat tricky since Cycles operates on an evaluated scene which always have single view layer. The metadata is shown in the Metadata panels for clip, image and sequencer spaces. Example screenshot which shows the metadata: {F6527727} Reviewers: brecht Reviewed By: brecht Subscribers: fsiddi Differential Revision: https://developer.blender.org/D4311
Diffstat (limited to 'source/blender/editors')
-rw-r--r--source/blender/editors/include/ED_screen.h2
-rw-r--r--source/blender/editors/screen/area.c25
-rw-r--r--source/blender/editors/space_clip/clip_buttons.c36
-rw-r--r--source/blender/editors/space_image/image_buttons.c28
-rw-r--r--source/blender/editors/space_sequencer/sequencer_buttons.c56
5 files changed, 141 insertions, 6 deletions
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index e3146668571..b5ea993900c 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -47,6 +47,7 @@ struct bContext;
struct bScreen;
struct rcti;
struct uiBlock;
+struct uiLayout;
struct wmEvent;
struct wmKeyConfig;
struct wmMsgBus;
@@ -98,6 +99,7 @@ void ED_region_visibility_change_update(struct bContext *C, struct ARegion *a
void ED_region_info_draw(struct ARegion *ar, const char *text, float fill_color[4], const bool full_redraw);
void ED_region_info_draw_multiline(ARegion *ar, const char *text_array[], float fill_color[4], const bool full_redraw);
void ED_region_image_metadata_draw(int x, int y, struct ImBuf *ibuf, const rctf *frame, float zoomx, float zoomy);
+void ED_region_image_metadata_panel_draw(struct ImBuf *ibuf, struct uiLayout *layout);
void ED_region_grid_draw(struct ARegion *ar, float zoomx, float zoomy);
float ED_region_blend_alpha(struct ARegion *ar);
void ED_region_visible_rect(struct ARegion *ar, struct rcti *rect);
diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c
index cafe627372b..e8a393dfc37 100644
--- a/source/blender/editors/screen/area.c
+++ b/source/blender/editors/screen/area.c
@@ -2756,7 +2756,7 @@ static void metadata_draw_imbuf(ImBuf *ibuf, const rctf *rect, int fontid, const
for (i = 5; i < 10; i++) {
len = BLI_snprintf_rlen(temp_str, MAX_METADATA_STR, "%s: ", meta_data_list[i]);
if (metadata_is_valid(ibuf, temp_str, i, len)) {
- BLF_position(fontid, xmin + ofs_x, ymin, 0.0f);
+ BLF_position(fontid, xmin + ofs_x, ymin + ofs_y, 0.0f);
BLF_draw(fontid, temp_str, BLF_DRAW_STR_DUMMY_MAX);
ofs_x += BLF_width(fontid, temp_str, BLF_DRAW_STR_DUMMY_MAX) + UI_UNIT_X;
@@ -2802,6 +2802,7 @@ static float metadata_box_height_get(ImBuf *ibuf, int fontid, const bool is_top)
for (i = 5; i < 10; i++) {
if (metadata_is_valid(ibuf, str, i, 0)) {
count = 1;
+ break;
}
}
}
@@ -2886,6 +2887,28 @@ void ED_region_image_metadata_draw(int x, int y, ImBuf *ibuf, const rctf *frame,
GPU_matrix_pop();
}
+typedef struct MetadataPanelDrawContext {
+ uiLayout *layout;
+} MetadataPanelDrawContext;
+
+static void metadata_panel_draw_field(
+ const char *field,
+ const char *value,
+ void *ctx_v)
+{
+ MetadataPanelDrawContext *ctx = (MetadataPanelDrawContext *)ctx_v;
+ uiLayout *row = uiLayoutRow(ctx->layout, false);
+ uiItemL(row, field, ICON_NONE);
+ uiItemL(row, value, ICON_NONE);
+}
+
+void ED_region_image_metadata_panel_draw(ImBuf *ibuf, uiLayout *layout)
+{
+ MetadataPanelDrawContext ctx;
+ ctx.layout = layout;
+ IMB_metadata_foreach(ibuf, metadata_panel_draw_field, &ctx);
+}
+
void ED_region_grid_draw(ARegion *ar, float zoomx, float zoomy)
{
float gridsize, gridstep = 1.0f / 32.0f;
diff --git a/source/blender/editors/space_clip/clip_buttons.c b/source/blender/editors/space_clip/clip_buttons.c
index 3810b60adf2..4b91d98718d 100644
--- a/source/blender/editors/space_clip/clip_buttons.c
+++ b/source/blender/editors/space_clip/clip_buttons.c
@@ -29,8 +29,9 @@
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
-#include "BLI_math.h"
#include "BLI_utildefines.h"
+#include "BLI_listbase.h"
+#include "BLI_math.h"
#include "BLI_path_util.h"
#include "BLI_string.h"
@@ -43,7 +44,9 @@
#include "DEG_depsgraph.h"
+#include "ED_clip.h"
#include "ED_gpencil.h"
+#include "ED_screen.h"
#include "UI_interface.h"
#include "UI_resources.h"
@@ -60,9 +63,38 @@
/* Panels */
-void ED_clip_buttons_register(ARegionType *UNUSED(art))
+static bool metadata_panel_context_poll(const bContext *C, PanelType *UNUSED(pt))
+{
+ return ED_space_clip_poll((bContext *)C);
+}
+
+static void metadata_panel_context_draw(const bContext *C, Panel *panel)
{
+ SpaceClip *space_clip = CTX_wm_space_clip(C);
+ /* NOTE: This might not be exactly the same image buffer as shown in the
+ * clip editor itself, since that might be coming from proxy, or being
+ * postprocessed (stabilized or undistored).
+ * Ideally we need to query metadata from an original image or movie without
+ * reading actual pixels to speed up the process. */
+ ImBuf *ibuf = ED_space_clip_get_buffer(space_clip);
+ if (ibuf != NULL) {
+ ED_region_image_metadata_panel_draw(ibuf, panel->layout);
+ IMB_freeImBuf(ibuf);
+ }
+}
+void ED_clip_buttons_register(ARegionType *art)
+{
+ PanelType *pt;
+
+ pt = MEM_callocN(sizeof(PanelType), "spacetype clip panel metadata");
+ strcpy(pt->idname, "CLIP_PT_metadata");
+ strcpy(pt->label, N_("Metadata"));
+ strcpy(pt->category, "Footage");
+ strcpy(pt->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA);
+ pt->poll = metadata_panel_context_poll;
+ pt->draw = metadata_panel_context_draw;
+ BLI_addtail(&art->paneltypes, pt);
}
/********************* MovieClip Template ************************/
diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c
index db0fa34879a..1a7e81f55aa 100644
--- a/source/blender/editors/space_image/image_buttons.c
+++ b/source/blender/editors/space_image/image_buttons.c
@@ -1269,9 +1269,35 @@ void uiTemplateImageInfo(uiLayout *layout, bContext *C, Image *ima, ImageUser *i
#undef MAX_IMAGE_INFO_LEN
-void image_buttons_register(ARegionType *UNUSED(art))
+static bool metadata_panel_context_poll(const bContext *C, PanelType *UNUSED(pt))
{
+ SpaceImage *space_image = CTX_wm_space_image(C);
+ return space_image != NULL && space_image->image != NULL;
+}
+static void metadata_panel_context_draw(const bContext *C, Panel *panel)
+{
+ void *lock;
+ SpaceImage *space_image = CTX_wm_space_image(C);
+ Image *image = space_image->image;
+ ImBuf *ibuf = BKE_image_acquire_ibuf(image, &space_image->iuser, &lock);
+ if (ibuf != NULL) {
+ ED_region_image_metadata_panel_draw(ibuf, panel->layout);
+ }
+ BKE_image_release_ibuf(image, ibuf, lock);
+}
+
+void image_buttons_register(ARegionType *art)
+{
+ PanelType *pt;
+
+ pt = MEM_callocN(sizeof(PanelType), "spacetype image panel metadata");
+ strcpy(pt->idname, "IMAGE_PT_metadata");
+ strcpy(pt->label, N_("Metadata"));
+ strcpy(pt->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA);
+ pt->poll = metadata_panel_context_poll;
+ pt->draw = metadata_panel_context_draw;
+ BLI_addtail(&art->paneltypes, pt);
}
static int image_properties_toggle_exec(bContext *C, wmOperator *UNUSED(op))
diff --git a/source/blender/editors/space_sequencer/sequencer_buttons.c b/source/blender/editors/space_sequencer/sequencer_buttons.c
index abe6a58c9ef..39d674b421a 100644
--- a/source/blender/editors/space_sequencer/sequencer_buttons.c
+++ b/source/blender/editors/space_sequencer/sequencer_buttons.c
@@ -27,10 +27,12 @@
#include "MEM_guardedalloc.h"
#include "BLI_utildefines.h"
+#include "BLI_listbase.h"
#include "BLT_translation.h"
#include "BKE_context.h"
+#include "BKE_global.h"
#include "BKE_screen.h"
#include "ED_screen.h"
@@ -40,6 +42,8 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "IMB_imbuf_types.h"
+#include "IMB_imbuf.h"
#include "sequencer_intern.h"
@@ -55,11 +59,51 @@ static bool sequencer_grease_pencil_panel_poll(const bContext *C, PanelType *UNU
}
#endif
-void sequencer_buttons_register(ARegionType *UNUSED(art))
+static bool metadata_panel_context_poll(const bContext *C, PanelType *UNUSED(pt))
+{
+ SpaceSeq *space_sequencer = CTX_wm_space_seq(C);
+ if (space_sequencer == NULL) {
+ return false;
+ }
+ return ED_space_sequencer_check_show_imbuf(space_sequencer);
+}
+
+static void metadata_panel_context_draw(const bContext *C, Panel *panel)
+{
+ /* Image buffer can not be acquired during render, similar to
+ * draw_image_seq(). */
+ if (G.is_rendering) {
+ return;
+ }
+ struct Main *bmain = CTX_data_main(C);
+ struct Depsgraph *depsgraph = CTX_data_depsgraph(C);
+ struct Scene *scene = CTX_data_scene(C);
+ SpaceSeq *space_sequencer = CTX_wm_space_seq(C);
+ /* NOTE: We can only reliably show metadata for the original (current)
+ * frame when split view is used. */
+ const bool show_split = (
+ scene->ed &&
+ (scene->ed->over_flag & SEQ_EDIT_OVERLAY_SHOW) &&
+ (space_sequencer->mainb == SEQ_DRAW_IMG_IMBUF));
+ if (show_split &&
+ space_sequencer->overlay_type == SEQ_DRAW_OVERLAY_REFERENCE)
+ {
+ return;
+ }
+ /* NOTE: We disable multiview for drawing, since we don't know what is the
+ * from the panel (is kind of all the views?). */
+ ImBuf *ibuf = sequencer_ibuf_get(bmain, depsgraph, scene, space_sequencer, scene->r.cfra, 0, "");
+ if (ibuf != NULL) {
+ ED_region_image_metadata_panel_draw(ibuf, panel->layout);
+ IMB_freeImBuf(ibuf);
+ }
+}
+
+void sequencer_buttons_register(ARegionType *art)
{
-#if 0
PanelType *pt;
+#if 0
pt = MEM_callocN(sizeof(PanelType), "spacetype sequencer panel gpencil");
strcpy(pt->idname, "SEQUENCER_PT_gpencil");
strcpy(pt->label, N_("Grease Pencil"));
@@ -69,6 +113,14 @@ void sequencer_buttons_register(ARegionType *UNUSED(art))
pt->poll = sequencer_grease_pencil_panel_poll;
BLI_addtail(&art->paneltypes, pt);
#endif
+
+ pt = MEM_callocN(sizeof(PanelType), "spacetype sequencer panel metadata");
+ strcpy(pt->idname, "SEQUENCER_PT_metadata");
+ strcpy(pt->label, N_("Metadata"));
+ strcpy(pt->translation_context, BLT_I18NCONTEXT_DEFAULT_BPYRNA);
+ pt->poll = metadata_panel_context_poll;
+ pt->draw = metadata_panel_context_draw;
+ BLI_addtail(&art->paneltypes, pt);
}
/* **************** operator to open/close properties view ************* */