Compare commits
14 Commits
temp-copy-
...
temp-geome
Author | SHA1 | Date | |
---|---|---|---|
73ed9afd03 | |||
de040ccb96 | |||
a9ba86c046 | |||
842375e1ed | |||
41bfb64da1 | |||
db59a5f9f0 | |||
a25dbf243a | |||
782b0df9c8 | |||
8969f4ba23 | |||
7cea4dc6f5 | |||
1e006e58dc | |||
0702871110 | |||
5ea958a992 | |||
7694a098ef |
@@ -306,64 +306,6 @@ class NODE_OT_tree_path_parent(Operator):
|
|||||||
return {'FINISHED'}
|
return {'FINISHED'}
|
||||||
|
|
||||||
|
|
||||||
class NODE_OT_active_preview_toggle(Operator):
|
|
||||||
'''Toggle active preview state of node'''
|
|
||||||
bl_idname = "node.active_preview_toggle"
|
|
||||||
bl_label = "Toggle Active Preview"
|
|
||||||
bl_options = {'REGISTER', 'UNDO'}
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def poll(cls, context):
|
|
||||||
space = context.space_data
|
|
||||||
if space is None:
|
|
||||||
return False
|
|
||||||
if space.type != 'NODE_EDITOR':
|
|
||||||
return False
|
|
||||||
if space.edit_tree is None:
|
|
||||||
return False
|
|
||||||
if space.edit_tree.nodes.active is None:
|
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
def execute(self, context):
|
|
||||||
node_editor = context.space_data
|
|
||||||
ntree = node_editor.edit_tree
|
|
||||||
active_node = ntree.nodes.active
|
|
||||||
|
|
||||||
if active_node.active_preview:
|
|
||||||
self.disable_preview(context, ntree, active_node)
|
|
||||||
else:
|
|
||||||
self.enable_preview(context, node_editor, ntree, active_node)
|
|
||||||
|
|
||||||
return {'FINISHED'}
|
|
||||||
|
|
||||||
def enable_preview(self, context, node_editor, ntree, active_node):
|
|
||||||
spreadsheets = self.find_unpinned_spreadsheets(context)
|
|
||||||
|
|
||||||
for spreadsheet in spreadsheets:
|
|
||||||
spreadsheet.set_geometry_node_context(node_editor, active_node)
|
|
||||||
|
|
||||||
for node in ntree.nodes:
|
|
||||||
node.active_preview = False
|
|
||||||
active_node.active_preview = True
|
|
||||||
|
|
||||||
def disable_preview(self, context, ntree, active_node):
|
|
||||||
spreadsheets = self.find_unpinned_spreadsheets(context)
|
|
||||||
for spreadsheet in spreadsheets:
|
|
||||||
spreadsheet.context_path.clear()
|
|
||||||
|
|
||||||
active_node.active_preview = False
|
|
||||||
|
|
||||||
def find_unpinned_spreadsheets(self, context):
|
|
||||||
spreadsheets = []
|
|
||||||
for window in context.window_manager.windows:
|
|
||||||
for area in window.screen.areas:
|
|
||||||
space = area.spaces.active
|
|
||||||
if space.type == 'SPREADSHEET' and not space.is_pinned:
|
|
||||||
spreadsheets.append(space)
|
|
||||||
return spreadsheets
|
|
||||||
|
|
||||||
|
|
||||||
classes = (
|
classes = (
|
||||||
NodeSetting,
|
NodeSetting,
|
||||||
|
|
||||||
@@ -372,5 +314,4 @@ classes = (
|
|||||||
NODE_OT_add_search,
|
NODE_OT_add_search,
|
||||||
NODE_OT_collapse_hide_unused_toggle,
|
NODE_OT_collapse_hide_unused_toggle,
|
||||||
NODE_OT_tree_path_parent,
|
NODE_OT_tree_path_parent,
|
||||||
NODE_OT_active_preview_toggle,
|
|
||||||
)
|
)
|
||||||
|
@@ -56,7 +56,7 @@ class SPREADSHEET_OT_toggle_pin(Operator):
|
|||||||
for node_editor in node_editors:
|
for node_editor in node_editors:
|
||||||
ntree = node_editor.edit_tree
|
ntree = node_editor.edit_tree
|
||||||
for node in ntree.nodes:
|
for node in ntree.nodes:
|
||||||
if node.active_preview:
|
if node.bl_idname == "GeometryNodeViewer":
|
||||||
space.set_geometry_node_context(node_editor, node)
|
space.set_geometry_node_context(node_editor, node)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@@ -566,6 +566,9 @@ geometry_node_categories = [
|
|||||||
NodeItem("ShaderNodeVectorMath"),
|
NodeItem("ShaderNodeVectorMath"),
|
||||||
NodeItem("ShaderNodeVectorRotate"),
|
NodeItem("ShaderNodeVectorRotate"),
|
||||||
]),
|
]),
|
||||||
|
GeometryNodeCategory("GEO_OUTPUT", "Output", items=[
|
||||||
|
NodeItem("GeometryNodeViewer"),
|
||||||
|
]),
|
||||||
GeometryNodeCategory("GEO_VOLUME", "Volume", items=[
|
GeometryNodeCategory("GEO_VOLUME", "Volume", items=[
|
||||||
NodeItem("GeometryNodePointsToVolume"),
|
NodeItem("GeometryNodePointsToVolume"),
|
||||||
NodeItem("GeometryNodeVolumeToMesh"),
|
NodeItem("GeometryNodeVolumeToMesh"),
|
||||||
|
@@ -1431,6 +1431,7 @@ int ntreeTexExecTree(struct bNodeTree *ntree,
|
|||||||
#define GEO_NODE_MATERIAL_REPLACE 1051
|
#define GEO_NODE_MATERIAL_REPLACE 1051
|
||||||
#define GEO_NODE_MESH_TO_CURVE 1052
|
#define GEO_NODE_MESH_TO_CURVE 1052
|
||||||
#define GEO_NODE_DELETE_GEOMETRY 1053
|
#define GEO_NODE_DELETE_GEOMETRY 1053
|
||||||
|
#define GEO_NODE_VIEWER 1054
|
||||||
|
|
||||||
/** \} */
|
/** \} */
|
||||||
|
|
||||||
|
@@ -3147,8 +3147,8 @@ void ntreeSetOutput(bNodeTree *ntree)
|
|||||||
if (ntree->type == NTREE_COMPOSIT) {
|
if (ntree->type == NTREE_COMPOSIT) {
|
||||||
/* same type, exception for viewer */
|
/* same type, exception for viewer */
|
||||||
if (tnode->type == node->type ||
|
if (tnode->type == node->type ||
|
||||||
(ELEM(tnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER) &&
|
(ELEM(tnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER, GEO_NODE_VIEWER) &&
|
||||||
ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER))) {
|
ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER, GEO_NODE_VIEWER))) {
|
||||||
if (tnode->flag & NODE_DO_OUTPUT) {
|
if (tnode->flag & NODE_DO_OUTPUT) {
|
||||||
output++;
|
output++;
|
||||||
if (output > 1) {
|
if (output > 1) {
|
||||||
@@ -5082,6 +5082,7 @@ static void registerGeometryNodes()
|
|||||||
register_node_type_geo_switch();
|
register_node_type_geo_switch();
|
||||||
register_node_type_geo_transform();
|
register_node_type_geo_transform();
|
||||||
register_node_type_geo_triangulate();
|
register_node_type_geo_triangulate();
|
||||||
|
register_node_type_geo_viewer();
|
||||||
register_node_type_geo_volume_to_mesh();
|
register_node_type_geo_volume_to_mesh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -40,6 +40,7 @@ struct bNodeSocketType;
|
|||||||
struct bNodeTree;
|
struct bNodeTree;
|
||||||
struct bNodeTreeType;
|
struct bNodeTreeType;
|
||||||
struct bNodeType;
|
struct bNodeType;
|
||||||
|
struct SpaceNode;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
NODE_TOP = 1,
|
NODE_TOP = 1,
|
||||||
@@ -109,6 +110,7 @@ bool ED_node_select_check(ListBase *lb);
|
|||||||
void ED_node_select_all(ListBase *lb, int action);
|
void ED_node_select_all(ListBase *lb, int action);
|
||||||
void ED_node_post_apply_transform(struct bContext *C, struct bNodeTree *ntree);
|
void ED_node_post_apply_transform(struct bContext *C, struct bNodeTree *ntree);
|
||||||
void ED_node_set_active(struct Main *bmain,
|
void ED_node_set_active(struct Main *bmain,
|
||||||
|
struct SpaceNode *snode,
|
||||||
struct bNodeTree *ntree,
|
struct bNodeTree *ntree,
|
||||||
struct bNode *node,
|
struct bNode *node,
|
||||||
bool *r_active_texture_changed);
|
bool *r_active_texture_changed);
|
||||||
|
@@ -451,7 +451,7 @@ static void template_texture_select(bContext *C, void *user_p, void *UNUSED(arg)
|
|||||||
|
|
||||||
/* set user as active */
|
/* set user as active */
|
||||||
if (user->node) {
|
if (user->node) {
|
||||||
ED_node_set_active(CTX_data_main(C), user->ntree, user->node, NULL);
|
ED_node_set_active(CTX_data_main(C), NULL, user->ntree, user->node, NULL);
|
||||||
ct->texture = NULL;
|
ct->texture = NULL;
|
||||||
|
|
||||||
/* Not totally sure if we should also change selection? */
|
/* Not totally sure if we should also change selection? */
|
||||||
|
@@ -90,7 +90,7 @@ bNode *node_add_node(const bContext *C, const char *idname, int type, float locx
|
|||||||
nodeSetSelected(node, true);
|
nodeSetSelected(node, true);
|
||||||
|
|
||||||
ntreeUpdateTree(bmain, snode->edittree);
|
ntreeUpdateTree(bmain, snode->edittree);
|
||||||
ED_node_set_active(bmain, snode->edittree, node, NULL);
|
ED_node_set_active(bmain, snode, snode->edittree, node, NULL);
|
||||||
|
|
||||||
snode_update(snode, node);
|
snode_update(snode, node);
|
||||||
|
|
||||||
|
@@ -1404,28 +1404,6 @@ static void node_draw_basis(const bContext *C,
|
|||||||
"");
|
"");
|
||||||
UI_block_emboss_set(node->block, UI_EMBOSS);
|
UI_block_emboss_set(node->block, UI_EMBOSS);
|
||||||
}
|
}
|
||||||
if (ntree->type == NTREE_GEOMETRY) {
|
|
||||||
/* Active preview toggle. */
|
|
||||||
iconofs -= iconbutw;
|
|
||||||
UI_block_emboss_set(node->block, UI_EMBOSS_NONE);
|
|
||||||
int icon = (node->flag & NODE_ACTIVE_PREVIEW) ? ICON_RESTRICT_VIEW_OFF : ICON_RESTRICT_VIEW_ON;
|
|
||||||
uiBut *but = uiDefIconBut(node->block,
|
|
||||||
UI_BTYPE_BUT_TOGGLE,
|
|
||||||
0,
|
|
||||||
icon,
|
|
||||||
iconofs,
|
|
||||||
rct->ymax - NODE_DY,
|
|
||||||
iconbutw,
|
|
||||||
UI_UNIT_Y,
|
|
||||||
nullptr,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
"Show this node's geometry output in the spreadsheet");
|
|
||||||
UI_but_func_set(but, node_toggle_button_cb, node, (void *)"NODE_OT_active_preview_toggle");
|
|
||||||
UI_block_emboss_set(node->block, UI_EMBOSS);
|
|
||||||
}
|
|
||||||
|
|
||||||
node_add_error_message_button(C, *ntree, *node, *rct, iconofs);
|
node_add_error_message_button(C, *ntree, *node, *rct, iconofs);
|
||||||
|
|
||||||
|
@@ -54,6 +54,7 @@
|
|||||||
#include "ED_render.h"
|
#include "ED_render.h"
|
||||||
#include "ED_screen.h"
|
#include "ED_screen.h"
|
||||||
#include "ED_select_utils.h"
|
#include "ED_select_utils.h"
|
||||||
|
#include "ED_spreadsheet.h"
|
||||||
|
|
||||||
#include "RNA_access.h"
|
#include "RNA_access.h"
|
||||||
#include "RNA_define.h"
|
#include "RNA_define.h"
|
||||||
@@ -383,7 +384,7 @@ bool composite_node_editable(bContext *C)
|
|||||||
{
|
{
|
||||||
if (ED_operator_node_editable(C)) {
|
if (ED_operator_node_editable(C)) {
|
||||||
SpaceNode *snode = CTX_wm_space_node(C);
|
SpaceNode *snode = CTX_wm_space_node(C);
|
||||||
if (ED_node_is_compositor(snode)) {
|
if (ED_node_is_compositor(snode) || ED_node_is_geometry(snode)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -662,7 +663,8 @@ void snode_update(SpaceNode *snode, bNode *node)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ED_node_set_active(Main *bmain, bNodeTree *ntree, bNode *node, bool *r_active_texture_changed)
|
void ED_node_set_active(
|
||||||
|
Main *bmain, SpaceNode *snode, bNodeTree *ntree, bNode *node, bool *r_active_texture_changed)
|
||||||
{
|
{
|
||||||
const bool was_active_texture = (node->flag & NODE_ACTIVE_TEXTURE) != 0;
|
const bool was_active_texture = (node->flag & NODE_ACTIVE_TEXTURE) != 0;
|
||||||
if (r_active_texture_changed) {
|
if (r_active_texture_changed) {
|
||||||
@@ -782,6 +784,30 @@ void ED_node_set_active(Main *bmain, bNodeTree *ntree, bNode *node, bool *r_acti
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
else if (ntree->type == NTREE_GEOMETRY) {
|
||||||
|
if (node->type == GEO_NODE_VIEWER) {
|
||||||
|
LISTBASE_FOREACH (bNode *, node_iter, &ntree->nodes) {
|
||||||
|
if (node_iter->type == GEO_NODE_VIEWER) {
|
||||||
|
node_iter->flag &= ~NODE_DO_OUTPUT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
node->flag |= NODE_DO_OUTPUT;
|
||||||
|
wmWindowManager *wm = bmain->wm.first;
|
||||||
|
LISTBASE_FOREACH (wmWindow *, window, &wm->windows) {
|
||||||
|
bScreen *screen = BKE_workspace_active_screen_get(window->workspace_hook);
|
||||||
|
LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
|
||||||
|
SpaceLink *sl = (SpaceLink *)area->spacedata.first;
|
||||||
|
if (sl->spacetype == SPACE_SPREADSHEET) {
|
||||||
|
SpaceSpreadsheet *sspreadsheet = (SpaceSpreadsheet *)sl;
|
||||||
|
if ((sspreadsheet->flag & SPREADSHEET_FLAG_PINNED) == 0) {
|
||||||
|
ED_spreadsheet_set_geometry_node_context(sspreadsheet, snode, node);
|
||||||
|
ED_area_tag_redraw(area);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1317,7 +1343,6 @@ static int node_duplicate_exec(bContext *C, wmOperator *op)
|
|||||||
nodeSetSelected(node, false);
|
nodeSetSelected(node, false);
|
||||||
node->flag &= ~(NODE_ACTIVE | NODE_ACTIVE_TEXTURE);
|
node->flag &= ~(NODE_ACTIVE | NODE_ACTIVE_TEXTURE);
|
||||||
nodeSetSelected(newnode, true);
|
nodeSetSelected(newnode, true);
|
||||||
newnode->flag &= ~NODE_ACTIVE_PREVIEW;
|
|
||||||
|
|
||||||
do_tag_update |= (do_tag_update || node_connected_to_output(bmain, ntree, newnode));
|
do_tag_update |= (do_tag_update || node_connected_to_output(bmain, ntree, newnode));
|
||||||
}
|
}
|
||||||
|
@@ -275,7 +275,6 @@ void NODE_OT_hide_toggle(struct wmOperatorType *ot);
|
|||||||
void NODE_OT_hide_socket_toggle(struct wmOperatorType *ot);
|
void NODE_OT_hide_socket_toggle(struct wmOperatorType *ot);
|
||||||
void NODE_OT_preview_toggle(struct wmOperatorType *ot);
|
void NODE_OT_preview_toggle(struct wmOperatorType *ot);
|
||||||
void NODE_OT_options_toggle(struct wmOperatorType *ot);
|
void NODE_OT_options_toggle(struct wmOperatorType *ot);
|
||||||
void NODE_OT_active_preview_toggle(struct wmOperatorType *ot);
|
|
||||||
void NODE_OT_node_copy_color(struct wmOperatorType *ot);
|
void NODE_OT_node_copy_color(struct wmOperatorType *ot);
|
||||||
|
|
||||||
void NODE_OT_read_viewlayers(struct wmOperatorType *ot);
|
void NODE_OT_read_viewlayers(struct wmOperatorType *ot);
|
||||||
|
@@ -158,6 +158,11 @@ bool node_connected_to_output(Main *bmain, bNodeTree *ntree, bNode *node)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (current_node->type == GEO_NODE_VIEWER) {
|
||||||
|
if (ntree_check_nodes_connected(ntree, node, current_node)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -598,14 +603,14 @@ static int node_link_viewer(const bContext *C, bNode *tonode)
|
|||||||
if (tonode == NULL || BLI_listbase_is_empty(&tonode->outputs)) {
|
if (tonode == NULL || BLI_listbase_is_empty(&tonode->outputs)) {
|
||||||
return OPERATOR_CANCELLED;
|
return OPERATOR_CANCELLED;
|
||||||
}
|
}
|
||||||
if (ELEM(tonode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
|
if (ELEM(tonode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER, GEO_NODE_VIEWER)) {
|
||||||
return OPERATOR_CANCELLED;
|
return OPERATOR_CANCELLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get viewer */
|
/* get viewer */
|
||||||
bNode *viewer_node = NULL;
|
bNode *viewer_node = NULL;
|
||||||
LISTBASE_FOREACH (bNode *, node, &snode->edittree->nodes) {
|
LISTBASE_FOREACH (bNode *, node, &snode->edittree->nodes) {
|
||||||
if (ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
|
if (ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER, GEO_NODE_VIEWER)) {
|
||||||
if (node->flag & NODE_DO_OUTPUT) {
|
if (node->flag & NODE_DO_OUTPUT) {
|
||||||
viewer_node = node;
|
viewer_node = node;
|
||||||
break;
|
break;
|
||||||
@@ -615,7 +620,7 @@ static int node_link_viewer(const bContext *C, bNode *tonode)
|
|||||||
/* no viewer, we make one active */
|
/* no viewer, we make one active */
|
||||||
if (viewer_node == NULL) {
|
if (viewer_node == NULL) {
|
||||||
LISTBASE_FOREACH (bNode *, node, &snode->edittree->nodes) {
|
LISTBASE_FOREACH (bNode *, node, &snode->edittree->nodes) {
|
||||||
if (ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
|
if (ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER, GEO_NODE_VIEWER)) {
|
||||||
node->flag |= NODE_DO_OUTPUT;
|
node->flag |= NODE_DO_OUTPUT;
|
||||||
viewer_node = node;
|
viewer_node = node;
|
||||||
break;
|
break;
|
||||||
|
@@ -468,7 +468,7 @@ void node_select_single(bContext *C, bNode *node)
|
|||||||
}
|
}
|
||||||
nodeSetSelected(node, true);
|
nodeSetSelected(node, true);
|
||||||
|
|
||||||
ED_node_set_active(bmain, snode->edittree, node, &active_texture_changed);
|
ED_node_set_active(bmain, snode, snode->edittree, node, &active_texture_changed);
|
||||||
ED_node_set_active_viewer_key(snode);
|
ED_node_set_active_viewer_key(snode);
|
||||||
|
|
||||||
ED_node_sort(snode->edittree);
|
ED_node_sort(snode->edittree);
|
||||||
@@ -605,12 +605,15 @@ static int node_mouse_select(bContext *C,
|
|||||||
/* update node order */
|
/* update node order */
|
||||||
if (ret_value != OPERATOR_CANCELLED) {
|
if (ret_value != OPERATOR_CANCELLED) {
|
||||||
bool active_texture_changed = false;
|
bool active_texture_changed = false;
|
||||||
|
bool viewer_node_changed = false;
|
||||||
if (node != NULL && ret_value != OPERATOR_RUNNING_MODAL) {
|
if (node != NULL && ret_value != OPERATOR_RUNNING_MODAL) {
|
||||||
ED_node_set_active(bmain, snode->edittree, node, &active_texture_changed);
|
ED_node_set_active(bmain, snode, snode->edittree, node, &active_texture_changed);
|
||||||
|
viewer_node_changed = node->type == GEO_NODE_VIEWER;
|
||||||
}
|
}
|
||||||
ED_node_set_active_viewer_key(snode);
|
ED_node_set_active_viewer_key(snode);
|
||||||
ED_node_sort(snode->edittree);
|
ED_node_sort(snode->edittree);
|
||||||
if (active_texture_changed && has_workbench_in_texture_color(wm, scene, ob)) {
|
if ((active_texture_changed && has_workbench_in_texture_color(wm, scene, ob)) ||
|
||||||
|
viewer_node_changed) {
|
||||||
DEG_id_tag_update(&snode->edittree->id, ID_RECALC_COPY_ON_WRITE);
|
DEG_id_tag_update(&snode->edittree->id, ID_RECALC_COPY_ON_WRITE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -24,6 +24,7 @@
|
|||||||
#include "BLI_utildefines.h"
|
#include "BLI_utildefines.h"
|
||||||
#include "BLI_vector.hh"
|
#include "BLI_vector.hh"
|
||||||
|
|
||||||
|
#include "ED_screen.h"
|
||||||
#include "ED_spreadsheet.h"
|
#include "ED_spreadsheet.h"
|
||||||
|
|
||||||
#include "DEG_depsgraph.h"
|
#include "DEG_depsgraph.h"
|
||||||
|
@@ -320,6 +320,7 @@ typedef struct bNode {
|
|||||||
#define NODE_HIDDEN 8
|
#define NODE_HIDDEN 8
|
||||||
#define NODE_ACTIVE 16
|
#define NODE_ACTIVE 16
|
||||||
#define NODE_ACTIVE_ID 32
|
#define NODE_ACTIVE_ID 32
|
||||||
|
/* Used to indicate which group output node is used and which viewer node is active. */
|
||||||
#define NODE_DO_OUTPUT 64
|
#define NODE_DO_OUTPUT 64
|
||||||
#define __NODE_GROUP_EDIT 128 /* DEPRECATED */
|
#define __NODE_GROUP_EDIT 128 /* DEPRECATED */
|
||||||
/* free test flag, undefined */
|
/* free test flag, undefined */
|
||||||
@@ -354,7 +355,7 @@ typedef struct bNode {
|
|||||||
*/
|
*/
|
||||||
#define NODE_DO_OUTPUT_RECALC (1 << 17)
|
#define NODE_DO_OUTPUT_RECALC (1 << 17)
|
||||||
/* A preview for the data in this node can be displayed in the spreadsheet editor. */
|
/* A preview for the data in this node can be displayed in the spreadsheet editor. */
|
||||||
#define NODE_ACTIVE_PREVIEW (1 << 18)
|
#define __NODE_ACTIVE_PREVIEW (1 << 18) /* deprecated */
|
||||||
|
|
||||||
/* node->update */
|
/* node->update */
|
||||||
/* XXX NODE_UPDATE is a generic update flag. More fine-grained updates
|
/* XXX NODE_UPDATE is a generic update flag. More fine-grained updates
|
||||||
|
@@ -11163,12 +11163,6 @@ static void rna_def_node(BlenderRNA *brna)
|
|||||||
RNA_def_property_ui_text(prop, "Show Texture", "Display node in viewport textured shading mode");
|
RNA_def_property_ui_text(prop, "Show Texture", "Display node in viewport textured shading mode");
|
||||||
RNA_def_property_update(prop, 0, "rna_Node_update");
|
RNA_def_property_update(prop, 0, "rna_Node_update");
|
||||||
|
|
||||||
prop = RNA_def_property(srna, "active_preview", PROP_BOOLEAN, PROP_NONE);
|
|
||||||
RNA_def_property_boolean_sdna(prop, NULL, "flag", NODE_ACTIVE_PREVIEW);
|
|
||||||
RNA_def_property_ui_text(prop, "Active Preview", "Node is previewed in other editor");
|
|
||||||
RNA_def_property_flag(prop, PROP_NO_DEG_UPDATE);
|
|
||||||
RNA_def_property_update(prop, NC_NODE, NULL);
|
|
||||||
|
|
||||||
/* generic property update function */
|
/* generic property update function */
|
||||||
func = RNA_def_function(srna, "socket_value_update", "rna_Node_socket_value_update");
|
func = RNA_def_function(srna, "socket_value_update", "rna_Node_socket_value_update");
|
||||||
RNA_def_function_ui_description(func, "Update after property changes");
|
RNA_def_function_ui_description(func, "Update after property changes");
|
||||||
|
@@ -768,22 +768,6 @@ static Vector<SpaceSpreadsheet *> find_spreadsheet_editors(Main *bmain)
|
|||||||
|
|
||||||
using PreviewSocketMap = blender::MultiValueMap<DSocket, uint64_t>;
|
using PreviewSocketMap = blender::MultiValueMap<DSocket, uint64_t>;
|
||||||
|
|
||||||
static DSocket try_find_preview_socket_in_node(const DNode node)
|
|
||||||
{
|
|
||||||
for (const SocketRef *socket : node->outputs()) {
|
|
||||||
if (socket->bsocket()->type == SOCK_GEOMETRY) {
|
|
||||||
return {node.context(), socket};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (const SocketRef *socket : node->inputs()) {
|
|
||||||
if (socket->bsocket()->type == SOCK_GEOMETRY &&
|
|
||||||
(socket->bsocket()->flag & SOCK_MULTI_INPUT) == 0) {
|
|
||||||
return {node.context(), socket};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
static DSocket try_get_socket_to_preview_for_spreadsheet(SpaceSpreadsheet *sspreadsheet,
|
static DSocket try_get_socket_to_preview_for_spreadsheet(SpaceSpreadsheet *sspreadsheet,
|
||||||
NodesModifierData *nmd,
|
NodesModifierData *nmd,
|
||||||
const ModifierEvalContext *ctx,
|
const ModifierEvalContext *ctx,
|
||||||
@@ -839,7 +823,17 @@ static DSocket try_get_socket_to_preview_for_spreadsheet(SpaceSpreadsheet *sspre
|
|||||||
const NodeTreeRef &tree_ref = context->tree();
|
const NodeTreeRef &tree_ref = context->tree();
|
||||||
for (const NodeRef *node_ref : tree_ref.nodes()) {
|
for (const NodeRef *node_ref : tree_ref.nodes()) {
|
||||||
if (node_ref->name() == last_context->node_name) {
|
if (node_ref->name() == last_context->node_name) {
|
||||||
return try_find_preview_socket_in_node({context, node_ref});
|
const DNode viewer_node{context, node_ref};
|
||||||
|
DSocket socket_to_view;
|
||||||
|
viewer_node.input(0).foreach_origin_socket(
|
||||||
|
[&](const DSocket socket) { socket_to_view = socket; });
|
||||||
|
if (!socket_to_view) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
bNodeSocket *bsocket = socket_to_view->bsocket();
|
||||||
|
if (bsocket->type == SOCK_GEOMETRY && bsocket->flag != SOCK_MULTI_INPUT) {
|
||||||
|
return socket_to_view;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
@@ -975,6 +969,8 @@ static GeometrySet compute_geometry(const DerivedNodeTree &tree,
|
|||||||
blender::modifiers::geometry_nodes::GeometryNodesEvaluationParams eval_params;
|
blender::modifiers::geometry_nodes::GeometryNodesEvaluationParams eval_params;
|
||||||
eval_params.input_values = group_inputs;
|
eval_params.input_values = group_inputs;
|
||||||
eval_params.output_sockets = group_outputs;
|
eval_params.output_sockets = group_outputs;
|
||||||
|
eval_params.force_compute_sockets.extend(preview_sockets.keys().begin(),
|
||||||
|
preview_sockets.keys().end());
|
||||||
eval_params.mf_by_node = &mf_by_node;
|
eval_params.mf_by_node = &mf_by_node;
|
||||||
eval_params.modifier_ = nmd;
|
eval_params.modifier_ = nmd;
|
||||||
eval_params.depsgraph = ctx->depsgraph;
|
eval_params.depsgraph = ctx->depsgraph;
|
||||||
|
@@ -404,6 +404,9 @@ class GeometryNodesEvaluator {
|
|||||||
for (const DInputSocket &socket : params_.output_sockets) {
|
for (const DInputSocket &socket : params_.output_sockets) {
|
||||||
nodes_to_check.push(socket.node());
|
nodes_to_check.push(socket.node());
|
||||||
}
|
}
|
||||||
|
for (const DSocket &socket : params_.force_compute_sockets) {
|
||||||
|
nodes_to_check.push(socket.node());
|
||||||
|
}
|
||||||
/* Use the local allocator because the states do not need to outlive the evaluator. */
|
/* Use the local allocator because the states do not need to outlive the evaluator. */
|
||||||
LinearAllocator<> &allocator = local_allocators_.local();
|
LinearAllocator<> &allocator = local_allocators_.local();
|
||||||
while (!nodes_to_check.is_empty()) {
|
while (!nodes_to_check.is_empty()) {
|
||||||
@@ -500,7 +503,8 @@ class GeometryNodesEvaluator {
|
|||||||
},
|
},
|
||||||
{});
|
{});
|
||||||
if (output_state.potential_users == 0) {
|
if (output_state.potential_users == 0) {
|
||||||
/* If it does not have any potential users, it is unused. */
|
/* If it does not have any potential users, it is unused. It might become required again if
|
||||||
|
* the output itself is needed. */
|
||||||
output_state.output_usage = ValueUsage::Unused;
|
output_state.output_usage = ValueUsage::Unused;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -573,6 +577,21 @@ class GeometryNodesEvaluator {
|
|||||||
/* Setting an input as required will schedule any linked node. */
|
/* Setting an input as required will schedule any linked node. */
|
||||||
this->set_input_required(locked_node, socket);
|
this->set_input_required(locked_node, socket);
|
||||||
}
|
}
|
||||||
|
for (const DSocket socket : params_.force_compute_sockets) {
|
||||||
|
const DNode node = socket.node();
|
||||||
|
NodeState &node_state = this->get_node_state(node);
|
||||||
|
LockedNode locked_node{*this, node, node_state};
|
||||||
|
if (socket->is_input()) {
|
||||||
|
this->set_input_required(locked_node, DInputSocket(socket));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
OutputState &output_state = node_state.outputs[socket->index()];
|
||||||
|
output_state.output_usage = ValueUsage::Required;
|
||||||
|
/* Add a fake user for this output. */
|
||||||
|
output_state.potential_users += 1;
|
||||||
|
this->schedule_node(locked_node);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void schedule_node(LockedNode &locked_node)
|
void schedule_node(LockedNode &locked_node)
|
||||||
|
@@ -38,6 +38,7 @@ struct GeometryNodesEvaluationParams {
|
|||||||
|
|
||||||
Map<DOutputSocket, GMutablePointer> input_values;
|
Map<DOutputSocket, GMutablePointer> input_values;
|
||||||
Vector<DInputSocket> output_sockets;
|
Vector<DInputSocket> output_sockets;
|
||||||
|
Vector<DSocket> force_compute_sockets;
|
||||||
nodes::MultiFunctionByNode *mf_by_node;
|
nodes::MultiFunctionByNode *mf_by_node;
|
||||||
const NodesModifierData *modifier_;
|
const NodesModifierData *modifier_;
|
||||||
Depsgraph *depsgraph;
|
Depsgraph *depsgraph;
|
||||||
|
@@ -193,6 +193,7 @@ set(SRC
|
|||||||
geometry/nodes/node_geo_switch.cc
|
geometry/nodes/node_geo_switch.cc
|
||||||
geometry/nodes/node_geo_transform.cc
|
geometry/nodes/node_geo_transform.cc
|
||||||
geometry/nodes/node_geo_triangulate.cc
|
geometry/nodes/node_geo_triangulate.cc
|
||||||
|
geometry/nodes/node_geo_viewer.cc
|
||||||
geometry/nodes/node_geo_volume_to_mesh.cc
|
geometry/nodes/node_geo_volume_to_mesh.cc
|
||||||
geometry/node_geometry_exec.cc
|
geometry/node_geometry_exec.cc
|
||||||
geometry/node_geometry_tree.cc
|
geometry/node_geometry_tree.cc
|
||||||
|
@@ -82,6 +82,7 @@ void register_node_type_geo_subdivision_surface(void);
|
|||||||
void register_node_type_geo_switch(void);
|
void register_node_type_geo_switch(void);
|
||||||
void register_node_type_geo_transform(void);
|
void register_node_type_geo_transform(void);
|
||||||
void register_node_type_geo_triangulate(void);
|
void register_node_type_geo_triangulate(void);
|
||||||
|
void register_node_type_geo_viewer(void);
|
||||||
void register_node_type_geo_volume_to_mesh(void);
|
void register_node_type_geo_volume_to_mesh(void);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@@ -320,6 +320,7 @@ DefNode(GeometryNode, GEO_NODE_SUBDIVISION_SURFACE, 0, "SUBDIVISION_SURFACE", Su
|
|||||||
DefNode(GeometryNode, GEO_NODE_SWITCH, def_geo_switch, "SWITCH", Switch, "Switch", "")
|
DefNode(GeometryNode, GEO_NODE_SWITCH, def_geo_switch, "SWITCH", Switch, "Switch", "")
|
||||||
DefNode(GeometryNode, GEO_NODE_TRANSFORM, 0, "TRANSFORM", Transform, "Transform", "")
|
DefNode(GeometryNode, GEO_NODE_TRANSFORM, 0, "TRANSFORM", Transform, "Transform", "")
|
||||||
DefNode(GeometryNode, GEO_NODE_TRIANGULATE, def_geo_triangulate, "TRIANGULATE", Triangulate, "Triangulate", "")
|
DefNode(GeometryNode, GEO_NODE_TRIANGULATE, def_geo_triangulate, "TRIANGULATE", Triangulate, "Triangulate", "")
|
||||||
|
DefNode(GeometryNode, GEO_NODE_VIEWER, 0, "VIEWER", Viewer, "Viewer", "")
|
||||||
DefNode(GeometryNode, GEO_NODE_VOLUME_TO_MESH, def_geo_volume_to_mesh, "VOLUME_TO_MESH", VolumeToMesh, "Volume to Mesh", "")
|
DefNode(GeometryNode, GEO_NODE_VOLUME_TO_MESH, def_geo_volume_to_mesh, "VOLUME_TO_MESH", VolumeToMesh, "Volume to Mesh", "")
|
||||||
|
|
||||||
/* undefine macros */
|
/* undefine macros */
|
||||||
|
31
source/blender/nodes/geometry/nodes/node_geo_viewer.cc
Normal file
31
source/blender/nodes/geometry/nodes/node_geo_viewer.cc
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "node_geometry_util.hh"
|
||||||
|
|
||||||
|
static bNodeSocketTemplate geo_node_viewer_in[] = {
|
||||||
|
{SOCK_GEOMETRY, N_("Geometry")},
|
||||||
|
{-1, ""},
|
||||||
|
};
|
||||||
|
|
||||||
|
void register_node_type_geo_viewer()
|
||||||
|
{
|
||||||
|
static bNodeType ntype;
|
||||||
|
|
||||||
|
geo_node_type_base(&ntype, GEO_NODE_VIEWER, "Viewer", NODE_CLASS_OUTPUT, 0);
|
||||||
|
node_type_socket_templates(&ntype, geo_node_viewer_in, nullptr);
|
||||||
|
nodeRegisterType(&ntype);
|
||||||
|
}
|
Reference in New Issue
Block a user