- 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.
This commit is contained in:
Ton Roosendaal 2009-01-13 15:18:41 +00:00
parent b3d8cbd113
commit b8dac71bda
16 changed files with 1284 additions and 89 deletions

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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) {

View File

@ -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 */

View File

@ -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);

View File

@ -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:

View File

@ -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;

View File

@ -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);
}

View File

@ -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
}

View File

@ -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);
}
/***/

View File

@ -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)

View File

@ -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 */

View File

@ -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);

View File

@ -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

View File

@ -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);

View File

@ -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