Merge with -r 22620:23107.
authorArystanbek Dyussenov <arystan.d@gmail.com>
Fri, 11 Sep 2009 18:09:58 +0000 (18:09 +0000)
committerArystanbek Dyussenov <arystan.d@gmail.com>
Fri, 11 Sep 2009 18:09:58 +0000 (18:09 +0000)
Next: update scripts and merge in 2.5.

37 files changed:
1  2 
SConstruct
release/io/export_ply.py
release/ui/buttons_data_empty.py
release/ui/space_info.py
source/blender/blenkernel/SConscript
source/blender/blenkernel/intern/image.c
source/blender/blenkernel/intern/mesh.c
source/blender/editors/include/ED_mesh.h
source/blender/editors/mesh/editmesh_mods.c
source/blender/makesdna/DNA_object_types.h
source/blender/makesdna/intern/SConscript
source/blender/makesrna/RNA_types.h
source/blender/makesrna/intern/makesrna.c
source/blender/makesrna/intern/rna_action.c
source/blender/makesrna/intern/rna_action_api.c
source/blender/makesrna/intern/rna_animation_api.c
source/blender/makesrna/intern/rna_armature.c
source/blender/makesrna/intern/rna_image_api.c
source/blender/makesrna/intern/rna_internal.h
source/blender/makesrna/intern/rna_material.c
source/blender/makesrna/intern/rna_material_api.c
source/blender/makesrna/intern/rna_mesh.c
source/blender/makesrna/intern/rna_mesh_api.c
source/blender/makesrna/intern/rna_object.c
source/blender/makesrna/intern/rna_object_api.c
source/blender/makesrna/intern/rna_pose.c
source/blender/makesrna/intern/rna_pose_api.c
source/blender/makesrna/intern/rna_scene_api.c
source/blender/makesrna/intern/rna_test.c
source/blender/makesrna/intern/rna_ui_api.c
source/blender/python/intern/bpy_interface.c
source/blender/python/intern/bpy_rna.c
source/blender/python/intern/bpy_util.c
source/creator/SConscript
source/creator/creator.c
tools/Blender.py
tools/btools.py

diff --combined SConstruct
@@@ -207,7 -207,6 +207,6 @@@ if env['WITH_BF_OPENMP'] == 1
                                env.Append(CCFLAGS=['-fopenmp']) 
                                env.Append(CPPFLAGS=['-fopenmp'])
                                env.Append(CXXFLAGS=['-fopenmp'])
-                               # env.Append(LINKFLAGS=['-fprofile-generate'])
  
  #check for additional debug libnames
  
@@@ -301,7 -300,6 +300,6 @@@ if env['WITH_BF_SDL'] == False and env[
        env['PLATFORM_LINKFLAGS'].append('/ENTRY:main')
  
  # lastly we check for root_build_dir ( we should not do before, otherwise we might do wrong builddir
- #B.root_build_dir = B.arguments.get('BF_BUILDDIR', '..'+os.sep+'build'+os.sep+platform+os.sep)
  B.root_build_dir = env['BF_BUILDDIR']
  B.doc_build_dir = env['BF_DOCDIR']
  if not B.root_build_dir[-1]==os.sep:
@@@ -392,7 -390,7 +390,7 @@@ SConscript(B.root_build_dir+'/source/SC
  # libraries to give as objects to linking phase
  mainlist = []
  for tp in B.possible_types:
-       if not tp == 'player' and not tp == 'player2':
+       if not tp == 'player':
                mainlist += B.create_blender_liblist(env, tp)
  
  if B.arguments.get('BF_PRIORITYLIST', '0')=='1':
@@@ -402,15 -400,12 +400,13 @@@ dobj = B.buildinfo(env, "dynamic") + B.
  thestatlibs, thelibincs = B.setup_staticlibs(env)
  thesyslibs = B.setup_syslibs(env)
  
- if env['WITH_BF_PLAYER']:
-       print("Warning: Game player may not build on 2.5")
  if 'blender' in B.targets or not env['WITH_BF_NOBLENDER']:
-       #env.BlenderProg(B.root_build_dir, "blender", dobj , [], mainlist + thestatlibs + thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blender')
 -      env.BlenderProg(B.root_build_dir, "blender", dobj + mainlist, [], thestatlibs + thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blender')
 +      blen = env.BlenderProg(B.root_build_dir, "blender", dobj + mainlist, [], thestatlibs + thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blender')
 +
  if env['WITH_BF_PLAYER']:
        playerlist = B.create_blender_liblist(env, 'player')
+       playerlist += B.create_blender_liblist(env, 'intern')
+       playerlist += B.create_blender_liblist(env, 'extern')
        env.BlenderProg(B.root_build_dir, "blenderplayer", dobj + playerlist, [], thestatlibs + thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blenderplayer')
  
  ##### Now define some targets
@@@ -576,16 -571,13 +572,13 @@@ if env['OURPLATFORM'] in ('win32-vc', '
        if env['WITH_BF_OPENAL']:
                dllsources.append('${LCGDIR}/openal/lib/OpenAL32.dll')
                dllsources.append('${LCGDIR}/openal/lib/wrap_oal.dll')
+       if env['WITH_BF_SNDFILE']:
+               dllsources.append('${LCGDIR}/sndfile/lib/libsndfile-1.dll')
        if env['WITH_BF_FFMPEG']:
                dllsources += ['${LCGDIR}/ffmpeg/lib/avcodec-52.dll',
                                                '${LCGDIR}/ffmpeg/lib/avformat-52.dll',
                                                '${LCGDIR}/ffmpeg/lib/avdevice-52.dll',
                                                '${LCGDIR}/ffmpeg/lib/avutil-50.dll',
-                                               '${LCGDIR}/ffmpeg/lib/libfaad-2.dll',
-                                               '${LCGDIR}/ffmpeg/lib/libfaac-0.dll',
-                                               '${LCGDIR}/ffmpeg/lib/libmp3lame-0.dll',
-                                               '${LCGDIR}/ffmpeg/lib/libx264-67.dll',
-                                               '${LCGDIR}/ffmpeg/lib/xvidcore.dll',
                                                '${LCGDIR}/ffmpeg/lib/swscale-0.dll']
        if env['WITH_BF_JACK']:
                dllsources += ['${LCGDIR}/jack/lib/libjack.dll']
diff --combined release/io/export_ply.py
@@@ -88,9 -88,9 +88,9 @@@ def write(filename, scene, ob, 
        
        # mesh.transform(ob.matrixWorld) # XXX
        
-       faceUV = len(mesh.uv_layers) > 0
+       faceUV = len(mesh.uv_textures) > 0
        vertexUV = len(mesh.sticky) > 0
-       vertexColors = len(mesh.vcol_layers) > 0
+       vertexColors = len(mesh.vertex_colors) > 0
        
        if (not faceUV) and (not vertexUV):     EXPORT_UV = False
        if not vertexColors:                                    EXPORT_COLORS = False
                
        if faceUV:
                active_uv_layer = None
-               for lay in mesh.uv_layers:
+               for lay in mesh.uv_textures:
                        if lay.active:
                                active_uv_layer= lay.data
                                break
        
        if vertexColors:
                active_col_layer = None
-               for lay in mesh.vcol_layers:
+               for lay in mesh.vertex_colors:
                        if lay.active:
                                active_col_layer= lay.data
                if not active_col_layer:
                        col = active_col_layer[i]
                        col = col.color1, col.color2, col.color3, col.color4
                
-               f_verts= list(f.verts)
-               if not f_verts[3]: f_verts.pop() # XXX face length should be 3/4, not always 4
+               f_verts= f.verts
                
                pf= ply_faces[i]
                for j, vidx in enumerate(f_verts):
  
  class EXPORT_OT_ply(bpy.types.Operator):
        '''
 -      Operator documentatuon text, will be used for the operator tooltip and python docs.
 +      Operator documentation text, will be used for the operator tooltip and python docs.
        '''
        __idname__ = "export.ply"
        __label__ = "Export PLY"
@@@ -2,12 -2,12 +2,12 @@@
  import bpy
  
  class DataButtonsPanel(bpy.types.Panel):
-       __space_type__ = "PROPERTIES"
-       __region_type__ = "WINDOW"
+       __space_type__ = 'PROPERTIES'
+       __region_type__ = 'WINDOW'
        __context__ = "data"
        
        def poll(self, context):
 -              return (context.object and context.object.type == 'EMPTY')
 +              return (context.object.type == 'EMPTY')
        
  class DATA_PT_empty(DataButtonsPanel):
        __label__ = "Empty"
@@@ -17,7 -17,7 +17,7 @@@
                
                ob = context.object
  
-               layout.itemR(ob, "empty_draw_type")
-               layout.itemR(ob, "empty_draw_size")
+               layout.itemR(ob, "empty_draw_type", text="Draw Type")
+               layout.itemR(ob, "empty_draw_size", text="Draw Size")
                
 -bpy.types.register(DATA_PT_empty)
 +bpy.types.register(DATA_PT_empty)
diff --combined release/ui/space_info.py
@@@ -2,13 -2,14 +2,14 @@@
  import bpy
  
  class INFO_HT_header(bpy.types.Header):
-       __space_type__ = "INFO"
+       __space_type__ = 'INFO'
  
        def draw(self, context):
                layout = self.layout
                
                st = context.space_data
-               rd = context.scene.render_data
+               scene = context.scene
+               rd = scene.render_data
  
                row = layout.row(align=True)
                row.template_header()
  
                layout.template_operator_search()
                layout.template_running_jobs()
+               layout.itemL(text=scene.statistics())
                        
  class INFO_MT_file(bpy.types.Menu):
-       __space_type__ = "INFO"
+       __space_type__ = 'INFO'
        __label__ = "File"
  
        def draw(self, context):
                layout.itemO("wm.exit_blender", text="Quit")
  
  class INFO_MT_file_import(bpy.types.Menu):
-       __space_type__ = "INFO"
+       __space_type__ = 'INFO'
        __label__ = "Import"
  
        def draw(self, context):
                layout = self.layout
 -              
 -              layout.itemL(text="Nothing yet")
 +              layout.itemO("import.3ds", text="3DS")
 +              layout.itemO("import.obj", text="OBJ")
  
  class INFO_MT_file_export(bpy.types.Menu):
-       __space_type__ = "INFO"
+       __space_type__ = 'INFO'
        __label__ = "Export"
  
        def draw(self, context):
                layout = self.layout
  
 +              layout.itemO("export.3ds", text="3DS")
 +              layout.itemO("export.fbx", text="FBX")
 +              layout.itemO("export.obj", text="OBJ")
                layout.itemO("export.ply", text="PLY")
 +              layout.itemO("export.x3d", text="X3D")
  
  class INFO_MT_file_external_data(bpy.types.Menu):
-       __space_type__ = "INFO"
+       __space_type__ = 'INFO'
        __label__ = "External Data"
  
        def draw(self, context):
                layout.itemO("file.find_missing_files")
  
  class INFO_MT_add(bpy.types.Menu):
-       __space_type__ = "INFO"
+       __space_type__ = 'INFO'
        __label__ = "Add"
  
        def draw(self, context):
  
                layout.operator_context = "EXEC_SCREEN"
  
-               layout.item_menu_enumO( "OBJECT_OT_mesh_add", "type", text="Mesh", icon='ICON_OUTLINER_OB_MESH')
-               layout.item_menu_enumO( "OBJECT_OT_curve_add", "type", text="Curve", icon='ICON_OUTLINER_OB_CURVE')
-               layout.item_menu_enumO( "OBJECT_OT_surface_add", "type", text="Surface", icon='ICON_OUTLINER_OB_SURFACE')
-               layout.item_menu_enumO( "OBJECT_OT_metaball_add", "type", 'META', icon='ICON_OUTLINER_OB_META')
-               layout.itemO("OBJECT_OT_text_add", text="Text", icon='ICON_OUTLINER_OB_FONT')
+               layout.item_menu_enumO("object.mesh_add", "type", text="Mesh", icon='ICON_OUTLINER_OB_MESH')
+               layout.item_menu_enumO("object.curve_add", "type", text="Curve", icon='ICON_OUTLINER_OB_CURVE')
+               layout.item_menu_enumO("object.surface_add", "type", text="Surface", icon='ICON_OUTLINER_OB_SURFACE')
+               layout.item_menu_enumO("object.metaball_add", "type", 'META', icon='ICON_OUTLINER_OB_META')
+               layout.itemO("object.text_add", text="Text", icon='ICON_OUTLINER_OB_FONT')
  
                layout.itemS()
  
-               layout.itemO("OBJECT_OT_armature_add", text="Armature", icon='ICON_OUTLINER_OB_ARMATURE')
-               layout.item_enumO("OBJECT_OT_object_add", "type", 'LATTICE', icon='ICON_OUTLINER_OB_LATTICE')
-               layout.item_enumO("OBJECT_OT_object_add", "type", 'EMPTY', icon='ICON_OUTLINER_OB_EMPTY')
+               layout.itemO("object.armature_add", text="Armature", icon='ICON_OUTLINER_OB_ARMATURE')
+               layout.item_enumO("object.add", "type", 'LATTICE', icon='ICON_OUTLINER_OB_LATTICE')
+               layout.item_enumO("object.add", "type", 'EMPTY', icon='ICON_OUTLINER_OB_EMPTY')
  
                layout.itemS()
  
-               layout.item_enumO("OBJECT_OT_object_add", "type", 'CAMERA', icon='ICON_OUTLINER_OB_CAMERA')
-               layout.item_enumO("OBJECT_OT_object_add", "type", 'LAMP', icon='ICON_OUTLINER_OB_LAMP')
+               layout.item_enumO("object.add", "type", 'CAMERA', icon='ICON_OUTLINER_OB_CAMERA')
+               layout.item_enumO("object.add", "type", 'LAMP', icon='ICON_OUTLINER_OB_LAMP')
  
  class INFO_MT_game(bpy.types.Menu):
-       __space_type__ = "INFO"
+       __space_type__ = 'INFO'
        __label__ = "Game"
  
        def draw(self, context):
                layout.itemR(gs, "deprecation_warnings")
  
  class INFO_MT_render(bpy.types.Menu):
-       __space_type__ = "INFO"
+       __space_type__ = 'INFO'
        __label__ = "Render"
  
        def draw(self, context):
                layout.itemO("screen.render_view_show")
  
  class INFO_MT_help(bpy.types.Menu):
-       __space_type__ = "INFO"
+       __space_type__ = 'INFO'
        __label__ = "Help"
  
        def draw(self, context):
@@@ -11,6 -11,8 +11,8 @@@ incs += ' #/extern/bullet2/src
  incs += ' #/intern/opennl/extern #/intern/bsp/extern'
  incs += ' ../gpu #/extern/glew/include'
  incs += ' #/intern/smoke/extern'
+ incs += ' #/extern/lzo/minilzo'
+ incs += ' #/extern/lzma'
  incs += ' #/intern/audaspace/intern'
  
  incs += ' ' + env['BF_OPENGL_INC']
@@@ -59,11 -61,8 +61,11 @@@ if env['BF_NO_ELBEEM']
  
  if env['WITH_BF_LCMS']:
        defs.append('WITH_LCMS')
- if env['WITH_BF_UNIT_TEST']:
-       defs.append('WITH_UNIT_TEST')
 +
++# if env['BF_UNIT_TEST']:
++#     defs.append('UNIT_TEST')
        
  if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
      incs += ' ' + env['BF_PTHREADS_INC']
  
- env.BlenderLib ( libname = 'bf_blenkernel', sources = sources, includes = Split(incs), defines = defs, libtype=['core'], priority = [165] )
+ env.BlenderLib ( libname = 'bf_blenkernel', sources = sources, includes = Split(incs), defines = defs, libtype=['core','player'], priority = [166,25] )
  
  #include <time.h>
  
+ #ifdef _WIN32
+ #define open _open
+ #define close _close
+ #endif
  #include "MEM_guardedalloc.h"
  
  #include "IMB_imbuf_types.h"
@@@ -2165,102 -2170,3 +2170,102 @@@ void BKE_image_user_calc_imanr(ImageUse
        }
  }
  
 +/*
 +  Produce image export path.
 +
 +  Fails returning 0 if image filename is empty or if destination path
 +  matches image path (i.e. both are the same file).
 +
 +  Trailing slash in dest_dir is optional.
 +
 +  Logic:
 +
 +  - if an image is "below" current .blend file directory, rebuild the
 +    same dir structure in dest_dir
 +
 +  For example //textures/foo/bar.png becomes
 +  [dest_dir]/textures/foo/bar.png.
 +
 +  - if an image is not "below" current .blend file directory,
 +  disregard it's path and copy it in the same directory where 3D file
 +  goes.
 +
 +  For example //../foo/bar.png becomes [dest_dir]/bar.png.
 +
 +  This logic will help ensure that all image paths are relative and
 +  that a user gets his images in one place. It'll also provide
 +  consistent behaviour across exporters.
 + */
 +int BKE_get_image_export_path(struct Image *im, const char *dest_dir, char *abs, int abs_size, char *rel, int rel_size)
 +{
 +      char path[FILE_MAX];
 +      char dir[FILE_MAX];
 +      char base[FILE_MAX];
 +      char blend_dir[FILE_MAX];       /* directory, where current .blend file resides */
 +      char dest_path[FILE_MAX];
 +      char rel_dir[FILE_MAX];
 +      int len;
 +
 +      if (abs)
 +              abs[0]= 0;
 +
 +      if (rel)
 +              rel[0]= 0;
 +
 +      BLI_split_dirfile_basic(G.sce, blend_dir, NULL);
 +
 +      if (!strlen(im->name)) {
 +              if (G.f & G_DEBUG) printf("Invalid image type.\n");
 +              return 0;
 +      }
 +
 +      BLI_strncpy(path, im->name, sizeof(path));
 +
 +      /* expand "//" in filename and get absolute path */
 +      BLI_convertstringcode(path, G.sce);
 +
 +      /* get the directory part */
 +      BLI_split_dirfile_basic(path, dir, base);
 +
 +      len= strlen(blend_dir);
 +
 +      rel_dir[0] = 0;
 +
 +      /* if image is "below" current .blend file directory */
 +      if (!strncmp(path, blend_dir, len)) {
 +
 +              /* if image is _in_ current .blend file directory */
 +              if (!strcmp(dir, blend_dir)) {
 +                      BLI_join_dirfile(dest_path, dest_dir, base);
 +              }
 +              /* "below" */
 +              else {
 +                      /* rel = image_path_dir - blend_dir */
 +                      BLI_strncpy(rel_dir, dir + len, sizeof(rel_dir));
 +
 +                      BLI_join_dirfile(dest_path, dest_dir, rel_dir);
 +                      BLI_join_dirfile(dest_path, dest_path, base);
 +              }
 +                      
 +      }
 +      /* image is out of current directory */
 +      else {
 +              BLI_join_dirfile(dest_path, dest_dir, base);
 +      }
 +
 +      if (abs)
 +              BLI_strncpy(abs, dest_path, abs_size);
 +
 +      if (rel) {
 +              strncat(rel, rel_dir, rel_size);
 +              strncat(rel, base, rel_size);
 +      }
 +
 +      /* return 2 if src=dest */
 +      if (!strcmp(path, dest_path)) {
 +              if (G.f & G_DEBUG) printf("%s and %s are the same file\n", path, dest_path);
 +              return 2;
 +      }
 +
 +      return 1;
 +}
@@@ -542,8 -542,7 +542,8 @@@ void set_mesh(Object *ob, Mesh *me
        
        if(ob->type==OB_MESH) {
                old= ob->data;
 -              old->id.us--;
 +              if (old) /* to make set_mesh work on objects created with add_only_object, i.e. having ob->data == NULL */
 +                      old->id.us--;
                ob->data= me;
                id_us_plus((ID *)me);
        }
@@@ -978,7 -977,7 +978,7 @@@ void mesh_set_smooth_flag(Object *meshO
                }
        }
  
- // XXX do this in caller      DAG_object_flush_update(scene, meshOb, OB_RECALC_DATA);
+ // XXX do this in caller      DAG_id_flush_update(&me->id, OB_RECALC_DATA);
  }
  
  void mesh_calc_normals(MVert *mverts, int numVerts, MFace *mfaces, int numFaces, float **faceNors_r) 
@@@ -1266,7 -1265,7 +1266,7 @@@ void mesh_pmv_revert(Object *ob, Mesh *
                MEM_freeN(me->pv->vert_map);
                me->pv->vert_map= NULL;
  
- // XXX do this in caller              DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+ // XXX do this in caller              DAG_id_flush_update(&me->id, OB_RECALC_DATA);
        }
  }
  
@@@ -118,7 -118,6 +118,7 @@@ void               EM_select_face(struct EditFace *e
  void          EM_select_face_fgon(struct EditMesh *em, struct EditFace *efa, int val);
  void          EM_select_swap(struct EditMesh *em);
  void          EM_toggle_select_all(struct EditMesh *em);
 +void EM_select_all(struct EditMesh *em);
  void          EM_selectmode_flush(struct EditMesh *em);
  void          EM_deselect_flush(struct EditMesh *em);
  void          EM_selectmode_set(struct EditMesh *em);
@@@ -155,31 -154,26 +155,29 @@@ void            EM_reveal_mesh(struct EditMesh *e
  void          EM_select_by_material(struct EditMesh *em, int index);
  void          EM_deselect_by_material(struct EditMesh *em, int index); 
  
 +/* editmesh_tools.c */
 +void convert_to_triface(struct EditMesh *em, int direction);
 +
  /* editface.c */
  struct MTFace *EM_get_active_mtface(struct EditMesh *em, struct EditFace **act_efa, struct MCol **mcol, int sloppy);
  
- /* editdeform.c XXX rename functions? */
+ /* object_vgroup.c */
  
  #define WEIGHT_REPLACE 1
  #define WEIGHT_ADD 2
  #define WEIGHT_SUBTRACT 3
  
- void          add_defgroup (Object *ob);
- void          create_dverts(struct ID *id);
- float         get_vert_defgroup (Object *ob, struct bDeformGroup *dg, int vertnum);
- void          remove_vert_defgroup (Object *ob, struct bDeformGroup *dg, int vertnum);
- void          remove_verts_defgroup (Object *obedit, int allverts);
- void          vertexgroup_select_by_name(Object *ob, char *name);
- void          add_vert_to_defgroup (Object *ob, struct bDeformGroup *dg, int vertnum, 
-                            float weight, int assignmode);
+ struct bDeformGroup           *ED_vgroup_add(struct Object *ob);
+ struct bDeformGroup           *ED_vgroup_add_name(struct Object *ob, char *name);
+ void                                  ED_vgroup_select_by_name(struct Object *ob, char *name);
+ void                                  ED_vgroup_data_create(struct ID *id);
  
struct bDeformGroup           *add_defgroup_name (Object *ob, char *name);
struct MDeformWeight  *verify_defweight (struct MDeformVert *dv, int defgroup);
struct MDeformWeight  *get_defweight (struct MDeformVert *dv, int defgroup);
void          ED_vgroup_vert_add(struct Object *ob, struct bDeformGroup *dg, int vertnum,  float weight, int assignmode);
void          ED_vgroup_vert_remove(struct Object *ob, struct bDeformGroup *dg, int vertnum);
float         ED_vgroup_vert_weight(struct Object *ob, struct bDeformGroup *dg, int vertnum);
  
+ struct MDeformWeight  *ED_vgroup_weight_verify(struct MDeformVert *dv, int defgroup);
+ struct MDeformWeight  *ED_vgroup_weight_get(struct MDeformVert *dv, int defgroup);
  
  #endif /* ED_MESH_H */
  
@@@ -39,7 -39,7 +39,7 @@@ editmesh_mods.c, UI level access, no ge
  
  #include "MEM_guardedalloc.h"
  
- #include "MTC_matrixops.h"
  
  #include "DNA_mesh_types.h"
  #include "DNA_material_types.h"
@@@ -127,7 -127,7 +127,7 @@@ void EM_automerge(int update
  //            if (len) {
  //                    em->totvert -= len; /* saves doing a countall */
  //                    if (update) {
- //                            DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ //                            DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
  //                    }
  //            }
  //    }
@@@ -807,7 -807,7 +807,7 @@@ static int similar_face_select_exec(bCo
        if (selcount) {
                /* here was an edge-mode only select flush case, has to be generalized */
                EM_selectmode_flush(em);
-               WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+               WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
                BKE_mesh_end_editmesh(me, em);
                return OPERATOR_FINISHED;
        }
@@@ -839,7 -839,7 +839,7 @@@ static EnumPropertyItem prop_simedge_ty
        {0, NULL, 0, NULL, NULL}
  };
  
- static int similar_edge_select__internal(Scene *scene, EditMesh *em, int mode)
+ static int similar_edge_select__internal(ToolSettings *ts, EditMesh *em, int mode)
  {
        EditEdge *eed, *base_eed=NULL;
        unsigned int selcount=0; /* count how many new edges we select*/
        unsigned int deselcount=0;
        
        short ok=0;
-       float thresh= scene->toolsettings->select_thresh;
+       float thresh= ts->select_thresh;
        
        for(eed= em->edges.first; eed; eed= eed->next) {
                if (!eed->h) {
  /* wrap the above function but do selection flushing edge to face */
  static int similar_edge_select_exec(bContext *C, wmOperator *op)
  {
-       Scene *scene= CTX_data_scene(C);
+       ToolSettings *ts= CTX_data_tool_settings(C);
        Object *obedit= CTX_data_edit_object(C);
        Mesh *me= obedit->data;
        EditMesh *em= BKE_mesh_get_editmesh(me); 
  
-       int selcount = similar_edge_select__internal(scene, em, RNA_int_get(op->ptr, "type"));
+       int selcount = similar_edge_select__internal(ts, em, RNA_int_get(op->ptr, "type"));
        
        if (selcount) {
                /* here was an edge-mode only select flush case, has to be generalized */
                EM_selectmode_flush(em);
-               WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+               WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
                BKE_mesh_end_editmesh(me, em);
                return OPERATOR_FINISHED;
        }
@@@ -1081,7 -1081,7 +1081,7 @@@ static EnumPropertyItem prop_simvertex_
  
  static int similar_vert_select_exec(bContext *C, wmOperator *op)
  {
-       Scene *scene= CTX_data_scene(C);
+       ToolSettings *ts= CTX_data_tool_settings(C);
        Object *obedit= CTX_data_edit_object(C);
        Mesh *me= obedit->data;
        EditMesh *em= BKE_mesh_get_editmesh(me); 
        int mode= RNA_enum_get(op->ptr, "type");
        
        short ok=0;
-       float thresh= scene->toolsettings->select_thresh;
+       float thresh= ts->select_thresh;
        
        for(eve= em->verts.first; eve; eve= eve->next) {
                if (!eve->h) {
        } /* end basevert loop */
  
        if(selcount) {
-               WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+               WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
                BKE_mesh_end_editmesh(me, em);
                return OPERATOR_FINISHED;
        }
@@@ -1413,7 -1413,7 +1413,7 @@@ void EM_mesh_copy_edge(EditMesh *em, sh
        }
        
        if (change) {
- //            DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ //            DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
                
        }
  }
@@@ -1541,7 -1541,7 +1541,7 @@@ void EM_mesh_copy_face(EditMesh *em, wm
        }
        
        if (change) {
- //            DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ //            DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
                
        }
  }
@@@ -1671,7 -1671,7 +1671,7 @@@ void EM_mesh_copy_face_layer(EditMesh *
        }
  
        if (change) {
- //            DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ //            DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
                
        }
  }
@@@ -1991,7 -1991,7 +1991,7 @@@ static int loop_multiselect(bContext *C
        MEM_freeN(edarray);
  //    if (EM_texFaceCheck())
        
-       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+       WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
  
        BKE_mesh_end_editmesh(obedit->data, em);
        return OPERATOR_FINISHED;       
@@@ -2060,7 -2060,7 +2060,7 @@@ static void mouse_mesh_loop(bContext *C
                EM_selectmode_flush(em);
  //                    if (EM_texFaceCheck())
                
-               WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, vc.obedit);
+               WM_event_add_notifier(C, NC_GEOM|ND_SELECT, vc.obedit->data);
        }
  }
  
@@@ -2159,9 -2159,8 +2159,8 @@@ static void mouse_mesh_shortest_path(bC
                                break;
                }
                
-               DAG_object_flush_update(vc.scene, vc.obedit, OB_RECALC_DATA);
-       
-               WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, vc.obedit);
+               DAG_id_flush_update(vc.obedit->data, OB_RECALC_DATA);
+               WM_event_add_notifier(C, NC_GEOM|ND_SELECT, vc.obedit->data);
        }
  }
  
@@@ -2261,7 -2260,7 +2260,7 @@@ void mouse_mesh(bContext *C, short mval
                }
        }
  
-       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, vc.obedit);
+       WM_event_add_notifier(C, NC_GEOM|ND_SELECT, vc.obedit->data);
        
  }
  
@@@ -2405,12 -2404,12 +2404,12 @@@ static int select_linked_pick_invoke(bC
        /* return warning! */
        if(limit) {
                int retval= select_linked_limited_invoke(&vc, 0, sel);
-               WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+               WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
                return retval;
        }
        
        if( unified_findnearest(&vc, &eve, &eed, &efa)==0 ) {
-               WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+               WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
        
                return OPERATOR_CANCELLED;
        }
        
  //    if (EM_texFaceCheck())
        
-       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+       WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
        return OPERATOR_FINISHED;       
  }
  
@@@ -2545,7 -2544,7 +2544,7 @@@ static int select_linked_exec(bContext 
        else
                selectconnected_mesh_all(em);
        
-       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+       WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
  
        BKE_mesh_end_editmesh(obedit->data, em);
        return OPERATOR_FINISHED;       
@@@ -2671,7 -2670,7 +2670,7 @@@ void EM_hide_mesh(EditMesh *em, int swa
        em->totedgesel= em->totfacesel= em->totvertsel= 0;
  //    if(EM_texFaceCheck())
  
-       //      DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); 
+       //      DAG_id_flush_update(obedit->data, OB_RECALC_DATA);      
  }
  
  static int hide_mesh_exec(bContext *C, wmOperator *op)
        
        EM_hide_mesh(em, RNA_boolean_get(op->ptr, "unselected"));
                
-       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+       WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
  
        BKE_mesh_end_editmesh(obedit->data, em);
        return OPERATOR_FINISHED;       
@@@ -2738,7 -2737,7 +2737,7 @@@ void EM_reveal_mesh(EditMesh *em
        EM_selectmode_flush(em);
  
  //    if (EM_texFaceCheck())
- //    DAG_object_flush_update(scene, obedit, OB_RECALC_DATA); 
+ //    DAG_id_flush_update(obedit->data, OB_RECALC_DATA);      
  }
  
  static int reveal_mesh_exec(bContext *C, wmOperator *op)
        
        EM_reveal_mesh(em);
  
-       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+       WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
  
        BKE_mesh_end_editmesh(obedit->data, em);
        return OPERATOR_FINISHED;       
@@@ -2798,7 -2797,7 +2797,7 @@@ int select_by_number_vertices_exec(bCon
                }
        }
  
-       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+       WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
        
        return OPERATOR_FINISHED;
  }
@@@ -2924,7 -2923,7 +2923,7 @@@ static int select_sharp_edges_exec(bCon
  
  //    if (EM_texFaceCheck())
        
-       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); //TODO is this needed ?
+       WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data); //TODO is this needed ?
  
        BKE_mesh_end_editmesh(obedit->data, em);
        return OPERATOR_FINISHED;       
@@@ -3092,7 -3091,7 +3091,7 @@@ static int select_linked_flat_faces_exe
        
        select_linked_flat_faces(em, op, RNA_float_get(op->ptr, "sharpness"));
        
-       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+       WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
  
        BKE_mesh_end_editmesh(obedit->data, em);
        return OPERATOR_FINISHED;       
@@@ -3193,7 -3192,7 +3192,7 @@@ static int select_non_manifold_exec(bCo
        
        select_non_manifold(em, op);
        
-       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+       WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
  
        BKE_mesh_end_editmesh(obedit->data, em);
        return OPERATOR_FINISHED;       
@@@ -3257,7 -3256,7 +3256,7 @@@ static int select_inverse_mesh_exec(bCo
        
        EM_select_swap(em);
        
-       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+       WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
  
        BKE_mesh_end_editmesh(obedit->data, em);
        return OPERATOR_FINISHED;       
@@@ -3288,11 -3287,6 +3287,11 @@@ void EM_toggle_select_all(EditMesh *em
                EM_set_flag_all(em, SELECT);
  }
  
 +void EM_select_all(EditMesh *em)
 +{
 +      EM_set_flag_all(em, SELECT);
 +}
 +
  static int toggle_select_all_exec(bContext *C, wmOperator *op)
  {
        Object *obedit= CTX_data_edit_object(C);
        
        EM_toggle_select_all(em);
        
-       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);     
+       WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);      
        BKE_mesh_end_editmesh(obedit->data, em);
  
        return OPERATOR_FINISHED;
@@@ -3371,7 -3365,7 +3370,7 @@@ static int select_more(bContext *C, wmO
  
  //    if (EM_texFaceCheck(em))
  
-       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+       WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
  
        BKE_mesh_end_editmesh(obedit->data, em);
        return OPERATOR_FINISHED;
@@@ -3461,7 -3455,7 +3460,7 @@@ static int select_less(bContext *C, wmO
        EM_select_less(em);
  
  //    if (EM_texFaceCheck(em))
-       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+       WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
  
        BKE_mesh_end_editmesh(obedit->data, em);
        return OPERATOR_FINISHED;
@@@ -3531,7 -3525,7 +3530,7 @@@ static int mesh_select_random_exec(bCon
        
        selectrandom_mesh(em, RNA_float_get(op->ptr,"percent"));
                
-       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+       WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
        
        BKE_mesh_end_editmesh(obedit->data, em);
        return OPERATOR_FINISHED;       
@@@ -3582,7 -3576,7 +3581,7 @@@ void EM_deselect_by_material(EditMesh *
        EM_selectmode_flush(em);
  }
  
- static void mesh_selection_type(Scene *scene, EditMesh *em, int val)
+ static void mesh_selection_type(ToolSettings *ts, EditMesh *em, int val)
  {
        if(val>0) {
                if(val==1) { 
                
                /* note, em stores selectmode to be able to pass it on everywhere without scene,
                   this is only until all select modes and toolsettings are settled more */
-               scene->toolsettings->selectmode= em->selectmode;
+               ts->selectmode= em->selectmode;
  //            if (EM_texFaceCheck())
        }
  }
@@@ -3617,13 -3611,13 +3616,13 @@@ static EnumPropertyItem prop_mesh_edit_
  
  static int mesh_selection_type_exec(bContext *C, wmOperator *op)
  {             
-       
+       ToolSettings *ts= CTX_data_tool_settings(C);
        Object *obedit= CTX_data_edit_object(C);
        EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
  
-       mesh_selection_type(CTX_data_scene(C), em, RNA_enum_get(op->ptr,"type"));
+       mesh_selection_type(ts, em, RNA_enum_get(op->ptr,"type"));
  
-       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+       WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
        
        BKE_mesh_end_editmesh(obedit->data, em);
        return OPERATOR_FINISHED;
@@@ -3653,7 -3647,6 +3652,6 @@@ void MESH_OT_selection_type(wmOperatorT
  
  static int editmesh_mark_seam(bContext *C, wmOperator *op)
  {
-       Scene *scene = CTX_data_scene(C);
        Object *obedit= CTX_data_edit_object(C);
        EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
        Mesh *me= ((Mesh *)obedit->data);
  
        BKE_mesh_end_editmesh(obedit->data, em);
  
-       DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
-       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+       DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+       WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
  
        return OPERATOR_FINISHED;
  }
@@@ -3711,7 -3704,6 +3709,6 @@@ void MESH_OT_mark_seam(wmOperatorType *
  
  static int editmesh_mark_sharp(bContext *C, wmOperator *op)
  {
-       Scene *scene = CTX_data_scene(C);
        Object *obedit= CTX_data_edit_object(C);
        EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
        Mesh *me= ((Mesh *)obedit->data);
  
        BKE_mesh_end_editmesh(obedit->data, em);
  
-       DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
-       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+       DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+       WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
  
        return OPERATOR_FINISHED;
  }
@@@ -3970,7 -3962,7 +3967,7 @@@ void righthandfaces(EditMesh *em, int s
  
        recalc_editnormals(em);
        
- //    DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ //    DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
  
        waitcursor(0);
  }
  
  static int righthandfaces_exec(bContext *C, wmOperator *op)
  {
-       Scene *scene = CTX_data_scene(C);
        Object *obedit= CTX_data_edit_object(C);
        EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
        
        
        BKE_mesh_end_editmesh(obedit->data, em);
  
-       DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
-       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit); //TODO is this needed ?
+       DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+       WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data); //TODO is this needed ?
  
        return OPERATOR_FINISHED;       
  }
@@@ -4190,7 -4181,7 +4186,7 @@@ void editmesh_align_view_to_selected(Ob
  
  static int smooth_vertex(bContext *C, wmOperator *op)
  {
-       Scene *scene= CTX_data_scene(C);
+       ToolSettings *ts= CTX_data_tool_settings(C);
        Object *obedit= CTX_data_edit_object(C);
        EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
        EditVert *eve, *eve_mir = NULL;
                if(eve->f & SELECT) {
                        if(eve->f1) {
                                
-                               if (scene->toolsettings->editbutflag & B_MESH_X_MIRROR) {
+                               if (ts->editbutflag & B_MESH_X_MIRROR) {
                                        eve_mir= editmesh_get_x_mirror_vert(obedit, em, eve->co);
                                }
                                
  
        BKE_mesh_end_editmesh(obedit->data, em);
  
-       DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
-       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+       DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+       WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
  
        return OPERATOR_FINISHED;
  }
@@@ -4354,7 -4345,7 +4350,7 @@@ void MESH_OT_vertices_smooth(wmOperator
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
  
-       RNA_def_int(ot->srna, "repeat", 1, 1, 100, "Number of times to smooth the mesh", "", 1, INT_MAX);
+       RNA_def_int(ot->srna, "repeat", 1, 1, 100, "Smooth Iterations", "", 1, INT_MAX);
  }
  
  void vertexnoise(Object *obedit, EditMesh *em)
        }
  
        recalc_editnormals(em);
- //    DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ //    DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
  
  }
  
@@@ -4455,23 -4446,23 +4451,23 @@@ static void vertices_to_sphere(Scene *s
        }
        
        recalc_editnormals(em);
- //    DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
+ //    DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
  
  }
  
  static int vertices_to_sphere_exec(bContext *C, wmOperator *op)
  {
+       Scene *scene= CTX_data_scene(C);
        Object *obedit= CTX_data_edit_object(C);
        View3D *v3d = CTX_wm_view3d(C);
-       Scene *scene = CTX_data_scene(C);
        EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
        
        vertices_to_sphere(scene, v3d, obedit, em, RNA_float_get(op->ptr,"percent"));
                
        BKE_mesh_end_editmesh(obedit->data, em);
  
-       DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
-       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+       DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+       WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
        
        return OPERATOR_FINISHED;       
  }
@@@ -4480,7 -4471,8 +4476,8 @@@ void MESH_OT_vertices_transform_to_sphe
  {
        /* identifiers */
        ot->name= "Vertices to Sphere";
-       ot->description= "Move selected vertices outward in a spherical shape.";
+       //added "around cursor" to differentiate between "TFM_OT_tosphere()"
+       ot->description= "Move selected vertices outward in a spherical shape around cursor.";
        ot->idname= "MESH_OT_vertices_transform_to_sphere";
        
        /* api callbacks */
@@@ -4516,7 -4508,6 +4513,6 @@@ void flipface(EditMesh *em, EditFace *e
  
  static int flip_normals(bContext *C, wmOperator *op)
  {
-       Scene *scene = CTX_data_scene(C);
        Object *obedit= CTX_data_edit_object(C);
        EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
        EditFace *efa;
  
        BKE_mesh_end_editmesh(obedit->data, em);
  
-       DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
-       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, obedit);
+       DAG_id_flush_update(obedit->data, OB_RECALC_DATA);
+       WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
  
        return OPERATOR_FINISHED;
  }
@@@ -54,7 -54,10 +54,10 @@@ struct FluidsimSettings
  struct ParticleSystem;
  struct DerivedMesh;
  struct SculptSession;
+ struct bGPdata;
  
+ /* Vertex Groups - Name Info */
  typedef struct bDeformGroup {
        struct bDeformGroup *next, *prev;
        char name[32];
@@@ -110,14 -113,16 +113,16 @@@ typedef struct Object 
        struct bPose *pose;     
        void *data;
        
+       struct bGPdata *gpd;    /* Grease Pencil data */
+       
        ListBase constraintChannels; // XXX depreceated... old animation system
        ListBase effect;
        ListBase disp;
        ListBase defbase;
        ListBase modifiers; /* list of ModifierData structures */
  
-       /* For now just a flag for sculpt mode, eventually we make the other modes local too */
-       int mode, pad2;
+       int mode;           /* Local object mode */
+       int restore_mode;   /* Keep track of what mode to return to after toggling a mode */
  
        /* materials */
        struct Material **mat;  /* material slots */
        short recalc;                   /* dependency flag */
        float anisotropicFriction[3];
  
-       ListBase constraints;
+       ListBase constraints;           /* object constraints */
        ListBase nlastrips;                     // XXX depreceated... old animation system
        ListBase hooks;
        ListBase particlesystem;        /* particle systems */
        unsigned int state;                     /* bit masks of game controllers that are active */
        unsigned int init_state;        /* bit masks of initial state as recorded by the users */
  
-       int restore_mode;               /* Keep track of what mode to return to after edit mode exits */
+       int pad2;
  
        ListBase gpulamp;               /* runtime, for lamps only */
 +      ListBase *duplilist;    /* only for internal use by RNA API functions. To get dupli list, use object_duplilist instead */
+       ListBase pc_ids;
  } Object;
  
  /* Warning, this is not used anymore because hooks are now modifiers */
@@@ -258,14 -263,6 +264,14 @@@ typedef struct ObHook 
        float force;
  } ObHook;
  
 +typedef struct DupliObject {
 +      struct DupliObject *next, *prev;
 +      struct Object *ob;
 +      unsigned int origlay;
 +      int index, no_draw, type, animated;
 +      float mat[4][4], omat[4][4];
 +      float orco[3], uv[2];
 +} DupliObject;
  
  /* this work object is defined in object.c */
  extern Object workob;
  #define OB_LOCK_SCALE 448
  
  /* ob->mode */
- #define OB_MODE_OBJECT          0
- #define OB_MODE_EDIT            1
- #define OB_MODE_SCULPT          2
- #define OB_MODE_VERTEX_PAINT    4
- #define OB_MODE_WEIGHT_PAINT    8
- #define OB_MODE_TEXTURE_PAINT  16
- #define OB_MODE_PARTICLE_EDIT  32
- #define OB_MODE_POSE           64
- /* ob->softflag in DNA_object_force.h */
+ typedef enum ObjectMode {
+       OB_MODE_OBJECT = 0,
+       OB_MODE_EDIT = 1,
+       OB_MODE_SCULPT = 2,
+       OB_MODE_VERTEX_PAINT = 4,
+       OB_MODE_WEIGHT_PAINT = 8,
+       OB_MODE_TEXTURE_PAINT = 16,
+       OB_MODE_PARTICLE_EDIT = 32,
+       OB_MODE_POSE = 64
+ } ObjectMode;
  
  #ifdef __cplusplus
  }
@@@ -34,6 -34,9 +34,9 @@@ if not USE_WINE
  if sys.platform != 'cygwin':
        makesdna_tool.Append (CCFLAGS = cflags)
  makesdna_tool.Append (CPPDEFINES = defines)
+ makesdna_tool.Append( CFLAGS = env['CFLAGS'])
+ makesdna_tool.Append( CCFLAGS = env['CCFLAGS'])
+ makesdna_tool.Append( LINKFLAGS = env['PLATFORM_LINKFLAGS'])
  targetdir = normpath(root_build_dir+'/lib')
  
  if not (root_build_dir[0]==os.sep or root_build_dir[1]==':'):
@@@ -61,6 -64,6 +64,6 @@@ if env['OURPLATFORM'] != 'linuxcross'
                else:
                        dna.Command ('dna.c', '', root_build_dir+os.sep+"makesdna $TARGET")
  else:
 -      dna.Command ('dna.c', '', root_build_dir+os.sep+"makesdna.exe $TARGET")
 +      dna.Command ('dna.c', '', 'wine ' + root_build_dir+os.sep+"makesdna.exe $TARGET")
  obj = ['intern/dna.c', 'intern/dna_genfile.c']
  Return ('obj')
@@@ -111,6 -111,10 +111,10 @@@ typedef enum PropertySubType 
  
        /* pointers */
        PROP_NEVER_NULL = 30,
+       /* booleans */
+       PROP_LAYER = 40,
+       PROP_LAYER_MEMBER = 41
  } PropertySubType;
  
  typedef enum PropertyFlag {
        /* pointers */
        PROP_ID_REFCOUNT = 64,
  
-       /* arrays */
-       PROP_DYNAMIC_ARRAY = 32768,
        /* internal flags */
        PROP_BUILTIN = 128,
        PROP_EXPORT = 256,
        PROP_IDPROPERTY = 1024,
        PROP_RAW_ACCESS = 8192,
        PROP_RAW_ARRAY = 16384,
-       PROP_FREE_POINTERS = 32768
+       PROP_FREE_POINTERS = 32768,
 -      PROP_DYNAMIC = 131072 /* for dynamic arrays, and retvals of type string */
++      PROP_DYNAMIC = 131072 /* for dynamic arrays and function retvals of string type */
  } PropertyFlag;
  
  typedef struct CollectionPropertyIterator {
@@@ -178,11 -180,11 +180,11 @@@ typedef struct CollectionPointerLink 
  } CollectionPointerLink;
  
  typedef enum RawPropertyType {
-       PROP_RAW_CHAR,
+       PROP_RAW_INT, // XXX - abused for types that are not set, eg. MFace.verts, needs fixing.
        PROP_RAW_SHORT,
-       PROP_RAW_INT,
-       PROP_RAW_FLOAT,
-       PROP_RAW_DOUBLE
+       PROP_RAW_CHAR,
+       PROP_RAW_DOUBLE,
+       PROP_RAW_FLOAT
  } RawPropertyType;
  
  typedef struct RawArray {
@@@ -306,11 -306,10 +306,10 @@@ static void rna_int_print(FILE *f, int 
  static char *rna_def_property_get_func(FILE *f, StructRNA *srna, PropertyRNA *prop, PropertyDefRNA *dp, const char *manualfunc)
  {
        char *func;
-       int i;
  
        if(prop->flag & PROP_IDPROPERTY)
                return NULL;
-       
        if(!manualfunc) {
                if(!dp->dnastructname || !dp->dnaname) {
                        fprintf(stderr, "rna_def_property_get_func: %s.%s has no valid dna info.\n", srna->identifier, prop->identifier);
                        break;
                }
                default:
-                       if(prop->arraylength) {
-                               fprintf(f, "void %s(PointerRNA *ptr, %s values[%d])\n", func, rna_type_type(prop), prop->arraylength);
+                       if(prop->arraydimension) {
+                               if(prop->flag & PROP_DYNAMIC)
+                                       fprintf(f, "void %s(PointerRNA *ptr, %s values[])\n", func, rna_type_type(prop));
+                               else
+                                       fprintf(f, "void %s(PointerRNA *ptr, %s values[%d])\n", func, rna_type_type(prop), prop->totarraylength);
                                fprintf(f, "{\n");
  
                                if(manualfunc) {
                                else {
                                        rna_print_data_get(f, dp);
  
-                                       for(i=0; i<prop->arraylength; i++) {
-                                               if(dp->dnaarraylength == 1) {
-                                                       if(prop->type == PROP_BOOLEAN && dp->booleanbit)
-                                                               fprintf(f, "    values[%d]= (%s(data->%s & (%d<<%d)) != 0);\n", i, (dp->booleannegative)? "!": "", dp->dnaname, dp->booleanbit, i);
-                                                       else
-                                                               fprintf(f, "    values[%d]= (%s)%s((&data->%s)[%d]);\n", i, rna_type_type(prop), (dp->booleannegative)? "!": "", dp->dnaname, i);
-                                               }
-                                               else {
-                                                       if(prop->type == PROP_BOOLEAN && dp->booleanbit) {
-                                                               fprintf(f, "    values[%d]= (%s(data->%s[%d] & ", i, (dp->booleannegative)? "!": "", dp->dnaname, i);
-                                                               rna_int_print(f, dp->booleanbit);
-                                                               fprintf(f, ") != 0);\n");
-                                                       }
-                                                       else if(rna_color_quantize(prop, dp))
-                                                               fprintf(f, "    values[%d]= (%s)(data->%s[%d]*(1.0f/255.0f));\n", i, rna_type_type(prop), dp->dnaname, i);
-                                                       else if(dp->dnatype)
-                                                               fprintf(f, "    values[%d]= (%s)%s(((%s*)data->%s)[%d]);\n", i, rna_type_type(prop), (dp->booleannegative)? "!": "", dp->dnatype, dp->dnaname, i);
-                                                       else
-                                                               fprintf(f, "    values[%d]= (%s)%s((data->%s)[%d]);\n", i, rna_type_type(prop), (dp->booleannegative)? "!": "", dp->dnaname, i);
+                                       if(prop->flag & PROP_DYNAMIC) {
+                                               char *lenfunc= rna_alloc_function_name(srna->identifier, prop->identifier, "get_length");
+                                               fprintf(f, "    int i, arraylen[RNA_MAX_ARRAY_DIMENSION];\n");
+                                               fprintf(f, "    int len= %s(ptr, arraylen);\n\n", lenfunc);
+                                               fprintf(f, "    for(i=0; i<len; i++) {\n");
+                                               MEM_freeN(lenfunc);
+                                       }
+                                       else {
+                                               fprintf(f, "    int i;\n\n");
+                                               fprintf(f, "    for(i=0; i<%d; i++) {\n", prop->totarraylength);
+                                       }
+                                       if(dp->dnaarraylength == 1) {
+                                               if(prop->type == PROP_BOOLEAN && dp->booleanbit)
+                                                       fprintf(f, "            values[i]= (%s(data->%s & (%d<<i)) != 0);\n", (dp->booleannegative)? "!": "", dp->dnaname, dp->booleanbit);
+                                               else
+                                                       fprintf(f, "            values[i]= (%s)%s((&data->%s)[i]);\n", rna_type_type(prop), (dp->booleannegative)? "!": "", dp->dnaname);
+                                       }
+                                       else {
+                                               if(prop->type == PROP_BOOLEAN && dp->booleanbit) {
+                                                       fprintf(f, "            values[i]= (%s(data->%s[i] & ", (dp->booleannegative)? "!": "", dp->dnaname);
+                                                       rna_int_print(f, dp->booleanbit);
+                                                       fprintf(f, ") != 0);\n");
                                                }
+                                               else if(rna_color_quantize(prop, dp))
+                                                       fprintf(f, "            values[i]= (%s)(data->%s[i]*(1.0f/255.0f));\n", rna_type_type(prop), dp->dnaname);
+                                               else if(dp->dnatype)
+                                                       fprintf(f, "            values[i]= (%s)%s(((%s*)data->%s)[i]);\n", rna_type_type(prop), (dp->booleannegative)? "!": "", dp->dnatype, dp->dnaname);
+                                               else
+                                                       fprintf(f, "            values[i]= (%s)%s((data->%s)[i]);\n", rna_type_type(prop), (dp->booleannegative)? "!": "", dp->dnaname);
                                        }
+                                       fprintf(f, "    }\n");
                                }
                                fprintf(f, "}\n\n");
                        }
        return func;
  }
  
- static void rna_clamp_value(FILE *f, PropertyRNA *prop, int array, int i)
+ static void rna_clamp_value(FILE *f, PropertyRNA *prop, int array)
  {
        if(prop->type == PROP_INT) {
                IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
  
                if(iprop->hardmin != INT_MIN || iprop->hardmax != INT_MAX) {
-                       if(array) fprintf(f, "CLAMPIS(values[%d], ", i);
+                       if(array) fprintf(f, "CLAMPIS(values[i], ");
                        else fprintf(f, "CLAMPIS(value, ");
                        rna_int_print(f, iprop->hardmin); fprintf(f, ", ");
                        rna_int_print(f, iprop->hardmax); fprintf(f, ");\n");
                FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
  
                if(fprop->hardmin != -FLT_MAX || fprop->hardmax != FLT_MAX) {
-                       if(array) fprintf(f, "CLAMPIS(values[%d], ", i);
+                       if(array) fprintf(f, "CLAMPIS(values[i], ");
                        else fprintf(f, "CLAMPIS(value, ");
                        rna_float_print(f, fprop->hardmin); fprintf(f, ", ");
                        rna_float_print(f, fprop->hardmax); fprintf(f, ");\n");
        }
  
        if(array)
-               fprintf(f, "values[%d];\n", i);
+               fprintf(f, "values[i];\n");
        else
                fprintf(f, "value;\n");
  }
  static char *rna_def_property_set_func(FILE *f, StructRNA *srna, PropertyRNA *prop, PropertyDefRNA *dp, char *manualfunc)
  {
        char *func;
-       int i;
  
        if(!(prop->flag & PROP_EDITABLE))
                return NULL;
                        break;
                }
                default:
-                       if(prop->arraylength) {
-                               fprintf(f, "void %s(PointerRNA *ptr, const %s values[%d])\n", func, rna_type_type(prop), prop->arraylength);
+                       if(prop->arraydimension) {
+                               if(prop->flag & PROP_DYNAMIC)
+                                       fprintf(f, "void %s(PointerRNA *ptr, const %s values[])\n", func, rna_type_type(prop));
+                               else
+                                       fprintf(f, "void %s(PointerRNA *ptr, const %s values[%d])\n", func, rna_type_type(prop), prop->totarraylength);
                                fprintf(f, "{\n");
  
                                if(manualfunc) {
                                else {
                                        rna_print_data_get(f, dp);
  
-                                       for(i=0; i<prop->arraylength; i++) {
-                                               if(dp->dnaarraylength == 1) {
-                                                       if(prop->type == PROP_BOOLEAN && dp->booleanbit) {
-                                                               fprintf(f, "    if(%svalues[%d]) data->%s |= (%d<<%d);\n", (dp->booleannegative)? "!": "", i, dp->dnaname, dp->booleanbit, i);
-                                                               fprintf(f, "    else data->%s &= ~(%d<<%d);\n", dp->dnaname, dp->booleanbit, i);
-                                                       }
-                                                       else {
-                                                               fprintf(f, "    (&data->%s)[%d]= %s", dp->dnaname, i, (dp->booleannegative)? "!": "");
-                                                               rna_clamp_value(f, prop, 1, i);
-                                                       }
+                                       if(prop->flag & PROP_DYNAMIC) {
+                                               char *lenfunc= rna_alloc_function_name(srna->identifier, prop->identifier, "set_length");
+                                               fprintf(f, "    int i, arraylen[RNA_MAX_ARRAY_DIMENSION];\n");
+                                               fprintf(f, "    int len= %s(ptr, arraylen);\n\n", lenfunc);
+                                               fprintf(f, "    for(i=0; i<len; i++) {\n");
+                                               MEM_freeN(lenfunc);
+                                       }
+                                       else {
+                                               fprintf(f, "    int i;\n\n");
+                                               fprintf(f, "    for(i=0; i<%d; i++) {\n", prop->totarraylength);
+                                       }
+                                       if(dp->dnaarraylength == 1) {
+                                               if(prop->type == PROP_BOOLEAN && dp->booleanbit) {
+                                                       fprintf(f, "            if(%svalues[i]) data->%s |= (%d<<i);\n", (dp->booleannegative)? "!": "", dp->dnaname, dp->booleanbit);
+                                                       fprintf(f, "            else data->%s &= ~(%d<<i);\n", dp->dnaname, dp->booleanbit);
+                                               }
+                                               else {
+                                                       fprintf(f, "            (&data->%s)[i]= %s", dp->dnaname, (dp->booleannegative)? "!": "");
+                                                       rna_clamp_value(f, prop, 1);
+                                               }
+                                       }
+                                       else {
+                                               if(prop->type == PROP_BOOLEAN && dp->booleanbit) {
+                                                       fprintf(f, "            if(%svalues[i]) data->%s[i] |= ", (dp->booleannegative)? "!": "", dp->dnaname);
+                                                       rna_int_print(f, dp->booleanbit);
+                                                       fprintf(f, ";\n");
+                                                       fprintf(f, "            else data->%s[i] &= ~", dp->dnaname);
+                                                       rna_int_print(f, dp->booleanbit);
+                                                       fprintf(f, ";\n");
+                                               }
+                                               else if(rna_color_quantize(prop, dp)) {
+                                                       fprintf(f, "            data->%s[i]= FTOCHAR(values[i]);\n", dp->dnaname);
                                                }
                                                else {
-                                                       if(prop->type == PROP_BOOLEAN && dp->booleanbit) {
-                                                               fprintf(f, "    if(%svalues[%d]) data->%s[%d] |= ", (dp->booleannegative)? "!": "", i, dp->dnaname, i);
-                                                               rna_int_print(f, dp->booleanbit);
-                                                               fprintf(f, ";\n");
-                                                               fprintf(f, "    else data->%s[%d] &= ~", dp->dnaname, i);
-                                                               rna_int_print(f, dp->booleanbit);
-                                                               fprintf(f, ";\n");
-                                                       }
-                                                       else if(rna_color_quantize(prop, dp)) {
-                                                               fprintf(f, "    data->%s[%d]= FTOCHAR(values[%d]);\n", dp->dnaname, i, i);
-                                                       }
-                                                       else {
-                                                               if(dp->dnatype)
-                                                                       fprintf(f, "    ((%s*)data->%s)[%d]= %s", dp->dnatype, dp->dnaname, i, (dp->booleannegative)? "!": "");
-                                                               else
-                                                                       fprintf(f, "    (data->%s)[%d]= %s", dp->dnaname, i, (dp->booleannegative)? "!": "");
-                                                               rna_clamp_value(f, prop, 1, i);
-                                                       }
+                                                       if(dp->dnatype)
+                                                               fprintf(f, "            ((%s*)data->%s)[i]= %s", dp->dnatype, dp->dnaname, (dp->booleannegative)? "!": "");
+                                                       else
+                                                               fprintf(f, "            (data->%s)[i]= %s", dp->dnaname, (dp->booleannegative)? "!": "");
+                                                       rna_clamp_value(f, prop, 1);
                                                }
                                        }
+                                       fprintf(f, "    }\n");
                                }
                                fprintf(f, "}\n\n");
                        }
                                        }
                                        else {
                                                fprintf(f, "    data->%s= %s", dp->dnaname, (dp->booleannegative)? "!": "");
-                                               rna_clamp_value(f, prop, 0, 0);
+                                               rna_clamp_value(f, prop, 0);
                                        }
                                }
                                fprintf(f, "}\n\n");
@@@ -819,7 -845,7 +845,7 @@@ static void rna_def_property_funcs(FIL
                case PROP_BOOLEAN: {
                        BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
  
-                       if(!prop->arraylength) {
+                       if(!prop->arraydimension) {
                                if(!bprop->get && !bprop->set && !dp->booleanbit)
                                        rna_set_raw_property(dp, prop);
  
                case PROP_INT: {
                        IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
  
-                       if(!prop->arraylength) {
+                       if(!prop->arraydimension) {
                                if(!iprop->get && !iprop->set)
                                        rna_set_raw_property(dp, prop);
  
                case PROP_FLOAT: {
                        FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
  
-                       if(!prop->arraylength) {
+                       if(!prop->arraydimension) {
                                if(!fprop->get && !fprop->set)
                                        rna_set_raw_property(dp, prop);
  
@@@ -953,23 -979,23 +979,23 @@@ static void rna_def_property_funcs_head
        switch(prop->type) {
                case PROP_BOOLEAN:
                case PROP_INT: {
-                       if(!prop->arraylength) {
+                       if(!prop->arraydimension) {
                                fprintf(f, "int %sget(PointerRNA *ptr);\n", func);
                                //fprintf(f, "void %sset(PointerRNA *ptr, int value);\n", func);
                        }
                        else {
-                               fprintf(f, "void %sget(PointerRNA *ptr, int values[%d]);\n", func, prop->arraylength);
+                               fprintf(f, "void %sget(PointerRNA *ptr, int values[%d]);\n", func, prop->totarraylength);
                                //fprintf(f, "void %sset(PointerRNA *ptr, const int values[%d]);\n", func, prop->arraylength);
                        }
                        break;
                }
                case PROP_FLOAT: {
-                       if(!prop->arraylength) {
+                       if(!prop->arraydimension) {
                                fprintf(f, "float %sget(PointerRNA *ptr);\n", func);
                                //fprintf(f, "void %sset(PointerRNA *ptr, float value);\n", func);
                        }
                        else {
-                               fprintf(f, "void %sget(PointerRNA *ptr, float values[%d]);\n", func, prop->arraylength);
+                               fprintf(f, "void %sget(PointerRNA *ptr, float values[%d]);\n", func, prop->totarraylength);
                                //fprintf(f, "void %sset(PointerRNA *ptr, const float values[%d]);\n", func, prop->arraylength);
                        }
                        break;
@@@ -1043,24 -1069,24 +1069,24 @@@ static void rna_def_property_funcs_head
  
        switch(prop->type) {
                case PROP_BOOLEAN: {
-                       if(!prop->arraylength)
+                       if(!prop->arraydimension)
                                fprintf(f, "\tbool %s(void);", prop->identifier);
                        else
-                               fprintf(f, "\tArray<int, %d> %s(void);", prop->arraylength, prop->identifier);
+                               fprintf(f, "\tArray<int, %d> %s(void);", prop->totarraylength, prop->identifier);
                        break;
                }
                case PROP_INT: {
-                       if(!prop->arraylength)
+                       if(!prop->arraydimension)
                                fprintf(f, "\tint %s(void);", prop->identifier);
                        else
-                               fprintf(f, "\tArray<int, %d> %s(void);", prop->arraylength, prop->identifier);
+                               fprintf(f, "\tArray<int, %d> %s(void);", prop->totarraylength, prop->identifier);
                        break;
                }
                case PROP_FLOAT: {
-                       if(!prop->arraylength)
+                       if(!prop->arraydimension)
                                fprintf(f, "\tfloat %s(void);", prop->identifier);
                        else
-                               fprintf(f, "\tArray<float, %d> %s(void);", prop->arraylength, prop->identifier);
+                               fprintf(f, "\tArray<float, %d> %s(void);", prop->totarraylength, prop->identifier);
                        break;
                }
                case PROP_ENUM: {
@@@ -1118,24 -1144,24 +1144,24 @@@ static void rna_def_property_funcs_impl
  
        switch(prop->type) {
                case PROP_BOOLEAN: {
-                       if(!prop->arraylength)
+                       if(!prop->arraydimension)
                                fprintf(f, "\tBOOLEAN_PROPERTY(%s, %s)", srna->identifier, prop->identifier);
                        else
-                               fprintf(f, "\tBOOLEAN_ARRAY_PROPERTY(%s, %d, %s)", srna->identifier, prop->arraylength, prop->identifier);
+                               fprintf(f, "\tBOOLEAN_ARRAY_PROPERTY(%s, %d, %s)", srna->identifier, prop->totarraylength, prop->identifier);
                        break;
                }
                case PROP_INT: {
-                       if(!prop->arraylength)
+                       if(!prop->arraydimension)
                                fprintf(f, "\tINT_PROPERTY(%s, %s)", srna->identifier, prop->identifier);
                        else
-                               fprintf(f, "\tINT_ARRAY_PROPERTY(%s, %d, %s)", srna->identifier, prop->arraylength, prop->identifier);
+                               fprintf(f, "\tINT_ARRAY_PROPERTY(%s, %d, %s)", srna->identifier, prop->totarraylength, prop->identifier);
                        break;
                }
                case PROP_FLOAT: {
-                       if(!prop->arraylength)
+                       if(!prop->arraydimension)
                                fprintf(f, "\tFLOAT_PROPERTY(%s, %s)", srna->identifier, prop->identifier);
                        else
-                               fprintf(f, "\tFLOAT_ARRAY_PROPERTY(%s, %d, %s)", srna->identifier, prop->arraylength, prop->identifier);
+                               fprintf(f, "\tFLOAT_ARRAY_PROPERTY(%s, %d, %s)", srna->identifier, prop->totarraylength, prop->identifier);
                        break;
                }
                case PROP_ENUM: {
@@@ -1198,14 -1224,19 +1224,20 @@@ static void rna_def_function_funcs(FIL
  
        dparm= dfunc->cont.properties.first;
        for(; dparm; dparm= dparm->next) {
-               ptrstr= (dparm->prop->type == PROP_POINTER || dparm->prop->arraylength > 0)? "*" : "";
+               if(dparm->prop->arraydimension)
+                       ptrstr= "*";
+               else if(dparm->prop==func->ret)
+                       ptrstr= ((dparm->prop->type == PROP_POINTER) && !(dparm->prop->flag & PROP_RNAPTR))? "*": "";
+               else
+                       ptrstr= (dparm->prop->type == PROP_POINTER)? "*": "";
+                        
                fprintf(f, "\t%s%s %s%s;\n", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), ptrstr, dparm->prop->identifier);
        }
  
        fprintf(f, "\tchar *_data");
        if(func->ret) fprintf(f, ", *_retdata");
        fprintf(f, ";\n");
-       if(func->ret && (func->ret->flag & PROP_DYNAMIC_ARRAY)) fprintf(f, "\tint _ret_array_length;\n");
++      if(func->ret && (func->ret->flag & PROP_DYNAMIC)) fprintf(f, "\tint _ret_array_length;\n");
        fprintf(f, "\t\n");
  
        /* assign self */
        for(; dparm; dparm= dparm->next) {
                if(dparm->prop==func->ret) 
                        fprintf(f, "\t_retdata= _data;\n");
-               else if(dparm->prop->arraylength)
+               else if(dparm->prop->arraydimension)
                        fprintf(f, "\t%s= ((%s%s*)_data);\n", dparm->prop->identifier, rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop));
                else if(dparm->prop->type == PROP_POINTER) {
                        if(dparm->prop->flag & PROP_RNAPTR)
                        fprintf(f, "reports");
                }
  
-               if(func->ret && (func->ret->flag & PROP_DYNAMIC_ARRAY)) {
++              if(func->ret && (func->ret->flag & PROP_DYNAMIC)) {
 +                      if(!first) fprintf(f, ", ");
 +                      first= 0;
 +                      fprintf(f, "&_ret_array_length");
 +              }
 +
                dparm= dfunc->cont.properties.first;
                for(; dparm; dparm= dparm->next) {
                        if(dparm->prop==func->ret)
  
                if(func->ret) {
                        dparm= rna_find_parameter_def(func->ret);
-                       ptrstr= dparm->prop->type == PROP_POINTER || dparm->prop->arraylength > 0 ? "*" : "";
+                       ptrstr= (((dparm->prop->type == PROP_POINTER) && !(dparm->prop->flag & PROP_RNAPTR)) || (dparm->prop->arraydimension))? "*": "";
                        fprintf(f, "\t*((%s%s%s*)_retdata)= %s;\n", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), ptrstr, func->ret->identifier);
-                       if(func->ret && (func->ret->flag & PROP_DYNAMIC_ARRAY)) {
-                               fprintf(f, "\t_parms->func->ret->arraylength= _ret_array_length;\n");
 +
++                      if(func->ret && (func->ret->flag & PROP_DYNAMIC)) {
++                              fprintf(f, "\t_parms->func->ret->arraylength[0]= _ret_array_length;\n");
++                              fprintf(f, "\t_parms->func->ret->totarraylength= _ret_array_length;\n");
++                              fprintf(f, "\t_parms->func->ret->arraydimension= 1;\n");
 +                      }
                }
        }
  
@@@ -1399,6 -1420,8 +1433,8 @@@ static const char *rna_property_subtype
                case PROP_XYZ: return "PROP_XYZ";
                case PROP_RGB: return "PROP_RGB";
                case PROP_NEVER_NULL: return "PROP_NEVER_NULL";
+               case PROP_LAYER: return "PROP_LAYER";
+               case PROP_LAYER_MEMBER: return "PROP_LAYER_MEMBER";
                default: {
                        /* incase we dont have a type preset that includes the subtype */
                        if(RNA_SUBTYPE_UNIT(type)) {
@@@ -1525,9 -1548,9 +1561,9 @@@ static void rna_generate_static_paramet
        /* return type */
        for(dparm= dfunc->cont.properties.first; dparm; dparm= dparm->next) {
                if(dparm->prop==func->ret) {
-                       if(dparm->prop->arraylength && !(dparm->prop->flag & PROP_DYNAMIC_ARRAY))
-                               fprintf(f, "\"XXX array return types only allowed with PROP_DYNAMIC_ARRAY flag.\""); /* XXX not supported */
-                       else if(dparm->prop->type == PROP_POINTER || (dparm->prop->flag & PROP_DYNAMIC_ARRAY))
+                       if(dparm->prop->arraydimension)
+                               fprintf(f, "XXX no array return types yet"); /* XXX not supported */
+                       else if(dparm->prop->type == PROP_POINTER && !(dparm->prop->flag & PROP_RNAPTR))
                                fprintf(f, "%s%s *", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop));
                        else
                                fprintf(f, "%s%s ", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop));
                fprintf(f, "ReportList *reports");
        }
  
-       if(func->ret && (func->ret->flag & PROP_DYNAMIC_ARRAY)) {
 +      /* dynamic array length paramter */
++      if(func->ret && (func->ret->flag & PROP_DYNAMIC)) {
 +              if(!first) fprintf(f, ", ");
 +              first= 0;
 +              fprintf(f, "int *array_length");
 +      }
 +
        /* defined parameters */
        for(dparm= dfunc->cont.properties.first; dparm; dparm= dparm->next) {
                if(dparm->prop==func->ret)
                if(!first) fprintf(f, ", ");
                first= 0;
  
-               if(dparm->prop->arraylength)
-                       fprintf(f, "%s%s %s[%d]", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), dparm->prop->identifier, dparm->prop->arraylength);
+               if(dparm->prop->arraydimension)
+                       fprintf(f, "%s%s %s[%d]", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), dparm->prop->identifier, dparm->prop->totarraylength);
                else if(dparm->prop->type == PROP_POINTER)
                        fprintf(f, "%s%s *%s", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), dparm->prop->identifier);
                else
@@@ -1663,15 -1679,15 +1699,15 @@@ static void rna_generate_property(FILE 
                                BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
                                unsigned int i;
  
-                               if(prop->arraylength) {
-                                       fprintf(f, "static int rna_%s%s_%s_default[%d] = {", srna->identifier, strnest, prop->identifier, prop->arraylength);
+                               if(prop->arraydimension && prop->totarraylength) {
+                                       fprintf(f, "static int rna_%s%s_%s_default[%d] = {", srna->identifier, strnest, prop->identifier, prop->totarraylength);
  
-                                       for(i=0; i<prop->arraylength; i++) {
+                                       for(i=0; i<prop->totarraylength; i++) {
                                                if(bprop->defaultarray)
                                                        fprintf(f, "%d", bprop->defaultarray[i]);
                                                else
                                                        fprintf(f, "%d", bprop->defaultvalue);
-                                               if(i != prop->arraylength-1)
+                                               if(i != prop->totarraylength-1)
                                                        fprintf(f, ", ");
                                        }
  
                                IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
                                unsigned int i;
  
-                               if(prop->arraylength) {
-                                       fprintf(f, "static int rna_%s%s_%s_default[%d] = {", srna->identifier, strnest, prop->identifier, prop->arraylength);
+                               if(prop->arraydimension && prop->totarraylength) {
+                                       fprintf(f, "static int rna_%s%s_%s_default[%d] = {", srna->identifier, strnest, prop->identifier, prop->totarraylength);
  
-                                       for(i=0; i<prop->arraylength; i++) {
+                                       for(i=0; i<prop->totarraylength; i++) {
                                                if(iprop->defaultarray)
                                                        fprintf(f, "%d", iprop->defaultarray[i]);
                                                else
                                                        fprintf(f, "%d", iprop->defaultvalue);
-                                               if(i != prop->arraylength-1)
+                                               if(i != prop->totarraylength-1)
                                                        fprintf(f, ", ");
                                        }
  
                                FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
                                unsigned int i;
  
-                               if(prop->arraylength) {
-                                       fprintf(f, "static float rna_%s%s_%s_default[%d] = {", srna->identifier, strnest, prop->identifier, prop->arraylength);
+                               if(prop->arraydimension && prop->totarraylength) {
+                                       fprintf(f, "static float rna_%s%s_%s_default[%d] = {", srna->identifier, strnest, prop->identifier, prop->totarraylength);
  
-                                       for(i=0; i<prop->arraylength; i++) {
+                                       for(i=0; i<prop->totarraylength; i++) {
                                                if(fprop->defaultarray)
                                                        rna_float_print(f, fprop->defaultarray[i]);
                                                else
                                                        rna_float_print(f, fprop->defaultvalue);
-                                               if(i != prop->arraylength-1)
+                                               if(i != prop->totarraylength-1)
                                                        fprintf(f, ", ");
                                        }
  
        rna_print_c_string(f, prop->name); fprintf(f, ",\n\t");
        rna_print_c_string(f, prop->description); fprintf(f, ",\n\t");
        fprintf(f, "%d,\n", prop->icon);
-       fprintf(f, "\t%s, %s|%s, %d,\n", rna_property_typename(prop->type), rna_property_subtypename(prop->subtype), rna_property_subtype_unit(prop->subtype), prop->arraylength);
+       fprintf(f, "\t%s, %s|%s, %s, %d, {%d, %d, %d}, %d,\n", rna_property_typename(prop->type), rna_property_subtypename(prop->subtype), rna_property_subtype_unit(prop->subtype), rna_function_string(prop->getlength), prop->arraydimension, prop->arraylength[0], prop->arraylength[1], prop->arraylength[2], prop->totarraylength);
        fprintf(f, "\t%s, %d, %s,\n", rna_function_string(prop->update), prop->noteflag, rna_function_string(prop->editable));
  
        if(prop->flag & PROP_RAW_ACCESS) rna_set_raw_offset(f, srna, prop);
                        case PROP_BOOLEAN: {
                                BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
                                fprintf(f, "\t%s, %s, %s, %s, %d, ", rna_function_string(bprop->get), rna_function_string(bprop->set), rna_function_string(bprop->getarray), rna_function_string(bprop->setarray), bprop->defaultvalue);
-                               if(prop->arraylength) fprintf(f, "rna_%s%s_%s_default\n", srna->identifier, strnest, prop->identifier);
+                               if(prop->arraydimension && prop->totarraylength) fprintf(f, "rna_%s%s_%s_default\n", srna->identifier, strnest, prop->identifier);
                                else fprintf(f, "NULL\n");
                                break;
                        }
                                rna_int_print(f, iprop->hardmax); fprintf(f, ", ");
                                rna_int_print(f, iprop->step); fprintf(f, ", ");
                                rna_int_print(f, iprop->defaultvalue); fprintf(f, ", ");
-                               if(prop->arraylength) fprintf(f, "rna_%s%s_%s_default\n", srna->identifier, strnest, prop->identifier);
+                               if(prop->arraydimension && prop->totarraylength) fprintf(f, "rna_%s%s_%s_default\n", srna->identifier, strnest, prop->identifier);
                                else fprintf(f, "NULL\n");
                                break;
                         }
                                rna_float_print(f, fprop->step); fprintf(f, ", ");
                                rna_int_print(f, (int)fprop->precision); fprintf(f, ", ");
                                rna_float_print(f, fprop->defaultvalue); fprintf(f, ", ");
-                               if(prop->arraylength) fprintf(f, "rna_%s%s_%s_default\n", srna->identifier, strnest, prop->identifier);
+                               if(prop->arraydimension && prop->totarraylength) fprintf(f, "rna_%s%s_%s_default\n", srna->identifier, strnest, prop->identifier);
                                else fprintf(f, "NULL\n");
                                break;
                         }
@@@ -1953,8 -1969,8 +1989,8 @@@ RNAProcessItem PROCESS_ITEMS[]= 
        {"rna_rna.c", NULL, RNA_def_rna},
        {"rna_ID.c", NULL, RNA_def_ID},
        {"rna_texture.c", NULL, RNA_def_texture},
 -      {"rna_action.c", NULL, RNA_def_action},
 +      {"rna_action.c", "rna_action_api.c", RNA_def_action},
-       {"rna_animation.c", NULL, RNA_def_animation},
+       {"rna_animation.c", "rna_animation_api.c", RNA_def_animation},
        {"rna_actuator.c", NULL, RNA_def_actuator},
        {"rna_armature.c", NULL, RNA_def_armature},
        {"rna_boid.c", NULL, RNA_def_boid},
        {"rna_curve.c", NULL, RNA_def_curve},
        {"rna_fcurve.c", NULL, RNA_def_fcurve},
        {"rna_fluidsim.c", NULL, RNA_def_fluidsim},
+       {"rna_gpencil.c", NULL, RNA_def_gpencil},
        {"rna_group.c", NULL, RNA_def_group},
 -      {"rna_image.c", NULL, RNA_def_image},
 +      {"rna_image.c", "rna_image_api.c", RNA_def_image},
        {"rna_key.c", NULL, RNA_def_key},
        {"rna_lamp.c", NULL, RNA_def_lamp},
        {"rna_lattice.c", NULL, RNA_def_lattice},
        {"rna_main.c", "rna_main_api.c", RNA_def_main},
 -      {"rna_material.c", NULL, RNA_def_material},
 +      {"rna_material.c", "rna_material_api.c", RNA_def_material},
        {"rna_mesh.c", "rna_mesh_api.c", RNA_def_mesh},
        {"rna_meta.c", NULL, RNA_def_meta},
        {"rna_modifier.c", NULL, RNA_def_modifier},
        {"rna_object_force.c", NULL, RNA_def_object_force},
        {"rna_packedfile.c", NULL, RNA_def_packedfile},
        {"rna_particle.c", NULL, RNA_def_particle},
 -      {"rna_pose.c", NULL, RNA_def_pose},
 +      {"rna_pose.c", "rna_pose_api.c", RNA_def_pose},
        {"rna_property.c", NULL, RNA_def_gameproperty},
        {"rna_render.c", NULL, RNA_def_render},
        {"rna_scene.c", "rna_scene_api.c", RNA_def_scene},
        {"rna_sequence.c", NULL, RNA_def_sequence},
        {"rna_smoke.c", NULL, RNA_def_smoke},
        {"rna_space.c", NULL, RNA_def_space},
+       {"rna_test.c", NULL, RNA_def_test},
        {"rna_text.c", NULL, RNA_def_text},
        {"rna_timeline.c", NULL, RNA_def_timeline_marker},
        {"rna_sound.c", NULL, RNA_def_sound},
@@@ -42,15 -42,15 +42,15 @@@ void rna_def_action_group(BlenderRNA *b
  {
        StructRNA *srna;
        PropertyRNA *prop;
+       
        srna= RNA_def_struct(brna, "ActionGroup", NULL);
        RNA_def_struct_sdna(srna, "bActionGroup");
        RNA_def_struct_ui_text(srna, "Action Group", "Groups of F-Curves.");
+       
        prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
        RNA_def_property_ui_text(prop, "Name", "");
        RNA_def_struct_name_property(srna, prop);
+       
        /* dna warns not to treat the Action Channel listbase in the Action Group struct like a
           normal listbase. I'll leave this here but comment out, for Joshua to review. He can 
           probably shed some more light on why this is */
        RNA_def_property_collection_sdna(prop, NULL, "channels", NULL);
        RNA_def_property_struct_type(prop, "FCurve");
        RNA_def_property_ui_text(prop, "Channels", "F-Curves in this group.");*/
+       
        prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", AGRP_SELECTED);
        RNA_def_property_ui_text(prop, "Selected", "Action Group is selected.");
+       
        prop= RNA_def_property(srna, "locked", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", AGRP_PROTECTED);
        RNA_def_property_ui_text(prop, "Locked", "Action Group is locked.");
+       
        prop= RNA_def_property(srna, "expanded", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", AGRP_EXPANDED);
        RNA_def_property_ui_text(prop, "Expanded", "Action Group is expanded.");
+       
        prop= RNA_def_property(srna, "custom_color", PROP_INT, PROP_NONE);
        RNA_def_property_int_sdna(prop, NULL, "customCol");
        RNA_def_property_ui_text(prop, "Custom Color", "Index of custom color set.");
@@@ -85,23 -85,21 +85,23 @@@ void rna_def_action(BlenderRNA *brna
        RNA_def_struct_sdna(srna, "bAction");
        RNA_def_struct_ui_text(srna, "Action", "A collection of F-Curves for animation.");
        RNA_def_struct_ui_icon(srna, ICON_ACTION);
+       
        prop= RNA_def_property(srna, "fcurves", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_collection_sdna(prop, NULL, "curves", NULL);
        RNA_def_property_struct_type(prop, "FCurve");
        RNA_def_property_ui_text(prop, "F-Curves", "The individual F-Curves that make up the Action.");
+       
        prop= RNA_def_property(srna, "groups", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_collection_sdna(prop, NULL, "groups", NULL);
        RNA_def_property_struct_type(prop, "ActionGroup");
        RNA_def_property_ui_text(prop, "Groups", "Convenient groupings of F-Curves.");
+       
        prop= RNA_def_property(srna, "pose_markers", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_collection_sdna(prop, NULL, "markers", NULL);
        RNA_def_property_struct_type(prop, "TimelineMarker");
        RNA_def_property_ui_text(prop, "Pose Markers", "Markers specific to this Action, for labeling poses.");
 +
 +      RNA_api_action(srna);
  }
  
  /* --------- */
index 11efa6d,0000000..35c6c92
mode 100644,000000..100644
--- /dev/null
@@@ -1,75 -1,0 +1,82 @@@
-       RNA_def_property_flag(parm, PROP_DYNAMIC_ARRAY);
 +/**
++ * $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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 + *
 + * The Original Code is Copyright (C) 2009 Blender Foundation.
 + * All rights reserved.
 + *
 + * 
 + * Contributor(s): Blender Foundation
 + *
 + * ***** END GPL LICENSE BLOCK *****
 + */
 +
 +#include <stdlib.h>
 +#include <stdio.h>
 +#include <string.h>
 +#include <time.h>
 +
 +#include "RNA_define.h"
 +#include "RNA_types.h"
 +
 +#include "DNA_action_types.h"
 +
 +#ifdef RNA_RUNTIME
 +
 +#include "BKE_action.h"
 +
 +#include "DNA_anim_types.h"
 +#include "DNA_curve_types.h"
 +
++/* TODO bring back once array return types are allowed */
++#if 0
 +/* return frame range of all curves (min, max) or (0, 1) if there are no keys */
 +int *rna_Action_get_frame_range(bAction *act, int *ret_length)
 +{
 +      int *ret;
 +      float start, end;
 +
 +      calc_action_range(act, &start, &end, 1);
 +
 +      *ret_length= 2;
 +      ret= MEM_callocN(*ret_length * sizeof(int), "rna_Action_get_frame_range");
 +
 +      ret[0]= (int)start;
 +      ret[1]= (int)end;
 +      
 +      return ret;
 +}
++#endif
 +
 +#else
 +
 +void RNA_api_action(StructRNA *srna)
 +{
 +      FunctionRNA *func;
 +      PropertyRNA *parm;
 +
++#if 0
 +      func= RNA_def_function(srna, "get_frame_range", "rna_Action_get_frame_range");
 +      RNA_def_function_ui_description(func, "Get action frame range as a (min, max) tuple.");
 +      parm= RNA_def_int_array(func, "frame_range", 1, NULL, 0, 0, "", "Action frame range.", 0, 0);
++      RNA_def_property_flag(parm, PROP_DYNAMIC);
 +      RNA_def_function_return(func, parm);
++#endif
 +}
 +
 +#endif
index 0000000,6af8733..7764c39
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,89 +1,89 @@@
 - * $Id:
+ /**
++ * $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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+  *
+  * The Original Code is Copyright (C) 2009 Blender Foundation.
+  * All rights reserved.
+  *
+  * 
+  * Contributor(s): Joshua Leung
+  *
+  * ***** END GPL LICENSE BLOCK *****
+  */
+ #include <stdlib.h>
+ #include <stdio.h>
+ #include "RNA_define.h"
+ #include "RNA_enum_types.h"
+ #include "RNA_types.h"
+ #include "DNA_anim_types.h"
+ #include "DNA_object_types.h"
+ #include "DNA_scene_types.h"
+ #ifdef RNA_RUNTIME
+ #include "BKE_animsys.h"
+ static void rna_KeyingSet_add_destination(KeyingSet *keyingset, ReportList *reports, 
+               ID *id, char rna_path[], int array_index, int entire_array,
+               int grouping_method, char group_name[])
+ {
+       short flag = 0;
+       
+       /* validate flags */
+       if (entire_array)
+               flag |= KSP_FLAG_WHOLE_ARRAY;
+       
+       /* if data is valid, call the API function for this */
+       if (keyingset) {
+               BKE_keyingset_add_destination(keyingset, id, group_name, rna_path, array_index, flag, grouping_method);
+       }
+       else {
+               BKE_report(reports, RPT_ERROR, "Keying Set Destination could not be added.");
+       }
+ }
+ #else
+ void RNA_api_keyingset(StructRNA *srna)
+ {
+       FunctionRNA *func;
+       PropertyRNA *parm;
+       
+       /* Add Destination */
+       func= RNA_def_function(srna, "add_destination", "rna_KeyingSet_add_destination");
+       RNA_def_function_ui_description(func, "Add a new destination for the Keying Set.");
+       RNA_def_function_flag(func, FUNC_USE_REPORTS);
+               /* ID-block for target */
+       parm= RNA_def_pointer(func, "target_id", "ID", "Target ID", "ID-Datablock for the destination."); 
+               RNA_def_property_flag(parm, PROP_REQUIRED);
+               /* rna-path */
+       parm= RNA_def_string(func, "rna_path", "", 256, "RNA-Path", "RNA-Path to destination property."); // xxx hopefully this is long enough
+               RNA_def_property_flag(parm, PROP_REQUIRED);
+       parm=RNA_def_int(func, "array_index", 0, 0, INT_MAX, "Array Index", "If applicable, the index ", 0, INT_MAX);
+               /* flags */
+       parm=RNA_def_boolean(func, "entire_array", 1, "Entire Array", "When an 'array/vector' type is chosen (Location, Rotation, Color, etc.), entire array is to be used.");
+               /* grouping */
+       parm=RNA_def_enum(func, "grouping_method", keyingset_path_grouping_items, KSP_GROUP_KSNAME, "Grouping Method", "Method used to define which Group-name to use.");
+       parm=RNA_def_string(func, "group_name", "", 64, "Group Name", "Name of Action Group to assign destination to (only if grouping mode is to use this name).");
+ }
+ #endif
  
  static void rna_Armature_update_data(bContext *C, PointerRNA *ptr)
  {
-       Main *bmain= CTX_data_main(C);
-       Scene *scene= CTX_data_scene(C);
        ID *id= ptr->id.data;
-       Object *ob;
  
-       for(ob=bmain->object.first; ob; ob= ob->id.next) {
-               if(ob->data == id) {
-                       /* XXX this will loop over all objects again (slow) */
-                       DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
-                       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, ob);
-               }
-       }
+       DAG_id_flush_update(id, OB_RECALC_DATA);
+       WM_event_add_notifier(C, NC_GEOM|ND_DATA, id);
  }
  
  static void rna_Armature_redraw_data(bContext *C, PointerRNA *ptr)
  {
-       Main *bmain= CTX_data_main(C);
        ID *id= ptr->id.data;
-       Object *ob;
  
-       for(ob=bmain->object.first; ob; ob= ob->id.next)
-               if(ob->data == id)
-                       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, ob);
+       WM_event_add_notifier(C, NC_GEOM|ND_DATA, id);
  }
  
  static void rna_bone_layer_set(short *layer, const int *values)
@@@ -337,7 -325,7 +325,7 @@@ static void rna_def_bone_common(StructR
        RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
  
        /* flags */
-       prop= RNA_def_property(srna, "layer", PROP_BOOLEAN, PROP_NONE);
+       prop= RNA_def_property(srna, "layer", PROP_BOOLEAN, PROP_LAYER_MEMBER);
        RNA_def_property_boolean_sdna(prop, NULL, "layer", 1);
        RNA_def_property_array(prop, 16);
        if(editbone) RNA_def_property_boolean_funcs(prop, "rna_EditBone_layer_get", "rna_EditBone_layer_set");
@@@ -459,7 -447,7 +447,7 @@@ static void rna_def_bone(BlenderRNA *br
  
        rna_def_bone_common(srna, 0);
  
 -              // XXX should we define this in PoseChannel wrapping code instead? but PoseChannels directly get some of their flags from here...
 +      // XXX should we define this in PoseChannel wrapping code instead? but PoseChannels directly get some of their flags from here...
        prop= RNA_def_property(srna, "hidden", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_HIDDEN_P);
        RNA_def_property_ui_text(prop, "Hidden", "Bone is not visible when it is not in Edit Mode (i.e. in Object or Pose Modes).");
        RNA_def_property_boolean_sdna(prop, NULL, "flag", BONE_SELECTED);
        RNA_def_property_ui_text(prop, "Selected", "");
        RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
 +
 +      /* XXX better matrix descriptions possible (Arystan) */
 +      prop= RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX);
 +      RNA_def_property_float_sdna(prop, NULL, "bone_mat");
 +      RNA_def_property_array(prop, 9);
 +      RNA_def_property_ui_text(prop, "Bone Matrix", "3x3 bone matrix.");
 +
 +      prop= RNA_def_property(srna, "armature_matrix", PROP_FLOAT, PROP_MATRIX);
 +      RNA_def_property_float_sdna(prop, NULL, "arm_mat");
 +      RNA_def_property_array(prop, 16);
 +      RNA_def_property_ui_text(prop, "Bone Armature-Relative Matrix", "4x4 bone matrix relative to armature.");
 +
 +      prop= RNA_def_property(srna, "tail", PROP_FLOAT, PROP_TRANSLATION);
 +      RNA_def_property_float_sdna(prop, NULL, "tail");
 +      RNA_def_property_array(prop, 3);
 +      RNA_def_property_ui_text(prop, "Tail", "Location of tail end of the bone.");
 +
 +      prop= RNA_def_property(srna, "armature_tail", PROP_FLOAT, PROP_TRANSLATION);
 +      RNA_def_property_float_sdna(prop, NULL, "arm_tail");
 +      RNA_def_property_array(prop, 3);
 +      RNA_def_property_ui_text(prop, "Armature-Relative Tail", "Location of tail end of the bone relative to armature.");
 +
 +      prop= RNA_def_property(srna, "head", PROP_FLOAT, PROP_TRANSLATION);
 +      RNA_def_property_float_sdna(prop, NULL, "head");
 +      RNA_def_property_array(prop, 3);
 +      RNA_def_property_ui_text(prop, "Head", "Location of head end of the bone.");
 +
 +      prop= RNA_def_property(srna, "armature_head", PROP_FLOAT, PROP_TRANSLATION);
 +      RNA_def_property_float_sdna(prop, NULL, "arm_head");
 +      RNA_def_property_array(prop, 3);
 +      RNA_def_property_ui_text(prop, "Armature-Relative Head", "Location of head end of the bone relative to armature.");
  }
  
  static void rna_def_edit_bone(BlenderRNA *brna)
@@@ -612,7 -569,7 +600,7 @@@ void rna_def_armature(BlenderRNA *brna
        
        /* Boolean values */
                /* layer */
-       prop= RNA_def_property(srna, "layer", PROP_BOOLEAN, PROP_NONE);
+       prop= RNA_def_property(srna, "layer", PROP_BOOLEAN, PROP_LAYER_MEMBER);
        RNA_def_property_boolean_sdna(prop, NULL, "layer", 1);
        RNA_def_property_array(prop, 16);
        RNA_def_property_ui_text(prop, "Visible Layers", "Armature layer visibility.");
        RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
        
                /* layer protection */
-       prop= RNA_def_property(srna, "layer_protection", PROP_BOOLEAN, PROP_NONE);
+       prop= RNA_def_property(srna, "layer_protection", PROP_BOOLEAN, PROP_LAYER);
        RNA_def_property_boolean_sdna(prop, NULL, "layer_protected", 1);
        RNA_def_property_array(prop, 16);
        RNA_def_property_ui_text(prop, "Layer Proxy Protection", "Protected layers in Proxy Instances are restored to Proxy settings on file reload and undo.");        
index fee379c,0000000..3103303
mode 100644,000000..100644
--- /dev/null
@@@ -1,82 -1,0 +1,82 @@@
-  *
 +/**
++ * $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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 + *
 + * The Original Code is Copyright (C) 2009 Blender Foundation.
 + * All rights reserved.
 + *
 + * 
 + * Contributor(s): Blender Foundation
 + *
 + * ***** END GPL LICENSE BLOCK *****
 + */
 +
 +#include <stdlib.h>
 +#include <stdio.h>
 +#include <string.h>
 +#include <time.h>
 +
 +#include "RNA_define.h"
 +#include "RNA_types.h"
 +
 +#include "DNA_object_types.h"
 +
 +#ifdef RNA_RUNTIME
 +
 +#include "BKE_utildefines.h"
 +#include "BKE_image.h"
 +
 +#include "MEM_guardedalloc.h"
 +
 +/*
 +  User should check if returned path exists before copying a file there.
 +
 +  TODO: it would be better to return a (abs, rel) tuple.
 +*/
 +static char *rna_Image_get_export_path(Image *image, char *dest_dir, int rel)
 +{
 +      int length = FILE_MAX;
 +      char *path= MEM_callocN(length, "image file path");
 +
 +      if (!BKE_get_image_export_path(image, dest_dir, rel ? NULL : path, length, rel ? path : NULL, length )) {
 +              MEM_freeN(path);
 +              return NULL;
 +      }
 +
 +      return path;
 +}
 +
 +#else
 +
 +void RNA_api_image(StructRNA *srna)
 +{
 +      FunctionRNA *func;
 +      PropertyRNA *parm;
 +
 +      func= RNA_def_function(srna, "get_export_path", "rna_Image_get_export_path");
 +      RNA_def_function_ui_description(func, "Produce image export path.");
 +      parm= RNA_def_string(func, "dest_dir", "", 0, "", "Destination directory.");
 +      RNA_def_property_flag(parm, PROP_REQUIRED);
 +      parm= RNA_def_boolean(func, "get_rel_path", 1, "", "Return relative path if True.");
 +      RNA_def_property_flag(parm, PROP_REQUIRED);
 +      parm= RNA_def_string(func, "path", "", 0, "", "Absolute export path.");
 +      RNA_def_function_return(func, parm);
 +}
 +
 +#endif
 +
@@@ -130,6 -130,7 +130,7 @@@ void RNA_def_curve(struct BlenderRNA *b
  void RNA_def_fluidsim(struct BlenderRNA *brna);
  void RNA_def_fcurve(struct BlenderRNA *brna);
  void RNA_def_gameproperty(struct BlenderRNA *brna);
+ void RNA_def_gpencil(struct BlenderRNA *brna);
  void RNA_def_group(struct BlenderRNA *brna);
  void RNA_def_image(struct BlenderRNA *brna);
  void RNA_def_key(struct BlenderRNA *brna);
@@@ -156,6 -157,7 +157,7 @@@ void RNA_def_sensor(struct BlenderRNA *
  void RNA_def_sequence(struct BlenderRNA *brna);
  void RNA_def_smoke(struct BlenderRNA *brna);
  void RNA_def_space(struct BlenderRNA *brna);
+ void RNA_def_test(struct BlenderRNA *brna);
  void RNA_def_text(struct BlenderRNA *brna);
  void RNA_def_texture(struct BlenderRNA *brna);
  void RNA_def_timeline_marker(struct BlenderRNA *brna);
@@@ -194,16 -196,15 +196,18 @@@ void rna_object_vcollayer_name_set(stru
  
  void rna_Object_update(struct bContext *C, struct PointerRNA *ptr);
  void rna_Object_update_data(struct bContext *C, struct PointerRNA *ptr);
+ void rna_Mesh_update_draw(struct bContext *C, struct PointerRNA *ptr);
  
  /* API functions */
  
 +void RNA_api_action(StructRNA *srna);
 +void RNA_api_image(struct StructRNA *srna);
+ void RNA_api_keyingset(struct StructRNA *srna);
  void RNA_api_main(struct StructRNA *srna);
 +void RNA_api_material(StructRNA *srna);
  void RNA_api_mesh(struct StructRNA *srna);
  void RNA_api_object(struct StructRNA *srna);
- void RNA_api_scene(struct StructRNA *srna); 
+ void RNA_api_scene(struct StructRNA *srna);
  void RNA_api_ui_layout(struct StructRNA *srna);
  void RNA_api_wm(struct StructRNA *srna);
  
  
  #include "WM_types.h"
  
+ static EnumPropertyItem prop_texture_coordinates_items[] = {
+ {TEXCO_GLOB, "GLOBAL", 0, "Global", "Uses global coordinates for the texture coordinates."},
+ {TEXCO_OBJECT, "OBJECT", 0, "Object", "Uses linked object's coordinates for texture coordinates."},
+ {TEXCO_UV, "UV", 0, "UV", "Uses UV coordinates for texture coordinates."},
+ {TEXCO_ORCO, "ORCO", 0, "Generated", "Uses the original undeformed coordinates of the object."},
+ {TEXCO_STRAND, "STRAND", 0, "Strand", "Uses normalized strand texture coordinate (1D)."},
+ {TEXCO_STICKY, "STICKY", 0, "Sticky", "Uses mesh's sticky coordinates for the texture coordinates."},
+ {TEXCO_WINDOW, "WINDOW", 0, "Window", "Uses screen coordinates as texture coordinates."},
+ {TEXCO_NORM, "NORMAL", 0, "Normal", "Uses normal vector as texture coordinates."},
+ {TEXCO_REFL, "REFLECTION", 0, "Reflection", "Uses reflection vector as texture coordinates."},
+ {TEXCO_STRESS, "STRESS", 0, "Stress", "Uses the difference of edge lengths compared to original coordinates of the mesh."},
+ {TEXCO_TANGENT, "TANGENT", 0, "Tangent", "Uses the optional tangent vector as texture coordinates."},
+ {0, NULL, 0, NULL, NULL}};
  #ifdef RNA_RUNTIME
  
  #include "MEM_guardedalloc.h"
@@@ -207,6 -221,42 +221,42 @@@ void rna_Material_use_nodes_set(Pointer
                ED_node_shader_default(ma);
  }
  
+ static EnumPropertyItem *rna_Material_texture_coordinates_itemf(bContext *C, PointerRNA *ptr, int *free)
+ {
+       Material *ma= (Material*)ptr->id.data;
+       EnumPropertyItem *item= NULL;
+       int totitem= 0;
+       
+       if(C==NULL) {
+               return prop_texture_coordinates_items;
+       }
+       
+       RNA_enum_items_add_value(&item, &totitem, prop_texture_coordinates_items, TEXCO_GLOB);
+       RNA_enum_items_add_value(&item, &totitem, prop_texture_coordinates_items, TEXCO_OBJECT);
+       RNA_enum_items_add_value(&item, &totitem, prop_texture_coordinates_items, TEXCO_ORCO);
+       
+       if(ma->material_type == MA_TYPE_VOLUME) {
+               
+       }
+       else if (ELEM3(ma->material_type, MA_TYPE_SURFACE, MA_TYPE_HALO, MA_TYPE_WIRE)) {
+               RNA_enum_items_add_value(&item, &totitem, prop_texture_coordinates_items, TEXCO_UV);
+               RNA_enum_items_add_value(&item, &totitem, prop_texture_coordinates_items, TEXCO_STRAND);
+               RNA_enum_items_add_value(&item, &totitem, prop_texture_coordinates_items, TEXCO_STICKY);
+               RNA_enum_items_add_value(&item, &totitem, prop_texture_coordinates_items, TEXCO_WINDOW);
+               RNA_enum_items_add_value(&item, &totitem, prop_texture_coordinates_items, TEXCO_NORM);
+               RNA_enum_items_add_value(&item, &totitem, prop_texture_coordinates_items, TEXCO_REFL);
+               RNA_enum_items_add_value(&item, &totitem, prop_texture_coordinates_items, TEXCO_STRESS);
+               RNA_enum_items_add_value(&item, &totitem, prop_texture_coordinates_items, TEXCO_TANGENT);
+       }
+       
+       RNA_enum_item_end(&item, &totitem);
+       
+       *free= 1;
+       
+       return item;
+ }
  #else
  
  static void rna_def_material_mtex(BlenderRNA *brna)
        StructRNA *srna;
        PropertyRNA *prop;
  
-       static EnumPropertyItem prop_texture_coordinates_items[] = {
-               {TEXCO_GLOB, "GLOBAL", 0, "Global", "Uses global coordinates for the texture coordinates."},
-               {TEXCO_OBJECT, "OBJECT", 0, "Object", "Uses linked object's coordinates for texture coordinates."},
-               {TEXCO_UV, "UV", 0, "UV", "Uses UV coordinates for texture coordinates."},
-               {TEXCO_ORCO, "ORCO", 0, "Generated", "Uses the original undeformed coordinates of the object."},
-               {TEXCO_STRAND, "STRAND", 0, "Strand", "Uses normalized strand texture coordinate (1D)."},
-               {TEXCO_STICKY, "STICKY", 0, "Sticky", "Uses mesh's sticky coordinates for the texture coordinates."},
-               {TEXCO_WINDOW, "WINDOW", 0, "Window", "Uses screen coordinates as texture coordinates."},
-               {TEXCO_NORM, "NORMAL", 0, "Normal", "Uses normal vector as texture coordinates."},
-               {TEXCO_REFL, "REFLECTION", 0, "Reflection", "Uses reflection vector as texture coordinates."},
-               {TEXCO_STRESS, "STRESS", 0, "Stress", "Uses the difference of edge lengths compared to original coordinates of the mesh."},
-               {TEXCO_TANGENT, "TANGENT", 0, "Tangent", "Uses the optional tangent vector as texture coordinates."},
-               {0, NULL, 0, NULL, NULL}};
        static EnumPropertyItem prop_mapping_items[] = {
                {MTEX_FLAT, "FLAT", 0, "Flat", "Maps X and Y coordinates directly."},
                {MTEX_CUBE, "CUBE", 0, "Cube", "Maps using the normal vector."},
        prop= RNA_def_property(srna, "texture_coordinates", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "texco");
        RNA_def_property_enum_items(prop, prop_texture_coordinates_items);
+       RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Material_texture_coordinates_itemf");
        RNA_def_property_ui_text(prop, "Texture Coordinates", "");
        RNA_def_property_update(prop, NC_TEXTURE, NULL);
+       
        prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
        RNA_def_property_pointer_sdna(prop, NULL, "object");
        RNA_def_property_struct_type(prop, "Object");
        RNA_def_property_ui_text(prop, "Ambient Factor", "Amount texture affects ambient.");
        RNA_def_property_update(prop, NC_TEXTURE, NULL);
  
+       /* volume material */
+       prop= RNA_def_property(srna, "map_coloremission", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_EMISSION_COL);
+       RNA_def_property_ui_text(prop, "Emission Color", "Causes the texture to affect the colour of emission");
+       RNA_def_property_update(prop, NC_TEXTURE, NULL);
+       
+       prop= RNA_def_property(srna, "map_colorabsorption", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_ABSORPTION_COL);
+       RNA_def_property_ui_text(prop, "Absorption Color", "Causes the texture to affect the result colour after absorption");
+       RNA_def_property_update(prop, NC_TEXTURE, NULL);
+       
+       prop= RNA_def_property(srna, "map_density", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_DENSITY);
+       RNA_def_property_ui_text(prop, "Density", "Causes the texture to affect the volume's density");
+       RNA_def_property_update(prop, NC_TEXTURE, NULL);
+       
+       prop= RNA_def_property(srna, "map_emission", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_EMISSION);
+       RNA_def_property_ui_text(prop, "Emission", "Causes the texture to affect the volume's emission");
+       RNA_def_property_update(prop, NC_TEXTURE, NULL);
+       
+       prop= RNA_def_property(srna, "map_absorption", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_ABSORPTION);
+       RNA_def_property_ui_text(prop, "Absorption", "Causes the texture to affect the volume's absorption");
+       RNA_def_property_update(prop, NC_TEXTURE, NULL);
+       
+       prop= RNA_def_property(srna, "map_scattering", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_SCATTERING);
+       RNA_def_property_ui_text(prop, "Scattering", "Causes the texture to affect the volume's scattering");
+       RNA_def_property_update(prop, NC_TEXTURE, NULL);
+       
+       prop= RNA_def_property(srna, "coloremission_factor", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "colfac");
+       RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+       RNA_def_property_ui_text(prop, "Emission Color Factor", "Amount texture affects emission color.");
+       RNA_def_property_update(prop, NC_TEXTURE, NULL);
+       
+       prop= RNA_def_property(srna, "colorabsorption_factor", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "colfac");
+       RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+       RNA_def_property_ui_text(prop, "Absorpion Color Factor", "Amount texture affects diffuse color.");
+       RNA_def_property_update(prop, NC_TEXTURE, NULL);
+       
+       prop= RNA_def_property(srna, "density_factor", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "varfac");
+       RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+       RNA_def_property_ui_text(prop, "Density Factor", "Amount texture affects density.");
+       RNA_def_property_update(prop, NC_TEXTURE, NULL);
+       
+       prop= RNA_def_property(srna, "emission_factor", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "varfac");
+       RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+       RNA_def_property_ui_text(prop, "Emission Factor", "Amount texture affects emission.");
+       RNA_def_property_update(prop, NC_TEXTURE, NULL);
+       
+       prop= RNA_def_property(srna, "absorption_factor", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "varfac");
+       RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+       RNA_def_property_ui_text(prop, "Absorption Factor", "Amount texture affects absorption.");
+       RNA_def_property_update(prop, NC_TEXTURE, NULL);
+       
+       prop= RNA_def_property(srna, "scattering_factor", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "varfac");
+       RNA_def_property_ui_range(prop, 0, 1, 10, 3);
+       RNA_def_property_ui_text(prop, "Scattering Factor", "Amount texture affects scattering.");
+       RNA_def_property_update(prop, NC_TEXTURE, NULL);
+       
+       /* end volume material */
+       
        prop= RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_funcs(prop, "rna_MaterialTextureSlot_enabled_get", "rna_MaterialTextureSlot_enabled_set");
        RNA_def_property_ui_text(prop, "Enabled", "Enable this material texture slot.");
@@@ -511,6 -616,8 +616,8 @@@ static void rna_def_material_colors(Str
                {MA_RAMP_SAT, "SATURATION", 0, "Saturation", ""},
                {MA_RAMP_VAL, "VALUE", 0, "Value", ""},
                {MA_RAMP_COLOR, "COLOR", 0, "Color", ""},
+         {MA_RAMP_SOFT, "SOFT LIGHT", 0, "Soft Light", ""}, 
+         {MA_RAMP_LINEAR, "LINEAR LIGHT", 0, "Linear Light", ""}, 
                {0, NULL, 0, NULL, NULL}};
  
        static EnumPropertyItem prop_ramp_input_items[] = {
@@@ -616,10 -723,10 +723,10 @@@ static void rna_def_material_diffuse(St
        RNA_def_property_ui_text(prop, "Diffuse Shader Model", "");
        RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
        
-       prop= RNA_def_property(srna, "diffuse_reflection", PROP_FLOAT, PROP_PERCENTAGE);
+       prop= RNA_def_property(srna, "diffuse_intensity", PROP_FLOAT, PROP_PERCENTAGE);
        RNA_def_property_float_sdna(prop, NULL, "ref");
        RNA_def_property_range(prop, 0.0f, 1.0f);
-       RNA_def_property_ui_text(prop, "Diffuse Reflection", "Amount of diffuse reflection.");
+       RNA_def_property_ui_text(prop, "Diffuse Intensity", "Amount of diffuse reflection.");
        RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW, NULL);
        
        prop= RNA_def_property(srna, "roughness", PROP_FLOAT, PROP_NONE);
@@@ -677,10 -784,10 +784,10 @@@ static void rna_def_material_raymirror(
        RNA_def_property_ui_text(prop, "Enabled", "Enable raytraced reflections.");
        RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
                
-       prop= RNA_def_property(srna, "reflect", PROP_FLOAT, PROP_PERCENTAGE);
+       prop= RNA_def_property(srna, "reflect_factor", PROP_FLOAT, PROP_PERCENTAGE);
        RNA_def_property_float_sdna(prop, NULL, "ray_mirror");
        RNA_def_property_range(prop, 0.0f, 1.0f);
-       RNA_def_property_ui_text(prop, "Reflect", "Sets the amount mirror reflection for raytrace.");
+       RNA_def_property_ui_text(prop, "Reflectivity", "Sets the amount mirror reflection for raytrace.");
        RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
        
        prop= RNA_def_property(srna, "fresnel", PROP_FLOAT, PROP_NONE);
        RNA_def_property_ui_text(prop, "Fresnel Factor", "Blending factor for Fresnel.");
        RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
        
-       prop= RNA_def_property(srna, "gloss", PROP_FLOAT, PROP_PERCENTAGE);
+       prop= RNA_def_property(srna, "gloss_factor", PROP_FLOAT, PROP_PERCENTAGE);
        RNA_def_property_float_sdna(prop, NULL, "gloss_mir");
        RNA_def_property_range(prop, 0.0f, 1.0f);
-       RNA_def_property_ui_text(prop, "Gloss", "The shininess of the reflection. Values < 1.0 give diffuse, blurry reflections.");
+       RNA_def_property_ui_text(prop, "Gloss Amount", "The shininess of the reflection. Values < 1.0 give diffuse, blurry reflections.");
        RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
        
        prop= RNA_def_property(srna, "gloss_anisotropic", PROP_FLOAT, PROP_PERCENTAGE);
@@@ -766,10 -873,10 +873,10 @@@ static void rna_def_material_raytra(Ble
        RNA_def_property_ui_text(prop, "Fresnel Factor", "Blending factor for Fresnel.");
        RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
        
-       prop= RNA_def_property(srna, "gloss", PROP_FLOAT, PROP_PERCENTAGE);
+       prop= RNA_def_property(srna, "gloss_factor", PROP_FLOAT, PROP_PERCENTAGE);
        RNA_def_property_float_sdna(prop, NULL, "gloss_tra");
        RNA_def_property_range(prop, 0.0f, 1.0f);
-       RNA_def_property_ui_text(prop, "Gloss", "The clarity of the refraction. Values < 1.0 give diffuse, blurry refractions.");
+       RNA_def_property_ui_text(prop, "Gloss Amount", "The clarity of the refraction. Values < 1.0 give diffuse, blurry refractions.");
        RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
        
        prop= RNA_def_property(srna, "gloss_samples", PROP_INT, PROP_NONE);
        RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
  }
  
+ static void rna_def_material_volume(BlenderRNA *brna)
+ {
+       StructRNA *srna;
+       PropertyRNA *prop;
+       static EnumPropertyItem prop_scattering_items[] = {
+               {MA_VOL_SHADE_NONE, "NONE", 0, "None", ""},
+               {MA_VOL_SHADE_SINGLE, "SINGLE_SCATTERING", 0, "Single Scattering", ""},
+               {MA_VOL_SHADE_MULTIPLE, "MULTIPLE_SCATTERING", 0, "Multiple Scattering", ""},
+               {MA_VOL_SHADE_SINGLEPLUSMULTIPLE, "SINGLE_PLUS_MULTIPLE_SCATTERING", 0, "Single + Multiple Scattering", ""},
+               {0, NULL, 0, NULL, NULL}};
+       static EnumPropertyItem prop_stepsize_items[] = {
+               {MA_VOL_STEP_RANDOMIZED, "RANDOMIZED", 0, "Randomized", ""},
+               {MA_VOL_STEP_CONSTANT, "CONSTANT", 0, "Constant", ""},
+               //{MA_VOL_STEP_ADAPTIVE, "ADAPTIVE", 0, "Adaptive", ""},
+               {0, NULL, 0, NULL, NULL}};
+               
+       static EnumPropertyItem prop_phasefunction_items[] = {
+               {MA_VOL_PH_ISOTROPIC, "ISOTROPIC", 0, "Isotropic", ""},
+               {MA_VOL_PH_MIEHAZY, "MIE_HAZY", 0, "Mie Hazy", ""},
+               {MA_VOL_PH_MIEMURKY, "MIE_MURKY", 0, "Mie Murky", ""},
+               {MA_VOL_PH_RAYLEIGH, "RAYLEIGH", 0, "Rayleigh", ""},
+               {MA_VOL_PH_HG, "HENYEY-GREENSTEIN", 0, "Henyey-Greenstein", ""},
+               {MA_VOL_PH_SCHLICK, "SCHLICK", 0, "Schlick", ""},
+               {0, NULL, 0, NULL, NULL}};
+       srna= RNA_def_struct(brna, "MaterialVolume", NULL);
+       RNA_def_struct_sdna(srna, "VolumeSettings");
+       RNA_def_struct_nested(brna, srna, "Material");
+       RNA_def_struct_ui_text(srna, "Material Volume", "Volume rendering settings for a Material datablock.");
+       
+       prop= RNA_def_property(srna, "step_calculation", PROP_ENUM, PROP_NONE);
+       RNA_def_property_enum_sdna(prop, NULL, "stepsize_type");
+       RNA_def_property_enum_items(prop, prop_stepsize_items);
+       RNA_def_property_ui_text(prop, "Step Calculation", "Method of calculating the steps through the volume");
+       RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+       
+       prop= RNA_def_property(srna, "step_size", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "stepsize");
+       RNA_def_property_range(prop, 0.0f, FLT_MAX);
+       RNA_def_property_ui_range(prop, 0.0f, 1.0f, 1, 3);
+       RNA_def_property_ui_text(prop, "Step Size", "Distance between subsequent volume depth samples.");
+       RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+       
+       prop= RNA_def_property(srna, "shading_step_size", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "shade_stepsize");
+       RNA_def_property_range(prop, 0.0f, FLT_MAX);
+       RNA_def_property_ui_range(prop, 0.0f, 1.0f, 1, 3);
+       RNA_def_property_ui_text(prop, "Shading Step Size", "Distance between subsequent volume shading samples.");
+       RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+       
+       prop= RNA_def_property(srna, "scattering_mode", PROP_ENUM, PROP_NONE);
+       RNA_def_property_enum_sdna(prop, NULL, "shade_type");
+       RNA_def_property_enum_items(prop, prop_scattering_items);
+       RNA_def_property_ui_text(prop, "Scattering Mode", "Method of shading, attenuating, and scattering light through the volume");
+       RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+       
+       prop= RNA_def_property(srna, "light_cache", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "shadeflag", MA_VOL_PRECACHESHADING); /* use bitflags */
+       RNA_def_property_ui_text(prop, "Light Cache", "Pre-calculate the shading information into a voxel grid, speeds up shading at slightly less accuracy");
+       RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+       
+       prop= RNA_def_property(srna, "cache_resolution", PROP_INT, PROP_NONE);
+       RNA_def_property_int_sdna(prop, NULL, "precache_resolution");
+       RNA_def_property_range(prop, 0, 1024);
+       RNA_def_property_ui_text(prop, "Resolution", "Resolution of the voxel grid, low resolutions are faster, high resolutions use more memory.");
+       RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+       
+       prop= RNA_def_property(srna, "ms_diffusion", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "ms_diff");
+       RNA_def_property_range(prop, 0.0f, FLT_MAX);
+       RNA_def_property_ui_text(prop, "Diffusion", "Diffusion factor, the strength of the blurring effect");
+       RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+       
+       prop= RNA_def_property(srna, "ms_spread", PROP_INT, PROP_NONE);
+       RNA_def_property_int_sdna(prop, NULL, "ms_steps");
+       RNA_def_property_range(prop, 0, 1024);
+       RNA_def_property_ui_text(prop, "Spread", "Simulation steps, the effective distance over which the light is diffused");
+       RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+       
+       prop= RNA_def_property(srna, "ms_intensity", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "ms_intensity");
+       RNA_def_property_range(prop, 0.0f, FLT_MAX);
+       RNA_def_property_ui_text(prop, "Intensity", "Multiplier for multiple scattered light energy");
+       RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+       
+       prop= RNA_def_property(srna, "depth_cutoff", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "depth_cutoff");
+       RNA_def_property_range(prop, 0.0f, 1.0f);
+       RNA_def_property_ui_text(prop, "Depth Cutoff", "Stop ray marching early if transmission drops below this luminance - higher values give speedups in dense volumes at the expense of accuracy.");
+       RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+       
+       prop= RNA_def_property(srna, "density", PROP_FLOAT, PROP_PERCENTAGE);
+       RNA_def_property_float_sdna(prop, NULL, "density");
+       RNA_def_property_range(prop, 0.0f, 1.0f);
+       RNA_def_property_ui_text(prop, "Density", "The base density of the volume");
+       RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+       prop= RNA_def_property(srna, "density_scale", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "density_scale");
+       RNA_def_property_range(prop, 0.0f, FLT_MAX);
+       RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3);
+       RNA_def_property_ui_text(prop, "Density Scale", "Multiplier for the material's density");
+       RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+       
+       prop= RNA_def_property(srna, "absorption", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "absorption");
+       RNA_def_property_range(prop, 0.0f, FLT_MAX);
+       RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3);
+       RNA_def_property_ui_text(prop, "Absorption", "Amount of light that gets absorbed by the volume - higher values mean light travels less distance");
+       RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+       
+       prop= RNA_def_property(srna, "absorption_color", PROP_FLOAT, PROP_COLOR);
+       RNA_def_property_float_sdna(prop, NULL, "absorption_col");
+       RNA_def_property_array(prop, 3);
+       RNA_def_property_ui_text(prop, "Absorption Color", "");
+       RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW, NULL);
+       
+       prop= RNA_def_property(srna, "scattering", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "scattering");
+       RNA_def_property_range(prop, 0.0f, FLT_MAX);
+       RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1 ,3);
+       RNA_def_property_ui_text(prop, "Scattering", "Amount of light that gets scattered by the volume - values > 1.0 are non-physical");
+       RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+       
+       prop= RNA_def_property(srna, "emission", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "emission");
+       RNA_def_property_range(prop, 0.0f, FLT_MAX);
+       RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3);
+       RNA_def_property_ui_text(prop, "Emission", "Amount of light that gets emitted by the volume");
+       RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+       
+       prop= RNA_def_property(srna, "emission_color", PROP_FLOAT, PROP_COLOR);
+       RNA_def_property_float_sdna(prop, NULL, "emission_col");
+       RNA_def_property_array(prop, 3);
+       RNA_def_property_ui_text(prop, "Emission Color", "");
+       RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW, NULL);
+       
+       prop= RNA_def_property(srna, "phase_function", PROP_ENUM, PROP_NONE);
+       RNA_def_property_enum_sdna(prop, NULL, "phasefunc_type");
+       RNA_def_property_enum_items(prop, prop_phasefunction_items);
+       RNA_def_property_ui_text(prop, "Phase Function", "Isotropic/Anisotropic scattering");
+       RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+       
+       prop= RNA_def_property(srna, "asymmetry", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "phasefunc_g");
+       RNA_def_property_range(prop, -1.0f, 1.0f);
+       RNA_def_property_ui_text(prop, "Asymmetry", "Continuum between forward scattering and back scattering");
+       RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
+ }
  static void rna_def_material_halo(BlenderRNA *brna)
  {
        StructRNA *srna;
        RNA_def_property_ui_text(prop, "Star", "Renders halo as a star.");
        RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
        
-       prop= RNA_def_property(srna, "use_texture", PROP_BOOLEAN, PROP_NONE);
+       prop= RNA_def_property(srna, "texture", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALOTEX);
-       RNA_def_property_ui_text(prop, "Use Texture", "Gives halo a texture.");
+       RNA_def_property_ui_text(prop, "Texture", "Gives halo a texture.");
        RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
        
-       prop= RNA_def_property(srna, "use_vertex_normal", PROP_BOOLEAN, PROP_NONE);
+       prop= RNA_def_property(srna, "vertex_normal", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALOPUNO);
-       RNA_def_property_ui_text(prop, "Use Vertex Normal", "Uses the vertex normal to specify the dimension of the halo.");
+       RNA_def_property_ui_text(prop, "Vertex Normal", "Uses the vertex normal to specify the dimension of the halo.");
        RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
        
        prop= RNA_def_property(srna, "xalpha", PROP_BOOLEAN, PROP_NONE);
@@@ -1025,10 -1285,10 +1285,10 @@@ void rna_def_material_specularity(Struc
        RNA_def_property_ui_text(prop, "Specular Shader Model", "");
        RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
        
-       prop= RNA_def_property(srna, "specular_reflection", PROP_FLOAT, PROP_PERCENTAGE);
+       prop= RNA_def_property(srna, "specular_intensity", PROP_FLOAT, PROP_PERCENTAGE);
        RNA_def_property_float_sdna(prop, NULL, "spec");
        RNA_def_property_range(prop, 0, 1);
-       RNA_def_property_ui_text(prop, "Specularity Intensity", "");
+       RNA_def_property_ui_text(prop, "Specular Intensity", "");
        RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
  
        /* NOTE: "har", "param", etc are used for multiple purposes depending on
@@@ -1098,16 -1358,16 +1358,16 @@@ void rna_def_material_strand(BlenderRN
        RNA_def_property_ui_text(prop, "Blender Units", "Use Blender units for widths instead of pixels.");
        RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
  
-       prop= RNA_def_property(srna, "start_size", PROP_FLOAT, PROP_UNSIGNED);
+       prop= RNA_def_property(srna, "root_size", PROP_FLOAT, PROP_UNSIGNED);
        RNA_def_property_float_sdna(prop, NULL, "strand_sta");
        RNA_def_property_float_funcs(prop, NULL, NULL, "rna_MaterialStrand_start_size_range");
-       RNA_def_property_ui_text(prop, "Start Size", "Start size of strands in pixels Blender units.");
+       RNA_def_property_ui_text(prop, "Root Size", "Start size of strands in pixels Blender units.");
        RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
  
-       prop= RNA_def_property(srna, "end_size", PROP_FLOAT, PROP_UNSIGNED);
+       prop= RNA_def_property(srna, "tip_size", PROP_FLOAT, PROP_UNSIGNED);
        RNA_def_property_float_sdna(prop, NULL, "strand_end");
        RNA_def_property_float_funcs(prop, NULL, NULL, "rna_MaterialStrand_end_size_range");
-       RNA_def_property_ui_text(prop, "End Size", "Start size of strands in pixels or Blender units.");
+       RNA_def_property_ui_text(prop, "Tip Size", "Start size of strands in pixels or Blender units.");
        RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
  
        prop= RNA_def_property(srna, "min_size", PROP_FLOAT, PROP_UNSIGNED);
@@@ -1182,7 -1442,7 +1442,7 @@@ void RNA_def_material(BlenderRNA *brna
        static EnumPropertyItem prop_type_items[] = {
                {MA_TYPE_SURFACE, "SURFACE", 0, "Surface", "Render object as a surface."},
                {MA_TYPE_WIRE, "WIRE", 0, "Wire", "Render the edges of faces as wires (not supported in ray tracing)."},
-               // {MA_TYPE_VOLUME, "VOLUME", 0, "Volume", "Render object as a volume."},
+               {MA_TYPE_VOLUME, "VOLUME", 0, "Volume", "Render object as a volume."},
                {MA_TYPE_HALO, "HALO", 0, "Halo", "Render object as halo particles."},
                {0, NULL, 0, NULL, NULL}};
        static EnumPropertyItem transparency_items[] = {
        RNA_def_property_ui_text(prop, "Exclude Mist", "Excludes this material from mist effects (in world settings)");
        RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
        
-       prop= RNA_def_property(srna, "transparent_shadows", PROP_BOOLEAN, PROP_NONE);
+       prop= RNA_def_property(srna, "receive_transparent_shadows", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_SHADOW_TRA);
-       RNA_def_property_ui_text(prop, "Transparent Shadows", "Allow this object to receive transparent shadows casted through other objects");
+       RNA_def_property_ui_text(prop, "Receive Transparent Shadows", "Allow this object to receive transparent shadows casted through other objects");
        RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
        
        prop= RNA_def_property(srna, "ray_shadow_bias", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_pointer_funcs(prop, "rna_Material_transp_get", NULL, NULL);
        RNA_def_property_ui_text(prop, "Raytrace Transparency", "Raytraced reflection settings for the material.");
  
+       prop= RNA_def_property(srna, "volume", PROP_POINTER, PROP_NEVER_NULL);
+       RNA_def_property_pointer_sdna(prop, NULL, "vol");
+       RNA_def_property_struct_type(prop, "MaterialVolume");
+       RNA_def_property_ui_text(prop, "Volume", "Volume settings for the material.");
        prop= RNA_def_property(srna, "halo", PROP_POINTER, PROP_NEVER_NULL);
        RNA_def_property_struct_type(prop, "MaterialHalo");
        RNA_def_property_pointer_funcs(prop, "rna_Material_halo_get", NULL, NULL);
        /* nested structs */
        rna_def_material_raymirror(brna);
        rna_def_material_raytra(brna);
+       rna_def_material_volume(brna);
        rna_def_material_halo(brna);
        rna_def_material_sss(brna);
        rna_def_material_mtex(brna);
        rna_def_material_strand(brna);
        rna_def_material_physics(brna);
 +
 +      RNA_api_material(srna);
  }
  
  void rna_def_mtex_common(StructRNA *srna, const char *begin, const char *activeget, const char *activeset, const char *structname)
        RNA_def_property_flag(prop, PROP_EDITABLE);
        RNA_def_property_pointer_funcs(prop, activeget, activeset, NULL);
        RNA_def_property_ui_text(prop, "Active Texture", "Active texture slot being displayed.");
+       RNA_def_property_update(prop, NC_TEXTURE|ND_SHADING_DRAW, NULL);
  
        prop= RNA_def_property(srna, "active_texture_index", PROP_INT, PROP_UNSIGNED);
        RNA_def_property_int_sdna(prop, NULL, "texact");
        RNA_def_property_range(prop, 0, MAX_MTEX-1);
        RNA_def_property_ui_text(prop, "Active Texture Index", "Index of active texture slot.");
+       RNA_def_property_update(prop, NC_TEXTURE|ND_SHADING_DRAW, NULL);
  }
  
  #endif
index aa28b6b,0000000..e5dded2
mode 100644,000000..100644
--- /dev/null
@@@ -1,126 -1,0 +1,126 @@@
-  *
 +/**
++ * $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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 + *
 + * The Original Code is Copyright (C) 2009 Blender Foundation.
 + * All rights reserved.
 + *
 + * 
 + * Contributor(s): Blender Foundation
 + *
 + * ***** END GPL LICENSE BLOCK *****
 + */
 +
 +#include <stdlib.h>
 +#include <stdio.h>
 +
 +#include "RNA_define.h"
 +#include "RNA_types.h"
 +
 +#include "DNA_material_types.h"
 +
 +#ifdef RNA_RUNTIME
 +
 +#include "BKE_material.h"
 +#include "BKE_texture.h"
 +
 +/*
 +  Adds material to the first free texture slot.
 +  If all slots are busy, replaces the first.
 +*/
 +static void rna_Material_add_texture(Material *ma, Tex *tex, int mapto, int texco)
 +{
 +      int i;
 +      MTex *mtex;
 +      int slot= -1;
 +
 +      for (i= 0; i < MAX_MTEX; i++) {
 +              if (!ma->mtex[i]) {
 +                      slot= i;
 +                      break;
 +              }
 +      }
 +
 +      if (slot == -1)
 +              slot= 0;
 +
 +      if (ma->mtex[slot]) {
 +              ma->mtex[slot]->tex->id.us--;
 +      }
 +      else {
 +              ma->mtex[slot]= add_mtex();
 +      }
 +
 +      mtex= ma->mtex[slot];
 +
 +      mtex->tex= tex;
 +      id_us_plus(&tex->id);
 +
 +      mtex->texco= mapto;
 +      mtex->mapto= texco;
 +}
 +
 +#else
 +
 +void RNA_api_material(StructRNA *srna)
 +{
 +      FunctionRNA *func;
 +      PropertyRNA *parm;
 +
 +      /* copied from rna_def_material_mtex (rna_material.c) */
 +      static EnumPropertyItem prop_texture_coordinates_items[] = {
 +              {TEXCO_GLOB, "GLOBAL", 0, "Global", "Uses global coordinates for the texture coordinates."},
 +              {TEXCO_OBJECT, "OBJECT", 0, "Object", "Uses linked object's coordinates for texture coordinates."},
 +              {TEXCO_UV, "UV", 0, "UV", "Uses UV coordinates for texture coordinates."},
 +              {TEXCO_ORCO, "ORCO", 0, "Generated", "Uses the original undeformed coordinates of the object."},
 +              {TEXCO_STRAND, "STRAND", 0, "Strand", "Uses normalized strand texture coordinate (1D)."},
 +              {TEXCO_STICKY, "STICKY", 0, "Sticky", "Uses mesh's sticky coordinates for the texture coordinates."},
 +              {TEXCO_WINDOW, "WINDOW", 0, "Window", "Uses screen coordinates as texture coordinates."},
 +              {TEXCO_NORM, "NORMAL", 0, "Normal", "Uses normal vector as texture coordinates."},
 +              {TEXCO_REFL, "REFLECTION", 0, "Reflection", "Uses reflection vector as texture coordinates."},
 +              {TEXCO_STRESS, "STRESS", 0, "Stress", "Uses the difference of edge lengths compared to original coordinates of the mesh."},
 +              {TEXCO_TANGENT, "TANGENT", 0, "Tangent", "Uses the optional tangent vector as texture coordinates."},
 +
 +              {0, NULL, 0, NULL, NULL}};
 +
 +      static EnumPropertyItem prop_texture_mapto_items[] = {
 +              {MAP_COL, "COLOR", 0, "Color", "Causes the texture to affect basic color of the material"},
 +              {MAP_NORM, "NORMAL", 0, "Normal", "Causes the texture to affect the rendered normal"},
 +              {MAP_COLSPEC, "SPECULAR_COLOR", 0, "Specularity Color", "Causes the texture to affect the specularity color"},
 +              {MAP_COLMIR, "MIRROR", 0, "Mirror", "Causes the texture to affect the mirror color"},
 +              {MAP_REF, "REFLECTION", 0, "Reflection", "Causes the texture to affect the value of the materials reflectivity"},
 +              {MAP_SPEC, "SPECULARITY", 0, "Specularity", "Causes the texture to affect the value of specularity"},
 +              {MAP_EMIT, "EMIT", 0, "Emit", "Causes the texture to affect the emit value"},
 +              {MAP_ALPHA, "ALPHA", 0, "Alpha", "Causes the texture to affect the alpha value"},
 +              {MAP_HAR, "HARDNESS", 0, "Hardness", "Causes the texture to affect the hardness value"},
 +              {MAP_RAYMIRR, "RAY_MIRROR", 0, "Ray-Mirror", "Causes the texture to affect the ray-mirror value"},
 +              {MAP_TRANSLU, "TRANSLUCENCY", 0, "Translucency", "Causes the texture to affect the translucency value"},
 +              {MAP_AMB, "AMBIENT", 0, "Ambient", "Causes the texture to affect the value of ambient"},
 +              {MAP_DISPLACE, "DISPLACEMENT", 0, "Displacement", "Let the texture displace the surface"},
 +              {MAP_WARP, "WARP", 0, "Warp", "Let the texture warp texture coordinates of next channels"},
 +              {0, NULL, 0, NULL, NULL}};
 +
 +      func= RNA_def_function(srna, "add_texture", "rna_Material_add_texture");
 +      RNA_def_function_ui_description(func, "Add a texture to material's free texture slot.");
 +      parm= RNA_def_pointer(func, "texture", "Texture", "", "Texture to add.");
 +      parm= RNA_def_enum(func, "texture_coordinates", prop_texture_coordinates_items, TEXCO_UV, "", "Source of texture coordinate information."); /* optional */
 +      parm= RNA_def_enum(func, "map_to", prop_texture_mapto_items, MAP_COL, "", "Controls which material property the texture affects."); /* optional */
 +}
 +
 +#endif
 +
  #include "WM_api.h"
  #include "WM_types.h"
  
 +#include "BLI_arithb.h" /* CalcNormFloat */
 +
 +
  static void rna_Mesh_update_data(bContext *C, PointerRNA *ptr)
  {
-       Main *bmain= CTX_data_main(C);
-       Scene *scene= CTX_data_scene(C);
        ID *id= ptr->id.data;
-       Object *ob;
  
-       for(ob=bmain->object.first; ob; ob= ob->id.next) {
-               if(ob->data == id) {
-                       /* XXX this will loop over all objects again (slow) */
-                       DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
-                       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, ob);
-               }
-       }
+       DAG_id_flush_update(id, OB_RECALC_DATA);
+       WM_event_add_notifier(C, NC_GEOM|ND_DATA, id);
+ }
+ static void rna_Mesh_update_select(bContext *C, PointerRNA *ptr)
+ {
+       ID *id= ptr->id.data;
+       WM_event_add_notifier(C, NC_GEOM|ND_SELECT, id);
+ }
+ void rna_Mesh_update_draw(bContext *C, PointerRNA *ptr)
+ {
+       ID *id= ptr->id.data;
+       WM_event_add_notifier(C, NC_GEOM|ND_DATA, id);
  }
  
  static void rna_MeshVertex_normal_get(PointerRNA *ptr, float *value)
@@@ -401,6 -404,48 +407,48 @@@ static void rna_MeshTextureFace_uv4_set
        mtface->uv[3][1]= values[1];
  }
  
+ static int rna_CustomDataData_numverts(PointerRNA *ptr, int type)
+ {
+     Mesh *me= (Mesh*)ptr->id.data;
+     CustomData *fdata= rna_mesh_fdata(me);
+     CustomDataLayer *cdl;
+     int a;
+     size_t b;
+     for(cdl=fdata->layers, a=0; a<fdata->totlayer; cdl++, a++) {
+         if(cdl->type == type) {
+             b= ((char*)ptr->data - ((char*)cdl->data))/CustomData_sizeof(type);
+             if(b >= 0 && b < me->totface)
+                 return (me->mface[b].v4? 4: 3);
+         }
+     }
+     return 0;
+ }
+ static int rna_MeshTextureFace_uv_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION])
+ {
+       length[0]= rna_CustomDataData_numverts(ptr, CD_MTFACE);
+       length[1]= 2;
+     return length[0]*length[1];
+ }
+ static void rna_MeshTextureFace_uv_get(PointerRNA *ptr, float *values)
+ {
+       MTFace *mtface= (MTFace*)ptr->data;
+       int totvert= rna_CustomDataData_numverts(ptr, CD_MTFACE);
+       memcpy(values, mtface->uv, totvert * 2 * sizeof(float));
+ }
+ static void rna_MeshTextureFace_uv_set(PointerRNA *ptr, const float *values)
+ {
+       MTFace *mtface= (MTFace*)ptr->data;
+       int totvert= rna_CustomDataData_numverts(ptr, CD_MTFACE);
+       memcpy(mtface->uv, values, totvert * 2 * sizeof(float));
+ }
  static void rna_MeshTextureFaceLayer_data_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
  {
        Mesh *me= (Mesh*)ptr->id.data;
@@@ -663,6 -708,30 +711,30 @@@ static void rna_TextureFace_image_set(P
        tf->tpage= (struct Image*)id;
  }
  
+ static int rna_MeshFace_verts_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION])
+ {
+       MFace *face= (MFace*)ptr->data;
+       if(face)
+               length[0]= (face->v4)? 4: 3;
+       else
+               length[0]= 4; // XXX rna_raw_access wants the length of a dummy face. this needs fixing. - Campbell
+       return length[0];
+ }
+ static void rna_MeshFace_verts_get(PointerRNA *ptr, int *values)
+ {
+       MFace *face= (MFace*)ptr->data;
+       memcpy(values, &face->v1, (face->v4 ? 4 : 3) * sizeof(int));
+ }
+ static void rna_MeshFace_verts_set(PointerRNA *ptr, const int *values)
+ {
+       MFace *face= (MFace*)ptr->data;
+       memcpy(&face->v1, values, (face->v4 ? 4 : 3) * sizeof(int));
+ }
  /* path construction */
  
  static char *rna_VertexGroupElement_path(PointerRNA *ptr)
@@@ -788,10 -857,12 +860,12 @@@ static void rna_def_mvert_group(Blender
        RNA_def_property_int_sdna(prop, NULL, "def_nr");
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Group Index", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "weight", PROP_FLOAT, PROP_NONE);
        RNA_def_property_range(prop, 0.0f, 1.0f);
        RNA_def_property_ui_text(prop, "Weight", "Vertex Weight");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  }
  
  static void rna_def_mvert(BlenderRNA *brna)
  
        prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION);
        RNA_def_property_ui_text(prop, "Location", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "normal", PROP_FLOAT, PROP_DIRECTION);
        RNA_def_property_float_sdna(prop, NULL, "no");
        prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", SELECT);
        RNA_def_property_ui_text(prop, "Selected", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
  
        prop= RNA_def_property(srna, "hidden", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_HIDE);
        RNA_def_property_ui_text(prop, "Hidden", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
  
        prop= RNA_def_property(srna, "bevel_weight", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_funcs(prop, "rna_MeshVertex_bevel_weight_get", "rna_MeshVertex_bevel_weight_set", NULL);
        RNA_def_property_ui_text(prop, "Bevel Weight", "Weight used by the Bevel modifier 'Only Vertices' option");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "groups", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_collection_funcs(prop, "rna_MeshVertex_groups_begin", "rna_iterator_array_next", "rna_iterator_array_end", "rna_iterator_array_get", 0, 0, 0, 0, 0);
@@@ -852,36 -927,32 +930,42 @@@ static void rna_def_medge(BlenderRNA *b
        prop= RNA_def_property(srna, "crease", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_funcs(prop, "rna_MEdge_crease_get", "rna_MEdge_crease_set", NULL);
        RNA_def_property_ui_text(prop, "Crease", "Weight used by the Subsurf modifier for creasing");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "bevel_weight", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_funcs(prop, "rna_MEdge_bevel_weight_get", "rna_MEdge_bevel_weight_set", NULL);
        RNA_def_property_ui_text(prop, "Bevel Weight", "Weight used by the Bevel modifier");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", SELECT);
        RNA_def_property_ui_text(prop, "Selected", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
  
        prop= RNA_def_property(srna, "hidden", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_HIDE);
        RNA_def_property_ui_text(prop, "Hidden", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
  
        prop= RNA_def_property(srna, "seam", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_SEAM);
        RNA_def_property_ui_text(prop, "Seam", "Seam edge for UV unwrapping");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
  
        prop= RNA_def_property(srna, "sharp", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_SHARP);
        RNA_def_property_ui_text(prop, "Sharp", "Sharp edge for the EdgeSplit modifier");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
 +
 +      prop= RNA_def_property(srna, "loose", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_LOOSEEDGE);
 +      RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 +      RNA_def_property_ui_text(prop, "Loose", "Loose edge");
 +
 +      prop= RNA_def_property(srna, "fgon", PROP_BOOLEAN, PROP_NONE);
 +      RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_FGON);
 +      RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 +      RNA_def_property_ui_text(prop, "Fgon", "Fgon edge");
  }
  
  static void rna_def_mface(BlenderRNA *brna)
        RNA_def_struct_path_func(srna, "rna_MeshFace_path");
        RNA_def_struct_ui_icon(srna, ICON_FACESEL);
  
+       // XXX allows creating invalid meshes
        prop= RNA_def_property(srna, "verts", PROP_INT, PROP_UNSIGNED);
-       RNA_def_property_int_sdna(prop, NULL, "v1");
        RNA_def_property_array(prop, 4);
+       RNA_def_property_flag(prop, PROP_DYNAMIC);
+       RNA_def_property_dynamic_array_funcs(prop, "rna_MeshFace_verts_get_length");
+       RNA_def_property_int_funcs(prop, "rna_MeshFace_verts_get", "rna_MeshFace_verts_set", NULL);
        RNA_def_property_ui_text(prop, "Vertices", "Vertex indices");
-       // XXX allows creating invalid meshes
  
        prop= RNA_def_property(srna, "material_index", PROP_INT, PROP_UNSIGNED);
        RNA_def_property_int_sdna(prop, NULL, "mat_nr");
        RNA_def_property_ui_text(prop, "Material Index", "");
        RNA_def_property_int_funcs(prop, NULL, NULL, "rna_MeshFace_material_index_range");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_FACE_SEL);
        RNA_def_property_ui_text(prop, "Selected", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
  
        prop= RNA_def_property(srna, "hidden", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_HIDE);
        RNA_def_property_ui_text(prop, "Hidden", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
  
        prop= RNA_def_property(srna, "smooth", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_SMOOTH);
        RNA_def_property_ui_text(prop, "Smooth", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+       
        prop= RNA_def_property(srna, "normal", PROP_FLOAT, PROP_DIRECTION);
        RNA_def_property_array(prop, 3);
        RNA_def_property_range(prop, -1.0f, 1.0f);
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_float_funcs(prop, "rna_MeshFace_normal_get", NULL, NULL);
 -      RNA_def_property_ui_text(prop, "face normal", "local space unit length normal vector for this face");
 +      RNA_def_property_ui_text(prop, "Normal", "Face unit-space normal vector.");
  }
  
  static void rna_def_mtface(BlenderRNA *brna)
                {TF_ALPHA, "ALPHA", 0, "Alpha", "Render polygon transparent, depending on alpha channel of the texture"},
                {TF_CLIP, "CLIPALPHA", 0, "Clip Alpha", "Use the images alpha values clipped with no blending (binary alpha)"},
                {0, NULL, 0, NULL, NULL}};
+       int uv_dim[]= {4, 2};
  
        srna= RNA_def_struct(brna, "MeshTextureFaceLayer", NULL);
        RNA_def_struct_ui_text(srna, "Mesh Texture Face Layer", "Layer of texture faces in a Mesh datablock.");
        RNA_def_struct_sdna(srna, "CustomDataLayer");
        RNA_def_struct_path_func(srna, "rna_MeshTextureFaceLayer_path");
+       RNA_def_struct_ui_icon(srna, ICON_GROUP_UVS);
  
        prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
        RNA_def_struct_name_property(srna, prop);
        RNA_def_property_string_funcs(prop, NULL, NULL, "rna_MeshTextureFaceLayer_name_set");
        RNA_def_property_ui_text(prop, "Name", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_funcs(prop, "rna_MeshTextureFaceLayer_active_get", "rna_MeshTextureFaceLayer_active_set");
        RNA_def_property_ui_text(prop, "Active", "Sets the layer as active for display and editing");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "active_render", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "active_rnd", 0);
        RNA_def_property_boolean_funcs(prop, "rna_MeshTextureFaceLayer_active_render_get", "rna_MeshTextureFaceLayer_active_render_set");
        RNA_def_property_ui_text(prop, "Active Render", "Sets the layer as active for rendering");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_struct_type(prop, "MeshTextureFace");
        RNA_def_property_pointer_funcs(prop, NULL, "rna_TextureFace_image_set", NULL);
        RNA_def_property_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Image", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "tex", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_TEX);
        RNA_def_property_ui_text(prop, "Tex", "Render face with texture");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "light", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_LIGHT);
        RNA_def_property_ui_text(prop, "Light", "Use light for face");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "invisible", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_INVISIBLE);
        RNA_def_property_ui_text(prop, "Invisible", "Make face invisible");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "collision", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_DYNAMIC);
        RNA_def_property_ui_text(prop, "Collision", "Use face for collision and ray-sensor detection");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "shared", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_SHAREDCOL);
        RNA_def_property_ui_text(prop, "Shared", "Blend vertex colors across face when vertices are shared");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "twoside", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_TWOSIDE);
        RNA_def_property_ui_text(prop, "Twoside", "Render face twosided");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "object_color", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_OBCOL);
        RNA_def_property_ui_text(prop, "Object Color", "Use ObColor instead of vertex colors");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "halo", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_BILLBOARD);
        RNA_def_property_ui_text(prop, "Halo", "Screen aligned billboard");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "billboard", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_BILLBOARD2);
        RNA_def_property_ui_text(prop, "Billboard", "Billboard with Z-axis constraint");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "shadow", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_SHADOW);
        RNA_def_property_ui_text(prop, "Shadow", "Face is used for shadow");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "text", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_BMFONT);
        RNA_def_property_ui_text(prop, "Text", "Enable bitmap text on face");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "alpha_sort", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "mode", TF_ALPHASORT);
        RNA_def_property_ui_text(prop, "Alpha Sort", "Enable sorting of faces for correct alpha drawing (slow, use Clip Alpha instead when possible)");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "transp", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_items(prop, transp_items);
        RNA_def_property_ui_text(prop, "Transparency", "Transparency blending mode");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "uv_selected", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flag", TF_SEL1);
        RNA_def_property_array(prop, 4);
        RNA_def_property_ui_text(prop, "UV Selected", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
  
        prop= RNA_def_property(srna, "uv_pinned", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "unwrap", TF_PIN1);
        RNA_def_property_array(prop, 4);
        RNA_def_property_ui_text(prop, "UV Pinned", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_select");
  
        prop= RNA_def_property(srna, "uv1", PROP_FLOAT, PROP_XYZ);
        RNA_def_property_array(prop, 2);
        RNA_def_property_float_funcs(prop, "rna_MeshTextureFace_uv1_get", "rna_MeshTextureFace_uv1_set", NULL);
        RNA_def_property_ui_text(prop, "UV 1", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "uv2", PROP_FLOAT, PROP_XYZ);
        RNA_def_property_array(prop, 2);
        RNA_def_property_float_funcs(prop, "rna_MeshTextureFace_uv2_get", "rna_MeshTextureFace_uv2_set", NULL);
        RNA_def_property_ui_text(prop, "UV 2", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "uv3", PROP_FLOAT, PROP_XYZ);
        RNA_def_property_array(prop, 2);
        RNA_def_property_float_funcs(prop, "rna_MeshTextureFace_uv3_get", "rna_MeshTextureFace_uv3_set", NULL);
        RNA_def_property_ui_text(prop, "UV 3", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "uv4", PROP_FLOAT, PROP_XYZ);
        RNA_def_property_array(prop, 2);
        RNA_def_property_float_funcs(prop, "rna_MeshTextureFace_uv4_get", "rna_MeshTextureFace_uv4_set", NULL);
        RNA_def_property_ui_text(prop, "UV 4", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+       prop= RNA_def_property(srna, "uv", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_multi_array(prop, 2, uv_dim);
+       RNA_def_property_flag(prop, PROP_DYNAMIC);
+       RNA_def_property_dynamic_array_funcs(prop, "rna_MeshTextureFace_uv_get_length");
+       RNA_def_property_float_funcs(prop, "rna_MeshTextureFace_uv_get", "rna_MeshTextureFace_uv_set", NULL);
+       RNA_def_property_ui_text(prop, "UV", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  }
  
  static void rna_def_msticky(BlenderRNA *brna)
  
        prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_XYZ);
        RNA_def_property_ui_text(prop, "Location", "Sticky texture coordinate location.");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  }
  
  static void rna_def_mcol(BlenderRNA *brna)
        RNA_def_struct_ui_text(srna, "Mesh Vertex Color Layer", "Layer of vertex colors in a Mesh datablock.");
        RNA_def_struct_sdna(srna, "CustomDataLayer");
        RNA_def_struct_path_func(srna, "rna_MeshColorLayer_path");
+       RNA_def_struct_ui_icon(srna, ICON_GROUP_VCOL);
  
        prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
        RNA_def_struct_name_property(srna, prop);
        RNA_def_property_string_funcs(prop, NULL, NULL, "rna_MeshColorLayer_name_set");
        RNA_def_property_ui_text(prop, "Name", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_funcs(prop, "rna_MeshColorLayer_active_get", "rna_MeshColorLayer_active_set");
        RNA_def_property_ui_text(prop, "Active", "Sets the layer as active for display and editing");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "active_render", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "active_rnd", 0);
        RNA_def_property_boolean_funcs(prop, "rna_MeshColorLayer_active_render_get", "rna_MeshColorLayer_active_render_set");
        RNA_def_property_ui_text(prop, "Active Render", "Sets the layer as active for rendering");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_struct_type(prop, "MeshColor");
        RNA_def_property_range(prop, 0.0f, 1.0f);
        RNA_def_property_float_funcs(prop, "rna_MeshColor_color1_get", "rna_MeshColor_color1_set", NULL);
        RNA_def_property_ui_text(prop, "Color 1", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "color2", PROP_FLOAT, PROP_COLOR);
        RNA_def_property_array(prop, 3);
        RNA_def_property_range(prop, 0.0f, 1.0f);
        RNA_def_property_float_funcs(prop, "rna_MeshColor_color2_get", "rna_MeshColor_color2_set", NULL);
        RNA_def_property_ui_text(prop, "Color 2", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "color3", PROP_FLOAT, PROP_COLOR);
        RNA_def_property_array(prop, 3);
        RNA_def_property_range(prop, 0.0f, 1.0f);
        RNA_def_property_float_funcs(prop, "rna_MeshColor_color3_get", "rna_MeshColor_color3_set", NULL);
        RNA_def_property_ui_text(prop, "Color 3", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "color4", PROP_FLOAT, PROP_COLOR);
        RNA_def_property_array(prop, 3);
        RNA_def_property_range(prop, 0.0f, 1.0f);
        RNA_def_property_float_funcs(prop, "rna_MeshColor_color4_get", "rna_MeshColor_color4_set", NULL);
        RNA_def_property_ui_text(prop, "Color 4", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  }
  
  static void rna_def_mproperties(BlenderRNA *brna)
        prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
        RNA_def_struct_name_property(srna, prop);
        RNA_def_property_ui_text(prop, "Name", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_struct_type(prop, "MeshFloatProperty");
        prop= RNA_def_property(srna, "value", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "f");
        RNA_def_property_ui_text(prop, "Value", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        /* Int */
        srna= RNA_def_struct(brna, "MeshIntPropertyLayer", NULL);
        prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
        RNA_def_struct_name_property(srna, prop);
        RNA_def_property_ui_text(prop, "Name", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_struct_type(prop, "MeshIntProperty");
        prop= RNA_def_property(srna, "value", PROP_INT, PROP_NONE);
        RNA_def_property_int_sdna(prop, NULL, "i");
        RNA_def_property_ui_text(prop, "Value", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        /* String */
        srna= RNA_def_struct(brna, "MeshStringPropertyLayer", NULL);
        prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
        RNA_def_struct_name_property(srna, prop);
        RNA_def_property_ui_text(prop, "Name", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  
        prop= RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_struct_type(prop, "MeshStringProperty");
        prop= RNA_def_property(srna, "value", PROP_STRING, PROP_NONE);
        RNA_def_property_string_sdna(prop, NULL, "s");
        RNA_def_property_ui_text(prop, "Value", "");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
  }
  
  void rna_def_texmat_common(StructRNA *srna, const char *texspace_editable)
        RNA_def_property_float_sdna(prop, NULL, "loc");
        RNA_def_property_ui_text(prop, "Texure Space Location", "Texture space location.");
        RNA_def_property_editable_func(prop, texspace_editable);
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
  
        prop= RNA_def_property(srna, "texspace_size", PROP_FLOAT, PROP_XYZ);
        RNA_def_property_float_sdna(prop, NULL, "size");
        RNA_def_property_ui_text(prop, "Texture Space Size", "Texture space size.");
        RNA_def_property_editable_func(prop, texspace_editable);
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
  
        /* not supported yet
        prop= RNA_def_property(srna, "texspace_rot", PROP_FLOAT, PROP_EULER);
        RNA_def_property_float(prop, NULL, "rot");
        RNA_def_property_ui_text(prop, "Texture Space Rotation", "Texture space rotation");
-       RNA_def_property_editable_func(prop, texspace_editable);*/
+       RNA_def_property_editable_func(prop, texspace_editable);
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");*/
  
        /* materials */
        prop= RNA_def_property(srna, "materials", PROP_COLLECTION, PROP_NONE);
@@@ -1358,58 -1487,58 +1500,58 @@@ static void rna_def_mesh(BlenderRNA *br
        prop= RNA_def_property(srna, "draw_edges", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWEDGES);
        RNA_def_property_ui_text(prop, "Draw Edges", "Displays selected edges using hilights in the 3d view and UV editor");
-       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
        
        prop= RNA_def_property(srna, "draw_faces", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWFACES);
        RNA_def_property_ui_text(prop, "Draw Faces", "Displays all faces as shades in the 3d view and UV editor");
-       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
        
        prop= RNA_def_property(srna, "draw_normals", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWNORMALS);
        RNA_def_property_ui_text(prop, "Draw Normals", "Displays face normals as lines");
-       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
        
        prop= RNA_def_property(srna, "draw_vertex_normals", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAW_VNORMALS);
        RNA_def_property_ui_text(prop, "Draw Vertex Normals", "Displays vertex normals as lines");
-       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
        
        prop= RNA_def_property(srna, "draw_creases", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWCREASES);
        RNA_def_property_ui_text(prop, "Draw Creases", "Displays creases created for subsurf weighting");
-       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
        
        prop= RNA_def_property(srna, "draw_bevel_weights", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWBWEIGHTS);
        RNA_def_property_ui_text(prop, "Draw Bevel Weights", "Displays weights created for the Bevel modifier");
-       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
        
        prop= RNA_def_property(srna, "draw_seams", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWSEAMS);
        RNA_def_property_ui_text(prop, "Draw Seams", "Displays UV unwrapping seams");
-       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
        
        prop= RNA_def_property(srna, "draw_sharp", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWSHARP);
        RNA_def_property_ui_text(prop, "Draw Sharp", "Displays sharp edges, used with the EdgeSplit modifier");
-       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
        
        
        prop= RNA_def_property(srna, "draw_edge_lenght", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAW_EDGELEN);
        RNA_def_property_ui_text(prop, "Edge Length", "Displays selected edge lengths");
-       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
        
        prop= RNA_def_property(srna, "draw_edge_angle", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAW_EDGEANG);
        RNA_def_property_ui_text(prop, "Edge Angles", "Displays the angles in the selected edges in degrees");
-       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
        
        prop= RNA_def_property(srna, "draw_face_area", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAW_FACEAREA);
        RNA_def_property_ui_text(prop, "Face Area", "Displays the area of selected faces");
-       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+       RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
  
        rna_def_texmat_common(srna, "rna_Mesh_texspace_editable");
  
  #include "BKE_DerivedMesh.h"
  #include "BKE_main.h"
  #include "BKE_mesh.h"
 +#include "BKE_material.h"
  
 +#include "DNA_mesh_types.h"
 +#include "DNA_scene_types.h"
 +
 +#include "BLI_arithb.h"
  #include "BLI_edgehash.h"
  
  #include "WM_api.h"
  #include "WM_types.h"
  
 +#include "MEM_guardedalloc.h"
 +
  static void rna_Mesh_calc_edges(Mesh *mesh)
  {
        CustomData edata;
  
  static void rna_Mesh_update(Mesh *mesh, bContext *C)
  {
-       Main *bmain= CTX_data_main(C);
-       Object *ob;
        if(mesh->totface && mesh->totedge == 0)
                rna_Mesh_calc_edges(mesh);
  
        mesh_calc_normals(mesh->mvert, mesh->totvert, mesh->mface, mesh->totface, NULL);
  
-       for(ob=bmain->object.first; ob; ob=ob->id.next) {
-               if(ob->data == mesh) {
-                       ob->recalc |= OB_RECALC_DATA;
-                       WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_DATA, ob);
-               }
-       }
+       DAG_id_flush_update(&mesh->id, OB_RECALC_DATA);
+       WM_event_add_notifier(C, NC_GEOM|ND_DATA, mesh);
  }
  
 +static void rna_Mesh_transform(Mesh *me, float *mat)
 +{
 +
 +      /* TODO: old API transform had recalc_normals option */
 +      int i;
 +      MVert *mvert= me->mvert;
 +
 +      for(i= 0; i < me->totvert; i++, mvert++) {
 +              Mat4MulVecfl((float (*)[4])mat, mvert->co);
 +      }
 +}
 +
  static void rna_Mesh_add_verts(Mesh *mesh, int len)
  {
        CustomData vdata;
        mesh->totvert= totvert;
  }
  
 +Mesh *rna_Mesh_create_copy(Mesh *me)
 +{
 +      Mesh *ret= copy_mesh(me);
 +      ret->id.us--;
 +      
 +      return ret;
 +}
 +
  static void rna_Mesh_add_edges(Mesh *mesh, int len)
  {
        CustomData edata;
@@@ -235,12 -201,6 +228,12 @@@ static void rna_Mesh_add_faces(Mesh *me
        mesh->totface= totface;
  }
  
 +/*
 +static void rna_Mesh_add_faces(Mesh *mesh)
 +{
 +}
 +*/
 +
  static void rna_Mesh_add_geometry(Mesh *mesh, int verts, int edges, int faces)
  {
        if(verts)
                rna_Mesh_add_faces(mesh, faces);
  }
  
 +static void rna_Mesh_add_uv_texture(Mesh *me)
 +{
 +      me->mtface= CustomData_add_layer(&me->fdata, CD_MTFACE, CD_DEFAULT, NULL, me->totface);
 +}
 +
 +static void rna_Mesh_calc_normals(Mesh *me)
 +{
 +      mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
 +}
 +
 +static void rna_Mesh_add_material(Mesh *me, Material *ma)
 +{
 +      int i;
 +      int totcol = me->totcol + 1;
 +      Material **mat;
 +
 +      /* don't add if mesh already has it */
 +      for (i = 0; i < me->totcol; i++)
 +              if (me->mat[i] == ma)
 +                      return;
 +
 +      mat= MEM_callocN(sizeof(void*) * totcol, "newmatar");
 +
 +      if (me->totcol) memcpy(mat, me->mat, sizeof(void*) * me->totcol);
 +      if (me->mat) MEM_freeN(me->mat);
 +
 +      me->mat = mat;
 +      me->mat[me->totcol++] = ma;
 +      ma->id.us++;
 +
 +      test_object_materials((ID*)me);
 +}
 +
  #else
  
  void RNA_api_mesh(StructRNA *srna)
        FunctionRNA *func;
        PropertyRNA *parm;
  
-       parm= RNA_def_float_matrix(func, "matrix", 16, NULL, 0.0f, 0.0f, "", "Matrix.", 0.0f, 0.0f);
 +      func= RNA_def_function(srna, "transform", "rna_Mesh_transform");
 +      RNA_def_function_ui_description(func, "Transform mesh vertices by a matrix.");
++      parm= RNA_def_float_matrix(func, "matrix", 4, 4, NULL, 0.0f, 0.0f, "", "Matrix.", 0.0f, 0.0f);
 +      RNA_def_property_flag(parm, PROP_REQUIRED);
 +
        func= RNA_def_function(srna, "add_geometry", "rna_Mesh_add_geometry");
        parm= RNA_def_int(func, "verts", 0, 0, INT_MAX, "Number", "Number of vertices to add.", 0, INT_MAX);
        RNA_def_property_flag(parm, PROP_REQUIRED);
        parm= RNA_def_int(func, "faces", 0, 0, INT_MAX, "Number", "Number of faces to add.", 0, INT_MAX);
        RNA_def_property_flag(parm, PROP_REQUIRED);
  
 +      func= RNA_def_function(srna, "create_copy", "rna_Mesh_create_copy");
 +      RNA_def_function_ui_description(func, "Create a copy of this Mesh datablock.");
 +      parm= RNA_def_pointer(func, "mesh", "Mesh", "", "Mesh, remove it if it is only used for export.");
 +      RNA_def_function_return(func, parm);
 +
 +      func= RNA_def_function(srna, "add_uv_texture", "rna_Mesh_add_uv_texture");
 +      RNA_def_function_ui_description(func, "Add a UV texture layer to Mesh.");
 +
 +      func= RNA_def_function(srna, "calc_normals", "rna_Mesh_calc_normals");
 +      RNA_def_function_ui_description(func, "Calculate vertex normals.");
 +
        func= RNA_def_function(srna, "update", "rna_Mesh_update");
        RNA_def_function_flag(func, FUNC_USE_CONTEXT);
 +
 +      func= RNA_def_function(srna, "add_material", "rna_Mesh_add_material");
 +      RNA_def_function_ui_description(func, "Add a new material to Mesh.");
 +      parm= RNA_def_pointer(func, "material", "Material", "", "Material to add.");
 +      RNA_def_property_flag(parm, PROP_REQUIRED);
  }
  
  #endif
@@@ -39,9 -39,9 +39,9 @@@
  #include "DNA_property_types.h"
  #include "DNA_scene_types.h"
  
+ #include "WM_api.h"
  #include "WM_types.h"
  
  EnumPropertyItem object_mode_items[] = {
        {OB_MODE_OBJECT, "OBJECT", ICON_OBJECT_DATAMODE, "Object", ""},
        {OB_MODE_EDIT, "EDIT", ICON_EDITMODE_HLT, "Edit", ""},
@@@ -64,6 -64,22 +64,22 @@@ static EnumPropertyItem parent_type_ite
        {PARBONE, "BONE", 0, "Bone", ""},
        {0, NULL, 0, NULL, NULL}};
  
+ EnumPropertyItem object_type_items[] = {
+       {OB_MESH, "MESH", 0, "Mesh", ""},
+       {OB_CURVE, "CURVE", 0, "Curve", ""},
+       {OB_SURF, "SURFACE", 0, "Surface", ""},
+       {OB_MBALL, "META", 0, "Meta", ""},
+       {OB_FONT, "TEXT", 0, "Text", ""},
+       {0, "", 0, NULL, NULL},
+       {OB_ARMATURE, "ARMATURE", 0, "Armature", ""},
+       {OB_LATTICE, "LATTICE", 0, "Lattice", ""},
+       {OB_EMPTY, "EMPTY", 0, "Empty", ""},
+       {0, "", 0, NULL, NULL},
+       {OB_CAMERA, "CAMERA", 0, "Camera", ""},
+       {OB_LAMP, "LAMP", 0, "Lamp", ""},
+       {0, NULL, 0, NULL, NULL}
+ };
  #ifdef RNA_RUNTIME
  
  #include "DNA_key_types.h"
  
  void rna_Object_update(bContext *C, PointerRNA *ptr)
  {
-       DAG_object_flush_update(CTX_data_scene(C), ptr->id.data, OB_RECALC_OB);
+       DAG_id_flush_update(ptr->id.data, OB_RECALC_OB);
  }
  
 +void rna_Object_matrix_update(bContext *C, PointerRNA *ptr)
 +{
 +      ED_object_apply_obmat(ptr->id.data);
 +      rna_Object_update(C, ptr);
 +}
 +
  void rna_Object_update_data(bContext *C, PointerRNA *ptr)
  {
-       DAG_object_flush_update(CTX_data_scene(C), ptr->id.data, OB_RECALC_DATA);
+       DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA);
+       WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ptr->id.data);
  }
  
  static void rna_Object_dependency_update(bContext *C, PointerRNA *ptr)
  {
-       DAG_object_flush_update(CTX_data_scene(C), ptr->id.data, OB_RECALC_OB);
+       DAG_id_flush_update(ptr->id.data, OB_RECALC_OB);
        DAG_scene_sort(CTX_data_scene(C));
  }
  
@@@ -628,16 -639,6 +645,16 @@@ static void rna_GameObjectSettings_stat
        }
  }
  
 +/*
 +static PointerRNA rna_DupliObject_object_get(PointerRNA *ptr)
 +{
 +      DupliObject *dob= (DupliObject*)ptr->data;
 +      PointerRNA newptr;
 +      RNA_pointer_create(&dob->ob->id, &RNA_Object, dob->ob, &newptr);
 +      return newptr;
 +}
 +*/
 +
  static void rna_Object_active_shape_key_index_range(PointerRNA *ptr, int *min, int *max)
  {
        Object *ob= (Object*)ptr->id.data;
@@@ -790,8 -791,8 +807,8 @@@ static void rna_def_object_game_setting
                {OB_BOUND_SPHERE, "SPHERE", 0, "Sphere", ""},
                {OB_BOUND_CYLINDER, "CYLINDER", 0, "Cylinder", ""},
                {OB_BOUND_CONE, "CONE", 0, "Cone", ""},
-               {OB_BOUND_POLYH, "CONVEX_HULL", 0, "Convex Hull", ""},
-               {OB_BOUND_POLYT, "TRIANGLE_MESH", 0, "Triangle Mesh", ""},
+               {OB_BOUND_POLYT, "CONVEX_HULL", 0, "Convex Hull", ""},
+               {OB_BOUND_POLYH, "TRIANGLE_MESH", 0, "Triangle Mesh", ""},
                //{OB_DYN_MESH, "DYNAMIC_MESH", 0, "Dynamic Mesh", ""},
                {0, NULL, 0, NULL, NULL}};
  
@@@ -1045,6 -1046,8 +1062,8 @@@ static void rna_def_object(BlenderRNA *
                {OB_DUPLIGROUP, "GROUP", 0, "Group", "Enable group instancing."},
                {0, NULL, 0, NULL, NULL}};
  
+       int matrix_dimsize[]= {4, 4};
        srna= RNA_def_struct(brna, "Object", "ID");
        RNA_def_struct_ui_text(srna, "Object", "Object datablock defining an object in a scene..");
        RNA_def_struct_clear_flag(srna, STRUCT_ID_REFCOUNT);
        RNA_def_property_editable_func(prop, "rna_Object_data_editable");
        RNA_def_property_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Data", "Object data.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update_data");
+       RNA_def_property_update(prop, 0, "rna_Object_update_data");
  
        prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "type");
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Mode", "Object interaction mode.");
  
-       prop= RNA_def_property(srna, "layers", PROP_BOOLEAN, PROP_NONE);
+       prop= RNA_def_property(srna, "layers", PROP_BOOLEAN, PROP_LAYER_MEMBER);
        RNA_def_property_boolean_sdna(prop, NULL, "lay", 1);
        RNA_def_property_array(prop, 20);
        RNA_def_property_ui_text(prop, "Layers", "Layers the object is on.");
        RNA_def_property_int_sdna(prop, NULL, "actcol");
        RNA_def_property_int_funcs(prop, "rna_Object_active_material_index_get", "rna_Object_active_material_index_set", "rna_Object_active_material_index_range");
        RNA_def_property_ui_text(prop, "Active Material Index", "Index of active material slot.");
+       RNA_def_property_update(prop, NC_OBJECT|ND_SHADING, NULL);
+       
        /* transform */
  
        prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_TRANSLATION);
        /* matrix */
        prop= RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX);
        RNA_def_property_float_sdna(prop, NULL, "obmat");
-       RNA_def_property_array(prop, 16);
+       RNA_def_property_multi_array(prop, 2, matrix_dimsize);
        RNA_def_property_ui_text(prop, "Matrix", "Transformation matrix.");
 +      RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Object_matrix_update");
  
        /* collections */
        prop= RNA_def_property(srna, "constraints", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_struct_type(prop, "VertexGroup");
        RNA_def_property_pointer_funcs(prop, "rna_Object_active_vertex_group_get", "rna_Object_active_vertex_group_set", NULL);
        RNA_def_property_ui_text(prop, "Active Vertex Group", "Vertex groups of the object.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
+       RNA_def_property_update(prop, 0, "rna_Object_update_data");
  
        prop= RNA_def_property(srna, "active_vertex_group_index", PROP_INT, PROP_NONE);
        RNA_def_property_int_sdna(prop, NULL, "actdef");
        RNA_def_property_int_funcs(prop, "rna_Object_active_vertex_group_index_get", "rna_Object_active_vertex_group_index_set", "rna_Object_active_vertex_group_index_range");
        RNA_def_property_ui_text(prop, "Active Vertex Group Index", "Active index in vertex group array.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
+       RNA_def_property_update(prop, 0, "rna_Object_update_data");
  
        /* empty */
  
        RNA_def_property_ui_text(prop, "Dupli Frames Off", "Recurring frames to exclude from the Dupliframes.");
        RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update");
  
 +      prop= RNA_def_property(srna, "dupli_list", PROP_COLLECTION, PROP_NONE);
 +      RNA_def_property_collection_sdna(prop, NULL, "duplilist", NULL);
 +      RNA_def_property_struct_type(prop, "DupliObject");
 +      RNA_def_property_ui_text(prop, "Dupli list", "Object duplis.");
 +
 +
        /* time offset */
  
        prop= RNA_def_property(srna, "time_offset", PROP_FLOAT, PROP_NONE|PROP_UNIT_TIME);
        RNA_def_property_ui_text(prop, "X-Ray", "Makes the object draw in front of others.");
        RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
        
+       /* Grease Pencil */
+       prop= RNA_def_property(srna, "grease_pencil", PROP_POINTER, PROP_NONE);
+       RNA_def_property_pointer_sdna(prop, NULL, "gpd");
+       RNA_def_property_flag(prop, PROP_EDITABLE);
+       RNA_def_property_struct_type(prop, "GreasePencil");
+       RNA_def_property_ui_text(prop, "Grease Pencil Data", "Grease Pencil datablock");
+       
        /* pose */
        prop= RNA_def_property(srna, "pose_library", PROP_POINTER, PROP_NONE);
        RNA_def_property_pointer_sdna(prop, NULL, "poselib");
        RNA_def_property_boolean_funcs(prop, NULL, "rna_Object_shape_key_lock_set");
        RNA_def_property_ui_text(prop, "Shape Key Lock", "Always show the current Shape for this Object.");
        RNA_def_property_ui_icon(prop, ICON_UNPINNED, 1);
-       RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
+       RNA_def_property_update(prop, 0, "rna_Object_update_data");
  
        prop= RNA_def_property(srna, "active_shape_key", PROP_POINTER, PROP_NONE);
        RNA_def_property_struct_type(prop, "ShapeKey");
        RNA_def_property_int_sdna(prop, NULL, "shapenr");
        RNA_def_property_int_funcs(prop, "rna_Object_active_shape_key_index_get", "rna_Object_active_shape_key_index_set", "rna_Object_active_shape_key_index_range");
        RNA_def_property_ui_text(prop, "Active Shape Key Index", "Current shape key index.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_GEOM_DATA, "rna_Object_update_data");
+       RNA_def_property_update(prop, 0, "rna_Object_update_data");
  
        RNA_api_object(srna);
  }
  
 +static void rna_def_dupli_object(BlenderRNA *brna)
 +{
 +      StructRNA *srna;
 +      PropertyRNA *prop;
 +
 +      srna= RNA_def_struct(brna, "DupliObject", NULL);
 +      RNA_def_struct_sdna(srna, "DupliObject");
 +      RNA_def_struct_ui_text(srna, "Dupli Object", "Dupli Object data."); 
 +      /* RNA_def_struct_ui_icon(srna, ICON_OBJECT_DATA); */
 +
 +      prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
 +      /* RNA_def_property_struct_type(prop, "Object"); */
 +      RNA_def_property_pointer_sdna(prop, NULL, "ob");
 +      /* RNA_def_property_pointer_funcs(prop, "rna_DupliObject_object_get", NULL, NULL); */
 +      RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 +      RNA_def_property_ui_text(prop, "Object", "Object this DupliObject represents.");
 +
 +      prop= RNA_def_property(srna, "ob_matrix", PROP_FLOAT, PROP_MATRIX);
 +      RNA_def_property_float_sdna(prop, NULL, "omat");
 +      RNA_def_property_array(prop, 16);
 +      RNA_def_property_ui_text(prop, "Object Matrix", "Object transformation matrix.");
 +
 +      prop= RNA_def_property(srna, "matrix", PROP_FLOAT, PROP_MATRIX);
 +      RNA_def_property_float_sdna(prop, NULL, "mat");
 +      RNA_def_property_array(prop, 16);
 +      RNA_def_property_ui_text(prop, "DupliObject Matrix", "DupliObject transformation matrix.");
 +
 +      /* TODO: DupliObject has more properties that can be wrapped */
 +}
 +
  void RNA_def_object(BlenderRNA *brna)
  {
        rna_def_object(brna);
        rna_def_object_game_settings(brna);
        rna_def_vertex_group(brna);
        rna_def_material_slot(brna);
 +      rna_def_dupli_object(brna);
  }
  
  #endif
  
  #include <stdlib.h>
  #include <stdio.h>
 +#include <string.h>
 +#include <time.h>
  
  #include "RNA_define.h"
  #include "RNA_types.h"
  
 +#include "DNA_object_types.h"
 +
 +#include "BLO_sys_types.h" /* needed for intptr_t used in ED_mesh.h */
 +
 +#include "ED_mesh.h"
 +
  #ifdef RNA_RUNTIME
  
 -#include "MEM_guardedalloc.h"
 +#include "BKE_main.h"
 +#include "BKE_global.h"
 +#include "BKE_context.h"
 +#include "BKE_report.h"
 +#include "BKE_object.h"
 +#include "BKE_mesh.h"
 +#include "BKE_DerivedMesh.h"
  
  #include "BKE_customdata.h"
 -#include "BKE_DerivedMesh.h"
 +#include "BKE_anim.h"
 +#include "BKE_depsgraph.h"
 +#include "BKE_displist.h"
 +#include "BKE_font.h"
 +#include "BKE_mball.h"
 +
 +#include "BLI_arithb.h"
  
  #include "DNA_mesh_types.h"
  #include "DNA_scene_types.h"
 +#include "DNA_meshdata_types.h"
 +#include "DNA_curve_types.h"
 +#include "DNA_modifier_types.h"
  
 -/* copied from init_render_mesh (render code) */
 -Mesh *rna_Object_create_render_mesh(Object *ob, Scene *scene)
 +#include "MEM_guardedalloc.h"
 +
 +/* copied from Mesh_getFromObject and adapted to RNA interface */
 +/* settings: 0 - preview, 1 - render */
 +static Mesh *rna_Object_create_mesh(Object *ob, bContext *C, ReportList *reports, int apply_modifiers, int settings)
  {
 -      CustomDataMask mask = CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL;
 -      DerivedMesh *dm;
 -      Mesh *me;
 +      Mesh *tmpmesh;
 +      Curve *tmpcu = NULL;
 +      Object *tmpobj = NULL;
 +      int render = settings, i;
 +      int cage = !apply_modifiers;
 +      Scene *sce = CTX_data_scene(C);
 +
 +      /* perform the mesh extraction based on type */
 +      switch (ob->type) {
 +      case OB_FONT:
 +      case OB_CURVE:
 +      case OB_SURF:
 +
 +              /* copies object and modifiers (but not the data) */
 +              tmpobj= copy_object(ob);
 +              tmpcu = (Curve *)tmpobj->data;
 +              tmpcu->id.us--;
 +
 +              /* if getting the original caged mesh, delete object modifiers */
 +              if( cage )
 +                      object_free_modifiers(tmpobj);
 +
 +              /* copies the data */
 +              tmpobj->data = copy_curve( (Curve *) ob->data );
 +
 +#if 0
 +              /* copy_curve() sets disp.first null, so currently not need */
 +              {
 +                      Curve *cu;
 +                      cu = (Curve *)tmpobj->data;
 +                      if( cu->disp.first )
 +                              MEM_freeN( cu->disp.first );
 +                      cu->disp.first = NULL;
 +              }
        
 -      /* TODO: other types */
 -      if(ob->type != OB_MESH)
 -              return NULL;
 +#endif
 +
 +              /* get updated display list, and convert to a mesh */
 +              makeDispListCurveTypes( sce, tmpobj, 0 );
 +              nurbs_to_mesh( tmpobj );
 +              
 +              /* nurbs_to_mesh changes the type to a mesh, check it worked */
 +              if (tmpobj->type != OB_MESH) {
 +                      free_libblock_us( &G.main->object, tmpobj );
 +                      BKE_report(reports, RPT_ERROR, "cant convert curve to mesh. Does the curve have any segments?");
 +                      return NULL;
 +              }
 +              tmpmesh = tmpobj->data;
 +              free_libblock_us( &G.main->object, tmpobj );
 +              break;
 +
 +      case OB_MBALL:
 +              /* metaballs don't have modifiers, so just convert to mesh */
 +              ob = find_basis_mball( sce, ob );
 +              tmpmesh = add_mesh("Mesh");
 +              mball_to_mesh( &ob->disp, tmpmesh );
 +              break;
 +
 +      case OB_MESH:
 +              /* copies object and modifiers (but not the data) */
 +              if (cage) {
 +                      /* copies the data */
 +                      tmpmesh = copy_mesh( ob->data );
 +              /* if not getting the original caged mesh, get final derived mesh */
 +              } else {
 +                      /* Make a dummy mesh, saves copying */
 +                      DerivedMesh *dm;
 +                      /* CustomDataMask mask = CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL; */
 +                      CustomDataMask mask = CD_MASK_MESH; /* this seems more suitable, exporter,
 +                                                                                                 for example, needs CD_MASK_MDEFORMVERT */
 +                      
 +                      /* Write the display mesh into the dummy mesh */
 +                      if (render)
 +                              dm = mesh_create_derived_render( sce, ob, mask );
 +                      else
 +                              dm = mesh_create_derived_view( sce, ob, mask );
 +                      
 +                      tmpmesh = add_mesh( "Mesh" );
 +                      DM_to_mesh( dm, tmpmesh );
 +                      dm->release( dm );
 +              }
 +              
 +              break;
 +      default:
 +              BKE_report(reports, RPT_ERROR, "Object does not have geometry data");
 +              return NULL;
 +      }
 +
 +      /* Copy materials to new mesh */
 +      switch (ob->type) {
 +      case OB_SURF:
 +              tmpmesh->totcol = tmpcu->totcol;                
 +              
 +              /* free old material list (if it exists) and adjust user counts */
 +              if( tmpcu->mat ) {
 +                      for( i = tmpcu->totcol; i-- > 0; ) {
 +                              /* are we an object material or data based? */
 +                              if (ob->colbits & 1<<i) 
 +                                      tmpmesh->mat[i] = ob->mat[i];
 +                              else 
 +                                      tmpmesh->mat[i] = tmpcu->mat[i];
 +
 +                              if (tmpmesh->mat[i]) 
 +                                      tmpmesh->mat[i]->id.us++;
 +                      }
 +              }
 +              break;
 +
 +#if 0
 +      /* Crashes when assigning the new material, not sure why */
 +      case OB_MBALL:
 +              tmpmb = (MetaBall *)ob->data;
 +              tmpmesh->totcol = tmpmb->totcol;
 +              
 +              /* free old material list (if it exists) and adjust user counts */
 +              if( tmpmb->mat ) {
 +                      for( i = tmpmb->totcol; i-- > 0; ) {
 +                              tmpmesh->mat[i] = tmpmb->mat[i]; /* CRASH HERE ??? */
 +                              if (tmpmesh->mat[i]) {
 +                                      tmpmb->mat[i]->id.us++;
 +                              }
 +                      }
 +              }
 +              break;
 +#endif
 +
 +      case OB_MESH:
 +              if (!cage) {
 +                      Mesh *origmesh= ob->data;
 +                      tmpmesh->flag= origmesh->flag;
 +                      tmpmesh->mat = MEM_dupallocN(origmesh->mat);
 +                      tmpmesh->totcol = origmesh->totcol;
 +                      tmpmesh->smoothresh= origmesh->smoothresh;
 +                      if( origmesh->mat ) {
 +                              for( i = origmesh->totcol; i-- > 0; ) {
 +                                      /* are we an object material or data based? */
 +                                      if (ob->colbits & 1<<i)
 +                                              tmpmesh->mat[i] = ob->mat[i];
 +                                      else
 +                                              tmpmesh->mat[i] = origmesh->mat[i];
 +                                      if (tmpmesh->mat[i])
 +                                              tmpmesh->mat[i]->id.us++;
 +                              }
 +                      }
 +              }
 +              break;
 +      } /* end copy materials */
 +
 +      /* we don't assign it to anything */
 +      tmpmesh->id.us--;
        
 -      dm= mesh_create_derived_render(scene, ob, mask);
 +      /* make sure materials get updated in objects */
 +      test_object_materials( ( ID * ) tmpmesh );
 +
 +      return tmpmesh;
 +}
 +
 +/* When no longer needed, duplilist should be freed with Object.free_duplilist */
 +static void rna_Object_create_duplilist(Object *ob, bContext *C, ReportList *reports)
 +{
 +      if (!(ob->transflag & OB_DUPLI)) {
 +              BKE_report(reports, RPT_ERROR, "Object does not have duplis.");
 +              return;
 +      }
 +
 +      /* free duplilist if a user forgets to */
 +      if (ob->duplilist) {
 +              BKE_reportf(reports, RPT_WARNING, "Object.dupli_list has not been freed.");
 +
 +              free_object_duplilist(ob->duplilist);
 +              ob->duplilist= NULL;
 +      }
 +
 +      ob->duplilist= object_duplilist(CTX_data_scene(C), ob);
 +
 +      /* ob->duplilist should now be freed with Object.free_duplilist */
 +}
 +
 +static void rna_Object_free_duplilist(Object *ob, ReportList *reports)
 +{
 +      if (ob->duplilist) {
 +              free_object_duplilist(ob->duplilist);
 +              ob->duplilist= NULL;
 +      }
 +}
 +
 +static void rna_Object_convert_to_triface(Object *ob, bContext *C, ReportList *reports, Scene *sce)
 +{
 +      Mesh *me;
 +      int ob_editing = CTX_data_edit_object(C) == ob;
 +
 +      if (ob->type != OB_MESH) {
 +              BKE_report(reports, RPT_ERROR, "Object should be of type MESH.");
 +              return;
 +      }
  
 -      if(!dm)
 -              return NULL;
 +      me= (Mesh*)ob->data;
  
 -      me= add_mesh("tmp_render_mesh");
 -      me->id.us--; /* we don't assign it to anything */
 -      DM_to_mesh(dm, me);
 -      dm->release(dm);
 +      if (!ob_editing)
 +              make_editMesh(sce, ob);
  
 +      /* select all */
 +      EM_select_all(me->edit_mesh);
  
 -      {       /* update the material */
 -              short i, *totcol =give_totcolp(ob);
 +      convert_to_triface(me->edit_mesh, 0);
  
 -              /* free the current material list */
 -              if(me->mat)
 -                      MEM_freeN((void *)me->mat);
 +      load_editMesh(sce, ob);
  
 -              me->mat= (Material **)MEM_callocN(sizeof(void *)*(*totcol), "matarray");
 +      if (!ob_editing)
 +              free_editMesh(me->edit_mesh);
  
-       DAG_object_flush_update(sce, ob, OB_RECALC_DATA);
 -              for(i=0; i<*totcol; i++) {
 -                      Material *mat= give_current_material(ob, i+1);
 -                      if(mat) {
 -                              me->mat[i]= mat;
 -                              mat->id.us++;
++      DAG_id_flush_update(ob, OB_RECALC_DATA);
 +}
 +
 +static bDeformGroup *rna_Object_add_vertex_group(Object *ob, char *group_name)
 +{
-       return add_defgroup_name(ob, group_name);
++      return ED_vgroup_add_name(ob, group_name);
 +}
 +
 +static void rna_Object_add_vertex_to_group(Object *ob, int vertex_index, bDeformGroup *def, float weight, int assignmode)
 +{
 +      /* creates dverts if needed */
-       add_vert_to_defgroup(ob, def, vertex_index, weight, assignmode);
++      ED_vgroup_vert_add(ob, def, vertex_index, weight, assignmode);
 +}
 +
 +/* copied from old API Object.makeDisplayList (Object.c) */
 +static void rna_Object_make_display_list(Object *ob, bContext *C)
 +{
 +      Scene *sce= CTX_data_scene(C);
 +
 +      if (ob->type == OB_FONT) {
 +              Curve *cu = ob->data;
 +              freedisplist(&cu->disp);
 +              BKE_text_to_curve(sce, ob, CU_LEFT);
 +      }
 +
-       DAG_object_flush_update(sce, ob, OB_RECALC_DATA);
++      DAG_id_flush_update(ob, OB_RECALC_DATA);
 +}
 +
 +static Object *rna_Object_find_armature(Object *ob)
 +{
 +      Object *ob_arm = NULL;
 +
 +      if (ob->type != OB_MESH) return NULL;
 +
 +      if (ob->parent && ob->partype == PARSKEL && ob->parent->type == OB_ARMATURE) {
 +              ob_arm = ob->parent;
 +      }
 +      else {
 +              ModifierData *mod = (ModifierData*)ob->modifiers.first;
 +              while (mod) {
 +                      if (mod->type == eModifierType_Armature) {
 +                              ob_arm = ((ArmatureModifierData*)mod)->object;
                        }
 +
 +                      mod = mod->next;
                }
        }
  
 -      return me;
 +      return ob_arm;
 +}
 +
 +int rna_Object_is_visible(Object *ob, bContext *C)
 +{
 +      return ob->lay & CTX_data_scene(C)->lay;
 +}
 +
 +/*
 +static void rna_Mesh_assign_verts_to_group(Object *ob, bDeformGroup *group, int *indices, int totindex, float weight, int assignmode)
 +{
 +      if (ob->type != OB_MESH) {
 +              BKE_report(reports, RPT_ERROR, "Object should be of MESH type.");
 +              return;
 +      }
 +
 +      Mesh *me = (Mesh*)ob->data;
 +      int group_index = get_defgroup_num(ob, group);
 +      if (group_index == -1) {
 +              BKE_report(reports, RPT_ERROR, "No deform groups assigned to mesh.");
 +              return;
 +      }
 +
 +      if (assignmode != WEIGHT_REPLACE && assignmode != WEIGHT_ADD && assignmode != WEIGHT_SUBTRACT) {
 +              BKE_report(reports, RPT_ERROR, "Bad assignment mode." );
 +              return;
 +      }
 +
 +      // makes a set of dVerts corresponding to the mVerts
 +      if (!me->dvert) 
 +              create_dverts(&me->id);
 +
 +      // loop list adding verts to group 
 +      for (i= 0; i < totindex; i++) {
 +              if(i < 0 || i >= me->totvert) {
 +                      BKE_report(reports, RPT_ERROR, "Bad vertex index in list.");
 +                      return;
 +              }
 +
 +              add_vert_defnr(ob, group_index, i, weight, assignmode);
 +      }
  }
 +*/
  
  #else
  
  void RNA_api_object(StructRNA *srna)
  {
        FunctionRNA *func;
 -      PropertyRNA *prop;
 -
 -      func= RNA_def_function(srna, "create_render_mesh", "rna_Object_create_render_mesh");
 -      RNA_def_function_ui_description(func, "Create a Mesh datablock with all modifiers applied.");
 -      prop= RNA_def_pointer(func, "scene", "Scene", "", "");
 -      RNA_def_property_flag(prop, PROP_REQUIRED);
 -      prop= RNA_def_pointer(func, "mesh", "Mesh", "", "Mesh created from object, remove it if it is only used for export.");
 -      RNA_def_function_return(func, prop);
 +      PropertyRNA *parm;
 +
 +      static EnumPropertyItem mesh_type_items[] = {
 +              {0, "PREVIEW", 0, "Preview", "Apply modifier preview settings."},
 +              {1, "RENDER", 0, "Render", "Apply modifier render settings."},
 +              {0, NULL, 0, NULL, NULL}
 +      };
 +
 +      static EnumPropertyItem assign_mode_items[] = {
 +              {WEIGHT_REPLACE, "REPLACE", 0, "Replace", "Replace."}, /* TODO: more meaningful descriptions */
 +              {WEIGHT_ADD, "ADD", 0, "Add", "Add."},
 +              {WEIGHT_SUBTRACT, "SUBTRACT", 0, "Subtract", "Subtract."},
 +              {0, NULL, 0, NULL, NULL}
 +      };
 +
 +      /* mesh */
 +      func= RNA_def_function(srna, "create_mesh", "rna_Object_create_mesh");
 +      RNA_def_function_ui_description(func, "Create a Mesh datablock with modifiers applied.");
 +      RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
 +      parm= RNA_def_boolean(func, "apply_modifiers", 0, "", "Apply modifiers.");
 +      RNA_def_property_flag(parm, PROP_REQUIRED);
 +      parm= RNA_def_enum(func, "settings", mesh_type_items, 0, "", "Modifier settings to apply.");
 +      RNA_def_property_flag(parm, PROP_REQUIRED);
 +      parm= RNA_def_pointer(func, "mesh", "Mesh", "", "Mesh created from object, remove it if it is only used for export.");
 +      RNA_def_function_return(func, parm);
 +
 +      func= RNA_def_function(srna, "convert_to_triface", "rna_Object_convert_to_triface");
 +      RNA_def_function_ui_description(func, "Convert all mesh faces to triangles.");
 +      RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
 +      parm= RNA_def_pointer(func, "scene", "Scene", "", "Scene where the object belongs.");
 +      RNA_def_property_flag(parm, PROP_REQUIRED);
 +
 +      /* duplis */
 +      func= RNA_def_function(srna, "create_dupli_list", "rna_Object_create_duplilist");
 +      RNA_def_function_ui_description(func, "Create a list of dupli objects for this object, needs to be freed manually with free_dupli_list.");
 +      RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
 +
 +      func= RNA_def_function(srna, "free_dupli_list", "rna_Object_free_duplilist");
 +      RNA_def_function_ui_description(func, "Free the list of dupli objects.");
 +      RNA_def_function_flag(func, FUNC_USE_REPORTS);
 +
 +      /* vertex groups */
 +      func= RNA_def_function(srna, "add_vertex_group", "rna_Object_add_vertex_group");
 +      RNA_def_function_ui_description(func, "Add vertex group to object.");
 +      parm= RNA_def_string(func, "name", "Group", 0, "", "Vertex group name."); /* optional */
 +      parm= RNA_def_pointer(func, "group", "VertexGroup", "", "New vertex group.");
 +      RNA_def_function_return(func, parm);
 +
 +      func= RNA_def_function(srna, "add_vertex_to_group", "rna_Object_add_vertex_to_group");
 +      RNA_def_function_ui_description(func, "Add vertex to a vertex group.");
 +      parm= RNA_def_int(func, "vertex_index", 0, 0, 0, "", "Vertex index.", 0, 0);
 +      RNA_def_property_flag(parm, PROP_REQUIRED);
 +      parm= RNA_def_pointer(func, "group", "VertexGroup", "", "Vertex group to add vertex to.");
 +      RNA_def_property_flag(parm, PROP_REQUIRED);
 +      parm= RNA_def_float(func, "weight", 0, 0.0f, 1.0f, "", "Vertex weight.", 0.0f, 1.0f);
 +      RNA_def_property_flag(parm, PROP_REQUIRED);
 +      parm= RNA_def_enum(func, "type", assign_mode_items, 0, "", "Vertex assign mode.");
 +      RNA_def_property_flag(parm, PROP_REQUIRED);
 +
 +      /* Armature */
 +      func= RNA_def_function(srna, "find_armature", "rna_Object_find_armature");
 +      RNA_def_function_ui_description(func, "Find armature influencing this object as a parent or via a modifier.");
 +      parm= RNA_def_pointer(func, "ob_arm", "Object", "", "Armature object influencing this object or NULL.");
 +      RNA_def_function_return(func, parm);
 +
 +      /* DAG */
 +      func= RNA_def_function(srna, "make_display_list", "rna_Object_make_display_list");
 +      RNA_def_function_ui_description(func, "Update object's display data."); /* XXX describe better */
 +      RNA_def_function_flag(func, FUNC_USE_CONTEXT);
 +
 +      /* View */
 +      func= RNA_def_function(srna, "is_visible", "rna_Object_is_visible");
 +      RNA_def_function_ui_description(func, "Determine if object is visible in active scene.");
 +      RNA_def_function_flag(func, FUNC_USE_CONTEXT);
 +      parm= RNA_def_boolean(func, "is_visible", 0, "", "Object visibility.");
 +      RNA_def_function_return(func, parm);
  }
  
  #endif
@@@ -55,7 -55,7 +55,7 @@@ static void rna_Pose_update(bContext *C
  {
        // XXX when to use this? ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK);
  
-       DAG_object_flush_update(CTX_data_scene(C), ptr->id.data, OB_RECALC_DATA);
+       DAG_id_flush_update(ptr->id.data, OB_RECALC_DATA);
  }
  
  static char *rna_PoseChannel_path(PointerRNA *ptr)
@@@ -124,12 -124,73 +124,73 @@@ static void rna_PoseChannel_euler_rotat
  {
        bPoseChannel *pchan= ptr->data;
  
-       if(pchan->rotmode == PCHAN_ROT_QUAT)
+       if(pchan->rotmode == PCHAN_ROT_QUAT) /* default XYZ eulers when using quats... */
                EulToQuat((float*)value, pchan->quat);
        else
                VECCOPY(pchan->eul, value);
  }
  
+ static void rna_PoseChannel_rotation_mode_set(PointerRNA *ptr, int value)
+ {
+       bPoseChannel *pchan= ptr->data;
+       
+       /* check if any change - if so, need to convert data */
+       // TODO: this needs to be generalised at some point to work for objects too...
+       if (value > 0) { /* to euler */
+               if (pchan->rotmode == PCHAN_ROT_AXISANGLE) {
+                       /* axis-angle to euler */
+                       float m[3][3];
+                       
+                       /* convert to 3x3 matrix, then to euler 
+                        *      - axis angle is stored in quats
+                        */
+                       VecRotToMat3(&pchan->quat[1], pchan->quat[0], m);
+                       Mat3ToEulO(m, pchan->eul, value);
+               }
+               else if (pchan->rotmode == PCHAN_ROT_QUAT) {
+                       /* quat to euler */
+                       QuatToEulO(pchan->quat, pchan->eul, value);
+               }
+               /* else { no conversion needed } */
+       }
+       else if (value == PCHAN_ROT_QUAT) { /* to quat */
+               if (pchan->rotmode == PCHAN_ROT_AXISANGLE) {
+                       /* axis angle to quat */
+                       float q[4];
+                       
+                       /* copy to temp var first, since quats and axis-angle are stored in same place */
+                       QuatCopy(q, pchan->quat);
+                       AxisAngleToQuat(q, &pchan->quat[1], pchan->quat[0]);
+               }
+               else if (pchan->rotmode > 0) {
+                       /* euler to quat */
+                       EulOToQuat(pchan->eul, pchan->rotmode, pchan->quat);
+               }
+               /* else { no conversion needed } */
+       }
+       else { /* to axis-angle */
+               if (pchan->rotmode > 0) {
+                       /* euler to axis angle */
+                       float q[4];
+                       
+                       /* convert to temp quat, then to axis angle (since stored in same var) */
+                       EulOToQuat(pchan->eul, pchan->rotmode, q);
+                       QuatToAxisAngle(q, &pchan->quat[1], &pchan->quat[0]);
+               }
+               else if (pchan->rotmode == PCHAN_ROT_QUAT) {
+                       /* quat to axis angle */
+                       float q[4];
+                       
+                       /* copy to temp var first, since quats and axis-angle are stored in same place */
+                       QuatCopy(q, pchan->quat);
+                       QuatToAxisAngle(q, &pchan->quat[1], &pchan->quat[0]);
+               }
+       }
+       
+       /* finally, set the new rotation type */
+       pchan->rotmode= value;
+ }
  static void rna_PoseChannel_name_set(PointerRNA *ptr, const char *value)
  {
        Object *ob= (Object*)ptr->id.data;
@@@ -151,12 -212,72 +212,72 @@@ static int rna_PoseChannel_has_ik_get(P
        return ED_pose_channel_in_IK_chain(ob, pchan);
  }
  
+ static PointerRNA rna_PoseChannel_bone_group_get(PointerRNA *ptr)
+ {
+       Object *ob= (Object*)ptr->id.data;
+       bPose *pose= (ob) ? ob->pose : NULL;
+       bPoseChannel *pchan= (bPoseChannel*)ptr->data;
+       bActionGroup *grp;
+       
+       if (pose)
+               grp= BLI_findlink(&pose->agroups, pchan->agrp_index-1);
+       else
+               grp= NULL;
+       
+       return rna_pointer_inherit_refine(ptr, &RNA_BoneGroup, grp);
+ }
+ static void rna_PoseChannel_bone_group_set(PointerRNA *ptr, PointerRNA value)
+ {
+       Object *ob= (Object*)ptr->id.data;
+       bPose *pose= (ob) ? ob->pose : NULL;
+       bPoseChannel *pchan= (bPoseChannel*)ptr->data;
+       
+       if (pose)
+               pchan->agrp_index= BLI_findindex(&pose->agroups, value.data) + 1;
+       else
+               pchan->agrp_index= 0;
+ }
+ static int rna_PoseChannel_bone_group_index_get(PointerRNA *ptr)
+ {
+       bPoseChannel *pchan= (bPoseChannel*)ptr->data;
+       return MAX2(pchan->agrp_index-1, 0);
+ }
+ static void rna_PoseChannel_bone_group_index_set(PointerRNA *ptr, int value)
+ {
+       bPoseChannel *pchan= (bPoseChannel*)ptr->data;
+       pchan->agrp_index= value+1;
+ }
+ static void rna_PoseChannel_bone_group_index_range(PointerRNA *ptr, int *min, int *max)
+ {
+       Object *ob= (Object*)ptr->id.data;
+       bPose *pose= (ob) ? ob->pose : NULL;
+       
+       *min= 0;
+       
+       if (pose) {
+               *max= BLI_countlist(&pose->agroups)-1;
+               *max= MAX2(0, *max);
+       }
+       else
+               *max= 0;
+ }
  static PointerRNA rna_Pose_active_bone_group_get(PointerRNA *ptr)
  {
        bPose *pose= (bPose*)ptr->data;
        return rna_pointer_inherit_refine(ptr, &RNA_BoneGroup, BLI_findlink(&pose->agroups, pose->active_group-1));
  }
  
+ static void rna_Pose_active_bone_group_set(PointerRNA *ptr, PointerRNA value)
+ {
+       bPose *pose= (bPose*)ptr->data;
+       pose->active_group= BLI_findindex(&pose->agroups, value.data) + 1;
+ }
  static int rna_Pose_active_bone_group_index_get(PointerRNA *ptr)
  {
        bPose *pose= (bPose*)ptr->data;
@@@ -265,6 -386,7 +386,7 @@@ static void rna_def_bone_group(BlenderR
        srna= RNA_def_struct(brna, "BoneGroup", NULL);
        RNA_def_struct_sdna(srna, "bActionGroup");
        RNA_def_struct_ui_text(srna, "Bone Group", "Groups of Pose Channels (Bones).");
+       RNA_def_struct_ui_icon(srna, ICON_GROUP_BONE);
        
        /* name */
        prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
@@@ -293,7 -415,13 +415,13 @@@ static void rna_def_pose_channel(Blende
  {
        static EnumPropertyItem prop_rotmode_items[] = {
                {PCHAN_ROT_QUAT, "QUATERNION", 0, "Quaternion (WXYZ)", "No Gimbal Lock (default)"},
-               {PCHAN_ROT_EUL, "EULER", 0, "Euler (XYZ)", "Prone to Gimbal Lock"},
+               {PCHAN_ROT_XYZ, "XYZ", 0, "XYZ Euler", "XYZ Rotation Order. Prone to Gimbal Lock"},
+               {PCHAN_ROT_XZY, "XZY", 0, "XZY Euler", "XZY Rotation Order. Prone to Gimbal Lock"},
+               {PCHAN_ROT_YXZ, "YXZ", 0, "YXZ Euler", "YXZ Rotation Order. Prone to Gimbal Lock"},
+               {PCHAN_ROT_YZX, "YZX", 0, "YZX Euler", "YZX Rotation Order. Prone to Gimbal Lock"},
+               {PCHAN_ROT_ZXY, "ZXY", 0, "ZXY Euler", "ZXY Rotation Order. Prone to Gimbal Lock"},
+               {PCHAN_ROT_ZYX, "ZYX", 0, "ZYX Euler", "ZYX Rotation Order. Prone to Gimbal Lock"},
+               //{PCHAN_ROT_AXISANGLE, "AXIS_ANGLE", 0, "Axis Angle", "Axis Angle (W+XYZ). Defines a rotation around some axis defined by 3D-Vector."},
                {0, NULL, 0, NULL, NULL}};
        
        StructRNA *srna;
        RNA_def_struct_ui_text(srna, "Pose Channel", "Channel defining pose data for a bone in a Pose.");
        RNA_def_struct_path_func(srna, "rna_PoseChannel_path");
        RNA_def_struct_idproperties_func(srna, "rna_PoseChannel_idproperties");
+       
+       /* Bone Constraints */
        prop= RNA_def_property(srna, "constraints", PROP_COLLECTION, PROP_NONE);
        RNA_def_property_struct_type(prop, "Constraint");
        RNA_def_property_ui_text(prop, "Constraints", "Constraints that act on this PoseChannel."); 
  
+       /* Name + Selection Status */
        prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
        RNA_def_property_string_funcs(prop, NULL, NULL, "rna_PoseChannel_name_set");
        RNA_def_property_ui_text(prop, "Name", "");
        RNA_def_struct_name_property(srna, prop);
-       prop= RNA_def_property(srna, "has_ik", PROP_BOOLEAN, PROP_NONE);
-       RNA_def_property_boolean_funcs(prop,  "rna_PoseChannel_has_ik_get", NULL);
-       RNA_def_property_clear_flag(prop, PROP_EDITABLE);
-       RNA_def_property_ui_text(prop, "Has IK", "Is part of an IK chain.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
-       prop= RNA_def_property(srna, "ik_dof_x", PROP_BOOLEAN, PROP_NONE);
-       RNA_def_property_boolean_negative_sdna(prop, NULL, "ikflag", BONE_IK_NO_XDOF);
-       RNA_def_property_ui_text(prop, "IK X DoF", "Allow movement around the X axis.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
-       prop= RNA_def_property(srna, "ik_dof_y", PROP_BOOLEAN, PROP_NONE);
-       RNA_def_property_boolean_negative_sdna(prop, NULL, "ikflag", BONE_IK_NO_YDOF);
-       RNA_def_property_ui_text(prop, "IK Y DoF", "Allow movement around the Y axis.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
-       prop= RNA_def_property(srna, "ik_dof_z", PROP_BOOLEAN, PROP_NONE);
-       RNA_def_property_boolean_negative_sdna(prop, NULL, "ikflag", BONE_IK_NO_ZDOF);
-       RNA_def_property_ui_text(prop, "IK Z DoF", "Allow movement around the Z axis.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
-       prop= RNA_def_property(srna, "ik_limit_x", PROP_BOOLEAN, PROP_NONE);
-       RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_XLIMIT);
-       RNA_def_property_ui_text(prop, "IK X Limit", "Limit movement around the X axis.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
-       prop= RNA_def_property(srna, "ik_limit_y", PROP_BOOLEAN, PROP_NONE);
-       RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_YLIMIT);
-       RNA_def_property_ui_text(prop, "IK Y Limit", "Limit movement around the Y axis.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
-       prop= RNA_def_property(srna, "ik_limit_z", PROP_BOOLEAN, PROP_NONE);
-       RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_ZLIMIT);
-       RNA_def_property_ui_text(prop, "IK Z Limit", "Limit movement around the Z axis.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
        
        prop= RNA_def_property(srna, "selected", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "selectflag", BONE_SELECTED);
        RNA_def_property_ui_text(prop, "Selected", "");
-       
-       prop= RNA_def_property(srna, "bone_group_index", PROP_INT, PROP_NONE);
-       RNA_def_property_int_sdna(prop, NULL, "agrp_index");
-       RNA_def_property_ui_text(prop, "Bone Group Index", "Bone Group this pose channel belongs to (0=no group).");
  
+       /* Baked Bone Path cache data s*/
        prop= RNA_def_property(srna, "path_start_frame", PROP_INT, PROP_TIME);
        RNA_def_property_int_sdna(prop, NULL, "pathsf");
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Bone Paths Calculation End Frame", "End frame of range of frames to use for Bone Path calculations.");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       
+       /* Relationships to other bones */
        prop= RNA_def_property(srna, "bone", PROP_POINTER, PROP_NEVER_NULL);
        RNA_def_property_struct_type(prop, "Bone");
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_struct_type(prop, "PoseChannel");
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Child", "Child of this pose channel.");
+       
+       /* Transformation settings */
        prop= RNA_def_property(srna, "location", PROP_FLOAT, PROP_TRANSLATION);
        RNA_def_property_float_sdna(prop, NULL, "loc");
        RNA_def_property_ui_text(prop, "Location", "");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Pose_update");
  
        prop= RNA_def_property(srna, "scale", PROP_FLOAT, PROP_XYZ);
        RNA_def_property_float_sdna(prop, NULL, "size");
        RNA_def_property_ui_text(prop, "Scale", "");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Pose_update");
  
        prop= RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_QUATERNION);
        RNA_def_property_float_sdna(prop, NULL, "quat");
        RNA_def_property_ui_text(prop, "Rotation", "Rotation in Quaternions.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Pose_update");
        
        prop= RNA_def_property(srna, "euler_rotation", PROP_FLOAT, PROP_EULER);
        RNA_def_property_float_sdna(prop, NULL, "eul");
        RNA_def_property_float_funcs(prop, "rna_PoseChannel_euler_rotation_get", "rna_PoseChannel_euler_rotation_set", NULL);
        RNA_def_property_ui_text(prop, "Rotation (Euler)", "Rotation in Eulers.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_TRANSFORM, "rna_Pose_update");
        
        prop= RNA_def_property(srna, "rotation_mode", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "rotmode");
        RNA_def_property_enum_items(prop, prop_rotmode_items);
+       RNA_def_property_enum_funcs(prop, NULL, "rna_PoseChannel_rotation_mode_set", NULL);
        RNA_def_property_ui_text(prop, "Rotation Mode", "");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
  
        /* These three matrix properties await an implementation of the PROP_MATRIX subtype, which currently doesn't exist. */
 -/*    prop= RNA_def_property(srna, "channel_matrix", PROP_FLOAT, PROP_MATRIX);
 -      RNA_def_property_struct_type(prop, "chan_mat");
 +      prop= RNA_def_property(srna, "channel_matrix", PROP_FLOAT, PROP_MATRIX);
 +      RNA_def_property_float_sdna(prop, NULL, "chan_mat");
 +      RNA_def_property_array(prop, 16);
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 -      RNA_def_property_ui_text(prop, "Channel Matrix", "4x4 matrix, before constraints.");*/
 +      RNA_def_property_ui_text(prop, "Channel Matrix", "4x4 matrix, before constraints.");
  
        /* kaito says this should be not user-editable; I disagree; power users should be able to force this in python; he's the boss. */
 -/*    prop= RNA_def_property(srna, "pose_matrix", PROP_FLOAT, PROP_MATRIX);
 -      RNA_def_property_struct_type(prop, "pose_mat");
 +      prop= RNA_def_property(srna, "pose_matrix", PROP_FLOAT, PROP_MATRIX);
 +      RNA_def_property_float_sdna(prop, NULL, "pose_mat");
 +      RNA_def_property_array(prop, 16);
        RNA_def_property_clear_flag(prop, PROP_EDITABLE); 
        RNA_def_property_ui_text(prop, "Pose Matrix", "Final 4x4 matrix for this channel.");
  
 +      /*
        prop= RNA_def_property(srna, "constraint_inverse_matrix", PROP_FLOAT, PROP_MATRIX);
        RNA_def_property_struct_type(prop, "constinv");
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 -      RNA_def_property_ui_text(prop, "Constraint Inverse Matrix", "4x4 matrix, defines transform from final position to unconstrained position."); */
 +      RNA_def_property_ui_text(prop, "Constraint Inverse Matrix", "4x4 matrix, defines transform from final position to unconstrained position.");
 +      */
        
+       /* Head/Tail Coordinates (in Pose Space) - Automatically calculated... */
        prop= RNA_def_property(srna, "pose_head", PROP_FLOAT, PROP_TRANSLATION);
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Pose Head Position", "Location of head of the channel's bone.");
        prop= RNA_def_property(srna, "pose_tail", PROP_FLOAT, PROP_TRANSLATION);
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Pose Tail Position", "Location of tail of the channel's bone.");
+       
+       /* IK Settings */
+       prop= RNA_def_property(srna, "has_ik", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_funcs(prop,  "rna_PoseChannel_has_ik_get", NULL);
+       RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+       RNA_def_property_ui_text(prop, "Has IK", "Is part of an IK chain.");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
  
+       prop= RNA_def_property(srna, "ik_dof_x", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_negative_sdna(prop, NULL, "ikflag", BONE_IK_NO_XDOF);
+       RNA_def_property_ui_text(prop, "IK X DoF", "Allow movement around the X axis.");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+       prop= RNA_def_property(srna, "ik_dof_y", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_negative_sdna(prop, NULL, "ikflag", BONE_IK_NO_YDOF);
+       RNA_def_property_ui_text(prop, "IK Y DoF", "Allow movement around the Y axis.");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+       prop= RNA_def_property(srna, "ik_dof_z", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_negative_sdna(prop, NULL, "ikflag", BONE_IK_NO_ZDOF);
+       RNA_def_property_ui_text(prop, "IK Z DoF", "Allow movement around the Z axis.");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+       prop= RNA_def_property(srna, "ik_limit_x", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_XLIMIT);
+       RNA_def_property_ui_text(prop, "IK X Limit", "Limit movement around the X axis.");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+       prop= RNA_def_property(srna, "ik_limit_y", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_YLIMIT);
+       RNA_def_property_ui_text(prop, "IK Y Limit", "Limit movement around the Y axis.");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+       prop= RNA_def_property(srna, "ik_limit_z", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "ikflag", BONE_IK_ZLIMIT);
+       RNA_def_property_ui_text(prop, "IK Z Limit", "Limit movement around the Z axis.");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+       
        prop= RNA_def_property(srna, "ik_min_x", PROP_FLOAT, PROP_ANGLE);
        RNA_def_property_float_sdna(prop, NULL, "limitmin[0]");
        RNA_def_property_range(prop, -180.0f, 0.0f);
        RNA_def_property_ui_text(prop, "IK X Minimum", "Minimum angles for IK Limit");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
  
        prop= RNA_def_property(srna, "ik_max_x", PROP_FLOAT, PROP_ANGLE);
        RNA_def_property_float_sdna(prop, NULL, "limitmax[0]");
        RNA_def_property_range(prop, 0.0f, 180.0f);
        RNA_def_property_ui_text(prop, "IK X Maximum", "Maximum angles for IK Limit");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
  
        prop= RNA_def_property(srna, "ik_min_y", PROP_FLOAT, PROP_ANGLE);
        RNA_def_property_float_sdna(prop, NULL, "limitmin[1]");
        RNA_def_property_range(prop, -180.0f, 0.0f);
        RNA_def_property_ui_text(prop, "IK Y Minimum", "Minimum angles for IK Limit");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
  
        prop= RNA_def_property(srna, "ik_max_y", PROP_FLOAT, PROP_ANGLE);
        RNA_def_property_float_sdna(prop, NULL, "limitmax[1]");
        RNA_def_property_range(prop, 0.0f, 180.0f);
        RNA_def_property_ui_text(prop, "IK Y Maximum", "Maximum angles for IK Limit");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
  
        prop= RNA_def_property(srna, "ik_min_z", PROP_FLOAT, PROP_ANGLE);
        RNA_def_property_float_sdna(prop, NULL, "limitmin[2]");
        RNA_def_property_range(prop, -180.0f, 0.0f);
        RNA_def_property_ui_text(prop, "IK Z Minimum", "Minimum angles for IK Limit");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
  
        prop= RNA_def_property(srna, "ik_max_z", PROP_FLOAT, PROP_ANGLE);
        RNA_def_property_float_sdna(prop, NULL, "limitmax[2]");
        RNA_def_property_range(prop, 0.0f, 180.0f);
        RNA_def_property_ui_text(prop, "IK Z Maximum", "Maximum angles for IK Limit");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
  
        prop= RNA_def_property(srna, "ik_stiffness_x", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "stiffness[0]");
        RNA_def_property_range(prop, 0.0f, 0.99f);
        RNA_def_property_ui_text(prop, "IK X Stiffness", "IK stiffness around the X axis.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
  
        prop= RNA_def_property(srna, "ik_stiffness_y", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "stiffness[1]");
        RNA_def_property_range(prop, 0.0f, 0.99f);
        RNA_def_property_ui_text(prop, "IK Y Stiffness", "IK stiffness around the Y axis.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
  
        prop= RNA_def_property(srna, "ik_stiffness_z", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "stiffness[2]");
        RNA_def_property_range(prop, 0.0f, 0.99f);
        RNA_def_property_ui_text(prop, "IK Z Stiffness", "IK stiffness around the Z axis.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
  
        prop= RNA_def_property(srna, "ik_stretch", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "ikstretch");
        RNA_def_property_range(prop, 0.0f,1.0f);
        RNA_def_property_ui_text(prop, "IK Stretch", "Allow scaling of the bone for IK.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
-       prop= RNA_def_property(srna, "custom", PROP_POINTER, PROP_NONE);
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+       
+       /* custom bone shapes */
+       prop= RNA_def_property(srna, "custom_shape", PROP_POINTER, PROP_NONE);
+       RNA_def_property_pointer_sdna(prop, NULL, "custom");
+       RNA_def_property_struct_type(prop, "Object");
+       RNA_def_property_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Custom Object", "Object that defines custom draw type for this bone.");
-       RNA_def_property_update(prop, NC_OBJECT|ND_POSE|ND_TRANSFORM, "rna_Pose_update");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+       
+       /* bone groups */
+       prop= RNA_def_property(srna, "bone_group_index", PROP_INT, PROP_NONE);
+       RNA_def_property_int_sdna(prop, NULL, "agrp_index");
+       RNA_def_property_flag(prop, PROP_EDITABLE);
+       RNA_def_property_int_funcs(prop, "rna_PoseChannel_bone_group_index_get", "rna_PoseChannel_bone_group_index_set", "rna_PoseChannel_bone_group_index_range");
+       RNA_def_property_ui_text(prop, "Bone Group Index", "Bone Group this pose channel belongs to (0=no group).");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+       
+       prop= RNA_def_property(srna, "bone_group", PROP_POINTER, PROP_NONE);
+       RNA_def_property_struct_type(prop, "BoneGroup");
+       RNA_def_property_flag(prop, PROP_EDITABLE);
+       RNA_def_property_pointer_funcs(prop, "rna_PoseChannel_bone_group_get", "rna_PoseChannel_bone_group_set", NULL);
+       RNA_def_property_ui_text(prop, "Bone Group", "Bone Group this pose channel belongs to");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
+       
+       /* transform locks */
        prop= RNA_def_property(srna, "lock_location", PROP_BOOLEAN, PROP_XYZ);
        RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_LOCX);
        RNA_def_property_array(prop, 3);
        RNA_def_property_ui_text(prop, "Lock Location", "Lock editing of location in the interface.");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
  
        prop= RNA_def_property(srna, "lock_rotation", PROP_BOOLEAN, PROP_XYZ);
        RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_ROTX);
        RNA_def_property_array(prop, 3);
        RNA_def_property_ui_text(prop, "Lock Rotation", "Lock editing of rotation in the interface.");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
  
        prop= RNA_def_property(srna, "lock_scale", PROP_BOOLEAN, PROP_XYZ);
        RNA_def_property_boolean_sdna(prop, NULL, "protectflag", OB_LOCK_SCALEX);
        RNA_def_property_array(prop, 3);
        RNA_def_property_ui_text(prop, "Lock Scale", "Lock editing of scale in the interface.");
+       RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
  }
  
  static void rna_def_pose(BlenderRNA *brna)
  
        prop= RNA_def_property(srna, "active_bone_group", PROP_POINTER, PROP_NONE);
        RNA_def_property_struct_type(prop, "BoneGroup");
+       RNA_def_property_flag(prop, PROP_EDITABLE);
        RNA_def_property_pointer_funcs(prop, "rna_Pose_active_bone_group_get", "rna_Pose_active_bone_group_set", NULL);
-       RNA_def_property_ui_text(prop, "Active Bone Group", "Bone groups of the pose.");
+       RNA_def_property_ui_text(prop, "Active Bone Group", "Active bone group for this pose.");
        RNA_def_property_update(prop, NC_OBJECT|ND_POSE, "rna_Pose_update");
  
        prop= RNA_def_property(srna, "active_bone_group_index", PROP_INT, PROP_NONE);
index 42bb52d,0000000..40bb131
mode 100644,000000..100644
--- /dev/null
@@@ -1,54 -1,0 +1,56 @@@
 +/**
++ * $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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 + *
 + * The Original Code is Copyright (C) 2009 Blender Foundation.
 + * All rights reserved.
 + *
 + * 
 + * Contributor(s): Blender Foundation
 + *
 + * ***** END GPL LICENSE BLOCK *****
 + */
 +
 +#include <stdlib.h>
 +#include <stdio.h>
 +#include <string.h>
 +#include <time.h>
 +
 +#include "RNA_define.h"
 +#include "RNA_types.h"
 +
 +#include "DNA_object_types.h"
 +
 +/* #include "BLO_sys_types.h" */
 +
 +#ifdef RNA_RUNTIME
 +
 +/* #include "DNA_anim_types.h" */
 +#include "DNA_action_types.h" /* bPose */
 +
 +#else
 +
 +void RNA_api_pose(StructRNA *srna)
 +{
 +      /* FunctionRNA *func; */
 +      /* PropertyRNA *parm; */
 +
 +}
 +
 +#endif
 +
@@@ -1,5 -1,5 +1,5 @@@
  /**
-  * $Id: rna_object_api.c 21115 2009-06-23 19:17:59Z kazanbas $
 - * $Id:
++ * $Id$
   *
   * ***** BEGIN GPL LICENSE BLOCK *****
   *
@@@ -21,7 -21,7 +21,7 @@@
   * All rights reserved.
   *
   * 
-  * Contributor(s): Blender Foundation
 - * Contributor(s): Joshua Leung
++ * Contributor(s): Arystanbek Dyussenov, Joshua Leung
   *
   * ***** END GPL LICENSE BLOCK *****
   */
  #include <stdio.h>
  
  #include "RNA_define.h"
+ #include "RNA_enum_types.h"
  #include "RNA_types.h"
  
+ #include "DNA_anim_types.h"
  #include "DNA_object_types.h"
  #include "DNA_scene_types.h"
  
  #ifdef RNA_RUNTIME
  
+ #include "BKE_animsys.h"
 +#include "BKE_scene.h"
 +#include "BKE_depsgraph.h"
  
 -// Scene API stuff from kazanbas branch here...
 +#include "ED_object.h"
  
 +#include "WM_api.h"
 +
 +static void rna_Scene_add_object(Scene *sce, ReportList *reports, Object *ob)
 +{
 +      Base *base= object_in_scene(ob, sce);
 +      if (base) {
 +              BKE_report(reports, RPT_ERROR, "Object is already in this scene.");
 +              return;
 +      }
 +      base= scene_add_base(sce, ob);
 +      ob->id.us++;
 +
 +      /* this is similar to what object_add_type and add_object do */
 +      ob->lay= base->lay= sce->lay;
 +      ob->recalc |= OB_RECALC;
 +
 +      DAG_scene_sort(sce);
 +}
 +
 +static void rna_Scene_remove_object(Scene *sce, ReportList *reports, Object *ob)
 +{
 +      Base *base= object_in_scene(ob, sce);
 +      if (!base) {
 +              BKE_report(reports, RPT_ERROR, "Object is not in this scene.");
 +              return;
 +      }
 +      /* as long as ED_base_object_free_and_unlink calls free_libblock_us, we don't have to decrement ob->id.us */
 +      ED_base_object_free_and_unlink(sce, base);
 +}
 +
 +static void rna_Scene_set_frame(Scene *sce, bContext *C, int frame)
 +{
 +      sce->r.cfra= frame;
 +      CLAMP(sce->r.cfra, MINAFRAME, MAXFRAME);
 +      scene_update_for_newframe(sce, (1<<20) - 1);
 +
 +      WM_event_add_notifier(C, NC_SCENE|ND_FRAME, sce);
 +}
  
+ static KeyingSet *rna_Scene_add_keying_set(Scene *sce, ReportList *reports, 
+               char name[], int absolute, int insertkey_needed, int insertkey_visual)
+ {
+       KeyingSet *ks= NULL;
+       short flag=0, keyingflag=0;
+       
+       /* validate flags */
+       if (absolute)
+               flag |= KEYINGSET_ABSOLUTE;
+       if (insertkey_needed)
+               keyingflag |= INSERTKEY_NEEDED;
+       if (insertkey_visual)
+               keyingflag |= INSERTKEY_MATRIX;
+               
+       /* call the API func, and set the active keyingset index */
+       ks= BKE_keyingset_add(&sce->keyingsets, name, flag, keyingflag);
+       
+       if (ks) {
+               sce->active_keyingset= BLI_countlist(&sce->keyingsets);
+               return ks;
+       }
+       else {
+               BKE_report(reports, RPT_ERROR, "Keying Set could not be added.");
+               return NULL;
+       }
+ }
  #else
  
  void RNA_api_scene(StructRNA *srna)
  {
        FunctionRNA *func;
        PropertyRNA *parm;
 -      
 -      // Scene API stuff from kazanbas branch here...
 -      
 +
 +      func= RNA_def_function(srna, "add_object", "rna_Scene_add_object");
 +      RNA_def_function_ui_description(func, "Add object to scene.");
 +      RNA_def_function_flag(func, FUNC_USE_REPORTS);
 +      parm= RNA_def_pointer(func, "object", "Object", "", "Object to add to scene.");
 +      RNA_def_property_flag(parm, PROP_REQUIRED);
 +
 +      func= RNA_def_function(srna, "remove_object", "rna_Scene_remove_object");
 +      RNA_def_function_ui_description(func, "Remove object from scene.");
 +      RNA_def_function_flag(func, FUNC_USE_REPORTS);
 +      parm= RNA_def_pointer(func, "object", "Object", "", "Object to remove from scene.");
 +      RNA_def_property_flag(parm, PROP_REQUIRED);
 +
 +      func= RNA_def_function(srna, "set_frame", "rna_Scene_set_frame");
 +      RNA_def_function_flag(func, FUNC_USE_CONTEXT);
 +      RNA_def_function_ui_description(func, "Set scene frame updating all objects immediately.");
 +      parm= RNA_def_int(func, "frame", 0, MINAFRAME, MAXFRAME, "", "Frame number to set.", MINAFRAME, MAXFRAME);
 +      RNA_def_property_flag(parm, PROP_REQUIRED);
++
+       /* Add Keying Set */
+       func= RNA_def_function(srna, "add_keying_set", "rna_Scene_add_keying_set");
+       RNA_def_function_ui_description(func, "Add a new Keying Set to Scene.");
+       RNA_def_function_flag(func, FUNC_USE_REPORTS);
 -              /* returns the new KeyingSet */
++      /* returns the new KeyingSet */
+       parm= RNA_def_pointer(func, "keyingset", "KeyingSet", "", "Newly created Keying Set.");
 -              RNA_def_function_return(func, parm);
 -              /* name */
++      RNA_def_function_return(func, parm);
++      /* name */
+       RNA_def_string(func, "name", "KeyingSet", 64, "Name", "Name of Keying Set");
 -              /* flags */
++      /* flags */
+       RNA_def_boolean(func, "absolute", 1, "Absolute", "Keying Set defines specific paths/settings to be keyframed (i.e. is not reliant on context info)");
 -              /* keying flags */
++      /* keying flags */
+       RNA_def_boolean(func, "insertkey_needed", 0, "Insert Keyframes - Only Needed", "Only insert keyframes where they're needed in the relevant F-Curves.");
+       RNA_def_boolean(func, "insertkey_visual", 0, "Insert Keyframes - Visual", "Insert keyframes based on 'visual transforms'.");
  }
  
  #endif
--
index 0000000,988c8f8..48f2fef
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,188 +1,189 @@@
 -#define MARRAY_DIM [3][4][5]
 -#define MARRAY_TOTDIM 3
 -#define MARRAY_DIMSIZE 4, 5
 -#define MARRAY_SIZE(type) (sizeof(type MARRAY_DIM) / sizeof(type))
 -#define DYNAMIC_MARRAY_DIM [3][4][5]
 -#define DYNAMIC_MARRAY_SIZE(type) (sizeof(type DYNAMIC_MARRAY_DIM) / sizeof(type))
+ /**
+  * $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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+  *
+  * Contributor(s): Arystanbek Dyussenov
+  *
+  * ***** END GPL LICENSE BLOCK *****
+  */
+ /* Defines a structure with properties used for array manipulation tests in BPY. */
+ #include <stdlib.h>
+ #include <string.h>
+ #include "RNA_define.h"
+ #include "RNA_types.h"
+ #include "rna_internal.h"
+ #define ARRAY_SIZE 3
+ #define DYNAMIC_ARRAY_SIZE 64
 -#define DEF_VARS(type, prefix)                                                                \
 -      static type prefix ## arr[ARRAY_SIZE];                                  \
 -      static type prefix ## darr[DYNAMIC_ARRAY_SIZE];                 \
 -      static int prefix ## darr_len= ARRAY_SIZE;                              \
 -      static type prefix ## marr MARRAY_DIM;                                  \
 -      static type prefix ## dmarr DYNAMIC_MARRAY_DIM;                 \
++#define MULTI_ARRAY_DIM [3][4][5]
++#define MULTI_ARRAY_TOTDIM 3
++#define MULTI_ARRAY_LENGTH 3, 4, 5
++#define MULTI_ARRAY_SIZE(type) (sizeof(type MULTI_ARRAY_DIM) / sizeof(type))
++#define DYNAMIC_MULTI_ARRAY_DIM [3][4][5]
++#define DYNAMIC_MULTI_ARRAY_SIZE(type) (sizeof(type DYNAMIC_MULTI_ARRAY_DIM) / sizeof(type))
+ #ifdef RNA_RUNTIME
+ #ifdef UNIT_TEST
 -      }                                                                                                                                       \
++#define DEF_VARS(type, prefix)                                                                        \
++      static type prefix ## arr[ARRAY_SIZE];                                          \
++      static type prefix ## darr[DYNAMIC_ARRAY_SIZE];                         \
++      static int prefix ## darr_len= ARRAY_SIZE;                                      \
++      static type prefix ## marr MULTI_ARRAY_DIM;                                     \
++      static type prefix ## dmarr DYNAMIC_MULTI_ARRAY_DIM;            \
+       static int prefix ## dmarr_len= sizeof(prefix ## dmarr);
+ #define DEF_GET_SET(type, arr)                                                                                        \
+       void rna_Test_ ## arr ## _get(PointerRNA *ptr, type *values)            \
+       {                                                                                                                                       \
+               memcpy(values, arr, sizeof(arr));                                                               \
+       }                                                                                                                                       \
+                                                                                                                                               \
+       void rna_Test_ ## arr ## _set(PointerRNA *ptr, const type *values)      \
+       {                                                                                                                                       \
+               memcpy(arr, values, sizeof(arr));                                                               \
+       }
+ #define DEF_GET_SET_LEN(arr, max)                                                                             \
+       static int rna_Test_ ## arr ## _get_length(PointerRNA *ptr)                     \
+       {                                                                                                                                       \
+               return arr ## _len;                                                                                             \
 -DEF_GET_SET_LEN(fdmarr, DYNAMIC_MARRAY_SIZE(float))
++      }/*                                                                                                                                     \
+                                                                                                                                               \
+       static int rna_Test_ ## arr ## _set_length(PointerRNA *ptr, int length) \
+       {                                                                                                                                       \
+               if (length > max)                                                                                               \
+                       return 0;                                                                                                       \
+                                                                                                                                               \
+               arr ## _len= length;                                                                                    \
+                                                                                                                                               \
+               return 1;                                                                                                               \
+       }                                                                                                                                       \
++       */
+ DEF_VARS(float, f)
+ DEF_VARS(int, i)
+ DEF_VARS(int, b)
+ DEF_GET_SET(float, farr)
+ DEF_GET_SET(int, iarr)
+ DEF_GET_SET(int, barr)
+ DEF_GET_SET(float, fmarr)
+ DEF_GET_SET(int, imarr)
+ DEF_GET_SET(int, bmarr)
+ DEF_GET_SET(float, fdarr)
+ DEF_GET_SET_LEN(fdarr, DYNAMIC_ARRAY_SIZE)
+ DEF_GET_SET(int, idarr)
+ DEF_GET_SET_LEN(idarr, DYNAMIC_ARRAY_SIZE)
+ DEF_GET_SET(int, bdarr)
+ DEF_GET_SET_LEN(bdarr, DYNAMIC_ARRAY_SIZE)
+ DEF_GET_SET(float, fdmarr)
 -DEF_GET_SET_LEN(idmarr, DYNAMIC_MARRAY_SIZE(int))
++DEF_GET_SET_LEN(fdmarr, DYNAMIC_MULTI_ARRAY_SIZE(float))
+ DEF_GET_SET(int, idmarr)
 -DEF_GET_SET_LEN(bdmarr, DYNAMIC_MARRAY_SIZE(int))
++DEF_GET_SET_LEN(idmarr, DYNAMIC_MULTI_ARRAY_SIZE(int))
+ DEF_GET_SET(int, bdmarr)
 -      unsigned short dimsize[]= {MARRAY_DIMSIZE};
++DEF_GET_SET_LEN(bdmarr, DYNAMIC_MULTI_ARRAY_SIZE(int))
+ #endif
+ #else
+ void RNA_def_test(BlenderRNA *brna)
+ {
+ #ifdef UNIT_TEST
+       StructRNA *srna;
+       PropertyRNA *prop;
 -      RNA_def_property_dynamic_array_funcs(prop, "rna_Test_fdarr_get_length", "rna_Test_fdarr_set_length");
++      int dimsize[]= {MULTI_ARRAY_LENGTH};
+       srna= RNA_def_struct(brna, "Test", NULL);
+       RNA_def_struct_sdna(srna, "Test");
+       prop= RNA_def_float_array(srna, "farr", ARRAY_SIZE, NULL, 0.0f, 0.0f, "farr", "float array", 0.0f, 0.0f);
+       RNA_def_property_float_funcs(prop, "rna_Test_farr_get", "rna_Test_farr_set", NULL);
+       prop= RNA_def_int_array(srna, "iarr", ARRAY_SIZE, NULL, 0, 0, "iarr", "int array", 0, 0);
+       RNA_def_property_int_funcs(prop, "rna_Test_iarr_get", "rna_Test_iarr_set", NULL);
+       prop= RNA_def_boolean_array(srna, "barr", ARRAY_SIZE, NULL, "barr", "boolean array");
+       RNA_def_property_boolean_funcs(prop, "rna_Test_barr_get", "rna_Test_barr_set");
+       /* dynamic arrays */
+       prop= RNA_def_float_array(srna, "fdarr", DYNAMIC_ARRAY_SIZE, NULL, 0.0f, 0.0f, "fdarr", "dynamic float array", 0.0f, 0.0f);
+       RNA_def_property_flag(prop, PROP_DYNAMIC);
 -      RNA_def_property_dynamic_array_funcs(prop, "rna_Test_idarr_get_length", "rna_Test_idarr_set_length");
++      RNA_def_property_dynamic_array_funcs(prop, "rna_Test_fdarr_get_length");
+       RNA_def_property_float_funcs(prop, "rna_Test_fdarr_get", "rna_Test_fdarr_set", NULL);
+       prop= RNA_def_int_array(srna, "idarr", DYNAMIC_ARRAY_SIZE, NULL, 0, 0, "idarr", "int array", 0, 0);
+       RNA_def_property_flag(prop, PROP_DYNAMIC);
 -      RNA_def_property_dynamic_array_funcs(prop, "rna_Test_bdarr_get_length", "rna_Test_bdarr_set_length");
++      RNA_def_property_dynamic_array_funcs(prop, "rna_Test_idarr_get_length");
+       RNA_def_property_int_funcs(prop, "rna_Test_idarr_get", "rna_Test_idarr_set", NULL);
+       
+       prop= RNA_def_boolean_array(srna, "bdarr", DYNAMIC_ARRAY_SIZE, NULL, "bdarr", "boolean array");
+       RNA_def_property_flag(prop, PROP_DYNAMIC);
 -      RNA_def_property_multidimensional_array(prop, MARRAY_SIZE(float), MARRAY_TOTDIM, dimsize);
++      RNA_def_property_dynamic_array_funcs(prop, "rna_Test_bdarr_get_length");
+       RNA_def_property_boolean_funcs(prop, "rna_Test_bdarr_get", "rna_Test_bdarr_set");
+       /* multidimensional arrays */
+       prop= RNA_def_property(srna, "fmarr", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_multidimensional_array(prop, MARRAY_SIZE(int), MARRAY_TOTDIM, dimsize);
++      RNA_def_property_multi_array(prop, MULTI_ARRAY_TOTDIM, dimsize);
+       RNA_def_property_float_funcs(prop, "rna_Test_fmarr_get", "rna_Test_fmarr_set", NULL);
+       prop= RNA_def_property(srna, "imarr", PROP_INT, PROP_NONE);
 -      RNA_def_property_multidimensional_array(prop, MARRAY_SIZE(int), MARRAY_TOTDIM, dimsize);
++      RNA_def_property_multi_array(prop, MULTI_ARRAY_TOTDIM, dimsize);
+       RNA_def_property_int_funcs(prop, "rna_Test_imarr_get", "rna_Test_imarr_set", NULL);
+       prop= RNA_def_property(srna, "bmarr", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_multidimensional_array(prop, DYNAMIC_MARRAY_SIZE(float), MARRAY_TOTDIM, dimsize);
++      RNA_def_property_multi_array(prop, MULTI_ARRAY_TOTDIM, dimsize);
+       RNA_def_property_boolean_funcs(prop, "rna_Test_bmarr_get", "rna_Test_bmarr_set");
+       /* dynamic multidimensional arrays */
+       prop= RNA_def_property(srna, "fdmarr", PROP_FLOAT, PROP_NONE);
 -      RNA_def_property_dynamic_array_funcs(prop, "rna_Test_fdmarr_get_length", "rna_Test_fdmarr_set_length");
++      RNA_def_property_multi_array(prop, MULTI_ARRAY_TOTDIM, dimsize);
+       RNA_def_property_flag(prop, PROP_DYNAMIC);
 -      RNA_def_property_multidimensional_array(prop, DYNAMIC_MARRAY_SIZE(int), MARRAY_TOTDIM, dimsize);
++      RNA_def_property_dynamic_array_funcs(prop, "rna_Test_fdmarr_get_length");
+       RNA_def_property_float_funcs(prop, "rna_Test_fdmarr_get", "rna_Test_fdmarr_set", NULL);
+       prop= RNA_def_property(srna, "idmarr", PROP_INT, PROP_NONE);
 -      RNA_def_property_dynamic_array_funcs(prop, "rna_Test_idmarr_get_length", "rna_Test_idmarr_set_length");
++      RNA_def_property_multi_array(prop, MULTI_ARRAY_TOTDIM, dimsize);
+       RNA_def_property_flag(prop, PROP_DYNAMIC);
 -      RNA_def_property_multidimensional_array(prop, DYNAMIC_MARRAY_SIZE(int), MARRAY_TOTDIM, dimsize);
++      RNA_def_property_dynamic_array_funcs(prop, "rna_Test_idmarr_get_length");
+       RNA_def_property_int_funcs(prop, "rna_Test_idmarr_get", "rna_Test_idmarr_set", NULL);
+       prop= RNA_def_property(srna, "bdmarr", PROP_BOOLEAN, PROP_NONE);
 -      RNA_def_property_dynamic_array_funcs(prop, "rna_Test_bdmarr_get_length", "rna_Test_bdmarr_set_length");
++      RNA_def_property_multi_array(prop, MULTI_ARRAY_TOTDIM, dimsize);
+       RNA_def_property_flag(prop, PROP_DYNAMIC);
++      RNA_def_property_dynamic_array_funcs(prop, "rna_Test_bdmarr_get_length");
+       RNA_def_property_boolean_funcs(prop, "rna_Test_bdmarr_get", "rna_Test_bdmarr_set");
+ #endif
+ }
+ #endif        /* RNA_RUNTIME */
@@@ -1,5 -1,5 +1,5 @@@
  /**
-- * $Id:
++ * $Id$
   *
   * ***** BEGIN GPL LICENSE BLOCK *****
   *
  
  #ifdef RNA_RUNTIME
  
+ static void rna_uiItemR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, char *propname, int expand, int slider, int toggle)
+ {
+       int flag= 0;
+       flag |= (slider)? UI_ITEM_R_SLIDER: 0;
+       flag |= (expand)? UI_ITEM_R_EXPAND: 0;
+       flag |= (toggle)? UI_ITEM_R_TOGGLE: 0;
+       uiItemR(layout, name, icon, ptr, propname, flag);
+ }
+ static PointerRNA rna_uiItemO(uiLayout *layout, char *name, int icon, char *opname, int properties)
+ {
+       int flag= (properties)? UI_ITEM_O_RETURN_PROPS: 0;
+       return uiItemFullO(layout, name, icon, opname, NULL, uiLayoutGetOperatorContext(layout), flag);
+ }
  #else
  
  #define DEF_ICON(name) {name, #name, 0, #name, ""},
@@@ -122,7 -139,7 +139,7 @@@ void RNA_api_ui_layout(StructRNA *srna
        RNA_def_float(func, "percentage", 0.0f, 0.0f, 1.0f, "Percentage", "Percentage of width to split at.", 0.0f, 1.0f);
  
        /* items */
-       func= RNA_def_function(srna, "itemR", "uiItemR");
+       func= RNA_def_function(srna, "itemR", "rna_uiItemR");
        api_ui_item_common(func);
        api_ui_item_rna_common(func);
        RNA_def_boolean(func, "expand", 0, "", "Expand button to show more detail.");
        parm= RNA_def_string(func, "search_property", "", 0, "", "Identifier of search collection property.");
        RNA_def_property_flag(parm, PROP_REQUIRED);
  
-       func= RNA_def_function(srna, "itemO", "uiItemO");
+       func= RNA_def_function(srna, "itemO", "rna_uiItemO");
        api_ui_item_op_common(func);
+       parm= RNA_def_boolean(func, "properties", 0, "Properties", "Return operator properties to fill in manually.");
+       parm= RNA_def_pointer(func, "return_properties", "OperatorProperties", "", "Operator properties to fill in, return when 'properties' is set to true.");
+       RNA_def_property_flag(parm, PROP_REQUIRED|PROP_RNAPTR);
+       RNA_def_function_return(func, parm);
  
        func= RNA_def_function(srna, "item_enumO", "uiItemEnumO_string");
        api_ui_item_op_common(func);
        RNA_def_function_flag(func, FUNC_USE_CONTEXT);
        api_ui_item_rna_common(func);
        RNA_def_string(func, "new", "", 0, "", "Operator identifier to create a new ID block.");
+       RNA_def_string(func, "open", "", 0, "", "Operator identifier to open a file for creating a new ID block.");
        RNA_def_string(func, "unlink", "", 0, "", "Operator identifier to unlink the ID block.");
  
        func= RNA_def_function(srna, "template_modifier", "uiTemplateModifier");
        func= RNA_def_function(srna, "template_header_3D", "uiTemplateHeader3D");
        RNA_def_function_flag(func, FUNC_USE_CONTEXT);
  
-       func= RNA_def_function(srna, "view3d_select_metaballmenu", "uiTemplate_view3d_select_metaballmenu");
-       RNA_def_function_flag(func, FUNC_USE_CONTEXT);
-       func= RNA_def_function(srna, "view3d_select_armaturemenu", "uiTemplate_view3d_select_armaturemenu");
-       RNA_def_function_flag(func, FUNC_USE_CONTEXT);
-       func= RNA_def_function(srna, "view3d_select_posemenu", "uiTemplate_view3d_select_posemenu");
-       RNA_def_function_flag(func, FUNC_USE_CONTEXT);
        func= RNA_def_function(srna, "view3d_select_faceselmenu", "uiTemplate_view3d_select_faceselmenu");
        RNA_def_function_flag(func, FUNC_USE_CONTEXT);
  
@@@ -1,13 -1,37 +1,37 @@@
+ /**
+  * $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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+  *
+  * Contributor(s): Michel Selten, Willian P. Germano, Stephen Swaney,
+  * Chris Keith, Chris Want, Ken Hughes, Campbell Barton
+  *
+  * ***** END GPL LICENSE BLOCK *****
+  */
+  
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <sys/stat.h>
  
- #ifndef WIN32
- #include <dirent.h>
- #else
- #include "BLI_winstuff.h"
+ /* grr, python redefines */
+ #ifdef _POSIX_C_SOURCE
+ #undef _POSIX_C_SOURCE
  #endif
  
  #include <Python.h>
  #include "bpy_rna.h"
  #include "bpy_operator.h"
  #include "bpy_ui.h"
 +#include "bpy_sys.h"
  #include "bpy_util.h"
  
+ #ifndef WIN32
+ #include <dirent.h>
+ #else
+ #include "BLI_winstuff.h"
+ #endif
  #include "DNA_anim_types.h"
  #include "DNA_space_types.h"
  #include "DNA_text_types.h"
@@@ -27,6 -56,7 +57,7 @@@
  #include "MEM_guardedalloc.h"
  
  #include "BLI_util.h"
+ #include "BLI_storage.h"
  #include "BLI_fileops.h"
  #include "BLI_string.h"
  
@@@ -141,10 -171,7 +172,10 @@@ static void bpy_init_modules( void 
        PyModule_AddObject( mod, "props", BPY_rna_props() );
        PyModule_AddObject( mod, "__ops__", BPY_operator_module() ); /* ops is now a python module that does the conversion from SOME_OT_foo -> some.foo */
        PyModule_AddObject( mod, "ui", BPY_ui_module() ); // XXX very experimental, consider this a test, especially PyCObject is not meant to be permanent
 -      
 +
 +      /* Arystan: this module is used by i/o scripts for bpy.sys.expandpath() and others. It should be renamed/move? */
 +      PyModule_AddObject( mod, "sys", BPY_sys_module() );
 +
        /* add the module so we can import it */
        PyDict_SetItemString(PySys_GetObject("modules"), "bpy", mod);
        Py_DECREF(mod);
@@@ -166,6 -193,7 +197,6 @@@ void BPY_update_modules( void 
  
        /* refreshes the main struct */
        BPY_update_rna_module();
 -
  }
  
  /*****************************************************************************
@@@ -592,7 -620,7 +623,7 @@@ void BPY_run_ui_scripts(bContext *C, in
                                }
                        }
  #ifndef __linux__
-                       else if( BLI_join_dirfile(path, dirname, de->d_name), S_ISDIR(BLI_exists(path))) {
+                       else if( BLI_join_dirfile(path, dirname, de->d_name), S_ISDIR(BLI_exist(path))) {
  #else
                        else if(de->d_type==DT_DIR) {
                                BLI_join_dirfile(path, dirname, de->d_name);
@@@ -130,6 -130,70 +130,70 @@@ Mathutils_Callback mathutils_rna_matrix
        (BaseMathSetIndexFunc)  NULL
  };
  
+ PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
+ {
+       PyObject *ret= NULL;
+ #ifdef USE_MATHUTILS
+       int type, subtype, totdim;
+       int len;
+       len= RNA_property_array_length(ptr, prop);
+       type= RNA_property_type(prop);
+       subtype= RNA_property_subtype(prop);
+       totdim= RNA_property_array_dimension(ptr, prop, NULL);
+       if (type != PROP_FLOAT) return NULL;
+       if (totdim == 1 || (totdim == 2 && subtype == PROP_MATRIX)) {
+               ret = pyrna_prop_CreatePyObject(ptr, prop);
+               switch(RNA_property_subtype(prop)) {
+               case PROP_TRANSLATION:
+               case PROP_DIRECTION:
+               case PROP_VELOCITY:
+               case PROP_ACCELERATION:
+               case PROP_XYZ:
+                       if(len>=2 && len <= 4) {
+                               PyObject *vec_cb= newVectorObject_cb(ret, len, mathutils_rna_array_cb_index, FALSE);
+                               Py_DECREF(ret); /* the vector owns now */
+                               ret= vec_cb; /* return the vector instead */
+                       }
+                       break;
+               case PROP_MATRIX:
+                       if(len==16) {
+                               PyObject *mat_cb= newMatrixObject_cb(ret, 4,4, mathutils_rna_matrix_cb_index, FALSE);
+                               Py_DECREF(ret); /* the matrix owns now */
+                               ret= mat_cb; /* return the matrix instead */
+                       }
+                       else if (len==9) {
+                               PyObject *mat_cb= newMatrixObject_cb(ret, 3,3, mathutils_rna_matrix_cb_index, FALSE);
+                               Py_DECREF(ret); /* the matrix owns now */
+                               ret= mat_cb; /* return the matrix instead */
+                       }
+                       break;
+               case PROP_EULER:
+               case PROP_QUATERNION:
+                       if(len==3) { /* euler */
+                               PyObject *eul_cb= newEulerObject_cb(ret, mathutils_rna_array_cb_index, FALSE);
+                               Py_DECREF(ret); /* the matrix owns now */
+                               ret= eul_cb; /* return the matrix instead */
+                       }
+                       else if (len==4) {
+                               PyObject *quat_cb= newQuaternionObject_cb(ret, mathutils_rna_array_cb_index, FALSE);
+                               Py_DECREF(ret); /* the matrix owns now */
+                               ret= quat_cb; /* return the matrix instead */
+                       }
+                       break;
+               default:
+                       break;
+               }
+       }
+ #endif
+       return ret;
+ }
  #endif
  
  static StructRNA *pyrna_struct_as_srna(PyObject *self);
@@@ -144,25 -208,64 +208,64 @@@ static int pyrna_prop_compare( BPy_Prop
        return (a->prop==b->prop && a->ptr.data==b->ptr.data ) ? 0 : -1;
  }
  
- /* For some reason python3 needs these :/ */
- static PyObject *pyrna_struct_richcmp(BPy_StructRNA * a, BPy_StructRNA * b, int op)
+ static PyObject *pyrna_struct_richcmp(PyObject *a, PyObject *b, int op)
  {
-       int cmp_result= -1; /* assume false */
-       if (BPy_StructRNA_Check(a) && BPy_StructRNA_Check(b)) {
-               cmp_result= pyrna_struct_compare(a, b);
+       PyObject *res;
+       int ok= -1; /* zero is true */
+       if (BPy_StructRNA_Check(a) && BPy_StructRNA_Check(b))
+               ok= pyrna_struct_compare((BPy_StructRNA *)a, (BPy_StructRNA *)b);
+       switch (op) {
+       case Py_NE:
+               ok = !ok; /* pass through */
+       case Py_EQ:
+               res = ok ? Py_False : Py_True;
+               break;
+       case Py_LT:
+       case Py_LE:
+       case Py_GT:
+       case Py_GE:
+               res = Py_NotImplemented;
+               break;
+       default:
+               PyErr_BadArgument();
+               return NULL;
        }
  
-       return Py_CmpToRich(op, cmp_result);
+       Py_INCREF(res);
+       return res;
  }
  
- static PyObject *pyrna_prop_richcmp(BPy_PropertyRNA * a, BPy_PropertyRNA * b, int op)
+ static PyObject *pyrna_prop_richcmp(PyObject *a, PyObject *b, int op)
  {
-       int cmp_result= -1; /* assume false */
-       if (BPy_PropertyRNA_Check(a) && BPy_PropertyRNA_Check(b)) {
-               cmp_result= pyrna_prop_compare(a, b);
+       PyObject *res;
+       int ok= -1; /* zero is true */
+       if (BPy_PropertyRNA_Check(a) && BPy_PropertyRNA_Check(b))
+               ok= pyrna_prop_compare((BPy_PropertyRNA *)a, (BPy_PropertyRNA *)b);
+       switch (op) {
+       case Py_NE:
+               ok = !ok; /* pass through */
+       case Py_EQ:
+               res = ok ? Py_False : Py_True;
+               break;
+       case Py_LT:
+       case Py_LE:
+       case Py_GT:
+       case Py_GE:
+               res = Py_NotImplemented;
+               break;
+       default:
+               PyErr_BadArgument();
+               return NULL;
        }
  
-       return Py_CmpToRich(op, cmp_result);
+       Py_INCREF(res);
+       return res;
  }
  
  /*----------------------repr--------------------------------------------*/
@@@ -242,86 -345,14 +345,35 @@@ static char *pyrna_enum_as_string(Point
        return result;
  }
  
 +static int pyrna_string_to_enum(PyObject *item, PointerRNA *ptr, PropertyRNA *prop, int *val, const char *error_prefix)
 +{
 +      char *param= _PyUnicode_AsString(item);
 +
 +      if (param==NULL) {
 +              char *enum_str= pyrna_enum_as_string(ptr, prop);
 +              PyErr_Format(PyExc_TypeError, "%.200s expected a string enum type in (%.200s)", error_prefix, enum_str);
 +              MEM_freeN(enum_str);
 +              return 0;
 +      } else {
 +        &