Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2009-01-13 18:18:41 +0300
committerTon Roosendaal <ton@blender.org>2009-01-13 18:18:41 +0300
commitb8dac71bdab7bd562ca13eb8c4af2f966533067b (patch)
treea5ad1039b7065fef5e2e045c95743633ad241573 /source/blender
parentb3d8cbd1130578e440966449d0bec995c7764a18 (diff)
2.5
- restored three more C files: editlattice, editkey and editgroup - editmode lattice working, (mouse select works) - accidentally removed yesterday 3d cursor drawing - removed global editLatt entirely now.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/BKE_lattice.h3
-rw-r--r--source/blender/blenkernel/intern/lattice.c7
-rw-r--r--source/blender/editors/armature/editarmature.c33
-rw-r--r--source/blender/editors/include/ED_object.h6
-rw-r--r--source/blender/editors/include/ED_view3d.h1
-rw-r--r--source/blender/editors/mesh/editdeform.c83
-rw-r--r--source/blender/editors/mesh/editmesh.c8
-rw-r--r--source/blender/editors/object/editgroup.c244
-rw-r--r--source/blender/editors/object/editkey.c560
-rw-r--r--source/blender/editors/object/editlattice.c343
-rw-r--r--source/blender/editors/object/object_edit.c49
-rw-r--r--source/blender/editors/object/object_intern.h21
-rw-r--r--source/blender/editors/space_view3d/drawobject.c9
-rw-r--r--source/blender/editors/space_view3d/view3d_draw.c2
-rw-r--r--source/blender/editors/space_view3d/view3d_intern.h2
-rw-r--r--source/blender/editors/space_view3d/view3d_select.c2
16 files changed, 1284 insertions, 89 deletions
diff --git a/source/blender/blenkernel/BKE_lattice.h b/source/blender/blenkernel/BKE_lattice.h
index c0a6dc48d47..2e4a5334c68 100644
--- a/source/blender/blenkernel/BKE_lattice.h
+++ b/source/blender/blenkernel/BKE_lattice.h
@@ -38,9 +38,6 @@ struct DerivedMesh;
struct BPoint;
struct MDeformVert;
-extern struct Lattice *editLatt;
-
-
void resizelattice(struct Lattice *lt, int u, int v, int w, struct Object *ltOb);
struct Lattice *add_lattice(char *name);
struct Lattice *copy_lattice(struct Lattice *lt);
diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c
index 46e7022c718..134d9f7155a 100644
--- a/source/blender/blenkernel/intern/lattice.c
+++ b/source/blender/blenkernel/intern/lattice.c
@@ -73,8 +73,6 @@
//XXX #include "BIF_editdeform.h"
-Lattice *editLatt=0;
-
void calc_lat_fudu(int flag, int res, float *fu, float *du)
{
if(res==1) {
@@ -233,6 +231,11 @@ void free_lattice(Lattice *lt)
{
if(lt->def) MEM_freeN(lt->def);
if(lt->dvert) free_dverts(lt->dvert, lt->pntsu*lt->pntsv*lt->pntsw);
+ if(lt->editlatt) {
+ if(lt->def) MEM_freeN(lt->def);
+ if(lt->dvert) free_dverts(lt->dvert, lt->pntsu*lt->pntsv*lt->pntsw);
+ MEM_freeN(lt->editlatt);
+ }
}
diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c
index bc4f39d8a23..54da3901a59 100644
--- a/source/blender/editors/armature/editarmature.c
+++ b/source/blender/editors/armature/editarmature.c
@@ -1134,17 +1134,14 @@ static void *get_bone_from_selectbuffer(Scene *scene, Base *base, unsigned int *
/* used by posemode as well editmode */
/* only checks scene->basact! */
-static void *get_nearest_bone (Scene *scene, short findunsel)
+static void *get_nearest_bone (bContext *C, short findunsel)
{
ViewContext vc;
rcti rect;
unsigned int buffer[MAXPICKBUF];
short hits;
- memset(&vc, 0, sizeof(ViewContext));
- vc.scene= scene;
- vc.obedit= scene->obedit;
- // XXX fill in further!
+ view3d_set_viewcontext(C, &vc);
// rect.xmin= ... mouseco!
@@ -1152,7 +1149,7 @@ static void *get_nearest_bone (Scene *scene, short findunsel)
hits= view3d_opengl_select(&vc, buffer, MAXPICKBUF, &rect);
if (hits>0)
- return get_bone_from_selectbuffer(scene, scene->basact, buffer, hits, findunsel);
+ return get_bone_from_selectbuffer(vc.scene, vc.scene->basact, buffer, hits, findunsel);
return NULL;
}
@@ -1346,18 +1343,16 @@ static void selectconnected_posebonechildren (Object *ob, Bone *bone)
}
/* within active object context */
-void selectconnected_posearmature(Scene *scene)
+void selectconnected_posearmature(bContext *C)
{
+ Object *ob= CTX_data_edit_object(C);
Bone *bone, *curBone, *next;
- Object *ob= OBACT;
int shift= 0; // XXX
- if(!ob || !ob->pose) return;
-
if (shift)
- bone= get_nearest_bone(scene, 0);
+ bone= get_nearest_bone(C, 0);
else
- bone = get_nearest_bone(scene, 1);
+ bone = get_nearest_bone(C, 1);
if (!bone)
return;
@@ -1391,16 +1386,17 @@ void selectconnected_posearmature(Scene *scene)
/* **************** EditMode stuff ********************** */
/* called in space.c */
-void selectconnected_armature(Scene *scene, View3D *v3d, Object *obedit)
+void selectconnected_armature(bContext *C)
{
+ Object *obedit= CTX_data_edit_object(C);
bArmature *arm= obedit->data;
EditBone *bone, *curBone, *next;
int shift= 0; // XXX
if (shift)
- bone= get_nearest_bone(scene, 0);
+ bone= get_nearest_bone(C, 0);
else
- bone= get_nearest_bone(scene, 1);
+ bone= get_nearest_bone(C, 1);
if (!bone)
return;
@@ -1721,12 +1717,7 @@ void mouse_armature(bContext *C, short mval[2], int extend)
EditBone *nearBone = NULL, *ebone;
int selmask;
- memset(&vc, 0, sizeof(ViewContext));
- vc.ar= CTX_wm_region(C);
- vc.scene= CTX_data_scene(C);
- vc.v3d= (View3D *)CTX_wm_space_data(C);
- vc.obact= CTX_data_active_object(C);
- vc.obedit= obedit;
+ view3d_set_viewcontext(C, &vc);
nearBone= get_nearest_editbonepoint(&vc, mval, arm->edbo, 1, &selmask);
if (nearBone) {
diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index 59beb953c8d..5fdc9574549 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -66,6 +66,12 @@ int object_is_libdata(struct Object *ob);
struct bConstraint *add_new_constraint (short type);
void add_constraint_to_object (struct bConstraint *con, struct Object *ob);
+/* editlattice.c */
+void mouse_lattice(struct bContext *C, short mval[2], int extend);
+
+/* keys */
+void insert_shapekey(struct Scene *scene, struct Object *ob);
+void delete_key(struct Scene *scene, struct Object *ob);
#endif /* ED_OBJECT_H */
diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h
index 9de1095ef25..f9ea8053b72 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -93,6 +93,7 @@ unsigned int view3d_sample_backbuf(struct ViewContext *vc, int x, int y);
/* select */
#define MAXPICKBUF 10000
short view3d_opengl_select(struct ViewContext *vc, unsigned int *buffer, unsigned int bufsize, rcti *input);
+void view3d_set_viewcontext(struct bContext *C, struct ViewContext *vc);
/* modes */
void ED_view3d_exit_paint_modes(struct bContext *C);
diff --git a/source/blender/editors/mesh/editdeform.c b/source/blender/editors/mesh/editdeform.c
index 0533c37b292..845290660c7 100644
--- a/source/blender/editors/mesh/editdeform.c
+++ b/source/blender/editors/mesh/editdeform.c
@@ -65,6 +65,17 @@
static void BIF_undo_push() {}
static void error() {}
+static Lattice *def_get_lattice(Object *ob)
+{
+ if(ob->type==OB_LATTICE) {
+ Lattice *lt= ob->data;
+ if(lt->editlatt)
+ return lt->editlatt;
+ return lt;
+ }
+ return NULL;
+}
+
/* only in editmode */
void sel_verts_defgroup (Object *obedit, int select)
{
@@ -103,14 +114,17 @@ void sel_verts_defgroup (Object *obedit, int select)
}
break;
case OB_LATTICE:
- if(editLatt->dvert) {
+ {
+ Lattice *lt= def_get_lattice(ob);
+
+ if(lt->dvert) {
BPoint *bp;
int a, tot;
- dvert= editLatt->dvert;
+ dvert= lt->dvert;
- tot= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
- for(a=0, bp= editLatt->def; a<tot; a++, bp++, dvert++) {
+ tot= lt->pntsu*lt->pntsv*lt->pntsw;
+ for(a=0, bp= lt->def; a<tot; a++, bp++, dvert++) {
for (i=0; i<dvert->totweight; i++){
if (dvert->dw[i].def_nr == (ob->actdef-1)) {
if(select) bp->f1 |= SELECT;
@@ -120,7 +134,8 @@ void sel_verts_defgroup (Object *obedit, int select)
}
}
}
- }
+ }
+ }
break;
default:
@@ -392,14 +407,15 @@ void del_defgroup (Object *ob)
dvert->dw[i].def_nr--;
}
}
- else {
+ else if(ob->type==OB_LATTICE) {
+ Lattice *lt= def_get_lattice(ob);
BPoint *bp;
- MDeformVert *dvert= editLatt->dvert;
+ MDeformVert *dvert= lt->dvert;
int a, tot;
if (dvert) {
- tot= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
- for(a=0, bp= editLatt->def; a<tot; a++, bp++, dvert++) {
+ tot= lt->pntsu*lt->pntsv*lt->pntsw;
+ for(a=0, bp= lt->def; a<tot; a++, bp++, dvert++) {
for (i=0; i<dvert->totweight; i++){
if (dvert->dw[i].def_nr > (ob->actdef-1))
dvert->dw[i].def_nr--;
@@ -424,10 +440,11 @@ void del_defgroup (Object *ob)
CustomData_free_layer_active(&me->vdata, CD_MDEFORMVERT, me->totvert);
me->dvert= NULL;
}
- else {
- if (editLatt->dvert) {
- MEM_freeN(editLatt->dvert);
- editLatt->dvert= NULL;
+ else if(ob->type==OB_LATTICE) {
+ Lattice *lt= def_get_lattice(ob);
+ if (lt->dvert) {
+ MEM_freeN(lt->dvert);
+ lt->dvert= NULL;
}
}
}
@@ -445,10 +462,11 @@ void del_all_defgroups (Object *ob)
CustomData_free_layer_active(&me->vdata, CD_MDEFORMVERT, me->totvert);
me->dvert= NULL;
}
- else {
- if (editLatt->dvert) {
- MEM_freeN(editLatt->dvert);
- editLatt->dvert= NULL;
+ else if(ob->type==OB_LATTICE) {
+ Lattice *lt= def_get_lattice(ob);
+ if (lt->dvert) {
+ MEM_freeN(lt->dvert);
+ lt->dvert= NULL;
}
}
@@ -500,9 +518,8 @@ void remove_vert_def_nr (Object *ob, int def_nr, int vertnum)
dvert = ((Mesh*)ob->data)->dvert + vertnum;
}
else if(ob->type==OB_LATTICE) {
- Lattice *lt= ob->data;
+ Lattice *lt= def_get_lattice(ob);
- if(lt->editlatt) lt= lt->editlatt;
if(lt->dvert)
dvert = lt->dvert + vertnum;
}
@@ -568,10 +585,8 @@ void add_vert_defnr (Object *ob, int def_nr, int vertnum,
dv = ((Mesh*)ob->data)->dvert + vertnum;
}
else if(ob->type==OB_LATTICE) {
- Lattice *lt= ob->data;
+ Lattice *lt= def_get_lattice(ob);
- if(lt->editlatt) lt= lt->editlatt;
-
if(lt->dvert)
dv = lt->dvert + vertnum;
}
@@ -747,18 +762,19 @@ void assign_verts_defgroup (Object *obedit, float weight)
break;
case OB_LATTICE:
{
+ Lattice *lt= def_get_lattice(ob);
BPoint *bp;
int a, tot;
- if(editLatt->dvert==NULL)
- create_dverts(&editLatt->id);
+ if(lt->dvert==NULL)
+ create_dverts(&lt->id);
- tot= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
- for(a=0, bp= editLatt->def; a<tot; a++, bp++) {
+ tot= lt->pntsu*lt->pntsv*lt->pntsw;
+ for(a=0, bp= lt->def; a<tot; a++, bp++) {
if(bp->f1 & SELECT)
add_vert_defnr (ob, ob->actdef-1, a, weight, WEIGHT_REPLACE);
}
- }
+ }
break;
default:
printf ("Assigning deformation groups to unknown object type\n");
@@ -807,9 +823,7 @@ static float get_vert_def_nr (Object *ob, int def_nr, int vertnum)
dvert = ((Mesh*)ob->data)->dvert + vertnum;
}
else if(ob->type==OB_LATTICE) {
- Lattice *lt= ob->data;
-
- if(lt->editlatt) lt= lt->editlatt;
+ Lattice *lt= def_get_lattice(ob);
if(lt->dvert)
dvert = lt->dvert + vertnum;
@@ -899,16 +913,19 @@ void remove_verts_defgroup (Object *obedit, int allverts)
}
break;
case OB_LATTICE:
+ {
+ Lattice *lt= def_get_lattice(ob);
- if(editLatt->dvert) {
+ if(lt->dvert) {
BPoint *bp;
- int a, tot= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
+ int a, tot= lt->pntsu*lt->pntsv*lt->pntsw;
- for(a=0, bp= editLatt->def; a<tot; a++, bp++) {
+ for(a=0, bp= lt->def; a<tot; a++, bp++) {
if(allverts || (bp->f1 & SELECT))
remove_vert_defgroup (ob, dg, a);
}
}
+ }
break;
default:
diff --git a/source/blender/editors/mesh/editmesh.c b/source/blender/editors/mesh/editmesh.c
index b91fc0e1d01..412929b64fb 100644
--- a/source/blender/editors/mesh/editmesh.c
+++ b/source/blender/editors/mesh/editmesh.c
@@ -2167,12 +2167,8 @@ int EM_vertColorCheck(EditMesh *em)
void em_setup_viewcontext(bContext *C, ViewContext *vc)
{
- memset(vc, 0, sizeof(ViewContext));
- vc->ar= CTX_wm_region(C);
- vc->scene= CTX_data_scene(C);
- vc->v3d= (View3D *)CTX_wm_space_data(C);
- vc->obact= CTX_data_active_object(C);
- vc->obedit= CTX_data_edit_object(C);
+ view3d_set_viewcontext(C, vc);
+
if(vc->obedit) {
Mesh *me= vc->obedit->data;
vc->em= me->edit_mesh;
diff --git a/source/blender/editors/object/editgroup.c b/source/blender/editors/object/editgroup.c
new file mode 100644
index 00000000000..01e791c8b6d
--- /dev/null
+++ b/source/blender/editors/object/editgroup.c
@@ -0,0 +1,244 @@
+/**
+ * $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) Blender Foundation
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <string.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+
+#include "DNA_group_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_view3d_types.h"
+
+#include "BKE_depsgraph.h"
+#include "BKE_group.h"
+#include "BKE_global.h"
+#include "BKE_main.h"
+
+#include "object_intern.h"
+
+/* XXX */
+static void BIF_undo_push() {}
+static void error() {}
+static int pupmenu() {return 0;}
+static int pupmenu_col() {return 0;}
+
+void add_selected_to_group(Scene *scene, View3D *v3d, Group *group)
+{
+ Base *base;
+
+ for(base=FIRSTBASE; base; base= base->next) {
+ if (TESTBASE(v3d, base)) {
+ add_to_group(group, base->object);
+ base->object->flag |= OB_FROMGROUP;
+ base->flag |= OB_FROMGROUP;
+ }
+ }
+
+ DAG_scene_sort(scene);
+ BIF_undo_push("Add to Group");
+}
+
+void add_selected_to_act_ob_groups(Scene *scene, View3D *v3d)
+{
+ Object *ob= OBACT, *obt;
+ Base *base;
+ Group *group;
+
+ if (!ob) return;
+
+ /* linking to same group requires its own loop so we can avoid
+ looking up the active objects groups each time */
+
+ group= G.main->group.first;
+ while(group) {
+ if(object_in_group(ob, group)) {
+ /* Assign groups to selected objects */
+ base= FIRSTBASE;
+ while(base) {
+ if(TESTBASE(v3d, base)) {
+ obt= base->object;
+ add_to_group(group, obt);
+ obt->flag |= OB_FROMGROUP;
+ base->flag |= OB_FROMGROUP;
+ }
+ base= base->next;
+ }
+ }
+ group= group->id.next;
+ }
+ DAG_scene_sort(scene);
+ BIF_undo_push("Add to Active Objects Group");
+}
+
+
+void rem_selected_from_all_groups(Scene *scene, View3D *v3d)
+{
+ Base *base;
+ Group *group;
+
+ for(base=FIRSTBASE; base; base= base->next) {
+ if (TESTBASE(v3d, base)) {
+ group = NULL;
+ while( (group = find_group(base->object, group)) ) {
+ rem_from_group(group, base->object);
+ }
+ base->object->flag &= ~OB_FROMGROUP;
+ base->flag &= ~OB_FROMGROUP;
+ }
+ }
+
+ DAG_scene_sort(scene);
+ BIF_undo_push("Remove from Group");
+}
+
+
+void rem_selected_from_group(Scene *scene, View3D *v3d)
+{
+ char menutext[30+(22*22)], *menupt;
+ int i=0;
+ short ret;
+ Group *group= NULL;
+ Object *ob;
+ Base *base;
+ Group *group_array[24] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+
+ /* UnSet Tags for Objects and Groups */
+ for(group= G.main->group.first; group; group= group->id.next) {
+ if(group->id.lib==NULL) {
+ group->id.flag &= ~LIB_DOIT;
+ }
+ }
+ for(ob=G.main->object.first; ob; ob= ob->id.next) {
+ ob->id.flag &= ~LIB_DOIT;
+ }
+
+ /* Not tag selected objects */
+ for(base=FIRSTBASE; base; base= base->next) {
+ if (TESTBASELIB(v3d, base)) {
+ base->object->id.flag |= LIB_DOIT;
+ }
+ }
+
+ menupt = menutext;
+ /* Build a list of groups that contain selected objects */
+ for(group= G.main->group.first; group && i<24; group= group->id.next) {
+ if(group->id.lib==NULL) {
+ GroupObject *go;
+ for(go= group->gobject.first; go; go= go->next) {
+ if(go->ob->id.flag & LIB_DOIT) {
+ group_array[i] = group;
+ menupt += sprintf(menupt, "|%s", group->id.name+2);
+ i++;
+ break; /* Only want to know if this group should go in the list*/
+ }
+ }
+ }
+ }
+
+ /* do we have any groups? */
+ if (group_array[0] == NULL) {
+ error("Object selection contains no groups");
+ } else {
+ ret = pupmenu(menutext);
+ if (ret==-1) {
+ return;
+ } else {
+ group = group_array[ret-1];
+ for(base=FIRSTBASE; base; base= base->next) {
+ if (TESTBASELIB(v3d, base)) {
+ /* if we are removed and are not in any group, set our flag */
+ if(rem_from_group(group, base->object) && find_group(base->object, NULL)==NULL) {
+ base->object->flag &= ~OB_FROMGROUP;
+ base->flag &= ~OB_FROMGROUP;
+ }
+ }
+ }
+ }
+ }
+
+ DAG_scene_sort(scene);
+ BIF_undo_push("Remove from Group");
+}
+
+void group_operation(Scene *scene, View3D *v3d, int mode)
+{
+ Group *group= NULL;
+
+ /* are there existing groups? */
+ for(group= G.main->group.first; group; group= group->id.next)
+ if(group->id.lib==NULL)
+ break;
+
+ if(mode>0) {
+ if(group==NULL || mode==1) group= add_group( "Group" );
+ if(mode==3) {
+ int tot= BLI_countlist(&G.main->group);
+ char *strp= MEM_callocN(tot*32 + 32, "group menu"), *strp1;
+
+ strp1= strp;
+ for(tot=1, group= G.main->group.first; group; group= group->id.next, tot++) {
+ if(group->id.lib==NULL) {
+ strp1 += sprintf(strp1, "%s %%x%d|", group->id.name+2, tot);
+ }
+ }
+ tot= pupmenu_col(strp, 20);
+ MEM_freeN(strp);
+ if(tot>0) group= BLI_findlink(&G.main->group, tot-1);
+ else return;
+ }
+
+ if(mode==4) add_selected_to_act_ob_groups(scene, v3d);
+ else if(mode==1 || mode==3) add_selected_to_group(scene, v3d, group);
+ else if(mode==2) rem_selected_from_all_groups(scene, v3d);
+ else if(mode==5) rem_selected_from_group(scene, v3d);
+ }
+}
+
+void group_operation_with_menu(Scene *scene, View3D *v3d)
+{
+ Group *group= NULL;
+ int mode;
+
+ /* are there existing groups? */
+ for(group= G.main->group.first; group; group= group->id.next)
+ if(group->id.lib==NULL)
+ break;
+
+ if(group)
+ mode= pupmenu("Groups %t|Add to Existing Group %x3|Add to Active Objects Groups %x4|Add to New Group %x1|Remove from Group %x5|Remove from All Groups %x2");
+ else
+ mode= pupmenu("Groups %t|Add to New Group %x1|Remove from All Groups %x2");
+
+ group_operation(scene, v3d, mode);
+}
+
diff --git a/source/blender/editors/object/editkey.c b/source/blender/editors/object/editkey.c
new file mode 100644
index 00000000000..9b3150cea5a
--- /dev/null
+++ b/source/blender/editors/object/editkey.c
@@ -0,0 +1,560 @@
+/**
+ * $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) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * Contributor(s): Blender Foundation, shapekey support
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <math.h>
+#include <string.h>
+
+#ifndef WIN32
+#include <unistd.h>
+#else
+#include <io.h>
+#endif
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+
+#include "DNA_action_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_ipo_types.h"
+#include "DNA_key_types.h"
+#include "DNA_lattice_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
+#include "DNA_userdef_types.h"
+#include "DNA_view2d_types.h"
+
+#include "BKE_action.h"
+#include "BKE_anim.h"
+#include "BKE_curve.h"
+#include "BKE_depsgraph.h"
+#include "BKE_global.h"
+#include "BKE_ipo.h"
+#include "BKE_key.h"
+#include "BKE_library.h"
+#include "BKE_main.h"
+#include "BKE_mesh.h"
+#include "BKE_object.h"
+#include "BKE_utildefines.h"
+
+#include "BLO_sys_types.h" // for intptr_t support
+
+#include "ED_object.h"
+
+#include "object_intern.h"
+
+/* XXX */
+static void BIF_undo_push() {}
+static void error() {}
+/* XXX */
+
+extern ListBase editNurb; /* in editcurve.c */
+
+
+static void default_key_ipo(Scene *scene, Key *key)
+{
+ IpoCurve *icu;
+ BezTriple *bezt;
+
+ key->ipo= add_ipo(scene, "KeyIpo", ID_KE);
+
+ icu= MEM_callocN(sizeof(IpoCurve), "ipocurve");
+
+ icu->blocktype= ID_KE;
+ icu->adrcode= KEY_SPEED;
+ icu->flag= IPO_VISIBLE|IPO_SELECT|IPO_AUTO_HORIZ;
+ set_icu_vars(icu);
+
+ BLI_addtail( &(key->ipo->curve), icu);
+
+ icu->bezt= bezt= MEM_callocN(2*sizeof(BezTriple), "defaultipo");
+ icu->totvert= 2;
+
+ bezt->hide= IPO_BEZ;
+ bezt->f1=bezt->f2= bezt->f3= SELECT;
+ bezt->h1= bezt->h2= HD_AUTO;
+ bezt++;
+ bezt->vec[1][0]= 100.0;
+ bezt->vec[1][1]= 1.0;
+ bezt->hide= IPO_BEZ;
+ bezt->f1=bezt->f2= bezt->f3= SELECT;
+ bezt->h1= bezt->h2= HD_AUTO;
+
+ calchandles_ipocurve(icu);
+}
+
+
+
+/* **************************************** */
+
+void mesh_to_key(Mesh *me, KeyBlock *kb)
+{
+ MVert *mvert;
+ float *fp;
+ int a;
+
+ if(me->totvert==0) return;
+
+ if(kb->data) MEM_freeN(kb->data);
+
+ kb->data= MEM_callocN(me->key->elemsize*me->totvert, "kb->data");
+ kb->totelem= me->totvert;
+
+ mvert= me->mvert;
+ fp= kb->data;
+ for(a=0; a<kb->totelem; a++, fp+=3, mvert++) {
+ VECCOPY(fp, mvert->co);
+
+ }
+}
+
+void key_to_mesh(KeyBlock *kb, Mesh *me)
+{
+ MVert *mvert;
+ float *fp;
+ int a, tot;
+
+ mvert= me->mvert;
+ fp= kb->data;
+
+ tot= MIN2(kb->totelem, me->totvert);
+
+ for(a=0; a<tot; a++, fp+=3, mvert++) {
+ VECCOPY(mvert->co, fp);
+ }
+}
+
+static KeyBlock *add_keyblock(Scene *scene, Key *key)
+{
+ KeyBlock *kb;
+ float curpos= -0.1;
+ int tot;
+
+ kb= key->block.last;
+ if(kb) curpos= kb->pos;
+
+ kb= MEM_callocN(sizeof(KeyBlock), "Keyblock");
+ BLI_addtail(&key->block, kb);
+ kb->type= KEY_CARDINAL;
+ tot= BLI_countlist(&key->block);
+ if(tot==1) strcpy(kb->name, "Basis");
+ else sprintf(kb->name, "Key %d", tot-1);
+ kb->adrcode= tot-1;
+
+ key->totkey++;
+ if(key->totkey==1) key->refkey= kb;
+
+
+ if(key->type == KEY_RELATIVE)
+ kb->pos= curpos+0.1;
+ else {
+ curpos= bsystem_time(scene, 0, (float)CFRA, 0.0);
+ if(calc_ipo_spec(key->ipo, KEY_SPEED, &curpos)==0) {
+ curpos /= 100.0;
+ }
+ kb->pos= curpos;
+
+ sort_keys(key);
+ }
+ return kb;
+}
+
+void insert_meshkey(Scene *scene, Mesh *me, short rel)
+{
+ Key *key;
+ KeyBlock *kb;
+
+ if(me->key==NULL) {
+ me->key= add_key( (ID *)me);
+
+ if(rel)
+ me->key->type = KEY_RELATIVE;
+ else
+ default_key_ipo(scene, me->key);
+ }
+ key= me->key;
+
+ kb= add_keyblock(scene, key);
+
+ mesh_to_key(me, kb);
+}
+
+/* ******************** */
+
+void latt_to_key(Lattice *lt, KeyBlock *kb)
+{
+ BPoint *bp;
+ float *fp;
+ int a, tot;
+
+ tot= lt->pntsu*lt->pntsv*lt->pntsw;
+ if(tot==0) return;
+
+ if(kb->data) MEM_freeN(kb->data);
+
+ kb->data= MEM_callocN(lt->key->elemsize*tot, "kb->data");
+ kb->totelem= tot;
+
+ bp= lt->def;
+ fp= kb->data;
+ for(a=0; a<kb->totelem; a++, fp+=3, bp++) {
+ VECCOPY(fp, bp->vec);
+ }
+}
+
+void key_to_latt(KeyBlock *kb, Lattice *lt)
+{
+ BPoint *bp;
+ float *fp;
+ int a, tot;
+
+ bp= lt->def;
+ fp= kb->data;
+
+ tot= lt->pntsu*lt->pntsv*lt->pntsw;
+ tot= MIN2(kb->totelem, tot);
+
+ for(a=0; a<tot; a++, fp+=3, bp++) {
+ VECCOPY(bp->vec, fp);
+ }
+
+}
+
+/* exported to python... hrms, should not, use object levels! (ton) */
+void insert_lattkey(Scene *scene, Lattice *lt, short rel)
+{
+ Key *key;
+ KeyBlock *kb;
+
+ if(lt->key==NULL) {
+ lt->key= add_key( (ID *)lt);
+ default_key_ipo(scene, lt->key);
+ }
+ key= lt->key;
+
+ kb= add_keyblock(scene, key);
+
+ latt_to_key(lt, kb);
+}
+
+/* ******************************** */
+
+void curve_to_key(Curve *cu, KeyBlock *kb, ListBase *nurb)
+{
+ Nurb *nu;
+ BezTriple *bezt;
+ BPoint *bp;
+ float *fp;
+ int a, tot;
+
+ /* count */
+ tot= count_curveverts(nurb);
+ if(tot==0) return;
+
+ if(kb->data) MEM_freeN(kb->data);
+
+ kb->data= MEM_callocN(cu->key->elemsize*tot, "kb->data");
+ kb->totelem= tot;
+
+ nu= nurb->first;
+ fp= kb->data;
+ while(nu) {
+
+ if(nu->bezt) {
+ bezt= nu->bezt;
+ a= nu->pntsu;
+ while(a--) {
+ VECCOPY(fp, bezt->vec[0]);
+ fp+= 3;
+ VECCOPY(fp, bezt->vec[1]);
+ fp+= 3;
+ VECCOPY(fp, bezt->vec[2]);
+ fp+= 3;
+ fp[0]= bezt->alfa;
+ fp+= 3; /* alphas */
+ bezt++;
+ }
+ }
+ else {
+ bp= nu->bp;
+ a= nu->pntsu*nu->pntsv;
+ while(a--) {
+ VECCOPY(fp, bp->vec);
+ fp[3]= bp->alfa;
+
+ fp+= 4;
+ bp++;
+ }
+ }
+ nu= nu->next;
+ }
+}
+
+void key_to_curve(KeyBlock *kb, Curve *cu, ListBase *nurb)
+{
+ Nurb *nu;
+ BezTriple *bezt;
+ BPoint *bp;
+ float *fp;
+ int a, tot;
+
+ nu= nurb->first;
+ fp= kb->data;
+
+ tot= count_curveverts(nurb);
+
+ tot= MIN2(kb->totelem, tot);
+
+ while(nu && tot>0) {
+
+ if(nu->bezt) {
+ bezt= nu->bezt;
+ a= nu->pntsu;
+ while(a-- && tot>0) {
+ VECCOPY(bezt->vec[0], fp);
+ fp+= 3;
+ VECCOPY(bezt->vec[1], fp);
+ fp+= 3;
+ VECCOPY(bezt->vec[2], fp);
+ fp+= 3;
+ bezt->alfa= fp[0];
+ fp+= 3; /* alphas */
+
+ tot-= 3;
+ bezt++;
+ }
+ }
+ else {
+ bp= nu->bp;
+ a= nu->pntsu*nu->pntsv;
+ while(a-- && tot>0) {
+ VECCOPY(bp->vec, fp);
+ bp->alfa= fp[3];
+
+ fp+= 4;
+ tot--;
+ bp++;
+ }
+ }
+ nu= nu->next;
+ }
+}
+
+
+void insert_curvekey(Scene *scene, Curve *cu, short rel)
+{
+ Key *key;
+ KeyBlock *kb;
+
+ if(cu->key==NULL) {
+ cu->key= add_key( (ID *)cu);
+
+ if (rel)
+ cu->key->type = KEY_RELATIVE;
+ else
+ default_key_ipo(scene, cu->key);
+ }
+ key= cu->key;
+
+ kb= add_keyblock(scene, key);
+
+ if(editNurb.first) curve_to_key(cu, kb, &editNurb);
+ else curve_to_key(cu, kb, &cu->nurb);
+}
+
+
+/* ******************** */
+
+void insert_shapekey(Scene *scene, Object *ob)
+{
+ if(get_mesh(ob) && get_mesh(ob)->mr) {
+ error("Cannot create shape keys on a multires mesh.");
+ }
+ else {
+ Key *key;
+
+ if(ob->type==OB_MESH) insert_meshkey(scene, ob->data, 1);
+ else if ELEM(ob->type, OB_CURVE, OB_SURF) insert_curvekey(scene, ob->data, 1);
+ else if(ob->type==OB_LATTICE) insert_lattkey(scene, ob->data, 1);
+
+ key= ob_get_key(ob);
+ ob->shapenr= BLI_countlist(&key->block);
+
+ BIF_undo_push("Add Shapekey");
+ }
+}
+
+void delete_key(Scene *scene, Object *ob)
+{
+ KeyBlock *kb, *rkb;
+ Key *key;
+ IpoCurve *icu;
+
+ key= ob_get_key(ob);
+ if(key==NULL) return;
+
+ kb= BLI_findlink(&key->block, ob->shapenr-1);
+
+ if(kb) {
+ for(rkb= key->block.first; rkb; rkb= rkb->next)
+ if(rkb->relative == ob->shapenr-1)
+ rkb->relative= 0;
+
+ BLI_remlink(&key->block, kb);
+ key->totkey--;
+ if(key->refkey== kb) key->refkey= key->block.first;
+
+ if(kb->data) MEM_freeN(kb->data);
+ MEM_freeN(kb);
+
+ for(kb= key->block.first; kb; kb= kb->next) {
+ if(kb->adrcode>=ob->shapenr)
+ kb->adrcode--;
+ }
+
+ if(key->ipo) {
+
+ for(icu= key->ipo->curve.first; icu; icu= icu->next) {
+ if(icu->adrcode==ob->shapenr-1) {
+ BLI_remlink(&key->ipo->curve, icu);
+ free_ipo_curve(icu);
+ break;
+ }
+ }
+ for(icu= key->ipo->curve.first; icu; icu= icu->next)
+ if(icu->adrcode>=ob->shapenr)
+ icu->adrcode--;
+ }
+
+ if(ob->shapenr>1) ob->shapenr--;
+ }
+
+ if(key->totkey==0) {
+ if(GS(key->from->name)==ID_ME) ((Mesh *)key->from)->key= NULL;
+ else if(GS(key->from->name)==ID_CU) ((Curve *)key->from)->key= NULL;
+ else if(GS(key->from->name)==ID_LT) ((Lattice *)key->from)->key= NULL;
+
+ free_libblock_us(&(G.main->key), key);
+ }
+
+ DAG_object_flush_update(scene, OBACT, OB_RECALC_DATA);
+
+ BIF_undo_push("Delete Shapekey");
+}
+
+void move_keys(Object *ob)
+{
+#if 0
+ /* XXX probably goes away entirely */
+ Key *key;
+ KeyBlock *kb;
+ float div, dy, oldpos, vec[3], dvec[3];
+ int afbreek=0, firsttime= 1;
+ unsigned short event = 0;
+ short mval[2], val, xo, yo;
+ char str[32];
+
+ if(G.sipo->blocktype!=ID_KE) return;
+
+ if(G.sipo->ipo && G.sipo->ipo->id.lib) return;
+ if(G.sipo->editipo==NULL) return;
+
+ key= ob_get_key(ob);
+ if(key==NULL) return;
+
+ /* which kb is involved */
+ kb= BLI_findlink(&key->block, ob->shapenr-1);
+ if(kb==NULL) return;
+
+ oldpos= kb->pos;
+
+ getmouseco_areawin(mval);
+ xo= mval[0];
+ yo= mval[1];
+ dvec[0]=dvec[1]=dvec[2]= 0.0;
+
+ while(afbreek==0) {
+ getmouseco_areawin(mval);
+ if(mval[0]!=xo || mval[1]!=yo || firsttime) {
+ firsttime= 0;
+
+ dy= (float)(mval[1]- yo);
+
+ div= (float)(G.v2d->mask.ymax-G.v2d->mask.ymin);
+ dvec[1]+= (G.v2d->cur.ymax-G.v2d->cur.ymin)*(dy)/div;
+
+ VECCOPY(vec, dvec);
+
+ apply_keyb_grid(vec, 0.0, 1.0, 0.1, U.flag & USER_AUTOGRABGRID);
+ apply_keyb_grid(vec+1, 0.0, 1.0, 0.1, U.flag & USER_AUTOGRABGRID);
+
+ kb->pos= oldpos+vec[1];
+
+ sprintf(str, "Y: %.3f ", vec[1]);
+ headerprint(str);
+
+ xo= mval[0];
+ yo= mval[1];
+
+ force_draw(0);
+ }
+ else BIF_wait_for_statechange();
+
+ while(qtest()) {
+ event= extern_qread(&val);
+ if(val) {
+ switch(event) {
+ case ESCKEY:
+ case LEFTMOUSE:
+ case SPACEKEY:
+ afbreek= 1;
+ break;
+ default:
+ arrows_move_cursor(event);
+ }
+ }
+ }
+ }
+
+ if(event==ESCKEY) {
+ kb->pos= oldpos;
+ }
+
+ sort_keys(key);
+ DAG_object_flush_update(scene, ob, OB_RECALC_DATA);
+
+ /* for boundbox */
+ editipo_changed(G.sipo, 0);
+
+ BIF_undo_push("Move Shapekey(s)");
+#endif
+}
diff --git a/source/blender/editors/object/editlattice.c b/source/blender/editors/object/editlattice.c
new file mode 100644
index 00000000000..523f38dd432
--- /dev/null
+++ b/source/blender/editors/object/editlattice.c
@@ -0,0 +1,343 @@
+/**
+ * $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) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * Contributor(s): Blender Foundation
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_arithb.h"
+
+#include "DNA_curve_types.h"
+#include "DNA_key_types.h"
+#include "DNA_lattice_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_view3d_types.h"
+
+#include "BKE_armature.h"
+#include "BKE_context.h"
+#include "BKE_depsgraph.h"
+#include "BKE_global.h"
+#include "BKE_key.h"
+#include "BKE_lattice.h"
+#include "BKE_mesh.h"
+#include "BKE_utildefines.h"
+
+#include "ED_object.h"
+#include "ED_view3d.h"
+#include "ED_util.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "object_intern.h"
+
+/* ***************************** */
+
+static int okee() {return 0;}
+
+void free_editLatt(Object *ob)
+{
+ Lattice *lt= ob->data;
+
+ if(lt->editlatt) {
+ if(lt->editlatt->def) MEM_freeN(lt->editlatt->def);
+ if(lt->editlatt->dvert)
+ free_dverts(lt->editlatt->dvert, lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw);
+
+ MEM_freeN(lt->editlatt);
+ lt->editlatt= NULL;
+ }
+}
+
+
+static void setflagsLatt(Object *obedit, int flag)
+{
+ Lattice *lt= obedit->data;
+ BPoint *bp;
+ int a;
+
+ bp= lt->editlatt->def;
+
+ a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
+
+ while(a--) {
+ if(bp->hide==0) {
+ bp->f1= flag;
+ }
+ bp++;
+ }
+}
+
+
+
+void make_editLatt(Object *obedit)
+{
+ Lattice *lt= obedit->data;
+ KeyBlock *actkey;
+
+ free_editLatt(obedit);
+
+ lt= obedit->data;
+
+ actkey = ob_get_keyblock(obedit);
+ if(actkey) {
+ key_to_latt(actkey, lt);
+ }
+
+ lt->editlatt= MEM_dupallocN(lt);
+ lt->editlatt->def= MEM_dupallocN(lt->def);
+
+ if(lt->dvert) {
+ int tot= lt->pntsu*lt->pntsv*lt->pntsw;
+ lt->editlatt->dvert = MEM_mallocN (sizeof (MDeformVert)*tot, "Lattice MDeformVert");
+ copy_dverts(lt->editlatt->dvert, lt->dvert, tot);
+ }
+
+ //BIF_undo_push("Original");
+}
+
+
+void load_editLatt(Object *obedit)
+{
+ Lattice *lt;
+ KeyBlock *actkey;
+ BPoint *bp;
+ float *fp;
+ int tot;
+
+ lt= obedit->data;
+
+ actkey = ob_get_keyblock(obedit);
+ if(actkey) {
+ /* active key: vertices */
+ tot= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
+
+ if(actkey->data) MEM_freeN(actkey->data);
+
+ fp=actkey->data= MEM_callocN(lt->key->elemsize*tot, "actkey->data");
+ actkey->totelem= tot;
+
+ bp= lt->editlatt->def;
+ while(tot--) {
+ VECCOPY(fp, bp->vec);
+ fp+= 3;
+ bp++;
+ }
+ }
+ else {
+
+ MEM_freeN(lt->def);
+
+ lt->def= MEM_dupallocN(lt->editlatt->def);
+
+ lt->flag= lt->editlatt->flag;
+
+ lt->pntsu= lt->editlatt->pntsu;
+ lt->pntsv= lt->editlatt->pntsv;
+ lt->pntsw= lt->editlatt->pntsw;
+
+ lt->typeu= lt->editlatt->typeu;
+ lt->typev= lt->editlatt->typev;
+ lt->typew= lt->editlatt->typew;
+ }
+
+ if(lt->dvert) {
+ free_dverts(lt->dvert, lt->pntsu*lt->pntsv*lt->pntsw);
+ lt->dvert= NULL;
+ }
+
+ if(lt->editlatt->dvert) {
+ int tot= lt->pntsu*lt->pntsv*lt->pntsw;
+
+ lt->dvert = MEM_mallocN (sizeof (MDeformVert)*tot, "Lattice MDeformVert");
+ copy_dverts(lt->dvert, lt->editlatt->dvert, tot);
+ }
+
+}
+
+void remake_editLatt(Object *obedit)
+{
+ if(okee("Reload original data")==0) return;
+
+ make_editLatt(obedit);
+
+ //BIF_undo_push("Reload original");
+}
+
+
+void deselectall_Latt(Object *obedit)
+{
+ Lattice *lt= obedit->data;
+ BPoint *bp;
+ int a;
+
+ bp= lt->editlatt->def;
+
+ a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
+
+ while(a--) {
+ if(bp->hide==0) {
+ if(bp->f1) {
+ setflagsLatt(obedit, 0);
+ //BIF_undo_push("(De)select all");
+ return;
+ }
+ }
+ bp++;
+ }
+ setflagsLatt(obedit, 1);
+ //BIF_undo_push("(De)select all");
+}
+
+static void findnearestLattvert__doClosest(void *userData, BPoint *bp, int x, int y)
+{
+ struct { BPoint *bp; short dist, select, mval[2]; } *data = userData;
+ float temp = abs(data->mval[0]-x) + abs(data->mval[1]-y);
+
+ if ((bp->f1 & SELECT)==data->select) temp += 5;
+ if (temp<data->dist) {
+ data->dist = temp;
+
+ data->bp = bp;
+ }
+}
+static BPoint *findnearestLattvert(ViewContext *vc, short mval[2], int sel)
+{
+ /* sel==1: selected gets a disadvantage */
+ /* in nurb and bezt or bp the nearest is written */
+ /* return 0 1 2: handlepunt */
+ struct { BPoint *bp; short dist, select, mval[2]; } data = {0};
+
+ data.dist = 100;
+ data.select = sel;
+ data.mval[0]= mval[0];
+ data.mval[1]= mval[1];
+
+ lattice_foreachScreenVert(vc, findnearestLattvert__doClosest, &data);
+
+ return data.bp;
+}
+
+
+void mouse_lattice(bContext *C, short mval[2], int extend)
+{
+ ViewContext vc;
+ BPoint *bp=0;
+
+ view3d_set_viewcontext(C, &vc);
+
+ bp= findnearestLattvert(&vc, mval, 1);
+
+ if(bp) {
+ if(extend==0) {
+
+ setflagsLatt(vc.obedit, 0);
+ bp->f1 |= SELECT;
+
+ }
+ else {
+ bp->f1 ^= SELECT; /* swap */
+ }
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, vc.obedit);
+ //BIF_undo_push("Select");
+ }
+}
+
+
+/* **************** undo for lattice object ************** */
+
+typedef struct UndoLattice {
+ BPoint *def;
+ int pntsu, pntsv, pntsw;
+} UndoLattice;
+
+static void undoLatt_to_editLatt(void *data, void *edata)
+{
+ UndoLattice *ult= (UndoLattice*)data;
+ Lattice *editlatt= (Lattice *)edata;
+ int a= editlatt->pntsu*editlatt->pntsv*editlatt->pntsw;
+
+ memcpy(editlatt->def, ult->def, a*sizeof(BPoint));
+}
+
+static void *editLatt_to_undoLatt(void *edata)
+{
+ UndoLattice *ult= MEM_callocN(sizeof(UndoLattice), "UndoLattice");
+ Lattice *editlatt= (Lattice *)edata;
+
+ ult->def= MEM_dupallocN(editlatt->def);
+ ult->pntsu= editlatt->pntsu;
+ ult->pntsv= editlatt->pntsv;
+ ult->pntsw= editlatt->pntsw;
+
+ return ult;
+}
+
+static void free_undoLatt(void *data)
+{
+ UndoLattice *ult= (UndoLattice*)data;
+
+ if(ult->def) MEM_freeN(ult->def);
+ MEM_freeN(ult);
+}
+
+static int validate_undoLatt(void *data, void *edata)
+{
+ UndoLattice *ult= (UndoLattice*)data;
+ Lattice *editlatt= (Lattice *)edata;
+
+ return (ult->pntsu == editlatt->pntsu &&
+ ult->pntsv == editlatt->pntsv &&
+ ult->pntsw == editlatt->pntsw);
+}
+
+static void *get_editlatt(bContext *C)
+{
+ Object *obedit= CTX_data_edit_object(C);
+ if(obedit && obedit->type==OB_LATTICE) {
+ Lattice *lt= obedit->data;
+ return lt->editlatt;
+ }
+ return NULL;
+}
+
+
+/* and this is all the undo system needs to know */
+void undo_push_lattice(bContext *C, char *name)
+{
+ undo_editmode_push(C, name, get_editlatt, free_undoLatt, undoLatt_to_editLatt, editLatt_to_undoLatt, validate_undoLatt);
+}
+
+
+
+/***/
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c
index 3e09315f2b2..27b4e35d004 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -467,14 +467,14 @@ static void select_editmesh_hook(Object *ob, HookModifierData *hmd)
EM_select_flush(em);
}
-static int return_editlattice_indexar(int *tot, int **indexar, float *cent)
+static int return_editlattice_indexar(Lattice *editlatt, int *tot, int **indexar, float *cent)
{
BPoint *bp;
int *index, nr, totvert=0, a;
/* count */
- a= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
- bp= editLatt->def;
+ a= editlatt->pntsu*editlatt->pntsv*editlatt->pntsw;
+ bp= editlatt->def;
while(a--) {
if(bp->f1 & SELECT) {
if(bp->hide==0) totvert++;
@@ -489,8 +489,8 @@ static int return_editlattice_indexar(int *tot, int **indexar, float *cent)
nr= 0;
cent[0]= cent[1]= cent[2]= 0.0;
- a= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
- bp= editLatt->def;
+ a= editlatt->pntsu*editlatt->pntsv*editlatt->pntsw;
+ bp= editlatt->def;
while(a--) {
if(bp->f1 & SELECT) {
if(bp->hide==0) {
@@ -507,14 +507,15 @@ static int return_editlattice_indexar(int *tot, int **indexar, float *cent)
return totvert;
}
-static void select_editlattice_hook(HookModifierData *hmd)
+static void select_editlattice_hook(Object *obedit, HookModifierData *hmd)
{
+ Lattice *lt= obedit->data;
BPoint *bp;
int index=0, nr=0, a;
/* count */
- a= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
- bp= editLatt->def;
+ a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
+ bp= lt->editlatt->def;
while(a--) {
if(hmd->indexar[index]==nr) {
bp->f1 |= SELECT;
@@ -644,7 +645,10 @@ int hook_getIndexArray(Object *obedit, int *tot, int **indexar, char *name, floa
case OB_SURF:
return return_editcurve_indexar(tot, indexar, cent_r);
case OB_LATTICE:
- return return_editlattice_indexar(tot, indexar, cent_r);
+ {
+ Lattice *lt= obedit->data;
+ return return_editlattice_indexar(lt->editlatt, tot, indexar, cent_r);
+ }
default:
return 0;
}
@@ -701,7 +705,7 @@ void obedit_hook_select(Object *ob, HookModifierData *hmd)
{
if(ob->type==OB_MESH) select_editmesh_hook(ob, hmd);
- else if(ob->type==OB_LATTICE) select_editlattice_hook(hmd);
+ else if(ob->type==OB_LATTICE) select_editlattice_hook(ob, hmd);
else if(ob->type==OB_CURVE) select_editcurve_hook(hmd);
else if(ob->type==OB_SURF) select_editcurve_hook(hmd);
}
@@ -1813,9 +1817,10 @@ void make_vertex_parent(Scene *scene, Object *obedit, View3D *v3d)
}
}
else if(obedit->type==OB_LATTICE) {
+ Lattice *lt= obedit->data;
- a= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
- bp= editLatt->def;
+ a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
+ bp= lt->editlatt->def;
while(a--) {
if(bp->f1 & SELECT) {
if(v1==0) v1= nr;
@@ -2691,8 +2696,8 @@ void ED_object_exit_editmode(bContext *C, int flag)
// load_editText();
}
else if(obedit->type==OB_LATTICE) {
-// load_editLatt();
-// if(freedata) free_editLatt();
+ load_editLatt(obedit);
+ if(freedata) free_editLatt(obedit);
}
else if(obedit->type==OB_MBALL) {
// extern ListBase editelems;
@@ -2783,21 +2788,28 @@ void ED_object_enter_editmode(bContext *C, int flag)
scene->obedit= ob; // XXX for context
// ok= 1;
// XXX make_editText();
+ WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_EDITMODE_TEXT, ob);
}
else if(ob->type==OB_MBALL) {
scene->obedit= ob; // XXX for context
// ok= 1;
// XXX make_editMball();
+ WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_EDITMODE_MBALL, ob);
+
}
else if(ob->type==OB_LATTICE) {
scene->obedit= ob; // XXX for context
-// ok= 1;
-// XXX make_editLatt();
+ ok= 1;
+ make_editLatt(ob);
+
+ WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_EDITMODE_LATTICE, ob);
}
else if(ob->type==OB_SURF || ob->type==OB_CURVE) {
// ok= 1;
scene->obedit= ob; // XXX for context
// XXX make_editNurb();
+
+ WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_EDITMODE_CURVE, ob);
}
if(ok) {
@@ -3404,11 +3416,12 @@ void special_editmenu(Scene *scene, View3D *v3d)
// XXX switch_direction_armature();
}
else if(obedit->type==OB_LATTICE) {
+ Lattice *lt= obedit->data;
static float weight= 1.0f;
{ // XXX
// XXX if(fbutton(&weight, 0.0f, 1.0f, 10, 10, "Set Weight")) {
- int a= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
- BPoint *bp= editLatt->def;
+ int a= lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
+ BPoint *bp= lt->editlatt->def;
while(a--) {
if(bp->f1 & SELECT)
diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h
index a666149050f..f34ee447e70 100644
--- a/source/blender/editors/object/object_intern.h
+++ b/source/blender/editors/object/object_intern.h
@@ -29,6 +29,11 @@
#define ED_OBJECT_INTERN_H
struct wmOperatorType;
+struct KeyBlock;
+struct Lattice;
+struct Curve;
+struct Object;
+struct Mesh;
/* internal exports only */
#define CLEAR_OBJ_ROTATION 0
@@ -58,5 +63,21 @@ void OBJECT_OT_set_slowparent(struct wmOperatorType *ot);
void OBJECT_OT_clear_slowparent(struct wmOperatorType *ot);
void OBJECT_OT_set_center(struct wmOperatorType *ot);
+/* editkey.c */
+void key_to_mesh(struct KeyBlock *kb, struct Mesh *me);
+void mesh_to_key(struct Mesh *me, struct KeyBlock *kb);
+void key_to_latt(struct KeyBlock *kb, struct Lattice *lt);
+void latt_to_key(struct Lattice *lt, struct KeyBlock *kb);
+void key_to_curve(struct KeyBlock *kb, struct Curve *cu, struct ListBase *nurb);
+void curve_to_key(struct Curve *cu, struct KeyBlock *kb, struct ListBase *nurb);
+
+
+/* editlattice.c */
+void free_editLatt(Object *ob);
+void make_editLatt(Object *obedit);
+void load_editLatt(Object *obedit);
+void remake_editLatt(Object *obedit);
+
+
#endif /* ED_OBJECT_INTERN_H */
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index dfb4e0dea55..0044002d078 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -114,7 +114,6 @@
/* pretty stupid */
-/* extern Lattice *editLatt; already in BKE_lattice.h */
/* editcurve.c */
extern ListBase editNurb;
/* editmball.c */
@@ -1083,11 +1082,13 @@ static void lattice_draw_verts(Lattice *lt, DispList *dl, short sel)
void lattice_foreachScreenVert(ViewContext *vc, void (*func)(void *userData, BPoint *bp, int x, int y), void *userData)
{
- BPoint *bp = editLatt->def;
- DispList *dl = find_displist(&vc->obedit->disp, DL_VERTS);
+ Object *obedit= vc->obedit;
+ Lattice *lt= obedit->data;
+ BPoint *bp = lt->editlatt->def;
+ DispList *dl = find_displist(&obedit->disp, DL_VERTS);
float *co = dl?dl->verts:NULL;
float pmat[4][4], vmat[4][4];
- int i, N = editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
+ int i, N = lt->editlatt->pntsu*lt->editlatt->pntsv*lt->editlatt->pntsw;
short s[2];
view3d_get_object_project_mat(vc->v3d, vc->obedit, pmat, vmat);
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index d828c0c35d5..1be23b6aade 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -2048,6 +2048,8 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
// if (v3d->flag2 & V3D_DISPGP)
// draw_gpencil_3dview(ar, 0);
+ drawcursor(scene, ar, v3d);
+
if(U.uiflag & USER_SHOW_ROTVIEWICON)
draw_view_axis(v3d);
else
diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h
index f304418ba8a..e7e6f6f4253 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -116,8 +116,6 @@ void VIEW3D_OT_circle_select(struct wmOperatorType *ot);
void VIEW3D_OT_borderselect(struct wmOperatorType *ot);
void VIEW3D_OT_lasso_select(struct wmOperatorType *ot);
-void view3d_set_viewcontext(struct bContext *C, struct ViewContext *vc);
-
/* vpaint.c */
void VIEW3D_OT_vpaint_toggle(struct wmOperatorType *ot);
void VIEW3D_OT_vpaint(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c
index 2a6d7f3269a..11f9ad9a9b4 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -1541,6 +1541,8 @@ static int view3d_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
mouse_mesh(C, mval, extend);
else if(obedit->type==OB_ARMATURE)
mouse_armature(C, mval, extend);
+ else if(obedit->type==OB_LATTICE)
+ mouse_lattice(C, mval, extend);
}
else