diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2011-02-20 02:51:18 +0300 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2011-02-20 02:51:18 +0300 |
commit | 70aa63306ad3ec1402275ed623b745d06d14db18 (patch) | |
tree | 08cea0cd3818061afc4f3a3b7b922ac668ca80ae /source | |
parent | 3789c398ff2b2fd7f0eadba45686b0e235186f4a (diff) | |
parent | 43d362fcc8592cede760a56cf863a0c3eb80ff5f (diff) |
Merged changes in the trunk up to revision 34996.
Conflicts resolved:
C:\bf-blender\soc-2008-mxcurioni\doc\python_api\sphinx_doc_gen.py
C:\bf-blender\soc-2008-mxcurioni\source\blender\makesrna\RNA_types.h
C:\bf-blender\soc-2008-mxcurioni\source\blender\render\SConscript
Diffstat (limited to 'source')
509 files changed, 5428 insertions, 3256 deletions
diff --git a/source/blender/blenfont/BLF_api.h b/source/blender/blenfont/BLF_api.h index b696c64023d..d26c5166ddc 100644 --- a/source/blender/blenfont/BLF_api.h +++ b/source/blender/blenfont/BLF_api.h @@ -177,6 +177,8 @@ void BLF_lang_set(const char *); /* Set the current encoding name. */ void BLF_lang_encoding_name(const char *str); +void BLF_lang_encoding(const char *str); + /* Add a path to the font dir paths. */ void BLF_dir_add(const char *path); diff --git a/source/blender/blenfont/intern/blf.c b/source/blender/blenfont/intern/blf.c index 462ecebc10a..a989b1a1e9a 100644 --- a/source/blender/blenfont/intern/blf.c +++ b/source/blender/blenfont/intern/blf.c @@ -56,15 +56,15 @@ #define BLF_MAX_FONT 16 /* Font array. */ -FontBLF *global_font[BLF_MAX_FONT]; +static FontBLF *global_font[BLF_MAX_FONT]; /* Number of font. */ -int global_font_num= 0; +static int global_font_num= 0; /* Default size and dpi, for BLF_draw_default. */ -int global_font_default= -1; -int global_font_points= 11; -int global_font_dpi= 72; +static int global_font_default= -1; +static int global_font_points= 11; +static int global_font_dpi= 72; // XXX, should these be made into global_font_'s too? int blf_mono_font= -1; diff --git a/source/blender/blenfont/intern/blf_dir.c b/source/blender/blenfont/intern/blf_dir.c index 6bee7b38537..d3b662bdb65 100644 --- a/source/blender/blenfont/intern/blf_dir.c +++ b/source/blender/blenfont/intern/blf_dir.c @@ -44,6 +44,7 @@ #include "BIF_gl.h" +#include "BLF_api.h" #include "blf_internal_types.h" static ListBase global_font_dir= { NULL, NULL }; diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c index ce68df5c8b6..1b739c31f08 100644 --- a/source/blender/blenfont/intern/blf_font.c +++ b/source/blender/blenfont/intern/blf_font.c @@ -52,17 +52,17 @@ #include "blf_internal.h" -/* freetype2 handle. */ -FT_Library global_ft_lib; +/* freetype2 handle ONLY for this file!. */ +static FT_Library ft_lib; int blf_font_init(void) { - return(FT_Init_FreeType(&global_ft_lib)); + return(FT_Init_FreeType(&ft_lib)); } void blf_font_exit(void) { - FT_Done_FreeType(global_ft_lib); + FT_Done_FreeType(ft_lib); } void blf_font_size(FontBLF *font, int size, int dpi) @@ -547,6 +547,7 @@ static void blf_font_fill(FontBLF *font) font->b_col[1]= 0; font->b_col[2]= 0; font->b_col[3]= 0; + font->ft_lib= ft_lib; memset(font->glyph_ascii_table, 0, sizeof(font->glyph_ascii_table)); } @@ -558,7 +559,7 @@ FontBLF *blf_font_new(const char *name, const char *filename) char *mfile; font= (FontBLF *)MEM_mallocN(sizeof(FontBLF), "blf_font_new"); - err= FT_New_Face(global_ft_lib, filename, 0, &font->face); + err= FT_New_Face(ft_lib, filename, 0, &font->face); if (err) { MEM_freeN(font); return(NULL); @@ -600,7 +601,7 @@ FontBLF *blf_font_new_from_mem(const char *name, unsigned char *mem, int mem_siz FT_Error err; font= (FontBLF *)MEM_mallocN(sizeof(FontBLF), "blf_font_new_from_mem"); - err= FT_New_Memory_Face(global_ft_lib, mem, mem_size, 0, &font->face); + err= FT_New_Memory_Face(ft_lib, mem, mem_size, 0, &font->face); if (err) { MEM_freeN(font); return(NULL); diff --git a/source/blender/blenfont/intern/blf_glyph.c b/source/blender/blenfont/intern/blf_glyph.c index 8d13975b83a..c29017c35f3 100644 --- a/source/blender/blenfont/intern/blf_glyph.c +++ b/source/blender/blenfont/intern/blf_glyph.c @@ -51,7 +51,6 @@ #include "blf_internal_types.h" #include "blf_internal.h" -FT_Library global_ft_lib; GlyphCacheBLF *blf_glyph_cache_find(FontBLF *font, int size, int dpi) { @@ -235,9 +234,9 @@ GlyphBLF *blf_glyph_add(FontBLF *font, unsigned int index, unsigned int c) /* Convert result from 1 bit per pixel to 8 bit per pixel */ /* Accum errors for later, fine if not interested beyond "ok vs any error" */ FT_Bitmap_New(&tempbitmap); - err += FT_Bitmap_Convert(global_ft_lib, &slot->bitmap, &tempbitmap, 1); /* Does Blender use Pitch 1 always? It works so far */ - err += FT_Bitmap_Copy(global_ft_lib, &tempbitmap, &slot->bitmap); - err += FT_Bitmap_Done(global_ft_lib, &tempbitmap); + err += FT_Bitmap_Convert(font->ft_lib, &slot->bitmap, &tempbitmap, 1); /* Does Blender use Pitch 1 always? It works so far */ + err += FT_Bitmap_Copy(font->ft_lib, &tempbitmap, &slot->bitmap); + err += FT_Bitmap_Done(font->ft_lib, &tempbitmap); } else { err = FT_Render_Glyph(slot, FT_RENDER_MODE_NORMAL); } diff --git a/source/blender/blenfont/intern/blf_internal_types.h b/source/blender/blenfont/intern/blf_internal_types.h index d7c023fc415..dd6bf3cfa7c 100644 --- a/source/blender/blenfont/intern/blf_internal_types.h +++ b/source/blender/blenfont/intern/blf_internal_types.h @@ -183,6 +183,9 @@ typedef struct FontBLF { /* fast ascii lookip */ GlyphBLF *glyph_ascii_table[256]; + /* freetype2 lib handle. */ + FT_Library ft_lib; + /* freetype2 face. */ FT_Face face; diff --git a/source/blender/blenfont/intern/blf_lang.c b/source/blender/blenfont/intern/blf_lang.c index 610e8750bc1..a9322944ce5 100644 --- a/source/blender/blenfont/intern/blf_lang.c +++ b/source/blender/blenfont/intern/blf_lang.c @@ -99,7 +99,7 @@ void BLF_lang_set(const char *str) BLI_strncpy(global_language, str, sizeof(global_language)); } -static void BLF_lang_encoding(const char *str) +void BLF_lang_encoding(const char *str) { BLI_strncpy(global_encoding_name, str, sizeof(global_encoding_name)); /* bind_textdomain_codeset(DOMAIN_NAME, encoding_name); */ @@ -112,7 +112,7 @@ void BLF_lang_init(void) return; } -static void BLF_lang_encoding(const char *str) +void BLF_lang_encoding(const char *str) { (void)str; return; diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h index 79e9b11d4db..857c88a6004 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.h +++ b/source/blender/blenkernel/BKE_DerivedMesh.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -30,15 +30,17 @@ #ifndef BKE_DERIVEDMESH_H #define BKE_DERIVEDMESH_H -/* TODO (Probably) +/** \file BKE_DerivedMesh.h + * \ingroup bke * - * o Make drawMapped* functions take a predicate function that + * \todo + * - Make drawMapped* functions take a predicate function that * determines whether to draw the edge (this predicate can * also set color, etc). This will be slightly more general * and allow some of the functions to be collapsed. - * o Once accessor functions are added then single element draw + * - Once accessor functions are added then single element draw * functions can be implemented using primitive accessors. - * o Add function to dispatch to renderer instead of using + * - Add function to dispatch to renderer instead of using * conversion to DLM. */ @@ -533,7 +535,7 @@ typedef struct DMVertexAttribs { } mcol[MAX_MCOL]; struct { - float (*array)[3]; + float (*array)[4]; int emOffset, glIndex; } tang; diff --git a/source/blender/blenkernel/BKE_action.h b/source/blender/blenkernel/BKE_action.h index 1c75387ba5d..59da97d8b09 100644 --- a/source/blender/blenkernel/BKE_action.h +++ b/source/blender/blenkernel/BKE_action.h @@ -1,9 +1,4 @@ -/* BKE_action.h May 2001 - * - * Blender kernel action and pose functionality - * - * Reevan McKay - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -33,6 +28,14 @@ #ifndef BKE_ACTION_H #define BKE_ACTION_H +/** \file BKE_action.h + * \ingroup bke + * \brief Blender kernel action and pose functionality. + * \author Reevan McKay + * \author Ton Roosendaal (full recode 2005) + * \author Joshua Leung (full recode 2009) + * \since may 2001 + */ #include "DNA_listBase.h" diff --git a/source/blender/blenkernel/BKE_anim.h b/source/blender/blenkernel/BKE_anim.h index e82eb0ed0c9..25165eeaee7 100644 --- a/source/blender/blenkernel/BKE_anim.h +++ b/source/blender/blenkernel/BKE_anim.h @@ -1,6 +1,4 @@ -/** - * blenlib/BKE_anim.h (mar-2001 nzc); - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,11 @@ #ifndef BKE_ANIM_H #define BKE_ANIM_H +/** \file BKE_anim.h + * \ingroup bke + * \author nzc + * \since March 2001 + */ struct Path; struct Object; struct PartEff; diff --git a/source/blender/blenkernel/BKE_animsys.h b/source/blender/blenkernel/BKE_animsys.h index 500210d2fcd..a469d05ee26 100644 --- a/source/blender/blenkernel/BKE_animsys.h +++ b/source/blender/blenkernel/BKE_animsys.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -28,6 +28,11 @@ #ifndef BKE_ANIM_SYS_H #define BKE_ANIM_SYS_H +/** \file BKE_animsys.h + * \ingroup bke + * \author Joshua Leung + */ + struct ID; struct ListBase; struct Main; diff --git a/source/blender/blenkernel/BKE_armature.h b/source/blender/blenkernel/BKE_armature.h index ed2a06b0f33..efa87532859 100644 --- a/source/blender/blenkernel/BKE_armature.h +++ b/source/blender/blenkernel/BKE_armature.h @@ -1,6 +1,4 @@ -/** - * blenlib/BKE_armature.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,12 @@ #ifndef BKE_ARMATURE_H #define BKE_ARMATURE_H +/** \file BKE_armature.h + * \ingroup bke + * \since March 2001 + * \author nzc + */ + struct Bone; struct Main; struct bArmature; @@ -108,6 +112,7 @@ void armature_mat_pose_to_delta(float delta_mat[][4], float pose_mat[][4], float void pchan_mat3_to_rot(struct bPoseChannel *pchan, float mat[][3], short use_compat); void pchan_apply_mat4(struct bPoseChannel *pchan, float mat[][4], short use_comat); void pchan_to_mat4(struct bPoseChannel *pchan, float chan_mat[4][4]); +void pchan_calc_mat(struct bPoseChannel *pchan); /* Rotation Mode Conversions - Used for PoseChannels + Objects... */ void BKE_rotMode_change_values(float quat[4], float eul[3], float axis[3], float *angle, short oldMode, short newMode); diff --git a/source/blender/blenkernel/BKE_array_mallocn.h b/source/blender/blenkernel/BKE_array_mallocn.h index 8fe32da437c..42c4c2ebdd0 100644 --- a/source/blender/blenkernel/BKE_array_mallocn.h +++ b/source/blender/blenkernel/BKE_array_mallocn.h @@ -30,7 +30,12 @@ #ifndef BKE_ARRAY_MALLOCN_H #define BKE_ARRAY_MALLOCN_H -/*little array macro library. example of usage: +/** \file BKE_array_mallocn.h + * \ingroup bke + * \brief little array macro library. + */ + +/* example of usage: int *arr = NULL; V_DECLARE(arr); diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h index 65e7f848ea0..aa04e20beb6 100644 --- a/source/blender/blenkernel/BKE_blender.h +++ b/source/blender/blenkernel/BKE_blender.h @@ -1,8 +1,4 @@ -/** - * blenlib/BKE_blender.h (mar-2001 nzc) - * - * Blender util stuff? - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -33,6 +29,13 @@ #ifndef BKE_BLENDER_H #define BKE_BLENDER_H +/** \file BKE_blender.h + * \ingroup bke + * \since March 2001 + * \author nzc + * \brief Blender util stuff + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenkernel/BKE_bmesh.h b/source/blender/blenkernel/BKE_bmesh.h index 44ca3842fd9..5c28fa88503 100644 --- a/source/blender/blenkernel/BKE_bmesh.h +++ b/source/blender/blenkernel/BKE_bmesh.h @@ -1,8 +1,4 @@ -/** - * BKE_bmesh.h jan 2007 - * - * BMesh modeler structure and functions. - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -37,6 +33,13 @@ #ifndef BKE_BMESH_H #define BKE_BMESH_H +/** \file BKE_bmesh.h + * \ingroup bke + * \since January 2007 + * \brief BMesh modeler structure and functions. + * + */ + #include "DNA_listBase.h" #include "BLI_utildefines.h" #include "BLI_ghash.h" diff --git a/source/blender/blenkernel/BKE_bmeshCustomData.h b/source/blender/blenkernel/BKE_bmeshCustomData.h index d2b72019b68..aabfcfaa0f6 100644 --- a/source/blender/blenkernel/BKE_bmeshCustomData.h +++ b/source/blender/blenkernel/BKE_bmeshCustomData.h @@ -1,8 +1,4 @@ -/** - * BKE_bmesh.h jan 2007 - * - * BMesh modeler structure and functions. - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -38,6 +34,12 @@ #ifndef BKE_BMESHCUSTOMDATA_H #define BKE_BMESHCUSTOMDATA_H +/** \file BKE_bmeshCustomData.h + * \ingroup bke + * \since January 2007 + * \brief BMesh modeler structure and functions - custom data. + */ + struct BLI_mempool; /*Custom Data Types and defines diff --git a/source/blender/blenkernel/BKE_bmfont.h b/source/blender/blenkernel/BKE_bmfont.h index 6a47dcbd6c4..ef7323fc4c3 100644 --- a/source/blender/blenkernel/BKE_bmfont.h +++ b/source/blender/blenkernel/BKE_bmfont.h @@ -1,8 +1,4 @@ -/** - * blenlib/BKE_bmfont.h (mar-2001 nzc) - * - * - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -33,6 +29,12 @@ #ifndef BKE_BMFONT_H #define BKE_BMFONT_H +/** \file BKE_bmfont.h + * \ingroup bke + * \since March 2001 + * \author nzc + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenkernel/BKE_bmfont_types.h b/source/blender/blenkernel/BKE_bmfont_types.h index 77a618c1be4..658302e9f1d 100644 --- a/source/blender/blenkernel/BKE_bmfont_types.h +++ b/source/blender/blenkernel/BKE_bmfont_types.h @@ -1,8 +1,4 @@ -/** - * blenlib/BKE_bmfont_types.h (mar-2001 nzc) - * - * - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -33,6 +29,11 @@ #ifndef BKE_BMFONT_TYPES_H #define BKE_BMFONT_TYPES_H +/** \file BKE_bmfont_types.h + * \ingroup bke + * \since March 2001 + * \author nzc + */ #define is_power_of_two(N) ((N ^ (N - 1)) == (2 * N - 1)) /* Moved to IMB_imbuf_types.h where it will live close to the ImBuf type. diff --git a/source/blender/blenkernel/BKE_boids.h b/source/blender/blenkernel/BKE_boids.h index ffd803f21a5..36ca0cde87d 100644 --- a/source/blender/blenkernel/BKE_boids.h +++ b/source/blender/blenkernel/BKE_boids.h @@ -1,6 +1,4 @@ -/* BKE_particle.h - * - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -32,6 +30,12 @@ #ifndef BKE_BOIDS_H #define BKE_BOIDS_H +/** \file BKE_boids.h + * \ingroup bke + * \since 2009 + * \author Janne Karhu + */ + #include "DNA_boid_types.h" typedef struct BoidBrainData { diff --git a/source/blender/blenkernel/BKE_booleanops_mesh.h b/source/blender/blenkernel/BKE_booleanops_mesh.h index 7c2d619659a..aecd3385662 100644 --- a/source/blender/blenkernel/BKE_booleanops_mesh.h +++ b/source/blender/blenkernel/BKE_booleanops_mesh.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -29,6 +29,10 @@ #ifndef BKE_PyBooleanOps_h #define BKE_PyBooleanOps_h +/** \file BKE_booleanops_mesh.h + * \ingroup bke + */ + #include "CSG_BooleanOps.h" /** diff --git a/source/blender/blenkernel/BKE_brush.h b/source/blender/blenkernel/BKE_brush.h index deb10ef6d35..a9d379e6c69 100644 --- a/source/blender/blenkernel/BKE_brush.h +++ b/source/blender/blenkernel/BKE_brush.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +31,10 @@ #ifndef BKE_BRUSH_H #define BKE_BRUSH_H +/** \file BKE_brush.h + * \ingroup bke + */ + struct ID; struct Brush; struct ImBuf; @@ -109,5 +113,8 @@ void brush_set_unprojected_radius(struct Brush *brush, float value); float brush_alpha(struct Brush *brush); void brush_set_alpha(struct Brush *brush, float value); +/* debugging only */ +void brush_debug_print_state(struct Brush *br); + #endif diff --git a/source/blender/blenkernel/BKE_bullet.h b/source/blender/blenkernel/BKE_bullet.h index b695bdc91ae..76358c4485b 100644 --- a/source/blender/blenkernel/BKE_bullet.h +++ b/source/blender/blenkernel/BKE_bullet.h @@ -1,4 +1,4 @@ -/** +/* * * $Id$ * @@ -30,6 +30,10 @@ #ifndef BKE_BULLET_H #define BKE_BULLET_H +/** \file BKE_bullet.h + * \ingroup bke + */ + struct BulletSoftBody; diff --git a/source/blender/blenkernel/BKE_bvhutils.h b/source/blender/blenkernel/BKE_bvhutils.h index 975e64929c2..29487713ad4 100644 --- a/source/blender/blenkernel/BKE_bvhutils.h +++ b/source/blender/blenkernel/BKE_bvhutils.h @@ -1,5 +1,4 @@ -/** - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -30,6 +29,10 @@ #ifndef BKE_BVHUTILS_H #define BKE_BVHUTILS_H +/** \file BKE_bvhutils.h + * \ingroup bke + */ + #include "BLI_kdopbvh.h" #include "BLI_linklist.h" diff --git a/source/blender/blenkernel/BKE_cdderivedmesh.h b/source/blender/blenkernel/BKE_cdderivedmesh.h index bff9f16b489..1edec2b69d9 100644 --- a/source/blender/blenkernel/BKE_cdderivedmesh.h +++ b/source/blender/blenkernel/BKE_cdderivedmesh.h @@ -27,9 +27,11 @@ * ***** END GPL LICENSE BLOCK ***** */ -/* CDDerivedMesh interface. - * CDDerivedMesh (CD = Custom Data) is a DerivedMesh backend which stores - * mesh elements (vertices, edges and faces) as layers of custom element data. +/** \file BKE_cdderivedmesh.h + * \ingroup bke + * \section aboutcdderivedmesh CDDerivedMesh interface + * CDDerivedMesh (CD = Custom Data) is a DerivedMesh backend which stores + * mesh elements (vertices, edges and faces) as layers of custom element data. */ #ifndef BKE_CDDERIVEDMESH_H diff --git a/source/blender/blenkernel/BKE_cloth.h b/source/blender/blenkernel/BKE_cloth.h index 83af573bd42..1ee51cd2122 100644 --- a/source/blender/blenkernel/BKE_cloth.h +++ b/source/blender/blenkernel/BKE_cloth.h @@ -1,6 +1,4 @@ -/** - * BKE_cloth.h - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,11 @@ #ifndef BKE_CLOTH_H #define BKE_CLOTH_H +/** \file BKE_cloth.h + * \ingroup bke + * \author Daniel Genrich + */ + #include <float.h> struct Object; diff --git a/source/blender/blenkernel/BKE_collision.h b/source/blender/blenkernel/BKE_collision.h index 03d4800076c..b54d4275719 100644 --- a/source/blender/blenkernel/BKE_collision.h +++ b/source/blender/blenkernel/BKE_collision.h @@ -1,6 +1,4 @@ -/** - * BKE_cloth.h - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,11 @@ #ifndef BKE_COLLISIONS_H #define BKE_COLLISIONS_H +/** \file BKE_collision.h + * \ingroup bke + * \author Daniel Genrich + */ + #include <math.h> #include <float.h> #include <stdlib.h> diff --git a/source/blender/blenkernel/BKE_colortools.h b/source/blender/blenkernel/BKE_colortools.h index e0ebedb320b..b3709853a8c 100644 --- a/source/blender/blenkernel/BKE_colortools.h +++ b/source/blender/blenkernel/BKE_colortools.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -29,6 +29,10 @@ #ifndef BKE_COLORTOOLS_H #define BKE_COLORTOOLS_H +/** \file BKE_colortools.h + * \ingroup bke + */ + struct CurveMapping; struct CurveMap; struct Scopes; diff --git a/source/blender/blenkernel/BKE_constraint.h b/source/blender/blenkernel/BKE_constraint.h index d6e0075df1e..7c0e7050a9f 100644 --- a/source/blender/blenkernel/BKE_constraint.h +++ b/source/blender/blenkernel/BKE_constraint.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -30,6 +30,11 @@ #ifndef BKE_CONSTRAINT_H #define BKE_CONSTRAINT_H +/** \file BKE_constraint.h + * \ingroup bke + * \author Joshua Leung (major recode 2007) + */ + struct ID; struct bConstraint; struct bConstraintTarget; diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h index 3acc08a76b6..7254536b555 100644 --- a/source/blender/blenkernel/BKE_context.h +++ b/source/blender/blenkernel/BKE_context.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -28,6 +28,10 @@ #ifndef BKE_CONTEXT_H #define BKE_CONTEXT_H +/** \file BKE_context.h + * \ingroup bke + */ + #include "DNA_listBase.h" #include "RNA_types.h" diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h index 8c652a11794..f0c58e0a511 100644 --- a/source/blender/blenkernel/BKE_curve.h +++ b/source/blender/blenkernel/BKE_curve.h @@ -1,6 +1,4 @@ -/** - * blenlib/BKE_curve.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,11 @@ #ifndef BKE_CURVE_H #define BKE_CURVE_H +/** \file BKE_curve.h + * \ingroup bke + * \since March 2001 + * \author nzc + */ struct Curve; struct ListBase; struct Object; diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h index e9118323682..c30100ea55a 100644 --- a/source/blender/blenkernel/BKE_customdata.h +++ b/source/blender/blenkernel/BKE_customdata.h @@ -27,7 +27,11 @@ * ***** END GPL LICENSE BLOCK ***** */ -/* CustomData interface, see also DNA_customdata_types.h. */ +/** \file BKE_customdata.h + * \ingroup bke + * \author Ben Batt + * \brief CustomData interface, see also DNA_customdata_types.h. + */ #ifndef BKE_CUSTOMDATA_H #define BKE_CUSTOMDATA_H diff --git a/source/blender/blenkernel/BKE_customdata_file.h b/source/blender/blenkernel/BKE_customdata_file.h index 9bcef7636c6..f97565f23a1 100644 --- a/source/blender/blenkernel/BKE_customdata_file.h +++ b/source/blender/blenkernel/BKE_customdata_file.h @@ -23,6 +23,10 @@ #ifndef BKE_CUSTOMDATA_FILE_H #define BKE_CUSTOMDATA_FILE_H +/** \file BKE_customdata_file.h + * \ingroup bke + */ + #define CDF_TYPE_IMAGE 0 #define CDF_TYPE_MESH 1 diff --git a/source/blender/blenkernel/BKE_deform.h b/source/blender/blenkernel/BKE_deform.h index eaabc57c781..a9ac201beda 100644 --- a/source/blender/blenkernel/BKE_deform.h +++ b/source/blender/blenkernel/BKE_deform.h @@ -1,9 +1,4 @@ -/* BKE_deform.h June 2001 - * - * support for deformation groups and hooks - * - * Reevan McKay et al - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -35,6 +30,13 @@ #ifndef BKE_DEFORM_H #define BKE_DEFORM_H +/** \file BKE_deform.h + * \ingroup bke + * \since June 2001 + * \author Reevan McKay et al + * \brief support for deformation groups and hooks. + */ + struct Object; struct ListBase; struct bDeformGroup; diff --git a/source/blender/blenkernel/BKE_depsgraph.h b/source/blender/blenkernel/BKE_depsgraph.h index 91954131b71..f78a957cbab 100644 --- a/source/blender/blenkernel/BKE_depsgraph.h +++ b/source/blender/blenkernel/BKE_depsgraph.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -28,6 +28,10 @@ #ifndef DEPSGRAPH_API #define DEPSGRAPH_API +/** \file BKE_depsgraph.h + * \ingroup bke + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h index 01d3de1b94f..766981a6fea 100644 --- a/source/blender/blenkernel/BKE_displist.h +++ b/source/blender/blenkernel/BKE_displist.h @@ -1,4 +1,3 @@ -/* display list (or rather multi purpose list) stuff */ /* $Id$ * @@ -32,6 +31,10 @@ #ifndef BKE_DISPLIST_H #define BKE_DISPLIST_H +/** \file BKE_displist.h + * \ingroup bke + * \brief display list (or rather multi purpose list) stuff. + */ #include "DNA_customdata_types.h" #include "BKE_customdata.h" diff --git a/source/blender/blenkernel/BKE_effect.h b/source/blender/blenkernel/BKE_effect.h index 99f55200eac..97ac711651b 100644 --- a/source/blender/blenkernel/BKE_effect.h +++ b/source/blender/blenkernel/BKE_effect.h @@ -1,6 +1,4 @@ -/** - * blenlib/BKE_effect.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,11 @@ #ifndef BKE_EFFECT_H #define BKE_EFFECT_H +/** \file BKE_effect.h + * \ingroup bke + * \since March 2001 + * \author nzc + */ #include "DNA_modifier_types.h" struct Object; diff --git a/source/blender/blenkernel/BKE_endian.h b/source/blender/blenkernel/BKE_endian.h index d61b81fb6ce..5647645e990 100644 --- a/source/blender/blenkernel/BKE_endian.h +++ b/source/blender/blenkernel/BKE_endian.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -26,11 +26,17 @@ * * ***** END GPL LICENSE BLOCK ***** * Are we little or big endian? From Harbison&Steele. - * BKE_ENDIANNESS(a) returns 1 if big endian and returns 0 if little endian */ #ifndef BKE_ENDIAN_H #define BKE_ENDIAN_H +/** \file BKE_endian.h + * \ingroup bke + */ + +/** + * BKE_ENDIANNESS(a) returns 1 if big endian and returns 0 if little endian + */ #define BKE_ENDIANNESS(a) { \ union { \ intptr_t l; \ diff --git a/source/blender/blenkernel/BKE_exotic.h b/source/blender/blenkernel/BKE_exotic.h index ad59cd9c0a8..870dd7cb4d5 100644 --- a/source/blender/blenkernel/BKE_exotic.h +++ b/source/blender/blenkernel/BKE_exotic.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -25,12 +25,16 @@ * Contributor(s): none yet. * * ***** END GPL LICENSE BLOCK ***** - * dxf/vrml/stl external file io function prototypes */ #ifndef BKE_EXOTIC_H #define BKE_EXOTIC_H +/** \file BKE_exotic.h + * \ingroup bke + * \brief dxf/vrml/stl external file io function prototypes. + * \attention is this used still? Candidate for removal? + */ struct Mesh; struct Scene; diff --git a/source/blender/blenkernel/BKE_fcurve.h b/source/blender/blenkernel/BKE_fcurve.h index 5fbb7f37d15..f81acf4b11e 100644 --- a/source/blender/blenkernel/BKE_fcurve.h +++ b/source/blender/blenkernel/BKE_fcurve.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -28,6 +28,12 @@ #ifndef BKE_FCURVE_H #define BKE_FCURVE_H +/** \file BKE_fcurve.h + * \ingroup bke + * \author Joshua Leung + * \since 2009 + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenkernel/BKE_fluidsim.h b/source/blender/blenkernel/BKE_fluidsim.h index e730f4ec34c..f6070cd81f0 100644 --- a/source/blender/blenkernel/BKE_fluidsim.h +++ b/source/blender/blenkernel/BKE_fluidsim.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -30,6 +30,9 @@ #ifndef BKE_FLUIDSIM_H #define BKE_FLUIDSIM_H +/** \file BKE_fluidsim.h + * \ingroup bke + */ struct Object; struct Scene; diff --git a/source/blender/blenkernel/BKE_font.h b/source/blender/blenkernel/BKE_font.h index c47a0b21855..7f4e7c208f6 100644 --- a/source/blender/blenkernel/BKE_font.h +++ b/source/blender/blenkernel/BKE_font.h @@ -1,6 +1,4 @@ -/** - * blenlib/BKE_vfont.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,10 @@ #ifndef BKE_VFONT_H #define BKE_VFONT_H +/** \file BKE_font.h + * \ingroup bke + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenkernel/BKE_global.h b/source/blender/blenkernel/BKE_global.h index d222fe8d296..d83e0e5bc4c 100644 --- a/source/blender/blenkernel/BKE_global.h +++ b/source/blender/blenkernel/BKE_global.h @@ -1,10 +1,4 @@ -/** - * blenlib/BKE_global.h (mar-2001 nzc) - * - * Global settings, handles, pointers. This is the root for finding - * any data in Blender. This block is not serialized, but built anew - * for every fresh Blender run. - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -35,6 +29,15 @@ #ifndef BKE_GLOBAL_H #define BKE_GLOBAL_H +/** \file BKE_global.h + * \ingroup bke + * \since March 2001 + * \author nzc + * \section aboutglobal Global settings + * Global settings, handles, pointers. This is the root for finding + * any data in Blender. This block is not serialized, but built anew + * for every fresh Blender run. + */ #include "DNA_listBase.h" #ifdef __cplusplus diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h index 898538c6820..4898bb28c8d 100644 --- a/source/blender/blenkernel/BKE_gpencil.h +++ b/source/blender/blenkernel/BKE_gpencil.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -28,6 +28,11 @@ #ifndef BKE_GPENCIL_H #define BKE_GPENCIL_H +/** \file BKE_gpencil.h + * \ingroup bke + * \author Joshua Leung + */ + struct ListBase; struct bGPdata; struct bGPDlayer; diff --git a/source/blender/blenkernel/BKE_group.h b/source/blender/blenkernel/BKE_group.h index 767e3c97fef..e497f43e46d 100644 --- a/source/blender/blenkernel/BKE_group.h +++ b/source/blender/blenkernel/BKE_group.h @@ -1,6 +1,4 @@ -/** - * blenlib/BKE_group.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,12 @@ #ifndef BKE_GROUP_H #define BKE_GROUP_H +/** \file BKE_group.h + * \ingroup bke + * \since March 2001 + * \author nzc + */ + struct Base; struct Group; struct GroupObject; diff --git a/source/blender/blenkernel/BKE_icons.h b/source/blender/blenkernel/BKE_icons.h index 42cbd22d9f1..5404402718d 100644 --- a/source/blender/blenkernel/BKE_icons.h +++ b/source/blender/blenkernel/BKE_icons.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +31,10 @@ #ifndef BKE_ICONS_H #define BKE_ICONS_H +/** \file BKE_icons.h + * \ingroup bke + */ + /* Resizable Icons for Blender */ diff --git a/source/blender/blenkernel/BKE_idcode.h b/source/blender/blenkernel/BKE_idcode.h index b624e34e1cb..1b2b3d2ee95 100644 --- a/source/blender/blenkernel/BKE_idcode.h +++ b/source/blender/blenkernel/BKE_idcode.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -30,6 +30,10 @@ #ifndef BKE_ID_INFO_H #define BKE_ID_INFO_H +/** \file BKE_idcode.h + * \ingroup bke + */ + /** * Convert an idcode into a name. * diff --git a/source/blender/blenkernel/BKE_idprop.h b/source/blender/blenkernel/BKE_idprop.h index 0ca5690e635..e71ad5c8a24 100644 --- a/source/blender/blenkernel/BKE_idprop.h +++ b/source/blender/blenkernel/BKE_idprop.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -28,6 +28,11 @@ #ifndef _BKE_IDPROP_H #define _BKE_IDPROP_H +/** \file BKE_idprop.h + * \ingroup bke + * \author Joseph Eagar + */ + #include "DNA_ID.h" struct IDProperty; diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h index 283badc6faa..8f0ce8c1660 100644 --- a/source/blender/blenkernel/BKE_image.h +++ b/source/blender/blenkernel/BKE_image.h @@ -1,6 +1,4 @@ -/** - * blenlib/BKE_image.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,12 @@ #ifndef BKE_IMAGE_H #define BKE_IMAGE_H +/** \file BKE_image.h + * \ingroup bke + * \since March 2001 + * \author nzc + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenkernel/BKE_ipo.h b/source/blender/blenkernel/BKE_ipo.h index e700f263011..ea98c226e67 100644 --- a/source/blender/blenkernel/BKE_ipo.h +++ b/source/blender/blenkernel/BKE_ipo.h @@ -1,6 +1,4 @@ -/** - * blenlib/BKE_ipo.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,13 @@ #ifndef BKE_IPO_H #define BKE_IPO_H +/** \file BKE_ipo.h + * \ingroup bke + * \since March 2001 + * \author nzc + * \author Joshua Leung + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenkernel/BKE_key.h b/source/blender/blenkernel/BKE_key.h index d72dce3bf7c..c29320ef13c 100644 --- a/source/blender/blenkernel/BKE_key.h +++ b/source/blender/blenkernel/BKE_key.h @@ -1,6 +1,4 @@ -/** - * blenlib/BKE_key.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,11 @@ #ifndef BKE_KEY_H #define BKE_KEY_H +/** \file BKE_key.h + * \ingroup bke + * \since March 2001 + * \author nzc + */ struct Key; struct KeyBlock; struct ID; diff --git a/source/blender/blenkernel/BKE_lattice.h b/source/blender/blenkernel/BKE_lattice.h index 4f405e71662..2936338e760 100644 --- a/source/blender/blenkernel/BKE_lattice.h +++ b/source/blender/blenkernel/BKE_lattice.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -25,12 +25,17 @@ * Contributor(s): none yet. * * ***** END GPL LICENSE BLOCK ***** - * june-2001 ton */ #ifndef BKE_LATTICE_H #define BKE_LATTICE_H +/** \file BKE_lattice.h + * \ingroup bke + * \author Ton Roosendaal + * \since June 2001 + */ + struct Lattice; struct Object; struct Scene; diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h index f956749dc9d..871a78bbab3 100644 --- a/source/blender/blenkernel/BKE_library.h +++ b/source/blender/blenkernel/BKE_library.h @@ -1,8 +1,4 @@ -/** - * blenlib/BKE_library.h (mar-2001 nzc) - * - * Library - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -33,6 +29,11 @@ #ifndef BKE_LIBRARY_TYPES_H #define BKE_LIBRARY_TYPES_H +/** \file BKE_library.h + * \ingroup bke + * \since March 2001 + * \author nzc + */ #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenkernel/BKE_main.h b/source/blender/blenkernel/BKE_main.h index fcd61539b23..c60152f4a37 100644 --- a/source/blender/blenkernel/BKE_main.h +++ b/source/blender/blenkernel/BKE_main.h @@ -1,13 +1,4 @@ -/** - * blenlib/BKE_main.h (mar-2001 nzc) - * - * Main is the root of the 'database' of a Blender context. All data - * is stuffed into lists, and all these lists are knotted to here. A - * Blender file is not much more but a binary dump of these - * lists. This list of lists is not serialized itself. - * - * Oops... this should be a _types.h file. - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -38,6 +29,19 @@ #ifndef BKE_MAIN_H #define BKE_MAIN_H +/** \file BKE_main.h + * \ingroup bke + * \since March 2001 + * \author nzc + * \section aboutmain Main struct + * Main is the root of the 'database' of a Blender context. All data + * is stuffed into lists, and all these lists are knotted to here. A + * Blender file is not much more but a binary dump of these + * lists. This list of lists is not serialized itself. + * + * Oops... this should be a _types.h file. + * + */ #include "DNA_listBase.h" #ifdef __cplusplus diff --git a/source/blender/blenkernel/BKE_material.h b/source/blender/blenkernel/BKE_material.h index 16c99cd850f..523a67eff67 100644 --- a/source/blender/blenkernel/BKE_material.h +++ b/source/blender/blenkernel/BKE_material.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -25,12 +25,15 @@ * Contributor(s): none yet. * * ***** END GPL LICENSE BLOCK ***** - * General operations, lookup, etc. for materials. */ #ifndef BKE_MATERIAL_H #define BKE_MATERIAL_H +/** \file BKE_material.h + * \ingroup bke + * \brief General operations, lookup, etc. for materials. + */ #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenkernel/BKE_mball.h b/source/blender/blenkernel/BKE_mball.h index 6f36c26dd3f..c4119e99780 100644 --- a/source/blender/blenkernel/BKE_mball.h +++ b/source/blender/blenkernel/BKE_mball.h @@ -1,6 +1,4 @@ -/** - * blenlib/BKE_mball.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,11 @@ #ifndef BKE_MBALL_H #define BKE_MBALL_H +/** \file BKE_mball.h + * \ingroup bke + * \since March 2001 + * \author nzc + */ struct MetaBall; struct Object; struct Scene; diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h index 02d52e10fa5..0f5780ed5b0 100644 --- a/source/blender/blenkernel/BKE_mesh.h +++ b/source/blender/blenkernel/BKE_mesh.h @@ -1,4 +1,4 @@ -/** +/* * blenlib/BKE_mesh.h (mar-2001 nzc) * * $Id$ @@ -31,6 +31,10 @@ #ifndef BKE_MESH_H #define BKE_MESH_H +/** \file BKE_mesh.h + * \ingroup bke + */ + /***/ struct BoundBox; diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h index 5bef7527c87..af625ae9d9c 100644 --- a/source/blender/blenkernel/BKE_modifier.h +++ b/source/blender/blenkernel/BKE_modifier.h @@ -1,5 +1,4 @@ -/** - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -30,6 +29,10 @@ #ifndef BKE_MODIFIER_H #define BKE_MODIFIER_H +/** \file BKE_modifier.h + * \ingroup bke + */ + #include "DNA_modifier_types.h" /* needed for all enum typdefs */ #include "BKE_customdata.h" diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h index de895ebce51..ea34ff4aa07 100644 --- a/source/blender/blenkernel/BKE_multires.h +++ b/source/blender/blenkernel/BKE_multires.h @@ -30,6 +30,10 @@ #ifndef BKE_MULTIRES_H #define BKE_MULTIRES_H +/** \file BKE_multires.h + * \ingroup bke + */ + struct DerivedMesh; struct Mesh; struct MFace; diff --git a/source/blender/blenkernel/BKE_nla.h b/source/blender/blenkernel/BKE_nla.h index 30bce613dbe..0206756a1ad 100644 --- a/source/blender/blenkernel/BKE_nla.h +++ b/source/blender/blenkernel/BKE_nla.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -30,6 +30,11 @@ #ifndef BKE_NLA_H #define BKE_NLA_H +/** \file BKE_nla.h + * \ingroup bke + * \author Joshua Leung (full recode) + */ + struct AnimData; struct NlaStrip; struct NlaTrack; diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 57d18f58e2d..0896dfbabb1 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -33,6 +33,10 @@ #ifndef BKE_NODE_H #define BKE_NODE_H +/** \file BKE_node.h + * \ingroup bke + */ + /* not very important, but the stack solver likes to know a maximum */ #define MAX_SOCKET 64 diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index 100b5111717..3d32ba5a30a 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -25,12 +25,15 @@ * Contributor(s): none yet. * * ***** END GPL LICENSE BLOCK ***** - * General operations, lookup, etc. for blender objects. */ #ifndef BKE_OBJECT_H #define BKE_OBJECT_H +/** \file BKE_object.h + * \ingroup bke + * \brief General operations, lookup, etc. for blender objects. + */ #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenkernel/BKE_packedFile.h b/source/blender/blenkernel/BKE_packedFile.h index c3ab392fd85..541c581e762 100644 --- a/source/blender/blenkernel/BKE_packedFile.h +++ b/source/blender/blenkernel/BKE_packedFile.h @@ -1,6 +1,4 @@ -/** - * blenlib/BKE_packedFile.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,11 @@ #ifndef BKE_PACKEDFILE_H #define BKE_PACKEDFILE_H +/** \file BKE_packedFile.h + * \ingroup bke + * \since March 2001 + * \author nzc + */ #define RET_OK 0 #define RET_ERROR 1 diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h index 2203277b301..238c812906d 100644 --- a/source/blender/blenkernel/BKE_paint.h +++ b/source/blender/blenkernel/BKE_paint.h @@ -28,6 +28,10 @@ #ifndef BKE_PAINT_H #define BKE_PAINT_H +/** \file BKE_paint.h + * \ingroup bke + */ + #include "DNA_vec_types.h" struct Brush; diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h index bb325420bbe..507adcc5f2d 100644 --- a/source/blender/blenkernel/BKE_particle.h +++ b/source/blender/blenkernel/BKE_particle.h @@ -1,6 +1,4 @@ -/* BKE_particle.h - * - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -32,6 +30,10 @@ #ifndef BKE_PARTICLE_H #define BKE_PARTICLE_H +/** \file BKE_particle.h + * \ingroup bke + */ + #include "DNA_particle_types.h" #include "DNA_object_types.h" diff --git a/source/blender/blenkernel/BKE_plugin_types.h b/source/blender/blenkernel/BKE_plugin_types.h index 0bb1400858d..a7842b526ce 100644 --- a/source/blender/blenkernel/BKE_plugin_types.h +++ b/source/blender/blenkernel/BKE_plugin_types.h @@ -1,9 +1,4 @@ -/** - * blenlib/BKE_plugin_types.h (mar-2001 nzc) - * - * Renderrecipe and scene decription. The fact that there is a - * hierarchy here is a bit strange, and not desirable. - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -34,6 +29,11 @@ #ifndef BKE_PLUGIN_TYPES_H #define BKE_PLUGIN_TYPES_H +/** \file BKE_plugin_types.h + * \ingroup bke + * \author nzc + */ + struct ImBuf; typedef int (*TexDoitold)(int stype, void *cast, float *texvec, float *dxt, float *dyt); diff --git a/source/blender/blenkernel/BKE_pointcache.h b/source/blender/blenkernel/BKE_pointcache.h index e4623a31807..346368a5958 100644 --- a/source/blender/blenkernel/BKE_pointcache.h +++ b/source/blender/blenkernel/BKE_pointcache.h @@ -29,6 +29,10 @@ #ifndef BKE_POINTCACHE_H #define BKE_POINTCACHE_H +/** \file BKE_pointcache.h + * \ingroup bke + */ + #include "DNA_ID.h" #include "DNA_object_force.h" #include "DNA_boid_types.h" diff --git a/source/blender/blenkernel/BKE_property.h b/source/blender/blenkernel/BKE_property.h index 5fab97b35e5..10014a4611d 100644 --- a/source/blender/blenkernel/BKE_property.h +++ b/source/blender/blenkernel/BKE_property.h @@ -1,6 +1,4 @@ -/** - * blenkernel/BKE_property.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,10 @@ #ifndef BKE_PROPERTY_H #define BKE_PROPERTY_H +/** \file BKE_property.h + * \ingroup bke + */ + struct bProperty; struct ListBase; struct Object; diff --git a/source/blender/blenkernel/BKE_report.h b/source/blender/blenkernel/BKE_report.h index b84808a7ddd..397c96422a5 100644 --- a/source/blender/blenkernel/BKE_report.h +++ b/source/blender/blenkernel/BKE_report.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -28,6 +28,10 @@ #ifndef BKE_REPORT_H #define BKE_REPORT_H +/** \file BKE_report.h + * \ingroup bke + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenkernel/BKE_sca.h b/source/blender/blenkernel/BKE_sca.h index a9238dadb27..0db0b71c102 100644 --- a/source/blender/blenkernel/BKE_sca.h +++ b/source/blender/blenkernel/BKE_sca.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -29,6 +29,10 @@ #ifndef BKE_SCA_H #define BKE_SCA_H +/** \file BKE_sca.h + * \ingroup bke + */ + struct Text; struct bSensor; struct Object; diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h index 2337b95dcbc..ac85f91bf46 100644 --- a/source/blender/blenkernel/BKE_scene.h +++ b/source/blender/blenkernel/BKE_scene.h @@ -1,6 +1,4 @@ -/** - * blenlib/BKE_scene.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,12 @@ #ifndef BKE_SCENE_H #define BKE_SCENE_H +/** \file BKE_scene.h + * \ingroup bke + * \since March 2001 + * \author nzc + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h index 125486625bb..0a7d9780a6b 100644 --- a/source/blender/blenkernel/BKE_screen.h +++ b/source/blender/blenkernel/BKE_screen.h @@ -1,6 +1,4 @@ -/** - * blenlib/BKE_screen.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,12 @@ #ifndef BKE_SCREEN_H #define BKE_SCREEN_H +/** \file BKE_screen.h + * \ingroup bke + * \since March 2001 + * \author nzc + */ + struct ARegion; struct bContext; struct bContextDataResult; diff --git a/source/blender/blenkernel/BKE_script.h b/source/blender/blenkernel/BKE_script.h index 4ea1ee6db85..304e46fe2c5 100644 --- a/source/blender/blenkernel/BKE_script.h +++ b/source/blender/blenkernel/BKE_script.h @@ -1,6 +1,4 @@ -/** - * blenlib/BKE_script.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,13 @@ #ifndef BKE_SCRIPT_H #define BKE_SCRIPT_H +/** \file BKE_script.h + * \ingroup bke + * \since March 2001 + * \author nzc + * \author Willian P. Germano + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h index eb19fce94e5..cc1d8537cbd 100644 --- a/source/blender/blenkernel/BKE_sequencer.h +++ b/source/blender/blenkernel/BKE_sequencer.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +31,10 @@ #ifndef BKE_SEQUENCER_H #define BKE_SEQUENCER_H +/** \file BKE_sequencer.h + * \ingroup bke + */ + struct bContext; struct Editing; struct ImBuf; @@ -254,6 +258,7 @@ int seq_single_check(struct Sequence *seq); void seq_single_fix(struct Sequence *seq); int seq_test_overlap(struct ListBase * seqbasep, struct Sequence *test); void seq_translate(struct Scene *scene, struct Sequence *seq, int delta); +struct Sequence *seq_foreground_frame_get(struct Scene *scene, int frame); struct ListBase *seq_seqbase(struct ListBase *seqbase, struct Sequence *seq); void seq_offset_animdata(struct Scene *scene, struct Sequence *seq, int ofs); void seq_dupe_animdata(struct Scene *scene, char *name_from, char *name_to); diff --git a/source/blender/blenkernel/BKE_shrinkwrap.h b/source/blender/blenkernel/BKE_shrinkwrap.h index 6b8e7860db8..937a46d68dd 100644 --- a/source/blender/blenkernel/BKE_shrinkwrap.h +++ b/source/blender/blenkernel/BKE_shrinkwrap.h @@ -1,6 +1,4 @@ -/** - * BKE_shrinkwrap.h - * +/* * ***** BEGIN GPL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or @@ -29,6 +27,10 @@ #ifndef BKE_SHRINKWRAP_H #define BKE_SHRINKWRAP_H +/** \file BKE_shrinkwrap.h + * \ingroup bke + */ + /* mesh util */ //TODO: move this somewhere else diff --git a/source/blender/blenkernel/BKE_sketch.h b/source/blender/blenkernel/BKE_sketch.h index a59464bb7ba..f42d733d583 100644 --- a/source/blender/blenkernel/BKE_sketch.h +++ b/source/blender/blenkernel/BKE_sketch.h @@ -1,5 +1,4 @@ -/** - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -25,6 +24,10 @@ #ifndef BKE_SKETCH_H #define BKE_SKETCH_H +/** \file BKE_sketch.h + * \ingroup bke + */ + typedef enum SK_PType { PT_CONTINUOUS, diff --git a/source/blender/blenkernel/BKE_smoke.h b/source/blender/blenkernel/BKE_smoke.h index 396db60714a..16e5336bcc1 100644 --- a/source/blender/blenkernel/BKE_smoke.h +++ b/source/blender/blenkernel/BKE_smoke.h @@ -1,6 +1,4 @@ -/** - * BKE_smoke.h - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -32,6 +30,11 @@ #ifndef BKE_SMOKE_H_ #define BKE_SMOKE_H_ +/** \file BKE_smoke.h + * \ingroup bke + * \author Daniel Genrich + */ + typedef float (*bresenham_callback) (float *result, float *input, int res[3], int *pixel, float *tRay, float correct); void smokeModifier_do(struct SmokeModifierData *smd, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm); diff --git a/source/blender/blenkernel/BKE_softbody.h b/source/blender/blenkernel/BKE_softbody.h index 738fe7dde82..6aea9344070 100644 --- a/source/blender/blenkernel/BKE_softbody.h +++ b/source/blender/blenkernel/BKE_softbody.h @@ -1,6 +1,4 @@ -/** - * BKE_softbody.h - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,10 @@ #ifndef BKE_SOFTBODY_H #define BKE_SOFTBODY_H +/** \file BKE_softbody.h + * \ingroup bke + */ + struct Object; struct Scene; struct SoftBody; diff --git a/source/blender/blenkernel/BKE_sound.h b/source/blender/blenkernel/BKE_sound.h index cf77049b599..acd4718a65a 100644 --- a/source/blender/blenkernel/BKE_sound.h +++ b/source/blender/blenkernel/BKE_sound.h @@ -1,6 +1,4 @@ -/** - * sound.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,12 @@ #ifndef BKE_SOUND_H #define BKE_SOUND_H +/** \file BKE_sound.h + * \ingroup bke + * \since March 2001 + * \author nzc + */ + struct PackedFile; struct bSound; struct bContext; @@ -45,7 +49,7 @@ void sound_init(struct Main *main); void sound_exit(void); void sound_force_device(int device); -int sound_define_from_str(char *str); +int sound_define_from_str(const char *str); struct bSound* sound_new_file(struct Main *main, const char *filename); diff --git a/source/blender/blenkernel/BKE_subsurf.h b/source/blender/blenkernel/BKE_subsurf.h index ef3ad3ad2e9..b82db853d37 100644 --- a/source/blender/blenkernel/BKE_subsurf.h +++ b/source/blender/blenkernel/BKE_subsurf.h @@ -28,6 +28,10 @@ #ifndef BKE_SUBSURF_H #define BKE_SUBSURF_H +/** \file BKE_subsurf.h + * \ingroup bke + */ + struct DMGridAdjacency; struct DMGridData; struct DerivedMesh; diff --git a/source/blender/blenkernel/BKE_suggestions.h b/source/blender/blenkernel/BKE_suggestions.h index 9eb8897e0e0..e215cabd70f 100644 --- a/source/blender/blenkernel/BKE_suggestions.h +++ b/source/blender/blenkernel/BKE_suggestions.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -29,6 +29,10 @@ #ifndef BKE_SUGGESTIONS_H #define BKE_SUGGESTIONS_H +/** \file BKE_suggestions.h + * \ingroup bke + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenkernel/BKE_text.h b/source/blender/blenkernel/BKE_text.h index 5f55f8b351e..a6b98b8ea88 100644 --- a/source/blender/blenkernel/BKE_text.h +++ b/source/blender/blenkernel/BKE_text.h @@ -1,6 +1,4 @@ -/** - * blenlib/BKE_text.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,12 @@ #ifndef BKE_TEXT_H #define BKE_TEXT_H +/** \file BKE_text.h + * \ingroup bke + * \since March 2001 + * \author nzc + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenkernel/BKE_texture.h b/source/blender/blenkernel/BKE_texture.h index da9f13e07bc..e6a21ec3966 100644 --- a/source/blender/blenkernel/BKE_texture.h +++ b/source/blender/blenkernel/BKE_texture.h @@ -1,6 +1,4 @@ -/** - * blenlib/BKE_texture.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,12 @@ #ifndef BKE_TEXTURE_H #define BKE_TEXTURE_H +/** \file BKE_texture.h + * \ingroup bke + * \since March 2001 + * \author nzc + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenkernel/BKE_unit.h b/source/blender/blenkernel/BKE_unit.h index 5708766432f..0a3e56c8cba 100644 --- a/source/blender/blenkernel/BKE_unit.h +++ b/source/blender/blenkernel/BKE_unit.h @@ -1,4 +1,4 @@ -/** +/* * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -24,6 +24,10 @@ #ifndef BKE_UNIT_H #define BKE_UNIT_H +/** \file BKE_unit.h + * \ingroup bke + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenkernel/BKE_utildefines.h b/source/blender/blenkernel/BKE_utildefines.h index fca6a8cbef8..14e622c972e 100644 --- a/source/blender/blenkernel/BKE_utildefines.h +++ b/source/blender/blenkernel/BKE_utildefines.h @@ -27,8 +27,12 @@ * ***** END GPL LICENSE BLOCK ***** */ -/* This file shold contain blender format spesific macros - * generic defines should go in BLI_utildefines.h */ +/** \file BKE_utildefines.h + * \ingroup bke + * \brief blender format spesific macros + * \note generic defines should go in BLI_utildefines.h + */ + #ifndef BKE_UTILDEFINES_H #define BKE_UTILDEFINES_H diff --git a/source/blender/blenkernel/BKE_world.h b/source/blender/blenkernel/BKE_world.h index 8c6da40fcea..30780b87085 100644 --- a/source/blender/blenkernel/BKE_world.h +++ b/source/blender/blenkernel/BKE_world.h @@ -1,6 +1,4 @@ -/** - * blenlib/BKE_world.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,12 @@ #ifndef BKE_WORLD_H #define BKE_WORLD_H +/** \file BKE_world.h + * \ingroup bke + * \since March 2001 + * \author nzc + */ + struct World; void free_world(struct World *sc); diff --git a/source/blender/blenkernel/BKE_writeavi.h b/source/blender/blenkernel/BKE_writeavi.h index c7f26d9b76c..19cc1ae2dbf 100644 --- a/source/blender/blenkernel/BKE_writeavi.h +++ b/source/blender/blenkernel/BKE_writeavi.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -30,6 +30,10 @@ #ifndef BKE_WRITEAVI_H #define BKE_WRITEAVI_H +/** \file BKE_writeavi.h + * \ingroup bke + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenkernel/BKE_writeffmpeg.h b/source/blender/blenkernel/BKE_writeffmpeg.h index 311676b37b5..2b10f1b246c 100644 --- a/source/blender/blenkernel/BKE_writeffmpeg.h +++ b/source/blender/blenkernel/BKE_writeffmpeg.h @@ -1,4 +1,4 @@ -/** +/* * ***** BEGIN GPL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or @@ -28,6 +28,10 @@ #ifndef BKE_WRITEFFMPEG_H #define BKE_WRITEFFMPEG_H +/** \file BKE_writeffmpeg.h + * \ingroup bke + */ + #ifdef WITH_FFMPEG #ifdef __cplusplus diff --git a/source/blender/blenkernel/BKE_writeframeserver.h b/source/blender/blenkernel/BKE_writeframeserver.h index 036e0dbd774..2117a23b938 100644 --- a/source/blender/blenkernel/BKE_writeframeserver.h +++ b/source/blender/blenkernel/BKE_writeframeserver.h @@ -1,4 +1,4 @@ -/** +/* * ***** BEGIN GPL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or @@ -28,6 +28,10 @@ #ifndef BKE_WRITEFRAMESERVER_H #define BKE_WRITEFRAMESERVER_H +/** \file BKE_writeframeserver.h + * \ingroup bke + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index c7a474c5949..af02352dfbc 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -49,6 +49,7 @@ set(INC ../../../intern/memutil ../../../intern/opennl/extern ../../../intern/smoke/extern + ../../../intern/mikktspace ../../../source/blender/windowmanager # XXX - BAD LEVEL CALL WM_api.h ${ZLIB_INCLUDE_DIRS} ) diff --git a/source/blender/blenkernel/SConscript b/source/blender/blenkernel/SConscript index c5c7575da38..d865912f5e0 100644 --- a/source/blender/blenkernel/SConscript +++ b/source/blender/blenkernel/SConscript @@ -12,6 +12,7 @@ incs += ' #/extern/bullet2/src' incs += ' #/intern/opennl/extern #/intern/bsp/extern' incs += ' ../gpu #/extern/glew/include' incs += ' #/intern/smoke/extern' +incs += ' #/intern/mikktspace' incs += ' #/intern/audaspace/intern' incs += ' ' + env['BF_OPENGL_INC'] diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c index 8c265a1f8c9..3564c93681a 100644 --- a/source/blender/blenkernel/intern/CCGSubSurf.c +++ b/source/blender/blenkernel/intern/CCGSubSurf.c @@ -243,13 +243,13 @@ enum { Vert_eEffected= (1<<0), Vert_eChanged= (1<<1), Vert_eSeam= (1<<2), -} VertFlags; +} /*VertFlags*/; enum { Edge_eEffected= (1<<0), -} CCGEdgeFlags; +} /*CCGEdgeFlags*/; enum { Face_eEffected= (1<<0), -} FaceFlags; +} /*FaceFlags*/; struct _CCGVert { CCGVert *next; /* EHData.next */ diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index eedc2636991..79e23b77306 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -948,7 +948,7 @@ static void emDM_drawMappedFacesGLSL(DerivedMesh *dm, } \ if(attribs.tottang) { \ float *tang = attribs.tang.array[i*4 + vert]; \ - glVertexAttrib3fvARB(attribs.tang.glIndex, tang); \ + glVertexAttrib4fvARB(attribs.tang.glIndex, tang); \ } \ } @@ -2481,6 +2481,111 @@ float *mesh_get_mapped_verts_nors(Scene *scene, Object *ob) /* ******************* GLSL ******************** */ +typedef struct +{ + float * precomputedFaceNormals; + MTFace * mtface; // texture coordinates + MFace * mface; // indices + MVert * mvert; // vertices & normals + float (*orco)[3]; + float (*tangent)[4]; // destination + int numFaces; + +} SGLSLMeshToTangent; + +// interface +#include "mikktspace.h" + +static int GetNumFaces(const SMikkTSpaceContext * pContext) +{ + SGLSLMeshToTangent * pMesh = (SGLSLMeshToTangent *) pContext->m_pUserData; + return pMesh->numFaces; +} + +static int GetNumVertsOfFace(const SMikkTSpaceContext * pContext, const int face_num) +{ + SGLSLMeshToTangent * pMesh = (SGLSLMeshToTangent *) pContext->m_pUserData; + return pMesh->mface[face_num].v4!=0 ? 4 : 3; +} + +static void GetPosition(const SMikkTSpaceContext * pContext, float fPos[], const int face_num, const int vert_index) +{ + //assert(vert_index>=0 && vert_index<4); + SGLSLMeshToTangent * pMesh = (SGLSLMeshToTangent *) pContext->m_pUserData; + unsigned int indices[] = { pMesh->mface[face_num].v1, pMesh->mface[face_num].v2, + pMesh->mface[face_num].v3, pMesh->mface[face_num].v4 }; + VECCOPY(fPos, pMesh->mvert[indices[vert_index]].co); +} + +static void GetTextureCoordinate(const SMikkTSpaceContext * pContext, float fUV[], const int face_num, const int vert_index) +{ + //assert(vert_index>=0 && vert_index<4); + SGLSLMeshToTangent * pMesh = (SGLSLMeshToTangent *) pContext->m_pUserData; + + if(pMesh->mtface!=NULL) + { + float * uv = pMesh->mtface[face_num].uv[vert_index]; + fUV[0]=uv[0]; fUV[1]=uv[1]; + } + else + { + unsigned int indices[] = { pMesh->mface[face_num].v1, pMesh->mface[face_num].v2, + pMesh->mface[face_num].v3, pMesh->mface[face_num].v4 }; + + map_to_sphere( &fUV[0], &fUV[1],pMesh->orco[indices[vert_index]][0], pMesh->orco[indices[vert_index]][1], pMesh->orco[indices[vert_index]][2]); + } +} + +static void GetNormal(const SMikkTSpaceContext * pContext, float fNorm[], const int face_num, const int vert_index) +{ + //assert(vert_index>=0 && vert_index<4); + SGLSLMeshToTangent * pMesh = (SGLSLMeshToTangent *) pContext->m_pUserData; + unsigned int indices[] = { pMesh->mface[face_num].v1, pMesh->mface[face_num].v2, + pMesh->mface[face_num].v3, pMesh->mface[face_num].v4 }; + + const int smoothnormal = (pMesh->mface[face_num].flag & ME_SMOOTH); + if(!smoothnormal) // flat + { + if(pMesh->precomputedFaceNormals) + { + VECCOPY(fNorm, &pMesh->precomputedFaceNormals[3*face_num]); + } + else + { + float nor[3]; + float * p0, * p1, * p2; + const int iGetNrVerts = pMesh->mface[face_num].v4!=0 ? 4 : 3; + p0 = pMesh->mvert[indices[0]].co; p1 = pMesh->mvert[indices[1]].co; p2 = pMesh->mvert[indices[2]].co; + if(iGetNrVerts==4) + { + float * p3 = pMesh->mvert[indices[3]].co; + normal_quad_v3( nor, p0, p1, p2, p3); + } + else { + normal_tri_v3(nor, p0, p1, p2); + } + VECCOPY(fNorm, nor); + } + } + else + { + int i=0; + short * no = pMesh->mvert[indices[vert_index]].no; + for(i=0; i<3; i++) + fNorm[i]=no[i]/32767.0f; + normalize_v3(fNorm); + } +} +static void SetTSpace(const SMikkTSpaceContext * pContext, const float fvTangent[], const float fSign, const int face_num, const int iVert) +{ + //assert(vert_index>=0 && vert_index<4); + SGLSLMeshToTangent * pMesh = (SGLSLMeshToTangent *) pContext->m_pUserData; + float * pRes = pMesh->tangent[4*face_num+iVert]; + VECCOPY(pRes, fvTangent); + pRes[3]=fSign; +} + + void DM_add_tangent_layer(DerivedMesh *dm) { /* mesh vars */ @@ -2489,14 +2594,17 @@ void DM_add_tangent_layer(DerivedMesh *dm) MVert *mvert, *v1, *v2, *v3, *v4; MemArena *arena= NULL; VertexTangent **vtangents= NULL; - float (*orco)[3]= NULL, (*tangent)[3]; + float (*orco)[3]= NULL, (*tangent)[4]; float *uv1, *uv2, *uv3, *uv4, *vtang; float fno[3], tang[3], uv[4][2]; - int i, j, len, mf_vi[4], totvert, totface; + int i, j, len, mf_vi[4], totvert, totface, iCalcNewMethod; + float *nors; if(CustomData_get_layer_index(&dm->faceData, CD_TANGENT) != -1) return; + nors = dm->getFaceDataArray(dm, CD_NORMAL); + /* check we have all the needed layers */ totvert= dm->getNumVerts(dm); totface= dm->getNumFaces(dm); @@ -2519,72 +2627,108 @@ void DM_add_tangent_layer(DerivedMesh *dm) arena= BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "tangent layer arena"); BLI_memarena_use_calloc(arena); vtangents= MEM_callocN(sizeof(VertexTangent*)*totvert, "VertexTangent"); - - /* sum tangents at connected vertices */ - for(i=0, tf=mtface, mf=mface; i < totface; mf++, tf++, i++) { - v1= &mvert[mf->v1]; - v2= &mvert[mf->v2]; - v3= &mvert[mf->v3]; - - if (mf->v4) { - v4= &mvert[mf->v4]; - normal_quad_v3( fno,v4->co, v3->co, v2->co, v1->co); - } - else { - v4= NULL; - normal_tri_v3( fno,v3->co, v2->co, v1->co); - } - - if(mtface) { - uv1= tf->uv[0]; - uv2= tf->uv[1]; - uv3= tf->uv[2]; - uv4= tf->uv[3]; - } - else { - uv1= uv[0]; uv2= uv[1]; uv3= uv[2]; uv4= uv[3]; - map_to_sphere( &uv[0][0], &uv[0][1],orco[mf->v1][0], orco[mf->v1][1], orco[mf->v1][2]); - map_to_sphere( &uv[1][0], &uv[1][1],orco[mf->v2][0], orco[mf->v2][1], orco[mf->v2][2]); - map_to_sphere( &uv[2][0], &uv[2][1],orco[mf->v3][0], orco[mf->v3][1], orco[mf->v3][2]); - if(v4) - map_to_sphere( &uv[3][0], &uv[3][1],orco[mf->v4][0], orco[mf->v4][1], orco[mf->v4][2]); - } + + // new computation method + iCalcNewMethod = 1; + if(iCalcNewMethod!=0) + { + SGLSLMeshToTangent mesh2tangent; + SMikkTSpaceContext sContext; + SMikkTSpaceInterface sInterface; + memset(&mesh2tangent, 0, sizeof(SGLSLMeshToTangent)); + memset(&sContext, 0, sizeof(SMikkTSpaceContext)); + memset(&sInterface, 0, sizeof(SMikkTSpaceInterface)); + + mesh2tangent.precomputedFaceNormals = nors; + mesh2tangent.mtface = mtface; + mesh2tangent.mface = mface; + mesh2tangent.mvert = mvert; + mesh2tangent.orco = orco; + mesh2tangent.tangent = tangent; + mesh2tangent.numFaces = totface; + + sContext.m_pUserData = &mesh2tangent; + sContext.m_pInterface = &sInterface; + sInterface.m_getNumFaces = GetNumFaces; + sInterface.m_getNumVerticesOfFace = GetNumVertsOfFace; + sInterface.m_getPosition = GetPosition; + sInterface.m_getTexCoord = GetTextureCoordinate; + sInterface.m_getNormal = GetNormal; + sInterface.m_setTSpaceBasic = SetTSpace; + + // 0 if failed + iCalcNewMethod = genTangSpaceDefault(&sContext); + } + + if(!iCalcNewMethod) + { + /* sum tangents at connected vertices */ + for(i=0, tf=mtface, mf=mface; i < totface; mf++, tf++, i++) { + v1= &mvert[mf->v1]; + v2= &mvert[mf->v2]; + v3= &mvert[mf->v3]; + + if (mf->v4) { + v4= &mvert[mf->v4]; + normal_quad_v3( fno,v4->co, v3->co, v2->co, v1->co); + } + else { + v4= NULL; + normal_tri_v3( fno,v3->co, v2->co, v1->co); + } - tangent_from_uv(uv1, uv2, uv3, v1->co, v2->co, v3->co, fno, tang); - sum_or_add_vertex_tangent(arena, &vtangents[mf->v1], tang, uv1); - sum_or_add_vertex_tangent(arena, &vtangents[mf->v2], tang, uv2); - sum_or_add_vertex_tangent(arena, &vtangents[mf->v3], tang, uv3); + if(mtface) { + uv1= tf->uv[0]; + uv2= tf->uv[1]; + uv3= tf->uv[2]; + uv4= tf->uv[3]; + } + else { + uv1= uv[0]; uv2= uv[1]; uv3= uv[2]; uv4= uv[3]; + map_to_sphere( &uv[0][0], &uv[0][1],orco[mf->v1][0], orco[mf->v1][1], orco[mf->v1][2]); + map_to_sphere( &uv[1][0], &uv[1][1],orco[mf->v2][0], orco[mf->v2][1], orco[mf->v2][2]); + map_to_sphere( &uv[2][0], &uv[2][1],orco[mf->v3][0], orco[mf->v3][1], orco[mf->v3][2]); + if(v4) + map_to_sphere( &uv[3][0], &uv[3][1],orco[mf->v4][0], orco[mf->v4][1], orco[mf->v4][2]); + } - if(mf->v4) { - v4= &mvert[mf->v4]; - - tangent_from_uv(uv1, uv3, uv4, v1->co, v3->co, v4->co, fno, tang); + tangent_from_uv(uv1, uv2, uv3, v1->co, v2->co, v3->co, fno, tang); sum_or_add_vertex_tangent(arena, &vtangents[mf->v1], tang, uv1); + sum_or_add_vertex_tangent(arena, &vtangents[mf->v2], tang, uv2); sum_or_add_vertex_tangent(arena, &vtangents[mf->v3], tang, uv3); - sum_or_add_vertex_tangent(arena, &vtangents[mf->v4], tang, uv4); + + if(mf->v4) { + v4= &mvert[mf->v4]; + + tangent_from_uv(uv1, uv3, uv4, v1->co, v3->co, v4->co, fno, tang); + sum_or_add_vertex_tangent(arena, &vtangents[mf->v1], tang, uv1); + sum_or_add_vertex_tangent(arena, &vtangents[mf->v3], tang, uv3); + sum_or_add_vertex_tangent(arena, &vtangents[mf->v4], tang, uv4); + } } - } - /* write tangent to layer */ - for(i=0, tf=mtface, mf=mface; i < totface; mf++, tf++, i++, tangent+=4) { - len= (mf->v4)? 4 : 3; - - if(mtface == NULL) { - map_to_sphere( &uv[0][0], &uv[0][1],orco[mf->v1][0], orco[mf->v1][1], orco[mf->v1][2]); - map_to_sphere( &uv[1][0], &uv[1][1],orco[mf->v2][0], orco[mf->v2][1], orco[mf->v2][2]); - map_to_sphere( &uv[2][0], &uv[2][1],orco[mf->v3][0], orco[mf->v3][1], orco[mf->v3][2]); - if(len==4) - map_to_sphere( &uv[3][0], &uv[3][1],orco[mf->v4][0], orco[mf->v4][1], orco[mf->v4][2]); - } + /* write tangent to layer */ + for(i=0, tf=mtface, mf=mface; i < totface; mf++, tf++, i++, tangent+=4) { + len= (mf->v4)? 4 : 3; + + if(mtface == NULL) { + map_to_sphere( &uv[0][0], &uv[0][1],orco[mf->v1][0], orco[mf->v1][1], orco[mf->v1][2]); + map_to_sphere( &uv[1][0], &uv[1][1],orco[mf->v2][0], orco[mf->v2][1], orco[mf->v2][2]); + map_to_sphere( &uv[2][0], &uv[2][1],orco[mf->v3][0], orco[mf->v3][1], orco[mf->v3][2]); + if(len==4) + map_to_sphere( &uv[3][0], &uv[3][1],orco[mf->v4][0], orco[mf->v4][1], orco[mf->v4][2]); + } - mf_vi[0]= mf->v1; - mf_vi[1]= mf->v2; - mf_vi[2]= mf->v3; - mf_vi[3]= mf->v4; + mf_vi[0]= mf->v1; + mf_vi[1]= mf->v2; + mf_vi[2]= mf->v3; + mf_vi[3]= mf->v4; - for(j=0; j<len; j++) { - vtang= find_vertex_tangent(vtangents[mf_vi[j]], mtface ? tf->uv[j] : uv[j]); - normalize_v3_v3(tangent[j], vtang); + for(j=0; j<len; j++) { + vtang= find_vertex_tangent(vtangents[mf_vi[j]], mtface ? tf->uv[j] : uv[j]); + normalize_v3_v3(tangent[j], vtang); + ((float *) tangent[j])[3]=1.0f; + } } } diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c index 8fdfca33efb..08d506f94b8 100644 --- a/source/blender/blenkernel/intern/anim.c +++ b/source/blender/blenkernel/intern/anim.c @@ -49,6 +49,7 @@ #include "DNA_scene_types.h" #include "DNA_vfont_types.h" +#include "BKE_animsys.h" #include "BKE_curve.h" #include "BKE_DerivedMesh.h" #include "BKE_depsgraph.h" @@ -742,41 +743,69 @@ static void group_duplilist(ListBase *lb, Scene *scene, Object *ob, int level, i static void frames_duplilist(ListBase *lb, Scene *scene, Object *ob, int level, int animated) { extern int enable_cu_speed; /* object.c */ - Object copyob; - DupliObject *dob; - int cfrao, ok; + Object copyob = {{NULL}}; + int cfrao = scene->r.cfra; - /* simple preventing of too deep nested groups */ - if(level>MAX_DUPLI_RECUR) return; + /* simple prevention of too deep nested groups */ + if (level > MAX_DUPLI_RECUR) return; - cfrao= scene->r.cfra; - if(ob->parent==NULL && ob->constraints.first==NULL) return; - - if(ob->transflag & OB_DUPLINOSPEED) enable_cu_speed= 0; - copyob= *ob; /* store transform info */ - - for(scene->r.cfra= ob->dupsta; scene->r.cfra<=ob->dupend; scene->r.cfra++) { - - ok= 1; - if(ob->dupoff) { + /* if we don't have any data/settings which will lead to object movement, + * don't waste time trying, as it will all look the same... + */ + if (ob->parent==NULL && ob->constraints.first==NULL && ob->adt==NULL) + return; + + /* make a copy of the object's original data (before any dupli-data overwrites it) + * as we'll need this to keep track of unkeyed data + * - this doesn't take into account other data that can be reached from the object, + * for example it's shapekeys or bones, hence the need for an update flush at the end + */ + copyob = *ob; + + /* duplicate over the required range */ + if (ob->transflag & OB_DUPLINOSPEED) enable_cu_speed= 0; + + for (scene->r.cfra= ob->dupsta; scene->r.cfra<=ob->dupend; scene->r.cfra++) { + short ok= 1; + + /* - dupoff = how often a frames within the range shouldn't be made into duplis + * - dupon = the length of each "skipping" block in frames + */ + if (ob->dupoff) { ok= scene->r.cfra - ob->dupsta; ok= ok % (ob->dupon+ob->dupoff); - if(ok < ob->dupon) ok= 1; - else ok= 0; + ok= (ok < ob->dupon); } - if(ok) { -#if 0 // XXX old animation system - do_ob_ipo(scene, ob); -#endif // XXX old animation system + + if (ok) { + DupliObject *dob; + + /* WARNING: doing animation updates in this way is not terribly accurate, as the dependencies + * and/or other objects which may affect this object's transforms are not updated either. + * However, this has always been the way that this worked (i.e. pre 2.5), so I guess that it'll be fine! + */ + BKE_animsys_evaluate_animdata(&ob->id, ob->adt, (float)scene->r.cfra, ADT_RECALC_ANIM); /* ob-eval will do drivers, so we don't need to do them */ where_is_object_time(scene, ob, (float)scene->r.cfra); + dob= new_dupli_object(lb, ob, ob->obmat, ob->lay, scene->r.cfra, OB_DUPLIFRAMES, animated); copy_m4_m4(dob->omat, copyob.obmat); } } - *ob= copyob; /* restore transform info */ - scene->r.cfra= cfrao; enable_cu_speed= 1; + + /* reset frame to original frame, then re-evaluate animation as above + * as 2.5 animation data may have far-reaching consequences + */ + scene->r.cfra= cfrao; + + BKE_animsys_evaluate_animdata(&ob->id, ob->adt, (float)scene->r.cfra, ADT_RECALC_ANIM); /* ob-eval will do drivers, so we don't need to do them */ + where_is_object_time(scene, ob, (float)scene->r.cfra); + + /* but, to make sure unkeyed object transforms are still sane, + * let's copy object's original data back over + */ + *ob = copyob; } typedef struct vertexDupliData { diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c index cc01438fd5d..3174954423f 100644 --- a/source/blender/blenkernel/intern/armature.c +++ b/source/blender/blenkernel/intern/armature.c @@ -2100,7 +2100,7 @@ void pchan_to_mat4(bPoseChannel *pchan, float chan_mat[4][4]) /* loc/rot/size to mat4 */ /* used in constraint.c too */ -void chan_calc_mat(bPoseChannel *pchan) +void pchan_calc_mat(bPoseChannel *pchan) { /* this is just a wrapper around the copy of this function which calculates the matrix * and stores the result in any given channel @@ -2256,7 +2256,7 @@ void where_is_pose_bone(Scene *scene, Object *ob, bPoseChannel *pchan, float cti parchan= pchan->parent; /* this gives a chan_mat with actions (ipos) results */ - if(do_extra) chan_calc_mat(pchan); + if(do_extra) pchan_calc_mat(pchan); else unit_m4(pchan->chan_mat); /* construct the posemat based on PoseChannels, that we do before applying constraints */ diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c index 4ad3b8bb3cf..473be5a3ee0 100644 --- a/source/blender/blenkernel/intern/brush.c +++ b/source/blender/blenkernel/intern/brush.c @@ -227,7 +227,7 @@ void make_local_brush(Brush *brush) } } -static void brush_debug_print_state(Brush *br) +void brush_debug_print_state(Brush *br) { /* create a fake brush and set it to the defaults */ Brush def= {{NULL}}; diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index abf2257877b..9a04c75db07 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -1066,7 +1066,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo } \ if(attribs.tottang) { \ float *tang = attribs.tang.array[a*4 + vert]; \ - glVertexAttrib3fvARB(attribs.tang.glIndex, tang); \ + glVertexAttrib4fvARB(attribs.tang.glIndex, tang); \ } \ if(smoothnormal) \ glNormal3sv(mvert[index].no); \ @@ -1158,7 +1158,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo } if(attribs.tottang) { datatypes[numdata].index = attribs.tang.glIndex; - datatypes[numdata].size = 3; + datatypes[numdata].size = 4; datatypes[numdata].type = GL_FLOAT; numdata++; } @@ -1248,12 +1248,12 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo } if(attribs.tottang) { float *tang = attribs.tang.array[a*4 + 0]; - VECCOPY((float *)&varray[elementsize*curface*3+offset], tang); + QUATCOPY((float *)&varray[elementsize*curface*3+offset], tang); tang = attribs.tang.array[a*4 + 1]; - VECCOPY((float *)&varray[elementsize*curface*3+offset+elementsize], tang); + QUATCOPY((float *)&varray[elementsize*curface*3+offset+elementsize], tang); tang = attribs.tang.array[a*4 + 2]; - VECCOPY((float *)&varray[elementsize*curface*3+offset+elementsize*2], tang); - offset += sizeof(float)*3; + QUATCOPY((float *)&varray[elementsize*curface*3+offset+elementsize*2], tang); + offset += sizeof(float)*4; } } curface++; @@ -1288,12 +1288,12 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo } if(attribs.tottang) { float *tang = attribs.tang.array[a*4 + 2]; - VECCOPY((float *)&varray[elementsize*curface*3+offset], tang); + QUATCOPY((float *)&varray[elementsize*curface*3+offset], tang); tang = attribs.tang.array[a*4 + 3]; - VECCOPY((float *)&varray[elementsize*curface*3+offset+elementsize], tang); + QUATCOPY((float *)&varray[elementsize*curface*3+offset+elementsize], tang); tang = attribs.tang.array[a*4 + 0]; - VECCOPY((float *)&varray[elementsize*curface*3+offset+elementsize*2], tang); - offset += sizeof(float)*3; + QUATCOPY((float *)&varray[elementsize*curface*3+offset+elementsize*2], tang); + offset += sizeof(float)*4; } } curface++; diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c index 02b3de83ee1..3c0453c82a5 100644 --- a/source/blender/blenkernel/intern/collision.c +++ b/source/blender/blenkernel/intern/collision.c @@ -482,7 +482,7 @@ DO_INLINE void collision_interpolateOnTriangle ( float to[3], float v1[3], float } -int cloth_collision_response_static ( ClothModifierData *clmd, CollisionModifierData *collmd, CollPair *collpair, CollPair *collision_end ) +static int cloth_collision_response_static ( ClothModifierData *clmd, CollisionModifierData *collmd, CollPair *collpair, CollPair *collision_end ) { int result = 0; Cloth *cloth1; @@ -598,7 +598,7 @@ int cloth_collision_response_static ( ClothModifierData *clmd, CollisionModifier } //Determines collisions on overlap, collisions are written to collpair[i] and collision+number_collision_found is returned -CollPair* cloth_collision ( ModifierData *md1, ModifierData *md2, BVHTreeOverlap *overlap, CollPair *collpair ) +static CollPair* cloth_collision ( ModifierData *md1, ModifierData *md2, BVHTreeOverlap *overlap, CollPair *collpair ) { ClothModifierData *clmd = ( ClothModifierData * ) md1; CollisionModifierData *collmd = ( CollisionModifierData * ) md2; diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c index b3f83019ff1..e7efc09ec6e 100644 --- a/source/blender/blenkernel/intern/constraint.c +++ b/source/blender/blenkernel/intern/constraint.c @@ -2149,7 +2149,6 @@ static void actcon_flush_tars (bConstraint *con, ListBase *list, short nocopy) static void actcon_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float UNUSED(ctime)) { - extern void chan_calc_mat(bPoseChannel *chan); bActionConstraint *data = con->data; if (VALID_CONS_TARGET(ct)) { @@ -2217,7 +2216,7 @@ static void actcon_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraint what_does_obaction(cob->scene, cob->ob, &workob, pose, data->act, pchan->name, t); /* convert animation to matrices for use here */ - chan_calc_mat(tchan); + pchan_calc_mat(tchan); copy_m4_m4(ct->matrix, tchan->chan_mat); /* Clean up */ diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index 7788f9f28a2..87fe545644a 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -829,7 +829,7 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = { {sizeof(MTexPoly), "MTexPoly", 1, "Face Texture", NULL, NULL, NULL, NULL, NULL}, {sizeof(MLoopUV), "MLoopUV", 1, "UV coord", NULL, NULL, layerInterp_mloopuv, NULL, NULL}, {sizeof(MLoopCol), "MLoopCol", 1, "Col", NULL, NULL, layerInterp_mloopcol, NULL, layerDefault_mloopcol}, - {sizeof(float)*3*4, "", 0, NULL, NULL, NULL, NULL, NULL, NULL}, + {sizeof(float)*4*4, "", 0, NULL, NULL, NULL, NULL, NULL, NULL}, {sizeof(MDisps), "MDisps", 1, NULL, layerCopy_mdisps, layerFree_mdisps, layerInterp_mdisps, layerSwap_mdisps, NULL, layerRead_mdisps, layerWrite_mdisps, layerFilesize_mdisps, layerValidate_mdisps}, diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index 64327b2005d..8a15f63243c 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -72,10 +72,9 @@ #include "BKE_packedFile.h" #include "BKE_scene.h" #include "BKE_node.h" +#include "BKE_sequencer.h" /* seq_foreground_frame_get() */ #include "BKE_utildefines.h" -//XXX #include "BIF_editseq.h" - #include "BLF_api.h" #include "PIL_time.h" @@ -527,6 +526,10 @@ void free_old_images(void) if (U.textimeout == 0 || ctime % U.texcollectrate || ctime == lasttime) return; + /* of course not! */ + if (G.rendering) + return; + lasttime = ctime; ima= G.main->image.first; @@ -968,7 +971,7 @@ static void stampdata(Scene *scene, StampData *stamp_data, int do_prefix) } if (scene->r.stamp & R_STAMP_SEQSTRIP) { - Sequence *seq= NULL; //XXX = get_foreground_frame_seq(scene->r.cfra); + Sequence *seq= seq_foreground_frame_get(scene, scene->r.cfra); if (seq) strcpy(text, seq->name+2); else strcpy(text, "<none>"); @@ -2183,10 +2186,7 @@ ImBuf *BKE_image_acquire_ibuf(Image *ima, ImageUser *iuser, void **lock_r) BLI_unlock_thread(LOCK_IMAGE); } - /* we assuming that if it is not rendering, it's also not multithreaded - * (a somewhat weak assumption) */ - if(G.rendering==0) - tag_image_time(ima); + tag_image_time(ima); return ibuf; } diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 684f1531114..a65681ae6e4 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -1636,7 +1636,7 @@ void object_make_proxy(Object *ob, Object *target, Object *gob) /* there is also a timing calculation in drawobject() */ -int no_speed_curve= 0; +static int no_speed_curve= 0; void disable_speed_curve(int val) { @@ -1698,10 +1698,10 @@ void object_rot_to_mat3(Object *ob, float mat[][3]) else { /* quats are normalised before use to eliminate scaling issues */ float tquat[4]; - + normalize_qt_qt(tquat, ob->quat); quat_to_mat3(rmat, tquat); - + normalize_qt_qt(tquat, ob->dquat); quat_to_mat3(dmat, tquat); } @@ -1745,7 +1745,7 @@ void object_apply_mat4(Object *ob, float mat[][4], const short use_compat, const invert_m4_m4(imat, diff_mat); mul_m4_m4m4(rmat, mat, imat); /* get the parent relative matrix */ object_apply_mat4(ob, rmat, use_compat, FALSE); - + /* same as below, use rmat rather then mat */ mat4_to_loc_rot_size(ob->loc, rot, ob->size, rmat); object_mat3_to_rot(ob, rot, use_compat); @@ -1785,6 +1785,7 @@ void object_to_mat4(Object *ob, float mat[][4]) add_v3_v3v3(mat[3], ob->loc, ob->dloc); } +/* extern */ int enable_cu_speed= 1; static void ob_parcurve(Scene *scene, Object *ob, Object *par, float mat[][4]) @@ -1818,12 +1819,17 @@ static void ob_parcurve(Scene *scene, Object *ob, Object *par, float mat[][4]) * we divide the curvetime calculated in the previous step by the length of the path, to get a time * factor, which then gets clamped to lie within 0.0 - 1.0 range */ - ctime= cu->ctime / cu->pathlen; + if (IS_EQ(cu->pathlen, 0.0f) == 0) + ctime= cu->ctime / cu->pathlen; + else + ctime= cu->ctime; + CLAMP(ctime, 0.0, 1.0); } else { ctime= scene->r.cfra - give_timeoffset(ob); - ctime /= cu->pathlen; + if (IS_EQ(cu->pathlen, 0.0f) == 0) + ctime /= cu->pathlen; CLAMP(ctime, 0.0, 1.0); } diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index d1d5c13c3dd..4609e64c271 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -1831,9 +1831,11 @@ static void psys_particle_on_shape(int UNUSED(distr), int UNUSED(index), float * void psys_particle_on_emitter(ParticleSystemModifierData *psmd, int from, int index, int index_dmcache, float *fuv, float foffset, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor){ if(psmd){ if(psmd->psys->part->distr==PART_DISTR_GRID && psmd->psys->part->from != PART_FROM_VERT){ - if(vec){ - VECCOPY(vec,fuv); - } + if(vec) + copy_v3_v3(vec,fuv); + + if(orco) + copy_v3_v3(orco, fuv); return; } /* we cant use the num_dmcache */ @@ -3566,13 +3568,23 @@ ParticleSettings *psys_new_settings(const char *name, Main *main) ParticleSettings *psys_copy_settings(ParticleSettings *part) { ParticleSettings *partn; - + int a; + partn= copy_libblock(part); - if(partn->pd) partn->pd= MEM_dupallocN(part->pd); - if(partn->pd2) partn->pd2= MEM_dupallocN(part->pd2); - partn->effector_weights = MEM_dupallocN(part->effector_weights); + partn->pd= MEM_dupallocN(part->pd); + partn->pd2= MEM_dupallocN(part->pd2); + partn->effector_weights= MEM_dupallocN(part->effector_weights); + partn->fluid= MEM_dupallocN(part->fluid); partn->boids = boid_copy_settings(part->boids); + + for(a=0; a<MAX_MTEX; a++) { + if(part->mtex[a]) { + partn->mtex[a]= MEM_mallocN(sizeof(MTex), "psys_copy_tex"); + memcpy(partn->mtex[a], part->mtex[a], sizeof(MTex)); + id_us_plus((ID *)partn->mtex[a]->tex); + } + } return partn; } @@ -3771,7 +3783,7 @@ void psys_get_texture(ParticleSimulationData *sim, ParticleData *pa, ParticleTex short blend=mtex->blendtype; short texco = mtex->texco; - if(ELEM(texco, TEXCO_UV, TEXCO_ORCO) && (ELEM(part->from, PART_FROM_FACE, PART_FROM_VOLUME) == 0 || part->distr == PART_DISTR_GRID)) + if(texco == TEXCO_UV && (ELEM(part->from, PART_FROM_FACE, PART_FROM_VOLUME) == 0 || part->distr == PART_DISTR_GRID)) texco = TEXCO_GLOB; switch(texco) { diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index 65bd4f110b4..c1a6558aea3 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -2217,7 +2217,7 @@ static void psys_update_effectors(ParticleSimulationData *sim) ***********************************************************************************************************/ #define PSYS_FLUID_SPRINGS_INITIAL_SIZE 256 -ParticleSpring *add_fluid_spring(ParticleSystem *psys, ParticleSpring *spring) +static ParticleSpring *add_fluid_spring(ParticleSystem *psys, ParticleSpring *spring) { /* Are more refs required? */ if(psys->alloc_fluidsprings == 0 || psys->fluid_springs == NULL) { @@ -2236,7 +2236,7 @@ ParticleSpring *add_fluid_spring(ParticleSystem *psys, ParticleSpring *spring) return psys->fluid_springs + psys->tot_fluidsprings - 1; } -void delete_fluid_spring(ParticleSystem *psys, int j) +static void delete_fluid_spring(ParticleSystem *psys, int j) { if (j != psys->tot_fluidsprings - 1) psys->fluid_springs[j] = psys->fluid_springs[psys->tot_fluidsprings - 1]; @@ -2249,7 +2249,7 @@ void delete_fluid_spring(ParticleSystem *psys, int j) } } -EdgeHash *build_fluid_springhash(ParticleSystem *psys) +static EdgeHash *build_fluid_springhash(ParticleSystem *psys) { EdgeHash *springhash = NULL; ParticleSpring *spring; diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c index c2ec463c708..b7ece436ee2 100644 --- a/source/blender/blenkernel/intern/pointcache.c +++ b/source/blender/blenkernel/intern/pointcache.c @@ -280,6 +280,8 @@ static void ptcache_particle_read(int index, void *psys_v, void **data, float cf /* set frames cached before birth to birth time */ if(cfra < pa->time) pa->state.time = pa->time; + else if(cfra > pa->dietime) + pa->state.time = pa->dietime; if(data[BPHYS_DATA_SIZE]) PTCACHE_DATA_TO(data, BPHYS_DATA_SIZE, 0, &pa->size); diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c index 9537931faec..2785878fb08 100644 --- a/source/blender/blenkernel/intern/sequencer.c +++ b/source/blender/blenkernel/intern/sequencer.c @@ -2965,6 +2965,28 @@ void seq_translate(Scene *evil_scene, Sequence *seq, int delta) calc_sequence_disp(evil_scene, seq); } +Sequence *seq_foreground_frame_get(Scene *scene, int frame) +{ + Editing *ed= seq_give_editing(scene, FALSE); + Sequence *seq, *best_seq=NULL; + int best_machine = -1; + + if(!ed) return NULL; + + for (seq=ed->seqbasep->first; seq; seq= seq->next) { + if(seq->flag & SEQ_MUTE || seq->startdisp > frame || seq->enddisp <= frame) + continue; + /* only use elements you can see - not */ + if (ELEM5(seq->type, SEQ_IMAGE, SEQ_META, SEQ_SCENE, SEQ_MOVIE, SEQ_COLOR)) { + if (seq->machine > best_machine) { + best_seq = seq; + best_machine = seq->machine; + } + } + } + return best_seq; +} + /* return 0 if there werent enough space */ int shuffle_seq(ListBase * seqbasep, Sequence *test, Scene *evil_scene) { diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c index 29c29fb5158..a75bc2164c3 100644 --- a/source/blender/blenkernel/intern/shrinkwrap.c +++ b/source/blender/blenkernel/intern/shrinkwrap.c @@ -255,22 +255,26 @@ int normal_projection_project_vertex(char options, const float *vert, const floa BLI_bvhtree_ray_cast(tree, co, no, 0.0f, &hit_tmp, callback, userdata); - if(hit_tmp.index != -1) - { - float dot = INPR( dir, hit_tmp.no); - - if(((options & MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE) && dot <= 0.0f) - || ((options & MOD_SHRINKWRAP_CULL_TARGET_BACKFACE) && dot >= 0.0f)) - return FALSE; //Ignore hit - + if(hit_tmp.index != -1) { + /* invert the normal first so face culling works on rotated objects */ + if(transf) { + space_transform_invert_normal(transf, hit_tmp.no); + } - //Inverting space transform (TODO make coeherent with the initial dist readjust) - if(transf) - { - space_transform_invert( transf, hit_tmp.co ); - space_transform_invert_normal( transf, hit_tmp.no ); + if (options & (MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE|MOD_SHRINKWRAP_CULL_TARGET_BACKFACE)) { + /* apply backface */ + const float dot= dot_v3v3(dir, hit_tmp.no); + if( ((options & MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE) && dot <= 0.0f) || + ((options & MOD_SHRINKWRAP_CULL_TARGET_BACKFACE) && dot >= 0.0f) + ) { + return FALSE; /* Ignore hit */ + } + } - hit_tmp.dist = len_v3v3( (float*)vert, hit_tmp.co ); + if(transf) { + /* Inverting space transform (TODO make coeherent with the initial dist readjust) */ + space_transform_invert(transf, hit_tmp.co); + hit_tmp.dist = len_v3v3((float *)vert, hit_tmp.co); } memcpy(hit, &hit_tmp, sizeof(hit_tmp) ); diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c index 8039d729842..1d80e989da4 100644 --- a/source/blender/blenkernel/intern/smoke.c +++ b/source/blender/blenkernel/intern/smoke.c @@ -135,7 +135,7 @@ static void fill_scs_points(Object *ob, DerivedMesh *dm, SmokeCollSettings *scs) #define TRI_UVOFFSET (1./4.) -int smokeModifier_init (SmokeModifierData *smd, Object *ob, Scene *scene, DerivedMesh *dm) +static int smokeModifier_init (SmokeModifierData *smd, Object *ob, Scene *scene, DerivedMesh *dm) { if((smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain && !smd->domain->fluid) { diff --git a/source/blender/blenkernel/intern/sound.c b/source/blender/blenkernel/intern/sound.c index be6c4d22f9c..9c157f57d49 100644 --- a/source/blender/blenkernel/intern/sound.c +++ b/source/blender/blenkernel/intern/sound.c @@ -55,7 +55,7 @@ static void sound_sync_callback(void* data, int mode, float time) } #endif -int sound_define_from_str(char *str) +int sound_define_from_str(const char *str) { if (BLI_strcaseeq(str, "NULL")) return AUD_NULL_DEVICE; diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index a2d3016099d..0889f490e79 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -1392,7 +1392,7 @@ static void ccgDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, v } \ if(attribs.tottang) { \ float *tang = attribs.tang.array[a*4 + vert]; \ - glVertexAttrib3fvARB(attribs.tang.glIndex, tang); \ + glVertexAttrib4fvARB(attribs.tang.glIndex, tang); \ } \ } diff --git a/source/blender/blenkernel/intern/writeavi.c b/source/blender/blenkernel/intern/writeavi.c index 014a15de1ef..e946ce06aa2 100644 --- a/source/blender/blenkernel/intern/writeavi.c +++ b/source/blender/blenkernel/intern/writeavi.c @@ -214,7 +214,7 @@ static int append_avi(RenderData *UNUSED(rd), int frame, int *pixels, int rectx, return 1; } -void end_avi(void) +static void end_avi(void) { if (avi == NULL) return; diff --git a/source/blender/blenkernel/intern/writeframeserver.c b/source/blender/blenkernel/intern/writeframeserver.c index eb1c66604f8..3cb3d7e038b 100644 --- a/source/blender/blenkernel/intern/writeframeserver.c +++ b/source/blender/blenkernel/intern/writeframeserver.c @@ -49,11 +49,10 @@ #include "BLI_utildefines.h" - +#include "BKE_writeframeserver.h" #include "BKE_global.h" #include "BKE_report.h" - #include "DNA_scene_types.h" static int sock; diff --git a/source/blender/blenlib/BLI_args.h b/source/blender/blenlib/BLI_args.h index 2927314e225..4cdb35dd675 100644 --- a/source/blender/blenlib/BLI_args.h +++ b/source/blender/blenlib/BLI_args.h @@ -1,6 +1,4 @@ -/** - * A general argument parsing module - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -32,13 +30,18 @@ #ifndef BLI_ARGS_H #define BLI_ARGS_H +/** \file BLI_args.h + * \ingroup bli + * \brief A general argument parsing module. + */ + struct bArgs; typedef struct bArgs bArgs; /* returns the number of extra arguments consumed by the function. 0 is normal value, -1 stops parsing arguments, other negative indicates skip */ -typedef int (*BA_ArgCallback)(int argc, char **argv, void *data); +typedef int (*BA_ArgCallback)(int argc, const char **argv, void *data); -struct bArgs *BLI_argsInit(int argc, char **argv); +struct bArgs *BLI_argsInit(int argc, const char **argv); void BLI_argsFree(struct bArgs *ba); /* pass starts at 1, -1 means valid all the time @@ -54,6 +57,6 @@ void BLI_argsPrintArgDoc(struct bArgs *ba, const char *arg); void BLI_argsPrintOtherDoc(struct bArgs *ba); void BLI_argsPrint(struct bArgs *ba); -char **BLI_argsArgv(struct bArgs *ba); +const char **BLI_argsArgv(struct bArgs *ba); #endif diff --git a/source/blender/blenlib/BLI_blenlib.h b/source/blender/blenlib/BLI_blenlib.h index 8423c07e7c9..59d5b5cdef8 100644 --- a/source/blender/blenlib/BLI_blenlib.h +++ b/source/blender/blenlib/BLI_blenlib.h @@ -25,10 +25,14 @@ * Contributor(s): none yet. * * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file BLI_blenlib.h + * \ingroup bli * - * @mainpage BLI - Blender LIbrary external interface + * \section aboutbli Blender LIbrary external interface * - * @section about About the BLI module + * \subsection about About the BLI module * * This is the external interface of the Blender Library. If you find * a call to a BLI function that is not prototyped here, please add a @@ -39,7 +43,7 @@ * allocation/deallocation. There is also a patch to make MS Windows * behave more or less Posix-compliant. * - * @section issues Known issues with BLI + * \subsection issues Known issues with BLI * * - blenlib is written in C. * - The posix-compliancy may move to a separate lib that deals with @@ -51,13 +55,11 @@ * - vectorops.c is close to superfluous. It may disappear in the * near future. * - * @section dependencies Dependencies + * \subsection dependencies Dependencies * - * - The blenlib uses type defines from makesdna/, and functions from + * - The blenlib uses type defines from \ref DNA, and functions from * standard libraries. - * - * $Id$ -*/ + */ #ifndef BLI_BLENLIB_H #define BLI_BLENLIB_H diff --git a/source/blender/blenlib/BLI_boxpack2d.h b/source/blender/blenlib/BLI_boxpack2d.h index 008af55e1d0..886965f66b3 100644 --- a/source/blender/blenlib/BLI_boxpack2d.h +++ b/source/blender/blenlib/BLI_boxpack2d.h @@ -1,6 +1,4 @@ -/** - * - * +/* * ***** BEGIN GPL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or @@ -27,6 +25,13 @@ * ***** END GPL LICENSE BLOCK ***** */ +#ifndef _BLI_BOXPACK2D_H_ +#define _BLI_BOXPACK2D_H_ + +/** \file BLI_boxpack2d.h + * \ingroup bli + */ + /* Box Packer */ typedef struct boxPack { @@ -43,3 +48,5 @@ typedef struct boxPack { void boxPack2D(boxPack *boxarray, const int len, float *tot_width, float *tot_height); +#endif + diff --git a/source/blender/blenlib/BLI_bpath.h b/source/blender/blenlib/BLI_bpath.h index 8c351d6020d..2200ec70789 100644 --- a/source/blender/blenlib/BLI_bpath.h +++ b/source/blender/blenlib/BLI_bpath.h @@ -1,4 +1,4 @@ -/** +/* * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -26,8 +26,11 @@ * ***** END GPL LICENSE BLOCK ***** */ -/* Based on ghash, difference is ghash is not a fixed size, - * so for BPath we dont need to malloc */ +/** \file BLI_bpath.h + * \ingroup bli + * \attention Based on ghash, difference is ghash is not a fixed size, + * so for BPath we dont need to malloc + */ #ifndef BLI_BPATH_H #define BLI_BPATH_H diff --git a/source/blender/blenlib/BLI_cpu.h b/source/blender/blenlib/BLI_cpu.h index d809f1cc594..addcf1273b3 100644 --- a/source/blender/blenlib/BLI_cpu.h +++ b/source/blender/blenlib/BLI_cpu.h @@ -1,5 +1,4 @@ /* - * * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -24,6 +23,10 @@ #ifndef BLI_CPU_H #define BLI_CPU_H +/** \file BLI_cpu.h + * \ingroup bli + */ + int BLI_cpu_support_sse2(void); #endif diff --git a/source/blender/blenlib/BLI_dlrbTree.h b/source/blender/blenlib/BLI_dlrbTree.h index 4b3768c3547..24c819ada55 100644 --- a/source/blender/blenlib/BLI_dlrbTree.h +++ b/source/blender/blenlib/BLI_dlrbTree.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -28,6 +28,11 @@ #ifndef BLI_DLRB_TREE_H #define BLI_DLRB_TREE_H +/** \file BLI_dlrbTree.h + * \ingroup bli + * \author Joshua Leung + */ + /* Double-Linked Red-Black Tree Implementation: * * This is simply a Red-Black Tree implementation whose nodes can later diff --git a/source/blender/blenlib/BLI_dynstr.h b/source/blender/blenlib/BLI_dynstr.h index 34e77007d95..ed7a76daa92 100644 --- a/source/blender/blenlib/BLI_dynstr.h +++ b/source/blender/blenlib/BLI_dynstr.h @@ -1,12 +1,4 @@ -/** - * @file BLI_dynstr.h - * - * A dynamically sized string ADT. - * This ADT is designed purely for dynamic string creation - * through appending, not for general usage, the intent is - * to build up dynamic strings using a DynStr object, then - * convert it to a c-string and work with that. - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -38,6 +30,16 @@ #ifndef BLI_DYNSTR_H #define BLI_DYNSTR_H +/** \file BLI_dynstr.h + * \ingroup bli + * \brief A dynamically sized string ADT. + * \section aboutdynstr Dynamic String + * This ADT is designed purely for dynamic string creation + * through appending, not for general usage, the intent is + * to build up dynamic strings using a DynStr object, then + * convert it to a c-string and work with that. + */ + #include <stdarg.h> struct DynStr; diff --git a/source/blender/blenlib/BLI_edgehash.h b/source/blender/blenlib/BLI_edgehash.h index e74910ddb09..fba13035f02 100644 --- a/source/blender/blenlib/BLI_edgehash.h +++ b/source/blender/blenlib/BLI_edgehash.h @@ -1,6 +1,4 @@ -/** - * A general unordered 2-int pair hash table ADT - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -32,6 +30,12 @@ #ifndef BLI_EDGEHASH_H #define BLI_EDGEHASH_H +/** \file BLI_storage.h + * \ingroup bli + * \author Daniel Dunbar + * \brief A general unordered 2-int pair hash table ADT. + */ + struct EdgeHash; struct EdgeHashIterator; typedef struct EdgeHash EdgeHash; diff --git a/source/blender/blenlib/BLI_editVert.h b/source/blender/blenlib/BLI_editVert.h index 051778772e0..b422b79b165 100644 --- a/source/blender/blenlib/BLI_editVert.h +++ b/source/blender/blenlib/BLI_editVert.h @@ -1,9 +1,4 @@ -/** - * blenlib/BLI_editVert.h mar 2001 Nzc - * - * Some editing types needed in the lib (unfortunately) for - * scanfill.c - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -35,6 +30,14 @@ #ifndef BLI_EDITVERT_H #define BLI_EDITVERT_H +/** \file BLI_editVert.h + * \ingroup bli + * \since March 2001 + * \author nzc + * \brief Some editing types needed in the lib (unfortunately) for + * scanfill.c + */ + #include "DNA_customdata_types.h" #include "DNA_mesh_types.h" diff --git a/source/blender/blenlib/BLI_fileops.h b/source/blender/blenlib/BLI_fileops.h index 95d890f133f..59c01348c07 100644 --- a/source/blender/blenlib/BLI_fileops.h +++ b/source/blender/blenlib/BLI_fileops.h @@ -1,6 +1,4 @@ -/** - * blenlib/BLI_listBase.h mar 2001 Nzc - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -27,8 +25,12 @@ * Contributor(s): none yet. * * ***** END GPL LICENSE BLOCK ***** - * - * More low-level fileops from Daniel Dunbar. Two functions were also + */ + +/** \file BLI_fileops.h + * \ingroup bli + * \author Daniel Dunbar + * \brief More low-level fileops from Daniel Dunbar. Two functions were also * defined in storage.c. These are the old fop_ prefixes. There is * definitely some redundancy here! * */ diff --git a/source/blender/blenlib/BLI_fnmatch.h b/source/blender/blenlib/BLI_fnmatch.h index 1dffb285451..94ae741250f 100644 --- a/source/blender/blenlib/BLI_fnmatch.h +++ b/source/blender/blenlib/BLI_fnmatch.h @@ -18,9 +18,12 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef _FNMATCH_H - #define _FNMATCH_H 1 +/** \file BLI_fnmatch.h + * \ingroup bli + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenlib/BLI_ghash.h b/source/blender/blenlib/BLI_ghash.h index a9fc5662657..dcc71fa1258 100644 --- a/source/blender/blenlib/BLI_ghash.h +++ b/source/blender/blenlib/BLI_ghash.h @@ -1,6 +1,4 @@ -/** - * A general (pointer -> pointer) hash table ADT - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -32,6 +30,11 @@ #ifndef BLI_GHASH_H #define BLI_GHASH_H +/** \file BLI_ghash.h + * \ingroup bli + * \brief A general (pointer -> pointer) hash table ADT + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenlib/BLI_graph.h b/source/blender/blenlib/BLI_graph.h index 1dd439468f7..f625c7bb2d4 100644 --- a/source/blender/blenlib/BLI_graph.h +++ b/source/blender/blenlib/BLI_graph.h @@ -1,6 +1,10 @@ #ifndef BLI_GRAPH_H_ #define BLI_GRAPH_H_ +/** \file BLI_graph.h + * \ingroup bli + */ + #include "DNA_listBase.h" struct BGraph; diff --git a/source/blender/blenlib/BLI_gsqueue.h b/source/blender/blenlib/BLI_gsqueue.h index afc4cb38b10..572c54b7b7e 100644 --- a/source/blender/blenlib/BLI_gsqueue.h +++ b/source/blender/blenlib/BLI_gsqueue.h @@ -1,7 +1,4 @@ /* - * A generic structure queue (a queue for fixed length - * (generally small) structures. - * * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -33,6 +30,12 @@ #ifndef BLI_GSQUEUE_H #define BLI_GSQUEUE_H +/** \file BLI_gsqueue.h + * \ingroup bli + * \brief A generic structure queue (a queue for fixed length + * (generally small) structures. + */ + typedef struct _GSQueue GSQueue; /** diff --git a/source/blender/blenlib/BLI_heap.h b/source/blender/blenlib/BLI_heap.h index a6663726f8b..3038d026df9 100644 --- a/source/blender/blenlib/BLI_heap.h +++ b/source/blender/blenlib/BLI_heap.h @@ -1,6 +1,4 @@ -/** - * A heap / priority queue ADT - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -32,6 +30,11 @@ #ifndef BLI_HEAP_H #define BLI_HEAP_H +/** \file BLI_heap.h + * \ingroup bli + * \brief A heap / priority queue ADT + */ + struct Heap; struct HeapNode; typedef struct Heap Heap; diff --git a/source/blender/blenlib/BLI_jitter.h b/source/blender/blenlib/BLI_jitter.h index f626feb2ec8..e0fea9306ff 100644 --- a/source/blender/blenlib/BLI_jitter.h +++ b/source/blender/blenlib/BLI_jitter.h @@ -1,6 +1,4 @@ /* - * jitter.h - * * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -32,9 +30,13 @@ #ifndef BLI_JITTER_H #define BLI_JITTER_H -extern void BLI_initjit(float *jitarr, int num); -extern void BLI_jitterate1(float *jit1, float *jit2, int num, float rad1); -extern void BLI_jitterate2(float *jit1, float *jit2, int num, float rad2); +/** \file BLI_jitter.h + * \ingroup bli + */ + +void BLI_initjit(float *jitarr, int num); +void BLI_jitterate1(float *jit1, float *jit2, int num, float rad1); +void BLI_jitterate2(float *jit1, float *jit2, int num, float rad2); #endif diff --git a/source/blender/blenlib/BLI_kdopbvh.h b/source/blender/blenlib/BLI_kdopbvh.h index aa55ececc06..d0943408dc5 100644 --- a/source/blender/blenlib/BLI_kdopbvh.h +++ b/source/blender/blenlib/BLI_kdopbvh.h @@ -1,5 +1,4 @@ -/** - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -32,6 +31,12 @@ #ifndef BLI_KDOPBVH_H #define BLI_KDOPBVH_H +/** \file BLI_kdopbvh.h + * \ingroup bli + * \author Daniel Genrich + * \author Andre Pinto + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenlib/BLI_kdtree.h b/source/blender/blenlib/BLI_kdtree.h index 95f9e6939d0..c607dae386f 100644 --- a/source/blender/blenlib/BLI_kdtree.h +++ b/source/blender/blenlib/BLI_kdtree.h @@ -1,6 +1,4 @@ -/** - * A kd-tree for nearest neighbour search. - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -33,6 +31,13 @@ #ifndef BLI_KDTREE_H #define BLI_KDTREE_H +/** \file BLI_kdtree.h + * \ingroup bli + * \brief A kd-tree for nearest neighbour search. + * \author Janne Karhu + * \author Brecht van Lommel + */ + struct KDTree; typedef struct KDTree KDTree; diff --git a/source/blender/blenlib/BLI_linklist.h b/source/blender/blenlib/BLI_linklist.h index b10d48e3ee6..95850c44ea1 100644 --- a/source/blender/blenlib/BLI_linklist.h +++ b/source/blender/blenlib/BLI_linklist.h @@ -1,7 +1,4 @@ /* - * Routines for working with singly linked lists - * of 'links' - pointers to other data. - * * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -33,6 +30,13 @@ #ifndef BLI_LINKLIST_H #define BLI_LINKLIST_H +/** \file BLI_linklist.h + * \ingroup bli + * \brief Routines for working with singly linked lists + * of 'links' - pointers to other data. + * + */ + struct MemArena; typedef void (*LinkNodeFreeFP)(void *link); diff --git a/source/blender/blenlib/BLI_listbase.h b/source/blender/blenlib/BLI_listbase.h index a41b49de242..73af9a3738c 100644 --- a/source/blender/blenlib/BLI_listbase.h +++ b/source/blender/blenlib/BLI_listbase.h @@ -25,13 +25,15 @@ * Contributor(s): none yet. * * ***** END GPL LICENSE BLOCK ***** - * - * $Id$ */ #ifndef BLI_LISTBASE_H #define BLI_LISTBASE_H +/** \file BLI_listbase.h + * \ingroup bli + */ + #include "DNA_listBase.h" //struct ListBase; //struct LinkData; diff --git a/source/blender/blenlib/BLI_math.h b/source/blender/blenlib/BLI_math.h index 29a17f362d4..890a5ee4018 100644 --- a/source/blender/blenlib/BLI_math.h +++ b/source/blender/blenlib/BLI_math.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -28,29 +28,30 @@ #ifndef BLI_MATH_H #define BLI_MATH_H -/* Abbreviations: +/** \file BLI_math.h + * \ingroup bli + * \section mathabbrev Abbreviations * - * fl = float - * db = double - * v2 = vec2 = vector 2 - * v3 = vec3 = vector 3 - * v4 = vec4 = vector 4 - * qt = quat = quaternion - * dq = dquat = dual quaternion - * m2 = mat2 = matrix 2x2 - * m3 = mat3 = matrix 3x3 - * m4 = mat4 = matrix 4x4 - * eul = euler rotation - * eulO = euler with order + * - fl = float + * - db = double + * - v2 = vec2 = vector 2 + * - v3 = vec3 = vector 3 + * - v4 = vec4 = vector 4 + * - qt = quat = quaternion + * - dq = dquat = dual quaternion + * - m2 = mat2 = matrix 2x2 + * - m3 = mat3 = matrix 3x3 + * - m4 = mat4 = matrix 4x4 + * - eul = euler rotation + * - eulO = euler with order * - * Variable Names: - * - * f = single value - * a, b, c = vectors - * r = result vector - * A, B, C = matrices - * R = result matrix + * \section mathvarnames Variable Names * + * - f = single value + * - a, b, c = vectors + * - r = result vector + * - A, B, C = matrices + * - R = result matrix */ #include "BLI_math_base.h" diff --git a/source/blender/blenlib/BLI_math_base.h b/source/blender/blenlib/BLI_math_base.h index 9ab9621be01..6ff57b08724 100644 --- a/source/blender/blenlib/BLI_math_base.h +++ b/source/blender/blenlib/BLI_math_base.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -28,9 +28,9 @@ #ifndef BLI_MATH_BASE_H #define BLI_MATH_BASE_H -#ifdef __cplusplus -extern "C" { -#endif +/** \file BLI_math_base.h + * \ingroup bli + */ #ifdef WIN32 #define _USE_MATH_DEFINES @@ -167,11 +167,12 @@ MINLINE float power_of_2(float f); MINLINE float shell_angle_to_dist(float angle); -double double_round(double x, int ndigits); - -#ifdef __cplusplus -} +#if (defined(WIN32) || defined(WIN64)) && !defined(FREE_WINDOWS) +extern double copysign(double x, double y); +extern double round(double x); #endif +double double_round(double x, int ndigits); + #endif /* BLI_MATH_BASE_H */ diff --git a/source/blender/blenlib/BLI_math_color.h b/source/blender/blenlib/BLI_math_color.h index bf466c0f809..fe09706cb3d 100644 --- a/source/blender/blenlib/BLI_math_color.h +++ b/source/blender/blenlib/BLI_math_color.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -28,6 +28,10 @@ #ifndef BLI_MATH_COLOR_H #define BLI_MATH_COLOR_H +/** \file BLI_math_color.h + * \ingroup bli + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenlib/BLI_math_geom.h b/source/blender/blenlib/BLI_math_geom.h index 8f939e5dc61..8d2f9ffa38b 100644 --- a/source/blender/blenlib/BLI_math_geom.h +++ b/source/blender/blenlib/BLI_math_geom.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -28,6 +28,10 @@ #ifndef BLI_MATH_GEOM_H #define BLI_MATH_GEOM_H +/** \file BLI_math_geom.h + * \ingroup bli + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenlib/BLI_math_inline.h b/source/blender/blenlib/BLI_math_inline.h index d07777c90a8..0f8493e25a6 100644 --- a/source/blender/blenlib/BLI_math_inline.h +++ b/source/blender/blenlib/BLI_math_inline.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -28,6 +28,10 @@ #ifndef BLI_MATH_INLINE_H #define BLI_MATH_INLINE_H +/** \file BLI_math_inline.h + * \ingroup bli + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenlib/BLI_math_matrix.h b/source/blender/blenlib/BLI_math_matrix.h index 475bbe8b4b7..939c4348461 100644 --- a/source/blender/blenlib/BLI_math_matrix.h +++ b/source/blender/blenlib/BLI_math_matrix.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -28,6 +28,10 @@ #ifndef BLI_MATH_MATRIX_H #define BLI_MATH_MATRIX_H +/** \file BLI_math_matrix.h + * \ingroup bli + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenlib/BLI_math_rotation.h b/source/blender/blenlib/BLI_math_rotation.h index 7d0b8dfeaf3..d1f5fa89c3d 100644 --- a/source/blender/blenlib/BLI_math_rotation.h +++ b/source/blender/blenlib/BLI_math_rotation.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -28,6 +28,10 @@ #ifndef BLI_MATH_ROTATION_H #define BLI_MATH_ROTATION_H +/** \file BLI_math_rotation.h + * \ingroup bli + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenlib/BLI_math_vector.h b/source/blender/blenlib/BLI_math_vector.h index dcb9311baa0..5f26bff0ad9 100644 --- a/source/blender/blenlib/BLI_math_vector.h +++ b/source/blender/blenlib/BLI_math_vector.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -28,6 +28,10 @@ #ifndef BLI_MATH_VECTOR_H #define BLI_MATH_VECTOR_H +/** \file BLI_math_vector.h + * \ingroup bli + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenlib/BLI_memarena.h b/source/blender/blenlib/BLI_memarena.h index a17c88b70df..f6e919d8d65 100644 --- a/source/blender/blenlib/BLI_memarena.h +++ b/source/blender/blenlib/BLI_memarena.h @@ -1,6 +1,4 @@ /* - * Memory arena ADT - * * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -27,11 +25,15 @@ * Contributor(s): none yet. * * ***** END GPL LICENSE BLOCK ***** - * + */ + +/** \file BLI_memarena.h + * \ingroup bli + * \brief Memory arena ADT. + * \section aboutmemarena Memory Arena * Memory arena's are commonly used when the program * needs to quickly allocate lots of little bits of * data, which are all freed at the same moment. - * */ #ifndef BLI_MEMARENA_H diff --git a/source/blender/blenlib/BLI_mempool.h b/source/blender/blenlib/BLI_mempool.h index 7c2dc36d533..4ea48929efb 100644 --- a/source/blender/blenlib/BLI_mempool.h +++ b/source/blender/blenlib/BLI_mempool.h @@ -1,7 +1,5 @@ -/** - * Simple fast memory allocator - * - * +/* + * $Id$ * ***** BEGIN GPL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or @@ -31,14 +29,18 @@ #ifndef BLI_MEMPOOL_H #define BLI_MEMPOOL_H -struct BLI_mempool; -typedef struct BLI_mempool BLI_mempool; +/** \file BLI_storage.h + * \ingroup bli + * \author Geoffrey Bantle + * \brief Simple fast memory allocator. + */ -BLI_mempool *BLI_mempool_create(int esize, int tote, int pchunk, int use_sysmalloc); -void *BLI_mempool_alloc(BLI_mempool *pool); -void *BLI_mempool_calloc(BLI_mempool *pool); -void BLI_mempool_free(BLI_mempool *pool, void *addr); -void BLI_mempool_destroy(BLI_mempool *pool); +struct BLI_mempool; +struct BLI_mempool *BLI_mempool_create(int esize, int tote, int pchunk, int use_sysmalloc); +void *BLI_mempool_alloc(struct BLI_mempool *pool); +void *BLI_mempool_calloc(struct BLI_mempool *pool); +void BLI_mempool_free(struct BLI_mempool *pool, void *addr); +void BLI_mempool_destroy(struct BLI_mempool *pool); #endif diff --git a/source/blender/blenlib/BLI_noise.h b/source/blender/blenlib/BLI_noise.h index 11587262645..bd88529b3dc 100644 --- a/source/blender/blenlib/BLI_noise.h +++ b/source/blender/blenlib/BLI_noise.h @@ -31,6 +31,10 @@ #ifndef BLI_NOISE_H #define BLI_NOISE_H +/** \file BLI_noise.h + * \ingroup bli + */ + #ifdef __cplusplus extern "C" { #endif @@ -57,7 +61,6 @@ void voronoi(float x, float y, float z, float* da, float* pa, float me, int dtyp float cellNoise(float x, float y, float z); void cellNoiseV(float x, float y, float z, float *ca); - #ifdef __cplusplus } #endif diff --git a/source/blender/blenlib/BLI_path_util.h b/source/blender/blenlib/BLI_path_util.h index fd710c59e2f..b3d657b7323 100644 --- a/source/blender/blenlib/BLI_path_util.h +++ b/source/blender/blenlib/BLI_path_util.h @@ -1,8 +1,4 @@ -/** - * blenlib/BLI_storage_types.h - * - * Some types for dealing with directories - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -33,6 +29,10 @@ #ifndef BLI_PATH_UTIL_H #define BLI_PATH_UTIL_H +/** \file BLI_path_util.h + * \ingroup bli + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenlib/BLI_pbvh.h b/source/blender/blenlib/BLI_pbvh.h index f89068c885e..4191559771d 100644 --- a/source/blender/blenlib/BLI_pbvh.h +++ b/source/blender/blenlib/BLI_pbvh.h @@ -1,6 +1,4 @@ -/** - * A BVH for high poly meshes. - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -25,6 +23,11 @@ #ifndef BLI_PBVH_H #define BLI_PBVH_H +/** \file BLI_pbvh.h + * \ingroup bli + * \brief A BVH for high poly meshes. + */ + struct MFace; struct MVert; struct DMGridAdjacency; diff --git a/source/blender/blenlib/BLI_rand.h b/source/blender/blenlib/BLI_rand.h index eab9f92d7e8..eb6e71acded 100644 --- a/source/blender/blenlib/BLI_rand.h +++ b/source/blender/blenlib/BLI_rand.h @@ -1,7 +1,4 @@ -/** - * @file BLI_rand.h - * - * Random number functions. +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -33,10 +30,15 @@ #ifndef BLI_RAND_H #define BLI_RAND_H - /* RNG is just an abstract random number generator - * type that avoids using globals, otherwise identical - * to BLI_rand functions below. - */ +/** \file BLI_rand.h + * \ingroup bli + * \brief Random number functions. + */ + +/** RNG is just an abstract random number generator + * type that avoids using globals, otherwise identical + * to BLI_rand functions below. + */ struct RNG; typedef struct RNG RNG; diff --git a/source/blender/blenlib/BLI_rect.h b/source/blender/blenlib/BLI_rect.h index 13b12fc4e1e..021ab636d5b 100644 --- a/source/blender/blenlib/BLI_rect.h +++ b/source/blender/blenlib/BLI_rect.h @@ -31,6 +31,10 @@ #ifndef BLI_RECT_H #define BLI_RECT_H +/** \file BLI_rect.h + * \ingroup bli + */ + struct rctf; struct rcti; diff --git a/source/blender/blenlib/BLI_scanfill.h b/source/blender/blenlib/BLI_scanfill.h index bae5375f757..e2f102c20eb 100644 --- a/source/blender/blenlib/BLI_scanfill.h +++ b/source/blender/blenlib/BLI_scanfill.h @@ -1,8 +1,4 @@ -/** - * blenlib/BLI_scanfill.h mar 2001 Nzc - * - * Filling meshes. - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -34,6 +30,13 @@ #ifndef BLI_SCANFILL_H #define BLI_SCANFILL_H +/** \file BLI_storage.h + * \ingroup bli + * \since March 2001 + * \author nzc + * \brief Filling meshes. + */ + /** * @attention Defined in scanfill.c */ @@ -61,7 +64,7 @@ void BLI_end_edgefill(void); * @param f The function to use as callback * @attention used in creator.c */ -void BLI_setErrorCallBack(void (*f)(char*)); +void BLI_setErrorCallBack(void (*f)(const char*)); /** * Set a function to be able to interrupt the execution of processing diff --git a/source/blender/blenlib/BLI_storage.h b/source/blender/blenlib/BLI_storage.h index 702112f5fec..017f9877baf 100644 --- a/source/blender/blenlib/BLI_storage.h +++ b/source/blender/blenlib/BLI_storage.h @@ -29,6 +29,10 @@ #ifndef BLI_STORAGE_H #define BLI_STORAGE_H +/** \file BLI_storage.h + * \ingroup bli + */ + #ifdef WIN32 /* for size_t, only needed on win32 for some reason */ #include <stddef.h> diff --git a/source/blender/blenlib/BLI_storage_types.h b/source/blender/blenlib/BLI_storage_types.h index c041b33c6a4..0b8746b4c50 100644 --- a/source/blender/blenlib/BLI_storage_types.h +++ b/source/blender/blenlib/BLI_storage_types.h @@ -1,8 +1,4 @@ -/** - * blenlib/BLI_storage_types.h - * - * Some types for dealing with directories - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -33,6 +29,11 @@ #ifndef BLI_STORAGE_TYPES_H #define BLI_STORAGE_TYPES_H +/** \file BLI_storage_types.h + * \ingroup bli + * \brief Some types for dealing with directories. + */ + #include <sys/stat.h> #if defined(WIN32) && !defined(FREE_WINDOWS) diff --git a/source/blender/blenlib/BLI_string.h b/source/blender/blenlib/BLI_string.h index 1427a6c651a..36835e0c9ca 100644 --- a/source/blender/blenlib/BLI_string.h +++ b/source/blender/blenlib/BLI_string.h @@ -32,6 +32,10 @@ #ifndef BLI_STRING_H #define BLI_STRING_H +/** \file BLI_string.h + * \ingroup bli + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenlib/BLI_threads.h b/source/blender/blenlib/BLI_threads.h index ad968deb0c5..5bf5423d312 100644 --- a/source/blender/blenlib/BLI_threads.h +++ b/source/blender/blenlib/BLI_threads.h @@ -31,6 +31,10 @@ #ifndef BLI_THREADS_H #define BLI_THREADS_H +/** \file BLI_threads.h + * \ingroup bli + */ + #include <pthread.h> /* for tables, button in UI, etc */ diff --git a/source/blender/blenlib/BLI_utildefines.h b/source/blender/blenlib/BLI_utildefines.h index 140b424bf8f..b2129a6ab76 100644 --- a/source/blender/blenlib/BLI_utildefines.h +++ b/source/blender/blenlib/BLI_utildefines.h @@ -30,6 +30,10 @@ #ifndef BLI_UTILDEFINES_H #define BLI_UTILDEFINES_H +/** \file BLI_utildefines.h + * \ingroup bli + */ + #ifndef FALSE #define FALSE 0 #endif diff --git a/source/blender/blenlib/BLI_uvproject.h b/source/blender/blenlib/BLI_uvproject.h index cf8bb7cd4b8..54e2090aa50 100644 --- a/source/blender/blenlib/BLI_uvproject.h +++ b/source/blender/blenlib/BLI_uvproject.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -22,6 +22,10 @@ #ifndef BKE_UVPROJECT_H #define BKE_UVPROJECT_H +/** \file BLI_uvproject.h + * \ingroup bli + */ + struct UvCameraInfo; struct Object; diff --git a/source/blender/blenlib/BLI_vfontdata.h b/source/blender/blenlib/BLI_vfontdata.h index 77abb15b953..7a03c1c37fa 100644 --- a/source/blender/blenlib/BLI_vfontdata.h +++ b/source/blender/blenlib/BLI_vfontdata.h @@ -1,9 +1,4 @@ -/** - * @file BLI_vfontdata.h - * - * A structure to represent vector fonts, - * and to load them from PostScript fonts. - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -35,6 +30,12 @@ #ifndef BLI_VFONTDATA_H #define BLI_VFONTDATA_H +/** \file BLI_vfontdata.h + * \ingroup bli + * \brief A structure to represent vector fonts, + * and to load them from PostScript fonts. + */ + #include "DNA_listBase.h" struct PackedFile; diff --git a/source/blender/blenlib/BLI_voxel.h b/source/blender/blenlib/BLI_voxel.h index 63a6c09b0b4..41f8bfab729 100644 --- a/source/blender/blenlib/BLI_voxel.h +++ b/source/blender/blenlib/BLI_voxel.h @@ -1,5 +1,4 @@ -/** - * +/* * ***** BEGIN GPL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or @@ -29,7 +28,11 @@ #ifndef BLI_VOXEL_H #define BLI_VOXEL_H -/* find the index number of a voxel, given x/y/z integer coords and resolution vector */ +/** \file BLI_voxel.h + * \ingroup bli + */ + +/** find the index number of a voxel, given x/y/z integer coords and resolution vector */ #define V_I(x, y, z, res) ( (z)*(res)[1]*(res)[0] + (y)*(res)[0] + (x) ) /* all input coordinates must be in bounding box 0.0 - 1.0 */ diff --git a/source/blender/blenlib/BLI_winstuff.h b/source/blender/blenlib/BLI_winstuff.h index 2b0f548f5dd..0248a6a6b4d 100644 --- a/source/blender/blenlib/BLI_winstuff.h +++ b/source/blender/blenlib/BLI_winstuff.h @@ -1,6 +1,4 @@ -/** - * Compatibility-like things for windows. - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -32,6 +30,11 @@ #ifndef __WINSTUFF_H__ #define __WINSTUFF_H__ +/** \file BLI_winstuff.h + * \ingroup bli + * \brief Compatibility-like things for windows. + */ + #ifdef _WIN32 #ifndef FREE_WINDOWS diff --git a/source/blender/blenlib/intern/BLI_args.c b/source/blender/blenlib/intern/BLI_args.c index 4a62e9d26fd..5237c66435b 100644 --- a/source/blender/blenlib/intern/BLI_args.c +++ b/source/blender/blenlib/intern/BLI_args.c @@ -67,7 +67,7 @@ struct bArgs { ListBase docs; GHash *items; int argc; - char **argv; + const char **argv; int *passes; }; @@ -113,7 +113,7 @@ static bArgument *lookUp(struct bArgs *ba, const char *arg, int pass, int case_s return BLI_ghash_lookup(ba->items, &key); } -bArgs *BLI_argsInit(int argc, char **argv) +bArgs *BLI_argsInit(int argc, const char **argv) { bArgs *ba = MEM_callocN(sizeof(bArgs), "bArgs"); ba->passes = MEM_callocN(sizeof(int) * argc, "bArgs passes"); @@ -146,7 +146,7 @@ void BLI_argsPrint(struct bArgs *ba) } } -char **BLI_argsArgv(struct bArgs *ba) +const char **BLI_argsArgv(struct bArgs *ba) { return ba->argv; } diff --git a/source/blender/blenlib/intern/BLI_kdopbvh.c b/source/blender/blenlib/intern/BLI_kdopbvh.c index d85950ce22d..bdd81a8ad03 100644 --- a/source/blender/blenlib/intern/BLI_kdopbvh.c +++ b/source/blender/blenlib/intern/BLI_kdopbvh.c @@ -161,6 +161,7 @@ static float KDOP_AXES[13][3] = heap[parent] = element; \ } +#if 0 static int ADJUST_MEMORY(void *local_memblock, void **memblock, int new_size, int *max_size, int size_per_item) { int new_max_size = *max_size * 2; @@ -186,7 +187,7 @@ static int ADJUST_MEMORY(void *local_memblock, void **memblock, int new_size, in else return FALSE; } - +#endif ////////////////////////////////////////////////////////////////////////////////////////////////////// // Introsort diff --git a/source/blender/blenlib/intern/BLI_mempool.c b/source/blender/blenlib/intern/BLI_mempool.c index 823841ef152..235cedb6fed 100644 --- a/source/blender/blenlib/intern/BLI_mempool.c +++ b/source/blender/blenlib/intern/BLI_mempool.c @@ -32,6 +32,7 @@ #include "MEM_guardedalloc.h" #include "BLI_blenlib.h" +#include "BLI_mempool.h" #include <string.h> typedef struct BLI_freenode{ diff --git a/source/blender/blenlib/intern/bpath.c b/source/blender/blenlib/intern/bpath.c index 8d316f6df78..473a6172047 100644 --- a/source/blender/blenlib/intern/bpath.c +++ b/source/blender/blenlib/intern/bpath.c @@ -156,9 +156,11 @@ void BLI_bpathIterator_init(struct BPathIterator **bpi_pt, Main *bmain, const ch BLI_bpathIterator_step(bpi); } +#if 0 static void BLI_bpathIterator_alloc(struct BPathIterator **bpi) { *bpi= MEM_mallocN(sizeof(BPathIterator), "BLI_bpathIterator_alloc"); } +#endif void BLI_bpathIterator_free( struct BPathIterator *bpi ) { if (bpi->seqdata.seqar) diff --git a/source/blender/blenlib/intern/jitter.c b/source/blender/blenlib/intern/jitter.c index dfc554394d6..2454c4b1444 100644 --- a/source/blender/blenlib/intern/jitter.c +++ b/source/blender/blenlib/intern/jitter.c @@ -34,6 +34,7 @@ #include "MEM_guardedalloc.h" #include "BLI_rand.h" +#include "BLI_jitter.h" void BLI_jitterate1(float *jit1, float *jit2, int num, float rad1) diff --git a/source/blender/blenlib/intern/math_rotation.c b/source/blender/blenlib/intern/math_rotation.c index 291e7babdbb..0a92218b967 100644 --- a/source/blender/blenlib/intern/math_rotation.c +++ b/source/blender/blenlib/intern/math_rotation.c @@ -1258,7 +1258,7 @@ void eulO_to_mat4(float M[4][4], const float e[3], const short order) /* Convert 3x3 matrix to Euler angles (in radians). */ -void mat3_to_eulO(float eul[3], short order,float M[3][3]) +void mat3_to_eulO(float eul[3], const short order,float M[3][3]) { float eul1[3], eul2[3]; diff --git a/source/blender/blenlib/intern/noise.c b/source/blender/blenlib/intern/noise.c index 96dad590fee..9af1532ce4b 100644 --- a/source/blender/blenlib/intern/noise.c +++ b/source/blender/blenlib/intern/noise.c @@ -36,6 +36,8 @@ #include <math.h> +#include "BLI_noise.h" + /* local */ static float noise3_perlin(float vec[3]); //static float turbulence_perlin(float *point, float lofreq, float hifreq); @@ -388,7 +390,7 @@ static char p[512+2]= { 0xA2,0xA0}; -float g[512+2][3]= { +static float g[512+2][3]= { {0.33783, 0.715698, -0.611206}, {-0.944031, -0.326599, -0.045624}, {-0.101074, -0.416443, -0.903503}, diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c index 1a930e7ff7e..ec137d21033 100644 --- a/source/blender/blenlib/intern/path_util.c +++ b/source/blender/blenlib/intern/path_util.c @@ -1382,7 +1382,7 @@ int BLI_testextensie_glob(const char *str, const char *ext_fnmatch) int BLI_replace_extension(char *path, int maxlen, const char *ext) { - int a; + unsigned int a; for(a=strlen(path)-1; a>=0; a--) if(path[a] == '.' || path[a] == '/' || path[a] == '\\') @@ -1738,7 +1738,7 @@ void BLI_where_am_i(char *fullname, const int maxlen, const char *name) } } -void BLI_where_is_temp(char *fullname, int maxlen, int usertemp) +void BLI_where_is_temp(char *fullname, const int maxlen, int usertemp) { fullname[0] = '\0'; diff --git a/source/blender/blenlib/intern/pbvh.c b/source/blender/blenlib/intern/pbvh.c index 9be42f9f5fc..3c7300f2588 100644 --- a/source/blender/blenlib/intern/pbvh.c +++ b/source/blender/blenlib/intern/pbvh.c @@ -44,22 +44,22 @@ /* Bitmap */ typedef char* BLI_bitmap; -BLI_bitmap BLI_bitmap_new(int tot) +static BLI_bitmap BLI_bitmap_new(int tot) { return MEM_callocN((tot >> 3) + 1, "BLI bitmap"); } -int BLI_bitmap_get(BLI_bitmap b, int index) +static int BLI_bitmap_get(BLI_bitmap b, int index) { return b[index >> 3] & (1 << (index & 7)); } -void BLI_bitmap_set(BLI_bitmap b, int index) +static void BLI_bitmap_set(BLI_bitmap b, int index) { b[index >> 3] |= (1 << (index & 7)); } -void BLI_bitmap_clear(BLI_bitmap b, int index) +static void BLI_bitmap_clear(BLI_bitmap b, int index) { b[index >> 3] &= ~(1 << (index & 7)); } @@ -264,7 +264,7 @@ static int partition_indices(int *prim_indices, int lo, int hi, int axis, } } -void check_partitioning(int *prim_indices, int lo, int hi, int axis, +static void check_partitioning(int *prim_indices, int lo, int hi, int axis, float mid, BBC *prim_bbc, int index_of_2nd_partition) { int i; @@ -405,7 +405,7 @@ static void build_grids_leaf_node(PBVH *bvh, PBVHNode *node) offset and start indicate a range in the array of primitive indices */ -void build_sub(PBVH *bvh, int node_index, BB *cb, BBC *prim_bbc, +static void build_sub(PBVH *bvh, int node_index, BB *cb, BBC *prim_bbc, int offset, int count) { int i, axis, end; @@ -841,7 +841,7 @@ float BLI_pbvh_node_get_tmin(PBVHNode* node) return node->tmin; } -void BLI_pbvh_search_callback_occluded(PBVH *bvh, +static void BLI_pbvh_search_callback_occluded(PBVH *bvh, BLI_pbvh_SearchCallback scb, void *search_data, BLI_pbvh_HitOccludedCallback hcb, void *hit_data) { diff --git a/source/blender/blenlib/intern/rct.c b/source/blender/blenlib/intern/rct.c index aa424c1c2bb..923abf22794 100644 --- a/source/blender/blenlib/intern/rct.c +++ b/source/blender/blenlib/intern/rct.c @@ -34,11 +34,12 @@ * ***** END GPL LICENSE BLOCK ***** * */ - -#include "DNA_vec_types.h" #include <stdio.h> #include <math.h> +#include "DNA_vec_types.h" +#include "BLI_rect.h" + int BLI_rcti_is_empty(rcti * rect) { return ((rect->xmax<=rect->xmin) || diff --git a/source/blender/blenlib/intern/scanfill.c b/source/blender/blenlib/intern/scanfill.c index 1978e7ed7d6..2fa3023be51 100644 --- a/source/blender/blenlib/intern/scanfill.c +++ b/source/blender/blenlib/intern/scanfill.c @@ -30,10 +30,11 @@ #include "MEM_guardedalloc.h" - +#include "BLI_callbacks.h" #include "BLI_editVert.h" #include "BLI_listbase.h" #include "BLI_math.h" +#include "BLI_scanfill.h" /* callbacks for errors and interrupts and some goo */ static void (*BLI_localErrorCallBack)(const char*) = NULL; diff --git a/source/blender/blenlib/intern/time.c b/source/blender/blenlib/intern/time.c index 0992e08b28f..c0554217f68 100644 --- a/source/blender/blenlib/intern/time.c +++ b/source/blender/blenlib/intern/time.c @@ -27,8 +27,9 @@ * ***** END GPL LICENSE BLOCK ***** */ -#ifdef WIN32 #include "PIL_time.h" + +#ifdef WIN32 #include <windows.h> double PIL_check_seconds_timer(void) diff --git a/source/blender/blenlib/intern/uvproject.c b/source/blender/blenlib/intern/uvproject.c index b08f05b4fc8..5b1cd1dc097 100644 --- a/source/blender/blenlib/intern/uvproject.c +++ b/source/blender/blenlib/intern/uvproject.c @@ -28,6 +28,7 @@ #include "DNA_object_types.h" #include "BLI_math.h" +#include "BLI_uvproject.h" typedef struct UvCameraInfo { float camangle; diff --git a/source/blender/blenloader/BLO_readfile.h b/source/blender/blenloader/BLO_readfile.h index 94983791289..024bff98c0f 100644 --- a/source/blender/blenloader/BLO_readfile.h +++ b/source/blender/blenloader/BLO_readfile.h @@ -25,11 +25,15 @@ * Contributor(s): none yet. * * ***** END GPL LICENSE BLOCK ***** - * external readfile function prototypes */ #ifndef BLO_READFILE_H #define BLO_READFILE_H +/** \file BLO_readfile.h + * \ingroup readwrite + * \brief external readfile function prototypes. + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/blenloader/BLO_soundfile.h b/source/blender/blenloader/BLO_soundfile.h index aa37a053e18..60b05535cad 100644 --- a/source/blender/blenloader/BLO_soundfile.h +++ b/source/blender/blenloader/BLO_soundfile.h @@ -29,6 +29,10 @@ #ifndef BLO_SOUNDFILE_H #define BLO_SOUNDFILE_H +/** \file BLO_soundfile.h + * \ingroup readwrite + */ + #include "DNA_sound_types.h" #include "DNA_packedFile_types.h" diff --git a/source/blender/blenloader/BLO_sys_types.h b/source/blender/blenloader/BLO_sys_types.h index e29beb48efb..956ed513852 100644 --- a/source/blender/blenloader/BLO_sys_types.h +++ b/source/blender/blenloader/BLO_sys_types.h @@ -25,6 +25,11 @@ * Contributor(s): none yet. * * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file BLO_sys_types.h + * \ingroup readwrite + * * A platform-independent definition of [u]intXX_t * Plus the accompanying header include for htonl/ntohl * diff --git a/source/blender/blenloader/BLO_undofile.h b/source/blender/blenloader/BLO_undofile.h index 9ec03c4e4d4..c7f0f7f0d1f 100644 --- a/source/blender/blenloader/BLO_undofile.h +++ b/source/blender/blenloader/BLO_undofile.h @@ -31,6 +31,10 @@ #ifndef BLO_UNDOFILE_H #define BLO_UNDOFILE_H +/** \file BLO_undofile.h + * \ingroup readwrite + */ + typedef struct { void *next, *prev; diff --git a/source/blender/blenloader/BLO_writefile.h b/source/blender/blenloader/BLO_writefile.h index 127607232e1..7fdc136980e 100644 --- a/source/blender/blenloader/BLO_writefile.h +++ b/source/blender/blenloader/BLO_writefile.h @@ -25,12 +25,16 @@ * Contributor(s): none yet. * * ***** END GPL LICENSE BLOCK ***** - * external writefile function prototypes */ #ifndef BLO_WRITEFILE_H #define BLO_WRITEFILE_H +/** \file BLO_writefile.h + * \ingroup readwrite + * \brief external writefile function prototypes. + */ + struct MemFile; struct Main; struct ReportList; diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 3ba7d56d8f7..542bfcdcc74 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -8754,7 +8754,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) ima->flag |= IMA_STD_FIELD; } tex->iuser.frames= tex->frames; - tex->iuser.fie_ima= tex->fie_ima; + tex->iuser.fie_ima= (char)tex->fie_ima; tex->iuser.offset= tex->offset; tex->iuser.sfra= tex->sfra; tex->iuser.cycl= (tex->imaflag & TEX_ANIMCYCLIC_)!=0; diff --git a/source/blender/collada/collada_internal.cpp b/source/blender/collada/collada_internal.cpp index 80c8a470888..e8d91fcbb94 100644 --- a/source/blender/collada/collada_internal.cpp +++ b/source/blender/collada/collada_internal.cpp @@ -23,6 +23,8 @@ */ /* COLLADABU_ASSERT, may be able to remove later */ +#include "COLLADABUPlatform.h" + #include "collada_internal.h" UnitConverter::UnitConverter() : unit(), up_axis(COLLADAFW::FileInfo::Z_UP) {} diff --git a/source/blender/collada/collada_internal.h b/source/blender/collada/collada_internal.h index 72b03a3d090..336f66edffd 100644 --- a/source/blender/collada/collada_internal.h +++ b/source/blender/collada/collada_internal.h @@ -21,8 +21,8 @@ * * ***** END GPL LICENSE BLOCK ***** */ -#ifndef BLENDER_COLLADA_H -#define BLENDER_COLLADA_H +#ifndef COLLADA_INTERNAL_H +#define COLLADA_INTERNAL_H #include <string> #include <vector> @@ -89,4 +89,4 @@ extern std::string get_joint_id(Bone *bone, Object *ob_arm); extern std::string get_camera_id(Object *ob); -#endif +#endif /* COLLADA_INTERNAL_H */ diff --git a/source/blender/editors/animation/anim_markers.c b/source/blender/editors/animation/anim_markers.c index 5708c584964..4b5d11962b2 100644 --- a/source/blender/editors/animation/anim_markers.c +++ b/source/blender/editors/animation/anim_markers.c @@ -269,7 +269,7 @@ TimeMarker *ED_markers_get_first_selected(ListBase *markers) /* Print debugging prints of list of markers * BSI's: do NOT make static or put in if-defs as "unused code". That's too much trouble when we need to use for quick debuggging! */ -static void debug_markers_print_list(ListBase *markers) +void debug_markers_print_list(ListBase *markers) { TimeMarker *marker; @@ -341,7 +341,6 @@ static void draw_marker(View2D *v2d, TimeMarker *marker, int cfra, int flag) UI_icon_draw(xpos*xscale-5.0f, 16.0f, icon_id); - glBlendFunc(GL_ONE, GL_ZERO); glDisable(GL_BLEND); /* and the marker name too, shifted slightly to the top-right */ diff --git a/source/blender/editors/animation/fmodifier_ui.c b/source/blender/editors/animation/fmodifier_ui.c index b47fea58633..04e81a7d0bf 100644 --- a/source/blender/editors/animation/fmodifier_ui.c +++ b/source/blender/editors/animation/fmodifier_ui.c @@ -53,10 +53,11 @@ #include "RNA_access.h" - #include "UI_interface.h" #include "UI_resources.h" +#include "ED_anim_api.h" + /* ********************************************** */ /* UI STUFF */ diff --git a/source/blender/editors/animation/keyframes_general.c b/source/blender/editors/animation/keyframes_general.c index 92fce2a77e5..5ceb1293a58 100644 --- a/source/blender/editors/animation/keyframes_general.c +++ b/source/blender/editors/animation/keyframes_general.c @@ -48,6 +48,7 @@ #include "BKE_global.h" #include "RNA_access.h" +#include "RNA_enum_types.h" #include "ED_anim_api.h" #include "ED_keyframing.h" @@ -452,7 +453,7 @@ void sample_fcurve (FCurve *fcu) */ /* globals for copy/paste data (like for other copy/paste buffers) */ -ListBase animcopybuf = {NULL, NULL}; +static ListBase animcopybuf = {NULL, NULL}; static float animcopy_firstframe= 999999999.0f; static float animcopy_lastframe= -999999999.0f; static float animcopy_cfra= 0.0; diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c index 67be382e600..d53ec9f13e5 100644 --- a/source/blender/editors/animation/keyframing.c +++ b/source/blender/editors/animation/keyframing.c @@ -354,7 +354,7 @@ enum { KEYNEEDED_JUSTADD, KEYNEEDED_DELPREV, KEYNEEDED_DELNEXT -} eKeyNeededStatus; +} /*eKeyNeededStatus*/; /* This helper function determines whether a new keyframe is needed */ /* Cases where keyframes should not be added: @@ -1037,7 +1037,7 @@ short delete_keyframe (ReportList *reports, ID *id, bAction *act, const char gro enum { COMMONKEY_MODE_INSERT = 0, COMMONKEY_MODE_DELETE, -} eCommonModifyKey_Modes; +} /*eCommonModifyKey_Modes*/; /* Polling callback for use with ANIM_*_keyframe() operators * This is based on the standard ED_operator_areaactive callback, @@ -1578,7 +1578,7 @@ short fcurve_frame_has_keyframe (FCurve *fcu, float frame, short filter) /* Checks whether an Action has a keyframe for a given frame * Since we're only concerned whether a keyframe exists, we can simply loop until a match is found... */ -short action_frame_has_keyframe (bAction *act, float frame, short filter) +static short action_frame_has_keyframe (bAction *act, float frame, short filter) { FCurve *fcu; @@ -1606,7 +1606,7 @@ short action_frame_has_keyframe (bAction *act, float frame, short filter) } /* Checks whether an Object has a keyframe for a given frame */ -short object_frame_has_keyframe (Object *ob, float frame, short filter) +static short object_frame_has_keyframe (Object *ob, float frame, short filter) { /* error checking */ if (ob == NULL) diff --git a/source/blender/editors/animation/keyingsets.c b/source/blender/editors/animation/keyingsets.c index 40c2f3c3797..930563678dd 100644 --- a/source/blender/editors/animation/keyingsets.c +++ b/source/blender/editors/animation/keyingsets.c @@ -509,7 +509,7 @@ void ANIM_OT_keying_set_active_set (wmOperatorType *ot) /* REGISTERED KEYING SETS */ /* Keying Set Type Info declarations */ -ListBase keyingset_type_infos = {NULL, NULL}; +static ListBase keyingset_type_infos = {NULL, NULL}; /* Built-In Keying Sets (referencing type infos)*/ ListBase builtin_keyingsets = {NULL, NULL}; diff --git a/source/blender/editors/armature/BIF_retarget.h b/source/blender/editors/armature/BIF_retarget.h index acdf07b6466..b1b7c38bddc 100644 --- a/source/blender/editors/armature/BIF_retarget.h +++ b/source/blender/editors/armature/BIF_retarget.h @@ -157,4 +157,8 @@ int RIG_nbJoints(RigGraph *rg); const char *RIG_nameBone(RigGraph *rg, int arc_index, int bone_index); void RIG_freeRigGraph(BGraph *rg); +/* UNUSED */ +void BIF_retargetArmature(bContext *C); +void BIF_adjustRetarget(bContext *C); + #endif /* BIF_RETARGET_H */ diff --git a/source/blender/editors/armature/armature_intern.h b/source/blender/editors/armature/armature_intern.h index fd54d10fd88..d898eddd885 100644 --- a/source/blender/editors/armature/armature_intern.h +++ b/source/blender/editors/armature/armature_intern.h @@ -171,10 +171,17 @@ LinkData *poseAnim_mapping_getNextFCurve(ListBase *fcuLinks, LinkData *prev, cha /* PoseLib */ /* poselib.c */ +void POSELIB_OT_new(struct wmOperatorType *ot); +void POSELIB_OT_unlink(struct wmOperatorType *ot); + +void POSELIB_OT_action_sanitise(struct wmOperatorType *ot); + void POSELIB_OT_pose_add(struct wmOperatorType *ot); void POSELIB_OT_pose_remove(struct wmOperatorType *ot); void POSELIB_OT_pose_rename(struct wmOperatorType *ot); + void POSELIB_OT_browse_interactive(struct wmOperatorType *ot); +void POSELIB_OT_apply_pose(struct wmOperatorType *ot); /* ******************************************************* */ /* Pose Sliding Tools */ diff --git a/source/blender/editors/armature/armature_ops.c b/source/blender/editors/armature/armature_ops.c index e28c7e9a6f1..1abb1c05489 100644 --- a/source/blender/editors/armature/armature_ops.c +++ b/source/blender/editors/armature/armature_ops.c @@ -142,11 +142,17 @@ void ED_operatortypes_armature(void) /* POSELIB */ WM_operatortype_append(POSELIB_OT_browse_interactive); + WM_operatortype_append(POSELIB_OT_apply_pose); WM_operatortype_append(POSELIB_OT_pose_add); WM_operatortype_append(POSELIB_OT_pose_remove); WM_operatortype_append(POSELIB_OT_pose_rename); + WM_operatortype_append(POSELIB_OT_new); + WM_operatortype_append(POSELIB_OT_unlink); + + WM_operatortype_append(POSELIB_OT_action_sanitise); + /* POSE SLIDING */ WM_operatortype_append(POSE_OT_push); WM_operatortype_append(POSE_OT_relax); diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index 94c1edd90d5..2bd840e2c1d 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -3392,9 +3392,10 @@ void ARMATURE_OT_reveal(wmOperatorType *ot) /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; -} -void hide_selected_armature_bones(Scene *scene) +} +#if 0 // remove this? +static void hide_selected_armature_bones(Scene *scene) { Object *obedit= scene->obedit; // XXX get from context bArmature *arm= obedit->data; @@ -3412,8 +3413,6 @@ void hide_selected_armature_bones(Scene *scene) ED_armature_sync_selection(arm->edbo); } - -#if 0 // remove this? static void hide_unselected_armature_bones(Scene *scene) { Object *obedit= scene->obedit; // XXX get from context @@ -3433,9 +3432,7 @@ static void hide_unselected_armature_bones(Scene *scene) ED_armature_validate_active(arm); ED_armature_sync_selection(arm->edbo); } -#endif -#if 0 // remove this? void show_all_armature_bones(Scene *scene) { Object *obedit= scene->obedit; // XXX get from context diff --git a/source/blender/editors/armature/editarmature_retarget.c b/source/blender/editors/armature/editarmature_retarget.c index ee0ed8252c3..a0e465525b2 100644 --- a/source/blender/editors/armature/editarmature_retarget.c +++ b/source/blender/editors/armature/editarmature_retarget.c @@ -98,7 +98,7 @@ typedef enum ARC_USED = 2 } ArcUsageFlags; -RigGraph *GLOBAL_RIGG = NULL; +static RigGraph *GLOBAL_RIGG = NULL; /*******************************************************************************************************/ @@ -157,7 +157,7 @@ static void getEditBoneRollUpAxis(EditBone *bone, float roll, float up_axis[3]) VECCOPY(up_axis, mat[2]); } -float rollBoneByQuatAligned(EditBone *bone, float old_up_axis[3], float qrot[4], float qroll[4], float aligned_axis[3]) +static float rollBoneByQuatAligned(EditBone *bone, float old_up_axis[3], float qrot[4], float qroll[4], float aligned_axis[3]) { float nor[3], new_up_axis[3], x_axis[3], z_axis[3]; @@ -1414,7 +1414,7 @@ static void RIG_findHead(RigGraph *rg) /*******************************************************************************************************/ -void RIG_printNode(RigNode *node, const char name[]) +static void RIG_printNode(RigNode *node, const char name[]) { printf("%s %p %i <%0.3f, %0.3f, %0.3f>\n", name, (void *)node, node->degree, node->p[0], node->p[1], node->p[2]); @@ -1429,7 +1429,7 @@ void RIG_printNode(RigNode *node, const char name[]) } } -void RIG_printArcBones(RigArc *arc) +static void RIG_printArcBones(RigArc *arc) { RigEdge *edge; @@ -1443,7 +1443,7 @@ void RIG_printArcBones(RigArc *arc) printf("\n"); } -void RIG_printCtrl(RigControl *ctrl, char *indent) +static void RIG_printCtrl(RigControl *ctrl, char *indent) { char text[128]; @@ -1456,7 +1456,7 @@ void RIG_printCtrl(RigControl *ctrl, char *indent) printf("%sFlag: %i\n", indent, ctrl->flag); } -void RIG_printLinkedCtrl(RigGraph *rg, EditBone *bone, int tabs) +static void RIG_printLinkedCtrl(RigGraph *rg, EditBone *bone, int tabs) { RigControl *ctrl; char indent[64]; @@ -1480,7 +1480,7 @@ void RIG_printLinkedCtrl(RigGraph *rg, EditBone *bone, int tabs) } } -void RIG_printArc(RigGraph *rg, RigArc *arc) +static void RIG_printArc(RigGraph *rg, RigArc *arc) { RigEdge *edge; @@ -1502,7 +1502,7 @@ void RIG_printArc(RigGraph *rg, RigArc *arc) RIG_printNode((RigNode*)arc->tail, "tail"); } -void RIG_printGraph(RigGraph *rg) +static void RIG_printGraph(RigGraph *rg) { RigArc *arc; @@ -1577,7 +1577,7 @@ RigGraph *RIG_graphFromArmature(const bContext *C, Object *ob, bArmature *arm) return rg; } -RigGraph *armatureSelectedToGraph(bContext *C, Object *ob, bArmature *arm) +static RigGraph *armatureSelectedToGraph(bContext *C, Object *ob, bArmature *arm) { Object *obedit = CTX_data_edit_object(C); Scene *scene = CTX_data_scene(C); @@ -1656,7 +1656,8 @@ static EditBone *add_editbonetolist(char *name, ListBase *list) } #endif -void generateMissingArcsFromNode(RigGraph *rigg, ReebNode *node, int multi_level_limit) +#if 0 /* UNUSED */ +static void generateMissingArcsFromNode(RigGraph *rigg, ReebNode *node, int multi_level_limit) { while (node->multi_level > multi_level_limit && node->link_up) { @@ -1689,7 +1690,7 @@ void generateMissingArcsFromNode(RigGraph *rigg, ReebNode *node, int multi_level } } -void generateMissingArcs(RigGraph *rigg) +static void generateMissingArcs(RigGraph *rigg) { ReebGraph *reebg; int multi_level_limit = 5; @@ -1708,6 +1709,7 @@ void generateMissingArcs(RigGraph *rigg) } } } +#endif /************************************ RETARGETTING *****************************************************/ @@ -2790,7 +2792,7 @@ int RIG_nbJoints(RigGraph *rg) return total; } -void BIF_freeRetarget(void) +static void BIF_freeRetarget(void) { if (GLOBAL_RIGG) { diff --git a/source/blender/editors/armature/editarmature_sketch.c b/source/blender/editors/armature/editarmature_sketch.c index 7a5c14b1dab..c0b77b5feef 100644 --- a/source/blender/editors/armature/editarmature_sketch.c +++ b/source/blender/editors/armature/editarmature_sketch.c @@ -76,9 +76,12 @@ typedef struct SK_GestureAction { GestureApplyFct apply; } SK_GestureAction; -SK_Point boneSnap; -int LAST_SNAP_POINT_VALID = 0; -float LAST_SNAP_POINT[3]; +#if 0 /* UNUSED 2.5 */ +static SK_Point boneSnap; +#endif + +static int LAST_SNAP_POINT_VALID = 0; +static float LAST_SNAP_POINT[3]; typedef struct SK_StrokeIterator { @@ -129,7 +132,7 @@ int sk_hasOverdraw(SK_Sketch *sketch, SK_Stroke *stk); /******************** GESTURE ACTIONS ******************************/ -SK_GestureAction GESTURE_ACTIONS[] = +static SK_GestureAction GESTURE_ACTIONS[] = { {"Cut", sk_detectCutGesture, sk_applyCutGesture}, {"Trim", sk_detectTrimGesture, sk_applyTrimGesture}, @@ -143,10 +146,10 @@ SK_GestureAction GESTURE_ACTIONS[] = /******************** TEMPLATES UTILS *************************/ -char *TEMPLATES_MENU = NULL; -int TEMPLATES_CURRENT = 0; -GHash *TEMPLATES_HASH = NULL; -RigGraph *TEMPLATE_RIGG = NULL; +static char *TEMPLATES_MENU = NULL; +static int TEMPLATES_CURRENT = 0; +static GHash *TEMPLATES_HASH = NULL; +static RigGraph *TEMPLATE_RIGG = NULL; void BIF_makeListTemplates(const bContext *C) { @@ -240,7 +243,7 @@ int BIF_currentTemplate(const bContext *C) return TEMPLATES_CURRENT; } -RigGraph* sk_makeTemplateGraph(const bContext *C, Object *ob) +static RigGraph* sk_makeTemplateGraph(const bContext *C, Object *ob) { Object *obedit = CTX_data_edit_object(C); if (ob == obedit) @@ -348,7 +351,7 @@ void BIF_setTemplate(bContext *C, int index) /*********************** CONVERSION ***************************/ -void sk_autoname(bContext *C, ReebArc *arc) +static void sk_autoname(bContext *C, ReebArc *arc) { ToolSettings *ts = CTX_data_tool_settings(C); if (ts->skgen_retarget_options & SK_RETARGET_AUTONAME) @@ -396,7 +399,7 @@ void sk_autoname(bContext *C, ReebArc *arc) } } -ReebNode *sk_pointToNode(SK_Point *pt, float imat[][4], float tmat[][3]) +static ReebNode *sk_pointToNode(SK_Point *pt, float imat[][4], float tmat[][3]) { ReebNode *node; @@ -410,7 +413,7 @@ ReebNode *sk_pointToNode(SK_Point *pt, float imat[][4], float tmat[][3]) return node; } -ReebArc *sk_strokeToArc(SK_Stroke *stk, float imat[][4], float tmat[][3]) +static ReebArc *sk_strokeToArc(SK_Stroke *stk, float imat[][4], float tmat[][3]) { ReebArc *arc; int i; @@ -434,7 +437,7 @@ ReebArc *sk_strokeToArc(SK_Stroke *stk, float imat[][4], float tmat[][3]) return arc; } -void sk_retargetStroke(bContext *C, SK_Stroke *stk) +static void sk_retargetStroke(bContext *C, SK_Stroke *stk) { ToolSettings *ts = CTX_data_tool_settings(C); Object *obedit = CTX_data_edit_object(C); @@ -465,7 +468,7 @@ void sk_retargetStroke(bContext *C, SK_Stroke *stk) /**************************************************************/ -void sk_cancelStroke(SK_Sketch *sketch) +static void sk_cancelStroke(SK_Sketch *sketch) { if (sketch->active_stroke != NULL) { @@ -475,18 +478,18 @@ void sk_cancelStroke(SK_Sketch *sketch) } -float sk_clampPointSize(SK_Point *pt, float size) +static float sk_clampPointSize(SK_Point *pt, float size) { return MAX2(size * pt->size, size / 2); } -void sk_drawPoint(GLUquadric *quad, SK_Point *pt, float size) +static void sk_drawPoint(GLUquadric *quad, SK_Point *pt, float size) { glTranslatef(pt->p[0], pt->p[1], pt->p[2]); gluSphere(quad, sk_clampPointSize(pt, size), 8, 8); } -void sk_drawEdge(GLUquadric *quad, SK_Point *pt0, SK_Point *pt1, float size) +static void sk_drawEdge(GLUquadric *quad, SK_Point *pt0, SK_Point *pt1, float size) { float vec1[3], vec2[3] = {0, 0, 1}, axis[3]; float angle, length; @@ -507,7 +510,7 @@ void sk_drawEdge(GLUquadric *quad, SK_Point *pt0, SK_Point *pt1, float size) gluCylinder(quad, sk_clampPointSize(pt1, size), sk_clampPointSize(pt0, size), length, 8, 8); } -void sk_drawNormal(GLUquadric *quad, SK_Point *pt, float size, float height) +static void sk_drawNormal(GLUquadric *quad, SK_Point *pt, float size, float height) { float vec2[3] = {0, 0, 1}, axis[3]; float angle; @@ -531,7 +534,7 @@ void sk_drawNormal(GLUquadric *quad, SK_Point *pt, float size, float height) glPopMatrix(); } -void sk_drawStroke(SK_Stroke *stk, int id, float color[3], int start, int end) +static void sk_drawStroke(SK_Stroke *stk, int id, float color[3], int start, int end) { float rgb[3]; int i; @@ -607,7 +610,7 @@ void sk_drawStroke(SK_Stroke *stk, int id, float color[3], int start, int end) gluDeleteQuadric(quad); } -void drawSubdividedStrokeBy(ToolSettings *toolsettings, BArcIterator *iter, NextSubdivisionFunc next_subdividion) +static void drawSubdividedStrokeBy(ToolSettings *toolsettings, BArcIterator *iter, NextSubdivisionFunc next_subdividion) { SK_Stroke *stk = ((SK_StrokeIterator*)iter)->stroke; float head[3], tail[3]; @@ -643,7 +646,7 @@ void drawSubdividedStrokeBy(ToolSettings *toolsettings, BArcIterator *iter, Next gluDeleteQuadric(quad); } -void sk_drawStrokeSubdivision(ToolSettings *toolsettings, SK_Stroke *stk) +static void sk_drawStrokeSubdivision(ToolSettings *toolsettings, SK_Stroke *stk) { int head_index = -1; int i; @@ -694,7 +697,7 @@ void sk_drawStrokeSubdivision(ToolSettings *toolsettings, SK_Stroke *stk) } } -SK_Point *sk_snapPointStroke(bContext *C, SK_Stroke *stk, short mval[2], int *dist, int *index, int all_pts) +static SK_Point *sk_snapPointStroke(bContext *C, SK_Stroke *stk, short mval[2], int *dist, int *index, int all_pts) { ARegion *ar = CTX_wm_region(C); SK_Point *pt = NULL; @@ -727,7 +730,8 @@ SK_Point *sk_snapPointStroke(bContext *C, SK_Stroke *stk, short mval[2], int *di return pt; } -SK_Point *sk_snapPointArmature(bContext *C, Object *ob, ListBase *ebones, short mval[2], int *dist) +#if 0 /* UNUSED 2.5 */ +static SK_Point *sk_snapPointArmature(bContext *C, Object *ob, ListBase *ebones, short mval[2], int *dist) { ARegion *ar = CTX_wm_region(C); SK_Point *pt = NULL; @@ -774,6 +778,7 @@ SK_Point *sk_snapPointArmature(bContext *C, Object *ob, ListBase *ebones, short return pt; } +#endif void sk_resetOverdraw(SK_Sketch *sketch) { @@ -791,7 +796,7 @@ int sk_hasOverdraw(SK_Sketch *sketch, SK_Stroke *stk) (sketch->over.start != -1 || sketch->over.end != -1); } -void sk_updateOverdraw(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd) +static void sk_updateOverdraw(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd) { if (sketch->over.target == NULL) { @@ -868,7 +873,7 @@ void sk_updateOverdraw(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawDa } /* return 1 on reverse needed */ -int sk_adjustIndexes(SK_Sketch *sketch, int *start, int *end) +static int sk_adjustIndexes(SK_Sketch *sketch, int *start, int *end) { int retval = 0; @@ -896,7 +901,7 @@ int sk_adjustIndexes(SK_Sketch *sketch, int *start, int *end) return retval; } -void sk_endOverdraw(SK_Sketch *sketch) +static void sk_endOverdraw(SK_Sketch *sketch) { SK_Stroke *stk = sketch->active_stroke; @@ -925,7 +930,7 @@ void sk_endOverdraw(SK_Sketch *sketch) } -void sk_startStroke(SK_Sketch *sketch) +static void sk_startStroke(SK_Sketch *sketch) { SK_Stroke *stk = sk_createStroke(); @@ -935,7 +940,7 @@ void sk_startStroke(SK_Sketch *sketch) sk_resetOverdraw(sketch); } -void sk_endStroke(bContext *C, SK_Sketch *sketch) +static void sk_endStroke(bContext *C, SK_Sketch *sketch) { ToolSettings *ts = CTX_data_tool_settings(C); sk_shrinkStrokeBuffer(sketch->active_stroke); @@ -948,7 +953,7 @@ void sk_endStroke(bContext *C, SK_Sketch *sketch) sketch->active_stroke = NULL; } -void sk_updateDrawData(SK_DrawData *dd) +static void sk_updateDrawData(SK_DrawData *dd) { dd->type = PT_CONTINUOUS; @@ -956,7 +961,7 @@ void sk_updateDrawData(SK_DrawData *dd) dd->previous_mval[1] = dd->mval[1]; } -float sk_distanceDepth(bContext *C, float p1[3], float p2[3]) +static float sk_distanceDepth(bContext *C, float p1[3], float p2[3]) { ARegion *ar = CTX_wm_region(C); RegionView3D *rv3d = ar->regiondata; @@ -977,7 +982,7 @@ float sk_distanceDepth(bContext *C, float p1[3], float p2[3]) return distance; } -void sk_interpolateDepth(bContext *C, SK_Stroke *stk, int start, int end, float length, float distance) +static void sk_interpolateDepth(bContext *C, SK_Stroke *stk, int start, int end, float length, float distance) { ARegion *ar = CTX_wm_region(C); ScrArea *sa = CTX_wm_area(C); @@ -1004,7 +1009,7 @@ void sk_interpolateDepth(bContext *C, SK_Stroke *stk, int start, int end, float } } -void sk_projectDrawPoint(bContext *C, float vec[3], SK_Stroke *stk, SK_DrawData *dd) +static void sk_projectDrawPoint(bContext *C, float vec[3], SK_Stroke *stk, SK_DrawData *dd) { ARegion *ar = CTX_wm_region(C); /* copied from grease pencil, need fixing */ @@ -1026,7 +1031,7 @@ void sk_projectDrawPoint(bContext *C, float vec[3], SK_Stroke *stk, SK_DrawData sub_v3_v3v3(vec, fp, dvec); } -int sk_getStrokeDrawPoint(bContext *C, SK_Point *pt, SK_Sketch *UNUSED(sketch), SK_Stroke *stk, SK_DrawData *dd) +static int sk_getStrokeDrawPoint(bContext *C, SK_Point *pt, SK_Sketch *UNUSED(sketch), SK_Stroke *stk, SK_DrawData *dd) { pt->type = dd->type; pt->mode = PT_PROJECT; @@ -1035,7 +1040,7 @@ int sk_getStrokeDrawPoint(bContext *C, SK_Point *pt, SK_Sketch *UNUSED(sketch), return 1; } -int sk_addStrokeDrawPoint(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd) +static int sk_addStrokeDrawPoint(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd) { ARegion *ar = CTX_wm_region(C); RegionView3D *rv3d = ar->regiondata; @@ -1050,7 +1055,7 @@ int sk_addStrokeDrawPoint(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_Dra return 1; } -int sk_getStrokeSnapPoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd) +static int sk_getStrokeSnapPoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd) { ToolSettings *ts = CTX_data_tool_settings(C); int point_added = 0; @@ -1206,7 +1211,7 @@ int sk_getStrokeSnapPoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, SK_Strok return point_added; } -int sk_addStrokeSnapPoint(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd) +static int sk_addStrokeSnapPoint(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd) { int point_added; ARegion *ar = CTX_wm_region(C); @@ -1257,7 +1262,7 @@ int sk_addStrokeSnapPoint(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_Dra return point_added; } -void sk_addStrokePoint(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd, short snap) +static void sk_addStrokePoint(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd, short snap) { ToolSettings *ts = CTX_data_tool_settings(C); int point_added = 0; @@ -1278,7 +1283,7 @@ void sk_addStrokePoint(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawDa } } -void sk_getStrokePoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd, short snap) +static void sk_getStrokePoint(bContext *C, SK_Point *pt, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd, short snap) { int point_added = 0; @@ -1466,7 +1471,7 @@ static int iteratorStopped(void *arg) } } -void sk_convertStroke(bContext *C, SK_Stroke *stk) +static void sk_convertStroke(bContext *C, SK_Stroke *stk) { Object *obedit = CTX_data_edit_object(C); ToolSettings *ts = CTX_data_tool_settings(C); @@ -1558,7 +1563,7 @@ void sk_convertStroke(bContext *C, SK_Stroke *stk) } } -void sk_convert(bContext *C, SK_Sketch *sketch) +static void sk_convert(bContext *C, SK_Sketch *sketch) { ToolSettings *ts = CTX_data_tool_settings(C); SK_Stroke *stk; @@ -1584,7 +1589,7 @@ void sk_convert(bContext *C, SK_Sketch *sketch) /* returns the number of self intersections */ -int sk_getSelfIntersections(bContext *C, ListBase *list, SK_Stroke *gesture) +static int sk_getSelfIntersections(bContext *C, ListBase *list, SK_Stroke *gesture) { ARegion *ar = CTX_wm_region(C); int added = 0; @@ -1633,7 +1638,7 @@ int sk_getSelfIntersections(bContext *C, ListBase *list, SK_Stroke *gesture) return added; } -int cmpIntersections(void *i1, void *i2) +static int cmpIntersections(void *i1, void *i2) { SK_Intersection *isect1 = i1, *isect2 = i2; @@ -1665,7 +1670,7 @@ int cmpIntersections(void *i1, void *i2) /* returns the maximum number of intersections per stroke */ -int sk_getIntersections(bContext *C, ListBase *list, SK_Sketch *sketch, SK_Stroke *gesture) +static int sk_getIntersections(bContext *C, ListBase *list, SK_Sketch *sketch, SK_Stroke *gesture) { ARegion *ar = CTX_wm_region(C); ScrArea *sa = CTX_wm_area(C); @@ -1735,7 +1740,7 @@ int sk_getIntersections(bContext *C, ListBase *list, SK_Sketch *sketch, SK_Strok return added; } -int sk_getSegments(SK_Stroke *segments, SK_Stroke *gesture) +static int sk_getSegments(SK_Stroke *segments, SK_Stroke *gesture) { SK_StrokeIterator sk_iter; BArcIterator *iter = (BArcIterator*)&sk_iter; @@ -2124,7 +2129,7 @@ static void sk_freeGesture(SK_Gesture *gest) BLI_freelistN(&gest->self_intersections); } -void sk_applyGesture(bContext *C, SK_Sketch *sketch) +static void sk_applyGesture(bContext *C, SK_Sketch *sketch) { SK_Gesture gest; SK_GestureAction *act; @@ -2147,7 +2152,7 @@ void sk_applyGesture(bContext *C, SK_Sketch *sketch) /********************************************/ -int sk_selectStroke(bContext *C, SK_Sketch *sketch, short mval[2], int extend) +static int sk_selectStroke(bContext *C, SK_Sketch *sketch, short mval[2], int extend) { ViewContext vc; rcti rect; @@ -2198,7 +2203,8 @@ int sk_selectStroke(bContext *C, SK_Sketch *sketch, short mval[2], int extend) return 0; } -void sk_queueRedrawSketch(SK_Sketch *sketch) +#if 0 /* UNUSED 2.5 */ +static void sk_queueRedrawSketch(SK_Sketch *sketch) { if (sketch->active_stroke != NULL) { @@ -2211,8 +2217,9 @@ void sk_queueRedrawSketch(SK_Sketch *sketch) } } } +#endif -void sk_drawSketch(Scene *scene, View3D *UNUSED(v3d), SK_Sketch *sketch, int with_names) +static void sk_drawSketch(Scene *scene, View3D *UNUSED(v3d), SK_Sketch *sketch, int with_names) { ToolSettings *ts= scene->toolsettings; SK_Stroke *stk; @@ -2340,7 +2347,7 @@ void sk_drawSketch(Scene *scene, View3D *UNUSED(v3d), SK_Sketch *sketch, int wit } } -int sk_finish_stroke(bContext *C, SK_Sketch *sketch) +static int sk_finish_stroke(bContext *C, SK_Sketch *sketch) { ToolSettings *ts = CTX_data_tool_settings(C); @@ -2375,7 +2382,7 @@ int sk_finish_stroke(bContext *C, SK_Sketch *sketch) return 0; } -void sk_start_draw_stroke(SK_Sketch *sketch) +static void sk_start_draw_stroke(SK_Sketch *sketch) { if (sketch->active_stroke == NULL) { @@ -2386,12 +2393,12 @@ void sk_start_draw_stroke(SK_Sketch *sketch) } } -void sk_start_draw_gesture(SK_Sketch *sketch) +static void sk_start_draw_gesture(SK_Sketch *sketch) { sketch->gesture = sk_createStroke(); } -int sk_draw_stroke(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd, short snap) +static int sk_draw_stroke(bContext *C, SK_Sketch *sketch, SK_Stroke *stk, SK_DrawData *dd, short snap) { if (sk_stroke_filtermval(dd)) { @@ -2769,7 +2776,7 @@ int ED_operator_sketch_mode_active_stroke(bContext *C) } } -int ED_operator_sketch_mode_gesture(bContext *C) +static int ED_operator_sketch_mode_gesture(bContext *C) { ToolSettings *ts = CTX_data_tool_settings(C); SK_Sketch *sketch = contextSketch(C, 0); diff --git a/source/blender/editors/armature/meshlaplacian.c b/source/blender/editors/armature/meshlaplacian.c index c0600ceed1c..4d78c9e2f7b 100644 --- a/source/blender/editors/armature/meshlaplacian.c +++ b/source/blender/editors/armature/meshlaplacian.c @@ -57,6 +57,7 @@ #include "BLO_sys_types.h" // for intptr_t support #include "ED_mesh.h" +#include "ED_armature.h" #include "meshlaplacian.h" @@ -237,7 +238,7 @@ static void laplacian_triangle_weights(LaplacianSystem *sys, int f, int i1, int } } -LaplacianSystem *laplacian_system_construct_begin(int totvert, int totface, int lsq) +static LaplacianSystem *laplacian_system_construct_begin(int totvert, int totface, int lsq) { LaplacianSystem *sys; @@ -279,7 +280,7 @@ void laplacian_add_triangle(LaplacianSystem *sys, int v1, int v2, int v3) sys->totface++; } -void laplacian_system_construct_end(LaplacianSystem *sys) +static void laplacian_system_construct_end(LaplacianSystem *sys) { int (*face)[3]; int a, totvert=sys->totvert, totface=sys->totface; @@ -330,7 +331,7 @@ void laplacian_system_construct_end(LaplacianSystem *sys) sys->edgehash= NULL; } -void laplacian_system_delete(LaplacianSystem *sys) +static void laplacian_system_delete(LaplacianSystem *sys) { if(sys->verts) MEM_freeN(sys->verts); if(sys->varea) MEM_freeN(sys->varea); @@ -565,7 +566,7 @@ static void heat_set_H(LaplacianSystem *sys, int vertex) sys->heat.H[vertex]= h; } -void heat_calc_vnormals(LaplacianSystem *sys) +static void heat_calc_vnormals(LaplacianSystem *sys) { float fnor[3]; int a, v1, v2, v3, (*face)[3]; diff --git a/source/blender/editors/armature/poselib.c b/source/blender/editors/armature/poselib.c index 9c7911715b4..9577c45de50 100644 --- a/source/blender/editors/armature/poselib.c +++ b/source/blender/editors/armature/poselib.c @@ -49,6 +49,8 @@ #include "BKE_action.h" #include "BKE_armature.h" #include "BKE_depsgraph.h" +#include "BKE_idprop.h" +#include "BKE_library.h" #include "BKE_context.h" #include "BKE_report.h" @@ -95,41 +97,11 @@ static void action_set_activemarker(void *UNUSED(a), void *UNUSED(b), void *UNUS */ /* ************************************************************* */ -/* gets list of poses in poselib as a string usable for pupmenu() */ -char *poselib_build_poses_menu (bAction *act, char title[]) -{ - DynStr *pupds= BLI_dynstr_new(); - TimeMarker *marker; - char *str; - char buf[64]; - int i; - - /* add title first */ - sprintf(buf, "%s%%t|", title); - BLI_dynstr_append(pupds, buf); - - /* loop through markers, adding them */ - for (marker=act->markers.first, i=1; marker; marker=marker->next, i++) { - BLI_dynstr_append(pupds, marker->name); - - sprintf(buf, "%%x%d", i); - BLI_dynstr_append(pupds, buf); - - if (marker->next) - BLI_dynstr_append(pupds, "|"); - } - - /* convert to normal MEM_malloc'd string */ - str= BLI_dynstr_get_cstring(pupds); - BLI_dynstr_free(pupds); - - return str; -} /* gets the first available frame in poselib to store a pose on * - frames start from 1, and a pose should occur on every frame... 0 is error! */ -int poselib_get_free_index (bAction *act) +static int poselib_get_free_index (bAction *act) { TimeMarker *marker; int low=0, high=0; @@ -160,7 +132,7 @@ int poselib_get_free_index (bAction *act) } /* returns the active pose for a poselib */ -TimeMarker *poselib_get_active_pose (bAction *act) +static TimeMarker *poselib_get_active_pose (bAction *act) { if ((act) && (act->active_marker)) return BLI_findlink(&act->markers, act->active_marker-1); @@ -168,10 +140,28 @@ TimeMarker *poselib_get_active_pose (bAction *act) return NULL; } -/* ************************************************************* */ +/* Get object that Pose Lib should be found on */ +static Object *get_poselib_object (bContext *C) +{ + ScrArea *sa = CTX_wm_area(C); + + if (sa->spacetype == SPACE_BUTS) + return CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + else + return ED_object_pose_armature(CTX_data_active_object(C)); +} + +/* Poll callback for operators that require existing PoseLib data (with poses) to work */ +static int has_poselib_pose_data_poll (bContext *C) +{ + Object *ob = get_poselib_object(C); + return (ob && ob->poselib); +} + +/* ----------------------------------- */ /* Initialise a new poselib (whether it is needed or not) */ -bAction *poselib_init_new (Object *ob) +static bAction *poselib_init_new (Object *ob) { /* sanity checks - only for armatures */ if (ELEM(NULL, ob, ob->pose)) @@ -179,14 +169,14 @@ bAction *poselib_init_new (Object *ob) /* init object's poselib action (unlink old one if there) */ if (ob->poselib) - ob->poselib->id.us--; + id_us_min(&ob->poselib->id); ob->poselib= add_empty_action("PoseLib"); return ob->poselib; } /* Initialise a new poselib (checks if that needs to happen) */ -bAction *poselib_validate (Object *ob) +static bAction *poselib_validate (Object *ob) { if (ELEM(NULL, ob, ob->pose)) return NULL; @@ -196,29 +186,102 @@ bAction *poselib_validate (Object *ob) return ob->poselib; } +/* ************************************************************* */ +/* Pose Lib UI Operators */ + +static int poselib_new_exec (bContext *C, wmOperator *UNUSED(op)) +{ + Object *ob = get_poselib_object(C); + + /* sanity checks */ + if (ob == NULL) + return OPERATOR_CANCELLED; + + /* new method here deals with the rest... */ + poselib_init_new(ob); + + /* notifier here might evolve? */ + WM_event_add_notifier(C, NC_OBJECT|ND_POSE, NULL); + + return OPERATOR_FINISHED; +} + +void POSELIB_OT_new (wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "New Pose Library"; + ot->idname = "POSELIB_OT_new"; + ot->description = "Add New Pose Library to active Object"; + + /* callbacks */ + ot->exec = poselib_new_exec; + ot->poll= ED_operator_posemode; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/* ------------------------------------------------ */ + +static int poselib_unlink_exec (bContext *C, wmOperator *UNUSED(op)) +{ + Object *ob = get_poselib_object(C); + + /* sanity checks */ + if (ELEM(NULL, ob, ob->poselib)) + return OPERATOR_CANCELLED; + + /* there should be a poselib (we just checked above!), so just lower its user count and remove */ + id_us_min(&ob->poselib->id); + ob->poselib = NULL; + + /* notifier here might evolve? */ + WM_event_add_notifier(C, NC_OBJECT|ND_POSE, NULL); + + return OPERATOR_FINISHED; +} + +void POSELIB_OT_unlink (wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Unlink Pose Library"; + ot->idname = "POSELIB_OT_unlink"; + ot->description = "Remove Pose Library from active Object"; + + /* callbacks */ + ot->exec = poselib_unlink_exec; + ot->poll= has_poselib_pose_data_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/* ************************************************************* */ +/* Pose Editing Operators */ /* This tool automagically generates/validates poselib data so that it corresponds to the data * in the action. This is for use in making existing actions usable as poselibs. */ -// TODO: operatorfy me! -void poselib_validate_act (bAction *act) +static int poselib_sanitise_exec (bContext *C, wmOperator *op) { - DLRBT_Tree keys = {NULL, NULL}; + Object *ob = get_poselib_object(C); + bAction *act = (ob)? ob->poselib : NULL; + DLRBT_Tree keys; ActKeyColumn *ak; TimeMarker *marker, *markern; - /* validate action and poselib */ + /* validate action */ if (act == NULL) { - //error("No Action to validate"); - return; + BKE_report(op->reports, RPT_WARNING, "No Action to validate"); + return OPERATOR_CANCELLED; } /* determine which frames have keys */ BLI_dlrbTree_init(&keys); - action_to_keylist(NULL, act, &keys, NULL); + action_to_keylist(NULL, act, &keys, NULL); BLI_dlrbTree_linkedlist_sync(&keys); - /* for each key, make sure there is a correspnding pose */ + /* for each key, make sure there is a corresponding pose */ for (ak= keys.first; ak; ak= ak->next) { /* check if any pose matches this */ // TODO: don't go looking through the list like this every time... @@ -231,13 +294,10 @@ void poselib_validate_act (bAction *act) /* add new if none found */ if (marker == NULL) { - char name[64]; - /* add pose to poselib */ marker= MEM_callocN(sizeof(TimeMarker), "ActionMarker"); - strcpy(name, "Pose"); - BLI_strncpy(marker->name, name, sizeof(marker->name)); + BLI_strncpy(marker->name, "Pose", sizeof(marker->name)); marker->frame= (int)ak->cfra; marker->flag= -1; @@ -257,21 +317,31 @@ void poselib_validate_act (bAction *act) } /* free temp memory */ - BLI_freelistN((ListBase *)&keys); + BLI_dlrbTree_free(&keys); - //BIF_undo_push("PoseLib Validate Action"); + return OPERATOR_FINISHED; } -/* ************************************************************* */ - -/* Pointers to the builtin KeyingSets that we want to use */ -static KeyingSet *poselib_ks_locrotscale = NULL; /* the only keyingset we'll need */ +void POSELIB_OT_action_sanitise (wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Sanitise Pose Library Action"; + ot->idname = "POSELIB_OT_action_sanitise"; + ot->description = "Make action suitable for use as a Pose Library"; + + /* callbacks */ + ot->exec = poselib_sanitise_exec; + ot->poll = has_poselib_pose_data_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} -/* ----- */ +/* ------------------------------------------ */ static void poselib_add_menu_invoke__replacemenu (bContext *C, uiLayout *layout, void *UNUSED(arg)) { - Object *ob= ED_object_pose_armature(CTX_data_active_object(C)); + Object *ob= get_poselib_object(C); bAction *act= ob->poselib; TimeMarker *marker; @@ -294,14 +364,13 @@ static void poselib_add_menu_invoke__replacemenu (bContext *C, uiLayout *layout, static int poselib_add_menu_invoke (bContext *C, wmOperator *op, wmEvent *UNUSED(evt)) { Scene *scene= CTX_data_scene(C); - Object *ob= ED_object_pose_armature(CTX_data_active_object(C)); - bArmature *arm= (ob) ? ob->data : NULL; + Object *ob= get_poselib_object(C); bPose *pose= (ob) ? ob->pose : NULL; uiPopupMenu *pup; uiLayout *layout; /* sanity check */ - if (ELEM3(NULL, ob, arm, pose)) + if (ELEM(NULL, ob, pose)) return OPERATOR_CANCELLED; /* start building */ @@ -330,16 +399,16 @@ static int poselib_add_menu_invoke (bContext *C, wmOperator *op, wmEvent *UNUSED static int poselib_add_exec (bContext *C, wmOperator *op) { - Object *ob= ED_object_pose_armature(CTX_data_active_object(C)); + Object *ob= get_poselib_object(C); bAction *act = poselib_validate(ob); - bArmature *arm= (ob) ? ob->data : NULL; bPose *pose= (ob) ? ob->pose : NULL; TimeMarker *marker; + KeyingSet *ks= ANIM_builtin_keyingset_get_named(NULL, "Whole Character"); /* this includes custom props :)*/ int frame= RNA_int_get(op->ptr, "frame"); char name[64]; /* sanity check (invoke should have checked this anyway) */ - if (ELEM3(NULL, ob, arm, pose)) + if (ELEM(NULL, ob, pose)) return OPERATOR_CANCELLED; /* get name to give to pose */ @@ -367,12 +436,10 @@ static int poselib_add_exec (bContext *C, wmOperator *op) /* validate name */ BLI_uniquename(&act->markers, marker, "Pose", '.', offsetof(TimeMarker, name), sizeof(marker->name)); - /* KeyingSet to use depends on rotation mode (but that's handled by the templates code) */ - if (poselib_ks_locrotscale == NULL) - poselib_ks_locrotscale= ANIM_builtin_keyingset_get_named(NULL, "LocRotScale"); - - /* make the keyingset use context info to determine where to add keyframes */ - ANIM_apply_keyingset(C, NULL, act, poselib_ks_locrotscale, MODIFYKEY_MODE_INSERT, (float)frame); + /* use Keying Set to determine what to store for the pose */ + // FIXME: in the past, the Keying Set respected selections (LocRotScale), but the current one doesn't (Whole Character) + // so perhaps we need either a new Keying Set, or just to add overrides here... + ANIM_apply_keyingset(C, NULL, act, ks, MODIFYKEY_MODE_INSERT, (float)frame); /* store new 'active' pose number */ act->active_marker= BLI_countlist(&act->markers); @@ -403,19 +470,23 @@ 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) { - Object *ob= ED_object_pose_armature(CTX_data_active_object(C)); - bAction *act= (ob) ? ob->poselib : NULL; + Object *ob; + bAction *act; TimeMarker *marker; EnumPropertyItem *item= NULL, item_tmp= {0}; int totitem= 0; int i= 0; - if (C==NULL) { + if (C == NULL) { return DummyRNA_DEFAULT_items; } + ob= get_poselib_object(C); + act= (ob) ? ob->poselib : NULL; + /* check that the action exists */ if (act) { /* add each marker to the list */ @@ -435,7 +506,7 @@ static EnumPropertyItem *poselib_stored_pose_itemf(bContext *C, PointerRNA *UNUS static int poselib_remove_exec (bContext *C, wmOperator *op) { - Object *ob= ED_object_pose_armature(CTX_data_active_object(C)); + Object *ob= get_poselib_object(C); bAction *act= (ob) ? ob->poselib : NULL; TimeMarker *marker; FCurve *fcu; @@ -449,7 +520,7 @@ static int poselib_remove_exec (bContext *C, wmOperator *op) /* get index (and pointer) of pose to remove */ marker= BLI_findlink(&act->markers, RNA_int_get(op->ptr, "pose")); if (marker == NULL) { - BKE_report(op->reports, RPT_ERROR, "Invalid index for Pose"); + BKE_reportf(op->reports, RPT_ERROR, "Invalid Pose specified %d", RNA_int_get(op->ptr, "pose")); return OPERATOR_CANCELLED; } @@ -491,20 +562,20 @@ void POSELIB_OT_pose_remove (wmOperatorType *ot) /* api callbacks */ ot->invoke= WM_menu_invoke; ot->exec= poselib_remove_exec; - ot->poll= ED_operator_posemode; + ot->poll= has_poselib_pose_data_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ prop= RNA_def_enum(ot->srna, "pose", DummyRNA_DEFAULT_items, 0, "Pose", "The pose to remove"); - RNA_def_enum_funcs(prop, poselib_stored_pose_itemf); + RNA_def_enum_funcs(prop, poselib_stored_pose_itemf); ot->prop= prop; } static int poselib_rename_invoke (bContext *C, wmOperator *op, wmEvent *evt) { - Object *ob= ED_object_pose_armature(CTX_data_active_object(C)); + Object *ob= get_poselib_object(C); bAction *act= (ob) ? ob->poselib : NULL; TimeMarker *marker; @@ -571,23 +642,25 @@ void POSELIB_OT_pose_rename (wmOperatorType *ot) /* identifiers */ ot->name= "PoseLib Rename Pose"; ot->idname= "POSELIB_OT_pose_rename"; - ot->description= "Rename nth pose from the active Pose Library"; + ot->description= "Rename specified pose from the active Pose Library"; /* api callbacks */ ot->invoke= poselib_rename_invoke; ot->exec= poselib_rename_exec; - ot->poll= ED_operator_posemode; + ot->poll= has_poselib_pose_data_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ + /* NOTE: name not pose is the operator's "main" property, so that it will get activated in the popup for easy renaming */ + ot->prop= RNA_def_string(ot->srna, "name", "RenamedPose", 64, "New Pose Name", "New name for pose"); prop= RNA_def_enum(ot->srna, "pose", prop_poses_dummy_types, 0, "Pose", "The pose to rename"); RNA_def_enum_funcs(prop, poselib_stored_pose_itemf); - RNA_def_string(ot->srna, "name", "RenamedPose", 64, "New Pose Name", "New name for pose"); } /* ************************************************************* */ +/* Pose-Lib Browsing/Previewing Operator */ /* Simple struct for storing settings/data for use during PoseLib preview */ typedef struct tPoseLib_PreviewData { @@ -646,8 +719,10 @@ enum { typedef struct tPoseLib_Backup { struct tPoseLib_Backup *next, *prev; - bPoseChannel *pchan; - bPoseChannel olddata; + bPoseChannel *pchan; /* pose channel backups are for */ + + bPoseChannel olddata; /* copy of pose channel's old data (at start) */ + IDProperty *oldprops; /* copy (needs freeing) of pose channel's properties (at start) */ } tPoseLib_Backup; /* Makes a copy of the current pose for restoration purposes - doesn't do constraints currently */ @@ -671,6 +746,9 @@ static void poselib_backup_posecopy (tPoseLib_PreviewData *pld) plb->pchan= pchan; memcpy(&plb->olddata, plb->pchan, sizeof(bPoseChannel)); + if (pchan->prop) + plb->oldprops= IDP_CopyProperty(pchan->prop); + BLI_addtail(&pld->backups, plb); /* mark as being affected */ @@ -681,13 +759,39 @@ static void poselib_backup_posecopy (tPoseLib_PreviewData *pld) } } -/* Restores original pose - doesn't do constraints currently */ +/* Restores original pose */ static void poselib_backup_restore (tPoseLib_PreviewData *pld) { tPoseLib_Backup *plb; for (plb= pld->backups.first; plb; plb= plb->next) { + /* copy most of data straight back */ memcpy(plb->pchan, &plb->olddata, sizeof(bPoseChannel)); + + /* just overwrite values of properties from the stored copies (there should be some) */ + if (plb->oldprops) + IDP_SyncGroupValues(plb->pchan->prop, plb->oldprops); + + // TODO: constraints settings aren't restored yet, even though these could change (though not that likely) + } +} + +/* Free list of backups, including any side data it may use */ +static void poselib_backup_free_data (tPoseLib_PreviewData *pld) +{ + tPoseLib_Backup *plb, *plbn; + + for (plb= pld->backups.first; plb; plb= plbn) { + plbn= plb->next; + + /* free custom data */ + if (plb->oldprops) { + IDP_FreeProperty(plb->oldprops); + MEM_freeN(plb->oldprops); + } + + /* free backup element now */ + BLI_freelinkN(&pld->backups, plb); } } @@ -762,6 +866,10 @@ static void poselib_keytag_pose (bContext *C, Scene *scene, tPoseLib_PreviewData bAction *act= pld->act; bActionGroup *agrp; + KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, "Whole Character"); + ListBase dsources = {NULL, NULL}; + short autokey = autokeyframe_cfra_can_key(scene, &pld->ob->id); + /* start tagging/keying */ for (agrp= act->groups.first; agrp; agrp= agrp->next) { /* only for selected action channels */ @@ -769,20 +877,9 @@ static void poselib_keytag_pose (bContext *C, Scene *scene, tPoseLib_PreviewData pchan= get_pose_channel(pose, agrp->name); if (pchan) { - if (autokeyframe_cfra_can_key(scene, &pld->ob->id)) { - ListBase dsources = {NULL, NULL}; - - /* get KeyingSet to use */ - KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, "LocRotScale"); - - /* now insert the keyframe(s) using the Keying Set - * 1) add datasource override for the PoseChannel - * 2) insert keyframes - * 3) free the extra info - */ + if (autokey) { + /* add datasource override for the PoseChannel, to be used later */ ANIM_relative_keyingset_add_source(&dsources, &pld->ob->id, &RNA_PoseBone, pchan); - ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA); - BLI_freelistN(&dsources); /* clear any unkeyed tags */ if (pchan->bone) @@ -797,6 +894,13 @@ static void poselib_keytag_pose (bContext *C, Scene *scene, tPoseLib_PreviewData } } + /* perform actual auto-keying now */ + if (autokey) { + /* insert keyframes for all relevant bones in one go */ + ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, (float)CFRA); + BLI_freelistN(&dsources); + } + /* send notifiers for this */ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL); } @@ -1235,7 +1339,7 @@ static int poselib_preview_handle_event (bContext *UNUSED(C), wmOperator *op, wm static void poselib_preview_init_data (bContext *C, wmOperator *op) { tPoseLib_PreviewData *pld; - Object *ob= ED_object_pose_armature(CTX_data_active_object(C)); + Object *ob= get_poselib_object(C); int pose_index = RNA_int_get(op->ptr, "pose_index"); /* set up preview state info */ @@ -1351,15 +1455,12 @@ static void poselib_preview_cleanup (bContext *C, wmOperator *op) if (IS_AUTOKEY_MODE(scene, NORMAL)) { //remake_action_ipos(ob->action); } - else { - /* need to trick depgraph, action is not allowed to execute on pose */ + else where_is_pose(scene, ob); - ob->recalc= 0; - } } - /* free memory used for backups */ - BLI_freelistN(&pld->backups); + /* free memory used for backups and searching */ + poselib_backup_free_data(pld); BLI_freelistN(&pld->searchp); /* free temp data for operator */ @@ -1371,11 +1472,12 @@ static void poselib_preview_cleanup (bContext *C, wmOperator *op) static int poselib_preview_exit (bContext *C, wmOperator *op) { tPoseLib_PreviewData *pld= op->customdata; + int exit_state = pld->state; /* finish up */ poselib_preview_cleanup(C, op); - if (ELEM(pld->state, PL_PREVIEW_CANCEL, PL_PREVIEW_ERROR)) + if (ELEM(exit_state, PL_PREVIEW_CANCEL, PL_PREVIEW_ERROR)) return OPERATOR_CANCELLED; else return OPERATOR_FINISHED; @@ -1469,12 +1571,12 @@ void POSELIB_OT_browse_interactive (wmOperatorType *ot) ot->idname= "POSELIB_OT_browse_interactive"; ot->description= "Interactively browse poses in 3D-View"; - /* api callbacks */ + /* callbacks */ ot->invoke= poselib_preview_invoke; ot->modal= poselib_preview_modal; ot->cancel= poselib_preview_cancel; ot->exec= poselib_preview_exec; - ot->poll= ED_operator_posemode; + ot->poll= has_poselib_pose_data_poll; /* flags */ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING; @@ -1487,3 +1589,22 @@ void POSELIB_OT_browse_interactive (wmOperatorType *ot) /* not used yet */ /* RNA_def_float_factor(ot->srna, "blend_factor", 1.0f, 0.0f, 1.0f, "Blend Factor", "Amount that the pose is applied on top of the existing poses", 0.0f, 1.0f); */ } + +void POSELIB_OT_apply_pose (wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Apply Pose Library Pose"; + ot->idname = "POSELIB_OT_apply_pose"; + ot->description = "Apply specified Pose Library pose to the rig"; + + /* callbacks */ + ot->exec= poselib_preview_exec; + ot->poll= has_poselib_pose_data_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* properties */ + // TODO: make the pose_index into a proper enum instead of a cryptic int... + ot->prop= RNA_def_int(ot->srna, "pose_index", -1, -2, INT_MAX, "Pose", "Index of the pose to apply (-2 for no change to pose, -1 for poselib active pose)", 0, INT_MAX); +} diff --git a/source/blender/editors/armature/poseobject.c b/source/blender/editors/armature/poseobject.c index 6115f322d08..c122460e5bb 100644 --- a/source/blender/editors/armature/poseobject.c +++ b/source/blender/editors/armature/poseobject.c @@ -71,13 +71,6 @@ #include "armature_intern.h" -/* ************* XXX *************** */ -static int pupmenu(const char *UNUSED(dummy)) {return 0;} -static void error(const char *UNUSED(dummy)) {} -static void BIF_undo_push(const char *UNUSED(dummy)) {} -/* ************* XXX *************** */ - - static int object_pose_context(Object *ob) { if( (ob) && @@ -110,7 +103,7 @@ Object *ED_object_pose_armature(Object *ob) /* This function is used to indicate that a bone is selected and needs keyframes inserted */ -void set_pose_keys (Object *ob) +static void set_pose_keys (Object *ob) { bArmature *arm= ob->data; bPoseChannel *chan; @@ -167,6 +160,7 @@ void ED_armature_exit_posemode(bContext *C, Base *base) /* if a selected or active bone is protected, throw error (oonly if warn==1) and return 1 */ /* only_selected==1 : the active bone is allowed to be protected */ +#if 0 /* UNUSED 2.5 */ static short pose_has_protected_selected(Object *ob, short warn) { /* check protection */ @@ -189,6 +183,7 @@ static short pose_has_protected_selected(Object *ob, short warn) } return 0; } +#endif /* only for real IK, not for auto-IK */ static int pose_channel_in_IK_chain(Object *ob, bPoseChannel *pchan, int level) @@ -295,7 +290,7 @@ void POSE_OT_paths_calculate (wmOperatorType *ot) /* --------- */ /* for the object with pose/action: clear path curves for selected bones only */ -void ED_pose_clear_paths(Object *ob) +static void ED_pose_clear_paths(Object *ob) { bPoseChannel *pchan; short skipped = 0; @@ -662,8 +657,8 @@ void POSE_OT_select_grouped (wmOperatorType *ot) } /* ********************************************** */ - -void pose_copy_menu(Scene *scene) +#if 0 /* UNUSED 2.5 */ +static void pose_copy_menu(Scene *scene) { Object *obedit= scene->obedit; // XXX context Object *ob= OBACT; @@ -860,6 +855,7 @@ void pose_copy_menu(Scene *scene) BIF_undo_push("Copy Pose Attributes"); } +#endif /* ******************** copy/paste pose ********************** */ @@ -1567,7 +1563,7 @@ void POSE_OT_autoside_names (wmOperatorType *ot) /* ********************************************** */ /* context active object, or weightpainted object with armature in posemode */ -void pose_activate_flipped_bone(Scene *scene) +static void pose_activate_flipped_bone(Scene *scene) { Object *ob= OBACT; diff --git a/source/blender/editors/armature/reeb.c b/source/blender/editors/armature/reeb.c index 38e23a3d456..0e0be99a88a 100644 --- a/source/blender/editors/armature/reeb.c +++ b/source/blender/editors/armature/reeb.c @@ -59,9 +59,10 @@ #include "reeb.h" - -ReebGraph *GLOBAL_RG = NULL; -ReebGraph *FILTERED_RG = NULL; +#if 0 /* UNUSED 2.5 */ +static ReebGraph *GLOBAL_RG = NULL; +static ReebGraph *FILTERED_RG = NULL; +#endif /* * Skeleton generation algorithm based on: @@ -113,7 +114,7 @@ void flipArcBuckets(ReebArc *arc); /***************************************** UTILS **********************************************/ -VertexData *allocVertexData(EditMesh *em) +static VertexData *allocVertexData(EditMesh *em) { VertexData *data; EditVert *eve; @@ -133,27 +134,27 @@ VertexData *allocVertexData(EditMesh *em) return data; } -int indexData(EditVert *eve) +static int indexData(EditVert *eve) { return ((VertexData*)eve->tmp.p)->i; } -float weightData(EditVert *eve) +static float weightData(EditVert *eve) { return ((VertexData*)eve->tmp.p)->w; } -void weightSetData(EditVert *eve, float w) +static void weightSetData(EditVert *eve, float w) { ((VertexData*)eve->tmp.p)->w = w; } -ReebNode* nodeData(EditVert *eve) +static ReebNode* nodeData(EditVert *eve) { return ((VertexData*)eve->tmp.p)->n; } -void nodeSetData(EditVert *eve, ReebNode *n) +static void nodeSetData(EditVert *eve, ReebNode *n) { ((VertexData*)eve->tmp.p)->n = n; } @@ -230,7 +231,7 @@ void BIF_flagMultiArcs(ReebGraph *rg, int flag) } } -ReebNode * addNode(ReebGraph *rg, EditVert *eve) +static ReebNode * addNode(ReebGraph *rg, EditVert *eve) { float weight; ReebNode *node = NULL; @@ -255,7 +256,7 @@ ReebNode * addNode(ReebGraph *rg, EditVert *eve) return node; } -ReebNode * copyNode(ReebGraph *rg, ReebNode *node) +static ReebNode * copyNode(ReebGraph *rg, ReebNode *node) { ReebNode *cp_node = NULL; @@ -276,7 +277,7 @@ ReebNode * copyNode(ReebGraph *rg, ReebNode *node) return cp_node; } -void relinkNodes(ReebGraph *low_rg, ReebGraph *high_rg) +static void relinkNodes(ReebGraph *low_rg, ReebGraph *high_rg) { ReebNode *low_node, *high_node; @@ -319,7 +320,7 @@ ReebNode *BIF_lowestLevelNode(ReebNode *node) return node; } -ReebArc * copyArc(ReebGraph *rg, ReebArc *arc) +static ReebArc * copyArc(ReebGraph *rg, ReebArc *arc) { ReebArc *cp_arc; ReebNode *node; @@ -365,7 +366,7 @@ ReebArc * copyArc(ReebGraph *rg, ReebArc *arc) return cp_arc; } -ReebGraph * copyReebGraph(ReebGraph *rg, int level) +static ReebGraph * copyReebGraph(ReebGraph *rg, int level) { ReebNode *node; ReebArc *arc; @@ -406,7 +407,7 @@ ReebGraph *BIF_graphForMultiNode(ReebGraph *rg, ReebNode *node) return multi_rg; } -ReebEdge * copyEdge(ReebEdge *edge) +static ReebEdge * copyEdge(ReebEdge *edge) { ReebEdge *newEdge = NULL; @@ -419,7 +420,7 @@ ReebEdge * copyEdge(ReebEdge *edge) return newEdge; } -void printArc(ReebArc *arc) +static void printArc(ReebArc *arc) { ReebEdge *edge; ReebNode *head = (ReebNode*)arc->head; @@ -432,7 +433,7 @@ void printArc(ReebArc *arc) } } -void flipArc(ReebArc *arc) +static void flipArc(ReebArc *arc) { ReebNode *tmp; tmp = arc->head; @@ -443,7 +444,7 @@ void flipArc(ReebArc *arc) } #ifdef DEBUG_REEB_NODE -void NodeDegreeDecrement(ReebGraph *UNUSED(rg), ReebNode *node) +static void NodeDegreeDecrement(ReebGraph *UNUSED(rg), ReebNode *node) { node->degree--; @@ -453,7 +454,7 @@ void NodeDegreeDecrement(ReebGraph *UNUSED(rg), ReebNode *node) // } } -void NodeDegreeIncrement(ReebGraph *UNUSED(rg), ReebNode *node) +static void NodeDegreeIncrement(ReebGraph *UNUSED(rg), ReebNode *node) { // if (node->degree == 0) // { @@ -524,7 +525,7 @@ void verifyNodeDegree(ReebGraph *rg) #endif } -void verifyBucketsArc(ReebGraph *UNUSED(rg), ReebArc *arc) +static void verifyBucketsArc(ReebGraph *UNUSED(rg), ReebArc *arc) { ReebNode *head = (ReebNode*)arc->head; ReebNode *tail = (ReebNode*)arc->tail; @@ -591,7 +592,7 @@ void verifyArcs(ReebGraph *rg) } } -void verifyMultiResolutionLinks(ReebGraph *rg, int level) +static void verifyMultiResolutionLinks(ReebGraph *rg, int level) { #ifdef DEBUG_REEB ReebGraph *lower_rg = rg->link_up; @@ -619,21 +620,23 @@ void verifyMultiResolutionLinks(ReebGraph *rg, int level) } /***************************************** BUCKET UTILS **********************************************/ -void addVertToBucket(EmbedBucket *b, float co[3]) +static void addVertToBucket(EmbedBucket *b, float co[3]) { b->nv++; interp_v3_v3v3(b->p, b->p, co, 1.0f / b->nv); } -void removeVertFromBucket(EmbedBucket *b, float co[3]) +#if 0 /* UNUSED 2.5 */ +static void removeVertFromBucket(EmbedBucket *b, float co[3]) { mul_v3_fl(b->p, (float)b->nv); sub_v3_v3(b->p, co); b->nv--; mul_v3_fl(b->p, 1.0f / (float)b->nv); } +#endif -void mergeBuckets(EmbedBucket *bDst, EmbedBucket *bSrc) +static void mergeBuckets(EmbedBucket *bDst, EmbedBucket *bSrc) { if (bDst->nv > 0 && bSrc->nv > 0) { @@ -647,7 +650,7 @@ void mergeBuckets(EmbedBucket *bDst, EmbedBucket *bSrc) } } -void mergeArcBuckets(ReebArc *aDst, ReebArc *aSrc, float start, float end) +static void mergeArcBuckets(ReebArc *aDst, ReebArc *aSrc, float start, float end) { if (aDst->bcount > 0 && aSrc->bcount > 0) { @@ -691,12 +694,12 @@ void flipArcBuckets(ReebArc *arc) } } -int countArcBuckets(ReebArc *arc) +static int countArcBuckets(ReebArc *arc) { return (int)(floor(arc->tail->weight) - ceil(arc->head->weight)) + 1; } -void allocArcBuckets(ReebArc *arc) +static void allocArcBuckets(ReebArc *arc) { int i; float start = ceil(arc->head->weight); @@ -718,7 +721,7 @@ void allocArcBuckets(ReebArc *arc) } -void resizeArcBuckets(ReebArc *arc) +static void resizeArcBuckets(ReebArc *arc) { EmbedBucket *oldBuckets = arc->buckets; int oldBCount = arc->bcount; @@ -760,7 +763,7 @@ void resizeArcBuckets(ReebArc *arc) } } -void reweightBuckets(ReebArc *arc) +static void reweightBuckets(ReebArc *arc) { int i; float start = ceil((arc->head)->weight); @@ -789,7 +792,7 @@ static void interpolateBuckets(ReebArc *arc, float *start_p, float *end_p, int s } } -void fillArcEmptyBuckets(ReebArc *arc) +static void fillArcEmptyBuckets(ReebArc *arc) { float *start_p, *end_p; int start_index = 0, end_index = 0; @@ -904,7 +907,7 @@ static void ExtendArcBuckets(ReebArc *arc) } /* CALL THIS ONLY AFTER FILTERING, SINCE IT MESSES UP WEIGHT DISTRIBUTION */ -void extendGraphBuckets(ReebGraph *rg) +static void extendGraphBuckets(ReebGraph *rg) { ReebArc *arc; @@ -916,7 +919,7 @@ void extendGraphBuckets(ReebGraph *rg) /**************************************** LENGTH CALCULATIONS ****************************************/ -void calculateArcLength(ReebArc *arc) +static void calculateArcLength(ReebArc *arc) { ReebArcIterator arc_iter; BArcIterator *iter = (BArcIterator*)&arc_iter; @@ -941,7 +944,7 @@ void calculateArcLength(ReebArc *arc) arc->length += len_v3v3(arc->tail->p, vec1); } -void calculateGraphLength(ReebGraph *rg) +static void calculateGraphLength(ReebGraph *rg) { ReebArc *arc; @@ -1196,7 +1199,7 @@ void postprocessGraph(ReebGraph *rg, char mode) /********************************************SORTING****************************************************/ -int compareNodesWeight(void *vnode1, void *vnode2) +static int compareNodesWeight(void *vnode1, void *vnode2) { ReebNode *node1 = (ReebNode*)vnode1; ReebNode *node2 = (ReebNode*)vnode2; @@ -1220,7 +1223,7 @@ void sortNodes(ReebGraph *rg) BLI_sortlist(&rg->nodes, compareNodesWeight); } -int compareArcsWeight(void *varc1, void *varc2) +static int compareArcsWeight(void *varc1, void *varc2) { ReebArc *arc1 = (ReebArc*)varc1; ReebArc *arc2 = (ReebArc*)varc2; @@ -1247,7 +1250,7 @@ void sortArcs(ReebGraph *rg) } /******************************************* JOINING ***************************************************/ -void reweightArc(ReebGraph *rg, ReebArc *arc, ReebNode *start_node, float start_weight) +static void reweightArc(ReebGraph *rg, ReebArc *arc, ReebNode *start_node, float start_weight) { ReebNode *node; float old_weight; @@ -1292,7 +1295,7 @@ void reweightArc(ReebGraph *rg, ReebArc *arc, ReebNode *start_node, float start_ } } -void reweightSubgraph(ReebGraph *rg, ReebNode *start_node, float start_weight) +static void reweightSubgraph(ReebGraph *rg, ReebNode *start_node, float start_weight) { int i; @@ -1307,7 +1310,7 @@ void reweightSubgraph(ReebGraph *rg, ReebNode *start_node, float start_weight) start_node->weight = start_weight; } -int joinSubgraphsEnds(ReebGraph *rg, float threshold, int nb_subgraphs) +static int joinSubgraphsEnds(ReebGraph *rg, float threshold, int nb_subgraphs) { int joined = 0; int subgraph; @@ -1389,7 +1392,7 @@ int joinSubgraphsEnds(ReebGraph *rg, float threshold, int nb_subgraphs) } /* Reweight graph from smallest node, fix fliped arcs */ -void fixSubgraphsOrientation(ReebGraph *rg, int nb_subgraphs) +static void fixSubgraphsOrientation(ReebGraph *rg, int nb_subgraphs) { int subgraph; @@ -1416,7 +1419,7 @@ void fixSubgraphsOrientation(ReebGraph *rg, int nb_subgraphs) } } -int joinSubgraphs(ReebGraph *rg, float threshold) +static int joinSubgraphs(ReebGraph *rg, float threshold) { int nb_subgraphs; int joined = 0; @@ -1457,7 +1460,7 @@ int joinSubgraphs(ReebGraph *rg, float threshold) /****************************************** FILTERING **************************************************/ -float lengthArc(ReebArc *arc) +static float lengthArc(ReebArc *arc) { #if 0 ReebNode *head = (ReebNode*)arc->head; @@ -1469,7 +1472,7 @@ float lengthArc(ReebArc *arc) #endif } -int compareArcs(void *varc1, void *varc2) +static int compareArcs(void *varc1, void *varc2) { ReebArc *arc1 = (ReebArc*)varc1; ReebArc *arc2 = (ReebArc*)varc2; @@ -1490,7 +1493,7 @@ int compareArcs(void *varc1, void *varc2) } } -void filterArc(ReebGraph *rg, ReebNode *newNode, ReebNode *removedNode, ReebArc * srcArc, int merging) +static void filterArc(ReebGraph *rg, ReebNode *newNode, ReebNode *removedNode, ReebArc * srcArc, int merging) { ReebArc *arc = NULL, *nextArc = NULL; @@ -1602,7 +1605,7 @@ void filterNullReebGraph(ReebGraph *rg) } } -int filterInternalExternalReebGraph(ReebGraph *rg, float threshold_internal, float threshold_external) +static int filterInternalExternalReebGraph(ReebGraph *rg, float threshold_internal, float threshold_external) { ReebArc *arc = NULL, *nextArc = NULL; int value = 0; @@ -1693,7 +1696,7 @@ int filterInternalExternalReebGraph(ReebGraph *rg, float threshold_internal, flo return value; } -int filterCyclesReebGraph(ReebGraph *rg, float UNUSED(distance_threshold)) +static int filterCyclesReebGraph(ReebGraph *rg, float UNUSED(distance_threshold)) { ReebArc *arc1, *arc2; ReebArc *next2; @@ -1900,7 +1903,7 @@ int filterSmartReebGraph(ReebGraph *UNUSED(rg), float UNUSED(threshold)) return value; } -void filterGraph(ReebGraph *rg, short options, float threshold_internal, float threshold_external) +static void filterGraph(ReebGraph *rg, short options, float threshold_internal, float threshold_external) { int done = 1; @@ -1939,7 +1942,7 @@ void filterGraph(ReebGraph *rg, short options, float threshold_internal, float t removeNormalNodes(rg); } -void finalizeGraph(ReebGraph *rg, char passes, char method) +static void finalizeGraph(ReebGraph *rg, char passes, char method) { int i; @@ -1959,7 +1962,7 @@ void finalizeGraph(ReebGraph *rg, char passes, char method) /************************************** WEIGHT SPREADING ***********************************************/ -int compareVerts( const void* a, const void* b ) +static int compareVerts( const void* a, const void* b ) { EditVert *va = *(EditVert**)a; EditVert *vb = *(EditVert**)b; @@ -1977,7 +1980,7 @@ int compareVerts( const void* a, const void* b ) return value; } -void spreadWeight(EditMesh *em) +static void spreadWeight(EditMesh *em) { EditVert **verts, *eve; float lastWeight = 0.0f; @@ -2019,7 +2022,7 @@ void spreadWeight(EditMesh *em) /******************************************** EXPORT ***************************************************/ -void exportNode(FILE *f, const char *text, ReebNode *node) +static void exportNode(FILE *f, const char *text, ReebNode *node) { fprintf(f, "%s i:%i w:%f d:%i %f %f %f\n", text, node->index, node->weight, node->degree, node->p[0], node->p[1], node->p[2]); } @@ -2065,7 +2068,7 @@ void REEB_exportGraph(ReebGraph *rg, int count) /***************************************** MAIN ALGORITHM **********************************************/ /* edges alone will create zero degree nodes, use this function to remove them */ -void removeZeroNodes(ReebGraph *rg) +static void removeZeroNodes(ReebGraph *rg) { ReebNode *node, *next_node; @@ -2151,12 +2154,12 @@ void removeNormalNodes(ReebGraph *rg) } -int edgeEquals(ReebEdge *e1, ReebEdge *e2) +static int edgeEquals(ReebEdge *e1, ReebEdge *e2) { return (e1->v1 == e2->v1 && e1->v2 == e2->v2); } -ReebArc *nextArcMappedToEdge(ReebArc *arc, ReebEdge *e) +static ReebArc *nextArcMappedToEdge(ReebArc *arc, ReebEdge *e) { ReebEdge *nextEdge = NULL; ReebEdge *edge = NULL; @@ -2385,7 +2388,7 @@ int mergeArcs(ReebGraph *rg, ReebArc *a0, ReebArc *a1) return result; } -void glueByMergeSort(ReebGraph *rg, ReebArc *a0, ReebArc *a1, ReebEdge *e0, ReebEdge *e1) +static void glueByMergeSort(ReebGraph *rg, ReebArc *a0, ReebArc *a1, ReebEdge *e0, ReebEdge *e1) { int total = 0; while (total == 0 && a0 != a1 && a0 != NULL && a1 != NULL) @@ -2406,7 +2409,7 @@ void glueByMergeSort(ReebGraph *rg, ReebArc *a0, ReebArc *a1, ReebEdge *e0, Reeb } } -void mergePaths(ReebGraph *rg, ReebEdge *e0, ReebEdge *e1, ReebEdge *e2) +static void mergePaths(ReebGraph *rg, ReebEdge *e0, ReebEdge *e1, ReebEdge *e2) { ReebArc *a0, *a1, *a2; a0 = e0->arc; @@ -2417,7 +2420,7 @@ void mergePaths(ReebGraph *rg, ReebEdge *e0, ReebEdge *e1, ReebEdge *e2) glueByMergeSort(rg, a0, a2, e0, e2); } -ReebEdge * createArc(ReebGraph *rg, ReebNode *node1, ReebNode *node2) +static ReebEdge * createArc(ReebGraph *rg, ReebNode *node1, ReebNode *node2) { ReebEdge *edge; @@ -2499,7 +2502,7 @@ ReebEdge * createArc(ReebGraph *rg, ReebNode *node1, ReebNode *node2) return edge; } -void addTriangleToGraph(ReebGraph *rg, ReebNode * n1, ReebNode * n2, ReebNode * n3, EditFace *efa) +static void addTriangleToGraph(ReebGraph *rg, ReebNode * n1, ReebNode * n2, ReebNode * n3, EditFace *efa) { ReebEdge *re1, *re2, *re3; ReebEdge *e1, *e2, *e3; @@ -2692,7 +2695,7 @@ static float cotan_weight(float *v1, float *v2, float *v3) return dot_v3v3(a, b)/clen; } -void addTriangle(EditVert *v1, EditVert *v2, EditVert *v3, int e1, int e2, int e3) +static void addTriangle(EditVert *v1, EditVert *v2, EditVert *v3, int e1, int e2, int e3) { /* Angle opposite e1 */ float t1= cotan_weight(v1->co, v2->co, v3->co) / e2; @@ -2888,7 +2891,7 @@ EditEdge * NextEdgeForVert(EdgeIndex *indexed_edges, int index) return indexed_edges->edges[offset]; } -void shortestPathsFromVert(EditMesh *em, EditVert *starting_vert, EdgeIndex *indexed_edges) +static void shortestPathsFromVert(EditMesh *em, EditVert *starting_vert, EdgeIndex *indexed_edges) { Heap *edge_heap; EditVert *current_eve = NULL; @@ -2952,13 +2955,13 @@ void shortestPathsFromVert(EditMesh *em, EditVert *starting_vert, EdgeIndex *ind BLI_heap_free(edge_heap, NULL); } -void freeEdgeIndex(EdgeIndex *indexed_edges) +static void freeEdgeIndex(EdgeIndex *indexed_edges) { MEM_freeN(indexed_edges->offset); MEM_freeN(indexed_edges->edges); } -void buildIndexedEdges(EditMesh *em, EdgeIndex *indexed_edges) +static void buildIndexedEdges(EditMesh *em, EdgeIndex *indexed_edges) { EditVert *eve; EditEdge *eed; diff --git a/source/blender/editors/armature/reeb.h b/source/blender/editors/armature/reeb.h index 39f83407d74..cee42313db6 100644 --- a/source/blender/editors/armature/reeb.h +++ b/source/blender/editors/armature/reeb.h @@ -172,6 +172,8 @@ void sortArcs(ReebGraph *rg); /*------------ Sanity check ------------*/ void verifyBuckets(ReebGraph *rg); void verifyFaces(ReebGraph *rg); +void verifyArcs(ReebGraph *rg); +void verifyNodeDegree(ReebGraph *rg); /*********************** PUBLIC *********************************/ diff --git a/source/blender/editors/curve/curve_ops.c b/source/blender/editors/curve/curve_ops.c index 0ee852a6059..bb4b81f3078 100644 --- a/source/blender/editors/curve/curve_ops.c +++ b/source/blender/editors/curve/curve_ops.c @@ -41,11 +41,11 @@ #include "WM_api.h" #include "WM_types.h" +#include "ED_curve.h" #include "ED_object.h" #include "ED_screen.h" #include "ED_transform.h" - #include "curve_intern.h" diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 0f6b88554e1..857a461e26e 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -75,6 +75,8 @@ #include "ED_view3d.h" #include "ED_curve.h" +#include "curve_intern.h" + #include "UI_interface.h" #include "RNA_access.h" @@ -86,6 +88,7 @@ typedef struct { void *lastsel; GHash *undoIndex; ListBase fcurves, drivers; + int actnu; } UndoCurve; /* Definitions needed for shape keys */ @@ -102,7 +105,7 @@ static void select_adjacent_cp(ListBase *editnurb, short next, short cont, short /* still need to eradicate a few :( */ #define callocstructN(x,y,name) (x*)MEM_callocN((y)* sizeof(x),name) -float nurbcircle[8][2]= { +static float nurbcircle[8][2]= { {0.0, -1.0}, {-1.0, -1.0}, {-1.0, 0.0}, {-1.0, 1.0}, {0.0, 1.0}, { 1.0, 1.0}, { 1.0, 0.0}, { 1.0, -1.0} }; @@ -117,7 +120,7 @@ ListBase *curve_get_editcurve(Object *ob) } /* this replaces the active flag used in uv/face mode */ -void set_actNurb(Object *obedit, Nurb *nu) +static void set_actNurb(Object *obedit, Nurb *nu) { Curve *cu= obedit->data; @@ -129,7 +132,7 @@ void set_actNurb(Object *obedit, Nurb *nu) } } -Nurb *get_actNurb(Object *obedit) +static Nurb *get_actNurb(Object *obedit) { Curve *cu= obedit->data; ListBase *nurbs= ED_curve_editnurbs(cu); @@ -229,7 +232,7 @@ int isNurbsel(Nurb *nu) return 0; } -int isNurbsel_count(Curve *cu, Nurb *nu) +static int isNurbsel_count(Curve *cu, Nurb *nu) { BezTriple *bezt; BPoint *bp; @@ -3998,6 +4001,9 @@ static int make_segment_exec(bContext *C, wmOperator *op) /* find both nurbs and points, nu1 will be put behind nu2 */ for(nu= nubase->first; nu; nu= nu->next) { + if(nu->pntsu == 1) + nu->flagu&= ~CU_NURB_CYCLIC; + if((nu->flagu & CU_NURB_CYCLIC)==0) { /* not cyclic */ if(nu->type == CU_BEZIER) { if(nu1==0) { @@ -4107,17 +4113,21 @@ static int make_segment_exec(bContext *C, wmOperator *op) } freeNurb(nu2); nu2= NULL; } + + set_actNurb(obedit, nu1); /* for selected */ + ok= 1; } - - set_actNurb(obedit, NULL); /* for selected */ - ok= 1; - } else if(nu1 && !nu2 && nu1->type == CU_BEZIER) { - if(!(nu1->flagu & CU_NURB_CYCLIC)) { - if(BEZSELECTED_HIDDENHANDLES(cu, nu1->bezt) && + } else if(nu1 && !nu2) { + if(!(nu1->flagu & CU_NURB_CYCLIC) && nu1->pntsu>1) { + if (nu1->type == CU_BEZIER && BEZSELECTED_HIDDENHANDLES(cu, nu1->bezt) && BEZSELECTED_HIDDENHANDLES(cu, nu1->bezt+(nu1->pntsu-1))) { nu1->flagu|= CU_NURB_CYCLIC; calchandlesNurb(nu1); ok= 1; + } else if (nu1->type == CU_NURBS && nu1->bp->f1&SELECT && (nu1->bp+(nu1->pntsu-1))->f1&SELECT) { + nu1->flagu|= CU_NURB_CYCLIC; + nurbs_knot_calc_u(nu1); + ok= 1; } } } @@ -4404,29 +4414,26 @@ static int addvert_Nurb(bContext *C, short mode, float location[3]) if ((nu == NULL) || (nu->type==CU_BEZIER && bezt==NULL) || (nu->type!=CU_BEZIER && bp==NULL)) { if(mode!='e') { - if(cu->actnu >= 0) nu= BLI_findlink(&editnurb->nurbs, cu->actnu); - else { - /* no selected sement -- create new one which is BEZIER tpye - type couldn't be determined from Curve bt could be changed - in the future, so shouldn't make much headache */ - - nu= MEM_callocN(sizeof(Nurb), "addvert_Nurb nu"); - nu->type= CU_BEZIER; - nu->resolu= cu->resolu; - nu->flag |= CU_SMOOTH; - - BLI_addtail(&editnurb->nurbs, nu); - } + if(cu->actnu >= 0) + nu= BLI_findlink(&editnurb->nurbs, cu->actnu); - if(nu->type==CU_BEZIER) { + if(!nu || nu->type==CU_BEZIER) { newbezt= (BezTriple*)MEM_callocN(sizeof(BezTriple), "addvert_Nurb"); newbezt->radius= 1; newbezt->alfa= 0; BEZ_SEL(newbezt); newbezt->h2= newbezt->h1= HD_AUTO; - newnu= (Nurb*)MEM_mallocN(sizeof(Nurb), "addvert_Nurb newnu"); - memcpy(newnu, nu, sizeof(Nurb)); + newnu= (Nurb*)MEM_callocN(sizeof(Nurb), "addvert_Nurb newnu"); + if(!nu) { + /* no selected sement -- create new one which is BEZIER tpye + type couldn't be determined from Curve bt could be changed + in the future, so shouldn't make much headache */ + newnu->type= CU_BEZIER; + newnu->resolu= cu->resolu; + newnu->flag |= CU_SMOOTH; + } else memcpy(newnu, nu, sizeof(Nurb)); + BLI_addtail(&editnurb->nurbs, newnu); set_actNurb(obedit, newnu); newnu->bezt= newbezt; @@ -4441,6 +4448,7 @@ static int addvert_Nurb(bContext *C, short mode, float location[3]) add_v3_v3v3(newbezt->vec[2], newbezt->vec[1],temp); ok= 1; + nu= newnu; } else if(nu->pntsv == 1) { newbp= (BPoint*)MEM_callocN(sizeof(BPoint), "addvert_Nurb5"); newbp->radius= 1; @@ -4465,6 +4473,7 @@ static int addvert_Nurb(bContext *C, short mode, float location[3]) nurbs_knot_calc_u(newnu); ok= 1; + nu= newnu; } } @@ -4551,20 +4560,7 @@ static int addvert_Nurb(bContext *C, short mode, float location[3]) } else if(!ok && nu->pntsv==1) { /* which b-point? */ - if(bp== nu->bp) { /* first */ - bp->f1= 0; - newbp = - (BPoint*)MEM_callocN((nu->pntsu+1) * sizeof(BPoint), "addvert_Nurb3"); - ED_curve_bpcpy(editnurb, newbp+1, bp, nu->pntsu); - *newbp= *bp; - newbp->f1|= SELECT; - cu->lastsel= newbp; - MEM_freeN(nu->bp); - nu->bp= newbp; - bp= newbp + 1; - ok= 1; - } - else if(bp== (nu->bp+nu->pntsu-1)) { /* last */ + if(bp== (nu->bp+nu->pntsu-1)) { /* last */ bp->f1= 0; newbp = (BPoint*)MEM_callocN((nu->pntsu+1) * sizeof(BPoint), "addvert_Nurb4"); @@ -4578,6 +4574,19 @@ static int addvert_Nurb(bContext *C, short mode, float location[3]) bp= newbp - 1; ok= 1; } + else if(bp== nu->bp) { /* first */ + bp->f1= 0; + newbp = + (BPoint*)MEM_callocN((nu->pntsu+1) * sizeof(BPoint), "addvert_Nurb3"); + ED_curve_bpcpy(editnurb, newbp+1, bp, nu->pntsu); + *newbp= *bp; + newbp->f1|= SELECT; + cu->lastsel= newbp; + MEM_freeN(nu->bp); + nu->bp= newbp; + bp= newbp + 1; + ok= 1; + } else if(mode!='e') { bp->f1= 0; newbp= (BPoint*)MEM_callocN(sizeof(BPoint), "addvert_Nurb5"); @@ -4831,18 +4840,20 @@ static int toggle_cyclic_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(eve uiLayout *layout; Nurb *nu; - for(nu= editnurb->first; nu; nu= nu->next) { - if(nu->pntsu>1 || nu->pntsv>1) { - if(nu->type==CU_NURBS) { - pup= uiPupMenuBegin(C, "Direction", ICON_NULL); - layout= uiPupMenuLayout(pup); - uiItemsEnumO(layout, op->type->idname, "direction"); - uiPupMenuEnd(C, pup); - return OPERATOR_CANCELLED; + if(obedit->type == OB_SURF) { + for(nu= editnurb->first; nu; nu= nu->next) { + if(nu->pntsu>1 || nu->pntsv>1) { + if(nu->type==CU_NURBS) { + pup= uiPupMenuBegin(C, "Direction", ICON_NULL); + layout= uiPupMenuLayout(pup); + uiItemsEnumO(layout, op->type->idname, "direction"); + uiPupMenuEnd(C, pup); + return OPERATOR_CANCELLED; + } } } } - + return toggle_cyclic_exec(C, op); } @@ -6961,6 +6972,7 @@ static void undoCurve_to_editCurve(void *ucu, void *obe) } cu->lastsel= lastsel; + cu->actnu= undoCurve->actnu; ED_curve_updateAnimPaths(obedit); } @@ -7006,6 +7018,7 @@ static void *editCurve_to_undoCurve(void *obe) } undoCurve->lastsel= lastsel; + undoCurve->actnu= cu->actnu; return undoCurve; } diff --git a/source/blender/editors/curve/editfont.c b/source/blender/editors/curve/editfont.c index 44fec631441..4b2b0043f65 100644 --- a/source/blender/editors/curve/editfont.c +++ b/source/blender/editors/curve/editfont.c @@ -62,6 +62,7 @@ #include "WM_api.h" #include "WM_types.h" +#include "ED_curve.h" #include "ED_object.h" #include "ED_screen.h" #include "ED_util.h" @@ -206,7 +207,7 @@ static char findaccent(char char1, unsigned int code) } -void update_string(Curve *cu) +static void update_string(Curve *cu) { EditFont *ef= cu->editfont; int len; diff --git a/source/blender/editors/gpencil/gpencil_buttons.c b/source/blender/editors/gpencil/gpencil_buttons.c index 7590b2558f0..6af5e4cd92b 100644 --- a/source/blender/editors/gpencil/gpencil_buttons.c +++ b/source/blender/editors/gpencil/gpencil_buttons.c @@ -66,7 +66,7 @@ /* These are just 'dummy wrappers' around gpencil api calls */ /* make layer active one after being clicked on */ -void gp_ui_activelayer_cb (bContext *C, void *gpd, void *gpl) +static void gp_ui_activelayer_cb (bContext *C, void *gpd, void *gpl) { gpencil_layer_setactive(gpd, gpl); @@ -74,7 +74,7 @@ void gp_ui_activelayer_cb (bContext *C, void *gpd, void *gpl) } /* delete 'active' layer */ -void gp_ui_dellayer_cb (bContext *C, void *gpd, void *gpl) +static void gp_ui_dellayer_cb (bContext *C, void *gpd, void *gpl) { /* make sure the layer we want to remove is the active one */ gpencil_layer_setactive(gpd, gpl); diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c index b7f13ebe0b7..498108e8d0e 100644 --- a/source/blender/editors/gpencil/gpencil_edit.c +++ b/source/blender/editors/gpencil/gpencil_edit.c @@ -64,6 +64,7 @@ #include "UI_view2d.h" +#include "ED_gpencil.h" #include "ED_view3d.h" #include "gpencil_intern.h" diff --git a/source/blender/editors/gpencil/gpencil_ops.c b/source/blender/editors/gpencil/gpencil_ops.c index b6b2675e6c8..a84bf5774f6 100644 --- a/source/blender/editors/gpencil/gpencil_ops.c +++ b/source/blender/editors/gpencil/gpencil_ops.c @@ -38,6 +38,8 @@ #include "RNA_access.h" +#include "ED_gpencil.h" + #include "gpencil_intern.h" /* ****************************************** */ diff --git a/source/blender/editors/include/ED_curve.h b/source/blender/editors/include/ED_curve.h index ec3c5e69830..3d8c5dd7cae 100644 --- a/source/blender/editors/include/ED_curve.h +++ b/source/blender/editors/include/ED_curve.h @@ -85,5 +85,8 @@ void ED_curve_bpcpy(struct EditNurb *editnurb, struct BPoint *dst, struct BPoint int ED_curve_updateAnimPaths(struct Object *obedit); +/* debug only */ +void printknots(struct Object *obedit); + #endif /* ED_CURVE_H */ diff --git a/source/blender/editors/include/ED_gpencil.h b/source/blender/editors/include/ED_gpencil.h index 92c090beb8a..08a015a5271 100644 --- a/source/blender/editors/include/ED_gpencil.h +++ b/source/blender/editors/include/ED_gpencil.h @@ -82,7 +82,7 @@ void draw_gpencil_view3d_ext(struct Scene *scene, struct View3D *v3d, struct ARe void gpencil_panel_standard(const struct bContext *C, struct Panel *pa); /* ----------- Grease-Pencil AnimEdit API ------------------ */ - +short gplayer_frames_looper(struct bGPDlayer *gpl, struct Scene *scene, short (*gpf_cb)(struct bGPDframe *, struct Scene *)); void gplayer_make_cfra_list(struct bGPDlayer *gpl, ListBase *elems, short onlysel); void deselect_gpencil_layers(void *data, short select_mode); diff --git a/source/blender/editors/include/ED_markers.h b/source/blender/editors/include/ED_markers.h index 22c171128bd..1f71c377ec0 100644 --- a/source/blender/editors/include/ED_markers.h +++ b/source/blender/editors/include/ED_markers.h @@ -64,6 +64,8 @@ void ED_operatortypes_marker(void); /* called in screen_ops.c:ED_keymap_screen() */ void ED_marker_keymap(struct wmKeyConfig *keyconf); +/* debugging only */ +void debug_markers_print_list(struct ListBase *markers); #endif /* ED_MARKERS_H */ diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h index 057e5d3bf88..3d735495fec 100644 --- a/source/blender/editors/include/ED_mesh.h +++ b/source/blender/editors/include/ED_mesh.h @@ -188,6 +188,11 @@ void paintface_deselect_all_visible(struct Object *ob, int action, short flush_f void paintface_select_linked(struct bContext *C, struct Object *ob, short mval[2], int mode); int paintface_minmax(struct Object *ob, float *min, float *max); +/* TODO, 2.5x */ +void paintface_unhide(struct Scene *scene); +void paintface_hide(struct Scene *scene); +void paintface_select_swap(struct Scene *scene); + /* object_vgroup.c */ #define WEIGHT_REPLACE 1 diff --git a/source/blender/editors/include/ED_uvedit.h b/source/blender/editors/include/ED_uvedit.h index 353f89323e6..a2a0cefc55b 100644 --- a/source/blender/editors/include/ED_uvedit.h +++ b/source/blender/editors/include/ED_uvedit.h @@ -67,5 +67,7 @@ void ED_uvedit_live_unwrap_begin(struct Scene *scene, struct Object *obedit); void ED_uvedit_live_unwrap_re_solve(void); void ED_uvedit_live_unwrap_end(short cancel); +void draw_uvedit_main(struct SpaceImage *sima, struct ARegion *ar, struct Scene *scene, struct Object *obedit); + #endif /* ED_UVEDIT_H */ diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 76c9e765188..3e607b37067 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -548,6 +548,8 @@ void uiButSetCompleteFunc(uiBut *but, uiButCompleteFunc func, void *arg); void uiBlockSetDrawExtraFunc(uiBlock *block, void (*func)(const struct bContext *C, void *, void *, void *, struct rcti *rect), void *arg1, void *arg2); +void uiButSetFocusOnEnter (struct wmWindow *win, uiBut *but); + /* Autocomplete * * Tab complete helper functions, for use in uiButCompleteFunc callbacks. diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index cb7c8c34f1c..5843412940a 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -497,14 +497,15 @@ static int ui_but_equals_old(uiBut *but, uiBut *oldbut) if(oldbut->func_arg1 != oldbut && but->func_arg1 != oldbut->func_arg1) return 0; if(oldbut->func_arg2 != oldbut && but->func_arg2 != oldbut->func_arg2) return 0; if(!but->funcN && ((but->poin != oldbut->poin && (uiBut*)oldbut->poin != oldbut) || but->pointype != oldbut->pointype)) return 0; + if(but->optype != oldbut->optype) return 0; return 1; } -static int ui_but_update_from_old_block(const bContext *C, uiBlock *block, uiBut *but) +static int ui_but_update_from_old_block(const bContext *C, uiBlock *block, uiBut **butpp) { uiBlock *oldblock; - uiBut *oldbut; + uiBut *oldbut, *but= *butpp; int found= 0; oldblock= block->oldblock; @@ -515,35 +516,51 @@ static int ui_but_update_from_old_block(const bContext *C, uiBlock *block, uiBut if(ui_but_equals_old(oldbut, but)) { if(oldbut->active) { #if 0 - but->flag= oldbut->flag; +// but->flag= oldbut->flag; #else /* exception! redalert flag can't be update from old button. * perhaps it should only copy spesific flags rather then all. */ - but->flag= (oldbut->flag & ~UI_BUT_REDALERT) | (but->flag & UI_BUT_REDALERT); +// but->flag= (oldbut->flag & ~UI_BUT_REDALERT) | (but->flag & UI_BUT_REDALERT); #endif - but->active= oldbut->active; - but->pos= oldbut->pos; - but->ofs= oldbut->ofs; - but->editstr= oldbut->editstr; - but->editval= oldbut->editval; - but->editvec= oldbut->editvec; - but->editcoba= oldbut->editcoba; - but->editcumap= oldbut->editcumap; - but->selsta= oldbut->selsta; - but->selend= oldbut->selend; - but->softmin= oldbut->softmin; - but->softmax= oldbut->softmax; - but->linkto[0]= oldbut->linkto[0]; - but->linkto[1]= oldbut->linkto[1]; +// but->active= oldbut->active; +// but->pos= oldbut->pos; +// but->ofs= oldbut->ofs; +// but->editstr= oldbut->editstr; +// but->editval= oldbut->editval; +// but->editvec= oldbut->editvec; +// but->editcoba= oldbut->editcoba; +// but->editcumap= oldbut->editcumap; +// but->selsta= oldbut->selsta; +// but->selend= oldbut->selend; +// but->softmin= oldbut->softmin; +// but->softmax= oldbut->softmax; +// but->linkto[0]= oldbut->linkto[0]; +// but->linkto[1]= oldbut->linkto[1]; found= 1; - - oldbut->active= NULL; +// oldbut->active= NULL; + + /* move button over from oldblock to new block */ + BLI_remlink(&oldblock->buttons, oldbut); + BLI_insertlink(&block->buttons, but, oldbut); + oldbut->block= block; + *butpp= oldbut; + + /* still stuff needs to be copied */ + oldbut->x1= but->x1; oldbut->y1= but->y1; + oldbut->x2= but->x2; oldbut->y2= but->y2; + oldbut->context= but->context; /* set by Layout */ + + BLI_remlink(&block->buttons, but); + ui_free_but(C, but); + + /* note: if layout hasn't been applied yet, it uses old button pointers... */ + } + else { + /* ensures one button can get activated, and in case the buttons + * draw are the same this gives O(1) lookup for each button */ + BLI_remlink(&oldblock->buttons, oldbut); + ui_free_but(C, oldbut); } - - /* ensures one button can get activated, and in case the buttons - * draw are the same this gives O(1) lookup for each button */ - BLI_remlink(&oldblock->buttons, oldbut); - ui_free_but(C, oldbut); break; } @@ -695,7 +712,7 @@ void uiEndBlock(const bContext *C, uiBlock *block) * blocking, while still alowing buttons to be remade each redraw as it * is expected by blender code */ for(but=block->buttons.first; but; but=but->next) { - if(ui_but_update_from_old_block(C, block, but)) + if(ui_but_update_from_old_block(C, block, &but)) ui_check_but(but); /* temp? Proper check for greying out */ @@ -912,7 +929,7 @@ static void ui_is_but_sel(uiBut *but) } /* XXX 2.50 no links supported yet */ - +#if 0 static int uibut_contains_pt(uiBut *UNUSED(but), short *UNUSED(mval)) { return 0; @@ -943,7 +960,7 @@ static uiBut *ui_get_valid_link_button(uiBlock *block, uiBut *but, short *mval) return NULL; } - +#endif static uiBut *ui_find_inlink(uiBlock *block, void *poin) { @@ -1562,7 +1579,7 @@ static void ui_get_but_string_unit(uiBut *but, char *str, int len_max, double va if(scene->unit.scale_length<0.0001) scene->unit.scale_length= 1.0; // XXX do_versions /* Sanity checks */ - if(precision>4) precision= 4; + if(precision>7) precision= 7; else if(precision==0) precision= 2; bUnit_AsString(str, len_max, ui_get_but_scale_unit(but, value), precision, scene->unit.system, unit_type>>16, do_split, pad); @@ -1650,6 +1667,10 @@ void ui_get_but_string(uiBut *but, char *str, int maxlen) if(but->a2==1) BLI_snprintf(str, maxlen, "%.1f", value); else if(but->a2==2) BLI_snprintf(str, maxlen, "%.2f", value); else if(but->a2==3) BLI_snprintf(str, maxlen, "%.3f", value); + else if(but->a2==4) BLI_snprintf(str, maxlen, "%.4f", value); + else if(but->a2==5) BLI_snprintf(str, maxlen, "%.5f", value); + else if(but->a2==6) BLI_snprintf(str, maxlen, "%.6f", value); + else if(but->a2==7) BLI_snprintf(str, maxlen, "%.7f", value); else BLI_snprintf(str, maxlen, "%.4f", value); } else @@ -1757,11 +1778,13 @@ int ui_set_but_string(bContext *C, uiBut *but, const char *str) return 0; } -void ui_set_but_default(bContext *C, uiBut *but) +void ui_set_but_default(bContext *C, uiBut *but, short all) { /* if there is a valid property that is editable... */ if (but->rnapoin.data && but->rnaprop && RNA_property_editable(&but->rnapoin, but->rnaprop)) { - if(RNA_property_reset(&but->rnapoin, but->rnaprop, -1)) { + int index = (all)? -1 : but->rnaindex; + + if(RNA_property_reset(&but->rnapoin, but->rnaprop, index)) { /* perform updates required for this property */ RNA_property_update(C, &but->rnapoin, but->rnaprop); } @@ -2113,6 +2136,10 @@ void ui_check_but(uiBut *but) if(but->a2==1) sprintf(but->drawstr, "%s%.1f", but->str, value); else if(but->a2==2) sprintf(but->drawstr, "%s%.2f", but->str, value); else if(but->a2==3) sprintf(but->drawstr, "%s%.3f", but->str, value); + else if(but->a2==4) sprintf(but->drawstr, "%s%.4f", but->str, value); + else if(but->a2==5) sprintf(but->drawstr, "%s%.5f", but->str, value); + else if(but->a2==6) sprintf(but->drawstr, "%s%.6f", but->str, value); + else if(but->a2==7) sprintf(but->drawstr, "%s%.7f", but->str, value); else sprintf(but->drawstr, "%s%.4f", but->str, value); } else { @@ -2139,6 +2166,10 @@ void ui_check_but(uiBut *but) if(but->a2==1) sprintf(but->drawstr, "%s%.1f", but->str, value); else if(but->a2==2) sprintf(but->drawstr, "%s%.2f", but->str, value); else if(but->a2==3) sprintf(but->drawstr, "%s%.3f", but->str, value); + else if(but->a2==4) sprintf(but->drawstr, "%s%.4f", but->str, value); + else if(but->a2==5) sprintf(but->drawstr, "%s%.5f", but->str, value); + else if(but->a2==6) sprintf(but->drawstr, "%s%.6f", but->str, value); + else if(but->a2==7) sprintf(but->drawstr, "%s%.7f", but->str, value); else sprintf(but->drawstr, "%s%.4f", but->str, value); } else { @@ -2550,8 +2581,11 @@ static uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, const char *s else BLI_dynstr_appendf(dynstr, "|%s %%x%d", item[i].name, item[i].value); - if(value == item[i].value) + if(value == item[i].value) { icon= item[i].icon; + if(!tip) + tip= item[i].description; + } } str= BLI_dynstr_get_cstring(dynstr); BLI_dynstr_free(dynstr); @@ -3492,6 +3526,22 @@ void uiButSetSearchFunc(uiBut *but, uiButSearchFunc sfunc, void *arg, uiButHandl } } +/* push a new event onto event queue to activate the given button + * (usually a text-field) upon entering a popup + */ +void uiButSetFocusOnEnter(wmWindow *win, uiBut *but) +{ + wmEvent event; + + event= *(win->eventstate); + event.type= EVT_BUT_OPEN; + event.val= KM_PRESS; + event.customdata= but; + event.customdatafree= FALSE; + + wm_event_add(win, &event); +} + /* Program Init/Exit */ void UI_init(void) diff --git a/source/blender/editors/interface/interface_draw.c b/source/blender/editors/interface/interface_draw.c index f16d633de6f..86795e27bb4 100644 --- a/source/blender/editors/interface/interface_draw.c +++ b/source/blender/editors/interface/interface_draw.c @@ -381,6 +381,7 @@ void uiRoundRect(float minx, float miny, float maxx, float maxy, float rad) } /* plain fake antialiased unfilled round rectangle */ +#if 0 /* UNUSED 2.5 */ static void uiRoundRectFakeAA(float minx, float miny, float maxx, float maxy, float rad, float asp) { float color[4], alpha; @@ -408,6 +409,7 @@ static void uiRoundRectFakeAA(float minx, float miny, float maxx, float maxy, fl color[3] = alpha; glColor4fv(color); } +#endif /* (old, used in outliner) plain antialiased filled box */ void uiRoundBox(float minx, float miny, float maxx, float maxy, float rad) diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 92b4e622d7e..67e4548b0b7 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -4357,8 +4357,9 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event) /* reset to default */ /* XXX hardcoded keymap check.... */ else if(ELEM(event->type, ZEROKEY, PAD0) && event->val == KM_PRESS) { + /* ctrl-0 = for arrays, only the active one gets done (vs whole array for just 0) */ if (!(ELEM3(but->type, HSVCIRCLE, HSVCUBE, HISTOGRAM))) - ui_set_but_default(C, but); + ui_set_but_default(C, but, !event->ctrl); } /* handle menu */ else if(event->type == RIGHTMOUSE && event->val == KM_PRESS) { diff --git a/source/blender/editors/interface/interface_icons.c b/source/blender/editors/interface/interface_icons.c index 5ea74cbf40a..63841963c6d 100644 --- a/source/blender/editors/interface/interface_icons.c +++ b/source/blender/editors/interface/interface_icons.c @@ -972,7 +972,7 @@ static void icon_draw_size(float x, float y, int icon_id, float aspect, float al if(di->type == ICON_TYPE_VECTOR) { /* vector icons use the uiBlock transformation, they are not drawn with untransformed coordinates like the other icons */ - di->data.vector.func(x, y, ICON_DEFAULT_HEIGHT, ICON_DEFAULT_HEIGHT, 1.0f); + di->data.vector.func((int)x, (int)y, ICON_DEFAULT_HEIGHT, ICON_DEFAULT_HEIGHT, 1.0f); } else if(di->type == ICON_TYPE_TEXTURE) { icon_draw_texture(x, y, w, h, di->data.texture.x, di->data.texture.y, diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h index 154a263cd7b..52214bf3fa7 100644 --- a/source/blender/editors/interface/interface_intern.h +++ b/source/blender/editors/interface/interface_intern.h @@ -364,7 +364,7 @@ extern void ui_convert_to_unit_alt_name(uiBut *but, char *str, int maxlen); extern int ui_set_but_string(struct bContext *C, uiBut *but, const char *str); extern int ui_get_but_string_max_length(uiBut *but); -extern void ui_set_but_default(struct bContext *C, uiBut *but); +extern void ui_set_but_default(struct bContext *C, uiBut *but, short all); extern void ui_set_but_soft_range(uiBut *but, double value); diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index 330c81fbcb2..4398e7a2287 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -2733,11 +2733,20 @@ void uiLayoutOperatorButs(const bContext *C, uiLayout *layout, wmOperator *op,in } } - /* no undo for buttons for operator redo panels */ + /* set various special settings for buttons */ { uiBut *but; - for(but= uiLayoutGetBlock(layout)->buttons.first; but; but= but->next) + for(but= uiLayoutGetBlock(layout)->buttons.first; but; but= but->next) { + /* no undo for buttons for operator redo panels */ uiButClearFlag(but, UI_BUT_UNDO); + + /* if button is operator's default property, and a text-field, enable focus for it + * - this is used for allowing operators with popups to rename stuff with fewer clicks + */ + if ((but->rnaprop == op->type->prop) && (but->type == TEX)) { + uiButSetFocusOnEnter(CTX_wm_window(C), but); + } + } } } diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c index 93b5305fd12..89d648e64be 100644 --- a/source/blender/editors/interface/interface_panel.c +++ b/source/blender/editors/interface/interface_panel.c @@ -309,6 +309,7 @@ static void ui_offset_panel_block(uiBlock *block) /**************************** drawing *******************************/ /* extern used by previewrender */ +#if 0 /*UNUSED 2.5*/ static void uiPanelPush(uiBlock *block) { glPushMatrix(); @@ -321,6 +322,7 @@ static void uiPanelPop(uiBlock *UNUSED(block)) { glPopMatrix(); } +#endif /* triangle 'icon' for panel header */ /* NOTE - this seems to be only used for hiding nodes now */ diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index b27f041ef30..e0a3a7b15af 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -144,7 +144,6 @@ static uiBlock *id_search_menu(bContext *C, ARegion *ar, void *arg_litem) static char search[256]; static TemplateID template; PointerRNA idptr; - wmEvent event; wmWindow *win= CTX_wm_window(C); uiBlock *block; uiBut *but; @@ -185,12 +184,8 @@ static uiBlock *id_search_menu(bContext *C, ARegion *ar, void *arg_litem) uiBlockSetDirection(block, UI_DOWN); uiEndBlock(C, block); - event= *(win->eventstate); /* XXX huh huh? make api call */ - event.type= EVT_BUT_OPEN; - event.val= KM_PRESS; - event.customdata= but; - event.customdatafree= FALSE; - wm_event_add(win, &event); + /* give search-field focus */ + uiButSetFocusOnEnter(win, but); return block; } diff --git a/source/blender/editors/interface/view2d_ops.c b/source/blender/editors/interface/view2d_ops.c index 92e0d0011f4..5906283050f 100644 --- a/source/blender/editors/interface/view2d_ops.c +++ b/source/blender/editors/interface/view2d_ops.c @@ -1209,7 +1209,7 @@ enum { SCROLLHANDLE_MAX, SCROLLHANDLE_MIN_OUTSIDE, SCROLLHANDLE_MAX_OUTSIDE -} eV2DScrollerHandle_Zone; +} /*eV2DScrollerHandle_Zone*/; /* ------------------------ */ diff --git a/source/blender/editors/mesh/editface.c b/source/blender/editors/mesh/editface.c index 2a391f7bbaf..fa202bde54f 100644 --- a/source/blender/editors/mesh/editface.c +++ b/source/blender/editors/mesh/editface.c @@ -93,7 +93,7 @@ void paintface_flush_flags(Object *ob) } /* returns 0 if not found, otherwise 1 */ -int facesel_face_pick(struct bContext *C, Mesh *me, short *mval, unsigned int *index, short rect) +static int facesel_face_pick(struct bContext *C, Mesh *me, short *mval, unsigned int *index, short rect) { ViewContext vc; view3d_set_viewcontext(C, &vc); diff --git a/source/blender/editors/mesh/editmesh_add.c b/source/blender/editors/mesh/editmesh_add.c index d9db1e99bfa..f24c5d0d5db 100644 --- a/source/blender/editors/mesh/editmesh_add.c +++ b/source/blender/editors/mesh/editmesh_add.c @@ -288,7 +288,7 @@ void MESH_OT_dupli_extrude_cursor(wmOperatorType *ot) /* ********************** */ /* selected faces get hidden edges */ -int make_fgon(EditMesh *em, wmOperator *op, int make) +static int make_fgon(EditMesh *em, wmOperator *op, int make) { EditFace *efa; EditEdge *eed; @@ -667,7 +667,7 @@ static void fix_new_face(EditMesh *em, EditFace *eface) } /* only adds quads or trias when there's edges already */ -void addfaces_from_edgenet(EditMesh *em) +static void addfaces_from_edgenet(EditMesh *em) { EditVert *eve1, *eve2, *eve3, *eve4; @@ -868,10 +868,10 @@ void MESH_OT_edge_face_add(wmOperatorType *ot) // this hack is only used so that scons+mingw + split-sources hack works // ------------------------------- start copied code /* these are not the monkeys you are looking for */ -int monkeyo= 4; -int monkeynv= 271; -int monkeynf= 250; -signed char monkeyv[271][3]= { +static int monkeyo= 4; +static int monkeynv= 271; +static int monkeynf= 250; +static signed char monkeyv[271][3]= { {-71,21,98},{-63,12,88},{-57,7,74},{-82,-3,79},{-82,4,92}, {-82,17,100},{-92,21,102},{-101,12,95},{-107,7,83}, {-117,31,84},{-109,31,95},{-96,31,102},{-92,42,102}, @@ -942,7 +942,7 @@ signed char monkeyv[271][3]= { {-26,-16,-42},{-17,49,-49}, }; -signed char monkeyf[250][4]= { +static signed char monkeyf[250][4]= { {27,4,5,26}, {25,4,5,24}, {3,6,5,4}, {1,6,5,2}, {5,6,7,4}, {3,6,7,2}, {5,8,7,6}, {3,8,7,4}, {7,8,9,6}, {5,8,9,4}, {7,10,9,8}, {5,10,9,6}, {9,10,11,8}, diff --git a/source/blender/editors/mesh/editmesh_lib.c b/source/blender/editors/mesh/editmesh_lib.c index 9ec50fdd6b3..aba8fabc621 100644 --- a/source/blender/editors/mesh/editmesh_lib.c +++ b/source/blender/editors/mesh/editmesh_lib.c @@ -2551,7 +2551,7 @@ static int tag_face_edges_test(EditFace *efa) return (efa->e1->tmp.l || efa->e2->tmp.l || efa->e3->tmp.l) ? 1:0; } -void em_deselect_nth_face(EditMesh *em, int nth, EditFace *efa_act) +static void em_deselect_nth_face(EditMesh *em, int nth, EditFace *efa_act) { EditFace *efa; EditEdge *eed; @@ -2623,7 +2623,7 @@ static int tag_edge_verts_test(EditEdge *eed) return (eed->v1->tmp.l || eed->v2->tmp.l) ? 1:0; } -void em_deselect_nth_edge(EditMesh *em, int nth, EditEdge *eed_act) +static void em_deselect_nth_edge(EditMesh *em, int nth, EditEdge *eed_act) { EditEdge *eed; EditVert *eve; @@ -2699,7 +2699,7 @@ void em_deselect_nth_edge(EditMesh *em, int nth, EditEdge *eed_act) EM_nfaces_selected(em); } -void em_deselect_nth_vert(EditMesh *em, int nth, EditVert *eve_act) +static void em_deselect_nth_vert(EditMesh *em, int nth, EditVert *eve_act) { EditVert *eve; EditEdge *eed; diff --git a/source/blender/editors/mesh/editmesh_loop.c b/source/blender/editors/mesh/editmesh_loop.c index 451c341817b..ede7cf0b7c8 100644 --- a/source/blender/editors/mesh/editmesh_loop.c +++ b/source/blender/editors/mesh/editmesh_loop.c @@ -71,14 +71,10 @@ editmesh_loop: tools with own drawing subloops, select, knife, subdiv #include "mesh_intern.h" /* **** XXX ******** */ -static void BIF_undo_push(const char *UNUSED(arg)) {} -static void BIF_undo(void) {} static void error(const char *UNUSED(arg)) {} -static int qtest(void) {return 0;} /* **** XXX ******** */ - -/* New LoopCut */ +#if 0 /* UNUSED 2.5 */ static void edgering_sel(EditMesh *em, EditEdge *startedge, int select, int previewlines) { EditEdge *eed; @@ -192,7 +188,7 @@ static void edgering_sel(EditMesh *em, EditEdge *startedge, int select, int prev } } -void CutEdgeloop(Object *obedit, wmOperator *op, EditMesh *em, int numcuts) +static void CutEdgeloop(Object *obedit, wmOperator *op, EditMesh *em, int numcuts) { ViewContext vc; // XXX EditEdge *nearest=NULL, *eed; @@ -380,7 +376,7 @@ void CutEdgeloop(Object *obedit, wmOperator *op, EditMesh *em, int numcuts) // DAG_id_tag_update(obedit->data, 0); return; } - +#endif /* *************** LOOP SELECT ************* */ #if 0 diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c index 64bd9695ac9..6e27a81e3f0 100644 --- a/source/blender/editors/mesh/editmesh_mods.c +++ b/source/blender/editors/mesh/editmesh_mods.c @@ -1353,7 +1353,7 @@ int mesh_layers_menu(CustomData *data, int type) { return ret; } -void EM_mesh_copy_edge(EditMesh *em, short type) +static void EM_mesh_copy_edge(EditMesh *em, short type) { EditSelection *ese; short change=0; @@ -1432,7 +1432,7 @@ void EM_mesh_copy_edge(EditMesh *em, short type) } } -void EM_mesh_copy_face(EditMesh *em, wmOperator *op, short type) +static void EM_mesh_copy_face(EditMesh *em, wmOperator *op, short type) { short change=0; @@ -1692,7 +1692,7 @@ void EM_mesh_copy_face_layer(EditMesh *em, wmOperator *op, short type) /* ctrl+c in mesh editmode */ -void mesh_copy_menu(EditMesh *em, wmOperator *op) +static void mesh_copy_menu(EditMesh *em, wmOperator *op) { EditSelection *ese; int ret; @@ -1731,7 +1731,6 @@ void mesh_copy_menu(EditMesh *em, wmOperator *op) } } - /* **************** LOOP SELECTS *************** */ /* selects quads in loop direction of indicated edge */ @@ -2840,7 +2839,7 @@ void MESH_OT_reveal(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } -int select_by_number_vertices_exec(bContext *C, wmOperator *op) +static int select_by_number_vertices_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data)); @@ -2902,7 +2901,7 @@ void MESH_OT_select_by_number_vertices(wmOperatorType *ot) } -int select_mirror_exec(bContext *C, wmOperator *op) +static int select_mirror_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data)); @@ -3223,7 +3222,7 @@ void MESH_OT_faces_select_linked_flat(wmOperatorType *ot) RNA_def_float(ot->srna, "sharpness", 135.0f, 0.0f, FLT_MAX, "sharpness", "", 0.0f, 180.0f); } -void select_non_manifold(EditMesh *em, wmOperator *op ) +static void select_non_manifold(EditMesh *em, wmOperator *op ) { EditVert *eve; EditEdge *eed; @@ -3520,7 +3519,7 @@ void MESH_OT_select_more(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } -void EM_select_less(EditMesh *em) +static void EM_select_less(EditMesh *em) { EditEdge *eed; EditFace *efa; @@ -4067,7 +4066,6 @@ void MESH_OT_normals_make_consistent(wmOperatorType *ot) /* ********** ALIGN WITH VIEW **************** */ - static void editmesh_calc_selvert_center(EditMesh *em, float cent_r[3]) { EditVert *eve; @@ -4101,7 +4099,7 @@ static int mface_is_selected(MFace *mf) * which would use same as vertices method), then added * to interface! Hoera! - zr */ -void faceselect_align_view_to_selected(View3D *v3d, RegionView3D *rv3d, Mesh *me, wmOperator *op, int axis) +static void faceselect_align_view_to_selected(View3D *v3d, RegionView3D *rv3d, Mesh *me, wmOperator *op, int axis) { float norm[3]; int i, totselected = 0; @@ -4158,7 +4156,7 @@ static void face_getnormal_obspace(Object *obedit, EditFace *efa, float *fno) } -void editmesh_align_view_to_selected(Object *obedit, EditMesh *em, wmOperator *op, View3D *v3d, RegionView3D *rv3d, int axis) +static void editmesh_align_view_to_selected(Object *obedit, EditMesh *em, wmOperator *op, View3D *v3d, RegionView3D *rv3d, int axis) { int nselverts= EM_nvertices_selected(em); float norm[3]={0.0, 0.0, 0.0}; /* used for storing the mesh normal */ diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index 090a9aa358f..24c4e887ecc 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -525,7 +525,7 @@ static void xsortvert_flag__doSetX(void *userData, EditVert *UNUSED(eve), int x, } /* all verts with (flag & 'flag') are sorted */ -void xsortvert_flag(bContext *C, int flag) +static void xsortvert_flag(bContext *C, int flag) { ViewContext vc; EditVert *eve; @@ -564,7 +564,7 @@ void xsortvert_flag(bContext *C, int flag) } /* called from buttons */ -void hashvert_flag(EditMesh *em, int flag) +static void hashvert_flag(EditMesh *em, int flag) { /* switch vertex order using hash table */ EditVert *eve; @@ -700,7 +700,7 @@ static int mesh_extrude_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -EnumPropertyItem extrude_items[] = { +static EnumPropertyItem extrude_items[] = { {1, "REGION", 0, "Region", ""}, {2, "FACES", 0, "Individual Faces", ""}, {3, "EDGES", 0, "Only Edges", ""}, @@ -3459,7 +3459,7 @@ void join_triangles(EditMesh *em) #define FACE_MARKCLEAR(f) (f->f1 = 1) /* quick hack, basically a copy of beautify_fill */ -void edge_flip(EditMesh *em) +static void edge_flip(EditMesh *em) { EditVert *v1, *v2, *v3, *v4; EditEdge *eed, *nexted; @@ -3834,7 +3834,7 @@ void MESH_OT_edge_rotate(wmOperatorType *ot) /* XXX old bevel not ported yet */ -void bevel_menu(EditMesh *em) +static void bevel_menu(EditMesh *em) { BME_Mesh *bm; BME_TransData_Head *td; diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c index e0a91048a2c..f144ae60518 100644 --- a/source/blender/editors/mesh/mesh_ops.c +++ b/source/blender/editors/mesh/mesh_ops.c @@ -45,6 +45,7 @@ #include "WM_types.h" #include "ED_object.h" +#include "ED_mesh.h" #include "ED_screen.h" #include "ED_view3d.h" @@ -145,7 +146,7 @@ void ED_operatortypes_mesh(void) WM_operatortype_append(MESH_OT_select_nth); } -int ED_operator_editmesh_face_select(bContext *C) +static int ED_operator_editmesh_face_select(bContext *C) { Object *obedit= CTX_data_edit_object(C); if(obedit && obedit->type==OB_MESH) { diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c index c4fe5f8fbc1..7c45e371a6e 100644 --- a/source/blender/editors/mesh/meshtools.c +++ b/source/blender/editors/mesh/meshtools.c @@ -1055,7 +1055,7 @@ long mesh_mirrtopo_table(Object *ob, char mode) return 0; } -int mesh_get_x_mirror_vert_spacial(Object *ob, int index) +static int mesh_get_x_mirror_vert_spacial(Object *ob, int index) { Mesh *me= ob->data; MVert *mvert; diff --git a/source/blender/editors/metaball/mball_edit.c b/source/blender/editors/metaball/mball_edit.c index b73f73820c7..c3cacfc4c39 100644 --- a/source/blender/editors/metaball/mball_edit.c +++ b/source/blender/editors/metaball/mball_edit.c @@ -48,6 +48,7 @@ #include "BKE_context.h" #include "BKE_mball.h" +#include "ED_mball.h" #include "ED_screen.h" #include "ED_view3d.h" #include "ED_transform.h" @@ -56,6 +57,8 @@ #include "WM_api.h" #include "WM_types.h" +#include "mball_intern.h" + /* This function is used to free all MetaElems from MetaBall */ void free_editMball(Object *obedit) { @@ -605,7 +608,7 @@ static void free_undoMball(void *lbv) MEM_freeN(lb); } -ListBase *metaball_get_editelems(Object *ob) +static ListBase *metaball_get_editelems(Object *ob) { if(ob && ob->type==OB_MBALL) { struct MetaBall *mb= (struct MetaBall*)ob->data; diff --git a/source/blender/editors/metaball/mball_ops.c b/source/blender/editors/metaball/mball_ops.c index 14402d7dae6..6ea094d95af 100644 --- a/source/blender/editors/metaball/mball_ops.c +++ b/source/blender/editors/metaball/mball_ops.c @@ -31,7 +31,7 @@ #include "RNA_access.h" - +#include "ED_mball.h" #include "ED_screen.h" #include "mball_intern.h" diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 08a31923cda..5b747326679 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -971,8 +971,13 @@ static void make_object_duplilist_real(bContext *C, Scene *scene, Base *base) basen->lay= base->lay; BLI_addhead(&scene->base, basen); /* addhead: othwise eternal loop */ basen->object= ob; - ob->ipo= NULL; /* make sure apply works */ - ob->parent= ob->track= NULL; + + /* make sure apply works */ + BKE_free_animdata(&ob->id); + ob->adt = NULL; + + ob->parent= NULL; + ob->constraints.first= ob->constraints.last= NULL; ob->disp.first= ob->disp.last= NULL; ob->transflag &= ~OB_DUPLI; ob->lay= base->lay; diff --git a/source/blender/editors/object/object_bake.c b/source/blender/editors/object/object_bake.c index 0b3e116d266..a5edc7d2598 100644 --- a/source/blender/editors/object/object_bake.c +++ b/source/blender/editors/object/object_bake.c @@ -67,6 +67,8 @@ #include "ED_object.h" +#include "object_intern.h" + /* ****************** render BAKING ********************** */ /* threaded break test */ @@ -117,7 +119,7 @@ typedef struct BakeRender { } BakeRender; /* use by exec and invoke */ -int test_bake_internal(bContext *C, ReportList *reports) +static int test_bake_internal(bContext *C, ReportList *reports) { Scene *scene= CTX_data_scene(C); diff --git a/source/blender/editors/object/object_constraint.c b/source/blender/editors/object/object_constraint.c index f3346bf200c..2358df37806 100644 --- a/source/blender/editors/object/object_constraint.c +++ b/source/blender/editors/object/object_constraint.c @@ -140,7 +140,7 @@ bConstraint *get_active_constraint (Object *ob) /* ------------- PyConstraints ------------------ */ /* this callback sets the text-file to be used for selected menu item */ -void validate_pyconstraint_cb (void *arg1, void *arg2) +static void validate_pyconstraint_cb (void *arg1, void *arg2) { bPythonConstraint *data = arg1; Text *text= NULL; @@ -157,7 +157,7 @@ void validate_pyconstraint_cb (void *arg1, void *arg2) #ifdef WITH_PYTHON /* this returns a string for the list of usable pyconstraint script names */ -char *buildmenu_pyconstraints (Text *con_text, int *pyconindex) +static char *buildmenu_pyconstraints (Text *con_text, int *pyconindex) { DynStr *pupds= BLI_dynstr_new(); Text *text; @@ -199,7 +199,7 @@ char *buildmenu_pyconstraints (Text *con_text, int *pyconindex) #endif /* WITH_PYTHON */ /* this callback gets called when the 'refresh' button of a pyconstraint gets pressed */ -void update_pyconstraint_cb (void *arg1, void *arg2) +static void update_pyconstraint_cb (void *arg1, void *arg2) { #ifndef WITH_PYTHON (void)arg1; /* unused */ diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index bb83827b2cb..cb0b251c101 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -592,15 +592,6 @@ void OBJECT_OT_posemode_toggle(wmOperatorType *ot) /* *********************** */ -void check_editmode(int type) -{ - Object *obedit= NULL; // XXX - - if (obedit==NULL || obedit->type==type) return; - -// XXX ED_object_exit_editmode(C, EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR|EM_DO_UNDO); /* freedata, and undo */ -} - #if 0 // XXX should be in view3d? @@ -725,7 +716,7 @@ static void spot_interactive(Object *ob, int mode) } #endif -void special_editmenu(Scene *scene, View3D *v3d) +static void special_editmenu(Scene *scene, View3D *v3d) { // XXX static short numcuts= 2; Object *ob= OBACT; @@ -1200,7 +1191,7 @@ static void copy_texture_space(Object *to, Object *ob) } -void copy_attr(Main *bmain, Scene *scene, View3D *v3d, short event) +static void copy_attr(Main *bmain, Scene *scene, View3D *v3d, short event) { Object *ob; Base *base; @@ -1448,7 +1439,7 @@ void copy_attr(Main *bmain, Scene *scene, View3D *v3d, short event) DAG_ids_flush_update(bmain, 0); } -void copy_attr_menu(Main *bmain, Scene *scene, View3D *v3d) +static void copy_attr_menu(Main *bmain, Scene *scene, View3D *v3d) { Object *ob; short event; @@ -1719,7 +1710,7 @@ void OBJECT_OT_shade_smooth(wmOperatorType *ot) /* ********************** */ -void image_aspect(Scene *scene, View3D *v3d) +static void image_aspect(Scene *scene, View3D *v3d) { /* all selected objects with an image map: scale in image aspect */ Base *base; @@ -1778,7 +1769,7 @@ void image_aspect(Scene *scene, View3D *v3d) } -int vergbaseco(const void *a1, const void *a2) +static int vergbaseco(const void *a1, const void *a2) { Base **x1, **x2; @@ -1794,7 +1785,7 @@ int vergbaseco(const void *a1, const void *a2) } -void auto_timeoffs(Scene *scene, View3D *v3d) +static void auto_timeoffs(Scene *scene, View3D *v3d) { Base *base, **basesort, **bs; float start, delta; @@ -1835,7 +1826,7 @@ void auto_timeoffs(Scene *scene, View3D *v3d) } -void ofs_timeoffs(Scene *scene, View3D *v3d) +static void ofs_timeoffs(Scene *scene, View3D *v3d) { float offset=0.0f; @@ -1854,7 +1845,7 @@ void ofs_timeoffs(Scene *scene, View3D *v3d) } -void rand_timeoffs(Scene *scene, View3D *v3d) +static void rand_timeoffs(Scene *scene, View3D *v3d) { Base *base; float rand_ofs=0.0f; diff --git a/source/blender/editors/object/object_lattice.c b/source/blender/editors/object/object_lattice.c index 3647d32c28d..375ea82c0b7 100644 --- a/source/blender/editors/object/object_lattice.c +++ b/source/blender/editors/object/object_lattice.c @@ -49,6 +49,8 @@ #include "BKE_lattice.h" #include "BKE_mesh.h" +#include "ED_lattice.h" +#include "ED_object.h" #include "ED_screen.h" #include "ED_view3d.h" #include "ED_util.h" @@ -181,7 +183,7 @@ void ED_setflagsLatt(Object *obedit, int flag) } } -int select_all_exec(bContext *C, wmOperator *op) +static int select_all_exec(bContext *C, wmOperator *op) { Object *obedit= CTX_data_edit_object(C); Lattice *lt= obedit->data; @@ -248,7 +250,7 @@ void LATTICE_OT_select_all(wmOperatorType *ot) WM_operator_properties_select_all(ot); } -int make_regular_poll(bContext *C) +static int make_regular_poll(bContext *C) { Object *ob; @@ -258,7 +260,7 @@ int make_regular_poll(bContext *C) return (ob && ob->type==OB_LATTICE); } -int make_regular_exec(bContext *C, wmOperator *UNUSED(op)) +static int make_regular_exec(bContext *C, wmOperator *UNUSED(op)) { Object *ob= CTX_data_edit_object(C); Lattice *lt; diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c index 0f8e5cec21b..ad79cbb262b 100644 --- a/source/blender/editors/object/object_relations.c +++ b/source/blender/editors/object/object_relations.c @@ -1156,9 +1156,9 @@ void OBJECT_OT_move_to_layer(wmOperatorType *ot) /************************** Link to Scene Operator *****************************/ -void link_to_scene(Main *UNUSED(bmain), unsigned short UNUSED(nr)) -{ #if 0 +static void link_to_scene(Main *UNUSED(bmain), unsigned short UNUSED(nr)) +{ Scene *sce= (Scene*) BLI_findlink(&bmain->scene, G.curscreen->scenenr-1); Base *base, *nbase; @@ -1174,8 +1174,8 @@ void link_to_scene(Main *UNUSED(bmain), unsigned short UNUSED(nr)) id_us_plus((ID *)base->object); } } -#endif } +#endif static int make_links_scene_exec(bContext *C, wmOperator *op) { @@ -1366,7 +1366,7 @@ static void single_object_users__forwardModifierLinks(void *UNUSED(userData), Ob ID_NEW(*obpoin); } -void single_object_users(Scene *scene, View3D *v3d, int flag) +static void single_object_users(Scene *scene, View3D *v3d, int flag) { Base *base; Object *ob, *obn; @@ -1415,7 +1415,7 @@ void single_object_users(Scene *scene, View3D *v3d, int flag) set_sca_new_poins(); } -void new_id_matar(Material **matar, int totcol) +static void new_id_matar(Material **matar, int totcol) { ID *id; int a; @@ -1437,7 +1437,7 @@ void new_id_matar(Material **matar, int totcol) } } -void single_obdata_users(Main *bmain, Scene *scene, int flag) +static void single_obdata_users(Main *bmain, Scene *scene, int flag) { Object *ob; Lamp *la; @@ -1571,7 +1571,7 @@ static void single_mat_users(Scene *scene, int flag, int do_textures) } } -void do_single_tex_user(Tex **from) +static void do_single_tex_user(Tex **from) { Tex *tex, *texn; @@ -1592,7 +1592,7 @@ void do_single_tex_user(Tex **from) } } -void single_tex_users_expand(Main *bmain) +static void single_tex_users_expand(Main *bmain) { /* only when 'parent' blocks are LIB_NEW */ Material *ma; diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c index 3cb20ebbac0..5853a230719 100644 --- a/source/blender/editors/object/object_select.c +++ b/source/blender/editors/object/object_select.c @@ -58,6 +58,7 @@ #include "WM_api.h" #include "WM_types.h" +#include "ED_object.h" #include "ED_screen.h" #include "UI_interface.h" diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c index 355f1c153cf..cf5a5acf6ed 100644 --- a/source/blender/editors/object/object_transform.c +++ b/source/blender/editors/object/object_transform.c @@ -650,7 +650,7 @@ void OBJECT_OT_rotation_apply(wmOperatorType *ot) /************************ Texture Space Transform ****************************/ -void texspace_edit(Scene *scene, View3D *v3d) +static void texspace_edit(Scene *scene, View3D *v3d) { Base *base; int nr=0; diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c index c673ea0fd2d..ab52d527561 100644 --- a/source/blender/editors/object/object_vgroup.c +++ b/source/blender/editors/object/object_vgroup.c @@ -150,7 +150,7 @@ void ED_vgroup_data_create(ID *id) } } -int ED_vgroup_give_parray(ID *id, MDeformVert ***dvert_arr, int *dvert_tot) +static int ED_vgroup_give_parray(ID *id, MDeformVert ***dvert_arr, int *dvert_tot) { if(id) { switch(GS(id->name)) { @@ -304,7 +304,7 @@ int ED_vgroup_copy_array(Object *ob, Object *ob_from) /* for mesh in object mode lattice can be in editmode */ -void ED_vgroup_nr_vert_remove(Object *ob, int def_nr, int vertnum) +static void ED_vgroup_nr_vert_remove(Object *ob, int def_nr, int vertnum) { /* This routine removes the vertex from the deform * group with number def_nr. @@ -372,7 +372,7 @@ void ED_vgroup_nr_vert_remove(Object *ob, int def_nr, int vertnum) /* for Mesh in Object mode */ /* allows editmode for Lattice */ -void ED_vgroup_nr_vert_add(Object *ob, int def_nr, int vertnum, float weight, int assignmode) +static void ED_vgroup_nr_vert_add(Object *ob, int def_nr, int vertnum, float weight, int assignmode) { /* add the vert to the deform group with the * specified number diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c index 5cf6864cdc8..9ea8dde058f 100644 --- a/source/blender/editors/physics/particle_edit.c +++ b/source/blender/editors/physics/particle_edit.c @@ -65,6 +65,7 @@ #include "BIF_gl.h" #include "BIF_glutil.h" +#include "ED_physics.h" #include "ED_mesh.h" #include "ED_particle.h" #include "ED_view3d.h" @@ -939,7 +940,7 @@ static void pe_deflect_emitter(Scene *scene, Object *ob, PTCacheEdit *edit) } } /* force set distances between neighbouring keys */ -void PE_apply_lengths(Scene *scene, PTCacheEdit *edit) +static void PE_apply_lengths(Scene *scene, PTCacheEdit *edit) { ParticleEditSettings *pset=PE_settings(scene); diff --git a/source/blender/editors/physics/physics_fluid.c b/source/blender/editors/physics/physics_fluid.c index 608c0f70c3e..916866d7a70 100644 --- a/source/blender/editors/physics/physics_fluid.c +++ b/source/blender/editors/physics/physics_fluid.c @@ -78,8 +78,8 @@ #include "LBM_fluidsim.h" - #include "ED_screen.h" +#include "ED_fluidsim.h" #include "WM_types.h" @@ -1065,12 +1065,12 @@ FluidsimSettings* fluidsimSettingsCopy(FluidsimSettings *UNUSED(fss)) } /* only compile dummy functions */ -int fluidsimBake(bContext *UNUSED(C), ReportList *UNUSED(reports), Object *UNUSED(ob)) +static int fluidsimBake(bContext *UNUSED(C), ReportList *UNUSED(reports), Object *UNUSED(ob)) { return 0; } -void fluidsimFreeBake(Object *UNUSED(ob)) +static void fluidsimFreeBake(Object *UNUSED(ob)) { } diff --git a/source/blender/editors/physics/physics_pointcache.c b/source/blender/editors/physics/physics_pointcache.c index 9aa879dad67..4c8c69bce01 100644 --- a/source/blender/editors/physics/physics_pointcache.c +++ b/source/blender/editors/physics/physics_pointcache.c @@ -75,13 +75,13 @@ static int ptcache_poll(bContext *C) return (ptr.data && ptr.id.data); } -void bake_console_progress(void *UNUSED(arg), int nr) +static void bake_console_progress(void *UNUSED(arg), int nr) { printf("\rbake: %3i%%", nr); fflush(stdout); } -void bake_console_progress_end(void *UNUSED(arg)) +static void bake_console_progress_end(void *UNUSED(arg)) { printf("\rbake: done!\n"); } diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index 341f56667fa..17d05bed24a 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -197,6 +197,9 @@ void screen_set_image_output(bContext *C, int mx, int my) SpaceImage *sima; int area_was_image=0; + if(scene->r.displaymode==R_OUTPUT_NONE) + return; + if(scene->r.displaymode==R_OUTPUT_WINDOW) { rcti rect; int sizex, sizey; diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c index c2b2a0ad457..1f182723bc8 100644 --- a/source/blender/editors/render/render_opengl.c +++ b/source/blender/editors/render/render_opengl.c @@ -353,8 +353,8 @@ static int screen_opengl_render_anim_initialize(bContext *C, wmOperator *op) } oglrender->cfrao= scene->r.cfra; - oglrender->nfra= SFRA; - scene->r.cfra= SFRA; + oglrender->nfra= PSFRA; + scene->r.cfra= PSFRA; return 1; } @@ -437,7 +437,7 @@ static int screen_opengl_render_anim_step(bContext *C, wmOperator *op) scene->r.cfra++; /* stop at the end or on error */ - if(scene->r.cfra > EFRA || !ok) { + if(scene->r.cfra > PEFRA || !ok) { screen_opengl_render_end(C, op->customdata); return 0; } diff --git a/source/blender/editors/render/render_ops.c b/source/blender/editors/render/render_ops.c index 8172144c8ac..62f573c031f 100644 --- a/source/blender/editors/render/render_ops.c +++ b/source/blender/editors/render/render_ops.c @@ -30,6 +30,8 @@ #include "WM_api.h" +#include "ED_render.h" + #include "render_intern.h" // own include #if (defined(WITH_QUICKTIME) && !defined(USE_QTKIT)) diff --git a/source/blender/editors/render/render_shading.c b/source/blender/editors/render/render_shading.c index 852f006aa9a..95523cba85e 100644 --- a/source/blender/editors/render/render_shading.c +++ b/source/blender/editors/render/render_shading.c @@ -75,6 +75,7 @@ #include "WM_api.h" #include "WM_types.h" +#include "ED_render.h" #include "ED_curve.h" #include "ED_mesh.h" @@ -1558,7 +1559,7 @@ void ED_render_clear_mtex_copybuf(void) mtexcopied= 0; } -void copy_mtex_copybuf(ID *id) +static void copy_mtex_copybuf(ID *id) { MTex **mtex= NULL; @@ -1588,7 +1589,7 @@ void copy_mtex_copybuf(ID *id) } } -void paste_mtex_copybuf(ID *id) +static void paste_mtex_copybuf(ID *id) { MTex **mtex= NULL; diff --git a/source/blender/editors/screen/screen_context.c b/source/blender/editors/screen/screen_context.c index 7374b579cab..931cc06d6cd 100644 --- a/source/blender/editors/screen/screen_context.c +++ b/source/blender/editors/screen/screen_context.c @@ -47,6 +47,20 @@ #include "ED_object.h" #include "ED_armature.h" +#include "screen_intern.h" + +const char *screen_context_dir[] = { + "scene", "visible_objects", "visible_bases", "selectable_objects", "selectable_bases", + "selected_objects", "selected_bases", + "selected_editable_objects", "selected_editable_bases", + "visible_bones", "editable_bones", "selected_bones", "selected_editable_bones", + "visible_pose_bones", "selected_pose_bones", "active_bone", "active_pose_bone", + "active_base", "active_object", "object", "edit_object", + "sculpt_object", "vertex_paint_object", "weight_paint_object", + "texture_paint_object", "particle_edit_object", + "sequences", "selected_sequences", "selected_editable_sequences", /* sequencer */ + NULL}; + int ed_screen_context(const bContext *C, const char *member, bContextDataResult *result) { bScreen *sc= CTX_wm_screen(C); @@ -65,19 +79,7 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult #endif if(CTX_data_dir(member)) { - static const char *dir[] = { - "scene", "visible_objects", "visible_bases", "selectable_objects", "selectable_bases", - "selected_objects", "selected_bases", - "selected_editable_objects", "selected_editable_bases", - "visible_bones", "editable_bones", "selected_bones", "selected_editable_bones", - "visible_pose_bones", "selected_pose_bones", "active_bone", "active_pose_bone", - "active_base", "active_object", "object", "edit_object", - "sculpt_object", "vertex_paint_object", "weight_paint_object", - "texture_paint_object", "particle_edit_object", - "sequences", "selected_sequences", "selected_editable_sequences", /* sequencer */ - NULL}; - - CTX_data_dir_set(result, dir); + CTX_data_dir_set(result, screen_context_dir); return 1; } else if(CTX_data_equals(member, "scene")) { diff --git a/source/blender/editors/screen/screen_intern.h b/source/blender/editors/screen/screen_intern.h index ee448e70779..5f0d264ea4b 100644 --- a/source/blender/editors/screen/screen_intern.h +++ b/source/blender/editors/screen/screen_intern.h @@ -51,10 +51,12 @@ void removenotused_scredges(bScreen *sc); int scredge_is_horizontal(ScrEdge *se); ScrEdge *screen_find_active_scredge(bScreen *sc, int mx, int my); -AZone *is_in_area_actionzone(ScrArea *sa, int x, int y); +struct AZone *is_in_area_actionzone(ScrArea *sa, int x, int y); /* screen_context.c */ -void ed_screen_context(const bContext *C, const char *member, bContextDataResult *result); +int ed_screen_context(const bContext *C, const char *member, bContextDataResult *result); + +extern const char *screen_context_dir[]; /* doc access */ /* screendump.c */ void SCREEN_OT_screenshot(struct wmOperatorType *ot); diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 9267f4d4e80..33c1fce4872 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -2470,7 +2470,7 @@ static int header_toolbox_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *U return OPERATOR_CANCELLED; } -void SCREEN_OT_header_toolbox(wmOperatorType *ot) +static void SCREEN_OT_header_toolbox(wmOperatorType *ot) { /* identifiers */ ot->name= "Header Toolbox"; @@ -2917,7 +2917,7 @@ static int screen_new_exec(bContext *C, wmOperator *UNUSED(op)) return OPERATOR_FINISHED; } -void SCREEN_OT_new(wmOperatorType *ot) +static void SCREEN_OT_new(wmOperatorType *ot) { /* identifiers */ ot->name= "New Screen"; @@ -2942,7 +2942,7 @@ static int screen_delete_exec(bContext *C, wmOperator *UNUSED(op)) return OPERATOR_FINISHED; } -void SCREEN_OT_delete(wmOperatorType *ot) +static void SCREEN_OT_delete(wmOperatorType *ot) { /* identifiers */ ot->name= "Delete Screen"; //was scene @@ -2977,7 +2977,7 @@ static int scene_new_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void SCENE_OT_new(wmOperatorType *ot) +static void SCENE_OT_new(wmOperatorType *ot) { static EnumPropertyItem type_items[]= { {SCE_COPY_EMPTY, "EMPTY", 0, "Empty", "Add empty scene"}, @@ -3013,7 +3013,7 @@ static int scene_delete_exec(bContext *C, wmOperator *UNUSED(op)) return OPERATOR_FINISHED; } -void SCENE_OT_delete(wmOperatorType *ot) +static void SCENE_OT_delete(wmOperatorType *ot) { /* identifiers */ ot->name= "Delete Scene"; diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c index 6a8d5043c43..7f247b9e815 100644 --- a/source/blender/editors/sculpt_paint/paint_image.c +++ b/source/blender/editors/sculpt_paint/paint_image.c @@ -1238,7 +1238,7 @@ static void project_face_pixel(const MTFace *tf_other, ImBuf *ibuf_other, const } /* run this outside project_paint_uvpixel_init since pixels with mask 0 dont need init */ -float project_paint_uvpixel_mask( +static float project_paint_uvpixel_mask( const ProjPaintState *ps, const int face_index, const int side, @@ -2141,7 +2141,7 @@ if __name__ == '__main__': /* checks if pt is inside a convex 2D polyline, the polyline must be ordered rotating clockwise * otherwise it would have to test for mixed (line_point_side_v2 > 0.0f) cases */ -int IsectPoly2Df(const float pt[2], float uv[][2], const int tot) +static int IsectPoly2Df(const float pt[2], float uv[][2], const int tot) { int i; if (line_point_side_v2(uv[tot-1], uv[0], pt) < 0.0f) @@ -2202,7 +2202,7 @@ static void project_paint_face_init(const ProjPaintState *ps, const int thread_i float tf_uv_pxoffset[4][2]; /* bucket bounds in UV space so we can init pixels only for this face, */ float xhalfpx, yhalfpx; - const float ibuf_xf = ibuf->x, ibuf_yf = ibuf->y; + const float ibuf_xf = (float)ibuf->x, ibuf_yf = (float)ibuf->y; int has_x_isect = 0, has_isect = 0; /* for early loop exit */ diff --git a/source/blender/editors/sculpt_paint/paint_ops.c b/source/blender/editors/sculpt_paint/paint_ops.c index 1ba0891751e..35111afb430 100644 --- a/source/blender/editors/sculpt_paint/paint_ops.c +++ b/source/blender/editors/sculpt_paint/paint_ops.c @@ -28,6 +28,7 @@ #include "BKE_context.h" #include "BKE_paint.h" +#include "ED_sculpt.h" #include "ED_screen.h" #include "UI_resources.h" @@ -60,7 +61,7 @@ static int brush_add_exec(bContext *C, wmOperator *UNUSED(op)) return OPERATOR_FINISHED; } -void BRUSH_OT_add(wmOperatorType *ot) +static void BRUSH_OT_add(wmOperatorType *ot) { /* identifiers */ ot->name= "Add Brush"; @@ -115,7 +116,7 @@ static int brush_scale_size_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void BRUSH_OT_scale_size(wmOperatorType *ot) +static void BRUSH_OT_scale_size(wmOperatorType *ot) { /* identifiers */ ot->name= "Scale Sculpt/Paint Brush Size"; @@ -142,7 +143,7 @@ static int vertex_color_set_exec(bContext *C, wmOperator *UNUSED(op)) return OPERATOR_FINISHED; } -void PAINT_OT_vertex_color_set(wmOperatorType *ot) +static void PAINT_OT_vertex_color_set(wmOperatorType *ot) { /* identifiers */ ot->name= "Set Vertex Colors"; @@ -171,7 +172,7 @@ static int brush_reset_exec(bContext *C, wmOperator *UNUSED(op)) return OPERATOR_FINISHED; } -void BRUSH_OT_reset(wmOperatorType *ot) +static void BRUSH_OT_reset(wmOperatorType *ot) { /* identifiers */ ot->name= "Reset Brush"; @@ -337,8 +338,8 @@ void ED_keymap_paint(wmKeyConfig *keyconf) ed_keymap_paint_brush_size(keymap, "tool_settings.sculpt.brush.size"); /* */ - kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", AKEY, KM_PRESS, 0, 0); - RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush.use_anchor"); + kmi = WM_keymap_add_item(keymap, "WM_OT_context_menu_enum", AKEY, KM_PRESS, 0, 0); + RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush.stroke_method"); kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", SKEY, KM_PRESS, KM_SHIFT, 0); RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush.use_smooth_stroke"); diff --git a/source/blender/editors/sculpt_paint/paint_stroke.c b/source/blender/editors/sculpt_paint/paint_stroke.c index 92b5c541ea2..3a67775cb98 100644 --- a/source/blender/editors/sculpt_paint/paint_stroke.c +++ b/source/blender/editors/sculpt_paint/paint_stroke.c @@ -362,7 +362,7 @@ static int project_brush_radius(RegionView3D* rv3d, float radius, float location return len_v2v2(p1, p2); } -int sculpt_get_brush_geometry(bContext* C, int x, int y, int* pixel_radius, +static int sculpt_get_brush_geometry(bContext* C, int x, int y, int* pixel_radius, float location[3]) { struct PaintStroke *stroke; diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c index 832d657428c..575b0012c6c 100644 --- a/source/blender/editors/sculpt_paint/paint_vertex.c +++ b/source/blender/editors/sculpt_paint/paint_vertex.c @@ -157,7 +157,7 @@ static int *get_indexarray(Mesh *me) /* in contradiction to cpack drawing colors, the MCOL colors (vpaint colors) are per byte! so not endian sensitive. Mcol = ABGR!!! so be cautious with cpack calls */ -unsigned int rgba_to_mcol(float r, float g, float b, float a) +static unsigned int rgba_to_mcol(float r, float g, float b, float a) { int ir, ig, ib, ia; unsigned int col; @@ -853,7 +853,7 @@ static void wpaint_blend(VPaint *wp, MDeformWeight *dw, MDeformWeight *uw, float /* else */ /* sets wp->weight to the closest weight value to vertex */ /* note: we cant sample frontbuf, weight colors are interpolated too unpredictable */ -void sample_wpaint(Scene *scene, ARegion *ar, View3D *UNUSED(v3d), int mode) +static void sample_wpaint(Scene *scene, ARegion *ar, View3D *UNUSED(v3d), int mode) { ViewContext vc; ToolSettings *ts= scene->toolsettings; diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index 69e42d87148..fa8d61d73de 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -140,7 +140,7 @@ struct MultiresModifierData *sculpt_multires_active(Scene *scene, Object *ob) } /* Check if there are any active modifiers in stack (used for flushing updates at enter/exit sculpt mode) */ -int sculpt_has_active_modifiers(Scene *scene, Object *ob) +static int sculpt_has_active_modifiers(Scene *scene, Object *ob) { ModifierData *md; @@ -252,7 +252,7 @@ typedef struct StrokeCache { /*** BVH Tree ***/ /* Get a screen-space rectangle of the modified area */ -int sculpt_get_redraw_rect(ARegion *ar, RegionView3D *rv3d, +static int sculpt_get_redraw_rect(ARegion *ar, RegionView3D *rv3d, Object *ob, rcti *rect) { PBVH *pbvh= ob->sculpt->pbvh; @@ -504,7 +504,7 @@ static void flip_coord(float out[3], float in[3], const char symm) out[2]= in[2]; } -float calc_overlap(StrokeCache *cache, const char symm, const char axis, const float angle) +static float calc_overlap(StrokeCache *cache, const char symm, const char axis, const float angle) { float mirror[3]; float distsq; @@ -2446,11 +2446,34 @@ static void sculpt_update_keyblock(SculptSession *ss) } /* flush displacement from deformed PBVH to original layer */ -static void sculpt_flush_stroke_deform(SculptSession *ss) +static void sculpt_flush_stroke_deform(Sculpt *sd, SculptSession *ss) { if(!ss->kb) { Object *ob= ss->ob; Mesh *me= (Mesh*)ob->data; + Brush *brush= paint_brush(&sd->paint); + + if(ELEM(brush->sculpt_tool, SCULPT_TOOL_SMOOTH, SCULPT_TOOL_LAYER)) { + /* this brushes aren't using proxies, so sculpt_combine_proxies() wouldn't + propagate needed deformation to original base */ + + int n, totnode; + PBVHNode** nodes; + PBVHVertexIter vd; + + BLI_pbvh_search_gather(ss->pbvh, NULL, NULL, &nodes, &totnode); + + #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP) + for (n= 0; n < totnode; n++) { + + BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) { + sculpt_flush_pbvhvert_deform(ss, &vd); + } + BLI_pbvh_vertex_iter_end; + } + + MEM_freeN(nodes); + } /* Modifiers could depend on mesh normals, so we should update them/ Note, then if sculpting happens on locked key, normals should be re-calculated @@ -2568,7 +2591,7 @@ static void do_symmetrical_brush_actions(Sculpt *sd, SculptSession *ss) sculpt_fix_noise_tear(sd, ss); if (ss->modifiers_active) - sculpt_flush_stroke_deform(ss); + sculpt_flush_stroke_deform(sd, ss); cache->first_time= 0; } @@ -3163,7 +3186,7 @@ typedef struct { int original; } SculptRaycastData; -void sculpt_raycast_cb(PBVHNode *node, void *data_v, float* tmin) +static void sculpt_raycast_cb(PBVHNode *node, void *data_v, float* tmin) { if (BLI_pbvh_node_get_tmin(node) < *tmin) { SculptRaycastData *srd = data_v; diff --git a/source/blender/editors/sound/sound_ops.c b/source/blender/editors/sound/sound_ops.c index 30edc659fcb..df554efd979 100644 --- a/source/blender/editors/sound/sound_ops.c +++ b/source/blender/editors/sound/sound_ops.c @@ -61,6 +61,7 @@ #include "AUD_C-API.h" +#include "ED_sound.h" #include "ED_util.h" #include "sound_intern.h" @@ -189,7 +190,7 @@ static int pack_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void SOUND_OT_pack(wmOperatorType *ot) +static void SOUND_OT_pack(wmOperatorType *ot) { /* identifiers */ ot->name= "Pack Sound"; @@ -253,7 +254,7 @@ static int sound_unpack_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(even return OPERATOR_FINISHED; } -void SOUND_OT_unpack(wmOperatorType *ot) +static void SOUND_OT_unpack(wmOperatorType *ot) { /* identifiers */ ot->name= "Unpack Sound"; diff --git a/source/blender/editors/space_action/action_draw.c b/source/blender/editors/space_action/action_draw.c index 4dc77e13192..7bd326bac68 100644 --- a/source/blender/editors/space_action/action_draw.c +++ b/source/blender/editors/space_action/action_draw.c @@ -58,6 +58,7 @@ #include "ED_anim_api.h" #include "ED_keyframes_draw.h" +#include "action_intern.h" /* ************************************************************************* */ /* Channel List */ diff --git a/source/blender/editors/space_action/action_edit.c b/source/blender/editors/space_action/action_edit.c index 4719c10e941..852927898b9 100644 --- a/source/blender/editors/space_action/action_edit.c +++ b/source/blender/editors/space_action/action_edit.c @@ -426,7 +426,7 @@ void ACTION_OT_paste (wmOperatorType *ot) /* ******************** Insert Keyframes Operator ************************* */ /* defines for insert keyframes tool */ -EnumPropertyItem prop_actkeys_insertkey_types[] = { +static EnumPropertyItem prop_actkeys_insertkey_types[] = { {1, "ALL", 0, "All Channels", ""}, {2, "SEL", 0, "Only Selected Channels", ""}, {3, "GROUP", 0, "In Active Group", ""}, // xxx not in all cases @@ -808,7 +808,7 @@ void ACTION_OT_sample (wmOperatorType *ot) /* ******************** Set Extrapolation-Type Operator *********************** */ /* defines for set extrapolation-type for selected keyframes tool */ -EnumPropertyItem prop_actkeys_expo_types[] = { +static EnumPropertyItem prop_actkeys_expo_types[] = { {FCURVE_EXTRAPOLATE_CONSTANT, "CONSTANT", 0, "Constant Extrapolation", ""}, {FCURVE_EXTRAPOLATE_LINEAR, "LINEAR", 0, "Linear Extrapolation", ""}, {0, NULL, 0, NULL, NULL} @@ -955,7 +955,7 @@ void ACTION_OT_interpolation_type (wmOperatorType *ot) /* ******************** Set Handle-Type Operator *********************** */ -EnumPropertyItem actkeys_handle_type_items[] = { +static EnumPropertyItem actkeys_handle_type_items[] = { {HD_FREE, "FREE", 0, "Free", ""}, {HD_VECT, "VECTOR", 0, "Vector", ""}, {HD_ALIGN, "ALIGNED", 0, "Aligned", ""}, @@ -1188,7 +1188,7 @@ void ACTION_OT_frame_jump (wmOperatorType *ot) /* ******************** Snap Keyframes Operator *********************** */ /* defines for snap keyframes tool */ -EnumPropertyItem prop_actkeys_snap_types[] = { +static EnumPropertyItem prop_actkeys_snap_types[] = { {ACTKEYS_SNAP_CFRA, "CFRA", 0, "Current frame", ""}, {ACTKEYS_SNAP_NEAREST_FRAME, "NEAREST_FRAME", 0, "Nearest Frame", ""}, // XXX as single entry? {ACTKEYS_SNAP_NEAREST_SECOND, "NEAREST_SECOND", 0, "Nearest Second", ""}, // XXX as single entry? @@ -1288,7 +1288,7 @@ void ACTION_OT_snap (wmOperatorType *ot) /* ******************** Mirror Keyframes Operator *********************** */ /* defines for mirror keyframes tool */ -EnumPropertyItem prop_actkeys_mirror_types[] = { +static EnumPropertyItem prop_actkeys_mirror_types[] = { {ACTKEYS_MIRROR_CFRA, "CFRA", 0, "By Times over Current frame", ""}, {ACTKEYS_MIRROR_XAXIS, "XAXIS", 0, "By Values over Value=0", ""}, {ACTKEYS_MIRROR_MARKER, "MARKER", 0, "By Times over First Selected Marker", ""}, diff --git a/source/blender/editors/space_action/action_intern.h b/source/blender/editors/space_action/action_intern.h index cc363b76479..b483a3edbdc 100644 --- a/source/blender/editors/space_action/action_intern.h +++ b/source/blender/editors/space_action/action_intern.h @@ -59,14 +59,14 @@ void ACTION_OT_select_column(struct wmOperatorType *ot); void ACTION_OT_select_linked(struct wmOperatorType *ot); void ACTION_OT_select_more(struct wmOperatorType *ot); void ACTION_OT_select_less(struct wmOperatorType *ot); +void ACTION_OT_select_leftright(struct wmOperatorType *ot); void ACTION_OT_clickselect(struct wmOperatorType *ot); /* defines for left-right select tool */ enum { - ACTKEYS_LRSEL_TEST = -1, - ACTKEYS_LRSEL_NONE, + ACTKEYS_LRSEL_TEST = 0, ACTKEYS_LRSEL_LEFT, - ACTKEYS_LRSEL_RIGHT, + ACTKEYS_LRSEL_RIGHT } eActKeys_LeftRightSelect_Mode; /* defines for column-select mode */ diff --git a/source/blender/editors/space_action/action_ops.c b/source/blender/editors/space_action/action_ops.c index ea36ce98ecb..3b448becf8b 100644 --- a/source/blender/editors/space_action/action_ops.c +++ b/source/blender/editors/space_action/action_ops.c @@ -58,6 +58,7 @@ void action_operatortypes(void) WM_operatortype_append(ACTION_OT_select_linked); WM_operatortype_append(ACTION_OT_select_more); WM_operatortype_append(ACTION_OT_select_less); + WM_operatortype_append(ACTION_OT_select_leftright); /* editing */ WM_operatortype_append(ACTION_OT_snap); @@ -96,8 +97,16 @@ static void action_keymap_keyframes (wmKeyConfig *keyconf, wmKeyMap *keymap) kmi= WM_keymap_add_item(keymap, "ACTION_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_ALT|KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "extend", 1); RNA_boolean_set(kmi->ptr, "column", 1); - kmi= WM_keymap_add_item(keymap, "ACTION_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_CTRL, 0); - RNA_enum_set(kmi->ptr, "left_right", ACTKEYS_LRSEL_TEST); + + /* select left/right */ + WM_keymap_add_item(keymap, "ACTION_OT_select_leftright", SELECTMOUSE, KM_PRESS, KM_CTRL, 0); + kmi= WM_keymap_add_item(keymap, "ACTION_OT_select_leftright", SELECTMOUSE, KM_PRESS, KM_CTRL|KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "extend", 1); + + kmi= WM_keymap_add_item(keymap, "ACTION_OT_select_leftright", LEFTBRACKETKEY, KM_PRESS, 0, 0); + RNA_enum_set(kmi->ptr, "mode", ACTKEYS_LRSEL_LEFT); + kmi= WM_keymap_add_item(keymap, "ACTION_OT_select_leftright", RIGHTBRACKETKEY, KM_PRESS, 0, 0); + RNA_enum_set(kmi->ptr, "mode", ACTKEYS_LRSEL_RIGHT); /* deselect all */ WM_keymap_add_item(keymap, "ACTION_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0); diff --git a/source/blender/editors/space_action/action_select.c b/source/blender/editors/space_action/action_select.c index 365c17d45c0..639ed372c67 100644 --- a/source/blender/editors/space_action/action_select.c +++ b/source/blender/editors/space_action/action_select.c @@ -186,7 +186,7 @@ enum { ACTKEYS_BORDERSEL_ALLKEYS = 0, ACTKEYS_BORDERSEL_FRAMERANGE, ACTKEYS_BORDERSEL_CHANNELS, -} eActKeys_BorderSelect_Mode; +} /*eActKeys_BorderSelect_Mode*/; static void borderselect_action (bAnimContext *ac, rcti rect, short mode, short selectmode) @@ -705,53 +705,20 @@ void ACTION_OT_select_less (wmOperatorType *ot) ot->flag= OPTYPE_REGISTER/*|OPTYPE_UNDO*/; } -/* ******************** Mouse-Click Select Operator *********************** */ -/* This operator works in one of three ways: - * - 1) keyframe under mouse - no special modifiers - * - 2) all keyframes on the same side of current frame indicator as mouse - ALT modifier - * - 3) column select all keyframes in frame under mouse - CTRL modifier - * - * In addition to these basic options, the SHIFT modifier can be used to toggle the - * selection mode between replacing the selection (without) and inverting the selection (with). - */ +/* ******************** Select Left/Right Operator ************************* */ +/* Select keyframes left/right of the current frame indicator */ /* defines for left-right select tool */ static EnumPropertyItem prop_actkeys_leftright_select_types[] = { {ACTKEYS_LRSEL_TEST, "CHECK", 0, "Check if Select Left or Right", ""}, - {ACTKEYS_LRSEL_NONE, "OFF", 0, "Don't select", ""}, {ACTKEYS_LRSEL_LEFT, "LEFT", 0, "Before current frame", ""}, {ACTKEYS_LRSEL_RIGHT, "RIGHT", 0, "After current frame", ""}, {0, NULL, 0, NULL, NULL} }; -/* sensitivity factor for frame-selections */ -#define FRAME_CLICK_THRESH 0.1f +/* --------------------------------- */ -/* ------------------- */ - -/* option 1) select keyframe directly under mouse */ -static void actkeys_mselect_single (bAnimContext *ac, bAnimListElem *ale, short select_mode, float selx) -{ - bDopeSheet *ads= (ac->datatype == ANIMCONT_DOPESHEET) ? ac->data : NULL; - int ds_filter = ((ads) ? (ads->filterflag) : (0)); - - KeyframeEditData ked= {{0}}; - KeyframeEditFunc select_cb, ok_cb; - - /* get functions for selecting keyframes */ - select_cb= ANIM_editkeyframes_select(select_mode); - ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAME); - ked.f1= selx; - - /* select the nominated keyframe on the given frame */ - if (ale->type == ANIMTYPE_GPLAYER) - select_gpencil_frame(ale->data, selx, select_mode); - else - ANIM_animchannel_keyframes_loop(&ked, ale, ok_cb, select_cb, NULL, ds_filter); -} - -/* Option 2) Selects all the keyframes on either side of the current frame (depends on which side the mouse is on) */ -static void actkeys_mselect_leftright (bAnimContext *ac, short leftright, short select_mode) +static void actkeys_select_leftright (bAnimContext *ac, short leftright, short select_mode) { ListBase anim_data = {NULL, NULL}; bAnimListElem *ale; @@ -773,13 +740,13 @@ static void actkeys_mselect_leftright (bAnimContext *ac, short leftright, short /* set callbacks and editing data */ ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE); select_cb= ANIM_editkeyframes_select(select_mode); - + if (leftright == ACTKEYS_LRSEL_LEFT) { ked.f1 = MINAFRAMEF; - ked.f2 = (float)(CFRA + FRAME_CLICK_THRESH); + ked.f2 = (float)(CFRA + 0.1f); } else { - ked.f1 = (float)(CFRA - FRAME_CLICK_THRESH); + ked.f1 = (float)(CFRA - 0.1f); ked.f2 = MAXFRAMEF; } @@ -790,7 +757,7 @@ static void actkeys_mselect_leftright (bAnimContext *ac, short leftright, short filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); - /* select keys on the side where most data occurs */ + /* select keys */ for (ale= anim_data.first; ale; ale= ale->next) { AnimData *adt= ANIM_nla_mapping_get(ac, ale); @@ -806,7 +773,7 @@ static void actkeys_mselect_leftright (bAnimContext *ac, short leftright, short } /* Sync marker support */ - if ((select_mode==SELECT_ADD) && ELEM(leftright, ACTKEYS_LRSEL_LEFT, ACTKEYS_LRSEL_RIGHT)) { + if (select_mode==SELECT_ADD) { SpaceAction *saction= ac->sa->spacedata.first; if ((saction) && (saction->flag & SACTION_MARKERS_MOVE)) { @@ -830,6 +797,130 @@ static void actkeys_mselect_leftright (bAnimContext *ac, short leftright, short BLI_freelistN(&anim_data); } +/* ----------------- */ + +static int actkeys_select_leftright_exec (bContext *C, wmOperator *op) +{ + bAnimContext ac; + short leftright = RNA_enum_get(op->ptr, "mode"); + short selectmode; + + /* get editor data */ + if (ANIM_animdata_get_context(C, &ac) == 0) + return OPERATOR_CANCELLED; + + /* select mode is either replace (deselect all, then add) or add/extend */ + if (RNA_boolean_get(op->ptr, "extend")) + selectmode= SELECT_INVERT; + else + selectmode= SELECT_REPLACE; + + /* if "test" mode is set, we don't have any info to set this with */ + if (leftright == ACTKEYS_LRSEL_TEST) + return OPERATOR_CANCELLED; + + /* do the selecting now */ + actkeys_select_leftright(&ac, leftright, selectmode); + + /* set notifier that keyframe selection (and channels too) have changed */ + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|ND_ANIMCHAN|NA_SELECTED, NULL); + + return OPERATOR_FINISHED; +} + +static int actkeys_select_leftright_invoke (bContext *C, wmOperator *op, wmEvent *event) +{ + bAnimContext ac; + short leftright = RNA_enum_get(op->ptr, "mode"); + + /* get editor data */ + if (ANIM_animdata_get_context(C, &ac) == 0) + return OPERATOR_CANCELLED; + + /* handle mode-based testing */ + if (leftright == ACTKEYS_LRSEL_TEST) { + Scene *scene= ac.scene; + ARegion *ar= ac.ar; + View2D *v2d= &ar->v2d; + + int mval[2]; + float x; + + /* get mouse coordinates (in region coordinates) */ + mval[0]= (event->x - ar->winrct.xmin); + mval[1]= (event->y - ar->winrct.ymin); + + /* determine which side of the current frame mouse is on */ + UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, NULL); + if (x < CFRA) + RNA_int_set(op->ptr, "mode", ACTKEYS_LRSEL_LEFT); + else + RNA_int_set(op->ptr, "mode", ACTKEYS_LRSEL_RIGHT); + } + + /* perform selection */ + return actkeys_select_leftright_exec(C, op); +} + +void ACTION_OT_select_leftright (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Select Left/Right"; + ot->idname= "ACTION_OT_select_leftright"; + ot->description= "Select keyframes to the left or the right of the current frame"; + + /* api callbacks */ + ot->invoke= actkeys_select_leftright_invoke; + ot->exec= actkeys_select_leftright_exec; + ot->poll= ED_operator_action_active; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* id-props */ + ot->prop= RNA_def_enum(ot->srna, "mode", prop_actkeys_leftright_select_types, ACTKEYS_LRSEL_TEST, "Mode", ""); + RNA_def_boolean(ot->srna, "extend", 0, "Extend Select", ""); +} + +/* ******************** Mouse-Click Select Operator *********************** */ +/* This operator works in one of three ways: + * - 1) keyframe under mouse - no special modifiers + * - 2) all keyframes on the same side of current frame indicator as mouse - ALT modifier + * - 3) column select all keyframes in frame under mouse - CTRL modifier + * + * In addition to these basic options, the SHIFT modifier can be used to toggle the + * selection mode between replacing the selection (without) and inverting the selection (with). + */ + +/* sensitivity factor for frame-selections */ +#define FRAME_CLICK_THRESH 0.1f + +/* ------------------- */ + +/* option 1) select keyframe directly under mouse */ +static void actkeys_mselect_single (bAnimContext *ac, bAnimListElem *ale, short select_mode, float selx) +{ + bDopeSheet *ads= (ac->datatype == ANIMCONT_DOPESHEET) ? ac->data : NULL; + int ds_filter = ((ads) ? (ads->filterflag) : (0)); + + KeyframeEditData ked= {{0}}; + KeyframeEditFunc select_cb, ok_cb; + + /* get functions for selecting keyframes */ + select_cb= ANIM_editkeyframes_select(select_mode); + ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAME); + ked.f1= selx; + + /* select the nominated keyframe on the given frame */ + if (ale->type == ANIMTYPE_GPLAYER) + select_gpencil_frame(ale->data, selx, select_mode); + else + ANIM_animchannel_keyframes_loop(&ked, ale, ok_cb, select_cb, NULL, ds_filter); +} + +/* Option 2) Selects all the keyframes on either side of the current frame (depends on which side the mouse is on) */ +/* (see actkeys_select_leftright) */ + /* Option 3) Selects all visible keyframes in the same frame as the mouse click */ static void actkeys_mselect_column(bAnimContext *ac, short select_mode, float selx) { @@ -1089,23 +1180,8 @@ static int actkeys_clickselect_invoke(bContext *C, wmOperator *op, wmEvent *even /* column selection */ column= RNA_boolean_get(op->ptr, "column"); - /* figure out action to take */ - if (RNA_enum_get(op->ptr, "left_right")) { - /* select all keys on same side of current frame as mouse */ - float x; - - UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, NULL); - if (x < CFRA) - RNA_int_set(op->ptr, "left_right", ACTKEYS_LRSEL_LEFT); - else - RNA_int_set(op->ptr, "left_right", ACTKEYS_LRSEL_RIGHT); - - actkeys_mselect_leftright(&ac, RNA_enum_get(op->ptr, "left_right"), selectmode); - } - else { - /* select keyframe(s) based upon mouse position*/ - mouse_action_keys(&ac, mval, selectmode, column); - } + /* select keyframe(s) based upon mouse position*/ + mouse_action_keys(&ac, mval, selectmode, column); /* set notifier that keyframe selection (and channels too) have changed */ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|ND_ANIMCHAN|NA_SELECTED, NULL); @@ -1129,8 +1205,6 @@ void ACTION_OT_clickselect (wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* id-props */ - // XXX should we make this into separate operators? - RNA_def_enum(ot->srna, "left_right", prop_actkeys_leftright_select_types, 0, "Left Right", ""); // CTRLKEY RNA_def_boolean(ot->srna, "extend", 0, "Extend Select", ""); // SHIFTKEY RNA_def_boolean(ot->srna, "column", 0, "Column Select", ""); // ALTKEY } diff --git a/source/blender/editors/space_action/space_action.c b/source/blender/editors/space_action/space_action.c index 792f212f638..3f3611d75f5 100644 --- a/source/blender/editors/space_action/space_action.c +++ b/source/blender/editors/space_action/space_action.c @@ -52,6 +52,7 @@ #include "UI_resources.h" #include "UI_view2d.h" +#include "ED_space_api.h" #include "ED_anim_api.h" #include "ED_markers.h" diff --git a/source/blender/editors/space_api/spacetypes.c b/source/blender/editors/space_api/spacetypes.c index 0aac167fed2..a00b5a50229 100644 --- a/source/blender/editors/space_api/spacetypes.c +++ b/source/blender/editors/space_api/spacetypes.c @@ -266,7 +266,7 @@ static void xxx_keymap(wmKeyConfig *UNUSED(keyconf)) } /* only called once, from screen/spacetypes.c */ -void ED_spacetype_xxx(void) +static void ED_spacetype_xxx(void) { static SpaceType st; diff --git a/source/blender/editors/space_buttons/buttons_context.c b/source/blender/editors/space_buttons/buttons_context.c index ee8b67a146a..dda5887aef0 100644 --- a/source/blender/editors/space_buttons/buttons_context.c +++ b/source/blender/editors/space_buttons/buttons_context.c @@ -307,7 +307,12 @@ static int buttons_context_path_particle(ButsContextPath *path) { Object *ob; ParticleSystem *psys; + PointerRNA *ptr= &path->ptr[path->len-1]; + /* if we already have (pinned) particle settings, we're done */ + if(RNA_struct_is_a(ptr->type, &RNA_ParticleSettings)) { + return 1; + } /* if we have an object, get the active particle system */ if(buttons_context_path_object(path)) { ob= path->ptr[path->len-1].data; @@ -395,15 +400,25 @@ static int buttons_context_path_texture(ButsContextPath *path) } /* try particles */ if((path->tex_ctx == SB_TEXC_PARTICLES) && buttons_context_path_particle(path)) { - psys= path->ptr[path->len-1].data; - - if(psys && psys->part && GS(psys->part->id.name)==ID_PA) { - tex= give_current_particle_texture(psys->part); + if(path->ptr[path->len-1].type == &RNA_ParticleSettings) { + ParticleSettings *part = path->ptr[path->len-1].data; + tex= give_current_particle_texture(part); RNA_id_pointer_create(&tex->id, &path->ptr[path->len]); path->len++; return 1; } + else { + psys= path->ptr[path->len-1].data; + + if(psys && psys->part && GS(psys->part->id.name)==ID_PA) { + tex= give_current_particle_texture(psys->part); + + RNA_id_pointer_create(&tex->id, &path->ptr[path->len]); + path->len++; + return 1; + } + } } /* try material */ if(buttons_context_path_material(path)) { @@ -617,6 +632,12 @@ void buttons_context_compute(const bContext *C, SpaceButs *sbuts) /************************* Context Callback ************************/ +const char *buttons_context_dir[] = { + "world", "object", "mesh", "armature", "lattice", "curve", + "meta_ball", "lamp", "camera", "material", "material_slot", + "texture", "texture_slot", "bone", "edit_bone", "pose_bone", "particle_system", "particle_system_editable", + "cloth", "soft_body", "fluid", "smoke", "collision", "brush", NULL}; + int buttons_context(const bContext *C, const char *member, bContextDataResult *result) { SpaceButs *sbuts= CTX_wm_space_buts(C); @@ -627,13 +648,7 @@ int buttons_context(const bContext *C, const char *member, bContextDataResult *r /* here we handle context, getting data from precomputed path */ if(CTX_data_dir(member)) { - static const char *dir[] = { - "world", "object", "mesh", "armature", "lattice", "curve", - "meta_ball", "lamp", "camera", "material", "material_slot", - "texture", "texture_slot", "bone", "edit_bone", "pose_bone", "particle_system", "particle_system_editable", - "cloth", "soft_body", "fluid", "smoke", "collision", "brush", NULL}; - - CTX_data_dir_set(result, dir); + CTX_data_dir_set(result, buttons_context_dir); return 1; } else if(CTX_data_equals(member, "world")) { @@ -930,6 +945,14 @@ ID *buttons_context_id_path(const bContext *C) for(a=path->len-1; a>=0; a--) { ptr= &path->ptr[a]; + /* pin particle settings instead of system, since only settings are an idblock*/ + if(sbuts->mainb == BCONTEXT_PARTICLE && sbuts->flag & SB_PIN_CONTEXT) { + if(ptr->type == &RNA_ParticleSystem && ptr->data) { + ParticleSystem *psys = (ParticleSystem *)ptr->data; + return &psys->part->id; + } + } + if(ptr->id.data) { return ptr->id.data; break; diff --git a/source/blender/editors/space_buttons/buttons_intern.h b/source/blender/editors/space_buttons/buttons_intern.h index 9478168f35a..407454d4347 100644 --- a/source/blender/editors/space_buttons/buttons_intern.h +++ b/source/blender/editors/space_buttons/buttons_intern.h @@ -65,6 +65,8 @@ void buttons_context_draw(const struct bContext *C, struct uiLayout *layout); void buttons_context_register(struct ARegionType *art); struct ID *buttons_context_id_path(const struct bContext *C); +extern const char *buttons_context_dir[]; /* doc access */ + /* buttons_ops.c */ void BUTTONS_OT_file_browse(struct wmOperatorType *ot); void BUTTONS_OT_toolbox(struct wmOperatorType *ot); diff --git a/source/blender/editors/space_buttons/space_buttons.c b/source/blender/editors/space_buttons/space_buttons.c index 61485987cc9..afb8acb087b 100644 --- a/source/blender/editors/space_buttons/space_buttons.c +++ b/source/blender/editors/space_buttons/space_buttons.c @@ -39,6 +39,7 @@ #include "BKE_context.h" #include "BKE_screen.h" +#include "ED_space_api.h" #include "ED_screen.h" #include "BIF_gl.h" @@ -177,13 +178,13 @@ static void buttons_main_area_draw(const bContext *C, ARegion *ar) sbuts->mainbo= sbuts->mainb; } -void buttons_operatortypes(void) +static void buttons_operatortypes(void) { WM_operatortype_append(BUTTONS_OT_toolbox); WM_operatortype_append(BUTTONS_OT_file_browse); } -void buttons_keymap(struct wmKeyConfig *keyconf) +static void buttons_keymap(struct wmKeyConfig *keyconf) { wmKeyMap *keymap= WM_keymap_find(keyconf, "Property Editor", SPACE_BUTS, 0); diff --git a/source/blender/editors/space_console/console_ops.c b/source/blender/editors/space_console/console_ops.c index 05c3561d25e..3a7c306ac50 100644 --- a/source/blender/editors/space_console/console_ops.c +++ b/source/blender/editors/space_console/console_ops.c @@ -75,7 +75,7 @@ void console_scrollback_free(SpaceConsole *sc, ConsoleLine *cl) MEM_freeN(cl); } -void console_scrollback_limit(SpaceConsole *sc) +static void console_scrollback_limit(SpaceConsole *sc) { int tot; diff --git a/source/blender/editors/space_console/space_console.c b/source/blender/editors/space_console/space_console.c index c44d13aa058..126db64e2a8 100644 --- a/source/blender/editors/space_console/space_console.c +++ b/source/blender/editors/space_console/space_console.c @@ -21,8 +21,7 @@ * * ***** END GPL LICENSE BLOCK ***** */ - - #include <string.h> +#include <string.h> #include <stdio.h> #ifdef WIN32 @@ -39,6 +38,7 @@ #include "BKE_screen.h" #include "BKE_idcode.h" +#include "ED_space_api.h" #include "ED_screen.h" #include "BIF_gl.h" @@ -225,7 +225,7 @@ static void console_main_area_draw(const bContext *C, ARegion *ar) UI_view2d_scrollers_free(scrollers); } -void console_operatortypes(void) +static void console_operatortypes(void) { /* console_ops.c */ WM_operatortype_append(CONSOLE_OT_move); @@ -243,7 +243,7 @@ void console_operatortypes(void) WM_operatortype_append(CONSOLE_OT_select_set); } -void console_keymap(struct wmKeyConfig *keyconf) +static void console_keymap(struct wmKeyConfig *keyconf) { wmKeyMap *keymap= WM_keymap_find(keyconf, "Console", SPACE_CONSOLE, 0); wmKeyMapItem *kmi; diff --git a/source/blender/editors/space_file/file_draw.c b/source/blender/editors/space_file/file_draw.c index 54a462ad84a..79c1cce4656 100644 --- a/source/blender/editors/space_file/file_draw.c +++ b/source/blender/editors/space_file/file_draw.c @@ -79,7 +79,7 @@ enum { B_FS_DIRNAME, B_FS_FILENAME -} eFile_ButEvents; +} /*eFile_ButEvents*/; static void do_file_buttons(bContext *C, void *UNUSED(arg), int event) diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c index fea50f1f2aa..67b74010e53 100644 --- a/source/blender/editors/space_file/file_ops.c +++ b/source/blender/editors/space_file/file_ops.c @@ -516,7 +516,7 @@ int file_cancel_exec(bContext *C, wmOperator *UNUSED(unused)) return OPERATOR_FINISHED; } -int file_operator_poll(bContext *C) +static int file_operator_poll(bContext *C) { int poll = ED_operator_file_active(C); SpaceFile *sfile= CTX_wm_space_file(C); @@ -735,7 +735,7 @@ void FILE_OT_parent(struct wmOperatorType *ot) } -int file_refresh_exec(bContext *C, wmOperator *UNUSED(unused)) +static int file_refresh_exec(bContext *C, wmOperator *UNUSED(unused)) { SpaceFile *sfile= CTX_wm_space_file(C); @@ -1028,7 +1028,7 @@ static void file_expand_directory(bContext *C) } } -int file_directory_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event)) +static int file_directory_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event)) { SpaceFile *sfile= CTX_wm_space_file(C); @@ -1116,7 +1116,7 @@ void FILE_OT_refresh(struct wmOperatorType *ot) ot->poll= ED_operator_file_active; /* <- important, handler is on window level */ } -int file_hidedot_exec(bContext *C, wmOperator *UNUSED(unused)) +static int file_hidedot_exec(bContext *C, wmOperator *UNUSED(unused)) { SpaceFile *sfile= CTX_wm_space_file(C); @@ -1169,7 +1169,7 @@ struct ARegion *file_buttons_region(struct ScrArea *sa) return arnew; } -int file_bookmark_toggle_exec(bContext *C, wmOperator *UNUSED(unused)) +static int file_bookmark_toggle_exec(bContext *C, wmOperator *UNUSED(unused)) { ScrArea *sa= CTX_wm_area(C); ARegion *ar= file_buttons_region(sa); @@ -1193,7 +1193,7 @@ void FILE_OT_bookmark_toggle(struct wmOperatorType *ot) } -int file_filenum_exec(bContext *C, wmOperator *op) +static int file_filenum_exec(bContext *C, wmOperator *op) { SpaceFile *sfile= CTX_wm_space_file(C); ScrArea *sa= CTX_wm_area(C); @@ -1225,7 +1225,7 @@ void FILE_OT_filenum(struct wmOperatorType *ot) RNA_def_int(ot->srna, "increment", 1, 0, 100, "Increment", "", 0,100); } -int file_rename_exec(bContext *C, wmOperator *UNUSED(op)) +static int file_rename_exec(bContext *C, wmOperator *UNUSED(op)) { ScrArea *sa= CTX_wm_area(C); SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C); @@ -1246,7 +1246,7 @@ int file_rename_exec(bContext *C, wmOperator *UNUSED(op)) } -int file_rename_poll(bContext *C) +static int file_rename_poll(bContext *C) { int poll = ED_operator_file_active(C); SpaceFile *sfile= CTX_wm_space_file(C); @@ -1277,7 +1277,7 @@ void FILE_OT_rename(struct wmOperatorType *ot) } -int file_delete_poll(bContext *C) +static int file_delete_poll(bContext *C) { int poll = ED_operator_file_active(C); SpaceFile *sfile= CTX_wm_space_file(C); diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c index b92b95e2efd..ef011ca4b40 100644 --- a/source/blender/editors/space_file/filelist.c +++ b/source/blender/editors/space_file/filelist.c @@ -27,7 +27,6 @@ * ***** END GPL LICENSE BLOCK ***** */ - /* global includes */ #include <stdlib.h> @@ -62,6 +61,7 @@ #include "DNA_space_types.h" +#include "ED_fileselect.h" #include "ED_datafiles.h" #include "IMB_imbuf.h" @@ -593,7 +593,7 @@ short filelist_changed(struct FileList* filelist) return filelist->changed; } -struct ImBuf * filelist_loadimage(struct FileList* filelist, int index) +static struct ImBuf * filelist_loadimage(struct FileList* filelist, int index) { ImBuf *imb = NULL; int fidx = 0; @@ -807,7 +807,7 @@ int ED_file_extension_icon(char *relname) return ICON_FILE_BLANK; } -void filelist_setfiletypes(struct FileList* filelist) +static void filelist_setfiletypes(struct FileList* filelist) { struct direntry *file; int num; diff --git a/source/blender/editors/space_file/filelist.h b/source/blender/editors/space_file/filelist.h index 6ea91746b85..73bd78fadbc 100644 --- a/source/blender/editors/space_file/filelist.h +++ b/source/blender/editors/space_file/filelist.h @@ -70,7 +70,7 @@ void filelist_readdir(struct FileList* filelist); int filelist_empty(struct FileList* filelist); void filelist_parent(struct FileList* filelist); - +struct BlendHandle *filelist_lib(struct FileList* filelist); int filelist_islibrary (struct FileList* filelist, char* dir, char* group); void filelist_from_main(struct FileList* filelist); void filelist_from_library(struct FileList* filelist); diff --git a/source/blender/editors/space_file/space_file.c b/source/blender/editors/space_file/space_file.c index b8ffc73caf0..47140bd6e74 100644 --- a/source/blender/editors/space_file/space_file.c +++ b/source/blender/editors/space_file/space_file.c @@ -47,6 +47,7 @@ #include "BKE_context.h" #include "BKE_screen.h" +#include "ED_space_api.h" #include "ED_screen.h" #include "ED_fileselect.h" @@ -60,7 +61,6 @@ #include "UI_view2d.h" - #include "file_intern.h" // own include #include "fsmenu.h" #include "filelist.h" @@ -363,7 +363,7 @@ static void file_main_area_draw(const bContext *C, ARegion *ar) } -void file_operatortypes(void) +static void file_operatortypes(void) { WM_operatortype_append(FILE_OT_select); WM_operatortype_append(FILE_OT_select_all_toggle); @@ -389,7 +389,7 @@ void file_operatortypes(void) } /* NOTE: do not add .blend file reading on this level */ -void file_keymap(struct wmKeyConfig *keyconf) +static void file_keymap(struct wmKeyConfig *keyconf) { wmKeyMapItem *kmi; /* keys for all areas */ diff --git a/source/blender/editors/space_graph/graph_edit.c b/source/blender/editors/space_graph/graph_edit.c index e21dd46140e..697ea86e43a 100644 --- a/source/blender/editors/space_graph/graph_edit.c +++ b/source/blender/editors/space_graph/graph_edit.c @@ -400,7 +400,7 @@ void GRAPH_OT_ghost_curves_clear (wmOperatorType *ot) /* ******************** Insert Keyframes Operator ************************* */ /* defines for insert keyframes tool */ -EnumPropertyItem prop_graphkeys_insertkey_types[] = { +static EnumPropertyItem prop_graphkeys_insertkey_types[] = { {1, "ALL", 0, "All Channels", ""}, {2, "SEL", 0, "Only Selected Channels", ""}, {0, NULL, 0, NULL, NULL} @@ -1224,7 +1224,7 @@ void GRAPH_OT_sample (wmOperatorType *ot) /* ******************** Set Extrapolation-Type Operator *********************** */ /* defines for set extrapolation-type for selected keyframes tool */ -EnumPropertyItem prop_graphkeys_expo_types[] = { +static EnumPropertyItem prop_graphkeys_expo_types[] = { {FCURVE_EXTRAPOLATE_CONSTANT, "CONSTANT", 0, "Constant Extrapolation", ""}, {FCURVE_EXTRAPOLATE_LINEAR, "LINEAR", 0, "Linear Extrapolation", ""}, {0, NULL, 0, NULL, NULL} @@ -1637,7 +1637,7 @@ void GRAPH_OT_frame_jump (wmOperatorType *ot) /* ******************** Snap Keyframes Operator *********************** */ /* defines for snap keyframes tool */ -EnumPropertyItem prop_graphkeys_snap_types[] = { +static EnumPropertyItem prop_graphkeys_snap_types[] = { {GRAPHKEYS_SNAP_CFRA, "CFRA", 0, "Current Frame", ""}, {GRAPHKEYS_SNAP_VALUE, "VALUE", 0, "Cursor Value", ""}, {GRAPHKEYS_SNAP_NEAREST_FRAME, "NEAREST_FRAME", 0, "Nearest Frame", ""}, // XXX as single entry? @@ -1745,7 +1745,7 @@ void GRAPH_OT_snap (wmOperatorType *ot) /* ******************** Mirror Keyframes Operator *********************** */ /* defines for mirror keyframes tool */ -EnumPropertyItem prop_graphkeys_mirror_types[] = { +static EnumPropertyItem prop_graphkeys_mirror_types[] = { {GRAPHKEYS_MIRROR_CFRA, "CFRA", 0, "By Times over Current Frame", ""}, {GRAPHKEYS_MIRROR_VALUE, "VALUE", 0, "By Values over Cursor Value", ""}, {GRAPHKEYS_MIRROR_YAXIS, "YAXIS", 0, "By Times over Time=0", ""}, diff --git a/source/blender/editors/space_graph/graph_intern.h b/source/blender/editors/space_graph/graph_intern.h index 560dabbb634..d27935ee75a 100644 --- a/source/blender/editors/space_graph/graph_intern.h +++ b/source/blender/editors/space_graph/graph_intern.h @@ -66,14 +66,14 @@ void GRAPH_OT_select_column(struct wmOperatorType *ot); void GRAPH_OT_select_linked(struct wmOperatorType *ot); void GRAPH_OT_select_more(struct wmOperatorType *ot); void GRAPH_OT_select_less(struct wmOperatorType *ot); +void GRAPH_OT_select_leftright(struct wmOperatorType *ot); void GRAPH_OT_clickselect(struct wmOperatorType *ot); /* defines for left-right select tool */ enum { - GRAPHKEYS_LRSEL_TEST = -1, - GRAPHKEYS_LRSEL_NONE, + GRAPHKEYS_LRSEL_TEST = 0, GRAPHKEYS_LRSEL_LEFT, - GRAPHKEYS_LRSEL_RIGHT, + GRAPHKEYS_LRSEL_RIGHT } eGraphKeys_LeftRightSelect_Mode; /* defines for column-select mode */ diff --git a/source/blender/editors/space_graph/graph_ops.c b/source/blender/editors/space_graph/graph_ops.c index efec8dc4259..57e9f49f69d 100644 --- a/source/blender/editors/space_graph/graph_ops.c +++ b/source/blender/editors/space_graph/graph_ops.c @@ -159,7 +159,7 @@ static int graphview_cursor_modal(bContext *C, wmOperator *op, wmEvent *event) return OPERATOR_RUNNING_MODAL; } -void GRAPH_OT_cursor_set(wmOperatorType *ot) +static void GRAPH_OT_cursor_set(wmOperatorType *ot) { /* identifiers */ ot->name= "Set Cursor"; @@ -199,7 +199,7 @@ static int view_toggle_handles_exec (bContext *C, wmOperator *UNUSED(op)) return OPERATOR_FINISHED; } -void GRAPH_OT_view_togglehandles (wmOperatorType *ot) +static void GRAPH_OT_view_togglehandles (wmOperatorType *ot) { /* identification */ ot->name= "Show/Hide All Handles"; @@ -235,6 +235,7 @@ void graphedit_operatortypes(void) WM_operatortype_append(GRAPH_OT_select_linked); WM_operatortype_append(GRAPH_OT_select_more); WM_operatortype_append(GRAPH_OT_select_less); + WM_operatortype_append(GRAPH_OT_select_leftright); /* editing */ WM_operatortype_append(GRAPH_OT_snap); @@ -287,14 +288,22 @@ static void graphedit_keymap_keyframes (wmKeyConfig *keyconf, wmKeyMap *keymap) kmi= WM_keymap_add_item(keymap, "GRAPH_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_ALT|KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "extend", 1); RNA_boolean_set(kmi->ptr, "column", 1); - kmi= WM_keymap_add_item(keymap, "GRAPH_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_CTRL, 0); - RNA_enum_set(kmi->ptr, "left_right", GRAPHKEYS_LRSEL_TEST); kmi= WM_keymap_add_item(keymap, "GRAPH_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_CTRL|KM_ALT, 0); RNA_boolean_set(kmi->ptr, "curves", 1); kmi= WM_keymap_add_item(keymap, "GRAPH_OT_clickselect", SELECTMOUSE, KM_PRESS, KM_CTRL|KM_ALT|KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "curves", 1); RNA_boolean_set(kmi->ptr, "extend", 1); + /* select left/right */ + WM_keymap_add_item(keymap, "GRAPH_OT_select_leftright", SELECTMOUSE, KM_PRESS, KM_CTRL, 0); + kmi= WM_keymap_add_item(keymap, "GRAPH_OT_select_leftright", SELECTMOUSE, KM_PRESS, KM_CTRL|KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "extend", 1); + + kmi= WM_keymap_add_item(keymap, "GRAPH_OT_select_leftright", LEFTBRACKETKEY, KM_PRESS, 0, 0); + RNA_enum_set(kmi->ptr, "mode", GRAPHKEYS_LRSEL_LEFT); + kmi= WM_keymap_add_item(keymap, "GRAPH_OT_select_leftright", RIGHTBRACKETKEY, KM_PRESS, 0, 0); + RNA_enum_set(kmi->ptr, "mode", GRAPHKEYS_LRSEL_RIGHT); + /* deselect all */ WM_keymap_add_item(keymap, "GRAPH_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0); RNA_boolean_set(WM_keymap_add_item(keymap, "GRAPH_OT_select_all_toggle", IKEY, KM_PRESS, KM_CTRL, 0)->ptr, "invert", 1); diff --git a/source/blender/editors/space_graph/graph_select.c b/source/blender/editors/space_graph/graph_select.c index 58a5f4b113e..3fb86be4ed1 100644 --- a/source/blender/editors/space_graph/graph_select.c +++ b/source/blender/editors/space_graph/graph_select.c @@ -704,26 +704,166 @@ void GRAPH_OT_select_less (wmOperatorType *ot) ot->flag= OPTYPE_REGISTER/*|OPTYPE_UNDO*/; } -/* ******************** Mouse-Click Select Operator *********************** */ -/* This operator works in one of three ways: - * - 1) keyframe under mouse - no special modifiers - * - 2) all keyframes on the same side of current frame indicator as mouse - ALT modifier - * - 3) column select all keyframes in frame under mouse - CTRL modifier - * - * In addition to these basic options, the SHIFT modifier can be used to toggle the - * selection mode between replacing the selection (without) and inverting the selection (with). - */ +/* ******************** Select Left/Right Operator ************************* */ +/* Select keyframes left/right of the current frame indicator */ /* defines for left-right select tool */ static EnumPropertyItem prop_graphkeys_leftright_select_types[] = { {GRAPHKEYS_LRSEL_TEST, "CHECK", 0, "Check if Select Left or Right", ""}, - {GRAPHKEYS_LRSEL_NONE, "OFF", 0, "Don't select", ""}, {GRAPHKEYS_LRSEL_LEFT, "LEFT", 0, "Before current frame", ""}, {GRAPHKEYS_LRSEL_RIGHT, "RIGHT", 0, "After current frame", ""}, {0, NULL, 0, NULL, NULL} }; -/* ------------------- */ +/* --------------------------------- */ + +static void graphkeys_select_leftright (bAnimContext *ac, short leftright, short select_mode) +{ + ListBase anim_data = {NULL, NULL}; + bAnimListElem *ale; + int filter; + + KeyframeEditFunc ok_cb, select_cb; + KeyframeEditData ked= {{0}}; + Scene *scene= ac->scene; + + /* if select mode is replace, deselect all keyframes (and channels) first */ + if (select_mode==SELECT_REPLACE) { + select_mode= SELECT_ADD; + + /* deselect all other channels and keyframes */ + ANIM_deselect_anim_channels(ac, ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR); + deselect_graph_keys(ac, 0, SELECT_SUBTRACT); + } + + /* set callbacks and editing data */ + ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE); + select_cb= ANIM_editkeyframes_select(select_mode); + + if (leftright == GRAPHKEYS_LRSEL_LEFT) { + ked.f1 = MINAFRAMEF; + ked.f2 = (float)(CFRA + 0.1f); + } + else { + ked.f1 = (float)(CFRA - 0.1f); + ked.f2 = MAXFRAMEF; + } + + /* filter data */ + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); + ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); + + /* select keys */ + for (ale= anim_data.first; ale; ale= ale->next) { + AnimData *adt= ANIM_nla_mapping_get(ac, ale); + + if (adt) { + ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL); + ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1); + } + else + ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL); + } + + /* Cleanup */ + BLI_freelistN(&anim_data); +} + +/* ----------------- */ + +static int graphkeys_select_leftright_exec (bContext *C, wmOperator *op) +{ + bAnimContext ac; + short leftright = RNA_enum_get(op->ptr, "mode"); + short selectmode; + + /* get editor data */ + if (ANIM_animdata_get_context(C, &ac) == 0) + return OPERATOR_CANCELLED; + + /* select mode is either replace (deselect all, then add) or add/extend */ + if (RNA_boolean_get(op->ptr, "extend")) + selectmode= SELECT_INVERT; + else + selectmode= SELECT_REPLACE; + + /* if "test" mode is set, we don't have any info to set this with */ + if (leftright == GRAPHKEYS_LRSEL_TEST) + return OPERATOR_CANCELLED; + + /* do the selecting now */ + graphkeys_select_leftright(&ac, leftright, selectmode); + + /* set notifier that keyframe selection (and channels too) have changed */ + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|ND_ANIMCHAN|NA_SELECTED, NULL); + + return OPERATOR_FINISHED; +} + +static int graphkeys_select_leftright_invoke (bContext *C, wmOperator *op, wmEvent *event) +{ + bAnimContext ac; + short leftright = RNA_enum_get(op->ptr, "mode"); + + /* get editor data */ + if (ANIM_animdata_get_context(C, &ac) == 0) + return OPERATOR_CANCELLED; + + /* handle mode-based testing */ + if (leftright == GRAPHKEYS_LRSEL_TEST) { + Scene *scene= ac.scene; + ARegion *ar= ac.ar; + View2D *v2d= &ar->v2d; + + short mval[2]; + float x; + + /* get mouse coordinates (in region coordinates) */ + mval[0]= (event->x - ar->winrct.xmin); + mval[1]= (event->y - ar->winrct.ymin); + + /* determine which side of the current frame mouse is on */ + UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, NULL); + if (x < CFRA) + RNA_int_set(op->ptr, "mode", GRAPHKEYS_LRSEL_LEFT); + else + RNA_int_set(op->ptr, "mode", GRAPHKEYS_LRSEL_RIGHT); + } + + /* perform selection */ + return graphkeys_select_leftright_exec(C, op); +} + +void GRAPH_OT_select_leftright (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Select Left/Right"; + ot->idname= "GRAPH_OT_select_leftright"; + ot->description= "Select keyframes to the left or the right of the current frame"; + + /* api callbacks */ + ot->invoke= graphkeys_select_leftright_invoke; + ot->exec= graphkeys_select_leftright_exec; + ot->poll= graphop_visible_keyframes_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* id-props */ + ot->prop= RNA_def_enum(ot->srna, "mode", prop_graphkeys_leftright_select_types, GRAPHKEYS_LRSEL_TEST, "Mode", ""); + RNA_def_boolean(ot->srna, "extend", 0, "Extend Select", ""); +} + +/* ******************** Mouse-Click Select Operator *********************** */ +/* This operator works in one of three ways: + * - 1) keyframe under mouse - no special modifiers + * - 2) all keyframes on the same side of current frame indicator as mouse - ALT modifier + * - 3) column select all keyframes in frame under mouse - CTRL modifier + * + * In addition to these basic options, the SHIFT modifier can be used to toggle the + * selection mode between replacing the selection (without) and inverting the selection (with). + */ /* temp info for caching handle vertices close */ typedef struct tNearestVertInfo { @@ -1042,23 +1182,23 @@ static void mouse_graph_keys (bAnimContext *ac, int mval[], short select_mode, s /* only change selection of channel when the visibility of keyframes doesn't depend on this */ if ((sipo->flag & SIPO_SELCUVERTSONLY) == 0) { /* select or deselect curve? */ - - /* when a single point is selected then dont toggle channel selection */ - if(bezt) { - if((bezt->f2|bezt->f1|bezt->f3) & SELECT) { + if (bezt) { + /* take selection status from item that got hit, to prevent flip/flop on channel + * selection status when shift-selecting (i.e. "SELECT_INVERT") points + */ + if (BEZSELECTED(bezt)) nvi->fcu->flag |= FCURVE_SELECTED; - } - else { + else nvi->fcu->flag &= ~FCURVE_SELECTED; - } } else { + /* didn't hit any channel, so just apply that selection mode to the curve's selection status */ if (select_mode == SELECT_INVERT) nvi->fcu->flag ^= FCURVE_SELECTED; else if (select_mode == SELECT_ADD) nvi->fcu->flag |= FCURVE_SELECTED; } - + /* set active F-Curve (NOTE: sync the filter flags with findnearest_fcurve_vert) */ if (nvi->fcu->flag & FCURVE_SELECTED) { int filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); @@ -1071,67 +1211,7 @@ static void mouse_graph_keys (bAnimContext *ac, int mval[], short select_mode, s } /* Option 2) Selects all the keyframes on either side of the current frame (depends on which side the mouse is on) */ -static void graphkeys_mselect_leftright (bAnimContext *ac, short leftright, short select_mode) -{ - ListBase anim_data = {NULL, NULL}; - bAnimListElem *ale; - int filter; - - SpaceIpo *sipo= (SpaceIpo *)ac->sa->spacedata.first; - KeyframeEditFunc ok_cb, select_cb; - KeyframeEditData ked; - Scene *scene= ac->scene; - - /* if select mode is replace, deselect all keyframes (and channels) first */ - if (select_mode==SELECT_REPLACE) { - /* reset selection mode to add to selection */ - select_mode= SELECT_ADD; - - /* deselect all other keyframes */ - deselect_graph_keys(ac, 0, SELECT_SUBTRACT); - - /* deselect other channels too, but only only do this if - * selection of channel when the visibility of keyframes - * doesn't depend on this - */ - if ((sipo->flag & SIPO_SELCUVERTSONLY) == 0) - ANIM_deselect_anim_channels(ac, ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR); - } - - /* set callbacks and editing data */ - ok_cb= ANIM_editkeyframes_ok(BEZT_OK_FRAMERANGE); - select_cb= ANIM_editkeyframes_select(select_mode); - - memset(&ked, 0, sizeof(KeyframeEditFunc)); - if (leftright == GRAPHKEYS_LRSEL_LEFT) { - ked.f1 = MINAFRAMEF; - ked.f2 = (float)(CFRA + 0.1f); - } - else { - ked.f1 = (float)(CFRA - 0.1f); - ked.f2 = MAXFRAMEF; - } - - /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS); - ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); - - /* select keys on the side where most data occurs */ - for (ale= anim_data.first; ale; ale= ale->next) { - AnimData *adt= ANIM_nla_mapping_get(ac, ale); - - if (adt) { - ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); - ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL); - ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1); - } - else - ANIM_fcurve_keyframes_loop(&ked, ale->key_data, ok_cb, select_cb, NULL); - } - - /* Cleanup */ - BLI_freelistN(&anim_data); -} +/* (see graphkeys_select_leftright) */ /* Option 3) Selects all visible keyframes in the same frame as the mouse click */ static void graphkeys_mselect_column (bAnimContext *ac, int mval[2], short select_mode) @@ -1240,24 +1320,12 @@ static int graphkeys_clickselect_invoke(bContext *C, wmOperator *op, wmEvent *ev selectmode= SELECT_REPLACE; /* figure out action to take */ - if (RNA_enum_get(op->ptr, "left_right")) { - /* select all keys on same side of current frame as mouse */ - float x; - - UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, NULL); - if (x < CFRA) - RNA_int_set(op->ptr, "left_right", GRAPHKEYS_LRSEL_LEFT); - else - RNA_int_set(op->ptr, "left_right", GRAPHKEYS_LRSEL_RIGHT); - - graphkeys_mselect_leftright(&ac, RNA_enum_get(op->ptr, "left_right"), selectmode); - } - else if (RNA_boolean_get(op->ptr, "column")) { + if (RNA_boolean_get(op->ptr, "column")) { /* select all keyframes in the same frame as the one that was under the mouse */ graphkeys_mselect_column(&ac, mval, selectmode); } else if (RNA_boolean_get(op->ptr, "curves")) { - /* select all keyframes in F-Curve under mouse */ + /* select all keyframes in the same F-Curve as the one under the mouse */ mouse_graph_keys(&ac, mval, selectmode, 1); } else { @@ -1284,8 +1352,6 @@ void GRAPH_OT_clickselect (wmOperatorType *ot) ot->poll= graphop_visible_keyframes_poll; /* id-props */ - // XXX should we make this into separate operators? - RNA_def_enum(ot->srna, "left_right", prop_graphkeys_leftright_select_types, 0, "Left Right", ""); // CTRLKEY RNA_def_boolean(ot->srna, "extend", 0, "Extend Select", ""); // SHIFTKEY RNA_def_boolean(ot->srna, "column", 0, "Column Select", "Select all keyframes that occur on the same frame as the one under the mouse"); // ALTKEY RNA_def_boolean(ot->srna, "curves", 0, "Only Curves", "Select all the keyframes in the curve"); // CTRLKEY + ALTKEY diff --git a/source/blender/editors/space_graph/space_graph.c b/source/blender/editors/space_graph/space_graph.c index 37d58e5591b..7a8bc9a65d6 100644 --- a/source/blender/editors/space_graph/space_graph.c +++ b/source/blender/editors/space_graph/space_graph.c @@ -45,6 +45,7 @@ #include "BKE_fcurve.h" #include "BKE_screen.h" +#include "ED_space_api.h" #include "ED_screen.h" #include "ED_anim_api.h" #include "ED_markers.h" diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c index 0dcfa9e3bcc..9593c896c22 100644 --- a/source/blender/editors/space_image/image_draw.c +++ b/source/blender/editors/space_image/image_draw.c @@ -132,23 +132,23 @@ void draw_image_info(ARegion *ar, int channels, int x, int y, char *cp, float *f char str[256]; int ofs= 0; - ofs += BLI_snprintf(str, sizeof(str)-ofs, "X: %4d Y: %4d ", x, y); + ofs += BLI_snprintf(str + ofs, sizeof(str)-ofs, "X: %4d Y: %4d ", x, y); if(cp) - ofs+= BLI_snprintf(str, sizeof(str)-ofs, "| R: %3d G: %3d B: %3d A: %3d ", cp[0], cp[1], cp[2], cp[3]); + ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| R: %3d G: %3d B: %3d A: %3d ", cp[0], cp[1], cp[2], cp[3]); if(fp) { if(channels==4) - ofs+= BLI_snprintf(str, sizeof(str)-ofs, "| R: %.3f G: %.3f B: %.3f A: %.3f ", fp[0], fp[1], fp[2], fp[3]); + ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| R: %.3f G: %.3f B: %.3f A: %.3f ", fp[0], fp[1], fp[2], fp[3]); else if(channels==1) - ofs+= BLI_snprintf(str, sizeof(str)-ofs, "| Val: %.3f ", fp[0]); + ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| Val: %.3f ", fp[0]); else if(channels==3) - ofs+= BLI_snprintf(str, sizeof(str)-ofs, "| R: %.3f G: %.3f B: %.3f ", fp[0], fp[1], fp[2]); + ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| R: %.3f G: %.3f B: %.3f ", fp[0], fp[1], fp[2]); } if(zp) - ofs+= BLI_snprintf(str, sizeof(str)-ofs, "| Z: %.4f ", 0.5+0.5*(((float)*zp)/(float)0x7fffffff)); + ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| Z: %.4f ", 0.5+0.5*(((float)*zp)/(float)0x7fffffff)); if(zpf) - ofs+= BLI_snprintf(str, sizeof(str)-ofs, "| Z: %.3f ", *zpf); + ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| Z: %.3f ", *zpf); (void)ofs; glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); diff --git a/source/blender/editors/space_image/image_intern.h b/source/blender/editors/space_image/image_intern.h index c038f58375c..327749125a5 100644 --- a/source/blender/editors/space_image/image_intern.h +++ b/source/blender/editors/space_image/image_intern.h @@ -46,6 +46,8 @@ struct bNodeTree; struct ARegion *image_has_buttons_region(struct ScrArea *sa); struct ARegion *image_has_scope_region(struct ScrArea *sa); +extern const char *image_context_dir[]; /* doc access */ + /* image_header.c */ void image_header_buttons(const struct bContext *C, struct ARegion *ar); @@ -85,9 +87,6 @@ void IMAGE_OT_curves_point_set(struct wmOperatorType *ot); void IMAGE_OT_record_composite(struct wmOperatorType *ot); -/* uvedit_draw.c */ -void draw_uvedit_main(struct SpaceImage *sima, struct ARegion *ar, struct Scene *scene, struct Object *obedit); - /* image_panels.c */ struct ImageUser *ntree_get_active_iuser(struct bNodeTree *ntree); void image_buttons_register(struct ARegionType *art); diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index a0fda09c92b..fdf5cea880b 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -1529,9 +1529,9 @@ typedef struct ImageSampleInfo { static void sample_draw(const bContext *UNUSED(C), ARegion *ar, void *arg_info) { ImageSampleInfo *info= arg_info; - - draw_image_info(ar, info->channels, info->x, info->y, info->colp, - info->colfp, info->zp, info->zfp); + if(info->draw) { + draw_image_info(ar, info->channels, info->x, info->y, info->colp, info->colfp, info->zp, info->zfp); + } } static void sample_apply(bContext *C, wmOperator *op, wmEvent *event) @@ -1858,7 +1858,7 @@ typedef struct RecordCompositeData { int sfra, efra; } RecordCompositeData; -int record_composite_apply(bContext *C, wmOperator *op) +static int record_composite_apply(bContext *C, wmOperator *op) { SpaceImage *sima= CTX_wm_space_image(C); RecordCompositeData *rcd= op->customdata; diff --git a/source/blender/editors/space_image/image_render.c b/source/blender/editors/space_image/image_render.c index d80801f8868..f09a1353935 100644 --- a/source/blender/editors/space_image/image_render.c +++ b/source/blender/editors/space_image/image_render.c @@ -52,7 +52,7 @@ static ScrArea *image_area= NULL; /* can get as well the full picture, as the parts while rendering */ /* XXX will be obsolete, here for reference now */ -void imagewindow_progress(SpaceImage *sima, RenderResult *rr, volatile rcti *renrect) +static void imagewindow_progress(SpaceImage *sima, RenderResult *rr, volatile rcti *renrect) { float x1, y1, *rectf= NULL; unsigned int *rect32= NULL; @@ -124,7 +124,7 @@ void imagewindow_progress(SpaceImage *sima, RenderResult *rr, volatile rcti *ren /* coming from BIF_toggle_render_display() */ -void imagewindow_toggle_render(bContext *C) +static void imagewindow_toggle_render(bContext *C) { bScreen *sc= CTX_wm_screen(C); ScrArea *sa; @@ -163,7 +163,7 @@ static void imagewindow_renderinfo_cb(void *UNUSED(handle), RenderStats *UNUSED( } } -void ED_space_image_render_callbacks(bContext *C, Render *re) +static void ED_space_image_render_callbacks(bContext *C, Render *re) { // RE_display_init_cb(re, C, imagewindow_init_display_cb); diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c index af4e496f68a..1d7cb357e5f 100644 --- a/source/blender/editors/space_image/space_image.c +++ b/source/blender/editors/space_image/space_image.c @@ -49,6 +49,7 @@ #include "IMB_imbuf_types.h" +#include "ED_image.h" #include "ED_mesh.h" #include "ED_space_api.h" #include "ED_screen.h" @@ -458,7 +459,7 @@ static SpaceLink *image_duplicate(SpaceLink *sl) return (SpaceLink *)simagen; } -void image_operatortypes(void) +static void image_operatortypes(void) { WM_operatortype_append(IMAGE_OT_view_all); WM_operatortype_append(IMAGE_OT_view_pan); @@ -491,7 +492,7 @@ void image_operatortypes(void) WM_operatortype_append(IMAGE_OT_scopes); } -void image_keymap(struct wmKeyConfig *keyconf) +static void image_keymap(struct wmKeyConfig *keyconf) { wmKeyMap *keymap= WM_keymap_find(keyconf, "Image Generic", SPACE_IMAGE, 0); wmKeyMapItem *kmi; @@ -664,13 +665,14 @@ static void image_listener(ScrArea *sa, wmNotifier *wmn) } } +const char *image_context_dir[] = {"edit_image", NULL}; + static int image_context(const bContext *C, const char *member, bContextDataResult *result) { SpaceImage *sima= CTX_wm_space_image(C); if(CTX_data_dir(member)) { - static const char *dir[] = {"edit_image", NULL}; - CTX_data_dir_set(result, dir); + CTX_data_dir_set(result, image_context_dir); } else if(CTX_data_equals(member, "edit_image")) { CTX_data_id_pointer_set(result, (ID*)ED_space_image(sima)); diff --git a/source/blender/editors/space_info/info_stats.c b/source/blender/editors/space_info/info_stats.c index aa5a00e1642..b5abc077eef 100644 --- a/source/blender/editors/space_info/info_stats.c +++ b/source/blender/editors/space_info/info_stats.c @@ -43,6 +43,7 @@ #include "BKE_mesh.h" #include "BKE_particle.h" +#include "ED_info.h" #include "ED_armature.h" #include "ED_mesh.h" #include "ED_curve.h" /* for ED_curve_editnurbs */ @@ -418,7 +419,7 @@ void ED_info_stats_clear(Scene *scene) } } -char *ED_info_stats_string(Scene *scene) +const char *ED_info_stats_string(Scene *scene) { if(!scene->stats) stats_update(scene); diff --git a/source/blender/editors/space_info/space_info.c b/source/blender/editors/space_info/space_info.c index 80040f55a08..b7360f75de9 100644 --- a/source/blender/editors/space_info/space_info.c +++ b/source/blender/editors/space_info/space_info.c @@ -40,6 +40,7 @@ #include "BKE_global.h" #include "BKE_screen.h" +#include "ED_space_api.h" #include "ED_screen.h" #include "BIF_gl.h" @@ -51,7 +52,6 @@ #include "UI_interface.h" #include "UI_view2d.h" - #include "info_intern.h" // own include /* ******************** default callbacks for info space ***************** */ @@ -169,7 +169,7 @@ static void info_main_area_draw(const bContext *C, ARegion *ar) UI_view2d_scrollers_free(scrollers); } -void info_operatortypes(void) +static void info_operatortypes(void) { WM_operatortype_append(FILE_OT_pack_all); WM_operatortype_append(FILE_OT_unpack_all); @@ -189,7 +189,7 @@ void info_operatortypes(void) WM_operatortype_append(INFO_OT_report_copy); } -void info_keymap(struct wmKeyConfig *keyconf) +static void info_keymap(struct wmKeyConfig *keyconf) { wmKeyMap *keymap= WM_keymap_find(keyconf, "Window", 0, 0); @@ -277,7 +277,7 @@ static void recent_files_menu_draw(const bContext *UNUSED(C), Menu *menu) } } -void recent_files_menu_register(void) +static void recent_files_menu_register(void) { MenuType *mt; diff --git a/source/blender/editors/space_logic/logic_ops.c b/source/blender/editors/space_logic/logic_ops.c index cda2aea23fa..4bcb7c1d2f3 100644 --- a/source/blender/editors/space_logic/logic_ops.c +++ b/source/blender/editors/space_logic/logic_ops.c @@ -39,6 +39,7 @@ #include "BKE_main.h" #include "BKE_sca.h" +#include "ED_logic.h" #include "ED_object.h" #include "ED_screen.h" @@ -52,7 +53,6 @@ #include "logic_intern.h" /* ************* Generic Operator Helpers ************* */ - static int edit_sensor_poll(bContext *C) { PointerRNA ptr= CTX_data_pointer_get_type(C, "sensor", &RNA_Sensor); @@ -247,7 +247,7 @@ static int sensor_remove_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } -void LOGIC_OT_sensor_remove(wmOperatorType *ot) +static void LOGIC_OT_sensor_remove(wmOperatorType *ot) { ot->name= "Remove Sensor"; ot->description= "Remove a sensor from the active object"; @@ -299,7 +299,7 @@ static int sensor_add_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void LOGIC_OT_sensor_add(wmOperatorType *ot) +static void LOGIC_OT_sensor_add(wmOperatorType *ot) { PropertyRNA *prop; @@ -350,7 +350,7 @@ static int controller_remove_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } -void LOGIC_OT_controller_remove(wmOperatorType *ot) +static void LOGIC_OT_controller_remove(wmOperatorType *ot) { ot->name= "Remove Controller"; ot->description= "Remove a controller from the active object"; @@ -416,7 +416,7 @@ static int controller_add_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void LOGIC_OT_controller_add(wmOperatorType *ot) +static void LOGIC_OT_controller_add(wmOperatorType *ot) { /* identifiers */ ot->name= "Add Controller"; @@ -464,7 +464,7 @@ static int actuator_remove_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(e return OPERATOR_CANCELLED; } -void LOGIC_OT_actuator_remove(wmOperatorType *ot) +static void LOGIC_OT_actuator_remove(wmOperatorType *ot) { ot->name= "Remove Actuator"; ot->description= "Remove a actuator from the active object"; @@ -516,7 +516,7 @@ static int actuator_add_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void LOGIC_OT_actuator_add(wmOperatorType *ot) +static void LOGIC_OT_actuator_add(wmOperatorType *ot) { PropertyRNA *prop; @@ -572,7 +572,7 @@ static int sensor_move_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event return OPERATOR_CANCELLED; } -void LOGIC_OT_sensor_move(wmOperatorType *ot) +static void LOGIC_OT_sensor_move(wmOperatorType *ot) { /* identifiers */ ot->name= "Move Sensor"; @@ -617,7 +617,7 @@ static int controller_move_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(e return OPERATOR_CANCELLED; } -void LOGIC_OT_controller_move(wmOperatorType *ot) +static void LOGIC_OT_controller_move(wmOperatorType *ot) { /* identifiers */ ot->name= "Move Controller"; @@ -662,7 +662,7 @@ static int actuator_move_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(eve return OPERATOR_CANCELLED; } -void LOGIC_OT_actuator_move(wmOperatorType *ot) +static void LOGIC_OT_actuator_move(wmOperatorType *ot) { /* identifiers */ ot->name= "Move Actuator"; diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c index ae533e80610..40206a314e8 100644 --- a/source/blender/editors/space_logic/logic_window.c +++ b/source/blender/editors/space_logic/logic_window.c @@ -356,7 +356,7 @@ static void old_sca_move_actuator(bContext *C, void *datav, void *move_up) } } -void do_logic_buts(bContext *C, void *UNUSED(arg), int event) +static void do_logic_buts(bContext *C, void *UNUSED(arg), int event) { Main *bmain= CTX_data_main(C); bSensor *sens; @@ -1786,13 +1786,13 @@ static void change_ipo_actuator(bContext *UNUSED(C), void *arg1_but, void *arg2_ but->retval = B_REDR; } -void update_object_actuator_PID(bContext *UNUSED(C), void *act, void *UNUSED(arg)) +static void update_object_actuator_PID(bContext *UNUSED(C), void *act, void *UNUSED(arg)) { bObjectActuator *oa = act; oa->forcerot[0] = 60.0f*oa->forcerot[1]; } -char *get_state_name(Object *ob, short bit) +static char *get_state_name(Object *ob, short bit) { bController *cont; unsigned int mask; @@ -3480,7 +3480,7 @@ static void draw_sensor_touch(uiLayout *layout, PointerRNA *ptr) uiItemR(layout, ptr, "material", 0, NULL, ICON_NULL); } -void draw_brick_sensor(uiLayout *layout, PointerRNA *ptr, bContext *C) +static void draw_brick_sensor(uiLayout *layout, PointerRNA *ptr, bContext *C) { uiLayout *box; @@ -3600,7 +3600,7 @@ static void draw_controller_state(uiLayout *UNUSED(layout), PointerRNA *UNUSED(p } -void draw_brick_controller(uiLayout *layout, PointerRNA *ptr) +static void draw_brick_controller(uiLayout *layout, PointerRNA *ptr) { uiLayout *box; @@ -4355,7 +4355,7 @@ static void draw_actuator_visibility(uiLayout *layout, PointerRNA *ptr) uiItemR(row, ptr, "apply_to_children", 0, NULL, ICON_NULL); } -void draw_brick_actuator(uiLayout *layout, PointerRNA *ptr, bContext *C) +static void draw_brick_actuator(uiLayout *layout, PointerRNA *ptr, bContext *C) { uiLayout *box; diff --git a/source/blender/editors/space_logic/space_logic.c b/source/blender/editors/space_logic/space_logic.c index a945af502a0..516130aa09b 100644 --- a/source/blender/editors/space_logic/space_logic.c +++ b/source/blender/editors/space_logic/space_logic.c @@ -39,6 +39,7 @@ #include "BKE_context.h" #include "BKE_screen.h" +#include "ED_space_api.h" #include "ED_screen.h" #include "BIF_gl.h" @@ -169,13 +170,13 @@ static SpaceLink *logic_duplicate(SpaceLink *sl) return (SpaceLink *)slogicn; } -void logic_operatortypes(void) +static void logic_operatortypes(void) { WM_operatortype_append(LOGIC_OT_properties); WM_operatortype_append(LOGIC_OT_links_cut); } -void logic_keymap(struct wmKeyConfig *keyconf) +static void logic_keymap(struct wmKeyConfig *keyconf) { wmKeyMap *keymap= WM_keymap_find(keyconf, "Logic Editor", SPACE_LOGIC, 0); diff --git a/source/blender/editors/space_nla/nla_edit.c b/source/blender/editors/space_nla/nla_edit.c index b70a6339fed..d43b86b436d 100644 --- a/source/blender/editors/space_nla/nla_edit.c +++ b/source/blender/editors/space_nla/nla_edit.c @@ -929,7 +929,7 @@ static int nlaedit_bake_exec (bContext *C, wmOperator *UNUSED(op)) return OPERATOR_FINISHED; } -void NLA_OT_bake (wmOperatorType *ot) +static void NLA_OT_bake (wmOperatorType *ot) { /* identifiers */ ot->name= "Bake Strips"; @@ -1555,7 +1555,7 @@ void NLA_OT_clear_scale (wmOperatorType *ot) /* Moves the start-point of the selected strips to the specified places */ /* defines for snap keyframes tool */ -EnumPropertyItem prop_nlaedit_snap_types[] = { +static EnumPropertyItem prop_nlaedit_snap_types[] = { {NLAEDIT_SNAP_CFRA, "CFRA", 0, "Current frame", ""}, {NLAEDIT_SNAP_NEAREST_FRAME, "NEAREST_FRAME", 0, "Nearest Frame", ""}, // XXX as single entry? {NLAEDIT_SNAP_NEAREST_SECOND, "NEAREST_SECOND", 0, "Nearest Second", ""}, // XXX as single entry? diff --git a/source/blender/editors/space_nla/nla_intern.h b/source/blender/editors/space_nla/nla_intern.h index b2ff0e107b3..98ebc5af227 100644 --- a/source/blender/editors/space_nla/nla_intern.h +++ b/source/blender/editors/space_nla/nla_intern.h @@ -67,6 +67,7 @@ enum { void NLA_OT_select_all_toggle(wmOperatorType *ot); void NLA_OT_select_border(wmOperatorType *ot); +void NLA_OT_select_leftright(wmOperatorType *ot); void NLA_OT_click_select(wmOperatorType *ot); /* **************************************** */ diff --git a/source/blender/editors/space_nla/nla_ops.c b/source/blender/editors/space_nla/nla_ops.c index 6a32f02c8ad..49c1733c37a 100644 --- a/source/blender/editors/space_nla/nla_ops.c +++ b/source/blender/editors/space_nla/nla_ops.c @@ -122,6 +122,7 @@ void nla_operatortypes(void) WM_operatortype_append(NLA_OT_click_select); WM_operatortype_append(NLA_OT_select_border); WM_operatortype_append(NLA_OT_select_all_toggle); + WM_operatortype_append(NLA_OT_select_leftright); /* edit */ WM_operatortype_append(NLA_OT_tweakmode_enter); @@ -185,8 +186,17 @@ static void nla_keymap_main (wmKeyConfig *keyconf, wmKeyMap *keymap) WM_keymap_add_item(keymap, "NLA_OT_click_select", SELECTMOUSE, KM_PRESS, 0, 0); kmi= WM_keymap_add_item(keymap, "NLA_OT_click_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "extend", 1); - kmi= WM_keymap_add_item(keymap, "NLA_OT_click_select", SELECTMOUSE, KM_PRESS, KM_CTRL, 0); - RNA_enum_set(kmi->ptr, "left_right", NLAEDIT_LRSEL_TEST); + + /* select left/right */ + WM_keymap_add_item(keymap, "NLA_OT_select_leftright", SELECTMOUSE, KM_PRESS, KM_CTRL, 0); + kmi= WM_keymap_add_item(keymap, "NLA_OT_select_leftright", SELECTMOUSE, KM_PRESS, KM_CTRL|KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "extend", 1); + + kmi= WM_keymap_add_item(keymap, "NLA_OT_select_leftright", LEFTBRACKETKEY, KM_PRESS, 0, 0); + RNA_enum_set(kmi->ptr, "mode", NLAEDIT_LRSEL_LEFT); + kmi= WM_keymap_add_item(keymap, "NLA_OT_select_leftright", RIGHTBRACKETKEY, KM_PRESS, 0, 0); + RNA_enum_set(kmi->ptr, "mode", NLAEDIT_LRSEL_RIGHT); + /* deselect all */ WM_keymap_add_item(keymap, "NLA_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0); diff --git a/source/blender/editors/space_nla/nla_select.c b/source/blender/editors/space_nla/nla_select.c index 032f4984b83..40cc6fb0784 100644 --- a/source/blender/editors/space_nla/nla_select.c +++ b/source/blender/editors/space_nla/nla_select.c @@ -90,7 +90,7 @@ enum { DESELECT_STRIPS_NOTEST = 0, DESELECT_STRIPS_TEST, DESELECT_STRIPS_CLEARACTIVE, -} eDeselectNlaStrips; +} /*eDeselectNlaStrips*/; /* Deselects strips in the NLA Editor * - This is called by the deselect all operator, as well as other ones! @@ -199,18 +199,18 @@ void NLA_OT_select_all_toggle (wmOperatorType *ot) /* ******************** Border Select Operator **************************** */ /* This operator currently works in one of three ways: - * -> BKEY - 1) all strips within region are selected (ACTKEYS_BORDERSEL_ALLSTRIPS) + * -> BKEY - 1) all strips within region are selected (NLAEDIT_BORDERSEL_ALLSTRIPS) * -> ALT-BKEY - depending on which axis of the region was larger... - * -> 2) x-axis, so select all frames within frame range (ACTKEYS_BORDERSEL_FRAMERANGE) - * -> 3) y-axis, so select all frames within channels that region included (ACTKEYS_BORDERSEL_CHANNELS) + * -> 2) x-axis, so select all frames within frame range (NLAEDIT_BORDERSEL_FRAMERANGE) + * -> 3) y-axis, so select all frames within channels that region included (NLAEDIT_BORDERSEL_CHANNELS) */ /* defines for borderselect mode */ -enum { +static enum { NLA_BORDERSEL_ALLSTRIPS = 0, NLA_BORDERSEL_FRAMERANGE, NLA_BORDERSEL_CHANNELS, -} eActKeys_BorderSelect_Mode; +} eNLAEDIT_BorderSelect_Mode; static void borderselect_nla_strips (bAnimContext *ac, rcti rect, short mode, short selectmode) @@ -340,28 +340,164 @@ void NLA_OT_select_border(wmOperatorType *ot) RNA_def_boolean(ot->srna, "axis_range", 0, "Axis Range", ""); } -/* ******************** Mouse-Click Select Operator *********************** */ -/* This operator works in one of 2 ways: - * 1) Select the strip directly under the mouse - * 2) Select all the strips to one side of the mouse - */ +/* ******************** Select Left/Right Operator ************************* */ +/* Select keyframes left/right of the current frame indicator */ /* defines for left-right select tool */ static EnumPropertyItem prop_nlaedit_leftright_select_types[] = { {NLAEDIT_LRSEL_TEST, "CHECK", 0, "Check if Select Left or Right", ""}, - {NLAEDIT_LRSEL_NONE, "OFF", 0, "Don't select", ""}, {NLAEDIT_LRSEL_LEFT, "LEFT", 0, "Before current frame", ""}, {NLAEDIT_LRSEL_RIGHT, "RIGHT", 0, "After current frame", ""}, {0, NULL, 0, NULL, NULL} }; -/* sensitivity factor for frame-selections */ -#define FRAME_CLICK_THRESH 0.1f +/* ------------------- */ +static void nlaedit_select_leftright (bContext *C, bAnimContext *ac, short leftright, short select_mode) +{ + ListBase anim_data = {NULL, NULL}; + bAnimListElem *ale; + int filter; + + Scene *scene= ac->scene; + float xmin, xmax; + + /* if currently in tweakmode, exit tweakmode first */ + if (scene->flag & SCE_NLA_EDIT_ON) + WM_operator_name_call(C, "NLA_OT_tweakmode_exit", WM_OP_EXEC_DEFAULT, NULL); + + /* if select mode is replace, deselect all keyframes (and channels) first */ + if (select_mode==SELECT_REPLACE) { + select_mode= SELECT_ADD; + + /* deselect all other channels and keyframes */ + ANIM_deselect_anim_channels(ac, ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR); + deselect_nla_strips(ac, 0, SELECT_SUBTRACT); + } + + /* get range, and get the right flag-setting mode */ + if (leftright == NLAEDIT_LRSEL_LEFT) { + xmin = MINAFRAMEF; + xmax = (float)(CFRA + 0.1f); + } + else { + xmin = (float)(CFRA - 0.1f); + xmax = MAXFRAMEF; + } + + select_mode= selmodes_to_flagmodes(select_mode); + + + /* filter data */ + filter= (ANIMFILTER_VISIBLE | ANIMFILTER_NLATRACKS); + ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); + + /* select strips on the side where most data occurs */ + for (ale= anim_data.first; ale; ale= ale->next) { + NlaTrack *nlt= (NlaTrack *)ale->data; + NlaStrip *strip; + + /* check each strip to see if it is appropriate */ + for (strip= nlt->strips.first; strip; strip= strip->next) { + if (BKE_nlastrip_within_bounds(strip, xmin, xmax)) { + ACHANNEL_SET_FLAG(strip, select_mode, NLASTRIP_FLAG_SELECT); + } + } + } + + /* Cleanup */ + BLI_freelistN(&anim_data); +} /* ------------------- */ -/* option 1) select strip directly under mouse */ +static int nlaedit_select_leftright_exec (bContext *C, wmOperator *op) +{ + bAnimContext ac; + short leftright = RNA_enum_get(op->ptr, "mode"); + short selectmode; + + /* get editor data */ + if (ANIM_animdata_get_context(C, &ac) == 0) + return OPERATOR_CANCELLED; + + /* select mode is either replace (deselect all, then add) or add/extend */ + if (RNA_boolean_get(op->ptr, "extend")) + selectmode= SELECT_INVERT; + else + selectmode= SELECT_REPLACE; + + /* if "test" mode is set, we don't have any info to set this with */ + if (leftright == NLAEDIT_LRSEL_TEST) + return OPERATOR_CANCELLED; + + /* do the selecting now */ + nlaedit_select_leftright(C, &ac, leftright, selectmode); + + /* set notifier that keyframe selection (and channels too) have changed */ + WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|ND_ANIMCHAN|NA_SELECTED, NULL); + + return OPERATOR_FINISHED; +} + +static int nlaedit_select_leftright_invoke (bContext *C, wmOperator *op, wmEvent *event) +{ + bAnimContext ac; + short leftright = RNA_enum_get(op->ptr, "mode"); + + /* get editor data */ + if (ANIM_animdata_get_context(C, &ac) == 0) + return OPERATOR_CANCELLED; + + /* handle mode-based testing */ + if (leftright == NLAEDIT_LRSEL_TEST) { + Scene *scene= ac.scene; + ARegion *ar= ac.ar; + View2D *v2d= &ar->v2d; + + int mval[2]; + float x; + + /* get mouse coordinates (in region coordinates) */ + mval[0]= (event->x - ar->winrct.xmin); + mval[1]= (event->y - ar->winrct.ymin); + + /* determine which side of the current frame mouse is on */ + UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, NULL); + if (x < CFRA) + RNA_int_set(op->ptr, "mode", NLAEDIT_LRSEL_LEFT); + else + RNA_int_set(op->ptr, "mode", NLAEDIT_LRSEL_RIGHT); + } + + /* perform selection */ + return nlaedit_select_leftright_exec(C, op); +} + +void NLA_OT_select_leftright (wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Select Left/Right"; + ot->idname= "NLA_OT_select_leftright"; + ot->description= "Select strips to the left or the right of the current frame "; + + /* api callbacks */ + ot->invoke= nlaedit_select_leftright_invoke; + ot->exec= nlaedit_select_leftright_exec; + ot->poll= ED_operator_nla_active; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + /* id-props */ + ot->prop= RNA_def_enum(ot->srna, "mode", prop_nlaedit_leftright_select_types, NLAEDIT_LRSEL_TEST, "Mode", ""); + RNA_def_boolean(ot->srna, "extend", 0, "Extend Select", ""); +} + + +/* ******************** Mouse-Click Select Operator *********************** */ + +/* select strip directly under mouse */ static void mouse_nla_strips (bContext *C, bAnimContext *ac, int mval[2], short select_mode) { ListBase anim_data = {NULL, NULL}; @@ -463,63 +599,6 @@ static void mouse_nla_strips (bContext *C, bAnimContext *ac, int mval[2], short } } -/* Option 2) Selects all the strips on either side of the current frame (depends on which side the mouse is on) */ -static void nlaedit_mselect_leftright (bContext *C, bAnimContext *ac, short leftright, short select_mode) -{ - ListBase anim_data = {NULL, NULL}; - bAnimListElem *ale; - int filter; - - Scene *scene= ac->scene; - float xmin, xmax; - - /* if currently in tweakmode, exit tweakmode first */ - if (scene->flag & SCE_NLA_EDIT_ON) - WM_operator_name_call(C, "NLA_OT_tweakmode_exit", WM_OP_EXEC_DEFAULT, NULL); - - /* if select mode is replace, deselect all keyframes (and channels) first */ - if (select_mode==SELECT_REPLACE) { - select_mode= SELECT_ADD; - - /* deselect all other channels and keyframes */ - ANIM_deselect_anim_channels(ac, ac->data, ac->datatype, 0, ACHANNEL_SETFLAG_CLEAR); - deselect_nla_strips(ac, 0, SELECT_SUBTRACT); - } - - /* get range, and get the right flag-setting mode */ - if (leftright == NLAEDIT_LRSEL_LEFT) { - xmin = MINAFRAMEF; - xmax = (float)(CFRA + FRAME_CLICK_THRESH); - } - else { - xmin = (float)(CFRA - FRAME_CLICK_THRESH); - xmax = MAXFRAMEF; - } - - select_mode= selmodes_to_flagmodes(select_mode); - - - /* filter data */ - filter= (ANIMFILTER_VISIBLE | ANIMFILTER_NLATRACKS); - ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype); - - /* select strips on the side where most data occurs */ - for (ale= anim_data.first; ale; ale= ale->next) { - NlaTrack *nlt= (NlaTrack *)ale->data; - NlaStrip *strip; - - /* check each strip to see if it is appropriate */ - for (strip= nlt->strips.first; strip; strip= strip->next) { - if (BKE_nlastrip_within_bounds(strip, xmin, xmax)) { - ACHANNEL_SET_FLAG(strip, select_mode, NLASTRIP_FLAG_SELECT); - } - } - } - - /* Cleanup */ - BLI_freelistN(&anim_data); -} - /* ------------------- */ /* handle clicking */ @@ -550,24 +629,9 @@ static int nlaedit_clickselect_invoke(bContext *C, wmOperator *op, wmEvent *even selectmode= SELECT_INVERT; else selectmode= SELECT_REPLACE; - - /* figure out action to take */ - if (RNA_enum_get(op->ptr, "left_right")) { - /* select all keys on same side of current frame as mouse */ - float x; - - UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, NULL); - if (x < CFRA) - RNA_int_set(op->ptr, "left_right", NLAEDIT_LRSEL_LEFT); - else - RNA_int_set(op->ptr, "left_right", NLAEDIT_LRSEL_RIGHT); - nlaedit_mselect_leftright(C, &ac, RNA_enum_get(op->ptr, "left_right"), selectmode); - } - else { - /* select strips based upon mouse position */ - mouse_nla_strips(C, &ac, mval, selectmode); - } + /* select strips based upon mouse position */ + mouse_nla_strips(C, &ac, mval, selectmode); /* set notifier that things have changed */ WM_event_add_notifier(C, NC_ANIMATION|ND_NLA|NA_SELECTED, NULL); @@ -591,8 +655,6 @@ void NLA_OT_click_select (wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* id-props */ - // XXX should we make this into separate operators? - RNA_def_enum(ot->srna, "left_right", prop_nlaedit_leftright_select_types, 0, "Left Right", ""); // CTRLKEY RNA_def_boolean(ot->srna, "extend", 0, "Extend Select", ""); // SHIFTKEY } diff --git a/source/blender/editors/space_nla/space_nla.c b/source/blender/editors/space_nla/space_nla.c index db9255a867b..06b1b93b590 100644 --- a/source/blender/editors/space_nla/space_nla.c +++ b/source/blender/editors/space_nla/space_nla.c @@ -44,6 +44,7 @@ #include "BKE_main.h" #include "BKE_screen.h" +#include "ED_space_api.h" #include "ED_anim_api.h" #include "ED_markers.h" #include "ED_screen.h" diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index e1577309afa..203e6a618a5 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -150,10 +150,12 @@ static void node_buts_curvevec(uiLayout *layout, bContext *UNUSED(C), PointerRNA } static float *_sample_col= NULL; // bad bad, 2.5 will do better? -void node_curvemap_sample(float *col) +#if 0 +static void node_curvemap_sample(float *col) { _sample_col= col; } +#endif static void node_buts_curvecol(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c index b8a205d6eb1..7b9a33c521f 100644 --- a/source/blender/editors/space_node/node_draw.c +++ b/source/blender/editors/space_node/node_draw.c @@ -53,6 +53,7 @@ #include "WM_api.h" #include "WM_types.h" +#include "ED_node.h" #include "ED_gpencil.h" #include "UI_interface.h" @@ -664,8 +665,8 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN uiSetRoundBox(3); uiRoundBox(rct->xmin, rct->ymax-NODE_DY, rct->xmax, rct->ymax, BASIS_RAD); - /* show/hide icons, note this sequence is copied in editnode.c */ - iconofs= rct->xmax; + /* show/hide icons, note this sequence is copied in do_header_node() node_state.c */ + iconofs= rct->xmax - 7.0f; if(node->typeinfo->flag & NODE_PREVIEW) { int icon_id; @@ -674,7 +675,7 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN icon_id= ICON_MATERIAL; else icon_id= ICON_MATERIAL_DATA; - iconofs-=22.0f; + iconofs-=15.0f; uiDefIconBut(node->block, LABEL, B_REDR, icon_id, iconofs, rct->ymax-NODE_DY, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 1.0, 0.5, ""); } diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c index 624630b9846..385dfbcd9a8 100644 --- a/source/blender/editors/space_node/node_edit.c +++ b/source/blender/editors/space_node/node_edit.c @@ -210,7 +210,7 @@ static int composite_node_active(bContext *C) } /* also checks for edited groups */ -bNode *editnode_get_active(bNodeTree *ntree) +static bNode *editnode_get_active(bNodeTree *ntree) { bNode *node; @@ -1352,7 +1352,7 @@ void NODE_OT_link_viewer(wmOperatorType *ot) /* return 0, nothing done */ -/*static*/ int node_mouse_groupheader(SpaceNode *snode) +static int node_mouse_groupheader(SpaceNode *snode) { bNode *gnode; float mx=0, my=0; @@ -1481,7 +1481,7 @@ typedef struct bNodeListItem { struct bNode *node; } bNodeListItem; -int sort_nodes_locx(void *a, void *b) +static int sort_nodes_locx(void *a, void *b) { bNodeListItem *nli1 = (bNodeListItem *)a; bNodeListItem *nli2 = (bNodeListItem *)b; diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h index 831e157deef..eb7e1209801 100644 --- a/source/blender/editors/space_node/node_intern.h +++ b/source/blender/editors/space_node/node_intern.h @@ -121,6 +121,8 @@ void NODE_OT_backimage_sample(wmOperatorType *ot); void NODE_OT_add_file(struct wmOperatorType *ot); +extern const char *node_context_dir[]; + // XXXXXX // XXX from BSE_node.h diff --git a/source/blender/editors/space_node/node_ops.c b/source/blender/editors/space_node/node_ops.c index db5c493dcd9..9c2b6f0274d 100644 --- a/source/blender/editors/space_node/node_ops.c +++ b/source/blender/editors/space_node/node_ops.c @@ -31,6 +31,7 @@ #include "BKE_context.h" +#include "ED_node.h" #include "ED_screen.h" #include "ED_transform.h" diff --git a/source/blender/editors/space_node/node_state.c b/source/blender/editors/space_node/node_state.c index 4f2f204fbe6..332080f023c 100644 --- a/source/blender/editors/space_node/node_state.c +++ b/source/blender/editors/space_node/node_state.c @@ -117,21 +117,21 @@ static int do_header_node(SpaceNode *snode, bNode *node, float mx, float my) node->flag ^= NODE_PREVIEW; return 1; } - totr.xmin-=18.0f; + totr.xmin-=15.0f; } if(node->type == NODE_GROUP) { if(BLI_in_rctf(&totr, mx, my)) { snode_make_group_editable(snode, node); return 1; } - totr.xmin-=18.0f; + totr.xmin-=15.0f; } if(node->typeinfo->flag & NODE_OPTIONS) { if(BLI_in_rctf(&totr, mx, my)) { node->flag ^= NODE_OPTIONS; return 1; } - totr.xmin-=18.0f; + totr.xmin-=15.0f; } /* hide unused sockets */ if(BLI_in_rctf(&totr, mx, my)) { diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c index 1ac745b8c0e..db4d02a776c 100644 --- a/source/blender/editors/space_node/space_node.c +++ b/source/blender/editors/space_node/space_node.c @@ -45,6 +45,7 @@ #include "BKE_screen.h" #include "BKE_node.h" +#include "ED_space_api.h" #include "ED_render.h" #include "ED_screen.h" @@ -410,13 +411,14 @@ static void node_region_listener(ARegion *ar, wmNotifier *wmn) } } +const char *node_context_dir[] = {"selected_nodes", NULL}; + static int node_context(const bContext *C, const char *member, bContextDataResult *result) { SpaceNode *snode= CTX_wm_space_node(C); if(CTX_data_dir(member)) { - static const char *dir[] = {"selected_nodes", NULL}; - CTX_data_dir_set(result, dir); + CTX_data_dir_set(result, node_context_dir); return 1; } else if(CTX_data_equals(member, "selected_nodes")) { diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c index 53aea610d42..b0b89716222 100644 --- a/source/blender/editors/space_outliner/outliner.c +++ b/source/blender/editors/space_outliner/outliner.c @@ -1189,7 +1189,7 @@ static void outliner_make_hierarchy(SpaceOops *soops, ListBase *lb) } /* Helped function to put duplicate sequence in the same tree. */ -int need_add_seq_dup(Sequence *seq) +static int need_add_seq_dup(Sequence *seq) { Sequence *p; @@ -1226,7 +1226,7 @@ int need_add_seq_dup(Sequence *seq) return(1); } -void add_seq_dup(SpaceOops *soops, Sequence *seq, TreeElement *te, short index) +static void add_seq_dup(SpaceOops *soops, Sequence *seq, TreeElement *te, short index) { TreeElement *ch; Sequence *p; @@ -1611,7 +1611,7 @@ static int common_restrict_check(bContext *C, Object *ob) return 1; } -void object_toggle_visibility_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *UNUSED(tsep), TreeStoreElem *tselem) +static void object_toggle_visibility_cb(bContext *C, Scene *scene, TreeElement *te, TreeStoreElem *UNUSED(tsep), TreeStoreElem *tselem) { Base *base= (Base *)te->directdata; Object *ob = (Object *)tselem->id; @@ -1694,7 +1694,7 @@ void OUTLINER_OT_selectability_toggle(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } -void object_toggle_renderability_cb(bContext *UNUSED(C), Scene *scene, TreeElement *te, TreeStoreElem *UNUSED(tsep), TreeStoreElem *tselem) +static void object_toggle_renderability_cb(bContext *UNUSED(C), Scene *scene, TreeElement *te, TreeStoreElem *UNUSED(tsep), TreeStoreElem *tselem) { Base *base= (Base *)te->directdata; @@ -1900,7 +1900,7 @@ static void outliner_open_reveal(SpaceOops *soops, ListBase *lb, TreeElement *te #endif // XXX just use View2D ops for this? -void outliner_page_up_down(Scene *UNUSED(scene), ARegion *ar, SpaceOops *soops, int up) +static void outliner_page_up_down(Scene *UNUSED(scene), ARegion *ar, SpaceOops *soops, int up) { int dy= ar->v2d.mask.ymax-ar->v2d.mask.ymin; @@ -3416,7 +3416,7 @@ static void outliner_do_data_operation(SpaceOops *soops, int type, int event, Li } } -void outliner_del(bContext *C, Scene *scene, ARegion *UNUSED(ar), SpaceOops *soops) +static void outliner_del(bContext *C, Scene *scene, ARegion *UNUSED(ar), SpaceOops *soops) { if(soops->outlinevis==SO_SEQUENCE) @@ -3965,7 +3965,7 @@ static void tree_element_to_path(SpaceOops *soops, TreeElement *te, TreeStoreEle enum { DRIVERS_EDITMODE_ADD = 0, DRIVERS_EDITMODE_REMOVE, -} eDrivers_EditModes; +} /*eDrivers_EditModes*/; /* Utilities ---------------------------------- */ @@ -4119,7 +4119,7 @@ void OUTLINER_OT_drivers_delete_selected(wmOperatorType *ot) enum { KEYINGSET_EDITMODE_ADD = 0, KEYINGSET_EDITMODE_REMOVE, -} eKeyingSet_EditModes; +} /*eKeyingSet_EditModes*/; /* Utilities ---------------------------------- */ diff --git a/source/blender/editors/space_outliner/space_outliner.c b/source/blender/editors/space_outliner/space_outliner.c index 0b941e910f8..66404287693 100644 --- a/source/blender/editors/space_outliner/space_outliner.c +++ b/source/blender/editors/space_outliner/space_outliner.c @@ -39,6 +39,7 @@ #include "BKE_context.h" #include "BKE_screen.h" +#include "ED_space_api.h" #include "ED_screen.h" #include "WM_api.h" diff --git a/source/blender/editors/space_script/space_script.c b/source/blender/editors/space_script/space_script.c index d0631f5651a..502b01c366a 100644 --- a/source/blender/editors/space_script/space_script.c +++ b/source/blender/editors/space_script/space_script.c @@ -39,6 +39,7 @@ #include "BKE_context.h" #include "BKE_screen.h" +#include "ED_space_api.h" #include "ED_screen.h" #include "BIF_gl.h" diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c index 635e261b26e..8b3240e91c8 100644 --- a/source/blender/editors/space_sequencer/sequencer_draw.c +++ b/source/blender/editors/space_sequencer/sequencer_draw.c @@ -70,8 +70,6 @@ /* Note, Dont use WHILE_SEQ while drawing! - it messes up transform, - Campbell */ - -int no_rightbox=0, no_leftbox= 0; static void draw_shadedstrip(Sequence *seq, unsigned char col[3], float x1, float y1, float x2, float y2); static void get_seq_color3ubv(Scene *curscene, Sequence *seq, unsigned char col[3]) @@ -673,7 +671,7 @@ static void draw_seq_strip(Scene *scene, ARegion *ar, Sequence *seq, int outline static Sequence *special_seq_update= 0; -void set_special_seq_update(int val) +static void set_special_seq_update(int val) { // int x; diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index 505b38147f7..39a81e7481e 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -106,7 +106,7 @@ EnumPropertyItem prop_side_types[] = { {0, NULL, 0, NULL, NULL} }; -EnumPropertyItem prop_side_lr_types[] = { +static EnumPropertyItem prop_side_lr_types[] = { {SEQ_SIDE_LEFT, "LEFT", 0, "Left", ""}, {SEQ_SIDE_RIGHT, "RIGHT", 0, "Right", ""}, {0, NULL, 0, NULL, NULL} @@ -121,28 +121,6 @@ typedef struct TransSeq { int len; } TransSeq; -Sequence *get_foreground_frame_seq(Scene *scene, int frame) -{ - Editing *ed= seq_give_editing(scene, FALSE); - Sequence *seq, *best_seq=NULL; - int best_machine = -1; - - if(!ed) return NULL; - - for (seq=ed->seqbasep->first; seq; seq= seq->next) { - if(seq->flag & SEQ_MUTE || seq->startdisp > frame || seq->enddisp <= frame) - continue; - /* only use elements you can see - not */ - if (ELEM5(seq->type, SEQ_IMAGE, SEQ_META, SEQ_SCENE, SEQ_MOVIE, SEQ_COLOR)) { - if (seq->machine > best_machine) { - best_seq = seq; - best_machine = seq->machine; - } - } - } - return best_seq; -} - void seq_rectf(Sequence *seq, rctf *rectf) { if(seq->startstill) rectf->xmin= seq->start; @@ -205,7 +183,7 @@ void boundbox_seq(Scene *scene, rctf *rect) } -int mouse_frame_side(View2D *v2d, short mouse_x, int frame ) +static int mouse_frame_side(View2D *v2d, short mouse_x, int frame ) { short mval[2]; float mouseloc[2]; @@ -252,7 +230,7 @@ Sequence *find_neighboring_sequence(Scene *scene, Sequence *test, int lr, int se return NULL; } -Sequence *find_next_prev_sequence(Scene *scene, Sequence *test, int lr, int sel) +static Sequence *find_next_prev_sequence(Scene *scene, Sequence *test, int lr, int sel) { /* sel - 0==unselected, 1==selected, -1==done care*/ Sequence *seq,*best_seq = NULL; @@ -506,7 +484,7 @@ static void reload_image_strip(Scene *scene, char *UNUSED(name)) } -void change_sequence(Scene *scene) +static void change_sequence(Scene *scene) { Editing *ed= seq_give_editing(scene, FALSE); Sequence *last_seq= seq_active_get(scene); @@ -952,7 +930,7 @@ static int cut_seq_list(Scene *scene, ListBase *old, ListBase *new, int cutframe return did_something; } -int insert_gap(Scene *scene, int gap, int cfra) +static int insert_gap(Scene *scene, int gap, int cfra) { Sequence *seq; Editing *ed= seq_give_editing(scene, FALSE); @@ -974,7 +952,7 @@ int insert_gap(Scene *scene, int gap, int cfra) return done; } -void touch_seq_files(Scene *scene) +static void touch_seq_files(Scene *scene) { Sequence *seq; Editing *ed= seq_give_editing(scene, FALSE); @@ -1029,7 +1007,7 @@ static void set_filter_seq(Scene *scene) } */ -void seq_remap_paths(Scene *scene) +static void seq_remap_paths(Scene *scene) { Sequence *seq, *last_seq = seq_active_get(scene); Editing *ed= seq_give_editing(scene, FALSE); @@ -1070,7 +1048,7 @@ void seq_remap_paths(Scene *scene) } -void no_gaps(Scene *scene) +static void no_gaps(Scene *scene) { Editing *ed= seq_give_editing(scene, FALSE); int cfra, first= 0, done; @@ -1466,7 +1444,7 @@ static int sequencer_reassign_inputs_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -int sequencer_effect_poll(bContext *C) +static int sequencer_effect_poll(bContext *C) { Scene *scene= CTX_data_scene(C); Editing *ed= seq_give_editing(scene, FALSE); diff --git a/source/blender/editors/space_sequencer/sequencer_select.c b/source/blender/editors/space_sequencer/sequencer_select.c index a20d2d7680e..3b4312cda2b 100644 --- a/source/blender/editors/space_sequencer/sequencer_select.c +++ b/source/blender/editors/space_sequencer/sequencer_select.c @@ -60,7 +60,7 @@ #include "sequencer_intern.h" static void *find_nearest_marker(int UNUSED(d1), int UNUSED(d2)) {return NULL;} -void select_surrounding_handles(Scene *scene, Sequence *test) /* XXX BRING BACK */ +static void select_surrounding_handles(Scene *scene, Sequence *test) /* XXX BRING BACK */ { Sequence *neighbor; @@ -154,7 +154,7 @@ void select_surround_from_last(Scene *scene) #endif -void select_single_seq(Scene *scene, Sequence *seq, int deselect_all) /* BRING BACK */ +static void select_single_seq(Scene *scene, Sequence *seq, int deselect_all) /* BRING BACK */ { Editing *ed= seq_give_editing(scene, FALSE); @@ -176,8 +176,8 @@ void select_single_seq(Scene *scene, Sequence *seq, int deselect_all) /* BRING B // remove this function, replace with invert operator //void swap_select_seq(Scene *scene) - -void select_neighbor_from_last(Scene *scene, int lr) +#if 0 +static void select_neighbor_from_last(Scene *scene, int lr) { Sequence *seq= seq_active_get(scene); Sequence *neighbor; @@ -206,7 +206,7 @@ void select_neighbor_from_last(Scene *scene, int lr) if (change) { } } - +#endif /* (de)select operator */ static int sequencer_deselect_exec(bContext *C, wmOperator *UNUSED(op)) diff --git a/source/blender/editors/space_sequencer/space_sequencer.c b/source/blender/editors/space_sequencer/space_sequencer.c index ed280d765f0..5323c3d064e 100644 --- a/source/blender/editors/space_sequencer/space_sequencer.c +++ b/source/blender/editors/space_sequencer/space_sequencer.c @@ -43,6 +43,8 @@ #include "BKE_sequencer.h" #include "BKE_global.h" +#include "ED_space_api.h" +#include "ED_sequencer.h" #include "ED_screen.h" #include "ED_view3d.h" /* only for sequencer view3d drawing callback */ @@ -83,7 +85,7 @@ ARegion *sequencer_has_buttons_region(ScrArea *sa) return arnew; } -ARegion *sequencer_find_region(ScrArea *sa, short type) +static ARegion *sequencer_find_region(ScrArea *sa, short type) { ARegion *ar=NULL; diff --git a/source/blender/editors/space_sound/space_sound.c b/source/blender/editors/space_sound/space_sound.c index 200f15f6109..4ae452850a7 100644 --- a/source/blender/editors/space_sound/space_sound.c +++ b/source/blender/editors/space_sound/space_sound.c @@ -41,6 +41,7 @@ #include "BKE_context.h" #include "BKE_screen.h" +#include "ED_space_api.h" #include "ED_screen.h" #include "BIF_gl.h" @@ -165,12 +166,12 @@ static void sound_main_area_draw(const bContext *C, ARegion *ar) /* scrollers? */ } -void sound_operatortypes(void) +static void sound_operatortypes(void) { } -void sound_keymap(struct wmKeyConfig *UNUSED(keyconf)) +static void sound_keymap(struct wmKeyConfig *UNUSED(keyconf)) { } diff --git a/source/blender/editors/space_text/space_text.c b/source/blender/editors/space_text/space_text.c index 75001b9514c..8ed49b5945d 100644 --- a/source/blender/editors/space_text/space_text.c +++ b/source/blender/editors/space_text/space_text.c @@ -42,6 +42,7 @@ #include "BKE_context.h" #include "BKE_screen.h" +#include "ED_space_api.h" #include "ED_screen.h" #include "BIF_gl.h" @@ -70,6 +71,7 @@ static SpaceLink *text_new(const bContext *UNUSED(C)) stext->lheight= 12; stext->tabnumber= 4; + stext->margin_column= 80; /* header */ ar= MEM_callocN(sizeof(ARegion), "header for text"); @@ -185,6 +187,7 @@ static void text_operatortypes(void) WM_operatortype_append(TEXT_OT_select_line); WM_operatortype_append(TEXT_OT_select_all); + WM_operatortype_append(TEXT_OT_select_word); WM_operatortype_append(TEXT_OT_jump); WM_operatortype_append(TEXT_OT_move); @@ -192,6 +195,7 @@ static void text_operatortypes(void) WM_operatortype_append(TEXT_OT_delete); WM_operatortype_append(TEXT_OT_overwrite_toggle); + WM_operatortype_append(TEXT_OT_selection_set); WM_operatortype_append(TEXT_OT_cursor_set); WM_operatortype_append(TEXT_OT_scroll); WM_operatortype_append(TEXT_OT_scroll_bar); @@ -277,6 +281,10 @@ static void text_keymap(struct wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "TEXT_OT_copy", CKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "TEXT_OT_paste", VKEY, KM_PRESS, KM_CTRL, 0); + WM_keymap_add_item(keymap, "TEXT_OT_cut", DELKEY, KM_PRESS, KM_SHIFT, 0); + WM_keymap_add_item(keymap, "TEXT_OT_copy", INSERTKEY, KM_PRESS, KM_CTRL, 0); + WM_keymap_add_item(keymap, "TEXT_OT_paste", INSERTKEY, KM_PRESS, KM_SHIFT, 0); + if(U.uiflag & USER_MMB_PASTE) // XXX not dynamic RNA_boolean_set(WM_keymap_add_item(keymap, "TEXT_OT_paste", MIDDLEMOUSE, KM_PRESS, 0, 0)->ptr, "selection", 1); @@ -287,9 +295,11 @@ static void text_keymap(struct wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "TEXT_OT_replace", HKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "TEXT_OT_to_3d_object", MKEY, KM_PRESS, KM_ALT, 0); + RNA_boolean_set(WM_keymap_add_item(keymap, "TEXT_OT_to_3d_object", MKEY, KM_PRESS, KM_CTRL, 0)->ptr, "split_lines", 1); WM_keymap_add_item(keymap, "TEXT_OT_select_all", AKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "TEXT_OT_select_line", AKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0); + WM_keymap_add_item(keymap, "TEXT_OT_select_word", LEFTMOUSE, KM_DBL_CLICK, 0, 0); WM_keymap_add_item(keymap, "TEXT_OT_indent", TABKEY, KM_PRESS, 0, 0); @@ -336,8 +346,9 @@ static void text_keymap(struct wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "TEXT_OT_scroll", MIDDLEMOUSE, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "TEXT_OT_scroll", MOUSEPAN, 0, 0, 0); WM_keymap_add_item(keymap, "TEXT_OT_scroll_bar", LEFTMOUSE, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "TEXT_OT_selection_set", EVT_TWEAK_L, KM_ANY, 0, 0); WM_keymap_add_item(keymap, "TEXT_OT_cursor_set", LEFTMOUSE, KM_PRESS, 0, 0); - RNA_boolean_set(WM_keymap_add_item(keymap, "TEXT_OT_cursor_set", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "select", 1); + RNA_boolean_set(WM_keymap_add_item(keymap, "TEXT_OT_selection_set", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "select", 1); RNA_int_set(WM_keymap_add_item(keymap, "TEXT_OT_scroll", WHEELUPMOUSE, KM_PRESS, 0, 0)->ptr, "lines", -1); RNA_int_set(WM_keymap_add_item(keymap, "TEXT_OT_scroll", WHEELDOWNMOUSE, KM_PRESS, 0, 0)->ptr, "lines", 1); @@ -350,13 +361,14 @@ static void text_keymap(struct wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "TEXT_OT_insert", KM_TEXTINPUT, KM_ANY, KM_ANY, 0); // last! } +const char *text_context_dir[] = {"edit_text", NULL}; + static int text_context(const bContext *C, const char *member, bContextDataResult *result) { SpaceText *st= CTX_wm_space_text(C); if(CTX_data_dir(member)) { - static const char *dir[] = {"edit_text", NULL}; - CTX_data_dir_set(result, dir); + CTX_data_dir_set(result, text_context_dir); return 1; } else if(CTX_data_equals(member, "edit_text")) { diff --git a/source/blender/editors/space_text/text_draw.c b/source/blender/editors/space_text/text_draw.c index 6f9ad138bac..b3e6920aa29 100644 --- a/source/blender/editors/space_text/text_draw.c +++ b/source/blender/editors/space_text/text_draw.c @@ -250,7 +250,7 @@ static int find_bool(char *string) /* Ensures the format string for the given line is long enough, reallocating as needed. Allocation is done here, alone, to ensure consistency. */ -int text_check_format_len(TextLine *line, unsigned int len) +static int text_check_format_len(TextLine *line, unsigned int len) { if(line->format) { if(strlen(line->format) < len) { @@ -954,7 +954,7 @@ void text_free_caches(SpaceText *st) /************************ word-wrap utilities *****************************/ /* cache should be updated in caller */ -int text_get_visible_lines_no(SpaceText *st, int lineno) +static int text_get_visible_lines_no(SpaceText *st, int lineno) { DrawCache *drawcache= (DrawCache *)st->drawcache; @@ -1779,6 +1779,15 @@ void draw_text_main(SpaceText *st, ARegion *ar) wrap_skip= 0; } + if(st->flags&ST_SHOW_MARGIN) { + UI_ThemeColor(TH_HILITE); + + glBegin(GL_LINES); + glVertex2i(x+st->cwidth*st->margin_column, 0); + glVertex2i(x+st->cwidth*st->margin_column, ar->winy - 2); + glEnd(); + } + /* draw other stuff */ draw_brackets(st, ar); draw_markers(st, ar); diff --git a/source/blender/editors/space_text/text_header.c b/source/blender/editors/space_text/text_header.c index 1287f68dc04..3b04b056f4e 100644 --- a/source/blender/editors/space_text/text_header.c +++ b/source/blender/editors/space_text/text_header.c @@ -70,7 +70,7 @@ /************************** properties ******************************/ -ARegion *text_has_properties_region(ScrArea *sa) +static ARegion *text_has_properties_region(ScrArea *sa) { ARegion *ar, *arnew; diff --git a/source/blender/editors/space_text/text_intern.h b/source/blender/editors/space_text/text_intern.h index 5f6b2e05ba7..f18a3245f9b 100644 --- a/source/blender/editors/space_text/text_intern.h +++ b/source/blender/editors/space_text/text_intern.h @@ -133,6 +133,7 @@ void TEXT_OT_previous_marker(struct wmOperatorType *ot); void TEXT_OT_select_line(struct wmOperatorType *ot); void TEXT_OT_select_all(struct wmOperatorType *ot); +void TEXT_OT_select_word(struct wmOperatorType *ot); void TEXT_OT_jump(struct wmOperatorType *ot); void TEXT_OT_move(struct wmOperatorType *ot); @@ -142,6 +143,7 @@ void TEXT_OT_overwrite_toggle(struct wmOperatorType *ot); void TEXT_OT_scroll(struct wmOperatorType *ot); void TEXT_OT_scroll_bar(struct wmOperatorType *ot); +void TEXT_OT_selection_set(struct wmOperatorType *ot); void TEXT_OT_cursor_set(struct wmOperatorType *ot); void TEXT_OT_line_number(struct wmOperatorType *ot); @@ -157,5 +159,8 @@ void TEXT_OT_to_3d_object(struct wmOperatorType *ot); void TEXT_OT_resolve_conflict(struct wmOperatorType *ot); +/* space_text.c */ +extern const char *text_context_dir[]; /* doc access */ + #endif /* ED_TEXT_INTERN_H */ diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c index bfec734dad6..d8cbe93012d 100644 --- a/source/blender/editors/space_text/text_ops.c +++ b/source/blender/editors/space_text/text_ops.c @@ -52,6 +52,7 @@ #include "WM_api.h" #include "WM_types.h" +#include "ED_text.h" #include "ED_curve.h" #include "ED_screen.h" #include "UI_interface.h" @@ -1228,11 +1229,38 @@ void TEXT_OT_select_line(wmOperatorType *ot) ot->idname= "TEXT_OT_select_line"; ot->description= "Select text by line"; - /* api clinebacks */ + /* api callbacks */ ot->exec= select_line_exec; ot->poll= text_edit_poll; } +/******************* select word operator *********************/ + +static int select_word_exec(bContext *C, wmOperator *UNUSED(op)) +{ + Text *text= CTX_data_edit_text(C); + + txt_jump_left(text, 0); + txt_jump_right(text, 1); + + text_update_cursor_moved(C); + WM_event_add_notifier(C, NC_TEXT|NA_EDITED, text); + + return OPERATOR_FINISHED; +} + +void TEXT_OT_select_word(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Select Word"; + ot->idname= "TEXT_OT_select_word"; + ot->description= "Select word under cursor"; + + /* api callbacks */ + ot->exec= select_word_exec; + ot->poll= text_edit_poll; +} + /******************* previous marker operator *********************/ static int previous_marker_exec(bContext *C, wmOperator *UNUSED(op)) @@ -2012,7 +2040,7 @@ enum { SCROLLHANDLE_BAR, SCROLLHANDLE_MIN_OUTSIDE, SCROLLHANDLE_MAX_OUTSIDE -} TextScrollerHandle_Zone; +}; typedef struct TextScroll { short old[2]; @@ -2285,13 +2313,13 @@ void TEXT_OT_scroll_bar(wmOperatorType *ot) RNA_def_int(ot->srna, "lines", 1, INT_MIN, INT_MAX, "Lines", "Number of lines to scroll.", -100, 100); } -/******************* set cursor operator **********************/ +/******************* set selection operator **********************/ -typedef struct SetCursor { +typedef struct SetSelection { int selecting; int selc, sell; short old[2]; -} SetCursor; +} SetSelection; static void set_cursor_to_pos(SpaceText *st, ARegion *ar, int x, int y, int sel) { @@ -2457,10 +2485,10 @@ static void set_cursor_apply(bContext *C, wmOperator *op, wmEvent *event) { SpaceText *st= CTX_wm_space_text(C); ARegion *ar= CTX_wm_region(C); - SetCursor *scu= op->customdata; + SetSelection *ssel= op->customdata; if(event->mval[1]<0 || event->mval[1]>ar->winy) { - int d= (scu->old[1]-event->mval[1])*st->pix_per_line; + int d= (ssel->old[1]-event->mval[1])*st->pix_per_line; if(d) screen_skip(st, ar, d); set_cursor_to_pos(st, ar, event->mval[0], event->mval[1]<0?0:ar->winy, 1); @@ -2484,8 +2512,8 @@ static void set_cursor_apply(bContext *C, wmOperator *op, wmEvent *event) text_update_cursor_moved(C); WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, st->text); - scu->old[0]= event->mval[0]; - scu->old[1]= event->mval[1]; + ssel->old[0]= event->mval[0]; + ssel->old[1]= event->mval[1]; } } @@ -2493,7 +2521,7 @@ static void set_cursor_exit(bContext *C, wmOperator *op) { SpaceText *st= CTX_wm_space_text(C); Text *text= st->text; - SetCursor *scu= op->customdata; + SetSelection *ssel= op->customdata; int linep2, charp2; char *buffer; @@ -2506,44 +2534,29 @@ static void set_cursor_exit(bContext *C, wmOperator *op) linep2= txt_get_span(st->text->lines.first, st->text->sell); charp2= st->text->selc; - if(scu->sell!=linep2 || scu->selc!=charp2) - txt_undo_add_toop(st->text, UNDO_STO, scu->sell, scu->selc, linep2, charp2); + if(ssel->sell!=linep2 || ssel->selc!=charp2) + txt_undo_add_toop(st->text, UNDO_STO, ssel->sell, ssel->selc, linep2, charp2); text_update_cursor_moved(C); WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, st->text); - MEM_freeN(scu); + MEM_freeN(ssel); } -static int set_cursor_invoke(bContext *C, wmOperator *op, wmEvent *event) +static int set_selection_invoke(bContext *C, wmOperator *op, wmEvent *event) { SpaceText *st= CTX_wm_space_text(C); - ARegion *ar= CTX_wm_region(C); - SetCursor *scu; - - op->customdata= MEM_callocN(sizeof(SetCursor), "SetCursor"); - scu= op->customdata; - scu->selecting= RNA_boolean_get(op->ptr, "select"); + SetSelection *ssel; - scu->old[0]= event->mval[0]; - scu->old[1]= event->mval[1]; + op->customdata= MEM_callocN(sizeof(SetSelection), "SetCursor"); + ssel= op->customdata; + ssel->selecting= RNA_boolean_get(op->ptr, "select"); - if(!scu->selecting) { - int curl= txt_get_span(st->text->lines.first, st->text->curl); - int curc= st->text->curc; - int linep2, charp2; - - set_cursor_to_pos(st, ar, event->mval[0], event->mval[1], 0); - - linep2= txt_get_span(st->text->lines.first, st->text->curl); - charp2= st->text->selc; - - if(curl!=linep2 || curc!=charp2) - txt_undo_add_toop(st->text, UNDO_CTO, curl, curc, linep2, charp2); - } + ssel->old[0]= event->mval[0]; + ssel->old[1]= event->mval[1]; - scu->sell= txt_get_span(st->text->lines.first, st->text->sell); - scu->selc= st->text->selc; + ssel->sell= txt_get_span(st->text->lines.first, st->text->sell); + ssel->selc= st->text->selc; WM_event_add_modal_handler(C, op); @@ -2552,7 +2565,7 @@ static int set_cursor_invoke(bContext *C, wmOperator *op, wmEvent *event) return OPERATOR_RUNNING_MODAL; } -static int set_cursor_modal(bContext *C, wmOperator *op, wmEvent *event) +static int set_selection_modal(bContext *C, wmOperator *op, wmEvent *event) { switch(event->type) { case LEFTMOUSE: @@ -2568,27 +2581,81 @@ static int set_cursor_modal(bContext *C, wmOperator *op, wmEvent *event) return OPERATOR_RUNNING_MODAL; } -static int set_cursor_cancel(bContext *C, wmOperator *op) +static int set_selection_cancel(bContext *C, wmOperator *op) { set_cursor_exit(C, op); return OPERATOR_FINISHED; } +void TEXT_OT_selection_set(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Set Selection"; + ot->idname= "TEXT_OT_selection_set"; + ot->description= "Set cursor selection"; + + /* api callbacks */ + ot->invoke= set_selection_invoke; + ot->modal= set_selection_modal; + ot->cancel= set_selection_cancel; + ot->poll= text_region_edit_poll; + + /* properties */ + RNA_def_boolean(ot->srna, "select", 0, "Select", "Set selection end rather than cursor."); +} + +/******************* set cursor operator **********************/ + +static int set_cursor_exec(bContext *C, wmOperator *op) +{ + SpaceText *st= CTX_wm_space_text(C); + Text *text= st->text; + ARegion *ar= CTX_wm_region(C); + int x= RNA_int_get(op->ptr, "x"); + int y= RNA_int_get(op->ptr, "y"); + int oldl, oldc; + + oldl= txt_get_span(text->lines.first, text->curl); + oldc= text->curc; + + set_cursor_to_pos(st, ar, x, y, 0); + + txt_undo_add_toop(text, UNDO_CTO, oldl, oldc, txt_get_span(text->lines.first, text->curl), text->curc); + + text_update_cursor_moved(C); + WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, st->text); + + return OPERATOR_PASS_THROUGH; +} + +static int set_cursor_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + SpaceText *st= CTX_wm_space_text(C); + + if(event->mval[0]>=st->txtbar.xmin) + return OPERATOR_PASS_THROUGH; + + RNA_int_set(op->ptr, "x", event->mval[0]); + RNA_int_set(op->ptr, "y", event->mval[1]); + + return set_cursor_exec(C, op); +} + void TEXT_OT_cursor_set(wmOperatorType *ot) { /* identifiers */ ot->name= "Set Cursor"; ot->idname= "TEXT_OT_cursor_set"; - ot->description= "Set cursor selection"; - + ot->description= "Set cursor position"; + /* api callbacks */ ot->invoke= set_cursor_invoke; - ot->modal= set_cursor_modal; - ot->cancel= set_cursor_cancel; + ot->exec= set_cursor_exec; ot->poll= text_region_edit_poll; /* properties */ - RNA_def_boolean(ot->srna, "select", 0, "Select", "Set selection end rather than cursor."); + RNA_def_boolean(ot->srna, "x", 0, "X", "X-coordinate to set cursor to."); + RNA_def_boolean(ot->srna, "y", 0, "Y", "X-coordinate to set cursor to."); } /******************* line number operator **********************/ diff --git a/source/blender/editors/space_text/text_python.c b/source/blender/editors/space_text/text_python.c index e6f201e4147..a0d3264aa0d 100644 --- a/source/blender/editors/space_text/text_python.c +++ b/source/blender/editors/space_text/text_python.c @@ -187,7 +187,7 @@ static void confirm_suggestion(Text *text, int skipleft) // XXX static int doc_scroll= 0; -short do_texttools(SpaceText *st, char ascii, unsigned short evnt, short val) +static short do_texttools(SpaceText *st, char ascii, unsigned short evnt, short val) { ARegion *ar= NULL; // XXX int qual= 0; // XXX @@ -370,7 +370,7 @@ short do_texttools(SpaceText *st, char ascii, unsigned short evnt, short val) ; // XXX redraw_alltext(); #endif -short do_textmarkers(SpaceText *st, char ascii, unsigned short evnt, short val) +static short do_textmarkers(SpaceText *st, char ascii, unsigned short evnt, short val) { Text *text; TextMarker *marker, *mrk, *nxt; diff --git a/source/blender/editors/space_time/space_time.c b/source/blender/editors/space_time/space_time.c index f05cb860d6f..f879b2b996d 100644 --- a/source/blender/editors/space_time/space_time.c +++ b/source/blender/editors/space_time/space_time.c @@ -56,6 +56,7 @@ #include "UI_resources.h" #include "UI_view2d.h" +#include "ED_space_api.h" #include "ED_markers.h" #include "time_intern.h" diff --git a/source/blender/editors/space_time/time_ops.c b/source/blender/editors/space_time/time_ops.c index 5bc59f06a19..167eabcdd08 100644 --- a/source/blender/editors/space_time/time_ops.c +++ b/source/blender/editors/space_time/time_ops.c @@ -41,6 +41,8 @@ #include "WM_api.h" #include "WM_types.h" +#include "time_intern.h" + /* ****************** Start/End Frame Operators *******************************/ static int time_set_sfra_exec (bContext *C, wmOperator *UNUSED(op)) @@ -67,7 +69,7 @@ static int time_set_sfra_exec (bContext *C, wmOperator *UNUSED(op)) return OPERATOR_FINISHED; } -void TIME_OT_start_frame_set (wmOperatorType *ot) +static void TIME_OT_start_frame_set (wmOperatorType *ot) { /* identifiers */ ot->name= "Set Start Frame"; @@ -107,7 +109,7 @@ static int time_set_efra_exec (bContext *C, wmOperator *UNUSED(op)) return OPERATOR_FINISHED; } -void TIME_OT_end_frame_set (wmOperatorType *ot) +static void TIME_OT_end_frame_set (wmOperatorType *ot) { /* identifiers */ ot->name= "Set End Frame"; @@ -149,7 +151,7 @@ static int time_view_all_exec (bContext *C, wmOperator *UNUSED(op)) return OPERATOR_FINISHED; } -void TIME_OT_view_all (wmOperatorType *ot) +static void TIME_OT_view_all (wmOperatorType *ot) { /* identifiers */ ot->name= "View All"; diff --git a/source/blender/editors/space_userpref/space_userpref.c b/source/blender/editors/space_userpref/space_userpref.c index 6f155fc3b99..486713ab890 100644 --- a/source/blender/editors/space_userpref/space_userpref.c +++ b/source/blender/editors/space_userpref/space_userpref.c @@ -39,6 +39,7 @@ #include "BKE_screen.h" #include "ED_screen.h" +#include "ED_space_api.h" #include "WM_api.h" #include "WM_types.h" @@ -107,11 +108,11 @@ static void userpref_main_area_draw(const bContext *C, ARegion *ar) ED_region_panels(C, ar, 1, NULL, -1); } -void userpref_operatortypes(void) +static void userpref_operatortypes(void) { } -void userpref_keymap(struct wmKeyConfig *UNUSED(keyconf)) +static void userpref_keymap(struct wmKeyConfig *UNUSED(keyconf)) { } diff --git a/source/blender/editors/space_view3d/drawmesh.c b/source/blender/editors/space_view3d/drawmesh.c index 5c2adc10d85..59d9d1bb0b4 100644 --- a/source/blender/editors/space_view3d/drawmesh.c +++ b/source/blender/editors/space_view3d/drawmesh.c @@ -562,7 +562,7 @@ static int wpaint__setSolidDrawOptions(void *userData, int index, int *drawSmoot return 1; } -void draw_mesh_text(Scene *scene, Object *ob, int glsl) +static void draw_mesh_text(Scene *scene, Object *ob, int glsl) { Mesh *me = ob->data; DerivedMesh *ddm; diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index c90c301b6d1..df431f06ef6 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -5306,7 +5306,8 @@ static void draw_box(float vec[8][3]) } /* uses boundbox, function used by Ketsji */ -void get_local_bounds(Object *ob, float *center, float *size) +#if 0 +static void get_local_bounds(Object *ob, float *center, float *size) { BoundBox *bb= object_get_boundbox(ob); @@ -5324,8 +5325,7 @@ void get_local_bounds(Object *ob, float *center, float *size) center[2]= (bb->vec[0][2] + bb->vec[1][2])/2.0; } } - - +#endif static void draw_bb_quadric(BoundBox *bb, short type) { diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c index f7ccebda6ae..ef2fa693cb1 100644 --- a/source/blender/editors/space_view3d/space_view3d.c +++ b/source/blender/editors/space_view3d/space_view3d.c @@ -951,6 +951,11 @@ static void space_view3d_listener(struct ScrArea *sa, struct wmNotifier *wmn) #endif } +const char *view3d_context_dir[] = { + "selected_objects", "selected_bases", "selected_editable_objects", + "selected_editable_bases", "visible_objects", "visible_bases", "selectable_objects", "selectable_bases", + "active_base", "active_object", NULL}; + static int view3d_context(const bContext *C, const char *member, bContextDataResult *result) { View3D *v3d= CTX_wm_view3d(C); @@ -959,12 +964,7 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes unsigned int lay = v3d ? v3d->lay:scene->lay; /* fallback to the scene layer, allows duplicate and other oject operators to run outside the 3d view */ if(CTX_data_dir(member)) { - static const char *dir[] = { - "selected_objects", "selected_bases", "selected_editable_objects", - "selected_editable_bases", "visible_objects", "visible_bases", "selectable_objects", "selectable_bases", - "active_base", "active_object", NULL}; - - CTX_data_dir_set(result, dir); + CTX_data_dir_set(result, view3d_context_dir); } else if(CTX_data_equals(member, "selected_objects") || CTX_data_equals(member, "selected_bases")) { int selected_objects= CTX_data_equals(member, "selected_objects"); diff --git a/source/blender/editors/space_view3d/view3d_buttons.c b/source/blender/editors/space_view3d/view3d_buttons.c index cefe0254ae4..e880e4c3610 100644 --- a/source/blender/editors/space_view3d/view3d_buttons.c +++ b/source/blender/editors/space_view3d/view3d_buttons.c @@ -925,6 +925,7 @@ static void v3d_posearmature_buts(uiLayout *layout, Object *ob) } /* assumes armature editmode */ +#if 0 static void validate_editbonebutton_cb(bContext *C, void *bonev, void *namev) { EditBone *eBone= bonev; @@ -939,6 +940,7 @@ static void validate_editbonebutton_cb(bContext *C, void *bonev, void *namev) ED_armature_bone_rename(CTX_data_edit_object(C)->data, oldname, newname); // editarmature.c WM_event_add_notifier(C, NC_OBJECT|ND_BONE_SELECT, CTX_data_edit_object(C)); // XXX fix } +#endif static void v3d_editarmature_buts(uiLayout *layout, Object *ob) { @@ -1199,16 +1201,6 @@ static void do_view3d_region_buttons(bContext *C, void *UNUSED(index), int event WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, ob); } -static void removeTransformOrientation_func(bContext *C, void *target, void *UNUSED(arg)) -{ - BIF_removeTransformOrientation(C, (TransformOrientation *) target); -} - -static void selectTransformOrientation_func(bContext *C, void *target, void *UNUSED(arg)) -{ - BIF_selectTransformOrientation(C, (TransformOrientation *) target); -} - static void view3d_panel_object(const bContext *C, Panel *pa) { uiBlock *block; diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index 58adb9aad43..006605b08f9 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -917,6 +917,7 @@ void view3d_calc_camera_border(Scene *scene, ARegion *ar, RegionView3D *rv3d, Vi } } +/* sets the view to 1:1 camera/render-pixel */ static void view3d_set_1_to_1_viewborder(Scene *scene, ARegion *ar) { RegionView3D *rv3d= ar->regiondata; diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 76bd590bd3c..7842707d7e8 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -1879,7 +1879,7 @@ static void axis_set_view(bContext *C, float q1, float q2, float q3, float q4, s float twmat[3][3]; /* same as transform manipulator when normal is set */ - ED_getTransformOrientationMatrix(C, twmat, TRUE); + ED_getTransformOrientationMatrix(C, twmat, FALSE); mat3_to_quat( obact_quat,twmat); invert_qt(obact_quat); @@ -2776,7 +2776,7 @@ int view_autodist_depth_segment(struct ARegion *ar, short mval_sta[2], short mva // speed and os, i changed the scaling values, but // those are still not ok - +#if 0 static float ndof_axis_scale[6] = { +0.01, // Tx +0.01, // Tz @@ -2799,7 +2799,6 @@ static void filterNDOFvalues(float *sbval) sbval[i]=0.0; } -#if 0 // statics for controlling rv3d->dist corrections. // viewmoveNDOF zeros and adjusts rv3d->ofs. // viewmove restores based on dz_flag state. diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c index 2ee4f7a9e55..2656127d73c 100644 --- a/source/blender/editors/space_view3d/view3d_header.c +++ b/source/blender/editors/space_view3d/view3d_header.c @@ -139,10 +139,11 @@ static void handle_view3d_lock(bContext *C) static int view3d_layers_exec(bContext *C, wmOperator *op) { - Main *bmain= CTX_data_main(C); Scene *scene= CTX_data_scene(C); ScrArea *sa= CTX_wm_area(C); View3D *v3d= sa->spacedata.first; + Base *base; + int oldlay= v3d->lay; int nr= RNA_int_get(op->ptr, "nr"); int toggle= RNA_boolean_get(op->ptr, "toggle"); @@ -200,8 +201,14 @@ static int view3d_layers_exec(bContext *C, wmOperator *op) if(v3d->scenelock) handle_view3d_lock(C); - /* new layers might need unflushed events events */ - DAG_scene_update_flags(bmain, scene, v3d->lay, FALSE); /* tags all that moves and flushes */ + /* XXX new layers might need updates, there is no provision yet to detect if that's needed */ + oldlay= ~oldlay & v3d->lay; + for (base= scene->base.first; base; base= base->next) { + if(base->lay & oldlay) + base->object->recalc= OB_RECALC_OB|OB_RECALC_DATA; + if(base->lay & oldlay) + printf("recalc %s\n", base->object->id.name+2); + } ED_area_tag_redraw(sa); diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h index 0f1fe2fba07..b7efa7fced7 100644 --- a/source/blender/editors/space_view3d/view3d_intern.h +++ b/source/blender/editors/space_view3d/view3d_intern.h @@ -187,6 +187,8 @@ void VIEW3D_OT_snap_cursor_to_active(struct wmOperatorType *ot); ARegion *view3d_has_buttons_region(ScrArea *sa); ARegion *view3d_has_tools_region(ScrArea *sa); +extern const char *view3d_context_dir[]; /* doc access */ + /* draw_volume.c */ void draw_volume(struct ARegion *ar, struct GPUTexture *tex, float *min, float *max, int res[3], float dx, struct GPUTexture *tex_shadow); diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index e95361c0d91..0d5b79260e8 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -1379,12 +1379,14 @@ static void drawTransformView(const struct bContext *C, struct ARegion *UNUSED(a drawSnapping(C, t); } +#if 0 static void drawTransformPixel(const struct bContext *UNUSED(C), struct ARegion *UNUSED(ar), void *UNUSED(arg)) { // TransInfo *t = arg; // // drawHelpline(C, t->mval[0], t->mval[1], t); } +#endif void saveTransform(bContext *C, TransInfo *t, wmOperator *op) { @@ -2202,7 +2204,7 @@ static void constraintSizeLim(TransInfo *t, TransData *td) /* ************************** WARP *************************** */ -void postInputWarp(TransInfo *t, float values[3]) +static void postInputWarp(TransInfo *t, float values[3]) { mul_v3_fl(values, (float)(M_PI * 2)); @@ -2371,7 +2373,7 @@ int Warp(TransInfo *t, short UNUSED(mval[2])) /* ************************** SHEAR *************************** */ -void postInputShear(TransInfo *UNUSED(t), float values[3]) +static void postInputShear(TransInfo *UNUSED(t), float values[3]) { mul_v3_fl(values, 0.05f); } @@ -2857,7 +2859,7 @@ int ToSphere(TransInfo *t, short UNUSED(mval[2])) /* ************************** ROTATION *************************** */ -void postInputRotation(TransInfo *t, float values[3]) +static void postInputRotation(TransInfo *t, float values[3]) { if ((t->con.mode & CON_APPLY) && t->con.applyRot) { t->con.applyRot(t, NULL, t->axis, values); @@ -5890,9 +5892,9 @@ void BIF_TransformSetUndo(char *UNUSED(str)) } -void NDofTransform(void) -{ #if 0 // TRANSFORM_FIX_ME +static void NDofTransform(void) +{ float fval[7]; float maxval = 50.0f; // also serves as threshold int axis = -1; @@ -5937,5 +5939,5 @@ void NDofTransform(void) initTransform(mode, CTX_NDOF); Transform(); } -#endif } +#endif diff --git a/source/blender/editors/transform/transform_constraints.c b/source/blender/editors/transform/transform_constraints.c index d5700db8c57..23899398921 100644 --- a/source/blender/editors/transform/transform_constraints.c +++ b/source/blender/editors/transform/transform_constraints.c @@ -69,7 +69,7 @@ static void drawObjectConstraint(TransInfo *t); /* ************************** CONSTRAINTS ************************* */ -void constraintAutoValues(TransInfo *t, float vec[3]) +static void constraintAutoValues(TransInfo *t, float vec[3]) { int mode = t->con.mode; if (mode & CON_APPLY) diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index bbadce5369d..dbed27e95a1 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -1359,7 +1359,7 @@ static void calc_distanceCurveVerts(TransData *head, TransData *tail) { } /* Utility function for getting the handle data from bezier's */ -TransDataCurveHandleFlags *initTransDataCurveHandles(TransData *td, struct BezTriple *bezt) { +static TransDataCurveHandleFlags *initTransDataCurveHandles(TransData *td, struct BezTriple *bezt) { TransDataCurveHandleFlags *hdata; td->flag |= TD_BEZTRIPLE; hdata = td->hdata = MEM_mallocN(sizeof(TransDataCurveHandleFlags), "CuHandle Data"); @@ -1941,7 +1941,8 @@ static void VertsToTransData(TransInfo *t, TransData *td, EditMesh *em, EditVert } } -void createTransBMeshVerts(TransInfo *t, BME_Mesh *bm, BME_TransData_Head *td) { +#if 0 +static void createTransBMeshVerts(TransInfo *t, BME_Mesh *bm, BME_TransData_Head *td) { BME_Vert *v; BME_TransData *vtd; TransData *tob; @@ -1965,6 +1966,7 @@ void createTransBMeshVerts(TransInfo *t, BME_Mesh *bm, BME_TransData_Head *td) { * (i.e. we can't depend on td->len to determine the number of actual elements) */ t->total = i; } +#endif static void createTransEditVerts(bContext *C, TransInfo *t) { @@ -5106,7 +5108,7 @@ static void NodeToTransData(TransData *td, TransData2D *td2d, bNode *node) unit_m3(td->smtx); } -void createTransNodeData(bContext *C, TransInfo *t) +static void createTransNodeData(bContext *C, TransInfo *t) { TransData *td; TransData2D *td2d; diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index 85a7526b7b4..8f7c1001fe8 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -1318,7 +1318,7 @@ void calculateCenterCursor2D(TransInfo *t) calculateCenter2D(t); } -void calculateCenterCursorGraph2D(TransInfo *t) +static void calculateCenterCursorGraph2D(TransInfo *t) { SpaceIpo *sipo= (SpaceIpo *)t->sa->spacedata.first; Scene *scene= t->scene; diff --git a/source/blender/editors/transform/transform_input.c b/source/blender/editors/transform/transform_input.c index a06e5ab21e6..6a9f89362f1 100644 --- a/source/blender/editors/transform/transform_input.c +++ b/source/blender/editors/transform/transform_input.c @@ -38,7 +38,7 @@ /* ************************** INPUT FROM MOUSE *************************** */ -void InputVector(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) +static void InputVector(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) { float vec[3], dvec[3]; if(mi->precision) @@ -56,7 +56,7 @@ void InputVector(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) } -void InputSpring(TransInfo *UNUSED(t), MouseInput *mi, short mval[2], float output[3]) +static void InputSpring(TransInfo *UNUSED(t), MouseInput *mi, short mval[2], float output[3]) { float ratio, precise_ratio, dx, dy; if(mi->precision) @@ -82,7 +82,7 @@ void InputSpring(TransInfo *UNUSED(t), MouseInput *mi, short mval[2], float outp output[0] = ratio; } -void InputSpringFlip(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) +static void InputSpringFlip(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) { InputSpring(t, mi, mval, output); @@ -94,7 +94,7 @@ void InputSpringFlip(TransInfo *t, MouseInput *mi, short mval[2], float output[3 } } -void InputTrackBall(TransInfo *UNUSED(t), MouseInput *mi, short mval[2], float output[3]) +static void InputTrackBall(TransInfo *UNUSED(t), MouseInput *mi, short mval[2], float output[3]) { if(mi->precision) @@ -112,7 +112,7 @@ void InputTrackBall(TransInfo *UNUSED(t), MouseInput *mi, short mval[2], float o output[1] *= mi->factor; } -void InputHorizontalRatio(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) { +static void InputHorizontalRatio(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) { float x, pad; pad = t->ar->winx / 10; @@ -129,7 +129,7 @@ void InputHorizontalRatio(TransInfo *t, MouseInput *mi, short mval[2], float out output[0] = (x - pad) / (t->ar->winx - 2 * pad); } -void InputHorizontalAbsolute(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) { +static void InputHorizontalAbsolute(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) { float vec[3]; InputVector(t, mi, mval, vec); @@ -138,7 +138,7 @@ void InputHorizontalAbsolute(TransInfo *t, MouseInput *mi, short mval[2], float output[0] = dot_v3v3(t->viewinv[0], vec) * 2.0f; } -void InputVerticalRatio(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) { +static void InputVerticalRatio(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) { float y, pad; pad = t->ar->winy / 10; @@ -154,7 +154,7 @@ void InputVerticalRatio(TransInfo *t, MouseInput *mi, short mval[2], float outpu output[0] = (y - pad) / (t->ar->winy - 2 * pad); } -void InputVerticalAbsolute(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) { +static void InputVerticalAbsolute(TransInfo *t, MouseInput *mi, short mval[2], float output[3]) { float vec[3]; InputVector(t, mi, mval, vec); @@ -179,7 +179,7 @@ void setCustomPoints(TransInfo *UNUSED(t), MouseInput *mi, short start[2], short data[3] = end[1]; } -void InputCustomRatio(TransInfo *UNUSED(t), MouseInput *mi, short mval[2], float output[3]) +static void InputCustomRatio(TransInfo *UNUSED(t), MouseInput *mi, short mval[2], float output[3]) { float length; float distance; @@ -212,7 +212,7 @@ void InputCustomRatio(TransInfo *UNUSED(t), MouseInput *mi, short mval[2], float } } -void InputAngle(TransInfo *UNUSED(t), MouseInput *mi, short mval[2], float output[3]) +static void InputAngle(TransInfo *UNUSED(t), MouseInput *mi, short mval[2], float output[3]) { double dx2 = mval[0] - mi->center[0]; double dy2 = mval[1] - mi->center[1]; diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c index d69ba22585b..49080b86e87 100644 --- a/source/blender/editors/transform/transform_manipulator.c +++ b/source/blender/editors/transform/transform_manipulator.c @@ -546,7 +546,7 @@ int calc_manipulator_stats(const bContext *C) } /* don't draw axis perpendicular to the view */ -void test_manipulator_axis(const bContext *C) +static void test_manipulator_axis(const bContext *C) { RegionView3D *rv3d= CTX_wm_region_view3d(C); float angle; diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c index 82cec1eec42..5c42a59ac69 100644 --- a/source/blender/editors/transform/transform_ops.c +++ b/source/blender/editors/transform/transform_ops.c @@ -54,20 +54,20 @@ typedef struct TransformModeItem static float VecOne[3] = {1, 1, 1}; -char OP_TRANSLATION[] = "TRANSFORM_OT_translate"; -char OP_ROTATION[] = "TRANSFORM_OT_rotate"; -char OP_TOSPHERE[] = "TRANSFORM_OT_tosphere"; -char OP_RESIZE[] = "TRANSFORM_OT_resize"; -char OP_SHEAR[] = "TRANSFORM_OT_shear"; -char OP_WARP[] = "TRANSFORM_OT_warp"; -char OP_SHRINK_FATTEN[] = "TRANSFORM_OT_shrink_fatten"; -char OP_PUSH_PULL[] = "TRANSFORM_OT_push_pull"; -char OP_TILT[] = "TRANSFORM_OT_tilt"; -char OP_TRACKBALL[] = "TRANSFORM_OT_trackball"; -char OP_MIRROR[] = "TRANSFORM_OT_mirror"; -char OP_EDGE_SLIDE[] = "TRANSFORM_OT_edge_slide"; -char OP_EDGE_CREASE[] = "TRANSFORM_OT_edge_crease"; -char OP_SEQ_SLIDE[] = "TRANSFORM_OT_seq_slide"; +static char OP_TRANSLATION[] = "TRANSFORM_OT_translate"; +static char OP_ROTATION[] = "TRANSFORM_OT_rotate"; +static char OP_TOSPHERE[] = "TRANSFORM_OT_tosphere"; +static char OP_RESIZE[] = "TRANSFORM_OT_resize"; +static char OP_SHEAR[] = "TRANSFORM_OT_shear"; +static char OP_WARP[] = "TRANSFORM_OT_warp"; +static char OP_SHRINK_FATTEN[] = "TRANSFORM_OT_shrink_fatten"; +static char OP_PUSH_PULL[] = "TRANSFORM_OT_push_pull"; +static char OP_TILT[] = "TRANSFORM_OT_tilt"; +static char OP_TRACKBALL[] = "TRANSFORM_OT_trackball"; +static char OP_MIRROR[] = "TRANSFORM_OT_mirror"; +static char OP_EDGE_SLIDE[] = "TRANSFORM_OT_edge_slide"; +static char OP_EDGE_CREASE[] = "TRANSFORM_OT_edge_crease"; +static char OP_SEQ_SLIDE[] = "TRANSFORM_OT_seq_slide"; void TRANSFORM_OT_translate(struct wmOperatorType *ot); void TRANSFORM_OT_rotate(struct wmOperatorType *ot); @@ -84,7 +84,7 @@ void TRANSFORM_OT_edge_slide(struct wmOperatorType *ot); void TRANSFORM_OT_edge_crease(struct wmOperatorType *ot); void TRANSFORM_OT_seq_slide(struct wmOperatorType *ot); -TransformModeItem transform_modes[] = +static TransformModeItem transform_modes[] = { {OP_TRANSLATION, TFM_TRANSLATION, TRANSFORM_OT_translate}, {OP_ROTATION, TFM_ROTATION, TRANSFORM_OT_rotate}, @@ -114,7 +114,7 @@ static int snap_type_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void TRANSFORM_OT_snap_type(wmOperatorType *ot) +static void TRANSFORM_OT_snap_type(wmOperatorType *ot) { /* identifiers */ ot->name= "Snap Type"; @@ -159,7 +159,7 @@ static int select_orientation_invoke(bContext *C, wmOperator *UNUSED(op), wmEven return OPERATOR_CANCELLED; } -void TRANSFORM_OT_select_orientation(struct wmOperatorType *ot) +static void TRANSFORM_OT_select_orientation(struct wmOperatorType *ot) { PropertyRNA *prop; @@ -214,7 +214,7 @@ static int delete_orientation_poll(bContext *C) return selected_index >= 0; } -void TRANSFORM_OT_delete_orientation(struct wmOperatorType *ot) +static void TRANSFORM_OT_delete_orientation(struct wmOperatorType *ot) { /* identifiers */ ot->name = "Delete Orientation"; @@ -249,7 +249,7 @@ static int create_orientation_invoke(bContext *C, wmOperator *op, wmEvent *UNUSE return create_orientation_exec(C, op); } -void TRANSFORM_OT_create_orientation(struct wmOperatorType *ot) +static void TRANSFORM_OT_create_orientation(struct wmOperatorType *ot) { /* identifiers */ ot->name = "Create Orientation"; diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c index 93403ea5817..ab1cbab9a23 100644 --- a/source/blender/editors/transform/transform_snap.c +++ b/source/blender/editors/transform/transform_snap.c @@ -83,6 +83,8 @@ //#include "blendef.h" /* for selection modes */ +#define USE_BVH_FACE_PROJECT + /********************* PROTOTYPES ***********************/ void setSnappingCallback(TransInfo *t); @@ -356,7 +358,7 @@ int validSnappingNormal(TransInfo *t) return 0; } -void initSnappingMode(TransInfo *t) +static void initSnappingMode(TransInfo *t) { ToolSettings *ts = t->settings; Object *obedit = t->obedit; @@ -1020,8 +1022,8 @@ void TargetSnapClosest(TransInfo *t) } } /*================================================================*/ - -int snapFace(ARegion *ar, float v1co[3], float v2co[3], float v3co[3], float *v4co, float mval[2], float ray_start[3], float ray_start_local[3], float ray_normal_local[3], float obmat[][4], float timat[][3], float *loc, float *no, int *dist, float *depth) +#ifndef USE_BVH_FACE_SNAP +static int snapFace(ARegion *ar, float v1co[3], float v2co[3], float v3co[3], float *v4co, float mval[2], float ray_start[3], float ray_start_local[3], float ray_normal_local[3], float obmat[][4], float timat[][3], float *loc, float *no, int *dist, float *depth) { float lambda; int result; @@ -1071,8 +1073,9 @@ int snapFace(ARegion *ar, float v1co[3], float v2co[3], float v3co[3], float *v4 return retval; } +#endif -int snapEdge(ARegion *ar, float v1co[3], short v1no[3], float v2co[3], short v2no[3], float mval[2], float ray_start[3], float ray_start_local[3], float ray_normal_local[3], float obmat[][4], float timat[][3], float *loc, float *no, int *dist, float *depth) +static int snapEdge(ARegion *ar, float v1co[3], short v1no[3], float v2co[3], short v2no[3], float mval[2], float ray_start[3], float ray_start_local[3], float ray_normal_local[3], float obmat[][4], float timat[][3], float *loc, float *no, int *dist, float *depth) { float intersect[3] = {0, 0, 0}, ray_end[3], dvec[3]; int result; @@ -1157,7 +1160,7 @@ int snapEdge(ARegion *ar, float v1co[3], short v1no[3], float v2co[3], short v2n return retval; } -int snapVertex(ARegion *ar, float vco[3], short vno[3], float mval[2], float ray_start[3], float ray_start_local[3], float ray_normal_local[3], float obmat[][4], float timat[][3], float *loc, float *no, int *dist, float *depth) +static int snapVertex(ARegion *ar, float vco[3], short vno[3], float mval[2], float ray_start[3], float ray_start_local[3], float ray_normal_local[3], float obmat[][4], float timat[][3], float *loc, float *no, int *dist, float *depth) { int retval = 0; float dvec[3]; @@ -1201,7 +1204,7 @@ int snapVertex(ARegion *ar, float vco[3], short vno[3], float mval[2], float ray return retval; } -int snapArmature(short snap_mode, ARegion *ar, Object *ob, bArmature *arm, float obmat[][4], float ray_start[3], float ray_normal[3], float mval[2], float *loc, float *UNUSED(no), int *dist, float *depth) +static int snapArmature(short snap_mode, ARegion *ar, Object *ob, bArmature *arm, float obmat[][4], float ray_start[3], float ray_normal[3], float mval[2], float *loc, float *UNUSED(no), int *dist, float *depth) { float imat[4][4]; float ray_start_local[3], ray_normal_local[3]; @@ -1266,7 +1269,7 @@ int snapArmature(short snap_mode, ARegion *ar, Object *ob, bArmature *arm, float return retval; } -int snapDerivedMesh(short snap_mode, ARegion *ar, Object *ob, DerivedMesh *dm, EditMesh *em, float obmat[][4], float ray_start[3], float ray_normal[3], float mval[2], float *loc, float *no, int *dist, float *depth) +static int snapDerivedMesh(short snap_mode, ARegion *ar, Object *ob, DerivedMesh *dm, EditMesh *em, float obmat[][4], float ray_start[3], float ray_normal[3], float mval[2], float *loc, float *no, int *dist, float *depth) { int retval = 0; int totvert = dm->getNumVerts(dm); @@ -1304,7 +1307,7 @@ int snapDerivedMesh(short snap_mode, ARegion *ar, Object *ob, DerivedMesh *dm, E { case SCE_SNAP_MODE_FACE: { -#if 1 // Added for durian +#ifdef USE_BVH_FACE_SNAP // Added for durian BVHTreeRayHit hit; BVHTreeFromMesh treeData; @@ -1534,7 +1537,7 @@ int snapDerivedMesh(short snap_mode, ARegion *ar, Object *ob, DerivedMesh *dm, E return retval; } -int snapObject(Scene *scene, ARegion *ar, Object *ob, int editobject, float obmat[][4], float ray_start[3], float ray_normal[3], float mval[2], float *loc, float *no, int *dist, float *depth) +static int snapObject(Scene *scene, ARegion *ar, Object *ob, int editobject, float obmat[][4], float ray_start[3], float ray_normal[3], float mval[2], float *loc, float *no, int *dist, float *depth) { ToolSettings *ts= scene->toolsettings; int retval = 0; @@ -1567,7 +1570,7 @@ int snapObject(Scene *scene, ARegion *ar, Object *ob, int editobject, float obma return retval; } -int snapObjects(Scene *scene, View3D *v3d, ARegion *ar, Object *obedit, float mval[2], int *dist, float *loc, float *no, SnapMode mode) { +static int snapObjects(Scene *scene, View3D *v3d, ARegion *ar, Object *obedit, float mval[2], int *dist, float *loc, float *no, SnapMode mode) { Base *base; float depth = FLT_MAX; int retval = 0; @@ -1636,7 +1639,7 @@ int snapObjectsContext(bContext *C, float mval[2], int *dist, float *loc, float /******************** PEELING *********************************/ -int cmpPeel(void *arg1, void *arg2) +static int cmpPeel(void *arg1, void *arg2) { DepthPeel *p1 = arg1; DepthPeel *p2 = arg2; @@ -1654,7 +1657,7 @@ int cmpPeel(void *arg1, void *arg2) return val; } -void removeDoublesPeel(ListBase *depth_peels) +static void removeDoublesPeel(ListBase *depth_peels) { DepthPeel *peel; @@ -1676,7 +1679,7 @@ void removeDoublesPeel(ListBase *depth_peels) } } -void addDepthPeel(ListBase *depth_peels, float depth, float p[3], float no[3], Object *ob) +static void addDepthPeel(ListBase *depth_peels, float depth, float p[3], float no[3], Object *ob) { DepthPeel *peel = MEM_callocN(sizeof(DepthPeel), "DepthPeel"); @@ -1690,7 +1693,7 @@ void addDepthPeel(ListBase *depth_peels, float depth, float p[3], float no[3], O peel->flag = 0; } -int peelDerivedMesh(Object *ob, DerivedMesh *dm, float obmat[][4], float ray_start[3], float ray_normal[3], float UNUSED(mval[2]), ListBase *depth_peels) +static int peelDerivedMesh(Object *ob, DerivedMesh *dm, float obmat[][4], float ray_start[3], float ray_normal[3], float UNUSED(mval[2]), ListBase *depth_peels) { int retval = 0; int totvert = dm->getNumVerts(dm); @@ -1798,7 +1801,7 @@ int peelDerivedMesh(Object *ob, DerivedMesh *dm, float obmat[][4], float ray_sta return retval; } -int peelObjects(Scene *scene, View3D *v3d, ARegion *ar, Object *obedit, ListBase *depth_peels, float mval[2]) +static int peelObjects(Scene *scene, View3D *v3d, ARegion *ar, Object *obedit, ListBase *depth_peels, float mval[2]) { Base *base; int retval = 0; diff --git a/source/blender/editors/util/crazyspace.c b/source/blender/editors/util/crazyspace.c index 8b03f1826e4..20b7c255922 100644 --- a/source/blender/editors/util/crazyspace.c +++ b/source/blender/editors/util/crazyspace.c @@ -43,6 +43,8 @@ #include "BLI_math.h" #include "BLI_editVert.h" +#include "ED_util.h" + #define TAN_MAKE_VEC(a, b, c) a[0]= b[0] + 0.2f*(b[0]-c[0]); a[1]= b[1] + 0.2f*(b[1]-c[1]); a[2]= b[2] + 0.2f*(b[2]-c[2]) static void set_crazy_vertex_quat(float *quat, float *v1, float *v2, float *v3, float *def1, float *def2, float *def3) { @@ -363,7 +365,7 @@ void crazyspace_build_sculpt(Scene *scene, Object *ob, float (**deformmats)[3][3 float (*deformedVerts)[3]= *deformcos; float (*origVerts)[3]= MEM_dupallocN(deformedVerts); float *quats= NULL; - int i; + int i, deformed= 0; ModifierData *md= modifiers_getVirtualModifierList(ob); Mesh *me= (Mesh*)ob->data; @@ -372,8 +374,15 @@ void crazyspace_build_sculpt(Scene *scene, Object *ob, float (**deformmats)[3][3 if(!modifier_isEnabled(scene, md, eModifierMode_Realtime)) continue; - if(mti->type==eModifierTypeType_OnlyDeform) + if(mti->type==eModifierTypeType_OnlyDeform) { + /* skip leading modifiers which have been alredy + handled in sculpt_get_first_deform_matrices */ + if(mti->deformMatrices && !deformed) + continue; + mti->deformVerts(md, ob, NULL, deformedVerts, me->totvert, 0, 0); + deformed= 1; + } } quats= MEM_mallocN(me->totvert*sizeof(float)*4, "crazy quats"); diff --git a/source/blender/editors/util/editmode_undo.c b/source/blender/editors/util/editmode_undo.c index 85f343e3311..767a2adacb2 100644 --- a/source/blender/editors/util/editmode_undo.c +++ b/source/blender/editors/util/editmode_undo.c @@ -46,11 +46,14 @@ #include "BKE_depsgraph.h" #include "BKE_global.h" +#include "ED_util.h" #include "ED_mesh.h" #include "UI_interface.h" #include "UI_resources.h" +#include "util_intern.h" + /* ***************** generic editmode undo system ********************* */ /* @@ -75,7 +78,7 @@ void undo_editmode_menu(void) // history menu /* ********************************************************************* */ /* ****** XXX ***** */ -void error(const char *UNUSED(arg)) {} +static void error(const char *UNUSED(arg)) {} /* ****** XXX ***** */ diff --git a/source/blender/editors/util/undo.c b/source/blender/editors/util/undo.c index 0158719b2fb..a992e33e7d6 100644 --- a/source/blender/editors/util/undo.c +++ b/source/blender/editors/util/undo.c @@ -257,6 +257,7 @@ static int ed_redo_exec(bContext *C, wmOperator *UNUSED(op)) return ed_undo_step(C, -1, NULL); } +#if 0 /* UNUSED */ void ED_undo_menu(bContext *C) { Object *obedit= CTX_data_edit_object(C); @@ -281,6 +282,7 @@ void ED_undo_menu(bContext *C) } } } +#endif /* ********************** */ diff --git a/source/blender/editors/uvedit/uvedit_draw.c b/source/blender/editors/uvedit/uvedit_draw.c index 98c71407631..1cee7a16b98 100644 --- a/source/blender/editors/uvedit/uvedit_draw.c +++ b/source/blender/editors/uvedit/uvedit_draw.c @@ -46,6 +46,7 @@ #include "BIF_gl.h" #include "BIF_glutil.h" +#include "ED_util.h" #include "ED_image.h" #include "ED_mesh.h" #include "ED_uvedit.h" diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c index 0d3e9b94f98..a00a3c59626 100644 --- a/source/blender/editors/uvedit/uvedit_ops.c +++ b/source/blender/editors/uvedit/uvedit_ops.c @@ -403,7 +403,7 @@ int ED_uvedit_minmax(Scene *scene, Image *ima, Object *obedit, float *min, float return sel; } -int uvedit_center(Scene *scene, Image *ima, Object *obedit, float *cent, int mode) +static int uvedit_center(Scene *scene, Image *ima, Object *obedit, float *cent, int mode) { EditMesh *em= BKE_mesh_get_editmesh((Mesh*)obedit->data); EditFace *efa; @@ -1032,7 +1032,7 @@ static int align_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void UV_OT_align(wmOperatorType *ot) +static void UV_OT_align(wmOperatorType *ot) { static EnumPropertyItem axis_items[] = { {'a', "ALIGN_AUTO", 0, "Align Auto", "Automatically choose the axis on which there is most alignment already"}, @@ -1063,7 +1063,7 @@ static int weld_exec(bContext *C, wmOperator *UNUSED(op)) return OPERATOR_FINISHED; } -void UV_OT_weld(wmOperatorType *ot) +static void UV_OT_weld(wmOperatorType *ot) { /* identifiers */ ot->name= "Weld"; @@ -1247,7 +1247,7 @@ static int stitch_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void UV_OT_stitch(wmOperatorType *ot) +static void UV_OT_stitch(wmOperatorType *ot) { /* identifiers */ ot->name= "Stitch"; @@ -1304,7 +1304,7 @@ static int select_inverse_exec(bContext *C, wmOperator *UNUSED(op)) return OPERATOR_FINISHED; } -void UV_OT_select_inverse(wmOperatorType *ot) +static void UV_OT_select_inverse(wmOperatorType *ot) { /* identifiers */ ot->name= "Select Inverse"; @@ -1400,7 +1400,7 @@ static int select_all_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void UV_OT_select_all(wmOperatorType *ot) +static void UV_OT_select_all(wmOperatorType *ot) { /* identifiers */ ot->name= "Select or Deselect All"; @@ -1735,7 +1735,7 @@ static int select_invoke(bContext *C, wmOperator *op, wmEvent *event) return select_exec(C, op); } -void UV_OT_select(wmOperatorType *ot) +static void UV_OT_select(wmOperatorType *ot) { /* identifiers */ ot->name= "Select"; @@ -1784,7 +1784,7 @@ static int select_loop_invoke(bContext *C, wmOperator *op, wmEvent *event) return select_loop_exec(C, op); } -void UV_OT_select_loop(wmOperatorType *ot) +static void UV_OT_select_loop(wmOperatorType *ot) { /* identifiers */ ot->name= "Loop Select"; @@ -1865,7 +1865,7 @@ static int select_linked_exec(bContext *C, wmOperator *op) return select_linked_internal(C, op, NULL, 0); } -void UV_OT_select_linked(wmOperatorType *ot) +static void UV_OT_select_linked(wmOperatorType *ot) { /* identifiers */ ot->name= "Select Linked"; @@ -1892,7 +1892,7 @@ static int select_linked_pick_exec(bContext *C, wmOperator *op) return select_linked_internal(C, op, NULL, 1); } -void UV_OT_select_linked_pick(wmOperatorType *ot) +static void UV_OT_select_linked_pick(wmOperatorType *ot) { /* identifiers */ ot->name= "Select Linked Pick"; @@ -1949,7 +1949,7 @@ static int unlink_selection_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void UV_OT_unlink_selection(wmOperatorType *ot) +static void UV_OT_unlink_selection(wmOperatorType *ot) { /* identifiers */ ot->name= "Unlink Selection"; @@ -2230,7 +2230,7 @@ static int border_select_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } -void UV_OT_select_border(wmOperatorType *ot) +static void UV_OT_select_border(wmOperatorType *ot) { /* identifiers */ ot->name= "Border Select"; @@ -2271,7 +2271,7 @@ static void select_uv_inside_ellipse(Scene *scene, int select, EditFace *efa, MT } } -int circle_select_exec(bContext *C, wmOperator *op) +static int circle_select_exec(bContext *C, wmOperator *op) { SpaceImage *sima= CTX_wm_space_image(C); Scene *scene= CTX_data_scene(C); @@ -2319,7 +2319,7 @@ int circle_select_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void UV_OT_circle_select(wmOperatorType *ot) +static void UV_OT_circle_select(wmOperatorType *ot) { /* identifiers */ ot->name= "Circle Select"; @@ -2389,7 +2389,7 @@ static int snap_cursor_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void UV_OT_snap_cursor(wmOperatorType *ot) +static void UV_OT_snap_cursor(wmOperatorType *ot) { static EnumPropertyItem target_items[] = { {0, "PIXELS", 0, "Pixels", ""}, @@ -2629,7 +2629,7 @@ static int snap_selection_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void UV_OT_snap_selection(wmOperatorType *ot) +static void UV_OT_snap_selection(wmOperatorType *ot) { static EnumPropertyItem target_items[] = { {0, "PIXELS", 0, "Pixels", ""}, @@ -2690,7 +2690,7 @@ static int pin_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void UV_OT_pin(wmOperatorType *ot) +static void UV_OT_pin(wmOperatorType *ot) { /* identifiers */ ot->name= "Pin"; @@ -2736,7 +2736,7 @@ static int select_pinned_exec(bContext *C, wmOperator *UNUSED(op)) return OPERATOR_FINISHED; } -void UV_OT_select_pinned(wmOperatorType *ot) +static void UV_OT_select_pinned(wmOperatorType *ot) { /* identifiers */ ot->name= "Selected Pinned"; @@ -2875,7 +2875,7 @@ static int hide_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } -void UV_OT_hide(wmOperatorType *ot) +static void UV_OT_hide(wmOperatorType *ot) { /* identifiers */ ot->name= "Hide Selected"; @@ -3009,7 +3009,7 @@ static int reveal_exec(bContext *C, wmOperator *UNUSED(op)) return OPERATOR_FINISHED; } -void UV_OT_reveal(wmOperatorType *ot) +static void UV_OT_reveal(wmOperatorType *ot) { /* identifiers */ ot->name= "Reveal Hidden"; @@ -3055,7 +3055,7 @@ static int set_2d_cursor_invoke(bContext *C, wmOperator *op, wmEvent *event) return set_2d_cursor_exec(C, op); } -void UV_OT_cursor_set(wmOperatorType *ot) +static void UV_OT_cursor_set(wmOperatorType *ot) { /* identifiers */ ot->name= "Set 2D Cursor"; @@ -3123,7 +3123,7 @@ static int set_tile_invoke(bContext *C, wmOperator *op, wmEvent *event) return set_tile_exec(C, op); } -void UV_OT_tile_set(wmOperatorType *ot) +static void UV_OT_tile_set(wmOperatorType *ot) { /* identifiers */ ot->name= "Set Tile"; diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c index 09069be6d5f..3b6581b7893 100644 --- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c +++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c @@ -129,7 +129,7 @@ static int ED_uvedit_ensure_uvs(bContext *C, Scene *scene, Object *obedit) /****************** Parametrizer Conversion ***************/ -ParamHandle *construct_param_handle(Scene *scene, EditMesh *em, short implicit, short fill, short sel, short correct_aspect) +static ParamHandle *construct_param_handle(Scene *scene, EditMesh *em, short implicit, short fill, short sel, short correct_aspect) { ParamHandle *handle; EditFace *efa; diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h index 342cc6b72a3..4c6e24cde62 100644 --- a/source/blender/gpu/GPU_buffers.h +++ b/source/blender/gpu/GPU_buffers.h @@ -69,6 +69,8 @@ typedef struct GPUBuffer unsigned int id; /* used with vertex buffer objects */ } GPUBuffer; +/* stores deleted buffers so that new buffers wouldn't have to +be recreated that often. */ typedef struct GPUBufferPool { int size; /* number of allocated buffers stored */ @@ -114,6 +116,7 @@ typedef struct GPUDrawObject } GPUDrawObject; +/* used for GLSL materials */ typedef struct GPUAttrib { int index; @@ -173,6 +176,7 @@ void GPU_buffer_draw_elements( GPUBuffer *elements, unsigned int mode, int start /* called after drawing */ void GPU_buffer_unbind(void); +/* used to check whether to use the old (without buffers) code */ int GPU_buffer_legacy( struct DerivedMesh *dm ); #endif diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c index 53e3ad09a6f..eae727798a0 100644 --- a/source/blender/gpu/intern/gpu_buffers.c +++ b/source/blender/gpu/intern/gpu_buffers.c @@ -59,6 +59,9 @@ #define MAX_GPU_ATTRIB_DATA 32 +/* material number is an 16-bit short and the range of short is from -16383 to 16383 (assume material number is non-negative) */ +#define MAX_MATERIALS 16384 + /* -1 - undefined, 0 - vertex arrays, 1 - VBOs */ static int useVBOs = -1; static GPUBufferPool *globalPool = 0; @@ -270,8 +273,8 @@ GPUDrawObject *GPU_drawobject_new( DerivedMesh *dm ) { GPUDrawObject *object; MFace *mface; - int numverts[32768]; /* material number is an 16-bit short so there's at most 32768 materials */ - int redir[32768]; /* material number is an 16-bit short so there's at most 32768 materials */ + int numverts[MAX_MATERIALS]; + int redir[MAX_MATERIALS]; int *index; int i; int curmat, curverts, numfaces; @@ -288,19 +291,19 @@ GPUDrawObject *GPU_drawobject_new( DerivedMesh *dm ) object->indices[i].next = 0; } /*object->legacy = 1;*/ - memset(numverts,0,sizeof(int)*32768); + memset(numverts,0,sizeof(int)*MAX_MATERIALS); mface = dm->getFaceArray(dm); numfaces= dm->getNumFaces(dm); for( i=0; i < numfaces; i++ ) { if( mface[i].v4 ) - numverts[mface[i].mat_nr+16383] += 6; /* split every quad into two triangles */ + numverts[mface[i].mat_nr] += 6; /* split every quad into two triangles */ else - numverts[mface[i].mat_nr+16383] += 3; + numverts[mface[i].mat_nr] += 3; } - for( i = 0; i < 32768; i++ ) { + for( i = 0; i < MAX_MATERIALS; i++ ) { if( numverts[i] > 0 ) { object->nmaterials++; object->nelements += numverts[i]; @@ -310,9 +313,9 @@ GPUDrawObject *GPU_drawobject_new( DerivedMesh *dm ) index = MEM_mallocN(sizeof(int)*object->nmaterials,"GPU_drawobject_new_index"); curmat = curverts = 0; - for( i = 0; i < 32768; i++ ) { + for( i = 0; i < MAX_MATERIALS; i++ ) { if( numverts[i] > 0 ) { - object->materials[curmat].mat_nr = i-16383; + object->materials[curmat].mat_nr = i; object->materials[curmat].start = curverts; index[curmat] = curverts/3; object->materials[curmat].end = curverts+numverts[i]; @@ -322,7 +325,7 @@ GPUDrawObject *GPU_drawobject_new( DerivedMesh *dm ) } object->faceRemap = MEM_mallocN(sizeof(int)*object->nelements/3,"GPU_drawobject_new_faceRemap"); for( i = 0; i < object->nmaterials; i++ ) { - redir[object->materials[i].mat_nr+16383] = i; /* material number -> material index */ + redir[object->materials[i].mat_nr] = i; /* material number -> material index */ } object->indexMem = MEM_callocN(sizeof(IndexLink)*object->nelements,"GPU_drawobject_new_indexMem"); @@ -340,7 +343,7 @@ GPUDrawObject *GPU_drawobject_new( DerivedMesh *dm ) } for( i=0; i < numfaces; i++ ) { - int curInd = index[redir[mface[i].mat_nr+16383]]; + int curInd = index[redir[mface[i].mat_nr]]; object->faceRemap[curInd] = i; ADDLINK( mface[i].v1, curInd*3 ); ADDLINK( mface[i].v2, curInd*3+1 ); @@ -351,10 +354,10 @@ GPUDrawObject *GPU_drawobject_new( DerivedMesh *dm ) ADDLINK( mface[i].v4, curInd*3+4 ); ADDLINK( mface[i].v1, curInd*3+5 ); - index[redir[mface[i].mat_nr+16383]]+=2; + index[redir[mface[i].mat_nr]]+=2; } else { - index[redir[mface[i].mat_nr+16383]]++; + index[redir[mface[i].mat_nr]]++; } } @@ -773,11 +776,11 @@ void GPU_free_buffers(void *buffers_v) } } -static GPUBuffer *GPU_buffer_setup( DerivedMesh *dm, GPUDrawObject *object, int size, GLenum target, void *user, void (*copy_f)(DerivedMesh *, float *, int *, int *, void *) ) +static GPUBuffer *GPU_buffer_setup( DerivedMesh *dm, GPUDrawObject *object, int vector_size, int size, GLenum target, void *user, void (*copy_f)(DerivedMesh *, float *, int *, int *, void *) ) { GPUBuffer *buffer; float *varray; - int redir[32768]; + int redir[MAX_MATERIALS]; int *index; int i; int success; @@ -798,8 +801,8 @@ static GPUBuffer *GPU_buffer_setup( DerivedMesh *dm, GPUDrawObject *object, int index = MEM_mallocN(sizeof(int)*object->nmaterials,"GPU_buffer_setup"); for( i = 0; i < object->nmaterials; i++ ) { - index[i] = object->materials[i].start*3; - redir[object->materials[i].mat_nr+16383] = i; + index[i] = object->materials[i].start*vector_size; + redir[object->materials[i].mat_nr] = i; } if( useVBOs ) { @@ -870,11 +873,11 @@ static void GPU_buffer_copy_vertex(DerivedMesh *dm, float *varray, int *index, i numfaces= dm->getNumFaces(dm); for( i=0; i < numfaces; i++ ) { - start = index[redir[mface[i].mat_nr+16383]]; + start = index[redir[mface[i].mat_nr]]; if( mface[i].v4 ) - index[redir[mface[i].mat_nr+16383]] += 18; + index[redir[mface[i].mat_nr]] += 18; else - index[redir[mface[i].mat_nr+16383]] += 9; + index[redir[mface[i].mat_nr]] += 9; /* v1 v2 v3 */ VECCOPY(&varray[start],mvert[mface[i].v1].co); @@ -901,7 +904,7 @@ static GPUBuffer *GPU_buffer_vertex( DerivedMesh *dm ) { DEBUG_VBO("GPU_buffer_vertex\n"); - return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*3*(dm->drawObject->nelements+dm->drawObject->nlooseverts), GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_vertex); + return GPU_buffer_setup( dm, dm->drawObject, 3, sizeof(float)*3*(dm->drawObject->nelements+dm->drawObject->nlooseverts), GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_vertex); } static void GPU_buffer_copy_normal(DerivedMesh *dm, float *varray, int *index, int *redir, void *UNUSED(user)) @@ -920,11 +923,11 @@ static void GPU_buffer_copy_normal(DerivedMesh *dm, float *varray, int *index, i for( i=0; i < numfaces; i++ ) { const int smoothnormal = (mface[i].flag & ME_SMOOTH); - start = index[redir[mface[i].mat_nr+16383]]; + start = index[redir[mface[i].mat_nr]]; if( mface[i].v4 ) - index[redir[mface[i].mat_nr+16383]] += 18; + index[redir[mface[i].mat_nr]] += 18; else - index[redir[mface[i].mat_nr+16383]] += 9; + index[redir[mface[i].mat_nr]] += 9; /* v1 v2 v3 */ if(smoothnormal) { @@ -967,7 +970,7 @@ static GPUBuffer *GPU_buffer_normal( DerivedMesh *dm ) { DEBUG_VBO("GPU_buffer_normal\n"); - return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_normal); + return GPU_buffer_setup( dm, dm->drawObject, 3, sizeof(float)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_normal); } static void GPU_buffer_copy_uv(DerivedMesh *dm, float *varray, int *index, int *redir, void *UNUSED(user)) @@ -990,11 +993,11 @@ static void GPU_buffer_copy_uv(DerivedMesh *dm, float *varray, int *index, int * numfaces= dm->getNumFaces(dm); for( i=0; i < numfaces; i++ ) { - start = index[redir[mface[i].mat_nr+16383]]; + start = index[redir[mface[i].mat_nr]]; if( mface[i].v4 ) - index[redir[mface[i].mat_nr+16383]] += 12; + index[redir[mface[i].mat_nr]] += 12; else - index[redir[mface[i].mat_nr+16383]] += 6; + index[redir[mface[i].mat_nr]] += 6; /* v1 v2 v3 */ VECCOPY2D(&varray[start],mtface[i].uv[0]); @@ -1013,8 +1016,8 @@ static void GPU_buffer_copy_uv(DerivedMesh *dm, float *varray, int *index, int * static GPUBuffer *GPU_buffer_uv( DerivedMesh *dm ) { DEBUG_VBO("GPU_buffer_uv\n"); - if( DM_get_face_data_layer(dm, CD_MTFACE) != 0 ) /* was sizeof(float)*2 but caused buffer overrun */ - return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_uv); + if( DM_get_face_data_layer(dm, CD_MTFACE) != 0 ) + return GPU_buffer_setup( dm, dm->drawObject, 2, sizeof(float)*2*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_uv); else return 0; } @@ -1030,11 +1033,11 @@ static void GPU_buffer_copy_color3( DerivedMesh *dm, float *varray_, int *index, numfaces= dm->getNumFaces(dm); for( i=0; i < numfaces; i++ ) { - int start = index[redir[mface[i].mat_nr+16383]]; + int start = index[redir[mface[i].mat_nr]]; if( mface[i].v4 ) - index[redir[mface[i].mat_nr+16383]] += 18; + index[redir[mface[i].mat_nr]] += 18; else - index[redir[mface[i].mat_nr+16383]] += 9; + index[redir[mface[i].mat_nr]] += 9; /* v1 v2 v3 */ VECCOPY(&varray[start],&mcol[i*12]); @@ -1060,11 +1063,11 @@ static void GPU_buffer_copy_color4( DerivedMesh *dm, float *varray_, int *index, numfaces= dm->getNumFaces(dm); for( i=0; i < numfaces; i++ ) { - int start = index[redir[mface[i].mat_nr+16383]]; + int start = index[redir[mface[i].mat_nr]]; if( mface[i].v4 ) - index[redir[mface[i].mat_nr+16383]] += 18; + index[redir[mface[i].mat_nr]] += 18; else - index[redir[mface[i].mat_nr+16383]] += 9; + index[redir[mface[i].mat_nr]] += 9; /* v1 v2 v3 */ VECCOPY(&varray[start],&mcol[i*16]); @@ -1106,7 +1109,7 @@ static GPUBuffer *GPU_buffer_color( DerivedMesh *dm ) colors[i*3+2] = mcol[i].r; } - result = GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, colors, GPU_buffer_copy_color3 ); + result = GPU_buffer_setup( dm, dm->drawObject, 3, sizeof(char)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, colors, GPU_buffer_copy_color3 ); MEM_freeN(colors); return result; @@ -1135,7 +1138,7 @@ static GPUBuffer *GPU_buffer_edge( DerivedMesh *dm ) { DEBUG_VBO("GPU_buffer_edge\n"); - return GPU_buffer_setup( dm, dm->drawObject, sizeof(int)*2*dm->drawObject->nedges, GL_ELEMENT_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_edge); + return GPU_buffer_setup( dm, dm->drawObject, 2, sizeof(int)*2*dm->drawObject->nedges, GL_ELEMENT_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_edge); } static void GPU_buffer_copy_uvedge(DerivedMesh *dm, float *varray, int *UNUSED(index), int *UNUSED(redir), void *UNUSED(user)) @@ -1184,7 +1187,7 @@ static GPUBuffer *GPU_buffer_uvedge( DerivedMesh *dm ) * ...each edge has its own, non-shared coords. * so each tri corner needs minimum of 4 floats, quads used less so here we can over allocate and assume all tris. * */ - return GPU_buffer_setup( dm, dm->drawObject, 4 * sizeof(float) * dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_uvedge); + return GPU_buffer_setup( dm, dm->drawObject, 4, 4 * sizeof(float) * dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, 0, GPU_buffer_copy_uvedge); } @@ -1553,14 +1556,14 @@ void GPU_color3_upload( DerivedMesh *dm, unsigned char *data ) if( dm->drawObject == 0 ) dm->drawObject = GPU_drawobject_new(dm); GPU_buffer_free(dm->drawObject->colors,globalPool); - dm->drawObject->colors = GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, data, GPU_buffer_copy_color3 ); + dm->drawObject->colors = GPU_buffer_setup( dm, dm->drawObject, 3, sizeof(char)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, data, GPU_buffer_copy_color3 ); } void GPU_color4_upload( DerivedMesh *dm, unsigned char *data ) { if( dm->drawObject == 0 ) dm->drawObject = GPU_drawobject_new(dm); GPU_buffer_free(dm->drawObject->colors,globalPool); - dm->drawObject->colors = GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, data, GPU_buffer_copy_color4 ); + dm->drawObject->colors = GPU_buffer_setup( dm, dm->drawObject, 3, sizeof(char)*3*dm->drawObject->nelements, GL_ARRAY_BUFFER_ARB, data, GPU_buffer_copy_color4 ); } void GPU_color_switch( int mode ) diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c index 8fc96b34933..98b09d0e192 100644 --- a/source/blender/gpu/intern/gpu_codegen.c +++ b/source/blender/gpu/intern/gpu_codegen.c @@ -741,11 +741,12 @@ static char *code_generate_vertex(ListBase *nodes) for (input=node->inputs.first; input; input=input->next) if (input->source == GPU_SOURCE_ATTRIB && input->attribfirst) { if(input->attribtype == CD_TANGENT) /* silly exception */ - BLI_dynstr_printf(ds, "\tvar%d = gl_NormalMatrix * ", input->attribid); + { + BLI_dynstr_printf(ds, "\tvar%d.xyz = normalize((gl_ModelViewMatrix * vec4(att%d.xyz, 0)).xyz);\n", input->attribid, input->attribid); + BLI_dynstr_printf(ds, "\tvar%d.w = att%d.w;\n", input->attribid, input->attribid); + } else - BLI_dynstr_printf(ds, "\tvar%d = ", input->attribid); - - BLI_dynstr_printf(ds, "att%d;\n", input->attribid); + BLI_dynstr_printf(ds, "\tvar%d = att%d;\n", input->attribid, input->attribid); } BLI_dynstr_append(ds, "}\n\n"); diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c index cb28d0dbe47..c283e2fd907 100644 --- a/source/blender/gpu/intern/gpu_material.c +++ b/source/blender/gpu/intern/gpu_material.c @@ -886,7 +886,7 @@ static void do_material_tex(GPUShadeInput *shi) MTex *mtex; Tex *tex; GPUNodeLink *texco, *tin, *trgb, *tnor, *tcol, *stencil, *tnorfac; - GPUNodeLink *texco_norm, *texco_orco, *texco_object, *texco_tangent; + GPUNodeLink *texco_norm, *texco_orco, *texco_object; GPUNodeLink *texco_global, *texco_uv = NULL; GPUNodeLink *newnor, *orn; char *lastuvname = NULL; @@ -894,6 +894,7 @@ static void do_material_tex(GPUShadeInput *shi) int tex_nr, rgbnor, talpha; int init_done = 0, iBumpSpacePrev; GPUNodeLink *vNorg, *vNacc, *fPrevMagnitude; + int iFirstTimeNMap=1; GPU_link(mat, "set_value", GPU_uniform(&one), &stencil); @@ -902,7 +903,7 @@ static void do_material_tex(GPUShadeInput *shi) GPU_link(mat, "texco_object", GPU_builtin(GPU_INVERSE_VIEW_MATRIX), GPU_builtin(GPU_INVERSE_OBJECT_MATRIX), GPU_builtin(GPU_VIEW_POSITION), &texco_object); - GPU_link(mat, "texco_tangent", GPU_attribute(CD_TANGENT, ""), &texco_tangent); + //GPU_link(mat, "texco_tangent", GPU_attribute(CD_TANGENT, ""), &texco_tangent); GPU_link(mat, "texco_global", GPU_builtin(GPU_INVERSE_VIEW_MATRIX), GPU_builtin(GPU_VIEW_POSITION), &texco_global); @@ -1037,7 +1038,20 @@ static void do_material_tex(GPUShadeInput *shi) GPU_link(mat, "mtex_negate_texnormal", tnor, &tnor); if(mtex->normapspace == MTEX_NSPACE_TANGENT) - GPU_link(mat, "mtex_nspace_tangent", GPU_attribute(CD_TANGENT, ""), shi->vn, tnor, &newnor); + { + if(iFirstTimeNMap!=0) + { + // use unnormalized normal (this is how we bake it - closer to gamedev) + GPUNodeLink *vNegNorm; + GPU_link(mat, "vec_math_negate", GPU_builtin(GPU_VIEW_NORMAL), &vNegNorm); + GPU_link(mat, "mtex_nspace_tangent", GPU_attribute(CD_TANGENT, ""), vNegNorm, tnor, &newnor); + iFirstTimeNMap = 0; + } + else // otherwise use accumulated perturbations + { + GPU_link(mat, "mtex_nspace_tangent", GPU_attribute(CD_TANGENT, ""), shi->vn, tnor, &newnor); + } + } else newnor = tnor; diff --git a/source/blender/gpu/intern/gpu_shader_material.glsl b/source/blender/gpu/intern/gpu_shader_material.glsl index 6dec6a5e982..47f47746cfa 100644 --- a/source/blender/gpu/intern/gpu_shader_material.glsl +++ b/source/blender/gpu/intern/gpu_shader_material.glsl @@ -746,9 +746,9 @@ void texco_norm(vec3 normal, out vec3 outnormal) outnormal = normalize(normal); } -void texco_tangent(vec3 tangent, out vec3 outtangent) +void texco_tangent(vec4 tangent, out vec3 outtangent) { - outtangent = normalize(tangent); + outtangent = normalize(tangent.xyz); } void texco_global(mat4 viewinvmat, vec3 co, out vec3 global) @@ -1250,12 +1250,11 @@ void mtex_negate_texnormal(vec3 normal, out vec3 outnormal) outnormal = vec3(-normal.x, -normal.y, normal.z); } -void mtex_nspace_tangent(vec3 tangent, vec3 normal, vec3 texnormal, out vec3 outnormal) +void mtex_nspace_tangent(vec4 tangent, vec3 normal, vec3 texnormal, out vec3 outnormal) { - tangent = normalize(tangent); - vec3 B = cross(normal, tangent); + vec3 B = tangent.w * cross(normal, tangent.xyz); - outnormal = texnormal.x*tangent + texnormal.y*B + texnormal.z*normal; + outnormal = texnormal.x*tangent.xyz + texnormal.y*B + texnormal.z*normal; outnormal = normalize(outnormal); } diff --git a/source/blender/gpu/intern/gpu_shader_material.glsl.c b/source/blender/gpu/intern/gpu_shader_material.glsl.c index 742e57fbbff..cd325cbdb9d 100644 --- a/source/blender/gpu/intern/gpu_shader_material.glsl.c +++ b/source/blender/gpu/intern/gpu_shader_material.glsl.c @@ -1,872 +1,871 @@ /* DataToC output of file <gpu_shader_material_glsl> */ -int datatoc_gpu_shader_material_glsl_size= 38724; +int datatoc_gpu_shader_material_glsl_size= 38717; char datatoc_gpu_shader_material_glsl[]= { - 10,102,108,111, - 97,116, 32,101,120,112, 95, 98,108,101,110,100,101,114, 40,102,108,111, 97,116, 32,102, 41, 10,123, 10, 9,114,101,116,117,114, -110, 32,112,111,119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 50, 56, 52, 54, 44, 32,102, 41, 59, 10,125, 10, 10,118,111,105,100, - 32,114,103, 98, 95,116,111, 95,104,115,118, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111, -117,116, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32, 99,109, 97,120, 44, 32, 99,109,105,110, 44, 32,104, 44, 32,115, - 44, 32,118, 44, 32, 99,100,101,108,116, 97, 59, 10, 9,118,101, 99, 51, 32, 99, 59, 10, 10, 9, 99,109, 97,120, 32, 61, 32,109, - 97,120, 40,114,103, 98, 91, 48, 93, 44, 32,109, 97,120, 40,114,103, 98, 91, 49, 93, 44, 32,114,103, 98, 91, 50, 93, 41, 41, 59, - 10, 9, 99,109,105,110, 32, 61, 32,109,105,110, 40,114,103, 98, 91, 48, 93, 44, 32,109,105,110, 40,114,103, 98, 91, 49, 93, 44, - 32,114,103, 98, 91, 50, 93, 41, 41, 59, 10, 9, 99,100,101,108,116, 97, 32, 61, 32, 99,109, 97,120, 45, 99,109,105,110, 59, 10, - 10, 9,118, 32, 61, 32, 99,109, 97,120, 59, 10, 9,105,102, 32, 40, 99,109, 97,120, 33, 61, 48, 46, 48, 41, 10, 9, 9,115, 32, - 61, 32, 99,100,101,108,116, 97, 47, 99,109, 97,120, 59, 10, 9,101,108,115,101, 32,123, 10, 9, 9,115, 32, 61, 32, 48, 46, 48, - 59, 10, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 10, 9,105,102, 32, 40,115, 32, 61, 61, 32, 48, 46, 48, 41, 32, -123, 10, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9, 99, 32, 61, 32, 40,118, -101, 99, 51, 40, 99,109, 97,120, 44, 32, 99,109, 97,120, 44, 32, 99,109, 97,120, 41, 32, 45, 32,114,103, 98, 46,120,121,122, 41, - 47, 99,100,101,108,116, 97, 59, 10, 10, 9, 9,105,102, 32, 40,114,103, 98, 46,120, 61, 61, 99,109, 97,120, 41, 32,104, 32, 61, - 32, 99, 91, 50, 93, 32, 45, 32, 99, 91, 49, 93, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,114,103, 98, 46,121, 61, 61, - 99,109, 97,120, 41, 32,104, 32, 61, 32, 50, 46, 48, 32, 43, 32, 99, 91, 48, 93, 32, 45, 32, 32, 99, 91, 50, 93, 59, 10, 9, 9, -101,108,115,101, 32,104, 32, 61, 32, 52, 46, 48, 32, 43, 32, 99, 91, 49, 93, 32, 45, 32, 99, 91, 48, 93, 59, 10, 10, 9, 9,104, - 32, 47, 61, 32, 54, 46, 48, 59, 10, 10, 9, 9,105,102, 32, 40,104, 60, 48, 46, 48, 41, 10, 9, 9, 9,104, 32, 43, 61, 32, 49, - 46, 48, 59, 10, 9,125, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,104, 44, 32,115, 44, 32,118, 44, 32, -114,103, 98, 46,119, 41, 59, 10,125, 10, 10,118,111,105,100, 32,104,115,118, 95,116,111, 95,114,103, 98, 40,118,101, 99, 52, 32, -104,115,118, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,105, - 44, 32,102, 44, 32,112, 44, 32,113, 44, 32,116, 44, 32,104, 44, 32,115, 44, 32,118, 59, 10, 9,118,101, 99, 51, 32,114,103, 98, - 59, 10, 10, 9,104, 32, 61, 32,104,115,118, 91, 48, 93, 59, 10, 9,115, 32, 61, 32,104,115,118, 91, 49, 93, 59, 10, 9,118, 32, - 61, 32,104,115,118, 91, 50, 93, 59, 10, 10, 9,105,102, 40,115, 61, 61, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 32, 61, - 32,118,101, 99, 51, 40,118, 44, 32,118, 44, 32,118, 41, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, 9,105,102, 40, -104, 61, 61, 49, 46, 48, 41, 10, 9, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9, 10, 9, 9,104, 32, 42, 61, 32, 54, 46, - 48, 59, 10, 9, 9,105, 32, 61, 32,102,108,111,111,114, 40,104, 41, 59, 10, 9, 9,102, 32, 61, 32,104, 32, 45, 32,105, 59, 10, - 9, 9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,102, 44, 32,102, 44, 32,102, 41, 59, 10, 9, 9,112, 32, 61, 32,118, 42, 40, - 49, 46, 48, 45,115, 41, 59, 10, 9, 9,113, 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42,102, 41, 41, 59, 10, 9, 9,116, - 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42, 40, 49, 46, 48, 45,102, 41, 41, 41, 59, 10, 9, 9, 10, 9, 9,105,102, 32, - 40,105, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,116, 44, 32,112, 41, 59, 10, - 9, 9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 49, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40, -113, 44, 32,118, 44, 32,112, 41, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 50, 46, 48, 41, 32,114, -103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,118, 44, 32,116, 41, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,105, - 32, 61, 61, 32, 51, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,113, 44, 32,118, 41, 59, 10, 9, 9, -101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 52, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,116, 44, - 32,112, 44, 32,118, 41, 59, 10, 9, 9,101,108,115,101, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,112, 44, 32, -113, 41, 59, 10, 9,125, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 44, 32,104,115,118, 46, -119, 41, 59, 10,125, 10, 10,102,108,111, 97,116, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40,102, -108,111, 97,116, 32, 99, 41, 10,123, 10, 9,105,102, 40, 99, 32, 60, 32, 48, 46, 48, 52, 48, 52, 53, 41, 10, 9, 9,114,101,116, -117,114,110, 32, 40, 99, 32, 60, 32, 48, 46, 48, 41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 40, 49, 46, 48, 47, 49, 50, 46, - 57, 50, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,114,101,116,117,114,110, 32,112,111,119, 40, 40, 99, 32, 43, 32, 48, 46, 48, - 53, 53, 41, 42, 40, 49, 46, 48, 47, 49, 46, 48, 53, 53, 41, 44, 32, 50, 46, 52, 41, 59, 10,125, 10, 10,102,108,111, 97,116, 32, -108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,102,108,111, 97,116, 32, 99, 41, 10,123, 10, 9,105,102, - 40, 99, 32, 60, 32, 48, 46, 48, 48, 51, 49, 51, 48, 56, 41, 10, 9, 9,114,101,116,117,114,110, 32, 40, 99, 32, 60, 32, 48, 46, - 48, 41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 49, 50, 46, 57, 50, 59, 10, 9,101,108,115,101, 10, 9, 9,114,101,116,117, -114,110, 32, 49, 46, 48, 53, 53, 32, 42, 32,112,111,119, 40, 99, 44, 32, 49, 46, 48, 47, 50, 46, 52, 41, 32, 45, 32, 48, 46, 48, - 53, 53, 59, 10,125, 10, 10,118,111,105,100, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40,118,101, - 99, 52, 32, 99,111,108, 95,102,114,111,109, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 95,116,111, 41, 10,123, 10, - 9, 99,111,108, 95,116,111, 46,114, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111, -108, 95,102,114,111,109, 46,114, 41, 59, 10, 9, 99,111,108, 95,116,111, 46,103, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108, -105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,103, 41, 59, 10, 9, 99,111,108, 95,116,111, 46, 98, 32, - 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46, 98, 41, 59, - 10, 9, 99,111,108, 95,116,111, 46, 97, 32, 61, 32, 99,111,108, 95,102,114,111,109, 46, 97, 59, 10,125, 10, 10,118,111,105,100, - 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 95,102,114,111,109, - 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 95,116,111, 41, 10,123, 10, 9, 99,111,108, 95,116,111, 46,114, 32, 61, - 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,114, 41, 59, 10, - 9, 99,111,108, 95,116,111, 46,103, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111, -108, 95,102,114,111,109, 46,103, 41, 59, 10, 9, 99,111,108, 95,116,111, 46, 98, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, - 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46, 98, 41, 59, 10, 9, 99,111,108, 95,116,111, 46, 97, 32, - 61, 32, 99,111,108, 95,102,114,111,109, 46, 97, 59, 10,125, 10, 10, 35,100,101,102,105,110,101, 32, 77, 95, 80, 73, 32, 51, 46, - 49, 52, 49, 53, 57, 50, 54, 53, 51, 53, 56, 57, 55, 57, 51, 50, 51, 56, 52, 54, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 32, 83, 72, 65, 68, 69, 82, 32, 78, 79, 68, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, - 10, 10,118,111,105,100, 32,118, 99,111,108, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 52, 32, 97,116,116,118, 99, -111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 41, 10,123, 10, 9,118, 99,111,108, 32, 61, 32,118,101, 99, - 52, 40, 97,116,116,118, 99,111,108, 46,120, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,111,108, 46,121, 47, 50, 53, 53, - 46, 48, 44, 32, 97,116,116,118, 99,111,108, 46,122, 47, 50, 53, 53, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111, -105,100, 32,117,118, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,111,117,116, 32, -118,101, 99, 51, 32,117,118, 41, 10,123, 10, 9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, - 45, 32,118,101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32, -103,101,111,109, 40,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,109, 97,116, 52, 32,118,105,101, -119,105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,118,101, 99, 50, 32, 97,116,116,117, -118, 44, 32,118,101, 99, 52, 32, 97,116,116,118, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108, - 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,111, 99, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,105,101,119, 44, - 32,111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 44, 32,111,117,116, - 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 44, 32,111,117,116, - 32,102,108,111, 97,116, 32,102,114,111,110,116, 98, 97, 99,107, 41, 10,123, 10, 9,108,111, 99, 97,108, 32, 61, 32, 99,111, 59, - 10, 9,118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,111, 99, 97,108, 41, 59, 10, 9,103,108,111, 98, - 97,108, 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40,108,111, 99, 97,108, 44, 32, 49, 46, 48, - 41, 41, 46,120,121,122, 59, 10, 9,111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10, 9,117,118, 95, 97,116,116, -114,105, 98,117,116,101, 40, 97,116,116,117,118, 44, 32,117,118, 41, 59, 10, 9,110,111,114,109, 97,108, 32, 61, 32, 45,110,111, -114,109, 97,108,105,122,101, 40,110,111,114, 41, 59, 9, 47, 42, 32, 98,108,101,110,100,101,114, 32,114,101,110,100,101,114, 32, -110,111,114,109, 97,108, 32,105,115, 32,110,101,103, 97,116,101,100, 32, 42, 47, 10, 9,118, 99,111,108, 95, 97,116,116,114,105, - 98,117,116,101, 40, 97,116,116,118, 99,111,108, 44, 32,118, 99,111,108, 41, 59, 10, 9,102,114,111,110,116, 98, 97, 99,107, 32, - 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101, 99, 44, - 32,109, 97,116, 52, 32,109, 97,116, 44, 32,118,101, 99, 51, 32,109,105,110,118,101, 99, 44, 32,118,101, 99, 51, 32,109, 97,120, -118,101, 99, 44, 32,102,108,111, 97,116, 32,100,111,109,105,110, 44, 32,102,108,111, 97,116, 32,100,111,109, 97,120, 44, 32,111, -117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32, 40,109, 97,116, - 32, 42, 32,118,101, 99, 52, 40,118,101, 99, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9,105,102, 40,100,111,109,105, -110, 32, 61, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116,118,101, 99, 32, 61, 32,109, 97,120, 40,111,117,116,118,101, 99, 44, - 32,109,105,110,118,101, 99, 41, 59, 10, 9,105,102, 40,100,111,109, 97,120, 32, 61, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117, -116,118,101, 99, 32, 61, 32,109,105,110, 40,111,117,116,118,101, 99, 44, 32,109, 97,120,118,101, 99, 41, 59, 10,125, 10, 10,118, -111,105,100, 32, 99, 97,109,101,114, 97, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, -118,105,101,119, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,101,112,116,104, 44, 32,111,117,116, 32,102,108, -111, 97,116, 32,111,117,116,100,105,115,116, 41, 10,123, 10, 9,111,117,116,100,101,112,116,104, 32, 61, 32, 97, 98,115, 40, 99, -111, 46,122, 41, 59, 10, 9,111,117,116,100,105,115,116, 32, 61, 32,108,101,110,103,116,104, 40, 99,111, 41, 59, 10, 9,111,117, -116,118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, - 97,116,104, 95, 97,100,100, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32, + 10,102,108,111, 97,116, 32,101,120,112, 95, 98,108,101,110,100,101,114, 40,102,108,111, 97,116, 32,102, 41, 10,123, + 10, 9,114,101,116,117,114,110, 32,112,111,119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 50, 56, 52, 54, 44, 32,102, 41, 59, 10, +125, 10, 10,118,111,105,100, 32,114,103, 98, 95,116,111, 95,104,115,118, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, + 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32, 99,109, 97,120, 44, 32, 99,109,105, +110, 44, 32,104, 44, 32,115, 44, 32,118, 44, 32, 99,100,101,108,116, 97, 59, 10, 9,118,101, 99, 51, 32, 99, 59, 10, 10, 9, 99, +109, 97,120, 32, 61, 32,109, 97,120, 40,114,103, 98, 91, 48, 93, 44, 32,109, 97,120, 40,114,103, 98, 91, 49, 93, 44, 32,114,103, + 98, 91, 50, 93, 41, 41, 59, 10, 9, 99,109,105,110, 32, 61, 32,109,105,110, 40,114,103, 98, 91, 48, 93, 44, 32,109,105,110, 40, +114,103, 98, 91, 49, 93, 44, 32,114,103, 98, 91, 50, 93, 41, 41, 59, 10, 9, 99,100,101,108,116, 97, 32, 61, 32, 99,109, 97,120, + 45, 99,109,105,110, 59, 10, 10, 9,118, 32, 61, 32, 99,109, 97,120, 59, 10, 9,105,102, 32, 40, 99,109, 97,120, 33, 61, 48, 46, + 48, 41, 10, 9, 9,115, 32, 61, 32, 99,100,101,108,116, 97, 47, 99,109, 97,120, 59, 10, 9,101,108,115,101, 32,123, 10, 9, 9, +115, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 10, 9,105,102, 32, 40,115, 32, 61, + 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10, 9,125, 10, 9,101,108,115,101, 32,123, 10, 9, + 9, 99, 32, 61, 32, 40,118,101, 99, 51, 40, 99,109, 97,120, 44, 32, 99,109, 97,120, 44, 32, 99,109, 97,120, 41, 32, 45, 32,114, +103, 98, 46,120,121,122, 41, 47, 99,100,101,108,116, 97, 59, 10, 10, 9, 9,105,102, 32, 40,114,103, 98, 46,120, 61, 61, 99,109, + 97,120, 41, 32,104, 32, 61, 32, 99, 91, 50, 93, 32, 45, 32, 99, 91, 49, 93, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40, +114,103, 98, 46,121, 61, 61, 99,109, 97,120, 41, 32,104, 32, 61, 32, 50, 46, 48, 32, 43, 32, 99, 91, 48, 93, 32, 45, 32, 32, 99, + 91, 50, 93, 59, 10, 9, 9,101,108,115,101, 32,104, 32, 61, 32, 52, 46, 48, 32, 43, 32, 99, 91, 49, 93, 32, 45, 32, 99, 91, 48, + 93, 59, 10, 10, 9, 9,104, 32, 47, 61, 32, 54, 46, 48, 59, 10, 10, 9, 9,105,102, 32, 40,104, 60, 48, 46, 48, 41, 10, 9, 9, + 9,104, 32, 43, 61, 32, 49, 46, 48, 59, 10, 9,125, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,104, 44, + 32,115, 44, 32,118, 44, 32,114,103, 98, 46,119, 41, 59, 10,125, 10, 10,118,111,105,100, 32,104,115,118, 95,116,111, 95,114,103, + 98, 40,118,101, 99, 52, 32,104,115,118, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9, +102,108,111, 97,116, 32,105, 44, 32,102, 44, 32,112, 44, 32,113, 44, 32,116, 44, 32,104, 44, 32,115, 44, 32,118, 59, 10, 9,118, +101, 99, 51, 32,114,103, 98, 59, 10, 10, 9,104, 32, 61, 32,104,115,118, 91, 48, 93, 59, 10, 9,115, 32, 61, 32,104,115,118, 91, + 49, 93, 59, 10, 9,118, 32, 61, 32,104,115,118, 91, 50, 93, 59, 10, 10, 9,105,102, 40,115, 61, 61, 48, 46, 48, 41, 32,123, 10, + 9, 9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,118, 44, 32,118, 41, 59, 10, 9,125, 10, 9,101,108,115,101, 32, +123, 10, 9, 9,105,102, 40,104, 61, 61, 49, 46, 48, 41, 10, 9, 9, 9,104, 32, 61, 32, 48, 46, 48, 59, 10, 9, 9, 10, 9, 9, +104, 32, 42, 61, 32, 54, 46, 48, 59, 10, 9, 9,105, 32, 61, 32,102,108,111,111,114, 40,104, 41, 59, 10, 9, 9,102, 32, 61, 32, +104, 32, 45, 32,105, 59, 10, 9, 9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,102, 44, 32,102, 44, 32,102, 41, 59, 10, 9, 9, +112, 32, 61, 32,118, 42, 40, 49, 46, 48, 45,115, 41, 59, 10, 9, 9,113, 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42,102, + 41, 41, 59, 10, 9, 9,116, 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42, 40, 49, 46, 48, 45,102, 41, 41, 41, 59, 10, 9, + 9, 10, 9, 9,105,102, 32, 40,105, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32, +116, 44, 32,112, 41, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 49, 46, 48, 41, 32,114,103, 98, 32, + 61, 32,118,101, 99, 51, 40,113, 44, 32,118, 44, 32,112, 41, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, + 32, 50, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,118, 44, 32,116, 41, 59, 10, 9, 9,101,108,115, +101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 51, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,113, 44, + 32,118, 41, 59, 10, 9, 9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 52, 46, 48, 41, 32,114,103, 98, 32, 61, 32, +118,101, 99, 51, 40,116, 44, 32,112, 44, 32,118, 41, 59, 10, 9, 9,101,108,115,101, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, + 40,118, 44, 32,112, 44, 32,113, 41, 59, 10, 9,125, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114,103, + 98, 44, 32,104,115,118, 46,119, 41, 59, 10,125, 10, 10,102,108,111, 97,116, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, + 97,114,114,103, 98, 40,102,108,111, 97,116, 32, 99, 41, 10,123, 10, 9,105,102, 40, 99, 32, 60, 32, 48, 46, 48, 52, 48, 52, 53, + 41, 10, 9, 9,114,101,116,117,114,110, 32, 40, 99, 32, 60, 32, 48, 46, 48, 41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 40, + 49, 46, 48, 47, 49, 50, 46, 57, 50, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,114,101,116,117,114,110, 32,112,111,119, 40, 40, + 99, 32, 43, 32, 48, 46, 48, 53, 53, 41, 42, 40, 49, 46, 48, 47, 49, 46, 48, 53, 53, 41, 44, 32, 50, 46, 52, 41, 59, 10,125, 10, + 10,102,108,111, 97,116, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,102,108,111, 97,116, 32, 99, + 41, 10,123, 10, 9,105,102, 40, 99, 32, 60, 32, 48, 46, 48, 48, 51, 49, 51, 48, 56, 41, 10, 9, 9,114,101,116,117,114,110, 32, + 40, 99, 32, 60, 32, 48, 46, 48, 41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 49, 50, 46, 57, 50, 59, 10, 9,101,108,115,101, + 10, 9, 9,114,101,116,117,114,110, 32, 49, 46, 48, 53, 53, 32, 42, 32,112,111,119, 40, 99, 44, 32, 49, 46, 48, 47, 50, 46, 52, + 41, 32, 45, 32, 48, 46, 48, 53, 53, 59, 10,125, 10, 10,118,111,105,100, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97, +114,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 95,102,114,111,109, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, + 95,116,111, 41, 10,123, 10, 9, 99,111,108, 95,116,111, 46,114, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97, +114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,114, 41, 59, 10, 9, 99,111,108, 95,116,111, 46,103, 32, 61, 32,115,114, +103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,103, 41, 59, 10, 9, 99,111, +108, 95,116,111, 46, 98, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102, +114,111,109, 46, 98, 41, 59, 10, 9, 99,111,108, 95,116,111, 46, 97, 32, 61, 32, 99,111,108, 95,102,114,111,109, 46, 97, 59, 10, +125, 10, 10,118,111,105,100, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,118,101, 99, 52, 32, 99, +111,108, 95,102,114,111,109, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 95,116,111, 41, 10,123, 10, 9, 99,111,108, + 95,116,111, 46,114, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114, +111,109, 46,114, 41, 59, 10, 9, 99,111,108, 95,116,111, 46,103, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95, +115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,103, 41, 59, 10, 9, 99,111,108, 95,116,111, 46, 98, 32, 61, 32,108,105, +110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46, 98, 41, 59, 10, 9, 99,111, +108, 95,116,111, 46, 97, 32, 61, 32, 99,111,108, 95,102,114,111,109, 46, 97, 59, 10,125, 10, 10, 35,100,101,102,105,110,101, 32, + 77, 95, 80, 73, 32, 51, 46, 49, 52, 49, 53, 57, 50, 54, 53, 51, 53, 56, 57, 55, 57, 51, 50, 51, 56, 52, 54, 10, 10, 47, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 83, 72, 65, 68, 69, 82, 32, 78, 79, 68, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,118, 99,111,108, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, + 52, 32, 97,116,116,118, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 41, 10,123, 10, 9,118, 99,111, +108, 32, 61, 32,118,101, 99, 52, 40, 97,116,116,118, 99,111,108, 46,120, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,111, +108, 46,121, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,111,108, 46,122, 47, 50, 53, 53, 46, 48, 44, 32, 49, 46, 48, 41, + 59, 10,125, 10, 10,118,111,105,100, 32,117,118, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 50, 32, 97,116,116,117, +118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 41, 10,123, 10, 9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116, +117,118, 42, 50, 46, 48, 32, 45, 32,118,101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 10,125, + 10, 10,118,111,105,100, 32,103,101,111,109, 40,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,109, + 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,118,101, + 99, 50, 32, 97,116,116,117,118, 44, 32,118,101, 99, 52, 32, 97,116,116,118, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, + 32,103,108,111, 98, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,111, 99, 97,108, 44, 32,111,117,116, 32,118,101, 99, + 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32, +117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99, +111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102,114,111,110,116, 98, 97, 99,107, 41, 10,123, 10, 9,108,111, 99, 97, +108, 32, 61, 32, 99,111, 59, 10, 9,118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,111, 99, 97,108, 41, + 59, 10, 9,103,108,111, 98, 97,108, 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40,108,111, 99, + 97,108, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9,111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10, + 9,117,118, 95, 97,116,116,114,105, 98,117,116,101, 40, 97,116,116,117,118, 44, 32,117,118, 41, 59, 10, 9,110,111,114,109, 97, +108, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,110,111,114, 41, 59, 9, 47, 42, 32, 98,108,101,110,100,101,114, 32, +114,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,105,115, 32,110,101,103, 97,116,101,100, 32, 42, 47, 10, 9,118, 99,111, +108, 95, 97,116,116,114,105, 98,117,116,101, 40, 97,116,116,118, 99,111,108, 44, 32,118, 99,111,108, 41, 59, 10, 9,102,114,111, +110,116, 98, 97, 99,107, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,112,112,105,110,103, 40,118,101, + 99, 51, 32,118,101, 99, 44, 32,109, 97,116, 52, 32,109, 97,116, 44, 32,118,101, 99, 51, 32,109,105,110,118,101, 99, 44, 32,118, +101, 99, 51, 32,109, 97,120,118,101, 99, 44, 32,102,108,111, 97,116, 32,100,111,109,105,110, 44, 32,102,108,111, 97,116, 32,100, +111,109, 97,120, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, + 32, 61, 32, 40,109, 97,116, 32, 42, 32,118,101, 99, 52, 40,118,101, 99, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10, 9, +105,102, 40,100,111,109,105,110, 32, 61, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116,118,101, 99, 32, 61, 32,109, 97,120, 40, +111,117,116,118,101, 99, 44, 32,109,105,110,118,101, 99, 41, 59, 10, 9,105,102, 40,100,111,109, 97,120, 32, 61, 61, 32, 49, 46, + 48, 41, 10, 9, 9,111,117,116,118,101, 99, 32, 61, 32,109,105,110, 40,111,117,116,118,101, 99, 44, 32,109, 97,120,118,101, 99, + 41, 59, 10,125, 10, 10,118,111,105,100, 32, 99, 97,109,101,114, 97, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118, +101, 99, 51, 32,111,117,116,118,105,101,119, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,101,112,116,104, 44, + 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,105,115,116, 41, 10,123, 10, 9,111,117,116,100,101,112,116,104, 32, + 61, 32, 97, 98,115, 40, 99,111, 46,122, 41, 59, 10, 9,111,117,116,100,105,115,116, 32, 61, 32,108,101,110,103,116,104, 40, 99, +111, 41, 59, 10, 9,111,117,116,118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 41, 59, 10,125, 10, + 10,118,111,105,100, 32,109, 97,116,104, 95, 97,100,100, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, + 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, + 97,108, 32, 61, 32,118, 97,108, 49, 32, 43, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,115, +117, 98,116,114, 97, 99,116, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32, 111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97, -108, 49, 32, 43, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,115,117, 98,116,114, 97, 99,116, +108, 49, 32, 45, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109,117,108,116,105,112,108,121, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, - 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 45, 32,118, 97, -108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109,117,108,116,105,112,108,121, 40,102,108,111, 97,116, 32, -118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, - 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 42, 32,118, 97,108, 50, 59, 10,125, 10, 10, -118,111,105,100, 32,109, 97,116,104, 95,100,105,118,105,100,101, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, - 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, - 32, 40,118, 97,108, 50, 32, 61, 61, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10, 9, -101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 47, 32,118, 97,108, 50, 59, 10,125, 10, 10, -118,111,105,100, 32,109, 97,116,104, 95,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108, -111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,115,105,110, 40,118, 97,108, 41, - 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 99,111,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, - 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 99, -111,115, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,116, 97,110,103,101,110,116, 40,102,108, -111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117, -116,118, 97,108, 32, 61, 32,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,115, -105,110, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10, -123, 10, 9,105,102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, 48, - 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 97,115,105,110, 40,118, 97,108, 41, 59, 10, 9,101,108,115,101, 10, 9, 9, -111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97, 99,111,115, 40, -102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9, -105,102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, 48, 41, 10, 9, - 9,111,117,116,118, 97,108, 32, 61, 32, 97, 99,111,115, 40,118, 97,108, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, -118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,116, 97,110, 40,102,108,111, + 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 42, 32,118, 97, +108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,100,105,118,105,100,101, 40,102,108,111, 97,116, 32,118, 97, +108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, + 41, 10,123, 10, 9,105,102, 32, 40,118, 97,108, 50, 32, 61, 61, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, + 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 47, 32,118, 97, +108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, + 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,115, +105,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 99,111,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116, -118, 97,108, 32, 61, 32, 97,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,112,111, -119, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108, -111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 32, 40,118, 97,108, 49, 32, 62, 61, 32, 48, 46, 48, 41, 10, - 9, 9,111,117,116,118, 97,108, 32, 61, 32,112,111,119, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10, 9,101,108,115, -101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108, -111,103, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102, -108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 40,118, 97,108, 49, 32, 62, 32, 48, 46, 48, 32, 32, 38, - 38, 32,118, 97,108, 50, 32, 62, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 61, 32,108,111,103, 50, 40,118, 97,108, - 49, 41, 32, 47, 32,108,111,103, 50, 40,118, 97,108, 50, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 61, - 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109, 97,120, 40,102,108,111, 97,116, 32,118, 97,108, - 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, - 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, - 10,118,111,105,100, 32,109, 97,116,104, 95,109,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, - 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, - 97,108, 32, 61, 32,109,105,110, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97, -116,104, 95,114,111,117,110,100, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117, -116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 61, 32,102,108,111,111,114, 40,118, 97,108, 32, 43, 32, 48, 46, 53, - 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,101,115,115, 95,116,104, 97,110, 40,102,108,111, 97,116, 32, -118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, - 97,108, 41, 10,123, 10, 9,105,102, 40,118, 97,108, 49, 32, 60, 32,118, 97,108, 50, 41, 10, 9, 9,111,117,116,118, 97,108, 32, - 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10, -118,111,105,100, 32,109, 97,116,104, 95,103,114,101, 97,116,101,114, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97,108, - 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, - 10,123, 10, 9,105,102, 40,118, 97,108, 49, 32, 62, 32,118, 97,108, 50, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 49, - 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105, -100, 32,115,113,117,101,101,122,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,102,108,111, 97,116, 32,119,105,100,116,104, - 44, 32,102,108,111, 97,116, 32, 99,101,110,116,101,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, - 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 47, 40, 49, 46, 48, 32, 43, 32,112,111,119, 40, 50, 46, 55, - 49, 56, 50, 56, 49, 56, 51, 44, 32, 45, 40, 40,118, 97,108, 45, 99,101,110,116,101,114, 41, 42,119,105,100,116,104, 41, 41, 41, - 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,100,100, 40,118,101, 99, 51, 32,118, 49, 44, 32, -118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108, -111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50, 59, - 10, 9,111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98,115, - 40,111,117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51, 46, - 48, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,115,117, 98, 40,118,101, 99, 51, 32,118, 49, 44, +118, 97,108, 32, 61, 32, 99,111,115, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,116, 97,110, +103,101,110,116, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, + 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32, +109, 97,116,104, 95, 97,115,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111, +117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, + 62, 61, 32, 45, 49, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 97,115,105,110, 40,118, 97,108, 41, 59, 10, 9, +101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116, +104, 95, 97, 99,111,115, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, + 97,108, 41, 10,123, 10, 9,105,102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, + 45, 49, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 97, 99,111,115, 40,118, 97,108, 41, 59, 10, 9,101,108,115, +101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97, +116, 97,110, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, + 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 97,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32, +109, 97,116,104, 95,112,111,119, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, + 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 32, 40,118, 97,108, 49, 32, 62, + 61, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32,112,111,119, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, + 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, + 32,109, 97,116,104, 95,108,111,103, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, + 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 40,118, 97,108, 49, 32, 62, + 32, 48, 46, 48, 32, 32, 38, 38, 32,118, 97,108, 50, 32, 62, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116,118, 97,108, 61, 32,108, +111,103, 50, 40,118, 97,108, 49, 41, 32, 47, 32,108,111,103, 50, 40,118, 97,108, 50, 41, 59, 10, 9,101,108,115,101, 10, 9, 9, +111,117,116,118, 97,108, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109, 97,120, 40,102,108, +111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, +111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40,118, 97,108, 49, 44, 32,118, 97, +108, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, + 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10, +123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,109,105,110, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10, +118,111,105,100, 32,109, 97,116,104, 95,114,111,117,110,100, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102, +108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 61, 32,102,108,111,111,114, 40,118, 97, +108, 32, 43, 32, 48, 46, 53, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,101,115,115, 95,116,104, 97,110, + 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, + 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 40,118, 97,108, 49, 32, 60, 32,118, 97,108, 50, 41, 10, 9, 9, +111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, + 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,103,114,101, 97,116,101,114, 95,116,104, 97,110, 40,102,108, +111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, +111,117,116,118, 97,108, 41, 10,123, 10, 9,105,102, 40,118, 97,108, 49, 32, 62, 32,118, 97,108, 50, 41, 10, 9, 9,111,117,116, +118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, + 10,125, 10, 10,118,111,105,100, 32,115,113,117,101,101,122,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,102,108,111, 97, +116, 32,119,105,100,116,104, 44, 32,102,108,111, 97,116, 32, 99,101,110,116,101,114, 44, 32,111,117,116, 32,102,108,111, 97,116, + 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 47, 40, 49, 46, 48, 32, 43, 32, +112,111,119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 51, 44, 32, 45, 40, 40,118, 97,108, 45, 99,101,110,116,101,114, 41, 42,119, +105,100,116,104, 41, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,100,100, 40,118,101, + 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, + 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, + 49, 32, 43, 32,118, 50, 59, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, + 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, + 50, 93, 41, 41, 47, 51, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,115,117, 98, 40,118, +101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, + 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32, +118, 49, 32, 45, 32,118, 50, 59, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, + 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, + 91, 50, 93, 41, 41, 47, 51, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,118,101,114, + 97,103,101, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111, +117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, +101, 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50, 59, 10, 9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111, +117,116,118,101, 99, 41, 59, 10, 9,111,117,116,118,101, 99, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,118, +101, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,100,111,116, 40,118,101, 99, 51, 32,118, + 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, + 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40, + 48, 44, 32, 48, 44, 32, 48, 41, 59, 10, 9,111,117,116,118, 97,108, 32, 61, 32,100,111,116, 40,118, 49, 44, 32,118, 50, 41, 59, + 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 99,114,111,115,115, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102, -108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 45, 32,118, 50, - 59, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98, -115, 40,111,117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51, - 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,118,101,114, 97,103,101, 40,118,101, 99, - 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32, -111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118, 49, - 32, 43, 32,118, 50, 59, 10, 9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, - 10, 9,111,117,116,118,101, 99, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10, - 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,100,111,116, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, - 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, -111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40, 48, 44, 32, 48, 44, 32, 48, - 41, 59, 10, 9,111,117,116,118, 97,108, 32, 61, 32,100,111,116, 40,118, 49, 44, 32,118, 50, 41, 59, 10,125, 10, 10,118,111,105, -100, 32,118,101, 99, 95,109, 97,116,104, 95, 99,114,111,115,115, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, - 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117, -116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32, 99,114,111,115,115, 40,118, 49, 44, 32,118, 50, 41, 59, - 10, 9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10, 10,118,111, -105,100, 32,118,101, 99, 95,109, 97,116,104, 95,110,111,114,109, 97,108,105,122,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117, -116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, - 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,118, 41, 59, 10, 9,111,117,116,118,101, 99, 32, - 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, - 95,110,101,103, 97,116,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 41, 10,123, - 10, 9,111,117,116,118, 32, 61, 32, 45,118, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,114,109, 97,108, 40,118,101, 99, 51, - 32,100,105,114, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114, 44, - 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,111,116, 41, 10,123, 10, 9,111,117,116,110,111,114, 32, 61, 32,100, -105,114, 59, 10, 9,111,117,116,100,111,116, 32, 61, 32, 45,100,111,116, 40,100,105,114, 44, 32,110,111,114, 41, 59, 10,125, 10, - 10,118,111,105,100, 32, 99,117,114,118,101,115, 95,118,101, 99, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 51, - 32,118,101, 99, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, - 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 46,120, 32, 61, 32,116,101,120,116,117,114,101, - 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,120, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46, -120, 59, 10, 9,111,117,116,118,101, 99, 46,121, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97, -112, 44, 32, 40,118,101, 99, 46,121, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,121, 59, 10, 9,111,117,116,118,101, 99, - 46,122, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,122, 32, - 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,122, 59, 10, 10, 9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, - 10, 9, 9,111,117,116,118,101, 99, 32, 61, 32, 40,111,117,116,118,101, 99, 42,102, 97, 99, 41, 32, 43, 32, 40,118,101, 99, 42, - 40, 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118,101,115, 95,114,103, 98, 40, -102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99, -117,114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, - 99,111,108, 46,114, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,120,116, -117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46,114, 41, 46, 97, 41, 46,114, 59, 10, 9,111,117, -116, 99,111,108, 46,103, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101,120, -116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46,103, 41, 46, 97, 41, 46,103, 59, 10, 9,111, -117,116, 99,111,108, 46, 98, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,116,101, -120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46, 98, 41, 46, 97, 41, 46, 98, 59, 10, 10, - 9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32, 40,111,117,116, - 99,111,108, 42,102, 97, 99, 41, 32, 43, 32, 40, 99,111,108, 42, 40, 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10, 9,111,117, -116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117, -101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, - 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 40, -118,101, 99, 51, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117, -116, 99,111,108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 97, 40,118,101, 99, - 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111, -108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,122,101,114,111, 40, -111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, - 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,111,110,101, 40,111,117,116, 32,102,108,111, - 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118, -111,105,100, 32,115,101,116, 95,114,103, 98, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 97,108, - 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, - 32,115,101,116, 95,114,103, 98, 97, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 52, 32,111,117,116,118, 97,108, 41, 10, -123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, -105,120, 95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118, -101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, - 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111, -108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111, -108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 97,100,100, 40,102,108, +108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32, 99,114,111,115,115, 40,118, + 49, 44, 32,118, 50, 41, 59, 10, 9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, + 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,110,111,114,109, 97,108,105,122,101, 40,118,101, 99, + 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, +111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,118, 41, 59, 10, 9, +111,117,116,118,101, 99, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118, +101, 99, 95,109, 97,116,104, 95,110,101,103, 97,116,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32, +111,117,116,118, 41, 10,123, 10, 9,111,117,116,118, 32, 61, 32, 45,118, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,114,109, + 97,108, 40,118,101, 99, 51, 32,100,105,114, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32, +111,117,116,110,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,111,116, 41, 10,123, 10, 9,111,117,116, +110,111,114, 32, 61, 32,100,105,114, 59, 10, 9,111,117,116,100,111,116, 32, 61, 32, 45,100,111,116, 40,100,105,114, 44, 32,110, +111,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118,101,115, 95,118,101, 99, 40,102,108,111, 97,116, 32,102, 97, + 99, 44, 32,118,101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44, + 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 46,120, 32, 61, 32, +116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,120, 32, 43, 32, 49, 46, 48, + 41, 42, 48, 46, 53, 41, 46,120, 59, 10, 9,111,117,116,118,101, 99, 46,121, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, + 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,121, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,121, 59, 10, + 9,111,117,116,118,101, 99, 46,122, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, + 40,118,101, 99, 46,122, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,122, 59, 10, 10, 9,105,102, 32, 40,102, 97, 99, 32, + 33, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116,118,101, 99, 32, 61, 32, 40,111,117,116,118,101, 99, 42,102, 97, 99, 41, 32, + 43, 32, 40,118,101, 99, 42, 40, 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118, +101,115, 95,114,103, 98, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,115, 97,109,112, +108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, + 10,123, 10, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97, +112, 44, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46,114, 41, 46, 97, 41, + 46,114, 59, 10, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, + 97,112, 44, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46,103, 41, 46, 97, + 41, 46,103, 59, 10, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101, +109, 97,112, 44, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46, 98, 41, 46, + 97, 41, 46, 98, 59, 10, 10, 9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, + 32, 61, 32, 40,111,117,116, 99,111,108, 42,102, 97, 99, 41, 32, 43, 32, 40, 99,111,108, 42, 40, 49, 46, 48, 45,102, 97, 99, 41, + 41, 59, 10, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,115, +101,116, 95,118, 97,108,117,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117, +116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,115, +101,116, 95,114,103, 98, 40,118,101, 99, 51, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,108, + 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114, +103, 98, 97, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, + 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117, +101, 95,122,101,114,111, 40,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, + 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,111,110,101, 40, +111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, + 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 51, + 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, 10, +125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 97, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 52, 32,111, +117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10,125, 10, + 10,118,111,105,100, 32,109,105,120, 95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, + 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, + 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, + 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, + 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, + 95, 97,100,100, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, + 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, + 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32, +109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32, 43, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117, +116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,109,117,108, +116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, + 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97, +109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, + 40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32, 42, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111, +108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 99,114,101,101,110, + 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, + 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109, +112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, + 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 32, + 45, 32, 40,118,101, 99, 52, 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99, 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, + 32, 99,111,108, 50, 41, 41, 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 49, 41, 59, 10, 9,111,117,116, + 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,111,118,101,114, +108, 97,121, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99, +111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99, +108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, + 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, + 9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 42, + 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10, 9,101,108,115,101, 10, 9, + 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, + 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, +114, 41, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111, +108, 46,103, 32, 42, 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9,101, +108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, + 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117, +116, 99,111,108, 46,103, 41, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9, +111,117,116, 99,111,108, 46, 98, 32, 42, 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46, + 98, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99, +109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46, 98, 41, 41, 42, 40, 49, 46, 48, + 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115,117, 98, 40,102,108, 111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111, 117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, - 49, 44, 32, 99,111,108, 49, 32, 43, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, - 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,109,117,108,116, 40,102,108,111, 97,116, - 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32, -118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, - 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, - 99,111,108, 49, 32, 42, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99, -111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 99,114,101,101,110, 40,102,108,111, 97,116, 32, + 49, 44, 32, 99,111,108, 49, 32, 45, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, + 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100,105,118, 40,102,108,111, 97,116, 32, 102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118, 101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, - 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99, 52, - 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99, 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 50, 41, 41, - 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 49, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, - 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,111,118,101,114,108, 97,121, 40,102,108,111, - 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117, -116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, - 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, - 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40,111,117,116, - 99,111,108, 46,114, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 42, 61, 32,102, 97, 99,109, 32, - 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, - 46,114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32, - 45, 32, 99,111,108, 50, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 59, 10, 10, 9,105, -102, 40,111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 42, 61, 32, -102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9,101,108,115,101, 10, 9, 9,111, -117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, - 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, - 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46, - 98, 32, 42, 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9,101,108,115, -101, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, - 42,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99, -111,108, 46, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115,117, 98, 40,102,108,111, 97,116, 32,102, 97, 99, - 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, - 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, - 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49, - 32, 45, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, - 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100,105,118, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, - 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, - 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, - 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111, -117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,114, 32, 33, 61, 32, 48, 46, 48, - 41, 32,111,117,116, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,102, 97, 99, - 42,111,117,116, 99,111,108, 46,114, 47, 99,111,108, 50, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 50, 46,103, 32, 33, 61, 32, - 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,103, 32, 43, 32, -102, 97, 99, 42,111,117,116, 99,111,108, 46,103, 47, 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 50, 46, 98, 32, - 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46, 98, - 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,108, 46, 98, 47, 99,111,108, 50, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32, -109,105,120, 95,100,105,102,102, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118, -101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, - 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111, -108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 97, 98,115, 40, 99,111,108, 49, 32, 45, 32, 99,111,108, 50, 41, 44, 32, -102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105, -100, 32,109,105,120, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, - 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9, -102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, - 99,111,108, 46,114,103, 98, 32, 61, 32,109,105,110, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,103, 98, - 42,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111, -105,100, 32,109,105,120, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, + 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,114, + 32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46, +114, 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,108, 46,114, 47, 99,111,108, 50, 46,114, 59, 10, 9,105,102, 40, 99,111,108, + 50, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99, +111,108, 46,103, 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,108, 46,103, 47, 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40, + 99,111,108, 50, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111, +117,116, 99,111,108, 46, 98, 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,108, 46, 98, 47, 99,111,108, 50, 46, 98, 59, 10,125, + 10, 10,118,111,105,100, 32,109,105,120, 95,100,105,102,102, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, + 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, + 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, + 10, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 97, 98,115, 40, 99,111,108, 49, 32, 45, 32, + 99,111,108, 50, 41, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, + 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, + 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99, +111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, + 41, 59, 10, 9,111,117,116, 99,111,108, 46,114,103, 98, 32, 61, 32,109,105,110, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99, +111,108, 50, 46,114,103, 98, 42,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, + 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118, +101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117, +116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, + 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 46,114,103, 98, 32, 61, 32,109, 97,120, 40, 99,111,108, 49, 46,114,103, 98, 44, + 32, 99,111,108, 50, 46,114,103, 98, 42,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, + 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100,111,100,103,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, + 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32, +111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, + 32, 49, 46, 48, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40,111,117,116, 99, +111,108, 46,114, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, + 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, + 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109, +112, 32, 61, 32,111,117,116, 99,111,108, 46,114, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99, +111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, + 32,116,109,112, 59, 10, 9,125, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, + 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, + 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, + 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46,103, 47,116,109, +112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101, +108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10, 9,125, 10, 9,105,102, 40,111,117, +116, 99,111,108, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, + 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, + 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40, +116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117, +116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, + 32, 61, 32,116,109,112, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 98,117,114,110, 40,102,108,111, 97, +116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, + 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, + 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,116,109,112, 44, 32,102, 97, 99,109, 32, 61, 32, + 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,116,109, +112, 32, 61, 32,102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10, 9,105,102, 40,116,109,112, 32, 60, + 61, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105, +102, 40, 40,116,109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, + 47,116,109,112, 41, 41, 32, 60, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10, + 9,101,108,115,101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, + 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 10, 9, +116,109,112, 32, 61, 32,102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40,116,109,112, + 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, + 32,105,102, 40, 40,116,109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, +103, 41, 47,116,109,112, 41, 41, 32, 60, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, + 59, 10, 9,101,108,115,101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, + 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10, + 10, 9,116,109,112, 32, 61, 32,102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9,105,102, 40,116, +109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108, +115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111, +108, 46, 98, 41, 47,116,109,112, 41, 41, 32, 60, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, + 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, + 46, 98, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, + 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,104,117,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, + 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99, +111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, + 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117, +116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116, +109,112, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,105, +102, 40,104,115,118, 50, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, +111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 9, 9,104,115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10, + 9, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10, 9, 9,111,117,116, 99, +111,108, 32, 61, 32,109,105,120, 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10, 9, 9,111,117, +116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, +115, 97,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99, +111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99, +108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, + 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, + 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, + 99,111,108, 44, 32,104,115,118, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, + 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9, 9,104,115,118, + 46,121, 32, 61, 32,102, 97, 99,109, 42,104,115,118, 46,121, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,121, 59, 10, 9, 9, +104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10, 9,125, 10,125, 10, 10,118, +111,105,100, 32,109,105,120, 95,118, 97,108, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, + 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, + 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108, +111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, + 44, 32,104,115,118, 50, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 49, 44, 32,104,115,118, 41, 59, 10, + 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,104,115,118, 46,122, + 32, 61, 32,102, 97, 99,109, 42,104,115,118, 46,122, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,122, 59, 10, 9,104,115,118, + 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105, +120, 95, 99,111,108,111,114, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, + 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, + 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32, +102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, + 49, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10, 9,114,103, 98, 95,116, +111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 50, 46,121, 32, 33, + 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115, +118, 41, 59, 10, 9, 9,104,115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10, 9, 9,104,115,118, 46,121, 32, 61, 32, +104,115,118, 50, 46,121, 59, 10, 9, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, + 10, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, + 99, 41, 59, 10, 9, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10, 9,125, 10,125, 10, 10,118, +111,105,100, 32,109,105,120, 95,115,111,102,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, - 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,111, -117,116, 99,111,108, 46,114,103, 98, 32, 61, 32,109, 97,120, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114, -103, 98, 42,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10, -118,111,105,100, 32,109,105,120, 95,100,111,100,103,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99, -111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, - 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, - 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 33, 61, - 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, - 99,111,108, 50, 46,114, 59, 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99, -111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, - 99,111,108, 46,114, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, - 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 9, -125, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, - 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9, 9,105,102, 40,116,109, -112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101, -108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46,103, 47,116,109,112, 41, 32, 62, 32, 49, 46, - 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9, -111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10, 9,125, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, - 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, - 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, 9, 9, 9,111,117, -116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111, -117,116, 99,111,108, 46, 98, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32, - 61, 32, 49, 46, 48, 59, 10, 9, 9,101,108,115,101, 10, 9, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59, - 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 98,117,114,110, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32, -118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111, -117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, - 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,116,109,112, 44, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, - 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,116,109,112, 32, 61, 32,102, 97, 99, -109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10, - 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, - 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 47,116,109,112, 41, 41, 32, - 60, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105, -102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10, 9, -101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 10, 9,116,109,112, 32, 61, 32,102, - 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, - 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40,116,109, -112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 47,116,109,112, 41, - 41, 32, 60, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, - 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, - 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10, 10, 9,116,109,112, 32, 61, - 32,102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10, 9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, - 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40, 40, -116,109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 47,116,109, -112, 41, 41, 32, 60, 32, 48, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10, 9,101,108, -115,101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, - 48, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59, 10,125, 10, 10,118,111, -105,100, 32,109,105,120, 95,104,117,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, - 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9, -102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, - 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, - 99,111,108, 49, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10, 9,114,103, - 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 50, 46, -121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, - 32,104,115,118, 41, 59, 10, 9, 9,104,115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10, 9, 9,104,115,118, 95,116, -111, 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10, 9, 9,111,117,116, 99,111,108, 32, 61, 32,109,105, -120, 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10, 9, 9,111,117,116, 99,111,108, 46, 97, 32, - 61, 32, 99,111,108, 49, 46, 97, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 97,116, 40,102,108,111, - 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117, -116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, - 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, - 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,118,101, 99, 52, 32,104, -115,118, 44, 32,104,115,118, 50, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115, -118, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,114,103, 98, 95,116, -111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9, 9,104,115,118, 46,121, 32, 61, 32,102, 97, - 99,109, 42,104,115,118, 46,121, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,121, 59, 10, 9, 9,104,115,118, 95,116,111, 95, -114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, - 95,118, 97,108, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, - 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, - 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99, -109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 59, - 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 49, 44, 32,104,115,118, 41, 59, 10, 9,114,103, 98, 95,116,111, - 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,104,115,118, 46,122, 32, 61, 32,102, 97, 99,109, - 42,104,115,118, 46,122, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,122, 59, 10, 9,104,115,118, 95,116,111, 95,114,103, 98, - 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 99,111,108,111,114, - 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, - 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109, -112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, - 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,118,101, - 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99, -111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10, 9,105,102, 40,104,115,118, 50, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32, -123, 10, 9, 9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 9, 9,104, -115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10, 9, 9,104,115,118, 46,121, 32, 61, 32,104,115,118, 50, 46,121, 59, - 10, 9, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10, 9, 9,111,117,116, - 99,111,108, 32, 61, 32,109,105,120, 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10, 9, 9,111, -117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, - 95,115,111,102,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, - 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, - 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102,108,111, 97,116, 32,102, 97, - 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,118,101, 99, 52, 32,111,110,101, 61, 32,118,101, 99, 52, - 40, 49, 46, 48, 41, 59, 10, 9,118,101, 99, 52, 32,115, 99,114, 61, 32,111,110,101, 32, 45, 32, 40,111,110,101, 32, 45, 32, 99, -111,108, 50, 41, 42, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 59, 10, 9,111,117,116, 99,111,108, 32, 61, 32,102, 97, 99, -109, 42, 99,111,108, 49, 32, 43, 32,102, 97, 99, 42, 40, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 42, 99,111,108, 50, 42, - 99,111,108, 49, 32, 43, 32, 99,111,108, 49, 42,115, 99,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,108,105, -110,101, 97,114, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, - 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,102, 97, 99, 32, 61, 32, - 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, - 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,114, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99, -111,108, 46,114, 61, 32, 99,111,108, 49, 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 32, - 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, 61, 32, 99,111,108, 49, 46, -114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10, 9, -105,102, 40, 99,111,108, 50, 46,103, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,108, - 49, 46,103, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, - 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,108, 49, 46,103, 32, 43, 32,102, 97, 99, 42, 40, - 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46, 98, - 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, - 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46, 98, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111, -117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, - 46, 98, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118, 97,108,116,111,114,103, 98, 40,102,108,111, - 97,116, 32,102, 97, 99, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,111,108,111,114,109, 97,112, 44, 32,111,117,116, 32, -118,101, 99, 52, 32,111,117,116, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116, 97,108,112,104, 97, 41, - 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,111,108,111,114,109, 97,112, 44, - 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 97,108,112,104, 97, 32, 61, 32,111,117,116, 99,111,108, 46, 97, 59, 10,125, 10, 10, -118,111,105,100, 32,114,103, 98,116,111, 98,119, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,102,108,111, - 97,116, 32,111,117,116,118, 97,108, 41, 32, 32, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 99,111,108,111,114, 46,114, - 42, 48, 46, 51, 53, 32, 43, 32, 99,111,108,111,114, 46,103, 42, 48, 46, 52, 53, 32, 43, 32, 99,111,108,111,114, 46, 98, 42, 48, - 46, 50, 59, 32, 47, 42, 32,107,101,101,112, 32,116,104,101,115,101, 32,102, 97, 99,116,111,114,115, 32,105,110, 32,115,121,110, - 99, 32,119,105,116,104, 32,116,101,120,116,117,114,101, 46,104, 58, 82, 71, 66, 84, 79, 66, 87, 32, 42, 47, 10,125, 10, 10,118, -111,105,100, 32,105,110,118,101,114,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32, -111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 46,120,121,122, 32, 61, - 32,109,105,120, 40, 99,111,108, 46,120,121,122, 44, 32,118,101, 99, 51, 40, 49, 46, 48, 44, 32, 49, 46, 48, 44, 32, 49, 46, 48, - 41, 32, 45, 32, 99,111,108, 46,120,121,122, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111,108, 46,119, 32, 61, 32, 99, -111,108, 46,119, 59, 10,125, 10, 10,118,111,105,100, 32,104,117,101, 95,115, 97,116, 40,102,108,111, 97,116, 32,104,117,101, 44, - 32,102,108,111, 97,116, 32,115, 97,116, 44, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,102,108,111, 97,116, 32,102, - 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, - 10, 9,118,101, 99, 52, 32,104,115,118, 59, 10, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 44, 32,104,115, -118, 41, 59, 10, 10, 9,104,115,118, 91, 48, 93, 32, 43, 61, 32, 40,104,117,101, 32, 45, 32, 48, 46, 53, 41, 59, 10, 9,105,102, - 40,104,115,118, 91, 48, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 48, 93, 45, 61, 49, 46, 48, 59, 32,101,108,115,101, 32,105, -102, 40,104,115,118, 91, 48, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 48, 93, 43, 61, 32, 49, 46, 48, 59, 10, 9,104,115,118, - 91, 49, 93, 32, 42, 61, 32,115, 97,116, 59, 10, 9,105,102, 40,104,115,118, 91, 49, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, - 49, 93, 61, 32, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 49, 93, 60, 48, 46, 48, 41, 32,104,115,118, - 91, 49, 93, 61, 32, 48, 46, 48, 59, 10, 9,104,115,118, 91, 50, 93, 32, 42, 61, 32,118, 97,108,117,101, 59, 10, 9,105,102, 40, -104,115,118, 91, 50, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, - 40,104,115,118, 91, 50, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 48, 46, 48, 59, 10, 10, 9,104,115,118, 95, -116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10, 10, 9,111,117,116, 99,111,108, 32, 61, 32, -109,105,120, 40, 99,111,108, 44, 32,111,117,116, 99,111,108, 44, 32,102, 97, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115, -101,112, 97,114, 97,116,101, 95,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, -114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, 98, 41, 10,123, 10, 9, -114, 32, 61, 32, 99,111,108, 46,114, 59, 10, 9,103, 32, 61, 32, 99,111,108, 46,103, 59, 10, 9, 98, 32, 61, 32, 99,111,108, 46, - 98, 59, 10,125, 10, 10,118,111,105,100, 32, 99,111,109, 98,105,110,101, 95,114,103, 98, 40,102,108,111, 97,116, 32,114, 44, 32, -102,108,111, 97,116, 32,103, 44, 32,102,108,111, 97,116, 32, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 41, 10, -123, 10, 9, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114, 44, 32,103, 44, 32, 98, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10, -118,111,105,100, 32,111,117,116,112,117,116, 95,110,111,100,101, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,102,108,111, 97,116, - 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10, 9,111,117,116,114, -103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32, 97,108,112,104, 97, 41, 59, 10,125, 10, 10, 47, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 84, 69, 88, 84, 85, 82, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95,102,108,105,112, 95, 98,108,101,110,100, 40,118,101, - 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118, -101, 99, 32, 61, 32,118,101, 99, 46,121,120,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95, 98,108, -101,110,100, 95,108,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, - 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41, 47, 50, 46, 48, 59, - 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95, 98,108,101,110,100, 95,113,117, 97,100, 40,118,101, 99, 51, - 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97, -108, 32, 61, 32,109, 97,120, 40, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41, 47, 50, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10, 9, -111,117,116,118, 97,108, 32, 42, 61, 32,111,117,116,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114, -101, 95,119,111,111,100, 95,115,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, - 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110, -111,114,109, 97,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32, 97, 32, 61, 32,115,113,114,116, 40,118,101, 99, 46,120, 42,118, -101, 99, 46,120, 32, 43, 32,118,101, 99, 46,121, 42,118,101, 99, 46,121, 32, 43, 32,118,101, 99, 46,122, 42,118,101, 99, 46,122, - 41, 42, 50, 48, 46, 48, 59, 10, 9,102,108,111, 97,116, 32,119,105, 32, 61, 32, 48, 46, 53, 32, 43, 32, 48, 46, 53, 42,115,105, -110, 40, 97, 41, 59, 10, 10, 9,118, 97,108,117,101, 32, 61, 32,119,105, 59, 10, 9, 99,111,108,111,114, 32, 61, 32,118,101, 99, - 52, 40,119,105, 44, 32,119,105, 44, 32,119,105, 44, 32, 49, 46, 48, 41, 59, 10, 9,110,111,114,109, 97,108, 32, 61, 32,118,101, - 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117, -114,101, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, - 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111, -114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,116, -101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 40,118,101, 99, 46,120,121, 32, 43, 32,118,101, 99, 50, 40, 49, 46, 48, - 44, 32, 49, 46, 48, 41, 41, 42, 48, 46, 53, 41, 59, 10, 9,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 59, 10, 10, 9,110,111, -114,109, 97,108, 46,120, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46,114, 32, 45, 32, 48, 46, 53, 41, 59, 10, 9,110, -111,114,109, 97,108, 46,121, 32, 61, 32, 50, 46, 48, 42, 40, 48, 46, 53, 32, 45, 32, 99,111,108,111,114, 46,103, 41, 59, 10, 9, -110,111,114,109, 97,108, 46,122, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46, 98, 32, 45, 32, 48, 46, 53, 41, 59, 10, -125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 77, 84, 69, 88, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111,114, 99,111, 40,118,101, 99, 51, 32, - 97,116,116,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 41, 10,123, 10, 9,111,114, 99,111, 32, - 61, 32, 97,116,116,111,114, 99,111, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,117,118, 40,118,101, 99, 50, - 32, 97,116,116,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 41, 10,123, 10, 9, 47, 42, 32,100,105,115, 97, 98, -108,101,100, 32,102,111,114, 32,110,111,119, 44, 32,119,111,114,107,115, 32,116,111,103,101,116,104,101,114, 32,119,105,116,104, - 32,108,101, 97,118,105,110,103, 32,111,117,116, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103, 10, 9, 32, 32, - 32,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45, 32,118,101, 99, 50, 40, 49, 46, 48, 44, - 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 32, 42, 47, 10, 9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, - 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,110,111,114,109, 40,118,101, 99, 51, 32, -110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9, 47, - 42, 32, 99,111,114,114,101,115,112,111,110,100,115, 32,116,111, 32,115,104,105, 45, 62,111,114,110, 44, 32,119,104,105, 99,104, - 32,105,115, 32,110,101,103, 97,116,101,100, 32,115,111, 32, 99, 97,110, 99,101,108,115, 10, 9, 32, 32, 32,111,117,116, 32, 98, -108,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,110,101,103, 97,116,105,111,110, 32, 42, 47, 10, 9,111,117,116,110,111, -114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10,118,111,105, -100, 32,116,101,120, 99,111, 95,116, 97,110,103,101,110,116, 40,118,101, 99, 51, 32,116, 97,110,103,101,110,116, 44, 32,111,117, -116, 32,118,101, 99, 51, 32,111,117,116,116, 97,110,103,101,110,116, 41, 10,123, 10, 9,111,117,116,116, 97,110,103,101,110,116, - 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,116, 97,110,103,101,110,116, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116, -101,120, 99,111, 95,103,108,111, 98, 97,108, 40,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,118,101, 99, - 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108, 41, 10,123, 10, 9,103,108,111, 98, 97,108, - 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40, 99,111, 44, 32, 49, 46, 48, 41, 41, 46,120,121, -122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111, 98,106,101, 99,116, 40,109, 97,116, 52, 32,118,105,101, -119,105,110,118,109, 97,116, 44, 32,109, 97,116, 52, 32,111, 98,105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 99,111, 44, - 32,111,117,116, 32,118,101, 99, 51, 32,111, 98,106,101, 99,116, 41, 10,123, 10, 9,111, 98,106,101, 99,116, 32, 61, 32, 40,111, - 98,105,110,118,109, 97,116, 42, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40, 99,111, 44, 32, 49, 46, 48, - 41, 41, 41, 46,120,121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,114,101,102,108, 40,118,101, 99, 51, - 32,118,110, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,101, 99, 51, 32,114,101,102, 41, 10,123, 10, - 9,114,101,102, 32, 61, 32,118,105,101,119, 32, 45, 32, 50, 46, 48, 42,100,111,116, 40,118,110, 44, 32,118,105,101,119, 41, 42, -118,110, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,110,111,114,109, 40,118,101, 99, 51, 32,110,111,114,109, - 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9, 47, 42, 32, 98,108, -101,110,100,101,114, 32,114,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,105,115, 32,110,101,103, 97,116,101,100, 32, 42, - 47, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,110,111,114,109, 97,108, - 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 98,108,101,110,100, 40,118,101, 99, 51, 32,111, -117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32, -102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102, -108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, - 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99, -111,108, 32, 43, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114, -103, 98, 95,109,117,108, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, - 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, - 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, - 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,110, 99,111, -108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 41, 42,111,117,116, 99,111,108, 59, - 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 99,114,101,101,110, 40,118,101, 99, 51, 32,111,117, -116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102, -108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108, -111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, - 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,118,101, 99, 51, 40, 49, 46, 48, 41, 32, - 45, 32, 40,118,101, 99, 51, 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99,116, 42, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, - 45, 32,116,101,120, 99,111,108, 41, 41, 42, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,111,117,116, 99,111,108, 41, 59, - 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,111,118,101,114,108, 97,121, 40,118,101, 99, 51, 32,111, -117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32, -102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102, -108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, - 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 60, 32, 48, 46, 53, - 41, 10, 9, 9,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 42, 40,102, 97, 99,109, 32, 43, 32, 50, - 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108, - 46,114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, - 32, 45, 32,116,101,120, 99,111,108, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 59, 10, - 10, 9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,105,110, 99,111,108, 46,103, 32, 61, - 32,111,117,116, 99,111,108, 46,103, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111, -108, 46,103, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, - 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46,103, 41, 41, - 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46, 98, - 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 42, 40,102, 97, - 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 41, 59, 10, 9,101,108,115,101, 10, 9, - 9,105,110, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, -116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111, -108, 46, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115,117, 98, 40,118,101, 99, 51, 32, -111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, - 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9, -105,110, 99,111,108, 32, 61, 32, 45,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99, -111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 97,100,100, 40,118,101, 99, 51, 32,111,117, + 10, 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 9,102, +108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10, 9,118,101, 99, 52, 32,111,110, +101, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 59, 10, 9,118,101, 99, 52, 32,115, 99,114, 61, 32,111,110,101, 32, 45, 32, 40, +111,110,101, 32, 45, 32, 99,111,108, 50, 41, 42, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 59, 10, 9,111,117,116, 99,111, +108, 32, 61, 32,102, 97, 99,109, 42, 99,111,108, 49, 32, 43, 32,102, 97, 99, 42, 40, 40,111,110,101, 32, 45, 32, 99,111,108, 49, + 41, 42, 99,111,108, 50, 42, 99,111,108, 49, 32, 43, 32, 99,111,108, 49, 42,115, 99,114, 41, 59, 10,125, 10, 10,118,111,105,100, + 32,109,105,120, 95,108,105,110,101, 97,114, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, + 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, + 9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 10, 9,111, +117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,114, 32, 62, 32, 48, 46, 53, 41, + 10, 9, 9,111,117,116, 99,111,108, 46,114, 61, 32, 99,111,108, 49, 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, + 99,111,108, 50, 46,114, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,114, + 61, 32, 99,111,108, 49, 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 41, 32, 45, 32, 49, + 46, 48, 41, 59, 10, 10, 9,105,102, 40, 99,111,108, 50, 46,103, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, + 46,103, 61, 32, 99,111,108, 49, 46,103, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 32, 45, 32, + 48, 46, 53, 41, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,108, 49, 46,103, 32, + 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10, 9,105,102, + 40, 99,111,108, 50, 46, 98, 32, 62, 32, 48, 46, 53, 41, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, + 98, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46, 98, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10, 9,101, +108,115,101, 10, 9, 9,111,117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, + 48, 42, 40, 99,111,108, 50, 46, 98, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118, 97,108,116,111, +114,103, 98, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,111,108,111,114,109, 97, +112, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117, +116, 97,108,112,104, 97, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,111, +108,111,114,109, 97,112, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 97,108,112,104, 97, 32, 61, 32,111,117,116, 99,111,108, + 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,114,103, 98,116,111, 98,119, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32, +111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 32, 32, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, + 99,111,108,111,114, 46,114, 42, 48, 46, 51, 53, 32, 43, 32, 99,111,108,111,114, 46,103, 42, 48, 46, 52, 53, 32, 43, 32, 99,111, +108,111,114, 46, 98, 42, 48, 46, 50, 59, 32, 47, 42, 32,107,101,101,112, 32,116,104,101,115,101, 32,102, 97, 99,116,111,114,115, + 32,105,110, 32,115,121,110, 99, 32,119,105,116,104, 32,116,101,120,116,117,114,101, 46,104, 58, 82, 71, 66, 84, 79, 66, 87, 32, + 42, 47, 10,125, 10, 10,118,111,105,100, 32,105,110,118,101,114,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, + 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111, +108, 46,120,121,122, 32, 61, 32,109,105,120, 40, 99,111,108, 46,120,121,122, 44, 32,118,101, 99, 51, 40, 49, 46, 48, 44, 32, 49, + 46, 48, 44, 32, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 46,120,121,122, 44, 32,102, 97, 99, 41, 59, 10, 9,111,117,116, 99,111, +108, 46,119, 32, 61, 32, 99,111,108, 46,119, 59, 10,125, 10, 10,118,111,105,100, 32,104,117,101, 95,115, 97,116, 40,102,108,111, + 97,116, 32,104,117,101, 44, 32,102,108,111, 97,116, 32,115, 97,116, 44, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32, +102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117, +116, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32,104,115,118, 59, 10, 10, 9,114,103, 98, 95,116,111, 95,104,115,118, 40, + 99,111,108, 44, 32,104,115,118, 41, 59, 10, 10, 9,104,115,118, 91, 48, 93, 32, 43, 61, 32, 40,104,117,101, 32, 45, 32, 48, 46, + 53, 41, 59, 10, 9,105,102, 40,104,115,118, 91, 48, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 48, 93, 45, 61, 49, 46, 48, 59, + 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 48, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 48, 93, 43, 61, 32, 49, 46, + 48, 59, 10, 9,104,115,118, 91, 49, 93, 32, 42, 61, 32,115, 97,116, 59, 10, 9,105,102, 40,104,115,118, 91, 49, 93, 62, 49, 46, + 48, 41, 32,104,115,118, 91, 49, 93, 61, 32, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 49, 93, 60, 48, + 46, 48, 41, 32,104,115,118, 91, 49, 93, 61, 32, 48, 46, 48, 59, 10, 9,104,115,118, 91, 50, 93, 32, 42, 61, 32,118, 97,108,117, +101, 59, 10, 9,105,102, 40,104,115,118, 91, 50, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 49, 46, 48, 59, 32, +101,108,115,101, 32,105,102, 40,104,115,118, 91, 50, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 48, 46, 48, 59, + 10, 10, 9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10, 10, 9,111,117, +116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 44, 32,111,117,116, 99,111,108, 44, 32,102, 97, 99, 41, 59, 10,125, 10, + 10,118,111,105,100, 32,115,101,112, 97,114, 97,116,101, 95,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, + 32,102,108,111, 97,116, 32,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,103, 44, 32,111,117,116, 32,102,108,111, 97,116, + 32, 98, 41, 10,123, 10, 9,114, 32, 61, 32, 99,111,108, 46,114, 59, 10, 9,103, 32, 61, 32, 99,111,108, 46,103, 59, 10, 9, 98, + 32, 61, 32, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32, 99,111,109, 98,105,110,101, 95,114,103, 98, 40,102,108, +111, 97,116, 32,114, 44, 32,102,108,111, 97,116, 32,103, 44, 32,102,108,111, 97,116, 32, 98, 44, 32,111,117,116, 32,118,101, 99, + 52, 32, 99,111,108, 41, 10,123, 10, 9, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114, 44, 32,103, 44, 32, 98, 44, 32, 49, 46, + 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,111,117,116,112,117,116, 95,110,111,100,101, 40,118,101, 99, 52, 32,114,103, 98, + 44, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10, +123, 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32, 97,108,112,104, 97, 41, + 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 84, 69, 88, 84, 85, 82, 69, 83, 32, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95,102,108,105,112, 95, 98, +108,101,110,100, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10, +123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 46,121,120,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, +116,117,114,101, 95, 98,108,101,110,100, 95,108,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, + 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10, 9,111,117,116,118, 97,108, 32, 61, 32, 40, 49, 46, 48, 43,118,101, 99, 46, +120, 41, 47, 50, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95, 98,108,101,110,100, 95,113,117, + 97,100, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, + 10, 9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41, 47, 50, 46, 48, 44, 32, + 48, 46, 48, 41, 59, 10, 9,111,117,116,118, 97,108, 32, 42, 61, 32,111,117,116,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, + 32,116,101,120,116,117,114,101, 95,119,111,111,100, 95,115,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32, +102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, + 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32, 97, 32, 61, 32,115,113,114,116, 40, +118,101, 99, 46,120, 42,118,101, 99, 46,120, 32, 43, 32,118,101, 99, 46,121, 42,118,101, 99, 46,121, 32, 43, 32,118,101, 99, 46, +122, 42,118,101, 99, 46,122, 41, 42, 50, 48, 46, 48, 59, 10, 9,102,108,111, 97,116, 32,119,105, 32, 61, 32, 48, 46, 53, 32, 43, + 32, 48, 46, 53, 42,115,105,110, 40, 97, 41, 59, 10, 10, 9,118, 97,108,117,101, 32, 61, 32,119,105, 59, 10, 9, 99,111,108,111, +114, 32, 61, 32,118,101, 99, 52, 40,119,105, 44, 32,119,105, 44, 32,119,105, 44, 32, 49, 46, 48, 41, 59, 10, 9,110,111,114,109, + 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105, +100, 32,116,101,120,116,117,114,101, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109,112,108,101, +114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, + 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 9, 99,111, +108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 40,118,101, 99, 46,120,121, 32, 43, 32,118, +101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 41, 42, 48, 46, 53, 41, 59, 10, 9,118, 97,108,117,101, 32, 61, 32, 49, 46, + 48, 59, 10, 10, 9,110,111,114,109, 97,108, 46,120, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46,114, 32, 45, 32, 48, + 46, 53, 41, 59, 10, 9,110,111,114,109, 97,108, 46,121, 32, 61, 32, 50, 46, 48, 42, 40, 48, 46, 53, 32, 45, 32, 99,111,108,111, +114, 46,103, 41, 59, 10, 9,110,111,114,109, 97,108, 46,122, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46, 98, 32, 45, + 32, 48, 46, 53, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 77, 84, 69, 88, 32, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111,114, 99, +111, 40,118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 41, 10,123, + 10, 9,111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95, +117,118, 40,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 41, 10,123, 10, 9, 47, + 42, 32,100,105,115, 97, 98,108,101,100, 32,102,111,114, 32,110,111,119, 44, 32,119,111,114,107,115, 32,116,111,103,101,116,104, +101,114, 32,119,105,116,104, 32,108,101, 97,118,105,110,103, 32,111,117,116, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112, +105,110,103, 10, 9, 32, 32, 32,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45, 32,118,101, + 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 32, 42, 47, 10, 9,117,118, 32, 61, 32,118,101, 99, + 51, 40, 97,116,116,117,118, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,110,111,114, +109, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97, +108, 41, 10,123, 10, 9, 47, 42, 32, 99,111,114,114,101,115,112,111,110,100,115, 32,116,111, 32,115,104,105, 45, 62,111,114,110, + 44, 32,119,104,105, 99,104, 32,105,115, 32,110,101,103, 97,116,101,100, 32,115,111, 32, 99, 97,110, 99,101,108,115, 10, 9, 32, + 32, 32,111,117,116, 32, 98,108,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,110,101,103, 97,116,105,111,110, 32, 42, 47, + 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,110,111,114,109, 97,108, 41, 59, + 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,116, 97,110,103,101,110,116, 40,118,101, 99, 52, 32,116, 97,110,103, +101,110,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116, 97,110,103,101,110,116, 41, 10,123, 10, 9,111,117,116, +116, 97,110,103,101,110,116, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,116, 97,110,103,101,110,116, 46,120,121,122, 41, + 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,103,108,111, 98, 97,108, 40,109, 97,116, 52, 32,118,105,101,119, +105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108, + 41, 10,123, 10, 9,103,108,111, 98, 97,108, 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40, 99, +111, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111, 98,106,101, + 99,116, 40,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,109, 97,116, 52, 32,111, 98,105,110,118,109, 97, +116, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111, 98,106,101, 99,116, 41, 10,123, 10, 9, +111, 98,106,101, 99,116, 32, 61, 32, 40,111, 98,105,110,118,109, 97,116, 42, 40,118,105,101,119,105,110,118,109, 97,116, 42,118, +101, 99, 52, 40, 99,111, 44, 32, 49, 46, 48, 41, 41, 41, 46,120,121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99, +111, 95,114,101,102,108, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118, +101, 99, 51, 32,114,101,102, 41, 10,123, 10, 9,114,101,102, 32, 61, 32,118,105,101,119, 32, 45, 32, 50, 46, 48, 42,100,111,116, + 40,118,110, 44, 32,118,105,101,119, 41, 42,118,110, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,110,111,114, +109, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97, +108, 41, 10,123, 10, 9, 47, 42, 32, 98,108,101,110,100,101,114, 32,114,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,105, +115, 32,110,101,103, 97,116,101,100, 32, 42, 47, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,109, 97, +108,105,122,101, 40,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 98, +108,101,110,100, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102, +108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32, +105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32, +102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,110, 99,111,108, 32, + 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10, +118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,109,117,108, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118, +101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, + 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99, +109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, + 97, 99,103, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99, +111,108, 41, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 99,114, +101,101,110, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108, +111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105, +110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, + 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, + 32,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99, 51, 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99,116, 42, + 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,116,101,120, 99,111,108, 41, 41, 42, 40,118,101, 99, 51, 40, 49, 46, 48, 41, + 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,111,118,101, +114,108, 97,121, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102, +108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32, +105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32, +102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10, 9,105,102, 40,111,117,116, + 99,111,108, 46,114, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46, +114, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 41, 59, 10, 9,101, +108,115,101, 10, 9, 9,105,110, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, + 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32, +111,117,116, 99,111,108, 46,114, 41, 59, 10, 10, 9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10, + 9, 9,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, + 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108, 46,103, + 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, + 32,116,101,120, 99,111,108, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 59, 10, 10, 9, +105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 10, 9, 9,105,110, 99,111,108, 46, 98, 32, 61, 32,111, +117,116, 99,111,108, 46, 98, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, + 98, 41, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99, +109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46, 98, 41, 41, 42, 40, + 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, + 98, 95,115,117, 98, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32, +102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, + 32,105,110, 99,111,108, 41, 10,123, 10, 9,105,110, 99,111,108, 32, 61, 32, 45,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101, +120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, + 97,100,100, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108, +111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105, +110, 99,111,108, 41, 10,123, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111, +108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,118, + 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, + 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111, +108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, + 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,102, 40,116,101,120, 99,111,108, 46, +114, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46, +114, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46,114, 47,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,102, 40, +116,101,120, 99,111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42, +111,117,116, 99,111,108, 46,103, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46,103, 47,116,101,120, 99,111,108, 46, +103, 59, 10, 9,105,102, 40,116,101,120, 99,111,108, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46, 98, 32, + 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46, 98, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46, 98, 47, +116,101,120, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,102,102, 40, +118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32, +102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, + 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, + 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99, +109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42, 97, 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116, + 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100, 97,114,107, 40,118,101, 99, 51, + 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, + 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, + 9,102,108,111, 97,116, 32,102, 97, 99,109, 44, 32, 99,111,108, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, + 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, + 42,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46,114, 41, 32,105, +110, 99,111,108, 46,114, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, + 99,111,108, 46,114, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102, + 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32, +101,108,115,101, 32,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10, 9, 99,111,108, 32, 61, 32, +102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46, + 98, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61, + 32,111,117,116, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,108,105,103,104, +116, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97, +116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99, +111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 44, 32, 99,111,108, 59, 10, 10, 9,102, 97, 99,116, 32, 42, + 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9, 99,111,108, 32, + 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111, +108, 46,114, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, + 32, 61, 32,111,117,116, 99,111,108, 46,114, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, +103, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, + 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10, 9, + 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46, 98, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111, +117,116, 99,111,108, 46, 98, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99, +111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, + 98, 95,104,117,101, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32, +102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, + 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95,104,117,101, 40,102, + 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, + 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, + 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 97,116, + 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, + 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111, +108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95,115, 97,116, 40,102, 97, 99,116, 42,102, + 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, + 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111, +108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,118, 97,108, 40,118,101, 99, 51, + 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, + 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, + 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95,118, 97,108, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32, +118,101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, + 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, + 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 99,111,108,111,114, 40,118,101, 99, 51, 32,111,117, 116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102, -108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,105,110, - 99,111,108, 32, 61, 32,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, - 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,118, 40,118,101, 99, 51, 32,111,117,116, 99,111, -108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97, -116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, - 32,102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, - 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,102, 40,116,101,120, 99,111,108, 46,114, 32, 33, 61, 32, 48, 46, 48, 41, 32,105, -110, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,102, 97, 99,116, 42,111,117, -116, 99,111,108, 46,114, 47,116,101,120, 99,111,108, 46,114, 59, 10, 9,105,102, 40,116,101,120, 99,111,108, 46,103, 32, 33, 61, - 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,103, 32, 43, 32, -102, 97, 99,116, 42,111,117,116, 99,111,108, 46,103, 47,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102, 40,116,101,120, 99, -111,108, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99, -111,108, 46, 98, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 46, 98, 47,116,101,120, 99,111,108, 46, 98, 59, 10,125, - 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,102,102, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, - 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, - 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32, -102, 97, 99,109, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, - 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32, -102, 97, 99,116, 42, 97, 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111, -105,100, 32,109,116,101,120, 95,114,103, 98, 95,100, 97,114,107, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, - 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99, -103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, - 44, 32, 99,111,108, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, - 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 59, 10, - 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46,114, 41, 32,105,110, 99,111,108, 46,114, 32, 61, 32, 99,111, -108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, 59, 10, 9, 99,111,108, - 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99, -111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, -103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, - 46, 98, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 46, 98, 41, 32,105,110, 99,111,108, 46, 98, 32, - 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 59, 10, -125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,108,105,103,104,116, 40,118,101, 99, 51, 32,111,117,116, 99, -111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, - 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97, -116, 32,102, 97, 99,109, 44, 32, 99,111,108, 59, 10, 10, 9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10, 9,102, 97, - 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99, -111,108, 46,114, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46,114, 41, 32,105,110, 99,111,108, 46, -114, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,114, - 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 59, 10, 9,105,102, 40, 99,111,108, 32, - 62, 32,111,117,116, 99,111,108, 46,103, 41, 32,105,110, 99,111,108, 46,103, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32, -105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 59, 10, 9, 99,111,108, 32, 61, 32,102, 97, 99,116, 42, -116,101,120, 99,111,108, 46, 98, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 46, 98, 41, 32,105,110, - 99,111,108, 46, 98, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 46, 98, 32, 61, 32,111,117,116, 99, -111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,104,117,101, 40,118,101, 99, 51, 32, -111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, - 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9, -118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95,104,117,101, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118, +108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, + 99, 52, 32, 99,111,108, 59, 10, 10, 9,109,105,120, 95, 99,111,108,111,114, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118, 101, 99, 52, 40,111,117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, - 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 97,116, 40,118,101, 99, 51, 32,111,117,116, 99,111, -108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97, -116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, - 99,111,108, 59, 10, 10, 9,109,105,120, 95,115, 97,116, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111, -117,116, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, - 99,111,108, 41, 59, 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118, -111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,118, 97,108, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, - 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99, -103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, - 10, 9,109,105,120, 95,118, 97,108, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, - 44, 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, - 10, 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109, -116,101,120, 95,114,103, 98, 95, 99,111,108,111,114, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32, -116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32, -111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111,108, 59, 10, 10, 9,109, -105,120, 95, 99,111,108,111,114, 40,102, 97, 99,116, 42,102, 97, 99,103, 44, 32,118,101, 99, 52, 40,111,117,116, 99,111,108, 44, - 32, 49, 46, 48, 41, 44, 32,118,101, 99, 52, 40,116,101,120, 99,111,108, 44, 32, 49, 46, 48, 41, 44, 32, 99,111,108, 41, 59, 10, - 9,105,110, 99,111,108, 46,114,103, 98, 32, 61, 32, 99,111,108, 46,114,103, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,116, -101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,105,110,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32, -102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 97, 99,109, 41, 10,123, 10, 9,102, - 97, 99,116, 32, 42, 61, 32, 97, 98,115, 40,102, 97, 99,103, 41, 59, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, - 99,116, 59, 10, 10, 9,105,102, 40,102, 97, 99,103, 32, 60, 32, 48, 46, 48, 41, 32,123, 10, 9, 9,102,108,111, 97,116, 32,116, -109,112, 32, 61, 32,102, 97, 99,116, 59, 10, 9, 9,102, 97, 99,116, 32, 61, 32,102, 97, 99,109, 59, 10, 9, 9,102, 97, 99,109, - 32, 61, 32,116,109,112, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 98,108, -101,110,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32, -102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97, -116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97, -108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,105,110, - 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 59, - 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,109,117,108, 40,102,108,111, 97,116, 32,111,117, -116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32, -102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9, -102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99, -116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, - 97, 99,103, 59, 10, 9,105,110, 99,111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99,111, -108, 41, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,115, 99, -114,101,101,110, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, - 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, - 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, - 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, - 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 10, 9,105,110, 99,111,108, 32, 61, 32, 49, 46, 48, 32, 45, - 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 41, 41, 42, 40, 49, - 46, 48, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, - 95,115,117, 98, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, - 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, - 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, - 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, - 97, 99,116, 32, 61, 32, 45,102, 97, 99,116, 59, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111, -108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 97, -100,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102, + 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,105,110,111,117,116, 32,102, +108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, + 32,102, 97, 99,109, 41, 10,123, 10, 9,102, 97, 99,116, 32, 42, 61, 32, 97, 98,115, 40,102, 97, 99,103, 41, 59, 10, 9,102, 97, + 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10, 9,105,102, 40,102, 97, 99,103, 32, 60, 32, 48, 46, 48, 41, 32, +123, 10, 9, 9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32,102, 97, 99,116, 59, 10, 9, 9,102, 97, 99,116, 32, 61, 32,102, + 97, 99,109, 59, 10, 9, 9,102, 97, 99,109, 32, 61, 32,116,109,112, 59, 10, 9,125, 10,125, 10, 10,118,111,105,100, 32,109,116, +101,120, 95,118, 97,108,117,101, 95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, + 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99, +103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99, +109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32, +102, 97, 99,109, 41, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,102, + 97, 99,109, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,109, +117,108, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102, 108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108, 117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99, -116, 32, 61, 32,102, 97, 99,116, 59, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, - 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,100,105,118, 40, -102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97, -116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, - 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95, -118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,105,102, 40,116,101,120, - 99,111,108, 32, 33, 61, 32, 48, 46, 48, 41, 10, 9, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111, -108, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 47,116,101,120, 99,111,108, 59, 10, 9,101,108,115,101, 10, 9, 9, -105,110, 99,111,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, -100,105,102,102, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, - 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, - 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, - 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,105, -110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42, 97, 98,115, 40,116,101, -120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108, -117,101, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99, -111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32, -102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101, -120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, - 10, 9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 59, 10, 9,105,102, 40, 99, -111,108, 32, 60, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105, -110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117, -101, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116,101,120, 99, -111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32, -102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9,109,116,101, -120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, - 10, 9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 59, 10, 9,105,102, 40, 99, -111,108, 32, 62, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, 99,111,108, 59, 32,101,108,115,101, 32,105, -110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117, -101, 95, 99,108, 97,109,112, 95,112,111,115,105,116,105,118,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32, -102,108,111, 97,116, 32,111,117,116,102, 97, 99, 41, 10,123, 10, 9,111,117,116,102, 97, 99, 32, 61, 32,109, 97,120, 40,102, 97, - 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 99,108, 97,109, -112, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,102, 97, 99, 41, 10,123, - 10, 9,111,117,116,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, - 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,104, 97,114, 95,100,105,118,105,100,101, 40,102,108,111, 97,116, 32,104, - 97,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41, 10,123, 10, 9,111,117,116,104, 97,114, 32, - 61, 32,104, 97,114, 47, 49, 50, 56, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,104, 97,114, 95,109,117, -108,116,105,112,108,121, 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,104, 97,114, 44, 32,111,117,116, 32,102,108,111, 97, -116, 32,111,117,116,104, 97,114, 41, 10,123, 10, 9,104, 97,114, 32, 42, 61, 32, 49, 50, 56, 46, 48, 59, 10, 10, 9,105,102, 40, -104, 97,114, 32, 60, 32, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, 32, 49, 46, 48, 59, 10, 9,101,108,115,101, 32,105, -102, 40,104, 97,114, 32, 62, 32, 53, 49, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, 32, 53, 49, 49, 46, 48, 59, 10, 9, -101,108,115,101, 32,111,117,116,104, 97,114, 32, 61, 32,104, 97,114, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, - 97,108,112,104, 97, 95,102,114,111,109, 95, 99,111,108, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,102,108,111, - 97,116, 32, 97,108,112,104, 97, 41, 10,123, 10, 9, 97,108,112,104, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 10,125, 10, 10,118, -111,105,100, 32,109,116,101,120, 95, 97,108,112,104, 97, 95,116,111, 95, 99,111,108, 40,118,101, 99, 52, 32, 99,111,108, 44, 32, -102,108,111, 97,116, 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10, - 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 99,111,108, 46,114,103, 98, 44, 32, 97,108,112,104, 97, 41, 59, 10, -125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98,116,111,105,110,116, 40,118,101, 99, 52, 32,114,103, 98, 44, 32, -111,117,116, 32,102,108,111, 97,116, 32,105,110,116,101,110,115,105,116,121, 41, 10,123, 10, 9,105,110,116,101,110,115,105,116, -121, 32, 61, 32,100,111,116, 40,118,101, 99, 51, 40, 48, 46, 51, 53, 44, 32, 48, 46, 52, 53, 44, 32, 48, 46, 50, 41, 44, 32,114, -103, 98, 46,114,103, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,105,110,118,101, -114,116, 40,102,108,111, 97,116, 32,105,110,118, 97,108,117,101, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, - 97,108,117,101, 41, 10,123, 10, 9,111,117,116,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 32, 45, 32,105,110,118, 97,108,117, -101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,105,110,118,101,114,116, 40,118,101, 99, 52, 32, -105,110,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10, 9,111,117,116,114,103, - 98, 32, 61, 32,118,101, 99, 52, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,105,110,114,103, 98, 46,114,103, 98, 44, 32, -105,110,114,103, 98, 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,115,116,101, -110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,102,108,111, 97,116, 32,105,110,116,101,110,115, -105,116,121, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108, 44, 32,111,117,116, 32,102, -108,111, 97,116, 32,111,117,116,105,110,116,101,110,115,105,116,121, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,116, - 32, 61, 32,105,110,116,101,110,115,105,116,121, 59, 10, 9,111,117,116,105,110,116,101,110,115,105,116,121, 32, 61, 32,105,110, -116,101,110,115,105,116,121, 42,115,116,101,110, 99,105,108, 59, 10, 9,111,117,116,115,116,101,110, 99,105,108, 32, 61, 32,115, -116,101,110, 99,105,108, 42,102, 97, 99,116, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115,116, -101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,118,101, 99, 52, 32,114,103, 98, 44, 32,111, -117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117, -116,114,103, 98, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,116, 32, 61, 32,114,103, 98, 46, 97, 59, 10, 9,111,117, -116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32,114,103, 98, 46, 97, 42,115,116,101,110, 99, -105,108, 41, 59, 10, 9,111,117,116,115,116,101,110, 99,105,108, 32, 61, 32,115,116,101,110, 99,105,108, 42,102, 97, 99,116, 59, - 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,111,102,115, 40,118,101, 99, 51, 32,116, -101,120, 99,111, 44, 32,118,101, 99, 51, 32,111,102,115, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116,101,120, 99, -111, 41, 10,123, 10, 9,111,117,116,116,101,120, 99,111, 32, 61, 32,116,101,120, 99,111, 32, 43, 32,111,102,115, 59, 10,125, 10, - 10,118,111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,115,105,122,101, 40,118,101, 99, 51, 32,116,101,120, - 99,111, 44, 32,118,101, 99, 51, 32,115,105,122,101, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116,101,120, 99,111, - 41, 10,123, 10, 9,111,117,116,116,101,120, 99,111, 32, 61, 32,115,105,122,101, 42,116,101,120, 99,111, 59, 10,125, 10, 10,118, -111,105,100, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117, -116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40, -118,101, 99, 46,120,121, 42, 48, 46, 53, 32, 43, 32,118,101, 99, 50, 40, 48, 46, 53, 44, 32, 48, 46, 53, 41, 44, 32,118,101, 99, - 46,122, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32,116,101,120, - 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108, -117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 41, 10,123, 10, 9, 99,111,108,111,114, 32, 61, 32,116, -101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,118, 97,108,117,101, 32, - 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,111,114,109, 97,108, 40,118,101, 99, 51, 32, -116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110, -111,114,109, 97,108, 41, 10,123, 10, 32, 32, 32, 32,118,101, 99, 52, 32, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114, -101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,110,111,114,109, 97,108, 32, 61, 32, 50, 46, - 48, 42, 40,118,101, 99, 51, 40, 99,111,108,111,114, 46,114, 44, 32, 45, 99,111,108,111,114, 46,103, 44, 32, 99,111,108,111,114, - 46, 98, 41, 32, 45, 32,118,101, 99, 51, 40, 48, 46, 53, 44, 32, 45, 48, 46, 53, 44, 32, 48, 46, 53, 41, 41, 59, 10,125, 10, 10, -118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,110,111,114,109, 97,108,115, 95,105,110,105,116, 40, 32,118,101, 99, - 51, 32,118, 78, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78,111,114,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, - 78, 97, 99, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 32, 41, - 10,123, 10, 9,118, 78,111,114,103, 32, 61, 32,118, 78, 59, 10, 9,118, 78, 97, 99, 99, 32, 61, 32,118, 78, 59, 10, 9,102, 80, -114,101,118, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10, 47, 42, 42, 32,104,101,108,112,101, -114, 32,109,101,116,104,111,100, 32,116,111, 32,101,120,116,114, 97, 99,116, 32,116,104,101, 32,117,112,112,101,114, 32,108,101, -102,116, 32, 51,120, 51, 32,109, 97,116,114,105,120, 32,102,114,111,109, 32, 97, 32, 52,120, 52, 32,109, 97,116,114,105,120, 32, - 42, 47, 10,109, 97,116, 51, 32,116,111, 95,109, 97,116, 51, 40,109, 97,116, 52, 32,109, 52, 41, 10,123, 10, 9,109, 97,116, 51, - 32,109, 51, 59, 10, 9,109, 51, 91, 48, 93, 32, 61, 32,109, 52, 91, 48, 93, 46,120,121,122, 59, 10, 9,109, 51, 91, 49, 93, 32, - 61, 32,109, 52, 91, 49, 93, 46,120,121,122, 59, 10, 9,109, 51, 91, 50, 93, 32, 61, 32,109, 52, 91, 50, 93, 46,120,121,122, 59, - 10, 9,114,101,116,117,114,110, 32,109, 51, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,105, -110,105,116, 95,111, 98,106,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44, 32,118,101, 99, - 51, 32,115,117,114,102, 95,110,111,114,109, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,109, 97,116, 52, 32,109, 86,105,101,119, - 44, 32,109, 97,116, 52, 32,109, 86,105,101,119, 73,110,118, 44, 32,109, 97,116, 52, 32,109, 79, 98,106, 44, 32,109, 97,116, 52, - 32,109, 79, 98,106, 73,110,118, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, - 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, - 9, 9, 9, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117, -116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, - 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,111,117,116, - 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10, 9,109, 97,116, 51, 32,111, 98,106, 50,118,105,101,119, 32, - 61, 32,116,111, 95,109, 97,116, 51, 40,109, 86,105,101,119, 32, 42, 32,109, 79, 98,106, 41, 59, 10, 9,109, 97,116, 51, 32,118, -105,101,119, 50,111, 98,106, 32, 61, 32,116,111, 95,109, 97,116, 51, 40,109, 79, 98,106, 73,110,118, 32, 42, 32,109, 86,105,101, -119, 73,110,118, 41, 59, 10, 9, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,118,105,101,119, 50,111, 98, -106, 32, 42, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 83,105,103, -109, 97, 84, 32, 61, 32,118,105,101,119, 50,111, 98,106, 32, 42, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32, - 41, 59, 10, 9,118,101, 99, 51, 32,118, 78, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32,115,117,114,102, 95,110,111, -114,109, 32, 42, 32,111, 98,106, 50,118,105,101,119, 32, 41, 59, 10, 10, 9,118, 82, 49, 32, 61, 32, 99,114,111,115,115, 40, 32, -118, 83,105,103,109, 97, 84, 44, 32,118, 78, 32, 41, 59, 10, 9,118, 82, 50, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 78, 44, - 32,118, 83,105,103,109, 97, 83, 32, 41, 32, 59, 10, 9,102, 68,101,116, 32, 61, 32,100,111,116, 32, 40, 32,118, 83,105,103,109, - 97, 83, 44, 32,118, 82, 49, 32, 41, 59, 10, 9, 10, 9, 47, 42, 32,112,114,101,116,114, 97,110,115,102,111,114,109, 32,118, 78, - 97, 99, 99, 32, 40,105,110, 32,109,116,101,120, 95, 98,117,109,112, 95, 97,112,112,108,121, 41, 32,117,115,105,110,103, 32,116, -104,101, 32,105,110,118,101,114,115,101, 32,116,114, 97,110,115,112,111,115,101,100, 32, 42, 47, 10, 9,118, 82, 49, 32, 61, 32, -118, 82, 49, 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 10, 9,118, 82, 50, 32, 61, 32,118, 82, 50, 32, 42, 32,118,105,101, -119, 50,111, 98,106, 59, 10, 9,118, 78, 32, 61, 32,118, 78, 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 10, 9, 10, 9,102, -108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 32, 42, 32,108,101, -110,103,116,104, 40,118, 78, 41, 59, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, - 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105, -110, 41, 59, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 32, 61, 32,102, 77, 97,103,110,105, -116,117,100,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,105,110,105,116, 95,116,101,120, -116,117,114,101,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44, 32,118,101, 99, 51, 32,115, -117,114,102, 95,110,111,114,109, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32,102,108,111, 97,116, 32,102, 80,114,101,118, - 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, - 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95, -111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32, 10, 9, 9, 9, 9, 9, 9, - 9, 9, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 50, 44, 32, -111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, - 83, 32, 61, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 83,105,103, -109, 97, 84, 32, 61, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 78, - 32, 61, 32,115,117,114,102, 95,110,111,114,109, 59, 32, 47, 42, 32,110,111,114,109, 97,108,105,122,101,100, 32,105,110,116,101, -114,112,111,108, 97,116,101,100, 32,118,101,114,116,101,120, 32,110,111,114,109, 97,108, 32, 42, 47, 10, 9, 10, 9,118, 82, 49, - 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97, 84, 44, 32,118, 78, - 32, 41, 32, 41, 59, 10, 9,118, 82, 50, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32, 99,114,111,115,115, 40, 32,118, - 78, 44, 32,118, 83,105,103,109, 97, 83, 32, 41, 32, 41, 59, 10, 9,102, 68,101,116, 32, 61, 32,115,105,103,110, 40, 32,100,111, -116, 40,118, 83,105,103,109, 97, 83, 44, 32,118, 82, 49, 41, 32, 41, 59, 10, 9, 10, 9,102,108,111, 97,116, 32,102, 77, 97,103, -110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 59, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, - 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77, - 97,103,110,105,116,117,100,101, 95,105,110, 41, 59, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117, -116, 32, 61, 32,102, 77, 97,103,110,105,116,117,100,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109, -112, 95,105,110,105,116, 95,118,105,101,119,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95,112,111,115, 44, - 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,102,108,111, 97, -116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95, -105,110, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103, -110,105,116,117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32, - 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32,118,101, 99, - 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10, 9,118,101, 99, 51, - 32,118, 83,105,103,109, 97, 83, 32, 61, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, - 99, 51, 32,118, 83,105,103,109, 97, 84, 32, 61, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9, -118,101, 99, 51, 32,118, 78, 32, 61, 32,115,117,114,102, 95,110,111,114,109, 59, 32, 47, 42, 32,110,111,114,109, 97,108,105,122, -101,100, 32,105,110,116,101,114,112,111,108, 97,116,101,100, 32,118,101,114,116,101,120, 32,110,111,114,109, 97,108, 32, 42, 47, - 10, 9, 10, 9,118, 82, 49, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97, 84, 44, 32,118, 78, 32, 41, 59, 10, - 9,118, 82, 50, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,105,103,109, 97, 83, 32, 41, 32, 59, 10, 9,102, - 68,101,116, 32, 61, 32,100,111,116, 32, 40, 32,118, 83,105,103,109, 97, 83, 44, 32,118, 82, 49, 32, 41, 59, 10, 9, 10, 9,102, -108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 59, 10, 9,118, 78, - 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, - 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 41, 59, 10, 9,102, 80,114,101,118, 77, 97,103, -110,105,116,117,100,101, 95,111,117,116, 32, 61, 32,102, 77, 97,103,110,105,116,117,100,101, 59, 10,125, 10, 10,118,111,105,100, - 32,109,116,101,120, 95, 98,117,109,112, 95,116, 97,112, 51, 40, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109, -112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,102,108,111, 97,116, 32,104, 83, 99, 97,108,101, 44, 32, 10, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,111, -117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41, 32, 10,123, 10, 9,118,101, 99, 50, 32, 83, 84,108,108, 32, 61, 32,116, -101,120, 99,111, 46,120,121, 59, 10, 9,118,101, 99, 50, 32, 83, 84,108,114, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, - 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,117,108, 32, 61, 32,116, -101,120, 99,111, 46,120,121, 32, 43, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 32, 59, 10, 9, 10, 9,102,108, -111, 97,116, 32, 72,108,108, 44, 72,108,114, 44, 72,117,108, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117, -114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108,108, 41, 44, 32, 72,108,108, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, - 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108,114, 41, 44, 32, 72,108,114, 32, 41, 59, 10, 9, -114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,117,108, 41, 44, 32, 72, -117,108, 32, 41, 59, 10, 9, 10, 9,100, 66,115, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,108,114, 32, 45, 32, 72, -108,108, 41, 59, 10, 9,100, 66,116, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,117,108, 32, 45, 32, 72,108,108, 41, - 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,116, 97,112, 53, 40, 32,118,101, 99, 51, 32,116, -101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,102,108,111, 97,116, 32,104, 83, 99, 97,108, -101, 44, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116, 32,102,108,111, - 97,116, 32,100, 66,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41, 32, 10,123, 10, 9,118,101, 99, 50, - 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9,118,101, 99, 50, 32, 84, -101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 10, 9,118,101, 99, 50, 32, 83, 84, - 99, 32, 61, 32,116,101,120, 99,111, 46,120,121, 59, 10, 9,118,101, 99, 50, 32, 83, 84,108, 32, 61, 32,116,101,120, 99,111, 46, -120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120, 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,114, 32, 61, 32,116, -101,120, 99,111, 46,120,121, 32, 43, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120, 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84, -100, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,121, 32, 59, 10, 9,118,101, - 99, 50, 32, 83, 84,117, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,121, 32, - 59, 10, 9, 10, 9,102,108,111, 97,116, 32, 72, 99, 44, 72,108, 44, 72,114, 44, 72,100, 44, 72,117, 59, 10, 9,114,103, 98,116, -111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84, 99, 41, 44, 32, 72, 99, 32, 41, 59, 10, - 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108, 41, 44, 32, 72, -108, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84, -114, 41, 44, 32, 72,114, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, - 97, 44, 32, 83, 84,100, 41, 44, 32, 72,100, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, - 50, 68, 40,105,109, 97, 44, 32, 83, 84,117, 41, 44, 32, 72,117, 32, 41, 59, 10, 9, 10, 9,100, 66,115, 32, 61, 32,104, 83, 99, - 97,108,101, 32, 42, 32, 40, 72,114, 32, 45, 32, 72,108, 41, 59, 10, 9,100, 66,116, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, - 32, 40, 72,117, 32, 45, 32, 72,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95, 97,112, -112,108,121, 40, 32,102,108,111, 97,116, 32,102, 68,101,116, 44, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,102,108,111, 97, -116, 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,118,101, 99, 51, 32, -118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95, -111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 41, 32, 10, -123, 10, 9,118,101, 99, 51, 32,118, 83,117,114,102, 71,114, 97,100, 32, 61, 32,115,105,103,110, 40,102, 68,101,116, 41, 32, 42, - 32, 40, 32,100, 66,115, 32, 42, 32,118, 82, 49, 32, 43, 32,100, 66,116, 32, 42, 32,118, 82, 50, 32, 41, 59, 10, 9, 10, 9,118, - 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 45, 32,118, 83,117,114,102, 71,114, 97,100, 59, - 10, 9,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32,118, 78, - 97, 99, 99, 95,111,117,116, 32, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95, 97,112,112, -108,121, 95,116,101,120,115,112, 97, 99,101, 40, 32,102,108,111, 97,116, 32,102, 68,101,116, 44, 32,102,108,111, 97,116, 32,100, - 66,115, 44, 32,102,108,111, 97,116, 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,118,101, 99, 51, 32,118, 82, - 50, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,102,108,111, - 97,116, 32,105,109, 97, 95,120, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,121, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, - 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111, -117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 41, 32, 10,123, - 10, 9,118,101, 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9, -118,101, 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, 59, 10, 10, 9,118, -101, 99, 51, 32,118, 83,117,114,102, 71,114, 97,100, 32, 61, 32,115,105,103,110, 40,102, 68,101,116, 41, 32, 42, 32, 40, 32, 10, - 9, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,100, 66,115, 32, 47, 32,108,101,110,103,116,104, 40, 32,118,101, 99, 50, 40, -105,109, 97, 95,120, 42, 84,101,120, 68,120, 46,120, 44, 32,105,109, 97, 95,121, 42, 84,101,120, 68,120, 46,121, 41, 32, 41, 32, - 42, 32,118, 82, 49, 32, 43, 32, 10, 9, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,100, 66,116, 32, 47, 32,108,101,110,103, -116,104, 40, 32,118,101, 99, 50, 40,105,109, 97, 95,120, 42, 84,101,120, 68,121, 46,120, 44, 32,105,109, 97, 95,121, 42, 84,101, -120, 68,121, 46,121, 41, 32, 41, 32, 42, 32,118, 82, 50, 32, 41, 59, 10, 9, 9, 9, 9, 10, 9,118, 78, 97, 99, 99, 95,111,117, -116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 45, 32,118, 83,117,114,102, 71,114, 97,100, 59, 10, 9,112,101,114,116,117, -114, 98,101,100, 95,110,111,114,109, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32,118, 78, 97, 99, 99, 95,111,117,116, - 32, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,101,103, 97,116,101, 95,116,101,120,110,111,114,109, 97, -108, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97, -108, 41, 10,123, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,118,101, 99, 51, 40, 45,110,111,114,109, 97,108, 46,120, - 44, 32, 45,110,111,114,109, 97,108, 46,121, 44, 32,110,111,114,109, 97,108, 46,122, 41, 59, 10,125, 10, 10,118,111,105,100, 32, -109,116,101,120, 95,110,115,112, 97, 99,101, 95,116, 97,110,103,101,110,116, 40,118,101, 99, 51, 32,116, 97,110,103,101,110,116, - 44, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,118,101, 99, 51, 32,116,101,120,110,111,114,109, 97,108, 44, 32,111, -117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,116, 97,110,103,101,110,116, 32, 61, 32, -110,111,114,109, 97,108,105,122,101, 40,116, 97,110,103,101,110,116, 41, 59, 10, 9,118,101, 99, 51, 32, 66, 32, 61, 32, 99,114, -111,115,115, 40,110,111,114,109, 97,108, 44, 32,116, 97,110,103,101,110,116, 41, 59, 10, 10, 9,111,117,116,110,111,114,109, 97, -108, 32, 61, 32,116,101,120,110,111,114,109, 97,108, 46,120, 42,116, 97,110,103,101,110,116, 32, 43, 32,116,101,120,110,111,114, +109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 10, 9,105,110, 99,111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, + 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 41, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116, +101,120, 95,118, 97,108,117,101, 95,115, 99,114,101,101,110, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108, +111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, + 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, + 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, + 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,103, 59, 10, 9,105,110, + 99,111,108, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32, +116,101,120, 99,111,108, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, + 32,109,116,101,120, 95,118, 97,108,117,101, 95,115,117, 98, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108, +111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, + 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, + 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, + 32,102, 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,116, 32, 61, 32, 45,102, 97, 99,116, 59, 10, 9,105,110, 99,111,108, 32, 61, + 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109, +116,101,120, 95,118, 97,108,117,101, 95, 97,100,100, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97, +116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, + 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, + 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, + 97, 99,109, 41, 59, 10, 10, 9,102, 97, 99,116, 32, 61, 32,102, 97, 99,116, 59, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, + 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, + 95,118, 97,108,117,101, 95,100,105,118, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108,111, 97,116, 32,116, +101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111, +117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 9, +109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, 32,102, 97, 99,109, + 41, 59, 10, 10, 9,105,102, 40,116,101,120, 99,111,108, 32, 33, 61, 32, 48, 46, 48, 41, 10, 9, 9,105,110, 99,111,108, 32, 61, + 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32,102, 97, 99,116, 42,111,117,116, 99,111,108, 47,116,101,120, 99,111, +108, 59, 10, 9,101,108,115,101, 10, 9, 9,105,110, 99,111,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32, +109,116,101,120, 95,118, 97,108,117,101, 95,100,105,102,102, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, 32,102,108, +111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, + 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, + 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, 99,103, 44, + 32,102, 97, 99,109, 41, 59, 10, 10, 9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 32, 43, 32, +102, 97, 99,116, 42, 97, 98,115, 40,116,101,120, 99,111,108, 32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111, +105,100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, + 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, + 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, + 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, + 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101, +120, 99,111,108, 59, 10, 9,105,102, 40, 99,111,108, 32, 60, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, + 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105, +100, 32,109,116,101,120, 95,118, 97,108,117,101, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,111,117,116, 99,111,108, 44, + 32,102,108,111, 97,116, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, + 32,102, 97, 99,103, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110, 99,111,108, 41, 10,123, 10, 9,102,108,111, 97,116, + 32,102, 97, 99,109, 59, 10, 9,109,116,101,120, 95,118, 97,108,117,101, 95,118, 97,114,115, 40,102, 97, 99,116, 44, 32,102, 97, + 99,103, 44, 32,102, 97, 99,109, 41, 59, 10, 10, 9,102,108,111, 97,116, 32, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,116,101, +120, 99,111,108, 59, 10, 9,105,102, 40, 99,111,108, 32, 62, 32,111,117,116, 99,111,108, 41, 32,105,110, 99,111,108, 32, 61, 32, + 99,111,108, 59, 32,101,108,115,101, 32,105,110, 99,111,108, 32, 61, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105, +100, 32,109,116,101,120, 95,118, 97,108,117,101, 95, 99,108, 97,109,112, 95,112,111,115,105,116,105,118,101, 40,102,108,111, 97, +116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,102, 97, 99, 41, 10,123, 10, 9,111,117,116,102, + 97, 99, 32, 61, 32,109, 97,120, 40,102, 97, 99, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, + 95,118, 97,108,117,101, 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,111,117,116, 32,102,108,111, 97, +116, 32,111,117,116,102, 97, 99, 41, 10,123, 10, 9,111,117,116,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, + 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,104, 97,114, 95,100,105,118, +105,100,101, 40,102,108,111, 97,116, 32,104, 97,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41, + 10,123, 10, 9,111,117,116,104, 97,114, 32, 61, 32,104, 97,114, 47, 49, 50, 56, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32, +109,116,101,120, 95,104, 97,114, 95,109,117,108,116,105,112,108,121, 95, 99,108, 97,109,112, 40,102,108,111, 97,116, 32,104, 97, +114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,104, 97,114, 41, 10,123, 10, 9,104, 97,114, 32, 42, 61, 32, 49, + 50, 56, 46, 48, 59, 10, 10, 9,105,102, 40,104, 97,114, 32, 60, 32, 49, 46, 48, 41, 32,111,117,116,104, 97,114, 32, 61, 32, 49, + 46, 48, 59, 10, 9,101,108,115,101, 32,105,102, 40,104, 97,114, 32, 62, 32, 53, 49, 49, 46, 48, 41, 32,111,117,116,104, 97,114, + 32, 61, 32, 53, 49, 49, 46, 48, 59, 10, 9,101,108,115,101, 32,111,117,116,104, 97,114, 32, 61, 32,104, 97,114, 59, 10,125, 10, + 10,118,111,105,100, 32,109,116,101,120, 95, 97,108,112,104, 97, 95,102,114,111,109, 95, 99,111,108, 40,118,101, 99, 52, 32, 99, +111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 41, 10,123, 10, 9, 97,108,112,104, 97, 32, 61, 32, + 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 97,108,112,104, 97, 95,116,111, 95, 99,111,108, + 40,118,101, 99, 52, 32, 99,111,108, 44, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, + 32,111,117,116, 99,111,108, 41, 10,123, 10, 9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 99,111,108, 46,114,103, + 98, 44, 32, 97,108,112,104, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98,116,111,105,110,116, + 40,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,105,110,116,101,110,115,105,116,121, 41, 10, +123, 10, 9,105,110,116,101,110,115,105,116,121, 32, 61, 32,100,111,116, 40,118,101, 99, 51, 40, 48, 46, 51, 53, 44, 32, 48, 46, + 52, 53, 44, 32, 48, 46, 50, 41, 44, 32,114,103, 98, 46,114,103, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, + 95,118, 97,108,117,101, 95,105,110,118,101,114,116, 40,102,108,111, 97,116, 32,105,110,118, 97,108,117,101, 44, 32,111,117,116, + 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,117,101, 41, 10,123, 10, 9,111,117,116,118, 97,108,117,101, 32, 61, 32, 49, + 46, 48, 32, 45, 32,105,110,118, 97,108,117,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,105, +110,118,101,114,116, 40,118,101, 99, 52, 32,105,110,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, + 98, 41, 10,123, 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32, +105,110,114,103, 98, 46,114,103, 98, 44, 32,105,110,114,103, 98, 46, 97, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101, +120, 95,118, 97,108,117,101, 95,115,116,101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32,102, +108,111, 97,116, 32,105,110,116,101,110,115,105,116,121, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101, +110, 99,105,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,105,110,116,101,110,115,105,116,121, 41, 10,123, 10, + 9,102,108,111, 97,116, 32,102, 97, 99,116, 32, 61, 32,105,110,116,101,110,115,105,116,121, 59, 10, 9,111,117,116,105,110,116, +101,110,115,105,116,121, 32, 61, 32,105,110,116,101,110,115,105,116,121, 42,115,116,101,110, 99,105,108, 59, 10, 9,111,117,116, +115,116,101,110, 99,105,108, 32, 61, 32,115,116,101,110, 99,105,108, 42,102, 97, 99,116, 59, 10,125, 10, 10,118,111,105,100, 32, +109,116,101,120, 95,114,103, 98, 95,115,116,101,110, 99,105,108, 40,102,108,111, 97,116, 32,115,116,101,110, 99,105,108, 44, 32, +118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,115,116,101,110, 99,105,108, 44, 32, +111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,123, 10, 9,102,108,111, 97,116, 32,102, 97, 99,116, 32, 61, + 32,114,103, 98, 46, 97, 59, 10, 9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32, +114,103, 98, 46, 97, 42,115,116,101,110, 99,105,108, 41, 59, 10, 9,111,117,116,115,116,101,110, 99,105,108, 32, 61, 32,115,116, +101,110, 99,105,108, 42,102, 97, 99,116, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, + 95,111,102,115, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,118,101, 99, 51, 32,111,102,115, 44, 32,111,117,116, 32,118, +101, 99, 51, 32,111,117,116,116,101,120, 99,111, 41, 10,123, 10, 9,111,117,116,116,101,120, 99,111, 32, 61, 32,116,101,120, 99, +111, 32, 43, 32,111,102,115, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,109, 97,112,112,105,110,103, 95,115,105, +122,101, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,118,101, 99, 51, 32,115,105,122,101, 44, 32,111,117,116, 32,118,101, + 99, 51, 32,111,117,116,116,101,120, 99,111, 41, 10,123, 10, 9,111,117,116,116,101,120, 99,111, 32, 61, 32,115,105,122,101, 42, +116,101,120, 99,111, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,105,110,103, 40,118, +101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10, 9,111,117,116, +118,101, 99, 32, 61, 32,118,101, 99, 51, 40,118,101, 99, 46,120,121, 42, 48, 46, 53, 32, 43, 32,118,101, 99, 50, 40, 48, 46, 53, + 44, 32, 48, 46, 53, 41, 44, 32,118,101, 99, 46,122, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,105,109, 97, +103,101, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117, +116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 41, 10,123, + 10, 9, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120, +121, 41, 59, 10, 9,118, 97,108,117,101, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110, +111,114,109, 97,108, 40,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, + 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10, 32, 32, 32, 32,118,101, 99, 52, 32, 99,111,108, +111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32,116,101,120, 99,111, 46,120,121, 41, 59, 10, 9, +110,111,114,109, 97,108, 32, 61, 32, 50, 46, 48, 42, 40,118,101, 99, 51, 40, 99,111,108,111,114, 46,114, 44, 32, 45, 99,111,108, +111,114, 46,103, 44, 32, 99,111,108,111,114, 46, 98, 41, 32, 45, 32,118,101, 99, 51, 40, 48, 46, 53, 44, 32, 45, 48, 46, 53, 44, + 32, 48, 46, 53, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,110,111,114,109, 97,108, +115, 95,105,110,105,116, 40, 32,118,101, 99, 51, 32,118, 78, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78,111,114,103, 44, + 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, + 77, 97,103,110,105,116,117,100,101, 32, 41, 10,123, 10, 9,118, 78,111,114,103, 32, 61, 32,118, 78, 59, 10, 9,118, 78, 97, 99, + 99, 32, 61, 32,118, 78, 59, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 49, 46, 48, 59, 10,125, + 10, 10, 47, 42, 42, 32,104,101,108,112,101,114, 32,109,101,116,104,111,100, 32,116,111, 32,101,120,116,114, 97, 99,116, 32,116, +104,101, 32,117,112,112,101,114, 32,108,101,102,116, 32, 51,120, 51, 32,109, 97,116,114,105,120, 32,102,114,111,109, 32, 97, 32, + 52,120, 52, 32,109, 97,116,114,105,120, 32, 42, 47, 10,109, 97,116, 51, 32,116,111, 95,109, 97,116, 51, 40,109, 97,116, 52, 32, +109, 52, 41, 10,123, 10, 9,109, 97,116, 51, 32,109, 51, 59, 10, 9,109, 51, 91, 48, 93, 32, 61, 32,109, 52, 91, 48, 93, 46,120, +121,122, 59, 10, 9,109, 51, 91, 49, 93, 32, 61, 32,109, 52, 91, 49, 93, 46,120,121,122, 59, 10, 9,109, 51, 91, 50, 93, 32, 61, + 32,109, 52, 91, 50, 93, 46,120,121,122, 59, 10, 9,114,101,116,117,114,110, 32,109, 51, 59, 10,125, 10, 10,118,111,105,100, 32, +109,116,101,120, 95, 98,117,109,112, 95,105,110,105,116, 95,111, 98,106,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117, +114,102, 95,112,111,115, 44, 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, + 32,109, 97,116, 52, 32,109, 86,105,101,119, 44, 32,109, 97,116, 52, 32,109, 86,105,101,119, 73,110,118, 44, 32,109, 97,116, 52, + 32,109, 79, 98,106, 44, 32,109, 97,116, 52, 32,109, 79, 98,106, 73,110,118, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,102, +108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, 97, + 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, + 97,103,110,105,116,117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, + 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, 32,118,101, + 99, 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10, 9,109, 97,116, + 51, 32,111, 98,106, 50,118,105,101,119, 32, 61, 32,116,111, 95,109, 97,116, 51, 40,109, 86,105,101,119, 32, 42, 32,109, 79, 98, +106, 41, 59, 10, 9,109, 97,116, 51, 32,118,105,101,119, 50,111, 98,106, 32, 61, 32,116,111, 95,109, 97,116, 51, 40,109, 79, 98, +106, 73,110,118, 32, 42, 32,109, 86,105,101,119, 73,110,118, 41, 59, 10, 9, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, + 83, 32, 61, 32,118,105,101,119, 50,111, 98,106, 32, 42, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, + 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 84, 32, 61, 32,118,105,101,119, 50,111, 98,106, 32, 42, 32,100, 70,100,121, + 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 78, 32, 61, 32,110,111,114,109, 97,108,105, +122,101, 40, 32,115,117,114,102, 95,110,111,114,109, 32, 42, 32,111, 98,106, 50,118,105,101,119, 32, 41, 59, 10, 10, 9,118, 82, + 49, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 83,105,103,109, 97, 84, 44, 32,118, 78, 32, 41, 59, 10, 9,118, 82, 50, 32, 61, + 32, 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,105,103,109, 97, 83, 32, 41, 32, 59, 10, 9,102, 68,101,116, 32, 61, 32, +100,111,116, 32, 40, 32,118, 83,105,103,109, 97, 83, 44, 32,118, 82, 49, 32, 41, 59, 10, 9, 10, 9, 47, 42, 32,112,114,101,116, +114, 97,110,115,102,111,114,109, 32,118, 78, 97, 99, 99, 32, 40,105,110, 32,109,116,101,120, 95, 98,117,109,112, 95, 97,112,112, +108,121, 41, 32,117,115,105,110,103, 32,116,104,101, 32,105,110,118,101,114,115,101, 32,116,114, 97,110,115,112,111,115,101,100, + 32, 42, 47, 10, 9,118, 82, 49, 32, 61, 32,118, 82, 49, 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 10, 9,118, 82, 50, 32, + 61, 32,118, 82, 50, 32, 42, 32,118,105,101,119, 50,111, 98,106, 59, 10, 9,118, 78, 32, 61, 32,118, 78, 32, 42, 32,118,105,101, +119, 50,111, 98,106, 59, 10, 9, 10, 9,102,108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115, + 40,102, 68,101,116, 41, 32, 42, 32,108,101,110,103,116,104, 40,118, 78, 41, 59, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, + 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118, + 77, 97,103,110,105,116,117,100,101, 95,105,110, 41, 59, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111, +117,116, 32, 61, 32,102, 77, 97,103,110,105,116,117,100,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117, +109,112, 95,105,110,105,116, 95,116,101,120,116,117,114,101,115,112, 97, 99,101, 40, 32,118,101, 99, 51, 32,115,117,114,102, 95, +112,111,115, 44, 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32, +102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32,118,101, 99, 51, 32,118, 78, + 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 80,114,101, +118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111, +117,116, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,111,117,116, + 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, 32, 41, 32, 10,123, 10, 9, +118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,100, 70,100,120, 40, 32,115,117,114,102, 95,112,111,115, 32, 41, 59, + 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 84, 32, 61, 32,100, 70,100,121, 40, 32,115,117,114,102, 95,112,111,115, 32, + 41, 59, 10, 9,118,101, 99, 51, 32,118, 78, 32, 61, 32,115,117,114,102, 95,110,111,114,109, 59, 32, 47, 42, 32,110,111,114,109, + 97,108,105,122,101,100, 32,105,110,116,101,114,112,111,108, 97,116,101,100, 32,118,101,114,116,101,120, 32,110,111,114,109, 97, +108, 32, 42, 47, 10, 9, 10, 9,118, 82, 49, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 32, 99,114,111,115,115, 40, 32, +118, 83,105,103,109, 97, 84, 44, 32,118, 78, 32, 41, 32, 41, 59, 10, 9,118, 82, 50, 32, 61, 32,110,111,114,109, 97,108,105,122, +101, 40, 32, 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,105,103,109, 97, 83, 32, 41, 32, 41, 59, 10, 9,102, 68,101,116, + 32, 61, 32,115,105,103,110, 40, 32,100,111,116, 40,118, 83,105,103,109, 97, 83, 44, 32,118, 82, 49, 41, 32, 41, 59, 10, 9, 10, + 9,102,108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115, 40,102, 68,101,116, 41, 59, 10, 9, +118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, 40,102, 77, 97,103,110,105,116,117, +100,101, 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 41, 59, 10, 9,102, 80,114,101,118, 77, + 97,103,110,105,116,117,100,101, 95,111,117,116, 32, 61, 32,102, 77, 97,103,110,105,116,117,100,101, 59, 10,125, 10, 10,118,111, +105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,105,110,105,116, 95,118,105,101,119,115,112, 97, 99,101, 40, 32,118,101, 99, + 51, 32,115,117,114,102, 95,112,111,115, 44, 32,118,101, 99, 51, 32,115,117,114,102, 95,110,111,114,109, 44, 32, 10, 9, 9, 9, + 9, 9, 9, 9, 32, 32, 32,102,108,111, 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 44, 32, +118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,102,108,111, + 97,116, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32, +118, 78, 97, 99, 99, 95,111,117,116, 44, 32, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,118,101, 99, 51, 32,118, + 82, 49, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118, 82, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102, 68,101,116, + 32, 41, 32, 10,123, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 83, 32, 61, 32,100, 70,100,120, 40, 32,115,117,114,102, + 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 83,105,103,109, 97, 84, 32, 61, 32,100, 70,100,121, 40, 32,115,117, +114,102, 95,112,111,115, 32, 41, 59, 10, 9,118,101, 99, 51, 32,118, 78, 32, 61, 32,115,117,114,102, 95,110,111,114,109, 59, 32, + 47, 42, 32,110,111,114,109, 97,108,105,122,101,100, 32,105,110,116,101,114,112,111,108, 97,116,101,100, 32,118,101,114,116,101, +120, 32,110,111,114,109, 97,108, 32, 42, 47, 10, 9, 10, 9,118, 82, 49, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 83,105,103, +109, 97, 84, 44, 32,118, 78, 32, 41, 59, 10, 9,118, 82, 50, 32, 61, 32, 99,114,111,115,115, 40, 32,118, 78, 44, 32,118, 83,105, +103,109, 97, 83, 32, 41, 32, 59, 10, 9,102, 68,101,116, 32, 61, 32,100,111,116, 32, 40, 32,118, 83,105,103,109, 97, 83, 44, 32, +118, 82, 49, 32, 41, 59, 10, 9, 10, 9,102,108,111, 97,116, 32,102, 77, 97,103,110,105,116,117,100,101, 32, 61, 32, 97, 98,115, + 40,102, 68,101,116, 41, 59, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 42, 32, + 40,102, 77, 97,103,110,105,116,117,100,101, 32, 47, 32,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,105,110, 41, + 59, 10, 9,102, 80,114,101,118, 77, 97,103,110,105,116,117,100,101, 95,111,117,116, 32, 61, 32,102, 77, 97,103,110,105,116,117, +100,101, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,116, 97,112, 51, 40, 32,118,101, 99, 51, + 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,102,108,111, 97,116, 32,104, 83, 99, + 97,108,101, 44, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,111,117,116, 32,102, +108,111, 97,116, 32,100, 66,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, 32, 41, 32, 10,123, 10, 9,118,101, + 99, 50, 32, 83, 84,108,108, 32, 61, 32,116,101,120, 99,111, 46,120,121, 59, 10, 9,118,101, 99, 50, 32, 83, 84,108,114, 32, 61, + 32,116,101,120, 99,111, 46,120,121, 32, 43, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120,121, 41, 32, 59, 10, 9,118,101, + 99, 50, 32, 83, 84,117,108, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32,100, 70,100,121, 40,116,101,120, 99,111, 46, +120,121, 41, 32, 59, 10, 9, 10, 9,102,108,111, 97,116, 32, 72,108,108, 44, 72,108,114, 44, 72,117,108, 59, 10, 9,114,103, 98, +116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108,108, 41, 44, 32, 72,108,108, 32, + 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,108,114, + 41, 44, 32, 72,108,114, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, + 97, 44, 32, 83, 84,117,108, 41, 44, 32, 72,117,108, 32, 41, 59, 10, 9, 10, 9,100, 66,115, 32, 61, 32,104, 83, 99, 97,108,101, + 32, 42, 32, 40, 72,108,114, 32, 45, 32, 72,108,108, 41, 59, 10, 9,100, 66,116, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, + 40, 72,117,108, 32, 45, 32, 72,108,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,117,109,112, 95,116, + 97,112, 53, 40, 32,118,101, 99, 51, 32,116,101,120, 99,111, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32, +102,108,111, 97,116, 32,104, 83, 99, 97,108,101, 44, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,100, 66,116, + 32, 41, 32, 10,123, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116,101,120, 99,111, 46,120, +121, 41, 59, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, 99,111, 46,120,121, 41, + 59, 10, 10, 9,118,101, 99, 50, 32, 83, 84, 99, 32, 61, 32,116,101,120, 99,111, 46,120,121, 59, 10, 9,118,101, 99, 50, 32, 83, + 84,108, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120, 32, 59, 10, 9,118, +101, 99, 50, 32, 83, 84,114, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32, 48, 46, 53, 32, 42, 32, 84,101,120, 68,120, + 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,100, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 45, 32, 48, 46, 53, 32, 42, 32, + 84,101,120, 68,121, 32, 59, 10, 9,118,101, 99, 50, 32, 83, 84,117, 32, 61, 32,116,101,120, 99,111, 46,120,121, 32, 43, 32, 48, + 46, 53, 32, 42, 32, 84,101,120, 68,121, 32, 59, 10, 9, 10, 9,102,108,111, 97,116, 32, 72, 99, 44, 72,108, 44, 72,114, 44, 72, +100, 44, 72,117, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, + 84, 99, 41, 44, 32, 72, 99, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105, +109, 97, 44, 32, 83, 84,108, 41, 44, 32, 72,108, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116,101,120,116,117,114, +101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,114, 41, 44, 32, 72,114, 32, 41, 59, 10, 9,114,103, 98,116,111, 98,119, 40, 32,116, +101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,100, 41, 44, 32, 72,100, 32, 41, 59, 10, 9,114,103, 98,116,111, + 98,119, 40, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 83, 84,117, 41, 44, 32, 72,117, 32, 41, 59, 10, 9, + 10, 9,100, 66,115, 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,114, 32, 45, 32, 72,108, 41, 59, 10, 9,100, 66,116, + 32, 61, 32,104, 83, 99, 97,108,101, 32, 42, 32, 40, 72,117, 32, 45, 32, 72,100, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, +116,101,120, 95, 98,117,109,112, 95, 97,112,112,108,121, 40, 32,102,108,111, 97,116, 32,102, 68,101,116, 44, 32,102,108,111, 97, +116, 32,100, 66,115, 44, 32,102,108,111, 97,116, 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118, 82, 49, 44, 32,118,101, 99, 51, + 32,118, 82, 50, 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 32, 32,111,117,116, 32, +118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,112,101,114,116,117,114, 98, +101,100, 95,110,111,114,109, 32, 41, 32, 10,123, 10, 9,118,101, 99, 51, 32,118, 83,117,114,102, 71,114, 97,100, 32, 61, 32,115, +105,103,110, 40,102, 68,101,116, 41, 32, 42, 32, 40, 32,100, 66,115, 32, 42, 32,118, 82, 49, 32, 43, 32,100, 66,116, 32, 42, 32, +118, 82, 50, 32, 41, 59, 10, 9, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 45, + 32,118, 83,117,114,102, 71,114, 97,100, 59, 10, 9,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 61, 32,110,111, +114,109, 97,108,105,122,101, 40, 32,118, 78, 97, 99, 99, 95,111,117,116, 32, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116, +101,120, 95, 98,117,109,112, 95, 97,112,112,108,121, 95,116,101,120,115,112, 97, 99,101, 40, 32,102,108,111, 97,116, 32,102, 68, +101,116, 44, 32,102,108,111, 97,116, 32,100, 66,115, 44, 32,102,108,111, 97,116, 32,100, 66,116, 44, 32,118,101, 99, 51, 32,118, + 82, 49, 44, 32,118,101, 99, 51, 32,118, 82, 50, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,115, 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,118,101, 99, 51, + 32,116,101,120, 99,111, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,120, 44, 32,102,108,111, 97,116, 32,105,109, 97, 95,121, + 44, 32,118,101, 99, 51, 32,118, 78, 97, 99, 99, 95,105,110, 44, 10, 9, 9, 9, 9, 9, 9, 9, 32, 32, 32,111,117,116, 32,118, +101, 99, 51, 32,118, 78, 97, 99, 99, 95,111,117,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,112,101,114,116,117,114, 98,101, +100, 95,110,111,114,109, 32, 41, 32, 10,123, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,120, 32, 61, 32,100, 70,100,120, 40,116, +101,120, 99,111, 46,120,121, 41, 59, 10, 9,118,101, 99, 50, 32, 84,101,120, 68,121, 32, 61, 32,100, 70,100,121, 40,116,101,120, + 99,111, 46,120,121, 41, 59, 10, 10, 9,118,101, 99, 51, 32,118, 83,117,114,102, 71,114, 97,100, 32, 61, 32,115,105,103,110, 40, +102, 68,101,116, 41, 32, 42, 32, 40, 32, 10, 9, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,100, 66,115, 32, 47, 32,108,101, +110,103,116,104, 40, 32,118,101, 99, 50, 40,105,109, 97, 95,120, 42, 84,101,120, 68,120, 46,120, 44, 32,105,109, 97, 95,121, 42, + 84,101,120, 68,120, 46,121, 41, 32, 41, 32, 42, 32,118, 82, 49, 32, 43, 32, 10, 9, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32,100, 66,116, 32, 47, 32,108,101,110,103,116,104, 40, 32,118,101, 99, 50, 40,105,109, 97, 95,120, 42, 84,101,120, 68,121, 46, +120, 44, 32,105,109, 97, 95,121, 42, 84,101,120, 68,121, 46,121, 41, 32, 41, 32, 42, 32,118, 82, 50, 32, 41, 59, 10, 9, 9, 9, + 9, 10, 9,118, 78, 97, 99, 99, 95,111,117,116, 32, 61, 32,118, 78, 97, 99, 99, 95,105,110, 32, 45, 32,118, 83,117,114,102, 71, +114, 97,100, 59, 10, 9,112,101,114,116,117,114, 98,101,100, 95,110,111,114,109, 32, 61, 32,110,111,114,109, 97,108,105,122,101, + 40, 32,118, 78, 97, 99, 99, 95,111,117,116, 32, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,101,103, 97, +116,101, 95,116,101,120,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, + 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,118,101, 99, + 51, 40, 45,110,111,114,109, 97,108, 46,120, 44, 32, 45,110,111,114,109, 97,108, 46,121, 44, 32,110,111,114,109, 97,108, 46,122, + 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,110,115,112, 97, 99,101, 95,116, 97,110,103,101,110,116, 40,118, +101, 99, 52, 32,116, 97,110,103,101,110,116, 44, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,118,101, 99, 51, 32,116, +101,120,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,108, 41, 10,123, 10, + 9,118,101, 99, 51, 32, 66, 32, 61, 32,116, 97,110,103,101,110,116, 46,119, 32, 42, 32, 99,114,111,115,115, 40,110,111,114,109, + 97,108, 44, 32,116, 97,110,103,101,110,116, 46,120,121,122, 41, 59, 10, 10, 9,111,117,116,110,111,114,109, 97,108, 32, 61, 32, +116,101,120,110,111,114,109, 97,108, 46,120, 42,116, 97,110,103,101,110,116, 46,120,121,122, 32, 43, 32,116,101,120,110,111,114, 109, 97,108, 46,121, 42, 66, 32, 43, 32,116,101,120,110,111,114,109, 97,108, 46,122, 42,110,111,114,109, 97,108, 59, 10, 9,111, 117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95, 98,108,101,110,100, 95,110,111,114,109, 97,108, 40,102,108,111, 97,116, diff --git a/source/blender/gpu/intern/gpu_shader_vertex.glsl b/source/blender/gpu/intern/gpu_shader_vertex.glsl index ba9ef7dead6..a86431bdd7a 100644 --- a/source/blender/gpu/intern/gpu_shader_vertex.glsl +++ b/source/blender/gpu/intern/gpu_shader_vertex.glsl @@ -7,6 +7,6 @@ void main() vec4 co = gl_ModelViewMatrix * gl_Vertex; varposition = co.xyz; - varnormal = gl_NormalMatrix * gl_Normal; + varnormal = normalize(gl_NormalMatrix * gl_Normal); gl_Position = gl_ProjectionMatrix * co; diff --git a/source/blender/gpu/intern/gpu_shader_vertex.glsl.c b/source/blender/gpu/intern/gpu_shader_vertex.glsl.c index edf93d838d5..5d9bd7c60d9 100644 --- a/source/blender/gpu/intern/gpu_shader_vertex.glsl.c +++ b/source/blender/gpu/intern/gpu_shader_vertex.glsl.c @@ -1,13 +1,14 @@ /* DataToC output of file <gpu_shader_vertex_glsl> */ -int datatoc_gpu_shader_vertex_glsl_size= 217; +int datatoc_gpu_shader_vertex_glsl_size= 228; char datatoc_gpu_shader_vertex_glsl[]= { - 10,118, 97,114,121,105,110,103, 32,118,101, 99, 51, 32,118, 97,114,112,111,115,105,116,105,111,110, - 59, 10,118, 97,114,121,105,110,103, 32,118,101, 99, 51, 32,118, 97,114,110,111,114,109, 97,108, 59, 10, 10,118,111,105,100, 32, -109, 97,105,110, 40, 41, 10,123, 10, 9,118,101, 99, 52, 32, 99,111, 32, 61, 32,103,108, 95, 77,111,100,101,108, 86,105,101,119, - 77, 97,116,114,105,120, 32, 42, 32,103,108, 95, 86,101,114,116,101,120, 59, 10, 10, 9,118, 97,114,112,111,115,105,116,105,111, -110, 32, 61, 32, 99,111, 46,120,121,122, 59, 10, 9,118, 97,114,110,111,114,109, 97,108, 32, 61, 32,103,108, 95, 78,111,114,109, - 97,108, 77, 97,116,114,105,120, 32, 42, 32,103,108, 95, 78,111,114,109, 97,108, 59, 10, 9,103,108, 95, 80,111,115,105,116,105, + 10,118, 97,114, +121,105,110,103, 32,118,101, 99, 51, 32,118, 97,114,112,111,115,105,116,105,111,110, 59, 10,118, 97,114,121,105,110,103, 32,118, +101, 99, 51, 32,118, 97,114,110,111,114,109, 97,108, 59, 10, 10,118,111,105,100, 32,109, 97,105,110, 40, 41, 10,123, 10, 9,118, +101, 99, 52, 32, 99,111, 32, 61, 32,103,108, 95, 77,111,100,101,108, 86,105,101,119, 77, 97,116,114,105,120, 32, 42, 32,103,108, + 95, 86,101,114,116,101,120, 59, 10, 10, 9,118, 97,114,112,111,115,105,116,105,111,110, 32, 61, 32, 99,111, 46,120,121,122, 59, + 10, 9,118, 97,114,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,103,108, 95, 78,111,114,109, 97, +108, 77, 97,116,114,105,120, 32, 42, 32,103,108, 95, 78,111,114,109, 97,108, 41, 59, 10, 9,103,108, 95, 80,111,115,105,116,105, 111,110, 32, 61, 32,103,108, 95, 80,114,111,106,101, 99,116,105,111,110, 77, 97,116,114,105,120, 32, 42, 32, 99,111, 59, 10, 10, 0}; diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h index 2accad35859..625e684ea67 100644 --- a/source/blender/imbuf/IMB_imbuf.h +++ b/source/blender/imbuf/IMB_imbuf.h @@ -1,13 +1,39 @@ +/* + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL LICENSE BLOCK ***** + */ /** * @file IMB_imbuf.h * @brief IMage Buffer module. * * This module offers import/export of several graphical file formats. - * \ref IMB * @ingroup imbuf - * @ingroup undoc * - * @page IMB - Imbuf module external interface + * @page IMB Imbuf module external interface * * * @section about About the IMB module @@ -30,42 +56,14 @@ * @section dependencies Dependencies * * IMB needs: - * - SDNA module + * - \ref DNA module * The listbase types are used for handling the memory * management. - * - blenlib module + * - \ref blenlib module * blenlib handles guarded memory management in blender-style. * BLI_winstuff.h makes a few windows specific behaviours * posix-compliant. */ -/* - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ #ifndef IMB_IMBUF_H #define IMB_IMBUF_H diff --git a/source/blender/imbuf/IMB_imbuf_types.h b/source/blender/imbuf/IMB_imbuf_types.h index 5629ead80db..81512adf065 100644 --- a/source/blender/imbuf/IMB_imbuf_types.h +++ b/source/blender/imbuf/IMB_imbuf_types.h @@ -1,4 +1,4 @@ -/** +/* * IMB_imbuf_types.h (mar-2001 nzc) * * Types needed for using the image buffer. @@ -54,7 +54,6 @@ struct ImMetaData; #define IB_FILENAME_SIZE 1023 /** - * \brief The basic imbuf type * \ingroup imbuf * This is the abstraction of an image. ImBuf is the basic type used for all * imbuf operations. diff --git a/source/blender/imbuf/intern/tiff.c b/source/blender/imbuf/intern/tiff.c index 5c3451fd6f4..35c1c372e71 100644 --- a/source/blender/imbuf/intern/tiff.c +++ b/source/blender/imbuf/intern/tiff.c @@ -435,9 +435,11 @@ static int imb_read_tiff_pixels(ImBuf *ibuf, TIFF *image, int premul) if(success) { ibuf->profile = (bitspersample==32)?IB_PROFILE_LINEAR_RGB:IB_PROFILE_SRGB; - - if(ENDIAN_ORDER == B_ENDIAN) - IMB_convert_rgba_to_abgr(tmpibuf); + +// Code seems to be not needed for 16 bits tif, on PPC G5 OSX (ton) + if(bitspersample < 16) + if(ENDIAN_ORDER == B_ENDIAN) + IMB_convert_rgba_to_abgr(tmpibuf); if(premul) { IMB_premultiply_alpha(tmpibuf); ibuf->flags |= IB_premul; diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h index d79b63e9c38..97ae2a579fc 100644 --- a/source/blender/makesdna/DNA_ID.h +++ b/source/blender/makesdna/DNA_ID.h @@ -1,8 +1,4 @@ -/** - * blenlib/DNA_ID.h (mar-2001 nzc) - * - * ID and Library types, which are fundamental for sdna, - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -33,6 +29,11 @@ #ifndef DNA_ID_H #define DNA_ID_H +/** \file DNA_ID.h + * \ingroup DNA + * \brief ID and Library types, which are fundamental for sdna. + */ + #include "DNA_listBase.h" #ifdef __cplusplus diff --git a/source/blender/makesdna/DNA_action_types.h b/source/blender/makesdna/DNA_action_types.h index 5261ad65776..cf601c1a45d 100644 --- a/source/blender/makesdna/DNA_action_types.h +++ b/source/blender/makesdna/DNA_action_types.h @@ -27,6 +27,10 @@ * ***** END GPL LICENSE BLOCK ***** */ +/** \file DNA_action_types.h + * \ingroup DNA + */ + #ifndef DNA_ACTION_TYPES_H #define DNA_ACTION_TYPES_H diff --git a/source/blender/makesdna/DNA_actuator_types.h b/source/blender/makesdna/DNA_actuator_types.h index 20fdb5eee41..4f7be73e7fa 100644 --- a/source/blender/makesdna/DNA_actuator_types.h +++ b/source/blender/makesdna/DNA_actuator_types.h @@ -1,6 +1,4 @@ -/** - * blenlib/DNA_actuator_types.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -28,6 +26,11 @@ * * ***** END GPL LICENSE BLOCK ***** */ + +/** \file DNA_actuator_types.h + * \ingroup DNA + */ + #ifndef DNA_ACTUATOR_TYPES_H #define DNA_ACTUATOR_TYPES_H @@ -227,19 +230,19 @@ typedef struct bActuator { struct bActuator *next, *prev, *mynew; short type; /** - * Tells what type of actuator data <data> holds. + * Tells what type of actuator data \ref data holds. */ short flag; short otype, go; char name[32]; /** - * Data must point to an object actuator type struct. + * \var Data must point to an object actuator type struct. */ void *data; /** - * For ipo's and props: to find out which object the actuator + * \var For ipo's and props: to find out which object the actuator * belongs to */ struct Object *ob; diff --git a/source/blender/makesdna/DNA_anim_types.h b/source/blender/makesdna/DNA_anim_types.h index e09d7635f75..31e02ff1877 100644 --- a/source/blender/makesdna/DNA_anim_types.h +++ b/source/blender/makesdna/DNA_anim_types.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -28,6 +28,10 @@ #ifndef DNA_ANIM_TYPES_H #define DNA_ANIM_TYPES_H +/** \file DNA_anim_types.h + * \ingroup DNA + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/makesdna/DNA_armature_types.h b/source/blender/makesdna/DNA_armature_types.h index 68375615614..3547101612f 100644 --- a/source/blender/makesdna/DNA_armature_types.h +++ b/source/blender/makesdna/DNA_armature_types.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -28,6 +28,10 @@ #ifndef DNA_ARMATURE_TYPES_H #define DNA_ARMATURE_TYPES_H +/** \file DNA_armature_types.h + * \ingroup DNA + */ + #include "DNA_listBase.h" #include "DNA_ID.h" diff --git a/source/blender/makesdna/DNA_boid_types.h b/source/blender/makesdna/DNA_boid_types.h index 83f8f4d0199..8ce6b0cc2bb 100644 --- a/source/blender/makesdna/DNA_boid_types.h +++ b/source/blender/makesdna/DNA_boid_types.h @@ -1,6 +1,4 @@ -/* DNA_particle_types.h - * - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -32,6 +30,10 @@ #ifndef DNA_BOID_TYPES_H #define DNA_BOID_TYPES_H +/** \file DNA_boid_types.h + * \ingroup DNA + */ + #include "DNA_listBase.h" typedef enum BoidRuleType { diff --git a/source/blender/makesdna/DNA_brush_types.h b/source/blender/makesdna/DNA_brush_types.h index 6ddad214af4..3693f43b69e 100644 --- a/source/blender/makesdna/DNA_brush_types.h +++ b/source/blender/makesdna/DNA_brush_types.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -30,6 +30,11 @@ #ifndef DNA_BRUSH_TYPES_H #define DNA_BRUSH_TYPES_H +/** \file DNA_brush_types.h + * \ingroup DNA + */ + + #include "DNA_ID.h" #include "DNA_texture_types.h" /* for MTex */ diff --git a/source/blender/makesdna/DNA_camera_types.h b/source/blender/makesdna/DNA_camera_types.h index 11c8533783e..4ebd7318ea8 100644 --- a/source/blender/makesdna/DNA_camera_types.h +++ b/source/blender/makesdna/DNA_camera_types.h @@ -1,6 +1,4 @@ -/** - * blenlib/DNA_camera_types.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,10 @@ #ifndef DNA_CAMERA_TYPES_H #define DNA_CAMERA_TYPES_H +/** \file DNA_camera_types.h + * \ingroup DNA + */ + #include "DNA_ID.h" #ifdef __cplusplus diff --git a/source/blender/makesdna/DNA_cloth_types.h b/source/blender/makesdna/DNA_cloth_types.h index 9b9f0ede526..1f78366287f 100644 --- a/source/blender/makesdna/DNA_cloth_types.h +++ b/source/blender/makesdna/DNA_cloth_types.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -29,6 +29,10 @@ #ifndef DNA_CLOTH_TYPES_H #define DNA_CLOTH_TYPES_H +/** \file DNA_cloth_types.h + * \ingroup DNA + */ + /** * This struct contains all the global data required to run a simulation. * At the time of this writing, this structure contains data appropriate diff --git a/source/blender/makesdna/DNA_color_types.h b/source/blender/makesdna/DNA_color_types.h index 83cd7979ce7..3b5a1865832 100644 --- a/source/blender/makesdna/DNA_color_types.h +++ b/source/blender/makesdna/DNA_color_types.h @@ -1,5 +1,4 @@ -/** - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -30,6 +29,10 @@ #ifndef DNA_COLOR_TYPES_H #define DNA_COLOR_TYPES_H +/** \file DNA_color_types.h + * \ingroup DNA + */ + #include "DNA_vec_types.h" /* general defines for kernel functions */ diff --git a/source/blender/makesdna/DNA_constraint_types.h b/source/blender/makesdna/DNA_constraint_types.h index 275ffd93ae5..1d752fce4ef 100644 --- a/source/blender/makesdna/DNA_constraint_types.h +++ b/source/blender/makesdna/DNA_constraint_types.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +31,10 @@ #ifndef DNA_CONSTRAINT_TYPES_H #define DNA_CONSTRAINT_TYPES_H +/** \file DNA_constraint_types.h + * \ingroup DNA + */ + #include "DNA_ID.h" #include "DNA_listBase.h" diff --git a/source/blender/makesdna/DNA_controller_types.h b/source/blender/makesdna/DNA_controller_types.h index fcd5587b14b..e48386e5c4e 100644 --- a/source/blender/makesdna/DNA_controller_types.h +++ b/source/blender/makesdna/DNA_controller_types.h @@ -1,6 +1,4 @@ -/** - * blenlib/DNA_controller_types.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,10 @@ #ifndef DNA_CONTROLLER_TYPES_H #define DNA_CONTROLLER_TYPES_H +/** \file DNA_controller_types.h + * \ingroup DNA + */ + struct bActuator; struct Text; struct bSensor; diff --git a/source/blender/makesdna/DNA_curve_types.h b/source/blender/makesdna/DNA_curve_types.h index d66246a4136..b51612037fc 100644 --- a/source/blender/makesdna/DNA_curve_types.h +++ b/source/blender/makesdna/DNA_curve_types.h @@ -1,8 +1,4 @@ -/** - * blenlib/DNA_curve_types.h (mar-2001 nzc) - * - * Curve stuff. - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -33,6 +29,10 @@ #ifndef DNA_CURVE_TYPES_H #define DNA_CURVE_TYPES_H +/** \file DNA_curve_types.h + * \ingroup DNA + */ + #include "DNA_listBase.h" #include "DNA_vec_types.h" #include "DNA_ID.h" diff --git a/source/blender/makesdna/DNA_customdata_types.h b/source/blender/makesdna/DNA_customdata_types.h index 6c0b4db221d..cdfcf465c6c 100644 --- a/source/blender/makesdna/DNA_customdata_types.h +++ b/source/blender/makesdna/DNA_customdata_types.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -27,6 +27,10 @@ * ***** END GPL LICENSE BLOCK ***** */ +/** \file DNA_customdata_types.h + * \ingroup DNA + */ + #ifndef DNA_CUSTOMDATA_TYPES_H #define DNA_CUSTOMDATA_TYPES_H @@ -34,7 +38,7 @@ extern "C" { #endif -/* descriptor and storage for a custom data layer */ +/** descriptor and storage for a custom data layer */ typedef struct CustomDataLayer { int type; /* type of data in layer */ int offset; /* in editmode, offset of layer in block */ @@ -52,7 +56,7 @@ typedef struct CustomDataExternal { char filename[240]; /* FILE_MAX */ } CustomDataExternal; -/* structure which stores custom element data associated with mesh elements +/** structure which stores custom element data associated with mesh elements * (vertices, edges or faces). The custom data is organised into a series of * layers, each with a data type (e.g. MTFace, MDeformVert, etc.). */ typedef struct CustomData { diff --git a/source/blender/makesdna/DNA_documentation.h b/source/blender/makesdna/DNA_documentation.h index a911b92c313..2e5eb3778c4 100644 --- a/source/blender/makesdna/DNA_documentation.h +++ b/source/blender/makesdna/DNA_documentation.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -25,29 +25,32 @@ * Contributor(s): none yet. * * ***** END GPL LICENSE BLOCK ***** + */ + +/** + * \page makesdna makesdna + * \ingroup DNA * - * @mainpage DNA- Makesdna modules - * - * @section about About the DNA module + * \section aboutdna About the DNA module * * The DNA module holds all type definitions that are serialized in a * blender file. There is an executable that scans all files, looking - * for struct-s to serialize (hence sdna: Struct DNA). From this + * for struct-s to serialize (hence sdna: Struct \ref DNA). From this * information, it builds a file with numbers that encode the format, * the names of variables, and the plce to look for them. * - * @section issues Known issues with DNA + * \section dnaissues Known issues with DNA * * - Function pointers: * * Because of historical reasons, some function pointers were * untyped. The parser/dna generator has been modified to explicitly * handle these special cases. Most pointers have been given proper - * proto's by now. DNA_space_types.h::Spacefile::returnfuncmay still + * proto's by now. DNA_space_types.h::Spacefile::returnfunc may still * be badly defined. The reason for this is that it is called with * different types of arguments. It takes a char* at this moment... * - * - Path to the header files + * - %Path to the header files * * Also because of historical reasons, there is a path prefix to the * headers that need to be scanned. This is the BASE_HEADER @@ -55,15 +58,14 @@ * have to change this (Not very flexible, but it is hardly ever * changed. Sorry.). * - * @section dependencies Dependencies + * \section dnadependencies Dependencies * * DNA has no external dependencies (except for a few system * includes). - * - **/ + * \section dnanote NOTE -/* PLEASE READ INSTRUCTIONS ABOUT ADDING VARIABLES IN 'DNA' STRUCTS IN + PLEASE READ INSTRUCTIONS ABOUT ADDING VARIABLES IN 'DNA' STRUCTS IN intern/dna_genfile.c (ton) diff --git a/source/blender/makesdna/DNA_effect_types.h b/source/blender/makesdna/DNA_effect_types.h index ee0b791a274..f87698a3d64 100644 --- a/source/blender/makesdna/DNA_effect_types.h +++ b/source/blender/makesdna/DNA_effect_types.h @@ -1,6 +1,4 @@ -/** - * blenlib/DNA_effect_types.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,10 @@ #ifndef DNA_EFFECT_TYPES_H #define DNA_EFFECT_TYPES_H +/** \file DNA_effect_types.h + * \ingroup DNA + */ + /* don't forget, new effects also in writefile.c for dna!!! */ #define PAF_MAXMULT 4 diff --git a/source/blender/makesdna/DNA_fileglobal_types.h b/source/blender/makesdna/DNA_fileglobal_types.h index 0c3a9429de6..9aa3e1eb3c1 100644 --- a/source/blender/makesdna/DNA_fileglobal_types.h +++ b/source/blender/makesdna/DNA_fileglobal_types.h @@ -1,6 +1,4 @@ -/** - * blenlib/DNA_fileglobal_types.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,10 @@ #ifndef DNA_FILEGLOBAL_TYPES_H #define DNA_FILEGLOBAL_TYPES_H +/** \file DNA_fileglobal_types.h + * \ingroup DNA + */ + struct bScreen; struct Scene; diff --git a/source/blender/makesdna/DNA_genfile.h b/source/blender/makesdna/DNA_genfile.h index 8e00a89af09..e8ed6580206 100644 --- a/source/blender/makesdna/DNA_genfile.h +++ b/source/blender/makesdna/DNA_genfile.h @@ -25,12 +25,16 @@ * Contributor(s): none yet. * * ***** END GPL LICENSE BLOCK ***** - * blenloader genfile private function prototypes */ #ifndef GENFILE_H #define GENFILE_H +/** \file DNA_genfile.h + * \ingroup DNA + * \brief blenloader genfile private function prototypes + */ + struct SDNA; extern unsigned char DNAstr[]; /* DNA.c */ diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h index 25378173929..ffccc08048e 100644 --- a/source/blender/makesdna/DNA_gpencil_types.h +++ b/source/blender/makesdna/DNA_gpencil_types.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -27,6 +27,10 @@ #ifndef DNA_GPENCIL_TYPES_H #define DNA_GPENCIL_TYPES_H +/** \file DNA_gpencil_types.h + * \ingroup DNA + */ + #include "DNA_listBase.h" #include "DNA_ID.h" diff --git a/source/blender/makesdna/DNA_group_types.h b/source/blender/makesdna/DNA_group_types.h index 7416f6ea397..106b85a5372 100644 --- a/source/blender/makesdna/DNA_group_types.h +++ b/source/blender/makesdna/DNA_group_types.h @@ -1,4 +1,4 @@ -/** +/* * blenlib/DNA_group_types.h (mar-2001 nzc) * * $Id$ @@ -31,6 +31,10 @@ #ifndef DNA_GROUP_TYPES_H #define DNA_GROUP_TYPES_H +/** \file DNA_group_types.h + * \ingroup DNA + */ + #include "DNA_listBase.h" #include "DNA_ID.h" diff --git a/source/blender/makesdna/DNA_image_types.h b/source/blender/makesdna/DNA_image_types.h index 3df3c8b41c6..99ed2319415 100644 --- a/source/blender/makesdna/DNA_image_types.h +++ b/source/blender/makesdna/DNA_image_types.h @@ -1,6 +1,4 @@ -/** - * blenlib/DNA_image_types.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,10 @@ #ifndef DNA_IMAGE_TYPES_H #define DNA_IMAGE_TYPES_H +/** \file DNA_image_types.h + * \ingroup DNA + */ + #include "DNA_ID.h" struct PackedFile; diff --git a/source/blender/makesdna/DNA_ipo_types.h b/source/blender/makesdna/DNA_ipo_types.h index d0554a7aaa5..5dba9154a3a 100644 --- a/source/blender/makesdna/DNA_ipo_types.h +++ b/source/blender/makesdna/DNA_ipo_types.h @@ -1,6 +1,4 @@ -/** - * blenlib/DNA_ipo_types.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -29,15 +27,13 @@ * ***** END GPL LICENSE BLOCK ***** */ -/* ============================================== - * ATTENTION: - * - * The contents of this file are now officially depreceated. They were used for the 'old' animation system, - * which has (as of 2.50) been replaced with a completely new system by Joshua Leung (aligorith). All defines, - * etc. are only still maintained to provide backwards compatability for old files... - * - * ============================================= - */ +/** \file DNA_ipo_types.h + * \ingroup DNA + * \deprecated + * The contents of this file are now officially depreceated. They were used for the 'old' animation system, + * which has (as of 2.50) been replaced with a completely new system by Joshua Leung (aligorith). All defines, + * etc. are only still maintained to provide backwards compatability for old files. + */ #ifndef DNA_IPO_TYPES_H #define DNA_IPO_TYPES_H diff --git a/source/blender/makesdna/DNA_key_types.h b/source/blender/makesdna/DNA_key_types.h index 3cdb5c7ebd9..2d5960aa309 100644 --- a/source/blender/makesdna/DNA_key_types.h +++ b/source/blender/makesdna/DNA_key_types.h @@ -1,6 +1,4 @@ -/** - * blenlib/DNA_key_types.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,10 @@ #ifndef DNA_KEY_TYPES_H #define DNA_KEY_TYPES_H +/** \file DNA_key_types.h + * \ingroup DNA + */ + #include "DNA_listBase.h" #include "DNA_ID.h" diff --git a/source/blender/makesdna/DNA_lamp_types.h b/source/blender/makesdna/DNA_lamp_types.h index 1028d733c65..9377b5d8a09 100644 --- a/source/blender/makesdna/DNA_lamp_types.h +++ b/source/blender/makesdna/DNA_lamp_types.h @@ -1,6 +1,4 @@ -/** - * blenlib/DNA_lamp_types.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,10 @@ #ifndef DNA_LAMP_TYPES_H #define DNA_LAMP_TYPES_H +/** \file DNA_lamp_types.h + * \ingroup DNA + */ + #include "DNA_ID.h" #ifndef MAX_MTEX diff --git a/source/blender/makesdna/DNA_lattice_types.h b/source/blender/makesdna/DNA_lattice_types.h index bf2ada51155..662ef9e8a45 100644 --- a/source/blender/makesdna/DNA_lattice_types.h +++ b/source/blender/makesdna/DNA_lattice_types.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -29,6 +29,10 @@ #ifndef DNA_LATTICE_TYPES_H #define DNA_LATTICE_TYPES_H +/** \file DNA_lattice_types.h + * \ingroup DNA + */ + #include "DNA_ID.h" struct AnimData; diff --git a/source/blender/makesdna/DNA_listBase.h b/source/blender/makesdna/DNA_listBase.h index afeb79037f5..f52325c0e7b 100644 --- a/source/blender/makesdna/DNA_listBase.h +++ b/source/blender/makesdna/DNA_listBase.h @@ -1,6 +1,4 @@ -/** - * blenlib/BLI_listBase.h mar 2001 Nzc - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -28,14 +26,18 @@ * * ***** END GPL LICENSE BLOCK ***** * - * These structs are the foundation for all linked lists in the - * library system. * */ #ifndef DNA_LISTBASE_H #define DNA_LISTBASE_H +/** \file DNA_listBase.h + * \ingroup DNA + * \brief These structs are the foundation for all linked lists in the + * library system. + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h index 0a49aed505e..9d97b6af8f3 100644 --- a/source/blender/makesdna/DNA_material_types.h +++ b/source/blender/makesdna/DNA_material_types.h @@ -1,6 +1,4 @@ -/** - * blenlib/DNA_material_types.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,10 @@ #ifndef DNA_MATERIAL_TYPES_H #define DNA_MATERIAL_TYPES_H +/** \file DNA_material_types.h + * \ingroup DNA + */ + #include "DNA_ID.h" #include "DNA_listBase.h" diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h index 853c123e5d7..bd2a6a996b5 100644 --- a/source/blender/makesdna/DNA_mesh_types.h +++ b/source/blender/makesdna/DNA_mesh_types.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -29,6 +29,10 @@ #ifndef DNA_MESH_TYPES_H #define DNA_MESH_TYPES_H +/** \file DNA_mesh_types.h + * \ingroup DNA + */ + #include "DNA_listBase.h" #include "DNA_ID.h" #include "DNA_customdata_types.h" diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h index 9761eda5de7..e3510b3a25a 100644 --- a/source/blender/makesdna/DNA_meshdata_types.h +++ b/source/blender/makesdna/DNA_meshdata_types.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -29,6 +29,10 @@ #ifndef DNA_MESHDATA_TYPES_H #define DNA_MESHDATA_TYPES_H +/** \file DNA_meshdata_types.h + * \ingroup DNA + */ + #include "DNA_customdata_types.h" #include "DNA_listBase.h" diff --git a/source/blender/makesdna/DNA_meta_types.h b/source/blender/makesdna/DNA_meta_types.h index dc0ac7fd80c..53f563341b3 100644 --- a/source/blender/makesdna/DNA_meta_types.h +++ b/source/blender/makesdna/DNA_meta_types.h @@ -1,6 +1,4 @@ -/** - * blenlib/DNA_meta_types.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,10 @@ #ifndef DNA_META_TYPES_H #define DNA_META_TYPES_H +/** \file DNA_meta_types.h + * \ingroup DNA + */ + #include "DNA_listBase.h" #include "DNA_ID.h" diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index b5bcd20a759..687a05f7afb 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -1,5 +1,4 @@ -/** - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -21,11 +20,16 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include "DNA_listBase.h" - #ifndef DNA_MODIFIER_TYPES_H #define DNA_MODIFIER_TYPES_H +/** \file DNA_modifier_types.h + * \ingroup DNA + */ + +#include "DNA_listBase.h" + + #define MODSTACK_DEBUG 1 /* WARNING ALERT! TYPEDEF VALUES ARE WRITTEN IN FILES! SO DO NOT CHANGE! */ diff --git a/source/blender/makesdna/DNA_nla_types.h b/source/blender/makesdna/DNA_nla_types.h index 519d8ca8163..c64dda2afd0 100644 --- a/source/blender/makesdna/DNA_nla_types.h +++ b/source/blender/makesdna/DNA_nla_types.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -30,6 +30,10 @@ #ifndef DNA_NLA_TYPES_H #define DNA_NLA_TYPES_H +/** \file DNA_nla_types.h + * \ingroup DNA + */ + #include "DNA_listBase.h" struct bAction; diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index 5fbbf4338c4..a9f688e29b9 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -30,6 +30,10 @@ #ifndef DNA_NODE_TYPES_H #define DNA_NODE_TYPES_H +/** \file DNA_node_types.h + * \ingroup DNA + */ + #include "DNA_ID.h" #include "DNA_vec_types.h" #include "DNA_listBase.h" diff --git a/source/blender/makesdna/DNA_object_fluidsim.h b/source/blender/makesdna/DNA_object_fluidsim.h index 700021eaceb..e8360b99d69 100644 --- a/source/blender/makesdna/DNA_object_fluidsim.h +++ b/source/blender/makesdna/DNA_object_fluidsim.h @@ -1,4 +1,4 @@ -/** +/* * * $Id$ * @@ -30,6 +30,10 @@ #ifndef DNA_OBJECT_FLUIDSIM_H #define DNA_OBJECT_FLUIDSIM_H +/** \file DNA_object_fluidsim.h + * \ingroup DNA + */ + #include "DNA_ID.h" #ifdef __cplusplus diff --git a/source/blender/makesdna/DNA_object_force.h b/source/blender/makesdna/DNA_object_force.h index 7656ae6372b..51076dd59a1 100644 --- a/source/blender/makesdna/DNA_object_force.h +++ b/source/blender/makesdna/DNA_object_force.h @@ -1,4 +1,4 @@ -/** +/* * * $Id$ * @@ -30,6 +30,10 @@ #ifndef DNA_OBJECT_FORCE_H #define DNA_OBJECT_FORCE_H +/** \file DNA_object_force.h + * \ingroup DNA + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index 5ccb3e62f7d..8c0e065e27f 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -1,8 +1,4 @@ -/** - * blenlib/DNA_object_types.h (mar-2001 nzc) - * - * Object is a sort of wrapper for general info. - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -33,6 +29,11 @@ #ifndef DNA_OBJECT_TYPES_H #define DNA_OBJECT_TYPES_H +/** \file DNA_object_types.h + * \ingroup DNA + * \brief Object is a sort of wrapper for general info. + */ + #include "DNA_listBase.h" #include "DNA_ID.h" #include "DNA_action_types.h" /* bAnimVizSettings */ diff --git a/source/blender/makesdna/DNA_outliner_types.h b/source/blender/makesdna/DNA_outliner_types.h index d30351b6c34..c44f10efde8 100644 --- a/source/blender/makesdna/DNA_outliner_types.h +++ b/source/blender/makesdna/DNA_outliner_types.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -29,6 +29,10 @@ #ifndef DNA_OUTLINER_TYPES_H #define DNA_OUTLINER_TYPES_H +/** \file DNA_outliner_types.h + * \ingroup DNA + */ + #include "DNA_listBase.h" struct ID; diff --git a/source/blender/makesdna/DNA_packedFile_types.h b/source/blender/makesdna/DNA_packedFile_types.h index 73f55ca186c..de7218ec704 100644 --- a/source/blender/makesdna/DNA_packedFile_types.h +++ b/source/blender/makesdna/DNA_packedFile_types.h @@ -1,7 +1,4 @@ -/* DNA_packedFile_types.h - * - * 12-oct-2000 nzc - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -33,6 +30,12 @@ #ifndef DNA_PACKEDFILE_TYPES_H #define DNA_PACKEDFILE_TYPES_H +/** \file DNA_packedFile_types.h + * \ingroup DNA + * \author nzc + * \since 12-oct-2000 nzc + */ + typedef struct PackedFile { int size; int seek; diff --git a/source/blender/makesdna/DNA_particle_types.h b/source/blender/makesdna/DNA_particle_types.h index d4590315c45..ae97b023e58 100644 --- a/source/blender/makesdna/DNA_particle_types.h +++ b/source/blender/makesdna/DNA_particle_types.h @@ -1,6 +1,4 @@ -/* DNA_particle_types.h - * - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -32,6 +30,10 @@ #ifndef DNA_PARTICLE_TYPES_H #define DNA_PARTICLE_TYPES_H +/** \file DNA_particle_types.h + * \ingroup DNA + */ + #include "DNA_ID.h" #include "DNA_boid_types.h" diff --git a/source/blender/makesdna/DNA_property_types.h b/source/blender/makesdna/DNA_property_types.h index e0da4e89f0f..025f79a6dbf 100644 --- a/source/blender/makesdna/DNA_property_types.h +++ b/source/blender/makesdna/DNA_property_types.h @@ -1,8 +1,5 @@ /** - * blenlib/DNA_property_types.h (mar-2001 nzc) * - * Renderrecipe and scene decription. The fact that there is a - * hierarchy here is a bit strange, and not desirable. * * $Id$ * @@ -34,6 +31,14 @@ #ifndef DNA_PROPERTY_TYPES_H #define DNA_PROPERTY_TYPES_H +/** \file DNA_property_types.h + * \ingroup DNA + * \since mar-2001 + * \author nzc + * \attention Renderrecipe and scene decription. The fact that there is a + * hierarchy here is a bit strange, and not desirable. + */ + /* ********************* PROPERTY ************************ */ typedef struct bProperty { diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 3ea0cfc9c21..4c8071e6a38 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -29,6 +29,10 @@ #ifndef DNA_SCENE_TYPES_H #define DNA_SCENE_TYPES_H +/** \file DNA_scene_types.h + * \ingroup DNA + */ + // XXX, temp feature #define DURIAN_CAMERA_SWITCH @@ -885,7 +889,8 @@ typedef struct Scene { #define R_OUTPUT_SCREEN 0 #define R_OUTPUT_AREA 1 #define R_OUTPUT_WINDOW 2 -/*#define R_OUTPUT_FORKED 3*/ +#define R_OUTPUT_NONE 3 +/*#define R_OUTPUT_FORKED 4*/ /* filtertype */ #define R_FILTER_BOX 0 diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h index 52d8b2e8dd9..381046daedc 100644 --- a/source/blender/makesdna/DNA_screen_types.h +++ b/source/blender/makesdna/DNA_screen_types.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -27,6 +27,10 @@ #ifndef DNA_SCREEN_TYPES_H #define DNA_SCREEN_TYPES_H +/** \file DNA_screen_types.h + * \ingroup DNA + */ + #include "DNA_listBase.h" #include "DNA_view2d_types.h" #include "DNA_vec_types.h" diff --git a/source/blender/makesdna/DNA_sdna_types.h b/source/blender/makesdna/DNA_sdna_types.h index 8e291035be7..e5f924b5fa6 100644 --- a/source/blender/makesdna/DNA_sdna_types.h +++ b/source/blender/makesdna/DNA_sdna_types.h @@ -1,6 +1,4 @@ -/** - * blenlib/DNA_sdna.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -30,6 +28,10 @@ */ #ifndef DNA_SDNA_H #define DNA_SDNA_H +/** + * \file DNA_sdna_types.h + * \ingroup DNA + */ # # diff --git a/source/blender/makesdna/DNA_sensor_types.h b/source/blender/makesdna/DNA_sensor_types.h index d2f6eb11952..fb7a3e70c7c 100644 --- a/source/blender/makesdna/DNA_sensor_types.h +++ b/source/blender/makesdna/DNA_sensor_types.h @@ -1,6 +1,4 @@ -/** - * blenlib/DNA_sensor_types.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -30,6 +28,12 @@ */ #ifndef DNA_SENSOR_TYPES_H #define DNA_SENSOR_TYPES_H +/** \file DNA_sensor_types.h + * \ingroup DNA + * \since mar-2001 + * \author nzc + * + */ struct Object; struct Material; diff --git a/source/blender/makesdna/DNA_sequence_types.h b/source/blender/makesdna/DNA_sequence_types.h index 4fcf7bd6250..22f0c23ea9b 100644 --- a/source/blender/makesdna/DNA_sequence_types.h +++ b/source/blender/makesdna/DNA_sequence_types.h @@ -1,6 +1,4 @@ -/** - * blenlib/DNA_sequence_types.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -30,6 +28,11 @@ */ #ifndef DNA_SEQUENCE_TYPES_H #define DNA_SEQUENCE_TYPES_H +/** \file DNA_sequence_types.h + * \ingroup DNA + * \since mar-2001 + * \author nzc + */ #include "DNA_listBase.h" #include "DNA_vec_types.h" diff --git a/source/blender/makesdna/DNA_smoke_types.h b/source/blender/makesdna/DNA_smoke_types.h index 0482c19e189..168481d3b29 100644 --- a/source/blender/makesdna/DNA_smoke_types.h +++ b/source/blender/makesdna/DNA_smoke_types.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -29,6 +29,10 @@ #ifndef DNA_SMOKE_TYPES_H #define DNA_SMOKE_TYPES_H +/** \file DNA_smoke_types.h + * \ingroup DNA + */ + /* flags */ #define MOD_SMOKE_HIGHRES (1<<1) /* enable high resolution */ #define MOD_SMOKE_DISSOLVE (1<<2) /* let smoke dissolve */ diff --git a/source/blender/makesdna/DNA_sound_types.h b/source/blender/makesdna/DNA_sound_types.h index c10d306565b..3e5f82a8052 100644 --- a/source/blender/makesdna/DNA_sound_types.h +++ b/source/blender/makesdna/DNA_sound_types.h @@ -1,6 +1,4 @@ -/** - * blenlib/DNA_sound_types.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -30,6 +28,11 @@ */ #ifndef DNA_SOUND_TYPES_H #define DNA_SOUND_TYPES_H +/** \file DNA_sound_types.h + * \ingroup DNA + * \since mar-2001 + * \author nzc + */ #include "DNA_listBase.h" #include "DNA_ID.h" diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index 6cb7a186ca0..a23aed505ae 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -1,6 +1,4 @@ -/** - * blenlib/DNA_space_types.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -30,6 +28,11 @@ */ #ifndef DNA_SPACE_TYPES_H #define DNA_SPACE_TYPES_H +/** \file DNA_space_types.h + * \ingroup DNA + * \since mar-2001 + * \author nzc + */ #include "DNA_listBase.h" #include "DNA_color_types.h" /* for Histogram */ @@ -324,6 +327,9 @@ typedef struct SpaceText { char findstr[256]; /* ST_MAX_FIND_STR */ char replacestr[256]; /* ST_MAX_FIND_STR */ + short margin_column; /* column number to show right margin at */ + char pad[6]; + void *drawcache; /* cache for faster drawing */ } SpaceText; @@ -814,6 +820,7 @@ enum { // execution (see BPY_main.c) #define ST_FIND_WRAP 0x0020 #define ST_FIND_ALL 0x0040 +#define ST_SHOW_MARGIN 0x0080 /* stext->findstr/replacestr */ diff --git a/source/blender/makesdna/DNA_text_types.h b/source/blender/makesdna/DNA_text_types.h index 82de3fc1833..f805ced5dac 100644 --- a/source/blender/makesdna/DNA_text_types.h +++ b/source/blender/makesdna/DNA_text_types.h @@ -1,6 +1,4 @@ -/** - * blenlib/DNA_text_types.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -30,6 +28,11 @@ */ #ifndef DNA_TEXT_TYPES_H #define DNA_TEXT_TYPES_H +/** \file DNA_text_types.h + * \ingroup DNA + * \since mar-2001 + * \author nzc + */ #include "DNA_listBase.h" #include "DNA_ID.h" diff --git a/source/blender/makesdna/DNA_texture_types.h b/source/blender/makesdna/DNA_texture_types.h index c345eb34133..572a2282d45 100644 --- a/source/blender/makesdna/DNA_texture_types.h +++ b/source/blender/makesdna/DNA_texture_types.h @@ -1,6 +1,4 @@ -/** - * blenlib/DNA_texture_types.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,12 @@ #ifndef DNA_TEXTURE_TYPES_H #define DNA_TEXTURE_TYPES_H +/** \file DNA_texture_types.h + * \ingroup DNA + * \since mar-2001 + * \author nzc + */ + #include "DNA_ID.h" #include "DNA_image_types.h" /* ImageUser */ diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index d8ab447b93a..c512b73c773 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -1,6 +1,4 @@ -/** - * blenkernel/DNA_userdef_types.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,12 @@ #ifndef DNA_USERDEF_TYPES_H #define DNA_USERDEF_TYPES_H +/** \file DNA_userdef_types.h + * \ingroup DNA + * \since mar-2001 + * \author nzc + * + */ #include "DNA_listBase.h" #include "DNA_texture_types.h" /* ColorBand */ diff --git a/source/blender/makesdna/DNA_vec_types.h b/source/blender/makesdna/DNA_vec_types.h index b5e3dff7db9..2d7804c3d1d 100644 --- a/source/blender/makesdna/DNA_vec_types.h +++ b/source/blender/makesdna/DNA_vec_types.h @@ -1,6 +1,4 @@ -/** - * vec_types.h dec 2000 Nzc - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -32,12 +30,20 @@ #ifndef DNA_VEC_TYPES_H #define DNA_VEC_TYPES_H +/** \file DNA_vec_types.h + * \ingroup DNA + * \since dec-2000 + * \author nzc + */ /* types */ + +/** vector of two shorts. */ typedef struct vec2s { short x, y; } vec2s; +/** vector of two floats. */ typedef struct vec2f { float x, y; } vec2f; @@ -77,11 +83,13 @@ typedef struct vec4d { } vec4d; */ +/** integer rectangle. */ typedef struct rcti { int xmin, xmax; int ymin, ymax; } rcti; +/** float rectangle. */ typedef struct rctf { float xmin, xmax; float ymin, ymax; diff --git a/source/blender/makesdna/DNA_vfont_types.h b/source/blender/makesdna/DNA_vfont_types.h index e342ef1cd79..ec576055b55 100644 --- a/source/blender/makesdna/DNA_vfont_types.h +++ b/source/blender/makesdna/DNA_vfont_types.h @@ -1,6 +1,4 @@ -/** - * blenlib/DNA_vfont_types.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,12 @@ #ifndef DNA_VFONT_TYPES_H #define DNA_VFONT_TYPES_H +/** \file DNA_vfont_types.h + * \ingroup DNA + * \since mar-2001 + * \author nzc + */ + #include "DNA_ID.h" struct PackedFile; diff --git a/source/blender/makesdna/DNA_view2d_types.h b/source/blender/makesdna/DNA_view2d_types.h index 75ad1e644d1..ac1d3409153 100644 --- a/source/blender/makesdna/DNA_view2d_types.h +++ b/source/blender/makesdna/DNA_view2d_types.h @@ -1,6 +1,4 @@ -/** - * blenlib/DNA_view2d_types.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,10 @@ #ifndef DNA_VIEW2D_TYPES_H #define DNA_VIEW2D_TYPES_H +/** \file DNA_view2d_types.h + * \ingroup DNA + */ + #include "DNA_vec_types.h" /* ---------------------------------- */ diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h index d429f55eb6c..3ffef475e1b 100644 --- a/source/blender/makesdna/DNA_view3d_types.h +++ b/source/blender/makesdna/DNA_view3d_types.h @@ -1,6 +1,4 @@ -/** - * blenlib/DNA_view3d_types.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,10 @@ #ifndef DNA_VIEW3D_TYPES_H #define DNA_VIEW3D_TYPES_H +/** \file DNA_view3d_types.h + * \ingroup DNA + */ + struct ViewDepths; struct Object; struct Image; diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h index f47ea06645b..958c9cffc84 100644 --- a/source/blender/makesdna/DNA_windowmanager_types.h +++ b/source/blender/makesdna/DNA_windowmanager_types.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -28,6 +28,10 @@ #ifndef DNA_WINDOWMANAGER_TYPES_H #define DNA_WINDOWMANAGER_TYPES_H +/** \file DNA_windowmanager_types.h + * \ingroup DNA + */ + #include "DNA_listBase.h" #include "DNA_vec_types.h" diff --git a/source/blender/makesdna/DNA_world_types.h b/source/blender/makesdna/DNA_world_types.h index 68b3c32db97..71d907f1c12 100644 --- a/source/blender/makesdna/DNA_world_types.h +++ b/source/blender/makesdna/DNA_world_types.h @@ -1,6 +1,4 @@ -/** - * blenlib/DNA_world_types.h (mar-2001 nzc) - * +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +29,10 @@ #ifndef DNA_WORLD_TYPES_H #define DNA_WORLD_TYPES_H +/** \file DNA_world_types.h + * \ingroup DNA + */ + #include "DNA_ID.h" struct AnimData; diff --git a/source/blender/makesdna/intern/makesdna.c b/source/blender/makesdna/intern/makesdna.c index 54deefb1f2d..2b5f0e870b7 100644 --- a/source/blender/makesdna/intern/makesdna.c +++ b/source/blender/makesdna/intern/makesdna.c @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -25,9 +25,13 @@ * Contributor(s): none yet. * * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file makesdna.c + * \brief Struct muncher for making SDNA. + * \ingroup DNA * - * Struct muncher for making SDNA - * + * \section aboutmakesdnac About makesdna tool * Originally by Ton, some mods by Frank, and some cleaning and * extension by Nzc. * @@ -42,7 +46,7 @@ * and the offsets for reaching a particular one. * * There is a facility to get verbose output from sdna. Search for - * debugSDNA. This int can be set to 0 (no output) to some int. Higher + * \ref debugSDNA. This int can be set to 0 (no output) to some int. Higher * numbers give more output. * */ @@ -147,7 +151,8 @@ short **structs, *structdata; /* at sp= structs[a] is the first address of a str sp[0] is type number sp[1] is amount of elements sp[2] sp[3] is typenr, namenr (etc) */ -/* +/** + * Variable to control debug output of makesdna. * debugSDNA: * - 0 = no output, except errors * - 1 = detail actions @@ -162,12 +167,15 @@ int additional_slen_offset; /* ************************************************************************** */ /** - * Add type <str> to struct indexed by <len>, if it was not yet found. + * Add type \c str to struct indexed by \c len, if it was not yet found. + * \param str char + * \param len int */ int add_type(const char *str, int len); /** - * Add variable <str> to + * Add variable \c str to + * \param str */ int add_name(char *str); diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h index 1df6ce21328..8c9b6a6f2b1 100644 --- a/source/blender/makesrna/RNA_access.h +++ b/source/blender/makesrna/RNA_access.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -25,6 +25,10 @@ #ifndef RNA_ACCESS_H #define RNA_ACCESS_H +/** \file RNA_access.h + * \ingroup RNA + */ + #include <stdarg.h> #include "DNA_listBase.h" @@ -43,7 +47,6 @@ struct Scene; /* Types */ extern BlenderRNA BLENDER_RNA; - extern StructRNA RNA_Action; extern StructRNA RNA_ActionConstraint; extern StructRNA RNA_ActionGroup; @@ -66,8 +69,9 @@ extern StructRNA RNA_ArrayModifier; extern StructRNA RNA_BackgroundImage; extern StructRNA RNA_BevelModifier; extern StructRNA RNA_BezierSplinePoint; -extern StructRNA RNA_BlenderRNA; +extern StructRNA RNA_BlendData; extern StructRNA RNA_BlendTexture; +extern StructRNA RNA_BlenderRNA; extern StructRNA RNA_BoidRule; extern StructRNA RNA_BoidRuleAverageSpeed; extern StructRNA RNA_BoidRuleAvoid; @@ -175,8 +179,8 @@ extern StructRNA RNA_CopyScaleConstraint; extern StructRNA RNA_CopyTransformsConstraint; extern StructRNA RNA_Curve; extern StructRNA RNA_CurveMap; -extern StructRNA RNA_CurveMapping; extern StructRNA RNA_CurveMapPoint; +extern StructRNA RNA_CurveMapping; extern StructRNA RNA_CurveModifier; extern StructRNA RNA_CurvePoint; extern StructRNA RNA_DampedTrackConstraint; @@ -191,8 +195,8 @@ extern StructRNA RNA_DriverVariable; extern StructRNA RNA_DupliObject; extern StructRNA RNA_EdgeSplitModifier; extern StructRNA RNA_EditBone; -extern StructRNA RNA_EffectorWeights; extern StructRNA RNA_EffectSequence; +extern StructRNA RNA_EffectorWeights; extern StructRNA RNA_EnumProperty; extern StructRNA RNA_EnumPropertyItem; extern StructRNA RNA_EnvironmentMap; @@ -202,13 +206,6 @@ extern StructRNA RNA_ExplodeModifier; extern StructRNA RNA_ExpressionController; extern StructRNA RNA_FCurve; extern StructRNA RNA_FCurveSample; -extern StructRNA RNA_FieldSettings; -extern StructRNA RNA_FileSelectParams; -extern StructRNA RNA_FloatProperty; -extern StructRNA RNA_FloorConstraint; -extern StructRNA RNA_FluidFluidSettings; -extern StructRNA RNA_FluidSettings; -extern StructRNA RNA_FluidSimulationModifier; extern StructRNA RNA_FModifier; extern StructRNA RNA_FModifierCycles; extern StructRNA RNA_FModifierEnvelope; @@ -219,12 +216,23 @@ extern StructRNA RNA_FModifierLimits; extern StructRNA RNA_FModifierNoise; extern StructRNA RNA_FModifierPython; extern StructRNA RNA_FModifierStepped; +extern StructRNA RNA_FieldSettings; +extern StructRNA RNA_FileSelectParams; +extern StructRNA RNA_FloatProperty; +extern StructRNA RNA_FloorConstraint; +extern StructRNA RNA_FluidFluidSettings; +extern StructRNA RNA_FluidSettings; +extern StructRNA RNA_FluidSimulationModifier; extern StructRNA RNA_FollowPathConstraint; extern StructRNA RNA_FreestyleLineStyle; extern StructRNA RNA_FreestyleLineSet; extern StructRNA RNA_FreestyleModuleSettings; extern StructRNA RNA_FreestyleSettings; extern StructRNA RNA_Function; +extern StructRNA RNA_GPencilFrame; +extern StructRNA RNA_GPencilLayer; +extern StructRNA RNA_GPencilStroke; +extern StructRNA RNA_GPencilStrokePoint; extern StructRNA RNA_GameBooleanProperty; extern StructRNA RNA_GameFloatProperty; extern StructRNA RNA_GameIntProperty; @@ -234,10 +242,6 @@ extern StructRNA RNA_GameSoftBodySettings; extern StructRNA RNA_GameStringProperty; extern StructRNA RNA_GameTimerProperty; extern StructRNA RNA_GlowSequence; -extern StructRNA RNA_GPencilFrame; -extern StructRNA RNA_GPencilLayer; -extern StructRNA RNA_GPencilStroke; -extern StructRNA RNA_GPencilStrokePoint; extern StructRNA RNA_GreasePencil; extern StructRNA RNA_Group; extern StructRNA RNA_Header; @@ -245,8 +249,6 @@ extern StructRNA RNA_HemiLamp; extern StructRNA RNA_Histogram; extern StructRNA RNA_HookModifier; extern StructRNA RNA_ID; -extern StructRNA RNA_IDProperty; -extern StructRNA RNA_IDPropertyGroup; extern StructRNA RNA_IKParam; extern StructRNA RNA_Image; extern StructRNA RNA_ImagePaint; @@ -258,14 +260,14 @@ extern StructRNA RNA_IntProperty; extern StructRNA RNA_Itasc; extern StructRNA RNA_JoystickSensor; extern StructRNA RNA_Key; -extern StructRNA RNA_KeyboardSensor; extern StructRNA RNA_KeyConfig; +extern StructRNA RNA_KeyMap; +extern StructRNA RNA_KeyMapItem; +extern StructRNA RNA_KeyboardSensor; extern StructRNA RNA_Keyframe; extern StructRNA RNA_KeyingSet; -extern StructRNA RNA_KeyingSetPath; extern StructRNA RNA_KeyingSetInfo; -extern StructRNA RNA_KeyMap; -extern StructRNA RNA_KeyMapItem; +extern StructRNA RNA_KeyingSetPath; extern StructRNA RNA_KinematicConstraint; extern StructRNA RNA_Lamp; extern StructRNA RNA_LampSkySettings; @@ -294,7 +296,6 @@ extern StructRNA RNA_LineStyleThicknessModifier_DistanceFromObject; extern StructRNA RNA_LockedTrackConstraint; extern StructRNA RNA_Macro; extern StructRNA RNA_MagicTexture; -extern StructRNA RNA_BlendData; extern StructRNA RNA_MarbleTexture; extern StructRNA RNA_MaskModifier; extern StructRNA RNA_Material; @@ -372,7 +373,6 @@ extern StructRNA RNA_ParticleInstanceModifier; extern StructRNA RNA_ParticleKey; extern StructRNA RNA_ParticleSettings; extern StructRNA RNA_ParticleSettingsTextureSlot; -extern StructRNA RNA_SPHFluidSettings; extern StructRNA RNA_ParticleSystem; extern StructRNA RNA_ParticleSystemModifier; extern StructRNA RNA_ParticleTarget; @@ -382,14 +382,17 @@ extern StructRNA RNA_PluginTexture; extern StructRNA RNA_PointCache; extern StructRNA RNA_PointDensity; extern StructRNA RNA_PointDensityTexture; -extern StructRNA RNA_PointerProperty; extern StructRNA RNA_PointLamp; +extern StructRNA RNA_PointerProperty; extern StructRNA RNA_Pose; extern StructRNA RNA_PoseBone; extern StructRNA RNA_Property; +extern StructRNA RNA_PropertyGroup; +extern StructRNA RNA_PropertyGroupItem; extern StructRNA RNA_PropertySensor; extern StructRNA RNA_PythonConstraint; extern StructRNA RNA_PythonController; +extern StructRNA RNA_RGBANodeSocket; extern StructRNA RNA_RadarSensor; extern StructRNA RNA_RandomSensor; extern StructRNA RNA_RaySensor; @@ -399,8 +402,8 @@ extern StructRNA RNA_RenderLayer; extern StructRNA RNA_RenderPass; extern StructRNA RNA_RenderResult; extern StructRNA RNA_RenderSettings; -extern StructRNA RNA_RGBANodeSocket; extern StructRNA RNA_RigidBodyJointConstraint; +extern StructRNA RNA_SPHFluidSettings; extern StructRNA RNA_Scene; extern StructRNA RNA_SceneGameData; extern StructRNA RNA_SceneRenderLayer; @@ -459,7 +462,6 @@ extern StructRNA RNA_SolidifyModifier; extern StructRNA RNA_Sound; extern StructRNA RNA_SoundSequence; extern StructRNA RNA_Space; -extern StructRNA RNA_SpaceView3D; extern StructRNA RNA_SpaceConsole; extern StructRNA RNA_SpaceDopeSheetEditor; extern StructRNA RNA_SpaceFileBrowser; @@ -474,8 +476,9 @@ extern StructRNA RNA_SpaceProperties; extern StructRNA RNA_SpaceSequenceEditor; extern StructRNA RNA_SpaceTextEditor; extern StructRNA RNA_SpaceTimeline; -extern StructRNA RNA_SpaceUserPreferences; extern StructRNA RNA_SpaceUVEditor; +extern StructRNA RNA_SpaceUserPreferences; +extern StructRNA RNA_SpaceView3D; extern StructRNA RNA_SpeedControlSequence; extern StructRNA RNA_Spline; extern StructRNA RNA_SplineIKConstraint; @@ -553,6 +556,8 @@ extern StructRNA RNA_TransformConstraint; extern StructRNA RNA_TransformSequence; extern StructRNA RNA_UILayout; extern StructRNA RNA_UIListItem; +extern StructRNA RNA_UVProjectModifier; +extern StructRNA RNA_UVProjector; extern StructRNA RNA_UnitSettings; extern StructRNA RNA_UnknownType; extern StructRNA RNA_UserPreferences; @@ -561,8 +566,6 @@ extern StructRNA RNA_UserPreferencesFilePaths; extern StructRNA RNA_UserPreferencesSystem; extern StructRNA RNA_UserPreferencesView; extern StructRNA RNA_UserSolidLight; -extern StructRNA RNA_UVProjectModifier; -extern StructRNA RNA_UVProjector; extern StructRNA RNA_ValueNodeSocket; extern StructRNA RNA_VectorFont; extern StructRNA RNA_VectorNodeSocket; diff --git a/source/blender/makesrna/RNA_define.h b/source/blender/makesrna/RNA_define.h index f4693ae941e..f131f7c9ebe 100644 --- a/source/blender/makesrna/RNA_define.h +++ b/source/blender/makesrna/RNA_define.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -25,7 +25,9 @@ #ifndef RNA_DEFINE_H #define RNA_DEFINE_H -/* Functions used during preprocess and runtime, for defining the RNA. */ +/** \file RNA_define.h + * \ingroup RNA + * Functions used during preprocess and runtime, for defining the RNA. */ #include <float.h> #include <limits.h> diff --git a/source/blender/makesrna/RNA_documentation.h b/source/blender/makesrna/RNA_documentation.h new file mode 100644 index 00000000000..de8e2336bf2 --- /dev/null +++ b/source/blender/makesrna/RNA_documentation.h @@ -0,0 +1,5 @@ +/** \page makesrna makesrna + * \ingroup RNA + * \section aboutmakesrna About RNA + * The \ref RNA module defines and provides the access API to the data, thus encapsulating \ref DNA + */ diff --git a/source/blender/makesrna/RNA_enum_types.h b/source/blender/makesrna/RNA_enum_types.h index bc20ef710eb..d252d008d2f 100644 --- a/source/blender/makesrna/RNA_enum_types.h +++ b/source/blender/makesrna/RNA_enum_types.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -25,6 +25,10 @@ #ifndef RNA_ENUM_TYPES_H #define RNA_ENUM_TYPES_H +/** \file RNA_enum_types.h + * \ingroup RNA + */ + #include "RNA_types.h" /* Types */ diff --git a/source/blender/makesrna/RNA_types.h b/source/blender/makesrna/RNA_types.h index 45f6e321d69..6f7e524d7ca 100644 --- a/source/blender/makesrna/RNA_types.h +++ b/source/blender/makesrna/RNA_types.h @@ -350,32 +350,32 @@ typedef struct ExtensionRNA { /* fake struct definitions, needed otherwise collections end up owning the C * structs like 'Object' when defined first */ -#define MainActions Main -#define MainArmatures Main -#define MainBrushes Main -#define MainCameras Main -#define MainCurves Main -#define MainFonts Main -#define MainGreasePencils Main -#define MainGroups Main -#define MainImages Main -#define MainLamps Main -#define MainLattices Main -#define MainLibraries Main -#define MainLineStyles Main -#define MainMaterials Main -#define MainMeshes Main -#define MainMetaBalls Main -#define MainNodeTrees Main -#define MainObjects Main -#define MainParticles Main -#define MainScenes Main -#define MainScreens Main -#define MainSounds Main -#define MainTexts Main -#define MainTextures Main -#define MainWindowManagers Main -#define MainWorlds Main +#define BlendDataActions Main +#define BlendDataArmatures Main +#define BlendDataBrushes Main +#define BlendDataCameras Main +#define BlendDataCurves Main +#define BlendDataFonts Main +#define BlendDataGreasePencils Main +#define BlendDataGroups Main +#define BlendDataImages Main +#define BlendDataLamps Main +#define BlendDataLattices Main +#define BlendDataLibraries Main +#define BlendDataLineStyles Main +#define BlendDataMaterials Main +#define BlendDataMeshes Main +#define BlendDataMetaBalls Main +#define BlendDataNodeTrees Main +#define BlendDataObjects Main +#define BlendDataParticles Main +#define BlendDataScenes Main +#define BlendDataScreens Main +#define BlendDataSounds Main +#define BlendDataTexts Main +#define BlendDataTextures Main +#define BlendDataWindowManagers Main +#define BlendDataWorlds Main #ifdef __cplusplus } diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c index 36ae67d4091..fad49ef8602 100644 --- a/source/blender/makesrna/intern/makesrna.c +++ b/source/blender/makesrna/intern/makesrna.c @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -2357,7 +2357,7 @@ typedef struct RNAProcessItem { void (*define)(BlenderRNA *brna); } RNAProcessItem; -RNAProcessItem PROCESS_ITEMS[]= { +static RNAProcessItem PROCESS_ITEMS[]= { {"rna_rna.c", NULL, RNA_def_rna}, {"rna_ID.c", NULL, RNA_def_ID}, {"rna_texture.c", NULL, RNA_def_texture}, diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c index f914d14d451..c8797a172fa 100644 --- a/source/blender/makesrna/intern/rna_ID.c +++ b/source/blender/makesrna/intern/rna_ID.c @@ -203,22 +203,22 @@ void rna_ID_fake_user_set(PointerRNA *ptr, int value) } } -IDProperty *rna_IDPropertyGroup_idprops(PointerRNA *ptr, int create) +IDProperty *rna_PropertyGroup_idprops(PointerRNA *ptr, int create) { return ptr->data; } -void rna_IDPropertyGroup_unregister(const bContext *C, StructRNA *type) +void rna_PropertyGroup_unregister(const bContext *C, StructRNA *type) { RNA_struct_free(&BLENDER_RNA, type); } -StructRNA *rna_IDPropertyGroup_register(bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free) +StructRNA *rna_PropertyGroup_register(bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free) { PointerRNA dummyptr; /* create dummy pointer */ - RNA_pointer_create(NULL, &RNA_IDPropertyGroup, NULL, &dummyptr); + RNA_pointer_create(NULL, &RNA_PropertyGroup, NULL, &dummyptr); /* validate the python class */ if(validate(&dummyptr, data, NULL) != 0) @@ -233,10 +233,10 @@ StructRNA *rna_IDPropertyGroup_register(bContext *C, ReportList *reports, void * return NULL; } - return RNA_def_struct(&BLENDER_RNA, identifier, "IDPropertyGroup"); // XXX + return RNA_def_struct(&BLENDER_RNA, identifier, "PropertyGroup"); // XXX } -StructRNA* rna_IDPropertyGroup_refine(PointerRNA *ptr) +StructRNA* rna_PropertyGroup_refine(PointerRNA *ptr) { return ptr->type; } @@ -317,7 +317,8 @@ static void rna_def_ID_properties(BlenderRNA *brna) /* this is struct is used for holding the virtual * PropertyRNA's for ID properties */ - srna= RNA_def_struct(brna, "IDProperty", NULL); + srna= RNA_def_struct(brna, "PropertyGroupItem", NULL); + RNA_def_struct_sdna(srna, "IDProperty"); RNA_def_struct_ui_text(srna, "ID Property", "Property that stores arbitrary, user defined properties"); /* IDP_STRING */ @@ -352,14 +353,14 @@ static void rna_def_ID_properties(BlenderRNA *brna) prop= RNA_def_property(srna, "group", PROP_POINTER, PROP_NONE); RNA_def_property_flag(prop, PROP_EXPORT|PROP_IDPROPERTY); RNA_def_property_clear_flag(prop, PROP_EDITABLE); - RNA_def_property_struct_type(prop, "IDPropertyGroup"); + RNA_def_property_struct_type(prop, "PropertyGroup"); prop= RNA_def_property(srna, "collection", PROP_COLLECTION, PROP_NONE); RNA_def_property_flag(prop, PROP_EXPORT|PROP_IDPROPERTY); - RNA_def_property_struct_type(prop, "IDPropertyGroup"); + RNA_def_property_struct_type(prop, "PropertyGroup"); prop= RNA_def_property(srna, "idp_array", PROP_COLLECTION, PROP_NONE); - RNA_def_property_struct_type(prop, "IDPropertyGroup"); + RNA_def_property_struct_type(prop, "PropertyGroup"); RNA_def_property_collection_funcs(prop, "rna_IDPArray_begin", "rna_iterator_array_next", "rna_iterator_array_end", "rna_iterator_array_get", "rna_IDPArray_length", 0, 0); RNA_def_property_flag(prop, PROP_EXPORT|PROP_IDPROPERTY); @@ -377,11 +378,12 @@ static void rna_def_ID_properties(BlenderRNA *brna) /* ID property groups > level 0, since level 0 group is merged * with native RNA properties. the builtin_properties will take * care of the properties here */ - srna= RNA_def_struct(brna, "IDPropertyGroup", NULL); + srna= RNA_def_struct(brna, "PropertyGroup", NULL); + RNA_def_struct_sdna(srna, "IDPropertyGroup"); RNA_def_struct_ui_text(srna, "ID Property Group", "Group of ID properties"); - RNA_def_struct_idprops_func(srna, "rna_IDPropertyGroup_idprops"); - RNA_def_struct_register_funcs(srna, "rna_IDPropertyGroup_register", "rna_IDPropertyGroup_unregister"); - RNA_def_struct_refine_func(srna, "rna_IDPropertyGroup_refine"); + RNA_def_struct_idprops_func(srna, "rna_PropertyGroup_idprops"); + RNA_def_struct_register_funcs(srna, "rna_PropertyGroup_register", "rna_PropertyGroup_unregister"); + RNA_def_struct_refine_func(srna, "rna_PropertyGroup_refine"); /* important so python types can have their name used in list views * however this isnt prefect because it overrides how python would set the name diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index 8e24f9724d6..f7f0cb191af 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -360,20 +360,20 @@ static int rna_idproperty_verify_valid(PointerRNA *ptr, PropertyRNA *prop, IDPro } static PropertyRNA *typemap[IDP_NUMTYPES] = - {(PropertyRNA*)&rna_IDProperty_string, - (PropertyRNA*)&rna_IDProperty_int, - (PropertyRNA*)&rna_IDProperty_float, + {(PropertyRNA*)&rna_PropertyGroupItem_string, + (PropertyRNA*)&rna_PropertyGroupItem_int, + (PropertyRNA*)&rna_PropertyGroupItem_float, NULL, NULL, NULL, - (PropertyRNA*)&rna_IDProperty_group, NULL, - (PropertyRNA*)&rna_IDProperty_double, - (PropertyRNA*)&rna_IDProperty_idp_array}; + (PropertyRNA*)&rna_PropertyGroupItem_group, NULL, + (PropertyRNA*)&rna_PropertyGroupItem_double, + (PropertyRNA*)&rna_PropertyGroupItem_idp_array}; static PropertyRNA *arraytypemap[IDP_NUMTYPES] = - {NULL, (PropertyRNA*)&rna_IDProperty_int_array, - (PropertyRNA*)&rna_IDProperty_float_array, + {NULL, (PropertyRNA*)&rna_PropertyGroupItem_int_array, + (PropertyRNA*)&rna_PropertyGroupItem_float_array, NULL, NULL, NULL, - (PropertyRNA*)&rna_IDProperty_collection, NULL, - (PropertyRNA*)&rna_IDProperty_double_array}; + (PropertyRNA*)&rna_PropertyGroupItem_collection, NULL, + (PropertyRNA*)&rna_PropertyGroupItem_double_array}; IDProperty *rna_idproperty_check(PropertyRNA **prop, PointerRNA *ptr) { @@ -3469,7 +3469,7 @@ char *RNA_path_from_ID_to_struct(PointerRNA *ptr) else return NULL; // can't do anything about this case yet... } - else if (RNA_struct_is_a(ptr->type, &RNA_IDPropertyGroup)) { + else if (RNA_struct_is_a(ptr->type, &RNA_PropertyGroup)) { /* special case, easier to deal with here then in ptr->type->path() */ return rna_path_from_ID_to_idpgroup(ptr); } diff --git a/source/blender/makesrna/intern/rna_action.c b/source/blender/makesrna/intern/rna_action.c index 7441fba2c53..4a2ea760d87 100644 --- a/source/blender/makesrna/intern/rna_action.c +++ b/source/blender/makesrna/intern/rna_action.c @@ -141,7 +141,7 @@ static TimeMarker *rna_Action_pose_markers_new(bAction *act, ReportList *reports static void rna_Action_pose_markers_remove(bAction *act, ReportList *reports, TimeMarker *marker) { if (!BLI_remlink_safe(&act->markers, marker)) { - BKE_reportf(reports, RPT_ERROR, "TimelineMarker '%s' not found in action '%s'", marker->name, act->id.name+2); + BKE_reportf(reports, RPT_ERROR, "TimelineMarker '%s' not found in Action '%s'", marker->name, act->id.name+2); return; } @@ -149,6 +149,41 @@ static void rna_Action_pose_markers_remove(bAction *act, ReportList *reports, Ti MEM_freeN(marker); } +static PointerRNA rna_Action_active_pose_marker_get(PointerRNA *ptr) +{ + bAction *act= (bAction*)ptr->data; + return rna_pointer_inherit_refine(ptr, &RNA_TimelineMarker, BLI_findlink(&act->markers, act->active_marker-1)); +} + +static void rna_Action_active_pose_marker_set(PointerRNA *ptr, PointerRNA value) +{ + bAction *act= (bAction*)ptr->data; + act->active_marker= BLI_findindex(&act->markers, value.data) + 1; +} + +static int rna_Action_active_pose_marker_index_get(PointerRNA *ptr) +{ + bAction *act= (bAction*)ptr->data; + return MAX2(act->active_marker-1, 0); +} + +static void rna_Action_active_pose_marker_index_set(PointerRNA *ptr, int value) +{ + bAction *act= (bAction*)ptr->data; + act->active_marker= value+1; +} + +static void rna_Action_active_pose_marker_index_range(PointerRNA *ptr, int *min, int *max) +{ + bAction *act= (bAction*)ptr->data; + + *min= 0; + *max= BLI_countlist(&act->markers)-1; + *max= MAX2(0, *max); +} + + + static void rna_Action_frame_range_get(PointerRNA *ptr,float *values) { calc_action_range(ptr->id.data, values, values+1, 1); @@ -428,6 +463,7 @@ static void rna_def_action_fcurves(BlenderRNA *brna, PropertyRNA *cprop) static void rna_def_action_pose_markers(BlenderRNA *brna, PropertyRNA *cprop) { StructRNA *srna; + PropertyRNA *prop; FunctionRNA *func; PropertyRNA *parm; @@ -451,6 +487,17 @@ static void rna_def_action_pose_markers(BlenderRNA *brna, PropertyRNA *cprop) RNA_def_function_flag(func, FUNC_USE_REPORTS); parm= RNA_def_pointer(func, "marker", "TimelineMarker", "", "Timeline marker to remove."); RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); + + prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE); + RNA_def_property_struct_type(prop, "TimelineMarker"); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_pointer_funcs(prop, "rna_Action_active_pose_marker_get", "rna_Action_active_pose_marker_set", NULL, NULL); + RNA_def_property_ui_text(prop, "Active Pose Marker", "Active pose marker for this Action"); + + prop= RNA_def_property(srna, "active_index", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "active_marker"); + RNA_def_property_int_funcs(prop, "rna_Action_active_pose_marker_index_get", "rna_Action_active_pose_marker_index_set", "rna_Action_active_pose_marker_index_range"); + RNA_def_property_ui_text(prop, "Active Pose Marker Index", "Index of active pose marker"); } static void rna_def_action(BlenderRNA *brna) diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c index 0fe8483dfac..80a5a5fbe4f 100644 --- a/source/blender/makesrna/intern/rna_actuator.c +++ b/source/blender/makesrna/intern/rna_actuator.c @@ -549,6 +549,7 @@ static void rna_def_action_actuator(BlenderRNA *brna) static EnumPropertyItem prop_type_items[] ={ {ACT_ACTION_PLAY, "PLAY", 0, "Play", ""}, + {ACT_ACTION_PINGPONG, "PINGPONG", 0, "Ping Pong", ""}, {ACT_ACTION_FLIPPER, "FLIPPER", 0, "Flipper", ""}, {ACT_ACTION_LOOP_STOP, "LOOPSTOP", 0, "Loop Stop", ""}, {ACT_ACTION_LOOP_END, "LOOPEND", 0, "Loop End", ""}, @@ -1778,6 +1779,7 @@ static void rna_def_shape_action_actuator(BlenderRNA *brna) static EnumPropertyItem prop_type_items[] ={ {ACT_ACTION_PLAY, "PLAY", 0, "Play", ""}, + {ACT_ACTION_PINGPONG, "PINGPONG", 0, "Ping Pong", ""}, {ACT_ACTION_FLIPPER, "FLIPPER", 0, "Flipper", ""}, {ACT_ACTION_LOOP_STOP, "LOOPSTOP", 0, "Loop Stop", ""}, {ACT_ACTION_LOOP_END, "LOOPEND", 0, "Loop End", ""}, diff --git a/source/blender/makesrna/intern/rna_brush.c b/source/blender/makesrna/intern/rna_brush.c index 60c28d8bae1..ce61a031ec7 100644 --- a/source/blender/makesrna/intern/rna_brush.c +++ b/source/blender/makesrna/intern/rna_brush.c @@ -764,7 +764,7 @@ static void rna_def_operator_stroke_element(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; - srna= RNA_def_struct(brna, "OperatorStrokeElement", "IDPropertyGroup"); + srna= RNA_def_struct(brna, "OperatorStrokeElement", "PropertyGroup"); RNA_def_struct_ui_text(srna, "Operator Stroke Element", ""); prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_XYZ); diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h index 71d66dffcbe..a94c17d40e1 100644 --- a/source/blender/makesrna/intern/rna_internal.h +++ b/source/blender/makesrna/intern/rna_internal.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -192,10 +192,10 @@ void rna_ID_name_set(struct PointerRNA *ptr, const char *value); struct StructRNA *rna_ID_refine(struct PointerRNA *ptr); struct IDProperty *rna_ID_idprops(struct PointerRNA *ptr, int create); void rna_ID_fake_user_set(struct PointerRNA *ptr, int value); -struct IDProperty *rna_IDPropertyGroup_idprops(struct PointerRNA *ptr, int create); -void rna_IDPropertyGroup_unregister(const struct bContext *C, struct StructRNA *type); -struct StructRNA *rna_IDPropertyGroup_register(struct bContext *C, struct ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free); -struct StructRNA* rna_IDPropertyGroup_refine(struct PointerRNA *ptr); +struct IDProperty *rna_PropertyGroup_idprops(struct PointerRNA *ptr, int create); +void rna_PropertyGroup_unregister(const struct bContext *C, struct StructRNA *type); +struct StructRNA *rna_PropertyGroup_register(struct bContext *C, struct ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free); +struct StructRNA* rna_PropertyGroup_refine(struct PointerRNA *ptr); void rna_object_vgroup_name_index_get(struct PointerRNA *ptr, char *value, int index); int rna_object_vgroup_name_index_length(struct PointerRNA *ptr, int index); @@ -281,19 +281,19 @@ void RNA_def_main_linestyles(BlenderRNA *brna, PropertyRNA *cprop); /* ID Properties */ -extern StringPropertyRNA rna_IDProperty_string; -extern IntPropertyRNA rna_IDProperty_int; -extern IntPropertyRNA rna_IDProperty_int_array; -extern FloatPropertyRNA rna_IDProperty_float; -extern FloatPropertyRNA rna_IDProperty_float_array; -extern PointerPropertyRNA rna_IDProperty_group; -extern CollectionPropertyRNA rna_IDProperty_collection; -extern CollectionPropertyRNA rna_IDProperty_idp_array; -extern FloatPropertyRNA rna_IDProperty_double; -extern FloatPropertyRNA rna_IDProperty_double_array; - -extern StructRNA RNA_IDProperty; -extern StructRNA RNA_IDPropertyGroup; +extern StringPropertyRNA rna_PropertyGroupItem_string; +extern IntPropertyRNA rna_PropertyGroupItem_int; +extern IntPropertyRNA rna_PropertyGroupItem_int_array; +extern FloatPropertyRNA rna_PropertyGroupItem_float; +extern FloatPropertyRNA rna_PropertyGroupItem_float_array; +extern PointerPropertyRNA rna_PropertyGroupItem_group; +extern CollectionPropertyRNA rna_PropertyGroupItem_collection; +extern CollectionPropertyRNA rna_PropertyGroupItem_idp_array; +extern FloatPropertyRNA rna_PropertyGroupItem_double; +extern FloatPropertyRNA rna_PropertyGroupItem_double_array; + +extern StructRNA RNA_PropertyGroupItem; +extern StructRNA RNA_PropertyGroup; struct IDProperty *rna_idproperty_check(struct PropertyRNA **prop, struct PointerRNA *ptr); diff --git a/source/blender/makesrna/intern/rna_main_api.c b/source/blender/makesrna/intern/rna_main_api.c index 04e24615ab2..fb282fc0f6d 100644 --- a/source/blender/makesrna/intern/rna_main_api.c +++ b/source/blender/makesrna/intern/rna_main_api.c @@ -548,8 +548,8 @@ void RNA_def_main_cameras(BlenderRNA *brna, PropertyRNA *cprop) FunctionRNA *func; PropertyRNA *parm; - RNA_def_property_srna(cprop, "MainCameras"); - srna= RNA_def_struct(brna, "MainCameras", NULL); + RNA_def_property_srna(cprop, "BlendDataCameras"); + srna= RNA_def_struct(brna, "BlendDataCameras", NULL); RNA_def_struct_ui_text(srna, "Main Cameras", "Collection of cameras"); func= RNA_def_function(srna, "new", "rna_Main_cameras_new"); @@ -577,8 +577,8 @@ void RNA_def_main_scenes(BlenderRNA *brna, PropertyRNA *cprop) FunctionRNA *func; PropertyRNA *parm; - RNA_def_property_srna(cprop, "MainScenes"); - srna= RNA_def_struct(brna, "MainScenes", NULL); + RNA_def_property_srna(cprop, "BlendDataScenes"); + srna= RNA_def_struct(brna, "BlendDataScenes", NULL); RNA_def_struct_ui_text(srna, "Main Scenes", "Collection of scenes"); func= RNA_def_function(srna, "new", "rna_Main_scenes_new"); @@ -602,8 +602,8 @@ void RNA_def_main_objects(BlenderRNA *brna, PropertyRNA *cprop) FunctionRNA *func; PropertyRNA *parm; - RNA_def_property_srna(cprop, "MainObjects"); - srna= RNA_def_struct(brna, "MainObjects", NULL); + RNA_def_property_srna(cprop, "BlendDataObjects"); + srna= RNA_def_struct(brna, "BlendDataObjects", NULL); RNA_def_struct_ui_text(srna, "Main Objects", "Collection of objects"); func= RNA_def_function(srna, "new", "rna_Main_objects_new"); @@ -635,8 +635,8 @@ void RNA_def_main_materials(BlenderRNA *brna, PropertyRNA *cprop) FunctionRNA *func; PropertyRNA *parm; - RNA_def_property_srna(cprop, "MainMaterials"); - srna= RNA_def_struct(brna, "MainMaterials", NULL); + RNA_def_property_srna(cprop, "BlendDataMaterials"); + srna= RNA_def_struct(brna, "BlendDataMaterials", NULL); RNA_def_struct_ui_text(srna, "Main Material", "Collection of materials"); func= RNA_def_function(srna, "new", "rna_Main_materials_new"); @@ -669,8 +669,8 @@ void RNA_def_main_node_groups(BlenderRNA *brna, PropertyRNA *cprop) {2, "TEXTURE", 0, "Texture", ""}, {0, NULL, 0, NULL, NULL}}; - RNA_def_property_srna(cprop, "MainNodeTrees"); - srna= RNA_def_struct(brna, "MainNodeTrees", NULL); + RNA_def_property_srna(cprop, "BlendDataNodeTrees"); + srna= RNA_def_struct(brna, "BlendDataNodeTrees", NULL); RNA_def_struct_ui_text(srna, "Main Node Trees", "Collection of node trees"); func= RNA_def_function(srna, "new", "rna_Main_nodetree_new"); @@ -699,8 +699,8 @@ void RNA_def_main_meshes(BlenderRNA *brna, PropertyRNA *cprop) FunctionRNA *func; PropertyRNA *parm; - RNA_def_property_srna(cprop, "MainMeshes"); - srna= RNA_def_struct(brna, "MainMeshes", NULL); + RNA_def_property_srna(cprop, "BlendDataMeshes"); + srna= RNA_def_struct(brna, "BlendDataMeshes", NULL); RNA_def_struct_ui_text(srna, "Main Meshes", "Collection of meshes"); func= RNA_def_function(srna, "new", "rna_Main_meshes_new"); @@ -727,8 +727,8 @@ void RNA_def_main_lamps(BlenderRNA *brna, PropertyRNA *cprop) FunctionRNA *func; PropertyRNA *parm; - RNA_def_property_srna(cprop, "MainLamps"); - srna= RNA_def_struct(brna, "MainLamps", NULL); + RNA_def_property_srna(cprop, "BlendDataLamps"); + srna= RNA_def_struct(brna, "BlendDataLamps", NULL); RNA_def_struct_ui_text(srna, "Main Lamps", "Collection of lamps"); func= RNA_def_function(srna, "new", "rna_Main_lamps_new"); @@ -758,8 +758,8 @@ void RNA_def_main_libraries(BlenderRNA *brna, PropertyRNA *cprop) FunctionRNA *func; PropertyRNA *parm; - RNA_def_property_srna(cprop, "MainLibraries"); - srna= RNA_def_struct(brna, "MainLibraries", NULL); + RNA_def_property_srna(cprop, "BlendDataLibraries"); + srna= RNA_def_struct(brna, "BlendDataLibraries", NULL); RNA_def_struct_ui_text(srna, "Main Libraries", "Collection of libraries"); func= RNA_def_function(srna, "tag", "rna_Main_libraries_tag"); @@ -773,8 +773,8 @@ void RNA_def_main_screens(BlenderRNA *brna, PropertyRNA *cprop) FunctionRNA *func; PropertyRNA *parm; - RNA_def_property_srna(cprop, "MainScreens"); - srna= RNA_def_struct(brna, "MainScreens", NULL); + RNA_def_property_srna(cprop, "BlendDataScreens"); + srna= RNA_def_struct(brna, "BlendDataScreens", NULL); RNA_def_struct_ui_text(srna, "Main Screens", "Collection of screens"); func= RNA_def_function(srna, "tag", "rna_Main_screens_tag"); @@ -788,8 +788,8 @@ void RNA_def_main_window_managers(BlenderRNA *brna, PropertyRNA *cprop) FunctionRNA *func; PropertyRNA *parm; - RNA_def_property_srna(cprop, "MainWindowManagers"); - srna= RNA_def_struct(brna, "MainWindowManagers", NULL); + RNA_def_property_srna(cprop, "BlendDataWindowManagers"); + srna= RNA_def_struct(brna, "BlendDataWindowManagers", NULL); RNA_def_struct_ui_text(srna, "Main Window Managers", "Collection of window managers"); func= RNA_def_function(srna, "tag", "rna_Main_window_managers_tag"); @@ -802,8 +802,8 @@ void RNA_def_main_images(BlenderRNA *brna, PropertyRNA *cprop) FunctionRNA *func; PropertyRNA *parm; - RNA_def_property_srna(cprop, "MainImages"); - srna= RNA_def_struct(brna, "MainImages", NULL); + RNA_def_property_srna(cprop, "BlendDataImages"); + srna= RNA_def_struct(brna, "BlendDataImages", NULL); RNA_def_struct_ui_text(srna, "Main Images", "Collection of images"); func= RNA_def_function(srna, "new", "rna_Main_images_new"); @@ -846,8 +846,8 @@ void RNA_def_main_lattices(BlenderRNA *brna, PropertyRNA *cprop) FunctionRNA *func; PropertyRNA *parm; - RNA_def_property_srna(cprop, "MainLattices"); - srna= RNA_def_struct(brna, "MainLattices", NULL); + RNA_def_property_srna(cprop, "BlendDataLattices"); + srna= RNA_def_struct(brna, "BlendDataLattices", NULL); RNA_def_struct_ui_text(srna, "Main Lattices", "Collection of lattices"); func= RNA_def_function(srna, "new", "rna_Main_lattices_new"); @@ -874,8 +874,8 @@ void RNA_def_main_curves(BlenderRNA *brna, PropertyRNA *cprop) FunctionRNA *func; PropertyRNA *parm; - RNA_def_property_srna(cprop, "MainCurves"); - srna= RNA_def_struct(brna, "MainCurves", NULL); + RNA_def_property_srna(cprop, "BlendDataCurves"); + srna= RNA_def_struct(brna, "BlendDataCurves", NULL); RNA_def_struct_ui_text(srna, "Main Curves", "Collection of curves"); func= RNA_def_function(srna, "new", "rna_Main_curves_new"); @@ -904,8 +904,8 @@ void RNA_def_main_metaballs(BlenderRNA *brna, PropertyRNA *cprop) FunctionRNA *func; PropertyRNA *parm; - RNA_def_property_srna(cprop, "MainMetaBalls"); - srna= RNA_def_struct(brna, "MainMetaBalls", NULL); + RNA_def_property_srna(cprop, "BlendDataMetaBalls"); + srna= RNA_def_struct(brna, "BlendDataMetaBalls", NULL); RNA_def_struct_ui_text(srna, "Main MetaBall", "Collection of metaballs"); func= RNA_def_function(srna, "new", "rna_Main_metaballs_new"); @@ -932,8 +932,8 @@ void RNA_def_main_fonts(BlenderRNA *brna, PropertyRNA *cprop) FunctionRNA *func; PropertyRNA *parm; - RNA_def_property_srna(cprop, "MainFonts"); - srna= RNA_def_struct(brna, "MainFonts", NULL); + RNA_def_property_srna(cprop, "BlendDataFonts"); + srna= RNA_def_struct(brna, "BlendDataFonts", NULL); RNA_def_struct_ui_text(srna, "Main Fonts", "Collection of fonts"); func= RNA_def_function(srna, "load", "rna_Main_fonts_load"); @@ -961,8 +961,8 @@ void RNA_def_main_textures(BlenderRNA *brna, PropertyRNA *cprop) FunctionRNA *func; PropertyRNA *parm; - RNA_def_property_srna(cprop, "MainTextures"); - srna= RNA_def_struct(brna, "MainTextures", NULL); + RNA_def_property_srna(cprop, "BlendDataTextures"); + srna= RNA_def_struct(brna, "BlendDataTextures", NULL); RNA_def_struct_ui_text(srna, "Main Textures", "Collection of groups"); func= RNA_def_function(srna, "new", "rna_Main_textures_new"); @@ -991,8 +991,8 @@ void RNA_def_main_brushes(BlenderRNA *brna, PropertyRNA *cprop) FunctionRNA *func; PropertyRNA *parm; - RNA_def_property_srna(cprop, "MainBrushes"); - srna= RNA_def_struct(brna, "MainBrushes", NULL); + RNA_def_property_srna(cprop, "BlendDataBrushes"); + srna= RNA_def_struct(brna, "BlendDataBrushes", NULL); RNA_def_struct_ui_text(srna, "Main Brushes", "Collection of brushes"); func= RNA_def_function(srna, "new", "rna_Main_brushes_new"); @@ -1020,8 +1020,8 @@ void RNA_def_main_worlds(BlenderRNA *brna, PropertyRNA *cprop) FunctionRNA *func; PropertyRNA *parm; - RNA_def_property_srna(cprop, "MainWorlds"); - srna= RNA_def_struct(brna, "MainWorlds", NULL); + RNA_def_property_srna(cprop, "BlendDataWorlds"); + srna= RNA_def_struct(brna, "BlendDataWorlds", NULL); RNA_def_struct_ui_text(srna, "Main Worlds", "Collection of worlds"); func= RNA_def_function(srna, "new", "rna_Main_worlds_new"); @@ -1049,8 +1049,8 @@ void RNA_def_main_groups(BlenderRNA *brna, PropertyRNA *cprop) FunctionRNA *func; PropertyRNA *parm; - RNA_def_property_srna(cprop, "MainGroups"); - srna= RNA_def_struct(brna, "MainGroups", NULL); + RNA_def_property_srna(cprop, "BlendDataGroups"); + srna= RNA_def_struct(brna, "BlendDataGroups", NULL); RNA_def_struct_ui_text(srna, "Main Groups", "Collection of groups"); func= RNA_def_function(srna, "new", "rna_Main_groups_new"); @@ -1077,8 +1077,8 @@ void RNA_def_main_texts(BlenderRNA *brna, PropertyRNA *cprop) FunctionRNA *func; PropertyRNA *parm; - RNA_def_property_srna(cprop, "MainTexts"); - srna= RNA_def_struct(brna, "MainTexts", NULL); + RNA_def_property_srna(cprop, "BlendDataTexts"); + srna= RNA_def_struct(brna, "BlendDataTexts", NULL); RNA_def_struct_ui_text(srna, "Main Texts", "Collection of texts"); func= RNA_def_function(srna, "new", "rna_Main_texts_new"); @@ -1116,8 +1116,8 @@ void RNA_def_main_sounds(BlenderRNA *brna, PropertyRNA *cprop) FunctionRNA *func; PropertyRNA *parm; - RNA_def_property_srna(cprop, "MainSounds"); - srna= RNA_def_struct(brna, "MainSounds", NULL); + RNA_def_property_srna(cprop, "BlendDataSounds"); + srna= RNA_def_struct(brna, "BlendDataSounds", NULL); RNA_def_struct_ui_text(srna, "Main Sounds", "Collection of sounds"); /* TODO, 'load' */ @@ -1133,8 +1133,8 @@ void RNA_def_main_armatures(BlenderRNA *brna, PropertyRNA *cprop) FunctionRNA *func; PropertyRNA *parm; - RNA_def_property_srna(cprop, "MainArmatures"); - srna= RNA_def_struct(brna, "MainArmatures", NULL); + RNA_def_property_srna(cprop, "BlendDataArmatures"); + srna= RNA_def_struct(brna, "BlendDataArmatures", NULL); RNA_def_struct_ui_text(srna, "Main Armatures", "Collection of armatures"); func= RNA_def_function(srna, "new", "rna_Main_armatures_new"); @@ -1161,8 +1161,8 @@ void RNA_def_main_actions(BlenderRNA *brna, PropertyRNA *cprop) FunctionRNA *func; PropertyRNA *parm; - RNA_def_property_srna(cprop, "MainActions"); - srna= RNA_def_struct(brna, "MainActions", NULL); + RNA_def_property_srna(cprop, "BlendDataActions"); + srna= RNA_def_struct(brna, "BlendDataActions", NULL); RNA_def_struct_ui_text(srna, "Main Actions", "Collection of actions"); func= RNA_def_function(srna, "new", "rna_Main_actions_new"); @@ -1189,8 +1189,8 @@ void RNA_def_main_particles(BlenderRNA *brna, PropertyRNA *cprop) FunctionRNA *func; PropertyRNA *parm; - RNA_def_property_srna(cprop, "MainParticles"); - srna= RNA_def_struct(brna, "MainParticles", NULL); + RNA_def_property_srna(cprop, "BlendDataParticles"); + srna= RNA_def_struct(brna, "BlendDataParticles", NULL); RNA_def_struct_ui_text(srna, "Main Particle Settings", "Collection of particle settings"); func= RNA_def_function(srna, "new", "rna_Main_particles_new"); @@ -1218,8 +1218,8 @@ void RNA_def_main_gpencil(BlenderRNA *brna, PropertyRNA *cprop) FunctionRNA *func; PropertyRNA *parm; - RNA_def_property_srna(cprop, "MainGreasePencils"); - srna= RNA_def_struct(brna, "MainGreasePencils", NULL); + RNA_def_property_srna(cprop, "BlendDataGreasePencils"); + srna= RNA_def_struct(brna, "BlendDataGreasePencils", NULL); RNA_def_struct_ui_text(srna, "Main Grease Pencils", "Collection of grease pencils"); func= RNA_def_function(srna, "tag", "rna_Main_gpencil_tag"); diff --git a/source/blender/makesrna/intern/rna_material.c b/source/blender/makesrna/intern/rna_material.c index 3d9eaa0b141..0c7a300d942 100644 --- a/source/blender/makesrna/intern/rna_material.c +++ b/source/blender/makesrna/intern/rna_material.c @@ -1875,7 +1875,7 @@ static void rna_def_texture_slots(BlenderRNA *brna, PropertyRNA *cprop, const ch func= RNA_def_function(srna, "clear", "rna_mtex_texture_slots_clear"); RNA_def_function_flag(func, FUNC_USE_SELF_ID|FUNC_NO_SELF|FUNC_USE_CONTEXT|FUNC_USE_REPORTS); - parm= RNA_def_int(func, "index", 0, 0, INT_MAX, "Index", "Slot index to clar.", 0, INT_MAX); + parm= RNA_def_int(func, "index", 0, 0, INT_MAX, "Index", "Slot index to clear.", 0, INT_MAX); RNA_def_property_flag(parm, PROP_REQUIRED); } diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index 01e6d57f2c6..faadc80afb2 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -477,6 +477,19 @@ static void rna_ShrinkwrapModifier_target_set(PointerRNA *ptr, PointerRNA value) modifier_object_set(ptr->id.data, &((ShrinkwrapModifierData*)ptr->data)->target, OB_MESH, value); } +static int rna_ShrinkwrapModifier_face_cull_get(PointerRNA *ptr) +{ + ShrinkwrapModifierData *swm= (ShrinkwrapModifierData*)ptr->data; + return swm->shrinkOpts & (MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE|MOD_SHRINKWRAP_CULL_TARGET_BACKFACE); +} + +static void rna_ShrinkwrapModifier_face_cull_set(struct PointerRNA *ptr, int value) +{ + ShrinkwrapModifierData *swm= (ShrinkwrapModifierData*)ptr->data; + + swm->shrinkOpts= (swm->shrinkOpts & ~(MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE|MOD_SHRINKWRAP_CULL_TARGET_BACKFACE)) | value; +} + static void rna_MeshDeformModifier_object_set(PointerRNA *ptr, PointerRNA value) { modifier_object_set(ptr->id.data, &((MeshDeformModifierData*)ptr->data)->object, OB_MESH, value); @@ -1875,6 +1888,12 @@ static void rna_def_modifier_shrinkwrap(BlenderRNA *brna) {MOD_SHRINKWRAP_PROJECT, "PROJECT", 0, "Project", ""}, {MOD_SHRINKWRAP_NEAREST_VERTEX, "NEAREST_VERTEX", 0, "Nearest Vertex", ""}, {0, NULL, 0, NULL, NULL}}; + + static EnumPropertyItem shrink_face_cull_items[] = { + {0, "OFF", 0, "Off", ""}, + {MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE, "FRONT", 0, "Front", ""}, + {MOD_SHRINKWRAP_CULL_TARGET_BACKFACE, "BACK", 0, "Back", ""}, + {0, NULL, 0, NULL, NULL}}; srna= RNA_def_struct(brna, "ShrinkwrapModifier", "Modifier"); RNA_def_struct_ui_text(srna, "Shrinkwrap Modifier", "Shrink wrapping modifier to shrink wrap and object to a target"); @@ -1887,6 +1906,13 @@ static void rna_def_modifier_shrinkwrap(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Mode", ""); RNA_def_property_update(prop, 0, "rna_Modifier_update"); + prop= RNA_def_property(srna, "cull_face", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "shrinkOpts"); + RNA_def_property_enum_items(prop, shrink_face_cull_items); + RNA_def_property_enum_funcs(prop, "rna_ShrinkwrapModifier_face_cull_get", "rna_ShrinkwrapModifier_face_cull_set", NULL); + RNA_def_property_ui_text(prop, "Face Cull", "Stop vertices from projecting to a the face on the target when facing towards/away"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + prop= RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE); RNA_def_property_ui_text(prop, "Target", "Mesh target to shrink to"); RNA_def_property_pointer_funcs(prop, NULL, "rna_ShrinkwrapModifier_target_set", NULL, "rna_Mesh_object_poll"); @@ -1945,16 +1971,6 @@ static void rna_def_modifier_shrinkwrap(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Positive", "Allow vertices to move in the positive direction of axis"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "use_cull_front_faces", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "shrinkOpts", MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE); - RNA_def_property_ui_text(prop, "Cull Front Faces", "Stop vertices from projecting to a front face on the target"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - - prop= RNA_def_property(srna, "use_cull_back_faces", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "shrinkOpts", MOD_SHRINKWRAP_CULL_TARGET_BACKFACE); - RNA_def_property_ui_text(prop, "Cull Back Faces", "Stop vertices from projecting to a back face on the target"); - RNA_def_property_update(prop, 0, "rna_Modifier_update"); - prop= RNA_def_property(srna, "use_keep_above_surface", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "shrinkOpts", MOD_SHRINKWRAP_KEEP_ABOVE_SURFACE); RNA_def_property_ui_text(prop, "Keep Above Surface", ""); diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index ccaa6eb111a..85cc3a2eea9 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -2254,6 +2254,7 @@ static void rna_def_object(BlenderRNA *brna) /* pose */ prop= RNA_def_property(srna, "pose_library", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "poselib"); + RNA_def_property_flag(prop, PROP_EDITABLE); RNA_def_property_struct_type(prop, "Action"); RNA_def_property_ui_text(prop, "Pose Library", "Action used as a pose library for armatures"); diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c index ac4b86b4036..9f1ef7396c0 100644 --- a/source/blender/makesrna/intern/rna_object_api.c +++ b/source/blender/makesrna/intern/rna_object_api.c @@ -331,7 +331,7 @@ static PointerRNA rna_Object_shape_key_add(Object *ob, bContext *C, ReportList * int rna_Object_is_visible(Object *ob, Scene *sce) { - return !(ob->restrictflag & OB_RESTRICT_VIEW) && ob->lay & sce->lay; + return !(ob->restrictflag & OB_RESTRICT_VIEW) && (ob->lay & sce->lay); } /* diff --git a/source/blender/makesrna/intern/rna_object_force.c b/source/blender/makesrna/intern/rna_object_force.c index fb8617bc626..e0809510751 100644 --- a/source/blender/makesrna/intern/rna_object_force.c +++ b/source/blender/makesrna/intern/rna_object_force.c @@ -1169,7 +1169,7 @@ static void rna_def_field(BlenderRNA *brna) prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "f_size"); RNA_def_property_range(prop, 0.0f, 10.0f); - RNA_def_property_ui_text(prop, "Size", "Size of the noise"); + RNA_def_property_ui_text(prop, "Size", "Size of the turbulence"); RNA_def_property_update(prop, 0, "rna_FieldSettings_update"); prop= RNA_def_property(srna, "rest_length", PROP_FLOAT, PROP_NONE); @@ -1223,7 +1223,7 @@ static void rna_def_field(BlenderRNA *brna) prop= RNA_def_property(srna, "noise", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "f_noise"); RNA_def_property_range(prop, 0.0f, 10.0f); - RNA_def_property_ui_text(prop, "Noise", "Noise of the force"); + RNA_def_property_ui_text(prop, "Noise", "Amount of noise for the force strength"); RNA_def_property_update(prop, 0, "rna_FieldSettings_update"); prop= RNA_def_property(srna, "seed", PROP_INT, PROP_UNSIGNED); diff --git a/source/blender/makesrna/intern/rna_rna.c b/source/blender/makesrna/intern/rna_rna.c index d0a4647efc3..84d2dce7669 100644 --- a/source/blender/makesrna/intern/rna_rna.c +++ b/source/blender/makesrna/intern/rna_rna.c @@ -488,6 +488,12 @@ static int rna_Property_is_hidden_get(PointerRNA *ptr) return prop->flag & PROP_HIDDEN ? 1:0; } +static int rna_Property_is_enum_flag_get(PointerRNA *ptr) +{ + PropertyRNA *prop= (PropertyRNA*)ptr->data; + return prop->flag & PROP_ENUM_FLAG ? 1:0; +} + static int rna_Property_array_length_get(PointerRNA *ptr) { PropertyRNA *prop= (PropertyRNA*)ptr->data; @@ -1044,6 +1050,11 @@ static void rna_def_property(BlenderRNA *brna) RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_boolean_funcs(prop, "rna_Property_runtime_get", NULL); RNA_def_property_ui_text(prop, "Read Only", "Property is editable through RNA"); + + prop= RNA_def_property(srna, "is_enum_flag", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_boolean_funcs(prop, "rna_Property_is_enum_flag_get", NULL); + RNA_def_property_ui_text(prop, "Enum Flag", "True when multiple enums "); } static void rna_def_function(BlenderRNA *brna) @@ -1209,6 +1220,14 @@ static void rna_def_enum_property(BlenderRNA *brna, StructRNA *srna) RNA_def_property_enum_funcs(prop, "rna_EnumProperty_default_get", NULL, "rna_EnumProperty_default_itemf"); RNA_def_property_ui_text(prop, "Default", "Default value for this enum"); + /* same 'default' but uses 'PROP_ENUM_FLAG' */ + prop= RNA_def_property(srna, "default_flag", PROP_ENUM, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_flag(prop, PROP_ENUM_FLAG); + RNA_def_property_enum_items(prop, default_dummy_items); + RNA_def_property_enum_funcs(prop, "rna_EnumProperty_default_get", NULL, "rna_EnumProperty_default_itemf"); + RNA_def_property_ui_text(prop, "Default", "Default value for this enum"); + prop= RNA_def_property(srna, "items", PROP_COLLECTION, PROP_NONE); RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_struct_type(prop, "EnumPropertyItem"); diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 3bd0b32aa86..1b1a5400a8e 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -2277,6 +2277,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna) {R_OUTPUT_SCREEN, "SCREEN", 0, "Full Screen", "Images are rendered in full Screen"}, {R_OUTPUT_AREA, "AREA", 0, "Image Editor", "Images are rendered in Image Editor"}, {R_OUTPUT_WINDOW, "WINDOW", 0, "New Window", "Images are rendered in new Window"}, + {R_OUTPUT_NONE, "NONE", 0, "No Output", "Images are rendered without drawing"}, {0, NULL, 0, NULL, NULL}}; /* Bake */ diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index e122f99776d..70c0b70e326 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -1698,6 +1698,17 @@ static void rna_def_space_text(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Font Size", "Font size to use for displaying the text"); RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL); + prop= RNA_def_property(srna, "show_margin", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flags", ST_SHOW_MARGIN); + RNA_def_property_ui_text(prop, "Show Margin", "Show right margin"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL); + + prop= RNA_def_property(srna, "margin_column", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "margin_column"); + RNA_def_property_range(prop, 0, 1024); + RNA_def_property_ui_text(prop, "Margin Column", "Column number to show right margin at"); + RNA_def_property_update(prop, NC_SPACE|ND_SPACE_TEXT, NULL); + /* functionality options */ prop= RNA_def_property(srna, "use_overwrite", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "overwrite", 1); diff --git a/source/blender/makesrna/intern/rna_ui.c b/source/blender/makesrna/intern/rna_ui.c index 35186b91901..fc9bbbfb76c 100644 --- a/source/blender/makesrna/intern/rna_ui.c +++ b/source/blender/makesrna/intern/rna_ui.c @@ -620,20 +620,20 @@ static void rna_def_panel(BlenderRNA *brna) RNA_def_function_flag(func, FUNC_NO_SELF|FUNC_REGISTER|FUNC_REGISTER_OPTIONAL); RNA_def_function_return(func, RNA_def_boolean(func, "visible", 1, "", "")); parm= RNA_def_pointer(func, "context", "Context", "", ""); - RNA_def_property_flag(parm, PROP_REQUIRED); + RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); /* draw */ func= RNA_def_function(srna, "draw", NULL); RNA_def_function_ui_description(func, "Draw UI elements into the panel UI layout."); RNA_def_function_flag(func, FUNC_REGISTER); parm= RNA_def_pointer(func, "context", "Context", "", ""); - RNA_def_property_flag(parm, PROP_REQUIRED); + RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); func= RNA_def_function(srna, "draw_header", NULL); RNA_def_function_ui_description(func, "Draw UI elements into the panel's header UI layout."); RNA_def_function_flag(func, FUNC_REGISTER); parm= RNA_def_pointer(func, "context", "Context", "", ""); - RNA_def_property_flag(parm, PROP_REQUIRED); + RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); prop= RNA_def_property(srna, "layout", PROP_POINTER, PROP_NONE); RNA_def_property_struct_type(prop, "UILayout"); diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c index 022f818d7d7..7c3d0cc9a01 100644 --- a/source/blender/makesrna/intern/rna_ui_api.c +++ b/source/blender/makesrna/intern/rna_ui_api.c @@ -202,14 +202,14 @@ void RNA_api_ui_layout(StructRNA *srna) RNA_def_function_return(func, parm); RNA_def_function_ui_description(func, "Item. Places a button into the layout to call an Operator."); -/* func= RNA_def_function(srna, "operator_enum", "uiItemEnumO_string"); +/* func= RNA_def_function(srna, "operator_enum_single", "uiItemEnumO_string"); api_ui_item_op_common(func); parm= RNA_def_string(func, "property", "", 0, "", "Identifier of property in operator."); RNA_def_property_flag(parm, PROP_REQUIRED); parm= RNA_def_string(func, "value", "", 0, "", "Enum property value."); RNA_def_property_flag(parm, PROP_REQUIRED); */ - func= RNA_def_function(srna, "operator_enums", "uiItemsEnumO"); + func= RNA_def_function(srna, "operator_enum", "uiItemsEnumO"); parm= RNA_def_string(func, "operator", "", 0, "", "Identifier of the operator."); RNA_def_property_flag(parm, PROP_REQUIRED); parm= RNA_def_string(func, "property", "", 0, "", "Identifier of property in operator."); diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index b2b38bc38be..7959d139833 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -1708,6 +1708,7 @@ static void rna_def_userdef_themes(BlenderRNA *brna) static EnumPropertyItem active_theme_area[] = { {0, "USER_INTERFACE", ICON_UI, "User Interface", ""}, + {18, "COLOR_SETS", ICON_COLOR, "Bone Color Sets", ""}, {1, "VIEW_3D", ICON_VIEW3D, "3D View", ""}, {2, "TIMELINE", ICON_TIME, "Timeline", ""}, {3, "GRAPH_EDITOR", ICON_IPO, "Graph Editor", ""}, diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c index c432123d6ba..fd328a1545b 100644 --- a/source/blender/makesrna/intern/rna_wm.c +++ b/source/blender/makesrna/intern/rna_wm.c @@ -241,6 +241,11 @@ EnumPropertyItem event_type_items[] = { {PAGEDOWNKEY, "PAGE_DOWN", 0, "Page Down", ""}, {ENDKEY, "END", 0, "End", ""}, {0, "", 0, NULL, NULL}, + {MEDIAPLAY, "MEDIA_PLAY", 0, "Media Play/Pause", ""}, + {MEDIASTOP, "MEDIA_STOP", 0, "Media Stop", ""}, + {MEDIAFIRST, "MEDIA_FIRST", 0, "Media First", ""}, + {MEDIALAST, "MEDIA_LAST", 0, "Media Last", ""}, + {0, "", 0, NULL, NULL}, {WINDEACTIVATE, "WINDOW_DEACTIVATE", 0, "Window Deactivate", ""}, {TIMER, "TIMER", 0, "Timer", ""}, {TIMER0, "TIMER0", 0, "Timer 0", ""}, @@ -1268,7 +1273,7 @@ static void rna_def_operator_utils(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; - srna= RNA_def_struct(brna, "OperatorMousePath", "IDPropertyGroup"); + srna= RNA_def_struct(brna, "OperatorMousePath", "PropertyGroup"); RNA_def_struct_ui_text(srna, "Operator Mouse Path", "Mouse path values for operators that record such paths"); prop= RNA_def_property(srna, "loc", PROP_FLOAT, PROP_XYZ); @@ -1286,7 +1291,7 @@ static void rna_def_operator_filelist_element(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; - srna= RNA_def_struct(brna, "OperatorFileListElement", "IDPropertyGroup"); + srna= RNA_def_struct(brna, "OperatorFileListElement", "PropertyGroup"); RNA_def_struct_ui_text(srna, "Operator File List Element", ""); diff --git a/source/blender/makesrna/intern/rna_wm_api.c b/source/blender/makesrna/intern/rna_wm_api.c index b934bdfc979..87ef0d61410 100644 --- a/source/blender/makesrna/intern/rna_wm_api.c +++ b/source/blender/makesrna/intern/rna_wm_api.c @@ -158,13 +158,15 @@ void RNA_api_operator(StructRNA *srna) RNA_def_function_ui_description(func, "Test if the operator can be called or not."); RNA_def_function_flag(func, FUNC_NO_SELF|FUNC_REGISTER_OPTIONAL); RNA_def_function_return(func, RNA_def_boolean(func, "visible", 1, "", "")); - RNA_def_pointer(func, "context", "Context", "", ""); + parm= RNA_def_pointer(func, "context", "Context", "", ""); + RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); /* exec */ func= RNA_def_function(srna, "execute", NULL); RNA_def_function_ui_description(func, "Execute the operator."); RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL); - RNA_def_pointer(func, "context", "Context", "", ""); + parm= RNA_def_pointer(func, "context", "Context", "", ""); + RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); parm= RNA_def_enum_flag(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", ""); // better name? RNA_def_function_return(func, parm); @@ -173,7 +175,8 @@ void RNA_api_operator(StructRNA *srna) func= RNA_def_function(srna, "check", NULL); RNA_def_function_ui_description(func, "Check the operator settings."); RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL); - RNA_def_pointer(func, "context", "Context", "", ""); + parm= RNA_def_pointer(func, "context", "Context", "", ""); + RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); parm= RNA_def_boolean(func, "result", 0, "result", ""); // better name? RNA_def_function_return(func, parm); @@ -182,8 +185,10 @@ void RNA_api_operator(StructRNA *srna) func= RNA_def_function(srna, "invoke", NULL); RNA_def_function_ui_description(func, "Invoke the operator."); RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL); - RNA_def_pointer(func, "context", "Context", "", ""); - RNA_def_pointer(func, "event", "Event", "", ""); + parm= RNA_def_pointer(func, "context", "Context", "", ""); + RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); + parm= RNA_def_pointer(func, "event", "Event", "", ""); + RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); parm= RNA_def_enum_flag(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", ""); // better name? RNA_def_function_return(func, parm); @@ -191,8 +196,10 @@ void RNA_api_operator(StructRNA *srna) func= RNA_def_function(srna, "modal", NULL); /* same as invoke */ RNA_def_function_ui_description(func, "Modal operator function."); RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL); - RNA_def_pointer(func, "context", "Context", "", ""); - RNA_def_pointer(func, "event", "Event", "", ""); + parm= RNA_def_pointer(func, "context", "Context", "", ""); + RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); + parm= RNA_def_pointer(func, "event", "Event", "", ""); + RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); parm= RNA_def_enum_flag(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", ""); // better name? RNA_def_function_return(func, parm); @@ -201,7 +208,8 @@ void RNA_api_operator(StructRNA *srna) func= RNA_def_function(srna, "draw", NULL); RNA_def_function_ui_description(func, "Draw function for the operator."); RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL); - RNA_def_pointer(func, "context", "Context", "", ""); + parm= RNA_def_pointer(func, "context", "Context", "", ""); + RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); } void RNA_api_macro(StructRNA *srna) @@ -224,13 +232,15 @@ void RNA_api_macro(StructRNA *srna) RNA_def_function_ui_description(func, "Test if the operator can be called or not."); RNA_def_function_flag(func, FUNC_NO_SELF|FUNC_REGISTER_OPTIONAL); RNA_def_function_return(func, RNA_def_boolean(func, "visible", 1, "", "")); - RNA_def_pointer(func, "context", "Context", "", ""); + parm= RNA_def_pointer(func, "context", "Context", "", ""); + RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); /* draw */ func= RNA_def_function(srna, "draw", NULL); RNA_def_function_ui_description(func, "Draw function for the operator."); RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL); - RNA_def_pointer(func, "context", "Context", "", ""); + parm= RNA_def_pointer(func, "context", "Context", "", ""); + RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL); } void RNA_api_keyconfig(StructRNA *srna) diff --git a/source/blender/modifiers/SConscript b/source/blender/modifiers/SConscript index 874aefbaa22..8ea4f893bb9 100644 --- a/source/blender/modifiers/SConscript +++ b/source/blender/modifiers/SConscript @@ -21,4 +21,4 @@ if env['BF_NO_ELBEEM']: env.BlenderLib ( libname = 'bf_modifiers', sources = sources, includes = Split(incs), defines=defs, - libtype=['core','player'], priority = [180, 40] ) + libtype=['core','player'], priority = [80, 40] ) diff --git a/source/blender/modifiers/intern/MOD_particlesystem.c b/source/blender/modifiers/intern/MOD_particlesystem.c index c7638afbbcc..2f3bc0c53f4 100644 --- a/source/blender/modifiers/intern/MOD_particlesystem.c +++ b/source/blender/modifiers/intern/MOD_particlesystem.c @@ -80,25 +80,20 @@ static void copyData(ModifierData *md, ModifierData *target) tpsmd->psys = psmd->psys; } -static CustomDataMask requiredDataMask(Object *ob, ModifierData *md) +static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md) { ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md; CustomDataMask dataMask = 0; - Material *ma; MTex *mtex; int i; if(!psmd->psys->part) return 0; - ma= give_current_material(ob, psmd->psys->part->omat); - if(ma) { - for(i=0; i<MAX_MTEX; i++) { - mtex=ma->mtex[i]; - if(mtex && (ma->septex & (1<<i))==0) - if(mtex->pmapto && (mtex->texco & TEXCO_UV)) - dataMask |= CD_MASK_MTFACE; - } + for(i=0; i<MAX_MTEX; i++) { + mtex = psmd->psys->part->mtex[i]; + if(mtex && mtex->mapto && (mtex->texco & TEXCO_UV)) + dataMask |= CD_MASK_MTFACE; } if(psmd->psys->part->tanfac!=0.0) diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_image.c b/source/blender/nodes/intern/CMP_nodes/CMP_image.c index d5176bf6816..5c39e6ea159 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_image.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_image.c @@ -339,7 +339,7 @@ static CompBuf *compbuf_from_pass(RenderData *rd, RenderLayer *rl, int rectx, in return NULL; }; -void node_composit_rlayers_out(RenderData *rd, RenderLayer *rl, bNodeStack **out, int rectx, int recty) +static void node_composit_rlayers_out(RenderData *rd, RenderLayer *rl, bNodeStack **out, int rectx, int recty) { if(out[RRES_OUT_Z]->hasoutput) out[RRES_OUT_Z]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_Z); diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_math.c b/source/blender/nodes/intern/CMP_nodes/CMP_math.c index 7a8dadafb86..f5ca9bb9959 100644 --- a/source/blender/nodes/intern/CMP_nodes/CMP_math.c +++ b/source/blender/nodes/intern/CMP_nodes/CMP_math.c @@ -94,11 +94,18 @@ static void do_math(bNode *node, float *out, float *in, float *in2) break; case 10: /* Power */ { - /* Don't want any imaginary numbers... */ - if( in[0] >= 0 ) + /* Only raise negative numbers by full integers */ + if( in[0] >= 0 ) { out[0]= pow(in[0], in2[0]); - else - out[0]= 0.0; + } else { + float y_mod_1 = fmod(in2[0], 1); + /* if input value is not nearly an integer, fall back to zero, nicer than straight rounding */ + if (y_mod_1 > 0.999 || y_mod_1 < 0.001) { + out[0]= pow(in[0], floor(in2[0] + 0.5)); + } else { + out[0] = 0.0; + } + } } break; case 11: /* Logarithm */ diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_math.c b/source/blender/nodes/intern/TEX_nodes/TEX_math.c index 7e1c54b6e47..c5adfa97fd4 100644 --- a/source/blender/nodes/intern/TEX_nodes/TEX_math.c +++ b/source/blender/nodes/intern/TEX_nodes/TEX_math.c @@ -106,11 +106,17 @@ static void valuefn(float *out, TexParams *p, bNode *node, bNodeStack **in, shor break; case 10: /* Power */ { - /* Don't want any imaginary numbers... */ - if( in0 >= 0 ) - *out= pow(in0, in1); - else - *out= 0.0; + /* Only raise negative numbers by full integers */ + if( in0 >= 0 ) { + out[0]= pow(in0, in1); + } else { + float y_mod_1 = fmod(in1, 1); + if (y_mod_1 > 0.999 || y_mod_1 < 0.001) { + *out = pow(in0, floor(in1 + 0.5)); + } else { + *out = 0.0; + } + } } break; case 11: /* Logarithm */ diff --git a/source/blender/nodes/intern/TEX_util.c b/source/blender/nodes/intern/TEX_util.c index d288b13a66c..60f4cf5aef4 100644 --- a/source/blender/nodes/intern/TEX_util.c +++ b/source/blender/nodes/intern/TEX_util.c @@ -57,7 +57,7 @@ void tex_call_delegate(TexDelegate *dg, float *out, TexParams *params, short thr } } -void tex_input(float *out, int sz, bNodeStack *in, TexParams *params, short thread) +static void tex_input(float *out, int sz, bNodeStack *in, TexParams *params, short thread) { TexDelegate *dg = in->data; if(dg) { diff --git a/source/blender/python/BPY_extern.h b/source/blender/python/BPY_extern.h index 5ee4664fd57..e559f0bf57b 100644 --- a/source/blender/python/BPY_extern.h +++ b/source/blender/python/BPY_extern.h @@ -60,7 +60,7 @@ void BPY_pyconstraint_update(struct Object *owner, struct bConstraint *con); int BPY_is_pyconstraint(struct Text *text); // void BPY_free_pyconstraint_links(struct Text *text); // -void BPY_python_start( int argc, char **argv ); +void BPY_python_start(int argc, const char **argv); void BPY_python_end( void ); // void init_syspath( int first_time ); // void syspath_append( char *dir ); diff --git a/source/blender/python/generic/CMakeLists.txt b/source/blender/python/generic/CMakeLists.txt index 58d69db4a0e..b3dec148e9d 100644 --- a/source/blender/python/generic/CMakeLists.txt +++ b/source/blender/python/generic/CMakeLists.txt @@ -34,13 +34,13 @@ set(SRC blf_py_api.c bpy_internal_import.c mathutils.c - mathutils_color.c - mathutils_euler.c + mathutils_Color.c + mathutils_Euler.c + mathutils_Matrix.c + mathutils_Quaternion.c + mathutils_Vector.c mathutils_geometry.c - mathutils_matrix.c - mathutils_quat.c - mathutils_vector.c - noise.c + noise_py_api.c py_capi_utils.c IDProp.h @@ -48,13 +48,15 @@ set(SRC blf_py_api.h bpy_internal_import.h mathutils.h - mathutils_color.h - mathutils_euler.h + mathutils_Color.h + mathutils_Euler.h + mathutils_Matrix.h + mathutils_Quaternion.h + mathutils_Vector.h mathutils_geometry.h - mathutils_matrix.h - mathutils_quat.h - mathutils_vector.h + noise_py_api.h py_capi_utils.h ) + blender_add_lib(bf_python_ext "${SRC}" "${INC}") diff --git a/source/blender/python/generic/IDProp.c b/source/blender/python/generic/IDProp.c index ad0c96afa17..8004af95050 100644 --- a/source/blender/python/generic/IDProp.c +++ b/source/blender/python/generic/IDProp.c @@ -23,6 +23,8 @@ * ***** END GPL LICENSE BLOCK ***** */ +#include <Python.h> + #include "IDProp.h" #include "MEM_guardedalloc.h" diff --git a/source/blender/python/generic/IDProp.h b/source/blender/python/generic/IDProp.h index cd5bff4788e..b0a3b894f08 100644 --- a/source/blender/python/generic/IDProp.h +++ b/source/blender/python/generic/IDProp.h @@ -22,7 +22,8 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include <Python.h> +#ifndef IDPROP_H +#define IDPROP_H struct ID; struct IDProperty; @@ -62,3 +63,5 @@ void IDProp_Init_Types(void); #define IDPROP_ITER_KEYS 0 #define IDPROP_ITER_ITEMS 1 + +#endif /* IDPROP_H */ diff --git a/source/blender/python/generic/bgl.c b/source/blender/python/generic/bgl.c index 2b15a6f4826..63d310ae4e0 100644 --- a/source/blender/python/generic/bgl.c +++ b/source/blender/python/generic/bgl.c @@ -31,6 +31,8 @@ * The BGL submodule "wraps" OpenGL functions and constants, * allowing script writers to make OpenGL calls in their Python scripts. */ +#include <Python.h> + #include "bgl.h" /*This must come first */ #include <GL/glew.h> #include "MEM_guardedalloc.h" @@ -38,7 +40,6 @@ #include "BLI_utildefines.h" - static char Method_Buffer_doc[] = "(type, dimensions, [template]) - Create a new Buffer object\n\n\ (type) - The format to store data in\n\ diff --git a/source/blender/python/generic/bgl.h b/source/blender/python/generic/bgl.h index 049b3f101a0..48462bc108e 100644 --- a/source/blender/python/generic/bgl.h +++ b/source/blender/python/generic/bgl.h @@ -36,8 +36,6 @@ #ifndef BGL_H #define BGL_H -#include <Python.h> - PyObject *BPyInit_bgl(void); /*@ Create a buffer object */ diff --git a/source/blender/python/generic/mathutils.c b/source/blender/python/generic/mathutils.c index f56ac6c61bf..1f802edcdea 100644 --- a/source/blender/python/generic/mathutils.c +++ b/source/blender/python/generic/mathutils.c @@ -87,6 +87,8 @@ * - geometry.BarycentricTransform -> barycentric_transform */ +#include <Python.h> + #include "mathutils.h" #include "BLI_math.h" @@ -271,7 +273,7 @@ int _BaseMathObject_ReadCallback(BaseMathObject *self) return 1; if(!PyErr_Occurred()) - PyErr_Format(PyExc_SystemError, "%s user has become invalid", Py_TYPE(self)->tp_name); + PyErr_Format(PyExc_RuntimeError, "%s user has become invalid", Py_TYPE(self)->tp_name); return 0; } @@ -282,7 +284,7 @@ int _BaseMathObject_WriteCallback(BaseMathObject *self) return 1; if(!PyErr_Occurred()) - PyErr_Format(PyExc_SystemError, "%s user has become invalid", Py_TYPE(self)->tp_name); + PyErr_Format(PyExc_RuntimeError, "%s user has become invalid", Py_TYPE(self)->tp_name); return 0; } @@ -293,7 +295,7 @@ int _BaseMathObject_ReadIndexCallback(BaseMathObject *self, int index) return 1; if(!PyErr_Occurred()) - PyErr_Format(PyExc_SystemError, "%s user has become invalid", Py_TYPE(self)->tp_name); + PyErr_Format(PyExc_RuntimeError, "%s user has become invalid", Py_TYPE(self)->tp_name); return 0; } @@ -304,7 +306,7 @@ int _BaseMathObject_WriteIndexCallback(BaseMathObject *self, int index) return 1; if(!PyErr_Occurred()) - PyErr_Format(PyExc_SystemError, "%s user has become invalid", Py_TYPE(self)->tp_name); + PyErr_Format(PyExc_RuntimeError, "%s user has become invalid", Py_TYPE(self)->tp_name); return 0; } diff --git a/source/blender/python/generic/mathutils.h b/source/blender/python/generic/mathutils.h index 07342f8144b..8442b66a1db 100644 --- a/source/blender/python/generic/mathutils.h +++ b/source/blender/python/generic/mathutils.h @@ -31,8 +31,6 @@ #ifndef MATHUTILS_H #define MATHUTILS_H -#include <Python.h> - /* Can cast different mathutils types to this, use for generic funcs */ extern char BaseMathObject_Wrapped_doc[]; @@ -50,11 +48,11 @@ typedef struct { BASE_MATH_MEMBERS(data) } BaseMathObject; -#include "mathutils_vector.h" -#include "mathutils_matrix.h" -#include "mathutils_quat.h" -#include "mathutils_euler.h" -#include "mathutils_color.h" +#include "mathutils_Vector.h" +#include "mathutils_Matrix.h" +#include "mathutils_Quaternion.h" +#include "mathutils_Euler.h" +#include "mathutils_Color.h" #include "mathutils_geometry.h" PyObject *BaseMathObject_getOwner( BaseMathObject * self, void * ); diff --git a/source/blender/python/generic/mathutils_color.c b/source/blender/python/generic/mathutils_Color.c index f7e62242703..1c870ead438 100644 --- a/source/blender/python/generic/mathutils_color.c +++ b/source/blender/python/generic/mathutils_Color.c @@ -22,13 +22,13 @@ * ***** END GPL LICENSE BLOCK ***** */ +#include <Python.h> + #include "mathutils.h" #include "BLI_math.h" #include "BLI_utildefines.h" - - #define COLOR_SIZE 3 //----------------------------------mathutils.Color() ------------------- diff --git a/source/blender/python/generic/mathutils_color.h b/source/blender/python/generic/mathutils_Color.h index f3f185b2991..619cccbe085 100644 --- a/source/blender/python/generic/mathutils_color.h +++ b/source/blender/python/generic/mathutils_Color.h @@ -31,8 +31,6 @@ #ifndef MATHUTILS_COLOR_H #define MATHUTILS_COLOR_H -#include <Python.h> - extern PyTypeObject color_Type; #define ColorObject_Check(_v) PyObject_TypeCheck((_v), &color_Type) diff --git a/source/blender/python/generic/mathutils_euler.c b/source/blender/python/generic/mathutils_Euler.c index b6040274065..dd48df63e25 100644 --- a/source/blender/python/generic/mathutils_euler.c +++ b/source/blender/python/generic/mathutils_Euler.c @@ -26,13 +26,13 @@ * ***** END GPL LICENSE BLOCK ***** */ +#include <Python.h> + #include "mathutils.h" #include "BLI_math.h" #include "BLI_utildefines.h" - - #ifndef int32_t #include "BLO_sys_types.h" #endif @@ -243,9 +243,6 @@ static char Euler_make_compatible_doc[] = "\n" " Make this euler compatible with another, so interpolating between them works as intended.\n" "\n" -" :arg other: make compatible with this rotation.\n" -" :type other: :class:`Euler`\n" -"\n" " .. note:: the rotation order is not taken into account for this function.\n" ; static PyObject *Euler_make_compatible(EulerObject * self, PyObject *value) diff --git a/source/blender/python/generic/mathutils_euler.h b/source/blender/python/generic/mathutils_Euler.h index fc4e4ddb667..1bb26ec21d2 100644 --- a/source/blender/python/generic/mathutils_euler.h +++ b/source/blender/python/generic/mathutils_Euler.h @@ -31,8 +31,6 @@ #ifndef MATHUTILS_EULER_H #define MATHUTILS_EULER_H -#include <Python.h> - extern PyTypeObject euler_Type; #define EulerObject_Check(_v) PyObject_TypeCheck((_v), &euler_Type) diff --git a/source/blender/python/generic/mathutils_matrix.c b/source/blender/python/generic/mathutils_Matrix.c index 1da8141eef1..87979af61b7 100644 --- a/source/blender/python/generic/mathutils_matrix.c +++ b/source/blender/python/generic/mathutils_Matrix.c @@ -25,6 +25,8 @@ * ***** END GPL LICENSE BLOCK ***** */ +#include <Python.h> + #include "mathutils.h" #include "BLI_math.h" diff --git a/source/blender/python/generic/mathutils_matrix.h b/source/blender/python/generic/mathutils_Matrix.h index 7b980222048..505a7253f1a 100644 --- a/source/blender/python/generic/mathutils_matrix.h +++ b/source/blender/python/generic/mathutils_Matrix.h @@ -30,8 +30,6 @@ #ifndef MATHUTILS_MATRIX_H #define MATHUTILS_MATRIX_H -#include <Python.h> - extern PyTypeObject matrix_Type; #define MatrixObject_Check(_v) PyObject_TypeCheck((_v), &matrix_Type) #define MATRIX_MAX_DIM 4 diff --git a/source/blender/python/generic/mathutils_quat.c b/source/blender/python/generic/mathutils_Quaternion.c index e577d808091..08b813ade16 100644 --- a/source/blender/python/generic/mathutils_quat.c +++ b/source/blender/python/generic/mathutils_Quaternion.c @@ -26,6 +26,8 @@ * ***** END GPL LICENSE BLOCK ***** */ +#include <Python.h> + #include "mathutils.h" #include "BLI_math.h" @@ -995,7 +997,7 @@ static struct PyMethodDef Quaternion_methods[] = { {"dot", (PyCFunction) Quaternion_dot, METH_O, Quaternion_dot_doc}, {"difference", (PyCFunction) Quaternion_difference, METH_O, Quaternion_difference_doc}, {"slerp", (PyCFunction) Quaternion_slerp, METH_VARARGS, Quaternion_slerp_doc}, - {"rotate", (PyCFunction) Quaternion_rotate, METH_VARARGS, Quaternion_rotate_doc}, + {"rotate", (PyCFunction) Quaternion_rotate, METH_O, Quaternion_rotate_doc}, {"__copy__", (PyCFunction) Quaternion_copy, METH_NOARGS, Quaternion_copy_doc}, {"copy", (PyCFunction) Quaternion_copy, METH_NOARGS, Quaternion_copy_doc}, diff --git a/source/blender/python/generic/mathutils_quat.h b/source/blender/python/generic/mathutils_Quaternion.h index cfa82f20d42..6052dfa1a41 100644 --- a/source/blender/python/generic/mathutils_quat.h +++ b/source/blender/python/generic/mathutils_Quaternion.h @@ -31,8 +31,6 @@ #ifndef MATHUTILS_QUAT_H #define MATHUTILS_QUAT_H -#include <Python.h> - extern PyTypeObject quaternion_Type; #define QuaternionObject_Check(_v) PyObject_TypeCheck((_v), &quaternion_Type) diff --git a/source/blender/python/generic/mathutils_vector.c b/source/blender/python/generic/mathutils_Vector.c index 0da5fe983ad..0efd805697f 100644 --- a/source/blender/python/generic/mathutils_vector.c +++ b/source/blender/python/generic/mathutils_Vector.c @@ -25,6 +25,8 @@ * ***** END GPL LICENSE BLOCK ***** */ +#include <Python.h> + #include "mathutils.h" #include "BLI_blenlib.h" diff --git a/source/blender/python/generic/mathutils_vector.h b/source/blender/python/generic/mathutils_Vector.h index 2dbe9d9d3fe..4013a392ff9 100644 --- a/source/blender/python/generic/mathutils_vector.h +++ b/source/blender/python/generic/mathutils_Vector.h @@ -31,8 +31,6 @@ #ifndef MATHUTILS_VECTOR_H #define MATHUTILS_VECTOR_H -#include <Python.h> - extern PyTypeObject vector_Type; #define VectorObject_Check(_v) PyObject_TypeCheck((_v), &vector_Type) diff --git a/source/blender/python/generic/mathutils_geometry.c b/source/blender/python/generic/mathutils_geometry.c index d1e9a2452f3..62867eb46c1 100644 --- a/source/blender/python/generic/mathutils_geometry.c +++ b/source/blender/python/generic/mathutils_geometry.c @@ -27,6 +27,8 @@ * ***** END GPL LICENSE BLOCK ***** */ +#include <Python.h> + #include "mathutils_geometry.h" /* Used for PolyFill */ diff --git a/source/blender/python/generic/mathutils_geometry.h b/source/blender/python/generic/mathutils_geometry.h index 27c24848efe..1af25c7a751 100644 --- a/source/blender/python/generic/mathutils_geometry.h +++ b/source/blender/python/generic/mathutils_geometry.h @@ -31,7 +31,6 @@ #ifndef MATHUTILS_GEOMETRY_H #define MATHUTILS_GEOMETRY_H -#include <Python.h> #include "mathutils.h" PyMODINIT_FUNC BPyInit_mathutils_geometry(void); diff --git a/source/blender/python/generic/noise.c b/source/blender/python/generic/noise_py_api.c index 36147493dc5..73818971564 100644 --- a/source/blender/python/generic/noise.c +++ b/source/blender/python/generic/noise_py_api.c @@ -35,6 +35,7 @@ /************************/ #include <Python.h> + #include "structseq.h" #include "BLI_blenlib.h" @@ -42,6 +43,7 @@ #include "DNA_texture_types.h" +#include "noise_py_api.h" /*-----------------------------------------*/ /* 'mersenne twister' random number generator */ diff --git a/source/blender/python/generic/noise_py_api.h b/source/blender/python/generic/noise_py_api.h new file mode 100644 index 00000000000..eaaddabeb9e --- /dev/null +++ b/source/blender/python/generic/noise_py_api.h @@ -0,0 +1,29 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Campbell Barton + * + * ***** END GPL LICENSE BLOCK ***** + */ +#ifndef NOISE_PY_API_H +#define NOISE_PY_API_H + +PyObject *BPyInit_noise(void); + +#endif // NOISE_PY_API_H diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c index 9f7a9f2cabe..e8618883874 100644 --- a/source/blender/python/generic/py_capi_utils.c +++ b/source/blender/python/generic/py_capi_utils.c @@ -21,6 +21,7 @@ */ #include <Python.h> + #include "py_capi_utils.h" /* for debugging */ @@ -77,7 +78,7 @@ void PyC_FileAndNum(const char **filename, int *lineno) if (filename) { co_filename= PyC_Object_GetAttrStringArgs(frame, 2, "f_code", "co_filename"); if (co_filename==NULL) { - PyErr_SetString(PyExc_SystemError, "Could not access sys._getframe().f_code.co_filename"); + PyErr_SetString(PyExc_RuntimeError, "Could not access sys._getframe().f_code.co_filename"); Py_DECREF(frame); return; } @@ -108,7 +109,7 @@ void PyC_FileAndNum(const char **filename, int *lineno) if (lineno) { f_lineno= PyObject_GetAttrString(frame, "f_lineno"); if (f_lineno==NULL) { - PyErr_SetString(PyExc_SystemError, "Could not access sys._getframe().f_lineno"); + PyErr_SetString(PyExc_RuntimeError, "Could not access sys._getframe().f_lineno"); Py_DECREF(frame); return; } diff --git a/source/blender/python/intern/CMakeLists.txt b/source/blender/python/intern/CMakeLists.txt index c77736df992..970c5ee3012 100644 --- a/source/blender/python/intern/CMakeLists.txt +++ b/source/blender/python/intern/CMakeLists.txt @@ -53,6 +53,7 @@ set(SRC bpy.h bpy_app.h + bpy_driver.h bpy_operator.h bpy_operator_wrap.h bpy_props.h diff --git a/source/blender/python/intern/bpy.c b/source/blender/python/intern/bpy.c index c315e1e2427..450c4ec6962 100644 --- a/source/blender/python/intern/bpy.c +++ b/source/blender/python/intern/bpy.c @@ -27,6 +27,8 @@ #define WITH_PYTHON /* for AUD_PyInit.h, possibly others */ +#include <Python.h> + #include "bpy.h" #include "bpy_util.h" #include "bpy_rna.h" @@ -208,7 +210,7 @@ void BPy_init_modules( void ) BPY_rna_init(); PyModule_AddObject( mod, "types", BPY_rna_types() ); /* needs to be first so bpy_types can run */ - PyModule_AddObject(mod, "StructMetaIDProp", (PyObject *)&pyrna_struct_meta_idprop_Type); /* metaclass for idprop types, bpy_types.py needs access */ + PyModule_AddObject(mod, "StructMetaPropGroup", (PyObject *)&pyrna_struct_meta_idprop_Type); /* metaclass for idprop types, bpy_types.py needs access */ bpy_import_test("bpy_types"); PyModule_AddObject( mod, "data", BPY_rna_module() ); /* imports bpy_types by running this */ diff --git a/source/blender/python/intern/bpy_app.c b/source/blender/python/intern/bpy_app.c index 422563776f4..bc7e981df98 100644 --- a/source/blender/python/intern/bpy_app.c +++ b/source/blender/python/intern/bpy_app.c @@ -22,7 +22,10 @@ * ***** END GPL LICENSE BLOCK ***** */ +#include <Python.h> + #include "bpy_app.h" +#include "bpy_driver.h" #include "BLI_path_util.h" #include "BLI_utildefines.h" diff --git a/source/blender/python/intern/bpy_app.h b/source/blender/python/intern/bpy_app.h index 02cadc66f48..cb71880ee7e 100644 --- a/source/blender/python/intern/bpy_app.h +++ b/source/blender/python/intern/bpy_app.h @@ -21,15 +21,9 @@ * * ***** END GPL LICENSE BLOCK ***** */ -#ifndef BPY_APP_H__ -#define BPY_APP_H__ - -#include <Python.h> +#ifndef BPY_APP_H +#define BPY_APP_H PyObject *BPY_app_struct( void ); -/* bpy_driver.c */ -int bpy_pydriver_create_dict(void); -extern PyObject *bpy_pydriver_Dict; - -#endif +#endif // BPY_APP_H diff --git a/source/blender/python/intern/bpy_driver.c b/source/blender/python/intern/bpy_driver.c index 161b56d39aa..2b49f78929a 100644 --- a/source/blender/python/intern/bpy_driver.c +++ b/source/blender/python/intern/bpy_driver.c @@ -34,6 +34,8 @@ #include "BKE_fcurve.h" #include "BKE_global.h" +#include "bpy_driver.h" + /* for pydrivers (drivers using one-line Python expressions to express relationships between targets) */ PyObject *bpy_pydriver_Dict = NULL; diff --git a/source/blender/python/intern/bpy_driver.h b/source/blender/python/intern/bpy_driver.h new file mode 100644 index 00000000000..27a077248fa --- /dev/null +++ b/source/blender/python/intern/bpy_driver.h @@ -0,0 +1,36 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contributor(s): Campbell Barton + * + * ***** END GPL LICENSE BLOCK ***** + */ +#ifndef BPY_DRIVER_H +#define BPY_DRIVER_H + +struct ChannelDriver; + +int bpy_pydriver_create_dict(void); +extern PyObject *bpy_pydriver_Dict; + +/* externals */ +float BPY_driver_exec(struct ChannelDriver *driver); +void BPY_driver_reset(void); + +#endif // BPY_DRIVER_H diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index cf47e40c2ed..4ae1b41bb89 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -56,6 +56,12 @@ #include "../generic/bpy_internal_import.h" // our own imports #include "../generic/py_capi_utils.h" +/* inittab initialization functions */ +#include "../generic/noise_py_api.h" +#include "../generic/mathutils.h" +#include "../generic/bgl.h" +#include "../generic/blf_py_api.h" + /* for internal use, when starting and ending python scripts */ /* incase a python script triggers another python call, stop bpy_context_clear from invalidating */ @@ -197,12 +203,7 @@ void BPY_context_set(bContext *C) BPy_SetContext(C); } -/* init-tab */ -extern PyObject *BPyInit_noise(void); -extern PyObject *BPyInit_mathutils(void); -// extern PyObject *BPyInit_mathutils_geometry(void); // BPyInit_mathutils calls, py doesnt work with thos :S -extern PyObject *BPyInit_bgl(void); -extern PyObject *BPyInit_blf(void); +/* defined in AUD_C-API.cpp */ extern PyObject *AUD_initPython(void); static struct _inittab bpy_internal_modules[]= { @@ -216,7 +217,7 @@ static struct _inittab bpy_internal_modules[]= { }; /* call BPY_context_set first */ -void BPY_python_start( int argc, char **argv ) +void BPY_python_start(int argc, const char **argv) { PyThreadState *py_tstate = NULL; @@ -399,7 +400,7 @@ static int python_script_exec(bContext *C, const char *fn, struct Text *text, st #endif } else { - PyErr_Format(PyExc_SystemError, "Python file \"%s\" could not be opened: %s", fn, strerror(errno)); + PyErr_Format(PyExc_IOError, "Python file \"%s\" could not be opened: %s", fn, strerror(errno)); py_result= NULL; } } diff --git a/source/blender/python/intern/bpy_operator.c b/source/blender/python/intern/bpy_operator.c index 70aa46c1302..cb527f562eb 100644 --- a/source/blender/python/intern/bpy_operator.c +++ b/source/blender/python/intern/bpy_operator.c @@ -24,9 +24,11 @@ */ /* Note, this module is not to be used directly by the user. - * its accessed from blender with bpy.__ops__ + * Internally its exposed as '_bpy.ops', which provides functions for 'bpy.ops', a python package. * */ +#include <Python.h> + #include "bpy_operator.h" #include "bpy_operator_wrap.h" #include "bpy_rna.h" /* for setting arg props only - pyrna_py_to_prop() */ @@ -41,6 +43,7 @@ #include "MEM_guardedalloc.h" #include "BKE_report.h" +#include "BKE_context.h" static PyObject *pyop_poll(PyObject *UNUSED(self), PyObject *args) { @@ -57,7 +60,7 @@ static PyObject *pyop_poll(PyObject *UNUSED(self), PyObject *args) bContext *C= (bContext *)BPy_GetContext(); if(C==NULL) { - PyErr_SetString(PyExc_SystemError, "Context is None, cant poll any operators"); + PyErr_SetString(PyExc_RuntimeError, "Context is None, cant poll any operators"); return NULL; } @@ -67,7 +70,7 @@ static PyObject *pyop_poll(PyObject *UNUSED(self), PyObject *args) ot= WM_operatortype_find(opname, TRUE); if (ot == NULL) { - PyErr_Format(PyExc_SystemError, "Polling operator \"bpy.ops.%s\" error, could not be found", opname); + PyErr_Format(PyExc_AttributeError, "Polling operator \"bpy.ops.%s\" error, could not be found", opname); return NULL; } @@ -124,7 +127,7 @@ static PyObject *pyop_call(PyObject *UNUSED(self), PyObject *args) bContext *C = (bContext *)BPy_GetContext(); if(C==NULL) { - PyErr_SetString(PyExc_SystemError, "Context is None, cant poll any operators"); + PyErr_SetString(PyExc_RuntimeError, "Context is None, cant poll any operators"); return NULL; } @@ -134,12 +137,12 @@ static PyObject *pyop_call(PyObject *UNUSED(self), PyObject *args) ot= WM_operatortype_find(opname, TRUE); if (ot == NULL) { - PyErr_Format(PyExc_SystemError, "Calling operator \"bpy.ops.%s\" error, could not be found", opname); + PyErr_Format(PyExc_AttributeError, "Calling operator \"bpy.ops.%s\" error, could not be found", opname); return NULL; } if(!pyrna_write_check()) { - PyErr_Format(PyExc_SystemError, "Calling operator \"bpy.ops.%s\" error, can't modify blend data in this state (drawing/rendering)", opname); + PyErr_Format(PyExc_RuntimeError, "Calling operator \"bpy.ops.%s\" error, can't modify blend data in this state (drawing/rendering)", opname); return NULL; } @@ -167,7 +170,7 @@ static PyObject *pyop_call(PyObject *UNUSED(self), PyObject *args) if(WM_operator_poll_context((bContext*)C, ot, context) == FALSE) { const char *msg= CTX_wm_operator_poll_msg_get(C); - PyErr_Format(PyExc_SystemError, "Operator bpy.ops.%.200s.poll() %.200s", opname, msg ? msg : "failed, context is incorrect"); + PyErr_Format(PyExc_RuntimeError, "Operator bpy.ops.%.200s.poll() %.200s", opname, msg ? msg : "failed, context is incorrect"); CTX_wm_operator_poll_msg_set(C, NULL); /* better set to NULL else it could be used again */ error_val= -1; } @@ -255,10 +258,10 @@ static PyObject *pyop_as_string(PyObject *UNUSED(self), PyObject *args) char *buf = NULL; PyObject *pybuf; - bContext *C = (bContext *)BPy_GetContext(); + bContext *C= (bContext *)BPy_GetContext(); if(C==NULL) { - PyErr_SetString(PyExc_SystemError, "Context is None, cant get the string representation of this object."); + PyErr_SetString(PyExc_RuntimeError, "Context is None, cant get the string representation of this object."); return NULL; } @@ -268,7 +271,7 @@ static PyObject *pyop_as_string(PyObject *UNUSED(self), PyObject *args) ot= WM_operatortype_find(opname, TRUE); if (ot == NULL) { - PyErr_Format(PyExc_SystemError, "_bpy.ops.as_string: operator \"%.200s\"could not be found", opname); + PyErr_Format(PyExc_AttributeError, "_bpy.ops.as_string: operator \"%.200s\"could not be found", opname); return NULL; } diff --git a/source/blender/python/intern/bpy_operator.h b/source/blender/python/intern/bpy_operator.h index 1a73b3eee55..f45f91dbe1f 100644 --- a/source/blender/python/intern/bpy_operator.h +++ b/source/blender/python/intern/bpy_operator.h @@ -25,13 +25,6 @@ #ifndef BPY_OPERATOR_H #define BPY_OPERATOR_H -#include <Python.h> - -#include "RNA_access.h" -#include "RNA_types.h" -#include "DNA_windowmanager_types.h" -#include "BKE_context.h" - extern PyTypeObject pyop_base_Type; #define BPy_OperatorBase_Check(v) (PyObject_TypeCheck(v, &pyop_base_Type)) diff --git a/source/blender/python/intern/bpy_operator_wrap.c b/source/blender/python/intern/bpy_operator_wrap.c index 12c67f9e03f..51ab889e321 100644 --- a/source/blender/python/intern/bpy_operator_wrap.c +++ b/source/blender/python/intern/bpy_operator_wrap.c @@ -23,6 +23,8 @@ * ***** END GPL LICENSE BLOCK ***** */ +#include <Python.h> + #include "bpy_operator_wrap.h" #include "WM_api.h" #include "WM_types.h" diff --git a/source/blender/python/intern/bpy_operator_wrap.h b/source/blender/python/intern/bpy_operator_wrap.h index b61fd1323f1..919e82059b7 100644 --- a/source/blender/python/intern/bpy_operator_wrap.h +++ b/source/blender/python/intern/bpy_operator_wrap.h @@ -25,8 +25,13 @@ #ifndef BPY_OPERATOR_WRAP_H #define BPY_OPERATOR_WRAP_H -#include <Python.h> +struct wmOperatorType; /* these are used for operator methods, used by bpy_operator.c */ PyObject *PYOP_wrap_macro_define(PyObject *self, PyObject *args); + +/* exposed to rna/wm api */ +void operator_wrapper(struct wmOperatorType *ot, void *userdata); +void macro_wrapper(struct wmOperatorType *ot, void *userdata); + #endif diff --git a/source/blender/python/intern/bpy_props.c b/source/blender/python/intern/bpy_props.c index 7ed5db6e6dc..2bdaa5267e1 100644 --- a/source/blender/python/intern/bpy_props.c +++ b/source/blender/python/intern/bpy_props.c @@ -22,14 +22,14 @@ * ***** END GPL LICENSE BLOCK ***** */ +#include <Python.h> + #include "bpy_props.h" #include "bpy_rna.h" #include "bpy_util.h" #include "BLI_utildefines.h" - - #include "RNA_define.h" /* for defining our own rna */ #include "RNA_enum_types.h" @@ -162,6 +162,16 @@ static PyObject *bpy_prop_deferred_return(PyObject *func, PyObject *kw) } \ +#define BPY_PROPDEF_NAME_DOC \ +" :arg name: Name used in the user interface.\n" \ +" :type name: string\n" \ + + +#define BPY_PROPDEF_DESC_DOC \ +" :arg description: Text used for the tooltip and api documentation.\n" \ +" :type description: string\n" \ + + #if 0 static int bpy_struct_id_used(StructRNA *srna, char *identifier) { @@ -179,11 +189,13 @@ static char BPy_BoolProperty_doc[] = "\n" " Returns a new boolean property definition.\n" "\n" +BPY_PROPDEF_NAME_DOC +BPY_PROPDEF_DESC_DOC " :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE'].\n" " :type options: set\n" " :arg subtype: Enumerator in ['UNSIGNED', 'PERCENTAGE', 'FACTOR', 'ANGLE', 'TIME', 'DISTANCE', 'NONE'].\n" -" :type subtype: string"; - +" :type subtype: string\n" +; static PyObject *BPy_BoolProperty(PyObject *self, PyObject *args, PyObject *kw) { StructRNA *srna; @@ -225,10 +237,17 @@ static char BPy_BoolVectorProperty_doc[] = "\n" " Returns a new vector boolean property definition.\n" "\n" +BPY_PROPDEF_NAME_DOC +BPY_PROPDEF_DESC_DOC +" :arg default: sequence of booleans the length of *size*.\n" +" :type default: sequence\n" " :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE'].\n" " :type options: set\n" " :arg subtype: Enumerator in ['COLOR', 'TRANSLATION', 'DIRECTION', 'VELOCITY', 'ACCELERATION', 'MATRIX', 'EULER', 'QUATERNION', 'AXISANGLE', 'XYZ', 'COLOR_GAMMA', 'LAYER', 'NONE'].\n" -" :type subtype: string"; +" :type subtype: string\n" +" :arg size: Vector dimensions in [1, and " STRINGIFY(PYRNA_STACK_ARRAY) "].\n" +" :type size: int\n" +; static PyObject *BPy_BoolVectorProperty(PyObject *self, PyObject *args, PyObject *kw) { StructRNA *srna; @@ -282,10 +301,13 @@ static char BPy_IntProperty_doc[] = "\n" " Returns a new int property definition.\n" "\n" +BPY_PROPDEF_NAME_DOC +BPY_PROPDEF_DESC_DOC " :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE'].\n" " :type options: set\n" " :arg subtype: Enumerator in ['UNSIGNED', 'PERCENTAGE', 'FACTOR', 'ANGLE', 'TIME', 'DISTANCE', 'NONE'].\n" -" :type subtype: string"; +" :type subtype: string\n" +; static PyObject *BPy_IntProperty(PyObject *self, PyObject *args, PyObject *kw) { StructRNA *srna; @@ -328,10 +350,17 @@ static char BPy_IntVectorProperty_doc[] = "\n" " Returns a new vector int property definition.\n" "\n" +BPY_PROPDEF_NAME_DOC +BPY_PROPDEF_DESC_DOC +" :arg default: sequence of ints the length of *size*.\n" +" :type default: sequence\n" " :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE'].\n" " :type options: set\n" " :arg subtype: Enumerator in ['COLOR', 'TRANSLATION', 'DIRECTION', 'VELOCITY', 'ACCELERATION', 'MATRIX', 'EULER', 'QUATERNION', 'AXISANGLE', 'XYZ', 'COLOR_GAMMA', 'LAYER', 'NONE'].\n" -" :type subtype: string"; +" :type subtype: string\n" +" :arg size: Vector dimensions in [1, and " STRINGIFY(PYRNA_STACK_ARRAY) "].\n" +" :type size: int\n" +; static PyObject *BPy_IntVectorProperty(PyObject *self, PyObject *args, PyObject *kw) { StructRNA *srna; @@ -386,12 +415,15 @@ static char BPy_FloatProperty_doc[] = "\n" " Returns a new float property definition.\n" "\n" +BPY_PROPDEF_NAME_DOC +BPY_PROPDEF_DESC_DOC " :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE'].\n" " :type options: set\n" " :arg subtype: Enumerator in ['UNSIGNED', 'PERCENTAGE', 'FACTOR', 'ANGLE', 'TIME', 'DISTANCE', 'NONE'].\n" " :type subtype: string\n" " :arg unit: Enumerator in ['NONE', 'LENGTH', 'AREA', 'VOLUME', 'ROTATION', 'TIME', 'VELOCITY', 'ACCELERATION'].\n" -" :type unit: string\n"; +" :type unit: string\n" +; static PyObject *BPy_FloatProperty(PyObject *self, PyObject *args, PyObject *kw) { StructRNA *srna; @@ -442,10 +474,17 @@ static char BPy_FloatVectorProperty_doc[] = "\n" " Returns a new vector float property definition.\n" "\n" +BPY_PROPDEF_NAME_DOC +BPY_PROPDEF_DESC_DOC +" :arg default: sequence of floats the length of *size*.\n" +" :type default: sequence\n" " :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE'].\n" " :type options: set\n" " :arg subtype: Enumerator in ['COLOR', 'TRANSLATION', 'DIRECTION', 'VELOCITY', 'ACCELERATION', 'MATRIX', 'EULER', 'QUATERNION', 'AXISANGLE', 'XYZ', 'COLOR_GAMMA', 'LAYER', 'NONE'].\n" -" :type subtype: string"; +" :type subtype: string\n" +" :arg size: Vector dimensions in [1, and " STRINGIFY(PYRNA_STACK_ARRAY) "].\n" +" :type size: int\n" +; static PyObject *BPy_FloatVectorProperty(PyObject *self, PyObject *args, PyObject *kw) { StructRNA *srna; @@ -499,10 +538,13 @@ static char BPy_StringProperty_doc[] = "\n" " Returns a new string property definition.\n" "\n" +BPY_PROPDEF_NAME_DOC +BPY_PROPDEF_DESC_DOC " :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE'].\n" " :type options: set\n" " :arg subtype: Enumerator in ['FILE_PATH', 'DIR_PATH', 'FILENAME', 'NONE'].\n" -" :type subtype: string"; +" :type subtype: string\n" +; static PyObject *BPy_StringProperty(PyObject *self, PyObject *args, PyObject *kw) { StructRNA *srna; @@ -635,12 +677,15 @@ static char BPy_EnumProperty_doc[] = "\n" " Returns a new enumerator property definition.\n" "\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" " :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"; +" :type items: sequence of string triplets\n" +; static PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw) { StructRNA *srna; @@ -697,17 +742,17 @@ static StructRNA *pointer_type_from_py(PyObject *value, const char *error_prefix if(PyErr_Occurred()) { PyObject *msg= PyC_ExceptionBuffer(); char *msg_char= _PyUnicode_AsString(msg); - PyErr_Format(PyExc_TypeError, "%.200s expected an RNA type derived from IDPropertyGroup, failed with: %s", error_prefix, msg_char); + PyErr_Format(PyExc_TypeError, "%.200s expected an RNA type derived from PropertyGroup, failed with: %s", error_prefix, msg_char); Py_DECREF(msg); } else { - PyErr_Format(PyExc_TypeError, "%.200s expected an RNA type derived from IDPropertyGroup, failed with type '%s'", error_prefix, Py_TYPE(value)->tp_name); + PyErr_Format(PyExc_TypeError, "%.200s expected an RNA type derived from PropertyGroup, failed with type '%s'", error_prefix, Py_TYPE(value)->tp_name); } return NULL; } - if(!RNA_struct_is_a(srna, &RNA_IDPropertyGroup)) { - PyErr_Format(PyExc_SystemError, "%.200s expected an RNA type derived from IDPropertyGroup", error_prefix); + if(!RNA_struct_is_a(srna, &RNA_PropertyGroup)) { + PyErr_Format(PyExc_TypeError, "%.200s expected an RNA type derived from PropertyGroup", error_prefix); return NULL; } @@ -715,14 +760,17 @@ static StructRNA *pointer_type_from_py(PyObject *value, const char *error_prefix } static char BPy_PointerProperty_doc[] = -".. function:: PointerProperty(items, type=\"\", description=\"\", default=\"\", options={'ANIMATABLE'})\n" +".. function:: PointerProperty(type=\"\", description=\"\", options={'ANIMATABLE'})\n" "\n" " Returns a new pointer property definition.\n" "\n" +" :arg type: A subclass of :class:`bpy.types.PropertyGroup`.\n" +" :type type: class\n" +BPY_PROPDEF_NAME_DOC +BPY_PROPDEF_DESC_DOC " :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE'].\n" " :type options: set\n" -" :arg type: Dynamic type from :mod:`bpy.types`.\n" -" :type type: class"; +; static PyObject *BPy_PointerProperty(PyObject *self, PyObject *args, PyObject *kw) { StructRNA *srna; @@ -763,10 +811,13 @@ static char BPy_CollectionProperty_doc[] = "\n" " Returns a new collection property definition.\n" "\n" +" :arg type: A subclass of :class:`bpy.types.PropertyGroup`.\n" +" :type type: class\n" +BPY_PROPDEF_NAME_DOC +BPY_PROPDEF_DESC_DOC " :arg options: Enumerator in ['HIDDEN', 'ANIMATABLE'].\n" " :type options: set\n" -" :arg type: Dynamic type from :mod:`bpy.types`.\n" -" :type type: class"; +; static PyObject *BPy_CollectionProperty(PyObject *self, PyObject *args, PyObject *kw) { StructRNA *srna; @@ -808,7 +859,8 @@ static char BPy_RemoveProperty_doc[] = " Removes a dynamically defined property.\n" "\n" " :arg attr: Property name.\n" -" :type attr: string"; +" :type attr: string\n" +; static PyObject *BPy_RemoveProperty(PyObject *self, PyObject *args, PyObject *kw) { StructRNA *srna; diff --git a/source/blender/python/intern/bpy_props.h b/source/blender/python/intern/bpy_props.h index fc295ccdf5d..136dd2b5b2f 100644 --- a/source/blender/python/intern/bpy_props.h +++ b/source/blender/python/intern/bpy_props.h @@ -25,8 +25,6 @@ #ifndef BPY_PROPS_H #define BPY_PROPS_H -#include <Python.h> - PyObject *BPY_rna_props( void ); #define PYRNA_STACK_ARRAY 32 diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index b5460edbd3a..fa01eefa867 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -21,6 +21,9 @@ * * ***** END GPL LICENSE BLOCK ***** */ + +#include <Python.h> + #include <float.h> /* FLT_MIN/MAX */ #include "bpy_rna.h" @@ -76,7 +79,7 @@ static int rna_id_write_error(PointerRNA *ptr, PyObject *key) /* make a nice string error */ BLI_assert(idtype != NULL); - PyErr_Format(PyExc_RuntimeError, "Writing to ID classes in this context is not allowed: %.200s, %.200s datablock, error setting %.200s.%.200s", id->name+2, idtype, RNA_struct_identifier(ptr->type), pyname); + PyErr_Format(PyExc_AttributeError, "Writing to ID classes in this context is not allowed: %.200s, %.200s datablock, error setting %.200s.%.200s", id->name+2, idtype, RNA_struct_identifier(ptr->type), pyname); return TRUE; } @@ -564,7 +567,7 @@ static PyObject *pyrna_prop_str( BPy_PropertyRNA *self ) int type= RNA_property_type(self->prop); if(RNA_enum_id_from_value(property_type_items, type, &type_id)==0) { - PyErr_SetString(PyExc_SystemError, "could not use property type, internal error"); /* should never happen */ + PyErr_SetString(PyExc_RuntimeError, "could not use property type, internal error"); /* should never happen */ return NULL; } else { @@ -595,6 +598,12 @@ static PyObject *pyrna_prop_str( BPy_PropertyRNA *self ) return ret; } } + if(RNA_property_type(self->prop) == PROP_COLLECTION) { + PointerRNA r_ptr; + if(RNA_property_collection_type_get(&self->ptr, self->prop, &r_ptr)) { + return PyUnicode_FromFormat( "<bpy_%.200s, %.200s>", type_fmt, RNA_struct_identifier(r_ptr.type)); + } + } return PyUnicode_FromFormat( "<bpy_%.200s, %.200s.%.200s>", type_fmt, RNA_struct_identifier(self->ptr.type), RNA_property_identifier(self->prop)); } @@ -690,6 +699,10 @@ static int pyrna_string_to_enum(PyObject *item, PointerRNA *ptr, PropertyRNA *pr MEM_freeN((void *)enum_str); return 0; } else { + /* hack so that dynamic enums used for operator properties will be able to be built (i.e. context will be supplied to itemf) + * and thus running defining operator buttons for such operators in UI will work */ + RNA_def_property_clear_flag(prop, PROP_ENUM_NO_CONTEXT); + if (!RNA_property_enum_value(BPy_GetContext(), ptr, prop, param, val)) { const char *enum_str= pyrna_enum_as_string(ptr, prop); PyErr_Format(PyExc_TypeError, "%.200s enum \"%.200s\" not found in (%.200s)", error_prefix, param, enum_str); @@ -717,7 +730,7 @@ int pyrna_set_to_enum_bitfield(EnumPropertyItem *items, PyObject *value, int *r_ const char *param= _PyUnicode_AsString(key); if(param==NULL) { - PyErr_Format(PyExc_TypeError, "%.200s expected a string. found a %.200s", error_prefix, Py_TYPE(key)->tp_name); + PyErr_Format(PyExc_TypeError, "%.200s expected a string, not %.200s", error_prefix, Py_TYPE(key)->tp_name); return -1; } if(pyrna_enum_value_from_id(items, param, &ret, error_prefix) < 0) @@ -802,14 +815,14 @@ static PyObject *pyrna_enum_to_py(PointerRNA *ptr, PropertyRNA *prop, int val) if (RNA_property_enum_identifier(BPy_GetContext(), ptr, prop, val, &identifier)) { ret = PyUnicode_FromString(identifier); } else { - EnumPropertyItem *item; + EnumPropertyItem *enum_item; int free= FALSE; /* don't throw error here, can't trust blender 100% to give the * right values, python code should not generate error for that */ - RNA_property_enum_items(BPy_GetContext(), ptr, prop, &item, NULL, &free); - if(item && item->identifier) { - ret= PyUnicode_FromString(item->identifier); + RNA_property_enum_items(BPy_GetContext(), ptr, prop, &enum_item, NULL, &free); + if(enum_item && enum_item->identifier) { + ret= PyUnicode_FromString(enum_item->identifier); } else { const char *ptr_name= RNA_struct_name_get_alloc(ptr, NULL, FALSE); @@ -830,7 +843,7 @@ static PyObject *pyrna_enum_to_py(PointerRNA *ptr, PropertyRNA *prop, int val) } if(free) - MEM_freeN(item); + MEM_freeN(enum_item); /*PyErr_Format(PyExc_AttributeError, "RNA Error: Current value \"%d\" matches no enum", val); ret = NULL;*/ @@ -900,7 +913,7 @@ PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop) ret = pyrna_prop_CreatePyObject(ptr, prop); break; default: - PyErr_Format(PyExc_TypeError, "bpy_struct internal error: unknown type \"%d\" (pyrna_prop_to_py)", type); + PyErr_Format(PyExc_TypeError, "bpy_struct internal error: unknown type '%d' (pyrna_prop_to_py)", type); ret = NULL; break; } @@ -1012,7 +1025,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb } else /* continue... */ #endif // USE_MATHUTILS if (!PySequence_Check(value)) { - PyErr_Format(PyExc_TypeError, "%.200s RNA array assignment to %.200s.%.200s expected a sequence instead of %.200s instance", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(value)->tp_name); + PyErr_Format(PyExc_TypeError, "%.200s RNA array assignment to %.200s.%.200s expected a sequence, not %.200s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(value)->tp_name); return -1; } /* done getting the length */ @@ -1040,7 +1053,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb param = PyLong_AsLong( value ); if(param < 0) { - PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected True/False or 0/1", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop)); + PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected True/False or 0/1, not %.200s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(value)->tp_name); return -1; } else { if(data) *((int*)data)= param; @@ -1053,11 +1066,11 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb int overflow; long param= PyLong_AsLongAndOverflow(value, &overflow); if(overflow || (param > INT_MAX) || (param < INT_MIN)) { - PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s value not in 'int' range (" STRINGIFY(INT_MIN) ", " STRINGIFY(INT_MAX) ")", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop)); + PyErr_Format(PyExc_ValueError, "%.200s %.200s.%.200s value not in 'int' range (" STRINGIFY(INT_MIN) ", " STRINGIFY(INT_MAX) ")", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop)); return -1; } else if (param==-1 && PyErr_Occurred()) { - PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected an int type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop)); + PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected an int type, not %.200s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(value)->tp_name); return -1; } else { int param_i= (int)param; @@ -1071,7 +1084,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb { float param = PyFloat_AsDouble(value); if (PyErr_Occurred()) { - PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a float type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop)); + PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a float type, not %.200s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(value)->tp_name); return -1; } else { RNA_property_float_clamp(ptr, prop, (float *)¶m); @@ -1098,7 +1111,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb #endif // USE_STRING_COERCE if (param==NULL) { - PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a string type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop)); + PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a string type, not %.200s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(value)->tp_name); return -1; } else { @@ -1131,7 +1144,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb } else { const char *enum_str= pyrna_enum_as_string(ptr, prop); - PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a string enum or a set of strings in (%.2000s)", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), enum_str); + PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a string enum or a set of strings in (%.2000s), not %.200s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), enum_str, Py_TYPE(value)->tp_name); MEM_freeN((void *)enum_str); return -1; } @@ -1145,7 +1158,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb { PyObject *value_new= NULL; - StructRNA *ptype= RNA_property_pointer_type(ptr, prop); + StructRNA *ptr_type= RNA_property_pointer_type(ptr, prop); int flag = RNA_property_flag(prop); /* this is really nasty!, so we can fake the operator having direct properties eg: @@ -1159,7 +1172,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb * this is so bad that its almost a good reason to do away with fake 'self.properties -> self' class mixing * if this causes problems in the future it should be removed. */ - if( (ptype == &RNA_AnyType) && + if( (ptr_type == &RNA_AnyType) && (BPy_StructRNA_Check(value)) && (RNA_struct_is_a(((BPy_StructRNA *)value)->ptr.type, &RNA_Operator)) ) { @@ -1169,7 +1182,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb /* if property is an OperatorProperties pointer and value is a map, forward back to pyrna_pydict_to_props */ - if (RNA_struct_is_a(ptype, &RNA_OperatorProperties) && PyDict_Check(value)) { + if (RNA_struct_is_a(ptr_type, &RNA_OperatorProperties) && PyDict_Check(value)) { PointerRNA opptr = RNA_property_pointer_get(ptr, prop); return pyrna_pydict_to_props(&opptr, value, 0, error_prefix); } @@ -1183,16 +1196,16 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb value_new= value; } else { - PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s collection has no type, cant be used as a %.200s type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(ptype)); + PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s collection has no type, cant be used as a %.200s type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(ptr_type)); return -1; } } if(!BPy_StructRNA_Check(value) && value != Py_None) { - PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a %.200s type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(ptype)); + PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a %.200s type, not %.200s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(ptr_type), Py_TYPE(value)->tp_name); Py_XDECREF(value_new); return -1; } else if((flag & PROP_NEVER_NULL) && value == Py_None) { - PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s does not support a 'None' assignment %.200s type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(ptype)); + PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s does not support a 'None' assignment %.200s type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(ptr_type)); Py_XDECREF(value_new); return -1; } else if(value != Py_None && ((flag & PROP_ID_SELF_CHECK) && ptr->id.data == ((BPy_StructRNA*)value)->ptr.id.data)) { PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s ID type does not support assignment to its self", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop)); @@ -1211,7 +1224,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb else if(value == Py_None) { *((void**)data)= NULL; } - else if(RNA_struct_is_a(param->ptr.type, ptype)) { + else if(RNA_struct_is_a(param->ptr.type, ptr_type)) { *((void**)data)= param->ptr.data; } else { @@ -1224,21 +1237,21 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb PointerRNA valueptr= {{NULL}}; RNA_property_pointer_set(ptr, prop, valueptr); } - else if(RNA_struct_is_a(param->ptr.type, ptype)) { + else if(RNA_struct_is_a(param->ptr.type, ptr_type)) { RNA_property_pointer_set(ptr, prop, param->ptr); } else { PointerRNA tmp; - RNA_pointer_create(NULL, ptype, NULL, &tmp); - PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a %.200s type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(tmp.type)); + RNA_pointer_create(NULL, ptr_type, NULL, &tmp); + PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a %.200s type. not %.200s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(tmp.type), RNA_struct_identifier(param->ptr.type)); Py_XDECREF(value_new); return -1; } } if(raise_error) { PointerRNA tmp; - RNA_pointer_create(NULL, ptype, NULL, &tmp); - PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a %.200s type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(tmp.type)); + RNA_pointer_create(NULL, ptr_type, NULL, &tmp); + PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a %.200s type, not %.200s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(tmp.type), RNA_struct_identifier(param->ptr.type)); Py_XDECREF(value_new); return -1; } } @@ -1259,7 +1272,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb /* convert a sequence of dict's into a collection */ if(!PySequence_Check(value)) { - PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a sequence for an RNA collection, found a '%.200s' instead", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(value)->tp_name); + PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a sequence for an RNA collection, not %.200s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(value)->tp_name); return -1; } @@ -1274,7 +1287,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb } if(PyDict_Check(item)==0) { - PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a each sequence member to be a dict for an RNA collection, found a '%.200s' instead", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(item)->tp_name); + PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a each sequence member to be a dict for an RNA collection, not %.200s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(item)->tp_name); Py_XDECREF(item); return -1; } @@ -1642,7 +1655,7 @@ static PyObject *pyrna_prop_collection_subscript(BPy_PropertyRNA *self, PyObject } } else { - PyErr_Format(PyExc_TypeError, "bpy_prop_collection[key]: invalid key, must be a string or an int instead of %.200s instance", Py_TYPE(key)->tp_name); + PyErr_Format(PyExc_TypeError, "bpy_prop_collection[key]: invalid key, must be a string or an int, not %.200s", Py_TYPE(key)->tp_name); return NULL; } } @@ -2855,6 +2868,7 @@ static int pyrna_is_deferred_prop(PyObject *value) return PyTuple_CheckExact(value) && PyTuple_GET_SIZE(value)==2 && PyCallable_Check(PyTuple_GET_ITEM(value, 0)) && PyDict_CheckExact(PyTuple_GET_ITEM(value, 1)); } +#if 0 static PyObject *pyrna_struct_meta_idprop_getattro(PyObject *cls, PyObject *attr) { PyObject *ret= PyType_Type.tp_getattro(cls, attr); @@ -2883,6 +2897,7 @@ static PyObject *pyrna_struct_meta_idprop_getattro(PyObject *cls, PyObject *attr return ret; } +#endif static int pyrna_struct_meta_idprop_setattro(PyObject *cls, PyObject *attr, PyObject *value) { @@ -3523,11 +3538,11 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set) if(PyErr_Occurred()) { /* Maybe we could make our own error */ PyErr_Print(); - PyErr_SetString(PyExc_SystemError, "could not access the py sequence"); + PyErr_SetString(PyExc_TypeError, "could not access the py sequence"); return NULL; } if (!ok) { - PyErr_SetString(PyExc_SystemError, "internal error setting the array"); + PyErr_SetString(PyExc_RuntimeError, "internal error setting the array"); return NULL; } @@ -3607,11 +3622,6 @@ static PyObject *pyrna_prop_collection_iter(BPy_PropertyRNA *self) return iter; } -static PyObject *pyrna_struct_is_registered(PyObject *cls) -{ - return PyBool_FromLong(PyDict_GetItemString((((PyTypeObject *)cls)->tp_dict), "bl_rna") != NULL); -} - static struct PyMethodDef pyrna_struct_methods[] = { /* only for PointerRNA's with ID'props */ @@ -3637,9 +3647,6 @@ static struct PyMethodDef pyrna_struct_methods[] = { /* experemental */ {"callback_add", (PyCFunction)pyrna_callback_add, METH_VARARGS, NULL}, {"callback_remove", (PyCFunction)pyrna_callback_remove, METH_VARARGS, NULL}, - - /* class method */ - {"is_registered", (PyCFunction) pyrna_struct_is_registered, METH_NOARGS | METH_CLASS, NULL}, {NULL, NULL, 0, NULL} }; @@ -3674,23 +3681,42 @@ static struct PyMethodDef pyrna_prop_collection_idprop_methods[] = { /* only needed for subtyping, so a new class gets a valid BPy_StructRNA * todo - also accept useful args */ -static PyObject * pyrna_struct_new(PyTypeObject *type, PyObject *args, PyObject *UNUSED(kwds)) { - - BPy_StructRNA *base; +static PyObject * pyrna_struct_new(PyTypeObject *type, PyObject *args, PyObject *UNUSED(kwds)) +{ + if(PyTuple_GET_SIZE(args) == 1) { + BPy_StructRNA *base= (BPy_StructRNA *)PyTuple_GET_ITEM(args, 0); + if (type == Py_TYPE(base)) { + Py_INCREF(base); + return (PyObject *)base; + } + else if (PyType_IsSubtype(type, &pyrna_struct_Type)) { + /* this almost never runs, only when using user defined subclasses of built-in object. + * this isnt common since its NOT related to registerable subclasses. eg: + + >>> class MyObSubclass(bpy.types.Object): + ... def test_func(self): + ... print(100) + ... + >>> myob = MyObSubclass(bpy.context.object) + >>> myob.test_func() + 100 + * + * Keep this since it could be useful. + */ + BPy_StructRNA *ret; + if((ret= (BPy_StructRNA *)type->tp_alloc(type, 0))) { + ret->ptr = base->ptr; + } + /* pass on exception & NULL if tp_alloc fails */ + return (PyObject *)ret; + } - if (!PyArg_ParseTuple(args, "O!:bpy_struct.__new__", &pyrna_struct_Type, &base)) + /* error, invalid type given */ + PyErr_Format(PyExc_TypeError, "bpy_struct.__new__(type): type '%.200s' is not a subtype of bpy_struct", type->tp_name); return NULL; - - if (type == Py_TYPE(base)) { - Py_INCREF(base); - return (PyObject *)base; - } else if (PyType_IsSubtype(type, &pyrna_struct_Type)) { - BPy_StructRNA *ret = (BPy_StructRNA *) type->tp_alloc(type, 0); - ret->ptr = base->ptr; - return (PyObject *)ret; } else { - PyErr_Format(PyExc_TypeError, "bpy_struct.__new__(type): type '%.200s' is not a subtype of bpy_struct", type->tp_name); + PyErr_Format(PyExc_TypeError, "bpy_struct.__new__(type): expected a single argument"); return NULL; } } @@ -3829,21 +3855,21 @@ static PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *dat case PROP_POINTER: { PointerRNA newptr; - StructRNA *type= RNA_property_pointer_type(ptr, prop); + StructRNA *ptype= RNA_property_pointer_type(ptr, prop); if(flag & PROP_RNAPTR) { /* in this case we get the full ptr */ newptr= *(PointerRNA*)data; } else { - if(RNA_struct_is_ID(type)) { + if(RNA_struct_is_ID(ptype)) { RNA_id_pointer_create(*(void**)data, &newptr); } else { /* note: this is taken from the function's ID pointer * and will break if a function returns a pointer from * another ID block, watch this! - it should at least be * easy to debug since they are all ID's */ - RNA_pointer_create(ptr->id.data, type, *(void**)data, &newptr); + RNA_pointer_create(ptr->id.data, ptype, *(void**)data, &newptr); } } @@ -4143,7 +4169,7 @@ PyTypeObject pyrna_struct_meta_idprop_Type = { NULL, /* hashfunc tp_hash; */ NULL, /* ternaryfunc tp_call; */ NULL, /* reprfunc tp_str; */ - (getattrofunc) pyrna_struct_meta_idprop_getattro, /* getattrofunc tp_getattro; */ + NULL /*(getattrofunc) pyrna_struct_meta_idprop_getattro*/, /* getattrofunc tp_getattro; */ (setattrofunc) pyrna_struct_meta_idprop_setattro, /* setattrofunc tp_setattro; */ /* Functions to access object as input/output buffer */ @@ -4151,6 +4177,50 @@ PyTypeObject pyrna_struct_meta_idprop_Type = { /*** Flags to define presence of optional/expanded features ***/ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* long tp_flags; */ + + NULL, /* char *tp_doc; Documentation string */ + /*** Assigned meaning in release 2.0 ***/ + /* call function for all accessible objects */ + NULL, /* traverseproc tp_traverse; */ + + /* delete references to contained objects */ + NULL, /* inquiry tp_clear; */ + + /*** Assigned meaning in release 2.1 ***/ + /*** rich comparisons ***/ + NULL, /* richcmpfunc tp_richcompare; */ + + /*** weak reference enabler ***/ + 0, /* long tp_weaklistoffset; */ + + /*** Added in release 2.2 ***/ + /* Iterators */ + NULL, /* getiterfunc tp_iter; */ + NULL, /* iternextfunc tp_iternext; */ + + /*** Attribute descriptor and subclassing stuff ***/ + NULL, /* struct PyMethodDef *tp_methods; */ + NULL, /* struct PyMemberDef *tp_members; */ + NULL, /* struct PyGetSetDef *tp_getset; */ + NULL, /* struct _typeobject *tp_base; */ + NULL, /* PyObject *tp_dict; */ + NULL, /* descrgetfunc tp_descr_get; */ + NULL, /* descrsetfunc tp_descr_set; */ + 0, /* long tp_dictoffset; */ + NULL, /* initproc tp_init; */ + NULL, /* allocfunc tp_alloc; */ + NULL, /* newfunc tp_new; */ + /* Low-level free-memory routine */ + NULL, /* freefunc tp_free; */ + /* For PyObject_IS_GC */ + NULL, /* inquiry tp_is_gc; */ + NULL, /* PyObject *tp_bases; */ + /* method resolution order */ + NULL, /* PyObject *tp_mro; */ + NULL, /* PyObject *tp_cache; */ + NULL, /* PyObject *tp_subclasses; */ + NULL, /* PyObject *tp_weaklist; */ + NULL }; @@ -4897,7 +4967,7 @@ static PyObject *pyrna_basetype_getattro( BPy_BaseTypeRNA *self, PyObject *pynam else if (RNA_property_collection_lookup_string(&self->ptr, self->prop, name, &newptr)) { ret= pyrna_struct_Subtype(&newptr); if (ret==NULL) { - PyErr_Format(PyExc_SystemError, "bpy.types.%.200s subtype could not be generated, this is a bug!", _PyUnicode_AsString(pyname)); + PyErr_Format(PyExc_RuntimeError, "bpy.types.%.200s subtype could not be generated, this is a bug!", _PyUnicode_AsString(pyname)); } } else { @@ -4986,18 +5056,18 @@ StructRNA *pyrna_struct_as_srna(PyObject *self, int parent, const char *error_pr } if(py_srna==NULL) { - PyErr_Format(PyExc_SystemError, "%.200s, missing bl_rna attribute from '%.200s' instance (may not be registered)", error_prefix, Py_TYPE(self)->tp_name); + PyErr_Format(PyExc_RuntimeError, "%.200s, missing bl_rna attribute from '%.200s' instance (may not be registered)", error_prefix, Py_TYPE(self)->tp_name); return NULL; } if(!BPy_StructRNA_Check(py_srna)) { - PyErr_Format(PyExc_SystemError, "%.200s, bl_rna attribute wrong type '%.200s' on '%.200s'' instance", error_prefix, Py_TYPE(py_srna)->tp_name, Py_TYPE(self)->tp_name); + PyErr_Format(PyExc_TypeError, "%.200s, bl_rna attribute wrong type '%.200s' on '%.200s'' instance", error_prefix, Py_TYPE(py_srna)->tp_name, Py_TYPE(self)->tp_name); Py_DECREF(py_srna); return NULL; } if(py_srna->ptr.type != &RNA_Struct) { - PyErr_Format(PyExc_SystemError, "%.200s, bl_rna attribute not a RNA_Struct, on '%.200s'' instance", error_prefix, Py_TYPE(self)->tp_name); + PyErr_Format(PyExc_TypeError, "%.200s, bl_rna attribute not a RNA_Struct, on '%.200s'' instance", error_prefix, Py_TYPE(self)->tp_name); Py_DECREF(py_srna); return NULL; } @@ -5263,7 +5333,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun func_arg_count++; if (arg_count != func_arg_count) { - PyErr_Format(PyExc_AttributeError, "expected %.200s, %.200s class \"%.200s\" function to have %d args, found %d", class_type, py_class_name, RNA_function_identifier(func), func_arg_count, arg_count); + PyErr_Format(PyExc_ValueError, "expected %.200s, %.200s class \"%.200s\" function to have %d args, found %d", class_type, py_class_name, RNA_function_identifier(func), func_arg_count, arg_count); return -1; } } @@ -5290,7 +5360,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun if(strcmp(identifier, rna_attr) == 0) { \ item= PyObject_GetAttrString(py_class, py_attr); \ if(item && item != Py_None) { \ - if(pyrna_py_to_prop(dummyptr, prop, NULL, item, "validating class error:") != 0) { \ + if(pyrna_py_to_prop(dummyptr, prop, NULL, item, "validating class:") != 0) { \ Py_DECREF(item); \ return -1; \ } \ @@ -5314,7 +5384,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun else { Py_DECREF(item); /* no need to keep a ref, the class owns it */ - if(pyrna_py_to_prop(dummyptr, prop, NULL, item, "validating class error:") != 0) + if(pyrna_py_to_prop(dummyptr, prop, NULL, item, "validating class:") != 0) return -1; } } @@ -5326,7 +5396,8 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, ParameterList *parms) { PyObject *args; - PyObject *ret= NULL, *py_srna= NULL, *py_class, *py_class_instance= NULL, *parmitem; + PyObject *ret= NULL, *py_srna= NULL, *py_class_instance= NULL, *parmitem; + PyTypeObject *py_class; void **py_class_instance_store= NULL; PropertyRNA *parm; ParameterIterator iter; @@ -5391,11 +5462,39 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param py_class_instance = NULL; } else { +#if 1 + /* Skip the code below and call init directly on the allocated 'py_srna' + * otherwise __init__() always needs to take a second self argument, see pyrna_struct_new(). + * Although this is annoying to have to impliment a part of pythons typeobject.c:type_call(). + */ + if(py_class->tp_init) { + /* true in most cases even when the class its self doesnt define an __init__ function. */ + args = PyTuple_New(0); + if (py_class->tp_init(py_srna, args, NULL) < 0) { + Py_DECREF(py_srna); + py_srna= NULL; + /* err set below */ + } + Py_DECREF(args); + } + + py_class_instance= py_srna; + +#else + /* 'almost' all the time calling the class isnt needed. + * We could just do... + py_class_instance = py_srna; + Py_INCREF(py_class_instance); + * This would work fine but means __init__ functions wouldnt run. + * none of blenders default scripts use __init__ but its nice to call it + * for general correctness. just to note why this is here when it could be safely removed. + */ args = PyTuple_New(1); PyTuple_SET_ITEM(args, 0, py_srna); py_class_instance= PyObject_Call(py_class, args, NULL); Py_DECREF(args); - + +#endif if(py_class_instance == NULL) { err= -1; /* so the error is not overridden below */ } @@ -5406,8 +5505,8 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param } } - if (is_static || py_class_instance) { /* Initializing the class worked, now run its invoke function */ - PyObject *item= PyObject_GetAttrString(py_class, RNA_function_identifier(func)); + if (err != -1 && (is_static || py_class_instance)) { /* Initializing the class worked, now run its invoke function */ + PyObject *item= PyObject_GetAttrString((PyObject *)py_class, RNA_function_identifier(func)); // flag= RNA_function_flag(func); if(item) { @@ -5483,7 +5582,7 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param } else { if(ret_len==0 && ret != Py_None) { - PyErr_Format(PyExc_RuntimeError, "expected class %.200s, function %.200s to return None, got a %.200s type instead", RNA_struct_identifier(ptr->type), RNA_function_identifier(func), Py_TYPE(ret)->tp_name); + PyErr_Format(PyExc_RuntimeError, "expected class %.200s, function %.200s to return None, not %.200s", RNA_struct_identifier(ptr->type), RNA_function_identifier(func), Py_TYPE(ret)->tp_name); err= -1; } else if(ret_len==1) { @@ -5492,7 +5591,7 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param else if (ret_len > 1) { if(PyTuple_Check(ret)==0) { - PyErr_Format(PyExc_RuntimeError, "expected class %.200s, function %.200s to return a tuple of size %d, got a %.200s type instead", RNA_struct_identifier(ptr->type), RNA_function_identifier(func), ret_len, Py_TYPE(ret)->tp_name); + PyErr_Format(PyExc_RuntimeError, "expected class %.200s, function %.200s to return a tuple of size %d, not %.200s", RNA_struct_identifier(ptr->type), RNA_function_identifier(func), ret_len, Py_TYPE(ret)->tp_name); err= -1; } else if (PyTuple_GET_SIZE(ret) != ret_len) { @@ -5796,7 +5895,7 @@ static PyObject *pyrna_unregister_class(PyObject *UNUSED(self), PyObject *py_cla RNA_PROP_END; if(prop_identifier) { - PyErr_Format(PyExc_SystemError, "unregister_class(...): Cant unregister %s because %s.%s pointer property is using this", RNA_struct_identifier(srna), RNA_struct_identifier(srna_iter), prop_identifier); + PyErr_Format(PyExc_RuntimeError, "unregister_class(...): can't unregister %s because %s.%s pointer property is using this", RNA_struct_identifier(srna), RNA_struct_identifier(srna_iter), prop_identifier); return NULL; } } diff --git a/source/blender/python/intern/bpy_rna.h b/source/blender/python/intern/bpy_rna.h index bbcc85581b2..c599ab5c95e 100644 --- a/source/blender/python/intern/bpy_rna.h +++ b/source/blender/python/intern/bpy_rna.h @@ -24,8 +24,6 @@ #ifndef BPY_RNA_H #define BPY_RNA_H -#include <Python.h> - #include "RNA_access.h" #include "RNA_types.h" #include "BKE_idprop.h" diff --git a/source/blender/python/intern/bpy_rna_array.c b/source/blender/python/intern/bpy_rna_array.c index 32efa387196..b4eef666279 100644 --- a/source/blender/python/intern/bpy_rna_array.c +++ b/source/blender/python/intern/bpy_rna_array.c @@ -21,6 +21,7 @@ * * ***** END GPL LICENSE BLOCK ***** */ +#include <Python.h> #include "bpy_rna.h" #include "BKE_global.h" diff --git a/source/blender/python/intern/bpy_rna_callback.c b/source/blender/python/intern/bpy_rna_callback.c index 28b540ba418..0ff67430520 100644 --- a/source/blender/python/intern/bpy_rna_callback.c +++ b/source/blender/python/intern/bpy_rna_callback.c @@ -22,6 +22,7 @@ * ***** END GPL LICENSE BLOCK ***** */ +#include <Python.h> #include "bpy_rna.h" #include "bpy_rna_callback.h" diff --git a/source/blender/python/intern/bpy_util.c b/source/blender/python/intern/bpy_util.c index 8ea5e646482..63a397769c3 100644 --- a/source/blender/python/intern/bpy_util.c +++ b/source/blender/python/intern/bpy_util.c @@ -22,6 +22,8 @@ * ***** END GPL LICENSE BLOCK ***** */ +#include <Python.h> + #include "bpy_util.h" #include "BLI_dynstr.h" #include "MEM_guardedalloc.h" @@ -149,7 +151,7 @@ short BPy_reports_to_error(ReportList *reports, const short clear) } if(report_str) { - PyErr_SetString(PyExc_SystemError, report_str); + PyErr_SetString(PyExc_RuntimeError, report_str); MEM_freeN(report_str); } diff --git a/source/blender/python/intern/bpy_util.h b/source/blender/python/intern/bpy_util.h index e89c8212e1b..e1473a563a6 100644 --- a/source/blender/python/intern/bpy_util.h +++ b/source/blender/python/intern/bpy_util.h @@ -22,8 +22,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#include <Python.h> - #ifndef BPY_UTIL_H #define BPY_UTIL_H diff --git a/source/blender/readblenfile/BLO_readblenfile.h b/source/blender/readblenfile/BLO_readblenfile.h index 14143db4bc5..a928148f208 100644 --- a/source/blender/readblenfile/BLO_readblenfile.h +++ b/source/blender/readblenfile/BLO_readblenfile.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -31,6 +31,10 @@ #ifndef BLO_READBLENFILE_H #define BLO_READBLENFILE_H +/** \file BLO_readblenfile.h + * \ingroup readblenfile + */ + #ifdef __cplusplus extern "C" { #endif diff --git a/source/blender/render/CMakeLists.txt b/source/blender/render/CMakeLists.txt index 2680c9f183f..19cb69f3e9e 100644 --- a/source/blender/render/CMakeLists.txt +++ b/source/blender/render/CMakeLists.txt @@ -38,6 +38,7 @@ set(INC ../imbuf ../../kernel/gen_messaging ../../../intern/smoke/extern + ../../../intern/mikktspace ../../../intern/guardedalloc ../freestyle ) diff --git a/source/blender/render/SConscript b/source/blender/render/SConscript index 6d44c86fa86..d751c90ba27 100644 --- a/source/blender/render/SConscript +++ b/source/blender/render/SConscript @@ -6,7 +6,8 @@ raysources = env.Glob('intern/raytrace/*.cpp') incs = 'intern/include #/intern/guardedalloc ../blenlib ../makesdna ../makesrna' incs += ' extern/include ../blenkernel ../radiosity/extern/include ../imbuf' -incs += ' ../include ../blenloader ../freestyle ../../../intern/smoke/extern' +incs += ' ../include ../blenloader ../../../intern/smoke/extern ../../../intern/mikktspace' +incs += ' ../freestyle' cflags_raytrace = env['CCFLAGS'] cxxflags_raytrace = env['CXXFLAGS'] diff --git a/source/blender/render/extern/include/RE_shader_ext.h b/source/blender/render/extern/include/RE_shader_ext.h index 2b451810e37..7825d2e4647 100644 --- a/source/blender/render/extern/include/RE_shader_ext.h +++ b/source/blender/render/extern/include/RE_shader_ext.h @@ -136,7 +136,7 @@ typedef struct ShadeInput /* texture coordinates */ float lo[3], gl[3], ref[3], orn[3], winco[3], sticky[3], vcol[4]; float refcol[4], displace[3]; - float strandco, tang[3], nmaptang[3], stress, winspeed[4]; + float strandco, tang[3], nmapnorm[3], nmaptang[4], stress, winspeed[4]; float duplilo[3], dupliuv[3]; ShadeInputUV uv[8]; /* 8 = MAX_MTFACE */ diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 72bec0cb596..b4e6d4a04c2 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -494,11 +494,82 @@ static void calc_tangent_vector(ObjectRen *obr, VertexTangent **vtangents, MemAr } +typedef struct +{ + ObjectRen *obr; + +} SRenderMeshToTangent; + +// interface +#include "mikktspace.h" + +static int GetNumFaces(const SMikkTSpaceContext * pContext) +{ + SRenderMeshToTangent * pMesh = (SRenderMeshToTangent *) pContext->m_pUserData; + return pMesh->obr->totvlak; +} + +static int GetNumVertsOfFace(const SMikkTSpaceContext * pContext, const int face_num) +{ + SRenderMeshToTangent * pMesh = (SRenderMeshToTangent *) pContext->m_pUserData; + VlakRen *vlr= RE_findOrAddVlak(pMesh->obr, face_num); + return vlr->v4!=NULL ? 4 : 3; +} + +static void GetPosition(const SMikkTSpaceContext * pContext, float fPos[], const int face_num, const int vert_index) +{ + //assert(vert_index>=0 && vert_index<4); + SRenderMeshToTangent * pMesh = (SRenderMeshToTangent *) pContext->m_pUserData; + VlakRen *vlr= RE_findOrAddVlak(pMesh->obr, face_num); + VertRen * pVerts[] = {vlr->v1, vlr->v2, vlr->v3, vlr->v4}; + VECCOPY(fPos, pVerts[vert_index]->co); +} + +static void GetTextureCoordinate(const SMikkTSpaceContext * pContext, float fUV[], const int face_num, const int vert_index) +{ + //assert(vert_index>=0 && vert_index<4); + SRenderMeshToTangent * pMesh = (SRenderMeshToTangent *) pContext->m_pUserData; + VlakRen *vlr= RE_findOrAddVlak(pMesh->obr, face_num); + MTFace *tface= RE_vlakren_get_tface(pMesh->obr, vlr, pMesh->obr->actmtface, NULL, 0); + + if(tface!=NULL) + { + float * pTexCo = tface->uv[vert_index]; + fUV[0]=pTexCo[0]; fUV[1]=pTexCo[1]; + } + else + { + VertRen * pVerts[] = {vlr->v1, vlr->v2, vlr->v3, vlr->v4}; + map_to_sphere(&fUV[0], &fUV[1], pVerts[vert_index]->orco[0], pVerts[vert_index]->orco[1], pVerts[vert_index]->orco[2]); + } +} + +static void GetNormal(const SMikkTSpaceContext * pContext, float fNorm[], const int face_num, const int vert_index) +{ + //assert(vert_index>=0 && vert_index<4); + SRenderMeshToTangent * pMesh = (SRenderMeshToTangent *) pContext->m_pUserData; + VlakRen *vlr= RE_findOrAddVlak(pMesh->obr, face_num); + VertRen * pVerts[] = {vlr->v1, vlr->v2, vlr->v3, vlr->v4}; + VECCOPY(fNorm, pVerts[vert_index]->n); +} +static void SetTSpace(const SMikkTSpaceContext * pContext, const float fvTangent[], const float fSign, const int face_num, const int iVert) +{ + //assert(vert_index>=0 && vert_index<4); + SRenderMeshToTangent * pMesh = (SRenderMeshToTangent *) pContext->m_pUserData; + VlakRen *vlr= RE_findOrAddVlak(pMesh->obr, face_num); + float * ftang= RE_vlakren_get_nmap_tangent(pMesh->obr, vlr, 1); + if(ftang!=NULL) + { + VECCOPY(&ftang[iVert*4+0], fvTangent); + ftang[iVert*4+3]=fSign; + } +} + static void calc_vertexnormals(Render *re, ObjectRen *obr, int do_tangent, int do_nmap_tangent) { MemArena *arena= NULL; VertexTangent **vtangents= NULL; - int a; + int a, iCalcNewMethod; if(do_nmap_tangent) { arena= BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "nmap tangent arena"); @@ -594,22 +665,24 @@ static void calc_vertexnormals(Render *re, ObjectRen *obr, int do_tangent, int d MTFace *tface= RE_vlakren_get_tface(obr, vlr, obr->actmtface, NULL, 0); if(tface) { + int k=0; float *vtang, *ftang= RE_vlakren_get_nmap_tangent(obr, vlr, 1); vtang= find_vertex_tangent(vtangents[v1->index], tface->uv[0]); VECCOPY(ftang, vtang); normalize_v3(ftang); vtang= find_vertex_tangent(vtangents[v2->index], tface->uv[1]); - VECCOPY(ftang+3, vtang); - normalize_v3(ftang+3); + VECCOPY(ftang+4, vtang); + normalize_v3(ftang+4); vtang= find_vertex_tangent(vtangents[v3->index], tface->uv[2]); - VECCOPY(ftang+6, vtang); - normalize_v3(ftang+6); + VECCOPY(ftang+8, vtang); + normalize_v3(ftang+8); if(v4) { vtang= find_vertex_tangent(vtangents[v4->index], tface->uv[3]); - VECCOPY(ftang+9, vtang); - normalize_v3(ftang+9); + VECCOPY(ftang+12, vtang); + normalize_v3(ftang+12); } + for(k=0; k<4; k++) ftang[4*k+3]=1; } } } @@ -631,6 +704,31 @@ static void calc_vertexnormals(Render *re, ObjectRen *obr, int do_tangent, int d } } + iCalcNewMethod = 1; + if(iCalcNewMethod!=0 && do_nmap_tangent!=0) + { + SRenderMeshToTangent mesh2tangent; + SMikkTSpaceContext sContext; + SMikkTSpaceInterface sInterface; + memset(&mesh2tangent, 0, sizeof(SRenderMeshToTangent)); + memset(&sContext, 0, sizeof(SMikkTSpaceContext)); + memset(&sInterface, 0, sizeof(SMikkTSpaceInterface)); + + mesh2tangent.obr = obr; + + sContext.m_pUserData = &mesh2tangent; + sContext.m_pInterface = &sInterface; + sInterface.m_getNumFaces = GetNumFaces; + sInterface.m_getNumVerticesOfFace = GetNumVertsOfFace; + sInterface.m_getPosition = GetPosition; + sInterface.m_getTexCoord = GetTextureCoordinate; + sInterface.m_getNormal = GetNormal; + sInterface.m_setTSpaceBasic = SetTSpace; + + // 0 if failed + iCalcNewMethod = genTangSpaceDefault(&sContext); + } + if(arena) BLI_memarena_free(arena); diff --git a/source/blender/render/intern/source/imagetexture.c b/source/blender/render/intern/source/imagetexture.c index 3a8270a757e..ca4c6935a4c 100644 --- a/source/blender/render/intern/source/imagetexture.c +++ b/source/blender/render/intern/source/imagetexture.c @@ -53,13 +53,14 @@ #include "BLI_threads.h" #include "BLI_utildefines.h" - #include "BKE_global.h" #include "BKE_main.h" #include "BKE_image.h" #include "BKE_texture.h" #include "BKE_library.h" +#include "RE_render_ext.h" + #include "renderpipeline.h" #include "render_types.h" #include "texture.h" diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 363b7ab4765..b9b2606a315 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -171,6 +171,7 @@ static void stats_background(void *UNUSED(arg), RenderStats *rs) else fprintf(stdout, "Sce: %s Ve:%d Fa:%d La:%d", rs->scenename, rs->totvert, rs->totface, rs->totlamp); } + fputc('\n', stdout); fflush(stdout); } diff --git a/source/blender/render/intern/source/pointdensity.c b/source/blender/render/intern/source/pointdensity.c index 15279fea01d..1325fd89ec6 100644 --- a/source/blender/render/intern/source/pointdensity.c +++ b/source/blender/render/intern/source/pointdensity.c @@ -50,6 +50,7 @@ #include "render_types.h" #include "renderdatabase.h" #include "texture.h" +#include "pointdensity.h" /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ /* defined in pipeline.c, is hardcopy of active dynamic allocated Render */ @@ -325,7 +326,7 @@ typedef struct PointDensityRangeData int offset; } PointDensityRangeData; -void accum_density(void *userdata, int index, float squared_dist) +static void accum_density(void *userdata, int index, float squared_dist) { PointDensityRangeData *pdr = (PointDensityRangeData *)userdata; const float dist = (pdr->squared_radius - squared_dist) / pdr->squared_radius * 0.5f; diff --git a/source/blender/render/intern/source/render_texture.c b/source/blender/render/intern/source/render_texture.c index 62e684e79e2..0da1070679e 100644 --- a/source/blender/render/intern/source/render_texture.c +++ b/source/blender/render/intern/source/render_texture.c @@ -2114,6 +2114,7 @@ void do_material_tex(ShadeInput *shi) float texvec[3], dxt[3], dyt[3], tempvec[3], norvec[3], warpvec[3]={0.0f, 0.0f, 0.0f}, Tnor=1.0; int tex_nr, rgbnor= 0, warpdone=0; int use_compat_bump, use_ntap_bump; + int iFirstTimeNMap=1; compatible_bump_init(&compat_bump); ntap_bump_init(&ntap_bump); @@ -2427,14 +2428,17 @@ void do_material_tex(ShadeInput *shi) if(mtex->normapspace == MTEX_NSPACE_TANGENT) { /* qdn: tangent space */ float B[3], tv[3]; - cross_v3_v3v3(B, shi->vn, shi->nmaptang); /* bitangent */ + const float * no = iFirstTimeNMap!=0 ? shi->nmapnorm : shi->vn; + iFirstTimeNMap=0; + cross_v3_v3v3(B, no, shi->nmaptang); /* bitangent */ + mul_v3_fl(B, shi->nmaptang[3]); /* transform norvec from tangent space to object surface in camera space */ - tv[0] = texres.nor[0]*shi->nmaptang[0] + texres.nor[1]*B[0] + texres.nor[2]*shi->vn[0]; - tv[1] = texres.nor[0]*shi->nmaptang[1] + texres.nor[1]*B[1] + texres.nor[2]*shi->vn[1]; - tv[2] = texres.nor[0]*shi->nmaptang[2] + texres.nor[1]*B[2] + texres.nor[2]*shi->vn[2]; - shi->vn[0]= facm*shi->vn[0] + fact*tv[0]; - shi->vn[1]= facm*shi->vn[1] + fact*tv[1]; - shi->vn[2]= facm*shi->vn[2] + fact*tv[2]; + tv[0] = texres.nor[0]*shi->nmaptang[0] + texres.nor[1]*B[0] + texres.nor[2]*no[0]; + tv[1] = texres.nor[0]*shi->nmaptang[1] + texres.nor[1]*B[1] + texres.nor[2]*no[1]; + tv[2] = texres.nor[0]*shi->nmaptang[2] + texres.nor[1]*B[2] + texres.nor[2]*no[2]; + shi->vn[0]= facm*no[0] + fact*tv[0]; + shi->vn[1]= facm*no[1] + fact*tv[1]; + shi->vn[2]= facm*no[2] + fact*tv[2]; } else { float nor[3]; diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c index fac2e39c89a..5d2002e1213 100644 --- a/source/blender/render/intern/source/rendercore.c +++ b/source/blender/render/intern/source/rendercore.c @@ -2160,12 +2160,14 @@ static void bake_shade(void *handle, Object *ob, ShadeInput *shi, int quad, int if(tvn && ttang) { VECCOPY(mat[0], ttang); cross_v3_v3v3(mat[1], tvn, ttang); + mul_v3_fl(mat[1], ttang[3]); VECCOPY(mat[2], tvn); } else { VECCOPY(mat[0], shi->nmaptang); - cross_v3_v3v3(mat[1], shi->vn, shi->nmaptang); - VECCOPY(mat[2], shi->vn); + cross_v3_v3v3(mat[1], shi->nmapnorm, shi->nmaptang); + mul_v3_fl(mat[1], shi->nmaptang[3]); + VECCOPY(mat[2], shi->nmapnorm); } invert_m3_m3(imat, mat); @@ -2347,7 +2349,7 @@ static void do_bake_shade(void *handle, int x, int y, float u, float v) VlakRen *vlr= bs->vlr; ObjectInstanceRen *obi= bs->obi; Object *ob= obi->obr->ob; - float l, *v1, *v2, *v3, tvn[3], ttang[3]; + float l, *v1, *v2, *v3, tvn[3], ttang[4]; int quad; ShadeSample *ssamp= &bs->ssamp; ShadeInput *shi= ssamp->shi; @@ -2386,8 +2388,8 @@ static void do_bake_shade(void *handle, int x, int y, float u, float v) if(bs->type==RE_BAKE_NORMALS && R.r.bake_normal_space==R_BAKE_SPACE_TANGENT) { shade_input_set_shade_texco(shi); - VECCOPY(tvn, shi->vn); - VECCOPY(ttang, shi->nmaptang); + VECCOPY(tvn, shi->nmapnorm); + QUATCOPY(ttang, shi->nmaptang); } /* if we are doing selected to active baking, find point on other face */ diff --git a/source/blender/render/intern/source/renderdatabase.c b/source/blender/render/intern/source/renderdatabase.c index c1a3b989c1f..f5e5c679b9d 100644 --- a/source/blender/render/intern/source/renderdatabase.c +++ b/source/blender/render/intern/source/renderdatabase.c @@ -109,7 +109,7 @@ #define RE_RADFACE_ELEMS 1 #define RE_SIMPLIFY_ELEMS 2 #define RE_FACE_ELEMS 1 -#define RE_NMAP_TANGENT_ELEMS 12 +#define RE_NMAP_TANGENT_ELEMS 16 float *RE_vertren_get_sticky(ObjectRen *obr, VertRen *ver, int verify) { @@ -1000,6 +1000,7 @@ HaloRen *RE_inithalo(Render *re, ObjectRen *obr, Material *ma, float *vec, f if(ma->mtex[0]) { if( (ma->mode & MA_HALOTEX) ) har->tex= 1; + else if(har->mat->septex & (1<<0)); /* only 1 level textures */ else { mtex= ma->mtex[0]; diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c index 98a90427aac..3ed2a347e56 100644 --- a/source/blender/render/intern/source/shadeinput.c +++ b/source/blender/render/intern/source/shadeinput.c @@ -286,9 +286,9 @@ void shade_input_set_triangle_i(ShadeInput *shi, ObjectInstanceRen *obi, VlakRen VECCOPY(shi->n3, shi->v3->n); if(obi->flag & R_TRANSFORMED) { - mul_m3_v3(obi->nmat, shi->n1); - mul_m3_v3(obi->nmat, shi->n2); - mul_m3_v3(obi->nmat, shi->n3); + mul_m3_v3(obi->nmat, shi->n1); normalize_v3(shi->n1); + mul_m3_v3(obi->nmat, shi->n2); normalize_v3(shi->n2); + mul_m3_v3(obi->nmat, shi->n3); normalize_v3(shi->n3); } } } @@ -819,11 +819,17 @@ void shade_input_set_normals(ShadeInput *shi) shi->vn[0]= l*n3[0]-u*n1[0]-v*n2[0]; shi->vn[1]= l*n3[1]-u*n1[1]-v*n2[1]; shi->vn[2]= l*n3[2]-u*n1[2]-v*n2[2]; + + // use unnormalized normal (closer to games) + VECCOPY(shi->nmapnorm, shi->vn); normalize_v3(shi->vn); } else + { VECCOPY(shi->vn, shi->facenor); + VECCOPY(shi->nmapnorm, shi->vn); + } /* used in nodes */ VECCOPY(shi->vno, shi->vn); @@ -834,6 +840,36 @@ void shade_input_set_normals(ShadeInput *shi) shade_input_flip_normals(shi); } +/* XXX shi->flippednor messes up otherwise */ +static void shade_input_set_vertex_normals(ShadeInput *shi) +{ + float u= shi->u, v= shi->v; + float l= 1.0f+u+v; + + /* calculate vertexnormals */ + if(shi->vlr->flag & R_SMOOTH) { + float *n1= shi->n1, *n2= shi->n2, *n3= shi->n3; + + shi->vn[0]= l*n3[0]-u*n1[0]-v*n2[0]; + shi->vn[1]= l*n3[1]-u*n1[1]-v*n2[1]; + shi->vn[2]= l*n3[2]-u*n1[2]-v*n2[2]; + + // use unnormalized normal (closer to games) + VECCOPY(shi->nmapnorm, shi->vn); + + normalize_v3(shi->vn); + } + else + { + VECCOPY(shi->vn, shi->facenor); + VECCOPY(shi->nmapnorm, shi->vn); + } + + /* used in nodes */ + VECCOPY(shi->vno, shi->vn); +} + + /* use by raytrace, sss, bake to flip into the right direction */ void shade_input_flip_normals(ShadeInput *shi) { @@ -849,6 +885,10 @@ void shade_input_flip_normals(ShadeInput *shi) shi->vno[1]= -shi->vno[1]; shi->vno[2]= -shi->vno[2]; + shi->nmapnorm[0] = -shi->nmapnorm[0]; + shi->nmapnorm[1] = -shi->nmapnorm[1]; + shi->nmapnorm[2] = -shi->nmapnorm[2]; + shi->flippednor= !shi->flippednor; } @@ -924,21 +964,32 @@ void shade_input_set_shade_texco(ShadeInput *shi) if(tangent) { int j1= shi->i1, j2= shi->i2, j3= shi->i3; + float c0[3], c1[3], c2[3]; vlr_set_uv_indices(shi->vlr, &j1, &j2, &j3); - s1= &tangent[j1*3]; - s2= &tangent[j2*3]; - s3= &tangent[j3*3]; - - shi->nmaptang[0]= (tl*s3[0] - tu*s1[0] - tv*s2[0]); - shi->nmaptang[1]= (tl*s3[1] - tu*s1[1] - tv*s2[1]); - shi->nmaptang[2]= (tl*s3[2] - tu*s1[2] - tv*s2[2]); + VECCOPY(c0, &tangent[j1*4]); + VECCOPY(c1, &tangent[j2*4]); + VECCOPY(c2, &tangent[j3*4]); + // keeping tangents normalized at vertex level + // corresponds better to how it's done in game engines if(obi->flag & R_TRANSFORMED) - mul_m3_v3(obi->nmat, shi->nmaptang); - - normalize_v3(shi->nmaptang); + { + mul_mat3_m4_v3(obi->mat, c0); normalize_v3(c0); + mul_mat3_m4_v3(obi->mat, c1); normalize_v3(c1); + mul_mat3_m4_v3(obi->mat, c2); normalize_v3(c2); + } + + // we don't normalize the interpolated TBN tangent + // corresponds better to how it's done in game engines + shi->nmaptang[0]= (tl*c2[0] - tu*c0[0] - tv*c1[0]); + shi->nmaptang[1]= (tl*c2[1] - tu*c0[1] - tv*c1[1]); + shi->nmaptang[2]= (tl*c2[2] - tu*c0[2] - tv*c1[2]); + + // the sign is the same for all 3 vertices of any + // non degenerate triangle. + shi->nmaptang[3]= tangent[j1*4+3]; } } } @@ -1361,7 +1412,10 @@ void shade_samples_fill_with_ps(ShadeSample *ssamp, PixStr *ps, int x, int y) shi->samplenr= R.shadowsamplenr[shi->thread]++; /* this counter is not being reset per pixel */ shade_input_set_viewco(shi, x, y, xs, ys, (float)ps->z); shade_input_set_uv(shi); - shade_input_set_normals(shi); + if(shi_cp==0) + shade_input_set_normals(shi); + else /* XXX shi->flippednor messes up otherwise */ + shade_input_set_vertex_normals(shi); shi_cp= 1; shi++; diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index c9d74cbb39d..c21c714f125 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -1,4 +1,4 @@ -/** +/* * $Id$ * * ***** BEGIN GPL LICENSE BLOCK ***** @@ -28,6 +28,17 @@ #ifndef WM_API_H #define WM_API_H +/** \file WM_api.h + * \ingroup wm + * + * \page wmpage windowmanager + * \section wmabout About windowmanager + * \ref wm handles events received from \ref GHOST and manages + * the screens, areas and input for Blender + * \section wmnote NOTE + * \todo document + */ + /* dna-savable wmStructs here */ #include "DNA_windowmanager_types.h" @@ -59,7 +70,7 @@ void WM_setprefsize (int stax, int stay, int sizx, int sizy); void WM_setinitialstate_fullscreen(void); void WM_setinitialstate_normal(void); -void WM_init (struct bContext *C, int argc, char **argv); +void WM_init (struct bContext *C, int argc, const char **argv); void WM_exit (struct bContext *C); void WM_main (struct bContext *C); @@ -351,6 +362,9 @@ void WM_progress_clear(struct wmWindow *win); void WM_toggle_console(struct bContext *C, short show); #endif +/* debugging only, convenience function to write on crash */ +int write_crash_blend(void); + #ifdef __cplusplus } #endif diff --git a/source/blender/windowmanager/intern/wm_cursors.c b/source/blender/windowmanager/intern/wm_cursors.c index f0a416e1c6e..d9d9de3f9e9 100644 --- a/source/blender/windowmanager/intern/wm_cursors.c +++ b/source/blender/windowmanager/intern/wm_cursors.c @@ -70,7 +70,7 @@ static GHOST_TStandardCursor convert_cursor(int curs) } } -void window_set_custom_cursor(wmWindow *win, unsigned char mask[16][2], +static void window_set_custom_cursor(wmWindow *win, unsigned char mask[16][2], unsigned char bitmap[16][2], int hotx, int hoty) { GHOST_SetCustomCursorShape(win->ghostwin, bitmap, mask, hotx, hoty); diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c index 6bdb45c3220..64779a162eb 100644 --- a/source/blender/windowmanager/intern/wm_draw.c +++ b/source/blender/windowmanager/intern/wm_draw.c @@ -560,7 +560,7 @@ static void wm_method_draw_triple(bContext *C, wmWindow *win) bScreen *screen= win->screen; ScrArea *sa; ARegion *ar; - int copytex= 0; + int copytex= 0, paintcursor= 1; if(win->drawdata) { glClearColor(0, 0, 0, 0); @@ -616,6 +616,8 @@ static void wm_method_draw_triple(bContext *C, wmWindow *win) CTX_wm_menu_set(C, ar); ED_region_do_draw(C, ar); CTX_wm_menu_set(C, NULL); + /* when a menu is being drawn, don't do the paint cursors */ + paintcursor= 0; } } @@ -623,7 +625,7 @@ static void wm_method_draw_triple(bContext *C, wmWindow *win) if(win->gesture.first) wm_gesture_draw(win); - if(wm->paintcursors.first) { + if(paintcursor && wm->paintcursors.first) { for(sa= screen->areabase.first; sa; sa= sa->next) { for(ar=sa->regionbase.first; ar; ar= ar->next) { if(ar->swinid == screen->subwinactive) { @@ -809,7 +811,7 @@ void wm_draw_region_clear(wmWindow *win, ARegion *ar) win->screen->do_draw= 1; } -void wm_draw_region_modified(wmWindow *win, ARegion *ar) +static void wm_draw_region_modified(wmWindow *win, ARegion *ar) { int drawmethod= wm_automatic_draw_method(win); diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 3de7b569af4..39a6e5b27b5 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -2099,21 +2099,29 @@ void WM_event_add_mousemove(bContext *C) /* for modal callbacks, check configuration for how to interpret exit with tweaks */ int WM_modal_tweak_exit(wmEvent *evt, int tweak_event) { - /* user preset or keymap? dunno... */ - // XXX WTH is this? - int tweak_modal= (U.flag & USER_RELEASECONFIRM)==0; - - switch(tweak_event) { - case EVT_TWEAK_L: - case EVT_TWEAK_M: - case EVT_TWEAK_R: - if(evt->val==tweak_modal) - return 1; - default: - /* this case is when modal callcback didnt get started with a tweak */ - if(evt->val) - return 1; + /* if the release-confirm userpref setting is enabled, + * tweak events can be cancelled when mouse is released + */ + if (U.flag & USER_RELEASECONFIRM) { + /* option on, so can exit with km-release */ + if (evt->val == KM_RELEASE) { + switch (tweak_event) { + case EVT_TWEAK_L: + case EVT_TWEAK_M: + case EVT_TWEAK_R: + return 1; + } + } } + else { + /* this is fine as long as not doing km-release, otherwise + * some items (i.e. markers) being tweaked may end up getting + * dropped all over + */ + if (evt->val != KM_RELEASE) + return 1; + } + return 0; } @@ -2188,7 +2196,12 @@ static int convert_key(GHOST_TKey key) case GHOST_kKeyNumpadSlash: return PADSLASHKEY; case GHOST_kKeyGrLess: return GRLESSKEY; - + + case GHOST_kKeyMediaPlay: return MEDIAPLAY; + case GHOST_kKeyMediaStop: return MEDIASTOP; + case GHOST_kKeyMediaFirst: return MEDIAFIRST; + case GHOST_kKeyMediaLast: return MEDIALAST; + default: return UNKNOWNKEY; /* GHOST_kKeyUnknown */ } diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index 31873160944..b54e70a7640 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -105,6 +105,7 @@ #include "WM_api.h" #include "WM_types.h" #include "wm.h" +#include "wm_files.h" #include "wm_window.h" #include "wm_event_system.h" @@ -446,7 +447,7 @@ int WM_read_homefile_exec(bContext *C, wmOperator *op) return WM_read_homefile(C, op->reports, from_memory) ? OPERATOR_FINISHED : OPERATOR_CANCELLED; } -void read_history(void) +void WM_read_history(void) { char name[FILE_MAX]; LinkNode *l, *lines; @@ -500,9 +501,7 @@ static void write_history(void) if (fp) { /* add current file to the beginning of list */ recent = (RecentFile*)MEM_mallocN(sizeof(RecentFile),"RecentFile"); - recent->filepath = (char*)MEM_mallocN(sizeof(char)*(strlen(G.main->name)+1), "name of file"); - recent->filepath[0] = '\0'; - BLI_strncpy(recent->filepath, G.main->name, sizeof(recent->filepath)); + recent->filepath = BLI_strdup(G.main->name); BLI_addhead(&(G.recent_files), recent); /* write current file to recent-files.txt */ fprintf(fp, "%s\n", recent->filepath); diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c index 0d1dfd5fbba..bce61dae013 100644 --- a/source/blender/windowmanager/intern/wm_init_exit.c +++ b/source/blender/windowmanager/intern/wm_init_exit.c @@ -112,7 +112,7 @@ static void wm_free_reports(bContext *C) /* only called once, for startup */ -void WM_init(bContext *C, int argc, char **argv) +void WM_init(bContext *C, int argc, const char **argv) { if (!G.background) { @@ -175,7 +175,7 @@ void WM_init(bContext *C, int argc, char **argv) G.ndofdevice = -1; /* XXX bad initializer, needs set otherwise buttons show! */ - read_history(); + WM_read_history(); /* allow a path of "", this is what happens when making a new file */ /* diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index 534aab94ada..d61e42c2353 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -722,7 +722,7 @@ static uiBlock *wm_enum_search_menu(bContext *C, ARegion *ar, void *arg_op) /* fake button, it holds space for search items */ uiDefBut(block, LABEL, 0, "", 10, 10 - uiSearchBoxhHeight(), 180, uiSearchBoxhHeight(), NULL, 0, 0, 0, 0, NULL); - uiPopupBoundsBlock(block, 6.0f, 0, -20); /* move it downwards, mouse over button */ + uiPopupBoundsBlock(block, 6, 0, -20); /* move it downwards, mouse over button */ uiEndBlock(C, block); event= *(win->eventstate); /* XXX huh huh? make api call */ diff --git a/source/blender/windowmanager/wm_event_types.h b/source/blender/windowmanager/wm_event_types.h index 5d7eb625f78..c3573f86c6d 100644 --- a/source/blender/windowmanager/wm_event_types.h +++ b/source/blender/windowmanager/wm_event_types.h @@ -207,6 +207,12 @@ #define OSKEY 172 #define GRLESSKEY 173 +// XXX: are these codes ok? +#define MEDIAPLAY 174 +#define MEDIASTOP 175 +#define MEDIAFIRST 176 +#define MEDIALAST 177 + /* for event checks */ /* only used for KM_TEXTINPUT, so assume that we want all user-inputtable ascii codes included */ #define ISTEXTINPUT(event) (event >=' ' && event <=255) diff --git a/source/blender/windowmanager/wm_files.h b/source/blender/windowmanager/wm_files.h index 15a38251795..6a07218bebd 100644 --- a/source/blender/windowmanager/wm_files.h +++ b/source/blender/windowmanager/wm_files.h @@ -28,9 +28,7 @@ #ifndef WM_FILES_H #define WM_FILES_H -extern void read_history(void); -extern void delete_autosave(void); - +void WM_read_history(void); #endif /* WM_FILES_H */ diff --git a/source/blenderplayer/CMakeLists.txt b/source/blenderplayer/CMakeLists.txt index 5950753164b..8ef06e9fc21 100644 --- a/source/blenderplayer/CMakeLists.txt +++ b/source/blenderplayer/CMakeLists.txt @@ -122,8 +122,9 @@ if(UNIX) extern_minilzo bf_intern_ghost # duplicate for linking bf_blenkernel # duplicate for linking + bf_intern_mikktspace ) - + if(WITH_CODEC_QUICKTIME) list(APPEND BLENDER_SORTED_LIBS bf_quicktime) endif() diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index fc0f97b184d..c1441dd9d38 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -573,6 +573,7 @@ endif() bf_dna bf_blenfont bf_intern_audaspace + bf_intern_mikktspace ) if(CMAKE_SYSTEM_NAME MATCHES "Linux") diff --git a/source/creator/creator.c b/source/creator/creator.c index ae5fa2a2e0a..30e3b8a01a7 100644 --- a/source/creator/creator.c +++ b/source/creator/creator.c @@ -133,8 +133,8 @@ extern char build_system[]; #endif /* Local Function prototypes */ -static int print_help(int argc, char **argv, void *data); -static int print_version(int argc, char **argv, void *data); +static int print_help(int argc, const char **argv, void *data); +static int print_version(int argc, const char **argv, void *data); /* for the callbacks: */ @@ -187,7 +187,7 @@ static void strip_quotes(char *str) } #endif -static int print_version(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(data)) +static int print_version(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) { printf (BLEND_VERSION_STRING_FMT); #ifdef BUILD_DATE @@ -206,7 +206,7 @@ static int print_version(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(dat return 0; } -static int print_help(int UNUSED(argc), char **UNUSED(argv), void *data) +static int print_help(int UNUSED(argc), const char **UNUSED(argv), void *data) { bArgs *ba = (bArgs*)data; @@ -340,30 +340,30 @@ double PIL_check_seconds_timer(void); } }*/ -static int end_arguments(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(data)) +static int end_arguments(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) { return -1; } -static int enable_python(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(data)) +static int enable_python(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) { G.f |= G_SCRIPT_AUTOEXEC; return 0; } -static int disable_python(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(data)) +static int disable_python(int UNUSED(argc), const const char **UNUSED(argv), void *UNUSED(data)) { G.f &= ~G_SCRIPT_AUTOEXEC; return 0; } -static int background_mode(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(data)) +static int background_mode(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) { G.background = 1; return 0; } -static int debug_mode(int UNUSED(argc), char **UNUSED(argv), void *data) +static int debug_mode(int UNUSED(argc), const char **UNUSED(argv), void *data) { G.f |= G_DEBUG; /* std output printf's */ printf(BLEND_VERSION_STRING_FMT); @@ -377,7 +377,7 @@ static int debug_mode(int UNUSED(argc), char **UNUSED(argv), void *data) return 0; } -static int set_fpe(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(data)) +static int set_fpe(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) { #if defined(__sgi) || defined(__linux__) || defined(_WIN32) || OSX_SSE_FPE /* zealous but makes float issues a heck of a lot easier to find! @@ -402,19 +402,19 @@ static int set_fpe(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(data)) return 0; } -static int set_factory_startup(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(data)) +static int set_factory_startup(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) { G.factory_startup= 1; return 0; } -static int set_env(int argc, char **argv, void *UNUSED(data)) +static int set_env(int argc, const char **argv, void *UNUSED(data)) { /* "--env-system-scripts" --> "BLENDER_SYSTEM_SCRIPTS" */ char env[64]= "BLENDER"; char *ch_dst= env + 7; /* skip BLENDER */ - char *ch_src= argv[0] + 5; /* skip --env */ + const char *ch_src= argv[0] + 5; /* skip --env */ if (argc < 2) { printf("%s requires one argument\n", argv[0]); @@ -430,7 +430,7 @@ static int set_env(int argc, char **argv, void *UNUSED(data)) return 1; } -static int playback_mode(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(data)) +static int playback_mode(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) { /* not if -b was given first */ if (G.background == 0) { @@ -442,7 +442,7 @@ static int playback_mode(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(dat return -2; } -static int prefsize(int argc, char **argv, void *UNUSED(data)) +static int prefsize(int argc, const char **argv, void *UNUSED(data)) { int stax, stay, sizx, sizy; @@ -461,19 +461,19 @@ static int prefsize(int argc, char **argv, void *UNUSED(data)) return 4; } -static int with_borders(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(data)) +static int with_borders(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) { WM_setinitialstate_normal(); return 0; } -static int without_borders(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(data)) +static int without_borders(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) { WM_setinitialstate_fullscreen(); return 0; } -static int register_extension(int UNUSED(argc), char **UNUSED(argv), void *data) +static int register_extension(int UNUSED(argc), const char **UNUSED(argv), void *data) { #ifdef WIN32 char *path = BLI_argsArgv(data)[0]; @@ -485,7 +485,7 @@ static int register_extension(int UNUSED(argc), char **UNUSED(argv), void *data) return 0; } -static int no_joystick(int UNUSED(argc), char **UNUSED(argv), void *data) +static int no_joystick(int UNUSED(argc), const char **UNUSED(argv), void *data) { #ifndef WITH_GAMEENGINE (void)data; @@ -503,19 +503,19 @@ static int no_joystick(int UNUSED(argc), char **UNUSED(argv), void *data) return 0; } -static int no_glsl(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(data)) +static int no_glsl(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) { GPU_extensions_disable(); return 0; } -static int no_audio(int UNUSED(argc), char **UNUSED(argv), void *UNUSED(data)) +static int no_audio(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data)) { sound_force_device(0); return 0; } -static int set_audio(int argc, char **argv, void *UNUSED(data)) +static int set_audio(int argc, const char **argv, void *UNUSED(data)) { if (argc < 1) { printf("-setaudio require one argument\n"); @@ -526,7 +526,7 @@ static int set_audio(int argc, char **argv, void *UNUSED(data)) return 1; } -static int set_output(int argc, char **argv, void *data) +static int set_output(int argc, const char **argv, void *data) { bContext *C = data; if (argc >= 1){ @@ -543,7 +543,7 @@ static int set_output(int argc, char **argv, void *data) } } -static int set_engine(int argc, char **argv, void *data) +static int set_engine(int argc, const char **argv, void *data) { bContext *C = data; if (argc >= 1) @@ -589,11 +589,11 @@ static int set_engine(int argc, char **argv, void *data) } } -static int set_image_type(int argc, char **argv, void *data) +static int set_image_type(int argc, const char **argv, void *data) { bContext *C = data; if (argc >= 1){ - char *imtype = argv[1]; + const char *imtype = argv[1]; if (CTX_data_scene(C)==NULL) { printf("\nError: no blend loaded. order the arguments so '-F / --render-format' is after the blend is loaded.\n"); } else { @@ -640,7 +640,7 @@ static int set_image_type(int argc, char **argv, void *data) } } -static int set_threads(int argc, char **argv, void *UNUSED(data)) +static int set_threads(int argc, const char **argv, void *UNUSED(data)) { if (argc >= 1) { if(G.background) { @@ -655,7 +655,7 @@ static int set_threads(int argc, char **argv, void *UNUSED(data)) } } -static int set_extension(int argc, char **argv, void *data) +static int set_extension(int argc, const char **argv, void *data) { bContext *C = data; if (argc >= 1) { @@ -678,7 +678,7 @@ static int set_extension(int argc, char **argv, void *data) } } -static int set_ge_parameters(int argc, char **argv, void *data) +static int set_ge_parameters(int argc, const char **argv, void *data) { int a = 0; #ifdef WITH_GAMEENGINE @@ -698,7 +698,7 @@ example: if(argc >= 1) { - char* paramname = argv[a]; + const char *paramname = argv[a]; /* check for single value versus assignment */ if (a+1 < argc && (*(argv[a+1]) == '=')) { @@ -739,7 +739,7 @@ example: return a; } -static int render_frame(int argc, char **argv, void *data) +static int render_frame(int argc, const char **argv, void *data) { bContext *C = data; if (CTX_data_scene(C)) { @@ -779,7 +779,7 @@ static int render_frame(int argc, char **argv, void *data) } } -static int render_animation(int UNUSED(argc), char **UNUSED(argv), void *data) +static int render_animation(int UNUSED(argc), const char **UNUSED(argv), void *data) { bContext *C = data; if (CTX_data_scene(C)) { @@ -795,7 +795,7 @@ static int render_animation(int UNUSED(argc), char **UNUSED(argv), void *data) return 0; } -static int set_scene(int argc, char **argv, void *data) +static int set_scene(int argc, const char **argv, void *data) { if(argc > 1) { bContext *C= data; @@ -810,7 +810,7 @@ static int set_scene(int argc, char **argv, void *data) } } -static int set_start_frame(int argc, char **argv, void *data) +static int set_start_frame(int argc, const char **argv, void *data) { bContext *C = data; if (CTX_data_scene(C)) { @@ -829,7 +829,7 @@ static int set_start_frame(int argc, char **argv, void *data) } } -static int set_end_frame(int argc, char **argv, void *data) +static int set_end_frame(int argc, const char **argv, void *data) { bContext *C = data; if (CTX_data_scene(C)) { @@ -848,7 +848,7 @@ static int set_end_frame(int argc, char **argv, void *data) } } -static int set_skip_frame(int argc, char **argv, void *data) +static int set_skip_frame(int argc, const char **argv, void *data) { bContext *C = data; if (CTX_data_scene(C)) { @@ -888,7 +888,7 @@ static int set_skip_frame(int argc, char **argv, void *data) #endif /* WITH_PYTHON */ -static int run_python(int argc, char **argv, void *data) +static int run_python(int argc, const char **argv, void *data) { #ifdef WITH_PYTHON bContext *C = data; @@ -914,7 +914,7 @@ static int run_python(int argc, char **argv, void *data) #endif /* WITH_PYTHON */ } -static int run_python_console(int UNUSED(argc), char **argv, void *data) +static int run_python_console(int UNUSED(argc), const char **argv, void *data) { #ifdef WITH_PYTHON bContext *C = data; @@ -929,7 +929,7 @@ static int run_python_console(int UNUSED(argc), char **argv, void *data) #endif /* WITH_PYTHON */ } -static int set_addons(int argc, char **argv, void *data) +static int set_addons(int argc, const char **argv, void *data) { /* workaround for scripts not getting a bpy.context.scene, causes internal errors elsewhere */ if (argc > 1) { @@ -952,7 +952,7 @@ static int set_addons(int argc, char **argv, void *data) } -static int load_file(int UNUSED(argc), char **argv, void *data) +static int load_file(int UNUSED(argc), const char **argv, void *data) { bContext *C = data; @@ -1281,7 +1281,7 @@ int main(int argc, char **argv) return 0; } /* end of int main(argc,argv) */ -static void error_cb(char *err) +static void error_cb(const char *err) { printf("%s\n", err); /* XXX do this in WM too */ diff --git a/source/gameengine/Converter/BL_ActionActuator.cpp b/source/gameengine/Converter/BL_ActionActuator.cpp index ac35007129a..16c687df5fc 100644 --- a/source/gameengine/Converter/BL_ActionActuator.cpp +++ b/source/gameengine/Converter/BL_ActionActuator.cpp @@ -27,12 +27,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#if defined (__sgi) -#include <math.h> -#else -#include <cmath> -#endif - #include "SCA_LogicManager.h" #include "BL_ActionActuator.h" #include "BL_ArmatureObject.h" @@ -232,6 +226,16 @@ bool BL_ActionActuator::Update(double curtime, bool frame) apply=false; } break; + case ACT_ACTION_PINGPONG: + if (bPositiveEvent){ + if (!(m_flag & ACT_FLAG_LOCKINPUT)){ + m_flag &= ~ACT_FLAG_KEYUP; + m_localtime = m_starttime; + m_starttime = curtime; + m_flag |= ACT_FLAG_LOCKINPUT; + } + } + break; case ACT_ACTION_FLIPPER: if (bPositiveEvent){ if (!(m_flag & ACT_FLAG_LOCKINPUT)){ @@ -306,6 +310,18 @@ bool BL_ActionActuator::Update(double curtime, bool frame) break; case ACT_ACTION_LOOP_STOP: break; + case ACT_ACTION_PINGPONG: + if (wrap){ + if (!(m_flag & ACT_FLAG_REVERSE)) + m_localtime = m_endframe; + else + m_localtime = m_startframe; + + m_flag &= ~ACT_FLAG_LOCKINPUT; + m_flag ^= ACT_FLAG_REVERSE; //flip direction + keepgoing = false; + } + break; case ACT_ACTION_FLIPPER: if (wrap){ if (!(m_flag & ACT_FLAG_REVERSE)){ diff --git a/source/gameengine/Converter/BL_ActionActuator.h b/source/gameengine/Converter/BL_ActionActuator.h index 9682c0e45f7..bfbb160e464 100644 --- a/source/gameengine/Converter/BL_ActionActuator.h +++ b/source/gameengine/Converter/BL_ActionActuator.h @@ -121,6 +121,7 @@ public: switch (act->m_playtype) { case ACT_ACTION_PLAY: + case ACT_ACTION_PINGPONG: case ACT_ACTION_FLIPPER: case ACT_ACTION_LOOP_STOP: case ACT_ACTION_LOOP_END: diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index ab9882cab87..f1b70288c10 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -730,13 +730,13 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, KX_Scene* scene, MFace *mface = dm->getFaceArray(dm); MTFace *tface = static_cast<MTFace*>(dm->getFaceDataArray(dm, CD_MTFACE)); MCol *mcol = static_cast<MCol*>(dm->getFaceDataArray(dm, CD_MCOL)); - float (*tangent)[3] = NULL; + float (*tangent)[4] = NULL; int totface = dm->getNumFaces(dm); const char *tfaceName = ""; if(tface) { DM_add_tangent_layer(dm); - tangent = (float(*)[3])dm->getFaceDataArray(dm, CD_TANGENT); + tangent = (float(*)[4])dm->getFaceDataArray(dm, CD_TANGENT); } meshobj = new RAS_MeshObject(mesh); diff --git a/source/gameengine/Converter/BL_ShapeActionActuator.cpp b/source/gameengine/Converter/BL_ShapeActionActuator.cpp index 4f6e07206dd..d4ced2634ea 100644 --- a/source/gameengine/Converter/BL_ShapeActionActuator.cpp +++ b/source/gameengine/Converter/BL_ShapeActionActuator.cpp @@ -226,6 +226,16 @@ bool BL_ShapeActionActuator::Update(double curtime, bool frame) apply=false; } break; + case ACT_ACTION_PINGPONG: + if (bPositiveEvent){ + if (!(m_flag & ACT_FLAG_LOCKINPUT)){ + m_flag &= ~ACT_FLAG_KEYUP; + m_localtime = m_starttime; + m_starttime = curtime; + m_flag |= ACT_FLAG_LOCKINPUT; + } + } + break; case ACT_ACTION_FLIPPER: if (bPositiveEvent){ if (!(m_flag & ACT_FLAG_LOCKINPUT)){ @@ -300,6 +310,18 @@ bool BL_ShapeActionActuator::Update(double curtime, bool frame) break; case ACT_ACTION_LOOP_STOP: break; + case ACT_ACTION_PINGPONG: + if (wrap){ + if (!(m_flag & ACT_FLAG_REVERSE)) + m_localtime = m_endframe; + else + m_localtime = m_startframe; + + m_flag &= ~ACT_FLAG_LOCKINPUT; + m_flag ^= ACT_FLAG_REVERSE; //flip direction + keepgoing = false; + } + break; case ACT_ACTION_FLIPPER: if (wrap){ if (!(m_flag & ACT_FLAG_REVERSE)){ diff --git a/source/gameengine/Converter/BL_ShapeActionActuator.h b/source/gameengine/Converter/BL_ShapeActionActuator.h index e6457e2c686..64b75967874 100644 --- a/source/gameengine/Converter/BL_ShapeActionActuator.h +++ b/source/gameengine/Converter/BL_ShapeActionActuator.h @@ -113,6 +113,7 @@ public: switch (act->m_playtype) { case ACT_ACTION_PLAY: + case ACT_ACTION_PINGPONG: case ACT_ACTION_FLIPPER: case ACT_ACTION_LOOP_STOP: case ACT_ACTION_LOOP_END: diff --git a/source/gameengine/Expressions/InputParser.cpp b/source/gameengine/Expressions/InputParser.cpp index 8187ff6a9e8..1d3a50601a5 100644 --- a/source/gameengine/Expressions/InputParser.cpp +++ b/source/gameengine/Expressions/InputParser.cpp @@ -151,6 +151,28 @@ void CParser::GrabString(int start) +void CParser::GrabRealString(int start) +{ + // works like GrabString but converting \\n to \n + // puts part of the input string into the global variable + // const_as_string, from position start, to position chchount + + int i; + char tmpch; + + const_as_string = STR_String(); + for (i=start;i<chcount;i++) { + tmpch= text[i]; + if ((tmpch =='\\') && (text[i+1] == 'n')){ + tmpch = '\n'; + i++; + } + const_as_string += tmpch; + } +} + + + void CParser::NextSym() { // sets the global variable sym to the next symbol, and @@ -244,7 +266,7 @@ void CParser::NextSym() start = chcount; while ((ch != '\"') && (ch != 0x0)) NextCh(); - GrabString(start); + GrabRealString(start); TermChar('\"'); // check for eol before '\"' break; } diff --git a/source/gameengine/Expressions/InputParser.h b/source/gameengine/Expressions/InputParser.h index b640d4eedc7..4c47677034b 100644 --- a/source/gameengine/Expressions/InputParser.h +++ b/source/gameengine/Expressions/InputParser.h @@ -93,6 +93,7 @@ private: void DigRep(); void CharRep(); void GrabString(int start); + void GrabRealString(int start); void NextSym(); #if 0 /* not used yet */ int MakeInt(); diff --git a/source/gameengine/Expressions/PyObjectPlus.h b/source/gameengine/Expressions/PyObjectPlus.h index d69be6af5e5..4890a5edb04 100644 --- a/source/gameengine/Expressions/PyObjectPlus.h +++ b/source/gameengine/Expressions/PyObjectPlus.h @@ -169,35 +169,35 @@ typedef struct PyObjectPlus_Proxy { #define KX_PYMETHOD(class_name, method_name) \ PyObject* Py##method_name(PyObject* args, PyObject* kwds); \ static PyObject* sPy##method_name( PyObject* self, PyObject* args, PyObject* kwds) { \ - if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "() - " BGE_PROXY_ERROR_MSG); return NULL; } \ + if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_RuntimeError, #class_name "." #method_name "() - " BGE_PROXY_ERROR_MSG); return NULL; } \ return ((class_name*)BGE_PROXY_REF(self))->Py##method_name(args, kwds); \ }; \ #define KX_PYMETHOD_VARARGS(class_name, method_name) \ PyObject* Py##method_name(PyObject* args); \ static PyObject* sPy##method_name( PyObject* self, PyObject* args) { \ - if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "() - " BGE_PROXY_ERROR_MSG); return NULL; } \ + if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_RuntimeError, #class_name "." #method_name "() - " BGE_PROXY_ERROR_MSG); return NULL; } \ return ((class_name*)BGE_PROXY_REF(self))->Py##method_name(args); \ }; \ #define KX_PYMETHOD_NOARGS(class_name, method_name) \ PyObject* Py##method_name(); \ static PyObject* sPy##method_name( PyObject* self) { \ - if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "() - " BGE_PROXY_ERROR_MSG); return NULL; } \ + if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_RuntimeError, #class_name "." #method_name "() - " BGE_PROXY_ERROR_MSG); return NULL; } \ return ((class_name*)BGE_PROXY_REF(self))->Py##method_name(); \ }; \ #define KX_PYMETHOD_O(class_name, method_name) \ PyObject* Py##method_name(PyObject* value); \ static PyObject* sPy##method_name( PyObject* self, PyObject* value) { \ - if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "(value) - " BGE_PROXY_ERROR_MSG); return NULL; } \ + if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_RuntimeError, #class_name "." #method_name "(value) - " BGE_PROXY_ERROR_MSG); return NULL; } \ return ((class_name*)BGE_PROXY_REF(self))->Py##method_name(value); \ }; \ #define KX_PYMETHOD_DOC(class_name, method_name) \ PyObject* Py##method_name(PyObject* args, PyObject* kwds); \ static PyObject* sPy##method_name( PyObject* self, PyObject* args, PyObject* kwds) { \ - if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "(...) - " BGE_PROXY_ERROR_MSG); return NULL; } \ + if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_RuntimeError, #class_name "." #method_name "(...) - " BGE_PROXY_ERROR_MSG); return NULL; } \ return ((class_name*)BGE_PROXY_REF(self))->Py##method_name(args, kwds); \ }; \ static const char method_name##_doc[]; \ @@ -205,7 +205,7 @@ typedef struct PyObjectPlus_Proxy { #define KX_PYMETHOD_DOC_VARARGS(class_name, method_name) \ PyObject* Py##method_name(PyObject* args); \ static PyObject* sPy##method_name( PyObject* self, PyObject* args) { \ - if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "(...) - " BGE_PROXY_ERROR_MSG); return NULL; } \ + if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_RuntimeError, #class_name "." #method_name "(...) - " BGE_PROXY_ERROR_MSG); return NULL; } \ return ((class_name*)BGE_PROXY_REF(self))->Py##method_name(args); \ }; \ static const char method_name##_doc[]; \ @@ -213,7 +213,7 @@ typedef struct PyObjectPlus_Proxy { #define KX_PYMETHOD_DOC_O(class_name, method_name) \ PyObject* Py##method_name(PyObject* value); \ static PyObject* sPy##method_name( PyObject* self, PyObject* value) { \ - if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "(value) - " BGE_PROXY_ERROR_MSG); return NULL; } \ + if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_RuntimeError, #class_name "." #method_name "(value) - " BGE_PROXY_ERROR_MSG); return NULL; } \ return ((class_name*)BGE_PROXY_REF(self))->Py##method_name(value); \ }; \ static const char method_name##_doc[]; \ @@ -221,7 +221,7 @@ typedef struct PyObjectPlus_Proxy { #define KX_PYMETHOD_DOC_NOARGS(class_name, method_name) \ PyObject* Py##method_name(); \ static PyObject* sPy##method_name( PyObject* self) { \ - if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_SystemError, #class_name "." #method_name "() - " BGE_PROXY_ERROR_MSG); return NULL; } \ + if(BGE_PROXY_REF(self)==NULL) { PyErr_SetString(PyExc_RuntimeError, #class_name "." #method_name "() - " BGE_PROXY_ERROR_MSG); return NULL; } \ return ((class_name*)BGE_PROXY_REF(self))->Py##method_name(); \ }; \ static const char method_name##_doc[]; \ diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp index 8cc62e2c2fb..d0a6a9a9bec 100644 --- a/source/gameengine/Ketsji/KX_PythonInit.cpp +++ b/source/gameengine/Ketsji/KX_PythonInit.cpp @@ -1398,6 +1398,7 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack /* 7. Action actuator */ KX_MACRO_addTypesToDict(d, KX_ACTIONACT_PLAY, ACT_ACTION_PLAY); + KX_MACRO_addTypesToDict(d, KX_ACTIONACT_PINGPONG, ACT_ACTION_PINGPONG); KX_MACRO_addTypesToDict(d, KX_ACTIONACT_FLIPPER, ACT_ACTION_FLIPPER); KX_MACRO_addTypesToDict(d, KX_ACTIONACT_LOOPSTOP, ACT_ACTION_LOOP_STOP); KX_MACRO_addTypesToDict(d, KX_ACTIONACT_LOOPEND, ACT_ACTION_LOOP_END); diff --git a/source/tests/batch_import.py b/source/tests/batch_import.py index 29b6bb8b9aa..5fbe38e08ce 100644 --- a/source/tests/batch_import.py +++ b/source/tests/batch_import.py @@ -39,6 +39,7 @@ Example Usage: import os import sys + def clear_scene(): import bpy unique_obs = set() |