Blender V4.3
eevee_engine.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2021 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#include "BKE_global.hh"
6#include "BLI_rect.h"
7
8#include "GPU_capabilities.hh"
9#include "GPU_framebuffer.hh"
10
11#include "ED_screen.hh"
12#include "ED_view3d.hh"
13
14#include "DRW_render.hh"
15
16#include "RE_pipeline.h"
17
18#include "eevee_engine.h" /* Own include. */
19
20#include "eevee_instance.hh"
21
22using namespace blender;
23
34
35static void eevee_engine_init(void *vedata)
36{
37 EEVEE_Data *ved = reinterpret_cast<EEVEE_Data *>(vedata);
38 if (ved->instance == nullptr) {
39 ved->instance = new eevee::Instance();
40 }
41
42 const DRWContextState *ctx_state = DRW_context_state_get();
43 Depsgraph *depsgraph = ctx_state->depsgraph;
44 Scene *scene = ctx_state->scene;
45 View3D *v3d = ctx_state->v3d;
46 ARegion *region = ctx_state->region;
47 RegionView3D *rv3d = ctx_state->rv3d;
48
51
52 const DRWView *default_view = DRW_view_default_get();
53
54 Object *camera = nullptr;
55 /* Get render borders. */
56 rcti rect;
57 BLI_rcti_init(&rect, 0, size[0], 0, size[1]);
58 rcti visible_rect = rect;
59 if (v3d) {
60 if (rv3d && (rv3d->persp == RV3D_CAMOB)) {
61 camera = v3d->camera;
62 }
63
64 if (camera) {
65 rctf default_border;
66 BLI_rctf_init(&default_border, 0.0f, 1.0f, 0.0f, 1.0f);
67 bool is_default_border = BLI_rctf_compare(&scene->r.border, &default_border, 0.0f);
68 bool use_border = scene->r.mode & R_BORDER;
69 if (!is_default_border && use_border) {
70 rctf viewborder;
71 /* TODO(fclem) Might be better to get it from DRW. */
72 ED_view3d_calc_camera_border(scene, depsgraph, region, v3d, rv3d, false, &viewborder);
73 float viewborder_sizex = BLI_rctf_size_x(&viewborder);
74 float viewborder_sizey = BLI_rctf_size_y(&viewborder);
75 rect.xmin = floorf(viewborder.xmin + (scene->r.border.xmin * viewborder_sizex));
76 rect.ymin = floorf(viewborder.ymin + (scene->r.border.ymin * viewborder_sizey));
77 rect.xmax = floorf(viewborder.xmin + (scene->r.border.xmax * viewborder_sizex));
78 rect.ymax = floorf(viewborder.ymin + (scene->r.border.ymax * viewborder_sizey));
79 }
80 }
81 else if (v3d->flag2 & V3D_RENDER_BORDER) {
82 rect.xmin = v3d->render_border.xmin * size[0];
83 rect.ymin = v3d->render_border.ymin * size[1];
84 rect.xmax = v3d->render_border.xmax * size[0];
85 rect.ymax = v3d->render_border.ymax * size[1];
86 }
87
89 const float *vp_size = DRW_viewport_size_get();
90 visible_rect.xmax = vp_size[0];
91 visible_rect.ymax = vp_size[1];
92 visible_rect.xmin = visible_rect.ymin = 0;
93 }
94 else {
95 visible_rect = *ED_region_visible_rect(region);
96 }
97 }
98
99 ved->instance->init(
100 size, &rect, &visible_rect, nullptr, depsgraph, camera, nullptr, default_view, v3d, rv3d);
101}
102
103static void eevee_draw_scene(void *vedata)
104{
105 EEVEE_Data *ved = reinterpret_cast<EEVEE_Data *>(vedata);
108 }
109 else {
110 ved->instance->draw_viewport();
111 }
112 STRNCPY(ved->info, ved->instance->info_get());
113 /* Reset view for other following engines. */
114 DRW_view_set_active(nullptr);
117}
118
119static void eevee_cache_init(void *vedata)
120{
121 reinterpret_cast<EEVEE_Data *>(vedata)->instance->begin_sync();
122}
123
124static void eevee_cache_populate(void *vedata, Object *object)
125{
126 reinterpret_cast<EEVEE_Data *>(vedata)->instance->object_sync(object);
127}
128
129static void eevee_cache_finish(void *vedata)
130{
131 reinterpret_cast<EEVEE_Data *>(vedata)->instance->end_sync();
132}
133
134static void eevee_view_update(void *vedata)
135{
136 if (eevee::Instance *instance = reinterpret_cast<EEVEE_Data *>(vedata)->instance) {
137 instance->view_update();
138 }
139}
140
145
146static void eevee_instance_free(void *instance)
147{
148 delete reinterpret_cast<eevee::Instance *>(instance);
149}
150
151static void eevee_render_to_image(void *vedata,
152 RenderEngine *engine,
153 RenderLayer *layer,
154 const rcti * /*rect*/)
155{
156 eevee::Instance *instance = new eevee::Instance();
157
158 Render *render = engine->re;
160 Object *camera_original_ob = RE_GetCamera(engine->re);
161 const char *viewname = RE_GetActiveRenderView(engine->re);
162 int size[2] = {engine->resolution_x, engine->resolution_y};
163
164 rctf view_rect;
165 rcti rect;
166 RE_GetViewPlane(render, &view_rect, &rect);
167 rcti visible_rect = rect;
168
169 instance->init(size, &rect, &visible_rect, engine, depsgraph, camera_original_ob, layer);
170 instance->render_frame(engine, layer, viewname);
171
172 EEVEE_Data *ved = static_cast<EEVEE_Data *>(vedata);
173 delete ved->instance;
174 ved->instance = instance;
175}
176
177static void eevee_store_metadata(void *vedata, RenderResult *render_result)
178{
179 EEVEE_Data *ved = static_cast<EEVEE_Data *>(vedata);
180 eevee::Instance *instance = ved->instance;
181 instance->store_metadata(render_result);
182 delete instance;
183 ved->instance = nullptr;
184}
185
186static void eevee_render_update_passes(RenderEngine *engine, Scene *scene, ViewLayer *view_layer)
187{
188 eevee::Instance::update_passes(engine, scene, view_layer);
189}
190
192
193extern "C" {
194
196 /*next*/ nullptr,
197 /*prev*/ nullptr,
198 /*idname*/ N_("EEVEE"),
199 /*vedata_size*/ &eevee_data_size,
200 /*engine_init*/ &eevee_engine_init,
201 /*engine_free*/ &eevee_engine_free,
202 /*instance_free*/ &eevee_instance_free,
203 /*cache_init*/ &eevee_cache_init,
204 /*cache_populate*/ &eevee_cache_populate,
205 /*cache_finish*/ &eevee_cache_finish,
206 /*draw_scene*/ &eevee_draw_scene,
207 /*view_update*/ &eevee_view_update,
208 /*id_update*/ nullptr,
209 /*render_to_image*/ &eevee_render_to_image,
210 /*store_metadata*/ &eevee_store_metadata,
211};
212
214 /*next*/ nullptr,
215 /*prev*/ nullptr,
216 /*idname*/ "BLENDER_EEVEE_NEXT",
217 /*name*/ N_("EEVEE"),
219 /*update*/ nullptr,
220 /*render*/ &DRW_render_to_image,
221 /*render_frame_finish*/ nullptr,
222 /*draw*/ nullptr,
223 /*bake*/ nullptr,
224 /*view_update*/ nullptr,
225 /*view_draw*/ nullptr,
226 /*update_script_node*/ nullptr,
227 /*update_render_passes*/ &eevee_render_update_passes,
228 /*draw_engine*/ &draw_engine_eevee_next_type,
229 /*rna_ext*/
230 {
231 /*data*/ nullptr,
232 /*srna*/ nullptr,
233 /*call*/ nullptr,
234 },
235};
236}
void BLI_rcti_init(struct rcti *rect, int xmin, int xmax, int ymin, int ymax)
Definition rct.c:418
void BLI_rctf_init(struct rctf *rect, float xmin, float xmax, float ymin, float ymax)
Definition rct.c:408
BLI_INLINE float BLI_rctf_size_x(const struct rctf *rct)
Definition BLI_rect.h:197
BLI_INLINE float BLI_rctf_size_y(const struct rctf *rct)
Definition BLI_rect.h:201
bool BLI_rctf_compare(const struct rctf *rect_a, const struct rctf *rect_b, float limit)
#define STRNCPY(dst, src)
Definition BLI_string.h:593
@ R_BORDER
@ RV3D_CAMOB
@ V3D_RENDER_BORDER
char DRWViewportEmptyList
Definition DRW_render.hh:97
#define DRW_VIEWPORT_DATA_SIZE(ty)
const rcti * ED_region_visible_rect(ARegion *region)
Definition area.cc:4010
void ED_view3d_calc_camera_border(const Scene *scene, const Depsgraph *depsgraph, const ARegion *region, const View3D *v3d, const RegionView3D *rv3d, bool no_shift, rctf *r_viewborder)
void GPU_framebuffer_viewport_reset(GPUFrameBuffer *framebuffer)
int GPU_texture_height(const GPUTexture *texture)
int GPU_texture_width(const GPUTexture *texture)
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object instance
@ RE_INTERNAL
Definition RE_engine.h:47
@ RE_USE_PREVIEW
Definition RE_engine.h:48
@ RE_USE_STEREO_VIEWPORT
Definition RE_engine.h:53
@ RE_USE_GPU_CONTEXT
Definition RE_engine.h:54
A running instance of the engine.
void init(const int2 &output_res, const rcti *output_rect, const rcti *visible_rect, RenderEngine *render, Depsgraph *depsgraph, Object *camera_object=nullptr, const RenderLayer *render_layer=nullptr, const DRWView *drw_view=nullptr, const View3D *v3d=nullptr, const RegionView3D *rv3d=nullptr)
void store_metadata(RenderResult *render_result)
const Depsgraph * depsgraph
#define floorf(x)
bool DRW_state_is_viewport_image_render()
DefaultFramebufferList * DRW_viewport_framebuffer_list_get()
const float * DRW_viewport_size_get()
DefaultTextureList * DRW_viewport_texture_list_get()
void DRW_render_to_image(RenderEngine *engine, Depsgraph *depsgraph)
const DRWContextState * DRW_context_state_get()
const DRWView * DRW_view_default_get()
void DRW_view_set_active(const DRWView *view)
#define GPU_INFO_SIZE
static void eevee_engine_free()
static void eevee_cache_init(void *vedata)
static void eevee_view_update(void *vedata)
static const DrawEngineDataSize eevee_data_size
static void eevee_instance_free(void *instance)
static void eevee_cache_finish(void *vedata)
static void eevee_render_update_passes(RenderEngine *engine, Scene *scene, ViewLayer *view_layer)
static void eevee_cache_populate(void *vedata, Object *object)
DrawEngineType draw_engine_eevee_next_type
static void eevee_store_metadata(void *vedata, RenderResult *render_result)
static void eevee_render_to_image(void *vedata, RenderEngine *engine, RenderLayer *layer, const rcti *)
static void eevee_draw_scene(void *vedata)
RenderEngineType DRW_engine_viewport_eevee_next_type
static void eevee_engine_init(void *vedata)
void RE_GetViewPlane(Render *re, rctf *r_viewplane, rcti *r_disprect)
Object * RE_GetCamera(Render *re)
VecBase< int32_t, 2 > int2
const char * RE_GetActiveRenderView(Render *re)
Depsgraph * depsgraph
ARegion * region
RegionView3D * rv3d
GPUFrameBuffer * default_fb
DRWViewportEmptyList * fbl
DRWViewportEmptyList * txl
DrawEngineType * engine_type
char info[GPU_INFO_SIZE]
DRWViewportEmptyList * psl
DRWViewportEmptyList * stl
eevee::Instance * instance
struct Render * re
Definition RE_engine.h:141
rctf render_border
struct Object * camera
float xmax
float xmin
float ymax
float ymin
int ymin
int ymax
int xmin
int xmax
#define N_(msgid)