Blender V5.0
image_instance.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2024 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
7#include <DRW_render.hh>
8
9#include "BKE_context.hh"
10
11#include "DRW_engine.hh"
12
13#include "image_drawing_mode.hh"
14#include "image_private.hh"
15#include "image_space.hh"
16#include "image_space_image.hh"
17#include "image_space_node.hh"
18
19#include "BLI_math_matrix.hh"
20
21#include "DNA_space_types.h"
22
23namespace blender::image_engine {
24
25static inline std::unique_ptr<AbstractSpaceAccessor> space_accessor_from_space(
26 SpaceLink *space_link)
27{
28 if (space_link->spacetype == SPACE_IMAGE) {
29 return std::make_unique<SpaceImageAccessor>(
30 static_cast<SpaceImage *>(static_cast<void *>(space_link)));
31 }
32 if (space_link->spacetype == SPACE_NODE) {
33 return std::make_unique<SpaceNodeAccessor>(
34 static_cast<SpaceNode *>(static_cast<void *>(space_link)));
35 }
37 return nullptr;
38}
39
40class Instance : public DrawEngine {
41 private:
42 std::unique_ptr<AbstractSpaceAccessor> space_;
43 Main *main_;
44
45 ScreenSpaceDrawingMode drawing_mode_;
46
47 public:
50 Manager *manager = nullptr;
51
52 public:
53 Instance() : drawing_mode_(*this) {}
54
55 virtual ~Instance() = default;
56
58 {
59 return "UV/Image";
60 }
61
62 void init() final
63 {
64 const DRWContext *ctx_state = DRW_context_get();
65 main_ = CTX_data_main(ctx_state->evil_C);
66 region = ctx_state->region;
67 space_ = space_accessor_from_space(ctx_state->space_data);
69 }
70
72 {
73 drawing_mode_.begin_sync();
74
75 /* Setup full screen view matrix. */
77 0.0f, float(region->winx), 0.0f, float(region->winy), 0.0f, 1.0f);
79 state.view.sync(viewmat, winmat);
80 state.flags.do_tile_drawing = false;
81
82 image_sync();
83 }
84
86 {
87 state.image = space_->get_image(main_);
88 if (state.image == nullptr) {
89 /* Early exit, nothing to draw. */
90 return;
91 }
92 state.flags.do_tile_drawing = state.image->source != IMA_SRC_TILED &&
93 space_->use_tile_drawing();
94 void *lock;
95 ImBuf *image_buffer = space_->acquire_image_buffer(state.image, &lock);
96
97 /* Setup the matrix to go from screen UV coordinates to UV texture space coordinates. */
98 float image_resolution[2] = {image_buffer ? image_buffer->x : 1024.0f,
99 image_buffer ? image_buffer->y : 1024.0f};
100 space_->init_ss_to_texture_matrix(
101 region, state.image->runtime->backdrop_offset, image_resolution, state.ss_to_texture);
102
103 const Scene *scene = DRW_context_get()->scene;
104 state.sh_params.update(space_.get(), scene, state.image, image_buffer);
105 space_->release_buffer(state.image, image_buffer, lock);
106
107 ImageUser *iuser = space_->get_image_user();
108 if (state.image->rr != nullptr) {
109 BKE_image_multilayer_index(state.image->rr, iuser);
110 }
111 else {
112 BKE_image_multiview_index(state.image, iuser);
113 }
114 drawing_mode_.image_sync(state.image, iuser);
115 }
116
117 void object_sync(ObjectRef & /*obref*/, Manager & /*manager*/) final {}
118
119 void end_sync() final {}
120
121 void draw(Manager & /*manager*/) final
122 {
124 drawing_mode_.draw_viewport();
125 drawing_mode_.draw_finish();
126 state.image = nullptr;
128 }
129};
130} // namespace blender::image_engine
Main * CTX_data_main(const bContext *C)
RenderPass * BKE_image_multilayer_index(RenderResult *rr, ImageUser *iuser)
void BKE_image_multiview_index(const Image *ima, ImageUser *iuser)
#define BLI_assert_unreachable()
Definition BLI_assert.h:93
#define final(a, b, c)
Definition BLI_hash.h:19
@ IMA_SRC_TILED
@ SPACE_NODE
@ SPACE_IMAGE
void DRW_submission_end()
void DRW_submission_start()
volatile int lock
void object_sync(ObjectRef &, Manager &) final
StringRefNull name_get() final
const DRWContext * DRW_context_get()
blender::draw::Manager * DRW_manager_get()
static std::unique_ptr< AbstractSpaceAccessor > space_accessor_from_space(SpaceLink *space_link)
MatBase< T, 4, 4 > orthographic(T left, T right, T bottom, T top, T near_clip, T far_clip)
Create an orthographic projection matrix using OpenGL coordinate convention: Maps each axis range to ...
MatBase< float, 4, 4 > float4x4
Scene * scene
const bContext * evil_C
ARegion * region
SpaceLink * space_data