Orange: more Node goodies;

- New Node: "Mapping". Allows input vector to be translated, rotated and
  scaled. And optional be clipped to a range. Works for colors too!

- The button "Normal" now allows incremental input, so a click in the
  button won't change the normal anymore

- Connecting wires now show selection state for Nodes, with nice blended
  colors. Both colors were added in Themes, but default to black and white
This commit is contained in:
Ton Roosendaal
2006-01-04 12:13:13 +00:00
parent bd26fe8f94
commit 3153a238b3
12 changed files with 302 additions and 121 deletions

View File

@@ -158,6 +158,7 @@ struct ShadeResult;
#define SH_NODE_TEXTURE 106
#define SH_NODE_NORMAL 107
#define SH_NODE_GEOMETRY 108
#define SH_NODE_MAPPING 109
/* custom defines: options for Material node */
#define SH_NODE_MAT_DIFF 1

View File

@@ -40,6 +40,7 @@ struct PluginTex;
struct LampRen;
struct ColorBand;
struct HaloRen;
struct TexMapping;
/* in ColorBand struct */
#define MAXCOLORBAND 16
@@ -61,5 +62,8 @@ void make_local_texture(struct Tex *tex);
void autotexname(struct Tex *tex);
struct Tex *give_current_texture(struct Object *ob, int act);
struct TexMapping *add_mapping(void);
void init_mapping(struct TexMapping *texmap);
#endif

View File

@@ -692,8 +692,10 @@ bNode *nodeAddNodeType(bNodeTree *ntree, int type, bNodeTree *ngroup)
if(ntree->type==NTREE_SHADER) {
if(type==SH_NODE_MATERIAL)
node->custom1= SH_NODE_MAT_DIFF|SH_NODE_MAT_SPEC;
else if(node->type==SH_NODE_VALTORGB)
else if(type==SH_NODE_VALTORGB)
node->storage= add_colorband(1);
else if(type==SH_NODE_MAPPING)
node->storage= add_mapping();
}
return node;

View File

