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
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{
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);
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
@ V3D_RENDER_BORDER
@ RV3D_CAMOB
char DRWViewportEmptyList
Definition DRW_render.hh:97
#define DRW_VIEWPORT_DATA_SIZE(ty)
const rcti * ED_region_visible_rect(ARegion *region)
Definition area.cc:4014
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 for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Gabor Generate Gabor noise Gradient Generate interpolated color and intensity values based on the input vector Magic Generate a psychedelic color texture Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a or normal between camera
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
BPy_StructRNA * depsgraph
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
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)
#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
struct RenderData r
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)