Merge branch 'master' into blender2.8

This commit is contained in:
Bastien Montagne 2017-10-31 17:38:53 +01:00
commit c8de666cbe
8 changed files with 89 additions and 3 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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))
{

View File

@ -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);

View File

@ -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);

View File

@ -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)

View File

@ -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);
}

View File

@ -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