From 9f51785c4d0038d24fed473dc1d803458f838884 Mon Sep 17 00:00:00 2001 From: Miika Hamalainen Date: Wed, 16 Nov 2011 18:32:28 +0000 Subject: Dynamic Paint: * Wave simulation speed doesn't anymore depend on surface size, but uses relative distances instead. This change will likely change simulation behavior on existing saves, but can be easily tweaked back using the "Wave Speed" parameter. * Added a new wave brush type, "Depth Change". It uses the change of brush intersection between frames, giving a better looking "wake" for moving objects. It also doesn't leave any "dent" to the surface while remaining still. --- source/blender/blenkernel/BKE_dynamicpaint.h | 2 ++ source/blender/blenkernel/intern/dynamicpaint.c | 36 +++++++++++++++++------ source/blender/makesdna/DNA_dynamicpaint_types.h | 1 + source/blender/makesrna/intern/rna_dynamicpaint.c | 7 +++-- 4 files changed, 34 insertions(+), 12 deletions(-) diff --git a/source/blender/blenkernel/BKE_dynamicpaint.h b/source/blender/blenkernel/BKE_dynamicpaint.h index a4a810ba177..75b3c5b4f24 100644 --- a/source/blender/blenkernel/BKE_dynamicpaint.h +++ b/source/blender/blenkernel/BKE_dynamicpaint.h @@ -46,6 +46,7 @@ typedef struct PaintWavePoint { float height; float velocity; + float brush_isect; short state; } PaintWavePoint; @@ -82,6 +83,7 @@ void dynamicPaint_outputSurfaceImage(struct DynamicPaintSurface *surface, char* #define DPAINT_PAINT_NEW 2 /* PaintWavePoint state */ +#define DPAINT_WAVE_ISECT_CHANGED -1 #define DPAINT_WAVE_NONE 0 #define DPAINT_WAVE_OBSTACLE 1 #define DPAINT_WAVE_REFLECT_ONLY 2 diff --git a/source/blender/blenkernel/intern/dynamicpaint.c b/source/blender/blenkernel/intern/dynamicpaint.c index 522aed439aa..7634d694150 100644 --- a/source/blender/blenkernel/intern/dynamicpaint.c +++ b/source/blender/blenkernel/intern/dynamicpaint.c @@ -98,7 +98,8 @@ static int neighY[8] = {0,1,1, 1, 0,-1,-1,-1}; /* paint effect default movement per frame in global units */ #define EFF_MOVEMENT_PER_FRAME 0.05f /* initial wave time factor */ -#define WAVE_TIME_FAC 0.1 +#define WAVE_TIME_FAC (1.0f/24.f) +#define WAVE_INIT_SIZE 5.0f /* drying limits */ #define MIN_WETNESS 0.001f /* dissolve macro */ @@ -149,6 +150,7 @@ typedef struct PaintBakeData { int *s_num; /* num of realCoord samples */ Vec3f *realCoord; /* current pixel center world-space coordinates for each sample * ordered as (s_pos+s_num)*/ + Bounds3D mesh_bounds; /* adjacency info */ BakeNeighPoint *bNeighs; /* current global neighbour distances and directions, if required */ @@ -969,7 +971,7 @@ struct DynamicPaintSurface *dynamicPaint_createNewSurface(DynamicPaintCanvasSett surface->color_spread_speed = 1.0f; surface->shrink_speed = 1.0f; - surface->wave_damping = 0.05f; + surface->wave_damping = 0.04f; surface->wave_speed = 1.0f; surface->wave_timescale = 1.0f; surface->wave_spring = 0.20f; @@ -1037,6 +1039,7 @@ int dynamicPaint_createType(struct DynamicPaintModifierData *pmd, int type, stru brush->particle_radius = 0.2f; brush->particle_smooth = 0.05f; + brush->wave_type = MOD_DPAINT_WAVEB_CHANGE; brush->wave_factor = 1.0f; brush->wave_clamp = 0.0f; brush->smudge_strength = 0.3f; @@ -2070,7 +2073,6 @@ int dynamicPaint_createUVSurface(DynamicPaintSurface *surface) PaintUVPoint *tempPoints = NULL; Vec3f *tempWeights = NULL; - /* MVert *mvert = NULL; */ /* UNUSED */ MFace *mface = NULL; MTFace *tface = NULL; Bounds2D *faceBB = NULL; @@ -2081,7 +2083,6 @@ int dynamicPaint_createUVSurface(DynamicPaintSurface *surface) if (surface->format != MOD_DPAINT_SURFACE_F_IMAGESEQ) return setError(canvas, "Can't bake non-\"image sequence\" formats."); numOfFaces = dm->getNumFaces(dm); - /* mvert = dm->getVertArray(dm); */ /* UNUSED */ mface = dm->getFaceArray(dm); /* get uv layer */ @@ -2859,7 +2860,12 @@ static void dynamicPaint_mixPaintColors(DynamicPaintSurface *surface, int index, /* applies given brush intersection value for wave surface */ static void dynamicPaint_mixWaveHeight(PaintWavePoint *wPoint, DynamicPaintBrushSettings *brush, float isect_height) { + float isect_change = isect_height - wPoint->brush_isect; int hit = 0; + /* intersection marked regardless of brush type or hit */ + wPoint->brush_isect = isect_height; + wPoint->state = DPAINT_WAVE_ISECT_CHANGED; + isect_height *= brush->wave_factor; /* determine hit depending on wave_factor */ @@ -2878,6 +2884,10 @@ static void dynamicPaint_mixWaveHeight(PaintWavePoint *wPoint, DynamicPaintBrush wPoint->velocity = isect_height; else if (brush->wave_type == MOD_DPAINT_WAVEB_REFLECT) wPoint->state = DPAINT_WAVE_REFLECT_ONLY; + else if (brush->wave_type == MOD_DPAINT_WAVEB_CHANGE) { + if (isect_change < 0.0f) + wPoint->height += isect_change*brush->wave_factor; + } } } @@ -4292,6 +4302,9 @@ void dynamicPaint_doWaveStep(DynamicPaintSurface *surface, float timescale) float dt, min_dist, damp_factor; float wave_speed = surface->wave_speed; double average_dist = 0.0f; + Bounds3D *mb = &sData->bData->mesh_bounds; + float canvas_size = MAX3((mb->max[0]-mb->min[0]), (mb->max[1]-mb->min[1]), (mb->max[2]-mb->min[2])); + float wave_scale = WAVE_INIT_SIZE/canvas_size; /* allocate memory */ PaintWavePoint *prevPoint = MEM_mallocN(sData->total_points*sizeof(PaintWavePoint), "Temp previous points for wave simulation"); @@ -4307,11 +4320,11 @@ void dynamicPaint_doWaveStep(DynamicPaintSurface *surface, float timescale) average_dist += bNeighs[sData->adj_data->n_index[index]+i].dist; } } - average_dist /= sData->adj_data->total_targets; + average_dist *= wave_scale/sData->adj_data->total_targets; /* determine number of required steps */ steps = (int)ceil((WAVE_TIME_FAC*timescale*surface->wave_timescale) / (average_dist/wave_speed/3)); - CLAMP(steps, 1, 15); + CLAMP(steps, 1, 20); timescale /= steps; /* apply simulation values for final timescale */ @@ -4332,12 +4345,12 @@ void dynamicPaint_doWaveStep(DynamicPaintSurface *surface, float timescale) int numOfN = 0, numOfRN = 0; int i; - if (wPoint->state) continue; + if (wPoint->state > 0) continue; /* calculate force from surrounding points */ for (i=0; iadj_data->n_index[index]+i; - float dist = bNeighs[n_index].dist; + float dist = bNeighs[n_index].dist*wave_scale; PaintWavePoint *tPoint = &prevPoint[sData->adj_data->n_target[n_index]]; if (!dist || tPoint->state>0) continue; @@ -4381,6 +4394,10 @@ void dynamicPaint_doWaveStep(DynamicPaintSurface *surface, float timescale) #pragma omp parallel for schedule(static) for (index = 0; index < sData->total_points; index++) { PaintWavePoint *wPoint = &((PaintWavePoint*)sData->type_data)[index]; + /* if there wasnt any brush intersection, clear isect height */ + if (wPoint->state == DPAINT_WAVE_NONE) { + wPoint->brush_isect = 0.0f; + } wPoint->state = DPAINT_WAVE_NONE; } @@ -4594,10 +4611,11 @@ static int dynamicPaint_generateBakeData(DynamicPaintSurface *surface, Scene *sc /* * Make a transformed copy of canvas derived mesh vertices to avoid recalculation. */ - #pragma omp parallel for schedule(static) + bData->mesh_bounds.valid = 0; for (index=0; indexobmat, canvas_verts[index].v); + boundInsert(&bData->mesh_bounds, canvas_verts[index].v); } /* diff --git a/source/blender/makesdna/DNA_dynamicpaint_types.h b/source/blender/makesdna/DNA_dynamicpaint_types.h index 22a0462985c..fdfd1e2b754 100644 --- a/source/blender/makesdna/DNA_dynamicpaint_types.h +++ b/source/blender/makesdna/DNA_dynamicpaint_types.h @@ -169,6 +169,7 @@ typedef struct DynamicPaintCanvasSettings { #define MOD_DPAINT_WAVEB_DEPTH 0 /* use intersection depth */ #define MOD_DPAINT_WAVEB_FORCE 1 /* act as a force on intersection area */ #define MOD_DPAINT_WAVEB_REFLECT 2 /* obstacle that reflects waves */ +#define MOD_DPAINT_WAVEB_CHANGE 3 /* use change of intersection depth from previous frame */ /* brush ray_dir */ #define MOD_DPAINT_RAY_CANVAS 0 diff --git a/source/blender/makesrna/intern/rna_dynamicpaint.c b/source/blender/makesrna/intern/rna_dynamicpaint.c index 10042f5392a..893993794ba 100644 --- a/source/blender/makesrna/intern/rna_dynamicpaint.c +++ b/source/blender/makesrna/intern/rna_dynamicpaint.c @@ -623,8 +623,8 @@ static void rna_def_canvas_surface(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Damping", "Wave damping factor"); prop= RNA_def_property(srna, "wave_speed", PROP_FLOAT, PROP_NONE); - RNA_def_property_range(prop, 0.01, 3.0); - RNA_def_property_ui_range(prop, 0.01, 1.5, 1, 2); + RNA_def_property_range(prop, 0.01, 5.0); + RNA_def_property_ui_range(prop, 0.20, 4.0, 1, 2); RNA_def_property_ui_text(prop, "Speed", "Wave propogation speed"); prop= RNA_def_property(srna, "wave_timescale", PROP_FLOAT, PROP_NONE); @@ -696,6 +696,7 @@ static void rna_def_dynamic_paint_brush_settings(BlenderRNA *brna) {0, NULL, 0, NULL, NULL}}; static EnumPropertyItem prop_dynamicpaint_brush_wave_type[] = { + {MOD_DPAINT_WAVEB_CHANGE, "CHANGE", 0, "Depth Change", ""}, {MOD_DPAINT_WAVEB_DEPTH, "DEPTH", 0, "Obstacle", ""}, {MOD_DPAINT_WAVEB_FORCE, "FORCE", 0, "Force", ""}, {MOD_DPAINT_WAVEB_REFLECT, "REFLECT", 0, "Reflect Only", ""}, @@ -758,7 +759,7 @@ static void rna_def_dynamic_paint_brush_settings(BlenderRNA *brna) prop= RNA_def_property(srna, "wave_type", PROP_ENUM, PROP_NONE); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_enum_items(prop, prop_dynamicpaint_brush_wave_type); - RNA_def_property_ui_text(prop, "Brush Effect", ""); + RNA_def_property_ui_text(prop, "Wave Type", ""); prop= RNA_def_property(srna, "wave_factor", PROP_FLOAT, PROP_NONE); RNA_def_property_range(prop, -2.0, 2.0); -- cgit v1.2.3 From 9b17d39ce031cb89a3e4ea8cbdd0bceb4612871d Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 16 Nov 2011 19:22:14 +0000 Subject: Fix #29260: Missing "Extend" parameter for Border Select Added "Extend" flag to border select operators for editors: - UV Editor - Sequencer - NLA - Info Space - Graph Editor - File Browser - Clip Editor - Action Editor - Channels and markers regions Can be used for custom keymaps. --- .../blender/editors/animation/anim_channels_edit.c | 11 ++++++++--- source/blender/editors/animation/anim_markers.c | 6 +++++- source/blender/editors/space_action/action_select.c | 9 +++++++-- source/blender/editors/space_clip/tracking_ops.c | 16 +++++++++++----- source/blender/editors/space_file/file_ops.c | 11 +++++++++-- source/blender/editors/space_graph/graph_select.c | 10 ++++++++-- source/blender/editors/space_info/info_report.c | 13 ++++++++++++- source/blender/editors/space_nla/nla_select.c | 10 ++++++++-- source/blender/editors/space_node/node_select.c | 6 +++++- .../editors/space_sequencer/sequencer_select.c | 7 ++++++- source/blender/editors/uvedit/uvedit_ops.c | 20 ++++++++++++++++---- 11 files changed, 95 insertions(+), 24 deletions(-) diff --git a/source/blender/editors/animation/anim_channels_edit.c b/source/blender/editors/animation/anim_channels_edit.c index b4a86e5d74c..8c699c840dc 100644 --- a/source/blender/editors/animation/anim_channels_edit.c +++ b/source/blender/editors/animation/anim_channels_edit.c @@ -1917,7 +1917,7 @@ static int animchannels_borderselect_exec(bContext *C, wmOperator *op) bAnimContext ac; rcti rect; short selectmode=0; - int gesture_mode; + int gesture_mode, extend; /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) @@ -1928,8 +1928,13 @@ static int animchannels_borderselect_exec(bContext *C, wmOperator *op) rect.ymin= RNA_int_get(op->ptr, "ymin"); rect.xmax= RNA_int_get(op->ptr, "xmax"); rect.ymax= RNA_int_get(op->ptr, "ymax"); - + gesture_mode= RNA_int_get(op->ptr, "gesture_mode"); + extend= RNA_boolean_get(op->ptr, "extend"); + + if(!extend) + ANIM_deselect_anim_channels(&ac, ac.data, ac.datatype, 1, ACHANNEL_SETFLAG_CLEAR); + if (gesture_mode == GESTURE_MODAL_SELECT) selectmode = ACHANNEL_SETFLAG_ADD; else @@ -1963,7 +1968,7 @@ static void ANIM_OT_channels_select_border(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* rna */ - WM_operator_properties_gesture_border(ot, FALSE); + WM_operator_properties_gesture_border(ot, TRUE); } /* ******************* Rename Operator ***************************** */ diff --git a/source/blender/editors/animation/anim_markers.c b/source/blender/editors/animation/anim_markers.c index aa1af231afd..cc1fae170d0 100644 --- a/source/blender/editors/animation/anim_markers.c +++ b/source/blender/editors/animation/anim_markers.c @@ -1147,6 +1147,7 @@ static int ed_marker_border_select_exec(bContext *C, wmOperator *op) int xmax= RNA_int_get(op->ptr, "xmax"); int ymin= RNA_int_get(op->ptr, "ymin"); int ymax= RNA_int_get(op->ptr, "ymax"); + int extend= RNA_boolean_get(op->ptr, "extend"); UI_view2d_region_to_view(v2d, xmin, ymin, &xminf, &yminf); UI_view2d_region_to_view(v2d, xmax, ymax, &xmaxf, &ymaxf); @@ -1166,6 +1167,9 @@ static int ed_marker_border_select_exec(bContext *C, wmOperator *op) break; } } + else if (!extend) { + marker->flag &= ~SELECT; + } } WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL); @@ -1198,7 +1202,7 @@ static void MARKER_OT_select_border(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* rna */ - WM_operator_properties_gesture_border(ot, FALSE); + WM_operator_properties_gesture_border(ot, TRUE); } /* *********************** (de)select all ***************** */ diff --git a/source/blender/editors/space_action/action_select.c b/source/blender/editors/space_action/action_select.c index f717b827a7e..1382d58482d 100644 --- a/source/blender/editors/space_action/action_select.c +++ b/source/blender/editors/space_action/action_select.c @@ -269,11 +269,16 @@ static int actkeys_borderselect_exec(bContext *C, wmOperator *op) bAnimContext ac; rcti rect; short mode=0, selectmode=0; - int gesture_mode; + int gesture_mode, extend; /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; + + /* clear all selection if not extending selection */ + extend= RNA_boolean_get(op->ptr, "extend"); + if (!extend) + deselect_action_keys(&ac, 1, SELECT_SUBTRACT); /* get settings from operator */ rect.xmin= RNA_int_get(op->ptr, "xmin"); @@ -330,7 +335,7 @@ void ACTION_OT_select_border(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* rna */ - WM_operator_properties_gesture_border(ot, FALSE); + WM_operator_properties_gesture_border(ot, TRUE); ot->prop= RNA_def_boolean(ot->srna, "axis_range", 0, "Axis Range", ""); } diff --git a/source/blender/editors/space_clip/tracking_ops.c b/source/blender/editors/space_clip/tracking_ops.c index 7791e9f3e57..7ef7e69c143 100644 --- a/source/blender/editors/space_clip/tracking_ops.c +++ b/source/blender/editors/space_clip/tracking_ops.c @@ -869,7 +869,7 @@ static int border_select_exec(bContext *C, wmOperator *op) MovieTrackingTrack *track; rcti rect; rctf rectf; - int change= 0, mode; + int change= 0, mode, extend; /* get rectangle from operator */ rect.xmin= RNA_int_get(op->ptr, "xmin"); @@ -881,6 +881,7 @@ static int border_select_exec(bContext *C, wmOperator *op) ED_clip_point_stable_pos(C, rect.xmax, rect.ymax, &rectf.xmax, &rectf.ymax); mode= RNA_int_get(op->ptr, "gesture_mode"); + extend= RNA_boolean_get(op->ptr, "extend"); /* do actual selection */ track= clip->tracking.tracks.first; @@ -888,8 +889,13 @@ static int border_select_exec(bContext *C, wmOperator *op) if((track->flag&TRACK_HIDDEN)==0) { MovieTrackingMarker *marker= BKE_tracking_get_marker(track, sc->user.framenr); - if(MARKER_VISIBLE(sc, marker) && BLI_in_rctf(&rectf, marker->pos[0], marker->pos[1])) { - BKE_tracking_track_flag(track, TRACK_AREA_ALL, SELECT, mode!=GESTURE_MODAL_SELECT); + if(MARKER_VISIBLE(sc, marker)) { + if(BLI_in_rctf(&rectf, marker->pos[0], marker->pos[1])) { + BKE_tracking_track_flag(track, TRACK_AREA_ALL, SELECT, mode!=GESTURE_MODAL_SELECT); + } + else if(!extend) { + BKE_tracking_track_flag(track, TRACK_AREA_ALL, SELECT, 1); + } change= 1; } @@ -921,10 +927,10 @@ void CLIP_OT_select_border(wmOperatorType *ot) ot->poll= ED_space_clip_poll; /* flags */ - ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + ot->flag= OPTYPE_UNDO; /* properties */ - WM_operator_properties_gesture_border(ot, FALSE); + WM_operator_properties_gesture_border(ot, TRUE); } /********************** circle select operator *********************/ diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c index d6bab41f719..69c192b077b 100644 --- a/source/blender/editors/space_file/file_ops.c +++ b/source/blender/editors/space_file/file_ops.c @@ -273,13 +273,20 @@ static int file_border_select_exec(bContext *C, wmOperator *op) ARegion *ar= CTX_wm_region(C); rcti rect; FileSelect ret; - + int extend= RNA_boolean_get(op->ptr, "extend"); short select= (RNA_int_get(op->ptr, "gesture_mode")==GESTURE_MODAL_SELECT); + rect.xmin= RNA_int_get(op->ptr, "xmin"); rect.ymin= RNA_int_get(op->ptr, "ymin"); rect.xmax= RNA_int_get(op->ptr, "xmax"); rect.ymax= RNA_int_get(op->ptr, "ymax"); + if(!extend) { + SpaceFile *sfile= CTX_wm_space_file(C); + + file_deselect_all(sfile, SELECTED_FILE); + } + BLI_isect_rcti(&(ar->v2d.mask), &rect, &rect); ret = file_select(C, &rect, select ? FILE_SEL_ADD : FILE_SEL_REMOVE, 0); @@ -306,7 +313,7 @@ void FILE_OT_select_border(wmOperatorType *ot) ot->cancel= WM_border_select_cancel; /* rna */ - WM_operator_properties_gesture_border(ot, 0); + WM_operator_properties_gesture_border(ot, 1); } static int file_select_invoke(bContext *C, wmOperator *op, wmEvent *event) diff --git a/source/blender/editors/space_graph/graph_select.c b/source/blender/editors/space_graph/graph_select.c index 9fb880e0bc6..2ba79ee230a 100644 --- a/source/blender/editors/space_graph/graph_select.c +++ b/source/blender/editors/space_graph/graph_select.c @@ -289,11 +289,17 @@ static int graphkeys_borderselect_exec(bContext *C, wmOperator *op) rcti rect; short mode=0, selectmode=0; short incl_handles; + int extend; /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + + /* clear all selection if not extending selection */ + extend= RNA_boolean_get(op->ptr, "extend"); + if (!extend) + deselect_graph_keys(&ac, 1, SELECT_SUBTRACT, TRUE); + /* get select mode * - 'gesture_mode' from the operator specifies how to select * - 'include_handles' from the operator specifies whether to include handles in the selection @@ -354,7 +360,7 @@ void GRAPH_OT_select_border(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER/*|OPTYPE_UNDO*/; /* rna */ - WM_operator_properties_gesture_border(ot, FALSE); + WM_operator_properties_gesture_border(ot, TRUE); ot->prop= RNA_def_boolean(ot->srna, "axis_range", 0, "Axis Range", ""); RNA_def_boolean(ot->srna, "include_handles", 0, "Include Handles", "Are handles tested individually against the selection criteria"); diff --git a/source/blender/editors/space_info/info_report.c b/source/blender/editors/space_info/info_report.c index eab6cb5402f..206639f064a 100644 --- a/source/blender/editors/space_info/info_report.c +++ b/source/blender/editors/space_info/info_report.c @@ -220,6 +220,7 @@ static int borderselect_exec(bContext *C, wmOperator *op) ARegion *ar= CTX_wm_region(C); ReportList *reports= CTX_wm_reports(C); int report_mask= info_report_mask(sinfo); + int extend= RNA_boolean_get(op->ptr, "extend"); Report *report_min, *report_max, *report; //View2D *v2d= UI_view2d_fromcontext(C); @@ -244,6 +245,16 @@ static int borderselect_exec(bContext *C, wmOperator *op) UI_view2d_region_to_view(v2d, mval[0], mval[1], &rectf.xmax, &rectf.ymax); */ + if(!extend) { + for(report= reports->list.first; report; report= report->next) { + + if((report->type & report_mask)==0) + continue; + + report->flag &= ~SELECT; + } + } + report_min= info_text_pick(sinfo, ar, reports, rect.ymax); report_max= info_text_pick(sinfo, ar, reports, rect.ymin); @@ -308,7 +319,7 @@ void INFO_OT_select_border(wmOperatorType *ot) /* ot->flag= OPTYPE_REGISTER; */ /* rna */ - WM_operator_properties_gesture_border(ot, FALSE); + WM_operator_properties_gesture_border(ot, TRUE); } diff --git a/source/blender/editors/space_nla/nla_select.c b/source/blender/editors/space_nla/nla_select.c index 49340b31b47..0cb48582bc9 100644 --- a/source/blender/editors/space_nla/nla_select.c +++ b/source/blender/editors/space_nla/nla_select.c @@ -282,11 +282,17 @@ static int nlaedit_borderselect_exec(bContext *C, wmOperator *op) bAnimContext ac; rcti rect; short mode=0, selectmode=0; + int extend; /* get editor data */ if (ANIM_animdata_get_context(C, &ac) == 0) return OPERATOR_CANCELLED; - + + /* clear all selection if not extending selection */ + extend= RNA_boolean_get(op->ptr, "extend"); + if (!extend) + deselect_nla_strips(&ac, DESELECT_STRIPS_TEST, SELECT_SUBTRACT); + /* get settings from operator */ rect.xmin= RNA_int_get(op->ptr, "xmin"); rect.ymin= RNA_int_get(op->ptr, "ymin"); @@ -341,7 +347,7 @@ void NLA_OT_select_border(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* rna */ - WM_operator_properties_gesture_border(ot, 0); + WM_operator_properties_gesture_border(ot, 1); RNA_def_boolean(ot->srna, "axis_range", 0, "Axis Range", ""); } diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c index 593beedc765..c863efada9f 100644 --- a/source/blender/editors/space_node/node_select.c +++ b/source/blender/editors/space_node/node_select.c @@ -164,6 +164,7 @@ static int node_borderselect_exec(bContext *C, wmOperator *op) rcti rect; rctf rectf; int gesture_mode= RNA_int_get(op->ptr, "gesture_mode"); + int extend= RNA_boolean_get(op->ptr, "extend"); rect.xmin= RNA_int_get(op->ptr, "xmin"); rect.ymin= RNA_int_get(op->ptr, "ymin"); @@ -180,6 +181,9 @@ static int node_borderselect_exec(bContext *C, wmOperator *op) else node->flag &= ~SELECT; } + else if(!extend) { + node->flag &= ~SELECT; + } } node_sort(snode->edittree); @@ -228,7 +232,7 @@ void NODE_OT_select_border(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* rna */ - WM_operator_properties_gesture_border(ot, FALSE); + WM_operator_properties_gesture_border(ot, TRUE); RNA_def_boolean(ot->srna, "tweak", 0, "Tweak", "Only activate when mouse is not over a node - useful for tweak gesture"); } diff --git a/source/blender/editors/space_sequencer/sequencer_select.c b/source/blender/editors/space_sequencer/sequencer_select.c index d749371a636..9eb900ed427 100644 --- a/source/blender/editors/space_sequencer/sequencer_select.c +++ b/source/blender/editors/space_sequencer/sequencer_select.c @@ -827,6 +827,7 @@ static int sequencer_borderselect_exec(bContext *C, wmOperator *op) rcti rect; rctf rectf, rq; short selecting = (RNA_int_get(op->ptr, "gesture_mode")==GESTURE_MODAL_SELECT); + int extend = RNA_boolean_get(op->ptr, "extend"); int mval[2]; if(ed==NULL) @@ -852,6 +853,10 @@ static int sequencer_borderselect_exec(bContext *C, wmOperator *op) else seq->flag &= ~SEQ_ALLSEL; recurs_sel_seq(seq); } + else if(!extend) { + seq->flag &= ~SEQ_ALLSEL; + recurs_sel_seq(seq); + } } WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER|NA_SELECTED, scene); @@ -880,7 +885,7 @@ void SEQUENCER_OT_select_border(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* rna */ - WM_operator_properties_gesture_border(ot, FALSE); + WM_operator_properties_gesture_border(ot, TRUE); } /* ****** Selected Grouped ****** */ diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c index 173ab809b53..7fc878de3f9 100644 --- a/source/blender/editors/uvedit/uvedit_ops.c +++ b/source/blender/editors/uvedit/uvedit_ops.c @@ -1490,7 +1490,7 @@ static void UV_OT_stitch(wmOperatorType *ot) /* ******************** (de)select all operator **************** */ -static int select_all_exec(bContext *C, wmOperator *op) +static void select_all_perform(bContext *C, int action) { Scene *scene; ToolSettings *ts; @@ -1499,7 +1499,6 @@ static int select_all_exec(bContext *C, wmOperator *op) EditFace *efa; Image *ima; MTFace *tf; - int action = RNA_enum_get(op->ptr, "action"); scene= CTX_data_scene(C); ts= CTX_data_tool_settings(C); @@ -1560,6 +1559,15 @@ static int select_all_exec(bContext *C, wmOperator *op) } } } +} + +static int select_all_exec(bContext *C, wmOperator *op) +{ + Object *obedit= CTX_data_edit_object(C); + EditMesh *em= BKE_mesh_get_editmesh((Mesh*)obedit->data); + int action= RNA_enum_get(op->ptr, "action"); + + select_all_perform(C, action); WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data); @@ -2275,7 +2283,7 @@ static int border_select_exec(bContext *C, wmOperator *op) MTFace *tface; rcti rect; rctf rectf; - int change, pinned, select, faces; + int change, pinned, select, faces, extend; /* get rectangle from operator */ rect.xmin= RNA_int_get(op->ptr, "xmin"); @@ -2289,6 +2297,10 @@ static int border_select_exec(bContext *C, wmOperator *op) /* figure out what to select/deselect */ select= (RNA_int_get(op->ptr, "gesture_mode") == GESTURE_MODAL_SELECT); pinned= RNA_boolean_get(op->ptr, "pinned"); + extend= RNA_boolean_get(op->ptr, "extend"); + + if(!extend) + select_all_perform(C, SEL_DESELECT); if(ts->uv_flag & UV_SYNC_SELECTION) faces= (ts->selectmode == SCE_SELECT_FACE); @@ -2411,7 +2423,7 @@ static void UV_OT_select_border(wmOperatorType *ot) /* properties */ RNA_def_boolean(ot->srna, "pinned", 0, "Pinned", "Border select pinned UVs only"); - WM_operator_properties_gesture_border(ot, FALSE); + WM_operator_properties_gesture_border(ot, TRUE); } /* ******************** circle select operator **************** */ -- cgit v1.2.3 From 3dcc9aef9685388255d4cf9d646830d573aeb932 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 16 Nov 2011 19:31:42 +0000 Subject: merge mempool changes from bmesh (adds mempool iterator). --- source/blender/blenkernel/intern/BME_Customdata.c | 2 +- source/blender/blenkernel/intern/BME_mesh.c | 8 +- source/blender/blenkernel/intern/customdata.c | 2 +- source/blender/blenlib/BLI_mempool.h | 43 ++++++- source/blender/blenlib/intern/BLI_ghash.c | 2 +- source/blender/blenlib/intern/BLI_mempool.c | 141 ++++++++++++++++++---- source/blender/imbuf/intern/moviecache.c | 6 +- 7 files changed, 168 insertions(+), 36 deletions(-) diff --git a/source/blender/blenkernel/intern/BME_Customdata.c b/source/blender/blenkernel/intern/BME_Customdata.c index 8a6426eb3d5..67215b5e40f 100644 --- a/source/blender/blenkernel/intern/BME_Customdata.c +++ b/source/blender/blenkernel/intern/BME_Customdata.c @@ -86,7 +86,7 @@ void BME_CD_Create(BME_CustomData *data, BME_CustomDataInit *init, int initalloc if(data->totlayer){ /*alloc memory*/ data->layers = MEM_callocN(sizeof(BME_CustomDataLayer)*data->totlayer, "BMesh Custom Data Layers"); - data->pool = BLI_mempool_create(data->totsize, initalloc, initalloc, 0); + data->pool = BLI_mempool_create(data->totsize, initalloc, initalloc, FALSE, FALSE); /*initialize layer data*/ for(i=0; i < BME_CD_NUMTYPES; i++){ if(init->layout[i]){ diff --git a/source/blender/blenkernel/intern/BME_mesh.c b/source/blender/blenkernel/intern/BME_mesh.c index 1b5761fb94e..cda66de6f22 100644 --- a/source/blender/blenkernel/intern/BME_mesh.c +++ b/source/blender/blenkernel/intern/BME_mesh.c @@ -55,10 +55,10 @@ BME_Mesh *BME_make_mesh(int allocsize[4]) /*allocate the structure*/ BME_Mesh *bm = MEM_callocN(sizeof(BME_Mesh),"BMesh"); /*allocate the memory pools for the mesh elements*/ - bm->vpool = BLI_mempool_create(sizeof(BME_Vert), allocsize[0], allocsize[0], 0); - bm->epool = BLI_mempool_create(sizeof(BME_Edge), allocsize[1], allocsize[1], 0); - bm->lpool = BLI_mempool_create(sizeof(BME_Loop), allocsize[2], allocsize[2], 0); - bm->ppool = BLI_mempool_create(sizeof(BME_Poly), allocsize[3], allocsize[3], 0); + bm->vpool = BLI_mempool_create(sizeof(BME_Vert), allocsize[0], allocsize[0], FALSE, FALSE); + bm->epool = BLI_mempool_create(sizeof(BME_Edge), allocsize[1], allocsize[1], FALSE, FALSE); + bm->lpool = BLI_mempool_create(sizeof(BME_Loop), allocsize[2], allocsize[2], FALSE, FALSE); + bm->ppool = BLI_mempool_create(sizeof(BME_Poly), allocsize[3], allocsize[3], FALSE, FALSE); return bm; } /* diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index d7cc5376e21..9cbed451c09 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -2009,7 +2009,7 @@ void CustomData_from_bmeshpoly(CustomData *fdata, CustomData *pdata, CustomData void CustomData_bmesh_init_pool(CustomData *data, int allocsize){ - if(data->totlayer)data->pool = BLI_mempool_create(data->totsize, allocsize, allocsize, 0); + if(data->totlayer)data->pool = BLI_mempool_create(data->totsize, allocsize, allocsize, FALSE, FALSE); } void CustomData_bmesh_free_block(CustomData *data, void **block) diff --git a/source/blender/blenlib/BLI_mempool.h b/source/blender/blenlib/BLI_mempool.h index 2a81966986f..f98919fadd3 100644 --- a/source/blender/blenlib/BLI_mempool.h +++ b/source/blender/blenlib/BLI_mempool.h @@ -34,12 +34,45 @@ * \brief Simple fast memory allocator. */ +#ifdef __cplusplus +extern "C" +{ +#endif + struct BLI_mempool; +struct BLI_mempool_chunk; + +typedef struct BLI_mempool BLI_mempool; + +/*allow_iter allows iteration on this mempool. note: this requires that the + first four bytes of the elements never contain the character string + 'free'. use with care.*/ -struct BLI_mempool *BLI_mempool_create(int esize, int tote, int pchunk, int use_sysmalloc); -void *BLI_mempool_alloc(struct BLI_mempool *pool); -void *BLI_mempool_calloc(struct BLI_mempool *pool); -void BLI_mempool_free(struct BLI_mempool *pool, void *addr); -void BLI_mempool_destroy(struct BLI_mempool *pool); +BLI_mempool *BLI_mempool_create(int esize, int tote, int pchunk, + short use_sysmalloc, short allow_iter); +void *BLI_mempool_alloc(BLI_mempool *pool); +void *BLI_mempool_calloc(BLI_mempool *pool); +void BLI_mempool_free(BLI_mempool *pool, void *addr); +void BLI_mempool_destroy(BLI_mempool *pool); +int BLI_mempool_count(BLI_mempool *pool); + +/** iteration stuff. note: this may easy to produce bugs with **/ +/*private structure*/ +typedef struct BLI_mempool_iter { + BLI_mempool *pool; + struct BLI_mempool_chunk *curchunk; + int curindex; +} BLI_mempool_iter; + +/*allow iteration on this mempool. note: this requires that the + first four bytes of the elements never contain the character string + 'free'. use with care.*/ +void BLI_mempool_allow_iter(BLI_mempool *pool); +void BLI_mempool_iternew(BLI_mempool *pool, BLI_mempool_iter *iter); +void *BLI_mempool_iterstep(BLI_mempool_iter *iter); + +#ifdef __cplusplus +} +#endif #endif diff --git a/source/blender/blenlib/intern/BLI_ghash.c b/source/blender/blenlib/intern/BLI_ghash.c index 080dc77fc06..c1894088300 100644 --- a/source/blender/blenlib/intern/BLI_ghash.c +++ b/source/blender/blenlib/intern/BLI_ghash.c @@ -60,7 +60,7 @@ GHash *BLI_ghash_new(GHashHashFP hashfp, GHashCmpFP cmpfp, const char *info) { GHash *gh= MEM_mallocN(sizeof(*gh), info); gh->hashfp= hashfp; gh->cmpfp= cmpfp; - gh->entrypool = BLI_mempool_create(sizeof(Entry), 64, 64, 0); + gh->entrypool = BLI_mempool_create(sizeof(Entry), 64, 64, FALSE, FALSE); gh->cursize= 0; gh->nentries= 0; diff --git a/source/blender/blenlib/intern/BLI_mempool.c b/source/blender/blenlib/intern/BLI_mempool.c index 7e79b9f65a1..4e37ac05214 100644 --- a/source/blender/blenlib/intern/BLI_mempool.c +++ b/source/blender/blenlib/intern/BLI_mempool.c @@ -20,7 +20,7 @@ * * The Original Code is: all of this file. * - * Contributor(s): none yet. + * Contributor(s): Geoffery Bantle * * ***** END GPL LICENSE BLOCK ***** */ @@ -29,18 +29,36 @@ * \ingroup bli */ - /* - Simple, fast memory allocator for allocating many elements of the same size. -*/ + * Simple, fast memory allocator for allocating many elements of the same size. + */ + +#include "BLI_utildefines.h" +#include "BLI_listbase.h" + +#include "BLI_mempool.h" /* own include */ + +#include "DNA_listBase.h" #include "MEM_guardedalloc.h" -#include "BLI_blenlib.h" -#include "BLI_mempool.h" -#include + +#include +#include + +/* note: copied from BKE_utildefines.h, dont use here because we're in BLI */ +#ifdef __BIG_ENDIAN__ +/* Big Endian */ +# define MAKE_ID(a,b,c,d) ( (int)(a)<<24 | (int)(b)<<16 | (c)<<8 | (d) ) +#else +/* Little Endian */ +# define MAKE_ID(a,b,c,d) ( (int)(d)<<24 | (int)(c)<<16 | (b)<<8 | (a) ) +#endif + +#define FREEWORD MAKE_ID('f', 'r', 'e', 'e') typedef struct BLI_freenode { struct BLI_freenode *next; + int freeword; /* used to identify this as a freed node */ } BLI_freenode; typedef struct BLI_mempool_chunk { @@ -50,33 +68,42 @@ typedef struct BLI_mempool_chunk { typedef struct BLI_mempool { struct ListBase chunks; - int esize, csize, pchunk; /*size of elements and chunks in bytes and number of elements per chunk*/ - struct BLI_freenode *free; /*free element list. Interleaved into chunk datas.*/ - int totalloc, totused; /*total number of elements allocated in total, and currently in use*/ - int use_sysmalloc; + int esize, csize, pchunk; /* size of elements and chunks in bytes + * and number of elements per chunk*/ + short use_sysmalloc, allow_iter; + /* keeps aligned to 16 bits */ + + BLI_freenode *free; /* free element list. Interleaved into chunk datas.*/ + int totalloc, totused; /* total number of elements allocated in total, + * and currently in use*/ } BLI_mempool; -BLI_mempool *BLI_mempool_create(int esize, int tote, int pchunk, int use_sysmalloc) +#define MEMPOOL_ELEM_SIZE_MIN (sizeof(void *) * 2) + +BLI_mempool *BLI_mempool_create(int esize, int tote, int pchunk, + short use_sysmalloc, short allow_iter) { BLI_mempool *pool = NULL; BLI_freenode *lasttail = NULL, *curnode = NULL; int i,j, maxchunks; char *addr; - - if (esize < sizeof(void*)) - esize = sizeof(void*); - + + if (esize < MEMPOOL_ELEM_SIZE_MIN) + esize = MEMPOOL_ELEM_SIZE_MIN; + /*allocate the pool structure*/ pool = use_sysmalloc ? malloc(sizeof(BLI_mempool)) : MEM_mallocN(sizeof(BLI_mempool), "memory pool"); - pool->esize = esize; + pool->esize = allow_iter ? MAX2(esize, sizeof(BLI_freenode)) : esize; pool->use_sysmalloc = use_sysmalloc; pool->pchunk = pchunk; pool->csize = esize * pchunk; pool->chunks.first = pool->chunks.last = NULL; pool->totused= 0; + pool->allow_iter= allow_iter; maxchunks = tote / pchunk + 1; - + if (maxchunks==0) maxchunks = 1; + /*allocate the actual chunks*/ for (i=0; i < maxchunks; i++) { BLI_mempool_chunk *mpchunk = use_sysmalloc ? malloc(sizeof(BLI_mempool_chunk)) : MEM_mallocN(sizeof(BLI_mempool_chunk), "BLI_Mempool Chunk"); @@ -84,15 +111,30 @@ BLI_mempool *BLI_mempool_create(int esize, int tote, int pchunk, int use_sysmall mpchunk->data = use_sysmalloc ? malloc(pool->csize) : MEM_mallocN(pool->csize, "BLI Mempool Chunk Data"); BLI_addtail(&(pool->chunks), mpchunk); - if (i==0) pool->free = mpchunk->data; /*start of the list*/ + if (i==0) { + pool->free = mpchunk->data; /*start of the list*/ + if (pool->allow_iter) + pool->free->freeword = FREEWORD; + } + /*loop through the allocated data, building the pointer structures*/ for (addr = mpchunk->data, j=0; j < pool->pchunk; j++) { curnode = ((BLI_freenode*)addr); addr += pool->esize; curnode->next = (BLI_freenode*)addr; + if (pool->allow_iter) { + if (j != pool->pchunk-1) + curnode->next->freeword = FREEWORD; + curnode->freeword = FREEWORD; + } } /*final pointer in the previously allocated chunk is wrong.*/ - if (lasttail) lasttail->next = mpchunk->data; + if (lasttail) { + lasttail->next = mpchunk->data; + if (pool->allow_iter) + lasttail->freeword = FREEWORD; + } + /*set the end of this chunks memoryy to the new tail for next iteration*/ lasttail = curnode; @@ -121,10 +163,18 @@ void *BLI_mempool_alloc(BLI_mempool *pool) BLI_addtail(&(pool->chunks), mpchunk); pool->free = mpchunk->data; /*start of the list*/ - for (addr = mpchunk->data, j=0; j < pool->pchunk; j++) { + if (pool->allow_iter) + pool->free->freeword = FREEWORD; + for(addr = mpchunk->data, j=0; j < pool->pchunk; j++){ curnode = ((BLI_freenode*)addr); addr += pool->esize; curnode->next = (BLI_freenode*)addr; + + if (pool->allow_iter) { + curnode->freeword = FREEWORD; + if (j != pool->pchunk-1) + curnode->next->freeword = FREEWORD; + } } curnode->next = NULL; /*terminate the list*/ @@ -132,6 +182,9 @@ void *BLI_mempool_alloc(BLI_mempool *pool) } retval = pool->free; + if (pool->allow_iter) + pool->free->freeword = 0x7FFFFFFF; + pool->free = pool->free->next; //memset(retval, 0, pool->esize); return retval; @@ -149,6 +202,8 @@ void BLI_mempool_free(BLI_mempool *pool, void *addr) { BLI_freenode *newhead = addr; + if (pool->allow_iter) + newhead->freeword = FREEWORD; newhead->next = pool->free; pool->free = newhead; @@ -185,6 +240,50 @@ void BLI_mempool_free(BLI_mempool *pool, void *addr) } } +void BLI_mempool_iternew(BLI_mempool *pool, BLI_mempool_iter *iter) +{ + if (!pool->allow_iter) { + fprintf(stderr, "%s: Error! you can't iterate over this mempool!\n", __func__); + iter->curchunk = NULL; + iter->curindex = 0; + + return; + } + + iter->pool = pool; + iter->curchunk = pool->chunks.first; + iter->curindex = 0; +} + +static void *bli_mempool_iternext(BLI_mempool_iter *iter) +{ + void *ret = NULL; + + if (!iter->curchunk || !iter->pool->totused) return NULL; + + ret = ((char*)iter->curchunk->data) + iter->pool->esize*iter->curindex; + + iter->curindex++; + + if (iter->curindex >= iter->pool->pchunk) { + iter->curchunk = iter->curchunk->next; + iter->curindex = 0; + } + + return ret; +} + +void *BLI_mempool_iterstep(BLI_mempool_iter *iter) +{ + BLI_freenode *ret; + + do { + ret = bli_mempool_iternext(iter); + } while (ret && ret->freeword == FREEWORD); + + return ret; +} + void BLI_mempool_destroy(BLI_mempool *pool) { BLI_mempool_chunk *mpchunk=NULL; diff --git a/source/blender/imbuf/intern/moviecache.c b/source/blender/imbuf/intern/moviecache.c index 41169a1c211..b19b88248f4 100644 --- a/source/blender/imbuf/intern/moviecache.c +++ b/source/blender/imbuf/intern/moviecache.c @@ -204,9 +204,9 @@ struct MovieCache *IMB_moviecache_create(int keysize, GHashHashFP hashfp, GHashC MovieCache *cache; cache= MEM_callocN(sizeof(MovieCache), "MovieCache"); - cache->keys_pool= BLI_mempool_create(sizeof(MovieCacheKey), 64, 64, 0); - cache->items_pool= BLI_mempool_create(sizeof(MovieCacheItem), 64, 64, 0); - cache->userkeys_pool= BLI_mempool_create(keysize, 64, 64, 0); + cache->keys_pool= BLI_mempool_create(sizeof(MovieCacheKey), 64, 64, FALSE, FALSE); + cache->items_pool= BLI_mempool_create(sizeof(MovieCacheItem), 64, 64, FALSE, FALSE); + cache->userkeys_pool= BLI_mempool_create(keysize, 64, 64, FALSE, FALSE); cache->hash= BLI_ghash_new(moviecache_hashhash, moviecache_hashcmp, "MovieClip ImBuf cache hash"); cache->keysize= keysize; -- cgit v1.2.3