diff options
author | Joshua Leung <aligorith@gmail.com> | 2009-06-22 08:39:35 +0400 |
---|---|---|
committer | Joshua Leung <aligorith@gmail.com> | 2009-06-22 08:39:35 +0400 |
commit | aa267976b86f90423204e11a30eec4e0def0f296 (patch) | |
tree | e1b09c017eef0191473b9aa1e59fd08ffe705f43 | |
parent | f1fb09a493b79e6320a651a035203dff98c3b580 (diff) | |
parent | 1efffc1f564af0597512699890d7be9f41a6aee2 (diff) |
NLA SoC: Merge from 2.5
21043 to 21072
(NOTE TO SELF: Campbell made a commit in 2.5 before this merge finished)
325 files changed, 1976 insertions, 67170 deletions
diff --git a/SConstruct b/SConstruct index 808fa09bea0..b85bc799ea5 100644 --- a/SConstruct +++ b/SConstruct @@ -285,9 +285,7 @@ if 'blenderlite' in B.targets: target_env_defs['WITH_BF_SDL'] = False target_env_defs['WITH_BF_JPEG'] = False target_env_defs['WITH_BF_PNG'] = False - target_env_defs['WITH_BF_ODE'] = False target_env_defs['WITH_BF_BULLET'] = False - target_env_defs['WITH_BF_SOLID'] = False target_env_defs['WITH_BF_BINRELOC'] = False target_env_defs['BF_BUILDINFO'] = False target_env_defs['BF_NO_ELBEEM'] = True diff --git a/config/darwin-config.py b/config/darwin-config.py index 080820f885a..785f1cb42a2 100644 --- a/config/darwin-config.py +++ b/config/darwin-config.py @@ -141,20 +141,11 @@ BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib' WITH_BF_GAMEENGINE=True WITH_BF_PLAYER=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 BF_BULLET = '#extern/bullet2/src' BF_BULLET_INC = '${BF_BULLET}' BF_BULLET_LIB = 'extern_bullet' -BF_SOLID = '#extern/solid' -BF_SOLID_INC = '${BF_SOLID}' -BF_SOLID_LIB = 'extern_solid' - #WITH_BF_NSPR = True #BF_NSPR = $(LIBDIR)/nspr #BF_NSPR_INC = -I$(BF_NSPR)/include -I$(BF_NSPR)/include/nspr diff --git a/config/irix6-config.py b/config/irix6-config.py index 3c8fd0dece4..87af6b29eb1 100644 --- a/config/irix6-config.py +++ b/config/irix6-config.py @@ -74,20 +74,11 @@ BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib' WITH_BF_GAMEENGINE='false' -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' BF_BULLET = '#extern/bullet2/src' BF_BULLET_INC = '${BF_BULLET}' BF_BULLET_LIB = 'extern_bullet' -BF_SOLID = '#extern/solid' -BF_SOLID_INC = '${BF_SOLID}' -BF_SOLID_LIB = 'extern_solid' - #WITH_BF_NSPR = 'true' #BF_NSPR = $(LIBDIR)/nspr #BF_NSPR_INC = -I$(BF_NSPR)/include -I$(BF_NSPR)/include/nspr diff --git a/config/linux2-config.py b/config/linux2-config.py index 4cea4bb8e05..86de10c8fb3 100644 --- a/config/linux2-config.py +++ b/config/linux2-config.py @@ -77,20 +77,11 @@ BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib' WITH_BF_GAMEENGINE = True WITH_BF_PLAYER = 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 BF_BULLET = '#extern/bullet2/src' BF_BULLET_INC = '${BF_BULLET}' BF_BULLET_LIB = 'extern_bullet' -BF_SOLID = '#extern/solid' -BF_SOLID_INC = '${BF_SOLID}' -BF_SOLID_LIB = 'extern_solid' - #WITH_BF_NSPR = True #BF_NSPR = $(LIBDIR)/nspr #BF_NSPR_INC = -I$(BF_NSPR)/include -I$(BF_NSPR)/include/nspr diff --git a/config/linuxcross-config.py b/config/linuxcross-config.py index 2f15ef67e6c..5e5c44ecd69 100644 --- a/config/linuxcross-config.py +++ b/config/linuxcross-config.py @@ -74,20 +74,11 @@ BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib' WITH_BF_GAMEENGINE = False -WITH_BF_ODE = True -BF_ODE = LIBDIR + '/ode' -BF_ODE_INC = BF_ODE + '/include' -BF_ODE_LIB = BF_ODE + '/lib/libode.a' - WITH_BF_BULLET = True BF_BULLET = '#extern/bullet2/src' BF_BULLET_INC = '${BF_BULLET}' BF_BULLET_LIB = 'extern_bullet' -BF_SOLID = '#extern/solid' -BF_SOLID_INC = '${BF_SOLID}' -BF_SOLID_LIB = 'extern_solid' - BF_WINTAB = LIBDIR + '/wintab' BF_WINTAB_INC = '${BF_WINTAB}/INCLUDE' diff --git a/config/openbsd3-config.py b/config/openbsd3-config.py index f27066b43f7..2b0621e2ed3 100644 --- a/config/openbsd3-config.py +++ b/config/openbsd3-config.py @@ -61,20 +61,11 @@ BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib' WITH_BF_GAMEENGINE=False -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 BF_BULLET = '#extern/bullet2/src' BF_BULLET_INC = '${BF_BULLET}' BF_BULLET_LIB = 'extern_bullet' -BF_SOLID = '#extern/solid' -BF_SOLID_INC = '${BF_SOLID}' -BF_SOLID_LIB = 'extern_solid' - #WITH_BF_NSPR = True #BF_NSPR = $(LIBDIR)/nspr #BF_NSPR_INC = -I$(BF_NSPR)/include -I$(BF_NSPR)/include/nspr diff --git a/config/sunos5-config.py b/config/sunos5-config.py index e050a5950aa..dc067b6f568 100644 --- a/config/sunos5-config.py +++ b/config/sunos5-config.py @@ -69,20 +69,11 @@ BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib' WITH_BF_GAMEENGINE=False -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 BF_BULLET = '#extern/bullet2/src' BF_BULLET_INC = '${BF_BULLET}' BF_BULLET_LIB = 'extern_bullet' -BF_SOLID = '#extern/solid' -BF_SOLID_INC = '${BF_SOLID}' -BF_SOLID_LIB = 'extern_solid' - #WITH_BF_NSPR = True #BF_NSPR = $(LIBDIR)/nspr #BF_NSPR_INC = -I$(BF_NSPR)/include -I$(BF_NSPR)/include/nspr diff --git a/config/win32-mingw-config.py b/config/win32-mingw-config.py index 5b9b2f9b9dc..42e56417f54 100644 --- a/config/win32-mingw-config.py +++ b/config/win32-mingw-config.py @@ -77,20 +77,11 @@ BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib' WITH_BF_GAMEENGINE = False -WITH_BF_ODE = True -BF_ODE = LIBDIR + '/ode' -BF_ODE_INC = BF_ODE + '/include' -BF_ODE_LIB = BF_ODE + '/lib/libode.a' - WITH_BF_BULLET = True BF_BULLET = '#extern/bullet2/src' BF_BULLET_INC = '${BF_BULLET}' BF_BULLET_LIB = 'extern_bullet' -BF_SOLID = '#extern/solid' -BF_SOLID_INC = '${BF_SOLID}' -BF_SOLID_LIB = 'extern_solid' - BF_WINTAB = LIBDIR + '/wintab' BF_WINTAB_INC = '${BF_WINTAB}/INCLUDE' diff --git a/config/win32-vc-config.py b/config/win32-vc-config.py index 04e87a23ed1..82babeb1a3a 100644 --- a/config/win32-vc-config.py +++ b/config/win32-vc-config.py @@ -90,20 +90,11 @@ BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib' WITH_BF_GAMEENGINE = True WITH_BF_PLAYER = True -WITH_BF_ODE = True -BF_ODE = LIBDIR + '/ode' -BF_ODE_INC = BF_ODE + '/include' -BF_ODE_LIB = BF_ODE + '/lib/libode.a' - WITH_BF_BULLET = True BF_BULLET = '#extern/bullet2/src' BF_BULLET_INC = '${BF_BULLET}' BF_BULLET_LIB = 'extern_bullet' -BF_SOLID = '#extern/solid' -BF_SOLID_INC = '${BF_SOLID}' -BF_SOLID_LIB = 'extern_solid' - BF_WINTAB = LIBDIR + '/wintab' BF_WINTAB_INC = '${BF_WINTAB}/INCLUDE' diff --git a/config/win64-vc-config.py b/config/win64-vc-config.py index fcc6f1ab846..83e27a85574 100644 --- a/config/win64-vc-config.py +++ b/config/win64-vc-config.py @@ -93,20 +93,11 @@ BF_GETTEXT_LIBPATH = '${BF_GETTEXT}/lib' WITH_BF_GAMEENGINE = True WITH_BF_PLAYER = False -WITH_BF_ODE = True -BF_ODE = LIBDIR + '/ode' -BF_ODE_INC = BF_ODE + '/include' -BF_ODE_LIB = BF_ODE + '/lib/libode.a' - WITH_BF_BULLET = True BF_BULLET = '#extern/bullet2/src' BF_BULLET_INC = '${BF_BULLET}' BF_BULLET_LIB = 'extern_bullet' -BF_SOLID = '#extern/solid' -BF_SOLID_INC = '${BF_SOLID}' -BF_SOLID_LIB = 'extern_solid' - BF_WINTAB = LIBDIR + '/wintab' BF_WINTAB_INC = '${BF_WINTAB}/INCLUDE' diff --git a/extern/CMakeLists.txt b/extern/CMakeLists.txt index 8dcace11e7d..b6cfe3b113e 100644 --- a/extern/CMakeLists.txt +++ b/extern/CMakeLists.txt @@ -24,11 +24,6 @@ # # ***** END GPL LICENSE BLOCK ***** -IF(WITH_GAMEENGINE) - ADD_SUBDIRECTORY(qhull) - ADD_SUBDIRECTORY(solid) -ENDIF(WITH_GAMEENGINE) - IF(WITH_BULLET) ADD_SUBDIRECTORY(bullet2) ENDIF(WITH_BULLET) diff --git a/extern/Makefile b/extern/Makefile index 8311006444f..61499da8743 100644 --- a/extern/Makefile +++ b/extern/Makefile @@ -30,7 +30,7 @@ include nan_definitions.mk SOURCEDIR = extern DIR = $(OCGDIR)/extern -DIRS = qhull/src solid glew/src +DIRS = glew/src ifeq ($(WITH_FFMPEG), true) ifeq ($(NAN_FFMPEG), $(LCGDIR)/ffmpeg) diff --git a/extern/SConscript b/extern/SConscript index 126f40b00b3..175613c3d2b 100644 --- a/extern/SConscript +++ b/extern/SConscript @@ -4,10 +4,6 @@ Import('env') SConscript(['glew/SConscript']) -if env['WITH_BF_GAMEENGINE']: - if env['WITH_BF_SOLID']: - SConscript(['qhull/SConscript', 'solid/SConscript']) - if env['WITH_BF_BULLET']: SConscript(['bullet2/src/SConscript']) diff --git a/extern/qhull/CMakeLists.txt b/extern/qhull/CMakeLists.txt deleted file mode 100644 index f2ac24afff3..00000000000 --- a/extern/qhull/CMakeLists.txt +++ /dev/null @@ -1,45 +0,0 @@ -# $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, Blender Foundation -# All rights reserved. -# -# The Original Code is: all of this file. -# -# Contributor(s): Jacques Beaurain. -# -# ***** END GPL LICENSE BLOCK ***** - -SET(INC include src) - -SET(SRC - src/geom.c - src/geom2.c - src/global.c - src/io.c - src/mem.c - src/merge.c - src/poly.c - src/poly2.c - src/qhull.c - src/qset.c - src/stat.c - src/user.c -) - -BLENDERLIB(extern_qhull "${SRC}" "${INC}") -#, libtype=['game2','player'], priority=[50, 85] diff --git a/extern/qhull/COPYING.txt b/extern/qhull/COPYING.txt deleted file mode 100644 index 1334eba6d0b..00000000000 --- a/extern/qhull/COPYING.txt +++ /dev/null @@ -1,37 +0,0 @@ - Qhull, Copyright (c) 1993-2002 - - The National Science and Technology Research Center for - Computation and Visualization of Geometric Structures - (The Geometry Center) - University of Minnesota - 400 Lind Hall - 207 Church Street S.E. - Minneapolis, MN 55455 USA - - email: qhull@geom.umn.edu - -This software includes Qhull from The Geometry Center. Qhull is -copyrighted as noted above. Qhull is free software and may be obtained -via http from www.geom.umn.edu. It may be freely copied, modified, -and redistributed under the following conditions: - -1. All copyright notices must remain intact in all files. - -2. A copy of this text file must be distributed along with any copies - of Qhull that you redistribute; this includes copies that you have - modified, or copies of programs or other software products that - include Qhull. - -3. If you modify Qhull, you must include a notice giving the - name of the person performing the modification, the date of - modification, and the reason for such modification. - -4. When distributing modified versions of Qhull, or other software - products that include Qhull, you must provide notice that the original - source code may be obtained as noted above. - -5. There is no warranty or other guarantee of fitness for Qhull, it is - provided solely "as is". Bug reports or fixes may be sent to - qhull_bug@geom.umn.edu; the authors may or may not act on them as - they desire. - diff --git a/extern/qhull/README.txt b/extern/qhull/README.txt deleted file mode 100644 index 9ef958a1f47..00000000000 --- a/extern/qhull/README.txt +++ /dev/null @@ -1,318 +0,0 @@ -Name - - qhull, rbox 2002.1 August 20, 2002 - -Convex hull, Delaunay triangulation, Voronoi diagrams, Halfspace intersection - - Documentation: - html/index.htm - - Available from: - <http://www.geom.umn.edu/software/qhull> - <http://savannah.gnu.org/projects/qhull> - <http://www.thesa.com/software/qhull> - - Version 1 (simplicial only): - <http://www.geom.umn.edu/software/qhull/qhull-1.0.tar.gz> - <http://www.geom.umn.edu/software/qhull/qhull.sit.hqx> - - News and a paper: - <http://www.geom.umn.edu/~bradb/qhull-news.html> - <http://www.geom.umn.edu/software/qhull/qhull-96.ps> - -Purpose - - Qhull is a general dimension convex hull program that reads a set - of points from stdin, and outputs the smallest convex set that contains - the points to stdout. It also generates Delaunay triangulations, Voronoi - diagrams, furthest-site Voronoi diagrams, and halfspace intersections - about a point. - - Rbox is a useful tool in generating input for Qhull; it generates - hypercubes, diamonds, cones, circles, simplices, spirals, - lattices, and random points. - - Qhull produces graphical output for Geomview. This helps with - understanding the output. <http://www.geomview.org> - - -Environment requirements - - Qhull and rbox should run on all 32-bit and 64-bit computers. Use - an ANSI C or C++ compiler to compile the program. The software is - self-contained. - - Qhull is copyrighted software. Please read COPYING.txt and REGISTER.txt - before using or distributing Qhull. - -To contribute to Qhull - - Qhull is on Savannah, http://savannah.gnu.org/projects/qhull/ - -Qhull on Windows 95, 98, ME, NT, 2000, XP - - The zip file contains rbox.exe, qhull.exe, qconvex.exe, qdelaunay.exe, - qhalf.exe, qvoronoi.exe, documentation files, and source files. - - To install Qhull: - - Unzip the files into a directory. You may use WinZip32 <www.hotfiles.com> - - Open a DOS window for the directory. - - In Windows 95, the DOS window needs improvement. - - Double-click on qhull\eg\qhull-go.bat to call doskey (arrow keys). - - Increase the size of the screen font to 8x12. - - If the text is too dim, fix the screen colors with shareware (e.g., crt.exe) - - If you use qhull a lot, consider using the Cygwin Unix shell, - Cygwin tools (http://sources.redhat.com/cygwin/) - - Execute 'qconvex' for a synopsis and examples. - - Execute 'rbox 10 | qconvex' to compute the convex hull of 10 random points. - - Execute 'rbox 10 | qconvex i TO file' to write results to 'file'. - - If an error occurs, Windows 95 sends the error to stdout instead of stderr - - use 'TO xxx' to send normal output to xxx and error output to stdout - - Browse the documentation: qhull\html\index.htm - -Compiling for Unix - - The gzip file, qhull.tgz, contains documentation and source files for - qhull and rbox. - - To unpack the gzip file - - tar zxf qhull.tgz - - cd qhull - - Compiling with the Debian Make:[R. Laboissiere] - - cd src - - ./Make-config.sh - - cd .. - - configure - - make - - Compiling with Makefile (i.e., Makefile.txt) - - cd src - - in Makefile, check the CC, CCOPTS1, PRINTMAN, and PRINTC defines - - the defaults are gcc and enscript - - CCOPTS1 should include the ANSI flag. It defines __STDC__ - - in user.h, check the definitions of qh_SECticks and qh_CPUclock. - - use '#define qh_CLOCKtype 2' for timing runs longer than 1 hour - - type: make - - this builds: qhull qconvex qdelaunay qhalf qvoronoi rbox libqhull.a - - type: make doc - - this prints the man page - - See also qhull/html/index.htm - - if your compiler reports many errors, it is probably not a ANSI C compiler - - you will need to set the -ansi switch or find another compiler - - if your compiler warns about missing prototypes for fprintf() etc. - - this is ok, your compiler should have these in stdio.h - - if your compiler warns about missing prototypes for memset() etc. - - include memory.h in qhull_a.h - - if your compiler is gcc-2.95.1, you need to set flag -fno-strict-aliasing. - - This flag is set by default for other versions [Karas, Krishnaswami] - - if your compiler reports "global.c: storage size of 'qh_qh' isn't known" - - delete the initializer "={0}" in global.c, stat.c and mem.c - - if your compiler warns about "stat.c: improper initializer" - - this is ok, the initializer is not used - - if you have trouble building libqhull.a with 'ar' - - try 'make -f Makefile.txt qhullx' - - if the code compiles, the qhull test case will automatically execute - - if an error occurs, there's an incompatibility between machines - - For gcc-2.95.1, you need to set flag -fno-strict-aliasing. - It is set by default for other versions of gcc [Karas, Krishnaswami] - - If you can, try a different compiler - - You can turn off the Qhull memory manager with qh_NOmem in mem.h - - You can turn off compiler optimization (-O2 in Makefile) - - If you find the source of the problem, please let us know - - if you have Geomview (www.geomview.org) - - try 'rbox 100 | qconvex G >a' and load 'a' into Geomview - - run 'q_eg' for Geomview examples of Qhull output (see qh-eg.htm) - - to install the programs and their man pages: - - define MANDIR and BINDIR - - type 'make install' - -Compiling for Windows NT, 2000, XP with cygwin (www.cygwin.com) - - - install cygwin with gcc, make, ar, and ln - - cd qhull/src - - make -f Makefile.txt - -Compiling for Windows 95, 98, NT, 2000, XP - - Qhull compiles as a console application in Visual C++ 5.0 at warning - level 3. - - Visual C++ quickstart for qhull.exe: - - create a "Win32 console application" called "qhull" - - add the following files: - geom.c geom2.c global.c io.c mem.c merge.c poly.c poly2.c qhull.c - qset.c stat.c unix.c user.c - - create a "Win32 console application" called "rbox" - - add rbox.c - - Visual C++ quickstart for qhull library, qconvex.exe, etc. - - To simplify setting up lots of projects, - - create a temporary "Win32 console application" called "source" - - add all .c files from .../src/... - - In Tools::Options::Tab - Set tab size to 8 and indent size to 2 - - - create a "Win32 console application" called "rbox" - - move rbox.c from "qhull source" - - for Project:Settings..., Link - you only need the default libraries - - build the project - - - create a "Win32 static library" called "library" - - move these files from "qhull source" - geom.c geom2.c global.c io.c mem.c merge.c poly.c poly2.c qhull.c - qset.c stat.c user.c - - set the library file (use the same for debug and release) - - build the project - - - create a "Win32 console application" called "qhull" - - move unix.c from "qhull source" - - Set the library file in Project:Settings..., Link - - Qhull does not use other libraries - - - create a "Win32 console application" called "qconvex" - - move qconvex.c from "qhull source" - - Set the library file in Project:Settings..., Link - - - do the same for qdelaun.c, qhalf, qvoronoi.c, user_eg.c, user_eg2.c - - delete "qhull sources" since it is no longer needed - - Set the library file in Project:Settings..., Link - - use Project:Settings to make any changes - - use batch build to rebuild everything - - Qhull compiles with Borland C++ 5.0 bcc32. A Makefile is included. - Execute 'make -f MBorland'. If you use the Borland IDE, set the ANSI - option in Options:Project:Compiler:Source:Language-compliance. - - Qhull compiles with Borland C++ 4.02 for Win32 and DOS Power Pack. - Use 'make -f MBorland -D_DPMI'. Qhull 1.0 compiles with Borland - C++ 4.02. For rbox 1.0, use "bcc32 -WX -w- -O2-e -erbox -lc rbox.c". - Use the same options for Qhull 1.0. [D. Zwick] - - Qhull compiles with Metrowerks C++ 1.7 with the ANSI option. - - If you turn on full warnings, the compiler will report a number of - unused variables, variables set but not used, and dead code. These are - intentional. For example, variables may be initialized (unnecessarily) - to prevent warnings about possible use of uninitialized variables. - -Compiling for the Power Macintosh - - Qhull compiles for the Power Macintosh with Metrowerk's C compiler. - It uses the SIOUX interface to read point coordinates and return output. - There is no graphical output. For project files, see 'Compiling for - Windows 95'. Instead of using SIOUX, Qhull may be embedded within an - application. - - Version 1 is available for Macintosh computers by download of qhull.sit.hqx - It reads point coordinates from a standard file and returns output - to a standard file. There is no graphical output. - - -Compiling for other machines - - Some users have reported problems with compiling Qhull under Irix 5.1. It - compiles under other versions of Irix. - - If you have troubles with the memory manager, you can turn it off by - defining qh_NOmem in mem.h. - - You may compile Qhull with a C++ compiler. - - -Distributed files - - README.txt // instructions for installing Qhull - REGISTER.txt // Qhull registration - COPYING.txt // copyright notice - Announce.txt // announcement - Changes.txt // change history for Qhull and rbox - qh-faq.htm // Frequently asked questions - qh-home.htm // Home page - qh-get.htm // Download page - html/index.htm // Manual - Makefile.txt // Makefile for Unix or cygwin 'make' - MBorland // Makefile for Borland C++/Win32 - Make-config.sh // Create Debian configure and automake - -src/ - rbox consists of: - rbox.exe // Win32 executable (.zip only) - rbox.htm // html manual - rbox.man // Unix man page - rbox.txt - rbox.c // source program - - qhull consists of: - qhull.exe // Win32 executables (.zip only) - qconvex.exe - qdelaunay.exe - qhalf.exe - qvoronoi.exe - qhull-go.bat // DOS window - qconvex.htm // html manuals - qdelaun.htm - qdelau_f.htm - qhalf.htm - qvoronoi.htm - qvoron_f.htm - qh-eg.htm - qh-impre.htm - qh-in.htm - index.htm - qh-opt*.htm - qh-quick.htm - qh--4d.gif,etc. // images for manual - qhull.man // Unix man page - qhull.txt - q_eg // shell script for Geomview examples - q_egtest // shell script for Geomview test examples - q_test // shell script to test qhull - - top-level source files: - src/index.htm // index to source files - qh-...htm // specific files - user.h // header file of user definable constants - qhull.h // header file for qhull - unix.c // Unix front end to qhull - qhull.c // Quickhull algorithm with partitioning - user.c // user re-definable functions - user_eg.c // example of incorporating qhull into a user program - user_eg2.c // more complex example - qhull_interface.cpp // call Qhull from C++ - - other source files: - qhull_a.h // include file for *.c - geom.c // geometric routines - geom2.c - geom.h - global.c // global variables - io.c // input-output routines - io.h - mem.c // memory routines, this is stand-alone code - mem.h - merge.c // merging of non-convex facets - merge.h - poly.c // polyhedron routines - poly2.c - poly.h - qset.c // set routines, this only depends on mem.c - qset.h - stat.c // statistics - stat.h - -Authors: - - C. Bradford Barber Hannu Huhdanpaa - bradb@geom.umn.edu hannu@geom.umn.edu - - c/o The Geometry Center - University of Minnesota - 400 Lind Hall - 207 Church Street S.E. - Minneapolis, MN 55455 - - This software was developed under NSF grants NSF/DMS-8920161 and - NSF-CCR-91-15793 750-7504 at the Geometry Center and Harvard - University. If you find Qhull useful, please let us know. diff --git a/extern/qhull/REGISTER.txt b/extern/qhull/REGISTER.txt deleted file mode 100644 index 767eb1c0cda..00000000000 --- a/extern/qhull/REGISTER.txt +++ /dev/null @@ -1,37 +0,0 @@ -Dear User of Geometry Center Software: - -We would like to find out how you are using our software. Think of -Geometry Center software as a new kind of shareware: you share your -science and successes with us, and we share our software and support -with you. - -If you use Geometry Center software, please send us a note telling -us what you are doing with it. - -We need to know: - - (1) What you are working on - an abstract of your work would be - fine. - - (2) What Geometry Center software you use. - - (3) How that software has helped you, for example, by increasing - your productivity or allowing you to do things you could not do - before. In particular, if you feel that Geometry Center - software has had a direct bearing on your work, please tell us - about this. - -We encourage you to cite the use of any Geometry Center software you -have used in your publications. - -To cite Qhull, use - - Barber, C.B., Dobkin, D.P., and Huhdanpaa, H.T., "The Quickhull - algorithm for convex hulls," ACM Trans. on Mathematical Software, - Dec 1996. http://www.geom.umn.edu/software/qhull - -Please send e-mail to - - qhull@geom.umn.edu - -Thank you! diff --git a/extern/qhull/SConscript b/extern/qhull/SConscript deleted file mode 100644 index d3db67cddc0..00000000000 --- a/extern/qhull/SConscript +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/python -import sys -import os - -Import('env') -defs = '' -cflags = [] -if sys.platform=='linux2' or sys.platform=='linux-i386': - cflags += ['-O2','-ansi'] -elif env['OURPLATFORM']=='win32-vc': - cflags += ['/O2'] -elif env['OURPLATFORM']=='win32-mingw': - cflags += ['-O2'] -elif sys.platform=='sunos5': - cflags += ['-O2', '-ansi'] -elif sys.platform=='darwin': - cflags += ['-O2', '-pipe', '-fPIC', '-funsigned-char', '-ffast-math'] - -sources = ['src/geom.c', - 'src/geom2.c', - 'src/global.c', - 'src/io.c', - 'src/mem.c', - 'src/merge.c', - 'src/poly.c', - 'src/poly2.c', - 'src/qhull.c', - 'src/qset.c', - 'src/stat.c', - 'src/user.c'] - - -incs = 'include src' - -env.BlenderLib ( 'extern_qhull', sources, Split(incs), Split(defs), libtype=['extern'], priority=[50], compileflags = cflags) diff --git a/extern/qhull/VisualC6/qhull.dsw b/extern/qhull/VisualC6/qhull.dsw deleted file mode 100644 index 96c68d8e34c..00000000000 --- a/extern/qhull/VisualC6/qhull.dsw +++ /dev/null @@ -1,29 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "qhull"=".\qhull\qhull.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/extern/qhull/VisualC6/qhull/qhull.dsp b/extern/qhull/VisualC6/qhull/qhull.dsp deleted file mode 100644 index 6e059b0994c..00000000000 --- a/extern/qhull/VisualC6/qhull/qhull.dsp +++ /dev/null @@ -1,192 +0,0 @@ -# Microsoft Developer Studio Project File - Name="qhull" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=qhull - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "qhull.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "qhull.mak" CFG="qhull - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "qhull - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "qhull - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "qhull - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Target_Dir "" -LINK32=cwlink.exe -MTL=midl.exe -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo -# Begin Special Build Tool -SOURCE="$(InputPath)" -PostBuild_Cmds=XCOPY /Y ..\..\include\qhull\*.h ..\..\..\..\..\lib\windows\qhull\include\qhull\ XCOPY /Y Release\*.lib ..\..\..\..\..\lib\windows\qhull\lib\ -# End Special Build Tool - -!ELSEIF "$(CFG)" == "qhull - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Target_Dir "" -LINK32=cwlink.exe -MTL=midl.exe -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD CPP /nologo /MT /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo -# Begin Special Build Tool -SOURCE="$(InputPath)" -PostBuild_Cmds=XCOPY /Y ..\..\include\qhull\*.h ..\..\..\..\..\lib\windows\qhull\include\qhull\ XCOPY /Y Debug\*.lib ..\..\..\..\..\lib\windows\qhull\lib\Debug\ -# End Special Build Tool - -!ENDIF - -# Begin Target - -# Name "qhull - Win32 Release" -# Name "qhull - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\..\src\geom.c -# End Source File -# Begin Source File - -SOURCE=..\..\src\geom2.c -# End Source File -# Begin Source File - -SOURCE=..\..\src\global.c -# End Source File -# Begin Source File - -SOURCE=..\..\src\io.c -# End Source File -# Begin Source File - -SOURCE=..\..\src\mem.c -# End Source File -# Begin Source File - -SOURCE=..\..\src\merge.c -# End Source File -# Begin Source File - -SOURCE=..\..\src\poly.c -# End Source File -# Begin Source File - -SOURCE=..\..\src\poly2.c -# End Source File -# Begin Source File - -SOURCE=..\..\src\qhull.c -# End Source File -# Begin Source File - -SOURCE=..\..\src\qset.c -# End Source File -# Begin Source File - -SOURCE=..\..\src\stat.c -# End Source File -# Begin Source File - -SOURCE=..\..\src\user.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=..\..\src\geom.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\io.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\mem.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\merge.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\poly.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\qhull.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\qhull_a.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\qset.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\stat.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\user.h -# End Source File -# End Group -# End Target -# End Project diff --git a/extern/qhull/include/qhull/geom.h b/extern/qhull/include/qhull/geom.h deleted file mode 100644 index 32440cff56f..00000000000 --- a/extern/qhull/include/qhull/geom.h +++ /dev/null @@ -1,177 +0,0 @@ -/*<html><pre> -<a href="qh-geom.htm" - >-------------------------------</a><a name="TOP">-</a> - - geom.h - header file for geometric routines - - see qh-geom.htm and geom.c - - copyright (c) 1993-2002 The Geometry Center -*/ - -#ifndef qhDEFgeom -#define qhDEFgeom 1 - -/* ============ -macros- ======================== */ - -/*-<a href="qh-geom.htm#TOC" - >--------------------------------</a><a name="fabs_">-</a> - - fabs_(a) - returns the absolute value of a -*/ -#define fabs_( a ) ((( a ) < 0 ) ? -( a ):( a )) - -/*-<a href="qh-geom.htm#TOC" - >--------------------------------</a><a name="fmax_">-</a> - - fmax_(a,b) - returns the maximum value of a and b -*/ -#define fmax_( a,b ) ( ( a ) < ( b ) ? ( b ) : ( a ) ) - -/*-<a href="qh-geom.htm#TOC" - >--------------------------------</a><a name="fmin_">-</a> - - fmin_(a,b) - returns the minimum value of a and b -*/ -#define fmin_( a,b ) ( ( a ) > ( b ) ? ( b ) : ( a ) ) - -/*-<a href="qh-geom.htm#TOC" - >--------------------------------</a><a name="maximize_">-</a> - - maximize_(maxval, val) - set maxval to val if val is greater than maxval -*/ -#define maximize_( maxval, val ) {if (( maxval ) < ( val )) ( maxval )= ( val );} - -/*-<a href="qh-geom.htm#TOC" - >--------------------------------</a><a name="minimize_">-</a> - - minimize_(minval, val) - set minval to val if val is less than minval -*/ -#define minimize_( minval, val ) {if (( minval ) > ( val )) ( minval )= ( val );} - -/*-<a href="qh-geom.htm#TOC" - >--------------------------------</a><a name="det2_">-</a> - - det2_(a1, a2, - b1, b2) - - compute a 2-d determinate -*/ -#define det2_( a1,a2,b1,b2 ) (( a1 )*( b2 ) - ( a2 )*( b1 )) - -/*-<a href="qh-geom.htm#TOC" - >--------------------------------</a><a name="det3_">-</a> - - det3_(a1, a2, a3, - b1, b2, b3, - c1, c2, c3) - - compute a 3-d determinate -*/ -#define det3_( a1,a2,a3,b1,b2,b3,c1,c2,c3 ) ( ( a1 )*det2_( b2,b3,c2,c3 ) \ - - ( b1 )*det2_( a2,a3,c2,c3 ) + ( c1 )*det2_( a2,a3,b2,b3 ) ) - -/*-<a href="qh-geom.htm#TOC" - >--------------------------------</a><a name="dX">-</a> - - dX( p1, p2 ) - dY( p1, p2 ) - dZ( p1, p2 ) - - given two indices into rows[], - - compute the difference between X, Y, or Z coordinates -*/ -#define dX( p1,p2 ) ( *( rows[p1] ) - *( rows[p2] )) -#define dY( p1,p2 ) ( *( rows[p1]+1 ) - *( rows[p2]+1 )) -#define dZ( p1,p2 ) ( *( rows[p1]+2 ) - *( rows[p2]+2 )) -#define dW( p1,p2 ) ( *( rows[p1]+3 ) - *( rows[p2]+3 )) - -/*============= prototypes in alphabetical order, infrequent at end ======= */ - -void qh_backnormal (realT **rows, int numrow, int numcol, boolT sign, coordT *normal, boolT *nearzero); -void qh_distplane (pointT *point, facetT *facet, realT *dist); -facetT *qh_findbest (pointT *point, facetT *startfacet, - boolT bestoutside, boolT isnewfacets, boolT noupper, - realT *dist, boolT *isoutside, int *numpart); -facetT *qh_findbesthorizon (boolT ischeckmax, pointT *point, - facetT *startfacet, boolT noupper, realT *bestdist, int *numpart); -facetT *qh_findbestnew (pointT *point, facetT *startfacet, realT *dist, - boolT bestoutside, boolT *isoutside, int *numpart); -void qh_gausselim(realT **rows, int numrow, int numcol, boolT *sign, boolT *nearzero); -realT qh_getangle(pointT *vect1, pointT *vect2); -pointT *qh_getcenter(setT *vertices); -pointT *qh_getcentrum(facetT *facet); -realT qh_getdistance(facetT *facet, facetT *neighbor, realT *mindist, realT *maxdist); -void qh_normalize (coordT *normal, int dim, boolT toporient); -void qh_normalize2 (coordT *normal, int dim, boolT toporient, - realT *minnorm, boolT *ismin); -pointT *qh_projectpoint(pointT *point, facetT *facet, realT dist); - -void qh_setfacetplane(facetT *newfacets); -void qh_sethyperplane_det (int dim, coordT **rows, coordT *point0, - boolT toporient, coordT *normal, realT *offset, boolT *nearzero); -void qh_sethyperplane_gauss (int dim, coordT **rows, pointT *point0, - boolT toporient, coordT *normal, coordT *offset, boolT *nearzero); -boolT qh_sharpnewfacets (void); - -/*========= infrequently used code in geom2.c =============*/ - - -coordT *qh_copypoints (coordT *points, int numpoints, int dimension); -void qh_crossproduct (int dim, realT vecA[3], realT vecB[3], realT vecC[3]); -realT qh_determinant (realT **rows, int dim, boolT *nearzero); -realT qh_detjoggle (pointT *points, int numpoints, int dimension); -void qh_detroundoff (void); -realT qh_detsimplex(pointT *apex, setT *points, int dim, boolT *nearzero); -realT qh_distnorm (int dim, pointT *point, pointT *normal, realT *offsetp); -realT qh_distround (int dimension, realT maxabs, realT maxsumabs); -realT qh_divzero(realT numer, realT denom, realT mindenom1, boolT *zerodiv); -realT qh_facetarea (facetT *facet); -realT qh_facetarea_simplex (int dim, coordT *apex, setT *vertices, - vertexT *notvertex, boolT toporient, coordT *normal, realT *offset); -pointT *qh_facetcenter (setT *vertices); -facetT *qh_findgooddist (pointT *point, facetT *facetA, realT *distp, facetT **facetlist); -void qh_getarea (facetT *facetlist); -boolT qh_gram_schmidt(int dim, realT **rows); -boolT qh_inthresholds (coordT *normal, realT *angle); -void qh_joggleinput (void); -realT *qh_maxabsval (realT *normal, int dim); -setT *qh_maxmin(pointT *points, int numpoints, int dimension); -realT qh_maxouter (void); -void qh_maxsimplex (int dim, setT *maxpoints, pointT *points, int numpoints, setT **simplex); -realT qh_minabsval (realT *normal, int dim); -int qh_mindiff (realT *vecA, realT *vecB, int dim); -boolT qh_orientoutside (facetT *facet); -void qh_outerinner (facetT *facet, realT *outerplane, realT *innerplane); -coordT qh_pointdist(pointT *point1, pointT *point2, int dim); -void qh_printmatrix (FILE *fp, char *string, realT **rows, int numrow, int numcol); -void qh_printpoints (FILE *fp, char *string, setT *points); -void qh_projectinput (void); -void qh_projectpoints (signed char *project, int n, realT *points, - int numpoints, int dim, realT *newpoints, int newdim); -int qh_rand( void); -void qh_srand( int seed); -realT qh_randomfactor (void); -void qh_randommatrix (realT *buffer, int dim, realT **row); -void qh_rotateinput (realT **rows); -void qh_rotatepoints (realT *points, int numpoints, int dim, realT **rows); -void qh_scaleinput (void); -void qh_scalelast (coordT *points, int numpoints, int dim, coordT low, - coordT high, coordT newhigh); -void qh_scalepoints (pointT *points, int numpoints, int dim, - realT *newlows, realT *newhighs); -boolT qh_sethalfspace (int dim, coordT *coords, coordT **nextp, - coordT *normal, coordT *offset, coordT *feasible); -coordT *qh_sethalfspace_all (int dim, int count, coordT *halfspaces, pointT *feasible); -pointT *qh_voronoi_center (int dim, setT *points); - -#endif /* qhDEFgeom */ - - - diff --git a/extern/qhull/include/qhull/io.h b/extern/qhull/include/qhull/io.h deleted file mode 100644 index 351d56b3708..00000000000 --- a/extern/qhull/include/qhull/io.h +++ /dev/null @@ -1,149 +0,0 @@ -/*<html><pre> -<a href="qh-io.htm" - >-------------------------------</a><a name="TOP">-</a> - - io.h - declarations of Input/Output functions - - see README, qhull.h and io.c - - copyright (c) 1993-2002, The Geometry Center -*/ - -#ifndef qhDEFio -#define qhDEFio 1 - -/*============ constants and flags ==================*/ - -/*-<a href="qh-io.htm#TOC" - >--------------------------------</a><a name="qh_MAXfirst">-</a> - - qh_MAXfirst - maximum length of first two lines of stdin -*/ -#define qh_MAXfirst 200 - -/*-<a href="qh-io.htm#TOC" - >--------------------------------</a><a name="qh_MINradius">-</a> - - qh_MINradius - min radius for Gp and Gv, fraction of maxcoord -*/ -#define qh_MINradius 0.02 - -/*-<a href="qh-io.htm#TOC" - >--------------------------------</a><a name="qh_GEOMepsilon">-</a> - - qh_GEOMepsilon - adjust outer planes for 'lines closer' and geomview roundoff. - This prevents bleed through. -*/ -#define qh_GEOMepsilon 2e-3 - -/*-<a href="qh-io.htm#TOC" - >--------------------------------</a><a name="qh_WHITESPACE">-</a> - - qh_WHITESPACE - possible values of white space -*/ -#define qh_WHITESPACE " \n\t\v\r\f" - - -/*-<a href="qh-io.htm#TOC" - >--------------------------------</a><a name="RIDGE">-</a> - - qh_RIDGE - to select which ridges to print in qh_eachvoronoi -*/ -typedef enum -{ - qh_RIDGEall = 0, qh_RIDGEinner, qh_RIDGEouter -} -qh_RIDGE; - -/*-<a href="qh-io.htm#TOC" - >--------------------------------</a><a name="printvridgeT">-</a> - - printvridgeT - prints results of qh_printvdiagram - - see: - <a href="io.c#printvridge">qh_printvridge</a> for an example -*/ -typedef void (*printvridgeT)(FILE *fp, vertexT *vertex, vertexT *vertexA, setT *centers, boolT unbounded); - -/*============== -prototypes in alphabetical order =========*/ - -void dfacet( unsigned id); -void dvertex( unsigned id); -void qh_countfacets (facetT *facetlist, setT *facets, boolT printall, - int *numfacetsp, int *numsimplicialp, int *totneighborsp, - int *numridgesp, int *numcoplanarsp, int *numnumtricoplanarsp); -pointT *qh_detvnorm (vertexT *vertex, vertexT *vertexA, setT *centers, realT *offsetp); -setT *qh_detvridge (vertexT *vertex); -setT *qh_detvridge3 (vertexT *atvertex, vertexT *vertex); -int qh_eachvoronoi (FILE *fp, printvridgeT printvridge, vertexT *atvertex, boolT visitall, qh_RIDGE innerouter, boolT inorder); -int qh_eachvoronoi_all (FILE *fp, printvridgeT printvridge, boolT isupper, qh_RIDGE innerouter, boolT inorder); -void qh_facet2point(facetT *facet, pointT **point0, pointT **point1, realT *mindist); -setT *qh_facetvertices (facetT *facetlist, setT *facets, boolT allfacets); -void qh_geomplanes (facetT *facet, realT *outerplane, realT *innerplane); -void qh_markkeep (facetT *facetlist); -setT *qh_markvoronoi (facetT *facetlist, setT *facets, boolT printall, boolT *islowerp, int *numcentersp); -void qh_order_vertexneighbors(vertexT *vertex); -void qh_printafacet(FILE *fp, int format, facetT *facet, boolT printall); -void qh_printbegin (FILE *fp, int format, facetT *facetlist, setT *facets, boolT printall); -void qh_printcenter (FILE *fp, int format, char *string, facetT *facet); -void qh_printcentrum (FILE *fp, facetT *facet, realT radius); -void qh_printend (FILE *fp, int format, facetT *facetlist, setT *facets, boolT printall); -void qh_printend4geom (FILE *fp, facetT *facet, int *num, boolT printall); -void qh_printextremes (FILE *fp, facetT *facetlist, setT *facets, int printall); -void qh_printextremes_2d (FILE *fp, facetT *facetlist, setT *facets, int printall); -void qh_printextremes_d (FILE *fp, facetT *facetlist, setT *facets, int printall); -void qh_printfacet(FILE *fp, facetT *facet); -void qh_printfacet2math(FILE *fp, facetT *facet, int notfirst); -void qh_printfacet2geom(FILE *fp, facetT *facet, realT color[3]); -void qh_printfacet2geom_points(FILE *fp, pointT *point1, pointT *point2, - facetT *facet, realT offset, realT color[3]); -void qh_printfacet3math (FILE *fp, facetT *facet, int notfirst); -void qh_printfacet3geom_nonsimplicial(FILE *fp, facetT *facet, realT color[3]); -void qh_printfacet3geom_points(FILE *fp, setT *points, facetT *facet, realT offset, realT color[3]); -void qh_printfacet3geom_simplicial(FILE *fp, facetT *facet, realT color[3]); -void qh_printfacet3vertex(FILE *fp, facetT *facet, int format); -void qh_printfacet4geom_nonsimplicial(FILE *fp, facetT *facet, realT color[3]); -void qh_printfacet4geom_simplicial(FILE *fp, facetT *facet, realT color[3]); -void qh_printfacetNvertex_nonsimplicial(FILE *fp, facetT *facet, int id, int format); -void qh_printfacetNvertex_simplicial(FILE *fp, facetT *facet, int format); -void qh_printfacetheader(FILE *fp, facetT *facet); -void qh_printfacetridges(FILE *fp, facetT *facet); -void qh_printfacets(FILE *fp, int format, facetT *facetlist, setT *facets, boolT printall); -void qh_printhelp_degenerate(FILE *fp); -void qh_printhelp_singular(FILE *fp); -void qh_printhyperplaneintersection(FILE *fp, facetT *facet1, facetT *facet2, - setT *vertices, realT color[3]); -void qh_printneighborhood (FILE *fp, int format, facetT *facetA, facetT *facetB, boolT printall); -void qh_printline3geom (FILE *fp, pointT *pointA, pointT *pointB, realT color[3]); -void qh_printpoint(FILE *fp, char *string, pointT *point); -void qh_printpointid(FILE *fp, char *string, int dim, pointT *point, int id); -void qh_printpoint3 (FILE *fp, pointT *point); -void qh_printpoints_out (FILE *fp, facetT *facetlist, setT *facets, int printall); -void qh_printpointvect (FILE *fp, pointT *point, coordT *normal, pointT *center, realT radius, realT color[3]); -void qh_printpointvect2 (FILE *fp, pointT *point, coordT *normal, pointT *center, realT radius); -void qh_printridge(FILE *fp, ridgeT *ridge); -void qh_printspheres(FILE *fp, setT *vertices, realT radius); -void qh_printvdiagram (FILE *fp, int format, facetT *facetlist, setT *facets, boolT printall); -int qh_printvdiagram2 (FILE *fp, printvridgeT printvridge, setT *vertices, qh_RIDGE innerouter, boolT inorder); -void qh_printvertex(FILE *fp, vertexT *vertex); -void qh_printvertexlist (FILE *fp, char* string, facetT *facetlist, - setT *facets, boolT printall); -void qh_printvertices (FILE *fp, char* string, setT *vertices); -void qh_printvneighbors (FILE *fp, facetT* facetlist, setT *facets, boolT printall); -void qh_printvoronoi (FILE *fp, int format, facetT *facetlist, setT *facets, boolT printall); -void qh_printvnorm (FILE *fp, vertexT *vertex, vertexT *vertexA, setT *centers, boolT unbounded); -void qh_printvridge (FILE *fp, vertexT *vertex, vertexT *vertexA, setT *centers, boolT unbounded); -void qh_produce_output(void); -void qh_projectdim3 (pointT *source, pointT *destination); -int qh_readfeasible (int dim, char *remainder); -coordT *qh_readpoints(int *numpoints, int *dimension, boolT *ismalloc); -void qh_setfeasible (int dim); -boolT qh_skipfacet(facetT *facet); - -#endif /* qhDEFio */ diff --git a/extern/qhull/include/qhull/mem.h b/extern/qhull/include/qhull/mem.h deleted file mode 100644 index e9ebd1bb9bc..00000000000 --- a/extern/qhull/include/qhull/mem.h +++ /dev/null @@ -1,174 +0,0 @@ -/*<html><pre> -<a href="qh-mem.htm" - >-------------------------------</a><a name="TOP">-</a> - - mem.h - prototypes for memory management functions - - see qh-mem.htm, mem.c and qset.h - - for error handling, writes message and calls - qh_errexit (qhmem_ERRmem, NULL, NULL) if insufficient memory - and - qh_errexit (qhmem_ERRqhull, NULL, NULL) otherwise - - copyright (c) 1993-2002, The Geometry Center -*/ - -#ifndef qhDEFmem -#define qhDEFmem - -/*-<a href="qh-mem.htm#TOC" - >-------------------------------</a><a name="NOmem">-</a> - - qh_NOmem - turn off quick-fit memory allocation - - notes: - mem.c implements Quickfit memory allocation for about 20% time - savings. If it fails on your machine, try to locate the - problem, and send the answer to qhull@geom.umn.edu. If this can - not be done, define qh_NOmem to use malloc/free instead. - - #define qh_NOmem -*/ - -/*------------------------------------------- - to avoid bus errors, memory allocation must consider alignment requirements. - malloc() automatically takes care of alignment. Since mem.c manages - its own memory, we need to explicitly specify alignment in - qh_meminitbuffers(). - - A safe choice is sizeof(double). sizeof(float) may be used if doubles - do not occur in data structures and pointers are the same size. Be careful - of machines (e.g., DEC Alpha) with large pointers. If gcc is available, - use __alignof__(double) or fmax_(__alignof__(float), __alignof__(void *)). - - see <a href="user.h#MEMalign">qh_MEMalign</a> in user.h for qhull's alignment -*/ - -#define qhmem_ERRmem 4 /* matches qh_ERRmem in qhull.h */ -#define qhmem_ERRqhull 5 /* matches qh_ERRqhull in qhull.h */ - -/*-<a href="qh-mem.htm#TOC" - >--------------------------------</a><a name="ptr_intT">-</a> - - ptr_intT - for casting a void* to an integer-type - - notes: - On 64-bit machines, a pointer may be larger than an 'int'. - qh_meminit() checks that 'long' holds a 'void*' -*/ -typedef unsigned long ptr_intT; - -/*-<a href="qh-mem.htm#TOC" - >--------------------------------</a><a name="qhmemT">-</a> - - qhmemT - global memory structure for mem.c - - notes: - users should ignore qhmem except for writing extensions - qhmem is allocated in mem.c - - qhmem could be swapable like qh and qhstat, but then - multiple qh's and qhmem's would need to keep in synch. - A swapable qhmem would also waste memory buffers. As long - as memory operations are atomic, there is no problem with - multiple qh structures being active at the same time. - If you need separate address spaces, you can swap the - contents of qhmem. -*/ -typedef struct qhmemT qhmemT; -extern qhmemT qhmem; - -struct qhmemT { /* global memory management variables */ - int BUFsize; /* size of memory allocation buffer */ - int BUFinit; /* initial size of memory allocation buffer */ - int TABLEsize; /* actual number of sizes in free list table */ - int NUMsizes; /* maximum number of sizes in free list table */ - int LASTsize; /* last size in free list table */ - int ALIGNmask; /* worst-case alignment, must be 2^n-1 */ - void **freelists; /* free list table, linked by offset 0 */ - int *sizetable; /* size of each freelist */ - int *indextable; /* size->index table */ - void *curbuffer; /* current buffer, linked by offset 0 */ - void *freemem; /* free memory in curbuffer */ - int freesize; /* size of free memory in bytes */ - void *tempstack; /* stack of temporary memory, managed by users */ - FILE *ferr; /* file for reporting errors */ - int IStracing; /* =5 if tracing memory allocations */ - int cntquick; /* count of quick allocations */ - /* remove statistics doesn't effect speed */ - int cntshort; /* count of short allocations */ - int cntlong; /* count of long allocations */ - int curlong; /* current count of inuse, long allocations */ - int freeshort; /* count of short memfrees */ - int freelong; /* count of long memfrees */ - int totshort; /* total size of short allocations */ - int totlong; /* total size of long allocations */ - int maxlong; /* maximum totlong */ - int cntlarger; /* count of setlarger's */ - int totlarger; /* total copied by setlarger */ -}; - - -/*==================== -macros ====================*/ - -/*-<a href="qh-mem.htm#TOC" - >--------------------------------</a><a name="memalloc_">-</a> - - qh_memalloc_(size, object, type) - returns object of size bytes - assumes size<=qhmem.LASTsize and void **freelistp is a temp -*/ - -#ifdef qh_NOmem -#define qh_memalloc_(size, freelistp, object, type) {\ - object= (type*)qh_memalloc (size); } -#else /* !qh_NOmem */ - -#define qh_memalloc_(size, freelistp, object, type) {\ - freelistp= qhmem.freelists + qhmem.indextable[size];\ - if ((object= (type*)*freelistp)) {\ - qhmem.cntquick++; \ - *freelistp= *((void **)*freelistp);\ - }else object= (type*)qh_memalloc (size);} -#endif - -/*-<a href="qh-mem.htm#TOC" - >--------------------------------</a><a name="memfree_">-</a> - - qh_memfree_(object, size) - free up an object - - notes: - object may be NULL - assumes size<=qhmem.LASTsize and void **freelistp is a temp -*/ -#ifdef qh_NOmem -#define qh_memfree_(object, size, freelistp) {\ - qh_memfree (object, size); } -#else /* !qh_NOmem */ - -#define qh_memfree_(object, size, freelistp) {\ - if (object) { \ - qhmem .freeshort++;\ - freelistp= qhmem.freelists + qhmem.indextable[size];\ - *((void **)object)= *freelistp;\ - *freelistp= object;}} -#endif - -/*=============== prototypes in alphabetical order ============*/ - -void *qh_memalloc(int insize); -void qh_memfree (void *object, int size); -void qh_memfreeshort (int *curlong, int *totlong); -void qh_meminit (FILE *ferr); -void qh_meminitbuffers (int tracelevel, int alignment, int numsizes, - int bufsize, int bufinit); -void qh_memsetup (void); -void qh_memsize(int size); -void qh_memstatistics (FILE *fp); - -#endif /* qhDEFmem */ diff --git a/extern/qhull/include/qhull/merge.h b/extern/qhull/include/qhull/merge.h deleted file mode 100644 index 7fc2afa5967..00000000000 --- a/extern/qhull/include/qhull/merge.h +++ /dev/null @@ -1,171 +0,0 @@ -/*<html><pre> -<a href="qh-merge.htm" - >-------------------------------</a><a name="TOP">-</a> - - merge.h - header file for merge.c - - see qh-merge.htm and merge.c - - copyright (c) 1993-2002, The Geometry Center -*/ - -#ifndef qhDEFmerge -#define qhDEFmerge 1 - - -/*============ -constants- ==============*/ - -/*-<a href="qh-merge.htm#TOC" - >--------------------------------</a><a name="qh_ANGLEredundant">-</a> - - qh_ANGLEredundant - indicates redundant merge in mergeT->angle -*/ -#define qh_ANGLEredundant 6.0 - -/*-<a href="qh-merge.htm#TOC" - >--------------------------------</a><a name="qh_ANGLEdegen">-</a> - - qh_ANGLEdegen - indicates degenerate facet in mergeT->angle -*/ -#define qh_ANGLEdegen 5.0 - -/*-<a href="qh-merge.htm#TOC" - >--------------------------------</a><a name="qh_ANGLEconcave">-</a> - - qh_ANGLEconcave - offset to indicate concave facets in mergeT->angle - - notes: - concave facets are assigned the range of [2,4] in mergeT->angle - roundoff error may make the angle less than 2 -*/ -#define qh_ANGLEconcave 1.5 - -/*-<a href="qh-merge.htm#TOC" - >--------------------------------</a><a name="MRG">-</a> - - MRG... (mergeType) - indicates the type of a merge (mergeT->type) -*/ -typedef enum { /* in sort order for facet_mergeset */ - MRGnone= 0, - MRGcoplanar, /* centrum coplanar */ - MRGanglecoplanar, /* angle coplanar */ - /* could detect half concave ridges */ - MRGconcave, /* concave ridge */ - MRGflip, /* flipped facet. facet1 == facet2 */ - MRGridge, /* duplicate ridge (qh_MERGEridge) */ - /* degen and redundant go onto degen_mergeset */ - MRGdegen, /* degenerate facet (not enough neighbors) facet1 == facet2 */ - MRGredundant, /* redundant facet (vertex subset) */ - /* merge_degenredundant assumes degen < redundant */ - MRGmirror, /* mirror facet from qh_triangulate */ - ENDmrg -} mergeType; - -/*-<a href="qh-merge.htm#TOC" - >--------------------------------</a><a name="qh_MERGEapex">-</a> - - qh_MERGEapex - flag for qh_mergefacet() to indicate an apex merge -*/ -#define qh_MERGEapex True - -/*============ -structures- ====================*/ - -/*-<a href="qh-merge.htm#TOC" - >--------------------------------</a><a name="mergeT">-</a> - - mergeT - structure used to merge facets -*/ - -typedef struct mergeT mergeT; -struct mergeT { /* initialize in qh_appendmergeset */ - realT angle; /* angle between normals of facet1 and facet2 */ - facetT *facet1; /* will merge facet1 into facet2 */ - facetT *facet2; - mergeType type; -}; - - -/*=========== -macros- =========================*/ - -/*-<a href="qh-merge.htm#TOC" - >--------------------------------</a><a name="FOREACHmerge_">-</a> - - FOREACHmerge_( merges ) {...} - assign 'merge' to each merge in merges - - notes: - uses 'mergeT *merge, **mergep;' - if qh_mergefacet(), - restart since qh.facet_mergeset may change - see <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a> -*/ -#define FOREACHmerge_( merges ) FOREACHsetelement_(mergeT, merges, merge) - -/*============ prototypes in alphabetical order after pre/postmerge =======*/ - -void qh_premerge (vertexT *apex, realT maxcentrum, realT maxangle); -void qh_postmerge (char *reason, realT maxcentrum, realT maxangle, - boolT vneighbors); -void qh_all_merges (boolT othermerge, boolT vneighbors); -void qh_appendmergeset(facetT *facet, facetT *neighbor, mergeType mergetype, realT *angle); -setT *qh_basevertices( facetT *samecycle); -void qh_checkconnect (void /* qh new_facets */); -boolT qh_checkzero (boolT testall); -void qh_copynonconvex (ridgeT *atridge); -void qh_degen_redundant_facet (facetT *facet); -void qh_degen_redundant_neighbors (facetT *facet, facetT *delfacet); -vertexT *qh_find_newvertex (vertexT *oldvertex, setT *vertices, setT *ridges); -void qh_findbest_test (boolT testcentrum, facetT *facet, facetT *neighbor, - facetT **bestfacet, realT *distp, realT *mindistp, realT *maxdistp); -facetT *qh_findbestneighbor(facetT *facet, realT *distp, realT *mindistp, realT *maxdistp); -void qh_flippedmerges(facetT *facetlist, boolT *wasmerge); -void qh_forcedmerges( boolT *wasmerge); -void qh_getmergeset(facetT *facetlist); -void qh_getmergeset_initial (facetT *facetlist); -void qh_hashridge (setT *hashtable, int hashsize, ridgeT *ridge, vertexT *oldvertex); -ridgeT *qh_hashridge_find (setT *hashtable, int hashsize, ridgeT *ridge, - vertexT *vertex, vertexT *oldvertex, int *hashslot); -void qh_makeridges(facetT *facet); -void qh_mark_dupridges(facetT *facetlist); -void qh_maydropneighbor (facetT *facet); -int qh_merge_degenredundant (void); -void qh_merge_nonconvex( facetT *facet1, facetT *facet2, mergeType mergetype); -void qh_mergecycle (facetT *samecycle, facetT *newfacet); -void qh_mergecycle_all (facetT *facetlist, boolT *wasmerge); -void qh_mergecycle_facets( facetT *samecycle, facetT *newfacet); -void qh_mergecycle_neighbors(facetT *samecycle, facetT *newfacet); -void qh_mergecycle_ridges(facetT *samecycle, facetT *newfacet); -void qh_mergecycle_vneighbors( facetT *samecycle, facetT *newfacet); -void qh_mergefacet(facetT *facet1, facetT *facet2, realT *mindist, realT *maxdist, boolT mergeapex); -void qh_mergefacet2d (facetT *facet1, facetT *facet2); -void qh_mergeneighbors(facetT *facet1, facetT *facet2); -void qh_mergeridges(facetT *facet1, facetT *facet2); -void qh_mergesimplex(facetT *facet1, facetT *facet2, boolT mergeapex); -void qh_mergevertex_del (vertexT *vertex, facetT *facet1, facetT *facet2); -void qh_mergevertex_neighbors(facetT *facet1, facetT *facet2); -void qh_mergevertices(setT *vertices1, setT **vertices); -setT *qh_neighbor_intersections (vertexT *vertex); -void qh_newvertices (setT *vertices); -boolT qh_reducevertices (void); -vertexT *qh_redundant_vertex (vertexT *vertex); -boolT qh_remove_extravertices (facetT *facet); -vertexT *qh_rename_sharedvertex (vertexT *vertex, facetT *facet); -void qh_renameridgevertex(ridgeT *ridge, vertexT *oldvertex, vertexT *newvertex); -void qh_renamevertex(vertexT *oldvertex, vertexT *newvertex, setT *ridges, - facetT *oldfacet, facetT *neighborA); -boolT qh_test_appendmerge (facetT *facet, facetT *neighbor); -boolT qh_test_vneighbors (void /* qh newfacet_list */); -void qh_tracemerge (facetT *facet1, facetT *facet2); -void qh_tracemerging (void); -void qh_updatetested( facetT *facet1, facetT *facet2); -setT *qh_vertexridges (vertexT *vertex); -void qh_vertexridges_facet (vertexT *vertex, facetT *facet, setT **ridges); -void qh_willdelete (facetT *facet, facetT *replace); - -#endif /* qhDEFmerge */ diff --git a/extern/qhull/include/qhull/poly.h b/extern/qhull/include/qhull/poly.h deleted file mode 100644 index 294ec9527fc..00000000000 --- a/extern/qhull/include/qhull/poly.h +++ /dev/null @@ -1,290 +0,0 @@ -/*<html><pre> -<a href="qh-poly.htm" - >-------------------------------</a><a name="TOP">-</a> - - poly.h - header file for poly.c and poly2.c - - see qh-poly.htm, qhull.h and poly.c - - copyright (c) 1993-2002, The Geometry Center -*/ - -#ifndef qhDEFpoly -#define qhDEFpoly 1 - -/*=============== constants ========================== */ - -/*-<a href="qh-geom.htm#TOC" - >--------------------------------</a><a name="ALGORITHMfault">-</a> - - ALGORITHMfault - use as argument to checkconvex() to report errors during buildhull -*/ -#define qh_ALGORITHMfault 0 - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="DATAfault">-</a> - - DATAfault - use as argument to checkconvex() to report errors during initialhull -*/ -#define qh_DATAfault 1 - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="DUPLICATEridge">-</a> - - DUPLICATEridge - special value for facet->neighbor to indicate a duplicate ridge - - notes: - set by matchneighbor, used by matchmatch and mark_dupridge -*/ -#define qh_DUPLICATEridge ( facetT * ) 1L - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="MERGEridge">-</a> - - MERGEridge flag in facet - special value for facet->neighbor to indicate a merged ridge - - notes: - set by matchneighbor, used by matchmatch and mark_dupridge -*/ -#define qh_MERGEridge ( facetT * ) 2L - - -/*============ -structures- ====================*/ - -/*=========== -macros- =========================*/ - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FORALLfacet_">-</a> - - FORALLfacet_( facetlist ) { ... } - assign 'facet' to each facet in facetlist - - notes: - uses 'facetT *facet;' - assumes last facet is a sentinel - - see: - FORALLfacets -*/ -#define FORALLfacet_( facetlist ) if ( facetlist ) for( facet=( facetlist );facet && facet->next;facet=facet->next ) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FORALLnew_facets">-</a> - - FORALLnew_facets { ... } - assign 'newfacet' to each facet in qh.newfacet_list - - notes: - uses 'facetT *newfacet;' - at exit, newfacet==NULL -*/ -#define FORALLnew_facets for( newfacet=qh newfacet_list;newfacet && newfacet->next;newfacet=newfacet->next ) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FORALLvertex_">-</a> - - FORALLvertex_( vertexlist ) { ... } - assign 'vertex' to each vertex in vertexlist - - notes: - uses 'vertexT *vertex;' - at exit, vertex==NULL -*/ -#define FORALLvertex_( vertexlist ) for ( vertex=( vertexlist );vertex && vertex->next;vertex= vertex->next ) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FORALLvisible_facets">-</a> - - FORALLvisible_facets { ... } - assign 'visible' to each visible facet in qh.visible_list - - notes: - uses 'vacetT *visible;' - at exit, visible==NULL -*/ -#define FORALLvisible_facets for (visible=qh visible_list; visible && visible->visible; visible= visible->next) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FORALLsame_">-</a> - - FORALLsame_( newfacet ) { ... } - assign 'same' to each facet in newfacet->f.samecycle - - notes: - uses 'facetT *same;' - stops when it returns to newfacet -*/ -#define FORALLsame_(newfacet) for (same= newfacet->f.samecycle; same != newfacet; same= same->f.samecycle) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FORALLsame_cycle_">-</a> - - FORALLsame_cycle_( newfacet ) { ... } - assign 'same' to each facet in newfacet->f.samecycle - - notes: - uses 'facetT *same;' - at exit, same == NULL -*/ -#define FORALLsame_cycle_(newfacet) \ - for (same= newfacet->f.samecycle; \ - same; same= (same == newfacet ? NULL : same->f.samecycle)) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHneighborA_">-</a> - - FOREACHneighborA_( facet ) { ... } - assign 'neighborA' to each neighbor in facet->neighbors - - FOREACHneighborA_( vertex ) { ... } - assign 'neighborA' to each neighbor in vertex->neighbors - - declare: - facetT *neighborA, **neighborAp; - - see: - <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a> -*/ -#define FOREACHneighborA_(facet) FOREACHsetelement_(facetT, facet->neighbors, neighborA) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHvisible_">-</a> - - FOREACHvisible_( facets ) { ... } - assign 'visible' to each facet in facets - - notes: - uses 'facetT *facet, *facetp;' - see <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a> -*/ -#define FOREACHvisible_(facets) FOREACHsetelement_(facetT, facets, visible) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHnewfacet_">-</a> - - FOREACHnewfacet_( facets ) { ... } - assign 'newfacet' to each facet in facets - - notes: - uses 'facetT *newfacet, *newfacetp;' - see <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a> -*/ -#define FOREACHnewfacet_(facets) FOREACHsetelement_(facetT, facets, newfacet) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHvertexA_">-</a> - - FOREACHvertexA_( vertices ) { ... } - assign 'vertexA' to each vertex in vertices - - notes: - uses 'vertexT *vertexA, *vertexAp;' - see <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a> -*/ -#define FOREACHvertexA_(vertices) FOREACHsetelement_(vertexT, vertices, vertexA) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHvertexreverse12_">-</a> - - FOREACHvertexreverse12_( vertices ) { ... } - assign 'vertex' to each vertex in vertices - reverse order of first two vertices - - notes: - uses 'vertexT *vertex, *vertexp;' - see <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a> -*/ -#define FOREACHvertexreverse12_(vertices) FOREACHsetelementreverse12_(vertexT, vertices, vertex) - - -/*=============== prototypes poly.c in alphabetical order ================*/ - -void qh_appendfacet(facetT *facet); -void qh_appendvertex(vertexT *vertex); -void qh_attachnewfacets (void); -boolT qh_checkflipped (facetT *facet, realT *dist, boolT allerror); -void qh_delfacet(facetT *facet); -void qh_deletevisible(void /*qh visible_list, qh horizon_list*/); -setT *qh_facetintersect (facetT *facetA, facetT *facetB, int *skipAp,int *skipBp, int extra); -unsigned qh_gethash (int hashsize, setT *set, int size, int firstindex, void *skipelem); -facetT *qh_makenewfacet(setT *vertices, boolT toporient, facetT *facet); -void qh_makenewplanes ( void /* newfacet_list */); -facetT *qh_makenew_nonsimplicial (facetT *visible, vertexT *apex, int *numnew); -facetT *qh_makenew_simplicial (facetT *visible, vertexT *apex, int *numnew); -void qh_matchneighbor (facetT *newfacet, int newskip, int hashsize, - int *hashcount); -void qh_matchnewfacets (void); -boolT qh_matchvertices (int firstindex, setT *verticesA, int skipA, - setT *verticesB, int *skipB, boolT *same); -facetT *qh_newfacet(void); -ridgeT *qh_newridge(void); -int qh_pointid (pointT *point); -void qh_removefacet(facetT *facet); -void qh_removevertex(vertexT *vertex); -void qh_updatevertices (void); - - -/*========== -prototypes poly2.c in alphabetical order ===========*/ - -void qh_addhash (void* newelem, setT *hashtable, int hashsize, unsigned hash); -void qh_check_bestdist (void); -void qh_check_maxout (void); -void qh_check_output (void); -void qh_check_point (pointT *point, facetT *facet, realT *maxoutside, realT *maxdist, facetT **errfacet1, facetT **errfacet2); -void qh_check_points(void); -void qh_checkconvex(facetT *facetlist, int fault); -void qh_checkfacet(facetT *facet, boolT newmerge, boolT *waserrorp); -void qh_checkflipped_all (facetT *facetlist); -void qh_checkpolygon(facetT *facetlist); -void qh_checkvertex (vertexT *vertex); -void qh_clearcenters (qh_CENTER type); -void qh_createsimplex(setT *vertices); -void qh_delridge(ridgeT *ridge); -void qh_delvertex (vertexT *vertex); -setT *qh_facet3vertex (facetT *facet); -facetT *qh_findbestfacet (pointT *point, boolT bestoutside, - realT *bestdist, boolT *isoutside); -facetT *qh_findfacet_all (pointT *point, realT *bestdist, boolT *isoutside, - int *numpart); -int qh_findgood (facetT *facetlist, int goodhorizon); -void qh_findgood_all (facetT *facetlist); -void qh_furthestnext (void /* qh facet_list */); -void qh_furthestout (facetT *facet); -void qh_infiniteloop (facetT *facet); -void qh_initbuild(void); -void qh_initialhull(setT *vertices); -setT *qh_initialvertices(int dim, setT *maxpoints, pointT *points, int numpoints); -vertexT *qh_isvertex (pointT *point, setT *vertices); -vertexT *qh_makenewfacets (pointT *point /*horizon_list, visible_list*/); -void qh_matchduplicates (facetT *atfacet, int atskip, int hashsize, int *hashcount); -void qh_nearcoplanar ( void /* qh.facet_list */); -vertexT *qh_nearvertex (facetT *facet, pointT *point, realT *bestdistp); -int qh_newhashtable(int newsize); -vertexT *qh_newvertex(pointT *point); -ridgeT *qh_nextridge3d (ridgeT *atridge, facetT *facet, vertexT **vertexp); -void qh_outcoplanar (void /* facet_list */); -pointT *qh_point (int id); -void qh_point_add (setT *set, pointT *point, void *elem); -setT *qh_pointfacet (void /*qh facet_list*/); -setT *qh_pointvertex (void /*qh facet_list*/); -void qh_prependfacet(facetT *facet, facetT **facetlist); -void qh_printhashtable(FILE *fp); -void qh_printlists (void); -void qh_resetlists (boolT stats, boolT resetVisible /*qh newvertex_list newfacet_list visible_list*/); -void qh_setvoronoi_all (void); -void qh_triangulate (void /*qh facet_list*/); -void qh_triangulate_facet (facetT *facetA, vertexT **first_vertex); -void qh_triangulate_link (facetT *oldfacetA, facetT *facetA, facetT *oldfacetB, facetT *facetB); -void qh_triangulate_mirror (facetT *facetA, facetT *facetB); -void qh_triangulate_null (facetT *facetA); -void qh_vertexintersect(setT **vertexsetA,setT *vertexsetB); -setT *qh_vertexintersect_new(setT *vertexsetA,setT *vertexsetB); -void qh_vertexneighbors (void /*qh facet_list*/); -boolT qh_vertexsubset(setT *vertexsetA, setT *vertexsetB); - - -#endif /* qhDEFpoly */ diff --git a/extern/qhull/include/qhull/qhull.h b/extern/qhull/include/qhull/qhull.h deleted file mode 100644 index 896ec1e9c18..00000000000 --- a/extern/qhull/include/qhull/qhull.h +++ /dev/null @@ -1,1048 +0,0 @@ -/*<html><pre> -<a href="qh-qhull.htm" - >-------------------------------</a><a name="TOP">-</a> - - qhull.h - user-level header file for using qhull.a library - - see qh-qhull.htm, qhull_a.h - - copyright (c) 1993-2002, The Geometry Center - - NOTE: access to qh_qh is via the 'qh' macro. This allows - qh_qh to be either a pointer or a structure. An example - of using qh is "qh DROPdim" which accesses the DROPdim - field of qh_qh. Similarly, access to qh_qhstat is via - the 'qhstat' macro. - - includes function prototypes for qhull.c, geom.c, global.c, io.c, user.c - - use mem.h for mem.c - use qset.h for qset.c - - see unix.c for an example of using qhull.h - - recompile qhull if you change this file -*/ - -#ifndef qhDEFqhull -#define qhDEFqhull 1 - -/*=========================== -included files ==============*/ - -#include <setjmp.h> -#include <float.h> -#include <time.h> - -#if __MWERKS__ && __POWERPC__ -#include <SIOUX.h> -#include <Files.h> -#include <Desk.h> -#endif - -#ifndef __STDC__ -#ifndef __cplusplus -#if !_MSC_VER -#error Neither __STDC__ nor __cplusplus is defined. Please use strict ANSI C or C++ to compile -#error Qhull. You may need to turn off compiler extensions in your project configuration. If -#error your compiler is a standard C compiler, you can delete this warning from qhull.h -#endif -#endif -#endif - -#include "user.h" /* user defineable constants */ - -/*============ constants and basic types ====================*/ - -/*-<a href="qh-qhull.htm#TOC" - >--------------------------------</a><a name="qh_VERSION">-</a> - - qh_VERSION - version string by year and date - - the revision increases on code changes only - - notes: - change date: Changes.txt, Announce.txt, README.txt, qhull.man - qhull-news.html, Eudora signatures, - change version: README.txt, qhull.html, file_id.diz, Makefile - change year: Copying.txt - check download size - recompile user_eg.c, rbox.c, qhull.c, qconvex.c, qdelaun.c qvoronoi.c, qhalf.c - make copy of qhull-news.html as qh-news.htm -*/ - -#define qh_VERSION "2002.1 2002/8/20" - -/*-<a href="qh-geom.htm#TOC" - >--------------------------------</a><a name="coordT">-</a> - - coordT - coordinates and coefficients are stored as realT (i.e., double) - - notes: - could use 'float' for data and 'double' for calculations (realT vs. coordT) - This requires many type casts, and adjusted error bounds. - Also C compilers may do expressions in double anyway. -*/ -#define coordT realT - -/*-<a href="qh-geom.htm#TOC" - >--------------------------------</a><a name="pointT">-</a> - - pointT - a point is an array of DIM3 coordinates -*/ -#define pointT coordT - -/*-<a href="qh-qhull.htm#TOC" - >--------------------------------</a><a name="flagT">-</a> - - flagT - Boolean flag as a bit -*/ -#define flagT unsigned int - -/*-<a href="qh-qhull.htm#TOC" - >--------------------------------</a><a name="boolT">-</a> - - boolT - boolean value, either True or False - - notes: - needed for portability -*/ -#define boolT unsigned int -#ifdef False -#undef False -#endif -#ifdef True -#undef True -#endif -#define False 0 -#define True 1 - -/*-<a href="qh-qhull.htm#TOC" - >--------------------------------</a><a name="CENTERtype">-</a> - - qh_CENTER - to distinguish facet->center -*/ -typedef enum -{ - qh_ASnone = 0, qh_ASvoronoi, qh_AScentrum -} -qh_CENTER; - -/*-<a href="qh-qhull.htm#TOC" - >--------------------------------</a><a name="qh_PRINT">-</a> - - qh_PRINT - output formats for printing (qh.PRINTout). - 'Fa' 'FV' 'Fc' 'FC' - - - notes: - some of these names are similar to qh names. The similar names are only - used in switch statements in qh_printbegin() etc. -*/ -typedef enum {qh_PRINTnone= 0, - qh_PRINTarea, qh_PRINTaverage, /* 'Fa' 'FV' 'Fc' 'FC' */ - qh_PRINTcoplanars, qh_PRINTcentrums, - qh_PRINTfacets, qh_PRINTfacets_xridge, /* 'f' 'FF' 'G' 'FI' 'Fi' 'Fn' */ - qh_PRINTgeom, qh_PRINTids, qh_PRINTinner, qh_PRINTneighbors, - qh_PRINTnormals, qh_PRINTouter, /* 'n' 'Fo' 'i' 'm' 'Fm' 'o' */ - qh_PRINTincidences, qh_PRINTmathematica, qh_PRINTmerges, qh_PRINToff, - qh_PRINToptions, qh_PRINTpointintersect, /* 'FO' 'Fp' 'FP' 'p' 'FQ' 'FS' */ - qh_PRINTpointnearest, qh_PRINTpoints, qh_PRINTqhull, qh_PRINTsize, - qh_PRINTsummary, qh_PRINTtriangles, /* 'Fs' 'Ft' 'Fv' 'FN' 'Fx' */ - qh_PRINTvertices, qh_PRINTvneighbors, qh_PRINTextremes, - qh_PRINTEND} qh_PRINT; - -/*-<a href="qh-qhull.htm#TOC" - >--------------------------------</a><a name="qh_ALL">-</a> - - qh_ALL - argument flag for selecting everything -*/ -#define qh_ALL True -#define qh_NOupper True /* argument for qh_findbest */ -#define qh_IScheckmax True /* argument for qh_findbesthorizon */ -#define qh_ISnewfacets True /* argument for qh_findbest */ -#define qh_RESETvisible True /* argument for qh_resetlists */ - -/*-<a href="qh-qhull.htm#TOC" - >--------------------------------</a><a name="qh_ERR">-</a> - - qh_ERR - Qhull exit codes, for indicating errors -*/ -#define qh_ERRnone 0 /* no error occurred during qhull */ -#define qh_ERRinput 1 /* input inconsistency */ -#define qh_ERRsingular 2 /* singular input data */ -#define qh_ERRprec 3 /* precision error */ -#define qh_ERRmem 4 /* insufficient memory, matches mem.h */ -#define qh_ERRqhull 5 /* internal error detected, matches mem.h */ - -/* ============ -structures- ==================== - each of the following structures is defined by a typedef - all realT and coordT fields occur at the beginning of a structure - (otherwise space may be wasted due to alignment) - define all flags together and pack into 32-bit number -*/ - -typedef struct vertexT vertexT; -typedef struct ridgeT ridgeT; -typedef struct facetT facetT; -#ifndef DEFsetT -#define DEFsetT 1 -typedef struct setT setT; /* defined in qset.h */ -#endif - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="facetT">-</a> - - facetT - defines a facet - - notes: - qhull() generates the hull as a list of facets. - - topological information: - f.previous,next doubly-linked list of facets - f.vertices set of vertices - f.ridges set of ridges - f.neighbors set of neighbors - f.toporient True if facet has top-orientation (else bottom) - - geometric information: - f.offset,normal hyperplane equation - f.maxoutside offset to outer plane -- all points inside - f.center centrum for testing convexity - f.simplicial True if facet is simplicial - f.flipped True if facet does not include qh.interior_point - - for constructing hull: - f.visible True if facet on list of visible facets (will be deleted) - f.newfacet True if facet on list of newly created facets - f.coplanarset set of points coplanar with this facet - (includes near-inside points for later testing) - f.outsideset set of points outside of this facet - f.furthestdist distance to furthest point of outside set - f.visitid marks visited facets during a loop - f.replace replacement facet for to-be-deleted, visible facets - f.samecycle,newcycle cycle of facets for merging into horizon facet - - see below for other flags and fields -*/ -struct facetT { -#if !qh_COMPUTEfurthest - coordT furthestdist;/* distance to furthest point of outsideset */ -#endif -#if qh_MAXoutside - coordT maxoutside; /* max computed distance of point to facet - Before QHULLfinished this is an approximation - since maxdist not always set for mergefacet - Actual outer plane is +DISTround and - computed outer plane is +2*DISTround */ -#endif - coordT offset; /* exact offset of hyperplane from origin */ - coordT *normal; /* normal of hyperplane, hull_dim coefficients */ - /* if tricoplanar, shared with a neighbor */ - union { /* in order of testing */ - realT area; /* area of facet, only in io.c if ->isarea */ - facetT *replace; /* replacement facet if ->visible and NEWfacets - is NULL only if qh_mergedegen_redundant or interior */ - facetT *samecycle; /* cycle of facets from the same visible/horizon intersection, - if ->newfacet */ - facetT *newcycle; /* in horizon facet, current samecycle of new facets */ - facetT *trivisible; /* visible facet for ->tricoplanar facets during qh_triangulate() */ - facetT *triowner; /* owner facet for ->tricoplanar, !isarea facets w/ ->keepcentrum */ - }f; - coordT *center; /* centrum for convexity, qh CENTERtype == qh_AScentrum */ - /* Voronoi center, qh CENTERtype == qh_ASvoronoi */ - /* if tricoplanar, shared with a neighbor */ - facetT *previous; /* previous facet in the facet_list */ - facetT *next; /* next facet in the facet_list */ - setT *vertices; /* vertices for this facet, inverse sorted by ID - if simplicial, 1st vertex was apex/furthest */ - setT *ridges; /* explicit ridges for nonsimplicial facets. - for simplicial facets, neighbors defines ridge */ - setT *neighbors; /* neighbors of the facet. If simplicial, the kth - neighbor is opposite the kth vertex, and the first - neighbor is the horizon facet for the first vertex*/ - setT *outsideset; /* set of points outside this facet - if non-empty, last point is furthest - if NARROWhull, includes coplanars for partitioning*/ - setT *coplanarset; /* set of points coplanar with this facet - > qh.min_vertex and <= facet->max_outside - a point is assigned to the furthest facet - if non-empty, last point is furthest away */ - unsigned visitid; /* visit_id, for visiting all neighbors, - all uses are independent */ - unsigned id; /* unique identifier from qh facet_id */ - unsigned nummerge:9; /* number of merges */ -#define qh_MAXnummerge 511 /* 2^9-1, 32 flags total, see "flags:" in io.c */ - flagT tricoplanar:1; /* True if TRIangulate and simplicial and coplanar with a neighbor */ - /* all tricoplanars share the same ->center, ->normal, ->offset, ->maxoutside */ - /* all tricoplanars share the same apex */ - /* if ->degenerate, does not span facet (one logical ridge) */ - /* one tricoplanar has ->keepcentrum and ->coplanarset */ - /* during qh_triangulate, f.trivisible points to original facet */ - flagT newfacet:1; /* True if facet on qh newfacet_list (new or merged) */ - flagT visible:1; /* True if visible facet (will be deleted) */ - flagT toporient:1; /* True if created with top orientation - after merging, use ridge orientation */ - flagT simplicial:1;/* True if simplicial facet, ->ridges may be implicit */ - flagT seen:1; /* used to perform operations only once, like visitid */ - flagT seen2:1; /* used to perform operations only once, like visitid */ - flagT flipped:1; /* True if facet is flipped */ - flagT upperdelaunay:1; /* True if facet is upper envelope of Delaunay triangulation */ - flagT notfurthest:1; /* True if last point of outsideset is not furthest*/ - -/*-------- flags primarily for output ---------*/ - flagT good:1; /* True if a facet marked good for output */ - flagT isarea:1; /* True if facet->f.area is defined */ - -/*-------- flags for merging ------------------*/ - flagT dupridge:1; /* True if duplicate ridge in facet */ - flagT mergeridge:1; /* True if facet or neighbor contains a qh_MERGEridge - ->normal defined (also defined for mergeridge2) */ - flagT mergeridge2:1; /* True if neighbor contains a qh_MERGEridge (mark_dupridges */ - flagT coplanar:1; /* True if horizon facet is coplanar at last use */ - flagT mergehorizon:1; /* True if will merge into horizon (->coplanar) */ - flagT cycledone:1;/* True if mergecycle_all already done */ - flagT tested:1; /* True if facet convexity has been tested (false after merge */ - flagT keepcentrum:1; /* True if keep old centrum after a merge, or marks owner for ->tricoplanar */ - flagT newmerge:1; /* True if facet is newly merged for reducevertices */ - flagT degenerate:1; /* True if facet is degenerate (degen_mergeset or ->tricoplanar) */ - flagT redundant:1; /* True if facet is redundant (degen_mergeset) */ -}; - - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="ridgeT">-</a> - - ridgeT - defines a ridge - - notes: - a ridge is DIM3-1 simplex between two neighboring facets. If the - facets are non-simplicial, there may be more than one ridge between - two facets. E.G. a 4-d hypercube has two triangles between each pair - of neighboring facets. - - topological information: - vertices a set of vertices - top,bottom neighboring facets with orientation - - geometric information: - tested True if ridge is clearly convex - nonconvex True if ridge is non-convex -*/ -struct ridgeT { - setT *vertices; /* vertices belonging to this ridge, inverse sorted by ID - NULL if a degen ridge (matchsame) */ - facetT *top; /* top facet this ridge is part of */ - facetT *bottom; /* bottom facet this ridge is part of */ - unsigned id:24; /* unique identifier, =>room for 8 flags */ - flagT seen:1; /* used to perform operations only once */ - flagT tested:1; /* True when ridge is tested for convexity */ - flagT nonconvex:1; /* True if getmergeset detected a non-convex neighbor - only one ridge between neighbors may have nonconvex */ -}; - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="vertexT">-</a> - - vertexT - defines a vertex - - topological information: - next,previous doubly-linked list of all vertices - neighbors set of adjacent facets (only if qh.VERTEXneighbors) - - geometric information: - point array of DIM3 coordinates -*/ -struct vertexT { - vertexT *next; /* next vertex in vertex_list */ - vertexT *previous; /* previous vertex in vertex_list */ - pointT *point; /* hull_dim coordinates (coordT) */ - setT *neighbors; /* neighboring facets of vertex, qh_vertexneighbors() - inits in io.c or after first merge */ - unsigned visitid; /* for use with qh vertex_visit */ - unsigned id:24; /* unique identifier, =>room for 8 flags */ - flagT seen:1; /* used to perform operations only once */ - flagT seen2:1; /* another seen flag */ - flagT delridge:1; /* vertex was part of a deleted ridge */ - flagT deleted:1; /* true if vertex on qh del_vertices */ - flagT newlist:1; /* true if vertex on qh newvertex_list */ -}; - -/*======= -global variables -qh ============================*/ - -/*-<a href="qh-globa.htm#TOC" - >--------------------------------</a><a name="qh">-</a> - - qh - all global variables for qhull are in qh, qhmem, and qhstat - - notes: - qhmem is defined in mem.h and qhstat is defined in stat.h - access to qh_qh is via the "qh" macro. See qh_QHpointer in user.h -*/ -typedef struct qhT qhT; -#if qh_QHpointer -#define qh qh_qh-> -extern qhT *qh_qh; /* allocated in global.c */ -#else -#define qh qh_qh. -extern qhT qh_qh; -#endif - -struct qhT { - -/*-<a href="qh-globa.htm#TOC" - >--------------------------------</a><a name="qh-const">-</a> - - qh constants - configuration flags and constants for Qhull - - notes: - The user configures Qhull by defining flags. They are - copied into qh by qh_setflags(). qh-quick.htm#options defines the flags. -*/ - boolT ALLpoints; /* true 'Qs' if search all points for initial simplex */ - boolT ANGLEmerge; /* true 'Qa' if sort potential merges by angle */ - boolT APPROXhull; /* true 'Wn' if MINoutside set */ - realT MINoutside; /* 'Wn' min. distance for an outside point */ - boolT ATinfinity; /* true 'Qz' if point num_points-1 is "at-infinity" - for improving precision in Delaunay triangulations */ - boolT AVOIDold; /* true 'Q4' if avoid old->new merges */ - boolT BESToutside; /* true 'Qf' if partition points into best outsideset */ - boolT CDDinput; /* true 'Pc' if input uses CDD format (1.0/offset first) */ - boolT CDDoutput; /* true 'PC' if print normals in CDD format (offset first) */ - boolT CHECKfrequently; /* true 'Tc' if checking frequently */ - realT premerge_cos; /* 'A-n' cos_max when pre merging */ - realT postmerge_cos; /* 'An' cos_max when post merging */ - boolT DELAUNAY; /* true 'd' if computing DELAUNAY triangulation */ - boolT DOintersections; /* true 'Gh' if print hyperplane intersections */ - int DROPdim; /* drops dim 'GDn' for 4-d -> 3-d output */ - boolT FORCEoutput; /* true 'Po' if forcing output despite degeneracies */ - int GOODpoint; /* 1+n for 'QGn', good facet if visible/not(-) from point n*/ - pointT *GOODpointp; /* the actual point */ - boolT GOODthreshold; /* true if qh lower_threshold/upper_threshold defined - false if qh SPLITthreshold */ - int GOODvertex; /* 1+n, good facet if vertex for point n */ - pointT *GOODvertexp; /* the actual point */ - boolT HALFspace; /* true 'Hn,n,n' if halfspace intersection */ - int IStracing; /* trace execution, 0=none, 1=least, 4=most, -1=events */ - int KEEParea; /* 'PAn' number of largest facets to keep */ - boolT KEEPcoplanar; /* true 'Qc' if keeping nearest facet for coplanar points */ - boolT KEEPinside; /* true 'Qi' if keeping nearest facet for inside points - set automatically if 'd Qc' */ - int KEEPmerge; /* 'PMn' number of facets to keep with most merges */ - realT KEEPminArea; /* 'PFn' minimum facet area to keep */ - realT MAXcoplanar; /* 'Un' max distance below a facet to be coplanar*/ - boolT MERGEexact; /* true 'Qx' if exact merges (coplanar, degen, dupridge, flipped) */ - boolT MERGEindependent; /* true 'Q2' if merging independent sets */ - boolT MERGING; /* true if exact-, pre- or post-merging, with angle and centrum tests */ - realT premerge_centrum; /* 'C-n' centrum_radius when pre merging. Default is round-off */ - realT postmerge_centrum; /* 'Cn' centrum_radius when post merging. Default is round-off */ - boolT MERGEvertices; /* true 'Q3' if merging redundant vertices */ - realT MINvisible; /* 'Vn' min. distance for a facet to be visible */ - boolT NOnarrow; /* true 'Q10' if no special processing for narrow distributions */ - boolT NOnearinside; /* true 'Q8' if ignore near-inside points when partitioning */ - boolT NOpremerge; /* true 'Q0' if no defaults for C-0 or Qx */ - boolT ONLYgood; /* true 'Qg' if process points with good visible or horizon facets */ - boolT ONLYmax; /* true 'Qm' if only process points that increase max_outside */ - boolT PICKfurthest; /* true 'Q9' if process furthest of furthest points*/ - boolT POSTmerge; /* true if merging after buildhull (Cn or An) */ - boolT PREmerge; /* true if merging during buildhull (C-n or A-n) */ - /* NOTE: some of these names are similar to qh_PRINT names */ - boolT PRINTcentrums; /* true 'Gc' if printing centrums */ - boolT PRINTcoplanar; /* true 'Gp' if printing coplanar points */ - int PRINTdim; /* print dimension for Geomview output */ - boolT PRINTdots; /* true 'Ga' if printing all points as dots */ - boolT PRINTgood; /* true 'Pg' if printing good facets */ - boolT PRINTinner; /* true 'Gi' if printing inner planes */ - boolT PRINTneighbors; /* true 'PG' if printing neighbors of good facets */ - boolT PRINTnoplanes; /* true 'Gn' if printing no planes */ - boolT PRINToptions1st; /* true 'FO' if printing options to stderr */ - boolT PRINTouter; /* true 'Go' if printing outer planes */ - boolT PRINTprecision; /* false 'Pp' if not reporting precision problems */ - qh_PRINT PRINTout[qh_PRINTEND]; /* list of output formats to print */ - boolT PRINTridges; /* true 'Gr' if print ridges */ - boolT PRINTspheres; /* true 'Gv' if print vertices as spheres */ - boolT PRINTstatistics; /* true 'Ts' if printing statistics to stderr */ - boolT PRINTsummary; /* true 's' if printing summary to stderr */ - boolT PRINTtransparent; /* true 'Gt' if print transparent outer ridges */ - boolT PROJECTdelaunay; /* true if DELAUNAY, no readpoints() and - need projectinput() for Delaunay in qh_init_B */ - int PROJECTinput; /* number of projected dimensions 'bn:0Bn:0' */ - boolT QUICKhelp; /* true if quick help message for degen input */ - boolT RANDOMdist; /* true if randomly change distplane and setfacetplane */ - realT RANDOMfactor; /* maximum random perturbation */ - realT RANDOMa; /* qh_randomfactor is randr * RANDOMa + RANDOMb */ - realT RANDOMb; - boolT RANDOMoutside; /* true if select a random outside point */ - int REPORTfreq; /* buildtracing reports every n facets */ - int REPORTfreq2; /* tracemerging reports every REPORTfreq/2 facets */ - int RERUN; /* 'TRn' rerun qhull n times (qh.build_cnt) */ - int ROTATErandom; /* 'QRn' seed, 0 time, >= rotate input */ - boolT SCALEinput; /* true 'Qbk' if scaling input */ - boolT SCALElast; /* true 'Qbb' if scale last coord to max prev coord */ - boolT SETroundoff; /* true 'E' if qh DISTround is predefined */ - boolT SKIPcheckmax; /* true 'Q5' if skip qh_check_maxout */ - boolT SKIPconvex; /* true 'Q6' if skip convexity testing during pre-merge */ - boolT SPLITthresholds; /* true if upper_/lower_threshold defines a region - used only for printing (not for qh ONLYgood) */ - int STOPcone; /* 'TCn' 1+n for stopping after cone for point n*/ - /* also used by qh_build_withresart for err exit*/ - int STOPpoint; /* 'TVn' 'TV-n' 1+n for stopping after/before(-) - adding point n */ - int TESTpoints; /* 'QTn' num of test points after qh.num_points. Test points always coplanar. */ - boolT TESTvneighbors; /* true 'Qv' if test vertex neighbors at end */ - int TRACElevel; /* 'Tn' conditional IStracing level */ - int TRACElastrun; /* qh.TRACElevel applies to last qh.RERUN */ - int TRACEpoint; /* 'TPn' start tracing when point n is a vertex */ - realT TRACEdist; /* 'TWn' start tracing when merge distance too big */ - int TRACEmerge; /* 'TMn' start tracing before this merge */ - boolT TRIangulate; /* true 'Qt' if triangulate non-simplicial facets */ - boolT TRInormals; /* true 'Q11' if triangulate duplicates normals (sets Qt) */ - boolT UPPERdelaunay; /* true 'Qu' if computing furthest-site Delaunay */ - boolT VERIFYoutput; /* true 'Tv' if verify output at end of qhull */ - boolT VIRTUALmemory; /* true 'Q7' if depth-first processing in buildhull */ - boolT VORONOI; /* true 'v' if computing Voronoi diagram */ - - /*--------input constants ---------*/ - realT AREAfactor; /* 1/(hull_dim-1)! for converting det's to area */ - boolT DOcheckmax; /* true if calling qh_check_maxout (qh_initqhull_globals) */ - char *feasible_string; /* feasible point 'Hn,n,n' for halfspace intersection */ - coordT *feasible_point; /* as coordinates, both malloc'd */ - boolT GETarea; /* true 'Fa', 'FA', 'FS', 'PAn', 'PFn' if compute facet area/Voronoi volume in io.c */ - boolT KEEPnearinside; /* true if near-inside points in coplanarset */ - int hull_dim; /* dimension of hull, set by initbuffers */ - int input_dim; /* dimension of input, set by initbuffers */ - int num_points; /* number of input points */ - pointT *first_point; /* array of input points, see POINTSmalloc */ - boolT POINTSmalloc; /* true if qh first_point/num_points allocated */ - pointT *input_points; /* copy of original qh.first_point for input points for qh_joggleinput */ - boolT input_malloc; /* true if qh input_points malloc'd */ - char qhull_command[256];/* command line that invoked this program */ - char rbox_command[256]; /* command line that produced the input points */ - char qhull_options[512];/* descriptive list of options */ - int qhull_optionlen; /* length of last line */ - int qhull_optionsiz; /* size of qhull_options before qh_initbuild */ - boolT VERTEXneighbors; /* true if maintaining vertex neighbors */ - boolT ZEROcentrum; /* true if 'C-0' or 'C-0 Qx'. sets ZEROall_ok */ - realT *upper_threshold; /* don't print if facet->normal[k]>=upper_threshold[k] - must set either GOODthreshold or SPLITthreshold - if Delaunay, default is 0.0 for upper envelope */ - realT *lower_threshold; /* don't print if facet->normal[k] <=lower_threshold[k] */ - realT *upper_bound; /* scale point[k] to new upper bound */ - realT *lower_bound; /* scale point[k] to new lower bound - project if both upper_ and lower_bound == 0 */ - -/*-<a href="qh-globa.htm#TOC" - >--------------------------------</a><a name="qh-prec">-</a> - - qh precision constants - precision constants for Qhull - - notes: - qh_detroundoff() computes the maximum roundoff error for distance - and other computations. It also sets default values for the - qh constants above. -*/ - realT ANGLEround; /* max round off error for angles */ - realT centrum_radius; /* max centrum radius for convexity (roundoff added) */ - realT cos_max; /* max cosine for convexity (roundoff added) */ - realT DISTround; /* max round off error for distances, 'E' overrides */ - realT MAXabs_coord; /* max absolute coordinate */ - realT MAXlastcoord; /* max last coordinate for qh_scalelast */ - realT MAXsumcoord; /* max sum of coordinates */ - realT MAXwidth; /* max rectilinear width of point coordinates */ - realT MINdenom_1; /* min. abs. value for 1/x */ - realT MINdenom; /* use divzero if denominator < MINdenom */ - realT MINdenom_1_2; /* min. abs. val for 1/x that allows normalization */ - realT MINdenom_2; /* use divzero if denominator < MINdenom_2 */ - realT MINlastcoord; /* min. last coordinate for qh_scalelast */ - boolT NARROWhull; /* set in qh_initialhull if angle < qh_MAXnarrow */ - realT *NEARzero; /* hull_dim array for near zero in gausselim */ - realT NEARinside; /* keep points for qh_check_maxout if close to facet */ - realT ONEmerge; /* max distance for merging simplicial facets */ - realT outside_err; /* application's epsilon for coplanar points - qh_check_bestdist() qh_check_points() reports error if point outside */ - realT WIDEfacet; /* size of wide facet for skipping ridge in - area computation and locking centrum */ - -/*-<a href="qh-globa.htm#TOC" - >--------------------------------</a><a name="qh-intern">-</a> - - qh internal constants - internal constants for Qhull -*/ - char qhull[sizeof("qhull")]; /* for checking ownership */ - void *old_stat; /* pointer to saved qh_qhstat, qh_save_qhull */ - jmp_buf errexit; /* exit label for qh_errexit, defined by setjmp() */ - char jmpXtra[40]; /* extra bytes in case jmp_buf is defined wrong by compiler */ - jmp_buf restartexit; /* restart label for qh_errexit, defined by setjmp() */ - char jmpXtra2[40]; /* extra bytes in case jmp_buf is defined wrong by compiler*/ - FILE *fin; /* pointer to input file, init by qh_meminit */ - FILE *fout; /* pointer to output file */ - FILE *ferr; /* pointer to error file */ - pointT *interior_point; /* center point of the initial simplex*/ - int normal_size; /* size in bytes for facet normals and point coords*/ - int center_size; /* size in bytes for Voronoi centers */ - int TEMPsize; /* size for small, temporary sets (in quick mem) */ - -/*-<a href="qh-globa.htm#TOC" - >--------------------------------</a><a name="qh-lists">-</a> - - qh facet and vertex lists - defines lists of facets, new facets, visible facets, vertices, and - new vertices. Includes counts, next ids, and trace ids. - see: - qh_resetlists() -*/ - facetT *facet_list; /* first facet */ - facetT *facet_tail; /* end of facet_list (dummy facet) */ - facetT *facet_next; /* next facet for buildhull() - previous facets do not have outside sets - NARROWhull: previous facets may have coplanar outside sets for qh_outcoplanar */ - facetT *newfacet_list; /* list of new facets to end of facet_list */ - facetT *visible_list; /* list of visible facets preceeding newfacet_list, - facet->visible set */ - int num_visible; /* current number of visible facets */ - unsigned tracefacet_id; /* set at init, then can print whenever */ - facetT *tracefacet; /* set in newfacet/mergefacet, undone in delfacet*/ - unsigned tracevertex_id; /* set at buildtracing, can print whenever */ - vertexT *tracevertex; /* set in newvertex, undone in delvertex*/ - vertexT *vertex_list; /* list of all vertices, to vertex_tail */ - vertexT *vertex_tail; /* end of vertex_list (dummy vertex) */ - vertexT *newvertex_list; /* list of vertices in newfacet_list, to vertex_tail - all vertices have 'newlist' set */ - int num_facets; /* number of facets in facet_list - includes visble faces (num_visible) */ - int num_vertices; /* number of vertices in facet_list */ - int num_outside; /* number of points in outsidesets (for tracing and RANDOMoutside) - includes coplanar outsideset points for NARROWhull/qh_outcoplanar() */ - int num_good; /* number of good facets (after findgood_all) */ - unsigned facet_id; /* ID of next, new facet from newfacet() */ - unsigned ridge_id; /* ID of next, new ridge from newridge() */ - unsigned vertex_id; /* ID of next, new vertex from newvertex() */ - -/*-<a href="qh-globa.htm#TOC" - >--------------------------------</a><a name="qh-var">-</a> - - qh global variables - defines minimum and maximum distances, next visit ids, several flags, - and other global variables. - initialize in qh_initbuild or qh_maxmin if used in qh_buildhull -*/ - unsigned long hulltime; /* ignore time to set up input and randomize */ - /* use unsigned to avoid wrap-around errors */ - boolT ALLOWrestart; /* true if qh_precision can use qh.restartexit */ - int build_cnt; /* number of calls to qh_initbuild */ - qh_CENTER CENTERtype; /* current type of facet->center, qh_CENTER */ - int furthest_id; /* pointid of furthest point, for tracing */ - facetT *GOODclosest; /* closest facet to GOODthreshold in qh_findgood */ - realT JOGGLEmax; /* set 'QJn' if randomly joggle input */ - boolT maxoutdone; /* set qh_check_maxout(), cleared by qh_addpoint() */ - realT max_outside; /* maximum distance from a point to a facet, - before roundoff, not simplicial vertices - actual outer plane is +DISTround and - computed outer plane is +2*DISTround */ - realT max_vertex; /* maximum distance (>0) from vertex to a facet, - before roundoff, due to a merge */ - realT min_vertex; /* minimum distance (<0) from vertex to a facet, - before roundoff, due to a merge - if qh.JOGGLEmax, qh_makenewplanes sets it - recomputed if qh.DOcheckmax, default -qh.DISTround */ - boolT NEWfacets; /* true while visible facets invalid due to new or merge - from makecone/attachnewfacets to deletevisible */ - boolT findbestnew; /* true if partitioning calls qh_findbestnew */ - boolT findbest_notsharp; /* true if new facets are at least 90 degrees */ - boolT NOerrexit; /* true if qh.errexit is not available */ - realT PRINTcradius; /* radius for printing centrums */ - realT PRINTradius; /* radius for printing vertex spheres and points */ - boolT POSTmerging; /* true when post merging */ - int printoutvar; /* temporary variable for qh_printbegin, etc. */ - int printoutnum; /* number of facets printed */ - boolT QHULLfinished; /* True after qhull() is finished */ - realT totarea; /* 'FA': total facet area computed by qh_getarea */ - realT totvol; /* 'FA': total volume computed by qh_getarea */ - unsigned int visit_id; /* unique ID for searching neighborhoods, */ - unsigned int vertex_visit; /* unique ID for searching vertices */ - boolT ZEROall_ok; /* True if qh_checkzero always succeeds */ - boolT WAScoplanar; /* True if qh_partitioncoplanar (qh_check_maxout) */ - -/*-<a href="qh-globa.htm#TOC" - >--------------------------------</a><a name="qh-set">-</a> - - qh global sets - defines sets for merging, initial simplex, hashing, extra input points, - and deleted vertices -*/ - setT *facet_mergeset; /* temporary set of merges to be done */ - setT *degen_mergeset; /* temporary set of degenerate and redundant merges */ - setT *hash_table; /* hash table for matching ridges in qh_matchfacets - size is setsize() */ - setT *other_points; /* additional points (first is qh interior_point) */ - setT *del_vertices; /* vertices to partition and delete with visible - facets. Have deleted set for checkfacet */ - -/*-<a href="qh-globa.htm#TOC" - >--------------------------------</a><a name="qh-buf">-</a> - - qh global buffers - defines buffers for maxtrix operations, input, and error messages -*/ - coordT *gm_matrix; /* (dim+1)Xdim matrix for geom.c */ - coordT **gm_row; /* array of gm_matrix rows */ - char* line; /* malloc'd input line of maxline+1 chars */ - int maxline; - coordT *half_space; /* malloc'd input array for halfspace (qh normal_size+coordT) */ - coordT *temp_malloc; /* malloc'd input array for points */ - -/*-<a href="qh-globa.htm#TOC" - >--------------------------------</a><a name="qh-static">-</a> - - qh static variables - defines static variables for individual functions - - notes: - do not use 'static' within a function. Multiple instances of qhull - may exist. - - do not assume zero initialization, 'QPn' may cause a restart -*/ - boolT ERREXITcalled; /* true during errexit (prevents duplicate calls */ - boolT firstcentrum; /* for qh_printcentrum */ - realT last_low; /* qh_scalelast parameters for qh_setdelaunay */ - realT last_high; - realT last_newhigh; - unsigned lastreport; /* for qh_buildtracing */ - int mergereport; /* for qh_tracemerging */ - boolT old_randomdist; /* save RANDOMdist when io, tracing, or statistics */ - int ridgeoutnum; /* number of ridges in 4OFF output */ - void *old_qhstat; /* for saving qh_qhstat in save_qhull() */ - setT *old_tempstack; /* for saving qhmem.tempstack in save_qhull */ - setT *coplanarset; /* set of coplanar facets for searching qh_findbesthorizon() */ -}; - -/*=========== -macros- =========================*/ - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="otherfacet_">-</a> - - otherfacet_(ridge, facet) - return neighboring facet for a ridge in facet -*/ -#define otherfacet_(ridge, facet) \ - (((ridge)->top == (facet)) ? (ridge)->bottom : (ridge)->top) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="getid_">-</a> - - getid_(p) - return ID for facet, ridge, or vertex - return MAXINT if NULL (-1 causes type conversion error ) -*/ -#define getid_(p) ((p) ? (p)->id : -1) - -/*============== FORALL macros ===================*/ - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FORALLfacets">-</a> - - FORALLfacets { ... } - assign 'facet' to each facet in qh.facet_list - - notes: - uses 'facetT *facet;' - assumes last facet is a sentinel - - see: - FORALLfacet_( facetlist ) -*/ -#define FORALLfacets for (facet=qh facet_list;facet && facet->next;facet=facet->next) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FORALLpoints">-</a> - - FORALLpoints { ... } - assign 'point' to each point in qh.first_point, qh.num_points - - declare: - coordT *point, *pointtemp; -*/ -#define FORALLpoints FORALLpoint_(qh first_point, qh num_points) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FORALLpoint_">-</a> - - FORALLpoint_( points, num) { ... } - assign 'point' to each point in points array of num points - - declare: - coordT *point, *pointtemp; -*/ -#define FORALLpoint_(points, num) for(point= (points), \ - pointtemp= (points)+qh hull_dim*(num); point < pointtemp; point += qh hull_dim) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FORALLvertices">-</a> - - FORALLvertices { ... } - assign 'vertex' to each vertex in qh.vertex_list - - declare: - vertexT *vertex; - - notes: - assumes qh.vertex_list terminated with a sentinel -*/ -#define FORALLvertices for (vertex=qh vertex_list;vertex && vertex->next;vertex= vertex->next) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHfacet_">-</a> - - FOREACHfacet_( facets ) { ... } - assign 'facet' to each facet in facets - - declare: - facetT *facet, **facetp; - - see: - <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a> -*/ -#define FOREACHfacet_(facets) FOREACHsetelement_(facetT, facets, facet) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHneighbor_">-</a> - - FOREACHneighbor_( facet ) { ... } - assign 'neighbor' to each neighbor in facet->neighbors - - FOREACHneighbor_( vertex ) { ... } - assign 'neighbor' to each neighbor in vertex->neighbors - - declare: - facetT *neighbor, **neighborp; - - see: - <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a> -*/ -#define FOREACHneighbor_(facet) FOREACHsetelement_(facetT, facet->neighbors, neighbor) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHpoint_">-</a> - - FOREACHpoint_( points ) { ... } - assign 'point' to each point in points set - - declare: - pointT *point, **pointp; - - see: - <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a> -*/ -#define FOREACHpoint_(points) FOREACHsetelement_(pointT, points, point) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHridge_">-</a> - - FOREACHridge_( ridges ) { ... } - assign 'ridge' to each ridge in ridges set - - declare: - ridgeT *ridge, **ridgep; - - see: - <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a> -*/ -#define FOREACHridge_(ridges) FOREACHsetelement_(ridgeT, ridges, ridge) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHvertex_">-</a> - - FOREACHvertex_( vertices ) { ... } - assign 'vertex' to each vertex in vertices set - - declare: - vertexT *vertex, **vertexp; - - see: - <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a> -*/ -#define FOREACHvertex_(vertices) FOREACHsetelement_(vertexT, vertices,vertex) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHfacet_i_">-</a> - - FOREACHfacet_i_( facets ) { ... } - assign 'facet' and 'facet_i' for each facet in facets set - - declare: - facetT *facet; - int facet_n, facet_i; - - see: - <a href="qset.h#FOREACHsetelement_i_">FOREACHsetelement_i_</a> -*/ -#define FOREACHfacet_i_(facets) FOREACHsetelement_i_(facetT, facets, facet) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHneighbor_i_">-</a> - - FOREACHneighbor_i_( facet ) { ... } - assign 'neighbor' and 'neighbor_i' for each neighbor in facet->neighbors - - FOREACHneighbor_i_( vertex ) { ... } - assign 'neighbor' and 'neighbor_i' for each neighbor in vertex->neighbors - - declare: - facetT *neighbor; - int neighbor_n, neighbor_i; - - see: - <a href="qset.h#FOREACHsetelement_i_">FOREACHsetelement_i_</a> -*/ -#define FOREACHneighbor_i_(facet) FOREACHsetelement_i_(facetT, facet->neighbors, neighbor) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHpoint_i_">-</a> - - FOREACHpoint_i_( points ) { ... } - assign 'point' and 'point_i' for each point in points set - - declare: - pointT *point; - int point_n, point_i; - - see: - <a href="qset.h#FOREACHsetelement_i_">FOREACHsetelement_i_</a> -*/ -#define FOREACHpoint_i_(points) FOREACHsetelement_i_(pointT, points, point) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHridge_i_">-</a> - - FOREACHridge_i_( ridges ) { ... } - assign 'ridge' and 'ridge_i' for each ridge in ridges set - - declare: - ridgeT *ridge; - int ridge_n, ridge_i; - - see: - <a href="qset.h#FOREACHsetelement_i_">FOREACHsetelement_i_</a> -*/ -#define FOREACHridge_i_(ridges) FOREACHsetelement_i_(ridgeT, ridges, ridge) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHvertex_i_">-</a> - - FOREACHvertex_i_( vertices ) { ... } - assign 'vertex' and 'vertex_i' for each vertex in vertices set - - declare: - vertexT *vertex; - int vertex_n, vertex_i; - - see: - <a href="qset.h#FOREACHsetelement_i_">FOREACHsetelement_i_</a> - */ -#define FOREACHvertex_i_(vertices) FOREACHsetelement_i_(vertexT, vertices,vertex) - -/********* -qhull.c prototypes (duplicated from qhull_a.h) **********************/ - -void qh_qhull (void); -boolT qh_addpoint (pointT *furthest, facetT *facet, boolT checkdist); -void qh_printsummary(FILE *fp); - -/********* -user.c prototypes (alphabetical) **********************/ - -void qh_errexit(int exitcode, facetT *facet, ridgeT *ridge); -void qh_errprint(char* string, facetT *atfacet, facetT *otherfacet, ridgeT *atridge, vertexT *atvertex); -int qh_new_qhull (int dim, int numpoints, coordT *points, boolT ismalloc, - char *qhull_cmd, FILE *outfile, FILE *errfile); -void qh_printfacetlist(facetT *facetlist, setT *facets, boolT printall); -void qh_user_memsizes (void); - -/***** -geom.c/geom2.c prototypes (duplicated from geom.h) ****************/ - -facetT *qh_findbest (pointT *point, facetT *startfacet, - boolT bestoutside, boolT newfacets, boolT noupper, - realT *dist, boolT *isoutside, int *numpart); -facetT *qh_findbestnew (pointT *point, facetT *startfacet, - realT *dist, boolT bestoutside, boolT *isoutside, int *numpart); -boolT qh_gram_schmidt(int dim, realT **rows); -void qh_outerinner (facetT *facet, realT *outerplane, realT *innerplane); -void qh_printsummary(FILE *fp); -void qh_projectinput (void); -void qh_randommatrix (realT *buffer, int dim, realT **row); -void qh_rotateinput (realT **rows); -void qh_scaleinput (void); -void qh_setdelaunay (int dim, int count, pointT *points); -coordT *qh_sethalfspace_all (int dim, int count, coordT *halfspaces, pointT *feasible); - -/***** -global.c prototypes (alphabetical) ***********************/ - -unsigned long qh_clock (void); -void qh_checkflags (char *command, char *hiddenflags); -void qh_freebuffers (void); -void qh_freeqhull (boolT allmem); -void qh_init_A (FILE *infile, FILE *outfile, FILE *errfile, int argc, char *argv[]); -void qh_init_B (coordT *points, int numpoints, int dim, boolT ismalloc); -void qh_init_qhull_command (int argc, char *argv[]); -void qh_initbuffers (coordT *points, int numpoints, int dim, boolT ismalloc); -void qh_initflags (char *command); -void qh_initqhull_buffers (void); -void qh_initqhull_globals (coordT *points, int numpoints, int dim, boolT ismalloc); -void qh_initqhull_mem (void); -void qh_initqhull_start (FILE *infile, FILE *outfile, FILE *errfile); -void qh_initthresholds (char *command); -void qh_option (char *option, int *i, realT *r); -#if qh_QHpointer -void qh_restore_qhull (qhT **oldqh); -qhT *qh_save_qhull (void); -#endif - -/***** -io.c prototypes (duplicated from io.h) ***********************/ - -void dfacet( unsigned id); -void dvertex( unsigned id); -void qh_printneighborhood (FILE *fp, int format, facetT *facetA, facetT *facetB, boolT printall); -void qh_produce_output(void); -coordT *qh_readpoints(int *numpoints, int *dimension, boolT *ismalloc); - - -/********* -mem.c prototypes (duplicated from mem.h) **********************/ - -void qh_meminit (FILE *ferr); -void qh_memfreeshort (int *curlong, int *totlong); - -/********* -poly.c/poly2.c prototypes (duplicated from poly.h) **********************/ - -void qh_check_output (void); -void qh_check_points (void); -setT *qh_facetvertices (facetT *facetlist, setT *facets, boolT allfacets); -facetT *qh_findbestfacet (pointT *point, boolT bestoutside, - realT *bestdist, boolT *isoutside); -vertexT *qh_nearvertex (facetT *facet, pointT *point, realT *bestdistp); -pointT *qh_point (int id); -setT *qh_pointfacet (void /*qh.facet_list*/); -int qh_pointid (pointT *point); -setT *qh_pointvertex (void /*qh.facet_list*/); -void qh_setvoronoi_all (void); -void qh_triangulate (void /*qh facet_list*/); - -/********* -stat.c prototypes (duplicated from stat.h) **********************/ - -void qh_collectstatistics (void); -void qh_printallstatistics (FILE *fp, char *string); - -#endif /* qhDEFqhull */ diff --git a/extern/qhull/include/qhull/qhull_a.h b/extern/qhull/include/qhull/qhull_a.h deleted file mode 100644 index d4e69b071be..00000000000 --- a/extern/qhull/include/qhull/qhull_a.h +++ /dev/null @@ -1,127 +0,0 @@ -/*<html><pre> -<a href="qh-qhull.htm" - >-------------------------------</a><a name="TOP">-</a> - - qhull_a.h - all header files for compiling qhull - - see qh-qhull.htm - - see qhull.h for user-level definitions - - see user.h for user-defineable constants - - defines internal functions for qhull.c global.c - - copyright (c) 1993-2002, The Geometry Center - - Notes: grep for ((" and (" to catch fprintf("lkasdjf"); - full parens around (x?y:z) - use '#include qhull/qhull_a.h' to avoid name clashes -*/ - -#ifndef qhDEFqhulla -#define qhDEFqhulla - -#include <stdio.h> -#include <stdlib.h> -#include <setjmp.h> -#include <string.h> -#include <math.h> -#include <float.h> /* some compilers will not need float.h */ -#include <limits.h> -#include <time.h> -#include <ctype.h> -/*** uncomment here and qset.c - if string.h does not define memcpy() -#include <memory.h> -*/ -#include "qhull.h" -#include "mem.h" -#include "qset.h" -#include "geom.h" -#include "merge.h" -#include "poly.h" -#include "io.h" -#include "stat.h" - -#if qh_CLOCKtype == 2 /* defined in user.h from qhull.h */ -#include <sys/types.h> -#include <sys/times.h> -#include <unistd.h> -#endif - -#ifdef _MSC_VER /* Microsoft Visual C++ */ -#pragma warning( disable : 4056) /* float constant expression. Looks like a compiler bug */ -#pragma warning( disable : 4146) /* unary minus applied to unsigned type */ -#pragma warning( disable : 4244) /* conversion from 'unsigned long' to 'real' */ -#pragma warning( disable : 4305) /* conversion from 'const double' to 'float' */ -#endif - -/* ======= -macros- =========== */ - -/*-<a href="qh-qhull.htm#TOC" - >--------------------------------</a><a name="traceN">-</a> - - traceN((fp.ferr, "format\n", vars)); - calls fprintf if qh.IStracing >= N - - notes: - removing tracing reduces code size but doesn't change execution speed -*/ -#ifndef qh_NOtrace -#define trace0(args) {if (qh IStracing) fprintf args;} -#define trace1(args) {if (qh IStracing >= 1) fprintf args;} -#define trace2(args) {if (qh IStracing >= 2) fprintf args;} -#define trace3(args) {if (qh IStracing >= 3) fprintf args;} -#define trace4(args) {if (qh IStracing >= 4) fprintf args;} -#define trace5(args) {if (qh IStracing >= 5) fprintf args;} -#else /* qh_NOtrace */ -#define trace0(args) {} -#define trace1(args) {} -#define trace2(args) {} -#define trace3(args) {} -#define trace4(args) {} -#define trace5(args) {} -#endif /* qh_NOtrace */ - -/***** -qhull.c prototypes (alphabetical after qhull) ********************/ - -void qh_qhull (void); -boolT qh_addpoint (pointT *furthest, facetT *facet, boolT checkdist); -void qh_buildhull(void); -void qh_buildtracing (pointT *furthest, facetT *facet); -void qh_build_withrestart (void); -void qh_errexit2(int exitcode, facetT *facet, facetT *otherfacet); -void qh_findhorizon(pointT *point, facetT *facet, int *goodvisible,int *goodhorizon); -pointT *qh_nextfurthest (facetT **visible); -void qh_partitionall(setT *vertices, pointT *points,int npoints); -void qh_partitioncoplanar (pointT *point, facetT *facet, realT *dist); -void qh_partitionpoint (pointT *point, facetT *facet); -void qh_partitionvisible(boolT allpoints, int *numpoints); -void qh_precision (char *reason); -void qh_printsummary(FILE *fp); - -/***** -global.c internal prototypes (alphabetical) ***********************/ - -void qh_appendprint (qh_PRINT format); -void qh_freebuild (boolT allmem); -void qh_freebuffers (void); -void qh_initbuffers (coordT *points, int numpoints, int dim, boolT ismalloc); -int qh_strtol (const char *s, char **endp); -double qh_strtod (const char *s, char **endp); - -/***** -stat.c internal prototypes (alphabetical) ***********************/ - -void qh_allstatA (void); -void qh_allstatB (void); -void qh_allstatC (void); -void qh_allstatD (void); -void qh_allstatE (void); -void qh_allstatE2 (void); -void qh_allstatF (void); -void qh_allstatG (void); -void qh_allstatH (void); -void qh_freebuffers (void); -void qh_initbuffers (coordT *points, int numpoints, int dim, boolT ismalloc); - -#endif /* qhDEFqhulla */ diff --git a/extern/qhull/include/qhull/qset.h b/extern/qhull/include/qhull/qset.h deleted file mode 100644 index 6c0ff758de4..00000000000 --- a/extern/qhull/include/qhull/qset.h +++ /dev/null @@ -1,468 +0,0 @@ -/*<html><pre> -<a href="qh-set.htm" - >-------------------------------</a><a name="TOP">-</a> - - qset.h - header file for qset.c that implements set - - see qh-set.htm and qset.c - - only uses mem.c, malloc/free - - for error handling, writes message and calls - qh_errexit (qhmem_ERRqhull, NULL, NULL); - - set operations satisfy the following properties: - - sets have a max size, the actual size (if different) is stored at the end - - every set is NULL terminated - - sets may be sorted or unsorted, the caller must distinguish this - - copyright (c) 1993-2002, The Geometry Center -*/ - -#ifndef qhDEFset -#define qhDEFset 1 - -/*================= -structures- ===============*/ - -#ifndef DEFsetT -#define DEFsetT 1 -typedef struct setT setT; /* a set is a sorted or unsorted array of pointers */ -#endif - -/*-<a href="qh-set.htm#TOC" ->----------------------------------------</a><a name="setT">-</a> - -setT - a set or list of pointers with maximum size and actual size. - -variations: - unsorted, unique -- a list of unique pointers with NULL terminator - user guarantees uniqueness - sorted -- a sorted list of unique pointers with NULL terminator - qset.c guarantees uniqueness - unsorted -- a list of pointers terminated with NULL - indexed -- an array of pointers with NULL elements - -structure for set of n elements: - - -------------- - | maxsize - -------------- - | e[0] - a pointer, may be NULL for indexed sets - -------------- - | e[1] - - -------------- - | ... - -------------- - | e[n-1] - -------------- - | e[n] = NULL - -------------- - | ... - -------------- - | e[maxsize] - n+1 or NULL (determines actual size of set) - -------------- - -*/ - -/*-- setelemT -- internal type to allow both pointers and indices -*/ -typedef union setelemT setelemT; -union setelemT { - void *p; - int i; /* integer used for e[maxSize] */ -}; - -struct setT { - int maxsize; /* maximum number of elements (except NULL) */ - setelemT e[1]; /* array of pointers, tail is NULL */ - /* last slot (unless NULL) is actual size+1 - e[maxsize]==NULL or e[e[maxsize]-1]==NULL */ - /* this may generate a warning since e[] contains - maxsize elements */ -}; - -/*=========== -constants- =========================*/ - -/*-<a href="qh-set.htm#TOC" - >-----------------------------------</a><a name="SETelemsize">-</a> - - SETelemsize - size of a set element in bytes -*/ -#define SETelemsize sizeof(setelemT) - - -/*=========== -macros- =========================*/ - -/*-<a href="qh-set.htm#TOC" - >-----------------------------------</a><a name="FOREACHsetelement_">-</a> - - FOREACHsetelement_(type, set, variable) - define FOREACH iterator - - declare: - assumes *variable and **variablep are declared - no space in "variable)" [DEC Alpha cc compiler] - - each iteration: - variable is set element - variablep is one beyond variable. - - to repeat an element: - variablep--; / *repeat* / - - at exit: - variable is NULL at end of loop - - example: - #define FOREACHfacet_( facets ) FOREACHsetelement_( facetT, facets, facet ) - - notes: - use FOREACHsetelement_i_() if need index or include NULLs - - WARNING: - nested loops can't use the same variable (define another FOREACH) - - needs braces if nested inside another FOREACH - this includes intervening blocks, e.g. FOREACH...{ if () FOREACH...} ) -*/ -#define FOREACHsetelement_(type, set, variable) \ - if (((variable= NULL), set)) for(\ - variable##p= (type **)&((set)->e[0].p); \ - (variable= *variable##p++);) - -/*-<a href="qh-set.htm#TOC" - >----------------------------------------</a><a name="FOREACHsetelement_i_">-</a> - - FOREACHsetelement_i_(type, set, variable) - define indexed FOREACH iterator - - declare: - type *variable, variable_n, variable_i; - - each iteration: - variable is set element, may be NULL - variable_i is index, variable_n is qh_setsize() - - to repeat an element: - variable_i--; variable_n-- repeats for deleted element - - at exit: - variable==NULL and variable_i==variable_n - - example: - #define FOREACHfacet_i_( facets ) FOREACHsetelement_i_( facetT, facets, facet ) - - WARNING: - nested loops can't use the same variable (define another FOREACH) - - needs braces if nested inside another FOREACH - this includes intervening blocks, e.g. FOREACH...{ if () FOREACH...} ) -*/ -#define FOREACHsetelement_i_(type, set, variable) \ - if (((variable= NULL), set)) for (\ - variable##_i= 0, variable= (type *)((set)->e[0].p), \ - variable##_n= qh_setsize(set);\ - variable##_i < variable##_n;\ - variable= (type *)((set)->e[++variable##_i].p) ) - -/*-<a href="qh-set.htm#TOC" - >--------------------------------------</a><a name="FOREACHsetelementreverse_">-</a> - - FOREACHsetelementreverse_(type, set, variable)- - define FOREACH iterator in reverse order - - declare: - assumes *variable and **variablep are declared - also declare 'int variabletemp' - - each iteration: - variable is set element - - to repeat an element: - variabletemp++; / *repeat* / - - at exit: - variable is NULL - - example: - #define FOREACHvertexreverse_( vertices ) FOREACHsetelementreverse_( vertexT, vertices, vertex ) - - notes: - use FOREACHsetelementreverse12_() to reverse first two elements - WARNING: needs braces if nested inside another FOREACH -*/ -#define FOREACHsetelementreverse_(type, set, variable) \ - if (((variable= NULL), set)) for(\ - variable##temp= qh_setsize(set)-1, variable= qh_setlast(set);\ - variable; variable= \ - ((--variable##temp >= 0) ? SETelemt_(set, variable##temp, type) : NULL)) - -/*-<a href="qh-set.htm#TOC" - >-----------------------------------</a><a name="FOREACHsetelementreverse12_">-</a> - - FOREACHsetelementreverse12_(type, set, variable)- - define FOREACH iterator with e[1] and e[0] reversed - - declare: - assumes *variable and **variablep are declared - - each iteration: - variable is set element - variablep is one after variable. - - to repeat an element: - variablep--; / *repeat* / - - at exit: - variable is NULL at end of loop - - example - #define FOREACHvertexreverse12_( vertices ) FOREACHsetelementreverse12_( vertexT, vertices, vertex ) - - notes: - WARNING: needs braces if nested inside another FOREACH -*/ -#define FOREACHsetelementreverse12_(type, set, variable) \ - if (((variable= NULL), set)) for(\ - variable##p= (type **)&((set)->e[1].p); \ - (variable= *variable##p); \ - variable##p == ((type **)&((set)->e[0].p))?variable##p += 2: \ - (variable##p == ((type **)&((set)->e[1].p))?variable##p--:variable##p++)) - -/*-<a href="qh-set.htm#TOC" - >-----------------------------------</a><a name="FOREACHelem_">-</a> - - FOREACHelem_( set )- - iterate elements in a set - - declare: - void *elem, *elemp; - - each iteration: - elem is set element - elemp is one beyond - - to repeat an element: - elemp--; / *repeat* / - - at exit: - elem == NULL at end of loop - - example: - FOREACHelem_(set) { - - notes: - WARNING: needs braces if nested inside another FOREACH -*/ -#define FOREACHelem_(set) FOREACHsetelement_(void, set, elem) - -/*-<a href="qh-set.htm#TOC" - >-----------------------------------</a><a name="FOREACHset_">-</a> - - FOREACHset_( set )- - iterate a set of sets - - declare: - setT *set, **setp; - - each iteration: - set is set element - setp is one beyond - - to repeat an element: - setp--; / *repeat* / - - at exit: - set == NULL at end of loop - - example - FOREACHset_(sets) { - - notes: - WARNING: needs braces if nested inside another FOREACH -*/ -#define FOREACHset_(sets) FOREACHsetelement_(setT, sets, set) - -/*-<a href="qh-set.htm#TOC" - >-----------------------------------------</a><a name="SETindex_">-</a> - - SETindex_( set, elem ) - return index of elem in set - - notes: - for use with FOREACH iteration - - example: - i= SETindex_(ridges, ridge) -*/ -#define SETindex_(set, elem) ((void **)elem##p - (void **)&(set)->e[1].p) - -/*-<a href="qh-set.htm#TOC" - >---------------------------------------</a><a name="SETref_">-</a> - - SETref_( elem ) - l.h.s. for modifying the current element in a FOREACH iteration - - example: - SETref_(ridge)= anotherridge; -*/ -#define SETref_(elem) (elem##p[-1]) - -/*-<a href="qh-set.htm#TOC" - >---------------------------------------</a><a name="SETelem_">-</a> - - SETelem_(set, n) - return the n'th element of set - - notes: - assumes that n is valid [0..size] and that set is defined - use SETelemt_() for type cast -*/ -#define SETelem_(set, n) ((set)->e[n].p) - -/*-<a href="qh-set.htm#TOC" - >---------------------------------------</a><a name="SETelemt_">-</a> - - SETelemt_(set, n, type) - return the n'th element of set as a type - - notes: - assumes that n is valid [0..size] and that set is defined -*/ -#define SETelemt_(set, n, type) ((type*)((set)->e[n].p)) - -/*-<a href="qh-set.htm#TOC" - >---------------------------------------</a><a name="SETelemaddr_">-</a> - - SETelemaddr_(set, n, type) - return address of the n'th element of a set - - notes: - assumes that n is valid [0..size] and set is defined -*/ -#define SETelemaddr_(set, n, type) ((type **)(&((set)->e[n].p))) - -/*-<a href="qh-set.htm#TOC" - >---------------------------------------</a><a name="SETfirst_">-</a> - - SETfirst_(set) - return first element of set - -*/ -#define SETfirst_(set) ((set)->e[0].p) - -/*-<a href="qh-set.htm#TOC" - >---------------------------------------</a><a name="SETfirstt_">-</a> - - SETfirstt_(set, type) - return first element of set as a type - -*/ -#define SETfirstt_(set, type) ((type*)((set)->e[0].p)) - -/*-<a href="qh-set.htm#TOC" - >---------------------------------------</a><a name="SETsecond_">-</a> - - SETsecond_(set) - return second element of set - -*/ -#define SETsecond_(set) ((set)->e[1].p) - -/*-<a href="qh-set.htm#TOC" - >---------------------------------------</a><a name="SETsecondt_">-</a> - - SETsecondt_(set, type) - return second element of set as a type -*/ -#define SETsecondt_(set, type) ((type*)((set)->e[1].p)) - -/*-<a href="qh-set.htm#TOC" - >---------------------------------------</a><a name="SETaddr_">-</a> - - SETaddr_(set, type) - return address of set's elements -*/ -#define SETaddr_(set,type) ((type **)(&((set)->e[0].p))) - -/*-<a href="qh-set.htm#TOC" - >---------------------------------------</a><a name="SETreturnsize_">-</a> - - SETreturnsize_(set, size) - return size of a set - - notes: - set must be defined - use qh_setsize(set) unless speed is critical -*/ -#define SETreturnsize_(set, size) (((size)= ((set)->e[(set)->maxsize].i))?(--(size)):((size)= (set)->maxsize)) - -/*-<a href="qh-set.htm#TOC" - >---------------------------------------</a><a name="SETempty_">-</a> - - SETempty_(set) - return true (1) if set is empty - - notes: - set may be NULL -*/ -#define SETempty_(set) (!set || (SETfirst_(set) ? 0:1)) - -/*-<a href="qh-set.htm#TOC" - >---------------------------------------</a><a name="SETtruncate_">-</a> - - SETtruncate_(set) - return first element of set - - see: - qh_settruncate() - -*/ -#define SETtruncate_(set, size) {set->e[set->maxsize].i= size+1; /* maybe overwritten */ \ - set->e[size].p= NULL;} - -/*======= prototypes in alphabetical order ============*/ - -void qh_setaddsorted(setT **setp, void *elem); -void qh_setaddnth(setT **setp, int nth, void *newelem); -void qh_setappend(setT **setp, void *elem); -void qh_setappend_set(setT **setp, setT *setA); -void qh_setappend2ndlast(setT **setp, void *elem); -void qh_setcheck(setT *set, char *tname, int id); -void qh_setcompact(setT *set); -setT *qh_setcopy(setT *set, int extra); -void *qh_setdel(setT *set, void *elem); -void *qh_setdellast(setT *set); -void *qh_setdelnth(setT *set, int nth); -void *qh_setdelnthsorted(setT *set, int nth); -void *qh_setdelsorted(setT *set, void *newelem); -setT *qh_setduplicate( setT *set, int elemsize); -int qh_setequal(setT *setA, setT *setB); -int qh_setequal_except (setT *setA, void *skipelemA, setT *setB, void *skipelemB); -int qh_setequal_skip (setT *setA, int skipA, setT *setB, int skipB); -void qh_setfree(setT **set); -void qh_setfree2( setT **setp, int elemsize); -void qh_setfreelong(setT **set); -int qh_setin(setT *set, void *setelem); -int qh_setindex(setT *set, void *setelem); -void qh_setlarger(setT **setp); -void *qh_setlast(setT *set); -setT *qh_setnew(int size); -setT *qh_setnew_delnthsorted(setT *set, int size, int nth, int prepend); -void qh_setprint(FILE *fp, char* string, setT *set); -void qh_setreplace(setT *set, void *oldelem, void *newelem); -int qh_setsize(setT *set); -setT *qh_settemp(int setsize); -void qh_settempfree(setT **set); -void qh_settempfree_all(void); -setT *qh_settemppop(void); -void qh_settemppush(setT *set); -void qh_settruncate (setT *set, int size); -int qh_setunique (setT **set, void *elem); -void qh_setzero (setT *set, int index, int size); - - -#endif /* qhDEFset */ diff --git a/extern/qhull/include/qhull/stat.h b/extern/qhull/include/qhull/stat.h deleted file mode 100644 index 1dae54ed21d..00000000000 --- a/extern/qhull/include/qhull/stat.h +++ /dev/null @@ -1,520 +0,0 @@ - /*<html><pre> -<a href="qh-stat.htm" - >-------------------------------</a><a name="TOP">-</a> - - stat.h - contains all statistics that are collected for qhull - - see qh-stat.htm and stat.c - - copyright (c) 1993-2002, The Geometry Center - - recompile qhull if you change this file - - Integer statistics are Z* while real statistics are W*. - - define maydebugx to call a routine at every statistic event - -*/ - -#ifndef qhDEFstat -#define qhDEFstat 1 - - -/*-<a href="qh-stat.htm#TOC" - >-------------------------------</a><a name="KEEPstatistics">-</a> - - qh_KEEPstatistics - 0 turns off statistic gathering (except zzdef/zzinc/zzadd/zzval/wwval) -*/ -#ifndef qh_KEEPstatistics -#define qh_KEEPstatistics 1 -#endif - -/*-<a href="qh-stat.htm#TOC" - >-------------------------------</a><a name="statistics">-</a> - - Zxxx for integers, Wxxx for reals - - notes: - be sure that all statistics are defined in stat.c - otherwise initialization may core dump - can pick up all statistics by: - grep '[zw].*_[(][ZW]' *.c >z.x - remove trailers with query">-</a> - remove leaders with query-replace-regexp [ ^I]+ ( -*/ -#if qh_KEEPstatistics -enum statistics { /* alphabetical after Z/W */ - Zacoplanar, - Wacoplanarmax, - Wacoplanartot, - Zangle, - Wangle, - Wanglemax, - Wanglemin, - Zangletests, - Wareatot, - Wareamax, - Wareamin, - Zavoidold, - Wavoidoldmax, - Wavoidoldtot, - Zback0, - Zbestcentrum, - Zbestdist, - Zcentrumtests, - Zcheckpart, - Zcomputefurthest, - Zconcave, - Wconcavemax, - Wconcavetot, - Zconcaveridges, - Zconcaveridge, - Zcoplanar, - Wcoplanarmax, - Wcoplanartot, - Zcoplanarangle, - Zcoplanarcentrum, - Zcoplanarhorizon, - Zcoplanarinside, - Zcoplanarpart, - Zcoplanarridges, - Wcpu, - Zcyclefacetmax, - Zcyclefacettot, - Zcyclehorizon, - Zcyclevertex, - Zdegen, - Wdegenmax, - Wdegentot, - Zdegenvertex, - Zdelfacetdup, - Zdelridge, - Zdelvertextot, - Zdelvertexmax, - Zdetsimplex, - Zdistcheck, - Zdistconvex, - Zdistgood, - Zdistio, - Zdistplane, - Zdiststat, - Zdistvertex, - Zdistzero, - Zdoc1, - Zdoc2, - Zdoc3, - Zdoc4, - Zdoc5, - Zdoc6, - Zdoc7, - Zdoc8, - Zdoc9, - Zdoc10, - Zdoc11, - Zdoc12, - Zdropdegen, - Zdropneighbor, - Zdupflip, - Zduplicate, - Wduplicatemax, - Wduplicatetot, - Zdupridge, - Zdupsame, - Zflipped, - Wflippedmax, - Wflippedtot, - Zflippedfacets, - Zfindbest, - Zfindbestmax, - Zfindbesttot, - Zfindcoplanar, - Zfindfail, - Zfindhorizon, - Zfindhorizonmax, - Zfindhorizontot, - Zfindjump, - Zfindnew, - Zfindnewmax, - Zfindnewtot, - Zfindnewjump, - Zfindnewsharp, - Zgauss0, - Zgoodfacet, - Zhashlookup, - Zhashridge, - Zhashridgetest, - Zhashtests, - Zinsidevisible, - Zintersect, - Zintersectfail, - Zintersectmax, - Zintersectnum, - Zintersecttot, - Zmaxneighbors, - Wmaxout, - Wmaxoutside, - Zmaxridges, - Zmaxvertex, - Zmaxvertices, - Zmaxvneighbors, - Zmemfacets, - Zmempoints, - Zmemridges, - Zmemvertices, - Zmergeflipdup, - Zmergehorizon, - Zmergeinittot, - Zmergeinitmax, - Zmergeinittot2, - Zmergeintohorizon, - Zmergenew, - Zmergesettot, - Zmergesetmax, - Zmergesettot2, - Zmergesimplex, - Zmergevertex, - Wmindenom, - Wminvertex, - Zminnorm, - Zmultiridge, - Znearlysingular, - Zneighbor, - Wnewbalance, - Wnewbalance2, - Znewfacettot, - Znewfacetmax, - Znewvertex, - Wnewvertex, - Wnewvertexmax, - Znoarea, - Znonsimplicial, - Znowsimplicial, - Znotgood, - Znotgoodnew, - Znotmax, - Znumfacets, - Znummergemax, - Znummergetot, - Znumneighbors, - Znumridges, - Znumvertices, - Znumvisibility, - Znumvneighbors, - Zonehorizon, - Zpartangle, - Zpartcoplanar, - Zpartflip, - Zparthorizon, - Zpartinside, - Zpartition, - Zpartitionall, - Zpartnear, - Zpbalance, - Wpbalance, - Wpbalance2, - Zpostfacets, - Zpremergetot, - Zprocessed, - Zremvertex, - Zremvertexdel, - Zrenameall, - Zrenamepinch, - Zrenameshare, - Zretry, - Wretrymax, - Zridge, - Wridge, - Wridgemax, - Zridge0, - Wridge0, - Wridge0max, - Zridgemid, - Wridgemid, - Wridgemidmax, - Zridgeok, - Wridgeok, - Wridgeokmax, - Zsearchpoints, - Zsetplane, - Ztestvneighbor, - Ztotcheck, - Ztothorizon, - Ztotmerge, - Ztotpartcoplanar, - Ztotpartition, - Ztotridges, - Ztotvertices, - Ztotvisible, - Ztricoplanar, - Ztricoplanarmax, - Ztricoplanartot, - Ztridegen, - Ztrimirror, - Ztrinull, - Wvertexmax, - Wvertexmin, - Zvertexridge, - Zvertexridgetot, - Zvertexridgemax, - Zvertices, - Zvisfacettot, - Zvisfacetmax, - Zvisvertextot, - Zvisvertexmax, - Zwidefacet, - Zwidevertices, - ZEND}; - -/*-<a href="qh-stat.htm#TOC" - >-------------------------------</a><a name="ZZstat">-</a> - - Zxxx/Wxxx statistics that remain defined if qh_KEEPstatistics=0 - - notes: - be sure to use zzdef, zzinc, etc. with these statistics (no double checking!) -*/ -#else -enum statistics { /* for zzdef etc. macros */ - Zback0, - Zbestdist, - Zcentrumtests, - Zcheckpart, - Zconcaveridges, - Zcoplanarhorizon, - Zcoplanarpart, - Zcoplanarridges, - Zcyclefacettot, - Zcyclehorizon, - Zdelvertextot, - Zdistcheck, - Zdistconvex, - Zdistzero, - Zdoc1, - Zdoc2, - Zdoc3, - Zdoc11, - Zflippedfacets, - Zgauss0, - Zminnorm, - Zmultiridge, - Znearlysingular, - Wnewvertexmax, - Znumvisibility, - Zpartcoplanar, - Zpartition, - Zpartitionall, - Zprocessed, - Zretry, - Zridge, - Wridge, - Wridgemax, - Zridge0, - Wridge0, - Wridge0max, - Zridgemid, - Wridgemid, - Wridgemidmax, - Zridgeok, - Wridgeok, - Wridgeokmax, - Zsetplane, - Ztotmerge, - ZEND}; -#endif - -/*-<a href="qh-stat.htm#TOC" - >-------------------------------</a><a name="ztype">-</a> - - ztype - the type of a statistic sets its initial value. - - notes: - The type should be the same as the macro for collecting the statistic -*/ -enum ztypes {zdoc,zinc,zadd,zmax,zmin,ZTYPEreal,wadd,wmax,wmin,ZTYPEend}; - -/*========== macros and constants =============*/ - -/*-<a href="qh-stat.htm#TOC" - >--------------------------------</a><a name="MAYdebugx">-</a> - - MAYdebugx - define as maydebug() to be called frequently for error trapping -*/ -#define MAYdebugx - -/*-<a href="qh-stat.htm#TOC" - >--------------------------------</a><a name="zdef_">-</a> - - zzdef_, zdef_( type, name, doc, -1) - define a statistic (assumes 'qhstat.next= 0;') - - zdef_( type, name, doc, count) - define an averaged statistic - printed as name/count -*/ -#define zzdef_(stype,name,string,cnt) qhstat id[qhstat next++]=name; \ - qhstat doc[name]= string; qhstat count[name]= cnt; qhstat type[name]= stype -#if qh_KEEPstatistics -#define zdef_(stype,name,string,cnt) qhstat id[qhstat next++]=name; \ - qhstat doc[name]= string; qhstat count[name]= cnt; qhstat type[name]= stype -#else -#define zdef_(type,name,doc,count) -#endif - -/*-<a href="qh-stat.htm#TOC" - >--------------------------------</a><a name="zinc_">-</a> - - zzinc_( name ), zinc_( name) - increment an integer statistic -*/ -#define zzinc_(id) {MAYdebugx; qhstat stats[id].i++;} -#if qh_KEEPstatistics -#define zinc_(id) {MAYdebugx; qhstat stats[id].i++;} -#else -#define zinc_(id) {} -#endif - -/*-<a href="qh-stat.htm#TOC" - >--------------------------------</a><a name="zadd_">-</a> - - zzadd_( name, value ), zadd_( name, value ), wadd_( name, value ) - add value to an integer or real statistic -*/ -#define zzadd_(id, val) {MAYdebugx; qhstat stats[id].i += (val);} -#define wwadd_(id, val) {MAYdebugx; qhstat stats[id].r += (val);} -#if qh_KEEPstatistics -#define zadd_(id, val) {MAYdebugx; qhstat stats[id].i += (val);} -#define wadd_(id, val) {MAYdebugx; qhstat stats[id].r += (val);} -#else -#define zadd_(id, val) {} -#define wadd_(id, val) {} -#endif - -/*-<a href="qh-stat.htm#TOC" - >--------------------------------</a><a name="zval_">-</a> - - zzval_( name ), zval_( name ), wwval_( name ) - set or return value of a statistic -*/ -#define zzval_(id) ((qhstat stats[id]).i) -#define wwval_(id) ((qhstat stats[id]).r) -#if qh_KEEPstatistics -#define zval_(id) ((qhstat stats[id]).i) -#define wval_(id) ((qhstat stats[id]).r) -#else -#define zval_(id) qhstat tempi -#define wval_(id) qhstat tempr -#endif - -/*-<a href="qh-stat.htm#TOC" - >--------------------------------</a><a name="zmax_">-</a> - - zmax_( id, val ), wmax_( id, value ) - maximize id with val -*/ -#define wwmax_(id, val) {MAYdebugx; maximize_(qhstat stats[id].r,(val));} -#if qh_KEEPstatistics -#define zmax_(id, val) {MAYdebugx; maximize_(qhstat stats[id].i,(val));} -#define wmax_(id, val) {MAYdebugx; maximize_(qhstat stats[id].r,(val));} -#else -#define zmax_(id, val) {} -#define wmax_(id, val) {} -#endif - -/*-<a href="qh-stat.htm#TOC" - >--------------------------------</a><a name="zmin_">-</a> - - zmin_( id, val ), wmin_( id, value ) - minimize id with val -*/ -#if qh_KEEPstatistics -#define zmin_(id, val) {MAYdebugx; minimize_(qhstat stats[id].i,(val));} -#define wmin_(id, val) {MAYdebugx; minimize_(qhstat stats[id].r,(val));} -#else -#define zmin_(id, val) {} -#define wmin_(id, val) {} -#endif - -/*================== stat.h types ==============*/ - - -/*-<a href="qh-stat.htm#TOC" - >--------------------------------</a><a name="intrealT">-</a> - - intrealT - union of integer and real, used for statistics -*/ -typedef union intrealT intrealT; /* union of int and realT */ -union intrealT { - int i; - realT r; -}; - -/*-<a href="qh-stat.htm#TOC" - >--------------------------------</a><a name="qhstat">-</a> - - qhstat - global data structure for statistics - - notes: - access to qh_qhstat is via the "qhstat" macro. There are two choices - qh_QHpointer = 1 access globals via a pointer - enables qh_saveqhull() and qh_restoreqhull() - = 0 qh_qhstat is a static data structure - only one instance of qhull() can be active at a time - default value - qh_QHpointer is defined in qhull.h - - allocated in stat.c -*/ -typedef struct qhstatT qhstatT; -#if qh_QHpointer -#define qhstat qh_qhstat-> -extern qhstatT *qh_qhstat; -#else -#define qhstat qh_qhstat. -extern qhstatT qh_qhstat; -#endif -struct qhstatT { - intrealT stats[ZEND]; /* integer and real statistics */ - unsigned char id[ZEND+10]; /* id's in print order */ - char *doc[ZEND]; /* array of documentation strings */ - short int count[ZEND]; /* -1 if none, else index of count to use */ - char type[ZEND]; /* type, see ztypes above */ - char printed[ZEND]; /* true, if statistic has been printed */ - intrealT init[ZTYPEend]; /* initial values by types, set initstatistics */ - - int next; /* next index for zdef_ */ - int precision; /* index for precision problems */ - int vridges; /* index for Voronoi ridges */ - int tempi; - realT tempr; -}; - -/*========== function prototypes ===========*/ - -void qh_allstatA(void); -void qh_allstatB(void); -void qh_allstatC(void); -void qh_allstatD(void); -void qh_allstatE(void); -void qh_allstatE2(void); -void qh_allstatF(void); -void qh_allstatG(void); -void qh_allstatH(void); -void qh_allstatI(void); -void qh_allstatistics (void); -void qh_collectstatistics (void); -void qh_freestatistics (void); -void qh_initstatistics (void); -boolT qh_newstats (int index, int *nextindex); -boolT qh_nostatistic (int i); -void qh_printallstatistics (FILE *fp, char *string); -void qh_printstatistics (FILE *fp, char *string); -void qh_printstatlevel (FILE *fp, int id, int start); -void qh_printstats (FILE *fp, int index, int *nextindex); -realT qh_stddev (int num, realT tot, realT tot2, realT *ave); - -#endif /* qhDEFstat */ diff --git a/extern/qhull/include/qhull/user.h b/extern/qhull/include/qhull/user.h deleted file mode 100644 index 79558967a52..00000000000 --- a/extern/qhull/include/qhull/user.h +++ /dev/null @@ -1,762 +0,0 @@ -/*<html><pre> -<a href="qh-user.htm" - >-------------------------------</a><a name="TOP">-</a> - - user.h - user redefinable constants - - see qh-user.htm. see COPYING for copyright information. - - before reading any code, review qhull.h for data structure definitions and - the "qh" macro. -*/ - -#ifndef qhDEFuser -#define qhDEFuser 1 - -/*============= data types and configuration macros ==========*/ - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="realT">-</a> - - realT - set the size of floating point numbers - - qh_REALdigits - maximimum number of significant digits - - qh_REAL_1, qh_REAL_2n, qh_REAL_3n - format strings for printf - - qh_REALmax, qh_REALmin - maximum and minimum (near zero) values - - qh_REALepsilon - machine roundoff. Maximum roundoff error for addition and multiplication. - - notes: - Select whether to store floating point numbers in single precision (float) - or double precision (double). - - Use 'float' to save about 8% in time and 25% in space. This is particularly - help if high-d where convex hulls are space limited. Using 'float' also - reduces the printed size of Qhull's output since numbers have 8 digits of - precision. - - Use 'double' when greater arithmetic precision is needed. This is needed - for Delaunay triangulations and Voronoi diagrams when you are not merging - facets. - - If 'double' gives insufficient precision, your data probably includes - degeneracies. If so you should use facet merging (done by default) - or exact arithmetic (see imprecision section of manual, qh-impre.htm). - You may also use option 'Po' to force output despite precision errors. - - You may use 'long double', but many format statements need to be changed - and you may need a 'long double' square root routine. S. Grundmann - (sg@eeiwzb.et.tu-dresden.de) has done this. He reports that the code runs - much slower with little gain in precision. - - WARNING: on some machines, int f(){realT a= REALmax;return (a == REALmax);} - returns False. Use (a > REALmax/2) instead of (a == REALmax). - - REALfloat = 1 all numbers are 'float' type - = 0 all numbers are 'double' type -*/ -#define REALfloat 0 - -#if (REALfloat == 1) -#define realT float -#define REALmax FLT_MAX -#define REALmin FLT_MIN -#define REALepsilon FLT_EPSILON -#define qh_REALdigits 8 /* maximum number of significant digits */ -#define qh_REAL_1 "%6.8g " -#define qh_REAL_2n "%6.8g %6.8g\n" -#define qh_REAL_3n "%6.8g %6.8g %6.8g\n" - -#elif (REALfloat == 0) -#define realT double -#define REALmax DBL_MAX -#define REALmin DBL_MIN -#define REALepsilon DBL_EPSILON -#define qh_REALdigits 16 /* maximum number of significant digits */ -#define qh_REAL_1 "%6.16g " -#define qh_REAL_2n "%6.16g %6.16g\n" -#define qh_REAL_3n "%6.16g %6.16g %6.16g\n" - -#else -#error unknown float option -#endif - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="CPUclock">-</a> - - qh_CPUclock - define the clock() function for reporting the total time spent by Qhull - returns CPU ticks as a 'long int' - qh_CPUclock is only used for reporting the total time spent by Qhull - - qh_SECticks - the number of clock ticks per second - - notes: - looks for CLOCKS_PER_SEC, CLOCKS_PER_SECOND, or assumes microseconds - to define a custom clock, set qh_CLOCKtype to 0 - - if your system does not use clock() to return CPU ticks, replace - qh_CPUclock with the corresponding function. It is converted - to unsigned long to prevent wrap-around during long runs. - - - Set qh_CLOCKtype to - - 1 for CLOCKS_PER_SEC, CLOCKS_PER_SECOND, or microsecond - Note: may fail if more than 1 hour elapsed time - - 2 use qh_clock() with POSIX times() (see global.c) -*/ -#define qh_CLOCKtype 1 /* change to the desired number */ - -#if (qh_CLOCKtype == 1) - -#if defined (CLOCKS_PER_SECOND) -#define qh_CPUclock ((unsigned long)clock()) /* return CPU clock */ -#define qh_SECticks CLOCKS_PER_SECOND - -#elif defined (CLOCKS_PER_SEC) -#define qh_CPUclock ((unsigned long)clock()) /* return CPU clock */ -#define qh_SECticks CLOCKS_PER_SEC - -#elif defined (CLK_TCK) -#define qh_CPUclock ((unsigned long)clock()) /* return CPU clock */ -#define qh_SECticks CLK_TCK - -#else -#define qh_CPUclock ((unsigned long)clock()) /* return CPU clock */ -#define qh_SECticks 1E6 -#endif - -#elif (qh_CLOCKtype == 2) -#define qh_CPUclock qh_clock() /* return CPU clock */ -#define qh_SECticks 100 - -#else /* qh_CLOCKtype == ? */ -#error unknown clock option -#endif - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="RANDOM">-</a> - - qh_RANDOMtype, qh_RANDOMmax, qh_RANDOMseed - define random number generator - - qh_RANDOMint generates a random integer between 0 and qh_RANDOMmax. - qh_RANDOMseed sets the random number seed for qh_RANDOMint - - Set qh_RANDOMtype (default 5) to: - 1 for random() with 31 bits (UCB) - 2 for rand() with RAND_MAX or 15 bits (system 5) - 3 for rand() with 31 bits (Sun) - 4 for lrand48() with 31 bits (Solaris) - 5 for qh_rand() with 31 bits (included with Qhull) - - notes: - Random numbers are used by rbox to generate point sets. Random - numbers are used by Qhull to rotate the input ('QRn' option), - simulate a randomized algorithm ('Qr' option), and to simulate - roundoff errors ('Rn' option). - - Random number generators differ between systems. Most systems provide - rand() but the period varies. The period of rand() is not critical - since qhull does not normally use random numbers. - - The default generator is Park & Miller's minimal standard random - number generator [CACM 31:1195 '88]. It is included with Qhull. - - If qh_RANDOMmax is wrong, qhull will report a warning and Geomview - output will likely be invisible. -*/ -#define qh_RANDOMtype 5 /* *** change to the desired number *** */ - -#if (qh_RANDOMtype == 1) -#define qh_RANDOMmax ((realT)0x7fffffffUL) /* 31 bits, random()/MAX */ -#define qh_RANDOMint random() -#define qh_RANDOMseed_(seed) srandom(seed); - -#elif (qh_RANDOMtype == 2) -#ifdef RAND_MAX -#define qh_RANDOMmax ((realT)RAND_MAX) -#else -#define qh_RANDOMmax ((realT)32767) /* 15 bits (System 5) */ -#endif -#define qh_RANDOMint rand() -#define qh_RANDOMseed_(seed) srand((unsigned)seed); - -#elif (qh_RANDOMtype == 3) -#define qh_RANDOMmax ((realT)0x7fffffffUL) /* 31 bits, Sun */ -#define qh_RANDOMint rand() -#define qh_RANDOMseed_(seed) srand((unsigned)seed); - -#elif (qh_RANDOMtype == 4) -#define qh_RANDOMmax ((realT)0x7fffffffUL) /* 31 bits, lrand38()/MAX */ -#define qh_RANDOMint lrand48() -#define qh_RANDOMseed_(seed) srand48(seed); - -#elif (qh_RANDOMtype == 5) -#define qh_RANDOMmax ((realT)2147483646UL) /* 31 bits, qh_rand/MAX */ -#define qh_RANDOMint qh_rand() -#define qh_RANDOMseed_(seed) qh_srand(seed); -/* unlike rand(), never returns 0 */ - -#else -#error: unknown random option -#endif - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="ORIENTclock">-</a> - - qh_ORIENTclock - 0 for inward pointing normals by Geomview convention -*/ -#define qh_ORIENTclock 0 - - -/*========= performance related constants =========*/ - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="HASHfactor">-</a> - - qh_HASHfactor - total hash slots / used hash slots. Must be at least 1.1. - - notes: - =2 for at worst 50% occupancy for qh hash_table and normally 25% occupancy -*/ -#define qh_HASHfactor 2 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="VERIFYdirect">-</a> - - qh_VERIFYdirect - with 'Tv' verify all points against all facets if op count is smaller - - notes: - if greater, calls qh_check_bestdist() instead -*/ -#define qh_VERIFYdirect 1000000 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="INITIALsearch">-</a> - - qh_INITIALsearch - if qh_INITIALmax, search points up to this dimension -*/ -#define qh_INITIALsearch 6 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="INITIALmax">-</a> - - qh_INITIALmax - if dim >= qh_INITIALmax, use min/max coordinate points for initial simplex - - notes: - from points with non-zero determinants - use option 'Qs' to override (much slower) -*/ -#define qh_INITIALmax 8 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="JOGGLEdefault">-</a> - - qh_JOGGLEdefault - default qh.JOGGLEmax is qh.DISTround * qh_JOGGLEdefault - - notes: - rbox s r 100 | qhull QJ1e-15 QR0 generates 90% faults at distround 7e-16 - rbox s r 100 | qhull QJ1e-14 QR0 generates 70% faults - rbox s r 100 | qhull QJ1e-13 QR0 generates 35% faults - rbox s r 100 | qhull QJ1e-12 QR0 generates 8% faults - rbox s r 100 | qhull QJ1e-11 QR0 generates 1% faults - rbox s r 100 | qhull QJ1e-10 QR0 generates 0% faults - rbox 1000 W0 | qhull QJ1e-12 QR0 generates 86% faults - rbox 1000 W0 | qhull QJ1e-11 QR0 generates 20% faults - rbox 1000 W0 | qhull QJ1e-10 QR0 generates 2% faults - the later have about 20 points per facet, each of which may interfere - - pick a value large enough to avoid retries on most inputs -*/ -#define qh_JOGGLEdefault 30000.0 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="JOGGLEincrease">-</a> - - qh_JOGGLEincrease - factor to increase qh.JOGGLEmax on qh_JOGGLEretry or qh_JOGGLEagain -*/ -#define qh_JOGGLEincrease 10.0 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="JOGGLEretry">-</a> - - qh_JOGGLEretry - if ZZretry = qh_JOGGLEretry, increase qh.JOGGLEmax - - notes: - try twice at the original value in case of bad luck the first time -*/ -#define qh_JOGGLEretry 2 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="JOGGLEagain">-</a> - - qh_JOGGLEagain - every following qh_JOGGLEagain, increase qh.JOGGLEmax - - notes: - 1 is OK since it's already failed qh_JOGGLEretry times -*/ -#define qh_JOGGLEagain 1 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="JOGGLEmaxincrease">-</a> - - qh_JOGGLEmaxincrease - maximum qh.JOGGLEmax due to qh_JOGGLEincrease - relative to qh.MAXwidth - - notes: - qh.joggleinput will retry at this value until qh_JOGGLEmaxretry -*/ -#define qh_JOGGLEmaxincrease 1e-2 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="JOGGLEmaxretry">-</a> - - qh_JOGGLEmaxretry - stop after qh_JOGGLEmaxretry attempts -*/ -#define qh_JOGGLEmaxretry 100 - -/*========= memory constants =========*/ - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="MEMalign">-</a> - - qh_MEMalign - memory alignment for qh_meminitbuffers() in global.c - - notes: - to avoid bus errors, memory allocation must consider alignment requirements. - malloc() automatically takes care of alignment. Since mem.c manages - its own memory, we need to explicitly specify alignment in - qh_meminitbuffers(). - - A safe choice is sizeof(double). sizeof(float) may be used if doubles - do not occur in data structures and pointers are the same size. Be careful - of machines (e.g., DEC Alpha) with large pointers. - - If using gcc, best alignment is - #define qh_MEMalign fmax_(__alignof__(realT),__alignof__(void *)) -*/ -#define qh_MEMalign fmax_(sizeof(realT), sizeof(void *)) - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="MEMbufsize">-</a> - - qh_MEMbufsize - size of additional memory buffers - - notes: - used for qh_meminitbuffers() in global.c -*/ -#define qh_MEMbufsize 0x10000 /* allocate 64K memory buffers */ - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="MEMinitbuf">-</a> - - qh_MEMinitbuf - size of initial memory buffer - - notes: - use for qh_meminitbuffers() in global.c -*/ -#define qh_MEMinitbuf 0x20000 /* initially allocate 128K buffer */ - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="INFINITE">-</a> - - qh_INFINITE - on output, indicates Voronoi center at infinity -*/ -#define qh_INFINITE -10.101 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="DEFAULTbox">-</a> - - qh_DEFAULTbox - default box size (Geomview expects 0.5) -*/ -#define qh_DEFAULTbox 0.5 - -/*======= conditional compilation ============================*/ - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="compiler">-</a> - - __cplusplus - defined by C++ compilers - - __MSC_VER - defined by Microsoft Visual C++ - - __MWERKS__ && __POWERPC__ - defined by Metrowerks when compiling for the Power Macintosh - - __STDC__ - defined for strict ANSI C -*/ - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="COMPUTEfurthest">-</a> - - qh_COMPUTEfurthest - compute furthest distance to an outside point instead of storing it with the facet - =1 to compute furthest - - notes: - computing furthest saves memory but costs time - about 40% more distance tests for partitioning - removes facet->furthestdist -*/ -#define qh_COMPUTEfurthest 0 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="KEEPstatistics">-</a> - - qh_KEEPstatistics - =0 removes most of statistic gathering and reporting - - notes: - if 0, code size is reduced by about 4%. -*/ -#define qh_KEEPstatistics 1 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="MAXoutside">-</a> - - qh_MAXoutside - record outer plane for each facet - =1 to record facet->maxoutside - - notes: - this takes a realT per facet and slightly slows down qhull - it produces better outer planes for geomview output -*/ -#define qh_MAXoutside 1 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="NOmerge">-</a> - - qh_NOmerge - disables facet merging if defined - - notes: - This saves about 10% space. - - Unless 'Q0' - qh_NOmerge sets 'QJ' to avoid precision errors - - #define qh_NOmerge - - see: - <a href="mem.h#NOmem">qh_NOmem</a> in mem.c - - see user.c/user_eg.c for removing io.o -*/ - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="NOtrace">-</a> - - qh_NOtrace - no tracing if defined - - notes: - This saves about 5% space. - - #define qh_NOtrace -*/ - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="QHpointer">-</a> - - qh_QHpointer - access global data with pointer or static structure - - qh_QHpointer = 1 access globals via a pointer to allocated memory - enables qh_saveqhull() and qh_restoreqhull() - costs about 8% in time and 2% in space - - = 0 qh_qh and qh_qhstat are static data structures - only one instance of qhull() can be active at a time - default value - - notes: - all global variables for qhull are in qh, qhmem, and qhstat - qh is defined in qhull.h - qhmem is defined in mem.h - qhstat is defined in stat.h - - see: - user_eg.c for an example -*/ -#define qh_QHpointer 0 -#if 0 /* sample code */ - qhT *oldqhA, *oldqhB; - - exitcode= qh_new_qhull (dim, numpoints, points, ismalloc, - flags, outfile, errfile); - /* use results from first call to qh_new_qhull */ - oldqhA= qh_save_qhull(); - exitcode= qh_new_qhull (dimB, numpointsB, pointsB, ismalloc, - flags, outfile, errfile); - /* use results from second call to qh_new_qhull */ - oldqhB= qh_save_qhull(); - qh_restore_qhull (&oldqhA); - /* use results from first call to qh_new_qhull */ - qh_freeqhull (qh_ALL); /* frees all memory used by first call */ - qh_restore_qhull (&oldqhB); - /* use results from second call to qh_new_qhull */ - qh_freeqhull (!qh_ALL); /* frees long memory used by second call */ - qh_memfreeshort (&curlong, &totlong); /* frees short memory and memory allocator */ -#endif - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="QUICKhelp">-</a> - - qh_QUICKhelp - =1 to use abbreviated help messages, e.g., for degenerate inputs -*/ -#define qh_QUICKhelp 0 - -/* ============ -merge constants- ==================== - - These constants effect facet merging. You probably will not need - to modify these. They effect the performance of facet merging. -*/ - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="DIMmergeVertex">-</a> - - qh_DIMmergeVertex - max dimension for vertex merging (it is not effective in high-d) -*/ -#define qh_DIMmergeVertex 6 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="DIMreduceBuild">-</a> - - qh_DIMreduceBuild - max dimension for vertex reduction during build (slow in high-d) -*/ -#define qh_DIMreduceBuild 5 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="BESTcentrum">-</a> - - qh_BESTcentrum - if > 2*dim+n vertices, qh_findbestneighbor() tests centrums (faster) - else, qh_findbestneighbor() tests all vertices (much better merges) - - qh_BESTcentrum2 - if qh_BESTcentrum2 * DIM3 + BESTcentrum < #vertices tests centrums -*/ -#define qh_BESTcentrum 20 -#define qh_BESTcentrum2 2 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="BESTnonconvex">-</a> - - qh_BESTnonconvex - if > dim+n neighbors, qh_findbestneighbor() tests nonconvex ridges. - - notes: - It is needed because qh_findbestneighbor is slow for large facets -*/ -#define qh_BESTnonconvex 15 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="MAXnewmerges">-</a> - - qh_MAXnewmerges - if >n newmerges, qh_merge_nonconvex() calls qh_reducevertices_centrums. - - notes: - It is needed because postmerge can merge many facets at once -*/ -#define qh_MAXnewmerges 2 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="MAXnewcentrum">-</a> - - qh_MAXnewcentrum - if <= dim+n vertices (n approximates the number of merges), - reset the centrum in qh_updatetested() and qh_mergecycle_facets() - - notes: - needed to reduce cost and because centrums may move too much if - many vertices in high-d -*/ -#define qh_MAXnewcentrum 5 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="COPLANARratio">-</a> - - qh_COPLANARratio - for 3-d+ merging, qh.MINvisible is n*premerge_centrum - - notes: - for non-merging, it's DISTround -*/ -#define qh_COPLANARratio 3 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="DISToutside">-</a> - - qh_DISToutside - When is a point clearly outside of a facet? - Stops search in qh_findbestnew or qh_partitionall - qh_findbest uses qh.MINoutside since since it is only called if no merges. - - notes: - 'Qf' always searches for best facet - if !qh.MERGING, same as qh.MINoutside. - if qh_USEfindbestnew, increase value since neighboring facets may be ill-behaved - [Note: Zdelvertextot occurs normally with interior points] - RBOX 1000 s Z1 G1e-13 t1001188774 | QHULL Tv - When there is a sharp edge, need to move points to a - clearly good facet; otherwise may be lost in another partitioning. - if too big then O(n^2) behavior for partitioning in cone - if very small then important points not processed - Needed in qh_partitionall for - RBOX 1000 s Z1 G1e-13 t1001032651 | QHULL Tv - Needed in qh_findbestnew for many instances of - RBOX 1000 s Z1 G1e-13 t | QHULL Tv - - See: - qh_DISToutside -- when is a point clearly outside of a facet - qh_SEARCHdist -- when is facet coplanar with the best facet? - qh_USEfindbestnew -- when to use qh_findbestnew for qh_partitionpoint() -*/ -#define qh_DISToutside ((qh_USEfindbestnew ? 2 : 1) * \ - fmax_((qh MERGING ? 2 : 1)*qh MINoutside, qh max_outside)) - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="RATIOnearinside">-</a> - - qh_RATIOnearinside - ratio of qh.NEARinside to qh.ONEmerge for retaining inside points for - qh_check_maxout(). - - notes: - This is overkill since do not know the correct value. - It effects whether 'Qc' reports all coplanar points - Not used for 'd' since non-extreme points are coplanar -*/ -#define qh_RATIOnearinside 5 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="SEARCHdist">-</a> - - qh_SEARCHdist - When is a facet coplanar with the best facet? - qh_findbesthorizon: all coplanar facets of the best facet need to be searched. - - See: - qh_DISToutside -- when is a point clearly outside of a facet - qh_SEARCHdist -- when is facet coplanar with the best facet? - qh_USEfindbestnew -- when to use qh_findbestnew for qh_partitionpoint() -*/ -#define qh_SEARCHdist ((qh_USEfindbestnew ? 2 : 1) * \ - (qh max_outside + 2 * qh DISTround + fmax_( qh MINvisible, qh MAXcoplanar))); - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="USEfindbestnew">-</a> - - qh_USEfindbestnew - Always use qh_findbestnew for qh_partitionpoint, otherwise use - qh_findbestnew if merged new facet or sharpnewfacets. - - See: - qh_DISToutside -- when is a point clearly outside of a facet - qh_SEARCHdist -- when is facet coplanar with the best facet? - qh_USEfindbestnew -- when to use qh_findbestnew for qh_partitionpoint() -*/ -#define qh_USEfindbestnew (zzval_(Ztotmerge) > 50) - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="WIDEcoplanar">-</a> - - qh_WIDEcoplanar - n*MAXcoplanar or n*MINvisible for a WIDEfacet - - if vertex is further than qh.WIDEfacet from the hyperplane - then its ridges are not counted in computing the area, and - the facet's centrum is frozen. - - notes: - qh.WIDEfacet= max(qh.MAXoutside,qh_WIDEcoplanar*qh.MAXcoplanar, - qh_WIDEcoplanar * qh.MINvisible); -*/ -#define qh_WIDEcoplanar 6 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="MAXnarrow">-</a> - - qh_MAXnarrow - max. cosine in initial hull that sets qh.NARROWhull - - notes: - If qh.NARROWhull, the initial partition does not make - coplanar points. If narrow, a coplanar point can be - coplanar to two facets of opposite orientations and - distant from the exact convex hull. - - Conservative estimate. Don't actually see problems until it is -1.0 -*/ -#define qh_MAXnarrow -0.99999999 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="WARNnarrow">-</a> - - qh_WARNnarrow - max. cosine in initial hull to warn about qh.NARROWhull - - notes: - this is a conservative estimate. - Don't actually see problems until it is -1.0. See qh-impre.htm -*/ -#define qh_WARNnarrow -0.999999999999999 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="ZEROdelaunay">-</a> - - qh_ZEROdelaunay - a zero Delaunay facet occurs for input sites coplanar with their convex hull - the last normal coefficient of a zero Delaunay facet is within - qh_ZEROdelaunay * qh.ANGLEround of 0 - - notes: - qh_ZEROdelaunay does not allow for joggled input ('QJ'). - - You can avoid zero Delaunay facets by surrounding the input with a box. - - Use option 'PDk:-n' to explicitly define zero Delaunay facets - k= dimension of input sites (e.g., 3 for 3-d Delaunay triangulation) - n= the cutoff for zero Delaunay facets (e.g., 'PD3:-1e-12') -*/ -#define qh_ZEROdelaunay 2 - -#endif /* qh_DEFuser */ - - - diff --git a/extern/qhull/make/msvc_7_0/qhull.vcproj b/extern/qhull/make/msvc_7_0/qhull.vcproj deleted file mode 100644 index 1b754d8e076..00000000000 --- a/extern/qhull/make/msvc_7_0/qhull.vcproj +++ /dev/null @@ -1,677 +0,0 @@ -<?xml version="1.0" encoding="Windows-1252"?> -<VisualStudioProject - ProjectType="Visual C++" - Version="7.10" - Name="qhull" - ProjectGUID="{6461F05D-4698-47AB-A8E8-1CA2ACC9948B}" - SccProjectName="" - SccLocalPath=""> - <Platforms> - <Platform - Name="Win32"/> - </Platforms> - <Configurations> - <Configuration - Name="Blender Release|Win32" - OutputDirectory="..\..\..\..\..\build\msvc_7\extern\qhull" - IntermediateDirectory="..\..\..\..\..\build\msvc_7\extern\qhull" - ConfigurationType="4" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="FALSE" - CharacterSet="2"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - InlineFunctionExpansion="1" - PreprocessorDefinitions="WIN32;NDEBUG;_LIB" - StringPooling="TRUE" - RuntimeLibrary="0" - EnableFunctionLevelLinking="TRUE" - UsePrecompiledHeader="2" - PrecompiledHeaderFile="..\..\..\..\..\build\msvc_7\extern\qhull\qhull.pch" - AssemblerListingLocation="..\..\..\..\..\build\msvc_7\extern\qhull\" - ObjectFile="..\..\..\..\..\build\msvc_7\extern\qhull\" - ProgramDataBaseFileName="..\..\..\..\..\build\msvc_7\extern\qhull\" - WarningLevel="2" - SuppressStartupBanner="TRUE"/> - <Tool - Name="VCCustomBuildTool"/> - <Tool - Name="VCLibrarianTool" - OutputFile="..\..\..\..\..\build\msvc_7\libs\extern\qhull.lib" - SuppressStartupBanner="TRUE"/> - <Tool - Name="VCMIDLTool"/> - <Tool - Name="VCPostBuildEventTool" - Description="Copying QHULL files library to lib tree." - CommandLine="ECHO Copying header files -IF NOT EXIST ..\..\..\..\..\build\msvc_7\extern\qhull\include MKDIR ..\..\..\..\..\build\msvc_7\extern\qhull\include -XCOPY /Y ..\..\include\qhull\*.h ..\..\..\..\..\build\msvc_7\extern\qhull\include -ECHO Done -"/> - <Tool - Name="VCPreBuildEventTool"/> - <Tool - Name="VCPreLinkEventTool"/> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="NDEBUG" - Culture="1033"/> - <Tool - Name="VCWebServiceProxyGeneratorTool"/> - <Tool - Name="VCXMLDataGeneratorTool"/> - <Tool - Name="VCManagedWrapperGeneratorTool"/> - <Tool - Name="VCAuxiliaryManagedWrapperGeneratorTool"/> - </Configuration> - <Configuration - Name="Blender Debug|Win32" - OutputDirectory="..\..\..\..\..\build\msvc_7\extern\qhull\debug" - IntermediateDirectory="..\..\..\..\..\build\msvc_7\extern\qhull\debug" - ConfigurationType="4" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="FALSE" - CharacterSet="2"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="WIN32;_DEBUG;_LIB" - BasicRuntimeChecks="3" - RuntimeLibrary="1" - UsePrecompiledHeader="2" - PrecompiledHeaderFile="..\..\..\..\..\build\msvc_7\extern\qhull\debug\qhull.pch" - AssemblerListingLocation="..\..\..\..\..\build\msvc_7\extern\qhull\debug\" - ObjectFile="..\..\..\..\..\build\msvc_7\extern\qhull\debug\" - ProgramDataBaseFileName="..\..\..\..\..\build\msvc_7\extern\qhull\debug\" - WarningLevel="2" - SuppressStartupBanner="TRUE" - DebugInformationFormat="3"/> - <Tool - Name="VCCustomBuildTool"/> - <Tool - Name="VCLibrarianTool" - OutputFile="..\..\..\..\..\build\msvc_7\libs\extern\debug\qhull.lib" - SuppressStartupBanner="TRUE"/> - <Tool - Name="VCMIDLTool"/> - <Tool - Name="VCPostBuildEventTool" - Description="Copying QHULL files library (debug target) to lib tree." - CommandLine="ECHO Copying header files -IF NOT EXIST ..\..\..\..\..\build\msvc_7\extern\qhull\include MKDIR ..\..\..\..\..\build\msvc_7\extern\qhull\include -XCOPY /Y ..\..\include\qhull\*.h ..\..\..\..\..\build\msvc_7\extern\qhull\include -ECHO Done -"/> - <Tool - Name="VCPreBuildEventTool"/> - <Tool - Name="VCPreLinkEventTool"/> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="_DEBUG" - Culture="1033"/> - <Tool - Name="VCWebServiceProxyGeneratorTool"/> - <Tool - Name="VCXMLDataGeneratorTool"/> - <Tool - Name="VCManagedWrapperGeneratorTool"/> - <Tool - Name="VCAuxiliaryManagedWrapperGeneratorTool"/> - </Configuration> - <Configuration - Name="3D Plugin Release|Win32" - OutputDirectory="..\..\..\..\..\build\msvc_7\extern\qhull\mtdll" - IntermediateDirectory="..\..\..\..\..\build\msvc_7\extern\qhull\mtdll" - ConfigurationType="4" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="FALSE" - CharacterSet="2"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - InlineFunctionExpansion="1" - PreprocessorDefinitions="WIN32;NDEBUG;_LIB" - StringPooling="TRUE" - RuntimeLibrary="2" - EnableFunctionLevelLinking="TRUE" - UsePrecompiledHeader="2" - PrecompiledHeaderFile="..\..\..\..\..\build\msvc_7\extern\qhull\mtdll\qhull.pch" - AssemblerListingLocation="..\..\..\..\..\build\msvc_7\extern\qhull\mtdll\" - ObjectFile="..\..\..\..\..\build\msvc_7\extern\qhull\mtdll\" - ProgramDataBaseFileName="..\..\..\..\..\build\msvc_7\extern\qhull\mtdll\" - WarningLevel="2" - SuppressStartupBanner="TRUE"/> - <Tool - Name="VCCustomBuildTool"/> - <Tool - Name="VCLibrarianTool" - OutputFile="..\..\..\..\..\build\msvc_7\libs\extern\mtdll\qhull.lib" - SuppressStartupBanner="TRUE"/> - <Tool - Name="VCMIDLTool"/> - <Tool - Name="VCPostBuildEventTool" - Description="Copying QHULL files library to lib tree." - CommandLine="ECHO Copying header files -IF NOT EXIST ..\..\..\..\..\build\msvc_7\extern\qhull\include MKDIR ..\..\..\..\..\build\msvc_7\extern\qhull\include -XCOPY /Y ..\..\include\qhull\*.h ..\..\..\..\..\build\msvc_7\extern\qhull\include -ECHO Done -"/> - <Tool - Name="VCPreBuildEventTool"/> - <Tool - Name="VCPreLinkEventTool"/> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="NDEBUG" - Culture="1033"/> - <Tool - Name="VCWebServiceProxyGeneratorTool"/> - <Tool - Name="VCXMLDataGeneratorTool"/> - <Tool - Name="VCManagedWrapperGeneratorTool"/> - <Tool - Name="VCAuxiliaryManagedWrapperGeneratorTool"/> - </Configuration> - <Configuration - Name="3D Plugin Debug|Win32" - OutputDirectory="..\..\..\..\..\build\msvc_7\extern\qhull\mtdll\debug" - IntermediateDirectory="..\..\..\..\..\build\msvc_7\extern\qhull\mtdll\debug" - ConfigurationType="4" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="FALSE" - CharacterSet="2"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="WIN32;_DEBUG;_LIB" - BasicRuntimeChecks="3" - RuntimeLibrary="3" - UsePrecompiledHeader="2" - PrecompiledHeaderFile="..\..\..\..\..\build\msvc_7\extern\qhull\mtdll\debug\qhull.pch" - AssemblerListingLocation="..\..\..\..\..\build\msvc_7\extern\qhull\mtdll\debug\" - ObjectFile="..\..\..\..\..\build\msvc_7\extern\qhull\mtdll\debug\" - ProgramDataBaseFileName="..\..\..\..\..\build\msvc_7\extern\qhull\mtdll\debug\" - WarningLevel="2" - SuppressStartupBanner="TRUE" - DebugInformationFormat="3"/> - <Tool - Name="VCCustomBuildTool"/> - <Tool - Name="VCLibrarianTool" - OutputFile="..\..\..\..\..\build\msvc_7\libs\extern\mtdll\debug\qhull.lib" - SuppressStartupBanner="TRUE"/> - <Tool - Name="VCMIDLTool"/> - <Tool - Name="VCPostBuildEventTool" - Description="Copying QHULL files library (debug target) to lib tree." - CommandLine="ECHO Copying header files -IF NOT EXIST ..\..\..\..\..\build\msvc_7\extern\qhull\include MKDIR ..\..\..\..\..\build\msvc_7\extern\qhull\include -XCOPY /Y ..\..\include\qhull\*.h ..\..\..\..\..\build\msvc_7\extern\qhull\include -ECHO Done -"/> - <Tool - Name="VCPreBuildEventTool"/> - <Tool - Name="VCPreLinkEventTool"/> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="_DEBUG" - Culture="1033"/> - <Tool - Name="VCWebServiceProxyGeneratorTool"/> - <Tool - Name="VCXMLDataGeneratorTool"/> - <Tool - Name="VCManagedWrapperGeneratorTool"/> - <Tool - Name="VCAuxiliaryManagedWrapperGeneratorTool"/> - </Configuration> - </Configurations> - <References> - </References> - <Files> - <Filter - Name="Source Files" - Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"> - <File - RelativePath="..\..\src\geom.c"> - <FileConfiguration - Name="Blender Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="Blender Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - </File> - <File - RelativePath="..\..\src\geom2.c"> - <FileConfiguration - Name="Blender Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="Blender Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - </File> - <File - RelativePath="..\..\src\global.c"> - <FileConfiguration - Name="Blender Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="Blender Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - </File> - <File - RelativePath="..\..\src\io.c"> - <FileConfiguration - Name="Blender Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="Blender Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - </File> - <File - RelativePath="..\..\src\mem.c"> - <FileConfiguration - Name="Blender Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="Blender Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - </File> - <File - RelativePath="..\..\src\merge.c"> - <FileConfiguration - Name="Blender Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="Blender Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - </File> - <File - RelativePath="..\..\src\poly.c"> - <FileConfiguration - Name="Blender Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="Blender Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - </File> - <File - RelativePath="..\..\src\poly2.c"> - <FileConfiguration - Name="Blender Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="Blender Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - </File> - <File - RelativePath="..\..\src\qhull.c"> - <FileConfiguration - Name="Blender Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="Blender Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - </File> - <File - RelativePath="..\..\src\qset.c"> - <FileConfiguration - Name="Blender Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="Blender Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - </File> - <File - RelativePath="..\..\src\stat.c"> - <FileConfiguration - Name="Blender Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="Blender Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - </File> - <File - RelativePath="..\..\src\user.c"> - <FileConfiguration - Name="Blender Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="Blender Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - </File> - </Filter> - <Filter - Name="Header Files" - Filter="h;hpp;hxx;hm;inl"> - <File - RelativePath="..\..\src\geom.h"> - </File> - <File - RelativePath="..\..\src\io.h"> - </File> - <File - RelativePath="..\..\src\mem.h"> - </File> - <File - RelativePath="..\..\src\merge.h"> - </File> - <File - RelativePath="..\..\src\poly.h"> - </File> - <File - RelativePath="..\..\src\qhull.h"> - </File> - <File - RelativePath="..\..\src\qhull_a.h"> - </File> - <File - RelativePath="..\..\src\qset.h"> - </File> - <File - RelativePath="..\..\src\stat.h"> - </File> - <File - RelativePath="..\..\src\user.h"> - </File> - </Filter> - </Files> - <Globals> - </Globals> -</VisualStudioProject> diff --git a/extern/qhull/make/msvc_9_0/qhull.vcproj b/extern/qhull/make/msvc_9_0/qhull.vcproj deleted file mode 100644 index fe5b3e806b6..00000000000 --- a/extern/qhull/make/msvc_9_0/qhull.vcproj +++ /dev/null @@ -1,877 +0,0 @@ -<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9,00"
- Name="EXT_qhull"
- ProjectGUID="{6461F05D-4698-47AB-A8E8-1CA2ACC9948B}"
- RootNamespace="qhull"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Blender Release|Win32"
- OutputDirectory="..\..\..\..\..\build\msvc_9\extern\qhull"
- IntermediateDirectory="..\..\..\..\..\build\msvc_9\extern\qhull"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
- StringPooling="true"
- RuntimeLibrary="0"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- PrecompiledHeaderFile="..\..\..\..\..\build\msvc_9\extern\qhull\qhull.pch"
- AssemblerListingLocation="..\..\..\..\..\build\msvc_9\extern\qhull\"
- ObjectFile="..\..\..\..\..\build\msvc_9\extern\qhull\"
- ProgramDataBaseFileName="..\..\..\..\..\build\msvc_9\extern\qhull\"
- WarningLevel="2"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="..\..\..\..\..\build\msvc_9\libs\extern\qhull.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying QHULL files library to lib tree."
- CommandLine="ECHO Copying header files
IF NOT EXIST ..\..\..\..\..\build\msvc_9\extern\qhull\include MKDIR ..\..\..\..\..\build\msvc_9\extern\qhull\include
XCOPY /Y ..\..\include\qhull\*.h ..\..\..\..\..\build\msvc_9\extern\qhull\include
ECHO Done
"
- />
- </Configuration>
- <Configuration
- Name="Blender Debug|Win32"
- OutputDirectory="..\..\..\..\..\build\msvc_9\extern\qhull\debug"
- IntermediateDirectory="..\..\..\..\..\build\msvc_9\extern\qhull\debug"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- UsePrecompiledHeader="0"
- PrecompiledHeaderFile="..\..\..\..\..\build\msvc_9\extern\qhull\debug\qhull.pch"
- AssemblerListingLocation="..\..\..\..\..\build\msvc_9\extern\qhull\debug\"
- ObjectFile="..\..\..\..\..\build\msvc_9\extern\qhull\debug\"
- ProgramDataBaseFileName="..\..\..\..\..\build\msvc_9\extern\qhull\debug\"
- WarningLevel="2"
- SuppressStartupBanner="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="_DEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="..\..\..\..\..\build\msvc_9\libs\extern\debug\qhull.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying QHULL files library (debug target) to lib tree."
- CommandLine="ECHO Copying header files
IF NOT EXIST ..\..\..\..\..\build\msvc_9\extern\qhull\include MKDIR ..\..\..\..\..\build\msvc_9\extern\qhull\include
XCOPY /Y ..\..\include\qhull\*.h ..\..\..\..\..\build\msvc_9\extern\qhull\include
ECHO Done
"
- />
- </Configuration>
- <Configuration
- Name="3D Plugin Release|Win32"
- OutputDirectory="..\..\..\..\..\build\msvc_9\extern\qhull\mtdll"
- IntermediateDirectory="..\..\..\..\..\build\msvc_9\extern\qhull\mtdll"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
- StringPooling="true"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- PrecompiledHeaderFile="..\..\..\..\..\build\msvc_9\extern\qhull\mtdll\qhull.pch"
- AssemblerListingLocation="..\..\..\..\..\build\msvc_9\extern\qhull\mtdll\"
- ObjectFile="..\..\..\..\..\build\msvc_9\extern\qhull\mtdll\"
- ProgramDataBaseFileName="..\..\..\..\..\build\msvc_9\extern\qhull\mtdll\"
- WarningLevel="2"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="..\..\..\..\..\build\msvc_9\libs\extern\mtdll\qhull.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying QHULL files library to lib tree."
- CommandLine="ECHO Copying header files
IF NOT EXIST ..\..\..\..\..\build\msvc_9\extern\qhull\include MKDIR ..\..\..\..\..\build\msvc_9\extern\qhull\include
XCOPY /Y ..\..\include\qhull\*.h ..\..\..\..\..\build\msvc_9\extern\qhull\include
ECHO Done
"
- />
- </Configuration>
- <Configuration
- Name="3D Plugin Debug|Win32"
- OutputDirectory="..\..\..\..\..\build\msvc_9\extern\qhull\mtdll\debug"
- IntermediateDirectory="..\..\..\..\..\build\msvc_9\extern\qhull\mtdll\debug"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- PrecompiledHeaderFile="..\..\..\..\..\build\msvc_9\extern\qhull\mtdll\debug\qhull.pch"
- AssemblerListingLocation="..\..\..\..\..\build\msvc_9\extern\qhull\mtdll\debug\"
- ObjectFile="..\..\..\..\..\build\msvc_9\extern\qhull\mtdll\debug\"
- ProgramDataBaseFileName="..\..\..\..\..\build\msvc_9\extern\qhull\mtdll\debug\"
- WarningLevel="2"
- SuppressStartupBanner="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="_DEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="..\..\..\..\..\build\msvc_9\libs\extern\mtdll\debug\qhull.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying QHULL files library (debug target) to lib tree."
- CommandLine="ECHO Copying header files
IF NOT EXIST ..\..\..\..\..\build\msvc_9\extern\qhull\include MKDIR ..\..\..\..\..\build\msvc_9\extern\qhull\include
XCOPY /Y ..\..\include\qhull\*.h ..\..\..\..\..\build\msvc_9\extern\qhull\include
ECHO Done
"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
- >
- <File
- RelativePath="..\..\src\geom.c"
- >
- <FileConfiguration
- Name="Blender Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Blender Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\src\geom2.c"
- >
- <FileConfiguration
- Name="Blender Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Blender Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\src\global.c"
- >
- <FileConfiguration
- Name="Blender Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Blender Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\src\io.c"
- >
- <FileConfiguration
- Name="Blender Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Blender Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\src\mem.c"
- >
- <FileConfiguration
- Name="Blender Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Blender Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\src\merge.c"
- >
- <FileConfiguration
- Name="Blender Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Blender Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\src\poly.c"
- >
- <FileConfiguration
- Name="Blender Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Blender Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\src\poly2.c"
- >
- <FileConfiguration
- Name="Blender Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Blender Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\src\qhull.c"
- >
- <FileConfiguration
- Name="Blender Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Blender Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\src\qset.c"
- >
- <FileConfiguration
- Name="Blender Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Blender Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\src\stat.c"
- >
- <FileConfiguration
- Name="Blender Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Blender Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\src\user.c"
- >
- <FileConfiguration
- Name="Blender Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Blender Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl"
- >
- <File
- RelativePath="..\..\src\geom.h"
- >
- </File>
- <File
- RelativePath="..\..\src\io.h"
- >
- </File>
- <File
- RelativePath="..\..\src\mem.h"
- >
- </File>
- <File
- RelativePath="..\..\src\merge.h"
- >
- </File>
- <File
- RelativePath="..\..\src\poly.h"
- >
- </File>
- <File
- RelativePath="..\..\src\qhull.h"
- >
- </File>
- <File
- RelativePath="..\..\src\qhull_a.h"
- >
- </File>
- <File
- RelativePath="..\..\src\qset.h"
- >
- </File>
- <File
- RelativePath="..\..\src\stat.h"
- >
- </File>
- <File
- RelativePath="..\..\src\user.h"
- >
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/extern/qhull/src/Make-config.sh b/extern/qhull/src/Make-config.sh deleted file mode 100755 index 90bbb958599..00000000000 --- a/extern/qhull/src/Make-config.sh +++ /dev/null @@ -1,285 +0,0 @@ -#!/bin/sh -e -# -# Make-config.sh -# -# Setup for Debian build -# -# Writes configure.in and Makefile.am files -# and runs automake and autoconfig -# -# Use 'make dist' to build Unix distribution. -# Use 'configure; make' to build Qhull -# -#note: -# 'configure; make' does not work under cygwin. -# src/unix.c:354: variable 'qh_qh' can't be auto-imported. -# Please read the documentation for ld's --enable-auto-import for details. - -################################################### -########### ../configure.in ###################### -################################################### - -echo Create ../configure.in -cat >../configure.in <<\HERE-CONFIGURE -dnl configure.in for the qhull package -dnl Author: Rafael Laboissiere <rafael@debian.org> -dnl Created: Mon Dec 3 21:36:21 CET 2001 - -AC_INIT(src/qhull.c) -AM_INIT_AUTOMAKE(qhull, 2002.1) - -AC_PROG_CC -AC_PROG_LIBTOOL - -AC_OUTPUT([Makefile src/Makefile html/Makefile eg/Makefile]) - -HERE-CONFIGURE - -################################################### -########### ../Makefile.am ####################### -################################################### - -echo Create ../Makefile.am -cat >../Makefile.am <<\HERE-TOP -### Makefile.am for the qhull package (main) -### Author: Rafael Laboissiere <rafael@debian.org> -### Created: Mon Dec 3 21:36:21 CET 2001 - -### Documentation files - -# to: -docdir = $(prefix)/share/doc/$(PACKAGE) - -# which: -doc_DATA = \ - Announce.txt \ - COPYING.txt \ - README.txt \ - REGISTER.txt - -### Extra files to be included in the tarball - -EXTRA_DIST = \ - $(doc_DATA) \ - File_id.diz \ - QHULL-GO.pif - -### Subdirectories for Automaking - -SUBDIRS = src html eg - -HERE-TOP - -################################################### -########### ../eg/Makefile.am #################### -################################################### - -echo Create ../eg/Makefile.am -cat >../eg/Makefile.am <<\HERE-AM -### Makefile.am for the qhull package (eg) -### Author: Rafael Laboissiere <rafael@debian.org> -### Created: Mon Dec 3 21:36:21 CET 2001 - -### Documentation files - -# to: -docdir = $(prefix)/share/doc/$(PACKAGE) -examplesdir = $(docdir)/examples - -# which: -examples_DATA = \ - q_eg \ - q_egtest \ - q_test \ - Qhull-go.bat \ - q_test.bat - -### Extra files to be included in the tarball - -EXTRA_DIST = $(examples_DATA) - -HERE-AM - -################################################### -########### ../html/Makefile.am ################## -################################################### - -echo Create ../html/Makefile.am -cat >../html/Makefile.am <<\HERE-HTML -### Makefile.am for the qhull package (html) -### Author: Rafael Laboissiere <rafael@debian.org> -### Created: Mon Dec 3 21:36:21 CET 2001 - -### Man pages (trick to get around .man extension) - -%.1: %.man - cp $< $@ -CLEANFILES = *.1 -man_MANS = rbox.1 qhull.1 - -### Documentation files - -# to: -docdir = $(prefix)/share/doc/$(PACKAGE) -htmldir = $(docdir)/html - -# which: -html_DATA = \ - index.htm \ - qconvex.htm \ - qdelau_f.htm \ - qdelaun.htm \ - qh--4d.gif \ - qh--cone.gif \ - qh--dt.gif \ - qh--geom.gif \ - qh--half.gif \ - qh--rand.gif \ - qh-eg.htm \ - qh-faq.htm \ - qh-get.htm \ - qh-home.htm \ - qh-impre.htm \ - qh-in.htm \ - qh-optc.htm \ - qh-optf.htm \ - qh-optg.htm \ - qh-opto.htm \ - qh-optp.htm \ - qh-optq.htm \ - qh-optt.htm \ - qh-quick.htm \ - qhalf.htm \ - qhull.htm \ - qvoron_f.htm \ - qvoronoi.htm \ - rbox.htm - -### Extra files to be included in the tarball - -EXTRA_DIST = \ - $(html_DATA) \ - qhull.man \ - qhull.txt \ - rbox.man \ - rbox.txt - -HERE-HTML - -################################################### -########### ../src/Makefile.am ################### -################################################### - -echo Create ../src/Makefile.am -cat >../src/Makefile.am <<\HERE-SRC -### Makefile.am for the qhull package (src) -### Author: Rafael Laboissiere <rafael@debian.org> -### Created: Mon Dec 3 21:36:21 CET 2001 - -### Shared Library - -# to: -lib_LTLIBRARIES = libqhull.la - -# from: -libqhull_la_SOURCES = \ - user.c \ - global.c \ - stat.c \ - io.c \ - geom2.c \ - poly2.c \ - merge.c \ - qhull.c \ - geom.c \ - poly.c \ - qset.c \ - mem.c - -# how: -libqhull_la_LDFLAGS = -version-info 0:0:0 -lm - -### Utility programs - -# to: -bin_PROGRAMS = qhull rbox qconvex qdelaunay qvoronoi qhalf - -# from: -qhull_SOURCES = unix.c -rbox_SOURCES = rbox.c -qconvex_SOURCES = qconvex.c -qdelaunay_SOURCES = qdelaun.c -qvoronoi_SOURCES = qvoronoi.c -qhalf_SOURCES = qhalf.c - -# how: -qhull_LDADD = libqhull.la -rbox_LDADD = libqhull.la -qconvex_LDADD = libqhull.la -qdelaunay_LDADD = libqhull.la -qvoronoi_LDADD = libqhull.la -qhalf_LDADD = libqhull.la - -### Include files - -pkginclude_HEADERS = \ - geom.h \ - mem.h \ - poly.h \ - qhull_a.h \ - stat.h \ - io.h \ - merge.h \ - qhull.h \ - qset.h \ - user.h - - -### Example programs - -# to: -docdir = $(prefix)/share/doc/$(PACKAGE) -examplesdir = $(docdir)/examples - -# which: -examples_DATA = \ - user_eg.c \ - user_eg2.c \ - qhull_interface.cpp \ - Makefile.txt \ - Make-config.sh \ - MBorland - -doc_DATA = Changes.txt \ - index.htm \ - qh-geom.htm \ - qh-globa.htm \ - qh-io.htm \ - qh-mem.htm \ - qh-merge.htm \ - qh-poly.htm \ - qh-qhull.htm \ - qh-set.htm \ - qh-stat.htm \ - qh-user.htm - - -### Extra files to be included in the tarball - -EXTRA_DIST = \ - $(doc_DATA) \ - $(examples_DATA) - -HERE-SRC - -################################################### -########### run automake autoconf ################ -################################################### - - -echo Run automake, libtoolize, and autoconf -cd ..; aclocal &&\ - automake --foreign --add-missing --force-missing && \ - libtoolize --force && \ - autoconf - diff --git a/extern/qhull/src/Makefile b/extern/qhull/src/Makefile deleted file mode 100644 index 81c06758cbb..00000000000 --- a/extern/qhull/src/Makefile +++ /dev/null @@ -1,55 +0,0 @@ -# -*- mode: gnumakefile; tab-width: 8; indent-tabs-mode: t; -*- -# vim: tabstop=8 -# -# $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): GSR -# -# ***** END GPL LICENSE BLOCK ***** -# -# - -LIBNAME = qhull -DIR = $(OCGDIR)/extern/$(LIBNAME) - -CCFLAGS += $(LEVEL_1_CPP_WARNINGS) - -CPPFLAGS += -I../include - -CSRCS = user.c global.c stat.c io.c geom2.c poly2.c \ - merge.c qhull.c geom.c poly.c qset.c mem.c -CCSRCS = -include nan_compile.mk - -install: $(ALL_OR_DEBUG) - @[ -d $(NAN_QHULL) ] || mkdir -p $(NAN_QHULL) - @[ -d $(NAN_QHULL)/include/qhull ] || mkdir -p $(NAN_QHULL)/include/qhull - @[ -d $(NAN_QHULL)/lib/$(DEBUG_DIR) ] || mkdir -p $(NAN_QHULL)/lib/$(DEBUG_DIR) - @$(NANBLENDERHOME)/intern/tools/cpifdiff.sh $(DIR)/$(DEBUG_DIR)lib$(LIBNAME).a $(NAN_QHULL)/lib/$(DEBUG_DIR) -ifeq ($(OS),darwin) - ranlib $(NAN_QHULL)/lib/$(DEBUG_DIR)lib$(LIBNAME).a -endif - @$(NANBLENDERHOME)/intern/tools/cpifdiff.sh ../include/qhull/*.h $(NAN_QHULL)/include/qhull - - diff --git a/extern/qhull/src/Makefile.txt b/extern/qhull/src/Makefile.txt deleted file mode 100644 index e87b66b49bc..00000000000 --- a/extern/qhull/src/Makefile.txt +++ /dev/null @@ -1,190 +0,0 @@ -# Unix Makefile for qhull and rbox -# -# see README.txt -# -# make to produce qhull qconvex qdelaunay qhalf qvoronoi rbox -# make qvoronoi to produce qvoronoi (etc.) -# make qhullx to produce qhull qconvex etc. w/o using libqhull.a -# make doc to print documentation -# make install to copy qhull, rbox, qhull.1, rbox.1 to BINDIR, MANDIR -# make new to rebuild qhull and rbox from source -# -# make printall to print all files -# make user_eg to produce user_eg -# make user_eg2 to produce user_eg2 -# make clean to remove object files and core -# make cleanall to remove all generated files -# -# PRINTMAN -- command for printing manual pages -# PRINTC -- command for printing C files -# BINDIR -- directory where to copy executables -# MANDIR -- directory where to copy manual pages -# CC -- ANSI C or C++ compiler -# CCOPTS1 - options used to compile .c files -# CCOPTS2 -- options used to link .o files -# -# CFILES -- .c files for printing -# HFILES -- .h files for printing -# DFILES -- documentation files -# MFILES -- man pages and html files -# TFILES -- .txt versions of html html files -# FILES -- all other files -# OBJS -- specifies the object files of libqhull.a -# -BINDIR = /usr/local/bin -MANDIR = /usr/local/man/man1 - -# if you do not have enscript, try a2ps or just use lpr. The files are text. -PRINTMAN = enscript -2rl -PRINTC = enscript -2r -# PRINTMAN = lpr -# PRINTC = lpr - -#for Gnu's gcc compiler -O2 for optimization, -g for debugging, -Wall for check -# -CC = gcc -CCOPTS1 = -O2 -ansi - -# for Sun's cc compiler, -fast or O2 for optimization, -g for debugging, -Xc for ANSI -#CC = cc -#CCOPTS1 = -Xc -v -fast - -# for Silicon Graphics cc compiler, -O2 for optimization, -g for debugging -#CC = cc -#CCOPTS1 = -ansi -O2 - -# for Next cc compiler with fat executable -#CC = cc -#CCOPTS1 = -ansi -O2 -arch m68k -arch i386 -arch hppa - -# for loader, ld -CCOPTS2 = $(CCOPTS1) - -# OBJS in execution frequency order. CFILES after qhull.c are alphabetical -OBJS = user.o global.o stat.o io.o geom2.o poly2.o \ - merge.o qhull.o geom.o poly.o qset.o mem.o - -CFILES= unix.c qhull.c geom.c geom2.c global.c io.c mem.c merge.c poly.c \ - poly2.c qset.c stat.c user.c qconvex.c qdelaun.c qhalf.c qvoronoi.c -HFILES= user.h qhull.h qhull_a.h geom.h io.h mem.h merge.h poly.h qset.h stat.h -TXTFILES= ../Announce.txt ../REGISTER.txt ../COPYING.txt ../README.txt Changes.txt -DOCFILES= ../html/rbox.txt ../html/qhull.txt -FILES= Makefile rbox.c user_eg.c ../eg/q_test ../eg/q_egtest ../eg/q_eg -HTMFILES= qhull.man rbox.man qh-in.htm qh-optg.htm qh-optt.htm qh-optp.htm \ - index.htm qh-quick.htm qh-impre.htm qh-eg.htm \ - qh-optc.htm qh-opto.htm qh-optf.htm qh-optq.htm \ - qh-c.htm qh-faq.htm qhull.htm qconvex.htm qdelaun.htm \ - qh-geom.htm qh-globa.htm qh-io.htm qh-mem.htm qh-merge.htm \ - qh-poly.htm qh-qhull.htm qh-set.htm qh-stat.htm qh-user.htm \ - qdelau_f.htm qhalf.htm qvoronoi.htm qvoron_f.htm rbox.htm - -all: rbox qconvex qdelaunay qhalf qvoronoi qhull - -unix.o: qhull.h user.h mem.h -qconvex.o: qhull.h user.h mem.h -qdelaun.o: qhull.h user.h mem.h -qhalf.o: qhull.h user.h mem.h -qvoronoi.o: qhull.h user.h mem.h -qhull.o: $(HFILES) -geom.o: $(HFILES) -geom2.o: $(HFILES) -global.o: $(HFILES) -io.o: $(HFILES) -mem.o: mem.h -merge.o: $(HFILES) -poly.o: $(HFILES) -poly2.o: $(HFILES) -qset.o: qset.h mem.h -stat.o: $(HFILES) -user.o: $(HFILES) - -.c.o: - $(CC) -c $(CCOPTS1) $< - -clean: - rm -f *.o ../core qconvex qdelaunay qhalf qvoronoi qhull libqhull.a \ - *.exe - -cleanall: clean - rm -f *~ ../rbox ../qhull ../qhalf ../qconvex ../qdelaunay ../qhalf\ - ../qvoronoi ../user_eg ../user_eg2 ../*.exe >/dev/null - -doc: - $(PRINTMAN) $(TXTFILES) $(DOCFILES) - -install: all - cp ../qconvex $(BINDIR)/qconvex - cp ../qdelaunay $(BINDIR)/qdelaunay - cp ../qhalf $(BINDIR)/qhalf - cp ../qhull $(BINDIR)/qhull - cp ../qvoronoi $(BINDIR)/qvoronoi - cp ../rbox $(BINDIR)/rbox - cp ../html/qhull.man $(MANDIR)/qhull.1 - cp ../html/rbox.man $(MANDIR)/rbox.1 - -new: cleanall all - -printall: doc printh printc printf - -printh: - $(PRINTC) $(HFILES) - -printc: - $(PRINTC) $(CFILES) - -printf: - $(PRINTC) $(FILES) - -libqhull.a: $(OBJS) - @echo if 'ar' or 'ranlib' fails, try 'make qhullx' - ar r libqhull.a $(OBJS) - @echo the next line may need to be removed. - -test -x /bin/ranlib -o -x /usr/bin/ranlib && ranlib libqhull.a - -# don't use ../qconvex. Does not work on Red Hat Linux -qconvex: qconvex.o libqhull.a - $(CC) -o qconvex $(CCOPTS2) qconvex.o -L. -lqhull -lm - cp qconvex .. - -qdelaunay: qdelaun.o libqhull.a - $(CC) -o qdelaunay $(CCOPTS2) qdelaun.o -L. -lqhull -lm - cp qdelaunay .. - -qhalf: qhalf.o libqhull.a - $(CC) -o qhalf $(CCOPTS2) qhalf.o -L. -lqhull -lm - cp qhalf .. - -qvoronoi: qvoronoi.o libqhull.a - $(CC) -o qvoronoi $(CCOPTS2) qvoronoi.o -L. -lqhull -lm - cp qvoronoi .. - -qhull: unix.o libqhull.a - $(CC) -o qhull $(CCOPTS2) unix.o -L. -lqhull -lm - cp qhull .. - -chmod +x ../eg/q_test ../eg/q_eg ../eg/q_egtest - -cd ..; ./rbox D4 | ./qhull - -# compile qhull without using libqhull.a -qhullx: qconvex.o qdelaun.o qhalf.o qvoronoi.o unix.o $(OBJS) - $(CC) -o qconvex $(CCOPTS2) qconvex.o $(OBJS) -lm - $(CC) -o qdelaunay $(CCOPTS2) qdelaun.o $(OBJS) -lm - $(CC) -o qhalf $(CCOPTS2) qhalf.o $(OBJS) -lm - $(CC) -o qvoronoi $(CCOPTS2) qvoronoi.o $(OBJS) -lm - $(CC) -o qhull $(CCOPTS2) unix.o $(OBJS) -lm - cp qconvex qdelaunay qhalf qvoronoi qhull .. - -chmod +x ../eg/q_test ../eg/q_eg ../eg/q_egtest - -cd ..; ./rbox D4 | ./qhull - -rbox: rbox.o - $(CC) -o rbox rbox.o $(CCOPTS2) -lm - cp rbox .. - -user_eg: user_eg.o libqhull.a - $(CC) -o user_eg $(CCOPTS2) user_eg.o -L. -lqhull -lm - cp user_eg .. - -user_eg2: user_eg2.o libqhull.a - $(CC) -o user_eg2 $(CCOPTS2) user_eg2.o -L. -lqhull -lm - cp user_eg2 .. - -# end of Makefile diff --git a/extern/qhull/src/geom.c b/extern/qhull/src/geom.c deleted file mode 100644 index ca4bcaf2541..00000000000 --- a/extern/qhull/src/geom.c +++ /dev/null @@ -1,1230 +0,0 @@ -/*<html><pre> -<a href="qh-geom.htm" - >-------------------------------</a><a name="TOP">-</a> - - geom.c - geometric routines of qhull - - see qh-geom.htm and geom.h - - copyright (c) 1993-2002 The Geometry Center - - infrequent code goes into geom2.c -*/ - -#include "qhull_a.h" - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="distplane">-</a> - - qh_distplane( point, facet, dist ) - return distance from point to facet - - returns: - dist - if qh.RANDOMdist, joggles result - - notes: - dist > 0 if point is above facet (i.e., outside) - does not error (for sortfacets) - - see: - qh_distnorm in geom2.c -*/ -void qh_distplane (pointT *point, facetT *facet, realT *dist) { - coordT *normal= facet->normal, *coordp, randr; - int k; - - switch(qh hull_dim){ - case 2: - *dist= facet->offset + point[0] * normal[0] + point[1] * normal[1]; - break; - case 3: - *dist= facet->offset + point[0] * normal[0] + point[1] * normal[1] + point[2] * normal[2]; - break; - case 4: - *dist= facet->offset+point[0]*normal[0]+point[1]*normal[1]+point[2]*normal[2]+point[3]*normal[3]; - break; - case 5: - *dist= facet->offset+point[0]*normal[0]+point[1]*normal[1]+point[2]*normal[2]+point[3]*normal[3]+point[4]*normal[4]; - break; - case 6: - *dist= facet->offset+point[0]*normal[0]+point[1]*normal[1]+point[2]*normal[2]+point[3]*normal[3]+point[4]*normal[4]+point[5]*normal[5]; - break; - case 7: - *dist= facet->offset+point[0]*normal[0]+point[1]*normal[1]+point[2]*normal[2]+point[3]*normal[3]+point[4]*normal[4]+point[5]*normal[5]+point[6]*normal[6]; - break; - case 8: - *dist= facet->offset+point[0]*normal[0]+point[1]*normal[1]+point[2]*normal[2]+point[3]*normal[3]+point[4]*normal[4]+point[5]*normal[5]+point[6]*normal[6]+point[7]*normal[7]; - break; - default: - *dist= facet->offset; - coordp= point; - for (k= qh hull_dim; k--; ) - *dist += *coordp++ * *normal++; - break; - } - zinc_(Zdistplane); - if (!qh RANDOMdist && qh IStracing < 4) - return; - if (qh RANDOMdist) { - randr= qh_RANDOMint; - *dist += (2.0 * randr / qh_RANDOMmax - 1.0) * - qh RANDOMfactor * qh MAXabs_coord; - } - if (qh IStracing >= 4) { - fprintf (qh ferr, "qh_distplane: "); - fprintf (qh ferr, qh_REAL_1, *dist); - fprintf (qh ferr, "from p%d to f%d\n", qh_pointid(point), facet->id); - } - return; -} /* distplane */ - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="findbest">-</a> - - qh_findbest( point, startfacet, bestoutside, qh_ISnewfacets, qh_NOupper, dist, isoutside, numpart ) - find facet that is furthest below a point - for upperDelaunay facets - returns facet only if !qh_NOupper and clearly above - - input: - starts search at 'startfacet' (can not be flipped) - if !bestoutside (qh_ALL), stops at qh.MINoutside - - returns: - best facet (reports error if NULL) - early out if isoutside defined and bestdist > qh.MINoutside - dist is distance to facet - isoutside is true if point is outside of facet - numpart counts the number of distance tests - - see also: - qh_findbestnew() - - notes: - If merging (testhorizon), searches horizon facets of coplanar best facets because - after qh_distplane, this and qh_partitionpoint are the most expensive in 3-d - avoid calls to distplane, function calls, and real number operations. - caller traces result - Optimized for outside points. Tried recording a search set for qh_findhorizon. - Made code more complicated. - - when called by qh_partitionvisible(): - indicated by qh_ISnewfacets - qh.newfacet_list is list of simplicial, new facets - qh_findbestnew set if qh_sharpnewfacets returns True (to use qh_findbestnew) - qh.bestfacet_notsharp set if qh_sharpnewfacets returns False - - when called by qh_findfacet(), qh_partitionpoint(), qh_partitioncoplanar(), - qh_check_bestdist(), qh_addpoint() - indicated by !qh_ISnewfacets - returns best facet in neighborhood of given facet - this is best facet overall if dist > - qh.MAXcoplanar - or hull has at least a "spherical" curvature - - design: - initialize and test for early exit - repeat while there are better facets - for each neighbor of facet - exit if outside facet found - test for better facet - if point is inside and partitioning - test for new facets with a "sharp" intersection - if so, future calls go to qh_findbestnew() - test horizon facets -*/ -facetT *qh_findbest (pointT *point, facetT *startfacet, - boolT bestoutside, boolT isnewfacets, boolT noupper, - realT *dist, boolT *isoutside, int *numpart) { - realT bestdist= -REALmax/2 /* avoid underflow */; - facetT *facet, *neighbor, **neighborp, *bestfacet= NULL; - /* facetT *bestfacet_all= startfacet; */ - int oldtrace= qh IStracing; - unsigned int visitid= ++qh visit_id; - int numpartnew=0; - boolT testhorizon = True; /* needed if precise, e.g., rbox c D6 | qhull Q0 Tv */ - - zinc_(Zfindbest); - if (qh IStracing >= 3 || (qh TRACElevel && qh TRACEpoint >= 0 && qh TRACEpoint == qh_pointid (point))) { - if (qh TRACElevel > qh IStracing) - qh IStracing= qh TRACElevel; - fprintf (qh ferr, "qh_findbest: point p%d starting at f%d isnewfacets? %d, unless %d exit if > %2.2g\n", - qh_pointid(point), startfacet->id, isnewfacets, bestoutside, qh MINoutside); - fprintf(qh ferr, " testhorizon? %d noupper? %d", testhorizon, noupper); - fprintf (qh ferr, " Last point added was p%d.", qh furthest_id); - fprintf(qh ferr, " Last merge was #%d. max_outside %2.2g\n", zzval_(Ztotmerge), qh max_outside); - } - if (isoutside) - *isoutside= True; - if (!startfacet->flipped) { /* test startfacet */ - *numpart= 1; - qh_distplane (point, startfacet, dist); /* this code is duplicated below */ - if (!bestoutside && *dist >= qh MINoutside - && (!startfacet->upperdelaunay || !noupper)) { - bestfacet= startfacet; - goto LABELreturn_best; - } - bestdist= *dist; - if (!startfacet->upperdelaunay) { - bestfacet= startfacet; - } - }else - *numpart= 0; - startfacet->visitid= visitid; - facet= startfacet; - while (facet) { - trace4((qh ferr, "qh_findbest: neighbors of f%d, bestdist %2.2g f%d\n", - facet->id, bestdist, getid_(bestfacet))); - FOREACHneighbor_(facet) { - if (!neighbor->newfacet && isnewfacets) - continue; - if (neighbor->visitid == visitid) - continue; - neighbor->visitid= visitid; - if (!neighbor->flipped) { /* code duplicated above */ - (*numpart)++; - qh_distplane (point, neighbor, dist); - if (*dist > bestdist) { - if (!bestoutside && *dist >= qh MINoutside - && (!neighbor->upperdelaunay || !noupper)) { - bestfacet= neighbor; - goto LABELreturn_best; - } - if (!neighbor->upperdelaunay) { - bestfacet= neighbor; - bestdist= *dist; - } - break; /* switch to neighor */ - } /* end of *dist>bestdist */ - } /* end of !flipped */ - } /* end of FOREACHneighbor */ - facet= neighbor; /* non-NULL only if *dist>bestdist */ - } /* end of while facet (directed search) */ - if (isnewfacets) { - if (!bestfacet) { - bestdist= -REALmax/2; - bestfacet= qh_findbestnew (point, startfacet->next, &bestdist, bestoutside, isoutside, &numpartnew); - testhorizon= False; /* qh_findbestnew calls qh_findbesthorizon */ - }else if (!qh findbest_notsharp && bestdist < - qh DISTround) { - if (qh_sharpnewfacets()) { - /* seldom used, qh_findbestnew will retest all facets */ - zinc_(Zfindnewsharp); - bestfacet= qh_findbestnew (point, bestfacet, &bestdist, bestoutside, isoutside, &numpartnew); - testhorizon= False; /* qh_findbestnew calls qh_findbesthorizon */ - qh findbestnew= True; - }else - qh findbest_notsharp= True; - } - } - if (!bestfacet) { - fprintf(qh ferr, "\n\ -qh_findbest: all neighbors of facet %d are flipped or upper Delaunay.\n\ -Please report this error to qhull_bug@geom.umn.edu with the input and all of the output.\n", - startfacet->id); - qh_errexit (qh_ERRqhull, startfacet, NULL); - } - if (testhorizon) - bestfacet= qh_findbesthorizon (!qh_IScheckmax, point, bestfacet, noupper, &bestdist, &numpartnew); - *dist= bestdist; - if (isoutside && bestdist < qh MINoutside) - *isoutside= False; -LABELreturn_best: - zadd_(Zfindbesttot, *numpart); - zmax_(Zfindbestmax, *numpart); - (*numpart) += numpartnew; - qh IStracing= oldtrace; - return bestfacet; -} /* findbest */ - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="findbesthorizon">-</a> - - qh_findbesthorizon( qh_IScheckmax, point, startfacet, qh_NOupper, &bestdist, &numpart ) - search coplanar and better horizon facets from startfacet/bestdist - ischeckmax turns off statistics and minsearch update - all arguments must be initialized - returns (ischeckmax): - best facet - returns (!ischeckmax): - best facet that is not upperdelaunay - allows upperdelaunay that is clearly outside - returns: - bestdist is distance to bestfacet - numpart -- updates number of distance tests - - notes: - no early out -- use qh_findbest() or qh_findbestnew() - Searches coplanar or better horizon facets - - when called by qh_check_maxout() (qh_IScheckmax) - startfacet must be closest to the point - Otherwise, if point is beyond and below startfacet, startfacet may be a local minimum - even though other facets are below the point. - updates facet->maxoutside for good, visited facets - may return NULL - - searchdist is qh.max_outside + 2 * DISTround - + max( MINvisible('Vn'), MAXcoplanar('Un')); - This setting is a guess. It must be at least max_outside + 2*DISTround - because a facet may have a geometric neighbor across a vertex - - design: - for each horizon facet of coplanar best facets - continue if clearly inside - unless upperdelaunay or clearly outside - update best facet -*/ -facetT *qh_findbesthorizon (boolT ischeckmax, pointT* point, facetT *startfacet, boolT noupper, realT *bestdist, int *numpart) { - facetT *bestfacet= startfacet; - realT dist; - facetT *neighbor, **neighborp, *facet; - facetT *nextfacet= NULL; /* optimize last facet of coplanarset */ - int numpartinit= *numpart, coplanarset_size; - unsigned int visitid= ++qh visit_id; - boolT newbest= False; /* for tracing */ - realT minsearch, searchdist; /* skip facets that are too far from point */ - - if (!ischeckmax) { - zinc_(Zfindhorizon); - }else { -#if qh_MAXoutside - if ((!qh ONLYgood || startfacet->good) && *bestdist > startfacet->maxoutside) - startfacet->maxoutside= *bestdist; -#endif - } - searchdist= qh_SEARCHdist; /* multiple of qh.max_outside and precision constants */ - minsearch= *bestdist - searchdist; - if (ischeckmax) { - /* Always check coplanar facets. Needed for RBOX 1000 s Z1 G1e-13 t996564279 | QHULL Tv */ - minimize_(minsearch, -searchdist); - } - coplanarset_size= 0; - facet= startfacet; - while (True) { - trace4((qh ferr, "qh_findbesthorizon: neighbors of f%d bestdist %2.2g f%d ischeckmax? %d noupper? %d minsearch %2.2g searchdist %2.2g\n", - facet->id, *bestdist, getid_(bestfacet), ischeckmax, noupper, - minsearch, searchdist)); - FOREACHneighbor_(facet) { - if (neighbor->visitid == visitid) - continue; - neighbor->visitid= visitid; - if (!neighbor->flipped) { - qh_distplane (point, neighbor, &dist); - (*numpart)++; - if (dist > *bestdist) { - if (!neighbor->upperdelaunay || ischeckmax || (!noupper && dist >= qh MINoutside)) { - bestfacet= neighbor; - *bestdist= dist; - newbest= True; - if (!ischeckmax) { - minsearch= dist - searchdist; - if (dist > *bestdist + searchdist) { - zinc_(Zfindjump); /* everything in qh.coplanarset at least searchdist below */ - coplanarset_size= 0; - } - } - } - }else if (dist < minsearch) - continue; /* if ischeckmax, dist can't be positive */ -#if qh_MAXoutside - if (ischeckmax && dist > neighbor->maxoutside) - neighbor->maxoutside= dist; -#endif - } /* end of !flipped */ - if (nextfacet) { - if (!coplanarset_size++) { - SETfirst_(qh coplanarset)= nextfacet; - SETtruncate_(qh coplanarset, 1); - }else - qh_setappend (&qh coplanarset, nextfacet); /* Was needed for RBOX 1000 s W1e-13 P0 t996547055 | QHULL d Qbb Qc Tv - and RBOX 1000 s Z1 G1e-13 t996564279 | qhull Tv */ - } - nextfacet= neighbor; - } /* end of EACHneighbor */ - facet= nextfacet; - if (facet) - nextfacet= NULL; - else if (!coplanarset_size) - break; - else if (!--coplanarset_size) { - facet= SETfirst_(qh coplanarset); - SETtruncate_(qh coplanarset, 0); - }else - facet= (facetT*)qh_setdellast (qh coplanarset); - } /* while True, for each facet in qh.coplanarset */ - if (!ischeckmax) { - zadd_(Zfindhorizontot, *numpart - numpartinit); - zmax_(Zfindhorizonmax, *numpart - numpartinit); - if (newbest) - zinc_(Zparthorizon); - } - trace4((qh ferr, "qh_findbesthorizon: newbest? %d bestfacet f%d bestdist %2.2g\n", newbest, getid_(bestfacet), *bestdist)); - return bestfacet; -} /* findbesthorizon */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="findbestnew">-</a> - - qh_findbestnew( point, startfacet, dist, isoutside, numpart ) - find best newfacet for point - searches all of qh.newfacet_list starting at startfacet - searches horizon facets of coplanar best newfacets - searches all facets if startfacet == qh.facet_list - returns: - best new or horizon facet that is not upperdelaunay - early out if isoutside and not 'Qf' - dist is distance to facet - isoutside is true if point is outside of facet - numpart is number of distance tests - - notes: - Always used for merged new facets (see qh_USEfindbestnew) - Avoids upperdelaunay facet unless (isoutside and outside) - - Uses qh.visit_id, qh.coplanarset. - If share visit_id with qh_findbest, coplanarset is incorrect. - - If merging (testhorizon), searches horizon facets of coplanar best facets because - a point maybe coplanar to the bestfacet, below its horizon facet, - and above a horizon facet of a coplanar newfacet. For example, - rbox 1000 s Z1 G1e-13 | qhull - rbox 1000 s W1e-13 P0 t992110337 | QHULL d Qbb Qc - - qh_findbestnew() used if - qh_sharpnewfacets -- newfacets contains a sharp angle - if many merges, qh_premerge found a merge, or 'Qf' (qh.findbestnew) - - see also: - qh_partitionall() and qh_findbest() - - design: - for each new facet starting from startfacet - test distance from point to facet - return facet if clearly outside - unless upperdelaunay and a lowerdelaunay exists - update best facet - test horizon facets -*/ -facetT *qh_findbestnew (pointT *point, facetT *startfacet, - realT *dist, boolT bestoutside, boolT *isoutside, int *numpart) { - realT bestdist= -REALmax/2; /*, minsearch= -REALmax/2;*/ - facetT *bestfacet= NULL, *facet; - int oldtrace= qh IStracing, i; - unsigned int visitid= ++qh visit_id; - realT distoutside= 0.0; - boolT isdistoutside; /* True if distoutside is defined */ - boolT testhorizon = True; /* needed if precise, e.g., rbox c D6 | qhull Q0 Tv */ - - if (!startfacet) { - if (qh MERGING) - fprintf(qh ferr, "qhull precision error (qh_findbestnew): merging has formed and deleted a cone of new facets. Can not continue.\n"); - else - fprintf(qh ferr, "qhull internal error (qh_findbestnew): no new facets for point p%d\n", - qh furthest_id); - qh_errexit (qh_ERRqhull, NULL, NULL); - } - zinc_(Zfindnew); - if (qh BESToutside || bestoutside) - isdistoutside= False; - else { - isdistoutside= True; - distoutside= qh_DISToutside; /* multiple of qh.MINoutside & qh.max_outside, see user.h */ - } - if (isoutside) - *isoutside= True; - *numpart= 0; - if (qh IStracing >= 3 || (qh TRACElevel && qh TRACEpoint >= 0 && qh TRACEpoint == qh_pointid (point))) { - if (qh TRACElevel > qh IStracing) - qh IStracing= qh TRACElevel; - fprintf(qh ferr, "qh_findbestnew: point p%d facet f%d. Stop? %d if dist > %2.2g\n", - qh_pointid(point), startfacet->id, isdistoutside, distoutside); - fprintf(qh ferr, " Last point added p%d visitid %d.", qh furthest_id, visitid); - fprintf(qh ferr, " Last merge was #%d.\n", zzval_(Ztotmerge)); - } - /* visit all new facets starting with startfacet, maybe qh facet_list */ - for (i= 0, facet= startfacet; i < 2; i++, facet= qh newfacet_list) { - FORALLfacet_(facet) { - if (facet == startfacet && i) - break; - facet->visitid= visitid; - if (!facet->flipped) { - qh_distplane (point, facet, dist); - (*numpart)++; - if (*dist > bestdist) { - if (!facet->upperdelaunay || *dist >= qh MINoutside) { - bestfacet= facet; - if (isdistoutside && *dist >= distoutside) - goto LABELreturn_bestnew; - bestdist= *dist; - } - } - } /* end of !flipped */ - } /* FORALLfacet from startfacet or qh newfacet_list */ - } - if (testhorizon || !bestfacet) - bestfacet= qh_findbesthorizon (!qh_IScheckmax, point, bestfacet ? bestfacet : startfacet, - !qh_NOupper, &bestdist, numpart); - *dist= bestdist; - if (isoutside && *dist < qh MINoutside) - *isoutside= False; -LABELreturn_bestnew: - zadd_(Zfindnewtot, *numpart); - zmax_(Zfindnewmax, *numpart); - trace4((qh ferr, "qh_findbestnew: bestfacet f%d bestdist %2.2g\n", getid_(bestfacet), *dist)); - qh IStracing= oldtrace; - return bestfacet; -} /* findbestnew */ - -/* ============ hyperplane functions -- keep code together [?] ============ */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="backnormal">-</a> - - qh_backnormal( rows, numrow, numcol, sign, normal, nearzero ) - given an upper-triangular rows array and a sign, - solve for normal equation x using back substitution over rows U - - returns: - normal= x - - if will not be able to divzero() when normalized (qh.MINdenom_2 and qh.MINdenom_1_2), - if fails on last row - this means that the hyperplane intersects [0,..,1] - sets last coordinate of normal to sign - otherwise - sets tail of normal to [...,sign,0,...], i.e., solves for b= [0...0] - sets nearzero - - notes: - assumes numrow == numcol-1 - - see Golub & van Loan 4.4-9 for back substitution - - solves Ux=b where Ax=b and PA=LU - b= [0,...,0,sign or 0] (sign is either -1 or +1) - last row of A= [0,...,0,1] - - 1) Ly=Pb == y=b since P only permutes the 0's of b - - design: - for each row from end - perform back substitution - if near zero - use qh_divzero for division - if zero divide and not last row - set tail of normal to 0 -*/ -void qh_backnormal (realT **rows, int numrow, int numcol, boolT sign, - coordT *normal, boolT *nearzero) { - int i, j; - coordT *normalp, *normal_tail, *ai, *ak; - realT diagonal; - boolT waszero; - int zerocol= -1; - - normalp= normal + numcol - 1; - *normalp--= (sign ? -1.0 : 1.0); - for(i= numrow; i--; ) { - *normalp= 0.0; - ai= rows[i] + i + 1; - ak= normalp+1; - for(j= i+1; j < numcol; j++) - *normalp -= *ai++ * *ak++; - diagonal= (rows[i])[i]; - if (fabs_(diagonal) > qh MINdenom_2) - *(normalp--) /= diagonal; - else { - waszero= False; - *normalp= qh_divzero (*normalp, diagonal, qh MINdenom_1_2, &waszero); - if (waszero) { - zerocol= i; - *(normalp--)= (sign ? -1.0 : 1.0); - for (normal_tail= normalp+2; normal_tail < normal + numcol; normal_tail++) - *normal_tail= 0.0; - }else - normalp--; - } - } - if (zerocol != -1) { - zzinc_(Zback0); - *nearzero= True; - trace4((qh ferr, "qh_backnormal: zero diagonal at column %d.\n", i)); - qh_precision ("zero diagonal on back substitution"); - } -} /* backnormal */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="gausselim">-</a> - - qh_gausselim( rows, numrow, numcol, sign ) - Gaussian elimination with partial pivoting - - returns: - rows is upper triangular (includes row exchanges) - flips sign for each row exchange - sets nearzero if pivot[k] < qh.NEARzero[k], else clears it - - notes: - if nearzero, the determinant's sign may be incorrect. - assumes numrow <= numcol - - design: - for each row - determine pivot and exchange rows if necessary - test for near zero - perform gaussian elimination step -*/ -void qh_gausselim(realT **rows, int numrow, int numcol, boolT *sign, boolT *nearzero) { - realT *ai, *ak, *rowp, *pivotrow; - realT n, pivot, pivot_abs= 0.0, temp; - int i, j, k, pivoti, flip=0; - - *nearzero= False; - for(k= 0; k < numrow; k++) { - pivot_abs= fabs_((rows[k])[k]); - pivoti= k; - for(i= k+1; i < numrow; i++) { - if ((temp= fabs_((rows[i])[k])) > pivot_abs) { - pivot_abs= temp; - pivoti= i; - } - } - if (pivoti != k) { - rowp= rows[pivoti]; - rows[pivoti]= rows[k]; - rows[k]= rowp; - *sign ^= 1; - flip ^= 1; - } - if (pivot_abs <= qh NEARzero[k]) { - *nearzero= True; - if (pivot_abs == 0.0) { /* remainder of column == 0 */ - if (qh IStracing >= 4) { - fprintf (qh ferr, "qh_gausselim: 0 pivot at column %d. (%2.2g < %2.2g)\n", k, pivot_abs, qh DISTround); - qh_printmatrix (qh ferr, "Matrix:", rows, numrow, numcol); - } - zzinc_(Zgauss0); - qh_precision ("zero pivot for Gaussian elimination"); - goto LABELnextcol; - } - } - pivotrow= rows[k] + k; - pivot= *pivotrow++; /* signed value of pivot, and remainder of row */ - for(i= k+1; i < numrow; i++) { - ai= rows[i] + k; - ak= pivotrow; - n= (*ai++)/pivot; /* divzero() not needed since |pivot| >= |*ai| */ - for(j= numcol - (k+1); j--; ) - *ai++ -= n * *ak++; - } - LABELnextcol: - ; - } - wmin_(Wmindenom, pivot_abs); /* last pivot element */ - if (qh IStracing >= 5) - qh_printmatrix (qh ferr, "qh_gausselem: result", rows, numrow, numcol); -} /* gausselim */ - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="getangle">-</a> - - qh_getangle( vect1, vect2 ) - returns the dot product of two vectors - if qh.RANDOMdist, joggles result - - notes: - the angle may be > 1.0 or < -1.0 because of roundoff errors - -*/ -realT qh_getangle(pointT *vect1, pointT *vect2) { - realT angle= 0, randr; - int k; - - for(k= qh hull_dim; k--; ) - angle += *vect1++ * *vect2++; - if (qh RANDOMdist) { - randr= qh_RANDOMint; - angle += (2.0 * randr / qh_RANDOMmax - 1.0) * - qh RANDOMfactor; - } - trace4((qh ferr, "qh_getangle: %2.2g\n", angle)); - return(angle); -} /* getangle */ - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="getcenter">-</a> - - qh_getcenter( vertices ) - returns arithmetic center of a set of vertices as a new point - - notes: - allocates point array for center -*/ -pointT *qh_getcenter(setT *vertices) { - int k; - pointT *center, *coord; - vertexT *vertex, **vertexp; - int count= qh_setsize(vertices); - - if (count < 2) { - fprintf (qh ferr, "qhull internal error (qh_getcenter): not defined for %d points\n", count); - qh_errexit (qh_ERRqhull, NULL, NULL); - } - center= (pointT *)qh_memalloc(qh normal_size); - for (k=0; k < qh hull_dim; k++) { - coord= center+k; - *coord= 0.0; - FOREACHvertex_(vertices) - *coord += vertex->point[k]; - *coord /= count; - } - return(center); -} /* getcenter */ - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="getcentrum">-</a> - - qh_getcentrum( facet ) - returns the centrum for a facet as a new point - - notes: - allocates the centrum -*/ -pointT *qh_getcentrum(facetT *facet) { - realT dist; - pointT *centrum, *point; - - point= qh_getcenter(facet->vertices); - zzinc_(Zcentrumtests); - qh_distplane (point, facet, &dist); - centrum= qh_projectpoint(point, facet, dist); - qh_memfree(point, qh normal_size); - trace4((qh ferr, "qh_getcentrum: for f%d, %d vertices dist= %2.2g\n", - facet->id, qh_setsize(facet->vertices), dist)); - return centrum; -} /* getcentrum */ - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="getdistance">-</a> - - qh_getdistance( facet, neighbor, mindist, maxdist ) - returns the maxdist and mindist distance of any vertex from neighbor - - returns: - the max absolute value - - design: - for each vertex of facet that is not in neighbor - test the distance from vertex to neighbor -*/ -realT qh_getdistance(facetT *facet, facetT *neighbor, realT *mindist, realT *maxdist) { - vertexT *vertex, **vertexp; - realT dist, maxd, mind; - - FOREACHvertex_(facet->vertices) - vertex->seen= False; - FOREACHvertex_(neighbor->vertices) - vertex->seen= True; - mind= 0.0; - maxd= 0.0; - FOREACHvertex_(facet->vertices) { - if (!vertex->seen) { - zzinc_(Zbestdist); - qh_distplane(vertex->point, neighbor, &dist); - if (dist < mind) - mind= dist; - else if (dist > maxd) - maxd= dist; - } - } - *mindist= mind; - *maxdist= maxd; - mind= -mind; - if (maxd > mind) - return maxd; - else - return mind; -} /* getdistance */ - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="normalize">-</a> - - qh_normalize( normal, dim, toporient ) - normalize a vector and report if too small - does not use min norm - - see: - qh_normalize2 -*/ -void qh_normalize (coordT *normal, int dim, boolT toporient) { - qh_normalize2( normal, dim, toporient, NULL, NULL); -} /* normalize */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="normalize2">-</a> - - qh_normalize2( normal, dim, toporient, minnorm, ismin ) - normalize a vector and report if too small - qh.MINdenom/MINdenom1 are the upper limits for divide overflow - - returns: - normalized vector - flips sign if !toporient - if minnorm non-NULL, - sets ismin if normal < minnorm - - notes: - if zero norm - sets all elements to sqrt(1.0/dim) - if divide by zero (divzero ()) - sets largest element to +/-1 - bumps Znearlysingular - - design: - computes norm - test for minnorm - if not near zero - normalizes normal - else if zero norm - sets normal to standard value - else - uses qh_divzero to normalize - if nearzero - sets norm to direction of maximum value -*/ -void qh_normalize2 (coordT *normal, int dim, boolT toporient, - realT *minnorm, boolT *ismin) { - int k; - realT *colp, *maxp, norm= 0, temp, *norm1, *norm2, *norm3; - boolT zerodiv; - - norm1= normal+1; - norm2= normal+2; - norm3= normal+3; - if (dim == 2) - norm= sqrt((*normal)*(*normal) + (*norm1)*(*norm1)); - else if (dim == 3) - norm= sqrt((*normal)*(*normal) + (*norm1)*(*norm1) + (*norm2)*(*norm2)); - else if (dim == 4) { - norm= sqrt((*normal)*(*normal) + (*norm1)*(*norm1) + (*norm2)*(*norm2) - + (*norm3)*(*norm3)); - }else if (dim > 4) { - norm= (*normal)*(*normal) + (*norm1)*(*norm1) + (*norm2)*(*norm2) - + (*norm3)*(*norm3); - for (k= dim-4, colp= normal+4; k--; colp++) - norm += (*colp) * (*colp); - norm= sqrt(norm); - } - if (minnorm) { - if (norm < *minnorm) - *ismin= True; - else - *ismin= False; - } - wmin_(Wmindenom, norm); - if (norm > qh MINdenom) { - if (!toporient) - norm= -norm; - *normal /= norm; - *norm1 /= norm; - if (dim == 2) - ; /* all done */ - else if (dim == 3) - *norm2 /= norm; - else if (dim == 4) { - *norm2 /= norm; - *norm3 /= norm; - }else if (dim >4) { - *norm2 /= norm; - *norm3 /= norm; - for (k= dim-4, colp= normal+4; k--; ) - *colp++ /= norm; - } - }else if (norm == 0.0) { - temp= sqrt (1.0/dim); - for (k= dim, colp= normal; k--; ) - *colp++ = temp; - }else { - if (!toporient) - norm= -norm; - for (k= dim, colp= normal; k--; colp++) { /* k used below */ - temp= qh_divzero (*colp, norm, qh MINdenom_1, &zerodiv); - if (!zerodiv) - *colp= temp; - else { - maxp= qh_maxabsval(normal, dim); - temp= ((*maxp * norm >= 0.0) ? 1.0 : -1.0); - for (k= dim, colp= normal; k--; colp++) - *colp= 0.0; - *maxp= temp; - zzinc_(Znearlysingular); - trace0((qh ferr, "qh_normalize: norm=%2.2g too small during p%d\n", - norm, qh furthest_id)); - return; - } - } - } -} /* normalize */ - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="projectpoint">-</a> - - qh_projectpoint( point, facet, dist ) - project point onto a facet by dist - - returns: - returns a new point - - notes: - if dist= distplane(point,facet) - this projects point to hyperplane - assumes qh_memfree_() is valid for normal_size -*/ -pointT *qh_projectpoint(pointT *point, facetT *facet, realT dist) { - pointT *newpoint, *np, *normal; - int normsize= qh normal_size,k; - void **freelistp; /* used !qh_NOmem */ - - qh_memalloc_(normsize, freelistp, newpoint, pointT); - np= newpoint; - normal= facet->normal; - for(k= qh hull_dim; k--; ) - *(np++)= *point++ - dist * *normal++; - return(newpoint); -} /* projectpoint */ - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="setfacetplane">-</a> - - qh_setfacetplane( facet ) - sets the hyperplane for a facet - if qh.RANDOMdist, joggles hyperplane - - notes: - uses global buffers qh.gm_matrix and qh.gm_row - overwrites facet->normal if already defined - updates Wnewvertex if PRINTstatistics - sets facet->upperdelaunay if upper envelope of Delaunay triangulation - - design: - copy vertex coordinates to qh.gm_matrix/gm_row - compute determinate - if nearzero - recompute determinate with gaussian elimination - if nearzero - force outside orientation by testing interior point -*/ -void qh_setfacetplane(facetT *facet) { - pointT *point; - vertexT *vertex, **vertexp; - int k,i, normsize= qh normal_size, oldtrace= 0; - realT dist; - void **freelistp; /* used !qh_NOmem */ - coordT *coord, *gmcoord; - pointT *point0= SETfirstt_(facet->vertices, vertexT)->point; - boolT nearzero= False; - - zzinc_(Zsetplane); - if (!facet->normal) - qh_memalloc_(normsize, freelistp, facet->normal, coordT); - if (facet == qh tracefacet) { - oldtrace= qh IStracing; - qh IStracing= 5; - fprintf (qh ferr, "qh_setfacetplane: facet f%d created.\n", facet->id); - fprintf (qh ferr, " Last point added to hull was p%d.", qh furthest_id); - if (zzval_(Ztotmerge)) - fprintf(qh ferr, " Last merge was #%d.", zzval_(Ztotmerge)); - fprintf (qh ferr, "\n\nCurrent summary is:\n"); - qh_printsummary (qh ferr); - } - if (qh hull_dim <= 4) { - i= 0; - if (qh RANDOMdist) { - gmcoord= qh gm_matrix; - FOREACHvertex_(facet->vertices) { - qh gm_row[i++]= gmcoord; - coord= vertex->point; - for (k= qh hull_dim; k--; ) - *(gmcoord++)= *coord++ * qh_randomfactor(); - } - }else { - FOREACHvertex_(facet->vertices) - qh gm_row[i++]= vertex->point; - } - qh_sethyperplane_det(qh hull_dim, qh gm_row, point0, facet->toporient, - facet->normal, &facet->offset, &nearzero); - } - if (qh hull_dim > 4 || nearzero) { - i= 0; - gmcoord= qh gm_matrix; - FOREACHvertex_(facet->vertices) { - if (vertex->point != point0) { - qh gm_row[i++]= gmcoord; - coord= vertex->point; - point= point0; - for(k= qh hull_dim; k--; ) - *(gmcoord++)= *coord++ - *point++; - } - } - qh gm_row[i]= gmcoord; /* for areasimplex */ - if (qh RANDOMdist) { - gmcoord= qh gm_matrix; - for (i= qh hull_dim-1; i--; ) { - for (k= qh hull_dim; k--; ) - *(gmcoord++) *= qh_randomfactor(); - } - } - qh_sethyperplane_gauss(qh hull_dim, qh gm_row, point0, facet->toporient, - facet->normal, &facet->offset, &nearzero); - if (nearzero) { - if (qh_orientoutside (facet)) { - trace0((qh ferr, "qh_setfacetplane: flipped orientation after testing interior_point during p%d\n", qh furthest_id)); - /* this is part of using Gaussian Elimination. For example in 5-d - 1 1 1 1 0 - 1 1 1 1 1 - 0 0 0 1 0 - 0 1 0 0 0 - 1 0 0 0 0 - norm= 0.38 0.38 -0.76 0.38 0 - has a determinate of 1, but g.e. after subtracting pt. 0 has - 0's in the diagonal, even with full pivoting. It does work - if you subtract pt. 4 instead. */ - } - } - } - facet->upperdelaunay= False; - if (qh DELAUNAY) { - if (qh UPPERdelaunay) { /* matches qh_triangulate_facet and qh.lower_threshold in qh_initbuild */ - if (facet->normal[qh hull_dim -1] >= qh ANGLEround * qh_ZEROdelaunay) - facet->upperdelaunay= True; - }else { - if (facet->normal[qh hull_dim -1] > -qh ANGLEround * qh_ZEROdelaunay) - facet->upperdelaunay= True; - } - } - if (qh PRINTstatistics || qh IStracing || qh TRACElevel || qh JOGGLEmax < REALmax) { - qh old_randomdist= qh RANDOMdist; - qh RANDOMdist= False; - FOREACHvertex_(facet->vertices) { - if (vertex->point != point0) { - boolT istrace= False; - zinc_(Zdiststat); - qh_distplane(vertex->point, facet, &dist); - dist= fabs_(dist); - zinc_(Znewvertex); - wadd_(Wnewvertex, dist); - if (dist > wwval_(Wnewvertexmax)) { - wwval_(Wnewvertexmax)= dist; - if (dist > qh max_outside) { - qh max_outside= dist; /* used by qh_maxouter() */ - if (dist > qh TRACEdist) - istrace= True; - } - }else if (-dist > qh TRACEdist) - istrace= True; - if (istrace) { - fprintf (qh ferr, "qh_setfacetplane: ====== vertex p%d (v%d) increases max_outside to %2.2g for new facet f%d last p%d\n", - qh_pointid(vertex->point), vertex->id, dist, facet->id, qh furthest_id); - qh_errprint ("DISTANT", facet, NULL, NULL, NULL); - } - } - } - qh RANDOMdist= qh old_randomdist; - } - if (qh IStracing >= 3) { - fprintf (qh ferr, "qh_setfacetplane: f%d offset %2.2g normal: ", - facet->id, facet->offset); - for (k=0; k < qh hull_dim; k++) - fprintf (qh ferr, "%2.2g ", facet->normal[k]); - fprintf (qh ferr, "\n"); - } - if (facet == qh tracefacet) - qh IStracing= oldtrace; -} /* setfacetplane */ - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="sethyperplane_det">-</a> - - qh_sethyperplane_det( dim, rows, point0, toporient, normal, offset, nearzero ) - given dim X dim array indexed by rows[], one row per point, - toporient (flips all signs), - and point0 (any row) - set normalized hyperplane equation from oriented simplex - - returns: - normal (normalized) - offset (places point0 on the hyperplane) - sets nearzero if hyperplane not through points - - notes: - only defined for dim == 2..4 - rows[] is not modified - solves det(P-V_0, V_n-V_0, ..., V_1-V_0)=0, i.e. every point is on hyperplane - see Bower & Woodworth, A programmer's geometry, Butterworths 1983. - - derivation of 3-d minnorm - Goal: all vertices V_i within qh.one_merge of hyperplane - Plan: exactly translate the facet so that V_0 is the origin - exactly rotate the facet so that V_1 is on the x-axis and y_2=0. - exactly rotate the effective perturbation to only effect n_0 - this introduces a factor of sqrt(3) - n_0 = ((y_2-y_0)*(z_1-z_0) - (z_2-z_0)*(y_1-y_0)) / norm - Let M_d be the max coordinate difference - Let M_a be the greater of M_d and the max abs. coordinate - Let u be machine roundoff and distround be max error for distance computation - The max error for n_0 is sqrt(3) u M_a M_d / norm. n_1 is approx. 1 and n_2 is approx. 0 - The max error for distance of V_1 is sqrt(3) u M_a M_d M_d / norm. Offset=0 at origin - Then minnorm = 1.8 u M_a M_d M_d / qh.ONEmerge - Note that qh.one_merge is approx. 45.5 u M_a and norm is usually about M_d M_d - - derivation of 4-d minnorm - same as above except rotate the facet so that V_1 on x-axis and w_2, y_3, w_3=0 - [if two vertices fixed on x-axis, can rotate the other two in yzw.] - n_0 = det3_(...) = y_2 det2_(z_1, w_1, z_3, w_3) = - y_2 w_1 z_3 - [all other terms contain at least two factors nearly zero.] - The max error for n_0 is sqrt(4) u M_a M_d M_d / norm - Then minnorm = 2 u M_a M_d M_d M_d / qh.ONEmerge - Note that qh.one_merge is approx. 82 u M_a and norm is usually about M_d M_d M_d -*/ -void qh_sethyperplane_det (int dim, coordT **rows, coordT *point0, - boolT toporient, coordT *normal, realT *offset, boolT *nearzero) { - realT maxround, dist; - int i; - pointT *point; - - - if (dim == 2) { - normal[0]= dY(1,0); - normal[1]= dX(0,1); - qh_normalize2 (normal, dim, toporient, NULL, NULL); - *offset= -(point0[0]*normal[0]+point0[1]*normal[1]); - *nearzero= False; /* since nearzero norm => incident points */ - }else if (dim == 3) { - normal[0]= det2_(dY(2,0), dZ(2,0), - dY(1,0), dZ(1,0)); - normal[1]= det2_(dX(1,0), dZ(1,0), - dX(2,0), dZ(2,0)); - normal[2]= det2_(dX(2,0), dY(2,0), - dX(1,0), dY(1,0)); - qh_normalize2 (normal, dim, toporient, NULL, NULL); - *offset= -(point0[0]*normal[0] + point0[1]*normal[1] - + point0[2]*normal[2]); - maxround= qh DISTround; - for (i=dim; i--; ) { - point= rows[i]; - if (point != point0) { - dist= *offset + (point[0]*normal[0] + point[1]*normal[1] - + point[2]*normal[2]); - if (dist > maxround || dist < -maxround) { - *nearzero= True; - break; - } - } - } - }else if (dim == 4) { - normal[0]= - det3_(dY(2,0), dZ(2,0), dW(2,0), - dY(1,0), dZ(1,0), dW(1,0), - dY(3,0), dZ(3,0), dW(3,0)); - normal[1]= det3_(dX(2,0), dZ(2,0), dW(2,0), - dX(1,0), dZ(1,0), dW(1,0), - dX(3,0), dZ(3,0), dW(3,0)); - normal[2]= - det3_(dX(2,0), dY(2,0), dW(2,0), - dX(1,0), dY(1,0), dW(1,0), - dX(3,0), dY(3,0), dW(3,0)); - normal[3]= det3_(dX(2,0), dY(2,0), dZ(2,0), - dX(1,0), dY(1,0), dZ(1,0), - dX(3,0), dY(3,0), dZ(3,0)); - qh_normalize2 (normal, dim, toporient, NULL, NULL); - *offset= -(point0[0]*normal[0] + point0[1]*normal[1] - + point0[2]*normal[2] + point0[3]*normal[3]); - maxround= qh DISTround; - for (i=dim; i--; ) { - point= rows[i]; - if (point != point0) { - dist= *offset + (point[0]*normal[0] + point[1]*normal[1] - + point[2]*normal[2] + point[3]*normal[3]); - if (dist > maxround || dist < -maxround) { - *nearzero= True; - break; - } - } - } - } - if (*nearzero) { - zzinc_(Zminnorm); - trace0((qh ferr, "qh_sethyperplane_det: degenerate norm during p%d.\n", qh furthest_id)); - zzinc_(Znearlysingular); - } -} /* sethyperplane_det */ - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="sethyperplane_gauss">-</a> - - qh_sethyperplane_gauss( dim, rows, point0, toporient, normal, offset, nearzero ) - given (dim-1) X dim array of rows[i]= V_{i+1} - V_0 (point0) - set normalized hyperplane equation from oriented simplex - - returns: - normal (normalized) - offset (places point0 on the hyperplane) - - notes: - if nearzero - orientation may be incorrect because of incorrect sign flips in gausselim - solves [V_n-V_0,...,V_1-V_0, 0 .. 0 1] * N == [0 .. 0 1] - or [V_n-V_0,...,V_1-V_0, 0 .. 0 1] * N == [0] - i.e., N is normal to the hyperplane, and the unnormalized - distance to [0 .. 1] is either 1 or 0 - - design: - perform gaussian elimination - flip sign for negative values - perform back substitution - normalize result - compute offset -*/ -void qh_sethyperplane_gauss (int dim, coordT **rows, pointT *point0, - boolT toporient, coordT *normal, coordT *offset, boolT *nearzero) { - coordT *pointcoord, *normalcoef; - int k; - boolT sign= toporient, nearzero2= False; - - qh_gausselim(rows, dim-1, dim, &sign, nearzero); - for(k= dim-1; k--; ) { - if ((rows[k])[k] < 0) - sign ^= 1; - } - if (*nearzero) { - zzinc_(Znearlysingular); - trace0((qh ferr, "qh_sethyperplane_gauss: nearly singular or axis parallel hyperplane during p%d.\n", qh furthest_id)); - qh_backnormal(rows, dim-1, dim, sign, normal, &nearzero2); - }else { - qh_backnormal(rows, dim-1, dim, sign, normal, &nearzero2); - if (nearzero2) { - zzinc_(Znearlysingular); - trace0((qh ferr, "qh_sethyperplane_gauss: singular or axis parallel hyperplane at normalization during p%d.\n", qh furthest_id)); - } - } - if (nearzero2) - *nearzero= True; - qh_normalize2(normal, dim, True, NULL, NULL); - pointcoord= point0; - normalcoef= normal; - *offset= -(*pointcoord++ * *normalcoef++); - for(k= dim-1; k--; ) - *offset -= *pointcoord++ * *normalcoef++; -} /* sethyperplane_gauss */ - - - diff --git a/extern/qhull/src/geom.h b/extern/qhull/src/geom.h deleted file mode 100644 index 32440cff56f..00000000000 --- a/extern/qhull/src/geom.h +++ /dev/null @@ -1,177 +0,0 @@ -/*<html><pre> -<a href="qh-geom.htm" - >-------------------------------</a><a name="TOP">-</a> - - geom.h - header file for geometric routines - - see qh-geom.htm and geom.c - - copyright (c) 1993-2002 The Geometry Center -*/ - -#ifndef qhDEFgeom -#define qhDEFgeom 1 - -/* ============ -macros- ======================== */ - -/*-<a href="qh-geom.htm#TOC" - >--------------------------------</a><a name="fabs_">-</a> - - fabs_(a) - returns the absolute value of a -*/ -#define fabs_( a ) ((( a ) < 0 ) ? -( a ):( a )) - -/*-<a href="qh-geom.htm#TOC" - >--------------------------------</a><a name="fmax_">-</a> - - fmax_(a,b) - returns the maximum value of a and b -*/ -#define fmax_( a,b ) ( ( a ) < ( b ) ? ( b ) : ( a ) ) - -/*-<a href="qh-geom.htm#TOC" - >--------------------------------</a><a name="fmin_">-</a> - - fmin_(a,b) - returns the minimum value of a and b -*/ -#define fmin_( a,b ) ( ( a ) > ( b ) ? ( b ) : ( a ) ) - -/*-<a href="qh-geom.htm#TOC" - >--------------------------------</a><a name="maximize_">-</a> - - maximize_(maxval, val) - set maxval to val if val is greater than maxval -*/ -#define maximize_( maxval, val ) {if (( maxval ) < ( val )) ( maxval )= ( val );} - -/*-<a href="qh-geom.htm#TOC" - >--------------------------------</a><a name="minimize_">-</a> - - minimize_(minval, val) - set minval to val if val is less than minval -*/ -#define minimize_( minval, val ) {if (( minval ) > ( val )) ( minval )= ( val );} - -/*-<a href="qh-geom.htm#TOC" - >--------------------------------</a><a name="det2_">-</a> - - det2_(a1, a2, - b1, b2) - - compute a 2-d determinate -*/ -#define det2_( a1,a2,b1,b2 ) (( a1 )*( b2 ) - ( a2 )*( b1 )) - -/*-<a href="qh-geom.htm#TOC" - >--------------------------------</a><a name="det3_">-</a> - - det3_(a1, a2, a3, - b1, b2, b3, - c1, c2, c3) - - compute a 3-d determinate -*/ -#define det3_( a1,a2,a3,b1,b2,b3,c1,c2,c3 ) ( ( a1 )*det2_( b2,b3,c2,c3 ) \ - - ( b1 )*det2_( a2,a3,c2,c3 ) + ( c1 )*det2_( a2,a3,b2,b3 ) ) - -/*-<a href="qh-geom.htm#TOC" - >--------------------------------</a><a name="dX">-</a> - - dX( p1, p2 ) - dY( p1, p2 ) - dZ( p1, p2 ) - - given two indices into rows[], - - compute the difference between X, Y, or Z coordinates -*/ -#define dX( p1,p2 ) ( *( rows[p1] ) - *( rows[p2] )) -#define dY( p1,p2 ) ( *( rows[p1]+1 ) - *( rows[p2]+1 )) -#define dZ( p1,p2 ) ( *( rows[p1]+2 ) - *( rows[p2]+2 )) -#define dW( p1,p2 ) ( *( rows[p1]+3 ) - *( rows[p2]+3 )) - -/*============= prototypes in alphabetical order, infrequent at end ======= */ - -void qh_backnormal (realT **rows, int numrow, int numcol, boolT sign, coordT *normal, boolT *nearzero); -void qh_distplane (pointT *point, facetT *facet, realT *dist); -facetT *qh_findbest (pointT *point, facetT *startfacet, - boolT bestoutside, boolT isnewfacets, boolT noupper, - realT *dist, boolT *isoutside, int *numpart); -facetT *qh_findbesthorizon (boolT ischeckmax, pointT *point, - facetT *startfacet, boolT noupper, realT *bestdist, int *numpart); -facetT *qh_findbestnew (pointT *point, facetT *startfacet, realT *dist, - boolT bestoutside, boolT *isoutside, int *numpart); -void qh_gausselim(realT **rows, int numrow, int numcol, boolT *sign, boolT *nearzero); -realT qh_getangle(pointT *vect1, pointT *vect2); -pointT *qh_getcenter(setT *vertices); -pointT *qh_getcentrum(facetT *facet); -realT qh_getdistance(facetT *facet, facetT *neighbor, realT *mindist, realT *maxdist); -void qh_normalize (coordT *normal, int dim, boolT toporient); -void qh_normalize2 (coordT *normal, int dim, boolT toporient, - realT *minnorm, boolT *ismin); -pointT *qh_projectpoint(pointT *point, facetT *facet, realT dist); - -void qh_setfacetplane(facetT *newfacets); -void qh_sethyperplane_det (int dim, coordT **rows, coordT *point0, - boolT toporient, coordT *normal, realT *offset, boolT *nearzero); -void qh_sethyperplane_gauss (int dim, coordT **rows, pointT *point0, - boolT toporient, coordT *normal, coordT *offset, boolT *nearzero); -boolT qh_sharpnewfacets (void); - -/*========= infrequently used code in geom2.c =============*/ - - -coordT *qh_copypoints (coordT *points, int numpoints, int dimension); -void qh_crossproduct (int dim, realT vecA[3], realT vecB[3], realT vecC[3]); -realT qh_determinant (realT **rows, int dim, boolT *nearzero); -realT qh_detjoggle (pointT *points, int numpoints, int dimension); -void qh_detroundoff (void); -realT qh_detsimplex(pointT *apex, setT *points, int dim, boolT *nearzero); -realT qh_distnorm (int dim, pointT *point, pointT *normal, realT *offsetp); -realT qh_distround (int dimension, realT maxabs, realT maxsumabs); -realT qh_divzero(realT numer, realT denom, realT mindenom1, boolT *zerodiv); -realT qh_facetarea (facetT *facet); -realT qh_facetarea_simplex (int dim, coordT *apex, setT *vertices, - vertexT *notvertex, boolT toporient, coordT *normal, realT *offset); -pointT *qh_facetcenter (setT *vertices); -facetT *qh_findgooddist (pointT *point, facetT *facetA, realT *distp, facetT **facetlist); -void qh_getarea (facetT *facetlist); -boolT qh_gram_schmidt(int dim, realT **rows); -boolT qh_inthresholds (coordT *normal, realT *angle); -void qh_joggleinput (void); -realT *qh_maxabsval (realT *normal, int dim); -setT *qh_maxmin(pointT *points, int numpoints, int dimension); -realT qh_maxouter (void); -void qh_maxsimplex (int dim, setT *maxpoints, pointT *points, int numpoints, setT **simplex); -realT qh_minabsval (realT *normal, int dim); -int qh_mindiff (realT *vecA, realT *vecB, int dim); -boolT qh_orientoutside (facetT *facet); -void qh_outerinner (facetT *facet, realT *outerplane, realT *innerplane); -coordT qh_pointdist(pointT *point1, pointT *point2, int dim); -void qh_printmatrix (FILE *fp, char *string, realT **rows, int numrow, int numcol); -void qh_printpoints (FILE *fp, char *string, setT *points); -void qh_projectinput (void); -void qh_projectpoints (signed char *project, int n, realT *points, - int numpoints, int dim, realT *newpoints, int newdim); -int qh_rand( void); -void qh_srand( int seed); -realT qh_randomfactor (void); -void qh_randommatrix (realT *buffer, int dim, realT **row); -void qh_rotateinput (realT **rows); -void qh_rotatepoints (realT *points, int numpoints, int dim, realT **rows); -void qh_scaleinput (void); -void qh_scalelast (coordT *points, int numpoints, int dim, coordT low, - coordT high, coordT newhigh); -void qh_scalepoints (pointT *points, int numpoints, int dim, - realT *newlows, realT *newhighs); -boolT qh_sethalfspace (int dim, coordT *coords, coordT **nextp, - coordT *normal, coordT *offset, coordT *feasible); -coordT *qh_sethalfspace_all (int dim, int count, coordT *halfspaces, pointT *feasible); -pointT *qh_voronoi_center (int dim, setT *points); - -#endif /* qhDEFgeom */ - - - diff --git a/extern/qhull/src/geom2.c b/extern/qhull/src/geom2.c deleted file mode 100644 index bd58ce1282b..00000000000 --- a/extern/qhull/src/geom2.c +++ /dev/null @@ -1,2160 +0,0 @@ -/*<html><pre> -<a href="qh-geom.htm" - >-------------------------------</a><a name="TOP">-</a> - - - geom2.c - infrequently used geometric routines of qhull - - see qh-geom.htm and geom.h - - copyright (c) 1993-2002 The Geometry Center - - frequently used code goes into geom.c -*/ - -#include "qhull_a.h" - -/*================== functions in alphabetic order ============*/ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="copypoints">-</a> - - qh_copypoints( points, numpoints, dimension) - return malloc'd copy of points -*/ -coordT *qh_copypoints (coordT *points, int numpoints, int dimension) { - int size; - coordT *newpoints; - - size= numpoints * dimension * sizeof(coordT); - if (!(newpoints=(coordT*)malloc(size))) { - fprintf(qh ferr, "qhull error: insufficient memory to copy %d points\n", - numpoints); - qh_errexit(qh_ERRmem, NULL, NULL); - } - memcpy ((char *)newpoints, (char *)points, size); - return newpoints; -} /* copypoints */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="crossproduct">-</a> - - qh_crossproduct( dim, vecA, vecB, vecC ) - crossproduct of 2 dim vectors - C= A x B - - notes: - from Glasner, Graphics Gems I, p. 639 - only defined for dim==3 -*/ -void qh_crossproduct (int dim, realT vecA[3], realT vecB[3], realT vecC[3]){ - - if (dim == 3) { - vecC[0]= det2_(vecA[1], vecA[2], - vecB[1], vecB[2]); - vecC[1]= - det2_(vecA[0], vecA[2], - vecB[0], vecB[2]); - vecC[2]= det2_(vecA[0], vecA[1], - vecB[0], vecB[1]); - } -} /* vcross */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="determinant">-</a> - - qh_determinant( rows, dim, nearzero ) - compute signed determinant of a square matrix - uses qh.NEARzero to test for degenerate matrices - - returns: - determinant - overwrites rows and the matrix - if dim == 2 or 3 - nearzero iff determinant < qh NEARzero[dim-1] - (not quite correct, not critical) - if dim >= 4 - nearzero iff diagonal[k] < qh NEARzero[k] -*/ -realT qh_determinant (realT **rows, int dim, boolT *nearzero) { - realT det=0; - int i; - boolT sign= False; - - *nearzero= False; - if (dim < 2) { - fprintf (qh ferr, "qhull internal error (qh_determinate): only implemented for dimension >= 2\n"); - qh_errexit (qh_ERRqhull, NULL, NULL); - }else if (dim == 2) { - det= det2_(rows[0][0], rows[0][1], - rows[1][0], rows[1][1]); - if (fabs_(det) < qh NEARzero[1]) /* not really correct, what should this be? */ - *nearzero= True; - }else if (dim == 3) { - det= det3_(rows[0][0], rows[0][1], rows[0][2], - rows[1][0], rows[1][1], rows[1][2], - rows[2][0], rows[2][1], rows[2][2]); - if (fabs_(det) < qh NEARzero[2]) /* not really correct, what should this be? */ - *nearzero= True; - }else { - qh_gausselim(rows, dim, dim, &sign, nearzero); /* if nearzero, diagonal still ok*/ - det= 1.0; - for (i= dim; i--; ) - det *= (rows[i])[i]; - if (sign) - det= -det; - } - return det; -} /* determinant */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="detjoggle">-</a> - - qh_detjoggle( points, numpoints, dimension ) - determine default max joggle for point array - as qh_distround * qh_JOGGLEdefault - - returns: - initial value for JOGGLEmax from points and REALepsilon - - notes: - computes DISTround since qh_maxmin not called yet - if qh SCALElast, last dimension will be scaled later to MAXwidth - - loop duplicated from qh_maxmin -*/ -realT qh_detjoggle (pointT *points, int numpoints, int dimension) { - realT abscoord, distround, joggle, maxcoord, mincoord; - pointT *point, *pointtemp; - realT maxabs= -REALmax; - realT sumabs= 0; - realT maxwidth= 0; - int k; - - for (k= 0; k < dimension; k++) { - if (qh SCALElast && k == dimension-1) - abscoord= maxwidth; - else if (qh DELAUNAY && k == dimension-1) /* will qh_setdelaunay() */ - abscoord= 2 * maxabs * maxabs; /* may be low by qh hull_dim/2 */ - else { - maxcoord= -REALmax; - mincoord= REALmax; - FORALLpoint_(points, numpoints) { - maximize_(maxcoord, point[k]); - minimize_(mincoord, point[k]); - } - maximize_(maxwidth, maxcoord-mincoord); - abscoord= fmax_(maxcoord, -mincoord); - } - sumabs += abscoord; - maximize_(maxabs, abscoord); - } /* for k */ - distround= qh_distround (qh hull_dim, maxabs, sumabs); - joggle= distround * qh_JOGGLEdefault; - maximize_(joggle, REALepsilon * qh_JOGGLEdefault); - trace2((qh ferr, "qh_detjoggle: joggle=%2.2g maxwidth=%2.2g\n", joggle, maxwidth)); - return joggle; -} /* detjoggle */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="detroundoff">-</a> - - qh_detroundoff() - determine maximum roundoff errors from - REALepsilon, REALmax, REALmin, qh.hull_dim, qh.MAXabs_coord, - qh.MAXsumcoord, qh.MAXwidth, qh.MINdenom_1 - - accounts for qh.SETroundoff, qh.RANDOMdist, qh MERGEexact - qh.premerge_cos, qh.postmerge_cos, qh.premerge_centrum, - qh.postmerge_centrum, qh.MINoutside, - qh_RATIOnearinside, qh_COPLANARratio, qh_WIDEcoplanar - - returns: - sets qh.DISTround, etc. (see below) - appends precision constants to qh.qhull_options - - see: - qh_maxmin() for qh.NEARzero - - design: - determine qh.DISTround for distance computations - determine minimum denominators for qh_divzero - determine qh.ANGLEround for angle computations - adjust qh.premerge_cos,... for roundoff error - determine qh.ONEmerge for maximum error due to a single merge - determine qh.NEARinside, qh.MAXcoplanar, qh.MINvisible, - qh.MINoutside, qh.WIDEfacet - initialize qh.max_vertex and qh.minvertex -*/ -void qh_detroundoff (void) { - - qh_option ("_max-width", NULL, &qh MAXwidth); - if (!qh SETroundoff) { - qh DISTround= qh_distround (qh hull_dim, qh MAXabs_coord, qh MAXsumcoord); - if (qh RANDOMdist) - qh DISTround += qh RANDOMfactor * qh MAXabs_coord; - qh_option ("Error-roundoff", NULL, &qh DISTround); - } - qh MINdenom= qh MINdenom_1 * qh MAXabs_coord; - qh MINdenom_1_2= sqrt (qh MINdenom_1 * qh hull_dim) ; /* if will be normalized */ - qh MINdenom_2= qh MINdenom_1_2 * qh MAXabs_coord; - /* for inner product */ - qh ANGLEround= 1.01 * qh hull_dim * REALepsilon; - if (qh RANDOMdist) - qh ANGLEround += qh RANDOMfactor; - if (qh premerge_cos < REALmax/2) { - qh premerge_cos -= qh ANGLEround; - if (qh RANDOMdist) - qh_option ("Angle-premerge-with-random", NULL, &qh premerge_cos); - } - if (qh postmerge_cos < REALmax/2) { - qh postmerge_cos -= qh ANGLEround; - if (qh RANDOMdist) - qh_option ("Angle-postmerge-with-random", NULL, &qh postmerge_cos); - } - qh premerge_centrum += 2 * qh DISTround; /*2 for centrum and distplane()*/ - qh postmerge_centrum += 2 * qh DISTround; - if (qh RANDOMdist && (qh MERGEexact || qh PREmerge)) - qh_option ("Centrum-premerge-with-random", NULL, &qh premerge_centrum); - if (qh RANDOMdist && qh POSTmerge) - qh_option ("Centrum-postmerge-with-random", NULL, &qh postmerge_centrum); - { /* compute ONEmerge, max vertex offset for merging simplicial facets */ - realT maxangle= 1.0, maxrho; - - minimize_(maxangle, qh premerge_cos); - minimize_(maxangle, qh postmerge_cos); - /* max diameter * sin theta + DISTround for vertex to its hyperplane */ - qh ONEmerge= sqrt (qh hull_dim) * qh MAXwidth * - sqrt (1.0 - maxangle * maxangle) + qh DISTround; - maxrho= qh hull_dim * qh premerge_centrum + qh DISTround; - maximize_(qh ONEmerge, maxrho); - maxrho= qh hull_dim * qh postmerge_centrum + qh DISTround; - maximize_(qh ONEmerge, maxrho); - if (qh MERGING) - qh_option ("_one-merge", NULL, &qh ONEmerge); - } - qh NEARinside= qh ONEmerge * qh_RATIOnearinside; /* only used if qh KEEPnearinside */ - if (qh JOGGLEmax < REALmax/2 && (qh KEEPcoplanar || qh KEEPinside)) { - realT maxdist; /* adjust qh.NEARinside for joggle */ - qh KEEPnearinside= True; - maxdist= sqrt (qh hull_dim) * qh JOGGLEmax + qh DISTround; - maxdist= 2*maxdist; /* vertex and coplanar point can joggle in opposite directions */ - maximize_(qh NEARinside, maxdist); /* must agree with qh_nearcoplanar() */ - } - if (qh KEEPnearinside) - qh_option ("_near-inside", NULL, &qh NEARinside); - if (qh JOGGLEmax < qh DISTround) { - fprintf (qh ferr, "qhull error: the joggle for 'QJn', %.2g, is below roundoff for distance computations, %.2g\n", - qh JOGGLEmax, qh DISTround); - qh_errexit (qh_ERRinput, NULL, NULL); - } - if (qh MINvisible > REALmax/2) { - if (!qh MERGING) - qh MINvisible= qh DISTround; - else if (qh hull_dim <= 3) - qh MINvisible= qh premerge_centrum; - else - qh MINvisible= qh_COPLANARratio * qh premerge_centrum; - if (qh APPROXhull && qh MINvisible > qh MINoutside) - qh MINvisible= qh MINoutside; - qh_option ("Visible-distance", NULL, &qh MINvisible); - } - if (qh MAXcoplanar > REALmax/2) { - qh MAXcoplanar= qh MINvisible; - qh_option ("U-coplanar-distance", NULL, &qh MAXcoplanar); - } - if (!qh APPROXhull) { /* user may specify qh MINoutside */ - qh MINoutside= 2 * qh MINvisible; - if (qh premerge_cos < REALmax/2) - maximize_(qh MINoutside, (1- qh premerge_cos) * qh MAXabs_coord); - qh_option ("Width-outside", NULL, &qh MINoutside); - } - qh WIDEfacet= qh MINoutside; - maximize_(qh WIDEfacet, qh_WIDEcoplanar * qh MAXcoplanar); - maximize_(qh WIDEfacet, qh_WIDEcoplanar * qh MINvisible); - qh_option ("_wide-facet", NULL, &qh WIDEfacet); - if (qh MINvisible > qh MINoutside + 3 * REALepsilon - && !qh BESToutside && !qh FORCEoutput) - fprintf (qh ferr, "qhull input warning: minimum visibility V%.2g is greater than \nminimum outside W%.2g. Flipped facets are likely.\n", - qh MINvisible, qh MINoutside); - qh max_vertex= qh DISTround; - qh min_vertex= -qh DISTround; - /* numeric constants reported in printsummary */ -} /* detroundoff */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="detsimplex">-</a> - - qh_detsimplex( apex, points, dim, nearzero ) - compute determinant of a simplex with point apex and base points - - returns: - signed determinant and nearzero from qh_determinant - - notes: - uses qh.gm_matrix/qh.gm_row (assumes they're big enough) - - design: - construct qm_matrix by subtracting apex from points - compute determinate -*/ -realT qh_detsimplex(pointT *apex, setT *points, int dim, boolT *nearzero) { - pointT *coorda, *coordp, *gmcoord, *point, **pointp; - coordT **rows; - int k, i=0; - realT det; - - zinc_(Zdetsimplex); - gmcoord= qh gm_matrix; - rows= qh gm_row; - FOREACHpoint_(points) { - if (i == dim) - break; - rows[i++]= gmcoord; - coordp= point; - coorda= apex; - for (k= dim; k--; ) - *(gmcoord++)= *coordp++ - *coorda++; - } - if (i < dim) { - fprintf (qh ferr, "qhull internal error (qh_detsimplex): #points %d < dimension %d\n", - i, dim); - qh_errexit (qh_ERRqhull, NULL, NULL); - } - det= qh_determinant (rows, dim, nearzero); - trace2((qh ferr, "qh_detsimplex: det=%2.2g for point p%d, dim %d, nearzero? %d\n", - det, qh_pointid(apex), dim, *nearzero)); - return det; -} /* detsimplex */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="distnorm">-</a> - - qh_distnorm( dim, point, normal, offset ) - return distance from point to hyperplane at normal/offset - - returns: - dist - - notes: - dist > 0 if point is outside of hyperplane - - see: - qh_distplane in geom.c -*/ -realT qh_distnorm (int dim, pointT *point, pointT *normal, realT *offsetp) { - coordT *normalp= normal, *coordp= point; - realT dist; - int k; - - dist= *offsetp; - for (k= dim; k--; ) - dist += *(coordp++) * *(normalp++); - return dist; -} /* distnorm */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="distround">-</a> - - qh_distround ( dimension, maxabs, maxsumabs ) - compute maximum round-off error for a distance computation - to a normalized hyperplane - maxabs is the maximum absolute value of a coordinate - maxsumabs is the maximum possible sum of absolute coordinate values - - returns: - max dist round for REALepsilon - - notes: - calculate roundoff error according to - Lemma 3.2-1 of Golub and van Loan "Matrix Computation" - use sqrt(dim) since one vector is normalized - or use maxsumabs since one vector is < 1 -*/ -realT qh_distround (int dimension, realT maxabs, realT maxsumabs) { - realT maxdistsum, maxround; - - maxdistsum= sqrt (dimension) * maxabs; - minimize_( maxdistsum, maxsumabs); - maxround= REALepsilon * (dimension * maxdistsum * 1.01 + maxabs); - /* adds maxabs for offset */ - trace4((qh ferr, "qh_distround: %2.2g maxabs %2.2g maxsumabs %2.2g maxdistsum %2.2g\n", - maxround, maxabs, maxsumabs, maxdistsum)); - return maxround; -} /* distround */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="divzero">-</a> - - qh_divzero( numer, denom, mindenom1, zerodiv ) - divide by a number that's nearly zero - mindenom1= minimum denominator for dividing into 1.0 - - returns: - quotient - sets zerodiv and returns 0.0 if it would overflow - - design: - if numer is nearly zero and abs(numer) < abs(denom) - return numer/denom - else if numer is nearly zero - return 0 and zerodiv - else if denom/numer non-zero - return numer/denom - else - return 0 and zerodiv -*/ -realT qh_divzero (realT numer, realT denom, realT mindenom1, boolT *zerodiv) { - realT temp, numerx, denomx; - - - if (numer < mindenom1 && numer > -mindenom1) { - numerx= fabs_(numer); - denomx= fabs_(denom); - if (numerx < denomx) { - *zerodiv= False; - return numer/denom; - }else { - *zerodiv= True; - return 0.0; - } - } - temp= denom/numer; - if (temp > mindenom1 || temp < -mindenom1) { - *zerodiv= False; - return numer/denom; - }else { - *zerodiv= True; - return 0.0; - } -} /* divzero */ - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="facetarea">-</a> - - qh_facetarea( facet ) - return area for a facet - - notes: - if non-simplicial, - uses centrum to triangulate facet and sums the projected areas. - if (qh DELAUNAY), - computes projected area instead for last coordinate - assumes facet->normal exists - projecting tricoplanar facets to the hyperplane does not appear to make a difference - - design: - if simplicial - compute area - else - for each ridge - compute area from centrum to ridge - negate area if upper Delaunay facet -*/ -realT qh_facetarea (facetT *facet) { - vertexT *apex; - pointT *centrum; - realT area= 0.0; - ridgeT *ridge, **ridgep; - - if (facet->simplicial) { - apex= SETfirstt_(facet->vertices, vertexT); - area= qh_facetarea_simplex (qh hull_dim, apex->point, facet->vertices, - apex, facet->toporient, facet->normal, &facet->offset); - }else { - if (qh CENTERtype == qh_AScentrum) - centrum= facet->center; - else - centrum= qh_getcentrum (facet); - FOREACHridge_(facet->ridges) - area += qh_facetarea_simplex (qh hull_dim, centrum, ridge->vertices, - NULL, (ridge->top == facet), facet->normal, &facet->offset); - if (qh CENTERtype != qh_AScentrum) - qh_memfree (centrum, qh normal_size); - } - if (facet->upperdelaunay && qh DELAUNAY) - area= -area; /* the normal should be [0,...,1] */ - trace4((qh ferr, "qh_facetarea: f%d area %2.2g\n", facet->id, area)); - return area; -} /* facetarea */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="facetarea_simplex">-</a> - - qh_facetarea_simplex( dim, apex, vertices, notvertex, toporient, normal, offset ) - return area for a simplex defined by - an apex, a base of vertices, an orientation, and a unit normal - if simplicial or tricoplanar facet, - notvertex is defined and it is skipped in vertices - - returns: - computes area of simplex projected to plane [normal,offset] - returns 0 if vertex too far below plane (qh WIDEfacet) - vertex can't be apex of tricoplanar facet - - notes: - if (qh DELAUNAY), - computes projected area instead for last coordinate - uses qh gm_matrix/gm_row and qh hull_dim - helper function for qh_facetarea - - design: - if Notvertex - translate simplex to apex - else - project simplex to normal/offset - translate simplex to apex - if Delaunay - set last row/column to 0 with -1 on diagonal - else - set last row to Normal - compute determinate - scale and flip sign for area -*/ -realT qh_facetarea_simplex (int dim, coordT *apex, setT *vertices, - vertexT *notvertex, boolT toporient, coordT *normal, realT *offset) { - pointT *coorda, *coordp, *gmcoord; - coordT **rows, *normalp; - int k, i=0; - realT area, dist; - vertexT *vertex, **vertexp; - boolT nearzero; - - gmcoord= qh gm_matrix; - rows= qh gm_row; - FOREACHvertex_(vertices) { - if (vertex == notvertex) - continue; - rows[i++]= gmcoord; - coorda= apex; - coordp= vertex->point; - normalp= normal; - if (notvertex) { - for (k= dim; k--; ) - *(gmcoord++)= *coordp++ - *coorda++; - }else { - dist= *offset; - for (k= dim; k--; ) - dist += *coordp++ * *normalp++; - if (dist < -qh WIDEfacet) { - zinc_(Znoarea); - return 0.0; - } - coordp= vertex->point; - normalp= normal; - for (k= dim; k--; ) - *(gmcoord++)= (*coordp++ - dist * *normalp++) - *coorda++; - } - } - if (i != dim-1) { - fprintf (qh ferr, "qhull internal error (qh_facetarea_simplex): #points %d != dim %d -1\n", - i, dim); - qh_errexit (qh_ERRqhull, NULL, NULL); - } - rows[i]= gmcoord; - if (qh DELAUNAY) { - for (i= 0; i < dim-1; i++) - rows[i][dim-1]= 0.0; - for (k= dim; k--; ) - *(gmcoord++)= 0.0; - rows[dim-1][dim-1]= -1.0; - }else { - normalp= normal; - for (k= dim; k--; ) - *(gmcoord++)= *normalp++; - } - zinc_(Zdetsimplex); - area= qh_determinant (rows, dim, &nearzero); - if (toporient) - area= -area; - area *= qh AREAfactor; - trace4((qh ferr, "qh_facetarea_simplex: area=%2.2g for point p%d, toporient %d, nearzero? %d\n", - area, qh_pointid(apex), toporient, nearzero)); - return area; -} /* facetarea_simplex */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="facetcenter">-</a> - - qh_facetcenter( vertices ) - return Voronoi center (Voronoi vertex) for a facet's vertices - - returns: - return temporary point equal to the center - - see: - qh_voronoi_center() -*/ -pointT *qh_facetcenter (setT *vertices) { - setT *points= qh_settemp (qh_setsize (vertices)); - vertexT *vertex, **vertexp; - pointT *center; - - FOREACHvertex_(vertices) - qh_setappend (&points, vertex->point); - center= qh_voronoi_center (qh hull_dim-1, points); - qh_settempfree (&points); - return center; -} /* facetcenter */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="findgooddist">-</a> - - qh_findgooddist( point, facetA, dist, facetlist ) - find best good facet visible for point from facetA - assumes facetA is visible from point - - returns: - best facet, i.e., good facet that is furthest from point - distance to best facet - NULL if none - - moves good, visible facets (and some other visible facets) - to end of qh facet_list - - notes: - uses qh visit_id - - design: - initialize bestfacet if facetA is good - move facetA to end of facetlist - for each facet on facetlist - for each unvisited neighbor of facet - move visible neighbors to end of facetlist - update best good neighbor - if no good neighbors, update best facet -*/ -facetT *qh_findgooddist (pointT *point, facetT *facetA, realT *distp, - facetT **facetlist) { - realT bestdist= -REALmax, dist; - facetT *neighbor, **neighborp, *bestfacet=NULL, *facet; - boolT goodseen= False; - - if (facetA->good) { - zinc_(Zcheckpart); /* calls from check_bestdist occur after print stats */ - qh_distplane (point, facetA, &bestdist); - bestfacet= facetA; - goodseen= True; - } - qh_removefacet (facetA); - qh_appendfacet (facetA); - *facetlist= facetA; - facetA->visitid= ++qh visit_id; - FORALLfacet_(*facetlist) { - FOREACHneighbor_(facet) { - if (neighbor->visitid == qh visit_id) - continue; - neighbor->visitid= qh visit_id; - if (goodseen && !neighbor->good) - continue; - zinc_(Zcheckpart); - qh_distplane (point, neighbor, &dist); - if (dist > 0) { - qh_removefacet (neighbor); - qh_appendfacet (neighbor); - if (neighbor->good) { - goodseen= True; - if (dist > bestdist) { - bestdist= dist; - bestfacet= neighbor; - } - } - } - } - } - if (bestfacet) { - *distp= bestdist; - trace2((qh ferr, "qh_findgooddist: p%d is %2.2g above good facet f%d\n", - qh_pointid(point), bestdist, bestfacet->id)); - return bestfacet; - } - trace4((qh ferr, "qh_findgooddist: no good facet for p%d above f%d\n", - qh_pointid(point), facetA->id)); - return NULL; -} /* findgooddist */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="getarea">-</a> - - qh_getarea( facetlist ) - set area of all facets in facetlist - collect statistics - - returns: - sets qh totarea/totvol to total area and volume of convex hull - for Delaunay triangulation, computes projected area of the lower or upper hull - ignores upper hull if qh ATinfinity - - notes: - could compute outer volume by expanding facet area by rays from interior - the following attempt at perpendicular projection underestimated badly: - qh.totoutvol += (-dist + facet->maxoutside + qh DISTround) - * area/ qh hull_dim; - design: - for each facet on facetlist - compute facet->area - update qh.totarea and qh.totvol -*/ -void qh_getarea (facetT *facetlist) { - realT area; - realT dist; - facetT *facet; - - if (qh REPORTfreq) - fprintf (qh ferr, "computing area of each facet and volume of the convex hull\n"); - else - trace1((qh ferr, "qh_getarea: computing volume and area for each facet\n")); - qh totarea= qh totvol= 0.0; - FORALLfacet_(facetlist) { - if (!facet->normal) - continue; - if (facet->upperdelaunay && qh ATinfinity) - continue; - facet->f.area= area= qh_facetarea (facet); - facet->isarea= True; - if (qh DELAUNAY) { - if (facet->upperdelaunay == qh UPPERdelaunay) - qh totarea += area; - }else { - qh totarea += area; - qh_distplane (qh interior_point, facet, &dist); - qh totvol += -dist * area/ qh hull_dim; - } - if (qh PRINTstatistics) { - wadd_(Wareatot, area); - wmax_(Wareamax, area); - wmin_(Wareamin, area); - } - } -} /* getarea */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="gram_schmidt">-</a> - - qh_gram_schmidt( dim, row ) - implements Gram-Schmidt orthogonalization by rows - - returns: - false if zero norm - overwrites rows[dim][dim] - - notes: - see Golub & van Loan Algorithm 6.2-2 - overflow due to small divisors not handled - - design: - for each row - compute norm for row - if non-zero, normalize row - for each remaining rowA - compute inner product of row and rowA - reduce rowA by row * inner product -*/ -boolT qh_gram_schmidt(int dim, realT **row) { - realT *rowi, *rowj, norm; - int i, j, k; - - for(i=0; i < dim; i++) { - rowi= row[i]; - for (norm= 0.0, k= dim; k--; rowi++) - norm += *rowi * *rowi; - norm= sqrt(norm); - wmin_(Wmindenom, norm); - if (norm == 0.0) /* either 0 or overflow due to sqrt */ - return False; - for(k= dim; k--; ) - *(--rowi) /= norm; - for(j= i+1; j < dim; j++) { - rowj= row[j]; - for(norm= 0.0, k=dim; k--; ) - norm += *rowi++ * *rowj++; - for(k=dim; k--; ) - *(--rowj) -= *(--rowi) * norm; - } - } - return True; -} /* gram_schmidt */ - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="inthresholds">-</a> - - qh_inthresholds( normal, angle ) - return True if normal within qh.lower_/upper_threshold - - returns: - estimate of angle by summing of threshold diffs - angle may be NULL - smaller "angle" is better - - notes: - invalid if qh.SPLITthresholds - - see: - qh.lower_threshold in qh_initbuild() - qh_initthresholds() - - design: - for each dimension - test threshold -*/ -boolT qh_inthresholds (coordT *normal, realT *angle) { - boolT within= True; - int k; - realT threshold; - - if (angle) - *angle= 0.0; - for(k= 0; k < qh hull_dim; k++) { - threshold= qh lower_threshold[k]; - if (threshold > -REALmax/2) { - if (normal[k] < threshold) - within= False; - if (angle) { - threshold -= normal[k]; - *angle += fabs_(threshold); - } - } - if (qh upper_threshold[k] < REALmax/2) { - threshold= qh upper_threshold[k]; - if (normal[k] > threshold) - within= False; - if (angle) { - threshold -= normal[k]; - *angle += fabs_(threshold); - } - } - } - return within; -} /* inthresholds */ - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="joggleinput">-</a> - - qh_joggleinput() - randomly joggle input to Qhull by qh.JOGGLEmax - initial input is qh.first_point/qh.num_points of qh.hull_dim - repeated calls use qh.input_points/qh.num_points - - returns: - joggles points at qh.first_point/qh.num_points - copies data to qh.input_points/qh.input_malloc if first time - determines qh.JOGGLEmax if it was zero - if qh.DELAUNAY - computes the Delaunay projection of the joggled points - - notes: - if qh.DELAUNAY, unnecessarily joggles the last coordinate - the initial 'QJn' may be set larger than qh_JOGGLEmaxincrease - - design: - if qh.DELAUNAY - set qh.SCALElast for reduced precision errors - if first call - initialize qh.input_points to the original input points - if qh.JOGGLEmax == 0 - determine default qh.JOGGLEmax - else - increase qh.JOGGLEmax according to qh.build_cnt - joggle the input by adding a random number in [-qh.JOGGLEmax,qh.JOGGLEmax] - if qh.DELAUNAY - sets the Delaunay projection -*/ -void qh_joggleinput (void) { - int size, i, seed; - coordT *coordp, *inputp; - realT randr, randa, randb; - - if (!qh input_points) { /* first call */ - qh input_points= qh first_point; - qh input_malloc= qh POINTSmalloc; - size= qh num_points * qh hull_dim * sizeof(coordT); - if (!(qh first_point=(coordT*)malloc(size))) { - fprintf(qh ferr, "qhull error: insufficient memory to joggle %d points\n", - qh num_points); - qh_errexit(qh_ERRmem, NULL, NULL); - } - qh POINTSmalloc= True; - if (qh JOGGLEmax == 0.0) { - qh JOGGLEmax= qh_detjoggle (qh input_points, qh num_points, qh hull_dim); - qh_option ("QJoggle", NULL, &qh JOGGLEmax); - } - }else { /* repeated call */ - if (!qh RERUN && qh build_cnt > qh_JOGGLEretry) { - if (((qh build_cnt-qh_JOGGLEretry-1) % qh_JOGGLEagain) == 0) { - realT maxjoggle= qh MAXwidth * qh_JOGGLEmaxincrease; - if (qh JOGGLEmax < maxjoggle) { - qh JOGGLEmax *= qh_JOGGLEincrease; - minimize_(qh JOGGLEmax, maxjoggle); - } - } - } - qh_option ("QJoggle", NULL, &qh JOGGLEmax); - } - if (qh build_cnt > 1 && qh JOGGLEmax > fmax_(qh MAXwidth/4, 0.1)) { - fprintf (qh ferr, "qhull error: the current joggle for 'QJn', %.2g, is too large for the width\nof the input. If possible, recompile Qhull with higher-precision reals.\n", - qh JOGGLEmax); - qh_errexit (qh_ERRqhull, NULL, NULL); - } - /* for some reason, using qh ROTATErandom and qh_RANDOMseed does not repeat the run. Use 'TRn' instead */ - seed= qh_RANDOMint; - qh_option ("_joggle-seed", &seed, NULL); - trace0((qh ferr, "qh_joggleinput: joggle input by %2.2g with seed %d\n", - qh JOGGLEmax, seed)); - inputp= qh input_points; - coordp= qh first_point; - randa= 2.0 * qh JOGGLEmax/qh_RANDOMmax; - randb= -qh JOGGLEmax; - size= qh num_points * qh hull_dim; - for (i= size; i--; ) { - randr= qh_RANDOMint; - *(coordp++)= *(inputp++) + (randr * randa + randb); - } - if (qh DELAUNAY) { - qh last_low= qh last_high= qh last_newhigh= REALmax; - qh_setdelaunay (qh hull_dim, qh num_points, qh first_point); - } -} /* joggleinput */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="maxabsval">-</a> - - qh_maxabsval( normal, dim ) - return pointer to maximum absolute value of a dim vector - returns NULL if dim=0 -*/ -realT *qh_maxabsval (realT *normal, int dim) { - realT maxval= -REALmax; - realT *maxp= NULL, *colp, absval; - int k; - - for (k= dim, colp= normal; k--; colp++) { - absval= fabs_(*colp); - if (absval > maxval) { - maxval= absval; - maxp= colp; - } - } - return maxp; -} /* maxabsval */ - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="maxmin">-</a> - - qh_maxmin( points, numpoints, dimension ) - return max/min points for each dimension - determine max and min coordinates - - returns: - returns a temporary set of max and min points - may include duplicate points. Does not include qh.GOODpoint - sets qh.NEARzero, qh.MAXabs_coord, qh.MAXsumcoord, qh.MAXwidth - qh.MAXlastcoord, qh.MINlastcoord - initializes qh.max_outside, qh.min_vertex, qh.WAScoplanar, qh.ZEROall_ok - - notes: - loop duplicated in qh_detjoggle() - - design: - initialize global precision variables - checks definition of REAL... - for each dimension - for each point - collect maximum and minimum point - collect maximum of maximums and minimum of minimums - determine qh.NEARzero for Gaussian Elimination -*/ -setT *qh_maxmin(pointT *points, int numpoints, int dimension) { - int k; - realT maxcoord, temp; - pointT *minimum, *maximum, *point, *pointtemp; - setT *set; - - qh max_outside= 0.0; - qh MAXabs_coord= 0.0; - qh MAXwidth= -REALmax; - qh MAXsumcoord= 0.0; - qh min_vertex= 0.0; - qh WAScoplanar= False; - if (qh ZEROcentrum) - qh ZEROall_ok= True; - if (REALmin < REALepsilon && REALmin < REALmax && REALmin > -REALmax - && REALmax > 0.0 && -REALmax < 0.0) - ; /* all ok */ - else { - fprintf (qh ferr, "qhull error: floating point constants in user.h are wrong\n\ -REALepsilon %g REALmin %g REALmax %g -REALmax %g\n", - REALepsilon, REALmin, REALmax, -REALmax); - qh_errexit (qh_ERRinput, NULL, NULL); - } - set= qh_settemp(2*dimension); - for(k= 0; k < dimension; k++) { - if (points == qh GOODpointp) - minimum= maximum= points + dimension; - else - minimum= maximum= points; - FORALLpoint_(points, numpoints) { - if (point == qh GOODpointp) - continue; - if (maximum[k] < point[k]) - maximum= point; - else if (minimum[k] > point[k]) - minimum= point; - } - if (k == dimension-1) { - qh MINlastcoord= minimum[k]; - qh MAXlastcoord= maximum[k]; - } - if (qh SCALElast && k == dimension-1) - maxcoord= qh MAXwidth; - else { - maxcoord= fmax_(maximum[k], -minimum[k]); - if (qh GOODpointp) { - temp= fmax_(qh GOODpointp[k], -qh GOODpointp[k]); - maximize_(maxcoord, temp); - } - temp= maximum[k] - minimum[k]; - maximize_(qh MAXwidth, temp); - } - maximize_(qh MAXabs_coord, maxcoord); - qh MAXsumcoord += maxcoord; - qh_setappend (&set, maximum); - qh_setappend (&set, minimum); - /* calculation of qh NEARzero is based on error formula 4.4-13 of - Golub & van Loan, authors say n^3 can be ignored and 10 be used in - place of rho */ - qh NEARzero[k]= 80 * qh MAXsumcoord * REALepsilon; - } - if (qh IStracing >=1) - qh_printpoints (qh ferr, "qh_maxmin: found the max and min points (by dim):", set); - return(set); -} /* maxmin */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="maxouter">-</a> - - qh_maxouter() - return maximum distance from facet to outer plane - normally this is qh.max_outside+qh.DISTround - does not include qh.JOGGLEmax - - see: - qh_outerinner() - - notes: - need to add another qh.DISTround if testing actual point with computation - - for joggle: - qh_setfacetplane() updated qh.max_outer for Wnewvertexmax (max distance to vertex) - need to use Wnewvertexmax since could have a coplanar point for a high - facet that is replaced by a low facet - need to add qh.JOGGLEmax if testing input points -*/ -realT qh_maxouter (void) { - realT dist; - - dist= fmax_(qh max_outside, qh DISTround); - dist += qh DISTround; - trace4((qh ferr, "qh_maxouter: max distance from facet to outer plane is %2.2g max_outside is %2.2g\n", dist, qh max_outside)); - return dist; -} /* maxouter */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="maxsimplex">-</a> - - qh_maxsimplex( dim, maxpoints, points, numpoints, simplex ) - determines maximum simplex for a set of points - starts from points already in simplex - skips qh.GOODpointp (assumes that it isn't in maxpoints) - - returns: - simplex with dim+1 points - - notes: - assumes at least pointsneeded points in points - maximizes determinate for x,y,z,w, etc. - uses maxpoints as long as determinate is clearly non-zero - - design: - initialize simplex with at least two points - (find points with max or min x coordinate) - for each remaining dimension - add point that maximizes the determinate - (use points from maxpoints first) -*/ -void qh_maxsimplex (int dim, setT *maxpoints, pointT *points, int numpoints, setT **simplex) { - pointT *point, **pointp, *pointtemp, *maxpoint, *minx=NULL, *maxx=NULL; - boolT nearzero, maxnearzero= False; - int k, sizinit; - realT maxdet= -REALmax, det, mincoord= REALmax, maxcoord= -REALmax; - - sizinit= qh_setsize (*simplex); - if (sizinit < 2) { - if (qh_setsize (maxpoints) >= 2) { - FOREACHpoint_(maxpoints) { - if (maxcoord < point[0]) { - maxcoord= point[0]; - maxx= point; - } - if (mincoord > point[0]) { - mincoord= point[0]; - minx= point; - } - } - }else { - FORALLpoint_(points, numpoints) { - if (point == qh GOODpointp) - continue; - if (maxcoord < point[0]) { - maxcoord= point[0]; - maxx= point; - } - if (mincoord > point[0]) { - mincoord= point[0]; - minx= point; - } - } - } - qh_setunique (simplex, minx); - if (qh_setsize (*simplex) < 2) - qh_setunique (simplex, maxx); - sizinit= qh_setsize (*simplex); - if (sizinit < 2) { - qh_precision ("input has same x coordinate"); - if (zzval_(Zsetplane) > qh hull_dim+1) { - fprintf (qh ferr, "qhull precision error (qh_maxsimplex for voronoi_center):\n%d points with the same x coordinate.\n", - qh_setsize(maxpoints)+numpoints); - qh_errexit (qh_ERRprec, NULL, NULL); - }else { - fprintf (qh ferr, "qhull input error: input is less than %d-dimensional since it has the same x coordinate\n", qh hull_dim); - qh_errexit (qh_ERRinput, NULL, NULL); - } - } - } - for(k= sizinit; k < dim+1; k++) { - maxpoint= NULL; - maxdet= -REALmax; - FOREACHpoint_(maxpoints) { - if (!qh_setin (*simplex, point)) { - det= qh_detsimplex(point, *simplex, k, &nearzero); - if ((det= fabs_(det)) > maxdet) { - maxdet= det; - maxpoint= point; - maxnearzero= nearzero; - } - } - } - if (!maxpoint || maxnearzero) { - zinc_(Zsearchpoints); - if (!maxpoint) { - trace0((qh ferr, "qh_maxsimplex: searching all points for %d-th initial vertex.\n", k+1)); - }else { - trace0((qh ferr, "qh_maxsimplex: searching all points for %d-th initial vertex, better than p%d det %2.2g\n", - k+1, qh_pointid(maxpoint), maxdet)); - } - FORALLpoint_(points, numpoints) { - if (point == qh GOODpointp) - continue; - if (!qh_setin (*simplex, point)) { - det= qh_detsimplex(point, *simplex, k, &nearzero); - if ((det= fabs_(det)) > maxdet) { - maxdet= det; - maxpoint= point; - maxnearzero= nearzero; - } - } - } - } /* !maxpoint */ - if (!maxpoint) { - fprintf (qh ferr, "qhull internal error (qh_maxsimplex): not enough points available\n"); - qh_errexit (qh_ERRqhull, NULL, NULL); - } - qh_setappend(simplex, maxpoint); - trace1((qh ferr, "qh_maxsimplex: selected point p%d for %d`th initial vertex, det=%2.2g\n", - qh_pointid(maxpoint), k+1, maxdet)); - } /* k */ -} /* maxsimplex */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="minabsval">-</a> - - qh_minabsval( normal, dim ) - return minimum absolute value of a dim vector -*/ -realT qh_minabsval (realT *normal, int dim) { - realT minval= 0; - realT maxval= 0; - realT *colp; - int k; - - for (k= dim, colp= normal; k--; colp++) { - maximize_(maxval, *colp); - minimize_(minval, *colp); - } - return fmax_(maxval, -minval); -} /* minabsval */ - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="mindiff">-</a> - - qh_mindif( vecA, vecB, dim ) - return index of min abs. difference of two vectors -*/ -int qh_mindiff (realT *vecA, realT *vecB, int dim) { - realT mindiff= REALmax, diff; - realT *vecAp= vecA, *vecBp= vecB; - int k, mink= 0; - - for (k= 0; k < dim; k++) { - diff= *vecAp++ - *vecBp++; - diff= fabs_(diff); - if (diff < mindiff) { - mindiff= diff; - mink= k; - } - } - return mink; -} /* mindiff */ - - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="orientoutside">-</a> - - qh_orientoutside( facet ) - make facet outside oriented via qh.interior_point - - returns: - True if facet reversed orientation. -*/ -boolT qh_orientoutside (facetT *facet) { - int k; - realT dist; - - qh_distplane (qh interior_point, facet, &dist); - if (dist > 0) { - for (k= qh hull_dim; k--; ) - facet->normal[k]= -facet->normal[k]; - facet->offset= -facet->offset; - return True; - } - return False; -} /* orientoutside */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="outerinner">-</a> - - qh_outerinner( facet, outerplane, innerplane ) - if facet and qh.maxoutdone (i.e., qh_check_maxout) - returns outer and inner plane for facet - else - returns maximum outer and inner plane - accounts for qh.JOGGLEmax - - see: - qh_maxouter(), qh_check_bestdist(), qh_check_points() - - notes: - outerplaner or innerplane may be NULL - - includes qh.DISTround for actual points - adds another qh.DISTround if testing with floating point arithmetic -*/ -void qh_outerinner (facetT *facet, realT *outerplane, realT *innerplane) { - realT dist, mindist; - vertexT *vertex, **vertexp; - - if (outerplane) { - if (!qh_MAXoutside || !facet || !qh maxoutdone) { - *outerplane= qh_maxouter(); /* includes qh.DISTround */ - }else { /* qh_MAXoutside ... */ -#if qh_MAXoutside - *outerplane= facet->maxoutside + qh DISTround; -#endif - - } - if (qh JOGGLEmax < REALmax/2) - *outerplane += qh JOGGLEmax * sqrt (qh hull_dim); - } - if (innerplane) { - if (facet) { - mindist= REALmax; - FOREACHvertex_(facet->vertices) { - zinc_(Zdistio); - qh_distplane (vertex->point, facet, &dist); - minimize_(mindist, dist); - } - *innerplane= mindist - qh DISTround; - }else - *innerplane= qh min_vertex - qh DISTround; - if (qh JOGGLEmax < REALmax/2) - *innerplane -= qh JOGGLEmax * sqrt (qh hull_dim); - } -} /* outerinner */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="pointdist">-</a> - - qh_pointdist( point1, point2, dim ) - return distance between two points - - notes: - returns distance squared if 'dim' is negative -*/ -coordT qh_pointdist(pointT *point1, pointT *point2, int dim) { - coordT dist, diff; - int k; - - dist= 0.0; - for (k= (dim > 0 ? dim : -dim); k--; ) { - diff= *point1++ - *point2++; - dist += diff * diff; - } - if (dim > 0) - return(sqrt(dist)); - return dist; -} /* pointdist */ - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="printmatrix">-</a> - - qh_printmatrix( fp, string, rows, numrow, numcol ) - print matrix to fp given by row vectors - print string as header - - notes: - print a vector by qh_printmatrix(fp, "", &vect, 1, len) -*/ -void qh_printmatrix (FILE *fp, char *string, realT **rows, int numrow, int numcol) { - realT *rowp; - realT r; /*bug fix*/ - int i,k; - - fprintf (fp, "%s\n", string); - for (i= 0; i < numrow; i++) { - rowp= rows[i]; - for (k= 0; k < numcol; k++) { - r= *rowp++; - fprintf (fp, "%6.3g ", r); - } - fprintf (fp, "\n"); - } -} /* printmatrix */ - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="printpoints">-</a> - - qh_printpoints( fp, string, points ) - print pointids to fp for a set of points - if string, prints string and 'p' point ids -*/ -void qh_printpoints (FILE *fp, char *string, setT *points) { - pointT *point, **pointp; - - if (string) { - fprintf (fp, "%s", string); - FOREACHpoint_(points) - fprintf (fp, " p%d", qh_pointid(point)); - fprintf (fp, "\n"); - }else { - FOREACHpoint_(points) - fprintf (fp, " %d", qh_pointid(point)); - fprintf (fp, "\n"); - } -} /* printpoints */ - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="projectinput">-</a> - - qh_projectinput() - project input points using qh.lower_bound/upper_bound and qh DELAUNAY - if qh.lower_bound[k]=qh.upper_bound[k]= 0, - removes dimension k - if halfspace intersection - removes dimension k from qh.feasible_point - input points in qh first_point, num_points, input_dim - - returns: - new point array in qh first_point of qh hull_dim coordinates - sets qh POINTSmalloc - if qh DELAUNAY - projects points to paraboloid - lowbound/highbound is also projected - if qh ATinfinity - adds point "at-infinity" - if qh POINTSmalloc - frees old point array - - notes: - checks that qh.hull_dim agrees with qh.input_dim, PROJECTinput, and DELAUNAY - - - design: - sets project[k] to -1 (delete), 0 (keep), 1 (add for Delaunay) - determines newdim and newnum for qh hull_dim and qh num_points - projects points to newpoints - projects qh.lower_bound to itself - projects qh.upper_bound to itself - if qh DELAUNAY - if qh ATINFINITY - projects points to paraboloid - computes "infinity" point as vertex average and 10% above all points - else - uses qh_setdelaunay to project points to paraboloid -*/ -void qh_projectinput (void) { - int k,i; - int newdim= qh input_dim, newnum= qh num_points; - signed char *project; - int size= (qh input_dim+1)*sizeof(*project); - pointT *newpoints, *coord, *infinity; - realT paraboloid, maxboloid= 0; - - project= (signed char*)qh_memalloc (size); - memset ((char*)project, 0, size); - for (k= 0; k < qh input_dim; k++) { /* skip Delaunay bound */ - if (qh lower_bound[k] == 0 && qh upper_bound[k] == 0) { - project[k]= -1; - newdim--; - } - } - if (qh DELAUNAY) { - project[k]= 1; - newdim++; - if (qh ATinfinity) - newnum++; - } - if (newdim != qh hull_dim) { - fprintf(qh ferr, "qhull internal error (qh_projectinput): dimension after projection %d != hull_dim %d\n", newdim, qh hull_dim); - qh_errexit(qh_ERRqhull, NULL, NULL); - } - if (!(newpoints=(coordT*)malloc(newnum*newdim*sizeof(coordT)))){ - fprintf(qh ferr, "qhull error: insufficient memory to project %d points\n", - qh num_points); - qh_errexit(qh_ERRmem, NULL, NULL); - } - qh_projectpoints (project, qh input_dim+1, qh first_point, - qh num_points, qh input_dim, newpoints, newdim); - trace1((qh ferr, "qh_projectinput: updating lower and upper_bound\n")); - qh_projectpoints (project, qh input_dim+1, qh lower_bound, - 1, qh input_dim+1, qh lower_bound, newdim+1); - qh_projectpoints (project, qh input_dim+1, qh upper_bound, - 1, qh input_dim+1, qh upper_bound, newdim+1); - if (qh HALFspace) { - if (!qh feasible_point) { - fprintf(qh ferr, "qhull internal error (qh_projectinput): HALFspace defined without qh.feasible_point\n"); - qh_errexit(qh_ERRqhull, NULL, NULL); - } - qh_projectpoints (project, qh input_dim, qh feasible_point, - 1, qh input_dim, qh feasible_point, newdim); - } - qh_memfree(project, ((qh input_dim+1)*sizeof(*project))); - if (qh POINTSmalloc) - free (qh first_point); - qh first_point= newpoints; - qh POINTSmalloc= True; - if (qh DELAUNAY && qh ATinfinity) { - coord= qh first_point; - infinity= qh first_point + qh hull_dim * qh num_points; - for (k=qh hull_dim-1; k--; ) - infinity[k]= 0.0; - for (i=qh num_points; i--; ) { - paraboloid= 0.0; - for (k=qh hull_dim-1; k--; ) { - paraboloid += *coord * *coord; - infinity[k] += *coord; - coord++; - } - *(coord++)= paraboloid; - maximize_(maxboloid, paraboloid); - } - /* coord == infinity */ - for (k=qh hull_dim-1; k--; ) - *(coord++) /= qh num_points; - *(coord++)= maxboloid * 1.1; - qh num_points++; - trace0((qh ferr, "qh_projectinput: projected points to paraboloid for Delaunay\n")); - }else if (qh DELAUNAY) /* !qh ATinfinity */ - qh_setdelaunay( qh hull_dim, qh num_points, qh first_point); -} /* projectinput */ - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="projectpoints">-</a> - - qh_projectpoints( project, n, points, numpoints, dim, newpoints, newdim ) - project points/numpoints/dim to newpoints/newdim - if project[k] == -1 - delete dimension k - if project[k] == 1 - add dimension k by duplicating previous column - n is size of project - - notes: - newpoints may be points if only adding dimension at end - - design: - check that 'project' and 'newdim' agree - for each dimension - if project == -1 - skip dimension - else - determine start of column in newpoints - determine start of column in points - if project == +1, duplicate previous column - copy dimension (column) from points to newpoints -*/ -void qh_projectpoints (signed char *project, int n, realT *points, - int numpoints, int dim, realT *newpoints, int newdim) { - int testdim= dim, oldk=0, newk=0, i,j=0,k; - realT *newp, *oldp; - - for (k= 0; k < n; k++) - testdim += project[k]; - if (testdim != newdim) { - fprintf (qh ferr, "qhull internal error (qh_projectpoints): newdim %d should be %d after projection\n", - newdim, testdim); - qh_errexit (qh_ERRqhull, NULL, NULL); - } - for (j= 0; j<n; j++) { - if (project[j] == -1) - oldk++; - else { - newp= newpoints+newk++; - if (project[j] == +1) { - if (oldk >= dim) - continue; - oldp= points+oldk; - }else - oldp= points+oldk++; - for (i=numpoints; i--; ) { - *newp= *oldp; - newp += newdim; - oldp += dim; - } - } - if (oldk >= dim) - break; - } - trace1((qh ferr, "qh_projectpoints: projected %d points from dim %d to dim %d\n", - numpoints, dim, newdim)); -} /* projectpoints */ - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="rand">-</a> - - qh_rand() - qh_srand( seed ) - generate pseudo-random number between 1 and 2^31 -2 - - notes: - from Park & Miller's minimimal standard random number generator - Communications of the ACM, 31:1192-1201, 1988. - does not use 0 or 2^31 -1 - this is silently enforced by qh_srand() - can make 'Rn' much faster by moving qh_rand to qh_distplane -*/ -int qh_rand_seed= 1; /* define as global variable instead of using qh */ - -int qh_rand( void) { -#define qh_rand_a 16807 -#define qh_rand_m 2147483647 -#define qh_rand_q 127773 /* m div a */ -#define qh_rand_r 2836 /* m mod a */ - int lo, hi, test; - int seed = qh_rand_seed; - - hi = seed / qh_rand_q; /* seed div q */ - lo = seed % qh_rand_q; /* seed mod q */ - test = qh_rand_a * lo - qh_rand_r * hi; - if (test > 0) - seed= test; - else - seed= test + qh_rand_m; - qh_rand_seed= seed; - /* seed = seed < qh_RANDOMmax/2 ? 0 : qh_RANDOMmax; for testing */ - /* seed = qh_RANDOMmax; for testing */ - return seed; -} /* rand */ - -void qh_srand( int seed) { - if (seed < 1) - qh_rand_seed= 1; - else if (seed >= qh_rand_m) - qh_rand_seed= qh_rand_m - 1; - else - qh_rand_seed= seed; -} /* qh_srand */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="randomfactor">-</a> - - qh_randomfactor() - return a random factor within qh.RANDOMmax of 1.0 - - notes: - qh.RANDOMa/b are defined in global.c -*/ -realT qh_randomfactor (void) { - realT randr; - - randr= qh_RANDOMint; - return randr * qh RANDOMa + qh RANDOMb; -} /* randomfactor */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="randommatrix">-</a> - - qh_randommatrix( buffer, dim, rows ) - generate a random dim X dim matrix in range [-1,1] - assumes buffer is [dim+1, dim] - - returns: - sets buffer to random numbers - sets rows to rows of buffer - sets row[dim] as scratch row -*/ -void qh_randommatrix (realT *buffer, int dim, realT **rows) { - int i, k; - realT **rowi, *coord, realr; - - coord= buffer; - rowi= rows; - for (i=0; i < dim; i++) { - *(rowi++)= coord; - for (k=0; k < dim; k++) { - realr= qh_RANDOMint; - *(coord++)= 2.0 * realr/(qh_RANDOMmax+1) - 1.0; - } - } - *rowi= coord; -} /* randommatrix */ - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="rotateinput">-</a> - - qh_rotateinput( rows ) - rotate input using row matrix - input points given by qh first_point, num_points, hull_dim - assumes rows[dim] is a scratch buffer - if qh POINTSmalloc, overwrites input points, else mallocs a new array - - returns: - rotated input - sets qh POINTSmalloc - - design: - see qh_rotatepoints -*/ -void qh_rotateinput (realT **rows) { - - if (!qh POINTSmalloc) { - qh first_point= qh_copypoints (qh first_point, qh num_points, qh hull_dim); - qh POINTSmalloc= True; - } - qh_rotatepoints (qh first_point, qh num_points, qh hull_dim, rows); -} /* rotateinput */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="rotatepoints">-</a> - - qh_rotatepoints( points, numpoints, dim, row ) - rotate numpoints points by a d-dim row matrix - assumes rows[dim] is a scratch buffer - - returns: - rotated points in place - - design: - for each point - for each coordinate - use row[dim] to compute partial inner product - for each coordinate - rotate by partial inner product -*/ -void qh_rotatepoints (realT *points, int numpoints, int dim, realT **row) { - realT *point, *rowi, *coord= NULL, sum, *newval; - int i,j,k; - - if (qh IStracing >= 1) - qh_printmatrix (qh ferr, "qh_rotatepoints: rotate points by", row, dim, dim); - for (point= points, j= numpoints; j--; point += dim) { - newval= row[dim]; - for (i= 0; i < dim; i++) { - rowi= row[i]; - coord= point; - for (sum= 0.0, k= dim; k--; ) - sum += *rowi++ * *coord++; - *(newval++)= sum; - } - for (k= dim; k--; ) - *(--coord)= *(--newval); - } -} /* rotatepoints */ - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="scaleinput">-</a> - - qh_scaleinput() - scale input points using qh low_bound/high_bound - input points given by qh first_point, num_points, hull_dim - if qh POINTSmalloc, overwrites input points, else mallocs a new array - - returns: - scales coordinates of points to low_bound[k], high_bound[k] - sets qh POINTSmalloc - - design: - see qh_scalepoints -*/ -void qh_scaleinput (void) { - - if (!qh POINTSmalloc) { - qh first_point= qh_copypoints (qh first_point, qh num_points, qh hull_dim); - qh POINTSmalloc= True; - } - qh_scalepoints (qh first_point, qh num_points, qh hull_dim, - qh lower_bound, qh upper_bound); -} /* scaleinput */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="scalelast">-</a> - - qh_scalelast( points, numpoints, dim, low, high, newhigh ) - scale last coordinate to [0,m] for Delaunay triangulations - input points given by points, numpoints, dim - - returns: - changes scale of last coordinate from [low, high] to [0, newhigh] - overwrites last coordinate of each point - saves low/high/newhigh in qh.last_low, etc. for qh_setdelaunay() - - notes: - when called by qh_setdelaunay, low/high may not match actual data - - design: - compute scale and shift factors - apply to last coordinate of each point -*/ -void qh_scalelast (coordT *points, int numpoints, int dim, coordT low, - coordT high, coordT newhigh) { - realT scale, shift; - coordT *coord; - int i; - boolT nearzero= False; - - trace4((qh ferr, "qh_scalelast: scale last coordinate from [%2.2g, %2.2g] to [0,%2.2g]\n", - low, high, newhigh)); - qh last_low= low; - qh last_high= high; - qh last_newhigh= newhigh; - scale= qh_divzero (newhigh, high - low, - qh MINdenom_1, &nearzero); - if (nearzero) { - if (qh DELAUNAY) - fprintf (qh ferr, "qhull input error: can not scale last coordinate. Input is cocircular\n or cospherical. Use option 'Qz' to add a point at infinity.\n"); - else - fprintf (qh ferr, "qhull input error: can not scale last coordinate. New bounds [0, %2.2g] are too wide for\nexisting bounds [%2.2g, %2.2g] (width %2.2g)\n", - newhigh, low, high, high-low); - qh_errexit (qh_ERRinput, NULL, NULL); - } - shift= - low * newhigh / (high-low); - coord= points + dim - 1; - for (i= numpoints; i--; coord += dim) - *coord= *coord * scale + shift; -} /* scalelast */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="scalepoints">-</a> - - qh_scalepoints( points, numpoints, dim, newlows, newhighs ) - scale points to new lowbound and highbound - retains old bound when newlow= -REALmax or newhigh= +REALmax - - returns: - scaled points - overwrites old points - - design: - for each coordinate - compute current low and high bound - compute scale and shift factors - scale all points - enforce new low and high bound for all points -*/ -void qh_scalepoints (pointT *points, int numpoints, int dim, - realT *newlows, realT *newhighs) { - int i,k; - realT shift, scale, *coord, low, high, newlow, newhigh, mincoord, maxcoord; - boolT nearzero= False; - - for (k= 0; k < dim; k++) { - newhigh= newhighs[k]; - newlow= newlows[k]; - if (newhigh > REALmax/2 && newlow < -REALmax/2) - continue; - low= REALmax; - high= -REALmax; - for (i= numpoints, coord= points+k; i--; coord += dim) { - minimize_(low, *coord); - maximize_(high, *coord); - } - if (newhigh > REALmax/2) - newhigh= high; - if (newlow < -REALmax/2) - newlow= low; - if (qh DELAUNAY && k == dim-1 && newhigh < newlow) { - fprintf (qh ferr, "qhull input error: 'Qb%d' or 'QB%d' inverts paraboloid since high bound %.2g < low bound %.2g\n", - k, k, newhigh, newlow); - qh_errexit (qh_ERRinput, NULL, NULL); - } - scale= qh_divzero (newhigh - newlow, high - low, - qh MINdenom_1, &nearzero); - if (nearzero) { - fprintf (qh ferr, "qhull input error: %d'th dimension's new bounds [%2.2g, %2.2g] too wide for\nexisting bounds [%2.2g, %2.2g]\n", - k, newlow, newhigh, low, high); - qh_errexit (qh_ERRinput, NULL, NULL); - } - shift= (newlow * high - low * newhigh)/(high-low); - coord= points+k; - for (i= numpoints; i--; coord += dim) - *coord= *coord * scale + shift; - coord= points+k; - if (newlow < newhigh) { - mincoord= newlow; - maxcoord= newhigh; - }else { - mincoord= newhigh; - maxcoord= newlow; - } - for (i= numpoints; i--; coord += dim) { - minimize_(*coord, maxcoord); /* because of roundoff error */ - maximize_(*coord, mincoord); - } - trace0((qh ferr, "qh_scalepoints: scaled %d'th coordinate [%2.2g, %2.2g] to [%.2g, %.2g] for %d points by %2.2g and shifted %2.2g\n", - k, low, high, newlow, newhigh, numpoints, scale, shift)); - } -} /* scalepoints */ - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="setdelaunay">-</a> - - qh_setdelaunay( dim, count, points ) - project count points to dim-d paraboloid for Delaunay triangulation - - dim is one more than the dimension of the input set - assumes dim is at least 3 (i.e., at least a 2-d Delaunay triangulation) - - points is a dim*count realT array. The first dim-1 coordinates - are the coordinates of the first input point. array[dim] is - the first coordinate of the second input point. array[2*dim] is - the first coordinate of the third input point. - - if qh.last_low defined (i.e., 'Qbb' called qh_scalelast) - calls qh_scalelast to scale the last coordinate the same as the other points - - returns: - for each point - sets point[dim-1] to sum of squares of coordinates - scale points to 'Qbb' if needed - - notes: - to project one point, use - qh_setdelaunay (qh hull_dim, 1, point) - - Do not use options 'Qbk', 'QBk', or 'QbB' since they scale - the coordinates after the original projection. - -*/ -void qh_setdelaunay (int dim, int count, pointT *points) { - int i, k; - coordT *coordp, coord; - realT paraboloid; - - trace0((qh ferr, "qh_setdelaunay: project %d points to paraboloid for Delaunay triangulation\n", count)); - coordp= points; - for (i= 0; i < count; i++) { - coord= *coordp++; - paraboloid= coord*coord; - for (k= dim-2; k--; ) { - coord= *coordp++; - paraboloid += coord*coord; - } - *coordp++ = paraboloid; - } - if (qh last_low < REALmax/2) - qh_scalelast (points, count, dim, qh last_low, qh last_high, qh last_newhigh); -} /* setdelaunay */ - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="sethalfspace">-</a> - - qh_sethalfspace( dim, coords, nextp, normal, offset, feasible ) - set point to dual of halfspace relative to feasible point - halfspace is normal coefficients and offset. - - returns: - false if feasible point is outside of hull (error message already reported) - overwrites coordinates for point at dim coords - nextp= next point (coords) - - design: - compute distance from feasible point to halfspace - divide each normal coefficient by -dist -*/ -boolT qh_sethalfspace (int dim, coordT *coords, coordT **nextp, - coordT *normal, coordT *offset, coordT *feasible) { - coordT *normp= normal, *feasiblep= feasible, *coordp= coords; - realT dist; - realT r; /*bug fix*/ - int k; - boolT zerodiv; - - dist= *offset; - for (k= dim; k--; ) - dist += *(normp++) * *(feasiblep++); - if (dist > 0) - goto LABELerroroutside; - normp= normal; - if (dist < -qh MINdenom) { - for (k= dim; k--; ) - *(coordp++)= *(normp++) / -dist; - }else { - for (k= dim; k--; ) { - *(coordp++)= qh_divzero (*(normp++), -dist, qh MINdenom_1, &zerodiv); - if (zerodiv) - goto LABELerroroutside; - } - } - *nextp= coordp; - if (qh IStracing >= 4) { - fprintf (qh ferr, "qh_sethalfspace: halfspace at offset %6.2g to point: ", *offset); - for (k= dim, coordp= coords; k--; ) { - r= *coordp++; - fprintf (qh ferr, " %6.2g", r); - } - fprintf (qh ferr, "\n"); - } - return True; -LABELerroroutside: - feasiblep= feasible; - normp= normal; - fprintf(qh ferr, "qhull input error: feasible point is not clearly inside halfspace\nfeasible point: "); - for (k= dim; k--; ) - fprintf (qh ferr, qh_REAL_1, r=*(feasiblep++)); - fprintf (qh ferr, "\n halfspace: "); - for (k= dim; k--; ) - fprintf (qh ferr, qh_REAL_1, r=*(normp++)); - fprintf (qh ferr, "\n at offset: "); - fprintf (qh ferr, qh_REAL_1, *offset); - fprintf (qh ferr, " and distance: "); - fprintf (qh ferr, qh_REAL_1, dist); - fprintf (qh ferr, "\n"); - return False; -} /* sethalfspace */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="sethalfspace_all">-</a> - - qh_sethalfspace_all( dim, count, halfspaces, feasible ) - generate dual for halfspace intersection with feasible point - array of count halfspaces - each halfspace is normal coefficients followed by offset - the origin is inside the halfspace if the offset is negative - - returns: - malloc'd array of count X dim-1 points - - notes: - call before qh_init_B or qh_initqhull_globals - unused/untested code: please email bradb@shore.net if this works ok for you - If using option 'Fp', also set qh feasible_point. It is a malloc'd array - that is freed by qh_freebuffers. - - design: - see qh_sethalfspace -*/ -coordT *qh_sethalfspace_all (int dim, int count, coordT *halfspaces, pointT *feasible) { - int i, newdim; - pointT *newpoints; - coordT *coordp, *normalp, *offsetp; - - trace0((qh ferr, "qh_sethalfspace_all: compute dual for halfspace intersection\n")); - newdim= dim - 1; - if (!(newpoints=(coordT*)malloc(count*newdim*sizeof(coordT)))){ - fprintf(qh ferr, "qhull error: insufficient memory to compute dual of %d halfspaces\n", - count); - qh_errexit(qh_ERRmem, NULL, NULL); - } - coordp= newpoints; - normalp= halfspaces; - for (i= 0; i < count; i++) { - offsetp= normalp + newdim; - if (!qh_sethalfspace (newdim, coordp, &coordp, normalp, offsetp, feasible)) { - fprintf (qh ferr, "The halfspace was at index %d\n", i); - qh_errexit (qh_ERRinput, NULL, NULL); - } - normalp= offsetp + 1; - } - return newpoints; -} /* sethalfspace_all */ - - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="sharpnewfacets">-</a> - - qh_sharpnewfacets() - - returns: - true if could be an acute angle (facets in different quadrants) - - notes: - for qh_findbest - - design: - for all facets on qh.newfacet_list - if two facets are in different quadrants - set issharp -*/ -boolT qh_sharpnewfacets () { - facetT *facet; - boolT issharp = False; - int *quadrant, k; - - quadrant= (int*)qh_memalloc (qh hull_dim * sizeof(int)); - FORALLfacet_(qh newfacet_list) { - if (facet == qh newfacet_list) { - for (k= qh hull_dim; k--; ) - quadrant[ k]= (facet->normal[ k] > 0); - }else { - for (k= qh hull_dim; k--; ) { - if (quadrant[ k] != (facet->normal[ k] > 0)) { - issharp= True; - break; - } - } - } - if (issharp) - break; - } - qh_memfree( quadrant, qh hull_dim * sizeof(int)); - trace3((qh ferr, "qh_sharpnewfacets: %d\n", issharp)); - return issharp; -} /* sharpnewfacets */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="voronoi_center">-</a> - - qh_voronoi_center( dim, points ) - return Voronoi center for a set of points - dim is the orginal dimension of the points - gh.gm_matrix/qh.gm_row are scratch buffers - - returns: - center as a temporary point - if non-simplicial, - returns center for max simplex of points - - notes: - from Bowyer & Woodwark, A Programmer's Geometry, 1983, p. 65 - - design: - if non-simplicial - determine max simplex for points - translate point0 of simplex to origin - compute sum of squares of diagonal - compute determinate - compute Voronoi center (see Bowyer & Woodwark) -*/ -pointT *qh_voronoi_center (int dim, setT *points) { - pointT *point, **pointp, *point0; - pointT *center= (pointT*)qh_memalloc (qh center_size); - setT *simplex; - int i, j, k, size= qh_setsize(points); - coordT *gmcoord; - realT *diffp, sum2, *sum2row, *sum2p, det, factor; - boolT nearzero, infinite; - - if (size == dim+1) - simplex= points; - else if (size < dim+1) { - fprintf (qh ferr, "qhull internal error (qh_voronoi_center):\n need at least %d points to construct a Voronoi center\n", - dim+1); - qh_errexit (qh_ERRqhull, NULL, NULL); - }else { - simplex= qh_settemp (dim+1); - qh_maxsimplex (dim, points, NULL, 0, &simplex); - } - point0= SETfirstt_(simplex, pointT); - gmcoord= qh gm_matrix; - for (k=0; k < dim; k++) { - qh gm_row[k]= gmcoord; - FOREACHpoint_(simplex) { - if (point != point0) - *(gmcoord++)= point[k] - point0[k]; - } - } - sum2row= gmcoord; - for (i=0; i < dim; i++) { - sum2= 0.0; - for (k= 0; k < dim; k++) { - diffp= qh gm_row[k] + i; - sum2 += *diffp * *diffp; - } - *(gmcoord++)= sum2; - } - det= qh_determinant (qh gm_row, dim, &nearzero); - factor= qh_divzero (0.5, det, qh MINdenom, &infinite); - if (infinite) { - for (k=dim; k--; ) - center[k]= qh_INFINITE; - if (qh IStracing) - qh_printpoints (qh ferr, "qh_voronoi_center: at infinity for ", simplex); - }else { - for (i=0; i < dim; i++) { - gmcoord= qh gm_matrix; - sum2p= sum2row; - for (k=0; k < dim; k++) { - qh gm_row[k]= gmcoord; - if (k == i) { - for (j= dim; j--; ) - *(gmcoord++)= *sum2p++; - }else { - FOREACHpoint_(simplex) { - if (point != point0) - *(gmcoord++)= point[k] - point0[k]; - } - } - } - center[i]= qh_determinant (qh gm_row, dim, &nearzero)*factor + point0[i]; - } -#ifndef qh_NOtrace - if (qh IStracing >= 3) { - fprintf (qh ferr, "qh_voronoi_center: det %2.2g factor %2.2g ", det, factor); - qh_printmatrix (qh ferr, "center:", ¢er, 1, dim); - if (qh IStracing >= 5) { - qh_printpoints (qh ferr, "points", simplex); - FOREACHpoint_(simplex) - fprintf (qh ferr, "p%d dist %.2g, ", qh_pointid (point), - qh_pointdist (point, center, dim)); - fprintf (qh ferr, "\n"); - } - } -#endif - } - if (simplex != points) - qh_settempfree (&simplex); - return center; -} /* voronoi_center */ - diff --git a/extern/qhull/src/global.c b/extern/qhull/src/global.c deleted file mode 100644 index d3e141aa985..00000000000 --- a/extern/qhull/src/global.c +++ /dev/null @@ -1,2018 +0,0 @@ -/*<html><pre> -<a href="qh-globa.htm" - >-------------------------------</a><a name="TOP">-</a> - - global.c - initializes all the globals of the qhull application - - see README - - see qhull.h for qh.globals and function prototypes - - see qhull_a.h for internal functions - - copyright (c) 1993-2002, The Geometry Center - */ - -#include "qhull_a.h" - -/*========= qh definition =======================*/ - -#if qh_QHpointer -qhT *qh_qh= NULL; /* pointer to all global variables */ -#else -qhT qh_qh; /* all global variables. - Add "= {0}" if this causes a compiler error. - Also qh_qhstat in stat.c and qhmem in mem.c. */ -#endif - -/*-<a href="qh-globa.htm#TOC" - >-------------------------------</a><a name="appendprint">-</a> - - qh_appendprint( printFormat ) - append printFormat to qh.PRINTout unless already defined -*/ -void qh_appendprint (qh_PRINT format) { - int i; - - for (i=0; i < qh_PRINTEND; i++) { - if (qh PRINTout[i] == format && format != qh_PRINTqhull) - break; - if (!qh PRINTout[i]) { - qh PRINTout[i]= format; - break; - } - } -} /* appendprint */ - -/*-<a href="qh-globa.htm#TOC" - >-------------------------------</a><a name="checkflags">-</a> - - qh_checkflags( commandStr, hiddenFlags ) - errors if commandStr contains hiddenFlags - hiddenFlags starts and ends with a space and is space deliminated (checked) - - notes: - ignores first word (e.g., "qconvex i") - use qh_strtol/strtod since strtol/strtod may or may not skip trailing spaces - - see: - qh_initflags() initializes Qhull according to commandStr -*/ -void qh_checkflags(char *command, char *hiddenflags) { - char *s= command, *t, *chkerr, key, opt, prevopt; - char chkkey[]= " "; - char chkopt[]= " "; - char chkopt2[]= " "; - - if (*hiddenflags != ' ' || hiddenflags[strlen(hiddenflags)-1] != ' ') { - fprintf(qh ferr, "qhull error (qh_checkflags): hiddenflags must start and end with a space: \"%s\"", hiddenflags); - qh_errexit(qh_ERRinput, NULL, NULL); - } - if (strpbrk(hiddenflags, ",\n\r\t")) { - fprintf(qh ferr, "qhull error (qh_checkflags): hiddenflags contains commas, newlines, or tabs: \"%s\"", hiddenflags); - qh_errexit(qh_ERRinput, NULL, NULL); - } - while (*s && !isspace(*s)) /* skip program name */ - s++; - while (*s) { - while (*s && isspace(*s)) - s++; - if (*s == '-') - s++; - if (!*s) - break; - key = *s++; - chkerr = NULL; - if (key == '\'') { /* TO 'file name' */ - t= strchr(s, '\''); - if (!t) { - fprintf(qh ferr, "qhull error (qh_checkflags): missing the 2nd single-quote for:\n%s\n", s-1); - qh_errexit(qh_ERRinput, NULL, NULL); - } - s= t+1; - continue; - } - chkkey[1]= key; - if (strstr(hiddenflags, chkkey)) { - chkerr= chkkey; - }else if (isupper(key)) { - opt= ' '; - prevopt= ' '; - chkopt[1]= key; - chkopt2[1]= key; - while (!chkerr && *s && !isspace(*s)) { - opt= *s++; - if (isalpha(opt)) { - chkopt[2]= opt; - if (strstr(hiddenflags, chkopt)) - chkerr= chkopt; - if (prevopt != ' ') { - chkopt2[2]= prevopt; - chkopt2[3]= opt; - if (strstr(hiddenflags, chkopt2)) - chkerr= chkopt2; - } - }else if (key == 'Q' && isdigit(opt) && prevopt != 'b' - && (prevopt == ' ' || islower(prevopt))) { - chkopt[2]= opt; - if (strstr(hiddenflags, chkopt)) - chkerr= chkopt; - }else { - qh_strtod (s-1, &t); - if (s < t) - s= t; - } - prevopt= opt; - } - } - if (chkerr) { - *chkerr= '\''; - chkerr[strlen(chkerr)-1]= '\''; - fprintf(qh ferr, "qhull error: option %s is not used with this program.\n It may be used with qhull.\n", chkerr); - qh_errexit(qh_ERRinput, NULL, NULL); - } - } -} /* checkflags */ - -/*-<a href="qh-globa.htm#TOC" - >-------------------------------</a><a name="clock">-</a> - - qh_clock() - return user CPU time in 100ths (qh_SECtick) - only defined for qh_CLOCKtype == 2 - - notes: - use first value to determine time 0 - from Stevens '92 8.15 -*/ -unsigned long qh_clock (void) { - -#if (qh_CLOCKtype == 2) - struct tms time; - static long clktck; /* initialized first call */ - double ratio, cpu; - unsigned long ticks; - - if (!clktck) { - if ((clktck= sysconf (_SC_CLK_TCK)) < 0) { - fprintf (qh ferr, "qhull internal error (qh_clock): sysconf() failed. Use qh_CLOCKtype 1 in user.h\n"); - qh_errexit (qh_ERRqhull, NULL, NULL); - } - } - if (times (&time) == -1) { - fprintf (qh ferr, "qhull internal error (qh_clock): times() failed. Use qh_CLOCKtype 1 in user.h\n"); - qh_errexit (qh_ERRqhull, NULL, NULL); - } - ratio= qh_SECticks / (double)clktck; - ticks= time.tms_utime * ratio; - return ticks; -#else - fprintf (qh ferr, "qhull internal error (qh_clock): use qh_CLOCKtype 2 in user.h\n"); - qh_errexit (qh_ERRqhull, NULL, NULL); /* never returns */ - return 0; -#endif -} /* clock */ - -/*-<a href="qh-globa.htm#TOC" - >-------------------------------</a><a name="freebuffers">-</a> - - qh_freebuffers() - free up global memory buffers - - notes: - must match qh_initbuffers() -*/ -void qh_freebuffers (void) { - - trace5((qh ferr, "qh_freebuffers: freeing up global memory buffers\n")); - /* allocated by qh_initqhull_buffers */ - qh_memfree (qh NEARzero, qh hull_dim * sizeof(realT)); - qh_memfree (qh lower_threshold, (qh input_dim+1) * sizeof(realT)); - qh_memfree (qh upper_threshold, (qh input_dim+1) * sizeof(realT)); - qh_memfree (qh lower_bound, (qh input_dim+1) * sizeof(realT)); - qh_memfree (qh upper_bound, (qh input_dim+1) * sizeof(realT)); - qh_memfree (qh gm_matrix, (qh hull_dim+1) * qh hull_dim * sizeof(coordT)); - qh_memfree (qh gm_row, (qh hull_dim+1) * sizeof(coordT *)); - qh NEARzero= qh lower_threshold= qh upper_threshold= NULL; - qh lower_bound= qh upper_bound= NULL; - qh gm_matrix= NULL; - qh gm_row= NULL; - qh_setfree (&qh other_points); - qh_setfree (&qh del_vertices); - qh_setfree (&qh coplanarset); - if (qh line) /* allocated by qh_readinput, freed if no error */ - free (qh line); - if (qh half_space) - free (qh half_space); - if (qh temp_malloc) - free (qh temp_malloc); - if (qh feasible_point) /* allocated by qh_readfeasible */ - free (qh feasible_point); - if (qh feasible_string) /* allocated by qh_initflags */ - free (qh feasible_string); - qh line= qh feasible_string= NULL; - qh half_space= qh feasible_point= qh temp_malloc= NULL; - /* usually allocated by qh_readinput */ - if (qh first_point && qh POINTSmalloc) { - free(qh first_point); - qh first_point= NULL; - } - if (qh input_points && qh input_malloc) { /* set by qh_joggleinput */ - free (qh input_points); - qh input_points= NULL; - } - trace5((qh ferr, "qh_freebuffers: finished\n")); -} /* freebuffers */ - - -/*-<a href="qh-globa.htm#TOC" - >-------------------------------</a><a name="freebuild">-</a> - - qh_freebuild( allmem ) - free global memory used by qh_initbuild and qh_buildhull - if !allmem, - does not free short memory (freed by qh_memfreeshort) - - design: - free centrums - free each vertex - mark unattached ridges - for each facet - free ridges - free outside set, coplanar set, neighbor set, ridge set, vertex set - free facet - free hash table - free interior point - free merge set - free temporary sets -*/ -void qh_freebuild (boolT allmem) { - facetT *facet; - vertexT *vertex; - ridgeT *ridge, **ridgep; - mergeT *merge, **mergep; - - trace1((qh ferr, "qh_freebuild: free memory from qh_inithull and qh_buildhull\n")); - if (qh del_vertices) - qh_settruncate (qh del_vertices, 0); - if (allmem) { - qh_clearcenters (qh_ASnone); - while ((vertex= qh vertex_list)) { - if (vertex->next) - qh_delvertex (vertex); - else { - qh_memfree (vertex, sizeof(vertexT)); - qh newvertex_list= qh vertex_list= NULL; - } - } - }else if (qh VERTEXneighbors) { - FORALLvertices - qh_setfreelong (&(vertex->neighbors)); - } - qh VERTEXneighbors= False; - qh GOODclosest= NULL; - if (allmem) { - FORALLfacets { - FOREACHridge_(facet->ridges) - ridge->seen= False; - } - FORALLfacets { - if (facet->visible) { - FOREACHridge_(facet->ridges) { - if (!otherfacet_(ridge, facet)->visible) - ridge->seen= True; /* an unattached ridge */ - } - } - } - while ((facet= qh facet_list)) { - FOREACHridge_(facet->ridges) { - if (ridge->seen) { - qh_setfree(&(ridge->vertices)); - qh_memfree(ridge, sizeof(ridgeT)); - }else - ridge->seen= True; - } - qh_setfree (&(facet->outsideset)); - qh_setfree (&(facet->coplanarset)); - qh_setfree (&(facet->neighbors)); - qh_setfree (&(facet->ridges)); - qh_setfree (&(facet->vertices)); - if (facet->next) - qh_delfacet (facet); - else { - qh_memfree (facet, sizeof(facetT)); - qh visible_list= qh newfacet_list= qh facet_list= NULL; - } - } - }else { - FORALLfacets { - qh_setfreelong (&(facet->outsideset)); - qh_setfreelong (&(facet->coplanarset)); - if (!facet->simplicial) { - qh_setfreelong (&(facet->neighbors)); - qh_setfreelong (&(facet->ridges)); - qh_setfreelong (&(facet->vertices)); - } - } - } - qh_setfree (&(qh hash_table)); - qh_memfree (qh interior_point, qh normal_size); - qh interior_point= NULL; - FOREACHmerge_(qh facet_mergeset) /* usually empty */ - qh_memfree (merge, sizeof(mergeT)); - qh facet_mergeset= NULL; /* temp set */ - qh degen_mergeset= NULL; /* temp set */ - qh_settempfree_all(); -} /* freebuild */ - -/*-<a href="qh-globa.htm#TOC" - >-------------------------------</a><a name="freeqhull">-</a> - - qh_freeqhull( allmem ) - free global memory - if !allmem, - does not free short memory (freed by qh_memfreeshort) - - notes: - sets qh.NOerrexit in case caller forgets to - - design: - free global and temporary memory from qh_initbuild and qh_buildhull - free buffers - free statistics -*/ -void qh_freeqhull (boolT allmem) { - - trace1((qh ferr, "qh_freeqhull: free global memory\n")); - qh NOerrexit= True; /* no more setjmp since called at exit */ - qh_freebuild (allmem); - qh_freebuffers(); - qh_freestatistics(); -#if qh_QHpointer - free (qh_qh); - qh_qh= NULL; -#else - memset((char *)&qh_qh, 0, sizeof(qhT)); - qh NOerrexit= True; -#endif -} /* freeqhull */ - -/*-<a href="qh-globa.htm#TOC" - >-------------------------------</a><a name="init_A">-</a> - - qh_init_A( infile, outfile, errfile, argc, argv ) - initialize memory and stdio files - convert input options to option string (qh.qhull_command) - - notes: - infile may be NULL if qh_readpoints() is not called - - errfile should always be defined. It is used for reporting - errors. outfile is used for output and format options. - - argc/argv may be 0/NULL - - called before error handling initialized - qh_errexit() may not be used -*/ -void qh_init_A (FILE *infile, FILE *outfile, FILE *errfile, int argc, char *argv[]) { - qh_meminit (errfile); - qh_initqhull_start (infile, outfile, errfile); - qh_init_qhull_command (argc, argv); -} /* init_A */ - -/*-<a href="qh-globa.htm#TOC" - >-------------------------------</a><a name="init_B">-</a> - - qh_init_B( points, numpoints, dim, ismalloc ) - initialize globals for points array - - points has numpoints dim-dimensional points - points[0] is the first coordinate of the first point - points[1] is the second coordinate of the first point - points[dim] is the first coordinate of the second point - - ismalloc=True - Qhull will call free(points) on exit or input transformation - ismalloc=False - Qhull will allocate a new point array if needed for input transformation - - qh.qhull_command - is the option string. - It is defined by qh_init_B(), qh_qhull_command(), or qh_initflags - - returns: - if qh.PROJECTinput or (qh.DELAUNAY and qh.PROJECTdelaunay) - projects the input to a new point array - - if qh.DELAUNAY, - qh.hull_dim is increased by one - if qh.ATinfinity, - qh_projectinput adds point-at-infinity for Delaunay tri. - - if qh.SCALEinput - changes the upper and lower bounds of the input, see qh_scaleinput() - - if qh.ROTATEinput - rotates the input by a random rotation, see qh_rotateinput() - if qh.DELAUNAY - rotates about the last coordinate - - notes: - called after points are defined - qh_errexit() may be used -*/ -void qh_init_B (coordT *points, int numpoints, int dim, boolT ismalloc) { - qh_initqhull_globals (points, numpoints, dim, ismalloc); - if (qhmem.LASTsize == 0) - qh_initqhull_mem(); - /* mem.c and qset.c are initialized */ - qh_initqhull_buffers(); - qh_initthresholds (qh qhull_command); - if (qh PROJECTinput || (qh DELAUNAY && qh PROJECTdelaunay)) - qh_projectinput(); - if (qh SCALEinput) - qh_scaleinput(); - if (qh ROTATErandom >= 0) { - qh_randommatrix (qh gm_matrix, qh hull_dim, qh gm_row); - if (qh DELAUNAY) { - int k, lastk= qh hull_dim-1; - for (k= 0; k < lastk; k++) { - qh gm_row[k][lastk]= 0.0; - qh gm_row[lastk][k]= 0.0; - } - qh gm_row[lastk][lastk]= 1.0; - } - qh_gram_schmidt (qh hull_dim, qh gm_row); - qh_rotateinput (qh gm_row); - } -} /* init_B */ - -/*-<a href="qh-globa.htm#TOC" - >-------------------------------</a><a name="init_qhull_command">-</a> - - qh_init_qhull_command( argc, argv ) - build qh.qhull_command from argc/argv - - returns: - a space-deliminated string of options (just as typed) - - notes: - makes option string easy to input and output - - argc/argv may be 0/NULL -*/ -void qh_init_qhull_command(int argc, char *argv[]) { - int i; - char *s; - - if (argc) { - if ((s= strrchr( argv[0], '\\'))) /* Borland gives full path */ - strcpy (qh qhull_command, s+1); - else - strcpy (qh qhull_command, argv[0]); - if ((s= strstr (qh qhull_command, ".EXE")) - || (s= strstr (qh qhull_command, ".exe"))) - *s= '\0'; - } - for (i=1; i < argc; i++) { - if (strlen (qh qhull_command) + strlen(argv[i]) + 1 < sizeof(qh qhull_command)) { - strcat (qh qhull_command, " "); - strcat (qh qhull_command, argv[i]); - }else { - fprintf (qh ferr, "qhull input error: more than %d characters in command line\n", - (int)sizeof(qh qhull_command)); - exit (1); /* can not use qh_errexit */ - } - } -} /* init_qhull_command */ - -/*-<a href="qh-globa.htm#TOC" - >-------------------------------</a><a name="initflags">-</a> - - qh_initflags( commandStr ) - set flags and initialized constants from commandStr - - returns: - sets qh.qhull_command to command if needed - - notes: - ignores first word (e.g., "qhull d") - use qh_strtol/strtod since strtol/strtod may or may not skip trailing spaces - - see: - qh_initthresholds() continues processing of 'Pdn' and 'PDn' - 'prompt' in unix.c for documentation - - design: - for each space-deliminated option group - if top-level option - check syntax - append approriate option to option string - set appropriate global variable or append printFormat to print options - else - for each sub-option - check syntax - append approriate option to option string - set appropriate global variable or append printFormat to print options - - -*/ -void qh_initflags(char *command) { - int k, i, lastproject; - char *s= command, *t, *prev_s, *start, key; - boolT isgeom= False, wasproject; - realT r; - - if (command != &qh qhull_command[0]) { - *qh qhull_command= '\0'; - strncat( qh qhull_command, command, sizeof( qh qhull_command)); - } - while (*s && !isspace(*s)) /* skip program name */ - s++; - while (*s) { - while (*s && isspace(*s)) - s++; - if (*s == '-') - s++; - if (!*s) - break; - prev_s= s; - switch (*s++) { - case 'd': - qh_option ("delaunay", NULL, NULL); - qh DELAUNAY= True; - break; - case 'f': - qh_option ("facets", NULL, NULL); - qh_appendprint (qh_PRINTfacets); - break; - case 'i': - qh_option ("incidence", NULL, NULL); - qh_appendprint (qh_PRINTincidences); - break; - case 'm': - qh_option ("mathematica", NULL, NULL); - qh_appendprint (qh_PRINTmathematica); - break; - case 'n': - qh_option ("normals", NULL, NULL); - qh_appendprint (qh_PRINTnormals); - break; - case 'o': - qh_option ("offFile", NULL, NULL); - qh_appendprint (qh_PRINToff); - break; - case 'p': - qh_option ("points", NULL, NULL); - qh_appendprint (qh_PRINTpoints); - break; - case 's': - qh_option ("summary", NULL, NULL); - qh PRINTsummary= True; - break; - case 'v': - qh_option ("voronoi", NULL, NULL); - qh VORONOI= True; - qh DELAUNAY= True; - break; - case 'A': - if (!isdigit(*s) && *s != '.' && *s != '-') - fprintf(qh ferr, "qhull warning: no maximum cosine angle given for option 'An'. Ignored.\n"); - else { - if (*s == '-') { - qh premerge_cos= -qh_strtod (s, &s); - qh_option ("Angle-premerge-", NULL, &qh premerge_cos); - qh PREmerge= True; - }else { - qh postmerge_cos= qh_strtod (s, &s); - qh_option ("Angle-postmerge", NULL, &qh postmerge_cos); - qh POSTmerge= True; - } - qh MERGING= True; - } - break; - case 'C': - if (!isdigit(*s) && *s != '.' && *s != '-') - fprintf(qh ferr, "qhull warning: no centrum radius given for option 'Cn'. Ignored.\n"); - else { - if (*s == '-') { - qh premerge_centrum= -qh_strtod (s, &s); - qh_option ("Centrum-premerge-", NULL, &qh premerge_centrum); - qh PREmerge= True; - }else { - qh postmerge_centrum= qh_strtod (s, &s); - qh_option ("Centrum-postmerge", NULL, &qh postmerge_centrum); - qh POSTmerge= True; - } - qh MERGING= True; - } - break; - case 'E': - if (*s == '-') - fprintf(qh ferr, "qhull warning: negative maximum roundoff given for option 'An'. Ignored.\n"); - else if (!isdigit(*s)) - fprintf(qh ferr, "qhull warning: no maximum roundoff given for option 'En'. Ignored.\n"); - else { - qh DISTround= qh_strtod (s, &s); - qh_option ("Distance-roundoff", NULL, &qh DISTround); - qh SETroundoff= True; - } - break; - case 'H': - start= s; - qh HALFspace= True; - qh_strtod (s, &t); - while (t > s) { - if (*t && !isspace (*t)) { - if (*t == ',') - t++; - else - fprintf (qh ferr, "qhull warning: origin for Halfspace intersection should be 'Hn,n,n,...'\n"); - } - s= t; - qh_strtod (s, &t); - } - if (start < t) { - if (!(qh feasible_string= (char*)calloc (t-start+1, 1))) { - fprintf(qh ferr, "qhull error: insufficient memory for 'Hn,n,n'\n"); - qh_errexit(qh_ERRmem, NULL, NULL); - } - strncpy (qh feasible_string, start, t-start); - qh_option ("Halfspace-about", NULL, NULL); - qh_option (qh feasible_string, NULL, NULL); - }else - qh_option ("Halfspace", NULL, NULL); - break; - case 'R': - if (!isdigit(*s)) - fprintf(qh ferr, "qhull warning: missing random perturbation for option 'Rn'. Ignored\n"); - else { - qh RANDOMfactor= qh_strtod (s, &s); - qh_option ("Random_perturb", NULL, &qh RANDOMfactor); - qh RANDOMdist= True; - } - break; - case 'V': - if (!isdigit(*s) && *s != '-') - fprintf(qh ferr, "qhull warning: missing visible distance for option 'Vn'. Ignored\n"); - else { - qh MINvisible= qh_strtod (s, &s); - qh_option ("Visible", NULL, &qh MINvisible); - } - break; - case 'U': - if (!isdigit(*s) && *s != '-') - fprintf(qh ferr, "qhull warning: missing coplanar distance for option 'Un'. Ignored\n"); - else { - qh MAXcoplanar= qh_strtod (s, &s); - qh_option ("U-coplanar", NULL, &qh MAXcoplanar); - } - break; - case 'W': - if (*s == '-') - fprintf(qh ferr, "qhull warning: negative outside width for option 'Wn'. Ignored.\n"); - else if (!isdigit(*s)) - fprintf(qh ferr, "qhull warning: missing outside width for option 'Wn'. Ignored\n"); - else { - qh MINoutside= qh_strtod (s, &s); - qh_option ("W-outside", NULL, &qh MINoutside); - qh APPROXhull= True; - } - break; - /************ sub menus ***************/ - case 'F': - while (*s && !isspace(*s)) { - switch(*s++) { - case 'a': - qh_option ("Farea", NULL, NULL); - qh_appendprint (qh_PRINTarea); - qh GETarea= True; - break; - case 'A': - qh_option ("FArea-total", NULL, NULL); - qh GETarea= True; - break; - case 'c': - qh_option ("Fcoplanars", NULL, NULL); - qh_appendprint (qh_PRINTcoplanars); - break; - case 'C': - qh_option ("FCentrums", NULL, NULL); - qh_appendprint (qh_PRINTcentrums); - break; - case 'd': - qh_option ("Fd-cdd-in", NULL, NULL); - qh CDDinput= True; - break; - case 'D': - qh_option ("FD-cdd-out", NULL, NULL); - qh CDDoutput= True; - break; - case 'F': - qh_option ("FFacets-xridge", NULL, NULL); - qh_appendprint (qh_PRINTfacets_xridge); - break; - case 'i': - qh_option ("Finner", NULL, NULL); - qh_appendprint (qh_PRINTinner); - break; - case 'I': - qh_option ("FIDs", NULL, NULL); - qh_appendprint (qh_PRINTids); - break; - case 'm': - qh_option ("Fmerges", NULL, NULL); - qh_appendprint (qh_PRINTmerges); - break; - case 'n': - qh_option ("Fneighbors", NULL, NULL); - qh_appendprint (qh_PRINTneighbors); - break; - case 'N': - qh_option ("FNeighbors-vertex", NULL, NULL); - qh_appendprint (qh_PRINTvneighbors); - break; - case 'o': - qh_option ("Fouter", NULL, NULL); - qh_appendprint (qh_PRINTouter); - break; - case 'O': - if (qh PRINToptions1st) { - qh_option ("FOptions", NULL, NULL); - qh_appendprint (qh_PRINToptions); - }else - qh PRINToptions1st= True; - break; - case 'p': - qh_option ("Fpoint-intersect", NULL, NULL); - qh_appendprint (qh_PRINTpointintersect); - break; - case 'P': - qh_option ("FPoint-nearest", NULL, NULL); - qh_appendprint (qh_PRINTpointnearest); - break; - case 'Q': - qh_option ("FQhull", NULL, NULL); - qh_appendprint (qh_PRINTqhull); - break; - case 's': - qh_option ("Fsummary", NULL, NULL); - qh_appendprint (qh_PRINTsummary); - break; - case 'S': - qh_option ("FSize", NULL, NULL); - qh_appendprint (qh_PRINTsize); - qh GETarea= True; - break; - case 't': - qh_option ("Ftriangles", NULL, NULL); - qh_appendprint (qh_PRINTtriangles); - break; - case 'v': - /* option set in qh_initqhull_globals */ - qh_appendprint (qh_PRINTvertices); - break; - case 'V': - qh_option ("FVertex-average", NULL, NULL); - qh_appendprint (qh_PRINTaverage); - break; - case 'x': - qh_option ("Fxtremes", NULL, NULL); - qh_appendprint (qh_PRINTextremes); - break; - default: - s--; - fprintf (qh ferr, "qhull warning: unknown 'F' output option %c, rest ignored\n", (int)s[0]); - while (*++s && !isspace(*s)); - break; - } - } - break; - case 'G': - isgeom= True; - qh_appendprint (qh_PRINTgeom); - while (*s && !isspace(*s)) { - switch(*s++) { - case 'a': - qh_option ("Gall-points", NULL, NULL); - qh PRINTdots= True; - break; - case 'c': - qh_option ("Gcentrums", NULL, NULL); - qh PRINTcentrums= True; - break; - case 'h': - qh_option ("Gintersections", NULL, NULL); - qh DOintersections= True; - break; - case 'i': - qh_option ("Ginner", NULL, NULL); - qh PRINTinner= True; - break; - case 'n': - qh_option ("Gno-planes", NULL, NULL); - qh PRINTnoplanes= True; - break; - case 'o': - qh_option ("Gouter", NULL, NULL); - qh PRINTouter= True; - break; - case 'p': - qh_option ("Gpoints", NULL, NULL); - qh PRINTcoplanar= True; - break; - case 'r': - qh_option ("Gridges", NULL, NULL); - qh PRINTridges= True; - break; - case 't': - qh_option ("Gtransparent", NULL, NULL); - qh PRINTtransparent= True; - break; - case 'v': - qh_option ("Gvertices", NULL, NULL); - qh PRINTspheres= True; - break; - case 'D': - if (!isdigit (*s)) - fprintf (qh ferr, "qhull input error: missing dimension for option 'GDn'\n"); - else { - if (qh DROPdim >= 0) - fprintf (qh ferr, "qhull warning: can only drop one dimension. Previous 'GD%d' ignored\n", - qh DROPdim); - qh DROPdim= qh_strtol (s, &s); - qh_option ("GDrop-dim", &qh DROPdim, NULL); - } - break; - default: - s--; - fprintf (qh ferr, "qhull warning: unknown 'G' print option %c, rest ignored\n", (int)s[0]); - while (*++s && !isspace(*s)); - break; - } - } - break; - case 'P': - while (*s && !isspace(*s)) { - switch(*s++) { - case 'd': case 'D': /* see qh_initthresholds() */ - key= s[-1]; - i= qh_strtol (s, &s); - r= 0; - if (*s == ':') { - s++; - r= qh_strtod (s, &s); - } - if (key == 'd') - qh_option ("Pdrop-facets-dim-less", &i, &r); - else - qh_option ("PDrop-facets-dim-more", &i, &r); - break; - case 'g': - qh_option ("Pgood-facets", NULL, NULL); - qh PRINTgood= True; - break; - case 'G': - qh_option ("PGood-facet-neighbors", NULL, NULL); - qh PRINTneighbors= True; - break; - case 'o': - qh_option ("Poutput-forced", NULL, NULL); - qh FORCEoutput= True; - break; - case 'p': - qh_option ("Pprecision-ignore", NULL, NULL); - qh PRINTprecision= False; - break; - case 'A': - if (!isdigit (*s)) - fprintf (qh ferr, "qhull input error: missing facet count for keep area option 'PAn'\n"); - else { - qh KEEParea= qh_strtol (s, &s); - qh_option ("PArea-keep", &qh KEEParea, NULL); - qh GETarea= True; - } - break; - case 'F': - if (!isdigit (*s)) - fprintf (qh ferr, "qhull input error: missing facet area for option 'PFn'\n"); - else { - qh KEEPminArea= qh_strtod (s, &s); - qh_option ("PFacet-area-keep", NULL, &qh KEEPminArea); - qh GETarea= True; - } - break; - case 'M': - if (!isdigit (*s)) - fprintf (qh ferr, "qhull input error: missing merge count for option 'PMn'\n"); - else { - qh KEEPmerge= qh_strtol (s, &s); - qh_option ("PMerge-keep", &qh KEEPmerge, NULL); - } - break; - default: - s--; - fprintf (qh ferr, "qhull warning: unknown 'P' print option %c, rest ignored\n", (int)s[0]); - while (*++s && !isspace(*s)); - break; - } - } - break; - case 'Q': - lastproject= -1; - while (*s && !isspace(*s)) { - switch(*s++) { - case 'b': case 'B': /* handled by qh_initthresholds */ - key= s[-1]; - if (key == 'b' && *s == 'B') { - s++; - r= qh_DEFAULTbox; - qh SCALEinput= True; - qh_option ("QbBound-unit-box", NULL, &r); - break; - } - if (key == 'b' && *s == 'b') { - s++; - qh SCALElast= True; - qh_option ("Qbbound-last", NULL, NULL); - break; - } - k= qh_strtol (s, &s); - r= 0.0; - wasproject= False; - if (*s == ':') { - s++; - if ((r= qh_strtod(s, &s)) == 0.0) { - t= s; /* need true dimension for memory allocation */ - while (*t && !isspace(*t)) { - if (toupper(*t++) == 'B' - && k == qh_strtol (t, &t) - && *t++ == ':' - && qh_strtod(t, &t) == 0.0) { - qh PROJECTinput++; - trace2((qh ferr, "qh_initflags: project dimension %d\n", k)); - qh_option ("Qb-project-dim", &k, NULL); - wasproject= True; - lastproject= k; - break; - } - } - } - } - if (!wasproject) { - if (lastproject == k && r == 0.0) - lastproject= -1; /* doesn't catch all possible sequences */ - else if (key == 'b') { - qh SCALEinput= True; - if (r == 0.0) - r= -qh_DEFAULTbox; - qh_option ("Qbound-dim-low", &k, &r); - }else { - qh SCALEinput= True; - if (r == 0.0) - r= qh_DEFAULTbox; - qh_option ("QBound-dim-high", &k, &r); - } - } - break; - case 'c': - qh_option ("Qcoplanar-keep", NULL, NULL); - qh KEEPcoplanar= True; - break; - case 'f': - qh_option ("Qfurthest-outside", NULL, NULL); - qh BESToutside= True; - break; - case 'g': - qh_option ("Qgood-facets-only", NULL, NULL); - qh ONLYgood= True; - break; - case 'i': - qh_option ("Qinterior-keep", NULL, NULL); - qh KEEPinside= True; - break; - case 'm': - qh_option ("Qmax-outside-only", NULL, NULL); - qh ONLYmax= True; - break; - case 'r': - qh_option ("Qrandom-outside", NULL, NULL); - qh RANDOMoutside= True; - break; - case 's': - qh_option ("Qsearch-initial-simplex", NULL, NULL); - qh ALLpoints= True; - break; - case 't': - qh_option ("Qtriangulate", NULL, NULL); - qh TRIangulate= True; - break; - case 'T': - qh_option ("QTestPoints", NULL, NULL); - if (!isdigit (*s)) - fprintf (qh ferr, "qhull input error: missing number of test points for option 'QTn'\n"); - else { - qh TESTpoints= qh_strtol (s, &s); - qh_option ("QTestPoints", &qh TESTpoints, NULL); - } - break; - case 'u': - qh_option ("QupperDelaunay", NULL, NULL); - qh UPPERdelaunay= True; - break; - case 'v': - qh_option ("Qvertex-neighbors-convex", NULL, NULL); - qh TESTvneighbors= True; - break; - case 'x': - qh_option ("Qxact-merge", NULL, NULL); - qh MERGEexact= True; - break; - case 'z': - qh_option ("Qz-infinity-point", NULL, NULL); - qh ATinfinity= True; - break; - case '0': - qh_option ("Q0-no-premerge", NULL, NULL); - qh NOpremerge= True; - break; - case '1': - if (!isdigit(*s)) { - qh_option ("Q1-no-angle-sort", NULL, NULL); - qh ANGLEmerge= False; - break; - } - switch(*s++) { - case '0': - qh_option ("Q10-no-narrow", NULL, NULL); - qh NOnarrow= True; - break; - case '1': - qh_option ("Q11-trinormals Qtriangulate", NULL, NULL); - qh TRInormals= True; - qh TRIangulate= True; - break; - default: - s--; - fprintf (qh ferr, "qhull warning: unknown 'Q' qhull option 1%c, rest ignored\n", (int)s[0]); - while (*++s && !isspace(*s)); - break; - } - break; - case '2': - qh_option ("Q2-no-merge-independent", NULL, NULL); - qh MERGEindependent= False; - goto LABELcheckdigit; - break; /* no warnings */ - case '3': - qh_option ("Q3-no-merge-vertices", NULL, NULL); - qh MERGEvertices= False; - LABELcheckdigit: - if (isdigit(*s)) - fprintf (qh ferr, "qhull warning: can not follow '1', '2', or '3' with a digit. '%c' skipped.\n", - *s++); - break; - case '4': - qh_option ("Q4-avoid-old-into-new", NULL, NULL); - qh AVOIDold= True; - break; - case '5': - qh_option ("Q5-no-check-outer", NULL, NULL); - qh SKIPcheckmax= True; - break; - case '6': - qh_option ("Q6-no-concave-merge", NULL, NULL); - qh SKIPconvex= True; - break; - case '7': - qh_option ("Q7-no-breadth-first", NULL, NULL); - qh VIRTUALmemory= True; - break; - case '8': - qh_option ("Q8-no-near-inside", NULL, NULL); - qh NOnearinside= True; - break; - case '9': - qh_option ("Q9-pick-furthest", NULL, NULL); - qh PICKfurthest= True; - break; - case 'G': - i= qh_strtol (s, &t); - if (qh GOODpoint) - fprintf (qh ferr, "qhull warning: good point already defined for option 'QGn'. Ignored\n"); - else if (s == t) - fprintf (qh ferr, "qhull warning: missing good point id for option 'QGn'. Ignored\n"); - else if (i < 0 || *s == '-') { - qh GOODpoint= i-1; - qh_option ("QGood-if-dont-see-point", &i, NULL); - }else { - qh GOODpoint= i+1; - qh_option ("QGood-if-see-point", &i, NULL); - } - s= t; - break; - case 'J': - if (!isdigit(*s) && *s != '-') - qh JOGGLEmax= 0.0; - else { - qh JOGGLEmax= (realT) qh_strtod (s, &s); - qh_option ("QJoggle", NULL, &qh JOGGLEmax); - } - break; - case 'R': - if (!isdigit(*s) && *s != '-') - fprintf (qh ferr, "qhull warning: missing random seed for option 'QRn'. Ignored\n"); - else { - qh ROTATErandom= i= qh_strtol(s, &s); - if (i > 0) - qh_option ("QRotate-id", &i, NULL ); - else if (i < -1) - qh_option ("QRandom-seed", &i, NULL ); - } - break; - case 'V': - i= qh_strtol (s, &t); - if (qh GOODvertex) - fprintf (qh ferr, "qhull warning: good vertex already defined for option 'QVn'. Ignored\n"); - else if (s == t) - fprintf (qh ferr, "qhull warning: no good point id given for option 'QVn'. Ignored\n"); - else if (i < 0) { - qh GOODvertex= i - 1; - qh_option ("QV-good-facets-not-point", &i, NULL); - }else { - qh_option ("QV-good-facets-point", &i, NULL); - qh GOODvertex= i + 1; - } - s= t; - break; - default: - s--; - fprintf (qh ferr, "qhull warning: unknown 'Q' qhull option %c, rest ignored\n", (int)s[0]); - while (*++s && !isspace(*s)); - break; - } - } - break; - case 'T': - while (*s && !isspace(*s)) { - if (isdigit(*s) || *s == '-') - qh IStracing= qh_strtol(s, &s); - else switch(*s++) { - case 'c': - qh_option ("Tcheck-frequently", NULL, NULL); - qh CHECKfrequently= True; - break; - case 's': - qh_option ("Tstatistics", NULL, NULL); - qh PRINTstatistics= True; - break; - case 'v': - qh_option ("Tverify", NULL, NULL); - qh VERIFYoutput= True; - break; - case 'z': - if (!qh fout) - fprintf (qh ferr, "qhull warning: output file undefined (stdout). Option 'Tz' ignored.\n"); - else { - qh_option ("Tz-stdout", NULL, NULL); - qh ferr= qh fout; - qhmem.ferr= qh fout; - } - break; - case 'C': - if (!isdigit(*s)) - fprintf (qh ferr, "qhull warning: missing point id for cone for trace option 'TCn'. Ignored\n"); - else { - i= qh_strtol (s, &s); - qh_option ("TCone-stop", &i, NULL); - qh STOPcone= i + 1; - } - break; - case 'F': - if (!isdigit(*s)) - fprintf (qh ferr, "qhull warning: missing frequency count for trace option 'TFn'. Ignored\n"); - else { - qh REPORTfreq= qh_strtol (s, &s); - qh_option ("TFacet-log", &qh REPORTfreq, NULL); - qh REPORTfreq2= qh REPORTfreq/2; /* for tracemerging() */ - } - break; - case 'I': - if (s[0] != ' ' || s[1] == '\"' || s[1] == '\'' ||isspace (s[1])) { - s++; - fprintf (qh ferr, "qhull warning: option 'TI' mistyped.\nUse 'TI', one space, file name, and space or end-of-line.\nDo not use quotes. Option 'FI' ignored.\n"); - }else { /* not a procedure because of qh_option (filename, NULL, NULL); */ - char filename[500], *t= filename; - - s++; - while (*s) { - if (t - filename >= sizeof (filename)-2) { - fprintf (qh ferr, "qhull error: filename for 'TI' too long.\n"); - qh_errexit (qh_ERRinput, NULL, NULL); - } - if (isspace (*s)) - break; - *(t++)= *s++; - } - *t= '\0'; - if (!freopen (filename, "r", stdin)) { - fprintf (qh ferr, "qhull error: could not open file \"%s\".", filename); - qh_errexit (qh_ERRinput, NULL, NULL); - }else { - qh_option ("TInput-file", NULL, NULL); - qh_option (filename, NULL, NULL); - } - } - break; - case 'O': - if (s[0] != ' ' || s[1] == '\"' || isspace (s[1])) { - s++; - fprintf (qh ferr, "qhull warning: option 'TO' mistyped.\nUse 'TO', one space, file name, and space or end-of-line.\nThe file name may be enclosed in single quotes.\nDo not use double quotes. Option 'FO' ignored.\n"); - }else { /* not a procedure because of qh_option (filename, NULL, NULL); */ - char filename[500], *t= filename; - boolT isquote= False; - - s++; - if (*s == '\'') { - isquote= True; - s++; - } - while (*s) { - if (t - filename >= sizeof (filename)-2) { - fprintf (qh ferr, "qhull error: filename for 'TO' too long.\n"); - qh_errexit (qh_ERRinput, NULL, NULL); - } - if (isquote) { - if (*s == '\'') { - s++; - isquote= False; - break; - } - }else if (isspace (*s)) - break; - *(t++)= *s++; - } - *t= '\0'; - if (isquote) - fprintf (qh ferr, "qhull error: missing end quote for option 'TO'. Rest of line ignored.\n"); - else if (!freopen (filename, "w", stdout)) { - fprintf (qh ferr, "qhull error: could not open file \"%s\".", filename); - qh_errexit (qh_ERRinput, NULL, NULL); - }else { - qh_option ("TOutput-file", NULL, NULL); - qh_option (filename, NULL, NULL); - } - } - break; - case 'P': - if (!isdigit(*s)) - fprintf (qh ferr, "qhull warning: missing point id for trace option 'TPn'. Ignored\n"); - else { - qh TRACEpoint= qh_strtol (s, &s); - qh_option ("Trace-point", &qh TRACEpoint, NULL); - } - break; - case 'M': - if (!isdigit(*s)) - fprintf (qh ferr, "qhull warning: missing merge id for trace option 'TMn'. Ignored\n"); - else { - qh TRACEmerge= qh_strtol (s, &s); - qh_option ("Trace-merge", &qh TRACEmerge, NULL); - } - break; - case 'R': - if (!isdigit(*s)) - fprintf (qh ferr, "qhull warning: missing rerun count for trace option 'TRn'. Ignored\n"); - else { - qh RERUN= qh_strtol (s, &s); - qh_option ("TRerun", &qh RERUN, NULL); - } - break; - case 'V': - i= qh_strtol (s, &t); - if (s == t) - fprintf (qh ferr, "qhull warning: missing furthest point id for trace option 'TVn'. Ignored\n"); - else if (i < 0) { - qh STOPpoint= i - 1; - qh_option ("TV-stop-before-point", &i, NULL); - }else { - qh STOPpoint= i + 1; - qh_option ("TV-stop-after-point", &i, NULL); - } - s= t; - break; - case 'W': - if (!isdigit(*s)) - fprintf (qh ferr, "qhull warning: missing max width for trace option 'TWn'. Ignored\n"); - else { - qh TRACEdist= (realT) qh_strtod (s, &s); - qh_option ("TWide-trace", NULL, &qh TRACEdist); - } - break; - default: - s--; - fprintf (qh ferr, "qhull warning: unknown 'T' trace option %c, rest ignored\n", (int)s[0]); - while (*++s && !isspace(*s)); - break; - } - } - break; - default: - fprintf (qh ferr, "qhull warning: unknown flag %c (%x)\n", (int)s[-1], - (int)s[-1]); - break; - } - if (s-1 == prev_s && *s && !isspace(*s)) { - fprintf (qh ferr, "qhull warning: missing space after flag %c (%x); reserved for menu. Skipped.\n", - (int)*prev_s, (int)*prev_s); - while (*s && !isspace(*s)) - s++; - } - } - if (isgeom && !qh FORCEoutput && qh PRINTout[1]) - fprintf (qh ferr, "qhull warning: additional output formats are not compatible with Geomview\n"); - /* set derived values in qh_initqhull_globals */ -} /* initflags */ - - -/*-<a href="qh-globa.htm#TOC" - >-------------------------------</a><a name="initqhull_buffers">-</a> - - qh_initqhull_buffers() - initialize global memory buffers - - notes: - must match qh_freebuffers() -*/ -void qh_initqhull_buffers (void) { - int k; - - qh TEMPsize= (qhmem.LASTsize - sizeof (setT))/SETelemsize; - if (qh TEMPsize <= 0 || qh TEMPsize > qhmem.LASTsize) - qh TEMPsize= 8; /* e.g., if qh_NOmem */ - qh other_points= qh_setnew (qh TEMPsize); - qh del_vertices= qh_setnew (qh TEMPsize); - qh coplanarset= qh_setnew (qh TEMPsize); - qh NEARzero= (realT *)qh_memalloc(qh hull_dim * sizeof(realT)); - qh lower_threshold= (realT *)qh_memalloc((qh input_dim+1) * sizeof(realT)); - qh upper_threshold= (realT *)qh_memalloc((qh input_dim+1) * sizeof(realT)); - qh lower_bound= (realT *)qh_memalloc((qh input_dim+1) * sizeof(realT)); - qh upper_bound= (realT *)qh_memalloc((qh input_dim+1) * sizeof(realT)); - for(k= qh input_dim+1; k--; ) { - qh lower_threshold[k]= -REALmax; - qh upper_threshold[k]= REALmax; - qh lower_bound[k]= -REALmax; - qh upper_bound[k]= REALmax; - } - qh gm_matrix= (coordT *)qh_memalloc((qh hull_dim+1) * qh hull_dim * sizeof(coordT)); - qh gm_row= (coordT **)qh_memalloc((qh hull_dim+1) * sizeof(coordT *)); -} /* initqhull_buffers */ - -/*-<a href="qh-globa.htm#TOC" - >-------------------------------</a><a name="initqhull_globals">-</a> - - qh_initqhull_globals( points, numpoints, dim, ismalloc ) - initialize globals - if ismalloc - points were malloc'd and qhull should free at end - - returns: - sets qh.first_point, num_points, input_dim, hull_dim and others - seeds random number generator (seed=1 if tracing) - modifies qh.hull_dim if ((qh.DELAUNAY and qh.PROJECTdelaunay) or qh.PROJECTinput) - adjust user flags as needed - also checks DIM3 dependencies and constants - - notes: - do not use qh_point() since an input transformation may move them elsewhere - - see: - qh_initqhull_start() sets default values for non-zero globals - - design: - initialize points array from input arguments - test for qh.ZEROcentrum - (i.e., use opposite vertex instead of cetrum for convexity testing) - test for qh.PRINTgood (i.e., only print 'good' facets) - initialize qh.CENTERtype, qh.normal_size, - qh.center_size, qh.TRACEpoint/level, - initialize and test random numbers - check for conflicting print output options -*/ -void qh_initqhull_globals (coordT *points, int numpoints, int dim, boolT ismalloc) { - int seed, pointsneeded, extra= 0, i, randi, k; - boolT printgeom= False, printmath= False, printcoplanar= False; - realT randr; - realT factorial; - - time_t timedata; - - trace0((qh ferr, "qh_initqhull_globals: for %s | %s\n", qh rbox_command, - qh qhull_command)); - qh POINTSmalloc= ismalloc; - qh first_point= points; - qh num_points= numpoints; - qh hull_dim= qh input_dim= dim; - if (!qh NOpremerge && !qh MERGEexact && !qh PREmerge && qh JOGGLEmax > REALmax/2) { - qh MERGING= True; - if (qh hull_dim <= 4) { - qh PREmerge= True; - qh_option ("_pre-merge", NULL, NULL); - }else { - qh MERGEexact= True; - qh_option ("Qxact_merge", NULL, NULL); - } - }else if (qh MERGEexact) - qh MERGING= True; - if (!qh NOpremerge && qh JOGGLEmax > REALmax/2) { -#ifdef qh_NOmerge - qh JOGGLEmax= 0.0; -#endif - } - if (qh TRIangulate && qh JOGGLEmax < REALmax/2 && qh PRINTprecision) - fprintf(qh ferr, "qhull warning: joggle ('QJ') always produces simplicial output. Triangulated output ('Qt') does nothing.\n"); - if (qh JOGGLEmax < REALmax/2 && qh DELAUNAY && !qh SCALEinput && !qh SCALElast) { - qh SCALElast= True; - qh_option ("Qbbound-last-qj", NULL, NULL); - } - if (qh MERGING && !qh POSTmerge && qh premerge_cos > REALmax/2 - && qh premerge_centrum == 0) { - qh ZEROcentrum= True; - qh ZEROall_ok= True; - qh_option ("_zero-centrum", NULL, NULL); - } - if (qh JOGGLEmax < REALmax/2 && REALepsilon > 2e-8 && qh PRINTprecision) - fprintf(qh ferr, "qhull warning: real epsilon, %2.2g, is probably too large for joggle ('QJn')\nRecompile with double precision reals (see user.h).\n", - REALepsilon); -#ifdef qh_NOmerge - if (qh MERGING) { - fprintf (qh ferr, "qhull input error: merging not installed (qh_NOmerge + 'Qx', 'Cn' or 'An')\n"); - qh_errexit (qh_ERRinput, NULL, NULL); - } -#endif - if (!(qh PRINTgood || qh PRINTneighbors)) { - if (qh KEEParea || qh KEEPminArea < REALmax/2 || qh KEEPmerge || qh DELAUNAY - || (!qh ONLYgood && (qh GOODvertex || qh GOODpoint))) { - qh PRINTgood= True; - qh_option ("Pgood", NULL, NULL); - } - } - if (qh DELAUNAY && qh KEEPcoplanar && !qh KEEPinside) { - qh KEEPinside= True; - qh_option ("Qinterior-keep", NULL, NULL); - } - if (qh DELAUNAY && qh HALFspace) { - fprintf (qh ferr, "qhull input error: can not use Delaunay ('d') or Voronoi ('v') with halfspace intersection ('H')\n"); - qh_errexit (qh_ERRinput, NULL, NULL); - } - if (!qh DELAUNAY && (qh UPPERdelaunay || qh ATinfinity)) { - fprintf (qh ferr, "qhull input error: use upper-Delaunay ('Qu') or infinity-point ('Qz') with Delaunay ('d') or Voronoi ('v')\n"); - qh_errexit (qh_ERRinput, NULL, NULL); - } - if (qh UPPERdelaunay && qh ATinfinity) { - fprintf (qh ferr, "qhull input error: can not use infinity-point ('Qz') with upper-Delaunay ('Qu')\n"); - qh_errexit (qh_ERRinput, NULL, NULL); - } - if (qh SCALElast && !qh DELAUNAY && qh PRINTprecision) - fprintf (qh ferr, "qhull input warning: option 'Qbb' (scale-last-coordinate) is normally used with 'd' or 'v'\n"); - qh DOcheckmax= (!qh SKIPcheckmax && qh MERGING ); - qh KEEPnearinside= (qh DOcheckmax && !(qh KEEPinside && qh KEEPcoplanar) - && !qh NOnearinside); - if (qh MERGING) - qh CENTERtype= qh_AScentrum; - else if (qh VORONOI) - qh CENTERtype= qh_ASvoronoi; - if (qh TESTvneighbors && !qh MERGING) { - fprintf(qh ferr, "qhull input error: test vertex neighbors ('Qv') needs a merge option\n"); - qh_errexit (qh_ERRinput, NULL ,NULL); - } - if (qh PROJECTinput || (qh DELAUNAY && qh PROJECTdelaunay)) { - qh hull_dim -= qh PROJECTinput; - if (qh DELAUNAY) { - qh hull_dim++; - extra= 1; - } - } - if (qh hull_dim <= 1) { - fprintf(qh ferr, "qhull error: dimension %d must be > 1\n", qh hull_dim); - qh_errexit (qh_ERRinput, NULL, NULL); - } - for (k= 2, factorial=1.0; k < qh hull_dim; k++) - factorial *= k; - qh AREAfactor= 1.0 / factorial; - trace2((qh ferr, "qh_initqhull_globals: initialize globals. dim %d numpoints %d malloc? %d projected %d to hull_dim %d\n", - dim, numpoints, ismalloc, qh PROJECTinput, qh hull_dim)); - qh normal_size= qh hull_dim * sizeof(coordT); - qh center_size= qh normal_size - sizeof(coordT); - pointsneeded= qh hull_dim+1; - if (qh hull_dim > qh_DIMmergeVertex) { - qh MERGEvertices= False; - qh_option ("Q3-no-merge-vertices-dim-high", NULL, NULL); - } - if (qh GOODpoint) - pointsneeded++; -#ifdef qh_NOtrace - if (qh IStracing) { - fprintf (qh ferr, "qhull input error: tracing is not installed (qh_NOtrace in user.h)"); - qh_errexit (qh_ERRqhull, NULL, NULL); - } -#endif - if (qh RERUN > 1) { - qh TRACElastrun= qh IStracing; /* qh_build_withrestart duplicates next conditional */ - if (qh IStracing != -1) - qh IStracing= 0; - }else if (qh TRACEpoint != -1 || qh TRACEdist < REALmax/2 || qh TRACEmerge) { - qh TRACElevel= (qh IStracing? qh IStracing : 3); - qh IStracing= 0; - } - if (qh ROTATErandom == 0 || qh ROTATErandom == -1) { - seed= time (&timedata); - if (qh ROTATErandom == -1) { - seed= -seed; - qh_option ("QRandom-seed", &seed, NULL ); - }else - qh_option ("QRotate-random", &seed, NULL); - qh ROTATErandom= seed; - } - seed= qh ROTATErandom; - if (seed == INT_MIN) /* default value */ - seed= 1; - else if (seed < 0) - seed= -seed; - qh_RANDOMseed_(seed); - randr= 0.0; - for (i= 1000; i--; ) { - randi= qh_RANDOMint; - randr += randi; - if (randi > qh_RANDOMmax) { - fprintf (qh ferr, "\ -qhull configuration error (qh_RANDOMmax in user.h):\n\ - random integer %d > qh_RANDOMmax (%.8g)\n", - randi, qh_RANDOMmax); - qh_errexit (qh_ERRinput, NULL, NULL); - } - } - qh_RANDOMseed_(seed); - randr = randr/1000; - if (randr < qh_RANDOMmax/10 - || randr > qh_RANDOMmax * 5) - fprintf (qh ferr, "\ -qhull configuration warning (qh_RANDOMmax in user.h):\n\ - average of 1000 random integers (%.2g) is much different than expected (%.2g).\n\ - Is qh_RANDOMmax (%.2g) wrong?\n", - randr, qh_RANDOMmax/2.0, qh_RANDOMmax); - qh RANDOMa= 2.0 * qh RANDOMfactor/qh_RANDOMmax; - qh RANDOMb= 1.0 - qh RANDOMfactor; - if (qh_HASHfactor < 1.1) { - fprintf(qh ferr, "qhull internal error (qh_initqhull_globals): qh_HASHfactor %d must be at least 1.1. Qhull uses linear hash probing\n", - qh_HASHfactor); - qh_errexit (qh_ERRqhull, NULL, NULL); - } - if (numpoints+extra < pointsneeded) { - fprintf(qh ferr,"qhull input error: not enough points (%d) to construct initial simplex (need %d)\n", - numpoints, pointsneeded); - qh_errexit(qh_ERRinput, NULL, NULL); - } - if (qh PRINTtransparent) { - if (qh hull_dim != 4 || !qh DELAUNAY || qh VORONOI || qh DROPdim >= 0) { - fprintf(qh ferr,"qhull input error: transparent Delaunay ('Gt') needs 3-d Delaunay ('d') w/o 'GDn'\n"); - qh_errexit(qh_ERRinput, NULL, NULL); - } - qh DROPdim = 3; - qh PRINTridges = True; - } - for (i= qh_PRINTEND; i--; ) { - if (qh PRINTout[i] == qh_PRINTgeom) - printgeom= True; - else if (qh PRINTout[i] == qh_PRINTmathematica) - printmath= True; - else if (qh PRINTout[i] == qh_PRINTcoplanars) - printcoplanar= True; - else if (qh PRINTout[i] == qh_PRINTpointnearest) - printcoplanar= True; - else if (qh PRINTout[i] == qh_PRINTpointintersect && !qh HALFspace) { - fprintf (qh ferr, "qhull input error: option 'Fp' is only used for \nhalfspace intersection ('Hn,n,n').\n"); - qh_errexit (qh_ERRinput, NULL, NULL); - }else if (qh PRINTout[i] == qh_PRINTtriangles && (qh HALFspace || qh VORONOI)) { - fprintf (qh ferr, "qhull input error: option 'Ft' is not available for Voronoi vertices or halfspace intersection\n"); - qh_errexit (qh_ERRinput, NULL, NULL); - }else if (qh PRINTout[i] == qh_PRINTcentrums && qh VORONOI) { - fprintf (qh ferr, "qhull input error: option 'FC' is not available for Voronoi vertices ('v')\n"); - qh_errexit (qh_ERRinput, NULL, NULL); - }else if (qh PRINTout[i] == qh_PRINTvertices) { - if (qh VORONOI) - qh_option ("Fvoronoi", NULL, NULL); - else - qh_option ("Fvertices", NULL, NULL); - } - } - if (printcoplanar && qh DELAUNAY && qh JOGGLEmax < REALmax/2) { - if (qh PRINTprecision) - fprintf (qh ferr, "qhull input warning: 'QJ' (joggle) will usually prevent coincident input sites for options 'Fc' and 'FP'\n"); - } - if (!qh KEEPcoplanar && !qh KEEPinside && !qh ONLYgood) { - if ((qh PRINTcoplanar && qh PRINTspheres) || printcoplanar) { - qh KEEPcoplanar = True; - qh_option ("Qcoplanar", NULL, NULL); - } - } - if (printmath && (qh hull_dim > 3 || qh VORONOI)) { - fprintf (qh ferr, "qhull input error: Mathematica output is only available for 2-d and 3-d convex hulls and 2-d Delaunay triangulations\n"); - qh_errexit (qh_ERRinput, NULL, NULL); - } - if (printgeom) { - if (qh hull_dim > 4) { - fprintf (qh ferr, "qhull input error: Geomview output is only available for 2-d, 3-d and 4-d\n"); - qh_errexit (qh_ERRinput, NULL, NULL); - } - if (qh PRINTnoplanes && !(qh PRINTcoplanar + qh PRINTcentrums - + qh PRINTdots + qh PRINTspheres + qh DOintersections + qh PRINTridges)) { - fprintf (qh ferr, "qhull input error: no output specified for Geomview\n"); - qh_errexit (qh_ERRinput, NULL, NULL); - } - if (qh VORONOI && (qh hull_dim > 3 || qh DROPdim >= 0)) { - fprintf (qh ferr, "qhull input error: Geomview output for Voronoi diagrams only for 2-d\n"); - qh_errexit (qh_ERRinput, NULL, NULL); - } - /* can not warn about furthest-site Geomview output: no lower_threshold */ - if (qh hull_dim == 4 && qh DROPdim == -1 && - (qh PRINTcoplanar || qh PRINTspheres || qh PRINTcentrums)) { - fprintf (qh ferr, "qhull input warning: coplanars, vertices, and centrums output not\n\ -available for 4-d output (ignored). Could use 'GDn' instead.\n"); - qh PRINTcoplanar= qh PRINTspheres= qh PRINTcentrums= False; - } - } - qh PRINTdim= qh hull_dim; - if (qh DROPdim >=0) { /* after Geomview checks */ - if (qh DROPdim < qh hull_dim) { - qh PRINTdim--; - if (!printgeom || qh hull_dim < 3) - fprintf (qh ferr, "qhull input warning: drop dimension 'GD%d' is only available for 3-d/4-d Geomview\n", qh DROPdim); - }else - qh DROPdim= -1; - }else if (qh VORONOI) { - qh DROPdim= qh hull_dim-1; - qh PRINTdim= qh hull_dim-1; - } -} /* initqhull_globals */ - -/*-<a href="qh-globa.htm#TOC" - >-------------------------------</a><a name="initqhull_mem">-</a> - - qh_initqhull_mem( ) - initialize mem.c for qhull - qh.hull_dim and qh.normal_size determine some of the allocation sizes - if qh.MERGING, - includes ridgeT - calls qh_user_memsizes() to add up to 10 additional sizes for quick allocation - (see numsizes below) - - returns: - mem.c already for qh_memalloc/qh_memfree (errors if called beforehand) - - notes: - qh_produceoutput() prints memsizes - -*/ -void qh_initqhull_mem (void) { - int numsizes; - int i; - - numsizes= 8+10; - qh_meminitbuffers (qh IStracing, qh_MEMalign, numsizes, - qh_MEMbufsize,qh_MEMinitbuf); - qh_memsize(sizeof(vertexT)); - if (qh MERGING) { - qh_memsize(sizeof(ridgeT)); - qh_memsize(sizeof(mergeT)); - } - qh_memsize(sizeof(facetT)); - i= sizeof(setT) + (qh hull_dim - 1) * SETelemsize; /* ridge.vertices */ - qh_memsize(i); - qh_memsize(qh normal_size); /* normal */ - i += SETelemsize; /* facet.vertices, .ridges, .neighbors */ - qh_memsize(i); - qh_user_memsizes(); - qh_memsetup(); -} /* initqhull_mem */ - -/*-<a href="qh-globa.htm#TOC" - >-------------------------------</a><a name="initqhull_start">-</a> - - qh_initqhull_start( infile, outfile, errfile ) - start initialization of qhull - initialize statistics, stdio, default values for global variables - - see: - qh_maxmin() determines the precision constants -*/ -void qh_initqhull_start (FILE *infile, FILE *outfile, FILE *errfile) { - - qh_CPUclock; /* start the clock */ -#if qh_QHpointer - if (!(qh_qh= (qhT *)malloc (sizeof(qhT)))) { - fprintf (errfile, "qhull error (qh_initqhull_globals): insufficient memory\n"); - exit (qh_ERRmem); /* no error handler */ - } - memset((char *)qh_qh, 0, sizeof(qhT)); /* every field is 0, FALSE, NULL */ -#else - memset((char *)&qh_qh, 0, sizeof(qhT)); -#endif - strcat (qh qhull, "qhull"); - qh_initstatistics(); - qh ANGLEmerge= True; - qh DROPdim= -1; - qh ferr= errfile; - qh fin= infile; - qh fout= outfile; - qh furthest_id= -1; - qh JOGGLEmax= REALmax; - qh KEEPminArea = REALmax; - qh last_low= REALmax; - qh last_high= REALmax; - qh last_newhigh= REALmax; - qh max_outside= 0.0; - qh max_vertex= 0.0; - qh MAXabs_coord= 0.0; - qh MAXsumcoord= 0.0; - qh MAXwidth= -REALmax; - qh MERGEindependent= True; - qh MINdenom_1= fmax_(1.0/REALmax, REALmin); /* used by qh_scalepoints */ - qh MINoutside= 0.0; - qh MINvisible= REALmax; - qh MAXcoplanar= REALmax; - qh outside_err= REALmax; - qh premerge_centrum= 0.0; - qh premerge_cos= REALmax; - qh PRINTprecision= True; - qh PRINTradius= 0.0; - qh postmerge_cos= REALmax; - qh postmerge_centrum= 0.0; - qh ROTATErandom= INT_MIN; - qh MERGEvertices= True; - qh totarea= 0.0; - qh totvol= 0.0; - qh TRACEdist= REALmax; - qh TRACEpoint= -1; /* recompile or use 'TPn' */ - qh tracefacet_id= UINT_MAX; /* recompile to trace a facet */ - qh tracevertex_id= UINT_MAX; /* recompile to trace a vertex */ - qh_RANDOMseed_(1); -} /* initqhull_start */ - -/*-<a href="qh-globa.htm#TOC" - >-------------------------------</a><a name="initthresholds">-</a> - - qh_initthresholds( commandString ) - set thresholds for printing and scaling from commandString - - returns: - sets qh.GOODthreshold or qh.SPLITthreshold if 'Pd0D1' used - - see: - qh_initflags(), 'Qbk' 'QBk' 'Pdk' and 'PDk' - qh_inthresholds() - - design: - for each 'Pdn' or 'PDn' option - check syntax - set qh.lower_threshold or qh.upper_threshold - set qh.GOODthreshold if an unbounded threshold is used - set qh.SPLITthreshold if a bounded threshold is used -*/ -void qh_initthresholds(char *command) { - realT value; - int index, maxdim, k; - char *s= command; - char key; - - maxdim= qh input_dim; - if (qh DELAUNAY && (qh PROJECTdelaunay || qh PROJECTinput)) - maxdim++; - while (*s) { - if (*s == '-') - s++; - if (*s == 'P') { - s++; - while (*s && !isspace(key= *s++)) { - if (key == 'd' || key == 'D') { - if (!isdigit(*s)) { - fprintf(qh ferr, "qhull warning: no dimension given for Print option '%c' at: %s. Ignored\n", - key, s-1); - continue; - } - index= qh_strtol (s, &s); - if (index >= qh hull_dim) { - fprintf(qh ferr, "qhull warning: dimension %d for Print option '%c' is >= %d. Ignored\n", - index, key, qh hull_dim); - continue; - } - if (*s == ':') { - s++; - value= qh_strtod(s, &s); - if (fabs((double)value) > 1.0) { - fprintf(qh ferr, "qhull warning: value %2.4g for Print option %c is > +1 or < -1. Ignored\n", - value, key); - continue; - } - }else - value= 0.0; - if (key == 'd') - qh lower_threshold[index]= value; - else - qh upper_threshold[index]= value; - } - } - }else if (*s == 'Q') { - s++; - while (*s && !isspace(key= *s++)) { - if (key == 'b' && *s == 'B') { - s++; - for (k=maxdim; k--; ) { - qh lower_bound[k]= -qh_DEFAULTbox; - qh upper_bound[k]= qh_DEFAULTbox; - } - }else if (key == 'b' && *s == 'b') - s++; - else if (key == 'b' || key == 'B') { - if (!isdigit(*s)) { - fprintf(qh ferr, "qhull warning: no dimension given for Qhull option %c. Ignored\n", - key); - continue; - } - index= qh_strtol (s, &s); - if (index >= maxdim) { - fprintf(qh ferr, "qhull warning: dimension %d for Qhull option %c is >= %d. Ignored\n", - index, key, maxdim); - continue; - } - if (*s == ':') { - s++; - value= qh_strtod(s, &s); - }else if (key == 'b') - value= -qh_DEFAULTbox; - else - value= qh_DEFAULTbox; - if (key == 'b') - qh lower_bound[index]= value; - else - qh upper_bound[index]= value; - } - } - }else { - while (*s && !isspace (*s)) - s++; - } - while (isspace (*s)) - s++; - } - for (k= qh hull_dim; k--; ) { - if (qh lower_threshold[k] > -REALmax/2) { - qh GOODthreshold= True; - if (qh upper_threshold[k] < REALmax/2) { - qh SPLITthresholds= True; - qh GOODthreshold= False; - break; - } - }else if (qh upper_threshold[k] < REALmax/2) - qh GOODthreshold= True; - } -} /* initthresholds */ - -/*-<a href="qh-globa.htm#TOC" - >-------------------------------</a><a name="option">-</a> - - qh_option( option, intVal, realVal ) - add an option description to qh.qhull_options - - notes: - will be printed with statistics ('Ts') and errors - strlen(option) < 40 -*/ -void qh_option (char *option, int *i, realT *r) { - char buf[200]; - int len, maxlen; - - sprintf (buf, " %s", option); - if (i) - sprintf (buf+strlen(buf), " %d", *i); - if (r) - sprintf (buf+strlen(buf), " %2.2g", *r); - len= strlen(buf); - qh qhull_optionlen += len; - maxlen= sizeof (qh qhull_options) - len -1; - maximize_(maxlen, 0); - if (qh qhull_optionlen >= 80 && maxlen > 0) { - qh qhull_optionlen= len; - strncat (qh qhull_options, "\n", maxlen--); - } - strncat (qh qhull_options, buf, maxlen); -} /* option */ - -#if qh_QHpointer -/*-<a href="qh-globa.htm#TOC" - >-------------------------------</a><a name="restore_qhull">-</a> - - qh_restore_qhull( oldqh ) - restores a previously saved qhull - also restores qh_qhstat and qhmem.tempstack - - notes: - errors if current qhull hasn't been saved or freed - uses qhmem for error reporting - - NOTE 1998/5/11: - Freeing memory after qh_save_qhull and qh_restore_qhull - is complicated. The procedures will be redesigned. - - see: - qh_save_qhull() -*/ -void qh_restore_qhull (qhT **oldqh) { - - if (*oldqh && strcmp ((*oldqh)->qhull, "qhull")) { - fprintf (qhmem.ferr, "qhull internal error (qh_restore_qhull): %p is not a qhull data structure\n", - *oldqh); - qh_errexit (qh_ERRqhull, NULL, NULL); - } - if (qh_qh) { - fprintf (qhmem.ferr, "qhull internal error (qh_restore_qhull): did not save or free existing qhull\n"); - qh_errexit (qh_ERRqhull, NULL, NULL); - } - if (!*oldqh || !(*oldqh)->old_qhstat) { - fprintf (qhmem.ferr, "qhull internal error (qh_restore_qhull): did not previously save qhull %p\n", - *oldqh); - qh_errexit (qh_ERRqhull, NULL, NULL); - } - qh_qh= *oldqh; - *oldqh= NULL; - qh_qhstat= qh old_qhstat; - qhmem.tempstack= qh old_tempstack; - trace1((qh ferr, "qh_restore_qhull: restored qhull from %p\n", *oldqh)); -} /* restore_qhull */ - -/*-<a href="qh-globa.htm#TOC" - >-------------------------------</a><a name="save_qhull">-</a> - - qh_save_qhull( ) - saves qhull for a later qh_restore_qhull - also saves qh_qhstat and qhmem.tempstack - - returns: - qh_qh=NULL - - notes: - need to initialize qhull or call qh_restore_qhull before continuing - - NOTE 1998/5/11: - Freeing memory after qh_save_qhull and qh_restore_qhull - is complicated. The procedures will be redesigned. - - see: - qh_restore_qhull() -*/ -qhT *qh_save_qhull (void) { - qhT *oldqh; - - trace1((qhmem.ferr, "qh_save_qhull: save qhull %p\n", qh_qh)); - if (!qh_qh) { - fprintf (qhmem.ferr, "qhull internal error (qh_save_qhull): qhull not initialized\n"); - qh_errexit (qh_ERRqhull, NULL, NULL); - } - qh old_qhstat= qh_qhstat; - qh_qhstat= NULL; - qh old_tempstack= qhmem.tempstack; - qhmem.tempstack= NULL; - oldqh= qh_qh; - qh_qh= NULL; - return oldqh; -} /* save_qhull */ - -#endif - -/*-<a href="qh-globa.htm#TOC" - >-------------------------------</a><a name="strtol">-</a> - - qh_strtol( s, endp) qh_strtod( s, endp) - internal versions of strtol() and strtod() - does not skip trailing spaces - notes: - some implementations of strtol()/strtod() skip trailing spaces -*/ -double qh_strtod (const char *s, char **endp) { - double result; - - result= strtod (s, endp); - if (s < (*endp) && (*endp)[-1] == ' ') - (*endp)--; - return result; -} /* strtod */ - -int qh_strtol (const char *s, char **endp) { - int result; - - result= (int) strtol (s, endp, 10); - if (s< (*endp) && (*endp)[-1] == ' ') - (*endp)--; - return result; -} /* strtol */ diff --git a/extern/qhull/src/io.c b/extern/qhull/src/io.c deleted file mode 100644 index 9b0ccdd0b24..00000000000 --- a/extern/qhull/src/io.c +++ /dev/null @@ -1,4089 +0,0 @@ -/*<html><pre> -<a href="qh-io.htm" - >-------------------------------</a><a name="TOP">-</a> - - io.c - Input/Output routines of qhull application - - see qh-io.htm and io.h - - see user.c for qh_errprint and qh_printfacetlist - - unix.c calls qh_readpoints and qh_produce_output - - unix.c and user.c are the only callers of io.c functions - This allows the user to avoid loading io.o from qhull.a - - copyright (c) 1993-2002 The Geometry Center -*/ - -#include "qhull_a.h" - -/*========= -prototypes for internal functions ========= */ - -static int qh_compare_facetarea(const void *p1, const void *p2); -static int qh_compare_facetmerge(const void *p1, const void *p2); -static int qh_compare_facetvisit(const void *p1, const void *p2); -int qh_compare_vertexpoint(const void *p1, const void *p2); /* not used */ - -/*========= -functions in alphabetical order after qh_produce_output() =====*/ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="produce_output">-</a> - - qh_produce_output() - prints out the result of qhull in desired format - if qh.GETarea - computes and prints area and volume - qh.PRINTout[] is an array of output formats - - notes: - prints output in qh.PRINTout order -*/ -void qh_produce_output(void) { - int i, tempsize= qh_setsize ((setT*)qhmem.tempstack), d_1; - - if (qh VORONOI) { - qh_clearcenters (qh_ASvoronoi); - qh_vertexneighbors(); - } - if (qh TRIangulate) { - qh_triangulate(); - if (qh VERIFYoutput && !qh CHECKfrequently) - qh_checkpolygon (qh facet_list); - } - qh_findgood_all (qh facet_list); - if (qh GETarea) - qh_getarea(qh facet_list); - if (qh KEEParea || qh KEEPmerge || qh KEEPminArea < REALmax/2) - qh_markkeep (qh facet_list); - if (qh PRINTsummary) - qh_printsummary(qh ferr); - else if (qh PRINTout[0] == qh_PRINTnone) - qh_printsummary(qh fout); - for (i= 0; i < qh_PRINTEND; i++) - qh_printfacets (qh fout, qh PRINTout[i], qh facet_list, NULL, !qh_ALL); - qh_allstatistics(); - if (qh PRINTprecision && !qh MERGING && (qh JOGGLEmax > REALmax/2 || qh RERUN)) - qh_printstats (qh ferr, qhstat precision, NULL); - if (qh VERIFYoutput && (zzval_(Zridge) > 0 || zzval_(Zridgemid) > 0)) - qh_printstats (qh ferr, qhstat vridges, NULL); - if (qh PRINTstatistics) { - qh_collectstatistics(); - qh_printstatistics(qh ferr, ""); - qh_memstatistics (qh ferr); - d_1= sizeof(setT) + (qh hull_dim - 1) * SETelemsize; - fprintf(qh ferr, "\ - size in bytes: merge %ld ridge %ld vertex %ld facet %ld\n\ - normal %d ridge vertices %d facet vertices or neighbors %ld\n", - sizeof(mergeT), sizeof(ridgeT), - sizeof(vertexT), sizeof(facetT), - qh normal_size, d_1, d_1 + SETelemsize); - } - if (qh_setsize ((setT*)qhmem.tempstack) != tempsize) { - fprintf (qh ferr, "qhull internal error (qh_produce_output): temporary sets not empty (%d)\n", - qh_setsize ((setT*)qhmem.tempstack)); - qh_errexit (qh_ERRqhull, NULL, NULL); - } -} /* produce_output */ - - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="dfacet">-</a> - - dfacet( id ) - print facet by id, for debugging - -*/ -void dfacet (unsigned id) { - facetT *facet; - - FORALLfacets { - if (facet->id == id) { - qh_printfacet (qh fout, facet); - break; - } - } -} /* dfacet */ - - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="dvertex">-</a> - - dvertex( id ) - print vertex by id, for debugging -*/ -void dvertex (unsigned id) { - vertexT *vertex; - - FORALLvertices { - if (vertex->id == id) { - qh_printvertex (qh fout, vertex); - break; - } - } -} /* dvertex */ - - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="compare_vertexpoint">-</a> - - qh_compare_vertexpoint( p1, p2 ) - used by qsort() to order vertices by point id -*/ -int qh_compare_vertexpoint(const void *p1, const void *p2) { - vertexT *a= *((vertexT **)p1), *b= *((vertexT **)p2); - - return ((qh_pointid(a->point) > qh_pointid(b->point)?1:-1)); -} /* compare_vertexpoint */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="compare_facetarea">-</a> - - qh_compare_facetarea( p1, p2 ) - used by qsort() to order facets by area -*/ -static int qh_compare_facetarea(const void *p1, const void *p2) { - facetT *a= *((facetT **)p1), *b= *((facetT **)p2); - - if (!a->isarea) - return -1; - if (!b->isarea) - return 1; - if (a->f.area > b->f.area) - return 1; - else if (a->f.area == b->f.area) - return 0; - return -1; -} /* compare_facetarea */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="compare_facetmerge">-</a> - - qh_compare_facetmerge( p1, p2 ) - used by qsort() to order facets by number of merges -*/ -static int qh_compare_facetmerge(const void *p1, const void *p2) { - facetT *a= *((facetT **)p1), *b= *((facetT **)p2); - - return (a->nummerge - b->nummerge); -} /* compare_facetvisit */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="compare_facetvisit">-</a> - - qh_compare_facetvisit( p1, p2 ) - used by qsort() to order facets by visit id or id -*/ -static int qh_compare_facetvisit(const void *p1, const void *p2) { - facetT *a= *((facetT **)p1), *b= *((facetT **)p2); - int i,j; - - if (!(i= a->visitid)) - i= - a->id; /* do not convert to int */ - if (!(j= b->visitid)) - j= - b->id; - return (i - j); -} /* compare_facetvisit */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="countfacets">-</a> - - qh_countfacets( facetlist, facets, printall, - numfacets, numsimplicial, totneighbors, numridges, numcoplanar, numtricoplanars ) - count good facets for printing and set visitid - if allfacets, ignores qh_skipfacet() - - notes: - qh_printsummary and qh_countfacets must match counts - - returns: - numfacets, numsimplicial, total neighbors, numridges, coplanars - each facet with ->visitid indicating 1-relative position - ->visitid==0 indicates not good - - notes - numfacets >= numsimplicial - if qh.NEWfacets, - does not count visible facets (matches qh_printafacet) - - design: - for all facets on facetlist and in facets set - unless facet is skipped or visible (i.e., will be deleted) - mark facet->visitid - update counts -*/ -void qh_countfacets (facetT *facetlist, setT *facets, boolT printall, - int *numfacetsp, int *numsimplicialp, int *totneighborsp, int *numridgesp, int *numcoplanarsp, int *numtricoplanarsp) { - facetT *facet, **facetp; - int numfacets= 0, numsimplicial= 0, numridges= 0, totneighbors= 0, numcoplanars= 0, numtricoplanars= 0; - - FORALLfacet_(facetlist) { - if ((facet->visible && qh NEWfacets) - || (!printall && qh_skipfacet(facet))) - facet->visitid= 0; - else { - facet->visitid= ++numfacets; - totneighbors += qh_setsize (facet->neighbors); - if (facet->simplicial) { - numsimplicial++; - if (facet->keepcentrum && facet->tricoplanar) - numtricoplanars++; - }else - numridges += qh_setsize (facet->ridges); - if (facet->coplanarset) - numcoplanars += qh_setsize (facet->coplanarset); - } - } - FOREACHfacet_(facets) { - if ((facet->visible && qh NEWfacets) - || (!printall && qh_skipfacet(facet))) - facet->visitid= 0; - else { - facet->visitid= ++numfacets; - totneighbors += qh_setsize (facet->neighbors); - if (facet->simplicial){ - numsimplicial++; - if (facet->keepcentrum && facet->tricoplanar) - numtricoplanars++; - }else - numridges += qh_setsize (facet->ridges); - if (facet->coplanarset) - numcoplanars += qh_setsize (facet->coplanarset); - } - } - qh visit_id += numfacets+1; - *numfacetsp= numfacets; - *numsimplicialp= numsimplicial; - *totneighborsp= totneighbors; - *numridgesp= numridges; - *numcoplanarsp= numcoplanars; - *numtricoplanarsp= numtricoplanars; -} /* countfacets */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="detvnorm">-</a> - - qh_detvnorm( vertex, vertexA, centers, offset ) - compute separating plane of the Voronoi diagram for a pair of input sites - centers= set of facets (i.e., Voronoi vertices) - facet->visitid= 0 iff vertex-at-infinity (i.e., unbounded) - - assumes: - qh_ASvoronoi and qh_vertexneighbors() already set - - returns: - norm - a pointer into qh.gm_matrix to qh.hull_dim-1 reals - copy the data before reusing qh.gm_matrix - offset - if 'QVn' - sign adjusted so that qh.GOODvertexp is inside - else - sign adjusted so that vertex is inside - - qh.gm_matrix= simplex of points from centers relative to first center - - notes: - in io.c so that code for 'v Tv' can be removed by removing io.c - returns pointer into qh.gm_matrix to avoid tracking of temporary memory - - design: - determine midpoint of input sites - build points as the set of Voronoi vertices - select a simplex from points (if necessary) - include midpoint if the Voronoi region is unbounded - relocate the first vertex of the simplex to the origin - compute the normalized hyperplane through the simplex - orient the hyperplane toward 'QVn' or 'vertex' - if 'Tv' or 'Ts' - if bounded - test that hyperplane is the perpendicular bisector of the input sites - test that Voronoi vertices not in the simplex are still on the hyperplane - free up temporary memory -*/ -pointT *qh_detvnorm (vertexT *vertex, vertexT *vertexA, setT *centers, realT *offsetp) { - facetT *facet, **facetp; - int i, k, pointid, pointidA, point_i, point_n; - setT *simplex= NULL; - pointT *point, **pointp, *point0, *midpoint, *normal, *inpoint; - coordT *coord, *gmcoord, *normalp; - setT *points= qh_settemp (qh TEMPsize); - boolT nearzero= False; - boolT unbounded= False; - int numcenters= 0; - int dim= qh hull_dim - 1; - realT dist, offset, angle, zero= 0.0; - - midpoint= qh gm_matrix + qh hull_dim * qh hull_dim; /* last row */ - for (k= 0; k < dim; k++) - midpoint[k]= (vertex->point[k] + vertexA->point[k])/2; - FOREACHfacet_(centers) { - numcenters++; - if (!facet->visitid) - unbounded= True; - else { - if (!facet->center) - facet->center= qh_facetcenter (facet->vertices); - qh_setappend (&points, facet->center); - } - } - if (numcenters > dim) { - simplex= qh_settemp (qh TEMPsize); - qh_setappend (&simplex, vertex->point); - if (unbounded) - qh_setappend (&simplex, midpoint); - qh_maxsimplex (dim, points, NULL, 0, &simplex); - qh_setdelnth (simplex, 0); - }else if (numcenters == dim) { - if (unbounded) - qh_setappend (&points, midpoint); - simplex= points; - }else { - fprintf(qh ferr, "qh_detvnorm: too few points (%d) to compute separating plane\n", numcenters); - qh_errexit (qh_ERRqhull, NULL, NULL); - } - i= 0; - gmcoord= qh gm_matrix; - point0= SETfirstt_(simplex, pointT); - FOREACHpoint_(simplex) { - if (qh IStracing >= 4) - qh_printmatrix(qh ferr, "qh_detvnorm: Voronoi vertex or midpoint", - &point, 1, dim); - if (point != point0) { - qh gm_row[i++]= gmcoord; - coord= point0; - for (k= dim; k--; ) - *(gmcoord++)= *point++ - *coord++; - } - } - qh gm_row[i]= gmcoord; /* does not overlap midpoint, may be used later for qh_areasimplex */ - normal= gmcoord; - qh_sethyperplane_gauss (dim, qh gm_row, point0, True, - normal, &offset, &nearzero); - if (qh GOODvertexp == vertexA->point) - inpoint= vertexA->point; - else - inpoint= vertex->point; - zinc_(Zdistio); - dist= qh_distnorm (dim, inpoint, normal, &offset); - if (dist > 0) { - offset= -offset; - normalp= normal; - for (k= dim; k--; ) { - *normalp= -(*normalp); - normalp++; - } - } - if (qh VERIFYoutput || qh PRINTstatistics) { - pointid= qh_pointid (vertex->point); - pointidA= qh_pointid (vertexA->point); - if (!unbounded) { - zinc_(Zdiststat); - dist= qh_distnorm (dim, midpoint, normal, &offset); - if (dist < 0) - dist= -dist; - zzinc_(Zridgemid); - wwmax_(Wridgemidmax, dist); - wwadd_(Wridgemid, dist); - trace4((qh ferr, "qh_detvnorm: points %d %d midpoint dist %2.2g\n", - pointid, pointidA, dist)); - for (k= 0; k < dim; k++) - midpoint[k]= vertexA->point[k] - vertex->point[k]; /* overwrites midpoint! */ - qh_normalize (midpoint, dim, False); - angle= qh_distnorm (dim, midpoint, normal, &zero); /* qh_detangle uses dim+1 */ - if (angle < 0.0) - angle= angle + 1.0; - else - angle= angle - 1.0; - if (angle < 0.0) - angle -= angle; - trace4((qh ferr, "qh_detvnorm: points %d %d angle %2.2g nearzero %d\n", - pointid, pointidA, angle, nearzero)); - if (nearzero) { - zzinc_(Zridge0); - wwmax_(Wridge0max, angle); - wwadd_(Wridge0, angle); - }else { - zzinc_(Zridgeok) - wwmax_(Wridgeokmax, angle); - wwadd_(Wridgeok, angle); - } - } - if (simplex != points) { - FOREACHpoint_i_(points) { - if (!qh_setin (simplex, point)) { - facet= SETelemt_(centers, point_i, facetT); - zinc_(Zdiststat); - dist= qh_distnorm (dim, point, normal, &offset); - if (dist < 0) - dist= -dist; - zzinc_(Zridge); - wwmax_(Wridgemax, dist); - wwadd_(Wridge, dist); - trace4((qh ferr, "qh_detvnorm: points %d %d Voronoi vertex %d dist %2.2g\n", - pointid, pointidA, facet->visitid, dist)); - } - } - } - } - *offsetp= offset; - if (simplex != points) - qh_settempfree (&simplex); - qh_settempfree (&points); - return normal; -} /* detvnorm */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="detvridge">-</a> - - qh_detvridge( vertexA ) - determine Voronoi ridge from 'seen' neighbors of vertexA - include one vertex-at-infinite if an !neighbor->visitid - - returns: - temporary set of centers (facets, i.e., Voronoi vertices) - sorted by center id -*/ -setT *qh_detvridge (vertexT *vertex) { - setT *centers= qh_settemp (qh TEMPsize); - setT *tricenters= qh_settemp (qh TEMPsize); - facetT *neighbor, **neighborp; - boolT firstinf= True; - - FOREACHneighbor_(vertex) { - if (neighbor->seen) { - if (neighbor->visitid) { - if (!neighbor->tricoplanar || qh_setunique (&tricenters, neighbor->center)) - qh_setappend (¢ers, neighbor); - }else if (firstinf) { - firstinf= False; - qh_setappend (¢ers, neighbor); - } - } - } - qsort (SETaddr_(centers, facetT), qh_setsize (centers), - sizeof (facetT *), qh_compare_facetvisit); - qh_settempfree (&tricenters); - return centers; -} /* detvridge */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="detvridge3">-</a> - - qh_detvridge3( atvertex, vertex ) - determine 3-d Voronoi ridge from 'seen' neighbors of atvertex and vertex - include one vertex-at-infinite for !neighbor->visitid - assumes all facet->seen2= True - - returns: - temporary set of centers (facets, i.e., Voronoi vertices) - listed in adjacency order (not oriented) - all facet->seen2= True - - design: - mark all neighbors of atvertex - for each adjacent neighbor of both atvertex and vertex - if neighbor selected - add neighbor to set of Voronoi vertices -*/ -setT *qh_detvridge3 (vertexT *atvertex, vertexT *vertex) { - setT *centers= qh_settemp (qh TEMPsize); - setT *tricenters= qh_settemp (qh TEMPsize); - facetT *neighbor, **neighborp, *facet= NULL; - boolT firstinf= True; - - FOREACHneighbor_(atvertex) - neighbor->seen2= False; - FOREACHneighbor_(vertex) { - if (!neighbor->seen2) { - facet= neighbor; - break; - } - } - while (facet) { - facet->seen2= True; - if (neighbor->seen) { - if (facet->visitid) { - if (!facet->tricoplanar || qh_setunique (&tricenters, facet->center)) - qh_setappend (¢ers, facet); - }else if (firstinf) { - firstinf= False; - qh_setappend (¢ers, facet); - } - } - FOREACHneighbor_(facet) { - if (!neighbor->seen2) { - if (qh_setin (vertex->neighbors, neighbor)) - break; - else - neighbor->seen2= True; - } - } - facet= neighbor; - } - if (qh CHECKfrequently) { - FOREACHneighbor_(vertex) { - if (!neighbor->seen2) { - fprintf (stderr, "qh_detvridge3: neigbors of vertex p%d are not connected at facet %d\n", - qh_pointid (vertex->point), neighbor->id); - qh_errexit (qh_ERRqhull, neighbor, NULL); - } - } - } - FOREACHneighbor_(atvertex) - neighbor->seen2= True; - qh_settempfree (&tricenters); - return centers; -} /* detvridge3 */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="eachvoronoi">-</a> - - qh_eachvoronoi( fp, printvridge, vertex, visitall, innerouter, inorder ) - if visitall, - visit all Voronoi ridges for vertex (i.e., an input site) - else - visit all unvisited Voronoi ridges for vertex - all vertex->seen= False if unvisited - assumes - all facet->seen= False - all facet->seen2= True (for qh_detvridge3) - all facet->visitid == 0 if vertex_at_infinity - == index of Voronoi vertex - >= qh.num_facets if ignored - innerouter: - qh_RIDGEall-- both inner (bounded) and outer (unbounded) ridges - qh_RIDGEinner- only inner - qh_RIDGEouter- only outer - - if inorder - orders vertices for 3-d Voronoi diagrams - - returns: - number of visited ridges (does not include previously visited ridges) - - if printvridge, - calls printvridge( fp, vertex, vertexA, centers) - fp== any pointer (assumes FILE*) - vertex,vertexA= pair of input sites that define a Voronoi ridge - centers= set of facets (i.e., Voronoi vertices) - ->visitid == index or 0 if vertex_at_infinity - ordered for 3-d Voronoi diagram - notes: - uses qh.vertex_visit - - see: - qh_eachvoronoi_all() - - design: - mark selected neighbors of atvertex - for each selected neighbor (either Voronoi vertex or vertex-at-infinity) - for each unvisited vertex - if atvertex and vertex share more than d-1 neighbors - bump totalcount - if printvridge defined - build the set of shared neighbors (i.e., Voronoi vertices) - call printvridge -*/ -int qh_eachvoronoi (FILE *fp, printvridgeT printvridge, vertexT *atvertex, boolT visitall, qh_RIDGE innerouter, boolT inorder) { - boolT unbounded; - int count; - facetT *neighbor, **neighborp, *neighborA, **neighborAp; - setT *centers; - setT *tricenters= qh_settemp (qh TEMPsize); - - vertexT *vertex, **vertexp; - boolT firstinf; - unsigned int numfacets= (unsigned int)qh num_facets; - int totridges= 0; - - qh vertex_visit++; - atvertex->seen= True; - if (visitall) { - FORALLvertices - vertex->seen= False; - } - FOREACHneighbor_(atvertex) { - if (neighbor->visitid < numfacets) - neighbor->seen= True; - } - FOREACHneighbor_(atvertex) { - if (neighbor->seen) { - FOREACHvertex_(neighbor->vertices) { - if (vertex->visitid != qh vertex_visit && !vertex->seen) { - vertex->visitid= qh vertex_visit; - count= 0; - firstinf= True; - qh_settruncate (tricenters, 0); - FOREACHneighborA_(vertex) { - if (neighborA->seen) { - if (neighborA->visitid) { - if (!neighborA->tricoplanar || qh_setunique (&tricenters, neighborA->center)) - count++; - }else if (firstinf) { - count++; - firstinf= False; - } - } - } - if (count >= qh hull_dim - 1) { /* e.g., 3 for 3-d Voronoi */ - if (firstinf) { - if (innerouter == qh_RIDGEouter) - continue; - unbounded= False; - }else { - if (innerouter == qh_RIDGEinner) - continue; - unbounded= True; - } - totridges++; - trace4((qh ferr, "qh_eachvoronoi: Voronoi ridge of %d vertices between sites %d and %d\n", - count, qh_pointid (atvertex->point), qh_pointid (vertex->point))); - if (printvridge) { - if (inorder && qh hull_dim == 3+1) /* 3-d Voronoi diagram */ - centers= qh_detvridge3 (atvertex, vertex); - else - centers= qh_detvridge (vertex); - (*printvridge) (fp, atvertex, vertex, centers, unbounded); - qh_settempfree (¢ers); - } - } - } - } - } - } - FOREACHneighbor_(atvertex) - neighbor->seen= False; - qh_settempfree (&tricenters); - return totridges; -} /* eachvoronoi */ - - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="eachvoronoi_all">-</a> - - qh_eachvoronoi_all( fp, printvridge, isupper, innerouter, inorder ) - visit all Voronoi ridges - - innerouter: - see qh_eachvoronoi() - - if inorder - orders vertices for 3-d Voronoi diagrams - - returns - total number of ridges - - if isupper == facet->upperdelaunay (i.e., a Vornoi vertex) - facet->visitid= Voronoi vertex index (same as 'o' format) - else - facet->visitid= 0 - - if printvridge, - calls printvridge( fp, vertex, vertexA, centers) - [see qh_eachvoronoi] - - notes: - Not used for qhull.exe - same effect as qh_printvdiagram but ridges not sorted by point id -*/ -int qh_eachvoronoi_all (FILE *fp, printvridgeT printvridge, boolT isupper, qh_RIDGE innerouter, boolT inorder) { - facetT *facet; - vertexT *vertex; - int numcenters= 1; /* vertex 0 is vertex-at-infinity */ - int totridges= 0; - - qh_clearcenters (qh_ASvoronoi); - qh_vertexneighbors(); - maximize_(qh visit_id, (unsigned) qh num_facets); - FORALLfacets { - facet->visitid= 0; - facet->seen= False; - facet->seen2= True; - } - FORALLfacets { - if (facet->upperdelaunay == isupper) - facet->visitid= numcenters++; - } - FORALLvertices - vertex->seen= False; - FORALLvertices { - if (qh GOODvertex > 0 && qh_pointid(vertex->point)+1 != qh GOODvertex) - continue; - totridges += qh_eachvoronoi (fp, printvridge, vertex, - !qh_ALL, innerouter, inorder); - } - return totridges; -} /* eachvoronoi_all */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="facet2point">-</a> - - qh_facet2point( facet, point0, point1, mindist ) - return two projected temporary vertices for a 2-d facet - may be non-simplicial - - returns: - point0 and point1 oriented and projected to the facet - returns mindist (maximum distance below plane) -*/ -void qh_facet2point(facetT *facet, pointT **point0, pointT **point1, realT *mindist) { - vertexT *vertex0, *vertex1; - realT dist; - - if (facet->toporient ^ qh_ORIENTclock) { - vertex0= SETfirstt_(facet->vertices, vertexT); - vertex1= SETsecondt_(facet->vertices, vertexT); - }else { - vertex1= SETfirstt_(facet->vertices, vertexT); - vertex0= SETsecondt_(facet->vertices, vertexT); - } - zadd_(Zdistio, 2); - qh_distplane(vertex0->point, facet, &dist); - *mindist= dist; - *point0= qh_projectpoint(vertex0->point, facet, dist); - qh_distplane(vertex1->point, facet, &dist); - minimize_(*mindist, dist); - *point1= qh_projectpoint(vertex1->point, facet, dist); -} /* facet2point */ - - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="facetvertices">-</a> - - qh_facetvertices( facetlist, facets, allfacets ) - returns temporary set of vertices in a set and/or list of facets - if allfacets, ignores qh_skipfacet() - - returns: - vertices with qh.vertex_visit - - notes: - optimized for allfacets of facet_list - - design: - if allfacets of facet_list - create vertex set from vertex_list - else - for each selected facet in facets or facetlist - append unvisited vertices to vertex set -*/ -setT *qh_facetvertices (facetT *facetlist, setT *facets, boolT allfacets) { - setT *vertices; - facetT *facet, **facetp; - vertexT *vertex, **vertexp; - - qh vertex_visit++; - if (facetlist == qh facet_list && allfacets && !facets) { - vertices= qh_settemp (qh num_vertices); - FORALLvertices { - vertex->visitid= qh vertex_visit; - qh_setappend (&vertices, vertex); - } - }else { - vertices= qh_settemp (qh TEMPsize); - FORALLfacet_(facetlist) { - if (!allfacets && qh_skipfacet (facet)) - continue; - FOREACHvertex_(facet->vertices) { - if (vertex->visitid != qh vertex_visit) { - vertex->visitid= qh vertex_visit; - qh_setappend (&vertices, vertex); - } - } - } - } - FOREACHfacet_(facets) { - if (!allfacets && qh_skipfacet (facet)) - continue; - FOREACHvertex_(facet->vertices) { - if (vertex->visitid != qh vertex_visit) { - vertex->visitid= qh vertex_visit; - qh_setappend (&vertices, vertex); - } - } - } - return vertices; -} /* facetvertices */ - -/*-<a href="qh-geom.htm#TOC" - >-------------------------------</a><a name="geomplanes">-</a> - - qh_geomplanes( facet, outerplane, innerplane ) - return outer and inner planes for Geomview - qh.PRINTradius is size of vertices and points (includes qh.JOGGLEmax) - - notes: - assume precise calculations in io.c with roundoff covered by qh_GEOMepsilon -*/ -void qh_geomplanes (facetT *facet, realT *outerplane, realT *innerplane) { - realT radius; - - if (qh MERGING || qh JOGGLEmax < REALmax/2) { - qh_outerinner (facet, outerplane, innerplane); - radius= qh PRINTradius; - if (qh JOGGLEmax < REALmax/2) - radius -= qh JOGGLEmax * sqrt (qh hull_dim); /* already accounted for in qh_outerinner() */ - *outerplane += radius; - *innerplane -= radius; - if (qh PRINTcoplanar || qh PRINTspheres) { - *outerplane += qh MAXabs_coord * qh_GEOMepsilon; - *innerplane -= qh MAXabs_coord * qh_GEOMepsilon; - } - }else - *innerplane= *outerplane= 0; -} /* geomplanes */ - - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="markkeep">-</a> - - qh_markkeep( facetlist ) - mark good facets that meet qh.KEEParea, qh.KEEPmerge, and qh.KEEPminArea - ignores visible facets (not part of convex hull) - - returns: - may clear facet->good - recomputes qh.num_good - - design: - get set of good facets - if qh.KEEParea - sort facets by area - clear facet->good for all but n largest facets - if qh.KEEPmerge - sort facets by merge count - clear facet->good for all but n most merged facets - if qh.KEEPminarea - clear facet->good if area too small - update qh.num_good -*/ -void qh_markkeep (facetT *facetlist) { - facetT *facet, **facetp; - setT *facets= qh_settemp (qh num_facets); - int size, count; - - trace2((qh ferr, "qh_markkeep: only keep %d largest and/or %d most merged facets and/or min area %.2g\n", - qh KEEParea, qh KEEPmerge, qh KEEPminArea)); - FORALLfacet_(facetlist) { - if (!facet->visible && facet->good) - qh_setappend (&facets, facet); - } - size= qh_setsize (facets); - if (qh KEEParea) { - qsort (SETaddr_(facets, facetT), size, - sizeof (facetT *), qh_compare_facetarea); - if ((count= size - qh KEEParea) > 0) { - FOREACHfacet_(facets) { - facet->good= False; - if (--count == 0) - break; - } - } - } - if (qh KEEPmerge) { - qsort (SETaddr_(facets, facetT), size, - sizeof (facetT *), qh_compare_facetmerge); - if ((count= size - qh KEEPmerge) > 0) { - FOREACHfacet_(facets) { - facet->good= False; - if (--count == 0) - break; - } - } - } - if (qh KEEPminArea < REALmax/2) { - FOREACHfacet_(facets) { - if (!facet->isarea || facet->f.area < qh KEEPminArea) - facet->good= False; - } - } - qh_settempfree (&facets); - count= 0; - FORALLfacet_(facetlist) { - if (facet->good) - count++; - } - qh num_good= count; -} /* markkeep */ - - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="markvoronoi">-</a> - - qh_markvoronoi( facetlist, facets, printall, islower, numcenters ) - mark voronoi vertices for printing by site pairs - - returns: - temporary set of vertices indexed by pointid - islower set if printing lower hull (i.e., at least one facet is lower hull) - numcenters= total number of Voronoi vertices - bumps qh.printoutnum for vertex-at-infinity - clears all facet->seen and sets facet->seen2 - - if selected - facet->visitid= Voronoi vertex id - else if upper hull (or 'Qu' and lower hull) - facet->visitid= 0 - else - facet->visitid >= qh num_facets - - notes: - ignores qh.ATinfinity, if defined -*/ -setT *qh_markvoronoi (facetT *facetlist, setT *facets, boolT printall, boolT *islowerp, int *numcentersp) { - int numcenters=0; - facetT *facet, **facetp; - setT *vertices; - boolT islower= False; - - qh printoutnum++; - qh_clearcenters (qh_ASvoronoi); /* in case, qh_printvdiagram2 called by user */ - qh_vertexneighbors(); - vertices= qh_pointvertex(); - if (qh ATinfinity) - SETelem_(vertices, qh num_points-1)= NULL; - qh visit_id++; - maximize_(qh visit_id, (unsigned) qh num_facets); - FORALLfacet_(facetlist) { - if (printall || !qh_skipfacet (facet)) { - if (!facet->upperdelaunay) { - islower= True; - break; - } - } - } - FOREACHfacet_(facets) { - if (printall || !qh_skipfacet (facet)) { - if (!facet->upperdelaunay) { - islower= True; - break; - } - } - } - FORALLfacets { - if (facet->normal && (facet->upperdelaunay == islower)) - facet->visitid= 0; /* facetlist or facets may overwrite */ - else - facet->visitid= qh visit_id; - facet->seen= False; - facet->seen2= True; - } - numcenters++; /* qh_INFINITE */ - FORALLfacet_(facetlist) { - if (printall || !qh_skipfacet (facet)) - facet->visitid= numcenters++; - } - FOREACHfacet_(facets) { - if (printall || !qh_skipfacet (facet)) - facet->visitid= numcenters++; - } - *islowerp= islower; - *numcentersp= numcenters; - trace2((qh ferr, "qh_markvoronoi: islower %d numcenters %d\n", islower, numcenters)); - return vertices; -} /* markvoronoi */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="order_vertexneighbors">-</a> - - qh_order_vertexneighbors( vertex ) - order facet neighbors of a 2-d or 3-d vertex by adjacency - - notes: - does not orient the neighbors - - design: - initialize a new neighbor set with the first facet in vertex->neighbors - while vertex->neighbors non-empty - select next neighbor in the previous facet's neighbor set - set vertex->neighbors to the new neighbor set -*/ -void qh_order_vertexneighbors(vertexT *vertex) { - setT *newset; - facetT *facet, *neighbor, **neighborp; - - trace4((qh ferr, "qh_order_vertexneighbors: order neighbors of v%d for 3-d\n", vertex->id)); - newset= qh_settemp (qh_setsize (vertex->neighbors)); - facet= (facetT*)qh_setdellast (vertex->neighbors); - qh_setappend (&newset, facet); - while (qh_setsize (vertex->neighbors)) { - FOREACHneighbor_(vertex) { - if (qh_setin (facet->neighbors, neighbor)) { - qh_setdel(vertex->neighbors, neighbor); - qh_setappend (&newset, neighbor); - facet= neighbor; - break; - } - } - if (!neighbor) { - fprintf (qh ferr, "qhull internal error (qh_order_vertexneighbors): no neighbor of v%d for f%d\n", - vertex->id, facet->id); - qh_errexit (qh_ERRqhull, facet, NULL); - } - } - qh_setfree (&vertex->neighbors); - qh_settemppop (); - vertex->neighbors= newset; -} /* order_vertexneighbors */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printafacet">-</a> - - qh_printafacet( fp, format, facet, printall ) - print facet to fp in given output format (see qh.PRINTout) - - returns: - nop if !printall and qh_skipfacet() - nop if visible facet and NEWfacets and format != PRINTfacets - must match qh_countfacets - - notes - preserves qh.visit_id - facet->normal may be null if PREmerge/MERGEexact and STOPcone before merge - - see - qh_printbegin() and qh_printend() - - design: - test for printing facet - call appropriate routine for format - or output results directly -*/ -void qh_printafacet(FILE *fp, int format, facetT *facet, boolT printall) { - realT color[4], offset, dist, outerplane, innerplane; - boolT zerodiv; - coordT *point, *normp, *coordp, **pointp, *feasiblep; - int k; - vertexT *vertex, **vertexp; - facetT *neighbor, **neighborp; - - if (!printall && qh_skipfacet (facet)) - return; - if (facet->visible && qh NEWfacets && format != qh_PRINTfacets) - return; - qh printoutnum++; - switch (format) { - case qh_PRINTarea: - if (facet->isarea) { - fprintf (fp, qh_REAL_1, facet->f.area); - fprintf (fp, "\n"); - }else - fprintf (fp, "0\n"); - break; - case qh_PRINTcoplanars: - fprintf (fp, "%d", qh_setsize (facet->coplanarset)); - FOREACHpoint_(facet->coplanarset) - fprintf (fp, " %d", qh_pointid (point)); - fprintf (fp, "\n"); - break; - case qh_PRINTcentrums: - qh_printcenter (fp, format, NULL, facet); - break; - case qh_PRINTfacets: - qh_printfacet (fp, facet); - break; - case qh_PRINTfacets_xridge: - qh_printfacetheader (fp, facet); - break; - case qh_PRINTgeom: /* either 2 , 3, or 4-d by qh_printbegin */ - if (!facet->normal) - break; - for (k= qh hull_dim; k--; ) { - color[k]= (facet->normal[k]+1.0)/2.0; - maximize_(color[k], -1.0); - minimize_(color[k], +1.0); - } - qh_projectdim3 (color, color); - if (qh PRINTdim != qh hull_dim) - qh_normalize2 (color, 3, True, NULL, NULL); - if (qh hull_dim <= 2) - qh_printfacet2geom (fp, facet, color); - else if (qh hull_dim == 3) { - if (facet->simplicial) - qh_printfacet3geom_simplicial (fp, facet, color); - else - qh_printfacet3geom_nonsimplicial (fp, facet, color); - }else { - if (facet->simplicial) - qh_printfacet4geom_simplicial (fp, facet, color); - else - qh_printfacet4geom_nonsimplicial (fp, facet, color); - } - break; - case qh_PRINTids: - fprintf (fp, "%d\n", facet->id); - break; - case qh_PRINTincidences: - case qh_PRINToff: - case qh_PRINTtriangles: - if (qh hull_dim == 3 && format != qh_PRINTtriangles) - qh_printfacet3vertex (fp, facet, format); - else if (facet->simplicial || qh hull_dim == 2 || format == qh_PRINToff) - qh_printfacetNvertex_simplicial (fp, facet, format); - else - qh_printfacetNvertex_nonsimplicial (fp, facet, qh printoutvar++, format); - break; - case qh_PRINTinner: - qh_outerinner (facet, NULL, &innerplane); - offset= facet->offset - innerplane; - goto LABELprintnorm; - break; /* prevent warning */ - case qh_PRINTmerges: - fprintf (fp, "%d\n", facet->nummerge); - break; - case qh_PRINTnormals: - offset= facet->offset; - goto LABELprintnorm; - break; /* prevent warning */ - case qh_PRINTouter: - qh_outerinner (facet, &outerplane, NULL); - offset= facet->offset - outerplane; - LABELprintnorm: - if (!facet->normal) { - fprintf (fp, "no normal for facet f%d\n", facet->id); - break; - } - if (qh CDDoutput) { - fprintf (fp, qh_REAL_1, -offset); - for (k=0; k < qh hull_dim; k++) - fprintf (fp, qh_REAL_1, -facet->normal[k]); - }else { - for (k=0; k < qh hull_dim; k++) - fprintf (fp, qh_REAL_1, facet->normal[k]); - fprintf (fp, qh_REAL_1, offset); - } - fprintf (fp, "\n"); - break; - case qh_PRINTmathematica: /* either 2 or 3-d by qh_printbegin */ - if (qh hull_dim == 2) - qh_printfacet2math (fp, facet, qh printoutvar++); - else - qh_printfacet3math (fp, facet, qh printoutvar++); - break; - case qh_PRINTneighbors: - fprintf (fp, "%d", qh_setsize (facet->neighbors)); - FOREACHneighbor_(facet) - fprintf (fp, " %d", - neighbor->visitid ? neighbor->visitid - 1: - neighbor->id); - fprintf (fp, "\n"); - break; - case qh_PRINTpointintersect: - if (!qh feasible_point) { - fprintf (fp, "qhull input error (qh_printafacet): option 'Fp' needs qh feasible_point\n"); - qh_errexit( qh_ERRinput, NULL, NULL); - } - if (facet->offset > 0) - goto LABELprintinfinite; - point= coordp= (coordT*)qh_memalloc (qh normal_size); - normp= facet->normal; - feasiblep= qh feasible_point; - if (facet->offset < -qh MINdenom) { - for (k= qh hull_dim; k--; ) - *(coordp++)= (*(normp++) / - facet->offset) + *(feasiblep++); - }else { - for (k= qh hull_dim; k--; ) { - *(coordp++)= qh_divzero (*(normp++), facet->offset, qh MINdenom_1, - &zerodiv) + *(feasiblep++); - if (zerodiv) { - qh_memfree (point, qh normal_size); - goto LABELprintinfinite; - } - } - } - qh_printpoint (fp, NULL, point); - qh_memfree (point, qh normal_size); - break; - LABELprintinfinite: - for (k= qh hull_dim; k--; ) - fprintf (fp, qh_REAL_1, qh_INFINITE); - fprintf (fp, "\n"); - break; - case qh_PRINTpointnearest: - FOREACHpoint_(facet->coplanarset) { - int id, id2; - vertex= qh_nearvertex (facet, point, &dist); - id= qh_pointid (vertex->point); - id2= qh_pointid (point); - fprintf (fp, "%d %d %d " qh_REAL_1 "\n", id, id2, facet->id, dist); - } - break; - case qh_PRINTpoints: /* VORONOI only by qh_printbegin */ - if (qh CDDoutput) - fprintf (fp, "1 "); - qh_printcenter (fp, format, NULL, facet); - break; - case qh_PRINTvertices: - fprintf (fp, "%d", qh_setsize (facet->vertices)); - FOREACHvertex_(facet->vertices) - fprintf (fp, " %d", qh_pointid (vertex->point)); - fprintf (fp, "\n"); - break; - } -} /* printafacet */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printbegin">-</a> - - qh_printbegin( ) - prints header for all output formats - - returns: - checks for valid format - - notes: - uses qh.visit_id for 3/4off - changes qh.interior_point if printing centrums - qh_countfacets clears facet->visitid for non-good facets - - see - qh_printend() and qh_printafacet() - - design: - count facets and related statistics - print header for format -*/ -void qh_printbegin (FILE *fp, int format, facetT *facetlist, setT *facets, boolT printall) { - int numfacets, numsimplicial, numridges, totneighbors, numcoplanars, numtricoplanars; - int i, num; - facetT *facet, **facetp; - vertexT *vertex, **vertexp; - setT *vertices; - pointT *point, **pointp, *pointtemp; - - qh printoutnum= 0; - qh_countfacets (facetlist, facets, printall, &numfacets, &numsimplicial, - &totneighbors, &numridges, &numcoplanars, &numtricoplanars); - switch (format) { - case qh_PRINTnone: - break; - case qh_PRINTarea: - fprintf (fp, "%d\n", numfacets); - break; - case qh_PRINTcoplanars: - fprintf (fp, "%d\n", numfacets); - break; - case qh_PRINTcentrums: - if (qh CENTERtype == qh_ASnone) - qh_clearcenters (qh_AScentrum); - fprintf (fp, "%d\n%d\n", qh hull_dim, numfacets); - break; - case qh_PRINTfacets: - case qh_PRINTfacets_xridge: - if (facetlist) - qh_printvertexlist (fp, "Vertices and facets:\n", facetlist, facets, printall); - break; - case qh_PRINTgeom: - if (qh hull_dim > 4) /* qh_initqhull_globals also checks */ - goto LABELnoformat; - if (qh VORONOI && qh hull_dim > 3) /* PRINTdim == DROPdim == hull_dim-1 */ - goto LABELnoformat; - if (qh hull_dim == 2 && (qh PRINTridges || qh DOintersections)) - fprintf (qh ferr, "qhull warning: output for ridges and intersections not implemented in 2-d\n"); - if (qh hull_dim == 4 && (qh PRINTinner || qh PRINTouter || - (qh PRINTdim == 4 && qh PRINTcentrums))) - fprintf (qh ferr, "qhull warning: output for outer/inner planes and centrums not implemented in 4-d\n"); - if (qh PRINTdim == 4 && (qh PRINTspheres)) - fprintf (qh ferr, "qhull warning: output for vertices not implemented in 4-d\n"); - if (qh PRINTdim == 4 && qh DOintersections && qh PRINTnoplanes) - fprintf (qh ferr, "qhull warning: 'Gnh' generates no output in 4-d\n"); - if (qh PRINTdim == 2) { - fprintf(fp, "{appearance {linewidth 3} LIST # %s | %s\n", - qh rbox_command, qh qhull_command); - }else if (qh PRINTdim == 3) { - fprintf(fp, "{appearance {+edge -evert linewidth 2} LIST # %s | %s\n", - qh rbox_command, qh qhull_command); - }else if (qh PRINTdim == 4) { - qh visit_id++; - num= 0; - FORALLfacet_(facetlist) /* get number of ridges to be printed */ - qh_printend4geom (NULL, facet, &num, printall); - FOREACHfacet_(facets) - qh_printend4geom (NULL, facet, &num, printall); - qh ridgeoutnum= num; - qh printoutvar= 0; /* counts number of ridges in output */ - fprintf (fp, "LIST # %s | %s\n", qh rbox_command, qh qhull_command); - } - if (qh PRINTdots) { - qh printoutnum++; - num= qh num_points + qh_setsize (qh other_points); - if (qh DELAUNAY && qh ATinfinity) - num--; - if (qh PRINTdim == 4) - fprintf (fp, "4VECT %d %d 1\n", num, num); - else - fprintf (fp, "VECT %d %d 1\n", num, num); - for (i= num; i--; ) { - if (i % 20 == 0) - fprintf (fp, "\n"); - fprintf (fp, "1 "); - } - fprintf (fp, "# 1 point per line\n1 "); - for (i= num-1; i--; ) { - if (i % 20 == 0) - fprintf (fp, "\n"); - fprintf (fp, "0 "); - } - fprintf (fp, "# 1 color for all\n"); - FORALLpoints { - if (!qh DELAUNAY || !qh ATinfinity || qh_pointid(point) != qh num_points-1) { - if (qh PRINTdim == 4) - qh_printpoint (fp, NULL, point); - else - qh_printpoint3 (fp, point); - } - } - FOREACHpoint_(qh other_points) { - if (qh PRINTdim == 4) - qh_printpoint (fp, NULL, point); - else - qh_printpoint3 (fp, point); - } - fprintf (fp, "0 1 1 1 # color of points\n"); - } - if (qh PRINTdim == 4 && !qh PRINTnoplanes) - /* 4dview loads up multiple 4OFF objects slowly */ - fprintf(fp, "4OFF %d %d 1\n", 3*qh ridgeoutnum, qh ridgeoutnum); - qh PRINTcradius= 2 * qh DISTround; /* include test DISTround */ - if (qh PREmerge) { - maximize_(qh PRINTcradius, qh premerge_centrum + qh DISTround); - }else if (qh POSTmerge) - maximize_(qh PRINTcradius, qh postmerge_centrum + qh DISTround); - qh PRINTradius= qh PRINTcradius; - if (qh PRINTspheres + qh PRINTcoplanar) - maximize_(qh PRINTradius, qh MAXabs_coord * qh_MINradius); - if (qh premerge_cos < REALmax/2) { - maximize_(qh PRINTradius, (1- qh premerge_cos) * qh MAXabs_coord); - }else if (!qh PREmerge && qh POSTmerge && qh postmerge_cos < REALmax/2) { - maximize_(qh PRINTradius, (1- qh postmerge_cos) * qh MAXabs_coord); - } - maximize_(qh PRINTradius, qh MINvisible); - if (qh JOGGLEmax < REALmax/2) - qh PRINTradius += qh JOGGLEmax * sqrt (qh hull_dim); - if (qh PRINTdim != 4 && - (qh PRINTcoplanar || qh PRINTspheres || qh PRINTcentrums)) { - vertices= qh_facetvertices (facetlist, facets, printall); - if (qh PRINTspheres && qh PRINTdim <= 3) - qh_printspheres (fp, vertices, qh PRINTradius); - if (qh PRINTcoplanar || qh PRINTcentrums) { - qh firstcentrum= True; - if (qh PRINTcoplanar&& !qh PRINTspheres) { - FOREACHvertex_(vertices) - qh_printpointvect2 (fp, vertex->point, NULL, - qh interior_point, qh PRINTradius); - } - FORALLfacet_(facetlist) { - if (!printall && qh_skipfacet(facet)) - continue; - if (!facet->normal) - continue; - if (qh PRINTcentrums && qh PRINTdim <= 3) - qh_printcentrum (fp, facet, qh PRINTcradius); - if (!qh PRINTcoplanar) - continue; - FOREACHpoint_(facet->coplanarset) - qh_printpointvect2 (fp, point, facet->normal, NULL, qh PRINTradius); - FOREACHpoint_(facet->outsideset) - qh_printpointvect2 (fp, point, facet->normal, NULL, qh PRINTradius); - } - FOREACHfacet_(facets) { - if (!printall && qh_skipfacet(facet)) - continue; - if (!facet->normal) - continue; - if (qh PRINTcentrums && qh PRINTdim <= 3) - qh_printcentrum (fp, facet, qh PRINTcradius); - if (!qh PRINTcoplanar) - continue; - FOREACHpoint_(facet->coplanarset) - qh_printpointvect2 (fp, point, facet->normal, NULL, qh PRINTradius); - FOREACHpoint_(facet->outsideset) - qh_printpointvect2 (fp, point, facet->normal, NULL, qh PRINTradius); - } - } - qh_settempfree (&vertices); - } - qh visit_id++; /* for printing hyperplane intersections */ - break; - case qh_PRINTids: - fprintf (fp, "%d\n", numfacets); - break; - case qh_PRINTincidences: - if (qh VORONOI && qh PRINTprecision) - fprintf (qh ferr, "qhull warning: writing Delaunay. Use 'p' or 'o' for Voronoi centers\n"); - qh printoutvar= qh vertex_id; /* centrum id for non-simplicial facets */ - if (qh hull_dim <= 3) - fprintf(fp, "%d\n", numfacets); - else - fprintf(fp, "%d\n", numsimplicial+numridges); - break; - case qh_PRINTinner: - case qh_PRINTnormals: - case qh_PRINTouter: - if (qh CDDoutput) - fprintf (fp, "%s | %s\nbegin\n %d %d real\n", qh rbox_command, - qh qhull_command, numfacets, qh hull_dim+1); - else - fprintf (fp, "%d\n%d\n", qh hull_dim+1, numfacets); - break; - case qh_PRINTmathematica: - if (qh hull_dim > 3) /* qh_initbuffers also checks */ - goto LABELnoformat; - if (qh VORONOI) - fprintf (qh ferr, "qhull warning: output is the Delaunay triangulation\n"); - fprintf(fp, "{\n"); - qh printoutvar= 0; /* counts number of facets for notfirst */ - break; - case qh_PRINTmerges: - fprintf (fp, "%d\n", numfacets); - break; - case qh_PRINTpointintersect: - fprintf (fp, "%d\n%d\n", qh hull_dim, numfacets); - break; - case qh_PRINTneighbors: - fprintf (fp, "%d\n", numfacets); - break; - case qh_PRINToff: - case qh_PRINTtriangles: - if (qh VORONOI) - goto LABELnoformat; - num = qh hull_dim; - if (format == qh_PRINToff || qh hull_dim == 2) - fprintf (fp, "%d\n%d %d %d\n", num, - qh num_points+qh_setsize (qh other_points), numfacets, totneighbors/2); - else { /* qh_PRINTtriangles */ - qh printoutvar= qh num_points+qh_setsize (qh other_points); /* first centrum */ - if (qh DELAUNAY) - num--; /* drop last dimension */ - fprintf (fp, "%d\n%d %d %d\n", num, qh printoutvar - + numfacets - numsimplicial, numsimplicial + numridges, totneighbors/2); - } - FORALLpoints - qh_printpointid (qh fout, NULL, num, point, -1); - FOREACHpoint_(qh other_points) - qh_printpointid (qh fout, NULL, num, point, -1); - if (format == qh_PRINTtriangles && qh hull_dim > 2) { - FORALLfacets { - if (!facet->simplicial && facet->visitid) - qh_printcenter (qh fout, format, NULL, facet); - } - } - break; - case qh_PRINTpointnearest: - fprintf (fp, "%d\n", numcoplanars); - break; - case qh_PRINTpoints: - if (!qh VORONOI) - goto LABELnoformat; - if (qh CDDoutput) - fprintf (fp, "%s | %s\nbegin\n%d %d real\n", qh rbox_command, - qh qhull_command, numfacets, qh hull_dim); - else - fprintf (fp, "%d\n%d\n", qh hull_dim-1, numfacets); - break; - case qh_PRINTvertices: - fprintf (fp, "%d\n", numfacets); - break; - case qh_PRINTsummary: - default: - LABELnoformat: - fprintf (qh ferr, "qhull internal error (qh_printbegin): can not use this format for dimension %d\n", - qh hull_dim); - qh_errexit (qh_ERRqhull, NULL, NULL); - } -} /* printbegin */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printcenter">-</a> - - qh_printcenter( fp, string, facet ) - print facet->center as centrum or Voronoi center - string may be NULL. Don't include '%' codes. - nop if qh CENTERtype neither CENTERvoronoi nor CENTERcentrum - if upper envelope of Delaunay triangulation and point at-infinity - prints qh_INFINITE instead; - - notes: - defines facet->center if needed - if format=PRINTgeom, adds a 0 if would otherwise be 2-d -*/ -void qh_printcenter (FILE *fp, int format, char *string, facetT *facet) { - int k, num; - - if (qh CENTERtype != qh_ASvoronoi && qh CENTERtype != qh_AScentrum) - return; - if (string) - fprintf (fp, string, facet->id); - if (qh CENTERtype == qh_ASvoronoi) { - num= qh hull_dim-1; - if (!facet->normal || !facet->upperdelaunay || !qh ATinfinity) { - if (!facet->center) - facet->center= qh_facetcenter (facet->vertices); - for (k=0; k < num; k++) - fprintf (fp, qh_REAL_1, facet->center[k]); - }else { - for (k=0; k < num; k++) - fprintf (fp, qh_REAL_1, qh_INFINITE); - } - }else /* qh CENTERtype == qh_AScentrum */ { - num= qh hull_dim; - if (format == qh_PRINTtriangles && qh DELAUNAY) - num--; - if (!facet->center) - facet->center= qh_getcentrum (facet); - for (k=0; k < num; k++) - fprintf (fp, qh_REAL_1, facet->center[k]); - } - if (format == qh_PRINTgeom && num == 2) - fprintf (fp, " 0\n"); - else - fprintf (fp, "\n"); -} /* printcenter */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printcentrum">-</a> - - qh_printcentrum( fp, facet, radius ) - print centrum for a facet in OOGL format - radius defines size of centrum - 2-d or 3-d only - - returns: - defines facet->center if needed -*/ -void qh_printcentrum (FILE *fp, facetT *facet, realT radius) { - pointT *centrum, *projpt; - boolT tempcentrum= False; - realT xaxis[4], yaxis[4], normal[4], dist; - realT green[3]={0, 1, 0}; - vertexT *apex; - int k; - - if (qh CENTERtype == qh_AScentrum) { - if (!facet->center) - facet->center= qh_getcentrum (facet); - centrum= facet->center; - }else { - centrum= qh_getcentrum (facet); - tempcentrum= True; - } - fprintf (fp, "{appearance {-normal -edge normscale 0} "); - if (qh firstcentrum) { - qh firstcentrum= False; - fprintf (fp, "{INST geom { define centrum CQUAD # f%d\n\ --0.3 -0.3 0.0001 0 0 1 1\n\ - 0.3 -0.3 0.0001 0 0 1 1\n\ - 0.3 0.3 0.0001 0 0 1 1\n\ --0.3 0.3 0.0001 0 0 1 1 } transform { \n", facet->id); - }else - fprintf (fp, "{INST geom { : centrum } transform { # f%d\n", facet->id); - apex= SETfirstt_(facet->vertices, vertexT); - qh_distplane(apex->point, facet, &dist); - projpt= qh_projectpoint(apex->point, facet, dist); - for (k= qh hull_dim; k--; ) { - xaxis[k]= projpt[k] - centrum[k]; - normal[k]= facet->normal[k]; - } - if (qh hull_dim == 2) { - xaxis[2]= 0; - normal[2]= 0; - }else if (qh hull_dim == 4) { - qh_projectdim3 (xaxis, xaxis); - qh_projectdim3 (normal, normal); - qh_normalize2 (normal, qh PRINTdim, True, NULL, NULL); - } - qh_crossproduct (3, xaxis, normal, yaxis); - fprintf (fp, "%8.4g %8.4g %8.4g 0\n", xaxis[0], xaxis[1], xaxis[2]); - fprintf (fp, "%8.4g %8.4g %8.4g 0\n", yaxis[0], yaxis[1], yaxis[2]); - fprintf (fp, "%8.4g %8.4g %8.4g 0\n", normal[0], normal[1], normal[2]); - qh_printpoint3 (fp, centrum); - fprintf (fp, "1 }}}\n"); - qh_memfree (projpt, qh normal_size); - qh_printpointvect (fp, centrum, facet->normal, NULL, radius, green); - if (tempcentrum) - qh_memfree (centrum, qh normal_size); -} /* printcentrum */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printend">-</a> - - qh_printend( fp, format ) - prints trailer for all output formats - - see: - qh_printbegin() and qh_printafacet() - -*/ -void qh_printend (FILE *fp, int format, facetT *facetlist, setT *facets, boolT printall) { - int num; - facetT *facet, **facetp; - - if (!qh printoutnum) - fprintf (qh ferr, "qhull warning: no facets printed\n"); - switch (format) { - case qh_PRINTgeom: - if (qh hull_dim == 4 && qh DROPdim < 0 && !qh PRINTnoplanes) { - qh visit_id++; - num= 0; - FORALLfacet_(facetlist) - qh_printend4geom (fp, facet,&num, printall); - FOREACHfacet_(facets) - qh_printend4geom (fp, facet, &num, printall); - if (num != qh ridgeoutnum || qh printoutvar != qh ridgeoutnum) { - fprintf (qh ferr, "qhull internal error (qh_printend): number of ridges %d != number printed %d and at end %d\n", qh ridgeoutnum, qh printoutvar, num); - qh_errexit (qh_ERRqhull, NULL, NULL); - } - }else - fprintf(fp, "}\n"); - break; - case qh_PRINTinner: - case qh_PRINTnormals: - case qh_PRINTouter: - if (qh CDDoutput) - fprintf (fp, "end\n"); - break; - case qh_PRINTmathematica: - fprintf(fp, "}\n"); - break; - case qh_PRINTpoints: - if (qh CDDoutput) - fprintf (fp, "end\n"); - break; - } -} /* printend */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printend4geom">-</a> - - qh_printend4geom( fp, facet, numridges, printall ) - helper function for qh_printbegin/printend - - returns: - number of printed ridges - - notes: - just counts printed ridges if fp=NULL - uses facet->visitid - must agree with qh_printfacet4geom... - - design: - computes color for facet from its normal - prints each ridge of facet -*/ -void qh_printend4geom (FILE *fp, facetT *facet, int *nump, boolT printall) { - realT color[3]; - int i, num= *nump; - facetT *neighbor, **neighborp; - ridgeT *ridge, **ridgep; - - if (!printall && qh_skipfacet(facet)) - return; - if (qh PRINTnoplanes || (facet->visible && qh NEWfacets)) - return; - if (!facet->normal) - return; - if (fp) { - for (i=0; i < 3; i++) { - color[i]= (facet->normal[i]+1.0)/2.0; - maximize_(color[i], -1.0); - minimize_(color[i], +1.0); - } - } - facet->visitid= qh visit_id; - if (facet->simplicial) { - FOREACHneighbor_(facet) { - if (neighbor->visitid != qh visit_id) { - if (fp) - fprintf (fp, "3 %d %d %d %8.4g %8.4g %8.4g 1 # f%d f%d\n", - 3*num, 3*num+1, 3*num+2, color[0], color[1], color[2], - facet->id, neighbor->id); - num++; - } - } - }else { - FOREACHridge_(facet->ridges) { - neighbor= otherfacet_(ridge, facet); - if (neighbor->visitid != qh visit_id) { - if (fp) - fprintf (fp, "3 %d %d %d %8.4g %8.4g %8.4g 1 #r%d f%d f%d\n", - 3*num, 3*num+1, 3*num+2, color[0], color[1], color[2], - ridge->id, facet->id, neighbor->id); - num++; - } - } - } - *nump= num; -} /* printend4geom */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printextremes">-</a> - - qh_printextremes( fp, facetlist, facets, printall ) - print extreme points for convex hulls or halfspace intersections - - notes: - #points, followed by ids, one per line - - sorted by id - same order as qh_printpoints_out if no coplanar/interior points -*/ -void qh_printextremes (FILE *fp, facetT *facetlist, setT *facets, int printall) { - setT *vertices, *points; - pointT *point; - vertexT *vertex, **vertexp; - int id; - int numpoints=0, point_i, point_n; - int allpoints= qh num_points + qh_setsize (qh other_points); - - points= qh_settemp (allpoints); - qh_setzero (points, 0, allpoints); - vertices= qh_facetvertices (facetlist, facets, printall); - FOREACHvertex_(vertices) { - id= qh_pointid (vertex->point); - if (id >= 0) { - SETelem_(points, id)= vertex->point; - numpoints++; - } - } - qh_settempfree (&vertices); - fprintf (fp, "%d\n", numpoints); - FOREACHpoint_i_(points) { - if (point) - fprintf (fp, "%d\n", point_i); - } - qh_settempfree (&points); -} /* printextremes */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printextremes_2d">-</a> - - qh_printextremes_2d( fp, facetlist, facets, printall ) - prints point ids for facets in qh_ORIENTclock order - - notes: - #points, followed by ids, one per line - if facetlist/facets are disjoint than the output includes skips - errors if facets form a loop - does not print coplanar points -*/ -void qh_printextremes_2d (FILE *fp, facetT *facetlist, setT *facets, int printall) { - int numfacets, numridges, totneighbors, numcoplanars, numsimplicial, numtricoplanars; - setT *vertices; - facetT *facet, *startfacet, *nextfacet; - vertexT *vertexA, *vertexB; - - qh_countfacets (facetlist, facets, printall, &numfacets, &numsimplicial, - &totneighbors, &numridges, &numcoplanars, &numtricoplanars); /* marks qh visit_id */ - vertices= qh_facetvertices (facetlist, facets, printall); - fprintf(fp, "%d\n", qh_setsize (vertices)); - qh_settempfree (&vertices); - if (!numfacets) - return; - facet= startfacet= facetlist ? facetlist : SETfirstt_(facets, facetT); - qh vertex_visit++; - qh visit_id++; - do { - if (facet->toporient ^ qh_ORIENTclock) { - vertexA= SETfirstt_(facet->vertices, vertexT); - vertexB= SETsecondt_(facet->vertices, vertexT); - nextfacet= SETfirstt_(facet->neighbors, facetT); - }else { - vertexA= SETsecondt_(facet->vertices, vertexT); - vertexB= SETfirstt_(facet->vertices, vertexT); - nextfacet= SETsecondt_(facet->neighbors, facetT); - } - if (facet->visitid == qh visit_id) { - fprintf(qh ferr, "qh_printextremes_2d: loop in facet list. facet %d nextfacet %d\n", - facet->id, nextfacet->id); - qh_errexit2 (qh_ERRqhull, facet, nextfacet); - } - if (facet->visitid) { - if (vertexA->visitid != qh vertex_visit) { - vertexA->visitid= qh vertex_visit; - fprintf(fp, "%d\n", qh_pointid (vertexA->point)); - } - if (vertexB->visitid != qh vertex_visit) { - vertexB->visitid= qh vertex_visit; - fprintf(fp, "%d\n", qh_pointid (vertexB->point)); - } - } - facet->visitid= qh visit_id; - facet= nextfacet; - }while (facet && facet != startfacet); -} /* printextremes_2d */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printextremes_d">-</a> - - qh_printextremes_d( fp, facetlist, facets, printall ) - print extreme points of input sites for Delaunay triangulations - - notes: - #points, followed by ids, one per line - - unordered -*/ -void qh_printextremes_d (FILE *fp, facetT *facetlist, setT *facets, int printall) { - setT *vertices; - vertexT *vertex, **vertexp; - boolT upperseen, lowerseen; - facetT *neighbor, **neighborp; - int numpoints=0; - - vertices= qh_facetvertices (facetlist, facets, printall); - qh_vertexneighbors(); - FOREACHvertex_(vertices) { - upperseen= lowerseen= False; - FOREACHneighbor_(vertex) { - if (neighbor->upperdelaunay) - upperseen= True; - else - lowerseen= True; - } - if (upperseen && lowerseen) { - vertex->seen= True; - numpoints++; - }else - vertex->seen= False; - } - fprintf (fp, "%d\n", numpoints); - FOREACHvertex_(vertices) { - if (vertex->seen) - fprintf (fp, "%d\n", qh_pointid (vertex->point)); - } - qh_settempfree (&vertices); -} /* printextremes_d */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printfacet">-</a> - - qh_printfacet( fp, facet ) - prints all fields of a facet to fp - - notes: - ridges printed in neighbor order -*/ -void qh_printfacet(FILE *fp, facetT *facet) { - - qh_printfacetheader (fp, facet); - if (facet->ridges) - qh_printfacetridges (fp, facet); -} /* printfacet */ - - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printfacet2geom">-</a> - - qh_printfacet2geom( fp, facet, color ) - print facet as part of a 2-d VECT for Geomview - - notes: - assume precise calculations in io.c with roundoff covered by qh_GEOMepsilon - mindist is calculated within io.c. maxoutside is calculated elsewhere - so a DISTround error may have occured. -*/ -void qh_printfacet2geom(FILE *fp, facetT *facet, realT color[3]) { - pointT *point0, *point1; - realT mindist, innerplane, outerplane; - int k; - - qh_facet2point (facet, &point0, &point1, &mindist); - qh_geomplanes (facet, &outerplane, &innerplane); - if (qh PRINTouter || (!qh PRINTnoplanes && !qh PRINTinner)) - qh_printfacet2geom_points(fp, point0, point1, facet, outerplane, color); - if (qh PRINTinner || (!qh PRINTnoplanes && !qh PRINTouter && - outerplane - innerplane > 2 * qh MAXabs_coord * qh_GEOMepsilon)) { - for(k= 3; k--; ) - color[k]= 1.0 - color[k]; - qh_printfacet2geom_points(fp, point0, point1, facet, innerplane, color); - } - qh_memfree (point1, qh normal_size); - qh_memfree (point0, qh normal_size); -} /* printfacet2geom */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printfacet2geom_points">-</a> - - qh_printfacet2geom_points( fp, point1, point2, facet, offset, color ) - prints a 2-d facet as a VECT with 2 points at some offset. - The points are on the facet's plane. -*/ -void qh_printfacet2geom_points(FILE *fp, pointT *point1, pointT *point2, - facetT *facet, realT offset, realT color[3]) { - pointT *p1= point1, *p2= point2; - - fprintf(fp, "VECT 1 2 1 2 1 # f%d\n", facet->id); - if (offset != 0.0) { - p1= qh_projectpoint (p1, facet, -offset); - p2= qh_projectpoint (p2, facet, -offset); - } - fprintf(fp, "%8.4g %8.4g %8.4g\n%8.4g %8.4g %8.4g\n", - p1[0], p1[1], 0.0, p2[0], p2[1], 0.0); - if (offset != 0.0) { - qh_memfree (p1, qh normal_size); - qh_memfree (p2, qh normal_size); - } - fprintf(fp, "%8.4g %8.4g %8.4g 1.0\n", color[0], color[1], color[2]); -} /* printfacet2geom_points */ - - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printfacet2math">-</a> - - qh_printfacet2math( fp, facet, notfirst ) - print 2-d Mathematica output for a facet - may be non-simplicial - - notes: - use %16.8f since Mathematica 2.2 does not handle exponential format -*/ -void qh_printfacet2math(FILE *fp, facetT *facet, int notfirst) { - pointT *point0, *point1; - realT mindist; - - qh_facet2point (facet, &point0, &point1, &mindist); - if (notfirst) - fprintf(fp, ","); - fprintf(fp, "Line[{{%16.8f, %16.8f}, {%16.8f, %16.8f}}]\n", - point0[0], point0[1], point1[0], point1[1]); - qh_memfree (point1, qh normal_size); - qh_memfree (point0, qh normal_size); -} /* printfacet2math */ - - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printfacet3geom_nonsimplicial">-</a> - - qh_printfacet3geom_nonsimplicial( fp, facet, color ) - print Geomview OFF for a 3-d nonsimplicial facet. - if DOintersections, prints ridges to unvisited neighbors (qh visit_id) - - notes - uses facet->visitid for intersections and ridges -*/ -void qh_printfacet3geom_nonsimplicial(FILE *fp, facetT *facet, realT color[3]) { - ridgeT *ridge, **ridgep; - setT *projectedpoints, *vertices; - vertexT *vertex, **vertexp, *vertexA, *vertexB; - pointT *projpt, *point, **pointp; - facetT *neighbor; - realT dist, outerplane, innerplane; - int cntvertices, k; - realT black[3]={0, 0, 0}, green[3]={0, 1, 0}; - - qh_geomplanes (facet, &outerplane, &innerplane); - vertices= qh_facet3vertex (facet); /* oriented */ - cntvertices= qh_setsize(vertices); - projectedpoints= qh_settemp(cntvertices); - FOREACHvertex_(vertices) { - zinc_(Zdistio); - qh_distplane(vertex->point, facet, &dist); - projpt= qh_projectpoint(vertex->point, facet, dist); - qh_setappend (&projectedpoints, projpt); - } - if (qh PRINTouter || (!qh PRINTnoplanes && !qh PRINTinner)) - qh_printfacet3geom_points(fp, projectedpoints, facet, outerplane, color); - if (qh PRINTinner || (!qh PRINTnoplanes && !qh PRINTouter && - outerplane - innerplane > 2 * qh MAXabs_coord * qh_GEOMepsilon)) { - for (k=3; k--; ) - color[k]= 1.0 - color[k]; - qh_printfacet3geom_points(fp, projectedpoints, facet, innerplane, color); - } - FOREACHpoint_(projectedpoints) - qh_memfree (point, qh normal_size); - qh_settempfree(&projectedpoints); - qh_settempfree(&vertices); - if ((qh DOintersections || qh PRINTridges) - && (!facet->visible || !qh NEWfacets)) { - facet->visitid= qh visit_id; - FOREACHridge_(facet->ridges) { - neighbor= otherfacet_(ridge, facet); - if (neighbor->visitid != qh visit_id) { - if (qh DOintersections) - qh_printhyperplaneintersection(fp, facet, neighbor, ridge->vertices, black); - if (qh PRINTridges) { - vertexA= SETfirstt_(ridge->vertices, vertexT); - vertexB= SETsecondt_(ridge->vertices, vertexT); - qh_printline3geom (fp, vertexA->point, vertexB->point, green); - } - } - } - } -} /* printfacet3geom_nonsimplicial */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printfacet3geom_points">-</a> - - qh_printfacet3geom_points( fp, points, facet, offset ) - prints a 3-d facet as OFF Geomview object. - offset is relative to the facet's hyperplane - Facet is determined as a list of points -*/ -void qh_printfacet3geom_points(FILE *fp, setT *points, facetT *facet, realT offset, realT color[3]) { - int k, n= qh_setsize(points), i; - pointT *point, **pointp; - setT *printpoints; - - fprintf(fp, "{ OFF %d 1 1 # f%d\n", n, facet->id); - if (offset != 0.0) { - printpoints= qh_settemp (n); - FOREACHpoint_(points) - qh_setappend (&printpoints, qh_projectpoint(point, facet, -offset)); - }else - printpoints= points; - FOREACHpoint_(printpoints) { - for (k=0; k < qh hull_dim; k++) { - if (k == qh DROPdim) - fprintf(fp, "0 "); - else - fprintf(fp, "%8.4g ", point[k]); - } - if (printpoints != points) - qh_memfree (point, qh normal_size); - fprintf (fp, "\n"); - } - if (printpoints != points) - qh_settempfree (&printpoints); - fprintf(fp, "%d ", n); - for(i= 0; i < n; i++) - fprintf(fp, "%d ", i); - fprintf(fp, "%8.4g %8.4g %8.4g 1.0 }\n", color[0], color[1], color[2]); -} /* printfacet3geom_points */ - - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printfacet3geom_simplicial">-</a> - - qh_printfacet3geom_simplicial( ) - print Geomview OFF for a 3-d simplicial facet. - - notes: - may flip color - uses facet->visitid for intersections and ridges - - assume precise calculations in io.c with roundoff covered by qh_GEOMepsilon - innerplane may be off by qh DISTround. Maxoutside is calculated elsewhere - so a DISTround error may have occured. -*/ -void qh_printfacet3geom_simplicial(FILE *fp, facetT *facet, realT color[3]) { - setT *points, *vertices; - vertexT *vertex, **vertexp, *vertexA, *vertexB; - facetT *neighbor, **neighborp; - realT outerplane, innerplane; - realT black[3]={0, 0, 0}, green[3]={0, 1, 0}; - int k; - - qh_geomplanes (facet, &outerplane, &innerplane); - vertices= qh_facet3vertex (facet); - points= qh_settemp (qh TEMPsize); - FOREACHvertex_(vertices) - qh_setappend(&points, vertex->point); - if (qh PRINTouter || (!qh PRINTnoplanes && !qh PRINTinner)) - qh_printfacet3geom_points(fp, points, facet, outerplane, color); - if (qh PRINTinner || (!qh PRINTnoplanes && !qh PRINTouter && - outerplane - innerplane > 2 * qh MAXabs_coord * qh_GEOMepsilon)) { - for (k= 3; k--; ) - color[k]= 1.0 - color[k]; - qh_printfacet3geom_points(fp, points, facet, innerplane, color); - } - qh_settempfree(&points); - qh_settempfree(&vertices); - if ((qh DOintersections || qh PRINTridges) - && (!facet->visible || !qh NEWfacets)) { - facet->visitid= qh visit_id; - FOREACHneighbor_(facet) { - if (neighbor->visitid != qh visit_id) { - vertices= qh_setnew_delnthsorted (facet->vertices, qh hull_dim, - SETindex_(facet->neighbors, neighbor), 0); - if (qh DOintersections) - qh_printhyperplaneintersection(fp, facet, neighbor, vertices, black); - if (qh PRINTridges) { - vertexA= SETfirstt_(vertices, vertexT); - vertexB= SETsecondt_(vertices, vertexT); - qh_printline3geom (fp, vertexA->point, vertexB->point, green); - } - qh_setfree(&vertices); - } - } - } -} /* printfacet3geom_simplicial */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printfacet3math">-</a> - - qh_printfacet3math( fp, facet, notfirst ) - print 3-d Mathematica output for a facet - - notes: - may be non-simplicial - use %16.8f since Mathematica 2.2 does not handle exponential format -*/ -void qh_printfacet3math (FILE *fp, facetT *facet, int notfirst) { - vertexT *vertex, **vertexp; - setT *points, *vertices; - pointT *point, **pointp; - boolT firstpoint= True; - realT dist; - - if (notfirst) - fprintf(fp, ",\n"); - vertices= qh_facet3vertex (facet); - points= qh_settemp (qh_setsize (vertices)); - FOREACHvertex_(vertices) { - zinc_(Zdistio); - qh_distplane(vertex->point, facet, &dist); - point= qh_projectpoint(vertex->point, facet, dist); - qh_setappend (&points, point); - } - fprintf(fp, "Polygon[{"); - FOREACHpoint_(points) { - if (firstpoint) - firstpoint= False; - else - fprintf(fp, ",\n"); - fprintf(fp, "{%16.8f, %16.8f, %16.8f}", point[0], point[1], point[2]); - } - FOREACHpoint_(points) - qh_memfree (point, qh normal_size); - qh_settempfree(&points); - qh_settempfree(&vertices); - fprintf(fp, "}]"); -} /* printfacet3math */ - - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printfacet3vertex">-</a> - - qh_printfacet3vertex( fp, facet, format ) - print vertices in a 3-d facet as point ids - - notes: - prints number of vertices first if format == qh_PRINToff - the facet may be non-simplicial -*/ -void qh_printfacet3vertex(FILE *fp, facetT *facet, int format) { - vertexT *vertex, **vertexp; - setT *vertices; - - vertices= qh_facet3vertex (facet); - if (format == qh_PRINToff) - fprintf (fp, "%d ", qh_setsize (vertices)); - FOREACHvertex_(vertices) - fprintf (fp, "%d ", qh_pointid(vertex->point)); - fprintf (fp, "\n"); - qh_settempfree(&vertices); -} /* printfacet3vertex */ - - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printfacet4geom_nonsimplicial">-</a> - - qh_printfacet4geom_nonsimplicial( ) - print Geomview 4OFF file for a 4d nonsimplicial facet - prints all ridges to unvisited neighbors (qh.visit_id) - if qh.DROPdim - prints in OFF format - - notes: - must agree with printend4geom() -*/ -void qh_printfacet4geom_nonsimplicial(FILE *fp, facetT *facet, realT color[3]) { - facetT *neighbor; - ridgeT *ridge, **ridgep; - vertexT *vertex, **vertexp; - pointT *point; - int k; - realT dist; - - facet->visitid= qh visit_id; - if (qh PRINTnoplanes || (facet->visible && qh NEWfacets)) - return; - FOREACHridge_(facet->ridges) { - neighbor= otherfacet_(ridge, facet); - if (neighbor->visitid == qh visit_id) - continue; - if (qh PRINTtransparent && !neighbor->good) - continue; - if (qh DOintersections) - qh_printhyperplaneintersection(fp, facet, neighbor, ridge->vertices, color); - else { - if (qh DROPdim >= 0) - fprintf(fp, "OFF 3 1 1 # f%d\n", facet->id); - else { - qh printoutvar++; - fprintf (fp, "# r%d between f%d f%d\n", ridge->id, facet->id, neighbor->id); - } - FOREACHvertex_(ridge->vertices) { - zinc_(Zdistio); - qh_distplane(vertex->point,facet, &dist); - point=qh_projectpoint(vertex->point,facet, dist); - for(k= 0; k < qh hull_dim; k++) { - if (k != qh DROPdim) - fprintf(fp, "%8.4g ", point[k]); - } - fprintf (fp, "\n"); - qh_memfree (point, qh normal_size); - } - if (qh DROPdim >= 0) - fprintf(fp, "3 0 1 2 %8.4g %8.4g %8.4g\n", color[0], color[1], color[2]); - } - } -} /* printfacet4geom_nonsimplicial */ - - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printfacet4geom_simplicial">-</a> - - qh_printfacet4geom_simplicial( fp, facet, color ) - print Geomview 4OFF file for a 4d simplicial facet - prints triangles for unvisited neighbors (qh.visit_id) - - notes: - must agree with printend4geom() -*/ -void qh_printfacet4geom_simplicial(FILE *fp, facetT *facet, realT color[3]) { - setT *vertices; - facetT *neighbor, **neighborp; - vertexT *vertex, **vertexp; - int k; - - facet->visitid= qh visit_id; - if (qh PRINTnoplanes || (facet->visible && qh NEWfacets)) - return; - FOREACHneighbor_(facet) { - if (neighbor->visitid == qh visit_id) - continue; - if (qh PRINTtransparent && !neighbor->good) - continue; - vertices= qh_setnew_delnthsorted (facet->vertices, qh hull_dim, - SETindex_(facet->neighbors, neighbor), 0); - if (qh DOintersections) - qh_printhyperplaneintersection(fp, facet, neighbor, vertices, color); - else { - if (qh DROPdim >= 0) - fprintf(fp, "OFF 3 1 1 # ridge between f%d f%d\n", - facet->id, neighbor->id); - else { - qh printoutvar++; - fprintf (fp, "# ridge between f%d f%d\n", facet->id, neighbor->id); - } - FOREACHvertex_(vertices) { - for(k= 0; k < qh hull_dim; k++) { - if (k != qh DROPdim) - fprintf(fp, "%8.4g ", vertex->point[k]); - } - fprintf (fp, "\n"); - } - if (qh DROPdim >= 0) - fprintf(fp, "3 0 1 2 %8.4g %8.4g %8.4g\n", color[0], color[1], color[2]); - } - qh_setfree(&vertices); - } -} /* printfacet4geom_simplicial */ - - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printfacetNvertex_nonsimplicial">-</a> - - qh_printfacetNvertex_nonsimplicial( fp, facet, id, format ) - print vertices for an N-d non-simplicial facet - triangulates each ridge to the id -*/ -void qh_printfacetNvertex_nonsimplicial(FILE *fp, facetT *facet, int id, int format) { - vertexT *vertex, **vertexp; - ridgeT *ridge, **ridgep; - - if (facet->visible && qh NEWfacets) - return; - FOREACHridge_(facet->ridges) { - if (format == qh_PRINTtriangles) - fprintf(fp, "%d ", qh hull_dim); - fprintf(fp, "%d ", id); - if ((ridge->top == facet) ^ qh_ORIENTclock) { - FOREACHvertex_(ridge->vertices) - fprintf(fp, "%d ", qh_pointid(vertex->point)); - }else { - FOREACHvertexreverse12_(ridge->vertices) - fprintf(fp, "%d ", qh_pointid(vertex->point)); - } - fprintf(fp, "\n"); - } -} /* printfacetNvertex_nonsimplicial */ - - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printfacetNvertex_simplicial">-</a> - - qh_printfacetNvertex_simplicial( fp, facet, format ) - print vertices for an N-d simplicial facet - prints vertices for non-simplicial facets - 2-d facets (orientation preserved by qh_mergefacet2d) - PRINToff ('o') for 4-d and higher -*/ -void qh_printfacetNvertex_simplicial(FILE *fp, facetT *facet, int format) { - vertexT *vertex, **vertexp; - - if (format == qh_PRINToff || format == qh_PRINTtriangles) - fprintf (fp, "%d ", qh_setsize (facet->vertices)); - if ((facet->toporient ^ qh_ORIENTclock) - || (qh hull_dim > 2 && !facet->simplicial)) { - FOREACHvertex_(facet->vertices) - fprintf(fp, "%d ", qh_pointid(vertex->point)); - }else { - FOREACHvertexreverse12_(facet->vertices) - fprintf(fp, "%d ", qh_pointid(vertex->point)); - } - fprintf(fp, "\n"); -} /* printfacetNvertex_simplicial */ - - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printfacetheader">-</a> - - qh_printfacetheader( fp, facet ) - prints header fields of a facet to fp - - notes: - for 'f' output and debugging -*/ -void qh_printfacetheader(FILE *fp, facetT *facet) { - pointT *point, **pointp, *furthest; - facetT *neighbor, **neighborp; - realT dist; - - if (facet == qh_MERGEridge) { - fprintf (fp, " MERGEridge\n"); - return; - }else if (facet == qh_DUPLICATEridge) { - fprintf (fp, " DUPLICATEridge\n"); - return; - }else if (!facet) { - fprintf (fp, " NULLfacet\n"); - return; - } - qh old_randomdist= qh RANDOMdist; - qh RANDOMdist= False; - fprintf(fp, "- f%d\n", facet->id); - fprintf(fp, " - flags:"); - if (facet->toporient) - fprintf(fp, " top"); - else - fprintf(fp, " bottom"); - if (facet->simplicial) - fprintf(fp, " simplicial"); - if (facet->tricoplanar) - fprintf(fp, " tricoplanar"); - if (facet->upperdelaunay) - fprintf(fp, " upperDelaunay"); - if (facet->visible) - fprintf(fp, " visible"); - if (facet->newfacet) - fprintf(fp, " new"); - if (facet->tested) - fprintf(fp, " tested"); - if (!facet->good) - fprintf(fp, " notG"); - if (facet->seen) - fprintf(fp, " seen"); - if (facet->coplanar) - fprintf(fp, " coplanar"); - if (facet->mergehorizon) - fprintf(fp, " mergehorizon"); - if (facet->keepcentrum) - fprintf(fp, " keepcentrum"); - if (facet->dupridge) - fprintf(fp, " dupridge"); - if (facet->mergeridge && !facet->mergeridge2) - fprintf(fp, " mergeridge1"); - if (facet->mergeridge2) - fprintf(fp, " mergeridge2"); - if (facet->newmerge) - fprintf(fp, " newmerge"); - if (facet->flipped) - fprintf(fp, " flipped"); - if (facet->notfurthest) - fprintf(fp, " notfurthest"); - if (facet->degenerate) - fprintf(fp, " degenerate"); - if (facet->redundant) - fprintf(fp, " redundant"); - fprintf(fp, "\n"); - if (facet->isarea) - fprintf(fp, " - area: %2.2g\n", facet->f.area); - else if (qh NEWfacets && facet->visible && facet->f.replace) - fprintf(fp, " - replacement: f%d\n", facet->f.replace->id); - else if (facet->newfacet) { - if (facet->f.samecycle && facet->f.samecycle != facet) - fprintf(fp, " - shares same visible/horizon as f%d\n", facet->f.samecycle->id); - }else if (facet->tricoplanar /* !isarea */) { - if (facet->f.triowner) - fprintf(fp, " - owner of normal & centrum is facet f%d\n", facet->f.triowner->id); - }else if (facet->f.newcycle) - fprintf(fp, " - was horizon to f%d\n", facet->f.newcycle->id); - if (facet->nummerge) - fprintf(fp, " - merges: %d\n", facet->nummerge); - qh_printpointid(fp, " - normal: ", qh hull_dim, facet->normal, -1); - fprintf(fp, " - offset: %10.7g\n", facet->offset); - if (qh CENTERtype == qh_ASvoronoi || facet->center) - qh_printcenter (fp, qh_PRINTfacets, " - center: ", facet); -#if qh_MAXoutside - if (facet->maxoutside > qh DISTround) - fprintf(fp, " - maxoutside: %10.7g\n", facet->maxoutside); -#endif - if (!SETempty_(facet->outsideset)) { - furthest= (pointT*)qh_setlast(facet->outsideset); - if (qh_setsize (facet->outsideset) < 6) { - fprintf(fp, " - outside set (furthest p%d):\n", qh_pointid(furthest)); - FOREACHpoint_(facet->outsideset) - qh_printpoint(fp, " ", point); - }else if (qh_setsize (facet->outsideset) < 21) { - qh_printpoints(fp, " - outside set:", facet->outsideset); - }else { - fprintf(fp, " - outside set: %d points.", qh_setsize(facet->outsideset)); - qh_printpoint(fp, " Furthest", furthest); - } -#if !qh_COMPUTEfurthest - fprintf(fp, " - furthest distance= %2.2g\n", facet->furthestdist); -#endif - } - if (!SETempty_(facet->coplanarset)) { - furthest= (pointT*)qh_setlast(facet->coplanarset); - if (qh_setsize (facet->coplanarset) < 6) { - fprintf(fp, " - coplanar set (furthest p%d):\n", qh_pointid(furthest)); - FOREACHpoint_(facet->coplanarset) - qh_printpoint(fp, " ", point); - }else if (qh_setsize (facet->coplanarset) < 21) { - qh_printpoints(fp, " - coplanar set:", facet->coplanarset); - }else { - fprintf(fp, " - coplanar set: %d points.", qh_setsize(facet->coplanarset)); - qh_printpoint(fp, " Furthest", furthest); - } - zinc_(Zdistio); - qh_distplane (furthest, facet, &dist); - fprintf(fp, " furthest distance= %2.2g\n", dist); - } - qh_printvertices (fp, " - vertices:", facet->vertices); - fprintf(fp, " - neighboring facets: "); - FOREACHneighbor_(facet) { - if (neighbor == qh_MERGEridge) - fprintf(fp, " MERGE"); - else if (neighbor == qh_DUPLICATEridge) - fprintf(fp, " DUP"); - else - fprintf(fp, " f%d", neighbor->id); - } - fprintf(fp, "\n"); - qh RANDOMdist= qh old_randomdist; -} /* printfacetheader */ - - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printfacetridges">-</a> - - qh_printfacetridges( fp, facet ) - prints ridges of a facet to fp - - notes: - ridges printed in neighbor order - assumes the ridges exist - for 'f' output -*/ -void qh_printfacetridges(FILE *fp, facetT *facet) { - facetT *neighbor, **neighborp; - ridgeT *ridge, **ridgep; - int numridges= 0; - - - if (facet->visible && qh NEWfacets) { - fprintf(fp, " - ridges (ids may be garbage):"); - FOREACHridge_(facet->ridges) - fprintf(fp, " r%d", ridge->id); - fprintf(fp, "\n"); - }else { - fprintf(fp, " - ridges:\n"); - FOREACHridge_(facet->ridges) - ridge->seen= False; - if (qh hull_dim == 3) { - ridge= SETfirstt_(facet->ridges, ridgeT); - while (ridge && !ridge->seen) { - ridge->seen= True; - qh_printridge(fp, ridge); - numridges++; - ridge= qh_nextridge3d (ridge, facet, NULL); - } - }else { - FOREACHneighbor_(facet) { - FOREACHridge_(facet->ridges) { - if (otherfacet_(ridge,facet) == neighbor) { - ridge->seen= True; - qh_printridge(fp, ridge); - numridges++; - } - } - } - } - if (numridges != qh_setsize (facet->ridges)) { - fprintf (fp, " - all ridges:"); - FOREACHridge_(facet->ridges) - fprintf (fp, " r%d", ridge->id); - fprintf (fp, "\n"); - } - FOREACHridge_(facet->ridges) { - if (!ridge->seen) - qh_printridge(fp, ridge); - } - } -} /* printfacetridges */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printfacets">-</a> - - qh_printfacets( fp, format, facetlist, facets, printall ) - prints facetlist and/or facet set in output format - - notes: - also used for specialized formats ('FO' and summary) - turns off 'Rn' option since want actual numbers -*/ -void qh_printfacets(FILE *fp, int format, facetT *facetlist, setT *facets, boolT printall) { - int numfacets, numsimplicial, numridges, totneighbors, numcoplanars, numtricoplanars; - facetT *facet, **facetp; - setT *vertices; - coordT *center; - realT outerplane, innerplane; - - qh old_randomdist= qh RANDOMdist; - qh RANDOMdist= False; - if (qh CDDoutput && (format == qh_PRINTcentrums || format == qh_PRINTpointintersect || format == qh_PRINToff)) - fprintf (qh ferr, "qhull warning: CDD format is not available for centrums, halfspace\nintersections, and OFF file format.\n"); - if (format == qh_PRINTnone) - ; /* print nothing */ - else if (format == qh_PRINTaverage) { - vertices= qh_facetvertices (facetlist, facets, printall); - center= qh_getcenter (vertices); - fprintf (fp, "%d 1\n", qh hull_dim); - qh_printpointid (fp, NULL, qh hull_dim, center, -1); - qh_memfree (center, qh normal_size); - qh_settempfree (&vertices); - }else if (format == qh_PRINTextremes) { - if (qh DELAUNAY) - qh_printextremes_d (fp, facetlist, facets, printall); - else if (qh hull_dim == 2) - qh_printextremes_2d (fp, facetlist, facets, printall); - else - qh_printextremes (fp, facetlist, facets, printall); - }else if (format == qh_PRINToptions) - fprintf(fp, "Options selected for Qhull %s:\n%s\n", qh_VERSION, qh qhull_options); - else if (format == qh_PRINTpoints && !qh VORONOI) - qh_printpoints_out (fp, facetlist, facets, printall); - else if (format == qh_PRINTqhull) - fprintf (fp, "%s | %s\n", qh rbox_command, qh qhull_command); - else if (format == qh_PRINTsize) { - fprintf (fp, "0\n2 "); - fprintf (fp, qh_REAL_1, qh totarea); - fprintf (fp, qh_REAL_1, qh totvol); - fprintf (fp, "\n"); - }else if (format == qh_PRINTsummary) { - qh_countfacets (facetlist, facets, printall, &numfacets, &numsimplicial, - &totneighbors, &numridges, &numcoplanars, &numtricoplanars); - vertices= qh_facetvertices (facetlist, facets, printall); - fprintf (fp, "10 %d %d %d %d %d %d %d %d %d %d\n2 ", qh hull_dim, - qh num_points + qh_setsize (qh other_points), - qh num_vertices, qh num_facets - qh num_visible, - qh_setsize (vertices), numfacets, numcoplanars, - numfacets - numsimplicial, zzval_(Zdelvertextot), - numtricoplanars); - qh_settempfree (&vertices); - qh_outerinner (NULL, &outerplane, &innerplane); - fprintf (fp, qh_REAL_2n, outerplane, innerplane); - }else if (format == qh_PRINTvneighbors) - qh_printvneighbors (fp, facetlist, facets, printall); - else if (qh VORONOI && format == qh_PRINToff) - qh_printvoronoi (fp, format, facetlist, facets, printall); - else if (qh VORONOI && format == qh_PRINTgeom) { - qh_printbegin (fp, format, facetlist, facets, printall); - qh_printvoronoi (fp, format, facetlist, facets, printall); - qh_printend (fp, format, facetlist, facets, printall); - }else if (qh VORONOI - && (format == qh_PRINTvertices || format == qh_PRINTinner || format == qh_PRINTouter)) - qh_printvdiagram (fp, format, facetlist, facets, printall); - else { - qh_printbegin (fp, format, facetlist, facets, printall); - FORALLfacet_(facetlist) - qh_printafacet (fp, format, facet, printall); - FOREACHfacet_(facets) - qh_printafacet (fp, format, facet, printall); - qh_printend (fp, format, facetlist, facets, printall); - } - qh RANDOMdist= qh old_randomdist; -} /* printfacets */ - - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printhelp_degenerate">-</a> - - qh_printhelp_degenerate( fp ) - prints descriptive message for precision error - - notes: - no message if qh_QUICKhelp -*/ -void qh_printhelp_degenerate(FILE *fp) { - - if (qh MERGEexact || qh PREmerge || qh JOGGLEmax < REALmax/2) - fprintf(fp, "\n\ -A Qhull error has occurred. Qhull should have corrected the above\n\ -precision error. Please send the input and all of the output to\n\ -qhull_bug@geom.umn.edu\n"); - else if (!qh_QUICKhelp) { - fprintf(fp, "\n\ -Precision problems were detected during construction of the convex hull.\n\ -This occurs because convex hull algorithms assume that calculations are\n\ -exact, but floating-point arithmetic has roundoff errors.\n\ -\n\ -To correct for precision problems, do not use 'Q0'. By default, Qhull\n\ -selects 'C-0' or 'Qx' and merges non-convex facets. With option 'QJ',\n\ -Qhull joggles the input to prevent precision problems. See \"Imprecision\n\ -in Qhull\" (qh-impre.htm).\n\ -\n\ -If you use 'Q0', the output may include\n\ -coplanar ridges, concave ridges, and flipped facets. In 4-d and higher,\n\ -Qhull may produce a ridge with four neighbors or two facets with the same \n\ -vertices. Qhull reports these events when they occur. It stops when a\n\ -concave ridge, flipped facet, or duplicate facet occurs.\n"); -#if REALfloat - fprintf (fp, "\ -\n\ -Qhull is currently using single precision arithmetic. The following\n\ -will probably remove the precision problems:\n\ - - recompile qhull for double precision (#define REALfloat 0 in user.h).\n"); -#endif - if (qh DELAUNAY && !qh SCALElast && qh MAXabs_coord > 1e4) - fprintf( fp, "\ -\n\ -When computing the Delaunay triangulation of coordinates > 1.0,\n\ - - use 'Qbb' to scale the last coordinate to [0,m] (max previous coordinate)\n"); - if (qh DELAUNAY && !qh ATinfinity) - fprintf( fp, "\ -When computing the Delaunay triangulation:\n\ - - use 'Qz' to add a point at-infinity. This reduces precision problems.\n"); - - fprintf(fp, "\ -\n\ -If you need triangular output:\n\ - - use option 'Qt' to triangulate the output\n\ - - use option 'QJ' to joggle the input points and remove precision errors\n\ - - use option 'Ft'. It triangulates non-simplicial facets with added points.\n\ -\n\ -If you must use 'Q0',\n\ -try one or more of the following options. They can not guarantee an output.\n\ - - use 'QbB' to scale the input to a cube.\n\ - - use 'Po' to produce output and prevent partitioning for flipped facets\n\ - - use 'V0' to set min. distance to visible facet as 0 instead of roundoff\n\ - - use 'En' to specify a maximum roundoff error less than %2.2g.\n\ - - options 'Qf', 'Qbb', and 'QR0' may also help\n", - qh DISTround); - fprintf(fp, "\ -\n\ -To guarantee simplicial output:\n\ - - use option 'Qt' to triangulate the output\n\ - - use option 'QJ' to joggle the input points and remove precision errors\n\ - - use option 'Ft' to triangulate the output by adding points\n\ - - use exact arithmetic (see \"Imprecision in Qhull\", qh-impre.htm)\n\ -"); - } -} /* printhelp_degenerate */ - - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printhelp_singular">-</a> - - qh_printhelp_singular( fp ) - prints descriptive message for singular input -*/ -void qh_printhelp_singular(FILE *fp) { - facetT *facet; - vertexT *vertex, **vertexp; - realT min, max, *coord, dist; - int i,k; - - fprintf(fp, "\n\ -The input to qhull appears to be less than %d dimensional, or a\n\ -computation has overflowed.\n\n\ -Qhull could not construct a clearly convex simplex from points:\n", - qh hull_dim); - qh_printvertexlist (fp, "", qh facet_list, NULL, qh_ALL); - if (!qh_QUICKhelp) - fprintf(fp, "\n\ -The center point is coplanar with a facet, or a vertex is coplanar\n\ -with a neighboring facet. The maximum round off error for\n\ -computing distances is %2.2g. The center point, facets and distances\n\ -to the center point are as follows:\n\n", qh DISTround); - qh_printpointid (fp, "center point", qh hull_dim, qh interior_point, -1); - fprintf (fp, "\n"); - FORALLfacets { - fprintf (fp, "facet"); - FOREACHvertex_(facet->vertices) - fprintf (fp, " p%d", qh_pointid(vertex->point)); - zinc_(Zdistio); - qh_distplane(qh interior_point, facet, &dist); - fprintf (fp, " distance= %4.2g\n", dist); - } - if (!qh_QUICKhelp) { - if (qh HALFspace) - fprintf (fp, "\n\ -These points are the dual of the given halfspaces. They indicate that\n\ -the intersection is degenerate.\n"); - fprintf (fp,"\n\ -These points either have a maximum or minimum x-coordinate, or\n\ -they maximize the determinant for k coordinates. Trial points\n\ -are first selected from points that maximize a coordinate.\n"); - if (qh hull_dim >= qh_INITIALmax) - fprintf (fp, "\n\ -Because of the high dimension, the min x-coordinate and max-coordinate\n\ -points are used if the determinant is non-zero. Option 'Qs' will\n\ -do a better, though much slower, job. Instead of 'Qs', you can change\n\ -the points by randomly rotating the input with 'QR0'.\n"); - } - fprintf (fp, "\nThe min and max coordinates for each dimension are:\n"); - for (k=0; k < qh hull_dim; k++) { - min= REALmax; - max= -REALmin; - for (i=qh num_points, coord= qh first_point+k; i--; coord += qh hull_dim) { - maximize_(max, *coord); - minimize_(min, *coord); - } - fprintf (fp, " %d: %8.4g %8.4g difference= %4.4g\n", k, min, max, max-min); - } - if (!qh_QUICKhelp) { - fprintf (fp, "\n\ -If the input should be full dimensional, you have several options that\n\ -may determine an initial simplex:\n\ - - use 'QJ' to joggle the input and make it full dimensional\n\ - - use 'QbB' to scale the points to the unit cube\n\ - - use 'QR0' to randomly rotate the input for different maximum points\n\ - - use 'Qs' to search all points for the initial simplex\n\ - - use 'En' to specify a maximum roundoff error less than %2.2g.\n\ - - trace execution with 'T3' to see the determinant for each point.\n", - qh DISTround); -#if REALfloat - fprintf (fp, "\ - - recompile qhull for double precision (#define REALfloat 0 in qhull.h).\n"); -#endif - fprintf (fp, "\n\ -If the input is lower dimensional:\n\ - - use 'QJ' to joggle the input and make it full dimensional\n\ - - use 'Qbk:0Bk:0' to delete coordinate k from the input. You should\n\ - pick the coordinate with the least range. The hull will have the\n\ - correct topology.\n\ - - determine the flat containing the points, rotate the points\n\ - into a coordinate plane, and delete the other coordinates.\n\ - - add one or more points to make the input full dimensional.\n\ -"); - if (qh DELAUNAY && !qh ATinfinity) - fprintf (fp, "\n\n\ -This is a Delaunay triangulation and the input is co-circular or co-spherical:\n\ - - use 'Qz' to add a point \"at infinity\" (i.e., above the paraboloid)\n\ - - or use 'QJ' to joggle the input and avoid co-circular data\n"); - } -} /* printhelp_singular */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printhyperplaneintersection">-</a> - - qh_printhyperplaneintersection( fp, facet1, facet2, vertices, color ) - print Geomview OFF or 4OFF for the intersection of two hyperplanes in 3-d or 4-d -*/ -void qh_printhyperplaneintersection(FILE *fp, facetT *facet1, facetT *facet2, - setT *vertices, realT color[3]) { - realT costheta, denominator, dist1, dist2, s, t, mindenom, p[4]; - vertexT *vertex, **vertexp; - int i, k; - boolT nearzero1, nearzero2; - - costheta= qh_getangle(facet1->normal, facet2->normal); - denominator= 1 - costheta * costheta; - i= qh_setsize(vertices); - if (qh hull_dim == 3) - fprintf(fp, "VECT 1 %d 1 %d 1 ", i, i); - else if (qh hull_dim == 4 && qh DROPdim >= 0) - fprintf(fp, "OFF 3 1 1 "); - else - qh printoutvar++; - fprintf (fp, "# intersect f%d f%d\n", facet1->id, facet2->id); - mindenom= 1 / (10.0 * qh MAXabs_coord); - FOREACHvertex_(vertices) { - zadd_(Zdistio, 2); - qh_distplane(vertex->point, facet1, &dist1); - qh_distplane(vertex->point, facet2, &dist2); - s= qh_divzero (-dist1 + costheta * dist2, denominator,mindenom,&nearzero1); - t= qh_divzero (-dist2 + costheta * dist1, denominator,mindenom,&nearzero2); - if (nearzero1 || nearzero2) - s= t= 0.0; - for(k= qh hull_dim; k--; ) - p[k]= vertex->point[k] + facet1->normal[k] * s + facet2->normal[k] * t; - if (qh PRINTdim <= 3) { - qh_projectdim3 (p, p); - fprintf(fp, "%8.4g %8.4g %8.4g # ", p[0], p[1], p[2]); - }else - fprintf(fp, "%8.4g %8.4g %8.4g %8.4g # ", p[0], p[1], p[2], p[3]); - if (nearzero1+nearzero2) - fprintf (fp, "p%d (coplanar facets)\n", qh_pointid (vertex->point)); - else - fprintf (fp, "projected p%d\n", qh_pointid (vertex->point)); - } - if (qh hull_dim == 3) - fprintf(fp, "%8.4g %8.4g %8.4g 1.0\n", color[0], color[1], color[2]); - else if (qh hull_dim == 4 && qh DROPdim >= 0) - fprintf(fp, "3 0 1 2 %8.4g %8.4g %8.4g 1.0\n", color[0], color[1], color[2]); -} /* printhyperplaneintersection */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printline3geom">-</a> - - qh_printline3geom( fp, pointA, pointB, color ) - prints a line as a VECT - prints 0's for qh.DROPdim - - notes: - if pointA == pointB, - it's a 1 point VECT -*/ -void qh_printline3geom (FILE *fp, pointT *pointA, pointT *pointB, realT color[3]) { - int k; - realT pA[4], pB[4]; - - qh_projectdim3(pointA, pA); - qh_projectdim3(pointB, pB); - if ((fabs(pA[0] - pB[0]) > 1e-3) || - (fabs(pA[1] - pB[1]) > 1e-3) || - (fabs(pA[2] - pB[2]) > 1e-3)) { - fprintf (fp, "VECT 1 2 1 2 1\n"); - for (k= 0; k < 3; k++) - fprintf (fp, "%8.4g ", pB[k]); - fprintf (fp, " # p%d\n", qh_pointid (pointB)); - }else - fprintf (fp, "VECT 1 1 1 1 1\n"); - for (k=0; k < 3; k++) - fprintf (fp, "%8.4g ", pA[k]); - fprintf (fp, " # p%d\n", qh_pointid (pointA)); - fprintf (fp, "%8.4g %8.4g %8.4g 1\n", color[0], color[1], color[2]); -} - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printneighborhood">-</a> - - qh_printneighborhood( fp, format, facetA, facetB, printall ) - print neighborhood of one or two facets - - notes: - calls qh_findgood_all() - bumps qh.visit_id -*/ -void qh_printneighborhood (FILE *fp, int format, facetT *facetA, facetT *facetB, boolT printall) { - facetT *neighbor, **neighborp, *facet; - setT *facets; - - if (format == qh_PRINTnone) - return; - qh_findgood_all (qh facet_list); - if (facetA == facetB) - facetB= NULL; - facets= qh_settemp (2*(qh_setsize (facetA->neighbors)+1)); - qh visit_id++; - for (facet= facetA; facet; facet= ((facet == facetA) ? facetB : NULL)) { - if (facet->visitid != qh visit_id) { - facet->visitid= qh visit_id; - qh_setappend (&facets, facet); - } - FOREACHneighbor_(facet) { - if (neighbor->visitid == qh visit_id) - continue; - neighbor->visitid= qh visit_id; - if (printall || !qh_skipfacet (neighbor)) - qh_setappend (&facets, neighbor); - } - } - qh_printfacets (fp, format, NULL, facets, printall); - qh_settempfree (&facets); -} /* printneighborhood */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printpoint">-</a> - - qh_printpoint( fp, string, point ) - qh_printpointid( fp, string, dim, point, id ) - prints the coordinates of a point - - returns: - if string is defined - prints 'string p%d' (skips p%d if id=-1) - - notes: - nop if point is NULL - prints id unless it is undefined (-1) -*/ -void qh_printpoint(FILE *fp, char *string, pointT *point) { - int id= qh_pointid( point); - - qh_printpointid( fp, string, qh hull_dim, point, id); -} /* printpoint */ - -void qh_printpointid(FILE *fp, char *string, int dim, pointT *point, int id) { - int k; - realT r; /*bug fix*/ - - if (!point) - return; - if (string) { - fputs (string, fp); - if (id != -1) - fprintf(fp, " p%d: ", id); - } - for(k= dim; k--; ) { - r= *point++; - if (string) - fprintf(fp, " %8.4g", r); - else - fprintf(fp, qh_REAL_1, r); - } - fprintf(fp, "\n"); -} /* printpointid */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printpoint3">-</a> - - qh_printpoint3( fp, point ) - prints 2-d, 3-d, or 4-d point as Geomview 3-d coordinates -*/ -void qh_printpoint3 (FILE *fp, pointT *point) { - int k; - realT p[4]; - - qh_projectdim3 (point, p); - for (k=0; k < 3; k++) - fprintf (fp, "%8.4g ", p[k]); - fprintf (fp, " # p%d\n", qh_pointid (point)); -} /* printpoint3 */ - -/*---------------------------------------- --printpoints- print pointids for a set of points starting at index - see geom.c -*/ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printpoints_out">-</a> - - qh_printpoints_out( fp, facetlist, facets, printall ) - prints vertices, coplanar/inside points, for facets by their point coordinates - allows qh.CDDoutput - - notes: - same format as qhull input - if no coplanar/interior points, - same order as qh_printextremes -*/ -void qh_printpoints_out (FILE *fp, facetT *facetlist, setT *facets, int printall) { - int allpoints= qh num_points + qh_setsize (qh other_points); - int numpoints=0, point_i, point_n; - setT *vertices, *points; - facetT *facet, **facetp; - pointT *point, **pointp; - vertexT *vertex, **vertexp; - int id; - - points= qh_settemp (allpoints); - qh_setzero (points, 0, allpoints); - vertices= qh_facetvertices (facetlist, facets, printall); - FOREACHvertex_(vertices) { - id= qh_pointid (vertex->point); - if (id >= 0) - SETelem_(points, id)= vertex->point; - } - if (qh KEEPinside || qh KEEPcoplanar || qh KEEPnearinside) { - FORALLfacet_(facetlist) { - if (!printall && qh_skipfacet(facet)) - continue; - FOREACHpoint_(facet->coplanarset) { - id= qh_pointid (point); - if (id >= 0) - SETelem_(points, id)= point; - } - } - FOREACHfacet_(facets) { - if (!printall && qh_skipfacet(facet)) - continue; - FOREACHpoint_(facet->coplanarset) { - id= qh_pointid (point); - if (id >= 0) - SETelem_(points, id)= point; - } - } - } - qh_settempfree (&vertices); - FOREACHpoint_i_(points) { - if (point) - numpoints++; - } - if (qh CDDoutput) - fprintf (fp, "%s | %s\nbegin\n%d %d real\n", qh rbox_command, - qh qhull_command, numpoints, qh hull_dim + 1); - else - fprintf (fp, "%d\n%d\n", qh hull_dim, numpoints); - FOREACHpoint_i_(points) { - if (point) { - if (qh CDDoutput) - fprintf (fp, "1 "); - qh_printpoint (fp, NULL, point); - } - } - if (qh CDDoutput) - fprintf (fp, "end\n"); - qh_settempfree (&points); -} /* printpoints_out */ - - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printpointvect">-</a> - - qh_printpointvect( fp, point, normal, center, radius, color ) - prints a 2-d, 3-d, or 4-d point as 3-d VECT's relative to normal or to center point -*/ -void qh_printpointvect (FILE *fp, pointT *point, coordT *normal, pointT *center, realT radius, realT color[3]) { - realT diff[4], pointA[4]; - int k; - - for (k= qh hull_dim; k--; ) { - if (center) - diff[k]= point[k]-center[k]; - else if (normal) - diff[k]= normal[k]; - else - diff[k]= 0; - } - if (center) - qh_normalize2 (diff, qh hull_dim, True, NULL, NULL); - for (k= qh hull_dim; k--; ) - pointA[k]= point[k]+diff[k] * radius; - qh_printline3geom (fp, point, pointA, color); -} /* printpointvect */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printpointvect2">-</a> - - qh_printpointvect2( fp, point, normal, center, radius ) - prints a 2-d, 3-d, or 4-d point as 2 3-d VECT's for an imprecise point -*/ -void qh_printpointvect2 (FILE *fp, pointT *point, coordT *normal, pointT *center, realT radius) { - realT red[3]={1, 0, 0}, yellow[3]={1, 1, 0}; - - qh_printpointvect (fp, point, normal, center, radius, red); - qh_printpointvect (fp, point, normal, center, -radius, yellow); -} /* printpointvect2 */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printridge">-</a> - - qh_printridge( fp, ridge ) - prints the information in a ridge - - notes: - for qh_printfacetridges() -*/ -void qh_printridge(FILE *fp, ridgeT *ridge) { - - fprintf(fp, " - r%d", ridge->id); - if (ridge->tested) - fprintf (fp, " tested"); - if (ridge->nonconvex) - fprintf (fp, " nonconvex"); - fprintf (fp, "\n"); - qh_printvertices (fp, " vertices:", ridge->vertices); - if (ridge->top && ridge->bottom) - fprintf(fp, " between f%d and f%d\n", - ridge->top->id, ridge->bottom->id); -} /* printridge */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printspheres">-</a> - - qh_printspheres( fp, vertices, radius ) - prints 3-d vertices as OFF spheres - - notes: - inflated octahedron from Stuart Levy earth/mksphere2 -*/ -void qh_printspheres(FILE *fp, setT *vertices, realT radius) { - vertexT *vertex, **vertexp; - - qh printoutnum++; - fprintf (fp, "{appearance {-edge -normal normscale 0} {\n\ -INST geom {define vsphere OFF\n\ -18 32 48\n\ -\n\ -0 0 1\n\ -1 0 0\n\ -0 1 0\n\ --1 0 0\n\ -0 -1 0\n\ -0 0 -1\n\ -0.707107 0 0.707107\n\ -0 -0.707107 0.707107\n\ -0.707107 -0.707107 0\n\ --0.707107 0 0.707107\n\ --0.707107 -0.707107 0\n\ -0 0.707107 0.707107\n\ --0.707107 0.707107 0\n\ -0.707107 0.707107 0\n\ -0.707107 0 -0.707107\n\ -0 0.707107 -0.707107\n\ --0.707107 0 -0.707107\n\ -0 -0.707107 -0.707107\n\ -\n\ -3 0 6 11\n\ -3 0 7 6 \n\ -3 0 9 7 \n\ -3 0 11 9\n\ -3 1 6 8 \n\ -3 1 8 14\n\ -3 1 13 6\n\ -3 1 14 13\n\ -3 2 11 13\n\ -3 2 12 11\n\ -3 2 13 15\n\ -3 2 15 12\n\ -3 3 9 12\n\ -3 3 10 9\n\ -3 3 12 16\n\ -3 3 16 10\n\ -3 4 7 10\n\ -3 4 8 7\n\ -3 4 10 17\n\ -3 4 17 8\n\ -3 5 14 17\n\ -3 5 15 14\n\ -3 5 16 15\n\ -3 5 17 16\n\ -3 6 13 11\n\ -3 7 8 6\n\ -3 9 10 7\n\ -3 11 12 9\n\ -3 14 8 17\n\ -3 15 13 14\n\ -3 16 12 15\n\ -3 17 10 16\n} transforms { TLIST\n"); - FOREACHvertex_(vertices) { - fprintf(fp, "%8.4g 0 0 0 # v%d\n 0 %8.4g 0 0\n0 0 %8.4g 0\n", - radius, vertex->id, radius, radius); - qh_printpoint3 (fp, vertex->point); - fprintf (fp, "1\n"); - } - fprintf (fp, "}}}\n"); -} /* printspheres */ - - -/*---------------------------------------------- --printsummary- - see qhull.c -*/ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printvdiagram">-</a> - - qh_printvdiagram( fp, format, facetlist, facets, printall ) - print voronoi diagram - # of pairs of input sites - #indices site1 site2 vertex1 ... - - sites indexed by input point id - point 0 is the first input point - vertices indexed by 'o' and 'p' order - vertex 0 is the 'vertex-at-infinity' - vertex 1 is the first Voronoi vertex - - see: - qh_printvoronoi() - qh_eachvoronoi_all() - - notes: - if all facets are upperdelaunay, - prints upper hull (furthest-site Voronoi diagram) -*/ -void qh_printvdiagram (FILE *fp, int format, facetT *facetlist, setT *facets, boolT printall) { - setT *vertices; - int totcount, numcenters; - boolT islower; - qh_RIDGE innerouter= qh_RIDGEall; - printvridgeT printvridge= NULL; - - if (format == qh_PRINTvertices) { - innerouter= qh_RIDGEall; - printvridge= qh_printvridge; - }else if (format == qh_PRINTinner) { - innerouter= qh_RIDGEinner; - printvridge= qh_printvnorm; - }else if (format == qh_PRINTouter) { - innerouter= qh_RIDGEouter; - printvridge= qh_printvnorm; - }else { - fprintf(qh ferr, "qh_printvdiagram: unknown print format %d.\n", format); - qh_errexit (qh_ERRinput, NULL, NULL); - } - vertices= qh_markvoronoi (facetlist, facets, printall, &islower, &numcenters); - totcount= qh_printvdiagram2 (NULL, NULL, vertices, innerouter, False); - fprintf (fp, "%d\n", totcount); - totcount= qh_printvdiagram2 (fp, printvridge, vertices, innerouter, True /* inorder*/); - qh_settempfree (&vertices); -#if 0 /* for testing qh_eachvoronoi_all */ - fprintf (fp, "\n"); - totcount= qh_eachvoronoi_all(fp, printvridge, qh UPPERdelaunay, innerouter, True /* inorder*/); - fprintf (fp, "%d\n", totcount); -#endif -} /* printvdiagram */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printvdiagram2">-</a> - - qh_printvdiagram2( fp, printvridge, vertices, innerouter, inorder ) - visit all pairs of input sites (vertices) for selected Voronoi vertices - vertices may include NULLs - - innerouter: - qh_RIDGEall print inner ridges (bounded) and outer ridges (unbounded) - qh_RIDGEinner print only inner ridges - qh_RIDGEouter print only outer ridges - - inorder: - print 3-d Voronoi vertices in order - - assumes: - qh_markvoronoi marked facet->visitid for Voronoi vertices - all facet->seen= False - all facet->seen2= True - - returns: - total number of Voronoi ridges - if printvridge, - calls printvridge( fp, vertex, vertexA, centers) for each ridge - [see qh_eachvoronoi()] - - see: - qh_eachvoronoi_all() -*/ -int qh_printvdiagram2 (FILE *fp, printvridgeT printvridge, setT *vertices, qh_RIDGE innerouter, boolT inorder) { - int totcount= 0; - int vertex_i, vertex_n; - vertexT *vertex; - - FORALLvertices - vertex->seen= False; - FOREACHvertex_i_(vertices) { - if (vertex) { - if (qh GOODvertex > 0 && qh_pointid(vertex->point)+1 != qh GOODvertex) - continue; - totcount += qh_eachvoronoi (fp, printvridge, vertex, !qh_ALL, innerouter, inorder); - } - } - return totcount; -} /* printvdiagram2 */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printvertex">-</a> - - qh_printvertex( fp, vertex ) - prints the information in a vertex -*/ -void qh_printvertex(FILE *fp, vertexT *vertex) { - pointT *point; - int k, count= 0; - facetT *neighbor, **neighborp; - realT r; /*bug fix*/ - - if (!vertex) { - fprintf (fp, " NULLvertex\n"); - return; - } - fprintf(fp, "- p%d (v%d):", qh_pointid(vertex->point), vertex->id); - point= vertex->point; - if (point) { - for(k= qh hull_dim; k--; ) { - r= *point++; - fprintf(fp, " %5.2g", r); - } - } - if (vertex->deleted) - fprintf(fp, " deleted"); - if (vertex->delridge) - fprintf (fp, " ridgedeleted"); - fprintf(fp, "\n"); - if (vertex->neighbors) { - fprintf(fp, " neighbors:"); - FOREACHneighbor_(vertex) { - if (++count % 100 == 0) - fprintf (fp, "\n "); - fprintf(fp, " f%d", neighbor->id); - } - fprintf(fp, "\n"); - } -} /* printvertex */ - - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printvertexlist">-</a> - - qh_printvertexlist( fp, string, facetlist, facets, printall ) - prints vertices used by a facetlist or facet set - tests qh_skipfacet() if !printall -*/ -void qh_printvertexlist (FILE *fp, char* string, facetT *facetlist, - setT *facets, boolT printall) { - vertexT *vertex, **vertexp; - setT *vertices; - - vertices= qh_facetvertices (facetlist, facets, printall); - fputs (string, fp); - FOREACHvertex_(vertices) - qh_printvertex(fp, vertex); - qh_settempfree (&vertices); -} /* printvertexlist */ - - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printvertices">-</a> - - qh_printvertices( fp, string, vertices ) - prints vertices in a set -*/ -void qh_printvertices(FILE *fp, char* string, setT *vertices) { - vertexT *vertex, **vertexp; - - fputs (string, fp); - FOREACHvertex_(vertices) - fprintf (fp, " p%d (v%d)", qh_pointid(vertex->point), vertex->id); - fprintf(fp, "\n"); -} /* printvertices */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printvneighbors">-</a> - - qh_printvneighbors( fp, facetlist, facets, printall ) - print vertex neighbors of vertices in facetlist and facets ('FN') - - notes: - qh_countfacets clears facet->visitid for non-printed facets - - design: - collect facet count and related statistics - if necessary, build neighbor sets for each vertex - collect vertices in facetlist and facets - build a point array for point->vertex and point->coplanar facet - for each point - list vertex neighbors or coplanar facet -*/ -void qh_printvneighbors (FILE *fp, facetT* facetlist, setT *facets, boolT printall) { - int numfacets, numsimplicial, numridges, totneighbors, numneighbors, numcoplanars, numtricoplanars; - setT *vertices, *vertex_points, *coplanar_points; - int numpoints= qh num_points + qh_setsize (qh other_points); - vertexT *vertex, **vertexp; - int vertex_i, vertex_n; - facetT *facet, **facetp, *neighbor, **neighborp; - pointT *point, **pointp; - - qh_countfacets (facetlist, facets, printall, &numfacets, &numsimplicial, - &totneighbors, &numridges, &numcoplanars, &numtricoplanars); /* sets facet->visitid */ - fprintf (fp, "%d\n", numpoints); - qh_vertexneighbors(); - vertices= qh_facetvertices (facetlist, facets, printall); - vertex_points= qh_settemp (numpoints); - coplanar_points= qh_settemp (numpoints); - qh_setzero (vertex_points, 0, numpoints); - qh_setzero (coplanar_points, 0, numpoints); - FOREACHvertex_(vertices) - qh_point_add (vertex_points, vertex->point, vertex); - FORALLfacet_(facetlist) { - FOREACHpoint_(facet->coplanarset) - qh_point_add (coplanar_points, point, facet); - } - FOREACHfacet_(facets) { - FOREACHpoint_(facet->coplanarset) - qh_point_add (coplanar_points, point, facet); - } - FOREACHvertex_i_(vertex_points) { - if (vertex) { - numneighbors= qh_setsize (vertex->neighbors); - fprintf (fp, "%d", numneighbors); - if (qh hull_dim == 3) - qh_order_vertexneighbors (vertex); - else if (qh hull_dim >= 4) - qsort (SETaddr_(vertex->neighbors, facetT), numneighbors, - sizeof (facetT *), qh_compare_facetvisit); - FOREACHneighbor_(vertex) - fprintf (fp, " %d", - neighbor->visitid ? neighbor->visitid - 1 : - neighbor->id); - fprintf (fp, "\n"); - }else if ((facet= SETelemt_(coplanar_points, vertex_i, facetT))) - fprintf (fp, "1 %d\n", - facet->visitid ? facet->visitid - 1 : - facet->id); - else - fprintf (fp, "0\n"); - } - qh_settempfree (&coplanar_points); - qh_settempfree (&vertex_points); - qh_settempfree (&vertices); -} /* printvneighbors */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printvoronoi">-</a> - - qh_printvoronoi( fp, format, facetlist, facets, printall ) - print voronoi diagram in 'o' or 'G' format - for 'o' format - prints voronoi centers for each facet and for infinity - for each vertex, lists ids of printed facets or infinity - assumes facetlist and facets are disjoint - for 'G' format - prints an OFF object - adds a 0 coordinate to center - prints infinity but does not list in vertices - - see: - qh_printvdiagram() - - notes: - if 'o', - prints a line for each point except "at-infinity" - if all facets are upperdelaunay, - reverses lower and upper hull -*/ -void qh_printvoronoi (FILE *fp, int format, facetT *facetlist, setT *facets, boolT printall) { - int k, numcenters, numvertices= 0, numneighbors, numinf, vid=1, vertex_i, vertex_n; - facetT *facet, **facetp, *neighbor, **neighborp; - setT *vertices; - vertexT *vertex; - boolT islower; - unsigned int numfacets= (unsigned int) qh num_facets; - - vertices= qh_markvoronoi (facetlist, facets, printall, &islower, &numcenters); - FOREACHvertex_i_(vertices) { - if (vertex) { - numvertices++; - numneighbors = numinf = 0; - FOREACHneighbor_(vertex) { - if (neighbor->visitid == 0) - numinf= 1; - else if (neighbor->visitid < numfacets) - numneighbors++; - } - if (numinf && !numneighbors) { - SETelem_(vertices, vertex_i)= NULL; - numvertices--; - } - } - } - if (format == qh_PRINTgeom) - fprintf (fp, "{appearance {+edge -face} OFF %d %d 1 # Voronoi centers and cells\n", - numcenters, numvertices); - else - fprintf (fp, "%d\n%d %d 1\n", qh hull_dim-1, numcenters, qh_setsize(vertices)); - if (format == qh_PRINTgeom) { - for (k= qh hull_dim-1; k--; ) - fprintf (fp, qh_REAL_1, 0.0); - fprintf (fp, " 0 # infinity not used\n"); - }else { - for (k= qh hull_dim-1; k--; ) - fprintf (fp, qh_REAL_1, qh_INFINITE); - fprintf (fp, "\n"); - } - FORALLfacet_(facetlist) { - if (facet->visitid && facet->visitid < numfacets) { - if (format == qh_PRINTgeom) - fprintf (fp, "# %d f%d\n", vid++, facet->id); - qh_printcenter (fp, format, NULL, facet); - } - } - FOREACHfacet_(facets) { - if (facet->visitid && facet->visitid < numfacets) { - if (format == qh_PRINTgeom) - fprintf (fp, "# %d f%d\n", vid++, facet->id); - qh_printcenter (fp, format, NULL, facet); - } - } - FOREACHvertex_i_(vertices) { - numneighbors= 0; - numinf=0; - if (vertex) { - if (qh hull_dim == 3) - qh_order_vertexneighbors(vertex); - else if (qh hull_dim >= 4) - qsort (SETaddr_(vertex->neighbors, vertexT), - qh_setsize (vertex->neighbors), - sizeof (facetT *), qh_compare_facetvisit); - FOREACHneighbor_(vertex) { - if (neighbor->visitid == 0) - numinf= 1; - else if (neighbor->visitid < numfacets) - numneighbors++; - } - } - if (format == qh_PRINTgeom) { - if (vertex) { - fprintf (fp, "%d", numneighbors); - if (vertex) { - FOREACHneighbor_(vertex) { - if (neighbor->visitid && neighbor->visitid < numfacets) - fprintf (fp, " %d", neighbor->visitid); - } - } - fprintf (fp, " # p%d (v%d)\n", vertex_i, vertex->id); - }else - fprintf (fp, " # p%d is coplanar or isolated\n", vertex_i); - }else { - if (numinf) - numneighbors++; - fprintf (fp, "%d", numneighbors); - if (vertex) { - FOREACHneighbor_(vertex) { - if (neighbor->visitid == 0) { - if (numinf) { - numinf= 0; - fprintf (fp, " %d", neighbor->visitid); - } - }else if (neighbor->visitid < numfacets) - fprintf (fp, " %d", neighbor->visitid); - } - } - fprintf (fp, "\n"); - } - } - if (format == qh_PRINTgeom) - fprintf (fp, "}\n"); - qh_settempfree (&vertices); -} /* printvoronoi */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printvnorm">-</a> - - qh_printvnorm( fp, vertex, vertexA, centers, unbounded ) - print one separating plane of the Voronoi diagram for a pair of input sites - unbounded==True if centers includes vertex-at-infinity - - assumes: - qh_ASvoronoi and qh_vertexneighbors() already set - - see: - qh_printvdiagram() - qh_eachvoronoi() -*/ -void qh_printvnorm (FILE *fp, vertexT *vertex, vertexT *vertexA, setT *centers, boolT unbounded) { - pointT *normal; - realT offset; - int k; - - normal= qh_detvnorm (vertex, vertexA, centers, &offset); - fprintf (fp, "%d %d %d ", - 2+qh hull_dim, qh_pointid (vertex->point), qh_pointid (vertexA->point)); - for (k= 0; k< qh hull_dim-1; k++) - fprintf (fp, qh_REAL_1, normal[k]); - fprintf (fp, qh_REAL_1, offset); - fprintf (fp, "\n"); -} /* printvnorm */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="printvridge">-</a> - - qh_printvridge( fp, vertex, vertexA, centers, unbounded ) - print one ridge of the Voronoi diagram for a pair of input sites - unbounded==True if centers includes vertex-at-infinity - - see: - qh_printvdiagram() - - notes: - the user may use a different function -*/ -void qh_printvridge (FILE *fp, vertexT *vertex, vertexT *vertexA, setT *centers, boolT unbounded) { - facetT *facet, **facetp; - - fprintf (fp, "%d %d %d", qh_setsize (centers)+2, - qh_pointid (vertex->point), qh_pointid (vertexA->point)); - FOREACHfacet_(centers) - fprintf (fp, " %d", facet->visitid); - fprintf (fp, "\n"); -} /* printvridge */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="projectdim3">-</a> - - qh_projectdim3( source, destination ) - project 2-d 3-d or 4-d point to a 3-d point - uses qh.DROPdim and qh.hull_dim - source and destination may be the same - - notes: - allocate 4 elements to destination just in case -*/ -void qh_projectdim3 (pointT *source, pointT *destination) { - int i,k; - - for (k= 0, i=0; k < qh hull_dim; k++) { - if (qh hull_dim == 4) { - if (k != qh DROPdim) - destination[i++]= source[k]; - }else if (k == qh DROPdim) - destination[i++]= 0; - else - destination[i++]= source[k]; - } - while (i < 3) - destination[i++]= 0.0; -} /* projectdim3 */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="readfeasible">-</a> - - qh_readfeasible( dim, remainder ) - read feasible point from remainder string and qh.fin - - returns: - number of lines read from qh.fin - sets qh.FEASIBLEpoint with malloc'd coordinates - - notes: - checks for qh.HALFspace - assumes dim > 1 - - see: - qh_setfeasible -*/ -int qh_readfeasible (int dim, char *remainder) { - boolT isfirst= True; - int linecount= 0, tokcount= 0; - char *s, *t, firstline[qh_MAXfirst+1]; - coordT *coords, value; - - if (!qh HALFspace) { - fprintf (qh ferr, "qhull input error: feasible point (dim 1 coords) is only valid for halfspace intersection\n"); - qh_errexit (qh_ERRinput, NULL, NULL); - } - if (qh feasible_string) - fprintf (qh ferr, "qhull input warning: feasible point (dim 1 coords) overrides 'Hn,n,n' feasible point for halfspace intersection\n"); - if (!(qh feasible_point= (coordT*)malloc (dim* sizeof(coordT)))) { - fprintf(qh ferr, "qhull error: insufficient memory for feasible point\n"); - qh_errexit(qh_ERRmem, NULL, NULL); - } - coords= qh feasible_point; - while ((s= (isfirst ? remainder : fgets(firstline, qh_MAXfirst, qh fin)))) { - if (isfirst) - isfirst= False; - else - linecount++; - while (*s) { - while (isspace(*s)) - s++; - value= qh_strtod (s, &t); - if (s == t) - break; - s= t; - *(coords++)= value; - if (++tokcount == dim) { - while (isspace (*s)) - s++; - qh_strtod (s, &t); - if (s != t) { - fprintf (qh ferr, "qhull input error: coordinates for feasible point do not finish out the line: %s\n", - s); - qh_errexit (qh_ERRinput, NULL, NULL); - } - return linecount; - } - } - } - fprintf (qh ferr, "qhull input error: only %d coordinates. Could not read %d-d feasible point.\n", - tokcount, dim); - qh_errexit (qh_ERRinput, NULL, NULL); - return 0; -} /* readfeasible */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="readpoints">-</a> - - qh_readpoints( numpoints, dimension, ismalloc ) - read points from qh.fin into qh.first_point, qh.num_points - qh.fin is lines of coordinates, one per vertex, first line number of points - if 'rbox D4', - gives message - if qh.ATinfinity, - adds point-at-infinity for Delaunay triangulations - - returns: - number of points, array of point coordinates, dimension, ismalloc True - if qh.DELAUNAY & !qh.PROJECTinput, projects points to paraboloid - and clears qh.PROJECTdelaunay - if qh.HALFspace, reads optional feasible point, reads halfspaces, - converts to dual. - - for feasible point in "cdd format" in 3-d: - 3 1 - coordinates - comments - begin - n 4 real/integer - ... - end - - notes: - dimension will change in qh_initqhull_globals if qh.PROJECTinput - uses malloc() since qh_mem not initialized - FIXUP: this routine needs rewriting -*/ -coordT *qh_readpoints(int *numpoints, int *dimension, boolT *ismalloc) { - coordT *points, *coords, *infinity= NULL; - realT paraboloid, maxboloid= -REALmax, value; - realT *coordp= NULL, *offsetp= NULL, *normalp= NULL; - char *s, *t, firstline[qh_MAXfirst+1]; - int diminput=0, numinput=0, dimfeasible= 0, newnum, k, tempi; - int firsttext=0, firstshort=0, firstlong=0, firstpoint=0; - int tokcount= 0, linecount=0, maxcount, coordcount=0; - boolT islong, isfirst= True, wasbegin= False; - boolT isdelaunay= qh DELAUNAY && !qh PROJECTinput; - - if (qh CDDinput) { - while ((s= fgets(firstline, qh_MAXfirst, qh fin))) { - linecount++; - if (qh HALFspace && linecount == 1 && isdigit(*s)) { - dimfeasible= qh_strtol (s, &s); - while (isspace(*s)) - s++; - if (qh_strtol (s, &s) == 1) - linecount += qh_readfeasible (dimfeasible, s); - else - dimfeasible= 0; - }else if (!memcmp (firstline, "begin", 5) || !memcmp (firstline, "BEGIN", 5)) - break; - else if (!*qh rbox_command) - strncat(qh rbox_command, s, sizeof (qh rbox_command)-1); - } - if (!s) { - fprintf (qh ferr, "qhull input error: missing \"begin\" for cdd-formated input\n"); - qh_errexit (qh_ERRinput, NULL, NULL); - } - } - while(!numinput && (s= fgets(firstline, qh_MAXfirst, qh fin))) { - linecount++; - if (!memcmp (s, "begin", 5) || !memcmp (s, "BEGIN", 5)) - wasbegin= True; - while (*s) { - while (isspace(*s)) - s++; - if (!*s) - break; - if (!isdigit(*s)) { - if (!*qh rbox_command) { - strncat(qh rbox_command, s, sizeof (qh rbox_command)-1); - firsttext= linecount; - } - break; - } - if (!diminput) - diminput= qh_strtol (s, &s); - else { - numinput= qh_strtol (s, &s); - if (numinput == 1 && diminput >= 2 && qh HALFspace && !qh CDDinput) { - linecount += qh_readfeasible (diminput, s); /* checks if ok */ - dimfeasible= diminput; - diminput= numinput= 0; - }else - break; - } - } - } - if (!s) { - fprintf(qh ferr, "qhull input error: short input file. Did not find dimension and number of points\n"); - qh_errexit(qh_ERRinput, NULL, NULL); - } - if (diminput > numinput) { - tempi= diminput; /* exchange dim and n, e.g., for cdd input format */ - diminput= numinput; - numinput= tempi; - } - if (diminput < 2) { - fprintf(qh ferr,"qhull input error: dimension %d (first number) should be at least 2\n", - diminput); - qh_errexit(qh_ERRinput, NULL, NULL); - } - if (isdelaunay) { - qh PROJECTdelaunay= False; - if (qh CDDinput) - *dimension= diminput; - else - *dimension= diminput+1; - *numpoints= numinput; - if (qh ATinfinity) - (*numpoints)++; - }else if (qh HALFspace) { - *dimension= diminput - 1; - *numpoints= numinput; - if (diminput < 3) { - fprintf(qh ferr,"qhull input error: dimension %d (first number, includes offset) should be at least 3 for halfspaces\n", - diminput); - qh_errexit(qh_ERRinput, NULL, NULL); - } - if (dimfeasible) { - if (dimfeasible != *dimension) { - fprintf(qh ferr,"qhull input error: dimension %d of feasible point is not one less than dimension %d for halfspaces\n", - dimfeasible, diminput); - qh_errexit(qh_ERRinput, NULL, NULL); - } - }else - qh_setfeasible (*dimension); - }else { - if (qh CDDinput) - *dimension= diminput-1; - else - *dimension= diminput; - *numpoints= numinput; - } - qh normal_size= *dimension * sizeof(coordT); /* for tracing with qh_printpoint */ - if (qh HALFspace) { - qh half_space= coordp= (coordT*) malloc (qh normal_size + sizeof(coordT)); - if (qh CDDinput) { - offsetp= qh half_space; - normalp= offsetp + 1; - }else { - normalp= qh half_space; - offsetp= normalp + *dimension; - } - } - qh maxline= diminput * (qh_REALdigits + 5); - maximize_(qh maxline, 500); - qh line= (char*)malloc ((qh maxline+1) * sizeof (char)); - *ismalloc= True; /* use malloc since memory not setup */ - coords= points= qh temp_malloc= - (coordT*)malloc((*numpoints)*(*dimension)*sizeof(coordT)); - if (!coords || !qh line || (qh HALFspace && !qh half_space)) { - fprintf(qh ferr, "qhull error: insufficient memory to read %d points\n", - numinput); - qh_errexit(qh_ERRmem, NULL, NULL); - } - if (isdelaunay && qh ATinfinity) { - infinity= points + numinput * (*dimension); - for (k= (*dimension) - 1; k--; ) - infinity[k]= 0.0; - } - maxcount= numinput * diminput; - paraboloid= 0.0; - while ((s= (isfirst ? s : fgets(qh line, qh maxline, qh fin)))) { - if (!isfirst) { - linecount++; - if (*s == 'e' || *s == 'E') { - if (!memcmp (s, "end", 3) || !memcmp (s, "END", 3)) { - if (qh CDDinput ) - break; - else if (wasbegin) - fprintf (qh ferr, "qhull input warning: the input appears to be in cdd format. If so, use 'Fd'\n"); - } - } - } - islong= False; - while (*s) { - while (isspace(*s)) - s++; - value= qh_strtod (s, &t); - if (s == t) { - if (!*qh rbox_command) - strncat(qh rbox_command, s, sizeof (qh rbox_command)-1); - if (*s && !firsttext) - firsttext= linecount; - if (!islong && !firstshort && coordcount) - firstshort= linecount; - break; - } - if (!firstpoint) - firstpoint= linecount; - s= t; - if (++tokcount > maxcount) - continue; - if (qh HALFspace) { - if (qh CDDinput) - *(coordp++)= -value; /* both coefficients and offset */ - else - *(coordp++)= value; - }else { - *(coords++)= value; - if (qh CDDinput && !coordcount) { - if (value != 1.0) { - fprintf (qh ferr, "qhull input error: for cdd format, point at line %d does not start with '1'\n", - linecount); - qh_errexit (qh_ERRinput, NULL, NULL); - } - coords--; - }else if (isdelaunay) { - paraboloid += value * value; - if (qh ATinfinity) { - if (qh CDDinput) - infinity[coordcount-1] += value; - else - infinity[coordcount] += value; - } - } - } - if (++coordcount == diminput) { - coordcount= 0; - if (isdelaunay) { - *(coords++)= paraboloid; - maximize_(maxboloid, paraboloid); - paraboloid= 0.0; - }else if (qh HALFspace) { - if (!qh_sethalfspace (*dimension, coords, &coords, normalp, offsetp, qh feasible_point)) { - fprintf (qh ferr, "The halfspace was on line %d\n", linecount); - if (wasbegin) - fprintf (qh ferr, "The input appears to be in cdd format. If so, you should use option 'Fd'\n"); - qh_errexit (qh_ERRinput, NULL, NULL); - } - coordp= qh half_space; - } - while (isspace(*s)) - s++; - if (*s) { - islong= True; - if (!firstlong) - firstlong= linecount; - } - } - } - if (!islong && !firstshort && coordcount) - firstshort= linecount; - if (!isfirst && s - qh line >= qh maxline) { - fprintf(qh ferr, "qhull input error: line %d contained more than %d characters\n", - linecount, (int) (s - qh line)); - qh_errexit(qh_ERRinput, NULL, NULL); - } - isfirst= False; - } - if (tokcount != maxcount) { - newnum= fmin_(numinput, tokcount/diminput); - fprintf(qh ferr,"\ -qhull warning: instead of %d %d-dimensional points, input contains\n\ -%d points and %d extra coordinates. Line %d is the first\npoint", - numinput, diminput, tokcount/diminput, tokcount % diminput, firstpoint); - if (firsttext) - fprintf(qh ferr, ", line %d is the first comment", firsttext); - if (firstshort) - fprintf(qh ferr, ", line %d is the first short\nline", firstshort); - if (firstlong) - fprintf(qh ferr, ", line %d is the first long line", firstlong); - fprintf(qh ferr, ". Continue with %d points.\n", newnum); - numinput= newnum; - if (isdelaunay && qh ATinfinity) { - for (k= tokcount % diminput; k--; ) - infinity[k] -= *(--coords); - *numpoints= newnum+1; - }else { - coords -= tokcount % diminput; - *numpoints= newnum; - } - } - if (isdelaunay && qh ATinfinity) { - for (k= (*dimension) -1; k--; ) - infinity[k] /= numinput; - if (coords == infinity) - coords += (*dimension) -1; - else { - for (k= 0; k < (*dimension) -1; k++) - *(coords++)= infinity[k]; - } - *(coords++)= maxboloid * 1.1; - } - if (qh rbox_command[0]) { - qh rbox_command[strlen(qh rbox_command)-1]= '\0'; - if (!strcmp (qh rbox_command, "./rbox D4")) - fprintf (qh ferr, "\n\ -This is the qhull test case. If any errors or core dumps occur,\n\ -recompile qhull with 'make new'. If errors still occur, there is\n\ -an incompatibility. You should try a different compiler. You can also\n\ -change the choices in user.h. If you discover the source of the problem,\n\ -please send mail to qhull_bug@geom.umn.edu.\n\ -\n\ -Type 'qhull' for a short list of options.\n"); - } - free (qh line); - qh line= NULL; - if (qh half_space) { - free (qh half_space); - qh half_space= NULL; - } - qh temp_malloc= NULL; - trace1((qh ferr,"qh_readpoints: read in %d %d-dimensional points\n", - numinput, diminput)); - return(points); -} /* readpoints */ - - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="setfeasible">-</a> - - qh_setfeasible( dim ) - set qh.FEASIBLEpoint from qh.feasible_string in "n,n,n" or "n n n" format - - notes: - "n,n,n" already checked by qh_initflags() - see qh_readfeasible() -*/ -void qh_setfeasible (int dim) { - int tokcount= 0; - char *s; - coordT *coords, value; - - if (!(s= qh feasible_string)) { - fprintf(qh ferr, "\ -qhull input error: halfspace intersection needs a feasible point.\n\ -Either prepend the input with 1 point or use 'Hn,n,n'. See manual.\n"); - qh_errexit (qh_ERRinput, NULL, NULL); - } - if (!(qh feasible_point= (pointT*)malloc (dim* sizeof(coordT)))) { - fprintf(qh ferr, "qhull error: insufficient memory for 'Hn,n,n'\n"); - qh_errexit(qh_ERRmem, NULL, NULL); - } - coords= qh feasible_point; - while (*s) { - value= qh_strtod (s, &s); - if (++tokcount > dim) { - fprintf (qh ferr, "qhull input warning: more coordinates for 'H%s' than dimension %d\n", - qh feasible_string, dim); - break; - } - *(coords++)= value; - if (*s) - s++; - } - while (++tokcount <= dim) - *(coords++)= 0.0; -} /* setfeasible */ - -/*-<a href="qh-io.htm#TOC" - >-------------------------------</a><a name="skipfacet">-</a> - - qh_skipfacet( facet ) - returns 'True' if this facet is not to be printed - - notes: - based on the user provided slice thresholds and 'good' specifications -*/ -boolT qh_skipfacet(facetT *facet) { - facetT *neighbor, **neighborp; - - if (qh PRINTneighbors) { - if (facet->good) - return !qh PRINTgood; - FOREACHneighbor_(facet) { - if (neighbor->good) - return False; - } - return True; - }else if (qh PRINTgood) - return !facet->good; - else if (!facet->normal) - return True; - return (!qh_inthresholds (facet->normal, NULL)); -} /* skipfacet */ - diff --git a/extern/qhull/src/io.h b/extern/qhull/src/io.h deleted file mode 100644 index 351d56b3708..00000000000 --- a/extern/qhull/src/io.h +++ /dev/null @@ -1,149 +0,0 @@ -/*<html><pre> -<a href="qh-io.htm" - >-------------------------------</a><a name="TOP">-</a> - - io.h - declarations of Input/Output functions - - see README, qhull.h and io.c - - copyright (c) 1993-2002, The Geometry Center -*/ - -#ifndef qhDEFio -#define qhDEFio 1 - -/*============ constants and flags ==================*/ - -/*-<a href="qh-io.htm#TOC" - >--------------------------------</a><a name="qh_MAXfirst">-</a> - - qh_MAXfirst - maximum length of first two lines of stdin -*/ -#define qh_MAXfirst 200 - -/*-<a href="qh-io.htm#TOC" - >--------------------------------</a><a name="qh_MINradius">-</a> - - qh_MINradius - min radius for Gp and Gv, fraction of maxcoord -*/ -#define qh_MINradius 0.02 - -/*-<a href="qh-io.htm#TOC" - >--------------------------------</a><a name="qh_GEOMepsilon">-</a> - - qh_GEOMepsilon - adjust outer planes for 'lines closer' and geomview roundoff. - This prevents bleed through. -*/ -#define qh_GEOMepsilon 2e-3 - -/*-<a href="qh-io.htm#TOC" - >--------------------------------</a><a name="qh_WHITESPACE">-</a> - - qh_WHITESPACE - possible values of white space -*/ -#define qh_WHITESPACE " \n\t\v\r\f" - - -/*-<a href="qh-io.htm#TOC" - >--------------------------------</a><a name="RIDGE">-</a> - - qh_RIDGE - to select which ridges to print in qh_eachvoronoi -*/ -typedef enum -{ - qh_RIDGEall = 0, qh_RIDGEinner, qh_RIDGEouter -} -qh_RIDGE; - -/*-<a href="qh-io.htm#TOC" - >--------------------------------</a><a name="printvridgeT">-</a> - - printvridgeT - prints results of qh_printvdiagram - - see: - <a href="io.c#printvridge">qh_printvridge</a> for an example -*/ -typedef void (*printvridgeT)(FILE *fp, vertexT *vertex, vertexT *vertexA, setT *centers, boolT unbounded); - -/*============== -prototypes in alphabetical order =========*/ - -void dfacet( unsigned id); -void dvertex( unsigned id); -void qh_countfacets (facetT *facetlist, setT *facets, boolT printall, - int *numfacetsp, int *numsimplicialp, int *totneighborsp, - int *numridgesp, int *numcoplanarsp, int *numnumtricoplanarsp); -pointT *qh_detvnorm (vertexT *vertex, vertexT *vertexA, setT *centers, realT *offsetp); -setT *qh_detvridge (vertexT *vertex); -setT *qh_detvridge3 (vertexT *atvertex, vertexT *vertex); -int qh_eachvoronoi (FILE *fp, printvridgeT printvridge, vertexT *atvertex, boolT visitall, qh_RIDGE innerouter, boolT inorder); -int qh_eachvoronoi_all (FILE *fp, printvridgeT printvridge, boolT isupper, qh_RIDGE innerouter, boolT inorder); -void qh_facet2point(facetT *facet, pointT **point0, pointT **point1, realT *mindist); -setT *qh_facetvertices (facetT *facetlist, setT *facets, boolT allfacets); -void qh_geomplanes (facetT *facet, realT *outerplane, realT *innerplane); -void qh_markkeep (facetT *facetlist); -setT *qh_markvoronoi (facetT *facetlist, setT *facets, boolT printall, boolT *islowerp, int *numcentersp); -void qh_order_vertexneighbors(vertexT *vertex); -void qh_printafacet(FILE *fp, int format, facetT *facet, boolT printall); -void qh_printbegin (FILE *fp, int format, facetT *facetlist, setT *facets, boolT printall); -void qh_printcenter (FILE *fp, int format, char *string, facetT *facet); -void qh_printcentrum (FILE *fp, facetT *facet, realT radius); -void qh_printend (FILE *fp, int format, facetT *facetlist, setT *facets, boolT printall); -void qh_printend4geom (FILE *fp, facetT *facet, int *num, boolT printall); -void qh_printextremes (FILE *fp, facetT *facetlist, setT *facets, int printall); -void qh_printextremes_2d (FILE *fp, facetT *facetlist, setT *facets, int printall); -void qh_printextremes_d (FILE *fp, facetT *facetlist, setT *facets, int printall); -void qh_printfacet(FILE *fp, facetT *facet); -void qh_printfacet2math(FILE *fp, facetT *facet, int notfirst); -void qh_printfacet2geom(FILE *fp, facetT *facet, realT color[3]); -void qh_printfacet2geom_points(FILE *fp, pointT *point1, pointT *point2, - facetT *facet, realT offset, realT color[3]); -void qh_printfacet3math (FILE *fp, facetT *facet, int notfirst); -void qh_printfacet3geom_nonsimplicial(FILE *fp, facetT *facet, realT color[3]); -void qh_printfacet3geom_points(FILE *fp, setT *points, facetT *facet, realT offset, realT color[3]); -void qh_printfacet3geom_simplicial(FILE *fp, facetT *facet, realT color[3]); -void qh_printfacet3vertex(FILE *fp, facetT *facet, int format); -void qh_printfacet4geom_nonsimplicial(FILE *fp, facetT *facet, realT color[3]); -void qh_printfacet4geom_simplicial(FILE *fp, facetT *facet, realT color[3]); -void qh_printfacetNvertex_nonsimplicial(FILE *fp, facetT *facet, int id, int format); -void qh_printfacetNvertex_simplicial(FILE *fp, facetT *facet, int format); -void qh_printfacetheader(FILE *fp, facetT *facet); -void qh_printfacetridges(FILE *fp, facetT *facet); -void qh_printfacets(FILE *fp, int format, facetT *facetlist, setT *facets, boolT printall); -void qh_printhelp_degenerate(FILE *fp); -void qh_printhelp_singular(FILE *fp); -void qh_printhyperplaneintersection(FILE *fp, facetT *facet1, facetT *facet2, - setT *vertices, realT color[3]); -void qh_printneighborhood (FILE *fp, int format, facetT *facetA, facetT *facetB, boolT printall); -void qh_printline3geom (FILE *fp, pointT *pointA, pointT *pointB, realT color[3]); -void qh_printpoint(FILE *fp, char *string, pointT *point); -void qh_printpointid(FILE *fp, char *string, int dim, pointT *point, int id); -void qh_printpoint3 (FILE *fp, pointT *point); -void qh_printpoints_out (FILE *fp, facetT *facetlist, setT *facets, int printall); -void qh_printpointvect (FILE *fp, pointT *point, coordT *normal, pointT *center, realT radius, realT color[3]); -void qh_printpointvect2 (FILE *fp, pointT *point, coordT *normal, pointT *center, realT radius); -void qh_printridge(FILE *fp, ridgeT *ridge); -void qh_printspheres(FILE *fp, setT *vertices, realT radius); -void qh_printvdiagram (FILE *fp, int format, facetT *facetlist, setT *facets, boolT printall); -int qh_printvdiagram2 (FILE *fp, printvridgeT printvridge, setT *vertices, qh_RIDGE innerouter, boolT inorder); -void qh_printvertex(FILE *fp, vertexT *vertex); -void qh_printvertexlist (FILE *fp, char* string, facetT *facetlist, - setT *facets, boolT printall); -void qh_printvertices (FILE *fp, char* string, setT *vertices); -void qh_printvneighbors (FILE *fp, facetT* facetlist, setT *facets, boolT printall); -void qh_printvoronoi (FILE *fp, int format, facetT *facetlist, setT *facets, boolT printall); -void qh_printvnorm (FILE *fp, vertexT *vertex, vertexT *vertexA, setT *centers, boolT unbounded); -void qh_printvridge (FILE *fp, vertexT *vertex, vertexT *vertexA, setT *centers, boolT unbounded); -void qh_produce_output(void); -void qh_projectdim3 (pointT *source, pointT *destination); -int qh_readfeasible (int dim, char *remainder); -coordT *qh_readpoints(int *numpoints, int *dimension, boolT *ismalloc); -void qh_setfeasible (int dim); -boolT qh_skipfacet(facetT *facet); - -#endif /* qhDEFio */ diff --git a/extern/qhull/src/mem.c b/extern/qhull/src/mem.c deleted file mode 100644 index 72934626684..00000000000 --- a/extern/qhull/src/mem.c +++ /dev/null @@ -1,447 +0,0 @@ -/*<html><pre> -<a href="qh-mem.htm" - >-------------------------------</a><a name="TOP">-</a> - - mem.c - memory management routines for qhull - - This is a standalone program. - - To initialize memory: - - qh_meminit (stderr); - qh_meminitbuffers (qh IStracing, qh_MEMalign, 7, qh_MEMbufsize,qh_MEMinitbuf); - qh_memsize(sizeof(facetT)); - qh_memsize(sizeof(facetT)); - ... - qh_memsetup(); - - To free up all memory buffers: - qh_memfreeshort (&curlong, &totlong); - - if qh_NOmem, - malloc/free is used instead of mem.c - - notes: - uses Quickfit algorithm (freelists for commonly allocated sizes) - assumes small sizes for freelists (it discards the tail of memory buffers) - - see: - qh-mem.htm and mem.h - global.c (qh_initbuffers) for an example of using mem.c - - copyright (c) 1993-2002 The Geometry Center -*/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "mem.h" - -#ifndef qhDEFqhull -typedef struct ridgeT ridgeT; -typedef struct facetT facetT; -void qh_errexit(int exitcode, facetT *, ridgeT *); -#endif - -/*============ -global data structure ============== - see mem.h for definition -*/ - -qhmemT qhmem= {0}; /* remove "= {0}" if this causes a compiler error */ - -#ifndef qh_NOmem - -/*============= internal functions ==============*/ - -static int qh_intcompare(const void *i, const void *j); - -/*========== functions in alphabetical order ======== */ - -/*-<a href="qh-mem.htm#TOC" - >-------------------------------</a><a name="intcompare">-</a> - - qh_intcompare( i, j ) - used by qsort and bsearch to compare two integers -*/ -static int qh_intcompare(const void *i, const void *j) { - return(*((int *)i) - *((int *)j)); -} /* intcompare */ - - -/*-<a href="qh-mem.htm#TOC" - >--------------------------------</a><a name="memalloc">-</a> - - qh_memalloc( insize ) - returns object of insize bytes - qhmem is the global memory structure - - returns: - pointer to allocated memory - errors if insufficient memory - - notes: - use explicit type conversion to avoid type warnings on some compilers - actual object may be larger than insize - use qh_memalloc_() for inline code for quick allocations - logs allocations if 'T5' - - design: - if size < qhmem.LASTsize - if qhmem.freelists[size] non-empty - return first object on freelist - else - round up request to size of qhmem.freelists[size] - allocate new allocation buffer if necessary - allocate object from allocation buffer - else - allocate object with malloc() -*/ -void *qh_memalloc(int insize) { - void **freelistp, *newbuffer; - int index, size; - int outsize, bufsize; - void *object; - - if ((unsigned) insize <= (unsigned) qhmem.LASTsize) { - index= qhmem.indextable[insize]; - freelistp= qhmem.freelists+index; - if ((object= *freelistp)) { - qhmem.cntquick++; - *freelistp= *((void **)*freelistp); /* replace freelist with next object */ - return (object); - }else { - outsize= qhmem.sizetable[index]; - qhmem.cntshort++; - if (outsize > qhmem .freesize) { - if (!qhmem.curbuffer) - bufsize= qhmem.BUFinit; - else - bufsize= qhmem.BUFsize; - qhmem.totshort += bufsize; - if (!(newbuffer= malloc(bufsize))) { - fprintf(qhmem.ferr, "qhull error (qh_memalloc): insufficient memory\n"); - qh_errexit(qhmem_ERRmem, NULL, NULL); - } - *((void **)newbuffer)= qhmem.curbuffer; /* prepend newbuffer to curbuffer - list */ - qhmem.curbuffer= newbuffer; - size= (sizeof(void **) + qhmem.ALIGNmask) & ~qhmem.ALIGNmask; - qhmem.freemem= (void *)((char *)newbuffer+size); - qhmem.freesize= bufsize - size; - } - object= qhmem.freemem; - qhmem.freemem= (void *)((char *)qhmem.freemem + outsize); - qhmem.freesize -= outsize; - return object; - } - }else { /* long allocation */ - if (!qhmem.indextable) { - fprintf (qhmem.ferr, "qhull internal error (qh_memalloc): qhmem has not been initialized.\n"); - qh_errexit(qhmem_ERRqhull, NULL, NULL); - } - outsize= insize; - qhmem .cntlong++; - qhmem .curlong++; - qhmem .totlong += outsize; - if (qhmem.maxlong < qhmem.totlong) - qhmem.maxlong= qhmem.totlong; - if (!(object= malloc(outsize))) { - fprintf(qhmem.ferr, "qhull error (qh_memalloc): insufficient memory\n"); - qh_errexit(qhmem_ERRmem, NULL, NULL); - } - if (qhmem.IStracing >= 5) - fprintf (qhmem.ferr, "qh_memalloc long: %d bytes at %p\n", outsize, object); - } - return (object); -} /* memalloc */ - - -/*-<a href="qh-mem.htm#TOC" - >--------------------------------</a><a name="memfree">-</a> - - qh_memfree( object, size ) - free up an object of size bytes - size is insize from qh_memalloc - - notes: - object may be NULL - type checking warns if using (void **)object - use qh_memfree_() for quick free's of small objects - - design: - if size <= qhmem.LASTsize - append object to corresponding freelist - else - call free(object) -*/ -void qh_memfree(void *object, int size) { - void **freelistp; - - if (!object) - return; - if (size <= qhmem.LASTsize) { - qhmem .freeshort++; - freelistp= qhmem.freelists + qhmem.indextable[size]; - *((void **)object)= *freelistp; - *freelistp= object; - }else { - qhmem .freelong++; - qhmem .totlong -= size; - free (object); - if (qhmem.IStracing >= 5) - fprintf (qhmem.ferr, "qh_memfree long: %d bytes at %p\n", size, object); - } -} /* memfree */ - - -/*-<a href="qh-mem.htm#TOC" - >-------------------------------</a><a name="memfreeshort">-</a> - - qh_memfreeshort( curlong, totlong ) - frees up all short and qhmem memory allocations - - returns: - number and size of current long allocations -*/ -void qh_memfreeshort (int *curlong, int *totlong) { - void *buffer, *nextbuffer; - - *curlong= qhmem .cntlong - qhmem .freelong; - *totlong= qhmem .totlong; - for(buffer= qhmem.curbuffer; buffer; buffer= nextbuffer) { - nextbuffer= *((void **) buffer); - free(buffer); - } - qhmem.curbuffer= NULL; - if (qhmem .LASTsize) { - free (qhmem .indextable); - free (qhmem .freelists); - free (qhmem .sizetable); - } - memset((char *)&qhmem, 0, sizeof qhmem); /* every field is 0, FALSE, NULL */ -} /* memfreeshort */ - - -/*-<a href="qh-mem.htm#TOC" - >--------------------------------</a><a name="meminit">-</a> - - qh_meminit( ferr ) - initialize qhmem and test sizeof( void*) -*/ -void qh_meminit (FILE *ferr) { - - memset((char *)&qhmem, 0, sizeof qhmem); /* every field is 0, FALSE, NULL */ - qhmem.ferr= ferr; - if (sizeof(void*) < sizeof(int)) { - fprintf (ferr, "qhull internal error (qh_meminit): sizeof(void*) < sizeof(int). qset.c will not work\n"); - exit (1); /* can not use qh_errexit() */ - } -} /* meminit */ - -/*-<a href="qh-mem.htm#TOC" - >-------------------------------</a><a name="meminitbuffers">-</a> - - qh_meminitbuffers( tracelevel, alignment, numsizes, bufsize, bufinit ) - initialize qhmem - if tracelevel >= 5, trace memory allocations - alignment= desired address alignment for memory allocations - numsizes= number of freelists - bufsize= size of additional memory buffers for short allocations - bufinit= size of initial memory buffer for short allocations -*/ -void qh_meminitbuffers (int tracelevel, int alignment, int numsizes, int bufsize, int bufinit) { - - qhmem.IStracing= tracelevel; - qhmem.NUMsizes= numsizes; - qhmem.BUFsize= bufsize; - qhmem.BUFinit= bufinit; - qhmem.ALIGNmask= alignment-1; - if (qhmem.ALIGNmask & ~qhmem.ALIGNmask) { - fprintf (qhmem.ferr, "qhull internal error (qh_meminit): memory alignment %d is not a power of 2\n", alignment); - qh_errexit (qhmem_ERRqhull, NULL, NULL); - } - qhmem.sizetable= (int *) calloc (numsizes, sizeof(int)); - qhmem.freelists= (void **) calloc (numsizes, sizeof(void *)); - if (!qhmem.sizetable || !qhmem.freelists) { - fprintf(qhmem.ferr, "qhull error (qh_meminit): insufficient memory\n"); - qh_errexit (qhmem_ERRmem, NULL, NULL); - } - if (qhmem.IStracing >= 1) - fprintf (qhmem.ferr, "qh_meminitbuffers: memory initialized with alignment %d\n", alignment); -} /* meminitbuffers */ - -/*-<a href="qh-mem.htm#TOC" - >-------------------------------</a><a name="memsetup">-</a> - - qh_memsetup() - set up memory after running memsize() -*/ -void qh_memsetup (void) { - int k,i; - - qsort(qhmem.sizetable, qhmem.TABLEsize, sizeof(int), qh_intcompare); - qhmem.LASTsize= qhmem.sizetable[qhmem.TABLEsize-1]; - if (qhmem .LASTsize >= qhmem .BUFsize || qhmem.LASTsize >= qhmem .BUFinit) { - fprintf (qhmem.ferr, "qhull error (qh_memsetup): largest mem size %d is >= buffer size %d or initial buffer size %d\n", - qhmem .LASTsize, qhmem .BUFsize, qhmem .BUFinit); - qh_errexit(qhmem_ERRmem, NULL, NULL); - } - if (!(qhmem.indextable= (int *)malloc((qhmem.LASTsize+1) * sizeof(int)))) { - fprintf(qhmem.ferr, "qhull error (qh_memsetup): insufficient memory\n"); - qh_errexit(qhmem_ERRmem, NULL, NULL); - } - for(k=qhmem.LASTsize+1; k--; ) - qhmem.indextable[k]= k; - i= 0; - for(k= 0; k <= qhmem.LASTsize; k++) { - if (qhmem.indextable[k] <= qhmem.sizetable[i]) - qhmem.indextable[k]= i; - else - qhmem.indextable[k]= ++i; - } -} /* memsetup */ - -/*-<a href="qh-mem.htm#TOC" - >-------------------------------</a><a name="memsize">-</a> - - qh_memsize( size ) - define a free list for this size -*/ -void qh_memsize(int size) { - int k; - - if (qhmem .LASTsize) { - fprintf (qhmem .ferr, "qhull error (qh_memsize): called after qhmem_setup\n"); - qh_errexit (qhmem_ERRqhull, NULL, NULL); - } - size= (size + qhmem.ALIGNmask) & ~qhmem.ALIGNmask; - for(k= qhmem.TABLEsize; k--; ) { - if (qhmem.sizetable[k] == size) - return; - } - if (qhmem.TABLEsize < qhmem.NUMsizes) - qhmem.sizetable[qhmem.TABLEsize++]= size; - else - fprintf(qhmem.ferr, "qhull warning (memsize): free list table has room for only %d sizes\n", qhmem.NUMsizes); -} /* memsize */ - - -/*-<a href="qh-mem.htm#TOC" - >-------------------------------</a><a name="memstatistics">-</a> - - qh_memstatistics( fp ) - print out memory statistics - - notes: - does not account for wasted memory at the end of each block -*/ -void qh_memstatistics (FILE *fp) { - int i, count, totfree= 0; - void *object; - - for (i=0; i < qhmem.TABLEsize; i++) { - count=0; - for (object= qhmem .freelists[i]; object; object= *((void **)object)) - count++; - totfree += qhmem.sizetable[i] * count; - } - fprintf (fp, "\nmemory statistics:\n\ -%7d quick allocations\n\ -%7d short allocations\n\ -%7d long allocations\n\ -%7d short frees\n\ -%7d long frees\n\ -%7d bytes of short memory in use\n\ -%7d bytes of short memory in freelists\n\ -%7d bytes of long memory allocated (except for input)\n\ -%7d bytes of long memory in use (in %d pieces)\n\ -%7d bytes per memory buffer (initially %d bytes)\n", - qhmem .cntquick, qhmem.cntshort, qhmem.cntlong, - qhmem .freeshort, qhmem.freelong, - qhmem .totshort - qhmem .freesize - totfree, - totfree, - qhmem .maxlong, qhmem .totlong, qhmem .cntlong - qhmem .freelong, - qhmem .BUFsize, qhmem .BUFinit); - if (qhmem.cntlarger) { - fprintf (fp, "%7d calls to qh_setlarger\n%7.2g average copy size\n", - qhmem.cntlarger, ((float) qhmem.totlarger)/ qhmem.cntlarger); - fprintf (fp, " freelists (bytes->count):"); - } - for (i=0; i < qhmem.TABLEsize; i++) { - count=0; - for (object= qhmem .freelists[i]; object; object= *((void **)object)) - count++; - fprintf (fp, " %d->%d", qhmem.sizetable[i], count); - } - fprintf (fp, "\n\n"); -} /* memstatistics */ - - -/*-<a href="qh-mem.htm#TOC" - >-------------------------------</a><a name="NOmem">-</a> - - qh_NOmem - turn off quick-fit memory allocation - - notes: - uses malloc() and free() instead -*/ -#else /* qh_NOmem */ - -void *qh_memalloc(int insize) { - void *object; - - if (!(object= malloc(insize))) { - fprintf(qhmem.ferr, "qhull error (qh_memalloc): insufficient memory\n"); - qh_errexit(qhmem_ERRmem, NULL, NULL); - } - if (qhmem.IStracing >= 5) - fprintf (qhmem.ferr, "qh_memalloc long: %d bytes at %p\n", insize, object); - return object; -} - -void qh_memfree(void *object, int size) { - - if (!object) - return; - free (object); - if (qhmem.IStracing >= 5) - fprintf (qhmem.ferr, "qh_memfree long: %d bytes at %p\n", size, object); -} - -void qh_memfreeshort (int *curlong, int *totlong) { - - memset((char *)&qhmem, 0, sizeof qhmem); /* every field is 0, FALSE, NULL */ - *curlong= 0; - *totlong= 0; -} - -void qh_meminit (FILE *ferr) { - - memset((char *)&qhmem, 0, sizeof qhmem); /* every field is 0, FALSE, NULL */ - qhmem.ferr= ferr; - if (sizeof(void*) < sizeof(int)) { - fprintf (ferr, "qhull internal error (qh_meminit): sizeof(void*) < sizeof(int). qset.c will not work\n"); - qh_errexit (qhmem_ERRqhull, NULL, NULL); - } -} - -void qh_meminitbuffers (int tracelevel, int alignment, int numsizes, int bufsize, int bufinit) { - - qhmem.IStracing= tracelevel; - -} - -void qh_memsetup (void) { - -} - -void qh_memsize(int size) { - -} - -void qh_memstatistics (FILE *fp) { - -} - -#endif /* qh_NOmem */ diff --git a/extern/qhull/src/mem.h b/extern/qhull/src/mem.h deleted file mode 100644 index e9ebd1bb9bc..00000000000 --- a/extern/qhull/src/mem.h +++ /dev/null @@ -1,174 +0,0 @@ -/*<html><pre> -<a href="qh-mem.htm" - >-------------------------------</a><a name="TOP">-</a> - - mem.h - prototypes for memory management functions - - see qh-mem.htm, mem.c and qset.h - - for error handling, writes message and calls - qh_errexit (qhmem_ERRmem, NULL, NULL) if insufficient memory - and - qh_errexit (qhmem_ERRqhull, NULL, NULL) otherwise - - copyright (c) 1993-2002, The Geometry Center -*/ - -#ifndef qhDEFmem -#define qhDEFmem - -/*-<a href="qh-mem.htm#TOC" - >-------------------------------</a><a name="NOmem">-</a> - - qh_NOmem - turn off quick-fit memory allocation - - notes: - mem.c implements Quickfit memory allocation for about 20% time - savings. If it fails on your machine, try to locate the - problem, and send the answer to qhull@geom.umn.edu. If this can - not be done, define qh_NOmem to use malloc/free instead. - - #define qh_NOmem -*/ - -/*------------------------------------------- - to avoid bus errors, memory allocation must consider alignment requirements. - malloc() automatically takes care of alignment. Since mem.c manages - its own memory, we need to explicitly specify alignment in - qh_meminitbuffers(). - - A safe choice is sizeof(double). sizeof(float) may be used if doubles - do not occur in data structures and pointers are the same size. Be careful - of machines (e.g., DEC Alpha) with large pointers. If gcc is available, - use __alignof__(double) or fmax_(__alignof__(float), __alignof__(void *)). - - see <a href="user.h#MEMalign">qh_MEMalign</a> in user.h for qhull's alignment -*/ - -#define qhmem_ERRmem 4 /* matches qh_ERRmem in qhull.h */ -#define qhmem_ERRqhull 5 /* matches qh_ERRqhull in qhull.h */ - -/*-<a href="qh-mem.htm#TOC" - >--------------------------------</a><a name="ptr_intT">-</a> - - ptr_intT - for casting a void* to an integer-type - - notes: - On 64-bit machines, a pointer may be larger than an 'int'. - qh_meminit() checks that 'long' holds a 'void*' -*/ -typedef unsigned long ptr_intT; - -/*-<a href="qh-mem.htm#TOC" - >--------------------------------</a><a name="qhmemT">-</a> - - qhmemT - global memory structure for mem.c - - notes: - users should ignore qhmem except for writing extensions - qhmem is allocated in mem.c - - qhmem could be swapable like qh and qhstat, but then - multiple qh's and qhmem's would need to keep in synch. - A swapable qhmem would also waste memory buffers. As long - as memory operations are atomic, there is no problem with - multiple qh structures being active at the same time. - If you need separate address spaces, you can swap the - contents of qhmem. -*/ -typedef struct qhmemT qhmemT; -extern qhmemT qhmem; - -struct qhmemT { /* global memory management variables */ - int BUFsize; /* size of memory allocation buffer */ - int BUFinit; /* initial size of memory allocation buffer */ - int TABLEsize; /* actual number of sizes in free list table */ - int NUMsizes; /* maximum number of sizes in free list table */ - int LASTsize; /* last size in free list table */ - int ALIGNmask; /* worst-case alignment, must be 2^n-1 */ - void **freelists; /* free list table, linked by offset 0 */ - int *sizetable; /* size of each freelist */ - int *indextable; /* size->index table */ - void *curbuffer; /* current buffer, linked by offset 0 */ - void *freemem; /* free memory in curbuffer */ - int freesize; /* size of free memory in bytes */ - void *tempstack; /* stack of temporary memory, managed by users */ - FILE *ferr; /* file for reporting errors */ - int IStracing; /* =5 if tracing memory allocations */ - int cntquick; /* count of quick allocations */ - /* remove statistics doesn't effect speed */ - int cntshort; /* count of short allocations */ - int cntlong; /* count of long allocations */ - int curlong; /* current count of inuse, long allocations */ - int freeshort; /* count of short memfrees */ - int freelong; /* count of long memfrees */ - int totshort; /* total size of short allocations */ - int totlong; /* total size of long allocations */ - int maxlong; /* maximum totlong */ - int cntlarger; /* count of setlarger's */ - int totlarger; /* total copied by setlarger */ -}; - - -/*==================== -macros ====================*/ - -/*-<a href="qh-mem.htm#TOC" - >--------------------------------</a><a name="memalloc_">-</a> - - qh_memalloc_(size, object, type) - returns object of size bytes - assumes size<=qhmem.LASTsize and void **freelistp is a temp -*/ - -#ifdef qh_NOmem -#define qh_memalloc_(size, freelistp, object, type) {\ - object= (type*)qh_memalloc (size); } -#else /* !qh_NOmem */ - -#define qh_memalloc_(size, freelistp, object, type) {\ - freelistp= qhmem.freelists + qhmem.indextable[size];\ - if ((object= (type*)*freelistp)) {\ - qhmem.cntquick++; \ - *freelistp= *((void **)*freelistp);\ - }else object= (type*)qh_memalloc (size);} -#endif - -/*-<a href="qh-mem.htm#TOC" - >--------------------------------</a><a name="memfree_">-</a> - - qh_memfree_(object, size) - free up an object - - notes: - object may be NULL - assumes size<=qhmem.LASTsize and void **freelistp is a temp -*/ -#ifdef qh_NOmem -#define qh_memfree_(object, size, freelistp) {\ - qh_memfree (object, size); } -#else /* !qh_NOmem */ - -#define qh_memfree_(object, size, freelistp) {\ - if (object) { \ - qhmem .freeshort++;\ - freelistp= qhmem.freelists + qhmem.indextable[size];\ - *((void **)object)= *freelistp;\ - *freelistp= object;}} -#endif - -/*=============== prototypes in alphabetical order ============*/ - -void *qh_memalloc(int insize); -void qh_memfree (void *object, int size); -void qh_memfreeshort (int *curlong, int *totlong); -void qh_meminit (FILE *ferr); -void qh_meminitbuffers (int tracelevel, int alignment, int numsizes, - int bufsize, int bufinit); -void qh_memsetup (void); -void qh_memsize(int size); -void qh_memstatistics (FILE *fp); - -#endif /* qhDEFmem */ diff --git a/extern/qhull/src/merge.c b/extern/qhull/src/merge.c deleted file mode 100644 index 34ecda1865f..00000000000 --- a/extern/qhull/src/merge.c +++ /dev/null @@ -1,3626 +0,0 @@ -/*<html><pre> -<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="TOP">-</a> - - merge.c - merges non-convex facets - - see qh-merge.htm and merge.h - - other modules call qh_premerge() and qh_postmerge() - - the user may call qh_postmerge() to perform additional merges. - - To remove deleted facets and vertices (qhull() in qhull.c): - qh_partitionvisible (!qh_ALL, &numoutside); // visible_list, newfacet_list - qh_deletevisible (); // qh.visible_list - qh_resetlists (False, qh_RESETvisible); // qh.visible_list newvertex_list newfacet_list - - assumes qh.CENTERtype= centrum - - merges occur in qh_mergefacet and in qh_mergecycle - vertex->neighbors not set until the first merge occurs - - copyright (c) 1993-2002 The Geometry Center -*/ - -#include "qhull_a.h" - -#ifndef qh_NOmerge - -/*=========== internal prototypes =========*/ - -static int qh_compareangle(const void *p1, const void *p2); -static int qh_comparemerge(const void *p1, const void *p2); -static int qh_comparevisit (const void *p1, const void *p2); - - -/*===== functions (alphabetical after premerge and postmerge) ======*/ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="premerge">-</a> - - qh_premerge( apex, maxcentrum ) - pre-merge nonconvex facets in qh.newfacet_list for apex - maxcentrum defines coplanar and concave (qh_test_appendmerge) - - returns: - deleted facets added to qh.visible_list with facet->visible set - - notes: - uses globals, qh.MERGEexact, qh.PREmerge - - design: - mark duplicate ridges in qh.newfacet_list - merge facet cycles in qh.newfacet_list - merge duplicate ridges and concave facets in qh.newfacet_list - check merged facet cycles for degenerate and redundant facets - merge degenerate and redundant facets - collect coplanar and concave facets - merge concave, coplanar, degenerate, and redundant facets -*/ -void qh_premerge (vertexT *apex, realT maxcentrum, realT maxangle) { - boolT othermerge= False; - facetT *newfacet; - - if (qh ZEROcentrum && qh_checkzero(!qh_ALL)) - return; - trace2((qh ferr, "qh_premerge: premerge centrum %2.2g angle %2.2g for apex v%d facetlist f%d\n", - maxcentrum, maxangle, apex->id, getid_(qh newfacet_list))); - if (qh IStracing >= 4 && qh num_facets < 50) - qh_printlists(); - qh centrum_radius= maxcentrum; - qh cos_max= maxangle; - qh degen_mergeset= qh_settemp (qh TEMPsize); - qh facet_mergeset= qh_settemp (qh TEMPsize); - if (qh hull_dim >=3) { - qh_mark_dupridges (qh newfacet_list); /* facet_mergeset */ - qh_mergecycle_all (qh newfacet_list, &othermerge); - qh_forcedmerges (&othermerge /* qh facet_mergeset */); - FORALLnew_facets { /* test samecycle merges */ - if (!newfacet->simplicial && !newfacet->mergeridge) - qh_degen_redundant_neighbors (newfacet, NULL); - } - if (qh_merge_degenredundant()) - othermerge= True; - }else /* qh hull_dim == 2 */ - qh_mergecycle_all (qh newfacet_list, &othermerge); - qh_flippedmerges (qh newfacet_list, &othermerge); - if (!qh MERGEexact || zzval_(Ztotmerge)) { - zinc_(Zpremergetot); - qh POSTmerging= False; - qh_getmergeset_initial (qh newfacet_list); - qh_all_merges (othermerge, False); - } - qh_settempfree(&qh facet_mergeset); - qh_settempfree(&qh degen_mergeset); -} /* premerge */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="postmerge">-</a> - - qh_postmerge( reason, maxcentrum, maxangle, vneighbors ) - post-merge nonconvex facets as defined by maxcentrum and maxangle - 'reason' is for reporting progress - if vneighbors, - calls qh_test_vneighbors at end of qh_all_merge - if firstmerge, - calls qh_reducevertices before qh_getmergeset - - returns: - if first call (qh.visible_list != qh.facet_list), - builds qh.facet_newlist, qh.newvertex_list - deleted facets added to qh.visible_list with facet->visible - qh.visible_list == qh.facet_list - - notes: - - - design: - if first call - set qh.visible_list and qh.newfacet_list to qh.facet_list - add all facets to qh.newfacet_list - mark non-simplicial facets, facet->newmerge - set qh.newvertext_list to qh.vertex_list - add all vertices to qh.newvertex_list - if a pre-merge occured - set vertex->delridge {will retest the ridge} - if qh.MERGEexact - call qh_reducevertices() - if no pre-merging - merge flipped facets - determine non-convex facets - merge all non-convex facets -*/ -void qh_postmerge (char *reason, realT maxcentrum, realT maxangle, - boolT vneighbors) { - facetT *newfacet; - boolT othermerges= False; - vertexT *vertex; - - if (qh REPORTfreq || qh IStracing) { - qh_buildtracing (NULL, NULL); - qh_printsummary (qh ferr); - if (qh PRINTstatistics) - qh_printallstatistics (qh ferr, "reason"); - fprintf (qh ferr, "\n%s with 'C%.2g' and 'A%.2g'\n", - reason, maxcentrum, maxangle); - } - trace2((qh ferr, "qh_postmerge: postmerge. test vneighbors? %d\n", - vneighbors)); - qh centrum_radius= maxcentrum; - qh cos_max= maxangle; - qh POSTmerging= True; - qh degen_mergeset= qh_settemp (qh TEMPsize); - qh facet_mergeset= qh_settemp (qh TEMPsize); - if (qh visible_list != qh facet_list) { /* first call */ - qh NEWfacets= True; - qh visible_list= qh newfacet_list= qh facet_list; - FORALLnew_facets { - newfacet->newfacet= True; - if (!newfacet->simplicial) - newfacet->newmerge= True; - zinc_(Zpostfacets); - } - qh newvertex_list= qh vertex_list; - FORALLvertices - vertex->newlist= True; - if (qh VERTEXneighbors) { /* a merge has occurred */ - FORALLvertices - vertex->delridge= True; /* test for redundant, needed? */ - if (qh MERGEexact) { - if (qh hull_dim <= qh_DIMreduceBuild) - qh_reducevertices(); /* was skipped during pre-merging */ - } - } - if (!qh PREmerge && !qh MERGEexact) - qh_flippedmerges (qh newfacet_list, &othermerges); - } - qh_getmergeset_initial (qh newfacet_list); - qh_all_merges (False, vneighbors); - qh_settempfree(&qh facet_mergeset); - qh_settempfree(&qh degen_mergeset); -} /* post_merge */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="all_merges">-</a> - - qh_all_merges( othermerge, vneighbors ) - merge all non-convex facets - - set othermerge if already merged facets (for qh_reducevertices) - if vneighbors - tests vertex neighbors for convexity at end - qh.facet_mergeset lists the non-convex ridges in qh_newfacet_list - qh.degen_mergeset is defined - if qh.MERGEexact && !qh.POSTmerging, - does not merge coplanar facets - - returns: - deleted facets added to qh.visible_list with facet->visible - deleted vertices added qh.delvertex_list with vertex->delvertex - - notes: - unless !qh.MERGEindependent, - merges facets in independent sets - uses qh.newfacet_list as argument since merges call qh_removefacet() - - design: - while merges occur - for each merge in qh.facet_mergeset - unless one of the facets was already merged in this pass - merge the facets - test merged facets for additional merges - add merges to qh.facet_mergeset - if vertices record neighboring facets - rename redundant vertices - update qh.facet_mergeset - if vneighbors ?? - tests vertex neighbors for convexity at end -*/ -void qh_all_merges (boolT othermerge, boolT vneighbors) { - facetT *facet1, *facet2; - mergeT *merge; - boolT wasmerge= True, isreduce; - void **freelistp; /* used !qh_NOmem */ - vertexT *vertex; - mergeType mergetype; - int numcoplanar=0, numconcave=0, numdegenredun= 0, numnewmerges= 0; - - trace2((qh ferr, "qh_all_merges: starting to merge facets beginning from f%d\n", - getid_(qh newfacet_list))); - while (True) { - wasmerge= False; - while (qh_setsize (qh facet_mergeset)) { - while ((merge= (mergeT*)qh_setdellast(qh facet_mergeset))) { - facet1= merge->facet1; - facet2= merge->facet2; - mergetype= merge->type; - qh_memfree_(merge, sizeof(mergeT), freelistp); - if (facet1->visible || facet2->visible) /*deleted facet*/ - continue; - if ((facet1->newfacet && !facet1->tested) - || (facet2->newfacet && !facet2->tested)) { - if (qh MERGEindependent && mergetype <= MRGanglecoplanar) - continue; /* perform independent sets of merges */ - } - qh_merge_nonconvex (facet1, facet2, mergetype); - numdegenredun += qh_merge_degenredundant(); - numnewmerges++; - wasmerge= True; - if (mergetype == MRGconcave) - numconcave++; - else /* MRGcoplanar or MRGanglecoplanar */ - numcoplanar++; - } /* while setdellast */ - if (qh POSTmerging && qh hull_dim <= qh_DIMreduceBuild - && numnewmerges > qh_MAXnewmerges) { - numnewmerges= 0; - qh_reducevertices(); /* otherwise large post merges too slow */ - } - qh_getmergeset (qh newfacet_list); /* facet_mergeset */ - } /* while mergeset */ - if (qh VERTEXneighbors) { - isreduce= False; - if (qh hull_dim >=4 && qh POSTmerging) { - FORALLvertices - vertex->delridge= True; - isreduce= True; - } - if ((wasmerge || othermerge) && (!qh MERGEexact || qh POSTmerging) - && qh hull_dim <= qh_DIMreduceBuild) { - othermerge= False; - isreduce= True; - } - if (isreduce) { - if (qh_reducevertices()) { - qh_getmergeset (qh newfacet_list); /* facet_mergeset */ - continue; - } - } - } - if (vneighbors && qh_test_vneighbors(/* qh newfacet_list */)) - continue; - break; - } /* while (True) */ - if (qh CHECKfrequently && !qh MERGEexact) { - qh old_randomdist= qh RANDOMdist; - qh RANDOMdist= False; - qh_checkconvex (qh newfacet_list, qh_ALGORITHMfault); - /* qh_checkconnect (); [this is slow and it changes the facet order] */ - qh RANDOMdist= qh old_randomdist; - } - trace1((qh ferr, "qh_all_merges: merged %d coplanar facets %d concave facets and %d degen or redundant facets.\n", - numcoplanar, numconcave, numdegenredun)); - if (qh IStracing >= 4 && qh num_facets < 50) - qh_printlists (); -} /* all_merges */ - - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="appendmergeset">-</a> - - qh_appendmergeset( facet, neighbor, mergetype, angle ) - appends an entry to qh.facet_mergeset or qh.degen_mergeset - - angle ignored if NULL or !qh.ANGLEmerge - - returns: - merge appended to facet_mergeset or degen_mergeset - sets ->degenerate or ->redundant if degen_mergeset - - see: - qh_test_appendmerge() - - design: - allocate merge entry - if regular merge - append to qh.facet_mergeset - else if degenerate merge and qh.facet_mergeset is all degenerate - append to qh.degen_mergeset - else if degenerate merge - prepend to qh.degen_mergeset - else if redundant merge - append to qh.degen_mergeset -*/ -void qh_appendmergeset(facetT *facet, facetT *neighbor, mergeType mergetype, realT *angle) { - mergeT *merge, *lastmerge; - void **freelistp; /* used !qh_NOmem */ - - if (facet->redundant) - return; - if (facet->degenerate && mergetype == MRGdegen) - return; - qh_memalloc_(sizeof(mergeT), freelistp, merge, mergeT); - merge->facet1= facet; - merge->facet2= neighbor; - merge->type= mergetype; - if (angle && qh ANGLEmerge) - merge->angle= *angle; - if (mergetype < MRGdegen) - qh_setappend (&(qh facet_mergeset), merge); - else if (mergetype == MRGdegen) { - facet->degenerate= True; - if (!(lastmerge= (mergeT*)qh_setlast (qh degen_mergeset)) - || lastmerge->type == MRGdegen) - qh_setappend (&(qh degen_mergeset), merge); - else - qh_setaddnth (&(qh degen_mergeset), 0, merge); - }else if (mergetype == MRGredundant) { - facet->redundant= True; - qh_setappend (&(qh degen_mergeset), merge); - }else /* mergetype == MRGmirror */ { - if (facet->redundant || neighbor->redundant) { - fprintf(qh ferr, "qhull error (qh_appendmergeset): facet f%d or f%d is already a mirrored facet\n", - facet->id, neighbor->id); - qh_errexit2 (qh_ERRqhull, facet, neighbor); - } - if (!qh_setequal (facet->vertices, neighbor->vertices)) { - fprintf(qh ferr, "qhull error (qh_appendmergeset): mirrored facets f%d and f%d do not have the same vertices\n", - facet->id, neighbor->id); - qh_errexit2 (qh_ERRqhull, facet, neighbor); - } - facet->redundant= True; - neighbor->redundant= True; - qh_setappend (&(qh degen_mergeset), merge); - } -} /* appendmergeset */ - - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="basevertices">-</a> - - qh_basevertices( samecycle ) - return temporary set of base vertices for samecycle - samecycle is first facet in the cycle - assumes apex is SETfirst_( samecycle->vertices ) - - returns: - vertices (settemp) - all ->seen are cleared - - notes: - uses qh_vertex_visit; - - design: - for each facet in samecycle - for each unseen vertex in facet->vertices - append to result -*/ -setT *qh_basevertices (facetT *samecycle) { - facetT *same; - vertexT *apex, *vertex, **vertexp; - setT *vertices= qh_settemp (qh TEMPsize); - - apex= SETfirstt_(samecycle->vertices, vertexT); - apex->visitid= ++qh vertex_visit; - FORALLsame_cycle_(samecycle) { - if (same->mergeridge) - continue; - FOREACHvertex_(same->vertices) { - if (vertex->visitid != qh vertex_visit) { - qh_setappend (&vertices, vertex); - vertex->visitid= qh vertex_visit; - vertex->seen= False; - } - } - } - trace4((qh ferr, "qh_basevertices: found %d vertices\n", - qh_setsize (vertices))); - return vertices; -} /* basevertices */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="checkconnect">-</a> - - qh_checkconnect() - check that new facets are connected - new facets are on qh.newfacet_list - - notes: - this is slow and it changes the order of the facets - uses qh.visit_id - - design: - move first new facet to end of qh.facet_list - for all newly appended facets - append unvisited neighbors to end of qh.facet_list - for all new facets - report error if unvisited -*/ -void qh_checkconnect (void /* qh newfacet_list */) { - facetT *facet, *newfacet, *errfacet= NULL, *neighbor, **neighborp; - - facet= qh newfacet_list; - qh_removefacet (facet); - qh_appendfacet (facet); - facet->visitid= ++qh visit_id; - FORALLfacet_(facet) { - FOREACHneighbor_(facet) { - if (neighbor->visitid != qh visit_id) { - qh_removefacet (neighbor); - qh_appendfacet (neighbor); - neighbor->visitid= qh visit_id; - } - } - } - FORALLnew_facets { - if (newfacet->visitid == qh visit_id) - break; - fprintf(qh ferr, "qhull error: f%d is not attached to the new facets\n", - newfacet->id); - errfacet= newfacet; - } - if (errfacet) - qh_errexit (qh_ERRqhull, errfacet, NULL); -} /* checkconnect */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="checkzero">-</a> - - qh_checkzero( testall ) - check that facets are clearly convex for qh.DISTround with qh.MERGEexact - - if testall, - test all facets for qh.MERGEexact post-merging - else - test qh.newfacet_list - - if qh.MERGEexact, - allows coplanar ridges - skips convexity test while qh.ZEROall_ok - - returns: - True if all facets !flipped, !dupridge, normal - if all horizon facets are simplicial - if all vertices are clearly below neighbor - if all opposite vertices of horizon are below - clears qh.ZEROall_ok if any problems or coplanar facets - - notes: - uses qh.vertex_visit - horizon facets may define multiple new facets - - design: - for all facets in qh.newfacet_list or qh.facet_list - check for flagged faults (flipped, etc.) - for all facets in qh.newfacet_list or qh.facet_list - for each neighbor of facet - skip horizon facets for qh.newfacet_list - test the opposite vertex - if qh.newfacet_list - test the other vertices in the facet's horizon facet -*/ -boolT qh_checkzero (boolT testall) { - facetT *facet, *neighbor, **neighborp; - facetT *horizon, *facetlist; - int neighbor_i; - vertexT *vertex, **vertexp; - realT dist; - - if (testall) - facetlist= qh facet_list; - else { - facetlist= qh newfacet_list; - FORALLfacet_(facetlist) { - horizon= SETfirstt_(facet->neighbors, facetT); - if (!horizon->simplicial) - goto LABELproblem; - if (facet->flipped || facet->dupridge || !facet->normal) - goto LABELproblem; - } - if (qh MERGEexact && qh ZEROall_ok) { - trace2((qh ferr, "qh_checkzero: skip convexity check until first pre-merge\n")); - return True; - } - } - FORALLfacet_(facetlist) { - qh vertex_visit++; - neighbor_i= 0; - horizon= NULL; - FOREACHneighbor_(facet) { - if (!neighbor_i && !testall) { - horizon= neighbor; - neighbor_i++; - continue; /* horizon facet tested in qh_findhorizon */ - } - vertex= SETelemt_(facet->vertices, neighbor_i++, vertexT); - vertex->visitid= qh vertex_visit; - zzinc_(Zdistzero); - qh_distplane (vertex->point, neighbor, &dist); - if (dist >= -qh DISTround) { - qh ZEROall_ok= False; - if (!qh MERGEexact || testall || dist > qh DISTround) - goto LABELnonconvex; - } - } - if (!testall) { - FOREACHvertex_(horizon->vertices) { - if (vertex->visitid != qh vertex_visit) { - zzinc_(Zdistzero); - qh_distplane (vertex->point, facet, &dist); - if (dist >= -qh DISTround) { - qh ZEROall_ok= False; - if (!qh MERGEexact || dist > qh DISTround) - goto LABELnonconvex; - } - break; - } - } - } - } - trace2((qh ferr, "qh_checkzero: testall %d, facets are %s\n", testall, - (qh MERGEexact && !testall) ? - "not concave, flipped, or duplicate ridged" : "clearly convex")); - return True; - - LABELproblem: - qh ZEROall_ok= False; - trace2((qh ferr, "qh_checkzero: facet f%d needs pre-merging\n", - facet->id)); - return False; - - LABELnonconvex: - trace2((qh ferr, "qh_checkzero: facet f%d and f%d are not clearly convex. v%d dist %.2g\n", - facet->id, neighbor->id, vertex->id, dist)); - return False; -} /* checkzero */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="compareangle">-</a> - - qh_compareangle( angle1, angle2 ) - used by qsort() to order merges by angle -*/ -static int qh_compareangle(const void *p1, const void *p2) { - mergeT *a= *((mergeT **)p1), *b= *((mergeT **)p2); - - return ((a->angle > b->angle) ? 1 : -1); -} /* compareangle */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="comparemerge">-</a> - - qh_comparemerge( merge1, merge2 ) - used by qsort() to order merges -*/ -static int qh_comparemerge(const void *p1, const void *p2) { - mergeT *a= *((mergeT **)p1), *b= *((mergeT **)p2); - - return (a->type - b->type); -} /* comparemerge */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="comparevisit">-</a> - - qh_comparevisit( vertex1, vertex2 ) - used by qsort() to order vertices by their visitid -*/ -static int qh_comparevisit (const void *p1, const void *p2) { - vertexT *a= *((vertexT **)p1), *b= *((vertexT **)p2); - - return (a->visitid - b->visitid); -} /* comparevisit */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="copynonconvex">-</a> - - qh_copynonconvex( atridge ) - set non-convex flag on other ridges (if any) between same neighbors - - notes: - may be faster if use smaller ridge set - - design: - for each ridge of atridge's top facet - if ridge shares the same neighbor - set nonconvex flag -*/ -void qh_copynonconvex (ridgeT *atridge) { - facetT *facet, *otherfacet; - ridgeT *ridge, **ridgep; - - facet= atridge->top; - otherfacet= atridge->bottom; - FOREACHridge_(facet->ridges) { - if (otherfacet == otherfacet_(ridge, facet) && ridge != atridge) { - ridge->nonconvex= True; - trace4((qh ferr, "qh_copynonconvex: moved nonconvex flag from r%d to r%d\n", - atridge->id, ridge->id)); - break; - } - } -} /* copynonconvex */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="degen_redundant_facet">-</a> - - qh_degen_redundant_facet( facet ) - check facet for degen. or redundancy - - notes: - bumps vertex_visit - called if a facet was redundant but no longer is (qh_merge_degenredundant) - qh_appendmergeset() only appends first reference to facet (i.e., redundant) - - see: - qh_degen_redundant_neighbors() - - design: - test for redundant neighbor - test for degenerate facet -*/ -void qh_degen_redundant_facet (facetT *facet) { - vertexT *vertex, **vertexp; - facetT *neighbor, **neighborp; - - trace4((qh ferr, "qh_degen_redundant_facet: test facet f%d for degen/redundant\n", - facet->id)); - FOREACHneighbor_(facet) { - qh vertex_visit++; - FOREACHvertex_(neighbor->vertices) - vertex->visitid= qh vertex_visit; - FOREACHvertex_(facet->vertices) { - if (vertex->visitid != qh vertex_visit) - break; - } - if (!vertex) { - qh_appendmergeset (facet, neighbor, MRGredundant, NULL); - trace2((qh ferr, "qh_degen_redundant_facet: f%d is contained in f%d. merge\n", facet->id, neighbor->id)); - return; - } - } - if (qh_setsize (facet->neighbors) < qh hull_dim) { - qh_appendmergeset (facet, facet, MRGdegen, NULL); - trace2((qh ferr, "qh_degen_redundant_neighbors: f%d is degenerate.\n", facet->id)); - } -} /* degen_redundant_facet */ - - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="degen_redundant_neighbors">-</a> - - qh_degen_redundant_neighbors( facet, delfacet, ) - append degenerate and redundant neighbors to facet_mergeset - if delfacet, - only checks neighbors of both delfacet and facet - also checks current facet for degeneracy - - notes: - bumps vertex_visit - called for each qh_mergefacet() and qh_mergecycle() - merge and statistics occur in merge_nonconvex - qh_appendmergeset() only appends first reference to facet (i.e., redundant) - it appends redundant facets after degenerate ones - - a degenerate facet has fewer than hull_dim neighbors - a redundant facet's vertices is a subset of its neighbor's vertices - tests for redundant merges first (appendmergeset is nop for others) - in a merge, only needs to test neighbors of merged facet - - see: - qh_merge_degenredundant() and qh_degen_redundant_facet() - - design: - test for degenerate facet - test for redundant neighbor - test for degenerate neighbor -*/ -void qh_degen_redundant_neighbors (facetT *facet, facetT *delfacet) { - vertexT *vertex, **vertexp; - facetT *neighbor, **neighborp; - int size; - - trace4((qh ferr, "qh_degen_redundant_neighbors: test neighbors of f%d with delfacet f%d\n", - facet->id, getid_(delfacet))); - if ((size= qh_setsize (facet->neighbors)) < qh hull_dim) { - qh_appendmergeset (facet, facet, MRGdegen, NULL); - trace2((qh ferr, "qh_degen_redundant_neighbors: f%d is degenerate with %d neighbors.\n", facet->id, size)); - } - if (!delfacet) - delfacet= facet; - qh vertex_visit++; - FOREACHvertex_(facet->vertices) - vertex->visitid= qh vertex_visit; - FOREACHneighbor_(delfacet) { - /* uses early out instead of checking vertex count */ - if (neighbor == facet) - continue; - FOREACHvertex_(neighbor->vertices) { - if (vertex->visitid != qh vertex_visit) - break; - } - if (!vertex) { - qh_appendmergeset (neighbor, facet, MRGredundant, NULL); - trace2((qh ferr, "qh_degen_redundant_neighbors: f%d is contained in f%d. merge\n", neighbor->id, facet->id)); - } - } - FOREACHneighbor_(delfacet) { /* redundant merges occur first */ - if (neighbor == facet) - continue; - if ((size= qh_setsize (neighbor->neighbors)) < qh hull_dim) { - qh_appendmergeset (neighbor, neighbor, MRGdegen, NULL); - trace2((qh ferr, "qh_degen_redundant_neighbors: f%d is degenerate with %d neighbors. Neighbor of f%d.\n", neighbor->id, size, facet->id)); - } - } -} /* degen_redundant_neighbors */ - - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="find_newvertex">-</a> - - qh_find_newvertex( oldvertex, vertices, ridges ) - locate new vertex for renaming old vertex - vertices is a set of possible new vertices - vertices sorted by number of deleted ridges - - returns: - newvertex or NULL - each ridge includes both vertex and oldvertex - vertices sorted by number of deleted ridges - - notes: - modifies vertex->visitid - new vertex is in one of the ridges - renaming will not cause a duplicate ridge - renaming will minimize the number of deleted ridges - newvertex may not be adjacent in the dual (though unlikely) - - design: - for each vertex in vertices - set vertex->visitid to number of references in ridges - remove unvisited vertices - set qh.vertex_visit above all possible values - sort vertices by number of references in ridges - add each ridge to qh.hash_table - for each vertex in vertices - look for a vertex that would not cause a duplicate ridge after a rename -*/ -vertexT *qh_find_newvertex (vertexT *oldvertex, setT *vertices, setT *ridges) { - vertexT *vertex, **vertexp; - setT *newridges; - ridgeT *ridge, **ridgep; - int size, hashsize; - int hash; - -#ifndef qh_NOtrace - if (qh IStracing >= 4) { - fprintf (qh ferr, "qh_find_newvertex: find new vertex for v%d from ", - oldvertex->id); - FOREACHvertex_(vertices) - fprintf (qh ferr, "v%d ", vertex->id); - FOREACHridge_(ridges) - fprintf (qh ferr, "r%d ", ridge->id); - fprintf (qh ferr, "\n"); - } -#endif - FOREACHvertex_(vertices) - vertex->visitid= 0; - FOREACHridge_(ridges) { - FOREACHvertex_(ridge->vertices) - vertex->visitid++; - } - FOREACHvertex_(vertices) { - if (!vertex->visitid) { - qh_setdelnth (vertices, SETindex_(vertices,vertex)); - vertexp--; /* repeat since deleted this vertex */ - } - } - qh vertex_visit += qh_setsize (ridges); - if (!qh_setsize (vertices)) { - trace4((qh ferr, "qh_find_newvertex: vertices not in ridges for v%d\n", - oldvertex->id)); - return NULL; - } - qsort (SETaddr_(vertices, vertexT), qh_setsize (vertices), - sizeof (vertexT *), qh_comparevisit); - /* can now use qh vertex_visit */ - if (qh PRINTstatistics) { - size= qh_setsize (vertices); - zinc_(Zintersect); - zadd_(Zintersecttot, size); - zmax_(Zintersectmax, size); - } - hashsize= qh_newhashtable (qh_setsize (ridges)); - FOREACHridge_(ridges) - qh_hashridge (qh hash_table, hashsize, ridge, oldvertex); - FOREACHvertex_(vertices) { - newridges= qh_vertexridges (vertex); - FOREACHridge_(newridges) { - if (qh_hashridge_find (qh hash_table, hashsize, ridge, vertex, oldvertex, &hash)) { - zinc_(Zdupridge); - break; - } - } - qh_settempfree (&newridges); - if (!ridge) - break; /* found a rename */ - } - if (vertex) { - /* counted in qh_renamevertex */ - trace2((qh ferr, "qh_find_newvertex: found v%d for old v%d from %d vertices and %d ridges.\n", - vertex->id, oldvertex->id, qh_setsize (vertices), qh_setsize (ridges))); - }else { - zinc_(Zfindfail); - trace0((qh ferr, "qh_find_newvertex: no vertex for renaming v%d (all duplicated ridges) during p%d\n", - oldvertex->id, qh furthest_id)); - } - qh_setfree (&qh hash_table); - return vertex; -} /* find_newvertex */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="findbest_test">-</a> - - qh_findbest_test( testcentrum, facet, neighbor, bestfacet, dist, mindist, maxdist ) - test neighbor of facet for qh_findbestneighbor() - if testcentrum, - tests centrum (assumes it is defined) - else - tests vertices - - returns: - if a better facet (i.e., vertices/centrum of facet closer to neighbor) - updates bestfacet, dist, mindist, and maxdist -*/ -void qh_findbest_test (boolT testcentrum, facetT *facet, facetT *neighbor, - facetT **bestfacet, realT *distp, realT *mindistp, realT *maxdistp) { - realT dist, mindist, maxdist; - - if (testcentrum) { - zzinc_(Zbestdist); - qh_distplane(facet->center, neighbor, &dist); - dist *= qh hull_dim; /* estimate furthest vertex */ - if (dist < 0) { - maxdist= 0; - mindist= dist; - dist= -dist; - }else - maxdist= dist; - }else - dist= qh_getdistance (facet, neighbor, &mindist, &maxdist); - if (dist < *distp) { - *bestfacet= neighbor; - *mindistp= mindist; - *maxdistp= maxdist; - *distp= dist; - } -} /* findbest_test */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="findbestneighbor">-</a> - - qh_findbestneighbor( facet, dist, mindist, maxdist ) - finds best neighbor (least dist) of a facet for merging - - returns: - returns min and max distances and their max absolute value - - notes: - avoids merging old into new - assumes ridge->nonconvex only set on one ridge between a pair of facets - could use an early out predicate but not worth it - - design: - if a large facet - will test centrum - else - will test vertices - if a large facet - test nonconvex neighbors for best merge - else - test all neighbors for the best merge - if testing centrum - get distance information -*/ -facetT *qh_findbestneighbor(facetT *facet, realT *distp, realT *mindistp, realT *maxdistp) { - facetT *neighbor, **neighborp, *bestfacet= NULL; - ridgeT *ridge, **ridgep; - boolT nonconvex= True, testcentrum= False; - int size= qh_setsize (facet->vertices); - - *distp= REALmax; - if (size > qh_BESTcentrum2 * qh hull_dim + qh_BESTcentrum) { - testcentrum= True; - zinc_(Zbestcentrum); - if (!facet->center) - facet->center= qh_getcentrum (facet); - } - if (size > qh hull_dim + qh_BESTnonconvex) { - FOREACHridge_(facet->ridges) { - if (ridge->nonconvex) { - neighbor= otherfacet_(ridge, facet); - qh_findbest_test (testcentrum, facet, neighbor, - &bestfacet, distp, mindistp, maxdistp); - } - } - } - if (!bestfacet) { - nonconvex= False; - FOREACHneighbor_(facet) - qh_findbest_test (testcentrum, facet, neighbor, - &bestfacet, distp, mindistp, maxdistp); - } - if (!bestfacet) { - fprintf (qh ferr, "qhull internal error (qh_findbestneighbor): no neighbors for f%d\n", facet->id); - - qh_errexit (qh_ERRqhull, facet, NULL); - } - if (testcentrum) - qh_getdistance (facet, bestfacet, mindistp, maxdistp); - trace3((qh ferr, "qh_findbestneighbor: f%d is best neighbor for f%d testcentrum? %d nonconvex? %d dist %2.2g min %2.2g max %2.2g\n", - bestfacet->id, facet->id, testcentrum, nonconvex, *distp, *mindistp, *maxdistp)); - return(bestfacet); -} /* findbestneighbor */ - - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="flippedmerges">-</a> - - qh_flippedmerges( facetlist, wasmerge ) - merge flipped facets into best neighbor - assumes qh.facet_mergeset at top of temporary stack - - returns: - no flipped facets on facetlist - sets wasmerge if merge occurred - degen/redundant merges passed through - - notes: - othermerges not needed since qh.facet_mergeset is empty before & after - keep it in case of change - - design: - append flipped facets to qh.facetmergeset - for each flipped merge - find best neighbor - merge facet into neighbor - merge degenerate and redundant facets - remove flipped merges from qh.facet_mergeset -*/ -void qh_flippedmerges(facetT *facetlist, boolT *wasmerge) { - facetT *facet, *neighbor, *facet1; - realT dist, mindist, maxdist; - mergeT *merge, **mergep; - setT *othermerges; - int nummerge=0; - - trace4((qh ferr, "qh_flippedmerges: begin\n")); - FORALLfacet_(facetlist) { - if (facet->flipped && !facet->visible) - qh_appendmergeset (facet, facet, MRGflip, NULL); - } - othermerges= qh_settemppop(); /* was facet_mergeset */ - qh facet_mergeset= qh_settemp (qh TEMPsize); - qh_settemppush (othermerges); - FOREACHmerge_(othermerges) { - facet1= merge->facet1; - if (merge->type != MRGflip || facet1->visible) - continue; - if (qh TRACEmerge-1 == zzval_(Ztotmerge)) - qhmem.IStracing= qh IStracing= qh TRACElevel; - neighbor= qh_findbestneighbor (facet1, &dist, &mindist, &maxdist); - trace0((qh ferr, "qh_flippedmerges: merge flipped f%d into f%d dist %2.2g during p%d\n", - facet1->id, neighbor->id, dist, qh furthest_id)); - qh_mergefacet (facet1, neighbor, &mindist, &maxdist, !qh_MERGEapex); - nummerge++; - if (qh PRINTstatistics) { - zinc_(Zflipped); - wadd_(Wflippedtot, dist); - wmax_(Wflippedmax, dist); - } - qh_merge_degenredundant(); - } - FOREACHmerge_(othermerges) { - if (merge->facet1->visible || merge->facet2->visible) - qh_memfree (merge, sizeof(mergeT)); - else - qh_setappend (&qh facet_mergeset, merge); - } - qh_settempfree (&othermerges); - if (nummerge) - *wasmerge= True; - trace1((qh ferr, "qh_flippedmerges: merged %d flipped facets into a good neighbor\n", nummerge)); -} /* flippedmerges */ - - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="forcedmerges">-</a> - - qh_forcedmerges( wasmerge ) - merge duplicated ridges - - returns: - removes all duplicate ridges on facet_mergeset - wasmerge set if merge - qh.facet_mergeset may include non-forced merges (none for now) - qh.degen_mergeset includes degen/redun merges - - notes: - duplicate ridges occur when the horizon is pinched, - i.e. a subridge occurs in more than two horizon ridges. - could rename vertices that pinch the horizon - assumes qh_merge_degenredundant() has not be called - othermerges isn't needed since facet_mergeset is empty afterwards - keep it in case of change - - design: - for each duplicate ridge - find current facets by chasing f.replace links - determine best direction for facet - merge one facet into the other - remove duplicate ridges from qh.facet_mergeset -*/ -void qh_forcedmerges(boolT *wasmerge) { - facetT *facet1, *facet2; - mergeT *merge, **mergep; - realT dist1, dist2, mindist1, mindist2, maxdist1, maxdist2; - setT *othermerges; - int nummerge=0, numflip=0; - - if (qh TRACEmerge-1 == zzval_(Ztotmerge)) - qhmem.IStracing= qh IStracing= qh TRACElevel; - trace4((qh ferr, "qh_forcedmerges: begin\n")); - othermerges= qh_settemppop(); /* was facet_mergeset */ - qh facet_mergeset= qh_settemp (qh TEMPsize); - qh_settemppush (othermerges); - FOREACHmerge_(othermerges) { - if (merge->type != MRGridge) - continue; - facet1= merge->facet1; - facet2= merge->facet2; - while (facet1->visible) /* must exist, no qh_merge_degenredunant */ - facet1= facet1->f.replace; /* previously merged facet */ - while (facet2->visible) - facet2= facet2->f.replace; /* previously merged facet */ - if (facet1 == facet2) - continue; - if (!qh_setin (facet2->neighbors, facet1)) { - fprintf (qh ferr, "qhull internal error (qh_forcedmerges): f%d and f%d had a duplicate ridge but as f%d and f%d they are no longer neighbors\n", - merge->facet1->id, merge->facet2->id, facet1->id, facet2->id); - qh_errexit2 (qh_ERRqhull, facet1, facet2); - } - if (qh TRACEmerge-1 == zzval_(Ztotmerge)) - qhmem.IStracing= qh IStracing= qh TRACElevel; - dist1= qh_getdistance (facet1, facet2, &mindist1, &maxdist1); - dist2= qh_getdistance (facet2, facet1, &mindist2, &maxdist2); - trace0((qh ferr, "qh_forcedmerges: duplicate ridge between f%d and f%d, dist %2.2g and reverse dist %2.2g during p%d\n", - facet1->id, facet2->id, dist1, dist2, qh furthest_id)); - if (dist1 < dist2) - qh_mergefacet (facet1, facet2, &mindist1, &maxdist1, !qh_MERGEapex); - else { - qh_mergefacet (facet2, facet1, &mindist2, &maxdist2, !qh_MERGEapex); - dist1= dist2; - facet1= facet2; - } - if (facet1->flipped) { - zinc_(Zmergeflipdup); - numflip++; - }else - nummerge++; - if (qh PRINTstatistics) { - zinc_(Zduplicate); - wadd_(Wduplicatetot, dist1); - wmax_(Wduplicatemax, dist1); - } - } - FOREACHmerge_(othermerges) { - if (merge->type == MRGridge) - qh_memfree (merge, sizeof(mergeT)); - else - qh_setappend (&qh facet_mergeset, merge); - } - qh_settempfree (&othermerges); - if (nummerge) - *wasmerge= True; - trace1((qh ferr, "qh_forcedmerges: merged %d facets and %d flipped facets across duplicated ridges\n", - nummerge, numflip)); -} /* forcedmerges */ - - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="getmergeset">-</a> - - qh_getmergeset( facetlist ) - determines nonconvex facets on facetlist - tests !tested ridges and nonconvex ridges of !tested facets - - returns: - returns sorted qh.facet_mergeset of facet-neighbor pairs to be merged - all ridges tested - - notes: - assumes no nonconvex ridges with both facets tested - uses facet->tested/ridge->tested to prevent duplicate tests - can not limit tests to modified ridges since the centrum changed - uses qh.visit_id - - see: - qh_getmergeset_initial() - - design: - for each facet on facetlist - for each ridge of facet - if untested ridge - test ridge for convexity - if non-convex - append ridge to qh.facet_mergeset - sort qh.facet_mergeset by angle -*/ -void qh_getmergeset(facetT *facetlist) { - facetT *facet, *neighbor, **neighborp; - ridgeT *ridge, **ridgep; - int nummerges; - - nummerges= qh_setsize (qh facet_mergeset); - trace4((qh ferr, "qh_getmergeset: started.\n")); - qh visit_id++; - FORALLfacet_(facetlist) { - if (facet->tested) - continue; - facet->visitid= qh visit_id; - facet->tested= True; /* must be non-simplicial due to merge */ - FOREACHneighbor_(facet) - neighbor->seen= False; - FOREACHridge_(facet->ridges) { - if (ridge->tested && !ridge->nonconvex) - continue; - /* if tested & nonconvex, need to append merge */ - neighbor= otherfacet_(ridge, facet); - if (neighbor->seen) { - ridge->tested= True; - ridge->nonconvex= False; - }else if (neighbor->visitid != qh visit_id) { - ridge->tested= True; - ridge->nonconvex= False; - neighbor->seen= True; /* only one ridge is marked nonconvex */ - if (qh_test_appendmerge (facet, neighbor)) - ridge->nonconvex= True; - } - } - } - nummerges= qh_setsize (qh facet_mergeset); - if (qh ANGLEmerge) - qsort(SETaddr_(qh facet_mergeset, mergeT), nummerges,sizeof(mergeT *),qh_compareangle); - else - qsort(SETaddr_(qh facet_mergeset, mergeT), nummerges,sizeof(mergeT *),qh_comparemerge); - if (qh POSTmerging) { - zadd_(Zmergesettot2, nummerges); - }else { - zadd_(Zmergesettot, nummerges); - zmax_(Zmergesetmax, nummerges); - } - trace2((qh ferr, "qh_getmergeset: %d merges found\n", nummerges)); -} /* getmergeset */ - - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="getmergeset_initial">-</a> - - qh_getmergeset_initial( facetlist ) - determine initial qh.facet_mergeset for facets - tests all facet/neighbor pairs on facetlist - - returns: - sorted qh.facet_mergeset with nonconvex ridges - sets facet->tested, ridge->tested, and ridge->nonconvex - - notes: - uses visit_id, assumes ridge->nonconvex is False - - see: - qh_getmergeset() - - design: - for each facet on facetlist - for each untested neighbor of facet - test facet and neighbor for convexity - if non-convex - append merge to qh.facet_mergeset - mark one of the ridges as nonconvex - sort qh.facet_mergeset by angle -*/ -void qh_getmergeset_initial (facetT *facetlist) { - facetT *facet, *neighbor, **neighborp; - ridgeT *ridge, **ridgep; - int nummerges; - - qh visit_id++; - FORALLfacet_(facetlist) { - facet->visitid= qh visit_id; - facet->tested= True; - FOREACHneighbor_(facet) { - if (neighbor->visitid != qh visit_id) { - if (qh_test_appendmerge (facet, neighbor)) { - FOREACHridge_(neighbor->ridges) { - if (facet == otherfacet_(ridge, neighbor)) { - ridge->nonconvex= True; - break; /* only one ridge is marked nonconvex */ - } - } - } - } - } - FOREACHridge_(facet->ridges) - ridge->tested= True; - } - nummerges= qh_setsize (qh facet_mergeset); - if (qh ANGLEmerge) - qsort(SETaddr_(qh facet_mergeset, mergeT), nummerges,sizeof(mergeT *),qh_compareangle); - else - qsort(SETaddr_(qh facet_mergeset, mergeT), nummerges,sizeof(mergeT *),qh_comparemerge); - if (qh POSTmerging) { - zadd_(Zmergeinittot2, nummerges); - }else { - zadd_(Zmergeinittot, nummerges); - zmax_(Zmergeinitmax, nummerges); - } - trace2((qh ferr, "qh_getmergeset_initial: %d merges found\n", nummerges)); -} /* getmergeset_initial */ - - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="hashridge">-</a> - - qh_hashridge( hashtable, hashsize, ridge, oldvertex ) - add ridge to hashtable without oldvertex - - notes: - assumes hashtable is large enough - - design: - determine hash value for ridge without oldvertex - find next empty slot for ridge -*/ -void qh_hashridge (setT *hashtable, int hashsize, ridgeT *ridge, vertexT *oldvertex) { - int hash; - ridgeT *ridgeA; - - hash= (int)qh_gethash (hashsize, ridge->vertices, qh hull_dim-1, 0, oldvertex); - while (True) { - if (!(ridgeA= SETelemt_(hashtable, hash, ridgeT))) { - SETelem_(hashtable, hash)= ridge; - break; - }else if (ridgeA == ridge) - break; - if (++hash == hashsize) - hash= 0; - } -} /* hashridge */ - - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="hashridge_find">-</a> - - qh_hashridge_find( hashtable, hashsize, ridge, vertex, oldvertex, hashslot ) - returns matching ridge without oldvertex in hashtable - for ridge without vertex - if oldvertex is NULL - matches with any one skip - - returns: - matching ridge or NULL - if no match, - if ridge already in table - hashslot= -1 - else - hashslot= next NULL index - - notes: - assumes hashtable is large enough - can't match ridge to itself - - design: - get hash value for ridge without vertex - for each hashslot - return match if ridge matches ridgeA without oldvertex -*/ -ridgeT *qh_hashridge_find (setT *hashtable, int hashsize, ridgeT *ridge, - vertexT *vertex, vertexT *oldvertex, int *hashslot) { - int hash; - ridgeT *ridgeA; - - *hashslot= 0; - zinc_(Zhashridge); - hash= (int)qh_gethash (hashsize, ridge->vertices, qh hull_dim-1, 0, vertex); - while ((ridgeA= SETelemt_(hashtable, hash, ridgeT))) { - if (ridgeA == ridge) - *hashslot= -1; - else { - zinc_(Zhashridgetest); - if (qh_setequal_except (ridge->vertices, vertex, ridgeA->vertices, oldvertex)) - return ridgeA; - } - if (++hash == hashsize) - hash= 0; - } - if (!*hashslot) - *hashslot= hash; - return NULL; -} /* hashridge_find */ - - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="makeridges">-</a> - - qh_makeridges( facet ) - creates explicit ridges between simplicial facets - - returns: - facet with ridges and without qh_MERGEridge - ->simplicial is False - - notes: - allows qh_MERGEridge flag - uses existing ridges - duplicate neighbors ok if ridges already exist (qh_mergecycle_ridges) - - see: - qh_mergecycle_ridges() - - design: - look for qh_MERGEridge neighbors - mark neighbors that already have ridges - for each unprocessed neighbor of facet - create a ridge for neighbor and facet - if any qh_MERGEridge neighbors - delete qh_MERGEridge flags (already handled by qh_mark_dupridges) -*/ -void qh_makeridges(facetT *facet) { - facetT *neighbor, **neighborp; - ridgeT *ridge, **ridgep; - int neighbor_i, neighbor_n; - boolT toporient, mergeridge= False; - - if (!facet->simplicial) - return; - trace4((qh ferr, "qh_makeridges: make ridges for f%d\n", facet->id)); - facet->simplicial= False; - FOREACHneighbor_(facet) { - if (neighbor == qh_MERGEridge) - mergeridge= True; - else - neighbor->seen= False; - } - FOREACHridge_(facet->ridges) - otherfacet_(ridge, facet)->seen= True; - FOREACHneighbor_i_(facet) { - if (neighbor == qh_MERGEridge) - continue; /* fixed by qh_mark_dupridges */ - else if (!neighbor->seen) { /* no current ridges */ - ridge= qh_newridge(); - ridge->vertices= qh_setnew_delnthsorted (facet->vertices, qh hull_dim, - neighbor_i, 0); - toporient= facet->toporient ^ (neighbor_i & 0x1); - if (toporient) { - ridge->top= facet; - ridge->bottom= neighbor; - }else { - ridge->top= neighbor; - ridge->bottom= facet; - } -#if 0 /* this also works */ - flip= (facet->toporient ^ neighbor->toporient)^(skip1 & 0x1) ^ (skip2 & 0x1); - if (facet->toporient ^ (skip1 & 0x1) ^ flip) { - ridge->top= neighbor; - ridge->bottom= facet; - }else { - ridge->top= facet; - ridge->bottom= neighbor; - } -#endif - qh_setappend(&(facet->ridges), ridge); - qh_setappend(&(neighbor->ridges), ridge); - } - } - if (mergeridge) { - while (qh_setdel (facet->neighbors, qh_MERGEridge)) - ; /* delete each one */ - } -} /* makeridges */ - - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="mark_dupridges">-</a> - - qh_mark_dupridges( facetlist ) - add duplicated ridges to qh.facet_mergeset - facet->dupridge is true - - returns: - duplicate ridges on qh.facet_mergeset - ->mergeridge/->mergeridge2 set - duplicate ridges marked by qh_MERGEridge and both sides facet->dupridge - no MERGEridges in neighbor sets - - notes: - duplicate ridges occur when the horizon is pinched, - i.e. a subridge occurs in more than two horizon ridges. - could rename vertices that pinch the horizon - uses qh.visit_id - - design: - for all facets on facetlist - if facet contains a duplicate ridge - for each neighbor of facet - if neighbor marked qh_MERGEridge (one side of the merge) - set facet->mergeridge - else - if neighbor contains a duplicate ridge - and the back link is qh_MERGEridge - append duplicate ridge to qh.facet_mergeset - for each duplicate ridge - make ridge sets in preparation for merging - remove qh_MERGEridge from neighbor set - for each duplicate ridge - restore the missing neighbor from the neighbor set that was qh_MERGEridge - add the missing ridge for this neighbor -*/ -void qh_mark_dupridges(facetT *facetlist) { - facetT *facet, *neighbor, **neighborp; - int nummerge=0; - mergeT *merge, **mergep; - - - trace4((qh ferr, "qh_mark_dupridges: identify duplicate ridges\n")); - FORALLfacet_(facetlist) { - if (facet->dupridge) { - FOREACHneighbor_(facet) { - if (neighbor == qh_MERGEridge) { - facet->mergeridge= True; - continue; - } - if (neighbor->dupridge - && !qh_setin (neighbor->neighbors, facet)) { /* qh_MERGEridge */ - qh_appendmergeset (facet, neighbor, MRGridge, NULL); - facet->mergeridge2= True; - facet->mergeridge= True; - nummerge++; - } - } - } - } - if (!nummerge) - return; - FORALLfacet_(facetlist) { /* gets rid of qh_MERGEridge */ - if (facet->mergeridge && !facet->mergeridge2) - qh_makeridges (facet); - } - FOREACHmerge_(qh facet_mergeset) { /* restore the missing neighbors */ - if (merge->type == MRGridge) { - qh_setappend (&merge->facet2->neighbors, merge->facet1); - qh_makeridges (merge->facet1); /* and the missing ridges */ - } - } - trace1((qh ferr, "qh_mark_dupridges: found %d duplicated ridges\n", - nummerge)); -} /* mark_dupridges */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="maydropneighbor">-</a> - - qh_maydropneighbor( facet ) - drop neighbor relationship if no ridge between facet and neighbor - - returns: - neighbor sets updated - appends degenerate facets to qh.facet_mergeset - - notes: - won't cause redundant facets since vertex inclusion is the same - may drop vertex and neighbor if no ridge - uses qh.visit_id - - design: - visit all neighbors with ridges - for each unvisited neighbor of facet - delete neighbor and facet from the neighbor sets - if neighbor becomes degenerate - append neighbor to qh.degen_mergeset - if facet is degenerate - append facet to qh.degen_mergeset -*/ -void qh_maydropneighbor (facetT *facet) { - ridgeT *ridge, **ridgep; - realT angledegen= qh_ANGLEdegen; - facetT *neighbor, **neighborp; - - qh visit_id++; - trace4((qh ferr, "qh_maydropneighbor: test f%d for no ridges to a neighbor\n", - facet->id)); - FOREACHridge_(facet->ridges) { - ridge->top->visitid= qh visit_id; - ridge->bottom->visitid= qh visit_id; - } - FOREACHneighbor_(facet) { - if (neighbor->visitid != qh visit_id) { - trace0((qh ferr, "qh_maydropneighbor: facets f%d and f%d are no longer neighbors during p%d\n", - facet->id, neighbor->id, qh furthest_id)); - zinc_(Zdropneighbor); - qh_setdel (facet->neighbors, neighbor); - neighborp--; /* repeat, deleted a neighbor */ - qh_setdel (neighbor->neighbors, facet); - if (qh_setsize (neighbor->neighbors) < qh hull_dim) { - zinc_(Zdropdegen); - qh_appendmergeset (neighbor, neighbor, MRGdegen, &angledegen); - trace2((qh ferr, "qh_maydropneighbors: f%d is degenerate.\n", neighbor->id)); - } - } - } - if (qh_setsize (facet->neighbors) < qh hull_dim) { - zinc_(Zdropdegen); - qh_appendmergeset (facet, facet, MRGdegen, &angledegen); - trace2((qh ferr, "qh_maydropneighbors: f%d is degenerate.\n", facet->id)); - } -} /* maydropneighbor */ - - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="merge_degenredundant">-</a> - - qh_merge_degenredundant() - merge all degenerate and redundant facets - qh.degen_mergeset contains merges from qh_degen_redundant_neighbors() - - returns: - number of merges performed - resets facet->degenerate/redundant - if deleted (visible) facet has no neighbors - sets ->f.replace to NULL - - notes: - redundant merges happen before degenerate ones - merging and renaming vertices can result in degen/redundant facets - - design: - for each merge on qh.degen_mergeset - if redundant merge - if non-redundant facet merged into redundant facet - recheck facet for redundancy - else - merge redundant facet into other facet -*/ -int qh_merge_degenredundant (void) { - int size; - mergeT *merge; - facetT *bestneighbor, *facet1, *facet2; - realT dist, mindist, maxdist; - vertexT *vertex, **vertexp; - int nummerges= 0; - mergeType mergetype; - - while ((merge= (mergeT*)qh_setdellast (qh degen_mergeset))) { - facet1= merge->facet1; - facet2= merge->facet2; - mergetype= merge->type; - qh_memfree (merge, sizeof(mergeT)); - if (facet1->visible) - continue; - facet1->degenerate= False; - facet1->redundant= False; - if (qh TRACEmerge-1 == zzval_(Ztotmerge)) - qhmem.IStracing= qh IStracing= qh TRACElevel; - if (mergetype == MRGredundant) { - zinc_(Zneighbor); - while (facet2->visible) { - if (!facet2->f.replace) { - fprintf (qh ferr, "qhull internal error (qh_merge_degenredunant): f%d redundant but f%d has no replacement\n", - facet1->id, facet2->id); - qh_errexit2 (qh_ERRqhull, facet1, facet2); - } - facet2= facet2->f.replace; - } - if (facet1 == facet2) { - qh_degen_redundant_facet (facet1); /* in case of others */ - continue; - } - trace2((qh ferr, "qh_merge_degenredundant: facet f%d is contained in f%d, will merge\n", - facet1->id, facet2->id)); - qh_mergefacet(facet1, facet2, NULL, NULL, !qh_MERGEapex); - /* merge distance is already accounted for */ - nummerges++; - }else { /* mergetype == MRGdegen, other merges may have fixed */ - if (!(size= qh_setsize (facet1->neighbors))) { - zinc_(Zdelfacetdup); - trace2((qh ferr, "qh_merge_degenredundant: facet f%d has no neighbors. Deleted\n", facet1->id)); - qh_willdelete (facet1, NULL); - FOREACHvertex_(facet1->vertices) { - qh_setdel (vertex->neighbors, facet1); - if (!SETfirst_(vertex->neighbors)) { - zinc_(Zdegenvertex); - trace2((qh ferr, "qh_merge_degenredundant: deleted v%d because f%d has no neighbors\n", - vertex->id, facet1->id)); - vertex->deleted= True; - qh_setappend (&qh del_vertices, vertex); - } - } - nummerges++; - }else if (size < qh hull_dim) { - bestneighbor= qh_findbestneighbor(facet1, &dist, &mindist, &maxdist); - trace2((qh ferr, "qh_merge_degenredundant: facet f%d has %d neighbors, merge into f%d dist %2.2g\n", - facet1->id, size, bestneighbor->id, dist)); - qh_mergefacet(facet1, bestneighbor, &mindist, &maxdist, !qh_MERGEapex); - nummerges++; - if (qh PRINTstatistics) { - zinc_(Zdegen); - wadd_(Wdegentot, dist); - wmax_(Wdegenmax, dist); - } - } /* else, another merge fixed the degeneracy and redundancy tested */ - } - } - return nummerges; -} /* merge_degenredundant */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="merge_nonconvex">-</a> - - qh_merge_nonconvex( facet1, facet2, mergetype ) - remove non-convex ridge between facet1 into facet2 - mergetype gives why the facet's are non-convex - - returns: - merges one of the facets into the best neighbor - - design: - if one of the facets is a new facet - prefer merging new facet into old facet - find best neighbors for both facets - merge the nearest facet into its best neighbor - update the statistics -*/ -void qh_merge_nonconvex (facetT *facet1, facetT *facet2, mergeType mergetype) { - facetT *bestfacet, *bestneighbor, *neighbor; - realT dist, dist2, mindist, mindist2, maxdist, maxdist2; - - if (qh TRACEmerge-1 == zzval_(Ztotmerge)) - qhmem.IStracing= qh IStracing= qh TRACElevel; - trace3((qh ferr, "qh_merge_nonconvex: merge #%d for f%d and f%d type %d\n", - zzval_(Ztotmerge) + 1, facet1->id, facet2->id, mergetype)); - /* concave or coplanar */ - if (!facet1->newfacet) { - bestfacet= facet2; /* avoid merging old facet if new is ok */ - facet2= facet1; - facet1= bestfacet; - }else - bestfacet= facet1; - bestneighbor= qh_findbestneighbor(bestfacet, &dist, &mindist, &maxdist); - neighbor= qh_findbestneighbor(facet2, &dist2, &mindist2, &maxdist2); - if (dist < dist2) { - qh_mergefacet(bestfacet, bestneighbor, &mindist, &maxdist, !qh_MERGEapex); - }else if (qh AVOIDold && !facet2->newfacet - && ((mindist >= -qh MAXcoplanar && maxdist <= qh max_outside) - || dist * 1.5 < dist2)) { - zinc_(Zavoidold); - wadd_(Wavoidoldtot, dist); - wmax_(Wavoidoldmax, dist); - trace2((qh ferr, "qh_merge_nonconvex: avoid merging old facet f%d dist %2.2g. Use f%d dist %2.2g instead\n", - facet2->id, dist2, facet1->id, dist2)); - qh_mergefacet(bestfacet, bestneighbor, &mindist, &maxdist, !qh_MERGEapex); - }else { - qh_mergefacet(facet2, neighbor, &mindist2, &maxdist2, !qh_MERGEapex); - dist= dist2; - } - if (qh PRINTstatistics) { - if (mergetype == MRGanglecoplanar) { - zinc_(Zacoplanar); - wadd_(Wacoplanartot, dist); - wmax_(Wacoplanarmax, dist); - }else if (mergetype == MRGconcave) { - zinc_(Zconcave); - wadd_(Wconcavetot, dist); - wmax_(Wconcavemax, dist); - }else { /* MRGcoplanar */ - zinc_(Zcoplanar); - wadd_(Wcoplanartot, dist); - wmax_(Wcoplanarmax, dist); - } - } -} /* merge_nonconvex */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="mergecycle">-</a> - - qh_mergecycle( samecycle, newfacet ) - merge a cycle of facets starting at samecycle into a newfacet - newfacet is a horizon facet with ->normal - samecycle facets are simplicial from an apex - - returns: - initializes vertex neighbors on first merge - samecycle deleted (placed on qh.visible_list) - newfacet at end of qh.facet_list - deleted vertices on qh.del_vertices - - see: - qh_mergefacet() - called by qh_mergecycle_all() for multiple, same cycle facets - - design: - make vertex neighbors if necessary - make ridges for newfacet - merge neighbor sets of samecycle into newfacet - merge ridges of samecycle into newfacet - merge vertex neighbors of samecycle into newfacet - make apex of samecycle the apex of newfacet - if newfacet wasn't a new facet - add its vertices to qh.newvertex_list - delete samecycle facets a make newfacet a newfacet -*/ -void qh_mergecycle (facetT *samecycle, facetT *newfacet) { - int traceonce= False, tracerestore= 0; - vertexT *apex; -#ifndef qh_NOtrace - facetT *same; -#endif - - if (newfacet->tricoplanar) { - if (!qh TRInormals) { - fprintf (qh ferr, "qh_mergecycle: does not work for tricoplanar facets. Use option 'Q11'\n"); - qh_errexit (qh_ERRqhull, newfacet, NULL); - } - newfacet->tricoplanar= False; - newfacet->keepcentrum= False; - } - if (!qh VERTEXneighbors) - qh_vertexneighbors(); - zzinc_(Ztotmerge); - if (qh REPORTfreq2 && qh POSTmerging) { - if (zzval_(Ztotmerge) > qh mergereport + qh REPORTfreq2) - qh_tracemerging(); - } -#ifndef qh_NOtrace - if (qh TRACEmerge == zzval_(Ztotmerge)) - qhmem.IStracing= qh IStracing= qh TRACElevel; - trace2((qh ferr, "qh_mergecycle: merge #%d for facets from cycle f%d into coplanar horizon f%d\n", - zzval_(Ztotmerge), samecycle->id, newfacet->id)); - if (newfacet == qh tracefacet) { - tracerestore= qh IStracing; - qh IStracing= 4; - fprintf (qh ferr, "qh_mergecycle: ========= trace merge %d of samecycle %d into trace f%d, furthest is p%d\n", - zzval_(Ztotmerge), samecycle->id, newfacet->id, qh furthest_id); - traceonce= True; - } - if (qh IStracing >=4) { - fprintf (qh ferr, " same cycle:"); - FORALLsame_cycle_(samecycle) - fprintf(qh ferr, " f%d", same->id); - fprintf (qh ferr, "\n"); - } - if (qh IStracing >=4) - qh_errprint ("MERGING CYCLE", samecycle, newfacet, NULL, NULL); -#endif /* !qh_NOtrace */ - apex= SETfirstt_(samecycle->vertices, vertexT); - qh_makeridges (newfacet); - qh_mergecycle_neighbors (samecycle, newfacet); - qh_mergecycle_ridges (samecycle, newfacet); - qh_mergecycle_vneighbors (samecycle, newfacet); - if (SETfirstt_(newfacet->vertices, vertexT) != apex) - qh_setaddnth (&newfacet->vertices, 0, apex); /* apex has last id */ - if (!newfacet->newfacet) - qh_newvertices (newfacet->vertices); - qh_mergecycle_facets (samecycle, newfacet); - qh_tracemerge (samecycle, newfacet); - /* check for degen_redundant_neighbors after qh_forcedmerges() */ - if (traceonce) { - fprintf (qh ferr, "qh_mergecycle: end of trace facet\n"); - qh IStracing= tracerestore; - } -} /* mergecycle */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="mergecycle_all">-</a> - - qh_mergecycle_all( facetlist, wasmerge ) - merge all samecycles of coplanar facets into horizon - don't merge facets with ->mergeridge (these already have ->normal) - all facets are simplicial from apex - all facet->cycledone == False - - returns: - all newfacets merged into coplanar horizon facets - deleted vertices on qh.del_vertices - sets wasmerge if any merge - - see: - calls qh_mergecycle for multiple, same cycle facets - - design: - for each facet on facetlist - skip facets with duplicate ridges and normals - check that facet is in a samecycle (->mergehorizon) - if facet only member of samecycle - sets vertex->delridge for all vertices except apex - merge facet into horizon - else - mark all facets in samecycle - remove facets with duplicate ridges from samecycle - merge samecycle into horizon (deletes facets from facetlist) -*/ -void qh_mergecycle_all (facetT *facetlist, boolT *wasmerge) { - facetT *facet, *same, *prev, *horizon; - facetT *samecycle= NULL, *nextfacet, *nextsame; - vertexT *apex, *vertex, **vertexp; - int cycles=0, total=0, facets, nummerge; - - trace2((qh ferr, "qh_mergecycle_all: begin\n")); - for (facet= facetlist; facet && (nextfacet= facet->next); facet= nextfacet) { - if (facet->normal) - continue; - if (!facet->mergehorizon) { - fprintf (qh ferr, "qh_mergecycle_all: f%d without normal\n", facet->id); - qh_errexit (qh_ERRqhull, facet, NULL); - } - horizon= SETfirstt_(facet->neighbors, facetT); - if (facet->f.samecycle == facet) { - zinc_(Zonehorizon); - /* merge distance done in qh_findhorizon */ - apex= SETfirstt_(facet->vertices, vertexT); - FOREACHvertex_(facet->vertices) { - if (vertex != apex) - vertex->delridge= True; - } - horizon->f.newcycle= NULL; - qh_mergefacet (facet, horizon, NULL, NULL, qh_MERGEapex); - }else { - samecycle= facet; - facets= 0; - prev= facet; - for (same= facet->f.samecycle; same; /* FORALLsame_cycle_(facet) */ - same= (same == facet ? NULL :nextsame)) { /* ends at facet */ - nextsame= same->f.samecycle; - if (same->cycledone || same->visible) - qh_infiniteloop (same); - same->cycledone= True; - if (same->normal) { - prev->f.samecycle= same->f.samecycle; /* unlink ->mergeridge */ - same->f.samecycle= NULL; - }else { - prev= same; - facets++; - } - } - while (nextfacet && nextfacet->cycledone) /* will delete samecycle */ - nextfacet= nextfacet->next; - horizon->f.newcycle= NULL; - qh_mergecycle (samecycle, horizon); - nummerge= horizon->nummerge + facets; - if (nummerge > qh_MAXnummerge) - horizon->nummerge= qh_MAXnummerge; - else - horizon->nummerge= nummerge; - zzinc_(Zcyclehorizon); - total += facets; - zzadd_(Zcyclefacettot, facets); - zmax_(Zcyclefacetmax, facets); - } - cycles++; - } - if (cycles) - *wasmerge= True; - trace1((qh ferr, "qh_mergecycle_all: merged %d same cycles or facets into coplanar horizons\n", cycles)); -} /* mergecycle_all */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="mergecycle_facets">-</a> - - qh_mergecycle_facets( samecycle, newfacet ) - finish merge of samecycle into newfacet - - returns: - samecycle prepended to visible_list for later deletion and partitioning - each facet->f.replace == newfacet - - newfacet moved to end of qh.facet_list - makes newfacet a newfacet (get's facet1->id if it was old) - sets newfacet->newmerge - clears newfacet->center (unless merging into a large facet) - clears newfacet->tested and ridge->tested for facet1 - - adds neighboring facets to facet_mergeset if redundant or degenerate - - design: - make newfacet a new facet and set its flags - move samecycle facets to qh.visible_list for later deletion - unless newfacet is large - remove its centrum -*/ -void qh_mergecycle_facets (facetT *samecycle, facetT *newfacet) { - facetT *same, *next; - - trace4((qh ferr, "qh_mergecycle_facets: make newfacet new and samecycle deleted\n")); - qh_removefacet(newfacet); /* append as a newfacet to end of qh facet_list */ - qh_appendfacet(newfacet); - newfacet->newfacet= True; - newfacet->simplicial= False; - newfacet->newmerge= True; - - for (same= samecycle->f.samecycle; same; same= (same == samecycle ? NULL : next)) { - next= same->f.samecycle; /* reused by willdelete */ - qh_willdelete (same, newfacet); - } - if (newfacet->center - && qh_setsize (newfacet->vertices) <= qh hull_dim + qh_MAXnewcentrum) { - qh_memfree (newfacet->center, qh normal_size); - newfacet->center= NULL; - } - trace3((qh ferr, "qh_mergecycle_facets: merged facets from cycle f%d into f%d\n", - samecycle->id, newfacet->id)); -} /* mergecycle_facets */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="mergecycle_neighbors">-</a> - - qh_mergecycle_neighbors( samecycle, newfacet ) - add neighbors for samecycle facets to newfacet - - returns: - newfacet with updated neighbors and vice-versa - newfacet has ridges - all neighbors of newfacet marked with qh.visit_id - samecycle facets marked with qh.visit_id-1 - ridges updated for simplicial neighbors of samecycle with a ridge - - notes: - assumes newfacet not in samecycle - usually, samecycle facets are new, simplicial facets without internal ridges - not so if horizon facet is coplanar to two different samecycles - - see: - qh_mergeneighbors() - - design: - check samecycle - delete neighbors from newfacet that are also in samecycle - for each neighbor of a facet in samecycle - if neighbor is simplicial - if first visit - move the neighbor relation to newfacet - update facet links for its ridges - else - make ridges for neighbor - remove samecycle reference - else - update neighbor sets -*/ -void qh_mergecycle_neighbors(facetT *samecycle, facetT *newfacet) { - facetT *same, *neighbor, **neighborp; - int delneighbors= 0, newneighbors= 0; - unsigned int samevisitid; - ridgeT *ridge, **ridgep; - - samevisitid= ++qh visit_id; - FORALLsame_cycle_(samecycle) { - if (same->visitid == samevisitid || same->visible) - qh_infiniteloop (samecycle); - same->visitid= samevisitid; - } - newfacet->visitid= ++qh visit_id; - trace4((qh ferr, "qh_mergecycle_neighbors: delete shared neighbors from newfacet\n")); - FOREACHneighbor_(newfacet) { - if (neighbor->visitid == samevisitid) { - SETref_(neighbor)= NULL; /* samecycle neighbors deleted */ - delneighbors++; - }else - neighbor->visitid= qh visit_id; - } - qh_setcompact (newfacet->neighbors); - - trace4((qh ferr, "qh_mergecycle_neighbors: update neighbors\n")); - FORALLsame_cycle_(samecycle) { - FOREACHneighbor_(same) { - if (neighbor->visitid == samevisitid) - continue; - if (neighbor->simplicial) { - if (neighbor->visitid != qh visit_id) { - qh_setappend (&newfacet->neighbors, neighbor); - qh_setreplace (neighbor->neighbors, same, newfacet); - newneighbors++; - neighbor->visitid= qh visit_id; - FOREACHridge_(neighbor->ridges) { /* update ridge in case of qh_makeridges */ - if (ridge->top == same) { - ridge->top= newfacet; - break; - }else if (ridge->bottom == same) { - ridge->bottom= newfacet; - break; - } - } - }else { - qh_makeridges (neighbor); - qh_setdel (neighbor->neighbors, same); - /* same can't be horizon facet for neighbor */ - } - }else { /* non-simplicial neighbor */ - qh_setdel (neighbor->neighbors, same); - if (neighbor->visitid != qh visit_id) { - qh_setappend (&neighbor->neighbors, newfacet); - qh_setappend (&newfacet->neighbors, neighbor); - neighbor->visitid= qh visit_id; - newneighbors++; - } - } - } - } - trace2((qh ferr, "qh_mergecycle_neighbors: deleted %d neighbors and added %d\n", - delneighbors, newneighbors)); -} /* mergecycle_neighbors */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="mergecycle_ridges">-</a> - - qh_mergecycle_ridges( samecycle, newfacet ) - add ridges/neighbors for facets in samecycle to newfacet - all new/old neighbors of newfacet marked with qh.visit_id - facets in samecycle marked with qh.visit_id-1 - newfacet marked with qh.visit_id - - returns: - newfacet has merged ridges - - notes: - ridge already updated for simplicial neighbors of samecycle with a ridge - - see: - qh_mergeridges() - qh_makeridges() - - design: - remove ridges between newfacet and samecycle - for each facet in samecycle - for each ridge in facet - update facet pointers in ridge - skip ridges processed in qh_mergecycle_neighors - free ridges between newfacet and samecycle - free ridges between facets of samecycle (on 2nd visit) - append remaining ridges to newfacet - if simpilicial facet - for each neighbor of facet - if simplicial facet - and not samecycle facet or newfacet - make ridge between neighbor and newfacet -*/ -void qh_mergecycle_ridges(facetT *samecycle, facetT *newfacet) { - facetT *same, *neighbor= NULL; - int numold=0, numnew=0; - int neighbor_i, neighbor_n; - unsigned int samevisitid; - ridgeT *ridge, **ridgep; - boolT toporient; - void **freelistp; /* used !qh_NOmem */ - - trace4((qh ferr, "qh_mergecycle_ridges: delete shared ridges from newfacet\n")); - samevisitid= qh visit_id -1; - FOREACHridge_(newfacet->ridges) { - neighbor= otherfacet_(ridge, newfacet); - if (neighbor->visitid == samevisitid) - SETref_(ridge)= NULL; /* ridge free'd below */ - } - qh_setcompact (newfacet->ridges); - - trace4((qh ferr, "qh_mergecycle_ridges: add ridges to newfacet\n")); - FORALLsame_cycle_(samecycle) { - FOREACHridge_(same->ridges) { - if (ridge->top == same) { - ridge->top= newfacet; - neighbor= ridge->bottom; - }else if (ridge->bottom == same) { - ridge->bottom= newfacet; - neighbor= ridge->top; - }else if (ridge->top == newfacet || ridge->bottom == newfacet) { - qh_setappend (&newfacet->ridges, ridge); - numold++; /* already set by qh_mergecycle_neighbors */ - continue; - }else { - fprintf (qh ferr, "qhull internal error (qh_mergecycle_ridges): bad ridge r%d\n", ridge->id); - qh_errexit (qh_ERRqhull, NULL, ridge); - } - if (neighbor == newfacet) { - qh_setfree(&(ridge->vertices)); - qh_memfree_(ridge, sizeof(ridgeT), freelistp); - numold++; - }else if (neighbor->visitid == samevisitid) { - qh_setdel (neighbor->ridges, ridge); - qh_setfree(&(ridge->vertices)); - qh_memfree_(ridge, sizeof(ridgeT), freelistp); - numold++; - }else { - qh_setappend (&newfacet->ridges, ridge); - numold++; - } - } - if (same->ridges) - qh_settruncate (same->ridges, 0); - if (!same->simplicial) - continue; - FOREACHneighbor_i_(same) { /* note: !newfact->simplicial */ - if (neighbor->visitid != samevisitid && neighbor->simplicial) { - ridge= qh_newridge(); - ridge->vertices= qh_setnew_delnthsorted (same->vertices, qh hull_dim, - neighbor_i, 0); - toporient= same->toporient ^ (neighbor_i & 0x1); - if (toporient) { - ridge->top= newfacet; - ridge->bottom= neighbor; - }else { - ridge->top= neighbor; - ridge->bottom= newfacet; - } - qh_setappend(&(newfacet->ridges), ridge); - qh_setappend(&(neighbor->ridges), ridge); - numnew++; - } - } - } - - trace2((qh ferr, "qh_mergecycle_ridges: found %d old ridges and %d new ones\n", - numold, numnew)); -} /* mergecycle_ridges */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="mergecycle_vneighbors">-</a> - - qh_mergecycle_vneighbors( samecycle, newfacet ) - create vertex neighbors for newfacet from vertices of facets in samecycle - samecycle marked with visitid == qh.visit_id - 1 - - returns: - newfacet vertices with updated neighbors - marks newfacet with qh.visit_id-1 - deletes vertices that are merged away - sets delridge on all vertices (faster here than in mergecycle_ridges) - - see: - qh_mergevertex_neighbors() - - design: - for each vertex of samecycle facet - set vertex->delridge - delete samecycle facets from vertex neighbors - append newfacet to vertex neighbors - if vertex only in newfacet - delete it from newfacet - add it to qh.del_vertices for later deletion -*/ -void qh_mergecycle_vneighbors (facetT *samecycle, facetT *newfacet) { - facetT *neighbor, **neighborp; - unsigned int mergeid; - vertexT *vertex, **vertexp, *apex; - setT *vertices; - - trace4((qh ferr, "qh_mergecycle_vneighbors: update vertex neighbors for newfacet\n")); - mergeid= qh visit_id - 1; - newfacet->visitid= mergeid; - vertices= qh_basevertices (samecycle); /* temp */ - apex= SETfirstt_(samecycle->vertices, vertexT); - qh_setappend (&vertices, apex); - FOREACHvertex_(vertices) { - vertex->delridge= True; - FOREACHneighbor_(vertex) { - if (neighbor->visitid == mergeid) - SETref_(neighbor)= NULL; - } - qh_setcompact (vertex->neighbors); - qh_setappend (&vertex->neighbors, newfacet); - if (!SETsecond_(vertex->neighbors)) { - zinc_(Zcyclevertex); - trace2((qh ferr, "qh_mergecycle_vneighbors: deleted v%d when merging cycle f%d into f%d\n", - vertex->id, samecycle->id, newfacet->id)); - qh_setdelsorted (newfacet->vertices, vertex); - vertex->deleted= True; - qh_setappend (&qh del_vertices, vertex); - } - } - qh_settempfree (&vertices); - trace3((qh ferr, "qh_mergecycle_vneighbors: merged vertices from cycle f%d into f%d\n", - samecycle->id, newfacet->id)); -} /* mergecycle_vneighbors */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="mergefacet">-</a> - - qh_mergefacet( facet1, facet2, mindist, maxdist, mergeapex ) - merges facet1 into facet2 - mergeapex==qh_MERGEapex if merging new facet into coplanar horizon - - returns: - qh.max_outside and qh.min_vertex updated - initializes vertex neighbors on first merge - - returns: - facet2 contains facet1's vertices, neighbors, and ridges - facet2 moved to end of qh.facet_list - makes facet2 a newfacet - sets facet2->newmerge set - clears facet2->center (unless merging into a large facet) - clears facet2->tested and ridge->tested for facet1 - - facet1 prepended to visible_list for later deletion and partitioning - facet1->f.replace == facet2 - - adds neighboring facets to facet_mergeset if redundant or degenerate - - notes: - mindist/maxdist may be NULL - traces merge if fmax_(maxdist,-mindist) > TRACEdist - - see: - qh_mergecycle() - - design: - trace merge and check for degenerate simplex - make ridges for both facets - update qh.max_outside, qh.max_vertex, qh.min_vertex - update facet2->maxoutside and keepcentrum - update facet2->nummerge - update tested flags for facet2 - if facet1 is simplicial - merge facet1 into facet2 - else - merge facet1's neighbors into facet2 - merge facet1's ridges into facet2 - merge facet1's vertices into facet2 - merge facet1's vertex neighbors into facet2 - add facet2's vertices to qh.new_vertexlist - unless qh_MERGEapex - test facet2 for degenerate or redundant neighbors - move facet1 to qh.visible_list for later deletion - move facet2 to end of qh.newfacet_list -*/ -void qh_mergefacet(facetT *facet1, facetT *facet2, realT *mindist, realT *maxdist, boolT mergeapex) { - boolT traceonce= False; - vertexT *vertex, **vertexp; - int tracerestore=0, nummerge; - - if (facet1->tricoplanar || facet2->tricoplanar) { - if (!qh TRInormals) { - fprintf (qh ferr, "qh_mergefacet: does not work for tricoplanar facets. Use option 'Q11'\n"); - qh_errexit2 (qh_ERRqhull, facet1, facet2); - } - if (facet2->tricoplanar) { - facet2->tricoplanar= False; - facet2->keepcentrum= False; - } - } - zzinc_(Ztotmerge); - if (qh REPORTfreq2 && qh POSTmerging) { - if (zzval_(Ztotmerge) > qh mergereport + qh REPORTfreq2) - qh_tracemerging(); - } -#ifndef qh_NOtrace - if (qh build_cnt >= qh RERUN) { - if (mindist && (-*mindist > qh TRACEdist || *maxdist > qh TRACEdist)) { - tracerestore= 0; - qh IStracing= qh TRACElevel; - traceonce= True; - fprintf (qh ferr, "qh_mergefacet: ========= trace wide merge #%d (%2.2g) for f%d into f%d, last point was p%d\n", zzval_(Ztotmerge), - fmax_(-*mindist, *maxdist), facet1->id, facet2->id, qh furthest_id); - }else if (facet1 == qh tracefacet || facet2 == qh tracefacet) { - tracerestore= qh IStracing; - qh IStracing= 4; - traceonce= True; - fprintf (qh ferr, "qh_mergefacet: ========= trace merge #%d involving f%d, furthest is p%d\n", - zzval_(Ztotmerge), qh tracefacet_id, qh furthest_id); - } - } - if (qh IStracing >= 2) { - realT mergemin= -2; - realT mergemax= -2; - - if (mindist) { - mergemin= *mindist; - mergemax= *maxdist; - } - fprintf (qh ferr, "qh_mergefacet: #%d merge f%d into f%d, mindist= %2.2g, maxdist= %2.2g\n", - zzval_(Ztotmerge), facet1->id, facet2->id, mergemin, mergemax); - } -#endif /* !qh_NOtrace */ - if (facet1 == facet2 || facet1->visible || facet2->visible) { - fprintf (qh ferr, "qhull internal error (qh_mergefacet): either f%d and f%d are the same or one is a visible facet\n", - facet1->id, facet2->id); - qh_errexit2 (qh_ERRqhull, facet1, facet2); - } - if (qh num_facets - qh num_visible <= qh hull_dim + 1) { - fprintf(qh ferr, "\n\ -qhull precision error: Only %d facets remain. Can not merge another\n\ -pair. The input is too degenerate or the convexity constraints are\n\ -too strong.\n", qh hull_dim+1); - if (qh hull_dim >= 5 && !qh MERGEexact) - fprintf(qh ferr, "Option 'Qx' may avoid this problem.\n"); - qh_errexit(qh_ERRinput, NULL, NULL); - } - if (!qh VERTEXneighbors) - qh_vertexneighbors(); - qh_makeridges(facet1); - qh_makeridges(facet2); - if (qh IStracing >=4) - qh_errprint ("MERGING", facet1, facet2, NULL, NULL); - if (mindist) { - maximize_(qh max_outside, *maxdist); - maximize_(qh max_vertex, *maxdist); -#if qh_MAXoutside - maximize_(facet2->maxoutside, *maxdist); -#endif - minimize_(qh min_vertex, *mindist); - if (!facet2->keepcentrum - && (*maxdist > qh WIDEfacet || *mindist < -qh WIDEfacet)) { - facet2->keepcentrum= True; - zinc_(Zwidefacet); - } - } - nummerge= facet1->nummerge + facet2->nummerge + 1; - if (nummerge >= qh_MAXnummerge) - facet2->nummerge= qh_MAXnummerge; - else - facet2->nummerge= nummerge; - facet2->newmerge= True; - facet2->dupridge= False; - qh_updatetested (facet1, facet2); - if (qh hull_dim > 2 && qh_setsize (facet1->vertices) == qh hull_dim) - qh_mergesimplex (facet1, facet2, mergeapex); - else { - qh vertex_visit++; - FOREACHvertex_(facet2->vertices) - vertex->visitid= qh vertex_visit; - if (qh hull_dim == 2) - qh_mergefacet2d(facet1, facet2); - else { - qh_mergeneighbors(facet1, facet2); - qh_mergevertices(facet1->vertices, &facet2->vertices); - } - qh_mergeridges(facet1, facet2); - qh_mergevertex_neighbors(facet1, facet2); - if (!facet2->newfacet) - qh_newvertices (facet2->vertices); - } - if (!mergeapex) - qh_degen_redundant_neighbors (facet2, facet1); - if (facet2->coplanar || !facet2->newfacet) { - zinc_(Zmergeintohorizon); - }else if (!facet1->newfacet && facet2->newfacet) { - zinc_(Zmergehorizon); - }else { - zinc_(Zmergenew); - } - qh_willdelete (facet1, facet2); - qh_removefacet(facet2); /* append as a newfacet to end of qh facet_list */ - qh_appendfacet(facet2); - facet2->newfacet= True; - facet2->tested= False; - qh_tracemerge (facet1, facet2); - if (traceonce) { - fprintf (qh ferr, "qh_mergefacet: end of wide tracing\n"); - qh IStracing= tracerestore; - } -} /* mergefacet */ - - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="mergefacet2d">-</a> - - qh_mergefacet2d( facet1, facet2 ) - in 2d, merges neighbors and vertices of facet1 into facet2 - - returns: - build ridges for neighbors if necessary - facet2 looks like a simplicial facet except for centrum, ridges - neighbors are opposite the corresponding vertex - maintains orientation of facet2 - - notes: - qh_mergefacet() retains non-simplicial structures - they are not needed in 2d, but later routines may use them - preserves qh.vertex_visit for qh_mergevertex_neighbors() - - design: - get vertices and neighbors - determine new vertices and neighbors - set new vertices and neighbors and adjust orientation - make ridges for new neighbor if needed -*/ -void qh_mergefacet2d (facetT *facet1, facetT *facet2) { - vertexT *vertex1A, *vertex1B, *vertex2A, *vertex2B, *vertexA, *vertexB; - facetT *neighbor1A, *neighbor1B, *neighbor2A, *neighbor2B, *neighborA, *neighborB; - - vertex1A= SETfirstt_(facet1->vertices, vertexT); - vertex1B= SETsecondt_(facet1->vertices, vertexT); - vertex2A= SETfirstt_(facet2->vertices, vertexT); - vertex2B= SETsecondt_(facet2->vertices, vertexT); - neighbor1A= SETfirstt_(facet1->neighbors, facetT); - neighbor1B= SETsecondt_(facet1->neighbors, facetT); - neighbor2A= SETfirstt_(facet2->neighbors, facetT); - neighbor2B= SETsecondt_(facet2->neighbors, facetT); - if (vertex1A == vertex2A) { - vertexA= vertex1B; - vertexB= vertex2B; - neighborA= neighbor2A; - neighborB= neighbor1A; - }else if (vertex1A == vertex2B) { - vertexA= vertex1B; - vertexB= vertex2A; - neighborA= neighbor2B; - neighborB= neighbor1A; - }else if (vertex1B == vertex2A) { - vertexA= vertex1A; - vertexB= vertex2B; - neighborA= neighbor2A; - neighborB= neighbor1B; - }else { /* 1B == 2B */ - vertexA= vertex1A; - vertexB= vertex2A; - neighborA= neighbor2B; - neighborB= neighbor1B; - } - /* vertexB always from facet2, neighborB always from facet1 */ - if (vertexA->id > vertexB->id) { - SETfirst_(facet2->vertices)= vertexA; - SETsecond_(facet2->vertices)= vertexB; - if (vertexB == vertex2A) - facet2->toporient= !facet2->toporient; - SETfirst_(facet2->neighbors)= neighborA; - SETsecond_(facet2->neighbors)= neighborB; - }else { - SETfirst_(facet2->vertices)= vertexB; - SETsecond_(facet2->vertices)= vertexA; - if (vertexB == vertex2B) - facet2->toporient= !facet2->toporient; - SETfirst_(facet2->neighbors)= neighborB; - SETsecond_(facet2->neighbors)= neighborA; - } - qh_makeridges (neighborB); - qh_setreplace(neighborB->neighbors, facet1, facet2); - trace4((qh ferr, "qh_mergefacet2d: merged v%d and neighbor f%d of f%d into f%d\n", - vertexA->id, neighborB->id, facet1->id, facet2->id)); -} /* mergefacet2d */ - - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="mergeneighbors">-</a> - - qh_mergeneighbors( facet1, facet2 ) - merges the neighbors of facet1 into facet2 - - see: - qh_mergecycle_neighbors() - - design: - for each neighbor of facet1 - if neighbor is also a neighbor of facet2 - if neighbor is simpilicial - make ridges for later deletion as a degenerate facet - update its neighbor set - else - move the neighbor relation to facet2 - remove the neighbor relation for facet1 and facet2 -*/ -void qh_mergeneighbors(facetT *facet1, facetT *facet2) { - facetT *neighbor, **neighborp; - - trace4((qh ferr, "qh_mergeneighbors: merge neighbors of f%d and f%d\n", - facet1->id, facet2->id)); - qh visit_id++; - FOREACHneighbor_(facet2) { - neighbor->visitid= qh visit_id; - } - FOREACHneighbor_(facet1) { - if (neighbor->visitid == qh visit_id) { - if (neighbor->simplicial) /* is degen, needs ridges */ - qh_makeridges (neighbor); - if (SETfirstt_(neighbor->neighbors, facetT) != facet1) /*keep newfacet->horizon*/ - qh_setdel (neighbor->neighbors, facet1); - else { - qh_setdel(neighbor->neighbors, facet2); - qh_setreplace(neighbor->neighbors, facet1, facet2); - } - }else if (neighbor != facet2) { - qh_setappend(&(facet2->neighbors), neighbor); - qh_setreplace(neighbor->neighbors, facet1, facet2); - } - } - qh_setdel(facet1->neighbors, facet2); /* here for makeridges */ - qh_setdel(facet2->neighbors, facet1); -} /* mergeneighbors */ - - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="mergeridges">-</a> - - qh_mergeridges( facet1, facet2 ) - merges the ridge set of facet1 into facet2 - - returns: - may delete all ridges for a vertex - sets vertex->delridge on deleted ridges - - see: - qh_mergecycle_ridges() - - design: - delete ridges between facet1 and facet2 - mark (delridge) vertices on these ridges for later testing - for each remaining ridge - rename facet1 to facet2 -*/ -void qh_mergeridges(facetT *facet1, facetT *facet2) { - ridgeT *ridge, **ridgep; - vertexT *vertex, **vertexp; - - trace4((qh ferr, "qh_mergeridges: merge ridges of f%d and f%d\n", - facet1->id, facet2->id)); - FOREACHridge_(facet2->ridges) { - if ((ridge->top == facet1) || (ridge->bottom == facet1)) { - FOREACHvertex_(ridge->vertices) - vertex->delridge= True; - qh_delridge(ridge); /* expensive in high-d, could rebuild */ - ridgep--; /*repeat*/ - } - } - FOREACHridge_(facet1->ridges) { - if (ridge->top == facet1) - ridge->top= facet2; - else - ridge->bottom= facet2; - qh_setappend(&(facet2->ridges), ridge); - } -} /* mergeridges */ - - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="mergesimplex">-</a> - - qh_mergesimplex( facet1, facet2, mergeapex ) - merge simplicial facet1 into facet2 - mergeapex==qh_MERGEapex if merging samecycle into horizon facet - vertex id is latest (most recently created) - facet1 may be contained in facet2 - ridges exist for both facets - - returns: - facet2 with updated vertices, ridges, neighbors - updated neighbors for facet1's vertices - facet1 not deleted - sets vertex->delridge on deleted ridges - - notes: - special case code since this is the most common merge - called from qh_mergefacet() - - design: - if qh_MERGEapex - add vertices of facet2 to qh.new_vertexlist if necessary - add apex to facet2 - else - for each ridge between facet1 and facet2 - set vertex->delridge - determine the apex for facet1 (i.e., vertex to be merged) - unless apex already in facet2 - insert apex into vertices for facet2 - add vertices of facet2 to qh.new_vertexlist if necessary - add apex to qh.new_vertexlist if necessary - for each vertex of facet1 - if apex - rename facet1 to facet2 in its vertex neighbors - else - delete facet1 from vertex neighors - if only in facet2 - add vertex to qh.del_vertices for later deletion - for each ridge of facet1 - delete ridges between facet1 and facet2 - append other ridges to facet2 after renaming facet to facet2 -*/ -void qh_mergesimplex(facetT *facet1, facetT *facet2, boolT mergeapex) { - vertexT *vertex, **vertexp, *apex; - ridgeT *ridge, **ridgep; - boolT issubset= False; - int vertex_i= -1, vertex_n; - facetT *neighbor, **neighborp, *otherfacet; - - if (mergeapex) { - if (!facet2->newfacet) - qh_newvertices (facet2->vertices); /* apex is new */ - apex= SETfirstt_(facet1->vertices, vertexT); - if (SETfirstt_(facet2->vertices, vertexT) != apex) - qh_setaddnth (&facet2->vertices, 0, apex); /* apex has last id */ - else - issubset= True; - }else { - zinc_(Zmergesimplex); - FOREACHvertex_(facet1->vertices) - vertex->seen= False; - FOREACHridge_(facet1->ridges) { - if (otherfacet_(ridge, facet1) == facet2) { - FOREACHvertex_(ridge->vertices) { - vertex->seen= True; - vertex->delridge= True; - } - break; - } - } - FOREACHvertex_(facet1->vertices) { - if (!vertex->seen) - break; /* must occur */ - } - apex= vertex; - trace4((qh ferr, "qh_mergesimplex: merge apex v%d of f%d into facet f%d\n", - apex->id, facet1->id, facet2->id)); - FOREACHvertex_i_(facet2->vertices) { - if (vertex->id < apex->id) { - break; - }else if (vertex->id == apex->id) { - issubset= True; - break; - } - } - if (!issubset) - qh_setaddnth (&facet2->vertices, vertex_i, apex); - if (!facet2->newfacet) - qh_newvertices (facet2->vertices); - else if (!apex->newlist) { - qh_removevertex (apex); - qh_appendvertex (apex); - } - } - trace4((qh ferr, "qh_mergesimplex: update vertex neighbors of f%d\n", - facet1->id)); - FOREACHvertex_(facet1->vertices) { - if (vertex == apex && !issubset) - qh_setreplace (vertex->neighbors, facet1, facet2); - else { - qh_setdel (vertex->neighbors, facet1); - if (!SETsecond_(vertex->neighbors)) - qh_mergevertex_del (vertex, facet1, facet2); - } - } - trace4((qh ferr, "qh_mergesimplex: merge ridges and neighbors of f%d into f%d\n", - facet1->id, facet2->id)); - qh visit_id++; - FOREACHneighbor_(facet2) - neighbor->visitid= qh visit_id; - FOREACHridge_(facet1->ridges) { - otherfacet= otherfacet_(ridge, facet1); - if (otherfacet == facet2) { - qh_setdel (facet2->ridges, ridge); - qh_setfree(&(ridge->vertices)); - qh_memfree (ridge, sizeof(ridgeT)); - qh_setdel (facet2->neighbors, facet1); - }else { - qh_setappend (&facet2->ridges, ridge); - if (otherfacet->visitid != qh visit_id) { - qh_setappend (&facet2->neighbors, otherfacet); - qh_setreplace (otherfacet->neighbors, facet1, facet2); - otherfacet->visitid= qh visit_id; - }else { - if (otherfacet->simplicial) /* is degen, needs ridges */ - qh_makeridges (otherfacet); - if (SETfirstt_(otherfacet->neighbors, facetT) != facet1) - qh_setdel (otherfacet->neighbors, facet1); - else { /*keep newfacet->neighbors->horizon*/ - qh_setdel(otherfacet->neighbors, facet2); - qh_setreplace(otherfacet->neighbors, facet1, facet2); - } - } - if (ridge->top == facet1) /* wait until after qh_makeridges */ - ridge->top= facet2; - else - ridge->bottom= facet2; - } - } - SETfirst_(facet1->ridges)= NULL; /* it will be deleted */ - trace3((qh ferr, "qh_mergesimplex: merged simplex f%d apex v%d into facet f%d\n", - facet1->id, getid_(apex), facet2->id)); -} /* mergesimplex */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="mergevertex_del">-</a> - - qh_mergevertex_del( vertex, facet1, facet2 ) - delete a vertex because of merging facet1 into facet2 - - returns: - deletes vertex from facet2 - adds vertex to qh.del_vertices for later deletion -*/ -void qh_mergevertex_del (vertexT *vertex, facetT *facet1, facetT *facet2) { - - zinc_(Zmergevertex); - trace2((qh ferr, "qh_mergevertex_del: deleted v%d when merging f%d into f%d\n", - vertex->id, facet1->id, facet2->id)); - qh_setdelsorted (facet2->vertices, vertex); - vertex->deleted= True; - qh_setappend (&qh del_vertices, vertex); -} /* mergevertex_del */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="mergevertex_neighbors">-</a> - - qh_mergevertex_neighbors( facet1, facet2 ) - merge the vertex neighbors of facet1 to facet2 - - returns: - if vertex is current qh.vertex_visit - deletes facet1 from vertex->neighbors - else - renames facet1 to facet2 in vertex->neighbors - deletes vertices if only one neighbor - - notes: - assumes vertex neighbor sets are good -*/ -void qh_mergevertex_neighbors(facetT *facet1, facetT *facet2) { - vertexT *vertex, **vertexp; - - trace4((qh ferr, "qh_mergevertex_neighbors: merge vertex neighbors of f%d and f%d\n", - facet1->id, facet2->id)); - if (qh tracevertex) { - fprintf (qh ferr, "qh_mergevertex_neighbors: of f%d and f%d at furthest p%d f0= %p\n", - facet1->id, facet2->id, qh furthest_id, qh tracevertex->neighbors->e[0].p); - qh_errprint ("TRACE", NULL, NULL, NULL, qh tracevertex); - } - FOREACHvertex_(facet1->vertices) { - if (vertex->visitid != qh vertex_visit) - qh_setreplace(vertex->neighbors, facet1, facet2); - else { - qh_setdel(vertex->neighbors, facet1); - if (!SETsecond_(vertex->neighbors)) - qh_mergevertex_del (vertex, facet1, facet2); - } - } - if (qh tracevertex) - qh_errprint ("TRACE", NULL, NULL, NULL, qh tracevertex); -} /* mergevertex_neighbors */ - - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="mergevertices">-</a> - - qh_mergevertices( vertices1, vertices2 ) - merges the vertex set of facet1 into facet2 - - returns: - replaces vertices2 with merged set - preserves vertex_visit for qh_mergevertex_neighbors - updates qh.newvertex_list - - design: - create a merged set of both vertices (in inverse id order) -*/ -void qh_mergevertices(setT *vertices1, setT **vertices2) { - int newsize= qh_setsize(vertices1)+qh_setsize(*vertices2) - qh hull_dim + 1; - setT *mergedvertices; - vertexT *vertex, **vertexp, **vertex2= SETaddr_(*vertices2, vertexT); - - mergedvertices= qh_settemp (newsize); - FOREACHvertex_(vertices1) { - if (!*vertex2 || vertex->id > (*vertex2)->id) - qh_setappend (&mergedvertices, vertex); - else { - while (*vertex2 && (*vertex2)->id > vertex->id) - qh_setappend (&mergedvertices, *vertex2++); - if (!*vertex2 || (*vertex2)->id < vertex->id) - qh_setappend (&mergedvertices, vertex); - else - qh_setappend (&mergedvertices, *vertex2++); - } - } - while (*vertex2) - qh_setappend (&mergedvertices, *vertex2++); - if (newsize < qh_setsize (mergedvertices)) { - fprintf (qh ferr, "qhull internal error (qh_mergevertices): facets did not share a ridge\n"); - qh_errexit (qh_ERRqhull, NULL, NULL); - } - qh_setfree(vertices2); - *vertices2= mergedvertices; - qh_settemppop (); -} /* mergevertices */ - - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="neighbor_intersections">-</a> - - qh_neighbor_intersections( vertex ) - return intersection of all vertices in vertex->neighbors except for vertex - - returns: - returns temporary set of vertices - does not include vertex - NULL if a neighbor is simplicial - NULL if empty set - - notes: - used for renaming vertices - - design: - initialize the intersection set with vertices of the first two neighbors - delete vertex from the intersection - for each remaining neighbor - intersect its vertex set with the intersection set - return NULL if empty - return the intersection set -*/ -setT *qh_neighbor_intersections (vertexT *vertex) { - facetT *neighbor, **neighborp, *neighborA, *neighborB; - setT *intersect; - int neighbor_i, neighbor_n; - - FOREACHneighbor_(vertex) { - if (neighbor->simplicial) - return NULL; - } - neighborA= SETfirstt_(vertex->neighbors, facetT); - neighborB= SETsecondt_(vertex->neighbors, facetT); - zinc_(Zintersectnum); - if (!neighborA) - return NULL; - if (!neighborB) - intersect= qh_setcopy (neighborA->vertices, 0); - else - intersect= qh_vertexintersect_new (neighborA->vertices, neighborB->vertices); - qh_settemppush (intersect); - qh_setdelsorted (intersect, vertex); - FOREACHneighbor_i_(vertex) { - if (neighbor_i >= 2) { - zinc_(Zintersectnum); - qh_vertexintersect (&intersect, neighbor->vertices); - if (!SETfirst_(intersect)) { - zinc_(Zintersectfail); - qh_settempfree (&intersect); - return NULL; - } - } - } - trace3((qh ferr, "qh_neighbor_intersections: %d vertices in neighbor intersection of v%d\n", - qh_setsize (intersect), vertex->id)); - return intersect; -} /* neighbor_intersections */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="newvertices">-</a> - - qh_newvertices( vertices ) - add vertices to end of qh.vertex_list (marks as new vertices) - - returns: - vertices on qh.newvertex_list - vertex->newlist set -*/ -void qh_newvertices (setT *vertices) { - vertexT *vertex, **vertexp; - - FOREACHvertex_(vertices) { - if (!vertex->newlist) { - qh_removevertex (vertex); - qh_appendvertex (vertex); - } - } -} /* newvertices */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="reducevertices">-</a> - - qh_reducevertices() - reduce extra vertices, shared vertices, and redundant vertices - facet->newmerge is set if merged since last call - if !qh.MERGEvertices, only removes extra vertices - - returns: - True if also merged degen_redundant facets - vertices are renamed if possible - clears facet->newmerge and vertex->delridge - - notes: - ignored if 2-d - - design: - merge any degenerate or redundant facets - for each newly merged facet - remove extra vertices - if qh.MERGEvertices - for each newly merged facet - for each vertex - if vertex was on a deleted ridge - rename vertex if it is shared - remove delridge flag from new vertices -*/ -boolT qh_reducevertices (void) { - int numshare=0, numrename= 0; - boolT degenredun= False; - facetT *newfacet; - vertexT *vertex, **vertexp; - - if (qh hull_dim == 2) - return False; - if (qh_merge_degenredundant()) - degenredun= True; - LABELrestart: - FORALLnew_facets { - if (newfacet->newmerge) { - if (!qh MERGEvertices) - newfacet->newmerge= False; - qh_remove_extravertices (newfacet); - } - } - if (!qh MERGEvertices) - return False; - FORALLnew_facets { - if (newfacet->newmerge) { - newfacet->newmerge= False; - FOREACHvertex_(newfacet->vertices) { - if (vertex->delridge) { - if (qh_rename_sharedvertex (vertex, newfacet)) { - numshare++; - vertexp--; /* repeat since deleted vertex */ - } - } - } - } - } - FORALLvertex_(qh newvertex_list) { - if (vertex->delridge && !vertex->deleted) { - vertex->delridge= False; - if (qh hull_dim >= 4 && qh_redundant_vertex (vertex)) { - numrename++; - if (qh_merge_degenredundant()) { - degenredun= True; - goto LABELrestart; - } - } - } - } - trace1((qh ferr, "qh_reducevertices: renamed %d shared vertices and %d redundant vertices. Degen? %d\n", - numshare, numrename, degenredun)); - return degenredun; -} /* reducevertices */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="redundant_vertex">-</a> - - qh_redundant_vertex( vertex ) - detect and rename a redundant vertex - vertices have full vertex->neighbors - - returns: - returns true if find a redundant vertex - deletes vertex (vertex->deleted) - - notes: - only needed if vertex->delridge and hull_dim >= 4 - may add degenerate facets to qh.facet_mergeset - doesn't change vertex->neighbors or create redundant facets - - design: - intersect vertices of all facet neighbors of vertex - determine ridges for these vertices - if find a new vertex for vertex amoung these ridges and vertices - rename vertex to the new vertex -*/ -vertexT *qh_redundant_vertex (vertexT *vertex) { - vertexT *newvertex= NULL; - setT *vertices, *ridges; - - trace3((qh ferr, "qh_redundant_vertex: check if v%d can be renamed\n", vertex->id)); - if ((vertices= qh_neighbor_intersections (vertex))) { - ridges= qh_vertexridges (vertex); - if ((newvertex= qh_find_newvertex (vertex, vertices, ridges))) - qh_renamevertex (vertex, newvertex, ridges, NULL, NULL); - qh_settempfree (&ridges); - qh_settempfree (&vertices); - } - return newvertex; -} /* redundant_vertex */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="remove_extravertices">-</a> - - qh_remove_extravertices( facet ) - remove extra vertices from non-simplicial facets - - returns: - returns True if it finds them - - design: - for each vertex in facet - if vertex not in a ridge (i.e., no longer used) - delete vertex from facet - delete facet from vertice's neighbors - unless vertex in another facet - add vertex to qh.del_vertices for later deletion -*/ -boolT qh_remove_extravertices (facetT *facet) { - ridgeT *ridge, **ridgep; - vertexT *vertex, **vertexp; - boolT foundrem= False; - - trace4((qh ferr, "qh_remove_extravertices: test f%d for extra vertices\n", - facet->id)); - FOREACHvertex_(facet->vertices) - vertex->seen= False; - FOREACHridge_(facet->ridges) { - FOREACHvertex_(ridge->vertices) - vertex->seen= True; - } - FOREACHvertex_(facet->vertices) { - if (!vertex->seen) { - foundrem= True; - zinc_(Zremvertex); - qh_setdelsorted (facet->vertices, vertex); - qh_setdel (vertex->neighbors, facet); - if (!qh_setsize (vertex->neighbors)) { - vertex->deleted= True; - qh_setappend (&qh del_vertices, vertex); - zinc_(Zremvertexdel); - trace2((qh ferr, "qh_remove_extravertices: v%d deleted because it's lost all ridges\n", vertex->id)); - }else - trace3((qh ferr, "qh_remove_extravertices: v%d removed from f%d because it's lost all ridges\n", vertex->id, facet->id)); - vertexp--; /*repeat*/ - } - } - return foundrem; -} /* remove_extravertices */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="rename_sharedvertex">-</a> - - qh_rename_sharedvertex( vertex, facet ) - detect and rename if shared vertex in facet - vertices have full ->neighbors - - returns: - newvertex or NULL - the vertex may still exist in other facets (i.e., a neighbor was pinched) - does not change facet->neighbors - updates vertex->neighbors - - notes: - a shared vertex for a facet is only in ridges to one neighbor - this may undo a pinched facet - - it does not catch pinches involving multiple facets. These appear - to be difficult to detect, since an exhaustive search is too expensive. - - design: - if vertex only has two neighbors - determine the ridges that contain the vertex - determine the vertices shared by both neighbors - if can find a new vertex in this set - rename the vertex to the new vertex -*/ -vertexT *qh_rename_sharedvertex (vertexT *vertex, facetT *facet) { - facetT *neighbor, **neighborp, *neighborA= NULL; - setT *vertices, *ridges; - vertexT *newvertex; - - if (qh_setsize (vertex->neighbors) == 2) { - neighborA= SETfirstt_(vertex->neighbors, facetT); - if (neighborA == facet) - neighborA= SETsecondt_(vertex->neighbors, facetT); - }else if (qh hull_dim == 3) - return NULL; - else { - qh visit_id++; - FOREACHneighbor_(facet) - neighbor->visitid= qh visit_id; - FOREACHneighbor_(vertex) { - if (neighbor->visitid == qh visit_id) { - if (neighborA) - return NULL; - neighborA= neighbor; - } - } - if (!neighborA) { - fprintf (qh ferr, "qhull internal error (qh_rename_sharedvertex): v%d's neighbors not in f%d\n", - vertex->id, facet->id); - qh_errprint ("ERRONEOUS", facet, NULL, NULL, vertex); - qh_errexit (qh_ERRqhull, NULL, NULL); - } - } - /* the vertex is shared by facet and neighborA */ - ridges= qh_settemp (qh TEMPsize); - neighborA->visitid= ++qh visit_id; - qh_vertexridges_facet (vertex, facet, &ridges); - trace2((qh ferr, "qh_rename_sharedvertex: p%d (v%d) is shared by f%d (%d ridges) and f%d\n", - qh_pointid(vertex->point), vertex->id, facet->id, qh_setsize (ridges), neighborA->id)); - zinc_(Zintersectnum); - vertices= qh_vertexintersect_new (facet->vertices, neighborA->vertices); - qh_setdel (vertices, vertex); - qh_settemppush (vertices); - if ((newvertex= qh_find_newvertex (vertex, vertices, ridges))) - qh_renamevertex (vertex, newvertex, ridges, facet, neighborA); - qh_settempfree (&vertices); - qh_settempfree (&ridges); - return newvertex; -} /* rename_sharedvertex */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="renameridgevertex">-</a> - - qh_renameridgevertex( ridge, oldvertex, newvertex ) - renames oldvertex as newvertex in ridge - - returns: - - design: - delete oldvertex from ridge - if newvertex already in ridge - copy ridge->noconvex to another ridge if possible - delete the ridge - else - insert newvertex into the ridge - adjust the ridge's orientation -*/ -void qh_renameridgevertex(ridgeT *ridge, vertexT *oldvertex, vertexT *newvertex) { - int nth= 0, oldnth; - facetT *temp; - vertexT *vertex, **vertexp; - - oldnth= qh_setindex (ridge->vertices, oldvertex); - qh_setdelnthsorted (ridge->vertices, oldnth); - FOREACHvertex_(ridge->vertices) { - if (vertex == newvertex) { - zinc_(Zdelridge); - if (ridge->nonconvex) /* only one ridge has nonconvex set */ - qh_copynonconvex (ridge); - qh_delridge (ridge); - trace2((qh ferr, "qh_renameridgevertex: ridge r%d deleted. It contained both v%d and v%d\n", - ridge->id, oldvertex->id, newvertex->id)); - return; - } - if (vertex->id < newvertex->id) - break; - nth++; - } - qh_setaddnth(&ridge->vertices, nth, newvertex); - if (abs(oldnth - nth)%2) { - trace3((qh ferr, "qh_renameridgevertex: swapped the top and bottom of ridge r%d\n", - ridge->id)); - temp= ridge->top; - ridge->top= ridge->bottom; - ridge->bottom= temp; - } -} /* renameridgevertex */ - - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="renamevertex">-</a> - - qh_renamevertex( oldvertex, newvertex, ridges, oldfacet, neighborA ) - renames oldvertex as newvertex in ridges - gives oldfacet/neighborA if oldvertex is shared between two facets - - returns: - oldvertex may still exist afterwards - - - notes: - can not change neighbors of newvertex (since it's a subset) - - design: - for each ridge in ridges - rename oldvertex to newvertex and delete degenerate ridges - if oldfacet not defined - for each neighbor of oldvertex - delete oldvertex from neighbor's vertices - remove extra vertices from neighbor - add oldvertex to qh.del_vertices - else if oldvertex only between oldfacet and neighborA - delete oldvertex from oldfacet and neighborA - add oldvertex to qh.del_vertices - else oldvertex is in oldfacet and neighborA and other facets (i.e., pinched) - delete oldvertex from oldfacet - delete oldfacet from oldvertice's neighbors - remove extra vertices (e.g., oldvertex) from neighborA -*/ -void qh_renamevertex(vertexT *oldvertex, vertexT *newvertex, setT *ridges, facetT *oldfacet, facetT *neighborA) { - facetT *neighbor, **neighborp; - ridgeT *ridge, **ridgep; - boolT istrace= False; - - if (qh IStracing >= 2 || oldvertex->id == qh tracevertex_id || - newvertex->id == qh tracevertex_id) - istrace= True; - FOREACHridge_(ridges) - qh_renameridgevertex (ridge, oldvertex, newvertex); - if (!oldfacet) { - zinc_(Zrenameall); - if (istrace) - fprintf (qh ferr, "qh_renamevertex: renamed v%d to v%d in several facets\n", - oldvertex->id, newvertex->id); - FOREACHneighbor_(oldvertex) { - qh_maydropneighbor (neighbor); - qh_setdelsorted (neighbor->vertices, oldvertex); - if (qh_remove_extravertices (neighbor)) - neighborp--; /* neighbor may be deleted */ - } - if (!oldvertex->deleted) { - oldvertex->deleted= True; - qh_setappend (&qh del_vertices, oldvertex); - } - }else if (qh_setsize (oldvertex->neighbors) == 2) { - zinc_(Zrenameshare); - if (istrace) - fprintf (qh ferr, "qh_renamevertex: renamed v%d to v%d in oldfacet f%d\n", - oldvertex->id, newvertex->id, oldfacet->id); - FOREACHneighbor_(oldvertex) - qh_setdelsorted (neighbor->vertices, oldvertex); - oldvertex->deleted= True; - qh_setappend (&qh del_vertices, oldvertex); - }else { - zinc_(Zrenamepinch); - if (istrace || qh IStracing) - fprintf (qh ferr, "qh_renamevertex: renamed pinched v%d to v%d between f%d and f%d\n", - oldvertex->id, newvertex->id, oldfacet->id, neighborA->id); - qh_setdelsorted (oldfacet->vertices, oldvertex); - qh_setdel (oldvertex->neighbors, oldfacet); - qh_remove_extravertices (neighborA); - } -} /* renamevertex */ - - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="test_appendmerge">-</a> - - qh_test_appendmerge( facet, neighbor ) - tests facet/neighbor for convexity - appends to mergeset if non-convex - if pre-merging, - nop if qh.SKIPconvex, or qh.MERGEexact and coplanar - - returns: - true if appends facet/neighbor to mergeset - sets facet->center as needed - does not change facet->seen - - design: - if qh.cos_max is defined - if the angle between facet normals is too shallow - append an angle-coplanar merge to qh.mergeset - return True - make facet's centrum if needed - if facet's centrum is above the neighbor - set isconcave - else - if facet's centrum is not below the neighbor - set iscoplanar - make neighbor's centrum if needed - if neighbor's centrum is above the facet - set isconcave - else if neighbor's centrum is not below the facet - set iscoplanar - if isconcave or iscoplanar - get angle if needed - append concave or coplanar merge to qh.mergeset -*/ -boolT qh_test_appendmerge (facetT *facet, facetT *neighbor) { - realT dist, dist2= -REALmax, angle= -REALmax; - boolT isconcave= False, iscoplanar= False, okangle= False; - - if (qh SKIPconvex && !qh POSTmerging) - return False; - if ((!qh MERGEexact || qh POSTmerging) && qh cos_max < REALmax/2) { - angle= qh_getangle(facet->normal, neighbor->normal); - zinc_(Zangletests); - if (angle > qh cos_max) { - zinc_(Zcoplanarangle); - qh_appendmergeset(facet, neighbor, MRGanglecoplanar, &angle); - trace2((qh ferr, "qh_test_appendmerge: coplanar angle %4.4g between f%d and f%d\n", - angle, facet->id, neighbor->id)); - return True; - }else - okangle= True; - } - if (!facet->center) - facet->center= qh_getcentrum (facet); - zzinc_(Zcentrumtests); - qh_distplane(facet->center, neighbor, &dist); - if (dist > qh centrum_radius) - isconcave= True; - else { - if (dist > -qh centrum_radius) - iscoplanar= True; - if (!neighbor->center) - neighbor->center= qh_getcentrum (neighbor); - zzinc_(Zcentrumtests); - qh_distplane(neighbor->center, facet, &dist2); - if (dist2 > qh centrum_radius) - isconcave= True; - else if (!iscoplanar && dist2 > -qh centrum_radius) - iscoplanar= True; - } - if (!isconcave && (!iscoplanar || (qh MERGEexact && !qh POSTmerging))) - return False; - if (!okangle && qh ANGLEmerge) { - angle= qh_getangle(facet->normal, neighbor->normal); - zinc_(Zangletests); - } - if (isconcave) { - zinc_(Zconcaveridge); - if (qh ANGLEmerge) - angle += qh_ANGLEconcave + 0.5; - qh_appendmergeset(facet, neighbor, MRGconcave, &angle); - trace0((qh ferr, "qh_test_appendmerge: concave f%d to f%d dist %4.4g and reverse dist %4.4g angle %4.4g during p%d\n", - facet->id, neighbor->id, dist, dist2, angle, qh furthest_id)); - }else /* iscoplanar */ { - zinc_(Zcoplanarcentrum); - qh_appendmergeset(facet, neighbor, MRGcoplanar, &angle); - trace2((qh ferr, "qh_test_appendmerge: coplanar f%d to f%d dist %4.4g, reverse dist %4.4g angle %4.4g\n", - facet->id, neighbor->id, dist, dist2, angle)); - } - return True; -} /* test_appendmerge */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="test_vneighbors">-</a> - - qh_test_vneighbors() - test vertex neighbors for convexity - tests all facets on qh.newfacet_list - - returns: - true if non-convex vneighbors appended to qh.facet_mergeset - initializes vertex neighbors if needed - - notes: - assumes all facet neighbors have been tested - this can be expensive - this does not guarantee that a centrum is below all facets - but it is unlikely - uses qh.visit_id - - design: - build vertex neighbors if necessary - for all new facets - for all vertices - for each unvisited facet neighbor of the vertex - test new facet and neighbor for convexity -*/ -boolT qh_test_vneighbors (void /* qh newfacet_list */) { - facetT *newfacet, *neighbor, **neighborp; - vertexT *vertex, **vertexp; - int nummerges= 0; - - trace1((qh ferr, "qh_test_vneighbors: testing vertex neighbors for convexity\n")); - if (!qh VERTEXneighbors) - qh_vertexneighbors(); - FORALLnew_facets - newfacet->seen= False; - FORALLnew_facets { - newfacet->seen= True; - newfacet->visitid= qh visit_id++; - FOREACHneighbor_(newfacet) - newfacet->visitid= qh visit_id; - FOREACHvertex_(newfacet->vertices) { - FOREACHneighbor_(vertex) { - if (neighbor->seen || neighbor->visitid == qh visit_id) - continue; - if (qh_test_appendmerge (newfacet, neighbor)) - nummerges++; - } - } - } - zadd_(Ztestvneighbor, nummerges); - trace1((qh ferr, "qh_test_vneighbors: found %d non-convex, vertex neighbors\n", - nummerges)); - return (nummerges > 0); -} /* test_vneighbors */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="tracemerge">-</a> - - qh_tracemerge( facet1, facet2 ) - print trace message after merge -*/ -void qh_tracemerge (facetT *facet1, facetT *facet2) { - boolT waserror= False; - -#ifndef qh_NOtrace - if (qh IStracing >= 4) - qh_errprint ("MERGED", facet2, NULL, NULL, NULL); - if (facet2 == qh tracefacet || (qh tracevertex && qh tracevertex->newlist)) { - fprintf (qh ferr, "qh_tracemerge: trace facet and vertex after merge of f%d and f%d, furthest p%d\n", facet1->id, facet2->id, qh furthest_id); - if (facet2 != qh tracefacet) - qh_errprint ("TRACE", qh tracefacet, - (qh tracevertex && qh tracevertex->neighbors) ? - SETfirstt_(qh tracevertex->neighbors, facetT) : NULL, - NULL, qh tracevertex); - } - if (qh tracevertex) { - if (qh tracevertex->deleted) - fprintf (qh ferr, "qh_tracemerge: trace vertex deleted at furthest p%d\n", - qh furthest_id); - else - qh_checkvertex (qh tracevertex); - } - if (qh tracefacet) { - qh_checkfacet (qh tracefacet, True, &waserror); - if (waserror) - qh_errexit (qh_ERRqhull, qh tracefacet, NULL); - } -#endif /* !qh_NOtrace */ - if (qh CHECKfrequently || qh IStracing >= 4) { /* can't check polygon here */ - qh_checkfacet (facet2, True, &waserror); - if (waserror) - qh_errexit(qh_ERRqhull, NULL, NULL); - } -} /* tracemerge */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="tracemerging">-</a> - - qh_tracemerging() - print trace message during POSTmerging - - returns: - updates qh.mergereport - - notes: - called from qh_mergecycle() and qh_mergefacet() - - see: - qh_buildtracing() -*/ -void qh_tracemerging (void) { - realT cpu; - int total; - time_t timedata; - struct tm *tp; - - qh mergereport= zzval_(Ztotmerge); - time (&timedata); - tp= localtime (&timedata); - cpu= qh_CPUclock; - cpu /= qh_SECticks; - total= zzval_(Ztotmerge) - zzval_(Zcyclehorizon) + zzval_(Zcyclefacettot); - fprintf (qh ferr, "\n\ -At %d:%d:%d & %2.5g CPU secs, qhull has merged %d facets. The hull\n\ - contains %d facets and %d vertices.\n", - tp->tm_hour, tp->tm_min, tp->tm_sec, cpu, - total, qh num_facets - qh num_visible, - qh num_vertices-qh_setsize (qh del_vertices)); -} /* tracemerging */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="updatetested">-</a> - - qh_updatetested( facet1, facet2 ) - clear facet2->tested and facet1->ridge->tested for merge - - returns: - deletes facet2->center unless it's already large - if so, clears facet2->ridge->tested - - design: - clear facet2->tested - clear ridge->tested for facet1's ridges - if facet2 has a centrum - if facet2 is large - set facet2->keepcentrum - else if facet2 has 3 vertices due to many merges, or not large and post merging - clear facet2->keepcentrum - unless facet2->keepcentrum - clear facet2->center to recompute centrum later - clear ridge->tested for facet2's ridges -*/ -void qh_updatetested (facetT *facet1, facetT *facet2) { - ridgeT *ridge, **ridgep; - int size; - - facet2->tested= False; - FOREACHridge_(facet1->ridges) - ridge->tested= False; - if (!facet2->center) - return; - size= qh_setsize (facet2->vertices); - if (!facet2->keepcentrum) { - if (size > qh hull_dim + qh_MAXnewcentrum) { - facet2->keepcentrum= True; - zinc_(Zwidevertices); - } - }else if (size <= qh hull_dim + qh_MAXnewcentrum) { - /* center and keepcentrum was set */ - if (size == qh hull_dim || qh POSTmerging) - facet2->keepcentrum= False; /* if many merges need to recompute centrum */ - } - if (!facet2->keepcentrum) { - qh_memfree (facet2->center, qh normal_size); - facet2->center= NULL; - FOREACHridge_(facet2->ridges) - ridge->tested= False; - } -} /* updatetested */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="vertexridges">-</a> - - qh_vertexridges( vertex ) - return temporary set of ridges adjacent to a vertex - vertex->neighbors defined - - ntoes: - uses qh.visit_id - does not include implicit ridges for simplicial facets - - design: - for each neighbor of vertex - add ridges that include the vertex to ridges -*/ -setT *qh_vertexridges (vertexT *vertex) { - facetT *neighbor, **neighborp; - setT *ridges= qh_settemp (qh TEMPsize); - int size; - - qh visit_id++; - FOREACHneighbor_(vertex) - neighbor->visitid= qh visit_id; - FOREACHneighbor_(vertex) { - if (*neighborp) /* no new ridges in last neighbor */ - qh_vertexridges_facet (vertex, neighbor, &ridges); - } - if (qh PRINTstatistics || qh IStracing) { - size= qh_setsize (ridges); - zinc_(Zvertexridge); - zadd_(Zvertexridgetot, size); - zmax_(Zvertexridgemax, size); - trace3((qh ferr, "qh_vertexridges: found %d ridges for v%d\n", - size, vertex->id)); - } - return ridges; -} /* vertexridges */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="vertexridges_facet">-</a> - - qh_vertexridges_facet( vertex, facet, ridges ) - add adjacent ridges for vertex in facet - neighbor->visitid==qh.visit_id if it hasn't been visited - - returns: - ridges updated - sets facet->visitid to qh.visit_id-1 - - design: - for each ridge of facet - if ridge of visited neighbor (i.e., unprocessed) - if vertex in ridge - append ridge to vertex - mark facet processed -*/ -void qh_vertexridges_facet (vertexT *vertex, facetT *facet, setT **ridges) { - ridgeT *ridge, **ridgep; - facetT *neighbor; - - FOREACHridge_(facet->ridges) { - neighbor= otherfacet_(ridge, facet); - if (neighbor->visitid == qh visit_id - && qh_setin (ridge->vertices, vertex)) - qh_setappend (ridges, ridge); - } - facet->visitid= qh visit_id-1; -} /* vertexridges_facet */ - -/*-<a href="qh-merge.htm#TOC" - >-------------------------------</a><a name="willdelete">-</a> - - qh_willdelete( facet, replace ) - moves facet to visible list - sets facet->f.replace to replace (may be NULL) - - returns: - bumps qh.num_visible -*/ -void qh_willdelete (facetT *facet, facetT *replace) { - - qh_removefacet(facet); - qh_prependfacet (facet, &qh visible_list); - qh num_visible++; - facet->visible= True; - facet->f.replace= replace; -} /* willdelete */ - -#else /* qh_NOmerge */ -void qh_premerge (vertexT *apex, realT maxcentrum, realT maxangle) { -} -void qh_postmerge (char *reason, realT maxcentrum, realT maxangle, - boolT vneighbors) { -} -boolT qh_checkzero (boolT testall) { - } -#endif /* qh_NOmerge */ - diff --git a/extern/qhull/src/merge.h b/extern/qhull/src/merge.h deleted file mode 100644 index 7fc2afa5967..00000000000 --- a/extern/qhull/src/merge.h +++ /dev/null @@ -1,171 +0,0 @@ -/*<html><pre> -<a href="qh-merge.htm" - >-------------------------------</a><a name="TOP">-</a> - - merge.h - header file for merge.c - - see qh-merge.htm and merge.c - - copyright (c) 1993-2002, The Geometry Center -*/ - -#ifndef qhDEFmerge -#define qhDEFmerge 1 - - -/*============ -constants- ==============*/ - -/*-<a href="qh-merge.htm#TOC" - >--------------------------------</a><a name="qh_ANGLEredundant">-</a> - - qh_ANGLEredundant - indicates redundant merge in mergeT->angle -*/ -#define qh_ANGLEredundant 6.0 - -/*-<a href="qh-merge.htm#TOC" - >--------------------------------</a><a name="qh_ANGLEdegen">-</a> - - qh_ANGLEdegen - indicates degenerate facet in mergeT->angle -*/ -#define qh_ANGLEdegen 5.0 - -/*-<a href="qh-merge.htm#TOC" - >--------------------------------</a><a name="qh_ANGLEconcave">-</a> - - qh_ANGLEconcave - offset to indicate concave facets in mergeT->angle - - notes: - concave facets are assigned the range of [2,4] in mergeT->angle - roundoff error may make the angle less than 2 -*/ -#define qh_ANGLEconcave 1.5 - -/*-<a href="qh-merge.htm#TOC" - >--------------------------------</a><a name="MRG">-</a> - - MRG... (mergeType) - indicates the type of a merge (mergeT->type) -*/ -typedef enum { /* in sort order for facet_mergeset */ - MRGnone= 0, - MRGcoplanar, /* centrum coplanar */ - MRGanglecoplanar, /* angle coplanar */ - /* could detect half concave ridges */ - MRGconcave, /* concave ridge */ - MRGflip, /* flipped facet. facet1 == facet2 */ - MRGridge, /* duplicate ridge (qh_MERGEridge) */ - /* degen and redundant go onto degen_mergeset */ - MRGdegen, /* degenerate facet (not enough neighbors) facet1 == facet2 */ - MRGredundant, /* redundant facet (vertex subset) */ - /* merge_degenredundant assumes degen < redundant */ - MRGmirror, /* mirror facet from qh_triangulate */ - ENDmrg -} mergeType; - -/*-<a href="qh-merge.htm#TOC" - >--------------------------------</a><a name="qh_MERGEapex">-</a> - - qh_MERGEapex - flag for qh_mergefacet() to indicate an apex merge -*/ -#define qh_MERGEapex True - -/*============ -structures- ====================*/ - -/*-<a href="qh-merge.htm#TOC" - >--------------------------------</a><a name="mergeT">-</a> - - mergeT - structure used to merge facets -*/ - -typedef struct mergeT mergeT; -struct mergeT { /* initialize in qh_appendmergeset */ - realT angle; /* angle between normals of facet1 and facet2 */ - facetT *facet1; /* will merge facet1 into facet2 */ - facetT *facet2; - mergeType type; -}; - - -/*=========== -macros- =========================*/ - -/*-<a href="qh-merge.htm#TOC" - >--------------------------------</a><a name="FOREACHmerge_">-</a> - - FOREACHmerge_( merges ) {...} - assign 'merge' to each merge in merges - - notes: - uses 'mergeT *merge, **mergep;' - if qh_mergefacet(), - restart since qh.facet_mergeset may change - see <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a> -*/ -#define FOREACHmerge_( merges ) FOREACHsetelement_(mergeT, merges, merge) - -/*============ prototypes in alphabetical order after pre/postmerge =======*/ - -void qh_premerge (vertexT *apex, realT maxcentrum, realT maxangle); -void qh_postmerge (char *reason, realT maxcentrum, realT maxangle, - boolT vneighbors); -void qh_all_merges (boolT othermerge, boolT vneighbors); -void qh_appendmergeset(facetT *facet, facetT *neighbor, mergeType mergetype, realT *angle); -setT *qh_basevertices( facetT *samecycle); -void qh_checkconnect (void /* qh new_facets */); -boolT qh_checkzero (boolT testall); -void qh_copynonconvex (ridgeT *atridge); -void qh_degen_redundant_facet (facetT *facet); -void qh_degen_redundant_neighbors (facetT *facet, facetT *delfacet); -vertexT *qh_find_newvertex (vertexT *oldvertex, setT *vertices, setT *ridges); -void qh_findbest_test (boolT testcentrum, facetT *facet, facetT *neighbor, - facetT **bestfacet, realT *distp, realT *mindistp, realT *maxdistp); -facetT *qh_findbestneighbor(facetT *facet, realT *distp, realT *mindistp, realT *maxdistp); -void qh_flippedmerges(facetT *facetlist, boolT *wasmerge); -void qh_forcedmerges( boolT *wasmerge); -void qh_getmergeset(facetT *facetlist); -void qh_getmergeset_initial (facetT *facetlist); -void qh_hashridge (setT *hashtable, int hashsize, ridgeT *ridge, vertexT *oldvertex); -ridgeT *qh_hashridge_find (setT *hashtable, int hashsize, ridgeT *ridge, - vertexT *vertex, vertexT *oldvertex, int *hashslot); -void qh_makeridges(facetT *facet); -void qh_mark_dupridges(facetT *facetlist); -void qh_maydropneighbor (facetT *facet); -int qh_merge_degenredundant (void); -void qh_merge_nonconvex( facetT *facet1, facetT *facet2, mergeType mergetype); -void qh_mergecycle (facetT *samecycle, facetT *newfacet); -void qh_mergecycle_all (facetT *facetlist, boolT *wasmerge); -void qh_mergecycle_facets( facetT *samecycle, facetT *newfacet); -void qh_mergecycle_neighbors(facetT *samecycle, facetT *newfacet); -void qh_mergecycle_ridges(facetT *samecycle, facetT *newfacet); -void qh_mergecycle_vneighbors( facetT *samecycle, facetT *newfacet); -void qh_mergefacet(facetT *facet1, facetT *facet2, realT *mindist, realT *maxdist, boolT mergeapex); -void qh_mergefacet2d (facetT *facet1, facetT *facet2); -void qh_mergeneighbors(facetT *facet1, facetT *facet2); -void qh_mergeridges(facetT *facet1, facetT *facet2); -void qh_mergesimplex(facetT *facet1, facetT *facet2, boolT mergeapex); -void qh_mergevertex_del (vertexT *vertex, facetT *facet1, facetT *facet2); -void qh_mergevertex_neighbors(facetT *facet1, facetT *facet2); -void qh_mergevertices(setT *vertices1, setT **vertices); -setT *qh_neighbor_intersections (vertexT *vertex); -void qh_newvertices (setT *vertices); -boolT qh_reducevertices (void); -vertexT *qh_redundant_vertex (vertexT *vertex); -boolT qh_remove_extravertices (facetT *facet); -vertexT *qh_rename_sharedvertex (vertexT *vertex, facetT *facet); -void qh_renameridgevertex(ridgeT *ridge, vertexT *oldvertex, vertexT *newvertex); -void qh_renamevertex(vertexT *oldvertex, vertexT *newvertex, setT *ridges, - facetT *oldfacet, facetT *neighborA); -boolT qh_test_appendmerge (facetT *facet, facetT *neighbor); -boolT qh_test_vneighbors (void /* qh newfacet_list */); -void qh_tracemerge (facetT *facet1, facetT *facet2); -void qh_tracemerging (void); -void qh_updatetested( facetT *facet1, facetT *facet2); -setT *qh_vertexridges (vertexT *vertex); -void qh_vertexridges_facet (vertexT *vertex, facetT *facet, setT **ridges); -void qh_willdelete (facetT *facet, facetT *replace); - -#endif /* qhDEFmerge */ diff --git a/extern/qhull/src/poly.c b/extern/qhull/src/poly.c deleted file mode 100644 index 6319e43d66a..00000000000 --- a/extern/qhull/src/poly.c +++ /dev/null @@ -1,1180 +0,0 @@ -/*<html><pre> -<a href="qh-poly.htm" - >-------------------------------</a><a name="TOP">-</a> - - poly.c - implements polygons and simplices - - see qh-poly.htm, poly.h and qhull.h - - infrequent code is in poly2.c - (all but top 50 and their callers 12/3/95) - - copyright (c) 1993-2002, The Geometry Center -*/ - -#include "qhull_a.h" - -/*======== functions in alphabetical order ==========*/ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="appendfacet">-</a> - - qh_appendfacet( facet ) - appends facet to end of qh.facet_list, - - returns: - updates qh.newfacet_list, facet_next, facet_list - increments qh.numfacets - - notes: - assumes qh.facet_list/facet_tail is defined (createsimplex) - - see: - qh_removefacet() - -*/ -void qh_appendfacet(facetT *facet) { - facetT *tail= qh facet_tail; - - if (tail == qh newfacet_list) - qh newfacet_list= facet; - if (tail == qh facet_next) - qh facet_next= facet; - facet->previous= tail->previous; - facet->next= tail; - if (tail->previous) - tail->previous->next= facet; - else - qh facet_list= facet; - tail->previous= facet; - qh num_facets++; - trace4((qh ferr, "qh_appendfacet: append f%d to facet_list\n", facet->id)); -} /* appendfacet */ - - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="appendvertex">-</a> - - qh_appendvertex( vertex ) - appends vertex to end of qh.vertex_list, - - returns: - sets vertex->newlist - updates qh.vertex_list, newvertex_list - increments qh.num_vertices - - notes: - assumes qh.vertex_list/vertex_tail is defined (createsimplex) - -*/ -void qh_appendvertex (vertexT *vertex) { - vertexT *tail= qh vertex_tail; - - if (tail == qh newvertex_list) - qh newvertex_list= vertex; - vertex->newlist= True; - vertex->previous= tail->previous; - vertex->next= tail; - if (tail->previous) - tail->previous->next= vertex; - else - qh vertex_list= vertex; - tail->previous= vertex; - qh num_vertices++; - trace4((qh ferr, "qh_appendvertex: append v%d to vertex_list\n", vertex->id)); -} /* appendvertex */ - - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="attachnewfacets">-</a> - - qh_attachnewfacets( ) - attach horizon facets to new facets in qh.newfacet_list - newfacets have neighbor and ridge links to horizon but not vice versa - only needed for qh.ONLYgood - - returns: - set qh.NEWfacets - horizon facets linked to new facets - ridges changed from visible facets to new facets - simplicial ridges deleted - qh.visible_list, no ridges valid - facet->f.replace is a newfacet (if any) - - design: - delete interior ridges and neighbor sets by - for each visible, non-simplicial facet - for each ridge - if last visit or if neighbor is simplicial - if horizon neighbor - delete ridge for horizon's ridge set - delete ridge - erase neighbor set - attach horizon facets and new facets by - for all new facets - if corresponding horizon facet is simplicial - locate corresponding visible facet {may be more than one} - link visible facet to new facet - replace visible facet with new facet in horizon - else it's non-simplicial - for all visible neighbors of the horizon facet - link visible neighbor to new facet - delete visible neighbor from horizon facet - append new facet to horizon's neighbors - the first ridge of the new facet is the horizon ridge - link the new facet into the horizon ridge -*/ -void qh_attachnewfacets (void ) { - facetT *newfacet= NULL, *neighbor, **neighborp, *horizon, *visible; - ridgeT *ridge, **ridgep; - - qh NEWfacets= True; - trace3((qh ferr, "qh_attachnewfacets: delete interior ridges\n")); - qh visit_id++; - FORALLvisible_facets { - visible->visitid= qh visit_id; - if (visible->ridges) { - FOREACHridge_(visible->ridges) { - neighbor= otherfacet_(ridge, visible); - if (neighbor->visitid == qh visit_id - || (!neighbor->visible && neighbor->simplicial)) { - if (!neighbor->visible) /* delete ridge for simplicial horizon */ - qh_setdel (neighbor->ridges, ridge); - qh_setfree (&(ridge->vertices)); /* delete on 2nd visit */ - qh_memfree (ridge, sizeof(ridgeT)); - } - } - SETfirst_(visible->ridges)= NULL; - } - SETfirst_(visible->neighbors)= NULL; - } - trace1((qh ferr, "qh_attachnewfacets: attach horizon facets to new facets\n")); - FORALLnew_facets { - horizon= SETfirstt_(newfacet->neighbors, facetT); - if (horizon->simplicial) { - visible= NULL; - FOREACHneighbor_(horizon) { /* may have more than one horizon ridge */ - if (neighbor->visible) { - if (visible) { - if (qh_setequal_skip (newfacet->vertices, 0, horizon->vertices, - SETindex_(horizon->neighbors, neighbor))) { - visible= neighbor; - break; - } - }else - visible= neighbor; - } - } - if (visible) { - visible->f.replace= newfacet; - qh_setreplace (horizon->neighbors, visible, newfacet); - }else { - fprintf (qh ferr, "qhull internal error (qh_attachnewfacets): couldn't find visible facet for horizon f%d of newfacet f%d\n", - horizon->id, newfacet->id); - qh_errexit2 (qh_ERRqhull, horizon, newfacet); - } - }else { /* non-simplicial, with a ridge for newfacet */ - FOREACHneighbor_(horizon) { /* may hold for many new facets */ - if (neighbor->visible) { - neighbor->f.replace= newfacet; - qh_setdelnth (horizon->neighbors, - SETindex_(horizon->neighbors, neighbor)); - neighborp--; /* repeat */ - } - } - qh_setappend (&horizon->neighbors, newfacet); - ridge= SETfirstt_(newfacet->ridges, ridgeT); - if (ridge->top == horizon) - ridge->bottom= newfacet; - else - ridge->top= newfacet; - } - } /* newfacets */ - if (qh PRINTstatistics) { - FORALLvisible_facets { - if (!visible->f.replace) - zinc_(Zinsidevisible); - } - } -} /* attachnewfacets */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="checkflipped">-</a> - - qh_checkflipped( facet, dist, allerror ) - checks facet orientation to interior point - - if allerror set, - tests against qh.DISTround - else - tests against 0 since tested against DISTround before - - returns: - False if it flipped orientation (sets facet->flipped) - distance if non-NULL -*/ -boolT qh_checkflipped (facetT *facet, realT *distp, boolT allerror) { - realT dist; - - if (facet->flipped && !distp) - return False; - zzinc_(Zdistcheck); - qh_distplane(qh interior_point, facet, &dist); - if (distp) - *distp= dist; - if ((allerror && dist > -qh DISTround)|| (!allerror && dist >= 0.0)) { - facet->flipped= True; - zzinc_(Zflippedfacets); - trace0((qh ferr, "qh_checkflipped: facet f%d is flipped, distance= %6.12g during p%d\n", - facet->id, dist, qh furthest_id)); - qh_precision ("flipped facet"); - return False; - } - return True; -} /* checkflipped */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="delfacet">-</a> - - qh_delfacet( facet ) - removes facet from facet_list and frees up its memory - - notes: - assumes vertices and ridges already freed -*/ -void qh_delfacet(facetT *facet) { - void **freelistp; /* used !qh_NOmem */ - - trace4((qh ferr, "qh_delfacet: delete f%d\n", facet->id)); - if (facet == qh tracefacet) - qh tracefacet= NULL; - if (facet == qh GOODclosest) - qh GOODclosest= NULL; - qh_removefacet(facet); - if (!facet->tricoplanar || facet->keepcentrum) { - qh_memfree_(facet->normal, qh normal_size, freelistp); - if (qh CENTERtype == qh_ASvoronoi) { /* uses macro calls */ - qh_memfree_(facet->center, qh center_size, freelistp); - }else /* AScentrum */ { - qh_memfree_(facet->center, qh normal_size, freelistp); - } - } - qh_setfree(&(facet->neighbors)); - if (facet->ridges) - qh_setfree(&(facet->ridges)); - qh_setfree(&(facet->vertices)); - if (facet->outsideset) - qh_setfree(&(facet->outsideset)); - if (facet->coplanarset) - qh_setfree(&(facet->coplanarset)); - qh_memfree_(facet, sizeof(facetT), freelistp); -} /* delfacet */ - - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="deletevisible">-</a> - - qh_deletevisible() - delete visible facets and vertices - - returns: - deletes each facet and removes from facetlist - at exit, qh.visible_list empty (== qh.newfacet_list) - - notes: - ridges already deleted - horizon facets do not reference facets on qh.visible_list - new facets in qh.newfacet_list - uses qh.visit_id; -*/ -void qh_deletevisible (void /*qh visible_list*/) { - facetT *visible, *nextfacet; - vertexT *vertex, **vertexp; - int numvisible= 0, numdel= qh_setsize(qh del_vertices); - - trace1((qh ferr, "qh_deletevisible: delete %d visible facets and %d vertices\n", - qh num_visible, numdel)); - for (visible= qh visible_list; visible && visible->visible; - visible= nextfacet) { /* deleting current */ - nextfacet= visible->next; - numvisible++; - qh_delfacet(visible); - } - if (numvisible != qh num_visible) { - fprintf (qh ferr, "qhull internal error (qh_deletevisible): qh num_visible %d is not number of visible facets %d\n", - qh num_visible, numvisible); - qh_errexit (qh_ERRqhull, NULL, NULL); - } - qh num_visible= 0; - zadd_(Zvisfacettot, numvisible); - zmax_(Zvisfacetmax, numvisible); - zzadd_(Zdelvertextot, numdel); - zmax_(Zdelvertexmax, numdel); - FOREACHvertex_(qh del_vertices) - qh_delvertex (vertex); - qh_settruncate (qh del_vertices, 0); -} /* deletevisible */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="facetintersect">-</a> - - qh_facetintersect( facetA, facetB, skipa, skipB, prepend ) - return vertices for intersection of two simplicial facets - may include 1 prepended entry (if more, need to settemppush) - - returns: - returns set of qh.hull_dim-1 + prepend vertices - returns skipped index for each test and checks for exactly one - - notes: - does not need settemp since set in quick memory - - see also: - qh_vertexintersect and qh_vertexintersect_new - use qh_setnew_delnthsorted to get nth ridge (no skip information) - - design: - locate skipped vertex by scanning facet A's neighbors - locate skipped vertex by scanning facet B's neighbors - intersect the vertex sets -*/ -setT *qh_facetintersect (facetT *facetA, facetT *facetB, - int *skipA,int *skipB, int prepend) { - setT *intersect; - int dim= qh hull_dim, i, j; - facetT **neighborsA, **neighborsB; - - neighborsA= SETaddr_(facetA->neighbors, facetT); - neighborsB= SETaddr_(facetB->neighbors, facetT); - i= j= 0; - if (facetB == *neighborsA++) - *skipA= 0; - else if (facetB == *neighborsA++) - *skipA= 1; - else if (facetB == *neighborsA++) - *skipA= 2; - else { - for (i= 3; i < dim; i++) { - if (facetB == *neighborsA++) { - *skipA= i; - break; - } - } - } - if (facetA == *neighborsB++) - *skipB= 0; - else if (facetA == *neighborsB++) - *skipB= 1; - else if (facetA == *neighborsB++) - *skipB= 2; - else { - for (j= 3; j < dim; j++) { - if (facetA == *neighborsB++) { - *skipB= j; - break; - } - } - } - if (i >= dim || j >= dim) { - fprintf (qh ferr, "qhull internal error (qh_facetintersect): f%d or f%d not in others neighbors\n", - facetA->id, facetB->id); - qh_errexit2 (qh_ERRqhull, facetA, facetB); - } - intersect= qh_setnew_delnthsorted (facetA->vertices, qh hull_dim, *skipA, prepend); - trace4((qh ferr, "qh_facetintersect: f%d skip %d matches f%d skip %d\n", - facetA->id, *skipA, facetB->id, *skipB)); - return(intersect); -} /* facetintersect */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="gethash">-</a> - - qh_gethash( hashsize, set, size, firstindex, skipelem ) - return hashvalue for a set with firstindex and skipelem - - notes: - assumes at least firstindex+1 elements - assumes skipelem is NULL, in set, or part of hash - - hashes memory addresses which may change over different runs of the same data - using sum for hash does badly in high d -*/ -unsigned qh_gethash (int hashsize, setT *set, int size, int firstindex, void *skipelem) { - void **elemp= SETelemaddr_(set, firstindex, void); - ptr_intT hash = 0, elem; - int i; - - switch (size-firstindex) { - case 1: - hash= (ptr_intT)(*elemp) - (ptr_intT) skipelem; - break; - case 2: - hash= (ptr_intT)(*elemp) + (ptr_intT)elemp[1] - (ptr_intT) skipelem; - break; - case 3: - hash= (ptr_intT)(*elemp) + (ptr_intT)elemp[1] + (ptr_intT)elemp[2] - - (ptr_intT) skipelem; - break; - case 4: - hash= (ptr_intT)(*elemp) + (ptr_intT)elemp[1] + (ptr_intT)elemp[2] - + (ptr_intT)elemp[3] - (ptr_intT) skipelem; - break; - case 5: - hash= (ptr_intT)(*elemp) + (ptr_intT)elemp[1] + (ptr_intT)elemp[2] - + (ptr_intT)elemp[3] + (ptr_intT)elemp[4] - (ptr_intT) skipelem; - break; - case 6: - hash= (ptr_intT)(*elemp) + (ptr_intT)elemp[1] + (ptr_intT)elemp[2] - + (ptr_intT)elemp[3] + (ptr_intT)elemp[4]+ (ptr_intT)elemp[5] - - (ptr_intT) skipelem; - break; - default: - hash= 0; - i= 3; - do { /* this is about 10% in 10-d */ - if ((elem= (ptr_intT)*elemp++) != (ptr_intT)skipelem) { - hash ^= (elem << i) + (elem >> (32-i)); - i += 3; - if (i >= 32) - i -= 32; - } - }while(*elemp); - break; - } - hash %= (ptr_intT) hashsize; - /* hash= 0; for debugging purposes */ - return hash; -} /* gethash */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="makenewfacet">-</a> - - qh_makenewfacet( vertices, toporient, horizon ) - creates a toporient? facet from vertices - - returns: - returns newfacet - adds newfacet to qh.facet_list - newfacet->vertices= vertices - if horizon - newfacet->neighbor= horizon, but not vice versa - newvertex_list updated with vertices -*/ -facetT *qh_makenewfacet(setT *vertices, boolT toporient,facetT *horizon) { - facetT *newfacet; - vertexT *vertex, **vertexp; - - FOREACHvertex_(vertices) { - if (!vertex->newlist) { - qh_removevertex (vertex); - qh_appendvertex (vertex); - } - } - newfacet= qh_newfacet(); - newfacet->vertices= vertices; - newfacet->toporient= toporient; - if (horizon) - qh_setappend(&(newfacet->neighbors), horizon); - qh_appendfacet(newfacet); - return(newfacet); -} /* makenewfacet */ - - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="makenewplanes">-</a> - - qh_makenewplanes() - make new hyperplanes for facets on qh.newfacet_list - - returns: - all facets have hyperplanes or are marked for merging - doesn't create hyperplane if horizon is coplanar (will merge) - updates qh.min_vertex if qh.JOGGLEmax - - notes: - facet->f.samecycle is defined for facet->mergehorizon facets -*/ -void qh_makenewplanes (void /* newfacet_list */) { - facetT *newfacet; - - FORALLnew_facets { - if (!newfacet->mergehorizon) - qh_setfacetplane (newfacet); - } - if (qh JOGGLEmax < REALmax/2) - minimize_(qh min_vertex, -wwval_(Wnewvertexmax)); -} /* makenewplanes */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="makenew_nonsimplicial">-</a> - - qh_makenew_nonsimplicial( visible, apex, numnew ) - make new facets for ridges of a visible facet - - returns: - first newfacet, bumps numnew as needed - attaches new facets if !qh.ONLYgood - marks ridge neighbors for simplicial visible - if (qh.ONLYgood) - ridges on newfacet, horizon, and visible - else - ridge and neighbors between newfacet and horizon - visible facet's ridges are deleted - - notes: - qh.visit_id if visible has already been processed - sets neighbor->seen for building f.samecycle - assumes all 'seen' flags initially false - - design: - for each ridge of visible facet - get neighbor of visible facet - if neighbor was already processed - delete the ridge (will delete all visible facets later) - if neighbor is a horizon facet - create a new facet - if neighbor coplanar - adds newfacet to f.samecycle for later merging - else - updates neighbor's neighbor set - (checks for non-simplicial facet with multiple ridges to visible facet) - updates neighbor's ridge set - (checks for simplicial neighbor to non-simplicial visible facet) - (deletes ridge if neighbor is simplicial) - -*/ -#ifndef qh_NOmerge -facetT *qh_makenew_nonsimplicial (facetT *visible, vertexT *apex, int *numnew) { - void **freelistp; /* used !qh_NOmem */ - ridgeT *ridge, **ridgep; - facetT *neighbor, *newfacet= NULL, *samecycle; - setT *vertices; - boolT toporient; - int ridgeid; - - FOREACHridge_(visible->ridges) { - ridgeid= ridge->id; - neighbor= otherfacet_(ridge, visible); - if (neighbor->visible) { - if (!qh ONLYgood) { - if (neighbor->visitid == qh visit_id) { - qh_setfree (&(ridge->vertices)); /* delete on 2nd visit */ - qh_memfree_(ridge, sizeof(ridgeT), freelistp); - } - } - }else { /* neighbor is an horizon facet */ - toporient= (ridge->top == visible); - vertices= qh_setnew (qh hull_dim); /* makes sure this is quick */ - qh_setappend (&vertices, apex); - qh_setappend_set (&vertices, ridge->vertices); - newfacet= qh_makenewfacet(vertices, toporient, neighbor); - (*numnew)++; - if (neighbor->coplanar) { - newfacet->mergehorizon= True; - if (!neighbor->seen) { - newfacet->f.samecycle= newfacet; - neighbor->f.newcycle= newfacet; - }else { - samecycle= neighbor->f.newcycle; - newfacet->f.samecycle= samecycle->f.samecycle; - samecycle->f.samecycle= newfacet; - } - } - if (qh ONLYgood) { - if (!neighbor->simplicial) - qh_setappend(&(newfacet->ridges), ridge); - }else { /* qh_attachnewfacets */ - if (neighbor->seen) { - if (neighbor->simplicial) { - fprintf (qh ferr, "qhull internal error (qh_makenew_nonsimplicial): simplicial f%d sharing two ridges with f%d\n", - neighbor->id, visible->id); - qh_errexit2 (qh_ERRqhull, neighbor, visible); - } - qh_setappend (&(neighbor->neighbors), newfacet); - }else - qh_setreplace (neighbor->neighbors, visible, newfacet); - if (neighbor->simplicial) { - qh_setdel (neighbor->ridges, ridge); - qh_setfree (&(ridge->vertices)); - qh_memfree (ridge, sizeof(ridgeT)); - }else { - qh_setappend(&(newfacet->ridges), ridge); - if (toporient) - ridge->top= newfacet; - else - ridge->bottom= newfacet; - } - trace4((qh ferr, "qh_makenew_nonsimplicial: created facet f%d from v%d and r%d of horizon f%d\n", - newfacet->id, apex->id, ridgeid, neighbor->id)); - } - } - neighbor->seen= True; - } /* for each ridge */ - if (!qh ONLYgood) - SETfirst_(visible->ridges)= NULL; - return newfacet; -} /* makenew_nonsimplicial */ -#else /* qh_NOmerge */ -facetT *qh_makenew_nonsimplicial (facetT *visible, vertexT *apex, int *numnew) { - return NULL; -} -#endif /* qh_NOmerge */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="makenew_simplicial">-</a> - - qh_makenew_simplicial( visible, apex, numnew ) - make new facets for simplicial visible facet and apex - - returns: - attaches new facets if (!qh.ONLYgood) - neighbors between newfacet and horizon - - notes: - nop if neighbor->seen or neighbor->visible (see qh_makenew_nonsimplicial) - - design: - locate neighboring horizon facet for visible facet - determine vertices and orientation - create new facet - if coplanar, - add new facet to f.samecycle - update horizon facet's neighbor list -*/ -facetT *qh_makenew_simplicial (facetT *visible, vertexT *apex, int *numnew) { - facetT *neighbor, **neighborp, *newfacet= NULL; - setT *vertices; - boolT flip, toporient; - int horizonskip, visibleskip; - - FOREACHneighbor_(visible) { - if (!neighbor->seen && !neighbor->visible) { - vertices= qh_facetintersect(neighbor,visible, &horizonskip, &visibleskip, 1); - SETfirst_(vertices)= apex; - flip= ((horizonskip & 0x1) ^ (visibleskip & 0x1)); - if (neighbor->toporient) - toporient= horizonskip & 0x1; - else - toporient= (horizonskip & 0x1) ^ 0x1; - newfacet= qh_makenewfacet(vertices, toporient, neighbor); - (*numnew)++; - if (neighbor->coplanar && (qh PREmerge || qh MERGEexact)) { -#ifndef qh_NOmerge - newfacet->f.samecycle= newfacet; - newfacet->mergehorizon= True; -#endif - } - if (!qh ONLYgood) - SETelem_(neighbor->neighbors, horizonskip)= newfacet; - trace4((qh ferr, "qh_makenew_simplicial: create facet f%d top %d from v%d and horizon f%d skip %d top %d and visible f%d skip %d, flip? %d\n", - newfacet->id, toporient, apex->id, neighbor->id, horizonskip, - neighbor->toporient, visible->id, visibleskip, flip)); - } - } - return newfacet; -} /* makenew_simplicial */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="matchneighbor">-</a> - - qh_matchneighbor( newfacet, newskip, hashsize, hashcount ) - either match subridge of newfacet with neighbor or add to hash_table - - returns: - duplicate ridges are unmatched and marked by qh_DUPLICATEridge - - notes: - ridge is newfacet->vertices w/o newskip vertex - do not allocate memory (need to free hash_table cleanly) - uses linear hash chains - - see also: - qh_matchduplicates - - design: - for each possible matching facet in qh.hash_table - if vertices match - set ismatch, if facets have opposite orientation - if ismatch and matching facet doesn't have a match - match the facets by updating their neighbor sets - else - indicate a duplicate ridge - set facet hyperplane for later testing - add facet to hashtable - unless the other facet was already a duplicate ridge - mark both facets with a duplicate ridge - add other facet (if defined) to hash table -*/ -void qh_matchneighbor (facetT *newfacet, int newskip, int hashsize, int *hashcount) { - boolT newfound= False; /* True, if new facet is already in hash chain */ - boolT same, ismatch; - int hash, scan; - facetT *facet, *matchfacet; - int skip, matchskip; - - hash= (int)qh_gethash (hashsize, newfacet->vertices, qh hull_dim, 1, - SETelem_(newfacet->vertices, newskip)); - trace4((qh ferr, "qh_matchneighbor: newfacet f%d skip %d hash %d hashcount %d\n", - newfacet->id, newskip, hash, *hashcount)); - zinc_(Zhashlookup); - for (scan= hash; (facet= SETelemt_(qh hash_table, scan, facetT)); - scan= (++scan >= hashsize ? 0 : scan)) { - if (facet == newfacet) { - newfound= True; - continue; - } - zinc_(Zhashtests); - if (qh_matchvertices (1, newfacet->vertices, newskip, facet->vertices, &skip, &same)) { - if (SETelem_(newfacet->vertices, newskip) == - SETelem_(facet->vertices, skip)) { - qh_precision ("two facets with the same vertices"); - fprintf (qh ferr, "qhull precision error: Vertex sets are the same for f%d and f%d. Can not force output.\n", - facet->id, newfacet->id); - qh_errexit2 (qh_ERRprec, facet, newfacet); - } - ismatch= (same == (newfacet->toporient ^ facet->toporient)); - matchfacet= SETelemt_(facet->neighbors, skip, facetT); - if (ismatch && !matchfacet) { - SETelem_(facet->neighbors, skip)= newfacet; - SETelem_(newfacet->neighbors, newskip)= facet; - (*hashcount)--; - trace4((qh ferr, "qh_matchneighbor: f%d skip %d matched with new f%d skip %d\n", - facet->id, skip, newfacet->id, newskip)); - return; - } - if (!qh PREmerge && !qh MERGEexact) { - qh_precision ("a ridge with more than two neighbors"); - fprintf (qh ferr, "qhull precision error: facets f%d, f%d and f%d meet at a ridge with more than 2 neighbors. Can not continue.\n", - facet->id, newfacet->id, getid_(matchfacet)); - qh_errexit2 (qh_ERRprec, facet, newfacet); - } - SETelem_(newfacet->neighbors, newskip)= qh_DUPLICATEridge; - newfacet->dupridge= True; - if (!newfacet->normal) - qh_setfacetplane (newfacet); - qh_addhash (newfacet, qh hash_table, hashsize, hash); - (*hashcount)++; - if (!facet->normal) - qh_setfacetplane (facet); - if (matchfacet != qh_DUPLICATEridge) { - SETelem_(facet->neighbors, skip)= qh_DUPLICATEridge; - facet->dupridge= True; - if (!facet->normal) - qh_setfacetplane (facet); - if (matchfacet) { - matchskip= qh_setindex (matchfacet->neighbors, facet); - SETelem_(matchfacet->neighbors, matchskip)= qh_DUPLICATEridge; - matchfacet->dupridge= True; - if (!matchfacet->normal) - qh_setfacetplane (matchfacet); - qh_addhash (matchfacet, qh hash_table, hashsize, hash); - *hashcount += 2; - } - } - trace4((qh ferr, "qh_matchneighbor: new f%d skip %d duplicates ridge for f%d skip %d matching f%d ismatch %d at hash %d\n", - newfacet->id, newskip, facet->id, skip, - (matchfacet == qh_DUPLICATEridge ? -2 : getid_(matchfacet)), - ismatch, hash)); - return; /* end of duplicate ridge */ - } - } - if (!newfound) - SETelem_(qh hash_table, scan)= newfacet; /* same as qh_addhash */ - (*hashcount)++; - trace4((qh ferr, "qh_matchneighbor: no match for f%d skip %d at hash %d\n", - newfacet->id, newskip, hash)); -} /* matchneighbor */ - - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="matchnewfacets">-</a> - - qh_matchnewfacets() - match newfacets in qh.newfacet_list to their newfacet neighbors - - returns: - qh.newfacet_list with full neighbor sets - get vertices with nth neighbor by deleting nth vertex - if qh.PREmerge/MERGEexact or qh.FORCEoutput - sets facet->flippped if flipped normal (also prevents point partitioning) - if duplicate ridges and qh.PREmerge/MERGEexact - sets facet->dupridge - missing neighbor links identifies extra ridges to be merging (qh_MERGEridge) - - notes: - newfacets already have neighbor[0] (horizon facet) - assumes qh.hash_table is NULL - vertex->neighbors has not been updated yet - do not allocate memory after qh.hash_table (need to free it cleanly) - - design: - delete neighbor sets for all new facets - initialize a hash table - for all new facets - match facet with neighbors - if unmatched facets (due to duplicate ridges) - for each new facet with a duplicate ridge - match it with a facet - check for flipped facets -*/ -void qh_matchnewfacets (void /* qh newfacet_list */) { - int numnew=0, hashcount=0, newskip; - facetT *newfacet, *neighbor; - int dim= qh hull_dim, hashsize, neighbor_i, neighbor_n; - setT *neighbors; -#ifndef qh_NOtrace - int facet_i, facet_n, numfree= 0; - facetT *facet; -#endif - - trace1((qh ferr, "qh_matchnewfacets: match neighbors for new facets.\n")); - FORALLnew_facets { - numnew++; - { /* inline qh_setzero (newfacet->neighbors, 1, qh hull_dim); */ - neighbors= newfacet->neighbors; - neighbors->e[neighbors->maxsize].i= dim+1; /*may be overwritten*/ - memset ((char *)SETelemaddr_(neighbors, 1, void), 0, dim * SETelemsize); - } - } - qh_newhashtable (numnew*(qh hull_dim-1)); /* twice what is normally needed, - but every ridge could be DUPLICATEridge */ - hashsize= qh_setsize (qh hash_table); - FORALLnew_facets { - for (newskip=1; newskip<qh hull_dim; newskip++) /* furthest/horizon already matched */ - qh_matchneighbor (newfacet, newskip, hashsize, &hashcount); -#if 0 /* use the following to trap hashcount errors */ - { - int count= 0, k; - facetT *facet, *neighbor; - - count= 0; - FORALLfacet_(qh newfacet_list) { /* newfacet already in use */ - for (k=1; k < qh hull_dim; k++) { - neighbor= SETelemt_(facet->neighbors, k, facetT); - if (!neighbor || neighbor == qh_DUPLICATEridge) - count++; - } - if (facet == newfacet) - break; - } - if (count != hashcount) { - fprintf (qh ferr, "qh_matchnewfacets: after adding facet %d, hashcount %d != count %d\n", - newfacet->id, hashcount, count); - qh_errexit (qh_ERRqhull, newfacet, NULL); - } - } -#endif /* end of trap code */ - } - if (hashcount) { - FORALLnew_facets { - if (newfacet->dupridge) { - FOREACHneighbor_i_(newfacet) { - if (neighbor == qh_DUPLICATEridge) { - qh_matchduplicates (newfacet, neighbor_i, hashsize, &hashcount); - /* this may report MERGEfacet */ - } - } - } - } - } - if (hashcount) { - fprintf (qh ferr, "qhull internal error (qh_matchnewfacets): %d neighbors did not match up\n", - hashcount); - qh_printhashtable (qh ferr); - qh_errexit (qh_ERRqhull, NULL, NULL); - } -#ifndef qh_NOtrace - if (qh IStracing >= 2) { - FOREACHfacet_i_(qh hash_table) { - if (!facet) - numfree++; - } - fprintf (qh ferr, "qh_matchnewfacets: %d new facets, %d unused hash entries . hashsize %d\n", - numnew, numfree, qh_setsize (qh hash_table)); - } -#endif /* !qh_NOtrace */ - qh_setfree (&qh hash_table); - if (qh PREmerge || qh MERGEexact) { - if (qh IStracing >= 4) - qh_printfacetlist (qh newfacet_list, NULL, qh_ALL); - FORALLnew_facets { - if (newfacet->normal) - qh_checkflipped (newfacet, NULL, qh_ALL); - } - }else if (qh FORCEoutput) - qh_checkflipped_all (qh newfacet_list); /* prints warnings for flipped */ -} /* matchnewfacets */ - - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="matchvertices">-</a> - - qh_matchvertices( firstindex, verticesA, skipA, verticesB, skipB, same ) - tests whether vertices match with a single skip - starts match at firstindex since all new facets have a common vertex - - returns: - true if matched vertices - skip index for each set - sets same iff vertices have the same orientation - - notes: - assumes skipA is in A and both sets are the same size - - design: - set up pointers - scan both sets checking for a match - test orientation -*/ -boolT qh_matchvertices (int firstindex, setT *verticesA, int skipA, - setT *verticesB, int *skipB, boolT *same) { - vertexT **elemAp, **elemBp, **skipBp=NULL, **skipAp; - - elemAp= SETelemaddr_(verticesA, firstindex, vertexT); - elemBp= SETelemaddr_(verticesB, firstindex, vertexT); - skipAp= SETelemaddr_(verticesA, skipA, vertexT); - do if (elemAp != skipAp) { - while (*elemAp != *elemBp++) { - if (skipBp) - return False; - skipBp= elemBp; /* one extra like FOREACH */ - } - }while(*(++elemAp)); - if (!skipBp) - skipBp= ++elemBp; - *skipB= SETindex_(verticesB, skipB); - *same= !(((ptr_intT)skipA & 0x1) ^ ((ptr_intT)*skipB & 0x1)); - trace4((qh ferr, "qh_matchvertices: matched by skip %d (v%d) and skip %d (v%d) same? %d\n", - skipA, (*skipAp)->id, *skipB, (*(skipBp-1))->id, *same)); - return (True); -} /* matchvertices */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="newfacet">-</a> - - qh_newfacet() - return a new facet - - returns: - all fields initialized or cleared (NULL) - preallocates neighbors set -*/ -facetT *qh_newfacet(void) { - facetT *facet; - void **freelistp; /* used !qh_NOmem */ - - qh_memalloc_(sizeof(facetT), freelistp, facet, facetT); - memset ((char *)facet, 0, sizeof(facetT)); - if (qh facet_id == qh tracefacet_id) - qh tracefacet= facet; - facet->id= qh facet_id++; - facet->neighbors= qh_setnew(qh hull_dim); -#if !qh_COMPUTEfurthest - facet->furthestdist= 0.0; -#endif -#if qh_MAXoutside - if (qh FORCEoutput && qh APPROXhull) - facet->maxoutside= qh MINoutside; - else - facet->maxoutside= qh DISTround; -#endif - facet->simplicial= True; - facet->good= True; - facet->newfacet= True; - trace4((qh ferr, "qh_newfacet: created facet f%d\n", facet->id)); - return (facet); -} /* newfacet */ - - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="newridge">-</a> - - qh_newridge() - return a new ridge -*/ -ridgeT *qh_newridge(void) { - ridgeT *ridge; - void **freelistp; /* used !qh_NOmem */ - - qh_memalloc_(sizeof(ridgeT), freelistp, ridge, ridgeT); - memset ((char *)ridge, 0, sizeof(ridgeT)); - zinc_(Ztotridges); - if (qh ridge_id == 0xFFFFFF) { - fprintf(qh ferr, "\ -qhull warning: more than %d ridges. ID field overflows and two ridges\n\ -may have the same identifier. Otherwise output ok.\n", 0xFFFFFF); - } - ridge->id= qh ridge_id++; - trace4((qh ferr, "qh_newridge: created ridge r%d\n", ridge->id)); - return (ridge); -} /* newridge */ - - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="pointid">-</a> - - qh_pointid( ) - return id for a point, - returns -3 if null, -2 if interior, or -1 if not known - - alternative code: - unsigned long id; - id= ((unsigned long)point - (unsigned long)qh.first_point)/qh.normal_size; - - notes: - if point not in point array - the code does a comparison of unrelated pointers. -*/ -int qh_pointid (pointT *point) { - long offset, id; - - if (!point) - id= -3; - else if (point == qh interior_point) - id= -2; - else if (point >= qh first_point - && point < qh first_point + qh num_points * qh hull_dim) { - offset= point - qh first_point; - id= offset / qh hull_dim; - }else if ((id= qh_setindex (qh other_points, point)) != -1) - id += qh num_points; - else - id= -1; - return (int) id; -} /* pointid */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="removefacet">-</a> - - qh_removefacet( facet ) - unlinks facet from qh.facet_list, - - returns: - updates qh.facet_list .newfacet_list .facet_next visible_list - decrements qh.num_facets - - see: - qh_appendfacet -*/ -void qh_removefacet(facetT *facet) { - facetT *next= facet->next, *previous= facet->previous; - - if (facet == qh newfacet_list) - qh newfacet_list= next; - if (facet == qh facet_next) - qh facet_next= next; - if (facet == qh visible_list) - qh visible_list= next; - if (previous) { - previous->next= next; - next->previous= previous; - }else { /* 1st facet in qh facet_list */ - qh facet_list= next; - qh facet_list->previous= NULL; - } - qh num_facets--; - trace4((qh ferr, "qh_removefacet: remove f%d from facet_list\n", facet->id)); -} /* removefacet */ - - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="removevertex">-</a> - - qh_removevertex( vertex ) - unlinks vertex from qh.vertex_list, - - returns: - updates qh.vertex_list .newvertex_list - decrements qh.num_vertices -*/ -void qh_removevertex(vertexT *vertex) { - vertexT *next= vertex->next, *previous= vertex->previous; - - if (vertex == qh newvertex_list) - qh newvertex_list= next; - if (previous) { - previous->next= next; - next->previous= previous; - }else { /* 1st vertex in qh vertex_list */ - qh vertex_list= vertex->next; - qh vertex_list->previous= NULL; - } - qh num_vertices--; - trace4((qh ferr, "qh_removevertex: remove v%d from vertex_list\n", vertex->id)); -} /* removevertex */ - - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="updatevertices">-</a> - - qh_updatevertices() - update vertex neighbors and delete interior vertices - - returns: - if qh.VERTEXneighbors, updates neighbors for each vertex - if qh.newvertex_list, - removes visible neighbors from vertex neighbors - if qh.newfacet_list - adds new facets to vertex neighbors - if qh.visible_list - interior vertices added to qh.del_vertices for later partitioning - - design: - if qh.VERTEXneighbors - deletes references to visible facets from vertex neighbors - appends new facets to the neighbor list for each vertex - checks all vertices of visible facets - removes visible facets from neighbor lists - marks unused vertices for deletion -*/ -void qh_updatevertices (void /*qh newvertex_list, newfacet_list, visible_list*/) { - facetT *newfacet= NULL, *neighbor, **neighborp, *visible; - vertexT *vertex, **vertexp; - - trace3((qh ferr, "qh_updatevertices: delete interior vertices and update vertex->neighbors\n")); - if (qh VERTEXneighbors) { - FORALLvertex_(qh newvertex_list) { - FOREACHneighbor_(vertex) { - if (neighbor->visible) - SETref_(neighbor)= NULL; - } - qh_setcompact (vertex->neighbors); - } - FORALLnew_facets { - FOREACHvertex_(newfacet->vertices) - qh_setappend (&vertex->neighbors, newfacet); - } - FORALLvisible_facets { - FOREACHvertex_(visible->vertices) { - if (!vertex->newlist && !vertex->deleted) { - FOREACHneighbor_(vertex) { /* this can happen under merging */ - if (!neighbor->visible) - break; - } - if (neighbor) - qh_setdel (vertex->neighbors, visible); - else { - vertex->deleted= True; - qh_setappend (&qh del_vertices, vertex); - trace2((qh ferr, "qh_updatevertices: delete vertex p%d (v%d) in f%d\n", - qh_pointid(vertex->point), vertex->id, visible->id)); - } - } - } - } - }else { /* !VERTEXneighbors */ - FORALLvisible_facets { - FOREACHvertex_(visible->vertices) { - if (!vertex->newlist && !vertex->deleted) { - vertex->deleted= True; - qh_setappend (&qh del_vertices, vertex); - trace2((qh ferr, "qh_updatevertices: delete vertex p%d (v%d) in f%d\n", - qh_pointid(vertex->point), vertex->id, visible->id)); - } - } - } - } -} /* updatevertices */ - - - diff --git a/extern/qhull/src/poly.h b/extern/qhull/src/poly.h deleted file mode 100644 index 294ec9527fc..00000000000 --- a/extern/qhull/src/poly.h +++ /dev/null @@ -1,290 +0,0 @@ -/*<html><pre> -<a href="qh-poly.htm" - >-------------------------------</a><a name="TOP">-</a> - - poly.h - header file for poly.c and poly2.c - - see qh-poly.htm, qhull.h and poly.c - - copyright (c) 1993-2002, The Geometry Center -*/ - -#ifndef qhDEFpoly -#define qhDEFpoly 1 - -/*=============== constants ========================== */ - -/*-<a href="qh-geom.htm#TOC" - >--------------------------------</a><a name="ALGORITHMfault">-</a> - - ALGORITHMfault - use as argument to checkconvex() to report errors during buildhull -*/ -#define qh_ALGORITHMfault 0 - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="DATAfault">-</a> - - DATAfault - use as argument to checkconvex() to report errors during initialhull -*/ -#define qh_DATAfault 1 - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="DUPLICATEridge">-</a> - - DUPLICATEridge - special value for facet->neighbor to indicate a duplicate ridge - - notes: - set by matchneighbor, used by matchmatch and mark_dupridge -*/ -#define qh_DUPLICATEridge ( facetT * ) 1L - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="MERGEridge">-</a> - - MERGEridge flag in facet - special value for facet->neighbor to indicate a merged ridge - - notes: - set by matchneighbor, used by matchmatch and mark_dupridge -*/ -#define qh_MERGEridge ( facetT * ) 2L - - -/*============ -structures- ====================*/ - -/*=========== -macros- =========================*/ - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FORALLfacet_">-</a> - - FORALLfacet_( facetlist ) { ... } - assign 'facet' to each facet in facetlist - - notes: - uses 'facetT *facet;' - assumes last facet is a sentinel - - see: - FORALLfacets -*/ -#define FORALLfacet_( facetlist ) if ( facetlist ) for( facet=( facetlist );facet && facet->next;facet=facet->next ) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FORALLnew_facets">-</a> - - FORALLnew_facets { ... } - assign 'newfacet' to each facet in qh.newfacet_list - - notes: - uses 'facetT *newfacet;' - at exit, newfacet==NULL -*/ -#define FORALLnew_facets for( newfacet=qh newfacet_list;newfacet && newfacet->next;newfacet=newfacet->next ) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FORALLvertex_">-</a> - - FORALLvertex_( vertexlist ) { ... } - assign 'vertex' to each vertex in vertexlist - - notes: - uses 'vertexT *vertex;' - at exit, vertex==NULL -*/ -#define FORALLvertex_( vertexlist ) for ( vertex=( vertexlist );vertex && vertex->next;vertex= vertex->next ) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FORALLvisible_facets">-</a> - - FORALLvisible_facets { ... } - assign 'visible' to each visible facet in qh.visible_list - - notes: - uses 'vacetT *visible;' - at exit, visible==NULL -*/ -#define FORALLvisible_facets for (visible=qh visible_list; visible && visible->visible; visible= visible->next) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FORALLsame_">-</a> - - FORALLsame_( newfacet ) { ... } - assign 'same' to each facet in newfacet->f.samecycle - - notes: - uses 'facetT *same;' - stops when it returns to newfacet -*/ -#define FORALLsame_(newfacet) for (same= newfacet->f.samecycle; same != newfacet; same= same->f.samecycle) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FORALLsame_cycle_">-</a> - - FORALLsame_cycle_( newfacet ) { ... } - assign 'same' to each facet in newfacet->f.samecycle - - notes: - uses 'facetT *same;' - at exit, same == NULL -*/ -#define FORALLsame_cycle_(newfacet) \ - for (same= newfacet->f.samecycle; \ - same; same= (same == newfacet ? NULL : same->f.samecycle)) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHneighborA_">-</a> - - FOREACHneighborA_( facet ) { ... } - assign 'neighborA' to each neighbor in facet->neighbors - - FOREACHneighborA_( vertex ) { ... } - assign 'neighborA' to each neighbor in vertex->neighbors - - declare: - facetT *neighborA, **neighborAp; - - see: - <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a> -*/ -#define FOREACHneighborA_(facet) FOREACHsetelement_(facetT, facet->neighbors, neighborA) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHvisible_">-</a> - - FOREACHvisible_( facets ) { ... } - assign 'visible' to each facet in facets - - notes: - uses 'facetT *facet, *facetp;' - see <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a> -*/ -#define FOREACHvisible_(facets) FOREACHsetelement_(facetT, facets, visible) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHnewfacet_">-</a> - - FOREACHnewfacet_( facets ) { ... } - assign 'newfacet' to each facet in facets - - notes: - uses 'facetT *newfacet, *newfacetp;' - see <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a> -*/ -#define FOREACHnewfacet_(facets) FOREACHsetelement_(facetT, facets, newfacet) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHvertexA_">-</a> - - FOREACHvertexA_( vertices ) { ... } - assign 'vertexA' to each vertex in vertices - - notes: - uses 'vertexT *vertexA, *vertexAp;' - see <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a> -*/ -#define FOREACHvertexA_(vertices) FOREACHsetelement_(vertexT, vertices, vertexA) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHvertexreverse12_">-</a> - - FOREACHvertexreverse12_( vertices ) { ... } - assign 'vertex' to each vertex in vertices - reverse order of first two vertices - - notes: - uses 'vertexT *vertex, *vertexp;' - see <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a> -*/ -#define FOREACHvertexreverse12_(vertices) FOREACHsetelementreverse12_(vertexT, vertices, vertex) - - -/*=============== prototypes poly.c in alphabetical order ================*/ - -void qh_appendfacet(facetT *facet); -void qh_appendvertex(vertexT *vertex); -void qh_attachnewfacets (void); -boolT qh_checkflipped (facetT *facet, realT *dist, boolT allerror); -void qh_delfacet(facetT *facet); -void qh_deletevisible(void /*qh visible_list, qh horizon_list*/); -setT *qh_facetintersect (facetT *facetA, facetT *facetB, int *skipAp,int *skipBp, int extra); -unsigned qh_gethash (int hashsize, setT *set, int size, int firstindex, void *skipelem); -facetT *qh_makenewfacet(setT *vertices, boolT toporient, facetT *facet); -void qh_makenewplanes ( void /* newfacet_list */); -facetT *qh_makenew_nonsimplicial (facetT *visible, vertexT *apex, int *numnew); -facetT *qh_makenew_simplicial (facetT *visible, vertexT *apex, int *numnew); -void qh_matchneighbor (facetT *newfacet, int newskip, int hashsize, - int *hashcount); -void qh_matchnewfacets (void); -boolT qh_matchvertices (int firstindex, setT *verticesA, int skipA, - setT *verticesB, int *skipB, boolT *same); -facetT *qh_newfacet(void); -ridgeT *qh_newridge(void); -int qh_pointid (pointT *point); -void qh_removefacet(facetT *facet); -void qh_removevertex(vertexT *vertex); -void qh_updatevertices (void); - - -/*========== -prototypes poly2.c in alphabetical order ===========*/ - -void qh_addhash (void* newelem, setT *hashtable, int hashsize, unsigned hash); -void qh_check_bestdist (void); -void qh_check_maxout (void); -void qh_check_output (void); -void qh_check_point (pointT *point, facetT *facet, realT *maxoutside, realT *maxdist, facetT **errfacet1, facetT **errfacet2); -void qh_check_points(void); -void qh_checkconvex(facetT *facetlist, int fault); -void qh_checkfacet(facetT *facet, boolT newmerge, boolT *waserrorp); -void qh_checkflipped_all (facetT *facetlist); -void qh_checkpolygon(facetT *facetlist); -void qh_checkvertex (vertexT *vertex); -void qh_clearcenters (qh_CENTER type); -void qh_createsimplex(setT *vertices); -void qh_delridge(ridgeT *ridge); -void qh_delvertex (vertexT *vertex); -setT *qh_facet3vertex (facetT *facet); -facetT *qh_findbestfacet (pointT *point, boolT bestoutside, - realT *bestdist, boolT *isoutside); -facetT *qh_findfacet_all (pointT *point, realT *bestdist, boolT *isoutside, - int *numpart); -int qh_findgood (facetT *facetlist, int goodhorizon); -void qh_findgood_all (facetT *facetlist); -void qh_furthestnext (void /* qh facet_list */); -void qh_furthestout (facetT *facet); -void qh_infiniteloop (facetT *facet); -void qh_initbuild(void); -void qh_initialhull(setT *vertices); -setT *qh_initialvertices(int dim, setT *maxpoints, pointT *points, int numpoints); -vertexT *qh_isvertex (pointT *point, setT *vertices); -vertexT *qh_makenewfacets (pointT *point /*horizon_list, visible_list*/); -void qh_matchduplicates (facetT *atfacet, int atskip, int hashsize, int *hashcount); -void qh_nearcoplanar ( void /* qh.facet_list */); -vertexT *qh_nearvertex (facetT *facet, pointT *point, realT *bestdistp); -int qh_newhashtable(int newsize); -vertexT *qh_newvertex(pointT *point); -ridgeT *qh_nextridge3d (ridgeT *atridge, facetT *facet, vertexT **vertexp); -void qh_outcoplanar (void /* facet_list */); -pointT *qh_point (int id); -void qh_point_add (setT *set, pointT *point, void *elem); -setT *qh_pointfacet (void /*qh facet_list*/); -setT *qh_pointvertex (void /*qh facet_list*/); -void qh_prependfacet(facetT *facet, facetT **facetlist); -void qh_printhashtable(FILE *fp); -void qh_printlists (void); -void qh_resetlists (boolT stats, boolT resetVisible /*qh newvertex_list newfacet_list visible_list*/); -void qh_setvoronoi_all (void); -void qh_triangulate (void /*qh facet_list*/); -void qh_triangulate_facet (facetT *facetA, vertexT **first_vertex); -void qh_triangulate_link (facetT *oldfacetA, facetT *facetA, facetT *oldfacetB, facetT *facetB); -void qh_triangulate_mirror (facetT *facetA, facetT *facetB); -void qh_triangulate_null (facetT *facetA); -void qh_vertexintersect(setT **vertexsetA,setT *vertexsetB); -setT *qh_vertexintersect_new(setT *vertexsetA,setT *vertexsetB); -void qh_vertexneighbors (void /*qh facet_list*/); -boolT qh_vertexsubset(setT *vertexsetA, setT *vertexsetB); - - -#endif /* qhDEFpoly */ diff --git a/extern/qhull/src/poly2.c b/extern/qhull/src/poly2.c deleted file mode 100644 index 713faab8bed..00000000000 --- a/extern/qhull/src/poly2.c +++ /dev/null @@ -1,3070 +0,0 @@ -/*<html><pre> -<a href="qh-poly.htm" - >-------------------------------</a><a name="TOP">-</a> - - poly2.c - implements polygons and simplices - - see qh-poly.htm, poly.h and qhull.h - - frequently used code is in poly.c - - copyright (c) 1993-2002, The Geometry Center -*/ - -#include "qhull_a.h" - -/*======== functions in alphabetical order ==========*/ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="addhash">-</a> - - qh_addhash( newelem, hashtable, hashsize, hash ) - add newelem to linear hash table at hash if not already there -*/ -void qh_addhash (void* newelem, setT *hashtable, int hashsize, unsigned hash) { - int scan; - void *elem; - - for (scan= (int)hash; (elem= SETelem_(hashtable, scan)); - scan= (++scan >= hashsize ? 0 : scan)) { - if (elem == newelem) - break; - } - /* loop terminates because qh_HASHfactor >= 1.1 by qh_initbuffers */ - if (!elem) - SETelem_(hashtable, scan)= newelem; -} /* addhash */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="check_bestdist">-</a> - - qh_check_bestdist() - check that all points are within max_outside of the nearest facet - if qh.ONLYgood, - ignores !good facets - - see: - qh_check_maxout(), qh_outerinner() - - notes: - only called from qh_check_points() - seldom used since qh.MERGING is almost always set - if notverified>0 at end of routine - some points were well inside the hull. If the hull contains - a lens-shaped component, these points were not verified. Use - options 'Qi Tv' to verify all points. (Exhaustive check also verifies) - - design: - determine facet for each point (if any) - for each point - start with the assigned facet or with the first facet - find the best facet for the point and check all coplanar facets - error if point is outside of facet -*/ -void qh_check_bestdist (void) { - boolT waserror= False, unassigned; - facetT *facet, *bestfacet, *errfacet1= NULL, *errfacet2= NULL; - facetT *facetlist; - realT dist, maxoutside, maxdist= -REALmax; - pointT *point; - int numpart= 0, facet_i, facet_n, notgood= 0, notverified= 0; - setT *facets; - - trace1((qh ferr, "qh_check_bestdist: check points below nearest facet. Facet_list f%d\n", - qh facet_list->id)); - maxoutside= qh_maxouter(); - maxoutside += qh DISTround; - /* one more qh.DISTround for check computation */ - trace1((qh ferr, "qh_check_bestdist: check that all points are within %2.2g of best facet\n", maxoutside)); - facets= qh_pointfacet (/*qh facet_list*/); - if (!qh_QUICKhelp && qh PRINTprecision) - fprintf (qh ferr, "\n\ -qhull output completed. Verifying that %d points are\n\ -below %2.2g of the nearest %sfacet.\n", - qh_setsize(facets), maxoutside, (qh ONLYgood ? "good " : "")); - FOREACHfacet_i_(facets) { /* for each point with facet assignment */ - if (facet) - unassigned= False; - else { - unassigned= True; - facet= qh facet_list; - } - point= qh_point(facet_i); - if (point == qh GOODpointp) - continue; - qh_distplane(point, facet, &dist); - numpart++; - bestfacet= qh_findbesthorizon (!qh_IScheckmax, point, facet, qh_NOupper, &dist, &numpart); - /* occurs after statistics reported */ - maximize_(maxdist, dist); - if (dist > maxoutside) { - if (qh ONLYgood && !bestfacet->good - && !((bestfacet= qh_findgooddist (point, bestfacet, &dist, &facetlist)) - && dist > maxoutside)) - notgood++; - else { - waserror= True; - fprintf(qh ferr, "qhull precision error: point p%d is outside facet f%d, distance= %6.8g maxoutside= %6.8g\n", - facet_i, bestfacet->id, dist, maxoutside); - if (errfacet1 != bestfacet) { - errfacet2= errfacet1; - errfacet1= bestfacet; - } - } - }else if (unassigned && dist < -qh MAXcoplanar) - notverified++; - } - qh_settempfree (&facets); - if (notverified && !qh DELAUNAY && !qh_QUICKhelp && qh PRINTprecision) - fprintf(qh ferr, "\n%d points were well inside the hull. If the hull contains\n\ -a lens-shaped component, these points were not verified. Use\n\ -options 'Qci Tv' to verify all points.\n", notverified); - if (maxdist > qh outside_err) { - fprintf( qh ferr, "qhull precision error (qh_check_bestdist): a coplanar point is %6.2g from convex hull. The maximum value (qh.outside_err) is %6.2g\n", - maxdist, qh outside_err); - qh_errexit2 (qh_ERRprec, errfacet1, errfacet2); - }else if (waserror && qh outside_err > REALmax/2) - qh_errexit2 (qh_ERRprec, errfacet1, errfacet2); - else if (waserror) - ; /* the error was logged to qh.ferr but does not effect the output */ - trace0((qh ferr, "qh_check_bestdist: max distance outside %2.2g\n", maxdist)); -} /* check_bestdist */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="check_maxout">-</a> - - qh_check_maxout() - updates qh.max_outside by checking all points against bestfacet - if qh.ONLYgood, ignores !good facets - - returns: - updates facet->maxoutside via qh_findbesthorizon() - sets qh.maxoutdone - if printing qh.min_vertex (qh_outerinner), - it is updated to the current vertices - removes inside/coplanar points from coplanarset as needed - - notes: - defines coplanar as min_vertex instead of MAXcoplanar - may not need to check near-inside points because of qh.MAXcoplanar - and qh.KEEPnearinside (before it was -DISTround) - - see also: - qh_check_bestdist() - - design: - if qh.min_vertex is needed - for all neighbors of all vertices - test distance from vertex to neighbor - determine facet for each point (if any) - for each point with an assigned facet - find the best facet for the point and check all coplanar facets - (updates outer planes) - remove near-inside points from coplanar sets -*/ -#ifndef qh_NOmerge -void qh_check_maxout (void) { - facetT *facet, *bestfacet, *neighbor, **neighborp, *facetlist; - realT dist, maxoutside, minvertex, old_maxoutside; - pointT *point; - int numpart= 0, facet_i, facet_n, notgood= 0; - setT *facets, *vertices; - vertexT *vertex; - - trace1((qh ferr, "qh_check_maxout: check and update maxoutside for each facet.\n")); - maxoutside= minvertex= 0; - if (qh VERTEXneighbors - && (qh PRINTsummary || qh KEEPinside || qh KEEPcoplanar - || qh TRACElevel || qh PRINTstatistics - || qh PRINTout[0] == qh_PRINTsummary || qh PRINTout[0] == qh_PRINTnone)) { - trace1((qh ferr, "qh_check_maxout: determine actual maxoutside and minvertex\n")); - vertices= qh_pointvertex (/*qh facet_list*/); - FORALLvertices { - FOREACHneighbor_(vertex) { - zinc_(Zdistvertex); /* distance also computed by main loop below */ - qh_distplane (vertex->point, neighbor, &dist); - minimize_(minvertex, dist); - if (-dist > qh TRACEdist || dist > qh TRACEdist - || neighbor == qh tracefacet || vertex == qh tracevertex) - fprintf (qh ferr, "qh_check_maxout: p%d (v%d) is %.2g from f%d\n", - qh_pointid (vertex->point), vertex->id, dist, neighbor->id); - } - } - if (qh MERGING) { - wmin_(Wminvertex, qh min_vertex); - } - qh min_vertex= minvertex; - qh_settempfree (&vertices); - } - facets= qh_pointfacet (/*qh facet_list*/); - do { - old_maxoutside= fmax_(qh max_outside, maxoutside); - FOREACHfacet_i_(facets) { /* for each point with facet assignment */ - if (facet) { - point= qh_point(facet_i); - if (point == qh GOODpointp) - continue; - zinc_(Ztotcheck); - qh_distplane(point, facet, &dist); - numpart++; - bestfacet= qh_findbesthorizon (qh_IScheckmax, point, facet, !qh_NOupper, &dist, &numpart); - if (bestfacet && dist > maxoutside) { - if (qh ONLYgood && !bestfacet->good - && !((bestfacet= qh_findgooddist (point, bestfacet, &dist, &facetlist)) - && dist > maxoutside)) - notgood++; - else - maxoutside= dist; - } - if (dist > qh TRACEdist || (bestfacet && bestfacet == qh tracefacet)) - fprintf (qh ferr, "qh_check_maxout: p%d is %.2g above f%d\n", - qh_pointid (point), dist, bestfacet->id); - } - } - }while - (maxoutside > 2*old_maxoutside); - /* if qh.maxoutside increases substantially, qh_SEARCHdist is not valid - e.g., RBOX 5000 s Z1 G1e-13 t1001200614 | qhull */ - zzadd_(Zcheckpart, numpart); - qh_settempfree (&facets); - wval_(Wmaxout)= maxoutside - qh max_outside; - wmax_(Wmaxoutside, qh max_outside); - qh max_outside= maxoutside; - qh_nearcoplanar (/*qh.facet_list*/); - qh maxoutdone= True; - trace1((qh ferr, "qh_check_maxout: maxoutside %2.2g, min_vertex %2.2g, outside of not good %d\n", - maxoutside, qh min_vertex, notgood)); -} /* check_maxout */ -#else /* qh_NOmerge */ -void qh_check_maxout (void) { -} -#endif - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="check_output">-</a> - - qh_check_output() - performs the checks at the end of qhull algorithm - Maybe called after voronoi output. Will recompute otherwise centrums are Voronoi centers instead -*/ -void qh_check_output (void) { - int i; - - if (qh STOPcone) - return; - if (qh VERIFYoutput | qh IStracing | qh CHECKfrequently) { - qh_checkpolygon (qh facet_list); - qh_checkflipped_all (qh facet_list); - qh_checkconvex (qh facet_list, qh_ALGORITHMfault); - }else if (!qh MERGING && qh_newstats (qhstat precision, &i)) { - qh_checkflipped_all (qh facet_list); - qh_checkconvex (qh facet_list, qh_ALGORITHMfault); - } -} /* check_output */ - - - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="check_point">-</a> - - qh_check_point( point, facet, maxoutside, maxdist, errfacet1, errfacet2 ) - check that point is less than maxoutside from facet -*/ -void qh_check_point (pointT *point, facetT *facet, realT *maxoutside, realT *maxdist, facetT **errfacet1, facetT **errfacet2) { - realT dist; - - /* occurs after statistics reported */ - qh_distplane(point, facet, &dist); - if (dist > *maxoutside) { - if (*errfacet1 != facet) { - *errfacet2= *errfacet1; - *errfacet1= facet; - } - fprintf(qh ferr, "qhull precision error: point p%d is outside facet f%d, distance= %6.8g maxoutside= %6.8g\n", - qh_pointid(point), facet->id, dist, *maxoutside); - } - maximize_(*maxdist, dist); -} /* qh_check_point */ - - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="check_points">-</a> - - qh_check_points() - checks that all points are inside all facets - - notes: - if many points and qh_check_maxout not called (i.e., !qh.MERGING), - calls qh_findbesthorizon (seldom done). - ignores flipped facets - maxoutside includes 2 qh.DISTrounds - one qh.DISTround for the computed distances in qh_check_points - qh_printafacet and qh_printsummary needs only one qh.DISTround - the computation for qh.VERIFYdirect does not account for qh.other_points - - design: - if many points - use qh_check_bestdist() - else - for all facets - for all points - check that point is inside facet -*/ -void qh_check_points (void) { - facetT *facet, *errfacet1= NULL, *errfacet2= NULL; - realT total, maxoutside, maxdist= -REALmax; - pointT *point, **pointp, *pointtemp; - boolT testouter; - - maxoutside= qh_maxouter(); - maxoutside += qh DISTround; - /* one more qh.DISTround for check computation */ - trace1((qh ferr, "qh_check_points: check all points below %2.2g of all facet planes\n", - maxoutside)); - if (qh num_good) /* miss counts other_points and !good facets */ - total= (float) qh num_good * qh num_points; - else - total= (float) qh num_facets * qh num_points; - if (total >= qh_VERIFYdirect && !qh maxoutdone) { - if (!qh_QUICKhelp && qh SKIPcheckmax && qh MERGING) - fprintf (qh ferr, "\n\ -qhull input warning: merging without checking outer planes ('Q5' or 'Po').\n\ -Verify may report that a point is outside of a facet.\n"); - qh_check_bestdist(); - }else { - if (qh_MAXoutside && qh maxoutdone) - testouter= True; - else - testouter= False; - if (!qh_QUICKhelp) { - if (qh MERGEexact) - fprintf (qh ferr, "\n\ -qhull input warning: exact merge ('Qx'). Verify may report that a point\n\ -is outside of a facet. See qh-optq.htm#Qx\n"); - else if (qh SKIPcheckmax || qh NOnearinside) - fprintf (qh ferr, "\n\ -qhull input warning: no outer plane check ('Q5') or no processing of\n\ -near-inside points ('Q8'). Verify may report that a point is outside\n\ -of a facet.\n"); - } - if (qh PRINTprecision) { - if (testouter) - fprintf (qh ferr, "\n\ -Output completed. Verifying that all points are below outer planes of\n\ -all %sfacets. Will make %2.0f distance computations.\n", - (qh ONLYgood ? "good " : ""), total); - else - fprintf (qh ferr, "\n\ -Output completed. Verifying that all points are below %2.2g of\n\ -all %sfacets. Will make %2.0f distance computations.\n", - maxoutside, (qh ONLYgood ? "good " : ""), total); - } - FORALLfacets { - if (!facet->good && qh ONLYgood) - continue; - if (facet->flipped) - continue; - if (!facet->normal) { - fprintf( qh ferr, "qhull warning (qh_check_points): missing normal for facet f%d\n", facet->id); - continue; - } - if (testouter) { -#if qh_MAXoutside - maxoutside= facet->maxoutside + 2* qh DISTround; - /* one DISTround to actual point and another to computed point */ -#endif - } - FORALLpoints { - if (point != qh GOODpointp) - qh_check_point (point, facet, &maxoutside, &maxdist, &errfacet1, &errfacet2); - } - FOREACHpoint_(qh other_points) { - if (point != qh GOODpointp) - qh_check_point (point, facet, &maxoutside, &maxdist, &errfacet1, &errfacet2); - } - } - if (maxdist > qh outside_err) { - fprintf( qh ferr, "qhull precision error (qh_check_points): a coplanar point is %6.2g from convex hull. The maximum value (qh.outside_err) is %6.2g\n", - maxdist, qh outside_err ); - qh_errexit2( qh_ERRprec, errfacet1, errfacet2 ); - }else if (errfacet1 && qh outside_err > REALmax/2) - qh_errexit2( qh_ERRprec, errfacet1, errfacet2 ); - else if (errfacet1) - ; /* the error was logged to qh.ferr but does not effect the output */ - trace0((qh ferr, "qh_check_points: max distance outside %2.2g\n", maxdist)); - } -} /* check_points */ - - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="checkconvex">-</a> - - qh_checkconvex( facetlist, fault ) - check that each ridge in facetlist is convex - fault = qh_DATAfault if reporting errors - = qh_ALGORITHMfault otherwise - - returns: - counts Zconcaveridges and Zcoplanarridges - errors if concaveridge or if merging an coplanar ridge - - note: - if not merging, - tests vertices for neighboring simplicial facets - else if ZEROcentrum, - tests vertices for neighboring simplicial facets - else - tests centrums of neighboring facets - - design: - for all facets - report flipped facets - if ZEROcentrum and simplicial neighbors - test vertices for neighboring simplicial facets - else - test centrum against all neighbors -*/ -void qh_checkconvex(facetT *facetlist, int fault) { - facetT *facet, *neighbor, **neighborp, *errfacet1=NULL, *errfacet2=NULL; - vertexT *vertex; - realT dist; - pointT *centrum; - boolT waserror= False, centrum_warning= False, tempcentrum= False, allsimplicial; - int neighbor_i; - - trace1((qh ferr, "qh_checkconvex: check all ridges are convex\n")); - if (!qh RERUN) { - zzval_(Zconcaveridges)= 0; - zzval_(Zcoplanarridges)= 0; - } - FORALLfacet_(facetlist) { - if (facet->flipped) { - qh_precision ("flipped facet"); - fprintf (qh ferr, "qhull precision error: f%d is flipped (interior point is outside)\n", - facet->id); - errfacet1= facet; - waserror= True; - continue; - } - if (qh MERGING && (!qh ZEROcentrum || !facet->simplicial || facet->tricoplanar)) - allsimplicial= False; - else { - allsimplicial= True; - neighbor_i= 0; - FOREACHneighbor_(facet) { - vertex= SETelemt_(facet->vertices, neighbor_i++, vertexT); - if (!neighbor->simplicial || neighbor->tricoplanar) { - allsimplicial= False; - continue; - } - qh_distplane (vertex->point, neighbor, &dist); - if (dist > -qh DISTround) { - if (fault == qh_DATAfault) { - qh_precision ("coplanar or concave ridge"); - fprintf (qh ferr, "qhull precision error: initial simplex is not convex. Distance=%.2g\n", dist); - qh_errexit(qh_ERRsingular, NULL, NULL); - } - if (dist > qh DISTround) { - zzinc_(Zconcaveridges); - qh_precision ("concave ridge"); - fprintf (qh ferr, "qhull precision error: f%d is concave to f%d, since p%d (v%d) is %6.4g above\n", - facet->id, neighbor->id, qh_pointid(vertex->point), vertex->id, dist); - errfacet1= facet; - errfacet2= neighbor; - waserror= True; - }else if (qh ZEROcentrum) { - if (dist > 0) { /* qh_checkzero checks that dist < - qh DISTround */ - zzinc_(Zcoplanarridges); - qh_precision ("coplanar ridge"); - fprintf (qh ferr, "qhull precision error: f%d is clearly not convex to f%d, since p%d (v%d) is %6.4g above\n", - facet->id, neighbor->id, qh_pointid(vertex->point), vertex->id, dist); - errfacet1= facet; - errfacet2= neighbor; - waserror= True; - } - }else { - zzinc_(Zcoplanarridges); - qh_precision ("coplanar ridge"); - trace0((qh ferr, "qhull precision error: f%d may be coplanar to f%d, since p%d (v%d) is within %6.4g during p%d\n", - facet->id, neighbor->id, qh_pointid(vertex->point), vertex->id, dist, qh furthest_id)); - } - } - } - } - if (!allsimplicial) { - if (qh CENTERtype == qh_AScentrum) { - if (!facet->center) - facet->center= qh_getcentrum (facet); - centrum= facet->center; - }else { - if (!centrum_warning && (!facet->simplicial || facet->tricoplanar)) { - centrum_warning= True; - fprintf (qh ferr, "qhull note: recomputing centrums for convexity test. This may lead to false, precision errors.\n"); - } - centrum= qh_getcentrum(facet); - tempcentrum= True; - } - FOREACHneighbor_(facet) { - if (qh ZEROcentrum && facet->simplicial && neighbor->simplicial) - continue; - if (facet->tricoplanar || neighbor->tricoplanar) - continue; - zzinc_(Zdistconvex); - qh_distplane (centrum, neighbor, &dist); - if (dist > qh DISTround) { - zzinc_(Zconcaveridges); - qh_precision ("concave ridge"); - fprintf (qh ferr, "qhull precision error: f%d is concave to f%d. Centrum of f%d is %6.4g above f%d\n", - facet->id, neighbor->id, facet->id, dist, neighbor->id); - errfacet1= facet; - errfacet2= neighbor; - waserror= True; - }else if (dist >= 0.0) { /* if arithmetic always rounds the same, - can test against centrum radius instead */ - zzinc_(Zcoplanarridges); - qh_precision ("coplanar ridge"); - fprintf (qh ferr, "qhull precision error: f%d is coplanar or concave to f%d. Centrum of f%d is %6.4g above f%d\n", - facet->id, neighbor->id, facet->id, dist, neighbor->id); - errfacet1= facet; - errfacet2= neighbor; - waserror= True; - } - } - if (tempcentrum) - qh_memfree(centrum, qh normal_size); - } - } - if (waserror && !qh FORCEoutput) - qh_errexit2 (qh_ERRprec, errfacet1, errfacet2); -} /* checkconvex */ - - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="checkfacet">-</a> - - qh_checkfacet( facet, newmerge, waserror ) - checks for consistency errors in facet - newmerge set if from merge.c - - returns: - sets waserror if any error occurs - - checks: - vertex ids are inverse sorted - unless newmerge, at least hull_dim neighbors and vertices (exactly if simplicial) - if non-simplicial, at least as many ridges as neighbors - neighbors are not duplicated - ridges are not duplicated - in 3-d, ridges=verticies - (qh.hull_dim-1) ridge vertices - neighbors are reciprocated - ridge neighbors are facet neighbors and a ridge for every neighbor - simplicial neighbors match facetintersect - vertex intersection matches vertices of common ridges - vertex neighbors and facet vertices agree - all ridges have distinct vertex sets - - notes: - uses neighbor->seen - - design: - check sets - check vertices - check sizes of neighbors and vertices - check for qh_MERGEridge and qh_DUPLICATEridge flags - check neighbor set - check ridge set - check ridges, neighbors, and vertices -*/ -void qh_checkfacet(facetT *facet, boolT newmerge, boolT *waserrorp) { - facetT *neighbor, **neighborp, *errother=NULL; - ridgeT *ridge, **ridgep, *errridge= NULL, *ridge2; - vertexT *vertex, **vertexp; - unsigned previousid= INT_MAX; - int numneighbors, numvertices, numridges=0, numRvertices=0; - boolT waserror= False; - int skipA, skipB, ridge_i, ridge_n, i; - setT *intersection; - - if (facet->visible) { - fprintf (qh ferr, "qhull internal error (qh_checkfacet): facet f%d is on the visible_list\n", - facet->id); - qh_errexit (qh_ERRqhull, facet, NULL); - } - if (!facet->normal) { - fprintf (qh ferr, "qhull internal error (qh_checkfacet): facet f%d does not have a normal\n", - facet->id); - waserror= True; - } - qh_setcheck (facet->vertices, "vertices for f", facet->id); - qh_setcheck (facet->ridges, "ridges for f", facet->id); - qh_setcheck (facet->outsideset, "outsideset for f", facet->id); - qh_setcheck (facet->coplanarset, "coplanarset for f", facet->id); - qh_setcheck (facet->neighbors, "neighbors for f", facet->id); - FOREACHvertex_(facet->vertices) { - if (vertex->deleted) { - fprintf(qh ferr, "qhull internal error (qh_checkfacet): deleted vertex v%d in f%d\n", vertex->id, facet->id); - qh_errprint ("ERRONEOUS", NULL, NULL, NULL, vertex); - waserror= True; - } - if (vertex->id >= previousid) { - fprintf(qh ferr, "qhull internal error (qh_checkfacet): vertices of f%d are not in descending id order at v%d\n", facet->id, vertex->id); - waserror= True; - break; - } - previousid= vertex->id; - } - numneighbors= qh_setsize(facet->neighbors); - numvertices= qh_setsize(facet->vertices); - numridges= qh_setsize(facet->ridges); - if (facet->simplicial) { - if (numvertices+numneighbors != 2*qh hull_dim - && !facet->degenerate && !facet->redundant) { - fprintf(qh ferr, "qhull internal error (qh_checkfacet): for simplicial facet f%d, #vertices %d + #neighbors %d != 2*qh hull_dim\n", - facet->id, numvertices, numneighbors); - qh_setprint (qh ferr, "", facet->neighbors); - waserror= True; - } - }else { /* non-simplicial */ - if (!newmerge - &&(numvertices < qh hull_dim || numneighbors < qh hull_dim) - && !facet->degenerate && !facet->redundant) { - fprintf(qh ferr, "qhull internal error (qh_checkfacet): for facet f%d, #vertices %d or #neighbors %d < qh hull_dim\n", - facet->id, numvertices, numneighbors); - waserror= True; - } - /* in 3-d, can get a vertex twice in an edge list, e.g., RBOX 1000 s W1e-13 t995849315 D2 | QHULL d Tc Tv TP624 TW1e-13 T4 */ - if (numridges < numneighbors - ||(qh hull_dim == 3 && numvertices > numridges && !qh NEWfacets) - ||(qh hull_dim == 2 && numridges + numvertices + numneighbors != 6)) { - if (!facet->degenerate && !facet->redundant) { - fprintf(qh ferr, "qhull internal error (qh_checkfacet): for facet f%d, #ridges %d < #neighbors %d or (3-d) > #vertices %d or (2-d) not all 2\n", - facet->id, numridges, numneighbors, numvertices); - waserror= True; - } - } - } - FOREACHneighbor_(facet) { - if (neighbor == qh_MERGEridge || neighbor == qh_DUPLICATEridge) { - fprintf(qh ferr, "qhull internal error (qh_checkfacet): facet f%d still has a MERGE or DUP neighbor\n", facet->id); - qh_errexit (qh_ERRqhull, facet, NULL); - } - neighbor->seen= True; - } - FOREACHneighbor_(facet) { - if (!qh_setin(neighbor->neighbors, facet)) { - fprintf(qh ferr, "qhull internal error (qh_checkfacet): facet f%d has neighbor f%d, but f%d does not have neighbor f%d\n", - facet->id, neighbor->id, neighbor->id, facet->id); - errother= neighbor; - waserror= True; - } - if (!neighbor->seen) { - fprintf(qh ferr, "qhull internal error (qh_checkfacet): facet f%d has a duplicate neighbor f%d\n", - facet->id, neighbor->id); - errother= neighbor; - waserror= True; - } - neighbor->seen= False; - } - FOREACHridge_(facet->ridges) { - qh_setcheck (ridge->vertices, "vertices for r", ridge->id); - ridge->seen= False; - } - FOREACHridge_(facet->ridges) { - if (ridge->seen) { - fprintf(qh ferr, "qhull internal error (qh_checkfacet): facet f%d has a duplicate ridge r%d\n", - facet->id, ridge->id); - errridge= ridge; - waserror= True; - } - ridge->seen= True; - numRvertices= qh_setsize(ridge->vertices); - if (numRvertices != qh hull_dim - 1) { - fprintf(qh ferr, "qhull internal error (qh_checkfacet): ridge between f%d and f%d has %d vertices\n", - ridge->top->id, ridge->bottom->id, numRvertices); - errridge= ridge; - waserror= True; - } - neighbor= otherfacet_(ridge, facet); - neighbor->seen= True; - if (!qh_setin(facet->neighbors, neighbor)) { - fprintf(qh ferr, "qhull internal error (qh_checkfacet): for facet f%d, neighbor f%d of ridge r%d not in facet\n", - facet->id, neighbor->id, ridge->id); - errridge= ridge; - waserror= True; - } - } - if (!facet->simplicial) { - FOREACHneighbor_(facet) { - if (!neighbor->seen) { - fprintf(qh ferr, "qhull internal error (qh_checkfacet): facet f%d does not have a ridge for neighbor f%d\n", - facet->id, neighbor->id); - errother= neighbor; - waserror= True; - } - intersection= qh_vertexintersect_new(facet->vertices, neighbor->vertices); - qh_settemppush (intersection); - FOREACHvertex_(facet->vertices) { - vertex->seen= False; - vertex->seen2= False; - } - FOREACHvertex_(intersection) - vertex->seen= True; - FOREACHridge_(facet->ridges) { - if (neighbor != otherfacet_(ridge, facet)) - continue; - FOREACHvertex_(ridge->vertices) { - if (!vertex->seen) { - fprintf (qh ferr, "qhull internal error (qh_checkfacet): vertex v%d in r%d not in f%d intersect f%d\n", - vertex->id, ridge->id, facet->id, neighbor->id); - qh_errexit (qh_ERRqhull, facet, ridge); - } - vertex->seen2= True; - } - } - if (!newmerge) { - FOREACHvertex_(intersection) { - if (!vertex->seen2) { - if (qh IStracing >=3 || !qh MERGING) { - fprintf (qh ferr, "qhull precision error (qh_checkfacet): vertex v%d in f%d intersect f%d but\n\ - not in a ridge. This is ok under merging. Last point was p%d\n", - vertex->id, facet->id, neighbor->id, qh furthest_id); - if (!qh FORCEoutput && !qh MERGING) { - qh_errprint ("ERRONEOUS", facet, neighbor, NULL, vertex); - if (!qh MERGING) - qh_errexit (qh_ERRqhull, NULL, NULL); - } - } - } - } - } - qh_settempfree (&intersection); - } - }else { /* simplicial */ - FOREACHneighbor_(facet) { - if (neighbor->simplicial) { - skipA= SETindex_(facet->neighbors, neighbor); - skipB= qh_setindex (neighbor->neighbors, facet); - if (!qh_setequal_skip (facet->vertices, skipA, neighbor->vertices, skipB)) { - fprintf (qh ferr, "qhull internal error (qh_checkfacet): facet f%d skip %d and neighbor f%d skip %d do not match \n", - facet->id, skipA, neighbor->id, skipB); - errother= neighbor; - waserror= True; - } - } - } - } - if (qh hull_dim < 5 && (qh IStracing > 2 || qh CHECKfrequently)) { - FOREACHridge_i_(facet->ridges) { /* expensive */ - for (i= ridge_i+1; i < ridge_n; i++) { - ridge2= SETelemt_(facet->ridges, i, ridgeT); - if (qh_setequal (ridge->vertices, ridge2->vertices)) { - fprintf (qh ferr, "qh_checkfacet: ridges r%d and r%d have the same vertices\n", - ridge->id, ridge2->id); - errridge= ridge; - waserror= True; - } - } - } - } - if (waserror) { - qh_errprint("ERRONEOUS", facet, errother, errridge, NULL); - *waserrorp= True; - } -} /* checkfacet */ - - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="checkflipped_all">-</a> - - qh_checkflipped_all( facetlist ) - checks orientation of facets in list against interior point -*/ -void qh_checkflipped_all (facetT *facetlist) { - facetT *facet; - boolT waserror= False; - realT dist; - - if (facetlist == qh facet_list) - zzval_(Zflippedfacets)= 0; - FORALLfacet_(facetlist) { - if (facet->normal && !qh_checkflipped (facet, &dist, !qh_ALL)) { - fprintf(qh ferr, "qhull precision error: facet f%d is flipped, distance= %6.12g\n", - facet->id, dist); - if (!qh FORCEoutput) { - qh_errprint("ERRONEOUS", facet, NULL, NULL, NULL); - waserror= True; - } - } - } - if (waserror) { - fprintf (qh ferr, "\n\ -A flipped facet occurs when its distance to the interior point is\n\ -greater than %2.2g, the maximum roundoff error.\n", -qh DISTround); - qh_errexit(qh_ERRprec, NULL, NULL); - } -} /* checkflipped_all */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="checkpolygon">-</a> - - qh_checkpolygon( facetlist ) - checks the correctness of the structure - - notes: - call with either qh.facet_list or qh.newfacet_list - checks num_facets and num_vertices if qh.facet_list - - design: - for each facet - checks facet and outside set - initializes vertexlist - for each facet - checks vertex set - if checking all facets (qh.facetlist) - check facet count - if qh.VERTEXneighbors - check vertex neighbors and count - check vertex count -*/ -void qh_checkpolygon(facetT *facetlist) { - facetT *facet; - vertexT *vertex, **vertexp, *vertexlist; - int numfacets= 0, numvertices= 0, numridges= 0; - int totvneighbors= 0, totvertices= 0; - boolT waserror= False, nextseen= False, visibleseen= False; - - trace1((qh ferr, "qh_checkpolygon: check all facets from f%d\n", facetlist->id)); - if (facetlist != qh facet_list || qh ONLYgood) - nextseen= True; - FORALLfacet_(facetlist) { - if (facet == qh visible_list) - visibleseen= True; - if (!facet->visible) { - if (!nextseen) { - if (facet == qh facet_next) - nextseen= True; - else if (qh_setsize (facet->outsideset)) { - if (!qh NARROWhull -#if !qh_COMPUTEfurthest - || facet->furthestdist >= qh MINoutside -#endif - ) { - fprintf (qh ferr, "qhull internal error (qh_checkpolygon): f%d has outside points before qh facet_next\n", - facet->id); - qh_errexit (qh_ERRqhull, facet, NULL); - } - } - } - numfacets++; - qh_checkfacet(facet, False, &waserror); - } - } - if (qh visible_list && !visibleseen && facetlist == qh facet_list) { - fprintf (qh ferr, "qhull internal error (qh_checkpolygon): visible list f%d no longer on facet list\n", qh visible_list->id); - qh_printlists(); - qh_errexit (qh_ERRqhull, qh visible_list, NULL); - } - if (facetlist == qh facet_list) - vertexlist= qh vertex_list; - else if (facetlist == qh newfacet_list) - vertexlist= qh newvertex_list; - else - vertexlist= NULL; - FORALLvertex_(vertexlist) { - vertex->seen= False; - vertex->visitid= 0; - } - FORALLfacet_(facetlist) { - if (facet->visible) - continue; - if (facet->simplicial) - numridges += qh hull_dim; - else - numridges += qh_setsize (facet->ridges); - FOREACHvertex_(facet->vertices) { - vertex->visitid++; - if (!vertex->seen) { - vertex->seen= True; - numvertices++; - if (qh_pointid (vertex->point) == -1) { - fprintf (qh ferr, "qhull internal error (qh_checkpolygon): unknown point %p for vertex v%d first_point %p\n", - vertex->point, vertex->id, qh first_point); - waserror= True; - } - } - } - } - qh vertex_visit += numfacets; - if (facetlist == qh facet_list) { - if (numfacets != qh num_facets - qh num_visible) { - fprintf(qh ferr, "qhull internal error (qh_checkpolygon): actual number of facets is %d, cumulative facet count is %d - %d visible facets\n", - numfacets, qh num_facets, qh num_visible); - waserror= True; - } - qh vertex_visit++; - if (qh VERTEXneighbors) { - FORALLvertices { - qh_setcheck (vertex->neighbors, "neighbors for v", vertex->id); - if (vertex->deleted) - continue; - totvneighbors += qh_setsize (vertex->neighbors); - } - FORALLfacet_(facetlist) - totvertices += qh_setsize (facet->vertices); - if (totvneighbors != totvertices) { - fprintf(qh ferr, "qhull internal error (qh_checkpolygon): vertex neighbors inconsistent. Totvneighbors %d, totvertices %d\n", - totvneighbors, totvertices); - waserror= True; - } - } - if (numvertices != qh num_vertices - qh_setsize(qh del_vertices)) { - fprintf(qh ferr, "qhull internal error (qh_checkpolygon): actual number of vertices is %d, cumulative vertex count is %d\n", - numvertices, qh num_vertices - qh_setsize(qh del_vertices)); - waserror= True; - } - if (qh hull_dim == 2 && numvertices != numfacets) { - fprintf (qh ferr, "qhull internal error (qh_checkpolygon): #vertices %d != #facets %d\n", - numvertices, numfacets); - waserror= True; - } - if (qh hull_dim == 3 && numvertices + numfacets - numridges/2 != 2) { - fprintf (qh ferr, "qhull warning: #vertices %d + #facets %d - #edges %d != 2\n\ - A vertex appears twice in a edge list. May occur during merging.", - numvertices, numfacets, numridges/2); - /* occurs if lots of merging and a vertex ends up twice in an edge list. e.g., RBOX 1000 s W1e-13 t995849315 D2 | QHULL d Tc Tv */ - } - } - if (waserror) - qh_errexit(qh_ERRqhull, NULL, NULL); -} /* checkpolygon */ - - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="checkvertex">-</a> - - qh_checkvertex( vertex ) - check vertex for consistency - checks vertex->neighbors - - notes: - neighbors checked efficiently in checkpolygon -*/ -void qh_checkvertex (vertexT *vertex) { - boolT waserror= False; - facetT *neighbor, **neighborp, *errfacet=NULL; - - if (qh_pointid (vertex->point) == -1) { - fprintf (qh ferr, "qhull internal error (qh_checkvertex): unknown point id %p\n", vertex->point); - waserror= True; - } - if (vertex->id >= qh vertex_id) { - fprintf (qh ferr, "qhull internal error (qh_checkvertex): unknown vertex id %d\n", vertex->id); - waserror= True; - } - if (!waserror && !vertex->deleted) { - if (qh_setsize (vertex->neighbors)) { - FOREACHneighbor_(vertex) { - if (!qh_setin (neighbor->vertices, vertex)) { - fprintf (qh ferr, "qhull internal error (qh_checkvertex): neighbor f%d does not contain v%d\n", neighbor->id, vertex->id); - errfacet= neighbor; - waserror= True; - } - } - } - } - if (waserror) { - qh_errprint ("ERRONEOUS", NULL, NULL, NULL, vertex); - qh_errexit (qh_ERRqhull, errfacet, NULL); - } -} /* checkvertex */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="clearcenters">-</a> - - qh_clearcenters( type ) - clear old data from facet->center - - notes: - sets new centertype - nop if CENTERtype is the same -*/ -void qh_clearcenters (qh_CENTER type) { - facetT *facet; - - if (qh CENTERtype != type) { - FORALLfacets { - if (qh CENTERtype == qh_ASvoronoi){ - if (facet->center) { - qh_memfree (facet->center, qh center_size); - facet->center= NULL; - } - }else /* qh CENTERtype == qh_AScentrum */ { - if (facet->center) { - qh_memfree (facet->center, qh normal_size); - facet->center= NULL; - } - } - } - qh CENTERtype= type; - } - trace2((qh ferr, "qh_clearcenters: switched to center type %d\n", type)); -} /* clearcenters */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="createsimplex">-</a> - - qh_createsimplex( vertices ) - creates a simplex from a set of vertices - - returns: - initializes qh.facet_list to the simplex - initializes qh.newfacet_list, .facet_tail - initializes qh.vertex_list, .newvertex_list, .vertex_tail - - design: - initializes lists - for each vertex - create a new facet - for each new facet - create its neighbor set -*/ -void qh_createsimplex(setT *vertices) { - facetT *facet= NULL, *newfacet; - boolT toporient= True; - int vertex_i, vertex_n, nth; - setT *newfacets= qh_settemp (qh hull_dim+1); - vertexT *vertex; - - qh facet_list= qh newfacet_list= qh facet_tail= qh_newfacet(); - qh num_facets= qh num_vertices= qh num_visible= 0; - qh vertex_list= qh newvertex_list= qh vertex_tail= qh_newvertex(NULL); - FOREACHvertex_i_(vertices) { - newfacet= qh_newfacet(); - newfacet->vertices= qh_setnew_delnthsorted (vertices, vertex_n, - vertex_i, 0); - newfacet->toporient= toporient; - qh_appendfacet(newfacet); - newfacet->newfacet= True; - qh_appendvertex (vertex); - qh_setappend (&newfacets, newfacet); - toporient ^= True; - } - FORALLnew_facets { - nth= 0; - FORALLfacet_(qh newfacet_list) { - if (facet != newfacet) - SETelem_(newfacet->neighbors, nth++)= facet; - } - qh_settruncate (newfacet->neighbors, qh hull_dim); - } - qh_settempfree (&newfacets); - trace1((qh ferr, "qh_createsimplex: created simplex\n")); -} /* createsimplex */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="delridge">-</a> - - qh_delridge( ridge ) - deletes ridge from data structures it belongs to - frees up its memory - - notes: - in merge.c, caller sets vertex->delridge for each vertex - ridges also freed in qh_freeqhull -*/ -void qh_delridge(ridgeT *ridge) { - void **freelistp; /* used !qh_NOmem */ - - qh_setdel(ridge->top->ridges, ridge); - qh_setdel(ridge->bottom->ridges, ridge); - qh_setfree(&(ridge->vertices)); - qh_memfree_(ridge, sizeof(ridgeT), freelistp); -} /* delridge */ - - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="delvertex">-</a> - - qh_delvertex( vertex ) - deletes a vertex and frees its memory - - notes: - assumes vertex->adjacencies have been updated if needed - unlinks from vertex_list -*/ -void qh_delvertex (vertexT *vertex) { - - if (vertex == qh tracevertex) - qh tracevertex= NULL; - qh_removevertex (vertex); - qh_setfree (&vertex->neighbors); - qh_memfree(vertex, sizeof(vertexT)); -} /* delvertex */ - - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="facet3vertex">-</a> - - qh_facet3vertex( ) - return temporary set of 3-d vertices in qh_ORIENTclock order - - design: - if simplicial facet - build set from facet->vertices with facet->toporient - else - for each ridge in order - build set from ridge's vertices -*/ -setT *qh_facet3vertex (facetT *facet) { - ridgeT *ridge, *firstridge; - vertexT *vertex; - int cntvertices, cntprojected=0; - setT *vertices; - - cntvertices= qh_setsize(facet->vertices); - vertices= qh_settemp (cntvertices); - if (facet->simplicial) { - if (cntvertices != 3) { - fprintf (qh ferr, "qhull internal error (qh_facet3vertex): only %d vertices for simplicial facet f%d\n", - cntvertices, facet->id); - qh_errexit(qh_ERRqhull, facet, NULL); - } - qh_setappend (&vertices, SETfirst_(facet->vertices)); - if (facet->toporient ^ qh_ORIENTclock) - qh_setappend (&vertices, SETsecond_(facet->vertices)); - else - qh_setaddnth (&vertices, 0, SETsecond_(facet->vertices)); - qh_setappend (&vertices, SETelem_(facet->vertices, 2)); - }else { - ridge= firstridge= SETfirstt_(facet->ridges, ridgeT); /* no infinite */ - while ((ridge= qh_nextridge3d (ridge, facet, &vertex))) { - qh_setappend (&vertices, vertex); - if (++cntprojected > cntvertices || ridge == firstridge) - break; - } - if (!ridge || cntprojected != cntvertices) { - fprintf (qh ferr, "qhull internal error (qh_facet3vertex): ridges for facet %d don't match up. got at least %d\n", - facet->id, cntprojected); - qh_errexit(qh_ERRqhull, facet, ridge); - } - } - return vertices; -} /* facet3vertex */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="findbestfacet">-</a> - - qh_findbestfacet( point, bestoutside, bestdist, isoutside ) - find facet that is furthest below a point - - for Delaunay triangulations, - Use qh_setdelaunay() to lift point to paraboloid and scale by 'Qbb' if needed - Do not use options 'Qbk', 'QBk', or 'QbB' since they scale the coordinates. - - returns: - if bestoutside is set (e.g., qh_ALL) - returns best facet that is not upperdelaunay - if Delaunay and inside, point is outside circumsphere of bestfacet - else - returns first facet below point - if point is inside, returns nearest, !upperdelaunay facet - distance to facet - isoutside set if outside of facet - - notes: - this works for all distributions - if inside, qh_findbestfacet performs an exhaustive search - this may be too conservative. Sometimes it is clearly required. - qh_findbestfacet is not used by qhull. - uses qh.visit_id and qh.coplanarset - - see: - <a href="geom.c#findbest">qh_findbest</a> -*/ -facetT *qh_findbestfacet (pointT *point, boolT bestoutside, - realT *bestdist, boolT *isoutside) { - facetT *bestfacet= NULL; - int numpart, totpart= 0; - - bestfacet= qh_findbest (point, qh facet_list, - bestoutside, !qh_ISnewfacets, bestoutside /* qh_NOupper */, - bestdist, isoutside, &totpart); - if (*bestdist < -qh DISTround) { - bestfacet= qh_findfacet_all (point, bestdist, isoutside, &numpart); - totpart += numpart; - if ((isoutside && bestoutside) - || (!isoutside && bestfacet->upperdelaunay)) { - bestfacet= qh_findbest (point, bestfacet, - bestoutside, False, bestoutside, - bestdist, isoutside, &totpart); - totpart += numpart; - } - } - trace3((qh ferr, "qh_findbestfacet: f%d dist %2.2g isoutside %d totpart %d\n", - bestfacet->id, *bestdist, *isoutside, totpart)); - return bestfacet; -} /* findbestfacet */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="findfacet_all">-</a> - - qh_findfacet_all( point, bestdist, isoutside, numpart ) - exhaustive search for facet below a point - - for Delaunay triangulations, - Use qh_setdelaunay() to lift point to paraboloid and scale by 'Qbb' if needed - Do not use options 'Qbk', 'QBk', or 'QbB' since they scale the coordinates. - - returns: - returns first facet below point - if point is inside, - returns nearest facet - distance to facet - isoutside if point is outside of the hull - number of distance tests -*/ -facetT *qh_findfacet_all (pointT *point, realT *bestdist, boolT *isoutside, - int *numpart) { - facetT *bestfacet= NULL, *facet; - realT dist; - int totpart= 0; - - *bestdist= REALmin; - *isoutside= False; - FORALLfacets { - if (facet->flipped || !facet->normal) - continue; - totpart++; - qh_distplane (point, facet, &dist); - if (dist > *bestdist) { - *bestdist= dist; - bestfacet= facet; - if (dist > qh MINoutside) { - *isoutside= True; - break; - } - } - } - *numpart= totpart; - trace3((qh ferr, "qh_findfacet_all: f%d dist %2.2g isoutside %d totpart %d\n", - getid_(bestfacet), *bestdist, *isoutside, totpart)); - return bestfacet; -} /* findfacet_all */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="findgood">-</a> - - qh_findgood( facetlist, goodhorizon ) - identify good facets for qh.PRINTgood - if qh.GOODvertex>0 - facet includes point as vertex - if !match, returns goodhorizon - inactive if qh.MERGING - if qh.GOODpoint - facet is visible or coplanar (>0) or not visible (<0) - if qh.GOODthreshold - facet->normal matches threshold - if !goodhorizon and !match, - selects facet with closest angle - sets GOODclosest - - returns: - number of new, good facets found - determines facet->good - may update qh.GOODclosest - - notes: - qh_findgood_all further reduces the good region - - design: - count good facets - mark good facets for qh.GOODpoint - mark good facets for qh.GOODthreshold - if necessary - update qh.GOODclosest -*/ -int qh_findgood (facetT *facetlist, int goodhorizon) { - facetT *facet, *bestfacet= NULL; - realT angle, bestangle= REALmax, dist; - int numgood=0; - - FORALLfacet_(facetlist) { - if (facet->good) - numgood++; - } - if (qh GOODvertex>0 && !qh MERGING) { - FORALLfacet_(facetlist) { - if (!qh_isvertex (qh GOODvertexp, facet->vertices)) { - facet->good= False; - numgood--; - } - } - } - if (qh GOODpoint && numgood) { - FORALLfacet_(facetlist) { - if (facet->good && facet->normal) { - zinc_(Zdistgood); - qh_distplane (qh GOODpointp, facet, &dist); - if ((qh GOODpoint > 0) ^ (dist > 0.0)) { - facet->good= False; - numgood--; - } - } - } - } - if (qh GOODthreshold && (numgood || goodhorizon || qh GOODclosest)) { - FORALLfacet_(facetlist) { - if (facet->good && facet->normal) { - if (!qh_inthresholds (facet->normal, &angle)) { - facet->good= False; - numgood--; - if (angle < bestangle) { - bestangle= angle; - bestfacet= facet; - } - } - } - } - if (!numgood && (!goodhorizon || qh GOODclosest)) { - if (qh GOODclosest) { - if (qh GOODclosest->visible) - qh GOODclosest= NULL; - else { - qh_inthresholds (qh GOODclosest->normal, &angle); - if (angle < bestangle) - bestfacet= qh GOODclosest; - } - } - if (bestfacet && bestfacet != qh GOODclosest) { - if (qh GOODclosest) - qh GOODclosest->good= False; - qh GOODclosest= bestfacet; - bestfacet->good= True; - numgood++; - trace2((qh ferr, "qh_findgood: f%d is closest (%2.2g) to thresholds\n", - bestfacet->id, bestangle)); - return numgood; - } - }else if (qh GOODclosest) { /* numgood > 0 */ - qh GOODclosest->good= False; - qh GOODclosest= NULL; - } - } - zadd_(Zgoodfacet, numgood); - trace2((qh ferr, "qh_findgood: found %d good facets with %d good horizon\n", - numgood, goodhorizon)); - if (!numgood && qh GOODvertex>0 && !qh MERGING) - return goodhorizon; - return numgood; -} /* findgood */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="findgood_all">-</a> - - qh_findgood_all( facetlist ) - apply other constraints for good facets (used by qh.PRINTgood) - if qh.GOODvertex - facet includes (>0) or doesn't include (<0) point as vertex - if last good facet and ONLYgood, prints warning and continues - if qh.SPLITthresholds - facet->normal matches threshold, or if none, the closest one - calls qh_findgood - nop if good not used - - returns: - clears facet->good if not good - sets qh.num_good - - notes: - this is like qh_findgood but more restrictive - - design: - uses qh_findgood to mark good facets - marks facets for qh.GOODvertex - marks facets for qh.SPLITthreholds -*/ -void qh_findgood_all (facetT *facetlist) { - facetT *facet, *bestfacet=NULL; - realT angle, bestangle= REALmax; - int numgood=0, startgood; - - if (!qh GOODvertex && !qh GOODthreshold && !qh GOODpoint - && !qh SPLITthresholds) - return; - if (!qh ONLYgood) - qh_findgood (qh facet_list, 0); - FORALLfacet_(facetlist) { - if (facet->good) - numgood++; - } - if (qh GOODvertex <0 || (qh GOODvertex > 0 && qh MERGING)) { - FORALLfacet_(facetlist) { - if (facet->good && ((qh GOODvertex > 0) ^ !!qh_isvertex (qh GOODvertexp, facet->vertices))) { - if (!--numgood) { - if (qh ONLYgood) { - fprintf (qh ferr, "qhull warning: good vertex p%d does not match last good facet f%d. Ignored.\n", - qh_pointid(qh GOODvertexp), facet->id); - return; - }else if (qh GOODvertex > 0) - fprintf (qh ferr, "qhull warning: point p%d is not a vertex ('QV%d').\n", - qh GOODvertex-1, qh GOODvertex-1); - else - fprintf (qh ferr, "qhull warning: point p%d is a vertex for every facet ('QV-%d').\n", - -qh GOODvertex - 1, -qh GOODvertex - 1); - } - facet->good= False; - } - } - } - startgood= numgood; - if (qh SPLITthresholds) { - FORALLfacet_(facetlist) { - if (facet->good) { - if (!qh_inthresholds (facet->normal, &angle)) { - facet->good= False; - numgood--; - if (angle < bestangle) { - bestangle= angle; - bestfacet= facet; - } - } - } - } - if (!numgood && bestfacet) { - bestfacet->good= True; - numgood++; - trace0((qh ferr, "qh_findgood_all: f%d is closest (%2.2g) to thresholds\n", - bestfacet->id, bestangle)); - return; - } - } - qh num_good= numgood; - trace0((qh ferr, "qh_findgood_all: %d good facets remain out of %d facets\n", - numgood, startgood)); -} /* findgood_all */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="furthestnext">-</a> - - qh_furthestnext() - set qh.facet_next to facet with furthest of all furthest points - searches all facets on qh.facet_list - - notes: - this may help avoid precision problems -*/ -void qh_furthestnext (void /* qh facet_list */) { - facetT *facet, *bestfacet= NULL; - realT dist, bestdist= -REALmax; - - FORALLfacets { - if (facet->outsideset) { -#if qh_COMPUTEfurthest - pointT *furthest; - furthest= (pointT*)qh_setlast (facet->outsideset); - zinc_(Zcomputefurthest); - qh_distplane (furthest, facet, &dist); -#else - dist= facet->furthestdist; -#endif - if (dist > bestdist) { - bestfacet= facet; - bestdist= dist; - } - } - } - if (bestfacet) { - qh_removefacet (bestfacet); - qh_prependfacet (bestfacet, &qh facet_next); - trace1((qh ferr, "qh_furthestnext: made f%d next facet (dist %.2g)\n", - bestfacet->id, bestdist)); - } -} /* furthestnext */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="furthestout">-</a> - - qh_furthestout( facet ) - make furthest outside point the last point of outsideset - - returns: - updates facet->outsideset - clears facet->notfurthest - sets facet->furthestdist - - design: - determine best point of outsideset - make it the last point of outsideset -*/ -void qh_furthestout (facetT *facet) { - pointT *point, **pointp, *bestpoint= NULL; - realT dist, bestdist= -REALmax; - - FOREACHpoint_(facet->outsideset) { - qh_distplane (point, facet, &dist); - zinc_(Zcomputefurthest); - if (dist > bestdist) { - bestpoint= point; - bestdist= dist; - } - } - if (bestpoint) { - qh_setdel (facet->outsideset, point); - qh_setappend (&facet->outsideset, point); -#if !qh_COMPUTEfurthest - facet->furthestdist= bestdist; -#endif - } - facet->notfurthest= False; - trace3((qh ferr, "qh_furthestout: p%d is furthest outside point of f%d\n", - qh_pointid (point), facet->id)); -} /* furthestout */ - - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="infiniteloop">-</a> - - qh_infiniteloop( facet ) - report infinite loop error due to facet -*/ -void qh_infiniteloop (facetT *facet) { - - fprintf (qh ferr, "qhull internal error (qh_infiniteloop): potential infinite loop detected\n"); - qh_errexit (qh_ERRqhull, facet, NULL); -} /* qh_infiniteloop */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="initbuild">-</a> - - qh_initbuild() - initialize hull and outside sets with point array - qh.FIRSTpoint/qh.NUMpoints is point array - if qh.GOODpoint - adds qh.GOODpoint to initial hull - - returns: - qh_facetlist with initial hull - points partioned into outside sets, coplanar sets, or inside - initializes qh.GOODpointp, qh.GOODvertexp, - - design: - initialize global variables used during qh_buildhull - determine precision constants and points with max/min coordinate values - if qh.SCALElast, scale last coordinate (for 'd') - build initial simplex - partition input points into facets of initial simplex - set up lists - if qh.ONLYgood - check consistency - add qh.GOODvertex if defined -*/ -void qh_initbuild( void) { - setT *maxpoints, *vertices; - facetT *facet; - int i, numpart; - realT dist; - boolT isoutside; - - qh furthest_id= -1; - qh lastreport= 0; - qh facet_id= qh vertex_id= qh ridge_id= 0; - qh visit_id= qh vertex_visit= 0; - qh maxoutdone= False; - - if (qh GOODpoint > 0) - qh GOODpointp= qh_point (qh GOODpoint-1); - else if (qh GOODpoint < 0) - qh GOODpointp= qh_point (-qh GOODpoint-1); - if (qh GOODvertex > 0) - qh GOODvertexp= qh_point (qh GOODvertex-1); - else if (qh GOODvertex < 0) - qh GOODvertexp= qh_point (-qh GOODvertex-1); - if ((qh GOODpoint - && (qh GOODpointp < qh first_point /* also catches !GOODpointp */ - || qh GOODpointp > qh_point (qh num_points-1))) - || (qh GOODvertex - && (qh GOODvertexp < qh first_point /* also catches !GOODvertexp */ - || qh GOODvertexp > qh_point (qh num_points-1)))) { - fprintf (qh ferr, "qhull input error: either QGn or QVn point is > p%d\n", - qh num_points-1); - qh_errexit (qh_ERRinput, NULL, NULL); - } - maxpoints= qh_maxmin(qh first_point, qh num_points, qh hull_dim); - if (qh SCALElast) - qh_scalelast (qh first_point, qh num_points, qh hull_dim, - qh MINlastcoord, qh MAXlastcoord, qh MAXwidth); - qh_detroundoff(); - if (qh DELAUNAY && qh upper_threshold[qh hull_dim-1] > REALmax/2 - && qh lower_threshold[qh hull_dim-1] < -REALmax/2) { - for (i= qh_PRINTEND; i--; ) { - if (qh PRINTout[i] == qh_PRINTgeom && qh DROPdim < 0 - && !qh GOODthreshold && !qh SPLITthresholds) - break; /* in this case, don't set upper_threshold */ - } - if (i < 0) { - if (qh UPPERdelaunay) { /* matches qh.upperdelaunay in qh_setfacetplane */ - qh lower_threshold[qh hull_dim-1]= qh ANGLEround * qh_ZEROdelaunay; - qh GOODthreshold= True; - }else { - qh upper_threshold[qh hull_dim-1]= -qh ANGLEround * qh_ZEROdelaunay; - if (!qh GOODthreshold) - qh SPLITthresholds= True; /* build upper-convex hull even if Qg */ - /* qh_initqhull_globals errors if Qg without Pdk/etc. */ - } - } - } - vertices= qh_initialvertices(qh hull_dim, maxpoints, qh first_point, qh num_points); - qh_initialhull (vertices); /* initial qh facet_list */ - qh_partitionall (vertices, qh first_point, qh num_points); - if (qh PRINToptions1st || qh TRACElevel || qh IStracing) { - if (qh TRACElevel || qh IStracing) - fprintf (qh ferr, "\nTrace level %d for %s | %s\n", - qh IStracing ? qh IStracing : qh TRACElevel, qh rbox_command, qh qhull_command); - fprintf (qh ferr, "Options selected for Qhull %s:\n%s\n", qh_VERSION, qh qhull_options); - } - qh_resetlists (False, qh_RESETvisible /*qh visible_list newvertex_list newfacet_list */); - qh facet_next= qh facet_list; - qh_furthestnext (/* qh facet_list */); - if (qh PREmerge) { - qh cos_max= qh premerge_cos; - qh centrum_radius= qh premerge_centrum; - } - if (qh ONLYgood) { - if (qh GOODvertex > 0 && qh MERGING) { - fprintf (qh ferr, "qhull input error: 'Qg QVn' (only good vertex) does not work with merging.\nUse 'QJ' to joggle the input or 'Q0' to turn off merging.\n"); - qh_errexit (qh_ERRinput, NULL, NULL); - } - if (!(qh GOODthreshold || qh GOODpoint - || (!qh MERGEexact && !qh PREmerge && qh GOODvertexp))) { - fprintf (qh ferr, "qhull input error: 'Qg' (ONLYgood) needs a good threshold ('Pd0D0'), a\n\ -good point (QGn or QG-n), or a good vertex with 'QJ' or 'Q0' (QVn).\n"); - qh_errexit (qh_ERRinput, NULL, NULL); - } - if (qh GOODvertex > 0 && !qh MERGING /* matches qh_partitionall */ - && !qh_isvertex (qh GOODvertexp, vertices)) { - facet= qh_findbestnew (qh GOODvertexp, qh facet_list, - &dist, !qh_ALL, &isoutside, &numpart); - zadd_(Zdistgood, numpart); - if (!isoutside) { - fprintf (qh ferr, "qhull input error: point for QV%d is inside initial simplex. It can not be made a vertex.\n", - qh_pointid(qh GOODvertexp)); - qh_errexit (qh_ERRinput, NULL, NULL); - } - if (!qh_addpoint (qh GOODvertexp, facet, False)) { - qh_settempfree(&vertices); - qh_settempfree(&maxpoints); - return; - } - } - qh_findgood (qh facet_list, 0); - } - qh_settempfree(&vertices); - qh_settempfree(&maxpoints); - trace1((qh ferr, "qh_initbuild: initial hull created and points partitioned\n")); -} /* initbuild */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="initialhull">-</a> - - qh_initialhull( vertices ) - constructs the initial hull as a DIM3 simplex of vertices - - design: - creates a simplex (initializes lists) - determines orientation of simplex - sets hyperplanes for facets - doubles checks orientation (in case of axis-parallel facets with Gaussian elimination) - checks for flipped facets and qh.NARROWhull - checks the result -*/ -void qh_initialhull(setT *vertices) { - facetT *facet, *firstfacet, *neighbor, **neighborp; - realT dist, angle, minangle= REALmax; -#ifndef qh_NOtrace - int k; -#endif - - qh_createsimplex(vertices); /* qh facet_list */ - qh_resetlists (False, qh_RESETvisible); - qh facet_next= qh facet_list; /* advance facet when processed */ - qh interior_point= qh_getcenter(vertices); - firstfacet= qh facet_list; - qh_setfacetplane(firstfacet); - zinc_(Znumvisibility); /* needs to be in printsummary */ - qh_distplane(qh interior_point, firstfacet, &dist); - if (dist > 0) { - FORALLfacets - facet->toporient ^= True; - } - FORALLfacets - qh_setfacetplane(facet); - FORALLfacets { - if (!qh_checkflipped (facet, NULL, qh_ALL)) {/* due to axis-parallel facet */ - trace1((qh ferr, "qh_initialhull: initial orientation incorrect. Correct all facets\n")); - facet->flipped= False; - FORALLfacets { - facet->toporient ^= True; - qh_orientoutside (facet); - } - break; - } - } - FORALLfacets { - if (!qh_checkflipped (facet, NULL, !qh_ALL)) { /* can happen with 'R0.1' */ - qh_precision ("initial facet is coplanar with interior point"); - fprintf (qh ferr, "qhull precision error: initial facet %d is coplanar with the interior point\n", - facet->id); - qh_errexit (qh_ERRsingular, facet, NULL); - } - FOREACHneighbor_(facet) { - angle= qh_getangle (facet->normal, neighbor->normal); - minimize_( minangle, angle); - } - } - if (minangle < qh_MAXnarrow && !qh NOnarrow) { - realT diff= 1.0 + minangle; - - qh NARROWhull= True; - qh_option ("_narrow-hull", NULL, &diff); - if (minangle < qh_WARNnarrow && !qh RERUN && qh PRINTprecision) - fprintf (qh ferr, "qhull precision warning: \n\ -The initial hull is narrow (cosine of min. angle is %.16f).\n\ -A coplanar point may lead to a wide facet. Options 'QbB' (scale to unit box)\n\ -or 'Qbb' (scale last coordinate) may remove this warning. Use 'Pp' to skip\n\ -this warning. See 'Limitations' in qh-impre.htm.\n", - -minangle); /* convert from angle between normals to angle between facets */ - } - zzval_(Zprocessed)= qh hull_dim+1; - qh_checkpolygon (qh facet_list); - qh_checkconvex(qh facet_list, qh_DATAfault); -#ifndef qh_NOtrace - if (qh IStracing >= 1) { - fprintf(qh ferr, "qh_initialhull: simplex constructed, interior point:"); - for (k=0; k < qh hull_dim; k++) - fprintf (qh ferr, " %6.4g", qh interior_point[k]); - fprintf (qh ferr, "\n"); - } -#endif -} /* initialhull */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="initialvertices">-</a> - - qh_initialvertices( dim, maxpoints, points, numpoints ) - determines a non-singular set of initial vertices - maxpoints may include duplicate points - - returns: - temporary set of dim+1 vertices in descending order by vertex id - if qh.RANDOMoutside && !qh.ALLpoints - picks random points - if dim >= qh_INITIALmax, - uses min/max x and max points with non-zero determinants - - notes: - unless qh.ALLpoints, - uses maxpoints as long as determinate is non-zero -*/ -setT *qh_initialvertices(int dim, setT *maxpoints, pointT *points, int numpoints) { - pointT *point, **pointp; - setT *vertices, *simplex, *tested; - realT randr; - int index, point_i, point_n, k; - boolT nearzero= False; - - vertices= qh_settemp (dim + 1); - simplex= qh_settemp (dim+1); - if (qh ALLpoints) - qh_maxsimplex (dim, NULL, points, numpoints, &simplex); - else if (qh RANDOMoutside) { - while (qh_setsize (simplex) != dim+1) { - randr= qh_RANDOMint; - randr= randr/(qh_RANDOMmax+1); - index= (int)floor(qh num_points * randr); - while (qh_setin (simplex, qh_point (index))) { - index++; /* in case qh_RANDOMint always returns the same value */ - index= index < qh num_points ? index : 0; - } - qh_setappend (&simplex, qh_point (index)); - } - }else if (qh hull_dim >= qh_INITIALmax) { - tested= qh_settemp (dim+1); - qh_setappend (&simplex, SETfirst_(maxpoints)); /* max and min X coord */ - qh_setappend (&simplex, SETsecond_(maxpoints)); - qh_maxsimplex (fmin_(qh_INITIALsearch, dim), maxpoints, points, numpoints, &simplex); - k= qh_setsize (simplex); - FOREACHpoint_i_(maxpoints) { - if (point_i & 0x1) { /* first pick up max. coord. points */ - if (!qh_setin (simplex, point) && !qh_setin (tested, point)){ - qh_detsimplex(point, simplex, k, &nearzero); - if (nearzero) - qh_setappend (&tested, point); - else { - qh_setappend (&simplex, point); - if (++k == dim) /* use search for last point */ - break; - } - } - } - } - while (k != dim && (point= (pointT*)qh_setdellast (maxpoints))) { - if (!qh_setin (simplex, point) && !qh_setin (tested, point)){ - qh_detsimplex (point, simplex, k, &nearzero); - if (nearzero) - qh_setappend (&tested, point); - else { - qh_setappend (&simplex, point); - k++; - } - } - } - index= 0; - while (k != dim && (point= qh_point (index++))) { - if (!qh_setin (simplex, point) && !qh_setin (tested, point)){ - qh_detsimplex (point, simplex, k, &nearzero); - if (!nearzero){ - qh_setappend (&simplex, point); - k++; - } - } - } - qh_settempfree (&tested); - qh_maxsimplex (dim, maxpoints, points, numpoints, &simplex); - }else - qh_maxsimplex (dim, maxpoints, points, numpoints, &simplex); - FOREACHpoint_(simplex) - qh_setaddnth (&vertices, 0, qh_newvertex(point)); /* descending order */ - qh_settempfree (&simplex); - return vertices; -} /* initialvertices */ - - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="isvertex">-</a> - - qh_isvertex( ) - returns vertex if point is in vertex set, else returns NULL - - notes: - for qh.GOODvertex -*/ -vertexT *qh_isvertex (pointT *point, setT *vertices) { - vertexT *vertex, **vertexp; - - FOREACHvertex_(vertices) { - if (vertex->point == point) - return vertex; - } - return NULL; -} /* isvertex */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="makenewfacets">-</a> - - qh_makenewfacets( point ) - make new facets from point and qh.visible_list - - returns: - qh.newfacet_list= list of new facets with hyperplanes and ->newfacet - qh.newvertex_list= list of vertices in new facets with ->newlist set - - if (qh.ONLYgood) - newfacets reference horizon facets, but not vice versa - ridges reference non-simplicial horizon ridges, but not vice versa - does not change existing facets - else - sets qh.NEWfacets - new facets attached to horizon facets and ridges - for visible facets, - visible->r.replace is corresponding new facet - - see also: - qh_makenewplanes() -- make hyperplanes for facets - qh_attachnewfacets() -- attachnewfacets if not done here (qh ONLYgood) - qh_matchnewfacets() -- match up neighbors - qh_updatevertices() -- update vertex neighbors and delvertices - qh_deletevisible() -- delete visible facets - qh_checkpolygon() --check the result - qh_triangulate() -- triangulate a non-simplicial facet - - design: - for each visible facet - make new facets to its horizon facets - update its f.replace - clear its neighbor set -*/ -vertexT *qh_makenewfacets (pointT *point /*visible_list*/) { - facetT *visible, *newfacet= NULL, *newfacet2= NULL, *neighbor, **neighborp; - vertexT *apex; - int numnew=0; - - qh newfacet_list= qh facet_tail; - qh newvertex_list= qh vertex_tail; - apex= qh_newvertex(point); - qh_appendvertex (apex); - qh visit_id++; - if (!qh ONLYgood) - qh NEWfacets= True; - FORALLvisible_facets { - FOREACHneighbor_(visible) - neighbor->seen= False; - if (visible->ridges) { - visible->visitid= qh visit_id; - newfacet2= qh_makenew_nonsimplicial (visible, apex, &numnew); - } - if (visible->simplicial) - newfacet= qh_makenew_simplicial (visible, apex, &numnew); - if (!qh ONLYgood) { - if (newfacet2) /* newfacet is null if all ridges defined */ - newfacet= newfacet2; - if (newfacet) - visible->f.replace= newfacet; - else - zinc_(Zinsidevisible); - SETfirst_(visible->neighbors)= NULL; - } - } - trace1((qh ferr, "qh_makenewfacets: created %d new facets from point p%d to horizon\n", - numnew, qh_pointid(point))); - if (qh IStracing >= 4) - qh_printfacetlist (qh newfacet_list, NULL, qh_ALL); - return apex; -} /* makenewfacets */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="matchduplicates">-</a> - - qh_matchduplicates( atfacet, atskip, hashsize, hashcount ) - match duplicate ridges in qh.hash_table for atfacet/atskip - duplicates marked with ->dupridge and qh_DUPLICATEridge - - returns: - picks match with worst merge (min distance apart) - updates hashcount - - see also: - qh_matchneighbor - - notes: - - design: - compute hash value for atfacet and atskip - repeat twice -- once to make best matches, once to match the rest - for each possible facet in qh.hash_table - if it is a matching facet and pass 2 - make match - unless tricoplanar, mark match for merging (qh_MERGEridge) - [e.g., tricoplanar RBOX s 1000 t993602376 | QHULL C-1e-3 d Qbb FA Qt] - if it is a matching facet and pass 1 - test if this is a better match - if pass 1, - make best match (it will not be merged) -*/ -#ifndef qh_NOmerge -void qh_matchduplicates (facetT *atfacet, int atskip, int hashsize, int *hashcount) { - boolT same, ismatch; - int hash, scan; - facetT *facet, *newfacet, *maxmatch= NULL, *maxmatch2= NULL, *nextfacet; - int skip, newskip, nextskip= 0, maxskip= 0, maxskip2= 0, makematch; - realT maxdist= -REALmax, mindist, dist2, low, high; - - hash= (int)qh_gethash (hashsize, atfacet->vertices, qh hull_dim, 1, - SETelem_(atfacet->vertices, atskip)); - trace2((qh ferr, "qh_matchduplicates: find duplicate matches for f%d skip %d hash %d hashcount %d\n", - atfacet->id, atskip, hash, *hashcount)); - for (makematch= 0; makematch < 2; makematch++) { - qh visit_id++; - for (newfacet= atfacet, newskip= atskip; newfacet; newfacet= nextfacet, newskip= nextskip) { - zinc_(Zhashlookup); - nextfacet= NULL; - newfacet->visitid= qh visit_id; - for (scan= hash; (facet= SETelemt_(qh hash_table, scan, facetT)); - scan= (++scan >= hashsize ? 0 : scan)) { - if (!facet->dupridge || facet->visitid == qh visit_id) - continue; - zinc_(Zhashtests); - if (qh_matchvertices (1, newfacet->vertices, newskip, facet->vertices, &skip, &same)) { - ismatch= (same == (newfacet->toporient ^ facet->toporient)); - if (SETelemt_(facet->neighbors, skip, facetT) != qh_DUPLICATEridge) { - if (!makematch) { - fprintf (qh ferr, "qhull internal error (qh_matchduplicates): missing dupridge at f%d skip %d for new f%d skip %d hash %d\n", - facet->id, skip, newfacet->id, newskip, hash); - qh_errexit2 (qh_ERRqhull, facet, newfacet); - } - }else if (ismatch && makematch) { - if (SETelemt_(newfacet->neighbors, newskip, facetT) == qh_DUPLICATEridge) { - SETelem_(facet->neighbors, skip)= newfacet; - if (newfacet->tricoplanar) - SETelem_(newfacet->neighbors, newskip)= facet; - else - SETelem_(newfacet->neighbors, newskip)= qh_MERGEridge; - *hashcount -= 2; /* removed two unmatched facets */ - trace4((qh ferr, "qh_matchduplicates: duplicate f%d skip %d matched with new f%d skip %d merge\n", - facet->id, skip, newfacet->id, newskip)); - } - }else if (ismatch) { - mindist= qh_getdistance (facet, newfacet, &low, &high); - dist2= qh_getdistance (newfacet, facet, &low, &high); - minimize_(mindist, dist2); - if (mindist > maxdist) { - maxdist= mindist; - maxmatch= facet; - maxskip= skip; - maxmatch2= newfacet; - maxskip2= newskip; - } - trace3((qh ferr, "qh_matchduplicates: duplicate f%d skip %d new f%d skip %d at dist %2.2g, max is now f%d f%d\n", - facet->id, skip, newfacet->id, newskip, mindist, - maxmatch->id, maxmatch2->id)); - }else { /* !ismatch */ - nextfacet= facet; - nextskip= skip; - } - } - if (makematch && !facet - && SETelemt_(facet->neighbors, skip, facetT) == qh_DUPLICATEridge) { - fprintf (qh ferr, "qhull internal error (qh_matchduplicates): no MERGEridge match for duplicate f%d skip %d at hash %d\n", - newfacet->id, newskip, hash); - qh_errexit (qh_ERRqhull, newfacet, NULL); - } - } - } /* end of for each new facet at hash */ - if (!makematch) { - if (!maxmatch) { - fprintf (qh ferr, "qhull internal error (qh_matchduplicates): no maximum match at duplicate f%d skip %d at hash %d\n", - atfacet->id, atskip, hash); - qh_errexit (qh_ERRqhull, atfacet, NULL); - } - SETelem_(maxmatch->neighbors, maxskip)= maxmatch2; - SETelem_(maxmatch2->neighbors, maxskip2)= maxmatch; - *hashcount -= 2; /* removed two unmatched facets */ - zzinc_(Zmultiridge); - trace0((qh ferr, "qh_matchduplicates: duplicate f%d skip %d matched with new f%d skip %d keep\n", - maxmatch->id, maxskip, maxmatch2->id, maxskip2)); - qh_precision ("ridge with multiple neighbors"); - if (qh IStracing >= 4) - qh_errprint ("DUPLICATED/MATCH", maxmatch, maxmatch2, NULL, NULL); - } - } -} /* matchduplicates */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="nearcoplanar">-</a> - - qh_nearcoplanar() - for all facets, remove near-inside points from facet->coplanarset</li> - coplanar points defined by innerplane from qh_outerinner() - - returns: - if qh KEEPcoplanar && !qh KEEPinside - facet->coplanarset only contains coplanar points - if qh.JOGGLEmax - drops inner plane by another qh.JOGGLEmax diagonal since a - vertex could shift out while a coplanar point shifts in - - notes: - used for qh.PREmerge and qh.JOGGLEmax - must agree with computation of qh.NEARcoplanar in qh_detroundoff() - design: - if not keeping coplanar or inside points - free all coplanar sets - else if not keeping both coplanar and inside points - remove !coplanar or !inside points from coplanar sets -*/ -void qh_nearcoplanar ( void /* qh.facet_list */) { - facetT *facet; - pointT *point, **pointp; - int numpart; - realT dist, innerplane; - - if (!qh KEEPcoplanar && !qh KEEPinside) { - FORALLfacets { - if (facet->coplanarset) - qh_setfree( &facet->coplanarset); - } - }else if (!qh KEEPcoplanar || !qh KEEPinside) { - qh_outerinner (NULL, NULL, &innerplane); - if (qh JOGGLEmax < REALmax/2) - innerplane -= qh JOGGLEmax * sqrt (qh hull_dim); - numpart= 0; - FORALLfacets { - if (facet->coplanarset) { - FOREACHpoint_(facet->coplanarset) { - numpart++; - qh_distplane (point, facet, &dist); - if (dist < innerplane) { - if (!qh KEEPinside) - SETref_(point)= NULL; - }else if (!qh KEEPcoplanar) - SETref_(point)= NULL; - } - qh_setcompact (facet->coplanarset); - } - } - zzadd_(Zcheckpart, numpart); - } -} /* nearcoplanar */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="nearvertex">-</a> - - qh_nearvertex( facet, point, bestdist ) - return nearest vertex in facet to point - - returns: - vertex and its distance - - notes: - if qh.DELAUNAY - distance is measured in the input set - searches neighboring tricoplanar facets (requires vertexneighbors) - Slow implementation. Recomputes vertex set for each point. - The vertex set could be stored in the qh.keepcentrum facet. -*/ -vertexT *qh_nearvertex (facetT *facet, pointT *point, realT *bestdistp) { - realT bestdist= REALmax, dist; - vertexT *bestvertex= NULL, *vertex, **vertexp, *apex; - coordT *center; - facetT *neighbor, **neighborp; - setT *vertices; - int dim= qh hull_dim; - - if (qh DELAUNAY) - dim--; - if (facet->tricoplanar) { - if (!qh VERTEXneighbors || !facet->center) { - fprintf(qh ferr, "qhull internal error (qh_nearvertex): qh.VERTEXneighbors and facet->center required for tricoplanar facets\n"); - qh_errexit(qh_ERRqhull, NULL, NULL); - } - vertices= qh_settemp (qh TEMPsize); - apex= SETfirst_(facet->vertices); - center= facet->center; - FOREACHneighbor_(apex) { - if (neighbor->center == center) { - FOREACHvertex_(neighbor->vertices) - qh_setappend(&vertices, vertex); - } - } - }else - vertices= facet->vertices; - FOREACHvertex_(vertices) { - dist= qh_pointdist (vertex->point, point, -dim); - if (dist < bestdist) { - bestdist= dist; - bestvertex= vertex; - } - } - if (facet->tricoplanar) - qh_settempfree (&vertices); - *bestdistp= sqrt (bestdist); - return bestvertex; -} /* nearvertex */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="newhashtable">-</a> - - qh_newhashtable( newsize ) - returns size of qh.hash_table of at least newsize slots - - notes: - assumes qh.hash_table is NULL - qh_HASHfactor determines the number of extra slots - size is not divisible by 2, 3, or 5 -*/ -int qh_newhashtable(int newsize) { - int size; - - size= ((newsize+1)*qh_HASHfactor) | 0x1; /* odd number */ - while (True) { - if ((size%3) && (size%5)) - break; - size += 2; - /* loop terminates because there is an infinite number of primes */ - } - qh hash_table= qh_setnew (size); - qh_setzero (qh hash_table, 0, size); - return size; -} /* newhashtable */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="newvertex">-</a> - - qh_newvertex( point ) - returns a new vertex for point -*/ -vertexT *qh_newvertex(pointT *point) { - vertexT *vertex; - - zinc_(Ztotvertices); - vertex= (vertexT *)qh_memalloc(sizeof(vertexT)); - memset ((char *) vertex, 0, sizeof (vertexT)); - if (qh vertex_id == 0xFFFFFF) { - fprintf(qh ferr, "qhull input error: more than %d vertices. ID field overflows and two vertices\n\ -may have the same identifier. Vertices not sorted correctly.\n", 0xFFFFFF); - qh_errexit(qh_ERRinput, NULL, NULL); - } - if (qh vertex_id == qh tracevertex_id) - qh tracevertex= vertex; - vertex->id= qh vertex_id++; - vertex->point= point; - trace4((qh ferr, "qh_newvertex: vertex p%d (v%d) created\n", qh_pointid(vertex->point), - vertex->id)); - return (vertex); -} /* newvertex */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="nextridge3d">-</a> - - qh_nextridge3d( atridge, facet, vertex ) - return next ridge and vertex for a 3d facet - - notes: - in qh_ORIENTclock order - this is a O(n^2) implementation to trace all ridges - be sure to stop on any 2nd visit - - design: - for each ridge - exit if it is the ridge after atridge -*/ -ridgeT *qh_nextridge3d (ridgeT *atridge, facetT *facet, vertexT **vertexp) { - vertexT *atvertex, *vertex, *othervertex; - ridgeT *ridge, **ridgep; - - if ((atridge->top == facet) ^ qh_ORIENTclock) - atvertex= SETsecondt_(atridge->vertices, vertexT); - else - atvertex= SETfirstt_(atridge->vertices, vertexT); - FOREACHridge_(facet->ridges) { - if (ridge == atridge) - continue; - if ((ridge->top == facet) ^ qh_ORIENTclock) { - othervertex= SETsecondt_(ridge->vertices, vertexT); - vertex= SETfirstt_(ridge->vertices, vertexT); - }else { - vertex= SETsecondt_(ridge->vertices, vertexT); - othervertex= SETfirstt_(ridge->vertices, vertexT); - } - if (vertex == atvertex) { - if (vertexp) - *vertexp= othervertex; - return ridge; - } - } - return NULL; -} /* nextridge3d */ -#else /* qh_NOmerge */ -void qh_matchduplicates (facetT *atfacet, int atskip, int hashsize, int *hashcount) { -} -ridgeT *qh_nextridge3d (ridgeT *atridge, facetT *facet, vertexT **vertexp) { - - return NULL; -} -#endif /* qh_NOmerge */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="outcoplanar">-</a> - - qh_outcoplanar() - move points from all facets' outsidesets to their coplanarsets - - notes: - for post-processing under qh.NARROWhull - - design: - for each facet - for each outside point for facet - partition point into coplanar set -*/ -void qh_outcoplanar (void /* facet_list */) { - pointT *point, **pointp; - facetT *facet; - realT dist; - - trace1((qh ferr, "qh_outcoplanar: move outsideset to coplanarset for qh NARROWhull\n")); - FORALLfacets { - FOREACHpoint_(facet->outsideset) { - qh num_outside--; - if (qh KEEPcoplanar || qh KEEPnearinside) { - qh_distplane (point, facet, &dist); - zinc_(Zpartition); - qh_partitioncoplanar (point, facet, &dist); - } - } - qh_setfree (&facet->outsideset); - } -} /* outcoplanar */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="point">-</a> - - qh_point( id ) - return point for a point id, or NULL if unknown - - alternative code: - return ((pointT *)((unsigned long)qh.first_point - + (unsigned long)((id)*qh.normal_size))); -*/ -pointT *qh_point (int id) { - - if (id < 0) - return NULL; - if (id < qh num_points) - return qh first_point + id * qh hull_dim; - id -= qh num_points; - if (id < qh_setsize (qh other_points)) - return SETelemt_(qh other_points, id, pointT); - return NULL; -} /* point */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="point_add">-</a> - - qh_point_add( set, point, elem ) - stores elem at set[point.id] - - returns: - access function for qh_pointfacet and qh_pointvertex - - notes: - checks point.id -*/ -void qh_point_add (setT *set, pointT *point, void *elem) { - int id, size; - - SETreturnsize_(set, size); - if ((id= qh_pointid(point)) < 0) - fprintf (qh ferr, "qhull internal warning (point_add): unknown point %p id %d\n", - point, id); - else if (id >= size) { - fprintf (qh ferr, "qhull internal errror (point_add): point p%d is out of bounds (%d)\n", - id, size); - qh_errexit (qh_ERRqhull, NULL, NULL); - }else - SETelem_(set, id)= elem; -} /* point_add */ - - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="pointfacet">-</a> - - qh_pointfacet() - return temporary set of facet for each point - the set is indexed by point id - - notes: - vertices assigned to one of the facets - coplanarset assigned to the facet - outside set assigned to the facet - NULL if no facet for point (inside) - includes qh.GOODpointp - - access: - FOREACHfacet_i_(facets) { ... } - SETelem_(facets, i) - - design: - for each facet - add each vertex - add each coplanar point - add each outside point -*/ -setT *qh_pointfacet (void /*qh facet_list*/) { - int numpoints= qh num_points + qh_setsize (qh other_points); - setT *facets; - facetT *facet; - vertexT *vertex, **vertexp; - pointT *point, **pointp; - - facets= qh_settemp (numpoints); - qh_setzero (facets, 0, numpoints); - qh vertex_visit++; - FORALLfacets { - FOREACHvertex_(facet->vertices) { - if (vertex->visitid != qh vertex_visit) { - vertex->visitid= qh vertex_visit; - qh_point_add (facets, vertex->point, facet); - } - } - FOREACHpoint_(facet->coplanarset) - qh_point_add (facets, point, facet); - FOREACHpoint_(facet->outsideset) - qh_point_add (facets, point, facet); - } - return facets; -} /* pointfacet */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="pointvertex">-</a> - - qh_pointvertex( ) - return temporary set of vertices indexed by point id - entry is NULL if no vertex for a point - this will include qh.GOODpointp - - access: - FOREACHvertex_i_(vertices) { ... } - SETelem_(vertices, i) -*/ -setT *qh_pointvertex (void /*qh facet_list*/) { - int numpoints= qh num_points + qh_setsize (qh other_points); - setT *vertices; - vertexT *vertex; - - vertices= qh_settemp (numpoints); - qh_setzero (vertices, 0, numpoints); - FORALLvertices - qh_point_add (vertices, vertex->point, vertex); - return vertices; -} /* pointvertex */ - - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="prependfacet">-</a> - - qh_prependfacet( facet, facetlist ) - prepend facet to the start of a facetlist - - returns: - increments qh.numfacets - updates facetlist, qh.facet_list, facet_next - - notes: - be careful of prepending since it can lose a pointer. - e.g., can lose _next by deleting and then prepending before _next -*/ -void qh_prependfacet(facetT *facet, facetT **facetlist) { - facetT *prevfacet, *list; - - - trace4((qh ferr, "qh_prependfacet: prepend f%d before f%d\n", - facet->id, getid_(*facetlist))); - if (!*facetlist) - (*facetlist)= qh facet_tail; - list= *facetlist; - prevfacet= list->previous; - facet->previous= prevfacet; - if (prevfacet) - prevfacet->next= facet; - list->previous= facet; - facet->next= *facetlist; - if (qh facet_list == list) /* this may change *facetlist */ - qh facet_list= facet; - if (qh facet_next == list) - qh facet_next= facet; - *facetlist= facet; - qh num_facets++; -} /* prependfacet */ - - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="printhashtable">-</a> - - qh_printhashtable( fp ) - print hash table to fp - - notes: - not in I/O to avoid bringing io.c in - - design: - for each hash entry - if defined - if unmatched or will merge (NULL, qh_MERGEridge, qh_DUPLICATEridge) - print entry and neighbors -*/ -void qh_printhashtable(FILE *fp) { - facetT *facet, *neighbor; - int id, facet_i, facet_n, neighbor_i= 0, neighbor_n= 0; - vertexT *vertex, **vertexp; - - FOREACHfacet_i_(qh hash_table) { - if (facet) { - FOREACHneighbor_i_(facet) { - if (!neighbor || neighbor == qh_MERGEridge || neighbor == qh_DUPLICATEridge) - break; - } - if (neighbor_i == neighbor_n) - continue; - fprintf (fp, "hash %d f%d ", facet_i, facet->id); - FOREACHvertex_(facet->vertices) - fprintf (fp, "v%d ", vertex->id); - fprintf (fp, "\n neighbors:"); - FOREACHneighbor_i_(facet) { - if (neighbor == qh_MERGEridge) - id= -3; - else if (neighbor == qh_DUPLICATEridge) - id= -2; - else - id= getid_(neighbor); - fprintf (fp, " %d", id); - } - fprintf (fp, "\n"); - } - } -} /* printhashtable */ - - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="printlists">-</a> - - qh_printlists( fp ) - print out facet and vertex list for debugging (without 'f/v' tags) -*/ -void qh_printlists (void) { - facetT *facet; - vertexT *vertex; - int count= 0; - - fprintf (qh ferr, "qh_printlists: facets:"); - FORALLfacets { - if (++count % 100 == 0) - fprintf (qh ferr, "\n "); - fprintf (qh ferr, " %d", facet->id); - } - fprintf (qh ferr, "\n new facets %d visible facets %d next facet for qh_addpoint %d\n vertices (new %d):", - getid_(qh newfacet_list), getid_(qh visible_list), getid_(qh facet_next), - getid_(qh newvertex_list)); - count = 0; - FORALLvertices { - if (++count % 100 == 0) - fprintf (qh ferr, "\n "); - fprintf (qh ferr, " %d", vertex->id); - } - fprintf (qh ferr, "\n"); -} /* printlists */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="resetlists">-</a> - - qh_resetlists( stats, qh_RESETvisible ) - reset newvertex_list, newfacet_list, visible_list - if stats, - maintains statistics - - returns: - visible_list is empty if qh_deletevisible was called -*/ -void qh_resetlists (boolT stats, boolT resetVisible /*qh newvertex_list newfacet_list visible_list*/) { - vertexT *vertex; - facetT *newfacet, *visible; - int totnew=0, totver=0; - - if (stats) { - FORALLvertex_(qh newvertex_list) - totver++; - FORALLnew_facets - totnew++; - zadd_(Zvisvertextot, totver); - zmax_(Zvisvertexmax, totver); - zadd_(Znewfacettot, totnew); - zmax_(Znewfacetmax, totnew); - } - FORALLvertex_(qh newvertex_list) - vertex->newlist= False; - qh newvertex_list= NULL; - FORALLnew_facets - newfacet->newfacet= False; - qh newfacet_list= NULL; - if (resetVisible) { - FORALLvisible_facets { - visible->f.replace= NULL; - visible->visible= False; - } - qh num_visible= 0; - } - qh visible_list= NULL; /* may still have visible facets via qh_triangulate */ - qh NEWfacets= False; -} /* resetlists */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="setvoronoi_all">-</a> - - qh_setvoronoi_all() - compute Voronoi centers for all facets - includes upperDelaunay facets if qh.UPPERdelaunay ('Qu') - - returns: - facet->center is the Voronoi center - - notes: - this is unused/untested code - please email bradb@shore.net if this works ok for you - - use: - FORALLvertices {...} to locate the vertex for a point. - FOREACHneighbor_(vertex) {...} to visit the Voronoi centers for a Voronoi cell. -*/ -void qh_setvoronoi_all (void) { - facetT *facet; - - qh_clearcenters (qh_ASvoronoi); - qh_vertexneighbors(); - - FORALLfacets { - if (!facet->normal || !facet->upperdelaunay || qh UPPERdelaunay) { - if (!facet->center) - facet->center= qh_facetcenter (facet->vertices); - } - } -} /* setvoronoi_all */ - -#ifndef qh_NOmerge - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="triangulate">-</a> - - qh_triangulate() - triangulate non-simplicial facets on qh.facet_list, - if qh.CENTERtype=qh_ASvoronoi, sets Voronoi centers of non-simplicial facets - - returns: - all facets simplicial - each tricoplanar facet has ->f.triowner == owner of ->center,normal,etc. - - notes: - call after qh_check_output since may switch to Voronoi centers - Output may overwrite ->f.triowner with ->f.area -*/ -void qh_triangulate (void /*qh facet_list*/) { - facetT *facet, *nextfacet, *owner; - int onlygood= qh ONLYgood; - facetT *neighbor, *visible= NULL, *facet1, *facet2, *new_facet_list= NULL; - facetT *orig_neighbor= NULL, *otherfacet; - vertexT *new_vertex_list= NULL; - mergeT *merge; - mergeType mergetype; - int neighbor_i, neighbor_n; - - trace1((qh ferr, "qh_triangulate: triangulate non-simplicial facets\n")); - if (qh hull_dim == 2) - return; - if (qh VORONOI) { /* otherwise lose Voronoi centers [could rebuild vertex set from tricoplanar] */ - qh_clearcenters (qh_ASvoronoi); - qh_vertexneighbors(); - } - qh ONLYgood= False; /* for makenew_nonsimplicial */ - qh visit_id++; - qh NEWfacets= True; - qh degen_mergeset= qh_settemp (qh TEMPsize); - qh newvertex_list= qh vertex_tail; - for (facet= qh facet_list; facet && facet->next; facet= nextfacet) { /* non-simplicial facets moved to end */ - nextfacet= facet->next; - if (facet->visible || facet->simplicial) - continue; - /* triangulate all non-simplicial facets, otherwise merging does not work, e.g., RBOX c P-0.1 P+0.1 P+0.1 D3 | QHULL d Qt Tv */ - if (!new_facet_list) - new_facet_list= facet; /* will be moved to end */ - qh_triangulate_facet (facet, &new_vertex_list); - } - trace2((qh ferr, "qh_triangulate: delete null facets from f%d -- apex same as second vertex\n", getid_(new_facet_list))); - for (facet= new_facet_list; facet && facet->next; facet= nextfacet) { /* null facets moved to end */ - nextfacet= facet->next; - if (facet->visible) - continue; - if (facet->ridges) { - if (qh_setsize(facet->ridges) > 0) { - fprintf( qh ferr, "qhull error (qh_triangulate): ridges still defined for f%d\n", facet->id); - qh_errexit (qh_ERRqhull, facet, NULL); - } - qh_setfree (&facet->ridges); - } - if (SETfirst_(facet->vertices) == SETsecond_(facet->vertices)) { - zinc_(Ztrinull); - qh_triangulate_null (facet); - } - } - trace2((qh ferr, "qh_triangulate: delete %d or more mirror facets -- same vertices and neighbors\n", qh_setsize(qh degen_mergeset))); - qh visible_list= qh facet_tail; - while ((merge= (mergeT*)qh_setdellast (qh degen_mergeset))) { - facet1= merge->facet1; - facet2= merge->facet2; - mergetype= merge->type; - qh_memfree (merge, sizeof(mergeT)); - if (mergetype == MRGmirror) { - zinc_(Ztrimirror); - qh_triangulate_mirror (facet1, facet2); - } - } - qh_settempfree(&qh degen_mergeset); - trace2((qh ferr, "qh_triangulate: update neighbor lists for vertices from v%d\n", getid_(new_vertex_list))); - qh newvertex_list= new_vertex_list; /* all vertices of new facets */ - qh visible_list= NULL; - qh_updatevertices(/*qh newvertex_list, empty newfacet_list and visible_list*/); - qh_resetlists (False, !qh_RESETvisible /*qh newvertex_list, empty newfacet_list and visible_list*/); - - trace2((qh ferr, "qh_triangulate: identify degenerate tricoplanar facets from f%d\n", getid_(new_facet_list))); - trace2((qh ferr, "qh_triangulate: and replace facet->f.triowner with tricoplanar facets that own center, normal, etc.\n")); - FORALLfacet_(new_facet_list) { - if (facet->tricoplanar && !facet->visible) { - FOREACHneighbor_i_(facet) { - if (neighbor_i == 0) { /* first iteration */ - if (neighbor->tricoplanar) - orig_neighbor= neighbor->f.triowner; - else - orig_neighbor= neighbor; - }else { - if (neighbor->tricoplanar) - otherfacet= neighbor->f.triowner; - else - otherfacet= neighbor; - if (orig_neighbor == otherfacet) { - zinc_(Ztridegen); - facet->degenerate= True; - break; - } - } - } - } - } - - trace2((qh ferr, "qh_triangulate: delete visible facets -- non-simplicial, null, and mirrored facets\n")); - owner= NULL; - visible= NULL; - for (facet= new_facet_list; facet && facet->next; facet= nextfacet) { /* may delete facet */ - nextfacet= facet->next; - if (facet->visible) { - if (facet->tricoplanar) { /* a null or mirrored facet */ - qh_delfacet(facet); - qh num_visible--; - }else { /* a non-simplicial facet followed by its tricoplanars */ - if (visible && !owner) { - /* RBOX 200 s D5 t1001471447 | QHULL Qt C-0.01 Qx Qc Tv Qt -- f4483 had 6 vertices/neighbors and 8 ridges */ - trace2((qh ferr, "qh_triangulate: all tricoplanar facets degenerate for non-simplicial facet f%d\n", - visible->id)); - qh_delfacet(visible); - qh num_visible--; - } - visible= facet; - owner= NULL; - } - }else if (facet->tricoplanar) { - if (facet->f.triowner != visible) { - fprintf( qh ferr, "qhull error (qh_triangulate): tricoplanar facet f%d not owned by its visible, non-simplicial facet f%d\n", facet->id, getid_(visible)); - qh_errexit2 (qh_ERRqhull, facet, visible); - } - if (owner) - facet->f.triowner= owner; - else if (!facet->degenerate) { - owner= facet; - nextfacet= visible->next; /* rescan tricoplanar facets with owner */ - facet->keepcentrum= True; /* one facet owns ->normal, etc. */ - facet->coplanarset= visible->coplanarset; - facet->outsideset= visible->outsideset; - visible->coplanarset= NULL; - visible->outsideset= NULL; - if (!qh TRInormals) { /* center and normal copied to tricoplanar facets */ - visible->center= NULL; - visible->normal= NULL; - } - qh_delfacet(visible); - qh num_visible--; - } - } - } - if (visible && !owner) { - trace2((qh ferr, "qh_triangulate: all tricoplanar facets degenerate for last non-simplicial facet f%d\n", - visible->id)); - qh_delfacet(visible); - qh num_visible--; - } - qh NEWfacets= False; - qh ONLYgood= onlygood; /* restore value */ - if (qh CHECKfrequently) - qh_checkpolygon (qh facet_list); -} /* triangulate */ - - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="triangulate_facet">-</a> - - qh_triangulate_facet (facetA) - triangulate a non-simplicial facet - if qh.CENTERtype=qh_ASvoronoi, sets its Voronoi center - returns: - qh.newfacet_list == simplicial facets - facet->tricoplanar set and ->keepcentrum false - facet->degenerate set if duplicated apex - facet->f.trivisible set to facetA - facet->center copied from facetA (created if qh_ASvoronoi) - qh_eachvoronoi, qh_detvridge, qh_detvridge3 assume centers copied - facet->normal,offset,maxoutside copied from facetA - - notes: - qh_makenew_nonsimplicial uses neighbor->seen for the same - - see also: - qh_addpoint() -- add a point - qh_makenewfacets() -- construct a cone of facets for a new vertex - - design: - if qh_ASvoronoi, - compute Voronoi center (facet->center) - select first vertex (highest ID to preserve ID ordering of ->vertices) - triangulate from vertex to ridges - copy facet->center, normal, offset - update vertex neighbors -*/ -void qh_triangulate_facet (facetT *facetA, vertexT **first_vertex) { - facetT *newfacet; - facetT *neighbor, **neighborp; - vertexT *apex; - int numnew=0; - - trace3((qh ferr, "qh_triangulate_facet: triangulate facet f%d\n", facetA->id)); - - if (qh IStracing >= 4) - qh_printfacet (qh ferr, facetA); - FOREACHneighbor_(facetA) { - neighbor->seen= False; - neighbor->coplanar= False; - } - if (qh CENTERtype == qh_ASvoronoi && !facetA->center /* matches upperdelaunay in qh_setfacetplane() */ - && fabs_(facetA->normal[qh hull_dim -1]) >= qh ANGLEround * qh_ZEROdelaunay) { - facetA->center= qh_facetcenter (facetA->vertices); - } - qh_willdelete (facetA, NULL); - qh newfacet_list= qh facet_tail; - facetA->visitid= qh visit_id; - apex= SETfirst_(facetA->vertices); - qh_makenew_nonsimplicial (facetA, apex, &numnew); - SETfirst_(facetA->neighbors)= NULL; - FORALLnew_facets { - newfacet->tricoplanar= True; - newfacet->f.trivisible= facetA; - newfacet->degenerate= False; - newfacet->upperdelaunay= facetA->upperdelaunay; - newfacet->good= facetA->good; - if (qh TRInormals) { - newfacet->keepcentrum= True; - newfacet->normal= qh_copypoints (facetA->normal, 1, qh hull_dim); - if (qh CENTERtype == qh_AScentrum) - newfacet->center= qh_getcentrum (newfacet); - else - newfacet->center= qh_copypoints (facetA->center, 1, qh hull_dim); - }else { - newfacet->keepcentrum= False; - newfacet->normal= facetA->normal; - newfacet->center= facetA->center; - } - newfacet->offset= facetA->offset; -#if qh_MAXoutside - newfacet->maxoutside= facetA->maxoutside; -#endif - } - qh_matchnewfacets(/*qh newfacet_list*/); - zinc_(Ztricoplanar); - zadd_(Ztricoplanartot, numnew); - zmax_(Ztricoplanarmax, numnew); - qh visible_list= NULL; - if (!(*first_vertex)) - (*first_vertex)= qh newvertex_list; - qh newvertex_list= NULL; - qh_updatevertices(/*qh newfacet_list, empty visible_list and newvertex_list*/); - qh_resetlists (False, !qh_RESETvisible /*qh newfacet_list, empty visible_list and newvertex_list*/); -} /* triangulate_facet */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="triangulate_link">-</a> - - qh_triangulate_link (oldfacetA, facetA, oldfacetB, facetB) - relink facetA to facetB via oldfacets - returns: - adds mirror facets to qh degen_mergeset (4-d and up only) - design: - if they are already neighbors, the opposing neighbors become MRGmirror facets -*/ -void qh_triangulate_link (facetT *oldfacetA, facetT *facetA, facetT *oldfacetB, facetT *facetB) { - int errmirror= False; - - trace3((qh ferr, "qh_triangulate_link: relink old facets f%d and f%d between neighbors f%d and f%d\n", - oldfacetA->id, oldfacetB->id, facetA->id, facetB->id)); - if (qh_setin (facetA->neighbors, facetB)) { - if (!qh_setin (facetB->neighbors, facetA)) - errmirror= True; - else - qh_appendmergeset (facetA, facetB, MRGmirror, NULL); - }else if (qh_setin (facetB->neighbors, facetA)) - errmirror= True; - if (errmirror) { - fprintf( qh ferr, "qhull error (qh_triangulate_link): mirror facets f%d and f%d do not match for old facets f%d and f%d\n", - facetA->id, facetB->id, oldfacetA->id, oldfacetB->id); - qh_errexit2 (qh_ERRqhull, facetA, facetB); - } - qh_setreplace (facetB->neighbors, oldfacetB, facetA); - qh_setreplace (facetA->neighbors, oldfacetA, facetB); -} /* triangulate_link */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="triangulate_mirror">-</a> - - qh_triangulate_mirror (facetA, facetB) - delete mirrored facets from qh_triangulate_null() and qh_triangulate_mirror - a mirrored facet shares the same vertices of a logical ridge - design: - since a null facet duplicates the first two vertices, the opposing neighbors absorb the null facet - if they are already neighbors, the opposing neighbors become MRGmirror facets -*/ -void qh_triangulate_mirror (facetT *facetA, facetT *facetB) { - facetT *neighbor, *neighborB; - int neighbor_i, neighbor_n; - - trace3((qh ferr, "qh_triangulate_mirror: delete mirrored facets f%d and f%d\n", - facetA->id, facetB->id)); - FOREACHneighbor_i_(facetA) { - neighborB= SETelemt_(facetB->neighbors, neighbor_i, facetT); - if (neighbor == neighborB) - continue; /* occurs twice */ - qh_triangulate_link (facetA, neighbor, facetB, neighborB); - } - qh_willdelete (facetA, NULL); - qh_willdelete (facetB, NULL); -} /* triangulate_mirror */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="triangulate_null">-</a> - - qh_triangulate_null (facetA) - remove null facetA from qh_triangulate_facet() - a null facet has vertex #1 (apex) == vertex #2 - returns: - adds facetA to ->visible for deletion after qh_updatevertices - qh degen_mergeset contains mirror facets (4-d and up only) - design: - since a null facet duplicates the first two vertices, the opposing neighbors absorb the null facet - if they are already neighbors, the opposing neighbors become MRGmirror facets -*/ -void qh_triangulate_null (facetT *facetA) { - facetT *neighbor, *otherfacet; - - trace3((qh ferr, "qh_triangulate_null: delete null facet f%d\n", facetA->id)); - neighbor= SETfirst_(facetA->neighbors); - otherfacet= SETsecond_(facetA->neighbors); - qh_triangulate_link (facetA, neighbor, facetA, otherfacet); - qh_willdelete (facetA, NULL); -} /* triangulate_null */ - -#else /* qh_NOmerge */ -void qh_triangulate (void) { -} -#endif /* qh_NOmerge */ - - /*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="vertexintersect">-</a> - - qh_vertexintersect( vertexsetA, vertexsetB ) - intersects two vertex sets (inverse id ordered) - vertexsetA is a temporary set at the top of qhmem.tempstack - - returns: - replaces vertexsetA with the intersection - - notes: - could overwrite vertexsetA if currently too slow -*/ -void qh_vertexintersect(setT **vertexsetA,setT *vertexsetB) { - setT *intersection; - - intersection= qh_vertexintersect_new (*vertexsetA, vertexsetB); - qh_settempfree (vertexsetA); - *vertexsetA= intersection; - qh_settemppush (intersection); -} /* vertexintersect */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="vertexintersect_new">-</a> - - qh_vertexintersect_new( ) - intersects two vertex sets (inverse id ordered) - - returns: - a new set -*/ -setT *qh_vertexintersect_new (setT *vertexsetA,setT *vertexsetB) { - setT *intersection= qh_setnew (qh hull_dim - 1); - vertexT **vertexA= SETaddr_(vertexsetA, vertexT); - vertexT **vertexB= SETaddr_(vertexsetB, vertexT); - - while (*vertexA && *vertexB) { - if (*vertexA == *vertexB) { - qh_setappend(&intersection, *vertexA); - vertexA++; vertexB++; - }else { - if ((*vertexA)->id > (*vertexB)->id) - vertexA++; - else - vertexB++; - } - } - return intersection; -} /* vertexintersect_new */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="vertexneighbors">-</a> - - qh_vertexneighbors() - for each vertex in qh.facet_list, - determine its neighboring facets - - returns: - sets qh.VERTEXneighbors - nop if qh.VERTEXneighbors already set - qh_addpoint() will maintain them - - notes: - assumes all vertex->neighbors are NULL - - design: - for each facet - for each vertex - append facet to vertex->neighbors -*/ -void qh_vertexneighbors (void /*qh facet_list*/) { - facetT *facet; - vertexT *vertex, **vertexp; - - if (qh VERTEXneighbors) - return; - trace1((qh ferr, "qh_vertexneighbors: determing neighboring facets for each vertex\n")); - qh vertex_visit++; - FORALLfacets { - if (facet->visible) - continue; - FOREACHvertex_(facet->vertices) { - if (vertex->visitid != qh vertex_visit) { - vertex->visitid= qh vertex_visit; - vertex->neighbors= qh_setnew (qh hull_dim); - } - qh_setappend (&vertex->neighbors, facet); - } - } - qh VERTEXneighbors= True; -} /* vertexneighbors */ - -/*-<a href="qh-poly.htm#TOC" - >-------------------------------</a><a name="vertexsubset">-</a> - - qh_vertexsubset( vertexsetA, vertexsetB ) - returns True if vertexsetA is a subset of vertexsetB - assumes vertexsets are sorted - - note: - empty set is a subset of any other set -*/ -boolT qh_vertexsubset(setT *vertexsetA, setT *vertexsetB) { - vertexT **vertexA= (vertexT **) SETaddr_(vertexsetA, vertexT); - vertexT **vertexB= (vertexT **) SETaddr_(vertexsetB, vertexT); - - while (True) { - if (!*vertexA) - return True; - if (!*vertexB) - return False; - if ((*vertexA)->id > (*vertexB)->id) - return False; - if (*vertexA == *vertexB) - vertexA++; - vertexB++; - } - return False; /* avoid warnings */ -} /* vertexsubset */ diff --git a/extern/qhull/src/qconvex.c b/extern/qhull/src/qconvex.c deleted file mode 100644 index 67b78646e50..00000000000 --- a/extern/qhull/src/qconvex.c +++ /dev/null @@ -1,334 +0,0 @@ -/*<html><pre> -<a href="qh-qhull.htm" - >-------------------------------</a><a name="TOP">-</a> - - qconvex.c - compute convex hulls using qhull - - see unix.c for full interface - - copyright (c) 1993-2002, The Geometry Center -*/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include <math.h> -#include "qhull.h" -#include "mem.h" -#include "qset.h" - -#if __MWERKS__ && __POWERPC__ -#include <SIOUX.h> -#include <Files.h> -#include <console.h> -#include <Desk.h> - -#elif __cplusplus -extern "C" { - int isatty (int); -} - -#elif _MSC_VER -#include <io.h> -#define isatty _isatty - -#else -int isatty (int); /* returns 1 if stdin is a tty - if "Undefined symbol" this can be deleted along with call in main() */ -#endif - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="prompt">-</a> - - qh_prompt - long prompt for qconvex - - notes: - restricted version of qhull.c - - see: - concise prompt below -*/ - -/* duplicated in qconvex.htm */ -char hidden_options[]=" d v H Qbb Qf Qg Qm Qr Qu Qv Qx Qz TR E V Fp Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 "; - -char qh_prompta[]= "\n\ -qconvex- compute the convex hull\n\ - http://www.geom.umn.edu/software/qhull %s\n\ -\n\ -input (stdin):\n\ - first lines: dimension and number of points (or vice-versa).\n\ - other lines: point coordinates, best if one point per line\n\ - comments: start with a non-numeric character\n\ -\n\ -options:\n\ - Qt - triangulated output\n\ - QJ - joggled input instead of merged facets\n\ - Qc - keep coplanar points with nearest facet\n\ - Qi - keep interior points with nearest facet\n\ -\n\ -Qhull control options:\n\ - Qbk:n - scale coord k so that low bound is n\n\ - QBk:n - scale coord k so that upper bound is n (QBk is %2.2g)\n\ - QbB - scale input to unit cube centered at the origin\n\ - Qbk:0Bk:0 - remove k-th coordinate from input\n\ - QJn - randomly joggle input in range [-n,n]\n\ - QRn - random rotation (n=seed, n=0 time, n=-1 time/no rotate)\n\ -%s%s%s%s"; /* split up qh_prompt for Visual C++ */ -char qh_promptb[]= "\ - Qs - search all points for the initial simplex\n\ - QGn - good facet if visible from point n, -n for not visible\n\ - QVn - good facet if it includes point n, -n if not\n\ -\n\ -"; -char qh_promptc[]= "\ -Trace options:\n\ - T4 - trace at level n, 4=all, 5=mem/gauss, -1= events\n\ - Tc - check frequently during execution\n\ - Ts - print statistics\n\ - Tv - verify result: structure, convexity, and point inclusion\n\ - Tz - send all output to stdout\n\ - TFn - report summary when n or more facets created\n\ - TI file - input data from file, no spaces or single quotes\n\ - TO file - output results to file, may be enclosed in single quotes\n\ - TPn - turn on tracing when point n added to hull\n\ - TMn - turn on tracing at merge n\n\ - TWn - trace merge facets when width > n\n\ - TVn - stop qhull after adding point n, -n for before (see TCn)\n\ - TCn - stop qhull after building cone for point n (see TVn)\n\ -\n\ -Precision options:\n\ - Cn - radius of centrum (roundoff added). Merge facets if non-convex\n\ - An - cosine of maximum angle. Merge facets if cosine > n or non-convex\n\ - C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge\n\ - Rn - randomly perturb computations by a factor of [1-n,1+n]\n\ - Un - max distance below plane for a new, coplanar point\n\ - Wn - min facet width for outside point (before roundoff)\n\ -\n\ -Output formats (may be combined; if none, produces a summary to stdout):\n\ - f - facet dump\n\ - G - Geomview output (see below)\n\ - i - vertices incident to each facet\n\ - m - Mathematica output (2-d and 3-d)\n\ - n - normals with offsets\n\ - o - OFF file format (dim, points and facets; Voronoi regions)\n\ - p - point coordinates \n\ - s - summary (stderr)\n\ -\n\ -"; -char qh_promptd[]= "\ -More formats:\n\ - Fa - area for each facet\n\ - FA - compute total area and volume for option 's'\n\ - Fc - count plus coplanar points for each facet\n\ - use 'Qc' (default) for coplanar and 'Qi' for interior\n\ - FC - centrum for each facet\n\ - Fd - use cdd format for input (homogeneous with offset first)\n\ - FD - use cdd format for numeric output (offset first)\n\ - FF - facet dump without ridges\n\ - Fi - inner plane for each facet\n\ - FI - ID for each facet\n\ - Fm - merge count for each facet (511 max)\n\ - Fn - count plus neighboring facets for each facet\n\ - FN - count plus neighboring facets for each point\n\ - Fo - outer plane (or max_outside) for each facet\n\ - FO - options and precision constants\n\ - FP - nearest vertex for each coplanar point\n\ - FQ - command used for qconvex\n\ - Fs - summary: #int (8), dimension, #points, tot vertices, tot facets,\n\ - for output: #vertices, #facets,\n\ - #coplanar points, #non-simplicial facets\n\ - #real (2), max outer plane, min vertex\n\ - FS - sizes: #int (0) \n\ - #real(2) tot area, tot volume\n\ - Ft - triangulation with centrums for non-simplicial facets (OFF format)\n\ - Fv - count plus vertices for each facet\n\ - FV - average of vertices (a feasible point for 'H')\n\ - Fx - extreme points (in order for 2-d)\n\ -\n\ -"; -char qh_prompte[]= "\ -Geomview output (2-d, 3-d, and 4-d)\n\ - Ga - all points as dots\n\ - Gp - coplanar points and vertices as radii\n\ - Gv - vertices as spheres\n\ - Gi - inner planes only\n\ - Gn - no planes\n\ - Go - outer planes only\n\ - Gc - centrums\n\ - Gh - hyperplane intersections\n\ - Gr - ridges\n\ - GDn - drop dimension n in 3-d and 4-d output\n\ -\n\ -Print options:\n\ - PAn - keep n largest facets by area\n\ - Pdk:n - drop facet if normal[k] <= n (default 0.0)\n\ - PDk:n - drop facet if normal[k] >= n\n\ - Pg - print good facets (needs 'QGn' or 'QVn')\n\ - PFn - keep facets whose area is at least n\n\ - PG - print neighbors of good facets\n\ - PMn - keep n facets with most merges\n\ - Po - force output. If error, output neighborhood of facet\n\ - Pp - do not report precision problems\n\ -\n\ - . - list of all options\n\ - - - one line descriptions of all options\n\ -"; -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */ - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="prompt2">-</a> - - qh_prompt2 - synopsis for qhull -*/ -char qh_prompt2[]= "\n\ -qconvex- compute the convex hull. Qhull %s\n\ - input (stdin): dimension, number of points, point coordinates\n\ - comments start with a non-numeric character\n\ -\n\ -options (qconvex.htm):\n\ - Qt - triangulated output\n\ - QJ - joggled input instead of merged facets\n\ - Tv - verify result: structure, convexity, and point inclusion\n\ - . - concise list of all options\n\ - - - one-line description of all options\n\ -\n\ -output options (subset):\n\ - s - summary of results (default)\n\ - i - vertices incident to each facet\n\ - n - normals with offsets\n\ - p - vertex coordinates (includes coplanar points if 'Qc')\n\ - Fx - extreme points (convex hull vertices)\n\ - FA - compute total area and volume\n\ - o - OFF format (dim, n, points, facets)\n\ - G - Geomview output (2-d, 3-d, and 4-d)\n\ - m - Mathematica output (2-d and 3-d)\n\ - QVn - print facets that include point n, -n if not\n\ - TO file- output results to file, may be enclosed in single quotes\n\ -\n\ -examples:\n\ - rbox c D2 | qconvex s n rbox c D2 | qconvex i\n\ - rbox c D2 | qconvex o rbox 1000 s | qconvex s Tv FA\n\ - rbox c d D2 | qconvex s Qc Fx rbox y 1000 W0 | qconvex s n\n\ - rbox y 1000 W0 | qconvex s QJ rbox d G1 D12 | qconvex QR0 FA Pp\n\ - rbox c D7 | qconvex FA TF1000\n\ -\n\ -"; -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */ - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="prompt3">-</a> - - qh_prompt3 - concise prompt for qhull -*/ -char qh_prompt3[]= "\n\ -Qhull %s.\n\ -Except for 'F.' and 'PG', upper-case options take an argument.\n\ -\n\ - incidences mathematica normals OFF_format points\n\ - summary facet_dump\n\ -\n\ - Farea FArea_total Fcoplanars FCentrums Fd_cdd_in\n\ - FD_cdd_out FFacet_xridge Finner FIDs Fmerges\n\ - Fneighbors FNeigh_vertex Fouter FOptions FPoint_near\n\ - FQhull Fsummary FSize Fvertices FVertex_ave\n\ - Fxtremes\n\ -\n\ - Gvertices Gpoints Gall_points Gno_planes Ginner\n\ - Gcentrums Ghyperplanes Gridges Gouter GDrop_dim\n\ -\n\ - PArea_keep Pdrop d0:0D0 PFacet_area_keep Pgood PGood_neighbors\n\ - PMerge_keep Poutput_forced Pprecision_not\n\ -\n\ - QbBound 0:0.5 QbB_scale_box Qcoplanar QGood_point Qinterior\n\ - QJoggle Qrandom QRotate Qsearch_1st Qtriangulate\n\ - QVertex_good\n\ -\n\ - T4_trace Tcheck_often Tstatistics Tverify Tz_stdout\n\ - TFacet_log TInput_file TPoint_trace TMerge_trace TOutput_file\n\ - TWide_trace TVertex_stop TCone_stop\n\ -\n\ - Angle_max Centrum_size Random_dist Ucoplanar_max Wide_outside\n\ -"; - -/*-<a href="qh-qhull.htm" - >-------------------------------</a><a name="main">-</a> - - main( argc, argv ) - processes the command line, calls qhull() to do the work, and exits - - design: - initializes data structures - reads points - finishes initialization - computes convex hull and other structures - checks the result - writes the output - frees memory -*/ -int main(int argc, char *argv[]) { - int curlong, totlong; /* used !qh_NOmem */ - int exitcode, numpoints, dim; - coordT *points; - boolT ismalloc; - -#if __MWERKS__ && __POWERPC__ - char inBuf[BUFSIZ], outBuf[BUFSIZ], errBuf[BUFSIZ]; - SIOUXSettings.showstatusline= false; - SIOUXSettings.tabspaces= 1; - SIOUXSettings.rows= 40; - if (setvbuf (stdin, inBuf, _IOFBF, sizeof(inBuf)) < 0 /* w/o, SIOUX I/O is slow*/ - || setvbuf (stdout, outBuf, _IOFBF, sizeof(outBuf)) < 0 - || (stdout != stderr && setvbuf (stderr, errBuf, _IOFBF, sizeof(errBuf)) < 0)) - fprintf (stderr, "qhull internal warning (main): could not change stdio to fully buffered.\n"); - argc= ccommand(&argv); -#endif - - if ((argc == 1) && isatty( 0 /*stdin*/)) { - fprintf(stdout, qh_prompt2, qh_VERSION); - exit(qh_ERRnone); - } - if (argc > 1 && *argv[1] == '-' && !*(argv[1]+1)) { - fprintf(stdout, qh_prompta, qh_VERSION, qh_DEFAULTbox, - qh_promptb, qh_promptc, qh_promptd, qh_prompte); - exit(qh_ERRnone); - } - if (argc >1 && *argv[1] == '.' && !*(argv[1]+1)) { - fprintf(stdout, qh_prompt3, qh_VERSION); - exit(qh_ERRnone); - } - qh_init_A (stdin, stdout, stderr, argc, argv); /* sets qh qhull_command */ - exitcode= setjmp (qh errexit); /* simple statement for CRAY J916 */ - if (!exitcode) { - qh_checkflags (qh qhull_command, hidden_options); - qh_initflags (qh qhull_command); - points= qh_readpoints (&numpoints, &dim, &ismalloc); - if (dim >= 5) { - qh_option ("Qxact_merge", NULL, NULL); - qh MERGEexact= True; /* 'Qx' always */ - } - qh_init_B (points, numpoints, dim, ismalloc); - qh_qhull(); - qh_check_output(); - qh_produce_output(); - if (qh VERIFYoutput && !qh FORCEoutput && !qh STOPpoint && !qh STOPcone) - qh_check_points(); - exitcode= qh_ERRnone; - } - qh NOerrexit= True; /* no more setjmp */ -#ifdef qh_NOmem - qh_freeqhull( True); -#else - qh_freeqhull( False); - qh_memfreeshort (&curlong, &totlong); - if (curlong || totlong) - fprintf (stderr, "qhull internal warning (main): did not free %d bytes of long memory (%d pieces)\n", - totlong, curlong); -#endif - return exitcode; -} /* main */ - diff --git a/extern/qhull/src/qdelaun.c b/extern/qhull/src/qdelaun.c deleted file mode 100644 index 0e49d9c381e..00000000000 --- a/extern/qhull/src/qdelaun.c +++ /dev/null @@ -1,323 +0,0 @@ -/*<html><pre> -<a href="qh-qhull.htm" - >-------------------------------</a><a name="TOP">-</a> - - qdelaun.c - compute Delaunay triangulations and furthest-point Delaunay - triangulations using qhull - - see unix.c for full interface - - copyright (c) 1993-2002, The Geometry Center -*/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include <math.h> -#include "qhull.h" -#include "mem.h" -#include "qset.h" - -#if __MWERKS__ && __POWERPC__ -#include <SIOUX.h> -#include <Files.h> -#include <console.h> -#include <Desk.h> - -#elif __cplusplus -extern "C" { - int isatty (int); -} - -#elif _MSC_VER -#include <io.h> -#define isatty _isatty - -#else -int isatty (int); /* returns 1 if stdin is a tty - if "Undefined symbol" this can be deleted along with call in main() */ -#endif - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="prompt">-</a> - - qh_prompt - long prompt for qhull - - notes: - restricted version of qhull.c - - see: - concise prompt below -*/ - -/* duplicated in qdelau_f.htm and qdelaun.htm */ -char hidden_options[]=" d n v H U Qb QB Qc Qf Qg Qi Qm Qr QR Qv Qx TR E V FC Fi Fo Ft Fp FV Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 "; - -char qh_prompta[]= "\n\ -qdelaunay- compute the Delaunay triangulation\n\ - http://www.geom.umn.edu/software/qhull %s\n\ -\n\ -input (stdin):\n\ - first lines: dimension and number of points (or vice-versa).\n\ - other lines: point coordinates, best if one point per line\n\ - comments: start with a non-numeric character\n\ -\n\ -options:\n\ - Qu - compute furthest-site Delaunay triangulation\n\ - Qt - triangulated output\n\ - QJ - joggled input instead of merged facets\n\ -\n\ -Qhull control options:\n\ - QJn - randomly joggle input in range [-n,n]\n\ -%s%s%s%s"; /* split up qh_prompt for Visual C++ */ -char qh_promptb[]= "\ - Qs - search all points for the initial simplex\n\ - Qz - add point-at-infinity to Delaunay triangulation\n\ - QGn - print Delaunay region if visible from point n, -n if not\n\ - QVn - print Delaunay regions that include point n, -n if not\n\ -\n\ -"; -char qh_promptc[]= "\ -Trace options:\n\ - T4 - trace at level n, 4=all, 5=mem/gauss, -1= events\n\ - Tc - check frequently during execution\n\ - Ts - print statistics\n\ - Tv - verify result: structure, convexity, and in-circle test\n\ - Tz - send all output to stdout\n\ - TFn - report summary when n or more facets created\n\ - TI file - input data from file, no spaces or single quotes\n\ - TO file - output results to file, may be enclosed in single quotes\n\ - TPn - turn on tracing when point n added to hull\n\ - TMn - turn on tracing at merge n\n\ - TWn - trace merge facets when width > n\n\ - TVn - stop qhull after adding point n, -n for before (see TCn)\n\ - TCn - stop qhull after building cone for point n (see TVn)\n\ -\n\ -Precision options:\n\ - Cn - radius of centrum (roundoff added). Merge facets if non-convex\n\ - An - cosine of maximum angle. Merge facets if cosine > n or non-convex\n\ - C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge\n\ - Rn - randomly perturb computations by a factor of [1-n,1+n]\n\ - Wn - min facet width for outside point (before roundoff)\n\ -\n\ -Output formats (may be combined; if none, produces a summary to stdout):\n\ - f - facet dump\n\ - G - Geomview output (see below)\n\ - i - vertices incident to each Delaunay region\n\ - m - Mathematica output (2-d only, lifted to a paraboloid)\n\ - o - OFF format (dim, points, and facets as a paraboloid)\n\ - p - point coordinates (lifted to a paraboloid)\n\ - s - summary (stderr)\n\ -\n\ -"; -char qh_promptd[]= "\ -More formats:\n\ - Fa - area for each Delaunay region\n\ - FA - compute total area for option 's'\n\ - Fc - count plus coincident points for each Delaunay region\n\ - Fd - use cdd format for input (homogeneous with offset first)\n\ - FD - use cdd format for numeric output (offset first)\n\ - FF - facet dump without ridges\n\ - FI - ID of each Delaunay region\n\ - Fm - merge count for each Delaunay region (511 max)\n\ - Fn - count plus neighboring region for each Delaunay region\n\ - FN - count plus neighboring region for each point\n\ - FO - options and precision constants\n\ - FP - nearest point and distance for each coincident point\n\ - FQ - command used for qdelaunay\n\ - Fs - summary: #int (8), dimension, #points, tot vertices, tot facets,\n\ - for output: #vertices, #Delaunay regions,\n\ - #coincident points, #non-simplicial regions\n\ - #real (2), max outer plane, min vertex\n\ - FS - sizes: #int (0)\n\ - #real(2) tot area, 0\n\ - Fv - count plus vertices for each Delaunay region\n\ - Fx - extreme points of Delaunay triangulation (on convex hull)\n\ -\n\ -"; -char qh_prompte[]= "\ -Geomview options (2-d and 3-d)\n\ - Ga - all points as dots\n\ - Gp - coplanar points and vertices as radii\n\ - Gv - vertices as spheres\n\ - Gi - inner planes only\n\ - Gn - no planes\n\ - Go - outer planes only\n\ - Gc - centrums\n\ - Gh - hyperplane intersections\n\ - Gr - ridges\n\ - GDn - drop dimension n in 3-d and 4-d output\n\ - Gt - transparent outer ridges to view 3-d Delaunay\n\ -\n\ -Print options:\n\ - PAn - keep n largest Delaunay regions by area\n\ - Pdk:n - drop facet if normal[k] <= n (default 0.0)\n\ - PDk:n - drop facet if normal[k] >= n\n\ - Pg - print good Delaunay regions (needs 'QGn' or 'QVn')\n\ - PFn - keep Delaunay regions whose area is at least n\n\ - PG - print neighbors of good regions (needs 'QGn' or 'QVn')\n\ - PMn - keep n Delaunay regions with most merges\n\ - Po - force output. If error, output neighborhood of facet\n\ - Pp - do not report precision problems\n\ -\n\ - . - list of all options\n\ - - - one line descriptions of all options\n\ -"; -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */ - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="prompt2">-</a> - - qh_prompt2 - synopsis for qhull -*/ -char qh_prompt2[]= "\n\ -qdelaunay- compute the Delaunay triangulation. Qhull %s\n\ - input (stdin): dimension, number of points, point coordinates\n\ - comments start with a non-numeric character\n\ -\n\ -options (qdelaun.htm):\n\ - Qu - furthest-site Delaunay triangulation\n\ - Qt - triangulated output\n\ - QJ - joggled input instead of merged facets\n\ - Tv - verify result: structure, convexity, and in-circle test\n\ - . - concise list of all options\n\ - - - one-line description of all options\n\ -\n\ -output options (subset):\n\ - s - summary of results (default)\n\ - i - vertices incident to each Delaunay region\n\ - Fx - extreme points (vertices of the convex hull)\n\ - o - OFF format (shows the points lifted to a paraboloid)\n\ - G - Geomview output (2-d and 3-d points lifted to a paraboloid)\n\ - m - Mathematica output (2-d inputs lifted to a paraboloid)\n\ - QVn - print Delaunay regions that include point n, -n if not\n\ - TO file- output results to file, may be enclosed in single quotes\n\ -\n\ -examples:\n\ - rbox c P0 D2 | qdelaunay s o rbox c P0 D2 | qdelaunay i\n\ - rbox c P0 D2 | qdelaunay Fv rbox c P0 D2 | qdelaunay s Qu Fv\n\ - rbox c G1 d D2 | qdelaunay s i rbox c G1 d D2 | qdelaunay Qt\n\ - rbox M3,4 z 100 D2 | qdelaunay s rbox M3,4 z 100 D2 | qdelaunay s Qt\n\ -\n\ -"; -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */ - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="prompt3">-</a> - - qh_prompt3 - concise prompt for qhull -*/ -char qh_prompt3[]= "\n\ -Qhull %s.\n\ -Except for 'F.' and 'PG', upper-case options take an argument.\n\ -\n\ - incidences mathematica OFF_format points_lifted summary\n\ - facet_dump\n\ -\n\ - Farea FArea_total Fcoincident Fd_cdd_in FD_cdd_out\n\ - FF_dump_xridge FIDs Fmerges Fneighbors FNeigh_vertex\n\ - FOptions FPoint_near FQdelaun Fsummary FSize\n\ - Fvertices Fxtremes\n\ -\n\ - Gvertices Gpoints Gall_points Gno_planes Ginner\n\ - Gcentrums Ghyperplanes Gridges Gouter GDrop_dim\n\ - Gtransparent\n\ -\n\ - PArea_keep Pdrop d0:0D0 Pgood PFacet_area_keep\n\ - PGood_neighbors PMerge_keep Poutput_forced Pprecision_not\n\ -\n\ - QGood_point QJoggle Qsearch_1st Qtriangulate QupperDelaunay\n\ - QVertex_good Qzinfinite\n\ -\n\ - T4_trace Tcheck_often Tstatistics Tverify Tz_stdout\n\ - TFacet_log TInput_file TPoint_trace TMerge_trace TOutput_file\n\ - TWide_trace TVertex_stop TCone_stop\n\ -\n\ - Angle_max Centrum_size Random_dist Wide_outside\n\ -"; - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="main">-</a> - - main( argc, argv ) - processes the command line, calls qhull() to do the work, and exits - - design: - initializes data structures - reads points - finishes initialization - computes convex hull and other structures - checks the result - writes the output - frees memory -*/ -int main(int argc, char *argv[]) { - int curlong, totlong; /* used !qh_NOmem */ - int exitcode, numpoints, dim; - coordT *points; - boolT ismalloc; - -#if __MWERKS__ && __POWERPC__ - char inBuf[BUFSIZ], outBuf[BUFSIZ], errBuf[BUFSIZ]; - SIOUXSettings.showstatusline= false; - SIOUXSettings.tabspaces= 1; - SIOUXSettings.rows= 40; - if (setvbuf (stdin, inBuf, _IOFBF, sizeof(inBuf)) < 0 /* w/o, SIOUX I/O is slow*/ - || setvbuf (stdout, outBuf, _IOFBF, sizeof(outBuf)) < 0 - || (stdout != stderr && setvbuf (stderr, errBuf, _IOFBF, sizeof(errBuf)) < 0)) - fprintf (stderr, "qhull internal warning (main): could not change stdio to fully buffered.\n"); - argc= ccommand(&argv); -#endif - - if ((argc == 1) && isatty( 0 /*stdin*/)) { - fprintf(stdout, qh_prompt2, qh_VERSION); - exit(qh_ERRnone); - } - if (argc > 1 && *argv[1] == '-' && !*(argv[1]+1)) { - fprintf(stdout, qh_prompta, qh_VERSION, - qh_promptb, qh_promptc, qh_promptd, qh_prompte); - exit(qh_ERRnone); - } - if (argc >1 && *argv[1] == '.' && !*(argv[1]+1)) { - fprintf(stdout, qh_prompt3, qh_VERSION); - exit(qh_ERRnone); - } - qh_init_A (stdin, stdout, stderr, argc, argv); /* sets qh qhull_command */ - exitcode= setjmp (qh errexit); /* simple statement for CRAY J916 */ - if (!exitcode) { - qh_option ("delaunay Qbbound-last", NULL, NULL); - qh DELAUNAY= True; /* 'd' */ - qh SCALElast= True; /* 'Qbb' */ - qh KEEPcoplanar= True; /* 'Qc', to keep coplanars in 'p' */ - qh_checkflags (qh qhull_command, hidden_options); - qh_initflags (qh qhull_command); - points= qh_readpoints (&numpoints, &dim, &ismalloc); - if (dim >= 5) { - qh_option ("Qxact_merge", NULL, NULL); - qh MERGEexact= True; /* 'Qx' always */ - } - qh_init_B (points, numpoints, dim, ismalloc); - qh_qhull(); - qh_check_output(); - qh_produce_output(); - if (qh VERIFYoutput && !qh FORCEoutput && !qh STOPpoint && !qh STOPcone) - qh_check_points(); - exitcode= qh_ERRnone; - } - qh NOerrexit= True; /* no more setjmp */ -#ifdef qh_NOmem - qh_freeqhull( True); -#else - qh_freeqhull( False); - qh_memfreeshort (&curlong, &totlong); - if (curlong || totlong) - fprintf (stderr, "qhull internal warning (main): did not free %d bytes of long memory (%d pieces)\n", - totlong, curlong); -#endif - return exitcode; -} /* main */ - diff --git a/extern/qhull/src/qhalf.c b/extern/qhull/src/qhalf.c deleted file mode 100644 index a2b3875dd7f..00000000000 --- a/extern/qhull/src/qhalf.c +++ /dev/null @@ -1,324 +0,0 @@ -/*<html><pre> -<a href="qh-qhull.htm" - >-------------------------------</a><a name="TOP">-</a> - - qhalf.c - compute the intersection of halfspaces about a point - - see unix.c for full interface - - copyright (c) 1993-2002, The Geometry Center -*/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include <math.h> -#include "qhull.h" -#include "mem.h" -#include "qset.h" - -#if __MWERKS__ && __POWERPC__ -#include <SIOUX.h> -#include <Files.h> -#include <console.h> -#include <Desk.h> - -#elif __cplusplus -extern "C" { - int isatty (int); -} - -#elif _MSC_VER -#include <io.h> -#define isatty _isatty - -#else -int isatty (int); /* returns 1 if stdin is a tty - if "Undefined symbol" this can be deleted along with call in main() */ -#endif - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="prompt">-</a> - - qh_prompt - long prompt for qhull - - notes: - restricted version of qhull.c - - see: - concise prompt below -*/ - -/* duplicated in qhalf.htm */ -char hidden_options[]=" d n v Qbb QbB Qf Qg Qm Qr QR Qv Qx Qz TR E V Fa FA FC FD FS Ft FV Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 "; - -char qh_prompta[]= "\n\ -qhalf- compute the intersection of halfspaces about a point\n\ - http://www.geom.umn.edu/software/qhull %s\n\ -\n\ -input (stdin):\n\ - optional interior point: dimension, 1, coordinates\n\ - first lines: dimension+1 and number of halfspaces\n\ - other lines: halfspace coefficients followed by offset\n\ - comments: start with a non-numeric character\n\ -\n\ -options:\n\ - Hn,n - specify coordinates of interior point\n\ - Qt - triangulated output\n\ - QJ - joggled input instead of merged facets\n\ - Qc - keep coplanar halfspaces\n\ - Qi - keep other redundant halfspaces\n\ -\n\ -Qhull control options:\n\ - QJn - randomly joggle input in range [-n,n]\n\ -%s%s%s%s"; /* split up qh_prompt for Visual C++ */ -char qh_promptb[]= "\ - Qbk:0Bk:0 - remove k-th coordinate from input\n\ - Qs - search all halfspaces for the initial simplex\n\ - QGn - print intersection if visible to halfspace n, -n for not\n\ - QVn - print intersections for halfspace n, -n if not\n\ -\n\ -"; -char qh_promptc[]= "\ -Trace options:\n\ - T4 - trace at level n, 4=all, 5=mem/gauss, -1= events\n\ - Tc - check frequently during execution\n\ - Ts - print statistics\n\ - Tv - verify result: structure, convexity, and redundancy\n\ - Tz - send all output to stdout\n\ - TFn - report summary when n or more facets created\n\ - TI file - input data from file, no spaces or single quotes\n\ - TO file - output results to file, may be enclosed in single quotes\n\ - TPn - turn on tracing when halfspace n added to intersection\n\ - TMn - turn on tracing at merge n\n\ - TWn - trace merge facets when width > n\n\ - TVn - stop qhull after adding halfspace n, -n for before (see TCn)\n\ - TCn - stop qhull after building cone for halfspace n (see TVn)\n\ -\n\ -Precision options:\n\ - Cn - radius of centrum (roundoff added). Merge facets if non-convex\n\ - An - cosine of maximum angle. Merge facets if cosine > n or non-convex\n\ - C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge\n\ - Rn - randomly perturb computations by a factor of [1-n,1+n]\n\ - Un - max distance below plane for a new, coplanar halfspace\n\ - Wn - min facet width for outside halfspace (before roundoff)\n\ -\n\ -Output formats (may be combined; if none, produces a summary to stdout):\n\ - f - facet dump\n\ - G - Geomview output (dual convex hull)\n\ - i - non-redundant halfspaces incident to each intersection\n\ - m - Mathematica output (dual convex hull)\n\ - o - OFF format (dual convex hull: dimension, points, and facets)\n\ - p - vertex coordinates of dual convex hull (coplanars if 'Qc' or 'Qi')\n\ - s - summary (stderr)\n\ -\n\ -"; -char qh_promptd[]= "\ -More formats:\n\ - Fc - count plus redundant halfspaces for each intersection\n\ - - Qc (default) for coplanar and Qi for other redundant\n\ - Fd - use cdd format for input (homogeneous with offset first)\n\ - FF - facet dump without ridges\n\ - FI - ID of each intersection\n\ - Fm - merge count for each intersection (511 max)\n\ - Fn - count plus neighboring intersections for each intersection\n\ - FN - count plus intersections for each non-redundant halfspace\n\ - FO - options and precision constants\n\ - Fp - dim, count, and intersection coordinates\n\ - FP - nearest halfspace and distance for each redundant halfspace\n\ - FQ - command used for qhalf\n\ - Fs - summary: #int (8), dim, #halfspaces, #non-redundant, #intersections\n\ - for output: #non-redundant, #intersections, #coplanar\n\ - halfspaces, #non-simplicial intersections\n\ - #real (2), max outer plane, min vertex\n\ - Fv - count plus non-redundant halfspaces for each intersection\n\ - Fx - non-redundant halfspaces\n\ -\n\ -"; -char qh_prompte[]= "\ -Geomview output (2-d, 3-d and 4-d; dual convex hull)\n\ - Ga - all points (i.e., transformed halfspaces) as dots\n\ - Gp - coplanar points and vertices as radii\n\ - Gv - vertices (i.e., non-redundant halfspaces) as spheres\n\ - Gi - inner planes (i.e., halfspace intersections) only\n\ - Gn - no planes\n\ - Go - outer planes only\n\ - Gc - centrums\n\ - Gh - hyperplane intersections\n\ - Gr - ridges\n\ - GDn - drop dimension n in 3-d and 4-d output\n\ -\n\ -Print options:\n\ - PAn - keep n largest facets (i.e., intersections) by area\n\ - Pdk:n- drop facet if normal[k] <= n (default 0.0)\n\ - PDk:n- drop facet if normal[k] >= n\n\ - Pg - print good facets (needs 'QGn' or 'QVn')\n\ - PFn - keep facets whose area is at least n\n\ - PG - print neighbors of good facets\n\ - PMn - keep n facets with most merges\n\ - Po - force output. If error, output neighborhood of facet\n\ - Pp - do not report precision problems\n\ -\n\ - . - list of all options\n\ - - - one line descriptions of all options\n\ -"; -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */ - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="prompt2">-</a> - - qh_prompt2 - synopsis for qhull -*/ -char qh_prompt2[]= "\n\ -qhalf- halfspace intersection about a point. Qhull %s\n\ - input (stdin): [dim, 1, interior point], dim+1, n, coefficients+offset\n\ - comments start with a non-numeric character\n\ -\n\ -options (qhalf.htm):\n\ - Hn,n - specify coordinates of interior point\n\ - Qt - triangulated output\n\ - QJ - joggled input instead of merged facets\n\ - Tv - verify result: structure, convexity, and redundancy\n\ - . - concise list of all options\n\ - - - one-line description of all options\n\ -\n\ -output options (subset):\n\ - s - summary of results (default)\n\ - Fp - intersection coordinates\n\ - Fv - non-redundant halfspaces incident to each intersection\n\ - Fx - non-redundant halfspaces\n\ - o - OFF file format (dual convex hull)\n\ - G - Geomview output (dual convex hull)\n\ - m - Mathematica output (dual convex hull)\n\ - QVn - print intersections for halfspace n, -n if not\n\ - TO file - output results to file, may be enclosed in single quotes\n\ -\n\ -examples:\n\ - rbox d | qconvex FQ n | qhalf s H0,0,0 Fp\n\ - rbox c | qconvex FQ FV n | qhalf s i\n\ - rbox c | qconvex FQ FV n | qhalf s o\n\ -\n\ -"; -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */ - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="prompt3">-</a> - - qh_prompt3 - concise prompt for qhull -*/ -char qh_prompt3[]= "\n\ -Qhull %s.\n\ -Except for 'F.' and 'PG', upper_case options take an argument.\n\ -\n\ - incidences Geomview mathematica OFF_format point_dual\n\ - summary facet_dump\n\ -\n\ - Fc_redundant Fd_cdd_in FF_dump_xridge FIDs Fmerges\n\ - Fneighbors FN_intersect FOptions Fp_coordinates FP_nearest\n\ - FQhalf Fsummary Fv_halfspace Fx_non_redundant\n\ -\n\ - Gvertices Gpoints Gall_points Gno_planes Ginner\n\ - Gcentrums Ghyperplanes Gridges Gouter GDrop_dim\n\ -\n\ - PArea_keep Pdrop d0:0D0 Pgood PFacet_area_keep\n\ - PGood_neighbors PMerge_keep Poutput_forced Pprecision_not\n\ -\n\ - Qbk:0Bk:0_drop Qcoplanar QG_half_good Qi_redundant QJoggle\n\ - Qsearch_1st Qtriangulate QVertex_good\n\ -\n\ - T4_trace Tcheck_often Tstatistics Tverify Tz_stdout\n\ - TFacet_log TInput_file TPoint_trace TMerge_trace TOutput_file\n\ - TWide_trace TVertex_stop TCone_stop\n\ -\n\ - Angle_max Centrum_size Random_dist Ucoplanar_max Wide_outside\n\ -"; - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="main">-</a> - - main( argc, argv ) - processes the command line, calls qhull() to do the work, and exits - - design: - initializes data structures - reads points - finishes initialization - computes convex hull and other structures - checks the result - writes the output - frees memory -*/ -int main(int argc, char *argv[]) { - int curlong, totlong; /* used !qh_NOmem */ - int exitcode, numpoints, dim; - coordT *points; - boolT ismalloc; - -#if __MWERKS__ && __POWERPC__ - char inBuf[BUFSIZ], outBuf[BUFSIZ], errBuf[BUFSIZ]; - SIOUXSettings.showstatusline= false; - SIOUXSettings.tabspaces= 1; - SIOUXSettings.rows= 40; - if (setvbuf (stdin, inBuf, _IOFBF, sizeof(inBuf)) < 0 /* w/o, SIOUX I/O is slow*/ - || setvbuf (stdout, outBuf, _IOFBF, sizeof(outBuf)) < 0 - || (stdout != stderr && setvbuf (stderr, errBuf, _IOFBF, sizeof(errBuf)) < 0)) - fprintf (stderr, "qhull internal warning (main): could not change stdio to fully buffered.\n"); - argc= ccommand(&argv); -#endif - - if ((argc == 1) && isatty( 0 /*stdin*/)) { - fprintf(stdout, qh_prompt2, qh_VERSION); - exit(qh_ERRnone); - } - if (argc > 1 && *argv[1] == '-' && !*(argv[1]+1)) { - fprintf(stdout, qh_prompta, qh_VERSION, - qh_promptb, qh_promptc, qh_promptd, qh_prompte); - exit(qh_ERRnone); - } - if (argc >1 && *argv[1] == '.' && !*(argv[1]+1)) { - fprintf(stdout, qh_prompt3, qh_VERSION); - exit(qh_ERRnone); - } - qh_init_A (stdin, stdout, stderr, argc, argv); /* sets qh qhull_command */ - exitcode= setjmp (qh errexit); /* simple statement for CRAY J916 */ - if (!exitcode) { - qh_option ("Halfspace", NULL, NULL); - qh HALFspace= True; /* 'H' */ - qh_checkflags (qh qhull_command, hidden_options); - qh_initflags (qh qhull_command); - if (qh SCALEinput) { - fprintf(qh ferr, "\ -qhull error: options 'Qbk:n' and 'QBk:n' are not used with qhalf.\n\ - Use 'Qbk:0Bk:0 to drop dimension k.\n"); - qh_errexit(qh_ERRinput, NULL, NULL); - } - points= qh_readpoints (&numpoints, &dim, &ismalloc); - if (dim >= 5) { - qh_option ("Qxact_merge", NULL, NULL); - qh MERGEexact= True; /* 'Qx' always */ - } - qh_init_B (points, numpoints, dim, ismalloc); - qh_qhull(); - qh_check_output(); - qh_produce_output(); - if (qh VERIFYoutput && !qh FORCEoutput && !qh STOPpoint && !qh STOPcone) - qh_check_points(); - exitcode= qh_ERRnone; - } - qh NOerrexit= True; /* no more setjmp */ -#ifdef qh_NOmem - qh_freeqhull( True); -#else - qh_freeqhull( False); - qh_memfreeshort (&curlong, &totlong); - if (curlong || totlong) - fprintf (stderr, "qhull internal warning (main): did not free %d bytes of long memory (%d pieces)\n", - totlong, curlong); -#endif - return exitcode; -} /* main */ - diff --git a/extern/qhull/src/qhull.c b/extern/qhull/src/qhull.c deleted file mode 100644 index dc835bb4f28..00000000000 --- a/extern/qhull/src/qhull.c +++ /dev/null @@ -1,1395 +0,0 @@ -/*<html><pre> -<a href="qh-qhull.htm" - >-------------------------------</a><a name="TOP">-</a> - - qhull.c - Quickhull algorithm for convex hulls - - qhull() and top-level routines - - see qh-qhull.htm, qhull.h, unix.c - - see qhull_a.h for internal functions - - copyright (c) 1993-2002 The Geometry Center -*/ - -#include "qhull_a.h" - -/*============= functions in alphabetic order after qhull() =======*/ - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="qhull">-</a> - - qh_qhull() - compute DIM3 convex hull of qh.num_points starting at qh.first_point - qh contains all global options and variables - - returns: - returns polyhedron - qh.facet_list, qh.num_facets, qh.vertex_list, qh.num_vertices, - - returns global variables - qh.hulltime, qh.max_outside, qh.interior_point, qh.max_vertex, qh.min_vertex - - returns precision constants - qh.ANGLEround, centrum_radius, cos_max, DISTround, MAXabs_coord, ONEmerge - - notes: - unless needed for output - qh.max_vertex and qh.min_vertex are max/min due to merges - - see: - to add individual points to either qh.num_points - use qh_addpoint() - - if qh.GETarea - qh_produceoutput() returns qh.totarea and qh.totvol via qh_getarea() - - design: - record starting time - initialize hull and partition points - build convex hull - unless early termination - update facet->maxoutside for vertices, coplanar, and near-inside points - error if temporary sets exist - record end time -*/ -void qh_qhull (void) { - int numoutside; - - qh hulltime= qh_CPUclock; - if (qh RERUN || qh JOGGLEmax < REALmax/2) - qh_build_withrestart(); - else { - qh_initbuild(); - qh_buildhull(); - } - if (!qh STOPpoint && !qh STOPcone) { - if (qh ZEROall_ok && !qh TESTvneighbors && qh MERGEexact) - qh_checkzero( qh_ALL); - if (qh ZEROall_ok && !qh TESTvneighbors && !qh WAScoplanar) { - trace2((qh ferr, "qh_qhull: all facets are clearly convex and no coplanar points. Post-merging and check of maxout not needed.\n")); - qh DOcheckmax= False; - }else { - if (qh MERGEexact || (qh hull_dim > qh_DIMreduceBuild && qh PREmerge)) - qh_postmerge ("First post-merge", qh premerge_centrum, qh premerge_cos, - (qh POSTmerge ? False : qh TESTvneighbors)); - else if (!qh POSTmerge && qh TESTvneighbors) - qh_postmerge ("For testing vertex neighbors", qh premerge_centrum, - qh premerge_cos, True); - if (qh POSTmerge) - qh_postmerge ("For post-merging", qh postmerge_centrum, - qh postmerge_cos, qh TESTvneighbors); - if (qh visible_list == qh facet_list) { /* i.e., merging done */ - qh findbestnew= True; - qh_partitionvisible (/*visible_list, newfacet_list*/ !qh_ALL, &numoutside); - qh findbestnew= False; - qh_deletevisible (/*qh visible_list*/); - qh_resetlists (False, qh_RESETvisible /*qh visible_list newvertex_list newfacet_list */); - } - } - if (qh DOcheckmax){ - if (qh REPORTfreq) { - qh_buildtracing (NULL, NULL); - fprintf (qh ferr, "\nTesting all coplanar points.\n"); - } - qh_check_maxout(); - } - if (qh KEEPnearinside && !qh maxoutdone) - qh_nearcoplanar(); - } - if (qh_setsize ((setT*)qhmem.tempstack) != 0) { - fprintf (qh ferr, "qhull internal error (qh_qhull): temporary sets not empty (%d)\n", - qh_setsize ((setT*)qhmem.tempstack)); - qh_errexit (qh_ERRqhull, NULL, NULL); - } - qh hulltime= qh_CPUclock - qh hulltime; - qh QHULLfinished= True; - trace1((qh ferr, "qh_qhull: algorithm completed\n")); -} /* qhull */ - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="addpoint">-</a> - - qh_addpoint( furthest, facet, checkdist ) - add point (usually furthest point) above facet to hull - if checkdist, - check that point is above facet. - if point is not outside of the hull, uses qh_partitioncoplanar() - assumes that facet is defined by qh_findbestfacet() - else if facet specified, - assumes that point is above facet (major damage if below) - for Delaunay triangulations, - Use qh_setdelaunay() to lift point to paraboloid and scale by 'Qbb' if needed - Do not use options 'Qbk', 'QBk', or 'QbB' since they scale the coordinates. - - returns: - returns False if user requested an early termination - qh.visible_list, newfacet_list, delvertex_list, NEWfacets may be defined - updates qh.facet_list, qh.num_facets, qh.vertex_list, qh.num_vertices - clear qh.maxoutdone (will need to call qh_check_maxout() for facet->maxoutside) - if unknown point, adds a pointer to qh.other_points - do not deallocate the point's coordinates - - notes: - assumes point is near its best facet and not at a local minimum of a lens - distributions. Use qh_findbestfacet to avoid this case. - uses qh.visible_list, qh.newfacet_list, qh.delvertex_list, qh.NEWfacets - - see also: - qh_triangulate() -- triangulate non-simplicial facets - - design: - check point in qh.first_point/.num_points - if checkdist - if point not above facet - partition coplanar point - exit - exit if pre STOPpoint requested - find horizon and visible facets for point - make new facets for point to horizon - make hyperplanes for point - compute balance statistics - match neighboring new facets - update vertex neighbors and delete interior vertices - exit if STOPcone requested - merge non-convex new facets - if merge found, many merges, or 'Qf' - use qh_findbestnew() instead of qh_findbest() - partition outside points from visible facets - delete visible facets - check polyhedron if requested - exit if post STOPpoint requested - reset working lists of facets and vertices -*/ -boolT qh_addpoint (pointT *furthest, facetT *facet, boolT checkdist) { - int goodvisible, goodhorizon; - vertexT *vertex; - facetT *newfacet; - realT dist, newbalance, pbalance; - boolT isoutside= False; - int numpart, numpoints, numnew, firstnew; - - qh maxoutdone= False; - if (qh_pointid (furthest) == -1) - qh_setappend (&qh other_points, furthest); - if (!facet) { - fprintf (qh ferr, "qh_addpoint: NULL facet. Need to call qh_findbestfacet first\n"); - qh_errexit (qh_ERRqhull, NULL, NULL); - } - if (checkdist) { - facet= qh_findbest (furthest, facet, !qh_ALL, !qh_ISnewfacets, !qh_NOupper, - &dist, &isoutside, &numpart); - zzadd_(Zpartition, numpart); - if (!isoutside) { - zinc_(Znotmax); /* last point of outsideset is no longer furthest. */ - facet->notfurthest= True; - qh_partitioncoplanar (furthest, facet, &dist); - return True; - } - } - qh_buildtracing (furthest, facet); - if (qh STOPpoint < 0 && qh furthest_id == -qh STOPpoint-1) { - facet->notfurthest= True; - return False; - } - qh_findhorizon (furthest, facet, &goodvisible, &goodhorizon); - if (qh ONLYgood && !(goodvisible+goodhorizon) && !qh GOODclosest) { - zinc_(Znotgood); - facet->notfurthest= True; - /* last point of outsideset is no longer furthest. This is ok - since all points of the outside are likely to be bad */ - qh_resetlists (False, qh_RESETvisible /*qh visible_list newvertex_list newfacet_list */); - return True; - } - zzinc_(Zprocessed); - firstnew= qh facet_id; - vertex= qh_makenewfacets (furthest /*visible_list, attaches if !ONLYgood */); - qh_makenewplanes (/* newfacet_list */); - numnew= qh facet_id - firstnew; - newbalance= numnew - (realT) (qh num_facets-qh num_visible) - * qh hull_dim/qh num_vertices; - wadd_(Wnewbalance, newbalance); - wadd_(Wnewbalance2, newbalance * newbalance); - if (qh ONLYgood - && !qh_findgood (qh newfacet_list, goodhorizon) && !qh GOODclosest) { - FORALLnew_facets - qh_delfacet (newfacet); - qh_delvertex (vertex); - qh_resetlists (True, qh_RESETvisible /*qh visible_list newvertex_list newfacet_list */); - zinc_(Znotgoodnew); - facet->notfurthest= True; - return True; - } - if (qh ONLYgood) - qh_attachnewfacets(/*visible_list*/); - qh_matchnewfacets(); - qh_updatevertices(); - if (qh STOPcone && qh furthest_id == qh STOPcone-1) { - facet->notfurthest= True; - return False; /* visible_list etc. still defined */ - } - qh findbestnew= False; - if (qh PREmerge || qh MERGEexact) { - qh_premerge (vertex, qh premerge_centrum, qh premerge_cos); - if (qh_USEfindbestnew) - qh findbestnew= True; - else { - FORALLnew_facets { - if (!newfacet->simplicial) { - qh findbestnew= True; /* use qh_findbestnew instead of qh_findbest*/ - break; - } - } - } - }else if (qh BESToutside) - qh findbestnew= True; - qh_partitionvisible (/*visible_list, newfacet_list*/ !qh_ALL, &numpoints); - qh findbestnew= False; - qh findbest_notsharp= False; - zinc_(Zpbalance); - pbalance= numpoints - (realT) qh hull_dim /* assumes all points extreme */ - * (qh num_points - qh num_vertices)/qh num_vertices; - wadd_(Wpbalance, pbalance); - wadd_(Wpbalance2, pbalance * pbalance); - qh_deletevisible (/*qh visible_list*/); - zmax_(Zmaxvertex, qh num_vertices); - qh NEWfacets= False; - if (qh IStracing >= 4) { - if (qh num_facets < 2000) - qh_printlists(); - qh_printfacetlist (qh newfacet_list, NULL, True); - qh_checkpolygon (qh facet_list); - }else if (qh CHECKfrequently) { - if (qh num_facets < 50) - qh_checkpolygon (qh facet_list); - else - qh_checkpolygon (qh newfacet_list); - } - if (qh STOPpoint > 0 && qh furthest_id == qh STOPpoint-1) - return False; - qh_resetlists (True, qh_RESETvisible /*qh visible_list newvertex_list newfacet_list */); - /* qh_triangulate(); to test qh.TRInormals */ - trace2((qh ferr, "qh_addpoint: added p%d new facets %d new balance %2.2g point balance %2.2g\n", - qh_pointid (furthest), numnew, newbalance, pbalance)); - return True; -} /* addpoint */ - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="build_withrestart">-</a> - - qh_build_withrestart() - allow restarts due to qh.JOGGLEmax while calling qh_buildhull() - qh.FIRSTpoint/qh.NUMpoints is point array - it may be moved by qh_joggleinput() -*/ -void qh_build_withrestart (void) { - int restart; - - qh ALLOWrestart= True; - while (True) { - restart= setjmp (qh restartexit); /* simple statement for CRAY J916 */ - if (restart) { /* only from qh_precision() */ - zzinc_(Zretry); - wmax_(Wretrymax, qh JOGGLEmax); - qh ERREXITcalled= False; - qh STOPcone= True; /* if break, prevents normal output */ - } - if (!qh RERUN && qh JOGGLEmax < REALmax/2) { - if (qh build_cnt > qh_JOGGLEmaxretry) { - fprintf(qh ferr, "\n\ -qhull precision error: %d attempts to construct a convex hull\n\ - with joggled input. Increase joggle above 'QJ%2.2g'\n\ - or modify qh_JOGGLE... parameters in user.h\n", - qh build_cnt, qh JOGGLEmax); - qh_errexit (qh_ERRqhull, NULL, NULL); - } - if (qh build_cnt && !restart) - break; - }else if (qh build_cnt && qh build_cnt >= qh RERUN) - break; - qh STOPcone= False; - qh_freebuild (True); /* first call is a nop */ - qh build_cnt++; - if (!qh qhull_optionsiz) - qh qhull_optionsiz= strlen (qh qhull_options); - else { - qh qhull_options [qh qhull_optionsiz]= '\0'; - qh qhull_optionlen= 80; - } - qh_option("_run", &qh build_cnt, NULL); - if (qh build_cnt == qh RERUN) { - qh IStracing= qh TRACElastrun; /* duplicated from qh_initqhull_globals */ - if (qh TRACEpoint != -1 || qh TRACEdist < REALmax/2 || qh TRACEmerge) { - qh TRACElevel= (qh IStracing? qh IStracing : 3); - qh IStracing= 0; - } - qhmem.IStracing= qh IStracing; - } - if (qh JOGGLEmax < REALmax/2) - qh_joggleinput(); - qh_initbuild(); - qh_buildhull(); - if (qh JOGGLEmax < REALmax/2 && !qh MERGING) - qh_checkconvex (qh facet_list, qh_ALGORITHMfault); - } - qh ALLOWrestart= False; -} /* qh_build_withrestart */ - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="buildhull">-</a> - - qh_buildhull() - construct a convex hull by adding outside points one at a time - - returns: - - notes: - may be called multiple times - checks facet and vertex lists for incorrect flags - to recover from STOPcone, call qh_deletevisible and qh_resetlists - - design: - check visible facet and newfacet flags - check newlist vertex flags and qh.STOPcone/STOPpoint - for each facet with a furthest outside point - add point to facet - exit if qh.STOPcone or qh.STOPpoint requested - if qh.NARROWhull for initial simplex - partition remaining outside points to coplanar sets -*/ -void qh_buildhull(void) { - facetT *facet; - pointT *furthest; - vertexT *vertex; - int id; - - trace1((qh ferr, "qh_buildhull: start build hull\n")); - FORALLfacets { - if (facet->visible || facet->newfacet) { - fprintf (qh ferr, "qhull internal error (qh_buildhull): visible or new facet f%d in facet list\n", - facet->id); - qh_errexit (qh_ERRqhull, facet, NULL); - } - } - FORALLvertices { - if (vertex->newlist) { - fprintf (qh ferr, "qhull internal error (qh_buildhull): new vertex f%d in vertex list\n", - vertex->id); - qh_errprint ("ERRONEOUS", NULL, NULL, NULL, vertex); - qh_errexit (qh_ERRqhull, NULL, NULL); - } - id= qh_pointid (vertex->point); - if ((qh STOPpoint>0 && id == qh STOPpoint-1) || - (qh STOPpoint<0 && id == -qh STOPpoint-1) || - (qh STOPcone>0 && id == qh STOPcone-1)) { - trace1((qh ferr,"qh_buildhull: stop point or cone P%d in initial hull\n", id)); - return; - } - } - qh facet_next= qh facet_list; /* advance facet when processed */ - while ((furthest= qh_nextfurthest (&facet))) { - qh num_outside--; /* if ONLYmax, furthest may not be outside */ - if (!qh_addpoint (furthest, facet, qh ONLYmax)) - break; - } - if (qh NARROWhull) /* move points from outsideset to coplanarset */ - qh_outcoplanar( /* facet_list */ ); - if (qh num_outside && !furthest) { - fprintf (qh ferr, "qhull internal error (qh_buildhull): %d outside points were never processed.\n", qh num_outside); - qh_errexit (qh_ERRqhull, NULL, NULL); - } - trace1((qh ferr, "qh_buildhull: completed the hull construction\n")); -} /* buildhull */ - - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="buildtracing">-</a> - - qh_buildtracing( furthest, facet ) - trace an iteration of qh_buildhull() for furthest point and facet - if !furthest, prints progress message - - returns: - tracks progress with qh.lastreport - updates qh.furthest_id (-3 if furthest is NULL) - also resets visit_id, vertext_visit on wrap around - - see: - qh_tracemerging() - - design: - if !furthest - print progress message - exit - if 'TFn' iteration - print progress message - else if tracing - trace furthest point and facet - reset qh.visit_id and qh.vertex_visit if overflow may occur - set qh.furthest_id for tracing -*/ -void qh_buildtracing (pointT *furthest, facetT *facet) { - realT dist= 0; - float cpu; - int total, furthestid; - time_t timedata; - struct tm *tp; - vertexT *vertex; - - qh old_randomdist= qh RANDOMdist; - qh RANDOMdist= False; - if (!furthest) { - time (&timedata); - tp= localtime (&timedata); - cpu= qh_CPUclock - qh hulltime; - cpu /= qh_SECticks; - total= zzval_(Ztotmerge) - zzval_(Zcyclehorizon) + zzval_(Zcyclefacettot); - fprintf (qh ferr, "\n\ -At %02d:%02d:%02d & %2.5g CPU secs, qhull has created %d facets and merged %d.\n\ - The current hull contains %d facets and %d vertices. Last point was p%d\n", - tp->tm_hour, tp->tm_min, tp->tm_sec, cpu, qh facet_id -1, - total, qh num_facets, qh num_vertices, qh furthest_id); - return; - } - furthestid= qh_pointid (furthest); - if (qh TRACEpoint == furthestid) { - qh IStracing= qh TRACElevel; - qhmem.IStracing= qh TRACElevel; - }else if (qh TRACEpoint != -1 && qh TRACEdist < REALmax/2) { - qh IStracing= 0; - qhmem.IStracing= 0; - } - if (qh REPORTfreq && (qh facet_id-1 > qh lastreport+qh REPORTfreq)) { - qh lastreport= qh facet_id-1; - time (&timedata); - tp= localtime (&timedata); - cpu= qh_CPUclock - qh hulltime; - cpu /= qh_SECticks; - total= zzval_(Ztotmerge) - zzval_(Zcyclehorizon) + zzval_(Zcyclefacettot); - zinc_(Zdistio); - qh_distplane (furthest, facet, &dist); - fprintf (qh ferr, "\n\ -At %02d:%02d:%02d & %2.5g CPU secs, qhull has created %d facets and merged %d.\n\ - The current hull contains %d facets and %d vertices. There are %d\n\ - outside points. Next is point p%d (v%d), %2.2g above f%d.\n", - tp->tm_hour, tp->tm_min, tp->tm_sec, cpu, qh facet_id -1, - total, qh num_facets, qh num_vertices, qh num_outside+1, - furthestid, qh vertex_id, dist, getid_(facet)); - }else if (qh IStracing >=1) { - cpu= qh_CPUclock - qh hulltime; - cpu /= qh_SECticks; - qh_distplane (furthest, facet, &dist); - fprintf (qh ferr, "qh_addpoint: add p%d (v%d) to hull of %d facets (%2.2g above f%d) and %d outside at %4.4g CPU secs. Previous was p%d.\n", - furthestid, qh vertex_id, qh num_facets, dist, - getid_(facet), qh num_outside+1, cpu, qh furthest_id); - } - if (qh visit_id > (unsigned) INT_MAX) { - qh visit_id= 0; - FORALLfacets - facet->visitid= qh visit_id; - } - if (qh vertex_visit > (unsigned) INT_MAX) { - qh vertex_visit= 0; - FORALLvertices - vertex->visitid= qh vertex_visit; - } - qh furthest_id= furthestid; - qh RANDOMdist= qh old_randomdist; -} /* buildtracing */ - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="errexit2">-</a> - - qh_errexit2( exitcode, facet, otherfacet ) - return exitcode to system after an error - report two facets - - returns: - assumes exitcode non-zero - - see: - normally use qh_errexit() in user.c (reports a facet and a ridge) -*/ -void qh_errexit2(int exitcode, facetT *facet, facetT *otherfacet) { - - qh_errprint("ERRONEOUS", facet, otherfacet, NULL, NULL); - qh_errexit (exitcode, NULL, NULL); -} /* errexit2 */ - - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="findhorizon">-</a> - - qh_findhorizon( point, facet, goodvisible, goodhorizon ) - given a visible facet, find the point's horizon and visible facets - for all facets, !facet-visible - - returns: - returns qh.visible_list/num_visible with all visible facets - marks visible facets with ->visible - updates count of good visible and good horizon facets - updates qh.max_outside, qh.max_vertex, facet->maxoutside - - see: - similar to qh_delpoint() - - design: - move facet to qh.visible_list at end of qh.facet_list - for all visible facets - for each unvisited neighbor of a visible facet - compute distance of point to neighbor - if point above neighbor - move neighbor to end of qh.visible_list - else if point is coplanar with neighbor - update qh.max_outside, qh.max_vertex, neighbor->maxoutside - mark neighbor coplanar (will create a samecycle later) - update horizon statistics -*/ -void qh_findhorizon(pointT *point, facetT *facet, int *goodvisible, int *goodhorizon) { - facetT *neighbor, **neighborp, *visible; - int numhorizon= 0, coplanar= 0; - realT dist; - - trace1((qh ferr,"qh_findhorizon: find horizon for point p%d facet f%d\n",qh_pointid(point),facet->id)); - *goodvisible= *goodhorizon= 0; - zinc_(Ztotvisible); - qh_removefacet(facet); /* visible_list at end of qh facet_list */ - qh_appendfacet(facet); - qh num_visible= 1; - if (facet->good) - (*goodvisible)++; - qh visible_list= facet; - facet->visible= True; - facet->f.replace= NULL; - if (qh IStracing >=4) - qh_errprint ("visible", facet, NULL, NULL, NULL); - qh visit_id++; - FORALLvisible_facets { - if (visible->tricoplanar && !qh TRInormals) { - fprintf (qh ferr, "qh_findhorizon: does not work for tricoplanar facets. Use option 'Q11'\n"); - qh_errexit (qh_ERRqhull, visible, NULL); - } - visible->visitid= qh visit_id; - FOREACHneighbor_(visible) { - if (neighbor->visitid == qh visit_id) - continue; - neighbor->visitid= qh visit_id; - zzinc_(Znumvisibility); - qh_distplane(point, neighbor, &dist); - if (dist > qh MINvisible) { - zinc_(Ztotvisible); - qh_removefacet(neighbor); /* append to end of qh visible_list */ - qh_appendfacet(neighbor); - neighbor->visible= True; - neighbor->f.replace= NULL; - qh num_visible++; - if (neighbor->good) - (*goodvisible)++; - if (qh IStracing >=4) - qh_errprint ("visible", neighbor, NULL, NULL, NULL); - }else { - if (dist > - qh MAXcoplanar) { - neighbor->coplanar= True; - zzinc_(Zcoplanarhorizon); - qh_precision ("coplanar horizon"); - coplanar++; - if (qh MERGING) { - if (dist > 0) { - maximize_(qh max_outside, dist); - maximize_(qh max_vertex, dist); -#if qh_MAXoutside - maximize_(neighbor->maxoutside, dist); -#endif - }else - minimize_(qh min_vertex, dist); /* due to merge later */ - } - trace2((qh ferr, "qh_findhorizon: point p%d is coplanar to horizon f%d, dist=%2.7g < qh MINvisible (%2.7g)\n", - qh_pointid(point), neighbor->id, dist, qh MINvisible)); - }else - neighbor->coplanar= False; - zinc_(Ztothorizon); - numhorizon++; - if (neighbor->good) - (*goodhorizon)++; - if (qh IStracing >=4) - qh_errprint ("horizon", neighbor, NULL, NULL, NULL); - } - } - } - if (!numhorizon) { - qh_precision ("empty horizon"); - fprintf(qh ferr, "qhull precision error (qh_findhorizon): empty horizon\n\ -Point p%d was above all facets.\n", qh_pointid(point)); - qh_printfacetlist (qh facet_list, NULL, True); - qh_errexit(qh_ERRprec, NULL, NULL); - } - trace1((qh ferr, "qh_findhorizon: %d horizon facets (good %d), %d visible (good %d), %d coplanar\n", - numhorizon, *goodhorizon, qh num_visible, *goodvisible, coplanar)); - if (qh IStracing >= 4 && qh num_facets < 50) - qh_printlists (); -} /* findhorizon */ - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="nextfurthest">-</a> - - qh_nextfurthest( visible ) - returns next furthest point and visible facet for qh_addpoint() - starts search at qh.facet_next - - returns: - removes furthest point from outside set - NULL if none available - advances qh.facet_next over facets with empty outside sets - - design: - for each facet from qh.facet_next - if empty outside set - advance qh.facet_next - else if qh.NARROWhull - determine furthest outside point - if furthest point is not outside - advance qh.facet_next (point will be coplanar) - remove furthest point from outside set -*/ -pointT *qh_nextfurthest (facetT **visible) { - facetT *facet; - int size, index; - realT randr, dist; - pointT *furthest; - - while ((facet= qh facet_next) != qh facet_tail) { - if (!facet->outsideset) { - qh facet_next= facet->next; - continue; - } - SETreturnsize_(facet->outsideset, size); - if (!size) { - qh_setfree (&facet->outsideset); - qh facet_next= facet->next; - continue; - } - if (qh NARROWhull) { - if (facet->notfurthest) - qh_furthestout (facet); - furthest= (pointT*)qh_setlast (facet->outsideset); -#if qh_COMPUTEfurthest - qh_distplane (furthest, facet, &dist); - zinc_(Zcomputefurthest); -#else - dist= facet->furthestdist; -#endif - if (dist < qh MINoutside) { /* remainder of outside set is coplanar for qh_outcoplanar */ - qh facet_next= facet->next; - continue; - } - } - if (!qh RANDOMoutside && !qh VIRTUALmemory) { - if (qh PICKfurthest) { - qh_furthestnext (/* qh facet_list */); - facet= qh facet_next; - } - *visible= facet; - return ((pointT*)qh_setdellast (facet->outsideset)); - } - if (qh RANDOMoutside) { - int outcoplanar = 0; - if (qh NARROWhull) { - FORALLfacets { - if (facet == qh facet_next) - break; - if (facet->outsideset) - outcoplanar += qh_setsize( facet->outsideset); - } - } - randr= qh_RANDOMint; - randr= randr/(qh_RANDOMmax+1); - index= (int)floor((qh num_outside - outcoplanar) * randr); - FORALLfacet_(qh facet_next) { - if (facet->outsideset) { - SETreturnsize_(facet->outsideset, size); - if (!size) - qh_setfree (&facet->outsideset); - else if (size > index) { - *visible= facet; - return ((pointT*)qh_setdelnth (facet->outsideset, index)); - }else - index -= size; - } - } - fprintf (qh ferr, "qhull internal error (qh_nextfurthest): num_outside %d is too low\nby at least %d, or a random real %g >= 1.0\n", - qh num_outside, index+1, randr); - qh_errexit (qh_ERRqhull, NULL, NULL); - }else { /* VIRTUALmemory */ - facet= qh facet_tail->previous; - if (!(furthest= (pointT*)qh_setdellast(facet->outsideset))) { - if (facet->outsideset) - qh_setfree (&facet->outsideset); - qh_removefacet (facet); - qh_prependfacet (facet, &qh facet_list); - continue; - } - *visible= facet; - return furthest; - } - } - return NULL; -} /* nextfurthest */ - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="partitionall">-</a> - - qh_partitionall( vertices, points, numpoints ) - partitions all points in points/numpoints to the outsidesets of facets - vertices= vertices in qh.facet_list (not partitioned) - - returns: - builds facet->outsideset - does not partition qh.GOODpoint - if qh.ONLYgood && !qh.MERGING, - does not partition qh.GOODvertex - - notes: - faster if qh.facet_list sorted by anticipated size of outside set - - design: - initialize pointset with all points - remove vertices from pointset - remove qh.GOODpointp from pointset (unless it's qh.STOPcone or qh.STOPpoint) - for all facets - for all remaining points in pointset - compute distance from point to facet - if point is outside facet - remove point from pointset (by not reappending) - update bestpoint - append point or old bestpoint to facet's outside set - append bestpoint to facet's outside set (furthest) - for all points remaining in pointset - partition point into facets' outside sets and coplanar sets -*/ -void qh_partitionall(setT *vertices, pointT *points, int numpoints){ - setT *pointset; - vertexT *vertex, **vertexp; - pointT *point, **pointp, *bestpoint; - int size, point_i, point_n, point_end, remaining, i, id; - facetT *facet; - realT bestdist= -REALmax, dist, distoutside; - - trace1((qh ferr, "qh_partitionall: partition all points into outside sets\n")); - pointset= qh_settemp (numpoints); - qh num_outside= 0; - pointp= SETaddr_(pointset, pointT); - for (i=numpoints, point= points; i--; point += qh hull_dim) - *(pointp++)= point; - qh_settruncate (pointset, numpoints); - FOREACHvertex_(vertices) { - if ((id= qh_pointid(vertex->point)) >= 0) - SETelem_(pointset, id)= NULL; - } - id= qh_pointid (qh GOODpointp); - if (id >=0 && qh STOPcone-1 != id && -qh STOPpoint-1 != id) - SETelem_(pointset, id)= NULL; - if (qh GOODvertexp && qh ONLYgood && !qh MERGING) { /* matches qhull()*/ - if ((id= qh_pointid(qh GOODvertexp)) >= 0) - SETelem_(pointset, id)= NULL; - } - if (!qh BESToutside) { /* matches conditional for qh_partitionpoint below */ - distoutside= qh_DISToutside; /* multiple of qh.MINoutside & qh.max_outside, see user.h */ - zval_(Ztotpartition)= qh num_points - qh hull_dim - 1; /*misses GOOD... */ - remaining= qh num_facets; - point_end= numpoints; - FORALLfacets { - size= point_end/(remaining--) + 100; - facet->outsideset= qh_setnew (size); - bestpoint= NULL; - point_end= 0; - FOREACHpoint_i_(pointset) { - if (point) { - zzinc_(Zpartitionall); - qh_distplane (point, facet, &dist); - if (dist < distoutside) - SETelem_(pointset, point_end++)= point; - else { - qh num_outside++; - if (!bestpoint) { - bestpoint= point; - bestdist= dist; - }else if (dist > bestdist) { - qh_setappend (&facet->outsideset, bestpoint); - bestpoint= point; - bestdist= dist; - }else - qh_setappend (&facet->outsideset, point); - } - } - } - if (bestpoint) { - qh_setappend (&facet->outsideset, bestpoint); -#if !qh_COMPUTEfurthest - facet->furthestdist= bestdist; -#endif - }else - qh_setfree (&facet->outsideset); - qh_settruncate (pointset, point_end); - } - } - /* if !qh BESToutside, pointset contains points not assigned to outsideset */ - if (qh BESToutside || qh MERGING || qh KEEPcoplanar || qh KEEPinside) { - qh findbestnew= True; - FOREACHpoint_i_(pointset) { - if (point) - qh_partitionpoint(point, qh facet_list); - } - qh findbestnew= False; - } - zzadd_(Zpartitionall, zzval_(Zpartition)); - zzval_(Zpartition)= 0; - qh_settempfree(&pointset); - if (qh IStracing >= 4) - qh_printfacetlist (qh facet_list, NULL, True); -} /* partitionall */ - - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="partitioncoplanar">-</a> - - qh_partitioncoplanar( point, facet, dist ) - partition coplanar point to a facet - dist is distance from point to facet - if dist NULL, - searches for bestfacet and does nothing if inside - if qh.findbestnew set, - searches new facets instead of using qh_findbest() - - returns: - qh.max_ouside updated - if qh.KEEPcoplanar or qh.KEEPinside - point assigned to best coplanarset - - notes: - facet->maxoutside is updated at end by qh_check_maxout - - design: - if dist undefined - find best facet for point - if point sufficiently below facet (depends on qh.NEARinside and qh.KEEPinside) - exit - if keeping coplanar/nearinside/inside points - if point is above furthest coplanar point - append point to coplanar set (it is the new furthest) - update qh.max_outside - else - append point one before end of coplanar set - else if point is clearly outside of qh.max_outside and bestfacet->coplanarset - and bestfacet is more than perpendicular to facet - repartition the point using qh_findbest() -- it may be put on an outsideset - else - update qh.max_outside -*/ -void qh_partitioncoplanar (pointT *point, facetT *facet, realT *dist) { - facetT *bestfacet; - pointT *oldfurthest; - realT bestdist, dist2, angle; - int numpart= 0, oldfindbest; - boolT isoutside; - - qh WAScoplanar= True; - if (!dist) { - if (qh findbestnew) - bestfacet= qh_findbestnew (point, facet, &bestdist, qh_ALL, &isoutside, &numpart); - else - bestfacet= qh_findbest (point, facet, qh_ALL, !qh_ISnewfacets, qh DELAUNAY, - &bestdist, &isoutside, &numpart); - zinc_(Ztotpartcoplanar); - zzadd_(Zpartcoplanar, numpart); - if (!qh DELAUNAY && !qh KEEPinside) { /* for 'd', bestdist skips upperDelaunay facets */ - if (qh KEEPnearinside) { - if (bestdist < -qh NEARinside) { - zinc_(Zcoplanarinside); - trace4((qh ferr, "qh_partitioncoplanar: point p%d is more than near-inside facet f%d dist %2.2g findbestnew %d\n", - qh_pointid(point), bestfacet->id, bestdist, qh findbestnew)); - return; - } - }else if (bestdist < -qh MAXcoplanar) { - trace4((qh ferr, "qh_partitioncoplanar: point p%d is inside facet f%d dist %2.2g findbestnew %d\n", - qh_pointid(point), bestfacet->id, bestdist, qh findbestnew)); - zinc_(Zcoplanarinside); - return; - } - } - }else { - bestfacet= facet; - bestdist= *dist; - } - if (bestdist > qh max_outside) { - if (!dist && facet != bestfacet) { - zinc_(Zpartangle); - angle= qh_getangle(facet->normal, bestfacet->normal); - if (angle < 0) { - /* typically due to deleted vertex and coplanar facets, e.g., - RBOX 1000 s Z1 G1e-13 t1001185205 | QHULL Tv */ - zinc_(Zpartflip); - trace2((qh ferr, "qh_partitioncoplanar: repartition point p%d from f%d. It is above flipped facet f%d dist %2.2g\n", - qh_pointid(point), facet->id, bestfacet->id, bestdist)); - oldfindbest= qh findbestnew; - qh findbestnew= False; - qh_partitionpoint(point, bestfacet); - qh findbestnew= oldfindbest; - return; - } - } - qh max_outside= bestdist; - if (bestdist > qh TRACEdist) { - fprintf (qh ferr, "qh_partitioncoplanar: ====== p%d from f%d increases max_outside to %2.2g of f%d last p%d\n", - qh_pointid(point), facet->id, bestdist, bestfacet->id, qh furthest_id); - qh_errprint ("DISTANT", facet, bestfacet, NULL, NULL); - } - } - if (qh KEEPcoplanar + qh KEEPinside + qh KEEPnearinside) { - oldfurthest= (pointT*)qh_setlast (bestfacet->coplanarset); - if (oldfurthest) { - zinc_(Zcomputefurthest); - qh_distplane (oldfurthest, bestfacet, &dist2); - } - if (!oldfurthest || dist2 < bestdist) - qh_setappend(&bestfacet->coplanarset, point); - else - qh_setappend2ndlast(&bestfacet->coplanarset, point); - } - trace4((qh ferr, "qh_partitioncoplanar: point p%d is coplanar with facet f%d (or inside) dist %2.2g\n", - qh_pointid(point), bestfacet->id, bestdist)); -} /* partitioncoplanar */ - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="partitionpoint">-</a> - - qh_partitionpoint( point, facet ) - assigns point to an outside set, coplanar set, or inside set (i.e., dropt) - if qh.findbestnew - uses qh_findbestnew() to search all new facets - else - uses qh_findbest() - - notes: - after qh_distplane(), this and qh_findbest() are most expensive in 3-d - - design: - find best facet for point - (either exhaustive search of new facets or directed search from facet) - if qh.NARROWhull - retain coplanar and nearinside points as outside points - if point is outside bestfacet - if point above furthest point for bestfacet - append point to outside set (it becomes the new furthest) - if outside set was empty - move bestfacet to end of qh.facet_list (i.e., after qh.facet_next) - update bestfacet->furthestdist - else - append point one before end of outside set - else if point is coplanar to bestfacet - if keeping coplanar points or need to update qh.max_outside - partition coplanar point into bestfacet - else if near-inside point - partition as coplanar point into bestfacet - else is an inside point - if keeping inside points - partition as coplanar point into bestfacet -*/ -void qh_partitionpoint (pointT *point, facetT *facet) { - realT bestdist; - boolT isoutside; - facetT *bestfacet; - int numpart; -#if qh_COMPUTEfurthest - realT dist; -#endif - - if (qh findbestnew) - bestfacet= qh_findbestnew (point, facet, &bestdist, qh BESToutside, &isoutside, &numpart); - else - bestfacet= qh_findbest (point, facet, qh BESToutside, qh_ISnewfacets, !qh_NOupper, - &bestdist, &isoutside, &numpart); - zinc_(Ztotpartition); - zzadd_(Zpartition, numpart); - if (qh NARROWhull) { - if (qh DELAUNAY && !isoutside && bestdist >= -qh MAXcoplanar) - qh_precision ("nearly incident point (narrow hull)"); - if (qh KEEPnearinside) { - if (bestdist >= -qh NEARinside) - isoutside= True; - }else if (bestdist >= -qh MAXcoplanar) - isoutside= True; - } - - if (isoutside) { - if (!bestfacet->outsideset - || !qh_setlast (bestfacet->outsideset)) { - qh_setappend(&(bestfacet->outsideset), point); - if (!bestfacet->newfacet) { - qh_removefacet (bestfacet); /* make sure it's after qh facet_next */ - qh_appendfacet (bestfacet); - } -#if !qh_COMPUTEfurthest - bestfacet->furthestdist= bestdist; -#endif - }else { -#if qh_COMPUTEfurthest - zinc_(Zcomputefurthest); - qh_distplane (oldfurthest, bestfacet, &dist); - if (dist < bestdist) - qh_setappend(&(bestfacet->outsideset), point); - else - qh_setappend2ndlast(&(bestfacet->outsideset), point); -#else - if (bestfacet->furthestdist < bestdist) { - qh_setappend(&(bestfacet->outsideset), point); - bestfacet->furthestdist= bestdist; - }else - qh_setappend2ndlast(&(bestfacet->outsideset), point); -#endif - } - qh num_outside++; - trace4((qh ferr, "qh_partitionpoint: point p%d is outside facet f%d new? %d(or narrowhull)\n", - qh_pointid(point), bestfacet->id, bestfacet->newfacet)); - }else if (qh DELAUNAY || bestdist >= -qh MAXcoplanar) { /* for 'd', bestdist skips upperDelaunay facets */ - zzinc_(Zcoplanarpart); - if (qh DELAUNAY) - qh_precision ("nearly incident point"); - if ((qh KEEPcoplanar + qh KEEPnearinside) || bestdist > qh max_outside) - qh_partitioncoplanar (point, bestfacet, &bestdist); - else { - trace4((qh ferr, "qh_partitionpoint: point p%d is coplanar to facet f%d (dropped)\n", - qh_pointid(point), bestfacet->id)); - } - }else if (qh KEEPnearinside && bestdist > -qh NEARinside) { - zinc_(Zpartnear); - qh_partitioncoplanar (point, bestfacet, &bestdist); - }else { - zinc_(Zpartinside); - trace4((qh ferr, "qh_partitionpoint: point p%d is inside all facets, closest to f%d dist %2.2g\n", - qh_pointid(point), bestfacet->id, bestdist)); - if (qh KEEPinside) - qh_partitioncoplanar (point, bestfacet, &bestdist); - } -} /* partitionpoint */ - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="partitionvisible">-</a> - - qh_partitionvisible( allpoints, numoutside ) - partitions points in visible facets to qh.newfacet_list - qh.visible_list= visible facets - for visible facets - 1st neighbor (if any) points to a horizon facet or a new facet - if allpoints (not used), - repartitions coplanar points - - returns: - updates outside sets and coplanar sets of qh.newfacet_list - updates qh.num_outside (count of outside points) - - notes: - qh.findbest_notsharp should be clear (extra work if set) - - design: - for all visible facets with outside set or coplanar set - select a newfacet for visible facet - if outside set - partition outside set into new facets - if coplanar set and keeping coplanar/near-inside/inside points - if allpoints - partition coplanar set into new facets, may be assigned outside - else - partition coplanar set into coplanar sets of new facets - for each deleted vertex - if allpoints - partition vertex into new facets, may be assigned outside - else - partition vertex into coplanar sets of new facets -*/ -void qh_partitionvisible(/*visible_list*/ boolT allpoints, int *numoutside) { - facetT *visible, *newfacet; - pointT *point, **pointp; - int coplanar=0, size; - unsigned count; - vertexT *vertex, **vertexp; - - if (qh ONLYmax) - maximize_(qh MINoutside, qh max_vertex); - *numoutside= 0; - FORALLvisible_facets { - if (!visible->outsideset && !visible->coplanarset) - continue; - newfacet= visible->f.replace; - count= 0; - while (newfacet && newfacet->visible) { - newfacet= newfacet->f.replace; - if (count++ > qh facet_id) - qh_infiniteloop (visible); - } - if (!newfacet) - newfacet= qh newfacet_list; - if (newfacet == qh facet_tail) { - fprintf (qh ferr, "qhull precision error (qh_partitionvisible): all new facets deleted as\n degenerate facets. Can not continue.\n"); - qh_errexit (qh_ERRprec, NULL, NULL); - } - if (visible->outsideset) { - size= qh_setsize (visible->outsideset); - *numoutside += size; - qh num_outside -= size; - FOREACHpoint_(visible->outsideset) - qh_partitionpoint (point, newfacet); - } - if (visible->coplanarset && (qh KEEPcoplanar + qh KEEPinside + qh KEEPnearinside)) { - size= qh_setsize (visible->coplanarset); - coplanar += size; - FOREACHpoint_(visible->coplanarset) { - if (allpoints) /* not used */ - qh_partitionpoint (point, newfacet); - else - qh_partitioncoplanar (point, newfacet, NULL); - } - } - } - FOREACHvertex_(qh del_vertices) { - if (vertex->point) { - if (allpoints) /* not used */ - qh_partitionpoint (vertex->point, qh newfacet_list); - else - qh_partitioncoplanar (vertex->point, qh newfacet_list, NULL); - } - } - trace1((qh ferr,"qh_partitionvisible: partitioned %d points from outsidesets and %d points from coplanarsets\n", *numoutside, coplanar)); -} /* partitionvisible */ - - - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="precision">-</a> - - qh_precision( reason ) - restart on precision errors if not merging and if 'QJn' -*/ -void qh_precision (char *reason) { - - if (qh ALLOWrestart && !qh PREmerge && !qh MERGEexact) { - if (qh JOGGLEmax < REALmax/2) { - trace0((qh ferr, "qh_precision: qhull restart because of %s\n", reason)); - longjmp(qh restartexit, qh_ERRprec); - } - } -} /* qh_precision */ - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="printsummary">-</a> - - qh_printsummary( fp ) - prints summary to fp - - notes: - not in io.c so that user_eg.c can prevent io.c from loading - qh_printsummary and qh_countfacets must match counts - - design: - determine number of points, vertices, and coplanar points - print summary -*/ -void qh_printsummary(FILE *fp) { - realT ratio, outerplane, innerplane; - float cpu; - int size, id, nummerged, numvertices, numcoplanars= 0, nonsimplicial=0; - int goodused; - facetT *facet; - char *s; - int numdel= zzval_(Zdelvertextot); - int numtricoplanars= 0; - - size= qh num_points + qh_setsize (qh other_points); - numvertices= qh num_vertices - qh_setsize (qh del_vertices); - id= qh_pointid (qh GOODpointp); - FORALLfacets { - if (facet->coplanarset) - numcoplanars += qh_setsize( facet->coplanarset); - if (facet->good) { - if (facet->simplicial) { - if (facet->keepcentrum && facet->tricoplanar) - numtricoplanars++; - }else if (qh_setsize(facet->vertices) != qh hull_dim) - nonsimplicial++; - } - } - if (id >=0 && qh STOPcone-1 != id && -qh STOPpoint-1 != id) - size--; - if (qh STOPcone || qh STOPpoint) - fprintf (fp, "\nAt a premature exit due to 'TVn', 'TCn', 'TRn', or precision error."); - if (qh UPPERdelaunay) - goodused= qh GOODvertex + qh GOODpoint + qh SPLITthresholds; - else if (qh DELAUNAY) - goodused= qh GOODvertex + qh GOODpoint + qh GOODthreshold; - else - goodused= qh num_good; - nummerged= zzval_(Ztotmerge) - zzval_(Zcyclehorizon) + zzval_(Zcyclefacettot); - if (qh VORONOI) { - if (qh UPPERdelaunay) - fprintf (fp, "\n\ -Furthest-site Voronoi vertices by the convex hull of %d points in %d-d:\n\n", size, qh hull_dim); - else - fprintf (fp, "\n\ -Voronoi diagram by the convex hull of %d points in %d-d:\n\n", size, qh hull_dim); - fprintf(fp, " Number of Voronoi regions%s: %d\n", - qh ATinfinity ? " and at-infinity" : "", numvertices); - if (numdel) - fprintf(fp, " Total number of deleted points due to merging: %d\n", numdel); - if (numcoplanars - numdel > 0) - fprintf(fp, " Number of nearly incident points: %d\n", numcoplanars - numdel); - else if (size - numvertices - numdel > 0) - fprintf(fp, " Total number of nearly incident points: %d\n", size - numvertices - numdel); - fprintf(fp, " Number of%s Voronoi vertices: %d\n", - goodused ? " 'good'" : "", qh num_good); - if (nonsimplicial) - fprintf(fp, " Number of%s non-simplicial Voronoi vertices: %d\n", - goodused ? " 'good'" : "", nonsimplicial); - }else if (qh DELAUNAY) { - if (qh UPPERdelaunay) - fprintf (fp, "\n\ -Furthest-site Delaunay triangulation by the convex hull of %d points in %d-d:\n\n", size, qh hull_dim); - else - fprintf (fp, "\n\ -Delaunay triangulation by the convex hull of %d points in %d-d:\n\n", size, qh hull_dim); - fprintf(fp, " Number of input sites%s: %d\n", - qh ATinfinity ? " and at-infinity" : "", numvertices); - if (numdel) - fprintf(fp, " Total number of deleted points due to merging: %d\n", numdel); - if (numcoplanars - numdel > 0) - fprintf(fp, " Number of nearly incident points: %d\n", numcoplanars - numdel); - else if (size - numvertices - numdel > 0) - fprintf(fp, " Total number of nearly incident points: %d\n", size - numvertices - numdel); - fprintf(fp, " Number of%s Delaunay regions: %d\n", - goodused ? " 'good'" : "", qh num_good); - if (nonsimplicial) - fprintf(fp, " Number of%s non-simplicial Delaunay regions: %d\n", - goodused ? " 'good'" : "", nonsimplicial); - }else if (qh HALFspace) { - fprintf (fp, "\n\ -Halfspace intersection by the convex hull of %d points in %d-d:\n\n", size, qh hull_dim); - fprintf(fp, " Number of halfspaces: %d\n", size); - fprintf(fp, " Number of non-redundant halfspaces: %d\n", numvertices); - if (numcoplanars) { - if (qh KEEPinside && qh KEEPcoplanar) - s= "similar and redundant"; - else if (qh KEEPinside) - s= "redundant"; - else - s= "similar"; - fprintf(fp, " Number of %s halfspaces: %d\n", s, numcoplanars); - } - fprintf(fp, " Number of intersection points: %d\n", qh num_facets - qh num_visible); - if (goodused) - fprintf(fp, " Number of 'good' intersection points: %d\n", qh num_good); - if (nonsimplicial) - fprintf(fp, " Number of%s non-simplicial intersection points: %d\n", - goodused ? " 'good'" : "", nonsimplicial); - }else { - fprintf (fp, "\n\ -Convex hull of %d points in %d-d:\n\n", size, qh hull_dim); - fprintf(fp, " Number of vertices: %d\n", numvertices); - if (numcoplanars) { - if (qh KEEPinside && qh KEEPcoplanar) - s= "coplanar and interior"; - else if (qh KEEPinside) - s= "interior"; - else - s= "coplanar"; - fprintf(fp, " Number of %s points: %d\n", s, numcoplanars); - } - fprintf(fp, " Number of facets: %d\n", qh num_facets - qh num_visible); - if (goodused) - fprintf(fp, " Number of 'good' facets: %d\n", qh num_good); - if (nonsimplicial) - fprintf(fp, " Number of%s non-simplicial facets: %d\n", - goodused ? " 'good'" : "", nonsimplicial); - } - if (numtricoplanars) - fprintf(fp, " Number of triangulated facets: %d\n", numtricoplanars); - fprintf(fp, "\nStatistics for: %s | %s", - qh rbox_command, qh qhull_command); - if (qh ROTATErandom != INT_MIN) - fprintf(fp, " QR%d\n\n", qh ROTATErandom); - else - fprintf(fp, "\n\n"); - fprintf(fp, " Number of points processed: %d\n", zzval_(Zprocessed)); - fprintf(fp, " Number of hyperplanes created: %d\n", zzval_(Zsetplane)); - if (qh DELAUNAY) - fprintf(fp, " Number of facets in hull: %d\n", qh num_facets - qh num_visible); - fprintf(fp, " Number of distance tests for qhull: %d\n", zzval_(Zpartition)+ - zzval_(Zpartitionall)+zzval_(Znumvisibility)+zzval_(Zpartcoplanar)); -#if 0 /* NOTE: must print before printstatistics() */ - {realT stddev, ave; - fprintf(fp, " average new facet balance: %2.2g\n", - wval_(Wnewbalance)/zval_(Zprocessed)); - stddev= qh_stddev (zval_(Zprocessed), wval_(Wnewbalance), - wval_(Wnewbalance2), &ave); - fprintf(fp, " new facet standard deviation: %2.2g\n", stddev); - fprintf(fp, " average partition balance: %2.2g\n", - wval_(Wpbalance)/zval_(Zpbalance)); - stddev= qh_stddev (zval_(Zpbalance), wval_(Wpbalance), - wval_(Wpbalance2), &ave); - fprintf(fp, " partition standard deviation: %2.2g\n", stddev); - } -#endif - if (nummerged) { - fprintf(fp," Number of distance tests for merging: %d\n",zzval_(Zbestdist)+ - zzval_(Zcentrumtests)+zzval_(Zdistconvex)+zzval_(Zdistcheck)+ - zzval_(Zdistzero)); - fprintf(fp," Number of distance tests for checking: %d\n",zzval_(Zcheckpart)); - fprintf(fp," Number of merged facets: %d\n", nummerged); - } - if (!qh RANDOMoutside && qh QHULLfinished) { - cpu= qh hulltime; - cpu /= qh_SECticks; - wval_(Wcpu)= cpu; - fprintf (fp, " CPU seconds to compute hull (after input): %2.4g\n", cpu); - } - if (qh RERUN) { - if (!qh PREmerge && !qh MERGEexact) - fprintf(fp, " Percentage of runs with precision errors: %4.1f\n", - zzval_(Zretry)*100.0/qh build_cnt); /* careful of order */ - }else if (qh JOGGLEmax < REALmax/2) { - if (zzval_(Zretry)) - fprintf(fp, " After %d retries, input joggled by: %2.2g\n", - zzval_(Zretry), qh JOGGLEmax); - else - fprintf(fp, " Input joggled by: %2.2g\n", qh JOGGLEmax); - } - if (qh totarea != 0.0) - fprintf(fp, " %s facet area: %2.8g\n", - zzval_(Ztotmerge) ? "Approximate" : "Total", qh totarea); - if (qh totvol != 0.0) - fprintf(fp, " %s volume: %2.8g\n", - zzval_(Ztotmerge) ? "Approximate" : "Total", qh totvol); - if (qh MERGING) { - qh_outerinner (NULL, &outerplane, &innerplane); - if (outerplane > 2 * qh DISTround) { - fprintf(fp, " Maximum distance of %spoint above facet: %2.2g", - (qh QHULLfinished ? "" : "merged "), outerplane); - ratio= outerplane/(qh ONEmerge + qh DISTround); - /* don't report ratio if MINoutside is large */ - if (ratio > 0.05 && 2* qh ONEmerge > qh MINoutside && qh JOGGLEmax > REALmax/2) - fprintf (fp, " (%.1fx)\n", ratio); - else - fprintf (fp, "\n"); - } - if (innerplane < -2 * qh DISTround) { - fprintf(fp, " Maximum distance of %svertex below facet: %2.2g", - (qh QHULLfinished ? "" : "merged "), innerplane); - ratio= -innerplane/(qh ONEmerge+qh DISTround); - if (ratio > 0.05 && qh JOGGLEmax > REALmax/2) - fprintf (fp, " (%.1fx)\n", ratio); - else - fprintf (fp, "\n"); - } - } - fprintf(fp, "\n"); -} /* printsummary */ - - diff --git a/extern/qhull/src/qhull.h b/extern/qhull/src/qhull.h deleted file mode 100644 index 896ec1e9c18..00000000000 --- a/extern/qhull/src/qhull.h +++ /dev/null @@ -1,1048 +0,0 @@ -/*<html><pre> -<a href="qh-qhull.htm" - >-------------------------------</a><a name="TOP">-</a> - - qhull.h - user-level header file for using qhull.a library - - see qh-qhull.htm, qhull_a.h - - copyright (c) 1993-2002, The Geometry Center - - NOTE: access to qh_qh is via the 'qh' macro. This allows - qh_qh to be either a pointer or a structure. An example - of using qh is "qh DROPdim" which accesses the DROPdim - field of qh_qh. Similarly, access to qh_qhstat is via - the 'qhstat' macro. - - includes function prototypes for qhull.c, geom.c, global.c, io.c, user.c - - use mem.h for mem.c - use qset.h for qset.c - - see unix.c for an example of using qhull.h - - recompile qhull if you change this file -*/ - -#ifndef qhDEFqhull -#define qhDEFqhull 1 - -/*=========================== -included files ==============*/ - -#include <setjmp.h> -#include <float.h> -#include <time.h> - -#if __MWERKS__ && __POWERPC__ -#include <SIOUX.h> -#include <Files.h> -#include <Desk.h> -#endif - -#ifndef __STDC__ -#ifndef __cplusplus -#if !_MSC_VER -#error Neither __STDC__ nor __cplusplus is defined. Please use strict ANSI C or C++ to compile -#error Qhull. You may need to turn off compiler extensions in your project configuration. If -#error your compiler is a standard C compiler, you can delete this warning from qhull.h -#endif -#endif -#endif - -#include "user.h" /* user defineable constants */ - -/*============ constants and basic types ====================*/ - -/*-<a href="qh-qhull.htm#TOC" - >--------------------------------</a><a name="qh_VERSION">-</a> - - qh_VERSION - version string by year and date - - the revision increases on code changes only - - notes: - change date: Changes.txt, Announce.txt, README.txt, qhull.man - qhull-news.html, Eudora signatures, - change version: README.txt, qhull.html, file_id.diz, Makefile - change year: Copying.txt - check download size - recompile user_eg.c, rbox.c, qhull.c, qconvex.c, qdelaun.c qvoronoi.c, qhalf.c - make copy of qhull-news.html as qh-news.htm -*/ - -#define qh_VERSION "2002.1 2002/8/20" - -/*-<a href="qh-geom.htm#TOC" - >--------------------------------</a><a name="coordT">-</a> - - coordT - coordinates and coefficients are stored as realT (i.e., double) - - notes: - could use 'float' for data and 'double' for calculations (realT vs. coordT) - This requires many type casts, and adjusted error bounds. - Also C compilers may do expressions in double anyway. -*/ -#define coordT realT - -/*-<a href="qh-geom.htm#TOC" - >--------------------------------</a><a name="pointT">-</a> - - pointT - a point is an array of DIM3 coordinates -*/ -#define pointT coordT - -/*-<a href="qh-qhull.htm#TOC" - >--------------------------------</a><a name="flagT">-</a> - - flagT - Boolean flag as a bit -*/ -#define flagT unsigned int - -/*-<a href="qh-qhull.htm#TOC" - >--------------------------------</a><a name="boolT">-</a> - - boolT - boolean value, either True or False - - notes: - needed for portability -*/ -#define boolT unsigned int -#ifdef False -#undef False -#endif -#ifdef True -#undef True -#endif -#define False 0 -#define True 1 - -/*-<a href="qh-qhull.htm#TOC" - >--------------------------------</a><a name="CENTERtype">-</a> - - qh_CENTER - to distinguish facet->center -*/ -typedef enum -{ - qh_ASnone = 0, qh_ASvoronoi, qh_AScentrum -} -qh_CENTER; - -/*-<a href="qh-qhull.htm#TOC" - >--------------------------------</a><a name="qh_PRINT">-</a> - - qh_PRINT - output formats for printing (qh.PRINTout). - 'Fa' 'FV' 'Fc' 'FC' - - - notes: - some of these names are similar to qh names. The similar names are only - used in switch statements in qh_printbegin() etc. -*/ -typedef enum {qh_PRINTnone= 0, - qh_PRINTarea, qh_PRINTaverage, /* 'Fa' 'FV' 'Fc' 'FC' */ - qh_PRINTcoplanars, qh_PRINTcentrums, - qh_PRINTfacets, qh_PRINTfacets_xridge, /* 'f' 'FF' 'G' 'FI' 'Fi' 'Fn' */ - qh_PRINTgeom, qh_PRINTids, qh_PRINTinner, qh_PRINTneighbors, - qh_PRINTnormals, qh_PRINTouter, /* 'n' 'Fo' 'i' 'm' 'Fm' 'o' */ - qh_PRINTincidences, qh_PRINTmathematica, qh_PRINTmerges, qh_PRINToff, - qh_PRINToptions, qh_PRINTpointintersect, /* 'FO' 'Fp' 'FP' 'p' 'FQ' 'FS' */ - qh_PRINTpointnearest, qh_PRINTpoints, qh_PRINTqhull, qh_PRINTsize, - qh_PRINTsummary, qh_PRINTtriangles, /* 'Fs' 'Ft' 'Fv' 'FN' 'Fx' */ - qh_PRINTvertices, qh_PRINTvneighbors, qh_PRINTextremes, - qh_PRINTEND} qh_PRINT; - -/*-<a href="qh-qhull.htm#TOC" - >--------------------------------</a><a name="qh_ALL">-</a> - - qh_ALL - argument flag for selecting everything -*/ -#define qh_ALL True -#define qh_NOupper True /* argument for qh_findbest */ -#define qh_IScheckmax True /* argument for qh_findbesthorizon */ -#define qh_ISnewfacets True /* argument for qh_findbest */ -#define qh_RESETvisible True /* argument for qh_resetlists */ - -/*-<a href="qh-qhull.htm#TOC" - >--------------------------------</a><a name="qh_ERR">-</a> - - qh_ERR - Qhull exit codes, for indicating errors -*/ -#define qh_ERRnone 0 /* no error occurred during qhull */ -#define qh_ERRinput 1 /* input inconsistency */ -#define qh_ERRsingular 2 /* singular input data */ -#define qh_ERRprec 3 /* precision error */ -#define qh_ERRmem 4 /* insufficient memory, matches mem.h */ -#define qh_ERRqhull 5 /* internal error detected, matches mem.h */ - -/* ============ -structures- ==================== - each of the following structures is defined by a typedef - all realT and coordT fields occur at the beginning of a structure - (otherwise space may be wasted due to alignment) - define all flags together and pack into 32-bit number -*/ - -typedef struct vertexT vertexT; -typedef struct ridgeT ridgeT; -typedef struct facetT facetT; -#ifndef DEFsetT -#define DEFsetT 1 -typedef struct setT setT; /* defined in qset.h */ -#endif - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="facetT">-</a> - - facetT - defines a facet - - notes: - qhull() generates the hull as a list of facets. - - topological information: - f.previous,next doubly-linked list of facets - f.vertices set of vertices - f.ridges set of ridges - f.neighbors set of neighbors - f.toporient True if facet has top-orientation (else bottom) - - geometric information: - f.offset,normal hyperplane equation - f.maxoutside offset to outer plane -- all points inside - f.center centrum for testing convexity - f.simplicial True if facet is simplicial - f.flipped True if facet does not include qh.interior_point - - for constructing hull: - f.visible True if facet on list of visible facets (will be deleted) - f.newfacet True if facet on list of newly created facets - f.coplanarset set of points coplanar with this facet - (includes near-inside points for later testing) - f.outsideset set of points outside of this facet - f.furthestdist distance to furthest point of outside set - f.visitid marks visited facets during a loop - f.replace replacement facet for to-be-deleted, visible facets - f.samecycle,newcycle cycle of facets for merging into horizon facet - - see below for other flags and fields -*/ -struct facetT { -#if !qh_COMPUTEfurthest - coordT furthestdist;/* distance to furthest point of outsideset */ -#endif -#if qh_MAXoutside - coordT maxoutside; /* max computed distance of point to facet - Before QHULLfinished this is an approximation - since maxdist not always set for mergefacet - Actual outer plane is +DISTround and - computed outer plane is +2*DISTround */ -#endif - coordT offset; /* exact offset of hyperplane from origin */ - coordT *normal; /* normal of hyperplane, hull_dim coefficients */ - /* if tricoplanar, shared with a neighbor */ - union { /* in order of testing */ - realT area; /* area of facet, only in io.c if ->isarea */ - facetT *replace; /* replacement facet if ->visible and NEWfacets - is NULL only if qh_mergedegen_redundant or interior */ - facetT *samecycle; /* cycle of facets from the same visible/horizon intersection, - if ->newfacet */ - facetT *newcycle; /* in horizon facet, current samecycle of new facets */ - facetT *trivisible; /* visible facet for ->tricoplanar facets during qh_triangulate() */ - facetT *triowner; /* owner facet for ->tricoplanar, !isarea facets w/ ->keepcentrum */ - }f; - coordT *center; /* centrum for convexity, qh CENTERtype == qh_AScentrum */ - /* Voronoi center, qh CENTERtype == qh_ASvoronoi */ - /* if tricoplanar, shared with a neighbor */ - facetT *previous; /* previous facet in the facet_list */ - facetT *next; /* next facet in the facet_list */ - setT *vertices; /* vertices for this facet, inverse sorted by ID - if simplicial, 1st vertex was apex/furthest */ - setT *ridges; /* explicit ridges for nonsimplicial facets. - for simplicial facets, neighbors defines ridge */ - setT *neighbors; /* neighbors of the facet. If simplicial, the kth - neighbor is opposite the kth vertex, and the first - neighbor is the horizon facet for the first vertex*/ - setT *outsideset; /* set of points outside this facet - if non-empty, last point is furthest - if NARROWhull, includes coplanars for partitioning*/ - setT *coplanarset; /* set of points coplanar with this facet - > qh.min_vertex and <= facet->max_outside - a point is assigned to the furthest facet - if non-empty, last point is furthest away */ - unsigned visitid; /* visit_id, for visiting all neighbors, - all uses are independent */ - unsigned id; /* unique identifier from qh facet_id */ - unsigned nummerge:9; /* number of merges */ -#define qh_MAXnummerge 511 /* 2^9-1, 32 flags total, see "flags:" in io.c */ - flagT tricoplanar:1; /* True if TRIangulate and simplicial and coplanar with a neighbor */ - /* all tricoplanars share the same ->center, ->normal, ->offset, ->maxoutside */ - /* all tricoplanars share the same apex */ - /* if ->degenerate, does not span facet (one logical ridge) */ - /* one tricoplanar has ->keepcentrum and ->coplanarset */ - /* during qh_triangulate, f.trivisible points to original facet */ - flagT newfacet:1; /* True if facet on qh newfacet_list (new or merged) */ - flagT visible:1; /* True if visible facet (will be deleted) */ - flagT toporient:1; /* True if created with top orientation - after merging, use ridge orientation */ - flagT simplicial:1;/* True if simplicial facet, ->ridges may be implicit */ - flagT seen:1; /* used to perform operations only once, like visitid */ - flagT seen2:1; /* used to perform operations only once, like visitid */ - flagT flipped:1; /* True if facet is flipped */ - flagT upperdelaunay:1; /* True if facet is upper envelope of Delaunay triangulation */ - flagT notfurthest:1; /* True if last point of outsideset is not furthest*/ - -/*-------- flags primarily for output ---------*/ - flagT good:1; /* True if a facet marked good for output */ - flagT isarea:1; /* True if facet->f.area is defined */ - -/*-------- flags for merging ------------------*/ - flagT dupridge:1; /* True if duplicate ridge in facet */ - flagT mergeridge:1; /* True if facet or neighbor contains a qh_MERGEridge - ->normal defined (also defined for mergeridge2) */ - flagT mergeridge2:1; /* True if neighbor contains a qh_MERGEridge (mark_dupridges */ - flagT coplanar:1; /* True if horizon facet is coplanar at last use */ - flagT mergehorizon:1; /* True if will merge into horizon (->coplanar) */ - flagT cycledone:1;/* True if mergecycle_all already done */ - flagT tested:1; /* True if facet convexity has been tested (false after merge */ - flagT keepcentrum:1; /* True if keep old centrum after a merge, or marks owner for ->tricoplanar */ - flagT newmerge:1; /* True if facet is newly merged for reducevertices */ - flagT degenerate:1; /* True if facet is degenerate (degen_mergeset or ->tricoplanar) */ - flagT redundant:1; /* True if facet is redundant (degen_mergeset) */ -}; - - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="ridgeT">-</a> - - ridgeT - defines a ridge - - notes: - a ridge is DIM3-1 simplex between two neighboring facets. If the - facets are non-simplicial, there may be more than one ridge between - two facets. E.G. a 4-d hypercube has two triangles between each pair - of neighboring facets. - - topological information: - vertices a set of vertices - top,bottom neighboring facets with orientation - - geometric information: - tested True if ridge is clearly convex - nonconvex True if ridge is non-convex -*/ -struct ridgeT { - setT *vertices; /* vertices belonging to this ridge, inverse sorted by ID - NULL if a degen ridge (matchsame) */ - facetT *top; /* top facet this ridge is part of */ - facetT *bottom; /* bottom facet this ridge is part of */ - unsigned id:24; /* unique identifier, =>room for 8 flags */ - flagT seen:1; /* used to perform operations only once */ - flagT tested:1; /* True when ridge is tested for convexity */ - flagT nonconvex:1; /* True if getmergeset detected a non-convex neighbor - only one ridge between neighbors may have nonconvex */ -}; - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="vertexT">-</a> - - vertexT - defines a vertex - - topological information: - next,previous doubly-linked list of all vertices - neighbors set of adjacent facets (only if qh.VERTEXneighbors) - - geometric information: - point array of DIM3 coordinates -*/ -struct vertexT { - vertexT *next; /* next vertex in vertex_list */ - vertexT *previous; /* previous vertex in vertex_list */ - pointT *point; /* hull_dim coordinates (coordT) */ - setT *neighbors; /* neighboring facets of vertex, qh_vertexneighbors() - inits in io.c or after first merge */ - unsigned visitid; /* for use with qh vertex_visit */ - unsigned id:24; /* unique identifier, =>room for 8 flags */ - flagT seen:1; /* used to perform operations only once */ - flagT seen2:1; /* another seen flag */ - flagT delridge:1; /* vertex was part of a deleted ridge */ - flagT deleted:1; /* true if vertex on qh del_vertices */ - flagT newlist:1; /* true if vertex on qh newvertex_list */ -}; - -/*======= -global variables -qh ============================*/ - -/*-<a href="qh-globa.htm#TOC" - >--------------------------------</a><a name="qh">-</a> - - qh - all global variables for qhull are in qh, qhmem, and qhstat - - notes: - qhmem is defined in mem.h and qhstat is defined in stat.h - access to qh_qh is via the "qh" macro. See qh_QHpointer in user.h -*/ -typedef struct qhT qhT; -#if qh_QHpointer -#define qh qh_qh-> -extern qhT *qh_qh; /* allocated in global.c */ -#else -#define qh qh_qh. -extern qhT qh_qh; -#endif - -struct qhT { - -/*-<a href="qh-globa.htm#TOC" - >--------------------------------</a><a name="qh-const">-</a> - - qh constants - configuration flags and constants for Qhull - - notes: - The user configures Qhull by defining flags. They are - copied into qh by qh_setflags(). qh-quick.htm#options defines the flags. -*/ - boolT ALLpoints; /* true 'Qs' if search all points for initial simplex */ - boolT ANGLEmerge; /* true 'Qa' if sort potential merges by angle */ - boolT APPROXhull; /* true 'Wn' if MINoutside set */ - realT MINoutside; /* 'Wn' min. distance for an outside point */ - boolT ATinfinity; /* true 'Qz' if point num_points-1 is "at-infinity" - for improving precision in Delaunay triangulations */ - boolT AVOIDold; /* true 'Q4' if avoid old->new merges */ - boolT BESToutside; /* true 'Qf' if partition points into best outsideset */ - boolT CDDinput; /* true 'Pc' if input uses CDD format (1.0/offset first) */ - boolT CDDoutput; /* true 'PC' if print normals in CDD format (offset first) */ - boolT CHECKfrequently; /* true 'Tc' if checking frequently */ - realT premerge_cos; /* 'A-n' cos_max when pre merging */ - realT postmerge_cos; /* 'An' cos_max when post merging */ - boolT DELAUNAY; /* true 'd' if computing DELAUNAY triangulation */ - boolT DOintersections; /* true 'Gh' if print hyperplane intersections */ - int DROPdim; /* drops dim 'GDn' for 4-d -> 3-d output */ - boolT FORCEoutput; /* true 'Po' if forcing output despite degeneracies */ - int GOODpoint; /* 1+n for 'QGn', good facet if visible/not(-) from point n*/ - pointT *GOODpointp; /* the actual point */ - boolT GOODthreshold; /* true if qh lower_threshold/upper_threshold defined - false if qh SPLITthreshold */ - int GOODvertex; /* 1+n, good facet if vertex for point n */ - pointT *GOODvertexp; /* the actual point */ - boolT HALFspace; /* true 'Hn,n,n' if halfspace intersection */ - int IStracing; /* trace execution, 0=none, 1=least, 4=most, -1=events */ - int KEEParea; /* 'PAn' number of largest facets to keep */ - boolT KEEPcoplanar; /* true 'Qc' if keeping nearest facet for coplanar points */ - boolT KEEPinside; /* true 'Qi' if keeping nearest facet for inside points - set automatically if 'd Qc' */ - int KEEPmerge; /* 'PMn' number of facets to keep with most merges */ - realT KEEPminArea; /* 'PFn' minimum facet area to keep */ - realT MAXcoplanar; /* 'Un' max distance below a facet to be coplanar*/ - boolT MERGEexact; /* true 'Qx' if exact merges (coplanar, degen, dupridge, flipped) */ - boolT MERGEindependent; /* true 'Q2' if merging independent sets */ - boolT MERGING; /* true if exact-, pre- or post-merging, with angle and centrum tests */ - realT premerge_centrum; /* 'C-n' centrum_radius when pre merging. Default is round-off */ - realT postmerge_centrum; /* 'Cn' centrum_radius when post merging. Default is round-off */ - boolT MERGEvertices; /* true 'Q3' if merging redundant vertices */ - realT MINvisible; /* 'Vn' min. distance for a facet to be visible */ - boolT NOnarrow; /* true 'Q10' if no special processing for narrow distributions */ - boolT NOnearinside; /* true 'Q8' if ignore near-inside points when partitioning */ - boolT NOpremerge; /* true 'Q0' if no defaults for C-0 or Qx */ - boolT ONLYgood; /* true 'Qg' if process points with good visible or horizon facets */ - boolT ONLYmax; /* true 'Qm' if only process points that increase max_outside */ - boolT PICKfurthest; /* true 'Q9' if process furthest of furthest points*/ - boolT POSTmerge; /* true if merging after buildhull (Cn or An) */ - boolT PREmerge; /* true if merging during buildhull (C-n or A-n) */ - /* NOTE: some of these names are similar to qh_PRINT names */ - boolT PRINTcentrums; /* true 'Gc' if printing centrums */ - boolT PRINTcoplanar; /* true 'Gp' if printing coplanar points */ - int PRINTdim; /* print dimension for Geomview output */ - boolT PRINTdots; /* true 'Ga' if printing all points as dots */ - boolT PRINTgood; /* true 'Pg' if printing good facets */ - boolT PRINTinner; /* true 'Gi' if printing inner planes */ - boolT PRINTneighbors; /* true 'PG' if printing neighbors of good facets */ - boolT PRINTnoplanes; /* true 'Gn' if printing no planes */ - boolT PRINToptions1st; /* true 'FO' if printing options to stderr */ - boolT PRINTouter; /* true 'Go' if printing outer planes */ - boolT PRINTprecision; /* false 'Pp' if not reporting precision problems */ - qh_PRINT PRINTout[qh_PRINTEND]; /* list of output formats to print */ - boolT PRINTridges; /* true 'Gr' if print ridges */ - boolT PRINTspheres; /* true 'Gv' if print vertices as spheres */ - boolT PRINTstatistics; /* true 'Ts' if printing statistics to stderr */ - boolT PRINTsummary; /* true 's' if printing summary to stderr */ - boolT PRINTtransparent; /* true 'Gt' if print transparent outer ridges */ - boolT PROJECTdelaunay; /* true if DELAUNAY, no readpoints() and - need projectinput() for Delaunay in qh_init_B */ - int PROJECTinput; /* number of projected dimensions 'bn:0Bn:0' */ - boolT QUICKhelp; /* true if quick help message for degen input */ - boolT RANDOMdist; /* true if randomly change distplane and setfacetplane */ - realT RANDOMfactor; /* maximum random perturbation */ - realT RANDOMa; /* qh_randomfactor is randr * RANDOMa + RANDOMb */ - realT RANDOMb; - boolT RANDOMoutside; /* true if select a random outside point */ - int REPORTfreq; /* buildtracing reports every n facets */ - int REPORTfreq2; /* tracemerging reports every REPORTfreq/2 facets */ - int RERUN; /* 'TRn' rerun qhull n times (qh.build_cnt) */ - int ROTATErandom; /* 'QRn' seed, 0 time, >= rotate input */ - boolT SCALEinput; /* true 'Qbk' if scaling input */ - boolT SCALElast; /* true 'Qbb' if scale last coord to max prev coord */ - boolT SETroundoff; /* true 'E' if qh DISTround is predefined */ - boolT SKIPcheckmax; /* true 'Q5' if skip qh_check_maxout */ - boolT SKIPconvex; /* true 'Q6' if skip convexity testing during pre-merge */ - boolT SPLITthresholds; /* true if upper_/lower_threshold defines a region - used only for printing (not for qh ONLYgood) */ - int STOPcone; /* 'TCn' 1+n for stopping after cone for point n*/ - /* also used by qh_build_withresart for err exit*/ - int STOPpoint; /* 'TVn' 'TV-n' 1+n for stopping after/before(-) - adding point n */ - int TESTpoints; /* 'QTn' num of test points after qh.num_points. Test points always coplanar. */ - boolT TESTvneighbors; /* true 'Qv' if test vertex neighbors at end */ - int TRACElevel; /* 'Tn' conditional IStracing level */ - int TRACElastrun; /* qh.TRACElevel applies to last qh.RERUN */ - int TRACEpoint; /* 'TPn' start tracing when point n is a vertex */ - realT TRACEdist; /* 'TWn' start tracing when merge distance too big */ - int TRACEmerge; /* 'TMn' start tracing before this merge */ - boolT TRIangulate; /* true 'Qt' if triangulate non-simplicial facets */ - boolT TRInormals; /* true 'Q11' if triangulate duplicates normals (sets Qt) */ - boolT UPPERdelaunay; /* true 'Qu' if computing furthest-site Delaunay */ - boolT VERIFYoutput; /* true 'Tv' if verify output at end of qhull */ - boolT VIRTUALmemory; /* true 'Q7' if depth-first processing in buildhull */ - boolT VORONOI; /* true 'v' if computing Voronoi diagram */ - - /*--------input constants ---------*/ - realT AREAfactor; /* 1/(hull_dim-1)! for converting det's to area */ - boolT DOcheckmax; /* true if calling qh_check_maxout (qh_initqhull_globals) */ - char *feasible_string; /* feasible point 'Hn,n,n' for halfspace intersection */ - coordT *feasible_point; /* as coordinates, both malloc'd */ - boolT GETarea; /* true 'Fa', 'FA', 'FS', 'PAn', 'PFn' if compute facet area/Voronoi volume in io.c */ - boolT KEEPnearinside; /* true if near-inside points in coplanarset */ - int hull_dim; /* dimension of hull, set by initbuffers */ - int input_dim; /* dimension of input, set by initbuffers */ - int num_points; /* number of input points */ - pointT *first_point; /* array of input points, see POINTSmalloc */ - boolT POINTSmalloc; /* true if qh first_point/num_points allocated */ - pointT *input_points; /* copy of original qh.first_point for input points for qh_joggleinput */ - boolT input_malloc; /* true if qh input_points malloc'd */ - char qhull_command[256];/* command line that invoked this program */ - char rbox_command[256]; /* command line that produced the input points */ - char qhull_options[512];/* descriptive list of options */ - int qhull_optionlen; /* length of last line */ - int qhull_optionsiz; /* size of qhull_options before qh_initbuild */ - boolT VERTEXneighbors; /* true if maintaining vertex neighbors */ - boolT ZEROcentrum; /* true if 'C-0' or 'C-0 Qx'. sets ZEROall_ok */ - realT *upper_threshold; /* don't print if facet->normal[k]>=upper_threshold[k] - must set either GOODthreshold or SPLITthreshold - if Delaunay, default is 0.0 for upper envelope */ - realT *lower_threshold; /* don't print if facet->normal[k] <=lower_threshold[k] */ - realT *upper_bound; /* scale point[k] to new upper bound */ - realT *lower_bound; /* scale point[k] to new lower bound - project if both upper_ and lower_bound == 0 */ - -/*-<a href="qh-globa.htm#TOC" - >--------------------------------</a><a name="qh-prec">-</a> - - qh precision constants - precision constants for Qhull - - notes: - qh_detroundoff() computes the maximum roundoff error for distance - and other computations. It also sets default values for the - qh constants above. -*/ - realT ANGLEround; /* max round off error for angles */ - realT centrum_radius; /* max centrum radius for convexity (roundoff added) */ - realT cos_max; /* max cosine for convexity (roundoff added) */ - realT DISTround; /* max round off error for distances, 'E' overrides */ - realT MAXabs_coord; /* max absolute coordinate */ - realT MAXlastcoord; /* max last coordinate for qh_scalelast */ - realT MAXsumcoord; /* max sum of coordinates */ - realT MAXwidth; /* max rectilinear width of point coordinates */ - realT MINdenom_1; /* min. abs. value for 1/x */ - realT MINdenom; /* use divzero if denominator < MINdenom */ - realT MINdenom_1_2; /* min. abs. val for 1/x that allows normalization */ - realT MINdenom_2; /* use divzero if denominator < MINdenom_2 */ - realT MINlastcoord; /* min. last coordinate for qh_scalelast */ - boolT NARROWhull; /* set in qh_initialhull if angle < qh_MAXnarrow */ - realT *NEARzero; /* hull_dim array for near zero in gausselim */ - realT NEARinside; /* keep points for qh_check_maxout if close to facet */ - realT ONEmerge; /* max distance for merging simplicial facets */ - realT outside_err; /* application's epsilon for coplanar points - qh_check_bestdist() qh_check_points() reports error if point outside */ - realT WIDEfacet; /* size of wide facet for skipping ridge in - area computation and locking centrum */ - -/*-<a href="qh-globa.htm#TOC" - >--------------------------------</a><a name="qh-intern">-</a> - - qh internal constants - internal constants for Qhull -*/ - char qhull[sizeof("qhull")]; /* for checking ownership */ - void *old_stat; /* pointer to saved qh_qhstat, qh_save_qhull */ - jmp_buf errexit; /* exit label for qh_errexit, defined by setjmp() */ - char jmpXtra[40]; /* extra bytes in case jmp_buf is defined wrong by compiler */ - jmp_buf restartexit; /* restart label for qh_errexit, defined by setjmp() */ - char jmpXtra2[40]; /* extra bytes in case jmp_buf is defined wrong by compiler*/ - FILE *fin; /* pointer to input file, init by qh_meminit */ - FILE *fout; /* pointer to output file */ - FILE *ferr; /* pointer to error file */ - pointT *interior_point; /* center point of the initial simplex*/ - int normal_size; /* size in bytes for facet normals and point coords*/ - int center_size; /* size in bytes for Voronoi centers */ - int TEMPsize; /* size for small, temporary sets (in quick mem) */ - -/*-<a href="qh-globa.htm#TOC" - >--------------------------------</a><a name="qh-lists">-</a> - - qh facet and vertex lists - defines lists of facets, new facets, visible facets, vertices, and - new vertices. Includes counts, next ids, and trace ids. - see: - qh_resetlists() -*/ - facetT *facet_list; /* first facet */ - facetT *facet_tail; /* end of facet_list (dummy facet) */ - facetT *facet_next; /* next facet for buildhull() - previous facets do not have outside sets - NARROWhull: previous facets may have coplanar outside sets for qh_outcoplanar */ - facetT *newfacet_list; /* list of new facets to end of facet_list */ - facetT *visible_list; /* list of visible facets preceeding newfacet_list, - facet->visible set */ - int num_visible; /* current number of visible facets */ - unsigned tracefacet_id; /* set at init, then can print whenever */ - facetT *tracefacet; /* set in newfacet/mergefacet, undone in delfacet*/ - unsigned tracevertex_id; /* set at buildtracing, can print whenever */ - vertexT *tracevertex; /* set in newvertex, undone in delvertex*/ - vertexT *vertex_list; /* list of all vertices, to vertex_tail */ - vertexT *vertex_tail; /* end of vertex_list (dummy vertex) */ - vertexT *newvertex_list; /* list of vertices in newfacet_list, to vertex_tail - all vertices have 'newlist' set */ - int num_facets; /* number of facets in facet_list - includes visble faces (num_visible) */ - int num_vertices; /* number of vertices in facet_list */ - int num_outside; /* number of points in outsidesets (for tracing and RANDOMoutside) - includes coplanar outsideset points for NARROWhull/qh_outcoplanar() */ - int num_good; /* number of good facets (after findgood_all) */ - unsigned facet_id; /* ID of next, new facet from newfacet() */ - unsigned ridge_id; /* ID of next, new ridge from newridge() */ - unsigned vertex_id; /* ID of next, new vertex from newvertex() */ - -/*-<a href="qh-globa.htm#TOC" - >--------------------------------</a><a name="qh-var">-</a> - - qh global variables - defines minimum and maximum distances, next visit ids, several flags, - and other global variables. - initialize in qh_initbuild or qh_maxmin if used in qh_buildhull -*/ - unsigned long hulltime; /* ignore time to set up input and randomize */ - /* use unsigned to avoid wrap-around errors */ - boolT ALLOWrestart; /* true if qh_precision can use qh.restartexit */ - int build_cnt; /* number of calls to qh_initbuild */ - qh_CENTER CENTERtype; /* current type of facet->center, qh_CENTER */ - int furthest_id; /* pointid of furthest point, for tracing */ - facetT *GOODclosest; /* closest facet to GOODthreshold in qh_findgood */ - realT JOGGLEmax; /* set 'QJn' if randomly joggle input */ - boolT maxoutdone; /* set qh_check_maxout(), cleared by qh_addpoint() */ - realT max_outside; /* maximum distance from a point to a facet, - before roundoff, not simplicial vertices - actual outer plane is +DISTround and - computed outer plane is +2*DISTround */ - realT max_vertex; /* maximum distance (>0) from vertex to a facet, - before roundoff, due to a merge */ - realT min_vertex; /* minimum distance (<0) from vertex to a facet, - before roundoff, due to a merge - if qh.JOGGLEmax, qh_makenewplanes sets it - recomputed if qh.DOcheckmax, default -qh.DISTround */ - boolT NEWfacets; /* true while visible facets invalid due to new or merge - from makecone/attachnewfacets to deletevisible */ - boolT findbestnew; /* true if partitioning calls qh_findbestnew */ - boolT findbest_notsharp; /* true if new facets are at least 90 degrees */ - boolT NOerrexit; /* true if qh.errexit is not available */ - realT PRINTcradius; /* radius for printing centrums */ - realT PRINTradius; /* radius for printing vertex spheres and points */ - boolT POSTmerging; /* true when post merging */ - int printoutvar; /* temporary variable for qh_printbegin, etc. */ - int printoutnum; /* number of facets printed */ - boolT QHULLfinished; /* True after qhull() is finished */ - realT totarea; /* 'FA': total facet area computed by qh_getarea */ - realT totvol; /* 'FA': total volume computed by qh_getarea */ - unsigned int visit_id; /* unique ID for searching neighborhoods, */ - unsigned int vertex_visit; /* unique ID for searching vertices */ - boolT ZEROall_ok; /* True if qh_checkzero always succeeds */ - boolT WAScoplanar; /* True if qh_partitioncoplanar (qh_check_maxout) */ - -/*-<a href="qh-globa.htm#TOC" - >--------------------------------</a><a name="qh-set">-</a> - - qh global sets - defines sets for merging, initial simplex, hashing, extra input points, - and deleted vertices -*/ - setT *facet_mergeset; /* temporary set of merges to be done */ - setT *degen_mergeset; /* temporary set of degenerate and redundant merges */ - setT *hash_table; /* hash table for matching ridges in qh_matchfacets - size is setsize() */ - setT *other_points; /* additional points (first is qh interior_point) */ - setT *del_vertices; /* vertices to partition and delete with visible - facets. Have deleted set for checkfacet */ - -/*-<a href="qh-globa.htm#TOC" - >--------------------------------</a><a name="qh-buf">-</a> - - qh global buffers - defines buffers for maxtrix operations, input, and error messages -*/ - coordT *gm_matrix; /* (dim+1)Xdim matrix for geom.c */ - coordT **gm_row; /* array of gm_matrix rows */ - char* line; /* malloc'd input line of maxline+1 chars */ - int maxline; - coordT *half_space; /* malloc'd input array for halfspace (qh normal_size+coordT) */ - coordT *temp_malloc; /* malloc'd input array for points */ - -/*-<a href="qh-globa.htm#TOC" - >--------------------------------</a><a name="qh-static">-</a> - - qh static variables - defines static variables for individual functions - - notes: - do not use 'static' within a function. Multiple instances of qhull - may exist. - - do not assume zero initialization, 'QPn' may cause a restart -*/ - boolT ERREXITcalled; /* true during errexit (prevents duplicate calls */ - boolT firstcentrum; /* for qh_printcentrum */ - realT last_low; /* qh_scalelast parameters for qh_setdelaunay */ - realT last_high; - realT last_newhigh; - unsigned lastreport; /* for qh_buildtracing */ - int mergereport; /* for qh_tracemerging */ - boolT old_randomdist; /* save RANDOMdist when io, tracing, or statistics */ - int ridgeoutnum; /* number of ridges in 4OFF output */ - void *old_qhstat; /* for saving qh_qhstat in save_qhull() */ - setT *old_tempstack; /* for saving qhmem.tempstack in save_qhull */ - setT *coplanarset; /* set of coplanar facets for searching qh_findbesthorizon() */ -}; - -/*=========== -macros- =========================*/ - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="otherfacet_">-</a> - - otherfacet_(ridge, facet) - return neighboring facet for a ridge in facet -*/ -#define otherfacet_(ridge, facet) \ - (((ridge)->top == (facet)) ? (ridge)->bottom : (ridge)->top) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="getid_">-</a> - - getid_(p) - return ID for facet, ridge, or vertex - return MAXINT if NULL (-1 causes type conversion error ) -*/ -#define getid_(p) ((p) ? (p)->id : -1) - -/*============== FORALL macros ===================*/ - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FORALLfacets">-</a> - - FORALLfacets { ... } - assign 'facet' to each facet in qh.facet_list - - notes: - uses 'facetT *facet;' - assumes last facet is a sentinel - - see: - FORALLfacet_( facetlist ) -*/ -#define FORALLfacets for (facet=qh facet_list;facet && facet->next;facet=facet->next) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FORALLpoints">-</a> - - FORALLpoints { ... } - assign 'point' to each point in qh.first_point, qh.num_points - - declare: - coordT *point, *pointtemp; -*/ -#define FORALLpoints FORALLpoint_(qh first_point, qh num_points) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FORALLpoint_">-</a> - - FORALLpoint_( points, num) { ... } - assign 'point' to each point in points array of num points - - declare: - coordT *point, *pointtemp; -*/ -#define FORALLpoint_(points, num) for(point= (points), \ - pointtemp= (points)+qh hull_dim*(num); point < pointtemp; point += qh hull_dim) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FORALLvertices">-</a> - - FORALLvertices { ... } - assign 'vertex' to each vertex in qh.vertex_list - - declare: - vertexT *vertex; - - notes: - assumes qh.vertex_list terminated with a sentinel -*/ -#define FORALLvertices for (vertex=qh vertex_list;vertex && vertex->next;vertex= vertex->next) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHfacet_">-</a> - - FOREACHfacet_( facets ) { ... } - assign 'facet' to each facet in facets - - declare: - facetT *facet, **facetp; - - see: - <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a> -*/ -#define FOREACHfacet_(facets) FOREACHsetelement_(facetT, facets, facet) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHneighbor_">-</a> - - FOREACHneighbor_( facet ) { ... } - assign 'neighbor' to each neighbor in facet->neighbors - - FOREACHneighbor_( vertex ) { ... } - assign 'neighbor' to each neighbor in vertex->neighbors - - declare: - facetT *neighbor, **neighborp; - - see: - <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a> -*/ -#define FOREACHneighbor_(facet) FOREACHsetelement_(facetT, facet->neighbors, neighbor) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHpoint_">-</a> - - FOREACHpoint_( points ) { ... } - assign 'point' to each point in points set - - declare: - pointT *point, **pointp; - - see: - <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a> -*/ -#define FOREACHpoint_(points) FOREACHsetelement_(pointT, points, point) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHridge_">-</a> - - FOREACHridge_( ridges ) { ... } - assign 'ridge' to each ridge in ridges set - - declare: - ridgeT *ridge, **ridgep; - - see: - <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a> -*/ -#define FOREACHridge_(ridges) FOREACHsetelement_(ridgeT, ridges, ridge) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHvertex_">-</a> - - FOREACHvertex_( vertices ) { ... } - assign 'vertex' to each vertex in vertices set - - declare: - vertexT *vertex, **vertexp; - - see: - <a href="qset.h#FOREACHsetelement_">FOREACHsetelement_</a> -*/ -#define FOREACHvertex_(vertices) FOREACHsetelement_(vertexT, vertices,vertex) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHfacet_i_">-</a> - - FOREACHfacet_i_( facets ) { ... } - assign 'facet' and 'facet_i' for each facet in facets set - - declare: - facetT *facet; - int facet_n, facet_i; - - see: - <a href="qset.h#FOREACHsetelement_i_">FOREACHsetelement_i_</a> -*/ -#define FOREACHfacet_i_(facets) FOREACHsetelement_i_(facetT, facets, facet) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHneighbor_i_">-</a> - - FOREACHneighbor_i_( facet ) { ... } - assign 'neighbor' and 'neighbor_i' for each neighbor in facet->neighbors - - FOREACHneighbor_i_( vertex ) { ... } - assign 'neighbor' and 'neighbor_i' for each neighbor in vertex->neighbors - - declare: - facetT *neighbor; - int neighbor_n, neighbor_i; - - see: - <a href="qset.h#FOREACHsetelement_i_">FOREACHsetelement_i_</a> -*/ -#define FOREACHneighbor_i_(facet) FOREACHsetelement_i_(facetT, facet->neighbors, neighbor) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHpoint_i_">-</a> - - FOREACHpoint_i_( points ) { ... } - assign 'point' and 'point_i' for each point in points set - - declare: - pointT *point; - int point_n, point_i; - - see: - <a href="qset.h#FOREACHsetelement_i_">FOREACHsetelement_i_</a> -*/ -#define FOREACHpoint_i_(points) FOREACHsetelement_i_(pointT, points, point) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHridge_i_">-</a> - - FOREACHridge_i_( ridges ) { ... } - assign 'ridge' and 'ridge_i' for each ridge in ridges set - - declare: - ridgeT *ridge; - int ridge_n, ridge_i; - - see: - <a href="qset.h#FOREACHsetelement_i_">FOREACHsetelement_i_</a> -*/ -#define FOREACHridge_i_(ridges) FOREACHsetelement_i_(ridgeT, ridges, ridge) - -/*-<a href="qh-poly.htm#TOC" - >--------------------------------</a><a name="FOREACHvertex_i_">-</a> - - FOREACHvertex_i_( vertices ) { ... } - assign 'vertex' and 'vertex_i' for each vertex in vertices set - - declare: - vertexT *vertex; - int vertex_n, vertex_i; - - see: - <a href="qset.h#FOREACHsetelement_i_">FOREACHsetelement_i_</a> - */ -#define FOREACHvertex_i_(vertices) FOREACHsetelement_i_(vertexT, vertices,vertex) - -/********* -qhull.c prototypes (duplicated from qhull_a.h) **********************/ - -void qh_qhull (void); -boolT qh_addpoint (pointT *furthest, facetT *facet, boolT checkdist); -void qh_printsummary(FILE *fp); - -/********* -user.c prototypes (alphabetical) **********************/ - -void qh_errexit(int exitcode, facetT *facet, ridgeT *ridge); -void qh_errprint(char* string, facetT *atfacet, facetT *otherfacet, ridgeT *atridge, vertexT *atvertex); -int qh_new_qhull (int dim, int numpoints, coordT *points, boolT ismalloc, - char *qhull_cmd, FILE *outfile, FILE *errfile); -void qh_printfacetlist(facetT *facetlist, setT *facets, boolT printall); -void qh_user_memsizes (void); - -/***** -geom.c/geom2.c prototypes (duplicated from geom.h) ****************/ - -facetT *qh_findbest (pointT *point, facetT *startfacet, - boolT bestoutside, boolT newfacets, boolT noupper, - realT *dist, boolT *isoutside, int *numpart); -facetT *qh_findbestnew (pointT *point, facetT *startfacet, - realT *dist, boolT bestoutside, boolT *isoutside, int *numpart); -boolT qh_gram_schmidt(int dim, realT **rows); -void qh_outerinner (facetT *facet, realT *outerplane, realT *innerplane); -void qh_printsummary(FILE *fp); -void qh_projectinput (void); -void qh_randommatrix (realT *buffer, int dim, realT **row); -void qh_rotateinput (realT **rows); -void qh_scaleinput (void); -void qh_setdelaunay (int dim, int count, pointT *points); -coordT *qh_sethalfspace_all (int dim, int count, coordT *halfspaces, pointT *feasible); - -/***** -global.c prototypes (alphabetical) ***********************/ - -unsigned long qh_clock (void); -void qh_checkflags (char *command, char *hiddenflags); -void qh_freebuffers (void); -void qh_freeqhull (boolT allmem); -void qh_init_A (FILE *infile, FILE *outfile, FILE *errfile, int argc, char *argv[]); -void qh_init_B (coordT *points, int numpoints, int dim, boolT ismalloc); -void qh_init_qhull_command (int argc, char *argv[]); -void qh_initbuffers (coordT *points, int numpoints, int dim, boolT ismalloc); -void qh_initflags (char *command); -void qh_initqhull_buffers (void); -void qh_initqhull_globals (coordT *points, int numpoints, int dim, boolT ismalloc); -void qh_initqhull_mem (void); -void qh_initqhull_start (FILE *infile, FILE *outfile, FILE *errfile); -void qh_initthresholds (char *command); -void qh_option (char *option, int *i, realT *r); -#if qh_QHpointer -void qh_restore_qhull (qhT **oldqh); -qhT *qh_save_qhull (void); -#endif - -/***** -io.c prototypes (duplicated from io.h) ***********************/ - -void dfacet( unsigned id); -void dvertex( unsigned id); -void qh_printneighborhood (FILE *fp, int format, facetT *facetA, facetT *facetB, boolT printall); -void qh_produce_output(void); -coordT *qh_readpoints(int *numpoints, int *dimension, boolT *ismalloc); - - -/********* -mem.c prototypes (duplicated from mem.h) **********************/ - -void qh_meminit (FILE *ferr); -void qh_memfreeshort (int *curlong, int *totlong); - -/********* -poly.c/poly2.c prototypes (duplicated from poly.h) **********************/ - -void qh_check_output (void); -void qh_check_points (void); -setT *qh_facetvertices (facetT *facetlist, setT *facets, boolT allfacets); -facetT *qh_findbestfacet (pointT *point, boolT bestoutside, - realT *bestdist, boolT *isoutside); -vertexT *qh_nearvertex (facetT *facet, pointT *point, realT *bestdistp); -pointT *qh_point (int id); -setT *qh_pointfacet (void /*qh.facet_list*/); -int qh_pointid (pointT *point); -setT *qh_pointvertex (void /*qh.facet_list*/); -void qh_setvoronoi_all (void); -void qh_triangulate (void /*qh facet_list*/); - -/********* -stat.c prototypes (duplicated from stat.h) **********************/ - -void qh_collectstatistics (void); -void qh_printallstatistics (FILE *fp, char *string); - -#endif /* qhDEFqhull */ diff --git a/extern/qhull/src/qhull_a.h b/extern/qhull/src/qhull_a.h deleted file mode 100644 index d4e69b071be..00000000000 --- a/extern/qhull/src/qhull_a.h +++ /dev/null @@ -1,127 +0,0 @@ -/*<html><pre> -<a href="qh-qhull.htm" - >-------------------------------</a><a name="TOP">-</a> - - qhull_a.h - all header files for compiling qhull - - see qh-qhull.htm - - see qhull.h for user-level definitions - - see user.h for user-defineable constants - - defines internal functions for qhull.c global.c - - copyright (c) 1993-2002, The Geometry Center - - Notes: grep for ((" and (" to catch fprintf("lkasdjf"); - full parens around (x?y:z) - use '#include qhull/qhull_a.h' to avoid name clashes -*/ - -#ifndef qhDEFqhulla -#define qhDEFqhulla - -#include <stdio.h> -#include <stdlib.h> -#include <setjmp.h> -#include <string.h> -#include <math.h> -#include <float.h> /* some compilers will not need float.h */ -#include <limits.h> -#include <time.h> -#include <ctype.h> -/*** uncomment here and qset.c - if string.h does not define memcpy() -#include <memory.h> -*/ -#include "qhull.h" -#include "mem.h" -#include "qset.h" -#include "geom.h" -#include "merge.h" -#include "poly.h" -#include "io.h" -#include "stat.h" - -#if qh_CLOCKtype == 2 /* defined in user.h from qhull.h */ -#include <sys/types.h> -#include <sys/times.h> -#include <unistd.h> -#endif - -#ifdef _MSC_VER /* Microsoft Visual C++ */ -#pragma warning( disable : 4056) /* float constant expression. Looks like a compiler bug */ -#pragma warning( disable : 4146) /* unary minus applied to unsigned type */ -#pragma warning( disable : 4244) /* conversion from 'unsigned long' to 'real' */ -#pragma warning( disable : 4305) /* conversion from 'const double' to 'float' */ -#endif - -/* ======= -macros- =========== */ - -/*-<a href="qh-qhull.htm#TOC" - >--------------------------------</a><a name="traceN">-</a> - - traceN((fp.ferr, "format\n", vars)); - calls fprintf if qh.IStracing >= N - - notes: - removing tracing reduces code size but doesn't change execution speed -*/ -#ifndef qh_NOtrace -#define trace0(args) {if (qh IStracing) fprintf args;} -#define trace1(args) {if (qh IStracing >= 1) fprintf args;} -#define trace2(args) {if (qh IStracing >= 2) fprintf args;} -#define trace3(args) {if (qh IStracing >= 3) fprintf args;} -#define trace4(args) {if (qh IStracing >= 4) fprintf args;} -#define trace5(args) {if (qh IStracing >= 5) fprintf args;} -#else /* qh_NOtrace */ -#define trace0(args) {} -#define trace1(args) {} -#define trace2(args) {} -#define trace3(args) {} -#define trace4(args) {} -#define trace5(args) {} -#endif /* qh_NOtrace */ - -/***** -qhull.c prototypes (alphabetical after qhull) ********************/ - -void qh_qhull (void); -boolT qh_addpoint (pointT *furthest, facetT *facet, boolT checkdist); -void qh_buildhull(void); -void qh_buildtracing (pointT *furthest, facetT *facet); -void qh_build_withrestart (void); -void qh_errexit2(int exitcode, facetT *facet, facetT *otherfacet); -void qh_findhorizon(pointT *point, facetT *facet, int *goodvisible,int *goodhorizon); -pointT *qh_nextfurthest (facetT **visible); -void qh_partitionall(setT *vertices, pointT *points,int npoints); -void qh_partitioncoplanar (pointT *point, facetT *facet, realT *dist); -void qh_partitionpoint (pointT *point, facetT *facet); -void qh_partitionvisible(boolT allpoints, int *numpoints); -void qh_precision (char *reason); -void qh_printsummary(FILE *fp); - -/***** -global.c internal prototypes (alphabetical) ***********************/ - -void qh_appendprint (qh_PRINT format); -void qh_freebuild (boolT allmem); -void qh_freebuffers (void); -void qh_initbuffers (coordT *points, int numpoints, int dim, boolT ismalloc); -int qh_strtol (const char *s, char **endp); -double qh_strtod (const char *s, char **endp); - -/***** -stat.c internal prototypes (alphabetical) ***********************/ - -void qh_allstatA (void); -void qh_allstatB (void); -void qh_allstatC (void); -void qh_allstatD (void); -void qh_allstatE (void); -void qh_allstatE2 (void); -void qh_allstatF (void); -void qh_allstatG (void); -void qh_allstatH (void); -void qh_freebuffers (void); -void qh_initbuffers (coordT *points, int numpoints, int dim, boolT ismalloc); - -#endif /* qhDEFqhulla */ diff --git a/extern/qhull/src/qhull_interface.cpp b/extern/qhull/src/qhull_interface.cpp deleted file mode 100644 index 6ecc640e82b..00000000000 --- a/extern/qhull/src/qhull_interface.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/*<html><pre> -<a href="qh-user.htm" - >-------------------------------</a><a name="TOP">-</a> -*/ - -#include <iostream.h> -#include <conio.h> - -//--- Include qhull, so it works from with in a C++ source file -//--- -//--- In MVC one cannot just do: -//--- -//--- extern "C" -//--- { -//--- #include "qhull_a.h" -//--- } -//--- -//--- Because qhull_a.h includes math.h, which can not appear -//--- inside a extern "C" declaration. -//--- -//--- Maybe that why Numerical recipes in C avoid this problem, by removing -//--- standard include headers from its header files and add them in the -//--- respective source files instead. -//--- -//--- [K. Erleben] - -#if defined(__cplusplus) -extern "C" -{ -#endif -#include <stdio.h> -#include <stdlib.h> -#include <qhull/qhull.h> -#include <qhull/mem.h> -#include <qhull/qset.h> -#include <qhull/geom.h> -#include <qhull/merge.h> -#include <qhull/poly.h> -#include <qhull/io.h> -#include <qhull/stat.h> -#if defined(__cplusplus) -} -#endif - -/*********************************************************************/ -/* */ -/* */ -/* */ -/* */ -/*********************************************************************/ - -void compute_convex_hull(void) -{ - int dim; /* dimension of points */ - int numpoints; /* number of points */ - coordT *points; /* array of coordinates for each point */ - boolT ismalloc; /* True if qhull should free points in qh_freeqhull() or reallocation */ - char flags[]= "qhull Tv"; /* option flags for qhull, see qh_opt.htm */ - FILE *outfile= stdout; /* output from qh_produce_output() - use NULL to skip qh_produce_output() */ - FILE *errfile= stderr; /* error messages from qhull code */ - int exitcode; /* 0 if no error from qhull */ - facetT *facet; /* set by FORALLfacets */ - int curlong, totlong; /* memory remaining after qh_memfreeshort */ - - /* initialize dim, numpoints, points[], ismalloc here */ - exitcode= qh_new_qhull (dim, numpoints, points, ismalloc, - flags, outfile, errfile); - if (!exitcode) { /* if no error */ - /* 'qh facet_list' contains the convex hull */ - FORALLfacets { - /* ... your code ... */ - } - } - qh_freeqhull(!qh_ALL); - qh_memfreeshort (&curlong, &totlong); - if (curlong || totlong) - fprintf (errfile, "qhull internal warning (main): did not free %d bytes of long memory (%d pieces)\n", - totlong, curlong); -}; - -/*********************************************************************/ -/* */ -/* */ -/* */ -/* */ -/*********************************************************************/ - -void main() -{ - cout << "Hello world" << endl; - - cout << "Press any key..." << endl; - - while(!_kbhit()); - -}; diff --git a/extern/qhull/src/qset.c b/extern/qhull/src/qset.c deleted file mode 100644 index 9e78464c07e..00000000000 --- a/extern/qhull/src/qset.c +++ /dev/null @@ -1,1301 +0,0 @@ -/*<html><pre> -<a href="qh-set.htm" - >-------------------------------</a><a name="TOP">-</a> - - qset.c - implements set manipulations needed for quickhull - - see qh-set.htm and qset.h - - copyright (c) 1993-2002 The Geometry Center -*/ - -#include <stdio.h> -#include <string.h> -/*** uncomment here and qhull_a.h - if string.h does not define memcpy() -#include <memory.h> -*/ -#include "qset.h" -#include "mem.h" - -#ifndef qhDEFqhull -typedef struct ridgeT ridgeT; -typedef struct facetT facetT; -void qh_errexit(int exitcode, facetT *, ridgeT *); -#endif - -/*=============== internal macros ===========================*/ - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="SETsizeaddr_">-</a> - - SETsizeaddr_(set) - return pointer to actual size+1 of set (set CANNOT be NULL!!) - - notes: - *SETsizeaddr==NULL or e[*SETsizeaddr-1].p==NULL -*/ -#define SETsizeaddr_(set) (&((set)->e[(set)->maxsize].i)) - -/*============ functions in alphabetical order ===================*/ - -/*-<a href="qh-set.htm#TOC" - >--------------------------------<a name="setaddnth">-</a> - - qh_setaddnth( setp, nth, newelem) - adds newelem as n'th element of sorted or unsorted *setp - - notes: - *setp and newelem must be defined - *setp may be a temp set - nth=0 is first element - errors if nth is out of bounds - - design: - expand *setp if empty or full - move tail of *setp up one - insert newelem -*/ -void qh_setaddnth(setT **setp, int nth, void *newelem) { - int *sizep, oldsize, i; - void **oldp, **newp; - - if (!*setp || !*(sizep= SETsizeaddr_(*setp))) { - qh_setlarger(setp); - sizep= SETsizeaddr_(*setp); - } - oldsize= *sizep - 1; - if (nth < 0 || nth > oldsize) { - fprintf (qhmem.ferr, "qhull internal error (qh_setaddnth): nth %d is out-of-bounds for set:\n", nth); - qh_setprint (qhmem.ferr, "", *setp); - qh_errexit (qhmem_ERRqhull, NULL, NULL); - } - (*sizep)++; - oldp= SETelemaddr_(*setp, oldsize, void); /* NULL */ - newp= oldp+1; - for (i= oldsize-nth+1; i--; ) /* move at least NULL */ - *(newp--)= *(oldp--); /* may overwrite *sizep */ - *newp= newelem; -} /* setaddnth */ - - -/*-<a href="qh-set.htm#TOC" - >--------------------------------<a name="setaddsorted">-</a> - - setaddsorted( setp, newelem ) - adds an newelem into sorted *setp - - notes: - *setp and newelem must be defined - *setp may be a temp set - nop if newelem already in set - - design: - find newelem's position in *setp - insert newelem -*/ -void qh_setaddsorted(setT **setp, void *newelem) { - int newindex=0; - void *elem, **elemp; - - FOREACHelem_(*setp) { /* could use binary search instead */ - if (elem < newelem) - newindex++; - else if (elem == newelem) - return; - else - break; - } - qh_setaddnth(setp, newindex, newelem); -} /* setaddsorted */ - - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setappend">-</a> - - qh_setappend( setp, newelem) - append newelem to *setp - - notes: - *setp may be a temp set - *setp and newelem may be NULL - - design: - expand *setp if empty or full - append newelem to *setp - -*/ -void qh_setappend(setT **setp, void *newelem) { - int *sizep; - void **endp; - - if (!newelem) - return; - if (!*setp || !*(sizep= SETsizeaddr_(*setp))) { - qh_setlarger(setp); - sizep= SETsizeaddr_(*setp); - } - *(endp= &((*setp)->e[(*sizep)++ - 1].p))= newelem; - *(++endp)= NULL; -} /* setappend */ - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setappend_set">-</a> - - qh_setappend_set( setp, setA) - appends setA to *setp - - notes: - *setp can not be a temp set - *setp and setA may be NULL - - design: - setup for copy - expand *setp if it is too small - append all elements of setA to *setp -*/ -void qh_setappend_set(setT **setp, setT *setA) { - int *sizep, sizeA, size; - setT *oldset; - - if (!setA) - return; - SETreturnsize_(setA, sizeA); - if (!*setp) - *setp= qh_setnew (sizeA); - sizep= SETsizeaddr_(*setp); - if (!(size= *sizep)) - size= (*setp)->maxsize; - else - size--; - if (size + sizeA > (*setp)->maxsize) { - oldset= *setp; - *setp= qh_setcopy (oldset, sizeA); - qh_setfree (&oldset); - sizep= SETsizeaddr_(*setp); - } - *sizep= size+sizeA+1; /* memcpy may overwrite */ - if (sizeA > 0) - memcpy((char *)&((*setp)->e[size].p), (char *)&(setA->e[0].p), SETelemsize *(sizeA+1)); -} /* setappend_set */ - - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setappend2ndlast">-</a> - - qh_setappend2ndlast( setp, newelem ) - makes newelem the next to the last element in *setp - - notes: - *setp must have at least one element - newelem must be defined - *setp may be a temp set - - design: - expand *setp if empty or full - move last element of *setp up one - insert newelem -*/ -void qh_setappend2ndlast(setT **setp, void *newelem) { - int *sizep; - void **endp, **lastp; - - if (!*setp || !*(sizep= SETsizeaddr_(*setp))) { - qh_setlarger(setp); - sizep= SETsizeaddr_(*setp); - } - endp= SETelemaddr_(*setp, (*sizep)++ -1, void); /* NULL */ - lastp= endp-1; - *(endp++)= *lastp; - *endp= NULL; /* may overwrite *sizep */ - *lastp= newelem; -} /* setappend2ndlast */ - - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setcheck">-</a> - - qh_setcheck( set, typename, id ) - check set for validity - report errors with typename and id - - design: - checks that maxsize, actual size, and NULL terminator agree -*/ -void qh_setcheck(setT *set, char *tname, int id) { - int maxsize, size; - int waserr= 0; - - if (!set) - return; - SETreturnsize_(set, size); - maxsize= set->maxsize; - if (size > maxsize || !maxsize) { - fprintf (qhmem.ferr, "qhull internal error (qh_setcheck): actual size %d of %s%d is greater than max size %d\n", - size, tname, id, maxsize); - waserr= 1; - }else if (set->e[size].p) { - fprintf (qhmem.ferr, "qhull internal error (qh_setcheck): %s%d (size %d max %d) is not null terminated.\n", - tname, id, maxsize, size-1); - waserr= 1; - } - if (waserr) { - qh_setprint (qhmem.ferr, "ERRONEOUS", set); - qh_errexit (qhmem_ERRqhull, NULL, NULL); - } -} /* setcheck */ - - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setcompact">-</a> - - qh_setcompact( set ) - remove internal NULLs from an unsorted set - - returns: - updated set - - notes: - set may be NULL - it would be faster to swap tail of set into holes, like qh_setdel - - design: - setup pointers into set - skip NULLs while copying elements to start of set - update the actual size -*/ -void qh_setcompact(setT *set) { - int size; - void **destp, **elemp, **endp, **firstp; - - if (!set) - return; - SETreturnsize_(set, size); - destp= elemp= firstp= SETaddr_(set, void); - endp= destp + size; - while (1) { - if (!(*destp++ = *elemp++)) { - destp--; - if (elemp > endp) - break; - } - } - qh_settruncate (set, destp-firstp); -} /* setcompact */ - - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setcopy">-</a> - - qh_setcopy( set, extra ) - make a copy of a sorted or unsorted set with extra slots - - returns: - new set - - design: - create a newset with extra slots - copy the elements to the newset - -*/ -setT *qh_setcopy(setT *set, int extra) { - setT *newset; - int size; - - if (extra < 0) - extra= 0; - SETreturnsize_(set, size); - newset= qh_setnew(size+extra); - *SETsizeaddr_(newset)= size+1; /* memcpy may overwrite */ - memcpy((char *)&(newset->e[0].p), (char *)&(set->e[0].p), SETelemsize *(size+1)); - return (newset); -} /* setcopy */ - - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setdel">-</a> - - qh_setdel( set, oldelem ) - delete oldelem from an unsorted set - - returns: - returns oldelem if found - returns NULL otherwise - - notes: - set may be NULL - oldelem must not be NULL; - only deletes one copy of oldelem in set - - design: - locate oldelem - update actual size if it was full - move the last element to the oldelem's location -*/ -void *qh_setdel(setT *set, void *oldelem) { - void **elemp, **lastp; - int *sizep; - - if (!set) - return NULL; - elemp= SETaddr_(set, void); - while (*elemp != oldelem && *elemp) - elemp++; - if (*elemp) { - sizep= SETsizeaddr_(set); - if (!(*sizep)--) /* if was a full set */ - *sizep= set->maxsize; /* *sizep= (maxsize-1)+ 1 */ - lastp= SETelemaddr_(set, *sizep-1, void); - *elemp= *lastp; /* may overwrite itself */ - *lastp= NULL; - return oldelem; - } - return NULL; -} /* setdel */ - - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setdellast">-</a> - - qh_setdellast( set) - return last element of set or NULL - - notes: - deletes element from set - set may be NULL - - design: - return NULL if empty - if full set - delete last element and set actual size - else - delete last element and update actual size -*/ -void *qh_setdellast(setT *set) { - int setsize; /* actually, actual_size + 1 */ - int maxsize; - int *sizep; - void *returnvalue; - - if (!set || !(set->e[0].p)) - return NULL; - sizep= SETsizeaddr_(set); - if ((setsize= *sizep)) { - returnvalue= set->e[setsize - 2].p; - set->e[setsize - 2].p= NULL; - (*sizep)--; - }else { - maxsize= set->maxsize; - returnvalue= set->e[maxsize - 1].p; - set->e[maxsize - 1].p= NULL; - *sizep= maxsize; - } - return returnvalue; -} /* setdellast */ - - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setdelnth">-</a> - - qh_setdelnth( set, nth ) - deletes nth element from unsorted set - 0 is first element - - returns: - returns the element (needs type conversion) - - notes: - errors if nth invalid - - design: - setup points and check nth - delete nth element and overwrite with last element -*/ -void *qh_setdelnth(setT *set, int nth) { - void **elemp, **lastp, *elem; - int *sizep; - - - elemp= SETelemaddr_(set, nth, void); - sizep= SETsizeaddr_(set); - if (!(*sizep)--) /* if was a full set */ - *sizep= set->maxsize; /* *sizep= (maxsize-1)+ 1 */ - if (nth < 0 || nth >= *sizep) { - fprintf (qhmem.ferr, "qhull internal error (qh_setaddnth): nth %d is out-of-bounds for set:\n", nth); - qh_setprint (qhmem.ferr, "", set); - qh_errexit (qhmem_ERRqhull, NULL, NULL); - } - lastp= SETelemaddr_(set, *sizep-1, void); - elem= *elemp; - *elemp= *lastp; /* may overwrite itself */ - *lastp= NULL; - return elem; -} /* setdelnth */ - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setdelnthsorted">-</a> - - qh_setdelnthsorted( set, nth ) - deletes nth element from sorted set - - returns: - returns the element (use type conversion) - - notes: - errors if nth invalid - - see also: - setnew_delnthsorted - - design: - setup points and check nth - copy remaining elements down one - update actual size -*/ -void *qh_setdelnthsorted(setT *set, int nth) { - void **newp, **oldp, *elem; - int *sizep; - - sizep= SETsizeaddr_(set); - if (nth < 0 || (*sizep && nth >= *sizep-1) || nth >= set->maxsize) { - fprintf (qhmem.ferr, "qhull internal error (qh_setaddnth): nth %d is out-of-bounds for set:\n", nth); - qh_setprint (qhmem.ferr, "", set); - qh_errexit (qhmem_ERRqhull, NULL, NULL); - } - newp= SETelemaddr_(set, nth, void); - elem= *newp; - oldp= newp+1; - while ((*(newp++)= *(oldp++))) - ; /* copy remaining elements and NULL */ - if (!(*sizep)--) /* if was a full set */ - *sizep= set->maxsize; /* *sizep= (max size-1)+ 1 */ - return elem; -} /* setdelnthsorted */ - - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setdelsorted">-</a> - - qh_setdelsorted( set, oldelem ) - deletes oldelem from sorted set - - returns: - returns oldelem if it was deleted - - notes: - set may be NULL - - design: - locate oldelem in set - copy remaining elements down one - update actual size -*/ -void *qh_setdelsorted(setT *set, void *oldelem) { - void **newp, **oldp; - int *sizep; - - if (!set) - return NULL; - newp= SETaddr_(set, void); - while(*newp != oldelem && *newp) - newp++; - if (*newp) { - oldp= newp+1; - while ((*(newp++)= *(oldp++))) - ; /* copy remaining elements */ - sizep= SETsizeaddr_(set); - if (!(*sizep)--) /* if was a full set */ - *sizep= set->maxsize; /* *sizep= (max size-1)+ 1 */ - return oldelem; - } - return NULL; -} /* setdelsorted */ - - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setduplicate">-</a> - - qh_setduplicate( set, elemsize ) - duplicate a set of elemsize elements - - notes: - use setcopy if retaining old elements - - design: - create a new set - for each elem of the old set - create a newelem - append newelem to newset -*/ -setT *qh_setduplicate (setT *set, int elemsize) { - void *elem, **elemp, *newElem; - setT *newSet; - int size; - - if (!(size= qh_setsize (set))) - return NULL; - newSet= qh_setnew (size); - FOREACHelem_(set) { - newElem= qh_memalloc (elemsize); - memcpy (newElem, elem, elemsize); - qh_setappend (&newSet, newElem); - } - return newSet; -} /* setduplicate */ - - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setequal">-</a> - - qh_setequal( ) - returns 1 if two sorted sets are equal, otherwise returns 0 - - notes: - either set may be NULL - - design: - check size of each set - setup pointers - compare elements of each set -*/ -int qh_setequal(setT *setA, setT *setB) { - void **elemAp, **elemBp; - int sizeA, sizeB; - - SETreturnsize_(setA, sizeA); - SETreturnsize_(setB, sizeB); - if (sizeA != sizeB) - return 0; - if (!sizeA) - return 1; - elemAp= SETaddr_(setA, void); - elemBp= SETaddr_(setB, void); - if (!memcmp((char *)elemAp, (char *)elemBp, sizeA*SETelemsize)) - return 1; - return 0; -} /* setequal */ - - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setequal_except">-</a> - - qh_setequal_except( setA, skipelemA, setB, skipelemB ) - returns 1 if sorted setA and setB are equal except for skipelemA & B - - returns: - false if either skipelemA or skipelemB are missing - - notes: - neither set may be NULL - - if skipelemB is NULL, - can skip any one element of setB - - design: - setup pointers - search for skipelemA, skipelemB, and mismatches - check results -*/ -int qh_setequal_except (setT *setA, void *skipelemA, setT *setB, void *skipelemB) { - void **elemA, **elemB; - int skip=0; - - elemA= SETaddr_(setA, void); - elemB= SETaddr_(setB, void); - while (1) { - if (*elemA == skipelemA) { - skip++; - elemA++; - } - if (skipelemB) { - if (*elemB == skipelemB) { - skip++; - elemB++; - } - }else if (*elemA != *elemB) { - skip++; - if (!(skipelemB= *elemB++)) - return 0; - } - if (!*elemA) - break; - if (*elemA++ != *elemB++) - return 0; - } - if (skip != 2 || *elemB) - return 0; - return 1; -} /* setequal_except */ - - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setequal_skip">-</a> - - qh_setequal_skip( setA, skipA, setB, skipB ) - returns 1 if sorted setA and setB are equal except for elements skipA & B - - returns: - false if different size - - notes: - neither set may be NULL - - design: - setup pointers - search for mismatches while skipping skipA and skipB -*/ -int qh_setequal_skip (setT *setA, int skipA, setT *setB, int skipB) { - void **elemA, **elemB, **skipAp, **skipBp; - - elemA= SETaddr_(setA, void); - elemB= SETaddr_(setB, void); - skipAp= SETelemaddr_(setA, skipA, void); - skipBp= SETelemaddr_(setB, skipB, void); - while (1) { - if (elemA == skipAp) - elemA++; - if (elemB == skipBp) - elemB++; - if (!*elemA) - break; - if (*elemA++ != *elemB++) - return 0; - } - if (*elemB) - return 0; - return 1; -} /* setequal_skip */ - - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setfree">-</a> - - qh_setfree( setp ) - frees the space occupied by a sorted or unsorted set - - returns: - sets setp to NULL - - notes: - set may be NULL - - design: - free array - free set -*/ -void qh_setfree(setT **setp) { - int size; - void **freelistp; /* used !qh_NOmem */ - - if (*setp) { - size= sizeof(setT) + ((*setp)->maxsize)*SETelemsize; - if (size <= qhmem.LASTsize) { - qh_memfree_(*setp, size, freelistp); - }else - qh_memfree (*setp, size); - *setp= NULL; - } -} /* setfree */ - - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setfree2">-</a> - - qh_setfree2( setp, elemsize ) - frees the space occupied by a set and its elements - - notes: - set may be NULL - - design: - free each element - free set -*/ -void qh_setfree2 (setT **setp, int elemsize) { - void *elem, **elemp; - - FOREACHelem_(*setp) - qh_memfree (elem, elemsize); - qh_setfree (setp); -} /* setfree2 */ - - - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setfreelong">-</a> - - qh_setfreelong( setp ) - frees a set only if it's in long memory - - returns: - sets setp to NULL if it is freed - - notes: - set may be NULL - - design: - if set is large - free it -*/ -void qh_setfreelong(setT **setp) { - int size; - - if (*setp) { - size= sizeof(setT) + ((*setp)->maxsize)*SETelemsize; - if (size > qhmem.LASTsize) { - qh_memfree (*setp, size); - *setp= NULL; - } - } -} /* setfreelong */ - - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setin">-</a> - - qh_setin( set, setelem ) - returns 1 if setelem is in a set, 0 otherwise - - notes: - set may be NULL or unsorted - - design: - scans set for setelem -*/ -int qh_setin(setT *set, void *setelem) { - void *elem, **elemp; - - FOREACHelem_(set) { - if (elem == setelem) - return 1; - } - return 0; -} /* setin */ - - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setindex">-</a> - - qh_setindex( set, atelem ) - returns the index of atelem in set. - returns -1, if not in set or maxsize wrong - - notes: - set may be NULL and may contain nulls. - - design: - checks maxsize - scans set for atelem -*/ -int qh_setindex(setT *set, void *atelem) { - void **elem; - int size, i; - - SETreturnsize_(set, size); - if (size > set->maxsize) - return -1; - elem= SETaddr_(set, void); - for (i=0; i < size; i++) { - if (*elem++ == atelem) - return i; - } - return -1; -} /* setindex */ - - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setlarger">-</a> - - qh_setlarger( oldsetp ) - returns a larger set that contains all elements of *oldsetp - - notes: - the set is at least twice as large - if temp set, updates qhmem.tempstack - - design: - creates a new set - copies the old set to the new set - updates pointers in tempstack - deletes the old set -*/ -void qh_setlarger(setT **oldsetp) { - int size= 1, *sizep; - setT *newset, *set, **setp, *oldset; - void **oldp, **newp; - - if (*oldsetp) { - oldset= *oldsetp; - SETreturnsize_(oldset, size); - qhmem.cntlarger++; - qhmem.totlarger += size+1; - newset= qh_setnew(2 * size); - oldp= SETaddr_(oldset, void); - newp= SETaddr_(newset, void); - memcpy((char *)newp, (char *)oldp, (size+1) * SETelemsize); - sizep= SETsizeaddr_(newset); - *sizep= size+1; - FOREACHset_((setT *)qhmem.tempstack) { - if (set == oldset) - *(setp-1)= newset; - } - qh_setfree(oldsetp); - }else - newset= qh_setnew(3); - *oldsetp= newset; -} /* setlarger */ - - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setlast">-</a> - - qh_setlast( ) - return last element of set or NULL (use type conversion) - - notes: - set may be NULL - - design: - return last element -*/ -void *qh_setlast(setT *set) { - int size; - - if (set) { - size= *SETsizeaddr_(set); - if (!size) - return SETelem_(set, set->maxsize - 1); - else if (size > 1) - return SETelem_(set, size - 2); - } - return NULL; -} /* setlast */ - - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setnew">-</a> - - qh_setnew( setsize ) - creates and allocates space for a set - - notes: - setsize means the number of elements (NOT including the NULL terminator) - use qh_settemp/qh_setfreetemp if set is temporary - - design: - allocate memory for set - roundup memory if small set - initialize as empty set -*/ -setT *qh_setnew(int setsize) { - setT *set; - int sizereceived; /* used !qh_NOmem */ - int size; - void **freelistp; /* used !qh_NOmem */ - - if (!setsize) - setsize++; - size= sizeof(setT) + setsize * SETelemsize; - if ((unsigned) size <= (unsigned) qhmem.LASTsize) { - qh_memalloc_(size, freelistp, set, setT); -#ifndef qh_NOmem - sizereceived= qhmem.sizetable[ qhmem.indextable[size]]; - if (sizereceived > size) - setsize += (sizereceived - size)/SETelemsize; -#endif - }else - set= (setT*)qh_memalloc (size); - set->maxsize= setsize; - set->e[setsize].i= 1; - set->e[0].p= NULL; - return (set); -} /* setnew */ - - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setnew_delnthsorted">-</a> - - qh_setnew_delnthsorted( set, size, nth, prepend ) - creates a sorted set not containing nth element - if prepend, the first prepend elements are undefined - - notes: - set must be defined - checks nth - see also: setdelnthsorted - - design: - create new set - setup pointers and allocate room for prepend'ed entries - append head of old set to new set - append tail of old set to new set -*/ -setT *qh_setnew_delnthsorted(setT *set, int size, int nth, int prepend) { - setT *newset; - void **oldp, **newp; - int tailsize= size - nth -1, newsize; - - if (tailsize < 0) { - fprintf (qhmem.ferr, "qhull internal error (qh_setaddnth): nth %d is out-of-bounds for set:\n", nth); - qh_setprint (qhmem.ferr, "", set); - qh_errexit (qhmem_ERRqhull, NULL, NULL); - } - newsize= size-1 + prepend; - newset= qh_setnew(newsize); - newset->e[newset->maxsize].i= newsize+1; /* may be overwritten */ - oldp= SETaddr_(set, void); - newp= SETaddr_(newset, void) + prepend; - switch (nth) { - case 0: - break; - case 1: - *(newp++)= *oldp++; - break; - case 2: - *(newp++)= *oldp++; - *(newp++)= *oldp++; - break; - case 3: - *(newp++)= *oldp++; - *(newp++)= *oldp++; - *(newp++)= *oldp++; - break; - case 4: - *(newp++)= *oldp++; - *(newp++)= *oldp++; - *(newp++)= *oldp++; - *(newp++)= *oldp++; - break; - default: - memcpy((char *)newp, (char *)oldp, nth * SETelemsize); - newp += nth; - oldp += nth; - break; - } - oldp++; - switch (tailsize) { - case 0: - break; - case 1: - *(newp++)= *oldp++; - break; - case 2: - *(newp++)= *oldp++; - *(newp++)= *oldp++; - break; - case 3: - *(newp++)= *oldp++; - *(newp++)= *oldp++; - *(newp++)= *oldp++; - break; - case 4: - *(newp++)= *oldp++; - *(newp++)= *oldp++; - *(newp++)= *oldp++; - *(newp++)= *oldp++; - break; - default: - memcpy((char *)newp, (char *)oldp, tailsize * SETelemsize); - newp += tailsize; - } - *newp= NULL; - return(newset); -} /* setnew_delnthsorted */ - - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setprint">-</a> - - qh_setprint( fp, string, set ) - print set elements to fp with identifying string - - notes: - never errors -*/ -void qh_setprint(FILE *fp, char* string, setT *set) { - int size, k; - - if (!set) - fprintf (fp, "%s set is null\n", string); - else { - SETreturnsize_(set, size); - fprintf (fp, "%s set=%p maxsize=%d size=%d elems=", - string, set, set->maxsize, size); - if (size > set->maxsize) - size= set->maxsize+1; - for (k=0; k < size; k++) - fprintf(fp, " %p", set->e[k].p); - fprintf(fp, "\n"); - } -} /* setprint */ - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setreplace">-</a> - - qh_setreplace( set, oldelem, newelem ) - replaces oldelem in set with newelem - - notes: - errors if oldelem not in the set - newelem may be NULL, but it turns the set into an indexed set (no FOREACH) - - design: - find oldelem - replace with newelem -*/ -void qh_setreplace(setT *set, void *oldelem, void *newelem) { - void **elemp; - - elemp= SETaddr_(set, void); - while(*elemp != oldelem && *elemp) - elemp++; - if (*elemp) - *elemp= newelem; - else { - fprintf (qhmem.ferr, "qhull internal error (qh_setreplace): elem %p not found in set\n", - oldelem); - qh_setprint (qhmem.ferr, "", set); - qh_errexit (qhmem_ERRqhull, NULL, NULL); - } -} /* setreplace */ - - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setsize">-</a> - - qh_setsize( set ) - returns the size of a set - - notes: - errors if set's maxsize is incorrect - same as SETreturnsize_(set) - - design: - determine actual size of set from maxsize -*/ -int qh_setsize(setT *set) { - int size, *sizep; - - if (!set) - return (0); - sizep= SETsizeaddr_(set); - if ((size= *sizep)) { - size--; - if (size > set->maxsize) { - fprintf (qhmem.ferr, "qhull internal error (qh_setsize): current set size %d is greater than maximum size %d\n", - size, set->maxsize); - qh_setprint (qhmem.ferr, "set: ", set); - qh_errexit (qhmem_ERRqhull, NULL, NULL); - } - }else - size= set->maxsize; - return size; -} /* setsize */ - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="settemp">-</a> - - qh_settemp( setsize ) - return a stacked, temporary set of upto setsize elements - - notes: - use settempfree or settempfree_all to release from qhmem.tempstack - see also qh_setnew - - design: - allocate set - append to qhmem.tempstack - -*/ -setT *qh_settemp(int setsize) { - setT *newset; - - newset= qh_setnew (setsize); - qh_setappend ((setT **)&qhmem.tempstack, newset); - if (qhmem.IStracing >= 5) - fprintf (qhmem.ferr, "qh_settemp: temp set %p of %d elements, depth %d\n", - newset, newset->maxsize, qh_setsize ((setT*)qhmem.tempstack)); - return newset; -} /* settemp */ - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="settempfree">-</a> - - qh_settempfree( set ) - free temporary set at top of qhmem.tempstack - - notes: - nop if set is NULL - errors if set not from previous qh_settemp - - to locate errors: - use 'T2' to find source and then find mis-matching qh_settemp - - design: - check top of qhmem.tempstack - free it -*/ -void qh_settempfree(setT **set) { - setT *stackedset; - - if (!*set) - return; - stackedset= qh_settemppop (); - if (stackedset != *set) { - qh_settemppush(stackedset); - fprintf (qhmem.ferr, "qhull internal error (qh_settempfree): set %p (size %d) was not last temporary allocated (depth %d, set %p, size %d)\n", - *set, qh_setsize(*set), qh_setsize((setT*)qhmem.tempstack)+1, - stackedset, qh_setsize(stackedset)); - qh_errexit (qhmem_ERRqhull, NULL, NULL); - } - qh_setfree (set); -} /* settempfree */ - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="settempfree_all">-</a> - - qh_settempfree_all( ) - free all temporary sets in qhmem.tempstack - - design: - for each set in tempstack - free set - free qhmem.tempstack -*/ -void qh_settempfree_all(void) { - setT *set, **setp; - - FOREACHset_((setT *)qhmem.tempstack) - qh_setfree(&set); - qh_setfree((setT **)&qhmem.tempstack); -} /* settempfree_all */ - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="settemppop">-</a> - - qh_settemppop( ) - pop and return temporary set from qhmem.tempstack - - notes: - the returned set is permanent - - design: - pop and check top of qhmem.tempstack -*/ -setT *qh_settemppop(void) { - setT *stackedset; - - stackedset= (setT*)qh_setdellast((setT *)qhmem.tempstack); - if (!stackedset) { - fprintf (qhmem.ferr, "qhull internal error (qh_settemppop): pop from empty temporary stack\n"); - qh_errexit (qhmem_ERRqhull, NULL, NULL); - } - if (qhmem.IStracing >= 5) - fprintf (qhmem.ferr, "qh_settemppop: depth %d temp set %p of %d elements\n", - qh_setsize((setT*)qhmem.tempstack)+1, stackedset, qh_setsize(stackedset)); - return stackedset; -} /* settemppop */ - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="settemppush">-</a> - - qh_settemppush( set ) - push temporary set unto qhmem.tempstack (makes it temporary) - - notes: - duplicates settemp() for tracing - - design: - append set to tempstack -*/ -void qh_settemppush(setT *set) { - - qh_setappend ((setT**)&qhmem.tempstack, set); - if (qhmem.IStracing >= 5) - fprintf (qhmem.ferr, "qh_settemppush: depth %d temp set %p of %d elements\n", - qh_setsize((setT*)qhmem.tempstack), set, qh_setsize(set)); -} /* settemppush */ - - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="settruncate">-</a> - - qh_settruncate( set, size ) - truncate set to size elements - - notes: - set must be defined - - see: - SETtruncate_ - - design: - check size - update actual size of set -*/ -void qh_settruncate (setT *set, int size) { - - if (size < 0 || size > set->maxsize) { - fprintf (qhmem.ferr, "qhull internal error (qh_settruncate): size %d out of bounds for set:\n", size); - qh_setprint (qhmem.ferr, "", set); - qh_errexit (qhmem_ERRqhull, NULL, NULL); - } - set->e[set->maxsize].i= size+1; /* maybe overwritten */ - set->e[size].p= NULL; -} /* settruncate */ - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setunique">-</a> - - qh_setunique( set, elem ) - add elem to unsorted set unless it is already in set - - notes: - returns 1 if it is appended - - design: - if elem not in set - append elem to set -*/ -int qh_setunique (setT **set, void *elem) { - - if (!qh_setin (*set, elem)) { - qh_setappend (set, elem); - return 1; - } - return 0; -} /* setunique */ - -/*-<a href="qh-set.htm#TOC" - >-------------------------------<a name="setzero">-</a> - - qh_setzero( set, index, size ) - zero elements from index on - set actual size of set to size - - notes: - set must be defined - the set becomes an indexed set (can not use FOREACH...) - - see also: - qh_settruncate - - design: - check index and size - update actual size - zero elements starting at e[index] -*/ -void qh_setzero (setT *set, int index, int size) { - int count; - - if (index < 0 || index >= size || size > set->maxsize) { - fprintf (qhmem.ferr, "qhull internal error (qh_setzero): index %d or size %d out of bounds for set:\n", index, size); - qh_setprint (qhmem.ferr, "", set); - qh_errexit (qhmem_ERRqhull, NULL, NULL); - } - set->e[set->maxsize].i= size+1; /* may be overwritten */ - count= size - index + 1; /* +1 for NULL terminator */ - memset ((char *)SETelemaddr_(set, index, void), 0, count * SETelemsize); -} /* setzero */ - - diff --git a/extern/qhull/src/qset.h b/extern/qhull/src/qset.h deleted file mode 100644 index 6c0ff758de4..00000000000 --- a/extern/qhull/src/qset.h +++ /dev/null @@ -1,468 +0,0 @@ -/*<html><pre> -<a href="qh-set.htm" - >-------------------------------</a><a name="TOP">-</a> - - qset.h - header file for qset.c that implements set - - see qh-set.htm and qset.c - - only uses mem.c, malloc/free - - for error handling, writes message and calls - qh_errexit (qhmem_ERRqhull, NULL, NULL); - - set operations satisfy the following properties: - - sets have a max size, the actual size (if different) is stored at the end - - every set is NULL terminated - - sets may be sorted or unsorted, the caller must distinguish this - - copyright (c) 1993-2002, The Geometry Center -*/ - -#ifndef qhDEFset -#define qhDEFset 1 - -/*================= -structures- ===============*/ - -#ifndef DEFsetT -#define DEFsetT 1 -typedef struct setT setT; /* a set is a sorted or unsorted array of pointers */ -#endif - -/*-<a href="qh-set.htm#TOC" ->----------------------------------------</a><a name="setT">-</a> - -setT - a set or list of pointers with maximum size and actual size. - -variations: - unsorted, unique -- a list of unique pointers with NULL terminator - user guarantees uniqueness - sorted -- a sorted list of unique pointers with NULL terminator - qset.c guarantees uniqueness - unsorted -- a list of pointers terminated with NULL - indexed -- an array of pointers with NULL elements - -structure for set of n elements: - - -------------- - | maxsize - -------------- - | e[0] - a pointer, may be NULL for indexed sets - -------------- - | e[1] - - -------------- - | ... - -------------- - | e[n-1] - -------------- - | e[n] = NULL - -------------- - | ... - -------------- - | e[maxsize] - n+1 or NULL (determines actual size of set) - -------------- - -*/ - -/*-- setelemT -- internal type to allow both pointers and indices -*/ -typedef union setelemT setelemT; -union setelemT { - void *p; - int i; /* integer used for e[maxSize] */ -}; - -struct setT { - int maxsize; /* maximum number of elements (except NULL) */ - setelemT e[1]; /* array of pointers, tail is NULL */ - /* last slot (unless NULL) is actual size+1 - e[maxsize]==NULL or e[e[maxsize]-1]==NULL */ - /* this may generate a warning since e[] contains - maxsize elements */ -}; - -/*=========== -constants- =========================*/ - -/*-<a href="qh-set.htm#TOC" - >-----------------------------------</a><a name="SETelemsize">-</a> - - SETelemsize - size of a set element in bytes -*/ -#define SETelemsize sizeof(setelemT) - - -/*=========== -macros- =========================*/ - -/*-<a href="qh-set.htm#TOC" - >-----------------------------------</a><a name="FOREACHsetelement_">-</a> - - FOREACHsetelement_(type, set, variable) - define FOREACH iterator - - declare: - assumes *variable and **variablep are declared - no space in "variable)" [DEC Alpha cc compiler] - - each iteration: - variable is set element - variablep is one beyond variable. - - to repeat an element: - variablep--; / *repeat* / - - at exit: - variable is NULL at end of loop - - example: - #define FOREACHfacet_( facets ) FOREACHsetelement_( facetT, facets, facet ) - - notes: - use FOREACHsetelement_i_() if need index or include NULLs - - WARNING: - nested loops can't use the same variable (define another FOREACH) - - needs braces if nested inside another FOREACH - this includes intervening blocks, e.g. FOREACH...{ if () FOREACH...} ) -*/ -#define FOREACHsetelement_(type, set, variable) \ - if (((variable= NULL), set)) for(\ - variable##p= (type **)&((set)->e[0].p); \ - (variable= *variable##p++);) - -/*-<a href="qh-set.htm#TOC" - >----------------------------------------</a><a name="FOREACHsetelement_i_">-</a> - - FOREACHsetelement_i_(type, set, variable) - define indexed FOREACH iterator - - declare: - type *variable, variable_n, variable_i; - - each iteration: - variable is set element, may be NULL - variable_i is index, variable_n is qh_setsize() - - to repeat an element: - variable_i--; variable_n-- repeats for deleted element - - at exit: - variable==NULL and variable_i==variable_n - - example: - #define FOREACHfacet_i_( facets ) FOREACHsetelement_i_( facetT, facets, facet ) - - WARNING: - nested loops can't use the same variable (define another FOREACH) - - needs braces if nested inside another FOREACH - this includes intervening blocks, e.g. FOREACH...{ if () FOREACH...} ) -*/ -#define FOREACHsetelement_i_(type, set, variable) \ - if (((variable= NULL), set)) for (\ - variable##_i= 0, variable= (type *)((set)->e[0].p), \ - variable##_n= qh_setsize(set);\ - variable##_i < variable##_n;\ - variable= (type *)((set)->e[++variable##_i].p) ) - -/*-<a href="qh-set.htm#TOC" - >--------------------------------------</a><a name="FOREACHsetelementreverse_">-</a> - - FOREACHsetelementreverse_(type, set, variable)- - define FOREACH iterator in reverse order - - declare: - assumes *variable and **variablep are declared - also declare 'int variabletemp' - - each iteration: - variable is set element - - to repeat an element: - variabletemp++; / *repeat* / - - at exit: - variable is NULL - - example: - #define FOREACHvertexreverse_( vertices ) FOREACHsetelementreverse_( vertexT, vertices, vertex ) - - notes: - use FOREACHsetelementreverse12_() to reverse first two elements - WARNING: needs braces if nested inside another FOREACH -*/ -#define FOREACHsetelementreverse_(type, set, variable) \ - if (((variable= NULL), set)) for(\ - variable##temp= qh_setsize(set)-1, variable= qh_setlast(set);\ - variable; variable= \ - ((--variable##temp >= 0) ? SETelemt_(set, variable##temp, type) : NULL)) - -/*-<a href="qh-set.htm#TOC" - >-----------------------------------</a><a name="FOREACHsetelementreverse12_">-</a> - - FOREACHsetelementreverse12_(type, set, variable)- - define FOREACH iterator with e[1] and e[0] reversed - - declare: - assumes *variable and **variablep are declared - - each iteration: - variable is set element - variablep is one after variable. - - to repeat an element: - variablep--; / *repeat* / - - at exit: - variable is NULL at end of loop - - example - #define FOREACHvertexreverse12_( vertices ) FOREACHsetelementreverse12_( vertexT, vertices, vertex ) - - notes: - WARNING: needs braces if nested inside another FOREACH -*/ -#define FOREACHsetelementreverse12_(type, set, variable) \ - if (((variable= NULL), set)) for(\ - variable##p= (type **)&((set)->e[1].p); \ - (variable= *variable##p); \ - variable##p == ((type **)&((set)->e[0].p))?variable##p += 2: \ - (variable##p == ((type **)&((set)->e[1].p))?variable##p--:variable##p++)) - -/*-<a href="qh-set.htm#TOC" - >-----------------------------------</a><a name="FOREACHelem_">-</a> - - FOREACHelem_( set )- - iterate elements in a set - - declare: - void *elem, *elemp; - - each iteration: - elem is set element - elemp is one beyond - - to repeat an element: - elemp--; / *repeat* / - - at exit: - elem == NULL at end of loop - - example: - FOREACHelem_(set) { - - notes: - WARNING: needs braces if nested inside another FOREACH -*/ -#define FOREACHelem_(set) FOREACHsetelement_(void, set, elem) - -/*-<a href="qh-set.htm#TOC" - >-----------------------------------</a><a name="FOREACHset_">-</a> - - FOREACHset_( set )- - iterate a set of sets - - declare: - setT *set, **setp; - - each iteration: - set is set element - setp is one beyond - - to repeat an element: - setp--; / *repeat* / - - at exit: - set == NULL at end of loop - - example - FOREACHset_(sets) { - - notes: - WARNING: needs braces if nested inside another FOREACH -*/ -#define FOREACHset_(sets) FOREACHsetelement_(setT, sets, set) - -/*-<a href="qh-set.htm#TOC" - >-----------------------------------------</a><a name="SETindex_">-</a> - - SETindex_( set, elem ) - return index of elem in set - - notes: - for use with FOREACH iteration - - example: - i= SETindex_(ridges, ridge) -*/ -#define SETindex_(set, elem) ((void **)elem##p - (void **)&(set)->e[1].p) - -/*-<a href="qh-set.htm#TOC" - >---------------------------------------</a><a name="SETref_">-</a> - - SETref_( elem ) - l.h.s. for modifying the current element in a FOREACH iteration - - example: - SETref_(ridge)= anotherridge; -*/ -#define SETref_(elem) (elem##p[-1]) - -/*-<a href="qh-set.htm#TOC" - >---------------------------------------</a><a name="SETelem_">-</a> - - SETelem_(set, n) - return the n'th element of set - - notes: - assumes that n is valid [0..size] and that set is defined - use SETelemt_() for type cast -*/ -#define SETelem_(set, n) ((set)->e[n].p) - -/*-<a href="qh-set.htm#TOC" - >---------------------------------------</a><a name="SETelemt_">-</a> - - SETelemt_(set, n, type) - return the n'th element of set as a type - - notes: - assumes that n is valid [0..size] and that set is defined -*/ -#define SETelemt_(set, n, type) ((type*)((set)->e[n].p)) - -/*-<a href="qh-set.htm#TOC" - >---------------------------------------</a><a name="SETelemaddr_">-</a> - - SETelemaddr_(set, n, type) - return address of the n'th element of a set - - notes: - assumes that n is valid [0..size] and set is defined -*/ -#define SETelemaddr_(set, n, type) ((type **)(&((set)->e[n].p))) - -/*-<a href="qh-set.htm#TOC" - >---------------------------------------</a><a name="SETfirst_">-</a> - - SETfirst_(set) - return first element of set - -*/ -#define SETfirst_(set) ((set)->e[0].p) - -/*-<a href="qh-set.htm#TOC" - >---------------------------------------</a><a name="SETfirstt_">-</a> - - SETfirstt_(set, type) - return first element of set as a type - -*/ -#define SETfirstt_(set, type) ((type*)((set)->e[0].p)) - -/*-<a href="qh-set.htm#TOC" - >---------------------------------------</a><a name="SETsecond_">-</a> - - SETsecond_(set) - return second element of set - -*/ -#define SETsecond_(set) ((set)->e[1].p) - -/*-<a href="qh-set.htm#TOC" - >---------------------------------------</a><a name="SETsecondt_">-</a> - - SETsecondt_(set, type) - return second element of set as a type -*/ -#define SETsecondt_(set, type) ((type*)((set)->e[1].p)) - -/*-<a href="qh-set.htm#TOC" - >---------------------------------------</a><a name="SETaddr_">-</a> - - SETaddr_(set, type) - return address of set's elements -*/ -#define SETaddr_(set,type) ((type **)(&((set)->e[0].p))) - -/*-<a href="qh-set.htm#TOC" - >---------------------------------------</a><a name="SETreturnsize_">-</a> - - SETreturnsize_(set, size) - return size of a set - - notes: - set must be defined - use qh_setsize(set) unless speed is critical -*/ -#define SETreturnsize_(set, size) (((size)= ((set)->e[(set)->maxsize].i))?(--(size)):((size)= (set)->maxsize)) - -/*-<a href="qh-set.htm#TOC" - >---------------------------------------</a><a name="SETempty_">-</a> - - SETempty_(set) - return true (1) if set is empty - - notes: - set may be NULL -*/ -#define SETempty_(set) (!set || (SETfirst_(set) ? 0:1)) - -/*-<a href="qh-set.htm#TOC" - >---------------------------------------</a><a name="SETtruncate_">-</a> - - SETtruncate_(set) - return first element of set - - see: - qh_settruncate() - -*/ -#define SETtruncate_(set, size) {set->e[set->maxsize].i= size+1; /* maybe overwritten */ \ - set->e[size].p= NULL;} - -/*======= prototypes in alphabetical order ============*/ - -void qh_setaddsorted(setT **setp, void *elem); -void qh_setaddnth(setT **setp, int nth, void *newelem); -void qh_setappend(setT **setp, void *elem); -void qh_setappend_set(setT **setp, setT *setA); -void qh_setappend2ndlast(setT **setp, void *elem); -void qh_setcheck(setT *set, char *tname, int id); -void qh_setcompact(setT *set); -setT *qh_setcopy(setT *set, int extra); -void *qh_setdel(setT *set, void *elem); -void *qh_setdellast(setT *set); -void *qh_setdelnth(setT *set, int nth); -void *qh_setdelnthsorted(setT *set, int nth); -void *qh_setdelsorted(setT *set, void *newelem); -setT *qh_setduplicate( setT *set, int elemsize); -int qh_setequal(setT *setA, setT *setB); -int qh_setequal_except (setT *setA, void *skipelemA, setT *setB, void *skipelemB); -int qh_setequal_skip (setT *setA, int skipA, setT *setB, int skipB); -void qh_setfree(setT **set); -void qh_setfree2( setT **setp, int elemsize); -void qh_setfreelong(setT **set); -int qh_setin(setT *set, void *setelem); -int qh_setindex(setT *set, void *setelem); -void qh_setlarger(setT **setp); -void *qh_setlast(setT *set); -setT *qh_setnew(int size); -setT *qh_setnew_delnthsorted(setT *set, int size, int nth, int prepend); -void qh_setprint(FILE *fp, char* string, setT *set); -void qh_setreplace(setT *set, void *oldelem, void *newelem); -int qh_setsize(setT *set); -setT *qh_settemp(int setsize); -void qh_settempfree(setT **set); -void qh_settempfree_all(void); -setT *qh_settemppop(void); -void qh_settemppush(setT *set); -void qh_settruncate (setT *set, int size); -int qh_setunique (setT **set, void *elem); -void qh_setzero (setT *set, int index, int size); - - -#endif /* qhDEFset */ diff --git a/extern/qhull/src/qvoronoi.c b/extern/qhull/src/qvoronoi.c deleted file mode 100644 index ebeb7367b87..00000000000 --- a/extern/qhull/src/qvoronoi.c +++ /dev/null @@ -1,318 +0,0 @@ -/*<html><pre> -<a href="qh-qhull.htm" - >-------------------------------</a><a name="TOP">-</a> - - qvoronoi.c - compute Voronoi diagrams and furthest-point Voronoi - diagrams using qhull - - see unix.c for full interface - - copyright (c) 1993-2002, The Geometry Center -*/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include <math.h> -#include "qhull.h" -#include "mem.h" -#include "qset.h" - -#if __MWERKS__ && __POWERPC__ -#include <SIOUX.h> -#include <Files.h> -#include <console.h> -#include <Desk.h> - -#elif __cplusplus -extern "C" { - int isatty (int); -} - -#elif _MSC_VER -#include <io.h> -#define isatty _isatty - -#else -int isatty (int); /* returns 1 if stdin is a tty - if "Undefined symbol" this can be deleted along with call in main() */ -#endif - -/*-<a href="qh-qhull.c#TOC" - >-------------------------------</a><a name="prompt">-</a> - - qh_prompt - long prompt for qhull - - notes: - restricted version of qhull.c - - see: - concise prompt below -*/ - -/* duplicated in qvoron_f.htm and qvoronoi.htm */ -char hidden_options[]=" d n m v H U Qb QB Qc Qf Qg Qi Qm Qr QR Qv Qx TR E V Fa FA FC Fp FS Ft FV Pv Gt Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 "; - -char qh_prompta[]= "\n\ -qvoronoi- compute the Voronoi diagram\n\ - http://www.geom.umn.edu/software/qhull %s\n\ -\n\ -input (stdin):\n\ - first lines: dimension and number of points (or vice-versa).\n\ - other lines: point coordinates, best if one point per line\n\ - comments: start with a non-numeric character\n\ -\n\ -options:\n\ - Qu - compute furthest-site Voronoi diagram\n\ - Qt - triangulated output\n\ - QJ - joggled input instead of merged facets\n\ -\n\ -Qhull control options:\n\ - Qz - add point-at-infinity to Voronoi diagram\n\ - QJn - randomly joggle input in range [-n,n]\n\ -%s%s%s%s"; /* split up qh_prompt for Visual C++ */ -char qh_promptb[]= "\ - Qs - search all points for the initial simplex\n\ - QGn - Voronoi vertices if visible from point n, -n if not\n\ - QVn - Voronoi vertices for input point n, -n if not\n\ -\n\ -"; -char qh_promptc[]= "\ -Trace options:\n\ - T4 - trace at level n, 4=all, 5=mem/gauss, -1= events\n\ - Tc - check frequently during execution\n\ - Ts - statistics\n\ - Tv - verify result: structure, convexity, and in-circle test\n\ - Tz - send all output to stdout\n\ - TFn - report summary when n or more facets created\n\ - TI file - input data from file, no spaces or single quotes\n\ - TO file - output results to file, may be enclosed in single quotes\n\ - TPn - turn on tracing when point n added to hull\n\ - TMn - turn on tracing at merge n\n\ - TWn - trace merge facets when width > n\n\ - TVn - stop qhull after adding point n, -n for before (see TCn)\n\ - TCn - stop qhull after building cone for point n (see TVn)\n\ -\n\ -Precision options:\n\ - Cn - radius of centrum (roundoff added). Merge facets if non-convex\n\ - An - cosine of maximum angle. Merge facets if cosine > n or non-convex\n\ - C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge\n\ - Rn - randomly perturb computations by a factor of [1-n,1+n]\n\ - Wn - min facet width for non-coincident point (before roundoff)\n\ -\n\ -Output formats (may be combined; if none, produces a summary to stdout):\n\ - s - summary to stderr\n\ - p - Voronoi vertices\n\ - o - OFF format (dim, Voronoi vertices, and Voronoi regions)\n\ - i - Delaunay regions (use 'Pp' to avoid warning)\n\ - f - facet dump\n\ -\n\ -"; -char qh_promptd[]= "\ -More formats:\n\ - Fc - count plus coincident points (by Voronoi vertex)\n\ - Fd - use cdd format for input (homogeneous with offset first)\n\ - FD - use cdd format for output (offset first)\n\ - FF - facet dump without ridges\n\ - Fi - separating hyperplanes for bounded Voronoi regions\n\ - FI - ID for each Voronoi vertex\n\ - Fm - merge count for each Voronoi vertex (511 max)\n\ - Fn - count plus neighboring Voronoi vertices for each Voronoi vertex\n\ - FN - count and Voronoi vertices for each Voronoi region\n\ - Fo - separating hyperplanes for unbounded Voronoi regions\n\ - FO - options and precision constants\n\ - FP - nearest point and distance for each coincident point\n\ - FQ - command used for qvoronoi\n\ - Fs - summary: #int (8), dimension, #points, tot vertices, tot facets,\n\ - for output: #Voronoi regions, #Voronoi vertices,\n\ - #coincident points, #non-simplicial regions\n\ - #real (2), max outer plane and min vertex\n\ - Fv - Voronoi diagram as Voronoi vertices between adjacent input sites\n\ - Fx - extreme points of Delaunay triangulation (on convex hull)\n\ -\n\ -"; -char qh_prompte[]= "\ -Geomview options (2-d only)\n\ - Ga - all points as dots\n\ - Gp - coplanar points and vertices as radii\n\ - Gv - vertices as spheres\n\ - Gi - inner planes only\n\ - Gn - no planes\n\ - Go - outer planes only\n\ - Gc - centrums\n\ - Gh - hyperplane intersections\n\ - Gr - ridges\n\ - GDn - drop dimension n in 3-d and 4-d output\n\ -\n\ -Print options:\n\ - PAn - keep n largest Voronoi vertices by 'area'\n\ - Pdk:n - drop facet if normal[k] <= n (default 0.0)\n\ - PDk:n - drop facet if normal[k] >= n\n\ - Pg - print good Voronoi vertices (needs 'QGn' or 'QVn')\n\ - PFn - keep Voronoi vertices whose 'area' is at least n\n\ - PG - print neighbors of good Voronoi vertices\n\ - PMn - keep n Voronoi vertices with most merges\n\ - Po - force output. If error, output neighborhood of facet\n\ - Pp - do not report precision problems\n\ -\n\ - . - list of all options\n\ - - - one line descriptions of all options\n\ -"; -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */ - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="prompt2">-</a> - - qh_prompt2 - synopsis for qhull -*/ -char qh_prompt2[]= "\n\ -qvoronoi- compute the Voronoi diagram. Qhull %s\n\ - input (stdin): dimension, number of points, point coordinates\n\ - comments start with a non-numeric character\n\ -\n\ -options (qvoronoi.htm):\n\ - Qu - compute furthest-site Voronoi diagram\n\ - Qt - triangulated output\n\ - QJ - joggled input instead of merged facets\n\ - Tv - verify result: structure, convexity, and in-circle test\n\ - . - concise list of all options\n\ - - - one-line description of all options\n\ -\n\ -output options (subset):\n\ - s - summary of results (default)\n\ - p - Voronoi vertices\n\ - o - OFF file format (dim, Voronoi vertices, and Voronoi regions)\n\ - FN - count and Voronoi vertices for each Voronoi region\n\ - Fv - Voronoi diagram as Voronoi vertices between adjacent input sites\n\ - Fi - separating hyperplanes for bounded regions, 'Fo' for unbounded\n\ - G - Geomview output (2-d only)\n\ - QVn - Voronoi vertices for input point n, -n if not\n\ - TO file- output results to file, may be enclosed in single quotes\n\ -\n\ -examples:\n\ -rbox c P0 D2 | qvoronoi s o rbox c P0 D2 | qvoronoi Fi\n\ -rbox c P0 D2 | qvoronoi Fo rbox c P0 D2 | qvoronoi Fv\n\ -rbox c P0 D2 | qvoronoi s Qu Fv rbox c P0 D2 | qvoronoi Qu Fo\n\ -rbox c G1 d D2 | qvoronoi s p rbox c G1 d D2 | qvoronoi QJ s p\n\ -rbox c P0 D2 | qvoronoi s Fv QV0\n\ -\n\ -"; -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */ - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="prompt3">-</a> - - qh_prompt3 - concise prompt for qhull -*/ -char qh_prompt3[]= "\n\ -Qhull %s.\n\ -Except for 'F.' and 'PG', upper-case options take an argument.\n\ -\n\ - OFF_format p_vertices i_delaunay summary facet_dump\n\ -\n\ - Fcoincident Fd_cdd_in FD_cdd_out FF-dump-xridge Fi_bounded\n\ - Fxtremes Fmerges Fneighbors FNeigh_region FOptions\n\ - Fo_unbounded FPoint_near FQvoronoi Fsummary Fvoronoi\n\ - FIDs\n\ -\n\ - Gvertices Gpoints Gall_points Gno_planes Ginner\n\ - Gcentrums Ghyperplanes Gridges Gouter GDrop_dim\n\ -\n\ - PArea_keep Pdrop d0:0D0 Pgood PFacet_area_keep\n\ - PGood_neighbors PMerge_keep Poutput_forced Pprecision_not\n\ -\n\ - QG_vertex_good QJoggle Qsearch_1st Qtriangulate Qupper_voronoi\n\ - QV_point_good Qzinfinite\n\ -\n\ - T4_trace Tcheck_often Tstatistics Tverify Tz_stdout\n\ - TFacet_log TInput_file TPoint_trace TMerge_trace TOutput_file\n\ - TWide_trace TVertex_stop TCone_stop\n\ -\n\ - Angle_max Centrum_size Random_dist Wide_outside\n\ -"; - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="main">-</a> - - main( argc, argv ) - processes the command line, calls qhull() to do the work, and exits - - design: - initializes data structures - reads points - finishes initialization - computes convex hull and other structures - checks the result - writes the output - frees memory -*/ -int main(int argc, char *argv[]) { - int curlong, totlong; /* used !qh_NOmem */ - int exitcode, numpoints, dim; - coordT *points; - boolT ismalloc; - -#if __MWERKS__ && __POWERPC__ - char inBuf[BUFSIZ], outBuf[BUFSIZ], errBuf[BUFSIZ]; - SIOUXSettings.showstatusline= false; - SIOUXSettings.tabspaces= 1; - SIOUXSettings.rows= 40; - if (setvbuf (stdin, inBuf, _IOFBF, sizeof(inBuf)) < 0 /* w/o, SIOUX I/O is slow*/ - || setvbuf (stdout, outBuf, _IOFBF, sizeof(outBuf)) < 0 - || (stdout != stderr && setvbuf (stderr, errBuf, _IOFBF, sizeof(errBuf)) < 0)) - fprintf (stderr, "qhull internal warning (main): could not change stdio to fully buffered.\n"); - argc= ccommand(&argv); -#endif - - if ((argc == 1) && isatty( 0 /*stdin*/)) { - fprintf(stdout, qh_prompt2, qh_VERSION); - exit(qh_ERRnone); - } - if (argc > 1 && *argv[1] == '-' && !*(argv[1]+1)) { - fprintf(stdout, qh_prompta, qh_VERSION, - qh_promptb, qh_promptc, qh_promptd, qh_prompte); - exit(qh_ERRnone); - } - if (argc >1 && *argv[1] == '.' && !*(argv[1]+1)) { - fprintf(stdout, qh_prompt3, qh_VERSION); - exit(qh_ERRnone); - } - qh_init_A (stdin, stdout, stderr, argc, argv); /* sets qh qhull_command */ - exitcode= setjmp (qh errexit); /* simple statement for CRAY J916 */ - if (!exitcode) { - qh_option ("voronoi _bbound-last _coplanar-keep", NULL, NULL); - qh DELAUNAY= True; /* 'v' */ - qh VORONOI= True; - qh SCALElast= True; /* 'Qbb' */ - qh_checkflags (qh qhull_command, hidden_options); - qh_initflags (qh qhull_command); - points= qh_readpoints (&numpoints, &dim, &ismalloc); - if (dim >= 5) { - qh_option ("_merge-exact", NULL, NULL); - qh MERGEexact= True; /* 'Qx' always */ - } - qh_init_B (points, numpoints, dim, ismalloc); - qh_qhull(); - qh_check_output(); - qh_produce_output(); - if (qh VERIFYoutput && !qh FORCEoutput && !qh STOPpoint && !qh STOPcone) - qh_check_points(); - exitcode= qh_ERRnone; - } - qh NOerrexit= True; /* no more setjmp */ -#ifdef qh_NOmem - qh_freeqhull( True); -#else - qh_freeqhull( False); - qh_memfreeshort (&curlong, &totlong); - if (curlong || totlong) - fprintf (stderr, "qhull internal warning (main): did not free %d bytes of long memory (%d pieces)\n", - totlong, curlong); -#endif - return exitcode; -} /* main */ - diff --git a/extern/qhull/src/rbox.c b/extern/qhull/src/rbox.c deleted file mode 100644 index 1c288bddc96..00000000000 --- a/extern/qhull/src/rbox.c +++ /dev/null @@ -1,788 +0,0 @@ -/*<html><pre> -<a href="index.htm#TOC" - >-------------------------------</a><a name="TOP">-</a> - - rbox.c - Generate input points for qhull. - - notes: - 50 points generated for 'rbox D4' - - This code needs a full rewrite. It needs separate procedures for each - distribution with common, helper procedures. - - WARNING: - incorrect range if qh_RANDOMmax is defined wrong (user.h) -*/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include <math.h> -#include <limits.h> -#include <time.h> - -#include "user.h" -#if __MWERKS__ && __POWERPC__ -#include <SIOUX.h> -#include <Files.h> -#include <console.h> -#include <Desk.h> -#endif - -#ifdef _MSC_VER /* Microsoft Visual C++ */ -#pragma warning( disable : 4244) /* conversion from double to int */ -#endif - -#define MINVALUE 0.8 -#define MAXdim 200 -#define PI 3.1415926535897932384 -#define DEFAULTzbox 1e6 - -char prompt[]= "\n\ --rbox- generate various point distributions. Default is random in cube.\n\ -\n\ -args (any order, space separated): Version: 2001/06/24\n\ - 3000 number of random points in cube, lens, spiral, sphere or grid\n\ - D3 dimension 3-d\n\ - c add a unit cube to the output ('c G2.0' sets size)\n\ - d add a unit diamond to the output ('d G2.0' sets size)\n\ - l generate a regular 3-d spiral\n\ - r generate a regular polygon, ('r s Z1 G0.1' makes a cone)\n\ - s generate cospherical points\n\ - x generate random points in simplex, may use 'r' or 'Wn'\n\ - y same as 'x', plus simplex\n\ - Pn,m,r add point [n,m,r] first, pads with 0\n\ -\n\ - Ln lens distribution of radius n. Also 's', 'r', 'G', 'W'.\n\ - Mn,m,r lattice (Mesh) rotated by [n,-m,0], [m,n,0], [0,0,r], ...\n\ - '27 M1,0,1' is {0,1,2} x {0,1,2} x {0,1,2}. Try 'M3,4 z'.\n\ - W0.1 random distribution within 0.1 of the cube's or sphere's surface\n\ - Z0.5 s random points in a 0.5 disk projected to a sphere\n\ - Z0.5 s G0.6 same as Z0.5 within a 0.6 gap\n\ -\n\ - Bn bounding box coordinates, default %2.2g\n\ - h output as homogeneous coordinates for cdd\n\ - n remove command line from the first line of output\n\ - On offset coordinates by n\n\ - t use time as the random number seed (default is command line)\n\ - tn use n as the random number seed\n\ - z print integer coordinates, default 'Bn' is %2.2g\n\ -"; - -/* ------------------------------ prototypes ----------------*/ -int roundi( double a); -void out1( double a); -void out2n( double a, double b); -void out3n( double a, double b, double c); -int qh_rand( void); -void qh_srand( int seed); - - -/* ------------------------------ globals -------------------*/ - - FILE *fp; - int isinteger= 0; - double out_offset= 0.0; - - -/*-------------------------------------------- --rbox- main procedure of rbox application -*/ -int main(int argc, char **argv) { - int i,j,k; - int gendim; - int cubesize, diamondsize, seed=0, count, apex; - int dim=3 , numpoints= 0, totpoints, addpoints=0; - int issphere=0, isaxis=0, iscdd= 0, islens= 0, isregular=0, iswidth=0, addcube=0; - int isgap=0, isspiral=0, NOcommand= 0, adddiamond=0, istime=0; - int isbox=0, issimplex=0, issimplex2=0, ismesh=0; - double width=0.0, gap=0.0, radius= 0.0; - double coord[MAXdim], offset, meshm=3.0, meshn=4.0, meshr=5.0; - double *simplex, *simplexp; - int nthroot, mult[MAXdim]; - double norm, factor, randr, rangap, lensangle= 0, lensbase= 1; - double anglediff, angle, x, y, cube= 0.0, diamond= 0.0; - double box= qh_DEFAULTbox; /* scale all numbers before output */ - double randmax= qh_RANDOMmax; - char command[200], *s, seedbuf[200]; - time_t timedata; - -#if __MWERKS__ && __POWERPC__ - char inBuf[BUFSIZ], outBuf[BUFSIZ], errBuf[BUFSIZ]; - SIOUXSettings.showstatusline= False; - SIOUXSettings.tabspaces= 1; - SIOUXSettings.rows= 40; - if (setvbuf (stdin, inBuf, _IOFBF, sizeof(inBuf)) < 0 /* w/o, SIOUX I/O is slow*/ - || setvbuf (stdout, outBuf, _IOFBF, sizeof(outBuf)) < 0 - || (stdout != stderr && setvbuf (stderr, errBuf, _IOFBF, sizeof(errBuf)) < 0)) - fprintf ( stderr, "qhull internal warning (main): could not change stdio to fully buffered.\n"); - argc= ccommand(&argv); -#endif - if (argc == 1) { - printf (prompt, box, DEFAULTzbox); - exit(1); - } - if ((s = strrchr( argv[0], '\\'))) /* Borland gives full path */ - strcpy (command, s+1); - else - strcpy (command, argv[0]); - if ((s= strstr (command, ".EXE")) - || (s= strstr (command, ".exe"))) - *s= '\0'; - /* ============= read flags =============== */ - for (i=1; i < argc; i++) { - if (strlen (command) + strlen(argv[i]) + 1 < sizeof(command) ) { - strcat (command, " "); - strcat (command, argv[i]); - } - if (isdigit (argv[i][0])) { - numpoints= atoi (argv[i]); - continue; - } - if (argv[i][0] == '-') - (argv[i])++; - switch (argv[i][0]) { - case 'c': - addcube= 1; - if (i+1 < argc && argv[i+1][0] == 'G') - cube= (double) atof (&argv[++i][1]); - break; - case 'd': - adddiamond= 1; - if (i+1 < argc && argv[i+1][0] == 'G') - diamond= (double) atof (&argv[++i][1]); - break; - case 'h': - iscdd= 1; - break; - case 'l': - isspiral= 1; - break; - case 'n': - NOcommand= 1; - break; - case 'r': - isregular= 1; - break; - case 's': - issphere= 1; - break; - case 't': - istime= 1; - if (isdigit (argv[i][1])) - seed= atoi (&argv[i][1]); - else { - seed= time (&timedata); - sprintf (seedbuf, "%d", seed); - strcat (command, seedbuf); - } - break; - case 'x': - issimplex= 1; - break; - case 'y': - issimplex2= 1; - break; - case 'z': - isinteger= 1; - break; - case 'B': - box= (double) atof (&argv[i][1]); - isbox= 1; - break; - case 'D': - dim= atoi (&argv[i][1]); - if (dim < 1 - || dim > MAXdim) { - fprintf (stderr, "rbox error: dim %d too large or too small\n", dim); - exit (1); - } - break; - case 'G': - if (argv[i][1]) - gap= (double) atof (&argv[i][1]); - else - gap= 0.5; - isgap= 1; - break; - case 'L': - if (argv[i][1]) - radius= (double) atof (&argv[i][1]); - else - radius= 10; - islens= 1; - break; - case 'M': - ismesh= 1; - s= argv[i]+1; - if (*s) - meshn= strtod (s, &s); - if (*s == ',') - meshm= strtod (++s, &s); - else - meshm= 0.0; - if (*s == ',') - meshr= strtod (++s, &s); - else - meshr= sqrt (meshn*meshn + meshm*meshm); - if (*s) { - fprintf (stderr, "rbox warning: assuming 'M3,4,5' since mesh args are not integers or reals\n"); - meshn= 3.0, meshm=4.0, meshr=5.0; - } - break; - case 'O': - out_offset= (double) atof (&argv[i][1]); - break; - case 'P': - addpoints++; - break; - case 'W': - width= (double) atof (&argv[i][1]); - iswidth= 1; - break; - case 'Z': - if (argv[i][1]) - radius= (double) atof (&argv[i][1]); - else - radius= 1.0; - isaxis= 1; - break; - default: - fprintf (stderr, "rbox warning: unknown flag %s.\nExecute 'rbox' without arguments for documentation.\n", argv[i]); - } - } - /* ============= defaults, constants, and sizes =============== */ - if (isinteger && !isbox) - box= DEFAULTzbox; - if (addcube) { - cubesize= floor(ldexp(1.0,dim)+0.5); - if (cube == 0.0) - cube= box; - }else - cubesize= 0; - if (adddiamond) { - diamondsize= 2*dim; - if (diamond == 0.0) - diamond= box; - }else - diamondsize= 0; - if (islens) { - if (isaxis) { - fprintf (stderr, "rbox error: can not combine 'Ln' with 'Zn'\n"); - exit(1); - } - if (radius <= 1.0) { - fprintf (stderr, "rbox error: lens radius %.2g should be greater than 1.0\n", - radius); - exit(1); - } - lensangle= asin (1.0/radius); - lensbase= radius * cos (lensangle); - } - if (!numpoints) { - if (issimplex2) - ; /* ok */ - else if (isregular + issimplex + islens + issphere + isaxis + isspiral + iswidth + ismesh) { - fprintf (stderr, "rbox error: missing count\n"); - exit(1); - }else if (adddiamond + addcube + addpoints) - ; /* ok */ - else { - numpoints= 50; /* ./rbox D4 is the test case */ - issphere= 1; - } - } - if ((issimplex + islens + isspiral + ismesh > 1) - || (issimplex + issphere + isspiral + ismesh > 1)) { - fprintf (stderr, "rbox error: can only specify one of 'l', 's', 'x', 'Ln', or 'Mn,m,r' ('Ln s' is ok).\n"); - exit(1); - } - fp= stdout; - /* ============= print header with total points =============== */ - if (issimplex || ismesh) - totpoints= numpoints; - else if (issimplex2) - totpoints= numpoints+dim+1; - else if (isregular) { - totpoints= numpoints; - if (dim == 2) { - if (islens) - totpoints += numpoints - 2; - }else if (dim == 3) { - if (islens) - totpoints += 2 * numpoints; - else if (isgap) - totpoints += 1 + numpoints; - else - totpoints += 2; - } - }else - totpoints= numpoints + isaxis; - totpoints += cubesize + diamondsize + addpoints; - if (iscdd) - fprintf(fp, "%s\nbegin\n %d %d %s\n", - NOcommand ? "" : command, - totpoints, dim+1, - isinteger ? "integer" : "real"); - else if (NOcommand) - fprintf(fp, "%d\n%d\n", dim, totpoints); - else - fprintf(fp, "%d %s\n%d\n", dim, command, totpoints); - /* ============= seed randoms =============== */ - if (istime == 0) { - for (s=command; *s; s++) { - if (issimplex2 && *s == 'y') /* make 'y' same seed as 'x' */ - i= 'x'; - else - i= *s; - seed= 11*seed + i; - } - } /* else, seed explicitly set to n or to time */ - qh_RANDOMseed_(seed); - /* ============= explicit points =============== */ - for (i=1; i < argc; i++) { - if (argv[i][0] == 'P') { - s= argv[i]+1; - count= 0; - if (iscdd) - out1( 1.0); - while (*s) { - out1( strtod (s, &s)); - count++; - if (*s) { - if (*s++ != ',') { - fprintf (stderr, "rbox error: missing comma after coordinate in %s\n\n", argv[i]); - exit (1); - } - } - } - if (count < dim) { - for (k= dim-count; k--; ) - out1( 0.0); - }else if (count > dim) { - fprintf (stderr, "rbox error: %d coordinates instead of %d coordinates in %s\n\n", - count, dim, argv[i]); - exit (1); - } - fprintf (fp, "\n"); - } - } - /* ============= simplex distribution =============== */ - if (issimplex+issimplex2) { - if (!(simplex= malloc( dim * (dim+1) * sizeof(double)))) { - fprintf (stderr, "insufficient memory for simplex\n"); - exit(0); - } - simplexp= simplex; - if (isregular) { - for (i= 0; i<dim; i++) { - for (k= 0; k<dim; k++) - *(simplexp++)= i==k ? 1.0 : 0.0; - } - for (k= 0; k<dim; k++) - *(simplexp++)= -1.0; - }else { - for (i= 0; i<dim+1; i++) { - for (k= 0; k<dim; k++) { - randr= qh_RANDOMint; - *(simplexp++)= 2.0 * randr/randmax - 1.0; - } - } - } - if (issimplex2) { - simplexp= simplex; - for (i= 0; i<dim+1; i++) { - if (iscdd) - out1( 1.0); - for (k= 0; k<dim; k++) - out1( *(simplexp++) * box); - fprintf (fp, "\n"); - } - } - for (j= 0; j<numpoints; j++) { - if (iswidth) - apex= qh_RANDOMint % (dim+1); - else - apex= -1; - for (k= 0; k<dim; k++) - coord[k]= 0.0; - norm= 0.0; - for (i= 0; i<dim+1; i++) { - randr= qh_RANDOMint; - factor= randr/randmax; - if (i == apex) - factor *= width; - norm += factor; - for (k= 0; k<dim; k++) { - simplexp= simplex + i*dim + k; - coord[k] += factor * (*simplexp); - } - } - for (k= 0; k<dim; k++) - coord[k] /= norm; - if (iscdd) - out1( 1.0); - for (k=0; k < dim; k++) - out1( coord[k] * box); - fprintf (fp, "\n"); - } - isregular= 0; /* continue with isbox */ - numpoints= 0; - } - /* ============= mesh distribution =============== */ - if (ismesh) { - nthroot= pow (numpoints, 1.0/dim) + 0.99999; - for (k= dim; k--; ) - mult[k]= 0; - for (i= 0; i < numpoints; i++) { - for (k= 0; k < dim; k++) { - if (k == 0) - out1( mult[0] * meshn + mult[1] * (-meshm)); - else if (k == 1) - out1( mult[0] * meshm + mult[1] * meshn); - else - out1( mult[k] * meshr ); - } - fprintf (fp, "\n"); - for (k= 0; k < dim; k++) { - if (++mult[k] < nthroot) - break; - mult[k]= 0; - } - } - } - - /* ============= regular points for 's' =============== */ - else if (isregular && !islens) { - if (dim != 2 && dim != 3) { - fprintf(stderr, "rbox error: regular points can be used only in 2-d and 3-d\n\n"); - exit(1); - } - if (!isaxis || radius == 0.0) { - isaxis= 1; - radius= 1.0; - } - if (dim == 3) { - if (iscdd) - out1( 1.0); - out3n( 0.0, 0.0, -box); - if (!isgap) { - if (iscdd) - out1( 1.0); - out3n( 0.0, 0.0, box); - } - } - angle= 0.0; - anglediff= 2.0 * PI/numpoints; - for (i=0; i < numpoints; i++) { - angle += anglediff; - x= radius * cos (angle); - y= radius * sin (angle); - if (dim == 2) { - if (iscdd) - out1( 1.0); - out2n( x*box, y*box); - }else { - norm= sqrt (1.0 + x*x + y*y); - if (iscdd) - out1( 1.0); - out3n( box*x/norm, box*y/norm, box/norm); - if (isgap) { - x *= 1-gap; - y *= 1-gap; - norm= sqrt (1.0 + x*x + y*y); - if (iscdd) - out1( 1.0); - out3n( box*x/norm, box*y/norm, box/norm); - } - } - } - } - /* ============= regular points for 'r Ln D2' =============== */ - else if (isregular && islens && dim == 2) { - double cos_0; - - angle= lensangle; - anglediff= 2 * lensangle/(numpoints - 1); - cos_0= cos (lensangle); - for (i=0; i < numpoints; i++, angle -= anglediff) { - x= radius * sin (angle); - y= radius * (cos (angle) - cos_0); - if (iscdd) - out1( 1.0); - out2n( x*box, y*box); - if (i != 0 && i != numpoints - 1) { - if (iscdd) - out1( 1.0); - out2n( x*box, -y*box); - } - } - } - /* ============= regular points for 'r Ln D3' =============== */ - else if (isregular && islens && dim != 2) { - if (dim != 3) { - fprintf(stderr, "rbox error: regular points can be used only in 2-d and 3-d\n\n"); - exit(1); - } - angle= 0.0; - anglediff= 2* PI/numpoints; - if (!isgap) { - isgap= 1; - gap= 0.5; - } - offset= sqrt (radius * radius - (1-gap)*(1-gap)) - lensbase; - for (i=0; i < numpoints; i++, angle += anglediff) { - x= cos (angle); - y= sin (angle); - if (iscdd) - out1( 1.0); - out3n( box*x, box*y, 0); - x *= 1-gap; - y *= 1-gap; - if (iscdd) - out1( 1.0); - out3n( box*x, box*y, box * offset); - if (iscdd) - out1( 1.0); - out3n( box*x, box*y, -box * offset); - } - } - /* ============= apex of 'Zn' distribution + gendim =============== */ - else { - if (isaxis) { - gendim= dim-1; - if (iscdd) - out1( 1.0); - for (j=0; j < gendim; j++) - out1( 0.0); - out1( -box); - fprintf (fp, "\n"); - }else if (islens) - gendim= dim-1; - else - gendim= dim; - /* ============= generate random point in unit cube =============== */ - for (i=0; i < numpoints; i++) { - norm= 0.0; - for (j=0; j < gendim; j++) { - randr= qh_RANDOMint; - coord[j]= 2.0 * randr/randmax - 1.0; - norm += coord[j] * coord[j]; - } - norm= sqrt (norm); - /* ============= dim-1 point of 'Zn' distribution ========== */ - if (isaxis) { - if (!isgap) { - isgap= 1; - gap= 1.0; - } - randr= qh_RANDOMint; - rangap= 1.0 - gap * randr/randmax; - factor= radius * rangap / norm; - for (j=0; j<gendim; j++) - coord[j]= factor * coord[j]; - /* ============= dim-1 point of 'Ln s' distribution =========== */ - }else if (islens && issphere) { - if (!isgap) { - isgap= 1; - gap= 1.0; - } - randr= qh_RANDOMint; - rangap= 1.0 - gap * randr/randmax; - factor= rangap / norm; - for (j=0; j<gendim; j++) - coord[j]= factor * coord[j]; - /* ============= dim-1 point of 'Ln' distribution ========== */ - }else if (islens && !issphere) { - if (!isgap) { - isgap= 1; - gap= 1.0; - } - j= qh_RANDOMint % gendim; - if (coord[j] < 0) - coord[j]= -1.0 - coord[j] * gap; - else - coord[j]= 1.0 - coord[j] * gap; - /* ============= point of 'l' distribution =============== */ - }else if (isspiral) { - if (dim != 3) { - fprintf(stderr, "rbox error: spiral distribution is available only in 3d\n\n"); - exit(1); - } - coord[0]= cos(2*PI*i/(numpoints - 1)); - coord[1]= sin(2*PI*i/(numpoints - 1)); - coord[2]= 2.0*(double)i/(double)(numpoints-1) - 1.0; - /* ============= point of 's' distribution =============== */ - }else if (issphere) { - factor= 1.0/norm; - if (iswidth) { - randr= qh_RANDOMint; - factor *= 1.0 - width * randr/randmax; - } - for (j=0; j<dim; j++) - coord[j]= factor * coord[j]; - } - /* ============= project 'Zn s' point in to sphere =============== */ - if (isaxis && issphere) { - coord[dim-1]= 1.0; - norm= 1.0; - for (j=0; j<gendim; j++) - norm += coord[j] * coord[j]; - norm= sqrt (norm); - for (j=0; j<dim; j++) - coord[j]= coord[j] / norm; - if (iswidth) { - randr= qh_RANDOMint; - coord[dim-1] *= 1 - width * randr/randmax; - } - /* ============= project 'Zn' point onto cube =============== */ - }else if (isaxis && !issphere) { /* not very interesting */ - randr= qh_RANDOMint; - coord[dim-1]= 2.0 * randr/randmax - 1.0; - /* ============= project 'Ln' point out to sphere =============== */ - }else if (islens) { - coord[dim-1]= lensbase; - for (j=0, norm= 0; j<dim; j++) - norm += coord[j] * coord[j]; - norm= sqrt (norm); - for (j=0; j<dim; j++) - coord[j]= coord[j] * radius/ norm; - coord[dim-1] -= lensbase; - if (iswidth) { - randr= qh_RANDOMint; - coord[dim-1] *= 1 - width * randr/randmax; - } - if (qh_RANDOMint > randmax/2) - coord[dim-1]= -coord[dim-1]; - /* ============= project 'Wn' point toward boundary =============== */ - }else if (iswidth && !issphere) { - j= qh_RANDOMint % gendim; - if (coord[j] < 0) - coord[j]= -1.0 - coord[j] * width; - else - coord[j]= 1.0 - coord[j] * width; - } - /* ============= write point =============== */ - if (iscdd) - out1( 1.0); - for (k=0; k < dim; k++) - out1( coord[k] * box); - fprintf (fp, "\n"); - } - } - /* ============= write cube vertices =============== */ - if (addcube) { - for (j=0; j<cubesize; j++) { - if (iscdd) - out1( 1.0); - for (k=dim-1; k>=0; k--) { - if (j & ( 1 << k)) - out1( cube); - else - out1( -cube); - } - fprintf (fp, "\n"); - } - } - /* ============= write diamond vertices =============== */ - if (adddiamond) { - for (j=0; j<diamondsize; j++) { - if (iscdd) - out1( 1.0); - for (k=dim-1; k>=0; k--) { - if (j/2 != k) - out1( 0.0); - else if (j & 0x1) - out1( diamond); - else - out1( -diamond); - } - fprintf (fp, "\n"); - } - } - if (iscdd) - fprintf (fp, "end\nhull\n"); - return 0; - } /* rbox */ - -/*------------------------------------------------ --outxxx - output functions -*/ -int roundi( double a) { - if (a < 0.0) { - if (a - 0.5 < INT_MIN) { - fprintf(stderr, "rbox input error: coordinate %2.2g is too large. Reduce 'Bn'\n", a); - exit (1); - } - return a - 0.5; - }else { - if (a + 0.5 > INT_MAX) { - fprintf(stderr, "rbox input error: coordinate %2.2g is too large. Reduce 'Bn'\n", a); - exit (1); - } - return a + 0.5; - } -} /* roundi */ - -void out1(double a) { - - if (isinteger) - fprintf(fp, "%d ", roundi( a+out_offset)); - else - fprintf(fp, qh_REAL_1, a+out_offset); -} /* out1 */ - -void out2n( double a, double b) { - - if (isinteger) - fprintf(fp, "%d %d\n", roundi(a+out_offset), roundi(b+out_offset)); - else - fprintf(fp, qh_REAL_2n, a+out_offset, b+out_offset); -} /* out2n */ - -void out3n( double a, double b, double c) { - - if (isinteger) - fprintf(fp, "%d %d %d\n", roundi(a+out_offset), roundi(b+out_offset), roundi(c+out_offset)); - else - fprintf(fp, qh_REAL_3n, a+out_offset, b+out_offset, c+out_offset); -} /* out3n */ - -/*------------------------------------------------- --rand & srand- generate pseudo-random number between 1 and 2^31 -2 - from Park & Miller's minimimal standard random number generator - Communications of the ACM, 31:1192-1201, 1988. -notes: - does not use 0 or 2^31 -1 - this is silently enforced by qh_srand() - copied from geom2.c -*/ -static int seed = 1; /* global static */ - -int qh_rand( void) { -#define qh_rand_a 16807 -#define qh_rand_m 2147483647 -#define qh_rand_q 127773 /* m div a */ -#define qh_rand_r 2836 /* m mod a */ - int lo, hi, test; - - hi = seed / qh_rand_q; /* seed div q */ - lo = seed % qh_rand_q; /* seed mod q */ - test = qh_rand_a * lo - qh_rand_r * hi; - if (test > 0) - seed= test; - else - seed= test + qh_rand_m; - return seed; -} /* rand */ - -void qh_srand( int newseed) { - if (newseed < 1) - seed= 1; - else if (newseed >= qh_rand_m) - seed= qh_rand_m - 1; - else - seed= newseed; -} /* qh_srand */ - diff --git a/extern/qhull/src/stat.c b/extern/qhull/src/stat.c deleted file mode 100644 index ede0323cb88..00000000000 --- a/extern/qhull/src/stat.c +++ /dev/null @@ -1,700 +0,0 @@ -/*<html><pre> -<a href="qh-stat.htm" - >-------------------------------</a><a name="TOP">-</a> - - stat.c - contains all statistics that are collected for qhull - - see qh-stat.htm and stat.h - - copyright (c) 1993-2002, The Geometry Center -*/ - -#include "qhull_a.h" - -/*============ global data structure ==========*/ - -#if qh_QHpointer -qhstatT *qh_qhstat=NULL; /* global data structure */ -#else -qhstatT qh_qhstat; /* add "={0}" if this causes a compiler error */ -#endif - -/*========== functions in alphabetic order ================*/ - -/*-<a href="qh-stat.htm#TOC" - >-------------------------------</a><a name="allstatA">-</a> - - qh_allstatA() - define statistics in groups of 20 - - notes: - (otherwise, 'gcc -O2' uses too much memory) - uses qhstat.next -*/ -void qh_allstatA (void) { - - /* zdef_(type,name,doc,average) */ - zzdef_(zdoc, Zdoc2, "precision statistics", -1); - zdef_(zinc, Znewvertex, NULL, -1); - zdef_(wadd, Wnewvertex, "ave. distance of a new vertex to a facet (not 0s)", Znewvertex); - zzdef_(wmax, Wnewvertexmax, "max. distance of a new vertex to a facet", -1); - zdef_(wmax, Wvertexmax, "max. distance of an output vertex to a facet", -1); - zdef_(wmin, Wvertexmin, "min. distance of an output vertex to a facet", -1); - zdef_(wmin, Wmindenom, "min. denominator in hyperplane computation", -1); - - qhstat precision= qhstat next; /* call qh_precision for each of these */ - zzdef_(zdoc, Zdoc3, "precision problems (corrected unless 'Q0' or an error)", -1); - zzdef_(zinc, Zcoplanarridges, "coplanar half ridges in output", -1); - zzdef_(zinc, Zconcaveridges, "concave half ridges in output", -1); - zzdef_(zinc, Zflippedfacets, "flipped facets", -1); - zzdef_(zinc, Zcoplanarhorizon, "coplanar horizon facets for new vertices", -1); - zzdef_(zinc, Zcoplanarpart, "coplanar points during partitioning", -1); - zzdef_(zinc, Zminnorm, "degenerate hyperplanes recomputed with gaussian elimination", -1); - zzdef_(zinc, Znearlysingular, "nearly singular or axis-parallel hyperplanes", -1); - zzdef_(zinc, Zback0, "zero divisors during back substitute", -1); - zzdef_(zinc, Zgauss0, "zero divisors during gaussian elimination", -1); - zzdef_(zinc, Zmultiridge, "ridges with multiple neighbors", -1); -} -void qh_allstatB (void) { - zzdef_(zdoc, Zdoc1, "summary information", -1); - zdef_(zinc, Zvertices, "number of vertices in output", -1); - zdef_(zinc, Znumfacets, "number of facets in output", -1); - zdef_(zinc, Znonsimplicial, "number of non-simplicial facets in output", -1); - zdef_(zinc, Znowsimplicial, "number of simplicial facets that were merged", -1); - zdef_(zinc, Znumridges, "number of ridges in output", -1); - zdef_(zadd, Znumridges, "average number of ridges per facet", Znumfacets); - zdef_(zmax, Zmaxridges, "maximum number of ridges", -1); - zdef_(zadd, Znumneighbors, "average number of neighbors per facet", Znumfacets); - zdef_(zmax, Zmaxneighbors, "maximum number of neighbors", -1); - zdef_(zadd, Znumvertices, "average number of vertices per facet", Znumfacets); - zdef_(zmax, Zmaxvertices, "maximum number of vertices", -1); - zdef_(zadd, Znumvneighbors, "average number of neighbors per vertex", Zvertices); - zdef_(zmax, Zmaxvneighbors, "maximum number of neighbors", -1); - zdef_(wadd, Wcpu, "cpu seconds for qhull after input", -1); - zdef_(zinc, Ztotvertices, "vertices created altogether", -1); - zzdef_(zinc, Zsetplane, "facets created altogether", -1); - zdef_(zinc, Ztotridges, "ridges created altogether", -1); - zdef_(zinc, Zpostfacets, "facets before post merge", -1); - zdef_(zadd, Znummergetot, "average merges per facet (at most 511)", Znumfacets); - zdef_(zmax, Znummergemax, " maximum merges for a facet (at most 511)", -1); - zdef_(zinc, Zangle, NULL, -1); - zdef_(wadd, Wangle, "average angle (cosine) of facet normals for all ridges", Zangle); - zdef_(wmax, Wanglemax, " maximum angle (cosine) of facet normals across a ridge", -1); - zdef_(wmin, Wanglemin, " minimum angle (cosine) of facet normals across a ridge", -1); - zdef_(wadd, Wareatot, "total area of facets", -1); - zdef_(wmax, Wareamax, " maximum facet area", -1); - zdef_(wmin, Wareamin, " minimum facet area", -1); -} -void qh_allstatC (void) { - zdef_(zdoc, Zdoc9, "build hull statistics", -1); - zzdef_(zinc, Zprocessed, "points processed", -1); - zzdef_(zinc, Zretry, "retries due to precision problems", -1); - zdef_(wmax, Wretrymax, " max. random joggle", -1); - zdef_(zmax, Zmaxvertex, "max. vertices at any one time", -1); - zdef_(zinc, Ztotvisible, "ave. visible facets per iteration", Zprocessed); - zdef_(zinc, Zinsidevisible, " ave. visible facets without an horizon neighbor", Zprocessed); - zdef_(zadd, Zvisfacettot, " ave. facets deleted per iteration", Zprocessed); - zdef_(zmax, Zvisfacetmax, " maximum", -1); - zdef_(zadd, Zvisvertextot, "ave. visible vertices per iteration", Zprocessed); - zdef_(zmax, Zvisvertexmax, " maximum", -1); - zdef_(zinc, Ztothorizon, "ave. horizon facets per iteration", Zprocessed); - zdef_(zadd, Znewfacettot, "ave. new or merged facets per iteration", Zprocessed); - zdef_(zmax, Znewfacetmax, " maximum (includes initial simplex)", -1); - zdef_(wadd, Wnewbalance, "average new facet balance", Zprocessed); - zdef_(wadd, Wnewbalance2, " standard deviation", -1); - zdef_(wadd, Wpbalance, "average partition balance", Zpbalance); - zdef_(wadd, Wpbalance2, " standard deviation", -1); - zdef_(zinc, Zpbalance, " number of trials", -1); - zdef_(zinc, Zsearchpoints, "searches of all points for initial simplex", -1); - zdef_(zinc, Zdetsimplex, "determinants computed (area & initial hull)", -1); - zdef_(zinc, Znoarea, "determinants not computed because vertex too low", -1); - zdef_(zinc, Znotmax, "points ignored (not above max_outside)", -1); - zdef_(zinc, Znotgood, "points ignored (not above a good facet)", -1); - zdef_(zinc, Znotgoodnew, "points ignored (didn't create a good new facet)", -1); - zdef_(zinc, Zgoodfacet, "good facets found", -1); - zzdef_(zinc, Znumvisibility, "distance tests for facet visibility", -1); - zdef_(zinc, Zdistvertex, "distance tests to report minimum vertex", -1); - zdef_(zinc, Ztotcheck, "points checked for facets' outer planes", -1); - zzdef_(zinc, Zcheckpart, " ave. distance tests per check", Ztotcheck); -} -void qh_allstatD(void) { - zdef_(zdoc, Zdoc4, "partitioning statistics (see previous for outer planes)", -1); - zzdef_(zadd, Zdelvertextot, "total vertices deleted", -1); - zdef_(zmax, Zdelvertexmax, " maximum vertices deleted per iteration", -1); - zdef_(zinc, Zfindbest, "calls to findbest", -1); - zdef_(zadd, Zfindbesttot, " ave. facets tested", Zfindbest); - zdef_(zmax, Zfindbestmax, " max. facets tested", -1); - zdef_(zadd, Zfindcoplanar, " ave. coplanar search", Zfindbest); - zdef_(zinc, Zfindnew, "calls to findbestnew", -1); - zdef_(zadd, Zfindnewtot, " ave. facets tested", Zfindnew); - zdef_(zmax, Zfindnewmax, " max. facets tested", -1); - zdef_(zinc, Zfindnewjump, " ave. clearly better", Zfindnew); - zdef_(zinc, Zfindnewsharp, " calls due to qh_sharpnewfacets", -1); - zdef_(zinc, Zfindhorizon, "calls to findhorizon", -1); - zdef_(zadd, Zfindhorizontot, " ave. facets tested", Zfindhorizon); - zdef_(zmax, Zfindhorizonmax, " max. facets tested", -1); - zdef_(zinc, Zfindjump, " ave. clearly better", Zfindhorizon); - zdef_(zinc, Zparthorizon, " horizon facets better than bestfacet", -1); - zdef_(zinc, Zpartangle, "angle tests for repartitioned coplanar points", -1); - zdef_(zinc, Zpartflip, " repartitioned coplanar points for flipped orientation", -1); - zdef_(zinc, Zpartinside, "inside points", -1); - zdef_(zinc, Zpartnear, " inside points kept with a facet", -1); - zdef_(zinc, Zcoplanarinside, " inside points that were coplanar with a facet", -1); - zdef_(wadd, Wmaxout, "difference in max_outside at final check", -1); -} -void qh_allstatE(void) { - zzdef_(zinc, Zpartitionall, "distance tests for initial partition", -1); - zdef_(zinc, Ztotpartition, "partitions of a point", -1); - zzdef_(zinc, Zpartition, "distance tests for partitioning", -1); - zzdef_(zinc, Zdistcheck, "distance tests for checking flipped facets", -1); - zzdef_(zinc, Zdistconvex, "distance tests for checking convexity", -1); - zdef_(zinc, Zdistgood, "distance tests for checking good point", -1); - zdef_(zinc, Zdistio, "distance tests for output", -1); - zdef_(zinc, Zdiststat, "distance tests for statistics", -1); - zdef_(zinc, Zdistplane, "total number of distance tests", -1); - zdef_(zinc, Ztotpartcoplanar, "partitions of coplanar points or deleted vertices", -1); - zzdef_(zinc, Zpartcoplanar, " distance tests for these partitions", -1); - zdef_(zinc, Zcomputefurthest, "distance tests for computing furthest", -1); -} -void qh_allstatE2(void) { - zdef_(zdoc, Zdoc5, "statistics for matching ridges", -1); - zdef_(zinc, Zhashlookup, "total lookups for matching ridges of new facets", -1); - zdef_(zinc, Zhashtests, "average number of tests to match a ridge", Zhashlookup); - zdef_(zinc, Zhashridge, "total lookups of subridges (duplicates and boundary)", -1); - zdef_(zinc, Zhashridgetest, "average number of tests per subridge", Zhashridge); - zdef_(zinc, Zdupsame, "duplicated ridges in same merge cycle", -1); - zdef_(zinc, Zdupflip, "duplicated ridges with flipped facets", -1); - - zdef_(zdoc, Zdoc6, "statistics for determining merges", -1); - zdef_(zinc, Zangletests, "angles computed for ridge convexity", -1); - zdef_(zinc, Zbestcentrum, "best merges used centrum instead of vertices",-1); - zzdef_(zinc, Zbestdist, "distance tests for best merge", -1); - zzdef_(zinc, Zcentrumtests, "distance tests for centrum convexity", -1); - zzdef_(zinc, Zdistzero, "distance tests for checking simplicial convexity", -1); - zdef_(zinc, Zcoplanarangle, "coplanar angles in getmergeset", -1); - zdef_(zinc, Zcoplanarcentrum, "coplanar centrums in getmergeset", -1); - zdef_(zinc, Zconcaveridge, "concave ridges in getmergeset", -1); -} -void qh_allstatF(void) { - zdef_(zdoc, Zdoc7, "statistics for merging", -1); - zdef_(zinc, Zpremergetot, "merge iterations", -1); - zdef_(zadd, Zmergeinittot, "ave. initial non-convex ridges per iteration", Zpremergetot); - zdef_(zadd, Zmergeinitmax, " maximum", -1); - zdef_(zadd, Zmergesettot, " ave. additional non-convex ridges per iteration", Zpremergetot); - zdef_(zadd, Zmergesetmax, " maximum additional in one pass", -1); - zdef_(zadd, Zmergeinittot2, "initial non-convex ridges for post merging", -1); - zdef_(zadd, Zmergesettot2, " additional non-convex ridges", -1); - zdef_(wmax, Wmaxoutside, "max distance of vertex or coplanar point above facet (w/roundoff)", -1); - zdef_(wmin, Wminvertex, "max distance of merged vertex below facet (or roundoff)", -1); - zdef_(zinc, Zwidefacet, "centrums frozen due to a wide merge", -1); - zdef_(zinc, Zwidevertices, "centrums frozen due to extra vertices", -1); - zzdef_(zinc, Ztotmerge, "total number of facets or cycles of facets merged", -1); - zdef_(zinc, Zmergesimplex, "merged a simplex", -1); - zdef_(zinc, Zonehorizon, "simplices merged into coplanar horizon", -1); - zzdef_(zinc, Zcyclehorizon, "cycles of facets merged into coplanar horizon", -1); - zzdef_(zadd, Zcyclefacettot, " ave. facets per cycle", Zcyclehorizon); - zdef_(zmax, Zcyclefacetmax, " max. facets", -1); - zdef_(zinc, Zmergeintohorizon, "new facets merged into horizon", -1); - zdef_(zinc, Zmergenew, "new facets merged", -1); - zdef_(zinc, Zmergehorizon, "horizon facets merged into new facets", -1); - zdef_(zinc, Zmergevertex, "vertices deleted by merging", -1); - zdef_(zinc, Zcyclevertex, "vertices deleted by merging into coplanar horizon", -1); - zdef_(zinc, Zdegenvertex, "vertices deleted by degenerate facet", -1); - zdef_(zinc, Zmergeflipdup, "merges due to flipped facets in duplicated ridge", -1); - zdef_(zinc, Zneighbor, "merges due to redundant neighbors", -1); - zdef_(zadd, Ztestvneighbor, "non-convex vertex neighbors", -1); -} -void qh_allstatG(void) { - zdef_(zinc, Zacoplanar, "merges due to angle coplanar facets", -1); - zdef_(wadd, Wacoplanartot, " average merge distance", Zacoplanar); - zdef_(wmax, Wacoplanarmax, " maximum merge distance", -1); - zdef_(zinc, Zcoplanar, "merges due to coplanar facets", -1); - zdef_(wadd, Wcoplanartot, " average merge distance", Zcoplanar); - zdef_(wmax, Wcoplanarmax, " maximum merge distance", -1); - zdef_(zinc, Zconcave, "merges due to concave facets", -1); - zdef_(wadd, Wconcavetot, " average merge distance", Zconcave); - zdef_(wmax, Wconcavemax, " maximum merge distance", -1); - zdef_(zinc, Zavoidold, "coplanar/concave merges due to avoiding old merge", -1); - zdef_(wadd, Wavoidoldtot, " average merge distance", Zavoidold); - zdef_(wmax, Wavoidoldmax, " maximum merge distance", -1); - zdef_(zinc, Zdegen, "merges due to degenerate facets", -1); - zdef_(wadd, Wdegentot, " average merge distance", Zdegen); - zdef_(wmax, Wdegenmax, " maximum merge distance", -1); - zdef_(zinc, Zflipped, "merges due to removing flipped facets", -1); - zdef_(wadd, Wflippedtot, " average merge distance", Zflipped); - zdef_(wmax, Wflippedmax, " maximum merge distance", -1); - zdef_(zinc, Zduplicate, "merges due to duplicated ridges", -1); - zdef_(wadd, Wduplicatetot, " average merge distance", Zduplicate); - zdef_(wmax, Wduplicatemax, " maximum merge distance", -1); -} -void qh_allstatH(void) { - zdef_(zdoc, Zdoc8, "renamed vertex statistics", -1); - zdef_(zinc, Zrenameshare, "renamed vertices shared by two facets", -1); - zdef_(zinc, Zrenamepinch, "renamed vertices in a pinched facet", -1); - zdef_(zinc, Zrenameall, "renamed vertices shared by multiple facets", -1); - zdef_(zinc, Zfindfail, "rename failures due to duplicated ridges", -1); - zdef_(zinc, Zdupridge, " duplicate ridges detected", -1); - zdef_(zinc, Zdelridge, "deleted ridges due to renamed vertices", -1); - zdef_(zinc, Zdropneighbor, "dropped neighbors due to renamed vertices", -1); - zdef_(zinc, Zdropdegen, "degenerate facets due to dropped neighbors", -1); - zdef_(zinc, Zdelfacetdup, " facets deleted because of no neighbors", -1); - zdef_(zinc, Zremvertex, "vertices removed from facets due to no ridges", -1); - zdef_(zinc, Zremvertexdel, " deleted", -1); - zdef_(zinc, Zintersectnum, "vertex intersections for locating redundant vertices", -1); - zdef_(zinc, Zintersectfail, "intersections failed to find a redundant vertex", -1); - zdef_(zinc, Zintersect, "intersections found redundant vertices", -1); - zdef_(zadd, Zintersecttot, " ave. number found per vertex", Zintersect); - zdef_(zmax, Zintersectmax, " max. found for a vertex", -1); - zdef_(zinc, Zvertexridge, NULL, -1); - zdef_(zadd, Zvertexridgetot, " ave. number of ridges per tested vertex", Zvertexridge); - zdef_(zmax, Zvertexridgemax, " max. number of ridges per tested vertex", -1); - - zdef_(zdoc, Zdoc10, "memory usage statistics (in bytes)", -1); - zdef_(zadd, Zmemfacets, "for facets and their normals, neighbor and vertex sets", -1); - zdef_(zadd, Zmemvertices, "for vertices and their neighbor sets", -1); - zdef_(zadd, Zmempoints, "for input points and outside and coplanar sets",-1); - zdef_(zadd, Zmemridges, "for ridges and their vertex sets", -1); -} /* allstat */ - -void qh_allstatI(void) { - qhstat vridges= qhstat next; - zzdef_(zdoc, Zdoc11, "Voronoi ridge statistics", -1); - zzdef_(zinc, Zridge, "non-simplicial Voronoi vertices for all ridges", -1); - zzdef_(wadd, Wridge, " ave. distance to ridge", Zridge); - zzdef_(wmax, Wridgemax, " max. distance to ridge", -1); - zzdef_(zinc, Zridgemid, "bounded ridges", -1); - zzdef_(wadd, Wridgemid, " ave. distance of midpoint to ridge", Zridgemid); - zzdef_(wmax, Wridgemidmax, " max. distance of midpoint to ridge", -1); - zzdef_(zinc, Zridgeok, "bounded ridges with ok normal", -1); - zzdef_(wadd, Wridgeok, " ave. angle to ridge", Zridgeok); - zzdef_(wmax, Wridgeokmax, " max. angle to ridge", -1); - zzdef_(zinc, Zridge0, "bounded ridges with near-zero normal", -1); - zzdef_(wadd, Wridge0, " ave. angle to ridge", Zridge0); - zzdef_(wmax, Wridge0max, " max. angle to ridge", -1); - - zdef_(zdoc, Zdoc12, "Triangulation statistics (Qt)", -1); - zdef_(zinc, Ztricoplanar, "non-simplicial facets triangulated", -1); - zdef_(zadd, Ztricoplanartot, " ave. new facets created (may be deleted)", Ztricoplanar); - zdef_(zmax, Ztricoplanarmax, " max. new facets created", -1); - zdef_(zinc, Ztrinull, "null new facets deleted (duplicated vertex)", -1); - zdef_(zinc, Ztrimirror, "mirrored pairs of new facets deleted (same vertices)", -1); - zdef_(zinc, Ztridegen, "degenerate new facets in output (same ridge)", -1); -} /* allstat */ - -/*-<a href="qh-stat.htm#TOC" - >-------------------------------</a><a name="allstatistics">-</a> - - qh_allstatistics() - reset printed flag for all statistics -*/ -void qh_allstatistics (void) { - int i; - - for (i=ZEND; i--; ) - qhstat printed[i]= False; -} /* allstatistics */ - -#if qh_KEEPstatistics -/*-<a href="qh-stat.htm#TOC" - >-------------------------------</a><a name="collectstatistics">-</a> - - qh_collectstatistics() - collect statistics for qh.facet_list - -*/ -void qh_collectstatistics (void) { - facetT *facet, *neighbor, **neighborp; - vertexT *vertex, **vertexp; - realT dotproduct, dist; - int sizneighbors, sizridges, sizvertices, i; - - qh old_randomdist= qh RANDOMdist; - qh RANDOMdist= False; - zval_(Zmempoints)= qh num_points * qh normal_size + - sizeof (qhT) + sizeof (qhstatT); - zval_(Zmemfacets)= 0; - zval_(Zmemridges)= 0; - zval_(Zmemvertices)= 0; - zval_(Zangle)= 0; - wval_(Wangle)= 0.0; - zval_(Znumridges)= 0; - zval_(Znumfacets)= 0; - zval_(Znumneighbors)= 0; - zval_(Znumvertices)= 0; - zval_(Znumvneighbors)= 0; - zval_(Znummergetot)= 0; - zval_(Znummergemax)= 0; - zval_(Zvertices)= qh num_vertices - qh_setsize (qh del_vertices); - if (qh MERGING || qh APPROXhull || qh JOGGLEmax < REALmax/2) - wmax_(Wmaxoutside, qh max_outside); - if (qh MERGING) - wmin_(Wminvertex, qh min_vertex); - FORALLfacets - facet->seen= False; - if (qh DELAUNAY) { - FORALLfacets { - if (facet->upperdelaunay != qh UPPERdelaunay) - facet->seen= True; /* remove from angle statistics */ - } - } - FORALLfacets { - if (facet->visible && qh NEWfacets) - continue; - sizvertices= qh_setsize (facet->vertices); - sizneighbors= qh_setsize (facet->neighbors); - sizridges= qh_setsize (facet->ridges); - zinc_(Znumfacets); - zadd_(Znumvertices, sizvertices); - zmax_(Zmaxvertices, sizvertices); - zadd_(Znumneighbors, sizneighbors); - zmax_(Zmaxneighbors, sizneighbors); - zadd_(Znummergetot, facet->nummerge); - i= facet->nummerge; /* avoid warnings */ - zmax_(Znummergemax, i); - if (!facet->simplicial) { - if (sizvertices == qh hull_dim) { - zinc_(Znowsimplicial); - }else { - zinc_(Znonsimplicial); - } - } - if (sizridges) { - zadd_(Znumridges, sizridges); - zmax_(Zmaxridges, sizridges); - } - zadd_(Zmemfacets, sizeof (facetT) + qh normal_size + 2*sizeof (setT) - + SETelemsize * (sizneighbors + sizvertices)); - if (facet->ridges) { - zadd_(Zmemridges, - sizeof (setT) + SETelemsize * sizridges + sizridges * - (sizeof (ridgeT) + sizeof (setT) + SETelemsize * (qh hull_dim-1))/2); - } - if (facet->outsideset) - zadd_(Zmempoints, sizeof (setT) + SETelemsize * qh_setsize (facet->outsideset)); - if (facet->coplanarset) - zadd_(Zmempoints, sizeof (setT) + SETelemsize * qh_setsize (facet->coplanarset)); - if (facet->seen) /* Delaunay upper envelope */ - continue; - facet->seen= True; - FOREACHneighbor_(facet) { - if (neighbor == qh_DUPLICATEridge || neighbor == qh_MERGEridge - || neighbor->seen || !facet->normal || !neighbor->normal) - continue; - dotproduct= qh_getangle(facet->normal, neighbor->normal); - zinc_(Zangle); - wadd_(Wangle, dotproduct); - wmax_(Wanglemax, dotproduct) - wmin_(Wanglemin, dotproduct) - } - if (facet->normal) { - FOREACHvertex_(facet->vertices) { - zinc_(Zdiststat); - qh_distplane(vertex->point, facet, &dist); - wmax_(Wvertexmax, dist); - wmin_(Wvertexmin, dist); - } - } - } - FORALLvertices { - if (vertex->deleted) - continue; - zadd_(Zmemvertices, sizeof (vertexT)); - if (vertex->neighbors) { - sizneighbors= qh_setsize (vertex->neighbors); - zadd_(Znumvneighbors, sizneighbors); - zmax_(Zmaxvneighbors, sizneighbors); - zadd_(Zmemvertices, sizeof (vertexT) + SETelemsize * sizneighbors); - } - } - qh RANDOMdist= qh old_randomdist; -} /* collectstatistics */ -#endif /* qh_KEEPstatistics */ - -/*-<a href="qh-stat.htm#TOC" - >-------------------------------</a><a name="freestatistics">-</a> - - qh_freestatistics( ) - free memory used for statistics -*/ -void qh_freestatistics (void) { - -#if qh_QHpointer - free (qh_qhstat); - qh_qhstat= NULL; -#endif -} /* freestatistics */ - -/*-<a href="qh-stat.htm#TOC" - >-------------------------------</a><a name="initstatistics">-</a> - - qh_initstatistics( ) - allocate and initialize statistics - - notes: - uses malloc() instead of qh_memalloc() since mem.c not set up yet -*/ -void qh_initstatistics (void) { - int i; - realT realx; - int intx; - -#if qh_QHpointer - if (!(qh_qhstat= (qhstatT *)malloc (sizeof(qhstatT)))) { - fprintf (qhmem.ferr, "qhull error (qh_initstatistics): insufficient memory\n"); - exit (1); /* can not use qh_errexit() */ - } -#endif - - qhstat next= 0; - qh_allstatA(); - qh_allstatB(); - qh_allstatC(); - qh_allstatD(); - qh_allstatE(); - qh_allstatE2(); - qh_allstatF(); - qh_allstatG(); - qh_allstatH(); - qh_allstatI(); - if (qhstat next > sizeof(qhstat id)) { - fprintf (qhmem.ferr, "qhull error (qh_initstatistics): increase size of qhstat.id[].\n\ - qhstat.next %d should be <= sizeof(qhstat id) %ld\n", qhstat next, sizeof(qhstat id)); -#if 0 /* for locating error, Znumridges should be duplicated */ - for (i=0; i < ZEND; i++) { - int j; - for (j=i+1; j < ZEND; j++) { - if (qhstat id[i] == qhstat id[j]) { - fprintf (qhmem.ferr, "qhull error (qh_initstatistics): duplicated statistic %d at indices %d and %d\n", - qhstat id[i], i, j); - } - } - } -#endif - exit (1); /* can not use qh_errexit() */ - } - qhstat init[zinc].i= 0; - qhstat init[zadd].i= 0; - qhstat init[zmin].i= INT_MAX; - qhstat init[zmax].i= INT_MIN; - qhstat init[wadd].r= 0; - qhstat init[wmin].r= REALmax; - qhstat init[wmax].r= -REALmax; - for (i=0; i < ZEND; i++) { - if (qhstat type[i] > ZTYPEreal) { - realx= qhstat init[(unsigned char)(qhstat type[i])].r; - qhstat stats[i].r= realx; - }else if (qhstat type[i] != zdoc) { - intx= qhstat init[(unsigned char)(qhstat type[i])].i; - qhstat stats[i].i= intx; - } - } -} /* initstatistics */ - -/*-<a href="qh-stat.htm#TOC" - >-------------------------------</a><a name="newstats">-</a> - - qh_newstats( ) - returns True if statistics for zdoc - - returns: - next zdoc -*/ -boolT qh_newstats (int index, int *nextindex) { - boolT isnew= False; - int start, i; - - if (qhstat type[qhstat id[index]] == zdoc) - start= index+1; - else - start= index; - for (i= start; i < qhstat next && qhstat type[qhstat id[i]] != zdoc; i++) { - if (!qh_nostatistic(qhstat id[i]) && !qhstat printed[qhstat id[i]]) - isnew= True; - } - *nextindex= i; - return isnew; -} /* newstats */ - -/*-<a href="qh-stat.htm#TOC" - >-------------------------------</a><a name="nostatistic">-</a> - - qh_nostatistic( index ) - true if no statistic to print -*/ -boolT qh_nostatistic (int i) { - - if ((qhstat type[i] > ZTYPEreal - &&qhstat stats[i].r == qhstat init[(unsigned char)(qhstat type[i])].r) - || (qhstat type[i] < ZTYPEreal - &&qhstat stats[i].i == qhstat init[(unsigned char)(qhstat type[i])].i)) - return True; - return False; -} /* nostatistic */ - -#if qh_KEEPstatistics -/*-<a href="qh-stat.htm#TOC" - >-------------------------------</a><a name="printallstatistics">-</a> - - qh_printallstatistics( fp, string ) - print all statistics with header 'string' -*/ -void qh_printallstatistics (FILE *fp, char *string) { - - qh_allstatistics(); - qh_collectstatistics(); - qh_printstatistics (fp, string); - qh_memstatistics (fp); -} - - -/*-<a href="qh-stat.htm#TOC" - >-------------------------------</a><a name="printstatistics">-</a> - - qh_printstatistics( fp, string ) - print statistics to a file with header 'string' - skips statistics with qhstat.printed[] (reset with qh_allstatistics) - - see: - qh_printallstatistics() -*/ -void qh_printstatistics (FILE *fp, char *string) { - int i, k; - realT ave; - - if (qh num_points != qh num_vertices) { - wval_(Wpbalance)= 0; - wval_(Wpbalance2)= 0; - }else - wval_(Wpbalance2)= qh_stddev (zval_(Zpbalance), wval_(Wpbalance), - wval_(Wpbalance2), &ave); - wval_(Wnewbalance2)= qh_stddev (zval_(Zprocessed), wval_(Wnewbalance), - wval_(Wnewbalance2), &ave); - fprintf (fp, "\n\ -%s\n\ - qhull invoked by: %s | %s\n%s with options:\n%s\n", string, qh rbox_command, - qh qhull_command, qh_VERSION, qh qhull_options); - fprintf (fp, "\nprecision constants:\n\ - %6.2g max. abs. coordinate in the (transformed) input ('Qbd:n')\n\ - %6.2g max. roundoff error for distance computation ('En')\n\ - %6.2g max. roundoff error for angle computations\n\ - %6.2g min. distance for outside points ('Wn')\n\ - %6.2g min. distance for visible facets ('Vn')\n\ - %6.2g max. distance for coplanar facets ('Un')\n\ - %6.2g max. facet width for recomputing centrum and area\n\ -", - qh MAXabs_coord, qh DISTround, qh ANGLEround, qh MINoutside, - qh MINvisible, qh MAXcoplanar, qh WIDEfacet); - if (qh KEEPnearinside) - fprintf(fp, "\ - %6.2g max. distance for near-inside points\n", qh NEARinside); - if (qh premerge_cos < REALmax/2) fprintf (fp, "\ - %6.2g max. cosine for pre-merge angle\n", qh premerge_cos); - if (qh PREmerge) fprintf (fp, "\ - %6.2g radius of pre-merge centrum\n", qh premerge_centrum); - if (qh postmerge_cos < REALmax/2) fprintf (fp, "\ - %6.2g max. cosine for post-merge angle\n", qh postmerge_cos); - if (qh POSTmerge) fprintf (fp, "\ - %6.2g radius of post-merge centrum\n", qh postmerge_centrum); - fprintf (fp, "\ - %6.2g max. distance for merging two simplicial facets\n\ - %6.2g max. roundoff error for arithmetic operations\n\ - %6.2g min. denominator for divisions\n\ - zero diagonal for Gauss: ", qh ONEmerge, REALepsilon, qh MINdenom); - for (k=0; k < qh hull_dim; k++) - fprintf (fp, "%6.2e ", qh NEARzero[k]); - fprintf (fp, "\n\n"); - for (i=0 ; i < qhstat next; ) - qh_printstats (fp, i, &i); -} /* printstatistics */ -#endif /* qh_KEEPstatistics */ - -/*-<a href="qh-stat.htm#TOC" - >-------------------------------</a><a name="printstatlevel">-</a> - - qh_printstatlevel( fp, id ) - print level information for a statistic - - notes: - nop if id >= ZEND, printed, or same as initial value -*/ -void qh_printstatlevel (FILE *fp, int id, int start) { -#define NULLfield " " - - if (id >= ZEND || qhstat printed[id]) - return; - if (qhstat type[id] == zdoc) { - fprintf (fp, "%s\n", qhstat doc[id]); - return; - } - start= 0; /* not used */ - if (qh_nostatistic(id) || !qhstat doc[id]) - return; - qhstat printed[id]= True; - if (qhstat count[id] != -1 - && qhstat stats[(unsigned char)(qhstat count[id])].i == 0) - fprintf (fp, " *0 cnt*"); - else if (qhstat type[id] >= ZTYPEreal && qhstat count[id] == -1) - fprintf (fp, "%7.2g", qhstat stats[id].r); - else if (qhstat type[id] >= ZTYPEreal && qhstat count[id] != -1) - fprintf (fp, "%7.2g", qhstat stats[id].r/ qhstat stats[(unsigned char)(qhstat count[id])].i); - else if (qhstat type[id] < ZTYPEreal && qhstat count[id] == -1) - fprintf (fp, "%7d", qhstat stats[id].i); - else if (qhstat type[id] < ZTYPEreal && qhstat count[id] != -1) - fprintf (fp, "%7.3g", (realT) qhstat stats[id].i / qhstat stats[(unsigned char)(qhstat count[id])].i); - fprintf (fp, " %s\n", qhstat doc[id]); -} /* printstatlevel */ - - -/*-<a href="qh-stat.htm#TOC" - >-------------------------------</a><a name="printstats">-</a> - - qh_printstats( fp, index, nextindex ) - print statistics for a zdoc group - - returns: - next zdoc if non-null -*/ -void qh_printstats (FILE *fp, int index, int *nextindex) { - int j, nexti; - - if (qh_newstats (index, &nexti)) { - fprintf (fp, "\n"); - for (j=index; j<nexti; j++) - qh_printstatlevel (fp, qhstat id[j], 0); - } - if (nextindex) - *nextindex= nexti; -} /* printstats */ - -#if qh_KEEPstatistics - -/*-<a href="qh-stat.htm#TOC" - >-------------------------------</a><a name="stddev">-</a> - - qh_stddev( num, tot, tot2, ave ) - compute the standard deviation and average from statistics - - tot2 is the sum of the squares - notes: - computes r.m.s.: - (x-ave)^2 - == x^2 - 2x tot/num + (tot/num)^2 - == tot2 - 2 tot tot/num + tot tot/num - == tot2 - tot ave -*/ -realT qh_stddev (int num, realT tot, realT tot2, realT *ave) { - realT stddev; - - *ave= tot/num; - stddev= sqrt (tot2/num - *ave * *ave); - return stddev; -} /* stddev */ - -#endif /* qh_KEEPstatistics */ - -#if !qh_KEEPstatistics -void qh_collectstatistics (void) {} -void qh_printallstatistics (FILE *fp, char *string) {}; -void qh_printstatistics (FILE *fp, char *string) {} -#endif - diff --git a/extern/qhull/src/stat.h b/extern/qhull/src/stat.h deleted file mode 100644 index 1dae54ed21d..00000000000 --- a/extern/qhull/src/stat.h +++ /dev/null @@ -1,520 +0,0 @@ - /*<html><pre> -<a href="qh-stat.htm" - >-------------------------------</a><a name="TOP">-</a> - - stat.h - contains all statistics that are collected for qhull - - see qh-stat.htm and stat.c - - copyright (c) 1993-2002, The Geometry Center - - recompile qhull if you change this file - - Integer statistics are Z* while real statistics are W*. - - define maydebugx to call a routine at every statistic event - -*/ - -#ifndef qhDEFstat -#define qhDEFstat 1 - - -/*-<a href="qh-stat.htm#TOC" - >-------------------------------</a><a name="KEEPstatistics">-</a> - - qh_KEEPstatistics - 0 turns off statistic gathering (except zzdef/zzinc/zzadd/zzval/wwval) -*/ -#ifndef qh_KEEPstatistics -#define qh_KEEPstatistics 1 -#endif - -/*-<a href="qh-stat.htm#TOC" - >-------------------------------</a><a name="statistics">-</a> - - Zxxx for integers, Wxxx for reals - - notes: - be sure that all statistics are defined in stat.c - otherwise initialization may core dump - can pick up all statistics by: - grep '[zw].*_[(][ZW]' *.c >z.x - remove trailers with query">-</a> - remove leaders with query-replace-regexp [ ^I]+ ( -*/ -#if qh_KEEPstatistics -enum statistics { /* alphabetical after Z/W */ - Zacoplanar, - Wacoplanarmax, - Wacoplanartot, - Zangle, - Wangle, - Wanglemax, - Wanglemin, - Zangletests, - Wareatot, - Wareamax, - Wareamin, - Zavoidold, - Wavoidoldmax, - Wavoidoldtot, - Zback0, - Zbestcentrum, - Zbestdist, - Zcentrumtests, - Zcheckpart, - Zcomputefurthest, - Zconcave, - Wconcavemax, - Wconcavetot, - Zconcaveridges, - Zconcaveridge, - Zcoplanar, - Wcoplanarmax, - Wcoplanartot, - Zcoplanarangle, - Zcoplanarcentrum, - Zcoplanarhorizon, - Zcoplanarinside, - Zcoplanarpart, - Zcoplanarridges, - Wcpu, - Zcyclefacetmax, - Zcyclefacettot, - Zcyclehorizon, - Zcyclevertex, - Zdegen, - Wdegenmax, - Wdegentot, - Zdegenvertex, - Zdelfacetdup, - Zdelridge, - Zdelvertextot, - Zdelvertexmax, - Zdetsimplex, - Zdistcheck, - Zdistconvex, - Zdistgood, - Zdistio, - Zdistplane, - Zdiststat, - Zdistvertex, - Zdistzero, - Zdoc1, - Zdoc2, - Zdoc3, - Zdoc4, - Zdoc5, - Zdoc6, - Zdoc7, - Zdoc8, - Zdoc9, - Zdoc10, - Zdoc11, - Zdoc12, - Zdropdegen, - Zdropneighbor, - Zdupflip, - Zduplicate, - Wduplicatemax, - Wduplicatetot, - Zdupridge, - Zdupsame, - Zflipped, - Wflippedmax, - Wflippedtot, - Zflippedfacets, - Zfindbest, - Zfindbestmax, - Zfindbesttot, - Zfindcoplanar, - Zfindfail, - Zfindhorizon, - Zfindhorizonmax, - Zfindhorizontot, - Zfindjump, - Zfindnew, - Zfindnewmax, - Zfindnewtot, - Zfindnewjump, - Zfindnewsharp, - Zgauss0, - Zgoodfacet, - Zhashlookup, - Zhashridge, - Zhashridgetest, - Zhashtests, - Zinsidevisible, - Zintersect, - Zintersectfail, - Zintersectmax, - Zintersectnum, - Zintersecttot, - Zmaxneighbors, - Wmaxout, - Wmaxoutside, - Zmaxridges, - Zmaxvertex, - Zmaxvertices, - Zmaxvneighbors, - Zmemfacets, - Zmempoints, - Zmemridges, - Zmemvertices, - Zmergeflipdup, - Zmergehorizon, - Zmergeinittot, - Zmergeinitmax, - Zmergeinittot2, - Zmergeintohorizon, - Zmergenew, - Zmergesettot, - Zmergesetmax, - Zmergesettot2, - Zmergesimplex, - Zmergevertex, - Wmindenom, - Wminvertex, - Zminnorm, - Zmultiridge, - Znearlysingular, - Zneighbor, - Wnewbalance, - Wnewbalance2, - Znewfacettot, - Znewfacetmax, - Znewvertex, - Wnewvertex, - Wnewvertexmax, - Znoarea, - Znonsimplicial, - Znowsimplicial, - Znotgood, - Znotgoodnew, - Znotmax, - Znumfacets, - Znummergemax, - Znummergetot, - Znumneighbors, - Znumridges, - Znumvertices, - Znumvisibility, - Znumvneighbors, - Zonehorizon, - Zpartangle, - Zpartcoplanar, - Zpartflip, - Zparthorizon, - Zpartinside, - Zpartition, - Zpartitionall, - Zpartnear, - Zpbalance, - Wpbalance, - Wpbalance2, - Zpostfacets, - Zpremergetot, - Zprocessed, - Zremvertex, - Zremvertexdel, - Zrenameall, - Zrenamepinch, - Zrenameshare, - Zretry, - Wretrymax, - Zridge, - Wridge, - Wridgemax, - Zridge0, - Wridge0, - Wridge0max, - Zridgemid, - Wridgemid, - Wridgemidmax, - Zridgeok, - Wridgeok, - Wridgeokmax, - Zsearchpoints, - Zsetplane, - Ztestvneighbor, - Ztotcheck, - Ztothorizon, - Ztotmerge, - Ztotpartcoplanar, - Ztotpartition, - Ztotridges, - Ztotvertices, - Ztotvisible, - Ztricoplanar, - Ztricoplanarmax, - Ztricoplanartot, - Ztridegen, - Ztrimirror, - Ztrinull, - Wvertexmax, - Wvertexmin, - Zvertexridge, - Zvertexridgetot, - Zvertexridgemax, - Zvertices, - Zvisfacettot, - Zvisfacetmax, - Zvisvertextot, - Zvisvertexmax, - Zwidefacet, - Zwidevertices, - ZEND}; - -/*-<a href="qh-stat.htm#TOC" - >-------------------------------</a><a name="ZZstat">-</a> - - Zxxx/Wxxx statistics that remain defined if qh_KEEPstatistics=0 - - notes: - be sure to use zzdef, zzinc, etc. with these statistics (no double checking!) -*/ -#else -enum statistics { /* for zzdef etc. macros */ - Zback0, - Zbestdist, - Zcentrumtests, - Zcheckpart, - Zconcaveridges, - Zcoplanarhorizon, - Zcoplanarpart, - Zcoplanarridges, - Zcyclefacettot, - Zcyclehorizon, - Zdelvertextot, - Zdistcheck, - Zdistconvex, - Zdistzero, - Zdoc1, - Zdoc2, - Zdoc3, - Zdoc11, - Zflippedfacets, - Zgauss0, - Zminnorm, - Zmultiridge, - Znearlysingular, - Wnewvertexmax, - Znumvisibility, - Zpartcoplanar, - Zpartition, - Zpartitionall, - Zprocessed, - Zretry, - Zridge, - Wridge, - Wridgemax, - Zridge0, - Wridge0, - Wridge0max, - Zridgemid, - Wridgemid, - Wridgemidmax, - Zridgeok, - Wridgeok, - Wridgeokmax, - Zsetplane, - Ztotmerge, - ZEND}; -#endif - -/*-<a href="qh-stat.htm#TOC" - >-------------------------------</a><a name="ztype">-</a> - - ztype - the type of a statistic sets its initial value. - - notes: - The type should be the same as the macro for collecting the statistic -*/ -enum ztypes {zdoc,zinc,zadd,zmax,zmin,ZTYPEreal,wadd,wmax,wmin,ZTYPEend}; - -/*========== macros and constants =============*/ - -/*-<a href="qh-stat.htm#TOC" - >--------------------------------</a><a name="MAYdebugx">-</a> - - MAYdebugx - define as maydebug() to be called frequently for error trapping -*/ -#define MAYdebugx - -/*-<a href="qh-stat.htm#TOC" - >--------------------------------</a><a name="zdef_">-</a> - - zzdef_, zdef_( type, name, doc, -1) - define a statistic (assumes 'qhstat.next= 0;') - - zdef_( type, name, doc, count) - define an averaged statistic - printed as name/count -*/ -#define zzdef_(stype,name,string,cnt) qhstat id[qhstat next++]=name; \ - qhstat doc[name]= string; qhstat count[name]= cnt; qhstat type[name]= stype -#if qh_KEEPstatistics -#define zdef_(stype,name,string,cnt) qhstat id[qhstat next++]=name; \ - qhstat doc[name]= string; qhstat count[name]= cnt; qhstat type[name]= stype -#else -#define zdef_(type,name,doc,count) -#endif - -/*-<a href="qh-stat.htm#TOC" - >--------------------------------</a><a name="zinc_">-</a> - - zzinc_( name ), zinc_( name) - increment an integer statistic -*/ -#define zzinc_(id) {MAYdebugx; qhstat stats[id].i++;} -#if qh_KEEPstatistics -#define zinc_(id) {MAYdebugx; qhstat stats[id].i++;} -#else -#define zinc_(id) {} -#endif - -/*-<a href="qh-stat.htm#TOC" - >--------------------------------</a><a name="zadd_">-</a> - - zzadd_( name, value ), zadd_( name, value ), wadd_( name, value ) - add value to an integer or real statistic -*/ -#define zzadd_(id, val) {MAYdebugx; qhstat stats[id].i += (val);} -#define wwadd_(id, val) {MAYdebugx; qhstat stats[id].r += (val);} -#if qh_KEEPstatistics -#define zadd_(id, val) {MAYdebugx; qhstat stats[id].i += (val);} -#define wadd_(id, val) {MAYdebugx; qhstat stats[id].r += (val);} -#else -#define zadd_(id, val) {} -#define wadd_(id, val) {} -#endif - -/*-<a href="qh-stat.htm#TOC" - >--------------------------------</a><a name="zval_">-</a> - - zzval_( name ), zval_( name ), wwval_( name ) - set or return value of a statistic -*/ -#define zzval_(id) ((qhstat stats[id]).i) -#define wwval_(id) ((qhstat stats[id]).r) -#if qh_KEEPstatistics -#define zval_(id) ((qhstat stats[id]).i) -#define wval_(id) ((qhstat stats[id]).r) -#else -#define zval_(id) qhstat tempi -#define wval_(id) qhstat tempr -#endif - -/*-<a href="qh-stat.htm#TOC" - >--------------------------------</a><a name="zmax_">-</a> - - zmax_( id, val ), wmax_( id, value ) - maximize id with val -*/ -#define wwmax_(id, val) {MAYdebugx; maximize_(qhstat stats[id].r,(val));} -#if qh_KEEPstatistics -#define zmax_(id, val) {MAYdebugx; maximize_(qhstat stats[id].i,(val));} -#define wmax_(id, val) {MAYdebugx; maximize_(qhstat stats[id].r,(val));} -#else -#define zmax_(id, val) {} -#define wmax_(id, val) {} -#endif - -/*-<a href="qh-stat.htm#TOC" - >--------------------------------</a><a name="zmin_">-</a> - - zmin_( id, val ), wmin_( id, value ) - minimize id with val -*/ -#if qh_KEEPstatistics -#define zmin_(id, val) {MAYdebugx; minimize_(qhstat stats[id].i,(val));} -#define wmin_(id, val) {MAYdebugx; minimize_(qhstat stats[id].r,(val));} -#else -#define zmin_(id, val) {} -#define wmin_(id, val) {} -#endif - -/*================== stat.h types ==============*/ - - -/*-<a href="qh-stat.htm#TOC" - >--------------------------------</a><a name="intrealT">-</a> - - intrealT - union of integer and real, used for statistics -*/ -typedef union intrealT intrealT; /* union of int and realT */ -union intrealT { - int i; - realT r; -}; - -/*-<a href="qh-stat.htm#TOC" - >--------------------------------</a><a name="qhstat">-</a> - - qhstat - global data structure for statistics - - notes: - access to qh_qhstat is via the "qhstat" macro. There are two choices - qh_QHpointer = 1 access globals via a pointer - enables qh_saveqhull() and qh_restoreqhull() - = 0 qh_qhstat is a static data structure - only one instance of qhull() can be active at a time - default value - qh_QHpointer is defined in qhull.h - - allocated in stat.c -*/ -typedef struct qhstatT qhstatT; -#if qh_QHpointer -#define qhstat qh_qhstat-> -extern qhstatT *qh_qhstat; -#else -#define qhstat qh_qhstat. -extern qhstatT qh_qhstat; -#endif -struct qhstatT { - intrealT stats[ZEND]; /* integer and real statistics */ - unsigned char id[ZEND+10]; /* id's in print order */ - char *doc[ZEND]; /* array of documentation strings */ - short int count[ZEND]; /* -1 if none, else index of count to use */ - char type[ZEND]; /* type, see ztypes above */ - char printed[ZEND]; /* true, if statistic has been printed */ - intrealT init[ZTYPEend]; /* initial values by types, set initstatistics */ - - int next; /* next index for zdef_ */ - int precision; /* index for precision problems */ - int vridges; /* index for Voronoi ridges */ - int tempi; - realT tempr; -}; - -/*========== function prototypes ===========*/ - -void qh_allstatA(void); -void qh_allstatB(void); -void qh_allstatC(void); -void qh_allstatD(void); -void qh_allstatE(void); -void qh_allstatE2(void); -void qh_allstatF(void); -void qh_allstatG(void); -void qh_allstatH(void); -void qh_allstatI(void); -void qh_allstatistics (void); -void qh_collectstatistics (void); -void qh_freestatistics (void); -void qh_initstatistics (void); -boolT qh_newstats (int index, int *nextindex); -boolT qh_nostatistic (int i); -void qh_printallstatistics (FILE *fp, char *string); -void qh_printstatistics (FILE *fp, char *string); -void qh_printstatlevel (FILE *fp, int id, int start); -void qh_printstats (FILE *fp, int index, int *nextindex); -realT qh_stddev (int num, realT tot, realT tot2, realT *ave); - -#endif /* qhDEFstat */ diff --git a/extern/qhull/src/unix.c b/extern/qhull/src/unix.c deleted file mode 100644 index 5ec5feab16c..00000000000 --- a/extern/qhull/src/unix.c +++ /dev/null @@ -1,376 +0,0 @@ -/*<html><pre> -<a href="qh-qhull.htm" - >-------------------------------</a><a name="TOP">-</a> - - unix.c - command line interface to qhull - includes SIOUX interface for Macintoshes - - see qh-qhull.htm - - copyright (c) 1993-2002, The Geometry Center -*/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include <math.h> -#include "qhull.h" -#include "mem.h" -#include "qset.h" - -#if __MWERKS__ && __POWERPC__ -#include <SIOUX.h> -#include <Files.h> -#include <console.h> -#include <Desk.h> - -#elif __cplusplus -extern "C" { - int isatty (int); -} - -#elif _MSC_VER -#include <io.h> -#define isatty _isatty - -#else -int isatty (int); /* returns 1 if stdin is a tty - if "Undefined symbol" this can be deleted along with call in main() */ -#endif - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="prompt">-</a> - - qh_prompt - long prompt for qhull - - see: - concise prompt below -*/ -char qh_prompta[]= "\n\ -qhull- compute convex hulls and related structures.\n\ - http://www.geom.umn.edu/software/qhull %s\n\ -\n\ -input (stdin):\n\ - first lines: dimension and number of points (or vice-versa).\n\ - other lines: point coordinates, best if one point per line\n\ - comments: start with a non-numeric character\n\ - halfspaces: use dim plus one and put offset after coefficients.\n\ - May be preceeded by a single interior point ('H').\n\ -\n\ -options:\n\ - d - Delaunay triangulation by lifting points to a paraboloid\n\ - d Qu - furthest-site Delaunay triangulation (upper convex hull)\n\ - v - Voronoi diagram (dual of the Delaunay triangulation)\n\ - v Qu - furthest-site Voronoi diagram\n\ - Hn,n,... - halfspace intersection about point [n,n,0,...]\n\ - Qt - triangulated output\n\ - QJ - joggled input instead of merged facets\n\ - Qc - keep coplanar points with nearest facet\n\ - Qi - keep interior points with nearest facet\n\ -\n\ -Qhull control options:\n\ - Qbk:n - scale coord k so that low bound is n\n\ - QBk:n - scale coord k so that upper bound is n (QBk is %2.2g)\n\ - QbB - scale input to unit cube centered at the origin\n\ - Qbb - scale last coordinate to [0,m] for Delaunay triangulations\n\ - Qbk:0Bk:0 - remove k-th coordinate from input\n\ - QJn - randomly joggle input in range [-n,n]\n\ - QRn - random rotation (n=seed, n=0 time, n=-1 time/no rotate)\n\ -%s%s%s%s"; /* split up qh_prompt for Visual C++ */ -char qh_promptb[]= "\ - Qf - partition point to furthest outside facet\n\ - Qg - only build good facets (needs 'QGn', 'QVn', or 'PdD')\n\ - Qm - only process points that would increase max_outside\n\ - Qr - process random outside points instead of furthest ones\n\ - Qs - search all points for the initial simplex\n\ - Qu - for 'd' or 'v', compute upper hull without point at-infinity\n\ - returns furthest-site Delaunay triangulation\n\ - Qv - test vertex neighbors for convexity\n\ - Qx - exact pre-merges (skips coplanar and angle-coplanar facets)\n\ - Qz - add point-at-infinity to Delaunay triangulation\n\ - QGn - good facet if visible from point n, -n for not visible\n\ - QVn - good facet if it includes point n, -n if not\n\ - Q0 - turn off default premerge with 'C-0'/'Qx'\n\ - Q1 - sort merges by type instead of angle\n\ - Q2 - merge all non-convex at once instead of independent sets\n\ - Q3 - do not merge redundant vertices\n\ - Q4 - avoid old->new merges\n\ - Q5 - do not correct outer planes at end of qhull\n\ - Q6 - do not pre-merge concave or coplanar facets\n\ - Q7 - depth-first processing instead of breadth-first\n\ - Q8 - do not process near-inside points\n\ - Q9 - process furthest of furthest points\n\ - Q10 - no special processing for narrow distributions\n\ - Q11 - copy normals and recompute centrums for tricoplanar facets\n\ -\n\ -"; -char qh_promptc[]= "\ -Topts- Trace options:\n\ - T4 - trace at level n, 4=all, 5=mem/gauss, -1= events\n\ - Tc - check frequently during execution\n\ - Ts - print statistics\n\ - Tv - verify result: structure, convexity, and point inclusion\n\ - Tz - send all output to stdout\n\ - TFn - report summary when n or more facets created\n\ - TI file - input data from file, no spaces or single quotes\n\ - TO file - output results to file, may be enclosed in single quotes\n\ - TPn - turn on tracing when point n added to hull\n\ - TMn - turn on tracing at merge n\n\ - TWn - trace merge facets when width > n\n\ - TRn - rerun qhull n times. Use with 'QJn'\n\ - TVn - stop qhull after adding point n, -n for before (see TCn)\n\ - TCn - stop qhull after building cone for point n (see TVn)\n\ -\n\ -Precision options:\n\ - Cn - radius of centrum (roundoff added). Merge facets if non-convex\n\ - An - cosine of maximum angle. Merge facets if cosine > n or non-convex\n\ - C-0 roundoff, A-0.99/C-0.01 pre-merge, A0.99/C0.01 post-merge\n\ - En - max roundoff error for distance computation\n\ - Rn - randomly perturb computations by a factor of [1-n,1+n]\n\ - Vn - min distance above plane for a visible facet (default 3C-n or En)\n\ - Un - max distance below plane for a new, coplanar point (default Vn)\n\ - Wn - min facet width for outside point (before roundoff, default 2Vn)\n\ -\n\ -Output formats (may be combined; if none, produces a summary to stdout):\n\ - f - facet dump\n\ - G - Geomview output (see below)\n\ - i - vertices incident to each facet\n\ - m - Mathematica output (2-d and 3-d)\n\ - o - OFF format (dim, points and facets; Voronoi regions)\n\ - n - normals with offsets\n\ - p - vertex coordinates or Voronoi vertices (coplanar points if 'Qc')\n\ - s - summary (stderr)\n\ -\n\ -"; -char qh_promptd[]= "\ -More formats:\n\ - Fa - area for each facet\n\ - FA - compute total area and volume for option 's'\n\ - Fc - count plus coplanar points for each facet\n\ - use 'Qc' (default) for coplanar and 'Qi' for interior\n\ - FC - centrum or Voronoi center for each facet\n\ - Fd - use cdd format for input (homogeneous with offset first)\n\ - FD - use cdd format for numeric output (offset first)\n\ - FF - facet dump without ridges\n\ - Fi - inner plane for each facet\n\ - for 'v', separating hyperplanes for bounded Voronoi regions\n\ - FI - ID of each facet\n\ - Fm - merge count for each facet (511 max)\n\ - Fn - count plus neighboring facets for each facet\n\ - FN - count plus neighboring facets for each point\n\ - Fo - outer plane (or max_outside) for each facet\n\ - for 'v', separating hyperplanes for unbounded Voronoi regions\n\ - FO - options and precision constants\n\ - Fp - dim, count, and intersection coordinates (halfspace only)\n\ - FP - nearest vertex and distance for each coplanar point\n\ - FQ - command used for qhull\n\ - Fs - summary: #int (8), dimension, #points, tot vertices, tot facets,\n\ - output: #vertices, #facets, #coplanars, #nonsimplicial\n\ - #real (2), max outer plane, min vertex\n\ - FS - sizes: #int (0)\n\ - #real(2) tot area, tot volume\n\ - Ft - triangulation with centrums for non-simplicial facets (OFF format)\n\ - Fv - count plus vertices for each facet\n\ - for 'v', Voronoi diagram as Voronoi vertices for pairs of sites\n\ - FV - average of vertices (a feasible point for 'H')\n\ - Fx - extreme points (in order for 2-d)\n\ -\n\ -"; -char qh_prompte[]= "\ -Geomview options (2-d, 3-d, and 4-d; 2-d Voronoi)\n\ - Ga - all points as dots\n\ - Gp - coplanar points and vertices as radii\n\ - Gv - vertices as spheres\n\ - Gi - inner planes only\n\ - Gn - no planes\n\ - Go - outer planes only\n\ - Gc - centrums\n\ - Gh - hyperplane intersections\n\ - Gr - ridges\n\ - GDn - drop dimension n in 3-d and 4-d output\n\ - Gt - for 3-d 'd', transparent outer ridges\n\ -\n\ -Print options:\n\ - PAn - keep n largest facets by area\n\ - Pdk:n - drop facet if normal[k] <= n (default 0.0)\n\ - PDk:n - drop facet if normal[k] >= n\n\ - Pg - print good facets (needs 'QGn' or 'QVn')\n\ - PFn - keep facets whose area is at least n\n\ - PG - print neighbors of good facets\n\ - PMn - keep n facets with most merges\n\ - Po - force output. If error, output neighborhood of facet\n\ - Pp - do not report precision problems\n\ -\n\ - . - list of all options\n\ - - - one line descriptions of all options\n\ -"; -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */ - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="prompt2">-</a> - - qh_prompt2 - synopsis for qhull -*/ -char qh_prompt2[]= "\n\ -qhull- compute convex hulls and related structures. %s\n\ - input (stdin): dimension, n, point coordinates\n\ - comments start with a non-numeric character\n\ - halfspace: use dim+1 and put offsets after coefficients\n\ -\n\ -options (qh-quick.htm):\n\ - d - Delaunay triangulation by lifting points to a paraboloid\n\ - d Qu - furthest-site Delaunay triangulation (upper convex hull)\n\ - v - Voronoi diagram as the dual of the Delaunay triangulation\n\ - v Qu - furthest-site Voronoi diagram\n\ - H1,1 - Halfspace intersection about [1,1,0,...] via polar duality\n\ - Qt - triangulated output\n\ - QJ - joggled input instead of merged facets\n\ - Tv - verify result: structure, convexity, and point inclusion\n\ - . - concise list of all options\n\ - - - one-line description of all options\n\ -\n\ -Output options (subset):\n\ - s - summary of results (default)\n\ - i - vertices incident to each facet\n\ - n - normals with offsets\n\ - p - vertex coordinates (if 'Qc', includes coplanar points)\n\ - if 'v', Voronoi vertices\n\ - Fp - halfspace intersections\n\ - Fx - extreme points (convex hull vertices)\n\ - FA - compute total area and volume\n\ - o - OFF format (if 'v', outputs Voronoi regions)\n\ - G - Geomview output (2-d, 3-d and 4-d)\n\ - m - Mathematica output (2-d and 3-d)\n\ - QVn - print facets that include point n, -n if not\n\ - TO file- output results to file, may be enclosed in single quotes\n\ -\n\ -examples:\n\ - rbox c d D2 | qhull Qc s f Fx | more rbox 1000 s | qhull Tv s FA\n\ - rbox 10 D2 | qhull d QJ s i TO result rbox 10 D2 | qhull v QJ p\n\ - rbox 10 D2 | qhull d Qu QJ m rbox 10 D2 | qhull v Qu QJ o\n\ - rbox c | qhull n rbox c | qhull FV n | qhull H Fp\n\ - rbox d D12 | qhull QR0 FA rbox c D7 | qhull FA TF1000\n\ - rbox y 1000 W0 | qhull rbox 10 | qhull v QJ o Fv\n\ -\n\ -"; -/* for opts, don't assign 'e' or 'E' to a flag (already used for exponent) */ - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="prompt3">-</a> - - qh_prompt3 - concise prompt for qhull -*/ -char qh_prompt3[]= "\n\ -Qhull %s.\n\ -Except for 'F.' and 'PG', upper-case options take an argument.\n\ -\n\ - delaunay voronoi Geomview Halfspace facet_dump\n\ - incidences mathematica normals OFF_format points\n\ - summary\n\ -\n\ - Farea FArea-total Fcoplanars FCentrums Fd-cdd-in\n\ - FD-cdd-out FF-dump-xridge Finner FIDs Fmerges\n\ - Fneighbors FNeigh-vertex Fouter FOptions Fpoint-intersect\n\ - FPoint_near FQhull Fsummary FSize Ftriangles\n\ - Fvertices Fvoronoi FVertex-ave Fxtremes\n\ -\n\ - Gvertices Gpoints Gall_points Gno_planes Ginner\n\ - Gcentrums Ghyperplanes Gridges Gouter GDrop_dim\n\ - Gtransparent\n\ -\n\ - PArea-keep Pdrop d0:0D0 Pgood PFacet_area_keep\n\ - PGood_neighbors PMerge-keep Poutput_forced Pprecision_not\n\ -\n\ - QbBound 0:0.5 Qbk:0Bk:0_drop QbB-scale-box Qbb-scale-last Qcoplanar\n\ - Qfurthest Qgood_only QGood_point Qinterior Qmax_out\n\ - QJoggle Qrandom QRotate Qsearch_1st Qtriangulate\n\ - QupperDelaunay QVertex_good Qvneighbors Qxact_merge Qzinfinite\n\ -\n\ - Q0_no_premerge Q1_no_angle Q2_no_independ Q3_no_redundant Q4_no_old\n\ - Q5_no_check_out Q6_no_concave Q7_depth_first Q8_no_near_in Q9_pick_furthest\n\ - Q10_no_narrow Q11_trinormals\n\ -\n\ - T4_trace Tcheck_often Tstatistics Tverify Tz_stdout\n\ - TFacet_log TInput_file TPoint_trace TMerge_trace TOutput_file\n\ - TRerun TWide_trace TVertex_stop TCone_stop\n\ -\n\ - Angle_max Centrum_size Error_round Random_dist Visible_min\n\ - Ucoplanar_max Wide_outside\n\ -"; - -/*-<a href="qh-qhull.htm#TOC" - >-------------------------------</a><a name="main">-</a> - - main( argc, argv ) - processes the command line, calls qhull() to do the work, and exits - - design: - initializes data structures - reads points - finishes initialization - computes convex hull and other structures - checks the result - writes the output - frees memory -*/ -int main(int argc, char *argv[]) { - int curlong, totlong; /* used !qh_NOmem */ - int exitcode, numpoints, dim; - coordT *points; - boolT ismalloc; - -#if __MWERKS__ && __POWERPC__ - char inBuf[BUFSIZ], outBuf[BUFSIZ], errBuf[BUFSIZ]; - SIOUXSettings.showstatusline= false; - SIOUXSettings.tabspaces= 1; - SIOUXSettings.rows= 40; - if (setvbuf (stdin, inBuf, _IOFBF, sizeof(inBuf)) < 0 /* w/o, SIOUX I/O is slow*/ - || setvbuf (stdout, outBuf, _IOFBF, sizeof(outBuf)) < 0 - || (stdout != stderr && setvbuf (stderr, errBuf, _IOFBF, sizeof(errBuf)) < 0)) - fprintf (stderr, "qhull internal warning (main): could not change stdio to fully buffered.\n"); - argc= ccommand(&argv); -#endif - - if ((argc == 1) && isatty( 0 /*stdin*/)) { - fprintf(stdout, qh_prompt2, qh_VERSION); - exit(qh_ERRnone); - } - if (argc > 1 && *argv[1] == '-' && !*(argv[1]+1)) { - fprintf(stdout, qh_prompta, qh_VERSION, qh_DEFAULTbox, - qh_promptb, qh_promptc, qh_promptd, qh_prompte); - exit(qh_ERRnone); - } - if (argc >1 && *argv[1] == '.' && !*(argv[1]+1)) { - fprintf(stdout, qh_prompt3, qh_VERSION); - exit(qh_ERRnone); - } - qh_init_A (stdin, stdout, stderr, argc, argv); /* sets qh qhull_command */ - exitcode= setjmp (qh errexit); /* simple statement for CRAY J916 */ - if (!exitcode) { - qh_initflags (qh qhull_command); - points= qh_readpoints (&numpoints, &dim, &ismalloc); - qh_init_B (points, numpoints, dim, ismalloc); - qh_qhull(); - qh_check_output(); - qh_produce_output(); - if (qh VERIFYoutput && !qh FORCEoutput && !qh STOPpoint && !qh STOPcone) - qh_check_points(); - exitcode= qh_ERRnone; - } - qh NOerrexit= True; /* no more setjmp */ -#ifdef qh_NOmem - qh_freeqhull( True); -#else - qh_freeqhull( False); - qh_memfreeshort (&curlong, &totlong); - if (curlong || totlong) - fprintf (stderr, "qhull internal warning (main): did not free %d bytes of long memory (%d pieces)\n", - totlong, curlong); -#endif - return exitcode; -} /* main */ - diff --git a/extern/qhull/src/user.c b/extern/qhull/src/user.c deleted file mode 100644 index 94b31aaf99f..00000000000 --- a/extern/qhull/src/user.c +++ /dev/null @@ -1,324 +0,0 @@ -/*<html><pre> -<a href="qh-user.htm" - >-------------------------------</a><a name="TOP">-</a> - - user.c - user redefinable functions - - see README.txt see COPYING.txt for copyright information. - - see qhull.h for data structures, macros, and user-callable functions. - - see user_eg.c, unix.c, and qhull_interface.cpp for examples. - - see user.h for user-definable constants - - use qh_NOmem in mem.h to turn off memory management - use qh_NOmerge in user.h to turn off facet merging - set qh_KEEPstatistics in user.h to 0 to turn off statistics - - This is unsupported software. You're welcome to make changes, - but you're on your own if something goes wrong. Use 'Tc' to - check frequently. Usually qhull will report an error if - a data structure becomes inconsistent. If so, it also reports - the last point added to the hull, e.g., 102. You can then trace - the execution of qhull with "T4P102". - - Please report any errors that you fix to qhull@geom.umn.edu - - call_qhull is a template for calling qhull from within your application - - if you recompile and load this module, then user.o will not be loaded - from qhull.a - - you can add additional quick allocation sizes in qh_user_memsizes - - if the other functions here are redefined to not use qh_print..., - then io.o will not be loaded from qhull.a. See user_eg.c for an - example. We recommend keeping io.o for the extra debugging - information it supplies. -*/ - -#include "qhull_a.h" - -/*-<a href="qh-user.htm#TOC" - >-------------------------------</a><a name="call_qhull">-</a> - - qh_call_qhull( void ) - template for calling qhull from inside your program - remove #if 0, #endif to compile - - returns: - exit code (see qh_ERR... in qhull.h) - all memory freed - - notes: - This can be called any number of times. - - see: - qh_call_qhull_once() - -*/ -#if 0 -{ - int dim; /* dimension of points */ - int numpoints; /* number of points */ - coordT *points; /* array of coordinates for each point */ - boolT ismalloc; /* True if qhull should free points in qh_freeqhull() or reallocation */ - char flags[]= "qhull Tv"; /* option flags for qhull, see qh_opt.htm */ - FILE *outfile= stdout; /* output from qh_produce_output() - use NULL to skip qh_produce_output() */ - FILE *errfile= stderr; /* error messages from qhull code */ - int exitcode; /* 0 if no error from qhull */ - facetT *facet; /* set by FORALLfacets */ - int curlong, totlong; /* memory remaining after qh_memfreeshort */ - - /* initialize dim, numpoints, points[], ismalloc here */ - exitcode= qh_new_qhull (dim, numpoints, points, ismalloc, - flags, outfile, errfile); - if (!exitcode) { /* if no error */ - /* 'qh facet_list' contains the convex hull */ - FORALLfacets { - /* ... your code ... */ - } - } - qh_freeqhull(!qh_ALL); - qh_memfreeshort (&curlong, &totlong); - if (curlong || totlong) - fprintf (errfile, "qhull internal warning (main): did not free %d bytes of long memory (%d pieces)\n", totlong, curlong); -} -#endif - -/*-<a href="qh-user.htm#TOC" - >-------------------------------</a><a name="new_qhull">-</a> - - qh_new_qhull( dim, numpoints, points, ismalloc, qhull_cmd, outfile, errfile ) - build new qhull data structure and return exitcode (0 if no errors) - - notes: - do not modify points until finished with results. - The qhull data structure contains pointers into the points array. - do not call qhull functions before qh_new_qhull(). - The qhull data structure is not initialized until qh_new_qhull(). - - outfile may be null - qhull_cmd must start with "qhull " - projects points to a new point array for Delaunay triangulations ('d' and 'v') - transforms points into a new point array for halfspace intersection ('H') - - - To allow multiple, concurrent calls to qhull() - - set qh_QHpointer in user.h - - use qh_save_qhull and qh_restore_qhull to swap the global data structure between calls. - - use qh_freeqhull(qh_ALL) to free intermediate convex hulls - - see: - user_eg.c for an example -*/ -int qh_new_qhull (int dim, int numpoints, coordT *points, boolT ismalloc, - char *qhull_cmd, FILE *outfile, FILE *errfile) { - int exitcode, hulldim; - boolT new_ismalloc; - static boolT firstcall = True; - coordT *new_points; - - if (firstcall) { - qh_meminit (errfile); - firstcall= False; - } - if (strncmp (qhull_cmd,"qhull ", 6)) { - fprintf (errfile, "qh_new_qhull: start qhull_cmd argument with \"qhull \"\n"); - exit(1); - } - qh_initqhull_start (NULL, outfile, errfile); - trace1(( qh ferr, "qh_new_qhull: build new Qhull for %d %d-d points with %s\n", numpoints, dim, qhull_cmd)); - exitcode = setjmp (qh errexit); - if (!exitcode) - { - qh NOerrexit = False; - qh_initflags (qhull_cmd); - if (qh DELAUNAY) - qh PROJECTdelaunay= True; - if (qh HALFspace) { - /* points is an array of halfspaces, - the last coordinate of each halfspace is its offset */ - hulldim= dim-1; - qh_setfeasible (hulldim); - new_points= qh_sethalfspace_all (dim, numpoints, points, qh feasible_point); - new_ismalloc= True; - if (ismalloc) - free (points); - }else { - hulldim= dim; - new_points= points; - new_ismalloc= ismalloc; - } - qh_init_B (new_points, numpoints, hulldim, new_ismalloc); - qh_qhull(); - qh_check_output(); - if (outfile) - qh_produce_output(); - if (qh VERIFYoutput && !qh STOPpoint && !qh STOPcone) - qh_check_points(); - } - qh NOerrexit = True; - return exitcode; -} /* new_qhull */ - -/*-<a href="qh-user.htm#TOC" - >-------------------------------</a><a name="errexit">-</a> - - qh_errexit( exitcode, facet, ridge ) - report and exit from an error - report facet and ridge if non-NULL - reports useful information such as last point processed - set qh.FORCEoutput to print neighborhood of facet - - see: - qh_errexit2() in qhull.c for printing 2 facets - - design: - check for error within error processing - compute qh.hulltime - print facet and ridge (if any) - report commandString, options, qh.furthest_id - print summary and statistics (including precision statistics) - if qh_ERRsingular - print help text for singular data set - exit program via long jump (if defined) or exit() -*/ -void qh_errexit(int exitcode, facetT *facet, ridgeT *ridge) { - - if (qh ERREXITcalled) { - fprintf (qh ferr, "\nqhull error while processing previous error. Exit program\n"); - exit(1); - } - qh ERREXITcalled= True; - if (!qh QHULLfinished) - qh hulltime= qh_CPUclock - qh hulltime; - qh_errprint("ERRONEOUS", facet, NULL, ridge, NULL); - fprintf (qh ferr, "\nWhile executing: %s | %s\n", qh rbox_command, qh qhull_command); - fprintf(qh ferr, "Options selected for Qhull %s:\n%s\n", qh_VERSION, qh qhull_options); - if (qh furthest_id >= 0) { - fprintf(qh ferr, "Last point added to hull was p%d.", qh furthest_id); - if (zzval_(Ztotmerge)) - fprintf(qh ferr, " Last merge was #%d.", zzval_(Ztotmerge)); - if (qh QHULLfinished) - fprintf(qh ferr, "\nQhull has finished constructing the hull."); - else if (qh POSTmerging) - fprintf(qh ferr, "\nQhull has started post-merging."); - fprintf (qh ferr, "\n"); - } - if (qh FORCEoutput && (qh QHULLfinished || (!facet && !ridge))) - qh_produce_output(); - else { - if (exitcode != qh_ERRsingular && zzval_(Zsetplane) > qh hull_dim+1) { - fprintf (qh ferr, "\nAt error exit:\n"); - qh_printsummary (qh ferr); - if (qh PRINTstatistics) { - qh_collectstatistics(); - qh_printstatistics(qh ferr, "at error exit"); - qh_memstatistics (qh ferr); - } - } - if (qh PRINTprecision) - qh_printstats (qh ferr, qhstat precision, NULL); - } - if (!exitcode) - exitcode= qh_ERRqhull; - else if (exitcode == qh_ERRsingular) - qh_printhelp_singular(qh ferr); - else if (exitcode == qh_ERRprec && !qh PREmerge) - qh_printhelp_degenerate (qh ferr); - if (qh NOerrexit) { - fprintf (qh ferr, "qhull error while ending program. Exit program\n"); - exit(1); - } - qh NOerrexit= True; - longjmp(qh errexit, exitcode); -} /* errexit */ - - -/*-<a href="qh-user.htm#TOC" - >-------------------------------</a><a name="errprint">-</a> - - qh_errprint( fp, string, atfacet, otherfacet, atridge, atvertex ) - prints out the information of facets and ridges to fp - also prints neighbors and geomview output - - notes: - except for string, any parameter may be NULL -*/ -void qh_errprint(char *string, facetT *atfacet, facetT *otherfacet, ridgeT *atridge, vertexT *atvertex) { - int i; - - if (atfacet) { - fprintf(qh ferr, "%s FACET:\n", string); - qh_printfacet(qh ferr, atfacet); - } - if (otherfacet) { - fprintf(qh ferr, "%s OTHER FACET:\n", string); - qh_printfacet(qh ferr, otherfacet); - } - if (atridge) { - fprintf(qh ferr, "%s RIDGE:\n", string); - qh_printridge(qh ferr, atridge); - if (atridge->top && atridge->top != atfacet && atridge->top != otherfacet) - qh_printfacet(qh ferr, atridge->top); - if (atridge->bottom - && atridge->bottom != atfacet && atridge->bottom != otherfacet) - qh_printfacet(qh ferr, atridge->bottom); - if (!atfacet) - atfacet= atridge->top; - if (!otherfacet) - otherfacet= otherfacet_(atridge, atfacet); - } - if (atvertex) { - fprintf(qh ferr, "%s VERTEX:\n", string); - qh_printvertex (qh ferr, atvertex); - } - if (qh fout && qh FORCEoutput && atfacet && !qh QHULLfinished && !qh IStracing) { - fprintf(qh ferr, "ERRONEOUS and NEIGHBORING FACETS to output\n"); - for (i= 0; i < qh_PRINTEND; i++) /* use fout for geomview output */ - qh_printneighborhood (qh fout, qh PRINTout[i], atfacet, otherfacet, - !qh_ALL); - } -} /* errprint */ - - -/*-<a href="qh-user.htm#TOC" - >-------------------------------</a><a name="printfacetlist">-</a> - - qh_printfacetlist( fp, facetlist, facets, printall ) - print all fields for a facet list and/or set of facets to fp - if !printall, - only prints good facets - - notes: - also prints all vertices -*/ -void qh_printfacetlist(facetT *facetlist, setT *facets, boolT printall) { - facetT *facet, **facetp; - - qh_printbegin (qh ferr, qh_PRINTfacets, facetlist, facets, printall); - FORALLfacet_(facetlist) - qh_printafacet(qh ferr, qh_PRINTfacets, facet, printall); - FOREACHfacet_(facets) - qh_printafacet(qh ferr, qh_PRINTfacets, facet, printall); - qh_printend (qh ferr, qh_PRINTfacets, facetlist, facets, printall); -} /* printfacetlist */ - - -/*-<a href="qh-globa.htm#TOC" - >-------------------------------</a><a name="user_memsizes">-</a> - - qh_user_memsizes() - allocate up to 10 additional, quick allocation sizes - - notes: - increase maximum number of allocations in qh_initqhull_mem() -*/ -void qh_user_memsizes (void) { - - /* qh_memsize (size); */ -} /* user_memsizes */ - diff --git a/extern/qhull/src/user.h b/extern/qhull/src/user.h deleted file mode 100644 index 79558967a52..00000000000 --- a/extern/qhull/src/user.h +++ /dev/null @@ -1,762 +0,0 @@ -/*<html><pre> -<a href="qh-user.htm" - >-------------------------------</a><a name="TOP">-</a> - - user.h - user redefinable constants - - see qh-user.htm. see COPYING for copyright information. - - before reading any code, review qhull.h for data structure definitions and - the "qh" macro. -*/ - -#ifndef qhDEFuser -#define qhDEFuser 1 - -/*============= data types and configuration macros ==========*/ - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="realT">-</a> - - realT - set the size of floating point numbers - - qh_REALdigits - maximimum number of significant digits - - qh_REAL_1, qh_REAL_2n, qh_REAL_3n - format strings for printf - - qh_REALmax, qh_REALmin - maximum and minimum (near zero) values - - qh_REALepsilon - machine roundoff. Maximum roundoff error for addition and multiplication. - - notes: - Select whether to store floating point numbers in single precision (float) - or double precision (double). - - Use 'float' to save about 8% in time and 25% in space. This is particularly - help if high-d where convex hulls are space limited. Using 'float' also - reduces the printed size of Qhull's output since numbers have 8 digits of - precision. - - Use 'double' when greater arithmetic precision is needed. This is needed - for Delaunay triangulations and Voronoi diagrams when you are not merging - facets. - - If 'double' gives insufficient precision, your data probably includes - degeneracies. If so you should use facet merging (done by default) - or exact arithmetic (see imprecision section of manual, qh-impre.htm). - You may also use option 'Po' to force output despite precision errors. - - You may use 'long double', but many format statements need to be changed - and you may need a 'long double' square root routine. S. Grundmann - (sg@eeiwzb.et.tu-dresden.de) has done this. He reports that the code runs - much slower with little gain in precision. - - WARNING: on some machines, int f(){realT a= REALmax;return (a == REALmax);} - returns False. Use (a > REALmax/2) instead of (a == REALmax). - - REALfloat = 1 all numbers are 'float' type - = 0 all numbers are 'double' type -*/ -#define REALfloat 0 - -#if (REALfloat == 1) -#define realT float -#define REALmax FLT_MAX -#define REALmin FLT_MIN -#define REALepsilon FLT_EPSILON -#define qh_REALdigits 8 /* maximum number of significant digits */ -#define qh_REAL_1 "%6.8g " -#define qh_REAL_2n "%6.8g %6.8g\n" -#define qh_REAL_3n "%6.8g %6.8g %6.8g\n" - -#elif (REALfloat == 0) -#define realT double -#define REALmax DBL_MAX -#define REALmin DBL_MIN -#define REALepsilon DBL_EPSILON -#define qh_REALdigits 16 /* maximum number of significant digits */ -#define qh_REAL_1 "%6.16g " -#define qh_REAL_2n "%6.16g %6.16g\n" -#define qh_REAL_3n "%6.16g %6.16g %6.16g\n" - -#else -#error unknown float option -#endif - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="CPUclock">-</a> - - qh_CPUclock - define the clock() function for reporting the total time spent by Qhull - returns CPU ticks as a 'long int' - qh_CPUclock is only used for reporting the total time spent by Qhull - - qh_SECticks - the number of clock ticks per second - - notes: - looks for CLOCKS_PER_SEC, CLOCKS_PER_SECOND, or assumes microseconds - to define a custom clock, set qh_CLOCKtype to 0 - - if your system does not use clock() to return CPU ticks, replace - qh_CPUclock with the corresponding function. It is converted - to unsigned long to prevent wrap-around during long runs. - - - Set qh_CLOCKtype to - - 1 for CLOCKS_PER_SEC, CLOCKS_PER_SECOND, or microsecond - Note: may fail if more than 1 hour elapsed time - - 2 use qh_clock() with POSIX times() (see global.c) -*/ -#define qh_CLOCKtype 1 /* change to the desired number */ - -#if (qh_CLOCKtype == 1) - -#if defined (CLOCKS_PER_SECOND) -#define qh_CPUclock ((unsigned long)clock()) /* return CPU clock */ -#define qh_SECticks CLOCKS_PER_SECOND - -#elif defined (CLOCKS_PER_SEC) -#define qh_CPUclock ((unsigned long)clock()) /* return CPU clock */ -#define qh_SECticks CLOCKS_PER_SEC - -#elif defined (CLK_TCK) -#define qh_CPUclock ((unsigned long)clock()) /* return CPU clock */ -#define qh_SECticks CLK_TCK - -#else -#define qh_CPUclock ((unsigned long)clock()) /* return CPU clock */ -#define qh_SECticks 1E6 -#endif - -#elif (qh_CLOCKtype == 2) -#define qh_CPUclock qh_clock() /* return CPU clock */ -#define qh_SECticks 100 - -#else /* qh_CLOCKtype == ? */ -#error unknown clock option -#endif - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="RANDOM">-</a> - - qh_RANDOMtype, qh_RANDOMmax, qh_RANDOMseed - define random number generator - - qh_RANDOMint generates a random integer between 0 and qh_RANDOMmax. - qh_RANDOMseed sets the random number seed for qh_RANDOMint - - Set qh_RANDOMtype (default 5) to: - 1 for random() with 31 bits (UCB) - 2 for rand() with RAND_MAX or 15 bits (system 5) - 3 for rand() with 31 bits (Sun) - 4 for lrand48() with 31 bits (Solaris) - 5 for qh_rand() with 31 bits (included with Qhull) - - notes: - Random numbers are used by rbox to generate point sets. Random - numbers are used by Qhull to rotate the input ('QRn' option), - simulate a randomized algorithm ('Qr' option), and to simulate - roundoff errors ('Rn' option). - - Random number generators differ between systems. Most systems provide - rand() but the period varies. The period of rand() is not critical - since qhull does not normally use random numbers. - - The default generator is Park & Miller's minimal standard random - number generator [CACM 31:1195 '88]. It is included with Qhull. - - If qh_RANDOMmax is wrong, qhull will report a warning and Geomview - output will likely be invisible. -*/ -#define qh_RANDOMtype 5 /* *** change to the desired number *** */ - -#if (qh_RANDOMtype == 1) -#define qh_RANDOMmax ((realT)0x7fffffffUL) /* 31 bits, random()/MAX */ -#define qh_RANDOMint random() -#define qh_RANDOMseed_(seed) srandom(seed); - -#elif (qh_RANDOMtype == 2) -#ifdef RAND_MAX -#define qh_RANDOMmax ((realT)RAND_MAX) -#else -#define qh_RANDOMmax ((realT)32767) /* 15 bits (System 5) */ -#endif -#define qh_RANDOMint rand() -#define qh_RANDOMseed_(seed) srand((unsigned)seed); - -#elif (qh_RANDOMtype == 3) -#define qh_RANDOMmax ((realT)0x7fffffffUL) /* 31 bits, Sun */ -#define qh_RANDOMint rand() -#define qh_RANDOMseed_(seed) srand((unsigned)seed); - -#elif (qh_RANDOMtype == 4) -#define qh_RANDOMmax ((realT)0x7fffffffUL) /* 31 bits, lrand38()/MAX */ -#define qh_RANDOMint lrand48() -#define qh_RANDOMseed_(seed) srand48(seed); - -#elif (qh_RANDOMtype == 5) -#define qh_RANDOMmax ((realT)2147483646UL) /* 31 bits, qh_rand/MAX */ -#define qh_RANDOMint qh_rand() -#define qh_RANDOMseed_(seed) qh_srand(seed); -/* unlike rand(), never returns 0 */ - -#else -#error: unknown random option -#endif - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="ORIENTclock">-</a> - - qh_ORIENTclock - 0 for inward pointing normals by Geomview convention -*/ -#define qh_ORIENTclock 0 - - -/*========= performance related constants =========*/ - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="HASHfactor">-</a> - - qh_HASHfactor - total hash slots / used hash slots. Must be at least 1.1. - - notes: - =2 for at worst 50% occupancy for qh hash_table and normally 25% occupancy -*/ -#define qh_HASHfactor 2 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="VERIFYdirect">-</a> - - qh_VERIFYdirect - with 'Tv' verify all points against all facets if op count is smaller - - notes: - if greater, calls qh_check_bestdist() instead -*/ -#define qh_VERIFYdirect 1000000 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="INITIALsearch">-</a> - - qh_INITIALsearch - if qh_INITIALmax, search points up to this dimension -*/ -#define qh_INITIALsearch 6 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="INITIALmax">-</a> - - qh_INITIALmax - if dim >= qh_INITIALmax, use min/max coordinate points for initial simplex - - notes: - from points with non-zero determinants - use option 'Qs' to override (much slower) -*/ -#define qh_INITIALmax 8 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="JOGGLEdefault">-</a> - - qh_JOGGLEdefault - default qh.JOGGLEmax is qh.DISTround * qh_JOGGLEdefault - - notes: - rbox s r 100 | qhull QJ1e-15 QR0 generates 90% faults at distround 7e-16 - rbox s r 100 | qhull QJ1e-14 QR0 generates 70% faults - rbox s r 100 | qhull QJ1e-13 QR0 generates 35% faults - rbox s r 100 | qhull QJ1e-12 QR0 generates 8% faults - rbox s r 100 | qhull QJ1e-11 QR0 generates 1% faults - rbox s r 100 | qhull QJ1e-10 QR0 generates 0% faults - rbox 1000 W0 | qhull QJ1e-12 QR0 generates 86% faults - rbox 1000 W0 | qhull QJ1e-11 QR0 generates 20% faults - rbox 1000 W0 | qhull QJ1e-10 QR0 generates 2% faults - the later have about 20 points per facet, each of which may interfere - - pick a value large enough to avoid retries on most inputs -*/ -#define qh_JOGGLEdefault 30000.0 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="JOGGLEincrease">-</a> - - qh_JOGGLEincrease - factor to increase qh.JOGGLEmax on qh_JOGGLEretry or qh_JOGGLEagain -*/ -#define qh_JOGGLEincrease 10.0 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="JOGGLEretry">-</a> - - qh_JOGGLEretry - if ZZretry = qh_JOGGLEretry, increase qh.JOGGLEmax - - notes: - try twice at the original value in case of bad luck the first time -*/ -#define qh_JOGGLEretry 2 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="JOGGLEagain">-</a> - - qh_JOGGLEagain - every following qh_JOGGLEagain, increase qh.JOGGLEmax - - notes: - 1 is OK since it's already failed qh_JOGGLEretry times -*/ -#define qh_JOGGLEagain 1 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="JOGGLEmaxincrease">-</a> - - qh_JOGGLEmaxincrease - maximum qh.JOGGLEmax due to qh_JOGGLEincrease - relative to qh.MAXwidth - - notes: - qh.joggleinput will retry at this value until qh_JOGGLEmaxretry -*/ -#define qh_JOGGLEmaxincrease 1e-2 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="JOGGLEmaxretry">-</a> - - qh_JOGGLEmaxretry - stop after qh_JOGGLEmaxretry attempts -*/ -#define qh_JOGGLEmaxretry 100 - -/*========= memory constants =========*/ - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="MEMalign">-</a> - - qh_MEMalign - memory alignment for qh_meminitbuffers() in global.c - - notes: - to avoid bus errors, memory allocation must consider alignment requirements. - malloc() automatically takes care of alignment. Since mem.c manages - its own memory, we need to explicitly specify alignment in - qh_meminitbuffers(). - - A safe choice is sizeof(double). sizeof(float) may be used if doubles - do not occur in data structures and pointers are the same size. Be careful - of machines (e.g., DEC Alpha) with large pointers. - - If using gcc, best alignment is - #define qh_MEMalign fmax_(__alignof__(realT),__alignof__(void *)) -*/ -#define qh_MEMalign fmax_(sizeof(realT), sizeof(void *)) - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="MEMbufsize">-</a> - - qh_MEMbufsize - size of additional memory buffers - - notes: - used for qh_meminitbuffers() in global.c -*/ -#define qh_MEMbufsize 0x10000 /* allocate 64K memory buffers */ - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="MEMinitbuf">-</a> - - qh_MEMinitbuf - size of initial memory buffer - - notes: - use for qh_meminitbuffers() in global.c -*/ -#define qh_MEMinitbuf 0x20000 /* initially allocate 128K buffer */ - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="INFINITE">-</a> - - qh_INFINITE - on output, indicates Voronoi center at infinity -*/ -#define qh_INFINITE -10.101 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="DEFAULTbox">-</a> - - qh_DEFAULTbox - default box size (Geomview expects 0.5) -*/ -#define qh_DEFAULTbox 0.5 - -/*======= conditional compilation ============================*/ - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="compiler">-</a> - - __cplusplus - defined by C++ compilers - - __MSC_VER - defined by Microsoft Visual C++ - - __MWERKS__ && __POWERPC__ - defined by Metrowerks when compiling for the Power Macintosh - - __STDC__ - defined for strict ANSI C -*/ - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="COMPUTEfurthest">-</a> - - qh_COMPUTEfurthest - compute furthest distance to an outside point instead of storing it with the facet - =1 to compute furthest - - notes: - computing furthest saves memory but costs time - about 40% more distance tests for partitioning - removes facet->furthestdist -*/ -#define qh_COMPUTEfurthest 0 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="KEEPstatistics">-</a> - - qh_KEEPstatistics - =0 removes most of statistic gathering and reporting - - notes: - if 0, code size is reduced by about 4%. -*/ -#define qh_KEEPstatistics 1 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="MAXoutside">-</a> - - qh_MAXoutside - record outer plane for each facet - =1 to record facet->maxoutside - - notes: - this takes a realT per facet and slightly slows down qhull - it produces better outer planes for geomview output -*/ -#define qh_MAXoutside 1 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="NOmerge">-</a> - - qh_NOmerge - disables facet merging if defined - - notes: - This saves about 10% space. - - Unless 'Q0' - qh_NOmerge sets 'QJ' to avoid precision errors - - #define qh_NOmerge - - see: - <a href="mem.h#NOmem">qh_NOmem</a> in mem.c - - see user.c/user_eg.c for removing io.o -*/ - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="NOtrace">-</a> - - qh_NOtrace - no tracing if defined - - notes: - This saves about 5% space. - - #define qh_NOtrace -*/ - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="QHpointer">-</a> - - qh_QHpointer - access global data with pointer or static structure - - qh_QHpointer = 1 access globals via a pointer to allocated memory - enables qh_saveqhull() and qh_restoreqhull() - costs about 8% in time and 2% in space - - = 0 qh_qh and qh_qhstat are static data structures - only one instance of qhull() can be active at a time - default value - - notes: - all global variables for qhull are in qh, qhmem, and qhstat - qh is defined in qhull.h - qhmem is defined in mem.h - qhstat is defined in stat.h - - see: - user_eg.c for an example -*/ -#define qh_QHpointer 0 -#if 0 /* sample code */ - qhT *oldqhA, *oldqhB; - - exitcode= qh_new_qhull (dim, numpoints, points, ismalloc, - flags, outfile, errfile); - /* use results from first call to qh_new_qhull */ - oldqhA= qh_save_qhull(); - exitcode= qh_new_qhull (dimB, numpointsB, pointsB, ismalloc, - flags, outfile, errfile); - /* use results from second call to qh_new_qhull */ - oldqhB= qh_save_qhull(); - qh_restore_qhull (&oldqhA); - /* use results from first call to qh_new_qhull */ - qh_freeqhull (qh_ALL); /* frees all memory used by first call */ - qh_restore_qhull (&oldqhB); - /* use results from second call to qh_new_qhull */ - qh_freeqhull (!qh_ALL); /* frees long memory used by second call */ - qh_memfreeshort (&curlong, &totlong); /* frees short memory and memory allocator */ -#endif - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="QUICKhelp">-</a> - - qh_QUICKhelp - =1 to use abbreviated help messages, e.g., for degenerate inputs -*/ -#define qh_QUICKhelp 0 - -/* ============ -merge constants- ==================== - - These constants effect facet merging. You probably will not need - to modify these. They effect the performance of facet merging. -*/ - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="DIMmergeVertex">-</a> - - qh_DIMmergeVertex - max dimension for vertex merging (it is not effective in high-d) -*/ -#define qh_DIMmergeVertex 6 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="DIMreduceBuild">-</a> - - qh_DIMreduceBuild - max dimension for vertex reduction during build (slow in high-d) -*/ -#define qh_DIMreduceBuild 5 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="BESTcentrum">-</a> - - qh_BESTcentrum - if > 2*dim+n vertices, qh_findbestneighbor() tests centrums (faster) - else, qh_findbestneighbor() tests all vertices (much better merges) - - qh_BESTcentrum2 - if qh_BESTcentrum2 * DIM3 + BESTcentrum < #vertices tests centrums -*/ -#define qh_BESTcentrum 20 -#define qh_BESTcentrum2 2 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="BESTnonconvex">-</a> - - qh_BESTnonconvex - if > dim+n neighbors, qh_findbestneighbor() tests nonconvex ridges. - - notes: - It is needed because qh_findbestneighbor is slow for large facets -*/ -#define qh_BESTnonconvex 15 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="MAXnewmerges">-</a> - - qh_MAXnewmerges - if >n newmerges, qh_merge_nonconvex() calls qh_reducevertices_centrums. - - notes: - It is needed because postmerge can merge many facets at once -*/ -#define qh_MAXnewmerges 2 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="MAXnewcentrum">-</a> - - qh_MAXnewcentrum - if <= dim+n vertices (n approximates the number of merges), - reset the centrum in qh_updatetested() and qh_mergecycle_facets() - - notes: - needed to reduce cost and because centrums may move too much if - many vertices in high-d -*/ -#define qh_MAXnewcentrum 5 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="COPLANARratio">-</a> - - qh_COPLANARratio - for 3-d+ merging, qh.MINvisible is n*premerge_centrum - - notes: - for non-merging, it's DISTround -*/ -#define qh_COPLANARratio 3 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="DISToutside">-</a> - - qh_DISToutside - When is a point clearly outside of a facet? - Stops search in qh_findbestnew or qh_partitionall - qh_findbest uses qh.MINoutside since since it is only called if no merges. - - notes: - 'Qf' always searches for best facet - if !qh.MERGING, same as qh.MINoutside. - if qh_USEfindbestnew, increase value since neighboring facets may be ill-behaved - [Note: Zdelvertextot occurs normally with interior points] - RBOX 1000 s Z1 G1e-13 t1001188774 | QHULL Tv - When there is a sharp edge, need to move points to a - clearly good facet; otherwise may be lost in another partitioning. - if too big then O(n^2) behavior for partitioning in cone - if very small then important points not processed - Needed in qh_partitionall for - RBOX 1000 s Z1 G1e-13 t1001032651 | QHULL Tv - Needed in qh_findbestnew for many instances of - RBOX 1000 s Z1 G1e-13 t | QHULL Tv - - See: - qh_DISToutside -- when is a point clearly outside of a facet - qh_SEARCHdist -- when is facet coplanar with the best facet? - qh_USEfindbestnew -- when to use qh_findbestnew for qh_partitionpoint() -*/ -#define qh_DISToutside ((qh_USEfindbestnew ? 2 : 1) * \ - fmax_((qh MERGING ? 2 : 1)*qh MINoutside, qh max_outside)) - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="RATIOnearinside">-</a> - - qh_RATIOnearinside - ratio of qh.NEARinside to qh.ONEmerge for retaining inside points for - qh_check_maxout(). - - notes: - This is overkill since do not know the correct value. - It effects whether 'Qc' reports all coplanar points - Not used for 'd' since non-extreme points are coplanar -*/ -#define qh_RATIOnearinside 5 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="SEARCHdist">-</a> - - qh_SEARCHdist - When is a facet coplanar with the best facet? - qh_findbesthorizon: all coplanar facets of the best facet need to be searched. - - See: - qh_DISToutside -- when is a point clearly outside of a facet - qh_SEARCHdist -- when is facet coplanar with the best facet? - qh_USEfindbestnew -- when to use qh_findbestnew for qh_partitionpoint() -*/ -#define qh_SEARCHdist ((qh_USEfindbestnew ? 2 : 1) * \ - (qh max_outside + 2 * qh DISTround + fmax_( qh MINvisible, qh MAXcoplanar))); - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="USEfindbestnew">-</a> - - qh_USEfindbestnew - Always use qh_findbestnew for qh_partitionpoint, otherwise use - qh_findbestnew if merged new facet or sharpnewfacets. - - See: - qh_DISToutside -- when is a point clearly outside of a facet - qh_SEARCHdist -- when is facet coplanar with the best facet? - qh_USEfindbestnew -- when to use qh_findbestnew for qh_partitionpoint() -*/ -#define qh_USEfindbestnew (zzval_(Ztotmerge) > 50) - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="WIDEcoplanar">-</a> - - qh_WIDEcoplanar - n*MAXcoplanar or n*MINvisible for a WIDEfacet - - if vertex is further than qh.WIDEfacet from the hyperplane - then its ridges are not counted in computing the area, and - the facet's centrum is frozen. - - notes: - qh.WIDEfacet= max(qh.MAXoutside,qh_WIDEcoplanar*qh.MAXcoplanar, - qh_WIDEcoplanar * qh.MINvisible); -*/ -#define qh_WIDEcoplanar 6 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="MAXnarrow">-</a> - - qh_MAXnarrow - max. cosine in initial hull that sets qh.NARROWhull - - notes: - If qh.NARROWhull, the initial partition does not make - coplanar points. If narrow, a coplanar point can be - coplanar to two facets of opposite orientations and - distant from the exact convex hull. - - Conservative estimate. Don't actually see problems until it is -1.0 -*/ -#define qh_MAXnarrow -0.99999999 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="WARNnarrow">-</a> - - qh_WARNnarrow - max. cosine in initial hull to warn about qh.NARROWhull - - notes: - this is a conservative estimate. - Don't actually see problems until it is -1.0. See qh-impre.htm -*/ -#define qh_WARNnarrow -0.999999999999999 - -/*-<a href="qh-user.htm#TOC" - >--------------------------------</a><a name="ZEROdelaunay">-</a> - - qh_ZEROdelaunay - a zero Delaunay facet occurs for input sites coplanar with their convex hull - the last normal coefficient of a zero Delaunay facet is within - qh_ZEROdelaunay * qh.ANGLEround of 0 - - notes: - qh_ZEROdelaunay does not allow for joggled input ('QJ'). - - You can avoid zero Delaunay facets by surrounding the input with a box. - - Use option 'PDk:-n' to explicitly define zero Delaunay facets - k= dimension of input sites (e.g., 3 for 3-d Delaunay triangulation) - n= the cutoff for zero Delaunay facets (e.g., 'PD3:-1e-12') -*/ -#define qh_ZEROdelaunay 2 - -#endif /* qh_DEFuser */ - - - diff --git a/extern/qhull/src/user_eg.c b/extern/qhull/src/user_eg.c deleted file mode 100644 index 97e4aa7a89a..00000000000 --- a/extern/qhull/src/user_eg.c +++ /dev/null @@ -1,310 +0,0 @@ -/*<html><pre> -<a href="qh-user.htm" - >-------------------------------</a><a name="TOP">-</a> - - user_eg.c - sample code for calling qhull() from an application - - call with: - - user_eg "cube/diamond options" "delaunay options" "halfspace options" - - for example: - - user_eg # return summaries - - user_eg "n" "o" "Fp" # return normals, OFF, points - - user_eg "n Qt" "o" "Fp" # triangulated cube - - user_eg "QR0 p" "QR0 v p" "QR0 Fp" # rotate input and return points - # 'v' returns Voronoi - # transform is rotated for halfspaces - - main() makes three runs of qhull. - - 1) compute the convex hull of a cube - - 2a) compute the Delaunay triangulation of random points - - 2b) find the Delaunay triangle closest to a point. - - 3) compute the halfspace intersection of a diamond - - notes: - - For another example, see main() in unix.c and user_eg2.c. - These examples, call qh_qhull() directly. They allow - tighter control on the code loaded with Qhull. - - For a simple C++ example, see qhull_interface.cpp - - Summaries are sent to stderr if other output formats are used - - compiled by 'make user_eg' - - see qhull.h for data structures, macros, and user-callable functions. -*/ - -#include "qhull_a.h" - -/*------------------------------------------------- --internal function prototypes -*/ -void print_summary (void); -void makecube (coordT *points, int numpoints, int dim); -void makeDelaunay (coordT *points, int numpoints, int dim, int seed); -void findDelaunay (int dim); -void makehalf (coordT *points, int numpoints, int dim); - -/*------------------------------------------------- --print_summary() -*/ -void print_summary (void) { - facetT *facet; - int k; - - printf ("\n%d vertices and %d facets with normals:\n", - qh num_vertices, qh num_facets); - FORALLfacets { - for (k=0; k < qh hull_dim; k++) - printf ("%6.2g ", facet->normal[k]); - printf ("\n"); - } -} - -/*-------------------------------------------------- --makecube- set points to vertices of cube - points is numpoints X dim -*/ -void makecube (coordT *points, int numpoints, int dim) { - int j,k; - coordT *point; - - for (j=0; j<numpoints; j++) { - point= points + j*dim; - for (k=dim; k--; ) { - if (j & ( 1 << k)) - point[k]= 1.0; - else - point[k]= -1.0; - } - } -} /*.makecube.*/ - -/*-------------------------------------------------- --makeDelaunay- set points for dim Delaunay triangulation of random points - points is numpoints X dim. -notes: - makeDelaunay() in user_eg2.c uses qh_setdelaunay() to project points in place. -*/ -void makeDelaunay (coordT *points, int numpoints, int dim, int seed) { - int j,k; - coordT *point, realr; - - - printf ("seed: %d\n", seed); - qh_RANDOMseed_( seed); - for (j=0; j<numpoints; j++) { - point= points + j*dim; - for (k= 0; k < dim; k++) { - realr= qh_RANDOMint; - point[k]= 2.0 * realr/(qh_RANDOMmax+1) - 1.0; - } - } -} /*.makeDelaunay.*/ - -/*-------------------------------------------------- --findDelaunay- find Delaunay triangle for [0.5,0.5,...] - assumes dim < 100 -notes: - calls qh_setdelaunay() to project the point to a parabaloid -*/ -void findDelaunay (int dim) { - int k; - coordT point[ 100]; - boolT isoutside; - realT bestdist; - facetT *facet; - vertexT *vertex, **vertexp; - - for (k= 0; k < dim; k++) - point[k]= 0.5; - qh_setdelaunay (dim+1, 1, point); - facet= qh_findbestfacet (point, qh_ALL, &bestdist, &isoutside); - FOREACHvertex_(facet->vertices) { - for (k=0; k < dim; k++) - printf ("%5.2f ", vertex->point[k]); - printf ("\n"); - } -} /*.findDelaunay.*/ - -/*-------------------------------------------------- --makehalf- set points to halfspaces for a (dim)-dimensional diamond - points is numpoints X dim+1 - - each halfspace consists of dim coefficients followed by an offset -*/ -void makehalf (coordT *points, int numpoints, int dim) { - int j,k; - coordT *point; - - for (j=0; j<numpoints; j++) { - point= points + j*(dim+1); - point[dim]= -1.0; /* offset */ - for (k=dim; k--; ) { - if (j & ( 1 << k)) - point[k]= 1.0; - else - point[k]= -1.0; - } - } -} /*.makehalf.*/ - -#define DIM 3 /* dimension of points, must be < 31 for SIZEcube */ -#define SIZEcube (1<<DIM) -#define SIZEdiamond (2*DIM) -#define TOTpoints (SIZEcube + SIZEdiamond) - -/*-------------------------------------------------- --main- derived from call_qhull in user.c - - see program header - - this contains three runs of Qhull for convex hull, Delaunay - triangulation or Voronoi vertices, and halfspace intersection - -*/ -int main (int argc, char *argv[]) { - int dim= DIM; /* dimension of points */ - int numpoints; /* number of points */ - coordT points[(DIM+1)*TOTpoints]; /* array of coordinates for each point */ - coordT *rows[TOTpoints]; - boolT ismalloc= False; /* True if qhull should free points in qh_freeqhull() or reallocation */ - char flags[250]; /* option flags for qhull, see qh_opt.htm */ - FILE *outfile= stdout; /* output from qh_produce_output() - use NULL to skip qh_produce_output() */ - FILE *errfile= stderr; /* error messages from qhull code */ - int exitcode; /* 0 if no error from qhull */ - facetT *facet; /* set by FORALLfacets */ - int curlong, totlong; /* memory remaining after qh_memfreeshort */ - int i; - - printf ("This is the output from user_eg.c\n\n\ -It shows how qhull() may be called from an application. It is not part\n\ -of qhull itself. If it appears accidently, please remove user_eg.c from\n\ -your project.\n\n"); - - /* - Run 1: convex hull - */ - printf( "\ncompute convex hull of cube after rotating input\n"); - sprintf (flags, "qhull s Tcv %s", argc >= 2 ? argv[1] : ""); - numpoints= SIZEcube; - makecube (points, numpoints, DIM); - for (i=numpoints; i--; ) - rows[i]= points+dim*i; - qh_printmatrix (outfile, "input", rows, numpoints, dim); - exitcode= qh_new_qhull (dim, numpoints, points, ismalloc, - flags, outfile, errfile); - if (!exitcode) { /* if no error */ - /* 'qh facet_list' contains the convex hull */ - print_summary(); - FORALLfacets { - /* ... your code ... */ - } - } - qh_freeqhull(!qh_ALL); /* free long memory */ - qh_memfreeshort (&curlong, &totlong); /* free short memory and memory allocator */ - if (curlong || totlong) - fprintf (errfile, "qhull internal warning (user_eg, #1): did not free %d bytes of long memory (%d pieces)\n", totlong, curlong); - - /* - Run 2: Delaunay triangulation - */ - - printf( "\ncompute 3-d Delaunay triangulation\n"); - sprintf (flags, "qhull s d Tcv %s", argc >= 3 ? argv[2] : ""); - numpoints= SIZEcube; - makeDelaunay (points, numpoints, dim, time(NULL)); - for (i=numpoints; i--; ) - rows[i]= points+dim*i; - qh_printmatrix (outfile, "input", rows, numpoints, dim); - exitcode= qh_new_qhull (dim, numpoints, points, ismalloc, - flags, outfile, errfile); - if (!exitcode) { /* if no error */ - /* 'qh facet_list' contains the convex hull */ - /* If you want a Voronoi diagram ('v') and do not request output (i.e., outfile=NULL), - call qh_setvoronoi_all() after qh_new_qhull(). */ - print_summary(); - FORALLfacets { - /* ... your code ... */ - } - printf( "\nfind 3-d Delaunay triangle closest to [0.5, 0.5, ...]\n"); - exitcode= setjmp (qh errexit); - if (!exitcode) { - /* Trap Qhull errors in findDelaunay(). Without the setjmp(), Qhull - will exit() after reporting an error */ - qh NOerrexit= False; - findDelaunay (DIM); - } - qh NOerrexit= True; - } -#if qh_QHpointer /* see user.h */ - { - qhT *oldqhA, *oldqhB; - coordT pointsB[DIM*TOTpoints]; /* array of coordinates for each point */ - - - printf( "\nsave first triangulation and compute a new triangulation\n"); - oldqhA= qh_save_qhull(); - sprintf (flags, "qhull s d Tcv %s", argc >= 3 ? argv[2] : ""); - numpoints= SIZEcube; - makeDelaunay (pointsB, numpoints, dim, time(NULL)+1); - for (i=numpoints; i--; ) - rows[i]= pointsB+dim*i; - qh_printmatrix (outfile, "input", rows, numpoints, dim); - exitcode= qh_new_qhull (dim, numpoints, pointsB, ismalloc, - flags, outfile, errfile); - if (!exitcode) - print_summary(); - printf( "\nsave second triangulation and restore first one\n"); - oldqhB= qh_save_qhull(); - qh_restore_qhull (&oldqhA); - print_summary(); - printf( "\nfree first triangulation and restore second one.\n"); - qh_freeqhull (qh_ALL); /* free short and long memory used by first call */ - /* do not use qh_memfreeshort */ - qh_restore_qhull (&oldqhB); - print_summary(); - } -#endif - qh_freeqhull(!qh_ALL); /* free long memory */ - qh_memfreeshort (&curlong, &totlong); /* free short memory and memory allocator */ - if (curlong || totlong) - fprintf (errfile, "qhull internal warning (user_eg, #2): did not free %d bytes of long memory (%d pieces)\n", totlong, curlong); - - /* - Run 3: halfspace intersection about the origin - */ - printf( "\ncompute halfspace intersection about the origin for a diamond\n"); - sprintf (flags, "qhull H0 s Tcv %s", argc >= 4 ? argv[3] : "Fp"); - numpoints= SIZEcube; - makehalf (points, numpoints, dim); - for (i=numpoints; i--; ) - rows[i]= points+(dim+1)*i; - qh_printmatrix (outfile, "input as halfspace coefficients + offsets", rows, numpoints, dim+1); - /* use qh_sethalfspace_all to transform the halfspaces yourself. - If so, set 'qh feasible_point and do not use option 'Hn,...' [it would retransform the halfspaces] - */ - exitcode= qh_new_qhull (dim+1, numpoints, points, ismalloc, - flags, outfile, errfile); - if (!exitcode) - print_summary(); - qh_freeqhull (!qh_ALL); - qh_memfreeshort (&curlong, &totlong); - if (curlong || totlong) /* could also check previous runs */ - fprintf (stderr, "qhull internal warning (user_eg, #3): did not free %d bytes of long memory (%d pieces)\n", - totlong, curlong); - return exitcode; -} /* main */ - diff --git a/extern/qhull/src/user_eg2.c b/extern/qhull/src/user_eg2.c deleted file mode 100644 index 1eb42ccfe8a..00000000000 --- a/extern/qhull/src/user_eg2.c +++ /dev/null @@ -1,532 +0,0 @@ -/*<html><pre> -<a href="qh-qhull.htm" - >-------------------------------</a><a name="TOP">-</a> - - user_eg2.c - - sample code for calling qhull() from an application. - - See user_eg.c for a simpler method using qh_new_qhull(). - The method used here and in unix.c gives you additional - control over Qhull. - - call with: - - user_eg2 "triangulated cube/diamond options" "delaunay options" "halfspace options" - - for example: - - user_eg2 # return summaries - - user_eg2 "n" "o" "Fp" # return normals, OFF, points - - user_eg2 "QR0 p" "QR0 v p" "QR0 Fp" # rotate input and return points - # 'v' returns Voronoi - # transform is rotated for halfspaces - - main() makes three runs of qhull. - - 1) compute the convex hull of a cube, and incrementally add a diamond - - 2a) compute the Delaunay triangulation of random points, and add points. - - 2b) find the Delaunay triangle closest to a point. - - 3) compute the halfspace intersection of a diamond, and add a cube - - notes: - - summaries are sent to stderr if other output formats are used - - derived from unix.c and compiled by 'make user_eg2' - - see qhull.h for data structures, macros, and user-callable functions. - - If you want to control all output to stdio and input to stdin, - set the #if below to "1" and delete all lines that contain "io.c". - This prevents the loading of io.o. Qhull will - still write to 'qh ferr' (stderr) for error reporting and tracing. - - Defining #if 1, also prevents user.o from being loaded. -*/ - -#include "qhull_a.h" - -/*------------------------------------------------- --internal function prototypes -*/ -void print_summary (void); -void makecube (coordT *points, int numpoints, int dim); -void adddiamond (coordT *points, int numpoints, int numnew, int dim); -void makeDelaunay (coordT *points, int numpoints, int dim); -void addDelaunay (coordT *points, int numpoints, int numnew, int dim); -void findDelaunay (int dim); -void makehalf (coordT *points, int numpoints, int dim); -void addhalf (coordT *points, int numpoints, int numnew, int dim, coordT *feasible); - -/*------------------------------------------------- --print_summary() -*/ -void print_summary (void) { - facetT *facet; - int k; - - printf ("\n%d vertices and %d facets with normals:\n", - qh num_vertices, qh num_facets); - FORALLfacets { - for (k=0; k < qh hull_dim; k++) - printf ("%6.2g ", facet->normal[k]); - printf ("\n"); - } -} - -/*-------------------------------------------------- --makecube- set points to vertices of cube - points is numpoints X dim -*/ -void makecube (coordT *points, int numpoints, int dim) { - int j,k; - coordT *point; - - for (j=0; j<numpoints; j++) { - point= points + j*dim; - for (k=dim; k--; ) { - if (j & ( 1 << k)) - point[k]= 1.0; - else - point[k]= -1.0; - } - } -} /*.makecube.*/ - -/*-------------------------------------------------- --adddiamond- add diamond to convex hull - points is numpoints+numnew X dim. - -notes: - qh_addpoint() does not make a copy of the point coordinates. - - For inside points and some outside points, qh_findbestfacet performs - an exhaustive search for a visible facet. Algorithms that retain - previously constructed hulls should be faster for on-line construction - of the convex hull. -*/ -void adddiamond (coordT *points, int numpoints, int numnew, int dim) { - int j,k; - coordT *point; - facetT *facet; - boolT isoutside; - realT bestdist; - - for (j= 0; j < numnew ; j++) { - point= points + (numpoints+j)*dim; - if (points == qh first_point) /* in case of 'QRn' */ - qh num_points= numpoints+j+1; - /* qh num_points sets the size of the points array. You may - allocate the points elsewhere. If so, qh_addpoint records - the point's address in qh other_points - */ - for (k=dim; k--; ) { - if (j/2 == k) - point[k]= (j & 1) ? 2.0 : -2.0; - else - point[k]= 0.0; - } - facet= qh_findbestfacet (point, !qh_ALL, &bestdist, &isoutside); - if (isoutside) { - if (!qh_addpoint (point, facet, False)) - break; /* user requested an early exit with 'TVn' or 'TCn' */ - } - printf ("%d vertices and %d facets\n", - qh num_vertices, qh num_facets); - /* qh_produce_output(); */ - } - if (qh DOcheckmax) - qh_check_maxout(); - else if (qh KEEPnearinside) - qh_nearcoplanar(); -} /*.adddiamond.*/ - -/*-------------------------------------------------- --makeDelaunay- set points for dim-1 Delaunay triangulation of random points - points is numpoints X dim. Each point is projected to a paraboloid. -*/ -void makeDelaunay (coordT *points, int numpoints, int dim) { - int j,k, seed; - coordT *point, realr; - - seed= time(NULL); - printf ("seed: %d\n", seed); - qh_RANDOMseed_( seed); - for (j=0; j<numpoints; j++) { - point= points + j*dim; - for (k= 0; k < dim-1; k++) { - realr= qh_RANDOMint; - point[k]= 2.0 * realr/(qh_RANDOMmax+1) - 1.0; - } - } - qh_setdelaunay (dim, numpoints, points); -} /*.makeDelaunay.*/ - -/*-------------------------------------------------- --addDelaunay- add points to dim-1 Delaunay triangulation - points is numpoints+numnew X dim. Each point is projected to a paraboloid. -notes: - qh_addpoint() does not make a copy of the point coordinates. - - Since qh_addpoint() is not given a visible facet, it performs a directed - search of all facets. Algorithms that retain previously - constructed hulls may be faster. -*/ -void addDelaunay (coordT *points, int numpoints, int numnew, int dim) { - int j,k; - coordT *point, realr; - facetT *facet; - realT bestdist; - boolT isoutside; - - for (j= 0; j < numnew ; j++) { - point= points + (numpoints+j)*dim; - if (points == qh first_point) /* in case of 'QRn' */ - qh num_points= numpoints+j+1; - /* qh num_points sets the size of the points array. You may - allocate the point elsewhere. If so, qh_addpoint records - the point's address in qh other_points - */ - for (k= 0; k < dim-1; k++) { - realr= qh_RANDOMint; - point[k]= 2.0 * realr/(qh_RANDOMmax+1) - 1.0; - } - qh_setdelaunay (dim, 1, point); - facet= qh_findbestfacet (point, !qh_ALL, &bestdist, &isoutside); - if (isoutside) { - if (!qh_addpoint (point, facet, False)) - break; /* user requested an early exit with 'TVn' or 'TCn' */ - } - qh_printpoint (stdout, "added point", point); - printf ("%d points, %d extra points, %d vertices, and %d facets in total\n", - qh num_points, qh_setsize (qh other_points), - qh num_vertices, qh num_facets); - - /* qh_produce_output(); */ - } - if (qh DOcheckmax) - qh_check_maxout(); - else if (qh KEEPnearinside) - qh_nearcoplanar(); -} /*.addDelaunay.*/ - -/*-------------------------------------------------- --findDelaunay- find Delaunay triangle for [0.5,0.5,...] - assumes dim < 100 -*/ -void findDelaunay (int dim) { - int k; - coordT point[ 100]; - boolT isoutside; - realT bestdist; - facetT *facet; - vertexT *vertex, **vertexp; - - for (k= 0; k < dim-1; k++) - point[k]= 0.5; - qh_setdelaunay (dim, 1, point); - facet= qh_findbestfacet (point, qh_ALL, &bestdist, &isoutside); - FOREACHvertex_(facet->vertices) { - for (k=0; k < dim-1; k++) - printf ("%5.2f ", vertex->point[k]); - printf ("\n"); - } -} /*.findDelaunay.*/ - -/*-------------------------------------------------- --makehalf- set points to halfspaces for a (dim)-d diamond - points is numpoints X dim+1 - - each halfspace consists of dim coefficients followed by an offset -*/ -void makehalf (coordT *points, int numpoints, int dim) { - int j,k; - coordT *point; - - for (j=0; j<numpoints; j++) { - point= points + j*(dim+1); - point[dim]= -1.0; /* offset */ - for (k=dim; k--; ) { - if (j & ( 1 << k)) - point[k]= 1.0; - else - point[k]= -1.0; - } - } -} /*.makehalf.*/ - -/*-------------------------------------------------- --addhalf- add halfspaces for a (dim)-d cube to the intersection - points is numpoints+numnew X dim+1 -notes: - assumes dim < 100. - - For makehalf(), points is the initial set of halfspaces with offsets. - It is transformed by qh_sethalfspace_all into a - (dim)-d set of newpoints. Qhull computed the convex hull of newpoints - - this is equivalent to the halfspace intersection of the - orginal halfspaces. - - For addhalf(), the remainder of points stores the transforms of - the added halfspaces. Qhull computes the convex hull of newpoints - and the added points. qh_addpoint() does not make a copy of these points. - - Since halfspace intersection is equivalent to a convex hull, - qh_findbestfacet may perform an exhaustive search - for a visible facet. Algorithms that retain previously constructed - intersections should be faster for on-line construction. -*/ -void addhalf (coordT *points, int numpoints, int numnew, int dim, coordT *feasible) { - int j,k; - coordT *point, normal[100], offset, *next; - facetT *facet; - boolT isoutside; - realT bestdist; - - for (j= 0; j < numnew ; j++) { - offset= -1.0; - for (k=dim; k--; ) { - if (j/2 == k) { - normal[k]= sqrt (dim); /* to normalize as in makehalf */ - if (j & 1) - normal[k]= -normal[k]; - }else - normal[k]= 0.0; - } - point= points + (numpoints+j)* (dim+1); /* does not use point[dim] */ - qh_sethalfspace (dim, point, &next, normal, &offset, feasible); - facet= qh_findbestfacet (point, !qh_ALL, &bestdist, &isoutside); - if (isoutside) { - if (!qh_addpoint (point, facet, False)) - break; /* user requested an early exit with 'TVn' or 'TCn' */ - } - qh_printpoint (stdout, "added offset -1 and normal", normal); - printf ("%d points, %d extra points, %d vertices, and %d facets in total\n", - qh num_points, qh_setsize (qh other_points), - qh num_vertices, qh num_facets); - /* qh_produce_output(); */ - } - if (qh DOcheckmax) - qh_check_maxout(); - else if (qh KEEPnearinside) - qh_nearcoplanar(); -} /*.addhalf.*/ - -#define DIM 3 /* dimension of points, must be < 31 for SIZEcube */ -#define SIZEcube (1<<DIM) -#define SIZEdiamond (2*DIM) -#define TOTpoints (SIZEcube + SIZEdiamond) - -/*-------------------------------------------------- --main- derived from call_qhull in user.c - - see program header - - this contains three runs of Qhull for convex hull, Delaunay - triangulation or Voronoi vertices, and halfspace intersection - -*/ -int main (int argc, char *argv[]) { - boolT ismalloc; - int curlong, totlong, exitcode; - char options [2000]; - - printf ("This is the output from user_eg2.c\n\n\ -It shows how qhull() may be called from an application. It is not part\n\ -of qhull itself. If it appears accidently, please remove user_eg2.c from\n\ -your project.\n\n"); - ismalloc= False; /* True if qh_freeqhull should 'free(array)' */ - /* - Run 1: convex hull - */ - qh_init_A (stdin, stdout, stderr, 0, NULL); - exitcode= setjmp (qh errexit); - if (!exitcode) { - coordT array[TOTpoints][DIM]; - - strcat (qh rbox_command, "user_eg cube"); - sprintf (options, "qhull s Tcv Q11 %s ", argc >= 2 ? argv[1] : ""); - qh_initflags (options); - printf( "\ncompute triangulated convex hull of cube after rotating input\n"); - makecube (array[0], SIZEcube, DIM); - qh_init_B (array[0], SIZEcube, DIM, ismalloc); - qh_qhull(); - qh_check_output(); - qh_triangulate(); /* requires option 'Q11' if want to add points */ - print_summary (); - if (qh VERIFYoutput && !qh STOPpoint && !qh STOPcone) - qh_check_points (); - printf( "\nadd points in a diamond\n"); - adddiamond (array[0], SIZEcube, SIZEdiamond, DIM); - qh_check_output(); - print_summary (); - qh_produce_output(); /* delete this line to help avoid io.c */ - if (qh VERIFYoutput && !qh STOPpoint && !qh STOPcone) - qh_check_points (); - } - qh NOerrexit= True; - qh_freeqhull (!qh_ALL); - qh_memfreeshort (&curlong, &totlong); - /* - Run 2: Delaunay triangulation - */ - qh_init_A (stdin, stdout, stderr, 0, NULL); - exitcode= setjmp (qh errexit); - if (!exitcode) { - coordT array[TOTpoints][DIM]; - - strcat (qh rbox_command, "user_eg Delaunay"); - sprintf (options, "qhull s d Tcv %s", argc >= 3 ? argv[2] : ""); - qh_initflags (options); - printf( "\ncompute 2-d Delaunay triangulation\n"); - makeDelaunay (array[0], SIZEcube, DIM); - /* Instead of makeDelaunay with qh_setdelaunay, you may - produce a 2-d array of points, set DIM to 2, and set - qh PROJECTdelaunay to True. qh_init_B will call - qh_projectinput to project the points to the paraboloid - and add a point "at-infinity". - */ - qh_init_B (array[0], SIZEcube, DIM, ismalloc); - qh_qhull(); - /* If you want Voronoi ('v') without qh_produce_output(), call - qh_setvoronoi_all() after qh_qhull() */ - qh_check_output(); - print_summary (); - qh_produce_output(); /* delete this line to help avoid io.c */ - if (qh VERIFYoutput && !qh STOPpoint && !qh STOPcone) - qh_check_points (); - printf( "\nadd points to triangulation\n"); - addDelaunay (array[0], SIZEcube, SIZEdiamond, DIM); - qh_check_output(); - qh_produce_output(); /* delete this line to help avoid io.c */ - if (qh VERIFYoutput && !qh STOPpoint && !qh STOPcone) - qh_check_points (); - printf( "\nfind Delaunay triangle closest to [0.5, 0.5, ...]\n"); - findDelaunay (DIM); - } - qh NOerrexit= True; - qh_freeqhull (!qh_ALL); - qh_memfreeshort (&curlong, &totlong); - /* - Run 3: halfspace intersection - */ - qh_init_A (stdin, stdout, stderr, 0, NULL); - exitcode= setjmp (qh errexit); - if (!exitcode) { - coordT array[TOTpoints][DIM+1]; /* +1 for halfspace offset */ - pointT *points; - - strcat (qh rbox_command, "user_eg halfspaces"); - sprintf (options, "qhull H0 s Tcv %s", argc >= 4 ? argv[3] : ""); - qh_initflags (options); - printf( "\ncompute halfspace intersection about the origin for a diamond\n"); - makehalf (array[0], SIZEcube, DIM); - qh_setfeasible (DIM); /* from io.c, sets qh feasible_point from 'Hn,n' */ - /* you may malloc and set qh feasible_point directly. It is only used for - option 'Fp' */ - points= qh_sethalfspace_all ( DIM+1, SIZEcube, array[0], qh feasible_point); - qh_init_B (points, SIZEcube, DIM, True); /* qh_freeqhull frees points */ - qh_qhull(); - qh_check_output(); - qh_produce_output(); /* delete this line to help avoid io.c */ - if (qh VERIFYoutput && !qh STOPpoint && !qh STOPcone) - qh_check_points (); - printf( "\nadd halfspaces for cube to intersection\n"); - addhalf (array[0], SIZEcube, SIZEdiamond, DIM, qh feasible_point); - qh_check_output(); - qh_produce_output(); /* delete this line to help avoid io.c */ - if (qh VERIFYoutput && !qh STOPpoint && !qh STOPcone) - qh_check_points (); - } - qh NOerrexit= True; - qh NOerrexit= True; - qh_freeqhull (!qh_ALL); - qh_memfreeshort (&curlong, &totlong); - if (curlong || totlong) /* could also check previous runs */ - fprintf (stderr, "qhull internal warning (main): did not free %d bytes of long memory (%d pieces)\n", - totlong, curlong); - return exitcode; -} /* main */ - -#if 1 /* use 1 to prevent loading of io.o and user.o */ -/*------------------------------------------- --errexit- return exitcode to system after an error - assumes exitcode non-zero - prints useful information - see qh_errexit2() in qhull.c for 2 facets -*/ -void qh_errexit(int exitcode, facetT *facet, ridgeT *ridge) { - - if (qh ERREXITcalled) { - fprintf (qh ferr, "qhull error while processing previous error. Exit program\n"); - exit(1); - } - qh ERREXITcalled= True; - if (!qh QHULLfinished) - qh hulltime= (unsigned)clock() - qh hulltime; - fprintf (qh ferr, "\nWhile executing: %s | %s\n", qh rbox_command, qh qhull_command); - fprintf(qh ferr, "Options selected:\n%s\n", qh qhull_options); - if (qh furthest_id >= 0) { - fprintf(qh ferr, "\nLast point added to hull was p%d", qh furthest_id); - if (zzval_(Ztotmerge)) - fprintf(qh ferr, " Last merge was #%d.", zzval_(Ztotmerge)); - if (qh QHULLfinished) - fprintf(qh ferr, "\nQhull has finished constructing the hull."); - else if (qh POSTmerging) - fprintf(qh ferr, "\nQhull has started post-merging"); - fprintf(qh ferr, "\n\n"); - } - if (qh NOerrexit) { - fprintf (qh ferr, "qhull error while ending program. Exit program\n"); - exit(1); - } - if (!exitcode) - exitcode= qh_ERRqhull; - qh NOerrexit= True; - longjmp(qh errexit, exitcode); -} /* errexit */ - - -/*------------------------------------------- --errprint- prints out the information of the erroneous object - any parameter may be NULL, also prints neighbors and geomview output -*/ -void qh_errprint(char *string, facetT *atfacet, facetT *otherfacet, ridgeT *atridge, vertexT *atvertex) { - - fprintf (qh ferr, "%s facets f%d f%d ridge r%d vertex v%d\n", - string, getid_(atfacet), getid_(otherfacet), getid_(atridge), - getid_(atvertex)); -} /* errprint */ - - -void qh_printfacetlist(facetT *facetlist, setT *facets, boolT printall) { - facetT *facet, **facetp; - - /* remove these calls to help avoid io.c */ - qh_printbegin (qh ferr, qh_PRINTfacets, facetlist, facets, printall);/*io.c*/ - FORALLfacet_(facetlist) /*io.c*/ - qh_printafacet(qh ferr, qh_PRINTfacets, facet, printall); /*io.c*/ - FOREACHfacet_(facets) /*io.c*/ - qh_printafacet(qh ferr, qh_PRINTfacets, facet, printall); /*io.c*/ - qh_printend (qh ferr, qh_PRINTfacets, facetlist, facets, printall); /*io.c*/ - - FORALLfacet_(facetlist) - fprintf( qh ferr, "facet f%d\n", facet->id); -} /* printfacetlist */ - - - -/*----------------------------------------- --user_memsizes- allocate up to 10 additional, quick allocation sizes -*/ -void qh_user_memsizes (void) { - - /* qh_memsize (size); */ -} /* user_memsizes */ - -#endif diff --git a/extern/solid/CMakeLists.txt b/extern/solid/CMakeLists.txt deleted file mode 100644 index 7840dd6b423..00000000000 --- a/extern/solid/CMakeLists.txt +++ /dev/null @@ -1,34 +0,0 @@ -# $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, Blender Foundation -# All rights reserved. -# -# The Original Code is: all of this file. -# -# Contributor(s): Jacques Beaurain. -# -# ***** END GPL LICENSE BLOCK ***** - -SET(INC include src src/broad src/complex src/convex ../qhull/include) - -FILE(GLOB SRC src/*.cpp src/convex/*.cpp src/complex/*.cpp src/broad/*.cpp) - -ADD_DEFINITIONS(-DUSE_DOUBLES -DQHULL -D_LIB) - -BLENDERLIB(extern_solid "${SRC}" "${INC}") -#, libtype=['game2','player'], priority=[45, 75] diff --git a/extern/solid/LICENSE_GPL.txt b/extern/solid/LICENSE_GPL.txt deleted file mode 100644 index 07db89585a2..00000000000 --- a/extern/solid/LICENSE_GPL.txt +++ /dev/null @@ -1,349 +0,0 @@ - - The SOLID library is Copyright (C) 2001-2003 Dtecta. - - You may use, distribute and copy the SOLID library under the terms of - GNU General Public License version 2, which is displayed below. - -------------------------------------------------------------------------- - - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - 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. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. - -------------------------------------------------------------------------- diff --git a/extern/solid/LICENSE_QPL.txt b/extern/solid/LICENSE_QPL.txt deleted file mode 100644 index 3fca00466e2..00000000000 --- a/extern/solid/LICENSE_QPL.txt +++ /dev/null @@ -1,110 +0,0 @@ - - The SOLID library is Copyright (C) 2001-2003 Dtecta. - - You may use, distribute and copy the SOLID library under the terms of - the Q Public License, which is displayed below. - -------------------------------------------------------------------------- - THE Q PUBLIC LICENSE - version 1.0 - - Copyright (C) 1999-2000 Trolltech AS, Norway. - Everyone is permitted to copy and - distribute this license document. - -The intent of this license is to establish freedom to share and change the -software regulated by this license under the open source model. - -This license applies to any software containing a notice placed by the -copyright holder saying that it may be distributed under the terms of -the Q Public License version 1.0. Such software is herein referred to as -the Software. This license covers modification and distribution of the -Software, use of third-party application programs based on the Software, -and development of free software which uses the Software. - - Granted Rights - -1. You are granted the non-exclusive rights set forth in this license - provided you agree to and comply with any and all conditions in this - license. Whole or partial distribution of the Software, or software - items that link with the Software, in any form signifies acceptance of - this license. - -2. You may copy and distribute the Software in unmodified form provided - that the entire package, including - but not restricted to - copyright, - trademark notices and disclaimers, as released by the initial developer - of the Software, is distributed. - -3. You may make modifications to the Software and distribute your - modifications, in a form that is separate from the Software, such as - patches. The following restrictions apply to modifications: - - a. Modifications must not alter or remove any copyright notices in - the Software. - - b. When modifications to the Software are released under this - license, a non-exclusive royalty-free right is granted to the - initial developer of the Software to distribute your modification - in future versions of the Software provided such versions remain - available under these terms in addition to any other license(s) of - the initial developer. - -4. You may distribute machine-executable forms of the Software or - machine-executable forms of modified versions of the Software, provided - that you meet these restrictions: - - a. You must include this license document in the distribution. - - b. You must ensure that all recipients of the machine-executable forms - are also able to receive the complete machine-readable source code - to the distributed Software, including all modifications, without - any charge beyond the costs of data transfer, and place prominent - notices in the distribution explaining this. - - c. You must ensure that all modifications included in the - machine-executable forms are available under the terms of this - license. - -5. You may use the original or modified versions of the Software to - compile, link and run application programs legally developed by you - or by others. - -6. You may develop application programs, reusable components and other - software items that link with the original or modified versions of the - Software. These items, when distributed, are subject to the following - requirements: - - a. You must ensure that all recipients of machine-executable forms of - these items are also able to receive and use the complete - machine-readable source code to the items without any charge - beyond the costs of data transfer. - - b. You must explicitly license all recipients of your items to use - and re-distribute original and modified versions of the items in - both machine-executable and source code forms. The recipients must - be able to do so without any charges whatsoever, and they must be - able to re-distribute to anyone they choose. - - - c. If the items are not available to the general public, and the - initial developer of the Software requests a copy of the items, - then you must supply one. - - Limitations of Liability - -In no event shall the initial developers or copyright holders be liable -for any damages whatsoever, including - but not restricted to - lost -revenue or profits or other direct, indirect, special, incidental or -consequential damages, even if they have been advised of the possibility -of such damages, except to the extent invariable law, if any, provides -otherwise. - - No Warranty - -The Software and this license document are provided AS IS with NO WARRANTY -OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE. - Choice of Law - -This license is governed by the Laws of Norway. Disputes shall be settled -by Oslo City Court. diff --git a/extern/solid/Makefile b/extern/solid/Makefile deleted file mode 100644 index 206dc21c3fb..00000000000 --- a/extern/solid/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -# -*- mode: gnumakefile; tab-width: 8; indent-tabs-mode: t; -*- -# vim: tabstop=8 -# -# $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): GSR -# -# ***** END GPL LICENSE BLOCK ***** -# -# - -include nan_definitions.mk - -SOURCEDIR = extern/solid -LIBNAMES = solid solid_broad solid_convex solid_complex -DIR = $(OCGDIR)/extern/ -DIRS = src - -include nan_subdirs.mk - -install: $(ALL_OR_DEBUG) - @[ -d $(NAN_SOLID) ] || mkdir -p $(NAN_SOLID) - @[ -d $(NAN_SOLID)/include/SOLID ] || mkdir -p $(NAN_SOLID)/include/SOLID - @[ -d $(NAN_SOLID)/include/SOLID/MT ] || mkdir -p $(NAN_SOLID)/include/SOLID/MT - @[ -d $(NAN_SOLID)/lib/$(DEBUG_DIR) ] || mkdir -p $(NAN_SOLID)/lib/$(DEBUG_DIR) - @for i in $(LIBNAMES); do \ - $(NANBLENDERHOME)/intern/tools/cpifdiff.sh $(DIR)/$$i/$(DEBUG_DIR)lib$$i.a $(NAN_SOLID)/lib/$(DEBUG_DIR) ; \ - if [ $(OS) = darwin ] ; then \ - ranlib $(NAN_SOLID)/lib/$(DEBUG_DIR)lib$$i.a ; \ - fi ; \ - done - @$(NANBLENDERHOME)/intern/tools/cpifdiff.sh include/*.h $(NAN_SOLID)/include/SOLID - @$(NANBLENDERHOME)/intern/tools/cpifdiff.sh include/MT/*.h $(NAN_SOLID)/include/SOLID/MT - - diff --git a/extern/solid/README.txt b/extern/solid/README.txt deleted file mode 100644 index 348d92b35cb..00000000000 --- a/extern/solid/README.txt +++ /dev/null @@ -1,55 +0,0 @@ - - SOLID - Software Library for Interference Detection - -SOLID is a software library containing functions for performing -intersection tests and proximity queries that are useful in the context -of collision detection. Collision detection is the process of detecting -pairs of geometric objects that are intersecting or are within a given -proximity of each other. In particular, SOLID is useful for detecting -collisions between objects that are moving relatively of each other over -time. The motions of objects are controlled by the client application, -and are not determined or affected by SOLID. - -This open-source edition of SOLID version 3 is released under the terms of -either the GNU Public License (GPL) or the Q Public License (QPL). This means -that for software created with SOLID version 3 you must comply with the terms -of one of these licenses. You may choose wich of these licenses best suits -your purpose. See the following files contained in this distribution for a -complete list of terms and conditions of these licenses: - - LICENSE_QPL.txt The Q Public License - LICENSE_GPL.txt The GNU General Public License - -These licenses do not permit the use of SOLID 3 in closed-source software -products. For enquiries about commercial use of SOLID, please contact -info@dtecta.com. - -SOLID 3 uses Qhull from The Geometry Center of the University of Minnesota. -Qhull is copyrighted as noted below. Qhull is free software and may be -obtained via anonymous ftp from geom.umn.edu. - - Qhull, Copyright (c) 1993-2002 - - The National Science and Technology Research Center for - Computation and Visualization of Geometric Structures - (The Geometry Center) - University of Minnesota - 400 Lind Hall - 207 Church Street S.E. - Minneapolis, MN 55455 USA - - email: qhull@geom.umn.edu - -Installation - -For details on how to install SOLID see the documention in the 'doc' directory. - -Platforms - -SOLID 3 has been tested on the following platforms: - - Linux IA32 gcc 2.95.3, gcc 3.3 - Win32 MSVC++ 6.0 SP4, MSVC++ 7.1 - - - diff --git a/extern/solid/SConscript b/extern/solid/SConscript deleted file mode 100644 index 8c54442ca73..00000000000 --- a/extern/solid/SConscript +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/python -import sys - -Import('env') - -defs = 'USE_DOUBLES QHULL _LIB' -cflags = [] - -if env['OURPLATFORM'] in ('win32-vc', 'win64-vc'): - defs += ' WIN32 NDEBUG _WINDOWS _LIB' - cflags += ['/MT', '/W3', '/GX', '/Og', '/Ot', '/Ob1', '/Op', '/G6'] -elif env['OURPLATFORM']=='win32-mingw': - defs += ' NDEBUG' - cflags += ['-O2'] -elif sys.platform=='linux2' or sys.platform=='linux-i386' or sys.platform=='freebsd4' or sys.platform=='freebsd5' or sys.platform=='openbsd3' or sys.platform=='sunos5': - defs += ' NDEBUG' - cflags += ['-O2'] -elif sys.platform=='darwin' : - defs += ' NDEBUG' - cflags += ['-O2','-pipe', '-fPIC', '-funsigned-char', '-ffast-math'] - -else: - print "################################################" - print - print "Check if solid builds on your platform correctly" - print "Add your platform specific defines" - print "and cflags / cxxflags to the" - print "extern/solid/SConscript file" - -sources = env.Glob('src/*.cpp') + env.Glob('src/convex/*.cpp') + env.Glob('src/complex/*.cpp') + env.Glob('src/broad/*.cpp') - -incs = 'include src src/broad src/complex src/convex ../qhull/include' - -env.BlenderLib ( libname='extern_solid', sources=sources, includes=Split(incs), defines=Split(defs), libtype=['extern'], priority=[10] , compileflags = cflags) diff --git a/extern/solid/SOLID/SOLID.h b/extern/solid/SOLID/SOLID.h deleted file mode 100644 index 37d74340f8c..00000000000 --- a/extern/solid/SOLID/SOLID.h +++ /dev/null @@ -1,279 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef SOLID_H -#define SOLID_H - -#include "SOLID_types.h" - -#ifdef __cplusplus -extern "C" { -#endif - - DT_DECLARE_HANDLE(DT_ObjectHandle); - DT_DECLARE_HANDLE(DT_SceneHandle); - DT_DECLARE_HANDLE(DT_ShapeHandle); - DT_DECLARE_HANDLE(DT_VertexBaseHandle); - DT_DECLARE_HANDLE(DT_RespTableHandle); - DT_DECLARE_HANDLE(DT_ArchiveHandle); - - typedef unsigned int DT_ResponseClass; - - typedef enum DT_ResponseType { - DT_NO_RESPONSE, /* No response (obsolete) */ - DT_BROAD_RESPONSE, - DT_SIMPLE_RESPONSE, /* No collision data */ - DT_WITNESSED_RESPONSE, /* A point common to both objects - is returned as collision data - */ - DT_DEPTH_RESPONSE /* The penetration depth is returned - as collision data. The penetration depth - is the shortest vector over which one - object needs to be translated in order - to bring the objects in touching contact. - */ - } DT_ResponseType; - -/* For witnessed response, the following structure represents a common point. The world - coordinates of 'point1' and 'point2' coincide. 'normal' is the zero vector. - - For depth response, the following structure represents the penetration depth. - 'point1' en 'point2' are the witness points of the penetration depth in world coordinates. - The penetration depth vector in world coordinates is represented by 'normal'. -*/ - - typedef struct DT_CollData { - DT_Vector3 point1; /* Point in object1 in world coordinates */ - DT_Vector3 point2; /* Point in object2 in world coordinates */ - DT_Vector3 normal; /* point2 - point1 */ - } DT_CollData; - -/* A response callback is called by SOLID for each pair of collding objects. 'client-data' - is a pointer to an arbitrary structure in the client application. The client objects are - pointers to structures in the client application associated with the coliding objects. - 'coll_data' is the collision data computed by SOLID. -*/ - - typedef DT_Bool (*DT_ResponseCallback)(void *client_data, - void *client_object1, - void *client_object2, - const DT_CollData *coll_data); - -/* Shape definition */ - - - extern DECLSPEC DT_ShapeHandle DT_NewBox(DT_Scalar x, DT_Scalar y, DT_Scalar z); - extern DECLSPEC DT_ShapeHandle DT_NewCone(DT_Scalar radius, DT_Scalar height); - extern DECLSPEC DT_ShapeHandle DT_NewCylinder(DT_Scalar radius, DT_Scalar height); - extern DECLSPEC DT_ShapeHandle DT_NewSphere(DT_Scalar radius); - extern DECLSPEC DT_ShapeHandle DT_NewPoint(const DT_Vector3 point); - extern DECLSPEC DT_ShapeHandle DT_NewLineSegment(const DT_Vector3 source, const DT_Vector3 target); - extern DECLSPEC DT_ShapeHandle DT_NewMinkowski(DT_ShapeHandle shape1, DT_ShapeHandle shape2); - extern DECLSPEC DT_ShapeHandle DT_NewHull(DT_ShapeHandle shape1, DT_ShapeHandle shape2); - - extern DECLSPEC DT_VertexBaseHandle DT_NewVertexBase(const void *pointer, DT_Size stride); - extern DECLSPEC void DT_DeleteVertexBase(DT_VertexBaseHandle vertexBase); - extern DECLSPEC void DT_ChangeVertexBase(DT_VertexBaseHandle vertexBase, const void *pointer); - - extern DECLSPEC DT_ShapeHandle DT_NewComplexShape(DT_VertexBaseHandle vertexBase); - extern DECLSPEC void DT_EndComplexShape(); - - extern DECLSPEC DT_ShapeHandle DT_NewPolytope(DT_VertexBaseHandle vertexBase); - extern DECLSPEC void DT_EndPolytope(); - - extern DECLSPEC void DT_Begin(); - extern DECLSPEC void DT_End(); - - extern DECLSPEC void DT_Vertex(const DT_Vector3 vertex); - extern DECLSPEC void DT_VertexIndex(DT_Index index); - - extern DECLSPEC void DT_VertexIndices(DT_Count count, const DT_Index *indices); - extern DECLSPEC void DT_VertexRange(DT_Index first, DT_Count count); - - extern DECLSPEC void DT_DeleteShape(DT_ShapeHandle shape); - -/* Object */ - - extern DECLSPEC DT_ObjectHandle DT_CreateObject( - void *client_object, /* pointer to object in client memory */ - DT_ShapeHandle shape /* the shape or geometry of the object */ - ); - - extern DECLSPEC void DT_DestroyObject(DT_ObjectHandle object); - - - - extern DECLSPEC void DT_SetPosition(DT_ObjectHandle object, const DT_Vector3 position); - extern DECLSPEC void DT_SetOrientation(DT_ObjectHandle object, const DT_Quaternion orientation); - extern DECLSPEC void DT_SetScaling(DT_ObjectHandle object, const DT_Vector3 scaling); - -/* The margin is an offset from the actual shape. The actual geometry of an - object is the set of points whose distance to the transformed shape is at - most the margin. During the lifetime of an object the margin can be - modified. -*/ - - extern DECLSPEC void DT_SetMargin(DT_ObjectHandle object, DT_Scalar margin); - - -/* These commands assume a column-major 4x4 OpenGL matrix representation */ - - extern DECLSPEC void DT_SetMatrixf(DT_ObjectHandle object, const float *m); - extern DECLSPEC void DT_GetMatrixf(DT_ObjectHandle object, float *m); - - extern DECLSPEC void DT_SetMatrixd(DT_ObjectHandle object, const double *m); - extern DECLSPEC void DT_GetMatrixd(DT_ObjectHandle object, double *m); - - extern DECLSPEC void DT_GetBBox(DT_ObjectHandle object, DT_Vector3 min, DT_Vector3 max); - - - extern DECLSPEC DT_Bool DT_GetIntersect(DT_ObjectHandle object1, DT_ObjectHandle object2, - DT_Vector3 v); -/* This next command returns the distance between the objects. De returned - closest points are given in world coordinates. -*/ - extern DECLSPEC DT_Scalar DT_GetClosestPair(DT_ObjectHandle object1, DT_ObjectHandle object2, - DT_Vector3 point1, DT_Vector3 point2); - - extern DECLSPEC DT_Bool DT_GetCommonPoint(DT_ObjectHandle object1, DT_ObjectHandle object2, - DT_Vector3 point); - - extern DECLSPEC DT_Bool DT_GetPenDepth(DT_ObjectHandle object1, DT_ObjectHandle object2, - DT_Vector3 point1, DT_Vector3 point2); - -/* Scene */ - - extern DECLSPEC DT_SceneHandle DT_CreateScene(); - extern DECLSPEC void DT_DestroyScene(DT_SceneHandle scene); - - extern DECLSPEC void DT_AddObject(DT_SceneHandle scene, DT_ObjectHandle object); - extern DECLSPEC void DT_RemoveObject(DT_SceneHandle scene, DT_ObjectHandle object); - -/* Note that objects can be assigned to multiple scenes! */ - -/* Response */ - -/* Response tables are defined independent of the scenes in which they are used. - Multiple response tables can be used in one scene, and a response table - can be shared among scenes. -*/ - extern DECLSPEC DT_RespTableHandle DT_CreateRespTable(); - extern DECLSPEC void DT_DestroyRespTable(DT_RespTableHandle respTable); - -/* Responses are defined on (pairs of) response classes. Each response table - maintains its set of response classes. -*/ - extern DECLSPEC DT_ResponseClass DT_GenResponseClass(DT_RespTableHandle respTable); - -/* To each object for which a response is defined in the response table a - response class needs to be assigned. -*/ - - extern DECLSPEC void DT_SetResponseClass(DT_RespTableHandle respTable, - DT_ObjectHandle object, - DT_ResponseClass responseClass); - - extern DECLSPEC void DT_ClearResponseClass(DT_RespTableHandle respTable, - DT_ObjectHandle object); - - extern DECLSPEC void DT_CallResponse(DT_RespTableHandle respTable, - DT_ObjectHandle object1, - DT_ObjectHandle object2, - const DT_CollData *coll_data); - -/* For each pair of objects multiple responses can be defined. A response is a callback - together with its response type and client data. */ - -/* Responses can be defined for all pairs of response classes... */ - extern DECLSPEC void DT_AddDefaultResponse(DT_RespTableHandle respTable, - DT_ResponseCallback response, - DT_ResponseType type, void *client_data); - - extern DECLSPEC void DT_RemoveDefaultResponse(DT_RespTableHandle respTable, - DT_ResponseCallback response); -/* ...per response class... */ - extern DECLSPEC void DT_AddClassResponse(DT_RespTableHandle respTable, - DT_ResponseClass responseClass, - DT_ResponseCallback response, - DT_ResponseType type, void *client_data); - - extern DECLSPEC void DT_RemoveClassResponse(DT_RespTableHandle respTable, - DT_ResponseClass responseClass, - DT_ResponseCallback response); - -/* ... and per pair of response classes...*/ - extern DECLSPEC void DT_AddPairResponse(DT_RespTableHandle respTable, - DT_ResponseClass responseClass1, - DT_ResponseClass responseClass2, - DT_ResponseCallback response, - DT_ResponseType type, void *client_data); - extern DECLSPEC void DT_RemovePairResponse(DT_RespTableHandle respTable, - DT_ResponseClass responseClass1, - DT_ResponseClass responseClass2, - DT_ResponseCallback response); - -/* The next command calls the response callbacks for all intersecting pairs of objects in a scene. - 'DT_Test' returns the number of pairs of objects for which callbacks have been called. -*/ - - extern DECLSPEC DT_Count DT_Test(DT_SceneHandle scene, DT_RespTableHandle respTable); - -/* Set the maximum relative error in the closest points and penetration depth - computation. The default for `max_error' is 1.0e-3. Larger errors result - in better performance. Non-positive error tolerances are ignored. -*/ - - extern DECLSPEC void DT_SetAccuracy(DT_Scalar max_error); - -/* Set the maximum tolerance on relative errors due to rounding. The default for `tol_error' - is the machine epsilon. Very large tolerances result in false collisions. Setting tol_error too small - results in missed collisions. Non-positive error tolerances are ignored. -*/ - - extern DECLSPEC void DT_SetTolerance(DT_Scalar tol_error); - - -/* This function returns the client pointer to the first object in a scene hit by the ray - (actually a line segment) defined by the points 'from' en 'to'. The spot is the hit point - on the object in local coordinates. 'normal' is the normal to the surface of the object in - world coordinates. The ignore_client pointer is used to make one of the objects transparent. - - NB: Currently ray tests are implemented for spheres, boxes, and meshes only!! -*/ - - extern DECLSPEC void *DT_RayCast(DT_SceneHandle scene, void *ignore_client, - const DT_Vector3 source, const DT_Vector3 target, - DT_Scalar max_param, DT_Scalar *param, DT_Vector3 normal); - -/* Similar, only here a single object is tested and a boolean is returned */ - - extern DECLSPEC DT_Bool DT_ObjectRayCast(DT_ObjectHandle object, - const DT_Vector3 source, const DT_Vector3 target, - DT_Scalar max_param, DT_Scalar *param, DT_Vector3 normal); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/extern/solid/SOLID/SOLID_broad.h b/extern/solid/SOLID/SOLID_broad.h deleted file mode 100644 index 74e4214fa67..00000000000 --- a/extern/solid/SOLID/SOLID_broad.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef SOLID_BROAD_H -#define SOLID_BROAD_H - -#include "SOLID_types.h" - -#ifdef __cplusplus -extern "C" { -#endif - - DT_DECLARE_HANDLE(BP_SceneHandle); - DT_DECLARE_HANDLE(BP_ProxyHandle); - - typedef void (*BP_Callback)(void *client_data, - void *object1, - void *object2); - - typedef bool (*BP_RayCastCallback)(void *client_data, - void *object, - const DT_Vector3 source, - const DT_Vector3 target, - DT_Scalar *lambda); - - extern DECLSPEC BP_SceneHandle BP_CreateScene(void *client_data, - BP_Callback beginOverlap, - BP_Callback endOverlap); - - extern DECLSPEC void BP_DestroyScene(BP_SceneHandle scene); - - extern DECLSPEC BP_ProxyHandle BP_CreateProxy(BP_SceneHandle scene, - void *object, - const DT_Vector3 min, - const DT_Vector3 max); - - extern DECLSPEC void BP_DestroyProxy(BP_SceneHandle scene, - BP_ProxyHandle proxy); - - extern DECLSPEC void BP_SetBBox(BP_ProxyHandle proxy, - const DT_Vector3 min, - const DT_Vector3 max); - - extern DECLSPEC void *BP_RayCast(BP_SceneHandle scene, - BP_RayCastCallback objectRayCast, - void *client_data, - const DT_Vector3 source, - const DT_Vector3 target, - DT_Scalar *lambda); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/extern/solid/SOLID/SOLID_types.h b/extern/solid/SOLID/SOLID_types.h deleted file mode 100644 index 630594e447f..00000000000 --- a/extern/solid/SOLID/SOLID_types.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef SOLID_TYPES_H -#define SOLID_TYPES_H - -#ifndef DECLSPEC -# ifdef WIN32 -# define DECLSPEC __declspec(dllexport) -# else -# define DECLSPEC -# endif -#endif - -#define DT_DECLARE_HANDLE(name) typedef struct name##__ { int unused; } *name - - -typedef unsigned short DT_Index; -typedef unsigned short DT_Count; -typedef unsigned int DT_Size; -typedef float DT_Scalar; -typedef int DT_Bool; - -#define DT_FALSE 0 -#define DT_TRUE 1 - -#define DT_CONTINUE 0 -#define DT_DONE 1 - -typedef DT_Scalar DT_Vector3[3]; -typedef DT_Scalar DT_Quaternion[4]; - -#endif diff --git a/extern/solid/VisualC6/broad/broad.dsp b/extern/solid/VisualC6/broad/broad.dsp deleted file mode 100644 index 1161d68fcd6..00000000000 --- a/extern/solid/VisualC6/broad/broad.dsp +++ /dev/null @@ -1,132 +0,0 @@ -# Microsoft Developer Studio Project File - Name="broad" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=broad - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "broad.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "broad.mak" CFG="broad - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "broad - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "broad - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "broad - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Target_Dir "" -LINK32=cwlink.exe -MTL=midl.exe -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "../../include" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ELSEIF "$(CFG)" == "broad - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Target_Dir "" -LINK32=cwlink.exe -MTL=midl.exe -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD CPP /nologo /MT /W3 /GX /Zd /Od /I "../../include" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ENDIF - -# Begin Target - -# Name "broad - Win32 Release" -# Name "broad - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE="..\..\src\broad\BP_C-api.cpp" -# End Source File -# Begin Source File - -SOURCE=..\..\src\broad\BP_EndpointList.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\src\broad\BP_Proxy.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\src\broad\BP_Scene.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=..\..\src\broad\BP_Endpoint.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\broad\BP_EndpointList.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\broad\BP_Proxy.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\broad\BP_ProxyList.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\broad\BP_Scene.h -# End Source File -# End Group -# End Target -# End Project diff --git a/extern/solid/VisualC6/complex/complex.dsp b/extern/solid/VisualC6/complex/complex.dsp deleted file mode 100644 index 74ea67b9e23..00000000000 --- a/extern/solid/VisualC6/complex/complex.dsp +++ /dev/null @@ -1,116 +0,0 @@ -# Microsoft Developer Studio Project File - Name="complex" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=complex - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "complex.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "complex.mak" CFG="complex - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "complex - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "complex - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "complex - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Target_Dir "" -LINK32=cwlink.exe -MTL=midl.exe -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "../../include" /I "../../src/convex" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ELSEIF "$(CFG)" == "complex - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Target_Dir "" -LINK32=cwlink.exe -MTL=midl.exe -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD CPP /nologo /MT /W3 /GX /Zd /Od /I "../../include" /I "../../src/convex" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ENDIF - -# Begin Target - -# Name "complex - Win32 Release" -# Name "complex - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\..\src\complex\DT_BBoxTree.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\src\complex\DT_Complex.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=..\..\src\complex\DT_BBoxTree.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\complex\DT_CBox.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\complex\DT_Complex.h -# End Source File -# End Group -# End Target -# End Project diff --git a/extern/solid/VisualC6/convex/convex.dsp b/extern/solid/VisualC6/convex/convex.dsp deleted file mode 100644 index ec9caace9d9..00000000000 --- a/extern/solid/VisualC6/convex/convex.dsp +++ /dev/null @@ -1,232 +0,0 @@ -# Microsoft Developer Studio Project File - Name="convex" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=convex - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "convex.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "convex.mak" CFG="convex - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "convex - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "convex - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "convex - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Target_Dir "" -LINK32=cwlink.exe -MTL=midl.exe -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "../../include" /I "../../../qhull/include" /D "NDEBUG" /D "QHULL" /D "WIN32" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ELSEIF "$(CFG)" == "convex - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Target_Dir "" -LINK32=cwlink.exe -MTL=midl.exe -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD CPP /nologo /MT /W3 /GX /Zd /Od /I "../../include" /I "../../../qhull/include" /D "_DEBUG" /D "QHULL" /D "WIN32" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ENDIF - -# Begin Target - -# Name "convex - Win32 Release" -# Name "convex - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\..\src\convex\DT_Accuracy.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_Box.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_Cone.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_Convex.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_Cylinder.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_Facet.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_LineSegment.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_PenDepth.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_Point.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_Polyhedron.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_Polytope.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_Sphere.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_Triangle.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=..\..\src\convex\DT_Accuracy.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_Array.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_Box.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_Cone.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_Convex.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_Cylinder.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_Facet.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_GJK.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_Hull.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_IndexArray.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_LineSegment.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_Minkowski.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_PenDepth.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_Point.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_Polyhedron.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_Polytope.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_Shape.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_Sphere.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_Transform.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_Triangle.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\convex\DT_VertexBase.h -# End Source File -# End Group -# End Target -# End Project diff --git a/extern/solid/VisualC6/dynamics/dynamics.dsp b/extern/solid/VisualC6/dynamics/dynamics.dsp deleted file mode 100644 index 9659cbf8a56..00000000000 --- a/extern/solid/VisualC6/dynamics/dynamics.dsp +++ /dev/null @@ -1,120 +0,0 @@ -# Microsoft Developer Studio Project File - Name="dynamics" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=dynamics - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "dynamics.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "dynamics.mak" CFG="dynamics - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "dynamics - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "dynamics - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "dynamics - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Target_Dir "" -LINK32=cwlink.exe -MTL=midl.exe -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "../../include" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ELSEIF "$(CFG)" == "dynamics - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Target_Dir "" -LINK32=cwlink.exe -MTL=midl.exe -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD CPP /nologo /MD /W3 /GX /Zd /Od /I "../../include" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ENDIF - -# Begin Target - -# Name "dynamics - Win32 Release" -# Name "dynamics - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\..\examples\dynamics\Dynamic.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\examples\dynamics\Kinetic.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\examples\dynamics\RigidBody.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=..\..\examples\dynamics\Dynamic.h -# End Source File -# Begin Source File - -SOURCE=..\..\examples\dynamics\Kinetic.h -# End Source File -# Begin Source File - -SOURCE=..\..\examples\dynamics\RigidBody.h -# End Source File -# End Group -# End Target -# End Project diff --git a/extern/solid/VisualC6/gldemo/gldemo.dsp b/extern/solid/VisualC6/gldemo/gldemo.dsp deleted file mode 100644 index f3cde286161..00000000000 --- a/extern/solid/VisualC6/gldemo/gldemo.dsp +++ /dev/null @@ -1,102 +0,0 @@ -# Microsoft Developer Studio Project File - Name="gldemo" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=gldemo - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "gldemo.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "gldemo.mak" CFG="gldemo - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "gldemo - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "gldemo - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "gldemo - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "gldemo - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MD /W3 /GX /Zd /Od /I "../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "gldemo - Win32 Release" -# Name "gldemo - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\..\examples\gldemo.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/extern/solid/VisualC6/mnm/mnm.dsp b/extern/solid/VisualC6/mnm/mnm.dsp deleted file mode 100644 index 2df6d951794..00000000000 --- a/extern/solid/VisualC6/mnm/mnm.dsp +++ /dev/null @@ -1,100 +0,0 @@ -# Microsoft Developer Studio Project File - Name="mnm" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=mnm - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "mnm.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "mnm.mak" CFG="mnm - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "mnm - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "mnm - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "mnm - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "../../include" /I "../../examples/dynamics" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "mnm - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MD /W3 /GX /Zd /Od /I "../../include" /I "../../examples/dynamics" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "mnm - Win32 Release" -# Name "mnm - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\..\examples\mnm.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/extern/solid/VisualC6/physics/physics.dsp b/extern/solid/VisualC6/physics/physics.dsp deleted file mode 100644 index dd69b6a35b2..00000000000 --- a/extern/solid/VisualC6/physics/physics.dsp +++ /dev/null @@ -1,100 +0,0 @@ -# Microsoft Developer Studio Project File - Name="physics" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=physics - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "physics.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "physics.mak" CFG="physics - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "physics - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "physics - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "physics - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "../../include" /I "../../examples/dynamics" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "physics - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MD /W3 /GX /Zd /Od /I "../../include" /I "../../examples/dynamics" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "physics - Win32 Release" -# Name "physics - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\..\examples\physics.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/extern/solid/VisualC6/sample/sample.dsp b/extern/solid/VisualC6/sample/sample.dsp deleted file mode 100644 index c6e0423cd04..00000000000 --- a/extern/solid/VisualC6/sample/sample.dsp +++ /dev/null @@ -1,102 +0,0 @@ -# Microsoft Developer Studio Project File - Name="sample" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=sample - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "sample.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "sample.mak" CFG="sample - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "sample - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "sample - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "sample - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "sample - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MD /W3 /GX /Zd /Od /I "../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "sample - Win32 Release" -# Name "sample - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\..\examples\sample.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/extern/solid/VisualC6/solid.dsw b/extern/solid/VisualC6/solid.dsw deleted file mode 100644 index 397cc4bf371..00000000000 --- a/extern/solid/VisualC6/solid.dsw +++ /dev/null @@ -1,89 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "broad"=".\broad\broad.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "complex"=".\complex\complex.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "convex"=".\convex\convex.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name qhull - End Project Dependency -}}} - -############################################################################### - -Project: "qhull"="..\..\qhull\VisualC6\qhull\qhull.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "solid"=".\solid\solid.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ - Begin Project Dependency - Project_Dep_Name broad - End Project Dependency - Begin Project Dependency - Project_Dep_Name complex - End Project Dependency - Begin Project Dependency - Project_Dep_Name convex - End Project Dependency -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/extern/solid/VisualC6/solid/solid.dsp b/extern/solid/VisualC6/solid/solid.dsp deleted file mode 100644 index 4ac7459c2f9..00000000000 --- a/extern/solid/VisualC6/solid/solid.dsp +++ /dev/null @@ -1,148 +0,0 @@ -# Microsoft Developer Studio Project File - Name="solid" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=solid - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "solid.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "solid.mak" CFG="solid - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "solid - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "solid - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "solid - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Target_Dir "" -LINK32=cwlink.exe -MTL=midl.exe -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "../../include" /I "../../src/convex" /I "../../src/complex" /D "NDEBUG" /D "QHULL" /D "WIN32" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo -# Begin Special Build Tool -SOURCE="$(InputPath)" -PostBuild_Cmds=XCOPY /Y ..\..\include\SOLID*.h ..\..\..\..\..\lib\windows\solid\include\solid\ XCOPY /Y Release\*.lib ..\..\..\..\..\lib\windows\solid\lib\ -# End Special Build Tool - -!ELSEIF "$(CFG)" == "solid - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Target_Dir "" -LINK32=cwlink.exe -MTL=midl.exe -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD CPP /nologo /MT /W3 /GX /Zd /Od /I "../../include" /I "../../src/convex" /I "../../src/complex" /D "_DEBUG" /D "QHULL" /D "WIN32" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo -# Begin Special Build Tool -SOURCE="$(InputPath)" -PostBuild_Cmds=XCOPY /Y ..\..\include\SOLID*.h ..\..\..\..\..\lib\windows\solid\include\solid\ XCOPY /Y Debug\*.lib ..\..\..\..\..\lib\windows\solid\lib\Debug\ -# End Special Build Tool - -!ENDIF - -# Begin Target - -# Name "solid - Win32 Release" -# Name "solid - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE="..\..\src\DT_C-api.cpp" -# End Source File -# Begin Source File - -SOURCE=..\..\src\DT_Encounter.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\src\DT_Object.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\src\DT_RespTable.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\src\DT_Scene.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=..\..\src\DT_AlgoTable.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\DT_Encounter.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\DT_Object.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\DT_Response.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\DT_RespTable.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\DT_Scene.h -# End Source File -# End Group -# End Target -# End Project diff --git a/extern/solid/VisualC6/solid_dll/solid_dll.dsp b/extern/solid/VisualC6/solid_dll/solid_dll.dsp deleted file mode 100644 index eed092502e0..00000000000 --- a/extern/solid/VisualC6/solid_dll/solid_dll.dsp +++ /dev/null @@ -1,147 +0,0 @@ -# Microsoft Developer Studio Project File - Name="solid_dll" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=solid_dll - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "solid_dll.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "solid_dll.mak" CFG="solid_dll - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "solid_dll - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "solid_dll - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "solid_dll - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "../../lib/win32/vc6" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SOLID_DLL_EXPORTS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "../../include" /I "../../src/convex" /I "../../src/complex" /D "NDEBUG" /D "USE_DOUBLES" /D "QHULL" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SOLID_DLL_EXPORTS" /YX /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"../../lib/win32/vc6/solid.dll" - -!ELSEIF "$(CFG)" == "solid_dll - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "../../lib/win32/vc6" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SOLID_DLL_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MD /W3 /GX /Zd /Od /I "../../include" /I "../../src/convex" /I "../../src/complex" /D "_DEBUG" /D "QHULL" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SOLID_DLL_EXPORTS" /YX /FD /GZ /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"../../lib/win32/vc6/solidd.dll" /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "solid_dll - Win32 Release" -# Name "solid_dll - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE="..\..\src\DT_C-api.cpp" -# End Source File -# Begin Source File - -SOURCE=..\..\src\DT_Encounter.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\src\DT_Object.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\src\DT_RespTable.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\src\DT_Scene.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=..\..\src\DT_AlgoTable.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\DT_Encounter.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\DT_Object.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\DT_Response.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\DT_RespTable.h -# End Source File -# Begin Source File - -SOURCE=..\..\src\DT_Scene.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/extern/solid/include/GEN_MinMax.h b/extern/solid/include/GEN_MinMax.h deleted file mode 100644 index 9ea961cfe4f..00000000000 --- a/extern/solid/include/GEN_MinMax.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef GEN_MINMAX_H -#define GEN_MINMAX_H - -template <class T> -inline const T& GEN_min(const T& a, const T& b) -{ - return b < a ? b : a; -} - -template <class T> -inline const T& GEN_max(const T& a, const T& b) -{ - return a < b ? b : a; -} - -template <class T> -inline const T& GEN_clamped(const T& a, const T& lb, const T& ub) -{ - return a < lb ? lb : (ub < a ? ub : a); -} - -template <class T> -inline void GEN_set_min(T& a, const T& b) -{ - if (b < a) - { - a = b; - } -} - -template <class T> -inline void GEN_set_max(T& a, const T& b) -{ - if (a < b) - { - a = b; - } -} - -template <class T> -inline void GEN_clamp(T& a, const T& lb, const T& ub) -{ - if (a < lb) - { - a = lb; - } - else if (ub < a) - { - a = ub; - } -} - -#endif diff --git a/extern/solid/include/GEN_random.h b/extern/solid/include/GEN_random.h deleted file mode 100644 index 4690a05511a..00000000000 --- a/extern/solid/include/GEN_random.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef GEN_RANDOM_H -#define GEN_RANDOM_H - -#ifdef MT19937 - -#include <limits.h> -#include <mt19937.h> - -#define GEN_RAND_MAX UINT_MAX - -inline void GEN_srand(unsigned int seed) { init_genrand(seed); } -inline unsigned int GEN_rand() { return genrand_int32(); } - -#else - -#include <stdlib.h> - -#define GEN_RAND_MAX RAND_MAX - -inline void GEN_srand(unsigned int seed) { srand(seed); } -inline unsigned int GEN_rand() { return rand(); } - -#endif - -#endif - diff --git a/extern/solid/include/MT/Interval.h b/extern/solid/include/MT/Interval.h deleted file mode 100644 index c6ba2fc1681..00000000000 --- a/extern/solid/include/MT/Interval.h +++ /dev/null @@ -1,180 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef INTERVAL_H -#define INTERVAL_H - -#if defined (__sgi) -#include <assert.h> -#else -#include <cassert> -#endif - -#include <iostream> -#include <algorithm> - -namespace MT { - - template <typename Scalar> - class Interval { - public: - Interval() {} - - -#if _MSC_VER <= 1200 - explicit Interval(const Scalar& x) - : m_lb(x), m_ub(x) - {} - - - Interval(const Scalar& lb, const Scalar& ub) - : m_lb(lb), m_ub(ub) - { - assert(lb <= ub); - } -#else - template <typename Scalar2> - explicit Interval(const Scalar2& x) - : m_lb(x), m_ub(x) - {} - - template <typename Scalar2> - Interval(const Scalar2& lb, const Scalar2& ub) - : m_lb(lb), m_ub(ub) - { - assert(lb <= ub); - } - - template <typename Scalar2> - Interval(const Interval<Scalar2>& z) - { - *this = z; - } - - template <typename Scalar2> - Interval<Scalar>& operator=(const Interval<Scalar2>& z) - { - m_lb = Scalar(z.lower()); - m_ub = Scalar(z.upper()); - return *this; - } -#endif - - - - Scalar& lower() { return m_lb; } - const Scalar& lower() const { return m_lb; } - - Scalar& upper() { return m_ub; } - const Scalar& upper() const { return m_ub; } - - Scalar center() const { return (m_lb + m_ub) * Scalar(0.5); } - Scalar extent() const { return (m_ub - m_lb) * Scalar(0.5); } - - - protected: - Scalar m_lb, m_ub; - }; - - template <typename Scalar> - inline Interval<Scalar> - operator+(const Interval<Scalar>& z1, const Interval<Scalar>& z2) - { - return Interval<Scalar>(z1.lower() + z2.lower(), - z1.upper() + z2.upper()); - } - - template <typename Scalar> - inline Interval<Scalar> - operator-(const Interval<Scalar>& z1, const Interval<Scalar>& z2) - { - return Interval<Scalar>(z1.lower() - z2.upper(), - z1.upper() - z2.lower()); - } - - template <typename Scalar> - inline std::ostream& - operator<<(std::ostream& os, const Interval<Scalar>& z) - { - return os << '[' << z.lower() << ", " << z.upper() << ']'; - } - - template <typename Scalar> - inline Scalar - median(const Interval<Scalar>& z) - { - return (z.lower() + z.upper()) * Scalar(0.5); - } - - template <typename Scalar> - inline Scalar - width(const Interval<Scalar>& z) - { - return z.upper() - z.lower(); - } - - template <typename Scalar> - inline bool - overlap(const Interval<Scalar>& z1, const Interval<Scalar>& z2) - { - return z1.lower() <= z2.upper() && z2.lower() <= z1.upper(); - } - - template <typename Scalar> - inline bool - in(const Interval<Scalar>& z1, const Interval<Scalar>& z2) - { - return z2.lower() <= z1.lower() && z1.upper() <= z2.upper(); - } - - template <typename Scalar> - inline bool - in(Scalar x, const Interval<Scalar>& z) - { - return z.lower() <= x && x <= z.upper(); - } - - template <typename Scalar> - inline Interval<Scalar> - widen(const Interval<Scalar>& z, const Scalar& x) - { - return Interval<Scalar>(z.lower() - x, z.upper() + x); - } - - template<typename Scalar> - inline Interval<Scalar> - hull(const Interval<Scalar>& z1, const Interval<Scalar>& z2) - { - return Interval<Scalar>(GEN_min(z1.lower(), z2.lower()), - GEN_max(z1.upper(), z2.upper())); - } - - template<typename Scalar> - inline Interval<Scalar> - operator+(Scalar x, const Interval<Scalar>& z) - { - return Interval<Scalar>(x + z.lower(), x + z.upper()); - } -} - -#endif diff --git a/extern/solid/include/MT/Matrix3x3.h b/extern/solid/include/MT/Matrix3x3.h deleted file mode 100644 index 85e0d4cac84..00000000000 --- a/extern/solid/include/MT/Matrix3x3.h +++ /dev/null @@ -1,380 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef MATRIX3X3_H -#define MATRIX3X3_H - -#if defined (__sgi) -#include <assert.h> -#else -#include <cassert> -#endif - -#include "Vector3.h" -#include "Quaternion.h" - -namespace MT { - - // Row-major 3x3 matrix - - template <typename Scalar> - class Matrix3x3 { - public: - Matrix3x3() {} - - template <typename Scalar2> - explicit Matrix3x3(const Scalar2 *m) { setValue(m); } - - explicit Matrix3x3(const Quaternion<Scalar>& q) { setRotation(q); } - - template <typename Scalar2> - Matrix3x3(const Scalar2& yaw, const Scalar2& pitch, const Scalar2& roll) - { - setEuler(yaw, pitch, roll); - } - - template <typename Scalar2> - Matrix3x3(const Scalar2& xx, const Scalar2& xy, const Scalar2& xz, - const Scalar2& yx, const Scalar2& yy, const Scalar2& yz, - const Scalar2& zx, const Scalar2& zy, const Scalar2& zz) - { - setValue(xx, xy, xz, - yx, yy, yz, - zx, zy, zz); - } - - Vector3<Scalar>& operator[](int i) - { - assert(0 <= i && i < 3); - return m_el[i]; - } - - const Vector3<Scalar>& operator[](int i) const - { - assert(0 <= i && i < 3); - return m_el[i]; - } - - Matrix3x3<Scalar>& operator*=(const Matrix3x3<Scalar>& m); - - template <typename Scalar2> - void setValue(const Scalar2 *m) - { - m_el[0][0] = Scalar(m[0]); - m_el[1][0] = Scalar(m[1]); - m_el[2][0] = Scalar(m[2]); - m_el[0][1] = Scalar(m[4]); - m_el[1][1] = Scalar(m[5]); - m_el[2][1] = Scalar(m[6]); - m_el[0][2] = Scalar(m[8]); - m_el[1][2] = Scalar(m[9]); - m_el[2][2] = Scalar(m[10]); - } - - template <typename Scalar2> - void setValue(const Scalar2& xx, const Scalar2& xy, const Scalar2& xz, - const Scalar2& yx, const Scalar2& yy, const Scalar2& yz, - const Scalar2& zx, const Scalar2& zy, const Scalar2& zz) - { - m_el[0][0] = Scalar(xx); - m_el[0][1] = Scalar(xy); - m_el[0][2] = Scalar(xz); - m_el[1][0] = Scalar(yx); - m_el[1][1] = Scalar(yy); - m_el[1][2] = Scalar(yz); - m_el[2][0] = Scalar(zx); - m_el[2][1] = Scalar(zy); - m_el[2][2] = Scalar(zz); - } - - void setRotation(const Quaternion<Scalar>& q) - { - Scalar d = q.length2(); - assert(d != Scalar(0.0)); - Scalar s = Scalar(2.0) / d; - Scalar xs = q[0] * s, ys = q[1] * s, zs = q[2] * s; - Scalar wx = q[3] * xs, wy = q[3] * ys, wz = q[3] * zs; - Scalar xx = q[0] * xs, xy = q[0] * ys, xz = q[0] * zs; - Scalar yy = q[1] * ys, yz = q[1] * zs, zz = q[2] * zs; - setValue(Scalar(1.0) - (yy + zz), xy - wz, xz + wy, - xy + wz, Scalar(1.0) - (xx + zz), yz - wx, - xz - wy, yz + wx, Scalar(1.0) - (xx + yy)); - } - - template <typename Scalar2> - void setEuler(const Scalar2& yaw, const Scalar2& pitch, const Scalar2& roll) - { - Scalar cy(Scalar_traits<Scalar>::cos(yaw)); - Scalar sy(Scalar_traits<Scalar>::sin(yaw)); - Scalar cp(Scalar_traits<Scalar>::cos(pitch)); - Scalar sp(Scalar_traits<Scalar>::sin(pitch)); - Scalar cr(Scalar_traits<Scalar>::cos(roll)); - Scalar sr(Scalar_traits<Scalar>::sin(roll)); - Scalar cc = cy * cr; - Scalar cs = cy * sr; - Scalar sc = sy * cr; - Scalar ss = sy * sr; - setValue(cy * cp, -sc + sp * cs, ss - sp * cc, - sy * cp, cc + sp * ss, -cs + sp * sc, - -sp, cp * sr, cp * cr); - } - void setIdentity() - { - setValue(Scalar(1.0), Scalar(0.0), Scalar(0.0), - Scalar(0.0), Scalar(1.0), Scalar(0.0), - Scalar(0.0), Scalar(0.0), Scalar(1.0)); - } - - template <typename Scalar2> - void getValue(Scalar2 *m) const - { - m[0] = Scalar2(m_el[0][0]); - m[1] = Scalar2(m_el[1][0]); - m[2] = Scalar2(m_el[2][0]); - m[3] = Scalar2(0.0); - m[4] = Scalar2(m_el[0][1]); - m[5] = Scalar2(m_el[1][1]); - m[6] = Scalar2(m_el[2][1]); - m[7] = Scalar2(0.0); - m[8] = Scalar2(m_el[0][2]); - m[9] = Scalar2(m_el[1][2]); - m[10] = Scalar2(m_el[2][2]); - m[11] = Scalar2(0.0); - } - - void getRotation(Quaternion<Scalar>& q) const - { - Scalar trace = m_el[0][0] + m_el[1][1] + m_el[2][2]; - - if (trace > Scalar(0.0)) - { - Scalar s = Scalar_traits<Scalar>::sqrt(trace + Scalar(1.0)); - q[3] = s * Scalar(0.5); - s = Scalar(0.5) / s; - - q[0] = (m_el[2][1] - m_el[1][2]) * s; - q[1] = (m_el[0][2] - m_el[2][0]) * s; - q[2] = (m_el[1][0] - m_el[0][1]) * s; - } - else - { - int i = m_el[0][0] < m_el[1][1] ? - (m_el[1][1] < m_el[2][2] ? 2 : 1) : - (m_el[0][0] < m_el[2][2] ? 2 : 0); - int j = (i + 1) % 3; - int k = (i + 2) % 3; - - Scalar s = Scalar_traits<Scalar>::sqrt(m_el[i][i] - m_el[j][j] - m_el[k][k] + Scalar(1.0)); - q[i] = s * Scalar(0.5); - s = Scalar(0.5) / s; - - q[3] = (m_el[k][j] - m_el[j][k]) * s; - q[j] = (m_el[j][i] + m_el[i][j]) * s; - q[k] = (m_el[k][i] + m_el[i][k]) * s; - } - } - - - - template <typename Scalar2> - void getEuler(Scalar2& yaw, Scalar2& pitch, Scalar2& roll) const - { - pitch = Scalar2(Scalar_traits<Scalar>::asin(-m_el[2][0])); - if (pitch < Scalar_traits<Scalar2>::TwoTimesPi()) - { - if (pitch > Scalar_traits<Scalar2>::TwoTimesPi()) - { - yaw = Scalar2(Scalar_traits<Scalar>::atan2(m_el[1][0], m_el[0][0])); - roll = Scalar2(Scalar_traits<Scalar>::atan2(m_el[2][1], m_el[2][2])); - } - else - { - yaw = Scalar2(-Scalar_traits<Scalar>::atan2(-m_el[0][1], m_el[0][2])); - roll = Scalar2(0.0); - } - } - else - { - yaw = Scalar2(Scalar_traits<Scalar>::atan2(-m_el[0][1], m_el[0][2])); - roll = Scalar2(0.0); - } - } - - Vector3<Scalar> getScaling() const - { - return Vector3<Scalar>(m_el[0][0] * m_el[0][0] + m_el[1][0] * m_el[1][0] + m_el[2][0] * m_el[2][0], - m_el[0][1] * m_el[0][1] + m_el[1][1] * m_el[1][1] + m_el[2][1] * m_el[2][1], - m_el[0][2] * m_el[0][2] + m_el[1][2] * m_el[1][2] + m_el[2][2] * m_el[2][2]); - } - - - Matrix3x3<Scalar> scaled(const Vector3<Scalar>& s) const - { - return Matrix3x3<Scalar>(m_el[0][0] * s[0], m_el[0][1] * s[1], m_el[0][2] * s[2], - m_el[1][0] * s[0], m_el[1][1] * s[1], m_el[1][2] * s[2], - m_el[2][0] * s[0], m_el[2][1] * s[1], m_el[2][2] * s[2]); - } - - Scalar determinant() const; - Matrix3x3<Scalar> adjoint() const; - Matrix3x3<Scalar> absolute() const; - Matrix3x3<Scalar> transpose() const; - Matrix3x3<Scalar> inverse() const; - - Matrix3x3<Scalar> transposeTimes(const Matrix3x3<Scalar>& m) const; - Matrix3x3<Scalar> timesTranspose(const Matrix3x3<Scalar>& m) const; - - Scalar tdot(int c, const Vector3<Scalar>& v) const - { - return m_el[0][c] * v[0] + m_el[1][c] * v[1] + m_el[2][c] * v[2]; - } - - protected: - Scalar cofac(int r1, int c1, int r2, int c2) const - { - return m_el[r1][c1] * m_el[r2][c2] - m_el[r1][c2] * m_el[r2][c1]; - } - - Vector3<Scalar> m_el[3]; - }; - - template <typename Scalar> - inline std::ostream& - operator<<(std::ostream& os, const Matrix3x3<Scalar>& m) - { - return os << m[0] << std::endl << m[1] << std::endl << m[2] << std::endl; - } - - template <typename Scalar> - inline Matrix3x3<Scalar>& - Matrix3x3<Scalar>::operator*=(const Matrix3x3<Scalar>& m) - { - setValue(m.tdot(0, m_el[0]), m.tdot(1, m_el[0]), m.tdot(2, m_el[0]), - m.tdot(0, m_el[1]), m.tdot(1, m_el[1]), m.tdot(2, m_el[1]), - m.tdot(0, m_el[2]), m.tdot(1, m_el[2]), m.tdot(2, m_el[2])); - return *this; - } - - template <typename Scalar> - inline Scalar - Matrix3x3<Scalar>::determinant() const - { - return triple((*this)[0], (*this)[1], (*this)[2]); - } - - - template <typename Scalar> - inline Matrix3x3<Scalar> - Matrix3x3<Scalar>::absolute() const - { - return Matrix3x3<Scalar>( - Scalar_traits<Scalar>::abs(m_el[0][0]), Scalar_traits<Scalar>::abs(m_el[0][1]), Scalar_traits<Scalar>::abs(m_el[0][2]), - Scalar_traits<Scalar>::abs(m_el[1][0]), Scalar_traits<Scalar>::abs(m_el[1][1]), Scalar_traits<Scalar>::abs(m_el[1][2]), - Scalar_traits<Scalar>::abs(m_el[2][0]), Scalar_traits<Scalar>::abs(m_el[2][1]), Scalar_traits<Scalar>::abs(m_el[2][2])); - } - - template <typename Scalar> - inline Matrix3x3<Scalar> - Matrix3x3<Scalar>::transpose() const - { - return Matrix3x3<Scalar>(m_el[0][0], m_el[1][0], m_el[2][0], - m_el[0][1], m_el[1][1], m_el[2][1], - m_el[0][2], m_el[1][2], m_el[2][2]); - } - - template <typename Scalar> - inline Matrix3x3<Scalar> - Matrix3x3<Scalar>::adjoint() const - { - return Matrix3x3<Scalar>(cofac(1, 1, 2, 2), cofac(0, 2, 2, 1), cofac(0, 1, 1, 2), - cofac(1, 2, 2, 0), cofac(0, 0, 2, 2), cofac(0, 2, 1, 0), - cofac(1, 0, 2, 1), cofac(0, 1, 2, 0), cofac(0, 0, 1, 1)); - } - - template <typename Scalar> - inline Matrix3x3<Scalar> - Matrix3x3<Scalar>::inverse() const - { - Vector3<Scalar> co(cofac(1, 1, 2, 2), cofac(1, 2, 2, 0), cofac(1, 0, 2, 1)); - Scalar det = (*this)[0].dot(co); - assert(det != Scalar(0.0)); - Scalar s = Scalar(1.0) / det; - return Matrix3x3<Scalar>(co[0] * s, cofac(0, 2, 2, 1) * s, cofac(0, 1, 1, 2) * s, - co[1] * s, cofac(0, 0, 2, 2) * s, cofac(0, 2, 1, 0) * s, - co[2] * s, cofac(0, 1, 2, 0) * s, cofac(0, 0, 1, 1) * s); - } - - template <typename Scalar> - inline Matrix3x3<Scalar> - Matrix3x3<Scalar>::transposeTimes(const Matrix3x3<Scalar>& m) const - { - return Matrix3x3<Scalar>( - m_el[0][0] * m[0][0] + m_el[1][0] * m[1][0] + m_el[2][0] * m[2][0], - m_el[0][0] * m[0][1] + m_el[1][0] * m[1][1] + m_el[2][0] * m[2][1], - m_el[0][0] * m[0][2] + m_el[1][0] * m[1][2] + m_el[2][0] * m[2][2], - m_el[0][1] * m[0][0] + m_el[1][1] * m[1][0] + m_el[2][1] * m[2][0], - m_el[0][1] * m[0][1] + m_el[1][1] * m[1][1] + m_el[2][1] * m[2][1], - m_el[0][1] * m[0][2] + m_el[1][1] * m[1][2] + m_el[2][1] * m[2][2], - m_el[0][2] * m[0][0] + m_el[1][2] * m[1][0] + m_el[2][2] * m[2][0], - m_el[0][2] * m[0][1] + m_el[1][2] * m[1][1] + m_el[2][2] * m[2][1], - m_el[0][2] * m[0][2] + m_el[1][2] * m[1][2] + m_el[2][2] * m[2][2]); - } - - template <typename Scalar> - inline Matrix3x3<Scalar> - Matrix3x3<Scalar>::timesTranspose(const Matrix3x3<Scalar>& m) const - { - return Matrix3x3<Scalar>( - m_el[0].dot(m[0]), m_el[0].dot(m[1]), m_el[0].dot(m[2]), - m_el[1].dot(m[0]), m_el[1].dot(m[1]), m_el[1].dot(m[2]), - m_el[2].dot(m[0]), m_el[2].dot(m[1]), m_el[2].dot(m[2])); - - } - - template <typename Scalar> - inline Vector3<Scalar> - operator*(const Matrix3x3<Scalar>& m, const Vector3<Scalar>& v) - { - return Vector3<Scalar>(m[0].dot(v), m[1].dot(v), m[2].dot(v)); - } - - - template <typename Scalar> - inline Vector3<Scalar> - operator*(const Vector3<Scalar>& v, const Matrix3x3<Scalar>& m) - { - return Vector3<Scalar>(m.tdot(0, v), m.tdot(1, v), m.tdot(2, v)); - } - - template <typename Scalar> - inline Matrix3x3<Scalar> - operator*(const Matrix3x3<Scalar>& m1, const Matrix3x3<Scalar>& m2) - { - return Matrix3x3<Scalar>( - m2.tdot(0, m1[0]), m2.tdot(1, m1[0]), m2.tdot(2, m1[0]), - m2.tdot(0, m1[1]), m2.tdot(1, m1[1]), m2.tdot(2, m1[1]), - m2.tdot(0, m1[2]), m2.tdot(1, m1[2]), m2.tdot(2, m1[2])); - } -} - -#endif diff --git a/extern/solid/include/MT/Quaternion.h b/extern/solid/include/MT/Quaternion.h deleted file mode 100644 index a925f21cd5d..00000000000 --- a/extern/solid/include/MT/Quaternion.h +++ /dev/null @@ -1,316 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef QUATERNION_H -#define QUATERNION_H - -#if defined (__sgi) -#include <assert.h> -#else -#include <cassert> -#endif - -#include "Tuple4.h" -#include "Vector3.h" - -namespace MT { - - template <typename Scalar> - class Quaternion : public Tuple4<Scalar> { - public: - Quaternion() {} - - template <typename Scalar2> - explicit Quaternion(const Scalar2 *v) : Tuple4<Scalar>(v) {} - - template <typename Scalar2> - Quaternion(const Scalar2& x, const Scalar2& y, const Scalar2& z, const Scalar2& w) - : Tuple4<Scalar>(x, y, z, w) - {} - - Quaternion(const Vector3<Scalar>& axis, const Scalar& angle) - { - setRotation(axis, angle); - } - - template <typename Scalar2> - Quaternion(const Scalar2& yaw, const Scalar2& pitch, const Scalar2& roll) - { - setEuler(yaw, pitch, roll); - } - - void setRotation(const Vector3<Scalar>& axis, const Scalar& angle) - { - Scalar d = axis.length(); - assert(d != Scalar(0.0)); - Scalar s = Scalar_traits<Scalar>::sin(angle * Scalar(0.5)) / d; - setValue(axis[0] * s, axis[1] * s, axis[2] * s, - Scalar_traits<Scalar>::cos(angle * Scalar(0.5))); - } - - template <typename Scalar2> - void setEuler(const Scalar2& yaw, const Scalar2& pitch, const Scalar2& roll) - { - Scalar halfYaw = Scalar(yaw) * Scalar(0.5); - Scalar halfPitch = Scalar(pitch) * Scalar(0.5); - Scalar halfRoll = Scalar(roll) * Scalar(0.5); - Scalar cosYaw = Scalar_traits<Scalar>::cos(halfYaw); - Scalar sinYaw = Scalar_traits<Scalar>::sin(halfYaw); - Scalar cosPitch = Scalar_traits<Scalar>::cos(halfPitch); - Scalar sinPitch = Scalar_traits<Scalar>::sin(halfPitch); - Scalar cosRoll = Scalar_traits<Scalar>::cos(halfRoll); - Scalar sinRoll = Scalar_traits<Scalar>::sin(halfRoll); - setValue(cosRoll * sinPitch * cosYaw + sinRoll * cosPitch * sinYaw, - cosRoll * cosPitch * sinYaw - sinRoll * sinPitch * cosYaw, - sinRoll * cosPitch * cosYaw - cosRoll * sinPitch * sinYaw, - cosRoll * cosPitch * cosYaw + sinRoll * sinPitch * sinYaw); - } - - Quaternion<Scalar>& operator+=(const Quaternion<Scalar>& q) - { - this->m_co[0] += q[0]; this->m_co[1] += q[1]; this->m_co[2] += q[2]; this->m_co[3] += q[3]; - return *this; - } - - Quaternion<Scalar>& operator-=(const Quaternion<Scalar>& q) - { - this->m_co[0] -= q[0]; this->m_co[1] -= q[1]; this->m_co[2] -= q[2]; this->m_co[3] -= q[3]; - return *this; - } - - Quaternion<Scalar>& operator*=(const Scalar& s) - { - this->m_co[0] *= s; this->m_co[1] *= s; this->m_co[2] *= s; this->m_co[3] *= s; - return *this; - } - - Quaternion<Scalar>& operator/=(const Scalar& s) - { - assert(s != Scalar(0.0)); - return *this *= Scalar(1.0) / s; - } - - Quaternion<Scalar>& operator*=(const Quaternion<Scalar>& q) - { - setValue(this->m_co[3] * q[0] + this->m_co[0] * q[3] + this->m_co[1] * q[2] - this->m_co[2] * q[1], - this->m_co[3] * q[1] + this->m_co[1] * q[3] + this->m_co[2] * q[0] - this->m_co[0] * q[2], - this->m_co[3] * q[2] + this->m_co[2] * q[3] + this->m_co[0] * q[1] - this->m_co[1] * q[0], - this->m_co[3] * q[3] - this->m_co[0] * q[0] - this->m_co[1] * q[1] - this->m_co[2] * q[2]); - return *this; - } - - Scalar dot(const Quaternion<Scalar>& q) const - { - return this->m_co[0] * q[0] + this->m_co[1] * q[1] + this->m_co[2] * q[2] + this->m_co[3] * q[3]; - } - - Scalar length2() const - { - return dot(*this); - } - - Scalar length() const - { - return Scalar_traits<Scalar>::sqrt(length2()); - } - - Quaternion<Scalar>& normalize() - { - return *this /= length(); - } - - Quaternion<Scalar> normalized() const - { - return *this / length(); - } - - Scalar angle(const Quaternion<Scalar>& q) const - { - Scalar s = Scalar_traits<Scalar>::sqrt(length2() * q.length2()); - assert(s != Scalar(0.0)); - return Scalar_traits<Scalar>::acos(dot(q) / s); - } - - Quaternion<Scalar> conjugate() const - { - return Quaternion<Scalar>(-this->m_co[0], -this->m_co[1], -this->m_co[2], this->m_co[3]); - } - - Quaternion<Scalar> inverse() const - { - return conjugate / length2(); - } - - Quaternion<Scalar> slerp(const Quaternion<Scalar>& q, const Scalar& t) const - { - Scalar theta = angle(q); - if (theta != Scalar(0.0)) - { - Scalar d = Scalar(1.0) / Scalar_traits<Scalar>::sin(theta); - Scalar s0 = Scalar_traits<Scalar>::sin((Scalar(1.0) - t) * theta); - Scalar s1 = Scalar_traits<Scalar>::sin(t * theta); - return Quaternion<Scalar>((this->m_co[0] * s0 + q[0] * s1) * d, - (this->m_co[1] * s0 + q[1] * s1) * d, - (this->m_co[2] * s0 + q[2] * s1) * d, - (this->m_co[3] * s0 + q[3] * s1) * d); - } - else - { - return *this; - } - } - - static Quaternion<Scalar> random() - { - // From: "Uniform Random Rotations", Ken Shoemake, Graphics Gems III, - // pg. 124-132 - Scalar x0 = Scalar_traits<Scalar>::random(); - Scalar r1 = Scalar_traits<Scalar>::sqrt(Scalar(1.0) - x0); - Scalar r2 = Scalar_traits<Scalar>::sqrt(x0); - Scalar t1 = Scalar_traits<Scalar>::TwoTimesPi() * Scalar_traits<Scalar>::random(); - Scalar t2 = Scalar_traits<Scalar>::TwoTimesPi() * Scalar_traits<Scalar>::random(); - Scalar c1 = Scalar_traits<Scalar>::cos(t1); - Scalar s1 = Scalar_traits<Scalar>::sin(t1); - Scalar c2 = Scalar_traits<Scalar>::cos(t2); - Scalar s2 = Scalar_traits<Scalar>::sin(t2); - return Quaternion<Scalar>(s1 * r1, c1 * r1, s2 * r2, c2 * r2); - } - - }; - - template <typename Scalar> - inline Quaternion<Scalar> - operator+(const Quaternion<Scalar>& q1, const Quaternion<Scalar>& q2) - { - return Quaternion<Scalar>(q1[0] + q2[0], q1[1] + q2[1], q1[2] + q2[2], q1[3] + q2[3]); - } - - template <typename Scalar> - inline Quaternion<Scalar> - operator-(const Quaternion<Scalar>& q1, const Quaternion<Scalar>& q2) - { - return Quaternion<Scalar>(q1[0] - q2[0], q1[1] - q2[1], q1[2] - q2[2], q1[3] - q2[3]); - } - - template <typename Scalar> - inline Quaternion<Scalar> - operator-(const Quaternion<Scalar>& q) - { - return Quaternion<Scalar>(-q[0], -q[1], -q[2], -q[3]); - } - - template <typename Scalar> - inline Quaternion<Scalar> - operator*(const Quaternion<Scalar>& q, const Scalar& s) - { - return Quaternion<Scalar>(q[0] * s, q[1] * s, q[2] * s, q[3] * s); - } - - template <typename Scalar> - inline Quaternion<Scalar> - operator*(const Scalar& s, const Quaternion<Scalar>& q) - { - return q * s; - } - - template <typename Scalar> - inline Quaternion<Scalar> - operator*(const Quaternion<Scalar>& q1, const Quaternion<Scalar>& q2) { - return Quaternion<Scalar>(q1[3] * q2[0] + q1[0] * q2[3] + q1[1] * q2[2] - q1[2] * q2[1], - q1[3] * q2[1] + q1[1] * q2[3] + q1[2] * q2[0] - q1[0] * q2[2], - q1[3] * q2[2] + q1[2] * q2[3] + q1[0] * q2[1] - q1[1] * q2[0], - q1[3] * q2[3] - q1[0] * q2[0] - q1[1] * q2[1] - q1[2] * q2[2]); - } - - template <typename Scalar> - inline Quaternion<Scalar> - operator*(const Quaternion<Scalar>& q, const Vector3<Scalar>& w) - { - return Quaternion<Scalar>( q[3] * w[0] + q[1] * w[2] - q[2] * w[1], - q[3] * w[1] + q[2] * w[0] - q[0] * w[2], - q[3] * w[2] + q[0] * w[1] - q[1] * w[0], - -q[0] * w[0] - q[1] * w[1] - q[2] * w[2]); - } - - template <typename Scalar> - inline Quaternion<Scalar> - operator*(const Vector3<Scalar>& w, const Quaternion<Scalar>& q) - { - return Quaternion<Scalar>( w[0] * q[3] + w[1] * q[2] - w[2] * q[1], - w[1] * q[3] + w[2] * q[0] - w[0] * q[2], - w[2] * q[3] + w[0] * q[1] - w[1] * q[0], - -w[0] * q[0] - w[1] * q[1] - w[2] * q[2]); - } - - template <typename Scalar> - inline Scalar - dot(const Quaternion<Scalar>& q1, const Quaternion<Scalar>& q2) - { - return q1.dot(q2); - } - - template <typename Scalar> - inline Scalar - length2(const Quaternion<Scalar>& q) - { - return q.length2(); - } - - template <typename Scalar> - inline Scalar - length(const Quaternion<Scalar>& q) - { - return q.length(); - } - - template <typename Scalar> - inline Scalar - angle(const Quaternion<Scalar>& q1, const Quaternion<Scalar>& q2) - { - return q1.angle(q2); - } - - template <typename Scalar> - inline Quaternion<Scalar> - conjugate(const Quaternion<Scalar>& q) - { - return q.conjugate(); - } - - template <typename Scalar> - inline Quaternion<Scalar> - inverse(const Quaternion<Scalar>& q) - { - return q.inverse(); - } - - template <typename Scalar> - inline Quaternion<Scalar> - slerp(const Quaternion<Scalar>& q1, const Quaternion<Scalar>& q2, const Scalar& t) - { - return q1.slerp(q2, t); - } - -} - -#endif diff --git a/extern/solid/include/MT/Transform.h b/extern/solid/include/MT/Transform.h deleted file mode 100644 index b80dc1bc18b..00000000000 --- a/extern/solid/include/MT/Transform.h +++ /dev/null @@ -1,189 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef TRANSFORM_H -#define TRANSFORM_H - -#include "Vector3.h" -#include "Matrix3x3.h" - -namespace MT { - - template <typename Scalar> - class Transform { - enum { - TRANSLATION = 0x01, - ROTATION = 0x02, - RIGID = TRANSLATION | ROTATION, - SCALING = 0x04, - LINEAR = ROTATION | SCALING, - AFFINE = TRANSLATION | LINEAR - }; - - public: - Transform() {} - - template <typename Scalar2> - explicit Transform(const Scalar2 *m) { setValue(m); } - - explicit Transform(const Quaternion<Scalar>& q, - const Vector3<Scalar>& c = Vector3<Scalar>(Scalar(0), Scalar(0), Scalar(0))) - : m_basis(q), - m_origin(c), - m_type(RIGID) - {} - - explicit Transform(const Matrix3x3<Scalar>& b, - const Vector3<Scalar>& c = Vector3<Scalar>(Scalar(0), Scalar(0), Scalar(0)), - unsigned int type = AFFINE) - : m_basis(b), - m_origin(c), - m_type(type) - {} - - Vector3<Scalar> operator()(const Vector3<Scalar>& x) const - { - return Vector3<Scalar>(m_basis[0].dot(x) + m_origin[0], - m_basis[1].dot(x) + m_origin[1], - m_basis[2].dot(x) + m_origin[2]); - } - - Vector3<Scalar> operator*(const Vector3<Scalar>& x) const - { - return (*this)(x); - } - - Matrix3x3<Scalar>& getBasis() { return m_basis; } - const Matrix3x3<Scalar>& getBasis() const { return m_basis; } - - Vector3<Scalar>& getOrigin() { return m_origin; } - const Vector3<Scalar>& getOrigin() const { return m_origin; } - - Quaternion<Scalar> getRotation() const { return m_basis.getRotation(); } - template <typename Scalar2> - void setValue(const Scalar2 *m) - { - m_basis.setValue(m); - m_origin.setValue(&m[12]); - m_type = AFFINE; - } - - template <typename Scalar2> - void getValue(Scalar2 *m) const - { - m_basis.getValue(m); - m_origin.getValue(&m[12]); - m[15] = Scalar2(1.0); - } - - void setOrigin(const Vector3<Scalar>& origin) - { - m_origin = origin; - m_type |= TRANSLATION; - } - - void setBasis(const Matrix3x3<Scalar>& basis) - { - m_basis = basis; - m_type |= LINEAR; - } - - void setRotation(const Quaternion<Scalar>& q) - { - m_basis.setRotation(q); - m_type = (m_type & ~LINEAR) | ROTATION; - } - - void scale(const Vector3<Scalar>& scaling) - { - m_basis = m_basis.scaled(scaling); - m_type |= SCALING; - } - - void setIdentity() - { - m_basis.setIdentity(); - m_origin.setValue(Scalar(0.0), Scalar(0.0), Scalar(0.0)); - m_type = 0x0; - } - - bool isIdentity() const { return m_type == 0x0; } - - Transform<Scalar>& operator*=(const Transform<Scalar>& t) - { - m_origin += m_basis * t.m_origin; - m_basis *= t.m_basis; - m_type |= t.m_type; - return *this; - } - - Transform<Scalar> inverse() const - { - Matrix3x3<Scalar> inv = (m_type & SCALING) ? - m_basis.inverse() : - m_basis.transpose(); - - return Transform<Scalar>(inv, inv * -m_origin, m_type); - } - - Transform<Scalar> inverseTimes(const Transform<Scalar>& t) const; - - Transform<Scalar> operator*(const Transform<Scalar>& t) const; - - private: - - Matrix3x3<Scalar> m_basis; - Vector3<Scalar> m_origin; - unsigned int m_type; - }; - - - template <typename Scalar> - inline Transform<Scalar> - Transform<Scalar>::inverseTimes(const Transform<Scalar>& t) const - { - Vector3<Scalar> v = t.getOrigin() - m_origin; - if (m_type & SCALING) - { - Matrix3x3<Scalar> inv = m_basis.inverse(); - return Transform<Scalar>(inv * t.getBasis(), inv * v, - m_type | t.m_type); - } - else - { - return Transform<Scalar>(m_basis.transposeTimes(t.m_basis), - v * m_basis, m_type | t.m_type); - } - } - - template <typename Scalar> - inline Transform<Scalar> - Transform<Scalar>::operator*(const Transform<Scalar>& t) const - { - return Transform<Scalar>(m_basis * t.m_basis, - (*this)(t.m_origin), - m_type | t.m_type); - } -} - -#endif diff --git a/extern/solid/include/MT/Tuple3.h b/extern/solid/include/MT/Tuple3.h deleted file mode 100644 index 52ea33b7f58..00000000000 --- a/extern/solid/include/MT/Tuple3.h +++ /dev/null @@ -1,120 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef TUPLE3_H -#define TUPLE3_H - -#if defined (__sgi) -#include <assert.h> -#else -#include <cassert> -#endif - -#include <iostream> - -namespace MT { - - template <typename Scalar> - class Tuple3 { - public: - Tuple3() {} - - template <typename Scalar2> - explicit Tuple3(const Scalar2 *v) - { - setValue(v); - } - - template <typename Scalar2> - Tuple3(const Scalar2& x, const Scalar2& y, const Scalar2& z) - { - setValue(x, y, z); - } - - template <typename Scalar2> - Tuple3(const Tuple3<Scalar2>& t) - { - *this = t; - } - - template <typename Scalar2> - Tuple3<Scalar>& operator=(const Tuple3<Scalar2>& t) - { - m_co[0] = Scalar(t[0]); - m_co[1] = Scalar(t[1]); - m_co[2] = Scalar(t[2]); - return *this; - } - - operator Scalar *() { return m_co; } - operator const Scalar *() const { return m_co; } - - Scalar& operator[](int i) { return m_co[i]; } - const Scalar& operator[](int i) const { return m_co[i]; } - - Scalar& x() { return m_co[0]; } - const Scalar& x() const { return m_co[0]; } - - Scalar& y() { return m_co[1]; } - const Scalar& y() const { return m_co[1]; } - - Scalar& z() { return m_co[2]; } - const Scalar& z() const { return m_co[2]; } - - template <typename Scalar2> - void setValue(const Scalar2 *v) - { - m_co[0] = Scalar(v[0]); - m_co[1] = Scalar(v[1]); - m_co[2] = Scalar(v[2]); - } - - template <typename Scalar2> - void setValue(const Scalar2& x, const Scalar2& y, const Scalar2& z) - { - m_co[0] = Scalar(x); - m_co[1] = Scalar(y); - m_co[2] = Scalar(z); - } - - template <typename Scalar2> - void getValue(Scalar2 *v) const - { - v[0] = Scalar2(m_co[0]); - v[1] = Scalar2(m_co[1]); - v[2] = Scalar2(m_co[2]); - } - - protected: - Scalar m_co[3]; - }; - - template <typename Scalar> - inline std::ostream& - operator<<(std::ostream& os, const Tuple3<Scalar>& t) - { - return os << t[0] << ' ' << t[1] << ' ' << t[2]; - } -} - -#endif diff --git a/extern/solid/include/MT/Tuple4.h b/extern/solid/include/MT/Tuple4.h deleted file mode 100644 index 6930541271e..00000000000 --- a/extern/solid/include/MT/Tuple4.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef TUPLE4_H -#define TUPLE4_H - -#if defined (__sgi) -#include <assert.h> -#else -#include <cassert> -#endif - -#include <iostream> - -namespace MT { - - template <typename Scalar> - class Tuple4 { - public: - Tuple4() {} - - template <typename Scalar2> - explicit Tuple4(const Scalar2 *v) - { - setValue(v); - } - - template <typename Scalar2> - Tuple4(const Scalar2& x, const Scalar2& y, const Scalar2& z, const Scalar2& w) - { - setValue(x, y, z, w); - } - - operator Scalar *() { return m_co; } - operator const Scalar *() const { return m_co; } - - Scalar& operator[](int i) { return m_co[i]; } - const Scalar& operator[](int i) const { return m_co[i]; } - - Scalar& x() { return m_co[0]; } - const Scalar& x() const { return m_co[0]; } - - Scalar& y() { return m_co[1]; } - const Scalar& y() const { return m_co[1]; } - - Scalar& z() { return m_co[2]; } - const Scalar& z() const { return m_co[2]; } - - Scalar& w() { return m_co[3]; } - const Scalar& w() const { return m_co[3]; } - - template <typename Scalar2> - void setValue(const Scalar2 *v) - { - m_co[0] = Scalar(v[0]); - m_co[1] = Scalar(v[1]); - m_co[2] = Scalar(v[2]); - m_co[3] = Scalar(v[3]); - } - - template <typename Scalar2> - void setValue(const Scalar2& x, const Scalar2& y, const Scalar2& z, const Scalar2& w) - { - m_co[0] = Scalar(x); - m_co[1] = Scalar(y); - m_co[2] = Scalar(z); - m_co[3] = Scalar(w); - } - - template <typename Scalar2> - void getValue(Scalar2 *v) const - { - v[0] = Scalar2(m_co[0]); - v[1] = Scalar2(m_co[1]); - v[2] = Scalar2(m_co[2]); - v[3] = Scalar2(m_co[3]); - } - - protected: - Scalar m_co[4]; - }; - - template <typename Scalar> - inline std::ostream& - operator<<(std::ostream& os, const Tuple4<Scalar>& t) - { - return os << t[0] << ' ' << t[1] << ' ' << t[2] << ' ' << t[3]; - } - -} - -#endif diff --git a/extern/solid/include/MT/Vector3.h b/extern/solid/include/MT/Vector3.h deleted file mode 100644 index b569c003f59..00000000000 --- a/extern/solid/include/MT/Vector3.h +++ /dev/null @@ -1,283 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef VECTOR3_H -#define VECTOR3_H - -#if defined (__sgi) -#include <assert.h> -#else -#include <cassert> -#endif - -#include "Tuple3.h" - -namespace MT { - - template <typename Scalar> - class Vector3 : public Tuple3<Scalar> { - public: - Vector3() {} - - template <typename Scalar2> - explicit Vector3(const Scalar2 *v) : Tuple3<Scalar>(v) {} - - template <typename Scalar2> - Vector3(const Scalar2& x, const Scalar2& y, const Scalar2& z) - : Tuple3<Scalar>(x, y, z) - {} - - Vector3<Scalar>& operator+=(const Vector3<Scalar>& v) - { - this->m_co[0] += v[0]; this->m_co[1] += v[1]; this->m_co[2] += v[2]; - return *this; - } - - Vector3<Scalar>& operator-=(const Vector3<Scalar>& v) - { - this->m_co[0] -= v[0]; this->m_co[1] -= v[1]; this->m_co[2] -= v[2]; - return *this; - } - - Vector3<Scalar>& operator*=(const Scalar& s) - { - this->m_co[0] *= s; this->m_co[1] *= s; this->m_co[2] *= s; - return *this; - } - - Vector3<Scalar>& operator/=(const Scalar& s) - { - assert(s != Scalar(0.0)); - return *this *= Scalar(1.0) / s; - } - - Scalar dot(const Vector3<Scalar>& v) const - { - return this->m_co[0] * v[0] + this->m_co[1] * v[1] + this->m_co[2] * v[2]; - } - - Scalar length2() const - { - return dot(*this); - } - - Scalar length() const - { - return Scalar_traits<Scalar>::sqrt(length2()); - } - - Scalar distance2(const Vector3<Scalar>& v) const - { - return (v - *this).length2(); - } - - Scalar distance(const Vector3<Scalar>& v) const - { - return (v - *this).length(); - } - - Vector3<Scalar>& normalize() - { - return *this /= length(); - } - - Vector3<Scalar> normalized() const - { - return *this / length(); - } - - Scalar angle(const Vector3<Scalar>& v) const - { - Scalar s = Scalar_traits<Scalar>::sqrt(length2() * v.length2()); - assert(s != Scalar(0.0)); - return Scalar_traits<Scalar>::acos(dot(v) / s); - } - - Vector3<Scalar> absolute() const - { - return Vector3<Scalar>(Scalar_traits<Scalar>::abs(this->m_co[0]), - Scalar_traits<Scalar>::abs(this->m_co[1]), - Scalar_traits<Scalar>::abs(this->m_co[2])); - } - - Vector3<Scalar> cross(const Vector3<Scalar>& v) const - { - return Vector3<Scalar>(this->m_co[1] * v[2] - this->m_co[2] * v[1], - this->m_co[2] * v[0] - this->m_co[0] * v[2], - this->m_co[0] * v[1] - this->m_co[1] * v[0]); - } - - Scalar triple(const Vector3<Scalar>& v1, const Vector3<Scalar>& v2) const - { - return this->m_co[0] * (v1[1] * v2[2] - v1[2] * v2[1]) + - this->m_co[1] * (v1[2] * v2[0] - v1[0] * v2[2]) + - this->m_co[2] * (v1[0] * v2[1] - v1[1] * v2[0]); - } - - int minAxis() const - { - return this->m_co[0] < this->m_co[1] ? (this->m_co[0] < this->m_co[2] ? 0 : 2) : (this->m_co[1] < this->m_co[2] ? 1 : 2); - } - - int maxAxis() const - { - return this->m_co[0] < this->m_co[1] ? (this->m_co[1] < this->m_co[2] ? 2 : 1) : (this->m_co[0] < this->m_co[2] ? 2 : 0); - } - - int furthestAxis() const - { - return absolute().minAxis(); - } - - int closestAxis() const - { - return absolute().maxAxis(); - } - - Vector3<Scalar> lerp(const Vector3<Scalar>& v, const Scalar& t) const - { - return Vector3<Scalar>(this->m_co[0] + (v[0] - this->m_co[0]) * t, - this->m_co[1] + (v[1] - this->m_co[1]) * t, - this->m_co[2] + (v[2] - this->m_co[2]) * t); - } - - static Vector3<Scalar> random() - { - Scalar z = Scalar(2.0) * Scalar_traits<Scalar>::random() - Scalar(1.0); - Scalar r = Scalar_traits<Scalar>::sqrt(Scalar(1.0) - z * z); - Scalar t = Scalar_traits<Scalar>::TwoTimesPi() * Scalar_traits<Scalar>::random(); - return Vector3<Scalar>(r * Scalar_traits<Scalar>::cos(t), - r * Scalar_traits<Scalar>::sin(t), - z); - } - }; - - template <typename Scalar> - inline Vector3<Scalar> - operator+(const Vector3<Scalar>& v1, const Vector3<Scalar>& v2) - { - return Vector3<Scalar>(v1[0] + v2[0], v1[1] + v2[1], v1[2] + v2[2]); - } - - template <typename Scalar> - inline Vector3<Scalar> - operator-(const Vector3<Scalar>& v1, const Vector3<Scalar>& v2) - { - return Vector3<Scalar>(v1[0] - v2[0], v1[1] - v2[1], v1[2] - v2[2]); - } - - template <typename Scalar> - inline Vector3<Scalar> - operator-(const Vector3<Scalar>& v) - { - return Vector3<Scalar>(-v[0], -v[1], -v[2]); - } - - template <typename Scalar> - inline Vector3<Scalar> - operator*(const Vector3<Scalar>& v, const Scalar& s) - { - return Vector3<Scalar>(v[0] * s, v[1] * s, v[2] * s); - } - - template <typename Scalar> - inline Vector3<Scalar> - operator*(const Scalar& s, const Vector3<Scalar>& v) - { - return v * s; - } - - template <typename Scalar> - inline Vector3<Scalar> - operator/(const Vector3<Scalar>& v, const Scalar& s) - { - assert(s != Scalar(0.0)); - return v * (Scalar(1.0) / s); - } - - template <typename Scalar> - inline Scalar - dot(const Vector3<Scalar>& v1, const Vector3<Scalar>& v2) - { - return v1.dot(v2); - } - - template <typename Scalar> - inline Scalar - length2(const Vector3<Scalar>& v) - { - return v.length2(); - } - - template <typename Scalar> - inline Scalar - length(const Vector3<Scalar>& v) - { - return v.length(); - } - - template <typename Scalar> - inline Scalar - distance2(const Vector3<Scalar>& v1, const Vector3<Scalar>& v2) - { - return v1.distance2(v2); - } - - template <typename Scalar> - inline Scalar - distance(const Vector3<Scalar>& v1, const Vector3<Scalar>& v2) - { - return v1.distance(v2); - } - - template <typename Scalar> - inline Scalar - angle(const Vector3<Scalar>& v1, const Vector3<Scalar>& v2) - { - return v1.angle(v2); - } - - template <typename Scalar> - inline Vector3<Scalar> - cross(const Vector3<Scalar>& v1, const Vector3<Scalar>& v2) - { - return v1.cross(v2); - } - - template <typename Scalar> - inline Scalar - triple(const Vector3<Scalar>& v1, const Vector3<Scalar>& v2, const Vector3<Scalar>& v3) - { - return v1.triple(v2, v3); - } - - template <typename Scalar> - inline Vector3<Scalar> - lerp(const Vector3<Scalar>& v1, const Vector3<Scalar>& v2, const Scalar& t) - { - return v1.lerp(v2, t); - } - -} - -#endif diff --git a/extern/solid/include/MT_BBox.h b/extern/solid/include/MT_BBox.h deleted file mode 100644 index b5dc537e0d9..00000000000 --- a/extern/solid/include/MT_BBox.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef MT_BBOX_H -#define MT_BBOX_H - -#include "MT_Scalar.h" -#include "MT_Point3.h" -#include "MT_Vector3.h" - -#include <MT/Tuple3.h> -#include "MT_Interval.h" - - - -class MT_BBox : public MT::Tuple3<MT_Interval> { -public: - MT_BBox() {} - MT_BBox(const MT_Point3& p) - : MT::Tuple3<MT_Interval>(MT_Interval(p[0]), - MT_Interval(p[1]), - MT_Interval(p[2])) - {} - MT_BBox(const MT_Point3& lb, const MT_Point3& ub) - : MT::Tuple3<MT_Interval>(MT_Interval(lb[0], ub[0]), - MT_Interval(lb[1], ub[1]), - MT_Interval(lb[2], ub[2])) - {} - MT_BBox(const MT_Interval& x, const MT_Interval& y, const MT_Interval& z) - : MT::Tuple3<MT_Interval>(x, y, z) - {} - - MT_Point3 getMin() const - { - return MT_Point3(m_co[0].lower(), m_co[1].lower(), m_co[2].lower()); - } - - MT_Point3 getMax() const - { - return MT_Point3(m_co[0].upper(), m_co[1].upper(), m_co[2].upper()); - } - - MT_Point3 getCenter() const - { - return MT_Point3(MT::median(m_co[0]), MT::median(m_co[1]), MT::median(m_co[2])); - } - - MT_Vector3 getExtent() const - { - return MT_Vector3(MT::width(m_co[0]) * MT_Scalar(0.5), MT::width(m_co[1]) * MT_Scalar(0.5), MT::width(m_co[2]) * MT_Scalar(0.5)); - } - - void extend(const MT_Vector3& v) - { - m_co[0] = MT::widen(m_co[0], v[0]); - m_co[1] = MT::widen(m_co[1], v[1]); - m_co[2] = MT::widen(m_co[2], v[2]); - } - - bool overlaps(const MT_BBox& b) const - { - return MT::overlap(m_co[0], b[0]) && - MT::overlap(m_co[1], b[1]) && - MT::overlap(m_co[2], b[2]); - } - - bool inside(const MT_BBox& b) const - { - return MT::in(m_co[0], b[0]) && - MT::in(m_co[1], b[1]) && - MT::in(m_co[2], b[2]); - } - - MT_BBox hull(const MT_BBox& b) const - { - return MT_BBox(MT::hull(m_co[0], b[0]), - MT::hull(m_co[1], b[1]), - MT::hull(m_co[2], b[2])); - } - - bool contains(const MT_Point3& p) const - { - return MT::in(p[0], m_co[0]) && MT::in(p[1], m_co[1]) && MT::in(p[2], m_co[2]); - } -}; - -inline MT_BBox operator+(const MT_BBox& b1, const MT_BBox& b2) -{ - return MT_BBox(b1[0] + b2[0], b1[1] + b2[1], b1[2] + b2[2]); -} - -inline MT_BBox operator-(const MT_BBox& b1, const MT_BBox& b2) -{ - return MT_BBox(b1[0] - b2[0], b1[1] - b2[1], b1[2] - b2[2]); -} - -#endif - - diff --git a/extern/solid/include/MT_Interval.h b/extern/solid/include/MT_Interval.h deleted file mode 100644 index 25ebfd0a67d..00000000000 --- a/extern/solid/include/MT_Interval.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef MT_INTERVAL_H -#define MT_INTERVAL_H - -#include <MT/Interval.h> - -#include "MT_Scalar.h" - -typedef MT::Interval<MT_Scalar> MT_Interval; - -#endif diff --git a/extern/solid/include/MT_Matrix3x3.h b/extern/solid/include/MT_Matrix3x3.h deleted file mode 100644 index f7572f90fa2..00000000000 --- a/extern/solid/include/MT_Matrix3x3.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef MT_MATRIX3X3_H -#define MT_MATRIX3X3_H - -#include "MT_Scalar.h" -#include <MT/Matrix3x3.h> - -typedef MT::Matrix3x3<MT_Scalar> MT_Matrix3x3; - - - -#endif diff --git a/extern/solid/include/MT_Point3.h b/extern/solid/include/MT_Point3.h deleted file mode 100644 index ca84f652b65..00000000000 --- a/extern/solid/include/MT_Point3.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef MT_POINT3_H -#define MT_POINT3_H - -#include "MT_Vector3.h" - -typedef MT_Vector3 MT_Point3; - -#endif diff --git a/extern/solid/include/MT_Quaternion.h b/extern/solid/include/MT_Quaternion.h deleted file mode 100644 index ca860db711c..00000000000 --- a/extern/solid/include/MT_Quaternion.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef MT_QUATERNION_H -#define MT_QUATERNION_H - -#include "MT_Scalar.h" -#include <MT/Quaternion.h> - -typedef MT::Quaternion<MT_Scalar> MT_Quaternion; - -#endif - - - diff --git a/extern/solid/include/MT_Scalar.h b/extern/solid/include/MT_Scalar.h deleted file mode 100644 index 663a1f1839c..00000000000 --- a/extern/solid/include/MT_Scalar.h +++ /dev/null @@ -1,158 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef MT_SCALAR_H -#define MT_SCALAR_H - -#if defined (__sun__) || defined ( __sun ) || defined (__sparc) || defined (__sparc__) || defined (__sgi) -#include <math.h> -#include <float.h> -#else -#include <cmath> -#include <cstdlib> -#include <cfloat> -#endif - -#undef max - -#include "SOLID_types.h" - -#include "GEN_MinMax.h" -#include "GEN_random.h" - -template <typename Scalar> -struct Scalar_traits {}; - -template<> -struct Scalar_traits<float> { - static float TwoTimesPi() { return 6.283185307179586232f; } - static float epsilon() { return FLT_EPSILON; } - static float max() { return FLT_MAX; } - - static float random() { return float(GEN_rand()) / float(GEN_RAND_MAX); } -#if defined (__sun) || defined (__sun__) || defined (__sparc) || defined (__APPLE__) - static float sqrt(float x) { return ::sqrt(x); } - static float abs(float x) { return ::fabs(x); } - - static float cos(float x) { return ::cos(x); } - static float sin(float x) { return ::sin(x); } - static float tan(float x) { return ::tan(x); } - - static float acos(float x) { return ::acos(x); } - static float asin(float x) { return ::asin(x); } - static float atan(float x) { return ::atan(x); } - static float atan2(float x, float y) { return ::atan2(x, y); } - - static float exp(float x) { return ::exp(x); } - static float log(float x) { return ::log(x); } - static float pow(float x, float y) { return ::pow(x, y); } - -#else - static float sqrt(float x) { return ::sqrtf(x); } - static float abs(float x) { return ::fabsf(x); } - - static float cos(float x) { return ::cosf(x); } - static float sin(float x) { return ::sinf(x); } - static float tan(float x) { return ::tanf(x); } - - static float acos(float x) { return ::acosf(x); } - static float asin(float x) { return ::asinf(x); } - static float atan(float x) { return ::atanf(x); } - static float atan2(float x, float y) { return ::atan2f(x, y); } - - static float exp(float x) { return ::expf(x); } - static float log(float x) { return ::logf(x); } - static float pow(float x, float y) { return ::powf(x, y); } -#endif -}; - -template<> -struct Scalar_traits<double> { - static double TwoTimesPi() { return 6.283185307179586232; } - static double epsilon() { return DBL_EPSILON; } - static double max() { return DBL_MAX; } - - static double random() { return double(GEN_rand()) / double(GEN_RAND_MAX); } - static double sqrt(double x) { return ::sqrt(x); } - static double abs(double x) { return ::fabs(x); } - - static double cos(double x) { return ::cos(x); } - static double sin(double x) { return ::sin(x); } - static double tan(double x) { return ::tan(x); } - - static double acos(double x) { return ::acos(x); } - static double asin(double x) { return ::asin(x); } - static double atan(double x) { return ::atan(x); } - static double atan2(double x, double y) { return ::atan2(x, y); } - - static double exp(double x) { return ::exp(x); } - static double log(double x) { return ::log(x); } - static double pow(double x, double y) { return ::pow(x, y); } -}; - -#ifdef USE_TRACER -#include "MT_ScalarTracer.h" - -#ifdef USE_DOUBLES -typedef MT_ScalarTracer<double> MT_Scalar; -#else -typedef MT_ScalarTracer<float> MT_Scalar; -#endif - -#else - -#ifdef USE_DOUBLES -typedef double MT_Scalar; -#else -typedef float MT_Scalar; -#endif - -#endif - - -const MT_Scalar MT_2_PI = Scalar_traits<MT_Scalar>::TwoTimesPi(); -const MT_Scalar MT_PI = MT_2_PI * MT_Scalar(0.5); -const MT_Scalar MT_HALF_PI = MT_2_PI * MT_Scalar(0.25); -const MT_Scalar MT_RADS_PER_DEG = MT_2_PI / MT_Scalar(360.0); -const MT_Scalar MT_DEGS_PER_RAD = MT_Scalar(360.0) / MT_2_PI; - -const MT_Scalar MT_EPSILON = Scalar_traits<MT_Scalar>::epsilon(); -const MT_Scalar MT_INFINITY = Scalar_traits<MT_Scalar>::max(); - -inline MT_Scalar MT_random() { return Scalar_traits<MT_Scalar>::random(); } -inline MT_Scalar MT_abs(MT_Scalar x) { return Scalar_traits<MT_Scalar>::abs(x); } -inline MT_Scalar MT_sqrt(MT_Scalar x) { return Scalar_traits<MT_Scalar>::sqrt(x); } - -inline MT_Scalar MT_cos(MT_Scalar x) { return Scalar_traits<MT_Scalar>::cos(x); } -inline MT_Scalar MT_sin(MT_Scalar x) { return Scalar_traits<MT_Scalar>::sin(x); } -inline MT_Scalar MT_tan(MT_Scalar x) { return Scalar_traits<MT_Scalar>::tan(x); } - -inline MT_Scalar MT_acos(MT_Scalar x) { return Scalar_traits<MT_Scalar>::acos(x); } -inline MT_Scalar MT_asin(MT_Scalar x) { return Scalar_traits<MT_Scalar>::asin(x); } -inline MT_Scalar MT_atan(MT_Scalar x) { return Scalar_traits<MT_Scalar>::atan(x); } -inline MT_Scalar MT_atan2(MT_Scalar x, MT_Scalar y) { return Scalar_traits<MT_Scalar>::atan2(x, y); } - -inline MT_Scalar MT_radians(MT_Scalar x) { return x * MT_RADS_PER_DEG; } -inline MT_Scalar MT_degrees(MT_Scalar x) { return x * MT_DEGS_PER_RAD; } - -#endif diff --git a/extern/solid/include/MT_Transform.h b/extern/solid/include/MT_Transform.h deleted file mode 100644 index 66f92428054..00000000000 --- a/extern/solid/include/MT_Transform.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef MT_TRANSFORM_H -#define MT_TRANSFORM_H - -#include "MT_Scalar.h" -#include <MT/Transform.h> - -typedef MT::Matrix3x3<MT_Scalar> MT_Matrix3x3; -typedef MT::Transform<MT_Scalar> MT_Transform; - -#endif - - - - - diff --git a/extern/solid/include/MT_Vector3.h b/extern/solid/include/MT_Vector3.h deleted file mode 100644 index d50e80dc287..00000000000 --- a/extern/solid/include/MT_Vector3.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef MT_VECTOR3_H -#define MT_VECTOR3_H - -#include "MT_Scalar.h" -#include <MT/Vector3.h> - -typedef MT::Vector3<MT_Scalar> MT_Vector3; - -#ifdef CPU_CMP - -inline bool operator==(const MT_Vector3& p1, const MT_Vector3& p2) -{ - const unsigned int *i1 = (const unsigned int *)&p1; - const unsigned int *i2 = (const unsigned int *)&p2; - return i1[0] == i2[0] && i1[1] == i2[1] && i1[2] == i2[2]; -} - -#else - -inline bool operator==(const MT_Vector3& p1, const MT_Vector3& p2) -{ - return p1[0] == p2[0] && p1[1] == p2[1] && p1[2] == p2[2]; -} - -#endif - -#endif diff --git a/extern/solid/include/SOLID.h b/extern/solid/include/SOLID.h deleted file mode 100644 index 96d40f1ea6b..00000000000 --- a/extern/solid/include/SOLID.h +++ /dev/null @@ -1,279 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef SOLID_H -#define SOLID_H - -#include "SOLID_types.h" - -#ifdef __cplusplus -extern "C" { -#endif - - DT_DECLARE_HANDLE(DT_ObjectHandle); - DT_DECLARE_HANDLE(DT_SceneHandle); - DT_DECLARE_HANDLE(DT_ShapeHandle); - DT_DECLARE_HANDLE(DT_VertexBaseHandle); - DT_DECLARE_HANDLE(DT_RespTableHandle); - DT_DECLARE_HANDLE(DT_ArchiveHandle); - - typedef unsigned int DT_ResponseClass; - - typedef enum DT_ResponseType { - DT_NO_RESPONSE, /* No response (obsolete) */ - DT_BROAD_RESPONSE, /* Broad phase response is returned. */ - DT_SIMPLE_RESPONSE, /* No collision data */ - DT_WITNESSED_RESPONSE, /* A point common to both objects - is returned as collision data - */ - DT_DEPTH_RESPONSE /* The penetration depth is returned - as collision data. The penetration depth - is the shortest vector over which one - object needs to be translated in order - to bring the objects in touching contact. - */ - } DT_ResponseType; - -/* For witnessed response, the following structure represents a common point. The world - coordinates of 'point1' and 'point2' coincide. 'normal' is the zero vector. - - For depth response, the following structure represents the penetration depth. - 'point1' en 'point2' are the witness points of the penetration depth in world coordinates. - The penetration depth vector in world coordinates is represented by 'normal'. -*/ - - typedef struct DT_CollData { - DT_Vector3 point1; /* Point in object1 in world coordinates */ - DT_Vector3 point2; /* Point in object2 in world coordinates */ - DT_Vector3 normal; /* point2 - point1 */ - } DT_CollData; - -/* A response callback is called by SOLID for each pair of collding objects. 'client-data' - is a pointer to an arbitrary structure in the client application. The client objects are - pointers to structures in the client application associated with the coliding objects. - 'coll_data' is the collision data computed by SOLID. -*/ - - typedef DT_Bool (*DT_ResponseCallback)(void *client_data, - void *client_object1, - void *client_object2, - const DT_CollData *coll_data); - -/* Shape definition */ - - - extern DECLSPEC DT_ShapeHandle DT_NewBox(DT_Scalar x, DT_Scalar y, DT_Scalar z); - extern DECLSPEC DT_ShapeHandle DT_NewCone(DT_Scalar radius, DT_Scalar height); - extern DECLSPEC DT_ShapeHandle DT_NewCylinder(DT_Scalar radius, DT_Scalar height); - extern DECLSPEC DT_ShapeHandle DT_NewSphere(DT_Scalar radius); - extern DECLSPEC DT_ShapeHandle DT_NewPoint(const DT_Vector3 point); - extern DECLSPEC DT_ShapeHandle DT_NewLineSegment(const DT_Vector3 source, const DT_Vector3 target); - extern DECLSPEC DT_ShapeHandle DT_NewMinkowski(DT_ShapeHandle shape1, DT_ShapeHandle shape2); - extern DECLSPEC DT_ShapeHandle DT_NewHull(DT_ShapeHandle shape1, DT_ShapeHandle shape2); - - extern DECLSPEC DT_VertexBaseHandle DT_NewVertexBase(const void *pointer, DT_Size stride); - extern DECLSPEC void DT_DeleteVertexBase(DT_VertexBaseHandle vertexBase); - extern DECLSPEC void DT_ChangeVertexBase(DT_VertexBaseHandle vertexBase, const void *pointer); - - extern DECLSPEC DT_ShapeHandle DT_NewComplexShape(DT_VertexBaseHandle vertexBase); - extern DECLSPEC void DT_EndComplexShape(); - - extern DECLSPEC DT_ShapeHandle DT_NewPolytope(DT_VertexBaseHandle vertexBase); - extern DECLSPEC void DT_EndPolytope(); - - extern DECLSPEC void DT_Begin(); - extern DECLSPEC void DT_End(); - - extern DECLSPEC void DT_Vertex(const DT_Vector3 vertex); - extern DECLSPEC void DT_VertexIndex(DT_Index index); - - extern DECLSPEC void DT_VertexIndices(DT_Count count, const DT_Index *indices); - extern DECLSPEC void DT_VertexRange(DT_Index first, DT_Count count); - - extern DECLSPEC void DT_DeleteShape(DT_ShapeHandle shape); - -/* Object */ - - extern DECLSPEC DT_ObjectHandle DT_CreateObject( - void *client_object, /* pointer to object in client memory */ - DT_ShapeHandle shape /* the shape or geometry of the object */ - ); - - extern DECLSPEC void DT_DestroyObject(DT_ObjectHandle object); - - - - extern DECLSPEC void DT_SetPosition(DT_ObjectHandle object, const DT_Vector3 position); - extern DECLSPEC void DT_SetOrientation(DT_ObjectHandle object, const DT_Quaternion orientation); - extern DECLSPEC void DT_SetScaling(DT_ObjectHandle object, const DT_Vector3 scaling); - -/* The margin is an offset from the actual shape. The actual geometry of an - object is the set of points whose distance to the transformed shape is at - most the margin. During the lifetime of an object the margin can be - modified. -*/ - - extern DECLSPEC void DT_SetMargin(DT_ObjectHandle object, DT_Scalar margin); - - -/* These commands assume a column-major 4x4 OpenGL matrix representation */ - - extern DECLSPEC void DT_SetMatrixf(DT_ObjectHandle object, const float *m); - extern DECLSPEC void DT_GetMatrixf(DT_ObjectHandle object, float *m); - - extern DECLSPEC void DT_SetMatrixd(DT_ObjectHandle object, const double *m); - extern DECLSPEC void DT_GetMatrixd(DT_ObjectHandle object, double *m); - - extern DECLSPEC void DT_GetBBox(DT_ObjectHandle object, DT_Vector3 min, DT_Vector3 max); - - - extern DECLSPEC DT_Bool DT_GetIntersect(DT_ObjectHandle object1, DT_ObjectHandle object2, - DT_Vector3 v); -/* This next command returns the distance between the objects. De returned - closest points are given in world coordinates. -*/ - extern DECLSPEC DT_Scalar DT_GetClosestPair(DT_ObjectHandle object1, DT_ObjectHandle object2, - DT_Vector3 point1, DT_Vector3 point2); - - extern DECLSPEC DT_Bool DT_GetCommonPoint(DT_ObjectHandle object1, DT_ObjectHandle object2, - DT_Vector3 point); - - extern DECLSPEC DT_Bool DT_GetPenDepth(DT_ObjectHandle object1, DT_ObjectHandle object2, - DT_Vector3 point1, DT_Vector3 point2); - -/* Scene */ - - extern DECLSPEC DT_SceneHandle DT_CreateScene(); - extern DECLSPEC void DT_DestroyScene(DT_SceneHandle scene); - - extern DECLSPEC void DT_AddObject(DT_SceneHandle scene, DT_ObjectHandle object); - extern DECLSPEC void DT_RemoveObject(DT_SceneHandle scene, DT_ObjectHandle object); - -/* Note that objects can be assigned to multiple scenes! */ - -/* Response */ - -/* Response tables are defined independent of the scenes in which they are used. - Multiple response tables can be used in one scene, and a response table - can be shared among scenes. -*/ - extern DECLSPEC DT_RespTableHandle DT_CreateRespTable(); - extern DECLSPEC void DT_DestroyRespTable(DT_RespTableHandle respTable); - -/* Responses are defined on (pairs of) response classes. Each response table - maintains its set of response classes. -*/ - extern DECLSPEC DT_ResponseClass DT_GenResponseClass(DT_RespTableHandle respTable); - -/* To each object for which a response is defined in the response table a - response class needs to be assigned. -*/ - - extern DECLSPEC void DT_SetResponseClass(DT_RespTableHandle respTable, - DT_ObjectHandle object, - DT_ResponseClass responseClass); - - extern DECLSPEC void DT_ClearResponseClass(DT_RespTableHandle respTable, - DT_ObjectHandle object); - - extern DECLSPEC void DT_CallResponse(DT_RespTableHandle respTable, - DT_ObjectHandle object1, - DT_ObjectHandle object2, - const DT_CollData *coll_data); - -/* For each pair of objects multiple responses can be defined. A response is a callback - together with its response type and client data. */ - -/* Responses can be defined for all pairs of response classes... */ - extern DECLSPEC void DT_AddDefaultResponse(DT_RespTableHandle respTable, - DT_ResponseCallback response, - DT_ResponseType type, void *client_data); - - extern DECLSPEC void DT_RemoveDefaultResponse(DT_RespTableHandle respTable, - DT_ResponseCallback response); -/* ...per response class... */ - extern DECLSPEC void DT_AddClassResponse(DT_RespTableHandle respTable, - DT_ResponseClass responseClass, - DT_ResponseCallback response, - DT_ResponseType type, void *client_data); - - extern DECLSPEC void DT_RemoveClassResponse(DT_RespTableHandle respTable, - DT_ResponseClass responseClass, - DT_ResponseCallback response); - -/* ... and per pair of response classes...*/ - extern DECLSPEC void DT_AddPairResponse(DT_RespTableHandle respTable, - DT_ResponseClass responseClass1, - DT_ResponseClass responseClass2, - DT_ResponseCallback response, - DT_ResponseType type, void *client_data); - extern DECLSPEC void DT_RemovePairResponse(DT_RespTableHandle respTable, - DT_ResponseClass responseClass1, - DT_ResponseClass responseClass2, - DT_ResponseCallback response); - -/* The next command calls the response callbacks for all intersecting pairs of objects in a scene. - 'DT_Test' returns the number of pairs of objects for which callbacks have been called. -*/ - - extern DECLSPEC DT_Count DT_Test(DT_SceneHandle scene, DT_RespTableHandle respTable); - -/* Set the maximum relative error in the closest points and penetration depth - computation. The default for `max_error' is 1.0e-3. Larger errors result - in better performance. Non-positive error tolerances are ignored. -*/ - - extern DECLSPEC void DT_SetAccuracy(DT_Scalar max_error); - -/* Set the maximum tolerance on relative errors due to rounding. The default for `tol_error' - is the machine epsilon. Very large tolerances result in false collisions. Setting tol_error too small - results in missed collisions. Non-positive error tolerances are ignored. -*/ - - extern DECLSPEC void DT_SetTolerance(DT_Scalar tol_error); - - -/* This function returns the client pointer to the first object in a scene hit by the ray - (actually a line segment) defined by the points 'from' en 'to'. The spot is the hit point - on the object in local coordinates. 'normal' is the normal to the surface of the object in - world coordinates. The ignore_client pointer is used to make one of the objects transparent. - - NB: Currently ray tests are implemented for spheres, boxes, and meshes only!! -*/ - - extern DECLSPEC void *DT_RayCast(DT_SceneHandle scene, void *ignore_client, - const DT_Vector3 source, const DT_Vector3 target, - DT_Scalar max_param, DT_Scalar *param, DT_Vector3 normal); - -/* Similar, only here a single object is tested and a boolean is returned */ - - extern DECLSPEC DT_Bool DT_ObjectRayCast(DT_ObjectHandle object, - const DT_Vector3 source, const DT_Vector3 target, - DT_Scalar max_param, DT_Scalar *param, DT_Vector3 normal); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/extern/solid/include/SOLID_broad.h b/extern/solid/include/SOLID_broad.h deleted file mode 100644 index 74e4214fa67..00000000000 --- a/extern/solid/include/SOLID_broad.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef SOLID_BROAD_H -#define SOLID_BROAD_H - -#include "SOLID_types.h" - -#ifdef __cplusplus -extern "C" { -#endif - - DT_DECLARE_HANDLE(BP_SceneHandle); - DT_DECLARE_HANDLE(BP_ProxyHandle); - - typedef void (*BP_Callback)(void *client_data, - void *object1, - void *object2); - - typedef bool (*BP_RayCastCallback)(void *client_data, - void *object, - const DT_Vector3 source, - const DT_Vector3 target, - DT_Scalar *lambda); - - extern DECLSPEC BP_SceneHandle BP_CreateScene(void *client_data, - BP_Callback beginOverlap, - BP_Callback endOverlap); - - extern DECLSPEC void BP_DestroyScene(BP_SceneHandle scene); - - extern DECLSPEC BP_ProxyHandle BP_CreateProxy(BP_SceneHandle scene, - void *object, - const DT_Vector3 min, - const DT_Vector3 max); - - extern DECLSPEC void BP_DestroyProxy(BP_SceneHandle scene, - BP_ProxyHandle proxy); - - extern DECLSPEC void BP_SetBBox(BP_ProxyHandle proxy, - const DT_Vector3 min, - const DT_Vector3 max); - - extern DECLSPEC void *BP_RayCast(BP_SceneHandle scene, - BP_RayCastCallback objectRayCast, - void *client_data, - const DT_Vector3 source, - const DT_Vector3 target, - DT_Scalar *lambda); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/extern/solid/include/SOLID_types.h b/extern/solid/include/SOLID_types.h deleted file mode 100644 index 630594e447f..00000000000 --- a/extern/solid/include/SOLID_types.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef SOLID_TYPES_H -#define SOLID_TYPES_H - -#ifndef DECLSPEC -# ifdef WIN32 -# define DECLSPEC __declspec(dllexport) -# else -# define DECLSPEC -# endif -#endif - -#define DT_DECLARE_HANDLE(name) typedef struct name##__ { int unused; } *name - - -typedef unsigned short DT_Index; -typedef unsigned short DT_Count; -typedef unsigned int DT_Size; -typedef float DT_Scalar; -typedef int DT_Bool; - -#define DT_FALSE 0 -#define DT_TRUE 1 - -#define DT_CONTINUE 0 -#define DT_DONE 1 - -typedef DT_Scalar DT_Vector3[3]; -typedef DT_Scalar DT_Quaternion[4]; - -#endif diff --git a/extern/solid/make/msvc_7_0/broad/broad.vcproj b/extern/solid/make/msvc_7_0/broad/broad.vcproj deleted file mode 100644 index adb56424e60..00000000000 --- a/extern/solid/make/msvc_7_0/broad/broad.vcproj +++ /dev/null @@ -1,262 +0,0 @@ -<?xml version="1.0" encoding="Windows-1252"?> -<VisualStudioProject - ProjectType="Visual C++" - Version="7.10" - Name="broad" - ProjectGUID="{0112CAD5-3584-412A-A2E5-1315A00437B4}" - SccProjectName="" - SccLocalPath=""> - <Platforms> - <Platform - Name="Win32"/> - </Platforms> - <Configurations> - <Configuration - Name="Blender Release|Win32" - OutputDirectory="..\..\..\..\..\..\build\msvc_7\extern\solid\broad" - IntermediateDirectory="..\..\..\..\..\..\build\msvc_7\extern\solid\broad" - ConfigurationType="4" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="FALSE" - CharacterSet="2"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - InlineFunctionExpansion="1" - AdditionalIncludeDirectories="..\..\..\include" - PreprocessorDefinitions="WIN32;NDEBUG;_LIB" - StringPooling="TRUE" - RuntimeLibrary="0" - EnableFunctionLevelLinking="TRUE" - UsePrecompiledHeader="2" - PrecompiledHeaderFile="..\..\..\..\..\..\build\msvc_7\extern\solid\broad\broad.pch" - AssemblerListingLocation="..\..\..\..\..\..\build\msvc_7\extern\solid\broad\" - ObjectFile="..\..\..\..\..\..\build\msvc_7\extern\solid\broad\" - ProgramDataBaseFileName="..\..\..\..\..\..\build\msvc_7\extern\solid\broad\" - WarningLevel="2" - SuppressStartupBanner="TRUE" - CompileAs="0"/> - <Tool - Name="VCCustomBuildTool"/> - <Tool - Name="VCLibrarianTool" - OutputFile="..\..\..\..\..\..\build\msvc_7\libs\extern\broad.lib" - SuppressStartupBanner="TRUE"/> - <Tool - Name="VCMIDLTool"/> - <Tool - Name="VCPostBuildEventTool"/> - <Tool - Name="VCPreBuildEventTool"/> - <Tool - Name="VCPreLinkEventTool"/> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="NDEBUG" - Culture="1033"/> - <Tool - Name="VCWebServiceProxyGeneratorTool"/> - <Tool - Name="VCXMLDataGeneratorTool"/> - <Tool - Name="VCManagedWrapperGeneratorTool"/> - <Tool - Name="VCAuxiliaryManagedWrapperGeneratorTool"/> - </Configuration> - <Configuration - Name="Blender Debug|Win32" - OutputDirectory="..\..\..\..\..\..\build\msvc_7\extern\solid\broad\debug" - IntermediateDirectory="..\..\..\..\..\..\build\msvc_7\extern\solid\broad\debug" - ConfigurationType="4" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="FALSE" - CharacterSet="2"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - AdditionalIncludeDirectories="..\..\..\include" - PreprocessorDefinitions="WIN32;_DEBUG;_LIB" - BasicRuntimeChecks="3" - RuntimeLibrary="1" - UsePrecompiledHeader="2" - PrecompiledHeaderFile="..\..\..\..\..\..\build\msvc_7\extern\solid\broad\debug\broad.pch" - AssemblerListingLocation="..\..\..\..\..\..\build\msvc_7\extern\solid\broad\debug\" - ObjectFile="..\..\..\..\..\..\build\msvc_7\extern\solid\broad\debug\" - ProgramDataBaseFileName="..\..\..\..\..\..\build\msvc_7\extern\solid\broad\debug\" - WarningLevel="2" - SuppressStartupBanner="TRUE" - DebugInformationFormat="3" - CompileAs="0"/> - <Tool - Name="VCCustomBuildTool"/> - <Tool - Name="VCLibrarianTool" - OutputFile="..\..\..\..\..\..\build\msvc_7\libs\extern\debug\broad.lib" - SuppressStartupBanner="TRUE"/> - <Tool - Name="VCMIDLTool"/> - <Tool - Name="VCPostBuildEventTool"/> - <Tool - Name="VCPreBuildEventTool"/> - <Tool - Name="VCPreLinkEventTool"/> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="_DEBUG" - Culture="1033"/> - <Tool - Name="VCWebServiceProxyGeneratorTool"/> - <Tool - Name="VCXMLDataGeneratorTool"/> - <Tool - Name="VCManagedWrapperGeneratorTool"/> - <Tool - Name="VCAuxiliaryManagedWrapperGeneratorTool"/> - </Configuration> - <Configuration - Name="3D Plugin Release|Win32" - OutputDirectory="..\..\..\..\..\..\build\msvc_7\extern\solid\broad\mtdll" - IntermediateDirectory="..\..\..\..\..\..\build\msvc_7\extern\solid\broad\mtdll" - ConfigurationType="4" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="FALSE" - CharacterSet="2"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - InlineFunctionExpansion="1" - AdditionalIncludeDirectories="..\..\..\include" - PreprocessorDefinitions="WIN32;NDEBUG;_LIB" - StringPooling="TRUE" - RuntimeLibrary="2" - EnableFunctionLevelLinking="TRUE" - UsePrecompiledHeader="2" - PrecompiledHeaderFile="..\..\..\..\..\..\build\msvc_7\extern\solid\broad\mtdll\broad.pch" - AssemblerListingLocation="..\..\..\..\..\..\build\msvc_7\extern\solid\broad\mtdll\" - ObjectFile="..\..\..\..\..\..\build\msvc_7\extern\solid\broad\mtdll\" - ProgramDataBaseFileName="..\..\..\..\..\..\build\msvc_7\extern\solid\broad\mtdll\" - WarningLevel="2" - SuppressStartupBanner="TRUE" - CompileAs="0"/> - <Tool - Name="VCCustomBuildTool"/> - <Tool - Name="VCLibrarianTool" - OutputFile="..\..\..\..\..\..\build\msvc_7\libs\extern\mtdll\broad.lib" - SuppressStartupBanner="TRUE"/> - <Tool - Name="VCMIDLTool"/> - <Tool - Name="VCPostBuildEventTool"/> - <Tool - Name="VCPreBuildEventTool"/> - <Tool - Name="VCPreLinkEventTool"/> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="NDEBUG" - Culture="1033"/> - <Tool - Name="VCWebServiceProxyGeneratorTool"/> - <Tool - Name="VCXMLDataGeneratorTool"/> - <Tool - Name="VCManagedWrapperGeneratorTool"/> - <Tool - Name="VCAuxiliaryManagedWrapperGeneratorTool"/> - </Configuration> - <Configuration - Name="3D Plugin Debug|Win32" - OutputDirectory="..\..\..\..\..\..\build\msvc_7\extern\solid\broad\mtdll\debug" - IntermediateDirectory="..\..\..\..\..\..\build\msvc_7\extern\solid\broad\mtdll\debug" - ConfigurationType="4" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="FALSE" - CharacterSet="2"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - AdditionalIncludeDirectories="..\..\..\include" - PreprocessorDefinitions="WIN32;_DEBUG;_LIB" - BasicRuntimeChecks="3" - RuntimeLibrary="3" - UsePrecompiledHeader="2" - PrecompiledHeaderFile="..\..\..\..\..\..\build\msvc_7\extern\solid\broad\mtdll\debug\broad.pch" - AssemblerListingLocation="..\..\..\..\..\..\build\msvc_7\extern\solid\broad\mtdll\debug\" - ObjectFile="..\..\..\..\..\..\build\msvc_7\extern\solid\broad\mtdll\debug\" - ProgramDataBaseFileName="..\..\..\..\..\..\build\msvc_7\extern\solid\broad\mtdll\debug\" - WarningLevel="2" - SuppressStartupBanner="TRUE" - DebugInformationFormat="3" - CompileAs="0"/> - <Tool - Name="VCCustomBuildTool"/> - <Tool - Name="VCLibrarianTool" - OutputFile="..\..\..\..\..\..\build\msvc_7\libs\extern\mtdll\debug\broad.lib" - SuppressStartupBanner="TRUE"/> - <Tool - Name="VCMIDLTool"/> - <Tool - Name="VCPostBuildEventTool"/> - <Tool - Name="VCPreBuildEventTool"/> - <Tool - Name="VCPreLinkEventTool"/> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="_DEBUG" - Culture="1033"/> - <Tool - Name="VCWebServiceProxyGeneratorTool"/> - <Tool - Name="VCXMLDataGeneratorTool"/> - <Tool - Name="VCManagedWrapperGeneratorTool"/> - <Tool - Name="VCAuxiliaryManagedWrapperGeneratorTool"/> - </Configuration> - </Configurations> - <References> - </References> - <Files> - <Filter - Name="Source Files" - Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"> - <File - RelativePath="..\..\..\src\broad\BP_C-api.cpp"> - </File> - <File - RelativePath="..\..\..\src\broad\BP_EndpointList.cpp"> - </File> - <File - RelativePath="..\..\..\src\broad\BP_Proxy.cpp"> - </File> - <File - RelativePath="..\..\..\src\broad\BP_Scene.cpp"> - </File> - </Filter> - <Filter - Name="Header Files" - Filter="h;hpp;hxx;hm;inl"> - <File - RelativePath="..\..\src\broad\BP_Endpoint.h"> - </File> - <File - RelativePath="..\..\src\broad\BP_EndpointList.h"> - </File> - <File - RelativePath="..\..\src\broad\BP_Proxy.h"> - </File> - <File - RelativePath="..\..\src\broad\BP_ProxyList.h"> - </File> - <File - RelativePath="..\..\src\broad\BP_Scene.h"> - </File> - </Filter> - </Files> - <Globals> - </Globals> -</VisualStudioProject> diff --git a/extern/solid/make/msvc_7_0/complex/complex.vcproj b/extern/solid/make/msvc_7_0/complex/complex.vcproj deleted file mode 100644 index 2a895fa28d3..00000000000 --- a/extern/solid/make/msvc_7_0/complex/complex.vcproj +++ /dev/null @@ -1,252 +0,0 @@ -<?xml version="1.0" encoding="Windows-1252"?> -<VisualStudioProject - ProjectType="Visual C++" - Version="7.10" - Name="complex" - ProjectGUID="{B83C6BED-11EC-46C8-AFFA-121EEDE94373}" - SccProjectName="" - SccLocalPath=""> - <Platforms> - <Platform - Name="Win32"/> - </Platforms> - <Configurations> - <Configuration - Name="Blender Release|Win32" - OutputDirectory="..\..\..\..\..\..\build\msvc_7\extern\solid\complex" - IntermediateDirectory="..\..\..\..\..\..\build\msvc_7\extern\solid\complex" - ConfigurationType="4" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="FALSE" - CharacterSet="2"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - InlineFunctionExpansion="1" - AdditionalIncludeDirectories="..\..\..\include;..\..\..\src\convex" - PreprocessorDefinitions="WIN32;NDEBUG;_LIB" - StringPooling="TRUE" - RuntimeLibrary="0" - EnableFunctionLevelLinking="TRUE" - UsePrecompiledHeader="2" - PrecompiledHeaderFile="..\..\..\..\..\..\build\msvc_7\extern\solid\complex\complex.pch" - AssemblerListingLocation="..\..\..\..\..\..\build\msvc_7\extern\solid\complex\" - ObjectFile="..\..\..\..\..\..\build\msvc_7\extern\solid\complex\" - ProgramDataBaseFileName="..\..\..\..\..\..\build\msvc_7\extern\solid\complex\" - WarningLevel="2" - SuppressStartupBanner="TRUE" - CompileAs="0"/> - <Tool - Name="VCCustomBuildTool"/> - <Tool - Name="VCLibrarianTool" - OutputFile="..\..\..\..\..\..\build\msvc_7\libs\extern\complex.lib" - SuppressStartupBanner="TRUE"/> - <Tool - Name="VCMIDLTool"/> - <Tool - Name="VCPostBuildEventTool"/> - <Tool - Name="VCPreBuildEventTool"/> - <Tool - Name="VCPreLinkEventTool"/> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="NDEBUG" - Culture="1033"/> - <Tool - Name="VCWebServiceProxyGeneratorTool"/> - <Tool - Name="VCXMLDataGeneratorTool"/> - <Tool - Name="VCManagedWrapperGeneratorTool"/> - <Tool - Name="VCAuxiliaryManagedWrapperGeneratorTool"/> - </Configuration> - <Configuration - Name="Blender Debug|Win32" - OutputDirectory="..\..\..\..\..\..\build\msvc_7\extern\solid\complex\debug" - IntermediateDirectory="..\..\..\..\..\..\build\msvc_7\extern\solid\complex\debug" - ConfigurationType="4" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="FALSE" - CharacterSet="2"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - AdditionalIncludeDirectories="..\..\..\include;..\..\..\src\convex" - PreprocessorDefinitions="WIN32;_DEBUG;_LIB" - BasicRuntimeChecks="3" - RuntimeLibrary="1" - UsePrecompiledHeader="2" - PrecompiledHeaderFile="..\..\..\..\..\..\build\msvc_7\extern\solid\complex\debug\complex.pch" - AssemblerOutput="0" - AssemblerListingLocation="..\..\..\..\..\..\build\msvc_7\extern\solid\complex\debug\" - ObjectFile="..\..\..\..\..\..\build\msvc_7\extern\solid\complex\debug\" - ProgramDataBaseFileName="..\..\..\..\..\..\build\msvc_7\extern\solid\complex\debug\" - WarningLevel="2" - SuppressStartupBanner="TRUE" - DebugInformationFormat="3" - CompileAs="0"/> - <Tool - Name="VCCustomBuildTool"/> - <Tool - Name="VCLibrarianTool" - OutputFile="..\..\..\..\..\..\build\msvc_7\libs\extern\debug\complex.lib" - SuppressStartupBanner="TRUE"/> - <Tool - Name="VCMIDLTool"/> - <Tool - Name="VCPostBuildEventTool"/> - <Tool - Name="VCPreBuildEventTool"/> - <Tool - Name="VCPreLinkEventTool"/> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="_DEBUG" - Culture="1033"/> - <Tool - Name="VCWebServiceProxyGeneratorTool"/> - <Tool - Name="VCXMLDataGeneratorTool"/> - <Tool - Name="VCManagedWrapperGeneratorTool"/> - <Tool - Name="VCAuxiliaryManagedWrapperGeneratorTool"/> - </Configuration> - <Configuration - Name="3D Plugin Release|Win32" - OutputDirectory="..\..\..\..\..\..\build\msvc_7\extern\solid\complex\mtdll" - IntermediateDirectory="..\..\..\..\..\..\build\msvc_7\extern\solid\complex\mtdll" - ConfigurationType="4" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="FALSE" - CharacterSet="2"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - InlineFunctionExpansion="1" - AdditionalIncludeDirectories="..\..\..\include;..\..\..\src\convex" - PreprocessorDefinitions="WIN32;NDEBUG;_LIB" - StringPooling="TRUE" - RuntimeLibrary="2" - EnableFunctionLevelLinking="TRUE" - UsePrecompiledHeader="2" - PrecompiledHeaderFile="..\..\..\..\..\..\build\msvc_7\extern\solid\complex\mtdll\complex.pch" - AssemblerListingLocation="..\..\..\..\..\..\build\msvc_7\extern\solid\complex\mtdll\" - ObjectFile="..\..\..\..\..\..\build\msvc_7\extern\solid\complex\mtdll\" - ProgramDataBaseFileName="..\..\..\..\..\..\build\msvc_7\extern\solid\complex\mtdll\" - WarningLevel="2" - SuppressStartupBanner="TRUE" - CompileAs="0"/> - <Tool - Name="VCCustomBuildTool"/> - <Tool - Name="VCLibrarianTool" - OutputFile="..\..\..\..\..\..\build\msvc_7\libs\extern\mtdll\complex.lib" - SuppressStartupBanner="TRUE"/> - <Tool - Name="VCMIDLTool"/> - <Tool - Name="VCPostBuildEventTool"/> - <Tool - Name="VCPreBuildEventTool"/> - <Tool - Name="VCPreLinkEventTool"/> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="NDEBUG" - Culture="1033"/> - <Tool - Name="VCWebServiceProxyGeneratorTool"/> - <Tool - Name="VCXMLDataGeneratorTool"/> - <Tool - Name="VCManagedWrapperGeneratorTool"/> - <Tool - Name="VCAuxiliaryManagedWrapperGeneratorTool"/> - </Configuration> - <Configuration - Name="3D Plugin Debug|Win32" - OutputDirectory="..\..\..\..\..\..\build\msvc_7\extern\solid\complex\mtdll\debug" - IntermediateDirectory="..\..\..\..\..\..\build\msvc_7\extern\solid\complex\mtdll\debug" - ConfigurationType="4" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="FALSE" - CharacterSet="2"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - AdditionalIncludeDirectories="..\..\..\include;..\..\..\src\convex" - PreprocessorDefinitions="WIN32;_DEBUG;_LIB" - BasicRuntimeChecks="3" - RuntimeLibrary="3" - UsePrecompiledHeader="2" - PrecompiledHeaderFile="..\..\..\..\..\..\build\msvc_7\extern\solid\complex\mtdll\debug\complex.pch" - AssemblerOutput="0" - AssemblerListingLocation="..\..\..\..\..\..\build\msvc_7\extern\solid\complex\mtdll\debug\" - ObjectFile="..\..\..\..\..\..\build\msvc_7\extern\solid\complex\mtdll\debug\" - ProgramDataBaseFileName="..\..\..\..\..\..\build\msvc_7\extern\solid\complex\mtdll\debug\" - WarningLevel="2" - SuppressStartupBanner="TRUE" - DebugInformationFormat="3" - CompileAs="0"/> - <Tool - Name="VCCustomBuildTool"/> - <Tool - Name="VCLibrarianTool" - OutputFile="..\..\..\..\..\..\build\msvc_7\libs\extern\mtdll\debug\complex.lib" - SuppressStartupBanner="TRUE"/> - <Tool - Name="VCMIDLTool"/> - <Tool - Name="VCPostBuildEventTool"/> - <Tool - Name="VCPreBuildEventTool"/> - <Tool - Name="VCPreLinkEventTool"/> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="_DEBUG" - Culture="1033"/> - <Tool - Name="VCWebServiceProxyGeneratorTool"/> - <Tool - Name="VCXMLDataGeneratorTool"/> - <Tool - Name="VCManagedWrapperGeneratorTool"/> - <Tool - Name="VCAuxiliaryManagedWrapperGeneratorTool"/> - </Configuration> - </Configurations> - <References> - </References> - <Files> - <Filter - Name="Source Files" - Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"> - <File - RelativePath="..\..\..\src\complex\DT_BBoxTree.cpp"> - </File> - <File - RelativePath="..\..\..\src\complex\DT_Complex.cpp"> - </File> - </Filter> - <Filter - Name="Header Files" - Filter="h;hpp;hxx;hm;inl"> - <File - RelativePath="..\..\src\complex\DT_BBoxTree.h"> - </File> - <File - RelativePath="..\..\src\complex\DT_CBox.h"> - </File> - <File - RelativePath="..\..\src\complex\DT_Complex.h"> - </File> - </Filter> - </Files> - <Globals> - </Globals> -</VisualStudioProject> diff --git a/extern/solid/make/msvc_7_0/convex/convex.vcproj b/extern/solid/make/msvc_7_0/convex/convex.vcproj deleted file mode 100644 index da088b5972f..00000000000 --- a/extern/solid/make/msvc_7_0/convex/convex.vcproj +++ /dev/null @@ -1,337 +0,0 @@ -<?xml version="1.0" encoding="Windows-1252"?> -<VisualStudioProject - ProjectType="Visual C++" - Version="7.10" - Name="convex" - ProjectGUID="{524264F4-DF21-4B79-847F-E7CA643ECD0B}" - SccProjectName="" - SccLocalPath=""> - <Platforms> - <Platform - Name="Win32"/> - </Platforms> - <Configurations> - <Configuration - Name="Blender Debug|Win32" - OutputDirectory="..\..\..\..\..\..\build\msvc_7\extern\solid\convex\debug" - IntermediateDirectory="..\..\..\..\..\..\build\msvc_7\extern\solid\convex\debug" - ConfigurationType="4" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="FALSE" - CharacterSet="2"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - AdditionalIncludeDirectories="..\..\..\include;..\..\..\..\qhull\include" - PreprocessorDefinitions="_DEBUG;QHULL;WIN32;_LIB" - BasicRuntimeChecks="3" - RuntimeLibrary="1" - UsePrecompiledHeader="2" - PrecompiledHeaderFile="..\..\..\..\..\..\build\msvc_7\extern\solid\convex\debug\convex.pch" - AssemblerListingLocation="..\..\..\..\..\..\build\msvc_7\extern\solid\convex\debug\" - ObjectFile="..\..\..\..\..\..\build\msvc_7\extern\solid\convex\debug\" - ProgramDataBaseFileName="..\..\..\..\..\..\build\msvc_7\extern\solid\convex\debug\" - WarningLevel="2" - SuppressStartupBanner="TRUE" - DebugInformationFormat="3" - CompileAs="0"/> - <Tool - Name="VCCustomBuildTool"/> - <Tool - Name="VCLibrarianTool" - OutputFile="..\..\..\..\..\..\build\msvc_7\libs\extern\debug\convex.lib" - SuppressStartupBanner="TRUE"/> - <Tool - Name="VCMIDLTool"/> - <Tool - Name="VCPostBuildEventTool"/> - <Tool - Name="VCPreBuildEventTool"/> - <Tool - Name="VCPreLinkEventTool"/> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="_DEBUG" - Culture="1033"/> - <Tool - Name="VCWebServiceProxyGeneratorTool"/> - <Tool - Name="VCXMLDataGeneratorTool"/> - <Tool - Name="VCManagedWrapperGeneratorTool"/> - <Tool - Name="VCAuxiliaryManagedWrapperGeneratorTool"/> - </Configuration> - <Configuration - Name="Blender Release|Win32" - OutputDirectory="..\..\..\..\..\..\build\msvc_7\extern\solid\convex" - IntermediateDirectory="..\..\..\..\..\..\build\msvc_7\extern\solid\convex" - ConfigurationType="4" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="FALSE" - CharacterSet="2"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - InlineFunctionExpansion="1" - AdditionalIncludeDirectories="..\..\..\include;..\..\..\..\qhull\include" - PreprocessorDefinitions="NDEBUG;QHULL;WIN32;_LIB" - StringPooling="TRUE" - RuntimeLibrary="0" - EnableFunctionLevelLinking="TRUE" - UsePrecompiledHeader="2" - PrecompiledHeaderFile="..\..\..\..\..\..\build\msvc_7\extern\solid\convex\convex.pch" - AssemblerListingLocation="..\..\..\..\..\..\build\msvc_7\extern\solid\convex\" - ObjectFile="..\..\..\..\..\..\build\msvc_7\extern\solid\convex\" - ProgramDataBaseFileName="..\..\..\..\..\..\build\msvc_7\extern\solid\convex\" - WarningLevel="2" - SuppressStartupBanner="TRUE" - CompileAs="0"/> - <Tool - Name="VCCustomBuildTool"/> - <Tool - Name="VCLibrarianTool" - OutputFile="..\..\..\..\..\..\build\msvc_7\libs\extern\convex.lib" - SuppressStartupBanner="TRUE"/> - <Tool - Name="VCMIDLTool"/> - <Tool - Name="VCPostBuildEventTool"/> - <Tool - Name="VCPreBuildEventTool"/> - <Tool - Name="VCPreLinkEventTool"/> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="NDEBUG" - Culture="1033"/> - <Tool - Name="VCWebServiceProxyGeneratorTool"/> - <Tool - Name="VCXMLDataGeneratorTool"/> - <Tool - Name="VCManagedWrapperGeneratorTool"/> - <Tool - Name="VCAuxiliaryManagedWrapperGeneratorTool"/> - </Configuration> - <Configuration - Name="3D Plugin Release|Win32" - OutputDirectory="..\..\..\..\..\..\build\msvc_7\extern\solid\convex\mtdll" - IntermediateDirectory="..\..\..\..\..\..\build\msvc_7\extern\solid\convex\mtdll" - ConfigurationType="4" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="FALSE" - CharacterSet="2"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - InlineFunctionExpansion="1" - AdditionalIncludeDirectories="..\..\..\include;..\..\..\..\qhull\include" - PreprocessorDefinitions="NDEBUG;QHULL;WIN32;_LIB" - StringPooling="TRUE" - RuntimeLibrary="2" - EnableFunctionLevelLinking="TRUE" - UsePrecompiledHeader="2" - PrecompiledHeaderFile="..\..\..\..\..\..\build\msvc_7\extern\solid\convex\mtdll\convex.pch" - AssemblerListingLocation="..\..\..\..\..\..\build\msvc_7\extern\solid\convex\mtdll\" - ObjectFile="..\..\..\..\..\..\build\msvc_7\extern\solid\convex\mtdll\" - ProgramDataBaseFileName="..\..\..\..\..\..\build\msvc_7\extern\solid\convex\mtdll\" - WarningLevel="2" - SuppressStartupBanner="TRUE" - CompileAs="0"/> - <Tool - Name="VCCustomBuildTool"/> - <Tool - Name="VCLibrarianTool" - OutputFile="..\..\..\..\..\..\build\msvc_7\libs\extern\mtdll\convex.lib" - SuppressStartupBanner="TRUE"/> - <Tool - Name="VCMIDLTool"/> - <Tool - Name="VCPostBuildEventTool"/> - <Tool - Name="VCPreBuildEventTool"/> - <Tool - Name="VCPreLinkEventTool"/> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="NDEBUG" - Culture="1033"/> - <Tool - Name="VCWebServiceProxyGeneratorTool"/> - <Tool - Name="VCXMLDataGeneratorTool"/> - <Tool - Name="VCManagedWrapperGeneratorTool"/> - <Tool - Name="VCAuxiliaryManagedWrapperGeneratorTool"/> - </Configuration> - <Configuration - Name="3D Plugin Debug|Win32" - OutputDirectory="..\..\..\..\..\..\build\msvc_7\extern\solid\convex\mtdll\debug" - IntermediateDirectory="..\..\..\..\..\..\build\msvc_7\extern\solid\convex\mtdll\debug" - ConfigurationType="4" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="FALSE" - CharacterSet="2"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - AdditionalIncludeDirectories="..\..\..\include;..\..\..\..\qhull\include" - PreprocessorDefinitions="_DEBUG;QHULL;WIN32;_LIB" - BasicRuntimeChecks="3" - RuntimeLibrary="3" - UsePrecompiledHeader="2" - PrecompiledHeaderFile="..\..\..\..\..\..\build\msvc_7\extern\solid\convex\mtdll\debug\convex.pch" - AssemblerListingLocation="..\..\..\..\..\..\build\msvc_7\extern\solid\convex\mtdll\debug\" - ObjectFile="..\..\..\..\..\..\build\msvc_7\extern\solid\convex\mtdll\debug\" - ProgramDataBaseFileName="..\..\..\..\..\..\build\msvc_7\extern\solid\convex\mtdll\debug\" - WarningLevel="2" - SuppressStartupBanner="TRUE" - DebugInformationFormat="3" - CompileAs="0"/> - <Tool - Name="VCCustomBuildTool"/> - <Tool - Name="VCLibrarianTool" - OutputFile="..\..\..\..\..\..\build\msvc_7\libs\extern\mtdll\debug\convex.lib" - SuppressStartupBanner="TRUE"/> - <Tool - Name="VCMIDLTool"/> - <Tool - Name="VCPostBuildEventTool"/> - <Tool - Name="VCPreBuildEventTool"/> - <Tool - Name="VCPreLinkEventTool"/> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="_DEBUG" - Culture="1033"/> - <Tool - Name="VCWebServiceProxyGeneratorTool"/> - <Tool - Name="VCXMLDataGeneratorTool"/> - <Tool - Name="VCManagedWrapperGeneratorTool"/> - <Tool - Name="VCAuxiliaryManagedWrapperGeneratorTool"/> - </Configuration> - </Configurations> - <References> - </References> - <Files> - <Filter - Name="Source Files" - Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"> - <File - RelativePath="..\..\..\src\convex\DT_Accuracy.cpp"> - </File> - <File - RelativePath="..\..\..\src\convex\DT_Box.cpp"> - </File> - <File - RelativePath="..\..\..\src\convex\DT_Cone.cpp"> - </File> - <File - RelativePath="..\..\..\src\convex\DT_Convex.cpp"> - </File> - <File - RelativePath="..\..\..\src\convex\DT_Cylinder.cpp"> - </File> - <File - RelativePath="..\..\..\src\convex\DT_Facet.cpp"> - </File> - <File - RelativePath="..\..\..\src\convex\DT_LineSegment.cpp"> - </File> - <File - RelativePath="..\..\..\src\convex\DT_PenDepth.cpp"> - </File> - <File - RelativePath="..\..\..\src\convex\DT_Point.cpp"> - </File> - <File - RelativePath="..\..\..\src\convex\DT_Polyhedron.cpp"> - </File> - <File - RelativePath="..\..\..\src\convex\DT_Polytope.cpp"> - </File> - <File - RelativePath="..\..\..\src\convex\DT_Sphere.cpp"> - </File> - <File - RelativePath="..\..\..\src\convex\DT_Triangle.cpp"> - </File> - </Filter> - <Filter - Name="Header Files" - Filter="h;hpp;hxx;hm;inl"> - <File - RelativePath="..\..\src\convex\DT_Accuracy.h"> - </File> - <File - RelativePath="..\..\src\convex\DT_Array.h"> - </File> - <File - RelativePath="..\..\src\convex\DT_Box.h"> - </File> - <File - RelativePath="..\..\src\convex\DT_Cone.h"> - </File> - <File - RelativePath="..\..\src\convex\DT_Convex.h"> - </File> - <File - RelativePath="..\..\src\convex\DT_Cylinder.h"> - </File> - <File - RelativePath="..\..\src\convex\DT_Facet.h"> - </File> - <File - RelativePath="..\..\src\convex\DT_GJK.h"> - </File> - <File - RelativePath="..\..\src\convex\DT_Hull.h"> - </File> - <File - RelativePath="..\..\src\convex\DT_IndexArray.h"> - </File> - <File - RelativePath="..\..\src\convex\DT_LineSegment.h"> - </File> - <File - RelativePath="..\..\src\convex\DT_Minkowski.h"> - </File> - <File - RelativePath="..\..\src\convex\DT_PenDepth.h"> - </File> - <File - RelativePath="..\..\src\convex\DT_Point.h"> - </File> - <File - RelativePath="..\..\src\convex\DT_Polyhedron.h"> - </File> - <File - RelativePath="..\..\src\convex\DT_Polytope.h"> - </File> - <File - RelativePath="..\..\src\convex\DT_Shape.h"> - </File> - <File - RelativePath="..\..\src\convex\DT_Sphere.h"> - </File> - <File - RelativePath="..\..\src\convex\DT_Transform.h"> - </File> - <File - RelativePath="..\..\src\convex\DT_Triangle.h"> - </File> - <File - RelativePath="..\..\src\convex\DT_VertexBase.h"> - </File> - </Filter> - </Files> - <Globals> - </Globals> -</VisualStudioProject> diff --git a/extern/solid/make/msvc_7_0/solid.vcproj b/extern/solid/make/msvc_7_0/solid.vcproj deleted file mode 100644 index d9e6332987c..00000000000 --- a/extern/solid/make/msvc_7_0/solid.vcproj +++ /dev/null @@ -1,462 +0,0 @@ -<?xml version="1.0" encoding="Windows-1252"?> -<VisualStudioProject - ProjectType="Visual C++" - Version="7.10" - Name="solid" - ProjectGUID="{D696C86B-0B53-4471-A50D-5B983A6FA4AD}" - SccProjectName="" - SccLocalPath=""> - <Platforms> - <Platform - Name="Win32"/> - </Platforms> - <Configurations> - <Configuration - Name="Blender Debug|Win32" - OutputDirectory="..\..\..\..\..\build\msvc_7\extern\solid\debug" - IntermediateDirectory="..\..\..\..\..\build\msvc_7\extern\solid\debug" - ConfigurationType="4" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="FALSE" - CharacterSet="2"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - AdditionalIncludeDirectories="..\..\include;..\..\src\convex;..\..\src\complex" - PreprocessorDefinitions="_DEBUG;QHULL;WIN32;_LIB" - BasicRuntimeChecks="3" - RuntimeLibrary="1" - UsePrecompiledHeader="2" - PrecompiledHeaderFile="..\..\..\..\..\build\msvc_7\extern\solid\debug\solid.pch" - AssemblerListingLocation="..\..\..\..\..\build\msvc_7\extern\solid\debug\" - ObjectFile="..\..\..\..\..\build\msvc_7\extern\solid\debug\" - ProgramDataBaseFileName="..\..\..\..\..\build\msvc_7\extern\solid\debug\" - WarningLevel="2" - SuppressStartupBanner="TRUE" - DebugInformationFormat="3" - CompileAs="0"/> - <Tool - Name="VCCustomBuildTool"/> - <Tool - Name="VCLibrarianTool" - OutputFile="..\..\..\..\..\build\msvc_7\libs\extern\debug\solid.lib" - SuppressStartupBanner="TRUE"/> - <Tool - Name="VCMIDLTool"/> - <Tool - Name="VCPostBuildEventTool" - Description="Copying SOLID files library (debug target) to lib tree." - CommandLine="ECHO Copying header files -IF NOT EXIST ..\..\..\..\..\build\msvc_7\extern\solid\include\SOLID MKDIR ..\..\..\..\..\build\msvc_7\extern\solid\include\SOLID -XCOPY /Y ..\..\include\SOLID*.h ..\..\..\..\..\build\msvc_7\extern\solid\include\SOLID -ECHO Done -"/> - <Tool - Name="VCPreBuildEventTool"/> - <Tool - Name="VCPreLinkEventTool"/> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="_DEBUG" - Culture="1033"/> - <Tool - Name="VCWebServiceProxyGeneratorTool"/> - <Tool - Name="VCXMLDataGeneratorTool"/> - <Tool - Name="VCManagedWrapperGeneratorTool"/> - <Tool - Name="VCAuxiliaryManagedWrapperGeneratorTool"/> - </Configuration> - <Configuration - Name="Blender Release|Win32" - OutputDirectory="..\..\..\..\..\build\msvc_7\extern\solid" - IntermediateDirectory="..\..\..\..\..\build\msvc_7\extern\solid" - ConfigurationType="4" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="FALSE" - CharacterSet="2"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - InlineFunctionExpansion="1" - AdditionalIncludeDirectories="..\..\include;..\..\src\convex;..\..\src\complex" - PreprocessorDefinitions="NDEBUG;QHULL;WIN32;_LIB" - StringPooling="TRUE" - RuntimeLibrary="0" - EnableFunctionLevelLinking="TRUE" - UsePrecompiledHeader="2" - PrecompiledHeaderFile="..\..\..\..\..\build\msvc_7\extern\solid\solid.pch" - AssemblerListingLocation="..\..\..\..\..\build\msvc_7\extern\solid\" - ObjectFile="..\..\..\..\..\build\msvc_7\extern\solid\" - ProgramDataBaseFileName="..\..\..\..\..\build\msvc_7\extern\solid\" - WarningLevel="2" - SuppressStartupBanner="TRUE" - CompileAs="0"/> - <Tool - Name="VCCustomBuildTool"/> - <Tool - Name="VCLibrarianTool" - OutputFile="..\..\..\..\..\build\msvc_7\libs\extern\solid.lib" - SuppressStartupBanner="TRUE"/> - <Tool - Name="VCMIDLTool"/> - <Tool - Name="VCPostBuildEventTool" - Description="Copying SOLID files library to lib tree." - CommandLine="ECHO Copying header files -IF NOT EXIST ..\..\..\..\..\build\msvc_7\extern\solid\include\SOLID MKDIR ..\..\..\..\..\build\msvc_7\extern\solid\include\SOLID -XCOPY /Y ..\..\include\SOLID*.h ..\..\..\..\..\build\msvc_7\extern\solid\include\SOLID -ECHO Done -"/> - <Tool - Name="VCPreBuildEventTool"/> - <Tool - Name="VCPreLinkEventTool"/> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="NDEBUG" - Culture="1033"/> - <Tool - Name="VCWebServiceProxyGeneratorTool"/> - <Tool - Name="VCXMLDataGeneratorTool"/> - <Tool - Name="VCManagedWrapperGeneratorTool"/> - <Tool - Name="VCAuxiliaryManagedWrapperGeneratorTool"/> - </Configuration> - <Configuration - Name="3D Plugin Release|Win32" - OutputDirectory="..\..\..\..\..\build\msvc_7\extern\solid\mtdll" - IntermediateDirectory="..\..\..\..\..\build\msvc_7\extern\solid\mtdll" - ConfigurationType="4" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="FALSE" - CharacterSet="2"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - InlineFunctionExpansion="1" - AdditionalIncludeDirectories="..\..\include;..\..\src\convex;..\..\src\complex" - PreprocessorDefinitions="NDEBUG;QHULL;WIN32;_LIB" - StringPooling="TRUE" - RuntimeLibrary="2" - EnableFunctionLevelLinking="TRUE" - UsePrecompiledHeader="2" - PrecompiledHeaderFile="..\..\..\..\..\build\msvc_7\extern\solid\mtdll\solid.pch" - AssemblerListingLocation="..\..\..\..\..\build\msvc_7\extern\solid\mtdll\" - ObjectFile="..\..\..\..\..\build\msvc_7\extern\solid\mtdll\" - ProgramDataBaseFileName="..\..\..\..\..\build\msvc_7\extern\solid\mtdll\" - WarningLevel="2" - SuppressStartupBanner="TRUE" - CompileAs="0"/> - <Tool - Name="VCCustomBuildTool"/> - <Tool - Name="VCLibrarianTool" - OutputFile="..\..\..\..\..\build\msvc_7\libs\extern\mtdll\solid.lib" - SuppressStartupBanner="TRUE"/> - <Tool - Name="VCMIDLTool"/> - <Tool - Name="VCPostBuildEventTool" - Description="Copying SOLID files library to lib tree." - CommandLine="ECHO Copying header files -IF NOT EXIST ..\..\..\..\..\build\msvc_7\extern\solid\include\SOLID MKDIR ..\..\..\..\..\build\msvc_7\extern\solid\include\SOLID -XCOPY /Y ..\..\include\SOLID*.h ..\..\..\..\..\build\msvc_7\extern\solid\include\SOLID -ECHO Done -"/> - <Tool - Name="VCPreBuildEventTool"/> - <Tool - Name="VCPreLinkEventTool"/> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="NDEBUG" - Culture="1033"/> - <Tool - Name="VCWebServiceProxyGeneratorTool"/> - <Tool - Name="VCXMLDataGeneratorTool"/> - <Tool - Name="VCManagedWrapperGeneratorTool"/> - <Tool - Name="VCAuxiliaryManagedWrapperGeneratorTool"/> - </Configuration> - <Configuration - Name="3D Plugin Debug|Win32" - OutputDirectory="..\..\..\..\..\build\msvc_7\extern\solid\mtdll\debug" - IntermediateDirectory="..\..\..\..\..\build\msvc_7\extern\solid\mtdll\debug" - ConfigurationType="4" - UseOfMFC="0" - ATLMinimizesCRunTimeLibraryUsage="FALSE" - CharacterSet="2"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - AdditionalIncludeDirectories="..\..\include;..\..\src\convex;..\..\src\complex" - PreprocessorDefinitions="_DEBUG;QHULL;WIN32;_LIB" - BasicRuntimeChecks="3" - RuntimeLibrary="3" - UsePrecompiledHeader="2" - PrecompiledHeaderFile="..\..\..\..\..\build\msvc_7\extern\solid\mtdll\debug\solid.pch" - AssemblerListingLocation="..\..\..\..\..\build\msvc_7\extern\solid\mtdll\debug\" - ObjectFile="..\..\..\..\..\build\msvc_7\extern\solid\mtdll\debug\" - ProgramDataBaseFileName="..\..\..\..\..\build\msvc_7\extern\solid\mtdll\debug\" - WarningLevel="2" - SuppressStartupBanner="TRUE" - DebugInformationFormat="3" - CompileAs="0"/> - <Tool - Name="VCCustomBuildTool"/> - <Tool - Name="VCLibrarianTool" - OutputFile="..\..\..\..\..\build\msvc_7\libs\extern\mtdll\debug\solid.lib" - SuppressStartupBanner="TRUE"/> - <Tool - Name="VCMIDLTool"/> - <Tool - Name="VCPostBuildEventTool" - Description="Copying SOLID files library (debug target) to lib tree." - CommandLine="ECHO Copying header files -IF NOT EXIST ..\..\..\..\..\build\msvc_7\extern\solid\include\SOLID MKDIR ..\..\..\..\..\build\msvc_7\extern\solid\include\SOLID -XCOPY /Y ..\..\include\SOLID*.h ..\..\..\..\..\build\msvc_7\extern\solid\include\SOLID -ECHO Done -"/> - <Tool - Name="VCPreBuildEventTool"/> - <Tool - Name="VCPreLinkEventTool"/> - <Tool - Name="VCResourceCompilerTool" - PreprocessorDefinitions="_DEBUG" - Culture="1033"/> - <Tool - Name="VCWebServiceProxyGeneratorTool"/> - <Tool - Name="VCXMLDataGeneratorTool"/> - <Tool - Name="VCManagedWrapperGeneratorTool"/> - <Tool - Name="VCAuxiliaryManagedWrapperGeneratorTool"/> - </Configuration> - </Configurations> - <References> - </References> - <Files> - <Filter - Name="Source Files" - Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"> - <File - RelativePath="..\..\src\DT_C-api.cpp"> - <FileConfiguration - Name="Blender Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - <FileConfiguration - Name="Blender Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - AdditionalIncludeDirectories="" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - AdditionalIncludeDirectories="" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - </File> - <File - RelativePath="..\..\src\DT_Encounter.cpp"> - <FileConfiguration - Name="Blender Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - <FileConfiguration - Name="Blender Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - AdditionalIncludeDirectories="" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - AdditionalIncludeDirectories="" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - </File> - <File - RelativePath="..\..\src\DT_Object.cpp"> - <FileConfiguration - Name="Blender Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - <FileConfiguration - Name="Blender Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - AdditionalIncludeDirectories="" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - AdditionalIncludeDirectories="" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - </File> - <File - RelativePath="..\..\src\DT_RespTable.cpp"> - <FileConfiguration - Name="Blender Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - <FileConfiguration - Name="Blender Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - AdditionalIncludeDirectories="" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - AdditionalIncludeDirectories="" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - </File> - <File - RelativePath="..\..\src\DT_Scene.cpp"> - <FileConfiguration - Name="Blender Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - <FileConfiguration - Name="Blender Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - AdditionalIncludeDirectories="" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Release|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - AdditionalIncludeDirectories="" - PreprocessorDefinitions=""/> - </FileConfiguration> - <FileConfiguration - Name="3D Plugin Debug|Win32"> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - AdditionalIncludeDirectories="" - PreprocessorDefinitions="" - BasicRuntimeChecks="3"/> - </FileConfiguration> - </File> - </Filter> - <Filter - Name="Header Files" - Filter="h;hpp;hxx;hm;inl"> - <File - RelativePath="..\..\src\DT_AlgoTable.h"> - </File> - <File - RelativePath="..\..\src\DT_Encounter.h"> - </File> - <File - RelativePath="..\..\src\DT_Object.h"> - </File> - <File - RelativePath="..\..\src\DT_Response.h"> - </File> - <File - RelativePath="..\..\src\DT_RespTable.h"> - </File> - <File - RelativePath="..\..\src\DT_Scene.h"> - </File> - </Filter> - </Files> - <Globals> - </Globals> -</VisualStudioProject> diff --git a/extern/solid/make/msvc_9_0/broad/broad.vcproj b/extern/solid/make/msvc_9_0/broad/broad.vcproj deleted file mode 100644 index c58cb08b2c3..00000000000 --- a/extern/solid/make/msvc_9_0/broad/broad.vcproj +++ /dev/null @@ -1,369 +0,0 @@ -<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9,00"
- Name="EXT_broad"
- ProjectGUID="{0112CAD5-3584-412A-A2E5-1315A00437B4}"
- RootNamespace="broad"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Blender Release|Win32"
- OutputDirectory="..\..\..\..\..\..\build\msvc_9\extern\solid\broad"
- IntermediateDirectory="..\..\..\..\..\..\build\msvc_9\extern\solid\broad"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
- StringPooling="true"
- RuntimeLibrary="0"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- PrecompiledHeaderFile="..\..\..\..\..\..\build\msvc_9\extern\solid\broad\broad.pch"
- AssemblerListingLocation="..\..\..\..\..\..\build\msvc_9\extern\solid\broad\"
- ObjectFile="..\..\..\..\..\..\build\msvc_9\extern\solid\broad\"
- ProgramDataBaseFileName="..\..\..\..\..\..\build\msvc_9\extern\solid\broad\"
- WarningLevel="2"
- SuppressStartupBanner="true"
- CompileAs="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="..\..\..\..\..\..\build\msvc_9\libs\extern\broad.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Blender Debug|Win32"
- OutputDirectory="..\..\..\..\..\..\build\msvc_9\extern\solid\broad\debug"
- IntermediateDirectory="..\..\..\..\..\..\build\msvc_9\extern\solid\broad\debug"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\..\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- UsePrecompiledHeader="0"
- PrecompiledHeaderFile="..\..\..\..\..\..\build\msvc_9\extern\solid\broad\debug\broad.pch"
- AssemblerListingLocation="..\..\..\..\..\..\build\msvc_9\extern\solid\broad\debug\"
- ObjectFile="..\..\..\..\..\..\build\msvc_9\extern\solid\broad\debug\"
- ProgramDataBaseFileName="..\..\..\..\..\..\build\msvc_9\extern\solid\broad\debug\"
- WarningLevel="2"
- SuppressStartupBanner="true"
- DebugInformationFormat="3"
- CompileAs="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="_DEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="..\..\..\..\..\..\build\msvc_9\libs\extern\debug\broad.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="3D Plugin Release|Win32"
- OutputDirectory="..\..\..\..\..\..\build\msvc_9\extern\solid\broad\mtdll"
- IntermediateDirectory="..\..\..\..\..\..\build\msvc_9\extern\solid\broad\mtdll"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\include"
- PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
- StringPooling="true"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- PrecompiledHeaderFile="..\..\..\..\..\..\build\msvc_9\extern\solid\broad\mtdll\broad.pch"
- AssemblerListingLocation="..\..\..\..\..\..\build\msvc_9\extern\solid\broad\mtdll\"
- ObjectFile="..\..\..\..\..\..\build\msvc_9\extern\solid\broad\mtdll\"
- ProgramDataBaseFileName="..\..\..\..\..\..\build\msvc_9\extern\solid\broad\mtdll\"
- WarningLevel="2"
- SuppressStartupBanner="true"
- CompileAs="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="..\..\..\..\..\..\build\msvc_9\libs\extern\mtdll\broad.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="3D Plugin Debug|Win32"
- OutputDirectory="..\..\..\..\..\..\build\msvc_9\extern\solid\broad\mtdll\debug"
- IntermediateDirectory="..\..\..\..\..\..\build\msvc_9\extern\solid\broad\mtdll\debug"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\..\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- PrecompiledHeaderFile="..\..\..\..\..\..\build\msvc_9\extern\solid\broad\mtdll\debug\broad.pch"
- AssemblerListingLocation="..\..\..\..\..\..\build\msvc_9\extern\solid\broad\mtdll\debug\"
- ObjectFile="..\..\..\..\..\..\build\msvc_9\extern\solid\broad\mtdll\debug\"
- ProgramDataBaseFileName="..\..\..\..\..\..\build\msvc_9\extern\solid\broad\mtdll\debug\"
- WarningLevel="2"
- SuppressStartupBanner="true"
- DebugInformationFormat="3"
- CompileAs="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="_DEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="..\..\..\..\..\..\build\msvc_9\libs\extern\mtdll\debug\broad.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
- >
- <File
- RelativePath="..\..\..\src\broad\BP_C-api.cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\src\broad\BP_EndpointList.cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\src\broad\BP_Proxy.cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\src\broad\BP_Scene.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl"
- >
- <File
- RelativePath="..\..\src\broad\BP_Endpoint.h"
- >
- </File>
- <File
- RelativePath="..\..\src\broad\BP_EndpointList.h"
- >
- </File>
- <File
- RelativePath="..\..\src\broad\BP_Proxy.h"
- >
- </File>
- <File
- RelativePath="..\..\src\broad\BP_ProxyList.h"
- >
- </File>
- <File
- RelativePath="..\..\src\broad\BP_Scene.h"
- >
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/extern/solid/make/msvc_9_0/complex/complex.vcproj b/extern/solid/make/msvc_9_0/complex/complex.vcproj deleted file mode 100644 index 1828c489fc6..00000000000 --- a/extern/solid/make/msvc_9_0/complex/complex.vcproj +++ /dev/null @@ -1,355 +0,0 @@ -<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9,00"
- Name="EXT_complex"
- ProjectGUID="{B83C6BED-11EC-46C8-AFFA-121EEDE94373}"
- RootNamespace="complex"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Blender Release|Win32"
- OutputDirectory="..\..\..\..\..\..\build\msvc_9\extern\solid\complex"
- IntermediateDirectory="..\..\..\..\..\..\build\msvc_9\extern\solid\complex"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\include;..\..\..\src\convex"
- PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
- StringPooling="true"
- RuntimeLibrary="0"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- PrecompiledHeaderFile="..\..\..\..\..\..\build\msvc_9\extern\solid\complex\complex.pch"
- AssemblerListingLocation="..\..\..\..\..\..\build\msvc_9\extern\solid\complex\"
- ObjectFile="..\..\..\..\..\..\build\msvc_9\extern\solid\complex\"
- ProgramDataBaseFileName="..\..\..\..\..\..\build\msvc_9\extern\solid\complex\"
- WarningLevel="2"
- SuppressStartupBanner="true"
- CompileAs="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="..\..\..\..\..\..\build\msvc_9\libs\extern\complex.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Blender Debug|Win32"
- OutputDirectory="..\..\..\..\..\..\build\msvc_9\extern\solid\complex\debug"
- IntermediateDirectory="..\..\..\..\..\..\build\msvc_9\extern\solid\complex\debug"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\..\include;..\..\..\src\convex"
- PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- UsePrecompiledHeader="0"
- PrecompiledHeaderFile="..\..\..\..\..\..\build\msvc_9\extern\solid\complex\debug\complex.pch"
- AssemblerOutput="0"
- AssemblerListingLocation="..\..\..\..\..\..\build\msvc_9\extern\solid\complex\debug\"
- ObjectFile="..\..\..\..\..\..\build\msvc_9\extern\solid\complex\debug\"
- ProgramDataBaseFileName="..\..\..\..\..\..\build\msvc_9\extern\solid\complex\debug\"
- WarningLevel="2"
- SuppressStartupBanner="true"
- DebugInformationFormat="3"
- CompileAs="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="_DEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="..\..\..\..\..\..\build\msvc_9\libs\extern\debug\complex.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="3D Plugin Release|Win32"
- OutputDirectory="..\..\..\..\..\..\build\msvc_9\extern\solid\complex\mtdll"
- IntermediateDirectory="..\..\..\..\..\..\build\msvc_9\extern\solid\complex\mtdll"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\include;..\..\..\src\convex"
- PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
- StringPooling="true"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- PrecompiledHeaderFile="..\..\..\..\..\..\build\msvc_9\extern\solid\complex\mtdll\complex.pch"
- AssemblerListingLocation="..\..\..\..\..\..\build\msvc_9\extern\solid\complex\mtdll\"
- ObjectFile="..\..\..\..\..\..\build\msvc_9\extern\solid\complex\mtdll\"
- ProgramDataBaseFileName="..\..\..\..\..\..\build\msvc_9\extern\solid\complex\mtdll\"
- WarningLevel="2"
- SuppressStartupBanner="true"
- CompileAs="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="..\..\..\..\..\..\build\msvc_9\libs\extern\mtdll\complex.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="3D Plugin Debug|Win32"
- OutputDirectory="..\..\..\..\..\..\build\msvc_9\extern\solid\complex\mtdll\debug"
- IntermediateDirectory="..\..\..\..\..\..\build\msvc_9\extern\solid\complex\mtdll\debug"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\..\include;..\..\..\src\convex"
- PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- PrecompiledHeaderFile="..\..\..\..\..\..\build\msvc_9\extern\solid\complex\mtdll\debug\complex.pch"
- AssemblerOutput="0"
- AssemblerListingLocation="..\..\..\..\..\..\build\msvc_9\extern\solid\complex\mtdll\debug\"
- ObjectFile="..\..\..\..\..\..\build\msvc_9\extern\solid\complex\mtdll\debug\"
- ProgramDataBaseFileName="..\..\..\..\..\..\build\msvc_9\extern\solid\complex\mtdll\debug\"
- WarningLevel="2"
- SuppressStartupBanner="true"
- DebugInformationFormat="3"
- CompileAs="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="_DEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="..\..\..\..\..\..\build\msvc_9\libs\extern\mtdll\debug\complex.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
- >
- <File
- RelativePath="..\..\..\src\complex\DT_BBoxTree.cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\src\complex\DT_Complex.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl"
- >
- <File
- RelativePath="..\..\src\complex\DT_BBoxTree.h"
- >
- </File>
- <File
- RelativePath="..\..\src\complex\DT_CBox.h"
- >
- </File>
- <File
- RelativePath="..\..\src\complex\DT_Complex.h"
- >
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/extern/solid/make/msvc_9_0/convex/convex.vcproj b/extern/solid/make/msvc_9_0/convex/convex.vcproj deleted file mode 100644 index cb35a0ea199..00000000000 --- a/extern/solid/make/msvc_9_0/convex/convex.vcproj +++ /dev/null @@ -1,469 +0,0 @@ -<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9,00"
- Name="EXT_convex"
- ProjectGUID="{524264F4-DF21-4B79-847F-E7CA643ECD0B}"
- RootNamespace="convex"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Blender Debug|Win32"
- OutputDirectory="..\..\..\..\..\..\build\msvc_9\extern\solid\convex\debug"
- IntermediateDirectory="..\..\..\..\..\..\build\msvc_9\extern\solid\convex\debug"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\..\include;..\..\..\..\qhull\include"
- PreprocessorDefinitions="_DEBUG;QHULL;WIN32;_LIB"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- UsePrecompiledHeader="0"
- PrecompiledHeaderFile="..\..\..\..\..\..\build\msvc_9\extern\solid\convex\debug\convex.pch"
- AssemblerListingLocation="..\..\..\..\..\..\build\msvc_9\extern\solid\convex\debug\"
- ObjectFile="..\..\..\..\..\..\build\msvc_9\extern\solid\convex\debug\"
- ProgramDataBaseFileName="..\..\..\..\..\..\build\msvc_9\extern\solid\convex\debug\"
- WarningLevel="2"
- SuppressStartupBanner="true"
- DebugInformationFormat="3"
- CompileAs="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="_DEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="..\..\..\..\..\..\build\msvc_9\libs\extern\debug\convex.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Blender Release|Win32"
- OutputDirectory="..\..\..\..\..\..\build\msvc_9\extern\solid\convex"
- IntermediateDirectory="..\..\..\..\..\..\build\msvc_9\extern\solid\convex"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\include;..\..\..\..\qhull\include"
- PreprocessorDefinitions="NDEBUG;QHULL;WIN32;_LIB"
- StringPooling="true"
- RuntimeLibrary="0"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- PrecompiledHeaderFile="..\..\..\..\..\..\build\msvc_9\extern\solid\convex\convex.pch"
- AssemblerListingLocation="..\..\..\..\..\..\build\msvc_9\extern\solid\convex\"
- ObjectFile="..\..\..\..\..\..\build\msvc_9\extern\solid\convex\"
- ProgramDataBaseFileName="..\..\..\..\..\..\build\msvc_9\extern\solid\convex\"
- WarningLevel="2"
- SuppressStartupBanner="true"
- CompileAs="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="..\..\..\..\..\..\build\msvc_9\libs\extern\convex.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="3D Plugin Release|Win32"
- OutputDirectory="..\..\..\..\..\..\build\msvc_9\extern\solid\convex\mtdll"
- IntermediateDirectory="..\..\..\..\..\..\build\msvc_9\extern\solid\convex\mtdll"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\include;..\..\..\..\qhull\include"
- PreprocessorDefinitions="NDEBUG;QHULL;WIN32;_LIB"
- StringPooling="true"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- PrecompiledHeaderFile="..\..\..\..\..\..\build\msvc_9\extern\solid\convex\mtdll\convex.pch"
- AssemblerListingLocation="..\..\..\..\..\..\build\msvc_9\extern\solid\convex\mtdll\"
- ObjectFile="..\..\..\..\..\..\build\msvc_9\extern\solid\convex\mtdll\"
- ProgramDataBaseFileName="..\..\..\..\..\..\build\msvc_9\extern\solid\convex\mtdll\"
- WarningLevel="2"
- SuppressStartupBanner="true"
- CompileAs="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="..\..\..\..\..\..\build\msvc_9\libs\extern\mtdll\convex.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="3D Plugin Debug|Win32"
- OutputDirectory="..\..\..\..\..\..\build\msvc_9\extern\solid\convex\mtdll\debug"
- IntermediateDirectory="..\..\..\..\..\..\build\msvc_9\extern\solid\convex\mtdll\debug"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\..\include;..\..\..\..\qhull\include"
- PreprocessorDefinitions="_DEBUG;QHULL;WIN32;_LIB"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- PrecompiledHeaderFile="..\..\..\..\..\..\build\msvc_9\extern\solid\convex\mtdll\debug\convex.pch"
- AssemblerListingLocation="..\..\..\..\..\..\build\msvc_9\extern\solid\convex\mtdll\debug\"
- ObjectFile="..\..\..\..\..\..\build\msvc_9\extern\solid\convex\mtdll\debug\"
- ProgramDataBaseFileName="..\..\..\..\..\..\build\msvc_9\extern\solid\convex\mtdll\debug\"
- WarningLevel="2"
- SuppressStartupBanner="true"
- DebugInformationFormat="3"
- CompileAs="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="_DEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="..\..\..\..\..\..\build\msvc_9\libs\extern\mtdll\debug\convex.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
- >
- <File
- RelativePath="..\..\..\src\convex\DT_Accuracy.cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\src\convex\DT_Box.cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\src\convex\DT_Cone.cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\src\convex\DT_Convex.cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\src\convex\DT_Cylinder.cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\src\convex\DT_Facet.cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\src\convex\DT_LineSegment.cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\src\convex\DT_PenDepth.cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\src\convex\DT_Point.cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\src\convex\DT_Polyhedron.cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\src\convex\DT_Polytope.cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\src\convex\DT_Sphere.cpp"
- >
- </File>
- <File
- RelativePath="..\..\..\src\convex\DT_Triangle.cpp"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl"
- >
- <File
- RelativePath="..\..\src\convex\DT_Accuracy.h"
- >
- </File>
- <File
- RelativePath="..\..\src\convex\DT_Array.h"
- >
- </File>
- <File
- RelativePath="..\..\src\convex\DT_Box.h"
- >
- </File>
- <File
- RelativePath="..\..\src\convex\DT_Cone.h"
- >
- </File>
- <File
- RelativePath="..\..\src\convex\DT_Convex.h"
- >
- </File>
- <File
- RelativePath="..\..\src\convex\DT_Cylinder.h"
- >
- </File>
- <File
- RelativePath="..\..\src\convex\DT_Facet.h"
- >
- </File>
- <File
- RelativePath="..\..\src\convex\DT_GJK.h"
- >
- </File>
- <File
- RelativePath="..\..\src\convex\DT_Hull.h"
- >
- </File>
- <File
- RelativePath="..\..\src\convex\DT_IndexArray.h"
- >
- </File>
- <File
- RelativePath="..\..\src\convex\DT_LineSegment.h"
- >
- </File>
- <File
- RelativePath="..\..\src\convex\DT_Minkowski.h"
- >
- </File>
- <File
- RelativePath="..\..\src\convex\DT_PenDepth.h"
- >
- </File>
- <File
- RelativePath="..\..\src\convex\DT_Point.h"
- >
- </File>
- <File
- RelativePath="..\..\src\convex\DT_Polyhedron.h"
- >
- </File>
- <File
- RelativePath="..\..\src\convex\DT_Polytope.h"
- >
- </File>
- <File
- RelativePath="..\..\src\convex\DT_Shape.h"
- >
- </File>
- <File
- RelativePath="..\..\src\convex\DT_Sphere.h"
- >
- </File>
- <File
- RelativePath="..\..\src\convex\DT_Transform.h"
- >
- </File>
- <File
- RelativePath="..\..\src\convex\DT_Triangle.h"
- >
- </File>
- <File
- RelativePath="..\..\src\convex\DT_VertexBase.h"
- >
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/extern/solid/make/msvc_9_0/solid.vcproj b/extern/solid/make/msvc_9_0/solid.vcproj deleted file mode 100644 index ed81c374696..00000000000 --- a/extern/solid/make/msvc_9_0/solid.vcproj +++ /dev/null @@ -1,595 +0,0 @@ -<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="9,00"
- Name="EXT_solid"
- ProjectGUID="{D696C86B-0B53-4471-A50D-5B983A6FA4AD}"
- RootNamespace="solid"
- TargetFrameworkVersion="131072"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Blender Debug|Win32"
- OutputDirectory="..\..\..\..\..\build\msvc_9\extern\solid\debug"
- IntermediateDirectory="..\..\..\..\..\build\msvc_9\extern\solid\debug"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\include;..\..\src\convex;..\..\src\complex"
- PreprocessorDefinitions="_DEBUG;QHULL;WIN32;_LIB"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- UsePrecompiledHeader="0"
- PrecompiledHeaderFile="..\..\..\..\..\build\msvc_9\extern\solid\debug\solid.pch"
- AssemblerListingLocation="..\..\..\..\..\build\msvc_9\extern\solid\debug\"
- ObjectFile="..\..\..\..\..\build\msvc_9\extern\solid\debug\"
- ProgramDataBaseFileName="..\..\..\..\..\build\msvc_9\extern\solid\debug\"
- WarningLevel="2"
- SuppressStartupBanner="true"
- DebugInformationFormat="3"
- CompileAs="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="_DEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="..\..\..\..\..\build\msvc_9\libs\extern\debug\solid.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying SOLID files library (debug target) to lib tree."
- CommandLine="ECHO Copying header files
IF NOT EXIST ..\..\..\..\..\build\msvc_9\extern\solid\include\SOLID MKDIR ..\..\..\..\..\build\msvc_9\extern\solid\include\SOLID
XCOPY /Y ..\..\include\SOLID*.h ..\..\..\..\..\build\msvc_9\extern\solid\include\SOLID
ECHO Done
"
- />
- </Configuration>
- <Configuration
- Name="Blender Release|Win32"
- OutputDirectory="..\..\..\..\..\build\msvc_9\extern\solid"
- IntermediateDirectory="..\..\..\..\..\build\msvc_9\extern\solid"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\include;..\..\src\convex;..\..\src\complex"
- PreprocessorDefinitions="NDEBUG;QHULL;WIN32;_LIB"
- StringPooling="true"
- RuntimeLibrary="0"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- PrecompiledHeaderFile="..\..\..\..\..\build\msvc_9\extern\solid\solid.pch"
- AssemblerListingLocation="..\..\..\..\..\build\msvc_9\extern\solid\"
- ObjectFile="..\..\..\..\..\build\msvc_9\extern\solid\"
- ProgramDataBaseFileName="..\..\..\..\..\build\msvc_9\extern\solid\"
- WarningLevel="2"
- SuppressStartupBanner="true"
- CompileAs="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="..\..\..\..\..\build\msvc_9\libs\extern\solid.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying SOLID files library to lib tree."
- CommandLine="ECHO Copying header files
IF NOT EXIST ..\..\..\..\..\build\msvc_9\extern\solid\include\SOLID MKDIR ..\..\..\..\..\build\msvc_9\extern\solid\include\SOLID
XCOPY /Y ..\..\include\SOLID*.h ..\..\..\..\..\build\msvc_9\extern\solid\include\SOLID
ECHO Done
"
- />
- </Configuration>
- <Configuration
- Name="3D Plugin Release|Win32"
- OutputDirectory="..\..\..\..\..\build\msvc_9\extern\solid\mtdll"
- IntermediateDirectory="..\..\..\..\..\build\msvc_9\extern\solid\mtdll"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\include;..\..\src\convex;..\..\src\complex"
- PreprocessorDefinitions="NDEBUG;QHULL;WIN32;_LIB"
- StringPooling="true"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="true"
- UsePrecompiledHeader="0"
- PrecompiledHeaderFile="..\..\..\..\..\build\msvc_9\extern\solid\mtdll\solid.pch"
- AssemblerListingLocation="..\..\..\..\..\build\msvc_9\extern\solid\mtdll\"
- ObjectFile="..\..\..\..\..\build\msvc_9\extern\solid\mtdll\"
- ProgramDataBaseFileName="..\..\..\..\..\build\msvc_9\extern\solid\mtdll\"
- WarningLevel="2"
- SuppressStartupBanner="true"
- CompileAs="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="..\..\..\..\..\build\msvc_9\libs\extern\mtdll\solid.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying SOLID files library to lib tree."
- CommandLine="ECHO Copying header files
IF NOT EXIST ..\..\..\..\..\build\msvc_9\extern\solid\include\SOLID MKDIR ..\..\..\..\..\build\msvc_9\extern\solid\include\SOLID
XCOPY /Y ..\..\include\SOLID*.h ..\..\..\..\..\build\msvc_9\extern\solid\include\SOLID
ECHO Done
"
- />
- </Configuration>
- <Configuration
- Name="3D Plugin Debug|Win32"
- OutputDirectory="..\..\..\..\..\build\msvc_9\extern\solid\mtdll\debug"
- IntermediateDirectory="..\..\..\..\..\build\msvc_9\extern\solid\mtdll\debug"
- ConfigurationType="4"
- InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="false"
- CharacterSet="2"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..\include;..\..\src\convex;..\..\src\complex"
- PreprocessorDefinitions="_DEBUG;QHULL;WIN32;_LIB"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="0"
- PrecompiledHeaderFile="..\..\..\..\..\build\msvc_9\extern\solid\mtdll\debug\solid.pch"
- AssemblerListingLocation="..\..\..\..\..\build\msvc_9\extern\solid\mtdll\debug\"
- ObjectFile="..\..\..\..\..\build\msvc_9\extern\solid\mtdll\debug\"
- ProgramDataBaseFileName="..\..\..\..\..\build\msvc_9\extern\solid\mtdll\debug\"
- WarningLevel="2"
- SuppressStartupBanner="true"
- DebugInformationFormat="3"
- CompileAs="0"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="_DEBUG"
- Culture="1033"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- OutputFile="..\..\..\..\..\build\msvc_9\libs\extern\mtdll\debug\solid.lib"
- SuppressStartupBanner="true"
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying SOLID files library (debug target) to lib tree."
- CommandLine="ECHO Copying header files
IF NOT EXIST ..\..\..\..\..\build\msvc_9\extern\solid\include\SOLID MKDIR ..\..\..\..\..\build\msvc_9\extern\solid\include\SOLID
XCOPY /Y ..\..\include\SOLID*.h ..\..\..\..\..\build\msvc_9\extern\solid\include\SOLID
ECHO Done
"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
- >
- <File
- RelativePath="..\..\src\DT_C-api.cpp"
- >
- <FileConfiguration
- Name="Blender Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Blender Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\src\DT_Encounter.cpp"
- >
- <FileConfiguration
- Name="Blender Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Blender Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\src\DT_Object.cpp"
- >
- <FileConfiguration
- Name="Blender Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Blender Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\src\DT_RespTable.cpp"
- >
- <FileConfiguration
- Name="Blender Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Blender Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- </File>
- <File
- RelativePath="..\..\src\DT_Scene.cpp"
- >
- <FileConfiguration
- Name="Blender Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Blender Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="2"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- />
- </FileConfiguration>
- <FileConfiguration
- Name="3D Plugin Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories=""
- PreprocessorDefinitions=""
- BasicRuntimeChecks="3"
- />
- </FileConfiguration>
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl"
- >
- <File
- RelativePath="..\..\src\DT_AlgoTable.h"
- >
- </File>
- <File
- RelativePath="..\..\src\DT_Encounter.h"
- >
- </File>
- <File
- RelativePath="..\..\src\DT_Object.h"
- >
- </File>
- <File
- RelativePath="..\..\src\DT_Response.h"
- >
- </File>
- <File
- RelativePath="..\..\src\DT_RespTable.h"
- >
- </File>
- <File
- RelativePath="..\..\src\DT_Scene.h"
- >
- </File>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/extern/solid/src/DT_AlgoTable.h b/extern/solid/src/DT_AlgoTable.h deleted file mode 100644 index 0749ca7fdd9..00000000000 --- a/extern/solid/src/DT_AlgoTable.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_ALGOTABLE_H -#define DT_ALGOTABLE_H - -#include "DT_Shape.h" - -template <typename Function, int NUM_TYPES = 8> -class AlgoTable { -public: - void addEntry(DT_ShapeType type1, DT_ShapeType type2, Function function) - { - table[type2][type1] = function; - table[type1][type2] = function; - } - - Function lookup(DT_ShapeType type1, DT_ShapeType type2) const - { - return table[type1][type2]; - } - -private: - Function table[NUM_TYPES][NUM_TYPES]; -}; - -#endif diff --git a/extern/solid/src/DT_C-api.cpp b/extern/solid/src/DT_C-api.cpp deleted file mode 100644 index ac16deda87d..00000000000 --- a/extern/solid/src/DT_C-api.cpp +++ /dev/null @@ -1,581 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - - -#include "SOLID.h" - -#include "DT_Box.h" -#include "DT_Cone.h" -#include "DT_Cylinder.h" -#include "DT_Sphere.h" -#include "DT_Complex.h" -#include "DT_Polytope.h" -#include "DT_Polyhedron.h" -#include "DT_Point.h" -#include "DT_LineSegment.h" -#include "DT_Triangle.h" -#include "DT_Minkowski.h" -#include "DT_Hull.h" - -#include "DT_Response.h" -#include "DT_RespTable.h" - -#include "DT_Scene.h" -#include "DT_Object.h" - -#include "DT_VertexBase.h" - -#include "DT_Accuracy.h" - -typedef MT::Tuple3<DT_Scalar> T_Vertex; -typedef std::vector<T_Vertex> T_VertexBuf; -typedef std::vector<DT_Index> T_IndexBuf; -typedef std::vector<const DT_Convex *> T_PolyList; - -static T_VertexBuf vertexBuf; -static T_IndexBuf indexBuf; -static T_PolyList polyList; - -static DT_Complex *currentComplex = 0; -static DT_Polyhedron *currentPolyhedron = 0; -static DT_VertexBase *currentBase = 0; - - - - - - -DT_VertexBaseHandle DT_NewVertexBase(const void *pointer, DT_Size stride) -{ - return (DT_VertexBaseHandle)new DT_VertexBase(pointer, stride); -} - -void DT_DeleteVertexBase(DT_VertexBaseHandle vertexBase) -{ - delete (DT_VertexBase *)vertexBase; -} - -void DT_ChangeVertexBase(DT_VertexBaseHandle vertexBase, const void *pointer) -{ - DT_VertexBase *base = (DT_VertexBase *)vertexBase; - base->setPointer(pointer); - const DT_ComplexList& complexList = base->getComplexList(); - DT_ComplexList::const_iterator it; - for (it = complexList.begin(); it != complexList.end(); ++it) - { - (*it)->refit(); - } -} - - -DT_ShapeHandle DT_NewBox(DT_Scalar x, DT_Scalar y, DT_Scalar z) -{ - return (DT_ShapeHandle)new DT_Box(MT_Scalar(x) * MT_Scalar(0.5), - MT_Scalar(y) * MT_Scalar(0.5), - MT_Scalar(z) * MT_Scalar(0.5)); -} - -DT_ShapeHandle DT_NewCone(DT_Scalar radius, DT_Scalar height) -{ - return (DT_ShapeHandle)new DT_Cone(MT_Scalar(radius), MT_Scalar(height)); -} - -DT_ShapeHandle DT_NewCylinder(DT_Scalar radius, DT_Scalar height) -{ - return (DT_ShapeHandle)new DT_Cylinder(MT_Scalar(radius), MT_Scalar(height)); -} - -DT_ShapeHandle DT_NewSphere(DT_Scalar radius) -{ - return (DT_ShapeHandle)new DT_Sphere(MT_Scalar(radius)); -} - -DT_ShapeHandle DT_NewPoint(const DT_Vector3 point) -{ - return (DT_ShapeHandle)new DT_Point(MT_Point3(point)); -} - -DT_ShapeHandle DT_NewLineSegment(const DT_Vector3 source, const DT_Vector3 target) -{ - return (DT_ShapeHandle)new DT_LineSegment(MT_Point3(source), MT_Point3(target)); -} - -DT_ShapeHandle DT_NewMinkowski(DT_ShapeHandle shape1, DT_ShapeHandle shape2) -{ - if (((DT_Shape *)shape1)->getType() != CONVEX || - ((DT_Shape *)shape2)->getType() != CONVEX) - { - return 0; - } - - return (DT_ShapeHandle)new DT_Minkowski(*(DT_Convex *)shape1, *(DT_Convex *)shape2); -} - -DT_ShapeHandle DT_NewHull(DT_ShapeHandle shape1, DT_ShapeHandle shape2) -{ - if (((DT_Shape *)shape1)->getType() != CONVEX || - ((DT_Shape *)shape2)->getType() != CONVEX) - { - return 0; - } - - return (DT_ShapeHandle)new DT_Hull(*(DT_Convex *)shape1, *(DT_Convex *)shape2); -} - -DT_ShapeHandle DT_NewComplexShape(const DT_VertexBaseHandle vertexBase) -{ - if (!currentComplex) - { - currentBase = vertexBase ? (DT_VertexBase *)vertexBase : new DT_VertexBase; - currentComplex = new DT_Complex(currentBase); - } - return (DT_ShapeHandle)currentComplex; -} - -void DT_EndComplexShape() -{ - if (currentComplex) - { - if (currentBase->getPointer() == 0) - { - T_Vertex *vertexArray = new T_Vertex[vertexBuf.size()]; - assert(vertexArray); - std::copy(vertexBuf.begin(), vertexBuf.end(), &vertexArray[0]); - currentBase->setPointer(vertexArray, true); - } - - vertexBuf.clear(); - - currentComplex->finish(polyList.size(), &polyList[0]); - polyList.clear(); - currentComplex = 0; - currentBase = 0; - } -} - -DT_ShapeHandle DT_NewPolytope(const DT_VertexBaseHandle vertexBase) -{ - if (!currentPolyhedron) - { - currentBase = vertexBase ? (DT_VertexBase *)vertexBase : new DT_VertexBase; - currentPolyhedron = new DT_Polyhedron; - - } - return (DT_ShapeHandle)currentPolyhedron; -} - -void DT_EndPolytope() -{ - if (currentPolyhedron) - { - if (currentBase->getPointer() == 0) - { - currentBase->setPointer(&vertexBuf[0]); - new (currentPolyhedron) DT_Polyhedron(currentBase, indexBuf.size(), &indexBuf[0]); - - delete currentBase; - } - else - { - new (currentPolyhedron) DT_Polyhedron(currentBase, indexBuf.size(), &indexBuf[0]); - } - vertexBuf.clear(); - indexBuf.clear(); - currentPolyhedron = 0; - currentBase = 0; - } -} - -void DT_Begin() -{} - -void DT_End() -{ - if (currentComplex) - { - DT_VertexIndices(indexBuf.size(), &indexBuf[0]); - indexBuf.clear(); - } -} - -void DT_Vertex(const DT_Vector3 vertex) -{ - MT::Vector3<DT_Scalar> p(vertex); - int i = GEN_max((int)vertexBuf.size() - 20, 0); - int n = static_cast<int>(vertexBuf.size()); - - while (i != n && !(vertexBuf[i] == p)) - { - ++i; - } - - if (i == n) - { - vertexBuf.push_back(p); - } - indexBuf.push_back(i); -} - - -void DT_VertexIndex(DT_Index index) { indexBuf.push_back(index); } - -void DT_VertexIndices(DT_Count count, const DT_Index *indices) -{ - if (currentComplex) - { - DT_Convex *poly = count == 3 ? - static_cast<DT_Convex *>(new DT_Triangle(currentBase, indices[0], indices[1], indices[2])) : - static_cast<DT_Convex *>(new DT_Polytope(currentBase, count, indices)); - polyList.push_back(poly); - - } - - if (currentPolyhedron) - { - int i; - for (i = 0; i < count; ++i) - { - indexBuf.push_back(indices[i]); - } - } -} - -void DT_VertexRange(DT_Index first, DT_Count count) -{ - DT_Index *indices = new DT_Index[count]; - - DT_Index i; - for (i = 0; i != count; ++i) - { - indices[i] = first + i; - } - DT_VertexIndices(count, indices); - - delete [] indices; -} - -void DT_DeleteShape(DT_ShapeHandle shape) -{ - delete (DT_Shape *)shape; -} - - - - -// Scene - - -DT_SceneHandle DT_CreateScene() -{ - return (DT_SceneHandle)new DT_Scene; -} - -void DT_DestroyScene(DT_SceneHandle scene) -{ - delete (DT_Scene *)scene; -} - -void DT_AddObject(DT_SceneHandle scene, DT_ObjectHandle object) -{ - assert(scene); - assert(object); - ((DT_Scene *)scene)->addObject(*(DT_Object *)object); -} - -void DT_RemoveObject(DT_SceneHandle scene, DT_ObjectHandle object) -{ - assert(scene); - assert(object); - ((DT_Scene *)scene)->removeObject(*(DT_Object *)object); -} - - -// Object instantiation - - -DT_ObjectHandle DT_CreateObject(void *client_object, - DT_ShapeHandle shape) -{ - return (DT_ObjectHandle)new DT_Object(client_object, *(DT_Shape *)shape); -} - -void DT_DestroyObject(DT_ObjectHandle object) -{ - delete (DT_Object *)object; -} - -void DT_SetMargin(DT_ObjectHandle object, DT_Scalar margin) -{ - ((DT_Object *)object)->setMargin(MT_Scalar(margin)); -} - - -void DT_SetScaling(DT_ObjectHandle object, const DT_Vector3 scaling) -{ - ((DT_Object *)object)->setScaling(MT_Vector3(scaling)); -} - -void DT_SetPosition(DT_ObjectHandle object, const DT_Vector3 position) -{ - ((DT_Object *)object)->setPosition(MT_Point3(position)); -} - -void DT_SetOrientation(DT_ObjectHandle object, const DT_Quaternion orientation) -{ - ((DT_Object *)object)->setOrientation(MT_Quaternion(orientation)); -} - - -void DT_SetMatrixf(DT_ObjectHandle object, const float *m) -{ - ((DT_Object *)object)->setMatrix(m); -} - -void DT_GetMatrixf(DT_ObjectHandle object, float *m) -{ - ((DT_Object *)object)->getMatrix(m); -} - -void DT_SetMatrixd(DT_ObjectHandle object, const double *m) -{ - ((DT_Object *)object)->setMatrix(m); -} -void DT_GetMatrixd(DT_ObjectHandle object, double *m) -{ - ((DT_Object *)object)->getMatrix(m); -} - -void DT_GetBBox(DT_ObjectHandle object, DT_Vector3 min, DT_Vector3 max) -{ - const MT_BBox& bbox = ((DT_Object *)object)->getBBox(); - bbox.getMin().getValue(min); - bbox.getMax().getValue(max); -} - -DT_Bool DT_GetIntersect(DT_ObjectHandle object1, DT_ObjectHandle object2, DT_Vector3 vec) -{ - MT_Vector3 v; - DT_Bool result = intersect(*(DT_Object*)object1, *(DT_Object*)object2, v); - v.getValue(vec); - return result; -} - -DT_Scalar DT_GetClosestPair(DT_ObjectHandle object1, DT_ObjectHandle object2, - DT_Vector3 point1, DT_Vector3 point2) -{ - MT_Point3 p1, p2; - - MT_Scalar result = closest_points(*(DT_Object *)object1, - *(DT_Object *)object2, - p1, p2); - p1.getValue(point1); - p2.getValue(point2); - - return MT_sqrt(result); -} - -DT_Bool DT_GetCommonPoint(DT_ObjectHandle object1, DT_ObjectHandle object2, - DT_Vector3 point) -{ - MT_Point3 p1, p2; - MT_Vector3 v(MT_Scalar(0.0), MT_Scalar(0.0), MT_Scalar(0.0)); - - bool result = common_point(*(DT_Object *)object1, *(DT_Object *)object2, v, p1, p2); - - if (result) - { - p1.getValue(point); - } - - return result; -} - -DT_Bool DT_GetPenDepth(DT_ObjectHandle object1, DT_ObjectHandle object2, - DT_Vector3 point1, DT_Vector3 point2) -{ - MT_Point3 p1, p2; - MT_Vector3 v(MT_Scalar(0.0), MT_Scalar(0.0), MT_Scalar(0.0)); - - bool result = penetration_depth(*(DT_Object *)object1, *(DT_Object *)object2, v, p1, p2); - - if (result) - { - p1.getValue(point1); - p2.getValue(point2); - } - - return result; -} - -// Response - -DT_RespTableHandle DT_CreateRespTable() -{ - return (DT_RespTableHandle)new DT_RespTable; -} - -void DT_DestroyRespTable(DT_RespTableHandle respTable) -{ - delete (DT_RespTable *)respTable; -} - -DT_ResponseClass DT_GenResponseClass(DT_RespTableHandle respTable) -{ - return ((DT_RespTable *)respTable)->genResponseClass(); -} - -void DT_SetResponseClass(DT_RespTableHandle respTable, DT_ObjectHandle object, - DT_ResponseClass responseClass) -{ - ((DT_RespTable *)respTable)->setResponseClass(object, responseClass); -} - -void DT_ClearResponseClass(DT_RespTableHandle respTable, - DT_ObjectHandle object) -{ - ((DT_RespTable *)respTable)->clearResponseClass(object); -} - -void DT_CallResponse(DT_RespTableHandle respTable, - DT_ObjectHandle object1, - DT_ObjectHandle object2, - const DT_CollData *coll_data) -{ - const DT_ResponseList& responseList = - ((DT_RespTable *)respTable)->find(object1, object2); - - if (responseList.getType() != DT_NO_RESPONSE) - { - responseList(((DT_Object *)object1)->getClientObject(), - ((DT_Object *)object2)->getClientObject(), - coll_data); - } -} - - -void DT_AddDefaultResponse(DT_RespTableHandle respTable, - DT_ResponseCallback response, - DT_ResponseType type, void *client_data) -{ - ((DT_RespTable *)respTable)->addDefault(DT_Response(response, type, client_data)); -} - -void DT_RemoveDefaultResponse(DT_RespTableHandle respTable, - DT_ResponseCallback response) -{ - ((DT_RespTable *)respTable)->removeDefault(DT_Response(response)); -} - -void DT_AddClassResponse(DT_RespTableHandle respTable, - DT_ResponseClass responseClass, - DT_ResponseCallback response, - DT_ResponseType type, void *client_data) -{ - ((DT_RespTable *)respTable)->addSingle(responseClass, - DT_Response(response, type, client_data)); -} - -void DT_RemoveClassResponse(DT_RespTableHandle respTable, - DT_ResponseClass responseClass, - DT_ResponseCallback response) -{ - ((DT_RespTable *)respTable)->removeSingle(responseClass, - DT_Response(response)); -} - -void DT_AddPairResponse(DT_RespTableHandle respTable, - DT_ResponseClass responseClass1, - DT_ResponseClass responseClass2, - DT_ResponseCallback response, - DT_ResponseType type, void *client_data) -{ - ((DT_RespTable *)respTable)->addPair(responseClass1, responseClass2, - DT_Response(response, type, client_data)); -} - -void DT_RemovePairResponse(DT_RespTableHandle respTable, - DT_ResponseClass responseClass1, - DT_ResponseClass responseClass2, - DT_ResponseCallback response) -{ - ((DT_RespTable *)respTable)->removePair(responseClass1, responseClass2, - DT_Response(response)); -} - - -// Runtime - -void DT_SetAccuracy(DT_Scalar max_error) -{ - if (max_error > MT_Scalar(0.0)) - { - DT_Accuracy::setAccuracy(MT_Scalar(max_error)); - } -} - -void DT_SetTolerance(DT_Scalar tol_error) -{ - if (tol_error > MT_Scalar(0.0)) - { - DT_Accuracy::setTolerance(MT_Scalar(tol_error)); - } -} - -DT_Count DT_Test(DT_SceneHandle scene, DT_RespTableHandle respTable) -{ - return ((DT_Scene *)scene)->handleCollisions((DT_RespTable *)respTable); -} - -void *DT_RayCast(DT_SceneHandle scene, void *ignore_client, - const DT_Vector3 source, const DT_Vector3 target, - DT_Scalar max_param, DT_Scalar *param, DT_Vector3 normal) -{ - DT_Scalar lambda = max_param; - - void *client_object = ((DT_Scene *)scene)->rayCast(ignore_client, source, target, - lambda, normal); - if (client_object) - { - *param = lambda; - } - return client_object; -} - -DT_Bool DT_ObjectRayCast(DT_ObjectHandle object, - const DT_Vector3 source, const DT_Vector3 target, - DT_Scalar max_param, DT_Scalar *param, DT_Vector3 hit_normal) -{ - MT_Scalar lambda = MT_Scalar(max_param); - MT_Vector3 normal; - - bool result = ((DT_Object *)object)->ray_cast(MT_Point3(source), MT_Point3(target), - lambda, normal); - - if (result) - { - *param = lambda; - normal.getValue(hit_normal); - } - return result; -} - diff --git a/extern/solid/src/DT_Encounter.cpp b/extern/solid/src/DT_Encounter.cpp deleted file mode 100644 index 36de33154a3..00000000000 --- a/extern/solid/src/DT_Encounter.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#include "DT_RespTable.h" -#include "DT_Encounter.h" -#include "DT_Object.h" -#include "GEN_MinMax.h" - -DT_Bool DT_Encounter::exactTest(const DT_RespTable *respTable, int& count) const -{ - const DT_ResponseList& responseList = respTable->find(m_obj_ptr1, m_obj_ptr2); - - switch (responseList.getType()) - { - case DT_BROAD_RESPONSE: - return (respTable->getResponseClass(m_obj_ptr1) < respTable->getResponseClass(m_obj_ptr2)) ? - responseList(m_obj_ptr1->getClientObject(), m_obj_ptr2->getClientObject(), 0) : - responseList(m_obj_ptr2->getClientObject(), m_obj_ptr1->getClientObject(), 0); - case DT_SIMPLE_RESPONSE: - if (intersect(*m_obj_ptr1, *m_obj_ptr2, m_sep_axis)) - { - ++count; - return (respTable->getResponseClass(m_obj_ptr1) < respTable->getResponseClass(m_obj_ptr2)) ? - responseList(m_obj_ptr1->getClientObject(), m_obj_ptr2->getClientObject(), 0) : - responseList(m_obj_ptr2->getClientObject(), m_obj_ptr1->getClientObject(), 0); - - } - break; - case DT_WITNESSED_RESPONSE: { - MT_Point3 p1, p2; - - if (common_point(*m_obj_ptr1, *m_obj_ptr2, m_sep_axis, p1, p2)) - { - ++count; - if (respTable->getResponseClass(m_obj_ptr1) < respTable->getResponseClass(m_obj_ptr2)) - { - DT_CollData coll_data; - - p1.getValue(coll_data.point1); - p2.getValue(coll_data.point2); - - return responseList(m_obj_ptr1->getClientObject(), m_obj_ptr2->getClientObject(), &coll_data); - } - else - { - DT_CollData coll_data; - - p1.getValue(coll_data.point2); - p2.getValue(coll_data.point1); - - return responseList(m_obj_ptr2->getClientObject(), m_obj_ptr1->getClientObject(), &coll_data); - } - } - break; - } - case DT_DEPTH_RESPONSE: { - MT_Point3 p1, p2; - - if (penetration_depth(*m_obj_ptr1, *m_obj_ptr2, m_sep_axis, p1, p2)) - { - ++count; - if (respTable->getResponseClass(m_obj_ptr1) < respTable->getResponseClass(m_obj_ptr2)) - { - DT_CollData coll_data; - - p1.getValue(coll_data.point1); - p2.getValue(coll_data.point2); - (p2 - p1).getValue(coll_data.normal); - - return responseList(m_obj_ptr1->getClientObject(), m_obj_ptr2->getClientObject(), &coll_data); - } - else - { - DT_CollData coll_data; - - p1.getValue(coll_data.point2); - p2.getValue(coll_data.point1); - (p1 - p2).getValue(coll_data.normal); - - return responseList(m_obj_ptr2->getClientObject(), m_obj_ptr1->getClientObject(), &coll_data); - } - } - break; - } - case DT_NO_RESPONSE: - break; - default: - assert(false); - } - return DT_CONTINUE; -} diff --git a/extern/solid/src/DT_Encounter.h b/extern/solid/src/DT_Encounter.h deleted file mode 100644 index f20ea3936b0..00000000000 --- a/extern/solid/src/DT_Encounter.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_ENCOUNTER_H -#define DT_ENCOUNTER_H - -#include <set> - -#include "MT_Vector3.h" -#include "DT_Object.h" -#include "DT_Shape.h" - -class DT_RespTable; - -class DT_Encounter { -public: - DT_Encounter() {} - DT_Encounter(DT_Object *obj_ptr1, DT_Object *obj_ptr2) - : m_sep_axis(MT_Scalar(0.0), MT_Scalar(0.0), MT_Scalar(0.0)) - { - assert(obj_ptr1 != obj_ptr2); - if (obj_ptr2->getType() < obj_ptr1->getType() || - (obj_ptr2->getType() == obj_ptr1->getType() && - obj_ptr2 < obj_ptr1)) - { - m_obj_ptr1 = obj_ptr2; - m_obj_ptr2 = obj_ptr1; - } - else - { - m_obj_ptr1 = obj_ptr1; - m_obj_ptr2 = obj_ptr2; - } - } - - DT_Object *first() const { return m_obj_ptr1; } - DT_Object *second() const { return m_obj_ptr2; } - const MT_Vector3& separatingAxis() const { return m_sep_axis; } - - DT_Bool exactTest(const DT_RespTable *respTable, int& count) const; - -private: - DT_Object *m_obj_ptr1; - DT_Object *m_obj_ptr2; - mutable MT_Vector3 m_sep_axis; -}; - -inline bool operator<(const DT_Encounter& a, const DT_Encounter& b) -{ - return a.first() < b.first() || - (a.first() == b.first() && a.second() < b.second()); -} - - - -inline std::ostream& operator<<(std::ostream& os, const DT_Encounter& a) { - return os << '(' << a.first() << ", " << a.second() << ')'; -} - - - -typedef std::set<DT_Encounter> DT_EncounterTable; - -#endif diff --git a/extern/solid/src/DT_Object.cpp b/extern/solid/src/DT_Object.cpp deleted file mode 100644 index ed43a7bdaf2..00000000000 --- a/extern/solid/src/DT_Object.cpp +++ /dev/null @@ -1,276 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#include "DT_Object.h" -#include "DT_AlgoTable.h" -#include "DT_Convex.h" -#include "DT_Complex.h" -#include "DT_LineSegment.h" -#include "DT_Transform.h" -#include "DT_Minkowski.h" -#include "DT_Sphere.h" - -void DT_Object::setBBox() -{ - m_bbox = m_shape.bbox(m_xform, m_margin); - DT_Vector3 min, max; - m_bbox.getMin().getValue(min); - m_bbox.getMax().getValue(max); - - T_ProxyList::const_iterator it; - for (it = m_proxies.begin(); it != m_proxies.end(); ++it) - { - BP_SetBBox(*it, min, max); - } -} - -bool DT_Object::ray_cast(const MT_Point3& source, const MT_Point3& target, - MT_Scalar& lambda, MT_Vector3& normal) const -{ - MT_Transform inv_xform = m_xform.inverse(); - MT_Point3 local_source = inv_xform(source); - MT_Point3 local_target = inv_xform(target); - MT_Vector3 local_normal; - - bool result = m_shape.ray_cast(local_source, local_target, lambda, local_normal); - - if (result) - { - normal = local_normal * inv_xform.getBasis(); - MT_Scalar len = normal.length(); - if (len > MT_Scalar(0.0)) - { - normal /= len; - } - } - - return result; -} - - -typedef AlgoTable<Intersect> IntersectTable; -typedef AlgoTable<Common_point> Common_pointTable; -typedef AlgoTable<Penetration_depth> Penetration_depthTable; -typedef AlgoTable<Closest_points> Closest_pointsTable; - - -bool intersectConvexConvex(const DT_Shape& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Shape& b, const MT_Transform& b2w, MT_Scalar b_margin, - MT_Vector3& v) -{ - DT_Transform ta(a2w, (const DT_Convex&)a); - DT_Transform tb(b2w, (const DT_Convex&)b); - return intersect((a_margin > MT_Scalar(0.0) ? static_cast<const DT_Convex&>(DT_Minkowski(ta, DT_Sphere(a_margin))) : static_cast<const DT_Convex&>(ta)), - (b_margin > MT_Scalar(0.0) ? static_cast<const DT_Convex&>(DT_Minkowski(tb, DT_Sphere(b_margin))) : static_cast<const DT_Convex&>(tb)), v); -} - -bool intersectComplexConvex(const DT_Shape& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Shape& b, const MT_Transform& b2w, MT_Scalar b_margin, - MT_Vector3& v) -{ - if (a.getType() == COMPLEX) - { - DT_Transform tb(b2w, (const DT_Convex&)b); - return intersect((const DT_Complex&)a, a2w, a_margin, - (b_margin > MT_Scalar(0.0) ? static_cast<const DT_Convex&>(DT_Minkowski(tb, DT_Sphere(b_margin))) : static_cast<const DT_Convex&>(tb)), v); - } - - bool r = intersectComplexConvex(b, b2w, b_margin, a, a2w, a_margin, v); - v *= -1.; - return r; -} - -bool intersectComplexComplex(const DT_Shape& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Shape& b, const MT_Transform& b2w, MT_Scalar b_margin, - MT_Vector3& v) -{ - return intersect((const DT_Complex&)a, a2w, a_margin, - (const DT_Complex&)b, b2w, b_margin, v); -} - -IntersectTable *intersectInitialize() -{ - IntersectTable *p = new IntersectTable; - p->addEntry(COMPLEX, COMPLEX, intersectComplexComplex); - p->addEntry(COMPLEX, CONVEX, intersectComplexConvex); - p->addEntry(CONVEX, CONVEX, intersectConvexConvex); - return p; -} - -bool intersect(const DT_Object& a, const DT_Object& b, MT_Vector3& v) -{ - static IntersectTable *intersectTable = intersectInitialize(); - Intersect intersect = intersectTable->lookup(a.getType(), b.getType()); - return intersect(a.m_shape, a.m_xform, a.m_margin, - b.m_shape, b.m_xform, b.m_margin, v); -} - -bool common_pointConvexConvex(const DT_Shape& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Shape& b, const MT_Transform& b2w, MT_Scalar b_margin, - MT_Vector3& v, MT_Point3& pa, MT_Point3& pb) -{ - DT_Transform ta(a2w, (const DT_Convex&)a); - DT_Transform tb(b2w, (const DT_Convex&)b); - return common_point((a_margin > MT_Scalar(0.0) ? static_cast<const DT_Convex&>(DT_Minkowski(ta, DT_Sphere(a_margin))) : static_cast<const DT_Convex&>(ta)), - (b_margin > MT_Scalar(0.0) ? static_cast<const DT_Convex&>(DT_Minkowski(tb, DT_Sphere(b_margin))) : static_cast<const DT_Convex&>(tb)), v, pa, pb); -} - -bool common_pointComplexConvex(const DT_Shape& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Shape& b, const MT_Transform& b2w, MT_Scalar b_margin, - MT_Vector3& v, MT_Point3& pa, MT_Point3& pb) -{ - if (a.getType() == COMPLEX) - { - DT_Transform tb(b2w, (const DT_Convex&)b); - return common_point((const DT_Complex&)a, a2w, a_margin, - (b_margin > MT_Scalar(0.0) ? static_cast<const DT_Convex&>(DT_Minkowski(tb, DT_Sphere(b_margin))) : static_cast<const DT_Convex&>(tb)), v, pa, pb); - } - - bool r = common_pointComplexConvex(b, b2w, b_margin, a, a2w, a_margin, v, pb, pa); - v *= -1.; - return r; -} - -bool common_pointComplexComplex(const DT_Shape& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Shape& b, const MT_Transform& b2w, MT_Scalar b_margin, - MT_Vector3& v, MT_Point3& pa, MT_Point3& pb) -{ - return common_point((const DT_Complex&)a, a2w, a_margin, - (const DT_Complex&)b, b2w, b_margin, v, pa, pb); -} - -Common_pointTable *common_pointInitialize() -{ - Common_pointTable *p = new Common_pointTable; - p->addEntry(COMPLEX, COMPLEX, common_pointComplexComplex); - p->addEntry(COMPLEX, CONVEX, common_pointComplexConvex); - p->addEntry(CONVEX, CONVEX, common_pointConvexConvex); - return p; -} - -bool common_point(const DT_Object& a, const DT_Object& b, MT_Vector3& v, MT_Point3& pa, MT_Point3& pb) -{ - static Common_pointTable *common_pointTable = common_pointInitialize(); - Common_point common_point = common_pointTable->lookup(a.getType(), b.getType()); - return common_point(a.m_shape, a.m_xform, a.m_margin, - b.m_shape, b.m_xform, b.m_margin, v, pa, pb); -} - - - -bool penetration_depthConvexConvex(const DT_Shape& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Shape& b, const MT_Transform& b2w, MT_Scalar b_margin, - MT_Vector3& v, MT_Point3& pa, MT_Point3& pb) -{ - return hybrid_penetration_depth(DT_Transform(a2w, (const DT_Convex&)a), a_margin, - DT_Transform(b2w, (const DT_Convex&)b), b_margin, v, pa, pb); -} - -bool penetration_depthComplexConvex(const DT_Shape& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Shape& b, const MT_Transform& b2w, MT_Scalar b_margin, - MT_Vector3& v, MT_Point3& pa, MT_Point3& pb) -{ - if (a.getType() == COMPLEX) - return penetration_depth((const DT_Complex&)a, a2w, a_margin, - DT_Transform(b2w, (const DT_Convex&)b), b_margin, v, pa, pb); - - bool r = penetration_depthComplexConvex(b, b2w, b_margin, a, a2w, a_margin, v, pb, pa); - v *= -1.; - return r; -} - -bool penetration_depthComplexComplex(const DT_Shape& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Shape& b, const MT_Transform& b2w, MT_Scalar b_margin, - MT_Vector3& v, MT_Point3& pa, MT_Point3& pb) -{ - return penetration_depth((const DT_Complex&)a, a2w, a_margin, (const DT_Complex&)b, b2w, b_margin, v, pa, pb); -} - -Penetration_depthTable *penetration_depthInitialize() -{ - Penetration_depthTable *p = new Penetration_depthTable; - p->addEntry(COMPLEX, COMPLEX, penetration_depthComplexComplex); - p->addEntry(COMPLEX, CONVEX, penetration_depthComplexConvex); - p->addEntry(CONVEX, CONVEX, penetration_depthConvexConvex); - return p; -} - -bool penetration_depth(const DT_Object& a, const DT_Object& b, MT_Vector3& v, MT_Point3& pa, MT_Point3& pb) -{ - static Penetration_depthTable *penetration_depthTable = penetration_depthInitialize(); - Penetration_depth penetration_depth = penetration_depthTable->lookup(a.getType(), b.getType()); - return penetration_depth(a.m_shape, a.m_xform, a.m_margin, - b.m_shape, b.m_xform, b.m_margin, v, pa, pb); -} - - -MT_Scalar closest_pointsConvexConvex(const DT_Shape& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Shape& b, const MT_Transform& b2w, MT_Scalar b_margin, - MT_Point3& pa, MT_Point3& pb) -{ - DT_Transform ta(a2w, (const DT_Convex&)a); - DT_Transform tb(b2w, (const DT_Convex&)b); - return closest_points((a_margin > MT_Scalar(0.0) ? static_cast<const DT_Convex&>(DT_Minkowski(ta, DT_Sphere(a_margin))) : static_cast<const DT_Convex&>(ta)), - (b_margin > MT_Scalar(0.0) ? static_cast<const DT_Convex&>(DT_Minkowski(tb, DT_Sphere(b_margin))) : static_cast<const DT_Convex&>(tb)), MT_INFINITY, pa, pb); -} - -MT_Scalar closest_pointsComplexConvex(const DT_Shape& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Shape& b, const MT_Transform& b2w, MT_Scalar b_margin, - MT_Point3& pa, MT_Point3& pb) -{ - if (a.getType() == COMPLEX) - { - DT_Transform tb(b2w, (const DT_Convex&)b); - return closest_points((const DT_Complex&)a, a2w, a_margin, - (b_margin > MT_Scalar(0.0) ? static_cast<const DT_Convex&>(DT_Minkowski(tb, DT_Sphere(b_margin))) : static_cast<const DT_Convex&>(tb)), pa, pb); - } - - return closest_pointsComplexConvex(b, b2w, b_margin, a, a2w, a_margin, pb, pa); -} - -MT_Scalar closest_pointsComplexComplex(const DT_Shape& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Shape& b, const MT_Transform& b2w, MT_Scalar b_margin, - MT_Point3& pa, MT_Point3& pb) -{ - return closest_points((const DT_Complex&)a, a2w, a_margin, - (const DT_Complex&)b, b2w, b_margin, pa, pb); -} - -Closest_pointsTable *closest_pointsInitialize() -{ - Closest_pointsTable *p = new Closest_pointsTable; - p->addEntry(COMPLEX, COMPLEX, closest_pointsComplexComplex); - p->addEntry(COMPLEX, CONVEX, closest_pointsComplexConvex); - p->addEntry(CONVEX, CONVEX, closest_pointsConvexConvex); - return p; -} - -MT_Scalar closest_points(const DT_Object& a, const DT_Object& b, - MT_Point3& pa, MT_Point3& pb) -{ - static Closest_pointsTable *closest_pointsTable = closest_pointsInitialize(); - Closest_points closest_points = closest_pointsTable->lookup(a.getType(), b.getType()); - return closest_points(a.m_shape, a.m_xform, a.m_margin, - b.m_shape, b.m_xform, b.m_margin, pa, pb); -} - diff --git a/extern/solid/src/DT_Object.h b/extern/solid/src/DT_Object.h deleted file mode 100644 index 78beee2ab57..00000000000 --- a/extern/solid/src/DT_Object.h +++ /dev/null @@ -1,157 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_OBJECT_H -#define DT_OBJECT_H - -#include <vector> - -#include "SOLID.h" -#include "SOLID_broad.h" - -#include "MT_Transform.h" -#include "MT_Quaternion.h" -#include "MT_BBox.h" -#include "DT_Shape.h" - -class DT_Convex; - -class DT_Object { -public: - DT_Object(void *client_object, const DT_Shape& shape) : - m_client_object(client_object), - m_shape(shape), - m_margin(MT_Scalar(0.0)) - { - m_xform.setIdentity(); - setBBox(); - } - - void setMargin(MT_Scalar margin) - { - m_margin = margin; - setBBox(); - } - - void setScaling(const MT_Vector3& scaling) - { - m_xform.scale(scaling); - setBBox(); - } - - void setPosition(const MT_Point3& pos) - { - m_xform.setOrigin(pos); - setBBox(); - } - - void setOrientation(const MT_Quaternion& orn) - { - m_xform.setRotation(orn); - setBBox(); - } - - void setMatrix(const float *m) - { - m_xform.setValue(m); - assert(m_xform.getBasis().determinant() != MT_Scalar(0.0)); - setBBox(); - } - - void setMatrix(const double *m) - { - m_xform.setValue(m); - assert(m_xform.getBasis().determinant() != MT_Scalar(0.0)); - setBBox(); - } - - void getMatrix(float *m) const - { - m_xform.getValue(m); - } - - void getMatrix(double *m) const - { - m_xform.getValue(m); - } - - void setBBox(); - - const MT_BBox& getBBox() const { return m_bbox; } - - DT_ResponseClass getResponseClass() const { return m_responseClass; } - - void setResponseClass(DT_ResponseClass responseClass) - { - m_responseClass = responseClass; - } - - DT_ShapeType getType() const { return m_shape.getType(); } - - void *getClientObject() const { return m_client_object; } - - bool ray_cast(const MT_Point3& source, const MT_Point3& target, - MT_Scalar& param, MT_Vector3& normal) const; - - void addProxy(BP_ProxyHandle proxy) { m_proxies.push_back(proxy); } - - void removeProxy(BP_ProxyHandle proxy) - { - T_ProxyList::iterator it = std::find(m_proxies.begin(), m_proxies.end(), proxy); - if (it != m_proxies.end()) { - m_proxies.erase(it); - } - } - - - friend bool intersect(const DT_Object&, const DT_Object&, MT_Vector3& v); - - friend bool common_point(const DT_Object&, const DT_Object&, MT_Vector3&, - MT_Point3&, MT_Point3&); - - friend bool penetration_depth(const DT_Object&, const DT_Object&, - MT_Vector3&, MT_Point3&, MT_Point3&); - - friend MT_Scalar closest_points(const DT_Object&, const DT_Object&, - MT_Point3&, MT_Point3&); - -private: - typedef std::vector<BP_ProxyHandle> T_ProxyList; - - void *m_client_object; - DT_ResponseClass m_responseClass; - const DT_Shape& m_shape; - MT_Scalar m_margin; - MT_Transform m_xform; - T_ProxyList m_proxies; - MT_BBox m_bbox; -}; - -#endif - - - - - - - diff --git a/extern/solid/src/DT_RespTable.cpp b/extern/solid/src/DT_RespTable.cpp deleted file mode 100644 index 20fbfc06aac..00000000000 --- a/extern/solid/src/DT_RespTable.cpp +++ /dev/null @@ -1,184 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#include "DT_RespTable.h" - -#include <assert.h> - -DT_ResponseList DT_RespTable::g_emptyResponseList; - -DT_RespTable::~DT_RespTable() -{ - DT_ResponseClass i; - for (i = 0; i < m_responseClass; ++i) - { - delete [] m_table[i]; - } -} - -DT_ResponseClass DT_RespTable::genResponseClass() -{ - DT_ResponseClass newClass = m_responseClass++; - DT_ResponseList *newList = new DT_ResponseList[m_responseClass]; - assert(newList); - m_table.push_back(newList); - m_singleList.resize(m_responseClass); - DT_ResponseClass i; - for (i = 0; i < m_responseClass; ++i) - { - newList[i].append(m_default); - newList[i].append(m_singleList[i]); - } - return newClass; -} - -void DT_RespTable::setResponseClass(void *object, - DT_ResponseClass responseClass) -{ - assert(responseClass < m_responseClass); - m_objectMap[object] = responseClass; -} - -DT_ResponseClass DT_RespTable::getResponseClass(void *object) const -{ - T_ObjectMap::const_iterator it = m_objectMap.find(object); - assert(it != m_objectMap.end()); - return (*it).second; -} - -void DT_RespTable::clearResponseClass(void *object) -{ - m_objectMap.erase(object); -} - -const DT_ResponseList& DT_RespTable::find(void *object1, void *object2) const -{ - T_ObjectMap::const_iterator it = m_objectMap.find(object1); - if (it != m_objectMap.end()) - { - DT_ResponseClass responseClass1 = (*it).second; - it = m_objectMap.find(object2); - if (it != m_objectMap.end()) - { - DT_ResponseClass responseClass2 = (*it).second; - if (responseClass1 < responseClass2) - { - std::swap(responseClass1, responseClass2); - } - return m_table[responseClass1][responseClass2]; - } - } - return g_emptyResponseList; -} - -void DT_RespTable::addDefault(const DT_Response& response) -{ - m_default.addResponse(response); - DT_ResponseClass i; - for (i = 0; i < m_responseClass; ++i) - { - DT_ResponseClass j; - for (j = 0; j <= i; ++j) - { - m_table[i][j].addResponse(response); - } - } -} - -void DT_RespTable::removeDefault(const DT_Response& response) -{ - m_default.removeResponse(response); - DT_ResponseClass i; - for (i = 0; i < m_responseClass; ++i) - { - DT_ResponseClass j; - for (j = 0; j <= i; ++j) - { - m_table[i][j].removeResponse(response); - } - } -} - -void DT_RespTable::addSingle(DT_ResponseClass responseClass, - const DT_Response& response) -{ - assert(responseClass < m_responseClass); - m_singleList[responseClass].addResponse(response); - DT_ResponseClass j; - for (j = 0; j < responseClass; ++j) - { - m_table[responseClass][j].addResponse(response); - } - - DT_ResponseClass i; - for (i = responseClass; i < m_responseClass; ++i) - { - m_table[i][responseClass].addResponse(response); - } -} - -void DT_RespTable::removeSingle(DT_ResponseClass responseClass, - const DT_Response& response) -{ - assert(responseClass < m_responseClass); - m_singleList[responseClass].removeResponse(response); - DT_ResponseClass j; - for (j = 0; j < responseClass; ++j) - { - m_table[responseClass][j].removeResponse(response); - } - - DT_ResponseClass i; - for (i = responseClass; i < m_responseClass; ++i) - { - m_table[i][responseClass].removeResponse(response); - } -} - -void DT_RespTable::addPair(DT_ResponseClass responseClass1, - DT_ResponseClass responseClass2, - const DT_Response& response) -{ - assert(responseClass1 < m_responseClass); - assert(responseClass2 < m_responseClass); - if (responseClass1 < responseClass2) - { - std::swap(responseClass1, responseClass2); - } - m_table[responseClass1][responseClass2].addResponse(response); -} - - -void DT_RespTable::removePair(DT_ResponseClass responseClass1, - DT_ResponseClass responseClass2, - const DT_Response& response) -{ - assert(responseClass1 < m_responseClass); - assert(responseClass2 < m_responseClass); - if (responseClass1 < responseClass2) - { - std::swap(responseClass1, responseClass2); - } - m_table[responseClass1][responseClass2].removeResponse(response); -} - diff --git a/extern/solid/src/DT_RespTable.h b/extern/solid/src/DT_RespTable.h deleted file mode 100644 index 9a17f562937..00000000000 --- a/extern/solid/src/DT_RespTable.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_RESPTABLE_H -#define DT_RESPTABLE_H - -#include <algorithm> -#include <vector> -#include <list> -#include <map> -#include "GEN_MinMax.h" -#include "DT_Response.h" - -class DT_ResponseList : public std::list<DT_Response> { -public: - DT_ResponseList() : m_type(DT_NO_RESPONSE) {} - - DT_ResponseType getType() const { return m_type; } - - void addResponse(const DT_Response& response) - { - if (response.getType() != DT_NO_RESPONSE) - { - push_back(response); - GEN_set_max(m_type, response.getType()); - } - } - - void removeResponse(const DT_Response& response) - { - iterator it = std::find(begin(), end(), response); - if (it != end()) - { - erase(it); - m_type = DT_NO_RESPONSE; - for (it = begin(); it != end(); ++it) - { - GEN_set_max(m_type, (*it).getType()); - } - } - } - - void append(const DT_ResponseList& responseList) - { - if (responseList.getType() != DT_NO_RESPONSE) - { - const_iterator it; - for (it = responseList.begin(); it != responseList.end(); ++it) - { - addResponse(*it); - } - } - } - - DT_Bool operator()(void *a, void *b, const DT_CollData *coll_data) const - { - DT_Bool done = DT_CONTINUE; - const_iterator it; - for (it = begin(); !done && it != end(); ++it) - { - done = (*it)(a, b, coll_data); - } - return done; - } - -private: - DT_ResponseType m_type; -}; - -class DT_RespTable { -private: - typedef std::map<void *, DT_ResponseClass> T_ObjectMap; - typedef std::vector<DT_ResponseList *> T_PairTable; - typedef std::vector<DT_ResponseList> T_SingleList; - -public: - DT_RespTable() : m_responseClass(0) {} - - ~DT_RespTable(); - - DT_ResponseClass genResponseClass(); - - void setResponseClass(void *object, DT_ResponseClass responseClass); - DT_ResponseClass getResponseClass(void *object) const; - - void clearResponseClass(void *object); - - const DT_ResponseList& find(void *object1, void *object2) const; - - void addDefault(const DT_Response& response); - void removeDefault(const DT_Response& response); - - void addSingle(DT_ResponseClass responseClass, - const DT_Response& response); - void removeSingle(DT_ResponseClass responseClass, - const DT_Response& response); - - void addPair(DT_ResponseClass responseClass1, - DT_ResponseClass responseClass2, - const DT_Response& response); - void removePair(DT_ResponseClass responseClass1, - DT_ResponseClass responseClass2, - const DT_Response& response); - -private: - static DT_ResponseList g_emptyResponseList; - - T_ObjectMap m_objectMap; - DT_ResponseClass m_responseClass; - T_PairTable m_table; - T_SingleList m_singleList; - DT_ResponseList m_default; -}; - -#endif - - - - diff --git a/extern/solid/src/DT_Response.h b/extern/solid/src/DT_Response.h deleted file mode 100644 index e58d9bb9944..00000000000 --- a/extern/solid/src/DT_Response.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_RESPONSE_H -#define DT_RESPONSE_H - -#include "SOLID.h" - -class DT_Response { -public: - DT_Response(DT_ResponseCallback response = 0, - DT_ResponseType type = DT_NO_RESPONSE, - void *client_data = 0) - : m_response(response), - m_type(type), - m_client_data(client_data) {} - - DT_ResponseType getType() const { return m_type; } - - DT_Bool operator()(void *a, void *b, const DT_CollData *coll_data) const - { - return (*m_response)(m_client_data, a, b, coll_data); - } - - friend bool operator==(const DT_Response& a, const DT_Response& b) - { - return a.m_response == b.m_response; - } - - friend bool operator!=(const DT_Response& a, const DT_Response& b) - { - return a.m_response != b.m_response; - } - -private: - DT_ResponseCallback m_response; - DT_ResponseType m_type; - void *m_client_data; -}; - -#endif - - diff --git a/extern/solid/src/DT_Scene.cpp b/extern/solid/src/DT_Scene.cpp deleted file mode 100644 index 56cea1633ca..00000000000 --- a/extern/solid/src/DT_Scene.cpp +++ /dev/null @@ -1,183 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#include "DT_Scene.h" -#include "DT_Object.h" -#include "DT_Convex.h" - -//#define DEBUG - -static void beginOverlap(void *client_data, void *object1, void *object2) -{ - DT_Encounter e((DT_Object *)object1, (DT_Object *)object2); - DT_EncounterTable *encounterTable = static_cast<DT_EncounterTable *>(client_data); - -#ifdef DEBUG - std::cout << "Begin: " << e << std::endl; -#endif - - encounterTable->insert(e); -} - - -static void endOverlap(void *client_data, void *object1, void *object2) -{ - DT_Encounter e((DT_Object *)object1, (DT_Object *)object2); - DT_EncounterTable *encounterTable = static_cast<DT_EncounterTable *>(client_data); - -#ifdef DEBUG - std::cout << "End: " << e << std::endl; -#endif - - assert(encounterTable->find(e) != encounterTable->end()); - encounterTable->erase(e); -} - -struct DT_RayCastData { - DT_RayCastData(const void *ignore) - : m_ignore(ignore) - {} - - const void *m_ignore; - MT_Vector3 m_normal; -}; - -static bool objectRayCast(void *client_data, - void *object, - const DT_Vector3 source, - const DT_Vector3 target, - DT_Scalar *lambda) -{ - DT_RayCastData *data = static_cast<DT_RayCastData *>(client_data); - if (((DT_Object *)object)->getClientObject() != data->m_ignore) - { - MT_Scalar param = MT_Scalar(*lambda); - - if (((DT_Object *)object)->ray_cast(MT_Point3(source), MT_Point3(target), - param, data->m_normal)) - { - *lambda = param; - return true; - } - } - return false; -} - -DT_Scene::DT_Scene() - : m_broadphase(BP_CreateScene(&m_encounterTable, &beginOverlap, &endOverlap)) -{} - -DT_Scene::~DT_Scene() -{ - BP_DestroyScene(m_broadphase); -} - -void DT_Scene::addObject(DT_Object &object) -{ - const MT_BBox& bbox = object.getBBox(); - DT_Vector3 min, max; - bbox.getMin().getValue(min); - bbox.getMax().getValue(max); - BP_ProxyHandle proxy = BP_CreateProxy(m_broadphase, &object, min, max); - -#ifdef DEBUG - DT_EncounterTable::iterator it; - std::cout << "Add " << &object << ':'; - for (it = m_encounterTable.begin(); it != m_encounterTable.end(); ++it) { - std::cout << ' ' << (*it); - } - std::cout << std::endl; -#endif - object.addProxy(proxy); - m_objectList.push_back(std::make_pair(&object, proxy)); -} - - - -void DT_Scene::removeObject(DT_Object& object) -{ - T_ObjectList::iterator it = m_objectList.begin(); - - while (it != m_objectList.end() && &object != (*it).first) - { - ++it; - } - - if (it != m_objectList.end()) - { - object.removeProxy((*it).second); - BP_DestroyProxy(m_broadphase, (*it).second); - m_objectList.erase(it); - -#ifdef DEBUG - std::cout << "Remove " << &object << ':'; - DT_EncounterTable::iterator it; - for (it = m_encounterTable.begin(); it != m_encounterTable.end(); ++it) - { - std::cout << ' ' << (*it); - assert((*it).first() != &object && - (*it).second() != &object); - } - std::cout << std::endl; -#endif - } -} - - - -int DT_Scene::handleCollisions(const DT_RespTable *respTable) -{ - int count = 0; - - assert(respTable); - - DT_EncounterTable::iterator it; - for (it = m_encounterTable.begin(); it != m_encounterTable.end(); ++it) - { - if ((*it).exactTest(respTable, count)) - { - break; - } - - } - return count; -} - -void *DT_Scene::rayCast(const void *ignore_client, - const DT_Vector3 source, const DT_Vector3 target, - DT_Scalar& lambda, DT_Vector3 normal) const -{ - DT_RayCastData data(ignore_client); - DT_Object *object = (DT_Object *)BP_RayCast(m_broadphase, - &objectRayCast, - &data, - source, target, - &lambda); - if (object) - { - data.m_normal.getValue(normal); - return object->getClientObject(); - } - - return 0; -} diff --git a/extern/solid/src/DT_Scene.h b/extern/solid/src/DT_Scene.h deleted file mode 100644 index 9b061910312..00000000000 --- a/extern/solid/src/DT_Scene.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_SCENE_H -#define DT_SCENE_H - -#include <vector> - -#include "SOLID_broad.h" -#include "DT_Encounter.h" - -class DT_Object; -class DT_RespTable; - -class DT_Scene { -public: - DT_Scene(); - ~DT_Scene(); - - void addObject(DT_Object& object); - void removeObject(DT_Object& object); - - int handleCollisions(const DT_RespTable *respTable); - - void *rayCast(const void *ignore_client, - const DT_Vector3 source, const DT_Vector3 target, - DT_Scalar& lambda, DT_Vector3 normal) const; - -private: - typedef std::vector<std::pair<DT_Object *, BP_ProxyHandle> > T_ObjectList; - - BP_SceneHandle m_broadphase; - T_ObjectList m_objectList; - DT_EncounterTable m_encounterTable; -}; - -#endif diff --git a/extern/solid/src/Makefile b/extern/solid/src/Makefile deleted file mode 100644 index e8ef7a606c9..00000000000 --- a/extern/solid/src/Makefile +++ /dev/null @@ -1,45 +0,0 @@ -# -# $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 ***** -# -# - -SOURCEDIR = extern/solid/src -LIBNAME = solid -DIR = $(OCGDIR)/extern/$(LIBNAME) -DIRS = broad complex convex - -include nan_subdirs.mk - -CCFLAGS += $(LEVEL_1_CPP_WARNINGS) - -CPPFLAGS += -I../include -I$(NAN_QHULL)/include -CPPFLAGS += -Iconvex -Icomplex -CPPFLAGS += -DQHULL -DUSE_DOUBLES - -include nan_compile.mk - diff --git a/extern/solid/src/broad/BP_C-api.cpp b/extern/solid/src/broad/BP_C-api.cpp deleted file mode 100644 index 43e1172927b..00000000000 --- a/extern/solid/src/broad/BP_C-api.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#include "SOLID_broad.h" - -#include "BP_Scene.h" -#include "BP_Proxy.h" - -BP_SceneHandle BP_CreateScene(void *client_data, - BP_Callback beginOverlap, - BP_Callback endOverlap) -{ - return (BP_SceneHandle)new BP_Scene(client_data, - beginOverlap, - endOverlap); -} - - -void BP_DestroyScene(BP_SceneHandle scene) -{ - delete (BP_Scene *)scene; -} - - -BP_ProxyHandle BP_CreateProxy(BP_SceneHandle scene, void *object, - const DT_Vector3 min, const DT_Vector3 max) -{ - return (BP_ProxyHandle) - ((BP_Scene *)scene)->createProxy(object, min, max); -} - - -void BP_DestroyProxy(BP_SceneHandle scene, BP_ProxyHandle proxy) -{ - ((BP_Scene *)scene)->destroyProxy((BP_Proxy *)proxy); -} - - - -void BP_SetBBox(BP_ProxyHandle proxy, const DT_Vector3 min, const DT_Vector3 max) -{ - ((BP_Proxy *)proxy)->setBBox(min, max); -} - -void *BP_RayCast(BP_SceneHandle scene, - BP_RayCastCallback objectRayCast, - void *client_data, - const DT_Vector3 source, - const DT_Vector3 target, - DT_Scalar *lambda) -{ - return ((BP_Scene *)scene)->rayCast(objectRayCast, - client_data, - source, target, - *lambda); -} - diff --git a/extern/solid/src/broad/BP_Endpoint.h b/extern/solid/src/broad/BP_Endpoint.h deleted file mode 100644 index 8de6e67ce65..00000000000 --- a/extern/solid/src/broad/BP_Endpoint.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef BP_ENDPOINT_H -#define BP_ENDPOINT_H - -#include "SOLID_types.h" - -class BP_Proxy; - -class BP_Link { -public: - BP_Link() {} - explicit BP_Link(BP_Proxy *proxy) : - m_proxy(proxy) - {} - - DT_Index m_index; - DT_Count m_count; - BP_Proxy *m_proxy; -}; - -typedef unsigned int Uint32; - -class BP_Endpoint { -public: - enum { - MINIMUM = 0x00000000, - MAXIMUM = 0x80000000, - TYPEBIT = 0x00000001 - }; - - BP_Endpoint() {} - BP_Endpoint(DT_Scalar pos, Uint32 type, BP_Link *link) - : m_link(link) - { - setPos(pos, type); - } - - DT_Scalar getPos() const { return m_pos; } - DT_Index& getIndex() const { return m_link->m_index; } - DT_Count& getCount() const { return m_link->m_count; } - BP_Proxy *getProxy() const { return m_link->m_proxy; } - - DT_Index getEndIndex() const { return (m_link + 1)->m_index; } - - Uint32 getType() const - { - return (m_bits & TYPEBIT) ? (~m_bits & MAXIMUM) : (m_bits & MAXIMUM); - } - - void setPos(DT_Scalar pos, Uint32 type) - { - m_pos = pos; - if ((m_bits & MAXIMUM) == type) - { - m_bits &= ~TYPEBIT; - } - else - { - m_bits |= TYPEBIT; - } - } - -private: - union { - DT_Scalar m_pos; - Uint32 m_bits; - }; - BP_Link *m_link; -}; - -inline bool operator<(const BP_Endpoint& a, const BP_Endpoint& b) -{ - return a.getPos() < b.getPos(); -} - -#endif - - - - - - - - - - diff --git a/extern/solid/src/broad/BP_EndpointList.cpp b/extern/solid/src/broad/BP_EndpointList.cpp deleted file mode 100644 index aa094ffeb0a..00000000000 --- a/extern/solid/src/broad/BP_EndpointList.cpp +++ /dev/null @@ -1,237 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#include <float.h> -#include <algorithm> - -#include "BP_EndpointList.h" -#include "BP_Scene.h" -#include "BP_Proxy.h" -#include "BP_ProxyList.h" - -DT_Index BP_EndpointList::stab(const BP_Endpoint& pos, BP_ProxyList& proxies) const -{ - DT_Index result = std::upper_bound(begin(), end(), pos) - begin(); - - if (result != 0) - { - DT_Index i = result - 1; - DT_Count count = (*this)[i].getCount(); - while (count) - { - const BP_Endpoint& endpoint = (*this)[i]; - if (endpoint.getType() == BP_Endpoint::MINIMUM && - pos < (*this)[endpoint.getEndIndex()]) - { - proxies.add(endpoint.getProxy()); - --count; - } - assert(i != 0 || count == 0); - --i; - } - } - return result; -} - -DT_Scalar BP_EndpointList::nextLambda(DT_Index& index, - DT_Scalar source, - DT_Scalar delta) const -{ - if (delta != 0.0f) - { - if (delta < 0.0f) - { - if (index != 0) - { - return ((*this)[--index].getPos() - source) / delta; - } - } - else - { - if (index != size()) - { - return ((*this)[index++].getPos() - source) / delta; - } - } - } - return FLT_MAX; -} - - -void BP_EndpointList::range(const BP_Endpoint& min, - const BP_Endpoint& max, - DT_Index& first, DT_Index& last, - BP_ProxyList& proxies) const -{ - first = stab(min, proxies); - last = std::upper_bound(begin(), end(), max) - begin(); - - DT_Index i; - for (i = first; i != last; ++i) - { - const BP_Endpoint& endpoint = (*this)[i]; - if (endpoint.getType() == BP_Endpoint::MINIMUM) - { - proxies.add(endpoint.getProxy()); - } - } -} - -void BP_EndpointList::addInterval(const BP_Endpoint& min, - const BP_Endpoint& max, - BP_ProxyList& proxies) -{ - assert(invariant()); - DT_Index first, last; - range(min, max, first, last, proxies); - insert(begin() + last, max); - insert(begin() + first, min); - ++last; - - (*this)[first].getCount() = first != 0 ? (*this)[first - 1].getCount() : 0; - (*this)[last].getCount() = (*this)[last - 1].getCount(); - - - DT_Index i; - for (i = first; i != last; ++i) - { - ++(*this)[i].getCount(); - (*this)[i].getIndex() = i; - } - for (; i != size(); ++i) - { - (*this)[i].getIndex() = i; - } - - assert(invariant()); -} - -void BP_EndpointList::removeInterval(DT_Index first, DT_Index last, - BP_ProxyList& proxies) -{ - assert(invariant()); - - BP_Endpoint min = (*this)[first]; - BP_Endpoint max = (*this)[last]; - - erase(begin() + last); - erase(begin() + first); - --last; - - DT_Index i; - for (i = first; i != last; ++i) - { - --(*this)[i].getCount(); - (*this)[i].getIndex() = i; - } - for (; i != size(); ++i) - { - (*this)[i].getIndex() = i; - } - - range(min, max, first, last, proxies); - - assert(invariant()); -} - -void BP_EndpointList::move(DT_Index index, DT_Scalar pos, Uint32 type, - BP_Scene& scene, T_Overlap overlap) -{ - assert(invariant()); - - BP_Endpoint endpoint = (*this)[index]; - DT_Scalar delta = pos - endpoint.getPos(); - - if (delta != DT_Scalar(0.0)) - { - endpoint.setPos(pos, type); - if (delta < DT_Scalar(0.0)) - { - while (index != 0 && endpoint < (*this)[index - 1]) - { - (*this)[index] = (*this)[index - 1]; - (*this)[index].getIndex() = index; - encounters((*this)[index], endpoint, scene, overlap); - --index; - } - } - else - { - DT_Index last = size() - 1; - while (index != last && (*this)[index + 1] < endpoint) - { - (*this)[index] = (*this)[index + 1]; - (*this)[index].getIndex() = index; - encounters(endpoint, (*this)[index], scene, overlap); - ++index; - } - } - (*this)[index] = endpoint; - (*this)[index].getIndex() = index; - } - - assert(invariant()); -} - -void BP_EndpointList::encounters(const BP_Endpoint& a, const BP_Endpoint& b, - BP_Scene& scene, T_Overlap overlap) -{ - assert(a.getProxy() != b.getProxy()); - - if (a.getType() != b.getType()) - { - if (a.getType() == BP_Endpoint::MAXIMUM) - { - if (overlap(*a.getProxy(), *b.getProxy())) - { - scene.callBeginOverlap(a.getProxy()->getObject(), - b.getProxy()->getObject()); - } - ++a.getCount(); - ++b.getCount(); - } - else - { - if (overlap(*a.getProxy(), *b.getProxy())) - { - scene.callEndOverlap(a.getProxy()->getObject(), - b.getProxy()->getObject()); - } - --a.getCount(); - --b.getCount(); - } - } - else - { - if (a.getType() == BP_Endpoint::MAXIMUM) - { - --a.getCount(); - ++b.getCount(); - } - else - { - ++a.getCount(); - --b.getCount(); - } - } -} diff --git a/extern/solid/src/broad/BP_EndpointList.h b/extern/solid/src/broad/BP_EndpointList.h deleted file mode 100644 index 6154991ed3d..00000000000 --- a/extern/solid/src/broad/BP_EndpointList.h +++ /dev/null @@ -1,109 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef BP_ENDPOINTLIST_H -#define BP_ENDPOINTLIST_H - -//#define PARANOID - -#include <vector> - -#include "BP_Endpoint.h" -#include "BP_ProxyList.h" - -class BP_Scene; - -typedef bool (*T_Overlap)(const BP_Proxy& a, const BP_Proxy& b); - -class BP_EndpointList : public std::vector<BP_Endpoint> { -public: - BP_EndpointList() {} - - DT_Index stab(const BP_Endpoint& pos, BP_ProxyList& proxies) const; - - DT_Index stab(DT_Scalar pos, BP_ProxyList& proxies) const - { - return stab(BP_Endpoint(pos, BP_Endpoint::MINIMUM, 0), proxies); - } - - - void range(const BP_Endpoint& min, const BP_Endpoint& max, - DT_Index& first, DT_Index& last, BP_ProxyList& proxies) const; - - void range(DT_Scalar lb, DT_Scalar ub, DT_Index& first, DT_Index& last, BP_ProxyList& proxies) const - { - range(BP_Endpoint(lb, BP_Endpoint::MINIMUM, 0), - BP_Endpoint(ub, BP_Endpoint::MAXIMUM, 0), - first, last, proxies); - } - - void addInterval(const BP_Endpoint& min, const BP_Endpoint& max, BP_ProxyList& proxies); - void removeInterval(DT_Index first, DT_Index last, BP_ProxyList& proxies); - - void move(DT_Index index, DT_Scalar pos, Uint32 type, BP_Scene& scene, T_Overlap overlap); - - DT_Scalar nextLambda(DT_Index& index, DT_Scalar source, DT_Scalar target) const; - - -private: - void encounters(const BP_Endpoint& a, const BP_Endpoint& b, - BP_Scene& scene, T_Overlap overlap); - - -#ifdef PARANOID - bool invariant() const - { - DT_Count count = 0; - DT_Index i; - for (i = 0; i != size(); ++i) - { - const BP_Endpoint& endpoint = (*this)[i]; - - if (endpoint.getType() == BP_Endpoint::MINIMUM) - { - ++count; - } - else - { - --count; - } - if (endpoint.getCount() != count) - { - return false; - } - if (endpoint.getIndex() != i) - { - return false; - } - } - return true; - } -#else - bool invariant() const { return true; } -#endif - -}; - - - -#endif diff --git a/extern/solid/src/broad/BP_Proxy.cpp b/extern/solid/src/broad/BP_Proxy.cpp deleted file mode 100644 index e8007df240d..00000000000 --- a/extern/solid/src/broad/BP_Proxy.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#include <new> - -#include "BP_Proxy.h" -#include "BP_Scene.h" - -BP_Proxy::BP_Proxy(void *object, - BP_Scene& scene) - : m_object(object), - m_scene(scene) -{ - int i; - for (i = 0; i < 3; ++i) - { - new (&m_interval[i]) BP_Interval(this); - } -} - -void BP_Proxy::add(const DT_Vector3 min, - const DT_Vector3 max, - BP_ProxyList& proxies) -{ - int i; - for (i = 0; i < 3; ++i) - { - m_scene.getList(i).addInterval( - BP_Endpoint(min[i], BP_Endpoint::MINIMUM, &m_interval[i].m_min), - BP_Endpoint(max[i], BP_Endpoint::MAXIMUM, &m_interval[i].m_max), - proxies); - } -} - -void BP_Proxy::remove(BP_ProxyList& proxies) -{ - int i; - for (i = 0; i < 3; ++i) - { - m_scene.getList(i).removeInterval( - m_interval[i].m_min.m_index, - m_interval[i].m_max.m_index, - proxies); - } -} - -DT_Scalar BP_Proxy::getMin(int i) const -{ - return m_scene.getList(i)[m_interval[i].m_min.m_index].getPos(); -} - -DT_Scalar BP_Proxy::getMax(int i) const -{ - return m_scene.getList(i)[m_interval[i].m_max.m_index].getPos(); -} - -bool overlapXY(const BP_Proxy& a, const BP_Proxy& b) -{ - return a.getMin(0) <= b.getMax(0) && b.getMin(0) <= a.getMax(0) && - a.getMin(1) <= b.getMax(1) && b.getMin(1) <= a.getMax(1); -} - -bool overlapXZ(const BP_Proxy& a, const BP_Proxy& b) -{ - return a.getMin(0) <= b.getMax(0) && b.getMin(0) <= a.getMax(0) && - a.getMin(2) <= b.getMax(2) && b.getMin(2) <= a.getMax(2); -} - -bool overlapYZ(const BP_Proxy& a, const BP_Proxy& b) -{ - return a.getMin(1) <= b.getMax(1) && b.getMin(1) <= a.getMax(1) && - a.getMin(2) <= b.getMax(2) && b.getMin(2) <= a.getMax(2); -} - -void BP_Proxy::setBBox(const DT_Vector3 min, const DT_Vector3 max) -{ - static T_Overlap overlap[3] = { overlapYZ, overlapXZ, overlapXY }; - - int i; - for (i = 0; i < 3; ++i) - { - if (min[i] > getMax(i)) - { - m_scene.getList(i).move(m_interval[i].m_max.m_index, max[i], - BP_Endpoint::MAXIMUM, m_scene, overlap[i]); - m_scene.getList(i).move(m_interval[i].m_min.m_index, min[i], - BP_Endpoint::MINIMUM, m_scene, overlap[i]); - } - else - { - m_scene.getList(i).move(m_interval[i].m_min.m_index, min[i], - BP_Endpoint::MINIMUM, m_scene, overlap[i]); - m_scene.getList(i).move(m_interval[i].m_max.m_index, max[i], - BP_Endpoint::MAXIMUM, m_scene, overlap[i]); - } - } -} - - - diff --git a/extern/solid/src/broad/BP_Proxy.h b/extern/solid/src/broad/BP_Proxy.h deleted file mode 100644 index b4500ddca44..00000000000 --- a/extern/solid/src/broad/BP_Proxy.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef BP_PROXY_H -#define BP_PROXY_H - -#include "BP_Endpoint.h" -#include "BP_ProxyList.h" - -class BP_Interval { -public: - BP_Interval() {} - BP_Interval(BP_Proxy *proxy) : - m_min(proxy), - m_max(proxy) - {} - - BP_Link m_min; - BP_Link m_max; -}; - -class BP_Scene; - -class BP_Proxy { -public: - BP_Proxy(void *object, BP_Scene& scene); - - void add(const DT_Vector3 min, - const DT_Vector3 max, - BP_ProxyList& proxies); - - void remove(BP_ProxyList& proxies); - - void setBBox(const DT_Vector3 min, const DT_Vector3 max); - - void *getObject() { return m_object; } - - DT_Scalar getMin(int i) const; - DT_Scalar getMax(int i) const; - -private: - BP_Interval m_interval[3]; - void *m_object; - BP_Scene& m_scene; -}; - -inline bool BP_overlap(const BP_Proxy *a, const BP_Proxy *b) -{ - return a->getMin(0) <= b->getMax(0) && b->getMin(0) <= a->getMax(0) && - a->getMin(1) <= b->getMax(1) && b->getMin(1) <= a->getMax(1) && - a->getMin(2) <= b->getMax(2) && b->getMin(2) <= a->getMax(2); -} - -#endif - - - - diff --git a/extern/solid/src/broad/BP_ProxyList.h b/extern/solid/src/broad/BP_ProxyList.h deleted file mode 100644 index 2f449777d2d..00000000000 --- a/extern/solid/src/broad/BP_ProxyList.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef BP_PROXYLIST_H -#define BP_PROXYLIST_H - -#include <assert.h> - -#include <vector> -#include <algorithm> -#include <utility> - -class BP_Proxy; - -typedef std::pair<BP_Proxy *, unsigned int> BP_ProxyEntry; - -inline bool operator<(const BP_ProxyEntry& a, const BP_ProxyEntry& b) -{ - return a.first < b.first; -} - -class BP_ProxyList : public std::vector<BP_ProxyEntry> { -public: - BP_ProxyList(size_t n = 20) : std::vector<BP_ProxyEntry>(n) {} - - iterator add(BP_Proxy *proxy) - { - BP_ProxyEntry entry = std::make_pair(proxy, (unsigned int)0); - iterator it = std::lower_bound(begin(), end(), entry); - if (it == end() || (*it).first != proxy) - { - it = insert(it, entry); - } - ++(*it).second; - return it; - } - - void remove(BP_Proxy *proxy) - { - BP_ProxyEntry entry = std::make_pair(proxy, (unsigned int)0); - iterator it = std::lower_bound(begin(), end(), entry); - if (it != end() && (*it).first == proxy && --(*it).second == 0) - { - erase(it); - } - } -}; - -#endif diff --git a/extern/solid/src/broad/BP_Scene.cpp b/extern/solid/src/broad/BP_Scene.cpp deleted file mode 100644 index c0cd83ba311..00000000000 --- a/extern/solid/src/broad/BP_Scene.cpp +++ /dev/null @@ -1,151 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#include "BP_Scene.h" -#include "BP_Proxy.h" - -#include <algorithm> - -BP_Proxy *BP_Scene::createProxy(void *object, - const DT_Vector3 min, - const DT_Vector3 max) -{ - BP_Proxy *proxy = new BP_Proxy(object, *this); - - proxy->add(min, max, m_proxies); - - BP_ProxyList::iterator it; - for (it = m_proxies.begin(); it != m_proxies.end(); ++it) - { - if ((*it).second == 3) - { - callBeginOverlap(proxy->getObject(), (*it).first->getObject()); - } - } - - m_proxies.clear(); - - return proxy; -} - -void BP_Scene::destroyProxy(BP_Proxy *proxy) -{ - proxy->remove(m_proxies); - - BP_ProxyList::iterator it; - for (it = m_proxies.begin(); it != m_proxies.end(); ++it) - { - if ((*it).second == 3) - { - callEndOverlap(proxy->getObject(), (*it).first->getObject()); - } - } - - m_proxies.clear(); - - delete proxy; -} - -void *BP_Scene::rayCast(BP_RayCastCallback objectRayCast, - void *client_data, - const DT_Vector3 source, - const DT_Vector3 target, - DT_Scalar& lambda) const -{ - void *client_object = 0; - - DT_Index index[3]; - index[0] = m_endpointList[0].stab(source[0], m_proxies); - index[1] = m_endpointList[1].stab(source[1], m_proxies); - index[2] = m_endpointList[2].stab(source[2], m_proxies); - - BP_ProxyList::iterator it; - for (it = m_proxies.begin(); it != m_proxies.end(); ++it) - { - if ((*it).second == 3 && - (*objectRayCast)(client_data, (*it).first->getObject(), source, target, &lambda)) - { - client_object = (*it).first->getObject(); - } - } - - DT_Vector3 delta; - delta[0] = target[0] - source[0]; - delta[1] = target[1] - source[1]; - delta[2] = target[2] - source[2]; - - DT_Vector3 lambdas; - lambdas[0] = m_endpointList[0].nextLambda(index[0], source[0], delta[0]); - lambdas[1] = m_endpointList[1].nextLambda(index[1], source[1], delta[1]); - lambdas[2] = m_endpointList[2].nextLambda(index[2], source[2], delta[2]); - int closest = lambdas[0] < lambdas[1] ? (lambdas[0] < lambdas[2] ? 0 : 2) : (lambdas[1] < lambdas[2] ? 1 : 2); - - while (lambdas[closest] < lambda) - { - if (delta[closest] < 0.0f) - { - const BP_Endpoint& endpoint = m_endpointList[closest][index[closest]]; - - if (endpoint.getType() == BP_Endpoint::MAXIMUM) - { - it = m_proxies.add(endpoint.getProxy()); - if ((*it).second == 3 && - (*objectRayCast)(client_data, (*it).first->getObject(), source, target, &lambda)) - { - client_object = (*it).first->getObject(); - } - } - else - { - m_proxies.remove(endpoint.getProxy()); - } - } - else - { - const BP_Endpoint& endpoint = m_endpointList[closest][index[closest] - 1]; - - if (endpoint.getType() == BP_Endpoint::MINIMUM) - { - it = m_proxies.add(endpoint.getProxy()); - if ((*it).second == 3 && - (*objectRayCast)(client_data, (*it).first->getObject(), source, target, &lambda)) - { - client_object = (*it).first->getObject(); - } - } - else - { - m_proxies.remove(endpoint.getProxy()); - } - } - - lambdas[closest] = m_endpointList[closest].nextLambda(index[closest], source[closest], delta[closest]); - closest = lambdas[0] < lambdas[1] ? (lambdas[0] < lambdas[2] ? 0 : 2) : (lambdas[1] < lambdas[2] ? 1 : 2); - } - - m_proxies.clear(); - - return client_object; -} - - diff --git a/extern/solid/src/broad/BP_Scene.h b/extern/solid/src/broad/BP_Scene.h deleted file mode 100644 index ef55374c43b..00000000000 --- a/extern/solid/src/broad/BP_Scene.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef BP_SCENE_H -#define BP_SCENE_H - -#include <SOLID_broad.h> - -#include "BP_EndpointList.h" -#include "BP_ProxyList.h" - -class BP_Proxy; - -class BP_Scene { -public: - BP_Scene(void *client_data, - BP_Callback beginOverlap, - BP_Callback endOverlap) - : m_client_data(client_data), - m_beginOverlap(beginOverlap), - m_endOverlap(endOverlap), - m_proxies(20) - {} - - ~BP_Scene() {} - - BP_Proxy *createProxy(void *object, - const DT_Vector3 min, - const DT_Vector3 max); - - void destroyProxy(BP_Proxy *proxy); - - void *rayCast(BP_RayCastCallback objectRayCast, - void *client_data, - const DT_Vector3 source, - const DT_Vector3 target, - DT_Scalar& lambda) const; - - void callBeginOverlap(void *object1, void *object2) - { - (*m_beginOverlap)(m_client_data, object1, object2); - } - - void callEndOverlap(void *object1, void *object2) - { - (*m_endOverlap)(m_client_data, object1, object2); - } - - BP_EndpointList& getList(int i) { return m_endpointList[i]; } - -private: - void *m_client_data; - BP_Callback m_beginOverlap; - BP_Callback m_endOverlap; - BP_EndpointList m_endpointList[3]; - mutable BP_ProxyList m_proxies; -}; - -#endif diff --git a/extern/solid/src/broad/Makefile b/extern/solid/src/broad/Makefile deleted file mode 100644 index ce10e5f0bcf..00000000000 --- a/extern/solid/src/broad/Makefile +++ /dev/null @@ -1,41 +0,0 @@ -# -# $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 ***** -# -# - -LIBNAME = solid_broad -DIR = $(OCGDIR)/extern/$(LIBNAME) - -CCFLAGS += $(LEVEL_1_CPP_WARNINGS) - -CPPFLAGS += -I../../include -I$(NAN_QHULL)/include -CPPFLAGS += -DQHULL -DUSE_DOUBLES - -include nan_compile.mk - - diff --git a/extern/solid/src/complex/DT_BBoxTree.cpp b/extern/solid/src/complex/DT_BBoxTree.cpp deleted file mode 100644 index 4f10f61f2e2..00000000000 --- a/extern/solid/src/complex/DT_BBoxTree.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#include "DT_BBoxTree.h" - -inline DT_CBox getBBox(int first, int last, const DT_CBox *boxes, const DT_Index *indices) -{ - assert(last - first >= 1); - - DT_CBox bbox = boxes[indices[first]]; - int i; - for (i = first; i < last; ++i) - { - bbox = bbox.hull(boxes[indices[i]]); - } - - return bbox; -} - -DT_BBoxNode::DT_BBoxNode(int first, int last, int& node, DT_BBoxNode *free_nodes, const DT_CBox *boxes, DT_Index *indices, const DT_CBox& bbox) -{ - assert(last - first >= 2); - - int axis = bbox.longestAxis(); - MT_Scalar abscissa = bbox.getCenter()[axis]; - int i = first, mid = last; - while (i < mid) - { - if (boxes[indices[i]].getCenter()[axis] < abscissa) - { - ++i; - } - else - { - --mid; - std::swap(indices[i], indices[mid]); - } - } - - if (mid == first || mid == last) - { - mid = (first + last) / 2; - } - - m_lbox = getBBox(first, mid, boxes, indices); - m_rbox = getBBox(mid, last, boxes, indices); - m_flags = 0x0; - - if (mid - first == 1) - { - m_flags |= LLEAF; - m_lchild = indices[first]; - } - else - { - m_lchild = node++; - new(&free_nodes[m_lchild]) DT_BBoxNode(first, mid, node, free_nodes, boxes, indices, m_lbox); - } - - if (last - mid == 1) - { - m_flags |= RLEAF; - m_rchild = indices[mid]; - } - else - { - m_rchild = node++; - new(&free_nodes[m_rchild]) DT_BBoxNode(mid, last, node, free_nodes, boxes, indices, m_rbox); - } -} diff --git a/extern/solid/src/complex/DT_BBoxTree.h b/extern/solid/src/complex/DT_BBoxTree.h deleted file mode 100644 index 3d9da6e34ba..00000000000 --- a/extern/solid/src/complex/DT_BBoxTree.h +++ /dev/null @@ -1,540 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_BBOXTREE_H -#define DT_BBOXTREE_H - -#include <new> -#include <algorithm> - -#include "DT_Convex.h" -#include "DT_CBox.h" - - -class DT_BBoxTree { -public: - enum NodeType { INTERNAL = 0, LEAF = 1 }; - - DT_BBoxTree() {} - DT_BBoxTree(const DT_CBox& cbox, DT_Index index, NodeType type) - : m_cbox(cbox), - m_index(index), - m_type(type) - {} - - DT_CBox m_cbox; - DT_Index m_index; - NodeType m_type; -}; - - - -class DT_BBoxNode { -public: - DT_BBoxNode() {} - DT_BBoxNode(int first, int last, int& node, DT_BBoxNode *free_nodes, const DT_CBox *boxes, DT_Index *indices, const DT_CBox& bbox); - - void makeChildren(DT_BBoxTree& ltree, DT_BBoxTree& rtree) const; - void makeChildren(const DT_CBox& added, DT_BBoxTree& ltree, DT_BBoxTree& rtree) const; - - DT_CBox hull() const { return m_lbox.hull(m_rbox); } - - enum FlagType { LLEAF = 0x80, RLEAF = 0x40 }; - - DT_CBox m_lbox; - DT_CBox m_rbox; - DT_Index m_lchild; - DT_Index m_rchild; - unsigned char m_flags; -}; - -inline void DT_BBoxNode::makeChildren(DT_BBoxTree& ltree, DT_BBoxTree& rtree) const -{ - new (<ree) DT_BBoxTree(m_lbox, m_lchild, (m_flags & LLEAF) ? DT_BBoxTree::LEAF : DT_BBoxTree::INTERNAL); - new (&rtree) DT_BBoxTree(m_rbox, m_rchild, (m_flags & RLEAF) ? DT_BBoxTree::LEAF : DT_BBoxTree::INTERNAL); - -} - -inline void DT_BBoxNode::makeChildren(const DT_CBox& added, DT_BBoxTree& ltree, DT_BBoxTree& rtree) const -{ - new (<ree) DT_BBoxTree(m_lbox + added, m_lchild, (m_flags & LLEAF) ? DT_BBoxTree::LEAF : DT_BBoxTree::INTERNAL); - new (&rtree) DT_BBoxTree(m_rbox + added, m_rchild, (m_flags & RLEAF) ? DT_BBoxTree::LEAF : DT_BBoxTree::INTERNAL); -} - - -template <typename Shape> -class DT_RootData { -public: - DT_RootData(const DT_BBoxNode *nodes, - const Shape *leaves) - : m_nodes(nodes), - m_leaves(leaves) - {} - - const DT_BBoxNode *m_nodes; - const Shape *m_leaves; -}; - -template <typename Shape1, typename Shape2> -class DT_ObjectData : public DT_RootData<Shape1> { -public: - DT_ObjectData(const DT_BBoxNode *nodes, - const Shape1 *leaves, - const MT_Transform& xform, - Shape2 plus) - : DT_RootData<Shape1>(nodes, leaves), - m_xform(xform), - m_inv_xform(xform.inverse()), - m_plus(plus), - m_added(computeCBox(plus, m_inv_xform)) - {} - - const MT_Transform& m_xform; - MT_Transform m_inv_xform; - Shape2 m_plus; - DT_CBox m_added; -}; - -template <typename Shape1, typename Shape2> -class DT_Pack { -public: - DT_Pack(const DT_ObjectData<Shape1, Shape2>& a, const DT_Convex& b) - : m_a(a), - m_b(b), - m_b_cbox(b.bbox(m_a.m_inv_xform)) - {} - - DT_ObjectData<Shape1, Shape2> m_a; - const DT_Convex& m_b; - DT_CBox m_b_cbox; -}; - -template <typename Shape1, typename Shape2> -class DT_HybridPack : public DT_Pack<Shape1, Shape2> { -public: - DT_HybridPack(const DT_ObjectData<Shape1, Shape2>& a, const DT_Convex& b, MT_Scalar margin) - : DT_Pack<Shape1, Shape2>(a, b), - m_margin(margin) - { - this->m_b_cbox += computeCBox(margin, this->m_a.m_inv_xform); - } - - MT_Scalar m_margin; -}; - -template <typename Shape1, typename Shape2> -class DT_DuoPack { -public: - DT_DuoPack(const DT_ObjectData<Shape1, Shape2>& a, const DT_ObjectData<Shape1, Shape2>& b) - : m_a(a), - m_b(b) - { - m_b2a = a.m_inv_xform * b.m_xform; - m_a2b = b.m_inv_xform * a.m_xform; - m_abs_b2a = m_b2a.getBasis().absolute(); - m_abs_a2b = m_a2b.getBasis().absolute(); - } - - DT_ObjectData<Shape1, Shape2> m_a, m_b; - MT_Transform m_b2a, m_a2b; - MT_Matrix3x3 m_abs_b2a, m_abs_a2b; -}; - - -template <typename Shape> -inline void refit(DT_BBoxNode& node, const DT_RootData<Shape>& rd) -{ - node.m_lbox = (node.m_flags & DT_BBoxNode::LLEAF) ? - computeCBox(rd.m_leaves[node.m_lchild]) : - rd.m_nodes[node.m_lchild].hull(); - node.m_rbox = (node.m_flags & DT_BBoxNode::RLEAF) ? - computeCBox(rd.m_leaves[node.m_rchild]) : - rd.m_nodes[node.m_rchild].hull(); -} - - -template <typename Shape> -bool ray_cast(const DT_BBoxTree& a, const DT_RootData<Shape>& rd, - const MT_Point3& source, const MT_Point3& target, - MT_Scalar& lambda, MT_Vector3& normal) -{ - if (!a.m_cbox.overlapsLineSegment(source, source.lerp(target, lambda))) - { - return false; - } - - if (a.m_type == DT_BBoxTree::LEAF) - { - return ray_cast(rd, a.m_index, source, target, lambda, normal); - } - else - { - DT_BBoxTree ltree, rtree; - rd.m_nodes[a.m_index].makeChildren(ltree, rtree); - - bool lresult = ray_cast(ltree, rd, source, target, lambda, normal); - bool rresult = ray_cast(rtree, rd, source, target, lambda, normal); - return lresult || rresult; - } -} - - -#ifdef STATISTICS -int num_box_tests = 0; -#endif - -template <typename Shape1, typename Shape2> -inline bool intersect(const DT_CBox& a, const DT_CBox& b, const DT_DuoPack<Shape1, Shape2>& pack) -{ -#ifdef STATISTICS - ++num_box_tests; -#endif - - - MT_Vector3 abs_pos_b2a = (pack.m_b2a(b.getCenter()) - a.getCenter()).absolute(); - MT_Vector3 abs_pos_a2b = (pack.m_a2b(a.getCenter()) - b.getCenter()).absolute(); - return (a.getExtent()[0] + pack.m_abs_b2a[0].dot(b.getExtent()) >= abs_pos_b2a[0]) && - (a.getExtent()[1] + pack.m_abs_b2a[1].dot(b.getExtent()) >= abs_pos_b2a[1]) && - (a.getExtent()[2] + pack.m_abs_b2a[2].dot(b.getExtent()) >= abs_pos_b2a[2]) && - (b.getExtent()[0] + pack.m_abs_a2b[0].dot(a.getExtent()) >= abs_pos_a2b[0]) && - (b.getExtent()[1] + pack.m_abs_a2b[1].dot(a.getExtent()) >= abs_pos_a2b[1]) && - (b.getExtent()[2] + pack.m_abs_a2b[2].dot(a.getExtent()) >= abs_pos_a2b[2]); -} - - - - -template <typename Shape1, typename Shape2> -bool intersect(const DT_BBoxTree& a, const DT_Pack<Shape1, Shape2>& pack, MT_Vector3& v) -{ - if (!a.m_cbox.overlaps(pack.m_b_cbox)) - { - return false; - } - - if (a.m_type == DT_BBoxTree::LEAF) - { - return intersect(pack, a.m_index, v); - } - else - { - DT_BBoxTree a_ltree, a_rtree; - pack.m_a.m_nodes[a.m_index].makeChildren(pack.m_a.m_added, a_ltree, a_rtree); - return intersect(a_ltree, pack, v) || intersect(a_rtree, pack, v); - } -} - -template <typename Shape1, typename Shape2> -bool intersect(const DT_BBoxTree& a, const DT_BBoxTree& b, const DT_DuoPack<Shape1, Shape2>& pack, MT_Vector3& v) -{ - if (!intersect(a.m_cbox, b.m_cbox, pack)) - { - return false; - } - - if (a.m_type == DT_BBoxTree::LEAF && b.m_type == DT_BBoxTree::LEAF) - { - return intersect(pack, a.m_index, b.m_index, v); - } - else if (a.m_type == DT_BBoxTree::LEAF || - (b.m_type != DT_BBoxTree::LEAF && a.m_cbox.size() < b.m_cbox.size())) - { - DT_BBoxTree b_ltree, b_rtree; - pack.m_b.m_nodes[b.m_index].makeChildren(pack.m_b.m_added, b_ltree, b_rtree); - - return intersect(a, b_ltree, pack, v) || intersect(a, b_rtree, pack, v); - } - else - { - DT_BBoxTree a_ltree, a_rtree; - pack.m_a.m_nodes[a.m_index].makeChildren(pack.m_a.m_added, a_ltree, a_rtree); - return intersect(a_ltree, b, pack, v) || intersect(a_rtree, b, pack, v); - } -} - -template <typename Shape1, typename Shape2> -bool common_point(const DT_BBoxTree& a, const DT_Pack<Shape1, Shape2>& pack, - MT_Vector3& v, MT_Point3& pa, MT_Point3& pb) -{ - if (!a.m_cbox.overlaps(pack.m_b_cbox)) - { - return false; - } - - if (a.m_type == DT_BBoxTree::LEAF) - { - return common_point(pack, a.m_index, v, pa, pb); - } - else - { - DT_BBoxTree a_ltree, a_rtree; - pack.m_a.m_nodes[a.m_index].makeChildren(pack.m_a.m_added, a_ltree, a_rtree); - return common_point(a_ltree, pack, v, pa, pb) || - common_point(a_rtree, pack, v, pa ,pb); - } -} - -template <typename Shape1, typename Shape2> -bool common_point(const DT_BBoxTree& a, const DT_BBoxTree& b, const DT_DuoPack<Shape1, Shape2>& pack, - MT_Vector3& v, MT_Point3& pa, MT_Point3& pb) -{ - if (!intersect(a.m_cbox, b.m_cbox, pack)) - { - return false; - } - - if (a.m_type == DT_BBoxTree::LEAF && b.m_type == DT_BBoxTree::LEAF) - { - return common_point(pack, a.m_index, b.m_index, v, pa, pb); - } - else if (a.m_type == DT_BBoxTree::LEAF || - (b.m_type != DT_BBoxTree::LEAF && a.m_cbox.size() < b.m_cbox.size())) - { - DT_BBoxTree b_ltree, b_rtree; - pack.m_b.m_nodes[b.m_index].makeChildren(pack.m_b.m_added, b_ltree, b_rtree); - return common_point(a, b_ltree, pack, v, pa, pb) || - common_point(a, b_rtree, pack, v, pa, pb); - } - else - { - DT_BBoxTree a_ltree, a_rtree; - pack.m_a.m_nodes[a.m_index].makeChildren(pack.m_a.m_added, a_ltree, a_rtree); - return common_point(a_ltree, b, pack, v, pa, pb) || - common_point(a_rtree, b, pack, v, pa ,pb); - } -} - - -template <typename Shape1, typename Shape2> -bool penetration_depth(const DT_BBoxTree& a, const DT_HybridPack<Shape1, Shape2>& pack, - MT_Vector3& v, MT_Point3& pa, MT_Point3& pb, MT_Scalar& max_pen_len) -{ - if (!a.m_cbox.overlaps(pack.m_b_cbox)) - { - return false; - } - - if (a.m_type == DT_BBoxTree::LEAF) - { - if (penetration_depth(pack, a.m_index, v, pa, pb)) - { - max_pen_len = pa.distance2(pb); - return true; - } - else - { - return false; - } - } - else - { - DT_BBoxTree a_ltree, a_rtree; - pack.m_a.m_nodes[a.m_index].makeChildren(pack.m_a.m_added, a_ltree, a_rtree); - if (penetration_depth(a_ltree, pack, v, pa, pb, max_pen_len)) - { - MT_Vector3 rv; - MT_Point3 rpa, rpb; - MT_Scalar rmax_pen_len; - if (penetration_depth(a_rtree, pack, rv, rpa, rpb, rmax_pen_len) && - (max_pen_len < rmax_pen_len)) - { - max_pen_len = rmax_pen_len; - v = rv; - pa = rpa; - pb = rpb; - } - return true; - } - else - { - return penetration_depth(a_rtree, pack, v, pa, pb, max_pen_len); - } - } -} - -template <typename Shape1, typename Shape2> -bool penetration_depth(const DT_BBoxTree& a, const DT_BBoxTree& b, const DT_DuoPack<Shape1, Shape2>& pack, - MT_Vector3& v, MT_Point3& pa, MT_Point3& pb, MT_Scalar& max_pen_len) -{ - if (!intersect(a.m_cbox, b.m_cbox, pack)) - { - return false; - } - - if (a.m_type == DT_BBoxTree::LEAF && b.m_type == DT_BBoxTree::LEAF) - { - if (penetration_depth(pack, a.m_index, b.m_index, v, pa, pb)) - { - max_pen_len = pa.distance2(pb); - return true; - } - else - { - return false; - } - } - else if (a.m_type == DT_BBoxTree::LEAF || - (b.m_type != DT_BBoxTree::LEAF && a.m_cbox.size() < b.m_cbox.size())) - { - DT_BBoxTree b_ltree, b_rtree; - pack.m_b.m_nodes[b.m_index].makeChildren(pack.m_b.m_added, b_ltree, b_rtree); - if (penetration_depth(a, b_ltree, pack, v, pa, pb, max_pen_len)) - { - MT_Point3 rpa, rpb; - MT_Scalar rmax_pen_len; - if (penetration_depth(a, b_rtree, pack, v, rpa, rpb, rmax_pen_len) && - (max_pen_len < rmax_pen_len)) - { - max_pen_len = rmax_pen_len; - pa = rpa; - pb = rpb; - } - return true; - } - else - { - return penetration_depth(a, b_rtree, pack, v, pa, pb, max_pen_len); - } - } - else - { - DT_BBoxTree a_ltree, a_rtree; - pack.m_a.m_nodes[a.m_index].makeChildren(pack.m_a.m_added, a_ltree, a_rtree); - if (penetration_depth(a_ltree, b, pack, v, pa, pb, max_pen_len)) - { - MT_Point3 rpa, rpb; - MT_Scalar rmax_pen_len; - if (penetration_depth(a_rtree, b, pack, v, rpa, rpb, rmax_pen_len) && - (max_pen_len < rmax_pen_len)) - { - max_pen_len = rmax_pen_len; - pa = rpa; - pb = rpb; - } - return true; - } - else - { - return penetration_depth(a_rtree, b, pack, v, pa, pb, max_pen_len); - } - } -} - - -// Returns a lower bound for the distance for quick rejection in closest_points -inline MT_Scalar distance2(const DT_CBox& a, const MT_Transform& a2w, - const DT_CBox& b, const MT_Transform& b2w) -{ - MT_Vector3 v = b2w(b.getCenter()) - a2w(a.getCenter()); - MT_Scalar dist2 = v.length2(); - if (dist2 > MT_Scalar(0.0)) - { - MT_Vector3 w = b2w(b.support(-v * b2w.getBasis())) - a2w(a.support(v * a2w.getBasis())); - MT_Scalar delta = v.dot(w); - return delta > MT_Scalar(0.0) ? delta * delta / dist2 : MT_Scalar(0.0); - } - return MT_Scalar(0.0); -} - - -template <typename Shape1, typename Shape2> -MT_Scalar closest_points(const DT_BBoxTree& a, const DT_Pack<Shape1, Shape2>& pack, - MT_Scalar max_dist2, MT_Point3& pa, MT_Point3& pb) -{ - if (a.m_type == DT_BBoxTree::LEAF) - { - return closest_points(pack, a.m_index, max_dist2, pa, pb); - } - else - { - DT_BBoxTree a_ltree, a_rtree; - pack.m_a.m_nodes[a.m_index].makeChildren(pack.m_a.m_added, a_ltree, a_rtree); - MT_Scalar ldist2 = distance2(a_ltree.m_cbox, pack.m_a.m_xform, pack.m_b_cbox, pack.m_a.m_xform); - MT_Scalar rdist2 = distance2(a_rtree.m_cbox, pack.m_a.m_xform, pack.m_b_cbox, pack.m_a.m_xform); - if (ldist2 < rdist2) - { - MT_Scalar dist2 = ldist2 < max_dist2 ? closest_points(a_ltree, pack, max_dist2, pa, pb) : MT_INFINITY; - GEN_set_min(max_dist2, dist2); - return rdist2 < max_dist2 ? GEN_min(dist2, closest_points(a_rtree, pack, max_dist2, pa, pb)) : dist2; - } - else - { - MT_Scalar dist2 = rdist2 < max_dist2 ? closest_points(a_rtree, pack, max_dist2, pa, pb) : MT_INFINITY; - GEN_set_min(max_dist2, dist2); - return ldist2 < max_dist2 ? GEN_min(dist2, closest_points(a_ltree, pack, max_dist2, pa, pb)) : dist2; - } - } -} - - -template <typename Shape1, typename Shape2> -MT_Scalar closest_points(const DT_BBoxTree& a, const DT_BBoxTree& b, const DT_DuoPack<Shape1, Shape2>& pack, - MT_Scalar max_dist2, MT_Point3& pa, MT_Point3& pb) -{ - if (a.m_type == DT_BBoxTree::LEAF && b.m_type == DT_BBoxTree::LEAF) - { - return closest_points(pack, a.m_index, b.m_index, max_dist2, pa, pb); - } - else if (a.m_type == DT_BBoxTree::LEAF || - (b.m_type != DT_BBoxTree::LEAF && a.m_cbox.size() < b.m_cbox.size())) - { - DT_BBoxTree b_ltree, b_rtree; - pack.m_b.m_nodes[b.m_index].makeChildren(pack.m_b.m_added, b_ltree, b_rtree); - MT_Scalar ldist2 = distance2(a.m_cbox, pack.m_a.m_xform, b_ltree.m_cbox, pack.m_b.m_xform); - MT_Scalar rdist2 = distance2(a.m_cbox, pack.m_a.m_xform, b_rtree.m_cbox, pack.m_b.m_xform); - if (ldist2 < rdist2) - { - MT_Scalar dist2 = ldist2 < max_dist2 ? closest_points(a, b_ltree, pack, max_dist2, pa, pb): MT_INFINITY;; - GEN_set_min(max_dist2, dist2); - return rdist2 < max_dist2 ? GEN_min(dist2, closest_points(a, b_rtree, pack, max_dist2, pa, pb)) : dist2; - } - else - { - MT_Scalar dist2 = rdist2 < max_dist2 ? closest_points(a, b_rtree, pack, max_dist2, pa, pb) : MT_INFINITY;; - GEN_set_min(max_dist2, dist2); - return ldist2 < max_dist2 ? GEN_min(dist2, closest_points(a, b_ltree, pack, max_dist2, pa, pb)) : dist2; - } - } - else - { - DT_BBoxTree a_ltree, a_rtree; - pack.m_a.m_nodes[a.m_index].makeChildren(pack.m_a.m_added, a_ltree, a_rtree); - MT_Scalar ldist2 = distance2(a_ltree.m_cbox, pack.m_a.m_xform, b.m_cbox, pack.m_b.m_xform); - MT_Scalar rdist2 = distance2(a_rtree.m_cbox, pack.m_a.m_xform, b.m_cbox, pack.m_b.m_xform); - if (ldist2 < rdist2) - { - MT_Scalar dist2 = ldist2 < max_dist2 ? closest_points(a_ltree, b, pack, max_dist2, pa, pb) : MT_INFINITY;; - GEN_set_min(max_dist2, dist2); - return rdist2 < max_dist2 ? GEN_min(dist2,closest_points(a_rtree, b, pack, max_dist2, pa, pb)) : dist2; - } - else - { - MT_Scalar dist2 = rdist2 < max_dist2 ? closest_points(a_rtree, b, pack, max_dist2, pa, pb) : MT_INFINITY; - GEN_set_min(max_dist2, dist2); - return ldist2 < max_dist2 ? GEN_min(dist2, closest_points(a_ltree, b, pack, max_dist2, pa, pb)) : dist2; - } - } -} - -#endif - diff --git a/extern/solid/src/complex/DT_CBox.h b/extern/solid/src/complex/DT_CBox.h deleted file mode 100644 index 7fc7c5df4db..00000000000 --- a/extern/solid/src/complex/DT_CBox.h +++ /dev/null @@ -1,134 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_CBOX_H -#define DT_CBOX_H - -#include "MT_BBox.h" - -struct DT_CBox { - DT_CBox() {} - DT_CBox(const MT_Point3& center, const MT_Vector3& extent) - : m_center(center), - m_extent(extent) - {} - - explicit DT_CBox(const MT_BBox& bbox) { set(bbox); } - - const MT_Point3& getCenter() const { return m_center; } - const MT_Vector3& getExtent() const { return m_extent; } - - void set(const MT_BBox& bbox) - { - m_center = bbox.getCenter(); - m_extent = bbox.getExtent(); - } - - MT_BBox get() const - { - return MT_BBox(m_center - m_extent, m_center + m_extent); - } - - MT_Scalar size() const - { - return GEN_max(GEN_max(m_extent[0], m_extent[1]), m_extent[2]); - } - - - DT_CBox& operator+=(const DT_CBox& box) - { - m_center += box.getCenter(); - m_extent += box.getExtent(); - return *this; - } - - int longestAxis() const { return m_extent.closestAxis(); } - - DT_CBox hull(const DT_CBox& b) const - { - return DT_CBox(this->get().hull(b.get())); - } - - bool overlaps(const DT_CBox& b) const - { - return MT_abs(m_center[0] - b.m_center[0]) <= m_extent[0] + b.m_extent[0] && - MT_abs(m_center[1] - b.m_center[1]) <= m_extent[1] + b.m_extent[1] && - MT_abs(m_center[2] - b.m_center[2]) <= m_extent[2] + b.m_extent[2]; - } - - bool overlapsLineSegment(const MT_Point3& p, const MT_Point3& q) const - { - MT_Vector3 r = q - p; - MT_Vector3 r_abs = r.absolute(); - - if (!overlaps(DT_CBox(p + r * MT_Scalar(0.5), r_abs * MT_Scalar(0.5)))) - { - return false; - } - - MT_Vector3 s = p - m_center; - - if (MT_abs(r[2] * s[1] - r[1] * s[2]) > r_abs[2] * m_extent[1] + r_abs[1] * m_extent[2]) - { - return false; - } - - if (MT_abs(r[0] * s[2] - r[2] * s[0]) > r_abs[0] * m_extent[2] + r_abs[2] * m_extent[0]) - { - return false; - } - - if (MT_abs(r[1] * s[0] - r[0] * s[1]) > r_abs[1] * m_extent[0] + r_abs[0] * m_extent[1]) - { - return false; - } - - return true; - } - - MT_Point3 support(const MT_Vector3& v) const - { - return m_center + MT_Vector3(v[0] < MT_Scalar(0.0) ? -m_extent[0] : m_extent[0], - v[1] < MT_Scalar(0.0) ? -m_extent[1] : m_extent[1], - v[2] < MT_Scalar(0.0) ? -m_extent[2] : m_extent[2]); - - } - -private: - MT_Point3 m_center; - MT_Vector3 m_extent; -}; - -inline DT_CBox operator+(const DT_CBox& b1, const DT_CBox& b2) -{ - return DT_CBox(b1.getCenter() + b2.getCenter(), - b1.getExtent() + b2.getExtent()); -} - -inline DT_CBox operator-(const DT_CBox& b1, const DT_CBox& b2) -{ - return DT_CBox(b1.getCenter() - b2.getCenter(), - b1.getExtent() + b2.getExtent()); -} - -#endif diff --git a/extern/solid/src/complex/DT_Complex.cpp b/extern/solid/src/complex/DT_Complex.cpp deleted file mode 100644 index 023383a8427..00000000000 --- a/extern/solid/src/complex/DT_Complex.cpp +++ /dev/null @@ -1,327 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#include <new> -#include <fstream> - -#include "DT_Complex.h" -#include "DT_Minkowski.h" -#include "DT_Sphere.h" -#include "DT_Transform.h" - -DT_Complex::DT_Complex(const DT_VertexBase *base) - : m_base(base), - m_count(0), - m_leaves(0), - m_nodes(0) -{ - assert(base); - base->addComplex(this); -} - - -DT_Complex::~DT_Complex() -{ - DT_Index i; - for (i = 0; i != m_count; ++i) - { - delete m_leaves[i]; - } - delete [] m_leaves; - delete [] m_nodes; - - m_base->removeComplex(this); - if (m_base->isOwner()) - { - delete m_base; - } -} - -void DT_Complex::finish(DT_Count n, const DT_Convex *p[]) -{ - m_count = n; - - - assert(n >= 1); - - m_leaves = new const DT_Convex *[n]; - assert(m_leaves); - - DT_CBox *boxes = new DT_CBox[n]; - DT_Index *indices = new DT_Index[n]; - assert(boxes); - - DT_Index i; - for (i = 0; i != n; ++i) - { - m_leaves[i] = p[i]; - boxes[i].set(p[i]->bbox()); - indices[i] = i; - } - - m_cbox = boxes[0]; - for (i = 1; i != n; ++i) - { - m_cbox = m_cbox.hull(boxes[i]); - } - - if (n == 1) - { - m_nodes = 0; - m_type = DT_BBoxTree::LEAF; - } - else - { - m_nodes = new DT_BBoxNode[n - 1]; - assert(m_nodes); - - int num_nodes = 0; - new(&m_nodes[num_nodes++]) DT_BBoxNode(0, n, num_nodes, m_nodes, boxes, indices, m_cbox); - - assert(num_nodes == n - 1); - - m_type = DT_BBoxTree::INTERNAL; - } - - delete [] boxes; -} - - -MT_BBox DT_Complex::bbox(const MT_Transform& t, MT_Scalar margin) const -{ - MT_Matrix3x3 abs_b = t.getBasis().absolute(); - MT_Point3 center = t(m_cbox.getCenter()); - MT_Vector3 extent(margin + abs_b[0].dot(m_cbox.getExtent()), - margin + abs_b[1].dot(m_cbox.getExtent()), - margin + abs_b[2].dot(m_cbox.getExtent())); - - return MT_BBox(center - extent, center + extent); -} - -inline DT_CBox computeCBox(const DT_Convex *p) -{ - return DT_CBox(p->bbox()); -} - -inline DT_CBox computeCBox(MT_Scalar margin, const MT_Transform& xform) -{ - const MT_Matrix3x3& basis = xform.getBasis(); - return DT_CBox(MT_Point3(MT_Scalar(0.0), MT_Scalar(0.0), MT_Scalar(0.0)), - MT_Vector3(basis[0].length() * margin, - basis[1].length() * margin, - basis[2].length() * margin)); -} - -void DT_Complex::refit() -{ - DT_RootData<const DT_Convex *> rd(m_nodes, m_leaves); - DT_Index i = m_count - 1; - while (i--) - { - ::refit(m_nodes[i], rd); - } - m_cbox = m_type == DT_BBoxTree::LEAF ? computeCBox(m_leaves[0]) : m_nodes[0].hull(); -} - -inline bool ray_cast(const DT_RootData<const DT_Convex *>& rd, DT_Index index, const MT_Point3& source, const MT_Point3& target, - MT_Scalar& lambda, MT_Vector3& normal) -{ - return rd.m_leaves[index]->ray_cast(source, target, lambda, normal); -} - -bool DT_Complex::ray_cast(const MT_Point3& source, const MT_Point3& target, - MT_Scalar& lambda, MT_Vector3& normal) const -{ - DT_RootData<const DT_Convex *> rd(m_nodes, m_leaves); - - return ::ray_cast(DT_BBoxTree(m_cbox, 0, m_type), rd, source, target, lambda, normal); -} - -inline bool intersect(const DT_Pack<const DT_Convex *, MT_Scalar>& pack, DT_Index a_index, MT_Vector3& v) -{ - DT_Transform ta = DT_Transform(pack.m_a.m_xform, *pack.m_a.m_leaves[a_index]); - MT_Scalar a_margin = pack.m_a.m_plus; - return ::intersect((a_margin > MT_Scalar(0.0) ? - static_cast<const DT_Convex&>(DT_Minkowski(ta, DT_Sphere(a_margin))) : - static_cast<const DT_Convex&>(ta)), - pack.m_b, v); -} - -bool intersect(const DT_Complex& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Convex& b, MT_Vector3& v) -{ - DT_Pack<const DT_Convex *, MT_Scalar> pack(DT_ObjectData<const DT_Convex *, MT_Scalar>(a.m_nodes, a.m_leaves, a2w, a_margin), b); - - return intersect(DT_BBoxTree(a.m_cbox + pack.m_a.m_added, 0, a.m_type), pack, v); -} - -inline bool intersect(const DT_DuoPack<const DT_Convex *, MT_Scalar>& pack, DT_Index a_index, DT_Index b_index, MT_Vector3& v) -{ - DT_Transform ta = DT_Transform(pack.m_a.m_xform, *pack.m_a.m_leaves[a_index]); - MT_Scalar a_margin = pack.m_a.m_plus; - DT_Transform tb = DT_Transform(pack.m_b.m_xform, *pack.m_b.m_leaves[b_index]); - MT_Scalar b_margin = pack.m_b.m_plus; - return ::intersect((a_margin > MT_Scalar(0.0) ? - static_cast<const DT_Convex&>(DT_Minkowski(ta, DT_Sphere(a_margin))) : - static_cast<const DT_Convex&>(ta)), - (b_margin > MT_Scalar(0.0) ? - static_cast<const DT_Convex&>(DT_Minkowski(tb, DT_Sphere(b_margin))) : - static_cast<const DT_Convex&>(tb)), - v); -} - -bool intersect(const DT_Complex& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Complex& b, const MT_Transform& b2w, MT_Scalar b_margin, MT_Vector3& v) -{ - DT_DuoPack<const DT_Convex *, MT_Scalar> pack(DT_ObjectData<const DT_Convex *, MT_Scalar>(a.m_nodes, a.m_leaves, a2w, a_margin), - DT_ObjectData<const DT_Convex *, MT_Scalar>(b.m_nodes, b.m_leaves, b2w, b_margin)); - - - return intersect(DT_BBoxTree(a.m_cbox + pack.m_a.m_added, 0, a.m_type), - DT_BBoxTree(b.m_cbox + pack.m_b.m_added, 0, b.m_type), pack, v); -} - -inline bool common_point(const DT_Pack<const DT_Convex *, MT_Scalar>& pack, DT_Index a_index, MT_Vector3& v, MT_Point3& pa, MT_Point3& pb) -{ - DT_Transform ta = DT_Transform(pack.m_a.m_xform, *pack.m_a.m_leaves[a_index]); - MT_Scalar a_margin = pack.m_a.m_plus; - return ::common_point((a_margin > MT_Scalar(0.0) ? - static_cast<const DT_Convex&>(DT_Minkowski(ta, DT_Sphere(a_margin))) : - static_cast<const DT_Convex&>(ta)), - pack.m_b, v, pa, pb); -} - -bool common_point(const DT_Complex& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Convex& b, MT_Vector3& v, MT_Point3& pa, MT_Point3& pb) -{ - DT_Pack<const DT_Convex *, MT_Scalar> pack(DT_ObjectData<const DT_Convex *, MT_Scalar>(a.m_nodes, a.m_leaves, a2w, a_margin), b); - - return common_point(DT_BBoxTree(a.m_cbox + pack.m_a.m_added, 0, a.m_type), pack, v, pb, pa); -} - -inline bool common_point(const DT_DuoPack<const DT_Convex *, MT_Scalar>& pack, DT_Index a_index, DT_Index b_index, MT_Vector3& v, MT_Point3& pa, MT_Point3& pb) -{ - DT_Transform ta = DT_Transform(pack.m_a.m_xform, *pack.m_a.m_leaves[a_index]); - MT_Scalar a_margin = pack.m_a.m_plus; - DT_Transform tb = DT_Transform(pack.m_b.m_xform, *pack.m_b.m_leaves[b_index]); - MT_Scalar b_margin = pack.m_b.m_plus; - return ::common_point((a_margin > MT_Scalar(0.0) ? - static_cast<const DT_Convex&>(DT_Minkowski(ta, DT_Sphere(a_margin))) : - static_cast<const DT_Convex&>(ta)), - (b_margin > MT_Scalar(0.0) ? - static_cast<const DT_Convex&>(DT_Minkowski(tb, DT_Sphere(b_margin))) : - static_cast<const DT_Convex&>(tb)), - v, pa, pb); -} - -bool common_point(const DT_Complex& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Complex& b, const MT_Transform& b2w, MT_Scalar b_margin, - MT_Vector3& v, MT_Point3& pa, MT_Point3& pb) -{ - DT_DuoPack<const DT_Convex *, MT_Scalar> pack(DT_ObjectData<const DT_Convex *, MT_Scalar>(a.m_nodes, a.m_leaves, a2w, a_margin), - DT_ObjectData<const DT_Convex *, MT_Scalar>(b.m_nodes, b.m_leaves, b2w, b_margin)); - - return common_point(DT_BBoxTree(a.m_cbox + pack.m_a.m_added, 0, a.m_type), - DT_BBoxTree(b.m_cbox + pack.m_b.m_added, 0, b.m_type), pack, v, pa, pb); -} - -inline bool penetration_depth(const DT_HybridPack<const DT_Convex *, MT_Scalar>& pack, DT_Index a_index, MT_Vector3& v, MT_Point3& pa, MT_Point3& pb) -{ - DT_Transform ta = DT_Transform(pack.m_a.m_xform, *pack.m_a.m_leaves[a_index]); - return ::hybrid_penetration_depth(ta, pack.m_a.m_plus, pack.m_b, pack.m_margin, v, pa, pb); -} - -bool penetration_depth(const DT_Complex& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Convex& b, MT_Scalar b_margin, MT_Vector3& v, MT_Point3& pa, MT_Point3& pb) -{ - DT_HybridPack<const DT_Convex *, MT_Scalar> pack(DT_ObjectData<const DT_Convex *, MT_Scalar>(a.m_nodes, a.m_leaves, a2w, a_margin), b, b_margin); - - MT_Scalar max_pen_len = MT_Scalar(0.0); - return penetration_depth(DT_BBoxTree(a.m_cbox + pack.m_a.m_added, 0, a.m_type), pack, v, pa, pb, max_pen_len); -} - -inline bool penetration_depth(const DT_DuoPack<const DT_Convex *, MT_Scalar>& pack, DT_Index a_index, DT_Index b_index, MT_Vector3& v, MT_Point3& pa, MT_Point3& pb) -{ - DT_Transform ta = DT_Transform(pack.m_a.m_xform, *pack.m_a.m_leaves[a_index]); - DT_Transform tb = DT_Transform(pack.m_b.m_xform, *pack.m_b.m_leaves[b_index]); - return ::hybrid_penetration_depth(ta, pack.m_a.m_plus, tb, pack.m_a.m_plus, v, pa, pb); -} - -bool penetration_depth(const DT_Complex& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Complex& b, const MT_Transform& b2w, MT_Scalar b_margin, - MT_Vector3& v, MT_Point3& pa, MT_Point3& pb) -{ - DT_DuoPack<const DT_Convex *, MT_Scalar> pack(DT_ObjectData<const DT_Convex *, MT_Scalar>(a.m_nodes, a.m_leaves, a2w, a_margin), - DT_ObjectData<const DT_Convex *, MT_Scalar>(b.m_nodes, b.m_leaves, b2w, b_margin)); - - MT_Scalar max_pen_len = MT_Scalar(0.0); - return penetration_depth(DT_BBoxTree(a.m_cbox + pack.m_a.m_added, 0, a.m_type), - DT_BBoxTree(b.m_cbox + pack.m_b.m_added, 0, b.m_type), pack, v, pa, pb, max_pen_len); -} - - - -inline MT_Scalar closest_points(const DT_Pack<const DT_Convex *, MT_Scalar>& pack, DT_Index a_index, MT_Scalar max_dist2, MT_Point3& pa, MT_Point3& pb) -{ - DT_Transform ta = DT_Transform(pack.m_a.m_xform, *pack.m_a.m_leaves[a_index]); - MT_Scalar a_margin = pack.m_a.m_plus; - return ::closest_points((a_margin > MT_Scalar(0.0) ? - static_cast<const DT_Convex&>(DT_Minkowski(ta, DT_Sphere(a_margin))) : - static_cast<const DT_Convex&>(ta)), - pack.m_b, max_dist2, pa, pb); -} - -MT_Scalar closest_points(const DT_Complex& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Convex& b, MT_Point3& pa, MT_Point3& pb) -{ - DT_Pack<const DT_Convex *, MT_Scalar> pack(DT_ObjectData<const DT_Convex *, MT_Scalar>(a.m_nodes, a.m_leaves, a2w, a_margin), b); - - return closest_points(DT_BBoxTree(a.m_cbox + pack.m_a.m_added, 0, a.m_type), pack, MT_INFINITY, pa, pb); -} - -inline MT_Scalar closest_points(const DT_DuoPack<const DT_Convex *, MT_Scalar>& pack, DT_Index a_index, DT_Index b_index, MT_Scalar max_dist2, MT_Point3& pa, MT_Point3& pb) -{ - DT_Transform ta = DT_Transform(pack.m_a.m_xform, *pack.m_a.m_leaves[a_index]); - MT_Scalar a_margin = pack.m_a.m_plus; - DT_Transform tb = DT_Transform(pack.m_b.m_xform, *pack.m_b.m_leaves[b_index]); - MT_Scalar b_margin = pack.m_b.m_plus; - return ::closest_points((a_margin > MT_Scalar(0.0) ? - static_cast<const DT_Convex&>(DT_Minkowski(ta, DT_Sphere(a_margin))) : - static_cast<const DT_Convex&>(ta)), - (b_margin > MT_Scalar(0.0) ? - static_cast<const DT_Convex&>(DT_Minkowski(tb, DT_Sphere(b_margin))) : - static_cast<const DT_Convex&>(tb)), max_dist2, pa, pb); -} - -MT_Scalar closest_points(const DT_Complex& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Complex& b, const MT_Transform& b2w, MT_Scalar b_margin, - MT_Point3& pa, MT_Point3& pb) -{ - DT_DuoPack<const DT_Convex *, MT_Scalar> pack(DT_ObjectData<const DT_Convex *, MT_Scalar>(a.m_nodes, a.m_leaves, a2w, a_margin), - DT_ObjectData<const DT_Convex *, MT_Scalar>(b.m_nodes, b.m_leaves, b2w, b_margin)); - - return closest_points(DT_BBoxTree(a.m_cbox + pack.m_a.m_added, 0, a.m_type), - DT_BBoxTree(b.m_cbox + pack.m_b.m_added, 0, b.m_type), pack, MT_INFINITY, pa, pb); -} - - diff --git a/extern/solid/src/complex/DT_Complex.h b/extern/solid/src/complex/DT_Complex.h deleted file mode 100644 index ae08a05d4c9..00000000000 --- a/extern/solid/src/complex/DT_Complex.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_COMPLEX_H -#define DT_COMPLEX_H - -#include <algorithm> - -#include "MT_Transform.h" -#include "DT_VertexBase.h" - -#include "DT_Shape.h" -#include "DT_CBox.h" -#include "DT_BBoxTree.h" - -class DT_Convex; - -class DT_Complex : public DT_Shape { -public: - DT_Complex(const DT_VertexBase *base); - virtual ~DT_Complex(); - - void finish(DT_Count n, const DT_Convex *p[]); - - virtual DT_ShapeType getType() const { return COMPLEX; } - - virtual MT_BBox bbox(const MT_Transform& t, MT_Scalar margin) const; - - virtual bool ray_cast(const MT_Point3& source, const MT_Point3& target, - MT_Scalar& lambda, MT_Vector3& normal) const; - - void refit(); - - - friend bool intersect(const DT_Complex& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Convex& b, MT_Vector3& v); - - friend bool intersect(const DT_Complex& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Complex& b, const MT_Transform& b2w, MT_Scalar b_margin, - MT_Vector3& v); - - friend bool common_point(const DT_Complex& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Convex& b, MT_Vector3& v, MT_Point3& pa, MT_Point3& pb); - - friend bool common_point(const DT_Complex& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Complex& b, const MT_Transform& b2w, MT_Scalar b_margin, - MT_Vector3& v, MT_Point3& pa, MT_Point3& pb); - - friend bool penetration_depth(const DT_Complex& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Convex& b, MT_Scalar b_margin, MT_Vector3& v, MT_Point3& pa, MT_Point3& pb); - - friend bool penetration_depth(const DT_Complex& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Complex& b, const MT_Transform& b2w, MT_Scalar b_margin, - MT_Vector3& v, MT_Point3& pa, MT_Point3& pb); - - friend MT_Scalar closest_points(const DT_Complex& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Convex& b, MT_Point3& pa, MT_Point3& pb); - - friend MT_Scalar closest_points(const DT_Complex& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Complex& b, const MT_Transform& b2w, MT_Scalar b_margin, - MT_Point3& pa, MT_Point3& pb); - - const DT_VertexBase *m_base; - DT_Count m_count; - const DT_Convex **m_leaves; - DT_BBoxNode *m_nodes; - DT_CBox m_cbox; - DT_BBoxTree::NodeType m_type; -}; - -#endif - - - diff --git a/extern/solid/src/complex/Makefile b/extern/solid/src/complex/Makefile deleted file mode 100644 index e8df4df51a3..00000000000 --- a/extern/solid/src/complex/Makefile +++ /dev/null @@ -1,42 +0,0 @@ -# -# $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 ***** -# -# - -LIBNAME = solid_complex -DIR = $(OCGDIR)/extern/$(LIBNAME) - -CCFLAGS += $(LEVEL_1_CPP_WARNINGS) - -CPPFLAGS += -I../../include -I$(NAN_QHULL)/include -CPPFLAGS += -I../convex -CPPFLAGS += -DQHULL -DUSE_DOUBLES - -include nan_compile.mk - - diff --git a/extern/solid/src/convex/DT_Accuracy.cpp b/extern/solid/src/convex/DT_Accuracy.cpp deleted file mode 100644 index 113275b0dbd..00000000000 --- a/extern/solid/src/convex/DT_Accuracy.cpp +++ /dev/null @@ -1,30 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#include "DT_Accuracy.h" - -static const MT_Scalar rel_error = MT_Scalar(1.0e-3); - -MT_Scalar DT_Accuracy::rel_error2 = rel_error * rel_error; -MT_Scalar DT_Accuracy::depth_tolerance = MT_Scalar(1.0) + MT_Scalar(2.0) * rel_error; -MT_Scalar DT_Accuracy::tol_error = MT_EPSILON; diff --git a/extern/solid/src/convex/DT_Accuracy.h b/extern/solid/src/convex/DT_Accuracy.h deleted file mode 100644 index 9759a6fd4c5..00000000000 --- a/extern/solid/src/convex/DT_Accuracy.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_ACCURACY_H -#define DT_ACCURACY_H - -#include "MT_Scalar.h" - -class DT_Accuracy { -public: - static MT_Scalar rel_error2; // squared relative error in the computed distance - static MT_Scalar depth_tolerance; // terminate EPA if upper_bound <= depth_tolerance * dist2 - static MT_Scalar tol_error; // error tolerance if the distance is almost zero - - static void setAccuracy(MT_Scalar rel_error) - { - rel_error2 = rel_error * rel_error; - depth_tolerance = MT_Scalar(1.0) + MT_Scalar(2.0) * rel_error; - } - - static void setTolerance(MT_Scalar epsilon) - { - tol_error = epsilon; - } -}; - -#endif diff --git a/extern/solid/src/convex/DT_Array.h b/extern/solid/src/convex/DT_Array.h deleted file mode 100644 index 1694f884e53..00000000000 --- a/extern/solid/src/convex/DT_Array.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_ARRAY_H -#define DT_ARRAY_H - -#if defined (__sgi) -#include <assert.h> -#else -#include <cassert> -#endif - -template <typename Data, typename Size = size_t> -class DT_Array { -public: - DT_Array() - : m_count(0), - m_data(0) - {} - - explicit DT_Array(Size count) - : m_count(count), - m_data(new Data[count]) - { - assert(m_data); - } - - DT_Array(Size count, const Data *data) - : m_count(count), - m_data(new Data[count]) - { - assert(m_data); - std::copy(&data[0], &data[count], m_data); - } - - ~DT_Array() - { - delete [] m_data; - } - - const Data& operator[](int i) const { return m_data[i]; } - Data& operator[](int i) { return m_data[i]; } - - Size size() const { return m_count; } - -private: - DT_Array(const DT_Array&); - DT_Array& operator=(const DT_Array&); - - Size m_count; - Data *m_data; -}; - -#endif - diff --git a/extern/solid/src/convex/DT_Box.cpp b/extern/solid/src/convex/DT_Box.cpp deleted file mode 100644 index 0b46f566fe8..00000000000 --- a/extern/solid/src/convex/DT_Box.cpp +++ /dev/null @@ -1,112 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#include "DT_Box.h" - -MT_Scalar DT_Box::supportH(const MT_Vector3& v) const -{ - return v.absolute().dot(m_extent); -} - -MT_Point3 DT_Box::support(const MT_Vector3& v) const -{ - return MT_Point3(v[0] < MT_Scalar(0.0) ? -m_extent[0] : m_extent[0], - v[1] < MT_Scalar(0.0) ? -m_extent[1] : m_extent[1], - v[2] < MT_Scalar(0.0) ? -m_extent[2] : m_extent[2]); - -} - - -bool DT_Box::ray_cast(const MT_Point3& source, const MT_Point3& target, - MT_Scalar& param, MT_Vector3& normal) const -{ - T_Outcode source_bits = outcode(source); - T_Outcode target_bits = outcode(target); - - if ((source_bits & target_bits) == 0x0) - // None of the side planes separate the ray from the box. - { - MT_Scalar lambda_enter = MT_Scalar(0.0); - MT_Scalar lambda_exit = param; - MT_Vector3 r = target - source; - T_Outcode normal_bit = 0x0; // Indicates the axis that is returned as normal. - T_Outcode bit = 0x01; - int i; - for (i = 0; i != 3; ++i) - { - if (source_bits & bit) - // Point of intersection is entering - { - MT_Scalar lambda = (-source[i] - m_extent[i]) / r[i]; - if (lambda_enter < lambda) - { - lambda_enter = lambda; - normal_bit = bit; - } - } - else if (target_bits & bit) - // Point of intersection is exiting - { - MT_Scalar lambda = (-source[i] - m_extent[i]) / r[i]; - GEN_set_min(lambda_exit, lambda); - } - bit <<=1; - if (source_bits & bit) - // Point of intersection is entering - { - MT_Scalar lambda = (-source[i] + m_extent[i]) / r[i]; - if (lambda_enter < lambda) - { - lambda_enter = lambda; - normal_bit = bit; - } - } - else if (target_bits & bit) - // Point of intersection is exiting - { - MT_Scalar lambda = (-source[i] + m_extent[i]) / r[i]; - GEN_set_min(lambda_exit, lambda); - } - bit <<=1; - } - if (lambda_enter <= lambda_exit) - // The ray intersects the box - { - param = lambda_enter; - normal.setValue(normal_bit == 0x01 ? -MT_Scalar(1.0) : - normal_bit == 0x02 ? MT_Scalar(1.0) : - MT_Scalar(0.0), - normal_bit == 0x04 ? -MT_Scalar(1.0) : - normal_bit == 0x08 ? MT_Scalar(1.0) : - MT_Scalar(0.0), - normal_bit == 0x10 ? -MT_Scalar(1.0) : - normal_bit == 0x20 ? MT_Scalar(1.0) : - MT_Scalar(0.0)); - return true; - } - } - - return false; -} - - diff --git a/extern/solid/src/convex/DT_Box.h b/extern/solid/src/convex/DT_Box.h deleted file mode 100644 index ace9634b5e3..00000000000 --- a/extern/solid/src/convex/DT_Box.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_BOX_H -#define DT_BOX_H - -#include "DT_Convex.h" - -class DT_Box : public DT_Convex { -public: - DT_Box(MT_Scalar x, MT_Scalar y, MT_Scalar z) : - m_extent(x, y, z) - {} - - DT_Box(const MT_Vector3& e) : - m_extent(e) - {} - - virtual MT_Scalar supportH(const MT_Vector3& v) const; - virtual MT_Point3 support(const MT_Vector3& v) const; - virtual bool ray_cast(const MT_Point3& source, const MT_Point3& target, - MT_Scalar& param, MT_Vector3& normal) const; - - const MT_Vector3& getExtent() const { return m_extent; } - -protected: - typedef unsigned int T_Outcode; - - T_Outcode outcode(const MT_Point3& p) const - { - return (p[0] < -m_extent[0] ? 0x01 : 0x0) | - (p[0] > m_extent[0] ? 0x02 : 0x0) | - (p[1] < -m_extent[1] ? 0x04 : 0x0) | - (p[1] > m_extent[1] ? 0x08 : 0x0) | - (p[2] < -m_extent[2] ? 0x10 : 0x0) | - (p[2] > m_extent[2] ? 0x20 : 0x0); - } - - MT_Vector3 m_extent; -}; - -#endif diff --git a/extern/solid/src/convex/DT_Cone.cpp b/extern/solid/src/convex/DT_Cone.cpp deleted file mode 100644 index 1dd6a7ddbbe..00000000000 --- a/extern/solid/src/convex/DT_Cone.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#include "DT_Cone.h" - -MT_Point3 DT_Cone::support(const MT_Vector3& v) const -{ - MT_Scalar v_len = v.length(); - - if (v[1] > v_len * sinAngle) - { - return MT_Point3(MT_Scalar(0.0), halfHeight, MT_Scalar(0.0)); - } - else - { - MT_Scalar s = MT_sqrt(v[0] * v[0] + v[2] * v[2]); - if (s != MT_Scalar(0.0)) - { - MT_Scalar d = bottomRadius / s; - return MT_Point3(v[0] * d, -halfHeight, v[2] * d); - } - else - { - return MT_Point3(bottomRadius, -halfHeight, MT_Scalar(0.0)); - } - } -} - diff --git a/extern/solid/src/convex/DT_Cone.h b/extern/solid/src/convex/DT_Cone.h deleted file mode 100644 index 85e416877dd..00000000000 --- a/extern/solid/src/convex/DT_Cone.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_CONE_H -#define DT_CONE_H - -#include "DT_Convex.h" - -class DT_Cone : public DT_Convex { -public: - DT_Cone(MT_Scalar r, MT_Scalar h) : - bottomRadius(r), - halfHeight(h * MT_Scalar(0.5)), - sinAngle(r / MT_sqrt(r * r + h * h)) - {} - - virtual MT_Point3 support(const MT_Vector3& v) const; - -protected: - MT_Scalar bottomRadius; - MT_Scalar halfHeight; - MT_Scalar sinAngle; -}; - -#endif diff --git a/extern/solid/src/convex/DT_Convex.cpp b/extern/solid/src/convex/DT_Convex.cpp deleted file mode 100644 index 3be47f6ed02..00000000000 --- a/extern/solid/src/convex/DT_Convex.cpp +++ /dev/null @@ -1,426 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#include "DT_Convex.h" -#include "GEN_MinMax.h" - -//#define DEBUG -#define SAFE_EXIT - -#include "DT_GJK.h" -#include "DT_PenDepth.h" - -#include <algorithm> -#include <new> - -#include "MT_BBox.h" -#include "DT_Sphere.h" -#include "DT_Minkowski.h" - -#include "DT_Accuracy.h" - -#ifdef STATISTICS -int num_iterations = 0; -int num_irregularities = 0; -#endif - -MT_BBox DT_Convex::bbox() const -{ - MT_Point3 min(-supportH(MT_Vector3(-1.0f, 0.0f, 0.0f)), - -supportH(MT_Vector3(0.0f, -1.0f, 0.0f)), - -supportH(MT_Vector3(0.0f, 0.0f, -1.0f))); - MT_Point3 max( supportH(MT_Vector3(1.0f, 0.0f, 0.0f)), - supportH(MT_Vector3(0.0f, 1.0f, 0.0f)), - supportH(MT_Vector3(0.0f, 0.0f, 1.0f))); - - - return MT_BBox(min, max); -} - -MT_BBox DT_Convex::bbox(const MT_Matrix3x3& basis) const -{ - MT_Point3 min(-supportH(-basis[0]), - -supportH(-basis[1]), - -supportH(-basis[2])); - MT_Point3 max( supportH( basis[0]), - supportH( basis[1]), - supportH( basis[2])); - return MT_BBox(min, max); -} - -MT_BBox DT_Convex::bbox(const MT_Transform& t, MT_Scalar margin) const -{ - MT_Point3 min(t.getOrigin()[0] - supportH(-t.getBasis()[0]) - margin, - t.getOrigin()[1] - supportH(-t.getBasis()[1]) - margin, - t.getOrigin()[2] - supportH(-t.getBasis()[2]) - margin); - MT_Point3 max(t.getOrigin()[0] + supportH( t.getBasis()[0]) + margin, - t.getOrigin()[1] + supportH( t.getBasis()[1]) + margin, - t.getOrigin()[2] + supportH( t.getBasis()[2]) + margin); - return MT_BBox(min, max); -} - -bool DT_Convex::ray_cast(const MT_Point3& source, const MT_Point3& target, MT_Scalar& lambda, MT_Vector3& normal) const -{ - // Still working on this one... - return false; -} - -bool intersect(const DT_Convex& a, const DT_Convex& b, MT_Vector3& v) -{ - DT_GJK gjk; - -#ifdef STATISTICS - num_iterations = 0; -#endif - MT_Scalar dist2 = MT_INFINITY; - - do - { - MT_Point3 p = a.support(-v); - MT_Point3 q = b.support(v); - MT_Vector3 w = p - q; - - if (v.dot(w) > MT_Scalar(0.0)) - { - return false; - } - - gjk.addVertex(w); - -#ifdef STATISTICS - ++num_iterations; -#endif - if (!gjk.closest(v)) - { -#ifdef STATISTICS - ++num_irregularities; -#endif - return false; - } - -#ifdef SAFE_EXIT - MT_Scalar prev_dist2 = dist2; -#endif - - dist2 = v.length2(); - -#ifdef SAFE_EXIT - if (prev_dist2 - dist2 <= MT_EPSILON * prev_dist2) - { - return false; - } -#endif - } - while (!gjk.fullSimplex() && dist2 > DT_Accuracy::tol_error * gjk.maxVertex()); - - v.setValue(MT_Scalar(0.0), MT_Scalar(0.0), MT_Scalar(0.0)); - - return true; -} - - - - -bool common_point(const DT_Convex& a, const DT_Convex& b, - MT_Vector3& v, MT_Point3& pa, MT_Point3& pb) -{ - DT_GJK gjk; - -#ifdef STATISTICS - num_iterations = 0; -#endif - - MT_Scalar dist2 = MT_INFINITY; - - do - { - MT_Point3 p = a.support(-v); - MT_Point3 q = b.support(v); - MT_Vector3 w = p - q; - - if (v.dot(w) > MT_Scalar(0.0)) - { - return false; - } - - gjk.addVertex(w, p, q); - -#ifdef STATISTICS - ++num_iterations; -#endif - if (!gjk.closest(v)) - { -#ifdef STATISTICS - ++num_irregularities; -#endif - return false; - } - -#ifdef SAFE_EXIT - MT_Scalar prev_dist2 = dist2; -#endif - - dist2 = v.length2(); - -#ifdef SAFE_EXIT - if (prev_dist2 - dist2 <= MT_EPSILON * prev_dist2) - { - return false; - } -#endif - } - while (!gjk.fullSimplex() && dist2 > DT_Accuracy::tol_error * gjk.maxVertex()); - - gjk.compute_points(pa, pb); - - v.setValue(MT_Scalar(0.0), MT_Scalar(0.0), MT_Scalar(0.0)); - - return true; -} - - - - - - - -bool penetration_depth(const DT_Convex& a, const DT_Convex& b, - MT_Vector3& v, MT_Point3& pa, MT_Point3& pb) -{ - DT_GJK gjk; - -#ifdef STATISTICS - num_iterations = 0; -#endif - - MT_Scalar dist2 = MT_INFINITY; - - do - { - MT_Point3 p = a.support(-v); - MT_Point3 q = b.support(v); - MT_Vector3 w = p - q; - - if (v.dot(w) > MT_Scalar(0.0)) - { - return false; - } - - gjk.addVertex(w, p, q); - -#ifdef STATISTICS - ++num_iterations; -#endif - if (!gjk.closest(v)) - { -#ifdef STATISTICS - ++num_irregularities; -#endif - return false; - } - -#ifdef SAFE_EXIT - MT_Scalar prev_dist2 = dist2; -#endif - - dist2 = v.length2(); - -#ifdef SAFE_EXIT - if (prev_dist2 - dist2 <= MT_EPSILON * prev_dist2) - { - return false; - } -#endif - } - while (!gjk.fullSimplex() && dist2 > DT_Accuracy::tol_error * gjk.maxVertex()); - - - return penDepth(gjk, a, b, v, pa, pb); - -} - -bool hybrid_penetration_depth(const DT_Convex& a, MT_Scalar a_margin, - const DT_Convex& b, MT_Scalar b_margin, - MT_Vector3& v, MT_Point3& pa, MT_Point3& pb) -{ - MT_Scalar margin = a_margin + b_margin; - if (margin > MT_Scalar(0.0)) - { - MT_Scalar margin2 = margin * margin; - - DT_GJK gjk; - -#ifdef STATISTICS - num_iterations = 0; -#endif - MT_Scalar dist2 = MT_INFINITY; - - do - { - MT_Point3 p = a.support(-v); - MT_Point3 q = b.support(v); - - MT_Vector3 w = p - q; - - MT_Scalar delta = v.dot(w); - - if (delta > MT_Scalar(0.0) && delta * delta > dist2 * margin2) - { - return false; - } - - if (gjk.inSimplex(w) || dist2 - delta <= dist2 * DT_Accuracy::rel_error2) - { - gjk.compute_points(pa, pb); - MT_Scalar s = MT_sqrt(dist2); - assert(s > MT_Scalar(0.0)); - pa -= v * (a_margin / s); - pb += v * (b_margin / s); - return true; - } - - gjk.addVertex(w, p, q); - -#ifdef STATISTICS - ++num_iterations; -#endif - if (!gjk.closest(v)) - { -#ifdef STATISTICS - ++num_irregularities; -#endif - gjk.compute_points(pa, pb); - MT_Scalar s = MT_sqrt(dist2); - assert(s > MT_Scalar(0.0)); - pa -= v * (a_margin / s); - pb += v * (b_margin / s); - return true; - } - -#ifdef SAFE_EXIT - MT_Scalar prev_dist2 = dist2; -#endif - - dist2 = v.length2(); - -#ifdef SAFE_EXIT - if (prev_dist2 - dist2 <= MT_EPSILON * prev_dist2) - { - gjk.backup_closest(v); - dist2 = v.length2(); - gjk.compute_points(pa, pb); - MT_Scalar s = MT_sqrt(dist2); - assert(s > MT_Scalar(0.0)); - pa -= v * (a_margin / s); - pb += v * (b_margin / s); - return true; - } -#endif - } - while (!gjk.fullSimplex() && dist2 > DT_Accuracy::tol_error * gjk.maxVertex()); - - } - // Second GJK phase. compute points on the boundary of the offset object - - return penetration_depth((a_margin > MT_Scalar(0.0) ? - static_cast<const DT_Convex&>(DT_Minkowski(a, DT_Sphere(a_margin))) : - static_cast<const DT_Convex&>(a)), - (b_margin > MT_Scalar(0.0) ? - static_cast<const DT_Convex&>(DT_Minkowski(b, DT_Sphere(b_margin))) : - static_cast<const DT_Convex&>(b)), v, pa, pb); -} - - -MT_Scalar closest_points(const DT_Convex& a, const DT_Convex& b, MT_Scalar max_dist2, - MT_Point3& pa, MT_Point3& pb) -{ - MT_Vector3 v(MT_Scalar(0.0), MT_Scalar(0.0), MT_Scalar(0.0)); - - DT_GJK gjk; - -#ifdef STATISTICS - num_iterations = 0; -#endif - - MT_Scalar dist2 = MT_INFINITY; - - do - { - MT_Point3 p = a.support(-v); - MT_Point3 q = b.support(v); - MT_Vector3 w = p - q; - - MT_Scalar delta = v.dot(w); - if (delta > MT_Scalar(0.0) && delta * delta > dist2 * max_dist2) - { - return MT_INFINITY; - } - - if (gjk.inSimplex(w) || dist2 - delta <= dist2 * DT_Accuracy::rel_error2) - { - break; - } - - gjk.addVertex(w, p, q); - -#ifdef STATISTICS - ++num_iterations; - if (num_iterations > 1000) - { - std::cout << "v: " << v << " w: " << w << std::endl; - } -#endif - if (!gjk.closest(v)) - { -#ifdef STATISTICS - ++num_irregularities; -#endif - break; - } - -#ifdef SAFE_EXIT - MT_Scalar prev_dist2 = dist2; -#endif - - dist2 = v.length2(); - -#ifdef SAFE_EXIT - if (prev_dist2 - dist2 <= MT_EPSILON * prev_dist2) - { - gjk.backup_closest(v); - dist2 = v.length2(); - break; - } -#endif - } - while (!gjk.fullSimplex() && dist2 > DT_Accuracy::tol_error * gjk.maxVertex()); - - assert(!gjk.emptySimplex()); - - if (dist2 <= max_dist2) - { - gjk.compute_points(pa, pb); - } - - return dist2; -} diff --git a/extern/solid/src/convex/DT_Convex.h b/extern/solid/src/convex/DT_Convex.h deleted file mode 100644 index dd620ac8b98..00000000000 --- a/extern/solid/src/convex/DT_Convex.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_CONVEX_H -#define DT_CONVEX_H - -#include "DT_Shape.h" - -#include "MT_Vector3.h" -#include "MT_Point3.h" - -#include "MT_Matrix3x3.h" -#include "MT_Transform.h" - -class DT_Convex : public DT_Shape { -public: - virtual ~DT_Convex() {} - virtual DT_ShapeType getType() const { return CONVEX; } - - virtual MT_Scalar supportH(const MT_Vector3& v) const { return v.dot(support(v)); } - virtual MT_Point3 support(const MT_Vector3& v) const = 0; - virtual MT_BBox bbox() const; - virtual MT_BBox bbox(const MT_Matrix3x3& basis) const; - virtual MT_BBox bbox(const MT_Transform& t, MT_Scalar margin = MT_Scalar(0.0)) const; - virtual bool ray_cast(const MT_Point3& source, const MT_Point3& target, MT_Scalar& param, MT_Vector3& normal) const; - -protected: - DT_Convex() {} -}; - - -bool intersect(const DT_Convex& a, const DT_Convex& b, MT_Vector3& v); - -bool common_point(const DT_Convex& a, const DT_Convex& b, MT_Vector3& v, MT_Point3& pa, MT_Point3& pb); - -MT_Scalar closest_points(const DT_Convex&, const DT_Convex&, MT_Scalar max_dist2, MT_Point3& pa, MT_Point3& pb); - -bool penetration_depth(const DT_Convex& a, const DT_Convex& b, MT_Vector3& v, MT_Point3& pa, MT_Point3& pb); - -bool hybrid_penetration_depth(const DT_Convex& a, MT_Scalar a_margin, - const DT_Convex& b, MT_Scalar b_margin, - MT_Vector3& v, MT_Point3& pa, MT_Point3& pb); - -#endif diff --git a/extern/solid/src/convex/DT_Cylinder.cpp b/extern/solid/src/convex/DT_Cylinder.cpp deleted file mode 100644 index cff5ebcefb1..00000000000 --- a/extern/solid/src/convex/DT_Cylinder.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#include "DT_Cylinder.h" - -MT_Point3 DT_Cylinder::support(const MT_Vector3& v) const -{ - MT_Scalar s = MT_sqrt(v[0] * v[0] + v[2] * v[2]); - if (s != MT_Scalar(0.0)) - { - MT_Scalar d = radius / s; - return MT_Point3(v[0] * d, v[1] < 0.0 ? -halfHeight : halfHeight, v[2] * d); - } - else - { - return MT_Point3(radius, v[1] < 0.0 ? -halfHeight : halfHeight, MT_Scalar(0.0)); - } -} - diff --git a/extern/solid/src/convex/DT_Cylinder.h b/extern/solid/src/convex/DT_Cylinder.h deleted file mode 100644 index 2a0c07fd579..00000000000 --- a/extern/solid/src/convex/DT_Cylinder.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_CYLINDER_H -#define DT_CYLINDER_H - -#include "DT_Convex.h" - -class DT_Cylinder : public DT_Convex { -public: - DT_Cylinder(MT_Scalar r, MT_Scalar h) : - radius(r), - halfHeight(h * MT_Scalar(0.5)) {} - - virtual MT_Point3 support(const MT_Vector3& v) const; - -protected: - MT_Scalar radius; - MT_Scalar halfHeight; -}; - -#endif diff --git a/extern/solid/src/convex/DT_Facet.cpp b/extern/solid/src/convex/DT_Facet.cpp deleted file mode 100644 index 87ae5c3e0be..00000000000 --- a/extern/solid/src/convex/DT_Facet.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#include "DT_Facet.h" - -bool DT_Facet::link(int edge0, DT_Facet *facet, int edge1) -{ - m_adjFacets[edge0] = facet; - m_adjEdges[edge0] = edge1; - facet->m_adjFacets[edge1] = this; - facet->m_adjEdges[edge1] = edge0; - - bool b = m_indices[edge0] == facet->m_indices[incMod3(edge1)] && - m_indices[incMod3(edge0)] == facet->m_indices[edge1]; - return b; -} - -bool DT_Facet::computeClosest(const MT_Vector3 *verts) -{ - const MT_Vector3& p0 = verts[m_indices[0]]; - - MT_Vector3 v1 = verts[m_indices[1]] - p0; - MT_Vector3 v2 = verts[m_indices[2]] - p0; - MT_Scalar v1dv1 = v1.length2(); - MT_Scalar v1dv2 = v1.dot(v2); - MT_Scalar v2dv2 = v2.length2(); - MT_Scalar p0dv1 = p0.dot(v1); - MT_Scalar p0dv2 = p0.dot(v2); - - m_det = v1dv1 * v2dv2 - v1dv2 * v1dv2; // non-negative - m_lambda1 = p0dv2 * v1dv2 - p0dv1 * v2dv2; - m_lambda2 = p0dv1 * v1dv2 - p0dv2 * v1dv1; - - if (m_det > MT_Scalar(0.0)) { - m_closest = p0 + (m_lambda1 * v1 + m_lambda2 * v2) / m_det; - m_dist2 = m_closest.length2(); - return true; - } - - return false; -} - -void DT_Facet::silhouette(int index, const MT_Vector3& w, - DT_EdgeBuffer& edgeBuffer) -{ - if (!m_obsolete) { - if (m_closest.dot(w) < m_dist2) { - edgeBuffer.push_back(DT_Edge(this, index)); - } - else { - m_obsolete = true; // Facet is visible - int next = incMod3(index); - m_adjFacets[next]->silhouette(m_adjEdges[next], w, edgeBuffer); - next = incMod3(next); - m_adjFacets[next]->silhouette(m_adjEdges[next], w, edgeBuffer); - } - } -} - - diff --git a/extern/solid/src/convex/DT_Facet.h b/extern/solid/src/convex/DT_Facet.h deleted file mode 100644 index 873706346b8..00000000000 --- a/extern/solid/src/convex/DT_Facet.h +++ /dev/null @@ -1,134 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_FACET_H -#define DT_FACET_H - -#include <string.h> -#include <vector> - -#include <MT_Vector3.h> -#include <MT_Point3.h> - -class DT_Facet; - - -class DT_Edge { -public: - DT_Edge() {} - DT_Edge(DT_Facet *facet, int index) : - m_facet(facet), - m_index(index) {} - - DT_Facet *getFacet() const { return m_facet; } - int getIndex() const { return m_index; } - - int getSource() const; - int getTarget() const; - -private: - DT_Facet *m_facet; - int m_index; -}; - -typedef std::vector<DT_Edge> DT_EdgeBuffer; - - -class DT_Facet { -public: - DT_Facet() {} - DT_Facet(int i0, int i1, int i2) - : m_obsolete(false) - { - m_indices[0] = i0; - m_indices[1] = i1; - m_indices[2] = i2; - } - - int operator[](int i) const { return m_indices[i]; } - - bool link(int edge0, DT_Facet *facet, int edge1); - - - bool isObsolete() const { return m_obsolete; } - - - bool computeClosest(const MT_Vector3 *verts); - - const MT_Vector3& getClosest() const { return m_closest; } - - bool isClosestInternal() const - { - return m_lambda1 >= MT_Scalar(0.0) && - m_lambda2 >= MT_Scalar(0.0) && - m_lambda1 + m_lambda2 <= m_det; - } - - MT_Scalar getDist2() const { return m_dist2; } - - MT_Point3 getClosestPoint(const MT_Point3 *points) const - { - const MT_Point3& p0 = points[m_indices[0]]; - - return p0 + (m_lambda1 * (points[m_indices[1]] - p0) + - m_lambda2 * (points[m_indices[2]] - p0)) / m_det; - } - - void silhouette(const MT_Vector3& w, DT_EdgeBuffer& edgeBuffer) - { - edgeBuffer.clear(); - m_obsolete = true; - m_adjFacets[0]->silhouette(m_adjEdges[0], w, edgeBuffer); - m_adjFacets[1]->silhouette(m_adjEdges[1], w, edgeBuffer); - m_adjFacets[2]->silhouette(m_adjEdges[2], w, edgeBuffer); - } - -private: - void silhouette(int index, const MT_Vector3& w, DT_EdgeBuffer& edgeBuffer); - - int m_indices[3]; - bool m_obsolete; - DT_Facet *m_adjFacets[3]; - int m_adjEdges[3]; - - MT_Scalar m_det; - MT_Scalar m_lambda1; - MT_Scalar m_lambda2; - MT_Vector3 m_closest; - MT_Scalar m_dist2; -}; - - -inline int incMod3(int i) { return ++i % 3; } - -inline int DT_Edge::getSource() const -{ - return (*m_facet)[m_index]; -} - -inline int DT_Edge::getTarget() const -{ - return (*m_facet)[incMod3(m_index)]; -} - -#endif diff --git a/extern/solid/src/convex/DT_GJK.h b/extern/solid/src/convex/DT_GJK.h deleted file mode 100644 index d8f44acf85e..00000000000 --- a/extern/solid/src/convex/DT_GJK.h +++ /dev/null @@ -1,438 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_GJK_H -#define DT_GJK_H - -//#define USE_BACKUP_PROCEDURE -#define JOHNSON_ROBUST -#define FAST_CLOSEST - -#include "MT_Point3.h" -#include "MT_Vector3.h" -#include "GEN_MinMax.h" -#include "DT_Accuracy.h" - - -class DT_GJK { -private: - typedef unsigned int T_Bits; - inline static bool subseteq(T_Bits a, T_Bits b) { return (a & b) == a; } - inline static bool contains(T_Bits a, T_Bits b) { return (a & b) != 0x0; } - -public: - DT_GJK() : - m_bits(0x0), - m_all_bits(0x0) - {} - - bool emptySimplex() const { return m_bits == 0x0; } - bool fullSimplex() const { return m_bits == 0xf; } - - void reset() - { - m_bits = 0x0; - m_all_bits = 0x0; - } - - bool inSimplex(const MT_Vector3& w) - { - int i; - T_Bits bit; - for (i = 0, bit = 0x1; i < 4; ++i, bit <<= 1) - { - if (contains(m_all_bits, bit) && w == m_y[i]) - { - return true; - } - } - return false; - } - - void addVertex(const MT_Vector3& w) - { - assert(!fullSimplex()); - m_last = 0; - m_last_bit = 0x1; - while (contains(m_bits, m_last_bit)) - { - ++m_last; - m_last_bit <<= 1; - } - m_y[m_last] = w; - m_ylen2[m_last] = w.length2(); - m_all_bits = m_bits | m_last_bit; - - update_cache(); - compute_det(); - } - - void addVertex(const MT_Vector3& w, const MT_Point3& p, const MT_Point3& q) - { - addVertex(w); - m_p[m_last] = p; - m_q[m_last] = q; - } - - int getSimplex(MT_Point3 *pBuf, MT_Point3 *qBuf, MT_Vector3 *yBuf) const - { - int num_verts = 0; - int i; - T_Bits bit; - for (i = 0, bit = 0x1; i < 4; ++i, bit <<= 1) - { - if (contains(m_bits, bit)) - { - pBuf[num_verts] = m_p[i]; - qBuf[num_verts] = m_q[i]; - yBuf[num_verts] = m_y[i]; - -#ifdef DEBUG - std::cout << "Point " << i << " = " << m_y[i] << std::endl; -#endif - - ++num_verts; - } - } - return num_verts; - } - - void compute_points(MT_Point3& p1, MT_Point3& p2) - { - MT_Scalar sum = MT_Scalar(0.0); - p1.setValue(MT_Scalar(0.0), MT_Scalar(0.0), MT_Scalar(0.0)); - p2.setValue(MT_Scalar(0.0), MT_Scalar(0.0), MT_Scalar(0.0)); - int i; - T_Bits bit; - for (i = 0, bit = 0x1; i < 4; ++i, bit <<= 1) - { - if (contains(m_bits, bit)) - { - sum += m_det[m_bits][i]; - p1 += m_p[i] * m_det[m_bits][i]; - p2 += m_q[i] * m_det[m_bits][i]; - } - } - - assert(sum > MT_Scalar(0.0)); - MT_Scalar s = MT_Scalar(1.0) / sum; - p1 *= s; - p2 *= s; - } - - bool closest(MT_Vector3& v) - { -#ifdef FAST_CLOSEST - T_Bits s; - for (s = m_bits; s != 0x0; --s) - { - if (subseteq(s, m_bits) && valid(s | m_last_bit)) - { - m_bits = s | m_last_bit; - compute_vector(m_bits, v); - return true; - } - } - if (valid(m_last_bit)) - { - m_bits = m_last_bit; - m_maxlen2 = m_ylen2[m_last]; - v = m_y[m_last]; - return true; - } -#else - T_Bits s; - for (s = m_all_bits; s != 0x0; --s) - { - if (subseteq(s, m_all_bits) && valid(s)) - { - m_bits = s; - compute_vector(m_bits, v); - return true; - } - } -#endif - - // Original GJK calls the backup procedure at this point. -#ifdef USE_BACKUP_PROCEDURE - backup_closest(MT_Vector3& v); -#endif - return false; - } - - void backup_closest(MT_Vector3& v) - { - MT_Scalar min_dist2 = MT_INFINITY; - - T_Bits s; - for (s = m_all_bits; s != 0x0; --s) - { - if (subseteq(s, m_all_bits) && proper(s)) - { - MT_Vector3 u; - compute_vector(s, u); - MT_Scalar dist2 = u.length2(); - if (dist2 < min_dist2) - { - min_dist2 = dist2; - m_bits = s; - v = u; - } - } - } - } - - MT_Scalar maxVertex() { return m_maxlen2; } - - -private: - void update_cache(); - void compute_det(); - - bool valid(T_Bits s) - { - int i; - T_Bits bit; - for (i = 0, bit = 0x1; i < 4; ++i, bit <<= 1) - { - if (contains(m_all_bits, bit)) - { - if (contains(s, bit)) - { - if (m_det[s][i] <= MT_Scalar(0.0)) - { - return false; - } - } - else if (m_det[s | bit][i] > MT_Scalar(0.0)) - { - return false; - } - } - } - return true; - } - - bool proper(T_Bits s) - { - int i; - T_Bits bit; - for (i = 0, bit = 0x1; i < 4; ++i, bit <<= 1) - { - if (contains(s, bit) && m_det[s][i] <= MT_Scalar(0.0)) - { - return false; - } - } - return true; - } - - void compute_vector(T_Bits s, MT_Vector3& v) - { - m_maxlen2 = MT_Scalar(0.0); - MT_Scalar sum = MT_Scalar(0.0); - v .setValue(MT_Scalar(0.0), MT_Scalar(0.0), MT_Scalar(0.0)); - - int i; - T_Bits bit; - for (i = 0, bit = 0x1; i < 4; ++i, bit <<= 1) - { - if (contains(s, bit)) - { - sum += m_det[s][i]; - GEN_set_max(m_maxlen2, m_ylen2[i]); - v += m_y[i] * m_det[s][i]; - } - } - - assert(sum > MT_Scalar(0.0)); - - v /= sum; - } - -private: - MT_Scalar m_det[16][4]; // cached sub-determinants - MT_Vector3 m_edge[4][4]; - -#ifdef JOHNSON_ROBUST - MT_Scalar m_norm[4][4]; -#endif - - MT_Point3 m_p[4]; // support points of object A in local coordinates - MT_Point3 m_q[4]; // support points of object B in local coordinates - MT_Vector3 m_y[4]; // support points of A - B in world coordinates - MT_Scalar m_ylen2[4]; // Squared lengths support points y - - MT_Scalar m_maxlen2; // Maximum squared length to a vertex of the current - // simplex - T_Bits m_bits; // identifies current simplex - T_Bits m_last; // identifies last found support point - T_Bits m_last_bit; // m_last_bit == 0x1 << last - T_Bits m_all_bits; // m_all_bits == m_bits | m_last_bit -}; - - - - -inline void DT_GJK::update_cache() -{ - int i; - T_Bits bit; - for (i = 0, bit = 0x1; i < 4; ++i, bit <<= 1) - { - if (contains(m_bits, bit)) - { - m_edge[i][m_last] = m_y[i] - m_y[m_last]; - m_edge[m_last][i] = -m_edge[i][m_last]; - -#ifdef JOHNSON_ROBUST - m_norm[i][m_last] = m_norm[m_last][i] = m_edge[i][m_last].length2(); -#endif - - } - } -} - -#ifdef JOHNSON_ROBUST - -inline void DT_GJK::compute_det() -{ - m_det[m_last_bit][m_last] = 1; - - int i; - T_Bits si; - for (i = 0, si = 0x1; i < 4; ++i, si <<= 1) - { - if (contains(m_bits, si)) - { - T_Bits s2 = si | m_last_bit; - m_det[s2][i] = m_edge[m_last][i].dot(m_y[m_last]); - m_det[s2][m_last] = m_edge[i][m_last].dot(m_y[i]); - - int j; - T_Bits sj; - for (j = 0, sj = 0x1; j < i; ++j, sj <<= 1) - { - if (contains(m_bits, sj)) - { - int k; - T_Bits s3 = sj | s2; - - k = m_norm[i][j] < m_norm[m_last][j] ? i : m_last; - m_det[s3][j] = m_det[s2][i] * m_edge[k][j].dot(m_y[i]) + - m_det[s2][m_last] * m_edge[k][j].dot(m_y[m_last]); - k = m_norm[j][i] < m_norm[m_last][i] ? j : m_last; - m_det[s3][i] = m_det[sj|m_last_bit][j] * m_edge[k][i].dot(m_y[j]) + - m_det[sj|m_last_bit][m_last] * m_edge[k][i].dot(m_y[m_last]); - k = m_norm[i][m_last] < m_norm[j][m_last] ? i : j; - m_det[s3][m_last] = m_det[sj|si][j] * m_edge[k][m_last].dot(m_y[j]) + - m_det[sj|si][i] * m_edge[k][m_last].dot(m_y[i]); - } - } - } - } - - if (m_all_bits == 0xf) - { - int k; - - k = m_norm[1][0] < m_norm[2][0] ? (m_norm[1][0] < m_norm[3][0] ? 1 : 3) : (m_norm[2][0] < m_norm[3][0] ? 2 : 3); - - m_det[0xf][0] = m_det[0xe][1] * m_edge[k][0].dot(m_y[1]) + - m_det[0xe][2] * m_edge[k][0].dot(m_y[2]) + - m_det[0xe][3] * m_edge[k][0].dot(m_y[3]); - - k = m_norm[0][1] < m_norm[2][1] ? (m_norm[0][1] < m_norm[3][1] ? 0 : 3) : (m_norm[2][1] < m_norm[3][1] ? 2 : 3); - - m_det[0xf][1] = m_det[0xd][0] * m_edge[k][1].dot(m_y[0]) + - m_det[0xd][2] * m_edge[k][1].dot(m_y[2]) + - m_det[0xd][3] * m_edge[k][1].dot(m_y[3]); - - k = m_norm[0][2] < m_norm[1][2] ? (m_norm[0][2] < m_norm[3][2] ? 0 : 3) : (m_norm[1][2] < m_norm[3][2] ? 1 : 3); - - m_det[0xf][2] = m_det[0xb][0] * m_edge[k][2].dot(m_y[0]) + - m_det[0xb][1] * m_edge[k][2].dot(m_y[1]) + - m_det[0xb][3] * m_edge[k][2].dot(m_y[3]); - - k = m_norm[0][3] < m_norm[1][3] ? (m_norm[0][3] < m_norm[2][3] ? 0 : 2) : (m_norm[1][3] < m_norm[2][3] ? 1 : 2); - - m_det[0xf][3] = m_det[0x7][0] * m_edge[k][3].dot(m_y[0]) + - m_det[0x7][1] * m_edge[k][3].dot(m_y[1]) + - m_det[0x7][2] * m_edge[k][3].dot(m_y[2]); - } -} - -#else - -inline void DT_GJK::compute_det() -{ - m_det[m_last_bit][m_last] = 1; - - int i; - T_Bits si; - for (i = 0, si = 0x1; i < 4; ++i, si <<= 1) - { - if (contains(m_bits, si)) - { - T_Bits s2 = si | m_last_bit; - m_det[s2][i] = m_edge[m_last][i].dot(m_y[m_last]); - m_det[s2][m_last] = m_edge[i][m_last].dot(m_y[i]); - - int j; - T_Bits sj; - for (j = 0, sj = 0x1; j < i; ++j, sj <<= 1) - { - if (contains(m_bits, sj)) - { - T_Bits s3 = sj | s2; - m_det[s3][j] = m_det[s2][i] * m_edge[i][j].dot(m_y[i]) + - m_det[s2][m_last] * m_edge[i][j].dot(m_y[m_last]); - m_det[s3][i] = m_det[sj|m_last_bit][j] * m_edge[j][i].dot(m_y[j]) + - m_det[sj|m_last_bit][m_last] * m_edge[j][i].dot(m_y[m_last]); - m_det[s3][m_last] = m_det[sj|si][j] * m_edge[j][m_last].dot(m_y[j]) + - m_det[sj|si][i] * m_edge[j][m_last].dot(m_y[i]); - } - } - } - } - - if (m_all_bits == 0xf) - { - m_det[0xf][0] = m_det[0xe][1] * m_edge[1][0].dot(m_y[1]) + - m_det[0xe][2] * m_edge[1][0].dot(m_y[2]) + - m_det[0xe][3] * m_edge[1][0].dot(m_y[3]); - m_det[0xf][1] = m_det[0xd][0] * m_edge[0][1].dot(m_y[0]) + - m_det[0xd][2] * m_edge[0][1].dot(m_y[2]) + - m_det[0xd][3] * m_edge[0][1].dot(m_y[3]); - m_det[0xf][2] = m_det[0xb][0] * m_edge[0][2].dot(m_y[0]) + - m_det[0xb][1] * m_edge[0][2].dot(m_y[1]) + - m_det[0xb][3] * m_edge[0][2].dot(m_y[3]); - m_det[0xf][3] = m_det[0x7][0] * m_edge[0][3].dot(m_y[0]) + - m_det[0x7][1] * m_edge[0][3].dot(m_y[1]) + - m_det[0x7][2] * m_edge[0][3].dot(m_y[2]); - } -} - -#endif - -#endif diff --git a/extern/solid/src/convex/DT_Hull.h b/extern/solid/src/convex/DT_Hull.h deleted file mode 100644 index a5bf56ae59d..00000000000 --- a/extern/solid/src/convex/DT_Hull.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_HULL_H -#define DT_HULL_H - -#include "DT_Convex.h" - -class DT_Hull : public DT_Convex { -public: - DT_Hull(const DT_Convex& lchild, const DT_Convex& rchild) : - m_lchild(lchild), - m_rchild(rchild) - {} - - virtual MT_Scalar supportH(const MT_Vector3& v) const - { - return GEN_max(m_lchild.supportH(v), m_rchild.supportH(v)); - } - - virtual MT_Point3 support(const MT_Vector3& v) const - { - MT_Point3 lpnt = m_lchild.support(v); - MT_Point3 rpnt = m_rchild.support(v); - return v.dot(lpnt) > v.dot(rpnt) ? lpnt : rpnt; - } - -private: - const DT_Convex& m_lchild; - const DT_Convex& m_rchild; -}; - -#endif diff --git a/extern/solid/src/convex/DT_IndexArray.h b/extern/solid/src/convex/DT_IndexArray.h deleted file mode 100644 index 95551fa8483..00000000000 --- a/extern/solid/src/convex/DT_IndexArray.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_INDEXARRAY_H -#define DT_INDEXARRAY_H - -#include "SOLID_types.h" -#include "DT_Array.h" - -typedef DT_Array<DT_Index, DT_Count> DT_IndexArray; - -#endif - diff --git a/extern/solid/src/convex/DT_LineSegment.cpp b/extern/solid/src/convex/DT_LineSegment.cpp deleted file mode 100644 index 6c7ccf6b9b7..00000000000 --- a/extern/solid/src/convex/DT_LineSegment.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#include "DT_LineSegment.h" - -MT_Scalar DT_LineSegment::supportH(const MT_Vector3& v) const -{ - return GEN_max(v.dot(m_source), v.dot(m_target)); -} - -MT_Point3 DT_LineSegment::support(const MT_Vector3& v) const -{ - return v.dot(m_source) > v.dot(m_target) ? m_source : m_target; -} - - diff --git a/extern/solid/src/convex/DT_LineSegment.h b/extern/solid/src/convex/DT_LineSegment.h deleted file mode 100644 index 979ff8a18a9..00000000000 --- a/extern/solid/src/convex/DT_LineSegment.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_LINESEGMENT_H -#define DT_LINESEGMENT_H - -#include "DT_Convex.h" - -class DT_LineSegment : public DT_Convex { -public: - DT_LineSegment(const MT_Point3& source, const MT_Point3& target) : - m_source(source), - m_target(target) {} - - virtual MT_Scalar supportH(const MT_Vector3& v) const; - virtual MT_Point3 support(const MT_Vector3& v) const; - - const MT_Point3& getSource() const { return m_source; } - const MT_Point3& getTarget() const { return m_target; } - -private: - MT_Point3 m_source; - MT_Point3 m_target; -}; - -#endif - - - - - - diff --git a/extern/solid/src/convex/DT_Minkowski.h b/extern/solid/src/convex/DT_Minkowski.h deleted file mode 100644 index e90fed6a8e0..00000000000 --- a/extern/solid/src/convex/DT_Minkowski.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_MINKOWSKI_H -#define DT_MINKOWSKI_H - -#include "DT_Convex.h" - -class DT_Minkowski : public DT_Convex { -public: - DT_Minkowski(const DT_Convex& lchild, const DT_Convex& rchild) - : m_lchild(lchild), - m_rchild(rchild) - {} - - virtual MT_Scalar supportH(const MT_Vector3& v) const - { - return m_lchild.supportH(v) + m_rchild.supportH(v); - } - - virtual MT_Point3 support(const MT_Vector3& v) const - { - return m_lchild.support(v) + (MT_Vector3)m_rchild.support(v); - } - -private: - const DT_Convex& m_lchild; - const DT_Convex& m_rchild; -}; - -#endif diff --git a/extern/solid/src/convex/DT_PenDepth.cpp b/extern/solid/src/convex/DT_PenDepth.cpp deleted file mode 100644 index e1c5c9a3949..00000000000 --- a/extern/solid/src/convex/DT_PenDepth.cpp +++ /dev/null @@ -1,376 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#include "DT_PenDepth.h" - -#include "MT_Vector3.h" -#include "MT_Point3.h" -#include "MT_Quaternion.h" -#include "DT_Convex.h" -#include "DT_GJK.h" -#include "DT_Facet.h" - -//#define DEBUG - -const int MaxSupportPoints = 1000; -const int MaxFacets = 2000; - -static MT_Point3 pBuf[MaxSupportPoints]; -static MT_Point3 qBuf[MaxSupportPoints]; -static MT_Vector3 yBuf[MaxSupportPoints]; - -static DT_Facet facetBuf[MaxFacets]; -static int freeFacet = 0; -static DT_Facet *facetHeap[MaxFacets]; -static int num_facets; - -class DT_FacetComp { -public: - - bool operator()(const DT_Facet *face1, const DT_Facet *face2) - { - return face1->getDist2() > face2->getDist2(); - } - -} facetComp; - -inline DT_Facet *addFacet(int i0, int i1, int i2, - MT_Scalar lower2, MT_Scalar upper2) -{ - assert(i0 != i1 && i0 != i2 && i1 != i2); - if (freeFacet < MaxFacets) - { - DT_Facet *facet = new(&facetBuf[freeFacet++]) DT_Facet(i0, i1, i2); -#ifdef DEBUG - std::cout << "Facet " << i0 << ' ' << i1 << ' ' << i2; -#endif - if (facet->computeClosest(yBuf)) - { - if (facet->isClosestInternal() && - lower2 <= facet->getDist2() && facet->getDist2() <= upper2) - { - facetHeap[num_facets++] = facet; - std::push_heap(&facetHeap[0], &facetHeap[num_facets], facetComp); -#ifdef DEBUG - std::cout << " accepted" << std::endl; -#endif - } - else - { -#ifdef DEBUG - std::cout << " rejected, "; - if (!facet->isClosestInternal()) - { - std::cout << "closest point not internal"; - } - else if (lower2 > facet->getDist2()) - { - std::cout << "facet is closer than orignal facet"; - } - else - { - std::cout << "facet is further than upper bound"; - } - std::cout << std::endl; -#endif - } - - return facet; - } - } - - return 0; -} - -inline bool originInTetrahedron(const MT_Vector3& p1, const MT_Vector3& p2, - const MT_Vector3& p3, const MT_Vector3& p4) -{ - MT_Vector3 normal1 = (p2 - p1).cross(p3 - p1); - MT_Vector3 normal2 = (p3 - p2).cross(p4 - p2); - MT_Vector3 normal3 = (p4 - p3).cross(p1 - p3); - MT_Vector3 normal4 = (p1 - p4).cross(p2 - p4); - - return - normal1.dot(p1) > MT_Scalar(0.0) != normal1.dot(p4) > MT_Scalar(0.0) && - normal2.dot(p2) > MT_Scalar(0.0) != normal2.dot(p1) > MT_Scalar(0.0) && - normal3.dot(p3) > MT_Scalar(0.0) != normal3.dot(p2) > MT_Scalar(0.0) && - normal4.dot(p4) > MT_Scalar(0.0) != normal4.dot(p3) > MT_Scalar(0.0); -} - - -bool penDepth(const DT_GJK& gjk, const DT_Convex& a, const DT_Convex& b, - MT_Vector3& v, MT_Point3& pa, MT_Point3& pb) -{ - - int num_verts = gjk.getSimplex(pBuf, qBuf, yBuf); - - switch (num_verts) - { - case 1: - // Touching contact. Yes, we have a collision, - // but no penetration. - return false; - case 2: - { - // We have a line segment inside the Minkowski sum containing the - // origin. Blow it up by adding three additional support points. - - MT_Vector3 dir = (yBuf[1] - yBuf[0]).normalized(); - int axis = dir.furthestAxis(); - - static MT_Scalar sin_60 = MT_sqrt(MT_Scalar(3.0)) * MT_Scalar(0.5); - - MT_Quaternion rot(dir[0] * sin_60, dir[1] * sin_60, dir[2] * sin_60, MT_Scalar(0.5)); - MT_Matrix3x3 rot_mat(rot); - - MT_Vector3 aux1 = dir.cross(MT_Vector3(axis == 0, axis == 1, axis == 2)); - MT_Vector3 aux2 = rot_mat * aux1; - MT_Vector3 aux3 = rot_mat * aux2; - - pBuf[2] = a.support(aux1); - qBuf[2] = b.support(-aux1); - yBuf[2] = pBuf[2] - qBuf[2]; - - pBuf[3] = a.support(aux2); - qBuf[3] = b.support(-aux2); - yBuf[3] = pBuf[3] - qBuf[3]; - - pBuf[4] = a.support(aux3); - qBuf[4] = b.support(-aux3); - yBuf[4] = pBuf[4] - qBuf[4]; - - if (originInTetrahedron(yBuf[0], yBuf[2], yBuf[3], yBuf[4])) - { - pBuf[1] = pBuf[4]; - qBuf[1] = qBuf[4]; - yBuf[1] = yBuf[4]; - } - else if (originInTetrahedron(yBuf[1], yBuf[2], yBuf[3], yBuf[4])) - { - pBuf[0] = pBuf[4]; - qBuf[0] = qBuf[4]; - yBuf[0] = yBuf[4]; - } - else - { - // Origin not in initial polytope - return false; - } - - num_verts = 4; - - break; - } - case 3: - { - // We have a triangle inside the Minkowski sum containing - // the origin. First blow it up. - - MT_Vector3 v1 = yBuf[1] - yBuf[0]; - MT_Vector3 v2 = yBuf[2] - yBuf[0]; - MT_Vector3 vv = v1.cross(v2); - - pBuf[3] = a.support(vv); - qBuf[3] = b.support(-vv); - yBuf[3] = pBuf[3] - qBuf[3]; - pBuf[4] = a.support(-vv); - qBuf[4] = b.support(vv); - yBuf[4] = pBuf[4] - qBuf[4]; - - - if (originInTetrahedron(yBuf[0], yBuf[1], yBuf[2], yBuf[4])) - { - pBuf[3] = pBuf[4]; - qBuf[3] = qBuf[4]; - yBuf[3] = yBuf[4]; - } - else if (!originInTetrahedron(yBuf[0], yBuf[1], yBuf[2], yBuf[3])) - { - // Origin not in initial polytope - return false; - } - - num_verts = 4; - - break; - } - } - - // We have a tetrahedron inside the Minkowski sum containing - // the origin (if GJK did it's job right ;-) - - - if (!originInTetrahedron(yBuf[0], yBuf[1], yBuf[2], yBuf[3])) - { - // assert(false); - return false; - } - - num_facets = 0; - freeFacet = 0; - - DT_Facet *f0 = addFacet(0, 1, 2, MT_Scalar(0.0), MT_INFINITY); - DT_Facet *f1 = addFacet(0, 3, 1, MT_Scalar(0.0), MT_INFINITY); - DT_Facet *f2 = addFacet(0, 2, 3, MT_Scalar(0.0), MT_INFINITY); - DT_Facet *f3 = addFacet(1, 3, 2, MT_Scalar(0.0), MT_INFINITY); - - if (!f0 || f0->getDist2() == MT_Scalar(0.0) || - !f1 || f1->getDist2() == MT_Scalar(0.0) || - !f2 || f2->getDist2() == MT_Scalar(0.0) || - !f3 || f3->getDist2() == MT_Scalar(0.0)) - { - return false; - } - - f0->link(0, f1, 2); - f0->link(1, f3, 2); - f0->link(2, f2, 0); - f1->link(0, f2, 2); - f1->link(1, f3, 0); - f2->link(1, f3, 1); - - if (num_facets == 0) - { - return false; - } - - // at least one facet on the heap. - - DT_EdgeBuffer edgeBuffer(20); - - DT_Facet *facet = 0; - - MT_Scalar upper_bound2 = MT_INFINITY; - - do { - facet = facetHeap[0]; - std::pop_heap(&facetHeap[0], &facetHeap[num_facets], facetComp); - --num_facets; - - if (!facet->isObsolete()) - { - assert(facet->getDist2() > MT_Scalar(0.0)); - - if (num_verts == MaxSupportPoints) - { -#ifdef DEBUG - std::cout << "Ouch, no convergence!!!" << std::endl; -#endif - assert(false); - break; - } - - pBuf[num_verts] = a.support(facet->getClosest()); - qBuf[num_verts] = b.support(-facet->getClosest()); - yBuf[num_verts] = pBuf[num_verts] - qBuf[num_verts]; - - int index = num_verts++; - MT_Scalar far_dist2 = yBuf[index].dot(facet->getClosest()); - - // Make sure the support mapping is OK. - assert(far_dist2 > MT_Scalar(0.0)); - - GEN_set_min(upper_bound2, far_dist2 * far_dist2 / facet->getDist2()); - - if (upper_bound2 <= DT_Accuracy::depth_tolerance * facet->getDist2() -#define CHECK_NEW_SUPPORT -#ifdef CHECK_NEW_SUPPORT - || yBuf[index] == yBuf[(*facet)[0]] - || yBuf[index] == yBuf[(*facet)[1]] - || yBuf[index] == yBuf[(*facet)[2]] -#endif - ) - { - break; - } - - // Compute the silhouette cast by the new vertex - // Note that the new vertex is on the positive side - // of the current facet, so the current facet is will - // not be in the convex hull. Start local search - // from this facet. - - facet->silhouette(yBuf[index], edgeBuffer); - - if (edgeBuffer.empty()) - { - return false; - } - - DT_EdgeBuffer::const_iterator it = edgeBuffer.begin(); - DT_Facet *firstFacet = - addFacet((*it).getTarget(), (*it).getSource(), - index, facet->getDist2(), upper_bound2); - - if (!firstFacet) - { - break; - } - - firstFacet->link(0, (*it).getFacet(), (*it).getIndex()); - DT_Facet *lastFacet = firstFacet; - - ++it; - for (; it != edgeBuffer.end(); ++it) - { - DT_Facet *newFacet = - addFacet((*it).getTarget(), (*it).getSource(), - index, facet->getDist2(), upper_bound2); - - if (!newFacet) - { - break; - } - - if (!newFacet->link(0, (*it).getFacet(), (*it).getIndex())) - { - break; - } - - if (!newFacet->link(2, lastFacet, 1)) - { - break; - } - - lastFacet = newFacet; - } - if (it != edgeBuffer.end()) - { - break; - } - - firstFacet->link(2, lastFacet, 1); - } - } - while (num_facets > 0 && facetHeap[0]->getDist2() <= upper_bound2); - -#ifdef DEBUG - std::cout << "#facets left = " << num_facets << std::endl; -#endif - - v = facet->getClosest(); - pa = facet->getClosestPoint(pBuf); - pb = facet->getClosestPoint(qBuf); - return true; -} - diff --git a/extern/solid/src/convex/DT_PenDepth.h b/extern/solid/src/convex/DT_PenDepth.h deleted file mode 100644 index 97b3c6c0e0e..00000000000 --- a/extern/solid/src/convex/DT_PenDepth.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_PENDEPTH_H -#define DT_PENDEPTH_H - -#include "MT_Vector3.h" -#include "MT_Point3.h" - -class DT_GJK; -class DT_Convex; - -bool penDepth(const DT_GJK& gjk, const DT_Convex& a, const DT_Convex& b, - MT_Vector3& v, MT_Point3& pa, MT_Point3& pb); - -#endif diff --git a/extern/solid/src/convex/DT_Point.cpp b/extern/solid/src/convex/DT_Point.cpp deleted file mode 100644 index 770fe7775b7..00000000000 --- a/extern/solid/src/convex/DT_Point.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#include "DT_Point.h" - -MT_Scalar DT_Point::supportH(const MT_Vector3& v) const -{ - return v.dot(m_point); -} - -MT_Point3 DT_Point::support(const MT_Vector3& v) const -{ - return m_point; -} - - diff --git a/extern/solid/src/convex/DT_Point.h b/extern/solid/src/convex/DT_Point.h deleted file mode 100644 index b35d158ee53..00000000000 --- a/extern/solid/src/convex/DT_Point.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_POINT_H -#define DT_POINT_H - -#include "DT_Convex.h" - -class DT_Point : public DT_Convex { -public: - DT_Point(const MT_Point3& point) : m_point(point) {} - - virtual MT_Scalar supportH(const MT_Vector3& v) const; - virtual MT_Point3 support(const MT_Vector3& v) const; - -private: - MT_Point3 m_point; -}; - -#endif - - - - - - diff --git a/extern/solid/src/convex/DT_Polyhedron.cpp b/extern/solid/src/convex/DT_Polyhedron.cpp deleted file mode 100644 index f48ac6e4b6d..00000000000 --- a/extern/solid/src/convex/DT_Polyhedron.cpp +++ /dev/null @@ -1,415 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#include "DT_Polyhedron.h" - -#ifdef QHULL - -extern "C" { -#include <qhull/qhull_a.h> -} - -#include <vector> -#include <new> - -typedef std::vector<MT_Point3> T_VertexBuf; -typedef std::vector<DT_Index> T_IndexBuf; -typedef std::vector<T_IndexBuf> T_MultiIndexBuf; - -static char options[] = "qhull Qts i Tv"; - -#define DK_HIERARCHY - -T_IndexBuf *adjacency_graph(DT_Count count, const MT_Point3 *verts, const char *flags) -{ - int curlong, totlong, exitcode; - - facetT *facet; - vertexT *vertex; - vertexT **vertexp; - - std::vector<MT::Tuple3<coordT> > array; - T_IndexBuf index; - DT_Index i; - for (i = 0; i != count; ++i) - { - if (flags == 0 || flags[i]) - { - array.push_back(MT::Tuple3<coordT>(verts[i])); - index.push_back(i); - } - } - - qh_init_A(stdin, stdout, stderr, 0, NULL); - if ((exitcode = setjmp(qh errexit))) - { - exit(exitcode); - } - qh_initflags(options); - qh_init_B(array[0], array.size(), 3, False); - qh_qhull(); - qh_check_output(); - - T_IndexBuf *indexBuf = new T_IndexBuf[count]; - FORALLfacets - { - setT *vertices = qh_facet3vertex(facet); - - T_IndexBuf facetIndices; - - FOREACHvertex_(vertices) - { - facetIndices.push_back(index[qh_pointid(vertex->point)]); - } - int i, j; - for (i = 0, j = facetIndices.size()-1; i < (int)facetIndices.size(); j = i++) - { - indexBuf[facetIndices[j]].push_back(facetIndices[i]); - } - } - - - qh NOerrexit = True; - qh_freeqhull(!qh_ALL); - qh_memfreeshort(&curlong, &totlong); - - return indexBuf; -} - -T_IndexBuf *simplex_adjacency_graph(DT_Count count, const char *flags) -{ - T_IndexBuf *indexBuf = new T_IndexBuf[count]; - - DT_Index index[4]; - - DT_Index k = 0; - DT_Index i; - for (i = 0; i != count; ++i) - { - if (flags == 0 || flags[i]) - { - index[k++] = i; - } - } - - assert(k <= 4); - - for (i = 0; i != k; ++i) - { - DT_Index j; - for (j = 0; j != k; ++j) - { - if (i != j) - { - indexBuf[index[i]].push_back(index[j]); - } - } - } - - return indexBuf; -} - -#ifdef DK_HIERARCHY - -void prune(DT_Count count, T_MultiIndexBuf *cobound) -{ - DT_Index i; - for (i = 0; i != count; ++i) - { - assert(cobound[i].size()); - - DT_Index j; - for (j = 0; j != cobound[i].size() - 1; ++j) - { - T_IndexBuf::iterator it = cobound[i][j].begin(); - while (it != cobound[i][j].end()) - { - T_IndexBuf::iterator jt = - std::find(cobound[i][j+1].begin(), cobound[i][j+1].end(), *it); - - if (jt != cobound[i][j+1].end()) - { - std::swap(*it, cobound[i][j].back()); - cobound[i][j].pop_back(); - } - else - { - ++it; - } - } - } - } -} - -#endif - -DT_Polyhedron::DT_Polyhedron(const DT_VertexBase *base, DT_Count count, const DT_Index *indices) -{ - assert(count); - - std::vector<MT_Point3> vertexBuf; - DT_Index i; - for (i = 0; i != count; ++i) - { - vertexBuf.push_back((*base)[indices[i]]); - } - - T_IndexBuf *indexBuf = count > 4 ? adjacency_graph(count, &vertexBuf[0], 0) : simplex_adjacency_graph(count, 0); - - std::vector<MT_Point3> pointBuf; - - for (i = 0; i != count; ++i) - { - if (!indexBuf[i].empty()) - { - pointBuf.push_back(vertexBuf[i]); - } - } - - delete [] indexBuf; - - m_count = pointBuf.size(); - m_verts = new MT_Point3[m_count]; - std::copy(pointBuf.begin(), pointBuf.end(), &m_verts[0]); - - T_MultiIndexBuf *cobound = new T_MultiIndexBuf[m_count]; - char *flags = new char[m_count]; - std::fill(&flags[0], &flags[m_count], 1); - - DT_Count num_layers = 0; - DT_Count layer_count = m_count; - while (layer_count > 4) - { - T_IndexBuf *indexBuf = adjacency_graph(m_count, m_verts, flags); - - DT_Index i; - for (i = 0; i != m_count; ++i) - { - if (flags[i]) - { - assert(!indexBuf[i].empty()); - cobound[i].push_back(indexBuf[i]); - } - } - - ++num_layers; - - delete [] indexBuf; - - std::fill(&flags[0], &flags[m_count], 0); - - for (i = 0; i != m_count; ++i) - { - if (cobound[i].size() == num_layers) - { - T_IndexBuf& curr_cobound = cobound[i].back(); - if (!flags[i] && curr_cobound.size() <= 8) - { - DT_Index j; - for (j = 0; j != curr_cobound.size(); ++j) - { - flags[curr_cobound[j]] = 1; - } - } - } - } - - layer_count = 0; - - for (i = 0; i != m_count; ++i) - { - if (flags[i]) - { - ++layer_count; - } - } - } - - indexBuf = simplex_adjacency_graph(m_count, flags); - - for (i = 0; i != m_count; ++i) - { - if (flags[i]) - { - assert(!indexBuf[i].empty()); - cobound[i].push_back(indexBuf[i]); - } - } - - ++num_layers; - - delete [] indexBuf; - delete [] flags; - - - -#ifdef DK_HIERARCHY - prune(m_count, cobound); -#endif - - m_cobound = new T_MultiIndexArray[m_count]; - - for (i = 0; i != m_count; ++i) - { - new (&m_cobound[i]) T_MultiIndexArray(cobound[i].size()); - - DT_Index j; - for (j = 0; j != cobound[i].size(); ++j) - { - new (&m_cobound[i][j]) DT_IndexArray(cobound[i][j].size(), &cobound[i][j][0]); - } - } - - delete [] cobound; - - m_start_vertex = 0; - while (m_cobound[m_start_vertex].size() != num_layers) - { - ++m_start_vertex; - assert(m_start_vertex < m_count); - } - - m_curr_vertex = m_start_vertex; -} - - -DT_Polyhedron::~DT_Polyhedron() -{ - delete [] m_verts; - delete [] m_cobound; -} - -#ifdef DK_HIERARCHY - -MT_Scalar DT_Polyhedron::supportH(const MT_Vector3& v) const -{ - m_curr_vertex = m_start_vertex; - MT_Scalar d = (*this)[m_curr_vertex].dot(v); - MT_Scalar h = d; - int curr_layer; - for (curr_layer = m_cobound[m_start_vertex].size(); curr_layer != 0; --curr_layer) - { - const DT_IndexArray& curr_cobound = m_cobound[m_curr_vertex][curr_layer-1]; - DT_Index i; - for (i = 0; i != curr_cobound.size(); ++i) - { - d = (*this)[curr_cobound[i]].dot(v); - if (d > h) - { - m_curr_vertex = curr_cobound[i]; - h = d; - } - } - } - - return h; -} - -MT_Point3 DT_Polyhedron::support(const MT_Vector3& v) const -{ - m_curr_vertex = m_start_vertex; - MT_Scalar d = (*this)[m_curr_vertex].dot(v); - MT_Scalar h = d; - int curr_layer; - for (curr_layer = m_cobound[m_start_vertex].size(); curr_layer != 0; --curr_layer) - { - const DT_IndexArray& curr_cobound = m_cobound[m_curr_vertex][curr_layer-1]; - DT_Index i; - for (i = 0; i != curr_cobound.size(); ++i) - { - d = (*this)[curr_cobound[i]].dot(v); - if (d > h) - { - m_curr_vertex = curr_cobound[i]; - h = d; - } - } - } - - return (*this)[m_curr_vertex]; -} - -#else - -MT_Scalar DT_Polyhedron::supportH(const MT_Vector3& v) const -{ - int last_vertex = -1; - MT_Scalar d = (*this)[m_curr_vertex].dot(v); - MT_Scalar h = d; - - for (;;) - { - DT_IndexArray& curr_cobound = m_cobound[m_curr_vertex][0]; - int i = 0, n = curr_cobound.size(); - while (i != n && - (curr_cobound[i] == last_vertex || - (d = (*this)[curr_cobound[i]].dot(v)) - h <= MT_abs(h) * MT_EPSILON)) - { - ++i; - } - - if (i == n) - { - break; - } - - last_vertex = m_curr_vertex; - m_curr_vertex = curr_cobound[i]; - h = d; - } - return h; -} - -MT_Point3 DT_Polyhedron::support(const MT_Vector3& v) const -{ - int last_vertex = -1; - MT_Scalar d = (*this)[m_curr_vertex].dot(v); - MT_Scalar h = d; - - for (;;) - { - DT_IndexArray& curr_cobound = m_cobound[m_curr_vertex][0]; - int i = 0, n = curr_cobound.size(); - while (i != n && - (curr_cobound[i] == last_vertex || - (d = (*this)[curr_cobound[i]].dot(v)) - h <= MT_abs(h) * MT_EPSILON)) - { - ++i; - } - - if (i == n) - { - break; - } - - last_vertex = m_curr_vertex; - m_curr_vertex = curr_cobound[i]; - h = d; - } - return (*this)[m_curr_vertex]; -} - -#endif - -#endif - diff --git a/extern/solid/src/convex/DT_Polyhedron.h b/extern/solid/src/convex/DT_Polyhedron.h deleted file mode 100644 index 58c991bd152..00000000000 --- a/extern/solid/src/convex/DT_Polyhedron.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_POLYHEDRON_H -#define DT_POLYHEDRON_H - -#ifdef HAVE_CONFIG_H -# include "config.h" -# if HAVE_QHULL_QHULL_A_H -# define QHULL -# endif -#endif - - -#ifdef QHULL - -#include "DT_Convex.h" -#include "DT_IndexArray.h" -#include "DT_VertexBase.h" - -class DT_Polyhedron : public DT_Convex { - typedef DT_Array<DT_IndexArray> T_MultiIndexArray; -public: - DT_Polyhedron() - : m_verts(0), - m_cobound(0) - {} - - DT_Polyhedron(const DT_VertexBase *base, DT_Count count, const DT_Index *indices); - - virtual ~DT_Polyhedron(); - - virtual MT_Scalar supportH(const MT_Vector3& v) const; - virtual MT_Point3 support(const MT_Vector3& v) const; - - const MT_Point3& operator[](int i) const { return m_verts[i]; } - DT_Count numVerts() const { return m_count; } - -private: - DT_Count m_count; - MT_Point3 *m_verts; - T_MultiIndexArray *m_cobound; - DT_Index m_start_vertex; - mutable DT_Index m_curr_vertex; -}; - -#else - -#include "DT_Polytope.h" - -typedef DT_Polytope DT_Polyhedron; - -#endif - -#endif - diff --git a/extern/solid/src/convex/DT_Polytope.cpp b/extern/solid/src/convex/DT_Polytope.cpp deleted file mode 100644 index e757c3bfdb4..00000000000 --- a/extern/solid/src/convex/DT_Polytope.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#include "DT_Polytope.h" - -MT_BBox DT_Polytope::bbox() const -{ - MT_BBox bbox = (*this)[0]; - DT_Index i; - for (i = 1; i < numVerts(); ++i) - { - bbox = bbox.hull((*this)[i]); - } - return bbox; -} - -MT_Scalar DT_Polytope::supportH(const MT_Vector3& v) const -{ - int c = 0; - MT_Scalar h = (*this)[0].dot(v), d; - DT_Index i; - for (i = 1; i < numVerts(); ++i) - { - if ((d = (*this)[i].dot(v)) > h) - { - c = i; - h = d; - } - } - return h; -} - -MT_Point3 DT_Polytope::support(const MT_Vector3& v) const -{ - int c = 0; - MT_Scalar h = (*this)[0].dot(v), d; - DT_Index i; - for (i = 1; i < numVerts(); ++i) - { - if ((d = (*this)[i].dot(v)) > h) - { - c = i; - h = d; - } - } - return (*this)[c]; -} - - diff --git a/extern/solid/src/convex/DT_Polytope.h b/extern/solid/src/convex/DT_Polytope.h deleted file mode 100644 index c715598defe..00000000000 --- a/extern/solid/src/convex/DT_Polytope.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_POLYTOPE_H -#define DT_POLYTOPE_H - -#include "DT_Convex.h" -#include "DT_IndexArray.h" -#include "DT_VertexBase.h" - -class DT_Polytope : public DT_Convex { -public: - DT_Polytope() {} - DT_Polytope(const DT_VertexBase *base, DT_Count count, const DT_Index *indices) - : m_base(base), - m_index(count, indices) - {} - - virtual MT_BBox bbox() const; - virtual MT_Scalar supportH(const MT_Vector3& v) const; - virtual MT_Point3 support(const MT_Vector3& v) const; - - MT_Point3 operator[](int i) const { return (*m_base)[m_index[i]]; } - DT_Count numVerts() const { return m_index.size(); } - -protected: - const DT_VertexBase *m_base; - DT_IndexArray m_index; -}; - -#endif diff --git a/extern/solid/src/convex/DT_Shape.h b/extern/solid/src/convex/DT_Shape.h deleted file mode 100644 index d48942fe515..00000000000 --- a/extern/solid/src/convex/DT_Shape.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_SHAPE_H -#define DT_SHAPE_H - -#include <algorithm> - -#include "MT_BBox.h" - -#include "MT_Transform.h" - -class DT_Object; - -enum DT_ShapeType { - COMPLEX, - CONVEX -}; - -class DT_Shape { -public: - virtual ~DT_Shape() {} - virtual DT_ShapeType getType() const = 0; - virtual MT_BBox bbox(const MT_Transform& t, MT_Scalar margin) const = 0; - virtual bool ray_cast(const MT_Point3& source, const MT_Point3& target, MT_Scalar& param, MT_Vector3& normal) const = 0; - -protected: - DT_Shape() {} -}; - -typedef bool (*Intersect)(const DT_Shape& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Shape& b, const MT_Transform& b2w, MT_Scalar b_margin, - MT_Vector3&); - -typedef bool (*Common_point)(const DT_Shape& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Shape& b, const MT_Transform& b2w, MT_Scalar b_margin, - MT_Vector3&, MT_Point3&, MT_Point3&); - -typedef bool (*Penetration_depth)(const DT_Shape& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Shape& b, const MT_Transform& b2w, MT_Scalar b_margin, - MT_Vector3&, MT_Point3&, MT_Point3&); - -typedef MT_Scalar (*Closest_points)(const DT_Shape& a, const MT_Transform& a2w, MT_Scalar a_margin, - const DT_Shape& b, const MT_Transform& b2w, MT_Scalar b_margin, - MT_Point3&, MT_Point3&); - -#endif - - - - - diff --git a/extern/solid/src/convex/DT_Sphere.cpp b/extern/solid/src/convex/DT_Sphere.cpp deleted file mode 100644 index 3f2443dcf53..00000000000 --- a/extern/solid/src/convex/DT_Sphere.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#include "DT_Sphere.h" -#include "GEN_MinMax.h" - -MT_Scalar DT_Sphere::supportH(const MT_Vector3& v) const -{ - return m_radius * v.length(); -} - -MT_Point3 DT_Sphere::support(const MT_Vector3& v) const -{ - MT_Scalar s = v.length(); - - if (s > MT_Scalar(0.0)) - { - s = m_radius / s; - return MT_Point3(v[0] * s, v[1] * s, v[2] * s); - } - else - { - return MT_Point3(m_radius, MT_Scalar(0.0), MT_Scalar(0.0)); - } -} - -bool DT_Sphere::ray_cast(const MT_Point3& source, const MT_Point3& target, - MT_Scalar& param, MT_Vector3& normal) const -{ - MT_Vector3 r = target - source; - MT_Scalar delta = -source.dot(r); - MT_Scalar r_length2 = r.length2(); - MT_Scalar sigma = delta * delta - r_length2 * (source.length2() - m_radius * m_radius); - - if (sigma >= MT_Scalar(0.0)) - // The line trough source and target intersects the sphere. - { - MT_Scalar sqrt_sigma = MT_sqrt(sigma); - // We need only the sign of lambda2, so the division by the positive - // r_length2 can be left out. - MT_Scalar lambda2 = (delta + sqrt_sigma) /* / r_length2 */ ; - if (lambda2 >= MT_Scalar(0.0)) - // The ray points at the sphere - { - MT_Scalar lambda1 = (delta - sqrt_sigma) / r_length2; - if (lambda1 <= param) - // The ray hits the sphere, since - // [lambda1, lambda2] overlaps [0, param]. - { - if (lambda1 > MT_Scalar(0.0)) - { - param = lambda1; - normal = (source + r * lambda1) / m_radius; - // NB: division by m_radius to normalize the normal. - } - else - { - param = MT_Scalar(0.0); - normal.setValue(MT_Scalar(0.0), MT_Scalar(0.0), MT_Scalar(0.0)); - } - - return true; - } - } - } - - return false; -} - - diff --git a/extern/solid/src/convex/DT_Sphere.h b/extern/solid/src/convex/DT_Sphere.h deleted file mode 100644 index 92386a66f3a..00000000000 --- a/extern/solid/src/convex/DT_Sphere.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_SPHERE_H -#define DT_SPHERE_H - -#include "DT_Convex.h" - -class DT_Sphere : public DT_Convex { -public: - DT_Sphere(MT_Scalar radius) : m_radius(radius) {} - - virtual MT_Scalar supportH(const MT_Vector3& v) const; - virtual MT_Point3 support(const MT_Vector3& v) const; - - virtual bool ray_cast(const MT_Point3& source, const MT_Point3& target, - MT_Scalar& param, MT_Vector3& normal) const; - -protected: - MT_Scalar m_radius; -}; - -#endif diff --git a/extern/solid/src/convex/DT_Transform.h b/extern/solid/src/convex/DT_Transform.h deleted file mode 100644 index a976d48d22b..00000000000 --- a/extern/solid/src/convex/DT_Transform.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_TRANSFORM_H -#define DT_TRANSFORM_H - -#include "DT_Convex.h" - -class DT_Transform : public DT_Convex { -public: - DT_Transform(const MT_Transform& xform, const DT_Convex& child) : - m_xform(xform), - m_child(child) - {} - - virtual MT_Scalar supportH(const MT_Vector3& v) const - { - return m_child.supportH(v * m_xform.getBasis()) + - v.dot(m_xform.getOrigin()); - } - - virtual MT_Point3 support(const MT_Vector3& v) const - { - return m_xform(m_child.support(v * m_xform.getBasis())); - } - -private: - const MT_Transform& m_xform; - const DT_Convex& m_child; -}; - - -#endif diff --git a/extern/solid/src/convex/DT_Triangle.cpp b/extern/solid/src/convex/DT_Triangle.cpp deleted file mode 100644 index 1917910b39d..00000000000 --- a/extern/solid/src/convex/DT_Triangle.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -//#define BACKFACE_CULLING - -#include "DT_Triangle.h" - -MT_BBox DT_Triangle::bbox() const -{ - return MT_BBox((*this)[0]).hull((*this)[1]).hull((*this)[2]); -} - -MT_Scalar DT_Triangle::supportH(const MT_Vector3& v) const -{ - return GEN_max(GEN_max(v.dot((*this)[0]), v.dot((*this)[1])), v.dot((*this)[2])); -} - -MT_Point3 DT_Triangle::support(const MT_Vector3& v) const -{ - MT_Vector3 dots(v.dot((*this)[0]), v.dot((*this)[1]), v.dot((*this)[2])); - - return (*this)[dots.maxAxis()]; -} - -bool DT_Triangle::ray_cast(const MT_Point3& source, const MT_Point3& target, - MT_Scalar& param, MT_Vector3& normal) const -{ - MT_Vector3 d1 = (*this)[1] - (*this)[0]; - MT_Vector3 d2 = (*this)[2] - (*this)[0]; - MT_Vector3 n = d1.cross(d2); - MT_Vector3 r = target - source; - MT_Scalar delta = -r.dot(n); - - MT_Scalar rounding_error = GEN_max(GEN_max(MT_abs(n[0]), MT_abs(n[1])), MT_abs(n[2])) * MT_EPSILON; - -#ifdef BACKFACE_CULLING - if (delta > rounding_error) -#else - if (MT_abs(delta) > rounding_error) -#endif - // The ray is not parallel to the triangle's plane. - // (Coplanar rays are ignored.) - { - MT_Vector3 b = source - (*this)[0]; - MT_Scalar lambda = b.dot(n) / delta; - - if (MT_Scalar(0.0) <= lambda && lambda <= param) - // The ray intersects the triangle's plane. - { - MT_Vector3 u = b.cross(r); - MT_Scalar mu1 = d2.dot(u) / delta; - - if (MT_Scalar(0.0) <= mu1 && mu1 <= MT_Scalar(1.0)) - { - MT_Scalar mu2 = -d1.dot(u) / delta; - - if (MT_Scalar(0.0) <= mu2 && mu1 + mu2 <= MT_Scalar(1.0)) - // The ray intersects the triangle. - { - param = lambda; - // Return a normal that points at the source. -#ifdef BACKFACE_CULLING - normal = n; -#else - normal = delta > MT_Scalar(0.0) ? n : -n; -#endif - return true; - } - } - } - } - - return false; -} - - diff --git a/extern/solid/src/convex/DT_Triangle.h b/extern/solid/src/convex/DT_Triangle.h deleted file mode 100644 index 4192b5629ac..00000000000 --- a/extern/solid/src/convex/DT_Triangle.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_TRIANGLE_H -#define DT_TRIANGLE_H - -#include "SOLID_types.h" - -#include "DT_Convex.h" -#include "DT_IndexArray.h" -#include "DT_VertexBase.h" - -class DT_Triangle : public DT_Convex { -public: - DT_Triangle(const DT_VertexBase *base, DT_Index i0, DT_Index i1, DT_Index i2) : - m_base(base) - { - m_index[0] = i0; - m_index[1] = i1; - m_index[2] = i2; - } - - DT_Triangle(const DT_VertexBase *base, const DT_Index *index) : - m_base(base) - { - m_index[0] = index[0]; - m_index[1] = index[1]; - m_index[2] = index[2]; - } - - virtual MT_BBox bbox() const; - virtual MT_Scalar supportH(const MT_Vector3& v) const; - virtual MT_Point3 support(const MT_Vector3& v) const; - virtual bool ray_cast(const MT_Point3& source, const MT_Point3& target, MT_Scalar& lambda, MT_Vector3& normal) const; - - MT_Point3 operator[](int i) const { return (*m_base)[m_index[i]]; } - -private: - const DT_VertexBase *m_base; - DT_Index m_index[3]; -}; - -#endif diff --git a/extern/solid/src/convex/DT_VertexBase.h b/extern/solid/src/convex/DT_VertexBase.h deleted file mode 100644 index 37646fdd935..00000000000 --- a/extern/solid/src/convex/DT_VertexBase.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * SOLID - Software Library for Interference Detection - * - * Copyright (C) 2001-2003 Dtecta. All rights reserved. - * - * This library may be distributed under the terms of the Q Public License - * (QPL) as defined by Trolltech AS of Norway and appearing in the file - * LICENSE.QPL included in the packaging of this file. - * - * This library may be distributed and/or modified under the terms of the - * GNU General Public License (GPL) version 2 as published by the Free Software - * Foundation and appearing in the file LICENSE.GPL included in the - * packaging of this file. - * - * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE - * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * Commercial use or any other use of this library not covered by either - * the QPL or the GPL requires an additional license from Dtecta. - * Please contact info@dtecta.com for enquiries about the terms of commercial - * use of this library. - */ - -#ifndef DT_VERTEXBASE_H -#define DT_VERTEXBASE_H - -#include "MT_Point3.h" - -#include <vector> - -class DT_Complex; - -typedef std::vector<DT_Complex *>DT_ComplexList; - -class DT_VertexBase { -public: - explicit DT_VertexBase(const void *base = 0, DT_Size stride = 0, bool owner = false) : - m_base((char *)base), - m_stride(stride ? stride : 3 * sizeof(DT_Scalar)), - m_owner(owner) - {} - - ~DT_VertexBase() - { - if (m_owner) - { - delete [] m_base; - } - } - - MT_Point3 operator[](DT_Index i) const - { - return MT_Point3(reinterpret_cast<DT_Scalar *>(m_base + i * m_stride)); - } - - void setPointer(const void *base, bool owner = false) - { - m_base = (char *)base; - m_owner = owner; - } - - const void *getPointer() const { return m_base; } - bool isOwner() const { return m_owner; } - - void addComplex(DT_Complex *complex) const { m_complexList.push_back(complex); } - void removeComplex(DT_Complex *complex) const - { - DT_ComplexList::iterator it = std::find(m_complexList.begin(), m_complexList.end(), complex); - if (it != m_complexList.end()) - { - m_complexList.erase(it); - } - } - - const DT_ComplexList& getComplexList() const { return m_complexList; } - -private: - char *m_base; - DT_Size m_stride; - bool m_owner; - mutable DT_ComplexList m_complexList; -}; - -#endif diff --git a/extern/solid/src/convex/Makefile b/extern/solid/src/convex/Makefile deleted file mode 100644 index 75fa578a292..00000000000 --- a/extern/solid/src/convex/Makefile +++ /dev/null @@ -1,41 +0,0 @@ -# -# $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 ***** -# -# - -LIBNAME = solid_convex -DIR = $(OCGDIR)/extern/$(LIBNAME) - -CCFLAGS += $(LEVEL_1_CPP_WARNINGS) - -CPPFLAGS += -I../../include -I$(NAN_QHULL)/include -CPPFLAGS += -DQHULL -DUSE_DOUBLES - -include nan_compile.mk - - diff --git a/intern/bsp/test/Makefile b/intern/bsp/test/Makefile index eebf7470a0f..91e4497b267 100644 --- a/intern/bsp/test/Makefile +++ b/intern/bsp/test/Makefile @@ -47,7 +47,7 @@ SLIBS += $(NAN_MOTO)/lib/$(DEBUG_DIR)libmoto.a SLIBS += $(NAN_GHOST)/lib/$(DEBUG_DIR)libghost.a SLIBS += $(NAN_STRING)/lib/$(DEBUG_DIR)libstring.a -ifeq ($(OS),$(findstring $(OS), "beos darwin linux freebsd openbsd")) +ifeq ($(OS),$(findstring $(OS), "darwin linux freebsd openbsd")) LLIBS = -L/usr/X11R6/lib -lglut -pthread -lXi -lXmu endif diff --git a/intern/guardedalloc/intern/mallocn.c b/intern/guardedalloc/intern/mallocn.c index 7bdca7339fc..3b5f6a0caf9 100644 --- a/intern/guardedalloc/intern/mallocn.c +++ b/intern/guardedalloc/intern/mallocn.c @@ -38,8 +38,7 @@ #include <stdarg.h> /* mmap exception */ -#if defined(AMIGA) || defined(__BeOS) -#elif defined(WIN32) +#if defined(WIN32) #include <sys/types.h> #include "mmap_win.h" #else @@ -292,9 +291,6 @@ void *MEM_callocN(unsigned int len, const char *str) /* note; mmap returns zero'd memory */ void *MEM_mapallocN(unsigned int len, const char *str) { -#if defined(AMIGA) || defined(__BeOS) - return MEM_callocN(len, str); -#else MemHead *memh; mem_lock_thread(); @@ -329,7 +325,6 @@ void *MEM_mapallocN(unsigned int len, const char *str) print_error("Mapalloc returns nill, fallback to regular malloc: len=%d in %s, total %u\n",len, str, mmap_in_use); return MEM_callocN(len, str); } -#endif } /* Memory statistics print */ @@ -589,10 +584,6 @@ static void rem_memblock(MemHead *memh) totblock--; mem_in_use -= memh->len; -#if defined(AMIGA) || defined(__BeOS) - free(memh); -#else - if(memh->mmap) { mmap_in_use -= memh->len; if (munmap(memh, memh->len + sizeof(MemHead) + sizeof(MemTail))) @@ -603,7 +594,6 @@ static void rem_memblock(MemHead *memh) memset(memh+1, 255, memh->len); free(memh); } -#endif } static void MemorY_ErroR(const char *block, const char *error) diff --git a/intern/iksolver/test/Makefile b/intern/iksolver/test/Makefile index 4ab317f9e9f..ed867ba2a73 100644 --- a/intern/iksolver/test/Makefile +++ b/intern/iksolver/test/Makefile @@ -46,7 +46,7 @@ LIBS += $(OCGDIR)/intern/$(LIBNAME)/$(DEBUG_DIR)libiksolver.a SLIBS += $(NAN_MOTO)/lib/$(DEBUG_DIR)libmoto.a -ifeq ($(OS),$(findstring $(OS), "beos darwin linux freebsd openbsd")) +ifeq ($(OS),$(findstring $(OS), "darwin linux freebsd openbsd")) LLIBS = -L/usr/X11R6/lib -lglut -pthread endif diff --git a/release/ui/buttons_object_constraint.py b/release/ui/buttons_object_constraint.py index f4507f9149d..52e43406790 100644 --- a/release/ui/buttons_object_constraint.py +++ b/release/ui/buttons_object_constraint.py @@ -67,7 +67,7 @@ class ConstraintButtonsPanel(bpy.types.Panel): row.itemR(con, "target_space", text="") if target and owner: - row.itemL(icon=8) # XXX + row.itemL(icon="ICON_ARROW_LEFTRIGHT") if owner: row.itemR(con, "owner_space", text="") @@ -547,4 +547,4 @@ class BONE_PT_constraints(ConstraintButtonsPanel): self.draw_constraint(con) bpy.types.register(OBJECT_PT_constraints) -bpy.types.register(BONE_PT_constraints)
\ No newline at end of file +bpy.types.register(BONE_PT_constraints) diff --git a/release/ui/buttons_particle.py b/release/ui/buttons_particle.py index 571cafb709d..e03db78b7e4 100644 --- a/release/ui/buttons_particle.py +++ b/release/ui/buttons_particle.py @@ -34,12 +34,8 @@ class PARTICLE_PT_particles(ParticleButtonsPanel): if psys: split.template_ID(context, psys, "settings") - #if ob: - # split.itemR(ob, "active_particle_system_index", text="Active") - if psys: #row = layout.row() - #row.itemL(text="Particle system datablock") #row.itemL(text="Viewport") #row.itemL(text="Render") @@ -49,55 +45,26 @@ class PARTICLE_PT_particles(ParticleButtonsPanel): if ptype not in ('EMITTER', 'REACTOR', 'HAIR'): layout.itemL(text="No settings for fluid particles") return + + split = layout.split(percentage=0.65) - row = layout.row() - row.enabled = particle_panel_enabled(psys) - row.itemR(part, "type") - row.itemR(psys, "seed") - - row = layout.row() - if part.type=='HAIR': - if psys.editable==True: - row.itemO("PARTICLE_OT_editable_set", text="Free Edit") - else: - row.itemO("PARTICLE_OT_editable_set", text="Make Editable") - subrow = row.row() - subrow.enabled = particle_panel_enabled(psys) - subrow.itemR(part, "hair_step") - elif part.type=='REACTOR': - row.itemR(psys, "reactor_target_object") - row.itemR(psys, "reactor_target_particle_system", text="Particle System") - - if psys: - #row = layout.row() - #row.itemL(text="Particle system datablock") - #row.itemL(text="Viewport") - #row.itemL(text="Render") - - part = psys.settings - ptype = psys.settings.type - - if ptype not in ('EMITTER', 'REACTOR', 'HAIR'): - layout.itemL(text="No settings for fluid particles") - return - - row = layout.row() - row.enabled = particle_panel_enabled(psys) - row.itemR(part, "type", expand=True) - + split.enabled = particle_panel_enabled(psys) + split.itemR(part, "type") + split.itemR(psys, "seed") - row = layout.row() + split = layout.split(percentage=0.65) if part.type=='HAIR': if psys.editable==True: - row.itemO("PARTICLE_OT_editable_set", text="Free Edit") + split.itemO("PARTICLE_OT_editable_set", text="Free Edit") else: - row.itemO("PARTICLE_OT_editable_set", text="Make Editable") - subrow = row.row() - subrow.enabled = particle_panel_enabled(psys) - subrow.itemR(part, "hair_step") + split.itemO("PARTICLE_OT_editable_set", text="Make Editable") + row = split.row() + row.enabled = particle_panel_enabled(psys) + row.itemR(part, "hair_step") elif part.type=='REACTOR': - row.itemR(psys, "reactor_target_object") - row.itemR(psys, "reactor_target_particle_system", text="Particle System") + split.enabled = particle_panel_enabled(psys) + split.itemR(psys, "reactor_target_object") + split.itemR(psys, "reactor_target_particle_system", text="Particle System") class PARTICLE_PT_emission(ParticleButtonsPanel): __idname__= "PARTICLE_PT_emission" @@ -112,9 +79,7 @@ class PARTICLE_PT_emission(ParticleButtonsPanel): layout.enabled = particle_panel_enabled(psys) row = layout.row() - #col.itemL(text="TODO: Rate instead of amount") row.itemR(part, "amount") - row.itemR(psys, "seed") split = layout.split() @@ -150,6 +115,7 @@ class PARTICLE_PT_emission(ParticleButtonsPanel): class PARTICLE_PT_cache(ParticleButtonsPanel): __idname__= "PARTICLE_PT_cache" __label__ = "Cache" + __default_closed__ = True def poll(self, context): psys = context.particle_system @@ -163,15 +129,35 @@ class PARTICLE_PT_cache(ParticleButtonsPanel): part = psys.settings cache = psys.point_cache - #if cache.baked==True: - #layout.itemO("PARTICLE_OT_free_bake", text="BAKE") - #else: row = layout.row() - #row.itemO("PARTICLE_OT_bake", text="BAKE") - row.itemR(cache, "start_frame") - row.itemR(cache, "end_frame") + row.itemR(cache, "name", text="") + if cache.outdated: + row.itemL(text="Cache is outdated.") + else: + row.itemL(text="") + + row = layout.row() + + if cache.baked == True: + row.itemO("PTCACHE_OT_free_bake_particle_system", text="Free Bake") + else: + row.item_booleanO("PTCACHE_OT_cache_particle_system", "bake", True, text="Bake") - #layout.row().itemL(text="No simulation frames in disk cache.") + row = layout.row() + row.enabled = particle_panel_enabled(psys) + row.itemO("PTCACHE_OT_bake_from_particles_cache", text="Current Cache to Bake") + if cache.autocache == 0: + row.itemO("PTCACHE_OT_cache_particle_system", text="Cache to Current Frame") + + row = layout.row() + row.enabled = particle_panel_enabled(psys) + #row.itemR(cache, "autocache") + row.itemR(cache, "disk_cache") + row.itemL(text=cache.info) + + # for particles these are figured out automatically + #row.itemR(cache, "start_frame") + #row.itemR(cache, "end_frame") class PARTICLE_PT_initial(ParticleButtonsPanel): __idname__= "PARTICLE_PT_initial" @@ -184,8 +170,6 @@ class PARTICLE_PT_initial(ParticleButtonsPanel): part = psys.settings layout.enabled = particle_panel_enabled(psys) - - #layout.row().itemL(text="") layout.row().itemL(text="Direction:") @@ -304,7 +288,9 @@ class PARTICLE_PT_render(ParticleButtonsPanel): psys = context.particle_system part = psys.settings - layout.itemR(part, "material") + row = layout.row() + row.itemR(part, "material") + row.itemR(psys, "parent"); split = layout.split() @@ -362,27 +348,14 @@ class PARTICLE_PT_render(ParticleButtonsPanel): row = layout.row() col = row.column() - -# subrow = col.row() -# subrow.active = part.render_strand == False -# subrow.itemR(part, "render_adaptive") -# col = row.column(align=True) -# subrow = col.row() -# subrow.active = part.render_adaptive or part.render_strand == True -# subrow.itemR(part, "adaptive_angle") -# subrow = col.row() -# subrow.active = part.render_adaptive == True and part.render_strand == False -# subrow.itemR(part, "adaptive_pix") - if part.type=='HAIR' and part.render_strand==True and part.child_type=='FACES': layout.itemR(part, "enable_simplify") if part.enable_simplify==True: - box = layout.box() - row = box.row() + row = layout.row() row.itemR(part, "simplify_refsize") row.itemR(part, "simplify_rate") row.itemR(part, "simplify_transition") - row = box.row() + row = layout.row() row.itemR(part, "viewport") subrow = row.row() subrow.active = part.viewport==True @@ -438,6 +411,7 @@ class PARTICLE_PT_render(ParticleButtonsPanel): class PARTICLE_PT_draw(ParticleButtonsPanel): __idname__= "PARTICLE_PT_draw" __label__ = "Display" + __default_closed__ = True def poll(self, context): return (context.particle_system != None) @@ -490,6 +464,7 @@ class PARTICLE_PT_draw(ParticleButtonsPanel): class PARTICLE_PT_children(ParticleButtonsPanel): __idname__= "PARTICLE_PT_children" __label__ = "Children" + __default_closed__ = True def draw(self, context): layout = self.layout @@ -557,6 +532,7 @@ class PARTICLE_PT_children(ParticleButtonsPanel): class PARTICLE_PT_vertexgroups(ParticleButtonsPanel): __idname__= "PARTICLE_PT_vertexgroups" __label__ = "Vertexgroups" + __default_closed__ = True def draw(self, context): layout = self.layout diff --git a/release/ui/space_buttons.py b/release/ui/space_buttons.py new file mode 100644 index 00000000000..76863046470 --- /dev/null +++ b/release/ui/space_buttons.py @@ -0,0 +1,36 @@ + +import bpy + +class Buttons_HT_header(bpy.types.Header): + __space_type__ = "BUTTONS_WINDOW" + __idname__ = "BUTTONS_HT_header" + + def draw(self, context): + layout = self.layout + + so = context.space_data + scene = context.scene + + layout.template_header(context) + + if context.area.show_menus: + row = layout.row(align=True) + row.itemM(context, "Buttons_MT_view", text="View") + + row = layout.row() + row.itemR(so, "buttons_context", expand=True, text="") + row.itemR(scene, "current_frame") + +class Buttons_MT_view(bpy.types.Menu): + __space_type__ = "BUTTONS_WINDOW" + __label__ = "View" + + def draw(self, context): + layout = self.layout + so = context.space_data + + col = layout.column() + col.itemR(so, "panel_alignment", expand=True) + +bpy.types.register(Buttons_HT_header) +bpy.types.register(Buttons_MT_view)
\ No newline at end of file diff --git a/source/Makefile b/source/Makefile index 2df57f58c73..62eb25acbc1 100644 --- a/source/Makefile +++ b/source/Makefile @@ -115,25 +115,16 @@ ifneq ($(NAN_NO_KETSJI),true) COMLIB += $(OCGDIR)/gameengine/ketsji/$(DEBUG_DIR)libketsji.a COMLIB += $(OCGDIR)/gameengine/blconverter/$(DEBUG_DIR)libblconverter.a COMLIB += $(OCGDIR)/gameengine/blconverter/$(DEBUG_DIR)libblconverter.a - COMLIB += $(NAN_SOLID)/lib/libsolid.a - COMLIB += $(NAN_SOLID)/lib/libsolid_broad.a - COMLIB += $(NAN_SOLID)/lib/libsolid_complex.a - COMLIB += $(NAN_SOLID)/lib/libsolid_convex.a - COMLIB += $(OCGDIR)/gameengine/blphys/sumo/$(DEBUG_DIR)libsumo.a COMLIB += $(OCGDIR)/gameengine/blphys/fuzzics/$(DEBUG_DIR)libfuzzics.a COMLIB += $(NAN_QHULL)/lib/libqhull.a COMLIB += $(OCGDIR)/gameengine/blphys/dummy/$(DEBUG_DIR)libdummy.a COMLIB += $(OCGDIR)/gameengine/blphys/common/$(DEBUG_DIR)libcommon.a -# COMLIB += $(OCGDIR)/gameengine/blphys/sumo/$(DEBUG_DIR)libsumo.a COMLIB += $(OCGDIR)/gameengine/blphys/dummy/$(DEBUG_DIR)libdummy.a COMLIB += $(OCGDIR)/gameengine/ketsji/$(DEBUG_DIR)libketsji.a COMLIB += $(OCGDIR)/gameengine/blphys/common/$(DEBUG_DIR)libcommon.a -# COMLIB += $(OCGDIR)/gameengine/blphys/blode/$(DEBUG_DIR)libblode.a -# COMLIB += $(OCGDIR)/gameengine/blphys/sumo/$(DEBUG_DIR)libsumo.a COMLIB += $(OCGDIR)/gameengine/blphys/dummy/$(DEBUG_DIR)libdummy.a COMLIB += $(OCGDIR)/gameengine/blphys/blbullet/$(DEBUG_DIR)libblbullet.a COMLIB += $(OCGDIR)/gameengine/blphys/common/$(DEBUG_DIR)libcommon.a -# COMLIB += $(OCGDIR)/gameengine/blphys/sumo/$(DEBUG_DIR)libsumo.a COMLIB += $(OCGDIR)/gameengine/blphys/dummy/$(DEBUG_DIR)libdummy.a COMLIB += $(OCGDIR)/gameengine/ketsji/$(DEBUG_DIR)libketsji.a COMLIB += $(OCGDIR)/gameengine/logic/$(DEBUG_DIR)liblogic.a @@ -143,8 +134,6 @@ ifneq ($(NAN_NO_KETSJI),true) COMLIB += $(OCGDIR)/gameengine/expression/$(DEBUG_DIR)libexpression.a COMLIB += $(OCGDIR)/gameengine/scenegraph/$(DEBUG_DIR)libscenegraph.a COMLIB += $(OCGDIR)/gameengine/videotex/$(DEBUG_DIR)libvideotex.a -# COMLIB += $(OCGDIR)/sumo/$(DEBUG_DIR)libfuzzics.a -# COMLIB += $(OCGDIR)/sumo/$(DEBUG_DIR)libsolid.a COMLIB += $(NAN_MOTO)/lib/libmoto.a COMLIB += $(NAN_SND_LIBS) COMLIB += $(OCGDIR)/kernel/gen_system/$(DEBUG_DIR)libgen_system.a diff --git a/source/blender/CMakeLists.txt b/source/blender/CMakeLists.txt index a53b15673e2..a9e3d50211f 100644 --- a/source/blender/CMakeLists.txt +++ b/source/blender/CMakeLists.txt @@ -37,7 +37,6 @@ ADD_SUBDIRECTORY(imbuf/intern/cineon) ADD_SUBDIRECTORY(gpu) ADD_SUBDIRECTORY(makesdna) ADD_SUBDIRECTORY(makesrna) -ADD_SUBDIRECTORY(radiosity) ADD_SUBDIRECTORY(readblenfile) ADD_SUBDIRECTORY(render) ADD_SUBDIRECTORY(blenfont) diff --git a/source/blender/Makefile b/source/blender/Makefile index 64eb1a2614b..31636f838c3 100644 --- a/source/blender/Makefile +++ b/source/blender/Makefile @@ -31,7 +31,7 @@ include nan_definitions.mk DIRS = windowmanager editors blenloader readblenfile -DIRS += avi imbuf render radiosity blenlib blenkernel blenpluginapi +DIRS += avi imbuf render blenlib blenkernel blenpluginapi DIRS += makesdna makesrna DIRS += python nodes gpu DIRS += blenfont diff --git a/source/blender/SConscript b/source/blender/SConscript index 691fbf9b494..a064850c170 100644 --- a/source/blender/SConscript +++ b/source/blender/SConscript @@ -13,7 +13,6 @@ SConscript(['avi/SConscript', 'imbuf/intern/cineon/SConscript', 'makesdna/SConscript', 'makesrna/SConscript', - 'radiosity/SConscript', 'readblenfile/SConscript', 'render/SConscript', 'nodes/SConscript', diff --git a/source/blender/blenkernel/BKE_exotic.h b/source/blender/blenkernel/BKE_exotic.h index 11dc1f41109..5c47eeabfe8 100644 --- a/source/blender/blenkernel/BKE_exotic.h +++ b/source/blender/blenkernel/BKE_exotic.h @@ -47,7 +47,6 @@ int BKE_read_exotic(struct Scene *scene, char *name); void write_dxf(struct Scene *scene, char *str); void write_vrml(struct Scene *scene, char *str); -void write_videoscape(struct Scene *scene, char *str); void write_stl(struct Scene *scene, char *str); #endif diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h index 4efd9a7f8ba..0ecd71fc4a3 100644 --- a/source/blender/blenkernel/BKE_particle.h +++ b/source/blender/blenkernel/BKE_particle.h @@ -217,6 +217,7 @@ char *psys_menu_string(struct Object *ob, int for_sb); struct ParticleSystem *psys_get_current(struct Object *ob); short psys_get_current_num(struct Object *ob); +struct Object *psys_find_object(struct Scene *scene, struct ParticleSystem *psys); //struct ParticleSystem *psys_get(struct Object *ob, int index); struct ParticleData *psys_get_selected_particle(struct ParticleSystem *psys, int *index); struct ParticleKey *psys_get_selected_key(struct ParticleSystem *psys, int pa_index, int *key_index); @@ -251,6 +252,7 @@ struct ParticleSystemModifierData *psys_get_modifier(struct Object *ob, struct P struct ParticleSettings *psys_new_settings(char *name, struct Main *main); struct ParticleSettings *psys_copy_settings(struct ParticleSettings *part); +int psys_count_autocache(struct Scene *scene, struct ParticleSettings *part); void psys_flush_particle_settings(struct Scene *scene, struct ParticleSettings *part, int recalc); void make_local_particlesettings(struct ParticleSettings *part); @@ -290,10 +292,13 @@ void psys_get_reactor_target(struct Object *ob, struct ParticleSystem *psys, str void psys_init_effectors(struct Scene *scene, struct Object *obsrc, struct Group *group, struct ParticleSystem *psys); void psys_end_effectors(struct ParticleSystem *psys); +void psys_get_pointcache_start_end(struct Scene *scene, struct ParticleSystem *psys, int *sfra, int *efra); + void particle_system_update(struct Scene *scene, struct Object *ob, struct ParticleSystem *psys); /* ----------- functions needed only inside particlesystem ------------ */ /* particle.c */ +void psys_interpolate_particle(short type, struct ParticleKey keys[4], float dt, struct ParticleKey *result, int velocity); void psys_key_to_object(struct Object *ob, struct ParticleKey *key, float imat[][4]); //void psys_key_to_geometry(struct DerivedMesh *dm, struct ParticleData *pa, struct ParticleKey *key); //void psys_key_from_geometry(struct DerivedMesh *dm, struct ParticleData *pa, struct ParticleKey *key); diff --git a/source/blender/blenkernel/BKE_pointcache.h b/source/blender/blenkernel/BKE_pointcache.h index 8ef3ff4d4b7..b79357edf36 100644 --- a/source/blender/blenkernel/BKE_pointcache.h +++ b/source/blender/blenkernel/BKE_pointcache.h @@ -31,6 +31,8 @@ #include "DNA_ID.h" +#include "MEM_guardedalloc.h" + /* Point cache clearing option, for BKE_ptcache_id_clear, before * and after are non inclusive (they wont remove the cfra) */ #define PTCACHE_CLEAR_ALL 0 @@ -42,6 +44,7 @@ #define PTCACHE_RESET_DEPSGRAPH 0 #define PTCACHE_RESET_BAKED 1 #define PTCACHE_RESET_OUTDATED 2 +#define PTCACHE_RESET_FREE 3 /* Add the blendfile name after blendcache_ */ #define PTCACHE_EXT ".bphys" @@ -56,6 +59,11 @@ #define PTCACHE_TYPE_PARTICLES 1 #define PTCACHE_TYPE_CLOTH 2 +/* PTCache read return code */ +#define PTCACHE_READ_EXACT 1 +#define PTCACHE_READ_INTERPOLATED 2 +#define PTCACHE_READ_OLD 3 + /* Structs */ struct Object; struct Scene; @@ -80,6 +88,41 @@ typedef struct PTCacheID { struct PointCache *cache; } PTCacheID; +typedef struct PTCacheWriter { + struct PTCacheID *pid; + int cfra; + int totelem; + + float *(*elem_ptr)(int index, void *calldata); + void *calldata; +} PTCacheWriter; + +typedef struct PTCacheReader { + struct Scene *scene; + struct PTCacheID *pid; + float cfra; + int totelem; + + void (*set_elem)(int index, void *calldata, float *data); + void (*interpolate_elem)(int index, void *calldata, float frs_sec, float cfra, int cfra1, int cfra2, float *data1, float *data2); + void *calldata; + + int allow_interpolate; + int allow_old; + int *old_frame; +} PTCacheReader; + +typedef struct PTCacheBaker { + struct Scene *scene; + int bake; + int render; + struct PTCacheID *pid; + int (*break_test)(void *data); + void *break_data; + void (*progressbar)(void *data, int num); + void *progresscontext; +} PTCacheBaker; + /* Creating ID's */ void BKE_ptcache_id_from_softbody(PTCacheID *pid, struct Object *ob, struct SoftBody *sb); void BKE_ptcache_id_from_particles(PTCacheID *pid, struct Object *ob, struct ParticleSystem *psys); @@ -93,9 +136,9 @@ void BKE_ptcache_remove(void); /* ID specific functions */ void BKE_ptcache_id_clear(PTCacheID *id, int mode, int cfra); int BKE_ptcache_id_exist(PTCacheID *id, int cfra); -int BKE_ptcache_id_reset(PTCacheID *id, int mode); +int BKE_ptcache_id_reset(struct Scene *scene, PTCacheID *id, int mode); void BKE_ptcache_id_time(PTCacheID *pid, struct Scene *scene, float cfra, int *startframe, int *endframe, float *timescale); -int BKE_ptcache_object_reset(struct Object *ob, int mode); +int BKE_ptcache_object_reset(struct Scene *scene, struct Object *ob, int mode); /* File reading/writing */ PTCacheFile *BKE_ptcache_file_open(PTCacheID *id, int mode, int cfra); @@ -103,6 +146,10 @@ void BKE_ptcache_file_close(PTCacheFile *pf); int BKE_ptcache_file_read_floats(PTCacheFile *pf, float *f, int tot); int BKE_ptcache_file_write_floats(PTCacheFile *pf, float *f, int tot); +/* General cache reading/writing */ +int BKE_ptcache_read_cache(PTCacheReader *reader); +int BKE_ptcache_write_cache(PTCacheWriter *writer); + /* Continue physics */ void BKE_ptcache_set_continue_physics(struct Scene *scene, int enable); int BKE_ptcache_get_continue_physics(void); @@ -112,4 +159,9 @@ struct PointCache *BKE_ptcache_add(void); void BKE_ptcache_free(struct PointCache *cache); struct PointCache *BKE_ptcache_copy(struct PointCache *cache); +/* Baking */ +void BKE_ptcache_autocache_all(struct Scene *scene); +void BKE_ptcache_make_cache(struct PTCacheBaker* baker); +void BKE_ptcache_toggle_disk_cache(struct PTCacheID *pid); + #endif diff --git a/source/blender/blenkernel/BKE_utildefines.h b/source/blender/blenkernel/BKE_utildefines.h index 0bed2c095e2..f6c305b202d 100644 --- a/source/blender/blenkernel/BKE_utildefines.h +++ b/source/blender/blenkernel/BKE_utildefines.h @@ -131,7 +131,7 @@ #define IN_RANGE_INCL(a, b, c) ((b < c)? ((b<=a && a<=c)? 1:0) : ((c<=a && a<=b)? 1:0)) /* this weirdo pops up in two places ... */ -#if !defined(WIN32) && !defined(__BeOS) +#if !defined(WIN32) #ifndef O_BINARY #define O_BINARY 0 #endif @@ -149,12 +149,6 @@ #define ID_NEW(a) if( (a) && (a)->id.newid ) (a)= (void *)(a)->id.newid #define FORM MAKE_ID('F','O','R','M') -#define DDG1 MAKE_ID('3','D','G','1') -#define DDG2 MAKE_ID('3','D','G','2') -#define DDG3 MAKE_ID('3','D','G','3') -#define DDG4 MAKE_ID('3','D','G','4') - -#define GOUR MAKE_ID('G','O','U','R') #define BLEN MAKE_ID('B','L','E','N') #define DER_ MAKE_ID('D','E','R','_') diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c index 5fc7d18689d..d3d21018c1c 100644 --- a/source/blender/blenkernel/intern/blender.c +++ b/source/blender/blenkernel/intern/blender.c @@ -221,7 +221,6 @@ static void clear_global(void) { // extern short winqueue_break; /* screen.c */ -// XXX freeAllRad(); fastshade_free_render(); /* lamps hang otherwise */ free_main(G.main); /* free all lib data */ diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c index 8bb34bde122..b57b8b7a6da 100644 --- a/source/blender/blenkernel/intern/depsgraph.c +++ b/source/blender/blenkernel/intern/depsgraph.c @@ -1831,7 +1831,7 @@ static unsigned int flush_layer_node(Scene *sce, DagNode *node, int curtime) } /* node was checked to have lasttime != curtime , and is of type ID_OB */ -static void flush_pointcache_reset(DagNode *node, int curtime, int reset) +static void flush_pointcache_reset(Scene *scene, DagNode *node, int curtime, int reset) { DagAdjList *itA; Object *ob; @@ -1844,13 +1844,13 @@ static void flush_pointcache_reset(DagNode *node, int curtime, int reset) ob= (Object*)(node->ob); if(reset || (ob->recalc & OB_RECALC)) { - if(BKE_ptcache_object_reset(ob, PTCACHE_RESET_DEPSGRAPH)) + if(BKE_ptcache_object_reset(scene, ob, PTCACHE_RESET_DEPSGRAPH)) ob->recalc |= OB_RECALC_DATA; - flush_pointcache_reset(itA->node, curtime, 1); + flush_pointcache_reset(scene, itA->node, curtime, 1); } else - flush_pointcache_reset(itA->node, curtime, 0); + flush_pointcache_reset(scene, itA->node, curtime, 0); } } } @@ -1908,13 +1908,13 @@ void DAG_scene_flush_update(Scene *sce, unsigned int lay, int time) ob= (Object*)(itA->node->ob); if(ob->recalc & OB_RECALC) { - if(BKE_ptcache_object_reset(ob, PTCACHE_RESET_DEPSGRAPH)) + if(BKE_ptcache_object_reset(sce, ob, PTCACHE_RESET_DEPSGRAPH)) ob->recalc |= OB_RECALC_DATA; - flush_pointcache_reset(itA->node, lasttime, 1); + flush_pointcache_reset(sce, itA->node, lasttime, 1); } else - flush_pointcache_reset(itA->node, lasttime, 0); + flush_pointcache_reset(sce, itA->node, lasttime, 0); } } } @@ -2132,7 +2132,7 @@ void DAG_object_flush_update(Scene *sce, Object *ob, short flag) if(ob==NULL || sce->theDag==NULL) return; ob->recalc |= flag; - BKE_ptcache_object_reset(ob, PTCACHE_RESET_DEPSGRAPH); + BKE_ptcache_object_reset(sce, ob, PTCACHE_RESET_DEPSGRAPH); /* all users of this ob->data should be checked */ /* BUT! displists for curves are still only on cu */ @@ -2147,7 +2147,7 @@ void DAG_object_flush_update(Scene *sce, Object *ob, short flag) for (obt=G.main->object.first; obt; obt= obt->id.next) { if (obt != ob && obt->data==ob->data) { obt->recalc |= OB_RECALC_DATA; - BKE_ptcache_object_reset(obt, PTCACHE_RESET_DEPSGRAPH); + BKE_ptcache_object_reset(sce, obt, PTCACHE_RESET_DEPSGRAPH); } } } diff --git a/source/blender/blenkernel/intern/exotic.c b/source/blender/blenkernel/intern/exotic.c index 929d3f942dc..f15e1c24949 100644 --- a/source/blender/blenkernel/intern/exotic.c +++ b/source/blender/blenkernel/intern/exotic.c @@ -27,47 +27,7 @@ * * - Blender Foundation * - * ***** END GPL LICENSE BLOCK ***** - * - * eigen videoscape formaat: - * - * - * lamp: - * 3DG2 - aantal_lampen - - type - spsi spbl - r, g, b, energy - locx, locy, locz - vecx, vecy, vecz - - - curve / nurbs: - 3DG3 - 5 of 11 (curve of surf) - aantal_nurbs - extr1 extr2 - - mat[0][0] mat[0][1] mat[0][2] mat[0][3] - mat[1][0] mat[1][1] mat[1][2] mat[1][3] - ... - - type - pntsu, pntsv - resolu, resolv - orderu, orderv - flagu, flagv - - (als type==nurb) x y z w - x y z w - ... - (als type==bez) xyz xyz xyz h1 h2 h3 - xyz xyz xyz h1 h2 h3 - ... - * - * - */ + * ***** END GPL LICENSE BLOCK *****/ #include <ctype.h> /* isdigit, isspace */ @@ -482,385 +442,6 @@ static void read_stl_mesh_ascii(Scene *scene, char *str) #undef STLREADLINE #undef STLREADVERT -static void read_videoscape_mesh(Scene *scene, char *str) -{ - Object *ob; - Mesh *me; - MVert *mvert; - MFace *mface; - Material *ma; - FILE *fp; - float *vertdata, *vd, min[3], max[3], cent[3], ftemp; - unsigned int color[32], col; - int totcol, a, b, verts, tottria=0, totquad=0, totedge=0, poly, nr0, nr, first; - int end; - char s[50]; - - fp= fopen(str, "rb"); - if(fp==NULL) { - //XXX error("Can't read file"); - return; - } - - fscanf(fp, "%40s", s); - - fscanf(fp, "%d\n", &verts); - if(verts<=0) { - fclose(fp); - //XXX error("Read error"); - return; - } - - if(verts>MESH_MAX_VERTS) { - //XXX error("too many vertices"); - fclose(fp); - return; - } - - INIT_MINMAX(min, max); - vd= vertdata= MEM_mallocN(sizeof(float)*3*verts, "videoscapelezer"); - - for(a=0; a<verts; a++) { - fscanf(fp, "%f %f %f", vd, vd+1, vd+2); - DO_MINMAX(vd, min, max); - vd+=3; - } - - /* count faces and colors */ - for(a=0; a<32; a++) color[a]= 0; - totcol= 0; - end= 1; - while(end>0) { - end= fscanf(fp,"%d", &poly); - if(end<=0) break; - - if(poly==3) tottria++; - else if(poly==4) totquad++; - else totedge+= poly; - - for(a=0;a<poly;a++) { - end= fscanf(fp,"%d", &nr); - if(end<=0) break; - } - if(end<=0) break; - - end= fscanf(fp,"%i\n", &col); - col &= 0xF0F0F0; - for(a=0; a<totcol; a++) { - if(color[a]==col) break; - } - if(a>=totcol && totcol<32) { - color[totcol]= col; - totcol++; - } - } - - /* new object */ - ob= add_object(scene, OB_MESH); - me= ob->data; - me->totvert= verts; - me->totface= totedge+tottria+totquad; - - me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, - NULL, me->totvert); - me->mface= CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, - NULL, me->totface); - - /* colors */ - if(totcol) { - ob->mat= MEM_callocN(sizeof(void *)*totcol, "ob->mat"); - me->mat= MEM_callocN(sizeof(void *)*totcol, "me->mat"); - me->totcol= totcol; - ob->totcol= (unsigned char) me->totcol; - ob->actcol= 1; - } - - /* materials */ - for(a=0; a<totcol; a++) { - ma= G.main->mat.first; - while(ma) { - if(ma->mtex[0]==0) { - col= rgb_to_cpack(ma->r, ma->g, ma->b); - if(color[a]==col) { - me->mat[a]= ma; - ma->id.us++; - break; - } - } - ma= ma->id.next; - } - if(ma==0) { - ma= add_material("ext"); - me->mat[a]= ma; - cpack_to_rgb(color[a], cent, cent+1, cent+2); - ma->r= cent[0]; - ma->g= cent[1]; - ma->b= cent[2]; - automatname(ma); - } - } - - /* verts */ - - cent[0]= (min[0]+max[0])/2.0f; - cent[1]= (min[1]+max[1])/2.0f; - cent[2]= (min[2]+max[2])/2.0f; - VECCOPY(ob->loc, cent); - - a= me->totvert; - vd= vertdata; - mvert= me->mvert; - while(a--) { - VecSubf(mvert->co, vd, cent); - mvert++; - vd+= 3; - } - - /* faces */ - if(me->totface) { - rewind(fp); - - fscanf(fp, "%40s", s); - fscanf(fp, "%d\n", &verts); - /* fake read */ - for(a=0;a<verts;a++) { - fscanf(fp, "%f %f %f", &ftemp, &ftemp, &ftemp); - } - - a= me->totface; - mface= me->mface; - while(a--) { - end= fscanf(fp,"%d", &poly); - if(end<=0) break; - - if(poly==3 || poly==4) { - fscanf(fp,"%d", &nr); - mface->v1= MIN2(nr, me->totvert-1); - fscanf(fp,"%d", &nr); - mface->v2= MIN2(nr, me->totvert-1); - fscanf(fp,"%d", &nr); - mface->v3= MIN2(nr, me->totvert-1); - if(poly==4) { - if( fscanf(fp,"%d", &nr) <=0 ) break; - mface->v4= MIN2(nr, me->totvert-1); - } - - test_index_face(mface, NULL, 0, poly); - - mface++; - } - else { - if( fscanf(fp,"%d", &nr0) <=0) break; - first= nr0; - for(b=1; b<poly; b++) { - end= fscanf(fp,"%d", &nr); - if(end<=0) break; - nr= MIN2(nr, me->totvert-1); - mface->v1= nr; - mface->v2= nr0; - nr0= nr; - mface++; - a--; - } - mface->v1= first; - mface->v2= nr; - mface++; - if(end<=0) break; - } - end= fscanf(fp,"%i", &col); - col &= 0xF0F0F0; - if(end<=0) break; - - for(b=0; b<totcol; b++) { - if(color[b]==col) { - (mface-1)->mat_nr= b; - break; - } - } - } - } - - fclose(fp); - MEM_freeN(vertdata); - - mesh_add_normals_flags(me); - make_edges(me, 0); - - //XXX waitcursor(1); -} - -static void read_videoscape_lamp(Scene *scene, char *str) -{ - Object *ob; - Lamp *la; - FILE *fp; - float vec[3], q1[4]; - int tot, val; - char s[50]; - - fp= fopen(str, "rb"); - if(fp==NULL) { - //XXX error("Can't read file"); - return; - } - - fscanf(fp, "%40s", s); - fscanf(fp, "%d\n", &tot); - - while(tot--) { - ob= add_object(scene, OB_LAMP); - la= ob->data; - - fscanf(fp, "%d\n", &val); - la->type= val; - if(la->type==1) la->type= LA_SPOT; - else if(la->type==2) la->type= LA_SUN; - - fscanf(fp, "%f %f\n", &la->spotsize, &la->spotblend); - - fscanf(fp, "%f %f %f %f\n", &la->r, &la->g, &la->b, &la->energy); - - fscanf(fp, "%f %f %f\n", ob->loc, ob->loc+1, ob->loc+2); - val= fscanf(fp, "%f %f %f\n", vec, vec+1, vec+2); - vectoquat(vec, 5, 2, q1); - QuatToEul(q1, ob->rot); - - if(val<=0) break; - - } - fclose(fp); -} - -static void read_videoscape_nurbs(Scene *scene, char *str) -{ - Object *ob; - Curve *cu; - Nurb *nu; - BezTriple *bezt; - BPoint *bp; - FILE *fp; - float tmat[4][4], omat[3][3], imat[3][3], mat[3][3]; - int a, tot, type, val; - char s[50]; - - fp= fopen(str, "rb"); - if(fp==NULL) { - //XXX error("Can't read file"); - return; - } - - fscanf(fp, "%40s", s); - fscanf(fp, "%d\n", &type); - - if(type==5) ob= add_object(scene, OB_SURF); - else ob= add_object(scene, OB_CURVE); - cu= ob->data; - - fscanf(fp, "%d\n", &tot); - fscanf(fp, "%d %d\n", &type, &val); - - cu->ext1= 0.002f*type; - cu->ext2= 0.002f*val; - - for(a=0; a<4; a++) fscanf(fp, "%e %e %e %e\n", tmat[a], tmat[a]+1, tmat[a]+2, tmat[a]+3); - - VECCOPY(ob->loc, tmat[3]); - - Mat3CpyMat4(omat, tmat); - Mat3ToEul(omat, ob->rot); - EulToMat3(ob->rot, mat); - Mat3Inv(imat, mat); - Mat3MulMat3((float ( * )[3])tmat, imat, omat); - - while(tot--) { - nu= (Nurb*)MEM_callocN(sizeof(Nurb),"nu from exotic"); - BLI_addtail(&cu->nurb, nu); - - fscanf(fp, "%d\n", &type); - nu->type= type; - - fscanf(fp, "%d %d\n", &type, &val); - nu->pntsu= type; nu->pntsv= val; - fscanf(fp, "%d %d\n", &type, &val); - nu->resolu= type; nu->resolv= val; - fscanf(fp, "%d %d\n", &type, &val); - nu->orderu= type; nu->orderv= val; - fscanf(fp, "%d %d\n", &type, &val); - nu->flagu= type; nu->flagv= val; - - if( (nu->type & 7)==CU_BEZIER) { - a= nu->pntsu; - nu->bezt= bezt= MEM_callocN(a*sizeof(BezTriple), "bezt from exotic"); - while(a--) { - fscanf(fp, "%f %f %f ", bezt->vec[0], bezt->vec[0]+1, bezt->vec[0]+2); - Mat4MulVecfl(tmat, bezt->vec[0]); - fscanf(fp, "%f %f %f ", bezt->vec[1], bezt->vec[1]+1, bezt->vec[1]+2); - Mat4MulVecfl(tmat, bezt->vec[1]); - fscanf(fp, "%f %f %f ", bezt->vec[2], bezt->vec[2]+1, bezt->vec[2]+2); - Mat4MulVecfl(tmat, bezt->vec[2]); - fscanf(fp, "%d %d\n", &type, &val); - bezt->h1= type; - bezt->h2= val; - bezt++; - } - } - else { - a= nu->pntsu*nu->pntsv; - if(a) { - nu->bp= bp= MEM_callocN(a*sizeof(BPoint), "bp from exotic"); - while(a--) { - fscanf(fp, "%f %f %f %f\n", bp->vec, bp->vec+1, bp->vec+2, bp->vec+3); - Mat4MulVecfl(tmat, bp->vec); - bp++; - } - - val= KNOTSU(nu); - nu->knotsu= MEM_mallocN(sizeof(float)*val, "knots"); - for(a=0; a<val; a++) fscanf(fp, "%f\n", nu->knotsu+a); - - if(nu->pntsv>1) { - val= KNOTSV(nu); - nu->knotsv= MEM_mallocN(sizeof(float)*val, "knots"); - for(a=0; a<val; a++) fscanf(fp, "%f\n", nu->knotsv+a); - } - } - else { - BLI_remlink(&cu->nurb, nu); - MEM_freeN(nu); - } - } - } - fclose(fp); -} - -static void read_videoscape(Scene *scene, char *str) -{ - int file, type; - unsigned int val; - unsigned short numlen; - char name[FILE_MAXDIR+FILE_MAXFILE], head[FILE_MAXDIR+FILE_MAXFILE], tail[FILE_MAXFILE]; - - strcpy(name, str); - - while( TRUE ) { - file= open(name, O_BINARY|O_RDONLY); - if(file<=0) break; - else { - read(file, &type, 4); - close(file); - - if(type==DDG1) read_videoscape_mesh(scene, name); - else if(type==DDG2) read_videoscape_lamp(scene, name); - else if(type==DDG3) read_videoscape_nurbs(scene, name); - } - - val = BLI_stringdec(name, head, tail, &numlen); - BLI_stringenc(name, head, tail, numlen, val + 1); - - } -} - - /* ***************** INVENTOR ******************* */ @@ -2204,16 +1785,7 @@ int BKE_read_exotic(Scene *scene, char *name) if ((*s0 != FORM) && (strncmp(str, "BLEN", 4) != 0) && !BLI_testextensie(name,".blend.gz")) { //XXX waitcursor(1); - - if(ELEM4(*s0, DDG1, DDG2, DDG3, DDG4)) { - if(0) { // XXX obedit) { - //XXX error("Unable to perform function in EditMode"); - } else { - read_videoscape(scene, name); - retval = 1; - } - } - else if(strncmp(str, "#Inventor V1.0", 14)==0) { + if(strncmp(str, "#Inventor V1.0", 14)==0) { if( strncmp(str+15, "ascii", 5)==0) { read_inventor(scene, name, &lbase); displist_to_objects(scene, &lbase); @@ -2385,167 +1957,6 @@ void write_stl(Scene *scene, char *str) //XXX waitcursor(0); } -static void write_videoscape_mesh(Scene *scene, Object *ob, char *str) -{ - Mesh *me= ob->data; - EditMesh *em = BKE_mesh_get_editmesh(me); - Material *ma; - MFace *mface; - FILE *fp; - EditVert *eve; - EditFace *evl; - unsigned int kleur[32]; - float co[3]; - int a; - intptr_t tot; - char *cp; - - if(ob && ob->type==OB_MESH); - else { - return; - } - - kleur[0]= 0x00C0C0C0; - - cp= (char *)kleur; - for(a=0; a<ob->totcol; a++, cp+=4) { - - ma= give_current_material(ob, a+1); - if(ma) { - cp[0]= (unsigned char) (255.0*ma->emit); - cp[1]= (unsigned char) (255.0*ma->b); - cp[2]= (unsigned char) (255.0*ma->g); - cp[3]= (unsigned char) (255.0*ma->r); - if(ENDIAN_ORDER==L_ENDIAN) SWITCH_INT(kleur[a]); - } - else kleur[a]= 0x00C0C0C0; - - if(a>30) break; - } - - fp= fopen(str, "wb"); - if(fp==NULL) return; - - fprintf(fp,"3DG1\n"); - - if(em) { - - fprintf(fp, "%d\n", em->totvert); - - tot= 0; - eve= em->verts.first; - while(eve) { - VECCOPY(co, eve->co); - Mat4MulVecfl(ob->obmat, co); - fprintf(fp, "%f %f %f\n", co[0], co[1], co[2] ); - eve->tmp.l = tot; - tot++; - eve= eve->next; - } - evl= em->faces.first; - while(evl) { - - if(evl->v4==0) { - fprintf(fp, "3 %ld %ld %ld 0x%x\n", - (intptr_t) evl->v1->tmp.l, - (intptr_t) evl->v2->tmp.l, - (intptr_t) evl->v3->tmp.l, - kleur[evl->mat_nr]); - } - else { - fprintf(fp, "4 %ld %ld %ld %ld 0x%x\n", - (intptr_t) evl->v1->tmp.l, - (intptr_t) evl->v2->tmp.l, - (intptr_t) evl->v3->tmp.l, - (intptr_t) evl->v4->tmp.l, - kleur[evl->mat_nr]); - } - evl= evl->next; - } - } - else { - DerivedMesh *dm = mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH); - - me= ob->data; - - fprintf(fp, "%d\n", me->totvert); - - mface= me->mface; - for(a=0; a<me->totvert; a++) { - dm->getVertCo(dm, a, co); - Mat4MulVecfl(ob->obmat, co); - fprintf(fp, "%f %f %f\n", co[0], co[1], co[2] ); - } - for(a=0; a<me->totface; a++, mface++) { - if(mface->v4==0) { - fprintf(fp, "3 %d %d %d 0x%x\n", mface->v1, mface->v2, mface->v3, kleur[(int)mface->mat_nr]); - } - else { - fprintf(fp, "4 %d %d %d %d 0x%x\n", mface->v1, mface->v2, mface->v3, mface->v4, kleur[(int)mface->mat_nr]); - } - } - - dm->release(dm); - } - - fclose(fp); - - if (em) BKE_mesh_end_editmesh(me, em); - -} - - -void write_videoscape(Scene *scene, char *str) -{ - Base *base; - int file, val, lampdone=0; - unsigned short numlen; - char head[FILE_MAXFILE], tail[FILE_MAXFILE]; - - if(BLI_testextensie(str,".trace")) str[ strlen(str)-6]= 0; - if(BLI_testextensie(str,".blend")) str[ strlen(str)-6]= 0; - if(BLI_testextensie(str,".ble")) str[ strlen(str)-4]= 0; - if(BLI_testextensie(str,".obj")==0) strcat(str, ".obj"); - - file= open(str,O_BINARY|O_RDONLY); - close(file); - //XXX saveover() - // if(file>-1) if(!during_script() && saveover(str)==0) return; - - strcpy(temp_dir, str); - - base= scene->base.first; - while(base) { - if((base->flag & SELECT) && (base->lay & scene->lay)) { - if(base->object->type==OB_MESH) { - write_videoscape_mesh(scene, base->object, str); - val = BLI_stringdec(str, head, tail, &numlen); - BLI_stringenc(str, head, tail, numlen, val + 1); - } - else if(base->object->type==OB_CURVE || base->object->type==OB_SURF) { - /* write_videoscape_nurbs(base->object, str); */ - /* val = stringdec(str, head, tail, &numlen); */ - /* stringenc(str, head, tail, numlen, val + 1); */ - } - else if(lampdone==0 && base->object->type==OB_LAMP) { - /* lampdone= 1; */ - /* write_videoscape_lamps(str); */ - /* val = stringdec(str, head, tail, &numlen); */ - /* stringenc(str, head, tail, numlen, val + 1); */ - } - } - base= base->next; - } - - - /* remove when higher numbers exist */ - while(remove(str)==0) { - - val = BLI_stringdec(str, head, tail, &numlen); - BLI_stringenc(str, head, tail, numlen, val + 1); - } -} - /* ******************************* WRITE VRML ***************************** */ static void replace_chars(char *str1, char *str2) diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index b1387281cf5..5def910ddef 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -1270,8 +1270,10 @@ void multires_free(Multires *mr) if(lvl) { CustomData_free(&mr->vdata, lvl->totvert); CustomData_free(&mr->fdata, lvl->totface); - MEM_freeN(mr->edge_flags); - MEM_freeN(mr->edge_creases); + if(mr->edge_flags) + MEM_freeN(mr->edge_flags); + if(mr->edge_creases) + MEM_freeN(mr->edge_creases); } while(lvl) { diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index 34e69b2d736..5b3720cd6b0 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -222,6 +222,45 @@ short psys_get_current_num(Object *ob) return i; } +Object *psys_find_object(Scene *scene, ParticleSystem *psys) +{ + Base *base = scene->base.first; + ParticleSystem *tpsys; + + for(base = scene->base.first; base; base = base->next) { + for(tpsys = base->object->particlesystem.first; psys; psys=psys->next) { + if(tpsys == psys) + return base->object; + } + } + + return NULL; +} +int psys_count_autocache(Scene *scene, ParticleSettings *part) +{ + Base *base = scene->base.first; + ParticleSystem *psys; + PTCacheID pid; + int autocache_count= 0; + + for(base = scene->base.first; base; base = base->next) { + for(psys = base->object->particlesystem.first; psys; psys=psys->next) { + if(part && psys->part != part) + continue; + + BKE_ptcache_id_from_particles(&pid, base->object, psys); + + if((psys->pointcache->flag & PTCACHE_BAKED) + || (psys->pointcache->flag & PTCACHE_AUTOCACHE)==0) + continue; + + if((psys->pointcache->flag & PTCACHE_OUTDATED) + || BKE_ptcache_id_exist(&pid, CFRA)==0) + autocache_count++; + } + } + return autocache_count; +} /* change object's active particle system */ void psys_change_act(void *ob_v, void *act_v) { @@ -864,7 +903,7 @@ static void weighted_particle_vector(float *v1, float *v2, float *v3, float *v4, vec[1]= weights[0]*v1[1] + weights[1]*v2[1] + weights[2]*v3[1] + weights[3]*v4[1]; vec[2]= weights[0]*v1[2] + weights[1]*v2[2] + weights[2]*v3[2] + weights[3]*v4[2]; } -static void interpolate_particle(short type, ParticleKey keys[4], float dt, ParticleKey *result, int velocity) +void psys_interpolate_particle(short type, ParticleKey keys[4], float dt, ParticleKey *result, int velocity) { float t[4]; @@ -2569,7 +2608,7 @@ void psys_cache_paths(Scene *scene, Object *ob, ParticleSystem *psys, float cfra } /* now we should have in chronologiacl order k1<=k2<=t<=k3<=k4 with keytime between [0,1]->[k2,k3] (k1 & k4 used for cardinal & bspline interpolation)*/ - interpolate_particle((psys->flag & PSYS_KEYED) ? -1 /* signal for cubic interpolation */ + psys_interpolate_particle((psys->flag & PSYS_KEYED) ? -1 /* signal for cubic interpolation */ : ((psys->part->flag & PART_HAIR_BSPLINE) ? KEY_BSPLINE : KEY_CARDINAL) ,keys, keytime, &result, 0); @@ -3062,7 +3101,6 @@ void make_local_particlesettings(ParticleSettings *part) } } } - void psys_flush_particle_settings(Scene *scene, ParticleSettings *part, int recalc) { Base *base = scene->base.first; @@ -3495,7 +3533,7 @@ void psys_get_particle_on_path(Scene *scene, Object *ob, ParticleSystem *psys, i QuatInterpol(state->rot,keys[1].rot,keys[2].rot,keytime); } - interpolate_particle((psys->flag & PSYS_KEYED) ? -1 /* signal for cubic interpolation */ + psys_interpolate_particle((psys->flag & PSYS_KEYED) ? -1 /* signal for cubic interpolation */ : ((psys->part->flag & PART_HAIR_BSPLINE) ? KEY_BSPLINE : KEY_CARDINAL) ,keys, keytime, state, 1); @@ -3776,7 +3814,7 @@ int psys_get_particle_state(struct Scene *scene, Object *ob, ParticleSystem *psy VecMulf(keys[1].vel, dfra / frs_sec); VecMulf(keys[2].vel, dfra / frs_sec); - interpolate_particle(-1, keys, keytime, state, 1); + psys_interpolate_particle(-1, keys, keytime, state, 1); /* convert back to real velocity */ VecMulf(state->vel, frs_sec / dfra); diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index 52f13eeadb8..fc6413849d1 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -104,7 +104,8 @@ static int get_current_display_percentage(ParticleSystem *psys) { ParticleSettings *part=psys->part; - if(psys->renderdata || (part->child_nbr && part->childtype)) + if(psys->renderdata || (part->child_nbr && part->childtype) + || (psys->pointcache->flag & PTCACHE_BAKING)) return 100; if(part->phystype==PART_PHYS_KEYED){ @@ -2195,57 +2196,80 @@ void psys_get_reactor_target(Object *ob, ParticleSystem *psys, Object **target_o /************************************************/ /* Point Cache */ /************************************************/ - -static void write_particles_to_cache(Object *ob, ParticleSystem *psys, int cfra) +void psys_get_pointcache_start_end(Scene *scene, ParticleSystem *psys, int *sfra, int *efra) { - PTCacheID pid; - PTCacheFile *pf; - ParticleData *pa; - int i, totpart= psys->totpart; + ParticleSettings *part = psys->part; - if(totpart == 0) - return; + *sfra = MAX2(1, (int)part->sta); + *efra = MIN2((int)(part->end + part->lifetime + 1.0), scene->r.efra); +} +static float *particle_state_ptr(int index, ParticleSystem *psys) +{ + return (float *)(&(psys->particles+index)->state); +} +static void particle_read_state(int index, ParticleSystem *psys, float *data) +{ + ParticleData *pa = psys->particles + index; + ParticleKey *key = (ParticleKey *)data; - BKE_ptcache_id_from_particles(&pid, ob, psys); - pf= BKE_ptcache_file_open(&pid, PTCACHE_FILE_WRITE, cfra); - if(!pf) - return; + if(key->time > pa->state.time) + copy_particle_key(&pa->prev_state, &pa->state, 1); - /* assuming struct consists of tightly packed floats */ - for(i=0, pa=psys->particles; i<totpart; i++, pa++) - BKE_ptcache_file_write_floats(pf, (float*)&pa->state, sizeof(ParticleKey)/sizeof(float)); - - BKE_ptcache_file_close(pf); + copy_particle_key(&pa->state, key, 1); } +static void particle_cache_interpolate(int index, ParticleSystem *psys, float frs_sec, float cfra, int cfra1, int cfra2, float *data1, float *data2) +{ + ParticleData *pa = psys->particles + index; + ParticleKey keys[4]; + float dfra; + + keys[1] = *((ParticleKey*)data1); + keys[2] = *((ParticleKey*)data2); + + dfra = keys[2].time - keys[1].time; -static int get_particles_from_cache(Object *ob, ParticleSystem *psys, int cfra) + VecMulf(keys[1].vel, dfra / frs_sec); + VecMulf(keys[2].vel, dfra / frs_sec); + + psys_interpolate_particle(-1, keys, (keys[1].time - cfra) / dfra, &pa->state, 1); + + VecMulf(pa->state.vel, frs_sec / dfra); +} +static void write_particles_to_cache(Object *ob, ParticleSystem *psys, int cfra) { + PTCacheWriter writer; PTCacheID pid; - PTCacheFile *pf; - ParticleData *pa; - int i, totpart= psys->totpart; - - if(totpart == 0) - return 0; BKE_ptcache_id_from_particles(&pid, ob, psys); - pf= BKE_ptcache_file_open(&pid, PTCACHE_FILE_READ, cfra); - if(!pf) - return 0; - /* assuming struct consists of tightly packed floats */ - for(i=0, pa=psys->particles; i<totpart; i++, pa++) { - if(cfra!=pa->state.time) - copy_particle_key(&pa->prev_state,&pa->state,1); - if(!BKE_ptcache_file_read_floats(pf, (float*)&pa->state, sizeof(ParticleKey)/sizeof(float))) { - BKE_ptcache_file_close(pf); - return 0; - } - } + writer.calldata = psys; + writer.cfra = cfra; + writer.elem_ptr = particle_state_ptr; + writer.pid = &pid; + writer.totelem = psys->totpart; - BKE_ptcache_file_close(pf); + BKE_ptcache_write_cache(&writer); +} - return 1; +static int get_particles_from_cache(Scene *scene, Object *ob, ParticleSystem *psys, float cfra, int allow_interpolate, int allow_old, int *old_frame) +{ + PTCacheReader reader; + PTCacheID pid; + + BKE_ptcache_id_from_particles(&pid, ob, psys); + + reader.allow_interpolate = allow_interpolate; + reader.allow_old = allow_old; + reader.calldata = psys; + reader.cfra = cfra; + reader.interpolate_elem = particle_cache_interpolate; + reader.old_frame = old_frame; + reader.pid = &pid; + reader.scene = scene; + reader.set_elem = particle_read_state; + reader.totelem = psys->totpart; + + return BKE_ptcache_read_cache(&reader); } /************************************************/ @@ -4085,7 +4109,7 @@ static void dynamics_step(Scene *scene, Object *ob, ParticleSystem *psys, Partic /* main loop: calculate physics for all particles */ for(p=0, pa=psys->particles; p<totpart; p++,pa++){ - if(pa->flag & PARS_UNEXIST) continue; + if(pa->flag & (PARS_UNEXIST+PARS_NO_DISP)) continue; copy_particle_key(&pa->prev_state,&pa->state,1); @@ -4110,25 +4134,26 @@ static void dynamics_step(Scene *scene, Object *ob, ParticleSystem *psys, Partic if(pa->alive==PARS_UNBORN || pa->alive==PARS_KILLED || ELEM(part->phystype,PART_PHYS_NO,PART_PHYS_KEYED) - || birthtime >= cfra){ + || birthtime >= psys->cfra){ reset_particle(scene, pa,psys,psmd,ob,dtime,cfra,vg_vel,vg_tan,vg_rot); } pa_dfra = dfra; pa_dtime = dtime; - if(birthtime <= cfra && birthtime >= psys->cfra){ + + if(dietime <= cfra && psys->cfra < dietime){ + /* particle dies some time between this and last step */ + pa_dfra = dietime - ((birthtime > psys->cfra) ? birthtime : psys->cfra); + pa_dtime = pa_dfra * timestep; + pa->alive = PARS_DYING; + } + else if(birthtime <= cfra && birthtime >= psys->cfra){ /* particle is born some time between this and last step*/ pa->alive = PARS_ALIVE; pa_dfra = cfra - birthtime; pa_dtime = pa_dfra*timestep; } - else if(dietime <= cfra && psys->cfra < dietime){ - /* particle dies some time between this and last step */ - pa_dfra = dietime - psys->cfra; - pa_dtime = pa_dfra * timestep; - pa->alive = PARS_DYING; - } else if(dietime < cfra){ /* nothing to be done when particle is dead */ } @@ -4520,7 +4545,7 @@ static void system_step(Scene *scene, Object *ob, ParticleSystem *psys, Particle int totpart, oldtotpart, totchild, oldtotchild, p; float disp, *vg_vel= 0, *vg_tan= 0, *vg_rot= 0, *vg_size= 0; int init= 0, distr= 0, alloc= 0, usecache= 0, only_children_changed= 0; - int framenr, framedelta, startframe, endframe; + int framenr, framedelta, startframe, endframe, old_framenr; part= psys->part; cache= psys->pointcache; @@ -4528,6 +4553,10 @@ static void system_step(Scene *scene, Object *ob, ParticleSystem *psys, Particle framenr= (int)scene->r.cfra; framedelta= framenr - cache->simframe; + /* set suitable cache range automatically */ + if((cache->flag & (PTCACHE_BAKING|PTCACHE_BAKED))==0) + psys_get_pointcache_start_end(scene, psys, &cache->startframe, &cache->endframe); + BKE_ptcache_id_from_particles(&pid, ob, psys); BKE_ptcache_id_time(&pid, scene, 0.0f, &startframe, &endframe, NULL); @@ -4600,9 +4629,13 @@ static void system_step(Scene *scene, Object *ob, ParticleSystem *psys, Particle if(init) { if(distr) { - if(alloc) + if(alloc) { realloc_particles(ob, psys, totpart); + if(usecache) + BKE_ptcache_id_clear(&pid, PTCACHE_CLEAR_ALL, 0); + } + distribute_particles(scene, ob, psys, part->from); if((psys->part->type == PART_HAIR) && !(psys->flag & PSYS_HAIR_DONE)) @@ -4616,9 +4649,11 @@ static void system_step(Scene *scene, Object *ob, ParticleSystem *psys, Particle free_keyed_keys(psys); initialize_all_particles(ob, psys, psmd); + - if(alloc) + if(alloc) { reset_all_particles(scene, ob, psys, psmd, 0.0, cfra, oldtotpart); + } } /* flag for possible explode modifiers after this system */ @@ -4627,25 +4662,47 @@ static void system_step(Scene *scene, Object *ob, ParticleSystem *psys, Particle /* try to read from the cache */ if(usecache) { - if(get_particles_from_cache(ob, psys, framenr)) { - if(part->phystype==PART_PHYS_KEYED && psys->flag&PSYS_FIRST_KEYED) { - psys_count_keyed_targets(ob,psys); - set_keyed_keys(scene, ob, psys); - } + int result = get_particles_from_cache(scene, ob, psys, (float)framenr, 0, 1, &old_framenr); + + if(result == PTCACHE_READ_EXACT) { + //if(part->phystype==PART_PHYS_KEYED && psys->flag&PSYS_FIRST_KEYED) { + // psys_count_keyed_targets(ob,psys); + // set_keyed_keys(scene, ob, psys); + //} cached_step(scene, ob, psmd, psys, cfra); psys->cfra=cfra; psys->recalc = 0; - if(part->phystype==PART_PHYS_KEYED && psys->flag&PSYS_FIRST_KEYED) { - psys_update_path_cache(scene, ob, psmd, psys, framenr); - } + //if(part->phystype==PART_PHYS_KEYED && psys->flag&PSYS_FIRST_KEYED) { + // psys_update_path_cache(scene, ob, psmd, psys, framenr); + //} cache->simframe= framenr; cache->flag |= PTCACHE_SIMULATION_VALID; + if(cache->flag & PTCACHE_OUTDATED) + BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_FREE); + return; } + else if((cache->flag & PTCACHE_AUTOCACHE)==0 && result==PTCACHE_READ_OLD) { + /* clear cache after current frame */ + BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_FREE); + + /* set old cfra */ + psys->cfra = (float)old_framenr; + + for(p=0, pa=psys->particles; p<totpart; p++, pa++) { + /* update alive status */ + if(pa->time > psys->cfra) + pa->alive = PARS_UNBORN; + else if(pa->dietime <= psys->cfra) + pa->alive = PARS_DEAD; + else + pa->alive = PARS_ALIVE; + } + } else if(ob->id.lib || (cache->flag & PTCACHE_BAKED)) { psys_reset(psys, PSYS_RESET_CACHE_MISS); psys->cfra=cfra; @@ -4653,8 +4710,10 @@ static void system_step(Scene *scene, Object *ob, ParticleSystem *psys, Particle return; } - if(framenr != startframe && framedelta != 1) { - psys_reset(psys, PSYS_RESET_CACHE_MISS); + if(framenr != startframe && framedelta != 1 && cache->flag & PTCACHE_AUTOCACHE) { + //psys_reset(psys, PSYS_RESET_CACHE_MISS); + /* make sure cache is recalculated */ + BKE_ptcache_id_clear(&pid, PTCACHE_CLEAR_FRAME, (int)cfra); psys->cfra = cfra; psys->recalc = 0; return; @@ -4663,10 +4722,11 @@ static void system_step(Scene *scene, Object *ob, ParticleSystem *psys, Particle else { cache->flag &= ~PTCACHE_SIMULATION_VALID; cache->simframe= 0; + cache->last_exact= 0; } /* if on second frame, write cache for first frame */ - if(usecache && framenr == startframe+1) + if(usecache && psys->cfra == startframe && (cache->flag & PTCACHE_OUTDATED || cache->last_exact==0)) write_particles_to_cache(ob, psys, startframe); if(part->phystype==PART_PHYS_KEYED && psys->flag&PSYS_FIRST_KEYED) @@ -4768,8 +4828,7 @@ static void psys_to_softbody(Scene *scene, Object *ob, ParticleSystem *psys) static int hair_needs_recalc(ParticleSystem *psys) { if((psys->flag & PSYS_EDITED)==0 && - ((psys->flag & PSYS_HAIR_DONE)==0 || psys->recalc & PSYS_RECALC_REDO)) { - psys->recalc &= ~PSYS_RECALC_REDO; + ((psys->flag & PSYS_HAIR_DONE)==0 || psys->recalc & PSYS_RECALC_RESET)) { return 1; } diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c index b00755f7135..f59336518d7 100644 --- a/source/blender/blenkernel/intern/pointcache.c +++ b/source/blender/blenkernel/intern/pointcache.c @@ -51,9 +51,11 @@ #include "BKE_object.h" #include "BKE_particle.h" #include "BKE_pointcache.h" +#include "BKE_scene.h" #include "BKE_softbody.h" #include "BKE_utildefines.h" +#include "BLI_blenlib.h" /* needed for directory lookup */ #ifndef WIN32 @@ -213,21 +215,29 @@ static int BKE_ptcache_id_filename(PTCacheID *pid, char *filename, int cfra, sho filename[0] = '\0'; newname = filename; - /*if (!G.relbase_valid) return 0; *//* save blend file before using pointcache */ + if (!G.relbase_valid) return 0; /* save blend file before using disk pointcache */ /* start with temp dir */ if (do_path) { len = ptcache_path(pid, filename); newname += len; } - idname = (pid->ob->id.name+2); - /* convert chars to hex so they are always a valid filename */ - while('\0' != *idname) { - snprintf(newname, MAX_PTCACHE_FILE, "%02X", (char)(*idname++)); - newname+=2; - len += 2; + if(strcmp(pid->cache->name, "")==0) { + idname = (pid->ob->id.name+2); + /* convert chars to hex so they are always a valid filename */ + while('\0' != *idname) { + snprintf(newname, MAX_PTCACHE_FILE, "%02X", (char)(*idname++)); + newname+=2; + len += 2; + } } - + else { + int temp = strlen(pid->cache->name); + strcpy(newname, pid->cache->name); + newname+=temp; + len += temp; + } + if (do_ext) { snprintf(newname, MAX_PTCACHE_FILE, "_%06d_%02d"PTCACHE_EXT, cfra, pid->stack_index); /* always 6 chars */ len += 16; @@ -247,7 +257,7 @@ PTCacheFile *BKE_ptcache_file_open(PTCacheID *pid, int mode, int cfra) if(pid->ob->id.lib && mode == PTCACHE_FILE_WRITE) return NULL; - /*if (!G.relbase_valid) return NULL; *//* save blend file before using pointcache */ + if (!G.relbase_valid) return NULL; /* save blend file before using disk pointcache */ BKE_ptcache_id_filename(pid, filename, cfra, 1, 1); @@ -286,6 +296,323 @@ int BKE_ptcache_file_write_floats(PTCacheFile *pf, float *f, int tot) return (fwrite(f, sizeof(float), tot, pf->fp) == tot); } +static int ptcache_pid_elemsize(PTCacheID *pid) +{ + if(pid->type==PTCACHE_TYPE_SOFTBODY) + return 0; // TODO + else if(pid->type==PTCACHE_TYPE_PARTICLES) + return sizeof(ParticleKey); + else if(pid->type==PTCACHE_TYPE_CLOTH) + return 0; // TODO + + return 0; +} +static int ptcache_pid_totelem(PTCacheID *pid) +{ + if(pid->type==PTCACHE_TYPE_SOFTBODY) + return 0; // TODO + else if(pid->type==PTCACHE_TYPE_PARTICLES) { + ParticleSystem *psys = pid->data; + return psys->totpart; + } + else if(pid->type==PTCACHE_TYPE_CLOTH) + return 0; // TODO + + return 0; +} + +void ptcache_update_info(PTCacheID *pid) +{ + PointCache *cache = pid->cache; + int totframes = 0; + + if(cache->flag & PTCACHE_DISK_CACHE) { + int cfra = cache->startframe; + + for(; cfra<=cache->endframe; cfra++) { + if(BKE_ptcache_id_exist(pid, cfra)) + totframes++; + } + + sprintf(cache->info, "%i frames on disk.", totframes); + } + else { + PTCacheMem *pm = cache->mem_cache.first; + float framesize = 0.0f, bytes = 0.0f; + int mb; + + if(pm) + framesize = (float)ptcache_pid_elemsize(pid) * (float)pm->totpoint; + + for(; pm; pm=pm->next) + totframes++; + + bytes = totframes * framesize; + + mb = (bytes > 1024.0f * 1024.0f); + + sprintf(cache->info, "%i frames in memory (%.1f %s).", + totframes, + bytes / (mb ? 1024.0f * 1024.0f : 1024.0f), + mb ? "Mb" : "kb"); + } +} +/* reads cache from disk or memory */ +/* possible to get old or interpolated result */ +int BKE_ptcache_read_cache(PTCacheReader *reader) +{ + PTCacheID *pid = reader->pid; + PTCacheFile *pf=NULL, *pf2=NULL; + PTCacheMem *pm=NULL, *pm2=NULL; + int totelem = reader->totelem; + float cfra = reader->cfra; + int cfrai = (int)cfra; + int elemsize = ptcache_pid_elemsize(pid); + int i, incr = elemsize / sizeof(float); + float frs_sec = reader->scene->r.frs_sec; + + if(totelem == 0) + return 0; + + /* first check if we have the actual frame cached */ + if(cfra == (float)cfrai) { + if(pid->cache->flag & PTCACHE_DISK_CACHE) { + pf= BKE_ptcache_file_open(pid, PTCACHE_FILE_READ, cfrai); + } + else { + pm = pid->cache->mem_cache.first; + + for(; pm; pm=pm->next) { + if(pm->frame == cfrai) + break; + } + } + } + + /* if found, use exact frame */ + if(pf || pm) { + float *data; + + if(pm) + data = pm->data; + else + data = MEM_callocN(elemsize, "pointcache read data"); + + for(i=0; i<totelem; i++) { + if(pf) { + if(!BKE_ptcache_file_read_floats(pf, data, incr)) { + BKE_ptcache_file_close(pf); + MEM_freeN(data); + return 0; + } + + reader->set_elem(i, reader->calldata, data); + } + else { + reader->set_elem(i, reader->calldata, data); + data += incr; + } + } + + if(pf) { + BKE_ptcache_file_close(pf); + MEM_freeN(data); + } + + return PTCACHE_READ_EXACT; + } + /* no exact cache frame found so try to find cached frames around cfra */ + if(reader->allow_interpolate || reader->allow_old) { + int cfra1, cfra2; + + if(pid->cache->flag & PTCACHE_DISK_CACHE) { + pf=NULL; + while(cfrai > pid->cache->startframe && !pf) { + cfrai--; + pf= BKE_ptcache_file_open(pid, PTCACHE_FILE_READ, cfrai); + cfra1 = cfrai; + } + + *(reader->old_frame) = cfrai; + + cfrai = (int)cfra; + while(cfrai < pid->cache->endframe && !pf2) { + cfrai++; + pf2= BKE_ptcache_file_open(pid, PTCACHE_FILE_READ, cfrai); + cfra2 = cfrai; + } + } + else if(pid->cache->mem_cache.first){ + pm = pid->cache->mem_cache.first; + + while(pm->next && pm->next->frame < cfra) + pm= pm->next; + + if(pm) { + *(reader->old_frame) = pm->frame; + cfra1 = pm->frame; + } + + pm2 = pid->cache->mem_cache.last; + + while(pm2->prev && pm2->frame > cfra) + pm2= pm2->prev; + + if(pm2) + cfra2 = pm2->frame; + } + + if(reader->allow_interpolate && ((pf && pf2) || (pm && pm2))) { + /* interpolate from nearest frames */ + float *data1, *data2; + + if(pm) { + data1 = pm->data; + data2 = pm2->data; + } + else { + data1 = MEM_callocN(elemsize, "pointcache read data1"); + data2 = MEM_callocN(elemsize, "pointcache read data2"); + } + + for(i=0; i<totelem; i++) { + if(pf && pf2) { + if(!BKE_ptcache_file_read_floats(pf, data1, incr)) { + BKE_ptcache_file_close(pf); + BKE_ptcache_file_close(pf2); + MEM_freeN(data1); + MEM_freeN(data2); + return 0; + } + if(!BKE_ptcache_file_read_floats(pf2, data2, incr)) { + BKE_ptcache_file_close(pf); + BKE_ptcache_file_close(pf2); + MEM_freeN(data1); + MEM_freeN(data2); + return 0; + } + reader->interpolate_elem(i, reader->calldata, frs_sec, cfra, cfra1, cfra2, data1, data2); + } + else { + reader->interpolate_elem(i, reader->calldata, frs_sec, cfra, cfra1, cfra2, data1, data2); + data1 += incr; + data2 += incr; + } + } + + if(pf) { + BKE_ptcache_file_close(pf); + BKE_ptcache_file_close(pf2); + MEM_freeN(data1); + MEM_freeN(data2); + } + + return PTCACHE_READ_INTERPOLATED; + } + else if(reader->allow_old && (pf || pm)) { + /* use last valid cache frame */ + float *data; + + if(pm) + data = pm->data; + else + data = MEM_callocN(elemsize, "pointcache read data"); + + for(i=0; i<totelem; i++) { + if(pf) { + if(!BKE_ptcache_file_read_floats(pf, data, incr)) { + BKE_ptcache_file_close(pf); + if(pf2) + BKE_ptcache_file_close(pf2); + return 0; + } + reader->set_elem(i, reader->calldata, data); + } + else { + reader->set_elem(i, reader->calldata, data); + data += incr; + } + } + + if(pf) { + BKE_ptcache_file_close(pf); + MEM_freeN(data); + } + if(pf2) + BKE_ptcache_file_close(pf2); + + return PTCACHE_READ_OLD; + } + } + + if(pf) + BKE_ptcache_file_close(pf); + if(pf2) + BKE_ptcache_file_close(pf2); + + return 0; +} +/* writes cache to disk or memory */ +int BKE_ptcache_write_cache(PTCacheWriter *writer) +{ + PointCache *cache = writer->pid->cache; + PTCacheFile *pf= NULL; + int elemsize = ptcache_pid_elemsize(writer->pid); + int i, incr = elemsize / sizeof(float); + + if(writer->totelem == 0 || writer->cfra <= 0) + return 0; + + if(cache->flag & PTCACHE_DISK_CACHE) { + pf = BKE_ptcache_file_open(writer->pid, PTCACHE_FILE_WRITE, writer->cfra); + if(!pf) + return 0; + + for(i=0; i<writer->totelem; i++) + BKE_ptcache_file_write_floats(pf, writer->elem_ptr(i, writer->calldata), incr); + } + else { + PTCacheMem *pm = MEM_callocN(sizeof(PTCacheMem), "Pointcache mem"); + PTCacheMem *pm2; + float *pmdata; + + pm->data = MEM_callocN(elemsize * writer->totelem, "Pointcache mem data"); + pmdata = pm->data; + + for(i=0; i<writer->totelem; i++, pmdata+=incr) + memcpy(pmdata, writer->elem_ptr(i, writer->calldata), elemsize); + + pm->frame = writer->cfra; + pm->totpoint = writer->totelem; + + /* find add location */ + pm2 = cache->mem_cache.first; + if(!pm2) + BLI_addtail(&cache->mem_cache, pm); + else if(pm2->frame == writer->cfra) { + /* overwrite same frame */ + MEM_freeN(pm2->data); + pm2->data = pm->data; + MEM_freeN(pm); + } + else { + while(pm2->next && pm2->next->frame < writer->cfra) + pm2 = pm2->next; + + BLI_insertlinkafter(&cache->mem_cache, pm2, pm); + } + } + + if(writer->cfra - cache->last_exact == 1) + cache->last_exact = writer->cfra; + + if(pf) + BKE_ptcache_file_close(pf); + + ptcache_update_info(writer->pid); + + return 1; +} /* youll need to close yourself after! * mode - PTCACHE_CLEAR_ALL, @@ -317,62 +644,116 @@ void BKE_ptcache_id_clear(PTCacheID *pid, int mode, int cfra) case PTCACHE_CLEAR_ALL: case PTCACHE_CLEAR_BEFORE: case PTCACHE_CLEAR_AFTER: - ptcache_path(pid, path); - - len = BKE_ptcache_id_filename(pid, filename, cfra, 0, 0); /* no path */ - - dir = opendir(path); - if (dir==NULL) - return; - - snprintf(ext, sizeof(ext), "_%02d"PTCACHE_EXT, pid->stack_index); - - while ((de = readdir(dir)) != NULL) { - if (strstr(de->d_name, ext)) { /* do we have the right extension?*/ - if (strncmp(filename, de->d_name, len ) == 0) { /* do we have the right prefix */ - if (mode == PTCACHE_CLEAR_ALL) { - BLI_join_dirfile(path_full, path, de->d_name); - BLI_delete(path_full, 0, 0); - } else { - /* read the number of the file */ - int frame, len2 = strlen(de->d_name); - char num[7]; - - if (len2 > 15) { /* could crash if trying to copy a string out of this range*/ - BLI_strncpy(num, de->d_name + (strlen(de->d_name) - 15), sizeof(num)); - frame = atoi(num); - - if((mode==PTCACHE_CLEAR_BEFORE && frame < cfra) || - (mode==PTCACHE_CLEAR_AFTER && frame > cfra) ) { + if(pid->cache->flag & PTCACHE_DISK_CACHE) { + ptcache_path(pid, path); + + len = BKE_ptcache_id_filename(pid, filename, cfra, 0, 0); /* no path */ + + dir = opendir(path); + if (dir==NULL) + return; + + snprintf(ext, sizeof(ext), "_%02d"PTCACHE_EXT, pid->stack_index); + + while ((de = readdir(dir)) != NULL) { + if (strstr(de->d_name, ext)) { /* do we have the right extension?*/ + if (strncmp(filename, de->d_name, len ) == 0) { /* do we have the right prefix */ + if (mode == PTCACHE_CLEAR_ALL) { + pid->cache->last_exact = 0; + BLI_join_dirfile(path_full, path, de->d_name); + BLI_delete(path_full, 0, 0); + } else { + /* read the number of the file */ + int frame, len2 = strlen(de->d_name); + char num[7]; + + if (len2 > 15) { /* could crash if trying to copy a string out of this range*/ + BLI_strncpy(num, de->d_name + (strlen(de->d_name) - 15), sizeof(num)); + frame = atoi(num); - BLI_join_dirfile(path_full, path, de->d_name); - BLI_delete(path_full, 0, 0); + if((mode==PTCACHE_CLEAR_BEFORE && frame < cfra) || + (mode==PTCACHE_CLEAR_AFTER && frame > cfra) ) { + + BLI_join_dirfile(path_full, path, de->d_name); + BLI_delete(path_full, 0, 0); + } } } } } } + closedir(dir); + } + else { + PTCacheMem *pm= pid->cache->mem_cache.first; + PTCacheMem *link= NULL; + + if(mode == PTCACHE_CLEAR_ALL) { + pid->cache->last_exact = 0; + for(; pm; pm=pm->next) + MEM_freeN(pm->data); + BLI_freelistN(&pid->cache->mem_cache); + } else { + while(pm) { + if((mode==PTCACHE_CLEAR_BEFORE && pm->frame < cfra) || + (mode==PTCACHE_CLEAR_AFTER && pm->frame > cfra) ) { + link = pm; + pm = pm->next; + MEM_freeN(link->data); + BLI_freelinkN(&pid->cache->mem_cache, link); + } + else + pm = pm->next; + } + } } - closedir(dir); break; case PTCACHE_CLEAR_FRAME: - len = BKE_ptcache_id_filename(pid, filename, cfra, 1, 1); /* no path */ - BLI_delete(filename, 0, 0); + if(pid->cache->flag & PTCACHE_DISK_CACHE) { + if(BKE_ptcache_id_exist(pid, cfra)) { + BKE_ptcache_id_filename(pid, filename, cfra, 1, 1); /* no path */ + BLI_delete(filename, 0, 0); + } + } + else { + PTCacheMem *pm = pid->cache->mem_cache.first; + + for(; pm; pm=pm->next) { + if(pm->frame == cfra) { + MEM_freeN(pm->data); + BLI_freelinkN(&pid->cache->mem_cache, pm); + break; + } + } + } break; } + + ptcache_update_info(pid); } int BKE_ptcache_id_exist(PTCacheID *pid, int cfra) { - char filename[MAX_PTCACHE_FILE]; - if(!pid->cache) return 0; - BKE_ptcache_id_filename(pid, filename, cfra, 1, 1); + if(pid->cache->flag & PTCACHE_DISK_CACHE) { + char filename[MAX_PTCACHE_FILE]; + + BKE_ptcache_id_filename(pid, filename, cfra, 1, 1); - return BLI_exists(filename); + return BLI_exists(filename); + } + else { + PTCacheMem *pm = pid->cache->mem_cache.first; + + for(; pm; pm=pm->next) { + if(pm->frame==cfra) + return 1; + } + return 0; + } } void BKE_ptcache_id_time(PTCacheID *pid, Scene *scene, float cfra, int *startframe, int *endframe, float *timescale) @@ -414,10 +795,10 @@ void BKE_ptcache_id_time(PTCacheID *pid, Scene *scene, float cfra, int *startfra } } -int BKE_ptcache_id_reset(PTCacheID *pid, int mode) +int BKE_ptcache_id_reset(Scene *scene, PTCacheID *pid, int mode) { PointCache *cache; - int reset, clear; + int reset, clear, current, after; if(!pid->cache) return 0; @@ -425,11 +806,20 @@ int BKE_ptcache_id_reset(PTCacheID *pid, int mode) cache= pid->cache; reset= 0; clear= 0; + current= 0; + after= 0; if(mode == PTCACHE_RESET_DEPSGRAPH) { if(!(cache->flag & PTCACHE_BAKED) && !BKE_ptcache_get_continue_physics()) { - reset= 1; - clear= 1; + if(cache->flag & PTCACHE_AUTOCACHE) { + reset= 1; + clear= 1; + } + else { + current= 1; + after= 1; + cache->flag |= PTCACHE_OUTDATED; + } } else cache->flag |= PTCACHE_OUTDATED; @@ -449,10 +839,19 @@ int BKE_ptcache_id_reset(PTCacheID *pid, int mode) if(!(cache->flag & PTCACHE_BAKED)) clear= 1; } + else if(mode == PTCACHE_RESET_FREE) { + if(!(cache->flag & PTCACHE_BAKED) && !BKE_ptcache_get_continue_physics()) { + if((cache->flag & PTCACHE_AUTOCACHE)==0) { + current= 1; + after= 1; + } + } + } if(reset) { cache->flag &= ~(PTCACHE_OUTDATED|PTCACHE_SIMULATION_VALID); cache->simframe= 0; + cache->last_exact= 0; if(pid->type == PTCACHE_TYPE_CLOTH) cloth_free_modifier(pid->ob, pid->data); @@ -463,11 +862,15 @@ int BKE_ptcache_id_reset(PTCacheID *pid, int mode) } if(clear) BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0); + if(after) + BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_AFTER, CFRA); + if(current) + BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_FRAME, CFRA); - return (reset || clear); + return (reset || clear || current || after); } -int BKE_ptcache_object_reset(Object *ob, int mode) +int BKE_ptcache_object_reset(Scene *scene, Object *ob, int mode) { PTCacheID pid; ParticleSystem *psys; @@ -479,7 +882,7 @@ int BKE_ptcache_object_reset(Object *ob, int mode) if(ob->soft) { BKE_ptcache_id_from_softbody(&pid, ob, ob->soft); - reset |= BKE_ptcache_id_reset(&pid, mode); + reset |= BKE_ptcache_id_reset(scene, &pid, mode); } for(psys=ob->particlesystem.first; psys; psys=psys->next) { @@ -488,23 +891,23 @@ int BKE_ptcache_object_reset(Object *ob, int mode) if(psys->soft) { BKE_ptcache_id_from_softbody(&pid, ob, psys->soft); if(mode == PSYS_RESET_ALL || !(psys->part->type == PART_HAIR && (pid.cache->flag & PTCACHE_BAKED))) - reset |= BKE_ptcache_id_reset(&pid, mode); + reset |= BKE_ptcache_id_reset(scene, &pid, mode); else skip = 1; } - else if((psys->recalc & PSYS_RECALC_RESET)==0) + else if(psys->recalc & PSYS_RECALC_REDO || psys->recalc & PSYS_RECALC_CHILD) skip = 1; if(skip == 0) { BKE_ptcache_id_from_particles(&pid, ob, psys); - reset |= BKE_ptcache_id_reset(&pid, mode); + reset |= BKE_ptcache_id_reset(scene, &pid, mode); } } for(md=ob->modifiers.first; md; md=md->next) { if(md->type == eModifierType_Cloth) { BKE_ptcache_id_from_cloth(&pid, ob, (ClothModifierData*)md); - reset |= BKE_ptcache_id_reset(&pid, mode); + reset |= BKE_ptcache_id_reset(scene, &pid, mode); } } @@ -564,7 +967,7 @@ void BKE_ptcache_set_continue_physics(Scene *scene, int enable) if(CONTINUE_PHYSICS == 0) { for(ob=G.main->object.first; ob; ob=ob->id.next) - if(BKE_ptcache_object_reset(ob, PTCACHE_RESET_OUTDATED)) + if(BKE_ptcache_object_reset(scene, ob, PTCACHE_RESET_OUTDATED)) DAG_object_flush_update(scene, ob, OB_RECALC_DATA); } } @@ -590,6 +993,14 @@ PointCache *BKE_ptcache_add() void BKE_ptcache_free(PointCache *cache) { + PTCacheMem *pm = cache->mem_cache.first; + if(pm) { + for(; pm; pm=pm->next) + MEM_freeN(pm->data); + + BLI_freelistN(&cache->mem_cache); + } + MEM_freeN(cache); } @@ -605,3 +1016,231 @@ PointCache *BKE_ptcache_copy(PointCache *cache) return ncache; } + + +/* Baking */ +void BKE_ptcache_autocache_all(Scene *scene) +{ + PTCacheBaker baker; + + baker.bake=0; + baker.break_data=NULL; + baker.break_test=NULL; + baker.pid=NULL; + baker.progressbar=NULL; + baker.progresscontext=NULL; + baker.render=0; + baker.scene=scene; + + if(psys_count_autocache(scene, NULL)) + BKE_ptcache_make_cache(&baker); +} + +/* if bake is not given run simulations to current frame */ +void BKE_ptcache_make_cache(PTCacheBaker* baker) +{ + Scene *scene = baker->scene; + Base *base; + ListBase pidlist; + PTCacheID *pid = baker->pid; + PointCache *cache; + float frameleno = scene->r.framelen; + int cfrao = CFRA; + int startframe = MAXFRAME; + int endframe = CFRA; + int bake = baker->bake; + int render = baker->render; + int end = 0; + + G.afbreek = 0; + + //printf("Caching physics..."); + + /* set caches to baking mode and figure out start frame */ + if(pid) { + /* cache/bake a single object */ + cache = pid->cache; + if((cache->flag & PTCACHE_BAKED)==0) { + if(pid->type==PTCACHE_TYPE_PARTICLES) + psys_get_pointcache_start_end(scene, pid->data, &cache->startframe, &cache->endframe); + + if(bake || cache->flag & PTCACHE_OUTDATED) + BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0); + + startframe = MAX2(cache->last_exact, cache->startframe); + + if(bake) { + endframe = cache->endframe; + cache->flag |= PTCACHE_BAKING; + } + else + endframe = MIN2(endframe, cache->endframe); + + cache->flag &= ~PTCACHE_BAKED; + } + } + else for(base=scene->base.first; base; base= base->next) { + /* cache/bake everything in the scene */ + BKE_ptcache_ids_from_object(&pidlist, base->object); + + for(pid=pidlist.first; pid; pid=pid->next) { + cache = pid->cache; + if((cache->flag & PTCACHE_BAKED)==0) { + if(pid->type==PTCACHE_TYPE_PARTICLES) + psys_get_pointcache_start_end(scene, pid->data, &cache->startframe, &cache->endframe); + + if(cache->flag & PTCACHE_OUTDATED) + BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0); + + startframe = MIN2(startframe, cache->startframe); + + if(bake) { + endframe = MAX2(endframe, cache->endframe); + cache->flag |= PTCACHE_BAKING; + } + else if(render) + cache->flag |= PTCACHE_BAKING; + + cache->flag &= ~PTCACHE_BAKED; + + } + } + + BLI_freelistN(&pidlist); + } + + CFRA= startframe; + scene->r.framelen = 1.0; + scene_update_for_newframe(scene, scene->lay); + + for(; CFRA <= endframe; CFRA++) { + float prog; + + if(bake) + prog = (int)(100.0 * (float)(CFRA - startframe)/(float)(endframe-startframe)); + else + prog = CFRA; + + /* NOTE: baking should not redraw whole ui as this slows things down */ + if(baker->progressbar) + baker->progressbar(baker->progresscontext, prog); + + scene_update_for_newframe(scene, scene->lay); + + /* NOTE: breaking baking should leave calculated frames in cache, not clear it */ + if(baker->break_test && baker->break_test(baker->break_data)) + break; + } + + /* clear baking flag */ + if(pid) { + cache->flag &= ~(PTCACHE_BAKING|PTCACHE_OUTDATED); + if(bake) + cache->flag |= PTCACHE_BAKED; + } + else for(base=scene->base.first; base; base= base->next) { + BKE_ptcache_ids_from_object(&pidlist, base->object); + + for(pid=pidlist.first; pid; pid=pid->next) { + cache->flag &= ~(PTCACHE_BAKING|PTCACHE_OUTDATED); + if(bake) + cache->flag |= PTCACHE_BAKED; + } + } + + //printf("done!\n"); + + scene->r.framelen = frameleno; + CFRA = cfrao; + scene_update_for_newframe(scene, scene->lay); +} + +void BKE_ptcache_toggle_disk_cache(PTCacheID *pid) { + PointCache *cache = pid->cache; + PTCacheFile *pf; + PTCacheMem *pm; + int totelem=0; + int float_count=0; + int tot; + int write_error=0; + + if (!G.relbase_valid){ + cache->flag &= ~PTCACHE_DISK_CACHE; + return; + } + + totelem = ptcache_pid_totelem(pid); + float_count = ptcache_pid_elemsize(pid) / sizeof(float); + + if(totelem==0 || float_count==0) + return; + + tot = totelem*float_count; + + /* MEM -> DISK */ + if(cache->flag & PTCACHE_DISK_CACHE) { + pm = cache->mem_cache.first; + + BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0); + + for(; pm; pm=pm->next) { + pf = BKE_ptcache_file_open(pid, PTCACHE_FILE_WRITE, pm->frame); + + if(pf) { + if(fwrite(pm->data, sizeof(float), tot, pf->fp) != tot) { + printf("Error writing to disk cache\n"); + + cache->flag &= ~PTCACHE_DISK_CACHE; + + BKE_ptcache_file_close(pf); + return; + } + BKE_ptcache_file_close(pf); + } + else + printf("Error creating disk cache file\n"); + } + + cache->flag &= ~PTCACHE_DISK_CACHE; + BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0); + cache->flag |= PTCACHE_DISK_CACHE; + } + /* DISK -> MEM */ + else { + int cfra; + int sfra = cache->startframe; + int efra = cache->endframe; + + BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0); + + for(cfra=sfra; cfra <= efra; cfra++) { + pf = BKE_ptcache_file_open(pid, PTCACHE_FILE_READ, cfra); + + if(pf) { + pm = MEM_callocN(sizeof(PTCacheMem), "Pointcache mem"); + pm->data = MEM_callocN(sizeof(float)*tot, "Pointcache mem data"); + + if(fread(pm->data, sizeof(float), tot, pf->fp)!= tot) { + printf("Error reading from disk cache\n"); + + cache->flag |= PTCACHE_DISK_CACHE; + + MEM_freeN(pm->data); + MEM_freeN(pm); + BKE_ptcache_file_close(pf); + return; + } + + pm->frame = cfra; + + BLI_addtail(&pid->cache->mem_cache, pm); + + BKE_ptcache_file_close(pf); + } + } + + cache->flag |= PTCACHE_DISK_CACHE; + BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0); + cache->flag &= ~PTCACHE_DISK_CACHE; + } +}
\ No newline at end of file diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 156bdae9b00..3b51af57e0b 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -142,8 +142,6 @@ void free_scene(Scene *sce) BLI_freelistN(&sce->base); seq_free_editing(sce->ed); - if(sce->radio) MEM_freeN(sce->radio); - sce->radio= 0; #ifndef DISABLE_PYTHON BPY_free_scriptlink(&sce->scriptlink); diff --git a/source/blender/blenlib/intern/storage.c b/source/blender/blenlib/intern/storage.c index 688a4ab901b..0ae17a13e43 100644 --- a/source/blender/blenlib/intern/storage.c +++ b/source/blender/blenlib/intern/storage.c @@ -62,13 +62,6 @@ #include <sys/vfs.h> #endif -#ifdef __BeOS -struct statfs { - int f_bsize; - int f_bfree; -}; -#endif - #ifdef __APPLE__ /* For statfs */ #include <sys/param.h> @@ -77,7 +70,7 @@ struct statfs { #include <fcntl.h> -#if !defined(__BeOS) && !defined(WIN32) +#if !defined(WIN32) #include <sys/mtio.h> /* tape comando's */ #endif #include <string.h> /* strcpy etc.. */ @@ -201,9 +194,6 @@ double BLI_diskfree(char *dir) #if defined (__FreeBSD__) || defined (linux) || defined (__OpenBSD__) || defined (__APPLE__) if (statfs(name, &disk)) return(-1); #endif -#ifdef __BeOS - return -1; -#endif #if defined (__sun__) || defined (__sun) || defined (__sgi) if (statvfs(name, &disk)) return(-1); diff --git a/source/blender/blenlib/intern/util.c b/source/blender/blenlib/intern/util.c index df4ad4e7c75..26f4c2dd415 100644 --- a/source/blender/blenlib/intern/util.c +++ b/source/blender/blenlib/intern/util.c @@ -737,10 +737,7 @@ void BLI_splitdirstring(char *di, char *fi) } char *BLI_gethome(void) { - #ifdef __BeOS - return "/boot/home/"; /* BeOS 4.5: doubleclick at icon doesnt give home env */ - - #elif !defined(WIN32) + #if !defined(WIN32) return getenv("HOME"); #else /* Windows */ diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 74226cabba6..af4f61fccc4 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -2932,6 +2932,16 @@ static void direct_link_material(FileData *fd, Material *ma) static void direct_link_pointcache(FileData *fd, PointCache *cache) { + if((cache->flag & PTCACHE_DISK_CACHE)==0) { + PTCacheMem *pm; + + link_list(fd, &cache->mem_cache); + + pm = cache->mem_cache.first; + + for(; pm; pm=pm->next) + pm->data = newdataadr(fd, pm->data); + } cache->flag &= ~(PTCACHE_SIMULATION_VALID|PTCACHE_BAKE_EDIT_ACTIVE); cache->simframe= 0; } @@ -3196,10 +3206,8 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh) direct_link_dverts(fd, lvl->totvert, CustomData_get(&mesh->mr->vdata, 0, CD_MDEFORMVERT)); direct_link_customdata(fd, &mesh->mr->fdata, lvl->totface); - if(!mesh->mr->edge_flags) - mesh->mr->edge_flags= MEM_callocN(sizeof(short)*lvl->totedge, "Multires Edge Flags"); - if(!mesh->mr->edge_creases) - mesh->mr->edge_creases= MEM_callocN(sizeof(char)*lvl->totedge, "Multires Edge Creases"); + mesh->mr->edge_flags= newdataadr(fd, mesh->mr->edge_flags); + mesh->mr->edge_creases= newdataadr(fd, mesh->mr->edge_creases); mesh->mr->verts = newdataadr(fd, mesh->mr->verts); @@ -3987,8 +3995,6 @@ static void direct_link_scene(FileData *fd, Scene *sce) direct_link_keyingsets(fd, &sce->keyingsets); sce->basact= newdataadr(fd, sce->basact); - - sce->radio= newdataadr(fd, sce->radio); sce->toolsettings= newdataadr(fd, sce->toolsettings); if(sce->toolsettings) { @@ -9057,6 +9063,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) Scene *sce; Tex *tx; ParticleSettings *part; + Object *ob; for(screen= main->screen.first; screen; screen= screen->id.next) { do_versions_windowmanager_2_50(screen); @@ -9099,7 +9106,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) me->drawflag= ME_DRAWEDGES|ME_DRAWFACES|ME_DRAWCREASES; } - /* particle settings conversion */ + /* particle draw and render types */ for(part= main->particle.first; part; part= part->id.next) { if(part->draw_as) { if(part->draw_as == PART_DRAW_DOT) { @@ -9115,6 +9122,17 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } } } + /* set old pointcaches to have disk cache flag */ + for(ob = main->object.first; ob; ob= ob->id.next) { + ParticleSystem *psys = ob->particlesystem.first; + + for(; psys; psys=psys->next) { + if(psys->pointcache) + psys->pointcache->flag |= PTCACHE_DISK_CACHE; + } + + /* TODO: softbody & cloth caches */ + } } /* TODO: should be moved into one of the version blocks once this branch moves to trunk and we can diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 0c385911721..3f591c62dee 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -549,6 +549,22 @@ static void write_userdef(WriteData *wd) } } +/* TODO: replace *cache with *cachelist once it's coded */ +#define PTCACHE_WRITE_PSYS 0 +static void write_pointcaches(WriteData *wd, PointCache *cache, int type) +{ + writestruct(wd, DATA, "PointCache", 1, cache); + + if((cache->flag & PTCACHE_DISK_CACHE)==0) { + PTCacheMem *pm = cache->mem_cache.first; + + for(; pm; pm=pm->next) { + writestruct(wd, DATA, "PTCacheMem", 1, pm); + if(type==PTCACHE_WRITE_PSYS) + writestruct(wd, DATA, "ParticleKey", pm->totpoint, pm->data); + } + } +} static void write_particlesettings(WriteData *wd, ListBase *idbase) { ParticleSettings *part; @@ -585,8 +601,8 @@ static void write_particlesystems(WriteData *wd, ListBase *particles) } if(psys->child) writestruct(wd, DATA, "ChildParticle", psys->totchild ,psys->child); writestruct(wd, DATA, "SoftBody", 1, psys->soft); - if(psys->soft) writestruct(wd, DATA, "PointCache", 1, psys->soft->pointcache); - writestruct(wd, DATA, "PointCache", 1, psys->pointcache); + if(psys->soft) write_pointcaches(wd, psys->soft->pointcache, PTCACHE_WRITE_PSYS); + write_pointcaches(wd, psys->pointcache, PTCACHE_WRITE_PSYS); } } @@ -1617,7 +1633,6 @@ static void write_scenes(WriteData *wd, ListBase *scebase) base= base->next; } - writestruct(wd, DATA, "Radio", 1, sce->radio); writestruct(wd, DATA, "ToolSettings", 1, sce->toolsettings); if(sce->toolsettings->vpaint) writestruct(wd, DATA, "VPaint", 1, sce->toolsettings->vpaint); diff --git a/source/blender/blenpluginapi/intern/Makefile b/source/blender/blenpluginapi/intern/Makefile index 51905cad8ec..20a61e9a25c 100644 --- a/source/blender/blenpluginapi/intern/Makefile +++ b/source/blender/blenpluginapi/intern/Makefile @@ -33,10 +33,6 @@ DIR = $(OCGDIR)/blender/$(LIBNAME) include nan_compile.mk -ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd linux openbsd solaris")) - CFLAGS += -shared -endif - CFLAGS += $(LEVEL_1_C_WARNINGS) # path to our own external headerfiles. On win2k this needs to be diff --git a/source/blender/makesdna/DNA_radio_types.h b/source/blender/editors/include/ED_pointcache.h index 4219bf59b93..7bf51d9d53d 100644 --- a/source/blender/makesdna/DNA_radio_types.h +++ b/source/blender/editors/include/ED_pointcache.h @@ -1,9 +1,5 @@ -/** - * radio_types.h dec 2000 Nzc - * - * All type defs for the Blender core. - * - * $Id$ +/* + * $Id: ED_editparticle.h $ * * ***** BEGIN GPL LICENSE BLOCK ***** * @@ -21,7 +17,7 @@ * 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. + * The Original Code is Copyright (C) 2007 by Janne Karhu. * All rights reserved. * * The Original Code is: all of this file. @@ -29,34 +25,14 @@ * Contributor(s): none yet. * * ***** END GPL LICENSE BLOCK ***** - * */ -#ifndef DNA_RADIO_TYPES_H -#define DNA_RADIO_TYPES_H - -typedef struct Radio { - short hemires, maxiter; - short drawtype, flag; /* bit 0 and 1: show limits */ - short subshootp, subshoote, nodelim, maxsublamp; - short pama, pami, elma, elmi; /* patch and elem limits */ - int maxnode; - float convergence; - float radfac, gamma; /* for display */ - -} Radio; - - -/* **************** RADIOSITY ********************* */ - -/* draw type */ -#define RAD_WIREFRAME 0 -#define RAD_SOLID 1 -#define RAD_GOURAUD 2 +#ifndef ED_PHYSICS_H +#define ED_PHYSICS_H -/* flag */ -#define RAD_SHOWLIMITS 1 -#define RAD_SHOWZ 2 +/* operators */ +void ED_operatortypes_pointcache(void); +//void ED_keymap_pointcache(struct wmWindowManager *wm); -#endif +#endif /* ED_PHYSICS_H */ diff --git a/source/blender/editors/physics/ed_pointcache.c b/source/blender/editors/physics/ed_pointcache.c new file mode 100644 index 00000000000..e47f44c5c1a --- /dev/null +++ b/source/blender/editors/physics/ed_pointcache.c @@ -0,0 +1,270 @@ +/* + * $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) 2007 by Janne Karhu. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include "MEM_guardedalloc.h" + +#include "DNA_scene_types.h" +#include "DNA_object_force.h" + +#include "BKE_context.h" +#include "BKE_particle.h" +#include "BKE_report.h" +#include "BKE_scene.h" +#include "BKE_utildefines.h" +#include "BKE_pointcache.h" +#include "BKE_global.h" +#include "BKE_multires.h" + +#include "BLI_blenlib.h" + +#include "ED_screen.h" +#include "ED_pointcache.h" + +#include "UI_interface.h" +#include "UI_resources.h" + +#include "WM_api.h" +#include "WM_types.h" + +#include "RNA_access.h" +#include "RNA_define.h" + +#include "physics_intern.h" + +static int cache_break_test(void *cbd) { + return G.afbreek==1; +} +/**************************** general **********************************/ +static int ptcache_bake_all_poll(bContext *C) +{ + Scene *scene= CTX_data_scene(C); + + if(!scene) + return 0; + + return 1; +} + +static int ptcache_bake_all_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + PTCacheBaker baker; + + + baker.scene = scene; + baker.pid = NULL; + baker.bake = RNA_boolean_get(op->ptr, "bake"); + baker.render = 0; + baker.break_test = cache_break_test; + baker.break_data = NULL; + baker.progressbar = WM_timecursor; + baker.progresscontext = CTX_wm_window(C); + + BKE_ptcache_make_cache(&baker); + + WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene); + + return OPERATOR_FINISHED; +} +static int ptcache_free_bake_all_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Base *base; + PTCacheID *pid; + ListBase pidlist; + + for(base=scene->base.first; base; base= base->next) { + BKE_ptcache_ids_from_object(&pidlist, base->object); + + for(pid=pidlist.first; pid; pid=pid->next) { + pid->cache->flag &= ~PTCACHE_BAKED; + BKE_ptcache_id_reset(scene, pid, PTCACHE_RESET_OUTDATED); + } + } + + BLI_freelistN(&pidlist); + + WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene); + + return OPERATOR_FINISHED; +} + +void PTCACHE_OT_bake_all(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Bake All Physics"; + ot->idname= "PTCACHE_OT_bake_all"; + + /* api callbacks */ + ot->exec= ptcache_bake_all_exec; + ot->poll= ptcache_bake_all_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} +void PTCACHE_OT_free_bake_all(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Free All Physics Bakes"; + ot->idname= "PTCACHE_OT_free_bake_all"; + + /* api callbacks */ + ot->exec= ptcache_free_bake_all_exec; + ot->poll= ptcache_bake_all_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/**************************** particles **********************************/ +static int ptcache_bake_particle_system_poll(bContext *C) +{ + Scene *scene= CTX_data_scene(C); + Object *ob= CTX_data_active_object(C); + + if(!scene || !ob || ob->id.lib) + return 0; + + return (ob->particlesystem.first != NULL); +} + +static int ptcache_bake_particle_system_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Object *ob= CTX_data_active_object(C); + ParticleSystem *psys =psys_get_current(ob); + PTCacheID pid; + PTCacheBaker baker; + + BKE_ptcache_id_from_particles(&pid, ob, psys); + + baker.scene = scene; + baker.pid = &pid; + baker.bake = RNA_boolean_get(op->ptr, "bake"); + baker.render = 0; + baker.break_test = cache_break_test; + baker.break_data = NULL; + baker.progressbar = WM_timecursor; + baker.progresscontext = CTX_wm_window(C); + + BKE_ptcache_make_cache(&baker); + + WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene); + + return OPERATOR_FINISHED; +} +static int ptcache_free_bake_particle_system_exec(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Object *ob= CTX_data_active_object(C); + ParticleSystem *psys= psys_get_current(ob); + PTCacheID pid; + + BKE_ptcache_id_from_particles(&pid, ob, psys); + psys->pointcache->flag &= ~PTCACHE_BAKED; + BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED); + + WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene); + + return OPERATOR_FINISHED; +} +void PTCACHE_OT_cache_particle_system(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Bake Particles"; + ot->idname= "PTCACHE_OT_cache_particle_system"; + + /* api callbacks */ + ot->exec= ptcache_bake_particle_system_exec; + ot->poll= ptcache_bake_particle_system_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + RNA_def_boolean(ot->srna, "bake", 0, "Bake", ""); +} +void PTCACHE_OT_free_bake_particle_system(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Free Particles Bake"; + ot->idname= "PTCACHE_OT_free_bake_particle_system"; + + /* api callbacks */ + ot->exec= ptcache_free_bake_particle_system_exec; + ot->poll= ptcache_bake_particle_system_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} +static int ptcache_bake_from_particles_cache_exec(bContext *C, wmOperator *op) +{ + Object *ob= CTX_data_active_object(C); + ParticleSystem *psys= psys_get_current(ob); + PTCacheID pid; + + BKE_ptcache_id_from_particles(&pid, ob, psys); + psys->pointcache->flag |= PTCACHE_BAKED; + + return OPERATOR_FINISHED; +} +void PTCACHE_OT_bake_from_particles_cache(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Bake From Cache"; + ot->idname= "PTCACHE_OT_bake_from_particles_cache"; + + /* api callbacks */ + ot->exec= ptcache_bake_from_particles_cache_exec; + ot->poll= ptcache_bake_particle_system_poll; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; +} + +/**************************** registration **********************************/ + +void ED_operatortypes_pointcache(void) +{ + WM_operatortype_append(PTCACHE_OT_bake_all); + WM_operatortype_append(PTCACHE_OT_free_bake_all); + WM_operatortype_append(PTCACHE_OT_cache_particle_system); + WM_operatortype_append(PTCACHE_OT_free_bake_particle_system); + WM_operatortype_append(PTCACHE_OT_bake_from_particles_cache); +} + +//void ED_keymap_pointcache(wmWindowManager *wm) +//{ +// ListBase *keymap= WM_keymap_listbase(wm, "Pointcache", 0, 0); +// +// WM_keymap_add_item(keymap, "PHYSICS_OT_bake_all", AKEY, KM_PRESS, 0, 0); +// WM_keymap_add_item(keymap, "PHYSICS_OT_free_all", PADPLUSKEY, KM_PRESS, KM_CTRL, 0); +// WM_keymap_add_item(keymap, "PHYSICS_OT_bake_particle_system", PADMINUS, KM_PRESS, KM_CTRL, 0); +// WM_keymap_add_item(keymap, "PHYSICS_OT_free_particle_system", LKEY, KM_PRESS, 0, 0); +//} + diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index fa33e214737..ac86e2ed962 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -148,6 +148,7 @@ typedef struct StrokeCache { float *layer_disps; /* Displacements for each vertex */ float (*mesh_store)[3]; /* Copy of the mesh vertices' locations */ short (*orig_norms)[3]; /* Copy of the mesh vertices' normals */ + float (*face_norms)[3]; /* Copy of the mesh faces' normals */ float rotation; /* Texture rotation (radians) for anchored and rake modes */ int pixel_radius, previous_pixel_radius; ListBase grab_active_verts[8]; /* The same list of verts is used throught grab stroke */ @@ -240,7 +241,6 @@ static float brush_strength(Sculpt *sd, StrokeCache *cache) float dir= sd->brush->flag & BRUSH_DIR_IN ? -1 : 1; float pressure= 1; float flip= cache->flip ? -1:1; - float anchored = sd->brush->flag & BRUSH_ANCHORED ? 25 : 1; if(sd->brush->flag & BRUSH_ALPHA_PRESSURE) pressure *= cache->pressure; @@ -250,6 +250,7 @@ static float brush_strength(Sculpt *sd, StrokeCache *cache) case SCULPT_TOOL_INFLATE: case SCULPT_TOOL_CLAY: case SCULPT_TOOL_FLATTEN: + case SCULPT_TOOL_LAYER: return alpha * dir * pressure * flip; /*XXX: not sure why? was multiplied by G.vd->grid */; case SCULPT_TOOL_SMOOTH: return alpha * 4 * pressure; @@ -257,46 +258,27 @@ static float brush_strength(Sculpt *sd, StrokeCache *cache) return alpha / 2 * dir * pressure * flip; case SCULPT_TOOL_GRAB: return 1; - case SCULPT_TOOL_LAYER: - return sd->brush->alpha / 50.0f * dir * pressure * flip * anchored; /*XXX: not sure why? multiplied by G.vd->grid */; default: return 0; } } -/* For clipping against a mirror modifier */ -static void sculpt_clip(StrokeCache *cache, float *co, const float val[3]) +/* Handles clipping against a mirror modifier and SCULPT_LOCK axis flags */ +static void sculpt_clip(Sculpt *sd, float *co, const float val[3]) { int i; + for(i=0; i<3; ++i) { - if((cache->flag & (CLIP_X << i)) && (fabs(co[i]) <= cache->clip_tolerance[i])) + if(sd->flags & (SCULPT_LOCK_X << i)) + continue; + + if((sd->session->cache->flag & (CLIP_X << i)) && (fabs(co[i]) <= sd->session->cache->clip_tolerance[i])) co[i]= 0.0f; else co[i]= val[i]; } } -static void sculpt_axislock(Sculpt *sd, float *co) -{ - if(sd->flags == (SCULPT_LOCK_X|SCULPT_LOCK_Y|SCULPT_LOCK_Z)) - return; - - if(sd->session->cache->vc.v3d->twmode == V3D_MANIP_LOCAL) { - float mat[3][3], imat[3][3]; - Mat3CpyMat4(mat, sd->session->cache->vc.obact->obmat); - Mat3Inv(imat, mat); - Mat3MulVecfl(mat, co); - if (sd->flags & SCULPT_LOCK_X) co[0] = 0.0; - if (sd->flags & SCULPT_LOCK_Y) co[1] = 0.0; - if (sd->flags & SCULPT_LOCK_Z) co[2] = 0.0; - Mat3MulVecfl(imat, co); - } else { - if (sd->flags & SCULPT_LOCK_X) co[0] = 0.0; - if (sd->flags & SCULPT_LOCK_Y) co[1] = 0.0; - if (sd->flags & SCULPT_LOCK_Z) co[2] = 0.0; - } -} - static void add_norm_if(float view_vec[3], float out[3], float out_flip[3], const short no[3]) { float fno[3] = {no[0], no[1], no[2]}; @@ -353,8 +335,6 @@ static void do_draw_brush(Sculpt *sd, SculptSession *ss, const ListBase* active_ calc_area_normal(sd, area_normal, active_verts); - sculpt_axislock(sd, area_normal); - while(node){ float *co= ss->mvert[node->Index].co; @@ -362,7 +342,7 @@ static void do_draw_brush(Sculpt *sd, SculptSession *ss, const ListBase* active_ co[1]+area_normal[1]*ss->cache->radius*node->Fade*ss->cache->scale[1], co[2]+area_normal[2]*ss->cache->radius*node->Fade*ss->cache->scale[2]}; - sculpt_clip(ss->cache, co, val); + sculpt_clip(sd, co, val); node= node->next; } @@ -412,37 +392,37 @@ static void neighbor_average(SculptSession *ss, float avg[3], const int vert) VecCopyf(avg, ss->mvert[vert].co); } -static void do_smooth_brush(SculptSession *ss, const ListBase* active_verts) +static void do_smooth_brush(Sculpt *s, const ListBase* active_verts) { ActiveData *node= active_verts->first; int i; for(i = 0; i < 2; ++i) { while(node){ - float *co= ss->mvert[node->Index].co; + float *co= s->session->mvert[node->Index].co; float avg[3], val[3]; - neighbor_average(ss, avg, node->Index); + neighbor_average(s->session, avg, node->Index); val[0] = co[0]+(avg[0]-co[0])*node->Fade; val[1] = co[1]+(avg[1]-co[1])*node->Fade; val[2] = co[2]+(avg[2]-co[2])*node->Fade; - sculpt_clip(ss->cache, co, val); + sculpt_clip(s, co, val); node= node->next; } } } -static void do_pinch_brush(SculptSession *ss, const ListBase* active_verts) +static void do_pinch_brush(Sculpt *s, const ListBase* active_verts) { ActiveData *node= active_verts->first; while(node) { - float *co= ss->mvert[node->Index].co; - const float val[3]= {co[0]+(ss->cache->location[0]-co[0])*node->Fade, - co[1]+(ss->cache->location[1]-co[1])*node->Fade, - co[2]+(ss->cache->location[2]-co[2])*node->Fade}; - sculpt_clip(ss->cache, co, val); + float *co= s->session->mvert[node->Index].co; + const float val[3]= {co[0]+(s->session->cache->location[0]-co[0])*node->Fade, + co[1]+(s->session->cache->location[1]-co[1])*node->Fade, + co[2]+(s->session->cache->location[2]-co[2])*node->Fade}; + sculpt_clip(s, co, val); node= node->next; } } @@ -454,7 +434,6 @@ static void do_grab_brush(Sculpt *sd, SculptSession *ss) float grab_delta[3]; VecCopyf(grab_delta, ss->cache->grab_delta_symmetry); - sculpt_axislock(sd, grab_delta); while(node) { float *co= ss->mvert[node->Index].co; @@ -462,7 +441,7 @@ static void do_grab_brush(Sculpt *sd, SculptSession *ss) VecCopyf(add, grab_delta); VecMulf(add, node->Fade); VecAddf(add, add, co); - sculpt_clip(ss->cache, co, add); + sculpt_clip(sd, co, add); node= node->next; } @@ -473,42 +452,38 @@ static void do_layer_brush(Sculpt *sd, SculptSession *ss, const ListBase *active { float area_normal[3]; ActiveData *node= active_verts->first; - float lim= brush_strength(sd, ss->cache); + float lim= ss->cache->radius / 4; - if(sd->brush->flag & BRUSH_DIR_IN) + if(ss->cache->flip) lim = -lim; calc_area_normal(sd, area_normal, active_verts); while(node){ float *disp= &ss->cache->layer_disps[node->Index]; + float *co= ss->mvert[node->Index].co; + float val[3]; - if((lim > 0 && *disp < lim) || - (lim < 0 && *disp > lim)) { - float *co= ss->mvert[node->Index].co; - float val[3]; - - *disp+= node->Fade; - - if(lim < 0 && *disp < lim) - *disp = lim; - else if(lim > 0 && *disp > lim) - *disp = lim; - - val[0] = ss->cache->mesh_store[node->Index][0]+area_normal[0] * *disp*ss->cache->scale[0]; - val[1] = ss->cache->mesh_store[node->Index][1]+area_normal[1] * *disp*ss->cache->scale[1]; - val[2] = ss->cache->mesh_store[node->Index][2]+area_normal[2] * *disp*ss->cache->scale[2]; - //VecMulf(val, ss->cache->radius); - sculpt_clip(ss->cache, co, val); - } + *disp+= node->Fade; + + /* Don't let the displacement go past the limit */ + if((lim < 0 && *disp < lim) || (lim > 0 && *disp > lim)) + *disp = lim; + + val[0] = ss->cache->mesh_store[node->Index][0]+area_normal[0] * *disp*ss->cache->scale[0]; + val[1] = ss->cache->mesh_store[node->Index][1]+area_normal[1] * *disp*ss->cache->scale[1]; + val[2] = ss->cache->mesh_store[node->Index][2]+area_normal[2] * *disp*ss->cache->scale[2]; + + sculpt_clip(sd, co, val); node= node->next; } } -static void do_inflate_brush(SculptSession *ss, const ListBase *active_verts) +static void do_inflate_brush(Sculpt *s, const ListBase *active_verts) { ActiveData *node= active_verts->first; + SculptSession *ss = s->session; float add[3]; while(node) { @@ -524,7 +499,7 @@ static void do_inflate_brush(SculptSession *ss, const ListBase *active_verts) add[2]*= ss->cache->scale[2]; VecAddf(add, add, co); - sculpt_clip(ss->cache, co, add); + sculpt_clip(s, co, add); node= node->next; } @@ -587,7 +562,7 @@ static void do_flatten_clay_brush(Sculpt *sd, SculptSession *ss, const ListBase VecAddf(val, val, tmp); } - sculpt_clip(ss->cache, co, val); + sculpt_clip(sd, co, val); node= node->next; } @@ -845,13 +820,13 @@ static void do_brush_action(Sculpt *sd, StrokeCache *cache) do_draw_brush(sd, ss, &active_verts); break; case SCULPT_TOOL_SMOOTH: - do_smooth_brush(ss, &active_verts); + do_smooth_brush(sd, &active_verts); break; case SCULPT_TOOL_PINCH: - do_pinch_brush(ss, &active_verts); + do_pinch_brush(sd, &active_verts); break; case SCULPT_TOOL_INFLATE: - do_inflate_brush(ss, &active_verts); + do_inflate_brush(sd, &active_verts); break; case SCULPT_TOOL_GRAB: do_grab_brush(sd, ss); @@ -1192,6 +1167,11 @@ void sculptmode_draw_mesh(int only_damaged) } #endif +static int sculpt_mode_poll(bContext *C) +{ + return G.f & G_SCULPTMODE; +} + static int sculpt_poll(bContext *C) { return G.f & G_SCULPTMODE && CTX_wm_area(C)->spacetype == SPACE_VIEW3D && @@ -1269,7 +1249,7 @@ static void SCULPT_OT_brush_curve_preset(wmOperatorType *ot) ot->idname= "SCULPT_OT_brush_curve_preset"; ot->exec= sculpt_brush_curve_preset_exec; - ot->poll= sculpt_poll; + ot->poll= sculpt_mode_poll; ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; @@ -1334,6 +1314,8 @@ static void sculpt_cache_free(StrokeCache *cache) MEM_freeN(cache->mesh_store); if(cache->orig_norms) MEM_freeN(cache->orig_norms); + if(cache->face_norms) + MEM_freeN(cache->face_norms); if(cache->mats) MEM_freeN(cache->mats); MEM_freeN(cache); @@ -1362,9 +1344,11 @@ static void sculpt_update_cache_invariants(Sculpt *sd, bContext *C, wmOperator * sculpt_update_mesh_elements(C); + if(sd->brush->sculpt_tool == SCULPT_TOOL_LAYER) + cache->layer_disps = MEM_callocN(sizeof(float) * sd->session->totvert, "layer brush displacements"); + /* Make copies of the mesh vertex locations and normals for some tools */ if(sd->brush->sculpt_tool == SCULPT_TOOL_LAYER || (sd->brush->flag & BRUSH_ANCHORED)) { - cache->layer_disps = MEM_callocN(sizeof(float) * sd->session->totvert, "layer brush displacements"); cache->mesh_store= MEM_mallocN(sizeof(float) * 3 * sd->session->totvert, "sculpt mesh vertices copy"); for(i = 0; i < sd->session->totvert; ++i) VecCopyf(cache->mesh_store[i], sd->session->mvert[i].co); @@ -1376,6 +1360,13 @@ static void sculpt_update_cache_invariants(Sculpt *sd, bContext *C, wmOperator * cache->orig_norms[i][1] = sd->session->mvert[i].no[1]; cache->orig_norms[i][2] = sd->session->mvert[i].no[2]; } + + if(sd->session->face_normals) { + float *fn = sd->session->face_normals; + cache->face_norms= MEM_mallocN(sizeof(float) * 3 * sd->session->totface, "Sculpt face norms"); + for(i = 0; i < sd->session->totface; ++i, fn += 3) + VecCopyf(cache->face_norms[i], fn); + } } } @@ -1502,17 +1493,27 @@ static int sculpt_brush_stroke_invoke(bContext *C, wmOperator *op, wmEvent *even static void sculpt_restore_mesh(Sculpt *sd) { - StrokeCache *cache = sd->session->cache; + SculptSession *ss = sd->session; + StrokeCache *cache = ss->cache; int i; /* Restore the mesh before continuing with anchored stroke */ if((sd->brush->flag & BRUSH_ANCHORED) && cache->mesh_store) { - for(i = 0; i < sd->session->totvert; ++i) { - VecCopyf(sd->session->mvert[i].co, cache->mesh_store[i]); - sd->session->mvert[i].no[0] = cache->orig_norms[i][0]; - sd->session->mvert[i].no[1] = cache->orig_norms[i][1]; - sd->session->mvert[i].no[2] = cache->orig_norms[i][2]; + for(i = 0; i < ss->totvert; ++i) { + VecCopyf(ss->mvert[i].co, cache->mesh_store[i]); + ss->mvert[i].no[0] = cache->orig_norms[i][0]; + ss->mvert[i].no[1] = cache->orig_norms[i][1]; + ss->mvert[i].no[2] = cache->orig_norms[i][2]; + } + + if(ss->face_normals) { + float *fn = ss->face_normals; + for(i = 0; i < ss->totface; ++i, fn += 3) + VecCopyf(fn, cache->face_norms[i]); } + + if(sd->brush->sculpt_tool == SCULPT_TOOL_LAYER) + memset(cache->layer_disps, 0, sizeof(float) * ss->totvert); } } diff --git a/source/blender/editors/space_api/spacetypes.c b/source/blender/editors/space_api/spacetypes.c index 4f9c1f4b7a7..510103895f4 100644 --- a/source/blender/editors/space_api/spacetypes.c +++ b/source/blender/editors/space_api/spacetypes.c @@ -50,6 +50,7 @@ #include "ED_screen.h" #include "ED_space_api.h" #include "ED_uvedit.h" +#include "ED_pointcache.h" /* only call once on startup, storage is global in BKE kernel listbase */ void ED_spacetypes_init(void) @@ -89,6 +90,7 @@ void ED_spacetypes_init(void) ED_operatortypes_curve(); ED_operatortypes_armature(); ED_marker_operatortypes(); + ED_operatortypes_pointcache(); ui_view2d_operatortypes(); diff --git a/source/blender/editors/space_buttons/SConscript b/source/blender/editors/space_buttons/SConscript index 541da52f7f9..a0a7dad4077 100644 --- a/source/blender/editors/space_buttons/SConscript +++ b/source/blender/editors/space_buttons/SConscript @@ -12,7 +12,4 @@ defs = [] if env['WITH_BF_GAMEENGINE']: defs.append('GAMEBLENDER=1') - if env['WITH_BF_SOLID']: - defs.append('USE_SUMO_SOLID') - env.BlenderLib ( 'bf_editors_space_buttons', sources, Split(incs), defs, libtype=['core'], priority=[120] ) diff --git a/source/blender/editors/space_buttons/space_buttons.c b/source/blender/editors/space_buttons/space_buttons.c index 38ce88019ed..e5d2215be29 100644 --- a/source/blender/editors/space_buttons/space_buttons.c +++ b/source/blender/editors/space_buttons/space_buttons.c @@ -220,14 +220,23 @@ void buttons_keymap(struct wmWindowManager *wm) } +//#define PY_HEADER /* add handlers, stuff you only do once or on area/region changes */ static void buttons_header_area_init(wmWindowManager *wm, ARegion *ar) { +#ifdef PY_HEADER + ED_region_header_init(ar); +#else UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_HEADER, ar->winx, ar->winy); +#endif } static void buttons_header_area_draw(const bContext *C, ARegion *ar) { +#ifdef PY_HEADER + ED_region_header(C, ar); +#else + float col[3]; /* clear */ @@ -243,7 +252,8 @@ static void buttons_header_area_draw(const bContext *C, ARegion *ar) UI_view2d_view_ortho(C, &ar->v2d); buttons_header_buttons(C, ar); - +#endif + /* restore view matrix? */ UI_view2d_view_restore(C); } diff --git a/source/blender/editors/space_info/SConscript b/source/blender/editors/space_info/SConscript index 05afcae162e..01268115687 100644 --- a/source/blender/editors/space_info/SConscript +++ b/source/blender/editors/space_info/SConscript @@ -11,7 +11,4 @@ defs = [] if env['WITH_BF_GAMEENGINE']: defs.append('GAMEBLENDER=1') - if env['WITH_BF_SOLID']: - defs.append('USE_SUMO_SOLID') - env.BlenderLib ( 'bf_editors_space_info', sources, Split(incs), defs, libtype=['core'], priority=[70] ) diff --git a/source/blender/editors/space_logic/SConscript b/source/blender/editors/space_logic/SConscript index 46a9858a836..e32fcc1b535 100644 --- a/source/blender/editors/space_logic/SConscript +++ b/source/blender/editors/space_logic/SConscript @@ -12,7 +12,4 @@ defs = [] if env['WITH_BF_GAMEENGINE']: defs.append('GAMEBLENDER=1') - if env['WITH_BF_SOLID']: - defs.append('USE_SUMO_SOLID') - env.BlenderLib ( 'bf_editors_space_game', sources, Split(incs), defs, libtype=['core'], priority=[120] ) diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index a67e8c8a1c3..42da6775d5f 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -3239,6 +3239,9 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv if(draw_as!=PART_DRAW_PATH){ state.time=cfra; if(psys_get_particle_state(scene,ob,psys,a,&state,0)){ + if(psys->parent) + Mat4MulVecfl(psys->parent->obmat, state.co); + /* create actiual particle data */ switch(draw_as){ case PART_DRAW_DOT: diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index fb7d9c57eaf..cb210a37bf4 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -4809,7 +4809,7 @@ void special_aftertrans_update(TransInfo *t) if (base->flag & SELECT && (t->mode != TFM_DUMMY)) { /* pointcache refresh */ - if (BKE_ptcache_object_reset(ob, PTCACHE_RESET_DEPSGRAPH)) + if (BKE_ptcache_object_reset(scene, ob, PTCACHE_RESET_DEPSGRAPH)) ob->recalc |= OB_RECALC_DATA; /* Set autokey if necessary */ diff --git a/source/blender/editors/transform/transform_input.c b/source/blender/editors/transform/transform_input.c index 4d721a83c78..76b3f58f75c 100644 --- a/source/blender/editors/transform/transform_input.c +++ b/source/blender/editors/transform/transform_input.c @@ -26,6 +26,7 @@ #include <math.h> #include "DNA_screen_types.h" +#include "DNA_windowmanager_types.h" #include "BLI_arithb.h" diff --git a/source/blender/editors/transform/transform_ndofinput.c b/source/blender/editors/transform/transform_ndofinput.c index c52492ebd6b..9c2a1a7db6d 100644 --- a/source/blender/editors/transform/transform_ndofinput.c +++ b/source/blender/editors/transform/transform_ndofinput.c @@ -31,6 +31,7 @@ #include "BKE_utildefines.h" /* ABS */ #include "DNA_view3d_types.h" /* for G.vd (view3d) */ +#include "DNA_windowmanager_types.h" /* for G.vd (view3d) */ #include "WM_types.h" diff --git a/source/blender/editors/transform/transform_numinput.c b/source/blender/editors/transform/transform_numinput.c index 34976105db3..f5f1d5fac9e 100644 --- a/source/blender/editors/transform/transform_numinput.c +++ b/source/blender/editors/transform/transform_numinput.c @@ -34,6 +34,7 @@ #include "BKE_utildefines.h" /* ABS */ #include "WM_types.h" +#include "DNA_windowmanager_types.h" #include "transform.h" diff --git a/source/blender/gpu/intern/Makefile b/source/blender/gpu/intern/Makefile index 733ee3f764c..3a3ac20ff6c 100644 --- a/source/blender/gpu/intern/Makefile +++ b/source/blender/gpu/intern/Makefile @@ -35,7 +35,7 @@ DIR = $(OCGDIR)/blender/$(LIBNAME) include nan_compile.mk -ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd linux openbsd solaris windows")) +ifeq ($(OS),$(findstring $(OS), "darwin freebsd linux openbsd solaris windows")) CFLAGS += -funsigned-char endif diff --git a/source/blender/imbuf/intern/imbuf.h b/source/blender/imbuf/intern/imbuf.h index bd2a0d3082f..7b5d668ce2b 100644 --- a/source/blender/imbuf/intern/imbuf.h +++ b/source/blender/imbuf/intern/imbuf.h @@ -51,7 +51,7 @@ #include <sys/mman.h> #endif -#if !defined(WIN32) && !defined(__BeOS) +#if !defined(WIN32) #define O_BINARY 0 #endif diff --git a/source/blender/imbuf/intern/readimage.c b/source/blender/imbuf/intern/readimage.c index 6df92f69fff..1a6ab104bcf 100644 --- a/source/blender/imbuf/intern/readimage.c +++ b/source/blender/imbuf/intern/readimage.c @@ -244,26 +244,6 @@ struct ImBuf *IMB_loadifffile(int file, int flags) { size = BLI_filesize(file); -#if defined(AMIGA) || defined(__BeOS) - mem= (int *)malloc(size); - if (mem==0) { - printf("Out of mem\n"); - return (0); - } - - if (read(file, mem, size)!=size){ - printf("Read Error\n"); - free(mem); - return (0); - } - - ibuf = IMB_ibImageFromMemory(mem, size, flags); - free(mem); - - /* for jpeg read */ - lseek(file, 0L, SEEK_SET); - -#else mem= (int *)mmap(0,size,PROT_READ,MAP_SHARED,file,0); if (mem==(int *)-1){ printf("Couldn't get mapping\n"); @@ -275,7 +255,6 @@ struct ImBuf *IMB_loadifffile(int file, int flags) { if (munmap( (void *) mem, size)){ printf("Couldn't unmap file.\n"); } -#endif return(ibuf); } diff --git a/source/blender/makesdna/DNA_object_force.h b/source/blender/makesdna/DNA_object_force.h index 718d1a17834..a8d402fc503 100644 --- a/source/blender/makesdna/DNA_object_force.h +++ b/source/blender/makesdna/DNA_object_force.h @@ -33,6 +33,8 @@ #ifdef __cplusplus extern "C" { #endif + +#include "DNA_listBase.h" typedef struct PartDeflect { short deflect; /* Deflection flag - does mesh deflect particles*/ @@ -72,12 +74,25 @@ typedef struct PartDeflect { int seed; /* wind noise random seed */ } PartDeflect; +typedef struct PTCacheMem { + struct PTCacheMem *next, *prev; + int frame, totpoint; + float *data; /* data points */ + void *xdata; /* extra data */ +} PTCacheMem; + typedef struct PointCache { - int flag; /* generic flag */ + int flag, rt; /* generic flag */ int simframe; /* current frame of simulation (only if SIMULATION_VALID) */ int startframe; /* simulation start frame */ int endframe; /* simulation end frame */ int editframe; /* frame being edited (runtime only) */ + int last_exact; /* last exact frame that's cached */ + int xdata_type; /* type of extra data */ + char name[64]; + char prev_name[64]; + char info[64]; + struct ListBase mem_cache; } PointCache; typedef struct SBVertex { @@ -247,6 +262,8 @@ typedef struct SoftBody { #define PTCACHE_BAKING 8 #define PTCACHE_BAKE_EDIT 16 #define PTCACHE_BAKE_EDIT_ACTIVE 32 +#define PTCACHE_DISK_CACHE 64 +#define PTCACHE_AUTOCACHE 128 /* ob->softflag */ #define OB_SB_ENABLE 1 diff --git a/source/blender/makesdna/DNA_particle_types.h b/source/blender/makesdna/DNA_particle_types.h index 6805082d094..b10f35b9091 100644 --- a/source/blender/makesdna/DNA_particle_types.h +++ b/source/blender/makesdna/DNA_particle_types.h @@ -192,6 +192,7 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in struct Object *target_ob; struct Object *keyed_ob; struct Object *lattice; + struct Object *parent; /* particles from global space -> parent space */ struct ListBase effectors, reactevents; /* runtime */ diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 2219535bfd3..89db9ae3ee8 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -39,7 +39,6 @@ extern "C" { #include "DNA_scriptlink_types.h" #include "DNA_ID.h" -struct Radio; struct Object; struct World; struct Scene; @@ -158,7 +157,7 @@ typedef struct SceneRenderLayer { #define SCE_PASS_REFRACT 1024 #define SCE_PASS_INDEXOB 2048 #define SCE_PASS_UV 4096 -#define SCE_PASS_RADIO 8192 +#define SCE_PASS_RADIO 8192 /* Radio removed, can use for new GI? */ #define SCE_PASS_MIST 16384 /* note, srl->passflag is treestore element 'nr' in outliner, short still... */ @@ -570,7 +569,6 @@ typedef struct Scene { struct bNodeTree *nodetree; void *ed; /* sequence editor data is allocated here */ - struct Radio *radio; struct GameFraming framing; diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h index 7d6b5ec8764..e02d2984771 100644 --- a/source/blender/makesdna/DNA_windowmanager_types.h +++ b/source/blender/makesdna/DNA_windowmanager_types.h @@ -222,5 +222,36 @@ typedef enum wmRadialControlMode { WM_RADIALCONTROL_ANGLE } wmRadialControlMode; +/* ************** wmEvent ************************ */ +/* for read-only rna access, dont save this */ + +/* each event should have full modifier state */ +/* event comes from eventmanager and from keymap */ +typedef struct wmEvent { + struct wmEvent *next, *prev; + + short type; /* event code itself (short, is also in keymap) */ + short val; /* press, release, scrollvalue */ + short x, y; /* mouse pointer position, screen coord */ + short mval[2]; /* region mouse position, name convention pre 2.5 :) */ + short prevx, prevy; /* previous mouse pointer position */ + short unicode; /* future, ghost? */ + char ascii; /* from ghost */ + char pad; + + /* modifier states */ + short shift, ctrl, alt, oskey; /* oskey is apple or windowskey, value denotes order of pressed */ + short keymodifier; /* rawkey modifier */ + + /* keymap item, set by handler (weak?) */ + const char *keymap_idname; + + /* custom data */ + short custom; /* custom data type, stylus, 6dof, see wm_event_types.h */ + void *customdata; /* ascii, unicode, mouse coords, angles, vectors, dragdrop info */ + short customdatafree; + +} wmEvent; + #endif /* DNA_WINDOWMANAGER_TYPES_H */ diff --git a/source/blender/makesdna/intern/makesdna.c b/source/blender/makesdna/intern/makesdna.c index bf2f0f3900e..91e9e617ea9 100644 --- a/source/blender/makesdna/intern/makesdna.c +++ b/source/blender/makesdna/intern/makesdna.c @@ -98,7 +98,6 @@ char *includefiles[] = { "DNA_object_force.h", "DNA_object_fluidsim.h", "DNA_world_types.h", - "DNA_radio_types.h", "DNA_scene_types.h", "DNA_view3d_types.h", "DNA_view2d_types.h", @@ -1124,7 +1123,6 @@ int main(int argc, char ** argv) #include "DNA_object_force.h" #include "DNA_object_fluidsim.h" #include "DNA_world_types.h" -#include "DNA_radio_types.h" #include "DNA_scene_types.h" #include "DNA_view3d_types.h" #include "DNA_view2d_types.h" diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h index 01abc5450aa..af64daa3293 100644 --- a/source/blender/makesrna/RNA_access.h +++ b/source/blender/makesrna/RNA_access.h @@ -172,6 +172,7 @@ extern StructRNA RNA_EnvironmentMap; extern StructRNA RNA_EnvironmentMapTexture; extern StructRNA RNA_ExplodeModifier; extern StructRNA RNA_ExpressionController; +extern StructRNA RNA_Event; extern StructRNA RNA_FCurve; extern StructRNA RNA_FModifier; extern StructRNA RNA_FModifierCycles; @@ -546,6 +547,9 @@ void RNA_property_int_ui_range(PointerRNA *ptr, PropertyRNA *prop, int *softmin, void RNA_property_float_range(PointerRNA *ptr, PropertyRNA *prop, float *hardmin, float *hardmax); void RNA_property_float_ui_range(PointerRNA *ptr, PropertyRNA *prop, float *softmin, float *softmax, float *step, float *precision); +int RNA_enum_identifier(const EnumPropertyItem *item, const int value, const char **identifier); +int RNA_enum_name(const EnumPropertyItem *item, const int value, const char **name); + void RNA_property_enum_items(PointerRNA *ptr, PropertyRNA *prop, const EnumPropertyItem **item, int *totitem); int RNA_property_enum_value(PointerRNA *ptr, PropertyRNA *prop, const char *identifier, int *value); int RNA_property_enum_identifier(PointerRNA *ptr, PropertyRNA *prop, const int value, const char **identifier); diff --git a/source/blender/makesrna/RNA_enum_types.h b/source/blender/makesrna/RNA_enum_types.h index c679d9fc544..276f421c586 100644 --- a/source/blender/makesrna/RNA_enum_types.h +++ b/source/blender/makesrna/RNA_enum_types.h @@ -40,6 +40,9 @@ extern EnumPropertyItem beztriple_interpolation_mode_items[]; extern EnumPropertyItem fmodifier_type_items[]; +extern EnumPropertyItem event_value_items[]; +extern EnumPropertyItem event_type_items[]; + #endif /* RNA_ENUM_TYPES */ diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c index 18734fbcb18..9ece6684cd8 100644 --- a/source/blender/makesrna/intern/makesrna.c +++ b/source/blender/makesrna/intern/makesrna.c @@ -1854,7 +1854,6 @@ RNAProcessItem PROCESS_ITEMS[]= { {"rna_particle.c", NULL, RNA_def_particle}, {"rna_pose.c", NULL, RNA_def_pose}, {"rna_property.c", NULL, RNA_def_gameproperty}, - {"rna_radio.c", NULL, RNA_def_radio}, {"rna_scene.c", NULL, RNA_def_scene}, {"rna_screen.c", NULL, RNA_def_screen}, {"rna_scriptlink.c", NULL, RNA_def_scriptlink}, diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index ba893319ce9..13686809cd2 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -669,6 +669,28 @@ int RNA_property_enum_value(PointerRNA *ptr, PropertyRNA *prop, const char *iden return 0; } +int RNA_enum_identifier(const EnumPropertyItem *item, const int value, const char **identifier) +{ + for (; item->identifier; item++) { + if(item->value==value) { + *identifier = item->identifier; + return 1; + } + } + return 0; +} + +int RNA_enum_name(const EnumPropertyItem *item, const int value, const char **name) +{ + for (; item->identifier; item++) { + if(item->value==value) { + *name = item->name; + return 1; + } + } + return 0; +} + int RNA_property_enum_identifier(PointerRNA *ptr, PropertyRNA *prop, const int value, const char **identifier) { const EnumPropertyItem *item; @@ -676,14 +698,7 @@ int RNA_property_enum_identifier(PointerRNA *ptr, PropertyRNA *prop, const int v RNA_property_enum_items(ptr, prop, &item, &totitem); - for(i=0; i<totitem; i++) { - if(item[i].value==value) { - *identifier = item[i].identifier; - return 1; - } - } - - return 0; + return RNA_enum_identifier(item, value, identifier); } const char *RNA_property_ui_name(PropertyRNA *prop) diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h index a3d5c4fe388..c2f2e1d519f 100644 --- a/source/blender/makesrna/intern/rna_internal.h +++ b/source/blender/makesrna/intern/rna_internal.h @@ -146,7 +146,6 @@ void RNA_def_object_force(struct BlenderRNA *brna); void RNA_def_packedfile(struct BlenderRNA *brna); void RNA_def_particle(struct BlenderRNA *brna); void RNA_def_pose(struct BlenderRNA *brna); -void RNA_def_radio(struct BlenderRNA *brna); void RNA_def_rna(struct BlenderRNA *brna); void RNA_def_scene(struct BlenderRNA *brna); void RNA_def_screen(struct BlenderRNA *brna); diff --git a/source/blender/makesrna/intern/rna_object_force.c b/source/blender/makesrna/intern/rna_object_force.c index d144ed5f28b..bc3f0733a0d 100644 --- a/source/blender/makesrna/intern/rna_object_force.c +++ b/source/blender/makesrna/intern/rna_object_force.c @@ -32,8 +32,87 @@ #include "DNA_object_types.h" #include "DNA_object_force.h" +#include "WM_types.h" + #ifdef RNA_RUNTIME +#include "MEM_guardedalloc.h" + +#include "BKE_context.h" +#include "BKE_pointcache.h" + +#include "BLI_blenlib.h" + +static void rna_Cache_toggle_disk_cache(bContext *C, PointerRNA *ptr) +{ + Object *ob = CTX_data_active_object(C); + PointCache *cache = (PointCache*)ptr->data; + PTCacheID *pid = NULL; + ListBase pidlist; + + if(!ob) + return; + + BKE_ptcache_ids_from_object(&pidlist, ob); + + for(pid=pidlist.first; pid; pid=pid->next) { + if(pid->cache==cache) + break; + } + + if(pid) + BKE_ptcache_toggle_disk_cache(pid); + + BLI_freelistN(&pidlist); +} + +static void rna_Cache_idname_change(bContext *C, PointerRNA *ptr) +{ + Object *ob = CTX_data_active_object(C); + PointCache *cache = (PointCache*)ptr->data; + PTCacheID *pid = NULL, *pid2; + ListBase pidlist; + int new_name = 1; + char name[80]; + + if(!ob) + return; + + /* TODO: check for proper characters */ + + BKE_ptcache_ids_from_object(&pidlist, ob); + + for(pid=pidlist.first; pid; pid=pid->next) { + if(pid->cache==cache) + pid2 = pid; + else if(strcmp(cache->name, "") && strcmp(cache->name,pid->cache->name)==0) { + /*TODO: report "name exists" to user */ + strcpy(cache->name, cache->prev_name); + new_name = 0; + } + } + + if(new_name) { + if(pid2 && cache->flag & PTCACHE_DISK_CACHE) { + strcpy(name, cache->name); + strcpy(cache->name, cache->prev_name); + + cache->flag &= ~PTCACHE_DISK_CACHE; + + BKE_ptcache_toggle_disk_cache(pid2); + + strcpy(cache->name, name); + + cache->flag |= PTCACHE_DISK_CACHE; + + BKE_ptcache_toggle_disk_cache(pid2); + } + + strcpy(cache->prev_name, cache->name); + } + + BLI_freelistN(&pidlist); +} #else static void rna_def_pointcache(BlenderRNA *brna) @@ -60,6 +139,32 @@ static void rna_def_pointcache(BlenderRNA *brna) prop= RNA_def_property(srna, "baking", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_BAKING); + + prop= RNA_def_property(srna, "disk_cache", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_DISK_CACHE); + RNA_def_property_ui_text(prop, "Disk Cache", "Save cache files to disk"); + RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_toggle_disk_cache"); + + prop= RNA_def_property(srna, "outdated", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_OUTDATED); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Cache is outdated", ""); + + prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "name"); + RNA_def_property_ui_text(prop, "Name", "Cache name"); + RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_idname_change"); + + prop= RNA_def_property(srna, "autocache", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", PTCACHE_AUTOCACHE); + RNA_def_property_ui_text(prop, "Auto Cache", "Cache changes automatically"); + //RNA_def_property_update(prop, NC_OBJECT, "rna_Cache_toggle_autocache"); + + prop= RNA_def_property(srna, "info", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "info"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Cache Info", "Info on current cache status."); + } static void rna_def_collision(BlenderRNA *brna) diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c index 8ee71b6fd9e..c48c1006588 100644 --- a/source/blender/makesrna/intern/rna_particle.c +++ b/source/blender/makesrna/intern/rna_particle.c @@ -38,6 +38,7 @@ #include "DNA_scene_types.h" #include "WM_types.h" +#include "WM_api.h" #ifdef RNA_RUNTIME @@ -45,48 +46,93 @@ #include "BKE_depsgraph.h" #include "BKE_particle.h" +#include "BLI_arithb.h" + +/* property update functions */ static void rna_Particle_redo(bContext *C, PointerRNA *ptr) { + Scene *scene = CTX_data_scene(C); ParticleSettings *part; - if(ptr->type==&RNA_ParticleSystem) - part = ((ParticleSystem*)ptr->data)->part; - else + if(ptr->type==&RNA_ParticleSystem) { + ParticleSystem *psys = (ParticleSystem*)ptr->data; + Object *ob = psys_find_object(scene, psys); + + psys->recalc = PSYS_RECALC_REDO; + + if(ob) + DAG_object_flush_update(scene, ob, OB_RECALC_DATA); + } + else { part = ptr->id.data; - - psys_flush_particle_settings(CTX_data_scene(C), part, PSYS_RECALC_REDO); + psys_flush_particle_settings(scene, part, PSYS_RECALC_REDO); + } } static void rna_Particle_reset(bContext *C, PointerRNA *ptr) { + Scene *scene = CTX_data_scene(C); ParticleSettings *part; - if(ptr->type==&RNA_ParticleSystem) - part = ((ParticleSystem*)ptr->data)->part; - else - part = ptr->id.data; - psys_flush_particle_settings(CTX_data_scene(C), part, PSYS_RECALC_RESET|PSYS_RECALC_REDO); + if(ptr->type==&RNA_ParticleSystem) { + ParticleSystem *psys = (ParticleSystem*)ptr->data; + Object *ob = psys_find_object(scene, psys); + + psys->recalc = PSYS_RECALC_RESET; + + if(ob) { + DAG_object_flush_update(scene, ob, OB_RECALC_DATA); + //WM_event_add_notifier(C, NC_SCENE|ND_CACHE_PHYSICS, scene); + } + } + else { + part = ptr->id.data; + psys_flush_particle_settings(scene, part, PSYS_RECALC_RESET); + //WM_event_add_notifier(C, NC_SCENE|ND_CACHE_PHYSICS, scene); + } } static void rna_Particle_change_type(bContext *C, PointerRNA *ptr) { + Scene *scene = CTX_data_scene(C); ParticleSettings *part; - if(ptr->type==&RNA_ParticleSystem) - part = ((ParticleSystem*)ptr->data)->part; - else - part = ptr->id.data; - psys_flush_particle_settings(CTX_data_scene(C), part, PSYS_RECALC_RESET|PSYS_RECALC_TYPE|PSYS_RECALC_REDO); + if(ptr->type==&RNA_ParticleSystem) { + ParticleSystem *psys = (ParticleSystem*)ptr->data; + Object *ob = psys_find_object(scene, psys); + + psys->recalc = PSYS_RECALC_RESET|PSYS_RECALC_TYPE; + + if(ob) { + DAG_object_flush_update(scene, ob, OB_RECALC_DATA); + //WM_event_add_notifier(C, NC_SCENE|ND_CACHE_PHYSICS, scene); + } + } + else { + part = ptr->id.data; + psys_flush_particle_settings(scene, part, PSYS_RECALC_RESET|PSYS_RECALC_TYPE); + //WM_event_add_notifier(C, NC_SCENE|ND_CACHE_PHYSICS, scene); + } } static void rna_Particle_redo_child(bContext *C, PointerRNA *ptr) { + Scene *scene = CTX_data_scene(C); ParticleSettings *part; - if(ptr->type==&RNA_ParticleSystem) - part = ((ParticleSystem*)ptr->data)->part; - else + + if(ptr->type==&RNA_ParticleSystem) { + ParticleSystem *psys = (ParticleSystem*)ptr->data; + Object *ob = psys_find_object(scene, psys); + + psys->recalc = PSYS_RECALC_CHILD; + + if(ob) + DAG_object_flush_update(scene, ob, OB_RECALC_DATA); + } + else { part = ptr->id.data; - psys_flush_particle_settings(CTX_data_scene(C), part, PSYS_RECALC_CHILD); + psys_flush_particle_settings(scene, part, PSYS_RECALC_CHILD); + } } static void rna_PartSettings_start_set(struct PointerRNA *ptr, float value) { @@ -887,7 +933,7 @@ static void rna_def_particle_settings(BlenderRNA *brna) RNA_def_property_int_sdna(prop, NULL, "disp"); RNA_def_property_range(prop, 0, 100); RNA_def_property_ui_text(prop, "Display", "Percentage of particles to display in 3d view"); - RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo"); + RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_reset"); prop= RNA_def_property(srna, "material", PROP_INT, PROP_NONE); RNA_def_property_int_sdna(prop, NULL, "omat"); @@ -1669,6 +1715,14 @@ static void rna_def_particle_system(BlenderRNA *brna) RNA_def_property_pointer_sdna(prop, NULL, "pointcache"); RNA_def_property_struct_type(prop, "PointCache"); RNA_def_property_ui_text(prop, "Point Cache", ""); + + /* offset ob */ + prop= RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "parent"); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Parent", "Use this object's coordinate system instead of global coordinate system."); + RNA_def_property_update(prop, NC_OBJECT|ND_PARTICLE, "rna_Particle_redo"); + } void RNA_def_particle(BlenderRNA *brna) diff --git a/source/blender/makesrna/intern/rna_radio.c b/source/blender/makesrna/intern/rna_radio.c deleted file mode 100644 index 8b862b4c535..00000000000 --- a/source/blender/makesrna/intern/rna_radio.c +++ /dev/null @@ -1,140 +0,0 @@ -/** - * $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. - * - * Contributor(s): Blender Foundation (2008). - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#include <stdlib.h> - -#include "RNA_define.h" -#include "RNA_types.h" - -#include "rna_internal.h" - -#include "DNA_radio_types.h" - -#ifdef RNA_RUNTIME - -#else - -void RNA_def_radio(BlenderRNA *brna) -{ - StructRNA *srna; - PropertyRNA *prop; - static EnumPropertyItem prop_drawtype_items[] = { - {RAD_WIREFRAME, "WIREFRAME", 0, "Wireframe", "Enables Wireframe draw mode"}, - {RAD_SOLID, "SOLID", 0, "Solid", "Enables Solid draw mode"}, - {RAD_GOURAUD, "GOURAUD", 0, "Gouraud", "Enables Gouraud draw mode"}, - {0, NULL, 0, NULL, NULL}}; - - srna= RNA_def_struct(brna, "Radiosity", NULL); - RNA_def_struct_ui_text(srna, "Radiosity", "Settings for radiosity simulation of indirect diffuse lighting."); - RNA_def_struct_sdna(srna, "Radio"); - - /* Enums */ - prop= RNA_def_property(srna, "draw_mode", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, NULL, "drawtype"); - RNA_def_property_enum_items(prop, prop_drawtype_items); - RNA_def_property_ui_text(prop, "Draw Mode", "Radiosity draw modes."); - - /* Number values */ - prop= RNA_def_property(srna, "hemi_resolution", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "hemires"); - RNA_def_property_range(prop, 100, 1000); - RNA_def_property_ui_text(prop, "Hemi Resolution", "Sets the size of a hemicube."); - - prop= RNA_def_property(srna, "max_iterations", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "maxiter"); - RNA_def_property_range(prop, 0, 10000); - RNA_def_property_ui_text(prop, "Max Iterations", "Limits the maximum number of radiosity rounds."); - - prop= RNA_def_property(srna, "multiplier", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "radfac"); - RNA_def_property_range(prop, 0.001f, 250.0f); - RNA_def_property_ui_text(prop, "Multiplier", "Multiplies the energy values."); - - prop= RNA_def_property(srna, "gamma", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "gamma"); - RNA_def_property_range(prop, 0.2f, 10.0f); - RNA_def_property_ui_text(prop, "Gamma", "Changes the contrast of the energy values."); - - prop= RNA_def_property(srna, "convergence", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "convergence"); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_ui_text(prop, "Convergence", "Sets the lower threshold of unshot energy."); - - prop= RNA_def_property(srna, "element_max", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "elma"); - RNA_def_property_range(prop, 1, 500); - RNA_def_property_ui_text(prop, "Element Max", "Sets maximum size of an element"); - - prop= RNA_def_property(srna, "element_min", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "elmi"); - RNA_def_property_range(prop, 1, 100); - RNA_def_property_ui_text(prop, "Element Min", "Sets minimum size of an element"); - - prop= RNA_def_property(srna, "patch_max", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "pama"); - RNA_def_property_range(prop, 10, 1000); - RNA_def_property_ui_text(prop, "Patch Max", "Sets maximum size of a patch."); - - prop= RNA_def_property(srna, "patch_min", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "pami"); - RNA_def_property_range(prop, 10, 1000); - RNA_def_property_ui_text(prop, "Patch Min", "Sets minimum size of a patch."); - - prop= RNA_def_property(srna, "subshoot_patch", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "subshootp"); - RNA_def_property_range(prop, 0, 10); - RNA_def_property_ui_text(prop, "SubShoot Patch", "Sets the number of times the environment is tested to detect paths."); - - prop= RNA_def_property(srna, "subshoot_element", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "subshoote"); - RNA_def_property_range(prop, 0, 10); - RNA_def_property_ui_text(prop, "SubShoot Element", "Sets the number of times the environment is tested to detect elements."); - - prop= RNA_def_property(srna, "max_elements", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "maxnode"); - RNA_def_property_range(prop, 1, 250000); - RNA_def_property_ui_text(prop, "Max Elements", "Sets the maximum allowed number of elements."); - - prop= RNA_def_property(srna, "max_subdiv_shoot", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "maxsublamp"); - RNA_def_property_range(prop, 1, 250); - RNA_def_property_ui_text(prop, "Max Subdiv Shoot", "Sets the maximum number of initial shoot patches that are evaluated"); - - prop= RNA_def_property(srna, "remove_doubles_limit", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "nodelim"); - RNA_def_property_range(prop, 0, 50); - RNA_def_property_ui_text(prop, "Remove Doubles Limit", "Sets the range for removing doubles"); - - /* flag */ - prop= RNA_def_property(srna, "show_limits", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", RAD_SHOWLIMITS); - RNA_def_property_ui_text(prop, "Show Limits", "Draws patch and element limits"); - - prop= RNA_def_property(srna, "show_z", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", RAD_SHOWZ); - RNA_def_property_ui_text(prop, "Show Z", "Draws limits differently"); -} - -#endif - diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 1365ab75fc7..5d4916bb3c6 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -923,10 +923,6 @@ void RNA_def_scene(BlenderRNA *brna) RNA_def_property_pointer_sdna(prop, NULL, "ed"); RNA_def_property_struct_type(prop, "SequenceEditor"); RNA_def_property_ui_text(prop, "Sequence Editor", ""); - - prop= RNA_def_property(srna, "radiosity", PROP_POINTER, PROP_NONE); - RNA_def_property_pointer_sdna(prop, NULL, "radio"); - RNA_def_property_ui_text(prop, "Radiosity", ""); prop= RNA_def_property(srna, "keyingsets", PROP_COLLECTION, PROP_NONE); RNA_def_property_collection_sdna(prop, NULL, "keyingsets", NULL); diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index d4f7c5b0bd1..ce31cb27c9a 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -575,18 +575,17 @@ static void rna_def_space_buttons(BlenderRNA *brna) PropertyRNA *prop; static EnumPropertyItem buttons_context_items[] = { - {BCONTEXT_SCENE, "SCENE", 0, "Scene", ""}, - {BCONTEXT_WORLD, "WORLD", 0, "World", ""}, - {BCONTEXT_OBJECT, "OBJECT", 0, "Object", ""}, - {BCONTEXT_DATA, "DATA", 0, "Data", ""}, - {BCONTEXT_MATERIAL, "MATERIAL", 0, "Material", ""}, - {BCONTEXT_TEXTURE, "TEXTURE", 0, "Texture", ""}, - {BCONTEXT_PARTICLE, "PARTICLE", 0, "Particle", ""}, - {BCONTEXT_PHYSICS, "PHYSICS", 0, "Physics", ""}, - {BCONTEXT_GAME, "GAME", 0, "Game", ""}, - {BCONTEXT_BONE, "BONE", 0, "Bone", ""}, - {BCONTEXT_MODIFIER, "MODIFIER", 0, "Modifier", ""}, - {BCONTEXT_CONSTRAINT, "CONSTRAINT", 0, "Constraint", ""}, + {BCONTEXT_SCENE, "SCENE", ICON_SCENE, "Scene", "Scene"}, + {BCONTEXT_WORLD, "WORLD", ICON_WORLD, "World", "World"}, + {BCONTEXT_OBJECT, "OBJECT", ICON_OBJECT_DATA, "Object", "Object"}, + {BCONTEXT_CONSTRAINT, "CONSTRAINT", ICON_CONSTRAINT, "Constraint", "Constraint"}, + {BCONTEXT_MODIFIER, "MODIFIER", ICON_MODIFIER, "Modifier", "Modifier"}, + {BCONTEXT_DATA, "DATA", 0, "Data", "Data"}, + {BCONTEXT_BONE, "BONE", ICON_BONE_DATA, "Bone", "Bone"}, + {BCONTEXT_MATERIAL, "MATERIAL", ICON_MATERIAL, "Material", "Material"}, + {BCONTEXT_TEXTURE, "TEXTURE", ICON_TEXTURE, "Texture", "Texture"}, + {BCONTEXT_PARTICLE, "PARTICLE", ICON_PARTICLES, "Particle", "Particle"}, + {BCONTEXT_PHYSICS, "PHYSICS", ICON_PHYSICS, "Physics", "Physics"}, {0, NULL, 0, NULL, NULL}}; static EnumPropertyItem panel_alignment_items[] = { @@ -602,11 +601,13 @@ static void rna_def_space_buttons(BlenderRNA *brna) RNA_def_property_enum_sdna(prop, NULL, "mainb"); RNA_def_property_enum_items(prop, buttons_context_items); RNA_def_property_ui_text(prop, "Buttons Context", "The type of active data to display and edit in the buttons window"); + RNA_def_property_update(prop, NC_WINDOW, NULL); prop= RNA_def_property(srna, "panel_alignment", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, NULL, "align"); RNA_def_property_enum_items(prop, panel_alignment_items); RNA_def_property_ui_text(prop, "Panel Alignment", "Arrangement of the panels within the buttons window"); + RNA_def_property_update(prop, NC_WINDOW, NULL); /* pinned data */ prop= RNA_def_property(srna, "pin_id", PROP_POINTER, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c index df07e03850a..a1b51084fca 100644 --- a/source/blender/makesrna/intern/rna_wm.c +++ b/source/blender/makesrna/intern/rna_wm.c @@ -30,6 +30,120 @@ #include "rna_internal.h" #include "DNA_windowmanager_types.h" +#include "WM_types.h" /* wmEvent */ + + +EnumPropertyItem event_value_items[] = { + {KM_ANY, "ANY", 0, "Any", ""}, + {KM_NOTHING, "NOTHING", 0, "Nothing", ""}, + {KM_PRESS, "PRESS", 0, "Press", ""}, + {KM_RELEASE, "RELEASE", 0, "Release", ""}, + {0, NULL, 0, NULL, NULL}}; + +/* not returned: CAPSLOCKKEY, UNKNOWNKEY, COMMANDKEY, GRLESSKEY */ +EnumPropertyItem event_type_items[] = { + {AKEY, "A", 0, "A", ""}, + {BKEY, "B", 0, "B", ""}, + {CKEY, "C", 0, "C", ""}, + {DKEY, "D", 0, "D", ""}, + {EKEY, "E", 0, "E", ""}, + {FKEY, "F", 0, "F", ""}, + {GKEY, "G", 0, "G", ""}, + {HKEY, "H", 0, "H", ""}, + {IKEY, "I", 0, "I", ""}, + {JKEY, "J", 0, "J", ""}, + {KKEY, "K", 0, "K", ""}, + {LKEY, "L", 0, "L", ""}, + {MKEY, "M", 0, "M", ""}, + {NKEY, "N", 0, "N", ""}, + {OKEY, "O", 0, "O", ""}, + {PKEY, "P", 0, "P", ""}, + {QKEY, "Q", 0, "Q", ""}, + {RKEY, "R", 0, "R", ""}, + {SKEY, "S", 0, "S", ""}, + {TKEY, "T", 0, "T", ""}, + {UKEY, "U", 0, "U", ""}, + {VKEY, "V", 0, "V", ""}, + {WKEY, "W", 0, "W", ""}, + {XKEY, "X", 0, "X", ""}, + {YKEY, "Y", 0, "Y", ""}, + {ZKEY, "Z", 0, "Z", ""}, + + {ZEROKEY, "ZERO", 0, "Zero Key", ""}, + {ONEKEY, "ONE", 0, "One Key", ""}, + {TWOKEY, "TWO", 0, "Two Key", ""}, + {THREEKEY, "THREE", 0, "Three Key", ""}, + {FOURKEY, "FOUR", 0, "Four Key", ""}, + {FIVEKEY, "FIVE", 0, "Five Key", ""}, + {SIXKEY, "SIX", 0, "Six Key", ""}, + {SEVENKEY, "SEVEN", 0, "Seven Key", ""}, + {EIGHTKEY, "EIGHT", 0, "Eight Key", ""}, + {NINEKEY, "NINE", 0, "Nine Key", ""}, + + {LEFTCTRLKEY, "LEFT_CTRL", 0, "Left Ctrl", ""}, + {LEFTALTKEY, "LEFT_ALT", 0, "Left Alt", ""}, + {RIGHTALTKEY, "RIGHT_ALT", 0, "Right Alt", ""}, + {RIGHTCTRLKEY, "RIGHT_CTRL", 0, "Rightctrl", ""}, + {RIGHTSHIFTKEY, "RIGHT_SHIFT", 0, "Rightshift", ""}, + {LEFTSHIFTKEY, "LEFT_SHIFT", 0, "Leftshift", ""}, + + {ESCKEY, "ESC", 0, "Esc", ""}, + {TABKEY, "TAB", 0, "Tab", ""}, + {RETKEY, "RET", 0, "Return", ""}, + {SPACEKEY, "SPACE", 0, "Spacebar", ""}, + {LINEFEEDKEY, "LINE_FEED", 0, "Line Feed", ""}, + {BACKSPACEKEY, "BACK_SPACE", 0, "Back Space", ""}, + {DELKEY, "DEL", 0, "Delete", ""}, + {SEMICOLONKEY, "SEMI_COLON", 0, "Semicolon", ""}, + {PERIODKEY, "PERIOD", 0, "Period", ""}, + {COMMAKEY, "COMMA", 0, "Comma", ""}, + {QUOTEKEY, "QUOTE", 0, "Quote", ""}, + {ACCENTGRAVEKEY, "ACCENT_GRAVE", 0, "Accentgrave", ""}, + {MINUSKEY, "MINUS", 0, "Minus", ""}, + {SLASHKEY, "SLASH", 0, "Slash", ""}, + {BACKSLASHKEY, "BACK_SLASH", 0, "Backslash", ""}, + {EQUALKEY, "EQUAL", 0, "Equal", ""}, + {LEFTBRACKETKEY, "LEFT_BRACKET", 0, "Leftbracket", ""}, + {RIGHTBRACKETKEY, "RIGHT_BRACKET", 0, "Rightbracket", ""}, + {LEFTARROWKEY, "LEFT_ARROW", 0, "Left Arrow", ""}, + {DOWNARROWKEY, "DOWN_ARROW", 0, "Down Arrow", ""}, + {RIGHTARROWKEY, "RIGHT_ARROW", 0, "Right Arrow", ""}, + {UPARROWKEY, "UP_ARROW", 0, "Up Arrow", ""}, + {PAD2, "NUMPAD_2", 0, "Numpad 2", ""}, + {PAD4, "NUMPAD_4", 0, "Numpad 4", ""}, + {PAD6, "NUMPAD_6", 0, "Numpad 6", ""}, + {PAD8, "NUMPAD_8", 0, "Numpad 8", ""}, + {PAD1, "NUMPAD_1", 0, "Numpad 1", ""}, + {PAD3, "NUMPAD_3", 0, "Numpad 3", ""}, + {PAD5, "NUMPAD_5", 0, "Numpad 5", ""}, + {PAD7, "NUMPAD_7", 0, "Numpad 7", ""}, + {PAD9, "NUMPAD_9", 0, "Numpad 9", ""}, + {PADPERIOD, "NUMPAD_PERIOD", 0, "Numpad .", ""}, + {PADSLASHKEY, "NUMPAD_SLASH", 0, "Numpad /", ""}, + {PADASTERKEY, "NUMPAD_ASTERIX", 0, "Numpad *", ""}, + {PAD0, "NUMPAD_0", 0, "Numpad 0", ""}, + {PADMINUS, "NUMPAD_MINUS", 0, "Numpad -", ""}, + {PADENTER, "NUMPAD_ENTER", 0, "Numpad Enter", ""}, + {PADPLUSKEY, "NUMPAD_PLUS", 0, "Numpad +", ""}, + {F1KEY, "F1", 0, "F1", ""}, + {F2KEY, "F2", 0, "F2", ""}, + {F3KEY, "F3", 0, "F3", ""}, + {F4KEY, "F4", 0, "F4", ""}, + {F5KEY, "F5", 0, "F5", ""}, + {F6KEY, "F6", 0, "F6", ""}, + {F7KEY, "F7", 0, "F7", ""}, + {F8KEY, "F8", 0, "F8", ""}, + {F9KEY, "F9", 0, "F9", ""}, + {F10KEY, "F10", 0, "F10", ""}, + {F11KEY, "F11", 0, "F11", ""}, + {F12KEY, "F12", 0, "F12", ""}, + {PAUSEKEY, "PAUSE", 0, "Pause", ""}, + {INSERTKEY, "INSERT", 0, "Insert", ""}, + {HOMEKEY, "HOME", 0, "Home", ""}, + {PAGEUPKEY, "PAGE_UP", 0, "Page Up", ""}, + {PAGEDOWNKEY, "PAGE_DOWN", 0, "Page Down", ""}, + {ENDKEY, "END", 0, "End", ""}, + {0, NULL, 0, NULL, NULL}}; #ifdef RNA_RUNTIME @@ -87,6 +201,20 @@ static PointerRNA rna_Operator_properties_get(PointerRNA *ptr) return rna_pointer_inherit_refine(ptr, &RNA_OperatorProperties, op->properties); } + +static int rna_Event_ascii_get(PointerRNA *ptr, char *value) +{ + wmEvent *event= (wmEvent*)ptr->id.data; + value[0]= event->ascii; + value[1]= '\0'; +} + +static int rna_Event_ascii_length(PointerRNA *ptr) +{ + wmEvent *event= (wmEvent*)ptr->id.data; + return (event->ascii)? 1 : 0; +} + #else static void rna_def_operator(BlenderRNA *brna) @@ -146,7 +274,80 @@ static void rna_def_operator_filelist_element(BlenderRNA *brna) RNA_def_property_flag(prop, PROP_IDPROPERTY); RNA_def_property_ui_text(prop, "Name", "the name of a file or directory within a file list"); } + +static void rna_def_event(BlenderRNA *brna) +{ + StructRNA *srna; + PropertyRNA *prop; + + srna= RNA_def_struct(brna, "Event", NULL); + RNA_def_struct_ui_text(srna, "Event", "Window Manager Event"); + RNA_def_struct_sdna(srna, "wmEvent"); + + /* strings */ + prop= RNA_def_property(srna, "ascii", PROP_STRING, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_string_funcs(prop, "rna_Event_ascii_get", "rna_Event_ascii_length", NULL); + RNA_def_property_ui_text(prop, "ASCII", "Single ASCII character for this event."); + + + /* enums */ + prop= RNA_def_property(srna, "value", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "val"); + RNA_def_property_enum_items(prop, event_value_items); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Value", "The type of event, only applies to some."); + + prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "type"); + RNA_def_property_enum_items(prop, event_type_items); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Type", ""); + + + /* mouse */ + prop= RNA_def_property(srna, "mouse_x", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "x"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Mouse X Position", "The window relative vertical location of the mouse."); + + prop= RNA_def_property(srna, "mouse_y", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "y"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Mouse Y Position", "The window relative horizontal location of the mouse."); + + prop= RNA_def_property(srna, "mouse_prev_x", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "prevx"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Mouse Previous X Position", "The window relative vertical location of the mouse."); + + prop= RNA_def_property(srna, "mouse_prev_y", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "prevy"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Mouse Previous Y Position", "The window relative horizontal location of the mouse."); + + /* modifiers */ + prop= RNA_def_property(srna, "shift", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "shift", 1); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Shift", "True when the shift key is held."); + + prop= RNA_def_property(srna, "ctrl", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "ctrl", 1); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Ctrl", "True when the shift key is held."); + + prop= RNA_def_property(srna, "alt", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "alt", 1); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Alt", "True when the shift key is held."); + + prop= RNA_def_property(srna, "oskey", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "oskey", 1); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "OS Key", "True when the shift key is held."); +} static void rna_def_windowmanager(BlenderRNA *brna) { @@ -169,6 +370,7 @@ void RNA_def_wm(BlenderRNA *brna) rna_def_operator(brna); rna_def_operator_utils(brna); rna_def_operator_filelist_element(brna); + rna_def_event(brna); rna_def_windowmanager(brna); } diff --git a/source/blender/makesrna/intern/rna_world.c b/source/blender/makesrna/intern/rna_world.c index 4dba61411f0..f5eb81e3cea 100644 --- a/source/blender/makesrna/intern/rna_world.c +++ b/source/blender/makesrna/intern/rna_world.c @@ -337,7 +337,7 @@ void RNA_def_world(BlenderRNA *brna) static EnumPropertyItem physics_engine_items[] = { {WOPHY_NONE, "NONE", 0, "None", ""}, //{WOPHY_ENJI, "ENJI", 0, "Enji", ""}, - {WOPHY_SUMO, "SUMO", 0, "Sumo (Deprecated)", ""}, + //{WOPHY_SUMO, "SUMO", 0, "Sumo (Deprecated)", ""}, //{WOPHY_DYNAMO, "DYNAMO", 0, "Dynamo", ""}, //{WOPHY_ODE, "ODE", 0, "ODE", ""}, {WOPHY_BULLET, "BULLET", 0, "Bullet", ""}, diff --git a/source/blender/python/intern/bpy_operator_wrap.c b/source/blender/python/intern/bpy_operator_wrap.c index f4fdd0c6194..542de6bd9b8 100644 --- a/source/blender/python/intern/bpy_operator_wrap.c +++ b/source/blender/python/intern/bpy_operator_wrap.c @@ -47,98 +47,6 @@ #define PYOP_ATTR_IDNAME "__name__" /* use pythons class name */ #define PYOP_ATTR_DESCRIPTION "__doc__" /* use pythons docstring */ -static PyObject *pyop_dict_from_event(wmEvent *event) -{ - PyObject *dict= PyDict_New(); - PyObject *item; - char *cstring, ascii[2]; - - /* type */ - item= PyUnicode_FromString(WM_key_event_string(event->type)); - PyDict_SetItemString(dict, "type", item); Py_DECREF(item); - - /* val */ - switch(event->val) { - case KM_ANY: - cstring = "ANY"; - break; - case KM_RELEASE: - cstring = "RELEASE"; - break; - case KM_PRESS: - cstring = "PRESS"; - break; - default: - cstring = "UNKNOWN"; - break; - } - - item= PyUnicode_FromString(cstring); - PyDict_SetItemString(dict, "val", item); Py_DECREF(item); - - /* x, y (mouse) */ - item= PyLong_FromLong(event->x); - PyDict_SetItemString(dict, "x", item); Py_DECREF(item); - - item= PyLong_FromLong(event->y); - PyDict_SetItemString(dict, "y", item); Py_DECREF(item); - - item= PyLong_FromLong(event->prevx); - PyDict_SetItemString(dict, "prevx", item); Py_DECREF(item); - - item= PyLong_FromLong(event->prevy); - PyDict_SetItemString(dict, "prevy", item); Py_DECREF(item); - - /* ascii */ - ascii[0]= event->ascii; - ascii[1]= '\0'; - item= PyUnicode_FromString(ascii); - PyDict_SetItemString(dict, "ascii", item); Py_DECREF(item); - - /* modifier keys */ - item= PyLong_FromLong(event->shift); - PyDict_SetItemString(dict, "shift", item); Py_DECREF(item); - - item= PyLong_FromLong(event->ctrl); - PyDict_SetItemString(dict, "ctrl", item); Py_DECREF(item); - - item= PyLong_FromLong(event->alt); - PyDict_SetItemString(dict, "alt", item); Py_DECREF(item); - - item= PyLong_FromLong(event->oskey); - PyDict_SetItemString(dict, "oskey", item); Py_DECREF(item); - - - - /* modifier */ -#if 0 - item= PyTuple_New(0); - if(event->keymodifier & KM_SHIFT) { - _PyTuple_Resize(&item, size+1); - PyTuple_SET_ITEM(item, size, _PyUnicode_AsString("SHIFT")); - size++; - } - if(event->keymodifier & KM_CTRL) { - _PyTuple_Resize(&item, size+1); - PyTuple_SET_ITEM(item, size, _PyUnicode_AsString("CTRL")); - size++; - } - if(event->keymodifier & KM_ALT) { - _PyTuple_Resize(&item, size+1); - PyTuple_SET_ITEM(item, size, _PyUnicode_AsString("ALT")); - size++; - } - if(event->keymodifier & KM_OSKEY) { - _PyTuple_Resize(&item, size+1); - PyTuple_SET_ITEM(item, size, _PyUnicode_AsString("OSKEY")); - size++; - } - PyDict_SetItemString(dict, "keymodifier", item); Py_DECREF(item); -#endif - - return dict; -} - static struct BPY_flag_def pyop_ret_flags[] = { {"RUNNING_MODAL", OPERATOR_RUNNING_MODAL}, {"CANCELLED", OPERATOR_CANCELLED}, @@ -180,6 +88,7 @@ static int PYTHON_OT_generic(int mode, bContext *C, wmOperator *op, wmEvent *eve int ret_flag= (mode==PYOP_POLL ? 0:OPERATOR_CANCELLED); PointerRNA ptr_context; PointerRNA ptr_operator; + PointerRNA ptr_event; PyObject *py_operator; PyGILState_STATE gilstate = PyGILState_Ensure(); @@ -230,11 +139,13 @@ static int PYTHON_OT_generic(int mode, bContext *C, wmOperator *op, wmEvent *eve if (mode==PYOP_INVOKE) { item= PyObject_GetAttrString(py_class, "invoke"); args = PyTuple_New(3); + + RNA_pointer_create(NULL, &RNA_Event, event, &ptr_event); // PyTuple_SET_ITEM "steals" object reference, it is // an object passed shouldn't be DECREF'ed PyTuple_SET_ITEM(args, 1, pyrna_struct_CreatePyObject(&ptr_context)); - PyTuple_SET_ITEM(args, 2, pyop_dict_from_event(event)); + PyTuple_SET_ITEM(args, 2, pyrna_struct_CreatePyObject(&ptr_event)); } else if (mode==PYOP_EXEC) { item= PyObject_GetAttrString(py_class, "execute"); diff --git a/source/blender/radiosity/CMakeLists.txt b/source/blender/radiosity/CMakeLists.txt deleted file mode 100644 index e76f7409f99..00000000000 --- a/source/blender/radiosity/CMakeLists.txt +++ /dev/null @@ -1,36 +0,0 @@ -# $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, Blender Foundation -# All rights reserved. -# -# The Original Code is: all of this file. -# -# Contributor(s): Jacques Beaurain. -# -# ***** END GPL LICENSE BLOCK ***** - -FILE(GLOB SRC intern/source/*.c) - -SET(INC - extern/include ../blenlib ../blenkernel ../makesdna ../editors/include - ../../../intern/guardedalloc ../render/extern/include - ../render/intern/include ../blenloader ../../../extern/glew/include -) - -BLENDERLIB_NOLIST(blender_radiosity "${SRC}" "${INC}") -#env.BlenderLib ( 'blender_radiosity', sources, Split(incs), [], libtype='core', priority=50 ) diff --git a/source/blender/radiosity/Makefile b/source/blender/radiosity/Makefile deleted file mode 100644 index 91a13e2fd57..00000000000 --- a/source/blender/radiosity/Makefile +++ /dev/null @@ -1,34 +0,0 @@ -# -# $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 ***** -# -# Makes module object directory and bounces make to subdirectories. - -SOURCEDIR = source/blender/radiosity -DIRS = intern - -include nan_subdirs.mk diff --git a/source/blender/radiosity/SConscript b/source/blender/radiosity/SConscript deleted file mode 100644 index 29854d2ee83..00000000000 --- a/source/blender/radiosity/SConscript +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/python -Import ('env') - -sources = env.Glob('intern/source/*.c') - -incs = 'extern/include ../blenlib ../blenkernel ../makesdna ../editors/include' -incs += ' #/intern/guardedalloc ../render/extern/include' -incs += ' ../render/intern/include ../blenloader #/extern/glew/include' - -incs += ' ' + env['BF_OPENGL_INC'] - -env.BlenderLib ( 'bf_radiosity', sources, Split(incs), [], libtype='core', priority=150 ) diff --git a/source/blender/radiosity/extern/include/radio.h b/source/blender/radiosity/extern/include/radio.h deleted file mode 100644 index e7f23302880..00000000000 --- a/source/blender/radiosity/extern/include/radio.h +++ /dev/null @@ -1,173 +0,0 @@ -/* *************************************** - - - - radio.h nov/dec 1992 - revised for Blender may 1999 - - $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 ***** - */ - -#ifndef RADIO_H -#define RADIO_H -#define RADIO_H - -/* type include */ -#include "radio_types.h" - -extern RadGlobal RG; -struct View3D; -struct Scene; - -/* radfactors.c */ -extern float calcStokefactor(RPatch *shoot, RPatch *rp, RNode *rn, float *area); -extern void calcTopfactors(void); -void calcSidefactors(void); -extern void initradiosity(void); -extern void rad_make_hocos(RadView *vw); -extern void hemizbuf(RadView *vw); -extern int makeformfactors(RPatch *shoot); -extern void applyformfactors(RPatch *shoot); -extern RPatch *findshootpatch(void); -extern void setnodeflags(RNode *rn, int flag, int set); -extern void backface_test(RPatch *shoot); -extern void clear_backface_test(void); -extern void progressiverad(void); -extern void minmaxradelem(RNode *rn, float *min, float *max); -extern void minmaxradelemfilt(RNode *rn, float *min, float *max, float *errmin, float *errmax); -extern void subdivideshootElements(int it); -extern void subdivideshootPatches(int it); -extern void inithemiwindows(void); -extern void closehemiwindows(void); -void rad_init_energy(void); - -/* radio.c */ -void freeAllRad(struct Scene *scene); -int rad_phase(void); -void rad_status_str(char *str); -void rad_printstatus(void); -void rad_setlimits(struct Scene *scene); -void set_radglobal(struct Scene *scene); -void add_radio(struct Scene *scene); -void delete_radio(struct Scene *scene); -int rad_go(struct Scene *scene); -void rad_subdivshootpatch(struct Scene *scene); -void rad_subdivshootelem(struct Scene *scene); -void rad_limit_subdivide(struct Scene *scene); - -/* radnode.c */ -extern void setnodelimit(float limit); -extern float *mallocVert(void); -extern float *callocVert(void); -extern void freeVert(float *vert); -extern int totalRadVert(void); -extern RNode *mallocNode(void); -extern RNode *callocNode(void); -extern void freeNode(RNode *node); -extern void freeNode_recurs(RNode *node); -extern RPatch *mallocPatch(void); -extern RPatch *callocPatch(void); -extern void freePatch(RPatch *patch); -extern void replaceAllNode(RNode *, RNode *); -extern void replaceAllNodeInv(RNode *neighb, RNode *old); -extern void replaceAllNodeUp(RNode *neighb, RNode *old); -extern void replaceTestNode(RNode *, RNode **, RNode *, int , float *); -extern void free_fastAll(void); - -/* radnode.c */ -extern void start_fastmalloc(char *str); -extern int setvertexpointersNode(RNode *neighb, RNode *node, int level, float **v1, float **v2); -extern float edlen(float *v1, float *v2); -extern void deleteNodes(RNode *node); -extern void subdivideTriNode(RNode *node, RNode *edge); -extern void subdivideNode(RNode *node, RNode *edge); -extern int comparelevel(RNode *node, RNode *nb, int level); - -/* radpreprocess.c */ -extern void splitconnected(void); -extern int vergedge(const void *v1,const void *v2); -extern void addedge(float *v1, float *v2, EdSort *es); -extern void setedgepointers(void); -extern void rad_collect_meshes(struct Scene *scene, struct View3D *v3d); -extern void countelem(RNode *rn); -extern void countglobaldata(void); -extern void addelem(RNode ***el, RNode *rn, RPatch *rp); -extern void makeGlobalElemArray(void); -extern void remakeGlobaldata(void); -extern void splitpatch(RPatch *old); -extern void addpatch(RPatch *old, RNode *rn); -extern void converttopatches(void); -extern void make_elements(void); -extern void subdividelamps(void); -extern void maxsizePatches(void); -extern void subdiv_elements(void); - -/* radpostprocess.c */ -void addaccu(register char *z, register char *t); -void addaccuweight(register char *z, register char *t, int w); -void triaweight(Face *face, int *w1, int *w2, int *w3); -void init_face_tab(void); -Face *addface(void); -Face *makeface(float *v1, float *v2, float *v3, float *v4, RNode *rn); -void anchorQuadface(RNode *rn, float *v1, float *v2, float *v3, float *v4, int flag); -void anchorTriface(RNode *rn, float *v1, float *v2, float *v3, int flag); -float *findmiddlevertex(RNode *node, RNode *nb, float *v1, float *v2); -void make_face_tab(void); -void filterFaces(void); -void calcfiltrad(RNode *rn, float *cd); -void filterNodes(void); -void removeEqualNodes(short limit); -void rad_addmesh(struct Scene *scene); -void rad_replacemesh(struct Scene *scene); - -/* raddisplay.c */ -extern char calculatecolor(float col); -extern void make_node_display(void); -extern void drawnodeWire(RNode *rn); -extern void drawsingnodeWire(RNode *rn); -extern void drawnodeSolid(RNode *rn); -extern void drawnodeGour(RNode *rn); -extern void drawpatch(RPatch *patch, unsigned int col); -extern void drawfaceGour(Face *face); -extern void drawfaceSolid(Face *face); -extern void drawfaceWire(Face *face); -extern void drawsquare(float *cent, float size, short cox, short coy); -extern void drawlimits(void); -extern void setcolNode(RNode *rn, unsigned int *col); -extern void pseudoAmb(void); -extern void rad_forcedraw(void); -extern void drawpatch_ext(RPatch *patch, unsigned int col); -extern void RAD_drawall(int depth_is_on); - -/* radrender.c */ -struct Render; -extern void do_radio_render(struct Render *re); -void end_radio_render(void); - -#endif /* RADIO_H */ - diff --git a/source/blender/radiosity/extern/include/radio_types.h b/source/blender/radiosity/extern/include/radio_types.h deleted file mode 100644 index 5a218ee71be..00000000000 --- a/source/blender/radiosity/extern/include/radio_types.h +++ /dev/null @@ -1,168 +0,0 @@ -/* - * radio_types.h - * - * $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 ***** - */ - -/* #include "misc_util.h" */ /* for listbase...*/ - - -#ifndef RADIO_TYPES_H -#define RADIO_TYPES_H - -#include "DNA_listBase.h" -#include "DNA_material_types.h" - -struct Render; -struct CustomData; - -#define PI M_PI -#define RAD_MAXFACETAB 1024 -#define RAD_NEXTFACE(a) if( ((a) & 1023)==0 ) face= RG.facebase[(a)>>10]; else face++; - -/* RG.phase */ -#define RAD_SHOOTE 1 -#define RAD_SHOOTP 2 -#define RAD_SOLVE 3 - -typedef struct RadView { - float cam[3], tar[3], up[3]; - float wx1, wx2, wy1, wy2; - float mynear, myfar; - float viewmat[4][4], winmat[4][4]; - unsigned int *rect, *rectz; - short rectx, recty; - int wid; - -} RadView; - -/* rn->f */ -#define RAD_PATCH 1 -#define RAD_SHOOT 2 -#define RAD_SUBDIV 4 -#define RAD_BACKFACE 8 -#define RAD_TWOSIDED 16 - - -typedef struct RNode { /* length: 104 */ - struct RNode *down1, *down2, *up; - struct RNode *ed1, *ed2, *ed3, *ed4; - struct RPatch *par; - - char lev1, lev2, lev3, lev4; /* edgelevels */ - short type; /* type: 4==QUAD, 3==TRIA */ - short f; - float *v1, *v2, *v3, *v4; - float totrad[3], area; - - unsigned int col; - int orig; /* index in custom face data */ -} RNode; - - -typedef struct Face { /* length: 52 */ - float *v1, *v2, *v3, *v4; - unsigned int col, matindex; - int orig; /* index in custom face data */ -} Face; - -/* rp->f1 */ -#define RAD_NO_SPLIT 1 - -typedef struct RPatch { - struct RPatch *next, *prev; - RNode *first; /* first node==patch */ - - struct Object *from; - - int type; /* 3: TRIA, 4: QUAD */ - short f, f1; /* flags f: if node, only for subdiv */ - - float ref[3], emit[3], unshot[3]; - float cent[3], norm[3]; - float area; - int matindex; - -} RPatch; - - -typedef struct VeNoCo { /* needed for splitconnected */ - struct VeNoCo *next; - float *v; - float *n; - float *col; - int flag; -} VeNoCo; - - -typedef struct EdSort { /* sort edges */ - float *v1, *v2; - RNode *node; - int nr; -} EdSort; - -typedef struct { - struct Radio *radio; - unsigned int *hemibuf; - struct ListBase patchbase; - int totpatch, totelem, totvert, totlamp; - RNode **elem; /* global array with all pointers */ - VeNoCo *verts; /* temporal vertices from patches */ - float *formfactors; /* 1 factor per element */ - float *topfactors, *sidefactors; /* LUT for delta's */ - int *index; /* LUT for above LUT */ - Face **facebase; - int totface; - float min[3], max[3], size[3], cent[3]; /* world */ - float maxsize, totenergy; - float patchmin, patchmax; - float elemmin, elemmax; - float radfactor, lostenergy, igamma; /* radfac is in button, radfactor is calculated */ - int phase; - struct Render *re; /* for calling hemizbuf correctly */ - /* to preserve materials as used before, max 16 */ - Material *matar[MAXMAT]; - int totmat; - - /* for preserving face data */ - int mfdatatot; - struct CustomData *mfdata; - struct RNode **mfdatanodes; - - /* this part is a copy of struct Radio */ - short hemires, maxiter; - short drawtype, flag; /* bit 0 en 1: show limits */ - short subshootp, subshoote, nodelim, maxsublamp; - int maxnode; - float convergence; - float radfac, gamma; /* for display */ - -} RadGlobal; - -#endif /* radio_types.h */ - diff --git a/source/blender/radiosity/intern/Makefile b/source/blender/radiosity/intern/Makefile deleted file mode 100644 index 456b51cc56e..00000000000 --- a/source/blender/radiosity/intern/Makefile +++ /dev/null @@ -1,34 +0,0 @@ -# -# $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 ***** -# -# Makes module object directory and bounces make to subdirectories. - -SOURCEDIR = source/blender/radiosity/intern -DIRS = source - -include nan_subdirs.mk diff --git a/source/blender/radiosity/intern/source/Makefile b/source/blender/radiosity/intern/source/Makefile deleted file mode 100644 index 44b38de9bae..00000000000 --- a/source/blender/radiosity/intern/source/Makefile +++ /dev/null @@ -1,55 +0,0 @@ -# -# $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 ***** -# -# radiosity uses the render lib -# - -LIBNAME = radiosity -DIR = $(OCGDIR)/blender/$(LIBNAME) - -include nan_compile.mk - -CFLAGS += $(LEVEL_1_C_WARNINGS) - -CPPFLAGS += -I$(NAN_GLEW)/include -CPPFLAGS += -I$(OPENGL_HEADERS) - -# not very neat.... -CPPFLAGS += -I../../../blenkernel -CPPFLAGS += -I../../../blenlib -CPPFLAGS += -I../../../makesdna -CPPFLAGS += -I../../../imbuf -CPPFLAGS += -I../../../ -CPPFLAGS += -I../../../blenloader -CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include - -# first /include is my own includes, second are the external includes -# third is the external interface. there should be a nicer way to say this -CPPFLAGS += -I../include -I../../../editors/include -I../../extern/include -CPPFLAGS += -I../../../render/extern/include -CPPFLAGS += -I../../../render/intern/include diff --git a/source/blender/radiosity/intern/source/raddisplay.c b/source/blender/radiosity/intern/source/raddisplay.c deleted file mode 100644 index ab9e8eedc28..00000000000 --- a/source/blender/radiosity/intern/source/raddisplay.c +++ /dev/null @@ -1,477 +0,0 @@ -/* *************************************** - * - * ***** 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 ***** - - - - raddisplay.c nov/dec 1992 - may 1999 - - - drawing - - color calculation for display during solving - - $Id$ - - *************************************** */ - -#include <stdlib.h> -#include <math.h> - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "BLI_blenlib.h" - -#include "DNA_radio_types.h" -#include "DNA_screen_types.h" -#include "DNA_space_types.h" -#include "DNA_view3d_types.h" - -#include "BKE_global.h" -#include "BKE_main.h" - -#include "BIF_gl.h" - -#include "radio.h" - -/* cpack has to be endian-insensitive! (old irisgl function) */ -#define cpack(x) glColor3ub( ((x)&0xFF), (((x)>>8)&0xFF), (((x)>>16)&0xFF) ) - -char calculatecolor(float col) -{ - int b; - - if(RG.gamma==1.0) { - b= RG.radfactor*col; - } - else if(RG.gamma==2.0) { - b= RG.radfactor*sqrt(col); - } - else { - b= RG.radfactor*pow(col, RG.igamma); - } - - if(b>255) b=255; - return b; -} - -void make_node_display() -{ - RNode *rn, **el; - int a; - char *charcol; - - RG.igamma= 1.0/RG.gamma; - RG.radfactor= RG.radfac*pow(64*64, RG.igamma); - - el= RG.elem; - for(a=RG.totelem; a>0; a--, el++) { - rn= *el; - charcol= (char *)&( rn->col ); - - charcol[3]= calculatecolor(rn->totrad[0]); - charcol[2]= calculatecolor(rn->totrad[1]); - charcol[1]= calculatecolor(rn->totrad[2]); - - /* gouraudcolor */ - *(rn->v1+3)= 0; - *(rn->v2+3)= 0; - *(rn->v3+3)= 0; - if(rn->v4) *(rn->v4+3)= 0; - } - - el= RG.elem; - for(a=RG.totelem; a>0; a--, el++) { - rn= *el; - addaccuweight( (char *)&(rn->col), (char *)(rn->v1+3), 16 ); - addaccuweight( (char *)&(rn->col), (char *)(rn->v2+3), 16 ); - addaccuweight( (char *)&(rn->col), (char *)(rn->v3+3), 16 ); - if(rn->v4) addaccuweight( (char *)&(rn->col), (char *)(rn->v4+3), 16 ); - } -} - -void drawnodeWire(RNode *rn) -{ - - if(rn->down1) { - drawnodeWire(rn->down1); - drawnodeWire(rn->down2); - } - else { - glBegin(GL_LINE_LOOP); - glVertex3fv(rn->v1); - glVertex3fv(rn->v2); - glVertex3fv(rn->v3); - if(rn->type==4) glVertex3fv(rn->v4); - glEnd(); - } -} - -void drawsingnodeWire(RNode *rn) -{ - - glBegin(GL_LINE_LOOP); - glVertex3fv(rn->v1); - glVertex3fv(rn->v2); - glVertex3fv(rn->v3); - if(rn->type==4) glVertex3fv(rn->v4); - glEnd(); -} - -void drawnodeSolid(RNode *rn) -{ - char *cp; - - if(rn->down1) { - drawnodeSolid(rn->down1); - drawnodeSolid(rn->down2); - } - else { - cp= (char *)&rn->col; - glColor3ub(cp[3], cp[2], cp[1]); - glBegin(GL_POLYGON); - glVertex3fv(rn->v1); - glVertex3fv(rn->v2); - glVertex3fv(rn->v3); - if(rn->type==4) glVertex3fv(rn->v4); - glEnd(); - } -} - -void drawnodeGour(RNode *rn) -{ - char *cp; - - if(rn->down1) { - drawnodeGour(rn->down1); - drawnodeGour(rn->down2); - } - else { - glBegin(GL_POLYGON); - cp= (char *)(rn->v1+3); - glColor3ub(cp[3], cp[2], cp[1]); - glVertex3fv(rn->v1); - - cp= (char *)(rn->v2+3); - glColor3ub(cp[3], cp[2], cp[1]); - glVertex3fv(rn->v2); - - cp= (char *)(rn->v3+3); - glColor3ub(cp[3], cp[2], cp[1]); - glVertex3fv(rn->v3); - - if(rn->type==4) { - cp= (char *)(rn->v4+3); - glColor3ub(cp[3], cp[2], cp[1]); - glVertex3fv(rn->v4); - } - glEnd(); - } -} - -void drawpatch_ext(RPatch *patch, unsigned int col) -{ - ScrArea *sa, *oldsa; - View3D *v3d; - glDrawBuffer(GL_FRONT); - - return; // XXX - - cpack(col); - - oldsa= NULL; // XXX curarea; - -// sa= G.curscreen->areabase.first; - while(sa) { - if (sa->spacetype==SPACE_VIEW3D) { - v3d= sa->spacedata.first; - - /* use mywinget() here: otherwise it draws in header */ -// XXX if(sa->win != mywinget()) areawinset(sa->win); -// XXX persp(PERSP_VIEW); - if(v3d->zbuf) glDisable(GL_DEPTH_TEST); - drawnodeWire(patch->first); - if(v3d->zbuf) glEnable(GL_DEPTH_TEST); // pretty useless? - } - sa= sa->next; - } - -// XXX if(oldsa && oldsa!=curarea) areawinset(oldsa->win); - - glFlush(); - glDrawBuffer(GL_BACK); -} - - -void drawfaceGour(Face *face) -{ - char *cp; - - glBegin(GL_POLYGON); - cp= (char *)(face->v1+3); - glColor3ub(cp[3], cp[2], cp[1]); - glVertex3fv(face->v1); - - cp= (char *)(face->v2+3); - glColor3ub(cp[3], cp[2], cp[1]); - glVertex3fv(face->v2); - - cp= (char *)(face->v3+3); - glColor3ub(cp[3], cp[2], cp[1]); - glVertex3fv(face->v3); - - if(face->v4) { - cp= (char *)(face->v4+3); - glColor3ub(cp[3], cp[2], cp[1]); - glVertex3fv(face->v4); - } - glEnd(); - -} - -void drawfaceSolid(Face *face) -{ - char *cp; - - cp= (char *)&face->col; - glColor3ub(cp[3], cp[2], cp[1]); - - glBegin(GL_POLYGON); - glVertex3fv(face->v1); - glVertex3fv(face->v2); - glVertex3fv(face->v3); - if(face->v4) { - glVertex3fv(face->v4); - } - glEnd(); - -} - -void drawfaceWire(Face *face) -{ - char *cp; - - cp= (char *)&face->col; - glColor3ub(cp[3], cp[2], cp[1]); - - glBegin(GL_LINE_LOOP); - glVertex3fv(face->v1); - glVertex3fv(face->v2); - glVertex3fv(face->v3); - if(face->v4) { - glVertex3fv(face->v4); - } - glEnd(); - -} - -void drawsquare(float *cent, float size, short cox, short coy) -{ - float vec[3]; - - vec[0]= cent[0]; - vec[1]= cent[1]; - vec[2]= cent[2]; - - glBegin(GL_LINE_LOOP); - vec[cox]+= .5*size; - vec[coy]+= .5*size; - glVertex3fv(vec); - vec[coy]-= size; - glVertex3fv(vec); - vec[cox]-= size; - glVertex3fv(vec); - vec[coy]+= size; - glVertex3fv(vec); - glEnd(); -} - -void drawlimits() -{ - /* center around cent */ - short cox=0, coy=1; - - if((RG.flag & (RAD_SHOWLIMITS|RAD_SHOWZ))==RAD_SHOWZ) coy= 2; - if((RG.flag & (RAD_SHOWLIMITS|RAD_SHOWZ))==(RAD_SHOWLIMITS|RAD_SHOWZ)) { - cox= 1; - coy= 2; - } - - cpack(0); - drawsquare(RG.cent, sqrt(RG.patchmax), cox, coy); - drawsquare(RG.cent, sqrt(RG.patchmin), cox, coy); - - drawsquare(RG.cent, sqrt(RG.elemmax), cox, coy); - drawsquare(RG.cent, sqrt(RG.elemmin), cox, coy); - - cpack(0xFFFFFF); - drawsquare(RG.cent, sqrt(RG.patchmax), cox, coy); - drawsquare(RG.cent, sqrt(RG.patchmin), cox, coy); - cpack(0xFFFF00); - drawsquare(RG.cent, sqrt(RG.elemmax), cox, coy); - drawsquare(RG.cent, sqrt(RG.elemmin), cox, coy); - -} - -void setcolNode(RNode *rn, unsigned int *col) -{ - - if(rn->down1) { - setcolNode(rn->down1, col); - setcolNode(rn->down2, col); - } - rn->col= *col; - - *((unsigned int *)rn->v1+3)= *col; - *((unsigned int *)rn->v2+3)= *col; - *((unsigned int *)rn->v3+3)= *col; - if(rn->v4) *((unsigned int *)rn->v4+3)= *col; -} - -void pseudoAmb() -{ - RPatch *rp; - float fac; - char col[4]; - - /* sets pseudo ambient color in the nodes */ - - rp= RG.patchbase.first; - while(rp) { - - if(rp->emit[0]!=0.0 || rp->emit[1]!=0.0 || rp->emit[2]!=0.0) { - col[1]= col[2]= col[3]= 255; - } - else { - fac= rp->norm[0]+ rp->norm[1]+ rp->norm[2]; - fac= 225.0*(3+fac)/6.0; - - col[3]= fac*rp->ref[0]; - col[2]= fac*rp->ref[1]; - col[1]= fac*rp->ref[2]; - } - - setcolNode(rp->first, (unsigned int *)col); - - rp= rp->next; - } -} - -void RAD_drawall(int depth_is_on) -{ - /* displays elements or faces */ - Face *face = NULL; - RNode **el; - RPatch *rp; - int a; - - if(!depth_is_on) { - glEnable(GL_DEPTH_TEST); - glClearDepth(1.0); glClear(GL_DEPTH_BUFFER_BIT); - } - - if(RG.totface) { - if(RG.drawtype==RAD_GOURAUD) { - glShadeModel(GL_SMOOTH); - for(a=0; a<RG.totface; a++) { - RAD_NEXTFACE(a); - - drawfaceGour(face); - } - } - else if(RG.drawtype==RAD_SOLID) { - for(a=0; a<RG.totface; a++) { - RAD_NEXTFACE(a); - - drawfaceSolid(face); - } - } - else { - cpack(0); - rp= RG.patchbase.first; - while(rp) { - drawsingnodeWire(rp->first); - rp= rp->next; - } - } - } - else { - el= RG.elem; - if(RG.drawtype==RAD_GOURAUD) { - glShadeModel(GL_SMOOTH); - for(a=RG.totelem; a>0; a--, el++) { - drawnodeGour(*el); - } - } - else if(RG.drawtype==RAD_SOLID) { - for(a=RG.totelem; a>0; a--, el++) { - drawnodeSolid(*el); - } - } - else { - cpack(0); - for(a=RG.totelem; a>0; a--, el++) { - drawnodeWire(*el); - } - } - } - glShadeModel(GL_FLAT); - - if(RG.totpatch) { - if(RG.flag & (RAD_SHOWLIMITS|RAD_SHOWZ)) { - if(depth_is_on) glDisable(GL_DEPTH_TEST); - drawlimits(); - if(depth_is_on) glEnable(GL_DEPTH_TEST); - } - } - if(!depth_is_on) { - glDisable(GL_DEPTH_TEST); - } -} - -void rad_forcedraw() -{ - ScrArea *sa, *oldsa; - - return; // XXX - - oldsa= NULL; // XXX curarea; - -/// sa= G.curscreen->areabase.first; - while(sa) { - if (sa->spacetype==SPACE_VIEW3D) { - /* use mywinget() here: othwerwise it draws in header */ -// XXX if(sa->win != mywinget()) areawinset(sa->win); -// XXX scrarea_do_windraw(sa); - } - sa= sa->next; - } -// XXX screen_swapbuffers(); - -// XXX if(oldsa && oldsa!=curarea) areawinset(oldsa->win); -} - diff --git a/source/blender/radiosity/intern/source/radfactors.c b/source/blender/radiosity/intern/source/radfactors.c deleted file mode 100644 index b87473dd811..00000000000 --- a/source/blender/radiosity/intern/source/radfactors.c +++ /dev/null @@ -1,939 +0,0 @@ -/* *************************************** - * - * ***** 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 ***** - - - - formfactors.c nov/dec 1992 - - $Id$ - - *************************************** */ - -#include <stdlib.h> -#include <string.h> -#include <math.h> - -#include "MEM_guardedalloc.h" - -#include "BLI_blenlib.h" -#include "BLI_arithb.h" -#include "BLI_rand.h" - -#include "BKE_utildefines.h" -#include "BKE_global.h" -#include "BKE_main.h" - -#include "radio.h" -#include "RE_render_ext.h" /* for `RE_zbufferall_radio and RE_zbufferall_radio */ - -/* locals */ -static void rad_setmatrices(RadView *vw); -static void clearsubflagelem(RNode *rn); -static void setsubflagelem(RNode *rn); - -RadView hemitop, hemiside; - -float calcStokefactor(RPatch *shoot, RPatch *rp, RNode *rn, float *area) -{ - float tvec[3], fac; - float vec[4][3]; /* vectors of shoot->cent to vertices rp */ - float cross[4][3]; /* cross products of this */ - float rad[4]; /* anlgles between vecs */ - - /* test for direction */ - VecSubf(tvec, shoot->cent, rp->cent); - if( tvec[0]*shoot->norm[0]+ tvec[1]*shoot->norm[1]+ tvec[2]*shoot->norm[2]>0.0) - return 0.0; - - if(rp->type==4) { - - /* corner vectors */ - VecSubf(vec[0], shoot->cent, rn->v1); - VecSubf(vec[1], shoot->cent, rn->v2); - VecSubf(vec[2], shoot->cent, rn->v3); - VecSubf(vec[3], shoot->cent, rn->v4); - - Normalize(vec[0]); - Normalize(vec[1]); - Normalize(vec[2]); - Normalize(vec[3]); - - /* cross product */ - Crossf(cross[0], vec[0], vec[1]); - Crossf(cross[1], vec[1], vec[2]); - Crossf(cross[2], vec[2], vec[3]); - Crossf(cross[3], vec[3], vec[0]); - Normalize(cross[0]); - Normalize(cross[1]); - Normalize(cross[2]); - Normalize(cross[3]); - - /* angles */ - rad[0]= vec[0][0]*vec[1][0]+ vec[0][1]*vec[1][1]+ vec[0][2]*vec[1][2]; - rad[1]= vec[1][0]*vec[2][0]+ vec[1][1]*vec[2][1]+ vec[1][2]*vec[2][2]; - rad[2]= vec[2][0]*vec[3][0]+ vec[2][1]*vec[3][1]+ vec[2][2]*vec[3][2]; - rad[3]= vec[3][0]*vec[0][0]+ vec[3][1]*vec[0][1]+ vec[3][2]*vec[0][2]; - - rad[0]= acos(rad[0]); - rad[1]= acos(rad[1]); - rad[2]= acos(rad[2]); - rad[3]= acos(rad[3]); - - /* Stoke formula */ - VecMulf(cross[0], rad[0]); - VecMulf(cross[1], rad[1]); - VecMulf(cross[2], rad[2]); - VecMulf(cross[3], rad[3]); - - VECCOPY(tvec, shoot->norm); - fac= tvec[0]*cross[0][0]+ tvec[1]*cross[0][1]+ tvec[2]*cross[0][2]; - fac+= tvec[0]*cross[1][0]+ tvec[1]*cross[1][1]+ tvec[2]*cross[1][2]; - fac+= tvec[0]*cross[2][0]+ tvec[1]*cross[2][1]+ tvec[2]*cross[2][2]; - fac+= tvec[0]*cross[3][0]+ tvec[1]*cross[3][1]+ tvec[2]*cross[3][2]; - } - else { - /* corner vectors */ - VecSubf(vec[0], shoot->cent, rn->v1); - VecSubf(vec[1], shoot->cent, rn->v2); - VecSubf(vec[2], shoot->cent, rn->v3); - - Normalize(vec[0]); - Normalize(vec[1]); - Normalize(vec[2]); - - /* cross product */ - Crossf(cross[0], vec[0], vec[1]); - Crossf(cross[1], vec[1], vec[2]); - Crossf(cross[2], vec[2], vec[0]); - Normalize(cross[0]); - Normalize(cross[1]); - Normalize(cross[2]); - - /* angles */ - rad[0]= vec[0][0]*vec[1][0]+ vec[0][1]*vec[1][1]+ vec[0][2]*vec[1][2]; - rad[1]= vec[1][0]*vec[2][0]+ vec[1][1]*vec[2][1]+ vec[1][2]*vec[2][2]; - rad[2]= vec[2][0]*vec[0][0]+ vec[2][1]*vec[0][1]+ vec[2][2]*vec[0][2]; - - rad[0]= acos(rad[0]); - rad[1]= acos(rad[1]); - rad[2]= acos(rad[2]); - - /* Stoke formula */ - VecMulf(cross[0], rad[0]); - VecMulf(cross[1], rad[1]); - VecMulf(cross[2], rad[2]); - - VECCOPY(tvec, shoot->norm); - fac= tvec[0]*cross[0][0]+ tvec[1]*cross[0][1]+ tvec[2]*cross[0][2]; - fac+= tvec[0]*cross[1][0]+ tvec[1]*cross[1][1]+ tvec[2]*cross[1][2]; - fac+= tvec[0]*cross[2][0]+ tvec[1]*cross[2][1]+ tvec[2]*cross[2][2]; - } - - *area= -fac/(2.0*PI); - return (*area * (shoot->area/rn->area)); -} - - -void calcTopfactors() -{ - float xsq , ysq, xysq; - float n; - float *fp; - int a, b, hres; - - fp = RG.topfactors; - hres= RG.hemires/2; - n= hres; - - for (a=0; a<hres; a++) { - - ysq= (n- ((float)a+0.5))/n; - ysq*= ysq; - - for ( b=0 ; b<hres ; b++ ) { - - xsq= ( n-((float)b+ 0.5) )/n; - xsq*= xsq; - xysq= xsq+ ysq+ 1.0 ; - xysq*= xysq; - - *fp++ = 1.0/(xysq* PI* n*n); - } - } - -} - -void calcSidefactors() -{ - float xsq , ysq, xysq; - float n, y; - float *fp; - int a, b, hres; - - fp = RG.sidefactors; - hres= RG.hemires/2; - n= hres; - - for (a=0; a<hres; a++) { - - y= (n- ((float)a+0.5))/n; - ysq= y*y; - - for ( b=0 ; b<hres ; b++ ) { - - xsq= ( n-((float)b+ 0.5) )/n; - xsq*= xsq; - xysq= xsq+ ysq+ 1.0 ; - xysq*= xysq; - - *fp++ = y/(xysq* PI* n*n); - } - } - -} - - -void initradiosity() -{ - /* allocates and makes LUTs for top/side factors */ - /* allocates and makes index array */ - int a, hres2; - - if(RG.topfactors) MEM_freeN(RG.topfactors); - if(RG.sidefactors) MEM_freeN(RG.sidefactors); - if(RG.index) MEM_freeN(RG.index); - - RG.topfactors= MEM_callocN(RG.hemires*RG.hemires, "initradiosity"); - calcTopfactors(); - RG.sidefactors= MEM_callocN(RG.hemires*RG.hemires, "initradiosity1"); - calcSidefactors(); - - RG.index= MEM_callocN(4*RG.hemires, "initradiosity3"); - hres2= RG.hemires/2; - for(a=0; a<RG.hemires; a++) { - RG.index[a]= a<hres2 ? a: (hres2-1-( a % hres2 )); - } - -} - -void rad_make_hocos(RadView *vw) -{ - /* float hoco[4]; */ - /* int a; */ - - /* for(a=0; a< R.totvert;a++) { */ - /* projectvert(vec, ver->ho); */ - /* ver->clip = testclip(ver->ho); */ -/* */ - /* } */ -} - -static void rad_setmatrices(RadView *vw) /* for hemi's */ -{ - float up1[3], len, twist; - - i_lookat(vw->cam[0], vw->cam[1], vw->cam[2], vw->tar[0], vw->tar[1], vw->tar[2], 0, vw->viewmat); - up1[0] = vw->viewmat[0][0]*vw->up[0] + vw->viewmat[1][0]*vw->up[1] + vw->viewmat[2][0]*vw->up[2]; - up1[1] = vw->viewmat[0][1]*vw->up[0] + vw->viewmat[1][1]*vw->up[1] + vw->viewmat[2][1]*vw->up[2]; - up1[2] = vw->viewmat[0][2]*vw->up[0] + vw->viewmat[1][2]*vw->up[1] + vw->viewmat[2][2]*vw->up[2]; - - len= up1[0]*up1[0]+up1[1]*up1[1]; - if(len>0.0) { - twist= -atan2(up1[0], up1[1]); - } - else twist= 0.0; - - i_lookat(vw->cam[0], vw->cam[1], vw->cam[2], vw->tar[0], vw->tar[1], vw->tar[2], (180.0*twist/M_PI), vw->viewmat); - - /* window matrix was set in inithemiwindows */ - -} - - -void hemizbuf(RadView *vw) -{ - float *factors; - unsigned int *rz; - int a, b, inda, hres; - - rad_setmatrices(vw); - RE_zbufferall_radio(vw, RG.elem, RG.totelem, RG.re); /* Render for when we got renderfaces */ - - /* count factors */ - if(vw->recty==vw->rectx) factors= RG.topfactors; - else factors= RG.sidefactors; - hres= RG.hemires/2; - - rz= vw->rect; - for(a=0; a<vw->recty; a++) { - inda= hres*RG.index[a]; - for(b=0; b<vw->rectx; b++, rz++) { - if(*rz<RG.totelem) { - RG.formfactors[*rz]+= factors[inda+RG.index[b]]; - } - } - } -} - -int makeformfactors(RPatch *shoot) -{ - RNode **re; - float len, vec[3], up[3], side[3], tar[5][3], *fp; - int a=0, overfl; - - if(RG.totelem==0) return 0; - - memset(RG.formfactors, 0, 4*RG.totelem); - - /* set up hemiview */ - /* first: random upvector */ - do { - a++; - vec[0]= (float)BLI_drand(); - vec[1]= (float)BLI_drand(); - vec[2]= (float)BLI_drand(); - Crossf(up, shoot->norm, vec); - len= Normalize(up); - /* this safety for input normals that are zero or illegal sized */ - if(a>3) return 0; - } while(len==0.0 || len>1.0); - - VECCOPY(hemitop.up, up); - VECCOPY(hemiside.up, shoot->norm); - - Crossf(side, shoot->norm, up); - - /* five targets */ - VecAddf(tar[0], shoot->cent, shoot->norm); - VecAddf(tar[1], shoot->cent, up); - VecSubf(tar[2], shoot->cent, up); - VecAddf(tar[3], shoot->cent, side); - VecSubf(tar[4], shoot->cent, side); - - /* camera */ - VECCOPY(hemiside.cam, shoot->cent); - VECCOPY(hemitop.cam, shoot->cent); - - /* do it! */ - VECCOPY(hemitop.tar, tar[0]); - hemizbuf(&hemitop); - - for(a=1; a<5; a++) { - VECCOPY(hemiside.tar, tar[a]); - hemizbuf(&hemiside); - } - - /* convert factors to real radiosity */ - re= RG.elem; - fp= RG.formfactors; - - overfl= 0; - for(a= RG.totelem; a>0; a--, re++, fp++) { - - if(*fp!=0.0) { - - *fp *= shoot->area/(*re)->area; - - if(*fp>1.0) { - overfl= 1; - *fp= 1.0001; - } - } - } - - if(overfl) { - if(shoot->first->down1) { - splitpatch(shoot); - return 0; - } - } - - return 1; -} - -void applyformfactors(RPatch *shoot) -{ - RPatch *rp; - RNode **el, *rn; - float *fp, *ref, unr, ung, unb, r, g, b, w; - int a; - - unr= shoot->unshot[0]; - ung= shoot->unshot[1]; - unb= shoot->unshot[2]; - - fp= RG.formfactors; - el= RG.elem; - for(a=0; a<RG.totelem; a++, el++, fp++) { - rn= *el; - if(*fp!= 0.0) { - rp= rn->par; - ref= rp->ref; - - r= (*fp)*unr*ref[0]; - g= (*fp)*ung*ref[1]; - b= (*fp)*unb*ref[2]; - - w= rn->area/rp->area; - rn->totrad[0]+= r; - rn->totrad[1]+= g; - rn->totrad[2]+= b; - - rp->unshot[0]+= w*r; - rp->unshot[1]+= w*g; - rp->unshot[2]+= w*b; - } - } - - shoot->unshot[0]= shoot->unshot[1]= shoot->unshot[2]= 0.0; -} - -RPatch *findshootpatch() -{ - RPatch *rp, *shoot; - float energy, maxenergy; - - shoot= 0; - maxenergy= 0.0; - rp= RG.patchbase.first; - while(rp) { - energy= rp->unshot[0]*rp->area; - energy+= rp->unshot[1]*rp->area; - energy+= rp->unshot[2]*rp->area; - - if(energy>maxenergy) { - shoot= rp; - maxenergy= energy; - } - rp= rp->next; - } - - if(shoot) { - maxenergy/= RG.totenergy; - if(maxenergy<RG.convergence) return 0; - } - - return shoot; -} - -void setnodeflags(RNode *rn, int flag, int set) -{ - - if(rn->down1) { - setnodeflags(rn->down1, flag, set); - setnodeflags(rn->down2, flag, set); - } - else { - if(set) rn->f |= flag; - else rn->f &= ~flag; - } -} - -void backface_test(RPatch *shoot) -{ - RPatch *rp; - float tvec[3]; - - rp= RG.patchbase.first; - while(rp) { - if(rp!=shoot) { - - VecSubf(tvec, shoot->cent, rp->cent); - if( tvec[0]*rp->norm[0]+ tvec[1]*rp->norm[1]+ tvec[2]*rp->norm[2]<0.0) { - setnodeflags(rp->first, RAD_BACKFACE, 1); - } - } - rp= rp->next; - } -} - -void clear_backface_test() -{ - RNode **re; - int a; - - re= RG.elem; - for(a= RG.totelem-1; a>=0; a--, re++) { - (*re)->f &= ~RAD_BACKFACE; - } - -} - -void rad_init_energy() -{ - /* call before shooting */ - /* keep patches and elements, clear all data */ - RNode **el, *rn; - RPatch *rp; - int a; - - el= RG.elem; - for(a=RG.totelem; a>0; a--, el++) { - rn= *el; - VECCOPY(rn->totrad, rn->par->emit); - } - - RG.totenergy= 0.0; - rp= RG.patchbase.first; - while(rp) { - VECCOPY(rp->unshot, rp->emit); - - RG.totenergy+= rp->unshot[0]*rp->area; - RG.totenergy+= rp->unshot[1]*rp->area; - RG.totenergy+= rp->unshot[2]*rp->area; - - rp->f= 0; - - rp= rp->next; - } -} - -void progressiverad() -{ - RPatch *shoot; - float unshot[3]; - int it= 0; - - rad_printstatus(); - rad_init_energy(); - - shoot=findshootpatch(); - - while( shoot ) { - - setnodeflags(shoot->first, RAD_SHOOT, 1); - - backface_test(shoot); - - drawpatch_ext(shoot, 0x88FF00); - - if(shoot->first->f & RAD_TWOSIDED) { - VECCOPY(unshot, shoot->unshot); - VecNegf(shoot->norm); - if(makeformfactors(shoot)) - applyformfactors(shoot); - VecNegf(shoot->norm); - VECCOPY(shoot->unshot, unshot); - } - - if( makeformfactors(shoot) ) { - applyformfactors(shoot); - - it++; - //XXX set_timecursor(it); - if( (it & 3)==1 ) { - make_node_display(); - rad_forcedraw(); - } - setnodeflags(shoot->first, RAD_SHOOT, 0); - } - - clear_backface_test(); - - //XXX if(blender_test_break()) break; - if(RG.maxiter && RG.maxiter<=it) break; - - shoot=findshootpatch(); - - } - -} - - -/* ************* subdivideshoot *********** */ - -void minmaxradelem(RNode *rn, float *min, float *max) -{ - int c; - - if(rn->down1) { - minmaxradelem(rn->down1, min, max); - minmaxradelem(rn->down2, min, max); - } - else { - for(c=0; c<3; c++) { - min[c]= MIN2(min[c], rn->totrad[c]); - max[c]= MAX2(max[c], rn->totrad[c]); - } - } -} - -void minmaxradelemfilt(RNode *rn, float *min, float *max, float *errmin, float *errmax) -{ - float col[3], area; - int c; - - if(rn->down1) { - minmaxradelemfilt(rn->down1, min, max, errmin, errmax); - minmaxradelemfilt(rn->down2, min, max, errmin, errmax); - } - else { - VECCOPY(col, rn->totrad); - - for(c=0; c<3; c++) { - min[c]= MIN2(min[c], col[c]); - max[c]= MAX2(max[c], col[c]); - } - - VecMulf(col, 2.0); - area= 2.0; - if(rn->ed1) { - VecAddf(col, rn->ed1->totrad, col); - area+= 1.0; - } - if(rn->ed2) { - VecAddf(col, rn->ed2->totrad, col); - area+= 1.0; - } - if(rn->ed3) { - VecAddf(col, rn->ed3->totrad, col); - area+= 1.0; - } - if(rn->ed4) { - VecAddf(col, rn->ed4->totrad, col); - area+= 1.0; - } - VecMulf(col, 1.0/area); - - for(c=0; c<3; c++) { - errmin[c]= MIN2(errmin[c], col[c]); - errmax[c]= MAX2(errmax[c], col[c]); - } - } -} - -static void setsubflagelem(RNode *rn) -{ - - if(rn->down1) { - setsubflagelem(rn->down1); - setsubflagelem(rn->down2); - } - else { - rn->f |= RAD_SUBDIV; - } -} - -static void clearsubflagelem(RNode *rn) -{ - - if(rn->down1) { - setsubflagelem(rn->down1); - setsubflagelem(rn->down2); - } - else { - rn->f &= ~RAD_SUBDIV; - } -} - -void subdivideshootElements(int it) -{ - RPatch *rp, *shoot; - RNode **el, *rn; - float *fp, err, stoke, area, min[3], max[3], errmin[3], errmax[3]; - int a, b, c, d, e, f, contin; - int maxlamp; - - if(RG.maxsublamp==0) maxlamp= RG.totlamp; - else maxlamp= RG.maxsublamp; - - while(it) { - rad_printstatus(); - rad_init_energy(); - it--; - - for(a=0; a<maxlamp; a++) { - shoot= findshootpatch(); - if(shoot==0) break; - - //XXX set_timecursor(a); - drawpatch_ext(shoot, 0x88FF00); - - setnodeflags(shoot->first, RAD_SHOOT, 1); - if( makeformfactors(shoot) ) { - - fp= RG.formfactors; - el= RG.elem; - for(b=RG.totelem; b>0; b--, el++) { - rn= *el; - - if( (rn->f & RAD_SUBDIV)==0 && *fp!=0.0) { - if(rn->par->emit[0]+rn->par->emit[1]+rn->par->emit[2]==0.0) { - - stoke= calcStokefactor(shoot, rn->par, rn, &area); - if(stoke!= 0.0) { - - err= *fp/stoke; - - /* area error */ - area*=(0.5*RG.hemires*RG.hemires); - - if(area>35.0) { - if(err<0.95 || err>1.05) { - if(err>0.05) { - rn->f |= RAD_SUBDIV; - rn->par->f |= RAD_SUBDIV; - } - } - } - } - - } - } - - fp++; - - } - - applyformfactors(shoot); - - if( (a & 3)==1 ) { - make_node_display(); - rad_forcedraw(); - } - - setnodeflags(shoot->first, RAD_SHOOT, 0); - } - else a--; - - //XXX if(blender_test_break()) break; - } - - /* test for extreme small color change within a patch with subdivflag */ - - rp= RG.patchbase.first; - - while(rp) { - if(rp->f & RAD_SUBDIV) { /* rp has elems that need subdiv */ - /* at least 4 levels deep */ - rn= rp->first->down1; - if(rn) { - rn= rn->down1; - if(rn) { - rn= rn->down1; - if(rn) rn= rn->down1; - } - } - if(rn) { - INIT_MINMAX(min, max); - /* errmin and max are the filtered colors */ - INIT_MINMAX(errmin, errmax); - minmaxradelemfilt(rp->first, min, max, errmin, errmax); - - /* if small difference between colors: no subdiv */ - /* also test for the filtered ones: but with higher critical level */ - - contin= 0; - a= abs( calculatecolor(min[0])-calculatecolor(max[0])); - b= abs( calculatecolor(errmin[0])-calculatecolor(errmax[0])); - if(a<15 || b<7) { - c= abs( calculatecolor(min[1])-calculatecolor(max[1])); - d= abs( calculatecolor(errmin[1])-calculatecolor(errmax[1])); - if(c<15 || d<7) { - e= abs( calculatecolor(min[2])-calculatecolor(max[2])); - f= abs( calculatecolor(errmin[2])-calculatecolor(errmax[2])); - if(e<15 || f<7) { - contin= 1; - clearsubflagelem(rp->first); - /* printf("%d %d %d %d %d %d\n", a, b, c, d, e, f); */ - } - } - } - if(contin) { - drawpatch_ext(rp, 0xFFFF); - } - } - } - rp->f &= ~RAD_SUBDIV; - rp= rp->next; - } - - contin= 0; - - el= RG.elem; - for(b=RG.totelem; b>0; b--, el++) { - rn= *el; - if(rn->f & RAD_SUBDIV) { - rn->f-= RAD_SUBDIV; - subdivideNode(rn, 0); - if(rn->down1) { - subdivideNode(rn->down1, 0); - subdivideNode(rn->down2, 0); - contin= 1; - } - } - } - makeGlobalElemArray(); - - //XXX if(contin==0 || blender_test_break()) break; - } - - make_node_display(); -} - -void subdivideshootPatches(int it) -{ - RPatch *rp, *shoot, *next; - float *fp, err, stoke, area; - int a, contin; - int maxlamp; - - if(RG.maxsublamp==0) maxlamp= RG.totlamp; - else maxlamp= RG.maxsublamp; - - while(it) { - rad_printstatus(); - rad_init_energy(); - it--; - - for(a=0; a<maxlamp; a++) { - shoot= findshootpatch(); - if(shoot==0) break; - - //XXX set_timecursor(a); - drawpatch_ext(shoot, 0x88FF00); - - setnodeflags(shoot->first, RAD_SHOOT, 1); - - if( makeformfactors(shoot) ) { - - fp= RG.formfactors; - rp= RG.patchbase.first; - while(rp) { - if(*fp!=0.0 && rp!=shoot) { - - stoke= calcStokefactor(shoot, rp, rp->first, &area); - if(stoke!= 0.0) { - if(area>.1) { /* does patch receive more than (about)10% of energy? */ - rp->f= RAD_SUBDIV; - } - else { - - err= *fp/stoke; - - /* area error */ - area*=(0.5*RG.hemires*RG.hemires); - - if(area>45.0) { - if(err<0.95 || err>1.05) { - if(err>0.05) { - - rp->f= RAD_SUBDIV; - - } - } - } - } - } - } - fp++; - - rp= rp->next; - } - - applyformfactors(shoot); - - if( (a & 3)==1 ) { - make_node_display(); - rad_forcedraw(); - } - - setnodeflags(shoot->first, RAD_SHOOT, 0); - - //XXX if(blender_test_break()) break; - } - else a--; - - } - - contin= 0; - - rp= RG.patchbase.first; - while(rp) { - next= rp->next; - if(rp->f & RAD_SUBDIV) { - if(rp->emit[0]+rp->emit[1]+rp->emit[2]==0.0) { - contin= 1; - subdivideNode(rp->first, 0); - if(rp->first->down1) { - subdivideNode(rp->first->down1, 0); - subdivideNode(rp->first->down2, 0); - } - } - } - rp= next; - } - - converttopatches(); - makeGlobalElemArray(); - - //XXX if(contin==0 || blender_test_break()) break; - } - make_node_display(); -} - -void inithemiwindows() -{ - RadView *vw; - - /* the hemiwindows */ - vw= &(hemitop); - memset(vw, 0, sizeof(RadView)); - vw->rectx= RG.hemires; - vw->recty= RG.hemires; - vw->rectz= MEM_mallocN(sizeof(int)*vw->rectx*vw->recty, "initwindows"); - vw->rect= MEM_mallocN(sizeof(int)*vw->rectx*vw->recty, "initwindows"); - vw->mynear= RG.maxsize/2000.0; - vw->myfar= 2.0*RG.maxsize; - vw->wx1= -vw->mynear; - vw->wx2= vw->mynear; - vw->wy1= -vw->mynear; - vw->wy2= vw->mynear; - - i_window(vw->wx1, vw->wx2, vw->wy1, vw->wy2, vw->mynear, vw->myfar, vw->winmat); - - hemiside= hemitop; - - vw= &(hemiside); - vw->recty/= 2; - vw->wy1= vw->wy2; - vw->wy2= 0.0; - - i_window(vw->wx1, vw->wx2, vw->wy1, vw->wy2, vw->mynear, vw->myfar, vw->winmat); - -} - -void closehemiwindows() -{ - - if(hemiside.rect) MEM_freeN(hemiside.rect); - if(hemiside.rectz) MEM_freeN(hemiside.rectz); - hemiside.rectz= 0; - hemiside.rect= 0; - hemitop.rectz= 0; - hemitop.rect= 0; -} diff --git a/source/blender/radiosity/intern/source/radio.c b/source/blender/radiosity/intern/source/radio.c deleted file mode 100644 index 63032b2d603..00000000000 --- a/source/blender/radiosity/intern/source/radio.c +++ /dev/null @@ -1,390 +0,0 @@ -/* *************************************** - * - * ***** 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 ***** - - - - radio.c nov/dec 1992 - may 1999 - - $Id$ - - - mainloop - - interactivity - - - - PREPROCES - - collect meshes - - spitconnected (all faces with different color and normals) - - setedgepointers (nodes pointing to neighbours) - - - EDITING - - min-max patch en min-max element size - - using this info patches subdividing - - lamp subdivide - - - if there are too many lamps for subdivide shooting: - - temporal join patches - - - SUBDIVIDE SHOOTING - - except for last shooting, this defines patch subdivide - - if subdivided patches still > 2*minsize : continue - - at the end create as many elements as possible - - als store if lamp (can still) cause subdivide. - - - REFINEMENT SHOOTING - - test for overflows (shootpatch subdivide) - - testen for extreme color transitions: - - if possible: shootpatch subdivide - - elements subdivide = start over ? - - continue itterate until ? - - - DEFINITIVE SHOOTING - - user indicates how many faces maximum and duration of itteration. - - - POST PROCESS - - join element- nodes when nothing happens in it (filter nodes, filter faces) - - define gamma & mul - - *************************************** */ - -#include <math.h> -#include <string.h> - -#include "MEM_guardedalloc.h" -#include "PIL_time.h" - -#include "BLI_blenlib.h" - -#include "DNA_object_types.h" -#include "DNA_radio_types.h" -#include "DNA_scene_types.h" -#include "DNA_screen_types.h" - -#include "BKE_customdata.h" -#include "BKE_global.h" -#include "BKE_main.h" - -#include "radio.h" - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -/* locals? This one was already done in radio.h... */ -/* void rad_status_str(char *str); */ - -RadGlobal RG= {0, 0}; - -void freeAllRad(Scene *scene) -{ - Base *base; - extern int Ntotvert, Ntotnode, Ntotpatch; - - /* clear flag that disables drawing the meshes */ - if(scene) { - base= (scene->base.first); - while(base) { - if(base->object->type==OB_MESH) { - base->flag &= ~OB_RADIO; - } - base= base->next; - } - } - - free_fastAll(); /* verts, nodes, patches */ - RG.patchbase.first= RG.patchbase.last= 0; - Ntotvert= Ntotnode= Ntotpatch= 0; - - closehemiwindows(); /* not real windows anymore... */ - if(RG.elem) MEM_freeN(RG.elem); - RG.elem= 0; - if(RG.verts) MEM_freeN(RG.verts); - RG.verts= 0; - if(RG.topfactors) MEM_freeN(RG.topfactors); - RG.topfactors= 0; - if(RG.sidefactors) MEM_freeN(RG.sidefactors); - RG.sidefactors= 0; - if(RG.formfactors) MEM_freeN(RG.formfactors); - RG.formfactors= 0; - if(RG.index) MEM_freeN(RG.index); - RG.index= 0; - if(RG.facebase) { - init_face_tab(); /* frees all tables */ - MEM_freeN(RG.facebase); - RG.facebase= 0; - } - - if(RG.mfdata) { - CustomData_free(RG.mfdata, RG.mfdatatot); - MEM_freeN(RG.mfdata); - MEM_freeN(RG.mfdatanodes); - RG.mfdatanodes= NULL; - RG.mfdata= NULL; - RG.mfdatatot= 0; - } - RG.totelem= RG.totpatch= RG.totvert= RG.totface= RG.totlamp= RG.totmat= 0; -} - -int rad_phase() -{ - int flag= 0; - - if(RG.totpatch) flag |= RAD_PHASE_PATCHES; - if(RG.totface) flag |= RAD_PHASE_FACES; - - return flag; -} - -void rad_status_str(char *str) -{ - extern int totfastmem; - int tot; - char *phase; - - tot= (RG.totface*sizeof(Face))/1024; - tot+= totfastmem/1024; - - if(RG.phase==RAD_SHOOTE) phase= "Phase: ELEMENT SUBD, "; - else if(RG.phase==RAD_SHOOTP) phase= "Phase: PATCH SUBD, "; - else if(RG.phase==RAD_SOLVE) phase= "Phase: SOLVE, "; - else if(RG.totpatch==0) phase= "Phase: COLLECT MESHES "; - else if(RG.totface) phase= "Phase: FINISHED, "; - else phase= "Phase: INIT, "; - - if(RG.totpatch==0) strcpy(str, phase); - else sprintf(str, "%s TotPatch: %d TotElem: %d Emit: %d Faces %d Mem: %d k ", phase, RG.totpatch, RG.totelem, RG.totlamp, RG.totface, tot); - - if(RG.phase==RAD_SOLVE) strcat(str, "(press ESC to stop)"); -} - -void rad_printstatus() -{ - /* actions always are started from a buttonswindow */ -// XX if(curarea) { -// scrarea_do_windraw(curarea); -// screen_swapbuffers(); -// } -} - -void rad_setlimits(Scene *scene) -{ - Radio *rad= scene->radio; - float fac; - - fac= 0.0005*rad->pama; - RG.patchmax= RG.maxsize*fac; - RG.patchmax*= RG.patchmax; - fac= 0.0005*rad->pami; - RG.patchmin= RG.maxsize*fac; - RG.patchmin*= RG.patchmin; - - fac= 0.0005*rad->elma; - RG.elemmax= RG.maxsize*fac; - RG.elemmax*= RG.elemmax; - fac= 0.0005*rad->elmi; - RG.elemmin= RG.maxsize*fac; - RG.elemmin*= RG.elemmin; -} - -void set_radglobal(Scene *scene) -{ - /* always call before any action is performed */ - Radio *rad= scene->radio; - - if(RG.radio==0) { - /* firsttime and to be sure */ - memset(&RG, 0, sizeof(RadGlobal)); - } - - if(rad==0) return; - - if(rad != RG.radio) { - if(RG.radio) freeAllRad(scene); - memset(&RG, 0, sizeof(RadGlobal)); - RG.radio= rad; - } - - RG.hemires= rad->hemires & 0xFFF0; - RG.drawtype= rad->drawtype; - RG.flag= rad->flag; - RG.subshootp= rad->subshootp; - RG.subshoote= rad->subshoote; - RG.nodelim= rad->nodelim; - RG.maxsublamp= rad->maxsublamp; - RG.maxnode= 2*rad->maxnode; /* in button:max elem, subdividing! */ - RG.convergence= rad->convergence/1000.0; - RG.radfac= rad->radfac; - RG.gamma= rad->gamma; - RG.maxiter= rad->maxiter; - - RG.re= NULL; /* struct render, for when call it from render engine */ - - rad_setlimits(scene); -} - -/* called from buttons.c */ -void add_radio(Scene *scene) -{ - Radio *rad; - - if(scene->radio) MEM_freeN(scene->radio); - rad= scene->radio= MEM_callocN(sizeof(Radio), "radio"); - - rad->hemires= 300; - rad->convergence= 0.1; - rad->radfac= 30.0; - rad->gamma= 2.0; - rad->drawtype= RAD_SOLID; - rad->subshootp= 1; - rad->subshoote= 2; - rad->maxsublamp= 0; - - rad->pama= 500; - rad->pami= 200; - rad->elma= 100; - rad->elmi= 20; - rad->nodelim= 0; - rad->maxnode= 10000; - rad->maxiter= 120; // arbitrary - rad->flag= 2; - set_radglobal(scene); -} - -void delete_radio(Scene *scene) -{ - freeAllRad(scene); - if(scene->radio) MEM_freeN(scene->radio); - scene->radio= 0; - - RG.radio= 0; -} - -int rad_go(Scene *scene) /* return 0 when user escapes */ -{ - double stime= PIL_check_seconds_timer(); - int retval; - - if(RG.totface) return 0; - - G.afbreek= 0; - - set_radglobal(scene); - initradiosity(); /* LUT's */ - inithemiwindows(); /* views */ - - maxsizePatches(); - - setnodelimit(RG.patchmin); - RG.phase= RAD_SHOOTP; - subdivideshootPatches(RG.subshootp); - - setnodelimit(RG.elemmin); - RG.phase= RAD_SHOOTE; - subdivideshootElements(RG.subshoote); - - setnodelimit(RG.patchmin); - subdividelamps(); - - setnodelimit(RG.elemmin); - - RG.phase= RAD_SOLVE; - subdiv_elements(); - - progressiverad(); - - removeEqualNodes(RG.nodelim); - - make_face_tab(); /* now anchored */ - - closehemiwindows(); - RG.phase= 0; - - stime= PIL_check_seconds_timer()-stime; - printf("Radiosity solving time: %dms\n", (int) (stime*1000)); - - if(G.afbreek==1) retval= 1; - else retval= 0; - - G.afbreek= 0; - - return retval; -} - -void rad_subdivshootpatch(Scene *scene) -{ - - if(RG.totface) return; - - G.afbreek= 0; - - set_radglobal(scene); - initradiosity(); /* LUT's */ - inithemiwindows(); /* views */ - - subdivideshootPatches(1); - - removeEqualNodes(RG.nodelim); - closehemiwindows(); - -// XXX allqueue(REDRAWVIEW3D, 1); -} - -void rad_subdivshootelem(Scene *scene) -{ - - if(RG.totface) return; - - G.afbreek= 0; - - set_radglobal(scene); - initradiosity(); /* LUT's */ - inithemiwindows(); /* views */ - - subdivideshootElements(1); - - removeEqualNodes(RG.nodelim); - closehemiwindows(); - -// XXX allqueue(REDRAWVIEW3D, 1); -} - -void rad_limit_subdivide(Scene *scene) -{ - - if(scene->radio==0) return; - - set_radglobal(scene); - - if(RG.totpatch==0) { - /* printf("exit: no relevant data\n"); */ - return; - } - - maxsizePatches(); - - init_face_tab(); /* free faces */ -} diff --git a/source/blender/radiosity/intern/source/radnode.c b/source/blender/radiosity/intern/source/radnode.c deleted file mode 100644 index fa23ca5da57..00000000000 --- a/source/blender/radiosity/intern/source/radnode.c +++ /dev/null @@ -1,1103 +0,0 @@ -/* *************************************** - * - * ***** 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 ***** - - - - node.c nov/dec 1992 - may 1999 - - $Id$ - - *************************************** */ - -#include <stdio.h> -#include <math.h> -#include <string.h> - -#include "MEM_guardedalloc.h" - -#include "BLI_blenlib.h" -#include "BLI_arithb.h" - -#include "BKE_global.h" -#include "BKE_main.h" - -#include "radio.h" - -#include "BLO_sys_types.h" // for intptr_t support - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -/* locals */ -static void *malloc_fast(int size); -static void *calloc_fast(int size); -static void free_fast(void *poin, int siz); -static void deleteTriNodes(RNode *node); -/* lower because of local type define */ -/* void check_mallocgroup(MallocGroup *mg); */ - - -/* ********** fastmalloc ************** */ - -#define MAL_GROUPSIZE 256 -#define MAL_AVAILABLE 1 -#define MAL_FULL 2 - - - - -ListBase MallocBase= {0, 0}; -int totfastmem= 0; - -typedef struct MallocGroup { - struct MallocGroup *next, *prev; - short size, flag; - short curfree, tot; - char flags[MAL_GROUPSIZE]; - char *data; -} MallocGroup; - -/* one more local */ -void check_mallocgroup(MallocGroup *mg); - -void check_mallocgroup(MallocGroup *mg) -{ - int a; - char *cp; - - if(mg->tot==MAL_GROUPSIZE) { - mg->flag= MAL_FULL; - return; - } - - cp= mg->flags; - - if(mg->curfree<MAL_GROUPSIZE-1) { - if(cp[mg->curfree+1]==0) { - mg->curfree++; - return; - } - } - if(mg->curfree>0) { - if(cp[mg->curfree-1]==0) { - mg->curfree--; - return; - } - } - - for(a=0; a<MAL_GROUPSIZE; a++) { - if(cp[a]==0) { - mg->curfree= a; - return; - } - } - printf("fastmalloc: shouldnt be here\n"); -} - -static void *malloc_fast(int size) -{ - MallocGroup *mg; - void *retval; - - mg= MallocBase.last; - while(mg) { - if(mg->size==size) { - if(mg->flag & MAL_AVAILABLE) { - mg->flags[mg->curfree]= 1; - mg->tot++; - retval= mg->data+mg->curfree*mg->size; - check_mallocgroup(mg); - return retval; - } - } - mg= mg->prev; - } - - /* no free block found */ - mg= MEM_callocN(sizeof(MallocGroup), "mallocgroup"); - BLI_addtail(&MallocBase, mg); - mg->data= MEM_mallocN(MAL_GROUPSIZE*size, "mallocgroupdata"); - mg->flag= MAL_AVAILABLE; - mg->flags[0]= 1; - mg->curfree= 1; - mg->size= size; - mg->tot= 1; - - totfastmem+= sizeof(MallocGroup)+MAL_GROUPSIZE*size; - - return mg->data; -} - -static void *calloc_fast(int size) -{ - void *poin; - - poin= malloc_fast(size); - memset(poin, 0, size); - - return poin; -} - -static void free_fast(void *poin, int size) -{ - MallocGroup *mg; - intptr_t val; - - mg= MallocBase.last; - while(mg) { - if(mg->size==size) { - if( ((intptr_t)poin) >= ((intptr_t)mg->data) ) { - if( ((intptr_t)poin) < ((intptr_t)(mg->data+MAL_GROUPSIZE*size)) ) { - val= ((intptr_t)poin) - ((intptr_t)mg->data); - val/= size; - mg->curfree= val; - mg->flags[val]= 0; - mg->flag= MAL_AVAILABLE; - - mg->tot--; - if(mg->tot==0) { - BLI_remlink(&MallocBase, mg); - MEM_freeN(mg->data); - MEM_freeN(mg); - totfastmem-= sizeof(MallocGroup)+MAL_GROUPSIZE*size; - } - return; - } - } - } - mg= mg->prev; - } - printf("fast free: pointer not in memlist %p size %d\n", - poin, size); -} - -/* security: only one function in a time can use it */ -static char *fastmallocstr= 0; - -void free_fastAll() -{ - MallocGroup *mg; - - mg= MallocBase.first; - while(mg) { - BLI_remlink(&MallocBase, mg); - MEM_freeN(mg->data); - MEM_freeN(mg); - mg= MallocBase.first; - } - totfastmem= 0; - fastmallocstr= 0; -} - -void start_fastmalloc(char *str) -{ - if(fastmallocstr) { -// XXX error("Fastmalloc in use: %s", fastmallocstr); - return; - } - fastmallocstr= str; -} - -/* **************************************** */ - -float nodelimit; - -void setnodelimit(float limit) -{ - nodelimit= limit; - -} - -/* ************ memory management *********** */ - -int Ntotvert=0, Ntotnode=0, Ntotpatch=0; - -float *mallocVert() -{ - Ntotvert++; - return (float *)malloc_fast(16); -} - -float *callocVert() -{ - Ntotvert++; - return (float *)calloc_fast(16); -} - -void freeVert(float *vert) -{ - free_fast(vert, 16); - Ntotvert--; -} - -int totalRadVert() -{ - return Ntotvert; -} - -RNode *mallocNode() -{ - Ntotnode++; - return (RNode *)malloc_fast(sizeof(RNode)); -} - -RNode *callocNode() -{ - Ntotnode++; - return (RNode *)calloc_fast(sizeof(RNode)); -} - -void freeNode(RNode *node) -{ - free_fast(node, sizeof(RNode)); - Ntotnode--; -} - -void freeNode_recurs(RNode *node) -{ - - if(node->down1) { - freeNode_recurs(node->down1); - freeNode_recurs(node->down2); - } - - node->down1= node->down2= 0; - freeNode(node); - -} - -RPatch *mallocPatch() -{ - Ntotpatch++; - return (RPatch *)malloc_fast(sizeof(RPatch)); -} - -RPatch *callocPatch() -{ - Ntotpatch++; - return (RPatch *)calloc_fast(sizeof(RPatch)); -} - -void freePatch(RPatch *patch) -{ - free_fast(patch, sizeof(RPatch)); - Ntotpatch--; -} - -/* ************ SUBDIVIDE *********** */ - - -void replaceAllNode(RNode *neighb, RNode *newn) -{ - /* changes from all neighbours the edgepointers that point to newn->up in new */ - int ok= 0; - - - if(neighb==0) return; - if(newn->up==0) return; - - if(neighb->ed1==newn->up) { - neighb->ed1= newn; - ok= 1; - } - else if(neighb->ed2==newn->up) { - neighb->ed2= newn; - ok= 1; - } - else if(neighb->ed3==newn->up) { - neighb->ed3= newn; - ok= 1; - } - else if(neighb->ed4==newn->up) { - neighb->ed4= newn; - ok= 1; - } - - if(ok && neighb->down1) { - replaceAllNode(neighb->down1, newn); - replaceAllNode(neighb->down2, newn); - } -} - -void replaceAllNodeInv(RNode *neighb, RNode *old) -{ - /* changes from all neighbours the edgepointers that point to old in old->up */ - if(neighb==0) return; - if(old->up==0) return; - - if(neighb->ed1==old) { - neighb->ed1= old->up; - } - else if(neighb->ed2==old) { - neighb->ed2= old->up; - } - else if(neighb->ed3==old) { - neighb->ed3= old->up; - } - else if(neighb->ed4==old) { - neighb->ed4= old->up; - } - - if(neighb->down1) { - replaceAllNodeInv(neighb->down1, old); - replaceAllNodeInv(neighb->down2, old); - } -} - -void replaceAllNodeUp(RNode *neighb, RNode *old) -{ - /* changes from all neighbours the edgepointers that point to old in old->up */ - if(neighb==0) return; - if(old->up==0) return; - neighb= neighb->up; - if(neighb==0) return; - - if(neighb->ed1==old) { - neighb->ed1= old->up; - } - else if(neighb->ed2==old) { - neighb->ed2= old->up; - } - else if(neighb->ed3==old) { - neighb->ed3= old->up; - } - else if(neighb->ed4==old) { - neighb->ed4= old->up; - } - - if(neighb->up) { - replaceAllNodeUp(neighb, old); - } -} - - -void replaceTestNode(RNode *neighb, RNode **edpp, RNode *newn, int level, float *vert) -{ - /* IF neighb->ed points to newn->up - * IF edgelevels equal - IF testvert is in neighb->ed - change pointers both ways - ELSE - RETURN - ELSE - IF neighb edgelevel is deeper - change neighb pointer - - */ - int ok= 0; - - if(neighb==0) return; - if(newn->up==0) return; - - if(neighb->ed1==newn->up) { - if(neighb->lev1==level) { - if(vert==neighb->v1 || vert==neighb->v2) { - *edpp= neighb; - neighb->ed1= newn; - } - else return; - } - else if(neighb->lev1>level) { - neighb->ed1= newn; - } - ok= 1; - } - else if(neighb->ed2==newn->up) { - if(neighb->lev2==level) { - if(vert==neighb->v2 || vert==neighb->v3) { - *edpp= neighb; - neighb->ed2= newn; - } - else return; - } - else if(neighb->lev2>level) { - neighb->ed2= newn; - } - ok= 1; - } - else if(neighb->ed3==newn->up) { - if(neighb->lev3==level) { - if(neighb->type==3) { - if(vert==neighb->v3 || vert==neighb->v1) { - *edpp= neighb; - neighb->ed3= newn; - } - else return; - } - else { - if(vert==neighb->v3 || vert==neighb->v4) { - *edpp= neighb; - neighb->ed3= newn; - } - else return; - } - } - else if(neighb->lev3>level) { - neighb->ed3= newn; - } - ok= 1; - } - else if(neighb->ed4==newn->up) { - if(neighb->lev4==level) { - if(vert==neighb->v4 || vert==neighb->v1) { - *edpp= neighb; - neighb->ed4= newn; - } - else return; - } - else if(neighb->lev4>level) { - neighb->ed4= newn; - } - ok= 1; - } - - if(ok && neighb->down1) { - replaceTestNode(neighb->down1, edpp, newn, level, vert); - replaceTestNode(neighb->down2, edpp, newn, level, vert); - } - -} - -int setvertexpointersNode(RNode *neighb, RNode *node, int level, float **v1, float **v2) -{ - /* compares edgelevels , if equal it sets the vertexpointers */ - - if(neighb==0) return 0; - - if(neighb->ed1==node) { - if(neighb->lev1==level) { - *v1= neighb->v1; - *v2= neighb->v2; - return 1; - } - } - else if(neighb->ed2==node) { - if(neighb->lev2==level) { - *v1= neighb->v2; - *v2= neighb->v3; - return 1; - } - } - else if(neighb->ed3==node) { - if(neighb->lev3==level) { - if(neighb->type==3) { - *v1= neighb->v3; - *v2= neighb->v1; - } - else { - *v1= neighb->v3; - *v2= neighb->v4; - } - return 1; - } - } - else if(neighb->ed4==node) { - if(neighb->lev4==level) { - *v1= neighb->v4; - *v2= neighb->v1; - return 1; - } - } - return 0; -} - -float edlen(float *v1, float *v2) -{ - return (v1[0]-v2[0])*(v1[0]-v2[0])+ (v1[1]-v2[1])*(v1[1]-v2[1])+ (v1[2]-v2[2])*(v1[2]-v2[2]); -} - - -void subdivideTriNode(RNode *node, RNode *edge) -{ - RNode *n1, *n2, *up; - float fu, fv, fl, *v1, *v2; /* , AreaT3Dfl(); ... from arithb... */ - int uvl; - - if(node->down1 || node->down2) { - /* printf("trinode: subd already done\n"); */ - return; - } - - /* defines subdivide direction */ - - if(edge==0) { - /* areathreshold */ - if(node->area<nodelimit) return; - - fu= edlen(node->v1, node->v2); - fv= edlen(node->v2, node->v3); - fl= edlen(node->v3, node->v1); - - if(fu>fv && fu>fl) uvl= 1; - else if(fv>fu && fv>fl) uvl= 2; - else uvl= 3; - } - else { - - if(edge==node->ed1) uvl= 1; - else if(edge==node->ed2) uvl= 2; - else uvl= 3; - } - - /* should neighbour nodes be deeper? Recursive! */ - n1= 0; - if(uvl==1) { - if(node->ed1 && node->ed1->down1==0) n1= node->ed1; - } - else if(uvl==2) { - if(node->ed2 && node->ed2->down1==0) n1= node->ed2; - } - else { - if(node->ed3 && node->ed3->down1==0) n1= node->ed3; - } - if(n1) { - up= node->up; - while(up) { /* also test for ed4 !!! */ - if(n1->ed1==up || n1->ed2==up || n1->ed3==up || n1->ed4==up) { - subdivideNode(n1, up); - break; - } - up= up->up; - } - } - - /* the subdividing */ - n1= mallocNode(); - memcpy(n1, node, sizeof(RNode)); - n2= mallocNode(); - memcpy(n2, node, sizeof(RNode)); - - n1->up= node; - n2->up= node; - - node->down1= n1; - node->down2= n2; - - /* subdivide edge 1 */ - if(uvl==1) { - - /* FIRST NODE gets edge 2 */ - n1->ed3= n2; - n1->lev3= 0; - replaceAllNode(n1->ed2, n1); - n1->lev1++; - replaceTestNode(n1->ed1, &(n1->ed1), n1, n1->lev1, n1->v2); - - /* SECOND NODE gets edge 3 */ - n2->ed2= n1; - n2->lev2= 0; - replaceAllNode(n2->ed3, n2); - n2->lev1++; - replaceTestNode(n2->ed1, &(n2->ed1), n2, n2->lev1, n2->v1); - - /* NEW VERTEX from edge 1 */ - if( setvertexpointersNode(n1->ed1, n1, n1->lev1, &v1, &v2) ) { /* nodes have equal levels */ - if(v1== n1->v2) { - n1->v1= v2; - n2->v2= v2; - } - else { - n1->v1= v1; - n2->v2= v1; - } - } - else { - n1->v1= n2->v2= mallocVert(); - n1->v1[0]= 0.5*(node->v1[0]+ node->v2[0]); - n1->v1[1]= 0.5*(node->v1[1]+ node->v2[1]); - n1->v1[2]= 0.5*(node->v1[2]+ node->v2[2]); - n1->v1[3]= node->v1[3]; /* color */ - } - } - else if(uvl==2) { - - /* FIRST NODE gets edge 1 */ - n1->ed3= n2; - n1->lev3= 0; - replaceAllNode(n1->ed1, n1); - n1->lev2++; - replaceTestNode(n1->ed2, &(n1->ed2), n1, n1->lev2, n1->v2); - - /* SECOND NODE gets edge 3 */ - n2->ed1= n1; - n2->lev1= 0; - replaceAllNode(n2->ed3, n2); - n2->lev2++; - replaceTestNode(n2->ed2, &(n2->ed2), n2, n2->lev2, n2->v3); - - /* NEW VERTEX from edge 2 */ - if( setvertexpointersNode(n1->ed2, n1, n1->lev2, &v1, &v2) ) { /* nodes have equal levels */ - if(v1== n1->v2) { - n1->v3= v2; - n2->v2= v2; - } - else { - n1->v3= v1; - n2->v2= v1; - } - } - else { - n1->v3= n2->v2= mallocVert(); - n1->v3[0]= 0.5*(node->v2[0]+ node->v3[0]); - n1->v3[1]= 0.5*(node->v2[1]+ node->v3[1]); - n1->v3[2]= 0.5*(node->v2[2]+ node->v3[2]); - n1->v3[3]= node->v1[3]; /* color */ - } - } - else if(uvl==3) { - - /* FIRST NODE gets edge 1 */ - n1->ed2= n2; - n1->lev2= 0; - replaceAllNode(n1->ed1, n1); - n1->lev3++; - replaceTestNode(n1->ed3, &(n1->ed3), n1, n1->lev3, n1->v1); - - /* SECOND NODE gets edge 2 */ - n2->ed1= n1; - n2->lev1= 0; - replaceAllNode(n2->ed2, n2); - n2->lev3++; - replaceTestNode(n2->ed3, &(n2->ed3), n2, n2->lev3, n2->v3); - - /* NEW VERTEX from edge 3 */ - if( setvertexpointersNode(n1->ed3, n1, n1->lev3, &v1, &v2) ) { /* nodes have equal levels */ - if(v1== n1->v1) { - n1->v3= v2; - n2->v1= v2; - } - else { - n1->v3= v1; - n2->v1= v1; - } - } - else { - n1->v3= n2->v1= mallocVert(); - n1->v3[0]= 0.5*(node->v1[0]+ node->v3[0]); - n1->v3[1]= 0.5*(node->v1[1]+ node->v3[1]); - n1->v3[2]= 0.5*(node->v1[2]+ node->v3[2]); - n1->v3[3]= node->v3[3]; /* color */ - } - } - n1->area= AreaT3Dfl(n1->v1, n1->v2, n1->v3); - n2->area= AreaT3Dfl(n2->v1, n2->v2, n2->v3); - -} - - -void subdivideNode(RNode *node, RNode *edge) -{ - RNode *n1, *n2, *up; - float fu, fv, *v1, *v2;/*, AreaQ3Dfl(); ... from arithb... */ - int uvl; - - if(Ntotnode>RG.maxnode) return; - - if(node->type==3) { - subdivideTriNode(node, edge); - return; - } - - if(node->down1 || node->down2) { - /* printf("subdivide Node: already done \n"); */ - return; - } - - /* defines subdivide direction */ - - if(edge==0) { - /* areathreshold */ - if(node->area<nodelimit) { - return; - } - fu= fabs(node->v1[0]- node->v2[0])+ fabs(node->v1[1]- node->v2[1]) +fabs(node->v1[2]- node->v2[2]); - fv= fabs(node->v1[0]- node->v4[0])+ fabs(node->v1[1]- node->v4[1]) +fabs(node->v1[2]- node->v4[2]); - if(fu>fv) uvl= 1; - else uvl= 2; - } - else { - if(edge==node->ed1 || edge==node->ed3) uvl= 1; - else uvl= 2; - } - - /* do neighbour nodes have to be deeper? Recursive! */ - n1= n2= 0; - if(uvl==1) { - if(node->ed1 && node->ed1->down1==0) n1= node->ed1; - if(node->ed3 && node->ed3->down1==0) n2= node->ed3; - } - else { - if(node->ed2 && node->ed2->down1==0) n1= node->ed2; - if(node->ed4 && node->ed4->down1==0) n2= node->ed4; - } - if(n1) { - up= node->up; - while(up) { - if(n1->ed1==up || n1->ed2==up || n1->ed3==up || n1->ed4==up) { - /* printf("recurs subd\n"); */ - subdivideNode(n1, up); - break; - } - up= up->up; - } - } - if(n2) { - up= node->up; - while(up) { - if(n2->ed1==up || n2->ed2==up || n2->ed3==up || n2->ed4==up) { - /* printf("recurs subd\n"); */ - subdivideNode(n2, up); - break; - } - up= up->up; - } - } - - /* the subdividing */ - n1= mallocNode(); - memcpy(n1, node, sizeof(RNode)); - n2= mallocNode(); - memcpy(n2, node, sizeof(RNode)); - - n1->up= node; - n2->up= node; - - node->down1= n1; - node->down2= n2; - - /* subdivide edge 1 and 3 */ - if(uvl==1) { - - /* FIRST NODE gets edge 2 */ - n1->ed4= n2; - n1->lev4= 0; - replaceAllNode(n1->ed2, n1); - n1->lev1++; - n1->lev3++; - replaceTestNode(n1->ed1, &(n1->ed1), n1, n1->lev1, n1->v2); - replaceTestNode(n1->ed3, &(n1->ed3), n1, n1->lev3, n1->v3); - - /* SECOND NODE gets edge 4 */ - n2->ed2= n1; - n2->lev2= 0; - replaceAllNode(n2->ed4, n2); - n2->lev1++; - n2->lev3++; - replaceTestNode(n2->ed1, &(n2->ed1), n2, n2->lev1, n2->v1); - replaceTestNode(n2->ed3, &(n2->ed3), n2, n2->lev3, n2->v4); - - /* NEW VERTEX from edge 1 */ - if( setvertexpointersNode(n1->ed1, n1, n1->lev1, &v1, &v2) ) { /* nodes have equal levels */ - if(v1== n1->v2) { - n1->v1= v2; - n2->v2= v2; - } - else { - n1->v1= v1; - n2->v2= v1; - } - } - else { - n1->v1= n2->v2= mallocVert(); - n1->v1[0]= 0.5*(node->v1[0]+ node->v2[0]); - n1->v1[1]= 0.5*(node->v1[1]+ node->v2[1]); - n1->v1[2]= 0.5*(node->v1[2]+ node->v2[2]); - n1->v1[3]= node->v1[3]; /* color */ - } - - /* NEW VERTEX from edge 3 */ - if( setvertexpointersNode(n1->ed3, n1, n1->lev3, &v1, &v2) ) { /* nodes have equal levels */ - if(v1== n1->v3) { - n1->v4= v2; - n2->v3= v2; - } - else { - n1->v4= v1; - n2->v3= v1; - } - } - else { - n1->v4= n2->v3= mallocVert(); - n1->v4[0]= 0.5*(node->v3[0]+ node->v4[0]); - n1->v4[1]= 0.5*(node->v3[1]+ node->v4[1]); - n1->v4[2]= 0.5*(node->v3[2]+ node->v4[2]); - n1->v4[3]= node->v4[3]; /* color */ - } - } - /* subdivide edge 2 and 4 */ - else if(uvl==2) { - - /* FIRST NODE gets edge 1 */ - n1->ed3= n2; - n1->lev3= 0; - replaceAllNode(n1->ed1, n1); - n1->lev2++; - n1->lev4++; - replaceTestNode(n1->ed2, &(n1->ed2), n1, n1->lev2, n1->v2); - replaceTestNode(n1->ed4, &(n1->ed4), n1, n1->lev4, n1->v1); - - /* SECOND NODE gets edge 3 */ - n2->ed1= n1; - n2->lev1= 0; - replaceAllNode(n2->ed3, n2); - n2->lev2++; - n2->lev4++; - replaceTestNode(n2->ed2, &(n2->ed2), n2, n2->lev2, n2->v3); - replaceTestNode(n2->ed4, &(n2->ed4), n2, n2->lev4, n2->v4); - - /* NEW VERTEX from edge 2 */ - if( setvertexpointersNode(n1->ed2, n1, n1->lev2, &v1, &v2) ) { /* nodes have equal levels */ - if(v1== n1->v2) { - n1->v3= v2; - n2->v2= v2; - } - else { - n1->v3= v1; - n2->v2= v1; - } - } - else { - n1->v3= n2->v2= mallocVert(); - n1->v3[0]= 0.5*(node->v2[0]+ node->v3[0]); - n1->v3[1]= 0.5*(node->v2[1]+ node->v3[1]); - n1->v3[2]= 0.5*(node->v2[2]+ node->v3[2]); - n1->v3[3]= node->v3[3]; /* color */ - } - - /* NEW VERTEX from edge 4 */ - if( setvertexpointersNode(n1->ed4, n1, n1->lev4, &v1, &v2) ) { /* nodes have equal levels */ - if(v1== n1->v1) { - n1->v4= v2; - n2->v1= v2; - } - else { - n1->v4= v1; - n2->v1= v1; - } - } - else { - n1->v4= n2->v1= mallocVert(); - n1->v4[0]= 0.5*(node->v1[0]+ node->v4[0]); - n1->v4[1]= 0.5*(node->v1[1]+ node->v4[1]); - n1->v4[2]= 0.5*(node->v1[2]+ node->v4[2]); - n1->v4[3]= node->v4[3]; /* color */ - } - } - - n1->area= AreaQ3Dfl(n1->v1, n1->v2, n1->v3, n1->v4); - n2->area= AreaQ3Dfl(n2->v1, n2->v2, n2->v3, n2->v4); - -} - -int comparelevel(RNode *node, RNode *nb, int level) -{ - /* recursive descent: test with deepest node */ - /* return 1 means equal or higher */ - - if(nb==0) return 1; - - if(nb->down1) { - return 0; - - /* THERE IS AN ERROR HERE, BUT WHAT? (without this function the system - works too, but is slower) (ton) */ - - /* - n1= nb->down1; - if(n1->ed1==node) return comparelevel(node, n1, level); - if(n1->ed2==node) return comparelevel(node, n1, level); - if(n1->ed3==node) return comparelevel(node, n1, level); - if(n1->ed4==node) return comparelevel(node, n1, level); - n1= nb->down2; - if(n1->ed1==node) return comparelevel(node, n1, level); - if(n1->ed2==node) return comparelevel(node, n1, level); - if(n1->ed3==node) return comparelevel(node, n1, level); - if(n1->ed4==node) return comparelevel(node, n1, level); - printf(" dit kan niet "); - return 0; - */ - - } - - if(nb->down1==0) { - /* if(nb->ed1==node) return (nb->lev1<=level); */ - /* if(nb->ed2==node) return (nb->lev2<=level); */ - /* if(nb->ed3==node) return (nb->lev3<=level); */ - /* if(nb->ed4==node) return (nb->lev4<=level); */ - - return 1; /* is higher node */ - } - return 1; -} - -static void deleteTriNodes(RNode *node) /* both children of node */ -{ - RNode *n1, *n2; - - /* if neighbour nodes are deeper: no delete */ - /* just test 2 nodes, from the others the level doesn't change */ - - n1= node->down1; - n2= node->down2; - - if(n1==0 || n2==0) return; - - if(n1->down1 || n2->down1) return; - - /* at the edges no subdivided node is allowed */ - - if(n1->ed1 && n1->ed1->down1) return; - if(n1->ed2 && n1->ed2->down1) return; - if(n1->ed3 && n1->ed3->down1) return; - - if(n2->ed1 && n2->ed1->down1) return; - if(n2->ed2 && n2->ed2->down1) return; - if(n2->ed3 && n2->ed3->down1) return; - - replaceAllNodeInv(n1->ed1, n1); - replaceAllNodeInv(n1->ed2, n1); - replaceAllNodeInv(n1->ed3, n1); - - replaceAllNodeUp(n1->ed1, n1); - replaceAllNodeUp(n1->ed2, n1); - replaceAllNodeUp(n1->ed3, n1); - - replaceAllNodeInv(n2->ed1, n2); - replaceAllNodeInv(n2->ed2, n2); - replaceAllNodeInv(n2->ed3, n2); - - replaceAllNodeUp(n2->ed1, n2); - replaceAllNodeUp(n2->ed2, n2); - replaceAllNodeUp(n2->ed3, n2); - - n1->down1= (RNode *)12; /* for debug */ - n2->down1= (RNode *)12; - - freeNode(n1); - freeNode(n2); - node->down1= node->down2= 0; - -} - - /* both children of node */ -void deleteNodes(RNode *node) -{ - RNode *n1, *n2; - - /* if neighbour nodes are deeper: no delete */ - /* just test 2 nodes, from the others the level doesn't change */ - - if(node->type==3) { - deleteTriNodes(node); - return; - } - - n1= node->down1; - n2= node->down2; - - if(n1==0 || n2==0) return; - - if(n1->down1 || n2->down1) return; - - if(n1->ed3==n2) { - - /* at the edges no subdivided node is allowed */ - - if(n1->ed1 && n1->ed1->down1) return; - if(n1->ed2 && n1->ed2->down1) return; - if(n1->ed4 && n1->ed4->down1) return; - - if(n2->ed2 && n2->ed2->down1) return; - if(n2->ed3 && n2->ed3->down1) return; - if(n2->ed4 && n2->ed4->down1) return; - - replaceAllNodeInv(n1->ed1, n1); - replaceAllNodeInv(n1->ed2, n1); - replaceAllNodeInv(n1->ed4, n1); - - replaceAllNodeUp(n1->ed1, n1); - replaceAllNodeUp(n1->ed2, n1); - replaceAllNodeUp(n1->ed4, n1); - - replaceAllNodeInv(n2->ed2, n2); - replaceAllNodeInv(n2->ed3, n2); - replaceAllNodeInv(n2->ed4, n2); - - replaceAllNodeUp(n2->ed2, n2); - replaceAllNodeUp(n2->ed3, n2); - replaceAllNodeUp(n2->ed4, n2); - - n1->down1= (RNode *)12; /* for debug */ - n2->down1= (RNode *)12; - - freeNode(n1); - freeNode(n2); - node->down1= node->down2= 0; - - return; - } - else if(n1->ed4==n2) { - - if(n1->ed1 && n1->ed1->down1) return; - if(n1->ed2 && n1->ed2->down1) return; - if(n1->ed3 && n1->ed3->down1) return; - - if(n2->ed1 && n2->ed1->down1) return; - if(n2->ed3 && n2->ed3->down1) return; - if(n2->ed4 && n2->ed4->down1) return; - - replaceAllNodeInv(n1->ed1, n1); - replaceAllNodeInv(n1->ed2, n1); - replaceAllNodeInv(n1->ed3, n1); - - replaceAllNodeUp(n1->ed1, n1); - replaceAllNodeUp(n1->ed2, n1); - replaceAllNodeUp(n1->ed3, n1); - - replaceAllNodeInv(n2->ed1, n2); - replaceAllNodeInv(n2->ed3, n2); - replaceAllNodeInv(n2->ed4, n2); - - replaceAllNodeUp(n2->ed1, n2); - replaceAllNodeUp(n2->ed3, n2); - replaceAllNodeUp(n2->ed4, n2); - - n1->down1= (RNode *)12; /* for debug */ - n2->down1= (RNode *)12; - - freeNode(n1); - freeNode(n2); - node->down1= node->down2= 0; - - return; - } - -} - - diff --git a/source/blender/radiosity/intern/source/radpostprocess.c b/source/blender/radiosity/intern/source/radpostprocess.c deleted file mode 100644 index 6912c737a51..00000000000 --- a/source/blender/radiosity/intern/source/radpostprocess.c +++ /dev/null @@ -1,824 +0,0 @@ -/* *************************************** - * - * ***** 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 ***** - - - - radpostprocess.c nov/dec 1992 - may 1999 - - - faces - - filtering and node-limit - - apply to meshes - $Id$ - - *************************************** */ - -#include <stdlib.h> -#include <string.h> -#include <math.h> - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "MEM_guardedalloc.h" - -#include "BLI_blenlib.h" -#include "BLI_arithb.h" -#include "BLI_ghash.h" - -#include "DNA_material_types.h" -#include "DNA_mesh_types.h" -#include "DNA_meshdata_types.h" -#include "DNA_object_types.h" -#include "DNA_radio_types.h" -#include "DNA_scene_types.h" - -#include "BKE_customdata.h" -#include "BKE_global.h" -#include "BKE_main.h" -#include "BKE_material.h" -#include "BKE_mesh.h" -#include "BKE_object.h" -#include "BKE_utildefines.h" - -#include "radio.h" - -/* locals? not. done in radio.h... */ -/* void rad_addmesh(void); */ -/* void rad_replacemesh(void); */ - -void addaccu(register char *z, register char *t) -{ - register int div, mul; - - mul= *t; - div= mul+1; - (*t)++; - - t[1]= (mul*t[1]+z[1])/div; - t[2]= (mul*t[2]+z[2])/div; - t[3]= (mul*t[3]+z[3])/div; - -} - -void addaccuweight(register char *z, register char *t, int w) -{ - register int div, mul; - - if(w==0) w= 1; - - mul= *t; - div= mul+w; - if(div>255) return; - (*t)= div; - - t[1]= (mul*t[1]+w*z[1])/div; - t[2]= (mul*t[2]+w*z[2])/div; - t[3]= (mul*t[3]+w*z[3])/div; - -} - -void triaweight(Face *face, int *w1, int *w2, int *w3) -{ - float n1[3], n2[3], n3[3], temp; - - n1[0]= face->v2[0]-face->v1[0]; - n1[1]= face->v2[1]-face->v1[1]; - n1[2]= face->v2[2]-face->v1[2]; - n2[0]= face->v3[0]-face->v2[0]; - n2[1]= face->v3[1]-face->v2[1]; - n2[2]= face->v3[2]-face->v2[2]; - n3[0]= face->v1[0]-face->v3[0]; - n3[1]= face->v1[1]-face->v3[1]; - n3[2]= face->v1[2]-face->v3[2]; - Normalize(n1); - Normalize(n2); - Normalize(n3); - temp= 32.0/(PI); - *w1= 0.5+temp*acos(-n1[0]*n3[0]-n1[1]*n3[1]-n1[2]*n3[2]); - *w2= 0.5+temp*acos(-n1[0]*n2[0]-n1[1]*n2[1]-n1[2]*n2[2]); - *w3= 0.5+temp*acos(-n2[0]*n3[0]-n2[1]*n3[1]-n2[2]*n3[2]); - -} - - - -void init_face_tab() -{ - int a= 0; - - if(RG.facebase==0) { - RG.facebase= MEM_callocN(sizeof(void *)*RAD_MAXFACETAB, "init_face_tab"); - } - for(a=0; a<RAD_MAXFACETAB; a++) { - if(RG.facebase[a]==0) break; - MEM_freeN(RG.facebase[a]); - RG.facebase[a]= 0; - } - RG.totface= 0; -} - -Face *addface() -{ - Face *face; - int a; - - if(RG.totface<0 || RG.totface>RAD_MAXFACETAB*1024 ) { - printf("error in addface: %d\n", RG.totface); - return 0; - } - a= RG.totface>>10; - face= RG.facebase[a]; - if(face==0) { - face= MEM_callocN(1024*sizeof(Face),"addface"); - RG.facebase[a]= face; - } - face+= (RG.totface & 1023); - - RG.totface++; - - return face; - -} - -Face * makeface(float *v1, float *v2, float *v3, float *v4, RNode *rn) -{ - Face *face; - - face= addface(); - face->v1= v1; - face->v2= v2; - face->v3= v3; - face->v4= v4; - face->col= rn->col; - face->matindex= rn->par->matindex; - face->orig= rn->orig; - - return face; -} - -void anchorQuadface(RNode *rn, float *v1, float *v2, float *v3, float *v4, int flag) -{ - Face *face; - - switch(flag) { - case 1: - face = makeface(rn->v1, v1, rn->v4, NULL, rn); - face = makeface(v1, rn->v3, rn->v4, NULL, rn); - face = makeface(v1, rn->v2, rn->v3, NULL, rn); - break; - case 2: - face = makeface(rn->v2, v2, rn->v1, NULL, rn); - face = makeface(v2, rn->v4, rn->v1, NULL, rn); - face = makeface(v2, rn->v3, rn->v4, NULL, rn); - break; - case 4: - face = makeface(rn->v3, v3, rn->v2, NULL, rn); - face = makeface(v3, rn->v1, rn->v2, NULL, rn); - face = makeface(v3, rn->v4, rn->v1, NULL, rn); - break; - case 8: - face = makeface(rn->v4, v4, rn->v3, NULL, rn); - face = makeface(v4, rn->v2, rn->v3, NULL, rn); - face = makeface(v4, rn->v1, rn->v2, NULL, rn); - break; - case 3: - face = makeface(rn->v1, v1, rn->v4, NULL, rn); - face = makeface(v1, v2, rn->v4, NULL, rn); - face = makeface(v1, rn->v2, v2, NULL, rn); - face = makeface(v2, rn->v3, rn->v4, NULL, rn); - break; - case 6: - face = makeface(rn->v2, v2, rn->v1, NULL, rn); - face = makeface(v2, v3, rn->v1, NULL, rn); - face = makeface(v2, rn->v3, v3, NULL, rn); - face = makeface(v3, rn->v4, rn->v1, NULL, rn); - break; - case 12: - face = makeface(rn->v3, v3, rn->v2, NULL, rn); - face = makeface(v3, v4, rn->v2, NULL, rn); - face = makeface(v3, rn->v4, v4, NULL, rn); - face = makeface(v4, rn->v1, rn->v2, NULL, rn); - break; - case 9: - face = makeface(rn->v4, v4, rn->v3, NULL, rn); - face = makeface(v4, v1, rn->v3, NULL, rn); - face = makeface(v4, rn->v1, v1, NULL, rn); - face = makeface(v1, rn->v2, rn->v3, NULL, rn); - break; - case 5: - face = makeface(rn->v1, v1, v3, rn->v4, rn); - face = makeface(v1, rn->v2, rn->v3, v3, rn); - break; - case 10: - face = makeface(rn->v1, rn->v2, v2, v4, rn); - face = makeface(v4, v2, rn->v3, rn->v4, rn); - break; - case 7: - face = makeface(rn->v1, v1, v3, rn->v4, rn); - face = makeface(v1, v2, v3, NULL, rn); - face = makeface(v1, rn->v2, v2, NULL, rn); - face = makeface(v2, rn->v3, v3, NULL, rn); - break; - case 14: - face = makeface(rn->v2, v2, v4, rn->v1, rn); - face = makeface(v2, v3, v4, NULL, rn); - face = makeface(v2, rn->v3, v3, NULL, rn); - face = makeface(v3, rn->v4, v4, NULL, rn); - break; - case 13: - face = makeface(rn->v3, v3, v1, rn->v2, rn); - face = makeface(v3, v4, v1, NULL, rn); - face = makeface(v3, rn->v4, v4, NULL, rn); - face = makeface(v4, rn->v1, v1, NULL, rn); - break; - case 11: - face = makeface(rn->v4, v4, v2, rn->v3, rn); - face = makeface(v4, v1, v2, NULL, rn); - face = makeface(v4, rn->v1, v1, NULL, rn); - face = makeface(v1, rn->v2, v2, NULL, rn); - break; - case 15: - face = makeface(v1, v2, v3, v4, rn); - face = makeface(v1, rn->v2, v2, NULL, rn); - face = makeface(v2, rn->v3, v3, NULL, rn); - face = makeface(v3, rn->v4, v4, NULL, rn); - face = makeface(v4, rn->v1, v1, NULL, rn); - break; - } -} - -void anchorTriface(RNode *rn, float *v1, float *v2, float *v3, int flag) -{ - Face *face; - - switch(flag) { - case 1: - face = makeface(rn->v1, v1, rn->v3, NULL, rn); - face = makeface(v1, rn->v2, rn->v3, NULL, rn); - break; - case 2: - face = makeface(rn->v2, v2, rn->v1, NULL, rn); - face = makeface(v2, rn->v3, rn->v1, NULL, rn); - break; - case 4: - face = makeface(rn->v3, v3, rn->v2, NULL, rn); - face = makeface(v3, rn->v1, rn->v2, NULL, rn); - break; - case 3: - face = makeface(rn->v1, v2, rn->v3, NULL, rn); - face = makeface(rn->v1, v1, v2, NULL, rn); - face = makeface(v1, rn->v2, v2, NULL, rn); - break; - case 6: - face = makeface(rn->v2, v3, rn->v1, NULL, rn); - face = makeface(rn->v2, v2, v3, NULL, rn); - face = makeface(v2, rn->v3, v3, NULL, rn); - break; - case 5: - face = makeface(rn->v3, v1, rn->v2, NULL, rn); - face = makeface(rn->v3, v3, v1, NULL, rn); - face = makeface(v3, rn->v1, v1, NULL, rn); - break; - - case 7: - face = makeface(v1, v2, v3, NULL, rn); - face = makeface(rn->v1, v1, v3, NULL, rn); - face = makeface(rn->v2, v2, v1, NULL, rn); - face = makeface(rn->v3, v3, v2, NULL, rn); - break; - } -} - - -float *findmiddlevertex(RNode *node, RNode *nb, float *v1, float *v2) -{ - int test= 0; - - if(nb==0) return 0; - - if(nb->ed1==node) { - if(nb->v1==v1 || nb->v1==v2) test++; - if(nb->v2==v1 || nb->v2==v2) test+=2; - if(test==1) return nb->v2; - else if(test==2) return nb->v1; - } - else if(nb->ed2==node) { - if(nb->v2==v1 || nb->v2==v2) test++; - if(nb->v3==v1 || nb->v3==v2) test+=2; - if(test==1) return nb->v3; - else if(test==2) return nb->v2; - } - else if(nb->ed3==node) { - if(nb->type==4) { - if(nb->v3==v1 || nb->v3==v2) test++; - if(nb->v4==v1 || nb->v4==v2) test+=2; - if(test==1) return nb->v4; - else if(test==2) return nb->v3; - } - else { - if(nb->v3==v1 || nb->v3==v2) test++; - if(nb->v1==v1 || nb->v1==v2) test+=2; - if(test==1) return nb->v1; - else if(test==2) return nb->v3; - } - } - else if(nb->ed4==node) { - if(nb->v4==v1 || nb->v4==v2) test++; - if(nb->v1==v1 || nb->v1==v2) test+=2; - if(test==1) return nb->v1; - else if(test==2) return nb->v4; - } - return 0; -} - -void make_face_tab() /* takes care of anchoring */ -{ - RNode *rn, **el; - Face *face = NULL; - float *v1, *v2, *v3, *v4; - int a, flag, w1, w2, w3; - char *charcol; - - if(RG.totelem==0) return; - - init_face_tab(); - - RG.igamma= 1.0/RG.gamma; - RG.radfactor= RG.radfac*pow(64*64, RG.igamma); - - /* convert face colors */ - el= RG.elem; - for(a=RG.totelem; a>0; a--, el++) { - rn= *el; - charcol= (char *)&( rn->col ); - - charcol[3]= calculatecolor(rn->totrad[0]); - charcol[2]= calculatecolor(rn->totrad[1]); - charcol[1]= calculatecolor(rn->totrad[2]); - } - - /* check nodes and make faces */ - el= RG.elem; - for(a=RG.totelem; a>0; a--, el++) { - - rn= *el; - - rn->v1[3]= 0.0; - rn->v2[3]= 0.0; - rn->v3[3]= 0.0; - if(rn->v4) rn->v4[3]= 0.0; - - /* test edges for subdivide */ - flag= 0; - v1= v2= v3= v4= 0; - if(rn->ed1) { - v1= findmiddlevertex(rn, rn->ed1->down1, rn->v1, rn->v2); - if(v1) flag |= 1; - } - if(rn->ed2) { - v2= findmiddlevertex(rn, rn->ed2->down1, rn->v2, rn->v3); - if(v2) flag |= 2; - } - if(rn->ed3) { - if(rn->type==4) - v3= findmiddlevertex(rn, rn->ed3->down1, rn->v3, rn->v4); - else - v3= findmiddlevertex(rn, rn->ed3->down1, rn->v3, rn->v1); - if(v3) flag |= 4; - } - if(rn->ed4) { - v4= findmiddlevertex(rn, rn->ed4->down1, rn->v4, rn->v1); - if(v4) flag |= 8; - } - - /* using flag and vertexpointers now Faces can be made */ - - if(flag==0) { - makeface(rn->v1, rn->v2, rn->v3, rn->v4, rn); - } - else if(rn->type==4) anchorQuadface(rn, v1, v2, v3, v4, flag); - else anchorTriface(rn, v1, v2, v3, flag); - } - - /* add */ - for(a=0; a<RG.totface; a++) { - - RAD_NEXTFACE(a); - - if(face->v4) { - addaccuweight( (char *)&(face->col), (char *)(face->v1+3), 16 ); - addaccuweight( (char *)&(face->col), (char *)(face->v2+3), 16 ); - addaccuweight( (char *)&(face->col), (char *)(face->v3+3), 16 ); - addaccuweight( (char *)&(face->col), (char *)(face->v4+3), 16 ); - } - else { - triaweight(face, &w1, &w2, &w3); - addaccuweight( (char *)&(face->col), (char *)(face->v1+3), w1 ); - addaccuweight( (char *)&(face->col), (char *)(face->v2+3), w2 ); - addaccuweight( (char *)&(face->col), (char *)(face->v3+3), w3 ); - } - } - -} - -void filterFaces() -{ - /* put vertex colors in faces, and put them back */ - - Face *face = NULL; - int a, w1, w2, w3; - - if(RG.totface==0) return; - - /* clear */ - for(a=0; a<RG.totface; a++) { - RAD_NEXTFACE(a); - face->col= 0; - } - - /* add: vertices with faces */ - for(a=0; a<RG.totface; a++) { - RAD_NEXTFACE(a); - - if(face->v4) { - addaccuweight( (char *)(face->v1+3), (char *)&(face->col), 16 ); - addaccuweight( (char *)(face->v2+3), (char *)&(face->col), 16 ); - addaccuweight( (char *)(face->v3+3), (char *)&(face->col), 16 ); - addaccuweight( (char *)(face->v4+3), (char *)&(face->col), 16 ); - } - else { - triaweight(face, &w1, &w2, &w3); - addaccuweight( (char *)(face->v1+3), (char *)&(face->col), w1 ); - addaccuweight( (char *)(face->v2+3), (char *)&(face->col), w2 ); - addaccuweight( (char *)(face->v3+3), (char *)&(face->col), w3 ); - } - } - - /* clear */ - for(a=0; a<RG.totface; a++) { - RAD_NEXTFACE(a); - face->v1[3]= 0.0; - face->v2[3]= 0.0; - face->v3[3]= 0.0; - if(face->v4) face->v4[3]= 0.0; - } - - - /* add: faces with vertices */ - for(a=0; a<RG.totface; a++) { - - RAD_NEXTFACE(a); - - if(face->v4) { - addaccuweight( (char *)&(face->col), (char *)(face->v1+3), 16 ); - addaccuweight( (char *)&(face->col), (char *)(face->v2+3), 16 ); - addaccuweight( (char *)&(face->col), (char *)(face->v3+3), 16 ); - addaccuweight( (char *)&(face->col), (char *)(face->v4+3), 16 ); - } - else { - triaweight(face, &w1, &w2, &w3); - addaccuweight( (char *)&(face->col), (char *)(face->v1+3), w1 ); - addaccuweight( (char *)&(face->col), (char *)(face->v2+3), w2 ); - addaccuweight( (char *)&(face->col), (char *)(face->v3+3), w3 ); - } - } -} - -void calcfiltrad(RNode *rn, float *cd) -{ - float area; - - cd[0]= 2.0*rn->totrad[0]; - cd[1]= 2.0*rn->totrad[1]; - cd[2]= 2.0*rn->totrad[2]; - area= 2.0; - - if(rn->ed1) { - cd[0]+= rn->ed1->totrad[0]; - cd[1]+= rn->ed1->totrad[1]; - cd[2]+= rn->ed1->totrad[2]; - area+= 1.0; - } - if(rn->ed2) { - cd[0]+= rn->ed2->totrad[0]; - cd[1]+= rn->ed2->totrad[1]; - cd[2]+= rn->ed2->totrad[2]; - area+= 1.0; - } - if(rn->ed3) { - cd[0]+= rn->ed3->totrad[0]; - cd[1]+= rn->ed3->totrad[1]; - cd[2]+= rn->ed3->totrad[2]; - area+= 1.0; - } - if(rn->ed4) { - cd[0]+= rn->ed4->totrad[0]; - cd[1]+= rn->ed4->totrad[1]; - cd[2]+= rn->ed4->totrad[2]; - area+= 1.0; - } - cd[0]/= area; - cd[1]/= area; - cd[2]/= area; - -} - -void filterNodes() -{ - /* colors from nodes in tempblock and back */ - - RNode *rn, **el; - float *coldata, *cd; - int a; - - if(RG.totelem==0) return; - /* the up-nodes need a color */ - el= RG.elem; - for(a=0; a<RG.totelem; a++, el++) { - rn= *el; - if(rn->up) { - rn->up->totrad[0]= 0.0; - rn->up->totrad[1]= 0.0; - rn->up->totrad[2]= 0.0; - if(rn->up->up) { - rn->up->up->totrad[0]= 0.0; - rn->up->up->totrad[1]= 0.0; - rn->up->up->totrad[2]= 0.0; - } - } - } - el= RG.elem; - for(a=0; a<RG.totelem; a++, el++) { - rn= *el; - if(rn->up) { - rn->up->totrad[0]+= 0.5*rn->totrad[0]; - rn->up->totrad[1]+= 0.5*rn->totrad[1]; - rn->up->totrad[2]+= 0.5*rn->totrad[2]; - if(rn->up->up) { - rn->up->up->totrad[0]+= 0.25*rn->totrad[0]; - rn->up->up->totrad[1]+= 0.25*rn->totrad[1]; - rn->up->up->totrad[2]+= 0.25*rn->totrad[2]; - } - } - } - - /* add using area */ - cd= coldata= MEM_mallocN(3*4*RG.totelem, "filterNodes"); - el= RG.elem; - for(a=0; a<RG.totelem; a++, el++) { - calcfiltrad(*el, cd); - cd+= 3; - } - - cd= coldata; - el= RG.elem; - for(a=0; a<RG.totelem; a++, el++) { - rn= *el; - VECCOPY(rn->totrad, cd); - cd+= 3; - } - MEM_freeN(coldata); -} - -void removeEqualNodes(short limit) -{ - /* nodes with equal colors: remove */ - RNode **el, *rn, *rn1; - float thresh, f1, f2; - int a, foundone=1, ok; - int c1, c2; - - if(limit==0) return; - - thresh= 1.0/(256.0*RG.radfactor); - thresh= 3.0*pow(thresh, RG.gamma); - -// XXX waitcursor(1); - - while(foundone) { - foundone= 0; - - el= RG.elem; - for(a=RG.totelem; a>1; a--, el++) { - rn= *el; - rn1= *(el+1); - - if(rn!=rn->par->first && rn1!=rn1->par->first) { - if(rn->up && rn->up==rn1->up) { - f1= rn->totrad[0]+ rn->totrad[1]+ rn->totrad[2]; - f2= rn1->totrad[0]+ rn1->totrad[1]+ rn1->totrad[2]; - - ok= 0; - if(f1<thresh && f2<thresh) ok= 1; - else { - c1= calculatecolor(rn->totrad[0]); - c2= calculatecolor(rn1->totrad[0]); - - if( abs(c1-c2)<=limit ) { - c1= calculatecolor(rn->totrad[1]); - c2= calculatecolor(rn1->totrad[1]); - - if( abs(c1-c2)<=limit ) { - c1= calculatecolor(rn->totrad[2]); - c2= calculatecolor(rn1->totrad[2]); - - if( abs(c1-c2)<=limit ) { - ok= 1; - } - } - } - } - - if(ok) { - rn->up->totrad[0]= 0.5f*(rn->totrad[0]+rn1->totrad[0]); - rn->up->totrad[1]= 0.5f*(rn->totrad[1]+rn1->totrad[1]); - rn->up->totrad[2]= 0.5f*(rn->totrad[2]+rn1->totrad[2]); - rn1= rn->up; - deleteNodes(rn1); - if(rn1->down1) ; - else { - foundone++; - a--; el++; - } - } - } - } - } - if(foundone) { - makeGlobalElemArray(); - } - } -// XXX waitcursor(0); -} - -unsigned int rad_find_or_add_mvert(Mesh *me, MFace *mf, RNode *orignode, float *w, float *radco, GHash *hash) -{ - MVert *mvert = BLI_ghash_lookup(hash, radco); - - if(!mvert) { - mvert = &me->mvert[me->totvert]; - VECCOPY(mvert->co, radco); - me->totvert++; - - BLI_ghash_insert(hash, radco, mvert); - } - - InterpWeightsQ3Dfl(orignode->v1, orignode->v2, orignode->v3, - orignode->v4, mvert->co, w); - - return (unsigned int)(mvert - me->mvert); -} - -void rad_addmesh(Scene *scene) -{ - Face *face = NULL; - Object *ob; - Mesh *me; - MVert *mvert; - MFace *mf; - RNode *node; - Material *ma=0; - GHash *verthash; - unsigned int *mcol; - float cent[3], min[3], max[3], w[4][4]; - int a; - - if(RG.totface==0) - return; - -// if(RG.totmat==MAXMAT) -// XXX notice("warning: cannot assign more than 16 materials to 1 mesh"); - - /* create the mesh */ - ob= add_object(scene, OB_MESH); - - me= ob->data; - me->totvert= totalRadVert(); - me->totface= RG.totface; - me->flag= 0; - - CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, me->totvert); - CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, NULL, me->totface); - CustomData_add_layer(&me->fdata, CD_MCOL, CD_CALLOC, NULL, me->totface); - - CustomData_merge(RG.mfdata, &me->fdata, CD_MASK_MESH, CD_CALLOC, me->totface); - mesh_update_customdata_pointers(me); - - /* create materials and set vertex color flag */ - for(a=0; a<RG.totmat; a++) { - assign_material(ob, RG.matar[a], a+1); - ma= RG.matar[a]; - if(ma) ma->mode |= MA_VERTEXCOL; - } - - /* create vertices and faces in one go, adding vertices to the end of the - mvert array if they were not added already */ - me->totvert= 0; - verthash= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp); - - mcol= (unsigned int*)me->mcol; - mf= me->mface; - - for(a=0; a<me->totface; a++, mf++, mcol+=4) { - RAD_NEXTFACE(a); - - /* the original node that this node is a subnode of */ - node= RG.mfdatanodes[face->orig]; - - /* set mverts from the radio data, and compute interpolation weights */ - mf->v1= rad_find_or_add_mvert(me, mf, node, w[0], face->v1, verthash); - mf->v2= rad_find_or_add_mvert(me, mf, node, w[1], face->v2, verthash); - mf->v3= rad_find_or_add_mvert(me, mf, node, w[2], face->v3, verthash); - if(face->v4) - mf->v4= rad_find_or_add_mvert(me, mf, node, w[3], face->v4, verthash); - - /* copy face and interpolate data */ - mf->mat_nr= face->matindex; - - CustomData_copy_data(RG.mfdata, &me->fdata, face->orig, a, 1); - CustomData_interp(RG.mfdata, &me->fdata, &face->orig, NULL, (float*)w, 1, a); - - /* load face vertex colors, with alpha added */ - mcol[0]= *((unsigned int*)face->v1+3) | 0x1000000; - mcol[1]= *((unsigned int*)face->v2+3) | 0x1000000; - mcol[2]= *((unsigned int*)face->v3+3) | 0x1000000; - if(face->v4) - mcol[3]= *((unsigned int*)face->v4+3) | 0x1000000; - - /* reorder face indices if needed to make face->v4 == 0 */ - test_index_face(mf, &me->fdata, a, face->v4? 4: 3); - } - - BLI_ghash_free(verthash, NULL, NULL); - - /* boundbox and center new */ - INIT_MINMAX(min, max); - - mvert= me->mvert; - for(a=0; a<me->totvert; a++, mvert++) { - DO_MINMAX(mvert->co, min, max); - } - - cent[0]= (min[0]+max[0])/2.0f; - cent[1]= (min[1]+max[1])/2.0f; - cent[2]= (min[2]+max[2])/2.0f; - - mvert= me->mvert; - for(a=0; a<me->totvert; a++, mvert++) { - VecSubf(mvert->co, mvert->co, cent); - } - - VECCOPY(ob->loc, cent); - - /* create edges */ - make_edges(me, 0); -} - -void rad_replacemesh(Scene *scene) -{ - RPatch *rp; - -// XXX deselectall(); - - rp= RG.patchbase.first; - while(rp) { - if( exist_object(rp->from)) { - if (rp->from->type == OB_MESH) { - rp->from->flag |= SELECT; - } - } - rp= rp->next; - } - - copy_objectflags(scene); -// XXX delete_obj(1); - - rad_addmesh(scene); -} - diff --git a/source/blender/radiosity/intern/source/radpreprocess.c b/source/blender/radiosity/intern/source/radpreprocess.c deleted file mode 100644 index 2b3ce1a856b..00000000000 --- a/source/blender/radiosity/intern/source/radpreprocess.c +++ /dev/null @@ -1,828 +0,0 @@ - /* *************************************** - * - * ***** 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 ***** - - - - preproces.c nov/dec 1992 - may 1999 - - - collect from meshes - - countglobaldata() - - makeGlobalElemArray() - - $Id$ - - *************************************** */ - -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <math.h> - -#include "MEM_guardedalloc.h" - -#include "BLI_blenlib.h" -#include "BLI_arithb.h" - -#include "DNA_mesh_types.h" -#include "DNA_meshdata_types.h" -#include "DNA_object_types.h" -#include "DNA_scene_types.h" -#include "DNA_view3d_types.h" - -#include "BKE_customdata.h" -#include "BKE_global.h" -#include "BKE_main.h" -#include "BKE_material.h" -#include "BKE_mesh.h" -#include "BKE_object.h" /* during_script() */ -#include "BKE_utildefines.h" - -#include "radio.h" - -#include "BLO_sys_types.h" // for intptr_t support - -void setparelem(RNode *rn, RPatch *par); - -void splitconnected() -{ - /* Since input meshes can have faces with sharing vertices, the geometry is being tested here. - * Using normals and colors, faces are split separately. we do this by storing for each - * vertex a normal and a color - */ - RPatch *rp; - RNode *rn; - VeNoCo *vnc, *next, *vnc1; - int a; - - /* test if we need a split */ - - rp= RG.patchbase.first; - while(rp) { - rn= rp->first; - if((rp->f1 & RAD_NO_SPLIT)==0) { - for(a=0; a<rp->type; a++) { - - if(a==0) vnc= (VeNoCo *)rn->v1; - else if(a==1) vnc= (VeNoCo *)rn->v2; - else if(a==2) vnc= (VeNoCo *)rn->v3; - else vnc= (VeNoCo *)rn->v4; - - if(vnc->flag==0) { - vnc->n= (float *)rp->norm; - vnc->col= (float *)rp->ref; - vnc->flag= 1; - } - else { /* is face from this vertex allowed for gouraud? */ - vnc1= vnc; - while(vnc1) { - if(VecCompare(vnc1->n, rp->norm, 0.01f)) { - if(VecCompare(vnc1->col, rp->ref, 0.01f)) { - break; - } - } - vnc= vnc1; - vnc1= vnc1->next; - } - if(vnc1==0) { - vnc1= MEM_mallocN(sizeof(VeNoCo), "splitconn"); - vnc1->next= 0; - vnc1->v= mallocVert(); - vnc->next= vnc1; - VECCOPY(vnc1->v, vnc->v); - vnc1->n= (float *)rp->norm; - vnc1->col= (float *)rp->ref; - } - if(a==0) rn->v1= (float *)vnc1; - else if(a==1) rn->v2= (float *)vnc1; - else if(a==2) rn->v3= (float *)vnc1; - else rn->v4= (float *)vnc1; - } - } - } - rp= rp->next; - } - /* adapt vertexpointers from nodes */ - - rp= RG.patchbase.first; - while(rp) { - rn= rp->first; - rn->v1= ((VeNoCo *)(rn->v1))->v; - rn->v2= ((VeNoCo *)(rn->v2))->v; - rn->v3= ((VeNoCo *)(rn->v3))->v; - if(rp->type==4) rn->v4= ((VeNoCo *)(rn->v4))->v; - - rp= rp->next; - } - - - /* free all */ - vnc= RG.verts; - for(a=0; a<RG.totvert; a++) { - vnc1= vnc->next; - while(vnc1) { - next= vnc1->next; - MEM_freeN(vnc1); - vnc1= next; - } - vnc++; - } - MEM_freeN(RG.verts); - RG.verts= 0; -} - -int vergedge(const void *v1,const void *v2) -{ - int *e1, *e2; - - e1= (int *)v1; - e2= (int *)v2; - - if( e1[0] > e2[0] ) return 1; - else if( e1[0] < e2[0] ) return -1; - else if( e1[1] > e2[1] ) return 1; - else if( e1[1] < e2[1] ) return -1; - - return 0; -} - - -void addedge(float *v1, float *v2, EdSort *es) -{ - if( ((intptr_t)v1)<((intptr_t)v2) ) { - es->v1= v1; - es->v2= v2; - } - else { - es->v2= v1; - es->v1= v2; - } -} - -static void setedge(RNode *node, RNode *nb, int nr, int nrb) -{ - switch(nr) { - case 1: - node->ed1= nb; - break; - case 2: - node->ed2= nb; - break; - case 3: - node->ed3= nb; - break; - case 4: - node->ed4= nb; - break; - } - switch(nrb) { - case 1: - nb->ed1= node; - break; - case 2: - nb->ed2= node; - break; - case 3: - nb->ed3= node; - break; - case 4: - nb->ed4= node; - break; - } -} - -void setedgepointers() -{ - /* make edge-array and sort it */ - /* pairs of edges are put together: fill in pointers in nodes */ - EdSort *es, *esblock; - RPatch *rp; - RNode *rn; - int tot= 0; - - rp= RG.patchbase.first; - while(rp) { - tot+= rp->type; - rp= rp->next; - } - - if(tot==0) return; - - es=esblock= MEM_mallocN(tot*sizeof(EdSort), "setedgepointers"); - rp= RG.patchbase.first; - while(rp) { - rn= rp->first; - addedge(rn->v1, rn->v2, es); - es->nr= 1; - es->node= rn; - es++; - addedge(rn->v2, rn->v3, es); - es->nr= 2; - es->node= rn; - es++; - if(rp->type==3) { - addedge(rn->v3, rn->v1, es); - es->nr= 3; - es->node= rn; - es++; - } - else { - addedge(rn->v3, rn->v4, es); - es->nr= 3; - es->node= rn; - es++; - addedge(rn->v4, rn->v1, es); - es->nr= 4; - es->node= rn; - es++; - } - rp= rp->next; - } - - qsort(esblock,tot,sizeof(EdSort),vergedge); - - es= esblock; - while(tot>0) { - if( es->v1== (es+1)->v1 ) { - if( es->v2== (es+1)->v2 ) { - setedge(es->node, (es+1)->node, es->nr, (es+1)->nr); - tot--; - es++; - } - } - es++; - tot--; - } - - MEM_freeN(esblock); -} - -static int materialIndex(Material *ma) -{ - int i = 0; - for(i=0;i< RG.totmat; i++) - { - if (RG.matar[i] == ma) { - return i; - } - } - return -1; -} - -void rad_collect_meshes(Scene *scene, View3D *v3d) -{ - extern Material defmaterial; - Base *base; - Object *ob; - Mesh *me; - MVert *mvert; - MFace *mface; - MTFace *tf, *tface; - Material *ma = NULL, *noma= NULL; - RPatch *rp; - RNode *rn; - VeNoCo *vnc, **nodevert; - float *vd, *v1, *v2, *v3, *v4 = NULL; - int a, b, offs, index, mfdatatot; - - if (v3d==NULL) { - printf("Error, trying to collect radiosity meshes with no 3d view\n"); - return; - } - - set_radglobal(scene); - - freeAllRad(scene); - - start_fastmalloc("Radiosity"); - - /* count the number of verts */ - RG.totvert= 0; - RG.totface= 0; - base= (scene->base.first); - while(base) { - if(((base)->flag & SELECT) && ((base)->lay & v3d->lay) ) { - if(base->object->type==OB_MESH) { - base->flag |= OB_RADIO; - me= base->object->data; - RG.totvert+= me->totvert; - } - } - base= base->next; - } - if(RG.totvert==0) { - if (!during_script()); //XXX error("No vertices"); - return; - } - vnc= RG.verts= MEM_callocN(RG.totvert*sizeof(VeNoCo), "radioverts"); - - RG.min[0]= RG.min[1]= RG.min[2]= 1.0e20f; - RG.max[0]= RG.max[1]= RG.max[2]= -1.0e20f; - - mfdatatot= 0; - - /* min-max and material array */ - base= (scene->base.first); - while(base) { - if( ((base)->flag & SELECT) && ((base)->lay & v3d->lay) ) { - if(base->object->type==OB_MESH) { - me= base->object->data; - mvert= me->mvert; - for(a=0; a<me->totvert; a++, mvert++) { - vd= mallocVert(); - VECCOPY(vd, mvert->co); - /* Should make MTC its own module... */ - Mat4MulVecfl(base->object->obmat, vd); - - vnc->v= vd; - for(b=0; b<3; b++) { - RG.min[b]= MIN2(RG.min[b], vd[b]); - RG.max[b]= MAX2(RG.max[b], vd[b]); - } - vnc++; - } - - if(base->object->totcol==0) { - if(RG.totmat<MAXMAT) { - if(noma==NULL) { - noma= add_material("RadioMat"); - RG.matar[RG.totmat]= noma; - RG.totmat++; - } - } - } - else { - for(a=0; a<base->object->totcol; a++) { - if(RG.totmat >= MAXMAT) break; - - ma = give_current_material(base->object, a+1); - - if (materialIndex(ma)!=-1) break; - - RG.matar[RG.totmat]= ma; - RG.totmat++; - } - } - - mfdatatot += me->totface; - } - } - base= base->next; - } - - RG.cent[0]= (RG.min[0]+ RG.max[0])/2; - RG.cent[1]= (RG.min[1]+ RG.max[1])/2; - RG.cent[2]= (RG.min[2]+ RG.max[2])/2; - RG.size[0]= (RG.max[0]- RG.min[0]); - RG.size[1]= (RG.max[1]- RG.min[1]); - RG.size[2]= (RG.max[2]- RG.min[2]); - RG.maxsize= MAX3(RG.size[0],RG.size[1],RG.size[2]); - - RG.mfdata= MEM_callocN(sizeof(CustomData), "radiomfdata"); - RG.mfdatanodes= MEM_mallocN(sizeof(RNode*)*mfdatatot, "radiomfdatanodes"); - RG.mfdatatot= mfdatatot; - - /* make patches */ - - RG.totelem= 0; - RG.totpatch= 0; - RG.totlamp= 0; - offs= 0; - - base= (scene->base.first); - while(base) { - if( ((base)->flag & SELECT) && ((base)->lay & v3d->lay) ) { - if(base->object->type==OB_MESH) { - ob= base->object; - me= ob->data; - mface= me->mface; - tface= me->mtface; - - index= -1; - - CustomData_merge(&me->fdata, RG.mfdata, CD_MASK_DERIVEDMESH, - CD_DEFAULT, mfdatatot); - - for(a=0; a<me->totface; a++, mface++) { - tf= tface? tface+a: NULL; - - if (tf && (tf->mode & TF_INVISIBLE)) - continue; - - rp= callocPatch(); - BLI_addtail(&(RG.patchbase), rp); - rp->from= ob; - - if(mface->v4) rp->type= 4; - else rp->type= 3; - - rp->first= rn= callocNode(); - - if(mface->flag & ME_SMOOTH) rp->f1= RAD_NO_SPLIT; - - /* temporal: we store the venoco in the node */ - rn->v1= (float *)(RG.verts+mface->v1+offs); - v1= (RG.verts+mface->v1+offs)->v; - rn->v2= (float *)(RG.verts+mface->v2+offs); - v2= (RG.verts+mface->v2+offs)->v; - rn->v3= (float *)(RG.verts+mface->v3+offs); - v3= (RG.verts+mface->v3+offs)->v; - - if(mface->v4) { - rn->v4= (float *)(RG.verts+mface->v4+offs); - v4= (RG.verts+mface->v4+offs)->v; - } - rn->par= rp; - rn->f= RAD_PATCH; /* this node is a Patch */ - rn->type= rp->type; - - if(rn->type==4) { - rp->area= AreaQ3Dfl(v1, v2, v3, v4); - CalcNormFloat4(v1, v2, v3, v4, rp->norm); - } - else { - rp->area= AreaT3Dfl(v1, v2, v3); - CalcNormFloat(v1, v2, v3, rp->norm); - } - - rn->area= rp->area; - - /* color and emit */ - if(mface->mat_nr != index) { - index= mface->mat_nr; - ma= give_current_material(ob, index+1); - if(ma==0) ma= &defmaterial; - } - rp->ref[0]= ma->r; - rp->ref[1]= ma->g; - rp->ref[2]= ma->b; - - if(ma->emit) RG.totlamp++; - - rp->emit[0]= rp->emit[1]= rp->emit[2]= ma->emit; - rp->emit[0]*= rp->ref[0]; - rp->emit[1]*= rp->ref[1]; - rp->emit[2]*= rp->ref[2]; - -// uncommented, this is not satisfying, but i leave it in code for now (ton) -// if(ma->translucency!=0.0) rn->f |= RAD_TWOSIDED; - - nodevert= (VeNoCo **)&(rn->v1); - for(b=0; b<rp->type; b++) { - rp->cent[0]+= (*nodevert)->v[0]; - rp->cent[1]+= (*nodevert)->v[1]; - rp->cent[2]+= (*nodevert)->v[2]; - nodevert++; - } - rp->cent[0]/= (float)rp->type; - rp->cent[1]/= (float)rp->type; - rp->cent[2]/= (float)rp->type; - - /* for reconstruction materials */ - rp->matindex= materialIndex(ma); - if(rp->matindex==-1) rp->matindex= 1; - - /* these RNode's are stored now for later use in rad_addmesh - they should not get deleted before that */ - rn->orig= RG.totelem; - RG.mfdatanodes[RG.totelem]= rn; - - CustomData_copy_data(&me->fdata, RG.mfdata, a, RG.totelem, 1); - - RG.totelem++; - RG.totpatch++; - } - - offs+= me->totvert; - } - } - base= base->next; - } - - splitconnected(); - setedgepointers(); - - makeGlobalElemArray(); - pseudoAmb(); - rad_setlimits(scene); -} - -void setparelem(RNode *rn, RPatch *par) -{ - - if(rn->down1) { - setparelem(rn->down1, par); - setparelem(rn->down2, par); - } - else { - rn->par= par; - } -} - -void countelem(RNode *rn) -{ - - if(rn->down1) { - countelem(rn->down1); - countelem(rn->down2); - } - else RG.totelem++; -} - -void countglobaldata() -{ - /* counts elements and patches*/ - RPatch *rp; - - RG.totelem= RG.totpatch= 0; - - rp= RG.patchbase.first; - while(rp) { - RG.totpatch++; - countelem(rp->first); - rp= rp->next; - } -} - -void addelem(RNode ***el, RNode *rn, RPatch *rp) -{ - if(rn->down1) { - addelem(el, rn->down1, rp); - addelem(el, rn->down2, rp); - } - else { - rn->par= rp; - **el= rn; - (*el)++; - } -} - -void makeGlobalElemArray() -{ - /* always called when # of elements change */ - RPatch *rp; - RNode **el; - - countglobaldata(); - - if(RG.elem) MEM_freeN(RG.elem); - if(RG.totelem) { - el= RG.elem= MEM_mallocN(sizeof(void *)*RG.totelem, "makeGlobalElemArray"); - } - else { - RG.elem= 0; - return; - } - - /* recursive adding elements */ - rp= RG.patchbase.first; - while(rp) { - addelem(&el, rp->first, rp); - rp= rp->next; - } - - /* formfactor array */ - if(RG.formfactors) MEM_freeN(RG.formfactors); - if(RG.totelem) - RG.formfactors= MEM_mallocN(sizeof(float)*RG.totelem, "formfactors"); - else - RG.formfactors= 0; -} - -void splitpatch(RPatch *old) /* in case of overflow during shoot */ -{ - RNode *rn; - float **fpp; - RPatch *rp; - int a; - - rn= old->first; - if(rn->down1==0) return; - rn= rn->down1; - - old->unshot[0]/=2.0; - old->unshot[1]/=2.0; - old->unshot[2]/=2.0; - setnodeflags(old->first, 2, 0); - - rp= mallocPatch(); - *rp= *old; - BLI_addhead(&RG.patchbase, rp); - rp->first= rn; - rp->area= rn->area; - rp->cent[0]= rp->cent[1]= rp->cent[2]= 0.0; - fpp= &(rn->v1); - for(a=0; a<rp->type; a++) { - rp->cent[0]+= (*fpp)[0]; - rp->cent[1]+= (*fpp)[1]; - rp->cent[2]+= (*fpp)[2]; - fpp++; - } - rp->cent[0]/=(float)rp->type; - rp->cent[1]/=(float)rp->type; - rp->cent[2]/=(float)rp->type; - - setparelem(rn, rp); - - rn= old->first->down2; - - rp= mallocPatch(); - *rp= *old; - BLI_addhead(&RG.patchbase, rp); - rp->first= rn; - rp->area= rn->area; - rp->cent[0]= rp->cent[1]= rp->cent[2]= 0.0; - fpp= &(rn->v1); - for(a=0; a<rp->type; a++) { - rp->cent[0]+= (*fpp)[0]; - rp->cent[1]+= (*fpp)[1]; - rp->cent[2]+= (*fpp)[2]; - fpp++; - } - rp->cent[0]/=(float)rp->type; - rp->cent[1]/=(float)rp->type; - rp->cent[2]/=(float)rp->type; - - setparelem(rn, rp); - - BLI_remlink(&RG.patchbase, old); - freePatch(old); -} - - -void addpatch(RPatch *old, RNode *rn) -{ - float **fpp; - RPatch *rp; - int a; - - if(rn->down1) { - addpatch(old, rn->down1); - addpatch(old, rn->down2); - } - else { - rp= mallocPatch(); - *rp= *old; - BLI_addhead(&RG.patchbase, rp); - rp->first= rn; - - rp->area= rn->area; - rp->cent[0]= rp->cent[1]= rp->cent[2]= 0.0; - fpp= &(rn->v1); - for(a=0; a<rp->type; a++) { - rp->cent[0]+= (*fpp)[0]; - rp->cent[1]+= (*fpp)[1]; - rp->cent[2]+= (*fpp)[2]; - fpp++; - } - rp->cent[0]/=(float)rp->type; - rp->cent[1]/=(float)rp->type; - rp->cent[2]/=(float)rp->type; - - rn->par= rp; - } -} - -void converttopatches() -{ - /* chacks patches list, if node subdivided: new patch */ - RPatch *rp, *next; - - rp= RG.patchbase.first; - while(rp) { - next= rp->next; - if(rp->first->down1) { - addpatch(rp, rp->first); - BLI_remlink(&RG.patchbase, rp); - freePatch(rp); - } - rp= next; - } - -} - -void subdiv_elements() -{ - RNode **el, *rn; - int a, toobig= 1; - - rad_init_energy(); - - /* first maxsize elements */ - - while(toobig) { - toobig= 0; - - el= RG.elem; - for(a=RG.totelem; a>0; a--, el++) { - rn= *el; - if( rn->totrad[0]==0.0 && rn->totrad[1]==0.0 && rn->totrad[2]==0.0) { - if(rn->area>RG.elemmin) { - subdivideNode(rn, 0); - if(rn->down1 ) { - toobig= 1; - if(rn->down1->area>RG.elemmin) - subdivideNode( rn->down1, 0); - if(rn->down2->area>RG.elemmin) - subdivideNode( rn->down2, 0); - } - } - } - } - if(toobig) makeGlobalElemArray(); - } - - el= RG.elem; - for(a=RG.totelem; a>0; a--, el++) { - rn= *el; - if( rn->totrad[0]==0.0 && rn->totrad[1]==0.0 && rn->totrad[2]==0.0) { - subdivideNode(rn, 0); - if( rn->down1 ) { - subdivideNode( rn->down1, 0); - subdivideNode( rn->down2, 0); - } - } - } - makeGlobalElemArray(); -} - -void subdividelamps() -{ - RPatch *rp, *next; - - rp= RG.patchbase.first; - while(rp) { - next= rp->next; - if(rp->emit[0]!=0.0 || rp->emit[1]!=0.0 || rp->emit[2]!=0.0) { - subdivideNode( rp->first, 0); - if(rp->first->down1) { - subdivideNode(rp->first->down1, 0); - subdivideNode(rp->first->down2, 0); - } - - addpatch(rp, rp->first); - BLI_remlink(&RG.patchbase, rp); - freePatch(rp); - } - rp= next; - } - -} - -void maxsizePatches() -{ - RPatch *rp; - int toobig= 1; - - while(toobig) { - toobig= 0; - rp= RG.patchbase.first; - while(rp) { - if(rp->area>RG.patchmax) { - subdivideNode( rp->first, 0); - if(rp->first->down1) toobig= 1; - } - rp= rp->next; - } - - if(toobig) converttopatches(); - } - - /* count lamps */ - rp= RG.patchbase.first; - RG.totlamp= 0; - while(rp) { - if(rp->emit[0]!=0.0 || rp->emit[1]!=0.0 || rp->emit[2]!=0.0) { - RG.totlamp++; - } - rp= rp->next; - } - makeGlobalElemArray(); -} - - - diff --git a/source/blender/radiosity/intern/source/radrender.c b/source/blender/radiosity/intern/source/radrender.c deleted file mode 100644 index d33bbc90ee3..00000000000 --- a/source/blender/radiosity/intern/source/radrender.c +++ /dev/null @@ -1,530 +0,0 @@ -/* *************************************** - * - * ***** 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 ***** - */ - -/* radrender.c, aug 2003 - * - * Most of the code here is copied from radiosity code, to optimize for renderfaces. - * Shared function calls mostly reside in radfactors.c - * No adaptive subdivision takes place - * - * - do_radio_render(); main call, extern - * - initradfaces(); add radface structs in render faces, init radio globals - * - - * - initradiosity(); LUTs - * - inithemiwindows(); - * - progressiverad(); main itteration loop - * - hemi zbuffers - * - calc rad factors - * - * - closehemiwindows(); - * - freeAllRad(); - * - make vertex colors - * - * - during render, materials use totrad as ambient replacement - * - free radfaces - */ - -#include <stdlib.h> -#include <string.h> -#include <math.h> - -#include "MEM_guardedalloc.h" - -#include "BLI_blenlib.h" -#include "BLI_arithb.h" -#include "BLI_rand.h" - -#include "BKE_utildefines.h" -#include "BKE_global.h" -#include "BKE_main.h" - -#include "radio.h" - -/* the radiosity module uses internal includes from render! */ -#include "renderpipeline.h" -#include "render_types.h" -#include "renderdatabase.h" - - -/* only needed now for a print, if its useful move to RG */ -static float maxenergy; - -/* find the face with maximum energy to become shooter */ -/* nb: _rr means rad-render version of existing radio call */ -static void findshoot_rr(Render *re, VlakRen **shoot_p, RadFace **shootrf_p) -{ - RadFace *rf, *shootrf, **radface; - ObjectRen *obr; - VlakRen *vlr=NULL, *shoot; - float energy; - int a; - - shoot= NULL; - shootrf= NULL; - maxenergy= 0.0; - - for(obr=re->objecttable.first; obr; obr=obr->next) { - for(a=0; a<obr->totvlak; a++) { - if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++; - if((radface=RE_vlakren_get_radface(obr, vlr, 0)) && *radface) { - rf= *radface; - rf->flag &= ~RAD_SHOOT; - - energy= rf->unshot[0]*rf->area; - energy+= rf->unshot[1]*rf->area; - energy+= rf->unshot[2]*rf->area; - - if(energy>maxenergy) { - shoot= vlr; - shootrf= rf; - maxenergy= energy; - } - } - } - } - - if(shootrf) { - maxenergy/= RG.totenergy; - if(maxenergy<RG.convergence) { - *shoot_p= NULL; - *shootrf_p= NULL; - return; - } - shootrf->flag |= RAD_SHOOT; - } - - *shoot_p= shoot; - *shootrf_p= shootrf; -} - -static void backface_test_rr(Render *re, VlakRen *shoot, RadFace *shootrf) -{ - ObjectRen *obr; - VlakRen *vlr=NULL; - RadFace *rf, **radface; - float tvec[3]; - int a; - - /* backface testing */ - for(obr=re->objecttable.first; obr; obr=obr->next) { - for(a=0; a<obr->totvlak; a++) { - if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++; - if(vlr != shoot && (radface=RE_vlakren_get_radface(obr, vlr, 0)) && *radface) { - rf= *radface; - VecSubf(tvec, shootrf->cent, rf->cent); - - if(tvec[0]*rf->norm[0]+ tvec[1]*rf->norm[1]+ tvec[2]*rf->norm[2] < 0.0) - rf->flag |= RAD_BACKFACE; - } - } - } -} - -static void clear_backface_test_rr(Render *re) -{ - ObjectRen *obr; - VlakRen *vlr=NULL; - RadFace *rf, **radface; - int a; - - /* backface flag clear */ - for(obr=re->objecttable.first; obr; obr=obr->next) { - for(a=0; a<obr->totvlak; a++) { - if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++; - - if((radface=RE_vlakren_get_radface(obr, vlr, 0)) && *radface) { - rf= *radface; - rf->flag &= ~RAD_BACKFACE; - } - } - } -} - -extern RadView hemitop, hemiside; // radfactors.c - -/* hemi-zbuffering, delivers formfactors array */ -static void makeformfactors_rr(Render *re, VlakRen *shoot, RadFace *shootrf) -{ - ObjectRen *obr; - VlakRen *vlr=NULL; - RadFace *rf, **radface; - float len, vec[3], up[3], side[3], tar[5][3], *fp; - int a; - - memset(RG.formfactors, 0, sizeof(float)*RG.totelem); - - /* set up hemiview */ - /* first: upvector for hemitop, we use diagonal hemicubes to prevent aliasing */ - - VecSubf(vec, shoot->v1->co, shootrf->cent); - Crossf(up, shootrf->norm, vec); - len= Normalize(up); - - VECCOPY(hemitop.up, up); - VECCOPY(hemiside.up, shootrf->norm); - - Crossf(side, shootrf->norm, up); - - /* five targets */ - VecAddf(tar[0], shootrf->cent, shootrf->norm); - VecAddf(tar[1], shootrf->cent, up); - VecSubf(tar[2], shootrf->cent, up); - VecAddf(tar[3], shootrf->cent, side); - VecSubf(tar[4], shootrf->cent, side); - - /* camera */ - VECCOPY(hemiside.cam, shootrf->cent); - VECCOPY(hemitop.cam, shootrf->cent); - - /* do it! */ - VECCOPY(hemitop.tar, tar[0]); - hemizbuf(&hemitop); - - for(a=1; a<5; a++) { - VECCOPY(hemiside.tar, tar[a]); - hemizbuf(&hemiside); - } - - /* convert factors to real radiosity */ - fp= RG.formfactors; - - for(obr=re->objecttable.first; obr; obr=obr->next) { - for(a=0; a<obr->totvlak; a++) { - if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++; - - if((radface=RE_vlakren_get_radface(obr, vlr, 0)) && *radface) { - rf= *radface; - if(*fp!=0.0 && rf->area!=0.0) { - *fp *= shootrf->area/rf->area; - if(*fp>1.0) *fp= 1.0001; - } - fp++; - } - } - } -} - -/* based at RG.formfactors array, distribute shoot energy over other faces */ -static void applyformfactors_rr(Render *re, VlakRen *shoot, RadFace *shootrf) -{ - ObjectRen *obr; - VlakRen *vlr=NULL; - RadFace *rf, **radface; - float *fp, *ref, unr, ung, unb, r, g, b; - int a; - - unr= shootrf->unshot[0]; - ung= shootrf->unshot[1]; - unb= shootrf->unshot[2]; - - fp= RG.formfactors; - - for(obr=re->objecttable.first; obr; obr=obr->next) { - for(a=0; a<obr->totvlak; a++) { - if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++; - - if((radface=RE_vlakren_get_radface(obr, vlr, 0)) && *radface) { - rf= *radface; - if(*fp!= 0.0) { - - ref= &(vlr->mat->r); - - r= (*fp)*unr*ref[0]; - g= (*fp)*ung*ref[1]; - b= (*fp)*unb*ref[2]; - - // if(rf->flag & RAD_BACKFACE) { - - rf->totrad[0]+= r; - rf->totrad[1]+= g; - rf->totrad[2]+= b; - - rf->unshot[0]+= r; - rf->unshot[1]+= g; - rf->unshot[2]+= b; - } - fp++; - } - } - } - /* shoot energy has been shot */ - shootrf->unshot[0]= shootrf->unshot[1]= shootrf->unshot[2]= 0.0; -} - - -/* main loop for itterations */ -static void progressiverad_rr(Render *re) -{ - VlakRen *shoot; - RadFace *shootrf; - float unshot[3]; - int it= 0; - - findshoot_rr(re, &shoot, &shootrf); - while( shoot ) { - - /* backfaces receive no energy, but are zbuffered... */ - backface_test_rr(re, shoot, shootrf); - - /* ...unless it's two sided */ - if(shootrf->flag & RAD_TWOSIDED) { - VECCOPY(unshot, shootrf->unshot); - VecNegf(shootrf->norm); - makeformfactors_rr(re, shoot, shootrf); - applyformfactors_rr(re, shoot, shootrf); - VecNegf(shootrf->norm); - VECCOPY(shootrf->unshot, unshot); - } - - /* hemi-zbuffers */ - makeformfactors_rr(re, shoot, shootrf); - /* based at RG.formfactors array, distribute shoot energy over other faces */ - applyformfactors_rr(re, shoot, shootrf); - - it++; - re->timecursor(re->tch, it); - - clear_backface_test_rr(re); - - if(re->test_break(re->tbh)) break; - if(RG.maxiter && RG.maxiter<=it) break; - - findshoot_rr(re, &shoot, &shootrf); - } - printf(" Unshot energy:%f\n", 1000.0*maxenergy); - - re->timecursor(re->tch, re->scene->r.cfra); -} - -static RadFace *radfaces=NULL; - -static void initradfaces(Render *re) -{ - ObjectRen *obr; - VlakRen *vlr= NULL; - RadFace *rf, **radface; - int a, b; - - /* globals */ - RG.totenergy= 0.0; - RG.totpatch= 0; // we count initial emittors here - RG.totelem= 0; // total # faces are put here (so we can use radfactors.c calls) - /* size is needed for hemicube clipping */ - RG.min[0]= RG.min[1]= RG.min[2]= 1.0e20; - RG.max[0]= RG.max[1]= RG.max[2]= -1.0e20; - - /* count first for fast malloc */ - for(obr=re->objecttable.first; obr; obr=obr->next) { - for(a=0; a<obr->totvlak; a++) { - if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++; - - if(vlr->mat->mode & MA_RADIO) { - if(vlr->mat->emit > 0.0) { - RG.totpatch++; - } - RG.totelem++; - } - } - } - -printf(" Rad elems: %d emittors %d\n", RG.totelem, RG.totpatch); - if(RG.totelem==0 || RG.totpatch==0) return; - - /* make/init radfaces */ - rf=radfaces= MEM_callocN(RG.totelem*sizeof(RadFace), "radfaces"); - for(obr=re->objecttable.first; obr; obr=obr->next) { - for(a=0; a<obr->totvlak; a++) { - if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++; - - if(vlr->mat->mode & MA_RADIO) { - - /* during render, vlr->n gets flipped/corrected, we cannot have that */ - if (obr->ob->transflag & OB_NEG_SCALE){ - /* The object has negative scale that will cause the normals to flip. - To counter this unwanted normal flip, swap vertex 2 and 4 for a quad - or vertex 2 and 3 (see flip_face) for a triangle in the call to CalcNormFloat4 - in order to flip the normals back to the way they were in the original mesh. */ - if(vlr->v4) CalcNormFloat4(vlr->v1->co, vlr->v4->co, vlr->v3->co, vlr->v2->co, rf->norm); - else CalcNormFloat(vlr->v1->co, vlr->v3->co, vlr->v2->co, rf->norm); - }else{ - if(vlr->v4) CalcNormFloat4(vlr->v1->co, vlr->v2->co, vlr->v3->co, vlr->v4->co, rf->norm); - else CalcNormFloat(vlr->v1->co, vlr->v2->co, vlr->v3->co, rf->norm); - } - - rf->totrad[0]= vlr->mat->emit*vlr->mat->r; - rf->totrad[1]= vlr->mat->emit*vlr->mat->g; - rf->totrad[2]= vlr->mat->emit*vlr->mat->b; - VECCOPY(rf->unshot, rf->totrad); - - if(vlr->v4) { - rf->area= AreaQ3Dfl(vlr->v1->co, vlr->v2->co, vlr->v3->co, vlr->v4->co); - CalcCent4f(rf->cent, vlr->v1->co, vlr->v2->co, vlr->v3->co, vlr->v4->co); - } - else { - rf->area= AreaT3Dfl(vlr->v1->co, vlr->v2->co, vlr->v3->co); - CalcCent3f(rf->cent, vlr->v1->co, vlr->v2->co, vlr->v3->co); - } - - RG.totenergy+= rf->unshot[0]*rf->area; - RG.totenergy+= rf->unshot[1]*rf->area; - RG.totenergy+= rf->unshot[2]*rf->area; - - for(b=0; b<3; b++) { - RG.min[b]= MIN2(RG.min[b], rf->cent[b]); - RG.max[b]= MAX2(RG.max[b], rf->cent[b]); - } - - // uncommented; this isnt satisfying, but i leave it in the code for now (ton) - // if(vlr->mat->translucency!=0.0) rf->flag |= RAD_TWOSIDED; - - radface=RE_vlakren_get_radface(obr, vlr, 1); - *radface= rf++; - } - } - } - RG.size[0]= (RG.max[0]- RG.min[0]); - RG.size[1]= (RG.max[1]- RG.min[1]); - RG.size[2]= (RG.max[2]- RG.min[2]); - RG.maxsize= MAX3(RG.size[0],RG.size[1],RG.size[2]); - - /* formfactor array */ - if(RG.formfactors) MEM_freeN(RG.formfactors); - if(RG.totelem) - RG.formfactors= MEM_mallocN(sizeof(float)*RG.totelem, "formfactors"); - else - RG.formfactors= NULL; - -} - -static void vecaddfac(float *vec, float *v1, float *v2, float fac) -{ - vec[0]= v1[0] + fac*v2[0]; - vec[1]= v1[1] + fac*v2[1]; - vec[2]= v1[2] + fac*v2[2]; - -} - -/* unused now, doesnt work..., find it in cvs of nov 2005 or older */ -/* static void filter_rad_values(void) */ - - -static void make_vertex_rad_values(Render *re) -{ - ObjectRen *obr; - VertRen *v1=NULL; - VlakRen *vlr=NULL; - RadFace *rf, **radface; - float *col; - int a; - - RG.igamma= 1.0/RG.gamma; - RG.radfactor= RG.radfac*pow(64*64, RG.igamma)/128.0; /* compatible with radio-tool */ - - /* accumulate vertexcolors */ - for(obr=re->objecttable.first; obr; obr=obr->next) { - for(a=0; a<obr->totvlak; a++) { - if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++; - - if((radface=RE_vlakren_get_radface(obr, vlr, 0)) && *radface) { - rf= *radface; - - /* apply correction */ - rf->totrad[0]= RG.radfactor*pow( rf->totrad[0], RG.igamma); - rf->totrad[1]= RG.radfactor*pow( rf->totrad[1], RG.igamma); - rf->totrad[2]= RG.radfactor*pow( rf->totrad[2], RG.igamma); - - /* correct rf->rad values for color */ - if(vlr->mat->r > 0.0) rf->totrad[0]/= vlr->mat->r; - if(vlr->mat->g > 0.0) rf->totrad[1]/= vlr->mat->g; - if(vlr->mat->b > 0.0) rf->totrad[2]/= vlr->mat->b; - - col= RE_vertren_get_rad(obr, vlr->v1, 1); - vecaddfac(col, col, rf->totrad, rf->area); - col[3]+= rf->area; - - col= RE_vertren_get_rad(obr, vlr->v2, 1); - vecaddfac(col, col, rf->totrad, rf->area); - col[3]+= rf->area; - - col= RE_vertren_get_rad(obr, vlr->v3, 1); - vecaddfac(col, col, rf->totrad, rf->area); - col[3]+= rf->area; - - if(vlr->v4) { - col= RE_vertren_get_rad(obr, vlr->v4, 1); - vecaddfac(col, col, rf->totrad, rf->area); - col[3]+= rf->area; - } - } - } - - /* make vertex colors */ - for(a=0; a<obr->totvert; a++) { - if((a & 255)==0) v1= RE_findOrAddVert(obr, a); else v1++; - - col= RE_vertren_get_rad(obr, v1, 0); - if(col && col[3]>0.0) { - col[0]/= col[3]; - col[1]/= col[3]; - col[2]/= col[3]; - } - } - } -} - -/* main call, extern */ -void do_radio_render(Render *re) -{ - if(re->scene->radio==NULL) add_radio(re->scene); - freeAllRad(re->scene); /* just in case radio-tool is still used */ - - set_radglobal(re->scene); /* init the RG struct */ - RG.re= re; /* only used by hemizbuf(), prevents polluting radio code all over */ - - initradfaces(re); /* add radface structs to render faces */ - if(RG.totenergy>0.0) { - - initradiosity(); /* LUT's */ - inithemiwindows(); /* views, need RG.maxsize for clipping */ - - progressiverad_rr(re); /* main radio loop */ - - make_vertex_rad_values(re); /* convert face energy to vertex ones */ - - } - - freeAllRad(re->scene); /* luts, hemis, sets vars at zero */ -} - -/* free call, after rendering, extern */ -void end_radio_render(void) -{ - if(radfaces) MEM_freeN(radfaces); - radfaces= NULL; -} - diff --git a/source/blender/render/extern/include/RE_render_ext.h b/source/blender/render/extern/include/RE_render_ext.h index 20eea0c98bd..15b59f2c8cc 100644 --- a/source/blender/render/extern/include/RE_render_ext.h +++ b/source/blender/render/extern/include/RE_render_ext.h @@ -47,7 +47,8 @@ struct Render; struct MTex; struct ImBuf; -void RE_zbufferall_radio(struct RadView *vw, struct RNode **rg_elem, int rg_totelem, struct Render *re); +// RADIO REMOVED, Maybe this will be useful later +//void RE_zbufferall_radio(struct RadView *vw, struct RNode **rg_elem, int rg_totelem, struct Render *re); /* particle.c, effect.c, editmesh_modes.c and brush.c, returns 1 if rgb, 0 otherwise */ int externtex(struct MTex *mtex, float *vec, float *tin, float *tr, float *tg, float *tb, float *ta); diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 98e5819c0d3..a00cd2211fc 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -104,7 +104,6 @@ #include "rendercore.h" #include "renderdatabase.h" #include "renderpipeline.h" -#include "radio.h" #include "shadbuf.h" #include "shading.h" #include "strand.h" @@ -1886,6 +1885,9 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem if(psys_get_particle_state(re->scene,ob,psys,a,&state,0)==0) continue; + if(psys->parent) + Mat4MulVecfl(psys->parent->obmat, state.co); + VECCOPY(loc,state.co); if(part->ren_as!=PART_DRAW_BB) MTC_Mat4MulVecfl(re->viewmat,loc); @@ -4308,8 +4310,9 @@ void RE_Database_Free(Render *re) } free_mesh_orco_hash(re); - +#if 0 /* radio can be redone better */ end_radio_render(); +#endif end_render_materials(); end_render_textures(); @@ -4736,10 +4739,11 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view) /* yafray: 'direct' radiosity, environment maps and raytree init not needed for yafray render */ /* although radio mode could be useful at some point, later */ if (re->r.renderer==R_INTERN) { +#if 0 /* RADIO was removed */ /* RADIO (uses no R anymore) */ if(!re->test_break(re->tbh)) if(re->r.mode & R_RADIO) do_radio_render(re); - +#endif /* raytree */ if(!re->test_break(re->tbh)) { if(re->r.mode & R_RAYTRACE) { diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 07560edb76b..5eec13ed7fe 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -46,6 +46,7 @@ #include "BKE_object.h" #include "BKE_scene.h" #include "BKE_writeavi.h" /* <------ should be replaced once with generic movie module */ +#include "BKE_pointcache.h" #include "MEM_guardedalloc.h" @@ -61,7 +62,6 @@ #include "intern/openexr/openexr_multi.h" #include "RE_pipeline.h" -#include "radio.h" /* internal */ #include "render_types.h" @@ -2413,6 +2413,20 @@ static int is_rendering_allowed(Render *re) return 1; } +static void update_physics_cache(Render *re, Scene *scene) +{ + PTCacheBaker baker; + + baker.scene = scene; + baker.pid = NULL; + baker.bake = 0; + baker.render = 1; + baker.break_test = re->test_break; + baker.break_data = re->tbh; + baker.progressbar = NULL; + + BKE_ptcache_make_cache(&baker); +} /* evaluating scene options for general Blender render */ static int render_initialize_from_scene(Render *re, Scene *scene, int anim) { @@ -2450,6 +2464,9 @@ static int render_initialize_from_scene(Render *re, Scene *scene, int anim) /* check all scenes involved */ tag_scenes_for_render(re); + + /* make sure dynamics are up to date */ + update_physics_cache(re, scene); if(scene->r.scemode & R_SINGLE_LAYER) push_render_result(re); diff --git a/source/blender/render/intern/source/zbuf.c b/source/blender/render/intern/source/zbuf.c index b68cecce7bd..21c3977fc0b 100644 --- a/source/blender/render/intern/source/zbuf.c +++ b/source/blender/render/intern/source/zbuf.c @@ -49,14 +49,12 @@ #include "DNA_mesh_types.h" #include "DNA_node_types.h" #include "DNA_meshdata_types.h" +#include "DNA_material_types.h" #include "BKE_global.h" #include "BKE_material.h" #include "BKE_utildefines.h" -#include "radio_types.h" -#include "radio.h" /* needs RG, some root data for radiosity */ - #include "RE_render_ext.h" /* local includes */ @@ -2301,110 +2299,6 @@ static int hashlist_projectvert(float *v1, float winmat[][4], float *hoco) return buck->clip; } -/* used for booth radio 'tool' as during render */ -void RE_zbufferall_radio(struct RadView *vw, RNode **rg_elem, int rg_totelem, Render *re) -{ - ZSpan zspan; - float hoco[4][4], winmat[4][4]; - int a, zvlnr; - int c1, c2, c3, c4= 0; - - if(rg_totelem==0) return; - - hashlist_projectvert(NULL, winmat, NULL); - - /* needed for projectvert */ - MTC_Mat4MulMat4(winmat, vw->viewmat, vw->winmat); - - /* 1.0f for clipping in clippyra()... bad stuff actually */ - zbuf_alloc_span(&zspan, vw->rectx, vw->recty, 1.0f); - zspan.zmulx= ((float)vw->rectx)/2.0; - zspan.zmuly= ((float)vw->recty)/2.0; - zspan.zofsx= -0.5f; - zspan.zofsy= -0.5f; - - /* the buffers */ - zspan.rectz= (int *)vw->rectz; - zspan.rectp= (int *)vw->rect; - zspan.recto= MEM_callocN(sizeof(int)*vw->rectx*vw->recty, "radiorecto"); - fillrect(zspan.rectz, vw->rectx, vw->recty, 0x7FFFFFFF); - fillrect(zspan.rectp, vw->rectx, vw->recty, 0xFFFFFF); - - /* filling methods */ - zspan.zbuffunc= zbuffillGL4; - - if(rg_elem) { /* radio tool */ - RNode **re, *rn; - - re= rg_elem; - re+= (rg_totelem-1); - for(a= rg_totelem-1; a>=0; a--, re--) { - rn= *re; - if( (rn->f & RAD_SHOOT)==0 ) { /* no shootelement */ - - if( rn->f & RAD_TWOSIDED) zvlnr= a; - else if( rn->f & RAD_BACKFACE) zvlnr= 0xFFFFFF; - else zvlnr= a; - - c1= hashlist_projectvert(rn->v1, winmat, hoco[0]); - c2= hashlist_projectvert(rn->v2, winmat, hoco[1]); - c3= hashlist_projectvert(rn->v3, winmat, hoco[2]); - - if(rn->v4) { - c4= hashlist_projectvert(rn->v4, winmat, hoco[3]); - } - - if(rn->v4) - zbufclip4(&zspan, 0, zvlnr, hoco[0], hoco[1], hoco[2], hoco[3], c1, c2, c3, c4); - else - zbufclip(&zspan, 0, zvlnr, hoco[0], hoco[1], hoco[2], c1, c2, c3); - } - } - } - else { /* radio render */ - ObjectRen *obr; - VlakRen *vlr=NULL; - RadFace **radface, *rf; - int totface=0; - - /* note: radio render doesn't support duplis */ - for(obr=re->objecttable.first; obr; obr=obr->next) { - hashlist_projectvert(NULL, NULL, NULL); /* clear hashlist */ - - for(a=0; a<obr->totvlak; a++) { - if((a & 255)==0) vlr= obr->vlaknodes[a>>8].vlak; else vlr++; - - if((radface=RE_vlakren_get_radface(obr, vlr, 0)) && *radface) { - rf= *radface; - if( (rf->flag & RAD_SHOOT)==0 ) { /* no shootelement */ - - if( rf->flag & RAD_TWOSIDED) zvlnr= totface; - else if( rf->flag & RAD_BACKFACE) zvlnr= 0xFFFFFF; /* receives no energy, but is zbuffered */ - else zvlnr= totface; - - c1= hashlist_projectvert(vlr->v1->co, winmat, hoco[0]); - c2= hashlist_projectvert(vlr->v2->co, winmat, hoco[1]); - c3= hashlist_projectvert(vlr->v3->co, winmat, hoco[2]); - - if(vlr->v4) { - c4= hashlist_projectvert(vlr->v4->co, winmat, hoco[3]); - } - - if(vlr->v4) - zbufclip4(&zspan, 0, zvlnr, hoco[0], hoco[1], hoco[2], hoco[3], c1, c2, c3, c4); - else - zbufclip(&zspan, 0, zvlnr, hoco[0], hoco[1], hoco[2], c1, c2, c3); - } - totface++; - } - } - } - } - - MEM_freeN(zspan.recto); - zbuf_free_span(&zspan); -} - void zbuffer_shadow(Render *re, float winmat[][4], LampRen *lar, int *rectz, int size, float jitx, float jity) { ZbufProjectCache cache[ZBUF_PROJECT_CACHE_SIZE]; diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index 739cfbcc1ac..9b987cdfa51 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -58,37 +58,6 @@ enum { WM_OP_EXEC_SCREEN }; -/* ************** wmEvent ************************ */ - -/* each event should have full modifier state */ -/* event comes from eventmanager and from keymap */ -typedef struct wmEvent { - struct wmEvent *next, *prev; - - short type; /* event code itself (short, is also in keymap) */ - short val; /* press, release, scrollvalue */ - short x, y; /* mouse pointer position, screen coord */ - short mval[2]; /* region mouse position, name convention pre 2.5 :) */ - short prevx, prevy; /* previous mouse pointer position */ - short unicode; /* future, ghost? */ - char ascii; /* from ghost */ - char pad; - - /* modifier states */ - short shift, ctrl, alt, oskey; /* oskey is apple or windowskey, value denotes order of pressed */ - short keymodifier; /* rawkey modifier */ - - /* keymap item, set by handler (weak?) */ - const char *keymap_idname; - - /* custom data */ - short custom; /* custom data type, stylus, 6dof, see wm_event_types.h */ - void *customdata; /* ascii, unicode, mouse coords, angles, vectors, dragdrop info */ - short customdatafree; - -} wmEvent; - - /* ************** wmKeyMap ************************ */ /* modifier */ diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c index adbc43e439d..0bc35ffa9b2 100644 --- a/source/blender/windowmanager/intern/wm_init_exit.c +++ b/source/blender/windowmanager/intern/wm_init_exit.c @@ -58,8 +58,6 @@ #include "RE_pipeline.h" /* RE_ free stuff */ -#include "radio.h" - #ifndef DISABLE_PYTHON #include "BPY_extern.h" #endif @@ -196,9 +194,6 @@ void WM_exit(bContext *C) // BIF_freeRetarget(); BIF_freeTemplates(C); BIF_freeSketch(C); - - /* Context should still working here. but radio tool needs cleaning... */ - freeAllRad(CTX_data_scene(C)); free_ttfont(); /* bke_font.h */ diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c index 7528321c7c5..85028e3ea1a 100644 --- a/source/blender/windowmanager/intern/wm_keymap.c +++ b/source/blender/windowmanager/intern/wm_keymap.c @@ -44,6 +44,7 @@ #include "RNA_access.h" #include "RNA_types.h" +#include "RNA_enum_types.h" #include "WM_api.h" #include "WM_types.h" @@ -155,313 +156,9 @@ ListBase *WM_keymap_listbase(wmWindowManager *wm, const char *nameid, int spacei char *WM_key_event_string(short type) { - /* not returned: CAPSLOCKKEY, UNKNOWNKEY, COMMANDKEY, GRLESSKEY */ - - switch(type) { - case AKEY: - return "A"; - break; - case BKEY: - return "B"; - break; - case CKEY: - return "C"; - break; - case DKEY: - return "D"; - break; - case EKEY: - return "E"; - break; - case FKEY: - return "F"; - break; - case GKEY: - return "G"; - break; - case HKEY: - return "H"; - break; - case IKEY: - return "I"; - break; - case JKEY: - return "J"; - break; - case KKEY: - return "K"; - break; - case LKEY: - return "L"; - break; - case MKEY: - return "M"; - break; - case NKEY: - return "N"; - break; - case OKEY: - return "O"; - break; - case PKEY: - return "P"; - break; - case QKEY: - return "Q"; - break; - case RKEY: - return "R"; - break; - case SKEY: - return "S"; - break; - case TKEY: - return "T"; - break; - case UKEY: - return "U"; - break; - case VKEY: - return "V"; - break; - case WKEY: - return "W"; - break; - case XKEY: - return "X"; - break; - case YKEY: - return "Y"; - break; - case ZKEY: - return "Z"; - break; - - case ZEROKEY: - return "Zero"; - break; - case ONEKEY: - return "One"; - break; - case TWOKEY: - return "Two"; - break; - case THREEKEY: - return "Three"; - break; - case FOURKEY: - return "Four"; - break; - case FIVEKEY: - return "Five"; - break; - case SIXKEY: - return "Six"; - break; - case SEVENKEY: - return "Seven"; - break; - case EIGHTKEY: - return "Eight"; - break; - case NINEKEY: - return "Nine"; - break; - - case LEFTCTRLKEY: - return "Leftctrl"; - break; - case LEFTALTKEY: - return "Leftalt"; - break; - case RIGHTALTKEY: - return "Rightalt"; - break; - case RIGHTCTRLKEY: - return "Rightctrl"; - break; - case RIGHTSHIFTKEY: - return "Rightshift"; - break; - case LEFTSHIFTKEY: - return "Leftshift"; - break; - - case ESCKEY: - return "Esc"; - break; - case TABKEY: - return "Tab"; - break; - case RETKEY: - return "Ret"; - break; - case SPACEKEY: - return "Space"; - break; - case LINEFEEDKEY: - return "Linefeed"; - break; - case BACKSPACEKEY: - return "Backspace"; - break; - case DELKEY: - return "Del"; - break; - case SEMICOLONKEY: - return "Semicolon"; - break; - case PERIODKEY: - return "Period"; - break; - case COMMAKEY: - return "Comma"; - break; - case QUOTEKEY: - return "Quote"; - break; - case ACCENTGRAVEKEY: - return "Accentgrave"; - break; - case MINUSKEY: - return "Minus"; - break; - case SLASHKEY: - return "Slash"; - break; - case BACKSLASHKEY: - return "Backslash"; - break; - case EQUALKEY: - return "Equal"; - break; - case LEFTBRACKETKEY: - return "Leftbracket"; - break; - case RIGHTBRACKETKEY: - return "Rightbracket"; - break; - - case LEFTARROWKEY: - return "Leftarrow"; - break; - case DOWNARROWKEY: - return "Downarrow"; - break; - case RIGHTARROWKEY: - return "Rightarrow"; - break; - case UPARROWKEY: - return "Uparrow"; - break; - - case PAD2: - return "Numpad 2"; - break; - case PAD4: - return "Numpad 4"; - break; - case PAD6: - return "Numpad 6"; - break; - case PAD8: - return "Numpad 8"; - break; - case PAD1: - return "Numpad 1"; - break; - case PAD3: - return "Numpad 3"; - break; - case PAD5: - return "Numpad 5"; - break; - case PAD7: - return "Numpad 7"; - break; - case PAD9: - return "Numpad 9"; - break; - - case PADPERIOD: - return "Numpad ."; - break; - case PADSLASHKEY: - return "Numpad /"; - break; - case PADASTERKEY: - return "Numpad *"; - break; - - case PAD0: - return "Numpad 0"; - break; - case PADMINUS: - return "Numpad -"; - break; - case PADENTER: - return "Numpad Enter"; - break; - case PADPLUSKEY: - return "Numpad +"; - break; - - case F1KEY: - return "F1"; - break; - case F2KEY: - return "F2"; - break; - case F3KEY: - return "F3"; - break; - case F4KEY: - return "F4"; - break; - case F5KEY: - return "F5"; - break; - case F6KEY: - return "F6"; - break; - case F7KEY: - return "F7"; - break; - case F8KEY: - return "F8"; - break; - case F9KEY: - return "F9"; - break; - case F10KEY: - return "F10"; - break; - case F11KEY: - return "F11"; - break; - case F12KEY: - return "F12"; - break; - - case PAUSEKEY: - return "Pause"; - break; - case INSERTKEY: - return "Insert"; - break; - case HOMEKEY: - return "Home"; - break; - case PAGEUPKEY: - return "Pageup"; - break; - case PAGEDOWNKEY: - return "Pagedown"; - break; - case ENDKEY: - return "End"; - break; - } + const char *name= NULL; + if(RNA_enum_name(event_type_items, (int)type, &name)) + return name; return ""; } diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index 4701eba810f..ade5a2a64a8 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -198,7 +198,7 @@ ADD_DEPENDENCIES(blender makesdna) FILE(READ ${CMAKE_BINARY_DIR}/cmake_blender_libs.txt BLENDER_LINK_LIBS) -SET(BLENDER_LINK_LIBS bf_nodes ${BLENDER_LINK_LIBS} bf_windowmanager bf_editors blender_render blender_radiosity) +SET(BLENDER_LINK_LIBS bf_nodes ${BLENDER_LINK_LIBS} bf_windowmanager bf_editors blender_render) IF(WITH_ELBEEM) SET(BLENDER_LINK_LIBS ${BLENDER_LINK_LIBS} bf_elbeem) @@ -218,7 +218,6 @@ IF(UNIX) bf_ghost bf_string blender_render - blender_radiosity blender_ONL bf_python bf_gen_python @@ -238,7 +237,6 @@ IF(UNIX) bf_kernel bf_decimation bf_elbeem - bf_yafray bf_IK bf_memutil bf_guardedalloc @@ -264,10 +262,7 @@ IF(UNIX) bf_ngnetwork extern_bullet bf_loopbacknetwork - bf_sumo bf_common - extern_solid - extern_qhull bf_moto bf_python bf_gen_python diff --git a/source/gameengine/BlenderRoutines/Makefile b/source/gameengine/BlenderRoutines/Makefile index f5486bae87b..549e466c4e0 100644 --- a/source/gameengine/BlenderRoutines/Makefile +++ b/source/gameengine/BlenderRoutines/Makefile @@ -36,8 +36,6 @@ include nan_compile.mk CCFLAGS += $(LEVEL_1_CPP_WARNINGS) CPPFLAGS += -I$(NAN_GLEW)/include -CPPFLAGS += -I$(NAN_SUMO)/include -I$(NAN_SOLID)/include -CPPFLAGS += -I$(NAN_SOLID) CPPFLAGS += -I$(NAN_STRING)/include CPPFLAGS += -I$(NAN_MOTO)/include CPPFLAGS += -I$(NAN_FUZZICS)/include @@ -67,7 +65,6 @@ CPPFLAGS += -I../../kernel/gen_system CPPFLAGS += -I../Network CPPFLAGS += -I../Network/LoopBackNetwork CPPFLAGS += -I../Physics/common -CPPFLAGS += -I../Physics/Sumo CPPFLAGS += -I. ifeq ($(OS),windows) diff --git a/source/gameengine/BlenderRoutines/SConscript b/source/gameengine/BlenderRoutines/SConscript index a0cc3af3611..c2094a15825 100644 --- a/source/gameengine/BlenderRoutines/SConscript +++ b/source/gameengine/BlenderRoutines/SConscript @@ -20,11 +20,6 @@ incs += ' #intern/SoundSystem #source/blender/misc #source/blender/blenloader' incs += ' #extern/glew/include #source/blender/gpu' incs += ' #source/blender/windowmanager' -if env['WITH_BF_SOLID']: - incs += ' #source/gameengine/Physics/Sumo #source/gameengine/Physics/Sumo/Fuzzics/include' - incs += ' ' + env['BF_SOLID_INC'] - defs.append('USE_SUMO_SOLID') - if env['WITH_BF_FFMPEG']: defs.append('WITH_FFMPEG') diff --git a/source/gameengine/CMakeLists.txt b/source/gameengine/CMakeLists.txt index fd05858710d..f546a31fb2e 100644 --- a/source/gameengine/CMakeLists.txt +++ b/source/gameengine/CMakeLists.txt @@ -38,7 +38,6 @@ ADD_SUBDIRECTORY(Rasterizer) ADD_SUBDIRECTORY(Rasterizer/RAS_OpenGLRasterizer) ADD_SUBDIRECTORY(SceneGraph) ADD_SUBDIRECTORY(Physics/Bullet) -ADD_SUBDIRECTORY(Physics/Sumo) ADD_SUBDIRECTORY(VideoTexture) IF(WITH_PLAYER) diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index b907e300879..177f261e40b 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -163,7 +163,6 @@ extern "C" { #include "SG_BBox.h" #include "SG_Tree.h" -// defines USE_ODE to choose physics engine #include "KX_ConvertPhysicsObject.h" #ifdef USE_BULLET #include "CcdPhysicsEnvironment.h" @@ -1610,18 +1609,6 @@ void BL_CreatePhysicsObjectNew(KX_GameObject* gameobj, break; #endif -#ifdef USE_SUMO_SOLID - case UseSumo: - KX_ConvertSumoObject(gameobj, meshobj, kxscene, shapeprops, smmaterial, &objprop); - break; -#endif - -#ifdef USE_ODE - case UseODE: - KX_ConvertODEEngineObject(gameobj, meshobj, kxscene, shapeprops, smmaterial, &objprop); - break; -#endif //USE_ODE - case UseDynamo: //KX_ConvertDynamoObject(gameobj,meshobj,kxscene,shapeprops, smmaterial, &objprop); break; diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp index 86e20b88580..9e0a710f44f 100644 --- a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp +++ b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp @@ -44,21 +44,12 @@ #include "DummyPhysicsEnvironment.h" -//to decide to use sumo/ode or dummy physics - defines USE_ODE #include "KX_ConvertPhysicsObject.h" #ifdef USE_BULLET #include "CcdPhysicsEnvironment.h" #endif -#ifdef USE_ODE -#include "OdePhysicsEnvironment.h" -#endif //USE_ODE - -#ifdef USE_SUMO_SOLID -#include "SumoPhysicsEnvironment.h" -#endif - #include "KX_BlenderSceneConverter.h" #include "KX_BlenderScalarInterpolator.h" #include "BL_BlenderDataConversion.h" @@ -145,10 +136,6 @@ KX_BlenderSceneConverter::~KX_BlenderSceneConverter() delete (*itm).second; itm++; } - -#ifdef USE_SUMO_SOLID - KX_ClearSumoSharedShapes(); -#endif #ifdef USE_BULLET KX_ClearBulletSharedShapes(); @@ -331,20 +318,7 @@ void KX_BlenderSceneConverter::ConvertScene(const STR_String& scenename, destinationscene->SetPhysicsEnvironment(ccdPhysEnv); break; } -#endif - -#ifdef USE_SUMO_SOLID - case UseSumo: - destinationscene ->SetPhysicsEnvironment(new SumoPhysicsEnvironment()); - break; -#endif -#ifdef USE_ODE - - case UseODE: - destinationscene ->SetPhysicsEnvironment(new ODEPhysicsEnvironment()); - break; -#endif //USE_ODE - +#endif case UseDynamo: { } diff --git a/source/gameengine/Converter/Makefile b/source/gameengine/Converter/Makefile index abded70f289..ed95aa968c7 100644 --- a/source/gameengine/Converter/Makefile +++ b/source/gameengine/Converter/Makefile @@ -39,8 +39,7 @@ CPPFLAGS += -I$(OPENGL_HEADERS) CPPFLAGS += -I$(NAN_STRING)/include CPPFLAGS += -I$(NAN_SOUNDSYSTEM)/include CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION) -CPPFLAGS += -I$(NAN_FUZZICS)/include -I$(NAN_SUMO) -I$(NAN_MOTO)/include -CPPFLAGS += -I$(NAN_SOLID)/include +CPPFLAGS += -I$(NAN_FUZZICS)/include -I$(NAN_MOTO)/include CPPFLAGS += -I$(NAN_BULLET2)/include CPPFLAGS += -I../../blender diff --git a/source/gameengine/Converter/SConscript b/source/gameengine/Converter/SConscript index 3e0929e605a..05ea01c902a 100644 --- a/source/gameengine/Converter/SConscript +++ b/source/gameengine/Converter/SConscript @@ -21,11 +21,6 @@ incs += ' #source/blender/misc #source/blender/blenloader #source/blender/gpu' incs += ' #source/blender/windowmanager' incs += ' #source/blender/makesrna' -if env['WITH_BF_SOLID']: - incs += ' #source/gameengine/Physics/Sumo #source/gameengine/Physics/Sumo/Fuzzics/include' - incs += ' ' + env['BF_SOLID_INC'] - defs.append('USE_SUMO_SOLID') - incs += ' ' + env['BF_PYTHON_INC'] incs += ' ' + env['BF_BULLET_INC'] diff --git a/source/gameengine/Expressions/CMakeLists.txt b/source/gameengine/Expressions/CMakeLists.txt index e3942b46557..dffd13f64ff 100644 --- a/source/gameengine/Expressions/CMakeLists.txt +++ b/source/gameengine/Expressions/CMakeLists.txt @@ -32,6 +32,7 @@ SET(INC ../../../intern/string ../../../intern/moto/include ../../../source/gameengine/SceneGraph + ../../../source/blender/blenloader ${PYTHON_INC} ) diff --git a/source/gameengine/GamePlayer/common/Makefile b/source/gameengine/GamePlayer/common/Makefile index 84b4a4170a9..4a952856739 100644 --- a/source/gameengine/GamePlayer/common/Makefile +++ b/source/gameengine/GamePlayer/common/Makefile @@ -50,8 +50,6 @@ CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include CPPFLAGS += -I$(NAN_FUZZICS)/include CPPFLAGS += -I$(NAN_STRING)/include CPPFLAGS += -I$(NAN_MOTO)/include -CPPFLAGS += -I$(NAN_SUMO)/include -CPPFLAGS += -I$(NAN_SOLID)/include CPPFLAGS += -I$(NAN_PNG)/include CPPFLAGS += -I$(NAN_ZLIB)/include CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION) @@ -69,7 +67,6 @@ CPPFLAGS += -I../../../gameengine/Network/LoopBackNetwork CPPFLAGS += -I../../../gameengine/Rasterizer CPPFLAGS += -I../../../gameengine/SceneGraph CPPFLAGS += -I../../../gameengine/Rasterizer/RAS_OpenGLRasterizer -CPPFLAGS += -I../../../gameengine/Physics/Sumo CPPFLAGS += -I../../../gameengine/Physics/common ############################### diff --git a/source/gameengine/GamePlayer/common/SConscript b/source/gameengine/GamePlayer/common/SConscript index e96b2c5400b..f899385c841 100644 --- a/source/gameengine/GamePlayer/common/SConscript +++ b/source/gameengine/GamePlayer/common/SConscript @@ -59,11 +59,6 @@ incs = ['.', # 'unix/GPU_System.cpp'] # gp_common_env.Append ( CPPPATH = ['unix']) -if env['WITH_BF_SOLID']: - incs.append('#source/gameengine/Physics/Sumo') - incs.append('#source/gameengine/Physics/Sumo/Fuzzics/include') - incs += Split(env['BF_SOLID_INC']) - incs += Split(env['BF_PYTHON_INC']) incs += Split(env['BF_PNG_INC']) incs += Split(env['BF_ZLIB_INC']) diff --git a/source/gameengine/GamePlayer/common/unix/GPU_Engine.cpp b/source/gameengine/GamePlayer/common/unix/GPU_Engine.cpp index a5dec02c753..0ef087efbfe 100644 --- a/source/gameengine/GamePlayer/common/unix/GPU_Engine.cpp +++ b/source/gameengine/GamePlayer/common/unix/GPU_Engine.cpp @@ -44,9 +44,6 @@ #include "NG_LoopBackNetworkDeviceInterface.h" #include "SND_DeviceManager.h" #include "KX_BlenderSceneConverter.h" -#ifdef USE_SUMO_SOLID - #include "SM_Scene.h" -#endif #include "KX_KetsjiEngine.h" #include "GPC_RenderTools.h" diff --git a/source/gameengine/GamePlayer/common/unix/Makefile b/source/gameengine/GamePlayer/common/unix/Makefile index 90342c7b735..08c52ddc904 100644 --- a/source/gameengine/GamePlayer/common/unix/Makefile +++ b/source/gameengine/GamePlayer/common/unix/Makefile @@ -57,10 +57,8 @@ CPPFLAGS += -I../../../../gameengine/Rasterizer/RAS_OpenGLRasterizer CPPFLAGS += -I../../../../gameengine/SceneGraph CPPFLAGS += -I$(NAN_FUZZICS)/include -CPPFLAGS += -I$(NAN_SUMO)/include CPPFLAGS += -I$(NAN_SOUNDSYSTEM)/include CPPFLAGS += -I$(NAN_MOTO)/include -CPPFLAGS += -I$(NAN_SOLID)/include # Blender stuff CPPFLAGS += -I../../../../blender/blenkernel diff --git a/source/gameengine/GamePlayer/ghost/SConscript b/source/gameengine/GamePlayer/ghost/SConscript index 390b6f5e089..19234cb663c 100644 --- a/source/gameengine/GamePlayer/ghost/SConscript +++ b/source/gameengine/GamePlayer/ghost/SConscript @@ -41,10 +41,6 @@ incs = ['.', '#source/blender/gpu', '#extern/glew/include'] -if env['WITH_BF_SOLID']: - incs.append(['#source/gameengine/Physics/Sumo', '#source/gameengine/Physics/Sumo/Fuzzics/include']) - incs += Split(env['BF_SOLID_INC']) - incs += Split(env['BF_PYTHON_INC']) cxxflags = [] diff --git a/source/gameengine/Ketsji/KX_ClientObjectInfo.h b/source/gameengine/Ketsji/KX_ClientObjectInfo.h index 077ac96f0ac..1898dc71ef8 100644 --- a/source/gameengine/Ketsji/KX_ClientObjectInfo.h +++ b/source/gameengine/Ketsji/KX_ClientObjectInfo.h @@ -30,9 +30,6 @@ #define __KX_CLIENTOBJECT_INFO_H /* Note, the way this works with/without sumo is a bit odd */ -#ifdef USE_SUMO_SOLID -#include <SM_Object.h> -#endif //USE_SUMO_SOLID #include <list> @@ -42,9 +39,6 @@ class KX_GameObject; * Client Type and Additional Info. This structure can be use instead of a bare void* pointer, for safeness, and additional info for callbacks */ struct KX_ClientObjectInfo -#ifdef USE_SUMO_SOLID - : public SM_ClientObject -#endif { enum clienttype { STATIC, @@ -59,18 +53,12 @@ struct KX_ClientObjectInfo std::list<SCA_ISensor*> m_sensors; public: KX_ClientObjectInfo(KX_GameObject *gameobject, clienttype type = STATIC, void *auxilary_info = NULL) : -#ifdef USE_SUMO_SOLID - SM_ClientObject(), -#endif m_type(type), m_gameobject(gameobject), m_auxilary_info(auxilary_info) {} KX_ClientObjectInfo(const KX_ClientObjectInfo ©) : -#ifdef USE_SUMO_SOLID - SM_ClientObject(copy), -#endif m_type(copy.m_type), m_gameobject(copy.m_gameobject), m_auxilary_info(copy.m_auxilary_info) diff --git a/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h b/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h index 74042366bae..9d3b9cdaf74 100644 --- a/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h +++ b/source/gameengine/Ketsji/KX_ConvertPhysicsObject.h @@ -32,11 +32,8 @@ /* These are defined by the build system... */ //but the build system is broken, because it doesn't allow for 2 or more defines at once. //Please leave Sumo _AND_ Bullet enabled -//#define USE_SUMO_SOLID // scons defines this #define USE_BULLET -//#define USE_ODE - //on visual studio 7/8, always enable BULLET for now //you can have multiple physics engines running anyway, and //the scons build system doesn't really support this at the moment. @@ -148,20 +145,6 @@ struct KX_ObjectProperties } m_boundobject; }; -#ifdef USE_ODE - - -void KX_ConvertODEEngineObject(KX_GameObject* gameobj, - RAS_MeshObject* meshobj, - KX_Scene* kxscene, - struct PHY_ShapeProps* shapeprops, - struct PHY_MaterialProps* smmaterial, - struct KX_ObjectProperties* objprop); - - -#endif //USE_ODE - - void KX_ConvertDynamoObject(KX_GameObject* gameobj, RAS_MeshObject* meshobj, KX_Scene* kxscene, @@ -169,19 +152,6 @@ void KX_ConvertDynamoObject(KX_GameObject* gameobj, struct PHY_MaterialProps* smmaterial, struct KX_ObjectProperties* objprop); -#ifdef USE_SUMO_SOLID - -void KX_ConvertSumoObject( class KX_GameObject* gameobj, - class RAS_MeshObject* meshobj, - class KX_Scene* kxscene, - struct PHY_ShapeProps* shapeprops, - struct PHY_MaterialProps* smmaterial, - struct KX_ObjectProperties* objprop); - -void KX_ClearSumoSharedShapes(); -bool KX_ReInstanceShapeFromMesh(RAS_MeshObject* meshobj); - -#endif #ifdef USE_BULLET diff --git a/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp b/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp index 51c41c0686d..64b5760de28 100644 --- a/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp +++ b/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp @@ -32,7 +32,6 @@ #include "MT_assert.h" -// defines USE_ODE to choose physics engine #include "KX_ConvertPhysicsObject.h" #include "BL_DeformableGameObject.h" #include "RAS_MeshObject.h" @@ -56,597 +55,6 @@ extern "C"{ #include "BKE_DerivedMesh.h" } -#ifdef USE_ODE - -#include "KX_OdePhysicsController.h" -#include "OdePhysicsEnvironment.h" -#endif //USE_ODE - - -// USE_SUMO_SOLID is defined in headerfile KX_ConvertPhysicsObject.h -#ifdef USE_SUMO_SOLID - - -#include "SumoPhysicsEnvironment.h" -#include "KX_SumoPhysicsController.h" - - -// sumo physics specific -#include "SM_Object.h" -#include "SM_FhObject.h" -#include "SM_Scene.h" -#include "SM_ClientObjectInfo.h" - -#include "KX_SumoPhysicsController.h" - -struct KX_PhysicsInstance -{ - DT_VertexBaseHandle m_vertexbase; - RAS_DisplayArray* m_darray; - RAS_IPolyMaterial* m_material; - - KX_PhysicsInstance(DT_VertexBaseHandle vertex_base, RAS_DisplayArray *darray, RAS_IPolyMaterial* mat) - : m_vertexbase(vertex_base), - m_darray(darray), - m_material(mat) - { - } - - ~KX_PhysicsInstance() - { - DT_DeleteVertexBase(m_vertexbase); - } -}; - -static GEN_Map<GEN_HashedPtr,DT_ShapeHandle> map_gamemesh_to_sumoshape; -static GEN_Map<GEN_HashedPtr, KX_PhysicsInstance*> map_gamemesh_to_instance; - -// forward declarations -static void BL_RegisterSumoObject(KX_GameObject* gameobj,class SM_Scene* sumoScene,class SM_Object* sumoObj,const STR_String& matname,bool isDynamic,bool isActor); -static DT_ShapeHandle CreateShapeFromMesh(RAS_MeshObject* meshobj, bool polytope); - -void KX_ConvertSumoObject( KX_GameObject* gameobj, - RAS_MeshObject* meshobj, - KX_Scene* kxscene, - PHY_ShapeProps* kxshapeprops, - PHY_MaterialProps* kxmaterial, - struct KX_ObjectProperties* objprop) - - -{ - SM_ShapeProps* smprop = new SM_ShapeProps; - - smprop->m_ang_drag = kxshapeprops->m_ang_drag; - smprop->m_do_anisotropic = kxshapeprops->m_do_anisotropic; - smprop->m_do_fh = kxshapeprops->m_do_fh; - smprop->m_do_rot_fh = kxshapeprops->m_do_rot_fh ; - smprop->m_friction_scaling[0] = kxshapeprops->m_friction_scaling[0]; - smprop->m_friction_scaling[1] = kxshapeprops->m_friction_scaling[1]; - smprop->m_friction_scaling[2] = kxshapeprops->m_friction_scaling[2]; - smprop->m_inertia = MT_Vector3(1., 1., 1.) * kxshapeprops->m_inertia; - smprop->m_lin_drag = kxshapeprops->m_lin_drag; - smprop->m_mass = kxshapeprops->m_mass; - smprop->m_radius = objprop->m_radius; - - - SM_MaterialProps* smmaterial = new SM_MaterialProps; - - smmaterial->m_fh_damping = kxmaterial->m_fh_damping; - smmaterial->m_fh_distance = kxmaterial->m_fh_distance; - smmaterial->m_fh_normal = kxmaterial->m_fh_normal; - smmaterial->m_fh_spring = kxmaterial->m_fh_spring; - smmaterial->m_friction = kxmaterial->m_friction; - smmaterial->m_restitution = kxmaterial->m_restitution; - - SumoPhysicsEnvironment* sumoEnv = - (SumoPhysicsEnvironment*)kxscene->GetPhysicsEnvironment(); - - SM_Scene* sceneptr = sumoEnv->GetSumoScene(); - - SM_Object* sumoObj=NULL; - - if (objprop->m_dyna && objprop->m_isactor) - { - DT_ShapeHandle shape = NULL; - bool polytope = false; - switch (objprop->m_boundclass) - { - case KX_BOUNDBOX: - shape = DT_NewBox(objprop->m_boundobject.box.m_extends[0], - objprop->m_boundobject.box.m_extends[1], - objprop->m_boundobject.box.m_extends[2]); - smprop->m_inertia.scale(objprop->m_boundobject.box.m_extends[0]*objprop->m_boundobject.box.m_extends[0], - objprop->m_boundobject.box.m_extends[1]*objprop->m_boundobject.box.m_extends[1], - objprop->m_boundobject.box.m_extends[2]*objprop->m_boundobject.box.m_extends[2]); - smprop->m_inertia *= smprop->m_mass/MT_Vector3(objprop->m_boundobject.box.m_extends).length(); - break; - case KX_BOUNDCYLINDER: - shape = DT_NewCylinder(smprop->m_radius, objprop->m_boundobject.c.m_height); - smprop->m_inertia.scale(smprop->m_mass*smprop->m_radius*smprop->m_radius, - smprop->m_mass*smprop->m_radius*smprop->m_radius, - smprop->m_mass*objprop->m_boundobject.c.m_height*objprop->m_boundobject.c.m_height); - break; - case KX_BOUNDCONE: - shape = DT_NewCone(objprop->m_radius, objprop->m_boundobject.c.m_height); - smprop->m_inertia.scale(smprop->m_mass*smprop->m_radius*smprop->m_radius, - smprop->m_mass*smprop->m_radius*smprop->m_radius, - smprop->m_mass*objprop->m_boundobject.c.m_height*objprop->m_boundobject.c.m_height); - break; - /* Dynamic mesh objects. WARNING! slow. */ - case KX_BOUNDPOLYTOPE: - polytope = true; - // fall through - case KX_BOUNDMESH: - if (meshobj && meshobj->NumPolygons() > 0) - { - if ((shape = CreateShapeFromMesh(meshobj, polytope))) - { - // TODO: calculate proper inertia - smprop->m_inertia *= smprop->m_mass*smprop->m_radius*smprop->m_radius; - break; - } - } - /* If CreateShapeFromMesh fails, fall through and use sphere */ - default: - case KX_BOUNDSPHERE: - shape = DT_NewSphere(objprop->m_radius); - smprop->m_inertia *= smprop->m_mass*smprop->m_radius*smprop->m_radius; - break; - - } - - sumoObj = new SM_Object(shape, !objprop->m_ghost?smmaterial:NULL,smprop,NULL); - - sumoObj->setRigidBody(objprop->m_angular_rigidbody?true:false); - - BL_RegisterSumoObject(gameobj,sceneptr,sumoObj,"",true, true); - - } - else { - // non physics object - if (meshobj) - { - int numpolys = meshobj->NumPolygons(); - { - - DT_ShapeHandle complexshape=0; - bool polytope = false; - - switch (objprop->m_boundclass) - { - case KX_BOUNDBOX: - complexshape = DT_NewBox(objprop->m_boundobject.box.m_extends[0], objprop->m_boundobject.box.m_extends[1], objprop->m_boundobject.box.m_extends[2]); - break; - case KX_BOUNDSPHERE: - complexshape = DT_NewSphere(objprop->m_boundobject.c.m_radius); - break; - case KX_BOUNDCYLINDER: - complexshape = DT_NewCylinder(objprop->m_boundobject.c.m_radius, objprop->m_boundobject.c.m_height); - break; - case KX_BOUNDCONE: - complexshape = DT_NewCone(objprop->m_boundobject.c.m_radius, objprop->m_boundobject.c.m_height); - break; - case KX_BOUNDPOLYTOPE: - polytope = true; - // fall through - default: - case KX_BOUNDMESH: - if (numpolys>0) - { - complexshape = CreateShapeFromMesh(meshobj, polytope); - //std::cout << "Convert Physics Mesh: " << meshobj->GetName() << std::endl; -/* if (!complexshape) - { - // Something has to be done here - if the object has no polygons, it will not be able to have - // sensors attached to it. - DT_Vector3 pt = {0., 0., 0.}; - complexshape = DT_NewSphere(1.0); - objprop->m_ghost = evilObject = true; - } */ - } - break; - } - - if (complexshape) - { - SM_Object *dynamicParent = NULL; - - if (objprop->m_dynamic_parent) - { - // problem is how to find the dynamic parent - // in the scenegraph - KX_SumoPhysicsController* sumoctrl = - (KX_SumoPhysicsController*) - objprop->m_dynamic_parent->GetPhysicsController(); - - if (sumoctrl) - { - dynamicParent = sumoctrl->GetSumoObject(); - } - - MT_assert(dynamicParent); - } - - - sumoObj = new SM_Object(complexshape,!objprop->m_ghost?smmaterial:NULL,NULL, dynamicParent); - const STR_String& matname=meshobj->GetMaterialName(0); - - - BL_RegisterSumoObject(gameobj,sceneptr, - sumoObj, - matname, - objprop->m_dyna, - objprop->m_isactor); - } - } - } - } - - // physics object get updated here ! - - - // lazy evaluation because we might not support scaling !gameobj->UpdateTransform(); - - if (objprop->m_in_active_layer && sumoObj) - { - sceneptr->add(*sumoObj); - } - -} - - - -static void BL_RegisterSumoObject( - KX_GameObject* gameobj, - class SM_Scene* sumoScene, - class SM_Object* sumoObj, - const STR_String& matname, - bool isDynamic, - bool isActor) -{ - PHY_IMotionState* motionstate = new KX_MotionState(gameobj->GetSGNode()); - - // need easy access, not via 'node' etc. - KX_SumoPhysicsController* physicscontroller = new KX_SumoPhysicsController(sumoScene,sumoObj,motionstate,isDynamic); - gameobj->SetPhysicsController(physicscontroller,isDynamic); - - - if (!gameobj->getClientInfo()) - std::cout << "BL_RegisterSumoObject: WARNING: Object " << gameobj->GetName() << " has no client info" << std::endl; - physicscontroller->setNewClientInfo(gameobj->getClientInfo()); - - - gameobj->GetSGNode()->AddSGController(physicscontroller); - - gameobj->getClientInfo()->m_type = (isActor ? KX_ClientObjectInfo::ACTOR : KX_ClientObjectInfo::STATIC); - - // store materialname in auxinfo, needed for touchsensors - gameobj->getClientInfo()->m_auxilary_info = (matname.Length() ? (void*)(matname.ReadPtr()+2) : NULL); - - physicscontroller->SetObject(gameobj->GetSGNode()); -} - -static DT_ShapeHandle InstancePhysicsComplex(RAS_MeshObject* meshobj, RAS_DisplayArray *darray, RAS_IPolyMaterial *mat) -{ - // instance a mesh from a single vertex array & material - const RAS_TexVert *vertex_array = &darray->m_vertex[0]; - DT_VertexBaseHandle vertex_base = DT_NewVertexBase(vertex_array[0].getXYZ(), sizeof(RAS_TexVert)); - - DT_ShapeHandle shape = DT_NewComplexShape(vertex_base); - - std::vector<DT_Index> indices; - for (int p = 0; p < meshobj->NumPolygons(); p++) - { - RAS_Polygon* poly = meshobj->GetPolygon(p); - - // only add polygons that have the collisionflag set - if (poly->IsCollider()) - { - DT_Begin(); - DT_VertexIndex(poly->GetVertexOffset(0)); - DT_VertexIndex(poly->GetVertexOffset(1)); - DT_VertexIndex(poly->GetVertexOffset(2)); - DT_End(); - - // tesselate - if (poly->VertexCount() == 4) - { - DT_Begin(); - DT_VertexIndex(poly->GetVertexOffset(0)); - DT_VertexIndex(poly->GetVertexOffset(2)); - DT_VertexIndex(poly->GetVertexOffset(3)); - DT_End(); - } - } - } - - //DT_VertexIndices(indices.size(), &indices[0]); - DT_EndComplexShape(); - - map_gamemesh_to_instance.insert(GEN_HashedPtr(meshobj), new KX_PhysicsInstance(vertex_base, darray, mat)); - return shape; -} - -static DT_ShapeHandle InstancePhysicsPolytope(RAS_MeshObject* meshobj, RAS_DisplayArray *darray, RAS_IPolyMaterial *mat) -{ - // instance a mesh from a single vertex array & material - const RAS_TexVert *vertex_array = &darray->m_vertex[0]; - DT_VertexBaseHandle vertex_base = DT_NewVertexBase(vertex_array[0].getXYZ(), sizeof(RAS_TexVert)); - - std::vector<DT_Index> indices; - for (int p = 0; p < meshobj->NumPolygons(); p++) - { - RAS_Polygon* poly = meshobj->GetPolygon(p); - - // only add polygons that have the collisionflag set - if (poly->IsCollider()) - { - indices.push_back(poly->GetVertexOffset(0)); - indices.push_back(poly->GetVertexOffset(1)); - indices.push_back(poly->GetVertexOffset(2)); - - if (poly->VertexCount() == 4) - indices.push_back(poly->GetVertexOffset(3)); - } - } - - DT_ShapeHandle shape = DT_NewPolytope(vertex_base); - DT_VertexIndices(indices.size(), &indices[0]); - DT_EndPolytope(); - - map_gamemesh_to_instance.insert(GEN_HashedPtr(meshobj), new KX_PhysicsInstance(vertex_base, darray, mat)); - return shape; -} - -// This will have to be a method in a class somewhere... -// Update SOLID with a changed physics mesh. -// not used... yet. -bool KX_ReInstanceShapeFromMesh(RAS_MeshObject* meshobj) -{ - KX_PhysicsInstance *instance = *map_gamemesh_to_instance[GEN_HashedPtr(meshobj)]; - if (instance) - { - const RAS_TexVert *vertex_array = &instance->m_darray->m_vertex[0]; - DT_ChangeVertexBase(instance->m_vertexbase, vertex_array[0].getXYZ()); - return true; - } - return false; -} - -static DT_ShapeHandle CreateShapeFromMesh(RAS_MeshObject* meshobj, bool polytope) -{ - - DT_ShapeHandle *shapeptr = map_gamemesh_to_sumoshape[GEN_HashedPtr(meshobj)]; - // Mesh has already been converted: reuse - if (shapeptr) - { - return *shapeptr; - } - - // Mesh has no polygons! - int numpolys = meshobj->NumPolygons(); - if (!numpolys) - { - return NULL; - } - - // Count the number of collision polygons and check they all come from the same - // vertex array - int numvalidpolys = 0; - RAS_DisplayArray *darray = NULL; - RAS_IPolyMaterial *poly_material = NULL; - bool reinstance = true; - - for (int p=0; p<numpolys; p++) - { - RAS_Polygon* poly = meshobj->GetPolygon(p); - - // only add polygons that have the collisionflag set - if (poly->IsCollider()) - { - // check polygon is from the same vertex array - if (poly->GetDisplayArray() != darray) - { - if (darray == NULL) - darray = poly->GetDisplayArray(); - else - { - reinstance = false; - darray = NULL; - } - } - - // check poly is from the same material - if (poly->GetMaterial()->GetPolyMaterial() != poly_material) - { - if (poly_material) - { - reinstance = false; - poly_material = NULL; - } - else - poly_material = poly->GetMaterial()->GetPolyMaterial(); - } - - // count the number of collision polys - numvalidpolys++; - - // We have one collision poly, and we can't reinstance, so we - // might as well break here. - if (!reinstance) - break; - } - } - - // No collision polygons - if (numvalidpolys < 1) - return NULL; - - DT_ShapeHandle shape; - if (reinstance) - { - if (polytope) - shape = InstancePhysicsPolytope(meshobj, darray, poly_material); - else - shape = InstancePhysicsComplex(meshobj, darray, poly_material); - } - else - { - if (polytope) - { - std::cout << "CreateShapeFromMesh: " << meshobj->GetName() << " is not suitable for polytope." << std::endl; - if (!poly_material) - std::cout << " Check mesh materials." << std::endl; - if (darray == NULL) - std::cout << " Check number of vertices." << std::endl; - } - - shape = DT_NewComplexShape(NULL); - - numvalidpolys = 0; - - for (int p2=0; p2<numpolys; p2++) - { - RAS_Polygon* poly = meshobj->GetPolygon(p2); - - // only add polygons that have the collisionflag set - if (poly->IsCollider()) - { /* We have to tesselate here because SOLID can only raycast triangles */ - DT_Begin(); - /* V1, V2, V3 */ - DT_Vertex(poly->GetVertex(2)->getXYZ()); - DT_Vertex(poly->GetVertex(1)->getXYZ()); - DT_Vertex(poly->GetVertex(0)->getXYZ()); - - numvalidpolys++; - DT_End(); - - if (poly->VertexCount() == 4) - { - DT_Begin(); - /* V1, V3, V4 */ - DT_Vertex(poly->GetVertex(3)->getXYZ()); - DT_Vertex(poly->GetVertex(2)->getXYZ()); - DT_Vertex(poly->GetVertex(0)->getXYZ()); - - numvalidpolys++; - DT_End(); - } - - } - } - - DT_EndComplexShape(); - } - - if (numvalidpolys > 0) - { - map_gamemesh_to_sumoshape.insert(GEN_HashedPtr(meshobj),shape); - return shape; - } - - delete shape; - return NULL; -} - -void KX_ClearSumoSharedShapes() -{ - int numshapes = map_gamemesh_to_sumoshape.size(); - int i; - for (i=0;i<numshapes ;i++) - { - DT_ShapeHandle shape = *map_gamemesh_to_sumoshape.at(i); - DT_DeleteShape(shape); - } - - map_gamemesh_to_sumoshape.clear(); - - for (i=0; i < map_gamemesh_to_instance.size(); i++) - delete *map_gamemesh_to_instance.at(i); - - map_gamemesh_to_instance.clear(); -} - - - - - -#endif //USE_SUMO_SOLID - - -#ifdef USE_ODE - -void KX_ConvertODEEngineObject(KX_GameObject* gameobj, - RAS_MeshObject* meshobj, - KX_Scene* kxscene, - struct PHY_ShapeProps* shapeprops, - struct PHY_MaterialProps* smmaterial, - struct KX_ObjectProperties* objprop) -{ - - // not yet, future extension :) - bool dyna=objprop->m_dyna; - bool fullRigidBody= ( objprop->m_dyna && objprop->m_angular_rigidbody) != 0; - bool phantom = objprop->m_ghost; - class PHY_IMotionState* motionstate = new KX_MotionState(gameobj->GetSGNode()); - - class ODEPhysicsEnvironment* odeEnv = - (ODEPhysicsEnvironment*)kxscene->GetPhysicsEnvironment(); - - dxSpace* space = odeEnv->GetOdeSpace(); - dxWorld* world = odeEnv->GetOdeWorld(); - - bool isSphere = false; - - switch (objprop->m_boundclass) - { - case KX_BOUNDBOX: - { - - KX_OdePhysicsController* physicscontroller = - new KX_OdePhysicsController( - dyna, - fullRigidBody, - phantom, - motionstate, - space, - world, - shapeprops->m_mass, - smmaterial->m_friction, - smmaterial->m_restitution, - isSphere, - objprop->m_boundobject.box.m_center, - objprop->m_boundobject.box.m_extends, - objprop->m_boundobject.c.m_radius - ); - - gameobj->SetPhysicsController(physicscontroller); - physicscontroller->setNewClientInfo(gameobj->getClientInfo()); - gameobj->GetSGNode()->AddSGController(physicscontroller); - - bool isActor = objprop->m_isactor; - STR_String materialname; - if (meshobj) - materialname = meshobj->GetMaterialName(0); - - const char* matname = materialname.ReadPtr(); - - - physicscontroller->SetObject(gameobj->GetSGNode()); - - break; - } - default: - { - } - }; - -} - - -#endif // USE_ODE - - #ifdef USE_BULLET #include "CcdPhysicsEnvironment.h" diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp index a43ea59220b..1a417110c08 100644 --- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp +++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp @@ -61,10 +61,6 @@ #include "KX_PyConstraintBinding.h" #include "PHY_IPhysicsEnvironment.h" -#ifdef USE_SUMO_SOLID -#include "SumoPhysicsEnvironment.h" -#endif - #include "SND_Scene.h" #include "SND_IAudioDevice.h" diff --git a/source/gameengine/Ketsji/KX_OdePhysicsController.cpp b/source/gameengine/Ketsji/KX_OdePhysicsController.cpp deleted file mode 100644 index dc6990267d4..00000000000 --- a/source/gameengine/Ketsji/KX_OdePhysicsController.cpp +++ /dev/null @@ -1,257 +0,0 @@ -/** - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * The contents of this file may be used under the terms of either the GNU - * General Public License Version 2 or later (the "GPL", see - * http://www.gnu.org/licenses/gpl.html ), or the Blender License 1.0 or - * later (the "BL", see http://www.blender.org/BL/ ) which has to be - * bought from the Blender Foundation to become active, in which case the - * above mentioned GPL option does not apply. - * - * The Original Code is Copyright (C) 2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ -#include "KX_ConvertPhysicsObject.h" - -#ifdef USE_ODE - -#include "KX_OdePhysicsController.h" -#include "KX_GameObject.h" -#include "KX_MotionState.h" - -#include "MT_assert.h" - -#include "PHY_IPhysicsEnvironment.h" - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -KX_OdePhysicsController::KX_OdePhysicsController( - bool dyna, - bool fullRigidBody, - bool phantom, - class PHY_IMotionState* motionstate, - struct dxSpace* space, - struct dxWorld* world, - float mass, - float friction, - float restitution, - bool implicitsphere, - float center[3], - float extends[3], - float radius - ) -: KX_IPhysicsController(dyna,false,(PHY_IPhysicsController*)this), -ODEPhysicsController( -dyna,fullRigidBody,phantom,motionstate, -space,world,mass,friction,restitution, -implicitsphere,center,extends,radius) -{ -}; - - -bool KX_OdePhysicsController::Update(double time) -{ - return SynchronizeMotionStates(time); -} - -void KX_OdePhysicsController::SetObject (SG_IObject* object) -{ - SG_Controller::SetObject(object); - - // cheating here... - KX_GameObject* gameobj = (KX_GameObject*) object->GetSGClientObject(); - gameobj->SetPhysicsController(this); - -} - - - -void KX_OdePhysicsController::applyImpulse(const MT_Point3& attach, const MT_Vector3& impulse) -{ - ODEPhysicsController::applyImpulse(attach[0],attach[1],attach[2],impulse[0],impulse[1],impulse[2]); -} - - - -void KX_OdePhysicsController::RelativeTranslate(const MT_Vector3& dloc,bool local) -{ - ODEPhysicsController::RelativeTranslate(dloc[0],dloc[1],dloc[2],local); - -} -void KX_OdePhysicsController::RelativeRotate(const MT_Matrix3x3& drot,bool local) -{ - double oldmat[12]; - drot.getValue(oldmat); - float newmat[9]; - float *m = &newmat[0]; - double *orgm = &oldmat[0]; - - *m++ = *orgm++;*m++ = *orgm++;*m++ = *orgm++;orgm++; - *m++ = *orgm++;*m++ = *orgm++;*m++ = *orgm++;orgm++; - *m++ = *orgm++;*m++ = *orgm++;*m++ = *orgm++;orgm++; - - ODEPhysicsController::RelativeRotate(newmat,local); - -} - -void KX_OdePhysicsController::ApplyTorque(const MT_Vector3& torque,bool local) -{ - ODEPhysicsController::ApplyTorque(torque[0],torque[1],torque[2],local); - -} -void KX_OdePhysicsController::ApplyForce(const MT_Vector3& force,bool local) -{ - ODEPhysicsController::ApplyForce(force[0],force[1],force[2],local); - -} -MT_Vector3 KX_OdePhysicsController::GetLinearVelocity() -{ - return MT_Vector3(0,0,0); -} - -MT_Vector3 KX_OdePhysicsController::GetVelocity(const MT_Point3& pos) -{ - return MT_Vector3(0,0,0); -} - -void KX_OdePhysicsController::SetAngularVelocity(const MT_Vector3& ang_vel,bool local) -{ - -} -void KX_OdePhysicsController::SetLinearVelocity(const MT_Vector3& lin_vel,bool local) -{ - ODEPhysicsController::SetLinearVelocity(lin_vel[0],lin_vel[1],lin_vel[2],local); -} - -void KX_OdePhysicsController::setOrientation(const MT_Matrix3x3& rot) -{ - MT_Quaternion orn = rot.getRotation(); - ODEPhysicsController::setOrientation(orn[0],orn[1],orn[2],orn[3]); -} - -void KX_OdePhysicsController::getOrientation(MT_Quaternion& orn) -{ - float florn[4]; - florn[0]=orn[0]; - florn[1]=orn[1]; - florn[2]=orn[2]; - florn[3]=orn[3]; - ODEPhysicsController::getOrientation(florn[0],florn[1],florn[2],florn[3]); - orn[0] = florn[0]; - orn[1] = florn[1]; - orn[2] = florn[2]; - orn[3] = florn[3]; - - -} - -void KX_OdePhysicsController::setPosition(const MT_Point3& pos) -{ - ODEPhysicsController::setPosition(pos[0],pos[1],pos[2]); -} - -void KX_OdePhysicsController::setScaling(const MT_Vector3& scaling) -{ -} - -MT_Scalar KX_OdePhysicsController::GetMass() -{ - return ODEPhysicsController::getMass(); -} - -MT_Scalar KX_OdePhysicsController::GetRadius() -{ - return MT_Scalar(0.f); -} - -MT_Vector3 KX_OdePhysicsController::getReactionForce() -{ - return MT_Vector3(0,0,0); -} -void KX_OdePhysicsController::setRigidBody(bool rigid) -{ - -} - -void KX_OdePhysicsController::SuspendDynamics(bool) -{ - ODEPhysicsController::SuspendDynamics(); -} -void KX_OdePhysicsController::RestoreDynamics() -{ - ODEPhysicsController::RestoreDynamics(); -} - - -SG_Controller* KX_OdePhysicsController::GetReplica(class SG_Node* destnode) -{ - PHY_IMotionState* motionstate = new KX_MotionState(destnode); - KX_OdePhysicsController* copyctrl = new KX_OdePhysicsController(*this); - - // nlin: copied from KX_SumoPhysicsController.cpp. Not 100% sure what this does.... - // furthermore, the parentctrl is not used in ODEPhysicsController::PostProcessReplica, but - // maybe it can/should be used in the future... - - // begin copy block ------------------------------------------------------------------ - - //parentcontroller is here be able to avoid collisions between parent/child - - PHY_IPhysicsController* parentctrl = NULL; - - if (destnode != destnode->GetRootSGParent()) - { - KX_GameObject* clientgameobj = (KX_GameObject*) destnode->GetRootSGParent()->GetSGClientObject(); - if (clientgameobj) - { - parentctrl = (KX_OdePhysicsController*)clientgameobj->GetPhysicsController(); - } else - { - // it could be a false node, try the children - NodeList::const_iterator childit; - for ( - childit = destnode->GetSGChildren().begin(); - childit!= destnode->GetSGChildren().end(); - ++childit - ) { - KX_GameObject* clientgameobj = static_cast<KX_GameObject*>( (*childit)->GetSGClientObject()); - if (clientgameobj) - { - parentctrl = (KX_OdePhysicsController*)clientgameobj->GetPhysicsController(); - } - } - } - } - // end copy block ------------------------------------------------------------------ - - copyctrl->PostProcessReplica(motionstate, this); - - return copyctrl; - -} - -void KX_OdePhysicsController::resolveCombinedVelocities(float linvelX,float linvelY,float linvelZ,float angVelX,float angVelY,float angVelZ) -{ -} - - -void KX_OdePhysicsController::SetSumoTransform(bool nondynaonly) -{ - -} - // todo: remove next line ! -void KX_OdePhysicsController::SetSimulatedTime(double time) -{ - -} - -#endif //USE_ODE diff --git a/source/gameengine/Ketsji/KX_OdePhysicsController.h b/source/gameengine/Ketsji/KX_OdePhysicsController.h deleted file mode 100644 index 8c3974c38a3..00000000000 --- a/source/gameengine/Ketsji/KX_OdePhysicsController.h +++ /dev/null @@ -1,109 +0,0 @@ -/** - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * The contents of this file may be used under the terms of either the GNU - * General Public License Version 2 or later (the "GPL", see - * http://www.gnu.org/licenses/gpl.html ), or the Blender License 1.0 or - * later (the "BL", see http://www.blender.org/BL/ ) which has to be - * bought from the Blender Foundation to become active, in which case the - * above mentioned GPL option does not apply. - * - * The Original Code is Copyright (C) 2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ -#ifndef __KX_ODEPHYSICSCONTROLLER_H -#define __KX_ODEPHYSICSCONTROLLER_H - -#include "KX_IPhysicsController.h" -#include "OdePhysicsController.h" - -/** - Physics Controller, a special kind of Scene Graph Transformation Controller. - It get's callbacks from Physics in case a transformation change took place. - Each time the scene graph get's updated, the controller get's a chance - in the 'Update' method to reflect changed. -*/ - -class KX_OdePhysicsController : public KX_IPhysicsController, public ODEPhysicsController - -{ - -public: - KX_OdePhysicsController( - bool dyna, - bool fullRigidBody, - bool phantom, - class PHY_IMotionState* motionstate, - struct dxSpace* space, - struct dxWorld* world, - float mass, - float friction, - float restitution, - bool implicitsphere, - float center[3], - float extends[3], - float radius); - - virtual ~KX_OdePhysicsController() {}; - - virtual void applyImpulse(const MT_Point3& attach, const MT_Vector3& impulse); - virtual void SetObject (SG_IObject* object); - - virtual void RelativeTranslate(const MT_Vector3& dloc,bool local); - virtual void RelativeRotate(const MT_Matrix3x3& drot,bool local); - virtual void ApplyTorque(const MT_Vector3& torque,bool local); - virtual void ApplyForce(const MT_Vector3& force,bool local); - virtual MT_Vector3 GetLinearVelocity(); - virtual MT_Vector3 GetVelocity(const MT_Point3& pos); - virtual void SetAngularVelocity(const MT_Vector3& ang_vel,bool local); - virtual void SetLinearVelocity(const MT_Vector3& lin_vel,bool local); - virtual void resolveCombinedVelocities(float linvelX,float linvelY,float linvelZ,float angVelX,float angVelY,float angVelZ); - virtual void getOrientation(MT_Quaternion& orn); - virtual void setOrientation(const MT_Matrix3x3& orn); - virtual void setPosition(const MT_Point3& pos); - virtual void setScaling(const MT_Vector3& scaling); - virtual void SetTransform() {} - virtual MT_Scalar GetMass(); - virtual MT_Vector3 getReactionForce(); - virtual void setRigidBody(bool rigid); - virtual void AddCompoundChild(KX_IPhysicsController* child) { } - virtual void RemoveCompoundChild(KX_IPhysicsController* child) { } - - virtual void SuspendDynamics(bool); - virtual void RestoreDynamics(); - virtual MT_Scalar GetRadius(); - - virtual SG_Controller* GetReplica(class SG_Node* destnode); - - virtual float GetLinVelocityMin() { return ODEPhysicsController::GetLinVelocityMin(); } - virtual void SetLinVelocityMin(float val) { ODEPhysicsController::SetLinVelocityMin(val); } - virtual float GetLinVelocityMax() { return ODEPhysicsController::GetLinVelocityMax(); } - virtual void SetLinVelocityMax(float val) { ODEPhysicsController::SetLinVelocityMax(val); } - - virtual void SetSumoTransform(bool nondynaonly); - // todo: remove next line ! - virtual void SetSimulatedTime(double time); - - // call from scene graph to update - virtual bool Update(double time); - - void - SetOption( - int option, - int value - ){ - // intentionally empty - }; - -}; - -#endif //__KX_ODEPHYSICSCONTROLLER_H - diff --git a/source/gameengine/Ketsji/KX_SumoPhysicsController.cpp b/source/gameengine/Ketsji/KX_SumoPhysicsController.cpp deleted file mode 100644 index fc053f05e63..00000000000 --- a/source/gameengine/Ketsji/KX_SumoPhysicsController.cpp +++ /dev/null @@ -1,244 +0,0 @@ -#include "KX_ConvertPhysicsObject.h" - -#ifdef USE_SUMO_SOLID - -#ifdef WIN32 -#pragma warning (disable : 4786) -#endif - -#include "KX_SumoPhysicsController.h" -#include "SG_Spatial.h" -#include "SM_Scene.h" -#include "KX_GameObject.h" -#include "KX_MotionState.h" -#include "KX_ClientObjectInfo.h" - -#include "PHY_IPhysicsEnvironment.h" - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -void KX_SumoPhysicsController::applyImpulse(const MT_Point3& attach, const MT_Vector3& impulse) -{ - SumoPhysicsController::applyImpulse(attach[0],attach[1],attach[2],impulse[0],impulse[1],impulse[2]); -} -void KX_SumoPhysicsController::RelativeTranslate(const MT_Vector3& dloc,bool local) -{ - SumoPhysicsController::RelativeTranslate(dloc[0],dloc[1],dloc[2],local); - -} -void KX_SumoPhysicsController::RelativeRotate(const MT_Matrix3x3& drot,bool local) -{ - float oldmat[12]; - drot.getValue(oldmat); -/* float newmat[9]; - float *m = &newmat[0]; - double *orgm = &oldmat[0]; - - *m++ = *orgm++;*m++ = *orgm++;*m++ = *orgm++;orgm++; - *m++ = *orgm++;*m++ = *orgm++;*m++ = *orgm++;orgm++; - *m++ = *orgm++;*m++ = *orgm++;*m++ = *orgm++;orgm++; */ - - SumoPhysicsController::RelativeRotate(oldmat,local); -} - -void KX_SumoPhysicsController::SetLinearVelocity(const MT_Vector3& lin_vel,bool local) -{ - SumoPhysicsController::SetLinearVelocity(lin_vel[0],lin_vel[1],lin_vel[2],local); - -} - -void KX_SumoPhysicsController::SetAngularVelocity(const MT_Vector3& ang_vel,bool local) -{ - SumoPhysicsController::SetAngularVelocity(ang_vel[0],ang_vel[1],ang_vel[2],local); -} - -MT_Vector3 KX_SumoPhysicsController::GetVelocity(const MT_Point3& pos) -{ - - float linvel[3]; - SumoPhysicsController::GetVelocity(pos[0],pos[1],pos[2],linvel[0],linvel[1],linvel[2]); - - return MT_Vector3 (linvel); -} - -MT_Vector3 KX_SumoPhysicsController::GetLinearVelocity() -{ - return GetVelocity(MT_Point3(0,0,0)); - -} - -void KX_SumoPhysicsController::resolveCombinedVelocities(float linvelX,float linvelY,float linvelZ,float angVelX,float angVelY,float angVelZ) -{ - SumoPhysicsController::resolveCombinedVelocities(linvelX,linvelY,linvelZ,angVelX,angVelY,angVelZ); -} - -void KX_SumoPhysicsController::ApplyTorque(const MT_Vector3& torque,bool local) -{ - SumoPhysicsController::ApplyTorque(torque[0],torque[1],torque[2],local); - -} - -void KX_SumoPhysicsController::ApplyForce(const MT_Vector3& force,bool local) -{ - SumoPhysicsController::ApplyForce(force[0],force[1],force[2],local); -} - -bool KX_SumoPhysicsController::Update(double time) -{ - return SynchronizeMotionStates(time); -} - -void KX_SumoPhysicsController::SetSimulatedTime(double time) -{ - -} - -void KX_SumoPhysicsController::SetSumoTransform(bool nondynaonly) -{ - SumoPhysicsController::setSumoTransform(nondynaonly); - -} - -void KX_SumoPhysicsController::SuspendDynamics(bool) -{ - SumoPhysicsController::SuspendDynamics(); -} - -void KX_SumoPhysicsController::RestoreDynamics() -{ - SumoPhysicsController::RestoreDynamics(); -} - -SG_Controller* KX_SumoPhysicsController::GetReplica(SG_Node* destnode) -{ - - PHY_IMotionState* motionstate = new KX_MotionState(destnode); - - KX_SumoPhysicsController* physicsreplica = new KX_SumoPhysicsController(*this); - - //parentcontroller is here be able to avoid collisions between parent/child - - PHY_IPhysicsController* parentctrl = NULL; - - if (destnode != destnode->GetRootSGParent()) - { - KX_GameObject* clientgameobj = (KX_GameObject*) destnode->GetRootSGParent()->GetSGClientObject(); - if (clientgameobj) - { - parentctrl = (KX_SumoPhysicsController*)clientgameobj->GetPhysicsController(); - } else - { - // it could be a false node, try the children - NodeList::const_iterator childit; - for ( - childit = destnode->GetSGChildren().begin(); - childit!= destnode->GetSGChildren().end(); - ++childit - ) { - KX_GameObject *clientgameobj = static_cast<KX_GameObject*>( (*childit)->GetSGClientObject()); - if (clientgameobj) - { - parentctrl = (KX_SumoPhysicsController*)clientgameobj->GetPhysicsController(); - } - } - } - } - - physicsreplica->PostProcessReplica(motionstate,parentctrl); - - return physicsreplica; -} - - -void KX_SumoPhysicsController::SetObject (SG_IObject* object) -{ - SG_Controller::SetObject(object); - - // cheating here... -//should not be necessary, is it for duplicates ? - -KX_GameObject* gameobj = (KX_GameObject*) object->GetSGClientObject(); -gameobj->SetPhysicsController(this,gameobj->IsDynamic()); -GetSumoObject()->setClientObject(gameobj->getClientInfo()); -} - -void KX_SumoPhysicsController::setMargin(float collisionMargin) -{ - SumoPhysicsController::SetMargin(collisionMargin); -} - - -void KX_SumoPhysicsController::setOrientation(const MT_Matrix3x3& rot) -{ - MT_Quaternion orn = rot.getRotation(); - SumoPhysicsController::setOrientation( - orn[0],orn[1],orn[2],orn[3]); - -} -void KX_SumoPhysicsController::getOrientation(MT_Quaternion& orn) -{ - - float quat[4]; - - SumoPhysicsController::getOrientation(quat[0],quat[1],quat[2],quat[3]); - - orn = MT_Quaternion(quat); - -} - -void KX_SumoPhysicsController::setPosition(const MT_Point3& pos) -{ - SumoPhysicsController::setPosition(pos[0],pos[1],pos[2]); - -} - -void KX_SumoPhysicsController::setScaling(const MT_Vector3& scaling) -{ - SumoPhysicsController::setScaling(scaling[0],scaling[1],scaling[2]); - -} - -MT_Scalar KX_SumoPhysicsController::GetMass() -{ - return SumoPhysicsController::getMass(); -} - -void KX_SumoPhysicsController::SetMass(MT_Scalar newmass) -{ -} - -MT_Vector3 KX_SumoPhysicsController::GetLocalInertia() -{ - return MT_Vector3(0.f, 0.f, 0.f); // \todo -} - -MT_Scalar KX_SumoPhysicsController::GetRadius() -{ - return SumoPhysicsController::GetRadius(); -} - -MT_Vector3 KX_SumoPhysicsController::getReactionForce() -{ - float force[3]; - SumoPhysicsController::getReactionForce(force[0],force[1],force[2]); - return MT_Vector3(force); - -} - -void KX_SumoPhysicsController::setRigidBody(bool rigid) -{ - SumoPhysicsController::setRigidBody(rigid); - -} - - -KX_SumoPhysicsController::~KX_SumoPhysicsController() -{ - - -} - - -#endif//USE_SUMO_SOLID diff --git a/source/gameengine/Ketsji/KX_SumoPhysicsController.h b/source/gameengine/Ketsji/KX_SumoPhysicsController.h deleted file mode 100644 index 278994c6ae7..00000000000 --- a/source/gameengine/Ketsji/KX_SumoPhysicsController.h +++ /dev/null @@ -1,122 +0,0 @@ -/** - * $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 ***** - */ -#ifndef __KX_SUMOPHYSICSCONTROLLER_H -#define __KX_SUMOPHYSICSCONTROLLER_H - -#include "PHY_IPhysicsController.h" - -/** - Physics Controller, a special kind of Scene Graph Transformation Controller. - It get's callbacks from Sumo in case a transformation change took place. - Each time the scene graph get's updated, the controller get's a chance - in the 'Update' method to reflect changed. -*/ - -#include "SumoPhysicsController.h" -#include "KX_IPhysicsController.h" - -class KX_SumoPhysicsController : public KX_IPhysicsController, - public SumoPhysicsController - -{ - - -public: - KX_SumoPhysicsController( - class SM_Scene* sumoScene, - class SM_Object* sumoObj, - class PHY_IMotionState* motionstate - ,bool dyna) - : KX_IPhysicsController(dyna,false,false,NULL) , - SumoPhysicsController(sumoScene,/*solidscene,*/sumoObj,motionstate,dyna) - { - }; - virtual ~KX_SumoPhysicsController(); - - void applyImpulse(const MT_Point3& attach, const MT_Vector3& impulse); - virtual void SetObject (SG_IObject* object); - virtual void setMargin (float collisionMargin); - - void RelativeTranslate(const MT_Vector3& dloc,bool local); - void RelativeRotate(const MT_Matrix3x3& drot,bool local); - void ApplyTorque(const MT_Vector3& torque,bool local); - void ApplyForce(const MT_Vector3& force,bool local); - MT_Vector3 GetLinearVelocity(); - MT_Vector3 GetAngularVelocity() // to keep compiler happy - { return MT_Vector3(0.0,0.0,0.0); } - MT_Vector3 GetVelocity(const MT_Point3& pos); - void SetAngularVelocity(const MT_Vector3& ang_vel,bool local); - void SetLinearVelocity(const MT_Vector3& lin_vel,bool local); - void resolveCombinedVelocities(float linvelX,float linvelY,float linvelZ,float angVelX,float angVelY,float angVelZ); - - - void SuspendDynamics(bool); - void RestoreDynamics(); - virtual void AddCompoundChild(KX_IPhysicsController* child) { } - virtual void RemoveCompoundChild(KX_IPhysicsController* child) { } - - virtual void getOrientation(MT_Quaternion& orn); - virtual void setOrientation(const MT_Matrix3x3& orn); - virtual void SetTransform() {} - - virtual void setPosition(const MT_Point3& pos); - virtual void setScaling(const MT_Vector3& scaling); - virtual MT_Scalar GetMass(); - virtual void SetMass(MT_Scalar newmass); - virtual MT_Vector3 GetLocalInertia(); - virtual MT_Scalar GetRadius(); - virtual MT_Vector3 getReactionForce(); - virtual void setRigidBody(bool rigid); - - virtual float GetLinVelocityMin() { return SumoPhysicsController::GetLinVelocityMin(); } - virtual void SetLinVelocityMin(float val) { SumoPhysicsController::SetLinVelocityMin(val); } - virtual float GetLinVelocityMax() { return SumoPhysicsController::GetLinVelocityMax(); } - virtual void SetLinVelocityMax(float val) { SumoPhysicsController::SetLinVelocityMax(val); } - - virtual SG_Controller* GetReplica(class SG_Node* destnode); - - - void SetSumoTransform(bool nondynaonly); - // todo: remove next line ! - virtual void SetSimulatedTime(double time); - - // call from scene graph to update - virtual bool Update(double time); - - void - SetOption( - int option, - int value - ){ - // intentionally empty - }; -}; - -#endif //__KX_SUMOPHYSICSCONTROLLER_H - diff --git a/source/gameengine/Ketsji/Makefile b/source/gameengine/Ketsji/Makefile index 59b3ff178fb..f57349b7138 100644 --- a/source/gameengine/Ketsji/Makefile +++ b/source/gameengine/Ketsji/Makefile @@ -44,7 +44,7 @@ CPPFLAGS += -I../../blender/python CPPFLAGS += -I../../blender/python/generic CPPFLAGS += -I$(NAN_STRING)/include CPPFLAGS += -I$(NAN_SOUNDSYSTEM)/include -CPPFLAGS += -I$(NAN_FUZZICS)/include -I$(NAN_SUMO) -I$(NAN_MOTO)/include +CPPFLAGS += -I$(NAN_FUZZICS)/include -I$(NAN_MOTO)/include CPPFLAGS += -I$(NAN_SOLID)/include CPPFLAGS += -I$(NAN_BULLET2)/include CPPFLAGS += -I../Rasterizer/RAS_OpenGLRasterizer @@ -54,8 +54,6 @@ CPPFLAGS += -I../../kernel/gen_system CPPFLAGS += -I../Network -IKXNetwork CPPFLAGS += -I../Physics/common CPPFLAGS += -I../Physics/Dummy -CPPFLAGS += -I../Physics/Sumo -CPPFLAGS += -I../Physics/BlOde CPPFLAGS += -I../Physics/Bullet CPPFLAGS += -I. CPPFLAGS += -I../Converter diff --git a/source/gameengine/Ketsji/SConscript b/source/gameengine/Ketsji/SConscript index 49dbacc8916..b09267b79ff 100644 --- a/source/gameengine/Ketsji/SConscript +++ b/source/gameengine/Ketsji/SConscript @@ -18,16 +18,9 @@ incs += ' #source/blender/blenkernel #source/blender #source/blender/editors/inc incs += ' #source/blender/makesdna #source/blender/python #source/gameengine/Rasterizer' incs += ' #source/gameengine/GameLogic #source/gameengine/Expressions #source/gameengine/Network' incs += ' #source/gameengine/SceneGraph #source/gameengine/Physics/common #source/gameengine/Physics/Bullet' -incs += ' #source/gameengine/Physics/BlOde #source/gameengine/Physics/Dummy' +incs += ' #source/gameengine/Physics/Dummy' incs += ' #source/blender/misc #source/blender/blenloader #extern/glew/include #source/blender/gpu' -if env['WITH_BF_SOLID']: - incs += ' #source/gameengine/Physics/Sumo #source/gameengine/Physics/Sumo/include' - incs += ' #source/gameengine/Physics/Sumo/Fuzzics/include #source/gameengine/Network/LoopBackNetwork' - incs += ' ' + env['BF_SOLID_INC'] - defs += ' USE_SUMO_SOLID' - - incs += ' ' + env['BF_PYTHON_INC'] incs += ' ' + env['BF_BULLET_INC'] incs += ' ' + env['BF_OPENGL_INC'] diff --git a/source/gameengine/Physics/BlOde/Makefile b/source/gameengine/Physics/BlOde/Makefile deleted file mode 100644 index 1fbbf198377..00000000000 --- a/source/gameengine/Physics/BlOde/Makefile +++ /dev/null @@ -1,48 +0,0 @@ -# -# $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 ***** -# -# - -LIBNAME = blode -DIR = $(OCGDIR)/gameengine/blphys/$(LIBNAME) - -include nan_compile.mk - -CCFLAGS += $(LEVEL_1_CPP_WARNINGS) - -CPPFLAGS += -I$(OPENGL_HEADERS) -CPPFLAGS += -I$(NAN_STRING)/include -CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION) - -CPPFLAGS += -I$(NAN_FUZZICS)/include -I$(NAN_SUMO)/include -I$(NAN_MOTO)/include -CPPFLAGS += -I$(NAN_ODE)/include -CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include -CPPFLAGS += -I../../Physics/common -CPPFLAGS += -I../../Physics/Dummy -# nlin: fix this, should put in NAN_ODE dir -#CPPFLAGS += -I./ode/ode/include diff --git a/source/gameengine/Physics/BlOde/OdePhysicsController.cpp b/source/gameengine/Physics/BlOde/OdePhysicsController.cpp deleted file mode 100644 index 5efd0994311..00000000000 --- a/source/gameengine/Physics/BlOde/OdePhysicsController.cpp +++ /dev/null @@ -1,625 +0,0 @@ -/** - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * The contents of this file may be used under the terms of either the GNU - * General Public License Version 2 or later (the "GPL", see - * http://www.gnu.org/licenses/gpl.html ), or the Blender License 1.0 or - * later (the "BL", see http://www.blender.org/BL/ ) which has to be - * bought from the Blender Foundation to become active, in which case the - * above mentioned GPL option does not apply. - * - * The Original Code is Copyright (C) 2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ - -#define USE_ODE -#ifdef USE_ODE - -#include "OdePhysicsController.h" -#include "PHY_IMotionState.h" - -#include <ode/ode.h> - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -/////////////////////////////////////////////////////////////////////////// -// -// general to-do list for ODE physics. This is maintained in doxygen format. -// -/// \todo determine assignment time for bounding spheres. -/// -/// it appears you have to select "sphere" for bounding volume AND "draw bounds" -/// in order for a bounding sphere to be generated. otherwise a box is generated. -/// determine exactly when and how the bounding volumes are generated and make -/// this consistent. -/// } -/// -/// \todo bounding sphere size incorrect -/// -/// it appears NOT to use the size of the shown bounding sphere (button "draw bounds"). -/// it appears instead to use the size of the "size" dynamic parameter in the -/// gamebuttons but this "size" draws an incorrectly-sized circle on screen for the -/// bounding sphere (leftover skewed size calculation from sumo?) so figure out WHERE -/// its getting the radius from. -/// -/// \todo ODE collisions must fire collision actuator -/// -/// See OdePhysicsEnvironment::OdeNearCallback. If a sensor was created to check -/// for the presence of this collision, then in the NearCallback you need to -/// take appropriate action regarding the sensor - something like checking its -/// controller and if needed firing its actuator. Need to find similar code in -/// Fuzzics which fires collision controllers/actuators. -/// -/// \todo Are ghost collisions possible? -/// -/// How do ghost collisions work? Do they require collision detection through ODE -/// and NON-CREATION of contact-joint in OdeNearCallback? Currently OdeNearCallback -/// creates joints ALWAYS for collisions. -/// -/// \todo Why is KX_GameObject::addLinearVelocity commented out? -/// -/// Try putting this code back in. -/// -/// \todo Too many non-dynamic actors bogs down ODE physics -/// -/// Lots of "geoms" (ODE static geometry) probably slows down ode. Try a test file -/// with lots of static geometry - the game performance in Blender says it is -/// spending all its time in physics, and I bet all that time is in collision -/// detection. It's ode's non-hierarchical collision detection. -/// try making a separate ode test program (not within blender) with 1000 geoms and -/// see how fast it is. if it is really slow, there is the culprit. -/// isnt someone working on an improved ODE collision detector? check -/// ode mailing list. -/// -/// -/// \todo support collision of dynas with non-dynamic triangle meshes -/// -/// ODE has trimesh-collision support but only for trimeshes without a transform -/// matrix. update ODE tricollider to support a transform matrix. this will allow -/// moving trimeshes non-dynamically (e.g. through Ipos). then collide trimeshes -/// with dynas. this allows dynamic primitives (spheres, boxes) to collide with -/// non-dynamic or kinematically controlled tri-meshes. full dynamic trimesh to -/// dynamic trimesh support is hard because it requires (a) collision and penetration -/// depth for trimesh to trimesh and (hard to compute) (b) an intertia tensor -/// (easy to compute). -/// -/// a triangle mesh collision geometry should be created when the blender -/// bounding volume (F9, EDITBUTTONS) is set to "polyheder", since this is -/// currently the place where sphere/box selection is made -/// -/// \todo specify ODE ERP+CFM in blender interface -/// -/// when ODE physics selected, have to be able to set global cfm and erp. -/// per-joint erp/cfm could be handled in constraint window. -/// -/// \todo moving infinite mass objects should impart extra impulse to objects they collide with -/// -/// currently ODE's ERP pushes them apart but doesn't account for their motion. -/// you have to detect if one body in a collision is a non-dyna. This -/// requires adding a new accessor method to -/// KX_IPhysicsInterfaceController to access the hidden m_isDyna variable, -/// currently it can only be written, not read). If one of the bodies in a -/// collision is a non-dyna, then impart an extra impulse based on the -/// motion of the static object (using its last 2 frames as an approximation -/// of its linear and angular velocity). Linear velocity is easy to -/// approximate, but angular? you have orientation at this frame and -/// orientation at previous frame. The question is what is the angular -/// velocity which would have taken you from the previous frame's orientation -/// to this frame's orientation? -/// -/// \todo allow tweaking bounding volume size -/// -/// the scene converter currently uses the blender bounding volume of the selected -/// object as the geometry for ODE collision purposes. this is good and automatic -/// intuitive - lets you choose between cube, sphere, mesh. but you need to be able -/// to tweak this size for physics. -/// -/// \todo off center meshes totally wrong for ode -/// -/// ode uses x, y, z extents regradless of center. then places geom at center of object. -/// but visual geom is not necessarily at center. need to detect off-center situations. -/// then do what? treat it as an encapsulated off-center mass, or recenter it? -/// -/// i.o.w. recalculate center, or recalculate mass distribution (using encapsulation)? -/// -/// \todo allow off-center mass -/// -/// using ode geometry encapsulators -/// -/// \todo allow entering compound geoms for complex collision shapes specified as a union of simpler shapes -/// -/// The collision shape for arbitrary triangle meshes can probably in general be -///well approximated by a compound ODE geometry object, which is merely a combination -///of many primitives (capsule, sphere, box). I eventually want to add the ability -///to associate compound geometry objects with Blender gameobjects. I think one -///way of doing this would be to add a new button in the GameButtons, "RigidBodyCompound". -///If the object is "Dynamic" + "RigidBody", then the object's bounding volume (sphere, -///box) is created. If an object is "Dynamic" + "RigidBodyCompound", then the object itself -///will merely create a "wrapper" compound object, with the actual geometry objects -///being created from the object's children in Blender. E.g. if I wanted to make a -///compound collision object consisting of a sphere and 2 boxes, I would create a -///parent gameobject with the actual triangle mesh, and set its GameButtons to -///"RigidBodyCompound". I would then create 3 children of this object, 1 sphere and -///2 boxes, and set the GameButtons for the children to be "RigidBody". Then at -///scene conversion time, the scene converter sees "RigidBodyCompound" for the -///top-level object, then appropriately traverses the children and creates the compound -///collision geometry consisting of 2 boxes and a sphere. In this way, arbitrary -///mesh-mesh collision becomes much less necessary - the artist can (or must, -///depending on your point of view!) approximate the collision shape for arbitrary -///meshes with a combination of one or more primitive shapes. I think using the -///parent/child relationship in Blender and a new button "RigidBodyCompound" for the -///parent object of a compound is a feasible way of doing this in Blender. -/// -///See ODE demo test_boxstack and look at the code when you drop a compound object -///with the "X" key. -/// -/// \todo add visual specification of constraints -/// -/// extend the armature constraint system. by using empties and constraining one empty -/// to "copy location" of another, you can get a p2p constraint between the two empties. -/// by making the two empties each a parent of a blender object, you effectively have -/// a p2p constraint between 2 blender bodies. the scene converter can detect these -/// empties, detect the constraint, and generate an ODE constraint. -/// -/// then add a new constraint type "hinge" and "slider" to correspond to ODE joints. -/// e.g. a slider would be a constraint which restricts the axis of its object to lie -/// along the same line as another axis of a different object. e.g. you constrain x-axis -/// of one empty to lie along the same line as the z-axis of another empty; this gives -/// a slider joint. -/// -/// open questions: how to handle powered joints? to what extent should/must constraints -/// be enforced during modeling? use CCD-style algorithm in modeler to enforce constraints? -/// how about ODE powered constraints e.g. motors? -/// -/// \todo enable suspension of bodies -/// ODE offers native support for suspending dynas. but what about suspending non-dynas -/// (e.g. geoms)? suspending geoms is also necessary to ease the load of ODE's (simple?) -/// collision detector. suspending dynas and geoms is important for the activity culling, -/// which apparently works at a simple level. perhaps suspension should actually -/// remove or insert geoms/dynas into the ODE space/world? is this operation (insertion/ -/// removal) fast enough at run-time? test it. if fast enough, then suspension=remove from -/// ODE simulation, awakening=insertion into ODE simulation. -/// -/// \todo python interface for tweaking constraints via python -/// -/// \todo raytesting to support gameengine sensors that need it -/// -/// \todo investigate compatibility issues with old Blender 2.25 physics engine (sumo/fuzzics) -/// is it possible to have compatibility? how hard is it? how important is it? - - -ODEPhysicsController::ODEPhysicsController(bool dyna, bool fullRigidBody, - bool phantom, class PHY_IMotionState* motionstate, struct dxSpace* space, - struct dxWorld* world, float mass,float friction,float restitution, - bool implicitsphere,float center[3],float extents[3],float radius) - : - m_OdeDyna(dyna), - m_firstTime(true), - m_bFullRigidBody(fullRigidBody), - m_bPhantom(phantom), - m_bKinematic(false), - m_bPrevKinematic(false), - m_MotionState(motionstate), - m_OdeSuspendDynamics(false), - m_space(space), - m_world(world), - m_mass(mass), - m_friction(friction), - m_restitution(restitution), - m_bodyId(0), - m_geomId(0), - m_implicitsphere(implicitsphere), - m_radius(radius) -{ - m_center[0] = center[0]; - m_center[1] = center[1]; - m_center[2] = center[2]; - m_extends[0] = extents[0]; - m_extends[1] = extents[1]; - m_extends[2] = extents[2]; -}; - - -ODEPhysicsController::~ODEPhysicsController() -{ - if (m_geomId) - { - dGeomDestroy (m_geomId); - } -} - -float ODEPhysicsController::getMass() -{ - dMass mass; - dBodyGetMass(m_bodyId,&mass); - return mass.mass; -} - -////////////////////////////////////////////////////////////////////// -/// \todo Impart some extra impulse to dynamic objects when they collide with kinematically controlled "static" objects (ODE geoms), by using last 2 frames as 1st order approximation to the linear/angular velocity, and computing an appropriate impulse. Sumo (old physics engine) did this, see for details. -/// \todo handle scaling of static ODE geoms or fail with error message if Ipo tries to change scale of a static geom object - -bool ODEPhysicsController::SynchronizeMotionStates(float time) -{ - /** - 'Late binding' of the rigidbody, because the World Scaling is not available until the scenegraph is traversed - */ - - - if (m_firstTime) - { - m_firstTime=false; - - m_MotionState->calculateWorldTransformations(); - - dQuaternion worldquat; - float worldpos[3]; - -#ifdef dDOUBLE - m_MotionState->getWorldOrientation((float)worldquat[1], - (float)worldquat[2],(float)worldquat[3],(float)worldquat[0]); -#else - m_MotionState->getWorldOrientation(worldquat[1], - worldquat[2],worldquat[3],worldquat[0]); -#endif - m_MotionState->getWorldPosition(worldpos[0],worldpos[1],worldpos[2]); - - float scaling[3]; - m_MotionState->getWorldScaling(scaling[0],scaling[1],scaling[2]); - - if (!m_bPhantom) - { - if (m_implicitsphere) - { - m_geomId = dCreateSphere (m_space,m_radius*scaling[0]); - } else - { - m_geomId = dCreateBox (m_space, m_extends[0]*scaling[0],m_extends[1]*scaling[1],m_extends[2]*scaling[2]); - } - } else - { - m_geomId=0; - } - - if (m_geomId) - dGeomSetData(m_geomId,this); - - if (!this->m_OdeDyna) - { - if (!m_bPhantom) - { - dGeomSetPosition (this->m_geomId,worldpos[0],worldpos[1],worldpos[2]); - dMatrix3 R; - dQtoR (worldquat, R); - dGeomSetRotation (this->m_geomId,R); - } - } else - { - //it's dynamic, so create a 'model' - m_bodyId = dBodyCreate(this->m_world); - dBodySetPosition (m_bodyId,worldpos[0],worldpos[1],worldpos[2]); - dBodySetQuaternion (this->m_bodyId,worldquat); - //this contains both scalar mass and inertia tensor - dMass m; - float length=1,width=1,height=1; - dMassSetBox (&m,1,m_extends[0]*scaling[0],m_extends[1]*scaling[1],m_extends[2]*scaling[2]); - dMassAdjust (&m,this->m_mass); - dBodySetMass (m_bodyId,&m); - - if (!m_bPhantom) - { - dGeomSetBody (m_geomId,m_bodyId); - } - - - } - - if (this->m_OdeDyna && !m_bFullRigidBody) - { - // ?? huh? what to do here? - } - } - - - - if (m_OdeDyna) - { - if (this->m_OdeSuspendDynamics) - { - return false; - } - - const float* worldPos = (float *)dBodyGetPosition(m_bodyId); - m_MotionState->setWorldPosition(worldPos[0],worldPos[1],worldPos[2]); - - const float* worldquat = (float *)dBodyGetQuaternion(m_bodyId); - m_MotionState->setWorldOrientation(worldquat[1],worldquat[2],worldquat[3],worldquat[0]); - } - else { - // not a dyna, so dynamics (i.e. this controller) has not updated - // anything. BUT! an Ipo or something else might have changed the - // position/orientation of this geometry. - // so update the static geom position - - /// \todo impart some extra impulse to colliding objects! - dQuaternion worldquat; - float worldpos[3]; - -#ifdef dDOUBLE - m_MotionState->getWorldOrientation((float)worldquat[1], - (float)worldquat[2],(float)worldquat[3],(float)worldquat[0]); -#else - m_MotionState->getWorldOrientation(worldquat[1], - worldquat[2],worldquat[3],worldquat[0]); -#endif - m_MotionState->getWorldPosition(worldpos[0],worldpos[1],worldpos[2]); - - float scaling[3]; - m_MotionState->getWorldScaling(scaling[0],scaling[1],scaling[2]); - - /// \todo handle scaling! what if Ipo changes scale of object? - // Must propagate to geom... is scaling geoms possible with ODE? Also - // what about scaling trimeshes, that is certainly difficult... - dGeomSetPosition (this->m_geomId,worldpos[0],worldpos[1],worldpos[2]); - dMatrix3 R; - dQtoR (worldquat, R); - dGeomSetRotation (this->m_geomId,R); - } - - return false; //it update the worldpos -} - -PHY_IMotionState* ODEPhysicsController::GetMotionState() -{ - return m_MotionState; -} - - -// kinematic methods -void ODEPhysicsController::RelativeTranslate(float dlocX,float dlocY,float dlocZ,bool local) -{ - -} -void ODEPhysicsController::RelativeRotate(const float drot[9],bool local) -{ -} -void ODEPhysicsController::setOrientation(float quatImag0,float quatImag1,float quatImag2,float quatReal) -{ - - dQuaternion worldquat; - worldquat[0] = quatReal; - worldquat[1] = quatImag0; - worldquat[2] = quatImag1; - worldquat[3] = quatImag2; - - if (!this->m_OdeDyna) - { - dMatrix3 R; - dQtoR (worldquat, R); - dGeomSetRotation (this->m_geomId,R); - } else - { - dBodySetQuaternion (m_bodyId,worldquat); - this->m_MotionState->setWorldOrientation(quatImag0,quatImag1,quatImag2,quatReal); - } - -} - -void ODEPhysicsController::getOrientation(float &quatImag0,float &quatImag1,float &quatImag2,float &quatReal) -{ - float q[4]; - this->m_MotionState->getWorldOrientation(q[0],q[1],q[2],q[3]); - quatImag0=q[0]; - quatImag1=q[1]; - quatImag2=q[2]; - quatReal=q[3]; -} - -void ODEPhysicsController::getPosition(PHY__Vector3& pos) const -{ - m_MotionState->getWorldPosition(pos[0],pos[1],pos[2]); - -} - -void ODEPhysicsController::setPosition(float posX,float posY,float posZ) -{ - if (!m_bPhantom) - { - if (!this->m_OdeDyna) - { - dGeomSetPosition (m_geomId, posX, posY, posZ); - } else - { - dBodySetPosition (m_bodyId, posX, posY, posZ); - } - } -} -void ODEPhysicsController::setScaling(float scaleX,float scaleY,float scaleZ) -{ -} - -// physics methods -void ODEPhysicsController::ApplyTorque(float torqueX,float torqueY,float torqueZ,bool local) -{ - if (m_OdeDyna) { - if(local) { - dBodyAddRelTorque(m_bodyId, torqueX, torqueY, torqueZ); - } else { - dBodyAddTorque (m_bodyId, torqueX, torqueY, torqueZ); - } - } -} - -void ODEPhysicsController::ApplyForce(float forceX,float forceY,float forceZ,bool local) -{ - if (m_OdeDyna) { - if(local) { - dBodyAddRelForce(m_bodyId, forceX, forceY, forceZ); - } else { - dBodyAddForce (m_bodyId, forceX, forceY, forceZ); - } - } -} - -void ODEPhysicsController::SetAngularVelocity(float ang_velX,float ang_velY,float ang_velZ,bool local) -{ - if (m_OdeDyna) { - if(local) { - // TODO: translate angular vel into local frame, then apply - } else { - dBodySetAngularVel (m_bodyId, ang_velX,ang_velY,ang_velZ); - } - } -} - -void ODEPhysicsController::SetLinearVelocity(float lin_velX,float lin_velY,float lin_velZ,bool local) -{ - if (m_OdeDyna) - { - dVector3 vel = {lin_velX,lin_velY,lin_velZ, 1.0}; - if (local) - { - dMatrix3 worldmat; - dVector3 localvel; - dQuaternion worldquat; - -#ifdef dDOUBLE - m_MotionState->getWorldOrientation((float)worldquat[1], - (float)worldquat[2], (float)worldquat[3],(float)worldquat[0]); -#else - m_MotionState->getWorldOrientation(worldquat[1],worldquat[2], - worldquat[3],worldquat[0]); -#endif - dQtoR (worldquat, worldmat); - - dMULTIPLY0_331 (localvel,worldmat,vel); - dBodySetLinearVel (m_bodyId, localvel[0],localvel[1],localvel[2]); - - } else - { - dBodySetLinearVel (m_bodyId, lin_velX,lin_velY,lin_velZ); - } - } -} - -void ODEPhysicsController::applyImpulse(float attachX,float attachY,float attachZ, float impulseX,float impulseY,float impulseZ) -{ - if (m_OdeDyna) - { - //apply linear and angular effect - const dReal* linvel = dBodyGetLinearVel(m_bodyId); - float mass = getMass(); - if (mass >= 0.00001f) - { - float massinv = 1.f/mass; - float newvel[3]; - newvel[0]=linvel[0]+impulseX*massinv; - newvel[1]=linvel[1]+impulseY*massinv; - newvel[2]=linvel[2]+impulseZ*massinv; - dBodySetLinearVel(m_bodyId,newvel[0],newvel[1],newvel[2]); - - const float* worldPos = (float *)dBodyGetPosition(m_bodyId); - - const float* angvelc = (float *)dBodyGetAngularVel(m_bodyId); - float angvel[3]; - angvel[0]=angvelc[0]; - angvel[1]=angvelc[1]; - angvel[2]=angvelc[2]; - - dVector3 impulse; - impulse[0]=impulseX; - impulse[1]=impulseY; - impulse[2]=impulseZ; - - dVector3 ap; - ap[0]=attachX-worldPos[0]; - ap[1]=attachY-worldPos[1]; - ap[2]=attachZ-worldPos[2]; - - dCROSS(angvel,+=,ap,impulse); - dBodySetAngularVel(m_bodyId,angvel[0],angvel[1],angvel[2]); - - } - - } - -} - -void ODEPhysicsController::SuspendDynamics() -{ - -} - -void ODEPhysicsController::RestoreDynamics() -{ - -} - - -/** - reading out information from physics -*/ -void ODEPhysicsController::GetLinearVelocity(float& linvX,float& linvY,float& linvZ) -{ - if (m_OdeDyna) - { - const float* vel = (float *)dBodyGetLinearVel(m_bodyId); - linvX = vel[0]; - linvY = vel[1]; - linvZ = vel[2]; - } else - { - linvX = 0.f; - linvY = 0.f; - linvZ = 0.f; - - } -} -/** - GetVelocity parameters are in geometric coordinates (Origin is not center of mass!). -*/ -void ODEPhysicsController::GetVelocity(const float posX,const float posY,const float posZ,float& linvX,float& linvY,float& linvZ) -{ - -} - - -void ODEPhysicsController::getReactionForce(float& forceX,float& forceY,float& forceZ) -{ - -} -void ODEPhysicsController::setRigidBody(bool rigid) -{ - -} - - -void ODEPhysicsController::PostProcessReplica(class PHY_IMotionState* motionstate,class PHY_IPhysicsController* parentctrl) -{ - m_MotionState = motionstate; - m_bKinematic = false; - m_bPrevKinematic = false; - m_firstTime = true; -} - - -void ODEPhysicsController::SetSimulatedTime(float time) -{ -} - - -void ODEPhysicsController::WriteMotionStateToDynamics(bool nondynaonly) -{ - -} -#endif diff --git a/source/gameengine/Physics/BlOde/OdePhysicsController.h b/source/gameengine/Physics/BlOde/OdePhysicsController.h deleted file mode 100644 index 544d11da2ca..00000000000 --- a/source/gameengine/Physics/BlOde/OdePhysicsController.h +++ /dev/null @@ -1,164 +0,0 @@ -/** - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * The contents of this file may be used under the terms of either the GNU - * General Public License Version 2 or later (the "GPL", see - * http://www.gnu.org/licenses/gpl.html ), or the Blender License 1.0 or - * later (the "BL", see http://www.blender.org/BL/ ) which has to be - * bought from the Blender Foundation to become active, in which case the - * above mentioned GPL option does not apply. - * - * The Original Code is Copyright (C) 2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ -#ifndef __ODE_PHYSICSCONTROLLER_H -#define __ODE_PHYSICSCONTROLLER_H - - -#include "PHY_IPhysicsController.h" - -/** - ODE Physics Controller, a special kind of a PhysicsController. - A Physics Controller is a special kind of Scene Graph Transformation Controller. - Each time the scene graph get's updated, the controller get's a chance - in the 'Update' method to reflect changes. -*/ - -class ODEPhysicsController : public PHY_IPhysicsController - -{ - - bool m_OdeDyna; - -public: - ODEPhysicsController( - bool dyna, - bool fullRigidBody, - bool phantom, - class PHY_IMotionState* motionstate, - struct dxSpace* space, - struct dxWorld* world, - float mass, - float friction, - float restitution, - bool implicitsphere, - float center[3], - float extends[3], - float radius); - - virtual ~ODEPhysicsController(); - - // kinematic methods - virtual void RelativeTranslate(float dlocX,float dlocY,float dlocZ,bool local); - virtual void RelativeRotate(const float drot[9],bool local); - virtual void getOrientation(float &quatImag0,float &quatImag1,float &quatImag2,float &quatReal); - virtual void setOrientation(float quatImag0,float quatImag1,float quatImag2,float quatReal); - virtual void setPosition(float posX,float posY,float posZ); - virtual void getPosition(PHY__Vector3& pos) const; - - virtual void setScaling(float scaleX,float scaleY,float scaleZ); - - // physics methods - virtual void ApplyTorque(float torqueX,float torqueY,float torqueZ,bool local); - virtual void ApplyForce(float forceX,float forceY,float forceZ,bool local); - virtual void SetAngularVelocity(float ang_velX,float ang_velY,float ang_velZ,bool local); - virtual void SetLinearVelocity(float lin_velX,float lin_velY,float lin_velZ,bool local); - virtual void applyImpulse(float attachX,float attachY,float attachZ, float impulseX,float impulseY,float impulseZ); - virtual void SetActive(bool active){}; - virtual void SuspendDynamics(); - virtual void RestoreDynamics(); - virtual void resolveCombinedVelocities(float linvelX,float linvelY,float linvelZ,float angVelX,float angVelY,float angVelZ) - { - //todo ? - } - - - /** - reading out information from physics - */ - virtual void GetLinearVelocity(float& linvX,float& linvY,float& linvZ); - /** - GetVelocity parameters are in geometric coordinates (Origin is not center of mass!). - */ - virtual void GetVelocity(const float posX,const float posY,const float posZ,float& linvX,float& linvY,float& linvZ); - virtual float getMass(); - virtual void getReactionForce(float& forceX,float& forceY,float& forceZ); - virtual void setRigidBody(bool rigid); - - - virtual void PostProcessReplica(class PHY_IMotionState* motionstate,class PHY_IPhysicsController* parentctrl); - - // \todo remove next line ! - virtual void SetSimulatedTime(float time); - - - virtual void WriteDynamicsToMotionState() {}; - virtual void WriteMotionStateToDynamics(bool nondynaonly); - virtual class PHY_IMotionState* GetMotionState(); - - /** - call from Scene Graph Node to 'update'. - */ - virtual bool SynchronizeMotionStates(float time); - - virtual void calcXform(){} - virtual void SetMargin(float margin) {} - virtual float GetMargin() const {return 0.f;} - virtual float GetRadius() const {return 0.f;} - virtual void SetRadius(float margin) {} - - // clientinfo for raycasts for example - virtual void* getNewClientInfo() { return m_clientInfo;} - virtual void setNewClientInfo(void* clientinfo) {m_clientInfo = clientinfo;}; - void* m_clientInfo; - - struct dxBody* GetOdeBodyId() { return m_bodyId; } - - float getFriction() { return m_friction;} - float getRestitution() { return m_restitution;} - - float GetLinVelocityMin() const { return 0.f; } - void SetLinVelocityMin(float val) { } - float GetLinVelocityMax() const { return 0.f; } - void SetLinVelocityMax(float val) { } - - -private: - - bool m_firstTime; - bool m_bFullRigidBody; - bool m_bPhantom; // special flag for objects that are not affected by physics 'resolver' - - // data to calculate fake velocities for kinematic objects (non-dynas) - bool m_bKinematic; - bool m_bPrevKinematic; - - - float m_lastTime; - bool m_OdeSuspendDynamics; - class PHY_IMotionState* m_MotionState; - - //Ode specific members - struct dxBody* m_bodyId; - struct dxGeom* m_geomId; - struct dxSpace* m_space; - struct dxWorld* m_world; - float m_mass; - float m_friction; - float m_restitution; - bool m_implicitsphere; - float m_center[3]; - float m_extends[3]; - float m_radius; -}; - -#endif //__ODE_PHYSICSCONTROLLER_H - diff --git a/source/gameengine/Physics/BlOde/OdePhysicsEnvironment.cpp b/source/gameengine/Physics/BlOde/OdePhysicsEnvironment.cpp deleted file mode 100644 index 54e97858b7f..00000000000 --- a/source/gameengine/Physics/BlOde/OdePhysicsEnvironment.cpp +++ /dev/null @@ -1,277 +0,0 @@ -/** - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * The contents of this file may be used under the terms of either the GNU - * General Public License Version 2 or later (the "GPL", see - * http://www.gnu.org/licenses/gpl.html ), or the Blender License 1.0 or - * later (the "BL", see http://www.blender.org/BL/ ) which has to be - * bought from the Blender Foundation to become active, in which case the - * above mentioned GPL option does not apply. - * - * The Original Code is Copyright (C) 2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ -#include "OdePhysicsEnvironment.h" -#include "PHY_IMotionState.h" -#include "OdePhysicsController.h" - -#include <ode/ode.h> -#include <../ode/src/joint.h> -#include <ode/odemath.h> - -ODEPhysicsEnvironment::ODEPhysicsEnvironment() -{ - m_OdeWorld = dWorldCreate(); - m_OdeSpace = dHashSpaceCreate(); - m_OdeContactGroup = dJointGroupCreate (0); - dWorldSetCFM (m_OdeWorld,1e-5f); - - m_JointGroup = dJointGroupCreate(0); - - setFixedTimeStep(true,1.f/60.f); -} - - - -ODEPhysicsEnvironment::~ODEPhysicsEnvironment() -{ - dJointGroupDestroy (m_OdeContactGroup); - dJointGroupDestroy (m_JointGroup); - - dSpaceDestroy (m_OdeSpace); - dWorldDestroy (m_OdeWorld); -} - - - -void ODEPhysicsEnvironment::setFixedTimeStep(bool useFixedTimeStep,float fixedTimeStep) -{ - m_useFixedTimeStep = useFixedTimeStep; - - if (useFixedTimeStep) - { - m_fixedTimeStep = fixedTimeStep; - } else - { - m_fixedTimeStep = 0.f; - } - m_currentTime = 0.f; - - //todo:implement fixed timestepping - -} -float ODEPhysicsEnvironment::getFixedTimeStep() -{ - return m_fixedTimeStep; -} - - - -bool ODEPhysicsEnvironment::proceedDeltaTime(double curTime,float timeStep1,float interval) -{ - - float deltaTime = timeStep1; - int numSteps = 1; - - if (m_useFixedTimeStep) - { - m_currentTime += timeStep1; - // equal to subSampling (might be a little smaller). - numSteps = (int)(m_currentTime / m_fixedTimeStep); - m_currentTime -= m_fixedTimeStep * (float)numSteps; - deltaTime = m_fixedTimeStep; - //todo: experiment by smoothing the remaining time over the substeps - } - - for (int i=0;i<numSteps;i++) - { - // ode collision update - dSpaceCollide (m_OdeSpace,this,&ODEPhysicsEnvironment::OdeNearCallback); - - int m_odeContacts = GetNumOdeContacts(); - - //physics integrator + resolver update - //dWorldStep (m_OdeWorld,deltaTime); - //dWorldQuickStep (m_OdeWorld,deltaTime); - //dWorldID w, dReal stepsize) - - //clear collision points - this->ClearOdeContactGroup(); - } - return true; -} - -void ODEPhysicsEnvironment::setGravity(float x,float y,float z) -{ - dWorldSetGravity (m_OdeWorld,x,y,z); -} - - - -int ODEPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl,class PHY_IPhysicsController* ctrl2,PHY_ConstraintType type, - float pivotX,float pivotY,float pivotZ,float axisX,float axisY,float axisZ) -{ - - int constraintid = 0; - ODEPhysicsController* dynactrl = (ODEPhysicsController*)ctrl; - ODEPhysicsController* dynactrl2 = (ODEPhysicsController*)ctrl2; - - switch (type) - { - case PHY_POINT2POINT_CONSTRAINT: - { - if (dynactrl) - { - dJointID jointid = dJointCreateBall (m_OdeWorld,m_JointGroup); - struct dxBody* bodyid1 = dynactrl->GetOdeBodyId(); - struct dxBody* bodyid2=0; - const dReal* pos = dBodyGetPosition(bodyid1); - const dReal* R = dBodyGetRotation(bodyid1); - dReal offset[3] = {pivotX,pivotY,pivotZ}; - dReal newoffset[3]; - dMULTIPLY0_331 (newoffset,R,offset); - newoffset[0] += pos[0]; - newoffset[1] += pos[1]; - newoffset[2] += pos[2]; - - - if (dynactrl2) - bodyid2 = dynactrl2->GetOdeBodyId(); - - dJointAttach (jointid, bodyid1, bodyid2); - - dJointSetBallAnchor (jointid, newoffset[0], newoffset[1], newoffset[2]); - - constraintid = (int) jointid; - } - break; - } - case PHY_LINEHINGE_CONSTRAINT: - { - if (dynactrl) - { - dJointID jointid = dJointCreateHinge (m_OdeWorld,m_JointGroup); - struct dxBody* bodyid1 = dynactrl->GetOdeBodyId(); - struct dxBody* bodyid2=0; - const dReal* pos = dBodyGetPosition(bodyid1); - const dReal* R = dBodyGetRotation(bodyid1); - dReal offset[3] = {pivotX,pivotY,pivotZ}; - dReal axisset[3] = {axisX,axisY,axisZ}; - - dReal newoffset[3]; - dReal newaxis[3]; - dMULTIPLY0_331 (newaxis,R,axisset); - - dMULTIPLY0_331 (newoffset,R,offset); - newoffset[0] += pos[0]; - newoffset[1] += pos[1]; - newoffset[2] += pos[2]; - - - if (dynactrl2) - bodyid2 = dynactrl2->GetOdeBodyId(); - - dJointAttach (jointid, bodyid1, bodyid2); - - dJointSetHingeAnchor (jointid, newoffset[0], newoffset[1], newoffset[2]); - dJointSetHingeAxis(jointid,newaxis[0],newaxis[1],newaxis[2]); - - constraintid = (int) jointid; - } - break; - } - default: - { - //not yet - } - } - - return constraintid; - -} - -void ODEPhysicsEnvironment::removeConstraint(void *constraintid) -{ - if (constraintid) - { - dJointDestroy((dJointID) constraintid); - } -} - -PHY_IPhysicsController* ODEPhysicsEnvironment::rayTest(PHY_IRayCastFilterCallback &filterCallback,float fromX,float fromY,float fromZ, float toX,float toY,float toZ) -{ - - //m_OdeWorld - //collision detection / raytesting - return NULL; -} - - -void ODEPhysicsEnvironment::OdeNearCallback (void *data, dGeomID o1, dGeomID o2) -{ - // \todo if this is a registered collision sensor - // fire the callback - - int i; - // if (o1->body && o2->body) return; - ODEPhysicsEnvironment* env = (ODEPhysicsEnvironment*) data; - dBodyID b1,b2; - - b1 = dGeomGetBody(o1); - b2 = dGeomGetBody(o2); - // exit without doing anything if the two bodies are connected by a joint - if (b1 && b2 && dAreConnected (b1,b2)) return; - - ODEPhysicsController * ctrl1 =(ODEPhysicsController *)dGeomGetData(o1); - ODEPhysicsController * ctrl2 =(ODEPhysicsController *)dGeomGetData(o2); - float friction=ctrl1->getFriction(); - float restitution = ctrl1->getRestitution(); - //for friction, take minimum - - friction=(friction < ctrl2->getFriction() ? - friction :ctrl2->getFriction()); - - //restitution:take minimum - restitution = restitution < ctrl2->getRestitution()? - restitution : ctrl2->getRestitution(); - - dContact contact[3]; // up to 3 contacts per box - for (i=0; i<3; i++) { - contact[i].surface.mode = dContactBounce; //dContactMu2; - contact[i].surface.mu = friction;//dInfinity; - contact[i].surface.mu2 = 0; - contact[i].surface.bounce = restitution;//0.5; - contact[i].surface.bounce_vel = 0.1f; - contact[i].surface.slip1=0.0; - } - - if (int numc = dCollide (o1,o2,3,&contact[0].geom,sizeof(dContact))) { - // dMatrix3 RI; - // dRSetIdentity (RI); - // const dReal ss[3] = {0.02,0.02,0.02}; - for (i=0; i<numc; i++) { - dJointID c = dJointCreateContact (env->m_OdeWorld,env->m_OdeContactGroup,contact+i); - dJointAttach (c,b1,b2); - } - } -} - - -void ODEPhysicsEnvironment::ClearOdeContactGroup() -{ - dJointGroupEmpty (m_OdeContactGroup); -} - -int ODEPhysicsEnvironment::GetNumOdeContacts() -{ - return m_OdeContactGroup->num; -} - diff --git a/source/gameengine/Physics/BlOde/OdePhysicsEnvironment.h b/source/gameengine/Physics/BlOde/OdePhysicsEnvironment.h deleted file mode 100644 index 54e4f7f90e1..00000000000 --- a/source/gameengine/Physics/BlOde/OdePhysicsEnvironment.h +++ /dev/null @@ -1,94 +0,0 @@ -/** - * $Id$ - * - * ***** BEGIN GPL LICENSE BLOCK ***** - * - * The contents of this file may be used under the terms of either the GNU - * General Public License Version 2 or later (the "GPL", see - * http://www.gnu.org/licenses/gpl.html ), or the Blender License 1.0 or - * later (the "BL", see http://www.blender.org/BL/ ) which has to be - * bought from the Blender Foundation to become active, in which case the - * above mentioned GPL option does not apply. - * - * The Original Code is Copyright (C) 2002 by NaN Holding BV. - * All rights reserved. - * - * The Original Code is: all of this file. - * - * Contributor(s): none yet. - * - * ***** END GPL LICENSE BLOCK ***** - */ -#ifndef _ODEPHYSICSENVIRONMENT -#define _ODEPHYSICSENVIRONMENT - - -#include "PHY_IPhysicsEnvironment.h" - -/** -* Physics Environment takes care of stepping the simulation and is a container for physics entities (rigidbodies,constraints, materials etc.) -* A derived class may be able to 'construct' entities by loading and/or converting -*/ -class ODEPhysicsEnvironment : public PHY_IPhysicsEnvironment -{ - - bool m_useFixedTimeStep; - float m_fixedTimeStep; - float m_currentTime; - -public: - ODEPhysicsEnvironment(); - virtual ~ODEPhysicsEnvironment(); - virtual void beginFrame() {} - virtual void endFrame() {} - - -// Perform an integration step of duration 'timeStep'. - virtual bool proceedDeltaTime(double curTime,float timeStep,float interval); - virtual void setFixedTimeStep(bool useFixedTimeStep,float fixedTimeStep); - virtual float getFixedTimeStep(); - - virtual void setGravity(float x,float y,float z); - virtual int createConstraint(class PHY_IPhysicsController* ctrl,class PHY_IPhysicsController* ctrl2,PHY_ConstraintType type, - float pivotX,float pivotY,float pivotZ, - float axisX,float axisY,float axisZ); - - virtual void removeConstraint(void * constraintid); - virtual PHY_IPhysicsController* rayTest(PHY_IRayCastFilterCallback &filterCallback,float fromX,float fromY,float fromZ, float toX,float toY,float toZ); - virtual bool cullingTest(PHY_CullingCallback callback, void* userData, PHY__Vector4* planes, int nplanes, int occlusionRes) { return false; } - - - //gamelogic callbacks - virtual void addSensor(PHY_IPhysicsController* ctrl) {} - virtual void removeSensor(PHY_IPhysicsController* ctrl) {} - virtual void addTouchCallback(int response_class, PHY_ResponseCallback callback, void *user) - { - } - virtual bool requestCollisionCallback(PHY_IPhysicsController* ctrl) {return false;} - virtual bool removeCollisionCallback(PHY_IPhysicsController* ctrl) {return false;} - virtual PHY_IPhysicsController* CreateSphereController(float radius,const PHY__Vector3& position) {return 0;} - virtual PHY_IPhysicsController* CreateConeController(float coneradius,float coneheight) { return 0;} - - - - struct dxWorld* GetOdeWorld() { return m_OdeWorld; }; - struct dxSpace* GetOdeSpace() { return m_OdeSpace;}; - -private: - - - // ODE physics response - struct dxWorld* m_OdeWorld; - // ODE collision detection - struct dxSpace* m_OdeSpace; - void ClearOdeContactGroup(); - struct dxJointGroup* m_OdeContactGroup; - struct dxJointGroup* m_JointGroup; - - static void OdeNearCallback(void *data, struct dxGeom* o1, struct dxGeom* o2); - int GetNumOdeContacts(); - -}; - -#endif //_ODEPHYSICSENVIRONMENT - diff --git a/source/gameengine/Physics/BlOde/SConscript b/source/gameengine/Physics/BlOde/SConscript deleted file mode 100644 index 90e949d2d86..00000000000 --- a/source/gameengine/Physics/BlOde/SConscript +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/python -Import ('user_options_dict') -Import ('library_env') - -phy_ode_env = library_env.Copy () - -source_files = ['OdePhysicsController.cpp', - 'OdePhysicsEnvironment.cpp'] - -phy_ode_env.Append (CPPPATH=['.', - '../common', - ]) -phy_ode_env.Append (CPPPATH=user_options_dict['ODE_INCLUDE']) - -phy_ode_env.Library (target='#'+user_options_dict['BUILD_DIR']+'/lib/PHY_Ode', source=source_files) diff --git a/source/gameengine/Physics/Dummy/Makefile b/source/gameengine/Physics/Dummy/Makefile index b0c1b855322..c016a0bebcb 100644 --- a/source/gameengine/Physics/Dummy/Makefile +++ b/source/gameengine/Physics/Dummy/Makefile @@ -39,7 +39,7 @@ CPPFLAGS += -I$(OPENGL_HEADERS) CPPFLAGS += -I$(NAN_STRING)/include CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION) -CPPFLAGS += -I$(NAN_FUZZICS)/include -I$(NAN_SUMO)/include -I$(NAN_MOTO)/include +CPPFLAGS += -I$(NAN_FUZZICS)/include -I$(NAN_MOTO)/include CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include CPPFLAGS += -I../../Physics/common CPPFLAGS += -I../../Physics/Dummy diff --git a/source/gameengine/Physics/Makefile b/source/gameengine/Physics/Makefile index b192e497f35..da0d4cafd2e 100644 --- a/source/gameengine/Physics/Makefile +++ b/source/gameengine/Physics/Makefile @@ -32,7 +32,6 @@ include nan_definitions.mk SOURCEDIR = source/gameengine/Physics DIR = $(OCGDIR)/gameengine/blphys -DIRS = common Sumo Dummy Bullet -#DIRS += BlOde +DIRS = common Dummy Bullet include nan_subdirs.mk diff --git a/source/gameengine/Physics/Sumo/CMakeLists.txt b/source/gameengine/Physics/Sumo/CMakeLists.txt deleted file mode 100644 index c57a4af6706..00000000000 --- a/source/gameengine/Physics/Sumo/CMakeLists.txt +++ /dev/null @@ -1,46 +0,0 @@ -# $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, Blender Foundation -# All rights reserved. -# -# The Original Code is: all of this file. -# -# Contributor(s): Jacques Beaurain. -# -# ***** END GPL LICENSE BLOCK ***** - -SET(SRC - SumoPHYCallbackBridge.cpp - SumoPhysicsController.cpp - SumoPhysicsEnvironment.cpp - Fuzzics/src/SM_FhObject.cpp - Fuzzics/src/SM_Object.cpp - Fuzzics/src/SM_Scene.cpp - Fuzzics/src/SM_MotionState.cpp -) - -SET(INC - . - ../common - Fuzzics/include - ../../../../intern/moto/include - ../../../../extern/solid -) - -BLENDERLIB(bf_sumo "${SRC}" "${INC}") -#env.BlenderLib ( 'bf_sumo', sources, incs, [], libtype=['game2','player'], priority=[30, 70] , compileflags=cflags) diff --git a/source/gameengine/Physics/Sumo/Fuzzics/Makefile b/source/gameengine/Physics/Sumo/Fuzzics/Makefile deleted file mode 100644 index 5ed2c31a1d0..00000000000 --- a/source/gameengine/Physics/Sumo/Fuzzics/Makefile +++ /dev/null @@ -1,34 +0,0 @@ -# -# $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 ***** -# -# Bounces make to subdirectories. - -SOURCEDIR = source/gameengine/Physics/Sumo/Fuzzics -DIRS = src - -include nan_subdirs.mk diff --git a/source/gameengine/Physics/Sumo/Fuzzics/include/SM_Callback.h b/source/gameengine/Physics/Sumo/Fuzzics/include/SM_Callback.h deleted file mode 100644 index 42b5ab48ab6..00000000000 --- a/source/gameengine/Physics/Sumo/Fuzzics/include/SM_Callback.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef SM_CALLBACK_H -#define SM_CALLBACK_H - -class SM_Callback { -public: - virtual void do_me() = 0; - virtual ~SM_Callback() {} -}; - -#endif - diff --git a/source/gameengine/Physics/Sumo/Fuzzics/include/SM_ClientObjectInfo.h b/source/gameengine/Physics/Sumo/Fuzzics/include/SM_ClientObjectInfo.h deleted file mode 100644 index 6749e7957ec..00000000000 --- a/source/gameengine/Physics/Sumo/Fuzzics/include/SM_ClientObjectInfo.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef __SM_CLIENTOBJECT_INFO_H -#define __SM_CLIENTOBJECT_INFO_H - -/** - * Client Type and Additional Info. This structure can be use instead of a bare void* pointer, for safeness, and additional info for callbacks - */ - -struct SM_ClientObjectInfo -{ - int m_type; - void* m_clientobject1; - void* m_auxilary_info; -}; - -#endif //__SM_CLIENTOBJECT_INFO_H - diff --git a/source/gameengine/Physics/Sumo/Fuzzics/include/SM_Debug.h b/source/gameengine/Physics/Sumo/Fuzzics/include/SM_Debug.h deleted file mode 100644 index 48d5906e53d..00000000000 --- a/source/gameengine/Physics/Sumo/Fuzzics/include/SM_Debug.h +++ /dev/null @@ -1,26 +0,0 @@ - - -#ifndef __SM_DEBUG_H__ -#define __SM_DEBUG_H__ - -/* Comment this to disable all SUMO debugging printfs */ - -#define SM_DEBUG - -#ifdef SM_DEBUG - -#include <stdio.h> - -/* Uncomment this to printf all ray casts */ -//#define SM_DEBUG_RAYCAST - -/* Uncomment this to printf collision callbacks */ -//#define SM_DEBUG_BOING - -/* Uncomment this to printf Xform matrix calculations */ -//#define SM_DEBUG_XFORM - -#endif /* SM_DEBUG */ - -#endif /* __SM_DEBUG_H__ */ - diff --git a/source/gameengine/Physics/Sumo/Fuzzics/include/SM_FhObject.h b/source/gameengine/Physics/Sumo/Fuzzics/include/SM_FhObject.h deleted file mode 100644 index b03612ed15e..00000000000 --- a/source/gameengine/Physics/Sumo/Fuzzics/include/SM_FhObject.h +++ /dev/null @@ -1,56 +0,0 @@ -/** - * $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 ***** - */ -#ifndef SM_FHOBJECT_H -#define SM_FHOBJECT_H - -#include "SM_Object.h" - -class SM_FhObject : public SM_Object { -public: - virtual ~SM_FhObject(); - SM_FhObject(DT_ShapeHandle rayshape, MT_Vector3 ray, SM_Object *parent_object); - - const MT_Vector3& getRay() const { return m_ray; } - MT_Point3 getSpot() const { return getPosition() + m_ray; } - const MT_Vector3& getRayDirection() const { return m_ray_direction; } - SM_Object *getParentObject() const { return m_parent_object; } - - static DT_Bool ray_hit(void *client_data, - void *object1, - void *object2, - const DT_CollData *coll_data); - -private: - MT_Vector3 m_ray; - MT_Vector3 m_ray_direction; - SM_Object *m_parent_object; -}; - -#endif - diff --git a/source/gameengine/Physics/Sumo/Fuzzics/include/SM_MotionState.h b/source/gameengine/Physics/Sumo/Fuzzics/include/SM_MotionState.h deleted file mode 100644 index fdc45af5225..00000000000 --- a/source/gameengine/Physics/Sumo/Fuzzics/include/SM_MotionState.h +++ /dev/null @@ -1,77 +0,0 @@ -/** - * $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 ***** - */ -#ifndef SM_MOTIONSTATE_H -#define SM_MOTIONSTATE_H - -#include "MT_Transform.h" - -class SM_MotionState { -public: - SM_MotionState() : - m_time(0.0), - m_pos(0.0, 0.0, 0.0), - m_orn(0.0, 0.0, 0.0, 1.0), - m_lin_vel(0.0, 0.0, 0.0), - m_ang_vel(0.0, 0.0, 0.0) - {} - - void setPosition(const MT_Point3& pos) { m_pos = pos; } - void setOrientation(const MT_Quaternion& orn) { m_orn = orn; } - void setLinearVelocity(const MT_Vector3& lin_vel) { m_lin_vel = lin_vel; } - void setAngularVelocity(const MT_Vector3& ang_vel) { m_ang_vel = ang_vel; } - void setTime(MT_Scalar time) { m_time = time; } - - const MT_Point3& getPosition() const { return m_pos; } - const MT_Quaternion& getOrientation() const { return m_orn; } - const MT_Vector3& getLinearVelocity() const { return m_lin_vel; } - const MT_Vector3& getAngularVelocity() const { return m_ang_vel; } - - MT_Scalar getTime() const { return m_time; } - - void integrateMidpoint(MT_Scalar timeStep, const SM_MotionState &prev_state, const MT_Vector3 &velocity, const MT_Quaternion& ang_vel); - void integrateBackward(MT_Scalar timeStep, const MT_Vector3 &velocity, const MT_Quaternion& ang_vel); - void integrateForward(MT_Scalar timeStep, const SM_MotionState &prev_state); - - void lerp(const SM_MotionState &prev, const SM_MotionState &next); - void lerp(MT_Scalar t, const SM_MotionState &other); - - virtual MT_Transform getTransform() const { - return MT_Transform(m_pos, m_orn); - } - -protected: - MT_Scalar m_time; - MT_Point3 m_pos; - MT_Quaternion m_orn; - MT_Vector3 m_lin_vel; - MT_Vector3 m_ang_vel; -}; - -#endif - diff --git a/source/gameengine/Physics/Sumo/Fuzzics/include/SM_Object.h b/source/gameengine/Physics/Sumo/Fuzzics/include/SM_Object.h deleted file mode 100644 index 2d748a0f251..00000000000 --- a/source/gameengine/Physics/Sumo/Fuzzics/include/SM_Object.h +++ /dev/null @@ -1,393 +0,0 @@ -/** - * $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 ***** - */ -#ifndef SM_OBJECT_H -#define SM_OBJECT_H - -#include <vector> - -#include <SOLID/SOLID.h> - -#include "SM_Callback.h" -#include "SM_MotionState.h" -#include <stdio.h> - -class SM_FhObject; - -/** Properties of dynamic objects */ -struct SM_ShapeProps { - MT_Scalar m_mass; ///< Total mass - MT_Scalar m_radius; ///< Bound sphere size - MT_Vector3 m_inertia; ///< Inertia, should be a tensor some time - MT_Scalar m_lin_drag; ///< Linear drag (air, water) 0 = concrete, 1 = vacuum - MT_Scalar m_ang_drag; ///< Angular drag - MT_Scalar m_friction_scaling[3]; ///< Scaling for anisotropic friction. Component in range [0, 1] - bool m_do_anisotropic; ///< Should I do anisotropic friction? - bool m_do_fh; ///< Should the object have a linear Fh spring? - bool m_do_rot_fh; ///< Should the object have an angular Fh spring? -}; - - -/** Properties of collidable objects (non-ghost objects) */ -struct SM_MaterialProps { - MT_Scalar m_restitution; ///< restitution of energy after a collision 0 = inelastic, 1 = elastic - MT_Scalar m_friction; ///< Coulomb friction (= ratio between the normal en maximum friction force) - MT_Scalar m_fh_spring; ///< Spring constant (both linear and angular) - MT_Scalar m_fh_damping; ///< Damping factor (linear and angular) in range [0, 1] - MT_Scalar m_fh_distance; ///< The range above the surface where Fh is active. - bool m_fh_normal; ///< Should the object slide off slopes? -}; - -class SM_ClientObject -{ -public: - SM_ClientObject() {} - virtual ~SM_ClientObject() {} - - virtual bool hasCollisionCallback() = 0; -}; - -/** - * SM_Object is an internal part of the Sumo physics engine. - * - * It encapsulates an object in the physics scene, and is responsible - * for calculating the collision response of objects. - */ -class SM_Object -{ -public: - SM_Object() ; - SM_Object( - DT_ShapeHandle shape, - const SM_MaterialProps *materialProps, - const SM_ShapeProps *shapeProps, - SM_Object *dynamicParent - ); - virtual ~SM_Object(); - - bool isDynamic() const; - - /* nzc experimental. There seem to be two places where kinematics - * are evaluated: proceedKinematic (called from SM_Scene) and - * proceed() in this object. I'll just try and bunge these out for - * now. */ - - void suspend(void); - void resume(void); - - void suspendDynamics(); - - void restoreDynamics(); - - bool isGhost() const; - - void suspendMaterial(); - - void restoreMaterial(); - - SM_FhObject *getFhObject() const; - - void registerCallback(SM_Callback& callback); - - void calcXform(); - void notifyClient(); - void updateInvInertiaTensor(); - - - // Save the current state information for use in the - // velocity computation in the next frame. - - void proceedKinematic(MT_Scalar timeStep); - - void saveReactionForce(MT_Scalar timeStep) ; - - void clearForce() ; - - void clearMomentum() ; - - void setMargin(MT_Scalar margin) ; - - MT_Scalar getMargin() const ; - - const SM_MaterialProps *getMaterialProps() const ; - - const SM_ShapeProps *getShapeProps() const ; - - void setPosition(const MT_Point3& pos); - void setOrientation(const MT_Quaternion& orn); - void setScaling(const MT_Vector3& scaling); - - /** - * set an external velocity. This velocity complements - * the physics velocity. So setting it does not override the - * physics velocity. It is your responsibility to clear - * this external velocity. This velocity is not subject to - * friction or damping. - */ - void setExternalLinearVelocity(const MT_Vector3& lin_vel) ; - void addExternalLinearVelocity(const MT_Vector3& lin_vel) ; - - /** Override the physics velocity */ - void addLinearVelocity(const MT_Vector3& lin_vel); - void setLinearVelocity(const MT_Vector3& lin_vel); - - /** - * Set an external angular velocity. This velocity complemetns - * the physics angular velocity so does not override it. It is - * your responsibility to clear this velocity. This velocity - * is not subject to friction or damping. - */ - void setExternalAngularVelocity(const MT_Vector3& ang_vel) ; - void addExternalAngularVelocity(const MT_Vector3& ang_vel); - - /** Override the physics angular velocity */ - void addAngularVelocity(const MT_Vector3& ang_vel); - void setAngularVelocity(const MT_Vector3& ang_vel); - - /** Clear the external velocities */ - void clearCombinedVelocities(); - - /** - * Tell the physics system to combine the external velocity - * with the physics velocity. - */ - void resolveCombinedVelocities( - const MT_Vector3 & lin_vel, - const MT_Vector3 & ang_vel - ) ; - - - - MT_Scalar getInvMass() const; - - const MT_Vector3& getInvInertia() const ; - - const MT_Matrix3x3& getInvInertiaTensor() const; - - void applyForceField(const MT_Vector3& accel) ; - - void applyCenterForce(const MT_Vector3& force) ; - - void applyTorque(const MT_Vector3& torque) ; - - /** - * Apply an impulse to the object. The impulse will be split into - * angular and linear components. - * @param attach point to apply the impulse to (in world coordinates) - */ - void applyImpulse(const MT_Point3& attach, const MT_Vector3& impulse) ; - - /** - * Applies an impulse through the center of this object. (ie the angular - * velocity will not change. - */ - void applyCenterImpulse(const MT_Vector3& impulse); - /** - * Applies an angular impulse. - */ - void applyAngularImpulse(const MT_Vector3& impulse); - - MT_Point3 getWorldCoord(const MT_Point3& local) const; - MT_Point3 getLocalCoord(const MT_Point3& world) const; - - MT_Vector3 getVelocity(const MT_Point3& local) const; - - - const MT_Vector3& getReactionForce() const ; - - void getMatrix(double *m) const ; - - const double *getMatrix() const ; - - // Still need this??? - const MT_Transform& getScaledTransform() const; - - DT_ObjectHandle getObjectHandle() const ; - DT_ShapeHandle getShapeHandle() const ; - - SM_Object *getDynamicParent() ; - - void integrateForces(MT_Scalar timeStep); - void integrateMomentum(MT_Scalar timeSteo); - - void setRigidBody(bool is_rigid_body) ; - - bool isRigidBody() const ; - - // This is the callback for handling collisions of dynamic objects - static - DT_Bool - boing( - void *client_data, - void *object1, - void *object2, - const DT_CollData *coll_data - ); - - static - DT_Bool - fix( - void *client_data, - void *object1, - void *object2, - const DT_CollData *coll_data - ); - - - SM_ClientObject *getClientObject() { return m_client_object; } - void setClientObject(SM_ClientObject *client_object) { m_client_object = client_object; } - void setPhysicsClientObject(void* physicsClientObject) - { - m_physicsClientObject = physicsClientObject; - } - void* getPhysicsClientObject() { - return m_physicsClientObject; - } - void relax(); - - SM_MotionState &getCurrentFrame(); - SM_MotionState &getPreviousFrame(); - SM_MotionState &getNextFrame(); - - const SM_MotionState &getCurrentFrame() const; - const SM_MotionState &getPreviousFrame() const; - const SM_MotionState &getNextFrame() const; - - // Motion state functions - const MT_Point3& getPosition() const; - const MT_Quaternion& getOrientation() const; - const MT_Vector3& getLinearVelocity() const; - const MT_Vector3& getAngularVelocity() const; - - MT_Scalar getTime() const; - - void setTime(MT_Scalar time); - - void interpolate(MT_Scalar timeStep); - void endFrame(); - -private: - friend class Contact; - // Tweak parameters - static MT_Scalar ImpulseThreshold; - - // return the actual linear_velocity of this object this - // is the addition of m_combined_lin_vel and m_lin_vel. - - const - MT_Vector3 - actualLinVelocity( - ) const ; - - const - MT_Vector3 - actualAngVelocity( - ) const ; - - void dynamicCollision(const MT_Point3 &local2, - const MT_Vector3 &normal, - MT_Scalar dist, - const MT_Vector3 &rel_vel, - MT_Scalar restitution, - MT_Scalar friction_factor, - MT_Scalar invMass - ); - - typedef std::vector<SM_Callback *> T_CallbackList; - - - T_CallbackList m_callbackList; // Each object can have multiple callbacks from the client (=game engine) - SM_Object *m_dynamicParent; // Collisions between parent and children are ignored - - // as the collision callback now has only information - // on an SM_Object, there must be a way that the SM_Object client - // can identify it's clientdata after a collision - SM_ClientObject *m_client_object; - - void* m_physicsClientObject; - - DT_ShapeHandle m_shape; // Shape for collision detection - - // Material and shape properties are not owned by this class. - - const SM_MaterialProps *m_materialProps; - const SM_MaterialProps *m_materialPropsBackup; // Backup in case the object temporarily becomes a ghost. - const SM_ShapeProps *m_shapeProps; - const SM_ShapeProps *m_shapePropsBackup; // Backup in case the object's dynamics is temporarily suspended - DT_ObjectHandle m_object; // A handle to the corresponding object in SOLID. - MT_Scalar m_margin; // Offset for the object's shape (also for collision detection) - MT_Vector3 m_scaling; // Non-uniform scaling of the object's shape - - double m_ogl_matrix[16]; // An OpenGL-type 4x4 matrix - MT_Transform m_xform; // The object's local coordinate system - MT_Transform m_prev_xform; // The object's local coordinate system in the previous frame - SM_MotionState m_prev_state; // The object's motion state in the previous frame - MT_Scalar m_timeStep; // The duration of the last frame - - MT_Vector3 m_reaction_impulse; // The accumulated impulse resulting from collisions - MT_Vector3 m_reaction_force; // The reaction force derived from the reaction impulse - - MT_Vector3 m_lin_mom; // Linear momentum (linear velocity times mass) - MT_Vector3 m_ang_mom; // Angular momentum (angualr velocity times inertia) - MT_Vector3 m_force; // Force on center of mass (afffects linear momentum) - MT_Vector3 m_torque; // Torque around center of mass (affects angular momentum) - - SM_MotionState m_frames[3]; - - MT_Vector3 m_error; // Error in position:- amount object must be moved to prevent intersection with scene - - // Here are the values of externally set linear and angular - // velocity. These are updated from the outside - // (actuators and python) each frame and combined with the - // physics values. At the end of each frame (at the end of a - // call to proceed) they are set to zero. This allows the - // outside world to contribute to the velocity of an object - // but still have it react to physics. - - MT_Vector3 m_combined_lin_vel; - MT_Vector3 m_combined_ang_vel; - - // The force and torque are the accumulated forces and torques applied by the client (game logic, python). - - SM_FhObject *m_fh_object; // The ray object used for Fh - bool m_suspended; // Is this object frozen? - - // Mass properties - MT_Scalar m_inv_mass; // 1/mass - MT_Vector3 m_inv_inertia; // [1/inertia_x, 1/inertia_y, 1/inertia_z] - MT_Matrix3x3 m_inv_inertia_tensor; // Inverse Inertia Tensor - - bool m_kinematic; // Have I been displaced (translated, rotated, scaled) in this frame? - bool m_prev_kinematic; // Have I been displaced (translated, rotated, scaled) in the previous frame? - bool m_is_rigid_body; // Should friction give me a change in angular momentum? - int m_static; // temporarily static. - -}; - -#endif - diff --git a/source/gameengine/Physics/Sumo/Fuzzics/include/SM_Props.h b/source/gameengine/Physics/Sumo/Fuzzics/include/SM_Props.h deleted file mode 100644 index 81b4cb55b45..00000000000 --- a/source/gameengine/Physics/Sumo/Fuzzics/include/SM_Props.h +++ /dev/null @@ -1,58 +0,0 @@ -/** - * $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 ***** - */ -#ifndef SM_PROPSH -#define SM_PROPSH - -#include <MT_Scalar.h> - -// Properties of dynamic objects -struct SM_ShapeProps { - MT_Scalar m_mass; // Total mass - MT_Scalar m_inertia; // Inertia, should be a tensor some time - MT_Scalar m_lin_drag; // Linear drag (air, water) 0 = concrete, 1 = vacuum - MT_Scalar m_ang_drag; // Angular drag - MT_Scalar m_friction_scaling[3]; // Scaling for anisotropic friction. Component in range [0, 1] - bool m_do_anisotropic; // Should I do anisotropic friction? - bool m_do_fh; // Should the object have a linear Fh spring? - bool m_do_rot_fh; // Should the object have an angular Fh spring? -}; - - -// Properties of collidable objects (non-ghost objects) -struct SM_MaterialProps { - MT_Scalar m_restitution; // restitution of energie after a collision 0 = inelastic, 1 = elastic - MT_Scalar m_friction; // Coulomb friction (= ratio between the normal en maximum friction force) - MT_Scalar m_fh_spring; // Spring constant (both linear and angular) - MT_Scalar m_fh_damping; // Damping factor (linear and angular) in range [0, 1] - MT_Scalar m_fh_distance; // The range above the surface where Fh is active. - bool m_fh_normal; // Should the object slide off slopes? -}; - -#endif //SM_PROPSH - diff --git a/source/gameengine/Physics/Sumo/Fuzzics/include/SM_Scene.h b/source/gameengine/Physics/Sumo/Fuzzics/include/SM_Scene.h deleted file mode 100644 index 3d8eef2bae0..00000000000 --- a/source/gameengine/Physics/Sumo/Fuzzics/include/SM_Scene.h +++ /dev/null @@ -1,172 +0,0 @@ -/** - * $Id$ - * Copyright (C) 2001 NaN Technologies B.V. - * The physics scene. - * - * ***** 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 ***** - */ -#ifndef SM_SCENE_H -#define SM_SCENE_H - -#ifdef WIN32 -#pragma warning (disable : 4786) -#endif - -#include <vector> -#include <set> -#include <utility> //needed for pair - -#include <SOLID/SOLID.h> - -#include "MT_Vector3.h" -#include "MT_Point3.h" - -#include "SM_Object.h" - -enum -{ - FH_RESPONSE, - SENSOR_RESPONSE, /* Touch Sensors */ - CAMERA_RESPONSE, /* Visibility Culling */ - OBJECT_RESPONSE, /* Object Dynamic Geometry Response */ - STATIC_RESPONSE, /* Static Geometry Response */ - - NUM_RESPONSE -}; - -class SM_Scene { -public: - SM_Scene(); - - ~SM_Scene(); - - DT_RespTableHandle getRespTableHandle() const { - return m_respTable; - } - - const MT_Vector3& getForceField() const { - return m_forceField; - } - - MT_Vector3& getForceField() { - return m_forceField; - } - - void setForceField(const MT_Vector3& forceField) { - m_forceField = forceField; - } - - void addTouchCallback(int response_class, DT_ResponseCallback callback, void *user); - - void addSensor(SM_Object& object); - void add(SM_Object& object); - void remove(SM_Object& object); - - void notifyCollision(SM_Object *obj1, SM_Object *obj2); - - void setSecondaryRespTable(DT_RespTableHandle secondaryRespTable); - DT_RespTableHandle getSecondaryRespTable() { return m_secondaryRespTable; } - - void requestCollisionCallback(SM_Object &object); - - void beginFrame(); - void endFrame(); - - // Perform an integration step of duration 'timeStep'. - // 'subSampling' is the maximum duration of a substep, i.e., - // The maximum time interval between two collision checks. - // 'subSampling' can be used to control aliasing effects - // (fast moving objects traversing through walls and such). - bool proceed(MT_Scalar curtime, MT_Scalar ticrate); - void proceed(MT_Scalar subStep); - - /** - * Test whether any objects lie on the line defined by from and - * to. The search returns the first such bject starting at from, - * or NULL if there was none. - * @returns A reference to the object, or NULL if there was none. - * @param ignore_client Do not look for collisions with this - * object. This can be useful to avoid self-hits if - * starting from the location of an object. - * @param from The start point, in world coordinates, of the search. - * @param to The end point, in world coordinates, of the search. - * @param result A store to return the point where intersection - * took place (if there was an intersection). - * @param normal A store to return the normal of the hit object on - * the location of the intersection, if it took place. - */ - SM_Object *rayTest(void *ignore_client, - const MT_Point3& from, const MT_Point3& to, - MT_Point3& result, MT_Vector3& normal) const; - -private: - - // Clear the user set velocities. - void clearObjectCombinedVelocities(); - // This is the callback for handling collisions of dynamic objects - static - DT_Bool - boing( - void *client_data, - void *object1, - void *object2, - const DT_CollData *coll_data - ); - - /** internal type */ - typedef std::vector<SM_Object *> T_ObjectList; - - /** Handle to the scene in SOLID */ - DT_SceneHandle m_scene; - /** Following response table contains the callbacks for the dynmics */ - DT_RespTableHandle m_respTable; - DT_ResponseClass m_ResponseClass[NUM_RESPONSE]; - /** - * Following response table contains callbacks for the client (= - * game engine) */ - DT_RespTableHandle m_secondaryRespTable; // Handle - DT_ResponseClass m_secondaryResponseClass[NUM_RESPONSE]; - - /** - * Following resposne table contains callbacks for fixing the simulation - * ie making sure colliding objects do not intersect. - */ - DT_RespTableHandle m_fixRespTable; - DT_ResponseClass m_fixResponseClass[NUM_RESPONSE]; - - /** The acceleration from the force field */ - MT_Vector3 m_forceField; - - /** - * The list of objects that receive motion updates and do - * collision tests. */ - T_ObjectList m_objectList; - - unsigned int m_frames; -}; - -#endif - diff --git a/source/gameengine/Physics/Sumo/Fuzzics/sample/Makefile b/source/gameengine/Physics/Sumo/Fuzzics/sample/Makefile deleted file mode 100644 index 672dff39028..00000000000 --- a/source/gameengine/Physics/Sumo/Fuzzics/sample/Makefile +++ /dev/null @@ -1,25 +0,0 @@ -# -# $Id$ -# Copyright (C) 2001 NaN Technologies B.V. - -DIR = $(OCGDIR)/sumo -ALLTARGETS = $(OBJS) $(DIR)/$(DEBUG_DIR)particle $(DIR)/$(DEBUG_DIR)particle0 - -include nan_compile.mk - -CPPFLAGS = -I../../include -I../include -I$(NAN_MOTO)/include -CPPFLAGS += -I$(OPENGL_HEADERS) - -clean:: - @$(RM) $(DIR)/particle $(DIR)/particle0 - @$(RM) $(DIR)/debug/particle $(DIR)/debug/particle0 - -LDFLAGS = -L$(DIR) -L/usr/X11R6/lib -OGL_LDLIBS = -lglut -lGLU -lGL -pthread -LDLIBS = -lfuzzics -lsolid $(NAN_MOTO)/lib/libmoto.a $(OGL_LDLIBS) - -$(DIR)/$(DEBUG_DIR)particle: particle.o $(DIR)/$(DEBUG_DIR)libfuzzics.a $(DIR)/$(DEBUG_DIR)libsolid.a - $(CCC) $(CCFLAGS) $(CPPFLAGS) $(LDFLAGS) $< -o $@ $(LDLIBS) - -$(DIR)/$(DEBUG_DIR)particle0: particle0.o $(DIR)/$(DEBUG_DIR)libfuzzics.a $(DIR)/$(DEBUG_DIR)libsolid.a - $(CCC) $(CCFLAGS) $(CPPFLAGS) $(LDFLAGS) $< -o $@ $(LDLIBS) diff --git a/source/gameengine/Physics/Sumo/Fuzzics/sample/particle.cpp b/source/gameengine/Physics/Sumo/Fuzzics/sample/particle.cpp deleted file mode 100644 index d7aca326b42..00000000000 --- a/source/gameengine/Physics/Sumo/Fuzzics/sample/particle.cpp +++ /dev/null @@ -1,709 +0,0 @@ -//#define FAKE_IT -#define USE_COMPLEX -#define QUADS - -#include <algorithm> -#include <new> -#include <GL/glut.h> - -#include "MT_MinMax.h" -#include "MT_Point3.h" -#include "MT_Vector3.h" -#include "MT_Quaternion.h" -#include "MT_Matrix3x3.h" -#include "MT_Transform.h" - -#include "SM_Object.h" -#include "SM_FhObject.h" -#include "SM_Scene.h" - -#include <SOLID/SOLID.h> - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -const MT_Scalar bowl_curv = 0.10; -const MT_Scalar timeStep = 0.02; -const MT_Scalar ground_margin = 0.0; -const MT_Scalar sphere_radius = 0.5; - -const MT_Vector3 gravity(0, -9.8, 0); - -static MT_Scalar DISTANCE = 5; - -static MT_Scalar ele = 0, azi = 0; -static MT_Point3 eye(0, 0, DISTANCE); -static MT_Point3 center(0, 0, 0); - -inline double irnd() { return 2 * MT_random() - 1; } - -static const double SCALE_BOTTOM = 0.5; -static const double SCALE_FACTOR = 2.0; - -SM_ShapeProps g_shapeProps = { - 1.0, // mass - 1.0, // inertia - 0.1, // linear drag - 0.1, // angular drag - { 1.0, 0.0, 0.0 }, // anisotropic friction - false, // do anisotropic friction? - true, // do fh? - true // do rot fh? -}; - -SM_MaterialProps g_materialProps = { - 0.7, // restitution - 0.0, // friction - 10.0, // Fh spring constant - 1.0, // Fh damping - 0.5, // Fh distance - true // Fh leveling -}; - - -void toggleIdle(); - - -void newRandom(); - -void coordSystem() { - glDisable(GL_LIGHTING); - glBegin(GL_LINES); - glColor3f(1, 0, 0); - glVertex3d(0, 0, 0); - glVertex3d(10, 0, 0); - glColor3f(0, 1, 0); - glVertex3d(0, 0, 0); - glVertex3d(0, 10, 0); - glColor3f(0, 0, 1); - glVertex3d(0, 0, 0); - glVertex3d(0, 0, 10); - glEnd(); - glEnable(GL_LIGHTING); -} - - -void display_bbox(const MT_Point3& min, const MT_Point3& max) { - glDisable(GL_DEPTH_TEST); - glDisable(GL_LIGHTING); - glColor3f(0, 1, 1); - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - glBegin(GL_QUAD_STRIP); - glVertex3d(min[0], min[1], min[2]); - glVertex3d(min[0], min[1], max[2]); - glVertex3d(max[0], min[1], min[2]); - glVertex3d(max[0], min[1], max[2]); - glVertex3d(max[0], max[1], min[2]); - glVertex3d(max[0], max[1], max[2]); - glVertex3d(min[0], max[1], min[2]); - glVertex3d(min[0], max[1], max[2]); - glVertex3d(min[0], min[1], min[2]); - glVertex3d(min[0], min[1], max[2]); - glEnd(); - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - glEnable(GL_LIGHTING); - glEnable(GL_DEPTH_TEST); -} - - - - -class GLShape { -public: - virtual void paint(GLdouble *m) const = 0; -}; - - -class GLSphere : public GLShape { - MT_Scalar radius; -public: - GLSphere(MT_Scalar r) : radius(r) {} - - void paint(GLdouble *m) const { - glPushMatrix(); - glLoadMatrixd(m); - coordSystem(); - glutSolidSphere(radius, 20, 20); - glPopMatrix(); - } -}; - - -class GLBox : public GLShape { - MT_Vector3 extent; -public: - GLBox(MT_Scalar x, MT_Scalar y, MT_Scalar z) : - extent(x, y, z) {} - - void paint(GLdouble *m) const { - glPushMatrix(); - glLoadMatrixd(m); - coordSystem(); - glPushMatrix(); - glScaled(extent[0], extent[1], extent[2]); - glutSolidCube(1.0); - glPopMatrix(); - glPopMatrix(); - } -}; - - -class GLCone : public GLShape { - MT_Scalar bottomRadius; - MT_Scalar height; - mutable GLuint displayList; - -public: - GLCone(MT_Scalar r, MT_Scalar h) : - bottomRadius(r), - height(h), - displayList(0) {} - - void paint(GLdouble *m) const { - glPushMatrix(); - glLoadMatrixd(m); - coordSystem(); - if (displayList) glCallList(displayList); - else { - GLUquadricObj *quadObj = gluNewQuadric(); - displayList = glGenLists(1); - glNewList(displayList, GL_COMPILE_AND_EXECUTE); - glPushMatrix(); - glRotatef(-90.0, 1.0, 0.0, 0.0); - glTranslatef(0.0, 0.0, -1.0); - gluQuadricDrawStyle(quadObj, (GLenum)GLU_FILL); - gluQuadricNormals(quadObj, (GLenum)GLU_SMOOTH); - gluCylinder(quadObj, bottomRadius, 0, height, 15, 10); - glPopMatrix(); - glEndList(); - } - glPopMatrix(); - } -}; - -class GLCylinder : public GLShape { - MT_Scalar radius; - MT_Scalar height; - mutable GLuint displayList; - -public: - GLCylinder(MT_Scalar r, MT_Scalar h) : - radius(r), - height(h), - displayList(0) {} - - void paint(GLdouble *m) const { - glPushMatrix(); - glLoadMatrixd(m); - coordSystem(); - if (displayList) glCallList(displayList); - else { - GLUquadricObj *quadObj = gluNewQuadric(); - displayList = glGenLists(1); - glNewList(displayList, GL_COMPILE_AND_EXECUTE); - glPushMatrix(); - glRotatef(-90.0, 1.0, 0.0, 0.0); - glTranslatef(0.0, 0.0, -1.0); - gluQuadricDrawStyle(quadObj, (GLenum)GLU_FILL); - gluQuadricNormals(quadObj, (GLenum)GLU_SMOOTH); - gluCylinder(quadObj, radius, radius, height, 15, 10); - glPopMatrix (); - glEndList(); - } - glPopMatrix(); - } -}; - -class Object; - -class Callback : public SM_Callback { -public: - Callback(Object& object) : m_object(object) {} - - virtual void do_me(); - -private: - Object& m_object; -}; - - -class Object { -public: - Object(GLShape *gl_shape, SM_Object& object) : - m_gl_shape(gl_shape), - m_object(object), - m_callback(*this) - { - m_object.registerCallback(m_callback); - } - - ~Object() {} - - void paint() { - if (m_gl_shape) { - m_gl_shape->paint(m); - // display_bbox(m_bbox.lower(), m_bbox.upper()); - } - } - - void print_reaction_force() const { - std::cout << m_object.getReactionForce() << std::endl; - } - - MT_Vector3 getAhead() { - return MT_Vector3(&m[4]); - } - - MT_Vector3 getUp() { - return MT_Vector3(&m[8]); - } - - void clearMomentum() { - m_object.clearMomentum(); - } - - void setMargin(MT_Scalar margin) { - m_object.setMargin(margin); - } - - void setScaling(const MT_Vector3& scaling) { - m_object.setScaling(scaling); - } - - const MT_Point3& getPosition() { - return m_object.getPosition(); - } - - void setPosition(const MT_Point3& pos) { - m_object.setPosition(pos); - } - - void setOrientation(const MT_Quaternion& orn) { - m_object.setOrientation(orn); - } - - void applyCenterForce(const MT_Vector3& force) { - m_object.applyCenterForce(force); - } - - void applyTorque(const MT_Vector3& torque) { - m_object.applyTorque(torque); - } - - MT_Point3 getWorldCoord(const MT_Point3& local) const { - return m_object.getWorldCoord(local); - } - - MT_Vector3 getLinearVelocity() const { - return m_object.getLinearVelocity(); - } - - MT_Vector3 getAngularVelocity() const { - return m_object.getAngularVelocity(); - } - - void setMatrix() { - m_object.calcXform(); - m_object.getMatrix(m); - } - - const double *getMatrix() { - m_object.calcXform(); - return m_object.getMatrix(); - } - -private: - GLShape *m_gl_shape; - SM_Object& m_object; - DT_Scalar m[16]; - Callback m_callback; -}; - - - -const MT_Scalar SPACE_SIZE = 2; - -static GLSphere gl_sphere(sphere_radius); -static GLBox gl_ground(50.0, 0.0, 50.0); - - - -#ifdef USE_COMPLEX - -const int GRID_SCALE = 10; -const MT_Scalar GRID_UNIT = 25.0 / GRID_SCALE; - -DT_ShapeHandle createComplex() { - DT_ShapeHandle shape = DT_NewComplexShape(); - for (int i0 = -GRID_SCALE; i0 != GRID_SCALE; ++i0) { - for (int j0 = -GRID_SCALE; j0 != GRID_SCALE; ++j0) { - int i1 = i0 + 1; - int j1 = j0 + 1; -#ifdef QUADS - DT_Begin(); - DT_Vertex(GRID_UNIT * i0, bowl_curv * i0*i0, GRID_UNIT * j0); - DT_Vertex(GRID_UNIT * i0, bowl_curv * i0*i0, GRID_UNIT * j1); - DT_Vertex(GRID_UNIT * i1, bowl_curv * i1*i1, GRID_UNIT * j1); - DT_Vertex(GRID_UNIT * i1, bowl_curv * i1*i1, GRID_UNIT * j0); - DT_End(); -#else - DT_Begin(); - DT_Vertex(GRID_UNIT * i0, 0, GRID_UNIT * j0); - DT_Vertex(GRID_UNIT * i0, 0, GRID_UNIT * j1); - DT_Vertex(GRID_UNIT * i1, 0, GRID_UNIT * j1); - DT_End(); - - DT_Begin(); - DT_Vertex(GRID_UNIT * i0, 0, GRID_UNIT * j1); - DT_Vertex(GRID_UNIT * i1, 0, GRID_UNIT * j1); - DT_Vertex(GRID_UNIT * i1, 0, GRID_UNIT * j0); - DT_End(); -#endif - - } - } - DT_EndComplexShape(); - return shape; -} - - -static DT_ShapeHandle ground_shape = createComplex(); - -#else - -static DT_ShapeHandle ground_shape = DT_Box(50, 0, 50); - -#endif - -static SM_Object sm_ground(ground_shape, &g_materialProps, 0, 0); -static Object ground(&gl_ground, sm_ground); - -static SM_Object sm_sphere(DT_Sphere(0.0), &g_materialProps, &g_shapeProps, 0); -static Object object(&gl_sphere, sm_sphere); - - -static SM_Scene g_scene; - - -bool g_hit = false; -MT_Point3 g_spot; -MT_Vector3 g_normal; - - -void Callback::do_me() -{ - m_object.setMatrix(); - m_object.print_reaction_force(); -} - -void myinit(void) { - - GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 }; - GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 }; - GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 }; - - /* light_position is NOT default value */ - GLfloat light_position0[] = { 1.0, 1.0, 1.0, 0.0 }; - GLfloat light_position1[] = { -1.0, -1.0, -1.0, 0.0 }; - - glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); - glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); - glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); - glLightfv(GL_LIGHT0, GL_POSITION, light_position0); - - glLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient); - glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse); - glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular); - glLightfv(GL_LIGHT1, GL_POSITION, light_position1); - - - glEnable(GL_LIGHTING); - glEnable(GL_LIGHT0); - glEnable(GL_LIGHT1); - - glShadeModel(GL_SMOOTH); - - glEnable(GL_DEPTH_TEST); - glDepthFunc(GL_LESS); - - // glEnable(GL_CULL_FACE); - // glCullFace(GL_BACK); - - ground.setPosition(MT_Point3(0, -10, 0)); - ground.setOrientation(MT_Quaternion(0, 0, 0, 1)); - ground.setMatrix(); - center.setValue(0.0, 0.0, 0.0); - sm_ground.setMargin(ground_margin); - - g_scene.setForceField(gravity); - g_scene.add(sm_ground); - - object.setMargin(sphere_radius); - - g_scene.add(sm_sphere); - - - newRandom(); -} - - -//MT_Point3 cp1, cp2; -//bool intersection; - -void display(void) { - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - ground.paint(); - object.paint(); - - if (g_hit) { - glDisable(GL_LIGHTING); - glColor3f(1, 0, 0); - - glPointSize(5); - glBegin(GL_POINTS); - glVertex3d(g_spot[0], g_spot[1], g_spot[2]); - glEnd(); - glPointSize(1); - - glColor3f(1, 1, 0); - glBegin(GL_LINES); - glVertex3d(g_spot[0], g_spot[1], g_spot[2]); - glVertex3d(g_spot[0] + g_normal[0], - g_spot[1] + g_normal[1], - g_spot[2] + g_normal[2]); - glEnd(); - glEnable(GL_LIGHTING); - } - - - -#ifdef COLLISION - glDisable(GL_DEPTH_TEST); - glDisable(GL_LIGHTING); - glColor3f(1, 1, 0); - if (intersection) { - glPointSize(5); - glBegin(GL_POINTS); - glVertex3d(cp1[0], cp1[1], cp1[2]); - glEnd(); - glPointSize(1); - } - else { - glBegin(GL_LINES); - glVertex3d(cp1[0], cp1[1], cp1[2]); - glVertex3d(cp2[0], cp2[1], cp2[2]); - glEnd(); - } - glEnable(GL_LIGHTING); - glEnable(GL_DEPTH_TEST); -#endif - - glFlush(); - glutSwapBuffers(); -} - - - - - -void newRandom() { - object.setPosition(MT_Point3(0, 0, 0)); - object.setOrientation(MT_Quaternion::random()); - object.clearMomentum(); - object.setMatrix(); - - display(); -} - -void moveAndDisplay() { - g_scene.proceed(timeStep, 0.01); - - display(); - g_hit = false; -} - - -void turn_left() { - object.applyTorque(5.0 * object.getUp()); -} - -void turn_right() { - object.applyTorque(-5.0 * object.getUp()); -} - -void forward() { - object.applyCenterForce(10.0 * object.getAhead()); -} - -void backward() { - object.applyCenterForce(-10.0 * object.getAhead()); -} - -void jump() { - object.applyCenterForce(MT_Vector3(0.0, 200.0, 0.0)); -} - - -void toggleIdle() { - static bool idle = true; - if (idle) { - glutIdleFunc(moveAndDisplay); - idle = false; - } - else { - glutIdleFunc(NULL); - idle = true; - } -} - - -void setCamera() { - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 200.0); - MT_Scalar rele = MT_radians(ele); - MT_Scalar razi = MT_radians(azi); - eye.setValue(DISTANCE * sin(razi) * cos(rele), - DISTANCE * sin(rele), - DISTANCE * cos(razi) * cos(rele)); - gluLookAt(eye[0], eye[1], eye[2], - center[0], center[1], center[2], - 0, 1, 0); - glMatrixMode(GL_MODELVIEW); - display(); -} - -const MT_Scalar STEPSIZE = 5; - -void stepLeft() { azi -= STEPSIZE; if (azi < 0) azi += 360; setCamera(); } -void stepRight() { azi += STEPSIZE; if (azi >= 360) azi -= 360; setCamera(); } -void stepFront() { ele += STEPSIZE; if (azi >= 360) azi -= 360; setCamera(); } -void stepBack() { ele -= STEPSIZE; if (azi < 0) azi += 360; setCamera(); } -void zoomIn() { DISTANCE -= 1; setCamera(); } -void zoomOut() { DISTANCE += 1; setCamera(); } - - -void myReshape(int w, int h) { - glViewport(0, 0, w, h); - setCamera(); -} - -void myKeyboard(unsigned char key, int x, int y) -{ - switch (key) - { - case 'w': forward(); break; - case 's': backward(); break; - case 'a': turn_left(); break; - case 'd': turn_right(); break; - case 'e': jump(); break; - case 'l' : stepLeft(); break; - case 'r' : stepRight(); break; - case 'f' : stepFront(); break; - case 'b' : stepBack(); break; - case 'z' : zoomIn(); break; - case 'x' : zoomOut(); break; - case 'i' : toggleIdle(); break; - case ' ' : newRandom(); break; - default: -// std::cout << "unused key : " << key << std::endl; - break; - } -} - -void mySpecial(int key, int x, int y) -{ - switch (key) - { - case GLUT_KEY_LEFT : stepLeft(); break; - case GLUT_KEY_RIGHT : stepRight(); break; - case GLUT_KEY_UP : stepFront(); break; - case GLUT_KEY_DOWN : stepBack(); break; - case GLUT_KEY_PAGE_UP : zoomIn(); break; - case GLUT_KEY_PAGE_DOWN : zoomOut(); break; - case GLUT_KEY_HOME : toggleIdle(); break; - default: -// std::cout << "unused (special) key : " << key << std::endl; - break; - } -} - -void goodbye( void) -{ - g_scene.remove(sm_ground); - g_scene.remove(sm_sphere); - - std::cout << "goodbye ..." << std::endl; - exit(0); -} - -void menu(int choice) -{ - - static int fullScreen = 0; - static int px, py, sx, sy; - - switch(choice) { - case 1: - if (fullScreen == 1) { - glutPositionWindow(px,py); - glutReshapeWindow(sx,sy); - glutChangeToMenuEntry(1,"Full Screen",1); - fullScreen = 0; - } else { - px=glutGet((GLenum)GLUT_WINDOW_X); - py=glutGet((GLenum)GLUT_WINDOW_Y); - sx=glutGet((GLenum)GLUT_WINDOW_WIDTH); - sy=glutGet((GLenum)GLUT_WINDOW_HEIGHT); - glutFullScreen(); - glutChangeToMenuEntry(1,"Close Full Screen",1); - fullScreen = 1; - } - break; - case 2: - toggleIdle(); - break; - case 3: - goodbye(); - break; - default: - break; - } -} - -void createMenu() -{ - glutCreateMenu(menu); - glutAddMenuEntry("Full Screen", 1); - glutAddMenuEntry("Toggle Idle (Start/Stop)", 2); - glutAddMenuEntry("Quit", 3); - glutAttachMenu(GLUT_RIGHT_BUTTON); -} - -int main(int argc, char **argv) { - glutInit(&argc, argv); - glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); - glutInitWindowPosition(0, 0); - glutInitWindowSize(500, 500); - glutCreateWindow("Physics demo"); - - myinit(); - glutKeyboardFunc(myKeyboard); - glutSpecialFunc(mySpecial); - glutReshapeFunc(myReshape); - createMenu(); - glutIdleFunc(NULL); - - glutDisplayFunc(display); - glutMainLoop(); - return 0; -} - - - - - - - diff --git a/source/gameengine/Physics/Sumo/Fuzzics/sample/particle0.cpp b/source/gameengine/Physics/Sumo/Fuzzics/sample/particle0.cpp deleted file mode 100644 index cdf0a2d8f64..00000000000 --- a/source/gameengine/Physics/Sumo/Fuzzics/sample/particle0.cpp +++ /dev/null @@ -1,695 +0,0 @@ -//#define FAKE_IT -#define USE_COMPLEX -#define QUADS - -#include <algorithm> -#include <new> -#include <GL/glut.h> - -#include "MT_MinMax.h" -#include "MT_Point3.h" -#include "MT_Vector3.h" -#include "MT_Quaternion.h" -#include "MT_Matrix3x3.h" -#include "MT_Transform.h" - -#include "SM_Object.h" -#include "SM_Scene.h" - -#include "solid.h" - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -const MT_Scalar bowl_curv = 0.10; -const MT_Scalar timeStep = 0.04; -const MT_Scalar ground_margin = 0.0; -const MT_Scalar sphere_radius = 0.5; - -const MT_Vector3 gravity(0, -9.8, 0); - -static MT_Scalar DISTANCE = 5; - -static MT_Scalar ele = 0, azi = 0; -static MT_Point3 eye(0, 0, DISTANCE); -static MT_Point3 center(0, 0, 0); - -inline double irnd() { return 2 * MT_random() - 1; } - -static const double SCALE_BOTTOM = 0.5; -static const double SCALE_FACTOR = 2.0; - -SM_ShapeProps g_shapeProps = { - 1.0, // mass - 1.0, // inertia - 0.9, // linear drag - 0.9 // angular drag -}; - -SM_MaterialProps g_materialProps = { - 0.7, // restitution - 0.0, // friction - 0.0, // spring constant - 0.0 // damping -}; - - -void toggleIdle(); - - -void newRandom(); - -void coordSystem() { - glDisable(GL_LIGHTING); - glBegin(GL_LINES); - glColor3f(1, 0, 0); - glVertex3d(0, 0, 0); - glVertex3d(10, 0, 0); - glColor3f(0, 1, 0); - glVertex3d(0, 0, 0); - glVertex3d(0, 10, 0); - glColor3f(0, 0, 1); - glVertex3d(0, 0, 0); - glVertex3d(0, 0, 10); - glEnd(); - glEnable(GL_LIGHTING); -} - - -void display_bbox(const MT_Point3& min, const MT_Point3& max) { - glDisable(GL_DEPTH_TEST); - glDisable(GL_LIGHTING); - glColor3f(0, 1, 1); - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - glBegin(GL_QUAD_STRIP); - glVertex3d(min[0], min[1], min[2]); - glVertex3d(min[0], min[1], max[2]); - glVertex3d(max[0], min[1], min[2]); - glVertex3d(max[0], min[1], max[2]); - glVertex3d(max[0], max[1], min[2]); - glVertex3d(max[0], max[1], max[2]); - glVertex3d(min[0], max[1], min[2]); - glVertex3d(min[0], max[1], max[2]); - glVertex3d(min[0], min[1], min[2]); - glVertex3d(min[0], min[1], max[2]); - glEnd(); - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - glEnable(GL_LIGHTING); - glEnable(GL_DEPTH_TEST); -} - - - - -class GLShape { -public: - virtual void paint(GLdouble *m) const = 0; -}; - - -class GLSphere : public GLShape { - MT_Scalar radius; -public: - GLSphere(MT_Scalar r) : radius(r) {} - - void paint(GLdouble *m) const { - glPushMatrix(); - glLoadMatrixd(m); - coordSystem(); - glutSolidSphere(radius, 20, 20); - glPopMatrix(); - } -}; - - -class GLBox : public GLShape { - MT_Vector3 extent; -public: - GLBox(MT_Scalar x, MT_Scalar y, MT_Scalar z) : - extent(x, y, z) {} - - void paint(GLdouble *m) const { - glPushMatrix(); - glLoadMatrixd(m); - coordSystem(); - glPushMatrix(); - glScaled(extent[0], extent[1], extent[2]); - glutSolidCube(1.0); - glPopMatrix(); - glPopMatrix(); - } -}; - - -class GLCone : public GLShape { - MT_Scalar bottomRadius; - MT_Scalar height; - mutable GLuint displayList; - -public: - GLCone(MT_Scalar r, MT_Scalar h) : - bottomRadius(r), - height(h), - displayList(0) {} - - void paint(GLdouble *m) const { - glPushMatrix(); - glLoadMatrixd(m); - coordSystem(); - if (displayList) glCallList(displayList); - else { - GLUquadricObj *quadObj = gluNewQuadric(); - displayList = glGenLists(1); - glNewList(displayList, GL_COMPILE_AND_EXECUTE); - glPushMatrix(); - glRotatef(-90.0, 1.0, 0.0, 0.0); - glTranslatef(0.0, 0.0, -1.0); - gluQuadricDrawStyle(quadObj, (GLenum)GLU_FILL); - gluQuadricNormals(quadObj, (GLenum)GLU_SMOOTH); - gluCylinder(quadObj, bottomRadius, 0, height, 15, 10); - glPopMatrix(); - glEndList(); - } - glPopMatrix(); - } -}; - -class GLCylinder : public GLShape { - MT_Scalar radius; - MT_Scalar height; - mutable GLuint displayList; - -public: - GLCylinder(MT_Scalar r, MT_Scalar h) : - radius(r), - height(h), - displayList(0) {} - - void paint(GLdouble *m) const { - glPushMatrix(); - glLoadMatrixd(m); - coordSystem(); - if (displayList) glCallList(displayList); - else { - GLUquadricObj *quadObj = gluNewQuadric(); - displayList = glGenLists(1); - glNewList(displayList, GL_COMPILE_AND_EXECUTE); - glPushMatrix(); - glRotatef(-90.0, 1.0, 0.0, 0.0); - glTranslatef(0.0, 0.0, -1.0); - gluQuadricDrawStyle(quadObj, (GLenum)GLU_FILL); - gluQuadricNormals(quadObj, (GLenum)GLU_SMOOTH); - gluCylinder(quadObj, radius, radius, height, 15, 10); - glPopMatrix (); - glEndList(); - } - glPopMatrix(); - } -}; - -class Object; - -class Callback : public SM_Callback { -public: - Callback(Object& object) : m_object(object) {} - - virtual void do_me(); - -private: - Object& m_object; -}; - - -class Object { -public: - Object(GLShape *gl_shape, SM_Object& object) : - m_gl_shape(gl_shape), - m_object(object), - m_callback(*this) - { - m_object.registerCallback(m_callback); - } - - ~Object() {} - - void paint() { - m_gl_shape->paint(m); - // display_bbox(m_bbox.lower(), m_bbox.upper()); - } - - MT_Vector3 getAhead() { - return MT_Vector3(-m[8], -m[9], -m[10]); - } - - void clearMomentum() { - m_object.clearMomentum(); - } - - void setMargin(MT_Scalar margin) { - m_object.setMargin(margin); - } - - void setScaling(const MT_Vector3& scaling) { - m_object.setScaling(scaling); - } - - void setPosition(const MT_Point3& pos) { - m_object.setPosition(pos); - } - - void setOrientation(const MT_Quaternion& orn) { - m_object.setOrientation(orn); - } - - void applyCenterForce(const MT_Vector3& force) { - m_object.applyCenterForce(force); - } - - void applyTorque(const MT_Vector3& torque) { - m_object.applyTorque(torque); - } - - MT_Point3 getWorldCoord(const MT_Point3& local) const { - return m_object.getWorldCoord(local); - } - - MT_Vector3 getLinearVelocity() const { - return m_object.getLinearVelocity(); - } - - void setMatrix() { - m_object.getMatrix(m); - } - -private: - GLShape *m_gl_shape; - SM_Object& m_object; - DT_Scalar m[16]; - Callback m_callback; -}; - - -void Callback::do_me() -{ - m_object.setMatrix(); -} - - -const MT_Scalar SPACE_SIZE = 2; - -static GLSphere gl_sphere(sphere_radius); -static GLBox gl_ground(50.0, 0.0, 50.0); - - - -#ifdef USE_COMPLEX - -const int GRID_SCALE = 10; -const MT_Scalar GRID_UNIT = 25.0 / GRID_SCALE; - -DT_ShapeHandle createComplex() { - DT_ShapeHandle shape = DT_NewComplexShape(); - for (int i0 = -GRID_SCALE; i0 != GRID_SCALE; ++i0) { - for (int j0 = -GRID_SCALE; j0 != GRID_SCALE; ++j0) { - int i1 = i0 + 1; - int j1 = j0 + 1; -#ifdef QUADS - DT_Begin(); - DT_Vertex(GRID_UNIT * i0, bowl_curv * i0*i0, GRID_UNIT * j0); - DT_Vertex(GRID_UNIT * i0, bowl_curv * i0*i0, GRID_UNIT * j1); - DT_Vertex(GRID_UNIT * i1, bowl_curv * i1*i1, GRID_UNIT * j1); - DT_Vertex(GRID_UNIT * i1, bowl_curv * i1*i1, GRID_UNIT * j0); - DT_End(); -#else - DT_Begin(); - DT_Vertex(GRID_UNIT * i0, 0, GRID_UNIT * j0); - DT_Vertex(GRID_UNIT * i0, 0, GRID_UNIT * j1); - DT_Vertex(GRID_UNIT * i1, 0, GRID_UNIT * j1); - DT_End(); - - DT_Begin(); - DT_Vertex(GRID_UNIT * i0, 0, GRID_UNIT * j1); - DT_Vertex(GRID_UNIT * i1, 0, GRID_UNIT * j1); - DT_Vertex(GRID_UNIT * i1, 0, GRID_UNIT * j0); - DT_End(); -#endif - - } - } - DT_EndComplexShape(); - return shape; -} - - -static DT_ShapeHandle ground_shape = createComplex(); - -#else - -static DT_ShapeHandle ground_shape = DT_Box(50, 0, 50); - -#endif - -static SM_Object sm_ground(ground_shape, &g_materialProps, 0, 0); -static Object ground(&gl_ground, sm_ground); - -static SM_Object sm_sphere(DT_Sphere(0.0), &g_materialProps, &g_shapeProps, 0); -static Object object(&gl_sphere, sm_sphere); - - -static SM_Object sm_ray(DT_Ray(0.0, -1.0, 0.0), 0, 0, 0); - -static SM_Scene g_scene; - - -void myinit(void) { - - GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 }; - GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 }; - GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 }; - - /* light_position is NOT default value */ - GLfloat light_position0[] = { 1.0, 1.0, 1.0, 0.0 }; - GLfloat light_position1[] = { -1.0, -1.0, -1.0, 0.0 }; - - glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); - glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); - glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); - glLightfv(GL_LIGHT0, GL_POSITION, light_position0); - - glLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient); - glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse); - glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular); - glLightfv(GL_LIGHT1, GL_POSITION, light_position1); - - - glEnable(GL_LIGHTING); - glEnable(GL_LIGHT0); - glEnable(GL_LIGHT1); - - glShadeModel(GL_SMOOTH); - - glEnable(GL_DEPTH_TEST); - glDepthFunc(GL_LESS); - - // glEnable(GL_CULL_FACE); - // glCullFace(GL_BACK); - - g_scene.setForceField(gravity); - g_scene.add(sm_ground); - sm_ground.setMargin(ground_margin); - - new(&object) Object(&gl_sphere, sm_sphere); - - - object.setMargin(sphere_radius); - - g_scene.add(sm_sphere); - - ground.setPosition(MT_Point3(0, -10, 0)); - ground.setOrientation(MT_Quaternion(0, 0, 0, 1)); - ground.setMatrix(); - center.setValue(0.0, 0.0, 0.0); - - newRandom(); -} - - -//MT_Point3 cp1, cp2; -//bool intersection; - -bool g_hit = false; -MT_Point3 g_spot; -MT_Vector3 g_normal; - - -void display(void) { - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - ground.paint(); - object.paint(); - - if (g_hit) { - glPointSize(5); - glBegin(GL_POINTS); - glVertex3d(g_spot[0], g_spot[1], g_spot[2]); - glEnd(); - glPointSize(1); - } - - - -#ifdef COLLISION - glDisable(GL_DEPTH_TEST); - glDisable(GL_LIGHTING); - glColor3f(1, 1, 0); - if (intersection) { - glPointSize(5); - glBegin(GL_POINTS); - glVertex3d(cp1[0], cp1[1], cp1[2]); - glEnd(); - glPointSize(1); - } - else { - glBegin(GL_LINES); - glVertex3d(cp1[0], cp1[1], cp1[2]); - glVertex3d(cp2[0], cp2[1], cp2[2]); - glEnd(); - } - glEnable(GL_LIGHTING); - glEnable(GL_DEPTH_TEST); -#endif - - glFlush(); - glutSwapBuffers(); -} - - - - - -void newRandom() { - object.setPosition(MT_Point3(0, 0, 0)); - object.clearMomentum(); - object.setMatrix(); - - display(); -} - -void moveAndDisplay() { - g_scene.proceed(timeStep, 0.01); - - MT_Vector3 normal(0, 1, 0); - - MT_Point3 from = object.getWorldCoord(MT_Point3(0, 0, 0)); - MT_Point3 to = from - normal * 10.0; - - g_hit = DT_ObjectRayTest(sm_ground.getObjectHandle(), - from.getValue(), - to.getValue(), g_spot.getValue(), - g_normal.getValue()); - - // Scrap -#define DO_FH -#ifdef DO_FH - MT_Scalar dist = MT_distance(from, g_spot); - if (dist < 5.0) { - MT_Vector3 lin_vel = object.getLinearVelocity(); - MT_Scalar lin_vel_normal = lin_vel.dot(normal); - - MT_Scalar spring_extent = dist + lin_vel_normal * (timeStep * 0.5); - - MT_Scalar f_spring = (5.0 - spring_extent) * 3.0; - object.applyCenterForce(normal * f_spring); - object.applyCenterForce(-lin_vel_normal * normal); - } - -#endif - - - display(); -} - - -void turn_left() { - object.applyTorque(MT_Vector3(0.0, 10.0, 0.0)); -} - -void turn_right() { - object.applyTorque(MT_Vector3(0.0, -10.0, 0.0)); -} - -void forward() { - object.applyCenterForce(20.0 * object.getAhead()); -} - -void backward() { - object.applyCenterForce(-20.0 * object.getAhead()); -} - -void jump() { - object.applyCenterForce(MT_Vector3(0.0, 200.0, 0.0)); -} - - -void toggleIdle() { - static bool idle = true; - if (idle) { - glutIdleFunc(moveAndDisplay); - idle = false; - } - else { - glutIdleFunc(NULL); - idle = true; - } -} - - -void setCamera() { - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 200.0); - MT_Scalar rele = MT_radians(ele); - MT_Scalar razi = MT_radians(azi); - eye.setValue(DISTANCE * sin(razi) * cos(rele), - DISTANCE * sin(rele), - DISTANCE * cos(razi) * cos(rele)); - gluLookAt(eye[0], eye[1], eye[2], - center[0], center[1], center[2], - 0, 1, 0); - glMatrixMode(GL_MODELVIEW); - display(); -} - -const MT_Scalar STEPSIZE = 5; - -void stepLeft() { azi -= STEPSIZE; if (azi < 0) azi += 360; setCamera(); } -void stepRight() { azi += STEPSIZE; if (azi >= 360) azi -= 360; setCamera(); } -void stepFront() { ele += STEPSIZE; if (azi >= 360) azi -= 360; setCamera(); } -void stepBack() { ele -= STEPSIZE; if (azi < 0) azi += 360; setCamera(); } -void zoomIn() { DISTANCE -= 1; setCamera(); } -void zoomOut() { DISTANCE += 1; setCamera(); } - - -void myReshape(int w, int h) { - glViewport(0, 0, w, h); - setCamera(); -} - -void myKeyboard(unsigned char key, int x, int y) -{ - switch (key) - { - case 'w': forward(); break; - case 's': backward(); break; - case 'a': turn_left(); break; - case 'd': turn_right(); break; - case 'e': jump(); break; - case 'l' : stepLeft(); break; - case 'r' : stepRight(); break; - case 'f' : stepFront(); break; - case 'b' : stepBack(); break; - case 'z' : zoomIn(); break; - case 'x' : zoomOut(); break; - case 'i' : toggleIdle(); break; - case ' ' : newRandom(); break; - default: -// std::cout << "unused key : " << key << std::endl; - break; - } -} - -void mySpecial(int key, int x, int y) -{ - switch (key) - { - case GLUT_KEY_LEFT : stepLeft(); break; - case GLUT_KEY_RIGHT : stepRight(); break; - case GLUT_KEY_UP : stepFront(); break; - case GLUT_KEY_DOWN : stepBack(); break; - case GLUT_KEY_PAGE_UP : zoomIn(); break; - case GLUT_KEY_PAGE_DOWN : zoomOut(); break; - case GLUT_KEY_HOME : toggleIdle(); break; - default: -// std::cout << "unused (special) key : " << key << std::endl; - break; - } -} - -void goodbye( void) -{ - g_scene.remove(sm_ground); - g_scene.remove(sm_sphere); - - std::cout << "goodbye ..." << std::endl; - exit(0); -} - -void menu(int choice) -{ - - static int fullScreen = 0; - static int px, py, sx, sy; - - switch(choice) { - case 1: - if (fullScreen == 1) { - glutPositionWindow(px,py); - glutReshapeWindow(sx,sy); - glutChangeToMenuEntry(1,"Full Screen",1); - fullScreen = 0; - } else { - px=glutGet((GLenum)GLUT_WINDOW_X); - py=glutGet((GLenum)GLUT_WINDOW_Y); - sx=glutGet((GLenum)GLUT_WINDOW_WIDTH); - sy=glutGet((GLenum)GLUT_WINDOW_HEIGHT); - glutFullScreen(); - glutChangeToMenuEntry(1,"Close Full Screen",1); - fullScreen = 1; - } - break; - case 2: - toggleIdle(); - break; - case 3: - goodbye(); - break; - default: - break; - } -} - -void createMenu() -{ - glutCreateMenu(menu); - glutAddMenuEntry("Full Screen", 1); - glutAddMenuEntry("Toggle Idle (Start/Stop)", 2); - glutAddMenuEntry("Quit", 3); - glutAttachMenu(GLUT_RIGHT_BUTTON); -} - -int main(int argc, char **argv) { - glutInit(&argc, argv); - glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); - glutInitWindowPosition(0, 0); - glutInitWindowSize(500, 500); - glutCreateWindow("Physics demo"); - - myinit(); - glutKeyboardFunc(myKeyboard); - glutSpecialFunc(mySpecial); - glutReshapeFunc(myReshape); - createMenu(); - glutIdleFunc(NULL); - - glutDisplayFunc(display); - glutMainLoop(); - return 0; -} - - - - - - - diff --git a/source/gameengine/Physics/Sumo/Fuzzics/src/Makefile b/source/gameengine/Physics/Sumo/Fuzzics/src/Makefile deleted file mode 100644 index b2744c5496a..00000000000 --- a/source/gameengine/Physics/Sumo/Fuzzics/src/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -# -# $Id$ -# Copyright (C) 2001 NaN Technologies B.V. - -LIBNAME = fuzzics -DIR = $(OCGDIR)/gameengine/blphys/$(LIBNAME) - -include nan_compile.mk - -CCFLAGS += $(LEVEL_1_CPP_WARNINGS) - -CPPFLAGS += -I../include -I$(NAN_MOTO)/include -I../../include -CPPFLAGS += -I$(NAN_SOLID)/include - diff --git a/source/gameengine/Physics/Sumo/Fuzzics/src/SM_FhObject.cpp b/source/gameengine/Physics/Sumo/Fuzzics/src/SM_FhObject.cpp deleted file mode 100644 index d866cdb4922..00000000000 --- a/source/gameengine/Physics/Sumo/Fuzzics/src/SM_FhObject.cpp +++ /dev/null @@ -1,180 +0,0 @@ -/** - * $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 ***** - */ -#include "SM_FhObject.h" -#include "MT_MinMax.h" - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -SM_FhObject::SM_FhObject(DT_ShapeHandle rayshape, MT_Vector3 ray, SM_Object *parent_object) : - SM_Object(rayshape, NULL, NULL, NULL), - m_ray(ray), - m_ray_direction(ray.normalized()), - m_parent_object(parent_object) -{ -} - -SM_FhObject::~SM_FhObject() -{ - DT_DeleteShape(getShapeHandle()); -} - -DT_Bool SM_FhObject::ray_hit(void *client_data, - void *client_object1, - void *client_object2, - const DT_CollData *coll_data) -{ - - SM_FhObject *fh_object = dynamic_cast<SM_FhObject *>((SM_Object *)client_object2); - if (!fh_object) - { - std::swap(client_object1, client_object2); - fh_object = dynamic_cast<SM_FhObject *>((SM_Object *)client_object2); - } - - SM_Object *hit_object = (SM_Object *)client_object1; - const SM_MaterialProps *matProps = hit_object->getMaterialProps(); - - if ((matProps == 0) || (matProps->m_fh_distance < MT_EPSILON)) { - return DT_CONTINUE; - } - - SM_Object *cl_object = fh_object->getParentObject(); - - assert(fh_object); - - if (hit_object == cl_object) { - // Shot myself in the foot... - return DT_CONTINUE; - } - - const SM_ShapeProps *shapeProps = cl_object->getShapeProps(); - - // Exit if the client object is not dynamic. - if (shapeProps == 0) { - return DT_CONTINUE; - } - - MT_Point3 lspot; - MT_Vector3 normal; - - DT_Vector3 from, to, dnormal; - DT_Scalar dlspot; - fh_object->getPosition().getValue(from); - fh_object->getSpot().getValue(to); - - - if (DT_ObjectRayCast(hit_object->getObjectHandle(), - from, - to, - 1., - &dlspot, - dnormal)) { - - lspot = fh_object->getPosition() + (fh_object->getSpot() - fh_object->getPosition()) * dlspot; - const MT_Vector3& ray_dir = fh_object->getRayDirection(); - MT_Scalar dist = MT_distance(fh_object->getPosition(), lspot) - - cl_object->getMargin() - shapeProps->m_radius; - - normal = MT_Vector3(dnormal).safe_normalized(); - - if (dist < matProps->m_fh_distance) { - - if (shapeProps->m_do_fh) { - lspot -= hit_object->getPosition(); - MT_Vector3 rel_vel = cl_object->getLinearVelocity() - hit_object->getVelocity(lspot); - MT_Scalar rel_vel_ray = ray_dir.dot(rel_vel); - MT_Scalar spring_extent = 1.0 - dist / matProps->m_fh_distance; - - MT_Scalar i_spring = spring_extent * matProps->m_fh_spring; - MT_Scalar i_damp = rel_vel_ray * matProps->m_fh_damping; - - cl_object->addLinearVelocity(-(i_spring + i_damp) * ray_dir); - if (matProps->m_fh_normal) { - cl_object->addLinearVelocity( - (i_spring + i_damp) * - (normal - normal.dot(ray_dir) * ray_dir)); - } - - MT_Vector3 lateral = rel_vel - rel_vel_ray * ray_dir; - const SM_ShapeProps *shapeProps = cl_object->getShapeProps(); - - if (shapeProps->m_do_anisotropic) { - MT_Matrix3x3 lcs(cl_object->getOrientation()); - MT_Vector3 loc_lateral = lateral * lcs; - const MT_Vector3& friction_scaling = - shapeProps->m_friction_scaling; - - loc_lateral.scale(friction_scaling[0], - friction_scaling[1], - friction_scaling[2]); - lateral = lcs * loc_lateral; - } - - - MT_Scalar rel_vel_lateral = lateral.length(); - - if (rel_vel_lateral > MT_EPSILON) { - MT_Scalar friction_factor = matProps->m_friction; - MT_Scalar max_friction = friction_factor * MT_max(MT_Scalar(0.0), i_spring); - - MT_Scalar rel_mom_lateral = rel_vel_lateral / - cl_object->getInvMass(); - - MT_Vector3 friction = - (rel_mom_lateral > max_friction) ? - -lateral * (max_friction / rel_vel_lateral) : - -lateral; - - cl_object->applyCenterImpulse(friction); - } - } - - if (shapeProps->m_do_rot_fh) { - const double *ogl_mat = cl_object->getMatrix(); - MT_Vector3 up(&ogl_mat[8]); - MT_Vector3 t_spring = up.cross(normal) * matProps->m_fh_spring; - MT_Vector3 ang_vel = cl_object->getAngularVelocity(); - - // only rotations that tilt relative to the normal are damped - ang_vel -= ang_vel.dot(normal) * normal; - - MT_Vector3 t_damp = ang_vel * matProps->m_fh_damping; - - cl_object->addAngularVelocity(t_spring - t_damp); - } - } - } - - return DT_CONTINUE; -} - - - diff --git a/source/gameengine/Physics/Sumo/Fuzzics/src/SM_MotionState.cpp b/source/gameengine/Physics/Sumo/Fuzzics/src/SM_MotionState.cpp deleted file mode 100644 index b8f4e0c591c..00000000000 --- a/source/gameengine/Physics/Sumo/Fuzzics/src/SM_MotionState.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/** - * $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 ***** - */ -#include <MT_Scalar.h> -#include <MT_Vector3.h> -#include <MT_Quaternion.h> - -#include "SM_MotionState.h" - -void SM_MotionState::integrateMidpoint(MT_Scalar timeStep, const SM_MotionState &prev_state, const MT_Vector3 &velocity, const MT_Quaternion& ang_vel) -{ - m_pos += (prev_state.getLinearVelocity() + velocity) * (timeStep * 0.5); - m_orn += (prev_state.getAngularVelocity() * prev_state.getOrientation() + ang_vel * m_orn) * (timeStep * 0.25); - m_orn.normalize(); -} - -void SM_MotionState::integrateBackward(MT_Scalar timeStep, const MT_Vector3 &velocity, const MT_Quaternion& ang_vel) -{ - m_pos += velocity * timeStep; - m_orn += ang_vel * m_orn * (timeStep * 0.5); - m_orn.normalize(); -} - -void SM_MotionState::integrateForward(MT_Scalar timeStep, const SM_MotionState &prev_state) -{ - m_pos += prev_state.getLinearVelocity() * timeStep; - m_orn += prev_state.getAngularVelocity() * m_orn * (timeStep * 0.5); - m_orn.normalize(); -} - -/* -// Newtonian lerp: interpolate based on Newtonian motion -void SM_MotionState::nlerp(const SM_MotionState &prev, const SM_MotionState &next) -{ - MT_Scalar dt = next.getTime() - prev.getTime(); - MT_Scalar t = getTime() - prev.getTime(); - MT_Vector3 dx = next.getPosition() - prev.getPosition(); - MT_Vector3 a = dx/(dt*dt) - prev.getLinearVelocity()/dt; - - m_pos = prev.getPosition() + prev.getLinearVelocity()*t + a*t*t; -} -*/ - -void SM_MotionState::lerp(const SM_MotionState &prev, const SM_MotionState &next) -{ - MT_Scalar dt = next.getTime() - prev.getTime(); - if (MT_fuzzyZero(dt)) - { - *this = next; - return; - } - - MT_Scalar x = (getTime() - prev.getTime())/dt; - - m_pos = x*next.getPosition() + (1-x)*prev.getPosition(); - - m_orn = prev.getOrientation().slerp(next.getOrientation(), 1-x); - - m_lin_vel = x*next.getLinearVelocity() + (1-x)*prev.getLinearVelocity(); - m_ang_vel = x*next.getAngularVelocity() + (1-x)*prev.getAngularVelocity(); -} - -void SM_MotionState::lerp(MT_Scalar t, const SM_MotionState &other) -{ - MT_Scalar x = (t - getTime())/(other.getTime() - getTime()); - m_pos = (1-x)*m_pos + x*other.getPosition(); - - m_orn = other.getOrientation().slerp(m_orn, x); - - m_lin_vel = (1-x)*m_lin_vel + x*other.getLinearVelocity(); - m_ang_vel = (1-x)*m_ang_vel + x*other.getAngularVelocity(); - - m_time = t; -} - diff --git a/source/gameengine/Physics/Sumo/Fuzzics/src/SM_Object.cpp b/source/gameengine/Physics/Sumo/Fuzzics/src/SM_Object.cpp deleted file mode 100644 index 4b2c7cae008..00000000000 --- a/source/gameengine/Physics/Sumo/Fuzzics/src/SM_Object.cpp +++ /dev/null @@ -1,1298 +0,0 @@ -/** - * $Id$ - * Copyright (C) 2001 NaN Technologies B.V. - * The basic physics object. - * - * ***** 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 ***** - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#ifdef WIN32 -// This warning tells us about truncation of __long__ stl-generated names. -// It can occasionally cause DevStudio to have internal compiler warnings. -#pragma warning( disable : 4786 ) -#endif - -#include "MT_assert.h" - -#include "SM_Object.h" -#include "SM_Scene.h" -#include "SM_FhObject.h" -#include "SM_Debug.h" - -#include "MT_MinMax.h" - -MT_Scalar SM_Object::ImpulseThreshold = -1.0; - -struct Contact -{ - SM_Object *obj1; - SM_Object *obj2; - MT_Vector3 normal; - MT_Point3 pos; - - // Sort objects by height - bool operator()(const Contact *a, const Contact *b) - { - return a->pos[2] < b->pos[2]; - } - - Contact(SM_Object *o1, SM_Object *o2, const MT_Vector3 nor, const MT_Point3 p) - : obj1(o1), - obj2(o2), - normal(nor), - pos(p) - { - } - - Contact() - { - } - - void resolve() - { - if (obj1->m_static || obj2->m_static) - { - if (obj1->isDynamic()) - { - if (obj1->m_static && obj2->m_static) - { - if (obj1->m_static < obj2->m_static) - { - obj2->m_error -= normal; - obj2->m_static = obj1->m_static + 1; - } - else - { - obj1->m_error += normal; - obj1->m_static = obj2->m_static + 1; - } - } - else - { - if (obj1->m_static) - { - obj2->m_error -= normal; - obj2->m_static = obj1->m_static + 1; - } - else - { - obj1->m_error += normal; - obj1->m_static = obj2->m_static + 1; - } - } - } - else - { - obj2->m_error -= normal; - obj2->m_static = 1; - } - } - else - { - // This distinction between dynamic and non-dynamic objects should not be - // necessary. Non-dynamic objects are assumed to have infinite mass. - if (obj1->isDynamic()) { - MT_Vector3 error = normal * 0.5f; - obj1->m_error += error; - obj2->m_error -= error; - } - else { - // Same again but now obj1 is non-dynamic - obj2->m_error -= normal; - obj2->m_static = obj1->m_static + 1; - } - } - - } - - - typedef std::set<Contact*, Contact> Set; -}; - -static Contact::Set contacts; - -SM_Object::SM_Object( - DT_ShapeHandle shape, - const SM_MaterialProps *materialProps, - const SM_ShapeProps *shapeProps, - SM_Object *dynamicParent) : - - m_dynamicParent(dynamicParent), - m_client_object(0), - m_physicsClientObject(0), - m_shape(shape), - m_materialProps(materialProps), - m_materialPropsBackup(0), - m_shapeProps(shapeProps), - m_shapePropsBackup(0), - m_margin(0.0), - m_scaling(1.0, 1.0, 1.0), - m_reaction_impulse(0.0, 0.0, 0.0), - m_reaction_force(0.0, 0.0, 0.0), - m_lin_mom(0.0, 0.0, 0.0), - m_ang_mom(0.0, 0.0, 0.0), - m_force(0.0, 0.0, 0.0), - m_torque(0.0, 0.0, 0.0), - m_error(0.0, 0.0, 0.0), - m_combined_lin_vel (0.0, 0.0, 0.0), - m_combined_ang_vel (0.0, 0.0, 0.0), - m_fh_object(0), - m_inv_mass(0.0), - m_inv_inertia(0., 0., 0.), - m_kinematic(false), - m_prev_kinematic(false), - m_is_rigid_body(false), - m_static(0) -{ - m_object = DT_CreateObject(this, shape); - m_xform.setIdentity(); - m_xform.getValue(m_ogl_matrix); - if (shapeProps) - { - if (shapeProps->m_do_fh || shapeProps->m_do_rot_fh) - { - DT_Vector3 zero = {0., 0., 0.}, ray = {0.0, 0.0, -10.0}; - m_fh_object = new SM_FhObject(DT_NewLineSegment(zero, ray), MT_Vector3(ray), this); - //printf("SM_Object:: WARNING! fh disabled.\n"); - } - m_inv_mass = 1. / shapeProps->m_mass; - m_inv_inertia = MT_Vector3(1./shapeProps->m_inertia[0], 1./shapeProps->m_inertia[1], 1./shapeProps->m_inertia[2]); - } - updateInvInertiaTensor(); - m_suspended = false; -} - - - void -SM_Object:: -integrateForces( - MT_Scalar timeStep -){ - if (!m_suspended) { - m_prev_state = getNextFrame(); - m_prev_state.setLinearVelocity(actualLinVelocity()); - m_prev_state.setAngularVelocity(actualAngVelocity()); - if (isDynamic()) { - // Integrate momentum (forward Euler) - m_lin_mom += m_force * timeStep; - m_ang_mom += m_torque * timeStep; - // Drain momentum because of air/water resistance - m_lin_mom *= pow(m_shapeProps->m_lin_drag, timeStep); - m_ang_mom *= pow(m_shapeProps->m_ang_drag, timeStep); - // Set velocities according momentum - getNextFrame().setLinearVelocity(m_lin_mom * m_inv_mass); - getNextFrame().setAngularVelocity(m_inv_inertia_tensor * m_ang_mom); - } - } - -}; - - void -SM_Object:: -integrateMomentum( - MT_Scalar timeStep -){ - // Integrate position and orientation - - // only do it for objects with linear and/or angular velocity - // else clients with hierarchies may get into trouble - if (!actualLinVelocity().fuzzyZero() || !actualAngVelocity().fuzzyZero()) - { - - // those MIDPOINT and BACKWARD integration methods are - // in this form not ok with some testfiles ! - // For a release build please use forward euler unless completely tested - -//#define MIDPOINT -//#define BACKWARD -#ifdef MIDPOINT -// Midpoint rule - getNextFrame().integrateMidpoint(timeStep, m_prev_state, actualLinVelocity(), actualAngVelocity()); -#elif defined BACKWARD -// Backward Euler - getNextFrame().integrateBackward(timeStep, actualLinVelocity(), actualAngVelocity()); -#else -// Forward Euler - getNextFrame().integrateForward(timeStep, m_prev_state); -#endif - - calcXform(); - notifyClient(); - - } -} - -/** - * dynamicCollision computes the response to a collision. - * - * @param local2 the contact point in local coordinates. - * @param normal the contact normal. - * @param dist the penetration depth of the contact. (unused) - * @param rel_vel the relative velocity of the objects - * @param restitution the amount of momentum conserved in the collision. Range: 0.0 - 1.0 - * @param friction_factor the amount of friction between the two surfaces. - * @param invMass the inverse mass of the collision objects (1.0 / mass) - */ -void SM_Object::dynamicCollision(const MT_Point3 &local2, - const MT_Vector3 &normal, - MT_Scalar dist, - const MT_Vector3 &rel_vel, - MT_Scalar restitution, - MT_Scalar friction_factor, - MT_Scalar invMass -) -{ - /** - * rel_vel_normal is the relative velocity in the contact normal direction. - */ - MT_Scalar rel_vel_normal = normal.dot(rel_vel); - - /** - * if rel_vel_normal > 0, the objects are moving apart! - */ - if (rel_vel_normal < -MT_EPSILON) { - /** - * if rel_vel_normal < ImpulseThreshold, scale the restitution down. - * This should improve the simulation where the object is stacked. - */ - restitution *= MT_min(MT_Scalar(1.0), rel_vel_normal/ImpulseThreshold); - - MT_Scalar impulse = -(1.0 + restitution) * rel_vel_normal; - - if (isRigidBody()) - { - MT_Vector3 temp = getInvInertiaTensor() * local2.cross(normal); - impulse /= invMass + normal.dot(temp.cross(local2)); - - /** - * Apply impulse at the collision point. - * Take rotational inertia into account. - */ - applyImpulse(local2 + getNextFrame().getPosition(), impulse * normal); - } else { - /** - * Apply impulse through object center. (no rotation.) - */ - impulse /= invMass; - applyCenterImpulse( impulse * normal ); - } - - MT_Vector3 external = m_combined_lin_vel + m_combined_ang_vel.cross(local2); - MT_Vector3 lateral = rel_vel - external - normal * (rel_vel_normal - external.dot(normal)); -#if 0 - // test - only do friction on the physics part of the - // velocity. - vel1 -= obj1->m_combined_lin_vel; - vel2 -= obj2->m_combined_lin_vel; - - // This should look familiar.... - rel_vel = vel2 - vel1; - rel_vel_normal = normal.dot(rel_vel); -#endif - /** - * The friction part starts here!!!!!!!! - * - * Compute the lateral component of the relative velocity - * lateral actually points in the opposite direction, i.e., - * into the direction of the friction force. - */ - if (m_shapeProps->m_do_anisotropic) { - - /** - * For anisotropic friction we scale the lateral component, - * rather than compute a direction-dependent fricition - * factor. For this the lateral component is transformed to - * local coordinates. - */ - - MT_Matrix3x3 lcs(getNextFrame().getOrientation()); - - /** - * We cannot use m_xform.getBasis() for the matrix, since - * it might contain a non-uniform scaling. - * OPT: it's a bit daft to compute the matrix since the - * quaternion itself can be used to do the transformation. - */ - MT_Vector3 loc_lateral = lateral * lcs; - - /** - * lcs is orthogonal so lcs.inversed() == lcs.transposed(), - * and lcs.transposed() * lateral == lateral * lcs. - */ - const MT_Vector3& friction_scaling = - m_shapeProps->m_friction_scaling; - - // Scale the local lateral... - loc_lateral.scale(friction_scaling[0], - friction_scaling[1], - friction_scaling[2]); - // ... and transform it back to global coordinates - lateral = lcs * loc_lateral; - } - - /** - * A tiny Coulomb friction primer: - * The Coulomb friction law states that the magnitude of the - * maximum possible friction force depends linearly on the - * magnitude of the normal force. - * - * \f[ - F_max_friction = friction_factor * F_normal - \f] - * - * (NB: independent of the contact area!!) - * - * The friction factor depends on the material. - * We use impulses rather than forces but let us not be - * bothered by this. - */ - MT_Scalar rel_vel_lateral = lateral.length(); - - if (rel_vel_lateral > MT_EPSILON) { - lateral /= rel_vel_lateral; - - // Compute the maximum friction impulse - MT_Scalar max_friction = - friction_factor * MT_max(MT_Scalar(0.0), impulse); - - // I guess the GEN_max is not necessary, so let's check it - - MT_assert(impulse >= 0.0); - - /** - * Here's the trick. We compute the impulse to make the - * lateral velocity zero. (Make the objects stick together - * at the contact point. If this impulse is larger than - * the maximum possible friction impulse, then shrink its - * magnitude to the maximum friction. - */ - - if (isRigidBody()) { - - /** - * For rigid bodies we take the inertia into account, - * since the friction impulse is going to change the - * angular momentum as well. - */ - MT_Vector3 temp = getInvInertiaTensor() * local2.cross(lateral); - MT_Scalar impulse_lateral = rel_vel_lateral / - (invMass + lateral.dot(temp.cross(local2))); - - MT_Scalar friction = MT_min(impulse_lateral, max_friction); - applyImpulse(local2 + getNextFrame().getPosition(), -lateral * friction); - } - else { - MT_Scalar impulse_lateral = rel_vel_lateral / invMass; - - MT_Scalar friction = MT_min(impulse_lateral, max_friction); - applyCenterImpulse( -friction * lateral); - } - - - } - - //calcXform(); - //notifyClient(); - - } -} - -static void AddCallback(SM_Scene *scene, SM_Object *obj1, SM_Object *obj2) -{ - // If we have callbacks on either of the client objects, do a collision test - // and add a callback if they intersect. - DT_Vector3 v; - if ((obj1->getClientObject() && obj1->getClientObject()->hasCollisionCallback()) || - (obj2->getClientObject() && obj2->getClientObject()->hasCollisionCallback()) && - DT_GetIntersect(obj1->getObjectHandle(), obj2->getObjectHandle(), v)) - scene->notifyCollision(obj1, obj2); -} - -DT_Bool SM_Object::boing( - void *client_data, - void *object1, - void *object2, - const DT_CollData *coll_data -){ - SM_Scene *scene = (SM_Scene *)client_data; - SM_Object *obj1 = (SM_Object *)object1; - SM_Object *obj2 = (SM_Object *)object2; - - // at this point it is unknown whether we are really intersecting (broad phase) - - DT_Vector3 p1, p2; - if (!obj2->isDynamic()) { - std::swap(obj1, obj2); - } - - // If one of the objects is a ghost then ignore it for the dynamics - if (obj1->isGhost() || obj2->isGhost()) { - AddCallback(scene, obj1, obj2); - return DT_CONTINUE; - } - - // Objects do not collide with parent objects - if (obj1->getDynamicParent() == obj2 || obj2->getDynamicParent() == obj1) { - AddCallback(scene, obj1, obj2); - return DT_CONTINUE; - } - - if (!obj2->isDynamic()) { - AddCallback(scene, obj1, obj2); - return DT_CONTINUE; - } - - // Get collision data from SOLID - if (!DT_GetPenDepth(obj1->getObjectHandle(), obj2->getObjectHandle(), p1, p2)) - return DT_CONTINUE; - - MT_Point3 local1(p1), local2(p2); - MT_Vector3 normal(local2 - local1); - MT_Scalar dist = normal.length(); - - if (dist < MT_EPSILON) - return DT_CONTINUE; - - // Now we are definitely intersecting. - - // Set callbacks for game engine. - if ((obj1->getClientObject() && obj1->getClientObject()->hasCollisionCallback()) || - (obj2->getClientObject() && obj2->getClientObject()->hasCollisionCallback())) - scene->notifyCollision(obj1, obj2); - - local1 -= obj1->getNextFrame().getPosition(); - local2 -= obj2->getNextFrame().getPosition(); - - // Calculate collision parameters - MT_Vector3 rel_vel = obj1->getVelocity(local1) - obj2->getVelocity(local2); - - MT_Scalar restitution = - MT_min(obj1->getMaterialProps()->m_restitution, - obj2->getMaterialProps()->m_restitution); - - MT_Scalar friction_factor = - MT_min(obj1->getMaterialProps()->m_friction, - obj2->getMaterialProps()->m_friction); - - MT_Scalar invMass = obj1->getInvMass() + obj2->getInvMass(); - - normal /= dist; - - // Calculate reactions - if (obj1->isDynamic()) - obj1->dynamicCollision(local1, normal, dist, rel_vel, restitution, friction_factor, invMass); - - if (obj2->isDynamic()) - { - obj2->dynamicCollision(local2, -normal, dist, -rel_vel, restitution, friction_factor, invMass); - if (!obj1->isDynamic() || obj1->m_static) - obj2->m_static = obj1->m_static + 1; - } - - return DT_CONTINUE; -} - -DT_Bool SM_Object::fix( - void *client_data, - void *object1, - void *object2, - const DT_CollData *coll_data -){ - SM_Object *obj1 = (SM_Object *)object1; - SM_Object *obj2 = (SM_Object *)object2; - - // If one of the objects is a ghost then ignore it for the dynamics - if (obj1->isGhost() || obj2->isGhost()) { - return DT_CONTINUE; - } - - if (obj1->getDynamicParent() == obj2 || obj2->getDynamicParent() == obj1) { - return DT_CONTINUE; - } - - if (!obj2->isDynamic()) { - std::swap(obj1, obj2); - } - - if (!obj2->isDynamic()) { - return DT_CONTINUE; - } - - // obj1 points to a dynamic object - DT_Vector3 p1, p2; - if (!DT_GetPenDepth(obj1->getObjectHandle(), obj2->getObjectHandle(), p1, p2)) - return DT_CONTINUE; - MT_Point3 local1(p1), local2(p2); - // Get collision data from SOLID - MT_Vector3 normal(local2 - local1); - - MT_Scalar dist = normal.dot(normal); - if (dist < MT_EPSILON || dist > obj2->m_shapeProps->m_radius*obj2->m_shapeProps->m_radius) - return DT_CONTINUE; - - - if ((obj1->m_static || !obj1->isDynamic()) && obj1->m_static < obj2->m_static) - { - obj2->m_static = obj1->m_static + 1; - } else if (obj2->m_static && obj2->m_static < obj1->m_static) - { - obj1->m_static = obj2->m_static + 1; - } - - contacts.insert(new Contact(obj1, obj2, normal, MT_Point3(local1 + 0.5*(local2 - local1)))); - - - return DT_CONTINUE; -} - -void SM_Object::relax(void) -{ - for (Contact::Set::iterator csit = contacts.begin() ; csit != contacts.end(); ++csit) - { - (*csit)->resolve(); - delete (*csit); - } - - contacts.clear(); - if (m_error.fuzzyZero()) - return; - //std::cout << "SM_Object::relax: { " << m_error << " }" << std::endl; - - getNextFrame().setPosition(getNextFrame().getPosition() + m_error); - m_error.setValue(0., 0., 0.); - //calcXform(); - //notifyClient(); -} - -SM_Object::SM_Object() : - m_dynamicParent(0), - m_client_object(0), - m_physicsClientObject(0), - m_shape(0), - m_materialProps(0), - m_materialPropsBackup(0), - m_shapeProps(0), - m_shapePropsBackup(0), - m_object(0), - m_margin(0.0), - m_scaling(1.0, 1.0, 1.0), - m_reaction_impulse(0.0, 0.0, 0.0), - m_reaction_force(0.0, 0.0, 0.0), - m_lin_mom(0.0, 0.0, 0.0), - m_ang_mom(0.0, 0.0, 0.0), - m_force(0.0, 0.0, 0.0), - m_torque(0.0, 0.0, 0.0), - m_error(0.0, 0.0, 0.0), - m_combined_lin_vel (0.0, 0.0, 0.0), - m_combined_ang_vel (0.0, 0.0, 0.0), - m_fh_object(0), - m_kinematic(false), - m_prev_kinematic(false), - m_is_rigid_body(false) -{ - // warning no initialization of variables done by moto. -} - -SM_Object:: -~SM_Object() { - if (m_fh_object) - delete m_fh_object; - - DT_DestroyObject(m_object); - m_object = NULL; -} - - bool -SM_Object:: -isDynamic( -) const { - return m_shapeProps != 0; -} - -/* nzc experimental. There seem to be two places where kinematics - * are evaluated: proceedKinematic (called from SM_Scene) and - * proceed() in this object. I'll just try and bunge these out for - * now. */ - void -SM_Object:: -suspend( -){ - if (!m_suspended) { - m_suspended = true; - suspendDynamics(); - } -} - - void -SM_Object:: -resume( -) { - if (m_suspended) { - m_suspended = false; - restoreDynamics(); - } -} - - void -SM_Object:: -suspendDynamics( -) { - if (m_shapeProps) { - m_shapePropsBackup = m_shapeProps; - m_shapeProps = 0; - } -} - - void -SM_Object:: -restoreDynamics( -) { - if (m_shapePropsBackup) { - m_shapeProps = m_shapePropsBackup; - m_shapePropsBackup = 0; - } -} - - bool -SM_Object:: -isGhost( -) const { - return m_materialProps == 0; -} - - void -SM_Object:: -suspendMaterial( -) { - if (m_materialProps) { - m_materialPropsBackup = m_materialProps; - m_materialProps = 0; - } -} - - void -SM_Object:: -restoreMaterial( -) { - if (m_materialPropsBackup) { - m_materialProps = m_materialPropsBackup; - m_materialPropsBackup = 0; - } -} - - SM_FhObject * -SM_Object:: -getFhObject( -) const { - return m_fh_object; -} - - void -SM_Object:: -registerCallback( - SM_Callback& callback -) { - m_callbackList.push_back(&callback); -} - -// Set the local coordinate system according to the current state - void -SM_Object:: -calcXform() { -#ifdef SM_DEBUG_XFORM - printf("SM_Object::calcXform m_pos = { %-0.5f, %-0.5f, %-0.5f }\n", - m_pos[0], m_pos[1], m_pos[2]); - printf(" m_orn = { %-0.5f, %-0.5f, %-0.5f, %-0.5f }\n", - m_orn[0], m_orn[1], m_orn[2], m_orn[3]); - printf(" m_scaling = { %-0.5f, %-0.5f, %-0.5f }\n", - m_scaling[0], m_scaling[1], m_scaling[2]); -#endif - m_xform.setOrigin(getNextFrame().getPosition()); - m_xform.setBasis(MT_Matrix3x3(getNextFrame().getOrientation(), m_scaling)); - m_xform.getValue(m_ogl_matrix); - - /* Blender has been known to crash here. - This usually means SM_Object *this has been deleted more than once. */ - DT_SetMatrixd(m_object, m_ogl_matrix); - if (m_fh_object) { - m_fh_object->setPosition(getNextFrame().getPosition()); - m_fh_object->calcXform(); - } - updateInvInertiaTensor(); -#ifdef SM_DEBUG_XFORM - printf("\n | %-0.5f %-0.5f %-0.5f %-0.5f |\n", - m_ogl_matrix[0], m_ogl_matrix[4], m_ogl_matrix[ 8], m_ogl_matrix[12]); - printf( " | %-0.5f %-0.5f %-0.5f %-0.5f |\n", - m_ogl_matrix[1], m_ogl_matrix[5], m_ogl_matrix[ 9], m_ogl_matrix[13]); - printf( "m_ogl_matrix = | %-0.5f %-0.5f %-0.5f %-0.5f |\n", - m_ogl_matrix[2], m_ogl_matrix[6], m_ogl_matrix[10], m_ogl_matrix[14]); - printf( " | %-0.5f %-0.5f %-0.5f %-0.5f |\n\n", - m_ogl_matrix[3], m_ogl_matrix[7], m_ogl_matrix[11], m_ogl_matrix[15]); -#endif -} - - void -SM_Object::updateInvInertiaTensor() -{ - m_inv_inertia_tensor = m_xform.getBasis().scaled(m_inv_inertia[0], m_inv_inertia[1], m_inv_inertia[2]) * m_xform.getBasis().transposed(); -} - -// Call callbacks to notify the client of a change of placement - void -SM_Object:: -notifyClient() { - T_CallbackList::iterator i; - for (i = m_callbackList.begin(); i != m_callbackList.end(); ++i) { - (*i)->do_me(); - } -} - - -// Save the current state information for use in the velocity computation in the next frame. - void -SM_Object:: -proceedKinematic( - MT_Scalar timeStep -) { - /* nzc: need to bunge this for the logic bubbling as well? */ - if (!m_suspended) { - m_prev_kinematic = m_kinematic; - if (m_kinematic) { - m_prev_xform = m_xform; - m_timeStep = timeStep; - calcXform(); - m_kinematic = false; - } - } -} - - void -SM_Object:: -saveReactionForce( - MT_Scalar timeStep -) { - if (isDynamic()) { - m_reaction_force = m_reaction_impulse / timeStep; - m_reaction_impulse.setValue(0.0, 0.0, 0.0); - } -} - - void -SM_Object:: -clearForce( -) { - m_force.setValue(0.0, 0.0, 0.0); - m_torque.setValue(0.0, 0.0, 0.0); -} - - void -SM_Object:: -clearMomentum( -) { - m_lin_mom.setValue(0.0, 0.0, 0.0); - m_ang_mom.setValue(0.0, 0.0, 0.0); -} - - void -SM_Object:: -setMargin( - MT_Scalar margin -) { - m_margin = margin; - DT_SetMargin(m_object, margin); -} - - MT_Scalar -SM_Object:: -getMargin( -) const { - return m_margin; -} - -const - SM_MaterialProps * -SM_Object:: -getMaterialProps( -) const { - return m_materialProps; -} - -const - SM_ShapeProps * -SM_Object:: -getShapeProps( -) const { - return m_shapeProps; -} - - void -SM_Object:: -setPosition( - const MT_Point3& pos -){ - m_kinematic = true; - getNextFrame().setPosition(pos); - endFrame(); -} - - void -SM_Object:: -setOrientation( - const MT_Quaternion& orn -){ - MT_assert(!orn.fuzzyZero()); - m_kinematic = true; - getNextFrame().setOrientation(orn); - endFrame(); -} - - void -SM_Object:: -setScaling( - const MT_Vector3& scaling -){ - m_kinematic = true; - m_scaling = scaling; -} - -/** - * Functions to handle linear velocity - */ - - void -SM_Object:: -setExternalLinearVelocity( - const MT_Vector3& lin_vel -) { - m_combined_lin_vel=lin_vel; -} - - void -SM_Object:: -addExternalLinearVelocity( - const MT_Vector3& lin_vel -) { - m_combined_lin_vel+=lin_vel; -} - - void -SM_Object:: -addLinearVelocity( - const MT_Vector3& lin_vel -){ - setLinearVelocity(getNextFrame().getLinearVelocity() + lin_vel); -} - - void -SM_Object:: -setLinearVelocity( - const MT_Vector3& lin_vel -){ - getNextFrame().setLinearVelocity(lin_vel); - if (m_shapeProps) { - m_lin_mom = getNextFrame().getLinearVelocity() * m_shapeProps->m_mass; - } -} - -/** - * Functions to handle angular velocity - */ - - void -SM_Object:: -setExternalAngularVelocity( - const MT_Vector3& ang_vel -) { - m_combined_ang_vel = ang_vel; -} - - void -SM_Object:: -addExternalAngularVelocity( - const MT_Vector3& ang_vel -) { - m_combined_ang_vel += ang_vel; -} - - void -SM_Object:: -setAngularVelocity( - const MT_Vector3& ang_vel -) { - getNextFrame().setAngularVelocity(ang_vel); - if (m_shapeProps) { - m_ang_mom = getNextFrame().getAngularVelocity() * m_shapeProps->m_inertia; - } -} - - void -SM_Object:: -addAngularVelocity( - const MT_Vector3& ang_vel -) { - setAngularVelocity(getNextFrame().getAngularVelocity() + ang_vel); -} - - - void -SM_Object:: -clearCombinedVelocities( -) { - m_combined_lin_vel = MT_Vector3(0,0,0); - m_combined_ang_vel = MT_Vector3(0,0,0); -} - - void -SM_Object:: -resolveCombinedVelocities( - const MT_Vector3 & lin_vel, - const MT_Vector3 & ang_vel -) { - - // Different behaviours for dynamic and non-dynamic - // objects. For non-dynamic we just set the velocity to - // zero. For dynmic the physics velocity has to be - // taken into account. We must make an arbitrary decision - // on how to resolve the 2 velocities. Choices are - // Add the physics velocity to the linear velocity. Objects - // will just keep on moving in the direction they were - // last set in - untill external forces affect them. - // Set the combinbed linear and physics velocity to zero. - // Set the physics velocity in the direction of the set velocity - // zero. - if (isDynamic()) { - -#if 1 - getNextFrame().setLinearVelocity(getNextFrame().getLinearVelocity() + lin_vel); - getNextFrame().setAngularVelocity(getNextFrame().getAngularVelocity() + ang_vel); -#else - - //compute the component of the physics velocity in the - // direction of the set velocity and set it to zero. - MT_Vector3 lin_vel_norm = lin_vel.normalized(); - - setLinearVelocity(getNextFrame().getLinearVelocity() - (getNextFrame().getLinearVelocity().dot(lin_vel_norm) * lin_vel_norm)); -#endif - m_lin_mom = getNextFrame().getLinearVelocity() * m_shapeProps->m_mass; - m_ang_mom = getNextFrame().getAngularVelocity() * m_shapeProps->m_inertia; - clearCombinedVelocities(); - - } - -} - - - MT_Scalar -SM_Object:: -getInvMass( -) const { - return m_inv_mass; - // OPT: cache the result of this division rather than compute it each call -} - - const MT_Vector3& -SM_Object:: -getInvInertia( -) const { - return m_inv_inertia; - // OPT: cache the result of this division rather than compute it each call -} - - const MT_Matrix3x3& -SM_Object:: -getInvInertiaTensor( -) const { - return m_inv_inertia_tensor; -} - - void -SM_Object:: -applyForceField( - const MT_Vector3& accel -) { - if (m_shapeProps) { - m_force += m_shapeProps->m_mass * accel; // F = m * a - } -} - - void -SM_Object:: -applyCenterForce( - const MT_Vector3& force -) { - m_force += force; -} - - void -SM_Object:: -applyTorque( - const MT_Vector3& torque -) { - m_torque += torque; -} - - void -SM_Object:: -applyImpulse( - const MT_Point3& attach, const MT_Vector3& impulse -) { - applyCenterImpulse(impulse); // Change in linear momentum - applyAngularImpulse((attach - getNextFrame().getPosition()).cross(impulse)); // Change in angular momentump -} - - void -SM_Object:: -applyCenterImpulse( - const MT_Vector3& impulse -) { - if (m_shapeProps) { - m_lin_mom += impulse; - m_reaction_impulse += impulse; - getNextFrame().setLinearVelocity(m_lin_mom * m_inv_mass); - - // The linear velocity is immedialtely updated since otherwise - // simultaneous collisions will get a double impulse. - } -} - - void -SM_Object:: -applyAngularImpulse( - const MT_Vector3& impulse -) { - if (m_shapeProps) { - m_ang_mom += impulse; - getNextFrame().setAngularVelocity( m_inv_inertia_tensor * m_ang_mom); - } -} - - MT_Point3 -SM_Object:: -getWorldCoord( - const MT_Point3& local -) const { - return m_xform(local); -} - - MT_Vector3 -SM_Object:: -getVelocity( - const MT_Point3& local -) const { - if (m_prev_kinematic && !isDynamic()) - { - // For displaced objects the velocity is faked using the previous state. - // Dynamic objects get their own velocity, not the faked velocity. - // (Dynamic objects shouldn't be displaced in the first place!!) - return (m_xform(local) - m_prev_xform(local)) / m_timeStep; - } - - // NB: m_xform.getBasis() * local == m_xform(local) - m_xform.getOrigin() - return actualLinVelocity() + actualAngVelocity().cross(local); -} - - -const - MT_Vector3& -SM_Object:: -getReactionForce( -) const { - return m_reaction_force; -} - - void -SM_Object:: -getMatrix( - double *m -) const { - std::copy(&m_ogl_matrix[0], &m_ogl_matrix[16], &m[0]); -} - -const - double * -SM_Object:: -getMatrix( -) const { - return m_ogl_matrix; -} - -// Still need this??? -const - MT_Transform& -SM_Object:: -getScaledTransform( -) const { - return m_xform; -} - - DT_ObjectHandle -SM_Object:: -getObjectHandle( -) const { - return m_object; -} - - DT_ShapeHandle -SM_Object:: -getShapeHandle( -) const { - return m_shape; -} - - SM_Object * -SM_Object:: -getDynamicParent( -) { - return m_dynamicParent; -} - - void -SM_Object:: -setRigidBody( - bool is_rigid_body -) { - m_is_rigid_body = is_rigid_body; -} - - bool -SM_Object:: -isRigidBody( -) const { - return m_is_rigid_body; -} - -const - MT_Vector3 -SM_Object:: -actualLinVelocity( -) const { - return m_combined_lin_vel + getNextFrame().getLinearVelocity(); -}; - -const - MT_Vector3 -SM_Object:: -actualAngVelocity( -) const { - return m_combined_ang_vel + getNextFrame().getAngularVelocity(); -} - - -SM_MotionState& -SM_Object:: -getCurrentFrame() -{ - return m_frames[1]; -} - -SM_MotionState& -SM_Object:: -getPreviousFrame() -{ - return m_frames[0]; -} - -SM_MotionState & -SM_Object:: -getNextFrame() -{ - return m_frames[2]; -} - -const SM_MotionState & -SM_Object:: -getCurrentFrame() const -{ - return m_frames[1]; -} - -const SM_MotionState & -SM_Object:: -getPreviousFrame() const -{ - return m_frames[0]; -} - -const SM_MotionState & -SM_Object:: -getNextFrame() const -{ - return m_frames[2]; -} - - -const MT_Point3& -SM_Object:: -getPosition() const -{ - return m_frames[1].getPosition(); -} - -const MT_Quaternion& -SM_Object:: -getOrientation() const -{ - return m_frames[1].getOrientation(); -} - -const MT_Vector3& -SM_Object:: -getLinearVelocity() const -{ - return m_frames[1].getLinearVelocity(); -} - -const MT_Vector3& -SM_Object:: -getAngularVelocity() const -{ - return m_frames[1].getAngularVelocity(); -} - -void -SM_Object:: -interpolate(MT_Scalar timeStep) -{ - if (!actualLinVelocity().fuzzyZero() || !actualAngVelocity().fuzzyZero()) - { - getCurrentFrame().setTime(timeStep); - getCurrentFrame().lerp(getPreviousFrame(), getNextFrame()); - notifyClient(); - } -} - -void -SM_Object:: -endFrame() -{ - getPreviousFrame() = getNextFrame(); - getCurrentFrame() = getNextFrame(); - m_static = 0; -} diff --git a/source/gameengine/Physics/Sumo/Fuzzics/src/SM_Scene.cpp b/source/gameengine/Physics/Sumo/Fuzzics/src/SM_Scene.cpp deleted file mode 100644 index f0791bbf89f..00000000000 --- a/source/gameengine/Physics/Sumo/Fuzzics/src/SM_Scene.cpp +++ /dev/null @@ -1,378 +0,0 @@ -/** - * $Id$ - * Copyright (C) 2001 NaN Technologies B.V. - * The physics scene. - * - * ***** 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 ***** - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#ifdef WIN32 -#pragma warning(disable : 4786) // shut off 255 char limit debug template warning -#endif - -#include "SM_Scene.h" -#include "SM_Object.h" -#include "SM_FhObject.h" - -#include "SM_Debug.h" - -#include <algorithm> - -SM_Scene::SM_Scene() : - m_scene(DT_CreateScene()), - m_respTable(DT_CreateRespTable()), - m_secondaryRespTable(DT_CreateRespTable()), - m_fixRespTable(DT_CreateRespTable()), - m_forceField(0.0, 0.0, 0.0), - m_frames(0) -{ - for (int i = 0 ; i < NUM_RESPONSE; i++) - { - m_ResponseClass[i] = DT_GenResponseClass(m_respTable); - m_secondaryResponseClass[i] = DT_GenResponseClass(m_secondaryRespTable); - m_fixResponseClass[i] = DT_GenResponseClass(m_fixRespTable); - } - - /* Sensor */ - DT_AddPairResponse(m_respTable, m_ResponseClass[SENSOR_RESPONSE], m_ResponseClass[SENSOR_RESPONSE], 0, DT_NO_RESPONSE, this); - DT_AddPairResponse(m_respTable, m_ResponseClass[SENSOR_RESPONSE], m_ResponseClass[STATIC_RESPONSE], SM_Scene::boing, DT_SIMPLE_RESPONSE, this); - DT_AddPairResponse(m_respTable, m_ResponseClass[SENSOR_RESPONSE], m_ResponseClass[OBJECT_RESPONSE], SM_Scene::boing, DT_SIMPLE_RESPONSE, this); - DT_AddPairResponse(m_respTable, m_ResponseClass[SENSOR_RESPONSE], m_ResponseClass[FH_RESPONSE], 0, DT_NO_RESPONSE, this); - - /* Static */ - DT_AddPairResponse(m_respTable, m_ResponseClass[STATIC_RESPONSE], m_ResponseClass[SENSOR_RESPONSE], SM_Scene::boing, DT_SIMPLE_RESPONSE, this); - DT_AddPairResponse(m_respTable, m_ResponseClass[STATIC_RESPONSE], m_ResponseClass[STATIC_RESPONSE], 0, DT_NO_RESPONSE, this); - DT_AddPairResponse(m_respTable, m_ResponseClass[STATIC_RESPONSE], m_ResponseClass[OBJECT_RESPONSE], SM_Object::boing, DT_BROAD_RESPONSE, this); - DT_AddPairResponse(m_respTable, m_ResponseClass[STATIC_RESPONSE], m_ResponseClass[FH_RESPONSE], SM_FhObject::ray_hit, DT_SIMPLE_RESPONSE, this); - - /* Object */ - DT_AddPairResponse(m_respTable, m_ResponseClass[OBJECT_RESPONSE], m_ResponseClass[SENSOR_RESPONSE], SM_Scene::boing, DT_SIMPLE_RESPONSE, this); - DT_AddPairResponse(m_respTable, m_ResponseClass[OBJECT_RESPONSE], m_ResponseClass[STATIC_RESPONSE], SM_Object::boing, DT_BROAD_RESPONSE, this); - DT_AddPairResponse(m_respTable, m_ResponseClass[OBJECT_RESPONSE], m_ResponseClass[OBJECT_RESPONSE], SM_Object::boing, DT_BROAD_RESPONSE, this); - DT_AddPairResponse(m_respTable, m_ResponseClass[OBJECT_RESPONSE], m_ResponseClass[FH_RESPONSE], SM_FhObject::ray_hit, DT_SIMPLE_RESPONSE, this); - - /* Fh Object */ - DT_AddPairResponse(m_respTable, m_ResponseClass[FH_RESPONSE], m_ResponseClass[SENSOR_RESPONSE], 0, DT_NO_RESPONSE, this); - DT_AddPairResponse(m_respTable, m_ResponseClass[FH_RESPONSE], m_ResponseClass[STATIC_RESPONSE], SM_FhObject::ray_hit, DT_SIMPLE_RESPONSE, this); - DT_AddPairResponse(m_respTable, m_ResponseClass[FH_RESPONSE], m_ResponseClass[OBJECT_RESPONSE], SM_FhObject::ray_hit, DT_SIMPLE_RESPONSE, this); - DT_AddPairResponse(m_respTable, m_ResponseClass[FH_RESPONSE], m_ResponseClass[FH_RESPONSE], 0, DT_NO_RESPONSE, this); - - /* Object (Fix Pass) */ - DT_AddPairResponse(m_fixRespTable, m_ResponseClass[OBJECT_RESPONSE], m_ResponseClass[SENSOR_RESPONSE], 0, DT_NO_RESPONSE, this); - DT_AddPairResponse(m_fixRespTable, m_ResponseClass[OBJECT_RESPONSE], m_ResponseClass[STATIC_RESPONSE], SM_Object::fix, DT_BROAD_RESPONSE, this); - DT_AddPairResponse(m_fixRespTable, m_ResponseClass[OBJECT_RESPONSE], m_ResponseClass[OBJECT_RESPONSE], SM_Object::fix, DT_BROAD_RESPONSE, this); - DT_AddPairResponse(m_fixRespTable, m_ResponseClass[OBJECT_RESPONSE], m_ResponseClass[FH_RESPONSE], 0, DT_NO_RESPONSE, this); -} - -void SM_Scene::addTouchCallback(int response_class, DT_ResponseCallback callback, void *user) -{ - DT_AddClassResponse(m_secondaryRespTable, m_secondaryResponseClass[response_class], callback, DT_BROAD_RESPONSE, user); -} - -void SM_Scene::addSensor(SM_Object& object) -{ - T_ObjectList::iterator i = - std::find(m_objectList.begin(), m_objectList.end(), &object); - if (i == m_objectList.end()) - { - object.calcXform(); - m_objectList.push_back(&object); - DT_AddObject(m_scene, object.getObjectHandle()); - DT_SetResponseClass(m_respTable, object.getObjectHandle(), m_ResponseClass[SENSOR_RESPONSE]); - DT_SetResponseClass(m_secondaryRespTable, object.getObjectHandle(), m_secondaryResponseClass [SENSOR_RESPONSE]); - DT_SetResponseClass(m_fixRespTable, object.getObjectHandle(), m_fixResponseClass[SENSOR_RESPONSE]); - } -} - -void SM_Scene::add(SM_Object& object) { - object.calcXform(); - m_objectList.push_back(&object); - DT_AddObject(m_scene, object.getObjectHandle()); - if (object.isDynamic()) { - DT_SetResponseClass(m_respTable, object.getObjectHandle(), m_ResponseClass[OBJECT_RESPONSE]); - DT_SetResponseClass(m_secondaryRespTable, object.getObjectHandle(), m_secondaryResponseClass[OBJECT_RESPONSE]); - DT_SetResponseClass(m_fixRespTable, object.getObjectHandle(), m_fixResponseClass[OBJECT_RESPONSE]); - } else { - DT_SetResponseClass(m_respTable, object.getObjectHandle(), m_ResponseClass[STATIC_RESPONSE]); - DT_SetResponseClass(m_secondaryRespTable, object.getObjectHandle(), m_secondaryResponseClass[STATIC_RESPONSE]); - DT_SetResponseClass(m_fixRespTable, object.getObjectHandle(), m_fixResponseClass[STATIC_RESPONSE]); - } - - SM_FhObject *fh_object = object.getFhObject(); - - if (fh_object) { - DT_AddObject(m_scene, fh_object->getObjectHandle()); - DT_SetResponseClass(m_respTable, fh_object->getObjectHandle(), m_ResponseClass[FH_RESPONSE]); - DT_SetResponseClass(m_secondaryRespTable, fh_object->getObjectHandle(), m_secondaryResponseClass[FH_RESPONSE]); - DT_SetResponseClass(m_fixRespTable, fh_object->getObjectHandle(), m_fixResponseClass[FH_RESPONSE]); - } -} - -void SM_Scene::requestCollisionCallback(SM_Object &object) -{ - DT_SetResponseClass(m_respTable, object.getObjectHandle(), m_ResponseClass[OBJECT_RESPONSE]); - DT_SetResponseClass(m_secondaryRespTable, object.getObjectHandle(), m_secondaryResponseClass[OBJECT_RESPONSE]); -// DT_SetResponseClass(m_fixRespTable, object.getObjectHandle(), m_fixResponseClass[OBJECT_RESPONSE]); -} - -void SM_Scene::remove(SM_Object& object) { - //std::cout << "SM_Scene::remove this =" << this << "object = " << &object << std::endl; - T_ObjectList::iterator i = - std::find(m_objectList.begin(), m_objectList.end(), &object); - if (!(i == m_objectList.end())) - { - std::swap(*i, m_objectList.back()); - m_objectList.pop_back(); - DT_RemoveObject(m_scene, object.getObjectHandle()); - - SM_FhObject *fh_object = object.getFhObject(); - - if (fh_object) { - DT_RemoveObject(m_scene, fh_object->getObjectHandle()); - } - } - else { - // tried to remove an object that is not in the scene - //assert(false); - } -} - -void SM_Scene::beginFrame() -{ - T_ObjectList::iterator i; - // Apply a forcefield (such as gravity) - for (i = m_objectList.begin(); i != m_objectList.end(); ++i) - (*i)->applyForceField(m_forceField); - -} - -void SM_Scene::endFrame() -{ - T_ObjectList::iterator i; - for (i = m_objectList.begin(); i != m_objectList.end(); ++i) - (*i)->clearForce(); -} - -bool SM_Scene::proceed(MT_Scalar curtime, MT_Scalar ticrate) -{ - if (!m_frames) - { - if (ticrate > 0.) - m_frames = (unsigned int)(curtime*ticrate) + 1.0; - else - m_frames = (unsigned int)(curtime*65536.0); - } - - // Divide the timeStep into a number of subsamples of size roughly - // equal to subS (might be a little smaller). - MT_Scalar subStep; - int num_samples; - int frames = m_frames; - - // Compute the number of steps to do this update. - if (ticrate > 0.0) - { - // Fixed time step - subStep = 1.0/ticrate; - num_samples = (unsigned int)(curtime*ticrate + 1.0) - m_frames; - - if (num_samples > 4) - { - std::cout << "Dropping physics frames! frames:" << num_samples << " substep: " << subStep << std::endl; - MT_Scalar tr = ticrate; - do - { - frames = frames / 2; - tr = tr / 2.0; - num_samples = (unsigned int)(curtime*tr + 1.0) - frames; - subStep *= 2.0; - } while (num_samples > 8); - std::cout << " frames:" << num_samples << " substep: " << subStep << std::endl; - } - } - else - { - // Variable time step. (old update) - // Integrate at least 100 Hz - MT_Scalar timeStep = curtime - m_frames/65536.0; - subStep = timeStep > 0.01 ? 0.01 : timeStep; - num_samples = int(timeStep * 0.01); - if (num_samples < 1) - num_samples = 1; - } - - // Do a physics timestep. - T_ObjectList::iterator i; - if (num_samples > 0) - { - // Do the integration steps per object. - for (int step = 0; step != num_samples; ++step) - { - MT_Scalar time; - if (ticrate > 0.) - time = MT_Scalar(frames + step + 1) * subStep; - else - time = MT_Scalar(m_frames)/65536.0 + MT_Scalar(step + 1)*subStep; - - for (i = m_objectList.begin(); i != m_objectList.end(); ++i) { - (*i)->endFrame(); - // Apply a forcefield (such as gravity) - (*i)->integrateForces(subStep); - // And second we update the object positions by performing - // an integration step for each object - (*i)->integrateMomentum(subStep); - } - - // So now first we let the physics scene respond to - // new forces, velocities set externally. - // The collsion and friction impulses are computed here. - // Collision phase - DT_Test(m_scene, m_respTable); - - // Contact phase - DT_Test(m_scene, m_fixRespTable); - - // Finish this timestep by saving al state information for the next - // timestep and clearing the accumulated forces. - for (i = m_objectList.begin(); i != m_objectList.end(); ++i) { - (*i)->relax(); - (*i)->proceedKinematic(subStep); - (*i)->saveReactionForce(subStep); - (*i)->getNextFrame().setTime(time); - //(*i)->clearForce(); - } - } - } - - if (ticrate > 0) - { - // Interpolate between time steps. - for (i = m_objectList.begin(); i != m_objectList.end(); ++i) - (*i)->interpolate(curtime); - - //only update the m_frames after an actual physics timestep - if (num_samples) - { - m_frames = (unsigned int)(curtime*ticrate) + 1.0; - } - } - else - { - m_frames = (unsigned int)(curtime*65536.0); - } - - return num_samples != 0; -} - -void SM_Scene::notifyCollision(SM_Object *obj1, SM_Object *obj2) -{ - // For each pair of object that collided, call the corresponding callback. - if (m_secondaryRespTable) - DT_CallResponse(m_secondaryRespTable, obj1->getObjectHandle(), obj2->getObjectHandle(), 0); -} - - -SM_Object *SM_Scene::rayTest(void *ignore_client, - const MT_Point3& from, const MT_Point3& to, - MT_Point3& result, MT_Vector3& normal) const { -#ifdef SM_DEBUG_RAYCAST - std::cout << "ray: { " << from << " } - { " << to << " }" << std::endl; -#endif - - DT_Vector3 n, dfrom, dto; - DT_Scalar param; - from.getValue(dfrom); - to.getValue(dto); - SM_Object *hit_object = (SM_Object *) - DT_RayCast(m_scene, ignore_client, dfrom, dto, 1., ¶m, n); - - if (hit_object) { - //result = hit_object->getWorldCoord(from + (to - from)*param); - result = from + (to - from) * param; - normal.setValue(n); -#ifdef SM_DEBUG_RAYCAST - std::cout << "ray: { " << from << " } -> { " << to << " }: { " << result - << " } (" << param << "), normal = { " << normal << " }" << std::endl; -#endif - } - - return hit_object; -} - -void SM_Scene::clearObjectCombinedVelocities() { - - T_ObjectList::iterator i; - - for (i = m_objectList.begin(); i != m_objectList.end(); ++i) { - - (*i)->clearCombinedVelocities(); - - } - -} - - -void SM_Scene::setSecondaryRespTable(DT_RespTableHandle secondaryRespTable) { - m_secondaryRespTable = secondaryRespTable; -} - - -DT_Bool SM_Scene::boing( - void *client_data, - void *object1, - void *object2, - const DT_CollData * -){ - SM_Scene *scene = (SM_Scene *)client_data; - SM_Object *obj1 = (SM_Object *)object1; - SM_Object *obj2 = (SM_Object *)object2; - - scene->notifyCollision(obj1, obj2); // Record this collision for client callbacks - -#ifdef SM_DEBUG_BOING - printf("SM_Scene::boing\n"); -#endif - - return DT_CONTINUE; -} - -SM_Scene::~SM_Scene() -{ - //std::cout << "SM_Scene::~ SM_Scene(): destroy " << this << std::endl; -// if (m_objectList.begin() != m_objectList.end()) -// std::cout << "SM_Scene::~SM_Scene: There are still objects in the Sumo scene!" << std::endl; - for (T_ObjectList::iterator it = m_objectList.begin() ; it != m_objectList.end() ; it++) - delete *it; - - DT_DestroyRespTable(m_respTable); - DT_DestroyRespTable(m_secondaryRespTable); - DT_DestroyRespTable(m_fixRespTable); - DT_DestroyScene(m_scene); -} diff --git a/source/gameengine/Physics/Sumo/Makefile b/source/gameengine/Physics/Sumo/Makefile deleted file mode 100644 index 69efc4d84eb..00000000000 --- a/source/gameengine/Physics/Sumo/Makefile +++ /dev/null @@ -1,50 +0,0 @@ -# -# $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 ***** -# -# - -SOURCEDIR = source/gameengine/Physics/Sumo -LIBNAME = sumo -DIR = $(OCGDIR)/gameengine/blphys/$(LIBNAME) -DIRS = Fuzzics - -include nan_compile.mk - -CCFLAGS += $(LEVEL_1_CPP_WARNINGS) - -CPPFLAGS += -I$(OPENGL_HEADERS) -CPPFLAGS += -I$(NAN_STRING)/include -CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION) - -CPPFLAGS += -I$(NAN_FUZZICS)/include -I$(NAN_SUMO) -I$(NAN_MOTO)/include -CPPFLAGS += -I$(NAN_SOLID)/include -CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include -CPPFLAGS += -I../../Physics/common -CPPFLAGS += -I../../Physics/Dummy - -include nan_subdirs.mk diff --git a/source/gameengine/Physics/Sumo/SConscript b/source/gameengine/Physics/Sumo/SConscript deleted file mode 100644 index a228a986af2..00000000000 --- a/source/gameengine/Physics/Sumo/SConscript +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/python -Import ('env') - -sources = ['SumoPHYCallbackBridge.cpp', - 'SumoPhysicsController.cpp', - 'SumoPhysicsEnvironment.cpp', - 'Fuzzics/src/SM_FhObject.cpp', - 'Fuzzics/src/SM_Object.cpp', - 'Fuzzics/src/SM_Scene.cpp', - 'Fuzzics/src/SM_MotionState.cpp' - ] - -incs =['.', - '../common', - 'Fuzzics/include', - '#/intern/moto/include' - ] -incs += [env['BF_SOLID_INC']] - -cflags = [] -if env['OURPLATFORM']=='win32-vc': - cflags.append('/GR') - cflags.append('/O1') - -env.BlenderLib ( 'bf_sumo', sources, incs, [], libtype=['core','player'], priority=[400, 55] , compileflags=cflags) diff --git a/source/gameengine/Physics/Sumo/SumoPHYCallbackBridge.cpp b/source/gameengine/Physics/Sumo/SumoPHYCallbackBridge.cpp deleted file mode 100644 index 1992bbe3421..00000000000 --- a/source/gameengine/Physics/Sumo/SumoPHYCallbackBridge.cpp +++ /dev/null @@ -1,66 +0,0 @@ -#include "SumoPHYCallbackBridge.h" -#include "PHY_IPhysicsController.h" -#include "SM_Object.h" - - -SumoPHYCallbackBridge::SumoPHYCallbackBridge(void* clientData,PHY_ResponseCallback phyCallback) -:m_orgClientData(clientData), -m_phyCallback(phyCallback) -{ - -} -DT_Bool SumoPHYCallbackBridge::StaticSolidToPHYCallback(void *client_data, - void *client_object1, - void *client_object2, - const DT_CollData *coll_data) -{ - SumoPHYCallbackBridge* bridge = static_cast<SumoPHYCallbackBridge*>(client_data); - bridge->SolidToPHY(client_object1,client_object2,coll_data); - return false; -} - -DT_Bool SumoPHYCallbackBridge::SolidToPHY(void *client_object1, - void *client_object2, - const DT_CollData *coll_data) -{ - - SM_Object* smObject1 = static_cast<SM_Object*>(client_object1); - SM_Object* smObject2 = static_cast<SM_Object*>(client_object2); - - PHY_IPhysicsController* ctrl1 = static_cast<PHY_IPhysicsController*>(smObject1->getPhysicsClientObject()); - PHY_IPhysicsController* ctrl2 = static_cast<PHY_IPhysicsController*>(smObject2->getPhysicsClientObject()); - - if (!ctrl1 || !ctrl2) - { - //todo: check which objects are not linked up properly - return false; - } - if (coll_data) - { - PHY_CollData phyCollData; - - phyCollData.m_point1[0] = coll_data->point1[0]; - phyCollData.m_point1[1] = coll_data->point1[1]; - phyCollData.m_point1[2] = coll_data->point1[2]; - phyCollData.m_point1[3] = 0.f; - - phyCollData.m_point2[0] = coll_data->point2[0]; - phyCollData.m_point2[1] = coll_data->point2[1]; - phyCollData.m_point2[2] = coll_data->point2[2]; - phyCollData.m_point2[3] = 0.f; - - phyCollData.m_normal[0] = coll_data->normal[0]; - phyCollData.m_normal[1] = coll_data->normal[1]; - phyCollData.m_normal[2] = coll_data->normal[2]; - phyCollData.m_normal[3] = 0.f; - - - return m_phyCallback(m_orgClientData, - ctrl1,ctrl2,&phyCollData); - } - - return m_phyCallback(m_orgClientData, - ctrl1,ctrl2,0); - -} - diff --git a/source/gameengine/Physics/Sumo/SumoPHYCallbackBridge.h b/source/gameengine/Physics/Sumo/SumoPHYCallbackBridge.h deleted file mode 100644 index cc980f3961d..00000000000 --- a/source/gameengine/Physics/Sumo/SumoPHYCallbackBridge.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef SUMO_PHY_CALLBACK_BRIDGE_H -#define SUMO_PHY_CALLBACK_BRIDGE_H - -#include <SOLID/SOLID.h> -#include "PHY_DynamicTypes.h" - -class SumoPHYCallbackBridge -{ - void* m_orgClientData; - PHY_ResponseCallback m_phyCallback; - -public: - - SumoPHYCallbackBridge(void* clientData,PHY_ResponseCallback phyCallback); - - static DT_Bool StaticSolidToPHYCallback(void *client_data, - void *client_object1, - void *client_object2, - const DT_CollData *coll_data); - - DT_Bool SolidToPHY(void *client_object1, - void *client_object2, - const DT_CollData *coll_data); - - -}; - -#endif //SUMO_PHY_CALLBACK_BRIDGE_H diff --git a/source/gameengine/Physics/Sumo/SumoPhysicsController.cpp b/source/gameengine/Physics/Sumo/SumoPhysicsController.cpp deleted file mode 100644 index 56caa9236bf..00000000000 --- a/source/gameengine/Physics/Sumo/SumoPhysicsController.cpp +++ /dev/null @@ -1,495 +0,0 @@ -/** - * @file $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 ***** - */ - -#include "SumoPhysicsController.h" -#include "PHY_IMotionState.h" -#include "SM_Object.h" -#include "MT_Quaternion.h" - - -SumoPhysicsController::SumoPhysicsController( - class SM_Scene* sumoScene, - class SM_Object* sumoObj, - class PHY_IMotionState* motionstate, - - bool dyna) - : - m_sumoObj(sumoObj) , - m_sumoScene(sumoScene), - m_bFirstTime(true), - m_bDyna(dyna), - m_MotionState(motionstate) -{ - if (m_sumoObj) - { - - PHY__Vector3 pos1; - getPosition(pos1); - MT_Point3 pos(pos1); - - //temp debugging check - //assert(pos.length() < 100000.f); - - //need this to do the upcast after the solid/sumo collision callback - m_sumoObj->setPhysicsClientObject(this); - //if it is a dyna, register for a callback - m_sumoObj->registerCallback(*this); - } -}; - - - -SumoPhysicsController::~SumoPhysicsController() -{ - if (m_sumoObj) - { - m_sumoScene->remove(*m_sumoObj); - - delete m_sumoObj; - m_sumoObj = NULL; - } -} - -float SumoPhysicsController::getMass() -{ - if (m_sumoObj) - { - const SM_ShapeProps *shapeprops = m_sumoObj->getShapeProps(); - if(shapeprops!=NULL) return shapeprops->m_mass; - } - return 0.f; -} - -bool SumoPhysicsController::SynchronizeMotionStates(float) -{ - if (m_bFirstTime) - { - setSumoTransform(!m_bFirstTime); - m_bFirstTime = false; - } - return false; -} - - - - -void SumoPhysicsController::GetWorldOrientation(MT_Matrix3x3& mat) -{ - float orn[4]; - m_MotionState->getWorldOrientation(orn[0],orn[1],orn[2],orn[3]); - MT_Quaternion quat(orn); - mat.setRotation(quat); - -} - -void SumoPhysicsController::getPosition(PHY__Vector3& pos) const -{ - assert(m_sumoObj); - - pos[0] = m_sumoObj->getPosition()[0]; - pos[1] = m_sumoObj->getPosition()[0]; - pos[2] = m_sumoObj->getPosition()[0]; - - //m_MotionState->getWorldPosition(pos[0],pos[1],pos[2]); -} - -void SumoPhysicsController::GetWorldPosition(MT_Point3& pos) -{ -// assert(m_sumoObj); - -// pos[0] = m_sumoObj->getPosition()[0]; -// pos[1] = m_sumoObj->getPosition()[0]; -// pos[2] = m_sumoObj->getPosition()[0]; - - float worldpos[3]; - m_MotionState->getWorldPosition(worldpos[0],worldpos[1],worldpos[2]); - pos[0]=worldpos[0]; - pos[1]=worldpos[1]; - pos[2]=worldpos[2]; -} - -void SumoPhysicsController::GetWorldScaling(MT_Vector3& scale) -{ - float worldscale[3]; - m_MotionState->getWorldScaling(worldscale[0],worldscale[1],worldscale[2]); - scale[0]=worldscale[0]; - scale[1]=worldscale[1]; - scale[2]=worldscale[2]; -} - - - // kinematic methods -void SumoPhysicsController::RelativeTranslate(float dlocX,float dlocY,float dlocZ,bool local) -{ - if (m_sumoObj) - { - MT_Matrix3x3 mat; - GetWorldOrientation(mat); - MT_Vector3 dloc(dlocX,dlocY,dlocZ); - - MT_Point3 newpos = m_sumoObj->getPosition(); - - newpos += (local ? mat * dloc : dloc); - m_sumoObj->setPosition(newpos); - } - -} -void SumoPhysicsController::RelativeRotate(const float drot[12],bool local) -{ - if (m_sumoObj ) - { - MT_Matrix3x3 drotmat(drot); - MT_Matrix3x3 currentOrn; - GetWorldOrientation(currentOrn); - - m_sumoObj->setOrientation(m_sumoObj->getOrientation()*(local ? - drotmat : (currentOrn.inverse() * drotmat * currentOrn)).getRotation()); - } - -} -void SumoPhysicsController::setOrientation(float quatImag0,float quatImag1,float quatImag2,float quatReal) -{ - m_sumoObj->setOrientation(MT_Quaternion(quatImag0,quatImag1,quatImag2,quatReal)); -} - -void SumoPhysicsController::getOrientation(float &quatImag0,float &quatImag1,float &quatImag2,float &quatReal) -{ - const MT_Quaternion& q = m_sumoObj->getOrientation(); - quatImag0 = q[0]; - quatImag1 = q[1]; - quatImag2 = q[2]; - quatReal = q[3]; -} - -void SumoPhysicsController::setPosition(float posX,float posY,float posZ) -{ - m_sumoObj->setPosition(MT_Point3(posX,posY,posZ)); -} - -void SumoPhysicsController::setScaling(float scaleX,float scaleY,float scaleZ) -{ - if (!m_bDyna) - m_sumoObj->setScaling(MT_Vector3(scaleX,scaleY,scaleZ)); -} - - // physics methods -void SumoPhysicsController::ApplyTorque(float torqueX,float torqueY,float torqueZ,bool local) -{ - if (m_sumoObj) - { - MT_Vector3 torque(torqueX,torqueY,torqueZ); - - MT_Matrix3x3 orn; - GetWorldOrientation(orn); - m_sumoObj->applyTorque(local ? - orn * torque : - torque); - } -} - -void SumoPhysicsController::ApplyForce(float forceX,float forceY,float forceZ,bool local) -{ - if (m_sumoObj) - { - MT_Vector3 force(forceX,forceY,forceZ); - - MT_Matrix3x3 orn; - GetWorldOrientation(orn); - - m_sumoObj->applyCenterForce(local ? - orn * force : - force); - } -} - -void SumoPhysicsController::SetAngularVelocity(float ang_velX,float ang_velY,float ang_velZ,bool local) -{ - if (m_sumoObj) - { - MT_Vector3 ang_vel(ang_velX,ang_velY,ang_velZ); - - MT_Matrix3x3 orn; - GetWorldOrientation(orn); - - m_sumoObj->setExternalAngularVelocity(local ? - orn * ang_vel : - ang_vel); - } -} - -void SumoPhysicsController::SetLinearVelocity(float lin_velX,float lin_velY,float lin_velZ,bool local) -{ - if (m_sumoObj ) - { - MT_Matrix3x3 orn; - GetWorldOrientation(orn); - - MT_Vector3 lin_vel(lin_velX,lin_velY,lin_velZ); - m_sumoObj->setExternalLinearVelocity(local ? - orn * lin_vel : - lin_vel); - } -} - -void SumoPhysicsController::resolveCombinedVelocities(float linvelX,float linvelY,float linvelZ,float angVelX,float angVelY,float angVelZ) -{ - if (m_sumoObj) - m_sumoObj->resolveCombinedVelocities(MT_Vector3(linvelX,linvelY,linvelZ),MT_Vector3(angVelX,angVelY,angVelZ)); -} - - - - -void SumoPhysicsController::applyImpulse(float attachX,float attachY,float attachZ, float impulseX,float impulseY,float impulseZ) -{ - if (m_sumoObj) - { - MT_Point3 attach(attachX,attachY,attachZ); - MT_Vector3 impulse(impulseX,impulseY,impulseZ); - m_sumoObj->applyImpulse(attach,impulse); - } - -} - -void SumoPhysicsController::SuspendDynamics() -{ - m_suspendDynamics=true; - - if (m_sumoObj) - { - m_sumoObj->suspendDynamics(); - m_sumoObj->setLinearVelocity(MT_Vector3(0,0,0)); - m_sumoObj->setAngularVelocity(MT_Vector3(0,0,0)); - m_sumoObj->calcXform(); - } -} - -void SumoPhysicsController::RestoreDynamics() -{ - m_suspendDynamics=false; - - if (m_sumoObj) - { - m_sumoObj->restoreDynamics(); - } -} - - -/** - reading out information from physics -*/ -void SumoPhysicsController::GetLinearVelocity(float& linvX,float& linvY,float& linvZ) -{ - if (m_sumoObj) - { - // get velocity from the physics object (m_sumoObj) - const MT_Vector3& vel = m_sumoObj->getLinearVelocity(); - linvX = vel[0]; - linvY = vel[1]; - linvZ = vel[2]; - } - else - { - linvX = 0.f; - linvY = 0.f; - linvZ = 0.f; - } -} - -/** - GetVelocity parameters are in geometric coordinates (Origin is not center of mass!). -*/ -void SumoPhysicsController::GetVelocity(const float posX,const float posY,const float posZ,float& linvX,float& linvY,float& linvZ) -{ - if (m_sumoObj) - { - MT_Point3 pos(posX,posY,posZ); - // get velocity from the physics object (m_sumoObj) - const MT_Vector3& vel = m_sumoObj->getVelocity(pos); - linvX = vel[0]; - linvY = vel[1]; - linvZ = vel[2]; - } - else - { - linvX = 0.f; - linvY = 0.f; - linvZ = 0.f; - - } -} - -void SumoPhysicsController::getReactionForce(float& forceX,float& forceY,float& forceZ) -{ - const MT_Vector3& force = m_sumoObj->getReactionForce(); - forceX = force[0]; - forceY = force[1]; - forceZ = force[2]; -} - -void SumoPhysicsController::setRigidBody(bool rigid) -{ - m_sumoObj->setRigidBody(rigid); -} - -void SumoPhysicsController::PostProcessReplica(class PHY_IMotionState* motionstate,class PHY_IPhysicsController* parentctrl) -{ - m_MotionState = motionstate; - - SM_Object* dynaparent=0; - SumoPhysicsController* sumoparentctrl = (SumoPhysicsController* )parentctrl; - - if (sumoparentctrl) - { - dynaparent = sumoparentctrl->GetSumoObject(); - } - - SM_Object* orgsumoobject = m_sumoObj; - - - m_sumoObj = new SM_Object( - orgsumoobject->getShapeHandle(), - orgsumoobject->getMaterialProps(), - orgsumoobject->getShapeProps(), - dynaparent); - - m_sumoObj->setRigidBody(orgsumoobject->isRigidBody()); - - m_sumoObj->setMargin(orgsumoobject->getMargin()); - m_sumoObj->setPosition(orgsumoobject->getPosition()); - m_sumoObj->setOrientation(orgsumoobject->getOrientation()); - //if it is a dyna, register for a callback - m_sumoObj->registerCallback(*this); - - m_sumoScene->add(* (m_sumoObj)); -} - -PHY_IMotionState* SumoPhysicsController::GetMotionState() -{ - return m_MotionState; -} - -void SumoPhysicsController::SetSimulatedTime(float) -{ -} - - -void SumoPhysicsController::WriteMotionStateToDynamics(bool) -{ - -} -// this is the actual callback from sumo, and the position/orientation -//is written to the scenegraph, using the motionstate abstraction - -void SumoPhysicsController::do_me() -{ - MT_assert(m_sumoObj); - const MT_Point3& pos = m_sumoObj->getPosition(); - const MT_Quaternion& orn = m_sumoObj->getOrientation(); - - MT_assert(m_MotionState); - m_MotionState->setWorldPosition(pos[0],pos[1],pos[2]); - m_MotionState->setWorldOrientation(orn[0],orn[1],orn[2],orn[3]); -} - - -void SumoPhysicsController::setSumoTransform(bool nondynaonly) -{ - if (!nondynaonly || !m_bDyna) - { - if (m_sumoObj) - { - MT_Point3 pos; - GetWorldPosition(pos); - - m_sumoObj->setPosition(pos); - if (m_bDyna) - { - m_sumoObj->setScaling(MT_Vector3(1,1,1)); - } else - { - MT_Vector3 scale; - GetWorldScaling(scale); - m_sumoObj->setScaling(scale); - } - MT_Matrix3x3 orn; - GetWorldOrientation(orn); - m_sumoObj->setOrientation(orn.getRotation()); - m_sumoObj->calcXform(); - } - } -} - - - // clientinfo for raycasts for example -void* SumoPhysicsController::getNewClientInfo() -{ - if (m_sumoObj) - return m_sumoObj->getClientObject(); - return 0; - -} -void SumoPhysicsController::setNewClientInfo(void* clientinfo) -{ - if (m_sumoObj) - { - SM_ClientObject* clOb = static_cast<SM_ClientObject*> (clientinfo); - m_sumoObj->setClientObject(clOb); - } - -} - -void SumoPhysicsController::calcXform() -{ - if (m_sumoObj) - m_sumoObj->calcXform(); -} - -void SumoPhysicsController::SetMargin(float margin) -{ - if (m_sumoObj) - m_sumoObj->setMargin(margin); -} - -float SumoPhysicsController::GetMargin() const -{ - if (m_sumoObj) - m_sumoObj->getMargin(); - return 0.f; -} - -float SumoPhysicsController::GetRadius() const -{ - if (m_sumoObj && m_sumoObj->getShapeProps()) - { - return m_sumoObj->getShapeProps()->m_radius; - } - return 0.f; - -} diff --git a/source/gameengine/Physics/Sumo/SumoPhysicsController.h b/source/gameengine/Physics/Sumo/SumoPhysicsController.h deleted file mode 100644 index adf29649f18..00000000000 --- a/source/gameengine/Physics/Sumo/SumoPhysicsController.h +++ /dev/null @@ -1,192 +0,0 @@ -/** - * @file $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 ***** - */ -#ifndef __SUMO_PHYSICSCONTROLLER_H -#define __SUMO_PHYSICSCONTROLLER_H - -#include "PHY_IPhysicsController.h" -#include "SM_Scene.h" -#include "SM_Callback.h" - -/** - * Sumo Physics Controller, a special kind of a PhysicsController. - * A Physics Controller is a special kind of Scene Graph Transformation Controller. - * Each time the scene graph get's updated, the controller get's a chance - * in the 'Update' method to reflect changes. - * - * Sumo uses the SOLID library for collision detection. - */ -class SumoPhysicsController : public PHY_IPhysicsController , public SM_Callback - - -{ - - -public: - SumoPhysicsController( - class SM_Scene* sumoScene, - class SM_Object* sumoObj, - class PHY_IMotionState* motionstate, - bool dyna); - - virtual ~SumoPhysicsController(); - - /** - * @name Kinematic Methods. - */ - /*@{*/ - virtual void RelativeTranslate(float dlocX,float dlocY,float dlocZ,bool local); - /** - * @param drot a 3x4 matrix. This will treated as a 3x3 rotation matrix. - * @warning RelativeRotate expects a 3x4 matrix. The fourth column is padding. - */ - virtual void RelativeRotate(const float drot[12],bool local); - virtual void getOrientation(float &quatImag0,float &quatImag1,float &quatImag2,float &quatReal); - virtual void setOrientation(float quatImag0,float quatImag1,float quatImag2,float quatReal); - virtual void setPosition(float posX,float posY,float posZ); - virtual void getPosition(PHY__Vector3& pos) const; - - virtual void setScaling(float scaleX,float scaleY,float scaleZ); - /*@}*/ - - /** - * @name Physics Methods - */ - /*@{*/ - virtual void ApplyTorque(float torqueX,float torqueY,float torqueZ,bool local); - virtual void ApplyForce(float forceX,float forceY,float forceZ,bool local); - virtual void SetAngularVelocity(float ang_velX,float ang_velY,float ang_velZ,bool local); - virtual void SetLinearVelocity(float lin_velX,float lin_velY,float lin_velZ,bool local); - virtual void resolveCombinedVelocities(float linvelX,float linvelY,float linvelZ,float angVelX,float angVelY,float angVelZ); - virtual void applyImpulse(float attachX,float attachY,float attachZ, float impulseX,float impulseY,float impulseZ); - virtual void SetActive(bool active){}; - virtual void SuspendDynamics(); - virtual void RestoreDynamics(); - /*@}*/ - - - /** - * reading out information from physics - */ - virtual void GetLinearVelocity(float& linvX,float& linvY,float& linvZ); - /** - * GetVelocity parameters are in geometric coordinates (Origin is not center of mass!). - */ - virtual void GetVelocity(const float posX,const float posY,const float posZ,float& linvX,float& linvY,float& linvZ); - virtual float getMass(); - virtual void getReactionForce(float& forceX,float& forceY,float& forceZ); - virtual void setRigidBody(bool rigid); - - - virtual void PostProcessReplica(class PHY_IMotionState* motionstate,class PHY_IPhysicsController* parentctrl); - - // TODO: remove next line ! - virtual void SetSimulatedTime(float time); - - virtual void WriteDynamicsToMotionState() {}; - virtual void WriteMotionStateToDynamics(bool nondynaonly); - virtual class PHY_IMotionState* GetMotionState(); - - /** - * call from Scene Graph Node to 'update'. - */ - virtual bool SynchronizeMotionStates(float time); - - virtual void calcXform(); - virtual void SetMargin(float margin) ; - virtual float GetMargin() const; - virtual float GetRadius() const ; - virtual void SetRadius(float margin) { SetMargin(margin); } - - - // clientinfo for raycasts for example - virtual void* getNewClientInfo(); - virtual void setNewClientInfo(void* clientinfo); - - float getFriction() { return m_friction;} - float getRestitution() { return m_restitution;} - - /** - * Sumo callback - */ - virtual void do_me(); - - class SM_Object* GetSumoObject () - { - return m_sumoObj; - }; - - void GetWorldOrientation(class MT_Matrix3x3& mat); - void GetWorldPosition(MT_Point3& pos); - void GetWorldScaling(MT_Vector3& scale); - - float GetLinVelocityMin() const { return 0.f; } - void SetLinVelocityMin(float val) { } - float GetLinVelocityMax() const { return 0.f; } - void SetLinVelocityMax(float val) { } - - -// void SetSumoObject(class SM_Object* sumoObj) { -// m_sumoObj = sumoObj; -// } -// void SetSumoScene(class SM_Scene* sumoScene) { -// m_sumoScene = sumoScene; -// } - - void setSumoTransform(bool nondynaonly); - - -private: - class SM_Object* m_sumoObj; - class SM_Scene* m_sumoScene; // needed for replication - bool m_bFirstTime; - bool m_bDyna; - - float m_friction; - float m_restitution; - - - bool m_suspendDynamics; - - bool m_firstTime; - bool m_bFullRigidBody; - bool m_bPhantom; // special flag for objects that are not affected by physics 'resolver' - - // data to calculate fake velocities for kinematic objects (non-dynas) - bool m_bKinematic; - bool m_bPrevKinematic; - - float m_lastTime; - - class PHY_IMotionState* m_MotionState; - - -}; - -#endif //__SUMO_PHYSICSCONTROLLER_H - diff --git a/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.cpp b/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.cpp deleted file mode 100644 index b4daf0a3f80..00000000000 --- a/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.cpp +++ /dev/null @@ -1,264 +0,0 @@ -/** - * $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 ***** - */ -#include <string.h> // memset -#include "SumoPhysicsEnvironment.h" -#include "PHY_IMotionState.h" -#include "SumoPhysicsController.h" -#include "SM_Scene.h" -#include "SumoPHYCallbackBridge.h" -#include <SOLID/SOLID.h> - -SumoPhysicsEnvironment::SumoPhysicsEnvironment() -{ - m_fixedTimeStep = 1.f/60.f; - m_useFixedTimeStep = true; - m_currentTime = 0.f; - - m_sumoScene = new SM_Scene(); -} - - - -SumoPhysicsEnvironment::~SumoPhysicsEnvironment() -{ - delete m_sumoScene; -} - - - -void SumoPhysicsEnvironment::beginFrame() -{ - m_sumoScene->beginFrame(); -} - -void SumoPhysicsEnvironment::endFrame() -{ - m_sumoScene->endFrame(); -} - -void SumoPhysicsEnvironment::setFixedTimeStep(bool useFixedTimeStep,float fixedTimeStep) -{ - m_useFixedTimeStep = useFixedTimeStep; - if (m_useFixedTimeStep) - { - m_fixedTimeStep = fixedTimeStep; - } else - { - m_fixedTimeStep = 0.f; - } - //reset current time ? - m_currentTime = 0.f; -} -float SumoPhysicsEnvironment::getFixedTimeStep() -{ - return m_fixedTimeStep; -} - - -bool SumoPhysicsEnvironment::proceedDeltaTime(double curTime,float timeStep,float interval) -{ - - bool result = false; - if (m_useFixedTimeStep) - { - m_currentTime += timeStep; - float ticrate = 1.f/m_fixedTimeStep; - - result = m_sumoScene->proceed(curTime, ticrate); - } else - { - m_currentTime += timeStep; - result = m_sumoScene->proceed(m_currentTime, timeStep); - } - return result; -} - -void SumoPhysicsEnvironment::setGravity(float x,float y,float z) -{ - m_sumoScene->setForceField(MT_Vector3(x,y,z)); -} - -int SumoPhysicsEnvironment::createConstraint( - class PHY_IPhysicsController* ctrl, - class PHY_IPhysicsController* ctrl2, - PHY_ConstraintType type, - float pivotX,float pivotY,float pivotZ, - float axisX,float axisY,float axisZ, - float axis1X,float axis1Y,float axis1Z, - float axis2X,float axis2Y,float axis2Z, - int flag - ) -{ - int constraintid = 0; - return constraintid; -} - -void SumoPhysicsEnvironment::removeConstraint(int constraintid) -{ - if (constraintid) - { - } -} - -PHY_IPhysicsController* SumoPhysicsEnvironment::rayTest(PHY_IRayCastFilterCallback &filterCallback, - float fromX,float fromY,float fromZ, - float toX,float toY,float toZ) -{ - SumoPhysicsController* ignoreCtr = static_cast<SumoPhysicsController*> (filterCallback.m_ignoreController); - - //collision detection / raytesting - MT_Point3 hit, normal; - PHY_RayCastResult result; - - SM_Object* sm_ignore = 0; - if (ignoreCtr) - sm_ignore = ignoreCtr->GetSumoObject(); - - memset(&result, 0, sizeof(result)); - - SM_Object* smOb = m_sumoScene->rayTest(sm_ignore,MT_Point3(fromX, fromY, fromZ),MT_Point3(toX, toY, toZ), hit, normal); - if (smOb) - { - result.m_controller = (PHY_IPhysicsController *) smOb->getPhysicsClientObject(); - result.m_hitPoint[0] = hit[0]; - result.m_hitPoint[1] = hit[1]; - result.m_hitPoint[2] = hit[2]; - result.m_hitNormal[0] = normal[0]; - result.m_hitNormal[1] = normal[1]; - result.m_hitNormal[2] = normal[2]; - filterCallback.reportHit(&result); - } - return result.m_controller; -} -//gamelogic callbacks -void SumoPhysicsEnvironment::addSensor(PHY_IPhysicsController* ctrl) -{ - SumoPhysicsController* smctrl = dynamic_cast<SumoPhysicsController*>(ctrl); - SM_Object* smObject = smctrl->GetSumoObject(); - assert(smObject); - if (smObject) - { - m_sumoScene->addSensor(*smObject); - } -} -void SumoPhysicsEnvironment::removeSensor(PHY_IPhysicsController* ctrl) -{ - SumoPhysicsController* smctrl = dynamic_cast<SumoPhysicsController*>(ctrl); - SM_Object* smObject = smctrl->GetSumoObject(); - assert(smObject); - if (smObject) - { - m_sumoScene->remove(*smObject); - } -} - - -void SumoPhysicsEnvironment::addTouchCallback(int response_class, PHY_ResponseCallback callback, void *user) -{ - - int sumoRespClass = 0; - - //map PHY_ convention into SM_ convention - switch (response_class) - { - case PHY_FH_RESPONSE: - sumoRespClass = FH_RESPONSE; - break; - case PHY_SENSOR_RESPONSE: - sumoRespClass = SENSOR_RESPONSE; - break; - case PHY_CAMERA_RESPONSE: - sumoRespClass =CAMERA_RESPONSE; - break; - case PHY_OBJECT_RESPONSE: - sumoRespClass = OBJECT_RESPONSE; - break; - case PHY_STATIC_RESPONSE: - sumoRespClass = PHY_STATIC_RESPONSE; - break; - case PHY_BROADPH_RESPONSE: - return; - default: - assert(0); - return; - } - - SumoPHYCallbackBridge* bridge = new SumoPHYCallbackBridge(user,callback); - - m_sumoScene->addTouchCallback(sumoRespClass,SumoPHYCallbackBridge::StaticSolidToPHYCallback,bridge); -} -bool SumoPhysicsEnvironment::requestCollisionCallback(PHY_IPhysicsController* ctrl) -{ - SumoPhysicsController* smctrl = dynamic_cast<SumoPhysicsController*>(ctrl); - MT_assert(smctrl); - SM_Object* smObject = smctrl->GetSumoObject(); - MT_assert(smObject); - if (smObject) - { - //assert(smObject->getPhysicsClientObject() == ctrl); - smObject->setPhysicsClientObject(ctrl); - - m_sumoScene->requestCollisionCallback(*smObject); - return true; - } - return false; -} - -bool SumoPhysicsEnvironment::removeCollisionCallback(PHY_IPhysicsController* ctrl) -{ - // intentionally empty - return false; -} - -PHY_IPhysicsController* SumoPhysicsEnvironment::CreateSphereController(float radius,const PHY__Vector3& position) -{ - DT_ShapeHandle shape = DT_NewSphere(0.0); - SM_Object* ob = new SM_Object(shape,0,0,0); - ob->setPosition(MT_Point3(position)); - //testing - MT_Quaternion rotquatje(MT_Vector3(0,0,1),MT_radians(90)); - ob->setOrientation(rotquatje); - - PHY_IPhysicsController* ctrl = new SumoPhysicsController(m_sumoScene,ob,0,false); - ctrl->SetMargin(radius); - return ctrl; -} -PHY_IPhysicsController* SumoPhysicsEnvironment::CreateConeController(float coneradius,float coneheight) -{ - DT_ShapeHandle shape = DT_NewCone(coneradius,coneheight); - SM_Object* ob = new SM_Object(shape,0,0,0); - ob->setPosition(MT_Point3(0.f,0.f,0.f)); - MT_Quaternion rotquatje(MT_Vector3(0,0,1),MT_radians(90)); - ob->setOrientation(rotquatje); - - PHY_IPhysicsController* ctrl = new SumoPhysicsController(m_sumoScene,ob,0,false); - - return ctrl; -} - diff --git a/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.h b/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.h deleted file mode 100644 index 5ae33eb4b0e..00000000000 --- a/source/gameengine/Physics/Sumo/SumoPhysicsEnvironment.h +++ /dev/null @@ -1,110 +0,0 @@ -/** - * $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 ***** - */ -#ifndef _SUMOPhysicsEnvironment -#define _SUMOPhysicsEnvironment - -#include "MT_Scalar.h" - -#include "PHY_IPhysicsEnvironment.h" -class SumoPHYCallbackBridge; -#include <vector> -/** -* Physics Environment takes care of stepping the simulation and is a container for physics entities (rigidbodies,constraints, materials etc.) -* A derived class may be able to 'construct' entities by loading and/or converting -*/ -class SumoPhysicsEnvironment : public PHY_IPhysicsEnvironment -{ - - class SM_Scene* m_sumoScene; - float m_currentTime; - float m_fixedTimeStep; - bool m_useFixedTimeStep; - - std::vector<SumoPHYCallbackBridge*> m_callbacks; - -public: - SumoPhysicsEnvironment(); - virtual ~SumoPhysicsEnvironment(); - virtual void beginFrame(); - virtual void endFrame(); -// Perform an integration step of duration 'timeStep'. - virtual bool proceedDeltaTime(double curTime,float timeStep,float interval); - virtual void setFixedTimeStep(bool useFixedTimeStep,float fixedTimeStep); - virtual float getFixedTimeStep(); - - virtual void setGravity(float x,float y,float z); - virtual int createConstraint(class PHY_IPhysicsController* ctrl,class PHY_IPhysicsController* ctrl2,PHY_ConstraintType type, - float pivotX,float pivotY,float pivotZ, - float axisX,float axisY,float axisZ, - float axis1X=0,float axis1Y=0,float axis1Z=0, - float axis2X=0,float axis2Y=0,float axis2Z=0,int flag=0 - - ); - - virtual void removeConstraint(int constraintid); - - //complex constraint for vehicles - virtual PHY_IVehicle* getVehicleConstraint(int constraintId) - { - return 0; - } - - virtual PHY_IPhysicsController* rayTest(PHY_IRayCastFilterCallback &filterCallback,float fromX,float fromY,float fromZ, float toX,float toY,float toZ); - virtual bool cullingTest(PHY_CullingCallback callback, void* userData, PHY__Vector4 *planes, int nplanes, int occlusionRes) { return false; } - - - //gamelogic callbacks - virtual void addSensor(PHY_IPhysicsController* ctrl); - virtual void removeSensor(PHY_IPhysicsController* ctrl); - virtual void addTouchCallback(int response_class, PHY_ResponseCallback callback, void *user); - virtual bool requestCollisionCallback(PHY_IPhysicsController* ctrl); - virtual bool removeCollisionCallback(PHY_IPhysicsController* ctrl); - virtual PHY_IPhysicsController* CreateSphereController(float radius,const PHY__Vector3& position); - virtual PHY_IPhysicsController* CreateConeController(float coneradius,float coneheight); - - virtual float getConstraintParam(int constraintId,int param) - { - return 0.f; - } - virtual void setConstraintParam(int constraintId,int param,float value,float value1) - { - } - SM_Scene* GetSumoScene() - { - return m_sumoScene; - } - -protected: - // 60Hz (Default) - static MT_Scalar PhysicsTicRate; - -}; - -#endif //_SUMOPhysicsEnvironment - diff --git a/source/gameengine/Physics/Sumo/convert.txt b/source/gameengine/Physics/Sumo/convert.txt deleted file mode 100644 index 81f8f602cde..00000000000 --- a/source/gameengine/Physics/Sumo/convert.txt +++ /dev/null @@ -1,35 +0,0 @@ -static DT_ShapeHandle CreateShapeFromMesh(RAS_MeshObject* meshobj) -{ - DT_ShapeHandle shape = DT_NewComplexShape(); - int numpolys = meshobj->NumPolygons(); - int numvalidpolys = 0; - - for (int p=0; p<numpolys; p++) - { - RAS_Polygon* poly = meshobj->GetPolygon(p); - - // only add polygons that have the collisionflag set - if (poly->IsCollider()) - { - DT_Begin(); - for (int v=0; v<poly->VertexCount(); v++) { - MT_Point3 pt = meshobj->GetVertex(poly->GetVertexIndexBase().m_vtxarray, - poly->GetVertexIndexBase().m_indexarray[v], - poly->GetMaterial()->GetPolyMaterial())->xyz(); - DT_Vertex(pt[0],pt[1],pt[2]); - } - DT_End(); - - numvalidpolys++; - } - } - - DT_EndComplexShape(); - - if (numvalidpolys==0) { - delete shape; - return NULL; - } else { - return shape; - } -} diff --git a/source/gameengine/Physics/Sumo/include/interpolator.h b/source/gameengine/Physics/Sumo/include/interpolator.h deleted file mode 100644 index 055c242edc7..00000000000 --- a/source/gameengine/Physics/Sumo/include/interpolator.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef INTERPOLATOR_H -#define INTERPOLATOR_H - -#include "solid_types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -DT_DECLARE_HANDLE(IP_IpoHandle); - -typedef struct IP_ControlPoint { - DT_Scalar m_key; - DT_Scalar m_keyValue; -} IP_ControlPoint; - -IP_IpoHandle IP_CreateLinear(const IP_ControlPoint *cpoints, int num_cpoints); - -void IP_DeleteInterpolator(IP_IpoHandle ipo); - -DT_Scalar IP_GetValue(IP_IpoHandle ipo, DT_Scalar key); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/source/gameengine/Physics/common/Makefile b/source/gameengine/Physics/common/Makefile index e3edd426c36..f2dd0134b71 100644 --- a/source/gameengine/Physics/common/Makefile +++ b/source/gameengine/Physics/common/Makefile @@ -40,7 +40,7 @@ CPPFLAGS += -I$(NAN_STRING)/include CPPFLAGS += -I$(NAN_SOUNDSYSTEM)/include CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION) -CPPFLAGS += -I$(NAN_FUZZICS)/include -I$(NAN_SUMO)/include -I$(NAN_MOTO)/include +CPPFLAGS += -I$(NAN_FUZZICS)/include -I$(NAN_MOTO)/include CPPFLAGS += -I../../blender # these two needed because of blenkernel CPPFLAGS += -I../../blender/makesdna diff --git a/source/gameengine/SConscript b/source/gameengine/SConscript index 864e4c3ebee..592b138583f 100644 --- a/source/gameengine/SConscript +++ b/source/gameengine/SConscript @@ -18,13 +18,5 @@ SConscript(['BlenderRoutines/SConscript', 'VideoTexture/SConscript' ]) -if env['WITH_BF_SOLID']: - SConscript(['Physics/Sumo/SConscript']) - if env['WITH_BF_PLAYER']: SConscript(['GamePlayer/SConscript']) - -#if user_options_dict['USE_PHYSICS'] == 'solid': -# SConscript(['Physics/Sumo/SConscript']) -#elif user_options_dict['USE_PHYSICS'] == 'ode': -# SConscript(['Physics/BlOde/SConscript']) diff --git a/source/nan_compile.mk b/source/nan_compile.mk index bd6dd6e1baa..bc264fe5c1d 100644 --- a/source/nan_compile.mk +++ b/source/nan_compile.mk @@ -71,21 +71,6 @@ DBG_CCFLAGS += -g # OS dependent parts --------------------------------------------------- -ifeq ($(OS),beos) - CC = gcc - CCC = g++ - CFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing - CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing - REL_CFLAGS += -O2 - REL_CCFLAGS += -O2 - NAN_DEPEND = true - OPENGL_HEADERS = . - CPPFLAGS += -D__BeOS - AR = ar - ARFLAGS = ruv - ARFLAGSQUIET = ru -endif - ifeq ($(OS),darwin) CC = gcc CCC = g++ diff --git a/source/nan_definitions.mk b/source/nan_definitions.mk index b9e623ed4e4..91f90525c1e 100644 --- a/source/nan_definitions.mk +++ b/source/nan_definitions.mk @@ -91,7 +91,6 @@ endif export BF_PROFILE ?= false export NAN_USE_BULLET ?= true export NAN_BULLET2 ?= $(LCGDIR)/bullet2 - export NAN_SUMO ?= $(SRCHOME)/gameengine/Physics/Sumo export NAN_FUZZICS ?= $(SRCHOME)/gameengine/Physics/Sumo/Fuzzics export NAN_BLENKEY ?= $(LCGDIR)/blenkey export NAN_DECIMATION ?= $(LCGDIR)/decimation @@ -131,45 +130,6 @@ endif endif # Platform Dependent settings go below: - ifeq ($(OS),beos) - - export ID = $(USER) - export HOST = $(HOSTNAME) - export NAN_PYTHON ?= $(LCGDIR)/python - export NAN_PYTHON_VERSION ?= 2.3 - export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION) - export NAN_PYTHON_LIB ?= $(NAN_PYTHON)/lib/python$(NAN_PYTHON_VERSION)/config/libpython$(NAN_PYTHON_VERSION).a - export NAN_OPENAL ?= $(LCGDIR)/openal - export NAN_JPEG ?= $(LCGDIR)/jpeg - export NAN_PNG ?= $(LCGDIR)/png - export NAN_TIFF ?= $(LCGDIR)/tiff - export NAN_ODE ?= $(LCGDIR)/ode - export NAN_TERRAPLAY ?= $(LCGDIR)/terraplay - export NAN_MESA ?= /usr/src/Mesa-3.1 - export NAN_ZLIB ?= $(LCGDIR)/zlib - export NAN_NSPR ?= $(LCGDIR)/nspr - export NAN_FREETYPE ?= $(LCGDIR)/freetype - export NAN_GETTEXT ?= $(LCGDIR)/gettext - export NAN_SDL ?= $(shell sdl-config --prefix) - export NAN_SDLLIBS ?= $(shell sdl-config --libs) - export NAN_SDLCFLAGS ?= $(shell sdl-config --cflags) - - # Uncomment the following line to use Mozilla inplace of netscape - # CPPFLAGS +=-DMOZ_NOT_NET - # Location of MOZILLA/Netscape header files... - export NAN_MOZILLA_INC ?= $(LCGDIR)/mozilla/include - export NAN_MOZILLA_LIB ?= $(LCGDIR)/mozilla/lib/ - # Will fall back to look in NAN_MOZILLA_INC/nspr and NAN_MOZILLA_LIB - # if this is not set. - - export NAN_BUILDINFO ?= true - # Be paranoid regarding library creation (do not update archives) - export NAN_PARANOID ?= true - - # l10n - #export INTERNATIONAL ?= true - - else ifeq ($(OS),darwin) export ID = $(shell whoami) @@ -589,7 +549,6 @@ endif endif # irix endif # freebsd endif # darwin - endif # beos endif # CONFIG_GUESS diff --git a/source/nan_link.mk b/source/nan_link.mk index 42b17b425b3..63c9a578498 100644 --- a/source/nan_link.mk +++ b/source/nan_link.mk @@ -49,10 +49,6 @@ endif # default (overriden by windows) SOEXT = .so -ifeq ($(OS),beos) - LLIBS = -L/boot/develop/lib/x86/ -lGL -lbe -L/boot/home/config/lib/ -endif - ifeq ($(OS),darwin) LLIBS += -lGLU -lGL LLIBS += -lz -lstdc++ diff --git a/tools/btools.py b/tools/btools.py index 377a389941f..9603022deaa 100755 --- a/tools/btools.py +++ b/tools/btools.py @@ -44,9 +44,8 @@ def validate_arguments(args, bc): 'WITH_BF_INTERNATIONAL', 'BF_GETTEXT', 'BF_GETTEXT_INC', 'BF_GETTEXT_LIB', 'BF_GETTEXT_LIBPATH', 'WITH_BF_ICONV', 'BF_ICONV', 'BF_ICONV_INC', 'BF_ICONV_LIB', 'BF_ICONV_LIBPATH', - 'WITH_BF_ODE', 'BF_ODE', 'BF_ODE_INC', 'BF_ODE_LIB', - 'WITH_BF_GAMEENGINE', 'WITH_BF_SOLID', 'WITH_BF_BULLET', 'BF_BULLET', 'BF_BULLET_INC', 'BF_BULLET_LIB', - 'BF_SOLID', 'BF_SOLID_INC', 'BF_WINTAB', 'BF_WINTAB_INC', + 'WITH_BF_GAMEENGINE', 'WITH_BF_BULLET', 'BF_BULLET', 'BF_BULLET_INC', 'BF_BULLET_LIB', + 'BF_WINTAB', 'BF_WINTAB_INC', 'WITH_BF_FREETYPE', 'BF_FREETYPE', 'BF_FREETYPE_INC', 'BF_FREETYPE_LIB', 'BF_FREETYPE_LIBPATH', 'WITH_BF_QUICKTIME', 'BF_QUICKTIME', 'BF_QUICKTIME_INC', 'BF_QUICKTIME_LIB', 'BF_QUICKTIME_LIBPATH', 'WITH_BF_STATICOPENGL', 'BF_OPENGL', 'BF_OPENGL_INC', 'BF_OPENGL_LIB', 'BF_OPENGL_LIBPATH', 'BF_OPENGL_LIB_STATIC', @@ -251,19 +250,11 @@ def read_opts(cfg, args): (BoolVariable('WITH_BF_GAMEENGINE', 'Build with gameengine' , False)), - (BoolVariable('WITH_BF_ODE', 'Use ODE if true', True)), - ('BF_ODE', 'ODE base path', ''), - ('BF_ODE_INC', 'ODE include path' , ''), - ('BF_ODE_LIB', 'ODE library', ''), - (BoolVariable('WITH_BF_BULLET', 'Use Bullet if true', True)), ('BF_BULLET', 'Bullet base dir', ''), ('BF_BULLET_INC', 'Bullet include path', ''), ('BF_BULLET_LIB', 'Bullet library', ''), - (BoolVariable('WITH_BF_SOLID', 'Use Sumo/Solid deprecated physics system if true', True)), - ('BF_SOLID', 'Solid base dir', '#/extern/solid'), - ('BF_SOLID_INC', 'Solid include path', ''), ('BF_WINTAB', 'WinTab base dir', ''), ('BF_WINTAB_INC', 'WinTab include dir', ''), ('BF_CXX', 'c++ base path for libstdc++, only used when static linking', ''), |