[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11411] branches/bmesh: -> Fixed transform code

Geoffrey Bantle hairbat at yahoo.com
Sun Jul 29 07:25:23 CEST 2007


Revision: 11411
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11411
Author:   briggs
Date:     2007-07-29 07:25:22 +0200 (Sun, 29 Jul 2007)

Log Message:
-----------
-> Fixed transform code

Fixed transform code for bmesh so that scaling/rotation/translation
of editmode elements works again. PET mode still not working.

Also moved the bmesh kernel source files to blenkernel.

Modified Paths:
--------------
    branches/bmesh/config/win32-vc-config.py
    branches/bmesh/source/blender/src/editbmesh_interface.c
    branches/bmesh/source/blender/src/transform_conversions.c

Added Paths:
-----------
    branches/bmesh/source/blender/blenkernel/intern/BME_eulers.c
    branches/bmesh/source/blender/blenkernel/intern/BME_mesh.c
    branches/bmesh/source/blender/blenkernel/intern/BME_structure.c
    branches/bmesh/source/blender/blenkernel/intern/BME_tools.c
    branches/bmesh/source/blender/blenkernel/intern/bmesh_private.h

Removed Paths:
-------------
    branches/bmesh/source/blender/bmesh/

Modified: branches/bmesh/config/win32-vc-config.py
===================================================================
--- branches/bmesh/config/win32-vc-config.py	2007-07-28 21:35:32 UTC (rev 11410)
+++ branches/bmesh/config/win32-vc-config.py	2007-07-29 05:25:22 UTC (rev 11411)
@@ -18,13 +18,13 @@
 BF_PYTHON_LIB = 'python25'
 BF_PYTHON_LIBPATH = '${BF_PYTHON}/lib'
 
-WITH_BF_OPENAL = 'true'
+WITH_BF_OPENAL = 'false'
 BF_OPENAL = LIBDIR + '/openal'
 BF_OPENAL_INC = '${BF_OPENAL}/include ${BF_OPENAL}/include/AL '
 BF_OPENAL_LIB = 'openal_static'
 BF_OPENAL_LIBPATH = '${BF_OPENAL}/lib'
 
-WITH_BF_ICONV = 'true'
+WITH_BF_ICONV = 'false'
 BF_ICONV = LIBDIR + '/iconv'
 BF_ICONV_INC = '${BF_ICONV}/include'
 BF_ICONV_LIB = 'iconv'
@@ -44,7 +44,7 @@
 WITH_BF_FMOD = 'false'
 BF_FMOD = LIBDIR + '/fmod'
 
-WITH_BF_OPENEXR = 'true'
+WITH_BF_OPENEXR = 'false'
 BF_OPENEXR = LIBDIR + '/openexr'
 BF_OPENEXR_INC = '${BF_OPENEXR}/include ${BF_OPENEXR}/include/IlmImf ${BF_OPENEXR}/include/Iex ${BF_OPENEXR}/include/Imath '
 BF_OPENEXR_LIB = ' Iex Half IlmImf Imath IlmThread '
@@ -71,26 +71,26 @@
 BF_ZLIB_LIB = 'libz'
 BF_ZLIB_LIBPATH = '${BF_ZLIB}/lib'
 
-WITH_BF_INTERNATIONAL = 'true'
+WITH_BF_INTERNATIONAL = 'false'
 
 BF_GETTEXT = LIBDIR + '/gettext'
 BF_GETTEXT_INC = '${BF_GETTEXT}/include'
 BF_GETTEXT_LIB = 'gnu_gettext'
 BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib'
 
-WITH_BF_FTGL = 'true'
+WITH_BF_FTGL = 'false'
 BF_FTGL = LIBDIR + '/ftgl'
 BF_FTGL_INC = '${BF_FTGL}/include'
 BF_FTGL_LIB = 'extern_ftgl'
 
 WITH_BF_GAMEENGINE = 'false'
 
-WITH_BF_ODE = 'true'
+WITH_BF_ODE = 'false'
 BF_ODE = LIBDIR + '/ode'
 BF_ODE_INC = BF_ODE + '/include'
 BF_ODE_LIB = BF_ODE + '/lib/libode.a'
 
-WITH_BF_BULLET = 'true'
+WITH_BF_BULLET = 'false'
 BF_BULLET = '#extern/bullet2/src'
 BF_BULLET_INC = '${BF_BULLET}'
 BF_BULLET_LIB = 'extern_bullet'
@@ -102,7 +102,7 @@
 BF_WINTAB = LIBDIR + '/wintab'
 BF_WINTAB_INC = '${BF_WINTAB}/INCLUDE'
 
-WITH_BF_YAFRAY = 'true'
+WITH_BF_YAFRAY = 'false'
 
 #WITH_BF_NSPR = 'true'
 #BF_NSPR = $(LIBDIR)/nspr
