diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2017-10-31 19:38:53 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2017-10-31 19:38:53 +0300 |
commit | c8de666cbe95403b4e902f10007ef94ec1808c04 (patch) | |
tree | f15008e697c946a6488087109dbe3c524ebeabbe /source | |
parent | 3a72f02d800006d77a6f3ba9597f059c77ce6553 (diff) | |
parent | 4e33d07565a4bc1c6702d0e4edf5c04392f7d5a6 (diff) |
Merge branch 'master' into blender2.8
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_image.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/image.c | 47 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_render.c | 18 | ||||
-rw-r--r-- | source/blender/render/extern/include/RE_engine.h | 1 | ||||
-rw-r--r-- | source/blender/render/intern/source/external_engine.c | 5 | ||||
-rw-r--r-- | source/blender/render/intern/source/render_result.c | 4 | ||||
-rw-r--r-- | source/blenderplayer/bad_level_call_stubs/stubs.c | 1 |
7 files changed, 76 insertions, 2 deletions
diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h index 3c716f39dd0..57459412efc 100644 --- a/source/blender/blenkernel/BKE_image.h +++ b/source/blender/blenkernel/BKE_image.h @@ -70,6 +70,8 @@ void BKE_render_result_stamp_info(struct Scene *scene, struct Object *camera, void BKE_imbuf_stamp_info(struct RenderResult *rr, struct ImBuf *ibuf); 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_render_result_stamp_data(struct RenderResult *rr, const char *key, const char *value); +void BKE_stamp_data_free(struct StampData *stamp_data); void BKE_image_stamp_buf( struct Scene *scene, struct Object *camera, const struct StampData *stamp_data_template, unsigned char *rect, float *rectf, int width, int height, int channels); diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index 99f8d6a64c1..78b0eaa84ba 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -1608,6 +1608,14 @@ void BKE_imbuf_to_image_format(struct ImageFormatData *im_format, const ImBuf *i #define STAMP_NAME_SIZE ((MAX_ID_NAME - 2) + 16) /* could allow access externally - 512 is for long names, * STAMP_NAME_SIZE is for id names, allowing them some room for description */ +typedef struct StampDataCustomField { + struct StampDataCustomField *next, *prev; + /* TODO(sergey): Think of better size here, maybe dynamically allocated even. */ + char key[512]; + char value[512]; + /* TODO(sergey): Support non-string values. */ +} StampDataCustomField; + typedef struct StampData { char file[512]; char note[512]; @@ -1621,6 +1629,13 @@ typedef struct StampData { char strip[STAMP_NAME_SIZE]; char rendertime[STAMP_NAME_SIZE]; char memory[STAMP_NAME_SIZE]; + + /* Custom fields are used to put extra meta information header from render + * engine to the result image. + * + * NOTE: This fields are not stamped onto the image. At least for now. + */ + ListBase custom_fields; } StampData; #undef STAMP_NAME_SIZE @@ -2122,9 +2137,41 @@ void BKE_stamp_info_callback(void *data, struct StampData *stamp_data, StampCall CALL(rendertime, "RenderTime"); CALL(memory, "Memory"); + for (StampDataCustomField *custom_field = stamp_data->custom_fields.first; + custom_field != NULL; + custom_field = custom_field->next) + { + if (noskip || custom_field->value[0]) { + callback(data, custom_field->key, custom_field->value, sizeof(custom_field->value)); + } + } + #undef CALL } +void BKE_render_result_stamp_data(RenderResult *rr, const char *key, const char *value) +{ + StampData *stamp_data; + if (rr->stamp_data == NULL) { + rr->stamp_data = MEM_callocN(sizeof(StampData), "RenderResult.stamp_data"); + } + stamp_data = rr->stamp_data; + StampDataCustomField *field = MEM_mallocN(sizeof(StampDataCustomField), + "StampData Custom Field"); + BLI_strncpy(field->key, key, sizeof(field->key)); + BLI_strncpy(field->value, value, sizeof(field->value)); + BLI_addtail(&stamp_data->custom_fields, field); +} + +void BKE_stamp_data_free(struct StampData *stamp_data) +{ + if (stamp_data == NULL) { + return; + } + BLI_freelistN(&stamp_data->custom_fields); + MEM_freeN(stamp_data); +} + /* wrap for callback only */ static void metadata_change_field(void *data, const char *propname, char *propvalue, int UNUSED(len)) { diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c index 5ab4488b1b7..7c5d710c454 100644 --- a/source/blender/makesrna/intern/rna_render.c +++ b/source/blender/makesrna/intern/rna_render.c @@ -36,6 +36,7 @@ #include "DEG_depsgraph.h" #include "BKE_scene.h" +#include "BKE_image.h" #include "RNA_define.h" #include "RNA_enum_types.h" @@ -432,6 +433,12 @@ static void rna_RenderResult_layers_begin(CollectionPropertyIterator *iter, Poin rna_iterator_listbase_begin(iter, &rr->layers, NULL); } +static void rna_RenderResult_stamp_data_add_field(RenderResult *rr, const char *field, const char *value) +{ + BKE_render_result_stamp_data(rr, field, value); +} + + static void rna_RenderLayer_passes_begin(CollectionPropertyIterator *iter, PointerRNA *ptr) { RenderLayer *rl = (RenderLayer *)ptr->data; @@ -613,6 +620,10 @@ static void rna_def_render_engine(BlenderRNA *brna) RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); RNA_def_string(func, "layer", NULL, 0, "Layer", "Single layer to add render pass to"); /* NULL ok here */ + func = RNA_def_function(srna, "get_result", "RE_engine_get_result"); + RNA_def_function_ui_description(func, "Get final result for non-pixel operations"); + parm = RNA_def_pointer(func, "result", "RenderResult", "Result", ""); + RNA_def_function_return(func, parm); func = RNA_def_function(srna, "test_break", "RE_engine_test_break"); RNA_def_function_ui_description(func, "Test if the render operation should been canceled, this is a fast call that should be used regularly for responsiveness"); @@ -828,6 +839,13 @@ static void rna_def_render_result(BlenderRNA *brna) "the render result"); RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); + func = RNA_def_function(srna, "stamp_data_add_field", "rna_RenderResult_stamp_data_add_field"); + RNA_def_function_ui_description(func, "Add engine-specific stamp data to the result"); + parm = RNA_def_string(func, "field", NULL, 1024, "Field", "Name of the stamp field to add"); + RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); + parm = RNA_def_string(func, "value", NULL, 1024, "Value", "Value of the stamp data"); + RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); + RNA_define_verify_sdna(0); prop = RNA_def_property(srna, "resolution_x", PROP_INT, PROP_PIXEL); diff --git a/source/blender/render/extern/include/RE_engine.h b/source/blender/render/extern/include/RE_engine.h index a4de7104071..82f9599c654 100644 --- a/source/blender/render/extern/include/RE_engine.h +++ b/source/blender/render/extern/include/RE_engine.h @@ -153,6 +153,7 @@ struct RenderResult *RE_engine_begin_result(RenderEngine *engine, int x, int y, void RE_engine_update_result(RenderEngine *engine, struct RenderResult *result); void RE_engine_add_pass(RenderEngine *engine, const char *name, int channels, const char *chan_id, const char *layername); void RE_engine_end_result(RenderEngine *engine, struct RenderResult *result, int cancel, int highlight, int merge_results); +struct RenderResult *RE_engine_get_result(struct RenderEngine *engine); const char *RE_engine_active_view_get(RenderEngine *engine); void RE_engine_active_view_set(RenderEngine *engine, const char *viewname); diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c index 2c1fcd037e6..f445ccbb494 100644 --- a/source/blender/render/intern/source/external_engine.c +++ b/source/blender/render/intern/source/external_engine.c @@ -330,6 +330,11 @@ void RE_engine_end_result(RenderEngine *engine, RenderResult *result, int cancel render_result_free(result); } +RenderResult *RE_engine_get_result(RenderEngine *engine) +{ + return engine->re->result; +} + /* Cancel */ int RE_engine_test_break(RenderEngine *engine) diff --git a/source/blender/render/intern/source/render_result.c b/source/blender/render/intern/source/render_result.c index 8e6e6c9bb7d..df51cd3c2e6 100644 --- a/source/blender/render/intern/source/render_result.c +++ b/source/blender/render/intern/source/render_result.c @@ -116,8 +116,8 @@ void render_result_free(RenderResult *res) MEM_freeN(res->text); if (res->error) MEM_freeN(res->error); - if (res->stamp_data) - MEM_freeN(res->stamp_data); + + BKE_stamp_data_free(res->stamp_data); MEM_freeN(res); } diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c index 31a636e4a85..6243b65c197 100644 --- a/source/blenderplayer/bad_level_call_stubs/stubs.c +++ b/source/blenderplayer/bad_level_call_stubs/stubs.c @@ -733,6 +733,7 @@ void uiTemplateCacheFile(uiLayout *layout, struct bContext *C, struct PointerRNA struct RenderResult *RE_engine_begin_result(RenderEngine *engine, int x, int y, int w, int h, const char *layername, const char *viewname) RET_NULL struct RenderResult *RE_AcquireResultRead(struct Render *re) RET_NULL struct RenderResult *RE_AcquireResultWrite(struct Render *re) RET_NULL +struct RenderResult *RE_engine_get_result(struct RenderEngine *re) RET_NULL struct RenderStats *RE_GetStats(struct Render *re) RET_NULL struct RenderData *RE_engine_get_render_data(struct Render *re) RET_NULL void RE_engine_update_result(struct RenderEngine *engine, struct RenderResult *result) RET_NONE |