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:
Diffstat (limited to 'source/blender/render/intern/source/external_engine.c')
-rw-r--r--source/blender/render/intern/source/external_engine.c72
1 files changed, 50 insertions, 22 deletions
diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c
index fef453efce2..fd9d95c63b6 100644
--- a/source/blender/render/intern/source/external_engine.c
+++ b/source/blender/render/intern/source/external_engine.c
@@ -44,6 +44,7 @@
#include "BKE_camera.h"
#include "BKE_global.h"
+#include "BKE_colortools.h"
#include "BKE_report.h"
#include "BKE_scene.h"
@@ -361,32 +362,56 @@ void RE_engine_set_error_message(RenderEngine *engine, const char *msg)
Render *re = engine->re;
if (re != NULL) {
RenderResult *rr = RE_AcquireResultRead(re);
- if (rr->error != NULL) {
- MEM_freeN(rr->error);
+ if (rr) {
+ if (rr->error != NULL) {
+ MEM_freeN(rr->error);
+ }
+ rr->error = BLI_strdup(msg);
}
- rr->error = BLI_strdup(msg);
RE_ReleaseResult(re);
}
}
+const char *RE_engine_active_view_get(RenderEngine *engine)
+{
+ Render *re = engine->re;
+ return RE_GetActiveRenderView(re);
+}
+
void RE_engine_active_view_set(RenderEngine *engine, const char *viewname)
{
Render *re = engine->re;
RE_SetActiveRenderView(re, viewname);
}
-float RE_engine_get_camera_shift_x(RenderEngine *engine, Object *camera)
+float RE_engine_get_camera_shift_x(RenderEngine *engine, Object *camera, int use_spherical_stereo)
{
Render *re = engine->re;
+
+ /* when using spherical stereo, get camera shift without multiview, leaving stereo to be handled by the engine */
+ if (use_spherical_stereo)
+ re = NULL;
+
return BKE_camera_multiview_shift_x(re ? &re->r : NULL, camera, re->viewname);
}
-void RE_engine_get_camera_model_matrix(RenderEngine *engine, Object *camera, float *r_modelmat)
+void RE_engine_get_camera_model_matrix(RenderEngine *engine, Object *camera, int use_spherical_stereo, float *r_modelmat)
{
Render *re = engine->re;
+
+ /* when using spherical stereo, get model matrix without multiview, leaving stereo to be handled by the engine */
+ if (use_spherical_stereo)
+ re = NULL;
+
BKE_camera_multiview_model_matrix(re ? &re->r : NULL, camera, re->viewname, (float (*)[4])r_modelmat);
}
+int RE_engine_get_spherical_stereo(RenderEngine *engine, Object *camera)
+{
+ Render *re = engine->re;
+ return BKE_camera_multiview_spherical_stereo(re ? &re->r : NULL, camera) ? 1 : 0;
+}
+
rcti* RE_engine_get_current_tiles(Render *re, int *r_total_tiles, bool *r_needs_free)
{
static rcti tiles_static[BLENDER_MAX_THREADS];
@@ -412,15 +437,18 @@ rcti* RE_engine_get_current_tiles(Render *re, int *r_total_tiles, bool *r_needs_
/* Just in case we're using crazy network rendering with more
* slaves as BLENDER_MAX_THREADS.
*/
- if (tiles == tiles_static)
- tiles = MEM_mallocN(allocation_step * sizeof(rcti), "current engine tiles");
- else
- tiles = MEM_reallocN(tiles, (total_tiles + allocation_step) * sizeof(rcti));
-
allocation_size += allocation_step;
+ if (tiles == tiles_static) {
+ /* Can not realloc yet, tiles are pointing to a
+ * stack memory.
+ */
+ tiles = MEM_mallocN(allocation_size * sizeof(rcti), "current engine tiles");
+ }
+ else {
+ tiles = MEM_reallocN(tiles, allocation_size * sizeof(rcti));
+ }
*r_needs_free = true;
}
-
tiles[total_tiles] = pa->disprect;
if (pa->crop) {
@@ -448,13 +476,7 @@ void RE_bake_engine_set_engine_parameters(Render *re, Main *bmain, Scene *scene)
{
re->scene = scene;
re->main = bmain;
- re->r = scene->r;
-
- /* prevent crash when freeing the scene
- * but it potentially leaves unfreed memory blocks
- * not sure how to fix this yet -- dfelinto */
- BLI_listbase_clear(&re->r.layers);
- BLI_listbase_clear(&re->r.views);
+ render_copy_renderdata(&re->r, &scene->r);
}
bool RE_bake_has_engine(Render *re)
@@ -467,7 +489,8 @@ bool RE_bake_engine(
Render *re, Object *object,
const int object_id, const BakePixel pixel_array[],
const size_t num_pixels, const int depth,
- const ScenePassType pass_type, float result[])
+ const ScenePassType pass_type, const int pass_filter,
+ float result[])
{
RenderEngineType *type = RE_engines_find(re->r.engine);
RenderEngine *engine;
@@ -503,7 +526,7 @@ bool RE_bake_engine(
type->update(engine, re->main, re->scene);
if (type->bake)
- type->bake(engine, re->scene, object, pass_type, object_id, pixel_array, num_pixels, depth, result);
+ type->bake(engine, re->scene, object, pass_type, pass_filter, object_id, pixel_array, num_pixels, depth, result);
engine->tile_x = 0;
engine->tile_y = 0;
@@ -596,7 +619,7 @@ int RE_engine_render(Render *re, int do_all)
if (re->r.scemode & R_SINGLE_LAYER) {
srl = BLI_findlink(&re->r.layers, re->r.actlay);
if (srl) {
- non_excluded_lay |= ~srl->lay_exclude;
+ non_excluded_lay |= ~(srl->lay_exclude & ~srl->lay_zmask);
/* in this case we must update all because animation for
* the scene has not been updated yet, and so may not be
@@ -608,7 +631,7 @@ int RE_engine_render(Render *re, int do_all)
else {
for (srl = re->r.layers.first; srl; srl = srl->next) {
if (!(srl->layflag & SCE_LAY_DISABLE)) {
- non_excluded_lay |= ~srl->lay_exclude;
+ non_excluded_lay |= ~(srl->lay_exclude & ~srl->lay_zmask);
if (render_layer_exclude_animated(re->scene, srl))
non_excluded_lay |= ~0;
@@ -642,6 +665,11 @@ int RE_engine_render(Render *re, int do_all)
if (re->draw_lock) {
re->draw_lock(re->dlh, 0);
}
+ /* Too small image is handled earlier, here it could only happen if
+ * there was no sufficient memory to allocate all passes.
+ */
+ BKE_report(re->reports, RPT_ERROR, "Failed allocate render result, out of memory");
+ G.is_break = true;
return 1;
}