Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/draw/engines/eevee_next/eevee_engine.cc')
-rw-r--r--source/blender/draw/engines/eevee_next/eevee_engine.cc67
1 files changed, 60 insertions, 7 deletions
diff --git a/source/blender/draw/engines/eevee_next/eevee_engine.cc b/source/blender/draw/engines/eevee_next/eevee_engine.cc
index 390ab1f3e50..79c0af5bb8b 100644
--- a/source/blender/draw/engines/eevee_next/eevee_engine.cc
+++ b/source/blender/draw/engines/eevee_next/eevee_engine.cc
@@ -11,38 +11,91 @@
#include "DRW_render.h"
+#include "eevee_instance.hh"
+
+using namespace blender;
+
struct EEVEE_Data {
DrawEngineType *engine_type;
DRWViewportEmptyList *fbl;
DRWViewportEmptyList *txl;
DRWViewportEmptyList *psl;
DRWViewportEmptyList *stl;
- void *instance;
+ eevee::Instance *instance;
};
static void eevee_engine_init(void *vedata)
{
- UNUSED_VARS(vedata);
+ EEVEE_Data *ved = reinterpret_cast<EEVEE_Data *>(vedata);
+ if (ved->instance == nullptr) {
+ ved->instance = new eevee::Instance();
+ }
+
+ const DRWContextState *ctx_state = DRW_context_state_get();
+ Depsgraph *depsgraph = ctx_state->depsgraph;
+ Scene *scene = ctx_state->scene;
+ View3D *v3d = ctx_state->v3d;
+ const ARegion *region = ctx_state->region;
+ RegionView3D *rv3d = ctx_state->rv3d;
+
+ DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+ int2 size = int2(GPU_texture_width(dtxl->color), GPU_texture_height(dtxl->color));
+
+ const DRWView *default_view = DRW_view_default_get();
+
+ Object *camera = nullptr;
+ /* Get render borders. */
+ rcti rect;
+ BLI_rcti_init(&rect, 0, size[0], 0, size[1]);
+ if (v3d) {
+ if (rv3d && (rv3d->persp == RV3D_CAMOB)) {
+ camera = v3d->camera;
+ }
+
+ if (v3d->flag2 & V3D_RENDER_BORDER) {
+ if (camera) {
+ rctf viewborder;
+ /* TODO(fclem) Might be better to get it from DRW. */
+ ED_view3d_calc_camera_border(scene, depsgraph, region, v3d, rv3d, &viewborder, false);
+ float viewborder_sizex = BLI_rctf_size_x(&viewborder);
+ float viewborder_sizey = BLI_rctf_size_y(&viewborder);
+ rect.xmin = floorf(viewborder.xmin + (scene->r.border.xmin * viewborder_sizex));
+ rect.ymin = floorf(viewborder.ymin + (scene->r.border.ymin * viewborder_sizey));
+ rect.xmax = floorf(viewborder.xmin + (scene->r.border.xmax * viewborder_sizex));
+ rect.ymax = floorf(viewborder.ymin + (scene->r.border.ymax * viewborder_sizey));
+ }
+ else {
+ rect.xmin = v3d->render_border.xmin * size[0];
+ rect.ymin = v3d->render_border.ymin * size[1];
+ rect.xmax = v3d->render_border.xmax * size[0];
+ rect.ymax = v3d->render_border.ymax * size[1];
+ }
+ }
+ }
+
+ ved->instance->init(
+ size, &rect, nullptr, depsgraph, nullptr, camera, nullptr, default_view, v3d, rv3d);
}
static void eevee_draw_scene(void *vedata)
{
- UNUSED_VARS(vedata);
+ DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
+ reinterpret_cast<EEVEE_Data *>(vedata)->instance->draw_viewport(dfbl);
}
static void eevee_cache_init(void *vedata)
{
- UNUSED_VARS(vedata);
+ reinterpret_cast<EEVEE_Data *>(vedata)->instance->begin_sync();
}
static void eevee_cache_populate(void *vedata, Object *object)
{
- UNUSED_VARS(vedata, object);
+ reinterpret_cast<EEVEE_Data *>(vedata)->instance->object_sync(object);
}
static void eevee_cache_finish(void *vedata)
{
- UNUSED_VARS(vedata);
+ reinterpret_cast<EEVEE_Data *>(vedata)->instance->end_sync();
}
static void eevee_engine_free()
@@ -51,7 +104,7 @@ static void eevee_engine_free()
static void eevee_instance_free(void *instance)
{
- UNUSED_VARS(instance);
+ delete reinterpret_cast<eevee::Instance *>(instance);
}
static void eevee_render_to_image(void *UNUSED(vedata),