diff options
Diffstat (limited to 'source/blender')
67 files changed, 682 insertions, 434 deletions
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index 22d19c5484f..f17438c2b00 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -381,9 +381,7 @@ Image *BKE_add_image_file(const char *name) ima= image_alloc(libname, IMA_SRC_FILE, IMA_TYPE_IMAGE); BLI_strncpy(ima->name, name, sizeof(ima->name)); - /* do a wild guess! */ - if(BLI_testextensie(name, ".avi") || BLI_testextensie(name, ".mov") - || BLI_testextensie(name, ".mpg") || BLI_testextensie(name, ".mp4")) + if(BLI_testextensie_array(name, imb_ext_movie)) ima->source= IMA_SRC_MOVIE; return ima; diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index bbd45ec80ea..467dad756bc 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -3039,9 +3039,14 @@ static KeyBlock *insert_lattkey(Scene *scene, Object *ob, const char *name, int if(newkey || from_mix==FALSE) { kb= add_keyblock(key, name); - - /* create from lattice */ - latt_to_key(lt, kb); + if (!newkey) { + KeyBlock *basekb= (KeyBlock *)key->block.first; + kb->data= MEM_dupallocN(basekb->data); + kb->totelem= basekb->totelem; + } + else { + latt_to_key(lt, kb); + } } else { /* copy from current values */ @@ -3077,7 +3082,10 @@ static KeyBlock *insert_curvekey(Scene *scene, Object *ob, const char *name, int KeyBlock *basekb= (KeyBlock *)key->block.first; kb->data= MEM_dupallocN(basekb->data); kb->totelem= basekb->totelem; - } else curve_to_key(cu, kb, lb); + } + else { + curve_to_key(cu, kb, lb); + } } else { /* copy from current values */ diff --git a/source/blender/blenkernel/intern/writeffmpeg.c b/source/blender/blenkernel/intern/writeffmpeg.c index 9b1c3b2ddb8..48930ae2eb8 100644 --- a/source/blender/blenkernel/intern/writeffmpeg.c +++ b/source/blender/blenkernel/intern/writeffmpeg.c @@ -39,19 +39,6 @@ #include <libswscale/swscale.h> #include <libavcodec/opt.h> -#if LIBAVFORMAT_VERSION_INT < (49 << 16) -#define FFMPEG_OLD_FRAME_RATE 1 -#else -#define FFMPEG_CODEC_IS_POINTER 1 -#define FFMPEG_CODEC_TIME_BASE 1 -#endif - -#if LIBAVFORMAT_VERSION_INT >= (52 << 16) -#define OUTFILE_PB (outfile->pb) -#else -#define OUTFILE_PB (&outfile->pb) -#endif - #if defined(WIN32) && (!(defined snprintf)) #define snprintf _snprintf #endif @@ -74,6 +61,35 @@ #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" +#if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 105)) +#define FFMPEG_HAVE_AVIO 1 +#endif + +#if (LIBAVFORMAT_VERSION_MAJOR > 53) || ((LIBAVFORMAT_VERSION_MAJOR >= 53) && (LIBAVFORMAT_VERSION_MINOR >= 1)) +#define FFMPEG_HAVE_DEFAULT_VAL_UNION 1 +#endif + +#if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 101)) +#define FFMPEG_HAVE_AV_DUMP_FORMAT 1 +#endif + +#ifndef FFMPEG_HAVE_AVIO +#define AVIO_FLAG_WRITE URL_WRONLY +#define avio_open url_fopen +#define avio_tell url_ftell +#define avio_close url_fclose +#endif + +/* make OpenSuSe special "in-between" ffmpeg 0.6.2 version(tm) happy... + Arrrrgh */ +#ifndef AVIO_FLAG_WRITE +#define AVIO_FLAG_WRITE URL_WRONLY +#endif + +#ifndef FFMPEG_HAVE_AV_DUMP_FORMAT +#define av_dump_format dump_format +#endif + extern void do_init_ffmpeg(void); static int ffmpeg_type = 0; @@ -114,24 +130,12 @@ static void delete_picture(AVFrame* f) } } -#ifdef FFMPEG_CODEC_IS_POINTER -static AVCodecContext* get_codec_from_stream(AVStream* stream) -{ - return stream->codec; -} -#else -static AVCodecContext* get_codec_from_stream(AVStream* stream) -{ - return &stream->codec; -} -#endif - static int write_audio_frame(void) { AVCodecContext* c = NULL; AVPacket pkt; - c = get_codec_from_stream(audio_stream); + c = audio_stream->codec; av_init_packet(&pkt); pkt.size = 0; @@ -153,17 +157,15 @@ static int write_audio_frame(void) if(c->coded_frame && c->coded_frame->pts != AV_NOPTS_VALUE) { -#ifdef FFMPEG_CODEC_TIME_BASE pkt.pts = av_rescale_q(c->coded_frame->pts, - c->time_base, audio_stream->time_base); -#else - pkt.pts = c->coded_frame->pts; -#endif + c->time_base, audio_stream->time_base); fprintf(stderr, "Audio Frame PTS: %d\n", (int)pkt.pts); } pkt.stream_index = audio_stream->index; - pkt.flags |= PKT_FLAG_KEY; + + pkt.flags |= AV_PKT_FLAG_KEY; + if (av_interleaved_write_frame(outfile, &pkt) != 0) { fprintf(stderr, "Error writing audio packet!\n"); return -1; @@ -263,10 +265,10 @@ static int write_video_frame(RenderData *rd, AVFrame* frame, ReportList *reports { int outsize = 0; int ret, success= 1; - AVCodecContext* c = get_codec_from_stream(video_stream); -#ifdef FFMPEG_CODEC_TIME_BASE + AVCodecContext* c = video_stream->codec; + frame->pts = rd->cfra - rd->sfra; -#endif + if (rd->mode & R_FIELDS) { frame->top_field_first = ((rd->mode & R_ODDFIELD) != 0); } @@ -278,19 +280,15 @@ static int write_video_frame(RenderData *rd, AVFrame* frame, ReportList *reports av_init_packet(&packet); if (c->coded_frame->pts != AV_NOPTS_VALUE) { -#ifdef FFMPEG_CODEC_TIME_BASE packet.pts = av_rescale_q(c->coded_frame->pts, c->time_base, video_stream->time_base); -#else - packet.pts = c->coded_frame->pts; -#endif fprintf(stderr, "Video Frame PTS: %d\n", (int)packet.pts); } else { fprintf(stderr, "Video Frame PTS: not set\n"); } if (c->coded_frame->key_frame) - packet.flags |= PKT_FLAG_KEY; + packet.flags |= AV_PKT_FLAG_KEY; packet.stream_index = video_stream->index; packet.data = video_buffer; packet.size = outsize; @@ -312,7 +310,7 @@ static AVFrame* generate_video_frame(uint8_t* pixels, ReportList *reports) { uint8_t* rendered_frame; - AVCodecContext* c = get_codec_from_stream(video_stream); + AVCodecContext* c = video_stream->codec; int width = c->width; int height = c->height; AVFrame* rgb_frame; @@ -396,7 +394,7 @@ static void set_ffmpeg_property_option(AVCodecContext* c, IDProperty * prop) switch(prop->type) { case IDP_STRING: fprintf(stderr, "%s.\n", IDP_String(prop)); - rv = av_set_string(c, prop->name, IDP_String(prop)); + av_set_string3(c, prop->name, IDP_String(prop), 1, &rv); break; case IDP_FLOAT: fprintf(stderr, "%g.\n", IDP_Float(prop)); @@ -407,7 +405,7 @@ static void set_ffmpeg_property_option(AVCodecContext* c, IDProperty * prop) if (param) { if (IDP_Int(prop)) { - rv = av_set_string(c, name, param); + av_set_string3(c, name, param, 1, &rv); } else { return; } @@ -459,9 +457,9 @@ static AVStream* alloc_video_stream(RenderData *rd, int codec_id, AVFormatContex /* Set up the codec context */ - c = get_codec_from_stream(st); + c = st->codec; c->codec_id = codec_id; - c->codec_type = CODEC_TYPE_VIDEO; + c->codec_type = AVMEDIA_TYPE_VIDEO; /* Get some values from the current render settings */ @@ -469,7 +467,6 @@ static AVStream* alloc_video_stream(RenderData *rd, int codec_id, AVFormatContex c->width = rectx; c->height = recty; -#ifdef FFMPEG_CODEC_TIME_BASE /* FIXME: Really bad hack (tm) for NTSC support */ if (ffmpeg_type == FFMPEG_DV && rd->frs_sec != 25) { c->time_base.den = 2997; @@ -482,20 +479,6 @@ static AVStream* alloc_video_stream(RenderData *rd, int codec_id, AVFormatContex c->time_base.den = rd->frs_sec * 100000; c->time_base.num = ((double) rd->frs_sec_base) * 100000; } -#else - /* FIXME: Really bad hack (tm) for NTSC support */ - if (ffmpeg_type == FFMPEG_DV && rd->frs_sec != 25) { - c->frame_rate = 2997; - c->frame_rate_base = 100; - } else if ((double) ((int) rd->frs_sec_base) == - rd->frs_sec_base) { - c->frame_rate = rd->frs_sec; - c->frame_rate_base = rd->frs_sec_base; - } else { - c->frame_rate = rd->frs_sec * 100000; - c->frame_rate_base = ((double) rd->frs_sec_base)*100000; - } -#endif c->gop_size = ffmpeg_gop_size; c->bit_rate = ffmpeg_video_bitrate*1000; @@ -519,7 +502,7 @@ static AVStream* alloc_video_stream(RenderData *rd, int codec_id, AVFormatContex c->pix_fmt = PIX_FMT_YUV422P; } - if (codec_id == CODEC_ID_XVID) { + if (ffmpeg_type == FFMPEG_XVID) { /* arghhhh ... */ c->pix_fmt = PIX_FMT_YUV420P; c->codec_tag = (('D'<<24) + ('I'<<16) + ('V'<<8) + 'X'); @@ -586,9 +569,9 @@ static AVStream* alloc_audio_stream(RenderData *rd, int codec_id, AVFormatContex st = av_new_stream(of, 1); if (!st) return NULL; - c = get_codec_from_stream(st); + c = st->codec; c->codec_id = codec_id; - c->codec_type = CODEC_TYPE_AUDIO; + c->codec_type = AVMEDIA_TYPE_AUDIO; c->sample_rate = rd->ffcodecdata.audio_mixrate; c->bit_rate = ffmpeg_audio_bitrate*1000; @@ -666,13 +649,13 @@ static int start_ffmpeg_impl(struct RenderData *rd, int rectx, int recty, Report BKE_report(reports, RPT_ERROR, "No valid formats found."); return 0; } - fmt = guess_format(NULL, exts[0], NULL); + fmt = av_guess_format(NULL, exts[0], NULL); if (!fmt) { BKE_report(reports, RPT_ERROR, "No valid formats found."); return 0; } - of = av_alloc_format_context(); + of = avformat_alloc_context(); if (!of) { BKE_report(reports, RPT_ERROR, "Error opening output file"); return 0; @@ -713,7 +696,7 @@ static int start_ffmpeg_impl(struct RenderData *rd, int rectx, int recty, Report fmt->video_codec = CODEC_ID_H264; break; case FFMPEG_XVID: - fmt->video_codec = CODEC_ID_XVID; + fmt->video_codec = CODEC_ID_MPEG4; break; case FFMPEG_FLV: fmt->video_codec = CODEC_ID_FLV1; @@ -772,7 +755,7 @@ static int start_ffmpeg_impl(struct RenderData *rd, int rectx, int recty, Report return 0; } if (!(fmt->flags & AVFMT_NOFILE)) { - if (url_fopen(&of->pb, name, URL_WRONLY) < 0) { + if (avio_open(&of->pb, name, AVIO_FLAG_WRITE) < 0) { BKE_report(reports, RPT_ERROR, "Could not open file for writing."); return 0; } @@ -780,7 +763,7 @@ static int start_ffmpeg_impl(struct RenderData *rd, int rectx, int recty, Report av_write_header(of); outfile = of; - dump_format(of, 0, name, 1); + av_dump_format(of, 0, name, 1); return 1; } @@ -807,7 +790,7 @@ void flush_ffmpeg(void) int outsize = 0; int ret = 0; - AVCodecContext* c = get_codec_from_stream(video_stream); + AVCodecContext* c = video_stream->codec; /* get the delayed frames */ while (1) { AVPacket packet; @@ -822,19 +805,15 @@ void flush_ffmpeg(void) break; } if (c->coded_frame->pts != AV_NOPTS_VALUE) { -#ifdef FFMPEG_CODEC_TIME_BASE packet.pts = av_rescale_q(c->coded_frame->pts, c->time_base, video_stream->time_base); -#else - packet.pts = c->coded_frame->pts; -#endif fprintf(stderr, "Video Frame PTS: %d\n", (int)packet.pts); } else { fprintf(stderr, "Video Frame PTS: not set\n"); } if (c->coded_frame->key_frame) { - packet.flags |= PKT_FLAG_KEY; + packet.flags |= AV_PKT_FLAG_KEY; } packet.stream_index = video_stream->index; packet.data = video_buffer; @@ -845,7 +824,7 @@ void flush_ffmpeg(void) break; } } - avcodec_flush_buffers(get_codec_from_stream(video_stream)); + avcodec_flush_buffers(video_stream->codec); } /* ********************************************************************** @@ -902,7 +881,7 @@ int start_ffmpeg(struct Scene *scene, RenderData *rd, int rectx, int recty, Repo if(audio_stream) { - AVCodecContext* c = get_codec_from_stream(audio_stream); + AVCodecContext* c = audio_stream->codec; AUD_DeviceSpecs specs; specs.channels = c->channels; specs.format = AUD_FORMAT_S16; @@ -945,7 +924,7 @@ int append_ffmpeg(RenderData *rd, int frame, int *pixels, int rectx, int recty, success= (avframe && write_video_frame(rd, avframe, reports)); if (ffmpeg_autosplit) { - if (url_ftell(OUTFILE_PB) > FFMPEG_AUTOSPLIT_SIZE) { + if (avio_tell(outfile->pb) > FFMPEG_AUTOSPLIT_SIZE) { end_ffmpeg(); ffmpeg_autosplit_count++; success &= start_ffmpeg_impl(rd, rectx, recty, reports); @@ -974,7 +953,7 @@ void end_ffmpeg(void) audio_mixdown_device = 0; } - if (video_stream && get_codec_from_stream(video_stream)) { + if (video_stream && video_stream->codec) { fprintf(stderr, "Flushing delayed frames...\n"); flush_ffmpeg (); } @@ -985,8 +964,8 @@ void end_ffmpeg(void) /* Close the video codec */ - if (video_stream && get_codec_from_stream(video_stream)) { - avcodec_close(get_codec_from_stream(video_stream)); + if (video_stream && video_stream->codec) { + avcodec_close(video_stream->codec); printf("zero video stream %p\n", video_stream); video_stream = 0; } @@ -1007,7 +986,7 @@ void end_ffmpeg(void) } if (outfile && outfile->oformat) { if (!(outfile->oformat->flags & AVFMT_NOFILE)) { - url_fclose(OUTFILE_PB); + avio_close(outfile->pb); } } if (outfile) { @@ -1101,12 +1080,20 @@ IDProperty *ffmpeg_property_add(RenderData *rd, char * type, int opt_index, int switch (o->type) { case FF_OPT_TYPE_INT: case FF_OPT_TYPE_INT64: +#ifdef FFMPEG_HAVE_DEFAULT_VAL_UNION + val.i = o->default_val.i64; +#else val.i = o->default_val; +#endif idp_type = IDP_INT; break; case FF_OPT_TYPE_DOUBLE: case FF_OPT_TYPE_FLOAT: +#ifdef FFMPEG_HAVE_DEFAULT_VAL_UNION + val.f = o->default_val.dbl; +#else val.f = o->default_val; +#endif idp_type = IDP_FLOAT; break; case FF_OPT_TYPE_STRING: @@ -1314,7 +1301,7 @@ void ffmpeg_set_preset(RenderData *rd, int preset) case FFMPEG_PRESET_XVID: if(preset == FFMPEG_PRESET_XVID) { rd->ffcodecdata.type = FFMPEG_AVI; - rd->ffcodecdata.codec = CODEC_ID_XVID; + rd->ffcodecdata.codec = CODEC_ID_MPEG4; } else if(preset == FFMPEG_PRESET_THEORA) { rd->ffcodecdata.type = FFMPEG_OGG; // XXX broken @@ -1357,7 +1344,7 @@ void ffmpeg_verify_image_type(RenderData *rd) } } else if(rd->imtype == R_XVID) { - if(rd->ffcodecdata.codec != CODEC_ID_XVID) { + if(rd->ffcodecdata.codec != CODEC_ID_MPEG4) { ffmpeg_set_preset(rd, FFMPEG_PRESET_XVID); audio= 1; } diff --git a/source/blender/blenlib/BLI_path_util.h b/source/blender/blenlib/BLI_path_util.h index 360cd1ea9ab..81fc8a50db6 100644 --- a/source/blender/blenlib/BLI_path_util.h +++ b/source/blender/blenlib/BLI_path_util.h @@ -50,11 +50,7 @@ char *BLI_get_folder_version(const int id, const int ver, const int do_check); /* folder_id */ /* general, will find based on user/local/system priority */ -#define BLENDER_CONFIG 1 #define BLENDER_DATAFILES 2 -#define BLENDER_SCRIPTS 3 -#define BLENDER_PLUGINS 4 -#define BLENDER_PYTHON 5 /* user-specific */ #define BLENDER_USER_CONFIG 31 @@ -64,7 +60,6 @@ char *BLI_get_folder_version(const int id, const int ver, const int do_check); #define BLENDER_USER_AUTOSAVE 35 /* system */ -#define BLENDER_SYSTEM_CONFIG 51 /* optional */ #define BLENDER_SYSTEM_DATAFILES 52 #define BLENDER_SYSTEM_SCRIPTS 53 #define BLENDER_SYSTEM_PLUGINS 54 diff --git a/source/blender/blenlib/BLI_string.h b/source/blender/blenlib/BLI_string.h index 635c38e1d13..408809661cf 100644 --- a/source/blender/blenlib/BLI_string.h +++ b/source/blender/blenlib/BLI_string.h @@ -123,13 +123,6 @@ __attribute__ ((format (printf, 1, 2))) ; /** - * Compare two strings - * - * @retval True if the strings are equal, false otherwise. - */ -int BLI_streq(const char *a, const char *b); - - /** * Compare two strings without regard to case. * * @retval True if the strings are equal, false otherwise. @@ -147,6 +140,9 @@ void BLI_timestr(double _time, char *str); /* time var is global */ int BLI_utf8_invalid_byte(const char *str, int length); int BLI_utf8_invalid_strip(char *str, int length); +void BLI_ascii_strtolower(char *str, int len); +void BLI_ascii_strtoupper(char *str, int len); + #ifdef __cplusplus } #endif diff --git a/source/blender/blenlib/intern/math_color.c b/source/blender/blenlib/intern/math_color.c index 512086f0e17..ef1d5da56d8 100644 --- a/source/blender/blenlib/intern/math_color.c +++ b/source/blender/blenlib/intern/math_color.c @@ -194,6 +194,10 @@ void hex_to_rgb(char *hexcol, float *r, float *g, float *b) CLAMP(*g, 0.0f, 1.0f); CLAMP(*b, 0.0f, 1.0f); } + else { + /* avoid using un-initialized vars */ + *r= *g= *b= 0.0f; + } } void rgb_to_hsv(float r, float g, float b, float *lh, float *ls, float *lv) diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c index 1f4b0ffdd5c..5056961c8d6 100644 --- a/source/blender/blenlib/intern/path_util.c +++ b/source/blender/blenlib/intern/path_util.c @@ -902,10 +902,23 @@ static int get_path_local(char *targetpath, const char *folder_name, const char return 0; } +static int is_portable_install(void) +{ + /* detect portable install by the existance of config folder */ + const int ver= BLENDER_VERSION; + char path[FILE_MAX]; + + return get_path_local(path, "config", NULL, ver); +} + static int get_path_user(char *targetpath, const char *folder_name, const char *subfolder_name, const char *envvar, const int ver) { char user_path[FILE_MAX]; const char *user_base_path; + + /* for portable install, user path is always local */ + if (is_portable_install()) + return get_path_local(targetpath, folder_name, subfolder_name, ver); user_path[0] = '\0'; @@ -1011,6 +1024,26 @@ static int get_path_system(char *targetpath, const char *folder_name, const char } } +#if defined(WIN32) && BLENDER_VERSION < 258 + +static int path_have_257_script_install(void) +{ + const int ver= BLENDER_VERSION; + char path[FILE_MAX] = ""; + char system_pyfile[FILE_MAX]; + + if (get_path_user(path, "scripts", NULL, "BLENDER_USER_SCRIPTS", ver)) { + BLI_join_dirfile(system_pyfile, sizeof(system_pyfile), path, "modules/bpy_types.py"); + + if (BLI_exists(system_pyfile)) + return 1; + } + + return 0; +} + +#endif + /* get a folder out of the 'folder_id' presets for paths */ /* returns the path if found, NULL string if not */ char *BLI_get_folder(int folder_id, const char *subfolder) @@ -1020,13 +1053,12 @@ char *BLI_get_folder(int folder_id, const char *subfolder) switch (folder_id) { case BLENDER_DATAFILES: /* general case */ - if (get_path_local(path, "datafiles", subfolder, ver)) break; if (get_path_user(path, "datafiles", subfolder, "BLENDER_USER_DATAFILES", ver)) break; + if (get_path_local(path, "datafiles", subfolder, ver)) break; if (get_path_system(path, "datafiles", subfolder, "BLENDER_SYSTEM_DATAFILES", ver)) break; return NULL; case BLENDER_USER_DATAFILES: - if (get_path_local(path, "datafiles", subfolder, ver)) break; if (get_path_user(path, "datafiles", subfolder, "BLENDER_USER_DATAFILES", ver)) break; return NULL; @@ -1036,35 +1068,28 @@ char *BLI_get_folder(int folder_id, const char *subfolder) return NULL; case BLENDER_USER_AUTOSAVE: - if (get_path_local(path, "autosave", subfolder, ver)) break; if (get_path_user(path, "autosave", subfolder, "BLENDER_USER_DATAFILES", ver)) break; return NULL; - case BLENDER_CONFIG: /* general case */ - if (get_path_local(path, "config", subfolder, ver)) break; - if (get_path_user(path, "config", subfolder, "BLENDER_USER_CONFIG", ver)) break; - if (get_path_system(path, "config", subfolder, "BLENDER_SYSTEM_CONFIG", ver)) break; - return NULL; - case BLENDER_USER_CONFIG: - if (get_path_local(path, "config", subfolder, ver)) break; if (get_path_user(path, "config", subfolder, "BLENDER_USER_CONFIG", ver)) break; return NULL; - case BLENDER_SYSTEM_CONFIG: - if (get_path_local(path, "config", subfolder, ver)) break; - if (get_path_system(path, "config", subfolder, "BLENDER_SYSTEM_CONFIG", ver)) break; - return NULL; - - case BLENDER_SCRIPTS: /* general case */ - if (get_path_local(path, "scripts", subfolder, ver)) break; - if (get_path_user(path, "scripts", subfolder, "BLENDER_USER_SCRIPTS", ver)) break; - if (get_path_system(path, "scripts", subfolder, "BLENDER_SYSTEM_SCRIPTS", ver)) break; - return NULL; - case BLENDER_USER_SCRIPTS: - if (get_path_local(path, "scripts", subfolder, ver)) break; - if (get_path_user(path, "scripts", subfolder, "BLENDER_USER_SCRIPTS", ver)) break; +#if defined(WIN32) && BLENDER_VERSION < 258 + /* if we have a 2.57 installation, then we may have system script + * files in the user configuration folder. avoid using that folder + * if they are there, until the version gets bumped to 2.58, so + * we can be sure that folder only has addons etc. */ + if (path_have_257_script_install()) { + if (get_path_local(path, "scripts", subfolder, ver)) break; + } + else +#endif + { + if (get_path_user(path, "scripts", subfolder, "BLENDER_USER_SCRIPTS", ver)) break; + } + return NULL; case BLENDER_SYSTEM_SCRIPTS: @@ -1072,11 +1097,6 @@ char *BLI_get_folder(int folder_id, const char *subfolder) if (get_path_system(path, "scripts", subfolder, "BLENDER_SYSTEM_SCRIPTS", ver)) break; return NULL; - case BLENDER_PYTHON: /* general case */ - if (get_path_local(path, "python", subfolder, ver)) break; - if (get_path_system(path, "python", subfolder, "BLENDER_SYSTEM_PYTHON", ver)) break; - return NULL; - case BLENDER_SYSTEM_PYTHON: if (get_path_local(path, "python", subfolder, ver)) break; if (get_path_system(path, "python", subfolder, "BLENDER_SYSTEM_PYTHON", ver)) break; @@ -1691,7 +1711,6 @@ void BLI_where_am_i(char *fullname, const size_t maxlen, const char *name) #ifdef _WIN32 if(GetModuleFileName(0, fullname, maxlen)) { - GetShortPathName(fullname, fullname, maxlen); if(!BLI_exists(fullname)) { printf("path can't be found: \"%.*s\"\n", maxlen, fullname); MessageBox(NULL, "path constains invalid characters or is too long (see console)", "Error", MB_OK); @@ -1745,18 +1764,6 @@ void BLI_where_am_i(char *fullname, const size_t maxlen, const char *name) printf("guessing '%s' == '%s'\n", name, fullname); } #endif - -#ifdef _WIN32 - // in windows change long filename to short filename because - // win2k doesn't know how to parse a commandline with lots of - // spaces and double-quotes. There's another solution to this - // with spawnv(P_WAIT, bprogname, argv) instead of system() but - // that's even uglier - GetShortPathName(fullname, fullname, maxlen); -#if defined(DEBUG) - printf("Shortname = '%s'\n", fullname); -#endif -#endif } } diff --git a/source/blender/blenlib/intern/string.c b/source/blender/blenlib/intern/string.c index ee5bd17c901..8e0314ec17f 100644 --- a/source/blender/blenlib/intern/string.c +++ b/source/blender/blenlib/intern/string.c @@ -212,11 +212,6 @@ char *BLI_replacestr(char *str, const char *oldText, const char *newText) } } -int BLI_streq(const char *a, const char *b) -{ - return (strcmp(a, b)==0); -} - int BLI_strcaseeq(const char *a, const char *b) { return (BLI_strcasecmp(a, b)==0); @@ -469,3 +464,21 @@ int BLI_utf8_invalid_strip(char *str, int length) return tot; } +void BLI_ascii_strtolower(char *str, int len) +{ + int i; + + for(i=0; i<len; i++) + if(str[i] >= 'A' && str[i] <= 'Z') + str[i] += 'a' - 'A'; +} + +void BLI_ascii_strtoupper(char *str, int len) +{ + int i; + + for(i=0; i<len; i++) + if(str[i] >= 'a' && str[i] <= 'z') + str[i] -= 'a' - 'A'; +} + diff --git a/source/blender/blenloader/BLO_readfile.h b/source/blender/blenloader/BLO_readfile.h index d9594f7da75..85d4b936c51 100644 --- a/source/blender/blenloader/BLO_readfile.h +++ b/source/blender/blenloader/BLO_readfile.h @@ -213,18 +213,32 @@ int BLO_is_a_library(const char *path, char *dir, char *group); struct Main* BLO_library_append_begin(const struct bContext *C, BlendHandle** bh, const char *filepath); + /** * Link/Append a named datablock from an external blend file. * + * @param mainl The main database to link from (not the active one). + * @param bh The blender file handle. + * @param idname The name of the datablock (without the 2 char ID prefix) + * @param idcode The kind of datablock to link. + * @return the appended ID when found. + */ +struct ID *BLO_library_append_named_part(struct Main *mainl, BlendHandle** bh, const char *idname, const int idcode); + +/** + * Link/Append a named datablock from an external blend file. + * optionally instance the object in the scene when the flags are set. + * * @param C The context, when NULL instancing object in the scene isnt done. * @param mainl The main database to link from (not the active one). * @param bh The blender file handle. * @param idname The name of the datablock (without the 2 char ID prefix) * @param idcode The kind of datablock to link. * @param flag Options for linking, used for instancing. - * @return Boolean, 0 when the datablock could not be found. + * @return the appended ID when found. */ -struct ID *BLO_library_append_named_part(const struct bContext *C, struct Main *mainl, BlendHandle** bh, const char *idname, int idcode, short flag); +struct ID *BLO_library_append_named_part_ex(const struct bContext *C, struct Main *mainl, BlendHandle** bh, const char *idname, const int idcode, const short flag); + void BLO_library_append_end(const struct bContext *C, struct Main *mainl, BlendHandle** bh, int idcode, short flag); void *BLO_library_read_struct(struct FileData *fd, struct BHead *bh, const char *blockname); diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index ebf8e2c95ce..0d349739226 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -1082,7 +1082,7 @@ int BLO_is_a_library(const char *path, char *dir, char *group) /* now we know that we are in a blend file and it is safe to assume that gp actually points to a group */ - if (BLI_streq("Screen", gp)==0) + if (strcmp("Screen", gp)!=0) BLI_strncpy(group, gp, GROUP_MAX); } return 1; @@ -12236,6 +12236,9 @@ static void expand_material(FileData *fd, Main *mainvar, Material *ma) if(ma->nodetree) expand_nodetree(fd, mainvar, ma->nodetree); + + if(ma->group) + expand_doit(fd, mainvar, ma->group); } static void expand_lamp(FileData *fd, Main *mainvar, Lamp *la) @@ -12839,24 +12842,17 @@ static void give_base_to_groups(Main *mainvar, Scene *scene) } /* returns true if the item was found - * but it may already have already been appended/linked */ -static ID *append_named_part(const bContext *C, Main *mainl, FileData *fd, const char *idname, int idcode, short flag) +* but it may already have already been appended/linked */ +static ID *append_named_part(Main *mainl, FileData *fd, const char *idname, const short idcode) { - Scene *scene= CTX_data_scene(C); /* can be NULL */ - Object *ob; - Base *base; BHead *bhead; ID *id= NULL; - int endloop=0; int found=0; - bhead = blo_firstbhead(fd); - while(bhead && endloop==0) { - - if(bhead->code==ENDB) endloop= 1; - else if(bhead->code==idcode) { + for(bhead= blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead)) { + if(bhead->code==idcode) { const char *idname_test= bhead_id_name(fd, bhead); - + if(strcmp(idname_test + 2, idname)==0) { found= 1; id= is_yet_read(fd, mainl, bhead); @@ -12872,38 +12868,12 @@ static ID *append_named_part(const bContext *C, Main *mainl, FileData *fd, const } } - /* TODO, move out of append and into own func the caller can use */ - if(scene && id && (GS(id->name) == ID_OB)) { /* loose object: give a base */ - base= MEM_callocN( sizeof(Base), "app_nam_part"); - BLI_addtail(&scene->base, base); - - ob= (Object *)id; - - /* link at active layer (view3d->lay if in context, else scene->lay */ - if((flag & FILE_ACTIVELAY)) { - View3D *v3d = CTX_wm_view3d(C); - if (v3d) { - ob->lay = v3d->layact; - } else { - ob->lay = scene->lay; - } - } - ob->mode= 0; - base->lay= ob->lay; - base->object= ob; - ob->id.us++; - - if(flag & FILE_AUTOSELECT) { - base->flag |= SELECT; - base->object->flag = base->flag; - /* do NOT make base active here! screws up GUI stuff, if you want it do it on src/ level */ - } - } - endloop= 1; + break; } } - - bhead = blo_nextbhead(fd, bhead); + else if(bhead->code==ENDB) { + break; + } } /* if we found the id but the id is NULL, this is really bad */ @@ -12912,10 +12882,53 @@ static ID *append_named_part(const bContext *C, Main *mainl, FileData *fd, const return found ? id : NULL; } -ID *BLO_library_append_named_part(const bContext *C, Main *mainl, BlendHandle** bh, const char *idname, int idcode, short flag) +static ID *append_named_part_ex(const bContext *C, Main *mainl, FileData *fd, const char *idname, const int idcode, const int flag) +{ + ID *id= append_named_part(mainl, fd, idname, idcode); + + if(id && (GS(id->name) == ID_OB)) { /* loose object: give a base */ + Scene *scene= CTX_data_scene(C); /* can be NULL */ + if(scene) { + Base *base; + Object *ob; + + base= MEM_callocN( sizeof(Base), "app_nam_part"); + BLI_addtail(&scene->base, base); + + ob= (Object *)id; + + /* link at active layer (view3d->lay if in context, else scene->lay */ + if((flag & FILE_ACTIVELAY)) { + View3D *v3d = CTX_wm_view3d(C); + ob->lay = v3d ? v3d->layact : scene->lay; + } + + ob->mode= 0; + base->lay= ob->lay; + base->object= ob; + ob->id.us++; + + if(flag & FILE_AUTOSELECT) { + base->flag |= SELECT; + base->object->flag = base->flag; + /* do NOT make base active here! screws up GUI stuff, if you want it do it on src/ level */ + } + } + } + + return id; +} + +ID *BLO_library_append_named_part(Main *mainl, BlendHandle** bh, const char *idname, const int idcode) { FileData *fd= (FileData*)(*bh); - return append_named_part(C, mainl, fd, idname, idcode, flag); + return append_named_part(mainl, fd, idname, idcode); +} + +ID *BLO_library_append_named_part_ex(const bContext *C, Main *mainl, BlendHandle** bh, const char *idname, const int idcode, const short flag) +{ + FileData *fd= (FileData*)(*bh); + return append_named_part_ex(C, mainl, fd, idname, idcode, flag); } static void append_id_part(FileData *fd, Main *mainvar, ID *id, ID **id_r) @@ -12924,8 +12937,8 @@ static void append_id_part(FileData *fd, Main *mainvar, ID *id, ID **id_r) for (bhead= blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead)) { if (bhead->code == GS(id->name)) { - - if (BLI_streq(id->name, bhead_id_name(fd, bhead))) { + + if (strcmp(id->name, bhead_id_name(fd, bhead))==0) { id->flag &= ~LIB_READ; id->flag |= LIB_TEST; // printf("read lib block %s\n", id->name); diff --git a/source/blender/editors/animation/keyingsets.c b/source/blender/editors/animation/keyingsets.c index 10886615976..c525c9af626 100644 --- a/source/blender/editors/animation/keyingsets.c +++ b/source/blender/editors/animation/keyingsets.c @@ -696,7 +696,7 @@ KeyingSet *ANIM_get_keyingset_for_autokeying(Scene *scene, const char *tranformK /* Menu of All Keying Sets ----------------------------- */ /* Dynamically populate an enum of Keying Sets */ -EnumPropertyItem *ANIM_keying_sets_enum_itemf (bContext *C, PointerRNA *UNUSED(ptr), int *free) +EnumPropertyItem *ANIM_keying_sets_enum_itemf (bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), int *free) { Scene *scene = CTX_data_scene(C); KeyingSet *ks; diff --git a/source/blender/editors/armature/editarmature_sketch.c b/source/blender/editors/armature/editarmature_sketch.c index ccb9a45af37..97f85b92b32 100644 --- a/source/blender/editors/armature/editarmature_sketch.c +++ b/source/blender/editors/armature/editarmature_sketch.c @@ -374,16 +374,16 @@ static void sk_autoname(bContext *C, ReebArc *arc) int valid = 0; int caps = 0; - if (BLI_streq(side, "")) + if (side[0] == '\0') { valid = 1; } - else if (BLI_streq(side, "R") || BLI_streq(side, "L")) + else if (strcmp(side, "R")==0 || strcmp(side, "L")==0) { valid = 1; caps = 1; } - else if (BLI_streq(side, "r") || BLI_streq(side, "l")) + else if (strcmp(side, "r")==0 || strcmp(side, "l")==0) { valid = 1; caps = 0; diff --git a/source/blender/editors/armature/poselib.c b/source/blender/editors/armature/poselib.c index 9e0e9374d5d..5b4da1a38df 100644 --- a/source/blender/editors/armature/poselib.c +++ b/source/blender/editors/armature/poselib.c @@ -483,7 +483,7 @@ void POSELIB_OT_pose_add (wmOperatorType *ot) /* ----- */ /* can be called with C == NULL */ -static EnumPropertyItem *poselib_stored_pose_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free) +static EnumPropertyItem *poselib_stored_pose_itemf(bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), int *free) { Object *ob = get_poselib_object(C); bAction *act = (ob) ? ob->poselib : NULL; diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c index 27f2598d515..42ffefa6bd4 100644 --- a/source/blender/editors/gpencil/gpencil_edit.c +++ b/source/blender/editors/gpencil/gpencil_edit.c @@ -453,7 +453,7 @@ static int gp_camera_view_subrect(bContext *C, rctf *subrect) /* for camera view set the subrect */ if (rv3d->persp == RV3D_CAMOB) { - ED_view3d_calc_camera_border(scene, ar, v3d, NULL, subrect, -1); /* negative shift */ + ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, subrect, -1); /* negative shift */ return 1; } } diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c index 2a4b583276e..f4da734473d 100644 --- a/source/blender/editors/gpencil/gpencil_paint.c +++ b/source/blender/editors/gpencil/gpencil_paint.c @@ -1131,7 +1131,7 @@ static void gp_paint_initstroke (tGPsdata *p, short paintmode) /* for camera view set the subrect */ if (rv3d->persp == RV3D_CAMOB) { - ED_view3d_calc_camera_border(p->scene, p->ar, v3d, NULL, &p->subrect_data, -1); /* negative shift */ + ED_view3d_calc_camera_border(p->scene, p->ar, v3d, rv3d, &p->subrect_data, -1); /* negative shift */ p->subrect= &p->subrect_data; } } diff --git a/source/blender/editors/include/ED_keyframing.h b/source/blender/editors/include/ED_keyframing.h index 6523a897713..294b9b8475a 100644 --- a/source/blender/editors/include/ED_keyframing.h +++ b/source/blender/editors/include/ED_keyframing.h @@ -211,7 +211,7 @@ struct KeyingSet *ANIM_get_keyingset_for_autokeying(struct Scene *scene, const c void ANIM_keying_sets_menu_setup(struct bContext *C, const char title[], const char op_name[]); /* Dynamically populate an enum of Keying Sets */ -struct EnumPropertyItem *ANIM_keying_sets_enum_itemf(struct bContext *C, struct PointerRNA *ptr, int *free); +struct EnumPropertyItem *ANIM_keying_sets_enum_itemf(struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA *prop, int *free); /* Check if KeyingSet can be used in the current context */ short ANIM_keyingset_context_ok_poll(struct bContext *C, struct KeyingSet *ks); diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index e70b793cfb0..da479fe7ca3 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -1848,29 +1848,24 @@ void uiFreeInactiveBlocks(const bContext *C, ListBase *lb) void uiBlockSetRegion(uiBlock *block, ARegion *region) { - ListBase *lb; + ListBase *lb= ®ion->uiblocks; uiBlock *oldblock= NULL; - lb= ®ion->uiblocks; - /* each listbase only has one block with this name, free block * if is already there so it can be rebuilt from scratch */ if(lb) { - for (oldblock= lb->first; oldblock; oldblock= oldblock->next) - if (BLI_streq(oldblock->name, block->name)) - break; + oldblock= BLI_findstring(lb, block->name, offsetof(uiBlock, name)); if (oldblock) { oldblock->active= 0; oldblock->panel= NULL; } + + /* at the beginning of the list! for dynamical menus/blocks */ + BLI_addhead(lb, block); } block->oldblock= oldblock; - - /* at the beginning of the list! for dynamical menus/blocks */ - if(lb) - BLI_addhead(lb, block); } uiBlock *uiBeginBlock(const bContext *C, ARegion *region, const char *name, short dt) diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c index 18f3b807f86..b5da36756b5 100644 --- a/source/blender/editors/mesh/editmesh_mods.c +++ b/source/blender/editors/mesh/editmesh_mods.c @@ -1250,7 +1250,7 @@ static int select_similar_exec(bContext *C, wmOperator *op) return similar_face_select_exec(C, op); } -static EnumPropertyItem *select_similar_type_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free) +static EnumPropertyItem *select_similar_type_itemf(bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), int *free) { Object *obedit= CTX_data_edit_object(C); EnumPropertyItem *item= NULL; diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index dfd1ac730ac..dc744c49fae 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -762,7 +762,7 @@ static EnumPropertyItem extrude_items[] = { {0, NULL, 0, NULL, NULL}}; -static EnumPropertyItem *mesh_extrude_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free) +static EnumPropertyItem *mesh_extrude_itemf(bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), int *free) { EnumPropertyItem *item= NULL; Object *obedit= CTX_data_edit_object(C); @@ -5263,7 +5263,7 @@ static int blend_from_shape_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -static EnumPropertyItem *shape_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free) +static EnumPropertyItem *shape_itemf(bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), int *free) { Object *obedit= CTX_data_edit_object(C); Mesh *me= (obedit) ? obedit->data : NULL; @@ -5975,7 +5975,7 @@ static EnumPropertyItem merge_type_items[]= { {5, "COLLAPSE", 0, "Collapse", ""}, {0, NULL, 0, NULL, NULL}}; -static EnumPropertyItem *merge_type_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free) +static EnumPropertyItem *merge_type_itemf(bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), int *free) { Object *obedit= CTX_data_edit_object(C); EnumPropertyItem *item= NULL; diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index 91980ddf228..527b97a6082 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -1873,7 +1873,7 @@ static void rand_timeoffs(Scene *scene, View3D *v3d) } -static EnumPropertyItem *object_mode_set_itemsf(bContext *C, PointerRNA *UNUSED(ptr), int *free) +static EnumPropertyItem *object_mode_set_itemsf(bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), int *free) { EnumPropertyItem *input = object_mode_items; EnumPropertyItem *item= NULL; @@ -2119,7 +2119,7 @@ static EnumPropertyItem game_properties_copy_operations[] ={ static EnumPropertyItem gameprops_items[]= { {0, NULL, 0, NULL, NULL}}; -static EnumPropertyItem *gameprops_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free) +static EnumPropertyItem *gameprops_itemf(bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), int *free) { Object *ob= ED_object_active_context(C); EnumPropertyItem tmp = {0, "", 0, "", ""}; diff --git a/source/blender/editors/object/object_hook.c b/source/blender/editors/object/object_hook.c index 78937299645..2d547da41f6 100644 --- a/source/blender/editors/object/object_hook.c +++ b/source/blender/editors/object/object_hook.c @@ -563,7 +563,7 @@ static int object_hook_remove_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -static EnumPropertyItem *hook_mod_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free) +static EnumPropertyItem *hook_mod_itemf(bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), int *free) { Object *ob = CTX_data_edit_object(C); EnumPropertyItem tmp = {0, "", 0, "", ""}; diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index d5bf894ac8c..5996037cd2d 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -584,7 +584,7 @@ static int modifier_add_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -static EnumPropertyItem *modifier_add_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free) +static EnumPropertyItem *modifier_add_itemf(bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), int *free) { Object *ob= ED_object_active_context(C); EnumPropertyItem *item= NULL, *md_item; diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c index 8078bfbeb93..f7158e4b4ec 100644 --- a/source/blender/editors/object/object_relations.c +++ b/source/blender/editors/object/object_relations.c @@ -360,7 +360,7 @@ static int make_proxy_exec (bContext *C, wmOperator *op) } /* Generic itemf's for operators that take library args */ -static EnumPropertyItem *proxy_group_object_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free) +static EnumPropertyItem *proxy_group_object_itemf(bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), int *free) { EnumPropertyItem item_tmp= {0}, *item= NULL; int totitem= 0; diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c index 53562caf1b5..43448198ae1 100644 --- a/source/blender/editors/object/object_vgroup.c +++ b/source/blender/editors/object/object_vgroup.c @@ -1966,7 +1966,7 @@ static int set_active_group_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -static EnumPropertyItem *vgroup_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free) +static EnumPropertyItem *vgroup_itemf(bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), int *free) { Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; EnumPropertyItem tmp = {0, "", 0, "", ""}; diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c index 14e9626212a..0380dba7592 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex.c +++ b/source/blender/editors/sculpt_paint/paint_vertex.c @@ -288,6 +288,43 @@ static void make_vertexcol(Object *ob) /* single ob */ } +/* mirror_vgroup is set to -1 when invalid */ +static void wpaint_mirror_vgroup_ensure(Object *ob, int *vgroup_mirror) +{ + bDeformGroup *defgroup= BLI_findlink(&ob->defbase, ob->actdef - 1); + + if(defgroup) { + bDeformGroup *curdef; + int mirrdef; + char name[MAXBONENAME]; + + flip_side_name(name, defgroup->name, FALSE); + + if(strcmp(name, defgroup->name) != 0) { + for (curdef= ob->defbase.first, mirrdef; curdef; curdef=curdef->next, mirrdef++) { + if (!strcmp(curdef->name, name)) { + break; + } + } + + if(curdef==NULL) { + int olddef= ob->actdef; /* tsk, ED_vgroup_add sets the active defgroup */ + curdef= ED_vgroup_add_name(ob, name); + ob->actdef= olddef; + } + + /* curdef should never be NULL unless this is + * a lamp and ED_vgroup_add_name fails */ + if(curdef) { + *vgroup_mirror= mirrdef; + return; + } + } + } + + *vgroup_mirror= -1; +} + static void copy_vpaint_prev(VPaint *vp, unsigned int *mcol, int tot) { if(vp->vpaint_prev) { @@ -383,32 +420,11 @@ void wpaint_fill(VPaint *wp, Object *ob, float paintweight) } vgroup= ob->actdef-1; - - /* directly copied from weight_paint, should probaby split into a separate function */ + /* if mirror painting, find the other group */ if(me->editflag & ME_EDIT_MIRROR_X) { - bDeformGroup *defgroup= BLI_findlink(&ob->defbase, ob->actdef-1); - if(defgroup) { - bDeformGroup *curdef; - int actdef= 0; - char name[32]; - - flip_side_name(name, defgroup->name, FALSE); - - for (curdef = ob->defbase.first; curdef; curdef=curdef->next, actdef++) - if (!strcmp(curdef->name, name)) - break; - if(curdef==NULL) { - int olddef= ob->actdef; /* tsk, ED_vgroup_add sets the active defgroup */ - curdef= ED_vgroup_add_name (ob, name); - ob->actdef= olddef; - } - - if(curdef && curdef!=defgroup) - vgroup_mirror= actdef; - } + wpaint_mirror_vgroup_ensure(ob, &vgroup_mirror); } - /* end copy from weight_paint*/ copy_wpaint_prev(wp, me->dvert, me->totvert); @@ -942,7 +958,7 @@ void PAINT_OT_weight_sample(wmOperatorType *ot) } /* samples cursor location, and gives menu with vertex groups to activate */ -static EnumPropertyItem *weight_paint_sample_enum_itemf(bContext *C, PointerRNA *UNUSED(ptr), int *free) +static EnumPropertyItem *weight_paint_sample_enum_itemf(bContext *C, PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), int *free) { if (C) { wmWindow *win= CTX_wm_window(C); @@ -1351,26 +1367,7 @@ static int wpaint_stroke_test_start(bContext *C, wmOperator *op, wmEvent *UNUSED /* if mirror painting, find the other group */ if(me->editflag & ME_EDIT_MIRROR_X) { - bDeformGroup *defgroup= BLI_findlink(&ob->defbase, ob->actdef-1); - if(defgroup) { - bDeformGroup *curdef; - int actdef= 0; - char name[32]; - - flip_side_name(name, defgroup->name, FALSE); - - for (curdef = ob->defbase.first; curdef; curdef=curdef->next, actdef++) - if (!strcmp(curdef->name, name)) - break; - if(curdef==NULL) { - int olddef= ob->actdef; /* tsk, ED_vgroup_add sets the active defgroup */ - curdef= ED_vgroup_add_name (ob, name); - ob->actdef= olddef; - } - - if(curdef && curdef!=defgroup) - wpd->vgroup_mirror= actdef; - } + wpaint_mirror_vgroup_ensure(ob, &wpd->vgroup_mirror); } return 1; diff --git a/source/blender/editors/space_file/space_file.c b/source/blender/editors/space_file/space_file.c index ec0d9806bca..18270bfaa26 100644 --- a/source/blender/editors/space_file/space_file.c +++ b/source/blender/editors/space_file/space_file.c @@ -606,7 +606,7 @@ void ED_spacetype_file(void) void ED_file_init(void) { - char *cfgdir = BLI_get_folder(BLENDER_CONFIG, NULL); + char *cfgdir = BLI_get_folder(BLENDER_USER_CONFIG, NULL); fsmenu_read_system(fsmenu_get()); diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index 9e2783113ef..67035247038 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -876,9 +876,6 @@ void ED_view3d_calc_camera_border(Scene *scene, ARegion *ar, View3D *v3d, Region float dx= 0.0f, dy= 0.0f; view3d_viewborder_size_get(scene, ar, size); - - if (rv3d == NULL) - rv3d = ar->regiondata; size[0]= size[0]*zoomfac; size[1]= size[1]*zoomfac; diff --git a/source/blender/imbuf/intern/anim_movie.c b/source/blender/imbuf/intern/anim_movie.c index e66e0febf41..a0051d85c5b 100644 --- a/source/blender/imbuf/intern/anim_movie.c +++ b/source/blender/imbuf/intern/anim_movie.c @@ -1,7 +1,7 @@ /* * anim.c * - * $Id: anim_movie.c 36271 2011-04-21 13:11:51Z campbellbarton $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -108,6 +108,14 @@ #define FFMPEG_SWSCALE_COLOR_SPACE_SUPPORT #endif +#if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 101)) +#define FFMPEG_HAVE_AV_DUMP_FORMAT 1 +#endif + +#ifndef FFMPEG_HAVE_AV_DUMP_FORMAT +#define av_dump_format dump_format +#endif + #endif //WITH_FFMPEG #ifdef WITH_REDCODE @@ -559,14 +567,14 @@ static int startffmpeg(struct anim * anim) { return -1; } - dump_format(pFormatCtx, 0, anim->name, 0); + av_dump_format(pFormatCtx, 0, anim->name, 0); /* Find the first video stream */ videoStream=-1; for(i=0; i<pFormatCtx->nb_streams; i++) if(get_codec_from_stream(pFormatCtx->streams[i])->codec_type - == CODEC_TYPE_VIDEO) { + == AVMEDIA_TYPE_VIDEO) { videoStream=i; break; } @@ -830,10 +838,10 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) { && position - (anim->curposition + 1) < anim->preseek) { while(av_read_frame(anim->pFormatCtx, &packet)>=0) { if (packet.stream_index == anim->videoStream) { - avcodec_decode_video( + avcodec_decode_video2( anim->pCodecCtx, anim->pFrame, &frameFinished, - packet.data, packet.size); + &packet); if (frameFinished) { anim->curposition++; @@ -915,9 +923,9 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) { while(av_read_frame(anim->pFormatCtx, &packet)>=0) { if(packet.stream_index == anim->videoStream) { - avcodec_decode_video(anim->pCodecCtx, - anim->pFrame, &frameFinished, - packet.data, packet.size); + avcodec_decode_video2(anim->pCodecCtx, + anim->pFrame, &frameFinished, + &packet); if (seek_by_bytes && preseek_count > 0) { preseek_count--; diff --git a/source/blender/imbuf/intern/util.c b/source/blender/imbuf/intern/util.c index 3e4136cbef9..3eed69f4c52 100644 --- a/source/blender/imbuf/intern/util.c +++ b/source/blender/imbuf/intern/util.c @@ -63,10 +63,12 @@ #include <libavdevice/avdevice.h> #include <libavutil/log.h> -#if LIBAVFORMAT_VERSION_INT < (49 << 16) -#define FFMPEG_OLD_FRAME_RATE 1 -#else -#define FFMPEG_CODEC_IS_POINTER 1 +#if (LIBAVFORMAT_VERSION_MAJOR > 52) || ((LIBAVFORMAT_VERSION_MAJOR >= 52) && (LIBAVFORMAT_VERSION_MINOR >= 101)) +#define FFMPEG_HAVE_AV_DUMP_FORMAT 1 +#endif + +#ifndef FFMPEG_HAVE_AV_DUMP_FORMAT +#define av_dump_format dump_format #endif #endif @@ -241,19 +243,6 @@ void do_init_ffmpeg(void) } } -#ifdef FFMPEG_CODEC_IS_POINTER -static AVCodecContext* get_codec_from_stream(AVStream* stream) -{ - return stream->codec; -} -#else -static AVCodecContext* get_codec_from_stream(AVStream* stream) -{ - return &stream->codec; -} -#endif - - static int isffmpeg (const char *filename) { AVFormatContext *pFormatCtx; unsigned int i; @@ -284,15 +273,15 @@ static int isffmpeg (const char *filename) { return 0; } - if(UTIL_DEBUG) dump_format(pFormatCtx, 0, filename, 0); + if(UTIL_DEBUG) av_dump_format(pFormatCtx, 0, filename, 0); /* Find the first video stream */ videoStream=-1; for(i=0; i<pFormatCtx->nb_streams; i++) if(pFormatCtx->streams[i] && - get_codec_from_stream(pFormatCtx->streams[i]) && - (get_codec_from_stream(pFormatCtx->streams[i])->codec_type==CODEC_TYPE_VIDEO)) + pFormatCtx->streams[i]->codec && + (pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO)) { videoStream=i; break; @@ -303,7 +292,7 @@ static int isffmpeg (const char *filename) { return 0; } - pCodecCtx = get_codec_from_stream(pFormatCtx->streams[videoStream]); + pCodecCtx = pFormatCtx->streams[videoStream]->codec; /* Find the decoder for the video stream */ pCodec=avcodec_find_decoder(pCodecCtx->codec_id); diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h index a9f7d9f246f..e0feba3f2fd 100644 --- a/source/blender/makesrna/RNA_access.h +++ b/source/blender/makesrna/RNA_access.h @@ -743,6 +743,7 @@ int RNA_property_string_default_length(PointerRNA *ptr, PropertyRNA *prop); int RNA_property_enum_get(PointerRNA *ptr, PropertyRNA *prop); void RNA_property_enum_set(PointerRNA *ptr, PropertyRNA *prop, int value); int RNA_property_enum_get_default(PointerRNA *ptr, PropertyRNA *prop); +void *RNA_property_enum_py_data_get(PropertyRNA *prop); PointerRNA RNA_property_pointer_get(PointerRNA *ptr, PropertyRNA *prop); void RNA_property_pointer_set(PointerRNA *ptr, PropertyRNA *prop, PointerRNA ptr_value); diff --git a/source/blender/makesrna/RNA_define.h b/source/blender/makesrna/RNA_define.h index f52a69182b5..b076393ef3d 100644 --- a/source/blender/makesrna/RNA_define.h +++ b/source/blender/makesrna/RNA_define.h @@ -90,6 +90,7 @@ PropertyRNA *RNA_def_string_file_name(StructOrFunctionRNA *cont, const char *ide PropertyRNA *RNA_def_enum(StructOrFunctionRNA *cont, const char *identifier, const EnumPropertyItem *items, int default_value, const char *ui_name, const char *ui_description); PropertyRNA *RNA_def_enum_flag(StructOrFunctionRNA *cont, const char *identifier, const EnumPropertyItem *items, int default_value, const char *ui_name, const char *ui_description); void RNA_def_enum_funcs(PropertyRNA *prop, EnumPropertyItemFunc itemfunc); +void RNA_def_enum_py_data(PropertyRNA *prop, void *py_data); PropertyRNA *RNA_def_float(StructOrFunctionRNA *cont, const char *identifier, float default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax); PropertyRNA *RNA_def_float_vector(StructOrFunctionRNA *cont, const char *identifier, int len, const float *default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax); diff --git a/source/blender/makesrna/RNA_enum_types.h b/source/blender/makesrna/RNA_enum_types.h index 0bda47b4c7c..fc415dc8082 100644 --- a/source/blender/makesrna/RNA_enum_types.h +++ b/source/blender/makesrna/RNA_enum_types.h @@ -112,19 +112,20 @@ extern EnumPropertyItem ramp_blend_items[]; struct bContext; struct PointerRNA; -EnumPropertyItem *rna_TransformOrientation_itemf(struct bContext *C, struct PointerRNA *ptr, int *free); -EnumPropertyItem *rna_Sensor_type_itemf(struct bContext *C, struct PointerRNA *ptr, int *free); -EnumPropertyItem *rna_Actuator_type_itemf(struct bContext *C, struct PointerRNA *ptr, int *free); +struct PropertyRNA; +EnumPropertyItem *rna_TransformOrientation_itemf(struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA *prop, int *free); +EnumPropertyItem *rna_Sensor_type_itemf(struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA *prop, int *free); +EnumPropertyItem *rna_Actuator_type_itemf(struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA *prop, int *free); /* Generic functions, return an enum from library data, index is the position * in the linked list can add more for different types as needed */ -EnumPropertyItem *RNA_action_itemf(struct bContext *C, struct PointerRNA *ptr, int *free); -EnumPropertyItem *RNA_action_local_itemf(struct bContext *C, struct PointerRNA *ptr, int *free); -EnumPropertyItem *RNA_group_itemf(struct bContext *C, struct PointerRNA *ptr, int *free); -EnumPropertyItem *RNA_group_local_itemf(struct bContext *C, struct PointerRNA *ptr, int *free); -EnumPropertyItem *RNA_image_itemf(struct bContext *C, struct PointerRNA *ptr, int *free); -EnumPropertyItem *RNA_image_local_itemf(struct bContext *C, struct PointerRNA *ptr, int *free); -EnumPropertyItem *RNA_scene_itemf(struct bContext *C, struct PointerRNA *ptr, int *free); -EnumPropertyItem *RNA_scene_local_itemf(struct bContext *C, struct PointerRNA *ptr, int *free); +EnumPropertyItem *RNA_action_itemf(struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA *prop, int *free); +EnumPropertyItem *RNA_action_local_itemf(struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA *prop, int *free); +EnumPropertyItem *RNA_group_itemf(struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA *prop, int *free); +EnumPropertyItem *RNA_group_local_itemf(struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA *prop, int *free); +EnumPropertyItem *RNA_image_itemf(struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA *prop, int *free); +EnumPropertyItem *RNA_image_local_itemf(struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA *prop, int *free); +EnumPropertyItem *RNA_scene_itemf(struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA *prop, int *free); +EnumPropertyItem *RNA_scene_local_itemf(struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA *prop, int *free); #endif /* RNA_ENUM_TYPES_H */ diff --git a/source/blender/makesrna/RNA_types.h b/source/blender/makesrna/RNA_types.h index ec6f05c0e6a..b3f2ae01c99 100644 --- a/source/blender/makesrna/RNA_types.h +++ b/source/blender/makesrna/RNA_types.h @@ -39,6 +39,7 @@ extern "C" { struct ParameterList; struct FunctionRNA; struct PropertyRNA; +struct EnumPropertyRNA; struct StructRNA; struct BlenderRNA; struct IDProperty; @@ -255,7 +256,8 @@ typedef struct EnumPropertyItem { const char *description; } EnumPropertyItem; -typedef EnumPropertyItem *(*EnumPropertyItemFunc)(struct bContext *C, PointerRNA *ptr, int *free); +/* this is a copy of 'PropEnumItemFunc' defined in rna_internal_types.h */ +typedef EnumPropertyItem *(*EnumPropertyItemFunc)(struct bContext *C, PointerRNA *ptr, struct PropertyRNA *prop, int *free); typedef struct PropertyRNA PropertyRNA; diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c index fe6fc91eff4..f3f539feb99 100644 --- a/source/blender/makesrna/intern/makesrna.c +++ b/source/blender/makesrna/intern/makesrna.c @@ -2223,7 +2223,7 @@ static void rna_generate_property(FILE *f, StructRNA *srna, const char *nest, Pr } case PROP_ENUM: { EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop; - fprintf(f, "\t%s, %s, %s, ", rna_function_string(eprop->get), rna_function_string(eprop->set), rna_function_string(eprop->itemf)); + fprintf(f, "\t%s, %s, %s, NULL, ", rna_function_string(eprop->get), rna_function_string(eprop->set), rna_function_string(eprop->itemf)); if(eprop->item) fprintf(f, "rna_%s%s_%s_items, ", srna->identifier, strnest, prop->identifier); else diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index ff54ac6254f..8a7b5bb5966 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -1096,9 +1096,9 @@ void RNA_property_enum_items(bContext *C, PointerRNA *ptr, PropertyRNA *prop, En int tot= 0; if (prop->flag & PROP_ENUM_NO_CONTEXT) - *item= eprop->itemf(NULL, ptr, free); + *item= eprop->itemf(NULL, ptr, prop, free); else - *item= eprop->itemf(C, ptr, free); + *item= eprop->itemf(C, ptr, prop, free); if(totitem) { if(*item) { @@ -2120,6 +2120,14 @@ int RNA_property_enum_get_default(PointerRNA *ptr, PropertyRNA *prop) return eprop->defaultvalue; } +void *RNA_property_enum_py_data_get(PropertyRNA *prop) +{ + EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop; + + BLI_assert(RNA_property_type(prop) == PROP_ENUM); + + return eprop->py_data; +} PointerRNA RNA_property_pointer_get(PointerRNA *ptr, PropertyRNA *prop) { diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c index 2afba954be3..116f5185980 100644 --- a/source/blender/makesrna/intern/rna_actuator.c +++ b/source/blender/makesrna/intern/rna_actuator.c @@ -411,7 +411,7 @@ static void rna_StateActuator_state_set(PointerRNA *ptr, const int *values) } /* Always keep in alphabetical order */ -EnumPropertyItem *rna_Actuator_type_itemf(bContext *C, PointerRNA *ptr, int *free) +EnumPropertyItem *rna_Actuator_type_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { EnumPropertyItem *item= NULL; Object *ob= NULL; diff --git a/source/blender/makesrna/intern/rna_brush.c b/source/blender/makesrna/intern/rna_brush.c index 599fc0af97c..d8eba424e94 100644 --- a/source/blender/makesrna/intern/rna_brush.c +++ b/source/blender/makesrna/intern/rna_brush.c @@ -249,7 +249,7 @@ static float rna_Brush_get_alpha(PointerRNA *ptr) return brush_alpha(me); } -static EnumPropertyItem *rna_Brush_direction_itemf(bContext *C, PointerRNA *ptr, int *free) +static EnumPropertyItem *rna_Brush_direction_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { static EnumPropertyItem prop_default_items[]= { {0, NULL, 0, NULL, NULL}}; diff --git a/source/blender/makesrna/intern/rna_constraint.c b/source/blender/makesrna/intern/rna_constraint.c index e7604b2beb4..d90db814329 100644 --- a/source/blender/makesrna/intern/rna_constraint.c +++ b/source/blender/makesrna/intern/rna_constraint.c @@ -243,7 +243,7 @@ static void rna_Constraint_ik_type_set(struct PointerRNA *ptr, int value) } } -static EnumPropertyItem *rna_Constraint_owner_space_itemf(bContext *C, PointerRNA *ptr, int *free) +static EnumPropertyItem *rna_Constraint_owner_space_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { Object *ob= (Object*)ptr->id.data; bConstraint *con= (bConstraint*)ptr->data; @@ -254,7 +254,7 @@ static EnumPropertyItem *rna_Constraint_owner_space_itemf(bContext *C, PointerRN return space_object_items; } -static EnumPropertyItem *rna_Constraint_target_space_itemf(bContext *C, PointerRNA *ptr, int *free) +static EnumPropertyItem *rna_Constraint_target_space_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { bConstraint *con= (bConstraint*)ptr->data; bConstraintTypeInfo *cti= constraint_get_typeinfo(con); diff --git a/source/blender/makesrna/intern/rna_define.c b/source/blender/makesrna/intern/rna_define.c index d66f0042d88..fa3e3fa8ec3 100644 --- a/source/blender/makesrna/intern/rna_define.c +++ b/source/blender/makesrna/intern/rna_define.c @@ -2276,6 +2276,12 @@ void RNA_def_enum_funcs(PropertyRNA *prop, EnumPropertyItemFunc itemfunc) eprop->itemf= itemfunc; } +void RNA_def_enum_py_data(PropertyRNA *prop, void *py_data) +{ + EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop; + eprop->py_data= py_data; +} + PropertyRNA *RNA_def_float(StructOrFunctionRNA *cont_, const char *identifier, float default_value, float hardmin, float hardmax, const char *ui_name, const char *ui_description, float softmin, float softmax) { diff --git a/source/blender/makesrna/intern/rna_image.c b/source/blender/makesrna/intern/rna_image.c index 3db90c2de0e..98a89a2524e 100644 --- a/source/blender/makesrna/intern/rna_image.c +++ b/source/blender/makesrna/intern/rna_image.c @@ -143,7 +143,7 @@ char *rna_ImageUser_path(PointerRNA *ptr) return BLI_strdup(""); } -static EnumPropertyItem *rna_Image_source_itemf(bContext *C, PointerRNA *ptr, int *free) +static EnumPropertyItem *rna_Image_source_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { Image *ima= (Image*)ptr->data; EnumPropertyItem *item= NULL; diff --git a/source/blender/makesrna/intern/rna_internal_types.h b/source/blender/makesrna/intern/rna_internal_types.h index a59db183453..771d2afcd96 100644 --- a/source/blender/makesrna/intern/rna_internal_types.h +++ b/source/blender/makesrna/intern/rna_internal_types.h @@ -41,6 +41,7 @@ struct FunctionRNA; struct ReportList; struct CollectionPropertyIterator; struct bContext; +struct EnumProperty; struct IDProperty; struct GHash; struct Main; @@ -88,7 +89,7 @@ typedef int (*PropStringLengthFunc)(struct PointerRNA *ptr); typedef void (*PropStringSetFunc)(struct PointerRNA *ptr, const char *value); typedef int (*PropEnumGetFunc)(struct PointerRNA *ptr); typedef void (*PropEnumSetFunc)(struct PointerRNA *ptr, int value); -typedef EnumPropertyItem *(*PropEnumItemFunc)(struct bContext *C, struct PointerRNA *ptr, int *free); +typedef EnumPropertyItem *(*PropEnumItemFunc)(struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA *prop, int *free); typedef PointerRNA (*PropPointerGetFunc)(struct PointerRNA *ptr); typedef StructRNA* (*PropPointerTypeFunc)(struct PointerRNA *ptr); typedef void (*PropPointerSetFunc)(struct PointerRNA *ptr, const PointerRNA value); @@ -250,6 +251,7 @@ typedef struct EnumPropertyRNA { PropEnumGetFunc get; PropEnumSetFunc set; PropEnumItemFunc itemf; + void *py_data; /* store py callback here */ EnumPropertyItem *item; int totitem; diff --git a/source/blender/makesrna/intern/rna_material.c b/source/blender/makesrna/intern/rna_material.c index 0e9629f973d..fdb41295b75 100644 --- a/source/blender/makesrna/intern/rna_material.c +++ b/source/blender/makesrna/intern/rna_material.c @@ -272,7 +272,7 @@ static void rna_Material_use_nodes_set(PointerRNA *ptr, int value) ED_node_shader_default(ma); } -static EnumPropertyItem *rna_Material_texture_coordinates_itemf(bContext *C, PointerRNA *ptr, int *free) +static EnumPropertyItem *rna_Material_texture_coordinates_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { Material *ma= (Material*)ptr->id.data; EnumPropertyItem *item= NULL; diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index d55534bb1b5..d41fb42d1eb 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -367,7 +367,7 @@ static EnumPropertyItem *renderresult_layers_add_enum(RenderLayer *rl) return item; } -static EnumPropertyItem *rna_Node_image_layer_itemf(bContext *C, PointerRNA *ptr, int *free) +static EnumPropertyItem *rna_Node_image_layer_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { bNode *node= (bNode*)ptr->data; Image *ima = (Image *)node->id; @@ -384,7 +384,7 @@ static EnumPropertyItem *rna_Node_image_layer_itemf(bContext *C, PointerRNA *ptr return item; } -static EnumPropertyItem *rna_Node_scene_layer_itemf(bContext *C, PointerRNA *ptr, int *free) +static EnumPropertyItem *rna_Node_scene_layer_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { bNode *node= (bNode*)ptr->data; Scene *sce = (Scene *)node->id; @@ -401,7 +401,7 @@ static EnumPropertyItem *rna_Node_scene_layer_itemf(bContext *C, PointerRNA *ptr return item; } -static EnumPropertyItem *rna_Node_channel_itemf(bContext *C, PointerRNA *ptr, int *free) +static EnumPropertyItem *rna_Node_channel_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { bNode *node= (bNode*)ptr->data; EnumPropertyItem *item= NULL; diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index b2b425757cc..7bf53f74fd8 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -379,7 +379,7 @@ static void rna_Object_parent_type_set(PointerRNA *ptr, int value) ED_object_parent(ob, ob->parent, value, ob->parsubstr); } -static EnumPropertyItem *rna_Object_parent_type_itemf(bContext *C, PointerRNA *ptr, int *free) +static EnumPropertyItem *rna_Object_parent_type_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { Object *ob= (Object*)ptr->data; EnumPropertyItem *item= NULL; @@ -410,7 +410,7 @@ static EnumPropertyItem *rna_Object_parent_type_itemf(bContext *C, PointerRNA *p return item; } -static EnumPropertyItem *rna_Object_collision_bounds_itemf(bContext *C, PointerRNA *ptr, int *free) +static EnumPropertyItem *rna_Object_collision_bounds_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { Object *ob= (Object*)ptr->data; EnumPropertyItem *item= NULL; diff --git a/source/blender/makesrna/intern/rna_object_force.c b/source/blender/makesrna/intern/rna_object_force.c index 65c7b351622..9df76959122 100644 --- a/source/blender/makesrna/intern/rna_object_force.c +++ b/source/blender/makesrna/intern/rna_object_force.c @@ -678,7 +678,7 @@ static void rna_softbody_update(Main *bmain, Scene *scene, PointerRNA *ptr) } -static EnumPropertyItem *rna_Effector_shape_itemf(bContext *C, PointerRNA *ptr, int *free) +static EnumPropertyItem *rna_Effector_shape_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { Object *ob= NULL; diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c index fa69fad253f..6c9540908c5 100644 --- a/source/blender/makesrna/intern/rna_particle.c +++ b/source/blender/makesrna/intern/rna_particle.c @@ -702,7 +702,7 @@ static void rna_ParticleDupliWeight_name_get(PointerRNA *ptr, char *str) strcpy(str, "No object"); } -static EnumPropertyItem *rna_Particle_from_itemf(bContext *C, PointerRNA *ptr, int *free) +static EnumPropertyItem *rna_Particle_from_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { //if(part->type==PART_REACTOR) // return part_reactor_from_items; @@ -710,7 +710,7 @@ static EnumPropertyItem *rna_Particle_from_itemf(bContext *C, PointerRNA *ptr, i return part_from_items; } -static EnumPropertyItem *rna_Particle_dist_itemf(bContext *C, PointerRNA *ptr, int *free) +static EnumPropertyItem *rna_Particle_dist_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { ParticleSettings *part = ptr->id.data; @@ -720,7 +720,7 @@ static EnumPropertyItem *rna_Particle_dist_itemf(bContext *C, PointerRNA *ptr, i return part_dist_items; } -static EnumPropertyItem *rna_Particle_draw_as_itemf(bContext *C, PointerRNA *ptr, int *free) +static EnumPropertyItem *rna_Particle_draw_as_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { ParticleSettings *part = ptr->id.data; @@ -730,7 +730,7 @@ static EnumPropertyItem *rna_Particle_draw_as_itemf(bContext *C, PointerRNA *ptr return part_draw_as_items; } -static EnumPropertyItem *rna_Particle_ren_as_itemf(bContext *C, PointerRNA *ptr, int *free) +static EnumPropertyItem *rna_Particle_ren_as_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { ParticleSettings *part = ptr->id.data; diff --git a/source/blender/makesrna/intern/rna_rna.c b/source/blender/makesrna/intern/rna_rna.c index de2b551909c..8faff2e26a9 100644 --- a/source/blender/makesrna/intern/rna_rna.c +++ b/source/blender/makesrna/intern/rna_rna.c @@ -697,7 +697,7 @@ static int rna_StringProperty_max_length_get(PointerRNA *ptr) return ((StringPropertyRNA*)prop)->maxlength; } -static EnumPropertyItem *rna_EnumProperty_default_itemf(bContext *C, PointerRNA *ptr, int *free) +static EnumPropertyItem *rna_EnumProperty_default_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { PropertyRNA *prop= (PropertyRNA*)ptr->data; EnumPropertyRNA *eprop; @@ -713,7 +713,7 @@ static EnumPropertyItem *rna_EnumProperty_default_itemf(bContext *C, PointerRNA return eprop->item; } - return eprop->itemf(C, ptr, free); + return eprop->itemf(C, ptr, prop, free); } /* XXX - not sure this is needed? */ diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 44dcabe40f9..79184f1667b 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -597,7 +597,7 @@ static void rna_RenderSettings_qtcodecsettings_codecType_set(PointerRNA *ptr, in rd->qtcodecsettings.codecType = quicktime_videocodecType_from_rnatmpvalue(value); } -static EnumPropertyItem *rna_RenderSettings_qtcodecsettings_codecType_itemf(bContext *C, PointerRNA *ptr, int *free) +static EnumPropertyItem *rna_RenderSettings_qtcodecsettings_codecType_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { EnumPropertyItem *item= NULL; EnumPropertyItem tmp = {0, "", 0, "", ""}; @@ -638,7 +638,7 @@ static void rna_RenderSettings_qtcodecsettings_audiocodecType_set(PointerRNA *pt rd->qtcodecsettings.audiocodecType = quicktime_audiocodecType_from_rnatmpvalue(value); } -static EnumPropertyItem *rna_RenderSettings_qtcodecsettings_audiocodecType_itemf(bContext *C, PointerRNA *ptr, int *free) +static EnumPropertyItem *rna_RenderSettings_qtcodecsettings_audiocodecType_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { EnumPropertyItem *item= NULL; EnumPropertyItem tmp = {0, "", 0, "", ""}; @@ -709,7 +709,7 @@ static void rna_RenderSettings_engine_set(PointerRNA *ptr, int value) BLI_strncpy(rd->engine, type->idname, sizeof(rd->engine)); } -static EnumPropertyItem *rna_RenderSettings_engine_itemf(bContext *C, PointerRNA *ptr, int *free) +static EnumPropertyItem *rna_RenderSettings_engine_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { RenderEngineType *type; EnumPropertyItem *item= NULL; @@ -2149,7 +2149,6 @@ static void rna_def_scene_render_data(BlenderRNA *brna) {CODEC_ID_HUFFYUV, "HUFFYUV", 0, "HuffYUV", ""}, {CODEC_ID_DVVIDEO, "DV", 0, "DV", ""}, {CODEC_ID_H264, "H264", 0, "H.264", ""}, - {CODEC_ID_XVID, "XVID", 0, "Xvid", ""}, {CODEC_ID_THEORA, "THEORA", 0, "Theora", ""}, {CODEC_ID_FLV1, "FLASH", 0, "Flash Video", ""}, {CODEC_ID_FFV1, "FFV1", 0, "FFmpeg video codec #1", ""}, diff --git a/source/blender/makesrna/intern/rna_sculpt_paint.c b/source/blender/makesrna/intern/rna_sculpt_paint.c index 3e1fcd08ce9..be5b41a7b64 100644 --- a/source/blender/makesrna/intern/rna_sculpt_paint.c +++ b/source/blender/makesrna/intern/rna_sculpt_paint.c @@ -127,7 +127,7 @@ static void rna_ParticleEdit_tool_set(PointerRNA *ptr, int value) pset->brushtype = value; } -static EnumPropertyItem *rna_ParticleEdit_tool_itemf(bContext *C, PointerRNA *ptr, int *free) +static EnumPropertyItem *rna_ParticleEdit_tool_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { Scene *scene= CTX_data_scene(C); Object *ob= (scene->basact)? scene->basact->object: NULL; diff --git a/source/blender/makesrna/intern/rna_sensor.c b/source/blender/makesrna/intern/rna_sensor.c index 5bf398ae3a7..5cc8539f187 100644 --- a/source/blender/makesrna/intern/rna_sensor.c +++ b/source/blender/makesrna/intern/rna_sensor.c @@ -115,7 +115,7 @@ static void rna_Sensor_type_set(struct PointerRNA *ptr, int value) } /* Always keep in alphabetical order */ -EnumPropertyItem *rna_Sensor_type_itemf(bContext *C, PointerRNA *ptr, int *free) +EnumPropertyItem *rna_Sensor_type_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { EnumPropertyItem *item= NULL; Object *ob=NULL; diff --git a/source/blender/makesrna/intern/rna_sequencer.c b/source/blender/makesrna/intern/rna_sequencer.c index 90ae95894b0..6d4e9bb476c 100644 --- a/source/blender/makesrna/intern/rna_sequencer.c +++ b/source/blender/makesrna/intern/rna_sequencer.c @@ -107,6 +107,23 @@ static void rna_SequenceEditor_sequences_all_next(CollectionPropertyIterator *it } /* internal use */ +static int rna_SequenceEditor_elements_length(PointerRNA *ptr) +{ + Sequence *seq= (Sequence*)ptr->data; + + /* Hack? copied from sequencer.c::reload_sequence_new_file() */ + size_t olen = MEM_allocN_len(seq->strip->stripdata)/sizeof(struct StripElem); + + /* the problem with seq->strip->len and seq->len is that it's discounted from the offset (hard cut trim) */ + return (int) olen; +} + +static void rna_SequenceEditor_elements_begin(CollectionPropertyIterator *iter, PointerRNA *ptr) +{ + Sequence *seq= (Sequence*)ptr->data; + rna_iterator_array_begin(iter, (void*)seq->strip->stripdata, sizeof(StripElem), rna_SequenceEditor_elements_length(ptr), 0, NULL); +} + static void rna_Sequence_frame_change_update(Scene *scene, Sequence *seq) { Editing *ed= seq_give_editing(scene, FALSE); @@ -1222,9 +1239,10 @@ static void rna_def_image(BlenderRNA *brna) RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); prop= RNA_def_property(srna, "elements", PROP_COLLECTION, PROP_NONE); - RNA_def_property_collection_sdna(prop, NULL, "strip->stripdata", "strip->len"); + RNA_def_property_collection_sdna(prop, NULL, "strip->stripdata", NULL); RNA_def_property_struct_type(prop, "SequenceElement"); RNA_def_property_ui_text(prop, "Elements", ""); + RNA_def_property_collection_funcs(prop, "rna_SequenceEditor_elements_begin", "rna_iterator_array_next", "rna_iterator_array_end", "rna_iterator_array_get", "rna_SequenceEditor_elements_length", 0, 0); rna_def_filter_video(srna); rna_def_proxy(srna); @@ -1291,9 +1309,10 @@ static void rna_def_movie(BlenderRNA *brna) RNA_def_property_update(prop, NC_SCENE|ND_SEQUENCER, "rna_Sequence_update"); prop= RNA_def_property(srna, "elements", PROP_COLLECTION, PROP_NONE); - RNA_def_property_collection_sdna(prop, NULL, "strip->stripdata", "strip->len"); + RNA_def_property_collection_sdna(prop, NULL, "strip->stripdata", NULL); RNA_def_property_struct_type(prop, "SequenceElement"); RNA_def_property_ui_text(prop, "Elements", ""); + RNA_def_property_collection_funcs(prop, "rna_SequenceEditor_elements_begin", "rna_iterator_array_next", "rna_iterator_array_end", "rna_iterator_array_get", "rna_SequenceEditor_elements_length", 0, 0); prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH); RNA_def_property_ui_text(prop, "File", ""); diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 645c35ece84..17e44c14b44 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -219,7 +219,7 @@ static PointerRNA rna_CurrentOrientation_get(PointerRNA *ptr) return rna_pointer_inherit_refine(ptr, &RNA_TransformOrientation, BLI_findlink(&scene->transform_spaces, v3d->twmode - V3D_MANIP_CUSTOM)); } -EnumPropertyItem *rna_TransformOrientation_itemf(bContext *C, PointerRNA *ptr, int *free) +EnumPropertyItem *rna_TransformOrientation_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { Scene *scene = NULL; ListBase *transform_spaces; @@ -469,7 +469,7 @@ static void rna_SpaceImageEditor_image_set(PointerRNA *ptr, PointerRNA value) ED_space_image_set(NULL, sima, sc->scene, sc->scene->obedit, (Image*)value.data); } -static EnumPropertyItem *rna_SpaceImageEditor_draw_channels_itemf(bContext *C, PointerRNA *ptr, int *free) +static EnumPropertyItem *rna_SpaceImageEditor_draw_channels_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { SpaceImage *sima= (SpaceImage*)ptr->data; EnumPropertyItem *item= NULL; @@ -849,7 +849,7 @@ static void rna_BackgroundImage_opacity_set(PointerRNA *ptr, float value) bgpic->blend = 1.0f - value; } -static EnumPropertyItem *rna_SpaceProperties_texture_context_itemf(bContext *C, PointerRNA *ptr, int *free) +static EnumPropertyItem *rna_SpaceProperties_texture_context_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { Scene *scene = CTX_data_scene(C); Object *ob = CTX_data_active_object(C); diff --git a/source/blender/makesrna/intern/rna_texture.c b/source/blender/makesrna/intern/rna_texture.c index 599014c3e4a..9cf710976f8 100644 --- a/source/blender/makesrna/intern/rna_texture.c +++ b/source/blender/makesrna/intern/rna_texture.c @@ -286,7 +286,7 @@ static int rna_TextureSlot_output_node_get(PointerRNA *ptr) } -static EnumPropertyItem *rna_TextureSlot_output_node_itemf(bContext *C, PointerRNA *ptr, int *free) +static EnumPropertyItem *rna_TextureSlot_output_node_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { MTex *mtex= ptr->data; Tex *tex= mtex->tex; diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c index e8b127b68bb..8a094d6eef1 100644 --- a/source/blender/makesrna/intern/rna_wm.c +++ b/source/blender/makesrna/intern/rna_wm.c @@ -467,7 +467,7 @@ static void rna_wmKeyMapItem_map_type_set(PointerRNA *ptr, int value) } } -static EnumPropertyItem *rna_KeyMapItem_type_itemf(bContext *C, PointerRNA *ptr, int *free) +static EnumPropertyItem *rna_KeyMapItem_type_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { int map_type= rna_wmKeyMapItem_map_type_get(ptr); @@ -477,7 +477,7 @@ static EnumPropertyItem *rna_KeyMapItem_type_itemf(bContext *C, PointerRNA *ptr, else return event_type_items; } -static EnumPropertyItem *rna_KeyMapItem_value_itemf(bContext *C, PointerRNA *ptr, int *free) +static EnumPropertyItem *rna_KeyMapItem_value_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { int map_type= rna_wmKeyMapItem_map_type_get(ptr); @@ -486,7 +486,7 @@ static EnumPropertyItem *rna_KeyMapItem_value_itemf(bContext *C, PointerRNA *ptr else return event_value_items; } -static EnumPropertyItem *rna_KeyMapItem_propvalue_itemf(bContext *C, PointerRNA *ptr, int *free) +static EnumPropertyItem *rna_KeyMapItem_propvalue_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free) { wmWindowManager *wm = CTX_wm_manager(C); wmKeyConfig *kc; @@ -1842,4 +1842,3 @@ void RNA_def_wm(BlenderRNA *brna) } #endif /* RNA_RUNTIME */ - diff --git a/source/blender/modifiers/intern/MOD_armature.c b/source/blender/modifiers/intern/MOD_armature.c index 95579147dbb..a0ee047e319 100644 --- a/source/blender/modifiers/intern/MOD_armature.c +++ b/source/blender/modifiers/intern/MOD_armature.c @@ -127,8 +127,8 @@ static void deformVerts(ModifierData *md, Object *ob, modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */ armature_deform_verts(amd->object, ob, derivedData, vertexCos, NULL, - numVerts, amd->deformflag, - (float(*)[3])amd->prevCos, amd->defgrp_name); + numVerts, amd->deformflag, (float(*)[3])amd->prevCos, amd->defgrp_name); + /* free cache */ if(amd->prevCos) { MEM_freeN(amd->prevCos); @@ -145,8 +145,16 @@ static void deformVertsEM( if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data); - armature_deform_verts(amd->object, ob, dm, vertexCos, NULL, numVerts, - amd->deformflag, NULL, amd->defgrp_name); + modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */ + + armature_deform_verts(amd->object, ob, dm, vertexCos, NULL, + numVerts, amd->deformflag, (float(*)[3])amd->prevCos, amd->defgrp_name); + + /* free cache */ + if(amd->prevCos) { + MEM_freeN(amd->prevCos); + amd->prevCos= NULL; + } if(!derivedData) dm->release(dm); } diff --git a/source/blender/python/generic/mathutils_Color.c b/source/blender/python/generic/mathutils_Color.c index c81ead92b8a..09e3493cd09 100644 --- a/source/blender/python/generic/mathutils_Color.c +++ b/source/blender/python/generic/mathutils_Color.c @@ -1,5 +1,5 @@ /* - * $Id: mathutils_Color.c 36871 2011-05-24 16:05:51Z campbellbarton $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -93,7 +93,8 @@ PyDoc_STRVAR(Color_copy_doc, " :return: A copy of the color.\n" " :rtype: :class:`Color`\n" "\n" -" .. note:: use this to get a copy of a wrapped color with no reference to the original data.\n" +" .. note:: use this to get a copy of a wrapped color with\n" +" no reference to the original data.\n" ); static PyObject *Color_copy(ColorObject *self) { diff --git a/source/blender/python/generic/mathutils_Euler.c b/source/blender/python/generic/mathutils_Euler.c index ad6eda83127..9adf0ee905b 100644 --- a/source/blender/python/generic/mathutils_Euler.c +++ b/source/blender/python/generic/mathutils_Euler.c @@ -1,5 +1,5 @@ /* - * $Id: mathutils_Euler.c 36871 2011-05-24 16:05:51Z campbellbarton $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -185,7 +185,8 @@ static PyObject *Euler_zero(EulerObject * self) PyDoc_STRVAR(Euler_rotate_axis_doc, ".. method:: rotate_axis(axis, angle)\n" "\n" -" Rotates the euler a certain amount and returning a unique euler rotation (no 720 degree pitches).\n" +" Rotates the euler a certain amount and returning a unique euler rotation\n" +" (no 720 degree pitches).\n" "\n" " :arg axis: single character in ['X, 'Y', 'Z'].\n" " :type axis: string\n" @@ -247,7 +248,8 @@ static PyObject *Euler_rotate(EulerObject * self, PyObject *value) PyDoc_STRVAR(Euler_make_compatible_doc, ".. method:: make_compatible(other)\n" "\n" -" Make this euler compatible with another, so interpolating between them works as intended.\n" +" Make this euler compatible with another,\n" +" so interpolating between them works as intended.\n" "\n" " .. note:: the rotation order is not taken into account for this function.\n" ); @@ -279,7 +281,8 @@ PyDoc_STRVAR(Euler_copy_doc, " :return: A copy of the euler.\n" " :rtype: :class:`Euler`\n" "\n" -" .. note:: use this to get a copy of a wrapped euler with no reference to the original data.\n" +" .. note:: use this to get a copy of a wrapped euler with\n" +" no reference to the original data.\n" ); static PyObject *Euler_copy(EulerObject *self) { diff --git a/source/blender/python/generic/mathutils_Matrix.c b/source/blender/python/generic/mathutils_Matrix.c index 35449793f5a..982a8e63282 100644 --- a/source/blender/python/generic/mathutils_Matrix.c +++ b/source/blender/python/generic/mathutils_Matrix.c @@ -1,5 +1,5 @@ /* - * $Id: mathutils_Matrix.c 36871 2011-05-24 16:05:51Z campbellbarton $ + * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -195,7 +195,8 @@ PyDoc_STRVAR(C_Matrix_Rotation_doc, " :type angle: float\n" " :arg size: The size of the rotation matrix to construct [2, 4].\n" " :type size: int\n" -" :arg axis: a string in ['X', 'Y', 'Z'] or a 3D Vector Object (optional when size is 2).\n" +" :arg axis: a string in ['X', 'Y', 'Z'] or a 3D Vector Object\n" +" (optional when size is 2).\n" " :type axis: string or :class:`Vector`\n" " :return: A new rotation matrix.\n" " :rtype: :class:`Matrix`\n" @@ -407,7 +408,9 @@ PyDoc_STRVAR(C_Matrix_OrthoProjection_doc, "\n" " Create a matrix to represent an orthographic projection.\n" "\n" -" :arg axis: Can be any of the following: ['X', 'Y', 'XY', 'XZ', 'YZ'], where a single axis is for a 2D matrix. Or a vector for an arbitrary axis\n" +" :arg axis: Can be any of the following: ['X', 'Y', 'XY', 'XZ', 'YZ'],\n" +" where a single axis is for a 2D matrix.\n" +" Or a vector for an arbitrary axis\n" " :type axis: string or :class:`Vector`\n" " :arg size: The size of the projection matrix to construct [2, 4].\n" " :type size: int\n" @@ -513,11 +516,13 @@ PyDoc_STRVAR(C_Matrix_Shear_doc, "\n" " Create a matrix to represent an shear transformation.\n" "\n" -" :arg plane: Can be any of the following: ['X', 'Y', 'XY', 'XZ', 'YZ'], where a single axis is for a 2D matrix only.\n" +" :arg plane: Can be any of the following: ['X', 'Y', 'XY', 'XZ', 'YZ'],\n" +" where a single axis is for a 2D matrix only.\n" " :type plane: string\n" " :arg size: The size of the shear matrix to construct [2, 4].\n" " :type size: int\n" -" :arg factor: The factor of shear to apply. For a 3 or 4 *size* matrix pass a pair of floats corrasponding with the *plane* axis.\n" +" :arg factor: The factor of shear to apply. For a 3 or 4 *size* matrix\n" +" pass a pair of floats corrasponding with the *plane* axis.\n" " :type factor: float or float pair\n" " :return: A new shear matrix.\n" " :rtype: :class:`Matrix`\n" @@ -660,11 +665,15 @@ static PyObject *Matrix_to_quaternion(MatrixObject *self) PyDoc_STRVAR(Matrix_to_euler_doc, ".. method:: to_euler(order, euler_compat)\n" "\n" -" Return an Euler representation of the rotation matrix (3x3 or 4x4 matrix only).\n" +" Return an Euler representation of the rotation matrix\n" +" (3x3 or 4x4 matrix only).\n" "\n" -" :arg order: Optional rotation order argument in ['XYZ', 'XZY', 'YXZ', 'YZX', 'ZXY', 'ZYX'].\n" +" :arg order: Optional rotation order argument in\n" +" ['XYZ', 'XZY', 'YXZ', 'YZX', 'ZXY', 'ZYX'].\n" " :type order: string\n" -" :arg euler_compat: Optional euler argument the new euler will be made compatible with (no axis flipping between them). Useful for converting a series of matrices to animation curves.\n" +" :arg euler_compat: Optional euler argument the new euler will be made\n" +" compatible with (no axis flipping between them).\n" +" Useful for converting a series of matrices to animation curves.\n" " :type euler_compat: :class:`Euler`\n" " :return: Euler representation of the matrix.\n" " :rtype: :class:`Euler`\n" @@ -1174,7 +1183,8 @@ PyDoc_STRVAR(Matrix_identity_doc, "\n" " Set the matrix to the identity matrix.\n" "\n" -" .. note:: An object with zero location and rotation, a scale of one, will have an identity matrix.\n" +" .. note:: An object with zero location and rotation, a scale of one,\n" +" will have an identity matrix.\n" "\n" " .. seealso:: <http://en.wikipedia.org/wiki/Identity_matrix>\n" ); diff --git a/source/blender/python/generic/mathutils_Quaternion.c b/source/blender/python/generic/mathutils_Quaternion.c index 00a6c36b3ad..90447e7093a 100644 --- a/source/blender/python/generic/mathutils_Quaternion.c +++ b/source/blender/python/generic/mathutils_Quaternion.c @@ -72,9 +72,12 @@ PyDoc_STRVAR(Quaternion_to_euler_doc, "\n" " Return Euler representation of the quaternion.\n" "\n" -" :arg order: Optional rotation order argument in ['XYZ', 'XZY', 'YXZ', 'YZX', 'ZXY', 'ZYX'].\n" +" :arg order: Optional rotation order argument in\n" +" ['XYZ', 'XZY', 'YXZ', 'YZX', 'ZXY', 'ZYX'].\n" " :type order: string\n" -" :arg euler_compat: Optional euler argument the new euler will be made compatible with (no axis flipping between them). Useful for converting a series of matrices to animation curves.\n" +" :arg euler_compat: Optional euler argument the new euler will be made\n" +" compatible with (no axis flipping between them).\n" +" Useful for converting a series of matrices to animation curves.\n" " :type euler_compat: :class:`Euler`\n" " :return: Euler representation of the quaternion.\n" " :rtype: :class:`Euler`\n" @@ -417,7 +420,8 @@ PyDoc_STRVAR(Quaternion_copy_doc, " :return: A copy of the quaternion.\n" " :rtype: :class:`Quaternion`\n" "\n" -" .. note:: use this to get a copy of a wrapped quaternion with no reference to the original data.\n" +" .. note:: use this to get a copy of a wrapped quaternion with\n" +" no reference to the original data.\n" ); static PyObject *Quaternion_copy(QuaternionObject *self) { diff --git a/source/blender/python/generic/mathutils_Vector.c b/source/blender/python/generic/mathutils_Vector.c index 6f2b66a81f4..fd8d1b5f481 100644 --- a/source/blender/python/generic/mathutils_Vector.c +++ b/source/blender/python/generic/mathutils_Vector.c @@ -1,5 +1,5 @@ /* - * $Id: mathutils_Vector.c 36871 2011-05-24 16:05:51Z campbellbarton $ + * $Id$ * ***** BEGIN GPL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or @@ -107,9 +107,11 @@ PyDoc_STRVAR(Vector_normalize_doc, "\n" " Normalize the vector, making the length of the vector always 1.0.\n" "\n" -" .. warning:: Normalizing a vector where all values are zero results in all axis having a nan value (not a number).\n" +" .. warning:: Normalizing a vector where all values are zero results\n" +" in all axis having a nan value (not a number).\n" "\n" -" .. note:: Normalize works for vectors of all sizes, however 4D Vectors w axis is left untouched.\n" +" .. note:: Normalize works for vectors of all sizes,\n" +" however 4D Vectors w axis is left untouched.\n" ); static PyObject *Vector_normalize(VectorObject *self) { @@ -565,7 +567,8 @@ PyDoc_STRVAR(Vector_angle_doc, "\n" " :arg other: another vector to compare the angle with\n" " :type other: :class:`Vector`\n" -" :arg fallback: return this value when the angle cant be calculated (zero length vector)\n" +" :arg fallback: return this value when the angle cant be calculated\n" +" (zero length vector)\n" " :type fallback: any\n" " :return: angle in radians or fallback when given\n" " :rtype: float\n" @@ -618,7 +621,8 @@ static PyObject *Vector_angle(VectorObject *self, PyObject *args) PyDoc_STRVAR(Vector_rotation_difference_doc, ".. function:: difference(other)\n" "\n" -" Returns a quaternion representing the rotational difference between this vector and another.\n" +" Returns a quaternion representing the rotational difference between this\n" +" vector and another.\n" "\n" " :arg other: second vector.\n" " :type other: :class:`Vector`\n" @@ -764,7 +768,8 @@ PyDoc_STRVAR(Vector_copy_doc, " :return: A copy of the vector.\n" " :rtype: :class:`Vector`\n" "\n" -" .. note:: use this to get a copy of a wrapped vector with no reference to the original data.\n" +" .. note:: use this to get a copy of a wrapped vector with\n" +" no reference to the original data.\n" ); static PyObject *Vector_copy(VectorObject *self) { diff --git a/source/blender/python/intern/bpy.c b/source/blender/python/intern/bpy.c index afafc9b4534..450151ee870 100644 --- a/source/blender/python/intern/bpy.c +++ b/source/blender/python/intern/bpy.c @@ -239,7 +239,7 @@ void BPy_init_modules( void ) PyObject *mod; /* Needs to be first since this dir is needed for future modules */ - char *modpath= BLI_get_folder(BLENDER_SCRIPTS, "modules"); + char *modpath= BLI_get_folder(BLENDER_SYSTEM_SCRIPTS, "modules"); if(modpath) { // printf("bpy: found module path '%s'.\n", modpath); PyObject *sys_path= PySys_GetObject("path"); /* borrow */ diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index acd23887af0..e6f4c5713a1 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -197,7 +197,7 @@ void BPY_python_start(int argc, const char **argv) PyImport_ExtendInittab(bpy_internal_modules); /* allow to use our own included python */ - PyC_SetHomePath(BLI_get_folder(BLENDER_PYTHON, NULL)); + PyC_SetHomePath(BLI_get_folder(BLENDER_SYSTEM_PYTHON, NULL)); /* Python 3.2 now looks for '2.57/python/include/python3.2d/pyconfig.h' to parse * from the 'sysconfig' module which is used by 'site', so for now disable site. diff --git a/source/blender/python/intern/bpy_library.c b/source/blender/python/intern/bpy_library.c index 49d5eaea9be..10e97573447 100644 --- a/source/blender/python/intern/bpy_library.c +++ b/source/blender/python/intern/bpy_library.c @@ -340,7 +340,7 @@ static PyObject *bpy_lib_exit(BPy_Library *self, PyObject *UNUSED(args)) // printf(" %s\n", item_str); if(item_str) { - ID *id= BLO_library_append_named_part(NULL, mainl, &(self->blo_handle), item_str, code, self->flag); + ID *id= BLO_library_append_named_part(mainl, &(self->blo_handle), item_str, code); if(id) { #ifdef USE_RNA_DATABLOCKS PointerRNA id_ptr; diff --git a/source/blender/python/intern/bpy_props.c b/source/blender/python/intern/bpy_props.c index b0159154490..0ee9d7e5bd5 100644 --- a/source/blender/python/intern/bpy_props.c +++ b/source/blender/python/intern/bpy_props.c @@ -47,6 +47,8 @@ #include "../generic/py_capi_utils.h" +extern BPy_StructRNA *bpy_context_module; + static EnumPropertyItem property_flag_items[]= { {PROP_HIDDEN, "HIDDEN", 0, "Hidden", ""}, {PROP_ANIMATABLE, "ANIMATABLE", 0, "Animateable", ""}, @@ -741,6 +743,95 @@ static EnumPropertyItem *enum_items_from_py(PyObject *seq_fast, PyObject *def, i return items; } +static EnumPropertyItem *bpy_props_enum_itemf(struct bContext *C, PointerRNA *ptr, PropertyRNA *prop, int *free) +{ + PyGILState_STATE gilstate; + + PyObject *py_func= RNA_property_enum_py_data_get(prop); + PyObject *self= NULL; + PyObject *args; + PyObject *items; /* returned from the function call */ + + EnumPropertyItem *eitems= NULL; + int err= 0; + + bpy_context_set(C, &gilstate); + + args= PyTuple_New(2); + + /* first get self */ + /* operators can store their own instance for later use */ + if(ptr->data) { + void **instance = RNA_struct_instance(ptr); + + if(instance) { + if(*instance) { + self= *instance; + Py_INCREF(self); + } + } + } + if(self == NULL) { + self= pyrna_struct_CreatePyObject(ptr); + } + + PyTuple_SET_ITEM(args, 0, self); + + /* now get the context */ + PyTuple_SET_ITEM(args, 1, (PyObject *)bpy_context_module); + Py_INCREF(bpy_context_module); + + items= PyObject_CallObject(py_func, args); + + Py_DECREF(args); + + if(items==NULL) { + err= -1; + } + else { + PyObject *items_fast; + int defvalue_dummy=0; + + if(!(items_fast= PySequence_Fast(items, "EnumProperty(...): return value from the callback was not a sequence"))) { + err= -1; + } + else { + eitems= enum_items_from_py(items_fast, NULL, &defvalue_dummy, (RNA_property_flag(prop) & PROP_ENUM_FLAG)!=0); + + Py_DECREF(items_fast); + + if(!eitems) { + err= -1; + } + } + + Py_DECREF(items); + } + + if(err != -1) { /* worked */ + *free= 1; + } + else { + /* since we return to C code we can't leave the error */ + PyCodeObject *f_code= (PyCodeObject *)PyFunction_GET_CODE(py_func); + PyErr_Print(); + PyErr_Clear(); + + /* use py style error */ + fprintf(stderr, "File \"%s\", line %d, in %s\n", + _PyUnicode_AsString(f_code->co_filename), + f_code->co_firstlineno, + _PyUnicode_AsString(((PyFunctionObject *)py_func)->func_name) + ); + + eitems= DummyRNA_NULL_items; + } + + + bpy_context_clear(C, &gilstate); + return eitems; +} + PyDoc_STRVAR(BPy_EnumProperty_doc, ".. function:: EnumProperty(items, name=\"\", description=\"\", default=\"\", options={'ANIMATABLE'})\n" "\n" @@ -748,12 +839,19 @@ PyDoc_STRVAR(BPy_EnumProperty_doc, "\n" BPY_PROPDEF_NAME_DOC BPY_PROPDEF_DESC_DOC -" :arg default: The default value for this enum, A string when *ENUM_FLAG* is disabled otherwise a set which may only contain string identifiers used in *items*.\n" +" :arg default: The default value for this enum, A string when *ENUM_FLAG*\n" +" is disabled otherwise a set which may only contain string identifiers\n" +" used in *items*.\n" " :type default: string or set\n" " :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE', 'ENUM_FLAG'].\n" " :type options: set\n" -" :arg items: sequence of enum items formatted: [(identifier, name, description), ...] where the identifier is used for python access and other values are used for the interface.\n" -" :type items: sequence of string triplets\n" +" :arg items: sequence of enum items formatted:\n" +" [(identifier, name, description), ...] where the identifier is used\n" +" for python access and other values are used for the interface.\n" +" For dynamic values a callback can be passed which returns a list in\n" +" the same format as the static list.\n" +" This function must take 2 arguments (self, context)\n" +" :type items: sequence of string triplets or a function\n" ); static PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw) { @@ -772,6 +870,7 @@ static PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw) PropertyRNA *prop; PyObject *pyopts= NULL; int opts=0; + short is_itemf= FALSE; if (!PyArg_ParseTupleAndKeywords(args, kw, "s#O|ssOO!:EnumProperty", @@ -784,26 +883,58 @@ static PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw) BPY_PROPDEF_CHECK(EnumProperty, property_flag_enum_items) - if(!(items_fast= PySequence_Fast(items, "EnumProperty(...): expected a sequence of tuples for the enum items"))) { - return NULL; + /* items can be a list or a callable */ + if(PyFunction_Check(items)) { /* dont use PyCallable_Check because we need the function code for errors */ + PyCodeObject *f_code= (PyCodeObject *)PyFunction_GET_CODE(items); + if(f_code->co_argcount != 2) { + PyErr_Format(PyExc_ValueError, + "EnumProperty(...): expected 'items' function to take 2 arguments, not %d", + f_code->co_argcount); + return NULL; + } + + if(def) { + /* note, using type error here is odd but python does this for invalid arguments */ + PyErr_SetString(PyExc_TypeError, + "EnumProperty(...): 'default' can't be set when 'items' is a function"); + return NULL; + } + + is_itemf= TRUE; + eitems= DummyRNA_NULL_items; } + else { + if(!(items_fast= PySequence_Fast(items, "EnumProperty(...): expected a sequence of tuples for the enum items or a function"))) { + return NULL; + } - eitems= enum_items_from_py(items_fast, def, &defvalue, (opts & PROP_ENUM_FLAG)!=0); + eitems= enum_items_from_py(items_fast, def, &defvalue, (opts & PROP_ENUM_FLAG)!=0); - Py_DECREF(items_fast); + Py_DECREF(items_fast); - if(!eitems) - return NULL; + if(!eitems) { + return NULL; + } + } if(opts & PROP_ENUM_FLAG) prop= RNA_def_enum_flag(srna, id, eitems, defvalue, name, description); else prop= RNA_def_enum(srna, id, eitems, defvalue, name, description); + if(is_itemf) { + RNA_def_enum_funcs(prop, bpy_props_enum_itemf); + RNA_def_enum_py_data(prop, (void *)items); + /* Py_INCREF(items); */ /* watch out!, if user is tricky they can probably crash blender if they manage to free the callback, take care! */ + } + if(pyopts) { if(opts & PROP_HIDDEN) RNA_def_property_flag(prop, PROP_HIDDEN); if((opts & PROP_ANIMATABLE)==0) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); } RNA_def_property_duplicate_pointers(srna, prop); - MEM_freeN(eitems); + + if(is_itemf == FALSE) { + MEM_freeN(eitems); + } } Py_RETURN_NONE; } diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index 90a83a794f1..c4b6e0dfb76 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -2530,12 +2530,14 @@ static PyMappingMethods pyrna_struct_as_mapping= { PyDoc_STRVAR(pyrna_struct_keys_doc, ".. method:: keys()\n" "\n" -" Returns the keys of this objects custom properties (matches pythons dictionary function of the same name).\n" +" Returns the keys of this objects custom properties (matches pythons\n" +" dictionary function of the same name).\n" "\n" " :return: custom property keys.\n" " :rtype: list of strings\n" "\n" -" .. note:: Only :class:`ID`, :class:`Bone` and :class:`PoseBone` classes support custom properties.\n" +" .. note:: Only :class:`ID`, :class:`Bone` and :class:`PoseBone` classes\n" +" support custom properties.\n" ); static PyObject *pyrna_struct_keys(BPy_PropertyRNA *self) { @@ -2557,12 +2559,14 @@ static PyObject *pyrna_struct_keys(BPy_PropertyRNA *self) PyDoc_STRVAR(pyrna_struct_items_doc, ".. method:: items()\n" "\n" -" Returns the items of this objects custom properties (matches pythons dictionary function of the same name).\n" +" Returns the items of this objects custom properties (matches pythons\n" +" dictionary function of the same name).\n" "\n" " :return: custom property key, value pairs.\n" " :rtype: list of key, value tuples\n" "\n" -" .. note:: Only :class:`ID`, :class:`Bone` and :class:`PoseBone` classes support custom properties.\n" +" .. note:: Only :class:`ID`, :class:`Bone` and :class:`PoseBone`\n" +" classes support custom properties.\n" ); static PyObject *pyrna_struct_items(BPy_PropertyRNA *self) { @@ -2584,12 +2588,14 @@ static PyObject *pyrna_struct_items(BPy_PropertyRNA *self) PyDoc_STRVAR(pyrna_struct_values_doc, ".. method:: values()\n" "\n" -" Returns the values of this objects custom properties (matches pythons dictionary function of the same name).\n" +" Returns the values of this objects custom properties (matches pythons\n" +" dictionary function of the same name).\n" "\n" " :return: custom property values.\n" " :rtype: list\n" "\n" -" .. note:: Only :class:`ID`, :class:`Bone` and :class:`PoseBone` classes support custom properties.\n" +" .. note:: Only :class:`ID`, :class:`Bone` and :class:`PoseBone`\n" +" classes support custom properties.\n" ); static PyObject *pyrna_struct_values(BPy_PropertyRNA *self) { @@ -2688,7 +2694,8 @@ PyDoc_STRVAR(pyrna_struct_path_resolve_doc, "\n" " :arg path: path which this property resolves.\n" " :type path: string\n" -" :arg coerce: optional argument, when True, the property will be converted into its python representation.\n" +" :arg coerce: optional argument, when True, the property will be converted\n" +" into its python representation.\n" " :type coerce: boolean\n" ); static PyObject *pyrna_struct_path_resolve(BPy_StructRNA *self, PyObject *args) @@ -2743,9 +2750,11 @@ PyDoc_STRVAR(pyrna_struct_path_from_id_doc, "\n" " Returns the data path from the ID to this object (string).\n" "\n" -" :arg property: Optional property name which can be used if the path is to a property of this object.\n" +" :arg property: Optional property name which can be used if the path is\n" +" to a property of this object.\n" " :type property: string\n" -" :return: The path from :class:`bpy_struct.id_data` to this struct and property (when given).\n" +" :return: The path from :class:`bpy_struct.id_data`\n" +" to this struct and property (when given).\n" " :rtype: str\n" ); static PyObject *pyrna_struct_path_from_id(BPy_StructRNA *self, PyObject *args) @@ -2827,7 +2836,8 @@ static PyObject *pyrna_prop_path_from_id(BPy_PropertyRNA *self) PyDoc_STRVAR(pyrna_struct_type_recast_doc, ".. method:: type_recast()\n" "\n" -" Return a new instance, this is needed because types such as textures can be changed at runtime.\n" +" Return a new instance, this is needed because types\n" +" such as textures can be changed at runtime.\n" "\n" " :return: a new instance of this object with the type initialized again.\n" " :rtype: subclass of :class:`bpy_struct`\n" @@ -3437,7 +3447,8 @@ static PyGetSetDef pyrna_struct_getseters[]= { PyDoc_STRVAR(pyrna_prop_collection_keys_doc, ".. method:: keys()\n" "\n" -" Return the identifiers of collection members (matching pythons dict.keys() functionality).\n" +" Return the identifiers of collection members\n" +" (matching pythons dict.keys() functionality).\n" "\n" " :return: the identifiers for each member of this collection.\n" " :rtype: list of stings\n" @@ -3470,7 +3481,8 @@ static PyObject *pyrna_prop_collection_keys(BPy_PropertyRNA *self) PyDoc_STRVAR(pyrna_prop_collection_items_doc, ".. method:: items()\n" "\n" -" Return the identifiers of collection members (matching pythons dict.items() functionality).\n" +" Return the identifiers of collection members\n" +" (matching pythons dict.items() functionality).\n" "\n" " :return: (key, value) pairs for each member of this collection.\n" " :rtype: list of tuples\n" @@ -3511,7 +3523,8 @@ static PyObject *pyrna_prop_collection_items(BPy_PropertyRNA *self) PyDoc_STRVAR(pyrna_prop_collection_values_doc, ".. method:: values()\n" "\n" -" Return the values of collection (matching pythons dict.values() functionality).\n" +" Return the values of collection\n" +" (matching pythons dict.values() functionality).\n" "\n" " :return: the members of this collection.\n" " :rtype: list\n" @@ -3525,14 +3538,17 @@ static PyObject *pyrna_prop_collection_values(BPy_PropertyRNA *self) PyDoc_STRVAR(pyrna_struct_get_doc, ".. method:: get(key, default=None)\n" "\n" -" Returns the value of the custom property assigned to key or default when not found (matches pythons dictionary function of the same name).\n" +" Returns the value of the custom property assigned to key or default\n" +" when not found (matches pythons dictionary function of the same name).\n" "\n" " :arg key: The key assosiated with the custom property.\n" " :type key: string\n" -" :arg default: Optional argument for the value to return if *key* is not found.\n" +" :arg default: Optional argument for the value to return if\n" +" *key* is not found.\n" " :type default: Undefined\n" "\n" -" .. note:: Only :class:`ID`, :class:`Bone` and :class:`PoseBone` classes support custom properties.\n" +" .. note:: Only :class:`ID`, :class:`Bone` and :class:`PoseBone`\n" +" classes support custom properties.\n" ); static PyObject *pyrna_struct_get(BPy_StructRNA *self, PyObject *args) { @@ -3571,7 +3587,8 @@ PyDoc_STRVAR(pyrna_struct_as_pointer_doc, " :return: int (memory address).\n" " :rtype: int\n" "\n" -" .. note:: This is intended only for advanced script writers who need to pass blender data to their own C/Python modules.\n" +" .. note:: This is intended only for advanced script writers who need to\n" +" pass blender data to their own C/Python modules.\n" ); static PyObject *pyrna_struct_as_pointer(BPy_StructRNA *self) { @@ -3581,11 +3598,13 @@ static PyObject *pyrna_struct_as_pointer(BPy_StructRNA *self) PyDoc_STRVAR(pyrna_prop_collection_get_doc, ".. method:: get(key, default=None)\n" "\n" -" Returns the value of the item assigned to key or default when not found (matches pythons dictionary function of the same name).\n" +" Returns the value of the item assigned to key or default when not found\n" +" (matches pythons dictionary function of the same name).\n" "\n" " :arg key: The identifier for the collection member.\n" " :type key: string\n" -" :arg default: Optional argument for the value to return if *key* is not found.\n" +" :arg default: Optional argument for the value to return if\n" +" *key* is not found.\n" " :type default: Undefined\n" ); static PyObject *pyrna_prop_collection_get(BPy_PropertyRNA *self, PyObject *args) @@ -6362,11 +6381,15 @@ void pyrna_free_types(void) PyDoc_STRVAR(pyrna_register_class_doc, ".. method:: register_class(cls)\n" "\n" -" Register a subclass of a blender type in (:class:`Panel`, :class:`Menu`, :class:`Header`, :class:`Operator`, :class:`KeyingSetInfo`, :class:`RenderEngine`).\n" +" Register a subclass of a blender type in (:class:`Panel`,\n" +" :class:`Menu`, :class:`Header`, :class:`Operator`,\n" +" :class:`KeyingSetInfo`, :class:`RenderEngine`).\n" "\n" -" If the class has a *register* class method it will be called before registration.\n" +" If the class has a *register* class method it will be called\n" +" before registration.\n" "\n" -" .. note:: :exc:`ValueError` exception is raised if the class is not a subclass of a registerable blender class.\n" +" .. note:: :exc:`ValueError` exception is raised if the class is not a\n" +" subclass of a registerable blender class.\n" "\n" ); PyMethodDef meth_bpy_register_class= {"register_class", pyrna_register_class, METH_O, pyrna_register_class_doc}; @@ -6492,7 +6515,8 @@ PyDoc_STRVAR(pyrna_unregister_class_doc, "\n" " Unload the python class from blender.\n" "\n" -" If the class has an *unregister* class method it will be called before unregistering.\n" +" If the class has an *unregister* class method it will be called\n" +" before unregistering.\n" ); PyMethodDef meth_bpy_unregister_class= {"unregister_class", pyrna_unregister_class, METH_O, pyrna_unregister_class_doc}; static PyObject *pyrna_unregister_class(PyObject *UNUSED(self), PyObject *py_class) diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index ea77fca4712..1f005ba6021 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -544,7 +544,7 @@ void WM_read_history(void) struct RecentFile *recent; char *line; int num; - char *cfgdir = BLI_get_folder(BLENDER_CONFIG, NULL); + char *cfgdir = BLI_get_folder(BLENDER_USER_CONFIG, NULL); if (!cfgdir) return; diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index a8d2368f157..e03d32ee7c8 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -56,6 +56,7 @@ #include "BLI_blenlib.h" #include "BLI_dynstr.h" /*for WM_operator_pystring */ #include "BLI_math.h" +#include "BLI_string.h" #include "BLI_utildefines.h" #include "BLO_readfile.h" @@ -441,10 +442,12 @@ void WM_operator_py_idname(char *to, const char *from) { char *sep= strstr(from, "_OT_"); if(sep) { - int i, ofs= (sep-from); - - for(i=0; i<ofs; i++) - to[i]= tolower(from[i]); + int ofs= (sep-from); + + /* note, we use ascii tolower instead of system tolower, because the + latter depends on the locale, and can lead to idname mistmatch */ + memcpy(to, from, sizeof(char)*ofs); + BLI_ascii_strtolower(to, ofs); to[ofs] = '.'; BLI_strncpy(to+(ofs+1), sep+4, OP_MAX_TYPENAME); @@ -462,10 +465,10 @@ void WM_operator_bl_idname(char *to, const char *from) char *sep= strchr(from, '.'); if(sep) { - int i, ofs= (sep-from); + int ofs= (sep-from); - for(i=0; i<ofs; i++) - to[i]= toupper(from[i]); + memcpy(to, from, sizeof(char)*ofs); + BLI_ascii_strtoupper(to, ofs); BLI_strncpy(to+ofs, "_OT_", OP_MAX_TYPENAME); BLI_strncpy(to+(ofs+4), sep+1, OP_MAX_TYPENAME); @@ -1639,12 +1642,12 @@ static int wm_link_append_exec(bContext *C, wmOperator *op) /* here appending/linking starts */ mainl = BLO_library_append_begin(C, &bh, libname); if(totfiles == 0) { - BLO_library_append_named_part(C, mainl, &bh, name, idcode, flag); + BLO_library_append_named_part_ex(C, mainl, &bh, name, idcode, flag); } else { RNA_BEGIN(op->ptr, itemptr, "files") { RNA_string_get(&itemptr, "name", name); - BLO_library_append_named_part(C, mainl, &bh, name, idcode, flag); + BLO_library_append_named_part_ex(C, mainl, &bh, name, idcode, flag); } RNA_END; } @@ -3988,38 +3991,38 @@ static EnumPropertyItem *rna_id_itemf(bContext *UNUSED(C), PointerRNA *UNUSED(pt } /* can add more as needed */ -EnumPropertyItem *RNA_action_itemf(bContext *C, PointerRNA *ptr, int *do_free) +EnumPropertyItem *RNA_action_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *do_free) { return rna_id_itemf(C, ptr, do_free, C ? (ID *)CTX_data_main(C)->action.first : NULL, FALSE); } -EnumPropertyItem *RNA_action_local_itemf(bContext *C, PointerRNA *ptr, int *do_free) +EnumPropertyItem *RNA_action_local_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *do_free) { return rna_id_itemf(C, ptr, do_free, C ? (ID *)CTX_data_main(C)->action.first : NULL, TRUE); } -EnumPropertyItem *RNA_group_itemf(bContext *C, PointerRNA *ptr, int *do_free) +EnumPropertyItem *RNA_group_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *do_free) { return rna_id_itemf(C, ptr, do_free, C ? (ID *)CTX_data_main(C)->group.first : NULL, FALSE); } -EnumPropertyItem *RNA_group_local_itemf(bContext *C, PointerRNA *ptr, int *do_free) +EnumPropertyItem *RNA_group_local_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *do_free) { return rna_id_itemf(C, ptr, do_free, C ? (ID *)CTX_data_main(C)->group.first : NULL, TRUE); } -EnumPropertyItem *RNA_image_itemf(bContext *C, PointerRNA *ptr, int *do_free) +EnumPropertyItem *RNA_image_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *do_free) { return rna_id_itemf(C, ptr, do_free, C ? (ID *)CTX_data_main(C)->image.first : NULL, FALSE); } -EnumPropertyItem *RNA_image_local_itemf(bContext *C, PointerRNA *ptr, int *do_free) +EnumPropertyItem *RNA_image_local_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *do_free) { return rna_id_itemf(C, ptr, do_free, C ? (ID *)CTX_data_main(C)->image.first : NULL, TRUE); } -EnumPropertyItem *RNA_scene_itemf(bContext *C, PointerRNA *ptr, int *do_free) +EnumPropertyItem *RNA_scene_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *do_free) { return rna_id_itemf(C, ptr, do_free, C ? (ID *)CTX_data_main(C)->scene.first : NULL, FALSE); } -EnumPropertyItem *RNA_scene_local_itemf(bContext *C, PointerRNA *ptr, int *do_free) +EnumPropertyItem *RNA_scene_local_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *do_free) { return rna_id_itemf(C, ptr, do_free, C ? (ID *)CTX_data_main(C)->scene.first : NULL, TRUE); } |