Sequencer metadata:
Add option to render strip metadata to final result, bypassing current scene metadata.
This commit is contained in:
parent
0e084f93d9
commit
f525483d83
|
@ -343,7 +343,7 @@ class RENDER_PT_stamp(RenderButtonsPanel, Panel):
|
|||
|
||||
rd = context.scene.render
|
||||
|
||||
layout.prop(rd, "use_stamp", text="Stamp Output")
|
||||
layout.prop(rd, "use_stamp")
|
||||
col = layout.column()
|
||||
col.active = rd.use_stamp
|
||||
col.prop(rd, "stamp_font_size", text="Font Size")
|
||||
|
@ -374,6 +374,9 @@ class RENDER_PT_stamp(RenderButtonsPanel, Panel):
|
|||
sub = row.row()
|
||||
sub.active = rd.use_stamp_note
|
||||
sub.prop(rd, "stamp_note_text", text="")
|
||||
if rd.use_sequencer:
|
||||
layout.label("Sequencer")
|
||||
layout.prop(rd, "use_stamp_strip_meta")
|
||||
|
||||
|
||||
class RENDER_PT_output(RenderButtonsPanel, Panel):
|
||||
|
|
|
@ -60,11 +60,12 @@ void BKE_image_free_buffers(struct Image *image);
|
|||
/* call from library */
|
||||
void BKE_image_free(struct Image *image);
|
||||
|
||||
typedef void (StampCallback)(void *data, const char *propname, const char *propvalue);
|
||||
typedef void (StampCallback)(void *data, const char *propname, char *propvalue, int len);
|
||||
|
||||
void BKE_render_result_stamp_info(struct Scene *scene, struct Object *camera, struct RenderResult *rr);
|
||||
void BKE_render_result_stamp_info(struct Scene *scene, struct Object *camera, struct RenderResult *rr, bool allocate_only);
|
||||
void BKE_imbuf_stamp_info(struct RenderResult *rr, struct ImBuf *ibuf);
|
||||
void BKE_stamp_info_callback(void *data, const struct StampData *stamp_data, StampCallback callback);
|
||||
void BKE_stamp_info_from_imbuf(struct RenderResult *rr, struct ImBuf *ibuf);
|
||||
void BKE_stamp_info_callback(void *data, struct StampData *stamp_data, StampCallback callback, bool noskip);
|
||||
void BKE_image_stamp_buf(struct Scene *scene, struct Object *camera, unsigned char *rect, float *rectf, int width, int height, int channels);
|
||||
bool BKE_imbuf_alpha_test(struct ImBuf *ibuf);
|
||||
int BKE_imbuf_write_stamp(struct Scene *scene, struct RenderResult *rr, struct ImBuf *ibuf, const char *name, struct ImageFormatData *imf);
|
||||
|
|
|
@ -2058,11 +2058,11 @@ void BKE_image_stamp_buf(
|
|||
#undef BUFF_MARGIN_Y
|
||||
}
|
||||
|
||||
void BKE_render_result_stamp_info(Scene *scene, Object *camera, struct RenderResult *rr)
|
||||
void BKE_render_result_stamp_info(Scene *scene, Object *camera, struct RenderResult *rr, bool allocate_only)
|
||||
{
|
||||
struct StampData *stamp_data;
|
||||
|
||||
if (!(scene && scene->r.stamp & R_STAMP_ALL))
|
||||
if (!(scene && (scene->r.stamp & R_STAMP_ALL)) && !allocate_only)
|
||||
return;
|
||||
|
||||
if (!rr->stamp_data) {
|
||||
|
@ -2072,22 +2072,23 @@ void BKE_render_result_stamp_info(Scene *scene, Object *camera, struct RenderRes
|
|||
stamp_data = rr->stamp_data;
|
||||
}
|
||||
|
||||
stampdata(scene, camera, stamp_data, 0);
|
||||
if (!allocate_only)
|
||||
stampdata(scene, camera, stamp_data, 0);
|
||||
|
||||
if (!rr->stamp_data) {
|
||||
rr->stamp_data = stamp_data;
|
||||
}
|
||||
}
|
||||
|
||||
void BKE_stamp_info_callback(void *data, const struct StampData *stamp_data, StampCallback callback)
|
||||
void BKE_stamp_info_callback(void *data, struct StampData *stamp_data, StampCallback callback, bool noskip)
|
||||
{
|
||||
if (!callback || !stamp_data) {
|
||||
return;
|
||||
}
|
||||
|
||||
#define CALL(member, value_str) \
|
||||
if (stamp_data->member[0]) { \
|
||||
callback(data, value_str, stamp_data->member); \
|
||||
if (noskip || stamp_data->member[0]) { \
|
||||
callback(data, value_str, stamp_data->member, sizeof(stamp_data->member)); \
|
||||
} ((void)0)
|
||||
|
||||
CALL(file, "File");
|
||||
|
@ -2106,18 +2107,29 @@ void BKE_stamp_info_callback(void *data, const struct StampData *stamp_data, Sta
|
|||
}
|
||||
|
||||
/* wrap for callback only */
|
||||
static void metadata_change_field(void *data, const char *propname, const char *propvalue)
|
||||
static void metadata_change_field(void *data, const char *propname, char *propvalue, int UNUSED(len))
|
||||
{
|
||||
IMB_metadata_change_field(data, propname, propvalue);
|
||||
}
|
||||
|
||||
static void metadata_get_field(void *data, const char *propname, char *propvalue, int len)
|
||||
{
|
||||
IMB_metadata_get_field(data, propname, propvalue, len);
|
||||
}
|
||||
|
||||
void BKE_imbuf_stamp_info(RenderResult *rr, struct ImBuf *ibuf)
|
||||
{
|
||||
struct StampData *stamp_data = rr->stamp_data;
|
||||
|
||||
BKE_stamp_info_callback(ibuf, stamp_data, metadata_change_field);
|
||||
BKE_stamp_info_callback(ibuf, stamp_data, metadata_change_field, false);
|
||||
}
|
||||
|
||||
void BKE_stamp_info_from_imbuf(RenderResult *rr, struct ImBuf *ibuf)
|
||||
{
|
||||
struct StampData *stamp_data = rr->stamp_data;
|
||||
|
||||
BKE_stamp_info_callback(ibuf, stamp_data, metadata_get_field, true);
|
||||
}
|
||||
|
||||
bool BKE_imbuf_alpha_test(ImBuf *ibuf)
|
||||
{
|
||||
|
|
|
@ -240,10 +240,10 @@ static void screen_opengl_views_setup(OGLRender *oglrender)
|
|||
/* will only work for non multiview correctly */
|
||||
if (v3d) {
|
||||
camera = BKE_camera_multiview_render(oglrender->scene, v3d->camera, "new opengl render view");
|
||||
BKE_render_result_stamp_info(oglrender->scene, camera, rr);
|
||||
BKE_render_result_stamp_info(oglrender->scene, camera, rr, false);
|
||||
}
|
||||
else {
|
||||
BKE_render_result_stamp_info(oglrender->scene, oglrender->scene->camera, rr);
|
||||
BKE_render_result_stamp_info(oglrender->scene, oglrender->scene->camera, rr, false);
|
||||
}
|
||||
|
||||
RE_ReleaseResult(oglrender->re);
|
||||
|
@ -492,7 +492,7 @@ static void screen_opengl_render_write(OGLRender *oglrender)
|
|||
&scene->r.im_format, (scene->r.scemode & R_EXTENSION) != 0, false, NULL);
|
||||
|
||||
/* write images as individual images or stereo */
|
||||
BKE_render_result_stamp_info(scene, scene->camera, rr);
|
||||
BKE_render_result_stamp_info(scene, scene->camera, rr, false);
|
||||
ok = RE_WriteRenderViewsImage(oglrender->reports, rr, scene, false, name);
|
||||
|
||||
RE_ReleaseResultImage(oglrender->re);
|
||||
|
@ -815,7 +815,7 @@ static bool screen_opengl_render_anim_step(bContext *C, wmOperator *op)
|
|||
}
|
||||
}
|
||||
else {
|
||||
BKE_render_result_stamp_info(scene, scene->camera, rr);
|
||||
BKE_render_result_stamp_info(scene, scene->camera, rr, false);
|
||||
ok = RE_WriteRenderViewsImage(op->reports, rr, scene, true, name);
|
||||
if (ok) {
|
||||
printf("Saved: %s", name);
|
||||
|
|
|
@ -364,7 +364,7 @@ static void openexr_header_metadata(Header *header, struct ImBuf *ibuf)
|
|||
addXDensity(*header, ibuf->ppm[0] / 39.3700787); /* 1 meter = 39.3700787 inches */
|
||||
}
|
||||
|
||||
static void openexr_header_metadata_callback(void *data, const char *propname, const char *prop)
|
||||
static void openexr_header_metadata_callback(void *data, const char *propname, char *prop, int UNUSED(len))
|
||||
{
|
||||
Header *header = (Header *)data;
|
||||
header->insert(propname, StringAttribute(prop));
|
||||
|
@ -860,7 +860,7 @@ int IMB_exr_begin_write(void *handle, const char *filename, int width, int heigh
|
|||
}
|
||||
|
||||
openexr_header_compression(&header, compress);
|
||||
BKE_stamp_info_callback(&header, stamp, openexr_header_metadata_callback);
|
||||
BKE_stamp_info_callback(&header, const_cast<StampData *>(stamp), openexr_header_metadata_callback, false);
|
||||
/* header.lineOrder() = DECREASING_Y; this crashes in windows for file read! */
|
||||
|
||||
imb_exr_type_by_channels(header.channels(), *data->multiView, &is_singlelayer, &is_multilayer, &is_multiview);
|
||||
|
|
|
@ -1562,6 +1562,7 @@ typedef struct Scene {
|
|||
#define R_STAMP_SEQSTRIP 0x0200
|
||||
#define R_STAMP_RENDERTIME 0x0400
|
||||
#define R_STAMP_CAMERALENS 0x0800
|
||||
#define R_STAMP_STRIPMETA 0x1000
|
||||
#define R_STAMP_ALL (R_STAMP_TIME|R_STAMP_FRAME|R_STAMP_DATE|R_STAMP_CAMERA|R_STAMP_SCENE| \
|
||||
R_STAMP_NOTE|R_STAMP_MARKER|R_STAMP_FILENAME|R_STAMP_SEQSTRIP| \
|
||||
R_STAMP_RENDERTIME|R_STAMP_CAMERALENS)
|
||||
|
|
|
@ -5685,9 +5685,14 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
|
|||
|
||||
prop = RNA_def_property(srna, "use_stamp", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "stamp", R_STAMP_DRAW);
|
||||
RNA_def_property_ui_text(prop, "Render Stamp", "Render the stamp info text in the rendered image");
|
||||
RNA_def_property_ui_text(prop, "Stamp Output", "Render the stamp info text in the rendered image");
|
||||
RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
|
||||
|
||||
|
||||
prop = RNA_def_property(srna, "use_stamp_strip_meta", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "stamp", R_STAMP_STRIPMETA);
|
||||
RNA_def_property_ui_text(prop, "Strip Metadata", "Render the metadata of the strip for sequencer");
|
||||
RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, NULL);
|
||||
|
||||
prop = RNA_def_property(srna, "stamp_font_size", PROP_INT, PROP_NONE);
|
||||
RNA_def_property_int_sdna(prop, NULL, "stamp_font_id");
|
||||
RNA_def_property_range(prop, 8, 64);
|
||||
|
|
|
@ -2617,6 +2617,7 @@ static void do_render_seq(Render *re)
|
|||
|
||||
if (out) {
|
||||
ibuf_arr[view_id] = IMB_dupImBuf(out);
|
||||
IMB_metadata_copy(ibuf_arr[view_id], out);
|
||||
IMB_freeImBuf(out);
|
||||
BKE_sequencer_imbuf_from_sequencer_space(re->scene, ibuf_arr[view_id]);
|
||||
}
|
||||
|
@ -2639,6 +2640,12 @@ static void do_render_seq(Render *re)
|
|||
/* copy ibuf into combined pixel rect */
|
||||
render_result_rect_from_ibuf(rr, &re->r, ibuf_arr[view_id], view_id);
|
||||
|
||||
if (ibuf_arr[view_id]->metadata && (re->r.stamp & R_STAMP_STRIPMETA)) {
|
||||
/* ensure render stamp info first */
|
||||
BKE_render_result_stamp_info(NULL, NULL, rr, true);
|
||||
BKE_stamp_info_from_imbuf(rr, ibuf_arr[view_id]);
|
||||
}
|
||||
|
||||
if (recurs_depth == 0) { /* with nested scenes, only free on toplevel... */
|
||||
Editing *ed = re->scene->ed;
|
||||
if (ed)
|
||||
|
@ -2678,6 +2685,7 @@ static void do_render_seq(Render *re)
|
|||
static void do_render_all_options(Render *re)
|
||||
{
|
||||
Object *camera;
|
||||
bool render_seq = false;
|
||||
|
||||
re->current_scene_update(re->suh, re->scene);
|
||||
|
||||
|
@ -2693,8 +2701,10 @@ static void do_render_all_options(Render *re)
|
|||
}
|
||||
else if (RE_seq_render_active(re->scene, &re->r)) {
|
||||
/* note: do_render_seq() frees rect32 when sequencer returns float images */
|
||||
if (!re->test_break(re->tbh))
|
||||
if (!re->test_break(re->tbh)) {
|
||||
do_render_seq(re);
|
||||
render_seq = true;
|
||||
}
|
||||
|
||||
re->stats_draw(re->sdh, &re->i);
|
||||
re->display_update(re->duh, re->result, NULL);
|
||||
|
@ -2714,7 +2724,9 @@ static void do_render_all_options(Render *re)
|
|||
|
||||
/* save render result stamp if needed */
|
||||
camera = RE_GetCamera(re);
|
||||
BKE_render_result_stamp_info(re->scene, camera, re->result);
|
||||
/* sequence rendering should have taken care of that already */
|
||||
if (!(render_seq && (re->r.stamp & R_STAMP_STRIPMETA)))
|
||||
BKE_render_result_stamp_info(re->scene, camera, re->result, false);
|
||||
|
||||
/* stamp image info here */
|
||||
if ((re->r.stamp & R_STAMP_ALL) && (re->r.stamp & R_STAMP_DRAW)) {
|
||||
|
|
Loading…
Reference in New Issue