Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Letwory <nathan@letworyinteractive.com>2011-07-27 11:42:53 +0400
committerNathan Letwory <nathan@letworyinteractive.com>2011-07-27 11:42:53 +0400
commit73a9ce7ec04bd1170b292c8f2c83a8c5c10a95ad (patch)
treecfc0637d68339e9b4cd45de49aa30d585748717b /source/blender
parentf54068719f8f1965ffd3584f9f8ad53b3c7f9602 (diff)
svn merge -r38558:38752 https://svn.blender.org/svnroot/bf-blender/trunk/blender .
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/BKE_blender.h2
-rw-r--r--source/blender/blenkernel/BKE_effect.h1
-rw-r--r--source/blender/blenkernel/CMakeLists.txt4
-rw-r--r--source/blender/blenkernel/SConscript1
-rw-r--r--source/blender/blenkernel/intern/effect.c23
-rw-r--r--source/blender/blenkernel/intern/seqeffects.c2
-rw-r--r--source/blender/blenkernel/intern/text.c10
-rw-r--r--source/blender/blenkernel/intern/writeavi.c7
-rw-r--r--source/blender/blenkernel/intern/writeframeserver.c2
-rw-r--r--source/blender/editors/armature/editarmature.c2
-rw-r--r--source/blender/editors/include/ED_node.h3
-rw-r--r--source/blender/editors/interface/interface_handlers.c11
-rw-r--r--source/blender/editors/interface/interface_layout.c12
-rw-r--r--source/blender/editors/interface/interface_panel.c4
-rw-r--r--source/blender/editors/interface/interface_regions.c11
-rw-r--r--source/blender/editors/interface/interface_templates.c20
-rw-r--r--source/blender/editors/object/object_add.c4
-rw-r--r--source/blender/editors/object/object_edit.c12
-rw-r--r--source/blender/editors/render/render_shading.c2
-rw-r--r--source/blender/editors/space_image/image_ops.c6
-rw-r--r--source/blender/editors/space_node/drawnode.c15
-rw-r--r--source/blender/editors/space_node/node_draw.c13
-rw-r--r--source/blender/editors/space_node/node_edit.c150
-rw-r--r--source/blender/editors/space_sequencer/sequencer_add.c6
-rw-r--r--source/blender/editors/space_text/text_ops.c21
-rw-r--r--source/blender/editors/space_view3d/view3d_edit.c1
-rw-r--r--source/blender/editors/space_view3d/view3d_header.c11
-rw-r--r--source/blender/editors/transform/transform.c2
-rw-r--r--source/blender/editors/transform/transform.h2
-rw-r--r--source/blender/editors/transform/transform_conversions.c14
-rw-r--r--source/blender/editors/transform/transform_generics.c2
-rw-r--r--source/blender/editors/transform/transform_ops.c2
-rw-r--r--source/blender/editors/transform/transform_snap.c13
-rw-r--r--source/blender/editors/util/undo.c8
-rw-r--r--source/blender/editors/uvedit/uvedit_ops.c131
-rw-r--r--source/blender/gpu/intern/gpu_material.c2
-rw-r--r--source/blender/imbuf/IMB_imbuf.h2
-rw-r--r--source/blender/imbuf/intern/filter.c219
-rw-r--r--source/blender/makesdna/DNA_node_types.h4
-rw-r--r--source/blender/makesdna/DNA_scene_types.h5
-rw-r--r--source/blender/makesrna/intern/CMakeLists.txt4
-rw-r--r--source/blender/makesrna/intern/SConscript2
-rw-r--r--source/blender/makesrna/intern/rna_access.c6
-rw-r--r--source/blender/makesrna/intern/rna_object_api.c2
-rw-r--r--source/blender/makesrna/intern/rna_scene.c10
-rw-r--r--source/blender/makesrna/intern/rna_wm.c2
-rw-r--r--source/blender/python/mathutils/mathutils.h2
-rw-r--r--source/blender/python/mathutils/mathutils_Matrix.c14
-rw-r--r--source/blender/python/mathutils/mathutils_Quaternion.c26
-rw-r--r--source/blender/python/mathutils/mathutils_Vector.c80
-rw-r--r--source/blender/render/intern/source/convertblender.c12
-rw-r--r--source/blender/render/intern/source/rendercore.c22
-rw-r--r--source/blender/windowmanager/WM_api.h1
-rw-r--r--source/blender/windowmanager/intern/wm.c6
54 files changed, 713 insertions, 238 deletions
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h
index 25fb6f9f9ff..18f6ad21333 100644
--- a/source/blender/blenkernel/BKE_blender.h
+++ b/source/blender/blenkernel/BKE_blender.h
@@ -53,7 +53,7 @@ extern "C" {
/* can be left blank, otherwise a,b,c... etc with no quotes */
#define BLENDER_VERSION_CHAR a
/* alpha/beta/rc/release, docs use this */
-#define BLENDER_VERSION_CYCLE release
+#define BLENDER_VERSION_CYCLE beta
struct ListBase;
struct MemFile;
diff --git a/source/blender/blenkernel/BKE_effect.h b/source/blender/blenkernel/BKE_effect.h
index 97ac711651b..12f9383cefb 100644
--- a/source/blender/blenkernel/BKE_effect.h
+++ b/source/blender/blenkernel/BKE_effect.h
@@ -105,6 +105,7 @@ typedef struct EffectorCache {
/* precalculated for guides */
struct GuideEffectorData *guide_data;
float guide_loc[4], guide_dir[3], guide_radius;
+ float velocity[3];
float frame;
int flag;
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index 9a384c40e24..defcef58463 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -279,6 +279,10 @@ if(WITH_IMAGE_CINEON)
add_definitions(-DWITH_CINEON)
endif()
+if(WITH_IMAGE_FRAMESERVER)
+ add_definitions(-DWITH_FRAMESERVER)
+endif()
+
if(WITH_IMAGE_HDR)
add_definitions(-DWITH_HDR)
endif()
diff --git a/source/blender/blenkernel/SConscript b/source/blender/blenkernel/SConscript
index 36afce7946c..5ea42ee65ae 100644
--- a/source/blender/blenkernel/SConscript
+++ b/source/blender/blenkernel/SConscript
@@ -22,6 +22,7 @@ incs += ' ' + env['BF_ZLIB_INC']
defs = [ 'GLEW_STATIC' ]
defs.append('WITH_SMOKE') # TODO, make optional
+defs.append('WITH_FRAMESERVER') # TODO, make optional
if env['WITH_BF_PYTHON']:
incs += ' ../python'
diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c
index ee46bef6038..4b95c44f55f 100644
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@ -241,6 +241,16 @@ static void precalculate_effector(EffectorCache *eff)
}
else if(eff->psys)
psys_update_particle_tree(eff->psys, eff->scene->r.cfra);
+
+ /* Store object velocity */
+ if(eff->ob) {
+ float old_vel[3];
+
+ where_is_object_time(eff->scene, eff->ob, cfra - 1.0f);
+ copy_v3_v3(old_vel, eff->ob->obmat[3]);
+ where_is_object_time(eff->scene, eff->ob, cfra);
+ sub_v3_v3v3(eff->velocity, eff->ob->obmat[3], old_vel);
+ }
}
static EffectorCache *new_effector_cache(Scene *scene, Object *ob, ParticleSystem *psys, PartDeflect *pd)
{
@@ -680,10 +690,6 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
Object *ob = eff->ob;
Object obcopy = *ob;
- /* XXX this is not thread-safe, but used from multiple threads by
- particle system */
- where_is_object_time(eff->scene, ob, cfra);
-
/* use z-axis as normal*/
normalize_v3_v3(efd->nor, ob->obmat[2]);
@@ -702,13 +708,8 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
VECCOPY(efd->loc, ob->obmat[3]);
}
- if(real_velocity) {
- VECCOPY(efd->vel, ob->obmat[3]);
-
- where_is_object_time(eff->scene, ob, cfra - 1.0f);
-
- sub_v3_v3v3(efd->vel, efd->vel, ob->obmat[3]);
- }
+ if(real_velocity)
+ copy_v3_v3(efd->vel, eff->velocity);
*eff->ob = obcopy;
diff --git a/source/blender/blenkernel/intern/seqeffects.c b/source/blender/blenkernel/intern/seqeffects.c
index fbb5a77fa04..8c19b0c15c3 100644
--- a/source/blender/blenkernel/intern/seqeffects.c
+++ b/source/blender/blenkernel/intern/seqeffects.c
@@ -2373,7 +2373,7 @@ static void RVBlurBitmap2_float ( float* map, int width,int height,
/* Blancmange (bmange@airdmhor.gen.nz) */
k = -1.0f/(2.0f*(float)M_PI*blur*blur);
- fval=0;
+
for (ix = 0;ix< halfWidth;ix++){
weight = (float)exp(k*(ix*ix));
filter[halfWidth - ix] = weight;
diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c
index da329503c9f..2c507370288 100644
--- a/source/blender/blenkernel/intern/text.c
+++ b/source/blender/blenkernel/intern/text.c
@@ -400,7 +400,13 @@ Text *add_text(const char *file, const char *relpath)
llen++;
}
- if (llen!=0 || ta->nlines==0) {
+ /* create new line in cases:
+ - rest of line (if last line in file hasn't got \n terminator).
+ in this case content of such line would be used to fill text line buffer
+ - file is empty. in this case new line is needed to start editing from.
+ - last characted in buffer is \n. in this case new line is needed to
+ deal with newline at end of file. (see [#28087]) (sergey) */
+ if (llen!=0 || ta->nlines==0 || buffer[len-1]=='\n') {
tmp= (TextLine*) MEM_mallocN(sizeof(TextLine), "textline");
tmp->line= (char*) MEM_mallocN(llen+1, "textline_string");
tmp->format= NULL;
@@ -1417,6 +1423,8 @@ void txt_insert_buf(Text *text, const char *in_buffer)
}
undoing= u;
+
+ (void)count;
}
/******************/
diff --git a/source/blender/blenkernel/intern/writeavi.c b/source/blender/blenkernel/intern/writeavi.c
index ba7f9bdd415..769a3f9b11e 100644
--- a/source/blender/blenkernel/intern/writeavi.c
+++ b/source/blender/blenkernel/intern/writeavi.c
@@ -105,13 +105,18 @@ bMovieHandle *BKE_get_movie_handle(int imtype)
mh.get_movie_path = filepath_ffmpeg;
}
#endif
+#ifdef WITH_FRAMESERVER
if (imtype == R_FRAMESERVER) {
mh.start_movie = start_frameserver;
mh.append_movie = append_frameserver;
mh.end_movie = end_frameserver;
mh.get_next_frame = frameserver_loop;
}
-
+#endif
+
+ /* incase all above are disabled */
+ (void)imtype;
+
return &mh;
}
diff --git a/source/blender/blenkernel/intern/writeframeserver.c b/source/blender/blenkernel/intern/writeframeserver.c
index 2239f6d3147..d13d15d1269 100644
--- a/source/blender/blenkernel/intern/writeframeserver.c
+++ b/source/blender/blenkernel/intern/writeframeserver.c
@@ -22,6 +22,7 @@
*
*/
+#ifdef WITH_FRAMESERVER
#include <string.h>
#include <stdio.h>
@@ -381,3 +382,4 @@ void end_frameserver(void)
shutdown_socket_system();
}
+#endif /* WITH_FRAMESERVER */
diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c
index 20352206121..628cdbf21e9 100644
--- a/source/blender/editors/armature/editarmature.c
+++ b/source/blender/editors/armature/editarmature.c
@@ -1478,10 +1478,8 @@ static int armature_select_linked_invoke(bContext *C, wmOperator *op, wmEvent *e
bArmature *arm;
EditBone *bone, *curBone, *next;
int extend= RNA_boolean_get(op->ptr, "extend");
- ARegion *ar;
Object *obedit= CTX_data_edit_object(C);
arm= obedit->data;
- ar= CTX_wm_region(C);
view3d_operator_needs_opengl(C);
diff --git a/source/blender/editors/include/ED_node.h b/source/blender/editors/include/ED_node.h
index 829ad3217a9..dfa457c22de 100644
--- a/source/blender/editors/include/ED_node.h
+++ b/source/blender/editors/include/ED_node.h
@@ -39,6 +39,7 @@ struct Tex;
struct bContext;
struct bNode;
struct ID;
+struct ScrArea;
/* drawnode.c */
void ED_init_node_butfuncs(void);
@@ -51,6 +52,8 @@ void ED_node_generic_update(struct Main *bmain, struct bNodeTree *ntree, struct
void ED_node_shader_default(struct Material *ma);
void ED_node_composit_default(struct Scene *sce);
void ED_node_texture_default(struct Tex *tex);
+void ED_node_link_intersect_test(struct ScrArea *sa, int test);
+void ED_node_link_insert(struct ScrArea *sa);
/* node ops.c */
void ED_operatormacros_node(void);
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index e9ec4ccc66d..c5275ea98b5 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -1879,7 +1879,6 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle
if(but->autocomplete_func || data->searchbox) {
changed= ui_textedit_autocomplete(C, but, data);
update= 1; /* do live update for tab key */
- retval= WM_UI_HANDLER_BREAK;
}
/* the hotkey here is not well defined, was G.qual so we check all */
else if(event->shift || event->ctrl || event->alt || event->oskey) {
@@ -2325,8 +2324,8 @@ static float ui_numedit_apply_snapf(uiBut *but, float tempf, float softmin, floa
if(fac != 1.0f) {
/* snap in unit-space */
tempf /= fac;
- softmin /= fac;
- softmax /= fac;
+ /* softmin /= fac; */ /* UNUSED */
+ /* softmax /= fac; */ /* UNUSED */
softrange /= fac;
}
@@ -3469,13 +3468,13 @@ static int ui_numedit_but_CURVE(uiBut *but, uiHandleButtonData *data, int snap,
CurveMapping *cumap= (CurveMapping*)but->poin;
CurveMap *cuma= cumap->cm+cumap->cur;
CurveMapPoint *cmp= cuma->curve;
- float fx, fy, zoomx, zoomy, offsx, offsy;
+ float fx, fy, zoomx, zoomy /*, offsx, offsy */ /* UNUSED */;
int a, changed= 0;
zoomx= (but->x2-but->x1)/(cumap->curr.xmax-cumap->curr.xmin);
zoomy= (but->y2-but->y1)/(cumap->curr.ymax-cumap->curr.ymin);
- offsx= cumap->curr.xmin;
- offsy= cumap->curr.ymin;
+ /* offsx= cumap->curr.xmin; */
+ /* offsy= cumap->curr.ymin; */
if(snap) {
float d[2];
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index 79a90fb9d1d..2f0bcc9d5b4 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -149,10 +149,10 @@ typedef struct uiLayoutItemBx {
uiBut *roundbox;
} uiLayoutItemBx;
-typedef struct uiLayoutItemSplt {
+typedef struct uiLayoutItemSplit {
uiLayout litem;
float percentage;
-} uiLayoutItemSplt;
+} uiLayoutItemSplit;
typedef struct uiLayoutItemRoot {
uiLayout litem;
@@ -1615,7 +1615,7 @@ static void ui_litem_layout_row(uiLayout *litem)
int x, y, w, tot, totw, neww, itemw, minw, itemh, offset;
int fixedw, freew, fixedx, freex, flag= 0, lastw= 0;
- x= litem->x;
+ /* x= litem->x; */ /* UNUSED */
y= litem->y;
w= litem->w;
totw= 0;
@@ -2020,7 +2020,7 @@ static void ui_litem_estimate_split(uiLayout *litem)
static void ui_litem_layout_split(uiLayout *litem)
{
- uiLayoutItemSplt *split= (uiLayoutItemSplt*)litem;
+ uiLayoutItemSplit *split= (uiLayoutItemSplit*)litem;
uiItem *item;
float percentage;
const int tot= BLI_countlist(&litem->items);
@@ -2242,9 +2242,9 @@ uiLayout *uiLayoutOverlap(uiLayout *layout)
uiLayout *uiLayoutSplit(uiLayout *layout, float percentage, int align)
{
- uiLayoutItemSplt *split;
+ uiLayoutItemSplit *split;
- split= MEM_callocN(sizeof(uiLayoutItemSplt), "uiLayoutItemSplt");
+ split= MEM_callocN(sizeof(uiLayoutItemSplit), "uiLayoutItemSplit");
split->litem.item.type= ITEM_LAYOUT_SPLIT;
split->litem.root= layout->root;
split->litem.align= align;
diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c
index 9ed3cabb4cb..3b20533dcd4 100644
--- a/source/blender/editors/interface/interface_panel.c
+++ b/source/blender/editors/interface/interface_panel.c
@@ -575,8 +575,8 @@ void ui_draw_aligned_panel(uiStyle *style, uiBlock *block, rcti *rect)
ui_draw_tria_rect(&itemrect, 'h');
else
ui_draw_tria_rect(&itemrect, 'v');
-
-
+
+ (void)ofsx;
}
/************************** panel alignment *************************/
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index 62043f240e4..9e7717260e6 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -484,6 +484,17 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
}
}
}
+ else if (ELEM(but->type, MENU, PULLDOWN)) {
+ if ((U.flag & USER_TOOLTIPS_PYTHON) == 0) {
+ if(but->menu_create_func && WM_menutype_contains((MenuType *)but->poin)) {
+ MenuType *mt= (MenuType *)but->poin;
+ BLI_snprintf(data->lines[data->totline], sizeof(data->lines[0]), "Python: %s", mt->idname);
+ data->color[data->totline]= 0x888888;
+ data->totline++;
+ }
+ }
+
+ }
assert(data->totline < MAX_TOOLTIP_LINES);
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index 25dbb68a258..34315494e14 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -851,7 +851,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr)
/* verify we have valid data */
if(!RNA_struct_is_a(ptr->type, &RNA_Modifier)) {
- RNA_warning("uiTemplateModifier: expected modifier on object.\n");
+ RNA_warning("uiTemplateModifier: Expected modifier on object.\n");
return NULL;
}
@@ -859,7 +859,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr)
md= ptr->data;
if(!ob || !(GS(ob->id.name) == ID_OB)) {
- RNA_warning("uiTemplateModifier: expected modifier on object.\n");
+ RNA_warning("uiTemplateModifier: Expected modifier on object.\n");
return NULL;
}
@@ -976,9 +976,6 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con)
block= uiLayoutGetBlock(box);
/* Draw constraint header */
-
- /* rounded header */
- // rb_col= (con->flag & CONSTRAINT_ACTIVE)?50:20; // UNUSED
/* open/close */
uiBlockSetEmboss(block, UI_EMBOSSN);
@@ -1083,7 +1080,7 @@ uiLayout *uiTemplateConstraint(uiLayout *layout, PointerRNA *ptr)
/* verify we have valid data */
if(!RNA_struct_is_a(ptr->type, &RNA_Constraint)) {
- RNA_warning("uiTemplateConstraint: expected constraint on object.\n");
+ RNA_warning("uiTemplateConstraint: Expected constraint on object.\n");
return NULL;
}
@@ -1091,7 +1088,7 @@ uiLayout *uiTemplateConstraint(uiLayout *layout, PointerRNA *ptr)
con= ptr->data;
if(!ob || !(GS(ob->id.name) == ID_OB)) {
- RNA_warning("uiTemplateConstraint: expected constraint on object.\n");
+ RNA_warning("uiTemplateConstraint: Expected constraint on object.\n");
return NULL;
}
@@ -1137,7 +1134,7 @@ void uiTemplatePreview(uiLayout *layout, ID *id, int show_buttons, ID *parent, M
PointerRNA texture_ptr;
if(id && !ELEM4(GS(id->name), ID_MA, ID_TE, ID_WO, ID_LA)) {
- RNA_warning("uiTemplatePreview: expected ID of type material, texture, lamp or world.\n");
+ RNA_warning("uiTemplatePreview: Expected ID of type material, texture, lamp or world.\n");
return;
}
@@ -2171,14 +2168,14 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *
if(prop) {
type= RNA_property_type(prop);
if(type != PROP_COLLECTION) {
- RNA_warning("uiTemplateList: expected collection property.\n");
+ RNA_warning("uiTemplateList: Expected collection property.\n");
return;
}
}
activetype= RNA_property_type(activeprop);
if(activetype != PROP_INT) {
- RNA_warning("uiTemplateList: expected integer property.\n");
+ RNA_warning("uiTemplateList: Expected integer property.\n");
return;
}
@@ -2200,7 +2197,7 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *
/* create list items */
RNA_PROP_BEGIN(ptr, itemptr, prop) {
/* create button */
- if(i == 9)
+ if(!(i % 9))
row= uiLayoutRow(col, 0);
icon= list_item_icon_get(C, &itemptr, rnaicon, 1);
@@ -2215,7 +2212,6 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *
}
else if(listtype == 'c') {
/* compact layout */
- found= 0;
row= uiLayoutRow(layout, 1);
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c
index 7ca172c6945..f5f97c6a5f6 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -806,14 +806,14 @@ static int object_delete_exec(bContext *C, wmOperator *UNUSED(op))
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
- int islamp= 0;
+ /* int islamp= 0; */ /* UNUSED */
if(CTX_data_edit_object(C))
return OPERATOR_CANCELLED;
CTX_DATA_BEGIN(C, Base*, base, selected_bases) {
- if(base->object->type==OB_LAMP) islamp= 1;
+ /* if(base->object->type==OB_LAMP) islamp= 1; */
/* deselect object -- it could be used in other scenes */
base->object->flag &= ~SELECT;
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c
index 29a740affc5..395705dc029 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -2162,16 +2162,20 @@ static int game_property_copy_exec(bContext *C, wmOperator *op)
} CTX_DATA_END;
}
}
- else if (ELEM(type, COPY_PROPERTIES_REPLACE, COPY_PROPERTIES_MERGE)) {
+
+ else {
CTX_DATA_BEGIN(C, Object*, ob_iter, selected_editable_objects) {
if (ob != ob_iter) {
if (ob->data != ob_iter->data){
- if (type == 2) {/* merge */
+ if (type == COPY_PROPERTIES_REPLACE)
+ copy_properties( &ob_iter->prop, &ob->prop );
+
+ /* merge - the default when calling with no argument */
+ else {
for(prop = ob->prop.first; prop; prop= prop->next ) {
set_ob_property(ob_iter, prop);
}
- } else /* replace */
- copy_properties( &ob_iter->prop, &ob->prop );
+ }
}
}
}
diff --git a/source/blender/editors/render/render_shading.c b/source/blender/editors/render/render_shading.c
index fdd53d27b02..cfed2750e18 100644
--- a/source/blender/editors/render/render_shading.c
+++ b/source/blender/editors/render/render_shading.c
@@ -108,7 +108,7 @@ void OBJECT_OT_material_slot_add(wmOperatorType *ot)
/* identifiers */
ot->name= "Add Material Slot";
ot->idname= "OBJECT_OT_material_slot_add";
- ot->description="Add a new material slot or duplicate the selected one";
+ ot->description="Add a new material slot";
/* api callbacks */
ot->exec= material_slot_add_exec;
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index 77fb129e278..204d5dfb1b1 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -554,7 +554,7 @@ static int view_selected_exec(bContext *C, wmOperator *UNUSED(op))
Scene *scene;
Object *obedit;
Image *ima;
- float size, min[2], max[2], d[2];
+ float size, min[2], max[2], d[2], aspx, aspy;
int width, height;
/* retrieve state */
@@ -565,6 +565,10 @@ static int view_selected_exec(bContext *C, wmOperator *UNUSED(op))
ima= ED_space_image(sima);
ED_space_image_size(sima, &width, &height);
+ ED_image_aspect(ima, &aspx, &aspy);
+
+ width= width*aspx;
+ height= height*aspy;
/* get bounds */
if(!ED_uvedit_minmax(scene, ima, obedit, min, max))
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index 1bf2c3d89bd..50e657bbb61 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -1869,10 +1869,17 @@ void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link)
else {
/* check cyclic */
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;
+ /* special indicated link, on drop-node */
+ if(link->flag & NODE_LINKFLAG_HILITE) {
+ th_col1= th_col2= TH_ACTIVE;
+ }
+ else {
+ /* regular link */
+ if(link->fromnode->flag & SELECT)
+ th_col1= TH_EDGE_SELECT;
+ if(link->tonode->flag & SELECT)
+ th_col2= TH_EDGE_SELECT;
+ }
do_shaded= 1;
do_triple= 1;
}
diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c
index cd1fa5c16a7..950b3c72fe7 100644
--- a/source/blender/editors/space_node/node_draw.c
+++ b/source/blender/editors/space_node/node_draw.c
@@ -781,14 +781,15 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
iconbutw, UI_UNIT_Y, NULL, 0.0, 0.0, 1.0, 0.5, "");
}
{ /* always hide/reveal unused sockets */
- int shade;
-
- iconofs-=iconbutw;
// XXX re-enable
- /*if(node_has_hidden_sockets(node))
+ /* int shade;
+ if(node_has_hidden_sockets(node))
shade= -40;
- else*/
- shade= -90;
+ else
+ shade= -90; */
+
+ iconofs-=iconbutw;
+
uiDefIconBut(node->block, LABEL, B_REDR, ICON_PLUS, iconofs, rct->ymax-NODE_DY,
iconbutw, UI_UNIT_Y, NULL, 0.0, 0.0, 1.0, 0.5, "");
}
diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c
index abc7b273ec9..4230a43d2ec 100644
--- a/source/blender/editors/space_node/node_edit.c
+++ b/source/blender/editors/space_node/node_edit.c
@@ -2492,6 +2492,151 @@ void NODE_OT_links_cut(wmOperatorType *ot)
RNA_def_int(ot->srna, "cursor", BC_KNIFECURSOR, 0, INT_MAX, "Cursor", "", 0, INT_MAX);
}
+/* ********************* automatic node insert on dragging ******************* */
+
+/* assumes sockets in list */
+static bNodeSocket *socket_best_match(ListBase *sockets, int type)
+{
+ bNodeSocket *sock;
+
+ /* first, match type */
+ for(sock= sockets->first; sock; sock= sock->next)
+ if(!(sock->flag & SOCK_HIDDEN))
+ if(type == sock->type)
+ return sock;
+
+ /* then just use first unhidden socket */
+ for(sock= sockets->first; sock; sock= sock->next)
+ if(!(sock->flag & SOCK_HIDDEN))
+ return sock;
+
+ /* OK, let's unhide proper one */
+ for(sock= sockets->first; sock; sock= sock->next) {
+ if(type == sock->type) {
+ sock->flag &= ~SOCK_HIDDEN;
+ return sock;
+ }
+ }
+
+ /* just the first */
+ sock= sockets->first;
+ sock->flag &= ~SOCK_HIDDEN;
+
+ return sockets->first;
+}
+
+/* prevent duplicate testing code below */
+static SpaceNode *ed_node_link_conditions(ScrArea *sa, bNode **select)
+{
+ SpaceNode *snode= sa?sa->spacedata.first:NULL;
+ bNode *node;
+ bNodeLink *link;
+
+ /* no unlucky accidents */
+ if(sa==NULL || sa->spacetype!=SPACE_NODE) return NULL;
+
+ *select= NULL;
+
+ for(node= snode->edittree->nodes.first; node; node= node->next) {
+ if(node->flag & SELECT) {
+ if(*select)
+ break;
+ else
+ *select= node;
+ }
+ }
+ /* only one selected */
+ if(node || *select==NULL) return NULL;
+
+ /* correct node */
+ if((*select)->inputs.first==NULL || (*select)->outputs.first==NULL) return NULL;
+
+ /* test node for links */
+ for(link= snode->edittree->links.first; link; link=link->next) {
+ if(link->tonode == *select || link->fromnode == *select)
+ return NULL;
+ }
+
+ return snode;
+}
+
+/* assumes link with NODE_LINKFLAG_HILITE set */
+void ED_node_link_insert(ScrArea *sa)
+{
+ bNode *node, *select;
+ SpaceNode *snode= ed_node_link_conditions(sa, &select);
+ bNodeLink *link;
+ bNodeSocket *sockto;
+
+ if(snode==NULL) return;
+
+ /* get the link */
+ for(link= snode->edittree->links.first; link; link=link->next)
+ if(link->flag & NODE_LINKFLAG_HILITE)
+ break;
+
+ if(link) {
+ node= link->tonode;
+ sockto= link->tosock;
+
+ link->tonode= select;
+ link->tosock= socket_best_match(&select->inputs, link->fromsock->type);
+ link->flag &= ~NODE_LINKFLAG_HILITE;
+
+ nodeAddLink(snode->edittree, select, socket_best_match(&select->outputs, sockto->type), node, sockto);
+ ntreeSolveOrder(snode->edittree); /* needed for pointers */
+ snode_tag_changed(snode, select);
+ ED_node_changed_update(snode->id, select);
+ }
+}
+
+
+/* test == 0, clear all intersect flags */
+void ED_node_link_intersect_test(ScrArea *sa, int test)
+{
+ bNode *select;
+ SpaceNode *snode= ed_node_link_conditions(sa, &select);
+ bNodeLink *link, *selink=NULL;
+ float mcoords[6][2];
+
+ if(snode==NULL) return;
+
+ /* clear flags */
+ for(link= snode->edittree->links.first; link; link=link->next)
+ link->flag &= ~NODE_LINKFLAG_HILITE;
+
+ if(test==0) return;
+
+ /* okay, there's 1 node, without links, now intersect */
+ mcoords[0][0]= select->totr.xmin;
+ mcoords[0][1]= select->totr.ymin;
+ mcoords[1][0]= select->totr.xmax;
+ mcoords[1][1]= select->totr.ymin;
+ mcoords[2][0]= select->totr.xmax;
+ mcoords[2][1]= select->totr.ymax;
+ mcoords[3][0]= select->totr.xmin;
+ mcoords[3][1]= select->totr.ymax;
+ mcoords[4][0]= select->totr.xmin;
+ mcoords[4][1]= select->totr.ymin;
+ mcoords[5][0]= select->totr.xmax;
+ mcoords[5][1]= select->totr.ymax;
+
+ /* we only tag a single link for intersect now */
+ /* idea; use header dist when more? */
+ for(link= snode->edittree->links.first; link; link=link->next) {
+
+ if(cut_links_intersect(link, mcoords, 5)) { /* intersect code wants edges */
+ if(selink)
+ break;
+ selink= link;
+ }
+ }
+
+ if(link==NULL && selink)
+ selink->flag |= NODE_LINKFLAG_HILITE;
+}
+
+
/* ******************************** */
// XXX some code needing updating to operators...
@@ -2914,7 +3059,8 @@ void NODE_OT_delete(wmOperatorType *ot)
/* note: in cmp_util.c is similar code, for node_compo_pass_on() */
/* used for disabling node (similar code in node_draw.c for disable line) */
-static void node_delete_reconnect(bNodeTree* tree, bNode* node) {
+static void node_delete_reconnect(bNodeTree* tree, bNode* node)
+{
bNodeLink *link, *next;
bNodeSocket *valsocket= NULL, *colsocket= NULL, *vecsocket= NULL;
bNodeSocket *deliveringvalsocket= NULL, *deliveringcolsocket= NULL, *deliveringvecsocket= NULL;
@@ -3142,3 +3288,5 @@ void NODE_OT_add_file(wmOperatorType *ot)
RNA_def_string(ot->srna, "name", "Image", 24, "Name", "Datablock name to assign.");
}
+
+
diff --git a/source/blender/editors/space_sequencer/sequencer_add.c b/source/blender/editors/space_sequencer/sequencer_add.c
index f6e3dc3dd0a..36e334990cb 100644
--- a/source/blender/editors/space_sequencer/sequencer_add.c
+++ b/source/blender/editors/space_sequencer/sequencer_add.c
@@ -303,7 +303,7 @@ static int sequencer_add_generic_strip_exec(bContext *C, wmOperator *op, SeqLoad
Scene *scene= CTX_data_scene(C); /* only for sound */
Editing *ed= seq_give_editing(scene, TRUE);
SeqLoadInfo seq_load;
- Sequence *seq;
+ /* Sequence *seq; */ /* UNUSED */
int tot_files;
seq_load_operator_info(&seq_load, op);
@@ -324,13 +324,13 @@ static int sequencer_add_generic_strip_exec(bContext *C, wmOperator *op, SeqLoad
RNA_string_get(&itemptr, "name", file_only);
BLI_join_dirfile(seq_load.path, sizeof(seq_load.path), dir_only, file_only);
- seq= seq_load_func(C, ed->seqbasep, &seq_load);
+ /* seq= */ seq_load_func(C, ed->seqbasep, &seq_load);
}
RNA_END;
}
else {
/* single file */
- seq= seq_load_func(C, ed->seqbasep, &seq_load);
+ /* seq= */ seq_load_func(C, ed->seqbasep, &seq_load);
}
if (seq_load.tot_success==0) {
diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c
index 2bd6bd624df..13eb24ed1f2 100644
--- a/source/blender/editors/space_text/text_ops.c
+++ b/source/blender/editors/space_text/text_ops.c
@@ -36,6 +36,7 @@
#include <string.h>
#include <ctype.h> /* ispunct */
#include <sys/stat.h>
+#include <errno.h>
#include "MEM_guardedalloc.h"
@@ -449,15 +450,14 @@ static void txt_write_file(Text *text, ReportList *reports)
FILE *fp;
TextLine *tmp;
struct stat st;
- int res;
- char file[FILE_MAXDIR+FILE_MAXFILE];
+ char filepath[FILE_MAXDIR+FILE_MAXFILE];
- BLI_strncpy(file, text->name, FILE_MAXDIR+FILE_MAXFILE);
- BLI_path_abs(file, G.main->name);
+ BLI_strncpy(filepath, text->name, FILE_MAXDIR+FILE_MAXFILE);
+ BLI_path_abs(filepath, G.main->name);
- fp= fopen(file, "w");
+ fp= fopen(filepath, "w");
if(fp==NULL) {
- BKE_report(reports, RPT_ERROR, "Unable to save file.");
+ BKE_reportf(reports, RPT_ERROR, "Unable to save \"%s\": %s.", filepath, errno ? strerror(errno) : "Unknown error writing file");
return;
}
@@ -471,8 +471,13 @@ static void txt_write_file(Text *text, ReportList *reports)
fclose (fp);
- res= stat(file, &st);
- text->mtime= st.st_mtime;
+ if(stat(filepath, &st) == 0) {
+ text->mtime= st.st_mtime;
+ }
+ else {
+ text->mtime= 0;
+ BKE_reportf(reports, RPT_WARNING, "Unable to stat \"%s\": %s.", filepath, errno ? strerror(errno) : "Unknown error starrng file");
+ }
if(text->flags & TXT_ISDIRTY)
text->flags ^= TXT_ISDIRTY;
diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c
index b343718d39b..94224698063 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -129,7 +129,6 @@ void ED_view3d_camera_lock_sync(View3D *v3d, RegionView3D *rv3d)
}
else {
ED_view3d_to_object(v3d->camera, rv3d->ofs, rv3d->viewquat, rv3d->dist);
- root_parent= v3d->camera;
DAG_id_tag_update(&v3d->camera->id, OB_RECALC_OB);
WM_main_add_notifier(NC_OBJECT|ND_TRANSFORM, v3d->camera);
}
diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c
index 75c8d5cae73..ae80a554e08 100644
--- a/source/blender/editors/space_view3d/view3d_header.c
+++ b/source/blender/editors/space_view3d/view3d_header.c
@@ -505,17 +505,6 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
uiItemR(row, &v3dptr, "pivot_point", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
uiItemR(row, &v3dptr, "use_pivot_point_align", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
- /* NDOF */
- /* Not implemented yet
- if (G.ndofdevice ==0 ) {
- uiDefIconTextButC(block, ICONTEXTROW,B_NDOF, ICON_NDOF_TURN, ndof_pup(), 0,0,UI_UNIT_X+10,UI_UNIT_Y, &(v3d->ndofmode), 0, 3.0, 0, 0, "Ndof mode");
-
- uiDefIconButC(block, TOG, B_NDOF, ICON_NDOF_DOM,
- 0,0,UI_UNIT_X,UI_UNIT_Y,
- &v3d->ndoffilter, 0, 1, 0, 0, "dominant axis");
- }
- */
-
/* Transform widget / manipulators */
row= uiLayoutRow(layout, 1);
uiItemR(row, &v3dptr, "show_manipulator", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index 81aade5ca64..7f8d5976e86 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -969,7 +969,7 @@ int transformEvent(TransInfo *t, wmEvent *event)
break;
case OKEY:
if (t->flag & T_PROP_EDIT && event->shift) {
- t->prop_mode = (t->prop_mode + 1) % 6;
+ t->prop_mode = (t->prop_mode + 1) % PROP_MODE_MAX;
calculatePropRatio(t);
t->redraw |= TREDRAW_HARD;
}
diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h
index d8e750acb88..d8e42488787 100644
--- a/source/blender/editors/transform/transform.h
+++ b/source/blender/editors/transform/transform.h
@@ -96,7 +96,7 @@ typedef struct TransSnap {
short modeSelect;
short align;
char project;
- char project_self;
+ char snap_self;
short peel;
short status;
float snapPoint[3]; /* snapping from this point */
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index 16bfc75c979..0a5e290643a 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -87,6 +87,7 @@
#include "ED_object.h"
#include "ED_markers.h"
#include "ED_mesh.h"
+#include "ED_node.h"
#include "ED_types.h"
#include "ED_uvedit.h"
#include "ED_curve.h" /* for ED_curve_editnurbs */
@@ -2182,6 +2183,12 @@ void flushTransNodes(TransInfo *t)
td->loc2d[0]= td->loc[0];
td->loc2d[1]= td->loc[1];
}
+
+ /* handle intersection with noodles */
+ if(t->total==1) {
+ ED_node_link_intersect_test(t->sa, 1);
+ }
+
}
/* *** SEQUENCE EDITOR *** */
@@ -4756,7 +4763,12 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
}
else if (t->spacetype == SPACE_NODE) {
- /* pass */
+ if(cancelled == 0)
+ ED_node_link_insert(t->sa);
+
+ /* clear link line */
+ ED_node_link_intersect_test(t->sa, 0);
+
}
else if (t->spacetype == SPACE_ACTION) {
SpaceAction *saction= (SpaceAction *)t->sa->spacedata.first;
diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c
index 20a26d8c58d..6d0a978700f 100644
--- a/source/blender/editors/transform/transform_generics.c
+++ b/source/blender/editors/transform/transform_generics.c
@@ -1070,7 +1070,7 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event)
}
}
// Need stuff to take it from edit mesh or whatnot here
- else
+ else if (t->spacetype == SPACE_VIEW3D)
{
if (t->obedit && t->obedit->type == OB_MESH && (((Mesh *)t->obedit->data)->editflag & ME_EDIT_MIRROR_X))
{
diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c
index 0b0b22fb689..a779982099e 100644
--- a/source/blender/editors/transform/transform_ops.c
+++ b/source/blender/editors/transform/transform_ops.c
@@ -960,6 +960,8 @@ void transform_keymap_for_space(wmKeyConfig *keyconf, wmKeyMap *keymap, int spac
WM_keymap_add_item(keymap, OP_RESIZE, SKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, OP_SHEAR, SKEY, KM_PRESS, KM_ALT|KM_CTRL|KM_SHIFT, 0);
+
WM_keymap_add_item(keymap, "TRANSFORM_OT_mirror", MKEY, KM_PRESS, KM_CTRL, 0);
km = WM_keymap_add_item(keymap, "WM_OT_context_toggle", TABKEY, KM_PRESS, KM_SHIFT, 0);
diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c
index d9d9b0f9102..933d90ebbf2 100644
--- a/source/blender/editors/transform/transform_snap.c
+++ b/source/blender/editors/transform/transform_snap.c
@@ -392,7 +392,7 @@ static void initSnappingMode(TransInfo *t)
}
else
{
- t->tsnap.modeSelect = t->tsnap.project_self ? SNAP_ALL : SNAP_NOT_OBEDIT;
+ t->tsnap.modeSelect = t->tsnap.snap_self ? SNAP_ALL : SNAP_NOT_OBEDIT;
}
}
/* Particles edit mode*/
@@ -458,9 +458,9 @@ void initSnapping(TransInfo *t, wmOperator *op)
t->tsnap.project = RNA_boolean_get(op->ptr, "use_snap_project");
}
- if (RNA_struct_find_property(op->ptr, "use_snap_project_self"))
+ if (RNA_struct_find_property(op->ptr, "use_snap_self"))
{
- t->tsnap.project = RNA_boolean_get(op->ptr, "use_snap_project_self");
+ t->tsnap.snap_self = RNA_boolean_get(op->ptr, "use_snap_self");
}
}
}
@@ -473,7 +473,7 @@ void initSnapping(TransInfo *t, wmOperator *op)
t->tsnap.align = ((t->settings->snap_flag & SCE_SNAP_ROTATE) == SCE_SNAP_ROTATE);
t->tsnap.project = ((t->settings->snap_flag & SCE_SNAP_PROJECT) == SCE_SNAP_PROJECT);
- t->tsnap.project_self = !((t->settings->snap_flag & SCE_SNAP_PROJECT_NO_SELF) == SCE_SNAP_PROJECT_NO_SELF);
+ t->tsnap.snap_self = !((t->settings->snap_flag & SCE_SNAP_NO_SELF) == SCE_SNAP_NO_SELF);
t->tsnap.peel = ((t->settings->snap_flag & SCE_SNAP_PROJECT) == SCE_SNAP_PROJECT);
}
@@ -1944,6 +1944,11 @@ static void applyGrid(TransInfo *t, float *val, int max_index, float fac[3], Gea
int i;
float asp[3] = {1.0f, 1.0f, 1.0f}; // TODO: Remove hard coded limit here (3)
+ if(max_index > 3) {
+ printf("applyGrid: invalid index %d, clamping\n", max_index);
+ max_index= 3;
+ }
+
// Early bailing out if no need to snap
if (fac[action] == 0.0f)
return;
diff --git a/source/blender/editors/util/undo.c b/source/blender/editors/util/undo.c
index 8a6ec7f75db..a2381a208ef 100644
--- a/source/blender/editors/util/undo.c
+++ b/source/blender/editors/util/undo.c
@@ -358,19 +358,25 @@ int ED_undo_operator_repeat(bContext *C, struct wmOperator *op)
ret= 1;
}
}
+ else {
+ if (G.f & G_DEBUG) {
+ printf("redo_cb: WM_operator_repeat_check returned false %s\n", op->type->name);
+ }
+ }
/* set region back */
CTX_wm_region_set(C, ar);
}
else {
if (G.f & G_DEBUG) {
- printf("redo_cb: WM_operator_repeat_check returned false %s\n", op->type->name);
+ printf("redo_cb: ED_undo_operator_repeat called with NULL 'op'\n");
}
}
return ret;
}
+
void ED_undo_operator_repeat_cb(bContext *C, void *arg_op, void *UNUSED(arg_unused))
{
ED_undo_operator_repeat(C, (wmOperator *)arg_op);
diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c
index c09f8cff02d..70659994c55 100644
--- a/source/blender/editors/uvedit/uvedit_ops.c
+++ b/source/blender/editors/uvedit/uvedit_ops.c
@@ -1057,6 +1057,134 @@ static void weld_align_uv(bContext *C, int tool)
}
}
+ if(tool == 's' || tool == 't' || tool == 'u') {
+ /* pass 1&2 variables */
+ int i, j;
+ int starttmpl= -1, connectedtostarttmpl= -1, startcorner;
+ int endtmpl= -1, connectedtoendtmpl= -1, endcorner;
+ MTFace *startface, *endface;
+ int itmpl, jtmpl;
+ EditVert *eve;
+ int pass; /* first 2 passes find endpoints, 3rd pass moves middle points, 4th pass is fail-on-face-selected */
+ EditFace *startefa, *endefa;
+
+ /* pass 3 variables */
+ float startx, starty, firstm, firstb, midx, midy;
+ float endx, endy, secondm, secondb, midmovedx, midmovedy;
+ float IsVertical_check= -1;
+ float IsHorizontal_check= -1;
+
+ for(i= 0, eve= em->verts.first; eve; eve= eve->next, i++) /* give each point a unique name */
+ eve->tmp.l= i;
+ for(pass= 1; pass <= 3; pass++) { /* do this for each endpoint */
+ if(pass == 3){ /* calculate */
+ startx= startface->uv[startcorner][0];
+ starty= startface->uv[startcorner][1];
+ endx= endface->uv[endcorner][0];
+ endy= endface->uv[endcorner][1];
+ firstm= (endy-starty)/(endx-startx);
+ firstb= starty-(firstm*startx);
+ secondm= -1.0f/firstm;
+ if(startx == endx) IsVertical_check= startx;
+ if(starty == endy) IsHorizontal_check= starty;
+ }
+ for(efa= em->faces.first; efa; efa= efa->next) { /* for each face */
+ tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE); /* get face */
+ if(uvedit_face_visible(scene, ima, efa, tf)) { /* if you can see it */
+ if(uvedit_face_selected(scene, efa, tf)) { /* if the face is selected, get out now! */
+ pass= 4;
+ break;
+ }
+ for(i= 0; (i < 3 || (i == 3 && efa->v4)); i++) { /* for each point of the face */
+ itmpl= (*(&efa->v1 + i))->tmp.l; /* get unique name for points */
+ if(pass == 3) { /* move */
+ if(uvedit_uv_selected(scene, efa, tf, i)) {
+ if(!(itmpl == starttmpl || itmpl == endtmpl)) {
+ if(IsVertical_check != -1) tf->uv[i][0]= IsVertical_check;
+ if(IsHorizontal_check != -1) tf->uv[i][1]= IsHorizontal_check;
+ if((IsVertical_check == -1) && (IsHorizontal_check == -1)) {
+ midx= tf->uv[i][0];
+ midy= tf->uv[i][1];
+ if(tool == 's') {
+ secondb= midy-(secondm*midx);
+ midmovedx= (secondb-firstb)/(firstm-secondm);
+ midmovedy= (secondm*midmovedx)+secondb;
+ tf->uv[i][0]= midmovedx;
+ tf->uv[i][1]= midmovedy;
+ }
+ else if(tool == 't') {
+ tf->uv[i][0]= (midy-firstb)/firstm; /* midmovedx */
+ }
+ else if(tool == 'u') {
+ tf->uv[i][1]= (firstm*midx)+firstb; /* midmovedy */
+ }
+ }
+ }
+ }
+ }
+ else {
+ for(j= 0; (j < 3 || (j == 3 && efa->v4)); j++) { /* also for each point on the face */
+ jtmpl= (*(&efa->v1 + j))->tmp.l;
+ if(i != j && (!efa->v4 || ABS(i-j) != 2)) { /* if the points are connected */
+ /* quad (0,1,2,3) 0,1 0,3 1,0 1,2 2,1 2,3 3,0 3,2
+ * triangle (0,1,2) 0,1 0,2 1,0 1,2 2,0 2,1 */
+ if(uvedit_uv_selected(scene, efa, tf, i) && uvedit_uv_selected(scene, efa, tf, j)) {
+ /* if the edge is selected */
+ if(pass == 1) { /* if finding first endpoint */
+ if(starttmpl == -1) { /* if the first endpoint isn't found yet */
+ starttmpl= itmpl; /* set unique name for endpoint */
+ connectedtostarttmpl= jtmpl;
+ /* get point that endpoint is connected to */
+ startface= tf; /* get face it's on */
+ startcorner= i; /* what corner of the face? */
+ startefa= efa;
+ efa= em->faces.first;
+ tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ i= -1;
+ break;
+ }
+ if(starttmpl == itmpl && jtmpl != connectedtostarttmpl) {
+ starttmpl= -1; /* not an endpoint */
+ efa= startefa;
+ tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ i= startcorner;
+ break;
+ }
+ }
+ else if(pass == 2) { /* if finding second endpoint */
+ if(endtmpl == -1 && itmpl != starttmpl) {
+ endtmpl= itmpl;
+ connectedtoendtmpl= jtmpl;
+ endface= tf;
+ endcorner= i;
+ endefa= efa;
+ efa= em->faces.first;
+ tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ i= -1;
+ break;
+ }
+ if(endtmpl == itmpl && jtmpl != connectedtoendtmpl) {
+ endtmpl= -1;
+ efa= endefa;
+ tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ i= endcorner;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ if(pass == 2 && (starttmpl == -1 || endtmpl == -1)) {
+ /* if endpoints aren't found */
+ pass=4;
+ }
+ }
+ }
+
uvedit_live_unwrap_update(sima, scene, obedit);
DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
@@ -1074,6 +1202,9 @@ static int align_exec(bContext *C, wmOperator *op)
static void UV_OT_align(wmOperatorType *ot)
{
static EnumPropertyItem axis_items[] = {
+ {'s', "ALIGN_S", 0, "Straighten", "Align UVs along the line defined by the endpoints"},
+ {'t', "ALIGN_T", 0, "Straighten X", "Align UVs along the line defined by the endpoints along the X axis"},
+ {'u', "ALIGN_U", 0, "Straighten Y", "Align UVs along the line defined by the endpoints along the Y axis"},
{'a', "ALIGN_AUTO", 0, "Align Auto", "Automatically choose the axis on which there is most alignment already"},
{'x', "ALIGN_X", 0, "Align X", "Align UVs on X axis"},
{'y', "ALIGN_Y", 0, "Align Y", "Align UVs on Y axis"},
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c
index 3804aad6848..806c70d841f 100644
--- a/source/blender/gpu/intern/gpu_material.c
+++ b/source/blender/gpu/intern/gpu_material.c
@@ -671,7 +671,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
i = is;
GPU_link(mat, "shade_visifac", i, visifac, shi->refl, &i);
- vn = shi->vn;
+
/*if(ma->mode & MA_TANGENT_VN)
GPU_link(mat, "shade_tangent_v_spec", GPU_attribute(CD_TANGENT, ""), &vn);*/
diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h
index ff01e3a8a1e..36123592c54 100644
--- a/source/blender/imbuf/IMB_imbuf.h
+++ b/source/blender/imbuf/IMB_imbuf.h
@@ -252,7 +252,7 @@ void IMB_filter(struct ImBuf *ibuf);
void IMB_filterN(struct ImBuf *out, struct ImBuf *in);
void IMB_mask_filter_extend(char *mask, int width, int height);
void IMB_mask_clear(struct ImBuf *ibuf, char *mask, int val);
-void IMB_filter_extend(struct ImBuf *ibuf, char *mask);
+void IMB_filter_extend(struct ImBuf *ibuf, char *mask, int filter);
void IMB_makemipmap(struct ImBuf *ibuf, int use_filter);
void IMB_remakemipmap(struct ImBuf *ibuf, int use_filter);
struct ImBuf *IMB_getmipmap(struct ImBuf *ibuf, int level);
diff --git a/source/blender/imbuf/intern/filter.c b/source/blender/imbuf/intern/filter.c
index d12360e5a7e..1644e653df4 100644
--- a/source/blender/imbuf/intern/filter.c
+++ b/source/blender/imbuf/intern/filter.c
@@ -21,7 +21,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Morten Mikkelsen.
*
* ***** END GPL LICENSE BLOCK *****
* filter.c
@@ -326,121 +326,132 @@ void IMB_mask_clear(ImBuf *ibuf, char *mask, int val)
}
}
-#define EXTEND_PIXEL(color, w) if((color)[3]) {r+= w*(color)[0]; g+= w*(color)[1]; b+= w*(color)[2]; a+= w*(color)[3]; tot+=w;}
+static int filter_make_index(const int x, const int y, const int w, const int h)
+{
+ if(x<0 || x>=w || y<0 || y>=h) return -1; /* return bad index */
+ else return y*w+x;
+}
+
+static int check_pixel_assigned(const void *buffer, const char *mask, const int index, const int depth, const int is_float)
+{
+ int res = 0;
+
+ if(index>=0) {
+ const int alpha_index = depth*index+(depth-1);
+
+ if(mask!=NULL) {
+ res = mask[index]!=0 ? 1 : 0;
+ }
+ else if( (is_float && ((const float *) buffer)[alpha_index]!=0.0f) ||
+ (!is_float && ((const unsigned char *) buffer)[alpha_index]!=0) ) {
+ res=1;
+ }
+ }
+
+ return res;
+}
/* if alpha is zero, it checks surrounding pixels and averages color. sets new alphas to 1.0
*
* When a mask is given, only effect pixels with a mask value of 1, defined as BAKE_MASK_MARGIN in rendercore.c
* */
-void IMB_filter_extend(struct ImBuf *ibuf, char *mask)
+void IMB_filter_extend(struct ImBuf *ibuf, char *mask, int filter)
{
- register char *row1, *row2, *row3;
- register char *cp;
- int rowlen, x, y;
-
- rowlen= ibuf->x;
-
-
- if (ibuf->rect_float) {
- float *temprect;
- float *row1f, *row2f, *row3f;
- float *fp;
- temprect= MEM_dupallocN(ibuf->rect_float);
-
- for(y=1; y<=ibuf->y; y++) {
- /* setup rows */
- row1f= (float *)(temprect + (y-2)*rowlen*4);
- row2f= row1f + 4*rowlen;
- row3f= row2f + 4*rowlen;
- if(y==1)
- row1f= row2f;
- else if(y==ibuf->y)
- row3f= row2f;
-
- fp= (float *)(ibuf->rect_float + (y-1)*rowlen*4);
-
- for(x=0; x<rowlen; x++) {
- if((mask==NULL && fp[3]==0.0f) || (mask && mask[((y-1)*rowlen)+x]==1)) {
- int tot= 0;
- float r=0.0f, g=0.0f, b=0.0f, a=0.0f;
-
- EXTEND_PIXEL(row1f, 1);
- EXTEND_PIXEL(row2f, 2);
- EXTEND_PIXEL(row3f, 1);
- EXTEND_PIXEL(row1f+4, 2);
- EXTEND_PIXEL(row3f+4, 2);
- if(x!=rowlen-1) {
- EXTEND_PIXEL(row1f+8, 1);
- EXTEND_PIXEL(row2f+8, 2);
- EXTEND_PIXEL(row3f+8, 1);
- }
- if(tot) {
- fp[0]= r/tot;
- fp[1]= g/tot;
- fp[2]= b/tot;
- fp[3]= a/tot;
+ const int width= ibuf->x;
+ const int height= ibuf->y;
+ const int depth= 4; /* always 4 channels */
+ const int chsize= ibuf->rect_float ? sizeof(float) : sizeof(unsigned char);
+ const int bsize= width*height*depth*chsize;
+ const int is_float= ibuf->rect_float!=NULL;
+ void *dstbuf= (void *) MEM_dupallocN(ibuf->rect_float ? (void *) ibuf->rect_float : (void *) ibuf->rect);
+ char *dstmask= mask==NULL ? NULL : (char *) MEM_dupallocN(mask);
+ void *srcbuf= ibuf->rect_float ? (void *) ibuf->rect_float : (void *) ibuf->rect;
+ char *srcmask= mask;
+ int cannot_early_out= 1, r, n, k, i, j, c;
+ float weight[25];
+
+ /* build a weights buffer */
+ n= 2;
+ k= 0;
+ for(i = -n; i <= n; i++)
+ for(j = -n; j <= n; j++)
+ weight[k++] = sqrt((float) i * i + j * j);
+
+ /* run passes */
+ for(r = 0; cannot_early_out == 1 && r < filter; r++) {
+ int x, y;
+ cannot_early_out = 0;
+
+ for(y= 0; y<height; y++) {
+ for(x= 0; x<width; x++) {
+ const int index= filter_make_index(x, y, width, height);
+
+ /* only update unassigned pixels */
+ if(!check_pixel_assigned(srcbuf, srcmask, index, depth, is_float)) {
+ float tmp[4];
+ float wsum=0;
+ float acc[4]={0,0,0,0};
+ k = 0;
+
+ if (check_pixel_assigned(srcbuf, srcmask, filter_make_index(x-1, y, width, height), depth, is_float) ||
+ check_pixel_assigned(srcbuf, srcmask, filter_make_index(x+1, y, width, height), depth, is_float) ||
+ check_pixel_assigned(srcbuf, srcmask, filter_make_index(x, y-1, width, height), depth, is_float) ||
+ check_pixel_assigned(srcbuf, srcmask, filter_make_index(x, y+1, width, height), depth, is_float)) {
+ for(i= -n; i<=n; i++) {
+ for(j=-n; j<=n; j++) {
+ if(i != 0 || j != 0) {
+ const int tmpindex= filter_make_index(x+i, y+j, width, height);
+
+ if(check_pixel_assigned(srcbuf, srcmask, tmpindex, depth, is_float)) {
+ if(is_float) {
+ for(c=0; c<depth; c++)
+ tmp[c] = ((const float *) srcbuf)[depth*tmpindex+c];
+ }
+ else {
+ for(c=0; c<depth; c++)
+ tmp[c] = (float) ((const unsigned char *) srcbuf)[depth*tmpindex+c];
+ }
+
+ wsum+= weight[k];
+
+ for(c=0; c<depth; c++)
+ acc[c]+= weight[k] * tmp[c];
+ }
+ }
+ k++;
+ }
+ }
+
+ if(wsum!=0) {
+ for(c=0; c<depth; c++)
+ acc[c]/= wsum;
+
+ if(is_float) {
+ for(c=0; c<depth; c++)
+ ((float *) dstbuf)[depth*index+c] = acc[c];
+ }
+ else {
+ for(c=0; c<depth; c++) {
+ ((unsigned char *) dstbuf)[depth*index+c]= acc[c] > 255 ? 255 : (acc[c] < 0 ? 0 : ((unsigned char) (acc[c]+0.5f)));
+ }
+ }
+
+ if(dstmask!=NULL) dstmask[index]=FILTER_MASK_MARGIN; /* assigned */
+ cannot_early_out = 1;
+ }
}
}
- fp+=4;
-
- if(x!=0) {
- row1f+=4; row2f+=4; row3f+=4;
- }
}
}
- MEM_freeN(temprect);
- }
- else if(ibuf->rect) {
- int *temprect;
-
- /* make a copy, to prevent flooding */
- temprect= MEM_dupallocN(ibuf->rect);
-
- for(y=1; y<=ibuf->y; y++) {
- /* setup rows */
- row1= (char *)(temprect + (y-2)*rowlen);
- row2= row1 + 4*rowlen;
- row3= row2 + 4*rowlen;
- if(y==1)
- row1= row2;
- else if(y==ibuf->y)
- row3= row2;
-
- cp= (char *)(ibuf->rect + (y-1)*rowlen);
-
- for(x=0; x<rowlen; x++) {
- /*if(cp[3]==0) {*/
- if((mask==NULL && cp[3]==0) || (mask && mask[((y-1)*rowlen)+x]==1)) {
- int tot= 0, r=0, g=0, b=0, a=0;
-
- EXTEND_PIXEL(row1, 1);
- EXTEND_PIXEL(row2, 2);
- EXTEND_PIXEL(row3, 1);
- EXTEND_PIXEL(row1+4, 2);
- EXTEND_PIXEL(row3+4, 2);
- if(x!=rowlen-1) {
- EXTEND_PIXEL(row1+8, 1);
- EXTEND_PIXEL(row2+8, 2);
- EXTEND_PIXEL(row3+8, 1);
- }
- if(tot) {
- cp[0]= r/tot;
- cp[1]= g/tot;
- cp[2]= b/tot;
- cp[3]= a/tot;
- }
- }
- cp+=4;
-
- if(x!=0) {
- row1+=4; row2+=4; row3+=4;
- }
- }
- }
-
- MEM_freeN(temprect);
+ /* keep the original buffer up to date. */
+ memcpy(srcbuf, dstbuf, bsize);
+ if(dstmask!=NULL) memcpy(srcmask, dstmask, width*height);
}
+
+ /* free memory */
+ MEM_freeN(dstbuf);
+ if(dstmask!=NULL) MEM_freeN(dstmask);
}
/* threadsafe version, only recreates existing maps */
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index 03387c3a63a..efaf30b02f6 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -179,6 +179,10 @@ typedef struct bNodeLink {
} bNodeLink;
+
+/* link->flag */
+#define NODE_LINKFLAG_HILITE 1
+
/* the basis for a Node tree, all links and nodes reside internal here */
/* only re-usable node trees are in the library though, materials and textures allocate own tree struct */
typedef struct bNodeTree {
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index 3c14dacf973..2211f93a8ae 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -1074,7 +1074,7 @@ typedef struct Scene {
#define SCE_SNAP_ROTATE 2
#define SCE_SNAP_PEEL_OBJECT 4
#define SCE_SNAP_PROJECT 8
-#define SCE_SNAP_PROJECT_NO_SELF 16
+#define SCE_SNAP_NO_SELF 16
/* toolsettings->snap_target */
#define SCE_SNAP_TARGET_CLOSEST 0
#define SCE_SNAP_TARGET_CENTER 1
@@ -1107,7 +1107,8 @@ typedef struct Scene {
#define PROP_SHARP 3
#define PROP_LIN 4
#define PROP_CONST 5
-#define PROP_RANDOM 6
+#define PROP_RANDOM 6
+#define PROP_MODE_MAX 7
/* toolsettings->proportional */
#define PROP_EDIT_OFF 0
diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt
index c9865bf3df4..cb593e7deab 100644
--- a/source/blender/makesrna/intern/CMakeLists.txt
+++ b/source/blender/makesrna/intern/CMakeLists.txt
@@ -171,6 +171,10 @@ if(WITH_IMAGE_HDR)
add_definitions(-DWITH_HDR)
endif()
+if(WITH_IMAGE_FRAMESERVER)
+ add_definitions(-DWITH_FRAMESERVER)
+endif()
+
if(WITH_AUDASPACE)
add_definitions(-DWITH_AUDASPACE)
endif()
diff --git a/source/blender/makesrna/intern/SConscript b/source/blender/makesrna/intern/SConscript
index 421c3a60691..5e43ed9b2fb 100644
--- a/source/blender/makesrna/intern/SConscript
+++ b/source/blender/makesrna/intern/SConscript
@@ -54,6 +54,8 @@ if env['WITH_BF_CINEON']:
if env['WITH_BF_HDR']:
defs.append('WITH_HDR')
+defs.append('WITH_FRAMESERVER') # TODO, make optional
+
if env['WITH_BF_FFMPEG']:
defs.append('WITH_FFMPEG')
incs += ' ' + env['BF_FFMPEG_INC']
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index d9fbdd7caf2..dcf2400b9ba 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -4407,15 +4407,15 @@ ParameterList *RNA_parameter_list_create(ParameterList *parms, PointerRNA *UNUSE
if(!(parm->flag & PROP_REQUIRED) && !(parm->flag & PROP_DYNAMIC)) {
switch(parm->type) {
case PROP_BOOLEAN:
- if(parm->arraydimension) memcpy(data, &((BooleanPropertyRNA*)parm)->defaultarray, size);
+ if(parm->arraydimension) memcpy(data, ((BooleanPropertyRNA*)parm)->defaultarray, size);
else memcpy(data, &((BooleanPropertyRNA*)parm)->defaultvalue, size);
break;
case PROP_INT:
- if(parm->arraydimension) memcpy(data, &((IntPropertyRNA*)parm)->defaultarray, size);
+ if(parm->arraydimension) memcpy(data, ((IntPropertyRNA*)parm)->defaultarray, size);
else memcpy(data, &((IntPropertyRNA*)parm)->defaultvalue, size);
break;
case PROP_FLOAT:
- if(parm->arraydimension) memcpy(data, &((FloatPropertyRNA*)parm)->defaultarray, size);
+ if(parm->arraydimension) memcpy(data, ((FloatPropertyRNA*)parm)->defaultarray, size);
else memcpy(data, &((FloatPropertyRNA*)parm)->defaultvalue, size);
break;
case PROP_ENUM:
diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c
index 9018fd8c71a..21fa28af01a 100644
--- a/source/blender/makesrna/intern/rna_object_api.c
+++ b/source/blender/makesrna/intern/rna_object_api.c
@@ -544,7 +544,7 @@ void RNA_api_object(StructRNA *srna)
/* location of point for test and max distance */
parm= RNA_def_float_vector(func, "point", 3, NULL, -FLT_MAX, FLT_MAX, "", "", -1e4, 1e4);
RNA_def_property_flag(parm, PROP_REQUIRED);
- parm= RNA_def_float(func, "max_dist", sqrt(FLT_MAX), 0.0, FLT_MAX, "", "", 0.0, FLT_MAX);
+ RNA_def_float(func, "max_dist", sqrt(FLT_MAX), 0.0, FLT_MAX, "", "", 0.0, FLT_MAX);
/* return location and normal */
parm= RNA_def_float_vector(func, "location", 3, NULL, -FLT_MAX, FLT_MAX, "Location", "The location on the object closest to the point", -1e4, 1e4);
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 662ce04552e..f4028e45e96 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -135,7 +135,9 @@ EnumPropertyItem image_type_items[] = {
#endif
{R_AVIJPEG, "AVI_JPEG", ICON_FILE_MOVIE, "AVI JPEG", "Output video in AVI JPEG format"},
{R_AVIRAW, "AVI_RAW", ICON_FILE_MOVIE, "AVI Raw", "Output video in AVI Raw format"},
+#ifdef WITH_FRAMESERVER
{R_FRAMESERVER, "FRAMESERVER", ICON_FILE_SCRIPT, "Frame Server", "Output image to a frameserver"},
+#endif
#ifdef WITH_FFMPEG
{R_H264, "H264", ICON_FILE_MOVIE, "H.264", "Output video in H.264 format"},
{R_FFMPEG, "FFMPEG", ICON_FILE_MOVIE, "MPEG", "Output video in MPEG format"},
@@ -1176,9 +1178,9 @@ static void rna_def_tool_settings(BlenderRNA *brna)
RNA_def_property_ui_icon(prop, ICON_RETOPO, 0);
RNA_def_property_update(prop, NC_SCENE|ND_TOOLSETTINGS, NULL); /* header redraw */
- prop= RNA_def_property(srna, "use_snap_project_self", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_negative_sdna(prop, NULL, "snap_flag", SCE_SNAP_PROJECT_NO_SELF);
- RNA_def_property_ui_text(prop, "Project to Self", "Project into its self (editmode)");
+ prop= RNA_def_property(srna, "use_snap_self", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "snap_flag", SCE_SNAP_NO_SELF);
+ RNA_def_property_ui_text(prop, "Project to Self", "Snap onto its self (editmode)");
RNA_def_property_ui_icon(prop, ICON_ORTHO, 0);
RNA_def_property_update(prop, NC_SCENE|ND_TOOLSETTINGS, NULL); /* header redraw */
@@ -2813,7 +2815,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
prop= RNA_def_property(srna, "bake_margin", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "bake_filter");
- RNA_def_property_range(prop, 0, 32);
+ RNA_def_property_range(prop, 0, 64);
RNA_def_property_ui_text(prop, "Margin", "Amount of pixels to extend the baked result with, as post process filter");
prop= RNA_def_property(srna, "bake_distance", PROP_FLOAT, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c
index 31e1d73c8de..a046be59ab5 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -1025,7 +1025,7 @@ static StructRNA *rna_Operator_register(Main *bmain, ReportList *reports, void *
rna_Operator_unregister(bmain, ot->ext.srna);
}
- /* create a new menu type */
+ /* create a new operator type */
dummyot.ext.srna= RNA_def_struct(&BLENDER_RNA, dummyot.idname, "Operator");
RNA_def_struct_flag(dummyot.ext.srna, STRUCT_NO_IDPROPERTIES); /* operator properties are registered separately */
dummyot.ext.data= data;
diff --git a/source/blender/python/mathutils/mathutils.h b/source/blender/python/mathutils/mathutils.h
index 7454cfe78b3..b798b5e7003 100644
--- a/source/blender/python/mathutils/mathutils.h
+++ b/source/blender/python/mathutils/mathutils.h
@@ -108,4 +108,6 @@ int _BaseMathObject_WriteIndexCallback(BaseMathObject *self, int index);
int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *value, const char *error_prefix);
int mathutils_any_to_rotmat(float rmat[3][3], PyObject *value, const char *error_prefix);
+int column_vector_multiplication(float rvec[4], VectorObject *vec, MatrixObject *mat);
+
#endif /* MATHUTILS_H */
diff --git a/source/blender/python/mathutils/mathutils_Matrix.c b/source/blender/python/mathutils/mathutils_Matrix.c
index 76a0994c3aa..3953171f263 100644
--- a/source/blender/python/mathutils/mathutils_Matrix.c
+++ b/source/blender/python/mathutils/mathutils_Matrix.c
@@ -1612,8 +1612,20 @@ static PyObject *Matrix_mul(PyObject *m1, PyObject *m2)
}
}
else if(mat1) {
+ /*VEC * MATRIX */
+ if(VectorObject_Check(m2)) {
+ VectorObject *vec2= (VectorObject *)m2;
+ float tvec[4];
+ if(BaseMath_ReadCallback(vec2) == -1)
+ return NULL;
+ if(column_vector_multiplication(tvec, vec2, mat1) == -1) {
+ return NULL;
+ }
+
+ return newVectorObject(tvec, vec2->size, Py_NEW, Py_TYPE(m2));
+ }
/*FLOAT/INT * MATRIX */
- if (((scalar= PyFloat_AsDouble(m2)) == -1.0f && PyErr_Occurred())==0) {
+ else if (((scalar= PyFloat_AsDouble(m2)) == -1.0f && PyErr_Occurred())==0) {
return matrix_mul_float(mat1, scalar);
}
}
diff --git a/source/blender/python/mathutils/mathutils_Quaternion.c b/source/blender/python/mathutils/mathutils_Quaternion.c
index 3b05b9a250b..2be258a1ef0 100644
--- a/source/blender/python/mathutils/mathutils_Quaternion.c
+++ b/source/blender/python/mathutils/mathutils_Quaternion.c
@@ -753,8 +753,30 @@ static PyObject *Quaternion_mul(PyObject *q1, PyObject *q2)
return quat_mul_float(quat2, scalar);
}
}
- else if (quat1) { /* QUAT*FLOAT */
- if((((scalar= PyFloat_AsDouble(q2)) == -1.0f && PyErr_Occurred())==0)) {
+ else if (quat1) {
+ /* QUAT * VEC */
+ if (VectorObject_Check(q2)) {
+ VectorObject *vec2 = (VectorObject *)q2;
+ float tvec[3];
+
+ if(vec2->size != 3) {
+ PyErr_SetString(PyExc_ValueError,
+ "Vector multiplication: "
+ "only 3D vector rotations (with quats) "
+ "currently supported");
+ return NULL;
+ }
+ if(BaseMath_ReadCallback(vec2) == -1) {
+ return NULL;
+ }
+
+ copy_v3_v3(tvec, vec2->vec);
+ mul_qt_v3(quat1->quat, tvec);
+
+ return newVectorObject(tvec, 3, Py_NEW, Py_TYPE(vec2));
+ }
+ /* QUAT * FLOAT */
+ else if((((scalar= PyFloat_AsDouble(q2)) == -1.0f && PyErr_Occurred())==0)) {
return quat_mul_float(quat1, scalar);
}
}
diff --git a/source/blender/python/mathutils/mathutils_Vector.c b/source/blender/python/mathutils/mathutils_Vector.c
index e2c958adaa5..a954c07c98d 100644
--- a/source/blender/python/mathutils/mathutils_Vector.c
+++ b/source/blender/python/mathutils/mathutils_Vector.c
@@ -37,6 +37,8 @@
#include "BLI_math.h"
#include "BLI_utildefines.h"
+extern void PyC_LineSpit(void);
+
#define MAX_DIMENSIONS 4
/* Swizzle axes get packed into a single value that is used as a closure. Each
@@ -1081,7 +1083,7 @@ static PyObject *Vector_isub(PyObject *v1, PyObject *v2)
* note: vector/matrix multiplication IS NOT COMMUTATIVE!!!!
* note: assume read callbacks have been done first.
*/
-static int column_vector_multiplication(float rvec[MAX_DIMENSIONS], VectorObject* vec, MatrixObject * mat)
+int column_vector_multiplication(float rvec[MAX_DIMENSIONS], VectorObject* vec, MatrixObject * mat)
{
float vec_cpy[MAX_DIMENSIONS];
double dot = 0.0f;
@@ -1159,8 +1161,29 @@ static PyObject *Vector_mul(PyObject *v1, PyObject *v2)
}
else if (vec1) {
if (MatrixObject_Check(v2)) {
+ extern void PyC_LineSpit(void);
+
/* VEC * MATRIX */
+ /* this is deprecated!, use the reverse instead */
float tvec[MAX_DIMENSIONS];
+
+
+/* ------ to be removed ------*/
+#ifndef MATH_STANDALONE
+#ifdef WITH_ASSERT_ABORT
+ PyErr_SetString(PyExc_ValueError,
+ "(Vector * Matrix) is now removed, reverse the "
+ "order (promoted to an Error for Debug builds)");
+ return NULL;
+#else
+ printf("Warning: (Vector * Matrix) is now deprecated, "
+ "reverse the multiplication order in the script.\n");
+ PyC_LineSpit();
+#endif
+#endif /* ifndef MATH_STANDALONE */
+/* ------ to be removed ------*/
+
+
if(BaseMath_ReadCallback((MatrixObject *)v2) == -1)
return NULL;
if(column_vector_multiplication(tvec, vec1, (MatrixObject*)v2) == -1) {
@@ -1183,6 +1206,24 @@ static PyObject *Vector_mul(PyObject *v1, PyObject *v2)
if(BaseMath_ReadCallback(quat2) == -1) {
return NULL;
}
+
+
+/* ------ to be removed ------*/
+#ifndef MATH_STANDALONE
+#ifdef WITH_ASSERT_ABORT
+ PyErr_SetString(PyExc_ValueError,
+ "(Vector * Quat) is now removed, reverse the "
+ "order (promoted to an Error for Debug builds)");
+ return NULL;
+#else
+ printf("Warning: (Vector * Quat) is now deprecated, "
+ "reverse the multiplication order in the script.\n");
+ PyC_LineSpit();
+#endif
+#endif /* ifndef MATH_STANDALONE */
+/* ------ to be removed ------*/
+
+
copy_v3_v3(tvec, vec1->vec);
mul_qt_v3(quat2->quat, tvec);
return newVectorObject(tvec, 3, Py_NEW, Py_TYPE(vec1));
@@ -1226,6 +1267,24 @@ static PyObject *Vector_imul(PyObject *v1, PyObject *v2)
if(column_vector_multiplication(rvec, vec, (MatrixObject*)v2) == -1)
return NULL;
+
+/* ------ to be removed ------*/
+#ifndef MATH_STANDALONE
+#ifdef WITH_ASSERT_ABORT
+ PyErr_SetString(PyExc_ValueError,
+ "(Vector *= Matrix) is now removed, reverse the "
+ "order (promoted to an Error for Debug builds) "
+ "and uses the non in-place multiplication.");
+ return NULL;
+#else
+ printf("Warning: (Vector *= Matrix) is now deprecated, "
+ "reverse the (non in-place) multiplication order in the script.\n");
+ PyC_LineSpit();
+#endif
+#endif /* ifndef MATH_STANDALONE */
+/* ------ to be removed ------*/
+
+
memcpy(vec->vec, rvec, sizeof(float) * vec->size);
}
else if (QuaternionObject_Check(v2)) {
@@ -1242,6 +1301,25 @@ static PyObject *Vector_imul(PyObject *v1, PyObject *v2)
if(BaseMath_ReadCallback(quat2) == -1) {
return NULL;
}
+
+
+/* ------ to be removed ------*/
+#ifndef MATH_STANDALONE
+#ifdef WITH_ASSERT_ABORT
+ PyErr_SetString(PyExc_ValueError,
+ "(Vector *= Quat) is now removed, reverse the "
+ "order (promoted to an Error for Debug builds) "
+ "and uses the non in-place multiplication.");
+ return NULL;
+#else
+ printf("Warning: (Vector *= Quat) is now deprecated, "
+ "reverse the (non in-place) multiplication order in the script.\n");
+ PyC_LineSpit();
+#endif
+#endif /* ifndef MATH_STANDALONE */
+/* ------ to be removed ------*/
+
+
mul_qt_v3(quat2->quat, vec->vec);
}
else if (((scalar= PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred())==0) { /* VEC *= FLOAT */
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index 583b792f240..b385b507707 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -3375,7 +3375,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
/* test for 100% transparant */
ok= 1;
- if(ma->alpha==0.0f && ma->spectra==0.0f && ma->filter==0.0f && (ma->mode & MA_TRANSP)) {
+ if(ma->alpha==0.0f && ma->spectra==0.0f && ma->filter==0.0f && (ma->mode & MA_TRANSP) && (ma->mode & MA_RAYMIRROR)==0) {
ok= 0;
/* texture on transparency? */
for(a=0; a<MAX_MTEX; a++) {
@@ -5685,7 +5685,7 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay,
Object *camera;
float mat[4][4];
float amb[3];
- const short onlyselected= !ELEM3(type, RE_BAKE_LIGHT, RE_BAKE_ALL, RE_BAKE_SHADOW);
+ const short onlyselected= !ELEM4(type, RE_BAKE_LIGHT, RE_BAKE_ALL, RE_BAKE_SHADOW, RE_BAKE_AO);
const short nolamps= ELEM3(type, RE_BAKE_NORMALS, RE_BAKE_TEXTURE, RE_BAKE_DISPLACEMENT);
re->main= bmain;
@@ -5778,6 +5778,14 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay,
if(re->r.mode & R_RAYTRACE)
makeraytree(re);
+ /* point density texture */
+ if(!re->test_break(re->tbh))
+ make_pointdensities(re);
+
+ /* voxel data texture */
+ if(!re->test_break(re->tbh))
+ make_voxeldata(re);
+
/* occlusion */
if((re->wrld.mode & (WO_AMB_OCC|WO_ENV_LIGHT|WO_INDIRECT_LIGHT)) && !re->test_break(re->tbh))
if(re->wrld.ao_gather_method == WO_AOGATHER_APPROX)
diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c
index 3aca334cffe..a7e19c8db4f 100644
--- a/source/blender/render/intern/source/rendercore.c
+++ b/source/blender/render/intern/source/rendercore.c
@@ -2577,27 +2577,7 @@ void RE_bake_ibuf_filter(ImBuf *ibuf, char *mask, const int filter)
/* Margin */
if(filter) {
- char *temprect;
- int i;
-
- /* extend the mask +2 pixels from the image,
- * this is so colors dont blend in from outside */
-
- for(i=0; i< filter; i++)
- IMB_mask_filter_extend(mask, ibuf->x, ibuf->y);
-
- temprect = MEM_dupallocN(mask);
-
- /* expand twice to clear this many pixels, so they blend back in */
- IMB_mask_filter_extend(temprect, ibuf->x, ibuf->y);
- IMB_mask_filter_extend(temprect, ibuf->x, ibuf->y);
-
- /* clear all pixels in the margin */
- IMB_mask_clear(ibuf, temprect, FILTER_MASK_MARGIN);
- MEM_freeN(temprect);
-
- for(i= 0; i < filter; i++)
- IMB_filter_extend(ibuf, mask);
+ IMB_filter_extend(ibuf, mask, filter);
}
/* if the bake results in new alpha then change the image setting */
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 67294a8eb53..e6325e2101a 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -272,6 +272,7 @@ void WM_operator_py_idname(char *to, const char *from);
/* *************** menu types ******************** */
struct MenuType *WM_menutype_find(const char *idname, int quiet);
int WM_menutype_add(struct MenuType* mt);
+int WM_menutype_contains(struct MenuType* mt);
void WM_menutype_freelink(struct MenuType* mt);
void WM_menutype_free(void);
diff --git a/source/blender/windowmanager/intern/wm.c b/source/blender/windowmanager/intern/wm.c
index bcd5cf38f88..a535c0bc1f8 100644
--- a/source/blender/windowmanager/intern/wm.c
+++ b/source/blender/windowmanager/intern/wm.c
@@ -175,6 +175,12 @@ int WM_menutype_add(MenuType* mt)
return 1;
}
+/* inefficient but only used for tooltip code */
+int WM_menutype_contains(MenuType* mt)
+{
+ return (mt != NULL && BLI_findindex(&menutypes, mt) != -1);
+}
+
void WM_menutype_freelink(MenuType* mt)
{
BLI_freelinkN(&menutypes, mt);