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/image/image_engine.cc')
-rw-r--r--source/blender/draw/engines/image/image_engine.cc73
1 files changed, 41 insertions, 32 deletions
diff --git a/source/blender/draw/engines/image/image_engine.cc b/source/blender/draw/engines/image/image_engine.cc
index be5946f34eb..201733f41a7 100644
--- a/source/blender/draw/engines/image/image_engine.cc
+++ b/source/blender/draw/engines/image/image_engine.cc
@@ -41,7 +41,7 @@
#include "GPU_batch.h"
-#include "image_drawing_mode_image_space.hh"
+#include "image_drawing_mode.hh"
#include "image_engine.h"
#include "image_private.hh"
#include "image_space_image.hh"
@@ -68,7 +68,7 @@ template<
*
* Useful during development to switch between drawing implementations.
*/
- typename DrawingMode = ImageSpaceDrawingMode>
+ typename DrawingMode = ScreenSpaceDrawingMode<OneTextureMethod>>
class ImageEngine {
private:
const DRWContextState *draw_ctx;
@@ -86,48 +86,58 @@ class ImageEngine {
void cache_init()
{
- IMAGE_StorageList *stl = vedata->stl;
- IMAGE_PrivateData *pd = stl->pd;
-
+ IMAGE_InstanceData *instance_data = vedata->instance_data;
drawing_mode.cache_init(vedata);
- pd->view = nullptr;
- if (space->has_view_override()) {
- const ARegion *region = draw_ctx->region;
- pd->view = space->create_view_override(region);
- }
+
+ /* Setup full screen view matrix. */
+ const ARegion *region = draw_ctx->region;
+ float winmat[4][4], viewmat[4][4];
+ orthographic_m4(viewmat, 0.0, region->winx, 0.0, region->winy, 0.0, 1.0);
+ unit_m4(winmat);
+ instance_data->view = DRW_view_create(viewmat, winmat, nullptr, nullptr, nullptr);
}
void cache_populate()
{
- IMAGE_StorageList *stl = vedata->stl;
- IMAGE_PrivateData *pd = stl->pd;
+ IMAGE_InstanceData *instance_data = vedata->instance_data;
Main *bmain = CTX_data_main(draw_ctx->evil_C);
- pd->image = space->get_image(bmain);
- if (pd->image == nullptr) {
+ instance_data->image = space->get_image(bmain);
+ if (instance_data->image == nullptr) {
/* Early exit, nothing to draw. */
return;
}
- pd->ibuf = space->acquire_image_buffer(pd->image, &pd->lock);
+ instance_data->flags.do_tile_drawing = instance_data->image->source != IMA_SRC_TILED &&
+ space->use_tile_drawing();
+ void *lock;
+ ImBuf *image_buffer = space->acquire_image_buffer(instance_data->image, &lock);
+
+ /* Setup the matrix to go from screen UV coordinates to UV texture space coordinates. */
+ float image_resolution[2] = {image_buffer ? image_buffer->x : 1024.0f,
+ image_buffer ? image_buffer->y : 1024.0f};
+ space->init_ss_to_texture_matrix(
+ draw_ctx->region, image_resolution, instance_data->ss_to_texture);
+
+ const Scene *scene = DRW_context_state_get()->scene;
+ instance_data->sh_params.update(space.get(), scene, instance_data->image, image_buffer);
+ space->release_buffer(instance_data->image, image_buffer, lock);
+
ImageUser *iuser = space->get_image_user();
- drawing_mode.cache_image(space.get(), vedata, pd->image, iuser, pd->ibuf);
+ drawing_mode.cache_image(vedata, instance_data->image, iuser);
}
void draw_finish()
{
drawing_mode.draw_finish(vedata);
- IMAGE_StorageList *stl = vedata->stl;
- IMAGE_PrivateData *pd = stl->pd;
- space->release_buffer(pd->image, pd->ibuf, pd->lock);
- pd->image = nullptr;
- pd->ibuf = nullptr;
+ IMAGE_InstanceData *instance_data = vedata->instance_data;
+ instance_data->image = nullptr;
}
void draw_scene()
{
drawing_mode.draw_scene(vedata);
}
-};
+}; // namespace blender::draw::image_engine
/* -------------------------------------------------------------------- */
/** \name Engine Callbacks
@@ -135,17 +145,10 @@ class ImageEngine {
static void IMAGE_engine_init(void *ved)
{
- IMAGE_shader_library_ensure();
IMAGE_Data *vedata = (IMAGE_Data *)ved;
- IMAGE_StorageList *stl = vedata->stl;
- if (!stl->pd) {
- stl->pd = static_cast<IMAGE_PrivateData *>(MEM_callocN(sizeof(IMAGE_PrivateData), __func__));
+ if (vedata->instance_data == nullptr) {
+ vedata->instance_data = MEM_new<IMAGE_InstanceData>(__func__);
}
- IMAGE_PrivateData *pd = stl->pd;
-
- pd->ibuf = nullptr;
- pd->lock = nullptr;
- pd->texture = nullptr;
}
static void IMAGE_cache_init(void *vedata)
@@ -174,6 +177,12 @@ static void IMAGE_engine_free()
IMAGE_shader_free();
}
+static void IMAGE_instance_free(void *_instance_data)
+{
+ IMAGE_InstanceData *instance_data = reinterpret_cast<IMAGE_InstanceData *>(_instance_data);
+ MEM_delete(instance_data);
+}
+
/** \} */
static const DrawEngineDataSize IMAGE_data_size = DRW_VIEWPORT_DATA_SIZE(IMAGE_Data);
@@ -191,7 +200,7 @@ DrawEngineType draw_engine_image_type = {
&IMAGE_data_size, /* vedata_size */
&IMAGE_engine_init, /* engine_init */
&IMAGE_engine_free, /* engine_free */
- nullptr, /* instance_free */
+ &IMAGE_instance_free, /* instance_free */
&IMAGE_cache_init, /* cache_init */
&IMAGE_cache_populate, /* cache_populate */
nullptr, /* cache_finish */