Editmesh code cleaned and compiling/linking. A whopping
20k lines back! :)
Not that it does stuff... editmode in/out has to be done,
and loads of operators. Also linking/exporting editmesh
calls has to be reviewed.

Also: added a blender_test_break() mechanism in BKE.
This commit is contained in:
Ton Roosendaal 2008-12-30 13:16:14 +00:00
parent 446492c266
commit 25fac7b001
30 changed files with 20235 additions and 68 deletions

View File

@ -161,7 +161,6 @@ COMLIB += $(NAN_MEMUTIL)/lib/libmemutil.a
COMLIB += $(NAN_BMFONT)/lib/$(DEBUG_DIR)libbmfont.a
COMLIB += $(NAN_PNG)/lib/libpng.a
COMLIB += $(OCGDIR)/blender/yafray/$(DEBUG_DIR)libyafrayexport.a
COMLIB += $(OCGDIR)/blender/blenlib/$(DEBUG_DIR)libblenlib.a
ifeq ($(WITH_QUICKTIME), true)
COMLIB += $(OCGDIR)/blender/blenderqt/$(DEBUG_DIR)libblenderqt.a
@ -252,6 +251,7 @@ PULIB += $(OCGDIR)/blender/ed_time/libed_time.a
PULIB += $(OCGDIR)/blender/ed_view3d/libed_view3d.a
PULIB += $(OCGDIR)/blender/ed_interface/libed_interface.a
PULIB += $(OCGDIR)/blender/ed_object/libed_object.a
PULIB += $(OCGDIR)/blender/ed_mesh/libed_mesh.a
PULIB += $(OCGDIR)/blender/ed_animation/libed_animation.a
PULIB += $(OCGDIR)/blender/ed_transform/libed_transform.a
PULIB += $(OCGDIR)/blender/ed_util/libed_util.a
@ -260,6 +260,8 @@ PULIB += $(OCGDIR)/blender/ed_screen/libed_screen.a
PULIB += $(OCGDIR)/blender/windowmanager/libwindowmanager.a
PULIB += $(OCGDIR)/blender/python/$(DEBUG_DIR)libpython.a
PULIB += $(OCGDIR)/blender/makesrna/$(DEBUG_DIR)librna.a
# note, no idea but it suddenly doesn't compile :(
PULIB += $(OCGDIR)/blender/blenlib/$(DEBUG_DIR)libblenlib.a
ifeq ($(NAN_NO_KETSJI),true)
PULIB += $(NAN_MOTO)/lib/libmoto.a

View File

