diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-01-17 06:20:23 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-01-17 06:20:23 +0400 |
commit | bbe69705a52386ca5b6552d7187b0492b4b2b378 (patch) | |
tree | 48fb3e4b70c78b2a31f1c6a0a02e33b09b0113f5 /source | |
parent | 0e0d88605f0ce7422f278c399b913d394bc7f3ca (diff) | |
parent | 67b2985cceaf789e1b77d4f70864bf67ee9375c3 (diff) |
svn merge ^/trunk/blender -r43420:43436
Diffstat (limited to 'source')
45 files changed, 1443 insertions, 845 deletions
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h index af6f4b88f4b..98fe6e15e67 100644 --- a/source/blender/blenkernel/BKE_blender.h +++ b/source/blender/blenkernel/BKE_blender.h @@ -42,7 +42,7 @@ extern "C" { * and keep comment above the defines. * Use STRINGIFY() rather than defining with quotes */ #define BLENDER_VERSION 261 -#define BLENDER_SUBVERSION 2 +#define BLENDER_SUBVERSION 3 #define BLENDER_MINVERSION 250 #define BLENDER_MINSUBVERSION 0 diff --git a/source/blender/blenkernel/BKE_text.h b/source/blender/blenkernel/BKE_text.h index a951347d946..ffea8e0c8e2 100644 --- a/source/blender/blenkernel/BKE_text.h +++ b/source/blender/blenkernel/BKE_text.h @@ -46,6 +46,7 @@ void free_text (struct Text *text); void txt_set_undostate (int u); int txt_get_undostate (void); struct Text* add_empty_text (const char *name); +int txt_extended_ascii_as_utf8(char **str); int reopen_text (struct Text *text); struct Text* add_text (const char *file, const char *relpath); struct Text* copy_text (struct Text *ta); @@ -59,6 +60,8 @@ void txt_order_cursors (struct Text *text); int txt_find_string (struct Text *text, const char *findstr, int wrap, int match_case); int txt_has_sel (struct Text *text); int txt_get_span (struct TextLine *from, struct TextLine *to); +int txt_utf8_offset_to_index(char *str, int offset); +int txt_utf8_index_to_offset(char *str, int index); void txt_move_up (struct Text *text, short sel); void txt_move_down (struct Text *text, short sel); void txt_move_left (struct Text *text, short sel); @@ -86,9 +89,9 @@ void txt_do_redo (struct Text *text); void txt_split_curline (struct Text *text); void txt_backspace_char (struct Text *text); void txt_backspace_word (struct Text *text); -int txt_add_char (struct Text *text, char add); -int txt_add_raw_char (struct Text *text, char add); -int txt_replace_char (struct Text *text, char add); +int txt_add_char (struct Text *text, unsigned int add); +int txt_add_raw_char (struct Text *text, unsigned int add); +int txt_replace_char (struct Text *text, unsigned int add); void txt_export_to_object(struct Text *text); void txt_export_to_objects(struct Text *text); void txt_unindent (struct Text *text); @@ -127,34 +130,48 @@ int text_check_whitespace(char ch); #define UNDO_SLEFT 005 #define UNDO_SRIGHT 006 #define UNDO_SUP 007 -#define UNDO_SDOWN 021 +#define UNDO_SDOWN 010 /* Complex movement (opcode is followed * by 4 character line ID + a 2 character * position ID and opcode (repeat)) */ -#define UNDO_CTO 022 -#define UNDO_STO 023 - -/* Complex editing (opcode is followed - * by 1 character ID and opcode (repeat)) */ -#define UNDO_INSERT 024 -#define UNDO_BS 025 -#define UNDO_DEL 026 +#define UNDO_CTO 011 +#define UNDO_STO 012 + +/* Complex editing */ +/* 1 - opcode is followed by 1 byte for ascii character and opcode (repeat)) */ +/* 2 - opcode is followed by 2 bytes for utf-8 character and opcode (repeat)) */ +/* 3 - opcode is followed by 3 bytes for utf-8 character and opcode (repeat)) */ +/* 4 - opcode is followed by 4 bytes for unicode character and opcode (repeat)) */ +#define UNDO_INSERT_1 013 +#define UNDO_INSERT_2 014 +#define UNDO_INSERT_3 015 +#define UNDO_INSERT_4 016 + +#define UNDO_BS_1 017 +#define UNDO_BS_2 020 +#define UNDO_BS_3 021 +#define UNDO_BS_4 022 + +#define UNDO_DEL_1 023 +#define UNDO_DEL_2 024 +#define UNDO_DEL_3 025 +#define UNDO_DEL_4 026 /* Text block (opcode is followed * by 4 character length ID + the text * block itself + the 4 character length * ID (repeat) and opcode (repeat)) */ -#define UNDO_DBLOCK 027 /* Delete block */ -#define UNDO_IBLOCK 030 /* Insert block */ +#define UNDO_DBLOCK 027 /* Delete block */ +#define UNDO_IBLOCK 030 /* Insert block */ /* Misc */ -#define UNDO_SWAP 031 /* Swap cursors */ +#define UNDO_SWAP 031 /* Swap cursors */ -#define UNDO_INDENT 032 -#define UNDO_UNINDENT 033 -#define UNDO_COMMENT 034 -#define UNDO_UNCOMMENT 035 +#define UNDO_INDENT 032 +#define UNDO_UNINDENT 033 +#define UNDO_COMMENT 034 +#define UNDO_UNCOMMENT 035 /* Marker flags */ #define TMARK_TEMP 0x01 /* Remove on non-editing events, don't save */ diff --git a/source/blender/blenkernel/intern/dynamicpaint.c b/source/blender/blenkernel/intern/dynamicpaint.c index b7acede4b7b..944de316eb1 100644 --- a/source/blender/blenkernel/intern/dynamicpaint.c +++ b/source/blender/blenkernel/intern/dynamicpaint.c @@ -101,9 +101,10 @@ static int neighY[8] = {0,1,1, 1, 0,-1,-1,-1}; #define EFF_MOVEMENT_PER_FRAME 0.05f /* initial wave time factor */ #define WAVE_TIME_FAC (1.0f/24.f) -#define WAVE_INIT_SIZE 5.0f +#define CANVAS_REL_SIZE 5.0f /* drying limits */ #define MIN_WETNESS 0.001f +#define MAX_WETNESS 5.0f /* dissolve macro */ #define VALUE_DISSOLVE(VALUE, TIME, SCALE, LOG) (VALUE) = (LOG) ? (VALUE) * (pow(MIN_WETNESS,1.0f/(1.2f*((float)(TIME))/(SCALE)))) : (VALUE) - 1.0f/(TIME)*(SCALE) @@ -422,15 +423,31 @@ static void blendColors(float t_color[3], float t_alpha, float s_color[3], float result[3] = f_alpha; } -/* assumes source alpha > 0.0f or results NaN colors */ -static void mixColors(float *t_color, float t_alpha, float *s_color, float s_alpha) +/* Mix two alpha weighed colors by a defined ratio. output is saved at a_color */ +static float mixColors(float a_color[3], float a_weight, float b_color[3], float b_weight, float ratio) { - float factor = (s_alpha<t_alpha) ? 1.0f : t_alpha/s_alpha; + float weight_ratio, factor; + if (b_weight) { + /* if first value has no weight just use b_color */ + if (!a_weight) { + copy_v3_v3(a_color, b_color); + return b_weight*ratio; + } + weight_ratio = b_weight/(a_weight+b_weight); + } + else return a_weight*(1.0f-ratio); - /* set initial color depending on existing alpha */ - interp_v3_v3v3(t_color, s_color, t_color, factor); + /* calculate final interpolation factor */ + if (ratio<=0.5f) { + factor = weight_ratio*(ratio*2.0f); + } + else { + ratio = (ratio*2.0f - 1.0f); + factor = weight_ratio*(1.0f-ratio) + ratio; + } /* mix final color */ - interp_v3_v3v3(t_color, t_color, s_color, s_alpha); + interp_v3_v3v3(a_color, a_color, b_color, factor); + return (1.0f-factor)*a_weight + factor*b_weight; } /* set "ignore cache" flag for all caches on this object */ @@ -617,6 +634,12 @@ static void boundInsert(Bounds3D *b, float point[3]) } } +float getSurfaceDimension(PaintSurfaceData *sData) +{ + Bounds3D *mb = &sData->bData->mesh_bounds; + return MAX3((mb->max[0]-mb->min[0]), (mb->max[1]-mb->min[1]), (mb->max[2]-mb->min[2])); +} + static void freeGrid(PaintSurfaceData *data) { PaintBakeData *bData = data->bData; @@ -959,17 +982,21 @@ struct DynamicPaintSurface *dynamicPaint_createNewSurface(DynamicPaintCanvasSett /* Set initial values */ surface->flags = MOD_DPAINT_ANTIALIAS | MOD_DPAINT_MULALPHA | MOD_DPAINT_DRY_LOG | MOD_DPAINT_DISSOLVE_LOG | - MOD_DPAINT_ACTIVE | MOD_DPAINT_PREVIEW | MOD_DPAINT_OUT1; + MOD_DPAINT_ACTIVE | MOD_DPAINT_PREVIEW | MOD_DPAINT_OUT1 | MOD_DPAINT_USE_DRYING; surface->effect = 0; surface->effect_ui = 1; surface->diss_speed = 250; surface->dry_speed = 500; + surface->color_dry_threshold = 1.0f; surface->depth_clamp = 0.0f; surface->disp_factor = 1.0f; surface->disp_type = MOD_DPAINT_DISP_DISPLACE; surface->image_fileformat = MOD_DPAINT_IMGFORMAT_PNG; + surface->influence_scale = 1.0f; + surface->radius_scale = 1.0f; + surface->init_color[0] = 1.0f; surface->init_color[1] = 1.0f; surface->init_color[2] = 1.0f; @@ -1508,7 +1535,7 @@ static int dynamicPaint_checkSurfaceData(DynamicPaintSurface *surface) /* apply displacing vertex surface to the derived mesh */ -static void dynamicPaint_applySurfaceDisplace(DynamicPaintSurface *surface, DerivedMesh *result, int update_normals) +static void dynamicPaint_applySurfaceDisplace(DynamicPaintSurface *surface, DerivedMesh *result) { PaintSurfaceData *sData = surface->data; @@ -1531,10 +1558,6 @@ static void dynamicPaint_applySurfaceDisplace(DynamicPaintSurface *surface, Deri mvert[i].co[2] -= normal[2]*val; } } - else return; - - if (update_normals) - CDDM_calc_normals_mapping(result); } /* @@ -1549,6 +1572,7 @@ static struct DerivedMesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData if(pmd->canvas && !(pmd->canvas->flags & MOD_DPAINT_BAKING)) { DynamicPaintSurface *surface = pmd->canvas->surfaces.first; + int update_normals = 0; pmd->canvas->flags &= ~MOD_DPAINT_PREVIEW_READY; /* loop through surfaces */ @@ -1742,14 +1766,20 @@ static struct DerivedMesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData normal_short_to_float_v3(normal, mvert[i].no); madd_v3_v3fl(mvert[i].co, normal, wPoint[i].height); } - CDDM_calc_normals_mapping(result); + update_normals = 1; } /* displace */ - dynamicPaint_applySurfaceDisplace(surface, result, 1); + if (surface->type == MOD_DPAINT_SURFACE_T_DISPLACE) { + dynamicPaint_applySurfaceDisplace(surface, result); + update_normals = 1; + } } } } + + if (update_normals) + CDDM_calc_normals_mapping(result); } /* make a copy of dm to use as brush data */ if (pmd->brush) { @@ -2568,14 +2598,8 @@ void dynamicPaint_outputSurfaceImage(DynamicPaintSurface *surface, char* filenam if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) { PaintPoint *point = &((PaintPoint*)sData->type_data)[index]; - ibuf->rect_float[pos] = point->color[0]; - ibuf->rect_float[pos+1] = point->color[1]; - ibuf->rect_float[pos+2] = point->color[2]; - /* mix wet layer */ - if (point->e_alpha) mixColors(&ibuf->rect_float[pos], point->alpha, point->e_color, point->e_alpha); - - /* use highest alpha */ - ibuf->rect_float[pos+3] = (point->e_alpha > point->alpha) ? point->e_alpha : point->alpha; + /* blend wet and dry layers */ + blendColors(point->color, point->alpha, point->e_color, point->e_alpha, &ibuf->rect_float[pos]); /* Multiply color by alpha if enabled */ if (surface->flags & MOD_DPAINT_MULALPHA) { @@ -2906,7 +2930,13 @@ static void dynamicPaint_updatePointData(DynamicPaintSurface *surface, unsigned float paint[3], float influence, float depth, float vel_factor, float timescale) { PaintSurfaceData *sData = surface->data; - float strength = influence * brush->alpha; + float strength; + + /* apply influence scale */ + influence *= surface->influence_scale; + depth *= surface->influence_scale; + + strength = influence * brush->alpha; CLAMP(strength, 0.0f, 1.0f); /* Sample velocity colorband if required */ @@ -2985,12 +3015,12 @@ static void dynamicPaint_updatePointData(DynamicPaintSurface *surface, unsigned } /* checks whether surface and brush bounds intersect depending on brush type */ -static int meshBrush_boundsIntersect(Bounds3D *b1, Bounds3D *b2, DynamicPaintBrushSettings *brush) +static int meshBrush_boundsIntersect(Bounds3D *b1, Bounds3D *b2, DynamicPaintBrushSettings *brush, float brush_radius) { if (brush->collision == MOD_DPAINT_COL_VOLUME) return boundsIntersect(b1, b2); else if (brush->collision == MOD_DPAINT_COL_DIST || brush->collision == MOD_DPAINT_COL_VOLDIST) - return boundsIntersectDist(b1, b2, brush->paint_distance); + return boundsIntersectDist(b1, b2, brush_radius); else return 1; } @@ -3117,6 +3147,7 @@ static int dynamicPaint_paintMesh(DynamicPaintSurface *surface, { BVHTreeFromMesh treeData = {0}; float avg_brushNor[3] = {0.0f}; + float brush_radius = brush->paint_distance * surface->radius_scale; int numOfVerts; int ii; Bounds3D mesh_bb = {0}; @@ -3155,7 +3186,7 @@ static int dynamicPaint_paintMesh(DynamicPaintSurface *surface, } /* check bounding box collision */ - if(grid && meshBrush_boundsIntersect(&grid->grid_bounds, &mesh_bb, brush)) + if(grid && meshBrush_boundsIntersect(&grid->grid_bounds, &mesh_bb, brush, brush_radius)) /* Build a bvh tree from transformed vertices */ if (bvhtree_from_mesh_faces(&treeData, dm, 0.0f, 4, 8)) { @@ -3167,7 +3198,7 @@ static int dynamicPaint_paintMesh(DynamicPaintSurface *surface, int id; /* check grid cell bounding box */ - if (!grid->s_num[c_index] || !meshBrush_boundsIntersect(&grid->bounds[c_index], &mesh_bb, brush)) + if (!grid->s_num[c_index] || !meshBrush_boundsIntersect(&grid->bounds[c_index], &mesh_bb, brush, brush_radius)) continue; /* loop through cell points and process brush */ @@ -3228,7 +3259,7 @@ static int dynamicPaint_paintMesh(DynamicPaintSurface *surface, hit.index = -1; hit.dist = 9999; nearest.index = -1; - nearest.dist = brush->paint_distance * brush->paint_distance; /* find_nearest uses squared distance */ + nearest.dist = brush_radius * brush_radius; /* find_nearest uses squared distance */ /* Check volume collision */ if (brush->collision == MOD_DPAINT_COL_VOLUME || brush->collision == MOD_DPAINT_COL_VOLDIST) @@ -3288,7 +3319,7 @@ static int dynamicPaint_paintMesh(DynamicPaintSurface *surface, /* If pure distance proximity, find the nearest point on the mesh */ if (brush->collision != MOD_DPAINT_COL_DIST || !(brush->flags & MOD_DPAINT_PROX_PROJECT)) { if (BLI_bvhtree_find_nearest(treeData.tree, ray_start, &nearest, mesh_faces_nearest_point_dp, &treeData) != -1) { - proxDist = sqrt(nearest.dist); + proxDist = sqrtf(nearest.dist); copy_v3_v3(hitCo, nearest.co); hQuad = (nearest.no[0] == 1.0f); face = nearest.index; @@ -3308,7 +3339,7 @@ static int dynamicPaint_paintMesh(DynamicPaintSurface *surface, proj_ray[2] = 1.0f; } hit.index = -1; - hit.dist = brush->paint_distance; + hit.dist = brush_radius; /* Do a face normal directional raycast, and use that distance */ if(BLI_bvhtree_ray_cast(treeData.tree, ray_start, proj_ray, 0.0f, &hit, mesh_faces_spherecast_dp, &treeData) != -1) @@ -3321,8 +3352,8 @@ static int dynamicPaint_paintMesh(DynamicPaintSurface *surface, } /* If a hit was found, calculate required values */ - if (proxDist >= 0.0f && proxDist <= brush->paint_distance) { - proximity_factor = proxDist / brush->paint_distance; + if (proxDist >= 0.0f && proxDist <= brush_radius) { + proximity_factor = proxDist / brush_radius; CLAMP(proximity_factor, 0.0f, 1.0f); if (!inner_proximity) proximity_factor = 1.0f - proximity_factor; @@ -3508,8 +3539,8 @@ static int dynamicPaint_paintParticles(DynamicPaintSurface *surface, int invalidParticles = 0; int p = 0; - float solidradius = (brush->flags & MOD_DPAINT_PART_RAD) ? psys->part->size : brush->particle_radius; - float smooth = brush->particle_smooth; + float solidradius = surface->radius_scale*((brush->flags & MOD_DPAINT_PART_RAD) ? psys->part->size : brush->particle_radius); + float smooth = brush->particle_smooth*surface->radius_scale; float range = solidradius + smooth; float particle_timestep = 0.04f * part->timetweak; @@ -3738,6 +3769,7 @@ static int dynamicPaint_paintSinglePoint(DynamicPaintSurface *surface, float *po Object *brushOb, BrushMaterials *bMats, Scene *scene, float timescale) { int index; + float brush_radius = brush->paint_distance * surface->radius_scale; PaintSurfaceData *sData = surface->data; PaintBakeData *bData = sData->bData; Vec3f brushVel; @@ -3755,13 +3787,13 @@ static int dynamicPaint_paintSinglePoint(DynamicPaintSurface *surface, float *po float colorband[4] = {0.0f}; float strength; - if (distance>brush->paint_distance) continue; + if (distance > brush_radius) continue; /* Smooth range or color ramp */ if (brush->proximity_falloff == MOD_DPAINT_PRFALL_SMOOTH || brush->proximity_falloff == MOD_DPAINT_PRFALL_RAMP) { - strength = 1.0f - distance / brush->paint_distance; + strength = 1.0f - distance / brush_radius; CLAMP(strength, 0.0f, 1.0f); } else strength = 1.0f; @@ -3826,8 +3858,8 @@ static int dynamicPaint_paintSinglePoint(DynamicPaintSurface *surface, float *po else if (surface->type == MOD_DPAINT_SURFACE_T_DISPLACE || surface->type == MOD_DPAINT_SURFACE_T_WAVE) { /* get displace depth */ - float disp_intersect = (1.0f - sqrtf((brush->paint_distance-distance) / brush->paint_distance)) * brush->paint_distance; - depth = (brush->paint_distance - disp_intersect) / bData->bNormal[index].normal_scale; + float disp_intersect = (1.0f - sqrtf((brush_radius-distance) / brush_radius)) * brush_radius; + depth = (brush_radius - disp_intersect) / bData->bNormal[index].normal_scale; if (depth<0.0f) depth = 0.0f; } dynamicPaint_updatePointData(surface, index, brush, paintColor, strength, depth, velocity_val, timescale); @@ -3930,7 +3962,7 @@ void surface_determineForceTargetPoints(PaintSurfaceData *sData, int index, floa if (closest_id[1] != -1) { float force_proj[3]; float tangent[3]; - float neigh_diff = acos(dot_v3v3(bNeighs[closest_id[0]].dir, bNeighs[closest_id[1]].dir)); + float neigh_diff = acosf(dot_v3v3(bNeighs[closest_id[0]].dir, bNeighs[closest_id[1]].dir)); float force_intersect; float temp; @@ -4002,7 +4034,6 @@ static void dynamicPaint_doSmudge(DynamicPaintSurface *surface, DynamicPaintBrus if (n_index != -1 && closest_d[i]>0.0f) { float dir_dot = closest_d[i], dir_factor; float speed_scale = eff_scale*smudge_str/bNeighs[n_index].dist; - float mix; PaintPoint *ePoint = &((PaintPoint*)sData->type_data)[sData->adj_data->n_target[n_index]]; /* just skip if angle is too extreme */ @@ -4012,13 +4043,11 @@ static void dynamicPaint_doSmudge(DynamicPaintSurface *surface, DynamicPaintBrus if (dir_factor > brush->smudge_strength) dir_factor = brush->smudge_strength; /* mix new color and alpha */ - mix = dir_factor*pPoint->alpha; - if (mix) mixColors(ePoint->color, ePoint->alpha, pPoint->color, mix); + mixColors(ePoint->color, ePoint->alpha, pPoint->color, pPoint->alpha, dir_factor); ePoint->alpha = ePoint->alpha*(1.0f-dir_factor) + pPoint->alpha*dir_factor; /* smudge "wet layer" */ - mix = dir_factor*pPoint->e_alpha; - if (mix) mixColors(ePoint->e_color, ePoint->e_alpha, pPoint->e_color, mix); + mixColors(ePoint->e_color, ePoint->e_alpha, pPoint->e_color, pPoint->e_alpha, dir_factor); ePoint->e_alpha = ePoint->e_alpha*(1.0f-dir_factor) + pPoint->e_alpha*dir_factor; pPoint->wetness *= (1.0f-dir_factor); } @@ -4035,7 +4064,7 @@ static int dynamicPaint_prepareEffectStep(DynamicPaintSurface *surface, Scene *s { double average_force = 0.0f; float shrink_speed=0.0f, spread_speed=0.0f; - float fastest_effect; + float fastest_effect, avg_dist; int steps; PaintSurfaceData *sData = surface->data; PaintBakeData *bData = sData->bData; @@ -4112,9 +4141,10 @@ static int dynamicPaint_prepareEffectStep(DynamicPaintSurface *surface, Scene *s shrink_speed = surface->shrink_speed; fastest_effect = MAX3(spread_speed, shrink_speed, average_force); + avg_dist = bData->average_dist*CANVAS_REL_SIZE/getSurfaceDimension(sData); - steps = (int)ceil(1.5f*EFF_MOVEMENT_PER_FRAME*fastest_effect/bData->average_dist*timescale); - CLAMP(steps, 1, 14); + steps = (int)ceil(1.5f*EFF_MOVEMENT_PER_FRAME*fastest_effect/avg_dist*timescale); + CLAMP(steps, 1, 20); return steps; } @@ -4126,6 +4156,7 @@ static void dynamicPaint_doEffectStep(DynamicPaintSurface *surface, float *force { PaintSurfaceData *sData = surface->data; BakeNeighPoint *bNeighs = sData->bData->bNeighs; + float distance_scale = getSurfaceDimension(sData)/CANVAS_REL_SIZE; int index; timescale /= steps; @@ -4135,7 +4166,7 @@ static void dynamicPaint_doEffectStep(DynamicPaintSurface *surface, float *force * Spread Effect */ if (surface->effect & MOD_DPAINT_EFFECT_DO_SPREAD) { - float eff_scale = EFF_MOVEMENT_PER_FRAME*surface->spread_speed*timescale; + float eff_scale = distance_scale*EFF_MOVEMENT_PER_FRAME*surface->spread_speed*timescale; /* Copy current surface to the previous points array to read unmodified values */ memcpy(prevPoint, sData->type_data, sData->total_points*sizeof(struct PaintPoint)); @@ -4145,7 +4176,6 @@ static void dynamicPaint_doEffectStep(DynamicPaintSurface *surface, float *force { int i; int numOfNeighs = sData->adj_data->n_num[index]; - float totalAlpha = 0.0f; PaintPoint *pPoint = &((PaintPoint*)sData->type_data)[index]; /* Only reads values from the surface copy (prevPoint[]), @@ -4154,39 +4184,23 @@ static void dynamicPaint_doEffectStep(DynamicPaintSurface *surface, float *force /* Loop through neighbouring points */ for (i=0; i<numOfNeighs; i++) { int n_index = sData->adj_data->n_index[index]+i; - float w_factor, alphaAdd = 0.0f; + float w_factor /* , p_alpha = pPoint->e_alpha */ /* UNUSED */; PaintPoint *ePoint = &prevPoint[sData->adj_data->n_target[n_index]]; float speed_scale = (bNeighs[n_index].dist<eff_scale) ? 1.0f : eff_scale/bNeighs[n_index].dist; - float color_mix = (MIN2(ePoint->wetness, pPoint->wetness))*0.25f*surface->color_spread_speed; - - totalAlpha += ePoint->e_alpha; + float color_mix = (MIN3(ePoint->wetness, pPoint->wetness, 1.0f))*0.25f*surface->color_spread_speed; /* do color mixing */ - if (color_mix > MIN_WETNESS) mixColors(pPoint->e_color, pPoint->e_alpha, ePoint->e_color, color_mix); - - /* Check if neighbouring point has higher wetness, - * if so, add it's wetness to this point as well*/ - if (ePoint->wetness <= pPoint->wetness) continue; - w_factor = ePoint->wetness/numOfNeighs * (ePoint->wetness - pPoint->wetness) * speed_scale; - if (w_factor <= MIN_WETNESS) continue; - - if (ePoint->e_alpha > pPoint->e_alpha) { - alphaAdd = ePoint->e_alpha/numOfNeighs * (ePoint->wetness*ePoint->e_alpha - pPoint->wetness*pPoint->e_alpha) * speed_scale; - } - - /* mix new color */ - mixColors(pPoint->e_color, pPoint->e_alpha, ePoint->e_color, w_factor); + if (color_mix) mixColors(pPoint->e_color, pPoint->e_alpha, ePoint->e_color, ePoint->e_alpha, color_mix); - pPoint->e_alpha += alphaAdd; - pPoint->wetness += w_factor; + /* Only continue if surrounding point has higher wetness */ + if (ePoint->wetness<pPoint->wetness || ePoint->wetness<MIN_WETNESS) continue; - if (pPoint->e_alpha > 1.0f) pPoint->e_alpha = 1.0f; - } + w_factor = 1.0f/numOfNeighs * MIN2(ePoint->wetness, 1.0f) * speed_scale; + CLAMP(w_factor, 0.0f, 1.0f); - /* For antialiasing sake, don't let alpha go much higher than average alpha of neighbours */ - if (pPoint->e_alpha > (totalAlpha/numOfNeighs+0.25f)) { - pPoint->e_alpha = (totalAlpha/numOfNeighs+0.25f); - if (pPoint->e_alpha>1.0f) pPoint->e_alpha = 1.0f; + /* mix new wetness and color */ + pPoint->wetness = (1.0f-w_factor)*pPoint->wetness + w_factor*ePoint->wetness; + pPoint->e_alpha = mixColors(pPoint->e_color, pPoint->e_alpha, ePoint->e_color, ePoint->e_alpha, w_factor); } } } @@ -4195,7 +4209,7 @@ static void dynamicPaint_doEffectStep(DynamicPaintSurface *surface, float *force * Shrink Effect */ if (surface->effect & MOD_DPAINT_EFFECT_DO_SHRINK) { - float eff_scale = EFF_MOVEMENT_PER_FRAME*surface->shrink_speed*timescale; + float eff_scale = distance_scale*EFF_MOVEMENT_PER_FRAME*surface->shrink_speed*timescale; /* Copy current surface to the previous points array to read unmodified values */ memcpy(prevPoint, sData->type_data, sData->total_points*sizeof(struct PaintPoint)); @@ -4245,7 +4259,7 @@ static void dynamicPaint_doEffectStep(DynamicPaintSurface *surface, float *force */ if (surface->effect & MOD_DPAINT_EFFECT_DO_DRIP && force) { - float eff_scale = EFF_MOVEMENT_PER_FRAME*timescale/2.0f; + float eff_scale = distance_scale*EFF_MOVEMENT_PER_FRAME*timescale/2.0f; /* Copy current surface to the previous points array to read unmodified values */ memcpy(prevPoint, sData->type_data, sData->total_points*sizeof(struct PaintPoint)); @@ -4258,8 +4272,9 @@ static void dynamicPaint_doEffectStep(DynamicPaintSurface *surface, float *force float closest_d[2]; /* adjust drip speed depending on wetness */ - float w_factor = pPoint_prev->wetness*0.5f - 0.025f; + float w_factor = pPoint_prev->wetness - 0.025f; if (w_factor <= 0) continue; + CLAMP(w_factor, 0.0f, 1.0f); /* get force affect points */ surface_determineForceTargetPoints(sData, index, &force[index*4], closest_d, closest_id); @@ -4268,41 +4283,38 @@ static void dynamicPaint_doEffectStep(DynamicPaintSurface *surface, float *force for (i=0; i<2; i++) { int n_index = closest_id[i]; if (n_index != -1 && closest_d[i]>0.0f) { - float dir_dot = closest_d[i], dir_factor; + float dir_dot = closest_d[i], dir_factor, a_factor; float speed_scale = eff_scale*force[index*4+3]/bNeighs[n_index].dist; PaintPoint *ePoint = &((PaintPoint*)sData->type_data)[sData->adj_data->n_target[n_index]]; + float e_wet = ePoint->wetness; /* just skip if angle is too extreme */ if (dir_dot <= 0.0f) continue; - dir_factor = dir_dot * speed_scale * w_factor; - if (dir_factor > (0.5f/steps)) dir_factor = (0.5f/steps); - - /* mix new color */ - if (dir_factor) mixColors(ePoint->e_color, ePoint->e_alpha, pPoint->e_color, dir_factor); + dir_factor = dir_dot * MIN2(speed_scale, 1.0f) * w_factor; + if (dir_factor > 0.5f) dir_factor = 0.5f; - ePoint->e_alpha += dir_factor; + /* mix new wetness*/ ePoint->wetness += dir_factor; - if (ePoint->e_alpha > 1.0f) ePoint->e_alpha = 1.0f; + CLAMP(ePoint->wetness, 0.0f, MAX_WETNESS); + + /* mix new color */ + a_factor = dir_factor / pPoint_prev->wetness; + CLAMP(a_factor, 0.0f, 1.0f); + mixColors(ePoint->e_color, ePoint->e_alpha, pPoint_prev->e_color, pPoint_prev->e_alpha, a_factor); + /* dripping is supposed to preserve alpha level */ + if (pPoint_prev->e_alpha > ePoint->e_alpha) { + ePoint->e_alpha += a_factor * pPoint_prev->e_alpha; + if (ePoint->e_alpha > pPoint_prev->e_alpha) + ePoint->e_alpha = pPoint_prev->e_alpha; + } - /* and decrease paint wetness on current point */ - pPoint->wetness -= dir_factor; + /* decrease paint wetness on current point */ + pPoint->wetness -= (ePoint->wetness - e_wet); + CLAMP(pPoint->wetness, 0.0f, MAX_WETNESS); } } } - - /* Keep values within acceptable range */ - #pragma omp parallel for schedule(static) - for (index = 0; index < sData->total_points; index++) - { - PaintPoint *cPoint = &((PaintPoint*)sData->type_data)[index]; - - if (cPoint->e_alpha > 1.0f) cPoint->e_alpha=1.0f; - if (cPoint->wetness > 2.0f) cPoint->wetness=2.0f; - - if (cPoint->e_alpha < 0.0f) cPoint->e_alpha=0.0f; - if (cPoint->wetness < 0.0f) cPoint->wetness=0.0f; - } } } @@ -4317,7 +4329,7 @@ void dynamicPaint_doWaveStep(DynamicPaintSurface *surface, float timescale) 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; + float wave_scale = CANVAS_REL_SIZE/canvas_size; /* allocate memory */ PaintWavePoint *prevPoint = MEM_mallocN(sData->total_points*sizeof(PaintWavePoint), "Temp previous points for wave simulation"); @@ -4430,48 +4442,53 @@ static void dynamicPaint_surfacePreStep(DynamicPaintSurface *surface, float time if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) { PaintPoint *pPoint = &((PaintPoint*)sData->type_data)[index]; /* drying */ - if (pPoint->wetness >= MIN_WETNESS) { - int i; - float dry_ratio, f_color[4]; - float p_wetness = pPoint->wetness; - VALUE_DISSOLVE(pPoint->wetness, surface->dry_speed, timescale, (surface->flags & MOD_DPAINT_DRY_LOG)); - if (pPoint->wetness<0.0f) pPoint->wetness=0.0f; - dry_ratio = pPoint->wetness/p_wetness; + if (surface->flags & MOD_DPAINT_USE_DRYING) { + if (pPoint->wetness >= MIN_WETNESS) { + int i; + float dry_ratio, f_color[4]; + float p_wetness = pPoint->wetness; + VALUE_DISSOLVE(pPoint->wetness, surface->dry_speed, timescale, (surface->flags & MOD_DPAINT_DRY_LOG)); + if (pPoint->wetness<0.0f) pPoint->wetness=0.0f; - /* - * Slowly "shift" paint from wet layer to dry layer as it drys: - */ - /* make sure alpha values are within proper range */ - CLAMP(pPoint->alpha, 0.0f, 1.0f); - CLAMP(pPoint->e_alpha, 0.0f, 1.0f); - - /* get current final blended color of these layers */ - blendColors(pPoint->color, pPoint->alpha, pPoint->e_color, pPoint->e_alpha, f_color); - /* reduce wet layer alpha by dry factor */ - pPoint->e_alpha *= dry_ratio; - - /* now calculate new alpha for dry layer that keeps final blended color unchanged */ - pPoint->alpha = (f_color[3] - pPoint->e_alpha)/(1.0f-pPoint->e_alpha); - /* for each rgb component, calculate a new dry layer color that keeps the final blend color - * with these new alpha values. (wet layer color doesnt change)*/ - if (pPoint->alpha) { - for (i=0; i<3; i++) { - pPoint->color[i] = (f_color[i]*f_color[3] - pPoint->e_color[i]*pPoint->e_alpha)/(pPoint->alpha*(1.0f-pPoint->e_alpha)); + if (pPoint->wetness < surface->color_dry_threshold) { + dry_ratio = pPoint->wetness/p_wetness; + + /* + * Slowly "shift" paint from wet layer to dry layer as it drys: + */ + /* make sure alpha values are within proper range */ + CLAMP(pPoint->alpha, 0.0f, 1.0f); + CLAMP(pPoint->e_alpha, 0.0f, 1.0f); + + /* get current final blended color of these layers */ + blendColors(pPoint->color, pPoint->alpha, pPoint->e_color, pPoint->e_alpha, f_color); + /* reduce wet layer alpha by dry factor */ + pPoint->e_alpha *= dry_ratio; + + /* now calculate new alpha for dry layer that keeps final blended color unchanged */ + pPoint->alpha = (f_color[3] - pPoint->e_alpha)/(1.0f-pPoint->e_alpha); + /* for each rgb component, calculate a new dry layer color that keeps the final blend color + * with these new alpha values. (wet layer color doesnt change)*/ + if (pPoint->alpha) { + for (i=0; i<3; i++) { + pPoint->color[i] = (f_color[i]*f_color[3] - pPoint->e_color[i]*pPoint->e_alpha)/(pPoint->alpha*(1.0f-pPoint->e_alpha)); + } + } } - } - pPoint->state = DPAINT_PAINT_WET; - } - /* in case of just dryed paint, just mix it to the dry layer and mark it empty */ - else if (pPoint->state > 0) { - float f_color[4]; - blendColors(pPoint->color, pPoint->alpha, pPoint->e_color, pPoint->e_alpha, f_color); - copy_v3_v3(pPoint->color, f_color); - pPoint->alpha = f_color[3]; - /* clear wet layer */ - pPoint->wetness = 0.0f; - pPoint->e_alpha = 0.0f; - pPoint->state = DPAINT_PAINT_DRY; + pPoint->state = DPAINT_PAINT_WET; + } + /* in case of just dryed paint, just mix it to the dry layer and mark it empty */ + else if (pPoint->state > 0) { + float f_color[4]; + blendColors(pPoint->color, pPoint->alpha, pPoint->e_color, pPoint->e_alpha, f_color); + copy_v3_v3(pPoint->color, f_color); + pPoint->alpha = f_color[3]; + /* clear wet layer */ + pPoint->wetness = 0.0f; + pPoint->e_alpha = 0.0f; + pPoint->state = DPAINT_PAINT_DRY; + } } if (surface->flags & MOD_DPAINT_DISSOLVE) { @@ -4919,7 +4936,7 @@ int dynamicPaint_calculateFrame(DynamicPaintSurface *surface, Scene *scene, Obje /* apply previous displace on derivedmesh if incremental surface */ if (surface->flags & MOD_DPAINT_DISP_INCREMENTAL) - dynamicPaint_applySurfaceDisplace(surface, surface->canvas->dm, 0); + dynamicPaint_applySurfaceDisplace(surface, surface->canvas->dm); /* update bake data */ dynamicPaint_generateBakeData(surface, scene, cObject); diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c index 8d20a06d009..46a3f776e43 100644 --- a/source/blender/blenkernel/intern/softbody.c +++ b/source/blender/blenkernel/intern/softbody.c @@ -3468,7 +3468,7 @@ static void makelatticesprings(Lattice *lt, BodySpring *bs, int dostiff,Object * bs->len= globallen((bp-dw-dv-1)->vec, bp->vec,ob); bs++; } - if( (v < lt->pntsv-1) && (u) ) { + if( (v < lt->pntsv-1) && (u != 0) ) { bs->v1 = bpc; bs->v2 = bpc-dw+dv-1; bs->springtype=SB_BEND; @@ -3485,7 +3485,7 @@ static void makelatticesprings(Lattice *lt, BodySpring *bs, int dostiff,Object * bs->len= globallen((bp+dw-dv-1)->vec, bp->vec,ob); bs++; } - if( (v < lt->pntsv-1) && (u) ) { + if( (v < lt->pntsv-1) && (u != 0) ) { bs->v1 = bpc; bs->v2 = bpc+dw+dv-1; bs->springtype=SB_BEND; diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c index 7e102bc9854..bc86a53c35e 100644 --- a/source/blender/blenkernel/intern/text.c +++ b/source/blender/blenkernel/intern/text.c @@ -33,6 +33,8 @@ #include <string.h> /* strstr */ #include <sys/types.h> #include <sys/stat.h> +#include <wchar.h> +#include <wctype.h> #include "MEM_guardedalloc.h" @@ -215,8 +217,48 @@ Text *add_empty_text(const char *name) return ta; } +/* this function replaces extended ascii characters */ +/* to a valid utf-8 sequences */ +int txt_extended_ascii_as_utf8(char **str) +{ + int bad_char, added= 0, i= 0; + int length = strlen(*str); + + while ((*str)[i]) { + if((bad_char= BLI_utf8_invalid_byte(*str+i, length)) == -1) + break; + + added++; + i+= bad_char + 1; + } + + if (added != 0) { + char *newstr = MEM_mallocN(length+added+1, "text_line"); + int mi = 0; + i= 0; + + while ((*str)[i]) { + if((bad_char= BLI_utf8_invalid_byte((*str)+i, length)) == -1) { + memcpy(newstr+mi, (*str)+i, length - i + 1); + break; + } + + memcpy(newstr+mi, (*str)+i, bad_char); + + BLI_str_utf8_from_unicode((*str)[i+bad_char], newstr+mi+bad_char); + i+= bad_char+1; + mi+= bad_char+2; + } + newstr[length+added] = '\0'; + MEM_freeN(*str); + *str = newstr; + } + + return added; +} + // this function removes any control characters from -// a textline +// a textline and fixes invalid utf-8 sequences static void cleanup_textline(TextLine * tl) { @@ -229,6 +271,7 @@ static void cleanup_textline(TextLine * tl) i--; } } + tl->len+= txt_extended_ascii_as_utf8(&tl->line); } int reopen_text(Text *text) @@ -689,16 +732,10 @@ static void txt_make_dirty (Text *text) } /* 0:whitespace, 1:punct, 2:alphanumeric */ -static short txt_char_type (char ch) -{ - if (ch <= ' ') return 0; /* 32 */ - if (ch <= '/') return 1; /* 47 */ - if (ch <= '9') return 2; /* 57 */ - if (ch <= '@') return 1; /* 64 */ - if (ch <= 'Z') return 2; /* 90 */ - if (ch == '_') return 2; /* 95, dont delimit '_' */ - if (ch <= '`') return 1; /* 96 */ - if (ch <= 'z') return 2; /* 122 */ +static short txt_char_type(unsigned int ch) +{ + if (iswspace(ch)) return 0; + if (iswalpha(ch) || iswdigit(ch)) return 2; return 1; } @@ -731,9 +768,42 @@ static void txt_curs_first (Text *text, TextLine **linep, int *charp) } } -/****************************/ +/*****************************/ /* Cursor movement functions */ -/****************************/ +/*****************************/ + +int txt_utf8_offset_to_index(char *str, int offset) +{ + int index= 0, pos= 0; + while (pos != offset) { + pos += BLI_str_utf8_size(str + pos); + index++; + } + return index; +} + +int txt_utf8_index_to_offset(char *str, int index) +{ + int offset= 0, pos= 0; + while (pos != index) { + offset += BLI_str_utf8_size(str + offset); + pos++; + } + return offset; +} + +/* returns the real number of characters in string */ +/* not the same as BLI_strlen_utf8, which returns length for wide characters */ +static int txt_utf8_len(const char *src) +{ + int len; + + for (len=0; *src; len++) { + src += BLI_str_utf8_size(src); + } + + return len; +} void txt_move_up(Text *text, short sel) { @@ -747,13 +817,13 @@ void txt_move_up(Text *text, short sel) old= *charp; if((*linep)->prev) { + int index = txt_utf8_offset_to_index((*linep)->line, *charp); *linep= (*linep)->prev; - if (*charp > (*linep)->len) { - *charp= (*linep)->len; - if(!undoing) txt_undo_add_toop(text, sel?UNDO_STO:UNDO_CTO, txt_get_span(text->lines.first, (*linep)->next), old, txt_get_span(text->lines.first, *linep), (unsigned short) *charp); - } else { - if(!undoing) txt_undo_add_op(text, sel?UNDO_SUP:UNDO_CUP); - } + if (index > txt_utf8_len((*linep)->line)) *charp= (*linep)->len; + else *charp= txt_utf8_index_to_offset((*linep)->line, index); + + if(!undoing) + txt_undo_add_op(text, sel?UNDO_SUP:UNDO_CUP); } else { txt_move_bol(text, sel); } @@ -773,12 +843,13 @@ void txt_move_down(Text *text, short sel) old= *charp; if((*linep)->next) { + int index = txt_utf8_offset_to_index((*linep)->line, *charp); *linep= (*linep)->next; - if (*charp > (*linep)->len) { - *charp= (*linep)->len; - if(!undoing) txt_undo_add_toop(text, sel?UNDO_STO:UNDO_CTO, txt_get_span(text->lines.first, (*linep)->prev), old, txt_get_span(text->lines.first, *linep), (unsigned short)*charp); - } else - if(!undoing) txt_undo_add_op(text, sel?UNDO_SDOWN:UNDO_CDOWN); + if (index > txt_utf8_len((*linep)->line)) *charp= (*linep)->len; + else *charp= txt_utf8_index_to_offset((*linep)->line, index); + + if(!undoing) + txt_undo_add_op(text, sel?UNDO_SDOWN:UNDO_CDOWN); } else { txt_move_eol(text, sel); } @@ -790,7 +861,7 @@ void txt_move_left(Text *text, short sel) { TextLine **linep; int *charp, oundoing= undoing; - int tabsize = 1, i=0; + int tabsize= 0, i= 0; if (!text) return; if(sel) txt_curs_sel(text, &linep, &charp); @@ -799,32 +870,36 @@ void txt_move_left(Text *text, short sel) undoing= 1; - // do nice left only if there are only spaces - // TXT_TABSIZE hardcoded in DNA_text_types.h - if (text->flags & TXT_TABSTOSPACES) { - tabsize = TXT_TABSIZE; - - if (*charp < tabsize) - tabsize = *charp; - else { - for (i=0;i<(*charp);i++) + if (*charp== 0) { + if ((*linep)->prev) { + txt_move_up(text, sel); + *charp= (*linep)->len; + } + } + else { + // do nice left only if there are only spaces + // TXT_TABSIZE hardcoded in DNA_text_types.h + if (text->flags & TXT_TABSTOSPACES) { + tabsize= (*charp < TXT_TABSIZE) ? *charp : TXT_TABSIZE; + + for (i=0; i<(*charp); i++) if ((*linep)->line[i] != ' ') { - tabsize = 1; + tabsize= 0; break; } + // if in the middle of the space-tab - if ((*charp) % tabsize != 0) - tabsize = ((*charp) % tabsize); + if (tabsize && (*charp) % TXT_TABSIZE != 0) + tabsize= ((*charp) % TXT_TABSIZE); } - } - - if (*charp== 0) { - if ((*linep)->prev) { - txt_move_up(text, sel); - *charp= (*linep)->len; + + if (tabsize) + (*charp)-= tabsize; + else { + const char *prev= BLI_str_prev_char_utf8((*linep)->line + *charp); + *charp= prev - (*linep)->line; } } - else (*charp)-= tabsize; undoing= oundoing; if(!undoing) txt_undo_add_op(text, sel?UNDO_SLEFT:UNDO_CLEFT); @@ -835,8 +910,7 @@ void txt_move_left(Text *text, short sel) void txt_move_right(Text *text, short sel) { TextLine **linep; - int *charp, oundoing= undoing; - int tabsize=1, i=0; + int *charp, oundoing= undoing, do_tab= 0, i; if (!text) return; if(sel) txt_curs_sel(text, &linep, &charp); @@ -845,32 +919,33 @@ void txt_move_right(Text *text, short sel) undoing= 1; - // do nice right only if there are only spaces - // spaces hardcoded in DNA_text_types.h - if (text->flags & TXT_TABSTOSPACES) { - tabsize = TXT_TABSIZE; - - if ((*charp) + tabsize > (*linep)->len) - tabsize = 1; - else { - for (i=0;i<(*charp) + tabsize - ((*charp) % tabsize);i++) - if ((*linep)->line[i] != ' ') { - tabsize = 1; - break; - } - // if in the middle of the space-tab - tabsize -= (*charp) % tabsize; - } - } - if (*charp== (*linep)->len) { if ((*linep)->next) { txt_move_down(text, sel); *charp= 0; } - } else { - (*charp)+=tabsize; + } + else { + // do nice right only if there are only spaces + // spaces hardcoded in DNA_text_types.h + if (text->flags & TXT_TABSTOSPACES && (*linep)->line[*charp]== ' ') { + do_tab= 1; + for (i=0; i<*charp; i++) + if ((*linep)->line[i]!= ' ') { + do_tab= 0; + break; + } + } + + if (do_tab) { + int tabsize= (*charp) % TXT_TABSIZE + 1; + for (i=*charp+1; (*linep)->line[i]==' ' && tabsize<TXT_TABSIZE; i++) + tabsize++; + (*charp)= i; + } + else (*charp)+= BLI_str_utf8_size((*linep)->line + *charp); } + undoing= oundoing; if(!undoing) txt_undo_add_op(text, sel?UNDO_SRIGHT:UNDO_CRIGHT); @@ -896,9 +971,12 @@ void txt_jump_left(Text *text, short sel) count= 0; for (i=0; i<3; i++) { if (count < 2) { - while (*charp>0 && txt_char_type((*linep)->line[*charp-1])==i) { - txt_move_left(text, sel); - count++; + while (*charp>0) { + char *sym= BLI_str_prev_char_utf8((*linep)->line + *charp); + if (txt_char_type(BLI_str_utf8_as_unicode(sym))==i) { + txt_move_left(text, sel); + count++; + } else break; } } } @@ -927,9 +1005,12 @@ void txt_jump_right(Text *text, short sel) count= 0; for (i=0; i<3; i++) { if (count < 2) { - while (*charp<(*linep)->len && txt_char_type((*linep)->line[*charp])==i) { - txt_move_right(text, sel); - count++; + while (*charp<(*linep)->len) { + char *sym= (*linep)->line + *charp; + if (txt_char_type(BLI_str_utf8_as_unicode(sym))==i) { + txt_move_right(text, sel); + count++; + } else break; } } } @@ -1014,6 +1095,7 @@ void txt_move_toline (Text *text, unsigned int line, short sel) txt_move_to(text, line, 0, sel); } +/* Moves to a certain byte in a line, not a certain utf8-character! */ void txt_move_to (Text *text, unsigned int line, unsigned int ch, short sel) { TextLine **linep, *oldl; @@ -1396,42 +1478,45 @@ static void txt_shift_markers(Text *text, int lineno, int count) void txt_insert_buf(Text *text, const char *in_buffer) { - int i=0, l=0, j, u, len, lineno= -1, count= 0; + int l=0, u, len, lineno= -1, count= 0; + size_t i=0, j; TextLine *add; + char *buffer; if (!text) return; if (!in_buffer) return; txt_delete_sel(text); - if(!undoing) txt_undo_add_block (text, UNDO_IBLOCK, in_buffer); + len= strlen(in_buffer); + buffer= BLI_strdupn(in_buffer, len); + len+= txt_extended_ascii_as_utf8(&buffer); + + if(!undoing) txt_undo_add_block(text, UNDO_IBLOCK, buffer); u= undoing; undoing= 1; /* Read the first line (or as close as possible */ - while (in_buffer[i] && in_buffer[i]!='\n') { - txt_add_raw_char(text, in_buffer[i]); - i++; - } + while (buffer[i] && buffer[i]!='\n') + txt_add_raw_char(text, BLI_str_utf8_as_unicode_step(buffer, &i)); - if (in_buffer[i]=='\n') txt_split_curline(text); - else { undoing = u; return; } + if (buffer[i]=='\n') txt_split_curline(text); + else { undoing = u; MEM_freeN(buffer); return; } i++; /* Read as many full lines as we can */ - len= strlen(in_buffer); lineno= txt_get_span(text->lines.first, text->curl); while (i<len) { l=0; - while (in_buffer[i] && in_buffer[i]!='\n') { + while (buffer[i] && buffer[i]!='\n') { i++; l++; } - if(in_buffer[i]=='\n') { - add= txt_new_linen(in_buffer +(i-l), l); + if(buffer[i]=='\n') { + add= txt_new_linen(buffer +(i-l), l); BLI_insertlinkbefore(&text->lines, text->curl, add); i++; count++; @@ -1441,21 +1526,19 @@ void txt_insert_buf(Text *text, const char *in_buffer) count= 0; } - for (j= i-l; j<i && j<(int)strlen(in_buffer); j++) { - txt_add_raw_char(text, in_buffer[j]); - } + for (j= i-l; j<i && j<len; ) + txt_add_raw_char(text, BLI_str_utf8_as_unicode_step(buffer, &j)); break; } } + + MEM_freeN(buffer); if(count) { txt_shift_markers(text, lineno, count); - count= 0; } undoing= u; - - (void)count; } /******************/ @@ -1525,12 +1608,30 @@ void txt_print_undo(Text *text) ops= "Selection "; } else if (op==UNDO_CTO) { ops= "Cursor "; - } else if (op==UNDO_INSERT) { - ops= "Insert"; - } else if (op==UNDO_BS) { - ops= "Backspace"; - } else if (op==UNDO_DEL) { - ops= "Delete"; + } else if (op==UNDO_INSERT_1) { + ops= "Insert ascii "; + } else if (op==UNDO_INSERT_2) { + ops= "Insert 2 bytes "; + } else if (op==UNDO_INSERT_3) { + ops= "Insert 3 bytes "; + } else if (op==UNDO_INSERT_4) { + ops= "Insert unicode "; + } else if (op==UNDO_BS_1) { + ops= "Backspace for ascii "; + } else if (op==UNDO_BS_2) { + ops= "Backspace for 2 bytes "; + } else if (op==UNDO_BS_3) { + ops= "Backspace for 3 bytes "; + } else if (op==UNDO_BS_4) { + ops= "Backspace for unicode "; + } else if (op==UNDO_DEL_1) { + ops= "Delete ascii "; + } else if (op==UNDO_DEL_2) { + ops= "Delete 2 bytes "; + } else if (op==UNDO_DEL_3) { + ops= "Delete 3 bytes "; + } else if (op==UNDO_DEL_4) { + ops= "Delete unicode "; } else if (op==UNDO_SWAP) { ops= "Cursor swap"; } else if (op==UNDO_DBLOCK) { @@ -1550,10 +1651,35 @@ void txt_print_undo(Text *text) } printf ("Op (%o) at %d = %s", op, i, ops); - if (op==UNDO_INSERT || op==UNDO_BS || op==UNDO_DEL) { - i++; - printf (" - Char is %c", text->undo_buf[i]); + if (op >= UNDO_INSERT_1 && op <= UNDO_DEL_4) { i++; + printf (" - Char is "); + switch (op) { + case UNDO_INSERT_1: case UNDO_BS_1: case UNDO_DEL_1: + printf ("%c", text->undo_buf[i]); + i++; + break; + case UNDO_INSERT_2: case UNDO_BS_2: case UNDO_DEL_2: + printf ("%c%c", text->undo_buf[i], text->undo_buf[i+1]); + i+=2; + break; + case UNDO_INSERT_3: case UNDO_BS_3: case UNDO_DEL_3: + printf ("%c%c%c", text->undo_buf[i], text->undo_buf[i+1], text->undo_buf[i+2]); + i+=3; + break; + case UNDO_INSERT_4: case UNDO_BS_4: case UNDO_DEL_4: { + unsigned int uc; + char c[BLI_UTF8_MAX+1]; + size_t c_len; + uc= text->undo_buf[i]; i++; + uc= uc+(text->undo_buf[i]<<8); i++; + uc= uc+(text->undo_buf[i]<<16); i++; + uc= uc+(text->undo_buf[i]<<24); i++; + c_len= BLI_str_utf8_from_unicode(uc, c); + c[c_len]= '\0'; + printf ("%s", c); + } + } } else if (op==UNDO_STO || op==UNDO_CTO) { i++; @@ -1635,40 +1761,43 @@ static void txt_undo_add_op(Text *text, int op) text->undo_buf[text->undo_pos+1]= 0; } +static void txt_undo_store_uint16(char *undo_buf, int *undo_pos, unsigned short value) +{ + undo_buf[*undo_pos]= (value)&0xff; + (*undo_pos)++; + undo_buf[*undo_pos]= (value>>8)&0xff; + (*undo_pos)++; +} + +static void txt_undo_store_uint32(char *undo_buf, int *undo_pos, unsigned int value) +{ + undo_buf[*undo_pos]= (value)&0xff; + (*undo_pos)++; + undo_buf[*undo_pos]= (value>>8)&0xff; + (*undo_pos)++; + undo_buf[*undo_pos]= (value>>16)&0xff; + (*undo_pos)++; + undo_buf[*undo_pos]= (value>>24)&0xff; + (*undo_pos)++; +} + static void txt_undo_add_block(Text *text, int op, const char *buf) { - int length; - - length= strlen(buf); + unsigned int length= strlen(buf); if(!max_undo_test(text, length+11)) return; text->undo_pos++; text->undo_buf[text->undo_pos]= op; - - text->undo_pos++; - text->undo_buf[text->undo_pos]= (length)&0xff; - text->undo_pos++; - text->undo_buf[text->undo_pos]= (length>>8)&0xff; - text->undo_pos++; - text->undo_buf[text->undo_pos]= (length>>16)&0xff; - text->undo_pos++; - text->undo_buf[text->undo_pos]= (length>>24)&0xff; - text->undo_pos++; + + txt_undo_store_uint32(text->undo_buf, &text->undo_pos, length); + strncpy(text->undo_buf+text->undo_pos, buf, length); text->undo_pos+=length; - text->undo_buf[text->undo_pos]= (length)&0xff; - text->undo_pos++; - text->undo_buf[text->undo_pos]= (length>>8)&0xff; - text->undo_pos++; - text->undo_buf[text->undo_pos]= (length>>16)&0xff; - text->undo_pos++; - text->undo_buf[text->undo_pos]= (length>>24)&0xff; - - text->undo_pos++; + txt_undo_store_uint32(text->undo_buf, &text->undo_pos, length); text->undo_buf[text->undo_pos]= op; text->undo_buf[text->undo_pos+1]= 0; @@ -1685,51 +1814,139 @@ void txt_undo_add_toop(Text *text, int op, unsigned int froml, unsigned short fr text->undo_buf[text->undo_pos]= op; text->undo_pos++; - text->undo_buf[text->undo_pos]= (fromc)&0xff; - text->undo_pos++; - text->undo_buf[text->undo_pos]= (fromc>>8)&0xff; + + txt_undo_store_uint16(text->undo_buf, &text->undo_pos, fromc); + txt_undo_store_uint32(text->undo_buf, &text->undo_pos, froml); + txt_undo_store_uint16(text->undo_buf, &text->undo_pos, toc); + txt_undo_store_uint32(text->undo_buf, &text->undo_pos, tol); + + text->undo_buf[text->undo_pos]= op; - text->undo_pos++; - text->undo_buf[text->undo_pos]= (froml)&0xff; - text->undo_pos++; - text->undo_buf[text->undo_pos]= (froml>>8)&0xff; - text->undo_pos++; - text->undo_buf[text->undo_pos]= (froml>>16)&0xff; - text->undo_pos++; - text->undo_buf[text->undo_pos]= (froml>>24)&0xff; + text->undo_buf[text->undo_pos+1]= 0; +} +static void txt_undo_add_charop(Text *text, int op_start, unsigned int c) +{ + char utf8[BLI_UTF8_MAX]; + size_t i, utf8_size = BLI_str_utf8_from_unicode(c, utf8); + + if(!max_undo_test(text, 3 + utf8_size)) + return; + text->undo_pos++; - text->undo_buf[text->undo_pos]= (toc)&0xff; - text->undo_pos++; - text->undo_buf[text->undo_pos]= (toc>>8)&0xff; + + if (utf8_size < 4) { + text->undo_buf[text->undo_pos]= op_start + utf8_size - 1; + text->undo_pos++; + + for (i = 0; i < utf8_size; i++) { + text->undo_buf[text->undo_pos]= utf8[i]; + text->undo_pos++; + } + + text->undo_buf[text->undo_pos]= op_start + utf8_size - 1; + } else { + text->undo_buf[text->undo_pos]= op_start + 3; + text->undo_pos++; + txt_undo_store_uint32(text->undo_buf, &text->undo_pos, c); + text->undo_buf[text->undo_pos]= op_start + 3; + } + + text->undo_buf[text->undo_pos+1]= 0; +} - text->undo_pos++; - text->undo_buf[text->undo_pos]= (tol)&0xff; - text->undo_pos++; - text->undo_buf[text->undo_pos]= (tol>>8)&0xff; - text->undo_pos++; - text->undo_buf[text->undo_pos]= (tol>>16)&0xff; - text->undo_pos++; - text->undo_buf[text->undo_pos]= (tol>>24)&0xff; +static unsigned short txt_undo_read_uint16(const char *undo_buf, int *undo_pos) +{ + unsigned short val; + val= undo_buf[*undo_pos]; (*undo_pos)--; + val= (val<<8)+undo_buf[*undo_pos]; (*undo_pos)--; + return val; +} - text->undo_pos++; - text->undo_buf[text->undo_pos]= op; +static unsigned int txt_undo_read_uint32(const char *undo_buf, int *undo_pos) +{ + unsigned int val; + val= undo_buf[*undo_pos]; (*undo_pos)--; + val= (val<<8)+undo_buf[*undo_pos]; (*undo_pos)--; + val= (val<<8)+undo_buf[*undo_pos]; (*undo_pos)--; + val= (val<<8)+undo_buf[*undo_pos]; (*undo_pos)--; + return val; +} - text->undo_buf[text->undo_pos+1]= 0; +static unsigned int txt_undo_read_unicode(const char *undo_buf, int *undo_pos, short bytes) +{ + unsigned int unicode; + char utf8[BLI_UTF8_MAX+1]; + + switch (bytes) { + case 1: /* ascii */ + unicode = undo_buf[*undo_pos]; (*undo_pos)--; + break; + case 2: /* 2-byte symbol */ + utf8[2] = '\0'; + utf8[1] = undo_buf[*undo_pos]; (*undo_pos)--; + utf8[0] = undo_buf[*undo_pos]; (*undo_pos)--; + unicode= BLI_str_utf8_as_unicode(utf8); + break; + case 3: /* 3-byte symbol */ + utf8[3] = '\0'; + utf8[2] = undo_buf[*undo_pos]; (*undo_pos)--; + utf8[1] = undo_buf[*undo_pos]; (*undo_pos)--; + utf8[0] = undo_buf[*undo_pos]; (*undo_pos)--; + unicode= BLI_str_utf8_as_unicode(utf8); + break; + case 4: /* 32-bit unicode symbol */ + unicode= txt_undo_read_uint32(undo_buf, undo_pos); + } + + return unicode; } -static void txt_undo_add_charop(Text *text, int op, char c) +static unsigned short txt_redo_read_uint16(const char *undo_buf, int *undo_pos) { - if(!max_undo_test(text, 4)) - return; + unsigned short val; + val = undo_buf[*undo_pos]; (*undo_pos)++; + val = val+(undo_buf[*undo_pos]<<8); (*undo_pos)++; + return val; +} - text->undo_pos++; - text->undo_buf[text->undo_pos]= op; - text->undo_pos++; - text->undo_buf[text->undo_pos]= c; - text->undo_pos++; - text->undo_buf[text->undo_pos]= op; - text->undo_buf[text->undo_pos+1]= 0; +static unsigned int txt_redo_read_uint32(const char *undo_buf, int *undo_pos) +{ + unsigned int val; + val= undo_buf[*undo_pos]; (*undo_pos)++; + val= val+(undo_buf[*undo_pos]<<8); (*undo_pos)++; + val= val+(undo_buf[*undo_pos]<<16); (*undo_pos)++; + val= val+(undo_buf[*undo_pos]<<24); (*undo_pos)++; + return val; +} + +static unsigned int txt_redo_read_unicode(const char *undo_buf, int *undo_pos, short bytes) +{ + unsigned int unicode; + char utf8[BLI_UTF8_MAX+1]; + + switch (bytes) { + case 1: /* ascii */ + unicode = undo_buf[*undo_pos]; (*undo_pos)++; + break; + case 2: /* 2-byte symbol */ + utf8[0] = undo_buf[*undo_pos]; (*undo_pos)++; + utf8[1] = undo_buf[*undo_pos]; (*undo_pos)++; + utf8[2] = '\0'; + unicode= BLI_str_utf8_as_unicode(utf8); + break; + case 3: /* 3-byte symbol */ + utf8[0] = undo_buf[*undo_pos]; (*undo_pos)++; + utf8[1] = undo_buf[*undo_pos]; (*undo_pos)++; + utf8[2] = undo_buf[*undo_pos]; (*undo_pos)++; + utf8[3] = '\0'; + unicode= BLI_str_utf8_as_unicode(utf8); + break; + case 4: /* 32-bit unicode symbol */ + unicode= txt_undo_read_uint32(undo_buf, undo_pos); + } + + return unicode; } void txt_do_undo(Text *text) @@ -1792,13 +2009,8 @@ void txt_do_undo(Text *text) text->undo_pos--; text->undo_pos--; - linep= text->undo_buf[text->undo_pos]; text->undo_pos--; - linep= (linep<<8)+text->undo_buf[text->undo_pos]; text->undo_pos--; - linep= (linep<<8)+text->undo_buf[text->undo_pos]; text->undo_pos--; - linep= (linep<<8)+text->undo_buf[text->undo_pos]; text->undo_pos--; - - charp= text->undo_buf[text->undo_pos]; text->undo_pos--; - charp= (charp<<8)+text->undo_buf[text->undo_pos]; text->undo_pos--; + linep= txt_undo_read_uint32(text->undo_buf, &text->undo_pos); + charp= txt_undo_read_uint16(text->undo_buf, &text->undo_pos); if (op==UNDO_CTO) { txt_move_toline(text, linep, 0); @@ -1812,23 +2024,23 @@ void txt_do_undo(Text *text) text->undo_pos--; break; - case UNDO_INSERT: + case UNDO_INSERT_1: case UNDO_INSERT_2: case UNDO_INSERT_3: case UNDO_INSERT_4: txt_backspace_char(text); - text->undo_pos--; + text->undo_pos-= op - UNDO_INSERT_1 + 1; text->undo_pos--; break; - case UNDO_BS: - txt_add_char(text, text->undo_buf[text->undo_pos]); - text->undo_pos--; + case UNDO_BS_1: case UNDO_BS_2: case UNDO_BS_3: case UNDO_BS_4: + charp = op - UNDO_BS_1 + 1; + txt_add_char(text, txt_undo_read_unicode(text->undo_buf, &text->undo_pos, charp)); text->undo_pos--; - break; - - case UNDO_DEL: - txt_add_char(text, text->undo_buf[text->undo_pos]); + break; + + case UNDO_DEL_1: case UNDO_DEL_2: case UNDO_DEL_3: case UNDO_DEL_4: + charp = op - UNDO_DEL_1 + 1; + txt_add_char(text, txt_undo_read_unicode(text->undo_buf, &text->undo_pos, charp)); txt_move_left(text, 0); text->undo_pos--; - text->undo_pos--; break; case UNDO_SWAP: @@ -1836,10 +2048,7 @@ void txt_do_undo(Text *text) break; case UNDO_DBLOCK: - linep= text->undo_buf[text->undo_pos]; text->undo_pos--; - linep= (linep<<8)+text->undo_buf[text->undo_pos]; text->undo_pos--; - linep= (linep<<8)+text->undo_buf[text->undo_pos]; text->undo_pos--; - linep= (linep<<8)+text->undo_buf[text->undo_pos]; text->undo_pos--; + linep= txt_undo_read_uint32(text->undo_buf, &text->undo_pos); buf= MEM_mallocN(linep+1, "dblock buffer"); for (i=0; i < linep; i++){ @@ -1863,25 +2072,31 @@ void txt_do_undo(Text *text) } text->curc= holdc; - linep= text->undo_buf[text->undo_pos]; text->undo_pos--; - linep= (linep<<8)+text->undo_buf[text->undo_pos]; text->undo_pos--; - linep= (linep<<8)+text->undo_buf[text->undo_pos]; text->undo_pos--; - linep= (linep<<8)+text->undo_buf[text->undo_pos]; text->undo_pos--; + text->undo_pos--; + text->undo_pos--; + text->undo_pos--; + text->undo_pos--; text->undo_pos--; break; case UNDO_IBLOCK: - linep= text->undo_buf[text->undo_pos]; text->undo_pos--; - linep= (linep<<8)+text->undo_buf[text->undo_pos]; text->undo_pos--; - linep= (linep<<8)+text->undo_buf[text->undo_pos]; text->undo_pos--; - linep= (linep<<8)+text->undo_buf[text->undo_pos]; text->undo_pos--; - + linep= txt_undo_read_uint32(text->undo_buf, &text->undo_pos); txt_delete_sel(text); + + /* txt_backspace_char removes utf8-characters, not bytes */ + buf= MEM_mallocN(linep+1, "iblock buffer"); + for (i=0; i < linep; i++){ + buf[(linep-1)-i]= text->undo_buf[text->undo_pos]; + text->undo_pos--; + } + buf[i]= 0; + linep= txt_utf8_len(buf); + MEM_freeN(buf); + while (linep>0) { txt_backspace_char(text); - text->undo_pos--; linep--; } @@ -1897,30 +2112,23 @@ void txt_do_undo(Text *text) case UNDO_UNINDENT: case UNDO_COMMENT: case UNDO_UNCOMMENT: - linep= text->undo_buf[text->undo_pos]; text->undo_pos--; - linep = (linep<<8)+text->undo_buf[text->undo_pos]; text->undo_pos--; - linep = (linep<<8)+text->undo_buf[text->undo_pos]; text->undo_pos--; - linep = (linep<<8)+text->undo_buf[text->undo_pos]; text->undo_pos--; + linep= txt_undo_read_uint32(text->undo_buf, &text->undo_pos); //linep is now the end line of the selection - charp = text->undo_buf[text->undo_pos]; text->undo_pos--; - charp = (charp<<8)+text->undo_buf[text->undo_pos]; text->undo_pos--; + charp = txt_undo_read_uint16(text->undo_buf, &text->undo_pos); //charp is the last char selected or text->line->len - //set the selcetion for this now + + //set the selection for this now text->selc = charp; text->sell = text->lines.first; for (i= 0; i < linep; i++) { text->sell = text->sell->next; } - linep= text->undo_buf[text->undo_pos]; text->undo_pos--; - linep = (linep<<8)+text->undo_buf[text->undo_pos]; text->undo_pos--; - linep = (linep<<8)+text->undo_buf[text->undo_pos]; text->undo_pos--; - linep = (linep<<8)+text->undo_buf[text->undo_pos]; text->undo_pos--; + linep= txt_undo_read_uint32(text->undo_buf, &text->undo_pos); //first line to be selected - charp = text->undo_buf[text->undo_pos]; text->undo_pos--; - charp = (charp<<8)+text->undo_buf[text->undo_pos]; text->undo_pos--; + charp = txt_undo_read_uint16(text->undo_buf, &text->undo_pos); //first postion to be selected text->curc = charp; text->curl = text->lines.first; @@ -2014,22 +2222,22 @@ void txt_do_redo(Text *text) txt_move_down(text, 1); break; - case UNDO_INSERT: - text->undo_pos++; - txt_add_char(text, text->undo_buf[text->undo_pos]); + case UNDO_INSERT_1: case UNDO_INSERT_2: case UNDO_INSERT_3: case UNDO_INSERT_4: text->undo_pos++; + charp = op - UNDO_INSERT_1 + 1; + txt_add_char(text, txt_redo_read_unicode(text->undo_buf, &text->undo_pos, charp)); break; - case UNDO_BS: + case UNDO_BS_1: case UNDO_BS_2: case UNDO_BS_3: case UNDO_BS_4: text->undo_pos++; txt_backspace_char(text); - text->undo_pos++; + text->undo_pos+= op - UNDO_BS_1 + 1; break; - case UNDO_DEL: + case UNDO_DEL_1: case UNDO_DEL_2: case UNDO_DEL_3: case UNDO_DEL_4: text->undo_pos++; txt_delete_char(text); - text->undo_pos++; + text->undo_pos+= op - UNDO_DEL_1 + 1; break; case UNDO_SWAP: @@ -2049,15 +2257,8 @@ void txt_do_redo(Text *text) text->undo_pos++; - charp= text->undo_buf[text->undo_pos]; - text->undo_pos++; - charp= charp+(text->undo_buf[text->undo_pos]<<8); - - text->undo_pos++; - linep= text->undo_buf[text->undo_pos]; text->undo_pos++; - linep= linep+(text->undo_buf[text->undo_pos]<<8); text->undo_pos++; - linep= linep+(text->undo_buf[text->undo_pos]<<16); text->undo_pos++; - linep= linep+(text->undo_buf[text->undo_pos]<<24); text->undo_pos++; + charp= txt_redo_read_uint16(text->undo_buf, &text->undo_pos); + linep= txt_redo_read_uint32(text->undo_buf, &text->undo_pos); if (op==UNDO_CTO) { txt_move_toline(text, linep, 0); @@ -2072,12 +2273,9 @@ void txt_do_redo(Text *text) case UNDO_DBLOCK: text->undo_pos++; - linep= text->undo_buf[text->undo_pos]; text->undo_pos++; - linep= linep+(text->undo_buf[text->undo_pos]<<8); text->undo_pos++; - linep= linep+(text->undo_buf[text->undo_pos]<<16); text->undo_pos++; - linep= linep+(text->undo_buf[text->undo_pos]<<24); text->undo_pos++; - + linep= txt_redo_read_uint32(text->undo_buf, &text->undo_pos); txt_delete_sel(text); + text->undo_pos+=linep; text->undo_pos++; @@ -2089,10 +2287,7 @@ void txt_do_redo(Text *text) case UNDO_IBLOCK: text->undo_pos++; - linep= text->undo_buf[text->undo_pos]; text->undo_pos++; - linep= linep+(text->undo_buf[text->undo_pos]<<8); text->undo_pos++; - linep= linep+(text->undo_buf[text->undo_pos]<<16); text->undo_pos++; - linep= linep+(text->undo_buf[text->undo_pos]<<24); text->undo_pos++; + linep= txt_redo_read_uint32(text->undo_buf, &text->undo_pos); buf= MEM_mallocN(linep+1, "iblock buffer"); memcpy (buf, &text->undo_buf[text->undo_pos], linep); @@ -2102,26 +2297,21 @@ void txt_do_redo(Text *text) txt_insert_buf(text, buf); MEM_freeN(buf); - linep= text->undo_buf[text->undo_pos]; text->undo_pos++; - linep= linep+(text->undo_buf[text->undo_pos]<<8); text->undo_pos++; - linep= linep+(text->undo_buf[text->undo_pos]<<16); text->undo_pos++; - linep= linep+(text->undo_buf[text->undo_pos]<<24); text->undo_pos++; - (void)linep; - + text->undo_pos++; + text->undo_pos++; + text->undo_pos++; + text->undo_pos++; break; + case UNDO_INDENT: case UNDO_UNINDENT: case UNDO_COMMENT: case UNDO_UNCOMMENT: text->undo_pos++; - charp = text->undo_buf[text->undo_pos]; text->undo_pos++; - charp = charp+(text->undo_buf[text->undo_pos]<<8); text->undo_pos++; + charp = txt_redo_read_uint16(text->undo_buf, &text->undo_pos); //charp is the first char selected or 0 - linep= text->undo_buf[text->undo_pos]; text->undo_pos++; - linep = linep+(text->undo_buf[text->undo_pos]<<8); text->undo_pos++; - linep = linep+(text->undo_buf[text->undo_pos]<<16); text->undo_pos++; - linep = linep+(text->undo_buf[text->undo_pos]<<24); text->undo_pos++; + linep= txt_redo_read_uint32(text->undo_buf, &text->undo_pos); //linep is now the first line of the selection //set the selcetion for this now text->curc = charp; @@ -2130,13 +2320,10 @@ void txt_do_redo(Text *text) text->curl = text->curl->next; } - charp = text->undo_buf[text->undo_pos]; text->undo_pos++; - charp = charp+(text->undo_buf[text->undo_pos]<<8); text->undo_pos++; + charp = txt_redo_read_uint16(text->undo_buf, &text->undo_pos); //last postion to be selected - linep= text->undo_buf[text->undo_pos]; text->undo_pos++; - linep = linep+(text->undo_buf[text->undo_pos]<<8); text->undo_pos++; - linep = linep+(text->undo_buf[text->undo_pos]<<16); text->undo_pos++; - linep = linep+(text->undo_buf[text->undo_pos]<<24); text->undo_pos++; + + linep= txt_redo_read_uint32(text->undo_buf, &text->undo_pos); //Last line to be selected text->selc = charp; @@ -2203,8 +2390,7 @@ void txt_split_curline (Text *text) left[text->curc]=0; right= MEM_mallocN(text->curl->len - text->curc+1, "textline_string"); - if (text->curl->len - text->curc) memcpy(right, text->curl->line+text->curc, text->curl->len-text->curc); - right[text->curl->len - text->curc]=0; + memcpy(right, text->curl->line+text->curc, text->curl->len-text->curc+1); MEM_freeN(text->curl->line); if (text->curl->format) MEM_freeN(text->curl->format); @@ -2228,7 +2414,7 @@ void txt_split_curline (Text *text) txt_clean_text(text); txt_pop_sel(text); - if(!undoing) txt_undo_add_charop(text, UNDO_INSERT, '\n'); + if(!undoing) txt_undo_add_charop(text, UNDO_INSERT_1, '\n'); } static void txt_delete_line (Text *text, TextLine *line) @@ -2296,9 +2482,9 @@ static void txt_combine_lines (Text *text, TextLine *linea, TextLine *lineb) txt_clean_text(text); } -void txt_delete_char (Text *text) +void txt_delete_char(Text *text) { - char c='\n'; + unsigned int c='\n'; if (!text) return; if (!text->curl) return; @@ -2314,12 +2500,14 @@ void txt_delete_char (Text *text) txt_pop_sel(text); } } else { /* Just deleting a char */ - int i= text->curc; + size_t c_len = 0; + TextMarker *mrk; + c= BLI_str_utf8_as_unicode_and_size(text->curl->line + text->curc, &c_len); - TextMarker *mrk= txt_find_marker_region(text, text->curl, i-1, text->curl->len, 0, 0); + mrk= txt_find_marker_region(text, text->curl, text->curc - c_len, text->curl->len, 0, 0); if (mrk) { int lineno= mrk->lineno; - if (mrk->end==i) { + if (mrk->end==text->curc) { if ((mrk->flags & TMARK_TEMP) && !(mrk->flags & TMARK_EDITALL)) { txt_clear_markers(text, mrk->group, TMARK_TEMP); } else { @@ -2328,18 +2516,15 @@ void txt_delete_char (Text *text) return; } do { - if (mrk->start>i) mrk->start--; - mrk->end--; + if (mrk->start>text->curc) mrk->start-= c_len; + mrk->end-= c_len; mrk= mrk->next; } while (mrk && mrk->lineno==lineno); } - c= text->curl->line[i]; - while(i< text->curl->len) { - text->curl->line[i]= text->curl->line[i+1]; - i++; - } - text->curl->len--; + memmove(text->curl->line+text->curc, text->curl->line+text->curc+c_len, text->curl->len-text->curc-c_len+1); + + text->curl->len-= c_len; txt_pop_sel(text); } @@ -2347,7 +2532,7 @@ void txt_delete_char (Text *text) txt_make_dirty(text); txt_clean_text(text); - if(!undoing) txt_undo_add_charop(text, UNDO_DEL, c); + if(!undoing) txt_undo_add_charop(text, UNDO_DEL_1, c); } void txt_delete_word (Text *text) @@ -2358,7 +2543,7 @@ void txt_delete_word (Text *text) void txt_backspace_char (Text *text) { - char c='\n'; + unsigned int c='\n'; if (!text) return; if (!text->curl) return; @@ -2378,12 +2563,15 @@ void txt_backspace_char (Text *text) txt_pop_sel(text); } else { /* Just backspacing a char */ - int i= text->curc-1; + size_t c_len = 0; + TextMarker *mrk; + char *prev = BLI_str_prev_char_utf8(text->curl->line + text->curc); + c= BLI_str_utf8_as_unicode_and_size(prev, &c_len); - TextMarker *mrk= txt_find_marker_region(text, text->curl, i, text->curl->len, 0, 0); + mrk= txt_find_marker_region(text, text->curl, text->curc - c_len, text->curl->len, 0, 0); if (mrk) { int lineno= mrk->lineno; - if (mrk->start==i+1) { + if (mrk->start==text->curc) { if ((mrk->flags & TMARK_TEMP) && !(mrk->flags & TMARK_EDITALL)) { txt_clear_markers(text, mrk->group, TMARK_TEMP); } else { @@ -2392,19 +2580,16 @@ void txt_backspace_char (Text *text) return; } do { - if (mrk->start>i) mrk->start--; - mrk->end--; + if (mrk->start>text->curc - c_len) mrk->start-= c_len; + mrk->end-= c_len; mrk= mrk->next; } while (mrk && mrk->lineno==lineno); } - c= text->curl->line[i]; - while(i< text->curl->len) { - text->curl->line[i]= text->curl->line[i+1]; - i++; - } - text->curl->len--; - text->curc--; + memcpy(text->curl->line + text->curc - c_len, text->curl->line + text->curc, text->curl->len-text->curc+1); + + text->curl->len-= c_len; + text->curc-= c_len; txt_pop_sel(text); } @@ -2412,7 +2597,7 @@ void txt_backspace_char (Text *text) txt_make_dirty(text); txt_clean_text(text); - if(!undoing) txt_undo_add_charop(text, UNDO_BS, c); + if(!undoing) txt_undo_add_charop(text, UNDO_BS_1, c); } void txt_backspace_word (Text *text) @@ -2436,11 +2621,12 @@ static void txt_convert_tab_to_spaces (Text *text) txt_insert_buf(text, sb); } -static int txt_add_char_intern (Text *text, char add, int replace_tabs) +static int txt_add_char_intern (Text *text, unsigned int add, int replace_tabs) { - int len, lineno; - char *tmp; + int lineno; + char *tmp, ch[BLI_UTF8_MAX]; TextMarker *mrk; + size_t add_len; if (!text) return 0; if (!text->curl) return 0; @@ -2458,43 +2644,42 @@ static int txt_add_char_intern (Text *text, char add, int replace_tabs) txt_delete_sel(text); + add_len = BLI_str_utf8_from_unicode(add, ch); mrk= txt_find_marker_region(text, text->curl, text->curc-1, text->curl->len, 0, 0); if (mrk) { lineno= mrk->lineno; do { - if (mrk->start>text->curc) mrk->start++; - mrk->end++; + if (mrk->start>text->curc) mrk->start+= add_len; + mrk->end+= add_len; mrk= mrk->next; } while (mrk && mrk->lineno==lineno); } - tmp= MEM_mallocN(text->curl->len+2, "textline_string"); - - if(text->curc) memcpy(tmp, text->curl->line, text->curc); - tmp[text->curc]= add; + tmp= MEM_mallocN(text->curl->len+add_len+1, "textline_string"); - len= text->curl->len - text->curc; - if(len>0) memcpy(tmp+text->curc+1, text->curl->line+text->curc, len); - tmp[text->curl->len+1]=0; + memcpy(tmp, text->curl->line, text->curc); + memcpy(tmp+text->curc, ch, add_len); + memcpy(tmp+text->curc+add_len, text->curl->line+text->curc, text->curl->len-text->curc+1); + make_new_line(text->curl, tmp); - text->curc++; + text->curc+= add_len; txt_pop_sel(text); txt_make_dirty(text); txt_clean_text(text); - if(!undoing) txt_undo_add_charop(text, UNDO_INSERT, add); + if(!undoing) txt_undo_add_charop(text, UNDO_INSERT_1, add); return 1; } -int txt_add_char (Text *text, char add) +int txt_add_char (Text *text, unsigned int add) { return txt_add_char_intern(text, add, text->flags & TXT_TABSTOSPACES); } -int txt_add_raw_char (Text *text, char add) +int txt_add_raw_char (Text *text, unsigned int add) { return txt_add_char_intern(text, add, 0); } @@ -2505,34 +2690,48 @@ void txt_delete_selected(Text *text) txt_make_dirty(text); } -int txt_replace_char (Text *text, char add) +int txt_replace_char (Text *text, unsigned int add) { - char del; + unsigned int del; + size_t del_size = 0, add_size; + char ch[BLI_UTF8_MAX]; if (!text) return 0; if (!text->curl) return 0; /* If text is selected or we're at the end of the line just use txt_add_char */ if (text->curc==text->curl->len || txt_has_sel(text) || add=='\n') { - TextMarker *mrk; int i= txt_add_char(text, add); - mrk= txt_find_marker(text, text->curl, text->curc, 0, 0); - if (mrk && mrk->end==text->curc) mrk->end--; + TextMarker *mrk= txt_find_marker(text, text->curl, text->curc, 0, 0); + if (mrk) BLI_freelinkN(&text->markers, mrk); return i; } - del= text->curl->line[text->curc]; - text->curl->line[text->curc]= (unsigned char) add; - text->curc++; - txt_pop_sel(text); + del= BLI_str_utf8_as_unicode_and_size(text->curl->line + text->curc, &del_size); + add_size= BLI_str_utf8_from_unicode(add, ch); + if (add_size > del_size) { + char *tmp= MEM_mallocN(text->curl->len+add_size-del_size+1, "textline_string"); + memcpy(tmp, text->curl->line, text->curc); + memcpy(tmp+text->curc+add_size, text->curl->line+text->curc+del_size, text->curl->len-text->curc-del_size+1); + MEM_freeN(text->curl->line); + text->curl->line = tmp; + } else if (add_size < del_size) { + char *tmp= text->curl->line; + memmove(tmp+text->curc+add_size, tmp+text->curc+del_size, text->curl->len-text->curc-del_size+1); + } + + memcpy(text->curl->line + text->curc, ch, add_size); + text->curc+= add_size; + + txt_pop_sel(text); txt_make_dirty(text); txt_clean_text(text); /* Should probably create a new op for this */ if(!undoing) { - txt_undo_add_charop(text, UNDO_DEL, del); - txt_undo_add_charop(text, UNDO_INSERT, add); + txt_undo_add_charop(text, UNDO_DEL_1, del); + txt_undo_add_charop(text, UNDO_INSERT_1, add); } return 1; } diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 7e1634d6eca..978cb4d00e3 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -137,6 +137,7 @@ #include "BKE_scene.h" #include "BKE_screen.h" #include "BKE_sequencer.h" +#include "BKE_text.h" // for txt_extended_ascii_as_utf8 #include "BKE_texture.h" // for open_plugin_tex #include "BKE_tracking.h" #include "BKE_utildefines.h" // SWITCH_INT DATA ENDB DNA1 O_BINARY GLOB USER TEST REND @@ -13052,6 +13053,49 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } } } + + if (main->versionfile < 261 || (main->versionfile == 261 && main->subversionfile < 3)) + { + { + /* convert extended ascii to utf-8 for text editor */ + Text *text; + for (text= main->text.first; text; text= text->id.next) + if(!(text->flags & TXT_ISEXT)) { + TextLine *tl; + + for (tl= text->lines.first; tl; tl= tl->next) { + int added= txt_extended_ascii_as_utf8(&tl->line); + tl->len+= added; + + /* reset cursor position if line was changed */ + if (added && tl == text->curl) + text->curc = 0; + } + } + } + { + /* set new dynamic paint values */ + Object *ob; + for(ob = main->object.first; ob; ob = ob->id.next) { + ModifierData *md; + for(md= ob->modifiers.first; md; md= md->next) { + if (md->type == eModifierType_DynamicPaint) { + DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)md; + if(pmd->canvas) + { + DynamicPaintSurface *surface = pmd->canvas->surfaces.first; + for (; surface; surface=surface->next) { + surface->color_dry_threshold = 1.0f; + surface->influence_scale = 1.0f; + surface->radius_scale = 1.0f; + surface->flags |= MOD_DPAINT_USE_DRYING; + } + } + } + } + } + } + } /* put compatibility code here until next subversion bump */ { diff --git a/source/blender/editors/animation/anim_channels_edit.c b/source/blender/editors/animation/anim_channels_edit.c index a21c394a81e..a7c37d371e5 100644 --- a/source/blender/editors/animation/anim_channels_edit.c +++ b/source/blender/editors/animation/anim_channels_edit.c @@ -2424,20 +2424,21 @@ void ED_operatortypes_animchannels(void) void ED_keymap_animchannels(wmKeyConfig *keyconf) { wmKeyMap *keymap = WM_keymap_find(keyconf, "Animation Channels", 0, 0); - + wmKeyMapItem *kmi; + /* selection */ /* click-select */ // XXX for now, only leftmouse.... WM_keymap_add_item(keymap, "ANIM_OT_channels_click", LEFTMOUSE, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_click", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", 1); - RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_click", LEFTMOUSE, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "children_only", 1); + RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_click", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", TRUE); + RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_click", LEFTMOUSE, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "children_only", TRUE); /* rename */ WM_keymap_add_item(keymap, "ANIM_OT_channels_rename", LEFTMOUSE, KM_PRESS, KM_CTRL, 0); /* deselect all */ WM_keymap_add_item(keymap, "ANIM_OT_channels_select_all_toggle", AKEY, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_select_all_toggle", IKEY, KM_PRESS, KM_CTRL, 0)->ptr, "invert", 1); + RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_select_all_toggle", IKEY, KM_PRESS, KM_CTRL, 0)->ptr, "invert", TRUE); /* borderselect */ WM_keymap_add_item(keymap, "ANIM_OT_channels_select_border", BKEY, KM_PRESS, 0, 0); @@ -2459,9 +2460,11 @@ void ED_keymap_animchannels(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "ANIM_OT_channels_expand", PADPLUSKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "ANIM_OT_channels_collapse", PADMINUS, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_expand", PADPLUSKEY, KM_PRESS, KM_CTRL, 0)->ptr, "all", 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_collapse", PADMINUS, KM_PRESS, KM_CTRL, 0)->ptr, "all", 0); - + kmi = WM_keymap_add_item(keymap, "ANIM_OT_channels_expand", PADPLUSKEY, KM_PRESS, KM_CTRL, 0); + RNA_boolean_set(kmi->ptr, "all", FALSE); + kmi = WM_keymap_add_item(keymap, "ANIM_OT_channels_collapse", PADMINUS, KM_PRESS, KM_CTRL, 0); + RNA_boolean_set(kmi->ptr, "all", FALSE); + /* rearranging */ RNA_enum_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_move", PAGEUPKEY, KM_PRESS, 0, 0)->ptr, "direction", REARRANGE_ANIMCHAN_UP); RNA_enum_set(WM_keymap_add_item(keymap, "ANIM_OT_channels_move", PAGEDOWNKEY, KM_PRESS, 0, 0)->ptr, "direction", REARRANGE_ANIMCHAN_DOWN); diff --git a/source/blender/editors/animation/anim_markers.c b/source/blender/editors/animation/anim_markers.c index e17aea3f8f3..216bb8d0e08 100644 --- a/source/blender/editors/animation/anim_markers.c +++ b/source/blender/editors/animation/anim_markers.c @@ -1490,7 +1490,8 @@ void ED_marker_keymap(wmKeyConfig *keyconf) WM_keymap_verify_item(keymap, "MARKER_OT_move", EVT_TWEAK_S, KM_ANY, 0, 0); WM_keymap_verify_item(keymap, "MARKER_OT_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_verify_item(keymap, "MARKER_OT_select", SELECTMOUSE, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "MARKER_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", 1); + kmi = WM_keymap_add_item(keymap, "MARKER_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "extend", TRUE); #ifdef DURIAN_CAMERA_SWITCH kmi= WM_keymap_add_item(keymap, "MARKER_OT_select", SELECTMOUSE, KM_PRESS, KM_CTRL, 0); diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c index 54314980e03..84206c4275e 100644 --- a/source/blender/editors/animation/keyframing.c +++ b/source/blender/editors/animation/keyframing.c @@ -1200,7 +1200,7 @@ static int insert_key_menu_invoke (bContext *C, wmOperator *op, wmEvent *UNUSED( else { /* just call the exec() on the active keyingset */ RNA_enum_set(op->ptr, "type", 0); - RNA_boolean_set(op->ptr, "confirm_success", 1); + RNA_boolean_set(op->ptr, "confirm_success", TRUE); return op->type->exec(C, op); } diff --git a/source/blender/editors/armature/armature_ops.c b/source/blender/editors/armature/armature_ops.c index 29cdf6a61f7..7379a278d01 100644 --- a/source/blender/editors/armature/armature_ops.c +++ b/source/blender/editors/armature/armature_ops.c @@ -182,7 +182,7 @@ void ED_operatormacros_armature(void) if(ot) { ot->description= "Create new bones from the selected joints and move them"; otmacro=WM_operatortype_macro_define(ot, "ARMATURE_OT_extrude"); - RNA_boolean_set(otmacro->ptr, "forked", 0); + RNA_boolean_set(otmacro->ptr, "forked", FALSE); otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); RNA_enum_set(otmacro->ptr, "proportional", 0); } @@ -193,7 +193,7 @@ void ED_operatormacros_armature(void) if(ot) { ot->description= "Create new bones from the selected joints and move them"; otmacro=WM_operatortype_macro_define(ot, "ARMATURE_OT_extrude"); - RNA_boolean_set(otmacro->ptr, "forked", 1); + RNA_boolean_set(otmacro->ptr, "forked", TRUE); otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); RNA_enum_set(otmacro->ptr, "proportional", 0); } diff --git a/source/blender/editors/curve/curve_ops.c b/source/blender/editors/curve/curve_ops.c index 60fca7ae4bd..b213f797d47 100644 --- a/source/blender/editors/curve/curve_ops.c +++ b/source/blender/editors/curve/curve_ops.c @@ -145,14 +145,14 @@ void ED_operatormacros_curve(void) WM_operatortype_macro_define(ot, "CURVE_OT_duplicate"); otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); RNA_enum_set(otmacro->ptr, "proportional", 0); - RNA_boolean_set(otmacro->ptr, "mirror", 0); + RNA_boolean_set(otmacro->ptr, "mirror", FALSE); ot= WM_operatortype_append_macro("CURVE_OT_extrude_move", "Extrude Curve and Move", OPTYPE_UNDO|OPTYPE_REGISTER); ot->description = "Extrude curve and move result"; WM_operatortype_macro_define(ot, "CURVE_OT_extrude"); otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); RNA_enum_set(otmacro->ptr, "proportional", 0); - RNA_boolean_set(otmacro->ptr, "mirror", 0); + RNA_boolean_set(otmacro->ptr, "mirror", FALSE); } void ED_keymap_curve(wmKeyConfig *keyconf) @@ -210,7 +210,8 @@ void ED_keymap_curve(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "FONT_OT_line_break", RETKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "FONT_OT_text_insert", KM_TEXTINPUT, KM_ANY, KM_ANY, 0); // last! - RNA_boolean_set(WM_keymap_add_item(keymap, "FONT_OT_text_insert", BACKSPACEKEY, KM_PRESS, KM_ALT, 0)->ptr, "accent", 1); // accented characters + kmi = WM_keymap_add_item(keymap, "FONT_OT_text_insert", BACKSPACEKEY, KM_PRESS, KM_ALT, 0); + RNA_boolean_set(kmi->ptr, "accent", TRUE); /* accented characters */ /* only set in editmode curve, by space_view3d listener */ keymap= WM_keymap_find(keyconf, "Curve", 0, 0); @@ -231,8 +232,11 @@ void ED_keymap_curve(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "CURVE_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "CURVE_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "CURVE_OT_select_linked", LKEY, KM_PRESS, KM_CTRL, 0); - WM_keymap_add_item(keymap, "CURVE_OT_select_linked_pick", LKEY, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "CURVE_OT_select_linked_pick", LKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "deselect", 1); + + kmi = WM_keymap_add_item(keymap, "CURVE_OT_select_linked_pick", LKEY, KM_PRESS, 0, 0); + RNA_boolean_set(kmi->ptr, "deselect", FALSE); + kmi = WM_keymap_add_item(keymap, "CURVE_OT_select_linked_pick", LKEY, KM_PRESS, KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "deselect", TRUE); WM_keymap_add_item(keymap, "CURVE_OT_separate", PKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "CURVE_OT_extrude_move", EKEY, KM_PRESS, 0, 0); @@ -248,8 +252,10 @@ void ED_keymap_curve(wmKeyConfig *keyconf) RNA_enum_set(WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", SKEY, KM_PRESS, KM_ALT, 0)->ptr, "mode", TFM_CURVE_SHRINKFATTEN); WM_keymap_add_item(keymap, "CURVE_OT_reveal", HKEY, KM_PRESS, KM_ALT, 0); - WM_keymap_add_item(keymap, "CURVE_OT_hide", HKEY, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "CURVE_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "unselected", 1); + kmi = WM_keymap_add_item(keymap, "CURVE_OT_hide", HKEY, KM_PRESS, 0, 0); + RNA_boolean_set(kmi->ptr, "unselected", FALSE); + kmi = WM_keymap_add_item(keymap, "CURVE_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "unselected", TRUE); WM_keymap_add_item(keymap, "OBJECT_OT_vertex_parent_set", PKEY, KM_PRESS, KM_CTRL, 0); diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index a01efa25d19..c8c57c12088 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -320,7 +320,7 @@ static void ui_layer_but_cb(bContext *C, void *arg_but, void *arg_index) int len= RNA_property_array_length(ptr, prop); if(!shift) { - RNA_property_boolean_set_index(ptr, prop, index, 1); + RNA_property_boolean_set_index(ptr, prop, index, TRUE); for(i=0; i<len; i++) if(i != index) @@ -2783,7 +2783,7 @@ void uiLayoutOperatorButs(const bContext *C, uiLayout *layout, wmOperator *op,in WM_operator_properties_create(&op_ptr, "WM_OT_operator_preset_add"); RNA_string_set(&op_ptr, "operator", op->type->idname); - RNA_boolean_set(&op_ptr, "remove_active", 1); + RNA_boolean_set(&op_ptr, "remove_active", TRUE); op_ptr= uiItemFullO(row, "WM_OT_operator_preset_add", "", ICON_ZOOMOUT, op_ptr.data, WM_OP_INVOKE_DEFAULT, 0); } diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index 9cf93980c2c..730254bba79 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -1957,10 +1957,10 @@ static void handle_layer_buttons(bContext *C, void *arg1, void *arg2) tot= RNA_property_array_length(&but->rnapoin, but->rnaprop); /* Normally clicking only selects one layer */ - RNA_property_boolean_set_index(&but->rnapoin, but->rnaprop, cur, 1); + RNA_property_boolean_set_index(&but->rnapoin, but->rnaprop, cur, TRUE); for(i = 0; i < tot; ++i) { if(i != cur) - RNA_property_boolean_set_index(&but->rnapoin, but->rnaprop, i, 0); + RNA_property_boolean_set_index(&but->rnapoin, but->rnaprop, i, FALSE); } } diff --git a/source/blender/editors/interface/view2d_ops.c b/source/blender/editors/interface/view2d_ops.c index 2959d525cfb..234b2733bd3 100644 --- a/source/blender/editors/interface/view2d_ops.c +++ b/source/blender/editors/interface/view2d_ops.c @@ -1689,7 +1689,8 @@ void UI_view2d_operatortypes(void) void UI_view2d_keymap(wmKeyConfig *keyconf) { wmKeyMap *keymap= WM_keymap_find(keyconf, "View2D", 0, 0); - + wmKeyMapItem *kmi; + /* scrollers */ WM_keymap_add_item(keymap, "VIEW2D_OT_scroller_activate", LEFTMOUSE, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "VIEW2D_OT_scroller_activate", MIDDLEMOUSE, KM_PRESS, 0, 0); @@ -1750,8 +1751,10 @@ void UI_view2d_keymap(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_down", WHEELDOWNMOUSE, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_up", WHEELUPMOUSE, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_down", PAGEDOWNKEY, KM_PRESS, 0, 0)->ptr, "page", 1); - RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_up", PAGEUPKEY, KM_PRESS, 0, 0)->ptr, "page", 1); + kmi = WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_down", PAGEDOWNKEY, KM_PRESS, 0, 0); + RNA_boolean_set(kmi->ptr, "page", TRUE); + kmi = WM_keymap_add_item(keymap, "VIEW2D_OT_scroll_up", PAGEUPKEY, KM_PRESS, 0, 0); + RNA_boolean_set(kmi->ptr, "page", TRUE); WM_keymap_add_item(keymap, "VIEW2D_OT_zoom", MIDDLEMOUSE, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "VIEW2D_OT_zoom", MOUSEZOOM, 0, 0, 0); diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c index ffceaf1c698..1e14fcdd580 100644 --- a/source/blender/editors/mesh/mesh_ops.c +++ b/source/blender/editors/mesh/mesh_ops.c @@ -201,35 +201,35 @@ void ED_operatormacros_mesh(void) WM_operatortype_macro_define(ot, "MESH_OT_duplicate"); otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); RNA_enum_set(otmacro->ptr, "proportional", 0); - RNA_boolean_set(otmacro->ptr, "mirror", 0); + RNA_boolean_set(otmacro->ptr, "mirror", FALSE); ot= WM_operatortype_append_macro("MESH_OT_rip_move", "Rip", OPTYPE_UNDO|OPTYPE_REGISTER); ot->description = "Rip polygons and move the result"; WM_operatortype_macro_define(ot, "MESH_OT_rip"); otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); RNA_enum_set(otmacro->ptr, "proportional", 0); - RNA_boolean_set(otmacro->ptr, "mirror", 0); + RNA_boolean_set(otmacro->ptr, "mirror", FALSE); ot= WM_operatortype_append_macro("MESH_OT_extrude_region_move", "Extrude Region and Move", OPTYPE_UNDO|OPTYPE_REGISTER); ot->description = "Extrude region and move result"; otmacro= WM_operatortype_macro_define(ot, "MESH_OT_extrude_region"); otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); RNA_enum_set(otmacro->ptr, "proportional", 0); - RNA_boolean_set(otmacro->ptr, "mirror", 0); + RNA_boolean_set(otmacro->ptr, "mirror", FALSE); ot= WM_operatortype_append_macro("MESH_OT_extrude_faces_move", "Extrude Individual Faces and Move", OPTYPE_UNDO|OPTYPE_REGISTER); ot->description = "Extrude faces and move result"; otmacro= WM_operatortype_macro_define(ot, "MESH_OT_extrude_faces_indiv"); otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_shrink_fatten"); RNA_enum_set(otmacro->ptr, "proportional", 0); - RNA_boolean_set(otmacro->ptr, "mirror", 0); + RNA_boolean_set(otmacro->ptr, "mirror", FALSE); ot= WM_operatortype_append_macro("MESH_OT_extrude_edges_move", "Extrude Only Edges and Move", OPTYPE_UNDO|OPTYPE_REGISTER); ot->description = "Extrude edges and move result"; otmacro= WM_operatortype_macro_define(ot, "MESH_OT_extrude_edges_indiv"); otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); RNA_enum_set(otmacro->ptr, "proportional", 0); - RNA_boolean_set(otmacro->ptr, "mirror", 0); + RNA_boolean_set(otmacro->ptr, "mirror", FALSE); ot= WM_operatortype_append_macro("MESH_OT_extrude_vertices_move", "Extrude Only Vertices and Move", OPTYPE_UNDO|OPTYPE_REGISTER); ot->description = "Extrude vertices and move result"; @@ -237,7 +237,7 @@ void ED_operatormacros_mesh(void) RNA_enum_set(otmacro->ptr, "type", 4); otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); RNA_enum_set(otmacro->ptr, "proportional", 0); - RNA_boolean_set(otmacro->ptr, "mirror", 0); + RNA_boolean_set(otmacro->ptr, "mirror", FALSE); } /* note mesh keymap also for other space? */ diff --git a/source/blender/editors/metaball/mball_ops.c b/source/blender/editors/metaball/mball_ops.c index 4c69bb3e559..c7635bcf2cc 100644 --- a/source/blender/editors/metaball/mball_ops.c +++ b/source/blender/editors/metaball/mball_ops.c @@ -37,6 +37,8 @@ #include "ED_mball.h" #include "ED_screen.h" +#include "BLI_utildefines.h" + #include "mball_intern.h" void ED_operatortypes_metaball(void) @@ -62,8 +64,10 @@ void ED_keymap_metaball(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "OBJECT_OT_metaball_add", AKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "MBALL_OT_reveal_metaelems", HKEY, KM_PRESS, KM_ALT, 0); - WM_keymap_add_item(keymap, "MBALL_OT_hide_metaelems", HKEY, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "MBALL_OT_hide_metaelems", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "unselected", 1); + kmi = WM_keymap_add_item(keymap, "MBALL_OT_hide_metaelems", HKEY, KM_PRESS, 0, 0); + RNA_boolean_set(kmi->ptr, "unselected", FALSE); + kmi = WM_keymap_add_item(keymap, "MBALL_OT_hide_metaelems", HKEY, KM_PRESS, KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "unselected", TRUE); WM_keymap_add_item(keymap, "MBALL_OT_delete_metaelems", XKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "MBALL_OT_delete_metaelems", DELKEY, KM_PRESS, 0, 0); diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 536b2f70c31..70a1aa73fc9 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -486,7 +486,7 @@ static int object_camera_add_exec(bContext *C, wmOperator *op) float loc[3], rot[3]; /* force view align for cameras */ - RNA_boolean_set(op->ptr, "view_align", 1); + RNA_boolean_set(op->ptr, "view_align", TRUE); object_add_generic_invoke_options(C, op); diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c index eba4dd1878a..542b75e1f19 100644 --- a/source/blender/editors/object/object_ops.c +++ b/source/blender/editors/object/object_ops.c @@ -236,7 +236,7 @@ void ED_operatormacros_object(void) if(ot) { ot->description = "Duplicate selected objects and move them"; otmacro= WM_operatortype_macro_define(ot, "OBJECT_OT_duplicate"); - RNA_boolean_set(otmacro->ptr, "linked", 1); + RNA_boolean_set(otmacro->ptr, "linked", TRUE); otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); RNA_enum_set(otmacro->ptr, "proportional", PROP_EDIT_OFF); } diff --git a/source/blender/editors/physics/physics_ops.c b/source/blender/editors/physics/physics_ops.c index ebd3dc6617d..473ed50b5e2 100644 --- a/source/blender/editors/physics/physics_ops.c +++ b/source/blender/editors/physics/physics_ops.c @@ -96,20 +96,27 @@ static void keymap_particle(wmKeyConfig *keyconf) keymap= WM_keymap_find(keyconf, "Particle", 0, 0); keymap->poll= PE_poll; - WM_keymap_add_item(keymap, "PARTICLE_OT_select_all", AKEY, KM_PRESS, 0, 0); - RNA_enum_set(WM_keymap_add_item(keymap, "PARTICLE_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0)->ptr, "action", SEL_INVERT); + kmi = WM_keymap_add_item(keymap, "PARTICLE_OT_select_all", AKEY, KM_PRESS, 0, 0); + RNA_enum_set(kmi->ptr, "action", SEL_TOGGLE); + kmi = WM_keymap_add_item(keymap, "PARTICLE_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0); + RNA_enum_set(kmi->ptr, "action", SEL_INVERT); WM_keymap_add_item(keymap, "PARTICLE_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "PARTICLE_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0); - WM_keymap_add_item(keymap, "PARTICLE_OT_select_linked", LKEY, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "PARTICLE_OT_select_linked", LKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "deselect", 1); + + kmi = WM_keymap_add_item(keymap, "PARTICLE_OT_select_linked", LKEY, KM_PRESS, 0, 0); + RNA_boolean_set(kmi->ptr, "deselect", FALSE); + kmi = WM_keymap_add_item(keymap, "PARTICLE_OT_select_linked", LKEY, KM_PRESS, KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "deselect", TRUE); WM_keymap_add_item(keymap, "PARTICLE_OT_delete", XKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "PARTICLE_OT_delete", DELKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "PARTICLE_OT_reveal", HKEY, KM_PRESS, KM_ALT, 0); - WM_keymap_add_item(keymap, "PARTICLE_OT_hide", HKEY, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "PARTICLE_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "unselected", 1); + kmi = WM_keymap_add_item(keymap, "PARTICLE_OT_hide", HKEY, KM_PRESS, 0, 0); + RNA_boolean_set(kmi->ptr, "unselected", FALSE); + kmi = WM_keymap_add_item(keymap, "PARTICLE_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "unselected", TRUE); kmi = WM_keymap_verify_item(keymap, "VIEW3D_OT_manipulator", LEFTMOUSE, KM_PRESS, KM_ANY, 0); RNA_boolean_set(kmi->ptr, "release_confirm", TRUE); diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c index 6bb3b2ca7f8..13383445c93 100644 --- a/source/blender/editors/render/render_opengl.c +++ b/source/blender/editors/render/render_opengl.c @@ -272,8 +272,8 @@ static int screen_opengl_render_init(bContext *C, wmOperator *op) /* ensure we have a 3d view */ if(!ED_view3d_context_activate(C)) { - RNA_boolean_set(op->ptr, "view_context", 0); - is_view_context= 0; + RNA_boolean_set(op->ptr, "view_context", FALSE); + is_view_context = 0; } /* only one render job at a time */ diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index a3874c9f28a..e18851893bd 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -3490,7 +3490,7 @@ void ED_keymap_screen(wmKeyConfig *keyconf) { ListBase *lb; wmKeyMap *keymap; - //wmKeyMapItem *kmi; + wmKeyMapItem *kmi; /* Screen Editing ------------------------------------------------ */ keymap= WM_keymap_find(keyconf, "Screen Editing", 0, 0); @@ -3557,7 +3557,8 @@ void ED_keymap_screen(wmKeyConfig *keyconf) /* render */ WM_keymap_add_item(keymap, "RENDER_OT_render", F12KEY, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "RENDER_OT_render", F12KEY, KM_PRESS, KM_CTRL, 0)->ptr, "animation", 1); + kmi = WM_keymap_add_item(keymap, "RENDER_OT_render", F12KEY, KM_PRESS, KM_CTRL, 0); + RNA_boolean_set(kmi->ptr, "animation", TRUE); WM_keymap_add_item(keymap, "RENDER_OT_view_cancel", ESCKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "RENDER_OT_view_show", F11KEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "RENDER_OT_play_rendered_anim", F11KEY, KM_PRESS, KM_CTRL, 0); @@ -3581,20 +3582,21 @@ void ED_keymap_screen(wmKeyConfig *keyconf) RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_offset", WHEELDOWNMOUSE, KM_PRESS, KM_ALT, 0)->ptr, "delta", 1); RNA_int_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_offset", WHEELUPMOUSE, KM_PRESS, KM_ALT, 0)->ptr, "delta", -1); - RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", UPARROWKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "end", 1); - RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", DOWNARROWKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "end", 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", RIGHTARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "end", 1); - RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", LEFTARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "end", 0); + RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", UPARROWKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "end", TRUE); + RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", DOWNARROWKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "end", FALSE); + RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", RIGHTARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "end", TRUE); + RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_frame_jump", LEFTARROWKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "end", FALSE); WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", UPARROWKEY, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", DOWNARROWKEY, KM_PRESS, 0, 0)->ptr, "next", 0); + RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", DOWNARROWKEY, KM_PRESS, 0, 0)->ptr, "next", FALSE); WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", MEDIALAST, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", MEDIAFIRST, KM_PRESS, 0, 0)->ptr, "next", 0); + kmi = WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", MEDIAFIRST, KM_PRESS, 0, 0); + RNA_boolean_set(kmi->ptr, "next", FALSE); /* play (forward and backwards) */ WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", AKEY, KM_PRESS, KM_ALT, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", AKEY, KM_PRESS, KM_ALT|KM_SHIFT, 0)->ptr, "reverse", 1); + RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", AKEY, KM_PRESS, KM_ALT|KM_SHIFT, 0)->ptr, "reverse", TRUE); WM_keymap_add_item(keymap, "SCREEN_OT_animation_cancel", ESCKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", MEDIAPLAY, KM_PRESS, 0, 0); diff --git a/source/blender/editors/sculpt_paint/paint_ops.c b/source/blender/editors/sculpt_paint/paint_ops.c index 2a0ebb8316d..d4578e17b3d 100644 --- a/source/blender/editors/sculpt_paint/paint_ops.c +++ b/source/blender/editors/sculpt_paint/paint_ops.c @@ -583,8 +583,10 @@ void ED_keymap_paint(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "PAINT_OT_vert_select_all", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "PAINT_OT_vert_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "VIEW3D_OT_select_border", BKEY, KM_PRESS, 0, 0); - WM_keymap_add_item(keymap, "VIEW3D_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW3D_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_SHIFT|KM_CTRL, 0)->ptr, "deselect", 1); + kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL, 0); + RNA_boolean_set(kmi->ptr, "deselect", FALSE); + kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_SHIFT|KM_CTRL, 0); + RNA_boolean_set(kmi->ptr, "deselect", TRUE); WM_keymap_add_item(keymap, "VIEW3D_OT_select_circle", CKEY, KM_PRESS, 0, 0); /* Image/Texture Paint mode */ @@ -609,8 +611,10 @@ void ED_keymap_paint(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "PAINT_OT_face_select_all", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "PAINT_OT_face_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0); - WM_keymap_add_item(keymap, "PAINT_OT_face_select_hide", HKEY, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "PAINT_OT_face_select_hide", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "unselected", 1); + kmi = WM_keymap_add_item(keymap, "PAINT_OT_face_select_hide", HKEY, KM_PRESS, 0, 0); + RNA_boolean_set(kmi->ptr, "unselected", FALSE); + kmi = WM_keymap_add_item(keymap, "PAINT_OT_face_select_hide", HKEY, KM_PRESS, KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "unselected", TRUE); WM_keymap_add_item(keymap, "PAINT_OT_face_select_reveal", HKEY, KM_PRESS, KM_ALT, 0); WM_keymap_add_item(keymap, "PAINT_OT_face_select_linked", LKEY, KM_PRESS, KM_CTRL, 0); diff --git a/source/blender/editors/space_clip/clip_ops.c b/source/blender/editors/space_clip/clip_ops.c index 45c7043c44c..06dd96603ef 100644 --- a/source/blender/editors/space_clip/clip_ops.c +++ b/source/blender/editors/space_clip/clip_ops.c @@ -999,5 +999,5 @@ void ED_operatormacros_clip(void) ot->description = "Add new marker and slide it with mouse until mouse button release"; WM_operatortype_macro_define(ot, "CLIP_OT_add_marker"); otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); - RNA_boolean_set(otmacro->ptr, "release_confirm", 1); + RNA_boolean_set(otmacro->ptr, "release_confirm", TRUE); } diff --git a/source/blender/editors/space_clip/space_clip.c b/source/blender/editors/space_clip/space_clip.c index b2527fbe4e0..3d584378135 100644 --- a/source/blender/editors/space_clip/space_clip.c +++ b/source/blender/editors/space_clip/space_clip.c @@ -463,10 +463,14 @@ static void clip_keymap(struct wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "CLIP_OT_change_frame", LEFTMOUSE, KM_PRESS, 0, 0); /* selection */ - WM_keymap_add_item(keymap, "CLIP_OT_select", SELECTMOUSE, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "CLIP_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", 1); - WM_keymap_add_item(keymap, "CLIP_OT_select_all", AKEY, KM_PRESS, 0, 0); - RNA_enum_set(WM_keymap_add_item(keymap, "CLIP_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0)->ptr, "action", SEL_INVERT); + kmi = WM_keymap_add_item(keymap, "CLIP_OT_select", SELECTMOUSE, KM_PRESS, 0, 0); + RNA_boolean_set(kmi->ptr, "extend", FALSE); + kmi = WM_keymap_add_item(keymap, "CLIP_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "extend", TRUE); + kmi = WM_keymap_add_item(keymap, "CLIP_OT_select_all", AKEY, KM_PRESS, 0, 0); + RNA_enum_set(kmi->ptr, "action", SEL_TOGGLE); + kmi = WM_keymap_add_item(keymap, "CLIP_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0); + RNA_enum_set(kmi->ptr, "action", SEL_INVERT); WM_keymap_add_item(keymap, "CLIP_OT_select_border", BKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "CLIP_OT_select_circle", CKEY, KM_PRESS, 0, 0); WM_keymap_add_menu(keymap, "CLIP_MT_select_grouped", GKEY, KM_PRESS, KM_SHIFT, 0); @@ -530,8 +534,10 @@ static void clip_keymap(struct wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "CLIP_OT_change_frame", ACTIONMOUSE, KM_PRESS, 0, 0); /* selection */ - WM_keymap_add_item(keymap, "CLIP_OT_graph_select", SELECTMOUSE, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "CLIP_OT_graph_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", 1); + kmi = WM_keymap_add_item(keymap, "CLIP_OT_graph_select", SELECTMOUSE, KM_PRESS, 0, 0); + RNA_boolean_set(kmi->ptr, "extend", FALSE); + kmi = WM_keymap_add_item(keymap, "CLIP_OT_graph_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "extend", TRUE); /* delete */ WM_keymap_add_item(keymap, "CLIP_OT_graph_delete_curve", DELKEY, KM_PRESS, 0, 0); diff --git a/source/blender/editors/space_console/space_console.c b/source/blender/editors/space_console/space_console.c index 1a2541cbc90..3df8e98be3a 100644 --- a/source/blender/editors/space_console/space_console.c +++ b/source/blender/editors/space_console/space_console.c @@ -293,7 +293,8 @@ static void console_keymap(struct wmKeyConfig *keyconf) RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", LEFTARROWKEY, KM_PRESS, 0, 0)->ptr, "type", PREV_CHAR); RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_move", RIGHTARROWKEY, KM_PRESS, 0, 0)->ptr, "type", NEXT_CHAR); - RNA_boolean_set(WM_keymap_add_item(keymap, "CONSOLE_OT_history_cycle", UPARROWKEY, KM_PRESS, 0, 0)->ptr, "reverse", 1); + kmi = WM_keymap_add_item(keymap, "CONSOLE_OT_history_cycle", UPARROWKEY, KM_PRESS, 0, 0); + RNA_boolean_set(kmi->ptr, "reverse", TRUE); WM_keymap_add_item(keymap, "CONSOLE_OT_history_cycle", DOWNARROWKEY, KM_PRESS, 0, 0); /* diff --git a/source/blender/editors/space_graph/graph_ops.c b/source/blender/editors/space_graph/graph_ops.c index aa245585d11..aba58098563 100644 --- a/source/blender/editors/space_graph/graph_ops.c +++ b/source/blender/editors/space_graph/graph_ops.c @@ -383,7 +383,8 @@ static void graphedit_keymap_keyframes (wmKeyConfig *keyconf, wmKeyMap *keymap) WM_keymap_add_item(keymap, "GRAPH_OT_view_selected", PADPERIOD, KM_PRESS, 0, 0); /* F-Modifiers */ - RNA_boolean_set(WM_keymap_add_item(keymap, "GRAPH_OT_fmodifier_add", MKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "only_active", 0); + kmi = WM_keymap_add_item(keymap, "GRAPH_OT_fmodifier_add", MKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "only_active", FALSE); /* animation module */ /* channels list diff --git a/source/blender/editors/space_nla/nla_ops.c b/source/blender/editors/space_nla/nla_ops.c index f173a3d3835..55831de876c 100644 --- a/source/blender/editors/space_nla/nla_ops.c +++ b/source/blender/editors/space_nla/nla_ops.c @@ -169,17 +169,23 @@ void nla_operatortypes(void) static void nla_keymap_channels(wmKeyMap *keymap) { + wmKeyMapItem *kmi; + /* NLA-specific (different to standard channels keymap) -------------------------- */ /* selection */ /* click-select */ // XXX for now, only leftmouse.... - WM_keymap_add_item(keymap, "NLA_OT_channels_click", LEFTMOUSE, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "NLA_OT_channels_click", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", 1); + kmi = WM_keymap_add_item(keymap, "NLA_OT_channels_click", LEFTMOUSE, KM_PRESS, 0, 0); + RNA_boolean_set(kmi->ptr, "extend", FALSE); + kmi = WM_keymap_add_item(keymap, "NLA_OT_channels_click", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "extend", TRUE); /* channel operations */ /* add tracks */ - WM_keymap_add_item(keymap, "NLA_OT_tracks_add", AKEY, KM_PRESS, KM_SHIFT, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "NLA_OT_tracks_add", AKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "above_selected", 1); + kmi = WM_keymap_add_item(keymap, "NLA_OT_tracks_add", AKEY, KM_PRESS, KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "above_selected", FALSE); + kmi = WM_keymap_add_item(keymap, "NLA_OT_tracks_add", AKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "above_selected", TRUE); /* delete tracks */ WM_keymap_add_item(keymap, "NLA_OT_delete_tracks", XKEY, KM_PRESS, 0, 0); diff --git a/source/blender/editors/space_node/node_ops.c b/source/blender/editors/space_node/node_ops.c index b71776f4266..508021540b5 100644 --- a/source/blender/editors/space_node/node_ops.c +++ b/source/blender/editors/space_node/node_ops.c @@ -114,8 +114,10 @@ void ED_operatormacros_node(void) /* modified operator call for duplicating with input links */ ot= WM_operatortype_append_macro("NODE_OT_duplicate_move_keep_inputs", "Duplicate", OPTYPE_UNDO|OPTYPE_REGISTER); ot->description = "Duplicate selected nodes keeping input links and move them"; + mot = WM_operatortype_macro_define(ot, "NODE_OT_duplicate"); - RNA_boolean_set(mot->ptr, "keep_inputs", 1); + RNA_boolean_set(mot->ptr, "keep_inputs", TRUE); + WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate"); ot= WM_operatortype_append_macro("NODE_OT_select_link_viewer", "Link Viewer", OPTYPE_UNDO); @@ -144,11 +146,12 @@ void node_keymap(struct wmKeyConfig *keyconf) RNA_boolean_set(kmi->ptr, "extend", FALSE); kmi = WM_keymap_add_item(keymap, "NODE_OT_select", SELECTMOUSE, KM_PRESS, 0, 0); RNA_boolean_set(kmi->ptr, "extend", FALSE); - kmi= WM_keymap_add_item(keymap, "NODE_OT_select", ACTIONMOUSE, KM_PRESS, KM_SHIFT, 0); + kmi = WM_keymap_add_item(keymap, "NODE_OT_select", ACTIONMOUSE, KM_PRESS, KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "extend", TRUE); - kmi= WM_keymap_add_item(keymap, "NODE_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0); + kmi = WM_keymap_add_item(keymap, "NODE_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "extend", TRUE); - RNA_boolean_set(WM_keymap_add_item(keymap, "NODE_OT_select_border", EVT_TWEAK_S, KM_ANY, 0, 0)->ptr, "tweak", 1); + kmi = WM_keymap_add_item(keymap, "NODE_OT_select_border", EVT_TWEAK_S, KM_ANY, 0, 0); + RNA_boolean_set(kmi->ptr, "tweak", TRUE); /* each of these falls through if not handled... */ WM_keymap_add_item(keymap, "NODE_OT_link", LEFTMOUSE, KM_PRESS, 0, 0); @@ -163,10 +166,12 @@ void node_keymap(struct wmKeyConfig *keyconf) kmi= WM_keymap_add_item(keymap, "NODE_OT_backimage_zoom", VKEY, KM_PRESS, KM_ALT, 0); RNA_float_set(kmi->ptr, "factor", 1.2f); WM_keymap_add_item(keymap, "NODE_OT_backimage_sample", ACTIONMOUSE, KM_PRESS, KM_ALT, 0); - - WM_keymap_add_item(keymap, "NODE_OT_link_make", FKEY, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "NODE_OT_link_make", FKEY, KM_PRESS, KM_CTRL, 0)->ptr, "replace", 1); - + + kmi = WM_keymap_add_item(keymap, "NODE_OT_link_make", FKEY, KM_PRESS, 0, 0); + RNA_boolean_set(kmi->ptr, "replace", FALSE); + kmi = WM_keymap_add_item(keymap, "NODE_OT_link_make", FKEY, KM_PRESS, KM_CTRL, 0); + RNA_boolean_set(kmi->ptr, "replace", TRUE); + WM_keymap_add_menu(keymap, "NODE_MT_add", AKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "NODE_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0); /* modified operator call for duplicating with input links */ @@ -180,7 +185,10 @@ void node_keymap(struct wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "NODE_OT_show_cyclic_dependencies", CKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "NODE_OT_view_all", HOMEKEY, KM_PRESS, 0, 0); - WM_keymap_add_item(keymap, "NODE_OT_select_border", BKEY, KM_PRESS, 0, 0); + + kmi = WM_keymap_add_item(keymap, "NODE_OT_select_border", BKEY, KM_PRESS, 0, 0); + RNA_boolean_set(kmi->ptr, "tweak", FALSE); + WM_keymap_add_item(keymap, "NODE_OT_delete", XKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "NODE_OT_delete", DELKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "NODE_OT_delete_reconnect", XKEY, KM_PRESS, KM_CTRL, 0); diff --git a/source/blender/editors/space_outliner/outliner_ops.c b/source/blender/editors/space_outliner/outliner_ops.c index 0d3f2e85414..a424520c76f 100644 --- a/source/blender/editors/space_outliner/outliner_ops.c +++ b/source/blender/editors/space_outliner/outliner_ops.c @@ -38,6 +38,7 @@ #include "RNA_access.h" +#include "BLI_utildefines.h" #include "outliner_intern.h" @@ -80,14 +81,19 @@ void outliner_operatortypes(void) void outliner_keymap(wmKeyConfig *keyconf) { wmKeyMap *keymap= WM_keymap_find(keyconf, "Outliner", SPACE_OUTLINER, 0); + wmKeyMapItem *kmi; WM_keymap_add_item(keymap, "OUTLINER_OT_item_rename", LEFTMOUSE, KM_DBL_CLICK, 0, 0); + + kmi = WM_keymap_add_item(keymap, "OUTLINER_OT_item_activate", LEFTMOUSE, KM_CLICK, 0, 0); + RNA_boolean_set(kmi->ptr, "extend", FALSE); + kmi = WM_keymap_add_item(keymap, "OUTLINER_OT_item_activate", LEFTMOUSE, KM_CLICK, KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "extend", TRUE); - RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_activate", LEFTMOUSE, KM_CLICK, 0, 0)->ptr, "extend", 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_activate", LEFTMOUSE, KM_CLICK, KM_SHIFT, 0)->ptr, "extend", 1); - - RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_openclose", RETKEY, KM_PRESS, 0, 0)->ptr, "all", 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_item_openclose", RETKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "all", 1); + kmi = WM_keymap_add_item(keymap, "OUTLINER_OT_item_openclose", RETKEY, KM_PRESS, 0, 0); + RNA_boolean_set(kmi->ptr, "all", FALSE); + kmi = WM_keymap_add_item(keymap, "OUTLINER_OT_item_openclose", RETKEY, KM_PRESS, KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "all", TRUE); WM_keymap_add_item(keymap, "OUTLINER_OT_item_rename", LEFTMOUSE, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "OUTLINER_OT_operation", RIGHTMOUSE, KM_PRESS, 0, 0); @@ -98,10 +104,12 @@ void outliner_keymap(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "OUTLINER_OT_show_active", PADPERIOD, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "OUTLINER_OT_scroll_page", PAGEDOWNKEY, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_scroll_page", PAGEUPKEY, KM_PRESS, 0, 0)->ptr, "up", 1); + kmi = WM_keymap_add_item(keymap, "OUTLINER_OT_scroll_page", PAGEUPKEY, KM_PRESS, 0, 0); + RNA_boolean_set(kmi->ptr, "up", TRUE); WM_keymap_add_item(keymap, "OUTLINER_OT_show_one_level", PADPLUSKEY, KM_PRESS, 0, 0); /* open */ - RNA_boolean_set(WM_keymap_add_item(keymap, "OUTLINER_OT_show_one_level", PADMINUS, KM_PRESS, 0, 0)->ptr, "open", 0); /* close */ + kmi = WM_keymap_add_item(keymap, "OUTLINER_OT_show_one_level", PADMINUS, KM_PRESS, 0, 0); + RNA_boolean_set(kmi->ptr, "open", FALSE); /* close */ WM_keymap_verify_item(keymap, "OUTLINER_OT_selected_toggle", AKEY, KM_PRESS, 0, 0); WM_keymap_verify_item(keymap, "OUTLINER_OT_expanded_toggle", AKEY, KM_PRESS, KM_SHIFT, 0); diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index 56c2e0ee4d1..c46a1eebc2e 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -3034,10 +3034,10 @@ static int sequencer_change_path_invoke(bContext *C, wmOperator *op, wmEvent *UN /* set default display depending on seq type */ if(seq->type == SEQ_IMAGE) { - RNA_boolean_set(op->ptr, "filter_movie", 0); + RNA_boolean_set(op->ptr, "filter_movie", FALSE); } else { - RNA_boolean_set(op->ptr, "filter_image", 0); + RNA_boolean_set(op->ptr, "filter_image", FALSE); } WM_event_add_fileselect(C, op); diff --git a/source/blender/editors/space_sequencer/sequencer_ops.c b/source/blender/editors/space_sequencer/sequencer_ops.c index 986aab8fa61..ec9f8bb36d9 100644 --- a/source/blender/editors/space_sequencer/sequencer_ops.c +++ b/source/blender/editors/space_sequencer/sequencer_ops.c @@ -136,9 +136,11 @@ void sequencer_keymap(wmKeyConfig *keyconf) RNA_enum_set(kmi->ptr, "action", SEL_TOGGLE); kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0); RNA_enum_set(kmi->ptr, "action", SEL_INVERT); - - RNA_enum_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_cut", KKEY, KM_PRESS, 0, 0)->ptr, "type", SEQ_CUT_SOFT); - RNA_enum_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_cut", KKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", SEQ_CUT_HARD); + + kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_cut", KKEY, KM_PRESS, 0, 0); + RNA_enum_set(kmi->ptr, "type", SEQ_CUT_SOFT); + kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_cut", KKEY, KM_PRESS, KM_SHIFT, 0); + RNA_enum_set(kmi->ptr, "type", SEQ_CUT_HARD); kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_mute", HKEY, KM_PRESS, 0, 0); RNA_boolean_set(kmi->ptr, "unselected", FALSE); @@ -212,8 +214,10 @@ void sequencer_keymap(wmKeyConfig *keyconf) /* 2.4x method, now use Alt for handles and select the side based on which handle was selected */ /* - RNA_boolean_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, KM_CTRL, 0)->ptr, "linked_left", 1); - RNA_boolean_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, KM_ALT, 0)->ptr, "linked_right", 1); + kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, KM_CTRL, 0); + RNA_boolean_set(kmi->ptr, "linked_left", TRUE); + kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, KM_ALT, 0); + RNA_boolean_set(kmi->ptr, "linked_right", TRUE); kmi= WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, KM_CTRL|KM_ALT, 0); RNA_boolean_set(kmi->ptr, "linked_left", TRUE); @@ -263,8 +267,10 @@ void sequencer_keymap(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "SEQUENCER_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "SEQUENCER_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0); - WM_keymap_add_item(keymap, "SEQUENCER_OT_select_linked_pick", LKEY, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_select_linked_pick", LKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", 1); + kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_select_linked_pick", LKEY, KM_PRESS, 0, 0); + RNA_boolean_set(kmi->ptr, "extend", FALSE); + kmi = WM_keymap_add_item(keymap, "SEQUENCER_OT_select_linked_pick", LKEY, KM_PRESS, KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "extend", TRUE); WM_keymap_add_item(keymap, "SEQUENCER_OT_select_linked", LKEY, KM_PRESS, KM_CTRL, 0); diff --git a/source/blender/editors/space_text/space_text.c b/source/blender/editors/space_text/space_text.c index 441a5eab976..314afeac0e6 100644 --- a/source/blender/editors/space_text/space_text.c +++ b/source/blender/editors/space_text/space_text.c @@ -298,8 +298,10 @@ static void text_keymap(struct wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "TEXT_OT_copy", INSERTKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "TEXT_OT_paste", INSERTKEY, KM_PRESS, KM_SHIFT, 0); - if(U.uiflag & USER_MMB_PASTE) // XXX not dynamic - RNA_boolean_set(WM_keymap_add_item(keymap, "TEXT_OT_paste", MIDDLEMOUSE, KM_PRESS, 0, 0)->ptr, "selection", 1); + if(U.uiflag & USER_MMB_PASTE) { // XXX not dynamic + kmi = WM_keymap_add_item(keymap, "TEXT_OT_paste", MIDDLEMOUSE, KM_PRESS, 0, 0); + RNA_boolean_set(kmi->ptr, "selection", TRUE); + } WM_keymap_add_item(keymap, "TEXT_OT_jump", JKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "TEXT_OT_find", GKEY, KM_PRESS, KM_CTRL, 0); @@ -307,8 +309,10 @@ static void text_keymap(struct wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "TEXT_OT_properties", FKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "TEXT_OT_replace", HKEY, KM_PRESS, KM_CTRL, 0); - WM_keymap_add_item(keymap, "TEXT_OT_to_3d_object", MKEY, KM_PRESS, KM_ALT, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "TEXT_OT_to_3d_object", MKEY, KM_PRESS, KM_CTRL, 0)->ptr, "split_lines", 1); + kmi = WM_keymap_add_item(keymap, "TEXT_OT_to_3d_object", MKEY, KM_PRESS, KM_ALT, 0); + RNA_boolean_set(kmi->ptr, "split_lines", FALSE); + kmi = WM_keymap_add_item(keymap, "TEXT_OT_to_3d_object", MKEY, KM_PRESS, KM_CTRL, 0); + RNA_boolean_set(kmi->ptr, "split_lines", TRUE); WM_keymap_add_item(keymap, "TEXT_OT_select_all", AKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "TEXT_OT_select_line", AKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0); @@ -364,7 +368,8 @@ static void text_keymap(struct wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "TEXT_OT_scroll", MOUSEPAN, 0, 0, 0); WM_keymap_add_item(keymap, "TEXT_OT_selection_set", EVT_TWEAK_L, KM_ANY, 0, 0); WM_keymap_add_item(keymap, "TEXT_OT_cursor_set", LEFTMOUSE, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "TEXT_OT_selection_set", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "select", 1); + kmi = WM_keymap_add_item(keymap, "TEXT_OT_selection_set", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "select", TRUE); RNA_int_set(WM_keymap_add_item(keymap, "TEXT_OT_scroll", WHEELUPMOUSE, KM_PRESS, 0, 0)->ptr, "lines", -1); RNA_int_set(WM_keymap_add_item(keymap, "TEXT_OT_scroll", WHEELDOWNMOUSE, KM_PRESS, 0, 0)->ptr, "lines", 1); diff --git a/source/blender/editors/space_text/text_draw.c b/source/blender/editors/space_text/text_draw.c index 25b9c2f2864..8a78f236fea 100644 --- a/source/blender/editors/space_text/text_draw.c +++ b/source/blender/editors/space_text/text_draw.c @@ -72,7 +72,7 @@ static void text_font_end(SpaceText *UNUSED(st)) { } -static int text_font_draw(SpaceText *UNUSED(st), int x, int y, char *str) +static int text_font_draw(SpaceText *UNUSED(st), int x, int y, const char *str) { BLF_position(mono, x, y, 0); BLF_draw(mono, str, BLF_DRAW_STR_DUMMY_MAX); @@ -92,19 +92,28 @@ static int text_font_draw_character(SpaceText *st, int x, int y, char c) return st->cwidth; } -int text_font_width(SpaceText *UNUSED(st), const char *str) +static int text_font_draw_character_utf8(SpaceText *st, int x, int y, const char *c) { - return BLF_width(mono, str); + char str[BLI_UTF8_MAX+1]; + size_t len = BLI_str_utf8_size(c); + memcpy(str, c, len); + str[len]= '\0'; + + BLF_position(mono, x, y, 0); + BLF_draw(mono, str, len); + + return st->cwidth; } /****************** flatten string **********************/ -static void flatten_string_append(FlattenString *fs, char c, int accum) +static void flatten_string_append(FlattenString *fs, const char *c, int accum, int len) { - if(fs->pos>=fs->len && fs->pos>=sizeof(fs->fixedbuf)-1) { + int i; + + if(fs->pos+len > fs->len) { char *nbuf; int *naccum; - if(fs->len) fs->len*= 2; - else fs->len= sizeof(fs->fixedbuf) * 2; + fs->len*= 2; nbuf= MEM_callocN(sizeof(*fs->buf)*fs->len, "fs->buf"); naccum= MEM_callocN(sizeof(*fs->accum)*fs->len, "fs->accum"); @@ -121,35 +130,45 @@ static void flatten_string_append(FlattenString *fs, char c, int accum) fs->accum= naccum; } - fs->buf[fs->pos]= c; - fs->accum[fs->pos]= accum; - - fs->pos++; + for (i = 0; i < len; i++) + { + fs->buf[fs->pos+i]= c[i]; + fs->accum[fs->pos+i]= accum; + } + + fs->pos+= len; } int flatten_string(SpaceText *st, FlattenString *fs, const char *in) { - int r = 0, i = 0; + int r, i, total = 0; memset(fs, 0, sizeof(FlattenString)); fs->buf= fs->fixedbuf; fs->accum= fs->fixedaccum; - - for(r=0, i=0; *in; r++, in++) { - if(*in=='\t') { - if(fs->pos && *(in-1)=='\t') - i= st->tabnumber; - else if(st->tabnumber > 0) - i= st->tabnumber - (fs->pos%st->tabnumber); + fs->len = sizeof(fs->fixedbuf); + for(r = 0, i = 0; *in; r++) { + if(*in=='\t') { + i= st->tabnumber - (total%st->tabnumber); + total+= i; + while(i--) - flatten_string_append(fs, ' ', r); + flatten_string_append(fs, " ", r, 1); + + in++; + } + else { + size_t len= BLI_str_utf8_size(in); + flatten_string_append(fs, in, r, len); + in += len; + total++; } - else - flatten_string_append(fs, *in, r); } + + flatten_string_append(fs, "\0", r, 1); - return fs->pos; + return total; } void flatten_string_free(FlattenString *fs) @@ -304,9 +323,8 @@ static void txt_format_line(SpaceText *st, TextLine *line, int do_next) } else orig = 0xFF; - flatten_string(st, &fs, line->line); + len = flatten_string(st, &fs, line->line); str = fs.buf; - len = strlen(str); if(!text_check_format_len(line, len)) { flatten_string_free(&fs); return; @@ -318,7 +336,7 @@ static void txt_format_line(SpaceText *st, TextLine *line, int do_next) if(*str == '\\') { *fmt = prev; fmt++; str++; if(*str == '\0') break; - *fmt = prev; fmt++; str++; + *fmt = prev; fmt++; str += BLI_str_utf8_size(str); continue; } /* Handle continuations */ @@ -339,14 +357,16 @@ static void txt_format_line(SpaceText *st, TextLine *line, int do_next) } *fmt = 'l'; + str += BLI_str_utf8_size(str) - 1; } /* Not in a string... */ else { /* Deal with comments first */ - if(prev == '#' || *str == '#') + if(prev == '#' || *str == '#') { *fmt = '#'; - /* Strings */ - else if(*str == '"' || *str == '\'') { + str += BLI_str_utf8_size(str) - 1; + } else if(*str == '"' || *str == '\'') { + /* Strings */ find = *str; cont = (*str== '"') ? TXT_DBLQUOTSTR : TXT_SNGQUOTSTR; if(*(str+1) == find && *(str+2) == find) { @@ -371,14 +391,18 @@ static void txt_format_line(SpaceText *st, TextLine *line, int do_next) } *fmt = 'n'; } - else + else { + str += BLI_str_utf8_size(str) - 1; *fmt = 'q'; + } /* Punctuation */ else if(text_check_delim(*str)) *fmt = '!'; /* Identifiers and other text (no previous ws. or delims. so text continues) */ - else if(prev == 'q') + else if(prev == 'q') { + str += BLI_str_utf8_size(str) - 1; *fmt = 'q'; + } /* Not ws, a digit, punct, or continuing text. Must be new, check for special words */ else { /* Special vars(v) or built-in keywords(b) */ @@ -395,8 +419,10 @@ static void txt_format_line(SpaceText *st, TextLine *line, int do_next) } *fmt = prev; } - else + else { + str += BLI_str_utf8_size(str) - 1; *fmt = 'q'; + } } } prev = *fmt; @@ -408,14 +434,11 @@ static void txt_format_line(SpaceText *st, TextLine *line, int do_next) *fmt = '\0'; fmt++; *fmt = cont; - /* Debugging */ - //print_format(st, line); - /* If continuation has changed and we're allowed, process the next line */ if(cont!=orig && do_next && line->next) { txt_format_line(st, line->next, do_next); } - + flatten_string_free(&fs); } @@ -539,13 +562,14 @@ void wrap_offset(SpaceText *st, ARegion *ar, TextLine *linein, int cursin, int * } max= wrap_width(st, ar); + cursin = txt_utf8_offset_to_index(linein->line, cursin); while(linep) { start= 0; end= max; chop= 1; *offc= 0; - for(i=0, j=0; linep->line[j]!='\0'; j++) { + for(i=0, j=0; linep->line[j]; j+=BLI_str_utf8_size(linep->line+j)) { int chars; /* Mimic replacement of tabs */ @@ -591,6 +615,7 @@ void wrap_offset(SpaceText *st, ARegion *ar, TextLine *linein, int cursin, int * } } +/* cursin - mem, offc - view */ void wrap_offset_in_line(SpaceText *st, ARegion *ar, TextLine *linein, int cursin, int *offl, int *offc) { int i, j, start, end, chars, max, chop; @@ -607,8 +632,9 @@ void wrap_offset_in_line(SpaceText *st, ARegion *ar, TextLine *linein, int cursi end= max; chop= 1; *offc= 0; + cursin = txt_utf8_offset_to_index(linein->line, cursin); - for(i=0, j=0; linein->line[j]!='\0'; j++) { + for(i=0, j=0; linein->line[j]; j += BLI_str_utf8_size(linein->line + j)) { /* Mimic replacement of tabs */ ch= linein->line[j]; @@ -653,7 +679,7 @@ int text_get_char_pos(SpaceText *st, const char *line, int cur) { int a=0, i; - for(i=0; i<cur && line[i]; i++) { + for(i=0; i<cur && line[i]; i += BLI_str_utf8_size(line + i)) { if(line[i]=='\t') a += st->tabnumber-a%st->tabnumber; else @@ -662,54 +688,65 @@ int text_get_char_pos(SpaceText *st, const char *line, int cur) return a; } -static int text_draw_wrapped(SpaceText *st, char *str, int x, int y, int w, char *format, int skip) +static const char *txt_utf8_get_nth(const char *str, int n) +{ + int pos= 0; + while (str[pos] && n--) { + pos+= BLI_str_utf8_size(str + pos); + } + return str + pos; +} + +static int text_draw_wrapped(SpaceText *st, const char *str, int x, int y, int w, const char *format, int skip) { FlattenString fs; - int basex, i, a, len, start, end, max, lines; + int basex, i, a, start, end, max, lines; /* view */ + int mi, ma, mstart, mend; /* mem */ - len= flatten_string(st, &fs, str); + flatten_string(st, &fs, str); str= fs.buf; max= w/st->cwidth; if(max<8) max= 8; basex= x; - lines= 1; - start= 0; - end= max; - for(i=0; i<len; i++) { + + start= 0; mstart= 0; + end= max; mend= txt_utf8_get_nth(str, max) - str; + + for(i=0, mi=0; str[mi]; i++, mi+=BLI_str_utf8_size(str+mi)) { if(i-start >= max) { /* skip hidden part of line */ if(skip) { skip--; - start= end; - end += max; + start= end; mstart= mend; + end += max; mend= txt_utf8_get_nth(str+mend, max) - str; continue; } /* Draw the visible portion of text on the overshot line */ - for(a=start; a<end; a++) { + for(a=start, ma=mstart; a<end; a++, ma+=BLI_str_utf8_size(str+ma)) { if(st->showsyntax && format) format_draw_color(format[a]); - x += text_font_draw_character(st, x, y, str[a]); + x += text_font_draw_character_utf8(st, x, y, str + ma); } y -= st->lheight; x= basex; lines++; - start= end; - end += max; + start= end; mstart= mend; + end += max; mend= txt_utf8_get_nth(str+mend, max) - str; if(y<=0) break; } - else if(str[i]==' ' || str[i]=='-') { - end = i+1; + else if(str[mi]==' ' || str[mi]=='-') { + end = i+1; mend = mi+1; } } /* Draw the remaining text */ - for(a=start; a<len && y > 0; a++) { + for(a=start, ma=mstart; str[ma] && y > 0; a++, ma+=BLI_str_utf8_size(str+ma)) { if(st->showsyntax && format) format_draw_color(format[a]); - x += text_font_draw_character(st, x, y, str[a]); + x += text_font_draw_character_utf8(st, x, y, str+ma); } flatten_string_free(&fs); @@ -717,45 +754,36 @@ static int text_draw_wrapped(SpaceText *st, char *str, int x, int y, int w, char return lines; } -static int text_draw(SpaceText *st, char *str, int cshift, int maxwidth, int draw, int x, int y, char *format) +static int text_draw(SpaceText *st, char *str, int cshift, int maxwidth, int draw, int x, int y, const char *format) { FlattenString fs; - int r=0, w= 0, amount; - int *acc; - char *in; + int *acc, r=0; + const char *in; - w= flatten_string(st, &fs, str); + int w= flatten_string(st, &fs, str); if(w < cshift) { flatten_string_free(&fs); return 0; /* String is shorter than shift */ } - in= fs.buf+cshift; + in= txt_utf8_get_nth(fs.buf, cshift); acc= fs.accum+cshift; w= w-cshift; if(draw) { + int amount = maxwidth ? MIN2(w, maxwidth) : w; + if(st->showsyntax && format) { - int a; + int a, str_shift= 0; format = format+cshift; - - amount = strlen(in); - if(maxwidth) - amount= MIN2(amount, maxwidth); - + for(a = 0; a < amount; a++) { format_draw_color(format[a]); - x += text_font_draw_character(st, x, y, in[a]); + x += text_font_draw_character_utf8(st, x, y, in + str_shift); + str_shift += BLI_str_utf8_size(in + str_shift); } } - else { - amount = strlen(in); - if(maxwidth) - amount= MIN2(amount, maxwidth); - - in[amount]= 0; - text_font_draw(st, x, y, in); - } + else text_font_draw(st, x, y, in); } else { while(w-- && *acc++ < maxwidth) @@ -976,8 +1004,8 @@ int text_get_visible_lines(SpaceText *st, ARegion *ar, const char *str) max= wrap_width(st, ar); lines= 1; start= 0; - end= max; - for(i= 0, j= 0; str[j] != '\0'; j++) { + end= max; + for(i= 0, j= 0; str[j]; j+=BLI_str_utf8_size(str+j)) { /* Mimic replacement of tabs */ ch= str[j]; if(ch=='\t') { @@ -1421,7 +1449,7 @@ static void draw_suggestion_list(SpaceText *st, ARegion *ar) BLI_strncpy(str, item->name, SUGG_LIST_WIDTH); - w = text_font_width(st, str); + w = BLF_width(mono, str); if(item == sel) { UI_ThemeColor(TH_SHADE2); @@ -1496,8 +1524,6 @@ static void draw_cursor(SpaceText *st, ARegion *ar) glRecti(x-4, y, ar->winx, y-st->lheight), y-=st->lheight; glRecti(x-4, y, x+toc*st->cwidth, y-st->lheight); y-=st->lheight; - - (void)y; } } else { @@ -1569,8 +1595,9 @@ static void draw_brackets(SpaceText *st, ARegion *ar) { TextLine *startl, *endl, *linep; Text *text = st->text; - int b, c, startc, endc, find, stack; - int viewc, viewl, offl, offc, x, y; + int b, fc, find, stack, viewc, viewl, offl, offc, x, y; + int startc, endc, c; + char ch; // showsyntax must be on or else the format string will be null @@ -1584,21 +1611,23 @@ static void draw_brackets(SpaceText *st, ARegion *ar) linep= startl; c= startc; + fc= txt_utf8_offset_to_index(linep->line, startc); endl= NULL; endc= -1; find= -b; stack= 0; /* Dont highlight backets if syntax HL is off or bracket in string or comment. */ - if(!linep->format || linep->format[c] == 'l' || linep->format[c] == '#') + if(!linep->format || linep->format[fc] == 'l' || linep->format[fc] == '#') return; if(b>0) { /* opening bracket, search forward for close */ - c++; + fc++; + c+= BLI_str_utf8_size(linep->line+c); while(linep) { while(c<linep->len) { - if(linep->format && linep->format[c] != 'l' && linep->format[c] != '#') { + if(linep->format && linep->format[fc] != 'l' && linep->format[fc] != '#') { b= text_check_bracket(linep->line[c]); if(b==find) { if(stack==0) { @@ -1612,19 +1641,22 @@ static void draw_brackets(SpaceText *st, ARegion *ar) stack++; } } - c++; + fc++; + c+= BLI_str_utf8_size(linep->line+c); } if(endl) break; linep= linep->next; c= 0; + fc= 0; } } else { /* closing bracket, search backward for open */ - c--; + fc--; + if (c>0) c -= linep->line+c-BLI_str_prev_char_utf8(linep->line+c); while(linep) { - while(c>=0) { - if(linep->format && linep->format[c] != 'l' && linep->format[c] != '#') { + while(fc>=0) { + if(linep->format && linep->format[fc] != 'l' && linep->format[fc] != '#') { b= text_check_bracket(linep->line[c]); if(b==find) { if(stack==0) { @@ -1638,11 +1670,17 @@ static void draw_brackets(SpaceText *st, ARegion *ar) stack++; } } - c--; + fc--; + if (c>0) c -= linep->line+c-BLI_str_prev_char_utf8(linep->line+c); } if(endl) break; linep= linep->prev; - if(linep) c= linep->len-1; + if(linep) { + if (linep->format) fc= strlen(linep->format)-1; + else fc= -1; + if (linep->len) c= BLI_str_prev_char_utf8(linep->line+linep->len)-linep->line; + else fc= -1; + } } } diff --git a/source/blender/editors/space_text/text_intern.h b/source/blender/editors/space_text/text_intern.h index 62cd4fedf0e..043fb97547b 100644 --- a/source/blender/editors/space_text/text_intern.h +++ b/source/blender/editors/space_text/text_intern.h @@ -47,9 +47,6 @@ struct wmWindowManager; /* text_draw.c */ void draw_text_main(struct SpaceText *st, struct ARegion *ar); -int text_font_width_character(struct SpaceText *st); -int text_font_width(struct SpaceText *st, const char *str); - void text_update_line_edited(struct TextLine *line); void text_update_edited(struct Text *text); void text_update_character_width(struct SpaceText *st); diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c index 19f0c9bba61..eab06474546 100644 --- a/source/blender/editors/space_text/text_ops.c +++ b/source/blender/editors/space_text/text_ops.c @@ -1420,7 +1420,7 @@ static int text_get_cursor_rel(SpaceText* st, ARegion *ar, TextLine *linein, int end= max; chop= loop= 1; - for(i=0, j=0; loop; j++) { + for(i=0, j=0; loop; j+=BLI_str_utf8_size(linein->line+j)) { int chars; /* Mimic replacement of tabs */ ch= linein->line[j]; @@ -1595,7 +1595,7 @@ static void txt_wrap_move_bol(SpaceText *st, ARegion *ar, short sel) chop= loop= 1; *charp= 0; - for(i=0, j=0; loop; j++) { + for(i=0, j=0; loop; j+=BLI_str_utf8_size((*linep)->line+j)) { int chars; /* Mimic replacement of tabs */ ch= (*linep)->line[j]; @@ -1610,7 +1610,7 @@ static void txt_wrap_move_bol(SpaceText *st, ARegion *ar, short sel) *charp= endj; if(j>=oldc) { - if(ch=='\0') *charp= start; + if(ch=='\0') *charp= txt_utf8_index_to_offset((*linep)->line, start); loop= 0; break; } @@ -1623,7 +1623,7 @@ static void txt_wrap_move_bol(SpaceText *st, ARegion *ar, short sel) } else if(ch==' ' || ch=='-' || ch=='\0') { if(j>=oldc) { - *charp= start; + *charp= txt_utf8_index_to_offset((*linep)->line, start); loop= 0; break; } @@ -1663,7 +1663,7 @@ static void txt_wrap_move_eol(SpaceText *st, ARegion *ar, short sel) chop= loop= 1; *charp= 0; - for(i=0, j=0; loop; j++) { + for(i=0, j=0; loop; j+=BLI_str_utf8_size((*linep)->line+j)) { int chars; /* Mimic replacement of tabs */ ch= (*linep)->line[j]; @@ -1675,7 +1675,7 @@ static void txt_wrap_move_eol(SpaceText *st, ARegion *ar, short sel) while(chars--) { if(i-start>=max) { - if(chop) endj= j-1; + if(chop) endj= BLI_str_prev_char_utf8((*linep)->line+j)-(*linep)->line; if(endj>=oldc) { if(ch=='\0') *charp= (*linep)->len; @@ -2364,148 +2364,183 @@ typedef struct SetSelection { short old[2]; } SetSelection; -static void text_cursor_set_to_pos(SpaceText *st, ARegion *ar, int x, int y, int sel) +static int flatten_len(SpaceText *st, const char *str) { - FlattenString fs; - Text *text= st->text; - TextLine **linep; - int *charp; - int w; - - text_update_character_width(st); + int i, total = 0; - if(sel) { linep= &text->sell; charp= &text->selc; } - else { linep= &text->curl; charp= &text->curc; } + for(i = 0; str[i]; i += BLI_str_utf8_size(str+i)) { + if(str[i]=='\t') { + total += st->tabnumber - total%st->tabnumber; + } + else total++; + } - y= (ar->winy - 2 - y)/st->lheight; - - if(st->showlinenrs) - x-= TXT_OFFSET+TEXTXLOC; - else - x-= TXT_OFFSET; + return total; +} - if(x<0) x= 0; - x = (x/st->cwidth) + st->left; +static int flatten_index_to_offset(SpaceText *st, const char *str, int index) +{ + int i, j; + for (i= 0, j= 0; i < index; j += BLI_str_utf8_size(str+j)) + if(str[j]=='\t') + i += st->tabnumber - i%st->tabnumber; + else + i++; - if(st->wordwrap) { - int i, j, endj, curs, max, chop, start, end, loop, found; - char ch; - - /* Point to first visible line */ - *linep= text->lines.first; - i= st->top; - while(i>0 && *linep) { - int lines= text_get_visible_lines(st, ar, (*linep)->line); + return j; +} - if (i-lines<0) { - y+= i; - break; - } else { - *linep= (*linep)->next; - i-= lines; - } +static TextLine *get_first_visible_line(SpaceText *st, ARegion *ar, int *y) +{ + TextLine *linep = st->text->lines.first; + int i; + for (i = st->top; i > 0 && linep; ) { + int lines = text_get_visible_lines(st, ar, linep->line); + + if (i-lines < 0) { + *y += i; + break; + } else { + linep = linep->next; + i -= lines; } + } + return linep; +} - max= wrap_width(st, ar); - - loop= 1; - found= 0; - while(loop && *linep) { - start= 0; - end= max; - chop= 1; - curs= 0; - endj= 0; - for(i=0, j=0; loop; j++) { - int chars; - - /* Mimic replacement of tabs */ - ch= (*linep)->line[j]; - if(ch=='\t') { - chars= st->tabnumber-i%st->tabnumber; - ch= ' '; - } - else - chars= 1; - - while(chars--) { - /* Gone too far, go back to last wrap point */ - if(y<0) { - *charp= endj; - loop= 0; - break; +static void text_cursor_set_to_pos_wrapped(SpaceText *st, ARegion *ar, int x, int y, int sel) +{ + Text *text = st->text; + int max = wrap_width(st, ar); /* view */ + int charp; /* mem */ + int loop = 1, found = 0; /* flags */ + char ch; + + /* Point to first visible line */ + TextLine *linep = get_first_visible_line(st, ar, &y); + + while(loop && linep) { + int i = 0, start = 0, end = max; /* view */ + int j = 0, curs = 0, endj = 0; /* mem */ + int chop = 1; /* flags */ + + for (; loop; j += BLI_str_utf8_size(linep->line+j)) { + int chars; + + /* Mimic replacement of tabs */ + ch = linep->line[j]; + if(ch == '\t') { + chars = st->tabnumber - i%st->tabnumber; + ch = ' '; + } + else chars = 1; + + while (chars--) { + /* Gone too far, go back to last wrap point */ + if (y < 0) { + charp = endj; + loop = 0; + break; /* Exactly at the cursor */ - } - else if(y==0 && i-start==x) { - /* current position could be wrapped to next line */ - /* this should be checked when end of current line would be reached */ - *charp= curs= j; - found= 1; + } + else if (y == 0 && i-start == x) { + /* current position could be wrapped to next line */ + /* this should be checked when end of current line would be reached */ + charp = curs= j; + found = 1; /* Prepare curs for next wrap */ + } + else if(i - end == x) { + curs = j; + } + if (i - start >= max) { + if (found) { + /* exact cursor position was found, check if it's */ + /* still on needed line (hasn't been wrapped) */ + if (charp > endj && !chop && ch!='\0') charp = endj; + loop = 0; + break; } - else if(i-end==x) { - curs= j; + + if(chop) endj = j; + start = end; + end += max; + + if(j < linep->len) + y--; + + chop = 1; + if (y == 0 && i-start >= x) { + charp = curs; + loop = 0; + break; } - if(i-start>=max) { - if(found) { - /* exact cursor position was found, check if it's */ - /* still on needed line (hasn't been wrapped) */ - if(*charp>endj && !chop && ch!='\0') (*charp)= endj; - loop= 0; - break; - } - - if(chop) endj= j; - start= end; - end += max; - - if(j<(*linep)->len) - y--; - - chop= 1; - if(y==0 && i-start>=x) { - *charp= curs; - loop= 0; - break; - } + } + else if (ch == ' ' || ch == '-' || ch == '\0') { + if (found) { + loop = 0; + break; } - else if(ch==' ' || ch=='-' || ch=='\0') { - if(found) { - loop= 0; - break; - } - - if(y==0 && i-start>=x) { - *charp= curs; - loop= 0; - break; - } - end = i+1; - endj = j; - chop= 0; + + if(y == 0 && i-start >= x) { + charp = curs; + loop = 0; + break; } - i++; + end = i + 1; + endj = j; + chop = 0; } - if(ch=='\0') break; + i++; } - if(!loop || found) break; + + if(ch == '\0') break; + } + + if(!loop || found) break; + + if(!linep->next) { + charp = linep->len; + break; + } + + /* On correct line but didn't meet cursor, must be at end */ + if (y == 0) { + charp = linep->len; + break; + } + linep = linep->next; + + y--; + } + + if(sel) { text->sell = linep; text->selc = charp; } + else { text->curl = linep; text->curc = charp; } +} - if(!(*linep)->next) { - *charp= (*linep)->len; - break; - } +static void text_cursor_set_to_pos(SpaceText *st, ARegion *ar, int x, int y, int sel) +{ + Text *text= st->text; + text_update_character_width(st); + y= (ar->winy - 2 - y)/st->lheight; - /* On correct line but didn't meet cursor, must be at end */ - if(y==0) { - *charp= (*linep)->len; - break; - } - *linep= (*linep)->next; - y--; - } + if(st->showlinenrs) x-= TXT_OFFSET+TEXTXLOC; + else x-= TXT_OFFSET; + if(x<0) x= 0; + x = (x/st->cwidth) + st->left; + + if(st->wordwrap) { + text_cursor_set_to_pos_wrapped(st, ar, x, y, sel); } else { + TextLine **linep; + int *charp; + int w; + + if(sel) { linep= &text->sell; charp= &text->selc; } + else { linep= &text->curl; charp= &text->curc; } + y-= txt_get_span(text->lines.first, *linep) - st->top; if(y>0) { @@ -2516,10 +2551,9 @@ static void text_cursor_set_to_pos(SpaceText *st, ARegion *ar, int x, int y, int } - w= flatten_string(st, &fs, (*linep)->line); - if(x<w) *charp= fs.accum[x]; + w= flatten_len(st, (*linep)->line); + if(x<w) *charp= flatten_index_to_offset(st, (*linep)->line, x); else *charp= (*linep)->len; - flatten_string_free(&fs); } if(!sel) txt_pop_sel(text); } @@ -2762,19 +2796,23 @@ static int text_insert_exec(bContext *C, wmOperator *op) SpaceText *st= CTX_wm_space_text(C); Text *text= CTX_data_edit_text(C); char *str; - int done = 0, i; + int done = 0; + size_t i = 0; + unsigned int code; text_drawcache_tag_update(st, 0); str= RNA_string_get_alloc(op->ptr, "text", NULL, 0); if(st && st->overwrite) { - for(i=0; str[i]; i++) { - done |= txt_replace_char(text, str[i]); + while (str[i]) { + code = BLI_str_utf8_as_unicode_step(str, &i); + done |= txt_replace_char(text, code); } } else { - for(i=0; str[i]; i++) { - done |= txt_add_char(text, str[i]); + while (str[i]) { + code = BLI_str_utf8_as_unicode_step(str, &i); + done |= txt_add_char(text, code); } } @@ -2802,9 +2840,17 @@ static int text_insert_invoke(bContext *C, wmOperator *op, wmEvent *event) return OPERATOR_PASS_THROUGH; } else { - char str[2]; - str[0]= event->ascii; - str[1]= '\0'; + char str[BLI_UTF8_MAX+1]; + size_t len; + + if (event->utf8_buf[0]) { + len = BLI_str_utf8_size(event->utf8_buf); + memcpy(str, event->utf8_buf, len); + } else { + /* in theory, ghost can set value to extended ascii here */ + len = BLI_str_utf8_from_unicode(event->ascii, str); + } + str[len]= '\0'; RNA_string_set(op->ptr, "text", str); } } diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c index 597adcf4193..060e59265e0 100644 --- a/source/blender/editors/space_view3d/view3d_header.c +++ b/source/blender/editors/space_view3d/view3d_header.c @@ -231,7 +231,7 @@ static int view3d_layers_invoke(bContext *C, wmOperator *op, wmEvent *event) return OPERATOR_PASS_THROUGH; if(event->shift) - RNA_boolean_set(op->ptr, "extend", 1); + RNA_boolean_set(op->ptr, "extend", TRUE); if(event->alt) { int nr= RNA_int_get(op->ptr, "nr") + 10; diff --git a/source/blender/editors/space_view3d/view3d_ops.c b/source/blender/editors/space_view3d/view3d_ops.c index 22470fe930d..759f3edf20f 100644 --- a/source/blender/editors/space_view3d/view3d_ops.c +++ b/source/blender/editors/space_view3d/view3d_ops.c @@ -160,8 +160,11 @@ void view3d_keymap(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "VIEW3D_OT_zoom_camera_1_to_1", PADENTER, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "VIEW3D_OT_view_center_camera", HOMEKEY, KM_PRESS, 0, 0); /* only with camera view */ - RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_all", HOMEKEY, KM_PRESS, 0, 0)->ptr, "center", 0); /* only without camera view */ - RNA_boolean_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_all", CKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "center", 1); + + kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_view_all", HOMEKEY, KM_PRESS, 0, 0); + RNA_boolean_set(kmi->ptr, "center", FALSE); /* only without camera view */ + kmi = WM_keymap_add_item(keymap, "VIEW3D_OT_view_all", CKEY, KM_PRESS, KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "center", TRUE); /* numpad view hotkeys*/ RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD0, KM_PRESS, 0, 0)->ptr, "type", RV3D_VIEW_CAMERA); diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c index f2c720ff4dc..a11d5935e22 100644 --- a/source/blender/editors/uvedit/uvedit_ops.c +++ b/source/blender/editors/uvedit/uvedit_ops.c @@ -3511,8 +3511,11 @@ void ED_keymap_uvedit(wmKeyConfig *keyconf) RNA_boolean_set(WM_keymap_add_item(keymap, "UV_OT_select_loop", SELECTMOUSE, KM_PRESS, KM_SHIFT|KM_ALT, 0)->ptr, "extend", TRUE); /* border/circle selection */ - WM_keymap_add_item(keymap, "UV_OT_select_border", BKEY, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "UV_OT_select_border", BKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "pinned", 1); + kmi = WM_keymap_add_item(keymap, "UV_OT_select_border", BKEY, KM_PRESS, 0, 0); + RNA_boolean_set(kmi->ptr, "pinned", FALSE); + kmi = WM_keymap_add_item(keymap, "UV_OT_select_border", BKEY, KM_PRESS, KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "pinned", TRUE); + WM_keymap_add_item(keymap, "UV_OT_circle_select", CKEY, KM_PRESS, 0, 0); /* selection manipulation */ @@ -3522,16 +3525,21 @@ void ED_keymap_uvedit(wmKeyConfig *keyconf) RNA_boolean_set(WM_keymap_add_item(keymap, "UV_OT_select_linked_pick", LKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", TRUE); WM_keymap_add_item(keymap, "UV_OT_unlink_selected", LKEY, KM_PRESS, KM_ALT, 0); - WM_keymap_add_item(keymap, "UV_OT_select_all", AKEY, KM_PRESS, 0, 0); - RNA_enum_set(WM_keymap_add_item(keymap, "UV_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0)->ptr, "action", SEL_INVERT); + kmi = WM_keymap_add_item(keymap, "UV_OT_select_all", AKEY, KM_PRESS, 0, 0); + RNA_enum_set(kmi->ptr, "action", SEL_TOGGLE); + kmi = WM_keymap_add_item(keymap, "UV_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0); + RNA_enum_set(kmi->ptr, "action", SEL_INVERT); + WM_keymap_add_item(keymap, "UV_OT_select_pinned", PKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_menu(keymap, "IMAGE_MT_uvs_weldalign", WKEY, KM_PRESS, 0, 0); /* uv operations */ WM_keymap_add_item(keymap, "UV_OT_stitch", VKEY, KM_PRESS, 0, 0); - WM_keymap_add_item(keymap, "UV_OT_pin", PKEY, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "UV_OT_pin", PKEY, KM_PRESS, KM_ALT, 0)->ptr, "clear", 1); + kmi = WM_keymap_add_item(keymap, "UV_OT_pin", PKEY, KM_PRESS, 0, 0); + RNA_boolean_set(kmi->ptr, "clear", FALSE); + kmi = WM_keymap_add_item(keymap, "UV_OT_pin", PKEY, KM_PRESS, KM_ALT, 0); + RNA_boolean_set(kmi->ptr, "clear", TRUE); /* unwrap */ WM_keymap_add_item(keymap, "UV_OT_unwrap", EKEY, KM_PRESS, 0, 0); @@ -3540,8 +3548,11 @@ void ED_keymap_uvedit(wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "UV_OT_average_islands_scale", AKEY, KM_PRESS, KM_CTRL, 0); /* hide */ - WM_keymap_add_item(keymap, "UV_OT_hide", HKEY, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "UV_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "unselected", 1); + kmi = WM_keymap_add_item(keymap, "UV_OT_hide", HKEY, KM_PRESS, 0, 0); + RNA_boolean_set(kmi->ptr, "unselected", FALSE); + kmi = WM_keymap_add_item(keymap, "UV_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "unselected", TRUE); + WM_keymap_add_item(keymap, "UV_OT_reveal", HKEY, KM_PRESS, KM_ALT, 0); /* cursor */ diff --git a/source/blender/makesdna/DNA_dynamicpaint_types.h b/source/blender/makesdna/DNA_dynamicpaint_types.h index 0bf4ffb76ee..6dab70c6dee 100644 --- a/source/blender/makesdna/DNA_dynamicpaint_types.h +++ b/source/blender/makesdna/DNA_dynamicpaint_types.h @@ -55,6 +55,7 @@ struct PaintSurfaceData; #define MOD_DPAINT_WAVE_OPEN_BORDERS (1<<7) /* passes waves through mesh edges */ #define MOD_DPAINT_DISP_INCREMENTAL (1<<8) /* builds displace on top of earlier values */ +#define MOD_DPAINT_USE_DRYING (1<<9) /* use drying */ #define MOD_DPAINT_OUT1 (1<<10) /* output primary surface */ #define MOD_DPAINT_OUT2 (1<<11) /* output secondary surface */ @@ -69,8 +70,8 @@ struct PaintSurfaceData; /* effect */ #define MOD_DPAINT_EFFECT_DO_SPREAD (1<<0) /* do spread effect */ -#define MOD_DPAINT_EFFECT_DO_DRIP (1<<1) /* do spread effect */ -#define MOD_DPAINT_EFFECT_DO_SHRINK (1<<2) /* do spread effect */ +#define MOD_DPAINT_EFFECT_DO_DRIP (1<<1) /* do drip effect */ +#define MOD_DPAINT_EFFECT_DO_SHRINK (1<<2) /* do shrink effect */ /* preview_id */ #define MOD_DPAINT_SURFACE_PREV_PAINT 0 @@ -114,16 +115,18 @@ typedef struct DynamicPaintSurface { char init_layername[64]; /* MAX_CUSTOMDATA_LAYER_NAME */ int dry_speed, diss_speed; + float color_dry_threshold; float depth_clamp, disp_factor; float spread_speed, color_spread_speed, shrink_speed; float drip_vel, drip_acc; + /* per surface brush settings */ + float influence_scale, radius_scale; + /* wave settings */ float wave_damping, wave_speed, wave_timescale, wave_spring; - int pad_; - char uvlayer_name[64]; /* MAX_CUSTOMDATA_LAYER_NAME */ char image_output_path[240]; /* 240 = FILE_MAX */ char output_name[64]; /* MAX_CUSTOMDATA_LAYER_NAME */ diff --git a/source/blender/makesrna/intern/rna_dynamicpaint.c b/source/blender/makesrna/intern/rna_dynamicpaint.c index 4886a4f30b1..95770685077 100644 --- a/source/blender/makesrna/intern/rna_dynamicpaint.c +++ b/source/blender/makesrna/intern/rna_dynamicpaint.c @@ -395,6 +395,10 @@ static void rna_def_canvas_surface(BlenderRNA *brna) RNA_def_property_range(prop, 1.0, 10000.0); RNA_def_property_ui_range(prop, 1.0, 10000.0, 5, 0); RNA_def_property_ui_text(prop, "Dissolve Speed", "Approximately in how many frames should dissolve happen"); + + prop= RNA_def_property(srna, "use_drying", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_USE_DRYING); + RNA_def_property_ui_text(prop, "Dry", "Enable to make surface wetness dry over time"); prop= RNA_def_property(srna, "dry_speed", PROP_INT, PROP_NONE); RNA_def_property_range(prop, 1.0, 10000.0); @@ -443,6 +447,20 @@ static void rna_def_canvas_surface(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Anti-aliasing", "Use 5x multisampling to smoothen paint edges"); RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaintSurface_reset"); + prop= RNA_def_property(srna, "brush_influence_scale", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_float_sdna(prop, NULL, "influence_scale"); + RNA_def_property_range(prop, 0.0, 1.0); + RNA_def_property_ui_range(prop, 0.0, 1.0, 1, 2); + RNA_def_property_ui_text(prop, "Influence Scale", "Adjust influence brush objects have on this surface"); + RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier"); + + prop= RNA_def_property(srna, "brush_radius_scale", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_float_sdna(prop, NULL, "radius_scale"); + RNA_def_property_range(prop, 0.0, 10.0); + RNA_def_property_ui_range(prop, 0.0, 1.0, 1, 2); + RNA_def_property_ui_text(prop, "Radius Scale", "Adjust radius of proximity brushes or particles for this surface"); + RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier"); + /* * Initial Color */ @@ -454,6 +472,7 @@ static void rna_def_canvas_surface(BlenderRNA *brna) RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW|ND_MODIFIER, "rna_DynamicPaintSurface_initialcolortype"); prop= RNA_def_property(srna, "init_color", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_array(prop, 4); RNA_def_property_ui_text(prop, "Color", "Initial color of the surface"); RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW|ND_MODIFIER, "rna_DynamicPaintSurface_reset"); @@ -495,6 +514,12 @@ static void rna_def_canvas_surface(BlenderRNA *brna) RNA_def_property_ui_range(prop, 0.01, 5.0, 1, 2); RNA_def_property_ui_text(prop, "Spread Speed", "How fast spread effect moves on the canvas surface"); + prop= RNA_def_property(srna, "color_dry_threshold", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_float_sdna(prop, NULL, "color_dry_threshold"); + RNA_def_property_range(prop, 0.0, 1.0); + RNA_def_property_ui_range(prop, 0.0, 1.0, 1, 2); + RNA_def_property_ui_text(prop, "Color Dry", "The wetness level when colors start to shift to the background"); + prop= RNA_def_property(srna, "color_spread_speed", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "color_spread_speed"); RNA_def_property_range(prop, 0.0, 2.0); diff --git a/source/blender/modifiers/intern/MOD_boolean.c b/source/blender/modifiers/intern/MOD_boolean.c index ef8d71928d3..e773b772b2b 100644 --- a/source/blender/modifiers/intern/MOD_boolean.c +++ b/source/blender/modifiers/intern/MOD_boolean.c @@ -47,7 +47,6 @@ #include "MOD_boolean_util.h" #include "MOD_util.h" - static void copyData(ModifierData *md, ModifierData *target) { BooleanModifierData *bmd = (BooleanModifierData*) md; diff --git a/source/blenderplayer/CMakeLists.txt b/source/blenderplayer/CMakeLists.txt index db75e5f7ad0..d90668b7732 100644 --- a/source/blenderplayer/CMakeLists.txt +++ b/source/blenderplayer/CMakeLists.txt @@ -182,6 +182,10 @@ endif() list(APPEND BLENDER_SORTED_LIBS bf_intern_moto) endif() + if(WITH_CARVE) + list(APPEND BLENDER_SORTED_LIBS extern_carve) + endif() + if(WITH_CODEC_QUICKTIME) list(APPEND BLENDER_SORTED_LIBS bf_quicktime) endif() diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index 581a50a8c39..56612822887 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -178,6 +178,15 @@ if(WITH_PYTHON_MODULE) RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin # only needed on windows ) + if(APPLE) + set_target_properties( + blender + PROPERTIES + LINK_FLAGS_RELEASE "${PLATFORM_LINKFLAGS}" + LINK_FLAGS_DEBUG "${PLATFORM_LINKFLAGS_DEBUG}" + ) + endif() + if(WIN32) # python modules use this set_target_properties( @@ -234,7 +243,11 @@ elseif(WIN32) set(TARGETDIR_VER ${TARGETDIR}/${BLENDER_VERSION}) elseif(APPLE) - set(TARGETDIR_VER ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}) + if(WITH_PYTHON_MODULE) + set(TARGETDIR_VER ${TARGETDIR}/${BLENDER_VERSION}) + else() + set(TARGETDIR_VER ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}) + endif() endif() @@ -864,6 +877,10 @@ endif() list(APPEND BLENDER_SORTED_LIBS bf_quicktime) endif() + if(WITH_CARVE) + list(APPEND BLENDER_SORTED_LIBS extern_carve) + endif() + foreach(SORTLIB ${BLENDER_SORTED_LIBS}) set(REMLIB ${SORTLIB}) foreach(SEARCHLIB ${BLENDER_LINK_LIBS}) diff --git a/source/creator/creator.c b/source/creator/creator.c index 1eac930a691..49325f57a9e 100644 --- a/source/creator/creator.c +++ b/source/creator/creator.c @@ -1138,6 +1138,13 @@ static void setupArguments(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle) /* allow python module to call main */ #define main main_python_enter static void *evil_C= NULL; + +#ifdef __APPLE__ +/* environ is not available in mac shared libraries */ +#include <crt_externs.h> +char **environ = NULL; +#endif + #endif int main(int argc, const char **argv) @@ -1147,6 +1154,10 @@ int main(int argc, const char **argv) bArgs *ba; #ifdef WITH_PYTHON_MODULE +#ifdef __APPLE__ + environ = *_NSGetEnviron(); +#endif + #undef main evil_C= C; #endif @@ -1160,7 +1171,7 @@ int main(int argc, const char **argv) #endif setCallbacks(); -#ifdef __APPLE__ +#if defined(__APPLE__) && !defined(WITH_PYTHON_MODULE) /* patch to ignore argument finder gives us (pid?) */ if (argc==2 && strncmp(argv[1], "-psn_", 5)==0) { extern int GHOST_HACK_getFirstFile(char buf[]); diff --git a/source/tests/bl_mesh_modifiers.py b/source/tests/bl_mesh_modifiers.py index af6aaae819c..6a4e46a1832 100644 --- a/source/tests/bl_mesh_modifiers.py +++ b/source/tests/bl_mesh_modifiers.py @@ -25,7 +25,12 @@ # Later, we may have a way to check the results are valid. -# ./blender.bin --factory-startup --python bl_mesh_modifiers.py +# ./blender.bin --factory-startup --python source/tests/bl_mesh_modifiers.py +# + +import math + +USE_QUICK_RENDER = False # ----------------------------------------------------------------------------- @@ -45,6 +50,7 @@ def render_gl(context, filepath, shade): render = scene.render render.filepath = filepath render.image_settings.file_format = 'PNG' + render.image_settings.color_mode = 'RGB' render.use_file_extension = True render.use_antialiasing = False @@ -60,8 +66,8 @@ def render_gl(context, filepath, shade): # stop to inspect! - # if filepath == "test_cube_shell_solidify_subsurf_ob_textured": - # assert(0) + #~ if filepath == "test_cube_like_subsurf_single_wp_wire": + #~ assert(0) def render_gl_all_modes(context, obj, filepath=""): @@ -79,8 +85,12 @@ def render_gl_all_modes(context, obj, filepath=""): scene.tool_settings.mesh_select_mode = False, True, False # render - render_gl(context, filepath + "_ob_wire", shade='WIREFRAME') render_gl(context, filepath + "_ob_solid", shade='SOLID') + + if USE_QUICK_RENDER: + return + + render_gl(context, filepath + "_ob_wire", shade='WIREFRAME') render_gl(context, filepath + "_ob_textured", shade='TEXTURED') # ------------------------------------------------------------------------- @@ -195,6 +205,11 @@ def defaults_object(obj): face.use_smooth = True +def defaults_modifier(mod): + mod.show_in_editmode = True + mod.show_on_cage = True + + # ----------------------------------------------------------------------------- # models (utils) @@ -268,34 +283,33 @@ def mesh_armature_add(obj, mode=0): # ----------------------------------------------------------------------------- # modifiers -def modifier_subsurf_add(obj, levels=2): +def modifier_subsurf_add(scene, obj, levels=2): mod = obj.modifiers.new(name=whoami(), type='SUBSURF') - mod.show_in_editmode = True + defaults_modifier(mod) mod.levels = levels mod.render_levels = levels return mod -def modifier_armature_add(obj): +def modifier_armature_add(scene, obj): mod = obj.modifiers.new(name=whoami(), type='ARMATURE') - mod.show_in_editmode = True + defaults_modifier(mod) arm_data = bpy.data.armatures.new(whoami()) - arm_ob = bpy.data.objects.new(whoami(), arm_data) + obj_arm = bpy.data.objects.new(whoami(), arm_data) - scene = bpy.context.scene - scene.objects.link(arm_ob) + scene.objects.link(obj_arm) - arm_ob.select = True - scene.objects.active = arm_ob + obj_arm.select = True + scene.objects.active = obj_arm bpy.ops.object.mode_set(mode='OBJECT', toggle=False) bpy.ops.object.mode_set(mode='EDIT', toggle=False) # XXX, annoying, remove bone. while arm_data.edit_bones: - arm_ob.edit_bones.remove(arm_data.edit_bones[-1]) + obj_arm.edit_bones.remove(arm_data.edit_bones[-1]) bone_a = arm_data.edit_bones.new("Bone.A") bone_b = arm_data.edit_bones.new("Bone.B") @@ -310,17 +324,17 @@ def modifier_armature_add(obj): bpy.ops.object.mode_set(mode='OBJECT', toggle=False) # 45d armature - arm_ob.pose.bones["Bone.B"].rotation_quaternion = 1, -0.5, 0, 0 + obj_arm.pose.bones["Bone.B"].rotation_quaternion = 1, -0.5, 0, 0 # set back to the original scene.objects.active = obj # display options - arm_ob.show_x_ray = True + obj_arm.show_x_ray = True arm_data.draw_type = 'STICK' # apply to modifier - mod.object = arm_ob + mod.object = obj_arm mesh_vgroup_add(obj, name="Bone.A", axis=0, invert=True) mesh_vgroup_add(obj, name="Bone.B", axis=0, invert=False) @@ -328,22 +342,86 @@ def modifier_armature_add(obj): return mod -def modifier_mirror_add(obj): +def modifier_mirror_add(scene, obj): mod = obj.modifiers.new(name=whoami(), type='MIRROR') - mod.show_in_editmode = True + defaults_modifier(mod) return mod -def modifier_solidify_add(obj, thickness=0.25): +def modifier_solidify_add(scene, obj, thickness=0.25): mod = obj.modifiers.new(name=whoami(), type='SOLIDIFY') - mod.show_in_editmode = True + defaults_modifier(mod) mod.thickness = thickness return mod +def modifier_hook_add(scene, obj, use_vgroup=True): + scene.objects.active = obj + + # no nice way to add hooks from py api yet + # assume object mode, hook first face! + mesh = obj.data + + if use_vgroup: + for v in mesh.vertices: + v.select = True + else: + for v in mesh.vertices: + v.select = False + for i in mesh.faces[0].vertices: + mesh.vertices[i].select = True + + bpy.ops.object.mode_set(mode='EDIT', toggle=False) + bpy.ops.object.hook_add_newob() + bpy.ops.object.mode_set(mode='OBJECT', toggle=False) + + # mod = obj.modifiers.new(name=whoami(), type='HOOK') + mod = obj.modifiers[-1] + defaults_modifier(mod) + + obj_hook = mod.object + obj_hook.rotation_euler = 0, math.radians(45), 0 + obj_hook.show_x_ray = True + + if use_vgroup: + mod.vertex_group = obj.vertex_groups[0].name + + return mod + + +def modifier_decimate_add(scene, obj): + mod = obj.modifiers.new(name=whoami(), type='DECIMATE') + defaults_modifier(mod) + + mod.ratio = 1 / 3 + + return mod + + +def modifier_build_add(scene, obj): + mod = obj.modifiers.new(name=whoami(), type='BUILD') + defaults_modifier(mod) + + # ensure we display some faces + totface = len(obj.data.faces) + mod.frame_start = totface // 2 + mod.frame_duration = totface + + return mod + + +def modifier_mask_add(scene, obj): + mod = obj.modifiers.new(name=whoami(), type='MASK') + defaults_modifier(mod) + + mod.vertex_group = obj.vertex_groups[0].name + + return mod + + # ----------------------------------------------------------------------------- # models @@ -578,6 +656,22 @@ global_tests.append(("mirror_single", ((modifier_mirror_add, dict()), ), )) +global_tests.append(("hook_single", + ((modifier_hook_add, dict()), ), + )) + +global_tests.append(("decimate_single", + ((modifier_decimate_add, dict()), ), + )) + +global_tests.append(("build_single", + ((modifier_build_add, dict()), ), + )) + +global_tests.append(("mask_single", + ((modifier_mask_add, dict()), ), + )) + # combinations global_tests.append(("mirror_subsurf", @@ -591,7 +685,7 @@ global_tests.append(("solidify_subsurf", )) -def apply_test(test, obj, +def apply_test(test, scene, obj, render_func=None, render_args=None, render_kwargs=None, @@ -600,7 +694,7 @@ def apply_test(test, obj, test_name, test_funcs = test for cb, kwargs in test_funcs: - cb(obj, **kwargs) + cb(scene, obj, **kwargs) render_kwargs_copy = render_kwargs.copy() @@ -612,14 +706,16 @@ def apply_test(test, obj, # ----------------------------------------------------------------------------- # tests themselves! +# having the 'test_' prefix automatically means these functions are called +# for testing def test_cube(context, test): scene = context.scene obj = make_cube_extra(scene) - ctx_camera_setup(context, location=(4, 4, 4)) + ctx_camera_setup(context, location=(3, 3, 3)) - apply_test(test, obj, + apply_test(test, scene, obj, render_func=render_gl_all_modes, render_args=(context, obj), render_kwargs=dict(filepath=whoami())) @@ -630,7 +726,7 @@ def test_cube_like(context, test): obj = make_cube_like_extra(scene) ctx_camera_setup(context, location=(5, 5, 5)) - apply_test(test, obj, + apply_test(test, scene, obj, render_func=render_gl_all_modes, render_args=(context, obj), render_kwargs=dict(filepath=whoami())) @@ -641,7 +737,7 @@ def test_cube_shell(context, test): obj = make_cube_shell_extra(scene) ctx_camera_setup(context, location=(4, 4, 4)) - apply_test(test, obj, + apply_test(test, scene, obj, render_func=render_gl_all_modes, render_args=(context, obj), render_kwargs=dict(filepath=whoami())) @@ -682,7 +778,6 @@ if __name__ == "__main__": bpy.app.handlers.scene_update_post.remove(load_handler) try: main() - import sys sys.exit(0) except: @@ -691,6 +786,7 @@ if __name__ == "__main__": import sys # sys.exit(1) # comment to debug + else: load_handler.first = False |