33void *Instance::debug_scope_render_sample =
nullptr;
34void *Instance::debug_scope_irradiance_setup =
nullptr;
35void *Instance::debug_scope_irradiance_sample =
nullptr;
48 const rcti *output_rect,
49 const rcti *visible_rect,
51 Depsgraph *depsgraph_,
66 update_eval_members();
71 if (!shaders_are_ready_) {
78 if (output_res != film.display_extent_get()) {
84 if (offset != film.get_data().offset || extent != film.get_data().extent) {
100 film.init(output_res, output_rect);
118 shaders.precompile_specializations(
133 update_eval_members();
139 shaders.is_ready(
true);
141 sampling.init(scene);
144 rcti empty_rect{0, 0, 0, 0};
145 film.init(
int2(1), &empty_rect);
160void Instance::set_time(
float time)
164 update_eval_members();
167void Instance::update_eval_members()
176void Instance::view_update()
193 if (!shaders_are_ready_) {
200 materials.begin_sync();
203 shadows.begin_sync();
237 if (!shaders_are_ready_) {
241 const bool is_renderable_type =
ELEM(ob->
type,
256 if (!is_renderable_type || (!partsys_is_visible && !object_is_visible)) {
264 if (is_drawable_type) {
272 ob->object_to_world());
273 sync.
sync_curves(ob, hair_handle, _res_handle, ob_ref, &md, &particle_sys);
278 if (object_is_visible) {
306void Instance::object_sync_render(
void *instance_,
318 if (!shaders_are_ready_) {
340void Instance::render_sync()
371bool Instance::needs_lightprobe_sphere_passes()
const
376bool Instance::do_lightprobe_sphere_sync()
const
381bool Instance::needs_planar_probe_passes()
const
386bool Instance::do_planar_probe_sync()
const
397void Instance::render_sample()
399 if (sampling.finished_viewport()) {
410 DebugScope debug_scope(debug_scope_render_sample,
"EEVEE.render_sample");
424void Instance::render_read_result(
RenderLayer *render_layer,
const char *view_name)
430 if (pass_type == 0) {
435 for (
int64_t pass_offset : IndexRange(pass_names.size())) {
437 render_layer, pass_names[pass_offset].c_str(), view_name);
441 float *result = film.read_pass(pass_type, pass_offset);
464 float *result = film.read_aov(aov);
479 for (
const std::string &vector_pass_name :
487 sizeof(
float) * 4 * vector_rp->
rectx * vector_rp->
recty);
502 while (!sampling.finished()) {
503 if (materials.queued_shaders_count > 0) {
511 this->render_sample();
513 if ((sampling.sample_index() == 1) || ((sampling.sample_index() % 25) == 0) ||
517 std::string re_info =
"Rendering " + std::to_string(sampling.sample_index()) +
" / " +
518 std::to_string(sampling.sample_count()) +
" samples";
534 if (
G.background ==
false && first_read) {
546 this->film.cryptomatte_sort();
550 if (!info_.empty()) {
552 engine,
RPT_(
"Errors during render. See the System Console for more info."));
553 printf(
"%s", info_.c_str());
558void Instance::draw_viewport()
560 if (!shaders_are_ready_) {
571 if (this->film.is_viewport_compositor_enabled()) {
572 this->film.write_viewport_compositor_passes();
582 if (materials.queued_shaders_count > 0) {
583 info_append_i18n(
"Compiling shaders ({} remaining)", materials.queued_shaders_count);
589 "Increasing Preferences > System > Max Shader Compilation Subprocesses may improve "
590 "compilation time.");
594 else if (materials.queued_optimize_shaders_count > 0) {
595 info_append_i18n(
"Optimizing shaders ({} remaining)", materials.queued_optimize_shaders_count);
599void Instance::draw_viewport_image_render()
601 while (!sampling.finished_viewport()) {
602 this->render_sample();
606 if (this->film.is_viewport_compositor_enabled()) {
607 this->film.write_viewport_compositor_passes();
620#define CHECK_PASS_LEGACY(name, type, channels, chanid) \
621 if (view_layer->passflag & (SCE_PASS_##name)) { \
622 RE_engine_register_pass( \
623 engine, scene, view_layer, RE_PASSNAME_##name, channels, chanid, type); \
626#define CHECK_PASS_EEVEE(name, type, channels, chanid) \
627 if (view_layer->eevee.render_passes & (EEVEE_RENDER_PASS_##name)) { \
628 RE_engine_register_pass( \
629 engine, scene, view_layer, RE_PASSNAME_##name, channels, chanid, type); \
684void Instance::light_bake_irradiance(
709 custom_pipeline_wrapper([&]() {
715 sampling.init(probe);
718 DebugScope debug_scope(debug_scope_irradiance_setup,
"EEVEE.irradiance_setup");
738 sampling.init(probe);
739 while (!sampling.finished()) {
740 context_wrapper([&]() {
741 DebugScope debug_scope(debug_scope_irradiance_sample,
"EEVEE.irradiance_sample");
746 for (
int i = 0; i < 16 && !sampling.finished(); i++) {
755 if (sampling.finished()) {
763 float progress = sampling.sample_index() /
float(sampling.sample_count());
764 result_update(cache_frame, progress);
General operations, lookup, etc. for blender objects.
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE int BLI_rcti_size_y(const struct rcti *rct)
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
void BLI_mutex_lock(ThreadMutex *mutex)
void BLI_mutex_unlock(ThreadMutex *mutex)
void BLI_time_sleep_ms(int ms)
uint64_t DEG_get_update_count(const Depsgraph *depsgraph)
Scene * DEG_get_evaluated_scene(const Depsgraph *graph)
ViewLayer * DEG_get_evaluated_view_layer(const Depsgraph *graph)
Object * DEG_get_evaluated_object(const Depsgraph *depsgraph, Object *object)
ID and Library types, which are fundamental for SDNA.
eViewLayerCryptomatteFlags
@ VIEW_LAYER_CRYPTOMATTE_MATERIAL
@ VIEW_LAYER_CRYPTOMATTE_ASSET
@ VIEW_LAYER_CRYPTOMATTE_OBJECT
#define EEVEE_RENDER_PASS_MAX_BIT
@ EEVEE_RENDER_PASS_CRYPTOMATTE_MATERIAL
@ EEVEE_RENDER_PASS_CRYPTOMATTE_OBJECT
@ EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET
@ EEVEE_RENDER_PASS_VECTOR
#define RE_PASSNAME_COMBINED
@ SCE_EEVEE_SHADOW_JITTERED_VIEWPORT
void DRW_render_context_disable(Render *render)
void DRW_render_context_enable(Render *render)
bool GPU_use_parallel_compilation()
eGPUBackendType GPU_backend_get_type()
void GPU_framebuffer_clear_color_depth(GPUFrameBuffer *fb, const float clear_col[4], float clear_depth)
Contains defines and structs used throughout the imbuf module.
ResourceHandle resource_handle_for_psys(const ObjectRef &ref, const float4x4 &model_matrix)
ResourceHandle resource_handle(const ObjectRef &ref, float inflate_bounds=0.0f)
void object_sync(ObjectRef &ob_ref, Manager &manager)
void store_metadata(RenderResult *render_result)
static const Vector< std::string > pass_to_render_pass_names(eViewLayerEEVEEPassType pass_type, const ViewLayer *view_layer)
A running instance of the engine.
VolumeProbeModule volume_probes
SphereProbeModule sphere_probes
AmbientOcclusion ambient_occlusion
RayTraceModule raytracing
void info_append_i18n(const char *msg, Args &&...args)
SubsurfaceModule subsurface
Object * camera_eval_object
bool needs_lightprobe_sphere_passes() const
bool needs_planar_probe_passes() const
RenderBuffers render_buffers
const RenderLayer * render_layer
void object_sync(Object *ob)
const RegionView3D * rv3d
bool is_image_render() const
DepthOfField depth_of_field
PlanarProbeModule planar_probes
bool is_navigating() const
UniformDataModule uniform_data
LightProbeModule light_probes
MotionBlurModule motion_blur
Object * camera_orig_object
void init(const Object &probe_object)
void surfels_lights_eval()
void irradiance_capture()
LightProbeGridCacheFrame * read_result_packed()
LightProbeGridCacheFrame * read_result_unpacked()
void surfels_create(const Object &probe_object)
void sync_light(const Object *ob, ObjectHandle &handle)
void sync_probe(const Object *ob, ObjectHandle &handle)
void init(const rcti *visible_rect)
RenderBuffersInfoData & data
void sync_point_cloud(Object *ob, ObjectHandle &ob_handle, ResourceHandle res_handle, const ObjectRef &ob_ref)
ObjectHandle & sync_object(const ObjectRef &ob_ref)
void sync_mesh(Object *ob, ObjectHandle &ob_handle, ResourceHandle res_handle, const ObjectRef &ob_ref)
void sync_volume(Object *ob, ObjectHandle &ob_handle, ResourceHandle res_handle, const ObjectRef &ob_ref)
void sync_curves(Object *ob, ObjectHandle &ob_handle, ResourceHandle res_handle, const ObjectRef &ob_ref, ModifierData *modifier_data=nullptr, ParticleSystem *particle_sys=nullptr)
bool sync_sculpt(Object *ob, ObjectHandle &ob_handle, ResourceHandle res_handle, const ObjectRef &ob_ref)
void geometry_steps_fill()
bool camera_has_motion() const
const Depsgraph * depsgraph
DEGForeachIDComponentCallback callback
blender::draw::Manager * DRW_manager_get()
blender::draw::ObjectRef DRW_object_ref_get(Object *object)
DefaultFramebufferList * DRW_viewport_framebuffer_list_get()
bool DRW_object_is_renderable(const Object *ob)
void DRW_render_instance_buffer_finish()
int DRW_object_visibility_in_active_context(const Object *ob)
void DRW_render_set_time(RenderEngine *engine, Depsgraph *depsgraph, int frame, float subframe)
const DRWContextState * DRW_context_state_get()
void DRW_viewport_request_redraw()
void DRW_custom_pipeline_end()
void DRW_render_object_iter(void *vedata, RenderEngine *engine, Depsgraph *depsgraph, void(*callback)(void *vedata, Object *ob, RenderEngine *engine, Depsgraph *depsgraph))
bool DRW_state_is_playback()
void DRW_custom_pipeline_begin(DrawEngineType *draw_engine_type, Depsgraph *depsgraph)
DrawEngineType draw_engine_eevee_next_type
#define CHECK_PASS_EEVEE(name, type, channels, chanid)
#define CHECK_PASS_LEGACY(name, type, channels, chanid)
draw_view in_light_buf[] float
void RE_engine_update_stats(RenderEngine *engine, const char *stats, const char *info)
void RE_engine_set_error_message(RenderEngine *engine, const char *msg)
void RE_engine_register_pass(RenderEngine *engine, Scene *scene, ViewLayer *view_layer, const char *name, int channels, const char *chanid, eNodeSocketDatatype type)
void RE_engine_update_progress(RenderEngine *engine, float progress)
MINLINE float fractf(float a)
void hair_update(Manager &manager)
void curves_update(Manager &manager)
void foreach_hair_particle_handle(Object *ob, ObjectHandle ob_handle, HairHandleCallback callback)
bool assign_if_different(T &old_value, T new_value)
VecBase< int32_t, 2 > int2
void RE_pass_set_buffer_data(RenderPass *pass, float *data)
RenderPass * RE_pass_find_by_name(RenderLayer *rl, const char *name, const char *viewname)
GPUFrameBuffer * default_fb
ImBufFloatBuffer float_buffer