@ -55,6 +55,10 @@ int BKE_read_file_from_memfile(struct bContext *C, struct MemFile *memfile, stru
void free_blender(void);
void initglobals(void);
/* set this callback when a UI is running */
void set_blender_test_break_cb(void (*func)(void) );
int blender_test_break(void);
void pushdata(void *data, int len);
void popfirst(void *data);
void poplast(void *data);

View File

@ -90,7 +90,6 @@
#include "BKE_utildefines.h" // O_BINARY FALSE
Global G;
UserDef U;
ListBase WMlist= {NULL, NULL};
@ -475,6 +474,26 @@ int BKE_read_file_from_memfile(bContext *C, MemFile *memfile, ReportList *report
return (bfd?1:0);
}
/* ***************** testing for break ************* */
static void (*blender_test_break_cb)(void)= NULL;
void set_blender_test_break_cb(void (*func)(void) )
{
blender_test_break_cb= func;
}
int blender_test_break(void)
{
if (!G.background) {
if (blender_test_break_cb)
blender_test_break_cb();
}
return (G.afbreek==1);
}
/* ***************** GLOBAL UNDO *************** */

View File

@ -172,6 +172,9 @@ typedef struct EditMesh
* never access this directly, use EM_set_actFace and EM_get_actFace */
EditFace *act_face;
/* copy from scene */
int selectmode;
struct DerivedMesh *derivedCage, *derivedFinal;
/* the custom data layer mask that was last used to calculate
* derivedCage and derivedFinal

View File

@ -29,6 +29,6 @@
# Bounces make to subdirectories.
SOURCEDIR = source/blender/editors
DIRS = animation object datafiles transform screen space_outliner space_time space_view3d interface util space_api space_ipo space_image space_node space_buttons space_info space_file space_sound space_action space_nla space_script space_text space_sequencer
DIRS = mesh animation object datafiles transform screen space_outliner space_time space_view3d interface util space_api space_ipo space_image space_node space_buttons space_info space_file space_sound space_action space_nla space_script space_text space_sequencer
include nan_subdirs.mk

View File

@ -28,6 +28,60 @@
#ifndef ED_MESH_H
#define ED_MESH_H
struct View3D;
// edge and face flag both
#define EM_FGON 2
// face flag
#define EM_FGON_DRAW 1
/* editbutflag */
#define B_CLOCKWISE 1
#define B_KEEPORIG 2
#define B_BEAUTY 4
#define B_SMOOTH 8
#define B_BEAUTY_SHORT 16
#define B_AUTOFGON 32
#define B_KNIFE 0x80
#define B_PERCENTSUBD 0x40
#define B_MESH_X_MIRROR 0x100
#define B_JOINTRIA_UV 0x200
#define B_JOINTRIA_VCOL 0X400
#define B_JOINTRIA_SHARP 0X800
#define B_JOINTRIA_MAT 0X1000
/* editmesh.c */
void EM_init_index_arrays(EditMesh *em, int forVert, int forEdge, int forFace);
void EM_free_index_arrays(void);
EditVert *EM_get_vert_for_index(int index);
EditEdge *EM_get_edge_for_index(int index);
EditFace *EM_get_face_for_index(int index);
int EM_texFaceCheck(EditMesh *em);
int EM_vertColorCheck(EditMesh *em);
/* editmesh_lib.c */
EditFace *EM_get_actFace(EditMesh *em, int sloppy);
void EM_select_edge(EditEdge *eed, int sel);
void EM_select_face_fgon(EditMesh *em, EditFace *efa, int val);
void EM_selectmode_flush(EditMesh *em);
void EM_deselect_flush(EditMesh *em);
/* editmesh_mods.c */
extern unsigned int em_vertoffs, em_solidoffs, em_wireoffs;
int EM_check_backbuf(unsigned int index);
int EM_mask_init_backbuf_border(struct View3D *v3d, short mcords[][2], short tot, short xmin, short ymin, short xmax, short ymax);
void EM_free_backbuf(void);
int EM_init_backbuf_border(struct View3D *v3d, short xmin, short ymin, short xmax, short ymax);
int EM_init_backbuf_circle(struct View3D *v3d, short xs, short ys, short rads);
#endif /* ED_MESH_H */

View File

@ -0,0 +1,59 @@
/*
* $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) 2006 by Nicholas Bishop
* All rights reserved.
*
* The Original Code is: all of this file.
*
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
*/
#ifndef MULTIRES_H
#define MULTIRES_H
struct CustomData;
struct EditMesh;
struct Object;
struct MDeformVert;
struct Mesh;
struct MultiresLevel;
struct Multires;
struct uiBlock;
/* For canceling operations that don't work with multires on or on a non-base level */
int multires_test();
int multires_level1_test();
void multires_draw_interface(struct uiBlock *block, unsigned short cx, unsigned short cy);
void multires_make(void *ob, void *me);
void multires_delete(void *ob, void *me);
void multires_level_to_editmesh(struct Object *ob, struct Mesh *me, const int render);
void multires_finish_mesh_update(struct Object *ob);
void multires_subdivide(void *ob, void *me);
void multires_del_lower(void *ob, void *me);
void multires_del_higher(void *ob, void *me);
void multires_set_level_cb(void *ob, void *me);
void multires_edge_level_update_cb(void *ob, void *me);
int multires_modifier_warning();
#endif

View File

@ -29,6 +29,7 @@
#define ED_OBJECT_H
struct wmWindowManager;
struct Scene;
struct Object;
struct bContext;
struct Base;
@ -41,6 +42,9 @@ void ED_base_object_select(struct Base *base, short mode);
/* includes notifier */
void ED_base_object_activate(struct bContext *C, struct Base *base);
void ED_base_object_free_and_unlink(struct Scene *scene, struct Base *base);
/* cleanup */
int object_data_is_libdata(struct Object *ob);
int object_is_libdata(struct Object *ob);

View File

@ -28,17 +28,19 @@
#
# Makes module object directory and bounces make to subdirectories.
LIBNAME = ed_screen
LIBNAME = ed_mesh
DIR = $(OCGDIR)/blender/$(LIBNAME)
include nan_compile.mk
CFLAGS += $(LEVEL_1_C_WARNINGS)
CPPFLAGS += -I$(NAN_GLEW)/include
CPPFLAGS += -I$(OPENGL_HEADERS)
CPPFLAGS += -I$(NAN_BMFONT)/include
CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
CPPFLAGS += -I$(NAN_ELBEEM)/include
CPPFLAGS += -I../../windowmanager
CPPFLAGS += -I../../blenkernel
@ -46,6 +48,8 @@ CPPFLAGS += -I../../blenloader
CPPFLAGS += -I../../blenlib
CPPFLAGS += -I../../makesdna
CPPFLAGS += -I../../imbuf
CPPFLAGS += -I../../gpu
CPPFLAGS += -I../../render/extern/include
# own include

View File

@ -0,0 +1,11 @@
#!/usr/bin/python
Import ('env')
sources = env.Glob('*.c')
incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
incs += ' #/intern/guardedalloc #intern/bmfont ../../gpu'
incs += ' ../../makesrna ../../render/extern/include #/intern/elbeem/extern'
env.BlenderLib ( 'bf_editors_mesh', sources, Split(incs), [], libtype=['core'], priority=[35] )

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,202 @@
/**
* $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.
*
* The Original Code is: all of this file.
*
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
*/
/* Internal for editmesh_xxxx.c functions */
#ifndef EDITMESH_H
#define EDITMESH_H
struct View3D;
#define TEST_EDITMESH if(G.obedit==0) return; /* layer test XXX */
#define UVCOPY(t, s) memcpy(t, s, 2 * sizeof(float));
/* ******************** editface.c */
int edgetag_context_check(Scene *scene, EditEdge *eed);
void edgetag_context_set(Scene *scene, EditEdge *eed, int val);
int edgetag_shortest_path(Scene *scene, EditMesh *em, EditEdge *source, EditEdge *target);
/* ******************* meshtools.c */
intptr_t mesh_octree_table(Object *ob, EditMesh *em, float *co, char mode);
EditVert *editmesh_get_x_mirror_vert(Object *ob, EditMesh *em, float *co);
int mesh_get_x_mirror_vert(Object *ob, int index);
/* XXX move to uv editor? */
enum {
B_UVAUTO_REDRAW = 3301,
B_UVAUTO_SPHERE,
B_UVAUTO_CYLINDER,
B_UVAUTO_CYLRADIUS,
B_UVAUTO_WINDOW,
B_UVAUTO_CUBE,
B_UVAUTO_CUBESIZE,
B_UVAUTO_RESET,
B_UVAUTO_BOUNDS,
B_UVAUTO_TOP,
B_UVAUTO_FACE,
B_UVAUTO_OBJECT,
B_UVAUTO_ALIGNX,
B_UVAUTO_ALIGNY,
B_UVAUTO_UNWRAP,
B_UVAUTO_DRAWFACES
};
/* ******************* editmesh.c */
void make_editMesh(Scene *scene, EditMesh *em);
void load_editMesh(Scene *scene, EditMesh *em);
void remake_editMesh(Scene *scene, EditMesh *em);
extern void free_editvert(EditMesh *em, EditVert *eve);
extern void free_editedge(EditMesh *em, EditEdge *eed);
extern void free_editface(EditMesh *em, EditFace *efa);
void free_editMesh(EditMesh *em);
extern void free_vertlist(EditMesh *em, ListBase *edve);
extern void free_edgelist(EditMesh *em, ListBase *lb);
extern void free_facelist(EditMesh *em, ListBase *lb);
extern void remedge(EditMesh *em, EditEdge *eed);
extern struct EditVert *addvertlist(EditMesh *em, float *vec, struct EditVert *example);
extern struct EditEdge *addedgelist(EditMesh *em, struct EditVert *v1, struct EditVert *v2, struct EditEdge *example);
extern struct EditFace *addfacelist(EditMesh *em, struct EditVert *v1, struct EditVert *v2, struct EditVert *v3, struct EditVert *v4, struct EditFace *example, struct EditFace *exampleEdges);
extern struct EditEdge *findedgelist(EditMesh *em, struct EditVert *v1, struct EditVert *v2);
EditVert *editedge_getOtherVert(EditEdge *eed, EditVert *eve);
EditVert *editedge_getSharedVert(EditEdge *eed, EditEdge *eed2);
int editedge_containsVert(struct EditEdge *eed, struct EditVert *eve);
int editface_containsVert(struct EditFace *efa, struct EditVert *eve);
int editface_containsEdge(struct EditFace *efa, struct EditEdge *eed);
/* ******************* editmesh_add.c */
/* ******************* editmesh_lib.c */
extern void EM_fgon_flags(EditMesh *em);
extern void EM_hide_reset(EditMesh *em);
extern int faceselectedOR(EditFace *efa, int flag);
extern int faceselectedAND(EditFace *efa, int flag);
void EM_remove_selection(EditMesh *em, void *data, int type);
void EM_set_actFace(EditMesh *em, EditFace *efa);
void EM_select_face(EditFace *efa, int sel);
void EM_selectmode_set(EditMesh *em);
void EM_clear_flag_all(EditMesh *em, int flag);
void EM_select_flush(EditMesh *em);
void EM_set_flag_all(EditMesh *em, int flag);
void EM_convertsel(EditMesh *em, short oldmode, short selectmode);
void EM_add_data_layer(EditMesh *em, CustomData *data, int type);
void EM_data_interp_from_verts(EditMesh *em, EditVert *v1, EditVert *v2, EditVert *eve, float fac);
void EM_data_interp_from_faces(EditMesh *em, EditFace *efa1, EditFace *efa2, EditFace *efan, int i1, int i2, int i3, int i4);
int EM_nvertices_selected(EditMesh *em);
int EM_nfaces_selected(EditMesh *em);
float EM_face_area(EditFace *efa);
float EM_face_perimeter(EditFace *efa);
void EM_store_selection(EditMesh *em, void *data, int type);
extern EditFace *exist_face(EditMesh *em, EditVert *v1, EditVert *v2, EditVert *v3, EditVert *v4);
extern void flipface(EditMesh *em, EditFace *efa); // flips for normal direction
extern int compareface(EditFace *vl1, EditFace *vl2);
void recalc_editnormals(EditMesh *em);
/* flag for selection bits, *nor will be filled with normal for extrusion constraint */
/* return value defines if such normal was set */
extern short extrudeflag_face_indiv(EditMesh *em, short flag, float *nor);
extern short extrudeflag_verts_indiv(EditMesh *em, short flag, float *nor);
extern short extrudeflag_edges_indiv(EditMesh *em, short flag, float *nor);
extern short extrudeflag_vert(EditMesh *em, short flag, float *nor);
extern short extrudeflag(EditMesh *em, short flag, float *nor);
extern void adduplicateflag(EditMesh *em, int flag);
extern void delfaceflag(EditMesh *em, int flag);
extern void rotateflag(EditMesh *em, short flag, float *cent, float rotmat[][3]);
extern void translateflag(EditMesh *em, short flag, float *vec);
extern int convex(float *v1, float *v2, float *v3, float *v4);
extern struct EditFace *EM_face_from_faces(EditMesh *em, struct EditFace *efa1,
struct EditFace *efa2, int i1, int i2, int i3, int i4);
/* ******************* editmesh_loop.c */
#define KNIFE_PROMPT 0
#define KNIFE_EXACT 1
#define KNIFE_MIDPOINT 2
#define KNIFE_MULTICUT 3
#define LOOP_SELECT 1
#define LOOP_CUT 2
/* ******************* editmesh_mods.c */
extern EditEdge *findnearestedge(struct View3D *v3d, EditMesh *em, int *dist);
extern void EM_automerge(int update);
void editmesh_select_by_material(EditMesh *em, int index);
void righthandfaces(EditMesh *em, int select); /* makes faces righthand turning */
void EM_select_more(EditMesh *em);
/**
* findnearestvert
*
* dist (in/out): minimal distance to the nearest and at the end, actual distance
* sel: selection bias
* if SELECT, selected vertice are given a 5 pixel bias to make them farter than unselect verts
* if 0, unselected vertice are given the bias
* strict: if 1, the vertice corresponding to the sel parameter are ignored and not just biased
*/
extern EditVert *findnearestvert(struct View3D *v3d, EditMesh *em, int *dist, short sel, short strict);
/* ******************* editmesh_tools.c */
#define SUBDIV_SELECT_ORIG 0
#define SUBDIV_SELECT_INNER 1
#define SUBDIV_SELECT_INNER_SEL 2
#define SUBDIV_SELECT_LOOPCUT 3
void join_triangles(EditMesh *em);
int removedoublesflag(EditMesh *em, short flag, short automerge, float limit); /* return amount */
void esubdivideflag(EditMesh *em, int flag, float rad, int beauty, int numcuts, int seltype);
int EdgeSlide(EditMesh *em, short immediate, float imperc);
#endif

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,713 @@
/**
* $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) 2004 by Blender Foundation.
* All rights reserved.
*
* The Original Code is: all of this file.
*
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
*/
/*
editmesh_loop: tools with own drawing subloops, select, knife, subdiv
*/
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "MEM_guardedalloc.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_view3d_types.h"
#include "BLI_blenlib.h"
#include "BLI_arithb.h"
#include "BLI_editVert.h"
#include "BLI_ghash.h"
#include "BKE_depsgraph.h"
#include "BKE_displist.h"
#include "BKE_global.h"
#include "BKE_library.h"
#include "BKE_mesh.h"
#include "BKE_object.h"
#include "BKE_utildefines.h"
#include "PIL_time.h"
#include "BIF_gl.h"
#include "WM_types.h"
#include "ED_mesh.h"
#include "ED_view3d.h"
#include "editmesh.h"
/* **** XXX ******** */
static void BIF_undo_push() {}
static void BIF_undo() {}
static void error() {}
static int pupmenu() {return 0;}
static int qtest() {return 0;}
/* **** XXX ******** */
/* New LoopCut */
static void edgering_sel(EditMesh *em, EditEdge *startedge, int select, int previewlines)
{
EditEdge *eed;
EditFace *efa;
EditVert *v[2][2];
float co[2][3];
int looking= 1,i;
/* in eed->f1 we put the valence (amount of faces in edge) */
/* in eed->f2 we put tagged flag as correct loop */
/* in efa->f1 we put tagged flag as correct to select */
for(eed= em->edges.first; eed; eed= eed->next) {
eed->f1= 0;
eed->f2= 0;
}
for(efa= em->faces.first; efa; efa= efa->next) {
efa->f1= 0;
if(efa->h==0) {
efa->e1->f1++;
efa->e2->f1++;
efa->e3->f1++;
if(efa->e4) efa->e4->f1++;
}
}
// tag startedge OK
startedge->f2= 1;
while(looking) {
looking= 0;
for(efa= em->faces.first; efa; efa= efa->next) {
if(efa->e4 && efa->f1==0 && efa->h == 0) { // not done quad
if(efa->e1->f1<=2 && efa->e2->f1<=2 && efa->e3->f1<=2 && efa->e4->f1<=2) { // valence ok
// if edge tagged, select opposing edge and mark face ok
if(efa->e1->f2) {
efa->e3->f2= 1;
efa->f1= 1;
looking= 1;
}
else if(efa->e2->f2) {
efa->e4->f2= 1;
efa->f1= 1;
looking= 1;
}
if(efa->e3->f2) {
efa->e1->f2= 1;
efa->f1= 1;
looking= 1;
}
if(efa->e4->f2) {
efa->e2->f2= 1;
efa->f1= 1;
looking= 1;
}
}
}
}
}
if(previewlines > 0 && select == 0){
// XXX persp(PERSP_VIEW);
// XXX glPushMatrix();
// XXX mymultmatrix(G.obedit->obmat);
for(efa= em->faces.first; efa; efa= efa->next) {
if(efa->v4 == NULL) { continue; }
if(efa->h == 0){
if(efa->e1->f2 == 1){
if(efa->e1->h == 1 || efa->e3->h == 1 )
continue;
v[0][0] = efa->v1;
v[0][1] = efa->v2;
v[1][0] = efa->v4;
v[1][1] = efa->v3;
} else if(efa->e2->f2 == 1){
if(efa->e2->h == 1 || efa->e4->h == 1)
continue;
v[0][0] = efa->v2;
v[0][1] = efa->v3;
v[1][0] = efa->v1;
v[1][1] = efa->v4;
} else { continue; }
for(i=1;i<=previewlines;i++){
co[0][0] = (v[0][1]->co[0] - v[0][0]->co[0])*(i/((float)previewlines+1))+v[0][0]->co[0];
co[0][1] = (v[0][1]->co[1] - v[0][0]->co[1])*(i/((float)previewlines+1))+v[0][0]->co[1];
co[0][2] = (v[0][1]->co[2] - v[0][0]->co[2])*(i/((float)previewlines+1))+v[0][0]->co[2];
co[1][0] = (v[1][1]->co[0] - v[1][0]->co[0])*(i/((float)previewlines+1))+v[1][0]->co[0];
co[1][1] = (v[1][1]->co[1] - v[1][0]->co[1])*(i/((float)previewlines+1))+v[1][0]->co[1];
co[1][2] = (v[1][1]->co[2] - v[1][0]->co[2])*(i/((float)previewlines+1))+v[1][0]->co[2];
glColor3ub(255, 0, 255);
glBegin(GL_LINES);
glVertex3f(co[0][0],co[0][1],co[0][2]);
glVertex3f(co[1][0],co[1][1],co[1][2]);
glEnd();
}
}
}
glPopMatrix();
} else {
/* (de)select the edges */
for(eed= em->edges.first; eed; eed= eed->next) {
if(eed->f2) EM_select_edge(eed, select);
}
}
}
void CutEdgeloop(EditMesh *em, int numcuts)
{
View3D *v3d= NULL; // XXX
EditEdge *nearest=NULL, *eed;
float fac;
int keys = 0, holdnum=0, selectmode, dist;
short mvalo[2] = {0,0}, mval[2];
short event, val, choosing=1, cancel=0, cuthalf = 0, smooth=0;
short hasHidden = 0;
char msg[128];
selectmode = em->selectmode;
if(em->selectmode & SCE_SELECT_FACE){
em->selectmode = SCE_SELECT_EDGE;
EM_selectmode_set(em);
}
BIF_undo_push("Loopcut Begin");
while(choosing && !cancel){
// XXX getmouseco_areawin(mval);
if (mval[0] != mvalo[0] || mval[1] != mvalo[1]) {
mvalo[0] = mval[0];
mvalo[1] = mval[1];
dist= 50;
nearest = findnearestedge(v3d, em, &dist); // returns actual distance in dist
// scrarea_do_windraw(curarea); // after findnearestedge, backbuf!
sprintf(msg,"Number of Cuts: %d",numcuts);
if(smooth){
sprintf(msg,"%s (S)mooth: on",msg);
} else {
sprintf(msg,"%s (S)mooth: off",msg);
}
// headerprint(msg);
/* Need to figure preview */
if(nearest){
edgering_sel(em, nearest, 0, numcuts);
}
// XXX screen_swapbuffers();
/* backbuffer refresh for non-apples (no aux) */
#ifndef __APPLE__
// XXX if(G.vd->drawtype>OB_WIRE && (G.vd->flag & V3D_ZBUF_SELECT)) {
// backdrawview3d(0);
// }
#endif
}
else PIL_sleep_ms(10); // idle
while(qtest())
{
val=0;
// XXX event= extern_qread(&val);
if(val && (event == MOUSEX || event == MOUSEY)){ ; }
else if(val && ((event==LEFTMOUSE || event==RETKEY) || (event == MIDDLEMOUSE || event==PADENTER)))
{
if(event == MIDDLEMOUSE){
cuthalf = 1;
}
if (nearest==NULL)
cancel = 1;
choosing=0;
mvalo[0] = -1;
}
else if(val && (event==ESCKEY || event==RIGHTMOUSE ))
{
choosing=0;
cancel = 1;
mvalo[0] = -1;
}
else if(val && (event==PADPLUSKEY || event==WHEELUPMOUSE))
{
numcuts++;
mvalo[0] = -1;
}
else if(val && (event==PADMINUS || event==WHEELDOWNMOUSE))
{
if(numcuts > 1){
numcuts--;
mvalo[0] = -1;
}
}
else if(val && event==SKEY)
{
if(smooth){smooth=0;}
else { smooth=1; }
mvalo[0] = -1;
}
else if(val){
holdnum = -1;
switch(event){
case PAD9:
case NINEKEY:
holdnum = 9; break;
case PAD8:
case EIGHTKEY:
holdnum = 8;break;
case PAD7:
case SEVENKEY:
holdnum = 7;break;
case PAD6:
case SIXKEY:
holdnum = 6;break;
case PAD5:
case FIVEKEY:
holdnum = 5;break;
case PAD4:
case FOURKEY:
holdnum = 4;break;
case PAD3:
case THREEKEY:
holdnum = 3; break;
case PAD2:
case TWOKEY:
holdnum = 2;break;
case PAD1:
case ONEKEY:
holdnum = 1; break;
case PAD0:
case ZEROKEY:
holdnum = 0;break;
case BACKSPACEKEY:
holdnum = -2;break;
}
if(holdnum >= 0 && numcuts*10 < 130){
if(keys == 0){ // first level numeric entry
if(holdnum > 0){
numcuts = holdnum;
keys++;
}
} else if(keys > 0){//highrt level numeric entry
numcuts *= 10;
numcuts += holdnum;
keys++;
}
} else if (holdnum == -2){// backspace
if (keys > 1){
numcuts /= 10;
keys--;
} else {
numcuts=1;
keys = 0;
}
}
mvalo[0] = -1;
break;
} // End Numeric Entry
} //End while(qtest())
} // End Choosing
if(cancel){
return;
}
/* clean selection */
for(eed=em->edges.first; eed; eed = eed->next){
EM_select_edge(eed,0);
}
/* select edge ring */
edgering_sel(em, nearest, 1, 0);
/* now cut the loops */
if(smooth){
fac= 1.0f;
// XXX if(fbutton(&fac, 0.0f, 5.0f, 10, 10, "Smooth:")==0) return;
fac= 0.292f*fac;
esubdivideflag(em, SELECT,fac,B_SMOOTH,numcuts,SUBDIV_SELECT_LOOPCUT);
} else {
esubdivideflag(em, SELECT,0,0,numcuts,SUBDIV_SELECT_LOOPCUT);
}
/* if this was a single cut, enter edgeslide mode */
if(numcuts == 1 && hasHidden == 0){
if(cuthalf)
EdgeSlide(em, 1,0.0);
else {
if(EdgeSlide(em, 0,0.0) == -1){
BIF_undo();
}
}
}
if(em->selectmode != selectmode){
em->selectmode = selectmode;
EM_selectmode_set(em);
}
// DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
return;
}
/* *************** LOOP SELECT ************* */
#if 0
static short edgeFaces(EditMesh *em, EditEdge *e)
{
EditFace *search=NULL;
short count = 0;
search = em->faces.first;
while(search){
if((search->e1 == e || search->e2 == e) || (search->e3 == e || search->e4 == e))
count++;
search = search->next;
}
return count;
}
#endif
/* ***************** TRAIL ************************
Read a trail of mouse coords and return them as an array of CutCurve structs
len returns number of mouse coords read before commiting with RETKEY
It is up to the caller to free the block when done with it,
XXX Is only used here, so local inside this file (ton)
*/
#define TRAIL_POLYLINE 1 /* For future use, They don't do anything yet */
#define TRAIL_FREEHAND 2
#define TRAIL_MIXED 3 /* (1|2) */
#define TRAIL_AUTO 4
#define TRAIL_MIDPOINTS 8
typedef struct CutCurve {
float x;
float y;
} CutCurve;
static CutCurve *get_mouse_trail(int *len, char mode, char cutmode, struct GHash *gh)
{
return NULL; // XXX
}
/* ******************************************************************** */
/* Knife Subdivide Tool. Subdivides edges intersected by a mouse trail
drawn by user.
Currently mapped to KKey when in MeshEdit mode.
Usage:
Hit Shift K, Select Centers or Exact
Hold LMB down to draw path, hit RETKEY.
ESC cancels as expected.
Contributed by Robert Wenzlaff (Det. Thorn).
*/
/* prototype */
static float seg_intersect(struct EditEdge * e, CutCurve *c, int len, char mode, struct GHash *gh);
void KnifeSubdivide(EditMesh *em, char mode)
{
EditEdge *eed;
EditVert *eve;
CutCurve *curve;
struct GHash *gh;
int len=0;
float isect=0.0;
short numcuts=1;
float *scr, co[4];
if (G.obedit==0) return;
if (EM_nvertices_selected(em) < 2) {
error("No edges are selected to operate on");
return;
}
if (mode==KNIFE_PROMPT) {
short val= pupmenu("Cut Type %t|Exact Line%x1|Midpoints%x2|Multicut%x3");
if(val<1) return;
mode = val; // warning, mode is char, pupmenu returns -1 with ESC
}
if(mode == KNIFE_MULTICUT) {
// XXX if(button(&numcuts, 2, 128, "Number of Cuts:")==0) return;
}
/* XXX Set a knife cursor here */
for(eed=em->edges.first; eed; eed= eed->next) eed->tmp.fp = 0.0; /*store percentage of edge cut for KNIFE_EXACT here.*/
/*the floating point coordinates of verts in screen space will be stored in a hash table according to the vertices pointer*/
gh = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
for(eve=em->verts.first; eve; eve=eve->next){
scr = MEM_mallocN(sizeof(float)*2, "Vertex Screen Coordinates");
VECCOPY(co, eve->co);
co[3]= 1.0;
Mat4MulVec4fl(G.obedit->obmat, co);
// XXX project_float(co,scr);
BLI_ghash_insert(gh, eve, scr);
eve->f1 = 0; /*store vertex intersection flag here*/
}
curve=get_mouse_trail(&len, TRAIL_MIXED, mode, gh);
if (curve && len && mode){
eed= em->edges.first;
while(eed) {
if( eed->v1->f & eed->v2->f & SELECT ){ // NOTE: uses vertex select, subdiv doesnt do edges yet
isect=seg_intersect(eed, curve, len, mode, gh);
if (isect) eed->f2= 1;
else eed->f2=0;
eed->tmp.fp= isect;
//printf("isect=%i\n", isect);
}
else {
eed->f2=0;
eed->f1=0;
}
eed= eed->next;
}
if(mode==KNIFE_EXACT) esubdivideflag(em, SELECT, 0, B_KNIFE|B_PERCENTSUBD,1,SUBDIV_SELECT_ORIG);
else if (mode==KNIFE_MIDPOINT) esubdivideflag(em, SELECT, 0, B_KNIFE,1,SUBDIV_SELECT_ORIG);
else if (mode==KNIFE_MULTICUT) esubdivideflag(em, SELECT, 0, B_KNIFE,numcuts,SUBDIV_SELECT_ORIG);
eed=em->edges.first;
while(eed){
eed->f2=0;
eed->f1=0;
eed=eed->next;
}
}
/* Return to old cursor and flags...*/
BLI_ghash_free(gh, NULL, (GHashValFreeFP)MEM_freeN);
if (curve) MEM_freeN(curve);
BIF_undo_push("Knife");
}
/* seg_intersect() Determines if and where a mouse trail intersects an EditEdge */
static float seg_intersect(EditEdge *e, CutCurve *c, int len, char mode, struct GHash *gh)
{
#define MAXSLOPE 100000
float x11, y11, x12=0, y12=0, x2max, x2min, y2max;
float y2min, dist, lastdist=0, xdiff2, xdiff1;
float m1, b1, m2, b2, x21, x22, y21, y22, xi;
float yi, x1min, x1max, y1max, y1min, perc=0;
float *scr;
float threshold;
int i;
//threshold = 0.000001; /*tolerance for vertex intersection*/
// XXX threshold = G.scene->toolsettings->select_thresh / 100;
/* Get screen coords of verts */
scr = BLI_ghash_lookup(gh, e->v1);
x21=scr[0];
y21=scr[1];
scr = BLI_ghash_lookup(gh, e->v2);
x22=scr[0];
y22=scr[1];
xdiff2=(x22-x21);
if (xdiff2) {
m2=(y22-y21)/xdiff2;
b2= ((x22*y21)-(x21*y22))/xdiff2;
}
else {
m2=MAXSLOPE; /* Verticle slope */
b2=x22;
}
/*check for *exact* vertex intersection first*/
if(mode!=KNIFE_MULTICUT){
for (i=0; i<len; i++){
if (i>0){
x11=x12;
y11=y12;
}
else {
x11=c[i].x;
y11=c[i].y;
}
x12=c[i].x;
y12=c[i].y;
/*test e->v1*/
if((x11 == x21 && y11 == y21) || (x12 == x21 && y12 == y21)){
e->v1->f1 = 1;
perc = 0;
return(perc);
}
/*test e->v2*/
else if((x11 == x22 && y11 == y22) || (x12 == x22 && y12 == y22)){
e->v2->f1 = 1;
perc = 0;
return(perc);
}
}
}
/*now check for edge interesect (may produce vertex intersection as well)*/
for (i=0; i<len; i++){
if (i>0){
x11=x12;
y11=y12;
}
else {
x11=c[i].x;
y11=c[i].y;
}
x12=c[i].x;
y12=c[i].y;
/* Perp. Distance from point to line */
if (m2!=MAXSLOPE) dist=(y12-m2*x12-b2);/* /sqrt(m2*m2+1); Only looking for */
/* change in sign. Skip extra math */
else dist=x22-x12;
if (i==0) lastdist=dist;
/* if dist changes sign, and intersect point in edge's Bound Box*/
if ((lastdist*dist)<=0){
xdiff1=(x12-x11); /* Equation of line between last 2 points */
if (xdiff1){
m1=(y12-y11)/xdiff1;
b1= ((x12*y11)-(x11*y12))/xdiff1;
}
else{
m1=MAXSLOPE;
b1=x12;
}
x2max=MAX2(x21,x22)+0.001; /* prevent missed edges */
x2min=MIN2(x21,x22)-0.001; /* due to round off error */
y2max=MAX2(y21,y22)+0.001;
y2min=MIN2(y21,y22)-0.001;
/* Found an intersect, calc intersect point */
if (m1==m2){ /* co-incident lines */
/* cut at 50% of overlap area*/
x1max=MAX2(x11, x12);
x1min=MIN2(x11, x12);
xi= (MIN2(x2max,x1max)+MAX2(x2min,x1min))/2.0;
y1max=MAX2(y11, y12);
y1min=MIN2(y11, y12);
yi= (MIN2(y2max,y1max)+MAX2(y2min,y1min))/2.0;
}
else if (m2==MAXSLOPE){
xi=x22;
yi=m1*x22+b1;
}
else if (m1==MAXSLOPE){
xi=x12;
yi=m2*x12+b2;
}
else {
xi=(b1-b2)/(m2-m1);
yi=(b1*m2-m1*b2)/(m2-m1);
}
/* Intersect inside bounding box of edge?*/
if ((xi>=x2min)&&(xi<=x2max)&&(yi<=y2max)&&(yi>=y2min)){
/*test for vertex intersect that may be 'close enough'*/
if(mode!=KNIFE_MULTICUT){
if(xi <= (x21 + threshold) && xi >= (x21 - threshold)){
if(yi <= (y21 + threshold) && yi >= (y21 - threshold)){
e->v1->f1 = 1;
perc = 0;
break;
}
}
if(xi <= (x22 + threshold) && xi >= (x22 - threshold)){
if(yi <= (y22 + threshold) && yi >= (y22 - threshold)){
e->v2->f1 = 1;
perc = 0;
break;
}
}
}
if ((m2<=1.0)&&(m2>=-1.0)) perc = (xi-x21)/(x22-x21);
else perc=(yi-y21)/(y22-y21); /*lower slope more accurate*/
//isect=32768.0*(perc+0.0000153); /* Percentage in 1/32768ths */
break;
}
}
lastdist=dist;
}
return(perc);
}
void LoopMenu(EditMesh *em) /* Called by KKey */
{
short ret;
ret=pupmenu("Loop/Cut Menu %t|Loop Cut (CTRL-R)%x2|"
"Knife (Exact) %x3|Knife (Midpoints)%x4|Knife (Multicut)%x5");
switch (ret){
case 2:
CutEdgeloop(em, 1);
break;
case 3:
KnifeSubdivide(em, KNIFE_EXACT);
break;
case 4:
KnifeSubdivide(em, KNIFE_MIDPOINT);
break;
case 5:
KnifeSubdivide(em, KNIFE_MULTICUT);
break;
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -293,21 +293,14 @@ void add_objectLamp(Scene *scene, View3D *v3d, short type)
/* remove base from a specific scene */
/* note: now unlinks constraints as well */
void free_and_unlink_base_from_scene(Scene *scene, Base *base)
void ED_base_object_free_and_unlink(Scene *scene, Base *base)
{
BLI_remlink(&scene->base, base);
free_libblock_us(&G.main->object, base->object);
if(scene->basact==base) scene->basact= NULL;
MEM_freeN(base);
}
/* remove base from the current scene */
void free_and_unlink_base(Scene *scene, Base *base)
{
if (base==BASACT)
BASACT= NULL;
free_and_unlink_base_from_scene(scene, base);
}
void delete_obj(Scene *scene, View3D *v3d, int ok)
{
Base *base, *nbase;
@ -344,15 +337,14 @@ void delete_obj(Scene *scene, View3D *v3d, int ok)
if (scene != scene && !(scene->id.lib)) {
base_other= object_in_scene( base->object, scene );
if (base_other) {
if (base_other == scene->basact) scene->basact= NULL; /* in case the object was active */
free_and_unlink_base_from_scene( scene, base_other );
ED_base_object_free_and_unlink( scene, base_other );
}
}
}
}
/* remove from current scene only */
free_and_unlink_base(scene, base);
ED_base_object_free_and_unlink(scene, base);
}
}
@ -3313,9 +3305,7 @@ void convertmenu(Scene *scene, View3D *v3d)
}
}
if(basedel != NULL && nr == 2) {
if(basedel==basact)
basact= NULL;
free_and_unlink_base(scene, basedel);
ED_base_object_free_and_unlink(scene, basedel);
}
basedel = NULL;
}

