Cycles: Use depsgraph instead of layers
This commit is contained in:
parent
05243a633a
commit
4122eeb09a
|
@ -19,7 +19,7 @@
|
|||
bl_info = {
|
||||
"name": "Cycles Render Engine",
|
||||
"author": "",
|
||||
"blender": (2, 76, 0),
|
||||
"blender": (2, 80, 0),
|
||||
"location": "Info header, render engine menu",
|
||||
"description": "Cycles Render Engine integration",
|
||||
"warning": "",
|
||||
|
@ -66,21 +66,21 @@ class CyclesRender(bpy.types.RenderEngine):
|
|||
engine.free(self)
|
||||
|
||||
# final render
|
||||
def update(self, data, scene):
|
||||
def update(self, data, depsgraph, scene):
|
||||
if not self.session:
|
||||
if self.is_preview:
|
||||
cscene = bpy.context.scene.cycles
|
||||
use_osl = cscene.shading_system and cscene.device == 'CPU'
|
||||
|
||||
engine.create(self, data, scene,
|
||||
engine.create(self, data, depsgraph, scene,
|
||||
None, None, None, use_osl)
|
||||
else:
|
||||
engine.create(self, data, scene)
|
||||
engine.create(self, data, depsgraph, scene)
|
||||
else:
|
||||
engine.reset(self, data, scene)
|
||||
|
||||
def render(self, scene):
|
||||
engine.render(self)
|
||||
def render(self, depsgraph):
|
||||
engine.render(self, depsgraph)
|
||||
|
||||
def bake(self, 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)
|
||||
|
@ -88,12 +88,12 @@ class CyclesRender(bpy.types.RenderEngine):
|
|||
# viewport render
|
||||
def view_update(self, context):
|
||||
if not self.session:
|
||||
engine.create(self, context.blend_data, context.scene,
|
||||
engine.create(self, context.blend_data, context.depsgraph, context.scene,
|
||||
context.region, context.space_data, context.region_data)
|
||||
engine.update(self, context.blend_data, context.scene)
|
||||
|
||||
def view_draw(self, context):
|
||||
engine.draw(self, context.region, context.space_data, context.region_data)
|
||||
engine.draw(self, context.depsgraph, context.region, context.space_data, context.region_data)
|
||||
|
||||
def update_script_node(self, node):
|
||||
if engine.with_osl():
|
||||
|
|
|
@ -123,12 +123,13 @@ def exit():
|
|||
_cycles.exit()
|
||||
|
||||
|
||||
def create(engine, data, scene, region=None, v3d=None, rv3d=None, preview_osl=False):
|
||||
def create(engine, data, depsgraph, scene, region=None, v3d=None, rv3d=None, preview_osl=False):
|
||||
import bpy
|
||||
import _cycles
|
||||
|
||||
data = data.as_pointer()
|
||||
userpref = bpy.context.user_preferences.as_pointer()
|
||||
depsgraph = depsgraph.as_pointer()
|
||||
scene = scene.as_pointer()
|
||||
if region:
|
||||
region = region.as_pointer()
|
||||
|
@ -142,7 +143,8 @@ def create(engine, data, scene, region=None, v3d=None, rv3d=None, preview_osl=Fa
|
|||
else:
|
||||
_cycles.debug_flags_reset()
|
||||
|
||||
engine.session = _cycles.create(engine.as_pointer(), userpref, data, scene, region, v3d, rv3d, preview_osl)
|
||||
engine.session = _cycles.create(
|
||||
engine.as_pointer(), userpref, data, depsgraph, scene, region, v3d, rv3d, preview_osl)
|
||||
|
||||
|
||||
def free(engine):
|
||||
|
@ -153,7 +155,7 @@ def free(engine):
|
|||
del engine.session
|
||||
|
||||
|
||||
def render(engine):
|
||||
def render(engine, depsgraph):
|
||||
import _cycles
|
||||
if hasattr(engine, "session"):
|
||||
_cycles.render(engine.session)
|
||||
|
@ -178,13 +180,14 @@ def update(engine, data, scene):
|
|||
_cycles.sync(engine.session)
|
||||
|
||||
|
||||
def draw(engine, region, v3d, rv3d):
|
||||
def draw(engine, depsgraph, region, v3d, rv3d):
|
||||
import _cycles
|
||||
depsgraph = depsgraph.as_pointer()
|
||||
v3d = v3d.as_pointer()
|
||||
rv3d = rv3d.as_pointer()
|
||||
|
||||
# draw render image
|
||||
_cycles.draw(engine.session, v3d, rv3d)
|
||||
_cycles.draw(engine.session, depsgraph, v3d, rv3d)
|
||||
|
||||
|
||||
def available_devices():
|
||||
|
|
|
@ -469,19 +469,11 @@ static bool object_render_hide(BL::Object& b_ob,
|
|||
}
|
||||
}
|
||||
|
||||
static bool object_render_hide_duplis(BL::Object& b_ob)
|
||||
{
|
||||
BL::Object parent = b_ob.parent();
|
||||
|
||||
return (parent && object_render_hide_original(b_ob.type(), parent.dupli_type()));
|
||||
}
|
||||
|
||||
/* Object Loop */
|
||||
|
||||
void BlenderSync::sync_objects(BL::SpaceView3D& b_v3d, float motion_time)
|
||||
void BlenderSync::sync_objects(float motion_time)
|
||||
{
|
||||
/* layer data */
|
||||
uint scene_layer = render_layer.scene_layer;
|
||||
bool motion = motion_time != 0.0f;
|
||||
|
||||
if(!motion) {
|
||||
|
@ -500,100 +492,37 @@ void BlenderSync::sync_objects(BL::SpaceView3D& b_v3d, float motion_time)
|
|||
BlenderObjectCulling culling(scene, b_scene);
|
||||
|
||||
/* object loop */
|
||||
BL::Scene::object_bases_iterator b_base;
|
||||
BL::Scene b_sce = b_scene;
|
||||
/* modifier result type (not exposed as enum in C++ API)
|
||||
* 1 : DAG_EVAL_PREVIEW
|
||||
* 2 : DAG_EVAL_RENDER
|
||||
*/
|
||||
int dupli_settings = preview ? 1 : 2;
|
||||
|
||||
bool cancel = false;
|
||||
bool use_portal = false;
|
||||
|
||||
uint layer_override = get_layer(b_engine.layer_override());
|
||||
for(; b_sce && !cancel; b_sce = b_sce.background_set()) {
|
||||
/* Render layer's scene_layer is affected by local view already,
|
||||
* which is not a desired behavior here.
|
||||
*/
|
||||
uint scene_layers = layer_override ? layer_override : get_layer(b_scene.layers());
|
||||
for(b_sce.object_bases.begin(b_base); b_base != b_sce.object_bases.end() && !cancel; ++b_base) {
|
||||
BL::Object b_ob = b_base->object();
|
||||
bool hide = (render_layer.use_viewport_visibility)? b_ob.hide(): b_ob.hide_render();
|
||||
uint ob_layer = get_layer(b_base->layers(),
|
||||
b_base->layers_local_view(),
|
||||
object_is_light(b_ob),
|
||||
scene_layers);
|
||||
hide = hide || !(ob_layer & scene_layer);
|
||||
BL::Depsgraph::objects_iterator b_ob_iter;
|
||||
|
||||
if(!hide) {
|
||||
progress.set_sync_status("Synchronizing object", b_ob.name());
|
||||
for(b_depsgraph.objects.begin(b_ob_iter); b_ob_iter != b_depsgraph.objects.end() && !cancel; ++b_ob_iter) {
|
||||
BL::Object b_ob = *b_ob_iter;
|
||||
progress.set_sync_status("Synchronizing object", b_ob.name());
|
||||
|
||||
/* load per-object culling data */
|
||||
culling.init_object(scene, b_ob);
|
||||
/* load per-object culling data */
|
||||
culling.init_object(scene, b_ob);
|
||||
|
||||
if(b_ob.is_duplicator() && !object_render_hide_duplis(b_ob)) {
|
||||
/* dupli objects */
|
||||
b_ob.dupli_list_create(b_scene, dupli_settings);
|
||||
/* test if object needs to be hidden */
|
||||
bool hide_tris;
|
||||
|
||||
BL::Object::dupli_list_iterator b_dup;
|
||||
if(!object_render_hide(b_ob, true, true, hide_tris)) {
|
||||
/* object itself */
|
||||
Transform tfm = get_transform(b_ob.matrix_world());
|
||||
BL::DupliObject b_empty_dupli_ob(PointerRNA_NULL);
|
||||
sync_object(b_ob,
|
||||
NULL,
|
||||
b_empty_dupli_ob,
|
||||
tfm,
|
||||
~(0), /* until we get rid of layers */
|
||||
motion_time,
|
||||
hide_tris,
|
||||
culling,
|
||||
&use_portal);
|
||||
}
|
||||
|
||||
for(b_ob.dupli_list.begin(b_dup); b_dup != b_ob.dupli_list.end(); ++b_dup) {
|
||||
Transform tfm = get_transform(b_dup->matrix());
|
||||
BL::Object b_dup_ob = b_dup->object();
|
||||
bool dup_hide = (b_v3d)? b_dup_ob.hide(): b_dup_ob.hide_render();
|
||||
bool in_dupli_group = (b_dup->type() == BL::DupliObject::type_GROUP);
|
||||
bool hide_tris;
|
||||
|
||||
if(!(b_dup->hide() || dup_hide || object_render_hide(b_dup_ob, false, in_dupli_group, hide_tris))) {
|
||||
/* the persistent_id allows us to match dupli objects
|
||||
* between frames and updates */
|
||||
BL::Array<int, OBJECT_PERSISTENT_ID_SIZE> persistent_id = b_dup->persistent_id();
|
||||
|
||||
/* sync object and mesh or light data */
|
||||
Object *object = sync_object(b_ob,
|
||||
persistent_id.data,
|
||||
*b_dup,
|
||||
tfm,
|
||||
ob_layer,
|
||||
motion_time,
|
||||
hide_tris,
|
||||
culling,
|
||||
&use_portal);
|
||||
|
||||
/* sync possible particle data, note particle_id
|
||||
* starts counting at 1, first is dummy particle */
|
||||
if(!motion && object) {
|
||||
sync_dupli_particle(b_ob, *b_dup, object);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
b_ob.dupli_list_clear();
|
||||
}
|
||||
|
||||
/* test if object needs to be hidden */
|
||||
bool hide_tris;
|
||||
|
||||
if(!object_render_hide(b_ob, true, true, hide_tris)) {
|
||||
/* object itself */
|
||||
Transform tfm = get_transform(b_ob.matrix_world());
|
||||
BL::DupliObject b_empty_dupli_ob(PointerRNA_NULL);
|
||||
sync_object(b_ob,
|
||||
NULL,
|
||||
b_empty_dupli_ob,
|
||||
tfm,
|
||||
ob_layer,
|
||||
motion_time,
|
||||
hide_tris,
|
||||
culling,
|
||||
&use_portal);
|
||||
}
|
||||
}
|
||||
|
||||
cancel = progress.get_cancel();
|
||||
}
|
||||
cancel = progress.get_cancel();
|
||||
}
|
||||
|
||||
progress.set_sync_status("");
|
||||
|
@ -617,7 +546,6 @@ void BlenderSync::sync_objects(BL::SpaceView3D& b_v3d, float motion_time)
|
|||
}
|
||||
|
||||
void BlenderSync::sync_motion(BL::RenderSettings& b_render,
|
||||
BL::SpaceView3D& b_v3d,
|
||||
BL::Object& b_override,
|
||||
int width, int height,
|
||||
void **python_thread_state)
|
||||
|
@ -654,7 +582,7 @@ void BlenderSync::sync_motion(BL::RenderSettings& b_render,
|
|||
b_engine.frame_set(frame, subframe);
|
||||
python_thread_state_save(python_thread_state);
|
||||
sync_camera_motion(b_render, b_cam, width, height, 0.0f);
|
||||
sync_objects(b_v3d, 0.0f);
|
||||
sync_objects(0.0f);
|
||||
}
|
||||
|
||||
/* always sample these times for camera motion */
|
||||
|
@ -688,7 +616,7 @@ void BlenderSync::sync_motion(BL::RenderSettings& b_render,
|
|||
}
|
||||
|
||||
/* sync object */
|
||||
sync_objects(b_v3d, relative_time);
|
||||
sync_objects(relative_time);
|
||||
}
|
||||
|
||||
/* we need to set the python thread state again because this
|
||||
|
|
|
@ -199,10 +199,10 @@ static PyObject *exit_func(PyObject * /*self*/, PyObject * /*args*/)
|
|||
|
||||
static PyObject *create_func(PyObject * /*self*/, PyObject *args)
|
||||
{
|
||||
PyObject *pyengine, *pyuserpref, *pydata, *pyscene, *pyregion, *pyv3d, *pyrv3d;
|
||||
PyObject *pyengine, *pyuserpref, *pydata, *pygraph, *pyscene, *pyregion, *pyv3d, *pyrv3d;
|
||||
int preview_osl;
|
||||
|
||||
if(!PyArg_ParseTuple(args, "OOOOOOOi", &pyengine, &pyuserpref, &pydata, &pyscene,
|
||||
if(!PyArg_ParseTuple(args, "OOOOOOOOi", &pyengine, &pyuserpref, &pydata, &pygraph, &pyscene,
|
||||
&pyregion, &pyv3d, &pyrv3d, &preview_osl))
|
||||
{
|
||||
return NULL;
|
||||
|
@ -221,6 +221,10 @@ static PyObject *create_func(PyObject * /*self*/, PyObject *args)
|
|||
RNA_main_pointer_create((Main*)PyLong_AsVoidPtr(pydata), &dataptr);
|
||||
BL::BlendData data(dataptr);
|
||||
|
||||
PointerRNA graphptr;
|
||||
RNA_id_pointer_create((ID*)PyLong_AsVoidPtr(pygraph), &graphptr);
|
||||
BL::Depsgraph graph(graphptr);
|
||||
|
||||
PointerRNA sceneptr;
|
||||
RNA_id_pointer_create((ID*)PyLong_AsVoidPtr(pyscene), &sceneptr);
|
||||
BL::Scene scene(sceneptr);
|
||||
|
@ -245,7 +249,7 @@ static PyObject *create_func(PyObject * /*self*/, PyObject *args)
|
|||
int width = region.width();
|
||||
int height = region.height();
|
||||
|
||||
session = new BlenderSession(engine, userpref, data, scene, v3d, rv3d, width, height);
|
||||
session = new BlenderSession(engine, userpref, data, graph, scene, v3d, rv3d, width, height);
|
||||
}
|
||||
else {
|
||||
/* override some settings for preview */
|
||||
|
@ -257,7 +261,7 @@ static PyObject *create_func(PyObject * /*self*/, PyObject *args)
|
|||
}
|
||||
|
||||
/* offline session or preview render */
|
||||
session = new BlenderSession(engine, userpref, data, scene);
|
||||
session = new BlenderSession(engine, userpref, data, graph, scene);
|
||||
}
|
||||
|
||||
python_thread_state_save(&session->python_thread_state);
|
||||
|
@ -323,9 +327,9 @@ static PyObject *bake_func(PyObject * /*self*/, PyObject *args)
|
|||
|
||||
static PyObject *draw_func(PyObject * /*self*/, PyObject *args)
|
||||
{
|
||||
PyObject *pysession, *pyv3d, *pyrv3d;
|
||||
PyObject *pysession, *pygraph, *pyv3d, *pyrv3d;
|
||||
|
||||
if(!PyArg_ParseTuple(args, "OOO", &pysession, &pyv3d, &pyrv3d))
|
||||
if(!PyArg_ParseTuple(args, "OOOO", &pysession, &pygraph, &pyv3d, &pyrv3d))
|
||||
return NULL;
|
||||
|
||||
BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(pysession);
|
||||
|
|
|
@ -52,11 +52,13 @@ int BlenderSession::end_resumable_chunk = 0;
|
|||
BlenderSession::BlenderSession(BL::RenderEngine& b_engine,
|
||||
BL::UserPreferences& b_userpref,
|
||||
BL::BlendData& b_data,
|
||||
BL::Depsgraph& b_depsgraph,
|
||||
BL::Scene& b_scene)
|
||||
: b_engine(b_engine),
|
||||
b_userpref(b_userpref),
|
||||
b_data(b_data),
|
||||
b_render(b_engine.render()),
|
||||
b_depsgraph(b_depsgraph),
|
||||
b_scene(b_scene),
|
||||
b_v3d(PointerRNA_NULL),
|
||||
b_rv3d(PointerRNA_NULL),
|
||||
|
@ -76,6 +78,7 @@ BlenderSession::BlenderSession(BL::RenderEngine& b_engine,
|
|||
BlenderSession::BlenderSession(BL::RenderEngine& b_engine,
|
||||
BL::UserPreferences& b_userpref,
|
||||
BL::BlendData& b_data,
|
||||
BL::Depsgraph& b_depsgraph,
|
||||
BL::Scene& b_scene,
|
||||
BL::SpaceView3D& b_v3d,
|
||||
BL::RegionView3D& b_rv3d,
|
||||
|
@ -84,6 +87,7 @@ BlenderSession::BlenderSession(BL::RenderEngine& b_engine,
|
|||
b_userpref(b_userpref),
|
||||
b_data(b_data),
|
||||
b_render(b_scene.render()),
|
||||
b_depsgraph(b_depsgraph),
|
||||
b_scene(b_scene),
|
||||
b_v3d(b_v3d),
|
||||
b_rv3d(b_rv3d),
|
||||
|
@ -141,7 +145,7 @@ void BlenderSession::create_session()
|
|||
session->set_pause(session_pause);
|
||||
|
||||
/* create sync */
|
||||
sync = new BlenderSync(b_engine, b_data, b_scene, scene, !background, session->progress, is_cpu);
|
||||
sync = new BlenderSync(b_engine, b_data, b_depsgraph, b_scene, scene, !background, session->progress, is_cpu);
|
||||
BL::Object b_camera_override(b_engine.camera_override());
|
||||
if(b_v3d) {
|
||||
if(session_pause == false) {
|
||||
|
@ -211,7 +215,7 @@ void BlenderSession::reset_session(BL::BlendData& b_data_, BL::Scene& b_scene_)
|
|||
session->stats.mem_peak = session->stats.mem_used;
|
||||
|
||||
/* sync object should be re-created */
|
||||
sync = new BlenderSync(b_engine, b_data, b_scene, scene, !background, session->progress, is_cpu);
|
||||
sync = new BlenderSync(b_engine, b_data, b_depsgraph, b_scene, scene, !background, session->progress, is_cpu);
|
||||
|
||||
/* for final render we will do full data sync per render layer, only
|
||||
* do some basic syncing here, no objects or materials for speed */
|
||||
|
|
|
@ -36,11 +36,13 @@ public:
|
|||
BlenderSession(BL::RenderEngine& b_engine,
|
||||
BL::UserPreferences& b_userpref,
|
||||
BL::BlendData& b_data,
|
||||
BL::Depsgraph& b_depsgraph,
|
||||
BL::Scene& b_scene);
|
||||
|
||||
BlenderSession(BL::RenderEngine& b_engine,
|
||||
BL::UserPreferences& b_userpref,
|
||||
BL::BlendData& b_data,
|
||||
BL::Depsgraph& b_depsgraph,
|
||||
BL::Scene& b_scene,
|
||||
BL::SpaceView3D& b_v3d,
|
||||
BL::RegionView3D& b_rv3d,
|
||||
|
@ -104,6 +106,7 @@ public:
|
|||
BL::UserPreferences b_userpref;
|
||||
BL::BlendData b_data;
|
||||
BL::RenderSettings b_render;
|
||||
BL::Depsgraph b_depsgraph;
|
||||
BL::Scene b_scene;
|
||||
BL::SpaceView3D b_v3d;
|
||||
BL::RegionView3D b_rv3d;
|
||||
|
|
|
@ -44,6 +44,7 @@ CCL_NAMESPACE_BEGIN
|
|||
|
||||
BlenderSync::BlenderSync(BL::RenderEngine& b_engine,
|
||||
BL::BlendData& b_data,
|
||||
BL::Depsgraph& b_depsgraph,
|
||||
BL::Scene& b_scene,
|
||||
Scene *scene,
|
||||
bool preview,
|
||||
|
@ -51,6 +52,7 @@ BlenderSync::BlenderSync(BL::RenderEngine& b_engine,
|
|||
bool is_cpu)
|
||||
: b_engine(b_engine),
|
||||
b_data(b_data),
|
||||
b_depsgraph(b_depsgraph),
|
||||
b_scene(b_scene),
|
||||
shader_map(&scene->shaders),
|
||||
object_map(&scene->objects),
|
||||
|
@ -210,10 +212,9 @@ void BlenderSync::sync_data(BL::RenderSettings& b_render,
|
|||
scene->need_motion() == Scene::MOTION_NONE ||
|
||||
scene->camera->motion_position == Camera::MOTION_POSITION_CENTER)
|
||||
{
|
||||
sync_objects(b_v3d);
|
||||
sync_objects();
|
||||
}
|
||||
sync_motion(b_render,
|
||||
b_v3d,
|
||||
b_override,
|
||||
width, height,
|
||||
python_thread_state);
|
||||
|
|
|
@ -51,6 +51,7 @@ class BlenderSync {
|
|||
public:
|
||||
BlenderSync(BL::RenderEngine& b_engine,
|
||||
BL::BlendData& b_data,
|
||||
BL::Depsgraph& b_graph,
|
||||
BL::Scene& b_scene,
|
||||
Scene *scene,
|
||||
bool preview,
|
||||
|
@ -97,9 +98,8 @@ private:
|
|||
/* sync */
|
||||
void sync_lamps(bool update_all);
|
||||
void sync_materials(bool update_all);
|
||||
void sync_objects(BL::SpaceView3D& b_v3d, float motion_time = 0.0f);
|
||||
void sync_objects(float motion_time = 0.0f);
|
||||
void sync_motion(BL::RenderSettings& b_render,
|
||||
BL::SpaceView3D& b_v3d,
|
||||
BL::Object& b_override,
|
||||
int width, int height,
|
||||
void **python_thread_state);
|
||||
|
@ -156,6 +156,7 @@ private:
|
|||
/* variables */
|
||||
BL::RenderEngine b_engine;
|
||||
BL::BlendData b_data;
|
||||
BL::Depsgraph b_depsgraph;
|
||||
BL::Scene b_scene;
|
||||
|
||||
id_map<void*, Shader> shader_map;
|
||||
|
|
|
@ -24,6 +24,7 @@ set(INC
|
|||
../../blenlib
|
||||
../../blentranslation
|
||||
../../bmesh
|
||||
../../depsgraph
|
||||
../../gpu
|
||||
../../ikplugin
|
||||
../../imbuf
|
||||
|
|
|
@ -58,6 +58,8 @@
|
|||
#include "BKE_screen.h"
|
||||
#include "BKE_depsgraph.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
|
||||
#include "RE_engine.h"
|
||||
#include "RE_pipeline.h"
|
||||
|
||||
|
@ -82,6 +84,7 @@ static void bake_set_props(wmOperator *op, Scene *scene);
|
|||
typedef struct BakeAPIRender {
|
||||
Object *ob;
|
||||
Main *main;
|
||||
Depsgraph *depsgraph;
|
||||
Scene *scene;
|
||||
ReportList *reports;
|
||||
ListBase selected_objects;
|
||||
|
@ -630,7 +633,7 @@ static Mesh *bake_mesh_new_from_object(Main *bmain, Scene *scene, Object *ob)
|
|||
}
|
||||
|
||||
static int bake(
|
||||
Render *re, Main *bmain, Scene *scene, Object *ob_low, ListBase *selected_objects, ReportList *reports,
|
||||
Render *re, Main *bmain, Depsgraph *graph, Scene *scene, Object *ob_low, ListBase *selected_objects, ReportList *reports,
|
||||
const ScenePassType pass_type, const int pass_filter, const int margin,
|
||||
const BakeSaveMode save_mode, const bool is_clear, const bool is_split_materials,
|
||||
const bool is_automatic_name, const bool is_selected_to_active, const bool is_cage,
|
||||
|
@ -669,7 +672,7 @@ static int bake(
|
|||
size_t num_pixels;
|
||||
int tot_materials;
|
||||
|
||||
RE_bake_engine_set_engine_parameters(re, bmain, scene);
|
||||
RE_bake_engine_set_engine_parameters(re, bmain, graph, scene);
|
||||
|
||||
if (!RE_bake_has_engine(re)) {
|
||||
BKE_report(reports, RPT_ERROR, "Current render engine does not support baking");
|
||||
|
@ -1117,6 +1120,7 @@ static void bake_init_api_data(wmOperator *op, bContext *C, BakeAPIRender *bkr)
|
|||
|
||||
bkr->ob = CTX_data_active_object(C);
|
||||
bkr->main = CTX_data_main(C);
|
||||
bkr->depsgraph = CTX_data_depsgraph(C);
|
||||
bkr->scene = CTX_data_scene(C);
|
||||
bkr->sa = sc ? BKE_screen_find_big_area(sc, SPACE_IMAGE, 10) : NULL;
|
||||
|
||||
|
@ -1197,7 +1201,7 @@ static int bake_exec(bContext *C, wmOperator *op)
|
|||
|
||||
if (bkr.is_selected_to_active) {
|
||||
result = bake(
|
||||
bkr.render, bkr.main, bkr.scene, bkr.ob, &bkr.selected_objects, bkr.reports,
|
||||
bkr.render, bkr.main, bkr.depsgraph, bkr.scene, bkr.ob, &bkr.selected_objects, bkr.reports,
|
||||
bkr.pass_type, bkr.pass_filter, bkr.margin, bkr.save_mode,
|
||||
bkr.is_clear, bkr.is_split_materials, bkr.is_automatic_name, true, bkr.is_cage,
|
||||
bkr.cage_extrusion, bkr.normal_space, bkr.normal_swizzle,
|
||||
|
@ -1210,7 +1214,7 @@ static int bake_exec(bContext *C, wmOperator *op)
|
|||
for (link = bkr.selected_objects.first; link; link = link->next) {
|
||||
Object *ob_iter = link->ptr.data;
|
||||
result = bake(
|
||||
bkr.render, bkr.main, bkr.scene, ob_iter, NULL, bkr.reports,
|
||||
bkr.render, bkr.main, bkr.depsgraph, bkr.scene, ob_iter, NULL, bkr.reports,
|
||||
bkr.pass_type, bkr.pass_filter, bkr.margin, bkr.save_mode,
|
||||
is_clear, bkr.is_split_materials, bkr.is_automatic_name, false, bkr.is_cage,
|
||||
bkr.cage_extrusion, bkr.normal_space, bkr.normal_swizzle,
|
||||
|
@ -1254,7 +1258,7 @@ static void bake_startjob(void *bkv, short *UNUSED(stop), short *do_update, floa
|
|||
|
||||
if (bkr->is_selected_to_active) {
|
||||
bkr->result = bake(
|
||||
bkr->render, bkr->main, bkr->scene, bkr->ob, &bkr->selected_objects, bkr->reports,
|
||||
bkr->render, bkr->main, bkr->depsgraph, bkr->scene, bkr->ob, &bkr->selected_objects, bkr->reports,
|
||||
bkr->pass_type, bkr->pass_filter, bkr->margin, bkr->save_mode,
|
||||
bkr->is_clear, bkr->is_split_materials, bkr->is_automatic_name, true, bkr->is_cage,
|
||||
bkr->cage_extrusion, bkr->normal_space, bkr->normal_swizzle,
|
||||
|
@ -1267,7 +1271,7 @@ static void bake_startjob(void *bkv, short *UNUSED(stop), short *do_update, floa
|
|||
for (link = bkr->selected_objects.first; link; link = link->next) {
|
||||
Object *ob_iter = link->ptr.data;
|
||||
bkr->result = bake(
|
||||
bkr->render, bkr->main, bkr->scene, ob_iter, NULL, bkr->reports,
|
||||
bkr->render, bkr->main, bkr->depsgraph, bkr->scene, ob_iter, NULL, bkr->reports,
|
||||
bkr->pass_type, bkr->pass_filter, bkr->margin, bkr->save_mode,
|
||||
is_clear, bkr->is_split_materials, bkr->is_automatic_name, false, bkr->is_cage,
|
||||
bkr->cage_extrusion, bkr->normal_space, bkr->normal_swizzle,
|
||||
|
|
|
@ -24,6 +24,7 @@ set(INC
|
|||
../../blenlib
|
||||
../../blenloader
|
||||
../../blentranslation
|
||||
../../depsgraph
|
||||
../../gpu
|
||||
../../imbuf
|
||||
../../bmesh
|
||||
|
|
|
@ -967,6 +967,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, const wmEvent *even
|
|||
RE_current_scene_update_cb(re, rj, current_scene_update);
|
||||
RE_stats_draw_cb(re, rj, image_renderinfo_cb);
|
||||
RE_progress_cb(re, rj, render_progress_update);
|
||||
RE_SetDepsgraph(re, CTX_data_depsgraph(C));
|
||||
|
||||
rj->re = re;
|
||||
G.is_break = false;
|
||||
|
|
|
@ -79,6 +79,8 @@
|
|||
#include "BKE_texture.h"
|
||||
#include "BKE_world.h"
|
||||
|
||||
#include "DEG_depsgraph_build.h"
|
||||
|
||||
#include "IMB_imbuf.h"
|
||||
#include "IMB_imbuf_types.h"
|
||||
#include "IMB_thumbs.h"
|
||||
|
@ -278,7 +280,7 @@ static Scene *preview_get_scene(Main *pr_main)
|
|||
static Scene *preview_prepare_scene(Main *bmain, Scene *scene, ID *id, int id_type, ShaderPreview *sp)
|
||||
{
|
||||
Scene *sce;
|
||||
BaseLegacy *base;
|
||||
Base *base;
|
||||
Main *pr_main = sp->pr_main;
|
||||
|
||||
memcpy(pr_main->name, bmain->name, sizeof(pr_main->name));
|
||||
|
@ -534,6 +536,7 @@ static Scene *preview_prepare_scene(Main *bmain, Scene *scene, ID *id, int id_ty
|
|||
}
|
||||
}
|
||||
|
||||
DEG_scene_relations_rebuild(pr_main, sce);
|
||||
return sce;
|
||||
}
|
||||
|
||||
|
|
|
@ -32,6 +32,8 @@
|
|||
#include "BLI_utildefines.h"
|
||||
#include "BLI_path_util.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
|
||||
#include "RNA_define.h"
|
||||
#include "RNA_enum_types.h"
|
||||
|
||||
|
@ -146,7 +148,7 @@ static void engine_unbind_display_space_shader(RenderEngine *UNUSED(engine))
|
|||
IMB_colormanagement_finish_glsl_draw();
|
||||
}
|
||||
|
||||
static void engine_update(RenderEngine *engine, Main *bmain, Scene *scene)
|
||||
static void engine_update(RenderEngine *engine, Main *bmain, Depsgraph *graph, Scene *scene)
|
||||
{
|
||||
extern FunctionRNA rna_RenderEngine_update_func;
|
||||
PointerRNA ptr;
|
||||
|
@ -158,13 +160,14 @@ static void engine_update(RenderEngine *engine, Main *bmain, Scene *scene)
|
|||
|
||||
RNA_parameter_list_create(&list, &ptr, func);
|
||||
RNA_parameter_set_lookup(&list, "data", &bmain);
|
||||
RNA_parameter_set_lookup(&list, "depsgraph", &graph);
|
||||
RNA_parameter_set_lookup(&list, "scene", &scene);
|
||||
engine->type->ext.call(NULL, &ptr, func, &list);
|
||||
|
||||
RNA_parameter_list_free(&list);
|
||||
}
|
||||
|
||||
static void engine_render(RenderEngine *engine, struct Scene *scene)
|
||||
static void engine_render(RenderEngine *engine, struct Depsgraph *depsgraph)
|
||||
{
|
||||
extern FunctionRNA rna_RenderEngine_render_func;
|
||||
PointerRNA ptr;
|
||||
|
@ -175,7 +178,7 @@ static void engine_render(RenderEngine *engine, struct Scene *scene)
|
|||
func = &rna_RenderEngine_render_func;
|
||||
|
||||
RNA_parameter_list_create(&list, &ptr, func);
|
||||
RNA_parameter_set_lookup(&list, "scene", &scene);
|
||||
RNA_parameter_set_lookup(&list, "depsgraph", &depsgraph);
|
||||
engine->type->ext.call(NULL, &ptr, func, &list);
|
||||
|
||||
RNA_parameter_list_free(&list);
|
||||
|
@ -459,12 +462,13 @@ static void rna_def_render_engine(BlenderRNA *brna)
|
|||
RNA_def_function_ui_description(func, "Export scene data for render");
|
||||
RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
|
||||
RNA_def_pointer(func, "data", "BlendData", "", "");
|
||||
RNA_def_pointer(func, "depsgraph", "Depsgraph", "", "");
|
||||
RNA_def_pointer(func, "scene", "Scene", "", "");
|
||||
|
||||
func = RNA_def_function(srna, "render", NULL);
|
||||
RNA_def_function_ui_description(func, "Render scene into an image");
|
||||
RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE);
|
||||
RNA_def_pointer(func, "scene", "Scene", "", "");
|
||||
RNA_def_pointer(func, "desgraph", "Depsgraph", "", "");
|
||||
|
||||
func = RNA_def_function(srna, "bake", NULL);
|
||||
RNA_def_function_ui_description(func, "Bake passes");
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
|
||||
struct bNode;
|
||||
struct bNodeTree;
|
||||
struct Depsgraph;
|
||||
struct IDProperty;
|
||||
struct Main;
|
||||
struct Object;
|
||||
|
@ -91,9 +92,11 @@ typedef struct RenderEngineType {
|
|||
char name[64];
|
||||
int flag;
|
||||
|
||||
void (*update)(struct RenderEngine *engine, struct Main *bmain, struct Scene *scene);
|
||||
void (*render)(struct RenderEngine *engine, struct Scene *scene);
|
||||
void (*bake)(struct RenderEngine *engine, 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 depth, void *result);
|
||||
void (*update)(struct RenderEngine *engine, struct Main *bmain, struct Depsgraph *depsgraph, struct Scene *scene);
|
||||
void (*render)(struct RenderEngine *engine, struct Depsgraph *depsgraph);
|
||||
void (*bake)(struct RenderEngine *engine, 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 depth, void *result);
|
||||
|
||||
void (*view_update)(struct RenderEngine *engine, const struct bContext *context);
|
||||
void (*view_draw)(struct RenderEngine *engine, const struct bContext *context);
|
||||
|
@ -177,7 +180,8 @@ RenderEngineType *RE_engines_find(const char *idname);
|
|||
|
||||
rcti* RE_engine_get_current_tiles(struct Render *re, int *r_total_tiles, bool *r_needs_free);
|
||||
struct RenderData *RE_engine_get_render_data(struct Render *re);
|
||||
void RE_bake_engine_set_engine_parameters(struct Render *re, struct Main *bmain, struct Scene *scene);
|
||||
void RE_bake_engine_set_engine_parameters(
|
||||
struct Render *re, struct Main *bmain, struct Depsgraph *graph, struct Scene *scene);
|
||||
|
||||
#endif /* __RE_ENGINE_H__ */
|
||||
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
|
||||
struct bMovieHandle;
|
||||
struct bNodeTree;
|
||||
struct Depsgraph;
|
||||
struct Image;
|
||||
struct ImageFormatData;
|
||||
struct Main;
|
||||
|
@ -252,6 +253,7 @@ void RE_ChangeModeFlag(struct Render *re, int flag, bool clear);
|
|||
struct Object *RE_GetCamera(struct Render *re); /* return camera override if set */
|
||||
void RE_SetOverrideCamera(struct Render *re, struct Object *camera);
|
||||
void RE_SetCamera(struct Render *re, struct Object *camera);
|
||||
void RE_SetDepsgraph(struct Render *re, struct Depsgraph *graph);
|
||||
void RE_SetEnvmapCamera(struct Render *re, struct Object *cam_ob, float viewscale, float clipsta, float clipend);
|
||||
void RE_SetWindow(struct Render *re, const rctf *viewplane, float clipsta, float clipend);
|
||||
void RE_SetOrtho(struct Render *re, const rctf *viewplane, float clipsta, float clipend);
|
||||
|
|
|
@ -185,6 +185,8 @@ struct Render {
|
|||
/* shadow counter, detect shadow-reuse for shaders */
|
||||
int shadowsamplenr[BLENDER_MAX_THREADS];
|
||||
|
||||
struct Depsgraph *depsgraph;
|
||||
|
||||
/* main, scene, and its full copy of renderdata and world */
|
||||
struct Main *main;
|
||||
Scene *scene;
|
||||
|
|
|
@ -49,6 +49,8 @@
|
|||
#include "BKE_report.h"
|
||||
#include "BKE_scene.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
|
||||
#include "RNA_access.h"
|
||||
|
||||
#ifdef WITH_PYTHON
|
||||
|
@ -494,8 +496,9 @@ RenderData *RE_engine_get_render_data(Render *re)
|
|||
}
|
||||
|
||||
/* Bake */
|
||||
void RE_bake_engine_set_engine_parameters(Render *re, Main *bmain, Scene *scene)
|
||||
void RE_bake_engine_set_engine_parameters(Render *re, Main *bmain, Depsgraph *graph, Scene *scene)
|
||||
{
|
||||
re->depsgraph = graph;
|
||||
re->scene = scene;
|
||||
re->main = bmain;
|
||||
render_copy_renderdata(&re->r, &scene->r);
|
||||
|
@ -545,7 +548,7 @@ bool RE_bake_engine(
|
|||
|
||||
/* update is only called so we create the engine.session */
|
||||
if (type->update)
|
||||
type->update(engine, re->main, re->scene);
|
||||
type->update(engine, re->main, re->depsgraph, re->scene);
|
||||
|
||||
if (type->bake) {
|
||||
type->bake(
|
||||
|
@ -696,16 +699,18 @@ int RE_engine_render(Render *re, int do_all)
|
|||
if (re->result->do_exr_tile)
|
||||
render_result_exr_file_begin(re);
|
||||
|
||||
if (type->update)
|
||||
type->update(engine, re->main, re->scene);
|
||||
if (type->update) {
|
||||
type->update(engine, re->main, re->depsgraph, re->scene);
|
||||
}
|
||||
|
||||
/* Clear UI drawing locks. */
|
||||
if (re->draw_lock) {
|
||||
re->draw_lock(re->dlh, 0);
|
||||
}
|
||||
|
||||
if (type->render)
|
||||
type->render(engine, re->scene);
|
||||
if (type->render) {
|
||||
type->render(engine, re->depsgraph);
|
||||
}
|
||||
|
||||
engine->tile_x = 0;
|
||||
engine->tile_y = 0;
|
||||
|
|
|
@ -48,6 +48,8 @@
|
|||
|
||||
#include "BKE_camera.h"
|
||||
|
||||
#include "DEG_depsgraph.h"
|
||||
|
||||
#ifdef WITH_QUICKTIME
|
||||
#include "quicktime_export.h"
|
||||
#endif
|
||||
|
@ -503,6 +505,11 @@ void RE_SetCamera(Render *re, Object *cam_ob)
|
|||
re_camera_params_get(re, ¶ms, cam_ob);
|
||||
}
|
||||
|
||||
void RE_SetDepsgraph(Render *re, Depsgraph *graph)
|
||||
{
|
||||
re->depsgraph = graph;
|
||||
}
|
||||
|
||||
void RE_SetPixelSize(Render *re, float pixsize)
|
||||
{
|
||||
re->viewdx = pixsize;
|
||||
|
|
|
@ -551,6 +551,7 @@ void RE_FreeRender(Render *re)
|
|||
/* main dbase can already be invalid now, some database-free code checks it */
|
||||
re->main = NULL;
|
||||
re->scene = NULL;
|
||||
re->depsgraph = NULL;
|
||||
|
||||
RE_Database_Free(re); /* view render can still have full database */
|
||||
free_sample_tables(re);
|
||||
|
@ -1933,6 +1934,7 @@ static void render_scene(Render *re, Scene *sce, int cfra)
|
|||
|
||||
/* still unsure entity this... */
|
||||
resc->main = re->main;
|
||||
resc->depsgraph = re->depsgraph;
|
||||
resc->scene = sce;
|
||||
resc->lay = sce->lay;
|
||||
resc->scene_color_manage = BKE_scene_check_color_management_enabled(sce);
|
||||
|
@ -3804,6 +3806,7 @@ void RE_PreviewRender(Render *re, Main *bmain, Scene *sce)
|
|||
re->scene = sce;
|
||||
re->scene_color_manage = BKE_scene_check_color_management_enabled(sce);
|
||||
re->lay = sce->lay;
|
||||
re->depsgraph = sce->depsgraph;
|
||||
|
||||
camera = RE_GetCamera(re);
|
||||
RE_SetCamera(re, camera);
|
||||
|
|
Loading…
Reference in New Issue