@@ -127,7 +127,7 @@
 BF_FREETYPE_LIB = 'freetype2ST'
 BF_FREETYPE_LIBPATH = '${BF_FREETYPE}/lib'
 
-WITH_BF_QUICKTIME = 'true' # -DWITH_QUICKTIME
+WITH_BF_QUICKTIME = 'false' # -DWITH_QUICKTIME
 BF_QUICKTIME = LIBDIR + '/QTDevWin'
 BF_QUICKTIME_INC = '${BF_QUICKTIME}/CIncludes'
 BF_QUICKTIME_LIB = 'qtmlClient'
@@ -144,12 +144,11 @@
 CXX = 'cl.exe'
 
 CCFLAGS = ['/nologo', '/Og', '/Ot', '/Ob1', '/Op', '/G6','/EHsc', '/J', '/W3', '/Gd', '/MT']
+BF_DEBUG_FLAGS = ['/Od', '/Zi', '/FR${TARGET}.sbr']
 
-BF_DEBUG_FLAGS = ['/Zi', '/FR${TARGET.base}.sbr']
-
-CPPFLAGS = ['-DWIN32','-D_CONSOLE', '-D_LIB', '-DUSE_OPENAL', '-DFTGL_LIBRARY_STATIC', '-D_CRT_SECURE_NO_DEPRECATE']
-REL_CFLAGS = ['-O2', '-DNDEBUG']
-REL_CCFLAGS = ['-O2', '-DNDEBUG']
+CPPFLAGS = ['-DWIN32','-D_CONSOLE', '-D_LIB', '-DFTGL_LIBRARY_STATIC', '-D_CRT_SECURE_NO_DEPRECATE']
+REL_CFLAGS = ['-DNDEBUG']
+REL_CCFLAGS = ['-DNDEBUG']
 C_WARN = []
 CC_WARN = []
 

