diff options
Diffstat (limited to 'source/blender/src/editmball.c')
-rw-r--r-- | source/blender/src/editmball.c | 301 |
1 files changed, 301 insertions, 0 deletions
diff --git a/source/blender/src/editmball.c b/source/blender/src/editmball.c new file mode 100644 index 00000000000..329157fcda0 --- /dev/null +++ b/source/blender/src/editmball.c @@ -0,0 +1,301 @@ +/** + * $Id$ + * + * ***** BEGIN GPL/BL DUAL 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. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * 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. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +#ifdef WIN32 +#include "BLI_winstuff.h" +#endif +#include "MEM_guardedalloc.h" + +#include "BLI_blenlib.h" +#include "BLI_arithb.h" +#include "BLI_editVert.h" + +#include "DNA_screen_types.h" +#include "DNA_meta_types.h" +#include "DNA_object_types.h" +#include "DNA_view3d_types.h" + +#include "BKE_utildefines.h" +#include "BKE_displist.h" +#include "BKE_global.h" +#include "BKE_object.h" + +#include "BIF_gl.h" +#include "BIF_graphics.h" +#include "BIF_screen.h" +#include "BIF_toolbox.h" +#include "BIF_space.h" + +#include "BDR_editobject.h" +#include "BDR_editmball.h" + +#include "BSE_edit.h" +#include "BSE_view.h" + +#include "render.h" +#include "blendef.h" +#include "mydevice.h" + +extern short editbutflag; + +ListBase editelems= {0, 0}; +MetaElem *lastelem; + +void make_editMball() +{ + MetaBall *mb; + MetaElem *ml, *newmb; + + BLI_freelistN(&editelems); + lastelem= 0; + + mb= G.obedit->data; + ml= mb->elems.first; + + while(ml) { + newmb= MEM_dupallocN(ml); + BLI_addtail(&editelems, newmb); + if(ml->flag & SELECT) lastelem= newmb; + + ml= ml->next; + } + + allqueue(REDRAWBUTSEDIT, 0); + + countall(); +} + +void load_editMball() +{ + /* load mball in object */ + MetaBall *mb; + MetaElem *ml, *newml; + + if(G.obedit==0) return; + + mb= G.obedit->data; + BLI_freelistN(&(mb->elems)); + + + ml= editelems.first; + while(ml) { + newml= MEM_dupallocN(ml); + BLI_addtail(&(mb->elems), newml); + + ml= ml->next; + } +} + +void add_primitiveMball(int dummy_argument) +{ + MetaElem *ml; + float *curs, mat[3][3], cent[3], imat[3][3], cmat[3][3]; + + if(G.scene->id.lib) return; + + /* this function also comes from an info window */ + if ELEM(curarea->spacetype, SPACE_VIEW3D, SPACE_INFO); else return; + + check_editmode(OB_MBALL); + + /* als geen obedit: nieuw object en in editmode gaan */ + if(G.obedit==0) { + add_object(OB_MBALL); + base_init_from_view3d(BASACT, G.vd); + G.obedit= BASACT->object; + + where_is_object(G.obedit); + + make_editMball(); + setcursor_space(SPACE_VIEW3D, CURSOR_EDIT); + } + + /* deselecteren */ + ml= editelems.first; + while(ml) { + ml->flag &= ~SELECT; + ml= ml->next; + } + + /* imat en centrum en afmeting */ + Mat3CpyMat4(mat, G.obedit->obmat); + + curs= give_cursor(); + VECCOPY(cent, curs); + cent[0]-= G.obedit->obmat[3][0]; + cent[1]-= G.obedit->obmat[3][1]; + cent[2]-= G.obedit->obmat[3][2]; + + Mat3CpyMat4(imat, G.vd->viewmat); + Mat3MulVecfl(imat, cent); + Mat3MulMat3(cmat, imat, mat); + Mat3Inv(imat,cmat); + + Mat3MulVecfl(imat, cent); + + ml= MEM_callocN(sizeof(MetaElem), "metaelem"); + BLI_addtail(&editelems, ml); + + ml->x= cent[0]; + ml->y= cent[1]; + ml->z= cent[2]; + ml->rad= 1.0; + ml->lay= 1; + ml->s= 2.0; + ml->len= 1.0; + ml->expx= ml->expy= ml->expz= 2.0; + ml->flag= SELECT; + + lastelem= ml; + + allqueue(REDRAWVIEW3D, 0); + allqueue(REDRAWBUTSALL, 0); + makeDispList(G.obedit); +} + +void deselectall_mball() +{ + MetaElem *ml; + int sel= 0; + + ml= editelems.first; + while(ml) { + if(ml->flag & SELECT) break; + ml= ml->next; + } + + if(ml) sel= 1; + + ml= editelems.first; + while(ml) { + if(sel) ml->flag &= ~SELECT; + else ml->flag |= SELECT; + ml= ml->next; + } + allqueue(REDRAWVIEW3D, 0); +} + +void mouse_mball() +{ + static MetaElem *startelem=0; + MetaElem *ml, *act=0; + int a, hits; + /* was IGLuint ... but is stupid */ + GLuint buffer[MAXPICKBUF]; + + hits= selectprojektie(buffer, 0, 0, 0, 0); + + /* bestaat startelem? */ + ml= editelems.first; + while(ml) { + if(ml==startelem) break; + ml= ml->next; + } + if(ml==0) startelem= editelems.first; + + if(hits>0) { + ml= startelem; + while(ml) { + /* if(base->lay & G.vd->lay) { */ + + for(a=0; a<hits; a++) { + /* index converted for gl stuff */ + if(ml->selcol==buffer[ 4 * a + 3 ]) act= ml; + } + /* } */ + + if(act) break; + + ml= ml->next; + if(ml==0) ml= editelems.first; + if(ml==startelem) break; + } + if(act) { + if((G.qual & LR_SHIFTKEY)==0) { + deselectall_mball(); + if(act->flag & SELECT) deselectall_mball(); + act->flag |= SELECT; + } + else { + if(act->flag & SELECT) { + act->flag &= ~SELECT; + } + else act->flag |= SELECT; + } + lastelem= act; + allqueue(REDRAWVIEW3D, 0); + allqueue(REDRAWBUTSEDIT, 0); + } + } + rightmouse_transform(); +} + +void adduplicate_mball() +{ + MetaElem *ml, *newml; + + ml= editelems.last; + while(ml) { + if(ml->flag & SELECT) { + newml= MEM_dupallocN(ml); + BLI_addtail(&editelems, newml); + lastelem= newml; + ml->flag &= ~SELECT; + } + ml= ml->prev; + } + + transform('g'); + allqueue(REDRAWBUTSEDIT, 0); +} + +void delete_mball() +{ + MetaElem *ml, *next; + + if(okee("Erase selected")==0) return; + + ml= editelems.first; + while(ml) { + next= ml->next; + if(ml->flag & SELECT) { + if(lastelem==ml) lastelem= 0; + BLI_remlink(&editelems, ml); + MEM_freeN(ml); + } + ml= next; + } + + makeDispList(G.obedit); + allqueue(REDRAWVIEW3D, 0); + allqueue(REDRAWBUTSEDIT, 0); +} |