@@ -66,7 +66,21 @@ void set_node_shader_lamp_loop(void (*lamp_loop_func)(ShadeInput *, ShadeResult
}
/* **************** output node ************ */
/* ******************************************************** */
/* ********* Shader Node type definitions ***************** */
/* ******************************************************** */
/* SocketType syntax:
socket type, max connections (0 is no limit), name, 4 values for default, 2 values for range */
/* Verification rule: If name changes, a saved socket and its links will be removed! Type changes are OK */
/* **************** OUTPUT ******************** */
static bNodeSocketType sh_node_output_in[]= {
{ SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
{ SOCK_VALUE, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
static void node_shader_exec_output(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
{
@@ -85,7 +99,7 @@ static void node_shader_exec_output(void *data, bNode *node, bNodeStack **in, bN
if(node->flag & NODE_DO_OUTPUT) {
ShadeResult *shr= ((ShaderCallData *)data)->shr;
VECCOPY(shr->diff, col);
col[0]= col[1]= col[2]= 0.0f;
VECCOPY(shr->spec, col);
@@ -96,96 +110,6 @@ static void node_shader_exec_output(void *data, bNode *node, bNodeStack **in, bN
}
}
/* **************** texture node ************ */
static void node_shader_exec_texture(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
{
if(data && node->id) {
ShadeInput *shi= ((ShaderCallData *)data)->shi;
TexResult texres;
float *vec, nor[3]={0.0f, 0.0f, 0.0f};
int retval;
/* out: value, color, normal */
/* we should find out if a normal as output is needed, for now we do all */
texres.nor= nor;
if(in[0]->hasinput) {
vec= in[0]->vec;
if(in[0]->datatype==NS_OSA_VECTORS) {
float *fp= in[0]->data;
retval= multitex((Tex *)node->id, vec, fp, fp+3, shi->osatex, &texres);
}
else if(in[0]->datatype==NS_OSA_VALUES) {
float *fp= in[0]->data;
float dxt[3], dyt[3];
dxt[0]= fp[0]; dxt[1]= dxt[2]= 0.0f;
dyt[0]= fp[1]; dyt[1]= dyt[2]= 0.0f;
retval= multitex((Tex *)node->id, vec, dxt, dyt, shi->osatex, &texres);
}
else
retval= multitex((Tex *)node->id, vec, NULL, NULL, 0, &texres);
}
else { /* only for previewrender, so we see stuff */
vec= shi->lo;
retval= multitex((Tex *)node->id, vec, NULL, NULL, 0, &texres);
}
/* stupid exception */
if( ((Tex *)node->id)->type==TEX_STUCCI) {
texres.tin= 0.5f + 0.7f*texres.nor[0];
CLAMP(texres.tin, 0.0f, 1.0f);
}
/* intensity and color need some handling */
if(texres.talpha)
out[0]->vec[0]= texres.ta;
else
out[0]->vec[0]= texres.tin;
if((retval & TEX_RGB)==0) {
out[1]->vec[0]= out[0]->vec[0];
out[1]->vec[1]= out[0]->vec[0];
out[1]->vec[2]= out[0]->vec[0];
out[1]->vec[3]= 1.0f;
}
else {
out[1]->vec[0]= texres.tr;
out[1]->vec[1]= texres.tg;
out[1]->vec[2]= texres.tb;
out[1]->vec[3]= 1.0f;
}
VECCOPY(out[2]->vec, nor);
if(shi->do_preview)
nodeAddToPreview(node, out[1]->vec, shi->xs, shi->ys);
}
}
/* ******************************************************** */
/* ********* Shader Node type definitions ***************** */
/* ******************************************************** */
/* SocketType syntax:
socket type, max connections (0 is no limit), name, 4 values for default, 2 values for range */
/* Verification rule: If name changes, a saved socket and its links will be removed! Type changes are OK */
/* **************** OUTPUT ******************** */
static bNodeSocketType sh_node_output_in[]= {
{ SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
{ SOCK_VALUE, 1, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
{ -1, 0, "" }
};
static bNodeType sh_node_output= {
/* type code */ SH_NODE_OUTPUT,
/* name */ "Output",
@@ -194,7 +118,7 @@ static bNodeType sh_node_output= {
/* input sock */ sh_node_output_in,
/* output sock */ NULL,
/* storage */ "",
/* execfunc */ node_shader_exec_output,
/* execfunc */ node_shader_exec_output
};
@@ -259,7 +183,7 @@ static bNodeType sh_node_geom= {
/* input sock */ NULL,
/* output sock */ sh_node_geom_out,
/* storage */ "",
/* execfunc */ node_shader_exec_geom,
/* execfunc */ node_shader_exec_geom
};
@@ -373,7 +297,7 @@ static bNodeType sh_node_material= {
/* input sock */ sh_node_material_in,
/* output sock */ sh_node_material_out,
/* storage */ "",
/* execfunc */ node_shader_exec_material,
/* execfunc */ node_shader_exec_material
};
@@ -389,6 +313,75 @@ static bNodeSocketType sh_node_texture_out[]= {
{ -1, 0, "" }
};
static void node_shader_exec_texture(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
{
if(data && node->id) {
ShadeInput *shi= ((ShaderCallData *)data)->shi;
TexResult texres;
float *vec, nor[3]={0.0f, 0.0f, 0.0f};
int retval;
/* out: value, color, normal */
/* we should find out if a normal as output is needed, for now we do all */
texres.nor= nor;
if(in[0]->hasinput) {
vec= in[0]->vec;
if(in[0]->datatype==NS_OSA_VECTORS) {
float *fp= in[0]->data;
retval= multitex((Tex *)node->id, vec, fp, fp+3, shi->osatex, &texres);
}
else if(in[0]->datatype==NS_OSA_VALUES) {
float *fp= in[0]->data;
float dxt[3], dyt[3];
dxt[0]= fp[0]; dxt[1]= dxt[2]= 0.0f;
dyt[0]= fp[1]; dyt[1]= dyt[2]= 0.0f;
retval= multitex((Tex *)node->id, vec, dxt, dyt, shi->osatex, &texres);
}
else
retval= multitex((Tex *)node->id, vec, NULL, NULL, 0, &texres);
}
else { /* only for previewrender, so we see stuff */
vec= shi->lo;
retval= multitex((Tex *)node->id, vec, NULL, NULL, 0, &texres);
}
/* stupid exception */
if( ((Tex *)node->id)->type==TEX_STUCCI) {
texres.tin= 0.5f + 0.7f*texres.nor[0];
CLAMP(texres.tin, 0.0f, 1.0f);
}
/* intensity and color need some handling */
if(texres.talpha)
out[0]->vec[0]= texres.ta;
else
out[0]->vec[0]= texres.tin;
if((retval & TEX_RGB)==0) {
out[1]->vec[0]= out[0]->vec[0];
out[1]->vec[1]= out[0]->vec[0];
out[1]->vec[2]= out[0]->vec[0];
out[1]->vec[3]= 1.0f;
}
else {
out[1]->vec[0]= texres.tr;
out[1]->vec[1]= texres.tg;
out[1]->vec[2]= texres.tb;
out[1]->vec[3]= 1.0f;
}
VECCOPY(out[2]->vec, nor);
if(shi->do_preview)
nodeAddToPreview(node, out[1]->vec, shi->xs, shi->ys);
}
}
static bNodeType sh_node_texture= {
/* type code */ SH_NODE_TEXTURE,
/* name */ "Texture",
@@ -397,7 +390,53 @@ static bNodeType sh_node_texture= {
/* input sock */ sh_node_texture_in,
/* output sock */ sh_node_texture_out,
/* storage */ "",
/* execfunc */ node_shader_exec_texture,
/* execfunc */ node_shader_exec_texture
};
/* **************** MAPPING ******************** */
static bNodeSocketType sh_node_mapping_in[]= {
{ SOCK_VECTOR, 1, "Vector", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f},
{ -1, 0, "" }
};
static bNodeSocketType sh_node_mapping_out[]= {
{ SOCK_VECTOR, 0, "Vector", 0.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f},
{ -1, 0, "" }
};
/* do the regular mapping options for blender textures */
static void node_shader_exec_mapping(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
{
TexMapping *texmap= node->storage;
float *vec= out[0]->vec;
/* stack order input: vector */
/* stack order output: vector */
VECCOPY(vec, in[0]->vec);
Mat4MulVecfl(texmap->mat, vec);
if(texmap->flag & TEXMAP_CLIP_MIN) {
if(vec[0]<texmap->min[0]) vec[0]= texmap->min[0];
if(vec[1]<texmap->min[1]) vec[1]= texmap->min[1];
if(vec[2]<texmap->min[2]) vec[2]= texmap->min[2];
}
if(texmap->flag & TEXMAP_CLIP_MAX) {
if(vec[0]>texmap->max[0]) vec[0]= texmap->max[0];
if(vec[1]>texmap->max[1]) vec[1]= texmap->max[1];
if(vec[2]>texmap->max[2]) vec[2]= texmap->max[2];
}
}
static bNodeType sh_node_mapping= {
/* type code */ SH_NODE_MAPPING,
/* name */ "Mapping",
/* width+range */ 240, 160, 320,
/* class+opts */ NODE_CLASS_OPERATOR, NODE_OPTIONS,
/* input sock */ sh_node_mapping_in,
/* output sock */ sh_node_mapping_out,
/* storage */ "TexMapping",
/* execfunc */ node_shader_exec_mapping
};
@@ -433,7 +472,7 @@ static bNodeType sh_node_normal= {
/* input sock */ sh_node_normal_in,
/* output sock */ sh_node_normal_out,
/* storage */ "",
/* execfunc */ node_shader_exec_normal,
/* execfunc */ node_shader_exec_normal
};
@@ -458,7 +497,7 @@ static bNodeType sh_node_value= {
/* input sock */ NULL,
/* output sock */ sh_node_value_out,
/* storage */ "",
/* execfunc */ node_shader_exec_value,
/* execfunc */ node_shader_exec_value
};
@@ -483,7 +522,7 @@ static bNodeType sh_node_rgb= {
/* input sock */ NULL,
/* output sock */ sh_node_rgb_out,
/* storage */ "",
/* execfunc */ node_shader_exec_rgb,
/* execfunc */ node_shader_exec_rgb
};
@@ -521,7 +560,7 @@ static bNodeType sh_node_mix_rgb= {
/* input sock */ sh_node_mix_rgb_in,
/* output sock */ sh_node_mix_rgb_out,
/* storage */ "",
/* execfunc */ node_shader_exec_mix_rgb,
/* execfunc */ node_shader_exec_mix_rgb
};
@@ -556,7 +595,7 @@ static bNodeType sh_node_valtorgb= {
/* input sock */ sh_node_valtorgb_in,
/* output sock */ sh_node_valtorgb_out,
/* storage */ "ColorBand",
/* execfunc */ node_shader_exec_valtorgb,
/* execfunc */ node_shader_exec_valtorgb
};
@@ -588,7 +627,7 @@ static bNodeType sh_node_rgbtobw= {
/* input sock */ sh_node_rgbtobw_in,
/* output sock */ sh_node_rgbtobw_out,
/* storage */ "",
/* execfunc */ node_shader_exec_rgbtobw,
/* execfunc */ node_shader_exec_rgbtobw
};
@@ -607,6 +646,7 @@ bNodeType *node_all_shaders[]= {
&sh_node_texture,
&sh_node_normal,
&sh_node_geom,
&sh_node_mapping,
NULL
};

View File

@@ -197,6 +197,37 @@ void free_plugin_tex(PluginTex *pit)
MEM_freeN(pit);
}
/* ****************** Mapping ******************* */
TexMapping *add_mapping(void)
{
TexMapping *texmap= MEM_callocN(sizeof(TexMapping), "Tex map");
texmap->size[0]= texmap->size[1]= texmap->size[2]= 1.0f;
texmap->max[0]= texmap->max[1]= texmap->max[2]= 1.0f;
Mat4One(texmap->mat);
return texmap;
}
void init_mapping(TexMapping *texmap)
{
float eul[3], smat[3][3], rmat[3][3], mat[3][3];
SizeToMat3(texmap->size, smat);
eul[0]= (M_PI/180.0f)*texmap->rot[0];
eul[1]= (M_PI/180.0f)*texmap->rot[1];
eul[2]= (M_PI/180.0f)*texmap->rot[2];
EulToMat3(eul, rmat);
Mat3MulMat3(mat, rmat, smat);
Mat4CpyMat3(texmap->mat, mat);
VECCOPY(texmap->mat[3], texmap->loc);
}
/* ****************** COLORBAND ******************* */
ColorBand *add_colorband(int rangetype)

View File

@@ -171,5 +171,6 @@ typedef struct bNodeTree {
#define NTREE_TYPE_INIT 1
#define NTREE_EXEC_INIT 2
#endif

View File

@@ -163,6 +163,23 @@ typedef struct Tex {
} Tex;
/* used for mapping node. note: rot is in degrees */
typedef struct TexMapping {
float loc[3], rot[3], size[3];
int flag;
float mat[4][4];
float min[3], max[3];
struct Object *ob;
} TexMapping;
/* texmap->flag */
#define TEXMAP_CLIP_MIN 1
#define TEXMAP_CLIP_MAX 2
/* **************** TEX ********************* */
/* type */

View File

@@ -51,6 +51,7 @@
#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_node.h"
#include "BKE_texture.h"
#include "BKE_utildefines.h"
#include "BIF_gl.h"
@@ -255,6 +256,13 @@ static void node_new_mat_cb(void *ntree_v, void *node_v)
}
static void node_texmap_cb(void *texmap_v, void *unused_v)
{
init_mapping(texmap_v);
}
static int node_shader_buts_material(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
{
if(block) {
@@ -344,6 +352,55 @@ static int node_shader_buts_normal(uiBlock *block, bNodeTree *ntree, bNode *node
return (int)(node->width-NODE_DY);
}
static int node_shader_buts_mapping(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
{
if(block && (node->flag & NODE_OPTIONS)) {
TexMapping *texmap= node->storage;
short dx= (short)((butr->xmax-butr->xmin)/7.0f);
short dy= (short)(butr->ymax-19);
uiBlockSetFunc(block, node_texmap_cb, texmap, NULL); /* all buttons get this */
uiBlockBeginAlign(block);
uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+dx, dy, 2*dx, 19, texmap->loc, -1000.0f, 1000.0f, 10, 2, "");
uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+3*dx, dy, 2*dx, 19, texmap->loc+1, -1000.0f, 1000.0f, 10, 2, "");
uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+5*dx, dy, 2*dx, 19, texmap->loc+2, -1000.0f, 1000.0f, 10, 2, "");
dy-= 19;
uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+dx, dy, 2*dx, 19, texmap->rot, -1000.0f, 1000.0f, 1000, 1, "");
uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+3*dx, dy, 2*dx, 19, texmap->rot+1, -1000.0f, 1000.0f, 1000, 1, "");
uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+5*dx, dy, 2*dx, 19, texmap->rot+2, -1000.0f, 1000.0f, 1000, 1, "");
dy-= 19;
uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+dx, dy, 2*dx, 19, texmap->size, -1000.0f, 1000.0f, 10, 2, "");
uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+3*dx, dy, 2*dx, 19, texmap->size+1, -1000.0f, 1000.0f, 10, 2, "");
uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+5*dx, dy, 2*dx, 19, texmap->size+2, -1000.0f, 1000.0f, 10, 2, "");
dy-= 25;
uiBlockBeginAlign(block);
uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+dx, dy, 2*dx, 19, texmap->min, -10.0f, 10.0f, 100, 2, "");
uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+3*dx, dy, 2*dx, 19, texmap->min+1, -10.0f, 10.0f, 100, 2, "");
uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+5*dx, dy, 2*dx, 19, texmap->min+2, -10.0f, 10.0f, 100, 2, "");
dy-= 19;
uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+dx, dy, 2*dx, 19, texmap->max, -10.0f, 10.0f, 10, 2, "");
uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+3*dx, dy, 2*dx, 19, texmap->max+1, -10.0f, 10.0f, 10, 2, "");
uiDefButF(block, NUM, B_NODE_EXEC, "", butr->xmin+5*dx, dy, 2*dx, 19, texmap->max+2, -10.0f, 10.0f, 10, 2, "");
uiBlockEndAlign(block);
/* labels/options */
dy= (short)(butr->ymax-19);
uiDefBut(block, LABEL, B_NOP, "Loc", butr->xmin, dy, dx, 19, NULL, 0.0f, 0.0f, 0, 0, "");
dy-= 19;
uiDefBut(block, LABEL, B_NOP, "Rot", butr->xmin, dy, dx, 19, NULL, 0.0f, 0.0f, 0, 0, "");
dy-= 19;
uiDefBut(block, LABEL, B_NOP, "Size", butr->xmin, dy, dx, 19, NULL, 0.0f, 0.0f, 0, 0, "");
dy-= 25;
uiDefButBitI(block, TOG, TEXMAP_CLIP_MIN, B_NODE_EXEC, "Min", butr->xmin, dy, dx-4, 19, &texmap->flag, 0.0f, 0.0f, 0, 0, "");
dy-= 19;
uiDefButBitI(block, TOG, TEXMAP_CLIP_MAX, B_NODE_EXEC, "Max", butr->xmin, dy, dx-4, 19, &texmap->flag, 0.0f, 0.0f, 0, 0, "");
}
return 5*19 + 6;
}
static int node_shader_buts_value(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
{
if(block) {
@@ -430,6 +487,9 @@ static void node_shader_set_butfunc(bNodeType *ntype)
case SH_NODE_NORMAL:
ntype->butfunc= node_shader_buts_normal;
break;
case SH_NODE_MAPPING:
ntype->butfunc= node_shader_buts_mapping;
break;
case SH_NODE_VALUE:
ntype->butfunc= node_shader_buts_value;
break;
@@ -1053,7 +1113,7 @@ void node_draw_link(SpaceNode *snode, bNodeLink *link)
{
float vec[4][3];
float dist, spline_step, mx=0.0f, my=0.0f;
int curve_res;
int curve_res, do_shaded= 1, th_col1= TH_WIRE, th_col2= TH_WIRE;
if(link->fromnode==NULL && link->tonode==NULL)
return;
@@ -1063,19 +1123,27 @@ void node_draw_link(SpaceNode *snode, bNodeLink *link)
short mval[2];
getmouseco_areawin(mval);
areamouseco_to_ipoco(G.v2d, mval, &mx, &my);
BIF_ThemeColor(TH_WIRE);
do_shaded= 0;
}
else {
/* a bit ugly... but thats how we detect the internal group links */
if(link->fromnode==link->tonode)
if(link->fromnode==link->tonode) {
BIF_ThemeColorBlend(TH_BACK, TH_WIRE, 0.25f);
do_shaded= 0;
}
else {
/* check cyclic */
if(link->fromnode->level >= link->tonode->level && link->tonode->level!=0xFFF)
BIF_ThemeColor(TH_WIRE);
else
if(link->fromnode->level >= link->tonode->level && link->tonode->level!=0xFFF) {
if(link->fromnode->flag & SELECT)
th_col1= TH_EDGE_SELECT;
if(link->tonode->flag & SELECT)
th_col2= TH_EDGE_SELECT;
}
else {
BIF_ThemeColor(TH_REDALERT);
do_shaded= 0;
}
}
}
@@ -1120,6 +1188,8 @@ void node_draw_link(SpaceNode *snode, bNodeLink *link)
glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, vec[0]);
glBegin(GL_LINE_STRIP);
while (spline_step < 1.000001f) {
if(do_shaded)
BIF_ThemeColorBlend(th_col1, th_col2, spline_step);
glEvalCoord1f(spline_step);
spline_step += dist;
}

View File

@@ -1020,7 +1020,7 @@ static void node_add_menu(SpaceNode *snode)
short event, mval[2];
/* shader menu, still hardcoded defines... solve */
event= pupmenu("Add Node%t|Output%x1|Geometry%x108|Material%x100|Texture%x106|Normal%x107|Value %x102|Color %x101|Mix Color %x103|ColorRamp %x104|Color to BW %x105");
event= pupmenu("Add Node%t|Output%x1|Geometry%x108|Material%x100|Texture%x106|Mapping%x109|Normal%x107|Value %x102|Color %x101|Mix Color %x103|ColorRamp %x104|Color to BW %x105");
if(event<1) return;
getmouseco_areawin(mval);

View File

@@ -3268,12 +3268,26 @@ static int ui_do_but_NORMAL(uiBut *but)
{
float dx, dy, rad, radsq, mrad, *fp= (float *)but->poin;
int firsttime=1;
short mval[2], mvalo[2];
short mval[2], mvalo[2], mvals[2], mvaldx, mvaldy;
rad= 0.5f*(but->x2 - but->x1);
rad= (but->x2 - but->x1);
radsq= rad*rad;
if(fp[2]>0.0f) {
mvaldx= (rad*fp[0]);
mvaldy= (rad*fp[1]);
}
else if(fp[2]> -1.0f) {
mrad= rad/sqrt(fp[0]*fp[0] + fp[1]*fp[1]);
mvaldx= 2.0f*mrad*fp[0] - (rad*fp[0]);
mvaldy= 2.0f*mrad*fp[1] - (rad*fp[1]);
}
else mvaldx= mvaldy= 0;
uiGetMouse(mywinget(), mvalo);
mvals[0]= mvalo[0];
mvals[1]= mvalo[1];
while(get_mbut() & L_MOUSE) {
@@ -3282,8 +3296,8 @@ static int ui_do_but_NORMAL(uiBut *but)
if(mval[0]!=mvalo[0] || mval[1]!=mvalo[1] || firsttime) {
firsttime= 0;
dx= -but->x1-rad + (float)mval[0];
dy= -but->y1-rad + (float)mval[1];
dx= (float)(mval[0]+mvaldx-mvals[0]);
dy= (float)(mval[1]+mvaldy-mvals[1]);
mrad= dx*dx+dy*dy;
if(mrad < radsq) { /* inner circle */
@@ -3292,14 +3306,11 @@ static int ui_do_but_NORMAL(uiBut *but)
fp[2]= sqrt( radsq-dx*dx-dy*dy );
}
else { /* outer circle */
float norx, nory;
mrad= sqrt(mrad); // veclen
norx= dx/mrad;
nory= dy/mrad;
mrad= rad/sqrt(mrad); // veclen
dx= norx*(2.0f*rad - mrad);
dy= nory*(2.0f*rad - mrad);
dx*= (2.0f*mrad - 1.0f);
dy*= (2.0f*mrad - 1.0f);
mrad= dx*dx+dy*dy;
if(mrad < radsq) {

View File

@@ -480,6 +480,7 @@ void BIF_InitTheme(void)
/* space node, re-uses syntax color storage */
btheme->tnode= btheme->tv3d;
SETCOL(btheme->tnode.edge_select, 255, 255, 255, 255);
SETCOL(btheme->tnode.syntaxl, 150, 150, 150, 255); /* TH_NODE, backdrop */
SETCOL(btheme->tnode.syntaxn, 95, 110, 145, 255); /* in/output */
SETCOL(btheme->tnode.syntaxb, 135, 125, 120, 255); /* operator */
@@ -614,8 +615,10 @@ char *BIF_ThemeColorsPup(int spacetype)
sprintf(str, "Grid %%x%d|", TH_GRID); strcat(cp, str);
}
else if(spacetype==SPACE_NODE) {
sprintf(str, "Wires %%x%d|", TH_WIRE); strcat(cp, str);
sprintf(str, "Wires Select %%x%d|", TH_EDGE_SELECT); strcat(cp, str);
strcat(cp,"%l|");
sprintf(str, "Node backdrop %%x%d|", TH_NODE); strcat(cp, str);
sprintf(str, "Node Backdrop %%x%d|", TH_NODE); strcat(cp, str);
sprintf(str, "In/Out Node %%x%d|", TH_NODE_IN_OUT); strcat(cp, str);
sprintf(str, "Generator Node %%x%d|", TH_NODE_GENERATOR); strcat(cp, str);
sprintf(str, "Operator Node %%x%d|", TH_NODE_OPERATOR); strcat(cp, str);

View File

@@ -275,6 +275,7 @@ static void init_userdef_file(void)
if(btheme->tnode.syntaxn[3]==0) {
/* re-uses syntax color storage */
btheme->tnode= btheme->tv3d;
SETCOL(btheme->tnode.edge_select, 255, 255, 255, 255);
SETCOL(btheme->tnode.syntaxl, 150, 150, 150, 255); /* TH_NODE, backdrop */
SETCOL(btheme->tnode.syntaxn, 95, 110, 145, 255); /* in/output */
SETCOL(btheme->tnode.syntaxb, 135, 125, 120, 255); /* operator */