Added: branches/bmesh/source/blender/blenkernel/intern/BME_eulers.c
===================================================================
--- branches/bmesh/source/blender/blenkernel/intern/BME_eulers.c	                        (rev 0)
+++ branches/bmesh/source/blender/blenkernel/intern/BME_eulers.c	2007-07-29 05:25:22 UTC (rev 11411)
@@ -0,0 +1,1002 @@
+/**
+ * BME_eulers.c    jan 2007
+ *
+ *	BMesh Euler construction API.
+ *
+ * $Id: BME_eulers.c,v 1.00 2007/01/17 17:42:01 Briggs Exp $
+ *
+ * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License.  See http://www.blender.org/BL/ for information
+ * about this.	
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2004 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Geoffrey Bantle.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_listBase.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_mesh_types.h"
+
+#include "BKE_utildefines.h"
+#include "BKE_bmesh.h"
+
+#include "BLI_blenlib.h"
+#include "bmesh_private.h"
+#include "BLI_ghash.h"
+
+/*********************************************************
+ *                    "Euler API"                        *
+ *                                                       *
+ *                                                       *
+ *	 Primitive construction operators for mesh tools.    *
+ *                                                       *
+ **********************************************************/
+
+
+/*
+	The functions in this file represent the 'primitive' or 'atomic' operators that
+	mesh tools use to manipulate the topology of the structure.* The purpose of these
+	functions is to provide a trusted set of operators to manipulate the mesh topology
+	and which can also be combined together like building blocks to create more 
+	sophisticated tools. It needs to be stressed that NO manipulation of an existing 
+	mesh structure should be done outside of these functions.
+	
+	In the BMesh system, each euler is named by an ancronym which describes what it actually does.
+	Furthermore each Euler has a logical inverse. An important design criteria of all Eulers is that
+	through a Euler's logical inverse you can 'undo' an operation. (Special note should
+	be taken of BME_loop_reverse, which is its own inverse).
+		
+	BME_MF/KF: Make Face and Kill Face
+	BME_ME/KE: Make Edge and Kill Edge
+	BME_MV/KV: Make Vert and Kill Vert
+	BME_SEMV/JEKV: Split Edge, Make Vert and Join Edge, Kill Vert
+	BME_SFME/JFKE: Split Face, Make Edge and Join Face, Kill Edge
+	BME_loop_reverse: Reverse a Polygon's loop cycle. (used for flip normals for one)
+	
+	Using a combination of these eleven eulers any non-manifold modelling operation can be achieved.
+	Each Euler operator has a detailed explanation of what is does in the comments preceding its 
+	code. 
+
+   *The term "Euler Operator" is actually a misnomer when referring to a non-manifold 
+    data structure. Its use is in keeping with the convention established by others.
+
+	TODO:
+	-Finish inserting 'strict' validation in all Eulers
+*/
+
+#define RETCLEAR(bm) {bm->rval->v = bm->rval->e = bm->rval->f = bm->rva->l = NULL;}
+/*MAKE Eulers*/
+
+/**
+ *			BME_MV
+ *
+ *	MAKE VERT EULER:
+ *	
+ *	Makes a single loose vertex.
+ *
+ *	Returns -
+ *	A BME_Vert pointer.
+ */
+
+BME_Vert *BME_MV(BME_Mesh *bm, float *vec){
+	BME_Vert *v = BME_addvertlist(bm, NULL);	
+	VECCOPY(v->co,vec);
+	return v;
+}
+
+/**
+ *			BME_ME
+ *
+ *	MAKE EDGE EULER:
+ *	
+ *	Makes a single wire edge between two vertices.
+ *	If the caller does not want there to be duplicate
+ *	edges between the vertices, it is up to them to check 
+ *	for this condition beforehand.
+ *
+ *	Returns -
+ *	A BME_Edge pointer.
+ */
+
+BME_Edge *BME_ME(BME_Mesh *bm, BME_Vert *v1, BME_Vert *v2){
+	BME_Edge *e=NULL;
+	BME_CycleNode *d1=NULL, *d2=NULL;
+	int valance1=0, valance2=0, edok;
+	
+	/*edge must be between two distinct vertices...*/
+	if(v1 == v2) return NULL;
+	
+	#ifndef BME_FASTEULER
+	/*count valance of v1*/
+	if(v1->edge){ 
+		d1 = BME_disk_getpointer(v1->edge,v1);
+		if(d1) valance1 = BME_cycle_length(d1);
+		else BME_error();
+	}
+	if(v2->edge){
+		d2 = BME_disk_getpointer(v2->edge,v2);
+		if(d2) valance2 = BME_cycle_length(d2);
+		else BME_error();
+	}
+	#endif
+	
+	/*go ahead and add*/
+	e = BME_addedgelist(bm, v1, v2, NULL);
+	BME_disk_append_edge(e, e->v1);
+	BME_disk_append_edge(e, e->v2);
+	
+	#ifndef BME_FASTEULER
+	/*verify disk cycle lengths*/
+	d1 = BME_disk_getpointer(e, e->v1);
+	edok = BME_cycle_validate(valance1+1, d1);
+	if(!edok) BME_error();
+	d2 = BME_disk_getpointer(e, e->v2);
+	edok = BME_cycle_validate(valance2+1, d2);
+	if(!edok) BME_error();
+	
+	/*verify that edge actually made it into the cycle*/
+	edok = BME_disk_hasedge(v1, e);
+	if(!edok) BME_error();
+	edok = BME_disk_hasedge(v2, e);
+	if(!edok) BME_error();
+	#endif
+	return e;
+}
+
+
+
+/**
+ *			BME_MF
+ *
+ *	MAKE FACE EULER:
+ *	Takes a list of edge pointers which form a closed loop and makes a face 
+ *  from them. The first edge in elist is considered to be the start of the 
+ *	polygon, and v1 and v2 are its vertices and determine the winding of the face 
+ *  Other than the first edge, no other assumptions are made about the order of edges
+ *  in the elist array. To verify that it is a single closed loop and derive the correct 
+ *  order a simple series of verifications is done and all elements are visited.
+ *		
+ *  Returns -
+ *	A BME_Poly pointer
+ */
+
+#define MF_CANDIDATE	1
+#define MF_VISITED		2
+#define MF_TAKEN		4 
+
+BME_Poly *BME_MF(BME_Mesh *bm, BME_Vert *v1, BME_Vert *v2, BME_Edge **elist, int len)
+{
+	BME_Poly *f = NULL;
+	BME_Edge *curedge;
+	BME_Vert *curvert, *tv, *nextv,**vlist;
+	int i, j, done, cont, edok,vlen;
+	
+	if(len < 2) return NULL;
+	
+	/*make sure that v1 and v2 are in elist[0]*/
+	if(BME_verts_in_edge(v1,v2,elist[0]) == 0) return NULL;
+	
+	/*clear euler flags*/
+	for(i=0;i<len;i++) elist[i]->eflag1=elist[i]->eflag2 = 0;
+	for(i=0;i<len;i++){
+		elist[i]->eflag1 |= MF_CANDIDATE;
+		
+		/*if elist[i] has a loop, count its radial length*/
+		if(elist[i]->loop) elist[i]->eflag2 = BME_cycle_length(&(elist[i]->loop->radial));
+		else elist[i]->eflag2 = 0;
+	}
+	
+	/*	For each vertex in each edge, it must have exactly two MF_CANDIDATE edges attached to it
+		Note that this does not gauruntee that face is a single closed loop. At best it gauruntees
+		that elist contains a finite number of seperate closed loops.
+	*/
+	for(i=0; i<len; i++){
+		edok = BME_disk_count_edgeflag(elist[i]->v1, MF_CANDIDATE, 0);
+		if(edok != 2) return NULL;
+		edok = BME_disk_count_edgeflag(elist[i]->v2, MF_CANDIDATE, 0);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list