2011-02-23 10:52:22 +00:00
|
|
|
/*
|
2008-12-24 10:33:10 +00:00
|
|
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
|
|
*
|
|
|
|
* 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,
|
2010-02-12 13:34:04 +00:00
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2008-12-24 10:33:10 +00:00
|
|
|
*
|
|
|
|
* The Original Code is Copyright (C) 2008 Blender Foundation.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* The Original Code is: all of this file.
|
|
|
|
* Contributor(s): Nathan Letwory
|
|
|
|
*
|
|
|
|
* ***** END GPL LICENSE BLOCK *****
|
|
|
|
*/
|
|
|
|
|
2011-02-27 20:29:51 +00:00
|
|
|
/** \file blender/editors/space_node/node_draw.c
|
|
|
|
* \ingroup spnode
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
2008-12-24 10:33:10 +00:00
|
|
|
#include <math.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
2011-02-21 13:47:49 +00:00
|
|
|
#include "MEM_guardedalloc.h"
|
|
|
|
|
2008-12-24 10:33:10 +00:00
|
|
|
#include "DNA_node_types.h"
|
2011-11-02 18:55:32 +00:00
|
|
|
#include "DNA_lamp_types.h"
|
2008-12-24 10:33:10 +00:00
|
|
|
#include "DNA_material_types.h"
|
|
|
|
#include "DNA_object_types.h"
|
|
|
|
#include "DNA_scene_types.h"
|
|
|
|
#include "DNA_space_types.h"
|
|
|
|
#include "DNA_screen_types.h"
|
2011-11-02 18:55:32 +00:00
|
|
|
#include "DNA_world_types.h"
|
2008-12-24 10:33:10 +00:00
|
|
|
|
2009-11-10 20:43:45 +00:00
|
|
|
#include "BLI_math.h"
|
2009-09-30 18:18:32 +00:00
|
|
|
#include "BLI_blenlib.h"
|
|
|
|
#include "BLI_threads.h"
|
2011-01-07 18:36:47 +00:00
|
|
|
#include "BLI_utildefines.h"
|
2008-12-24 10:33:10 +00:00
|
|
|
|
2012-03-17 14:42:44 +00:00
|
|
|
#include "BLF_translation.h"
|
|
|
|
|
2008-12-24 10:33:10 +00:00
|
|
|
#include "BKE_context.h"
|
2009-10-07 14:48:29 +00:00
|
|
|
#include "BKE_depsgraph.h"
|
2008-12-24 10:33:10 +00:00
|
|
|
#include "BKE_main.h"
|
2011-02-08 12:54:32 +00:00
|
|
|
#include "BKE_node.h"
|
2008-12-24 10:33:10 +00:00
|
|
|
|
|
|
|
#include "BIF_gl.h"
|
|
|
|
#include "BIF_glutil.h"
|
|
|
|
|
|
|
|
#include "WM_api.h"
|
2.5
Added WM Jobs manager
- WM can manage threaded jobs for you; just provide a couple
of components to get it work:
- customdata, free callback for it
- timer step, notifier code
- start callback, update callback
- Once started, each job runs an own timer, and will for
every time step check necessary updates, or close the
job when ready.
- No drawing happens in jobs, that's for notifiers!
- Every job stores an owner pointer, and based on this owner
it will prevent multiple jobs to enter the stack.
Instead it will re-use a running job, signal it to stop
and allow caller to re-initialize it even.
- Check new wm_jobs.c for more explanation. Jobs API is still
under construction.
Fun: BLI_addtail(&wm->jobs, steve); :)
Put Node shader previews back using wmJobs
- Preview calculating is now fully threaded (1 thread still)
- Thanks to new event system + notifiers, you can see
previews update even while dragging sliders!
- Currently it only starts when you change a node setting.
Warning: the thread render shares Node data, so don't delete
nodes while it renders! This topic is on the todo to make safe.
Also:
- bug in region initialize (do_versions) showed channel list in
node editor wrong.
- flagged the channel list 'hidden' now, it was really in the
way! This is for later to work on anyway.
- recoded Render API callbacks so it gets handlers passed on,
no globals to use anymore, remember?
- previewrender code gets now so much nicer! Will remove a lot
of stuff from code soon.
2009-01-22 14:59:49 +00:00
|
|
|
#include "WM_types.h"
|
2008-12-24 10:33:10 +00:00
|
|
|
|
2011-02-14 17:55:27 +00:00
|
|
|
#include "ED_node.h"
|
2009-11-11 08:12:54 +00:00
|
|
|
#include "ED_gpencil.h"
|
2008-12-24 10:33:10 +00:00
|
|
|
|
|
|
|
#include "UI_interface.h"
|
|
|
|
#include "UI_interface_icons.h"
|
|
|
|
#include "UI_resources.h"
|
|
|
|
#include "UI_view2d.h"
|
|
|
|
|
2009-09-16 18:59:13 +00:00
|
|
|
#include "RNA_access.h"
|
|
|
|
|
2011-09-05 21:01:50 +00:00
|
|
|
#include "NOD_composite.h"
|
|
|
|
#include "NOD_shader.h"
|
2008-12-24 10:33:10 +00:00
|
|
|
|
2011-11-20 16:38:23 +00:00
|
|
|
#include "intern/node_util.h"
|
|
|
|
|
2008-12-24 10:33:10 +00:00
|
|
|
#include "node_intern.h"
|
|
|
|
|
2011-02-21 13:47:49 +00:00
|
|
|
/* width of socket columns in group display */
|
|
|
|
#define NODE_GROUP_FRAME 120
|
|
|
|
|
2008-12-24 10:33:10 +00:00
|
|
|
// XXX interface.h
|
|
|
|
extern void ui_dropshadow(rctf *rct, float radius, float aspect, int select);
|
|
|
|
|
2011-09-05 21:01:50 +00:00
|
|
|
/* XXX update functions for node editor are a mess, needs a clear concept */
|
|
|
|
void ED_node_tree_update(SpaceNode *snode, Scene *scene)
|
|
|
|
{
|
|
|
|
snode_set_context(snode, scene);
|
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (snode->nodetree && snode->nodetree->id.us==0)
|
2011-09-05 21:01:50 +00:00
|
|
|
snode->nodetree->id.us= 1;
|
|
|
|
}
|
|
|
|
|
2009-10-07 22:05:30 +00:00
|
|
|
void ED_node_changed_update(ID *id, bNode *node)
|
2009-09-16 18:59:13 +00:00
|
|
|
{
|
2009-10-07 22:05:30 +00:00
|
|
|
bNodeTree *nodetree, *edittree;
|
|
|
|
int treetype;
|
2009-09-16 18:59:13 +00:00
|
|
|
|
2009-10-07 22:05:30 +00:00
|
|
|
node_tree_from_ID(id, &nodetree, &edittree, &treetype);
|
2009-09-16 18:59:13 +00:00
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (treetype==NTREE_SHADER) {
|
2010-12-05 18:59:23 +00:00
|
|
|
DAG_id_tag_update(id, 0);
|
2011-11-02 18:55:32 +00:00
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (GS(id->name) == ID_MA)
|
2011-11-02 18:55:32 +00:00
|
|
|
WM_main_add_notifier(NC_MATERIAL|ND_SHADING_DRAW, id);
|
2012-03-24 06:38:07 +00:00
|
|
|
else if (GS(id->name) == ID_LA)
|
2011-11-02 18:55:32 +00:00
|
|
|
WM_main_add_notifier(NC_LAMP|ND_LIGHTING_DRAW, id);
|
2012-03-24 06:38:07 +00:00
|
|
|
else if (GS(id->name) == ID_WO)
|
2011-11-02 18:55:32 +00:00
|
|
|
WM_main_add_notifier(NC_WORLD|ND_WORLD_DRAW, id);
|
2009-09-16 18:59:13 +00:00
|
|
|
}
|
2012-03-24 06:38:07 +00:00
|
|
|
else if (treetype==NTREE_COMPOSIT) {
|
|
|
|
if (node)
|
2011-11-07 17:30:52 +00:00
|
|
|
nodeUpdate(edittree, node);
|
2009-09-16 18:59:13 +00:00
|
|
|
/* don't use NodeTagIDChanged, it gives far too many recomposites for image, scene layers, ... */
|
|
|
|
|
2010-01-27 05:42:17 +00:00
|
|
|
node= node_tree_get_editgroup(nodetree);
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node)
|
2011-10-19 17:08:35 +00:00
|
|
|
nodeUpdateID(nodetree, node->id);
|
2009-10-07 22:05:30 +00:00
|
|
|
|
|
|
|
WM_main_add_notifier(NC_SCENE|ND_NODES, id);
|
2009-09-16 18:59:13 +00:00
|
|
|
}
|
2012-03-24 06:38:07 +00:00
|
|
|
else if (treetype==NTREE_TEXTURE) {
|
2010-12-05 18:59:23 +00:00
|
|
|
DAG_id_tag_update(id, 0);
|
2009-10-07 22:05:30 +00:00
|
|
|
WM_main_add_notifier(NC_TEXTURE|ND_NODES, id);
|
2009-09-16 18:59:13 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-03-15 04:54:31 +00:00
|
|
|
static int has_nodetree(bNodeTree *ntree, bNodeTree *lookup)
|
|
|
|
{
|
|
|
|
bNode *node;
|
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (ntree == lookup)
|
2010-03-15 04:54:31 +00:00
|
|
|
return 1;
|
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
for (node=ntree->nodes.first; node; node=node->next)
|
|
|
|
if (node->type == NODE_GROUP && node->id)
|
|
|
|
if (has_nodetree((bNodeTree*)node->id, lookup))
|
2010-03-15 04:54:31 +00:00
|
|
|
return 1;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2011-09-05 21:01:50 +00:00
|
|
|
typedef struct NodeUpdateCalldata {
|
|
|
|
bNodeTree *ntree;
|
|
|
|
bNode *node;
|
|
|
|
} NodeUpdateCalldata;
|
|
|
|
static void node_generic_update_cb(void *calldata, ID *owner_id, bNodeTree *ntree)
|
|
|
|
{
|
|
|
|
NodeUpdateCalldata *cd= (NodeUpdateCalldata*)calldata;
|
|
|
|
/* check if nodetree uses the group stored in calldata */
|
|
|
|
if (has_nodetree(ntree, cd->ntree))
|
|
|
|
ED_node_changed_update(owner_id, cd->node);
|
|
|
|
}
|
2010-10-15 04:27:09 +00:00
|
|
|
void ED_node_generic_update(Main *bmain, bNodeTree *ntree, bNode *node)
|
2010-03-15 04:54:31 +00:00
|
|
|
{
|
2011-09-05 21:01:50 +00:00
|
|
|
bNodeTreeType *tti= ntreeGetType(ntree->type);
|
|
|
|
NodeUpdateCalldata cd;
|
|
|
|
cd.ntree = ntree;
|
|
|
|
cd.node = node;
|
2010-03-15 04:54:31 +00:00
|
|
|
/* look through all datablocks, to support groups */
|
2011-09-05 21:01:50 +00:00
|
|
|
tti->foreach_nodetree(bmain, &cd, node_generic_update_cb);
|
2010-04-05 17:30:11 +00:00
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (ntree->type == NTREE_TEXTURE)
|
2010-04-05 17:30:11 +00:00
|
|
|
ntreeTexCheckCyclics(ntree);
|
2010-03-15 04:54:31 +00:00
|
|
|
}
|
|
|
|
|
2009-09-16 18:59:13 +00:00
|
|
|
static void do_node_internal_buttons(bContext *C, void *node_v, int event)
|
|
|
|
{
|
2012-03-24 06:38:07 +00:00
|
|
|
if (event==B_NODE_EXEC) {
|
2009-10-07 22:05:30 +00:00
|
|
|
SpaceNode *snode= CTX_wm_space_node(C);
|
2012-03-24 06:38:07 +00:00
|
|
|
if (snode && snode->id)
|
2009-10-07 22:05:30 +00:00
|
|
|
ED_node_changed_update(snode->id, node_v);
|
|
|
|
}
|
2009-09-16 18:59:13 +00:00
|
|
|
}
|
|
|
|
|
2009-02-17 13:37:06 +00:00
|
|
|
|
2008-12-24 10:33:10 +00:00
|
|
|
static void node_scaling_widget(int color_id, float aspect, float xmin, float ymin, float xmax, float ymax)
|
|
|
|
{
|
|
|
|
float dx;
|
|
|
|
float dy;
|
|
|
|
|
|
|
|
dx= 0.5f*(xmax-xmin);
|
|
|
|
dy= 0.5f*(ymax-ymin);
|
|
|
|
|
|
|
|
UI_ThemeColorShade(color_id, +30);
|
|
|
|
fdrawline(xmin, ymin, xmax, ymax);
|
|
|
|
fdrawline(xmin+dx, ymin, xmax, ymax-dy);
|
|
|
|
|
|
|
|
UI_ThemeColorShade(color_id, -10);
|
|
|
|
fdrawline(xmin, ymin+aspect, xmax, ymax+aspect);
|
|
|
|
fdrawline(xmin+dx, ymin+aspect, xmax, ymax-dy+aspect);
|
|
|
|
}
|
|
|
|
|
2010-01-12 07:07:51 +00:00
|
|
|
static void node_uiblocks_init(const bContext *C, bNodeTree *ntree)
|
|
|
|
{
|
|
|
|
bNode *node;
|
2012-01-11 09:33:44 +00:00
|
|
|
char uiblockstr[32];
|
2010-01-12 07:07:51 +00:00
|
|
|
|
2011-11-22 17:49:06 +00:00
|
|
|
/* add node uiBlocks in drawing order - prevents events going to overlapping nodes */
|
2010-01-12 07:07:51 +00:00
|
|
|
|
2012-01-11 09:33:44 +00:00
|
|
|
for (node= ntree->nodes.first; node; node= node->next) {
|
|
|
|
/* ui block */
|
2012-01-11 12:56:31 +00:00
|
|
|
BLI_snprintf(uiblockstr, sizeof(uiblockstr), "node buttons %p", (void *)node);
|
2012-01-11 09:33:44 +00:00
|
|
|
node->block= uiBeginBlock(C, CTX_wm_region(C), uiblockstr, UI_EMBOSS);
|
|
|
|
uiBlockSetHandleFunc(node->block, do_node_internal_buttons, node);
|
|
|
|
|
|
|
|
/* this cancels events for background nodes */
|
|
|
|
uiBlockSetFlag(node->block, UI_BLOCK_CLIP_EVENTS);
|
2010-01-12 07:07:51 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-12-24 10:33:10 +00:00
|
|
|
/* based on settings in node, sets drawing rect info. each redraw! */
|
2011-09-05 21:01:50 +00:00
|
|
|
static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node)
|
2008-12-24 10:33:10 +00:00
|
|
|
{
|
2009-09-16 18:59:13 +00:00
|
|
|
uiLayout *layout;
|
|
|
|
PointerRNA ptr;
|
2008-12-24 10:33:10 +00:00
|
|
|
bNodeSocket *nsock;
|
2011-09-05 21:01:50 +00:00
|
|
|
float locx, locy;
|
2011-09-08 07:01:29 +00:00
|
|
|
float dy;
|
2009-09-16 18:59:13 +00:00
|
|
|
int buty;
|
2008-12-24 10:33:10 +00:00
|
|
|
|
2011-09-05 21:01:50 +00:00
|
|
|
/* get "global" coords */
|
|
|
|
nodeSpaceCoords(node, &locx, &locy);
|
|
|
|
dy= locy;
|
|
|
|
|
2008-12-24 10:33:10 +00:00
|
|
|
/* header */
|
|
|
|
dy-= NODE_DY;
|
|
|
|
|
|
|
|
/* little bit space in top */
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->outputs.first)
|
2008-12-24 10:33:10 +00:00
|
|
|
dy-= NODE_DYS/2;
|
2009-09-16 18:59:13 +00:00
|
|
|
|
2008-12-24 10:33:10 +00:00
|
|
|
/* output sockets */
|
2012-03-24 06:38:07 +00:00
|
|
|
for (nsock= node->outputs.first; nsock; nsock= nsock->next) {
|
|
|
|
if (!nodeSocketIsHidden(nsock)) {
|
2011-09-05 21:01:50 +00:00
|
|
|
nsock->locx= locx + node->width;
|
2008-12-24 10:33:10 +00:00
|
|
|
nsock->locy= dy - NODE_DYS;
|
|
|
|
dy-= NODE_DY;
|
|
|
|
}
|
|
|
|
}
|
2009-09-16 18:59:13 +00:00
|
|
|
|
2012-03-24 02:51:46 +00:00
|
|
|
node->prvr.xmin = locx + NODE_DYS;
|
|
|
|
node->prvr.xmax = locx + node->width- NODE_DYS;
|
2010-02-16 15:59:36 +00:00
|
|
|
|
2008-12-24 10:33:10 +00:00
|
|
|
/* preview rect? */
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->flag & NODE_PREVIEW) {
|
2008-12-24 10:33:10 +00:00
|
|
|
/* only recalculate size when there's a preview actually, otherwise we use stored result */
|
2009-09-30 18:18:32 +00:00
|
|
|
BLI_lock_thread(LOCK_PREVIEW);
|
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->preview && node->preview->rect) {
|
2008-12-24 10:33:10 +00:00
|
|
|
float aspect= 1.0f;
|
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->preview && node->preview->xsize && node->preview->ysize)
|
2008-12-24 10:33:10 +00:00
|
|
|
aspect= (float)node->preview->ysize/(float)node->preview->xsize;
|
|
|
|
|
|
|
|
dy-= NODE_DYS/2;
|
2012-03-24 02:51:46 +00:00
|
|
|
node->prvr.ymax = dy;
|
2008-12-24 10:33:10 +00:00
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (aspect <= 1.0f)
|
2012-03-24 02:51:46 +00:00
|
|
|
node->prvr.ymin = dy - aspect*(node->width-NODE_DY);
|
2008-12-24 10:33:10 +00:00
|
|
|
else {
|
|
|
|
float dx= (node->width - NODE_DYS) - (node->width- NODE_DYS)/aspect; /* width correction of image */
|
|
|
|
|
2012-03-24 02:51:46 +00:00
|
|
|
node->prvr.ymin = dy - (node->width-NODE_DY);
|
2008-12-24 10:33:10 +00:00
|
|
|
|
|
|
|
node->prvr.xmin+= 0.5f*dx;
|
|
|
|
node->prvr.xmax-= 0.5f*dx;
|
|
|
|
}
|
|
|
|
|
|
|
|
dy= node->prvr.ymin - NODE_DYS/2;
|
|
|
|
|
|
|
|
/* make sure that maximums are bigger or equal to minimums */
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->prvr.xmax < node->prvr.xmin) SWAP(float, node->prvr.xmax, node->prvr.xmin);
|
|
|
|
if (node->prvr.ymax < node->prvr.ymin) SWAP(float, node->prvr.ymax, node->prvr.ymin);
|
2008-12-24 10:33:10 +00:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
float oldh= node->prvr.ymax - node->prvr.ymin;
|
2012-03-24 06:38:07 +00:00
|
|
|
if (oldh==0.0f)
|
2008-12-24 10:33:10 +00:00
|
|
|
oldh= 0.6f*node->width-NODE_DY;
|
|
|
|
dy-= NODE_DYS/2;
|
2012-03-24 02:51:46 +00:00
|
|
|
node->prvr.ymax = dy;
|
|
|
|
node->prvr.ymin = dy - oldh;
|
2008-12-24 10:33:10 +00:00
|
|
|
dy= node->prvr.ymin - NODE_DYS/2;
|
|
|
|
}
|
2009-09-30 18:18:32 +00:00
|
|
|
|
|
|
|
BLI_unlock_thread(LOCK_PREVIEW);
|
2008-12-24 10:33:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* buttons rect? */
|
2012-03-24 06:38:07 +00:00
|
|
|
if ((node->flag & NODE_OPTIONS) && node->typeinfo->uifunc) {
|
2008-12-24 10:33:10 +00:00
|
|
|
dy-= NODE_DYS/2;
|
2009-09-16 18:59:13 +00:00
|
|
|
|
|
|
|
/* set this for uifunc() that don't use layout engine yet */
|
2012-03-24 02:51:46 +00:00
|
|
|
node->butr.xmin = 0;
|
|
|
|
node->butr.xmax = node->width - 2*NODE_DYS;
|
|
|
|
node->butr.ymin = 0;
|
|
|
|
node->butr.ymax = 0;
|
2011-03-11 03:27:38 +00:00
|
|
|
|
2009-09-16 18:59:13 +00:00
|
|
|
RNA_pointer_create(&ntree->id, &RNA_Node, node, &ptr);
|
2011-09-05 21:01:50 +00:00
|
|
|
|
2009-09-16 18:59:13 +00:00
|
|
|
layout= uiBlockLayout(node->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL,
|
2011-09-15 13:02:37 +00:00
|
|
|
locx+NODE_DYS, dy, node->butr.xmax, NODE_DY, UI_GetStyle());
|
2012-05-02 07:18:51 +00:00
|
|
|
uiLayoutSetContextPointer(layout, "node", &ptr);
|
2011-09-05 21:01:50 +00:00
|
|
|
|
2009-11-10 04:01:44 +00:00
|
|
|
node->typeinfo->uifunc(layout, (bContext *)C, &ptr);
|
2011-09-05 21:01:50 +00:00
|
|
|
|
2009-09-16 18:59:13 +00:00
|
|
|
uiBlockEndAlign(node->block);
|
|
|
|
uiBlockLayoutResolve(node->block, NULL, &buty);
|
2011-09-05 21:01:50 +00:00
|
|
|
|
2009-09-16 18:59:13 +00:00
|
|
|
dy= buty - NODE_DYS/2;
|
2008-12-24 10:33:10 +00:00
|
|
|
}
|
2009-09-16 18:59:13 +00:00
|
|
|
|
2008-12-24 10:33:10 +00:00
|
|
|
/* input sockets */
|
2012-03-24 06:38:07 +00:00
|
|
|
for (nsock= node->inputs.first; nsock; nsock= nsock->next) {
|
|
|
|
if (!nodeSocketIsHidden(nsock)) {
|
2011-09-05 21:01:50 +00:00
|
|
|
nsock->locx= locx;
|
2008-12-24 10:33:10 +00:00
|
|
|
nsock->locy= dy - NODE_DYS;
|
|
|
|
dy-= NODE_DY;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* little bit space in end */
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->inputs.first || (node->flag & (NODE_OPTIONS|NODE_PREVIEW))==0 )
|
2008-12-24 10:33:10 +00:00
|
|
|
dy-= NODE_DYS/2;
|
2009-09-16 18:59:13 +00:00
|
|
|
|
2012-03-24 02:51:46 +00:00
|
|
|
node->totr.xmin = locx;
|
|
|
|
node->totr.xmax = locx + node->width;
|
|
|
|
node->totr.ymax = locy;
|
|
|
|
node->totr.ymin = MIN2(dy, locy-2*NODE_DY);
|
2011-11-22 17:49:06 +00:00
|
|
|
|
|
|
|
/* Set the block bounds to clip mouse events from underlying nodes.
|
|
|
|
* Add a margin for sockets on each side.
|
|
|
|
*/
|
|
|
|
uiExplicitBoundsBlock(node->block,
|
|
|
|
node->totr.xmin - NODE_SOCKSIZE,
|
|
|
|
node->totr.ymin,
|
|
|
|
node->totr.xmax + NODE_SOCKSIZE,
|
|
|
|
node->totr.ymax);
|
2008-12-24 10:33:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* based on settings in node, sets drawing rect info. each redraw! */
|
2010-10-15 04:27:09 +00:00
|
|
|
static void node_update_hidden(bNode *node)
|
2008-12-24 10:33:10 +00:00
|
|
|
{
|
|
|
|
bNodeSocket *nsock;
|
2011-09-05 21:01:50 +00:00
|
|
|
float locx, locy;
|
2008-12-24 10:33:10 +00:00
|
|
|
float rad, drad, hiddenrad= HIDDEN_RAD;
|
|
|
|
int totin=0, totout=0, tot;
|
|
|
|
|
2011-09-05 21:01:50 +00:00
|
|
|
/* get "global" coords */
|
|
|
|
nodeSpaceCoords(node, &locx, &locy);
|
|
|
|
|
2008-12-24 10:33:10 +00:00
|
|
|
/* calculate minimal radius */
|
2012-03-24 06:38:07 +00:00
|
|
|
for (nsock= node->inputs.first; nsock; nsock= nsock->next)
|
|
|
|
if (!nodeSocketIsHidden(nsock))
|
2008-12-24 10:33:10 +00:00
|
|
|
totin++;
|
2012-03-24 06:38:07 +00:00
|
|
|
for (nsock= node->outputs.first; nsock; nsock= nsock->next)
|
|
|
|
if (!nodeSocketIsHidden(nsock))
|
2008-12-24 10:33:10 +00:00
|
|
|
totout++;
|
|
|
|
|
|
|
|
tot= MAX2(totin, totout);
|
2012-03-24 06:38:07 +00:00
|
|
|
if (tot>4) {
|
2008-12-24 10:33:10 +00:00
|
|
|
hiddenrad += 5.0f*(float)(tot-4);
|
|
|
|
}
|
|
|
|
|
2012-03-24 02:51:46 +00:00
|
|
|
node->totr.xmin = locx;
|
|
|
|
node->totr.xmax = locx + 3*hiddenrad + node->miniwidth;
|
|
|
|
node->totr.ymax = locy + (hiddenrad - 0.5f*NODE_DY);
|
|
|
|
node->totr.ymin = node->totr.ymax - 2*hiddenrad;
|
2008-12-24 10:33:10 +00:00
|
|
|
|
|
|
|
/* output sockets */
|
|
|
|
rad=drad= (float)M_PI/(1.0f + (float)totout);
|
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
for (nsock= node->outputs.first; nsock; nsock= nsock->next) {
|
|
|
|
if (!nodeSocketIsHidden(nsock)) {
|
2008-12-24 10:33:10 +00:00
|
|
|
nsock->locx= node->totr.xmax - hiddenrad + (float)sin(rad)*hiddenrad;
|
|
|
|
nsock->locy= node->totr.ymin + hiddenrad + (float)cos(rad)*hiddenrad;
|
|
|
|
rad+= drad;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* input sockets */
|
|
|
|
rad=drad= - (float)M_PI/(1.0f + (float)totin);
|
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
for (nsock= node->inputs.first; nsock; nsock= nsock->next) {
|
|
|
|
if (!nodeSocketIsHidden(nsock)) {
|
2008-12-24 10:33:10 +00:00
|
|
|
nsock->locx= node->totr.xmin + hiddenrad + (float)sin(rad)*hiddenrad;
|
|
|
|
nsock->locy= node->totr.ymin + hiddenrad + (float)cos(rad)*hiddenrad;
|
|
|
|
rad+= drad;
|
|
|
|
}
|
|
|
|
}
|
2011-11-22 17:49:06 +00:00
|
|
|
|
|
|
|
/* Set the block bounds to clip mouse events from underlying nodes.
|
|
|
|
* Add a margin for sockets on each side.
|
|
|
|
*/
|
|
|
|
uiExplicitBoundsBlock(node->block,
|
|
|
|
node->totr.xmin - NODE_SOCKSIZE,
|
|
|
|
node->totr.ymin,
|
|
|
|
node->totr.xmax + NODE_SOCKSIZE,
|
|
|
|
node->totr.ymax);
|
2008-12-24 10:33:10 +00:00
|
|
|
}
|
|
|
|
|
2011-09-05 21:01:50 +00:00
|
|
|
void node_update_default(const bContext *C, bNodeTree *ntree, bNode *node)
|
|
|
|
{
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->flag & NODE_HIDDEN)
|
2011-09-05 21:01:50 +00:00
|
|
|
node_update_hidden(node);
|
|
|
|
else
|
|
|
|
node_update_basis(C, ntree, node);
|
|
|
|
}
|
|
|
|
|
2008-12-24 10:33:10 +00:00
|
|
|
static int node_get_colorid(bNode *node)
|
|
|
|
{
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->typeinfo->nclass==NODE_CLASS_INPUT)
|
2008-12-24 10:33:10 +00:00
|
|
|
return TH_NODE_IN_OUT;
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->typeinfo->nclass==NODE_CLASS_OUTPUT) {
|
|
|
|
if (node->flag & NODE_DO_OUTPUT)
|
2008-12-24 10:33:10 +00:00
|
|
|
return TH_NODE_IN_OUT;
|
|
|
|
else
|
|
|
|
return TH_NODE;
|
|
|
|
}
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->typeinfo->nclass==NODE_CLASS_CONVERTOR)
|
2008-12-24 10:33:10 +00:00
|
|
|
return TH_NODE_CONVERTOR;
|
2012-03-24 06:38:07 +00:00
|
|
|
if (ELEM3(node->typeinfo->nclass, NODE_CLASS_OP_COLOR, NODE_CLASS_OP_VECTOR, NODE_CLASS_OP_FILTER))
|
2008-12-24 10:33:10 +00:00
|
|
|
return TH_NODE_OPERATOR;
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->typeinfo->nclass==NODE_CLASS_GROUP)
|
2008-12-24 10:33:10 +00:00
|
|
|
return TH_NODE_GROUP;
|
|
|
|
return TH_NODE;
|
|
|
|
}
|
|
|
|
|
2011-11-20 16:38:23 +00:00
|
|
|
/* note: in cmp_util.c is similar code, for node_compo_pass_on()
|
|
|
|
* the same goes for shader and texture nodes. */
|
2011-07-12 18:59:54 +00:00
|
|
|
/* note: in node_edit.c is similar code, for untangle node */
|
2008-12-24 10:33:10 +00:00
|
|
|
static void node_draw_mute_line(View2D *v2d, SpaceNode *snode, bNode *node)
|
|
|
|
{
|
2011-11-20 16:38:23 +00:00
|
|
|
ListBase links;
|
2012-02-27 17:38:16 +00:00
|
|
|
bNodeLink *link;
|
2011-11-20 16:38:23 +00:00
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->typeinfo->internal_connect == NULL)
|
2011-11-20 16:38:23 +00:00
|
|
|
return;
|
|
|
|
|
2012-02-27 17:38:16 +00:00
|
|
|
/* Get default muting links. */
|
|
|
|
links = node->typeinfo->internal_connect(snode->edittree, node);
|
2011-11-20 16:38:23 +00:00
|
|
|
|
2008-12-24 10:33:10 +00:00
|
|
|
glEnable(GL_BLEND);
|
2011-11-20 16:38:23 +00:00
|
|
|
glEnable(GL_LINE_SMOOTH);
|
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
for (link = links.first; link; link = link->next)
|
2012-02-27 17:38:16 +00:00
|
|
|
node_draw_link_bezier(v2d, snode, link, TH_REDALERT, 0, TH_WIRE, 0, TH_WIRE);
|
2011-11-20 16:38:23 +00:00
|
|
|
|
2008-12-24 10:33:10 +00:00
|
|
|
glDisable(GL_BLEND);
|
2011-11-20 16:38:23 +00:00
|
|
|
glDisable(GL_LINE_SMOOTH);
|
|
|
|
|
|
|
|
BLI_freelistN(&links);
|
2008-12-24 10:33:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* this might have some more generic use */
|
2012-03-09 10:16:41 +00:00
|
|
|
static void node_circle_draw(float x, float y, float size, char *col, int highlight)
|
2008-12-24 10:33:10 +00:00
|
|
|
{
|
|
|
|
/* 16 values of sin function */
|
|
|
|
static float si[16] = {
|
2012-04-29 15:47:02 +00:00
|
|
|
0.00000000f, 0.39435585f, 0.72479278f, 0.93775213f,
|
|
|
|
0.99871650f, 0.89780453f, 0.65137248f, 0.29936312f,
|
|
|
|
-0.10116832f, -0.48530196f, -0.79077573f, -0.96807711f,
|
|
|
|
-0.98846832f, -0.84864425f, -0.57126821f, -0.20129852f
|
2008-12-24 10:33:10 +00:00
|
|
|
};
|
|
|
|
/* 16 values of cos function */
|
|
|
|
static float co[16] ={
|
2012-04-29 15:47:02 +00:00
|
|
|
1.00000000f, 0.91895781f, 0.68896691f, 0.34730525f,
|
|
|
|
-0.05064916f, -0.44039415f, -0.75875812f, -0.95413925f,
|
|
|
|
-0.99486932f, -0.87434661f, -0.61210598f, -0.25065253f,
|
|
|
|
0.15142777f, 0.52896401f, 0.82076344f, 0.97952994f,
|
2008-12-24 10:33:10 +00:00
|
|
|
};
|
|
|
|
int a;
|
|
|
|
|
|
|
|
glColor3ub(col[0], col[1], col[2]);
|
|
|
|
|
|
|
|
glBegin(GL_POLYGON);
|
2012-03-24 06:38:07 +00:00
|
|
|
for (a=0; a<16; a++)
|
2008-12-24 10:33:10 +00:00
|
|
|
glVertex2f(x+size*si[a], y+size*co[a]);
|
|
|
|
glEnd();
|
|
|
|
|
2012-03-09 10:16:41 +00:00
|
|
|
if (highlight) {
|
|
|
|
UI_ThemeColor(TH_TEXT_HI);
|
|
|
|
glLineWidth(1.5f);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
glColor4ub(0, 0, 0, 150);
|
|
|
|
}
|
2008-12-24 10:33:10 +00:00
|
|
|
glEnable(GL_BLEND);
|
2012-04-29 17:11:40 +00:00
|
|
|
glEnable(GL_LINE_SMOOTH);
|
2008-12-24 10:33:10 +00:00
|
|
|
glBegin(GL_LINE_LOOP);
|
2012-03-24 06:38:07 +00:00
|
|
|
for (a=0; a<16; a++)
|
2008-12-24 10:33:10 +00:00
|
|
|
glVertex2f(x+size*si[a], y+size*co[a]);
|
|
|
|
glEnd();
|
2012-04-29 17:11:40 +00:00
|
|
|
glDisable(GL_LINE_SMOOTH);
|
2008-12-24 10:33:10 +00:00
|
|
|
glDisable(GL_BLEND);
|
2012-03-09 10:16:41 +00:00
|
|
|
glLineWidth(1.0f);
|
2008-12-24 10:33:10 +00:00
|
|
|
}
|
|
|
|
|
2011-09-05 21:01:50 +00:00
|
|
|
void node_socket_circle_draw(bNodeTree *UNUSED(ntree), bNodeSocket *sock, float size)
|
2008-12-24 10:33:10 +00:00
|
|
|
{
|
2011-09-05 21:01:50 +00:00
|
|
|
bNodeSocketType *stype = ntreeGetSocketType(sock->type);
|
2012-03-09 10:16:41 +00:00
|
|
|
node_circle_draw(sock->locx, sock->locy, size, stype->ui_color, (sock->flag & SELECT));
|
2008-12-24 10:33:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* ************** Socket callbacks *********** */
|
|
|
|
|
|
|
|
/* not a callback */
|
|
|
|
static void node_draw_preview(bNodePreview *preview, rctf *prv)
|
|
|
|
{
|
|
|
|
float xscale= (prv->xmax-prv->xmin)/((float)preview->xsize);
|
|
|
|
float yscale= (prv->ymax-prv->ymin)/((float)preview->ysize);
|
|
|
|
float tile= (prv->xmax - prv->xmin) / 10.0f;
|
|
|
|
float x, y;
|
|
|
|
|
|
|
|
/* draw checkerboard backdrop to show alpha */
|
|
|
|
glColor3ub(120, 120, 120);
|
|
|
|
glRectf(prv->xmin, prv->ymin, prv->xmax, prv->ymax);
|
|
|
|
glColor3ub(160, 160, 160);
|
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
for (y=prv->ymin; y<prv->ymax; y+=tile*2) {
|
|
|
|
for (x=prv->xmin; x<prv->xmax; x+=tile*2) {
|
2008-12-24 10:33:10 +00:00
|
|
|
float tilex= tile, tiley= tile;
|
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (x+tile > prv->xmax)
|
2008-12-24 10:33:10 +00:00
|
|
|
tilex= prv->xmax-x;
|
2012-03-24 06:38:07 +00:00
|
|
|
if (y+tile > prv->ymax)
|
2008-12-24 10:33:10 +00:00
|
|
|
tiley= prv->ymax-y;
|
|
|
|
|
|
|
|
glRectf(x, y, x + tilex, y + tiley);
|
|
|
|
}
|
|
|
|
}
|
2012-03-24 06:38:07 +00:00
|
|
|
for (y=prv->ymin+tile; y<prv->ymax; y+=tile*2) {
|
|
|
|
for (x=prv->xmin+tile; x<prv->xmax; x+=tile*2) {
|
2008-12-24 10:33:10 +00:00
|
|
|
float tilex= tile, tiley= tile;
|
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (x+tile > prv->xmax)
|
2008-12-24 10:33:10 +00:00
|
|
|
tilex= prv->xmax-x;
|
2012-03-24 06:38:07 +00:00
|
|
|
if (y+tile > prv->ymax)
|
2008-12-24 10:33:10 +00:00
|
|
|
tiley= prv->ymax-y;
|
|
|
|
|
|
|
|
glRectf(x, y, x + tilex, y + tiley);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-06-14 07:02:11 +00:00
|
|
|
glPixelZoom(xscale, yscale);
|
2008-12-24 10:33:10 +00:00
|
|
|
|
|
|
|
glEnable(GL_BLEND);
|
2012-04-29 17:11:40 +00:00
|
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); /* premul graphics */
|
2008-12-24 10:33:10 +00:00
|
|
|
|
|
|
|
glColor4f(1.0, 1.0, 1.0, 1.0);
|
2009-10-07 22:05:30 +00:00
|
|
|
glaDrawPixelsTex(prv->xmin, prv->ymin, preview->xsize, preview->ysize, GL_UNSIGNED_BYTE, preview->rect);
|
2008-12-24 10:33:10 +00:00
|
|
|
|
|
|
|
glDisable(GL_BLEND);
|
|
|
|
glPixelZoom(1.0f, 1.0f);
|
|
|
|
|
|
|
|
UI_ThemeColorShadeAlpha(TH_BACK, -15, +100);
|
|
|
|
fdrawbox(prv->xmin, prv->ymin, prv->xmax, prv->ymax);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2011-12-18 12:51:50 +00:00
|
|
|
/* common handle function for operator buttons that need to select the node first */
|
|
|
|
static void node_toggle_button_cb(struct bContext *C, void *node_argv, void *op_argv)
|
|
|
|
{
|
|
|
|
bNode *node = (bNode*)node_argv;
|
|
|
|
const char *opname = (const char *)op_argv;
|
|
|
|
|
|
|
|
/* select & activate only the button's node */
|
|
|
|
node_select_single(C, node);
|
|
|
|
|
|
|
|
WM_operator_name_call(C, opname, WM_OP_INVOKE_DEFAULT, NULL);
|
|
|
|
}
|
|
|
|
|
2010-12-07 11:03:53 +00:00
|
|
|
static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree, bNode *node)
|
2008-12-24 10:33:10 +00:00
|
|
|
{
|
|
|
|
bNodeSocket *sock;
|
|
|
|
rctf *rct= &node->totr;
|
2011-02-21 13:47:49 +00:00
|
|
|
float iconofs;
|
2011-09-05 23:40:52 +00:00
|
|
|
/* float socket_size= NODE_SOCKSIZE*U.dpi/72; */ /* UNUSED */
|
2011-06-14 15:55:46 +00:00
|
|
|
float iconbutw= 0.8f*UI_UNIT_X;
|
2011-02-21 13:47:49 +00:00
|
|
|
int color_id= node_get_colorid(node);
|
2008-12-24 10:33:10 +00:00
|
|
|
char showname[128]; /* 128 used below */
|
|
|
|
View2D *v2d = &ar->v2d;
|
|
|
|
|
2010-06-14 07:02:11 +00:00
|
|
|
/* hurmf... another candidate for callback, have to see how this works first */
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->id && node->block && snode->treetype==NTREE_SHADER)
|
2010-06-14 07:02:11 +00:00
|
|
|
nodeShaderSynchronizeID(node, 0);
|
|
|
|
|
|
|
|
/* skip if out of view */
|
|
|
|
if (node->totr.xmax < ar->v2d.cur.xmin || node->totr.xmin > ar->v2d.cur.xmax ||
|
|
|
|
node->totr.ymax < ar->v2d.cur.ymin || node->totr.ymin > ar->v2d.cur.ymax) {
|
|
|
|
|
|
|
|
uiEndBlock(C, node->block);
|
|
|
|
node->block= NULL;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2011-09-11 06:41:09 +00:00
|
|
|
uiSetRoundBox(UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT | UI_CNR_BOTTOM_LEFT);
|
2008-12-24 10:33:10 +00:00
|
|
|
ui_dropshadow(rct, BASIS_RAD, snode->aspect, node->flag & SELECT);
|
|
|
|
|
|
|
|
/* header */
|
2012-03-24 06:38:07 +00:00
|
|
|
if (color_id==TH_NODE)
|
2008-12-24 10:33:10 +00:00
|
|
|
UI_ThemeColorShade(color_id, -20);
|
|
|
|
else
|
|
|
|
UI_ThemeColor(color_id);
|
2010-12-27 09:43:22 +00:00
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->flag & NODE_MUTED)
|
2011-11-11 13:09:14 +00:00
|
|
|
UI_ThemeColorBlend(color_id, TH_REDALERT, 0.5f);
|
|
|
|
|
2011-09-11 06:41:09 +00:00
|
|
|
uiSetRoundBox(UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT);
|
2008-12-24 10:33:10 +00:00
|
|
|
uiRoundBox(rct->xmin, rct->ymax-NODE_DY, rct->xmax, rct->ymax, BASIS_RAD);
|
|
|
|
|
2011-12-18 12:51:50 +00:00
|
|
|
/* show/hide icons */
|
2011-02-18 17:53:11 +00:00
|
|
|
iconofs= rct->xmax - 7.0f;
|
2008-12-24 10:33:10 +00:00
|
|
|
|
2011-12-18 12:51:50 +00:00
|
|
|
/* preview */
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->typeinfo->flag & NODE_PREVIEW) {
|
2011-12-18 12:51:50 +00:00
|
|
|
uiBut *but;
|
2011-06-14 15:55:46 +00:00
|
|
|
iconofs-=iconbutw;
|
2011-12-18 12:51:50 +00:00
|
|
|
uiBlockSetEmboss(node->block, UI_EMBOSSN);
|
|
|
|
but = uiDefIconBut(node->block, TOGBUT, B_REDR, ICON_MATERIAL,
|
|
|
|
iconofs, rct->ymax-NODE_DY, iconbutw, UI_UNIT_Y, NULL, 0, 0, 0, 0, "");
|
|
|
|
uiButSetFunc(but, node_toggle_button_cb, node, (void*)"NODE_OT_preview_toggle");
|
|
|
|
/* XXX this does not work when node is activated and the operator called right afterwards,
|
|
|
|
* since active ID is not updated yet (needs to process the notifier).
|
|
|
|
* This can only work as visual indicator!
|
|
|
|
*/
|
|
|
|
// if (!(node->flag & (NODE_ACTIVE_ID|NODE_DO_OUTPUT)))
|
|
|
|
// uiButSetFlag(but, UI_BUT_DISABLED);
|
|
|
|
uiBlockSetEmboss(node->block, UI_EMBOSS);
|
2008-12-24 10:33:10 +00:00
|
|
|
}
|
2011-12-18 12:51:50 +00:00
|
|
|
/* group edit */
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->type == NODE_GROUP) {
|
2011-12-18 12:51:50 +00:00
|
|
|
uiBut *but;
|
2011-06-14 15:55:46 +00:00
|
|
|
iconofs-=iconbutw;
|
2011-12-18 12:51:50 +00:00
|
|
|
uiBlockSetEmboss(node->block, UI_EMBOSSN);
|
|
|
|
but = uiDefIconBut(node->block, TOGBUT, B_REDR, ICON_NODETREE,
|
|
|
|
iconofs, rct->ymax-NODE_DY, iconbutw, UI_UNIT_Y, NULL, 0, 0, 0, 0, "");
|
|
|
|
uiButSetFunc(but, node_toggle_button_cb, node, (void*)"NODE_OT_group_edit");
|
|
|
|
uiBlockSetEmboss(node->block, UI_EMBOSS);
|
2008-12-24 10:33:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* title */
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->flag & SELECT)
|
2008-12-24 10:33:10 +00:00
|
|
|
UI_ThemeColor(TH_TEXT_HI);
|
|
|
|
else
|
|
|
|
UI_ThemeColorBlendShade(TH_TEXT, color_id, 0.4f, 10);
|
|
|
|
|
|
|
|
/* open/close entirely? */
|
2011-12-18 12:51:50 +00:00
|
|
|
{
|
|
|
|
uiBut *but;
|
|
|
|
int but_size = UI_UNIT_X *0.6f;
|
|
|
|
/* XXX button uses a custom triangle draw below, so make it invisible without icon */
|
|
|
|
uiBlockSetEmboss(node->block, UI_EMBOSSN);
|
|
|
|
but = uiDefBut(node->block, TOGBUT, B_REDR, "",
|
|
|
|
rct->xmin+10.0f-but_size/2, rct->ymax-NODE_DY/2.0f-but_size/2, but_size, but_size, NULL, 0, 0, 0, 0, "");
|
|
|
|
uiButSetFunc(but, node_toggle_button_cb, node, (void*)"NODE_OT_hide_toggle");
|
|
|
|
uiBlockSetEmboss(node->block, UI_EMBOSS);
|
|
|
|
|
|
|
|
/* custom draw function for this button */
|
|
|
|
UI_DrawTriIcon(rct->xmin+10.0f, rct->ymax-NODE_DY/2.0f, 'v');
|
|
|
|
}
|
2008-12-24 10:33:10 +00:00
|
|
|
|
2012-03-03 16:31:46 +00:00
|
|
|
/* this isn't doing anything for the label, so commenting out */
|
|
|
|
#if 0
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->flag & SELECT)
|
2008-12-24 10:33:10 +00:00
|
|
|
UI_ThemeColor(TH_TEXT_HI);
|
|
|
|
else
|
2012-03-03 16:31:46 +00:00
|
|
|
UI_ThemeColor(TH_TEXT);
|
|
|
|
#endif
|
2008-12-24 10:33:10 +00:00
|
|
|
|
2011-09-05 21:01:50 +00:00
|
|
|
BLI_strncpy(showname, nodeLabel(node), sizeof(showname));
|
|
|
|
|
2012-04-21 12:51:47 +00:00
|
|
|
//if (node->flag & NODE_MUTED)
|
2012-03-18 07:38:51 +00:00
|
|
|
// BLI_snprintf(showname, sizeof(showname), "[%s]", showname); // XXX - don't print into self!
|
2008-12-24 10:33:10 +00:00
|
|
|
|
2009-09-16 18:59:13 +00:00
|
|
|
uiDefBut(node->block, LABEL, 0, showname, (short)(rct->xmin+15), (short)(rct->ymax-NODE_DY),
|
2009-04-20 12:03:55 +00:00
|
|
|
(int)(iconofs - rct->xmin-18.0f), NODE_DY, NULL, 0, 0, 0, 0, "");
|
2008-12-24 10:33:10 +00:00
|
|
|
|
|
|
|
/* body */
|
|
|
|
UI_ThemeColor4(TH_NODE);
|
|
|
|
glEnable(GL_BLEND);
|
2011-09-11 06:41:09 +00:00
|
|
|
uiSetRoundBox(UI_CNR_BOTTOM_LEFT);
|
2008-12-24 10:33:10 +00:00
|
|
|
uiRoundBox(rct->xmin, rct->ymin, rct->xmax, rct->ymax-NODE_DY, BASIS_RAD);
|
|
|
|
glDisable(GL_BLEND);
|
|
|
|
|
|
|
|
/* scaling indicator */
|
|
|
|
node_scaling_widget(TH_NODE, snode->aspect, rct->xmax-BASIS_RAD*snode->aspect, rct->ymin, rct->xmax, rct->ymin+BASIS_RAD*snode->aspect);
|
|
|
|
|
2011-01-09 18:59:35 +00:00
|
|
|
/* outline active and selected emphasis */
|
2012-03-24 06:38:07 +00:00
|
|
|
if ( node->flag & (NODE_ACTIVE|SELECT) ) {
|
2008-12-24 10:33:10 +00:00
|
|
|
glEnable(GL_BLEND);
|
2012-04-29 17:11:40 +00:00
|
|
|
glEnable(GL_LINE_SMOOTH);
|
2011-01-09 18:59:35 +00:00
|
|
|
/* using different shades of TH_TEXT_HI for the empasis, like triangle */
|
2012-03-24 06:38:07 +00:00
|
|
|
if ( node->flag & NODE_ACTIVE )
|
2011-01-09 18:59:35 +00:00
|
|
|
UI_ThemeColorShadeAlpha(TH_TEXT_HI, 0, -40);
|
|
|
|
else
|
|
|
|
UI_ThemeColorShadeAlpha(TH_TEXT_HI, -20, -120);
|
2011-09-11 06:41:09 +00:00
|
|
|
uiSetRoundBox(UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT | UI_CNR_BOTTOM_LEFT); // round all corners except lower right
|
2011-01-09 18:59:35 +00:00
|
|
|
uiDrawBox(GL_LINE_LOOP, rct->xmin, rct->ymin, rct->xmax, rct->ymax, BASIS_RAD);
|
|
|
|
|
2012-04-29 17:11:40 +00:00
|
|
|
glDisable(GL_LINE_SMOOTH);
|
2008-12-24 10:33:10 +00:00
|
|
|
glDisable(GL_BLEND);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* disable lines */
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->flag & NODE_MUTED)
|
2008-12-24 10:33:10 +00:00
|
|
|
node_draw_mute_line(v2d, snode, node);
|
|
|
|
|
|
|
|
|
|
|
|
/* socket inputs, buttons */
|
2012-03-24 06:38:07 +00:00
|
|
|
for (sock= node->inputs.first; sock; sock= sock->next) {
|
|
|
|
if (nodeSocketIsHidden(sock))
|
2011-09-05 21:01:50 +00:00
|
|
|
continue;
|
|
|
|
|
|
|
|
node_socket_circle_draw(ntree, sock, NODE_SOCKSIZE);
|
|
|
|
|
2012-05-02 07:18:51 +00:00
|
|
|
node->typeinfo->drawinputfunc(C, node->block, ntree, node, sock, IFACE_(sock->name),
|
|
|
|
sock->locx+NODE_DYS, sock->locy-NODE_DYS, node->width-NODE_DY);
|
2008-12-24 10:33:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* socket outputs */
|
2012-03-24 06:38:07 +00:00
|
|
|
for (sock= node->outputs.first; sock; sock= sock->next) {
|
|
|
|
if (nodeSocketIsHidden(sock))
|
2011-09-05 21:01:50 +00:00
|
|
|
continue;
|
|
|
|
|
|
|
|
node_socket_circle_draw(ntree, sock, NODE_SOCKSIZE);
|
|
|
|
|
2012-05-02 07:18:51 +00:00
|
|
|
node->typeinfo->drawoutputfunc(C, node->block, ntree, node, sock, IFACE_(sock->name),
|
|
|
|
sock->locx-node->width+NODE_DYS, sock->locy-NODE_DYS, node->width-NODE_DY);
|
2008-12-24 10:33:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* preview */
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->flag & NODE_PREVIEW) {
|
2009-09-30 18:18:32 +00:00
|
|
|
BLI_lock_thread(LOCK_PREVIEW);
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->preview && node->preview->rect && !BLI_rctf_is_empty(&node->prvr))
|
2008-12-24 10:33:10 +00:00
|
|
|
node_draw_preview(node->preview, &node->prvr);
|
2009-09-30 18:18:32 +00:00
|
|
|
BLI_unlock_thread(LOCK_PREVIEW);
|
|
|
|
}
|
2010-04-06 09:05:00 +00:00
|
|
|
|
|
|
|
UI_ThemeClearColor(color_id);
|
2008-12-24 10:33:10 +00:00
|
|
|
|
2009-09-16 18:59:13 +00:00
|
|
|
uiEndBlock(C, node->block);
|
|
|
|
uiDrawBlock(C, node->block);
|
|
|
|
node->block= NULL;
|
2008-12-24 10:33:10 +00:00
|
|
|
}
|
|
|
|
|
2009-04-20 12:03:55 +00:00
|
|
|
static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, bNode *node)
|
2008-12-24 10:33:10 +00:00
|
|
|
{
|
|
|
|
bNodeSocket *sock;
|
|
|
|
rctf *rct= &node->totr;
|
|
|
|
float dx, centy= 0.5f*(rct->ymax+rct->ymin);
|
|
|
|
float hiddenrad= 0.5f*(rct->ymax-rct->ymin);
|
2011-06-14 15:55:46 +00:00
|
|
|
float socket_size= NODE_SOCKSIZE*U.dpi/72;
|
2008-12-24 10:33:10 +00:00
|
|
|
int color_id= node_get_colorid(node);
|
2009-09-16 18:59:13 +00:00
|
|
|
char showname[128]; /* 128 is used below */
|
2008-12-24 10:33:10 +00:00
|
|
|
|
|
|
|
/* shadow */
|
2011-09-11 06:41:09 +00:00
|
|
|
uiSetRoundBox(UI_CNR_ALL);
|
2008-12-24 10:33:10 +00:00
|
|
|
ui_dropshadow(rct, hiddenrad, snode->aspect, node->flag & SELECT);
|
|
|
|
|
|
|
|
/* body */
|
2011-01-09 18:59:35 +00:00
|
|
|
UI_ThemeColor(color_id);
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->flag & NODE_MUTED)
|
2011-11-11 13:09:14 +00:00
|
|
|
UI_ThemeColorBlend(color_id, TH_REDALERT, 0.5f);
|
2008-12-24 10:33:10 +00:00
|
|
|
uiRoundBox(rct->xmin, rct->ymin, rct->xmax, rct->ymax, hiddenrad);
|
|
|
|
|
2011-01-09 18:59:35 +00:00
|
|
|
/* outline active and selected emphasis */
|
2012-03-24 06:38:07 +00:00
|
|
|
if ( node->flag & (NODE_ACTIVE|SELECT) ) {
|
2008-12-24 10:33:10 +00:00
|
|
|
glEnable(GL_BLEND);
|
2012-04-29 17:11:40 +00:00
|
|
|
glEnable(GL_LINE_SMOOTH);
|
2011-01-09 18:59:35 +00:00
|
|
|
/* using different shades of TH_TEXT_HI for the empasis, like triangle */
|
2012-03-24 06:38:07 +00:00
|
|
|
if ( node->flag & NODE_ACTIVE )
|
2011-01-09 18:59:35 +00:00
|
|
|
UI_ThemeColorShadeAlpha(TH_TEXT_HI, 0, -40);
|
|
|
|
else
|
|
|
|
UI_ThemeColorShadeAlpha(TH_TEXT_HI, -20, -120);
|
|
|
|
uiDrawBox(GL_LINE_LOOP, rct->xmin, rct->ymin, rct->xmax, rct->ymax, hiddenrad);
|
2012-04-29 17:11:40 +00:00
|
|
|
glDisable(GL_LINE_SMOOTH);
|
2008-12-24 10:33:10 +00:00
|
|
|
glDisable(GL_BLEND);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* title */
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->flag & SELECT)
|
2008-12-24 10:33:10 +00:00
|
|
|
UI_ThemeColor(TH_TEXT_HI);
|
|
|
|
else
|
|
|
|
UI_ThemeColorBlendShade(TH_TEXT, color_id, 0.4f, 10);
|
|
|
|
|
|
|
|
/* open entirely icon */
|
2011-12-18 12:51:50 +00:00
|
|
|
{
|
|
|
|
uiBut *but;
|
|
|
|
int but_size = UI_UNIT_X *0.6f;
|
|
|
|
/* XXX button uses a custom triangle draw below, so make it invisible without icon */
|
|
|
|
uiBlockSetEmboss(node->block, UI_EMBOSSN);
|
|
|
|
but = uiDefBut(node->block, TOGBUT, B_REDR, "",
|
|
|
|
rct->xmin+10.0f-but_size/2, centy-but_size/2, but_size, but_size, NULL, 0, 0, 0, 0, "");
|
|
|
|
uiButSetFunc(but, node_toggle_button_cb, node, (void*)"NODE_OT_hide_toggle");
|
|
|
|
uiBlockSetEmboss(node->block, UI_EMBOSS);
|
|
|
|
|
|
|
|
/* custom draw function for this button */
|
|
|
|
UI_DrawTriIcon(rct->xmin+10.0f, centy, 'h');
|
|
|
|
}
|
2008-12-24 10:33:10 +00:00
|
|
|
|
|
|
|
/* disable lines */
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->flag & NODE_MUTED)
|
2009-04-20 12:03:55 +00:00
|
|
|
node_draw_mute_line(&ar->v2d, snode, node);
|
2008-12-24 10:33:10 +00:00
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->flag & SELECT)
|
2008-12-24 10:33:10 +00:00
|
|
|
UI_ThemeColor(TH_TEXT_HI);
|
|
|
|
else
|
|
|
|
UI_ThemeColor(TH_TEXT);
|
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->miniwidth>0.0f) {
|
2011-09-05 21:01:50 +00:00
|
|
|
BLI_strncpy(showname, nodeLabel(node), sizeof(showname));
|
2011-02-08 12:54:32 +00:00
|
|
|
|
2012-04-21 12:51:47 +00:00
|
|
|
//if (node->flag & NODE_MUTED)
|
2012-03-18 07:38:51 +00:00
|
|
|
// BLI_snprintf(showname, sizeof(showname), "[%s]", showname); // XXX - don't print into self!
|
2008-12-24 10:33:10 +00:00
|
|
|
|
2009-09-16 18:59:13 +00:00
|
|
|
uiDefBut(node->block, LABEL, 0, showname, (short)(rct->xmin+15), (short)(centy-10),
|
2009-04-20 12:03:55 +00:00
|
|
|
(int)(rct->xmax - rct->xmin-18.0f -12.0f), NODE_DY, NULL, 0, 0, 0, 0, "");
|
2008-12-24 10:33:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* scale widget thing */
|
|
|
|
UI_ThemeColorShade(color_id, -10);
|
|
|
|
dx= 10.0f;
|
|
|
|
fdrawline(rct->xmax-dx, centy-4.0f, rct->xmax-dx, centy+4.0f);
|
|
|
|
fdrawline(rct->xmax-dx-3.0f*snode->aspect, centy-4.0f, rct->xmax-dx-3.0f*snode->aspect, centy+4.0f);
|
|
|
|
|
|
|
|
UI_ThemeColorShade(color_id, +30);
|
|
|
|
dx-= snode->aspect;
|
|
|
|
fdrawline(rct->xmax-dx, centy-4.0f, rct->xmax-dx, centy+4.0f);
|
|
|
|
fdrawline(rct->xmax-dx-3.0f*snode->aspect, centy-4.0f, rct->xmax-dx-3.0f*snode->aspect, centy+4.0f);
|
|
|
|
|
|
|
|
/* sockets */
|
2012-03-24 06:38:07 +00:00
|
|
|
for (sock= node->inputs.first; sock; sock= sock->next) {
|
|
|
|
if (!nodeSocketIsHidden(sock))
|
2011-09-05 21:01:50 +00:00
|
|
|
node_socket_circle_draw(snode->nodetree, sock, socket_size);
|
2008-12-24 10:33:10 +00:00
|
|
|
}
|
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
for (sock= node->outputs.first; sock; sock= sock->next) {
|
|
|
|
if (!nodeSocketIsHidden(sock))
|
2011-09-05 21:01:50 +00:00
|
|
|
node_socket_circle_draw(snode->nodetree, sock, socket_size);
|
2008-12-24 10:33:10 +00:00
|
|
|
}
|
2009-04-20 12:03:55 +00:00
|
|
|
|
2009-09-16 18:59:13 +00:00
|
|
|
uiEndBlock(C, node->block);
|
|
|
|
uiDrawBlock(C, node->block);
|
|
|
|
node->block= NULL;
|
2008-12-24 10:33:10 +00:00
|
|
|
}
|
|
|
|
|
2011-09-05 21:01:50 +00:00
|
|
|
void node_draw_default(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree, bNode *node)
|
|
|
|
{
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->flag & NODE_HIDDEN)
|
2011-09-05 21:01:50 +00:00
|
|
|
node_draw_hidden(C, ar, snode, node);
|
|
|
|
else
|
|
|
|
node_draw_basis(C, ar, snode, ntree, node);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void node_update(const bContext *C, bNodeTree *ntree, bNode *node)
|
|
|
|
{
|
|
|
|
if (node->typeinfo->drawupdatefunc)
|
|
|
|
node->typeinfo->drawupdatefunc(C, ntree, node);
|
|
|
|
}
|
|
|
|
|
|
|
|
void node_update_nodetree(const bContext *C, bNodeTree *ntree, float offsetx, float offsety)
|
|
|
|
{
|
|
|
|
bNode *node;
|
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
for (node= ntree->nodes.first; node; node= node->next) {
|
2011-09-05 21:01:50 +00:00
|
|
|
/* XXX little hack */
|
|
|
|
node->locx += offsetx;
|
|
|
|
node->locy += offsety;
|
|
|
|
|
|
|
|
node_update(C, ntree, node);
|
|
|
|
|
|
|
|
node->locx -= offsetx;
|
|
|
|
node->locy -= offsety;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void node_draw(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree, bNode *node)
|
|
|
|
{
|
|
|
|
if (node->typeinfo->drawfunc)
|
|
|
|
node->typeinfo->drawfunc(C, ar, snode, ntree, node);
|
|
|
|
}
|
|
|
|
|
|
|
|
void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *ntree)
|
2008-12-24 10:33:10 +00:00
|
|
|
{
|
|
|
|
bNode *node;
|
|
|
|
bNodeLink *link;
|
|
|
|
int a;
|
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (ntree==NULL) return; /* groups... */
|
2008-12-24 10:33:10 +00:00
|
|
|
|
|
|
|
/* node lines */
|
|
|
|
glEnable(GL_BLEND);
|
|
|
|
glEnable(GL_LINE_SMOOTH);
|
2012-03-24 06:38:07 +00:00
|
|
|
for (link= ntree->links.first; link; link= link->next)
|
2008-12-24 10:33:10 +00:00
|
|
|
node_draw_link(&ar->v2d, snode, link);
|
|
|
|
glDisable(GL_LINE_SMOOTH);
|
|
|
|
glDisable(GL_BLEND);
|
|
|
|
|
2011-09-05 21:01:50 +00:00
|
|
|
/* draw nodes, last nodes in front */
|
2012-03-24 06:38:07 +00:00
|
|
|
for (a=0, node= ntree->nodes.first; node; node=node->next, a++) {
|
2008-12-24 10:33:10 +00:00
|
|
|
node->nr= a; /* index of node in list, used for exec event code */
|
2011-09-05 21:01:50 +00:00
|
|
|
node_draw(C, ar, snode, ntree, node);
|
2011-02-21 13:47:49 +00:00
|
|
|
}
|
2008-12-24 10:33:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d)
|
|
|
|
{
|
|
|
|
View2DScrollers *scrollers;
|
2009-07-28 16:33:02 +00:00
|
|
|
SpaceNode *snode= CTX_wm_space_node(C);
|
2009-10-07 22:05:30 +00:00
|
|
|
Scene *scene= CTX_data_scene(C);
|
|
|
|
int color_manage = scene->r.color_mgt_flag & R_COLOR_MANAGEMENT;
|
2011-03-25 16:53:07 +00:00
|
|
|
bNodeLinkDrag *nldrag;
|
2012-05-15 12:40:43 +00:00
|
|
|
LinkData *linkdata;
|
2008-12-24 10:33:10 +00:00
|
|
|
|
2010-04-06 07:02:16 +00:00
|
|
|
UI_ThemeClearColor(TH_BACK);
|
2008-12-24 10:33:10 +00:00
|
|
|
glClear(GL_COLOR_BUFFER_BIT);
|
|
|
|
|
2010-10-14 01:22:14 +00:00
|
|
|
UI_view2d_view_ortho(v2d);
|
2008-12-24 10:33:10 +00:00
|
|
|
|
|
|
|
//uiFreeBlocksWin(&sa->uiblocks, sa->win);
|
|
|
|
|
|
|
|
/* only set once */
|
2012-04-29 17:11:40 +00:00
|
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
2008-12-24 10:33:10 +00:00
|
|
|
glEnable(GL_MAP1_VERTEX_3);
|
|
|
|
|
|
|
|
/* aspect+font, set each time */
|
2009-01-13 19:28:18 +00:00
|
|
|
snode->aspect= (v2d->cur.xmax - v2d->cur.xmin)/((float)ar->winx);
|
2009-04-10 16:30:28 +00:00
|
|
|
// XXX snode->curfont= uiSetCurFont_ext(snode->aspect);
|
2008-12-24 10:33:10 +00:00
|
|
|
|
2010-10-14 01:22:14 +00:00
|
|
|
UI_view2d_constant_grid_draw(v2d);
|
2008-12-24 10:33:10 +00:00
|
|
|
/* backdrop */
|
2009-10-07 22:05:30 +00:00
|
|
|
draw_nodespace_back_pix(ar, snode, color_manage);
|
2008-12-24 10:33:10 +00:00
|
|
|
|
|
|
|
/* nodes */
|
|
|
|
snode_set_context(snode, CTX_data_scene(C));
|
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (snode->nodetree) {
|
2008-12-24 10:33:10 +00:00
|
|
|
bNode *node;
|
|
|
|
|
2011-11-24 09:26:19 +00:00
|
|
|
node_uiblocks_init(C, snode->nodetree);
|
|
|
|
|
|
|
|
/* uiBlocks must be initialized in drawing order for correct event clipping.
|
|
|
|
* Node group internal blocks added after the main group block.
|
|
|
|
*/
|
2012-03-24 06:38:07 +00:00
|
|
|
for (node= snode->nodetree->nodes.first; node; node= node->next) {
|
|
|
|
if (node->flag & NODE_GROUP_EDIT)
|
2010-03-29 07:15:12 +00:00
|
|
|
node_uiblocks_init(C, (bNodeTree *)node->id);
|
|
|
|
}
|
2010-01-12 07:07:51 +00:00
|
|
|
|
2011-09-05 21:01:50 +00:00
|
|
|
node_update_nodetree(C, snode->nodetree, 0.0f, 0.0f);
|
2008-12-24 10:33:10 +00:00
|
|
|
node_draw_nodetree(C, ar, snode, snode->nodetree);
|
2011-09-05 21:01:50 +00:00
|
|
|
|
|
|
|
#if 0
|
2008-12-24 10:33:10 +00:00
|
|
|
/* active group */
|
2012-03-24 06:38:07 +00:00
|
|
|
for (node= snode->nodetree->nodes.first; node; node= node->next) {
|
|
|
|
if (node->flag & NODE_GROUP_EDIT)
|
2011-02-08 12:54:32 +00:00
|
|
|
node_draw_group(C, ar, snode, snode->nodetree, node);
|
2008-12-24 10:33:10 +00:00
|
|
|
}
|
2011-09-05 21:01:50 +00:00
|
|
|
#endif
|
2008-12-24 10:33:10 +00:00
|
|
|
}
|
|
|
|
|
2011-03-25 16:53:07 +00:00
|
|
|
/* temporary links */
|
|
|
|
glEnable(GL_BLEND);
|
|
|
|
glEnable(GL_LINE_SMOOTH);
|
2012-05-15 12:40:43 +00:00
|
|
|
for (nldrag= snode->linkdrag.first; nldrag; nldrag= nldrag->next) {
|
|
|
|
for (linkdata=nldrag->links.first; linkdata; linkdata=linkdata->next)
|
|
|
|
node_draw_link(&ar->v2d, snode, (bNodeLink *)linkdata->data);
|
|
|
|
}
|
2011-03-25 16:53:07 +00:00
|
|
|
glDisable(GL_LINE_SMOOTH);
|
|
|
|
glDisable(GL_BLEND);
|
|
|
|
|
2008-12-24 10:33:10 +00:00
|
|
|
/* draw grease-pencil ('canvas' strokes) */
|
2009-11-11 08:12:54 +00:00
|
|
|
if (/*(snode->flag & SNODE_DISPGP) &&*/ (snode->nodetree))
|
2010-04-28 07:25:39 +00:00
|
|
|
draw_gpencil_view2d((bContext*)C, 1);
|
2008-12-26 20:39:29 +00:00
|
|
|
|
2008-12-24 10:33:10 +00:00
|
|
|
/* reset view matrix */
|
|
|
|
UI_view2d_view_restore(C);
|
|
|
|
|
2009-11-11 08:12:54 +00:00
|
|
|
/* draw grease-pencil (screen strokes, and also paintbuffer) */
|
|
|
|
if (/*(snode->flag & SNODE_DISPGP) && */(snode->nodetree))
|
2010-04-28 07:25:39 +00:00
|
|
|
draw_gpencil_view2d((bContext*)C, 0);
|
2009-11-11 08:12:54 +00:00
|
|
|
|
2008-12-24 10:33:10 +00:00
|
|
|
/* scrollers */
|
2008-12-29 00:55:23 +00:00
|
|
|
scrollers= UI_view2d_scrollers_calc(C, v2d, 10, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
|
2008-12-24 10:33:10 +00:00
|
|
|
UI_view2d_scrollers_draw(C, v2d, scrollers);
|
|
|
|
UI_view2d_scrollers_free(scrollers);
|
2008-12-26 13:11:04 +00:00
|
|
|
}
|