Blender  V3.3
eevee_engine.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2021 Blender Foundation.
3  */
4 
5 #include "BKE_global.h"
6 #include "BLI_rect.h"
7 
8 #include "GPU_capabilities.h"
9 #include "GPU_framebuffer.h"
10 
11 #include "ED_view3d.h"
12 
13 #include "DRW_render.h"
14 
15 #include "RE_pipeline.h"
16 
17 #include "eevee_engine.h" /* Own include. */
18 
19 #include "eevee_instance.hh"
20 
21 using namespace blender;
22 
23 struct EEVEE_Data {
30 
31  char info[GPU_INFO_SIZE];
32 };
33 
34 static void eevee_engine_init(void *vedata)
35 {
36  /* TODO(fclem): Remove once it is minimum required. */
38  return;
39  }
40 
41  EEVEE_Data *ved = reinterpret_cast<EEVEE_Data *>(vedata);
42  if (ved->instance == nullptr) {
43  ved->instance = new eevee::Instance();
44  }
45 
46  const DRWContextState *ctx_state = DRW_context_state_get();
47  Depsgraph *depsgraph = ctx_state->depsgraph;
48  Scene *scene = ctx_state->scene;
49  View3D *v3d = ctx_state->v3d;
50  const ARegion *region = ctx_state->region;
51  RegionView3D *rv3d = ctx_state->rv3d;
52 
55 
56  const DRWView *default_view = DRW_view_default_get();
57 
58  Object *camera = nullptr;
59  /* Get render borders. */
60  rcti rect;
61  BLI_rcti_init(&rect, 0, size[0], 0, size[1]);
62  if (v3d) {
63  if (rv3d && (rv3d->persp == RV3D_CAMOB)) {
64  camera = v3d->camera;
65  }
66 
67  if (v3d->flag2 & V3D_RENDER_BORDER) {
68  if (camera) {
69  rctf viewborder;
70  /* TODO(fclem) Might be better to get it from DRW. */
71  ED_view3d_calc_camera_border(scene, depsgraph, region, v3d, rv3d, &viewborder, false);
72  float viewborder_sizex = BLI_rctf_size_x(&viewborder);
73  float viewborder_sizey = BLI_rctf_size_y(&viewborder);
74  rect.xmin = floorf(viewborder.xmin + (scene->r.border.xmin * viewborder_sizex));
75  rect.ymin = floorf(viewborder.ymin + (scene->r.border.ymin * viewborder_sizey));
76  rect.xmax = floorf(viewborder.xmin + (scene->r.border.xmax * viewborder_sizex));
77  rect.ymax = floorf(viewborder.ymin + (scene->r.border.ymax * viewborder_sizey));
78  }
79  else {
80  rect.xmin = v3d->render_border.xmin * size[0];
81  rect.ymin = v3d->render_border.ymin * size[1];
82  rect.xmax = v3d->render_border.xmax * size[0];
83  rect.ymax = v3d->render_border.ymax * size[1];
84  }
85  }
86  }
87 
88  ved->instance->init(
89  size, &rect, nullptr, depsgraph, nullptr, camera, nullptr, default_view, v3d, rv3d);
90 }
91 
92 static void eevee_draw_scene(void *vedata)
93 {
94  EEVEE_Data *ved = reinterpret_cast<EEVEE_Data *>(vedata);
96  STRNCPY(ved->info, "Error: No shader storage buffer support");
97  return;
98  }
100  ved->instance->draw_viewport(dfbl);
101  STRNCPY(ved->info, ved->instance->info.c_str());
102  /* Reset view for other following engines. */
103  DRW_view_set_active(nullptr);
104 }
105 
106 static void eevee_cache_init(void *vedata)
107 {
109  return;
110  }
111  reinterpret_cast<EEVEE_Data *>(vedata)->instance->begin_sync();
112 }
113 
114 static void eevee_cache_populate(void *vedata, Object *object)
115 {
117  return;
118  }
119  reinterpret_cast<EEVEE_Data *>(vedata)->instance->object_sync(object);
120 }
121 
122 static void eevee_cache_finish(void *vedata)
123 {
125  return;
126  }
127  reinterpret_cast<EEVEE_Data *>(vedata)->instance->end_sync();
128 }
129 
130 static void eevee_engine_free()
131 {
133 }
134 
135 static void eevee_instance_free(void *instance)
136 {
138  return;
139  }
140  delete reinterpret_cast<eevee::Instance *>(instance);
141 }
142 
143 static void eevee_render_to_image(void *UNUSED(vedata),
144  struct RenderEngine *engine,
145  struct RenderLayer *layer,
146  const struct rcti *UNUSED(rect))
147 {
149  return;
150  }
151 
153 
154  Render *render = engine->re;
156  Object *camera_original_ob = RE_GetCamera(engine->re);
157  const char *viewname = RE_GetActiveRenderView(engine->re);
158  int size[2] = {engine->resolution_x, engine->resolution_y};
159 
160  rctf view_rect;
161  rcti rect;
162  RE_GetViewPlane(render, &view_rect, &rect);
163 
164  instance->init(size, &rect, engine, depsgraph, nullptr, camera_original_ob, layer);
165  instance->render_frame(layer, viewname);
166 
167  delete instance;
168 }
169 
170 static void eevee_render_update_passes(RenderEngine *engine, Scene *scene, ViewLayer *view_layer)
171 {
173  return;
174  }
175  UNUSED_VARS(engine, scene, view_layer);
176 }
177 
179 
180 extern "C" {
181 
183  nullptr,
184  nullptr,
185  N_("Eevee"),
194  nullptr,
195  nullptr,
197  nullptr,
198 };
199 
201  nullptr,
202  nullptr,
203  "BLENDER_EEVEE_NEXT",
204  N_("Eevee Next"),
206  nullptr,
208  nullptr,
209  nullptr,
210  nullptr,
211  nullptr,
212  nullptr,
213  nullptr,
216  {nullptr, nullptr, nullptr},
217 };
218 }
void BLI_rcti_init(struct rcti *rect, int xmin, int xmax, int ymin, int ymax)
Definition: rct.c:417
BLI_INLINE float BLI_rctf_size_x(const struct rctf *rct)
Definition: BLI_rect.h:194
BLI_INLINE float BLI_rctf_size_y(const struct rctf *rct)
Definition: BLI_rect.h:198
#define STRNCPY(dst, src)
Definition: BLI_string.h:483
#define UNUSED_VARS(...)
#define UNUSED(x)
struct Depsgraph Depsgraph
Definition: DEG_depsgraph.h:35
#define RV3D_CAMOB
#define V3D_RENDER_BORDER
char DRWViewportEmptyList
Definition: DRW_render.h:90
#define DRW_VIEWPORT_DATA_SIZE(ty)
Definition: DRW_render.h:96
void ED_view3d_calc_camera_border(const struct Scene *scene, struct Depsgraph *depsgraph, const struct ARegion *region, const struct View3D *v3d, const struct RegionView3D *rv3d, struct rctf *r_viewborder, bool no_shift)
bool GPU_shader_storage_buffer_objects_support(void)
int GPU_texture_height(const GPUTexture *tex)
Definition: gpu_texture.cc:607
int GPU_texture_width(const GPUTexture *tex)
Definition: gpu_texture.cc:602
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object instance
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 Sky Generate a procedural sky texture Noise Generate fractal Perlin noise Wave Generate procedural bands or rings with noise 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
#define RE_USE_STEREO_VIEWPORT
Definition: RE_engine.h:51
#define RE_INTERNAL
Definition: RE_engine.h:43
#define RE_USE_GPU_CONTEXT
Definition: RE_engine.h:52
#define RE_USE_PREVIEW
Definition: RE_engine.h:45
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition: btDbvt.cpp:52
A running instance of the engine.
void draw_viewport(DefaultFramebufferList *dfbl)
void init(const int2 &output_res, const rcti *output_rect, RenderEngine *render, Depsgraph *depsgraph, const LightProbe *light_probe_=nullptr, Object *camera_object=nullptr, const RenderLayer *render_layer=nullptr, const DRWView *drw_view=nullptr, const View3D *v3d=nullptr, const RegionView3D *rv3d=nullptr)
Scene scene
const Depsgraph * depsgraph
DefaultFramebufferList * DRW_viewport_framebuffer_list_get(void)
Definition: draw_manager.c:633
const DRWContextState * DRW_context_state_get(void)
void DRW_render_to_image(RenderEngine *engine, struct Depsgraph *depsgraph)
DefaultTextureList * DRW_viewport_texture_list_get(void)
Definition: draw_manager.c:638
const DRWView * DRW_view_default_get(void)
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_render_to_image(void *UNUSED(vedata), struct RenderEngine *engine, struct RenderLayer *layer, const struct rcti *UNUSED(rect))
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_draw_scene(void *vedata)
Definition: eevee_engine.cc:92
RenderEngineType DRW_engine_viewport_eevee_next_type
static void eevee_engine_init(void *vedata)
Definition: eevee_engine.cc:34
void RE_GetViewPlane(Render *re, rctf *r_viewplane, rcti *r_disprect)
Definition: initrender.c:210
struct Object * RE_GetCamera(Render *re)
Definition: initrender.c:150
#define floorf(x)
Definition: metal/compat.h:224
vec_base< int32_t, 2 > int2
const char * RE_GetActiveRenderView(Render *re)
Definition: pipeline.c:1671
struct Scene * scene
Definition: DRW_render.h:979
struct Depsgraph * depsgraph
Definition: DRW_render.h:987
struct View3D * v3d
Definition: DRW_render.h:976
struct ARegion * region
Definition: DRW_render.h:974
struct RegionView3D * rv3d
Definition: DRW_render.h:975
struct GPUTexture * color
DRWViewportEmptyList * fbl
Definition: eevee_engine.cc:25
DRWViewportEmptyList * txl
Definition: eevee_engine.cc:26
DrawEngineType * engine_type
Definition: eevee_engine.cc:24
DRWViewportEmptyList * psl
Definition: eevee_engine.cc:27
DRWViewportEmptyList * stl
Definition: eevee_engine.cc:28
eevee::Instance * instance
Definition: eevee_engine.cc:29
char info[GPU_INFO_SIZE]
struct Render * re
Definition: RE_engine.h:135
int resolution_x
Definition: RE_engine.h:139
int resolution_y
Definition: RE_engine.h:139
struct RenderData r
rctf render_border
struct Object * camera
float xmax
Definition: DNA_vec_types.h:69
float xmin
Definition: DNA_vec_types.h:69
float ymax
Definition: DNA_vec_types.h:70
float ymin
Definition: DNA_vec_types.h:70
int ymin
Definition: DNA_vec_types.h:64
int ymax
Definition: DNA_vec_types.h:64
int xmin
Definition: DNA_vec_types.h:63
int xmax
Definition: DNA_vec_types.h:63
#define N_(msgid)