2023-08-16 00:20:26 +10:00
|
|
|
/* SPDX-FileCopyrightText: 2021 Blender Authors
|
2023-05-31 16:19:06 +02:00
|
|
|
*
|
2023-06-16 11:42:12 +10:00
|
|
|
* SPDX-License-Identifier: GPL-2.0-or-later */
|
2022-03-18 19:03:48 +01:00
|
|
|
|
|
|
|
|
#include "BLI_rect.h"
|
|
|
|
|
|
2024-03-23 01:24:18 +01:00
|
|
|
#include "GPU_framebuffer.hh"
|
2022-03-18 19:03:48 +01:00
|
|
|
|
2023-12-07 08:19:32 +01:00
|
|
|
#include "ED_screen.hh"
|
2023-08-05 02:57:52 +02:00
|
|
|
#include "ED_view3d.hh"
|
2022-03-18 19:03:48 +01:00
|
|
|
|
2024-01-05 11:16:57 -05:00
|
|
|
#include "DRW_render.hh"
|
2022-03-18 19:03:48 +01:00
|
|
|
|
2022-06-28 18:33:25 +02:00
|
|
|
#include "RE_pipeline.h"
|
|
|
|
|
|
2022-04-29 09:24:25 +10:00
|
|
|
#include "eevee_engine.h" /* Own include. */
|
|
|
|
|
|
2025-01-22 19:37:38 +01:00
|
|
|
#include "draw_view_data.hh"
|
|
|
|
|
|
2022-05-02 09:22:14 +02:00
|
|
|
#include "eevee_instance.hh"
|
|
|
|
|
|
|
|
|
|
using namespace blender;
|
|
|
|
|
|
2022-03-21 17:12:14 -05:00
|
|
|
struct EEVEE_Data {
|
2022-03-18 19:03:48 +01:00
|
|
|
DrawEngineType *engine_type;
|
2022-05-02 09:22:14 +02:00
|
|
|
eevee::Instance *instance;
|
2022-05-19 00:31:01 +02:00
|
|
|
|
|
|
|
|
char info[GPU_INFO_SIZE];
|
2022-03-21 17:12:14 -05:00
|
|
|
};
|
2022-03-18 19:03:48 +01:00
|
|
|
|
|
|
|
|
static void eevee_engine_init(void *vedata)
|
|
|
|
|
{
|
2022-05-02 09:22:14 +02:00
|
|
|
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;
|
2023-12-07 08:19:32 +01:00
|
|
|
ARegion *region = ctx_state->region;
|
2022-05-02 09:22:14 +02:00
|
|
|
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));
|
|
|
|
|
|
2024-12-05 16:35:17 +01:00
|
|
|
draw::View &default_view = draw::View::default_get();
|
2022-05-02 09:22:14 +02:00
|
|
|
|
|
|
|
|
Object *camera = nullptr;
|
|
|
|
|
/* Get render borders. */
|
|
|
|
|
rcti rect;
|
|
|
|
|
BLI_rcti_init(&rect, 0, size[0], 0, size[1]);
|
2023-12-07 08:19:32 +01:00
|
|
|
rcti visible_rect = rect;
|
2022-05-02 09:22:14 +02:00
|
|
|
if (v3d) {
|
|
|
|
|
if (rv3d && (rv3d->persp == RV3D_CAMOB)) {
|
|
|
|
|
camera = v3d->camera;
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-03 17:08:23 +02:00
|
|
|
if (camera) {
|
|
|
|
|
rctf default_border;
|
|
|
|
|
BLI_rctf_init(&default_border, 0.0f, 1.0f, 0.0f, 1.0f);
|
|
|
|
|
bool is_default_border = BLI_rctf_compare(&scene->r.border, &default_border, 0.0f);
|
2023-11-08 19:13:26 +01:00
|
|
|
bool use_border = scene->r.mode & R_BORDER;
|
|
|
|
|
if (!is_default_border && use_border) {
|
2022-05-02 09:22:14 +02:00
|
|
|
rctf viewborder;
|
|
|
|
|
/* TODO(fclem) Might be better to get it from DRW. */
|
2024-09-26 15:02:59 +10:00
|
|
|
ED_view3d_calc_camera_border(scene, depsgraph, region, v3d, rv3d, false, &viewborder);
|
2022-05-02 09:22:14 +02:00
|
|
|
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));
|
|
|
|
|
}
|
2023-08-03 17:08:23 +02:00
|
|
|
}
|
|
|
|
|
else if (v3d->flag2 & V3D_RENDER_BORDER) {
|
|
|
|
|
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];
|
2022-05-02 09:22:14 +02:00
|
|
|
}
|
2023-12-07 08:19:32 +01:00
|
|
|
|
|
|
|
|
if (DRW_state_is_viewport_image_render()) {
|
|
|
|
|
const float *vp_size = DRW_viewport_size_get();
|
|
|
|
|
visible_rect.xmax = vp_size[0];
|
|
|
|
|
visible_rect.ymax = vp_size[1];
|
|
|
|
|
visible_rect.xmin = visible_rect.ymin = 0;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
visible_rect = *ED_region_visible_rect(region);
|
|
|
|
|
}
|
2022-05-02 09:22:14 +02:00
|
|
|
}
|
|
|
|
|
|
2023-12-07 08:19:32 +01:00
|
|
|
ved->instance->init(
|
2024-12-05 16:35:17 +01:00
|
|
|
size, &rect, &visible_rect, nullptr, depsgraph, camera, nullptr, &default_view, v3d, rv3d);
|
2022-03-18 19:03:48 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void eevee_draw_scene(void *vedata)
|
|
|
|
|
{
|
2022-05-19 00:31:01 +02:00
|
|
|
EEVEE_Data *ved = reinterpret_cast<EEVEE_Data *>(vedata);
|
2023-12-19 16:13:45 +01:00
|
|
|
if (DRW_state_is_viewport_image_render()) {
|
|
|
|
|
ved->instance->draw_viewport_image_render();
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
ved->instance->draw_viewport();
|
|
|
|
|
}
|
2024-09-02 20:13:31 +02:00
|
|
|
STRNCPY(ved->info, ved->instance->info_get());
|
2024-05-19 19:02:02 +02:00
|
|
|
DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
|
|
|
|
|
GPU_framebuffer_viewport_reset(dfbl->default_fb);
|
2022-03-18 19:03:48 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void eevee_cache_init(void *vedata)
|
|
|
|
|
{
|
2022-05-02 09:22:14 +02:00
|
|
|
reinterpret_cast<EEVEE_Data *>(vedata)->instance->begin_sync();
|
2022-03-18 19:03:48 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void eevee_cache_populate(void *vedata, Object *object)
|
|
|
|
|
{
|
2024-11-14 21:42:57 +01:00
|
|
|
draw::ObjectRef ob_ref = DRW_object_ref_get(object);
|
|
|
|
|
reinterpret_cast<EEVEE_Data *>(vedata)->instance->object_sync(ob_ref);
|
2022-03-18 19:03:48 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void eevee_cache_finish(void *vedata)
|
|
|
|
|
{
|
2022-05-02 09:22:14 +02:00
|
|
|
reinterpret_cast<EEVEE_Data *>(vedata)->instance->end_sync();
|
2022-03-18 19:03:48 +01:00
|
|
|
}
|
|
|
|
|
|
2023-12-04 15:57:51 +01:00
|
|
|
static void eevee_view_update(void *vedata)
|
|
|
|
|
{
|
|
|
|
|
if (eevee::Instance *instance = reinterpret_cast<EEVEE_Data *>(vedata)->instance) {
|
|
|
|
|
instance->view_update();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-21 17:12:14 -05:00
|
|
|
static void eevee_engine_free()
|
2022-03-18 19:03:48 +01:00
|
|
|
{
|
2022-05-18 23:00:29 +02:00
|
|
|
eevee::ShaderModule::module_free();
|
2022-03-18 19:03:48 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void eevee_instance_free(void *instance)
|
|
|
|
|
{
|
2022-05-02 09:22:14 +02:00
|
|
|
delete reinterpret_cast<eevee::Instance *>(instance);
|
2022-03-18 19:03:48 +01:00
|
|
|
}
|
|
|
|
|
|
2022-09-13 11:07:30 +02:00
|
|
|
static void eevee_render_to_image(void *vedata,
|
2023-06-03 08:36:28 +10:00
|
|
|
RenderEngine *engine,
|
|
|
|
|
RenderLayer *layer,
|
|
|
|
|
const rcti * /*rect*/)
|
2022-03-18 19:03:48 +01:00
|
|
|
{
|
2022-06-28 18:33:25 +02:00
|
|
|
eevee::Instance *instance = new eevee::Instance();
|
|
|
|
|
|
|
|
|
|
Render *render = engine->re;
|
|
|
|
|
Depsgraph *depsgraph = DRW_context_state_get()->depsgraph;
|
|
|
|
|
Object *camera_original_ob = RE_GetCamera(engine->re);
|
|
|
|
|
const char *viewname = RE_GetActiveRenderView(engine->re);
|
|
|
|
|
int size[2] = {engine->resolution_x, engine->resolution_y};
|
|
|
|
|
|
|
|
|
|
rctf view_rect;
|
|
|
|
|
rcti rect;
|
|
|
|
|
RE_GetViewPlane(render, &view_rect, &rect);
|
2023-12-07 08:19:32 +01:00
|
|
|
rcti visible_rect = rect;
|
2022-06-28 18:33:25 +02:00
|
|
|
|
2023-12-07 08:19:32 +01:00
|
|
|
instance->init(size, &rect, &visible_rect, engine, depsgraph, camera_original_ob, layer);
|
2024-07-22 13:18:33 +02:00
|
|
|
instance->render_frame(engine, layer, viewname);
|
2022-06-28 18:33:25 +02:00
|
|
|
|
2022-09-13 11:07:30 +02:00
|
|
|
EEVEE_Data *ved = static_cast<EEVEE_Data *>(vedata);
|
2022-10-05 13:44:02 -05:00
|
|
|
delete ved->instance;
|
2022-09-13 11:07:30 +02:00
|
|
|
ved->instance = instance;
|
2022-03-18 19:03:48 +01:00
|
|
|
}
|
|
|
|
|
|
2023-06-03 08:36:28 +10:00
|
|
|
static void eevee_store_metadata(void *vedata, RenderResult *render_result)
|
2022-03-18 19:03:48 +01:00
|
|
|
{
|
2022-09-13 11:07:30 +02:00
|
|
|
EEVEE_Data *ved = static_cast<EEVEE_Data *>(vedata);
|
|
|
|
|
eevee::Instance *instance = ved->instance;
|
|
|
|
|
instance->store_metadata(render_result);
|
|
|
|
|
delete instance;
|
|
|
|
|
ved->instance = nullptr;
|
|
|
|
|
}
|
2022-08-30 10:07:51 +02:00
|
|
|
|
2022-09-13 11:07:30 +02:00
|
|
|
static void eevee_render_update_passes(RenderEngine *engine, Scene *scene, ViewLayer *view_layer)
|
|
|
|
|
{
|
|
|
|
|
eevee::Instance::update_passes(engine, scene, view_layer);
|
2022-03-18 19:03:48 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DrawEngineType draw_engine_eevee_next_type = {
|
2023-07-18 14:18:10 +10:00
|
|
|
/*next*/ nullptr,
|
|
|
|
|
/*prev*/ nullptr,
|
2023-09-18 12:28:36 +02:00
|
|
|
/*idname*/ N_("EEVEE"),
|
2023-07-18 14:18:10 +10:00
|
|
|
/*engine_init*/ &eevee_engine_init,
|
|
|
|
|
/*engine_free*/ &eevee_engine_free,
|
|
|
|
|
/*instance_free*/ &eevee_instance_free,
|
|
|
|
|
/*cache_init*/ &eevee_cache_init,
|
|
|
|
|
/*cache_populate*/ &eevee_cache_populate,
|
|
|
|
|
/*cache_finish*/ &eevee_cache_finish,
|
|
|
|
|
/*draw_scene*/ &eevee_draw_scene,
|
2023-12-04 15:57:51 +01:00
|
|
|
/*view_update*/ &eevee_view_update,
|
2023-07-18 14:18:10 +10:00
|
|
|
/*id_update*/ nullptr,
|
|
|
|
|
/*render_to_image*/ &eevee_render_to_image,
|
|
|
|
|
/*store_metadata*/ &eevee_store_metadata,
|
2022-03-18 19:03:48 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
RenderEngineType DRW_engine_viewport_eevee_next_type = {
|
2023-07-18 14:18:10 +10:00
|
|
|
/*next*/ nullptr,
|
|
|
|
|
/*prev*/ nullptr,
|
|
|
|
|
/*idname*/ "BLENDER_EEVEE_NEXT",
|
2024-05-08 20:57:00 +02:00
|
|
|
/*name*/ N_("EEVEE"),
|
2023-07-18 14:18:10 +10:00
|
|
|
/*flag*/ RE_INTERNAL | RE_USE_PREVIEW | RE_USE_STEREO_VIEWPORT | RE_USE_GPU_CONTEXT,
|
|
|
|
|
/*update*/ nullptr,
|
|
|
|
|
/*render*/ &DRW_render_to_image,
|
|
|
|
|
/*render_frame_finish*/ nullptr,
|
|
|
|
|
/*draw*/ nullptr,
|
|
|
|
|
/*bake*/ nullptr,
|
|
|
|
|
/*view_update*/ nullptr,
|
|
|
|
|
/*view_draw*/ nullptr,
|
|
|
|
|
/*update_script_node*/ nullptr,
|
|
|
|
|
/*update_render_passes*/ &eevee_render_update_passes,
|
|
|
|
|
/*draw_engine*/ &draw_engine_eevee_next_type,
|
|
|
|
|
/*rna_ext*/
|
|
|
|
|
{
|
|
|
|
|
/*data*/ nullptr,
|
|
|
|
|
/*srna*/ nullptr,
|
|
|
|
|
/*call*/ nullptr,
|
|
|
|
|
},
|
2022-03-18 19:03:48 +01:00
|
|
|
};
|