UI: Asset Shelf (Experimental Feature) #104831

Closed
Julian Eisel wants to merge 399 commits from asset-shelf into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
10 changed files with 74 additions and 104 deletions
Showing only changes of commit 03ac481454 - Show all commits

View File

@ -789,7 +789,6 @@ bool BKE_node_instance_hash_tag_key(bNodeInstanceHash *hash, bNodeInstanceKey ke
void BKE_node_instance_hash_remove_untagged(bNodeInstanceHash *hash,
bNodeInstanceValueFP valfreefp);
void BKE_node_preview_clear_tree(struct bNodeTree *ntree);
/** \} */
/* -------------------------------------------------------------------- */

View File

@ -47,6 +47,8 @@
#include "BLI_vector_set.hh"
#include "BLT_translation.h"
#include "IMB_imbuf.h"
#include "BKE_anim_data.h"
#include "BKE_animsys.h"
#include "BKE_asset.h"
@ -3111,6 +3113,7 @@ bNodePreview *node_preview_verify(bNodeInstanceHash *previews,
if (!preview) {
if (create) {
preview = MEM_cnew<bNodePreview>("node preview");
preview->ibuf = IMB_allocImBuf(xsize, ysize, 32, IB_rect);
BKE_node_instance_hash_insert(previews, key, preview);
}
else {
@ -3124,18 +3127,10 @@ bNodePreview *node_preview_verify(bNodeInstanceHash *previews,
}
/* sanity checks & initialize */
if (preview->rect) {
if (preview->xsize != xsize || preview->ysize != ysize) {
MEM_freeN(preview->rect);
preview->rect = nullptr;
}
}
if (preview->rect == nullptr) {
preview->rect = reinterpret_cast<uchar *>(
MEM_callocN(4 * xsize + xsize * ysize * sizeof(char[4]), "node preview rect"));
preview->xsize = xsize;
preview->ysize = ysize;
const uint size[2] = {(uint)xsize, (uint)ysize};
IMB_rect_size_set(preview->ibuf, size);
if (preview->ibuf->byte_buffer.data == nullptr) {
imb_addrectImBuf(preview->ibuf);
}
/* no clear, makes nicer previews */
@ -3145,16 +3140,14 @@ bNodePreview *node_preview_verify(bNodeInstanceHash *previews,
bNodePreview *node_preview_copy(bNodePreview *preview)
{
bNodePreview *new_preview = static_cast<bNodePreview *>(MEM_dupallocN(preview));
if (preview->rect) {
new_preview->rect = static_cast<uchar *>(MEM_dupallocN(preview->rect));
}
new_preview->ibuf = IMB_dupImBuf(preview->ibuf);
return new_preview;
}
void node_preview_free(bNodePreview *preview)
{
if (preview->rect) {
MEM_freeN(preview->rect);
if (preview->ibuf) {
IMB_freeImBuf(preview->ibuf);
}
MEM_freeN(preview);
}
@ -3227,29 +3220,8 @@ void node_preview_remove_unused(bNodeTree *ntree)
ntree->previews, reinterpret_cast<bNodeInstanceValueFP>(node_preview_free));
}
void node_preview_clear(bNodePreview *preview)
{
if (preview && preview->rect) {
memset(preview->rect, 0, MEM_allocN_len(preview->rect));
}
}
} // namespace blender::bke
void BKE_node_preview_clear_tree(bNodeTree *ntree)
{
if (!ntree || !ntree->previews) {
return;
}
blender::bke::bNodeInstanceHashIterator iter;
NODE_INSTANCE_HASH_ITER (iter, ntree->previews) {
bNodePreview *preview = static_cast<bNodePreview *>(
blender::bke::node_instance_hash_iterator_get_value(&iter));
blender::bke::node_preview_clear(preview);
}
}
namespace blender::bke {
void node_preview_merge_tree(bNodeTree *to_ntree, bNodeTree *from_ntree, bool remove_old)

View File

@ -6,6 +6,7 @@
#include "BKE_node.hh"
#include "IMB_colormanagement.h"
#include "IMB_imbuf.h"
namespace blender::compositor {
@ -17,7 +18,7 @@ PreviewOperation::PreviewOperation(const ColorManagedViewSettings *view_settings
{
this->add_input_socket(DataType::Color, ResizeMode::Align);
preview_ = nullptr;
output_buffer_ = nullptr;
output_image_ = nullptr;
input_ = nullptr;
divider_ = 1.0f;
view_settings_ = view_settings;
@ -39,26 +40,23 @@ void PreviewOperation::verify_preview(bNodeInstanceHash *previews, bNodeInstance
void PreviewOperation::init_execution()
{
input_ = get_input_socket_reader(0);
output_image_ = preview_->ibuf;
if (this->get_width() == uint(preview_->xsize) && this->get_height() == uint(preview_->ysize)) {
output_buffer_ = preview_->rect;
if (this->get_width() == uint(preview_->ibuf->x) &&
this->get_height() == uint(preview_->ibuf->y))
{
return;
}
if (output_buffer_ == nullptr) {
output_buffer_ = (uchar *)MEM_callocN(sizeof(uchar) * 4 * get_width() * get_height(),
"PreviewOperation");
if (preview_->rect) {
MEM_freeN(preview_->rect);
}
preview_->xsize = get_width();
preview_->ysize = get_height();
preview_->rect = output_buffer_;
const uint size[2] = {get_width(), get_height()};
IMB_rect_size_set(output_image_, size);
if (output_image_->byte_buffer.data == nullptr) {
imb_addrectImBuf(output_image_);
}
}
void PreviewOperation::deinit_execution()
{
output_buffer_ = nullptr;
output_image_ = nullptr;
input_ = nullptr;
}
@ -82,7 +80,7 @@ void PreviewOperation::execute_region(rcti *rect, uint /*tile_number*/)
color[3] = 1.0f;
input_->read_sampled(color, rx, ry, PixelSampler::Nearest);
IMB_colormanagement_processor_apply_v4(cm_processor, color);
rgba_float_to_uchar(output_buffer_ + offset, color);
rgba_float_to_uchar(output_image_->byte_buffer.data + offset, color);
offset += 4;
}
}
@ -165,8 +163,10 @@ void PreviewOperation::update_memory_buffer_partial(MemoryBuffer * /*output*/,
rcti buffer_area;
BLI_rcti_init(&buffer_area, 0, this->get_width(), 0, this->get_height());
BuffersIteratorBuilder<uchar> it_builder(
output_buffer_, buffer_area, area, COM_data_type_num_channels(DataType::Color));
BuffersIteratorBuilder<uchar> it_builder(output_image_->byte_buffer.data,
buffer_area,
area,
COM_data_type_num_channels(DataType::Color));
for (BuffersIterator<uchar> it = it_builder.build(); !it.is_end(); ++it) {
const float rx = it.x / divider_;

View File

@ -14,7 +14,7 @@ namespace blender::compositor {
class PreviewOperation : public MultiThreadedOperation {
protected:
unsigned char *output_buffer_;
ImBuf *output_image_;
/**
* \brief holds reference to the SDNA bNode, where this nodes will render the preview image for

View File

@ -12,6 +12,7 @@
#include "BLI_utildefines.h"
#include "IMB_colormanagement.h"
#include "IMB_imbuf.h"
#include "DNA_node_types.h"
@ -220,7 +221,7 @@ void compute_preview_from_result(Context &context, const DNode &node, Result &in
for (const int64_t x : IndexRange(preview_size.x)) {
const int index = (y * preview_size.x + x) * 4;
IMB_colormanagement_processor_apply_v4(color_processor, preview_pixels + index);
rgba_float_to_uchar(preview->rect + index, preview_pixels + index);
rgba_float_to_uchar(preview->ibuf->byte_buffer.data + index, preview_pixels + index);
}
}
});

View File

@ -166,8 +166,8 @@ void ED_draw_imbuf(struct ImBuf *ibuf,
float x,
float y,
bool use_filter,
struct ColorManagedViewSettings *view_settings,
struct ColorManagedDisplaySettings *display_settings,
const struct ColorManagedViewSettings *view_settings,
const struct ColorManagedDisplaySettings *display_settings,
float zoom_x,
float zoom_y);
/**
@ -177,8 +177,8 @@ void ED_draw_imbuf_clipping(struct ImBuf *ibuf,
float x,
float y,
bool use_filter,
struct ColorManagedViewSettings *view_settings,
struct ColorManagedDisplaySettings *display_settings,
const struct ColorManagedViewSettings *view_settings,
const struct ColorManagedDisplaySettings *display_settings,
float clip_min_x,
float clip_min_y,
float clip_max_x,

View File

@ -418,8 +418,8 @@ void ED_draw_imbuf_clipping(ImBuf *ibuf,
float x,
float y,
bool use_filter,
ColorManagedViewSettings *view_settings,
ColorManagedDisplaySettings *display_settings,
const ColorManagedViewSettings *view_settings,
const ColorManagedDisplaySettings *display_settings,
float clip_min_x,
float clip_min_y,
float clip_max_x,
@ -565,8 +565,8 @@ void ED_draw_imbuf(ImBuf *ibuf,
float x,
float y,
bool use_filter,
ColorManagedViewSettings *view_settings,
ColorManagedDisplaySettings *display_settings,
const ColorManagedViewSettings *view_settings,
const ColorManagedDisplaySettings *display_settings,
float zoom_x,
float zoom_y)
{

View File

@ -47,6 +47,8 @@
#include "BKE_object.h"
#include "BKE_type_conversions.hh"
#include "IMB_imbuf.h"
#include "DEG_depsgraph.h"
#include "BLF_api.h"
@ -1338,24 +1340,24 @@ static void node_draw_preview_background(rctf *rect)
}
/* Not a callback. */
static void node_draw_preview(bNodePreview *preview, rctf *prv)
static void node_draw_preview(const Scene *scene, ImBuf *preview, rctf *prv)
{
float xrect = BLI_rctf_size_x(prv);
float yrect = BLI_rctf_size_y(prv);
float xscale = xrect / float(preview->xsize);
float yscale = yrect / float(preview->ysize);
float xscale = xrect / float(preview->x);
float yscale = yrect / float(preview->y);
float scale;
/* Uniform scale and offset. */
rctf draw_rect = *prv;
if (xscale < yscale) {
float offset = 0.5f * (yrect - float(preview->ysize) * xscale);
float offset = 0.5f * (yrect - float(preview->y) * xscale);
draw_rect.ymin += offset;
draw_rect.ymax -= offset;
scale = xscale;
}
else {
float offset = 0.5f * (xrect - float(preview->xsize) * yscale);
float offset = 0.5f * (xrect - float(preview->x) * yscale);
draw_rect.xmin += offset;
draw_rect.xmax -= offset;
scale = yscale;
@ -1367,18 +1369,14 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv)
/* Premul graphics. */
GPU_blend(GPU_BLEND_ALPHA);
IMMDrawPixelsTexState state = immDrawPixelsTexSetup(GPU_SHADER_3D_IMAGE_COLOR);
immDrawPixelsTexTiled(&state,
draw_rect.xmin,
draw_rect.ymin,
preview->xsize,
preview->ysize,
GPU_RGBA8,
true,
preview->rect,
scale,
scale,
nullptr);
ED_draw_imbuf(preview,
draw_rect.xmin,
draw_rect.ymin,
false,
&scene->view_settings,
&scene->display_settings,
scale,
scale);
GPU_blend(GPU_BLEND_NONE);
@ -2095,10 +2093,11 @@ static void node_draw_extra_info_row(const bNode &node,
}
}
static void node_draw_extra_info_panel(TreeDrawContext &tree_draw_ctx,
static void node_draw_extra_info_panel(const Scene *scene,
TreeDrawContext &tree_draw_ctx,
const SpaceNode &snode,
const bNode &node,
bNodePreview *preview,
ImBuf *preview,
uiBlock &block)
{
Vector<NodeExtraInfoRow> extra_info_rows = node_get_extra_info(tree_draw_ctx, snode, node);
@ -2127,10 +2126,9 @@ static void node_draw_extra_info_panel(TreeDrawContext &tree_draw_ctx,
extra_info_rect.ymin = rct.ymax;
extra_info_rect.ymax = rct.ymax + extra_info_rows.size() * (20.0f * UI_SCALE_FAC);
if (preview) {
if (preview->xsize > preview->ysize) {
if (preview->x > preview->y) {
const float preview_padding = 3.0f * UI_SCALE_FAC;
preview_height = (width - 2.0 * preview_padding) * float(preview->ysize) /
float(preview->xsize) +
preview_height = (width - 2.0 * preview_padding) * float(preview->y) / float(preview->x) +
2.0 * preview_padding;
preview_rect.ymin = extra_info_rect.ymin + preview_padding;
preview_rect.ymax = extra_info_rect.ymin + preview_height - preview_padding;
@ -2141,8 +2139,8 @@ static void node_draw_extra_info_panel(TreeDrawContext &tree_draw_ctx,
else {
const float preview_padding = 3.0f * UI_SCALE_FAC;
preview_height = width;
const float preview_width = (width - 2.0 * preview_padding) * float(preview->xsize) /
float(preview->ysize) +
const float preview_width = (width - 2.0 * preview_padding) * float(preview->x) /
float(preview->y) +
2.0 * preview_padding;
preview_rect.ymin = extra_info_rect.ymin + preview_padding;
preview_rect.ymax = extra_info_rect.ymin + preview_height - preview_padding;
@ -2178,7 +2176,7 @@ static void node_draw_extra_info_panel(TreeDrawContext &tree_draw_ctx,
UI_draw_roundbox_4fv(&extra_info_rect, false, BASIS_RAD, color);
if (preview) {
node_draw_preview(preview, &preview_rect);
node_draw_preview(scene, preview, &preview_rect);
}
/* Resize the rect to draw the textual infos on top of the preview. */
@ -2229,15 +2227,19 @@ static void node_draw_basis(const bContext &C,
GPU_line_width(1.0f);
bNodePreview *preview = nullptr;
ImBuf *preview = nullptr;
if (node.flag & NODE_PREVIEW && previews && snode.overlay.flag & SN_OVERLAY_SHOW_PREVIEWS) {
preview = static_cast<bNodePreview *>(BKE_node_instance_hash_lookup(previews, key));
if (!preview || !(preview->xsize && preview->ysize)) {
preview = nullptr;
bNodePreview *preview_compositor = static_cast<bNodePreview *>(
BKE_node_instance_hash_lookup(previews, key));
if (preview_compositor) {
preview = preview_compositor->ibuf;
}
}
if (!preview || !(preview->x && preview->y)) {
preview = nullptr;
}
node_draw_extra_info_panel(tree_draw_ctx, snode, node, preview, block);
node_draw_extra_info_panel(CTX_data_scene(&C), tree_draw_ctx, snode, node, preview, block);
/* Header. */
{
@ -2548,7 +2550,7 @@ static void node_draw_hidden(const bContext &C,
const int color_id = node_get_colorid(tree_draw_ctx, node);
node_draw_extra_info_panel(tree_draw_ctx, snode, node, nullptr, block);
node_draw_extra_info_panel(nullptr, tree_draw_ctx, snode, node, nullptr, block);
/* Shadow. */
node_draw_shadow(snode, node, hiddenrad, 1.0f);
@ -3034,7 +3036,7 @@ static void frame_node_draw(const bContext &C,
/* Label and text. */
frame_node_draw_label(tree_draw_ctx, ntree, node, snode);
node_draw_extra_info_panel(tree_draw_ctx, snode, node, nullptr, block);
node_draw_extra_info_panel(nullptr, tree_draw_ctx, snode, node, nullptr, block);
UI_block_end(&C, &block);
UI_block_draw(&C, &block);

View File

@ -55,6 +55,7 @@ struct AnimData;
struct Collection;
struct ID;
struct Image;
struct ImBuf;
struct ListBase;
struct Material;
struct PreviewImage;
@ -514,8 +515,7 @@ typedef struct bNodePreview {
/** Must be first. */
bNodeInstanceHashEntry hash_entry;
unsigned char *rect;
short xsize, ysize;
struct ImBuf *ibuf;
} bNodePreview;
typedef struct bNodeLink {

View File

@ -96,10 +96,6 @@ static void rna_Material_update_previews(Main * /*bmain*/, Scene * /*scene*/, Po
{
Material *ma = (Material *)ptr->owner_id;
if (ma->nodetree) {
BKE_node_preview_clear_tree(ma->nodetree);
}
WM_main_add_notifier(NC_MATERIAL | ND_SHADING_PREVIEW, ma);
}