2011-02-23 10:52:22 +00:00
|
|
|
/*
|
2008-12-13 18:09:49 +00:00
|
|
|
* 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
|
2012-07-01 09:54:44 +00:00
|
|
|
* of the License, or (at your option) any later version.
|
2008-12-13 18:09:49 +00:00
|
|
|
*
|
|
|
|
* 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-13 18:09:49 +00:00
|
|
|
*
|
|
|
|
* The Original Code is Copyright (C) 2008 Blender Foundation.
|
|
|
|
* All rights reserved.
|
|
|
|
*/
|
|
|
|
|
2019-02-18 08:08:12 +11:00
|
|
|
/** \file
|
|
|
|
* \ingroup spnode
|
2011-02-27 20:29:51 +00:00
|
|
|
*/
|
|
|
|
|
ID-Remap - Step one: core work (cleanup and rework of generic ID datablock handling).
This commit changes a lot of how IDs are handled internally, especially the unlinking/freeing
processes. So far, this was very fuzy, to summarize cleanly deleting or replacing a datablock
was pretty much impossible, except for a few special cases.
Also, unlinking was handled by each datatype, in a rather messy and prone-to-errors way (quite
a few ID usages were missed or wrongly handled that way).
One of the main goal of id-remap branch was to cleanup this, and fatorize ID links handling
by using library_query utils to allow generic handling of those, which is now the case
(now, generic ID links handling is only "knwon" from readfile.c and library_query.c).
This commit also adds backends to allow live replacement and deletion of datablocks in Blender
(so-called 'remapping' process, where we replace all usages of a given ID pointer by a new one,
or NULL one in case of unlinking).
This will allow nice new features, like ability to easily reload or relocate libraries, real immediate
deletion of datablocks in blender, replacement of one datablock by another, etc.
Some of those are for next commits.
A word of warning: this commit is highly risky, because it affects potentially a lot in Blender core.
Though it was tested rather deeply, being totally impossible to check all possible ID usage cases,
it's likely there are some remaining issues and bugs in new code... Please report them! ;)
Review task: D2027 (https://developer.blender.org/D2027).
Reviewed by campbellbarton, thanks a bunch.
2016-06-22 17:29:38 +02:00
|
|
|
#include "DNA_gpencil_types.h"
|
2019-02-27 12:34:56 +11:00
|
|
|
#include "DNA_light_types.h"
|
2011-11-02 18:55:32 +00:00
|
|
|
#include "DNA_material_types.h"
|
2008-12-13 18:09:49 +00:00
|
|
|
#include "DNA_node_types.h"
|
2011-11-02 18:55:32 +00:00
|
|
|
#include "DNA_world_types.h"
|
2008-12-13 18:09:49 +00:00
|
|
|
|
|
|
|
#include "MEM_guardedalloc.h"
|
|
|
|
|
|
|
|
#include "BLI_blenlib.h"
|
2009-11-10 20:43:45 +00:00
|
|
|
#include "BLI_math.h"
|
2008-12-13 18:09:49 +00:00
|
|
|
|
2008-12-18 02:56:48 +00:00
|
|
|
#include "BKE_context.h"
|
2013-07-08 11:38:11 +00:00
|
|
|
#include "BKE_library.h"
|
2014-02-24 13:21:43 +01:00
|
|
|
#include "BKE_scene.h"
|
2008-12-13 18:09:49 +00:00
|
|
|
#include "BKE_screen.h"
|
2010-09-13 06:08:26 +00:00
|
|
|
#include "BKE_node.h"
|
2008-12-13 18:09:49 +00:00
|
|
|
|
2012-09-15 01:52:28 +00:00
|
|
|
#include "ED_space_api.h"
|
2013-03-18 16:34:57 +00:00
|
|
|
#include "ED_node.h"
|
Sorry, three commits in one, became difficult to untangle..
Editors Modules
* render/ module added in editors, moved the preview render code there and
also shading related operators.
* physics/ module made more consistent with other modules. renaming files,
making a single physics_ops.c for operators and keymaps. Also move all
particle related operators here now.
* space_buttons/ now should have only operators relevant to the buttons
specificially.
Updates & Notifiers
* Material/Texture/World/Lamp can now be passed to DAG_id_flush_update,
which will go back to a callback in editors. Eventually these should
be in the depsgraph itself, but for now this gives a unified call for
doing updates.
* GLSL materials are now refreshed on changes. There's still various
cases missing,
* Preview icons now hook into this system, solving various update cases
that were missed before.
* Also fixes issue in my last commit, where some preview would not render,
problem is avoided in the new system.
Icon Rendering
* On systems with support for non-power of two textures, an OpenGL texture
is now used instead of glDrawPixels. This avoids problems with icons get
clipped on region borders. On my Linux desktop, this gives an 1.1x speedup,
and on my Mac laptop a 2.3x speedup overall in redrawing the full window,
with the default setup. The glDrawPixels implementation on Mac seems to
have a lot of overhread.
* Preview icons are now drawn using proper premul alpha, and never faded so
you can see them clearly.
* Also tried to fix issue with texture node preview rendering, globals can't
be used with threads reliably.
2009-09-29 19:12:12 +00:00
|
|
|
#include "ED_render.h"
|
2008-12-13 18:09:49 +00:00
|
|
|
#include "ED_screen.h"
|
|
|
|
|
2010-05-12 04:25:33 +00:00
|
|
|
#include "UI_resources.h"
|
2008-12-13 18:09:49 +00:00
|
|
|
#include "UI_view2d.h"
|
|
|
|
|
2009-03-19 19:03:38 +00:00
|
|
|
#include "RNA_access.h"
|
2018-05-29 09:19:06 +02:00
|
|
|
#include "RNA_define.h"
|
|
|
|
#include "RNA_enum_types.h"
|
2009-03-19 19:03:38 +00:00
|
|
|
|
2017-05-29 22:06:59 +10:00
|
|
|
#include "WM_api.h"
|
2017-10-07 15:57:14 +11:00
|
|
|
#include "WM_types.h"
|
2017-05-29 22:06:59 +10:00
|
|
|
|
2012-08-02 23:03:16 +00:00
|
|
|
#include "node_intern.h" /* own include */
|
2008-12-13 18:09:49 +00:00
|
|
|
|
2013-03-18 16:34:57 +00:00
|
|
|
|
|
|
|
/* ******************** tree path ********************* */
|
|
|
|
|
|
|
|
void ED_node_tree_start(SpaceNode *snode, bNodeTree *ntree, ID *id, ID *from)
|
|
|
|
{
|
|
|
|
bNodeTreePath *path, *path_next;
|
2013-03-18 18:25:05 +00:00
|
|
|
for (path = snode->treepath.first; path; path = path_next) {
|
2013-03-18 16:34:57 +00:00
|
|
|
path_next = path->next;
|
|
|
|
MEM_freeN(path);
|
|
|
|
}
|
2014-02-08 06:07:10 +11:00
|
|
|
BLI_listbase_clear(&snode->treepath);
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2013-03-18 16:34:57 +00:00
|
|
|
if (ntree) {
|
|
|
|
path = MEM_callocN(sizeof(bNodeTreePath), "node tree path");
|
|
|
|
path->nodetree = ntree;
|
|
|
|
path->parent_key = NODE_INSTANCE_KEY_BASE;
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2013-04-17 17:12:12 +00:00
|
|
|
/* copy initial offset from bNodeTree */
|
|
|
|
copy_v2_v2(path->view_center, ntree->view_center);
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2019-03-26 21:16:47 +11:00
|
|
|
if (id) {
|
2013-03-18 18:25:05 +00:00
|
|
|
BLI_strncpy(path->node_name, id->name + 2, sizeof(path->node_name));
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2013-03-18 16:34:57 +00:00
|
|
|
BLI_addtail(&snode->treepath, path);
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2013-07-08 11:38:11 +00:00
|
|
|
id_us_ensure_real(&ntree->id);
|
2013-03-18 16:34:57 +00:00
|
|
|
}
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2013-03-18 16:34:57 +00:00
|
|
|
/* update current tree */
|
|
|
|
snode->nodetree = snode->edittree = ntree;
|
|
|
|
snode->id = id;
|
|
|
|
snode->from = from;
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2013-04-24 16:36:50 +00:00
|
|
|
ED_node_set_active_viewer_key(snode);
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2013-03-18 18:25:05 +00:00
|
|
|
WM_main_add_notifier(NC_SCENE | ND_NODES, NULL);
|
2013-03-18 16:34:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void ED_node_tree_push(SpaceNode *snode, bNodeTree *ntree, bNode *gnode)
|
|
|
|
{
|
|
|
|
bNodeTreePath *path = MEM_callocN(sizeof(bNodeTreePath), "node tree path");
|
|
|
|
bNodeTreePath *prev_path = snode->treepath.last;
|
|
|
|
path->nodetree = ntree;
|
|
|
|
if (gnode) {
|
2019-03-26 21:16:47 +11:00
|
|
|
if (prev_path) {
|
2013-03-18 16:34:57 +00:00
|
|
|
path->parent_key = BKE_node_instance_key(prev_path->parent_key, prev_path->nodetree, gnode);
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
|
|
|
else {
|
2013-03-18 16:34:57 +00:00
|
|
|
path->parent_key = NODE_INSTANCE_KEY_BASE;
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2013-03-18 16:34:57 +00:00
|
|
|
BLI_strncpy(path->node_name, gnode->name, sizeof(path->node_name));
|
|
|
|
}
|
2019-03-26 21:16:47 +11:00
|
|
|
else {
|
2013-03-18 16:34:57 +00:00
|
|
|
path->parent_key = NODE_INSTANCE_KEY_BASE;
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2013-04-17 17:12:12 +00:00
|
|
|
/* copy initial offset from bNodeTree */
|
|
|
|
copy_v2_v2(path->view_center, ntree->view_center);
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2013-03-18 16:34:57 +00:00
|
|
|
BLI_addtail(&snode->treepath, path);
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2013-07-08 11:38:11 +00:00
|
|
|
id_us_ensure_real(&ntree->id);
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2013-03-18 16:34:57 +00:00
|
|
|
/* update current tree */
|
|
|
|
snode->edittree = ntree;
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2013-04-24 16:36:50 +00:00
|
|
|
ED_node_set_active_viewer_key(snode);
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2013-03-18 18:25:05 +00:00
|
|
|
WM_main_add_notifier(NC_SCENE | ND_NODES, NULL);
|
2013-03-18 16:34:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void ED_node_tree_pop(SpaceNode *snode)
|
|
|
|
{
|
|
|
|
bNodeTreePath *path = snode->treepath.last;
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2013-03-18 16:34:57 +00:00
|
|
|
/* don't remove root */
|
2019-03-26 21:16:47 +11:00
|
|
|
if (path == snode->treepath.first) {
|
2013-03-18 16:34:57 +00:00
|
|
|
return;
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2013-03-18 16:34:57 +00:00
|
|
|
BLI_remlink(&snode->treepath, path);
|
|
|
|
MEM_freeN(path);
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2013-03-18 16:34:57 +00:00
|
|
|
/* update current tree */
|
|
|
|
path = snode->treepath.last;
|
|
|
|
snode->edittree = path->nodetree;
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2013-04-24 16:36:50 +00:00
|
|
|
ED_node_set_active_viewer_key(snode);
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2013-03-18 16:34:57 +00:00
|
|
|
/* listener updates the View2D center from edittree */
|
2013-03-18 18:25:05 +00:00
|
|
|
WM_main_add_notifier(NC_SCENE | ND_NODES, NULL);
|
2013-03-18 16:34:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
int ED_node_tree_depth(SpaceNode *snode)
|
|
|
|
{
|
2014-11-16 13:57:58 +01:00
|
|
|
return BLI_listbase_count(&snode->treepath);
|
2013-03-18 16:34:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bNodeTree *ED_node_tree_get(SpaceNode *snode, int level)
|
|
|
|
{
|
|
|
|
bNodeTreePath *path;
|
|
|
|
int i;
|
2013-03-18 18:25:05 +00:00
|
|
|
for (path = snode->treepath.last, i = 0; path; path = path->prev, ++i) {
|
2019-03-26 21:16:47 +11:00
|
|
|
if (i == level) {
|
2013-03-18 16:34:57 +00:00
|
|
|
return path->nodetree;
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
2013-03-18 16:34:57 +00:00
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
int ED_node_tree_path_length(SpaceNode *snode)
|
|
|
|
{
|
|
|
|
bNodeTreePath *path;
|
|
|
|
int length = 0;
|
|
|
|
int i;
|
2013-03-18 18:25:05 +00:00
|
|
|
for (path = snode->treepath.first, i = 0; path; path = path->next, ++i) {
|
2013-03-18 16:34:57 +00:00
|
|
|
length += strlen(path->node_name);
|
2019-03-26 21:16:47 +11:00
|
|
|
if (i > 0) {
|
2013-03-18 16:34:57 +00:00
|
|
|
length += 1; /* for separator char */
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
2013-03-18 16:34:57 +00:00
|
|
|
}
|
|
|
|
return length;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ED_node_tree_path_get(SpaceNode *snode, char *value)
|
|
|
|
{
|
|
|
|
bNodeTreePath *path;
|
|
|
|
int i;
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2013-03-18 16:34:57 +00:00
|
|
|
value[0] = '\0';
|
2013-03-18 18:25:05 +00:00
|
|
|
for (path = snode->treepath.first, i = 0; path; path = path->next, ++i) {
|
2013-03-18 16:34:57 +00:00
|
|
|
if (i == 0) {
|
|
|
|
strcpy(value, path->node_name);
|
|
|
|
value += strlen(path->node_name);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
sprintf(value, "/%s", path->node_name);
|
|
|
|
value += strlen(path->node_name) + 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void ED_node_tree_path_get_fixedbuf(SpaceNode *snode, char *value, int max_length)
|
|
|
|
{
|
|
|
|
bNodeTreePath *path;
|
|
|
|
int size, i;
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2013-03-18 16:34:57 +00:00
|
|
|
value[0] = '\0';
|
2013-03-18 18:25:05 +00:00
|
|
|
for (path = snode->treepath.first, i = 0; path; path = path->next, ++i) {
|
2013-03-18 16:34:57 +00:00
|
|
|
if (i == 0) {
|
2015-04-22 05:37:22 +10:00
|
|
|
size = BLI_strncpy_rlen(value, path->node_name, max_length);
|
2013-03-18 16:34:57 +00:00
|
|
|
}
|
|
|
|
else {
|
2015-04-22 05:37:22 +10:00
|
|
|
size = BLI_snprintf_rlen(value, max_length, "/%s", path->node_name);
|
2013-03-18 16:34:57 +00:00
|
|
|
}
|
|
|
|
max_length -= size;
|
2019-03-26 21:16:47 +11:00
|
|
|
if (max_length <= 0) {
|
2013-03-18 16:34:57 +00:00
|
|
|
break;
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
2013-03-18 16:34:57 +00:00
|
|
|
value += size;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-04-24 16:36:50 +00:00
|
|
|
void ED_node_set_active_viewer_key(SpaceNode *snode)
|
|
|
|
{
|
|
|
|
bNodeTreePath *path = snode->treepath.last;
|
|
|
|
if (snode->nodetree && path) {
|
|
|
|
snode->nodetree->active_viewer_key = path->parent_key;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-03-18 16:34:57 +00:00
|
|
|
void snode_group_offset(SpaceNode *snode, float *x, float *y)
|
|
|
|
{
|
|
|
|
bNodeTreePath *path = snode->treepath.last;
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2013-04-17 17:12:12 +00:00
|
|
|
if (path && path->prev) {
|
|
|
|
float dcenter[2];
|
|
|
|
sub_v2_v2v2(dcenter, path->view_center, path->prev->view_center);
|
|
|
|
*x = dcenter[0];
|
|
|
|
*y = dcenter[1];
|
2013-03-18 16:34:57 +00:00
|
|
|
}
|
2019-03-26 21:16:47 +11:00
|
|
|
else {
|
2013-04-17 17:12:12 +00:00
|
|
|
*x = *y = 0.0f;
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
2013-03-18 16:34:57 +00:00
|
|
|
}
|
|
|
|
|
2009-11-11 08:12:54 +00:00
|
|
|
/* ******************** manage regions ********************* */
|
|
|
|
|
|
|
|
ARegion *node_has_buttons_region(ScrArea *sa)
|
|
|
|
{
|
|
|
|
ARegion *ar, *arnew;
|
2011-05-20 05:27:31 +00:00
|
|
|
|
2012-07-01 09:54:44 +00:00
|
|
|
ar = BKE_area_find_region_type(sa, RGN_TYPE_UI);
|
2019-03-26 21:16:47 +11:00
|
|
|
if (ar) {
|
|
|
|
return ar;
|
|
|
|
}
|
2012-07-01 09:54:44 +00:00
|
|
|
|
2009-11-11 08:12:54 +00:00
|
|
|
/* add subdiv level; after header */
|
2012-07-01 09:54:44 +00:00
|
|
|
ar = BKE_area_find_region_type(sa, RGN_TYPE_HEADER);
|
2011-05-20 05:27:31 +00:00
|
|
|
|
2009-11-11 08:12:54 +00:00
|
|
|
/* is error! */
|
2019-03-26 21:16:47 +11:00
|
|
|
if (ar == NULL) {
|
|
|
|
return NULL;
|
|
|
|
}
|
2012-07-01 09:54:44 +00:00
|
|
|
|
|
|
|
arnew = MEM_callocN(sizeof(ARegion), "buttons for node");
|
|
|
|
|
2009-11-11 08:12:54 +00:00
|
|
|
BLI_insertlinkafter(&sa->regionbase, ar, arnew);
|
2012-07-01 09:54:44 +00:00
|
|
|
arnew->regiontype = RGN_TYPE_UI;
|
|
|
|
arnew->alignment = RGN_ALIGN_RIGHT;
|
|
|
|
|
2009-11-11 08:12:54 +00:00
|
|
|
arnew->flag = RGN_FLAG_HIDDEN;
|
2012-07-01 09:54:44 +00:00
|
|
|
|
2009-11-11 08:12:54 +00:00
|
|
|
return arnew;
|
|
|
|
}
|
|
|
|
|
2012-12-12 12:50:39 +00:00
|
|
|
ARegion *node_has_tools_region(ScrArea *sa)
|
|
|
|
{
|
|
|
|
ARegion *ar, *arnew;
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2012-12-12 12:50:39 +00:00
|
|
|
ar = BKE_area_find_region_type(sa, RGN_TYPE_TOOLS);
|
2019-03-26 21:16:47 +11:00
|
|
|
if (ar) {
|
|
|
|
return ar;
|
|
|
|
}
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2012-12-12 12:50:39 +00:00
|
|
|
/* add subdiv level; after header */
|
|
|
|
ar = BKE_area_find_region_type(sa, RGN_TYPE_HEADER);
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2012-12-12 12:50:39 +00:00
|
|
|
/* is error! */
|
2019-03-26 21:16:47 +11:00
|
|
|
if (ar == NULL) {
|
|
|
|
return NULL;
|
|
|
|
}
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2012-12-12 12:50:39 +00:00
|
|
|
arnew = MEM_callocN(sizeof(ARegion), "node tools");
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2012-12-12 12:50:39 +00:00
|
|
|
BLI_insertlinkafter(&sa->regionbase, ar, arnew);
|
|
|
|
arnew->regiontype = RGN_TYPE_TOOLS;
|
|
|
|
arnew->alignment = RGN_ALIGN_LEFT;
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2012-12-12 12:50:39 +00:00
|
|
|
arnew->flag = RGN_FLAG_HIDDEN;
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2012-12-12 12:50:39 +00:00
|
|
|
return arnew;
|
|
|
|
}
|
|
|
|
|
2008-12-13 18:09:49 +00:00
|
|
|
/* ******************** default callbacks for node space ***************** */
|
|
|
|
|
2018-04-21 19:30:56 +02:00
|
|
|
static SpaceLink *node_new(const ScrArea *UNUSED(area), const Scene *UNUSED(scene))
|
2008-12-13 18:09:49 +00:00
|
|
|
{
|
|
|
|
ARegion *ar;
|
|
|
|
SpaceNode *snode;
|
2012-07-01 09:54:44 +00:00
|
|
|
|
|
|
|
snode = MEM_callocN(sizeof(SpaceNode), "initnode");
|
|
|
|
snode->spacetype = SPACE_NODE;
|
|
|
|
|
2013-01-29 12:03:38 +00:00
|
|
|
snode->flag = SNODE_SHOW_GPENCIL | SNODE_USE_ALPHA;
|
2012-12-17 02:34:53 +00:00
|
|
|
|
2011-02-10 10:24:05 +00:00
|
|
|
/* backdrop */
|
|
|
|
snode->zoom = 1.0f;
|
2012-07-01 09:54:44 +00:00
|
|
|
|
2013-03-18 16:34:57 +00:00
|
|
|
/* select the first tree type for valid type */
|
2013-09-13 08:45:20 +00:00
|
|
|
NODE_TREE_TYPES_BEGIN (treetype)
|
|
|
|
{
|
2013-03-18 16:34:57 +00:00
|
|
|
strcpy(snode->tree_idname, treetype->idname);
|
|
|
|
break;
|
2013-09-13 08:45:20 +00:00
|
|
|
}
|
|
|
|
NODE_TREE_TYPES_END;
|
2013-03-18 16:34:57 +00:00
|
|
|
|
2008-12-13 18:09:49 +00:00
|
|
|
/* header */
|
2012-07-01 09:54:44 +00:00
|
|
|
ar = MEM_callocN(sizeof(ARegion), "header for node");
|
|
|
|
|
2008-12-13 18:09:49 +00:00
|
|
|
BLI_addtail(&snode->regionbase, ar);
|
2012-07-01 09:54:44 +00:00
|
|
|
ar->regiontype = RGN_TYPE_HEADER;
|
2018-12-14 09:47:10 +11:00
|
|
|
ar->alignment = (U.uiflag & USER_HEADER_BOTTOM) ? RGN_ALIGN_BOTTOM : RGN_ALIGN_TOP;
|
2012-07-01 09:54:44 +00:00
|
|
|
|
2009-11-11 08:12:54 +00:00
|
|
|
/* buttons/list view */
|
2012-07-01 09:54:44 +00:00
|
|
|
ar = MEM_callocN(sizeof(ARegion), "buttons for node");
|
|
|
|
|
2009-01-13 19:28:18 +00:00
|
|
|
BLI_addtail(&snode->regionbase, ar);
|
2012-07-01 09:54:44 +00:00
|
|
|
ar->regiontype = RGN_TYPE_UI;
|
|
|
|
ar->alignment = RGN_ALIGN_RIGHT;
|
|
|
|
|
2013-04-13 17:36:31 +00:00
|
|
|
/* toolbar */
|
|
|
|
ar = MEM_callocN(sizeof(ARegion), "node tools");
|
|
|
|
|
|
|
|
BLI_addtail(&snode->regionbase, ar);
|
|
|
|
ar->regiontype = RGN_TYPE_TOOLS;
|
|
|
|
ar->alignment = RGN_ALIGN_LEFT;
|
|
|
|
|
|
|
|
ar->flag = RGN_FLAG_HIDDEN;
|
|
|
|
|
2015-11-28 17:14:45 +01:00
|
|
|
/* main region */
|
|
|
|
ar = MEM_callocN(sizeof(ARegion), "main region for node");
|
2012-07-01 09:54:44 +00:00
|
|
|
|
2008-12-13 18:09:49 +00:00
|
|
|
BLI_addtail(&snode->regionbase, ar);
|
2012-07-01 09:54:44 +00:00
|
|
|
ar->regiontype = RGN_TYPE_WINDOW;
|
|
|
|
|
Holiday coding log :)
Nice formatted version (pictures soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.66/Usability
Short list of main changes:
- Transparent region option (over main region), added code to blend in/out such panels.
- Min size window now 640 x 480
- Fixed DPI for ui - lots of cleanup and changes everywhere. Icon image need correct size still, layer-in-use icon needs remake.
- Macbook retina support, use command line --no-native-pixels to disable it
- Timeline Marker label was drawing wrong
- Trackpad and magic mouse: supports zoom (hold ctrl)
- Fix for splash position: removed ghost function and made window size update after creation immediate
- Fast undo buffer save now adds UI as well. Could be checked for regular file save even...
Quit.blend and temp file saving use this now.
- Dixed filename in window on reading quit.blend or temp saves, and they now add a warning in window title: "(Recovered)"
- New Userpref option "Keep Session" - this always saves quit.blend, and loads on start.
This allows keeping UI and data without actual saves, until you actually save.
When you load startup.blend and quit, it recognises the quit.blend as a startup (no file name in header)
- Added 3D view copy/paste buffers (selected objects). Shortcuts ctrl-c, ctrl-v (OSX, cmd-c, cmd-v).
Coded partial file saving for it. Could be used for other purposes. Todo: use OS clipboards.
- User preferences (themes, keymaps, user settings) now can be saved as a separate file.
Old option is called "Save Startup File" the new one "Save User Settings".
To visualise this difference, the 'save startup file' button has been removed from user preferences window. That option is available as CTRL+U and in File menu still.
- OSX: fixed bug that stopped giving mouse events outside window.
This also fixes "Continuous Grab" for OSX. (error since 2009)
2012-12-12 18:58:11 +00:00
|
|
|
ar->v2d.tot.xmin = -12.8f * U.widget_unit;
|
|
|
|
ar->v2d.tot.ymin = -12.8f * U.widget_unit;
|
|
|
|
ar->v2d.tot.xmax = 38.4f * U.widget_unit;
|
|
|
|
ar->v2d.tot.ymax = 38.4f * U.widget_unit;
|
|
|
|
|
|
|
|
ar->v2d.cur = ar->v2d.tot;
|
2012-07-01 09:54:44 +00:00
|
|
|
|
|
|
|
ar->v2d.min[0] = 1.0f;
|
|
|
|
ar->v2d.min[1] = 1.0f;
|
|
|
|
|
|
|
|
ar->v2d.max[0] = 32000.0f;
|
|
|
|
ar->v2d.max[1] = 32000.0f;
|
|
|
|
|
|
|
|
ar->v2d.minzoom = 0.09f;
|
|
|
|
ar->v2d.maxzoom = 2.31f;
|
|
|
|
|
|
|
|
ar->v2d.scroll = (V2D_SCROLL_RIGHT | V2D_SCROLL_BOTTOM);
|
|
|
|
ar->v2d.keepzoom = V2D_LIMITZOOM | V2D_KEEPASPECT;
|
|
|
|
ar->v2d.keeptot = 0;
|
|
|
|
|
2008-12-13 18:09:49 +00:00
|
|
|
return (SpaceLink *)snode;
|
|
|
|
}
|
|
|
|
|
2013-03-18 16:34:57 +00:00
|
|
|
static void node_free(SpaceLink *sl)
|
2012-07-01 09:54:44 +00:00
|
|
|
{
|
2013-03-18 18:25:05 +00:00
|
|
|
SpaceNode *snode = (SpaceNode *)sl;
|
2013-03-18 16:34:57 +00:00
|
|
|
bNodeTreePath *path, *path_next;
|
2012-07-01 09:54:44 +00:00
|
|
|
|
2013-03-18 18:25:05 +00:00
|
|
|
for (path = snode->treepath.first; path; path = path_next) {
|
2013-03-18 16:34:57 +00:00
|
|
|
path_next = path->next;
|
|
|
|
MEM_freeN(path);
|
|
|
|
}
|
2008-12-13 18:09:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* spacetype; init callback */
|
2010-10-16 08:03:28 +00:00
|
|
|
static void node_init(struct wmWindowManager *UNUSED(wm), ScrArea *UNUSED(sa))
|
2008-12-13 18:09:49 +00:00
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2018-07-04 15:14:57 +02:00
|
|
|
static void node_area_listener(wmWindow *UNUSED(win), ScrArea *sa, wmNotifier *wmn, Scene *UNUSED(scene))
|
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
|
|
|
{
|
2010-09-13 06:08:26 +00:00
|
|
|
/* note, ED_area_tag_refresh will re-execute compositor */
|
2012-07-01 09:54:44 +00:00
|
|
|
SpaceNode *snode = sa->spacedata.first;
|
2014-02-24 13:21:43 +01:00
|
|
|
/* shaderfrom is only used for new shading nodes, otherwise all shaders are from objects */
|
Remove Blender Internal and legacy viewport from Blender 2.8.
Brecht authored this commit, but he gave me the honours to actually
do it. Here it goes; Blender Internal. Bye bye, you did great!
* Point density, voxel data, ocean, environment map textures were removed,
as these only worked within BI rendering. Note that the ocean modifier
and the Cycles point density shader node continue to work.
* Dynamic paint using material shading was removed, as this only worked
with BI. If we ever wanted to support this again probably it should go
through the baking API.
* GPU shader export through the Python API was removed. This only worked
for the old BI GLSL shaders, which no longer exists. Doing something
similar for Eevee would be significantly more complicated because it
uses a lot of multiplass rendering and logic outside the shader, it's
probably impractical.
* Collada material import / export code is mostly gone, as it only worked
for BI materials. We need to add Cycles / Eevee material support at some
point.
* The mesh noise operator was removed since it only worked with BI
material texture slots. A displacement modifier can be used instead.
* The delete texture paint slot operator was removed since it only worked
for BI material texture slots. Could be added back with node support.
* Not all legacy viewport features are supported in the new viewport, but
their code was removed. If we need to bring anything back we can look at
older git revisions.
* There is some legacy viewport code that I could not remove yet, and some
that I probably missed.
* Shader node execution code was left mostly intact, even though it is not
used anywhere now. We may eventually use this to replace the texture
nodes with Cycles / Eevee shader nodes.
* The Cycles Bake panel now includes settings for baking multires normal
and displacement maps. The underlying code needs to be merged properly,
and we plan to add back support for multires AO baking and add support
to Cycles baking for features like vertex color, displacement, and other
missing baking features.
* This commit removes DNA and the Python API for BI material, lamp, world
and scene settings. This breaks a lot of addons.
* There is more DNA that can be removed or renamed, where Cycles or Eevee
are reusing some old BI properties but the names are not really correct
anymore.
* Texture slots for materials, lamps and world were removed. They remain
for brushes, particles and freestyle linestyles.
* 'BLENDER_RENDER' remains in the COMPAT_ENGINES of UI panels. Cycles and
other renderers use this to find all panels to show, minus a few panels
that they have their own replacement for.
2018-04-19 17:34:44 +02:00
|
|
|
short shader_type = snode->shaderfrom;
|
2012-07-01 09:54:44 +00:00
|
|
|
|
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
|
|
|
/* preview renders */
|
2012-04-28 06:31:57 +00:00
|
|
|
switch (wmn->category) {
|
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
|
|
|
case NC_SCENE:
|
2010-01-27 05:42:17 +00:00
|
|
|
switch (wmn->data) {
|
2013-07-19 10:40:43 +00:00
|
|
|
case ND_NODES:
|
|
|
|
{
|
2013-03-18 16:34:57 +00:00
|
|
|
ARegion *ar = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW);
|
2013-04-17 17:12:12 +00:00
|
|
|
bNodeTreePath *path = snode->treepath.last;
|
2013-03-18 16:34:57 +00:00
|
|
|
/* shift view to node tree center */
|
2019-03-26 21:16:47 +11:00
|
|
|
if (ar && path) {
|
2014-04-21 18:46:52 +10:00
|
|
|
UI_view2d_center_set(&ar->v2d, path->view_center[0], path->view_center[1]);
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2013-03-18 16:34:57 +00:00
|
|
|
ED_area_tag_refresh(sa);
|
|
|
|
break;
|
|
|
|
}
|
2010-01-27 05:42:17 +00:00
|
|
|
case ND_FRAME:
|
|
|
|
ED_area_tag_refresh(sa);
|
|
|
|
break;
|
2011-09-22 12:45:25 +00:00
|
|
|
case ND_COMPO_RESULT:
|
|
|
|
ED_area_tag_redraw(sa);
|
|
|
|
break;
|
2011-02-07 16:41:57 +00:00
|
|
|
case ND_TRANSFORM_DONE:
|
2013-03-18 16:34:57 +00:00
|
|
|
if (ED_node_is_compositor(snode)) {
|
2012-03-24 06:38:07 +00:00
|
|
|
if (snode->flag & SNODE_AUTO_RENDER) {
|
2012-07-01 09:54:44 +00:00
|
|
|
snode->recalc = 1;
|
2011-02-07 16:41:57 +00:00
|
|
|
ED_area_tag_refresh(sa);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2014-09-16 14:28:58 +06:00
|
|
|
case ND_LAYER_CONTENT:
|
|
|
|
ED_area_tag_refresh(sa);
|
|
|
|
break;
|
2010-01-27 05:42:17 +00:00
|
|
|
}
|
2009-01-27 17:12:40 +00:00
|
|
|
break;
|
2012-07-01 09:54:44 +00:00
|
|
|
|
2009-08-18 14:31:13 +00:00
|
|
|
/* future: add ID checks? */
|
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
|
|
|
case NC_MATERIAL:
|
2013-03-18 16:34:57 +00:00
|
|
|
if (ED_node_is_shader(snode)) {
|
2019-03-26 21:16:47 +11:00
|
|
|
if (wmn->data == ND_SHADING) {
|
2011-01-04 16:31:36 +00:00
|
|
|
ED_area_tag_refresh(sa);
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
|
|
|
else if (wmn->data == ND_SHADING_DRAW) {
|
2011-01-04 16:31:36 +00:00
|
|
|
ED_area_tag_refresh(sa);
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
|
|
|
else if (wmn->data == ND_SHADING_LINKS) {
|
2012-11-26 08:52:07 +00:00
|
|
|
ED_area_tag_refresh(sa);
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
|
|
|
else if (wmn->action == NA_ADDED && snode->edittree) {
|
2011-06-17 13:57:41 +00:00
|
|
|
nodeSetActiveID(snode->edittree, ID_MA, wmn->reference);
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
2012-07-01 09:54:44 +00:00
|
|
|
|
2011-01-04 16:31:36 +00:00
|
|
|
}
|
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
|
|
|
break;
|
2009-08-18 14:31:13 +00:00
|
|
|
case NC_TEXTURE:
|
2013-03-18 16:34:57 +00:00
|
|
|
if (ED_node_is_shader(snode) || ED_node_is_texture(snode)) {
|
2019-03-26 21:16:47 +11:00
|
|
|
if (wmn->data == ND_NODES) {
|
2011-01-04 16:31:36 +00:00
|
|
|
ED_area_tag_refresh(sa);
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
2011-01-04 16:31:36 +00:00
|
|
|
}
|
2009-08-18 14:31:13 +00:00
|
|
|
break;
|
2012-01-24 20:10:37 +00:00
|
|
|
case NC_WORLD:
|
2013-03-18 16:34:57 +00:00
|
|
|
if (ED_node_is_shader(snode) && shader_type == SNODE_SHADER_WORLD) {
|
2012-07-01 09:54:44 +00:00
|
|
|
ED_area_tag_refresh(sa);
|
2012-01-24 20:10:37 +00:00
|
|
|
}
|
|
|
|
break;
|
2011-10-20 14:55:02 +00:00
|
|
|
case NC_OBJECT:
|
2013-03-18 16:34:57 +00:00
|
|
|
if (ED_node_is_shader(snode)) {
|
2019-03-26 21:16:47 +11:00
|
|
|
if (wmn->data == ND_OB_SHADING) {
|
2011-10-20 14:55:02 +00:00
|
|
|
ED_area_tag_refresh(sa);
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
2011-10-20 14:55:02 +00:00
|
|
|
}
|
|
|
|
break;
|
2.5
Notifiers
---------
Various fixes for wrong use of notifiers, and some new notifiers
to make things a bit more clear and consistent, with two notable
changes:
* Geometry changes are now done with NC_GEOM, rather than
NC_OBJECT|ND_GEOM_, so an object does need to be available.
* Space data now use NC_SPACE|ND_SPACE_*, instead of data
notifiers or even NC_WINDOW in some cases. Note that NC_SPACE
should only be used for notifying about changes in space data,
we don't want to go back to allqueue(REDRAW..).
Depsgraph
---------
The dependency graph now has a different flush call:
DAG_object_flush_update(scene, ob, flag)
is replaced by:
DAG_id_flush_update(id, flag)
It still works basically the same, one difference is that it now
also accepts object data (e.g. Mesh), again to avoid requiring an
Object to be available. Other ID types will simply do nothing at
the moment.
Docs
----
I made some guidelines for how/when to do which kinds of updates
and notifiers. I can't specify totally exact how to make these
decisions, but these are basically the guidelines I use. So, new
and updated docs are here:
http://wiki.blender.org/index.php/BlenderDev/Blender2.5/NotifiersUpdates
http://wiki.blender.org/index.php/BlenderDev/Blender2.5/DataNotifiers
2009-09-04 20:51:09 +00:00
|
|
|
case NC_SPACE:
|
2019-03-26 21:16:47 +11:00
|
|
|
if (wmn->data == ND_SPACE_NODE) {
|
2.5
Notifiers
---------
Various fixes for wrong use of notifiers, and some new notifiers
to make things a bit more clear and consistent, with two notable
changes:
* Geometry changes are now done with NC_GEOM, rather than
NC_OBJECT|ND_GEOM_, so an object does need to be available.
* Space data now use NC_SPACE|ND_SPACE_*, instead of data
notifiers or even NC_WINDOW in some cases. Note that NC_SPACE
should only be used for notifying about changes in space data,
we don't want to go back to allqueue(REDRAW..).
Depsgraph
---------
The dependency graph now has a different flush call:
DAG_object_flush_update(scene, ob, flag)
is replaced by:
DAG_id_flush_update(id, flag)
It still works basically the same, one difference is that it now
also accepts object data (e.g. Mesh), again to avoid requiring an
Object to be available. Other ID types will simply do nothing at
the moment.
Docs
----
I made some guidelines for how/when to do which kinds of updates
and notifiers. I can't specify totally exact how to make these
decisions, but these are basically the guidelines I use. So, new
and updated docs are here:
http://wiki.blender.org/index.php/BlenderDev/Blender2.5/NotifiersUpdates
http://wiki.blender.org/index.php/BlenderDev/Blender2.5/DataNotifiers
2009-09-04 20:51:09 +00:00
|
|
|
ED_area_tag_refresh(sa);
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
|
|
|
else if (wmn->data == ND_SPACE_NODE_VIEW) {
|
2009-10-20 20:00:12 +00:00
|
|
|
ED_area_tag_redraw(sa);
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
2.5
Notifiers
---------
Various fixes for wrong use of notifiers, and some new notifiers
to make things a bit more clear and consistent, with two notable
changes:
* Geometry changes are now done with NC_GEOM, rather than
NC_OBJECT|ND_GEOM_, so an object does need to be available.
* Space data now use NC_SPACE|ND_SPACE_*, instead of data
notifiers or even NC_WINDOW in some cases. Note that NC_SPACE
should only be used for notifying about changes in space data,
we don't want to go back to allqueue(REDRAW..).
Depsgraph
---------
The dependency graph now has a different flush call:
DAG_object_flush_update(scene, ob, flag)
is replaced by:
DAG_id_flush_update(id, flag)
It still works basically the same, one difference is that it now
also accepts object data (e.g. Mesh), again to avoid requiring an
Object to be available. Other ID types will simply do nothing at
the moment.
Docs
----
I made some guidelines for how/when to do which kinds of updates
and notifiers. I can't specify totally exact how to make these
decisions, but these are basically the guidelines I use. So, new
and updated docs are here:
http://wiki.blender.org/index.php/BlenderDev/Blender2.5/NotifiersUpdates
http://wiki.blender.org/index.php/BlenderDev/Blender2.5/DataNotifiers
2009-09-04 20:51:09 +00:00
|
|
|
break;
|
2009-11-12 01:22:51 +00:00
|
|
|
case NC_NODE:
|
2019-03-26 21:16:47 +11:00
|
|
|
if (wmn->action == NA_EDITED) {
|
2010-04-27 11:09:52 +00:00
|
|
|
ED_area_tag_refresh(sa);
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
|
|
|
else if (wmn->action == NA_SELECTED) {
|
2011-06-01 16:17:38 +00:00
|
|
|
ED_area_tag_redraw(sa);
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
2009-11-12 01:22:51 +00:00
|
|
|
break;
|
2011-07-17 08:38:04 +00:00
|
|
|
case NC_SCREEN:
|
2012-04-28 06:31:57 +00:00
|
|
|
switch (wmn->data) {
|
2011-07-17 08:38:04 +00:00
|
|
|
case ND_ANIMPLAY:
|
|
|
|
ED_area_tag_refresh(sa);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
2012-06-04 16:42:58 +00:00
|
|
|
case NC_MASK:
|
|
|
|
if (wmn->action == NA_EDITED) {
|
2013-03-18 16:34:57 +00:00
|
|
|
if (snode->nodetree && snode->nodetree->type == NTREE_COMPOSIT) {
|
2012-06-04 16:42:58 +00:00
|
|
|
ED_area_tag_refresh(sa);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2010-09-13 06:08:26 +00:00
|
|
|
|
|
|
|
case NC_IMAGE:
|
|
|
|
if (wmn->action == NA_EDITED) {
|
2013-03-18 16:34:57 +00:00
|
|
|
if (ED_node_is_compositor(snode)) {
|
2011-10-19 17:08:35 +00:00
|
|
|
/* note that nodeUpdateID is already called by BKE_image_signal() on all
|
2010-09-13 06:08:26 +00:00
|
|
|
* scenes so really this is just to know if the images is used in the compo else
|
|
|
|
* painting on images could become very slow when the compositor is open. */
|
2019-03-26 21:16:47 +11:00
|
|
|
if (nodeUpdateID(snode->nodetree, wmn->reference)) {
|
2012-10-18 09:48:51 +00:00
|
|
|
ED_area_tag_refresh(sa);
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
2012-10-18 09:48:51 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case NC_MOVIECLIP:
|
|
|
|
if (wmn->action == NA_EDITED) {
|
2013-03-18 16:34:57 +00:00
|
|
|
if (ED_node_is_compositor(snode)) {
|
2019-03-26 21:16:47 +11:00
|
|
|
if (nodeUpdateID(snode->nodetree, wmn->reference)) {
|
2010-09-13 06:08:26 +00:00
|
|
|
ED_area_tag_refresh(sa);
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
2010-09-13 06:08:26 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2014-07-11 16:51:04 +09:00
|
|
|
|
|
|
|
case NC_LINESTYLE:
|
|
|
|
if (ED_node_is_shader(snode) && shader_type == SNODE_SHADER_LINESTYLE) {
|
|
|
|
ED_area_tag_refresh(sa);
|
|
|
|
}
|
|
|
|
break;
|
2014-09-16 14:28:58 +06:00
|
|
|
case NC_WM:
|
2014-09-18 09:37:49 +10:00
|
|
|
if (wmn->data == ND_UNDO) {
|
2014-09-16 14:28:58 +06:00
|
|
|
ED_area_tag_refresh(sa);
|
|
|
|
}
|
|
|
|
break;
|
Grease Pencil - Storyboarding Features (merge from GPencil_EditStrokes branch)
This merge-commit brings in a number of new features and workflow/UI improvements for
working with Grease Pencil. While these were originally targetted at improving
the workflow for creating 3D storyboards in Blender using the Grease Pencil,
many of these changes should also prove useful in other workflows too.
The main highlights here are:
1) It is now possible to edit Grease Pencil strokes
- Use D Tab, or toggle the "Enable Editing" toggles in the Toolbar/Properties regions
to enter "Stroke Edit Mode". In this mode, many common editing tools will
operate on Grease Pencil stroke points instead.
- Tools implemented include Select, Select All/Border/Circle/Linked/More/Less,
Grab, Rotate, Scale, Bend, Shear, To Sphere, Mirror, Duplicate, Delete.
- Proportional Editing works when using the transform tools
2) Grease Pencil stroke settings can now be animated
NOTE: Currently drivers don't work, but if time allows, this may still be
added before the release.
3) Strokes can be drawn with "filled" interiors, using a separate set of
colour/opacity settings to the ones used for the lines themselves.
This makes use of OpenGL filled polys, which has the limitation of only
being able to fill convex shapes. Some artifacts may be visible on concave
shapes (e.g. pacman's mouth will be overdrawn)
4) "Volumetric Strokes" - An alternative drawing technique for stroke drawing
has been added which draws strokes as a series of screen-aligned discs.
While this was originally a partial experimental technique at getting better
quality 3D lines, the effects possible using this technique were interesting
enough to warrant making this a dedicated feature. Best results when partial
opacity and large stroke widths are used.
5) Improved Onion Skinning Support
- Different colours can be selected for the before/after ghosts. To do so,
enable the "colour wheel" toggle beside the Onion Skinning toggle, and set
the colours accordingly.
- Different numbers of ghosts can be shown before/after the current frame
6) Grease Pencil datablocks are now attached to the scene by default instead of
the active object.
- For a long time, the object-attachment has proved to be quite problematic
for users to keep track of. Now that this is done at scene level, it is
easier for most users to use.
- An exception for old files (and for any addons which may benefit from object
attachment instead), is that if the active object has a Grease Pencil datablock,
that will be used instead.
- It is not currently possible to choose object-attachment from the UI, but
it is simple to do this from the console instead, by doing:
context.active_object.grease_pencil = bpy.data.grease_pencil["blah"]
7) Various UI Cleanups
- The layers UI has been cleaned up to use a list instead of the nested-panels
design. Apart from saving space, this is also much nicer to look at now.
- The UI code is now all defined in Python. To support this, it has been necessary
to add some new context properties to make it easier to access these settings.
e.g. "gpencil_data" for the datablock
"active_gpencil_layer" and "active_gpencil_frame" for active data,
"editable_gpencil_strokes" for the strokes that can be edited
- The "stroke placement/alignment" settings (previously "Drawing Settings" at the
bottom of the Grease Pencil panel in the Properties Region) is now located in
the toolbar. These were more toolsettings than properties for how GPencil got drawn.
- "Use Sketching Sessions" has been renamed "Continuous Drawing", as per a
suggestion for an earlier discussion on developer.blender.org
- By default, the painting operator will wait for a mouse button to be pressed
before it starts creating the stroke. This is to make it easier to include
this operator in various toolbars/menus/etc. To get it immediately starting
(as when you hold down DKEy to draw), set "wait_for_input" to False.
- GPencil Layers can be rearranged in the "Grease Pencil" mode of the Action Editor
- Toolbar panels have been added to all the other editors which support these.
8) Pie menus for quick-access to tools
A set of experimental pie menus has been included for quick access to many
tools and settings. It is not necessary to use these to get things done,
but they have been designed to help make certain common tasks easier.
- Ctrl-D = The main pie menu. Reveals tools in a context sensitive and
spatially stable manner.
- D Q = "Quick Settings" pie. This allows quick access to the active
layer's settings. Notably, colours, thickness, and turning
onion skinning on/off.
2014-12-01 01:52:06 +13:00
|
|
|
case NC_GPENCIL:
|
|
|
|
if (ELEM(wmn->action, NA_EDITED, NA_SELECTED)) {
|
|
|
|
ED_area_tag_redraw(sa);
|
|
|
|
}
|
|
|
|
break;
|
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
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-26 22:47:05 +00:00
|
|
|
static void node_area_refresh(const struct bContext *C, ScrArea *sa)
|
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
|
|
|
{
|
|
|
|
/* default now: refresh node is starting preview */
|
2012-07-01 09:54:44 +00:00
|
|
|
SpaceNode *snode = sa->spacedata.first;
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2013-03-18 16:34:57 +00:00
|
|
|
snode_set_context(C);
|
2009-10-07 14:48:29 +00:00
|
|
|
|
2013-03-19 13:40:16 +00:00
|
|
|
if (snode->nodetree) {
|
2013-03-18 16:34:57 +00:00
|
|
|
if (snode->nodetree->type == NTREE_SHADER) {
|
2012-03-24 06:38:07 +00:00
|
|
|
if (GS(snode->id->name) == ID_MA) {
|
2012-07-01 09:54:44 +00:00
|
|
|
Material *ma = (Material *)snode->id;
|
2019-03-26 21:16:47 +11:00
|
|
|
if (ma->use_nodes) {
|
2011-11-02 18:55:32 +00:00
|
|
|
ED_preview_shader_job(C, sa, snode->id, NULL, NULL, 100, 100, PR_NODE_RENDER);
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
2011-11-02 18:55:32 +00:00
|
|
|
}
|
2012-03-24 06:38:07 +00:00
|
|
|
else if (GS(snode->id->name) == ID_LA) {
|
2019-02-27 10:46:48 +11:00
|
|
|
Light *la = (Light *)snode->id;
|
2019-03-26 21:16:47 +11:00
|
|
|
if (la->use_nodes) {
|
2011-11-02 18:55:32 +00:00
|
|
|
ED_preview_shader_job(C, sa, snode->id, NULL, NULL, 100, 100, PR_NODE_RENDER);
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
2011-11-02 18:55:32 +00:00
|
|
|
}
|
2012-03-24 06:38:07 +00:00
|
|
|
else if (GS(snode->id->name) == ID_WO) {
|
2012-07-01 09:54:44 +00:00
|
|
|
World *wo = (World *)snode->id;
|
2019-03-26 21:16:47 +11:00
|
|
|
if (wo->use_nodes) {
|
2011-11-02 18:55:32 +00:00
|
|
|
ED_preview_shader_job(C, sa, snode->id, NULL, NULL, 100, 100, PR_NODE_RENDER);
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
2011-11-02 18:55:32 +00:00
|
|
|
}
|
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
|
|
|
}
|
2013-03-18 16:34:57 +00:00
|
|
|
else if (snode->nodetree->type == NTREE_COMPOSIT) {
|
2012-07-01 09:54:44 +00:00
|
|
|
Scene *scene = (Scene *)snode->id;
|
2012-03-24 06:38:07 +00:00
|
|
|
if (scene->use_nodes) {
|
2011-02-07 16:41:57 +00:00
|
|
|
/* recalc is set on 3d view changes for auto compo */
|
2012-03-24 06:38:07 +00:00
|
|
|
if (snode->recalc) {
|
2012-07-01 09:54:44 +00:00
|
|
|
snode->recalc = 0;
|
|
|
|
node_render_changed_exec((struct bContext *)C, NULL);
|
2011-02-07 16:41:57 +00:00
|
|
|
}
|
2012-08-03 20:56:04 +00:00
|
|
|
else {
|
|
|
|
ED_node_composite_job(C, snode->nodetree, scene);
|
|
|
|
}
|
2011-02-07 16:41:57 +00:00
|
|
|
}
|
2009-01-27 17:12:40 +00:00
|
|
|
}
|
2013-03-18 16:34:57 +00:00
|
|
|
else if (snode->nodetree->type == NTREE_TEXTURE) {
|
2012-07-01 09:54:44 +00:00
|
|
|
Tex *tex = (Tex *)snode->id;
|
2012-03-24 06:38:07 +00:00
|
|
|
if (tex->use_nodes) {
|
2009-10-07 14:48:29 +00:00
|
|
|
ED_preview_shader_job(C, sa, snode->id, NULL, NULL, 100, 100, PR_NODE_RENDER);
|
2009-08-19 15:45:16 +00:00
|
|
|
}
|
2009-08-19 00:46:06 +00:00
|
|
|
}
|
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
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-12-13 18:09:49 +00:00
|
|
|
static SpaceLink *node_duplicate(SpaceLink *sl)
|
|
|
|
{
|
2013-03-18 18:25:05 +00:00
|
|
|
SpaceNode *snode = (SpaceNode *)sl;
|
2013-03-18 16:34:57 +00:00
|
|
|
SpaceNode *snoden = MEM_dupallocN(snode);
|
2012-07-01 09:54:44 +00:00
|
|
|
|
2013-12-09 11:54:00 +01:00
|
|
|
BLI_duplicatelist(&snoden->treepath, &snode->treepath);
|
|
|
|
|
2008-12-13 18:09:49 +00:00
|
|
|
/* clear or remove stuff from old */
|
2014-02-08 06:07:10 +11:00
|
|
|
BLI_listbase_clear(&snoden->linkdrag);
|
2013-12-09 11:54:00 +01:00
|
|
|
|
|
|
|
/* Note: no need to set node tree user counts,
|
|
|
|
* the editor only keeps at least 1 (id_us_ensure_real),
|
|
|
|
* which is already done by the original SpaceNode.
|
|
|
|
*/
|
2012-07-01 09:54:44 +00:00
|
|
|
|
2008-12-13 18:09:49 +00:00
|
|
|
return (SpaceLink *)snoden;
|
|
|
|
}
|
|
|
|
|
2009-11-11 08:12:54 +00:00
|
|
|
|
|
|
|
/* add handlers, stuff you only do once or on area/region changes */
|
2015-11-28 17:14:45 +01:00
|
|
|
static void node_buttons_region_init(wmWindowManager *wm, ARegion *ar)
|
2009-01-13 19:28:18 +00:00
|
|
|
{
|
2009-11-11 08:12:54 +00:00
|
|
|
wmKeyMap *keymap;
|
|
|
|
|
|
|
|
ED_region_panels_init(wm, ar);
|
2012-07-01 09:54:44 +00:00
|
|
|
|
2018-08-31 13:36:14 +10:00
|
|
|
keymap = WM_keymap_ensure(wm->defaultconf, "Node Generic", SPACE_NODE, 0);
|
2009-11-11 08:12:54 +00:00
|
|
|
WM_event_add_keymap_handler(&ar->handlers, keymap);
|
2009-01-13 19:28:18 +00:00
|
|
|
}
|
|
|
|
|
2015-11-28 17:14:45 +01:00
|
|
|
static void node_buttons_region_draw(const bContext *C, ARegion *ar)
|
2009-01-13 19:28:18 +00:00
|
|
|
{
|
2018-06-11 19:30:48 +02:00
|
|
|
ED_region_panels(C, ar);
|
2009-01-13 19:28:18 +00:00
|
|
|
}
|
|
|
|
|
2012-12-12 12:50:39 +00:00
|
|
|
/* add handlers, stuff you only do once or on area/region changes */
|
2015-11-28 17:14:45 +01:00
|
|
|
static void node_toolbar_region_init(wmWindowManager *wm, ARegion *ar)
|
2012-12-12 12:50:39 +00:00
|
|
|
{
|
|
|
|
wmKeyMap *keymap;
|
|
|
|
|
|
|
|
ED_region_panels_init(wm, ar);
|
|
|
|
|
2018-08-31 13:36:14 +10:00
|
|
|
keymap = WM_keymap_ensure(wm->defaultconf, "Node Generic", SPACE_NODE, 0);
|
2012-12-12 12:50:39 +00:00
|
|
|
WM_event_add_keymap_handler(&ar->handlers, keymap);
|
|
|
|
}
|
|
|
|
|
2015-11-28 17:14:45 +01:00
|
|
|
static void node_toolbar_region_draw(const bContext *C, ARegion *ar)
|
2012-12-12 12:50:39 +00:00
|
|
|
{
|
2018-06-11 19:30:48 +02:00
|
|
|
ED_region_panels(C, ar);
|
2012-12-12 12:50:39 +00:00
|
|
|
}
|
|
|
|
|
2012-05-22 14:13:33 +00:00
|
|
|
static void node_cursor(wmWindow *win, ScrArea *sa, ARegion *ar)
|
|
|
|
{
|
2012-07-01 09:54:44 +00:00
|
|
|
SpaceNode *snode = sa->spacedata.first;
|
|
|
|
|
2012-05-22 14:13:33 +00:00
|
|
|
/* convert mouse coordinates to v2d space */
|
|
|
|
UI_view2d_region_to_view(&ar->v2d, win->eventstate->x - ar->winrct.xmin, win->eventstate->y - ar->winrct.ymin,
|
2012-08-08 17:37:02 +00:00
|
|
|
&snode->cursor[0], &snode->cursor[1]);
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2013-09-05 13:03:03 +00:00
|
|
|
/* here snode->cursor is used to detect the node edge for sizing */
|
|
|
|
node_set_cursor(win, snode, snode->cursor);
|
2012-07-01 09:54:44 +00:00
|
|
|
|
2013-09-05 13:03:03 +00:00
|
|
|
/* XXX snode->cursor is in placing new nodes space */
|
|
|
|
snode->cursor[0] /= UI_DPI_FAC;
|
|
|
|
snode->cursor[1] /= UI_DPI_FAC;
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2012-05-22 14:13:33 +00:00
|
|
|
}
|
|
|
|
|
2015-11-28 17:14:45 +01:00
|
|
|
/* Initialize main region, setting handlers. */
|
|
|
|
static void node_main_region_init(wmWindowManager *wm, ARegion *ar)
|
2008-12-13 18:09:49 +00:00
|
|
|
{
|
2009-09-17 21:36:02 +00:00
|
|
|
wmKeyMap *keymap;
|
2010-05-12 04:25:33 +00:00
|
|
|
ListBase *lb;
|
2012-07-01 09:54:44 +00:00
|
|
|
|
2008-12-17 10:25:02 +00:00
|
|
|
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_CUSTOM, ar->winx, ar->winy);
|
2012-07-01 09:54:44 +00:00
|
|
|
|
2009-11-11 08:12:54 +00:00
|
|
|
/* own keymaps */
|
2018-08-31 13:36:14 +10:00
|
|
|
keymap = WM_keymap_ensure(wm->defaultconf, "Node Generic", SPACE_NODE, 0);
|
2009-11-11 08:12:54 +00:00
|
|
|
WM_event_add_keymap_handler(&ar->handlers, keymap);
|
2012-07-01 09:54:44 +00:00
|
|
|
|
2018-08-31 13:36:14 +10:00
|
|
|
keymap = WM_keymap_ensure(wm->defaultconf, "Node Editor", SPACE_NODE, 0);
|
2008-12-13 18:09:49 +00:00
|
|
|
WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
|
2012-07-01 09:54:44 +00:00
|
|
|
|
2010-05-12 04:25:33 +00:00
|
|
|
/* add drop boxes */
|
|
|
|
lb = WM_dropboxmap_find("Node Editor", SPACE_NODE, RGN_TYPE_WINDOW);
|
2012-07-01 09:54:44 +00:00
|
|
|
|
2010-05-12 04:25:33 +00:00
|
|
|
WM_event_add_dropbox_handler(&ar->handlers, lb);
|
2008-12-13 18:09:49 +00:00
|
|
|
}
|
|
|
|
|
2015-11-28 17:14:45 +01:00
|
|
|
static void node_main_region_draw(const bContext *C, ARegion *ar)
|
2008-12-13 18:09:49 +00:00
|
|
|
{
|
2013-03-18 16:34:57 +00:00
|
|
|
drawnodespace(C, ar);
|
2008-12-13 18:09:49 +00:00
|
|
|
}
|
|
|
|
|
2010-05-12 04:25:33 +00:00
|
|
|
|
|
|
|
/* ************* dropboxes ************* */
|
|
|
|
|
2018-08-07 10:38:20 +02:00
|
|
|
static bool node_ima_drop_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent *UNUSED(event), const char **UNUSED(tooltip))
|
2010-05-12 04:25:33 +00:00
|
|
|
{
|
2018-08-07 10:57:09 +02:00
|
|
|
if (drag->type == WM_DRAG_PATH) {
|
2019-01-15 23:24:20 +11:00
|
|
|
/* rule might not work? */
|
|
|
|
return (ELEM(drag->icon, 0, ICON_FILE_IMAGE, ICON_FILE_MOVIE));
|
2010-05-12 04:25:33 +00:00
|
|
|
}
|
2018-08-07 10:57:09 +02:00
|
|
|
else {
|
|
|
|
return WM_drag_ID(drag, ID_IM) != NULL;
|
2010-05-12 04:25:33 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-08-07 10:38:20 +02:00
|
|
|
static bool node_mask_drop_poll(bContext *UNUSED(C), wmDrag *drag, const wmEvent *UNUSED(event), const char **UNUSED(tooltip))
|
2013-07-22 19:24:39 +00:00
|
|
|
{
|
2018-08-07 10:57:09 +02:00
|
|
|
return WM_drag_ID(drag, ID_MSK) != NULL;
|
2013-07-22 19:24:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void node_id_drop_copy(wmDrag *drag, wmDropBox *drop)
|
|
|
|
{
|
2018-08-05 12:14:55 +02:00
|
|
|
ID *id = WM_drag_ID(drag, 0);
|
2013-07-22 19:24:39 +00:00
|
|
|
|
|
|
|
RNA_string_set(drop->ptr, "name", id->name + 2);
|
|
|
|
}
|
|
|
|
|
2010-05-12 04:25:33 +00:00
|
|
|
static void node_id_path_drop_copy(wmDrag *drag, wmDropBox *drop)
|
|
|
|
{
|
2018-08-05 12:14:55 +02:00
|
|
|
ID *id = WM_drag_ID(drag, 0);
|
2012-07-01 09:54:44 +00:00
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (id) {
|
2012-07-01 09:54:44 +00:00
|
|
|
RNA_string_set(drop->ptr, "name", id->name + 2);
|
2014-11-30 15:05:03 +01:00
|
|
|
RNA_struct_property_unset(drop->ptr, "filepath");
|
2010-05-12 04:25:33 +00:00
|
|
|
}
|
2014-11-30 15:05:03 +01:00
|
|
|
else if (drag->path[0]) {
|
2010-06-14 03:52:10 +00:00
|
|
|
RNA_string_set(drop->ptr, "filepath", drag->path);
|
2014-11-30 15:05:03 +01:00
|
|
|
RNA_struct_property_unset(drop->ptr, "name");
|
2014-11-30 17:18:03 +01:00
|
|
|
}
|
2010-05-12 04:25:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* this region dropbox definition */
|
|
|
|
static void node_dropboxes(void)
|
|
|
|
{
|
2012-07-01 09:54:44 +00:00
|
|
|
ListBase *lb = WM_dropboxmap_find("Node Editor", SPACE_NODE, RGN_TYPE_WINDOW);
|
|
|
|
|
2013-07-22 19:24:39 +00:00
|
|
|
WM_dropbox_add(lb, "NODE_OT_add_file", node_ima_drop_poll, node_id_path_drop_copy);
|
|
|
|
WM_dropbox_add(lb, "NODE_OT_add_mask", node_mask_drop_poll, node_id_drop_copy);
|
2012-07-01 09:54:44 +00:00
|
|
|
|
2010-05-12 04:25:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* ************* end drop *********** */
|
|
|
|
|
|
|
|
|
2008-12-13 18:09:49 +00:00
|
|
|
/* add handlers, stuff you only do once or on area/region changes */
|
2015-11-28 17:14:45 +01:00
|
|
|
static void node_header_region_init(wmWindowManager *UNUSED(wm), ARegion *ar)
|
2008-12-13 18:09:49 +00:00
|
|
|
{
|
2009-08-19 00:55:30 +00:00
|
|
|
ED_region_header_init(ar);
|
2008-12-13 18:09:49 +00:00
|
|
|
}
|
|
|
|
|
2015-11-28 17:14:45 +01:00
|
|
|
static void node_header_region_draw(const bContext *C, ARegion *ar)
|
2008-12-13 18:09:49 +00:00
|
|
|
{
|
2010-03-22 09:30:00 +00:00
|
|
|
/* find and set the context */
|
2013-03-18 16:34:57 +00:00
|
|
|
snode_set_context(C);
|
2009-08-19 00:55:30 +00:00
|
|
|
|
|
|
|
ED_region_header(C, ar);
|
2008-12-13 18:09:49 +00:00
|
|
|
}
|
|
|
|
|
2015-11-28 17:14:45 +01:00
|
|
|
/* used for header + main region */
|
2017-05-02 09:58:01 +10:00
|
|
|
static void node_region_listener(
|
2018-07-04 15:14:57 +02:00
|
|
|
wmWindow *UNUSED(win), ScrArea *UNUSED(sa), ARegion *ar,
|
2017-05-02 09:58:01 +10:00
|
|
|
wmNotifier *wmn, const Scene *UNUSED(scene))
|
2008-12-13 18:09:49 +00:00
|
|
|
{
|
2018-07-15 14:24:10 +02:00
|
|
|
wmGizmoMap *gzmap = ar->gizmo_map;
|
2017-05-29 22:06:59 +10:00
|
|
|
|
2008-12-13 18:09:49 +00:00
|
|
|
/* context changes */
|
2012-04-28 06:31:57 +00:00
|
|
|
switch (wmn->category) {
|
2009-11-12 01:22:51 +00:00
|
|
|
case NC_SPACE:
|
2017-05-29 22:06:59 +10:00
|
|
|
switch (wmn->data) {
|
|
|
|
case ND_SPACE_NODE:
|
|
|
|
ED_region_tag_redraw(ar);
|
|
|
|
break;
|
|
|
|
case ND_SPACE_NODE_VIEW:
|
2018-07-15 14:24:10 +02:00
|
|
|
WM_gizmomap_tag_refresh(gzmap);
|
2017-05-29 22:06:59 +10:00
|
|
|
break;
|
|
|
|
}
|
2009-11-12 01:22:51 +00:00
|
|
|
break;
|
2010-01-27 11:56:14 +00:00
|
|
|
case NC_SCREEN:
|
Main Workspace Integration
This commit does the main integration of workspaces, which is a design we agreed on during the 2.8 UI workshop (see https://wiki.blender.org/index.php/Dev:2.8/UI/Workshop_Writeup)
Workspaces should generally be stable, I'm not aware of any remaining bugs (or I've forgotten them :) ). If you find any, let me know!
(Exception: mode switching button might get out of sync with actual mode in some cases, would consider that a limitation/ToDo. Needs to be resolved at some point.)
== Main Changes/Features
* Introduces the new Workspaces as data-blocks.
* Allow storing a number of custom workspaces as part of the user configuration. Needs further work to allow adding and deleting individual workspaces.
* Bundle a default workspace configuration with Blender (current screen-layouts converted to workspaces).
* Pressing button to add a workspace spawns a menu to select between "Duplicate Current" and the workspaces from the user configuration. If no workspaces are stored in the user configuration, the default workspaces are listed instead.
* Store screen-layouts (`bScreen`) per workspace.
* Store an active screen-layout per workspace. Changing the workspace will enable this layout.
* Store active mode in workspace. Changing the workspace will also enter the mode of the new workspace. (Note that we still store the active mode in the object, moving this completely to workspaces is a separate project.)
* Store an active render layer per workspace.
* Moved mode switch from 3D View header to Info Editor header.
* Store active scene in window (not directly workspace related, but overlaps quite a bit).
* Removed 'Use Global Scene' User Preference option.
* Compatibility with old files - a new workspace is created for every screen-layout of old files. Old Blender versions should be able to read files saved with workspace support as well.
* Default .blend only contains one workspace ("General").
* Support appending workspaces.
Opening files without UI and commandline rendering should work fine.
Note that the UI is temporary! We plan to introduce a new global topbar
that contains the workspace options and tabs for switching workspaces.
== Technical Notes
* Workspaces are data-blocks.
* Adding and removing `bScreen`s should be done through `ED_workspace_layout` API now.
* A workspace can be active in multiple windows at the same time.
* The mode menu (which is now in the Info Editor header) doesn't display "Grease Pencil Edit" mode anymore since its availability depends on the active editor. Will be fixed by making Grease Pencil an own object type (as planned).
* The button to change the active workspace object mode may get out of sync with the mode of the active object. Will either be resolved by moving mode out of object data, or we'll disable workspace modes again (there's a `#define USE_WORKSPACE_MODE` for that).
* Screen-layouts (`bScreen`) are IDs and thus stored in a main list-base. Had to add a wrapper `WorkSpaceLayout` so we can store them in a list-base within workspaces, too. On the long run we could completely replace `bScreen` by workspace structs.
* `WorkSpace` types use some special compiler trickery to allow marking structs and struct members as private. BKE_workspace API should be used for accessing those.
* Added scene operators `SCENE_OT_`. Was previously done through screen operators.
== BPY API Changes
* Removed `Screen.scene`, added `Window.scene`
* Removed `UserPreferencesView.use_global_scene`
* Added `Context.workspace`, `Window.workspace` and `BlendData.workspaces`
* Added `bpy.types.WorkSpace` containing `screens`, `object_mode` and `render_layer`
* Added Screen.layout_name for the layout name that'll be displayed in the UI (may differ from internal name)
== What's left?
* There are a few open design questions (T50521). We should find the needed answers and implement them.
* Allow adding and removing individual workspaces from workspace configuration (needs UI design).
* Get the override system ready and support overrides per workspace.
* Support custom UI setups as part of workspaces (hidden panels, hidden buttons, customizable toolbars, etc).
* Allow enabling add-ons per workspace.
* Support custom workspace keymaps.
* Remove special exception for workspaces in linking code (so they're always appended, never linked). Depends on a few things, so best to solve later.
* Get the topbar done.
* Workspaces need a proper icon, current one is just a placeholder :)
Reviewed By: campbellbarton, mont29
Tags: #user_interface, #bf_blender_2.8
Maniphest Tasks: T50521
Differential Revision: https://developer.blender.org/D2451
2017-06-01 19:56:58 +02:00
|
|
|
if (wmn->data == ND_LAYOUTSET || wmn->action == NA_EDITED) {
|
2018-07-15 14:24:10 +02:00
|
|
|
WM_gizmomap_tag_refresh(gzmap);
|
2017-05-29 22:06:59 +10:00
|
|
|
}
|
2012-07-03 16:04:26 +00:00
|
|
|
switch (wmn->data) {
|
|
|
|
case ND_ANIMPLAY:
|
Main Workspace Integration
This commit does the main integration of workspaces, which is a design we agreed on during the 2.8 UI workshop (see https://wiki.blender.org/index.php/Dev:2.8/UI/Workshop_Writeup)
Workspaces should generally be stable, I'm not aware of any remaining bugs (or I've forgotten them :) ). If you find any, let me know!
(Exception: mode switching button might get out of sync with actual mode in some cases, would consider that a limitation/ToDo. Needs to be resolved at some point.)
== Main Changes/Features
* Introduces the new Workspaces as data-blocks.
* Allow storing a number of custom workspaces as part of the user configuration. Needs further work to allow adding and deleting individual workspaces.
* Bundle a default workspace configuration with Blender (current screen-layouts converted to workspaces).
* Pressing button to add a workspace spawns a menu to select between "Duplicate Current" and the workspaces from the user configuration. If no workspaces are stored in the user configuration, the default workspaces are listed instead.
* Store screen-layouts (`bScreen`) per workspace.
* Store an active screen-layout per workspace. Changing the workspace will enable this layout.
* Store active mode in workspace. Changing the workspace will also enter the mode of the new workspace. (Note that we still store the active mode in the object, moving this completely to workspaces is a separate project.)
* Store an active render layer per workspace.
* Moved mode switch from 3D View header to Info Editor header.
* Store active scene in window (not directly workspace related, but overlaps quite a bit).
* Removed 'Use Global Scene' User Preference option.
* Compatibility with old files - a new workspace is created for every screen-layout of old files. Old Blender versions should be able to read files saved with workspace support as well.
* Default .blend only contains one workspace ("General").
* Support appending workspaces.
Opening files without UI and commandline rendering should work fine.
Note that the UI is temporary! We plan to introduce a new global topbar
that contains the workspace options and tabs for switching workspaces.
== Technical Notes
* Workspaces are data-blocks.
* Adding and removing `bScreen`s should be done through `ED_workspace_layout` API now.
* A workspace can be active in multiple windows at the same time.
* The mode menu (which is now in the Info Editor header) doesn't display "Grease Pencil Edit" mode anymore since its availability depends on the active editor. Will be fixed by making Grease Pencil an own object type (as planned).
* The button to change the active workspace object mode may get out of sync with the mode of the active object. Will either be resolved by moving mode out of object data, or we'll disable workspace modes again (there's a `#define USE_WORKSPACE_MODE` for that).
* Screen-layouts (`bScreen`) are IDs and thus stored in a main list-base. Had to add a wrapper `WorkSpaceLayout` so we can store them in a list-base within workspaces, too. On the long run we could completely replace `bScreen` by workspace structs.
* `WorkSpace` types use some special compiler trickery to allow marking structs and struct members as private. BKE_workspace API should be used for accessing those.
* Added scene operators `SCENE_OT_`. Was previously done through screen operators.
== BPY API Changes
* Removed `Screen.scene`, added `Window.scene`
* Removed `UserPreferencesView.use_global_scene`
* Added `Context.workspace`, `Window.workspace` and `BlendData.workspaces`
* Added `bpy.types.WorkSpace` containing `screens`, `object_mode` and `render_layer`
* Added Screen.layout_name for the layout name that'll be displayed in the UI (may differ from internal name)
== What's left?
* There are a few open design questions (T50521). We should find the needed answers and implement them.
* Allow adding and removing individual workspaces from workspace configuration (needs UI design).
* Get the override system ready and support overrides per workspace.
* Support custom UI setups as part of workspaces (hidden panels, hidden buttons, customizable toolbars, etc).
* Allow enabling add-ons per workspace.
* Support custom workspace keymaps.
* Remove special exception for workspaces in linking code (so they're always appended, never linked). Depends on a few things, so best to solve later.
* Get the topbar done.
* Workspaces need a proper icon, current one is just a placeholder :)
Reviewed By: campbellbarton, mont29
Tags: #user_interface, #bf_blender_2.8
Maniphest Tasks: T50521
Differential Revision: https://developer.blender.org/D2451
2017-06-01 19:56:58 +02:00
|
|
|
case ND_LAYER:
|
2012-07-03 16:04:26 +00:00
|
|
|
ED_region_tag_redraw(ar);
|
|
|
|
break;
|
|
|
|
}
|
2010-01-27 11:56:14 +00:00
|
|
|
break;
|
2017-06-18 16:26:09 +02:00
|
|
|
case NC_WM:
|
2019-03-26 21:16:47 +11:00
|
|
|
if (wmn->data == ND_JOB) {
|
2017-06-18 16:26:09 +02:00
|
|
|
ED_region_tag_redraw(ar);
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
2017-06-18 16:26:09 +02:00
|
|
|
break;
|
2008-12-28 00:08:34 +00:00
|
|
|
case NC_SCENE:
|
2017-05-29 22:06:59 +10:00
|
|
|
ED_region_tag_redraw(ar);
|
|
|
|
if (wmn->data == ND_RENDER_RESULT) {
|
2018-07-15 14:24:10 +02:00
|
|
|
WM_gizmomap_tag_refresh(gzmap);
|
2017-05-29 22:06:59 +10:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case NC_NODE:
|
|
|
|
ED_region_tag_redraw(ar);
|
|
|
|
if (ELEM(wmn->action, NA_EDITED, NA_SELECTED)) {
|
2018-07-15 14:24:10 +02:00
|
|
|
WM_gizmomap_tag_refresh(gzmap);
|
2017-05-29 22:06:59 +10:00
|
|
|
}
|
|
|
|
break;
|
2008-12-28 00:08:34 +00:00
|
|
|
case NC_MATERIAL:
|
2009-08-18 14:31:13 +00:00
|
|
|
case NC_TEXTURE:
|
2013-02-14 17:09:19 +00:00
|
|
|
case NC_WORLD:
|
2014-07-11 16:51:04 +09:00
|
|
|
case NC_LINESTYLE:
|
2009-08-18 14:31:13 +00:00
|
|
|
ED_region_tag_redraw(ar);
|
|
|
|
break;
|
2011-11-02 18:55:32 +00:00
|
|
|
case NC_OBJECT:
|
2019-03-26 21:16:47 +11:00
|
|
|
if (wmn->data == ND_OB_SHADING) {
|
2011-11-02 18:55:32 +00:00
|
|
|
ED_region_tag_redraw(ar);
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
2011-11-02 18:55:32 +00:00
|
|
|
break;
|
2009-12-10 09:58:10 +00:00
|
|
|
case NC_ID:
|
2019-03-26 21:16:47 +11:00
|
|
|
if (wmn->action == NA_RENAME) {
|
2009-12-13 23:51:41 +00:00
|
|
|
ED_region_tag_redraw(ar);
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
2009-12-10 09:58:10 +00:00
|
|
|
break;
|
2012-10-05 19:51:11 +00:00
|
|
|
case NC_GPENCIL:
|
2019-03-26 21:16:47 +11:00
|
|
|
if (wmn->action == NA_EDITED) {
|
2012-10-05 19:51:11 +00:00
|
|
|
ED_region_tag_redraw(ar);
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
|
|
|
else if (wmn->data & ND_GPENCIL_EDITMODE) {
|
Grease Pencil - Storyboarding Features (merge from GPencil_EditStrokes branch)
This merge-commit brings in a number of new features and workflow/UI improvements for
working with Grease Pencil. While these were originally targetted at improving
the workflow for creating 3D storyboards in Blender using the Grease Pencil,
many of these changes should also prove useful in other workflows too.
The main highlights here are:
1) It is now possible to edit Grease Pencil strokes
- Use D Tab, or toggle the "Enable Editing" toggles in the Toolbar/Properties regions
to enter "Stroke Edit Mode". In this mode, many common editing tools will
operate on Grease Pencil stroke points instead.
- Tools implemented include Select, Select All/Border/Circle/Linked/More/Less,
Grab, Rotate, Scale, Bend, Shear, To Sphere, Mirror, Duplicate, Delete.
- Proportional Editing works when using the transform tools
2) Grease Pencil stroke settings can now be animated
NOTE: Currently drivers don't work, but if time allows, this may still be
added before the release.
3) Strokes can be drawn with "filled" interiors, using a separate set of
colour/opacity settings to the ones used for the lines themselves.
This makes use of OpenGL filled polys, which has the limitation of only
being able to fill convex shapes. Some artifacts may be visible on concave
shapes (e.g. pacman's mouth will be overdrawn)
4) "Volumetric Strokes" - An alternative drawing technique for stroke drawing
has been added which draws strokes as a series of screen-aligned discs.
While this was originally a partial experimental technique at getting better
quality 3D lines, the effects possible using this technique were interesting
enough to warrant making this a dedicated feature. Best results when partial
opacity and large stroke widths are used.
5) Improved Onion Skinning Support
- Different colours can be selected for the before/after ghosts. To do so,
enable the "colour wheel" toggle beside the Onion Skinning toggle, and set
the colours accordingly.
- Different numbers of ghosts can be shown before/after the current frame
6) Grease Pencil datablocks are now attached to the scene by default instead of
the active object.
- For a long time, the object-attachment has proved to be quite problematic
for users to keep track of. Now that this is done at scene level, it is
easier for most users to use.
- An exception for old files (and for any addons which may benefit from object
attachment instead), is that if the active object has a Grease Pencil datablock,
that will be used instead.
- It is not currently possible to choose object-attachment from the UI, but
it is simple to do this from the console instead, by doing:
context.active_object.grease_pencil = bpy.data.grease_pencil["blah"]
7) Various UI Cleanups
- The layers UI has been cleaned up to use a list instead of the nested-panels
design. Apart from saving space, this is also much nicer to look at now.
- The UI code is now all defined in Python. To support this, it has been necessary
to add some new context properties to make it easier to access these settings.
e.g. "gpencil_data" for the datablock
"active_gpencil_layer" and "active_gpencil_frame" for active data,
"editable_gpencil_strokes" for the strokes that can be edited
- The "stroke placement/alignment" settings (previously "Drawing Settings" at the
bottom of the Grease Pencil panel in the Properties Region) is now located in
the toolbar. These were more toolsettings than properties for how GPencil got drawn.
- "Use Sketching Sessions" has been renamed "Continuous Drawing", as per a
suggestion for an earlier discussion on developer.blender.org
- By default, the painting operator will wait for a mouse button to be pressed
before it starts creating the stroke. This is to make it easier to include
this operator in various toolbars/menus/etc. To get it immediately starting
(as when you hold down DKEy to draw), set "wait_for_input" to False.
- GPencil Layers can be rearranged in the "Grease Pencil" mode of the Action Editor
- Toolbar panels have been added to all the other editors which support these.
8) Pie menus for quick-access to tools
A set of experimental pie menus has been included for quick access to many
tools and settings. It is not necessary to use these to get things done,
but they have been designed to help make certain common tasks easier.
- Ctrl-D = The main pie menu. Reveals tools in a context sensitive and
spatially stable manner.
- D Q = "Quick Settings" pie. This allows quick access to the active
layer's settings. Notably, colours, thickness, and turning
onion skinning on/off.
2014-12-01 01:52:06 +13:00
|
|
|
ED_region_tag_redraw(ar);
|
2019-03-26 21:16:47 +11:00
|
|
|
}
|
2012-10-05 19:51:11 +00:00
|
|
|
break;
|
2008-12-28 00:08:34 +00:00
|
|
|
}
|
2008-12-13 18:09:49 +00:00
|
|
|
}
|
|
|
|
|
2019-03-17 17:52:05 +01:00
|
|
|
const char *node_context_dir[] = {
|
|
|
|
"selected_nodes", "active_node", "light", "material", "world", NULL
|
|
|
|
};
|
2011-02-15 14:38:43 +00:00
|
|
|
|
2009-03-19 19:03:38 +00:00
|
|
|
static int node_context(const bContext *C, const char *member, bContextDataResult *result)
|
2009-01-02 23:58:03 +00:00
|
|
|
{
|
2012-07-01 09:54:44 +00:00
|
|
|
SpaceNode *snode = CTX_wm_space_node(C);
|
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (CTX_data_dir(member)) {
|
2011-02-15 14:38:43 +00:00
|
|
|
CTX_data_dir_set(result, node_context_dir);
|
2009-06-20 14:55:28 +00:00
|
|
|
return 1;
|
|
|
|
}
|
2012-03-24 06:38:07 +00:00
|
|
|
else if (CTX_data_equals(member, "selected_nodes")) {
|
2009-01-02 23:58:03 +00:00
|
|
|
bNode *node;
|
2012-07-01 09:54:44 +00:00
|
|
|
|
2012-03-24 06:38:07 +00:00
|
|
|
if (snode->edittree) {
|
2012-07-01 09:54:44 +00:00
|
|
|
for (node = snode->edittree->nodes.last; node; node = node->prev) {
|
2012-03-24 06:38:07 +00:00
|
|
|
if (node->flag & NODE_SELECT) {
|
2011-09-05 21:01:50 +00:00
|
|
|
CTX_data_list_add(result, &snode->edittree->id, &RNA_Node, node);
|
|
|
|
}
|
2009-01-02 23:58:03 +00:00
|
|
|
}
|
|
|
|
}
|
2010-04-24 19:26:05 +00:00
|
|
|
CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
|
2009-01-02 23:58:03 +00:00
|
|
|
return 1;
|
|
|
|
}
|
2012-03-24 06:38:07 +00:00
|
|
|
else if (CTX_data_equals(member, "active_node")) {
|
|
|
|
if (snode->edittree) {
|
2012-06-11 18:43:48 +00:00
|
|
|
bNode *node = nodeGetActive(snode->edittree);
|
|
|
|
CTX_data_pointer_set(result, &snode->edittree->id, &RNA_Node, node);
|
2011-09-05 21:01:50 +00:00
|
|
|
}
|
2012-06-11 18:43:48 +00:00
|
|
|
|
2011-09-05 21:01:50 +00:00
|
|
|
CTX_data_type_set(result, CTX_DATA_TYPE_POINTER);
|
|
|
|
return 1;
|
|
|
|
}
|
2013-03-18 16:34:57 +00:00
|
|
|
else if (CTX_data_equals(member, "node_previews")) {
|
|
|
|
if (snode->nodetree) {
|
|
|
|
CTX_data_pointer_set(result, &snode->nodetree->id, &RNA_NodeInstanceHash, snode->nodetree->previews);
|
|
|
|
}
|
|
|
|
|
|
|
|
CTX_data_type_set(result, CTX_DATA_TYPE_POINTER);
|
|
|
|
return 1;
|
|
|
|
}
|
2019-03-17 17:52:05 +01:00
|
|
|
else if (CTX_data_equals(member, "material")) {
|
|
|
|
if (snode->id && GS(snode->id->name) == ID_MA) {
|
|
|
|
CTX_data_id_pointer_set(result, snode->id);
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
else if (CTX_data_equals(member, "light")) {
|
|
|
|
if (snode->id && GS(snode->id->name) == ID_LA) {
|
|
|
|
CTX_data_id_pointer_set(result, snode->id);
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
else if (CTX_data_equals(member, "world")) {
|
|
|
|
if (snode->id && GS(snode->id->name) == ID_WO) {
|
|
|
|
CTX_data_id_pointer_set(result, snode->id);
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
2012-07-01 09:54:44 +00:00
|
|
|
|
2009-01-02 23:58:03 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2017-05-29 22:06:59 +10:00
|
|
|
static void node_widgets(void)
|
|
|
|
{
|
|
|
|
/* create the widgetmap for the area here */
|
2018-07-15 14:24:10 +02:00
|
|
|
wmGizmoMapType *gzmap_type = WM_gizmomaptype_ensure(
|
2018-07-14 23:49:00 +02:00
|
|
|
&(const struct wmGizmoMapType_Params){SPACE_NODE, RGN_TYPE_WINDOW});
|
2018-07-15 14:24:10 +02:00
|
|
|
WM_gizmogrouptype_append_and_link(gzmap_type, NODE_GGT_backdrop_transform);
|
|
|
|
WM_gizmogrouptype_append_and_link(gzmap_type, NODE_GGT_backdrop_crop);
|
|
|
|
WM_gizmogrouptype_append_and_link(gzmap_type, NODE_GGT_backdrop_sun_beams);
|
|
|
|
WM_gizmogrouptype_append_and_link(gzmap_type, NODE_GGT_backdrop_corner_pin);
|
2017-05-29 22:06:59 +10:00
|
|
|
}
|
|
|
|
|
ID-Remap - Step one: core work (cleanup and rework of generic ID datablock handling).
This commit changes a lot of how IDs are handled internally, especially the unlinking/freeing
processes. So far, this was very fuzy, to summarize cleanly deleting or replacing a datablock
was pretty much impossible, except for a few special cases.
Also, unlinking was handled by each datatype, in a rather messy and prone-to-errors way (quite
a few ID usages were missed or wrongly handled that way).
One of the main goal of id-remap branch was to cleanup this, and fatorize ID links handling
by using library_query utils to allow generic handling of those, which is now the case
(now, generic ID links handling is only "knwon" from readfile.c and library_query.c).
This commit also adds backends to allow live replacement and deletion of datablocks in Blender
(so-called 'remapping' process, where we replace all usages of a given ID pointer by a new one,
or NULL one in case of unlinking).
This will allow nice new features, like ability to easily reload or relocate libraries, real immediate
deletion of datablocks in blender, replacement of one datablock by another, etc.
Some of those are for next commits.
A word of warning: this commit is highly risky, because it affects potentially a lot in Blender core.
Though it was tested rather deeply, being totally impossible to check all possible ID usage cases,
it's likely there are some remaining issues and bugs in new code... Please report them! ;)
Review task: D2027 (https://developer.blender.org/D2027).
Reviewed by campbellbarton, thanks a bunch.
2016-06-22 17:29:38 +02:00
|
|
|
static void node_id_remap(ScrArea *UNUSED(sa), SpaceLink *slink, ID *old_id, ID *new_id)
|
|
|
|
{
|
|
|
|
SpaceNode *snode = (SpaceNode *)slink;
|
|
|
|
|
|
|
|
if (GS(old_id->name) == ID_SCE) {
|
|
|
|
if (snode->id == old_id) {
|
|
|
|
/* nasty DNA logic for SpaceNode:
|
|
|
|
* ideally should be handled by editor code, but would be bad level call
|
|
|
|
*/
|
|
|
|
BLI_freelistN(&snode->treepath);
|
|
|
|
|
|
|
|
/* XXX Untested in case new_id != NULL... */
|
|
|
|
snode->id = new_id;
|
|
|
|
snode->from = NULL;
|
|
|
|
snode->nodetree = NULL;
|
|
|
|
snode->edittree = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (GS(old_id->name) == ID_OB) {
|
|
|
|
if (snode->from == old_id) {
|
|
|
|
if (new_id == NULL) {
|
|
|
|
snode->flag &= ~SNODE_PIN;
|
|
|
|
}
|
|
|
|
snode->from = new_id;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (GS(old_id->name) == ID_GD) {
|
|
|
|
if ((ID *)snode->gpd == old_id) {
|
|
|
|
snode->gpd = (bGPdata *)new_id;
|
|
|
|
id_us_min(old_id);
|
|
|
|
id_us_plus(new_id);
|
|
|
|
}
|
|
|
|
}
|
2016-11-18 22:36:52 +01:00
|
|
|
else if (GS(old_id->name) == ID_NT) {
|
|
|
|
bNodeTreePath *path, *path_next;
|
|
|
|
|
|
|
|
for (path = snode->treepath.first; path; path = path->next) {
|
|
|
|
if ((ID *)path->nodetree == old_id) {
|
|
|
|
path->nodetree = (bNodeTree *)new_id;
|
|
|
|
id_us_min(old_id);
|
|
|
|
id_us_plus(new_id);
|
|
|
|
}
|
|
|
|
if (path == snode->treepath.first) {
|
|
|
|
/* first nodetree in path is same as snode->nodetree */
|
|
|
|
snode->nodetree = path->nodetree;
|
|
|
|
}
|
|
|
|
if (path->nodetree == NULL) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* remaining path entries are invalid, remove */
|
|
|
|
for (; path; path = path_next) {
|
|
|
|
path_next = path->next;
|
|
|
|
|
|
|
|
BLI_remlink(&snode->treepath, path);
|
|
|
|
MEM_freeN(path);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* edittree is just the last in the path,
|
|
|
|
* set this directly since the path may have been shortened above */
|
|
|
|
if (snode->treepath.last) {
|
|
|
|
path = snode->treepath.last;
|
|
|
|
snode->edittree = path->nodetree;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
snode->edittree = NULL;
|
|
|
|
}
|
|
|
|
}
|
ID-Remap - Step one: core work (cleanup and rework of generic ID datablock handling).
This commit changes a lot of how IDs are handled internally, especially the unlinking/freeing
processes. So far, this was very fuzy, to summarize cleanly deleting or replacing a datablock
was pretty much impossible, except for a few special cases.
Also, unlinking was handled by each datatype, in a rather messy and prone-to-errors way (quite
a few ID usages were missed or wrongly handled that way).
One of the main goal of id-remap branch was to cleanup this, and fatorize ID links handling
by using library_query utils to allow generic handling of those, which is now the case
(now, generic ID links handling is only "knwon" from readfile.c and library_query.c).
This commit also adds backends to allow live replacement and deletion of datablocks in Blender
(so-called 'remapping' process, where we replace all usages of a given ID pointer by a new one,
or NULL one in case of unlinking).
This will allow nice new features, like ability to easily reload or relocate libraries, real immediate
deletion of datablocks in blender, replacement of one datablock by another, etc.
Some of those are for next commits.
A word of warning: this commit is highly risky, because it affects potentially a lot in Blender core.
Though it was tested rather deeply, being totally impossible to check all possible ID usage cases,
it's likely there are some remaining issues and bugs in new code... Please report them! ;)
Review task: D2027 (https://developer.blender.org/D2027).
Reviewed by campbellbarton, thanks a bunch.
2016-06-22 17:29:38 +02:00
|
|
|
}
|
|
|
|
|
2018-05-29 09:19:06 +02:00
|
|
|
|
|
|
|
static int node_space_subtype_get(ScrArea *sa)
|
|
|
|
{
|
|
|
|
SpaceNode *snode = sa->spacedata.first;
|
|
|
|
return rna_node_tree_idname_to_enum(snode->tree_idname);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void node_space_subtype_set(ScrArea *sa, int value)
|
|
|
|
{
|
|
|
|
SpaceNode *snode = sa->spacedata.first;
|
|
|
|
ED_node_set_tree_type(snode, rna_node_tree_type_from_enum(value));
|
|
|
|
}
|
|
|
|
|
|
|
|
static void node_space_subtype_item_extend(
|
|
|
|
bContext *C, EnumPropertyItem **item, int *totitem)
|
|
|
|
{
|
|
|
|
bool free;
|
|
|
|
const EnumPropertyItem *item_src = RNA_enum_node_tree_types_itemf_impl(C, &free);
|
|
|
|
for (const EnumPropertyItem *item_iter = item_src; item_iter->identifier; item_iter++) {
|
|
|
|
RNA_enum_item_add(item, totitem, item_iter);
|
|
|
|
}
|
|
|
|
if (free) {
|
|
|
|
MEM_freeN((void *)item_src);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-12-13 18:09:49 +00:00
|
|
|
/* only called once, from space/spacetypes.c */
|
|
|
|
void ED_spacetype_node(void)
|
|
|
|
{
|
2012-07-01 09:54:44 +00:00
|
|
|
SpaceType *st = MEM_callocN(sizeof(SpaceType), "spacetype node");
|
2008-12-13 18:09:49 +00:00
|
|
|
ARegionType *art;
|
2012-07-01 09:54:44 +00:00
|
|
|
|
|
|
|
st->spaceid = SPACE_NODE;
|
2009-12-19 22:37:51 +00:00
|
|
|
strncpy(st->name, "Node", BKE_ST_MAXNAME);
|
2012-07-01 09:54:44 +00:00
|
|
|
|
|
|
|
st->new = node_new;
|
|
|
|
st->free = node_free;
|
|
|
|
st->init = node_init;
|
|
|
|
st->duplicate = node_duplicate;
|
|
|
|
st->operatortypes = node_operatortypes;
|
|
|
|
st->keymap = node_keymap;
|
|
|
|
st->listener = node_area_listener;
|
|
|
|
st->refresh = node_area_refresh;
|
|
|
|
st->context = node_context;
|
2010-05-12 04:25:33 +00:00
|
|
|
st->dropboxes = node_dropboxes;
|
2018-07-14 23:49:00 +02:00
|
|
|
st->gizmos = node_widgets;
|
ID-Remap - Step one: core work (cleanup and rework of generic ID datablock handling).
This commit changes a lot of how IDs are handled internally, especially the unlinking/freeing
processes. So far, this was very fuzy, to summarize cleanly deleting or replacing a datablock
was pretty much impossible, except for a few special cases.
Also, unlinking was handled by each datatype, in a rather messy and prone-to-errors way (quite
a few ID usages were missed or wrongly handled that way).
One of the main goal of id-remap branch was to cleanup this, and fatorize ID links handling
by using library_query utils to allow generic handling of those, which is now the case
(now, generic ID links handling is only "knwon" from readfile.c and library_query.c).
This commit also adds backends to allow live replacement and deletion of datablocks in Blender
(so-called 'remapping' process, where we replace all usages of a given ID pointer by a new one,
or NULL one in case of unlinking).
This will allow nice new features, like ability to easily reload or relocate libraries, real immediate
deletion of datablocks in blender, replacement of one datablock by another, etc.
Some of those are for next commits.
A word of warning: this commit is highly risky, because it affects potentially a lot in Blender core.
Though it was tested rather deeply, being totally impossible to check all possible ID usage cases,
it's likely there are some remaining issues and bugs in new code... Please report them! ;)
Review task: D2027 (https://developer.blender.org/D2027).
Reviewed by campbellbarton, thanks a bunch.
2016-06-22 17:29:38 +02:00
|
|
|
st->id_remap = node_id_remap;
|
2018-05-29 09:19:06 +02:00
|
|
|
st->space_subtype_item_extend = node_space_subtype_item_extend;
|
|
|
|
st->space_subtype_get = node_space_subtype_get;
|
|
|
|
st->space_subtype_set = node_space_subtype_set;
|
|
|
|
|
2008-12-13 18:09:49 +00:00
|
|
|
/* regions: main window */
|
2012-07-01 09:54:44 +00:00
|
|
|
art = MEM_callocN(sizeof(ARegionType), "spacetype node region");
|
2008-12-13 18:09:49 +00:00
|
|
|
art->regionid = RGN_TYPE_WINDOW;
|
2015-11-28 17:14:45 +01:00
|
|
|
art->init = node_main_region_init;
|
|
|
|
art->draw = node_main_region_draw;
|
2019-02-20 14:29:29 +11:00
|
|
|
art->keymapflag = ED_KEYMAP_UI | ED_KEYMAP_GIZMO | ED_KEYMAP_TOOL | ED_KEYMAP_VIEW2D | ED_KEYMAP_FRAMES | ED_KEYMAP_GPENCIL;
|
2012-07-01 09:54:44 +00:00
|
|
|
art->listener = node_region_listener;
|
2012-05-22 14:13:33 +00:00
|
|
|
art->cursor = node_cursor;
|
2014-04-01 11:34:00 +11:00
|
|
|
art->event_cursor = true;
|
2008-12-13 18:09:49 +00:00
|
|
|
|
|
|
|
BLI_addhead(&st->regiontypes, art);
|
2012-07-01 09:54:44 +00:00
|
|
|
|
2008-12-13 18:09:49 +00:00
|
|
|
/* regions: header */
|
2012-07-01 09:54:44 +00:00
|
|
|
art = MEM_callocN(sizeof(ARegionType), "spacetype node region");
|
2008-12-13 18:09:49 +00:00
|
|
|
art->regionid = RGN_TYPE_HEADER;
|
2012-07-01 09:54:44 +00:00
|
|
|
art->prefsizey = HEADERY;
|
|
|
|
art->keymapflag = ED_KEYMAP_UI | ED_KEYMAP_VIEW2D | ED_KEYMAP_FRAMES | ED_KEYMAP_HEADER;
|
|
|
|
art->listener = node_region_listener;
|
2015-11-28 17:14:45 +01:00
|
|
|
art->init = node_header_region_init;
|
|
|
|
art->draw = node_header_region_draw;
|
2012-07-01 09:54:44 +00:00
|
|
|
|
2008-12-13 18:09:49 +00:00
|
|
|
BLI_addhead(&st->regiontypes, art);
|
2009-08-19 00:55:30 +00:00
|
|
|
|
2009-11-11 08:12:54 +00:00
|
|
|
/* regions: listview/buttons */
|
2012-07-01 09:54:44 +00:00
|
|
|
art = MEM_callocN(sizeof(ARegionType), "spacetype node region");
|
2009-11-11 08:12:54 +00:00
|
|
|
art->regionid = RGN_TYPE_UI;
|
2012-07-01 09:54:44 +00:00
|
|
|
art->prefsizex = 180; // XXX
|
|
|
|
art->keymapflag = ED_KEYMAP_UI | ED_KEYMAP_FRAMES;
|
|
|
|
art->listener = node_region_listener;
|
2015-11-28 17:14:45 +01:00
|
|
|
art->init = node_buttons_region_init;
|
|
|
|
art->draw = node_buttons_region_draw;
|
2008-12-13 18:09:49 +00:00
|
|
|
BLI_addhead(&st->regiontypes, art);
|
2012-07-01 09:54:44 +00:00
|
|
|
|
2009-11-11 08:12:54 +00:00
|
|
|
node_buttons_register(art);
|
2012-07-01 09:54:44 +00:00
|
|
|
|
2012-12-12 12:50:39 +00:00
|
|
|
/* regions: toolbar */
|
|
|
|
art = MEM_callocN(sizeof(ARegionType), "spacetype view3d tools region");
|
|
|
|
art->regionid = RGN_TYPE_TOOLS;
|
2018-11-27 18:39:29 +11:00
|
|
|
art->prefsizex = 58; /* XXX */
|
2012-12-12 12:50:39 +00:00
|
|
|
art->prefsizey = 50; /* XXX */
|
|
|
|
art->keymapflag = ED_KEYMAP_UI | ED_KEYMAP_FRAMES;
|
|
|
|
art->listener = node_region_listener;
|
2018-11-27 18:39:29 +11:00
|
|
|
art->message_subscribe = ED_region_generic_tools_region_message_subscribe;
|
|
|
|
art->snap_size = ED_region_generic_tools_region_snap_size;
|
2015-11-28 17:14:45 +01:00
|
|
|
art->init = node_toolbar_region_init;
|
|
|
|
art->draw = node_toolbar_region_draw;
|
2012-12-12 12:50:39 +00:00
|
|
|
BLI_addhead(&st->regiontypes, art);
|
2018-06-04 09:31:30 +02:00
|
|
|
|
2012-12-12 12:50:39 +00:00
|
|
|
node_toolbar_register(art);
|
|
|
|
|
2008-12-13 18:09:49 +00:00
|
|
|
BKE_spacetype_register(st);
|
|
|
|
}
|