2.5
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:
parent
446492c266
commit
25fac7b001
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 *************** */
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
@ -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
|
@ -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
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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++;}
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue