svn merge ^/trunk/blender -r42660:42669
authorCampbell Barton <ideasman42@gmail.com>
Fri, 16 Dec 2011 23:26:29 +0000 (23:26 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Fri, 16 Dec 2011 23:26:29 +0000 (23:26 +0000)
1  2 
source/blender/blenkernel/intern/object.c
source/blender/blenkernel/intern/pointcache.c
source/blender/blenlib/intern/math_base_inline.c
source/blender/editors/include/ED_mesh.h
source/blender/editors/mesh/meshtools.c
source/blender/editors/object/object_relations.c
source/blender/editors/space_view3d/drawvolume.c
source/blender/editors/space_view3d/view3d_buttons.c

index 5a511e0137c67addb60ab02785055276371fd6fb,f75f2921e5150266fa86283a1a1fd8db381bdb46..6415a440f901485335b0b8e924e86fbd7a9e424a
@@@ -94,138 -82,107 +94,138 @@@ struct ToolSettings
  #define B_JOINTRIA_VCOL               0X400
  #define B_JOINTRIA_SHARP      0X800
  #define B_JOINTRIA_MAT                0X1000
 -#define B_FRACTAL                     0x2000
 -#define B_SPHERE                      0x4000
 -
 -/* meshtools.c */
 +#define B_FRACTAL             0x2000
 +#define B_SPHERE              0x4000
  
 -intptr_t   mesh_octree_table(struct Object *ob, struct EditMesh *em, float *co, char mode);
 -int        mesh_mirrtopo_table(struct Object *ob, char mode);
 -
 -struct EditVert   *editmesh_get_x_mirror_vert(struct Object *ob, struct EditMesh *em, struct EditVert *eve, float *co, int index);
 -int                   mesh_get_x_mirror_vert(struct Object *ob, int index);
 -int                   *mesh_get_x_mirror_faces(struct Object *ob, struct EditMesh *em);
 -
 -int                   join_mesh_exec(struct bContext *C, struct wmOperator *op);
 -int                   join_mesh_shapes_exec(struct bContext *C, struct wmOperator *op);
 +float *bm_get_cd_float(struct CustomData *cdata, void *data, int type);
  
 -/* mesh_ops.c */
 -void          ED_operatortypes_mesh(void);
 -void          ED_operatormacros_mesh(void);
 -void          ED_keymap_mesh(struct wmKeyConfig *keyconf);
++intptr_t    mesh_octree_table(struct Object *ob, struct BMEditMesh *em, float *co, char mode);
++int         mesh_mirrtopo_table(struct Object *ob, char mode);
 +/* bmeshutils.c */
  
 -/* editmesh.c */
 -void          make_editMesh(struct Scene *scene, struct Object *ob);
 -void          load_editMesh(struct Scene *scene, struct Object *ob);
 -void          remake_editMesh(struct Scene *scene, struct Object *ob);
 -void          free_editMesh(struct EditMesh *em);
 +/*
 + [note: I've decided to use ideasman's code for non-editmode stuff, but since
 +  it has a big "not for editmode!" disclaimer, I'm going to keep what I have here
 +  - joeedh]
 +  
 + x-mirror editing api.  usage:
 +  
 +  EDBM_CacheMirrorVerts(em);
 +  ...
 +  ...
 +  BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
 +     mirrorv = EDBM_GetMirrorVert(em, v);
 +  }
 +  ...
 +  ...
 +  EDBM_EndMirrorCache(em);
 + 
 +  note: why do we only allow x axis mirror editing?
 +  */
 +void EDBM_CacheMirrorVerts(struct BMEditMesh *em, const short use_select); /* note, replaces EM_cache_x_mirror_vert in trunk */
 +
 +/*retrieves mirrored cache vert, or NULL if there isn't one.
 +  note: calling this without ensuring the mirror cache state
 +  is bad.*/
 +struct BMVert *EDBM_GetMirrorVert(struct BMEditMesh *em, struct BMVert *v);
 +void           EDBM_ClearMirrorVert(struct BMEditMesh *em, struct BMVert *v);
 +void EDBM_EndMirrorCache(struct BMEditMesh *em);
 +void EDBM_ApplyMirrorCache(struct BMEditMesh *em, const int sel_from, const int sel_to);
 +
 +void EDBM_RecalcNormals(struct BMEditMesh *em);
 +
 +void EDBM_MakeEditBMesh(struct ToolSettings *ts, struct Scene *scene, struct Object *ob);
 +void EDBM_FreeEditBMesh(struct BMEditMesh *tm);
 +void EDBM_LoadEditBMesh(struct Scene *scene, struct Object *ob);
 +
 +void EDBM_init_index_arrays(struct BMEditMesh *em, int forvert, int foredge, int forface);
 +void EDBM_free_index_arrays(struct BMEditMesh *em);
 +struct BMVert *EDBM_get_vert_for_index(struct BMEditMesh *em, int index);
 +struct BMEdge *EDBM_get_edge_for_index(struct BMEditMesh *em, int index);
 +struct BMFace *EDBM_get_face_for_index(struct BMEditMesh *em, int index);
 +
 +int EDBM_CallAndSelectOpf(struct BMEditMesh *em, struct wmOperator *op, 
 +                                                const char *selectslot, const char *fmt, ...);
 +
 +/*flushes based on the current select mode.  if in vertex select mode,
 +  verts select/deselect edges and faces, if in edge select mode,
 +  edges select/deselect faces and vertices, and in face select mode faces select/deselect
 +  edges and vertices.*/
 +void EDBM_selectmode_flush(struct BMEditMesh *em);
 +
 +int EDBM_get_actSelection(struct BMEditMesh *em, struct BMEditSelection *ese);
 +
 +/*exactly the same as EDBM_selectmode_flush, but you pass in the selectmode
 +  instead of using the current one*/
 +void EDBM_select_flush(struct BMEditMesh *em, int selectmode);
 +void EDBM_deselect_flush(struct BMEditMesh *em);
 +
 +void EDBM_selectmode_set(struct BMEditMesh *em);
 +void EDBM_convertsel(struct BMEditMesh *em, short oldmode, short selectmode);
 +void          undo_push_mesh(struct bContext *C, const char *name);
  
 -void          recalc_editnormals(struct EditMesh *em);
 +void EDBM_editselection_center(struct BMEditMesh *em, float *center, struct BMEditSelection *ese);
 +void EDBM_editselection_plane(struct BMEditMesh *em, float *plane, struct BMEditSelection *ese);
 +void EDBM_editselection_normal(float *normal, struct BMEditSelection *ese);
 +int EDBM_vertColorCheck(struct BMEditMesh *em);
 +void EDBM_validate_selections(struct BMEditMesh *em);
  
 -void          EM_init_index_arrays(struct EditMesh *em, int forVert, int forEdge, int forFace);
 -void          EM_free_index_arrays(void);
 -struct EditVert       *EM_get_vert_for_index(int index);
 -struct EditEdge       *EM_get_edge_for_index(int index);
 -struct EditFace       *EM_get_face_for_index(int index);
 -int                   EM_texFaceCheck(struct EditMesh *em);
 -int                   EM_vertColorCheck(struct EditMesh *em);
 +void EDBM_hide_mesh(struct BMEditMesh *em, int swap);
 +void EDBM_reveal_mesh(struct BMEditMesh *em);
  
 -void          undo_push_mesh(struct bContext *C, const char *name);
 +int                   EDBM_check_backbuf(unsigned int index);
 +int                   EDBM_mask_init_backbuf_border(struct ViewContext *vc, int mcords[][2], short tot, short xmin, short ymin, short xmax, short ymax);
 +void          EDBM_free_backbuf(void);
 +int                   EDBM_init_backbuf_border(struct ViewContext *vc, short xmin, short ymin, short xmax, short ymax);
 +int                   EDBM_init_backbuf_circle(struct ViewContext *vc, short xs, short ys, short rads);
  
 -void          paintvert_flush_flags(struct Object *ob);
 -void          paintvert_deselect_all_visible(struct Object *ob, int action, short flush_flags);
 +void EDBM_deselect_by_material(struct BMEditMesh *em, const short index, const short select);
  
 -/* editmesh_lib.c */
 +void EDBM_select_swap(struct BMEditMesh *em); /* exported for UV */
  
 -struct EditFace       *EM_get_actFace(struct EditMesh *em, int sloppy);
 -void             EM_set_actFace(struct EditMesh *em, struct EditFace *efa);
 -float            EM_face_area(struct EditFace *efa);
 +int EDBM_texFaceCheck(struct BMEditMesh *em);
 +struct MTexPoly *EDBM_get_active_mtexpoly(struct BMEditMesh *em, struct BMFace **act_efa, int sloppy);
  
 -void          EM_select_edge(struct EditEdge *eed, int sel);
 -void          EM_select_face(struct EditFace *efa, int sel);
 -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_deselect_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);
 -void          EM_select_flush(struct EditMesh *em);
 -void          EM_convertsel(struct EditMesh *em, short oldmode, short selectmode);
 -void          EM_validate_selections(struct EditMesh *em);
 -void          EM_selectmode_to_scene(struct Scene *scene, struct Object *obedit);
 +void EDBM_free_uv_vert_map(struct UvVertMap *vmap);
 +struct UvMapVert *EDBM_get_uv_map_vert(struct UvVertMap *vmap, unsigned int v);
 +struct UvVertMap *EDBM_make_uv_vert_map(struct BMEditMesh *em, int selected, int do_face_idx_array, float *limit);
 +void          EM_add_data_layer(struct BMEditMesh *em, struct CustomData *data, int type, const char *name);
 +void          EM_free_data_layer(struct BMEditMesh *em, struct CustomData *data, int type);
  
 -                      /* exported to transform */
 -int                   EM_get_actSelection(struct EditMesh *em, struct EditSelection *ese);
 -void          EM_editselection_normal(float *normal, struct EditSelection *ese);
 -void          EM_editselection_plane(float *plane, struct EditSelection *ese);
 -void          EM_editselection_center(float *center, struct EditSelection *ese);                      
 +void EDBM_toggle_select_all(struct BMEditMesh *em);
 +void EDBM_set_flag_all(struct BMEditMesh *em, const char hflag);
 +void EDBM_clear_flag_all(struct BMEditMesh *em, const char hflag);
 +void EDBM_automerge(struct Scene *scene, struct Object *ob, int update);
  
 -struct UvVertMap *EM_make_uv_vert_map(struct EditMesh *em, int selected, int do_face_idx_array, float *limit);
 -struct UvMapVert *EM_get_uv_map_vert(struct UvVertMap *vmap, unsigned int v);
 -void              EM_free_uv_vert_map(struct UvVertMap *vmap);
 +/* editmesh_mods.c */
 +extern unsigned int bm_vertoffs, bm_solidoffs, bm_wireoffs;
  
- intptr_t      mesh_octree_table(struct Object *ob, struct BMEditMesh *em, float *co, char mode);
- long          mesh_mirrtopo_table(struct Object *ob, char mode);
 -void          EM_add_data_layer(struct EditMesh *em, struct CustomData *data, int type, const char *name);
 -void          EM_free_data_layer(struct EditMesh *em, struct CustomData *data, int type);
 +int                   mouse_mesh(struct bContext *C, const int mval[2], short extend);
  
 -void          EM_make_hq_normals(struct EditMesh *em);
 -void          EM_solidify(struct EditMesh *em, float dist);
 +struct BMVert   *editbmesh_get_x_mirror_vert(struct Object *ob, struct BMEditMesh *em, struct BMVert *eve, float *co, int index);
 +int                   mesh_get_x_mirror_vert(struct Object *ob, int index);
 +int                   *mesh_get_x_mirror_faces(struct Object *ob, struct BMEditMesh *em);
  
 -int                   EM_deselect_nth(struct EditMesh *em, int nth);
 +int                   join_mesh_exec(struct bContext *C, struct wmOperator *op);
 +int                   join_mesh_shapes_exec(struct bContext *C, struct wmOperator *op);
  
 -void EM_project_snap_verts(struct bContext *C, struct ARegion *ar, struct Object *obedit, struct EditMesh *em);
 +/* mesh_ops.c */
 +void          ED_operatortypes_mesh(void);
 +void          ED_operatormacros_mesh(void);
 +void          ED_keymap_mesh(struct wmKeyConfig *keyconf);
  
 -/* editmesh_mods.c */
 -extern unsigned int em_vertoffs, em_solidoffs, em_wireoffs;
  
 -void          EM_cache_x_mirror_vert(struct Object *ob, struct EditMesh *em);
 -int                   mouse_mesh(struct bContext *C, const int mval[2], short extend);
 -int                   EM_check_backbuf(unsigned int index);
 -int                   EM_mask_init_backbuf_border(struct ViewContext *vc, int mcords[][2], short tot, short xmin, short ymin, short xmax, short ymax);
 -void          EM_free_backbuf(void);
 -int                   EM_init_backbuf_border(struct ViewContext *vc, short xmin, short ymin, short xmax, short ymax);
 -int                   EM_init_backbuf_circle(struct ViewContext *vc, short xs, short ys, short rads);
 +/* editmesh.c */
  
 -void          EM_hide_mesh(struct EditMesh *em, int swap);
 -void          EM_reveal_mesh(struct EditMesh *em);
 +void          ED_spacetypes_init(void);
 +void          ED_keymap_mesh(struct wmKeyConfig *keyconf);
  
 -void          EM_select_by_material(struct EditMesh *em, int index);
 -void          EM_deselect_by_material(struct EditMesh *em, int index); 
 +/* bmesh_mods.c */
 +extern unsigned int bm_vertoffs, bm_solidoffs, bm_wireoffs;
  
 -void          EM_automerge(struct Scene *scene, struct Object *obedit, int update);
 +/* bmesh_tools.c (could be moved) */
 +void EMBM_project_snap_verts(struct bContext *C, struct ARegion *ar, struct Object *obedit, struct BMEditMesh *em);
  
  /* editface.c */
  void paintface_flush_flags(struct Object *ob);
index 1cfa369e5c12bd46dd086b02d08e16aca61bad7e,1022d247d682509af5839be6f6a6a8868916eca8..2eafa89e272b467c0822575345229cf138558b4d
@@@ -948,16 -896,20 +949,17 @@@ int mesh_mirrtopo_table(Object *ob, cha
        } else if(mode=='s') { /* start table */
                Mesh *me= ob->data;
                MEdge *medge;
 -              EditMesh *em= me->edit_mesh;
 -              void **eve_tmp_back= NULL; /* some of the callers are using eve->tmp so restore after */
 -
 -
 -              /* editmode*/
 -              EditEdge *eed;
 -
 +              BMEditMesh *em= me->edit_btmesh;
 +              BMEdge *eed;
 +              BMIter iter;
-               MIRRHASH_TYPE *MirrTopoHash = NULL;
-               MIRRHASH_TYPE *MirrTopoHash_Prev = NULL;
-               MirrTopoPair *MirrTopoPairs;
                int a, last;
                int totvert, totedge;
                int totUnique= -1, totUniqueOld= -1;
  
+               MirrTopoHash_t *MirrTopoHash = NULL;
+               MirrTopoHash_t *MirrTopoHash_Prev = NULL;
+               MirrTopoPair_t *MirrTopoPairs;
++
                mesh_topo_lookup_mode= ob->mode;
  
                /* reallocate if needed */
                                totUniqueOld = totUnique;
                        }
                        /* Copy the hash calculated this iter, so we can use them next time */
-                       memcpy(MirrTopoHash_Prev, MirrTopoHash, sizeof(MIRRHASH_TYPE) * totvert);
+                       memcpy(MirrTopoHash_Prev, MirrTopoHash, sizeof(MirrTopoHash_t) * totvert);
                }
  
 -              /* restore eve->tmp.* */
 -              if(eve_tmp_back) {
 -                      EditVert *eve;
 -                      totvert= 0;
 -                      for(eve= em->verts.first; eve; eve= eve->next) {
 -                              eve->tmp.p= eve_tmp_back[totvert++];
 -                      }
 -
 -                      MEM_freeN(eve_tmp_back);
 -                      eve_tmp_back= NULL;
 -              }
 -              
 -              
                /* Hash/Index pairs are needed for sorting to find index pairs */
-               MirrTopoPairs= MEM_callocN( sizeof(MirrTopoPair) * totvert, "MirrTopoPairs");
+               MirrTopoPairs= MEM_callocN( sizeof(MirrTopoPair_t) * totvert, "MirrTopoPairs");
  
                /* since we are looping through verts, initialize these values here too */
                mesh_topo_lookup = MEM_mallocN( totvert * sizeof(long), "mesh_topo_lookup" );
                        if ((a==totvert) || (MirrTopoPairs[a-1].hash != MirrTopoPairs[a].hash)) {
                                if (a-last==2) {
                                        if(em) {
-                                               mesh_topo_lookup[MirrTopoPairs[a-1].vIndex] =   (long)EDBM_get_vert_for_index(em, MirrTopoPairs[a-2].vIndex);
-                                               mesh_topo_lookup[MirrTopoPairs[a-2].vIndex] =   (long)EDBM_get_vert_for_index(em, MirrTopoPairs[a-1].vIndex);
 -                                              mesh_topo_lookup[MirrTopoPairs[a-1].vIndex] =   (intptr_t)EM_get_vert_for_index(MirrTopoPairs[a-2].vIndex);
 -                                              mesh_topo_lookup[MirrTopoPairs[a-2].vIndex] =   (intptr_t)EM_get_vert_for_index(MirrTopoPairs[a-1].vIndex);
++                                              mesh_topo_lookup[MirrTopoPairs[a-1].vIndex] =   (intptr_t)EDBM_get_vert_for_index(em, MirrTopoPairs[a-2].vIndex);
++                                              mesh_topo_lookup[MirrTopoPairs[a-2].vIndex] =   (intptr_t)EDBM_get_vert_for_index(em, MirrTopoPairs[a-1].vIndex);
                                        } else {
                                                mesh_topo_lookup[MirrTopoPairs[a-1].vIndex] =   MirrTopoPairs[a-2].vIndex;
                                                mesh_topo_lookup[MirrTopoPairs[a-2].vIndex] =   MirrTopoPairs[a-1].vIndex;
@@@ -1153,9 -1122,9 +1155,9 @@@ static BMVert *editbmesh_get_x_mirror_v
        return NULL;
  }
  
 -static EditVert *editmesh_get_x_mirror_vert_topo(Object *ob, struct EditMesh *em, EditVert *eve, int index)
 +static BMVert *editbmesh_get_x_mirror_vert_topo(Object *ob, struct BMEditMesh *em, BMVert *eve, int index)
  {
-       long poinval;
+       intptr_t poinval;
        if (mesh_mirrtopo_table(ob, 'u')==-1)
                return NULL;
  
index 469452697c5c033367833f0a0450931c13f10305,1b923c7a0cd1f3c57740079011a97b8dc8833473..391b344df0114cb8b0fe1acbed6f60f980927edd
@@@ -58,8 -58,8 +58,9 @@@
  #include "BKE_main.h"
  #include "BKE_mesh.h"
  #include "BKE_screen.h"
 +#include "BKE_tessmesh.h"
  #include "BKE_deform.h"
+ #include "BKE_object.h"
  
  #include "WM_api.h"
  #include "WM_types.h"