Fix Cycles to mostly work with render layer / depsgraph changes.

Point density texture and motion blur are still broken, and many more changes
are needed in general to used evaluated datablocks.
This commit is contained in:
2018-02-26 16:46:48 +01:00
committed by Dalai Felinto
parent 06420c5fe8
commit 828f545213
14 changed files with 268 additions and 268 deletions

View File

@@ -66,31 +66,31 @@ class CyclesRender(bpy.types.RenderEngine):
engine.free(self) engine.free(self)
# final render # final render
def update(self, data, depsgraph, scene): def update(self, data, scene):
if not self.session: if not self.session:
if self.is_preview: if self.is_preview:
cscene = bpy.context.scene.cycles cscene = bpy.context.scene.cycles
use_osl = cscene.shading_system and cscene.device == 'CPU' use_osl = cscene.shading_system and cscene.device == 'CPU'
engine.create(self, data, depsgraph, scene, engine.create(self, data, scene,
None, None, None, use_osl) None, None, None, use_osl)
else: else:
engine.create(self, data, depsgraph, scene) engine.create(self, data, scene)
else: else:
engine.reset(self, data, scene) engine.reset(self, data, scene)
def render_to_image(self, data, scene): def render_to_image(self, depsgraph):
engine.render(self, data, scene) engine.render(self, depsgraph)
def bake(self, scene, obj, pass_type, pass_filter, object_id, pixel_array, num_pixels, depth, result): def bake(self, depsgraph, scene, obj, pass_type, pass_filter, object_id, pixel_array, num_pixels, depth, result):
engine.bake(self, obj, pass_type, pass_filter, object_id, pixel_array, num_pixels, depth, result) engine.bake(self, depsgraph, obj, pass_type, pass_filter, object_id, pixel_array, num_pixels, depth, result)
# viewport render # viewport render
def view_update(self, context): def view_update(self, context):
if not self.session: if not self.session:
engine.create(self, context.blend_data, context.depsgraph, context.scene, engine.create(self, context.blend_data, context.scene,
context.region, context.space_data, context.region_data) context.region, context.space_data, context.region_data)
engine.update(self, context.blend_data, context.scene) engine.update(self, context.depsgraph, context.blend_data, context.scene)
def render_to_view(self, context): def render_to_view(self, context):
engine.draw(self, context.depsgraph, context.region, context.space_data, context.region_data) engine.draw(self, context.depsgraph, context.region, context.space_data, context.region_data)

View File

@@ -123,13 +123,12 @@ def exit():
_cycles.exit() _cycles.exit()
def create(engine, data, depsgraph, scene, region=None, v3d=None, rv3d=None, preview_osl=False): def create(engine, data, scene, region=None, v3d=None, rv3d=None, preview_osl=False):
import bpy import bpy
import _cycles import _cycles
data = data.as_pointer() data = data.as_pointer()
userpref = bpy.context.user_preferences.as_pointer() userpref = bpy.context.user_preferences.as_pointer()
depsgraph = depsgraph.as_pointer()
scene = scene.as_pointer() scene = scene.as_pointer()
if region: if region:
region = region.as_pointer() region = region.as_pointer()
@@ -144,7 +143,7 @@ def create(engine, data, depsgraph, scene, region=None, v3d=None, rv3d=None, pre
_cycles.debug_flags_reset() _cycles.debug_flags_reset()
engine.session = _cycles.create( engine.session = _cycles.create(
engine.as_pointer(), userpref, data, depsgraph, scene, region, v3d, rv3d, preview_osl) engine.as_pointer(), userpref, data, scene, region, v3d, rv3d, preview_osl)
def free(engine): def free(engine):
@@ -158,14 +157,14 @@ def free(engine):
def render(engine, depsgraph): def render(engine, depsgraph):
import _cycles import _cycles
if hasattr(engine, "session"): if hasattr(engine, "session"):
_cycles.render(engine.session) _cycles.render(engine.session, depsgraph.as_pointer())
def bake(engine, obj, pass_type, pass_filter, object_id, pixel_array, num_pixels, depth, result): def bake(engine, depsgraph, obj, pass_type, pass_filter, object_id, pixel_array, num_pixels, depth, result):
import _cycles import _cycles
session = getattr(engine, "session", None) session = getattr(engine, "session", None)
if session is not None: if session is not None:
_cycles.bake(engine.session, obj.as_pointer(), pass_type, pass_filter, object_id, pixel_array.as_pointer(), num_pixels, depth, result.as_pointer()) _cycles.bake(engine.session, depsgraph.as_pointer(), obj.as_pointer(), pass_type, pass_filter, object_id, pixel_array.as_pointer(), num_pixels, depth, result.as_pointer())
def reset(engine, data, scene): def reset(engine, data, scene):
@@ -175,9 +174,9 @@ def reset(engine, data, scene):
_cycles.reset(engine.session, data, scene) _cycles.reset(engine.session, data, scene)
def update(engine, data, scene): def update(engine, depsgraph, data, scene):
import _cycles import _cycles
_cycles.sync(engine.session) _cycles.sync(engine.session, depsgraph.as_pointer())
def draw(engine, depsgraph, region, v3d, rv3d): def draw(engine, depsgraph, region, v3d, rv3d):

View File

@@ -326,14 +326,14 @@ static bool ObtainCacheParticleVcol(Mesh *mesh,
return true; return true;
} }
static void set_resolution(BL::Object *b_ob, BL::Scene *scene, BL::ViewLayer *view_layer, bool render) static void set_resolution(BL::Object& b_ob, BL::Scene& scene, BL::ViewLayer& view_layer, bool render)
{ {
BL::Object::modifiers_iterator b_mod; BL::Object::modifiers_iterator b_mod;
for(b_ob->modifiers.begin(b_mod); b_mod != b_ob->modifiers.end(); ++b_mod) { for(b_ob.modifiers.begin(b_mod); b_mod != b_ob.modifiers.end(); ++b_mod) {
if((b_mod->type() == b_mod->type_PARTICLE_SYSTEM) && ((b_mod->show_viewport()) || (b_mod->show_render()))) { if((b_mod->type() == b_mod->type_PARTICLE_SYSTEM) && ((b_mod->show_viewport()) || (b_mod->show_render()))) {
BL::ParticleSystemModifier psmd((const PointerRNA)b_mod->ptr); BL::ParticleSystemModifier psmd((const PointerRNA)b_mod->ptr);
BL::ParticleSystem b_psys((const PointerRNA)psmd.particle_system().ptr); BL::ParticleSystem b_psys((const PointerRNA)psmd.particle_system().ptr);
b_psys.set_resolution(*scene, *view_layer, *b_ob, (render)? 2: 1); b_psys.set_resolution(scene, view_layer, b_ob, (render)? 2: 1);
} }
} }
} }
@@ -884,7 +884,8 @@ void BlenderSync::sync_curve_settings()
curve_system_manager->tag_update(scene); curve_system_manager->tag_update(scene);
} }
void BlenderSync::sync_curves(Mesh *mesh, void BlenderSync::sync_curves(BL::Depsgraph& b_depsgraph,
Mesh *mesh,
BL::Mesh& b_mesh, BL::Mesh& b_mesh,
BL::Object& b_ob, BL::Object& b_ob,
bool motion, bool motion,
@@ -920,8 +921,9 @@ void BlenderSync::sync_curves(Mesh *mesh,
ParticleCurveData CData; ParticleCurveData CData;
BL::ViewLayer b_view_layer = b_depsgraph.view_layer();
if(!preview) if(!preview)
set_resolution(&b_ob, &b_scene, &b_view_layer, true); set_resolution(b_ob, b_scene, b_view_layer, true);
ObtainCacheParticleData(mesh, &b_mesh, &b_ob, &CData, !preview); ObtainCacheParticleData(mesh, &b_mesh, &b_ob, &CData, !preview);
@@ -1066,7 +1068,7 @@ void BlenderSync::sync_curves(Mesh *mesh,
} }
if(!preview) if(!preview)
set_resolution(&b_ob, &b_scene, &b_view_layer, false); set_resolution(b_ob, b_scene, b_view_layer, false);
mesh->compute_bounds(); mesh->compute_bounds();
} }