View File

@ -72,6 +72,8 @@
#include "GPU_extensions.h"
#include "GPU_draw.h"
#include "ED_mesh.h"
#include "view3d_intern.h" // own include
/***/
@ -424,7 +426,7 @@ static int draw_tface_mapped__set_draw(void *userData, int index)
static int draw_em_tf_mapped__set_draw(void *userData, int index)
{
EditMesh *em = userData;
EditFace *efa= NULL; // XXX = EM_get_face_for_index(index);
EditFace *efa= EM_get_face_for_index(index);
MTFace *tface;
MCol *mcol;
int matnr;

View File

@ -101,6 +101,7 @@
#include "GPU_material.h"
#include "GPU_extensions.h"
#include "ED_mesh.h"
#include "ED_types.h"
#include "ED_util.h"
@ -126,16 +127,6 @@ static void drawcircle_size(float size);
static void draw_empty_sphere(float size);
static void draw_empty_cone(float size);
EditVert *EM_get_vert_for_index(int x) {return 0;} // XXX
EditEdge *EM_get_edge_for_index(int x) {return 0;} // XXX
EditFace *EM_get_face_for_index(int x) {return 0;} // XXX
void EM_init_index_arrays(int x, int y, int z) {} // XXX
void EM_free_index_arrays(void) {} // XXX
#define EM_FGON 0
EditFace *EM_get_actFace(int x) {return NULL;} // XXX
extern unsigned int em_vertoffs, em_solidoffs, em_wireoffs;
/* check for glsl drawing */
int draw_glsl_material(Scene *scene, Object *ob, View3D *v3d, int dt)
@ -1219,7 +1210,8 @@ void mesh_foreachScreenVert(ARegion *ar, View3D *v3d, void (*func)(void *userDat
{
struct { void (*func)(void *userData, EditVert *eve, int x, int y, int index); void *userData; ARegion *ar; View3D *v3d; int clipVerts; float pmat[4][4], vmat[4][4]; } data;
DerivedMesh *dm = editmesh_get_derived_cage(CD_MASK_BAREMESH);
EditMesh *em= NULL; // XXX
data.func = func;
data.userData = userData;
data.ar= ar;
@ -1228,7 +1220,7 @@ void mesh_foreachScreenVert(ARegion *ar, View3D *v3d, void (*func)(void *userDat
view3d_get_object_project_mat(v3d, G.obedit, data.pmat, data.vmat);
EM_init_index_arrays(1, 0, 0);
EM_init_index_arrays(em, 1, 0, 0);
dm->foreachMappedVert(dm, mesh_foreachScreenVert__mapFunc, &data);
EM_free_index_arrays();
@ -1264,6 +1256,7 @@ void mesh_foreachScreenEdge(ARegion *ar, View3D *v3d, void (*func)(void *userDat
{
struct { void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index); void *userData; ARegion *ar; View3D *v3d; int clipVerts; float pmat[4][4], vmat[4][4]; } data;
DerivedMesh *dm = editmesh_get_derived_cage(CD_MASK_BAREMESH);
EditMesh *em= NULL; // XXX
data.func = func;
data.ar= ar;
@ -1273,7 +1266,7 @@ void mesh_foreachScreenEdge(ARegion *ar, View3D *v3d, void (*func)(void *userDat
view3d_get_object_project_mat(v3d, G.obedit, data.pmat, data.vmat);
EM_init_index_arrays(0, 1, 0);
EM_init_index_arrays(em, 0, 1, 0);
dm->foreachMappedEdge(dm, mesh_foreachScreenEdge__mapFunc, &data);
EM_free_index_arrays();
@ -1297,6 +1290,7 @@ void mesh_foreachScreenFace(ARegion *ar, View3D *v3d, void (*func)(void *userDat
{
struct { void (*func)(void *userData, EditFace *efa, int x, int y, int index); void *userData; ARegion *ar; View3D *v3d; float pmat[4][4], vmat[4][4]; } data;
DerivedMesh *dm = editmesh_get_derived_cage(CD_MASK_BAREMESH);
EditMesh *em= NULL; // XXX
data.func = func;
data.ar= ar;
@ -1305,7 +1299,7 @@ void mesh_foreachScreenFace(ARegion *ar, View3D *v3d, void (*func)(void *userDat
view3d_get_object_project_mat(v3d, G.obedit, data.pmat, data.vmat);
EM_init_index_arrays(0, 0, 1);
EM_init_index_arrays(em, 0, 0, 1);
dm->foreachMappedFaceCenter(dm, mesh_foreachScreenFace__mapFunc, &data);
EM_free_index_arrays();
@ -1965,7 +1959,7 @@ static int draw_em_fancy__setGLSLFaceOpts(void *userData, int index)
static void draw_em_fancy(Scene *scene, View3D *v3d, Object *ob, EditMesh *em, DerivedMesh *cageDM, DerivedMesh *finalDM, int dt)
{
Mesh *me = ob->data;
EditFace *efa_act = EM_get_actFace(0); /* annoying but active faces is stored differently */
EditFace *efa_act = EM_get_actFace(em, 0); /* annoying but active faces is stored differently */
EditEdge *eed_act = NULL;
EditVert *eve_act = NULL;
@ -1981,7 +1975,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, Object *ob, EditMesh *em, D
}
}
EM_init_index_arrays(1, 1, 1);
EM_init_index_arrays(em, 1, 1, 1);
if(dt>OB_WIRE) {
if(CHECK_OB_DRAWTEXTURE(v3d, dt)) {
@ -5387,9 +5381,10 @@ void draw_object_backbufsel(Scene *scene, View3D *v3d, Object *ob)
switch( ob->type) {
case OB_MESH:
if(ob==G.obedit) {
EditMesh *em= NULL; // XXX
DerivedMesh *dm = editmesh_get_derived_cage(CD_MASK_BAREMESH);
EM_init_index_arrays(1, 1, 1);
EM_init_index_arrays(em, 1, 1, 1);
em_solidoffs= bbs_mesh_solid_EM(scene, v3d, dm, scene->selectmode & SCE_SELECT_FACE);

View File

@ -75,6 +75,7 @@
#include "RNA_access.h"
#include "RNA_define.h"
#include "ED_mesh.h"
#include "ED_object.h"
#include "ED_screen.h"
#include "ED_types.h"
@ -90,19 +91,7 @@
/* ********************** view3d_select: selection manipulations ********************* */
/* XXX to solve *************** */
unsigned int em_vertoffs=0, em_solidoffs=0, em_wireoffs=0;
int EM_check_backbuf() {return 0;}
void EM_select_edge() {}
void EM_select_face_fgon() {}
int EM_mask_init_backbuf_border() {return 0;}
void EM_free_backbuf() {}
void EM_selectmode_flush() {}
void EM_deselect_flush() {}
static void BIF_undo_push() {}
int EM_texFaceCheck() {return 0;}
int EM_init_backbuf_border() {return 0;}
int EM_init_backbuf_circle() {return 0;}
/* XXX end ********************* */
/* local prototypes */
@ -143,7 +132,7 @@ void EM_backbuf_checkAndSelectFaces(EditMesh *em, int select)
for(efa= em->faces.first; efa; efa= efa->next, index++) {
if(efa->h==0) {
if(EM_check_backbuf(index)) {
EM_select_face_fgon(efa, select);
EM_select_face_fgon(em, efa, select);
}
}
}
@ -386,16 +375,17 @@ static void do_lasso_select_mesh__doSelectEdge(void *userData, EditEdge *eed, in
static void do_lasso_select_mesh__doSelectFace(void *userData, EditFace *efa, int x, int y, int index)
{
struct { rcti *rect; short (*mcords)[2], moves, select, pass, done; } *data = userData;
EditMesh *em= NULL; // XXX
if (BLI_in_rcti(data->rect, x, y) && lasso_inside(data->mcords, data->moves, x, y)) {
EM_select_face_fgon(efa, data->select);
EM_select_face_fgon(em, efa, data->select);
}
}
static void do_lasso_select_mesh(Scene *scene, ARegion *ar, View3D *v3d, short mcords[][2], short moves, short select)
{
struct { rcti *rect; short (*mcords)[2], moves, select, pass, done; } data;
EditMesh *em = G.editMesh;
EditMesh *em = G.editMesh; // XXX
rcti rect;
int bbsel;
@ -408,7 +398,7 @@ static void do_lasso_select_mesh(Scene *scene, ARegion *ar, View3D *v3d, short m
data.done = 0;
data.pass = 0;
bbsel= EM_mask_init_backbuf_border(mcords, moves, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
bbsel= EM_mask_init_backbuf_border(v3d, mcords, moves, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
if(scene->selectmode & SCE_SELECT_VERTEX) {
if (bbsel) {
@ -438,7 +428,7 @@ static void do_lasso_select_mesh(Scene *scene, ARegion *ar, View3D *v3d, short m
}
EM_free_backbuf();
EM_selectmode_flush();
EM_selectmode_flush(em);
}
#if 0
@ -494,7 +484,7 @@ static void do_lasso_select_mesh_uv(short mcords[][2], short moves, short select
}
if (ok && G.sima->flag & SI_SYNC_UVSEL) {
if (select) EM_select_flush();
else EM_deselect_flush();
else EM_deselect_flush(em);
}
}
#endif
@ -588,7 +578,7 @@ static void do_lasso_select_armature(ARegion *ar, View3D *v3d, short mcords[][2]
// XXX countall(); /* abused for flushing selection!!!! */
}
static void do_lasso_select_facemode(Scene *scene, short mcords[][2], short moves, short select)
static void do_lasso_select_facemode(Scene *scene, View3D *v3d, short mcords[][2], short moves, short select)
{
Object *ob= OBACT;
Mesh *me= ob?ob->data:NULL;
@ -600,7 +590,7 @@ static void do_lasso_select_facemode(Scene *scene, short mcords[][2], short move
em_vertoffs= me->totface+1; /* max index array */
lasso_select_boundbox(&rect, mcords, moves);
EM_mask_init_backbuf_border(mcords, moves, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
EM_mask_init_backbuf_border(v3d, mcords, moves, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
EM_backbuf_checkAndSelectTFaces(me, select);
@ -644,7 +634,7 @@ void view3d_lasso_select(Scene *scene, ARegion *ar, View3D *v3d, short mcords[][
{
if(G.obedit==NULL) {
if(FACESEL_PAINT_TEST)
do_lasso_select_facemode(scene, mcords, moves, select);
do_lasso_select_facemode(scene, v3d, mcords, moves, select);
else if(G.f & (G_VERTEXPAINT|G_TEXTUREPAINT|G_WEIGHTPAINT))
;
// XX else if(G.f & G_PARTICLEEDIT)
@ -1154,9 +1144,10 @@ static void do_mesh_box_select__doSelectEdge(void *userData, EditEdge *eed, int
static void do_mesh_box_select__doSelectFace(void *userData, EditFace *efa, int x, int y, int index)
{
struct { rcti *rect; short select, pass, done; } *data = userData;
EditMesh *em= NULL; // XXX
if (BLI_in_rcti(data->rect, x, y)) {
EM_select_face_fgon(efa, data->select);
EM_select_face_fgon(em, efa, data->select);
}
}
static void do_mesh_box_select(Scene *scene, ARegion *ar, View3D *v3d, rcti *rect, int select)
@ -1170,7 +1161,7 @@ static void do_mesh_box_select(Scene *scene, ARegion *ar, View3D *v3d, rcti *rec
data.pass = 0;
data.done = 0;
bbsel= EM_init_backbuf_border(rect->xmin, rect->ymin, rect->xmax, rect->ymax);
bbsel= EM_init_backbuf_border(v3d, rect->xmin, rect->ymin, rect->xmax, rect->ymax);
if(scene->selectmode & SCE_SELECT_VERTEX) {
if (bbsel) {
@ -1201,7 +1192,7 @@ static void do_mesh_box_select(Scene *scene, ARegion *ar, View3D *v3d, rcti *rec
EM_free_backbuf();
EM_selectmode_flush();
EM_selectmode_flush(em);
}
static int view3d_borderselect_exec(bContext *C, wmOperator *op)
@ -1535,9 +1526,10 @@ static void mesh_selectionCB__doSelectFace(void *userData, EditFace *efa, int x,
struct { short select, mval[2]; float radius; } *data = userData;
int mx = x - data->mval[0], my = y - data->mval[1];
float r = sqrt(mx*mx + my*my);
EditMesh *em= NULL; // XXX
if (r<=data->radius) {
EM_select_face_fgon(efa, data->select);
EM_select_face_fgon(em, efa, data->select);
}
}
@ -1554,7 +1546,7 @@ static void mesh_selectionCB(Scene *scene, ARegion *ar, View3D *v3d, int selecti
if (me) {
em_vertoffs= me->totface+1; /* max index array */
bbsel= EM_init_backbuf_circle(mval[0], mval[1], (short)(rad+1.0));
bbsel= EM_init_backbuf_circle(v3d, mval[0], mval[1], (short)(rad+1.0));
EM_backbuf_checkAndSelectTFaces(me, selecting==LEFTMOUSE);
EM_free_backbuf();
@ -1564,7 +1556,7 @@ static void mesh_selectionCB(Scene *scene, ARegion *ar, View3D *v3d, int selecti
return;
}
bbsel= EM_init_backbuf_circle(mval[0], mval[1], (short)(rad+1.0));
bbsel= EM_init_backbuf_circle(v3d, mval[0], mval[1], (short)(rad+1.0));
data.select = (selecting==LEFTMOUSE);
data.mval[0] = mval[0];
@ -1596,7 +1588,7 @@ static void mesh_selectionCB(Scene *scene, ARegion *ar, View3D *v3d, int selecti
}
EM_free_backbuf();
EM_selectmode_flush();
EM_selectmode_flush(em);
}

View File

@ -721,13 +721,16 @@ typedef struct Scene {
#define MINFRAME 1
#define MINFRAMEF 1.0
/* depricate this! */
#define TESTBASE(v3d, base) ( ((base)->flag & SELECT) && ((base)->lay & v3d->lay) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0) )
#define TESTBASELIB(v3d, base) ( ((base)->flag & SELECT) && ((base)->lay & v3d->lay) && ((base)->object->id.lib==0) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0))
#define TESTBASELIB_BGMODE(base) ( ((base)->flag & SELECT) && ((base)->lay & (v3d ? v3d->lay : G.scene->lay)) && ((base)->object->id.lib==0) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0))
#define BASE_SELECTABLE(v3d, base) ((base->lay & v3d->lay) && (base->object->restrictflag & (OB_RESTRICT_SELECT|OB_RESTRICT_VIEW))==0)
#define FIRSTBASE scene->base.first
#define LASTBASE scene->base.last
#define BASACT (scene->basact)
#define OBACT (BASACT? BASACT->object: 0)
#define ID_NEW(a) if( (a) && (a)->id.newid ) (a)= (void *)(a)->id.newid
#define ID_NEW_US(a) if( (a)->id.newid) {(a)= (void *)(a)->id.newid; (a)->id.us++;}
#define ID_NEW_US2(a) if( ((ID *)a)->newid) {(a)= ((ID *)a)->newid; ((ID *)a)->us++;}

View File

@ -155,6 +155,7 @@ void wmOrtho2 (float x1, float x2, float y1, float y2);
/* utilities */
void WM_set_framebuffer_index_color(int index);
int WM_framebuffer_to_index(unsigned int col);
#endif /* WM_API_H */

View File

@ -1114,6 +1114,10 @@ void wm_event_add_ghostevent(wmWindow *win, int type, void *customdata)
event.oskey= evt->oskey= event.val;
}
/* if test_break set, it catches this. Keep global for now? */
if(event.type==ESCKEY)
G.afbreek= 1;
wm_event_add(win, &event);
break;

View File

@ -121,7 +121,8 @@ void WM_init(bContext *C)
wm_operatortype_init();
set_free_windowmanager_cb(wm_close_and_free); /* library.c */
set_blender_test_break_cb(wm_window_testbreak); /* blender.c */
ED_spacetypes_init(); /* editors/area/spacetype.c */
/* get the default database, plus a wm */

View File

@ -456,7 +456,7 @@ void WM_set_framebuffer_index_color(int index)
cpack(index_to_framebuffer(index));
}
int framebuffer_to_index(unsigned int col)
int WM_framebuffer_to_index(unsigned int col)
{
if (col==0) return 0;

View File

@ -554,6 +554,25 @@ void wm_window_process_events(const bContext *C)
PIL_sleep_ms(5);
}
/* exported as handle callback to bke blender.c */
void wm_window_testbreak(void)
{
static double ltime= 0;
double curtime= PIL_check_seconds_timer();
/* only check for breaks every 50 milliseconds
* if we get called more often.
*/
if ((curtime-ltime)>.05) {
int hasevent= GHOST_ProcessEvents(g_system, 0); /* 0 is no wait */
if(hasevent)
GHOST_DispatchEvents(g_system);
ltime= curtime;
}
}
/* **************** init ********************** */
void wm_ghost_init(bContext *C)

View File

@ -52,6 +52,8 @@ void wm_window_swap_buffers (wmWindow *win);
wmWindow *wm_window_copy (bContext *C, wmWindow *winorig);
wmWindow *wm_window_rip (bContext *C, wmWindow *winorig);
void wm_window_testbreak (void);
/* *************** window operators ************** */
int wm_window_duplicate_op (bContext *C, wmOperator *op);
int wm_window_rip_op (bContext *C, wmOperator *op, struct wmEvent *event);