diff options
author | Jean-Luc Peurière <jlp@nerim.net> | 2007-06-03 01:42:54 +0400 |
---|---|---|
committer | Jean-Luc Peurière <jlp@nerim.net> | 2007-06-03 01:42:54 +0400 |
commit | 6cc1269d976641e6fdac59d1c1afbc96ae3aab8b (patch) | |
tree | 02bc32f07419e48a1492bc09609d5186fc095df6 /source | |
parent | 16340dfe1235391bb675a633a099c17af3a731c7 (diff) | |
parent | c6158b9293d6c5ea15c323fea44138d3563d1a12 (diff) |
merge from trunk up to rev [10858]
WIP in the NDOF part, dont work yet
Diffstat (limited to 'source')
50 files changed, 1002 insertions, 345 deletions
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h index bf3e25b1c5a..4b9e10651cf 100644 --- a/source/blender/blenkernel/BKE_blender.h +++ b/source/blender/blenkernel/BKE_blender.h @@ -44,7 +44,7 @@ struct ListBase; struct MemFile; #define BLENDER_VERSION 244 -#define BLENDER_SUBVERSION 1 +#define BLENDER_SUBVERSION 2 #define BLENDER_MINVERSION 240 #define BLENDER_MINSUBVERSION 0 diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index bace38651ea..44266a1c854 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -204,6 +204,8 @@ struct ShadeResult; #define SH_NODE_MATH 115 #define SH_NODE_VECT_MATH 116 #define SH_NODE_SQUEEZE 117 +#define SH_NODE_MATERIAL_EXT 118 +#define SH_NODE_INVERT 119 /* custom defines options for Material node */ @@ -293,9 +295,16 @@ void set_node_shader_lamp_loop(void (*lamp_loop_func)(struct ShadeInput *, str #define CMP_NODE_COMBHSVA 246 #define CMP_NODE_MATH 247 #define CMP_NODE_LUMA_MATTE 248 - #define CMP_NODE_BRIGHTCONTRAST 249 #define CMP_NODE_GAMMA 250 +#define CMP_NODE_INVERT 251 + +/* channel toggles */ +#define CMP_CHAN_RGB 1 +#define CMP_CHAN_A 2 +#define CMP_CHAN_R 4 +#define CMP_CHAN_G 8 +#define CMP_CHAN_B 16 /* filter types */ #define CMP_FILT_SOFT 0 diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index dc54fc7c1f0..5f8e9c7b207 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -2272,7 +2272,7 @@ float *multires_render_pin(Object *ob, Mesh *me, int *orig_lvl) lvl= multires_level_n(me->mr, BLI_countlist(&me->mr->levels)); vert_copy= MEM_callocN(sizeof(float)*3*lvl->totvert, "multires vert_copy"); for(i=0; i<lvl->totvert; ++i) - VecCopyf(&vert_copy[i*3], lvl->verts[i].co); + VecCopyf(&vert_copy[i*3], me->mr->verts[i].co); /* Goto the pin level for multires */ me->mr->newlvl= me->mr->pinlvl; diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 278d49e2198..4c6bfda1517 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -504,7 +504,7 @@ static float *make_orco_mesh_internal(Object *ob, int render) if(me->mr) { lvl = multires_level_n(me->mr, me->mr->pinlvl); vcos = MEM_callocN(sizeof(*vcos)*lvl->totvert, "orco mr mesh"); - mvert = lvl->verts; + mvert = me->mr->verts; totvert = lvl->totvert; } else { diff --git a/source/blender/blenkernel/intern/nla.c b/source/blender/blenkernel/intern/nla.c index a348aef0399..961ea21d088 100644 --- a/source/blender/blenkernel/intern/nla.c +++ b/source/blender/blenkernel/intern/nla.c @@ -141,7 +141,10 @@ bActionStrip *convert_action_to_strip (Object *ob) //set_active_strip(ob, nstrip); /* is in editnla as does UI calls */ nstrip->repeat = 1.0; - + + if(ob->nlastrips.first == NULL) + ob->nlaflag |= OB_NLA_OVERRIDE; + BLI_addtail(&ob->nlastrips, nstrip); return nstrip; /* is created, malloced etc. here so is safe to just return the pointer? this is needed for setting this active in UI, and probably useful for API too */ diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index 842e07cebe7..e7b7b36aaa4 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -2322,6 +2322,9 @@ static void registerCompositNodes(ListBase *ntypelist) nodeRegisterType(ntypelist, &cmp_node_curve_rgb); nodeRegisterType(ntypelist, &cmp_node_mix_rgb); nodeRegisterType(ntypelist, &cmp_node_hue_sat); + nodeRegisterType(ntypelist, &cmp_node_brightcontrast); + nodeRegisterType(ntypelist, &cmp_node_gamma); + nodeRegisterType(ntypelist, &cmp_node_invert); nodeRegisterType(ntypelist, &cmp_node_alphaover); nodeRegisterType(ntypelist, &cmp_node_zcombine); @@ -2361,9 +2364,6 @@ static void registerCompositNodes(ListBase *ntypelist) nodeRegisterType(ntypelist, &cmp_node_flip); nodeRegisterType(ntypelist, &cmp_node_displace); nodeRegisterType(ntypelist, &cmp_node_mapuv); - - nodeRegisterType(ntypelist, &cmp_node_brightcontrast); - nodeRegisterType(ntypelist, &cmp_node_gamma); } static void registerShaderNodes(ListBase *ntypelist) @@ -2383,9 +2383,11 @@ static void registerShaderNodes(ListBase *ntypelist) nodeRegisterType(ntypelist, &sh_node_squeeze); nodeRegisterType(ntypelist, &sh_node_camera); nodeRegisterType(ntypelist, &sh_node_material); + nodeRegisterType(ntypelist, &sh_node_material_ext); nodeRegisterType(ntypelist, &sh_node_value); nodeRegisterType(ntypelist, &sh_node_rgb); nodeRegisterType(ntypelist, &sh_node_texture); + nodeRegisterType(ntypelist, &sh_node_invert); } void init_nodesystem(void) diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 118c2779ac0..1b595b1e3fc 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -2554,6 +2554,8 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh) mesh->mr->edge_flags= MEM_callocN(sizeof(short)*lvl->totedge, "Multires Edge Flags"); if(!mesh->mr->edge_creases) mesh->mr->edge_creases= MEM_callocN(sizeof(char)*lvl->totedge, "Multires Edge Creases"); + + mesh->mr->verts = newdataadr(fd, mesh->mr->verts); for(; lvl; lvl= lvl->next) { lvl->verts= newdataadr(fd, lvl->verts); @@ -6465,9 +6467,28 @@ static void do_versions(FileData *fd, Library *lib, Main *main) if(main->versionfile <= 244) { Scene *sce; - if(main->subversionfile < 1) { + if(main->versionfile != 244 || main->subversionfile < 2) { + Mesh *me; for(sce= main->scene.first; sce; sce= sce->id.next) sce->r.mode |= R_SSS; + + /* Copy over old per-level multires vertex data + into a single vertex array in struct Multires */ + + for(me = main->mesh.first; me; me=me->id.next) { + if(me->mr) { + MultiresLevel *lvl = me->mr->levels.last; + if(lvl) { + me->mr->verts = lvl->verts; + lvl->verts = NULL; + /* Don't need the other vert arrays */ + for(lvl = lvl->prev; lvl; lvl = lvl->prev) { + MEM_freeN(lvl->verts); + lvl->verts = NULL; + } + } + } + } } } diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 0d4d9d82ee1..226561ab97b 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -1156,13 +1156,17 @@ static void write_meshs(WriteData *wd, ListBase *idbase) writedata(wd, DATA, sizeof(short)*lvl->totedge, mesh->mr->edge_flags); writedata(wd, DATA, sizeof(char)*lvl->totedge, mesh->mr->edge_creases); } + for(; lvl; lvl= lvl->next) { writestruct(wd, DATA, "MultiresLevel", 1, lvl); - writestruct(wd, DATA, "MVert", lvl->totvert, lvl->verts); writestruct(wd, DATA, "MultiresFace", lvl->totface, lvl->faces); writestruct(wd, DATA, "MultiresEdge", lvl->totedge, lvl->edges); writestruct(wd, DATA, "MultiresColFace", lvl->totface, lvl->colfaces); } + + lvl= mesh->mr->levels.last; + if(lvl) + writestruct(wd, DATA, "MVert", lvl->totvert, mesh->mr->verts); } /* PMV data */ diff --git a/source/blender/imbuf/intern/util.c b/source/blender/imbuf/intern/util.c index fccb3aba7fc..69390951a25 100644 --- a/source/blender/imbuf/intern/util.c +++ b/source/blender/imbuf/intern/util.c @@ -258,17 +258,17 @@ static int isffmpeg (char *filename) { BLI_testextensie(filename, ".wav")) return 0; if(av_open_input_file(&pFormatCtx, filename, NULL, 0, NULL)!=0) { - fprintf(stderr, "isffmpeg: av_open_input_file failed\n"); + if(UTIL_DEBUG) fprintf(stderr, "isffmpeg: av_open_input_file failed\n"); return 0; } if(av_find_stream_info(pFormatCtx)<0) { - fprintf(stderr, "isffmpeg: av_find_stream_info failed\n"); + if(UTIL_DEBUG) fprintf(stderr, "isffmpeg: av_find_stream_info failed\n"); av_close_input_file(pFormatCtx); return 0; } - dump_format(pFormatCtx, 0, filename, 0); + if(UTIL_DEBUG) dump_format(pFormatCtx, 0, filename, 0); /* Find the first video stream */ @@ -315,19 +315,33 @@ int imb_get_anim_type(char * name) { if(UTIL_DEBUG) printf("in getanimtype: %s\n", name); -#ifdef WITH_FFMPEG +#ifndef _WIN32 +# ifdef WITH_FFMPEG /* stat test below fails on large files > 4GB */ if (isffmpeg(name)) return (ANIM_FFMPEG); -#endif +# endif + if (ib_stat(name,&st) == -1) return(0); + if (((st.st_mode) & S_IFMT) != S_IFREG) return(0); + + if (isavi(name)) return (ANIM_AVI); + if (ismovie(name)) return (ANIM_MOVIE); +# ifdef WITH_QUICKTIME + if (isqtime(name)) return (ANIM_QTIME); +# endif +#else if (ib_stat(name,&st) == -1) return(0); if (((st.st_mode) & S_IFMT) != S_IFREG) return(0); if (isavi(name)) return (ANIM_AVI); if (ismovie(name)) return (ANIM_MOVIE); -#ifdef WITH_QUICKTIME +# ifdef WITH_QUICKTIME if (isqtime(name)) return (ANIM_QTIME); +# endif +# ifdef WITH_FFMPEG + if (isffmpeg(name)) return (ANIM_FFMPEG); +# endif #endif type = IMB_ispic(name); if (type == ANIM) return (ANIM_ANIM5); diff --git a/source/blender/include/BIF_editaction.h b/source/blender/include/BIF_editaction.h index 2d92b120b9a..6e180418cd8 100644 --- a/source/blender/include/BIF_editaction.h +++ b/source/blender/include/BIF_editaction.h @@ -92,6 +92,7 @@ void snap_keys_to_frame(int snap_mode); void mirror_action_keys(short mirror_mode); void clean_shapekeys(struct Key *key); void clean_actionchannels(struct bAction *act); +void insertkey_action(void); /* Marker Operations */ void column_select_shapekeys(struct Key *key, int mode); diff --git a/source/blender/include/BIF_editdeform.h b/source/blender/include/BIF_editdeform.h index 69f03652887..2a8f43c14e7 100644 --- a/source/blender/include/BIF_editdeform.h +++ b/source/blender/include/BIF_editdeform.h @@ -67,5 +67,8 @@ void vertexgroup_select_by_name(struct Object *ob, char *name); extern void object_apply_deform(struct Object *ob); +void vgroup_assign_with_menu(void); +void vgroup_operation_with_menu(void); + #endif diff --git a/source/blender/include/multires.h b/source/blender/include/multires.h index 6c33af2d5e3..069dbee802f 100644 --- a/source/blender/include/multires.h +++ b/source/blender/include/multires.h @@ -31,6 +31,7 @@ #define MULTIRES_H struct CustomData; +struct EditMesh; struct Object; struct MDeformVert; struct Mesh; @@ -65,6 +66,7 @@ int multires_modifier_warning(); /* multires-firstlevel.c */ /* Generic */ +void multires_update_first_level(struct Mesh *me, struct EditMesh *em); void multires_update_customdata(struct MultiresLevel *lvl1, struct CustomData *src, struct CustomData *dst, const int type); void multires_customdata_to_mesh(struct Mesh *me, struct EditMesh *em, struct MultiresLevel *lvl, diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h index 4d78f577137..af9c1ae629d 100644 --- a/source/blender/makesdna/DNA_meshdata_types.h +++ b/source/blender/makesdna/DNA_meshdata_types.h @@ -109,7 +109,6 @@ struct MultiresMapNode; typedef struct MultiresLevel { struct MultiresLevel *next, *prev; - MVert *verts; MultiresFace *faces; MultiresColFace *colfaces; MultiresEdge *edges; @@ -118,10 +117,15 @@ typedef struct MultiresLevel { struct MultiresMapNode *map_mem; unsigned int totvert, totface, totedge, pad; + + /* Kept for compatibility with older files */ + MVert *verts; } MultiresLevel; typedef struct Multires { ListBase levels; + MVert *verts; + unsigned char level_count, current, newlvl, edgelvl, pinlvl, renderlvl; unsigned char use_col, pad; diff --git a/source/blender/nodes/CMP_node.h b/source/blender/nodes/CMP_node.h index ea15d4dbe73..3410238c0a2 100644 --- a/source/blender/nodes/CMP_node.h +++ b/source/blender/nodes/CMP_node.h @@ -53,6 +53,9 @@ extern bNodeType cmp_node_output_file; extern bNodeType cmp_node_curve_rgb; extern bNodeType cmp_node_mix_rgb; extern bNodeType cmp_node_hue_sat; +extern bNodeType cmp_node_brightcontrast; +extern bNodeType cmp_node_gamma; +extern bNodeType cmp_node_invert; extern bNodeType cmp_node_alphaover; extern bNodeType cmp_node_zcombine; @@ -93,9 +96,6 @@ extern bNodeType cmp_node_flip; extern bNodeType cmp_node_displace; extern bNodeType cmp_node_mapuv; -extern bNodeType cmp_node_brightcontrast; -extern bNodeType cmp_node_gamma; - #endif diff --git a/source/blender/nodes/SHD_node.h b/source/blender/nodes/SHD_node.h index b443a39624b..688494d6de5 100644 --- a/source/blender/nodes/SHD_node.h +++ b/source/blender/nodes/SHD_node.h @@ -56,6 +56,8 @@ extern bNodeType sh_node_curve_rgb; extern bNodeType sh_node_math; extern bNodeType sh_node_vect_math; extern bNodeType sh_node_squeeze; +extern bNodeType sh_node_material_ext; +extern bNodeType sh_node_invert; #endif diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c b/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c index aedaa036d67..f108098750c 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c @@ -90,12 +90,12 @@ static void node_composit_exec_alphaover(void *data, bNode *node, bNodeStack **i return; /* input no image? then only color operation */ - if(in[1]->data==NULL) { + if(in[1]->data==NULL && in[2]->data==NULL) { do_alphaover_premul(node, out[0]->vec, in[1]->vec, in[2]->vec, in[0]->vec); } else { /* make output size of input image */ - CompBuf *cbuf= in[1]->data; + CompBuf *cbuf= in[1]->data?in[1]->data:in[2]->data; CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */ if(node->custom1) diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_curves.c b/source/blender/nodes/intern/CMP_nodes/CMP_curves.c index 754d016fb25..17d9821a5ef 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_curves.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_curves.c @@ -172,10 +172,10 @@ static void node_composit_exec_curve_rgb(void *data, bNode *node, bNodeStack **i CompBuf *cbuf= in[1]->data; CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */ - if(in[0]->data) - composit2_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, in[0]->data, in[0]->vec, do_curves_fac, CB_RGBA, CB_VAL); - else + if(in[0]->vec[0] == 1.0) composit1_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, do_curves, CB_RGBA); + else + composit2_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, in[0]->data, in[0]->vec, do_curves_fac, CB_RGBA, CB_VAL); out[0]->data= stackbuf; } diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_invert.c b/source/blender/nodes/intern/CMP_nodes/CMP_invert.c new file mode 100644 index 00000000000..1d4be2bc09f --- /dev/null +++ b/source/blender/nodes/intern/CMP_nodes/CMP_invert.c @@ -0,0 +1,134 @@ +/** + * $Id: CMP_mixrgb.c,v 1.4 2007/04/04 13:58:10 jesterking Exp $ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2006 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL LICENSE BLOCK ***** + */ +#include "../CMP_util.h" + +/* **************** INVERT ******************** */ +static bNodeSocketType cmp_node_invert_in[]= { + { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; + +static bNodeSocketType cmp_node_invert_out[]= { + { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; + +static void do_invert(bNode *node, float *out, float *in) +{ + if(node->custom1 & CMP_CHAN_RGB) { + out[0] = 1.0f - in[0]; + out[1] = 1.0f - in[1]; + out[2] = 1.0f - in[2]; + } else + VECCOPY(out, in); + + if(node->custom1 & CMP_CHAN_A) + out[3] = 1.0f - in[3]; + else + out[3] = in[3]; +} + +static void do_invert_fac(bNode *node, float *out, float *in, float *fac) +{ + float col[4], facm; + + do_invert(node, col, in); + + /* blend inverted result against original input with fac */ + facm = 1.0 - fac[0]; + + if(node->custom1 & CMP_CHAN_RGB) { + col[0] = fac[0]*col[0] + (facm*in[0]); + col[1] = fac[0]*col[1] + (facm*in[1]); + col[2] = fac[0]*col[2] + (facm*in[2]); + } + if(node->custom1 & CMP_CHAN_A) + col[3] = fac[0]*col[3] + (facm*in[3]); + + QUATCOPY(out, col); +} + +static void node_composit_exec_invert(void *data, bNode *node, bNodeStack **in, bNodeStack **out) +{ + /* stack order in: fac, Image, Image */ + /* stack order out: Image */ + float *fac= in[0]->vec; + + if(out[0]->hasoutput==0) return; + + /* input no image? then only color operation */ + if(in[1]->data==NULL && in[0]->data==NULL) { + do_invert_fac(node, out[0]->vec, in[1]->vec, fac); + } + else { + /* make output size of first available input image, or then size of fac */ + CompBuf *cbuf= in[1]->data?in[1]->data:in[0]->data; + + /* if neither RGB or A toggled on, pass through */ + if (node->custom1 != 0) { + CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */ + + if (fac[0] < 1.0f || in[0]->data!=NULL) + composit2_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, in[0]->data, fac, do_invert_fac, CB_RGBA, CB_VAL); + else + composit1_pixel_processor(node, stackbuf, in[1]->data, in[1]->vec, do_invert, CB_RGBA); + out[0]->data= stackbuf; + return; + + } else { + out[0]->data = pass_on_compbuf(cbuf); + return; + } + } +} + +static void node_composit_init_invert(bNode *node) +{ + node->custom1 |= CMP_CHAN_RGB; +} + +/* custom1 = mix type */ +bNodeType cmp_node_invert= { + /* *next,*prev */ NULL, NULL, + /* type code */ CMP_NODE_INVERT, + /* name */ "Invert", + /* width+range */ 120, 120, 140, + /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS, + /* input sock */ cmp_node_invert_in, + /* output sock */ cmp_node_invert_out, + /* storage */ "", + /* execfunc */ node_composit_exec_invert, + /* butfunc */ NULL, + /* initfunc */ node_composit_init_invert, + /* freestoragefunc */ NULL, + /* copystoragefunc */ NULL, + /* id */ NULL + +}; diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c b/source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c index 790b24a105a..6a4916b3fac 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c @@ -81,7 +81,7 @@ bNodeType cmp_node_mix_rgb= { /* *next,*prev */ NULL, NULL, /* type code */ CMP_NODE_MIX_RGB, /* name */ "Mix", - /* width+range */ 80, 60, 120, + /* width+range */ 110, 60, 120, /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS, /* input sock */ cmp_node_mix_rgb_in, /* output sock */ cmp_node_mix_rgb_out, diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c b/source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c index d56baecb587..a7e0e28989b 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c @@ -46,7 +46,7 @@ static void node_composit_exec_setalpha(void *data, bNode *node, bNodeStack **in /* stack order in: col, alpha */ /* input no image? then only color operation */ - if(in[0]->data==NULL) { + if(in[0]->data==NULL && in[1]->data==NULL) { out[0]->vec[0] = in[0]->vec[0]; out[0]->vec[1] = in[0]->vec[1]; out[0]->vec[2] = in[0]->vec[2]; @@ -54,7 +54,7 @@ static void node_composit_exec_setalpha(void *data, bNode *node, bNodeStack **in } else { /* make output size of input image */ - CompBuf *cbuf= in[0]->data; + CompBuf *cbuf= in[0]->data?in[0]->data:in[1]->data; CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_RGBA, 1); /* allocs */ if(in[1]->data==NULL && in[1]->vec[0]==1.0f) { diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_geom.c b/source/blender/nodes/intern/SHD_nodes/SHD_geom.c index 3875dead2b0..b15aa6802f3 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_geom.c +++ b/source/blender/nodes/intern/SHD_nodes/SHD_geom.c @@ -41,6 +41,7 @@ static bNodeSocketType sh_node_geom_out[]= { { SOCK_VECTOR, 0, "UV", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, { SOCK_RGBA, 0, "Vertex Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { SOCK_VALUE, 0, "Front/Back", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, { -1, 0, "" } }; @@ -52,6 +53,7 @@ static void node_shader_exec_geom(void *data, bNode *node, bNodeStack **in, bNod NodeGeometry *ngeo= (NodeGeometry*)node->storage; ShadeInputUV *suv= &shi->uv[0]; static float defaultvcol[4] = {1.0f, 1.0f, 1.0f, 1.0f}; + static float front= 0.0; int i; if(ngeo->uvname[0]) { @@ -105,6 +107,15 @@ static void node_shader_exec_geom(void *data, bNode *node, bNodeStack **in, bNod out[GEOM_OUT_NORMAL]->data= shi->dxno; out[GEOM_OUT_NORMAL]->datatype= NS_OSA_VECTORS; } + + /* front/back + * check the original un-flipped normals to determine front or back side */ + if (shi->orignor[2] < FLT_EPSILON) { + front= 1.0f; + } else { + front = 0.0f; + } + out[GEOM_OUT_FRONTBACK]->vec[0]= front; } } diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_invert.c b/source/blender/nodes/intern/SHD_nodes/SHD_invert.c new file mode 100644 index 00000000000..4d1ce282fce --- /dev/null +++ b/source/blender/nodes/intern/SHD_nodes/SHD_invert.c @@ -0,0 +1,83 @@ +/** + * $Id: SHD_math.c,v 1.4 2007/04/04 13:58:12 jesterking Exp $ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2005 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include "../SHD_util.h" + + + +/* **************** INVERT ******************** */ +static bNodeSocketType sh_node_invert_in[]= { + { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; + +static bNodeSocketType sh_node_invert_out[]= { + { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; + +static void node_shader_exec_invert(void *data, bNode *node, bNodeStack **in, +bNodeStack **out) +{ + float col[3], facm; + + col[0] = 1.0f - in[1]->vec[0]; + col[1] = 1.0f - in[1]->vec[1]; + col[2] = 1.0f - in[1]->vec[2]; + + /* if fac, blend result against original input */ + if (in[0]->vec[0] < 1.0f) { + facm = 1.0 - in[0]->vec[0]; + + col[0] = in[0]->vec[0]*col[0] + (facm*in[1]->vec[0]); + col[1] = in[0]->vec[0]*col[1] + (facm*in[1]->vec[1]); + col[2] = in[0]->vec[0]*col[2] + (facm*in[1]->vec[2]); + } + + VECCOPY(out[0]->vec, col); +} + +bNodeType sh_node_invert= { + /* *next,*prev */ NULL, NULL, + /* type code */ SH_NODE_INVERT, + /* name */ "Invert", + /* width+range */ 90, 80, 100, + /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS, + /* input sock */ sh_node_invert_in, + /* output sock */ sh_node_invert_out, + /* storage */ "", + /* execfunc */ node_shader_exec_invert, + /* butfunc */ NULL, + /* initfunc */ NULL, + /* freestoragefunc */ NULL, + /* copystoragefunc */ NULL, + /* id */ NULL +}; + diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_material.c b/source/blender/nodes/intern/SHD_nodes/SHD_material.c index 1dc18f97496..bdceb134c0d 100644 --- a/source/blender/nodes/intern/SHD_nodes/SHD_material.c +++ b/source/blender/nodes/intern/SHD_nodes/SHD_material.c @@ -39,11 +39,6 @@ static bNodeSocketType sh_node_material_in[]= { { -1, 0, "" } }; -/* output socket defines */ -#define MAT_OUT_COLOR 0 -#define MAT_OUT_ALPHA 1 -#define MAT_OUT_NORMAL 2 - static bNodeSocketType sh_node_material_out[]= { { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, { SOCK_VALUE, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, @@ -51,6 +46,34 @@ static bNodeSocketType sh_node_material_out[]= { { -1, 0, "" } }; +/* **************** EXTENDED MATERIAL ******************** */ + +static bNodeSocketType sh_node_material_ext_in[]= { + { SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { SOCK_RGBA, 1, "Spec", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { SOCK_VALUE, 1, "Refl", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { SOCK_VECTOR, 1, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, + { SOCK_RGBA, 1, "Mirror", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { SOCK_RGBA, 1, "AmbCol", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { SOCK_VALUE, 1, "Ambient", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { SOCK_VALUE, 1, "Emit", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { SOCK_VALUE, 1, "SpecTra", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { SOCK_VALUE, 1, "Ray Mirror", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_VALUE, 1, "Alpha", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { SOCK_VALUE, 1, "Translucency", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; + +static bNodeSocketType sh_node_material_ext_out[]= { + { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { SOCK_VALUE, 0, "Alpha", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}, + { SOCK_VECTOR, 0, "Normal", 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f}, + { SOCK_RGBA, 0, "Diffuse", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { SOCK_RGBA, 0, "Spec", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { SOCK_RGBA, 0, "AO", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f}, + { -1, 0, "" } +}; + static void node_shader_exec_material(void *data, bNode *node, bNodeStack **in, bNodeStack **out) { if(data && node->id) { @@ -91,6 +114,25 @@ static void node_shader_exec_material(void *data, bNode *node, bNodeStack **in, shi->vn[2]= -shi->vn[2]; } + if (node->type == SH_NODE_MATERIAL_EXT) { + if(in[MAT_IN_MIR]->hasinput) + nodestack_get_vec(&shi->mirr, SOCK_VECTOR, in[MAT_IN_MIR]); + if(in[MAT_IN_AMBCOL]->hasinput) + nodestack_get_vec(&shi->ambr, SOCK_VECTOR, in[MAT_IN_AMBCOL]); + if(in[MAT_IN_AMB]->hasinput) + nodestack_get_vec(&shi->amb, SOCK_VALUE, in[MAT_IN_AMB]); + if(in[MAT_IN_EMIT]->hasinput) + nodestack_get_vec(&shi->emit, SOCK_VALUE, in[MAT_IN_EMIT]); + if(in[MAT_IN_SPECTRA]->hasinput) + nodestack_get_vec(&shi->spectra, SOCK_VALUE, in[MAT_IN_SPECTRA]); + if(in[MAT_IN_RAY_MIRROR]->hasinput) + nodestack_get_vec(&shi->ray_mirror, SOCK_VALUE, in[MAT_IN_RAY_MIRROR]); + if(in[MAT_IN_ALPHA]->hasinput) + nodestack_get_vec(&shi->alpha, SOCK_VALUE, in[MAT_IN_ALPHA]); + if(in[MAT_IN_TRANSLUCENCY]->hasinput) + nodestack_get_vec(&shi->translucency, SOCK_VALUE, in[MAT_IN_TRANSLUCENCY]); + } + node_shader_lamp_loop(shi, &shrnode); /* clears shrnode */ /* write to outputs */ @@ -122,6 +164,15 @@ static void node_shader_exec_material(void *data, bNode *node, bNodeStack **in, VECCOPY(out[MAT_OUT_NORMAL]->vec, shi->vn); + /* Extended material options */ + if (node->type == SH_NODE_MATERIAL_EXT) { + /* Shadow, Reflect, Refract, Radiosity, Speed seem to cause problems inside + * a node tree :( */ + VECCOPY(out[MAT_OUT_DIFFUSE]->vec, shrnode.diff); + VECCOPY(out[MAT_OUT_SPEC]->vec, shrnode.spec); + VECCOPY(out[MAT_OUT_AO]->vec, shrnode.ao); + } + /* copy passes, now just active node */ if(node->flag & NODE_ACTIVE_ID) *(shcd->shr)= shrnode; @@ -153,3 +204,21 @@ bNodeType sh_node_material= { }; +bNodeType sh_node_material_ext= { + /* *next,*prev */ NULL, NULL, + /* type code */ SH_NODE_MATERIAL_EXT, + /* name */ "Extended Material", + /* width+range */ 120, 80, 240, + /* class+opts */ NODE_CLASS_INPUT, NODE_OPTIONS|NODE_PREVIEW, + /* input sock */ sh_node_material_ext_in, + /* output sock */ sh_node_material_ext_out, + /* storage */ "", + /* execfunc */ node_shader_exec_material, + /* butfunc */ NULL, + /* initfunc */ node_shader_init_material, + /* freestoragefunc */ NULL, + /* copystoragefunc */ NULL, + /* id */ NULL + +}; + diff --git a/source/blender/nodes/intern/SHD_util.c b/source/blender/nodes/intern/SHD_util.c index 8401c302386..c9f58fbce49 100644 --- a/source/blender/nodes/intern/SHD_util.c +++ b/source/blender/nodes/intern/SHD_util.c @@ -145,7 +145,7 @@ void nodeShaderSynchronizeID(bNode *node, int copyto) { if(node->id==NULL) return; - if(node->type==SH_NODE_MATERIAL) { + if(ELEM(node->type, SH_NODE_MATERIAL, SH_NODE_MATERIAL_EXT)) { bNodeSocket *sock; Material *ma= (Material *)node->id; int a; @@ -161,6 +161,20 @@ void nodeShaderSynchronizeID(bNode *node, int copyto) VECCOPY(&ma->specr, sock->ns.vec); break; case MAT_IN_REFL: ma->ref= sock->ns.vec[0]; break; + case MAT_IN_MIR: + VECCOPY(&ma->mirr, sock->ns.vec); break; + case MAT_IN_AMB: + VECCOPY(&ma->ambr, sock->ns.vec); break; + case MAT_IN_EMIT: + ma->emit= sock->ns.vec[0]; break; + case MAT_IN_SPECTRA: + ma->spectra= sock->ns.vec[0]; break; + case MAT_IN_RAY_MIRROR: + ma->ray_mirror= sock->ns.vec[0]; break; + case MAT_IN_ALPHA: + ma->alpha= sock->ns.vec[0]; break; + case MAT_IN_TRANSLUCENCY: + ma->translucency= sock->ns.vec[0]; break; } } else { @@ -171,6 +185,20 @@ void nodeShaderSynchronizeID(bNode *node, int copyto) VECCOPY(sock->ns.vec, &ma->specr); break; case MAT_IN_REFL: sock->ns.vec[0]= ma->ref; break; + case MAT_IN_MIR: + VECCOPY(sock->ns.vec, &ma->mirr); break; + case MAT_IN_AMB: + VECCOPY(sock->ns.vec, &ma->ambr); break; + case MAT_IN_EMIT: + sock->ns.vec[0]= ma->emit; break; + case MAT_IN_SPECTRA: + sock->ns.vec[0]= ma->spectra; break; + case MAT_IN_RAY_MIRROR: + sock->ns.vec[0]= ma->ray_mirror; break; + case MAT_IN_ALPHA: + sock->ns.vec[0]= ma->alpha; break; + case MAT_IN_TRANSLUCENCY: + sock->ns.vec[0]= ma->translucency; break; } } } diff --git a/source/blender/nodes/intern/SHD_util.h b/source/blender/nodes/intern/SHD_util.h index 6b9a26de350..f75802b7c15 100644 --- a/source/blender/nodes/intern/SHD_util.h +++ b/source/blender/nodes/intern/SHD_util.h @@ -108,12 +108,30 @@ typedef struct ShaderCallData { #define GEOM_OUT_UV 4 #define GEOM_OUT_NORMAL 5 #define GEOM_OUT_VCOL 6 +#define GEOM_OUT_FRONTBACK 7 + /* input socket defines */ #define MAT_IN_COLOR 0 #define MAT_IN_SPEC 1 #define MAT_IN_REFL 2 #define MAT_IN_NORMAL 3 +#define MAT_IN_MIR 4 +#define MAT_IN_AMBCOL 5 +#define MAT_IN_AMB 6 +#define MAT_IN_EMIT 7 +#define MAT_IN_SPECTRA 8 +#define MAT_IN_RAY_MIRROR 9 +#define MAT_IN_ALPHA 10 +#define MAT_IN_TRANSLUCENCY 11 + +/* output socket defines */ +#define MAT_OUT_COLOR 0 +#define MAT_OUT_ALPHA 1 +#define MAT_OUT_NORMAL 2 +#define MAT_OUT_DIFFUSE 3 +#define MAT_OUT_SPEC 4 +#define MAT_OUT_AO 5 extern void node_ID_title_cb(void *node_v, void *unused_v); diff --git a/source/blender/python/api2_2x/Blender.c b/source/blender/python/api2_2x/Blender.c index 174c2be95a7..9a5163022ff 100644 --- a/source/blender/python/api2_2x/Blender.c +++ b/source/blender/python/api2_2x/Blender.c @@ -521,14 +521,7 @@ static PyObject *Blender_Get( PyObject * self, PyObject * args ) /*****************************************************************************/ static PyObject *Blender_Redraw( PyObject * self, PyObject * args ) { - int wintype = SPACE_VIEW3D; - - if( !PyArg_ParseTuple( args, "|i", &wintype ) ) { - return EXPP_ReturnPyObjError( PyExc_TypeError, - "expected int argument (or nothing)" ); - } - - return M_Window_Redraw( self, PyInt_FromLong( (long)wintype ) ); + return M_Window_Redraw( self, args ); } /*****************************************************************************/ diff --git a/source/blender/python/api2_2x/Key.c b/source/blender/python/api2_2x/Key.c index 49fd55ed5c2..4e5d4278fd3 100644 --- a/source/blender/python/api2_2x/Key.c +++ b/source/blender/python/api2_2x/Key.c @@ -315,7 +315,7 @@ static PyObject *Key_repr( BPy_Key * self ) static PyObject *Key_getIpo( BPy_Key * self ) { if (self->key->ipo) - Ipo_CreatePyObject( self->key->ipo ); + return Ipo_CreatePyObject( self->key->ipo ); Py_RETURN_NONE; } diff --git a/source/blender/python/api2_2x/Mesh.c b/source/blender/python/api2_2x/Mesh.c index b64259553bf..bd78900f625 100644 --- a/source/blender/python/api2_2x/Mesh.c +++ b/source/blender/python/api2_2x/Mesh.c @@ -6922,45 +6922,26 @@ static PyObject *Mesh_fill( BPy_Mesh * self ) /* * "pointInside" function */ - +#define SIDE_OF_LINE(pa,pb,pp) ((pa[0]-pp[0])*(pb[1]-pp[1]))-((pb[0]-pp[0])*(pa[1]-pp[1])) +#define POINT_IN_TRI(p0,p1,p2,p3) ((SIDE_OF_LINE(p1,p2,p0)>=0) && (SIDE_OF_LINE(p2,p3,p0)>=0) && (SIDE_OF_LINE(p3,p1,p0)>=0)) static short pointInside_internal(float *vec, float *v1, float *v2, float *v3 ) { - float a,a1,a2,a3, /*areas, used for point in tri test */ - z,w1,w2,w3,wtot; - float bounds[5]; + float z,w1,w2,w3,wtot; - /*min,max*/ - bounds[0] = MIN3(v1[0], v2[0], v3[0]); - bounds[1] = MAX3(v1[0], v2[0], v3[0]); - bounds[2] = MIN3(v1[1], v2[1], v3[1]); - bounds[3] = MAX3(v1[1], v2[1], v3[1]); - /*bounds[4] = MIN3(v1[2], v2[2], v3[2]); - ZMIN isnt used*/ - bounds[4] = MAX3(v1[2], v2[2], v3[2]); /* reuse 4 index as the max */ + if (!POINT_IN_TRI(vec, v1,v2,v3)) + return 0; - if ( /* is the vertex in the bounds of the face? */ - (bounds[0] < vec[0] && vec[0] < bounds[1]) && - (bounds[2] < vec[1] && vec[1] < bounds[3]) && - (bounds[4] < vec[2]) /* the vector must be above the face on the Z axis */ - ) - { - /* these areas are used for calculating the Z value where the vector is over the face */ - a = AreaF2Dfl(v1, v2, v3); - w1=a1= AreaF2Dfl(vec, v2, v3); - if (a1>a) return 0; /*outside*/ - w2=a2= AreaF2Dfl(v1, vec, v3); - if (a1+a2>a) return 0; /*outside*/ - w3=a3= AreaF2Dfl(v1, v2, vec); - if ((a1+a2+a3) - 0.000001 > a) return 0; /*outside*/ - + if (vec[2] < MAX3(v1[2], v2[2], v3[2])) { + w1= AreaF2Dfl(vec, v2, v3); + w2= AreaF2Dfl(v1, vec, v3); + w3= AreaF2Dfl(v1, v2, vec); wtot = w1+w2+w3; - if (!wtot) return 0; w1/=wtot; w2/=wtot; w3/=wtot; z =((v1[2] * (w2+w3)) + (v2[2] * (w1+w3)) + (v3[2] * (w1+w2))) * 0.5; - /* only return true if the face is above vec*/ - if (vec[2] > z ) + if (vec[2] < z ) return 1; } return 0; diff --git a/source/blender/python/api2_2x/NMesh.c b/source/blender/python/api2_2x/NMesh.c index 5c86a344896..0a4e8b50406 100644 --- a/source/blender/python/api2_2x/NMesh.c +++ b/source/blender/python/api2_2x/NMesh.c @@ -524,16 +524,18 @@ static PyObject *new_NMFace( PyObject * vertexlist ) vlcopy = PyList_New( len ); - if( !vlcopy ) + if( !vlcopy ) { + Py_DECREF(mf); return EXPP_ReturnPyObjError( PyExc_MemoryError, "couldn't create PyList" ); - + } for( i = 0; i < len; i++ ) { item = PySequence_GetItem( vertexlist, i ); /* PySequence increfs */ if( item ) PyList_SET_ITEM( vlcopy, i, item ); else { + Py_DECREF(mf); Py_DECREF(vlcopy); return EXPP_ReturnPyObjError ( PyExc_RuntimeError, @@ -582,7 +584,7 @@ static PyObject *NMFace_append( PyObject * self, PyObject * args ) PyList_Append( f->v, vert ); - return EXPP_incr_ret( Py_None ); + Py_RETURN_NONE; } #undef MethodDef @@ -616,7 +618,7 @@ static PyObject *NMFace_getattr( PyObject * self, char *name ) if( mf->image ) return Image_CreatePyObject( mf->image ); else - return EXPP_incr_ret( Py_None ); + Py_RETURN_NONE; } else if( strcmp( name, "mode" ) == 0 ) @@ -1169,7 +1171,7 @@ static PyObject *NMesh_setMaterials( PyObject * self, PyObject * args ) Py_DECREF( me->materials ); me->materials = EXPP_incr_ret( pymats ); - return EXPP_incr_ret( Py_None ); + Py_RETURN_NONE; } static PyObject *NMesh_addMaterial( PyObject * self, PyObject * args ) @@ -1200,7 +1202,7 @@ static PyObject *NMesh_addMaterial( PyObject * self, PyObject * args ) PyList_Append( me->materials, ( PyObject * ) pymat ); - return EXPP_incr_ret( Py_None ); + Py_RETURN_NONE; } static PyObject *NMesh_getKey( BPy_NMesh * self ) @@ -1269,40 +1271,38 @@ static PyObject *NMesh_insertKey( PyObject * self, PyObject * args ) if( fra > 0 ) G.scene->r.cfra = (int)oldfra; - return EXPP_incr_ret( Py_None ); + Py_RETURN_NONE; } static PyObject *NMesh_getSelectedFaces( PyObject * self, PyObject * args ) { BPy_NMesh *nm = ( BPy_NMesh * ) self; Mesh *me = nm->mesh; - int flag = 0; - - MTFace *tf; - int i; - PyObject *l = PyList_New( 0 ), *pyval; - - if( me == NULL ) - return NULL; - - tf = me->mtface; - if( tf == 0 ) - return l; + int i, totfaces, flag = 0; + PyObject *l, *pyval; if( !PyArg_ParseTuple( args, "|i", &flag ) ) - return NULL; - + return EXPP_ReturnPyObjError( PyExc_ValueError, + "expected int argument (or nothing)" ); + + l = PyList_New( 0 ); + if( me == NULL || me->mface == NULL) + return l; + + /* make sure not to write more faces then we have */ + totfaces= MIN2(me->totface, PySequence_Length(nm->faces)); + if( flag ) { - for( i = 0; i < me->totface; i++ ) { - if( tf[i].flag & TF_SELECT ) { + for( i = 0; i < totfaces; i++ ) { + if( me->mface[i].flag & ME_FACE_SEL ) { pyval = PyInt_FromLong( i ); PyList_Append( l, pyval ); Py_DECREF(pyval); } } } else { - for( i = 0; i < me->totface; i++ ) { - if( tf[i].flag & TF_SELECT ) + for( i = 0; i < totfaces; i++ ) { + if( me->mface[i].flag & ME_FACE_SEL ) PyList_Append( l, PyList_GetItem( nm->faces, i ) ); } } @@ -1312,7 +1312,7 @@ static PyObject *NMesh_getSelectedFaces( PyObject * self, PyObject * args ) static PyObject *NMesh_getActiveFace( PyObject * self ) { if( ( ( BPy_NMesh * ) self )->sel_face < 0 ) - return EXPP_incr_ret( Py_None ); + Py_RETURN_NONE; return Py_BuildValue( "i", ( ( BPy_NMesh * ) self )->sel_face ); } @@ -1576,8 +1576,7 @@ static PyObject *NMesh_setMaxSmoothAngle( PyObject * self, PyObject * args ) ( short ) EXPP_ClampInt( value, NMESH_SMOOTHRESH_MIN, NMESH_SMOOTHRESH_MAX ); - Py_INCREF( Py_None ); - return Py_None; + Py_RETURN_NONE; } static PyObject *NMesh_getSubDivLevels( BPy_NMesh * self ) @@ -1609,8 +1608,7 @@ static PyObject *NMesh_setSubDivLevels( PyObject * self, PyObject * args ) ( short ) EXPP_ClampInt( render, NMESH_SUBDIV_MIN, NMESH_SUBDIV_MAX ); - Py_INCREF( Py_None ); - return Py_None; + Py_RETURN_NONE; } static PyObject *NMesh_getMode( BPy_NMesh * self ) @@ -1662,8 +1660,7 @@ static PyObject *NMesh_setMode( PyObject * self, PyObject * args ) nmesh->mode = mode; - Py_INCREF( Py_None ); - return Py_None; + Py_RETURN_NONE; } /* METH_VARARGS: function(PyObject *self, PyObject *args) */ @@ -2827,7 +2824,7 @@ PyObject *NMesh_assignMaterials_toObject( BPy_NMesh * nmesh, Object * ob ) ob->colbits = old_matmask; /*@ HACK */ ob->actcol = 1; - return EXPP_incr_ret( Py_None ); + Py_RETURN_NONE; } static void fill_medge_from_nmesh(Mesh * mesh, BPy_NMesh * nmesh) @@ -3193,7 +3190,7 @@ static PyObject *M_NMesh_PutRaw( PyObject * self, PyObject * args ) EXPP_newMaterialList_fromPyList( nmesh->materials ); EXPP_incr_mats_us( mesh->mat, PyList_Size( nmesh->materials ) ); - return EXPP_incr_ret( Py_None ); + Py_RETURN_NONE; } } @@ -3421,7 +3418,7 @@ static PyObject *findEdge( BPy_NMesh *nmesh, BPy_NMVert *v1, BPy_NMVert *v2, int return newEdge; } else - return EXPP_incr_ret( Py_None ); + Py_RETURN_NONE; } static void removeEdge( BPy_NMesh *nmesh, BPy_NMVert *v1, BPy_NMVert *v2, int ununsedOnly) @@ -3526,7 +3523,7 @@ static PyObject *NMesh_removeEdge( PyObject * self, PyObject * args ) "vertices must be different" ); removeEdge(bmesh, v1, v2, 0); - return EXPP_incr_ret( Py_None ); + Py_RETURN_NONE; } @@ -3579,7 +3576,7 @@ static PyObject *NMesh_addFace( PyObject * self, PyObject * args ) return edges; } - return EXPP_incr_ret( Py_None ); + Py_RETURN_NONE; } static PyObject *NMesh_removeFace( PyObject * self, PyObject * args ) @@ -3626,7 +3623,7 @@ static PyObject *NMesh_removeFace( PyObject * self, PyObject * args ) } } - return EXPP_incr_ret( Py_None ); + Py_RETURN_NONE; } static PyObject *NMesh_printDebug( PyObject * self ) @@ -3675,7 +3672,7 @@ static PyObject *NMesh_printDebug( PyObject * self ) } } - return EXPP_incr_ret( Py_None ); + Py_RETURN_NONE; } static PyObject *NMesh_addVertGroup( PyObject * self, PyObject * args ) @@ -3702,7 +3699,7 @@ static PyObject *NMesh_addVertGroup( PyObject * self, PyObject * args ) EXPP_allqueue( REDRAWBUTSALL, 1 ); - return EXPP_incr_ret( Py_None ); + Py_RETURN_NONE; } static PyObject *NMesh_removeVertGroup( PyObject * self, PyObject * args ) @@ -3738,7 +3735,7 @@ static PyObject *NMesh_removeVertGroup( PyObject * self, PyObject * args ) EXPP_allqueue( REDRAWBUTSALL, 1 ); - return EXPP_incr_ret( Py_None ); + Py_RETURN_NONE; } static PyObject *NMesh_assignVertsToGroup( PyObject * self, PyObject * args ) @@ -3824,7 +3821,7 @@ static PyObject *NMesh_assignVertsToGroup( PyObject * self, PyObject * args ) add_vert_defnr( object, nIndex, tempInt, weight, assignmode ); } - return EXPP_incr_ret( Py_None ); + Py_RETURN_NONE; } static PyObject *NMesh_removeVertsFromGroup( PyObject * self, PyObject * args ) @@ -3910,7 +3907,7 @@ static PyObject *NMesh_removeVertsFromGroup( PyObject * self, PyObject * args ) } } - return EXPP_incr_ret( Py_None ); + Py_RETURN_NONE; } static PyObject *NMesh_getVertsFromGroup( PyObject * self, PyObject * args ) @@ -4098,7 +4095,7 @@ static PyObject *NMesh_renameVertGroup( PyObject * self, PyObject * args ) PyOS_snprintf( defGroup->name, 32, newGr ); unique_vertexgroup_name( defGroup, ( ( BPy_NMesh * ) self )->object ); - return EXPP_incr_ret( Py_None ); + Py_RETURN_NONE; } static PyObject *NMesh_getVertGroupNames( PyObject * self ) @@ -4191,6 +4188,5 @@ static PyObject *NMesh_transform (PyObject *self, PyObject *args) /* should we alternatively return a list of changed verts (and preserve * the original ones) ? */ - Py_INCREF( Py_None ); - return Py_None; + Py_RETURN_NONE; } diff --git a/source/blender/python/api2_2x/Scene.c b/source/blender/python/api2_2x/Scene.c index 39a7f0d77f4..fd139c4fe6e 100644 --- a/source/blender/python/api2_2x/Scene.c +++ b/source/blender/python/api2_2x/Scene.c @@ -1343,16 +1343,18 @@ static PyObject *SceneObSeq_item( BPy_SceneObSeq * self, int i ) if (self->mode==EXPP_OBSEQ_NORMAL) for (base= scene->base.first; base && i!=index; base= base->next, index++) {} /* selected */ - else if (self->mode==EXPP_OBSEQ_SELECTED) + else if (self->mode==EXPP_OBSEQ_SELECTED) { for (base= scene->base.first; base && i!=index; base= base->next) if (base->flag & SELECT) index++; + } /* context */ - else if (self->mode==EXPP_OBSEQ_CONTEXT) + else if (self->mode==EXPP_OBSEQ_CONTEXT) { if (G.vd) for (base= scene->base.first; base && i!=index; base= base->next) if TESTBASE(base) index++; + } if (!(base)) return EXPP_ReturnPyObjError( PyExc_IndexError, diff --git a/source/blender/python/api2_2x/doc/Render.py b/source/blender/python/api2_2x/doc/Render.py index adadf54c488..9c9f58f6074 100644 --- a/source/blender/python/api2_2x/doc/Render.py +++ b/source/blender/python/api2_2x/doc/Render.py @@ -498,7 +498,7 @@ class RenderData: def setOversamplingLevel(level): """ - Set the edge color for toon shading. + Set the level of over-sampling (anti-aliasing). @type level: int @param level: can be either 5, 8, 11, or 16 """ diff --git a/source/blender/python/api2_2x/doc/Scene.py b/source/blender/python/api2_2x/doc/Scene.py index fb852f2aa49..93d3e7d830e 100644 --- a/source/blender/python/api2_2x/doc/Scene.py +++ b/source/blender/python/api2_2x/doc/Scene.py @@ -107,6 +107,8 @@ class Scene: @ivar objects: The scene's objects. The sequence supports the methods .link(ob), .unlink(ob), and .new(obdata), and can be iterated over. @type cursor: Vector (wrapped) @ivar cursor: the 3d cursor location for this scene. + @type camera: Camera or None + @ivar camera: The active camera for this scene (can be set) @type world: World or None @ivar world: The world that this scene uses (if any) @type timeline: Timeline diff --git a/source/blender/render/extern/include/RE_shader_ext.h b/source/blender/render/extern/include/RE_shader_ext.h index c1b20da53b7..364535736ae 100644 --- a/source/blender/render/extern/include/RE_shader_ext.h +++ b/source/blender/render/extern/include/RE_shader_ext.h @@ -151,6 +151,10 @@ typedef struct ShadeInput int samplenr; /* sample counter, to detect if we should do shadow again */ int depth; /* 1 or larger on raytrace shading */ + /* stored copy of original face normal (facenor) + * before flipping. Used in Front/back output on geometry node */ + float orignor[3]; + /* from initialize, part or renderlayer */ short do_preview; /* for nodes, in previewrender */ short thread, sample; /* sample: ShadeSample array index */ @@ -158,6 +162,7 @@ typedef struct ShadeInput int layflag, passflag, combinedflag; struct Group *light_override; struct Material *mat_override; + } ShadeInput; diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c index 51157cb83f4..ca661469b36 100644 --- a/source/blender/render/intern/source/shadeinput.c +++ b/source/blender/render/intern/source/shadeinput.c @@ -259,6 +259,11 @@ void shade_input_set_triangle_i(ShadeInput *shi, VlakRen *vlr, short i1, short i /* facenormal copy, can get flipped */ VECCOPY(shi->facenor, vlr->n); + /* copy of original pre-flipped normal, for geometry->front/back node output */ + VECCOPY(shi->orignor, vlr->n); + if (vlr->noflag & R_FLIPPED_NO) { + VECMUL(shi->orignor, -1.0f); + } } /* note, facenr declared volatile due to over-eager -O2 optimizations diff --git a/source/blender/src/SConscript b/source/blender/src/SConscript index 815cf532c88..729e79dcb6f 100644 --- a/source/blender/src/SConscript +++ b/source/blender/src/SConscript @@ -4,18 +4,6 @@ Import ('env') # TODO: src_env.Append (CCFLAGS = user_options_dict['SDL_CFLAGS']) sources = env.Glob('*.c') -numobj = len(sources) -maxobj = 30 - -numlibs = numobj / maxobj -if (numobj % maxobj): - numlibs = numlibs + 1 -subsources = [] - -if (env['OURPLATFORM'] == 'win32-mingw'): - for i in range(numlibs - 1): - subsources.append(sources[i*maxobj:(i+1)*maxobj]) - subsources.append(sources[(numlibs-1)*maxobj:]) incs = ' #/intern/guardedalloc #/intern/memutil' incs += ' ../blenlib ../makesdna ../blenkernel' @@ -67,8 +55,4 @@ if env['WITH_BF_VERSE']: if env['BF_BUILDINFO'] == 1: defs.append('NAN_BUILDINFO') -if (env['OURPLATFORM'] == 'win32-mingw'): - for i in range(numlibs): - env.BlenderLib ( libname = 'src%d' % (i), sources = subsources[i], includes = Split(incs), defines = defs, libtype=['core', 'intern'], priority = [5, 25] ) -else: - env.BlenderLib ( libname = 'src', sources = sources, includes = Split(incs), defines = defs, libtype=['core', 'intern'], priority = [5, 25] ) +env.BlenderLib ( libname = 'src', sources = sources, includes = Split(incs), defines = defs, libtype=['core', 'intern'], priority = [5, 25] ) diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c index 3760b17f039..ec2b7b3b274 100644 --- a/source/blender/src/buttons_editing.c +++ b/source/blender/src/buttons_editing.c @@ -4447,7 +4447,7 @@ static void editing_panel_links(Object *ob) block= uiNewBlock(&curarea->uiblocks, "editing_panel_links", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Link and Materials", "Editing", 0, 0, 318, 204)==0) return; - uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); + uiSetButLock((ob && ob->id.lib), ERROR_LIBDATA_MESSAGE); buttons_active_id(&id, &idfrom); diff --git a/source/blender/src/buttons_object.c b/source/blender/src/buttons_object.c index e47a80fe9fa..bb5ac2ba682 100644 --- a/source/blender/src/buttons_object.c +++ b/source/blender/src/buttons_object.c @@ -2462,11 +2462,22 @@ static void object_softbodies__enable(void *ob_v, void *arg2) allqueue(REDRAWBUTSEDIT, 0); } +static int _can_softbodies_at_all(Object *ob) +{ + // list of Yes + if ((ob->type==OB_MESH) + || (ob->type==OB_CURVE) + || (ob->type==OB_LATTICE) + || (ob->type==OB_SURF) + ) return 1; + // else deny + return 0; +} static void object_softbodies_II(Object *ob) { uiBlock *block; static int val; - + if(!_can_softbodies_at_all(ob)) return; block= uiNewBlock(&curarea->uiblocks, "object_softbodies_II", UI_EMBOSS, UI_HELV, curarea->win); uiNewPanelTabbed("Soft Body", "Physics"); if(uiNewPanel(curarea, block, "Soft Body Collision", "Physics", 651, 0, 318, 204)==0) return; @@ -2545,9 +2556,9 @@ static void object_softbodies(Object *ob) uiBlock *block; static int val; uiBut *but; + if(!_can_softbodies_at_all(ob)) return; block= uiNewBlock(&curarea->uiblocks, "object_softbodies", UI_EMBOSS, UI_HELV, curarea->win); if(uiNewPanel(curarea, block, "Soft Body", "Physics", 640, 0, 318, 204)==0) return; - uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE); val = modifiers_isSoftbodyEnabled(ob); diff --git a/source/blender/src/drawmesh.c b/source/blender/src/drawmesh.c index b1ce86dd045..6307307345b 100644 --- a/source/blender/src/drawmesh.c +++ b/source/blender/src/drawmesh.c @@ -320,7 +320,6 @@ int set_tpage(MTFace *tface) else fCurtile= tface->tile; if(tilemode) { - if(ima->repbind==0) make_repbind(ima); if(fCurtile>=ima->totbind) fCurtile= 0; diff --git a/source/blender/src/drawnode.c b/source/blender/src/drawnode.c index e1cab659171..883fd05909f 100644 --- a/source/blender/src/drawnode.c +++ b/source/blender/src/drawnode.c @@ -622,6 +622,7 @@ static void node_shader_set_butfunc(bNodeType *ntype) /* case NODE_GROUP: note, typeinfo for group is generated... see "XXX ugly hack" */ case SH_NODE_MATERIAL: + case SH_NODE_MATERIAL_EXT: ntype->butfunc= node_shader_buts_material; break; case SH_NODE_TEXTURE: @@ -1508,6 +1509,21 @@ static int node_composit_buts_scale(uiBlock *block, bNodeTree *ntree, bNode *nod return 20; } +static int node_composit_buts_invert(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr) +{ + if(block) { + uiBlockBeginAlign(block); + uiDefButBitS(block, TOG, CMP_CHAN_RGB, B_NODE_EXEC+node->nr, "RGB", + butr->xmin, butr->ymin, (butr->xmax-butr->xmin)/2, 20, + &node->custom1, 0, 0, 0, 0, ""); + uiDefButBitS(block, TOG, CMP_CHAN_A, B_NODE_EXEC+node->nr, "A", + butr->xmin+(butr->xmax-butr->xmin)/2, butr->ymin, (butr->xmax-butr->xmin)/2, 20, + &node->custom1, 0, 0, 0, 0, ""); + uiBlockEndAlign(block); + } + return 20; +} + /* only once called */ static void node_composit_set_butfunc(bNodeType *ntype) { @@ -1609,6 +1625,9 @@ static void node_composit_set_butfunc(bNodeType *ntype) case CMP_NODE_MATH: ntype->butfunc= node_buts_math; break; + case CMP_NODE_INVERT: + ntype->butfunc= node_composit_buts_invert; + break; default: ntype->butfunc= NULL; } diff --git a/source/blender/src/editaction.c b/source/blender/src/editaction.c index 4c698674bbf..1b0429abda2 100644 --- a/source/blender/src/editaction.c +++ b/source/blender/src/editaction.c @@ -2568,6 +2568,9 @@ void snap_keys_to_frame(int snap_mode) else if (key) { set_snap_meshchannels(key, snap_mode); } + else { + return; + } BIF_undo_push(str); allspace(REMAKEIPO, 0); @@ -2670,6 +2673,9 @@ void mirror_action_keys(short mirror_mode) else if (key) { mirror_meshchannels(key, mirror_mode); } + else { + return; + } BIF_undo_push(str); allspace(REMAKEIPO, 0); @@ -2678,6 +2684,82 @@ void mirror_action_keys(short mirror_mode) allqueue(REDRAWNLA, 0); } +/* This function allows the user to insert keyframes on the current + * frame from the Action Editor, using the current values of the channels + * to be keyframed. + */ +void insertkey_action(void) +{ + bAction *act; + Key *key; + Object *ob= OBACT; + IpoCurve *icu; + short mode; + float cfra; + + /* get data */ + act = G.saction->action; + key = get_action_mesh_key(); + cfra = frame_to_float(CFRA); + + if (act) { + bActionChannel *achan; + bConstraintChannel *conchan; + + /* ask user what to keyframe */ + mode = pupmenu("Insert Key%t|All Channels%x1|Only Selected Channels%x2"); + if (mode == 0) return; + + for (achan= act->chanbase.first; achan; achan=achan->next) { + if (EDITABLE_ACHAN(achan)) { + if (achan->ipo && (SEL_ACHAN(achan) || (mode == 1))) { + for (icu= achan->ipo->curve.first; icu; icu=icu->next) { + if (ob) + insertkey((ID *)ob, icu->blocktype, achan->name, NULL, icu->adrcode); + else + insert_vert_ipo(icu, cfra, icu->curval); + } + } + + if (EXPANDED_ACHAN(achan) && FILTER_CON_ACHAN(achan)) { + for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) { + if (EDITABLE_CONCHAN(conchan)) { + if (conchan->ipo && (SEL_ACHAN(conchan) || (mode == 1))) { + for (icu= conchan->ipo->curve.first; icu; icu=icu->next) { + /* // commented out as this doesn't seem to work right for some reason + if (ob) + insertkey((ID *)ob, ID_CO, achan->name, conchan->name, CO_ENFORCE); + else + insert_vert_ipo(icu, cfra, icu->curval); + */ + insert_vert_ipo(icu, cfra, icu->curval); + } + } + } + } + } + } + } + } + else if (key) { + /* ask user if they want to insert a keyframe */ + mode = okee("Insert Keyframe?"); + if (mode == 0) return; + + if (key->ipo) { + for (icu= key->ipo->curve.first; icu; icu=icu->next) { + insert_vert_ipo(icu, cfra, icu->curval); + } + } + } + + BIF_undo_push("Insert Key"); + allspace(REMAKEIPO, 0); + allqueue(REDRAWACTION, 0); + allqueue(REDRAWIPO, 0); + allqueue(REDRAWNLA, 0); +} + static void select_all_keys_frames(bAction *act, short *mval, short *mvalo, int selectmode) { @@ -2886,7 +2968,7 @@ static void borderselect_function(void (*select_func)(bAction *act, select_func(act, mval, mvalo, SELECT_SUBTRACT); } - BIF_undo_push("Border select Action"); + BIF_undo_push("Border Select Action"); } static void clever_keyblock_names(Key *key, short* mval){ @@ -3255,7 +3337,7 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt) } } break; - + case KKEY: if (G.qual & LR_CTRLKEY) { markers_selectkeys_between(); @@ -3278,8 +3360,10 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt) case MKEY: if (G.qual & LR_SHIFTKEY) { /* mirror keyframes */ - val = pupmenu("Mirror Keys Over%t|Current Frame%x1|Vertical Axis%x2|Horizontal Axis %x3|Selected Marker %x4"); - mirror_action_keys(val); + if (act || key) { + val = pupmenu("Mirror Keys Over%t|Current Frame%x1|Vertical Axis%x2|Horizontal Axis %x3|Selected Marker %x4"); + mirror_action_keys(val); + } } else { /* marker operations */ @@ -3329,8 +3413,10 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt) case SKEY: if (mval[0]>=ACTWIDTH) { if(G.qual & LR_SHIFTKEY) { - val = pupmenu("Snap Keys To%t|Nearest Frame%x1|Current Frame%x2|Nearest Marker %x3"); - snap_keys_to_frame(val); + if (act || key) { + val = pupmenu("Snap Keys To%t|Nearest Frame%x1|Current Frame%x2|Nearest Marker %x3"); + snap_keys_to_frame(val); + } } else { if (act) diff --git a/source/blender/src/editdeform.c b/source/blender/src/editdeform.c index 305d01a8aea..7a086ed5be3 100644 --- a/source/blender/src/editdeform.c +++ b/source/blender/src/editdeform.c @@ -55,12 +55,16 @@ #include "BKE_mesh.h" #include "BKE_utildefines.h" +#include "BIF_interface.h" #include "BIF_editdeform.h" #include "BIF_editmesh.h" +#include "BIF_space.h" #include "BIF_toolbox.h" #include "BSE_edit.h" +#include "butspace.h" +#include "mydevice.h" #include "editmesh.h" #include "multires.h" @@ -788,6 +792,99 @@ void vertexgroup_select_by_name(Object *ob, char *name) ob->actdef=0; // this signals on painting to create a new one, if a bone in posemode is selected */ } +/* This function provides a shortcut for adding/removing verts from + * vertex groups. It is called by the Ctrl-G hotkey in EditMode for Meshes + * and Lattices. (currently only restricted to those two) + * It is only responsible for + */ +void vgroup_assign_with_menu(void) +{ + Object *ob= G.obedit; + int defCount; + int mode; + + /* prevent crashes */ + if (ob==NULL) return; + + defCount= BLI_countlist(&ob->defbase); + + /* give user choices of adding to current/new or removing from current */ + if (defCount && ob->actdef) + mode = pupmenu("Vertex Groups %t|Add Selected to New Group %x1|Add Selected to Active Group %x2|Remove Selected from Active Group %x3"); + else + mode= pupmenu("Vertex Groups %t|Add Selected to New Group %x1"); + + /* handle choices */ + switch (mode) { + case 1: /* add to new group */ + add_defgroup(ob); + assign_verts_defgroup(); + allqueue(REDRAWVIEW3D, 1); + BIF_undo_push("Assign to vertex group"); + break; + case 2: /* add to current group */ + assign_verts_defgroup(); + allqueue(REDRAWVIEW3D, 1); + BIF_undo_push("Assign to vertex group"); + break; + case 3: /* remove from current group */ + remove_verts_defgroup(0); + allqueue(REDRAWVIEW3D, 1); + BIF_undo_push("Remove from vertex group"); + break; + } +} + +/* This function provides a shortcut for commonly used vertex group + * functions - change weight (not implemented), change active group, delete active group, + * when Ctrl-Shift-G is used in EditMode, for Meshes and Lattices (only for now). + */ +void vgroup_operation_with_menu(void) +{ + Object *ob= G.obedit; + int defCount; + int mode; + + /* prevent crashes and useless cases */ + if (ob==NULL) return; + + defCount= BLI_countlist(&ob->defbase); + if (defCount == 0) return; + + /* give user choices of adding to current/new or removing from current */ + if (ob->actdef) + mode = pupmenu("Vertex Groups %t|Change Active Group%x1|Delete Active Group%x2"); + else + mode= pupmenu("Vertex Groups %t|Change Active Group%x1"); + + /* handle choices */ + switch (mode) { + case 1: /* change active group*/ + { + char *menustr= get_vertexgroup_menustr(ob); + short nr; + + if (menustr) { + nr= pupmenu(menustr); + + if ((nr >= 1) && (nr <= defCount)) + ob->actdef= nr; + + MEM_freeN(menustr); + } + allqueue(REDRAWBUTSALL, 0); + } + break; + case 2: /* delete active group */ + { + del_defgroup(ob); + allqueue (REDRAWVIEW3D, 1); + allqueue(REDRAWOOPS, 0); + BIF_undo_push("Delete vertex group"); + } + break; + } +} /* ******************* other deform edit stuff ********** */ diff --git a/source/blender/src/editipo.c b/source/blender/src/editipo.c index 95e998d3496..ad5ffacf103 100644 --- a/source/blender/src/editipo.c +++ b/source/blender/src/editipo.c @@ -2426,6 +2426,9 @@ void common_insertkey(void) if(curarea->spacetype==SPACE_IPO) { insertkey_editipo(); } + else if(curarea->spacetype==SPACE_ACTION) { + insertkey_action(); + } else if(curarea->spacetype==SPACE_BUTS) { if(G.buts->mainb==CONTEXT_SHADING) { int tab= G.buts->tab[CONTEXT_SHADING]; diff --git a/source/blender/src/editnla.c b/source/blender/src/editnla.c index d204fa2b703..73eea2b5aa4 100644 --- a/source/blender/src/editnla.c +++ b/source/blender/src/editnla.c @@ -526,6 +526,9 @@ static void add_nla_block(short event) if(strip->object) id_lib_extern(&strip->object->id); /* checks lib data, sets correct flag for saving then */ + if(ob->nlastrips.first == NULL) + ob->nlaflag |= OB_NLA_OVERRIDE; + BLI_addtail(&ob->nlastrips, strip); BIF_undo_push("Add NLA strip"); @@ -580,6 +583,9 @@ static void add_nla_block_by_name(char name[32], Object *ob, short hold, short a act->id.us++; + if(ob->nlastrips.first == NULL) + ob->nlaflag |= OB_NLA_OVERRIDE; + BLI_addtail(&ob->nlastrips, strip); } diff --git a/source/blender/src/ghostwinlay.c b/source/blender/src/ghostwinlay.c index 9df293a0fda..19e858a9f59 100644 --- a/source/blender/src/ghostwinlay.c +++ b/source/blender/src/ghostwinlay.c @@ -881,10 +881,8 @@ Window *winlay_get_active_window(void) { void window_open_ndof(Window* win) { - PILdynlib* ndofLib = PIL_dynlib_open("NDOFPlugin.plug"); - printf("passing here \n"); + PILdynlib* ndofLib = PIL_dynlib_open("spaceplug.plug"); if (ndofLib) { - printf("and here \n"); GHOST_OpenNDOF(g_system, win->ghostwin, PIL_dynlib_find_symbol(ndofLib, "ndofInit"), diff --git a/source/blender/src/multires-firstlevel.c b/source/blender/src/multires-firstlevel.c index db39a429c22..2be867b5db0 100644 --- a/source/blender/src/multires-firstlevel.c +++ b/source/blender/src/multires-firstlevel.c @@ -55,6 +55,8 @@ MDeformVert *subdivide_dverts(MDeformVert *src, MultiresLevel *lvl); MTFace *subdivide_mtfaces(MTFace *src, MultiresLevel *lvl); +void multires_update_edge_flags(Mesh *me, EditMesh *em); +void eed_to_medge_flag(EditEdge *eed, short *flag, char *crease); /*********** Generic ***********/ @@ -221,6 +223,41 @@ void multires_del_lower_customdata(Multires *mr, MultiresLevel *cr_lvl) mr->fdata= cdf; } +/* Update all special first-level data, if the first-level is active */ +void multires_update_first_level(Mesh *me, EditMesh *em) +{ + if(me && me->mr && me->mr->current == 1) { + multires_update_customdata(me->mr->levels.first, em ? &em->vdata : &me->vdata, + &me->mr->vdata, CD_MDEFORMVERT); + multires_update_customdata(me->mr->levels.first, em ? &em->fdata : &me->fdata, + &me->mr->fdata, CD_MTFACE); + multires_update_edge_flags(me, em); + } +} + +/*********** Multires.edge_flags ***********/ +void multires_update_edge_flags(Mesh *me, EditMesh *em) +{ + MultiresLevel *lvl= me->mr->levels.first; + EditEdge *eed= NULL; + int i; + + if(em) eed= em->edges.first; + for(i=0; i<lvl->totedge; ++i) { + if(em) { + me->mr->edge_flags[i]= 0; + eed_to_medge_flag(eed, &me->mr->edge_flags[i], &me->mr->edge_creases[i]); + eed= eed->next; + } + else { + me->mr->edge_flags[i]= me->medge[i].flag; + me->mr->edge_creases[i]= me->medge[i].crease; + } + } +} + + + /*********** Multires.vdata ***********/ /* MDeformVert */ diff --git a/source/blender/src/multires.c b/source/blender/src/multires.c index d1ae24e73a8..33b85bd27b6 100644 --- a/source/blender/src/multires.c +++ b/source/blender/src/multires.c @@ -52,6 +52,7 @@ #include "BKE_key.h" #include "BKE_mesh.h" #include "BKE_modifier.h" +#include "BKE_object.h" #include "BIF_editmesh.h" #include "BIF_screen.h" @@ -483,13 +484,14 @@ void multires_get_face(MultiresFace *f, EditFace *efa, MFace *m) tmp.v3= efa->v3->tmp.l; tmp.v4= 0; if(efa->v4) tmp.v4= efa->v4->tmp.l; - tmp.flag= efa->flag; - if(efa->f & 1) tmp.flag |= ME_FACE_SEL; - else f->flag &= ~ME_FACE_SEL; - if(efa->h) tmp.flag |= ME_HIDE; test_index_face(&tmp, NULL, 0, efa->v4?4:3); for(j=0; j<4; ++j) f->v[j]= (&tmp.v1)[j]; - f->flag= tmp.flag; + + /* Flags */ + f->flag= efa->flag; + if(efa->f & 1) f->flag |= ME_FACE_SEL; + else f->flag &= ~ME_FACE_SEL; + if(efa->h) f->flag |= ME_HIDE; f->mat_nr= efa->mat_nr; } else { f->v[0]= m->v1; @@ -574,12 +576,12 @@ void multires_make(void *ob, void *me_v) /* Load vertices and vdata (MDeformVerts) */ lvl->totvert= em ? BLI_countlist(&em->verts) : me->totvert; - lvl->verts= MEM_callocN(sizeof(MVert)*lvl->totvert,"multires verts"); + me->mr->verts= MEM_callocN(sizeof(MVert)*lvl->totvert,"multires verts"); multires_update_customdata(me->mr->levels.first, em ? &em->vdata : &me->vdata, &me->mr->vdata, CD_MDEFORMVERT); if(em) eve= em->verts.first; for(i=0; i<lvl->totvert; ++i) { - multires_get_vert(&lvl->verts[i], eve, &me->mvert[i], i); + multires_get_vert(&me->mr->verts[i], eve, &me->mvert[i], i); if(em) eve= eve->next; } @@ -635,7 +637,6 @@ MultiresLevel *multires_level_copy(MultiresLevel *orig) MultiresLevel *lvl= MEM_dupallocN(orig); lvl->next= lvl->prev= NULL; - lvl->verts= MEM_dupallocN(orig->verts); lvl->faces= MEM_dupallocN(orig->faces); lvl->colfaces= MEM_dupallocN(orig->colfaces); lvl->edges= MEM_dupallocN(orig->edges); @@ -657,6 +658,8 @@ Multires *multires_copy(Multires *orig) for(lvl= orig->levels.first; lvl; lvl= lvl->next) BLI_addtail(&mr->levels, multires_level_copy(lvl)); + + mr->verts= MEM_dupallocN(orig->verts); lvl= mr->levels.first; if(lvl) { @@ -689,6 +692,8 @@ void multires_free(Multires *mr) lvl= lvl->next; } + MEM_freeN(mr->verts); + BLI_freelistN(&mr->levels); MEM_freeN(mr); @@ -699,7 +704,6 @@ void multires_free(Multires *mr) void multires_free_level(MultiresLevel *lvl) { if(lvl) { - if(lvl->verts) MEM_freeN(lvl->verts); if(lvl->faces) MEM_freeN(lvl->faces); if(lvl->edges) MEM_freeN(lvl->edges); if(lvl->colfaces) MEM_freeN(lvl->colfaces); @@ -843,6 +847,7 @@ void multires_add_level(void *ob, void *me_v) Mesh *me= me_v; MultiresLevel *lvl= MEM_callocN(sizeof(MultiresLevel), "multireslevel"); MultiApplyData data; + MVert *oldverts= NULL; multires_check_state(); @@ -858,15 +863,16 @@ void multires_add_level(void *ob, void *me_v) /* Create vertices =============== */ lvl->totvert= lvl->prev->totvert + lvl->prev->totedge + lvl->prev->totface; - lvl->verts= MEM_callocN(sizeof(MVert)*lvl->totvert,"multires verts"); - /* Copy previous level's verts */ + oldverts= me->mr->verts; + me->mr->verts= MEM_callocN(sizeof(MVert)*lvl->totvert, "multitres verts"); + /* Copy old verts */ for(i=0; i<lvl->prev->totvert; ++i) - lvl->verts[i]= lvl->prev->verts[i]; + me->mr->verts[i]= oldverts[i]; /* Create new edge verts */ for(i=0; i<lvl->prev->totedge; ++i) { - VecMidf(lvl->verts[lvl->prev->totvert + i].co, - lvl->prev->verts[lvl->prev->edges[i].v[0]].co, - lvl->prev->verts[lvl->prev->edges[i].v[1]].co); + VecMidf(me->mr->verts[lvl->prev->totvert + i].co, + oldverts[lvl->prev->edges[i].v[0]].co, + oldverts[lvl->prev->edges[i].v[1]].co); lvl->prev->edges[i].mid= lvl->prev->totvert + i; } /* Create new face verts */ @@ -936,38 +942,42 @@ void multires_add_level(void *ob, void *me_v) =============== */ for(i=0; i<lvl->prev->totface; ++i) { const MultiresFace *f= &lvl->prev->faces[i]; - data.corner1= lvl->prev->verts[f->v[0]].co; - data.corner2= lvl->prev->verts[f->v[1]].co; - data.corner3= lvl->prev->verts[f->v[2]].co; - data.corner4= lvl->prev->verts[f->v[3]].co; + data.corner1= oldverts[f->v[0]].co; + data.corner2= oldverts[f->v[1]].co; + data.corner3= oldverts[f->v[2]].co; + data.corner4= oldverts[f->v[3]].co; data.quad= f->v[3] ? 1 : 0; - multi_apply(lvl->verts[f->mid].co, &data, 3, catmullclark_smooth_face); + multi_apply(me->mr->verts[f->mid].co, &data, 3, catmullclark_smooth_face); } if(G.scene->toolsettings->multires_subdiv_type == 0) { for(i=0; i<lvl->prev->totedge; ++i) { const MultiresEdge *e= &lvl->prev->edges[i]; data.boundary= multires_edge_is_boundary(lvl->prev,i); - edge_face_neighbor_midpoints_accum(&data,lvl->prev,lvl->verts,sizeof(MVert),e); - data.endpoint1= lvl->prev->verts[e->v[0]].co; - data.endpoint2= lvl->prev->verts[e->v[1]].co; - multi_apply(lvl->verts[e->mid].co, &data, 3, catmullclark_smooth_edge); + edge_face_neighbor_midpoints_accum(&data,lvl->prev, me->mr->verts, sizeof(MVert),e); + data.endpoint1= oldverts[e->v[0]].co; + data.endpoint2= oldverts[e->v[1]].co; + multi_apply(me->mr->verts[e->mid].co, &data, 3, catmullclark_smooth_edge); } for(i=0; i<lvl->prev->totvert; ++i) { data.boundary= multires_vert_is_boundary(lvl->prev,i); - data.original= lvl->verts[i].co; + data.original= oldverts[i].co; data.edge_count= BLI_countlist(&lvl->prev->vert_edge_map[i]); if(data.boundary) - boundary_edges_average(&data,lvl->prev,lvl->prev->verts,sizeof(MVert),i); + boundary_edges_average(&data,lvl->prev, oldverts, sizeof(MVert),i); else { - vert_face_neighbor_midpoints_average(&data,lvl->prev,lvl->verts,sizeof(MVert),i); - vert_edge_neighbor_midpoints_average(&data,lvl->prev,lvl->prev->verts,sizeof(MVert),i); + vert_face_neighbor_midpoints_average(&data,lvl->prev, me->mr->verts, + sizeof(MVert),i); + vert_edge_neighbor_midpoints_average(&data,lvl->prev, oldverts, + sizeof(MVert),i); } - multi_apply(lvl->verts[i].co, &data, 3, catmullclark_smooth_vert); + multi_apply(me->mr->verts[i].co, &data, 3, catmullclark_smooth_vert); } } + MEM_freeN(oldverts); + /* Vertex Colors ============= */ curf= 0; @@ -1093,13 +1103,13 @@ void multires_level_to_mesh(Object *ob, Mesh *me, const int render) for(i=0; i<lvl->totvert; ++i) { if(em) { - eves[i]= addvertlist(lvl->verts[i].co, NULL); /* TODO */ - if(lvl->verts[i].flag & 1) eves[i]->f |= SELECT; - if(lvl->verts[i].flag & ME_HIDE) eves[i]->h= 1; + eves[i]= addvertlist(me->mr->verts[i].co, NULL); + if(me->mr->verts[i].flag & 1) eves[i]->f |= SELECT; + if(me->mr->verts[i].flag & ME_HIDE) eves[i]->h= 1; eves[i]->data= NULL; } else - me->mvert[i]= lvl->verts[i]; + me->mvert[i]= me->mr->verts[i]; } for(i=0; i<lvl->totedge; ++i) { if(em) { @@ -1114,9 +1124,12 @@ void multires_level_to_mesh(Object *ob, Mesh *me, const int render) if(em) { EditVert *eve4= lvl->faces[i].v[3] ? eves[lvl->faces[i].v[3]] : NULL; EditFace *efa= addfacelist(eves[lvl->faces[i].v[0]], eves[lvl->faces[i].v[1]], - eves[lvl->faces[i].v[2]], eve4, NULL, NULL); /* TODO */ - efa->flag= lvl->faces[i].flag; + eves[lvl->faces[i].v[2]], eve4, NULL, NULL); + efa->flag= lvl->faces[i].flag & ~ME_HIDE; efa->mat_nr= lvl->faces[i].mat_nr; + if(lvl->faces[i].flag & ME_FACE_SEL) + efa->f |= SELECT; + if(lvl->faces[i].flag & ME_HIDE) efa->h= 1; efa->data= NULL; } else { @@ -1159,6 +1172,14 @@ void multires_level_to_mesh(Object *ob, Mesh *me, const int render) } } } + + if(em) { + eed= em->edges.first; + for(i=0, eed= em->edges.first; i<lvl->totedge; ++i, eed= eed->next) { + eed->h= me->mr->verts[lvl->edges[i].v[0]].flag & ME_HIDE || + me->mr->verts[lvl->edges[i].v[1]].flag & ME_HIDE; + } + } EM_select_flush(); @@ -1205,6 +1226,7 @@ void multires_level_to_mesh(Object *ob, Mesh *me, const int render) /* friendly check for background render */ if(G.background==0) { + object_handle_update(ob); countall(); if(G.vd && G.vd->depths) G.vd->depths->damaged= 1; @@ -1311,108 +1333,65 @@ void multires_update_colors(Mesh *me) } } -void multires_update_edge_flags(Multires *mr, Mesh *me, EditMesh *em) -{ - MultiresLevel *lvl= current_level(mr); - EditEdge *eed= NULL; - int i; - - if(em) eed= em->edges.first; - for(i=0; i<lvl->totedge; ++i) { - if(em) { - mr->edge_flags[i]= 0; - eed_to_medge_flag(eed, &mr->edge_flags[i], &mr->edge_creases[i]); - eed= eed->next; - } - else { - mr->edge_flags[i]= me->medge[i].flag; - mr->edge_creases[i]= me->medge[i].crease; - } - } -} - -void multires_update_levels(Mesh *me, const int render) +/* Update vertex locations and vertex flags */ +void multires_update_vertices(Mesh *me, EditMesh *em) { - /* cr=current, pr=previous, or=original */ - MultiresLevel *cr_lvl= current_level(me->mr), *pr_lvl; - MultiresLevel *or_lvl= cr_lvl; - vec3f *pr_deltas= NULL, *cr_deltas= NULL; - char *pr_flag_damaged= NULL, *cr_flag_damaged= NULL, *pr_mat_damaged= NULL, *cr_mat_damaged= NULL; - char *or_flag_damaged= NULL, *or_mat_damaged= NULL; - EditMesh *em= (!render && G.obedit) ? G.editMesh : NULL; + MultiresLevel *cr_lvl= current_level(me->mr), *pr_lvl= NULL, + *last_lvl= me->mr->levels.last; + vec3f *pr_deltas= NULL, *cr_deltas= NULL, *swap_deltas= NULL; EditVert *eve= NULL; - EditFace *efa= NULL; MultiApplyData data; - unsigned i,j,curf; - - /* Update special first-level data */ - if(cr_lvl==me->mr->levels.first) { - multires_update_customdata(me->mr->levels.first, em ? &em->vdata : &me->vdata, - &me->mr->vdata, CD_MDEFORMVERT); - multires_update_customdata(me->mr->levels.first, em ? &em->fdata : &me->fdata, - &me->mr->fdata, CD_MTFACE); - multires_update_edge_flags(me->mr, me, em); - } + int i, j; /* Prepare deltas */ - cr_deltas= MEM_callocN(sizeof(vec3f)*cr_lvl->totvert,"initial deltas"); + pr_deltas= MEM_callocN(sizeof(vec3f)*last_lvl->totvert, "multires deltas 1"); + cr_deltas= MEM_callocN(sizeof(vec3f)*last_lvl->totvert, "multires deltas 2"); /* Calculate initial deltas -- current mesh subtracted from current level*/ if(em) eve= em->verts.first; for(i=0; i<cr_lvl->totvert; ++i) { if(em) { - VecSubf(&cr_deltas[i].x, eve->co, cr_lvl->verts[i].co); + VecSubf(&cr_deltas[i].x, eve->co, me->mr->verts[i].co); eve= eve->next; } else - VecSubf(&cr_deltas[i].x, me->mvert[i].co, cr_lvl->verts[i].co); - } - - /* Faces -- find whether flag/mat has changed */ - cr_flag_damaged= MEM_callocN(sizeof(char)*cr_lvl->totface, "flag_damaged 1"); - cr_mat_damaged= MEM_callocN(sizeof(char)*cr_lvl->totface, "mat_damaged 1"); - if(em) efa= em->faces.first; - for(i=0; i<cr_lvl->totface; ++i) { - if(cr_lvl->faces[i].flag != (em ? efa->flag : me->mface[i].flag)) - cr_flag_damaged[i]= 1; - if(cr_lvl->faces[i].mat_nr != (em ? efa->mat_nr : me->mface[i].mat_nr)) - cr_mat_damaged[i]= 1; - if(em) efa= efa->next; + VecSubf(&cr_deltas[i].x, me->mvert[i].co, me->mr->verts[i].co); } - or_flag_damaged= MEM_dupallocN(cr_flag_damaged); - or_mat_damaged= MEM_dupallocN(cr_mat_damaged); - /* Update current level -- copy current mesh into current level */ - if(em) { - eve= em->verts.first; - efa= em->faces.first; - } - for(i=0; i<cr_lvl->totvert; ++i) { - multires_get_vert(&cr_lvl->verts[i], eve, &me->mvert[i], i); - if(em) eve= eve->next; + + /* Copy current level's vertex flags and clear the rest */ + if(em) eve= em->verts.first; + for(i=0; i < last_lvl->totvert; ++i) { + if(i < cr_lvl->totvert) { + MVert mvflag; + multires_get_vert(&mvflag, eve, &me->mvert[i], i); + if(em) eve= eve->next; + me->mr->verts[i].flag= mvflag.flag; + } + else + me->mr->verts[i].flag= 0; } - for(i=0; i<cr_lvl->totface; ++i) { - cr_lvl->faces[i].flag= em ? efa->flag : me->mface[i].flag; - cr_lvl->faces[i].mat_nr= em ? efa->mat_nr : me->mface[i].mat_nr; - if(em) efa= efa->next; + + /* If already on the highest level, copy current verts (including flags) into current level */ + if(cr_lvl == last_lvl) { + if(em) + eve= em->verts.first; + for(i=0; i<cr_lvl->totvert; ++i) { + multires_get_vert(&me->mr->verts[i], eve, &me->mvert[i], i); + if(em) eve= eve->next; + } } /* Update higher levels */ pr_lvl= BLI_findlink(&me->mr->levels,me->mr->current-1); cr_lvl= pr_lvl->next; while(cr_lvl) { - /* Set up new deltas, but keep the ones from the previous level */ - if(pr_deltas) MEM_freeN(pr_deltas); + /* Swap the old/new deltas */ + swap_deltas= pr_deltas; pr_deltas= cr_deltas; - cr_deltas= MEM_callocN(sizeof(vec3f)*cr_lvl->totvert,"deltas"); - if(pr_flag_damaged) MEM_freeN(pr_flag_damaged); - pr_flag_damaged= cr_flag_damaged; - cr_flag_damaged= MEM_callocN(sizeof(char)*cr_lvl->totface,"flag_damaged 2"); - if(pr_mat_damaged) MEM_freeN(pr_mat_damaged); - pr_mat_damaged= cr_mat_damaged; - cr_mat_damaged= MEM_callocN(sizeof(char)*cr_lvl->totface,"mat_damaged 2"); + cr_deltas= swap_deltas; /* Calculate and add new deltas - ============================*/ + ============================ */ for(i=0; i<pr_lvl->totface; ++i) { const MultiresFace *f= &pr_lvl->faces[i]; data.corner1= &pr_deltas[f->v[0]].x; @@ -1421,18 +1400,9 @@ void multires_update_levels(Mesh *me, const int render) data.corner4= &pr_deltas[f->v[3]].x; data.quad= f->v[3] ? 1 : 0; multi_apply(&cr_deltas[f->mid].x, &data, 3, catmullclark_smooth_face); - - VecAddf(cr_lvl->verts[f->mid].co, - cr_lvl->verts[f->mid].co, - &cr_deltas[f->mid].x); - cr_lvl->verts[f->mid].flag= 0; - for(j=0; j<(data.quad?4:3); ++j) { - if(pr_lvl->verts[f->v[j]].flag & 1) - cr_lvl->verts[f->mid].flag |= 1; - if(pr_lvl->verts[f->v[j]].flag & ME_HIDE) - cr_lvl->verts[f->mid].flag |= ME_HIDE; - } + for(j=0; j<(data.quad?4:3); ++j) + me->mr->verts[f->mid].flag |= me->mr->verts[f->v[j]].flag; } for(i=0; i<pr_lvl->totedge; ++i) { @@ -1442,20 +1412,9 @@ void multires_update_levels(Mesh *me, const int render) data.endpoint1= &pr_deltas[e->v[0]].x; data.endpoint2= &pr_deltas[e->v[1]].x; multi_apply(&cr_deltas[e->mid].x, &data, 3, catmullclark_smooth_edge); - - cr_lvl->verts[e->mid].flag= 0; - for(j=0; j<2; ++j) { - if(pr_lvl->verts[e->v[j]].flag & 1) - cr_lvl->verts[e->mid].flag |= 1; - if(pr_lvl->verts[e->v[j]].flag & ME_HIDE) - cr_lvl->verts[e->mid].flag |= ME_HIDE; - } - } - for(i=0; i<pr_lvl->totedge; ++i) { - const unsigned ndx= pr_lvl->edges[i].mid; - VecAddf(cr_lvl->verts[ndx].co, - cr_lvl->verts[ndx].co, - &cr_deltas[ndx].x); + + for(j=0; j<2; ++j) + me->mr->verts[e->mid].flag |= me->mr->verts[e->v[j]].flag; } for(i=0; i<pr_lvl->totvert; ++i) { @@ -1469,31 +1428,13 @@ void multires_update_levels(Mesh *me, const int render) vert_edge_neighbor_midpoints_average(&data,pr_lvl,pr_deltas,sizeof(vec3f),i); } multi_apply(&cr_deltas[i].x, &data, 3, catmullclark_smooth_vert); - cr_lvl->verts[i].flag= 0; - if(pr_lvl->verts[i].flag & 1) cr_lvl->verts[i].flag |= 1; - if(pr_lvl->verts[i].flag & ME_HIDE) cr_lvl->verts[i].flag |= ME_HIDE; - } - for(i=0; i<pr_lvl->totvert; ++i) { - VecAddf(cr_lvl->verts[i].co, - cr_lvl->verts[i].co, - &cr_deltas[i].x); } - /* Update faces */ - curf= 0; - for(i=0; i<pr_lvl->totface; ++i) { - const int sides= cr_lvl->prev->faces[i].v[3] ? 4 : 3; - for(j=0; j<sides; ++j) { - if(pr_flag_damaged[i]) { - cr_lvl->faces[curf].flag= pr_lvl->faces[i].flag; - cr_flag_damaged[curf]= 1; - } - if(pr_mat_damaged[i]) { - cr_lvl->faces[curf].mat_nr= pr_lvl->faces[i].mat_nr; - cr_mat_damaged[curf]= 1; - } - ++curf; - } + /* Apply deltas to vertex locations */ + for(i=0; (cr_lvl == last_lvl) && (i < cr_lvl->totvert); ++i) { + VecAddf(me->mr->verts[i].co, + me->mr->verts[i].co, + &cr_deltas[i].x); } pr_lvl= pr_lvl->next; @@ -1502,34 +1443,51 @@ void multires_update_levels(Mesh *me, const int render) if(pr_deltas) MEM_freeN(pr_deltas); if(cr_deltas) MEM_freeN(cr_deltas); +} + +void multires_update_faces(Mesh *me, EditMesh *em) +{ + MultiresLevel *cr_lvl= current_level(me->mr), *pr_lvl= NULL, + *last_lvl= me->mr->levels.last; + char *pr_flag_damaged= NULL, *cr_flag_damaged= NULL, *or_flag_damaged= NULL, + *pr_mat_damaged= NULL, *cr_mat_damaged= NULL, *or_mat_damaged= NULL, *swap= NULL; + EditFace *efa= NULL; + unsigned i,j,curf; + + /* Find for each face whether flag/mat has changed */ + pr_flag_damaged= MEM_callocN(sizeof(char) * last_lvl->totface, "flag_damaged 1"); + cr_flag_damaged= MEM_callocN(sizeof(char) * last_lvl->totface, "flag_damaged 1"); + pr_mat_damaged= MEM_callocN(sizeof(char) * last_lvl->totface, "mat_damaged 1"); + cr_mat_damaged= MEM_callocN(sizeof(char) * last_lvl->totface, "mat_damaged 1"); + if(em) efa= em->faces.first; + for(i=0; i<cr_lvl->totface; ++i) { + MultiresFace mftmp; + multires_get_face(&mftmp, efa, &me->mface[i]); + if(cr_lvl->faces[i].flag != mftmp.flag) + cr_flag_damaged[i]= 1; + if(cr_lvl->faces[i].mat_nr != mftmp.mat_nr) + cr_mat_damaged[i]= 1; + + /* Update current level */ + cr_lvl->faces[i].flag= mftmp.flag; + cr_lvl->faces[i].mat_nr= mftmp.mat_nr; + + if(em) efa= efa->next; + } + or_flag_damaged= MEM_dupallocN(cr_flag_damaged); + or_mat_damaged= MEM_dupallocN(cr_mat_damaged); + /* Update lower levels */ - cr_lvl= me->mr->levels.last; cr_lvl= cr_lvl->prev; - /* Update Verts */ - while(cr_lvl) { - for(i=0; i<cr_lvl->totvert; ++i) - cr_lvl->verts[i]= cr_lvl->next->verts[i]; - cr_lvl= cr_lvl->prev; - } - - /* Update Faces */ - - /* Clear to original damages */ - if(cr_flag_damaged) MEM_freeN(cr_flag_damaged); - if(cr_mat_damaged) MEM_freeN(cr_mat_damaged); - cr_flag_damaged= or_flag_damaged; - cr_mat_damaged= or_mat_damaged; - - cr_lvl= or_lvl->prev; while(cr_lvl) { - if(pr_flag_damaged) MEM_freeN(pr_flag_damaged); + swap= pr_flag_damaged; pr_flag_damaged= cr_flag_damaged; - cr_flag_damaged= MEM_callocN(sizeof(char)*cr_lvl->totface,"flag_damaged 3"); - if(pr_mat_damaged) MEM_freeN(pr_mat_damaged); + cr_flag_damaged= swap; + + swap= pr_mat_damaged; pr_mat_damaged= cr_mat_damaged; - cr_mat_damaged= MEM_callocN(sizeof(char)*cr_lvl->totface,"mat_damaged 3"); + cr_mat_damaged= swap; - /* Update faces */ curf= 0; for(i=0; i<cr_lvl->totface; ++i) { const int sides= cr_lvl->faces[i].v[3] ? 4 : 3; @@ -1549,14 +1507,58 @@ void multires_update_levels(Mesh *me, const int render) cr_lvl= cr_lvl->prev; } + + /* Clear to original damages */ + if(cr_flag_damaged) MEM_freeN(cr_flag_damaged); + if(cr_mat_damaged) MEM_freeN(cr_mat_damaged); + cr_flag_damaged= or_flag_damaged; + cr_mat_damaged= or_mat_damaged; + + /* Update higher levels */ + pr_lvl= current_level(me->mr); + cr_lvl= pr_lvl->next; + while(cr_lvl) { + swap= pr_flag_damaged; + pr_flag_damaged= cr_flag_damaged; + cr_flag_damaged= swap; + + swap= pr_mat_damaged; + pr_mat_damaged= cr_mat_damaged; + cr_mat_damaged= swap; + + /* Update faces */ + for(i=0, curf= 0; i<pr_lvl->totface; ++i) { + const int sides= cr_lvl->prev->faces[i].v[3] ? 4 : 3; + for(j=0; j<sides; ++j, ++curf) { + if(pr_flag_damaged[i]) { + cr_lvl->faces[curf].flag= pr_lvl->faces[i].flag; + cr_flag_damaged[curf]= 1; + } + if(pr_mat_damaged[i]) { + cr_lvl->faces[curf].mat_nr= pr_lvl->faces[i].mat_nr; + cr_mat_damaged[curf]= 1; + } + } + } + + pr_lvl= pr_lvl->next; + cr_lvl= cr_lvl->next; + } if(pr_flag_damaged) MEM_freeN(pr_flag_damaged); if(cr_flag_damaged) MEM_freeN(cr_flag_damaged); if(pr_mat_damaged) MEM_freeN(pr_mat_damaged); if(cr_mat_damaged) MEM_freeN(cr_mat_damaged); +} - multires_update_colors(me); +void multires_update_levels(Mesh *me, const int render) +{ + EditMesh *em= (!render && G.obedit) ? G.editMesh : NULL; + multires_update_first_level(me, em); + multires_update_vertices(me, em); + multires_update_faces(me, em); + multires_update_colors(me); } void multires_calc_level_maps(MultiresLevel *lvl) diff --git a/source/blender/src/space.c b/source/blender/src/space.c index c5a485b67cf..bcb3a2784d6 100644 --- a/source/blender/src/space.c +++ b/source/blender/src/space.c @@ -97,6 +97,7 @@ #include "BIF_drawscript.h" #include "BIF_editarmature.h" #include "BIF_editconstraint.h" +#include "BIF_editdeform.h" #include "BIF_editfont.h" #include "BIF_editgroup.h" #include "BIF_editkey.h" @@ -1839,8 +1840,20 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt) break; case GKEY: - if(G.qual == LR_CTRLKEY) - group_operation_with_menu(); + if((G.qual == LR_CTRLKEY)) { + if(G.obedit) { + if(ELEM(G.obedit->type, OB_MESH, OB_LATTICE)) + vgroup_assign_with_menu(); + } + else + group_operation_with_menu(); + } + else if((G.qual == (LR_CTRLKEY|LR_SHIFTKEY))) { + if(G.obedit) { + if(ELEM(G.obedit->type, OB_MESH, OB_LATTICE)) + vgroup_operation_with_menu(); + } + } else if((G.qual==LR_SHIFTKEY)) if(G.obedit) { if(G.obedit->type==OB_MESH) diff --git a/source/blender/src/transform_manipulator.c b/source/blender/src/transform_manipulator.c index 765c74461f2..773ae3d17ec 100644 --- a/source/blender/src/transform_manipulator.c +++ b/source/blender/src/transform_manipulator.c @@ -697,11 +697,13 @@ static void draw_manipulator_axes(int colcode, int flagx, int flagy, int flagz) /* only called while G.moving */ static void draw_manipulator_rotate_ghost(float mat[][4], int drawflags) { - GLUquadricObj *qobj= gluNewQuadric(); + GLUquadricObj *qobj; float size, phi, startphi, vec[3], svec[3], matt[4][4], cross[3], tmat[3][3]; int arcs= (G.rt!=2); glDisable(GL_DEPTH_TEST); + + qobj= gluNewQuadric(); gluQuadricDrawStyle(qobj, GLU_FILL); glColor4ub(0,0,0,64); @@ -832,7 +834,7 @@ static void draw_manipulator_rotate_ghost(float mat[][4], int drawflags) static void draw_manipulator_rotate(float mat[][4], int moving, int drawflags, int combo) { - GLUquadricObj *qobj= gluNewQuadric(); + GLUquadricObj *qobj; double plane[4]; float size, vec[3], unitmat[4][4]; float cywid= 0.33f*0.01f*(float)U.tw_handlesize; @@ -849,6 +851,8 @@ static void draw_manipulator_rotate(float mat[][4], int moving, int drawflags, i /* Init stuff */ glDisable(GL_DEPTH_TEST); Mat4One(unitmat); + + qobj= gluNewQuadric(); gluQuadricDrawStyle(qobj, GLU_FILL); /* prepare for screen aligned draw */ @@ -1153,7 +1157,7 @@ static void draw_cylinder(GLUquadricObj *qobj, float len, float width) static void draw_manipulator_translate(float mat[][4], int moving, int drawflags, int combo, int colcode) { - GLUquadricObj *qobj = gluNewQuadric(); + GLUquadricObj *qobj; float cylen= 0.01f*(float)U.tw_handlesize; float cywid= 0.25f*cylen, dz, size; float unitmat[4][4]; @@ -1163,6 +1167,8 @@ static void draw_manipulator_translate(float mat[][4], int moving, int drawflags if(moving) glTranslatef(Trans.vec[0], Trans.vec[1], Trans.vec[2]); glDisable(GL_DEPTH_TEST); + + qobj= gluNewQuadric(); gluQuadricDrawStyle(qobj, GLU_FILL); /* center circle, do not add to selection when shift is pressed (planar constraint) */ @@ -1225,19 +1231,21 @@ static void draw_manipulator_translate(float mat[][4], int moving, int drawflags static void draw_manipulator_rotate_cyl(float mat[][4], int moving, int drawflags, int combo, int colcode) { - GLUquadricObj *qobj = gluNewQuadric(); + GLUquadricObj *qobj; float size; float cylen= 0.01f*(float)U.tw_handlesize; float cywid= 0.25f*cylen; /* when called while moving in mixed mode, do not draw when... */ if((drawflags & MAN_ROT_C)==0) return; - + /* prepare for screen aligned draw */ glPushMatrix(); size= screen_aligned(mat); glDisable(GL_DEPTH_TEST); + + qobj= gluNewQuadric(); /* Screen aligned view rot circle */ if(drawflags & MAN_ROT_V) { diff --git a/source/gameengine/Converter/BL_ArmatureObject.cpp b/source/gameengine/Converter/BL_ArmatureObject.cpp index 91c527f1980..4bf13a09fb4 100644 --- a/source/gameengine/Converter/BL_ArmatureObject.cpp +++ b/source/gameengine/Converter/BL_ArmatureObject.cpp @@ -190,8 +190,9 @@ double BL_ArmatureObject::GetLastFrame() bool BL_ArmatureObject::GetBoneMatrix(Bone* bone, MT_Matrix4x4& matrix) const { - // ton hack - bPoseChannel *pchan= get_pose_channel(m_pose, bone->name); + Object* par_arma = m_objArma; + where_is_pose(par_arma); + bPoseChannel *pchan= get_pose_channel(par_arma->pose, bone->name); if(pchan) { matrix.setValue(&pchan->pose_mat[0][0]); diff --git a/source/gameengine/Ketsji/BL_Shader.cpp b/source/gameengine/Ketsji/BL_Shader.cpp index 4e32d2cced9..ab0479eb88b 100644 --- a/source/gameengine/Ketsji/BL_Shader.cpp +++ b/source/gameengine/Ketsji/BL_Shader.cpp @@ -1,4 +1,5 @@ -// ------------------------------------ + + #ifdef WIN32 #include <windows.h> #endif // WIN32 |