UI: Asset Shelf (Experimental Feature) #104831
|
@ -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);
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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_;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue