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--intern/cycles/blender/blender_session.cpp14
-rw-r--r--source/blender/blenkernel/BKE_image.h2
-rw-r--r--source/blender/blenkernel/intern/image.c47
-rw-r--r--source/blender/makesrna/intern/rna_render.c18
-rw-r--r--source/blender/render/extern/include/RE_engine.h1
-rw-r--r--source/blender/render/intern/source/external_engine.c5
-rw-r--r--source/blender/render/intern/source/render_result.c4
-rw-r--r--source/blenderplayer/bad_level_call_stubs/stubs.c1
8 files changed, 89 insertions, 3 deletions
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index f010e24cbe4..1c1ca43b56a 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -386,7 +386,10 @@ void BlenderSession::render()
BL::RenderSettings r = b_scene.render();
BL::RenderSettings::layers_iterator b_layer_iter;
BL::RenderResult::views_iterator b_view_iter;
-
+
+ /* We do some special meta attributes when we only have single layer. */
+ const bool is_single_layer = (r.layers.length() == 1);
+
for(r.layers.begin(b_layer_iter); b_layer_iter != r.layers.end(); ++b_layer_iter) {
b_rlay_name = b_layer_iter->name();
@@ -481,6 +484,15 @@ void BlenderSession::render()
break;
}
+ if(is_single_layer) {
+ BL::RenderResult b_rr = b_engine.get_result();
+ string num_aa_samples = string_printf("%d", session->params.samples);
+ b_rr.stamp_data_add_field("Cycles Samples", num_aa_samples.c_str());
+ /* TODO(sergey): Report whether we're doing resumable render
+ * and also start/end sample if so.
+ */
+ }
+
/* free result without merging */
end_render_result(b_engine, b_rr, true, true, false);
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