View File

@@ -1067,7 +1067,8 @@ static void sync_mesh_fluid_motion(BL::Object& b_ob, Scene *scene, Mesh *mesh)
} }
} }
Mesh *BlenderSync::sync_mesh(BL::Object& b_ob, Mesh *BlenderSync::sync_mesh(BL::Depsgraph& b_depsgraph,
BL::Object& b_ob,
BL::Object& b_ob_instance, BL::Object& b_ob_instance,
bool object_updated, bool object_updated,
bool hide_tris) bool hide_tris)
@@ -1186,7 +1187,7 @@ Mesh *BlenderSync::sync_mesh(BL::Object& b_ob,
BL::Mesh b_mesh = object_to_mesh(b_data, BL::Mesh b_mesh = object_to_mesh(b_data,
b_ob, b_ob,
b_scene, b_scene,
b_view_layer, b_depsgraph.view_layer(),
true, true,
!preview, !preview,
need_undeformed, need_undeformed,
@@ -1204,7 +1205,7 @@ Mesh *BlenderSync::sync_mesh(BL::Object& b_ob,
} }
if(view_layer.use_hair && mesh->subdivision_type == Mesh::SUBDIVISION_NONE) if(view_layer.use_hair && mesh->subdivision_type == Mesh::SUBDIVISION_NONE)
sync_curves(mesh, b_mesh, b_ob, false); sync_curves(b_depsgraph, mesh, b_mesh, b_ob, false);
if(can_free_caches) { if(can_free_caches) {
b_ob.cache_release(); b_ob.cache_release();
@@ -1231,7 +1232,8 @@ Mesh *BlenderSync::sync_mesh(BL::Object& b_ob,
return mesh; return mesh;
} }
void BlenderSync::sync_mesh_motion(BL::Object& b_ob, void BlenderSync::sync_mesh_motion(BL::Depsgraph& b_depsgraph,
BL::Object& b_ob,
Object *object, Object *object,
float motion_time) float motion_time)
{ {
@@ -1301,7 +1303,7 @@ void BlenderSync::sync_mesh_motion(BL::Object& b_ob,
b_mesh = object_to_mesh(b_data, b_mesh = object_to_mesh(b_data,
b_ob, b_ob,
b_scene, b_scene,
b_view_layer, b_depsgraph.view_layer(),
true, true,
!preview, !preview,
false, false,
@@ -1412,7 +1414,7 @@ void BlenderSync::sync_mesh_motion(BL::Object& b_ob,
/* hair motion */ /* hair motion */
if(numkeys) if(numkeys)
sync_curves(mesh, b_mesh, b_ob, true, time_index); sync_curves(b_depsgraph, mesh, b_mesh, b_ob, true, time_index);
/* free derived mesh */ /* free derived mesh */
b_data.meshes.remove(b_mesh, false, true, false); b_data.meshes.remove(b_mesh, false, true, false);

View File

@@ -263,7 +263,8 @@ void BlenderSync::sync_background_light(bool use_portal)
/* Object */ /* Object */
Object *BlenderSync::sync_object(BL::Depsgraph::duplis_iterator& b_dupli_iter, Object *BlenderSync::sync_object(BL::Depsgraph& b_depsgraph,
BL::Depsgraph::duplis_iterator& b_dupli_iter,
uint layer_flag, uint layer_flag,
float motion_time, float motion_time,
bool hide_tris, bool hide_tris,
@@ -366,7 +367,7 @@ Object *BlenderSync::sync_object(BL::Depsgraph::duplis_iterator& b_dupli_iter,
/* mesh deformation */ /* mesh deformation */
if(object->mesh) if(object->mesh)
sync_mesh_motion(b_ob, object, motion_time); sync_mesh_motion(b_depsgraph, b_ob, object, motion_time);
} }
return object; return object;
@@ -379,7 +380,7 @@ Object *BlenderSync::sync_object(BL::Depsgraph::duplis_iterator& b_dupli_iter,
object_updated = true; object_updated = true;
/* mesh sync */ /* mesh sync */
object->mesh = sync_mesh(b_ob, b_ob_instance, object_updated, hide_tris); object->mesh = sync_mesh(b_depsgraph, b_ob, b_ob_instance, object_updated, hide_tris);
/* special case not tracked by object update flags */ /* special case not tracked by object update flags */
@@ -520,7 +521,7 @@ static bool object_render_hide(BL::Object& b_ob,
/* Object Loop */ /* Object Loop */
void BlenderSync::sync_objects(float motion_time) void BlenderSync::sync_objects(BL::Depsgraph& b_depsgraph, float motion_time)
{ {
/* layer data */ /* layer data */
bool motion = motion_time != 0.0f; bool motion = motion_time != 0.0f;
@@ -564,7 +565,8 @@ void BlenderSync::sync_objects(float motion_time)
if(!object_render_hide(b_ob, true, true, hide_tris)) { if(!object_render_hide(b_ob, true, true, hide_tris)) {
/* object itself */ /* object itself */
sync_object(b_dupli_iter, sync_object(b_depsgraph,
b_dupli_iter,
~(0), /* until we get rid of layers */ ~(0), /* until we get rid of layers */
motion_time, motion_time,
hide_tris, hide_tris,
@@ -596,6 +598,7 @@ void BlenderSync::sync_objects(float motion_time)
} }
void BlenderSync::sync_motion(BL::RenderSettings& b_render, void BlenderSync::sync_motion(BL::RenderSettings& b_render,
BL::Depsgraph& b_depsgraph,
BL::Object& b_override, BL::Object& b_override,
int width, int height, int width, int height,
void **python_thread_state) void **python_thread_state)
@@ -625,6 +628,8 @@ void BlenderSync::sync_motion(BL::RenderSettings& b_render,
assert(scene->camera->motion_position == Camera::MOTION_POSITION_START); assert(scene->camera->motion_position == Camera::MOTION_POSITION_START);
frame_center_delta = shuttertime * 0.5f; frame_center_delta = shuttertime * 0.5f;
} }
/* TODO: move frame on depsgraph. */
float time = frame_center + subframe_center + frame_center_delta; float time = frame_center + subframe_center + frame_center_delta;
int frame = (int)floorf(time); int frame = (int)floorf(time);
float subframe = time - frame; float subframe = time - frame;
@@ -632,7 +637,7 @@ void BlenderSync::sync_motion(BL::RenderSettings& b_render,
b_engine.frame_set(frame, subframe); b_engine.frame_set(frame, subframe);
python_thread_state_save(python_thread_state); python_thread_state_save(python_thread_state);
sync_camera_motion(b_render, b_cam, width, height, 0.0f); sync_camera_motion(b_render, b_cam, width, height, 0.0f);
sync_objects(0.0f); sync_objects(b_depsgraph, 0.0f);
} }
/* always sample these times for camera motion */ /* always sample these times for camera motion */
@@ -652,6 +657,7 @@ void BlenderSync::sync_motion(BL::RenderSettings& b_render,
int frame = (int)floorf(time); int frame = (int)floorf(time);
float subframe = time - frame; float subframe = time - frame;
/* TODO: move frame on depsgraph. */
/* change frame */ /* change frame */
python_thread_state_restore(python_thread_state); python_thread_state_restore(python_thread_state);
b_engine.frame_set(frame, subframe); b_engine.frame_set(frame, subframe);
@@ -666,7 +672,7 @@ void BlenderSync::sync_motion(BL::RenderSettings& b_render,
} }
/* sync object */ /* sync object */
sync_objects(relative_time); sync_objects(b_depsgraph, relative_time);
} }
/* we need to set the python thread state again because this /* we need to set the python thread state again because this

View File

@@ -280,13 +280,22 @@ static PyObject *free_func(PyObject * /*self*/, PyObject *value)
Py_RETURN_NONE; Py_RETURN_NONE;
} }
static PyObject *render_func(PyObject * /*self*/, PyObject *value) static PyObject *render_func(PyObject * /*self*/, PyObject *args)
{ {
BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(value); PyObject *pysession, *pydepsgraph;
if(!PyArg_ParseTuple(args, "OO", &pysession, &pydepsgraph))
return NULL;
BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(pysession);
PointerRNA depsgraphptr;
RNA_pointer_create(NULL, &RNA_Depsgraph, (ID*)PyLong_AsVoidPtr(pydepsgraph), &depsgraphptr);
BL::Depsgraph b_depsgraph(depsgraphptr);
python_thread_state_save(&session->python_thread_state); python_thread_state_save(&session->python_thread_state);
session->render(); session->render(b_depsgraph);
python_thread_state_restore(&session->python_thread_state); python_thread_state_restore(&session->python_thread_state);
@@ -296,16 +305,20 @@ static PyObject *render_func(PyObject * /*self*/, PyObject *value)
/* pixel_array and result passed as pointers */ /* pixel_array and result passed as pointers */
static PyObject *bake_func(PyObject * /*self*/, PyObject *args) static PyObject *bake_func(PyObject * /*self*/, PyObject *args)
{ {
PyObject *pysession, *pyobject; PyObject *pysession, *pydepsgraph, *pyobject;
PyObject *pypixel_array, *pyresult; PyObject *pypixel_array, *pyresult;
const char *pass_type; const char *pass_type;
int num_pixels, depth, object_id, pass_filter; int num_pixels, depth, object_id, pass_filter;
if(!PyArg_ParseTuple(args, "OOsiiOiiO", &pysession, &pyobject, &pass_type, &pass_filter, &object_id, &pypixel_array, &num_pixels, &depth, &pyresult)) if(!PyArg_ParseTuple(args, "OOOsiiOiiO", &pysession, &pydepsgraph, &pyobject, &pass_type, &pass_filter, &object_id, &pypixel_array, &num_pixels, &depth, &pyresult))
return NULL; return NULL;
BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(pysession); BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(pysession);
PointerRNA depsgraphptr;
RNA_id_pointer_create((ID*)PyLong_AsVoidPtr(pydepsgraph), &depsgraphptr);
BL::Depsgraph b_depsgraph(depsgraphptr);
PointerRNA objectptr; PointerRNA objectptr;
RNA_id_pointer_create((ID*)PyLong_AsVoidPtr(pyobject), &objectptr); RNA_id_pointer_create((ID*)PyLong_AsVoidPtr(pyobject), &objectptr);
BL::Object b_object(objectptr); BL::Object b_object(objectptr);
@@ -318,7 +331,7 @@ static PyObject *bake_func(PyObject * /*self*/, PyObject *args)
python_thread_state_save(&session->python_thread_state); python_thread_state_save(&session->python_thread_state);
session->bake(b_object, pass_type, pass_filter, object_id, b_bake_pixel, (size_t)num_pixels, depth, (float *)b_result); session->bake(b_depsgraph, b_object, pass_type, pass_filter, object_id, b_bake_pixel, (size_t)num_pixels, depth, (float *)b_result);
python_thread_state_restore(&session->python_thread_state); python_thread_state_restore(&session->python_thread_state);
@@ -371,13 +384,22 @@ static PyObject *reset_func(PyObject * /*self*/, PyObject *args)
Py_RETURN_NONE; Py_RETURN_NONE;
} }
static PyObject *sync_func(PyObject * /*self*/, PyObject *value) static PyObject *sync_func(PyObject * /*self*/, PyObject *args)
{ {
BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(value); PyObject *pysession, *pydepsgraph;
if(!PyArg_ParseTuple(args, "OO", &pysession, &pydepsgraph))
return NULL;
BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(pysession);
PointerRNA depsgraphptr;
RNA_id_pointer_create((ID*)PyLong_AsVoidPtr(pydepsgraph), &depsgraphptr);
BL::Depsgraph b_depsgraph(depsgraphptr);
python_thread_state_save(&session->python_thread_state); python_thread_state_save(&session->python_thread_state);
session->synchronize(); session->synchronize(b_depsgraph);
python_thread_state_restore(&session->python_thread_state); python_thread_state_restore(&session->python_thread_state);
@@ -749,10 +771,10 @@ static PyMethodDef methods[] = {
{"exit", exit_func, METH_VARARGS, ""}, {"exit", exit_func, METH_VARARGS, ""},
{"create", create_func, METH_VARARGS, ""}, {"create", create_func, METH_VARARGS, ""},
{"free", free_func, METH_O, ""}, {"free", free_func, METH_O, ""},
{"render", render_func, METH_O, ""}, {"render", render_func, METH_VARARGS, ""},
{"bake", bake_func, METH_VARARGS, ""}, {"bake", bake_func, METH_VARARGS, ""},
{"draw", draw_func, METH_VARARGS, ""}, {"draw", draw_func, METH_VARARGS, ""},
{"sync", sync_func, METH_O, ""}, {"sync", sync_func, METH_VARARGS, ""},
{"reset", reset_func, METH_VARARGS, ""}, {"reset", reset_func, METH_VARARGS, ""},
#ifdef WITH_OSL #ifdef WITH_OSL
{"osl_update_node", osl_update_node_func, METH_VARARGS, ""}, {"osl_update_node", osl_update_node_func, METH_VARARGS, ""},

View File

@@ -141,7 +141,6 @@ void BlenderSession::create_session()
session->scene = scene; session->scene = scene;
#if 0
/* There is no single depsgraph to use for the entire render. /* There is no single depsgraph to use for the entire render.
* So we need to handle this differently. * So we need to handle this differently.
* *
@@ -149,28 +148,14 @@ void BlenderSession::create_session()
* or perhaps move syncing further down in the pipeline. * or perhaps move syncing further down in the pipeline.
*/ */
/* create sync */ /* create sync */
sync = new BlenderSync(b_engine, b_data, b_depsgraph, b_scene, scene, !background, session->progress); sync = new BlenderSync(b_engine, b_data, b_scene, scene, !background, session->progress);
BL::Object b_camera_override(b_engine.camera_override()); BL::Object b_camera_override(b_engine.camera_override());
if(b_v3d) { if(b_v3d) {
if(session_pause == false) { sync->sync_view(b_v3d, b_rv3d, width, height);
/* full data sync */
sync->sync_view(b_v3d, b_rv3d, width, height);
sync->sync_data(b_render,
b_v3d,
b_camera_override,
width, height,
&python_thread_state,
b_rlay_name.c_str());
}
} }
else { else {
/* for final render we will do full data sync per render layer, only
* do some basic syncing here, no objects or materials for speed */
sync->sync_view_layers(b_v3d, NULL);
sync->sync_integrator();
sync->sync_camera(b_render, b_camera_override, width, height, ""); sync->sync_camera(b_render, b_camera_override, width, height, "");
} }
#endif
/* set buffer parameters */ /* set buffer parameters */
BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_v3d, b_rv3d, scene->camera, width, height); BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_v3d, b_rv3d, scene->camera, width, height);
@@ -218,20 +203,11 @@ void BlenderSession::reset_session(BL::BlendData& b_data_, BL::Scene& b_scene_)
*/ */
session->stats.mem_peak = session->stats.mem_used; session->stats.mem_peak = session->stats.mem_used;
#if 0
/* There is no single depsgraph to use for the entire render. /* There is no single depsgraph to use for the entire render.
* See note on create_session(). * See note on create_session().
*/ */
/* sync object should be re-created */ /* sync object should be re-created */
sync = new BlenderSync(b_engine, b_data, b_depsgraph, b_scene, scene, !background, session->progress); sync = new BlenderSync(b_engine, b_data, b_scene, scene, !background, session->progress);
/* for final render we will do full data sync per render layer, only
* do some basic syncing here, no objects or materials for speed */
BL::Object b_camera_override(b_engine.camera_override());
sync->sync_view_layers(b_v3d, NULL);
sync->sync_integrator();
sync->sync_camera(b_render, b_camera_override, width, height, "");
#endif
BL::SpaceView3D b_null_space_view3d(PointerRNA_NULL); BL::SpaceView3D b_null_space_view3d(PointerRNA_NULL);
BL::RegionView3D b_null_region_view3d(PointerRNA_NULL); BL::RegionView3D b_null_region_view3d(PointerRNA_NULL);
@@ -379,7 +355,7 @@ void BlenderSession::update_render_tile(RenderTile& rtile, bool highlight)
do_write_update_render_tile(rtile, false, false); do_write_update_render_tile(rtile, false, false);
} }
void BlenderSession::render() void BlenderSession::render(BL::Depsgraph& b_depsgraph)
{ {
/* set callback to write out render results */ /* set callback to write out render results */
session->write_render_tile_cb = function_bind(&BlenderSession::write_render_tile, this, _1); session->write_render_tile_cb = function_bind(&BlenderSession::write_render_tile, this, _1);
@@ -390,122 +366,109 @@ void BlenderSession::render()
BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_v3d, b_rv3d, scene->camera, width, height); BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_v3d, b_rv3d, scene->camera, width, height);
/* render each layer */ /* render each layer */
BL::Scene::view_layers_iterator b_layer_iter; BL::ViewLayer b_view_layer = b_depsgraph.view_layer();
BL::RenderResult::views_iterator b_view_iter;
/* We do some special meta attributes when we only have single layer. */ /* We do some special meta attributes when we only have single layer. */
const bool is_single_layer = (b_scene.view_layers.length() == 1); const bool is_single_layer = (b_scene.view_layers.length() == 1);
for(b_scene.view_layers.begin(b_layer_iter); b_layer_iter != b_scene.view_layers.end(); ++b_layer_iter) { /* temporary render result to find needed passes and views */
b_rlay_name = b_layer_iter->name(); BL::RenderResult b_rr = begin_render_result(b_engine, 0, 0, 1, 1, b_view_layer.name().c_str(), NULL);
BL::RenderResult::layers_iterator b_single_rlay;
b_rr.layers.begin(b_single_rlay);
BL::RenderLayer b_rlay = *b_single_rlay;
/* temporary render result to find needed passes and views */ /* add passes */
BL::RenderResult b_rr = begin_render_result(b_engine, 0, 0, 1, 1, b_rlay_name.c_str(), NULL); array<Pass> passes = sync->sync_render_passes(b_rlay, b_view_layer, session_params);
BL::RenderResult::layers_iterator b_single_rlay; buffer_params.passes = passes;
b_rr.layers.begin(b_single_rlay);
/* layer will be missing if it was disabled in the UI */ PointerRNA crl = RNA_pointer_get(&b_view_layer.ptr, "cycles");
if(b_single_rlay == b_rr.layers.end()) { bool use_denoising = get_boolean(crl, "use_denoising");
end_render_result(b_engine, b_rr, true, true, false); buffer_params.denoising_data_pass = use_denoising;
continue; session->tile_manager.schedule_denoising = use_denoising;
session->params.use_denoising = use_denoising;
scene->film->denoising_data_pass = buffer_params.denoising_data_pass;
scene->film->denoising_flags = 0;
if(!get_boolean(crl, "denoising_diffuse_direct")) scene->film->denoising_flags |= DENOISING_CLEAN_DIFFUSE_DIR;
if(!get_boolean(crl, "denoising_diffuse_indirect")) scene->film->denoising_flags |= DENOISING_CLEAN_DIFFUSE_IND;
if(!get_boolean(crl, "denoising_glossy_direct")) scene->film->denoising_flags |= DENOISING_CLEAN_GLOSSY_DIR;
if(!get_boolean(crl, "denoising_glossy_indirect")) scene->film->denoising_flags |= DENOISING_CLEAN_GLOSSY_IND;
if(!get_boolean(crl, "denoising_transmission_direct")) scene->film->denoising_flags |= DENOISING_CLEAN_TRANSMISSION_DIR;
if(!get_boolean(crl, "denoising_transmission_indirect")) scene->film->denoising_flags |= DENOISING_CLEAN_TRANSMISSION_IND;
if(!get_boolean(crl, "denoising_subsurface_direct")) scene->film->denoising_flags |= DENOISING_CLEAN_SUBSURFACE_DIR;
if(!get_boolean(crl, "denoising_subsurface_indirect")) scene->film->denoising_flags |= DENOISING_CLEAN_SUBSURFACE_IND;
scene->film->denoising_clean_pass = (scene->film->denoising_flags & DENOISING_CLEAN_ALL_PASSES);
buffer_params.denoising_clean_pass = scene->film->denoising_clean_pass;
session->params.denoising_radius = get_int(crl, "denoising_radius");
session->params.denoising_strength = get_float(crl, "denoising_strength");
session->params.denoising_feature_strength = get_float(crl, "denoising_feature_strength");
session->params.denoising_relative_pca = get_boolean(crl, "denoising_relative_pca");
scene->film->pass_alpha_threshold = b_view_layer.pass_alpha_threshold();
scene->film->tag_passes_update(scene, passes);
scene->film->tag_update(scene);
scene->integrator->tag_update(scene);
BL::RenderResult::views_iterator b_view_iter;
int view_index = 0;
for(b_rr.views.begin(b_view_iter); b_view_iter != b_rr.views.end(); ++b_view_iter, ++view_index) {
b_rlay_name = b_view_layer.name();
b_rview_name = b_view_iter->name();
/* set the current view */
b_engine.active_view_set(b_rview_name.c_str());
/* update scene */
BL::Object b_camera_override(b_engine.camera_override());
sync->sync_camera(b_render, b_camera_override, width, height, b_rview_name.c_str());
sync->sync_data(b_render,
b_depsgraph,
b_v3d,
b_camera_override,
width, height,
&python_thread_state);
/* Make sure all views have different noise patterns. - hardcoded value just to make it random */
if(view_index != 0) {
scene->integrator->seed += hash_int_2d(scene->integrator->seed, hash_int(view_index * 0xdeadbeef));
scene->integrator->tag_update(scene);
} }
BL::RenderLayer b_rlay = *b_single_rlay; /* Update number of samples per layer. */
int samples = sync->get_layer_samples();
bool bound_samples = sync->get_layer_bound_samples();
int effective_layer_samples;
/* add passes */ if(samples != 0 && (!bound_samples || (samples < session_params.samples)))
array<Pass> passes = sync->sync_render_passes(b_rlay, *b_layer_iter, session_params); effective_layer_samples = samples;
buffer_params.passes = passes; else
effective_layer_samples = session_params.samples;
PointerRNA crl = RNA_pointer_get(&b_layer_iter->ptr, "cycles"); /* Update tile manager if we're doing resumable render. */
bool use_denoising = get_boolean(crl, "use_denoising"); update_resumable_tile_manager(effective_layer_samples);
buffer_params.denoising_data_pass = use_denoising;
session->tile_manager.schedule_denoising = use_denoising;
session->params.use_denoising = use_denoising;
scene->film->denoising_data_pass = buffer_params.denoising_data_pass;
scene->film->denoising_flags = 0;
if(!get_boolean(crl, "denoising_diffuse_direct")) scene->film->denoising_flags |= DENOISING_CLEAN_DIFFUSE_DIR;
if(!get_boolean(crl, "denoising_diffuse_indirect")) scene->film->denoising_flags |= DENOISING_CLEAN_DIFFUSE_IND;
if(!get_boolean(crl, "denoising_glossy_direct")) scene->film->denoising_flags |= DENOISING_CLEAN_GLOSSY_DIR;
if(!get_boolean(crl, "denoising_glossy_indirect")) scene->film->denoising_flags |= DENOISING_CLEAN_GLOSSY_IND;
if(!get_boolean(crl, "denoising_transmission_direct")) scene->film->denoising_flags |= DENOISING_CLEAN_TRANSMISSION_DIR;
if(!get_boolean(crl, "denoising_transmission_indirect")) scene->film->denoising_flags |= DENOISING_CLEAN_TRANSMISSION_IND;
if(!get_boolean(crl, "denoising_subsurface_direct")) scene->film->denoising_flags |= DENOISING_CLEAN_SUBSURFACE_DIR;
if(!get_boolean(crl, "denoising_subsurface_indirect")) scene->film->denoising_flags |= DENOISING_CLEAN_SUBSURFACE_IND;
scene->film->denoising_clean_pass = (scene->film->denoising_flags & DENOISING_CLEAN_ALL_PASSES);
buffer_params.denoising_clean_pass = scene->film->denoising_clean_pass;
session->params.denoising_radius = get_int(crl, "denoising_radius");
session->params.denoising_strength = get_float(crl, "denoising_strength");
session->params.denoising_feature_strength = get_float(crl, "denoising_feature_strength");
session->params.denoising_relative_pca = get_boolean(crl, "denoising_relative_pca");
scene->film->pass_alpha_threshold = b_layer_iter->pass_alpha_threshold(); /* Update session itself. */
scene->film->tag_passes_update(scene, passes); session->reset(buffer_params, effective_layer_samples);
scene->film->tag_update(scene);
scene->integrator->tag_update(scene);
int view_index = 0; /* render */
for(b_rr.views.begin(b_view_iter); b_view_iter != b_rr.views.end(); ++b_view_iter, ++view_index) { session->start();
b_rview_name = b_view_iter->name(); session->wait();
/* set the current view */
b_engine.active_view_set(b_rview_name.c_str());
/* update scene */
BL::Object b_camera_override(b_engine.camera_override());
sync->sync_camera(b_render, b_camera_override, width, height, b_rview_name.c_str());
sync->sync_data(b_render,
b_v3d,
b_camera_override,
width, height,
&python_thread_state,
b_rlay_name.c_str());
/* Make sure all views have different noise patterns. - hardcoded value just to make it random */
if(view_index != 0) {
scene->integrator->seed += hash_int_2d(scene->integrator->seed, hash_int(view_index * 0xdeadbeef));
scene->integrator->tag_update(scene);
}
/* Update number of samples per layer. */
int samples = sync->get_layer_samples();
bool bound_samples = sync->get_layer_bound_samples();
int effective_layer_samples;
if(samples != 0 && (!bound_samples || (samples < session_params.samples)))
effective_layer_samples = samples;
else
effective_layer_samples = session_params.samples;
/* Update tile manager if we're doing resumable render. */
update_resumable_tile_manager(effective_layer_samples);
/* Update session itself. */
session->reset(buffer_params, effective_layer_samples);
/* render */
session->start();
session->wait();
if(session->progress.get_cancel())
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);
if(session->progress.get_cancel()) if(session->progress.get_cancel())
break; 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);
double total_time, render_time; double total_time, render_time;
session->progress.get_time(total_time, render_time); session->progress.get_time(total_time, render_time);
VLOG(1) << "Total render time: " << total_time; VLOG(1) << "Total render time: " << total_time;
@@ -515,6 +478,8 @@ void BlenderSession::render()
session->write_render_tile_cb = function_null; session->write_render_tile_cb = function_null;
session->update_render_tile_cb = function_null; session->update_render_tile_cb = function_null;
/* TODO: find a way to clear this data for persistent data render */
#if 0
/* free all memory used (host and device), so we wouldn't leave render /* free all memory used (host and device), so we wouldn't leave render
* engine with extra memory allocated * engine with extra memory allocated
*/ */
@@ -523,6 +488,7 @@ void BlenderSession::render()
delete sync; delete sync;
sync = NULL; sync = NULL;
#endif
} }
static void populate_bake_data(BakeData *data, const static void populate_bake_data(BakeData *data, const
@@ -571,7 +537,8 @@ static int bake_pass_filter_get(const int pass_filter)
return flag; return flag;
} }
void BlenderSession::bake(BL::Object& b_object, void BlenderSession::bake(BL::Depsgraph& b_depsgraph,
BL::Object& b_object,
const string& pass_type, const string& pass_type,
const int pass_filter, const int pass_filter,
const int object_id, const int object_id,
@@ -612,11 +579,11 @@ void BlenderSession::bake(BL::Object& b_object,
BL::Object b_camera_override(b_engine.camera_override()); BL::Object b_camera_override(b_engine.camera_override());
sync->sync_camera(b_render, b_camera_override, width, height, ""); sync->sync_camera(b_render, b_camera_override, width, height, "");
sync->sync_data(b_render, sync->sync_data(b_render,
b_depsgraph,
b_v3d, b_v3d,
b_camera_override, b_camera_override,
width, height, width, height,
&python_thread_state, &python_thread_state);
b_rlay_name.c_str());
} }
BakeData *bake_data = NULL; BakeData *bake_data = NULL;
@@ -750,7 +717,7 @@ void BlenderSession::update_render_result(BL::RenderResult& b_rr,
do_write_update_render_result(b_rr, b_rlay, rtile, true); do_write_update_render_result(b_rr, b_rlay, rtile, true);
} }
void BlenderSession::synchronize() void BlenderSession::synchronize(BL::Depsgraph& b_depsgraph)
{ {
/* only used for viewport render */ /* only used for viewport render */
if(!b_v3d) if(!b_v3d)
@@ -793,11 +760,11 @@ void BlenderSession::synchronize()
/* data and camera synchronize */ /* data and camera synchronize */
BL::Object b_camera_override(b_engine.camera_override()); BL::Object b_camera_override(b_engine.camera_override());
sync->sync_data(b_render, sync->sync_data(b_render,
b_depsgraph,
b_v3d, b_v3d,
b_camera_override, b_camera_override,
width, height, width, height,
&python_thread_state, &python_thread_state);
b_rlay_name.c_str());
if(b_rv3d) if(b_rv3d)
sync->sync_view(b_v3d, b_rv3d, width, height); sync->sync_view(b_v3d, b_rv3d, width, height);
@@ -1318,6 +1285,7 @@ bool BlenderSession::builtin_image_float_pixels(const string &builtin_name,
fprintf(stderr, "Cycles error: unexpected smoke volume resolution, skipping\n"); fprintf(stderr, "Cycles error: unexpected smoke volume resolution, skipping\n");
} }
else { else {
/* TODO: fix point density to work with new view layer depsgraph */
#if 0 #if 0
/* We originally were passing view_layer here but in reality we need a whole EvaluationContext /* We originally were passing view_layer here but in reality we need a whole EvaluationContext
* in the RE_point_density_minmax() function. * in the RE_point_density_minmax() function.

View File

@@ -58,9 +58,10 @@ public:
BL::Scene& b_scene); BL::Scene& b_scene);
/* offline render */ /* offline render */
void render(); void render(BL::Depsgraph& b_depsgraph);
void bake(BL::Object& b_object, void bake(BL::Depsgraph& b_depsgrah,
BL::Object& b_object,
const string& pass_type, const string& pass_type,
const int custom_flag, const int custom_flag,
const int object_id, const int object_id,
@@ -82,7 +83,7 @@ public:
void update_render_tile(RenderTile& rtile, bool highlight); void update_render_tile(RenderTile& rtile, bool highlight);
/* interactive updates */ /* interactive updates */
void synchronize(); void synchronize(BL::Depsgraph& b_depsgraph);
/* drawing */ /* drawing */
bool draw(int w, int h); bool draw(int w, int h);

View File

@@ -235,8 +235,7 @@ static ShaderNode *add_node(Scene *scene,
BL::RenderEngine& b_engine, BL::RenderEngine& b_engine,
BL::BlendData& b_data, BL::BlendData& b_data,
BL::Scene& b_scene, BL::Scene& b_scene,
BL::ViewLayer b_view_layer, const bool /*background*/,
const bool background,
ShaderGraph *graph, ShaderGraph *graph,
BL::ShaderNodeTree& b_ntree, BL::ShaderNodeTree& b_ntree,
BL::ShaderNode& b_node) BL::ShaderNode& b_node)
@@ -835,6 +834,8 @@ static ShaderNode *add_node(Scene *scene,
node = uvm; node = uvm;
} }
else if(b_node.is_a(&RNA_ShaderNodeTexPointDensity)) { else if(b_node.is_a(&RNA_ShaderNodeTexPointDensity)) {
/* TODO: fix point density to work with new view layer depsgraph */
#if 0
BL::ShaderNodeTexPointDensity b_point_density_node(b_node); BL::ShaderNodeTexPointDensity b_point_density_node(b_node);
PointDensityTextureNode *point_density = new PointDensityTextureNode(); PointDensityTextureNode *point_density = new PointDensityTextureNode();
point_density->filename = b_point_density_node.name(); point_density->filename = b_point_density_node.name();
@@ -874,6 +875,7 @@ static ShaderNode *add_node(Scene *scene,
transform_translate(-loc) * transform_scale(size) * transform_translate(-loc) * transform_scale(size) *
transform_inverse(get_transform(b_ob.matrix_world())); transform_inverse(get_transform(b_ob.matrix_world()));
} }
#endif
} }
else if(b_node.is_a(&RNA_ShaderNodeBevel)) { else if(b_node.is_a(&RNA_ShaderNodeBevel)) {
BL::ShaderNodeBevel b_bevel_node(b_node); BL::ShaderNodeBevel b_bevel_node(b_node);
@@ -1006,7 +1008,6 @@ static void add_nodes(Scene *scene,
BL::RenderEngine& b_engine, BL::RenderEngine& b_engine,
BL::BlendData& b_data, BL::BlendData& b_data,
BL::Scene& b_scene, BL::Scene& b_scene,
BL::ViewLayer& b_view_layer,
const bool background, const bool background,
ShaderGraph *graph, ShaderGraph *graph,
BL::ShaderNodeTree& b_ntree, BL::ShaderNodeTree& b_ntree,
@@ -1093,7 +1094,6 @@ static void add_nodes(Scene *scene,
b_engine, b_engine,
b_data, b_data,
b_scene, b_scene,
b_view_layer,
background, background,
graph, graph,
b_group_ntree, b_group_ntree,
@@ -1141,7 +1141,6 @@ static void add_nodes(Scene *scene,
b_engine, b_engine,
b_data, b_data,
b_scene, b_scene,
b_view_layer,
background, background,
graph, graph,
b_ntree, b_ntree,
@@ -1205,7 +1204,6 @@ static void add_nodes(Scene *scene,
BL::RenderEngine& b_engine, BL::RenderEngine& b_engine,
BL::BlendData& b_data, BL::BlendData& b_data,
BL::Scene& b_scene, BL::Scene& b_scene,
BL::ViewLayer& b_view_layer,
const bool background, const bool background,
ShaderGraph *graph, ShaderGraph *graph,
BL::ShaderNodeTree& b_ntree) BL::ShaderNodeTree& b_ntree)
@@ -1215,7 +1213,6 @@ static void add_nodes(Scene *scene,
b_engine, b_engine,
b_data, b_data,
b_scene, b_scene,
b_view_layer,
background, background,
graph, graph,
b_ntree, b_ntree,
@@ -1225,7 +1222,7 @@ static void add_nodes(Scene *scene,
/* Sync Materials */ /* Sync Materials */
void BlenderSync::sync_materials(bool update_all) void BlenderSync::sync_materials(BL::Depsgraph& b_depsgraph, bool update_all)
{ {
shader_map.set_default(scene->default_surface); shader_map.set_default(scene->default_surface);
@@ -1254,7 +1251,7 @@ void BlenderSync::sync_materials(bool update_all)
if(b_mat->use_nodes() && b_mat->node_tree()) { if(b_mat->use_nodes() && b_mat->node_tree()) {
BL::ShaderNodeTree b_ntree(b_mat->node_tree()); BL::ShaderNodeTree b_ntree(b_mat->node_tree());
add_nodes(scene, b_engine, b_data, b_scene, b_view_layer, !preview, graph, b_ntree); add_nodes(scene, b_engine, b_data, b_scene, !preview, graph, b_ntree);
} }
else { else {
DiffuseBsdfNode *diffuse = new DiffuseBsdfNode(); DiffuseBsdfNode *diffuse = new DiffuseBsdfNode();
@@ -1325,7 +1322,7 @@ void BlenderSync::sync_world(bool update_all)
if(b_world && b_world.use_nodes() && b_world.node_tree()) { if(b_world && b_world.use_nodes() && b_world.node_tree()) {
BL::ShaderNodeTree b_ntree(b_world.node_tree()); BL::ShaderNodeTree b_ntree(b_world.node_tree());
add_nodes(scene, b_engine, b_data, b_scene, b_view_layer, !preview, graph, b_ntree); add_nodes(scene, b_engine, b_data, b_scene, !preview, graph, b_ntree);
/* volume */ /* volume */
PointerRNA cworld = RNA_pointer_get(&b_world.ptr, "cycles"); PointerRNA cworld = RNA_pointer_get(&b_world.ptr, "cycles");
@@ -1402,7 +1399,7 @@ void BlenderSync::sync_world(bool update_all)
/* Sync Lamps */ /* Sync Lamps */
void BlenderSync::sync_lamps(bool update_all) void BlenderSync::sync_lamps(BL::Depsgraph& b_depsgraph, bool update_all)
{ {
shader_map.set_default(scene->default_light); shader_map.set_default(scene->default_light);
@@ -1427,7 +1424,7 @@ void BlenderSync::sync_lamps(bool update_all)
BL::ShaderNodeTree b_ntree(b_lamp->node_tree()); BL::ShaderNodeTree b_ntree(b_lamp->node_tree());
add_nodes(scene, b_engine, b_data, b_scene, b_view_layer, !preview, graph, b_ntree); add_nodes(scene, b_engine, b_data, b_scene, !preview, graph, b_ntree);
} }
else { else {
float strength = 1.0f; float strength = 1.0f;
@@ -1454,7 +1451,7 @@ void BlenderSync::sync_lamps(bool update_all)
} }
} }
void BlenderSync::sync_shaders() void BlenderSync::sync_shaders(BL::Depsgraph& b_depsgraph)
{ {
/* for auto refresh images */ /* for auto refresh images */
bool auto_refresh_update = false; bool auto_refresh_update = false;
@@ -1468,8 +1465,8 @@ void BlenderSync::sync_shaders()
shader_map.pre_sync(); shader_map.pre_sync();
sync_world(auto_refresh_update); sync_world(auto_refresh_update);
sync_lamps(auto_refresh_update); sync_lamps(b_depsgraph, auto_refresh_update);
sync_materials(auto_refresh_update); sync_materials(b_depsgraph, auto_refresh_update);
/* false = don't delete unused shaders, not supported */ /* false = don't delete unused shaders, not supported */
shader_map.post_sync(false); shader_map.post_sync(false);

View File

@@ -44,17 +44,13 @@ CCL_NAMESPACE_BEGIN
BlenderSync::BlenderSync(BL::RenderEngine& b_engine, BlenderSync::BlenderSync(BL::RenderEngine& b_engine,
BL::BlendData& b_data, BL::BlendData& b_data,
BL::Depsgraph& b_depsgraph,
BL::Scene& b_scene, BL::Scene& b_scene,
BL::ViewLayer& b_view_layer,
Scene *scene, Scene *scene,
bool preview, bool preview,
Progress &progress) Progress &progress)
: b_engine(b_engine), : b_engine(b_engine),
b_data(b_data), b_data(b_data),
b_depsgraph(b_depsgraph),
b_scene(b_scene), b_scene(b_scene),
b_view_layer(b_view_layer),
shader_map(&scene->shaders), shader_map(&scene->shaders),
object_map(&scene->objects), object_map(&scene->objects),
mesh_map(&scene->meshes), mesh_map(&scene->meshes),
@@ -193,16 +189,18 @@ bool BlenderSync::sync_recalc()
} }
void BlenderSync::sync_data(BL::RenderSettings& b_render, void BlenderSync::sync_data(BL::RenderSettings& b_render,
BL::Depsgraph& b_depsgraph,
BL::SpaceView3D& b_v3d, BL::SpaceView3D& b_v3d,
BL::Object& b_override, BL::Object& b_override,
int width, int height, int width, int height,
void **python_thread_state, void **python_thread_state)
const char *layer)
{ {
sync_view_layers(b_v3d, layer); BL::ViewLayer b_view_layer = b_depsgraph.view_layer();
sync_view_layer(b_v3d, b_view_layer);
sync_integrator(); sync_integrator();
sync_film(); sync_film();
sync_shaders(); sync_shaders(b_depsgraph);
sync_images(); sync_images();
sync_curve_settings(); sync_curve_settings();
@@ -212,9 +210,10 @@ void BlenderSync::sync_data(BL::RenderSettings& b_render,
scene->need_motion() == Scene::MOTION_NONE || scene->need_motion() == Scene::MOTION_NONE ||
scene->camera->motion_position == Camera::MOTION_POSITION_CENTER) scene->camera->motion_position == Camera::MOTION_POSITION_CENTER)
{ {
sync_objects(); sync_objects(b_depsgraph);
} }
sync_motion(b_render, sync_motion(b_render,
b_depsgraph,
b_override, b_override,
width, height, width, height,
python_thread_state); python_thread_state);
@@ -373,47 +372,31 @@ void BlenderSync::sync_film()
/* Render Layer */ /* Render Layer */
void BlenderSync::sync_view_layers(BL::SpaceView3D& b_v3d, const char *layer) void BlenderSync::sync_view_layer(BL::SpaceView3D& /*b_v3d*/, BL::ViewLayer& b_view_layer)
{ {
string layername;
/* 3d view */
if(b_v3d) {
layername = b_scene.view_layers.active().name();
layer = layername.c_str();
}
/* render layer */ /* render layer */
BL::Scene::view_layers_iterator b_view_layer;
bool first_layer = true;
uint layer_override = get_layer(b_engine.layer_override()); uint layer_override = get_layer(b_engine.layer_override());
uint view_layers = layer_override ? layer_override : get_layer(b_scene.layers()); uint view_layers = layer_override ? layer_override : get_layer(b_scene.layers());
for(b_scene.view_layers.begin(b_view_layer); b_view_layer != b_scene.view_layers.end(); ++b_view_layer) { view_layer.name = b_view_layer.name();
if((!layer && first_layer) || (layer && b_view_layer->name() == layer)) {
view_layer.name = b_view_layer->name();
view_layer.holdout_layer = 0; view_layer.holdout_layer = 0;
view_layer.exclude_layer = 0; view_layer.exclude_layer = 0;
view_layer.view_layer = view_layers & ~view_layer.exclude_layer; view_layer.view_layer = view_layers & ~view_layer.exclude_layer;
view_layer.view_layer |= view_layer.exclude_layer & view_layer.holdout_layer; view_layer.view_layer |= view_layer.exclude_layer & view_layer.holdout_layer;
view_layer.layer = (1 << 20) - 1; view_layer.layer = (1 << 20) - 1;
view_layer.layer |= view_layer.holdout_layer; view_layer.layer |= view_layer.holdout_layer;
view_layer.material_override = PointerRNA_NULL; view_layer.material_override = PointerRNA_NULL;
view_layer.use_background_shader = b_view_layer->use_sky(); view_layer.use_background_shader = b_view_layer.use_sky();
view_layer.use_background_ao = b_view_layer->use_ao(); view_layer.use_background_ao = b_view_layer.use_ao();
view_layer.use_surfaces = b_view_layer->use_solid(); view_layer.use_surfaces = b_view_layer.use_solid();
view_layer.use_hair = b_view_layer->use_strand(); view_layer.use_hair = b_view_layer.use_strand();
view_layer.bound_samples = false; view_layer.bound_samples = false;
view_layer.samples = 0; view_layer.samples = 0;
}
first_layer = false;
}
} }
/* Images */ /* Images */

View File

@@ -52,9 +52,7 @@ class BlenderSync {
public: public:
BlenderSync(BL::RenderEngine& b_engine, BlenderSync(BL::RenderEngine& b_engine,
BL::BlendData& b_data, BL::BlendData& b_data,
BL::Depsgraph& b_graph,
BL::Scene& b_scene, BL::Scene& b_scene,
BL::ViewLayer& b_view_layer,
Scene *scene, Scene *scene,
bool preview, bool preview,
Progress &progress); Progress &progress);
@@ -63,12 +61,12 @@ public:
/* sync */ /* sync */
bool sync_recalc(); bool sync_recalc();
void sync_data(BL::RenderSettings& b_render, void sync_data(BL::RenderSettings& b_render,
BL::Depsgraph& b_depsgraph,
BL::SpaceView3D& b_v3d, BL::SpaceView3D& b_v3d,
BL::Object& b_override, BL::Object& b_override,
int width, int height, int width, int height,
void **python_thread_state, void **python_thread_state);
const char *layer = 0); void sync_view_layer(BL::SpaceView3D& b_v3d, BL::ViewLayer& b_view_layer);
void sync_view_layers(BL::SpaceView3D& b_v3d, const char *layer);
array<Pass> sync_render_passes(BL::RenderLayer& b_render_layer, array<Pass> sync_render_passes(BL::RenderLayer& b_render_layer,
BL::ViewLayer& b_view_layer, BL::ViewLayer& b_view_layer,
const SessionParams &session_params); const SessionParams &session_params);
@@ -102,30 +100,34 @@ public:
private: private:
/* sync */ /* sync */
void sync_lamps(bool update_all); void sync_lamps(BL::Depsgraph& b_depsgraph, bool update_all);
void sync_materials(bool update_all); void sync_materials(BL::Depsgraph& b_depsgraph, bool update_all);
void sync_objects(float motion_time = 0.0f); void sync_objects(BL::Depsgraph& b_depsgraph, float motion_time = 0.0f);
void sync_motion(BL::RenderSettings& b_render, void sync_motion(BL::RenderSettings& b_render,
BL::Depsgraph& b_depsgraph,
BL::Object& b_override, BL::Object& b_override,
int width, int height, int width, int height,
void **python_thread_state); void **python_thread_state);
void sync_film(); void sync_film();
void sync_view(); void sync_view();
void sync_world(bool update_all); void sync_world(bool update_all);
void sync_shaders(); void sync_shaders(BL::Depsgraph& b_depsgraph);
void sync_curve_settings(); void sync_curve_settings();
void sync_nodes(Shader *shader, BL::ShaderNodeTree& b_ntree); void sync_nodes(Shader *shader, BL::ShaderNodeTree& b_ntree);
Mesh *sync_mesh(BL::Object& b_ob, Mesh *sync_mesh(BL::Depsgraph& b_depsgrpah,
BL::Object& b_ob,
BL::Object& b_ob_instance, BL::Object& b_ob_instance,
bool object_updated, bool object_updated,
bool hide_tris); bool hide_tris);
void sync_curves(Mesh *mesh, void sync_curves(BL::Depsgraph& b_depsgraph,
Mesh *mesh,
BL::Mesh& b_mesh, BL::Mesh& b_mesh,
BL::Object& b_ob, BL::Object& b_ob,
bool motion, bool motion,
int time_index = 0); int time_index = 0);
Object *sync_object(BL::Depsgraph::duplis_iterator& b_dupli_iter, Object *sync_object(BL::Depsgraph& b_depsgraph,
BL::Depsgraph::duplis_iterator& b_dupli_iter,
uint layer_flag, uint layer_flag,
float motion_time, float motion_time,
bool hide_tris, bool hide_tris,
@@ -139,7 +141,8 @@ private:
Transform& tfm, Transform& tfm,
bool *use_portal); bool *use_portal);
void sync_background_light(bool use_portal); void sync_background_light(bool use_portal);
void sync_mesh_motion(BL::Object& b_ob, void sync_mesh_motion(BL::Depsgraph& b_depsgraph,
BL::Object& b_ob,
Object *object, Object *object,
float motion_time); float motion_time);
void sync_camera_motion(BL::RenderSettings& b_render, void sync_camera_motion(BL::RenderSettings& b_render,
@@ -164,9 +167,7 @@ private:
/* variables */ /* variables */
BL::RenderEngine b_engine; BL::RenderEngine b_engine;
BL::BlendData b_data; BL::BlendData b_data;
BL::Depsgraph b_depsgraph;
BL::Scene b_scene; BL::Scene b_scene;
BL::ViewLayer b_view_layer;
id_map<void*, Shader> shader_map; id_map<void*, Shader> shader_map;
id_map<ObjectKey, Object> object_map; id_map<ObjectKey, Object> object_map;

View File

@@ -182,7 +182,7 @@ static void engine_render_to_image(RenderEngine *engine, Depsgraph *depsgraph)
RNA_parameter_list_free(&list); RNA_parameter_list_free(&list);
} }
static void engine_bake(RenderEngine *engine, struct Scene *scene, static void engine_bake(RenderEngine *engine, struct Depsgraph *depsgraph, struct Scene *scene,
struct Object *object, const int pass_type, const int pass_filter, struct Object *object, const int pass_type, const int pass_filter,
const int object_id, const struct BakePixel *pixel_array, const int object_id, const struct BakePixel *pixel_array,
const int num_pixels, const int depth, void *result) const int num_pixels, const int depth, void *result)
@@ -196,6 +196,7 @@ static void engine_bake(RenderEngine *engine, struct Scene *scene,
func = &rna_RenderEngine_bake_func; func = &rna_RenderEngine_bake_func;
RNA_parameter_list_create(&list, &ptr, func); RNA_parameter_list_create(&list, &ptr, func);
RNA_parameter_set_lookup(&list, "depsgraph", &depsgraph);
RNA_parameter_set_lookup(&list, "scene", &scene); RNA_parameter_set_lookup(&list, "scene", &scene);
RNA_parameter_set_lookup(&list, "object", &object); RNA_parameter_set_lookup(&list, "object", &object);
RNA_parameter_set_lookup(&list, "pass_type", &pass_type); RNA_parameter_set_lookup(&list, "pass_type", &pass_type);
@@ -501,17 +502,19 @@ static void rna_def_render_engine(BlenderRNA *brna)
RNA_def_function_ui_description(func, "Export scene data for render"); RNA_def_function_ui_description(func, "Export scene data for render");
RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE); RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
RNA_def_pointer(func, "data", "BlendData", "", ""); RNA_def_pointer(func, "data", "BlendData", "", "");
RNA_def_pointer(func, "depsgraph", "Depsgraph", "", "");
RNA_def_pointer(func, "scene", "Scene", "", ""); RNA_def_pointer(func, "scene", "Scene", "", "");
func = RNA_def_function(srna, "render_to_image", NULL); func = RNA_def_function(srna, "render_to_image", NULL);
RNA_def_function_ui_description(func, "Render scene into an image"); RNA_def_function_ui_description(func, "Render scene into an image");
RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE); RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
RNA_def_pointer(func, "depsgraph", "Depsgraph", "", ""); parm = RNA_def_pointer(func, "depsgraph", "Depsgraph", "", "");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
func = RNA_def_function(srna, "bake", NULL); func = RNA_def_function(srna, "bake", NULL);
RNA_def_function_ui_description(func, "Bake passes"); RNA_def_function_ui_description(func, "Bake passes");
RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE); RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
parm = RNA_def_pointer(func, "depsgraph", "Depsgraph", "", "");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
parm = RNA_def_pointer(func, "scene", "Scene", "", ""); parm = RNA_def_pointer(func, "scene", "Scene", "", "");
RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
parm = RNA_def_pointer(func, "object", "Object", "", ""); parm = RNA_def_pointer(func, "object", "Object", "", "");

View File

@@ -94,7 +94,8 @@ typedef struct RenderEngineType {
void (*update)(struct RenderEngine *engine, struct Main *bmain, struct Scene *scene); void (*update)(struct RenderEngine *engine, struct Main *bmain, struct Scene *scene);
void (*render_to_image)(struct RenderEngine *engine, struct Depsgraph *depsgraph); void (*render_to_image)(struct RenderEngine *engine, struct Depsgraph *depsgraph);
void (*bake)(struct RenderEngine *engine, struct Scene *scene, struct Object *object, const int pass_type, void (*bake)(struct RenderEngine *engine, struct Depsgraph *depsgraph,
struct Scene *scene, struct Object *object, const int pass_type,
const int pass_filter, const int object_id, const struct BakePixel *pixel_array, const int num_pixels, const int pass_filter, const int object_id, const struct BakePixel *pixel_array, const int num_pixels,
const int depth, void *result); const int depth, void *result);

View File

@@ -584,17 +584,32 @@ bool RE_bake_engine(
type->update(engine, re->main, re->scene); type->update(engine, re->main, re->scene);
if (type->bake) { if (type->bake) {
type->bake( EvaluationContext *eval_ctx = DEG_evaluation_context_new(DAG_EVAL_RENDER);
engine, Depsgraph *depsgraph = DEG_graph_new();
re->scene, ViewLayer *view_layer = BLI_findlink(&re->scene->view_layers, re->scene->active_view_layer);
object,
pass_type, DEG_evaluation_context_init_from_view_layer_for_render(
pass_filter, eval_ctx,
object_id, depsgraph,
pixel_array, re->scene,
num_pixels, view_layer);
depth,
result); BKE_scene_graph_update_tagged(eval_ctx, depsgraph, re->main, re->scene, view_layer);
type->bake(engine,
depsgraph,
re->scene,
object,
pass_type,
pass_filter,
object_id,
pixel_array,
num_pixels,
depth,
result);
DEG_graph_free(depsgraph);
DEG_evaluation_context_free(eval_ctx);
} }
engine->tile_x = 0; engine->tile_x = 0;