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
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2012-01-26 23:20:33 +0400
committerCampbell Barton <ideasman42@gmail.com>2012-01-26 23:20:33 +0400
commitde4eeb96946943289ac898525f09fc9c7afd4157 (patch)
tree5887eac0f56db6ce226a25ae34eaaa1169c7ee3a /source
parentce90b472afbe4f90af60e19a0a6cc6704d3a3549 (diff)
parent4514a4455be89bc0a789d78355321abe6cfd5112 (diff)
svn merge ^/trunk/blender -r43693:43733
Diffstat (limited to 'source')
-rw-r--r--source/blender/avi/intern/endian.c4
-rw-r--r--source/blender/blenkernel/BKE_cloth.h2
-rw-r--r--source/blender/blenkernel/intern/cloth.c52
-rw-r--r--source/blender/blenkernel/intern/particle_system.c11
-rw-r--r--source/blender/blenkernel/intern/tracking.c1
-rw-r--r--source/blender/blenlib/intern/math_matrix.c42
-rw-r--r--source/blender/editors/interface/interface_handlers.c18
-rw-r--r--source/blender/editors/interface/interface_widgets.c3
-rw-r--r--source/blender/editors/space_clip/clip_graph_draw.c24
-rw-r--r--source/blender/editors/space_clip/clip_graph_ops.c122
-rw-r--r--source/blender/editors/space_clip/clip_intern.h4
-rw-r--r--source/blender/editors/space_clip/space_clip.c27
-rw-r--r--source/blender/editors/space_view3d/view3d_header.c2
-rw-r--r--source/blender/editors/space_view3d/view3d_select.c98
-rw-r--r--source/blender/makesdna/DNA_space_types.h3
-rw-r--r--source/blender/makesdna/DNA_tracking_types.h7
-rw-r--r--source/blender/makesrna/intern/rna_access.c9
-rw-r--r--source/blender/makesrna/intern/rna_scene_api.c1
-rw-r--r--source/blender/makesrna/intern/rna_space.c11
-rw-r--r--source/blender/makesrna/intern/rna_tracking.c20
-rw-r--r--source/blender/modifiers/intern/MOD_cloth.c32
-rw-r--r--source/blender/render/intern/source/pipeline.c1
22 files changed, 375 insertions, 119 deletions
diff --git a/source/blender/avi/intern/endian.c b/source/blender/avi/intern/endian.c
index 29b3047eca4..adcc7e8750a 100644
--- a/source/blender/avi/intern/endian.c
+++ b/source/blender/avi/intern/endian.c
@@ -43,6 +43,10 @@
#include "avi_intern.h"
#ifdef __BIG_ENDIAN__
+#include "MEM_guardedalloc.h"
+#endif
+
+#ifdef __BIG_ENDIAN__
static void invert (int *num)
{
int new=0,i,j;
diff --git a/source/blender/blenkernel/BKE_cloth.h b/source/blender/blenkernel/BKE_cloth.h
index 62c3df7c6f4..6d42b8dc80b 100644
--- a/source/blender/blenkernel/BKE_cloth.h
+++ b/source/blender/blenkernel/BKE_cloth.h
@@ -216,7 +216,7 @@ void clmdSetInterruptCallBack ( int ( *f ) ( void ) );
void cloth_free_modifier_extern ( struct ClothModifierData *clmd );
void cloth_free_modifier ( struct ClothModifierData *clmd );
void cloth_init ( struct ClothModifierData *clmd );
-struct DerivedMesh *clothModifier_do ( struct ClothModifierData *clmd, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm);
+void clothModifier_do ( struct ClothModifierData *clmd, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, float (*vertexCos)[3]);
void cloth_update_normals ( ClothVertex *verts, int nVerts, struct MFace *face, int totface );
int cloth_uses_vgroup(struct ClothModifierData *clmd);
diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c
index 44df3edb3e5..ca0898a7085 100644
--- a/source/blender/blenkernel/intern/cloth.c
+++ b/source/blender/blenkernel/intern/cloth.c
@@ -91,7 +91,7 @@ static CM_SOLVER_DEF solvers [] =
/* ********** cloth engine ******* */
/* Prototypes for internal functions.
*/
-static void cloth_to_object (Object *ob, ClothModifierData *clmd, DerivedMesh *dm);
+static void cloth_to_object (Object *ob, ClothModifierData *clmd, float (*vertexCos)[3]);
static void cloth_from_mesh ( ClothModifierData *clmd, DerivedMesh *dm );
static int cloth_from_object(Object *ob, ClothModifierData *clmd, DerivedMesh *dm, float framenr, int first);
static int cloth_build_springs ( ClothModifierData *clmd, DerivedMesh *dm );
@@ -430,9 +430,8 @@ static int do_step_cloth(Object *ob, ClothModifierData *clmd, DerivedMesh *resul
/************************************************
* clothModifier_do - main simulation function
************************************************/
-DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob, DerivedMesh *dm)
+void clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob, DerivedMesh *dm, float (*vertexCos)[3])
{
- DerivedMesh *result;
PointCache *cache;
PTCacheID pid;
float timescale;
@@ -442,20 +441,14 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
clmd->scene= scene; /* nice to pass on later :) */
framenr= (int)scene->r.cfra;
cache= clmd->point_cache;
- result = CDDM_copy(dm, 0);
BKE_ptcache_id_from_cloth(&pid, ob, clmd);
BKE_ptcache_id_time(&pid, scene, framenr, &startframe, &endframe, &timescale);
clmd->sim_parms->timescale= timescale;
- if(!result) {
- BKE_ptcache_invalidate(cache);
- return dm;
- }
-
if(clmd->sim_parms->reset
|| (framenr == (startframe - clmd->sim_parms->preroll) && clmd->sim_parms->preroll != 0)
- || (clmd->clothObject && result->getNumVerts(result) != clmd->clothObject->numverts))
+ || (clmd->clothObject && dm->getNumVerts(dm) != clmd->clothObject->numverts))
{
clmd->sim_parms->reset = 0;
cache->flag |= PTCACHE_OUTDATED;
@@ -463,7 +456,7 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
BKE_ptcache_validate(cache, 0);
cache->last_exact= 0;
cache->flag &= ~PTCACHE_REDO_NEEDED;
- return result;
+ return;
}
// unused in the moment, calculated separately in implicit.c
@@ -475,20 +468,20 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
/* do simulation */
if(!do_init_cloth(ob, clmd, dm, framenr))
- return result;
+ return;
do_step_cloth(ob, clmd, dm, framenr);
- cloth_to_object(ob, clmd, result);
+ cloth_to_object(ob, clmd, vertexCos);
clmd->clothObject->last_frame= framenr;
- return result;
+ return;
}
/* simulation is only active during a specific period */
if(framenr < startframe) {
BKE_ptcache_invalidate(cache);
- return result;
+ return;
}
else if(framenr > endframe) {
framenr= endframe;
@@ -496,7 +489,7 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
/* initialize simulation data if it didn't exist already */
if(!do_init_cloth(ob, clmd, dm, framenr))
- return result;
+ return;
if((framenr == startframe) && (clmd->sim_parms->preroll == 0)) {
BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
@@ -504,7 +497,7 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
BKE_ptcache_validate(cache, framenr);
cache->flag &= ~PTCACHE_REDO_NEEDED;
clmd->clothObject->last_frame= framenr;
- return result;
+ return;
}
/* try to read from cache */
@@ -512,7 +505,7 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
if(cache_result == PTCACHE_READ_EXACT || cache_result == PTCACHE_READ_INTERPOLATED) {
implicit_set_positions(clmd);
- cloth_to_object (ob, clmd, result);
+ cloth_to_object (ob, clmd, vertexCos);
BKE_ptcache_validate(cache, framenr);
@@ -521,7 +514,7 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
clmd->clothObject->last_frame= framenr;
- return result;
+ return;
}
else if(cache_result==PTCACHE_READ_OLD) {
implicit_set_positions(clmd);
@@ -529,11 +522,11 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
else if( /*ob->id.lib ||*/ (cache->flag & PTCACHE_BAKED)) { /* 2.4x disabled lib, but this can be used in some cases, testing further - campbell */
/* if baked and nothing in cache, do nothing */
BKE_ptcache_invalidate(cache);
- return result;
+ return;
}
if(framenr!=clmd->clothObject->last_frame+1)
- return result;
+ return;
/* if on second frame, write cache for first frame */
if(cache->simframe == startframe && (cache->flag & PTCACHE_OUTDATED || cache->last_exact==0))
@@ -550,10 +543,8 @@ DerivedMesh *clothModifier_do(ClothModifierData *clmd, Scene *scene, Object *ob,
else
BKE_ptcache_write(&pid, framenr);
- cloth_to_object (ob, clmd, result);
+ cloth_to_object (ob, clmd, vertexCos);
clmd->clothObject->last_frame= framenr;
-
- return result;
}
/* frees all */
@@ -708,24 +699,19 @@ void cloth_free_modifier_extern ( ClothModifierData *clmd )
* cloth_to_object - copies the deformed vertices to the object.
*
**/
-static void cloth_to_object (Object *ob, ClothModifierData *clmd, DerivedMesh *dm)
+static void cloth_to_object (Object *ob, ClothModifierData *clmd, float (*vertexCos)[3])
{
unsigned int i = 0;
- MVert *mvert = NULL;
- unsigned int numverts;
Cloth *cloth = clmd->clothObject;
if (clmd->clothObject) {
/* inverse matrix is not uptodate... */
invert_m4_m4(ob->imat, ob->obmat);
- mvert = CDDM_get_verts(dm);
- numverts = dm->getNumVerts(dm);
-
- for (i = 0; i < numverts; i++)
+ for (i = 0; i < cloth->numverts; i++)
{
- copy_v3_v3 (mvert[i].co, cloth->verts[i].x);
- mul_m4_v3(ob->imat, mvert[i].co); /* cloth is in global coords */
+ copy_v3_v3 (vertexCos[i], cloth->verts[i].x);
+ mul_m4_v3(ob->imat, vertexCos[i]); /* cloth is in global coords */
}
}
}
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index daee707d143..f259ddbf577 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -3489,6 +3489,7 @@ static void do_hair_dynamics(ParticleSimulationData *sim)
int totedge;
int k;
float hairmat[4][4];
+ float (*deformedVerts)[3];
if(!psys->clmd) {
psys->clmd = (ClothModifierData*)modifier_new(eModifierType_Cloth);
@@ -3582,7 +3583,15 @@ static void do_hair_dynamics(ParticleSimulationData *sim)
psys->clmd->point_cache = psys->pointcache;
psys->clmd->sim_parms->effector_weights = psys->part->effector_weights;
- psys->hair_out_dm = clothModifier_do(psys->clmd, sim->scene, sim->ob, dm);
+ deformedVerts = MEM_callocN(sizeof(*deformedVerts)*dm->getNumVerts(dm), "do_hair_dynamics vertexCos");
+ psys->hair_out_dm = CDDM_copy(dm, 0);
+ psys->hair_out_dm->getVertCos(psys->hair_out_dm, deformedVerts);
+
+ clothModifier_do(psys->clmd, sim->scene, sim->ob, dm, deformedVerts);
+
+ CDDM_apply_vert_coords(psys->hair_out_dm, deformedVerts);
+
+ MEM_freeN(deformedVerts);
psys->clmd->sim_parms->effector_weights = NULL;
}
diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c
index ea3f076523f..9bff5e3003d 100644
--- a/source/blender/blenkernel/intern/tracking.c
+++ b/source/blender/blenkernel/intern/tracking.c
@@ -242,6 +242,7 @@ MovieTrackingTrack *BKE_tracking_add_track(MovieTracking *tracking, ListBase *tr
track->margin= settings->default_margin;
track->pattern_match= settings->default_pattern_match;
track->frames_limit= settings->default_frames_limit;
+ track->flag= settings->default_flag;
memset(&marker, 0, sizeof(marker));
marker.pos[0]= x;
diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c
index cd54c944ba9..0c8c98988d1 100644
--- a/source/blender/blenlib/intern/math_matrix.c
+++ b/source/blender/blenlib/intern/math_matrix.c
@@ -778,32 +778,38 @@ void orthogonalize_m4(float mat[][4], int axis)
mul_v3_fl(mat[2], size[2]);
}
-int is_orthogonal_m3(float mat[][3])
+int is_orthogonal_m3(float m[][3])
{
- if (fabsf(dot_v3v3(mat[0], mat[1])) > 1.5f * FLT_EPSILON)
- return 0;
+ int i, j;
- if (fabsf(dot_v3v3(mat[1], mat[2])) > 1.5f * FLT_EPSILON)
- return 0;
+ for (i = 0; i < 3; i++) {
+ for (j = 0; j < i; j++) {
+ if (fabsf(dot_v3v3(m[i], m[j])) > 1.5f * FLT_EPSILON)
+ return 0;
+ }
- if (fabsf(dot_v3v3(mat[0], mat[2])) > 1.5f * FLT_EPSILON)
- return 0;
-
- return 1;
+ if (fabsf(dot_v3v3(m[i], m[i]) - 1) > 1.5f * FLT_EPSILON)
+ return 0;
+ }
+
+ return 1;
}
-int is_orthogonal_m4(float mat[][4])
+int is_orthogonal_m4(float m[][4])
{
- if (fabsf(dot_v3v3(mat[0], mat[1])) > 1.5f * FLT_EPSILON)
- return 0;
+ int i, j;
- if (fabsf(dot_v3v3(mat[1], mat[2])) > 1.5f * FLT_EPSILON)
- return 0;
+ for (i = 0; i < 4; i++) {
+ for (j = 0; j < i; j++) {
+ if (fabsf(dot_vn_vn(m[i], m[j], 4)) > 1.5f * FLT_EPSILON)
+ return 0;
+ }
- if (fabsf(dot_v3v3(mat[0], mat[2])) > 1.5f * FLT_EPSILON)
- return 0;
-
- return 1;
+ if (fabsf(dot_vn_vn(m[i], m[i], 4) - 1) > 1.5f * FLT_EPSILON)
+ return 0;
+ }
+
+ return 1;
}
void normalize_m3(float mat[][3])
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 93d8f9c0c8a..cfb375c2558 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -1527,6 +1527,8 @@ static void ui_textedit_move(uiBut *but, uiHandleButtonData *data, int direction
const int pos_prev= but->pos;
const int has_sel= (but->selend - but->selsta) > 0;
+ ui_check_but(but);
+
/* special case, quit selection and set cursor */
if (has_sel && !select) {
if (jump == BUTTON_EDIT_JUMP_ALL) {
@@ -3030,12 +3032,28 @@ static int ui_do_but_BLOCK(bContext *C, uiBut *but, uiHandleButtonData *data, wm
data->value= ui_step_name_menu(but, -1);
button_activate_state(C, but, BUTTON_STATE_EXIT);
ui_apply_button(C, but->block, but, data, 1);
+
+ /* button's state need to be changed to EXIT so moving mouse away from this mouse wouldn't lead
+ * to cancel changes made to this button, but shanging state to EXIT also makes no button active for
+ * a while which leads to triggering operator when doing fast scrolling mouse wheel.
+ * using post activate stuff from button allows to make button be active again after checking for all
+ * all that mouse leave and cancel stuff, so wuick scrool wouldnt't be an issue anumore.
+ * same goes for scrolling wheel in another direction below (sergey)
+ */
+ data->postbut= but;
+ data->posttype= BUTTON_ACTIVATE_OVER;
+
return WM_UI_HANDLER_BREAK;
}
else if(event->type == WHEELUPMOUSE && event->alt) {
data->value= ui_step_name_menu(but, 1);
button_activate_state(C, but, BUTTON_STATE_EXIT);
ui_apply_button(C, but->block, but, data, 1);
+
+ /* why this is needed described above */
+ data->postbut= but;
+ data->posttype= BUTTON_ACTIVATE_OVER;
+
return WM_UI_HANDLER_BREAK;
}
}
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index 19acfaccaa3..cd0844a38a3 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -952,6 +952,9 @@ static void ui_text_leftclip(uiFontStyle *fstyle, uiBut *but, rcti *rect)
if(but->editstr && but->pos >= 0) {
if(but->ofs > but->pos)
but->ofs= but->pos;
+
+ if(BLF_width(fstyle->uifont_id, but->drawstr) <= okwidth)
+ but->ofs = 0;
}
else but->ofs= 0;
diff --git a/source/blender/editors/space_clip/clip_graph_draw.c b/source/blender/editors/space_clip/clip_graph_draw.c
index e913ae77f05..6fabe802ff0 100644
--- a/source/blender/editors/space_clip/clip_graph_draw.c
+++ b/source/blender/editors/space_clip/clip_graph_draw.c
@@ -47,6 +47,7 @@
#include "ED_clip.h"
#include "BIF_gl.h"
+#include "BIF_glutil.h"
#include "WM_types.h"
@@ -120,6 +121,26 @@ static void draw_graph_cfra(SpaceClip *sc, ARegion *ar, Scene *scene)
glScalef(xscale, 1.0, 1.0);
}
+static void draw_graph_sfra_efra(Scene *scene, View2D *v2d)
+{
+ UI_view2d_view_ortho(v2d);
+
+ /* currently clip editor supposes that editing clip length is equal to scene frame range */
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glColor4f(0.0f, 0.0f, 0.0f, 0.4f);
+
+ glRectf(v2d->cur.xmin, v2d->cur.ymin, (float)SFRA, v2d->cur.ymax);
+ glRectf((float)EFRA, v2d->cur.ymin, v2d->cur.xmax, v2d->cur.ymax);
+ glDisable(GL_BLEND);
+
+ UI_ThemeColorShade(TH_BACK, -60);
+
+ /* thin lines where the actual frames are */
+ fdrawline((float)SFRA, v2d->cur.ymin, (float)SFRA, v2d->cur.ymax);
+ fdrawline((float)EFRA, v2d->cur.ymin, (float)EFRA, v2d->cur.ymax);
+}
+
static void tracking_segment_point_cb(void *UNUSED(userdata), MovieTrackingTrack *UNUSED(track),
MovieTrackingMarker *marker, int UNUSED(coord), float val)
{
@@ -255,6 +276,9 @@ void clip_draw_graph(SpaceClip *sc, ARegion *ar, Scene *scene)
draw_frame_curves(sc);
}
+ /* frame range */
+ draw_graph_sfra_efra(scene, v2d);
+
/* current frame */
draw_graph_cfra(sc, ar, scene);
}
diff --git a/source/blender/editors/space_clip/clip_graph_ops.c b/source/blender/editors/space_clip/clip_graph_ops.c
index 8be5e520b1f..6a56de26689 100644
--- a/source/blender/editors/space_clip/clip_graph_ops.c
+++ b/source/blender/editors/space_clip/clip_graph_ops.c
@@ -30,6 +30,7 @@
*/
#include "DNA_object_types.h" /* SELECT */
+#include "DNA_scene_types.h"
#include "MEM_guardedalloc.h"
@@ -58,6 +59,19 @@
/******************** common graph-editing utilities ********************/
+static int ED_space_clip_graph_poll(bContext *C)
+{
+ SpaceClip *sc = CTX_wm_space_clip(C);
+
+ if(sc && sc->clip) {
+ ARegion *ar = CTX_wm_region(C);
+
+ return ar->regiontype == RGN_TYPE_PREVIEW;
+ }
+
+ return 0;
+}
+
typedef struct {
int action;
} SelectUserData;
@@ -278,7 +292,7 @@ void CLIP_OT_graph_select(wmOperatorType *ot)
/* api callbacks */
ot->exec= select_exec;
ot->invoke= select_invoke;
- ot->poll= ED_space_clip_poll;
+ ot->poll= ED_space_clip_graph_poll;
/* flags */
ot->flag= OPTYPE_UNDO;
@@ -357,8 +371,112 @@ void CLIP_OT_graph_delete_knot(wmOperatorType *ot)
/* api callbacks */
ot->exec= delete_knot_exec;
- ot->poll= ED_space_clip_poll;
+ ot->poll= ED_space_clip_graph_poll;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
+
+/******************** view all operator ********************/
+
+typedef struct {
+ float min, max;
+} ViewAllUserData;
+
+static void view_all_cb(void *userdata, MovieTrackingTrack *UNUSED(track), MovieTrackingMarker *UNUSED(marker),
+ int UNUSED(coord), float val)
+{
+ ViewAllUserData *data = (ViewAllUserData *)userdata;
+
+ if(val < data->min) data->min = val;
+ if(val > data->max) data->max = val;
+}
+
+static int view_all_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ Scene *scene = CTX_data_scene(C);
+ ARegion *ar = CTX_wm_region(C);
+ SpaceClip *sc = CTX_wm_space_clip(C);
+ View2D *v2d = &ar->v2d;
+ ViewAllUserData userdata;
+ float extra;
+
+ userdata.max = -FLT_MAX;
+ userdata.min = FLT_MAX;
+
+ clip_graph_tracking_values_iterate(sc, &userdata, view_all_cb, NULL, NULL);
+
+ /* set extents of view to start/end frames */
+ v2d->cur.xmin = (float)SFRA;
+ v2d->cur.xmax = (float)EFRA;
+
+ if (userdata.min < userdata.max) {
+ v2d->cur.ymin = userdata.min;
+ v2d->cur.ymax = userdata.max;
+ }
+ else {
+ v2d->cur.ymin = -10;
+ v2d->cur.ymax = 10;
+ }
+
+ /* we need an extra "buffer" factor on either side so that the endpoints are visible */
+ extra= 0.01f * (v2d->cur.xmax - v2d->cur.xmin);
+ v2d->cur.xmin -= extra;
+ v2d->cur.xmax += extra;
+
+ extra= 0.01f * (v2d->cur.ymax - v2d->cur.ymin);
+ v2d->cur.ymin -= extra;
+ v2d->cur.ymax += extra;
+
+ ED_region_tag_redraw(ar);
+
+ return OPERATOR_FINISHED;
+}
+
+void CLIP_OT_graph_view_all(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "View All";
+ ot->description = "View all curves in editor";
+ ot->idname = "CLIP_OT_graph_view_all";
+
+ /* api callbacks */
+ ot->exec = view_all_exec;
+ ot->poll = ED_space_clip_graph_poll;
+}
+
+/******************** jump to current frame operator ********************/
+
+void ED_clip_graph_center_current_frame(Scene *scene, ARegion *ar)
+{
+ View2D *v2d = &ar->v2d;
+ float extra = (v2d->cur.xmax - v2d->cur.xmin) / 2.0;
+
+ /* set extents of view to start/end frames */
+ v2d->cur.xmin = (float)CFRA - extra;
+ v2d->cur.xmax = (float)CFRA + extra;
+}
+
+static int center_current_frame_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ Scene *scene = CTX_data_scene(C);
+ ARegion *ar = CTX_wm_region(C);
+
+ ED_clip_graph_center_current_frame(scene, ar);
+
+ ED_region_tag_redraw(ar);
+
+ return OPERATOR_FINISHED;
+}
+
+void CLIP_OT_graph_center_current_frame(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Center Current Frame";
+ ot->description = "Scroll view so current frame would be centered";
+ ot->idname = "CLIP_OT_graph_center_current_frame";
+
+ /* api callbacks */
+ ot->exec = center_current_frame_exec;
+ ot->poll = ED_space_clip_graph_poll;
+}
diff --git a/source/blender/editors/space_clip/clip_intern.h b/source/blender/editors/space_clip/clip_intern.h
index 3f7456e90dc..9ff58a73ca2 100644
--- a/source/blender/editors/space_clip/clip_intern.h
+++ b/source/blender/editors/space_clip/clip_intern.h
@@ -55,9 +55,13 @@ void clip_draw_curfra_label(struct SpaceClip *sc, float x, float y);
void clip_draw_graph(struct SpaceClip *sc, struct ARegion *ar, struct Scene *scene);
/* clip_graph_ops.c */
+void ED_clip_graph_center_current_frame(struct Scene *scene, struct ARegion *ar);
+
void CLIP_OT_graph_select(struct wmOperatorType *ot);
void CLIP_OT_graph_delete_curve(struct wmOperatorType *ot);
void CLIP_OT_graph_delete_knot(struct wmOperatorType *ot);
+void CLIP_OT_graph_view_all(struct wmOperatorType *ot);
+void CLIP_OT_graph_center_current_frame(struct wmOperatorType *ot);
/* clip_ops.c */
void CLIP_OT_open(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_clip/space_clip.c b/source/blender/editors/space_clip/space_clip.c
index 04871156412..0d34cc2cfbf 100644
--- a/source/blender/editors/space_clip/space_clip.c
+++ b/source/blender/editors/space_clip/space_clip.c
@@ -78,7 +78,7 @@ static void init_preview_region(const bContext *C, ARegion *ar)
ar->flag|= RGN_FLAG_HIDDEN;
ar->v2d.tot.xmin= 0.0f;
- ar->v2d.tot.ymin= (float)scene->r.sfra - 10.0f;
+ ar->v2d.tot.ymin= -10.0f;
ar->v2d.tot.xmax= (float)scene->r.efra;
ar->v2d.tot.ymax= 10.0f;
@@ -373,6 +373,8 @@ static void clip_operatortypes(void)
WM_operatortype_append(CLIP_OT_graph_select);
WM_operatortype_append(CLIP_OT_graph_delete_curve);
WM_operatortype_append(CLIP_OT_graph_delete_knot);
+ WM_operatortype_append(CLIP_OT_graph_view_all);
+ WM_operatortype_append(CLIP_OT_graph_center_current_frame);
/* object tracking */
WM_operatortype_append(CLIP_OT_tracking_object_new);
@@ -418,6 +420,13 @@ static void clip_keymap(struct wmKeyConfig *keyconf)
RNA_enum_set(kmi->ptr, "mode", SC_MODE_DISTORTION);
RNA_boolean_set(kmi->ptr, "toggle", TRUE);
+ kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle_enum", ZKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "data_path", "space_data.view");
+ RNA_string_set(kmi->ptr, "value_1", "CLIP");
+ RNA_string_set(kmi->ptr, "value_2", "GRAPH");
+
+ WM_keymap_add_item(keymap, "CLIP_OT_solve_camera", SKEY, KM_PRESS, KM_SHIFT, 0);
+
/* ******** Hotkeys avalaible for main region only ******** */
keymap= WM_keymap_find(keyconf, "Clip Editor", SPACE_CLIP, 0);
@@ -546,6 +555,13 @@ static void clip_keymap(struct wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "CLIP_OT_graph_delete_knot", DELKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "CLIP_OT_graph_delete_knot", XKEY, KM_PRESS, KM_SHIFT, 0);
+ /* view */
+ WM_keymap_add_item(keymap, "CLIP_OT_graph_view_all", HOMEKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "CLIP_OT_graph_center_current_frame", PADPERIOD, KM_PRESS, 0, 0);
+
+ kmi= WM_keymap_add_item(keymap, "WM_OT_context_toggle", LKEY, KM_PRESS, 0, 0);
+ RNA_string_set(kmi->ptr, "data_path", "space_data.lock_time_cursor");
+
transform_keymap_for_space(keyconf, keymap, SPACE_CLIP);
}
@@ -588,10 +604,6 @@ static void clip_refresh(const bContext *C, ScrArea *sa)
ar_main->alignment= RGN_ALIGN_NONE;
view_changed= 1;
}
- if (ar_preview && ar_preview->alignment != RGN_ALIGN_NONE) {
- ar_preview->alignment= RGN_ALIGN_NONE;
- view_changed= 1;
- }
break;
case SC_VIEW_GRAPH:
if (ar_preview && (ar_preview->flag & RGN_FLAG_HIDDEN)) {
@@ -604,7 +616,7 @@ static void clip_refresh(const bContext *C, ScrArea *sa)
ar_main->alignment= RGN_ALIGN_NONE;
view_changed= 1;
}
- if (ar_preview && ar_preview->alignment != RGN_ALIGN_TOP) {
+ if (ar_preview && !ELEM(ar_preview->alignment, RGN_ALIGN_TOP, RGN_ALIGN_BOTTOM)) {
ar_preview->alignment= RGN_ALIGN_TOP;
view_changed= 1;
}
@@ -767,6 +779,9 @@ static void clip_preview_area_draw(const bContext *C, ARegion *ar)
Scene *scene= CTX_data_scene(C);
short unitx= V2D_UNIT_FRAMESCALE, unity= V2D_UNIT_VALUES;
+ if(sc->flag & SC_LOCK_TIMECURSOR)
+ ED_clip_graph_center_current_frame(scene, ar);
+
/* clear and setup matrix */
UI_ThemeClearColor(TH_BACK);
glClear(GL_COLOR_BUFFER_BIT);
diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c
index 060e59265e0..60da368321f 100644
--- a/source/blender/editors/space_view3d/view3d_header.c
+++ b/source/blender/editors/space_view3d/view3d_header.c
@@ -232,6 +232,8 @@ static int view3d_layers_invoke(bContext *C, wmOperator *op, wmEvent *event)
if(event->shift)
RNA_boolean_set(op->ptr, "extend", TRUE);
+ else
+ RNA_boolean_set(op->ptr, "extend", FALSE);
if(event->alt) {
int nr= RNA_int_get(op->ptr, "nr") + 10;
diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c
index 80fd404772e..ee3c0ee8234 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -248,6 +248,12 @@ static void EDBM_backbuf_checkAndSelectTFaces(Mesh *me, int select)
/* *********************** GESTURE AND LASSO ******************* */
+typedef struct LassoSelectUserData {
+ ViewContext *vc;
+ rcti *rect;
+ int (*mcords)[2], moves, select, pass, done;
+} LassoSelectUserData;
+
static int view3d_selectable_data(bContext *C)
{
Object *ob = CTX_data_active_object(C);
@@ -464,43 +470,43 @@ static void lasso_select_boundbox(rcti *rect, int mcords[][2], short moves)
static void do_lasso_select_mesh__doSelectVert(void *userData, BMVert *eve, int x, int y, int UNUSED(index))
{
- struct { ViewContext vc; rcti *rect; int (*mcords)[2], moves, select, pass, done; } *data = userData;
+ LassoSelectUserData *data = userData;
if (BLI_in_rcti(data->rect, x, y) && lasso_inside(data->mcords, data->moves, x, y)) {
- BM_Select(data->vc.em->bm, eve, data->select);
+ BM_Select(data->vc->em->bm, eve, data->select);
}
}
static void do_lasso_select_mesh__doSelectEdge(void *userData, BMEdge *eed, int x0, int y0, int x1, int y1, int index)
{
- struct { ViewContext vc; rcti *rect; int (*mcords)[2], moves, select, pass, done; } *data = userData;
+ LassoSelectUserData *data = userData;
if (EDBM_check_backbuf(bm_solidoffs+index)) {
if (data->pass==0) {
if ( edge_fully_inside_rect(data->rect, x0, y0, x1, y1) &&
lasso_inside(data->mcords, data->moves, x0, y0) &&
lasso_inside(data->mcords, data->moves, x1, y1)) {
- BM_Select(data->vc.em->bm, eed, data->select);
+ BM_Select(data->vc->em->bm, eed, data->select);
data->done = 1;
}
} else {
if (lasso_inside_edge(data->mcords, data->moves, x0, y0, x1, y1)) {
- BM_Select(data->vc.em->bm, eed, data->select);
+ BM_Select(data->vc->em->bm, eed, data->select);
}
}
}
}
static void do_lasso_select_mesh__doSelectFace(void *userData, BMFace *efa, int x, int y, int UNUSED(index))
{
- struct { ViewContext vc; rcti *rect; int (*mcords)[2], moves, select, pass, done; } *data = userData;
+ LassoSelectUserData *data = userData;
if (BLI_in_rcti(data->rect, x, y) && lasso_inside(data->mcords, data->moves, x, y)) {
- BM_Select(data->vc.em->bm, efa, data->select);
+ BM_Select(data->vc->em->bm, efa, data->select);
}
}
static void do_lasso_select_mesh(ViewContext *vc, int mcords[][2], short moves, short extend, short select)
{
- struct { ViewContext vc; rcti *rect; int (*mcords)[2], moves, select, pass, done; } data;
+ LassoSelectUserData data;
ToolSettings *ts= vc->scene->toolsettings;
rcti rect;
int bbsel;
@@ -510,7 +516,7 @@ static void do_lasso_select_mesh(ViewContext *vc, int mcords[][2], short moves,
/* set editmesh */
vc->em= ((Mesh *)vc->obedit->data)->edit_btmesh;
- data.vc= *vc;
+ data.vc= vc;
data.rect = &rect;
data.mcords = mcords;
data.moves = moves;
@@ -618,7 +624,7 @@ static void do_lasso_select_mesh_uv(int mcords[][2], short moves, short select)
static void do_lasso_select_curve__doSelect(void *userData, Nurb *UNUSED(nu), BPoint *bp, BezTriple *bezt, int beztindex, int x, int y)
{
- struct { ViewContext *vc; int (*mcords)[2]; short moves; short select; } *data = userData;
+ LassoSelectUserData *data = userData;
Object *obedit= data->vc->obedit;
Curve *cu= (Curve*)obedit->data;
@@ -647,7 +653,7 @@ static void do_lasso_select_curve__doSelect(void *userData, Nurb *UNUSED(nu), BP
static void do_lasso_select_curve(ViewContext *vc, int mcords[][2], short moves, short extend, short select)
{
- struct { ViewContext *vc; int (*mcords)[2]; short moves; short select; } data;
+ LassoSelectUserData data;
/* set vc->editnurb */
data.vc = vc;
@@ -664,7 +670,7 @@ static void do_lasso_select_curve(ViewContext *vc, int mcords[][2], short moves,
static void do_lasso_select_lattice__doSelect(void *userData, BPoint *bp, int x, int y)
{
- struct { int (*mcords)[2]; short moves; short select; } *data = userData;
+ LassoSelectUserData *data = userData;
if (lasso_inside(data->mcords, data->moves, x, y)) {
bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT);
@@ -672,7 +678,7 @@ static void do_lasso_select_lattice__doSelect(void *userData, BPoint *bp, int x,
}
static void do_lasso_select_lattice(ViewContext *vc, int mcords[][2], short moves, short extend, short select)
{
- struct { int (*mcords)[2]; short moves; short select; } data;
+ LassoSelectUserData data;
/* set editdata in vc */
data.mcords = mcords;
@@ -1632,6 +1638,11 @@ static int mouse_select(bContext *C, const int mval[2], short extend, short obce
/* ******************** border and circle ************************************** */
+typedef struct BoxSelectUserData {
+ ViewContext *vc;
+ rcti *rect;
+ int select, pass, done;
+} BoxSelectUserData;
int edge_inside_circle(short centx, short centy, short rad, short x1, short y1, short x2, short y2)
{
@@ -1657,7 +1668,7 @@ int edge_inside_circle(short centx, short centy, short rad, short x1, short y1,
static void do_nurbs_box_select__doSelect(void *userData, Nurb *UNUSED(nu), BPoint *bp, BezTriple *bezt, int beztindex, int x, int y)
{
- struct { ViewContext *vc; rcti *rect; int select; } *data = userData;
+ BoxSelectUserData *data = userData;
Object *obedit= data->vc->obedit;
Curve *cu= (Curve*)obedit->data;
@@ -1685,7 +1696,7 @@ static void do_nurbs_box_select__doSelect(void *userData, Nurb *UNUSED(nu), BPoi
}
static int do_nurbs_box_select(ViewContext *vc, rcti *rect, int select, int extend)
{
- struct { ViewContext *vc; rcti *rect; int select; } data;
+ BoxSelectUserData data;
data.vc = vc;
data.rect = rect;
@@ -1702,7 +1713,7 @@ static int do_nurbs_box_select(ViewContext *vc, rcti *rect, int select, int exte
static void do_lattice_box_select__doSelect(void *userData, BPoint *bp, int x, int y)
{
- struct { ViewContext vc; rcti *rect; int select; } *data = userData;
+ BoxSelectUserData *data = userData;
if (BLI_in_rcti(data->rect, x, y)) {
bp->f1 = data->select?(bp->f1|SELECT):(bp->f1&~SELECT);
@@ -1710,9 +1721,9 @@ static void do_lattice_box_select__doSelect(void *userData, BPoint *bp, int x, i
}
static int do_lattice_box_select(ViewContext *vc, rcti *rect, int select, int extend)
{
- struct { ViewContext vc; rcti *rect; int select, pass, done; } data;
+ BoxSelectUserData data;
- data.vc= *vc;
+ data.vc= vc;
data.rect = rect;
data.select = select;
@@ -1727,44 +1738,44 @@ static int do_lattice_box_select(ViewContext *vc, rcti *rect, int select, int ex
static void do_mesh_box_select__doSelectVert(void *userData, BMVert *eve, int x, int y, int UNUSED(index))
{
- struct { ViewContext vc; rcti *rect; short select, pass, done; } *data = userData;
+ BoxSelectUserData *data = userData;
if (BLI_in_rcti(data->rect, x, y)) {
- BM_Select(data->vc.em->bm, eve, data->select);
+ BM_Select(data->vc->em->bm, eve, data->select);
}
}
static void do_mesh_box_select__doSelectEdge(void *userData, BMEdge *eed, int x0, int y0, int x1, int y1, int index)
{
- struct { ViewContext vc; rcti *rect; short select, pass, done; } *data = userData;
+ BoxSelectUserData *data = userData;
if(EDBM_check_backbuf(bm_solidoffs+index)) {
if (data->pass==0) {
if (edge_fully_inside_rect(data->rect, x0, y0, x1, y1)) {
- BM_Select(data->vc.em->bm, eed, data->select);
+ BM_Select(data->vc->em->bm, eed, data->select);
data->done = 1;
}
} else {
if (edge_inside_rect(data->rect, x0, y0, x1, y1)) {
- BM_Select(data->vc.em->bm, eed, data->select);
+ BM_Select(data->vc->em->bm, eed, data->select);
}
}
}
}
static void do_mesh_box_select__doSelectFace(void *userData, BMFace *efa, int x, int y, int UNUSED(index))
{
- struct { ViewContext vc; rcti *rect; short select, pass, done; } *data = userData;
+ BoxSelectUserData *data = userData;
if (BLI_in_rcti(data->rect, x, y)) {
- BM_Select(data->vc.em->bm, efa, data->select);
+ BM_Select(data->vc->em->bm, efa, data->select);
}
}
static int do_mesh_box_select(ViewContext *vc, rcti *rect, int select, int extend)
{
- struct { ViewContext vc; rcti *rect; short select, pass, done; } data;
+ BoxSelectUserData data;
ToolSettings *ts= vc->scene->toolsettings;
int bbsel;
- data.vc= *vc;
+ data.vc= vc;
data.rect = rect;
data.select = select;
data.pass = 0;
@@ -2259,9 +2270,16 @@ void VIEW3D_OT_select(wmOperatorType *ot)
/* -------------------- circle select --------------------------------------------- */
+typedef struct CircleSelectUserData {
+ ViewContext *vc;
+ short select;
+ int mval[2];
+ float radius;
+} CircleSelectUserData;
+
static void mesh_circle_doSelectVert(void *userData, BMVert *eve, int x, int y, int UNUSED(index))
{
- struct {ViewContext *vc; short select; int mval[2]; float radius; } *data = userData;
+ CircleSelectUserData *data = userData;
int mx = x - data->mval[0], my = y - data->mval[1];
float r = sqrt(mx*mx + my*my);
@@ -2271,7 +2289,7 @@ static void mesh_circle_doSelectVert(void *userData, BMVert *eve, int x, int y,
}
static void mesh_circle_doSelectEdge(void *userData, BMEdge *eed, int x0, int y0, int x1, int y1, int UNUSED(index))
{
- struct {ViewContext *vc; short select; int mval[2]; float radius; } *data = userData;
+ CircleSelectUserData *data = userData;
if (edge_inside_circle(data->mval[0], data->mval[1], (short) data->radius, x0, y0, x1, y1)) {
BM_Select(data->vc->em->bm, eed, data->select);
@@ -2279,7 +2297,7 @@ static void mesh_circle_doSelectEdge(void *userData, BMEdge *eed, int x0, int y0
}
static void mesh_circle_doSelectFace(void *userData, BMFace *efa, int x, int y, int UNUSED(index))
{
- struct {ViewContext *vc; short select; int mval[2]; float radius; } *data = userData;
+ CircleSelectUserData *data = userData;
int mx = x - data->mval[0], my = y - data->mval[1];
float r = sqrt(mx*mx + my*my);
@@ -2292,7 +2310,7 @@ static void mesh_circle_select(ViewContext *vc, int select, const int mval[2], f
{
ToolSettings *ts= vc->scene->toolsettings;
int bbsel;
- struct {ViewContext *vc; short select; int mval[2]; float radius; } data;
+ CircleSelectUserData data;
bbsel= EDBM_init_backbuf_circle(vc, mval[0], mval[1], (short)(rad+1.0));
ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */
@@ -2354,7 +2372,7 @@ static void paint_vertsel_circle_select(ViewContext *vc, int select, const int m
Object *ob= vc->obact;
Mesh *me = ob?ob->data:NULL;
/* int bbsel; */ /* UNUSED */
- /* struct {ViewContext *vc; short select; int mval[2]; float radius; } data = {NULL}; */ /* UNUSED */
+ /* CircleSelectUserData data = {NULL}; */ /* UNUSED */
if (me) {
bm_vertoffs= me->totvert+1; /* max index array */
@@ -2369,7 +2387,7 @@ static void paint_vertsel_circle_select(ViewContext *vc, int select, const int m
static void nurbscurve_circle_doSelect(void *userData, Nurb *UNUSED(nu), BPoint *bp, BezTriple *bezt, int beztindex, int x, int y)
{
- struct {ViewContext *vc; short select; int mval[2]; float radius; } *data = userData;
+ CircleSelectUserData *data = userData;
int mx = x - data->mval[0], my = y - data->mval[1];
float r = sqrt(mx*mx + my*my);
Object *obedit= data->vc->obedit;
@@ -2400,7 +2418,7 @@ static void nurbscurve_circle_doSelect(void *userData, Nurb *UNUSED(nu), BPoint
}
static void nurbscurve_circle_select(ViewContext *vc, int select, const int mval[2], float rad)
{
- struct {ViewContext *vc; short select; int mval[2]; float radius; } data;
+ CircleSelectUserData data;
/* set vc-> edit data */
@@ -2417,7 +2435,7 @@ static void nurbscurve_circle_select(ViewContext *vc, int select, const int mval
static void latticecurve_circle_doSelect(void *userData, BPoint *bp, int x, int y)
{
- struct {ViewContext *vc; short select; int mval[2]; float radius; } *data = userData;
+ CircleSelectUserData *data = userData;
int mx = x - data->mval[0], my = y - data->mval[1];
float r = sqrt(mx*mx + my*my);
@@ -2427,7 +2445,7 @@ static void latticecurve_circle_doSelect(void *userData, BPoint *bp, int x, int
}
static void lattice_circle_select(ViewContext *vc, int select, const int mval[2], float rad)
{
- struct {ViewContext *vc; short select; int mval[2]; float radius; } data;
+ CircleSelectUserData data;
/* set vc-> edit data */
@@ -2444,7 +2462,7 @@ static void lattice_circle_select(ViewContext *vc, int select, const int mval[2]
// NOTE: pose-bone case is copied from editbone case...
static short pchan_circle_doSelectJoint(void *userData, bPoseChannel *pchan, int x, int y)
{
- struct {ViewContext *vc; short select; int mval[2]; float radius; } *data = userData;
+ CircleSelectUserData *data = userData;
int mx = x - data->mval[0], my = y - data->mval[1];
float r = sqrt(mx*mx + my*my);
@@ -2459,7 +2477,7 @@ static short pchan_circle_doSelectJoint(void *userData, bPoseChannel *pchan, int
}
static void pose_circle_select(ViewContext *vc, int select, const int mval[2], float rad)
{
- struct {ViewContext *vc; short select; int mval[2]; float radius; } data;
+ CircleSelectUserData data;
bArmature *arm = vc->obact->data;
bPose *pose = vc->obact->pose;
bPoseChannel *pchan;
@@ -2509,7 +2527,7 @@ static void pose_circle_select(ViewContext *vc, int select, const int mval[2], f
static short armature_circle_doSelectJoint(void *userData, EditBone *ebone, int x, int y, short head)
{
- struct {ViewContext *vc; short select; int mval[2]; float radius; } *data = userData;
+ CircleSelectUserData *data = userData;
int mx = x - data->mval[0], my = y - data->mval[1];
float r = sqrt(mx*mx + my*my);
@@ -2532,7 +2550,7 @@ static short armature_circle_doSelectJoint(void *userData, EditBone *ebone, int
}
static void armature_circle_select(ViewContext *vc, int select, const int mval[2], float rad)
{
- struct {ViewContext *vc; short select, mval[2]; float radius; } data;
+ CircleSelectUserData data;
bArmature *arm= vc->obedit->data;
EditBone *ebone;
int change= FALSE;
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index d57da31793e..06138bc0757 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -900,7 +900,8 @@ enum {
#define SC_SHOW_FILTERS (1<<13)
#define SC_SHOW_GRAPH_FRAMES (1<<14)
#define SC_SHOW_GRAPH_TRACKS (1<<15)
-#define SC_SHOW_PYRAMID_LEVELS (1<<16)
+#define SC_SHOW_PYRAMID_LEVELS (1<<16)
+#define SC_LOCK_TIMECURSOR (1<<17)
/* SpaceClip->mode */
#define SC_MODE_TRACKING 0
diff --git a/source/blender/makesdna/DNA_tracking_types.h b/source/blender/makesdna/DNA_tracking_types.h
index 6ab8b5524ff..1b41131c07d 100644
--- a/source/blender/makesdna/DNA_tracking_types.h
+++ b/source/blender/makesdna/DNA_tracking_types.h
@@ -121,6 +121,9 @@ typedef struct MovieTrackingSettings {
short default_frames_limit; /* number of frames to be tarcked during single tracking session (if TRACKING_FRAMES_LIMIT is set) */
short default_margin; /* margin from frame boundaries */
short default_pattern_match; /* re-adjust every N frames */
+ short default_flag; /* default flags like color channels used by default */
+
+ short pod;
/* ** common tracker settings ** */
short speed; /* speed of tracking */
@@ -129,7 +132,7 @@ typedef struct MovieTrackingSettings {
int keyframe1, keyframe2; /* two keyframes for reconstrution initialization */
/* ** which camera intrinsics to refine. uses on the REFINE_* flags */
- short refine_camera_intrinsics, pad2;
+ short refine_camera_intrinsics, pad23;
/* ** tool settings ** */
@@ -142,6 +145,8 @@ typedef struct MovieTrackingSettings {
/* set object scale */
float object_distance; /* distance between two bundles used for object scaling */
+
+ int pad3;
} MovieTrackingSettings;
typedef struct MovieTrackingStabilization {
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index 3dc0e7c37e4..5339ee58acf 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -4747,8 +4747,15 @@ ParameterList *RNA_parameter_list_create(ParameterList *parms, PointerRNA *UNUSE
break;
case PROP_STRING: {
const char *defvalue= ((StringPropertyRNA*)parm)->defaultvalue;
- if(defvalue && defvalue[0])
+ if(defvalue && defvalue[0]) {
+ /* causes bug [#29988], possibly this is only correct for thick wrapped
+ * need to look further into it - campbell */
+#if 0
BLI_strncpy(data, defvalue, size);
+#else
+ memcpy(data, &defvalue, size);
+#endif
+ }
break;
}
case PROP_POINTER:
diff --git a/source/blender/makesrna/intern/rna_scene_api.c b/source/blender/makesrna/intern/rna_scene_api.c
index 14e518da4b5..153317fb687 100644
--- a/source/blender/makesrna/intern/rna_scene_api.c
+++ b/source/blender/makesrna/intern/rna_scene_api.c
@@ -57,6 +57,7 @@ static void rna_Scene_frame_set(Scene *scene, int frame, float subframe)
CLAMP(scene->r.cfra, MINAFRAME, MAXFRAME);
scene_update_for_newframe(G.main, scene, (1<<20) - 1);
+ scene_camera_switch_update(scene);
/* cant use NC_SCENE|ND_FRAME because this casues wm_event_do_notifiers to call
* scene_update_for_newframe which will loose any un-keyed changes [#24690] */
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index d7f1c375a21..571fe05238d 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -2375,6 +2375,11 @@ static void rna_def_space_time(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Show Frame Number Indicator", "Show frame number beside the current frame indicator line");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, NULL);
+ prop= RNA_def_property(srna, "show_seconds", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", TIME_DRAWFRAMES);
+ RNA_def_property_ui_text(prop, "Show Seconds", "Show timing in seconds not frames");
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TIME, NULL);
+
/* displaying cache status */
prop= RNA_def_property(srna, "show_cache", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "cache_display", TIME_CACHE_DISPLAY);
@@ -2895,6 +2900,12 @@ static void rna_def_space_clip(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", SC_LOCK_SELECTION);
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CLIP, "rna_SpaceClipEditor_lock_selection_update");
+ /* lock to time cursor */
+ prop= RNA_def_property(srna, "lock_time_cursor", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_ui_text(prop, "Lock to Time Cursor", "Lock curves view to time cursos during playback and tracking");
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SC_LOCK_TIMECURSOR);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CLIP, NULL);
+
/* show markers pathes */
prop= RNA_def_property(srna, "show_track_path", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SC_SHOW_TRACK_PATH);
diff --git a/source/blender/makesrna/intern/rna_tracking.c b/source/blender/makesrna/intern/rna_tracking.c
index 5573ceccf8f..993c0ca0bde 100644
--- a/source/blender/makesrna/intern/rna_tracking.c
+++ b/source/blender/makesrna/intern/rna_tracking.c
@@ -639,6 +639,26 @@ static void rna_def_trackingSettings(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_tracking_defaultSettings_searchUpdate");
RNA_def_property_ui_text(prop, "Search Size", "Size of search area for newly created tracks");
+ /* use_red_channel */
+ prop= RNA_def_property(srna, "use_default_red_channel", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "default_flag", TRACK_DISABLE_RED);
+ RNA_def_property_ui_text(prop, "Use Red Channel", "Use red channel from footage for tracking");
+ RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, NULL);
+
+ /* use_green_channel */
+ prop= RNA_def_property(srna, "use_default_green_channel", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "default_flag", TRACK_DISABLE_GREEN);
+ RNA_def_property_ui_text(prop, "Use Green Channel", "Use green channel from footage for tracking");
+ RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, NULL);
+
+ /* use_blue_channel */
+ prop= RNA_def_property(srna, "use_default_blue_channel", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "default_flag", TRACK_DISABLE_BLUE);
+ RNA_def_property_ui_text(prop, "Use Blue Channel", "Use blue channel from footage for tracking");
+ RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, NULL);
+
+ /* ** object tracking ** */
+
/* object distance */
prop= RNA_def_property(srna, "object_distance", PROP_FLOAT, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
diff --git a/source/blender/modifiers/intern/MOD_cloth.c b/source/blender/modifiers/intern/MOD_cloth.c
index 6c9bbd11e9c..7e46d3f0fe3 100644
--- a/source/blender/modifiers/intern/MOD_cloth.c
+++ b/source/blender/modifiers/intern/MOD_cloth.c
@@ -67,11 +67,10 @@ static void initData(ModifierData *md)
cloth_init (clmd);
}
-static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
- DerivedMesh *dm,
- int UNUSED(useRenderParams),
- int UNUSED(isFinalCalc))
+static void deformVerts(ModifierData *md, Object *ob, DerivedMesh *derivedData, float (*vertexCos)[3],
+ int UNUSED(numVerts), int UNUSED(useRenderParams), int UNUSED(isFinalCalc))
{
+ DerivedMesh *dm;
ClothModifierData *clmd = (ClothModifierData*) md;
DerivedMesh *result=NULL;
@@ -79,19 +78,22 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
if(!clmd->sim_parms || !clmd->coll_parms)
{
initData(md);
-
+
if(!clmd->sim_parms || !clmd->coll_parms)
- return dm;
+ return;
}
- result = clothModifier_do(clmd, md->scene, ob, dm);
+ dm = get_dm(ob, NULL, derivedData, NULL, 0);
- if(result)
- {
- CDDM_calc_normals(result);
- return result;
+ clothModifier_do(clmd, md->scene, ob, dm, vertexCos);
+
+ if(result) {
+ result->getVertCos(result, vertexCos);
+ result->release(result);
}
- return dm;
+
+ if(dm != derivedData)
+ dm->release(dm);
}
static void updateDepgraph(
@@ -206,17 +208,17 @@ ModifierTypeInfo modifierType_Cloth = {
/* name */ "Cloth",
/* structName */ "ClothModifierData",
/* structSize */ sizeof(ClothModifierData),
- /* type */ eModifierTypeType_Nonconstructive,
+ /* type */ eModifierTypeType_OnlyDeform,
/* flags */ eModifierTypeFlag_AcceptsMesh
| eModifierTypeFlag_UsesPointCache
| eModifierTypeFlag_Single,
/* copyData */ copyData,
- /* deformVerts */ NULL,
+ /* deformVerts */ deformVerts,
/* deformMatrices */ NULL,
/* deformVertsEM */ NULL,
/* deformMatricesEM */ NULL,
- /* applyModifier */ applyModifier,
+ /* applyModifier */ NULL,
/* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index f585912c18c..604ba189dcf 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -1894,6 +1894,7 @@ static void validate_render_settings(Render *re)
if(RE_engine_is_external(re)) {
/* not supported yet */
re->r.scemode &= ~(R_EXR_TILE_FILE|R_FULL_SAMPLE);
+ re->r.mode &= ~R_FIELDS;
}
}