Merge branch 'master' into blender2.8
This commit is contained in:
commit
c8de666cbe
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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))
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue