diff options
author | Michel Selten <michel@mselten.demon.nl> | 2003-12-06 22:02:42 +0300 |
---|---|---|
committer | Michel Selten <michel@mselten.demon.nl> | 2003-12-06 22:02:42 +0300 |
commit | 581c0f232cb083da326657681fdcd4abe1d14c7a (patch) | |
tree | 99009299ecc9e18af84de3d1d20f1dd6c93270c7 /extern/solid | |
parent | bef272a5d241ae3d73ccc124594efc53b484fec1 (diff) |
Added the Solid 3.5 sources to the blender source tree.
This is a direct copy from the CD-ROM contents except for the generated
libraries for the Windows platform. If needed, I can add those later on.
(Those take up over 800 kb).
All files, including license files, documentation, examples and sources are
committed.
Diffstat (limited to 'extern/solid')
96 files changed, 19374 insertions, 0 deletions
diff --git a/extern/solid/LICENSE_GPL.txt b/extern/solid/LICENSE_GPL.txt new file mode 100755 index 00000000000..07db89585a2 --- /dev/null +++ b/extern/solid/LICENSE_GPL.txt @@ -0,0 +1,349 @@ + + 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 new file mode 100755 index 00000000000..3fca00466e2 --- /dev/null +++ b/extern/solid/LICENSE_QPL.txt @@ -0,0 +1,110 @@ + + 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/README.txt b/extern/solid/README.txt new file mode 100755 index 00000000000..348d92b35cb --- /dev/null +++ b/extern/solid/README.txt @@ -0,0 +1,55 @@ + + 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/VisualC6/broad/broad.dsp b/extern/solid/VisualC6/broad/broad.dsp new file mode 100755 index 00000000000..d9d3f6d42af --- /dev/null +++ b/extern/solid/VisualC6/broad/broad.dsp @@ -0,0 +1,132 @@ +# 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 /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)" == "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 /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 "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 new file mode 100755 index 00000000000..4636323e2f3 --- /dev/null +++ b/extern/solid/VisualC6/complex/complex.dsp @@ -0,0 +1,116 @@ +# 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 /MD /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 /MD /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 new file mode 100755 index 00000000000..c5c487babe0 --- /dev/null +++ b/extern/solid/VisualC6/convex/convex.dsp @@ -0,0 +1,232 @@ +# 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 "" +MTL=midl.exe +LINK32=cwlink.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" /I "../../../qhull2002.1/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 "" +MTL=midl.exe +LINK32=cwlink.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" /I "../../../qhull2002.1/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 new file mode 100755 index 00000000000..9659cbf8a56 --- /dev/null +++ b/extern/solid/VisualC6/dynamics/dynamics.dsp @@ -0,0 +1,120 @@ +# 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 new file mode 100755 index 00000000000..f3cde286161 --- /dev/null +++ b/extern/solid/VisualC6/gldemo/gldemo.dsp @@ -0,0 +1,102 @@ +# 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 new file mode 100755 index 00000000000..2df6d951794 --- /dev/null +++ b/extern/solid/VisualC6/mnm/mnm.dsp @@ -0,0 +1,100 @@ +# 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 new file mode 100755 index 00000000000..dd69b6a35b2 --- /dev/null +++ b/extern/solid/VisualC6/physics/physics.dsp @@ -0,0 +1,100 @@ +# 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 new file mode 100755 index 00000000000..c6e0423cd04 --- /dev/null +++ b/extern/solid/VisualC6/sample/sample.dsp @@ -0,0 +1,102 @@ +# 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 new file mode 100755 index 00000000000..0795d6e96b0 --- /dev/null +++ b/extern/solid/VisualC6/solid.dsw @@ -0,0 +1,188 @@ +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: "dynamics"=".\dynamics\dynamics.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "gldemo"=".\gldemo\gldemo.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name solid + End Project Dependency +}}} + +############################################################################### + +Project: "mnm"=".\mnm\mnm.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name dynamics + End Project Dependency + Begin Project Dependency + Project_Dep_Name solid + End Project Dependency +}}} + +############################################################################### + +Project: "physics"=".\physics\physics.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name dynamics + End Project Dependency + Begin Project Dependency + Project_Dep_Name solid + End Project Dependency +}}} + +############################################################################### + +Project: "qhull"="..\..\qhull2002.1\VisualC6\qhull\qhull.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "sample"=".\sample\sample.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name solid + End Project Dependency +}}} + +############################################################################### + +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 +}}} + +############################################################################### + +Project: "solid_dll"=".\solid_dll\solid_dll.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 new file mode 100755 index 00000000000..551130152b0 --- /dev/null +++ b/extern/solid/VisualC6/solid/solid.dsp @@ -0,0 +1,140 @@ +# 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 /MD /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 + +!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 /MD /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 + +!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 new file mode 100755 index 00000000000..a13408bf758 --- /dev/null +++ b/extern/solid/VisualC6/solid_dll/solid_dll.dsp @@ -0,0 +1,147 @@ +# 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 "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/aclocal.m4 b/extern/solid/aclocal.m4 new file mode 100755 index 00000000000..b479c7672c7 --- /dev/null +++ b/extern/solid/aclocal.m4 @@ -0,0 +1,4421 @@ +# generated automatically by aclocal 1.7.2 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 +# Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +# Do all the work for Automake. -*- Autoconf -*- + +# This macro actually does too much some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002 +# Free Software Foundation, Inc. + +# 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, 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. + +# serial 8 + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +AC_PREREQ([2.54]) + +# Autoconf 2.50 wants to disallow AM_ names. We explicitly allow +# the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl + AC_REQUIRE([AC_PROG_INSTALL])dnl +# test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl + AC_SUBST([PACKAGE], [AC_PACKAGE_TARNAME])dnl + AC_SUBST([VERSION], [AC_PACKAGE_VERSION])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AM_MISSING_PROG(AMTAR, tar) +AM_PROG_INSTALL_SH +AM_PROG_INSTALL_STRIP +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl + +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +]) +]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[_am_stamp_count=`expr ${_am_stamp_count-0} + 1` +echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) + +# Copyright 2002 Free Software Foundation, Inc. + +# 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, 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 + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +AC_DEFUN([AM_AUTOMAKE_VERSION],[am__api_version="1.7"]) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION so it can be traced. +# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], + [AM_AUTOMAKE_VERSION([1.7.2])]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright 2001, 2002 Free Software Foundation, Inc. + +# 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, 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. + +# serial 2 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# +# Check to make sure that the build environment is sane. +# + +# Copyright 1996, 1997, 2000, 2001 Free Software Foundation, Inc. + +# 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, 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. + +# serial 3 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# -*- Autoconf -*- + + +# Copyright 1997, 1999, 2000, 2001 Free Software Foundation, Inc. + +# 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, 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. + +# serial 3 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# AM_AUX_DIR_EXPAND + +# Copyright 2001 Free Software Foundation, Inc. + +# 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, 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. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +# Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50]) + +AC_DEFUN([AM_AUX_DIR_EXPAND], [ +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. + +# Copyright 2001 Free Software Foundation, Inc. + +# 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, 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. + +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +install_sh=${install_sh-"$am_aux_dir/install-sh"} +AC_SUBST(install_sh)]) + +# AM_PROG_INSTALL_STRIP + +# Copyright 2001 Free Software Foundation, Inc. + +# 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, 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. + +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# serial 4 -*- Autoconf -*- + +# Copyright 1999, 2000, 2001 Free Software Foundation, Inc. + +# 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, 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. + + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + for depmode in $am_compiler_list; do + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + echo '#include "conftest.h"' > conftest.c + echo 'int i;' > conftest.h + echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=conftest.c object=conftest.o \ + depfile=conftest.Po tmpdepfile=conftest.TPo \ + $SHELL ./depcomp $depcc -c -o conftest.o conftest.c >/dev/null 2>&1 && + grep conftest.h conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[rm -f .deps 2>/dev/null +mkdir .deps 2>/dev/null +if test -d .deps; then + DEPDIR=.deps +else + # MS-DOS does not allow filenames that begin with a dot. + DEPDIR=_deps +fi +rmdir .deps 2>/dev/null +AC_SUBST([DEPDIR]) +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking Speeds up one-time builds + --enable-dependency-tracking Do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH]) +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + +# 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, 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. + +#serial 2 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + grep '^DEP_FILES *= *[[^ @%:@]]' < "$mf" > /dev/null || continue + # Extract the definition of DEP_FILES from the Makefile without + # running `make'. + DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"` + test -z "$DEPDIR" && continue + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n -e '/^U = / s///p' < "$mf"` + test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" + # We invoke sed twice because it is the simplest approach to + # changing $(DEPDIR) to its actual value in the expansion. + for file in `sed -n -e ' + /^DEP_FILES = .*\\\\$/ { + s/^DEP_FILES = // + :loop + s/\\\\$// + p + n + /\\\\$/ b loop + p + } + /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002 Free Software Foundation, Inc. + +# 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, 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. + +# serial 2 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +doit: + @echo done +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi +AC_SUBST(am__include) +AC_SUBST(am__quote) +AC_MSG_RESULT($_am_result) +rm -f confinc confmf +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright 1997, 2000, 2001 Free Software Foundation, Inc. + +# 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, 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. + +# serial 5 + +AC_PREREQ(2.52) + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE]) +AC_SUBST([$1_FALSE]) +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]) +fi])]) + +# libtool.m4 - Configure libtool for the host system. -*-Shell-script-*- + +# serial 46 AC_PROG_LIBTOOL + +AC_DEFUN([AC_PROG_LIBTOOL], +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +# Prevent multiple expansion +define([AC_PROG_LIBTOOL], []) +]) + +AC_DEFUN([AC_LIBTOOL_SETUP], +[AC_PREREQ(2.13)dnl +AC_REQUIRE([AC_ENABLE_SHARED])dnl +AC_REQUIRE([AC_ENABLE_STATIC])dnl +AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl +AC_REQUIRE([AC_PROG_NM])dnl +AC_REQUIRE([LT_AC_PROG_SED])dnl + +AC_REQUIRE([AC_PROG_LN_S])dnl +AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl +AC_REQUIRE([AC_OBJEXT])dnl +AC_REQUIRE([AC_EXEEXT])dnl +dnl + +_LT_AC_PROG_ECHO_BACKSLASH +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + AC_PATH_MAGIC + fi + ;; +esac + +AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) + +ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], +enable_win32_dll=yes, enable_win32_dll=no) + +AC_ARG_ENABLE(libtool-lock, + [ --disable-libtool-lock avoid locking (might break parallel builds)]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-linux*) + # Test if the compiler is 64bit + echo 'int i;' > conftest.$ac_ext + lt_cv_cc_64bit_output=no + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *"ELF 64"*) + lt_cv_cc_64bit_output=yes + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_SAVE + AC_LANG_C + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_RESTORE]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; + +ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw* | *-*-pw32*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + + # recent cygwin and mingw systems supply a stub DllMain which the user + # can override, but on older systems we have to supply one + AC_CACHE_CHECK([if libtool should supply DllMain function], lt_cv_need_dllmain, + [AC_TRY_LINK([], + [extern int __attribute__((__stdcall__)) DllMain(void*, int, void*); + DllMain (0, 0, 0);], + [lt_cv_need_dllmain=no],[lt_cv_need_dllmain=yes])]) + + case $host/$CC in + *-*-cygwin*/gcc*-mno-cygwin*|*-*-mingw*) + # old mingw systems require "-dll" to link a DLL, while more recent ones + # require "-mdll" + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -mdll" + AC_CACHE_CHECK([how to link DLLs], lt_cv_cc_dll_switch, + [AC_TRY_LINK([], [], [lt_cv_cc_dll_switch=-mdll],[lt_cv_cc_dll_switch=-dll])]) + CFLAGS="$SAVE_CFLAGS" ;; + *-*-cygwin* | *-*-pw32*) + # cygwin systems need to pass --dll to the linker, and not link + # crt.o which will require a WinMain@16 definition. + lt_cv_cc_dll_switch="-Wl,--dll -nostartfiles" ;; + esac + ;; + ]) +esac + +_LT_AC_LTCONFIG_HACK + +]) + +# AC_LIBTOOL_HEADER_ASSERT +# ------------------------ +AC_DEFUN([AC_LIBTOOL_HEADER_ASSERT], +[AC_CACHE_CHECK([whether $CC supports assert without backlinking], + [lt_cv_func_assert_works], + [case $host in + *-*-solaris*) + if test "$GCC" = yes && test "$with_gnu_ld" != yes; then + case `$CC --version 2>/dev/null` in + [[12]].*) lt_cv_func_assert_works=no ;; + *) lt_cv_func_assert_works=yes ;; + esac + fi + ;; + esac]) + +if test "x$lt_cv_func_assert_works" = xyes; then + AC_CHECK_HEADERS(assert.h) +fi +])# AC_LIBTOOL_HEADER_ASSERT + +# _LT_AC_CHECK_DLFCN +# -------------------- +AC_DEFUN([_LT_AC_CHECK_DLFCN], +[AC_CHECK_HEADERS(dlfcn.h) +])# _LT_AC_CHECK_DLFCN + +# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +# --------------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], +[AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_NM]) +AC_REQUIRE([AC_OBJEXT]) +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [dnl + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) # Its linker distinguishes data from code symbols + lt_cv_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris* | sysv5*) + symcode='[[BDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $host_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then + symcode='[[ABCDGISTW]]' +fi + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. +lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + rm -f conftest* + cat > conftest.$ac_ext <<EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if egrep ' nm_test_var$' "$nlist" >/dev/null; then + if egrep ' nm_test_func$' "$nlist" >/dev/null; then + cat <<EOF > conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_global_symbol_to_cdecl"' < "$nlist" >> conftest.$ac_ext' + + cat <<EOF >> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr void * +#else +# define lt_ptr char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr address; +} +lt_preloaded_symbols[[]] = +{ +EOF + sed "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr) \&\2},/" < "$nlist" >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$no_builtin_flag" + if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AC_FD_CC + fi + else + echo "cannot find nm_test_var in $nlist" >&AC_FD_CC + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AC_FD_CC + fi + else + echo "$progname: failed program was:" >&AC_FD_CC + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +global_symbol_pipe="$lt_cv_sys_global_symbol_pipe" +if test -z "$lt_cv_sys_global_symbol_pipe"; then + global_symbol_to_cdecl= + global_symbol_to_c_name_address= +else + global_symbol_to_cdecl="$lt_cv_global_symbol_to_cdecl" + global_symbol_to_c_name_address="$lt_cv_global_symbol_to_c_name_address" +fi +if test -z "$global_symbol_pipe$global_symbol_to_cdec$global_symbol_to_c_name_address"; +then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi +]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + +# _LT_AC_LIBTOOL_SYS_PATH_SEPARATOR +# --------------------------------- +AC_DEFUN([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR], +[# Find the correct PATH separator. Usually this is `:', but +# DJGPP uses `;' like DOS. +if test "X${PATH_SEPARATOR+set}" != Xset; then + UNAME=${UNAME-`uname 2>/dev/null`} + case X$UNAME in + *-DOS) lt_cv_sys_path_separator=';' ;; + *) lt_cv_sys_path_separator=':' ;; + esac + PATH_SEPARATOR=$lt_cv_sys_path_separator +fi +])# _LT_AC_LIBTOOL_SYS_PATH_SEPARATOR + +# _LT_AC_PROG_ECHO_BACKSLASH +# -------------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], +[ifdef([AC_DIVERSION_NOTICE], [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +echo=${ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat <<EOF +$* +EOF + exit 0 +fi + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + +if test -z "$ECHO"; then +if test "X${echo_test_string+set}" != Xset; then +# find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string="`eval $cmd`") 2>/dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + IFS="${IFS= }"; save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(ECHO) +AC_DIVERT_POP +])# _LT_AC_PROG_ECHO_BACKSLASH + +# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ------------------------------------------------------------------ +AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], +[if test "$cross_compiling" = yes; then : + [$4] +else + AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<EOF +[#line __oline__ "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include <dlfcn.h> +#endif + +#include <stdio.h> + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +}] +EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_unknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_AC_TRY_DLOPEN_SELF + +# AC_LIBTOOL_DLOPEN_SELF +# ------------------- +AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], +[if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + cygwin* | mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +])# AC_LIBTOOL_DLOPEN_SELF + +AC_DEFUN([_LT_AC_LTCONFIG_HACK], +[AC_REQUIRE([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])dnl +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +sed_quote_subst='s/\([[\\"\\`$\\\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([[\\"\\`\\\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" +need_locks="$enable_libtool_lock" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +if test x"$host" != x"$build"; then + ac_tool_prefix=${host_alias}- +else + ac_tool_prefix= +fi + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + ;; + *) + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +# Allow CC to be a program name with arguments. +set dummy $CC +compiler="[$]2" + +AC_MSG_CHECKING([for objdir]) +rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + objdir=_libs +fi +rmdir .libs 2>/dev/null +AC_MSG_RESULT($objdir) + + +AC_ARG_WITH(pic, +[ --with-pic try to use only PIC/non-PIC objects [default=use both]], +pic_mode="$withval", pic_mode=default) +test -z "$pic_mode" && pic_mode=default + +# We assume here that the value for lt_cv_prog_cc_pic will not be cached +# in isolation, and that seeing it set (from the cache) indicates that +# the associated values are set (in the cache) correctly too. +AC_MSG_CHECKING([for $compiler option to produce PIC]) +AC_CACHE_VAL(lt_cv_prog_cc_pic, +[ lt_cv_prog_cc_pic= + lt_cv_prog_cc_shlib= + lt_cv_prog_cc_wl= + lt_cv_prog_cc_static= + lt_cv_prog_cc_no_builtin= + lt_cv_prog_cc_can_build_shared=$can_build_shared + + if test "$GCC" = yes; then + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-static' + + case $host_os in + aix*) + # Below there is a dirty hack to force normal static linking with -ldl + # The problem is because libdl dynamically linked with both libc and + # libC (AIX C++ library), which obviously doesn't included in libraries + # list by gcc. This cause undefined symbols with -static flags. + # This hack allows C programs to be linked with "-static -ldl", but + # not sure about C++ programs. + lt_cv_prog_cc_static="$lt_cv_prog_cc_static ${lt_cv_prog_cc_wl}-lC" + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_cv_prog_cc_pic='-fno-common' + ;; + cygwin* | mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_cv_prog_cc_pic='-DDLL_EXPORT' + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_cv_prog_cc_pic=-Kconform_pic + fi + ;; + *) + lt_cv_prog_cc_pic='-fPIC' + ;; + esac + else + # PORTME Check for PIC flags for the system compiler. + case $host_os in + aix3* | aix4* | aix5*) + lt_cv_prog_cc_wl='-Wl,' + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_cv_prog_cc_static='-Bstatic' + else + lt_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + hpux9* | hpux10* | hpux11*) + # Is there a better lt_cv_prog_cc_static that works with the bundled CC? + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static="${lt_cv_prog_cc_wl}-a ${lt_cv_prog_cc_wl}archive" + lt_cv_prog_cc_pic='+Z' + ;; + + irix5* | irix6* | nonstopux*) + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-non_shared' + # PIC (with -KPIC) is the default. + ;; + + cygwin* | mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_cv_prog_cc_pic='-DDLL_EXPORT' + ;; + + newsos6) + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' + ;; + + osf3* | osf4* | osf5*) + # All OSF/1 code is PIC. + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-non_shared' + ;; + + sco3.2v5*) + lt_cv_prog_cc_pic='-Kpic' + lt_cv_prog_cc_static='-dn' + lt_cv_prog_cc_shlib='-belf' + ;; + + solaris*) + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' + lt_cv_prog_cc_wl='-Wl,' + ;; + + sunos4*) + lt_cv_prog_cc_pic='-PIC' + lt_cv_prog_cc_static='-Bstatic' + lt_cv_prog_cc_wl='-Qoption ld ' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' + lt_cv_prog_cc_wl='-Wl,' + ;; + + uts4*) + lt_cv_prog_cc_pic='-pic' + lt_cv_prog_cc_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_cv_prog_cc_pic='-Kconform_pic' + lt_cv_prog_cc_static='-Bstatic' + fi + ;; + + *) + lt_cv_prog_cc_can_build_shared=no + ;; + esac + fi +]) +if test -z "$lt_cv_prog_cc_pic"; then + AC_MSG_RESULT([none]) +else + AC_MSG_RESULT([$lt_cv_prog_cc_pic]) + + # Check to make sure the pic_flag actually works. + AC_MSG_CHECKING([if $compiler PIC flag $lt_cv_prog_cc_pic works]) + AC_CACHE_VAL(lt_cv_prog_cc_pic_works, [dnl + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $lt_cv_prog_cc_pic -DPIC" + AC_TRY_COMPILE([], [], [dnl + case $host_os in + hpux9* | hpux10* | hpux11*) + # On HP-UX, both CC and GCC only warn that PIC is supported... then + # they create non-PIC objects. So, if there were any warnings, we + # assume that PIC is not supported. + if test -s conftest.err; then + lt_cv_prog_cc_pic_works=no + else + lt_cv_prog_cc_pic_works=yes + fi + ;; + *) + lt_cv_prog_cc_pic_works=yes + ;; + esac + ], [dnl + lt_cv_prog_cc_pic_works=no + ]) + CFLAGS="$save_CFLAGS" + ]) + + if test "X$lt_cv_prog_cc_pic_works" = Xno; then + lt_cv_prog_cc_pic= + lt_cv_prog_cc_can_build_shared=no + else + lt_cv_prog_cc_pic=" $lt_cv_prog_cc_pic" + fi + + AC_MSG_RESULT([$lt_cv_prog_cc_pic_works]) +fi + +# Check for any special shared library compilation flags. +if test -n "$lt_cv_prog_cc_shlib"; then + AC_MSG_WARN([\`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries]) + if echo "$old_CC $old_CFLAGS " | egrep -e "[[ ]]$lt_cv_prog_cc_shlib[[ ]]" >/dev/null; then : + else + AC_MSG_WARN([add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure]) + lt_cv_prog_cc_can_build_shared=no + fi +fi + +AC_MSG_CHECKING([if $compiler static flag $lt_cv_prog_cc_static works]) +AC_CACHE_VAL([lt_cv_prog_cc_static_works], [dnl + lt_cv_prog_cc_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_cv_prog_cc_static" + AC_TRY_LINK([], [], [lt_cv_prog_cc_static_works=yes]) + LDFLAGS="$save_LDFLAGS" +]) + +# Belt *and* braces to stop my trousers falling down: +test "X$lt_cv_prog_cc_static_works" = Xno && lt_cv_prog_cc_static= +AC_MSG_RESULT([$lt_cv_prog_cc_static_works]) + +pic_flag="$lt_cv_prog_cc_pic" +special_shlib_compile_flags="$lt_cv_prog_cc_shlib" +wl="$lt_cv_prog_cc_wl" +link_static_flag="$lt_cv_prog_cc_static" +no_builtin_flag="$lt_cv_prog_cc_no_builtin" +can_build_shared="$lt_cv_prog_cc_can_build_shared" + + +# Check to see if options -o and -c are simultaneously supported by compiler +AC_MSG_CHECKING([if $compiler supports -c -o file.$ac_objext]) +AC_CACHE_VAL([lt_cv_compiler_c_o], [ +$rm -r conftest 2>/dev/null +mkdir conftest +cd conftest +echo "int some_variable = 0;" > conftest.$ac_ext +mkdir out +# According to Tom Tromey, Ian Lance Taylor reported there are C compilers +# that will create temporary files in the current directory regardless of +# the output directory. Thus, making CWD read-only will cause this test +# to fail, enabling locking or at least warning the user not to do parallel +# builds. +chmod -w . +save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -o out/conftest2.$ac_objext" +compiler_c_o=no +if { (eval echo configure:__oline__: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s out/conftest.err; then + lt_cv_compiler_c_o=no + else + lt_cv_compiler_c_o=yes + fi +else + # Append any errors to the config.log. + cat out/conftest.err 1>&AC_FD_CC + lt_cv_compiler_c_o=no +fi +CFLAGS="$save_CFLAGS" +chmod u+w . +$rm conftest* out/* +rmdir out +cd .. +rmdir conftest +$rm -r conftest 2>/dev/null +]) +compiler_c_o=$lt_cv_compiler_c_o +AC_MSG_RESULT([$compiler_c_o]) + +if test x"$compiler_c_o" = x"yes"; then + # Check to see if we can write to a .lo + AC_MSG_CHECKING([if $compiler supports -c -o file.lo]) + AC_CACHE_VAL([lt_cv_compiler_o_lo], [ + lt_cv_compiler_o_lo=no + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -c -o conftest.lo" + save_objext="$ac_objext" + ac_objext=lo + AC_TRY_COMPILE([], [int some_variable = 0;], [dnl + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + lt_cv_compiler_o_lo=no + else + lt_cv_compiler_o_lo=yes + fi + ]) + ac_objext="$save_objext" + CFLAGS="$save_CFLAGS" + ]) + compiler_o_lo=$lt_cv_compiler_o_lo + AC_MSG_RESULT([$compiler_o_lo]) +else + compiler_o_lo=no +fi + +# Check to see if we can do hard links to lock some files if needed +hard_links="nottested" +if test "$compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([\`$CC' does not support \`-c -o', so \`make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi + +if test "$GCC" = yes; then + # Check to see if options -fno-rtti -fno-exceptions are supported by compiler + AC_MSG_CHECKING([if $compiler supports -fno-rtti -fno-exceptions]) + echo "int some_variable = 0;" > conftest.$ac_ext + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.$ac_ext" + compiler_rtti_exceptions=no + AC_TRY_COMPILE([], [int some_variable = 0;], [dnl + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + compiler_rtti_exceptions=no + else + compiler_rtti_exceptions=yes + fi + ]) + CFLAGS="$save_CFLAGS" + AC_MSG_RESULT([$compiler_rtti_exceptions]) + + if test "$compiler_rtti_exceptions" = "yes"; then + no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions' + else + no_builtin_flag=' -fno-builtin' + fi +fi + +# See if the linker supports building shared libraries. +AC_MSG_CHECKING([whether the linker ($LD) supports shared libraries]) + +allow_undefined_flag= +no_undefined_flag= +need_lib_prefix=unknown +need_version=unknown +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +archive_cmds= +archive_expsym_cmds= +old_archive_from_new_cmds= +old_archive_from_expsyms_cmds= +export_dynamic_flag_spec= +whole_archive_flag_spec= +thread_safe_flag_spec= +hardcode_into_libs=no +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no +hardcode_shlibpath_var=unsupported +runpath_var= +link_all_deplibs=unknown +always_export_symbols=no +export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols' +# include_expsyms should be a list of space-separated symbols to be *always* +# included in the symbol list +include_expsyms= +# exclude_expsyms can be an egrep regular expression of symbols to exclude +# it will be wrapped by ` (' and `)$', so one must not match beginning or +# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', +# as well as any symbol that contains `d'. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_" +# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out +# platforms (ab)use it in PIC code, but their linkers get confused if +# the symbol is explicitly referenced. Since portable code cannot +# rely on this symbol name, it's probably fine to never include it in +# preloaded symbol tables. +extract_expsyms_cmds= + +case $host_os in +cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; +openbsd*) + with_gnu_ld=no + ;; +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX, the GNU linker is very broken + # Note:Check GNU linker on AIX 5-IA64 when/if it becomes available. + ld_shlibs=no + cat <<EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + + # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can use + # them. + ld_shlibs=no + ;; + + beos*) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach <jrb3@best.com> says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + allow_undefined_flag=unsupported + always_export_symbols=yes + + extract_expsyms_cmds='test -f $output_objdir/impgen.c || \ + sed -e "/^# \/\* impgen\.c starts here \*\//,/^# \/\* impgen.c ends here \*\// { s/^# //;s/^# *$//; p; }" -e d < $''0 > $output_objdir/impgen.c~ + test -f $output_objdir/impgen.exe || (cd $output_objdir && \ + if test "x$HOST_CC" != "x" ; then $HOST_CC -o impgen impgen.c ; \ + else $CC -o impgen impgen.c ; fi)~ + $output_objdir/impgen $dir/$soroot > $output_objdir/$soname-def' + + old_archive_from_expsyms_cmds='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib' + + # cygwin and mingw dlls have different entry points and sets of symbols + # to exclude. + # FIXME: what about values for MSVC? + dll_entry=__cygwin_dll_entry@12 + dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~ + case $host_os in + mingw*) + # mingw values + dll_entry=_DllMainCRTStartup@12 + dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~ + ;; + esac + + # mingw and cygwin differ, and it's simplest to just exclude the union + # of the two symbol sets. + dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12 + + # recent cygwin and mingw systems supply a stub DllMain which the user + # can override, but on older systems we have to supply one (in ltdll.c) + if test "x$lt_cv_need_dllmain" = "xyes"; then + ltdll_obj='$output_objdir/$soname-ltdll.'"$ac_objext " + ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $''0 > $output_objdir/$soname-ltdll.c~ + test -f $output_objdir/$soname-ltdll.$ac_objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~' + else + ltdll_obj= + ltdll_cmds= + fi + + # Extract the symbol export list from an `--export-all' def file, + # then regenerate the def file from the symbol export list, so that + # the compiled dll only exports the symbol export list. + # Be careful not to strip the DATA tag left be newer dlltools. + export_symbols_cmds="$ltdll_cmds"' + $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~ + sed -e "1,/EXPORTS/d" -e "s/ @ [[0-9]]*//" -e "s/ *;.*$//" < $output_objdir/$soname-def > $export_symbols' + + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is. + # If DATA tags from a recent dlltool are present, honour them! + archive_expsym_cmds='if test "x`sed 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname-def; + else + echo EXPORTS > $output_objdir/$soname-def; + _lt_hint=1; + cat $export_symbols | while read symbol; do + set dummy \$symbol; + case \[$]# in + 2) echo " \[$]2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;; + 4) echo " \[$]2 \[$]3 \[$]4 ; " >> $output_objdir/$soname-def; _lt_hint=`expr \$_lt_hint - 1`;; + *) echo " \[$]2 @ \$_lt_hint \[$]3 ; " >> $output_objdir/$soname-def;; + esac; + _lt_hint=`expr 1 + \$_lt_hint`; + done; + fi~ + '"$ltdll_cmds"' + $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~ + $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp --output-lib $output_objdir/$libname.dll.a~ + $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags' + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + case $host_os in + cygwin* | mingw* | pw32*) + # dlltool doesn't understand --whole-archive et. al. + whole_archive_flag_spec= + ;; + *) + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + ;; + esac + fi +else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + hardcode_direct=yes + archive_cmds='' + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + esac + + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + shared_flag='${wl}-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall can do strange things, so it is better to + # generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib' + archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname ${wl}-h$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + hardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib' + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='${wl}-berok' + # This is a bit strange, but is similar to how AIX traditionally builds + # it's shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"' ~$AR -crlo $objdir/$libname$release.a $objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + ;; + + darwin* | rhapsody*) + case "$host_os" in + rhapsody* | darwin1.[[012]]) + allow_undefined_flag='-undefined suppress' + ;; + *) # Darwin 1.3 on + allow_undefined_flag='-flat_namespace -undefined suppress' + ;; + esac + # FIXME: Relying on posixy $() will cause problems for + # cross-compilation, but unfortunately the echo tests do not + # yet detect zsh echo's removal of \ escapes. Also zsh mangles + # `"' quotes if we put them in here... so don't! + archive_cmds='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs && $CC $(test .$module = .yes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib ${lib}-master.o $deplibs$linker_flags $(test .$module != .yes && echo -install_name $rpath/$soname $verstring)' + # We need to add '_' to the symbols in $export_symbols first + #archive_expsym_cmds="$archive_cmds"' && strip -s $export_symbols' + hardcode_direct=yes + hardcode_shlibpath_var=no + whole_archive_flag_spec='-all_load $convenience' + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd*) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9* | hpux10* | hpux11*) + case $host_os in + hpux9*) archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ;; + *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; + esac + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_minus_L=yes # Not in the search PATH, but as the default + # location of the library. + export_dynamic_flag_spec='${wl}-E' + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + link_all_deplibs=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + openbsd*) + hardcode_direct=yes + hardcode_shlibpath_var=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case "$host_os" in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "-exported_symbol " >> $lib.exp; echo "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + #Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + + sco3.2v5*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + export_dynamic_flag_spec='${wl}-Bexport' + ;; + + solaris*) + # gcc --version < 3.0 without binutils cannot create self contained + # shared libraries reliably, requiring libgcc.a to resolve some of + # the object symbols generated in some cases. Libraries that use + # assert need libgcc.a to resolve __eprintf, for example. Linking + # a copy of libgcc.a into every shared library to guarantee resolving + # such symbols causes other problems: According to Tim Van Holder + # <tim.van.holder@pandora.be>, C++ libraries end up with a separate + # (to the application) exception stack for one thing. + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + case `$CC --version 2>/dev/null` in + [[12]].*) + cat <<EOF 1>&2 + +*** Warning: Releases of GCC earlier than version 3.0 cannot reliably +*** create self contained shared libraries on Solaris systems, without +*** introducing a dependency on libgcc.a. Therefore, libtool is disabling +*** -no-undefined support, which will at least allow you to build shared +*** libraries. However, you may find that when you link such libraries +*** into an application without using GCC, you have to manually add +*** \`gcc --print-libgcc-file-name\` to the link command. We urge you to +*** upgrade to a newer version of GCC. Another option is to rebuild your +*** current GCC to use the GNU linker from GNU binutils 2.9.1 or newer. + +EOF + no_undefined_flag= + ;; + esac + fi + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv5*) + no_undefined_flag=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec= + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=no + hardcode_shlibpath_var=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5uw7* | unixware7*) + no_undefined_flag='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac +fi +AC_MSG_RESULT([$ld_shlibs]) +test "$ld_shlibs" = no && can_build_shared=no + +# Check hardcoding attributes. +AC_MSG_CHECKING([how to hardcode library paths into programs]) +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || \ + test -n "$runpath_var"; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$hardcode_shlibpath_var" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +AC_MSG_RESULT([$hardcode_action]) + +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else + AC_MSG_RESULT([no]) +fi + +reload_cmds='$LD$reload_flag -o $output$reload_objs' +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +# PORTME Fill in your ld.so characteristics +AC_MSG_CHECKING([dynamic linker characteristics]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}.so$major' + ;; + +aix4* | aix5*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}.so$major ${libname}${release}.so$versuffix $libname.so' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can + # not hardcode correct soname into executable. Probably we can + # add versioning support to collect2, so additional links can + # be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib<name>.so + # instead of lib<name>.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}.so$major' + fi + shlibpath_var=LIBPATH + fi + hardcode_into_libs=yes + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}.so' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + export_dynamic_flag_spec=-rdynamic + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + need_version=no + need_lib_prefix=no + case $GCC,$host_os in + yes,cygwin*) + library_names_spec='$libname.dll.a' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll' + postinstall_cmds='dlpath=`bash 2>&1 -c '\''. $dir/${file}i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog .libs/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`bash 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + ;; + yes,mingw*) + library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g" -e "s,=/,/,g"` + ;; + yes,pw32*) + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll' + ;; + *) + library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + # FIXME: Relying on posixy $() will cause problems for + # cross-compilation, but unfortunately the echo tests do not + # yet detect zsh echo's removal of \ escapes. + library_names_spec='${libname}${release}${versuffix}.$(test .$module = .yes && echo so || echo dylib) ${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib) ${libname}.$(test .$module = .yes && echo so || echo dylib)' + soname_spec='${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib)' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + *) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + dynamic_linker="$host_os dld.sl" + version_type=sunos + need_lib_prefix=no + need_version=no + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl' + soname_spec='${libname}${release}.sl$major' + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) version_type=irix ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + case $host_cpu:$lt_cv_cc_64bit_output in + powerpc64:yes | s390x:yes | sparc64:yes | x86_64:yes) + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64" + sys_lib_search_path_spec="/lib64 /usr/lib64 /usr/local/lib64" + ;; + esac + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so' + soname_spec='${libname}${release}.so$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case "$host_os" in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + ;; + +os2*) + libname_spec='$name' + need_lib_prefix=no + library_names_spec='$libname.dll $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_version=no + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + hardcode_into_libs=yes + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so' + soname_spec='$libname.so.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +# Report the final consequences. +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +AC_MSG_RESULT([$enable_shared]) + +AC_MSG_CHECKING([whether to build static libraries]) +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +AC_MSG_RESULT([$enable_static]) + +if test "$hardcode_action" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +AC_LIBTOOL_DLOPEN_SELF + +if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + AC_CACHE_VAL([lt_cv_archive_cmds_need_lc], + [$rm conftest* + echo 'static int dummy;' > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile); then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_cv_prog_cc_wl + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if AC_TRY_EVAL(archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi]) + AC_MSG_RESULT([$lt_cv_archive_cmds_need_lc]) + ;; + esac +fi +need_lc=${lt_cv_archive_cmds_need_lc-yes} + +# The second clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + : +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + test -f Makefile && make "$ltmain" +fi + +if test -f "$ltmain"; then + trap "$rm \"${ofile}T\"; exit 1" 1 2 15 + $rm -f "${ofile}T" + + echo creating $ofile + + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS SED \ + AR AR_FLAGS CC LD LN_S NM SHELL \ + reload_flag reload_cmds wl \ + pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \ + thread_safe_flag_spec whole_archive_flag_spec libname_spec \ + library_names_spec soname_spec \ + RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \ + old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds \ + postuninstall_cmds extract_expsyms_cmds old_archive_from_expsyms_cmds \ + old_striplib striplib file_magic_cmd export_symbols_cmds \ + deplibs_check_method allow_undefined_flag no_undefined_flag \ + finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \ + global_symbol_to_c_name_address \ + hardcode_libdir_flag_spec hardcode_libdir_separator \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do + + case $var in + reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + export_symbols_cmds | archive_cmds | archive_expsym_cmds | \ + extract_expsyms_cmds | old_archive_from_expsyms_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + cat <<__EOF__ > "${ofile}T" +#! $SHELL + +# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996-2000 Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996 +# +# 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. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="${SED} -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + +# ### BEGIN LIBTOOL CONFIG + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$need_lc + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# The default C compiler. +CC=$lt_CC + +# Is the compiler the GNU C compiler? +with_gcc=$GCC + +# The linker used to build libraries. +LD=$lt_LD + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS=$lt_AS + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_wl + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_pic_flag +pic_mode=$pic_mode + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_compiler_c_o + +# Can we write directly to a .lo ? +compiler_o_lo=$lt_compiler_o_lo + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_link_static_flag + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_no_builtin_flag + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# ### END LIBTOOL CONFIG + +__EOF__ + + case $host_os in + aix3*) + cat <<\EOF >> "${ofile}T" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + case $host_os in + cygwin* | mingw* | pw32* | os2*) + cat <<'EOF' >> "${ofile}T" + # This is a source program that is used to create dlls on Windows + # Don't remove nor modify the starting and closing comments +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include <windows.h> +# #undef WIN32_LEAN_AND_MEAN +# #include <stdio.h> +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include <cygwin/cygwin_dll.h> +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ + # This is a source program that is used to create import libraries + # on Windows for dlls which lack them. Don't remove nor modify the + # starting and closing comments +# /* impgen.c starts here */ +# /* Copyright (C) 1999-2000 Free Software Foundation, Inc. +# +# This file is part of GNU libtool. +# +# 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. +# */ +# +# #include <stdio.h> /* for printf() */ +# #include <unistd.h> /* for open(), lseek(), read() */ +# #include <fcntl.h> /* for O_RDONLY, O_BINARY */ +# #include <string.h> /* for strdup() */ +# +# /* O_BINARY isn't required (or even defined sometimes) under Unix */ +# #ifndef O_BINARY +# #define O_BINARY 0 +# #endif +# +# static unsigned int +# pe_get16 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[2]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 2); +# return b[0] + (b[1]<<8); +# } +# +# static unsigned int +# pe_get32 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[4]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 4); +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# static unsigned int +# pe_as32 (ptr) +# void *ptr; +# { +# unsigned char *b = ptr; +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# int +# main (argc, argv) +# int argc; +# char *argv[]; +# { +# int dll; +# unsigned long pe_header_offset, opthdr_ofs, num_entries, i; +# unsigned long export_rva, export_size, nsections, secptr, expptr; +# unsigned long name_rvas, nexp; +# unsigned char *expdata, *erva; +# char *filename, *dll_name; +# +# filename = argv[1]; +# +# dll = open(filename, O_RDONLY|O_BINARY); +# if (dll < 1) +# return 1; +# +# dll_name = filename; +# +# for (i=0; filename[i]; i++) +# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':') +# dll_name = filename + i +1; +# +# pe_header_offset = pe_get32 (dll, 0x3c); +# opthdr_ofs = pe_header_offset + 4 + 20; +# num_entries = pe_get32 (dll, opthdr_ofs + 92); +# +# if (num_entries < 1) /* no exports */ +# return 1; +# +# export_rva = pe_get32 (dll, opthdr_ofs + 96); +# export_size = pe_get32 (dll, opthdr_ofs + 100); +# nsections = pe_get16 (dll, pe_header_offset + 4 +2); +# secptr = (pe_header_offset + 4 + 20 + +# pe_get16 (dll, pe_header_offset + 4 + 16)); +# +# expptr = 0; +# for (i = 0; i < nsections; i++) +# { +# char sname[8]; +# unsigned long secptr1 = secptr + 40 * i; +# unsigned long vaddr = pe_get32 (dll, secptr1 + 12); +# unsigned long vsize = pe_get32 (dll, secptr1 + 16); +# unsigned long fptr = pe_get32 (dll, secptr1 + 20); +# lseek(dll, secptr1, SEEK_SET); +# read(dll, sname, 8); +# if (vaddr <= export_rva && vaddr+vsize > export_rva) +# { +# expptr = fptr + (export_rva - vaddr); +# if (export_rva + export_size > vaddr + vsize) +# export_size = vsize - (export_rva - vaddr); +# break; +# } +# } +# +# expdata = (unsigned char*)malloc(export_size); +# lseek (dll, expptr, SEEK_SET); +# read (dll, expdata, export_size); +# erva = expdata - export_rva; +# +# nexp = pe_as32 (expdata+24); +# name_rvas = pe_as32 (expdata+32); +# +# printf ("EXPORTS\n"); +# for (i = 0; i<nexp; i++) +# { +# unsigned long name_rva = pe_as32 (erva+name_rvas+i*4); +# printf ("\t%s @ %ld ;\n", erva+name_rva, 1+ i); +# } +# +# return 0; +# } +# /* impgen.c ends here */ + +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "${ofile}T" || (rm -f "${ofile}T"; exit 1) + + mv -f "${ofile}T" "$ofile" || \ + (rm -f "$ofile" && cp "${ofile}T" "$ofile" && rm -f "${ofile}T") + chmod +x "$ofile" +fi + +])# _LT_AC_LTCONFIG_HACK + +# AC_LIBTOOL_DLOPEN - enable checks for dlopen support +AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])]) + +# AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])]) + +# AC_ENABLE_SHARED - implement the --enable-shared flag +# Usage: AC_ENABLE_SHARED[(DEFAULT)] +# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +# `yes'. +AC_DEFUN([AC_ENABLE_SHARED], +[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE(shared, +changequote(<<, >>)dnl +<< --enable-shared[=PKGS] build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case $enableval in +yes) enable_shared=yes ;; +no) enable_shared=no ;; +*) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl +]) + +# AC_DISABLE_SHARED - set the default shared flag to --disable-shared +AC_DEFUN([AC_DISABLE_SHARED], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no)]) + +# AC_ENABLE_STATIC - implement the --enable-static flag +# Usage: AC_ENABLE_STATIC[(DEFAULT)] +# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +# `yes'. +AC_DEFUN([AC_ENABLE_STATIC], +[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE(static, +changequote(<<, >>)dnl +<< --enable-static[=PKGS] build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case $enableval in +yes) enable_static=yes ;; +no) enable_static=no ;; +*) + enable_static=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_static=AC_ENABLE_STATIC_DEFAULT)dnl +]) + +# AC_DISABLE_STATIC - set the default static flag to --disable-static +AC_DEFUN([AC_DISABLE_STATIC], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no)]) + + +# AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag +# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)] +# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +# `yes'. +AC_DEFUN([AC_ENABLE_FAST_INSTALL], +[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE(fast-install, +changequote(<<, >>)dnl +<< --enable-fast-install[=PKGS] optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case $enableval in +yes) enable_fast_install=yes ;; +no) enable_fast_install=no ;; +*) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl +]) + +# AC_DISABLE_FAST_INSTALL - set the default to --disable-fast-install +AC_DEFUN([AC_DISABLE_FAST_INSTALL], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no)]) + +# AC_LIBTOOL_PICMODE - implement the --with-pic flag +# Usage: AC_LIBTOOL_PICMODE[(MODE)] +# Where MODE is either `yes' or `no'. If omitted, it defaults to +# `both'. +AC_DEFUN([AC_LIBTOOL_PICMODE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +pic_mode=ifelse($#,1,$1,default)]) + + +# AC_PATH_TOOL_PREFIX - find a file program which can recognise shared library +AC_DEFUN([AC_PATH_TOOL_PREFIX], +[AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in + /*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; + ?:/*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path. + ;; + *) + ac_save_MAGIC_CMD="$MAGIC_CMD" + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="ifelse([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + egrep "$file_magic_regex" > /dev/null; then + : + else + cat <<EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$ac_save_ifs" + MAGIC_CMD="$ac_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +]) + + +# AC_PATH_MAGIC - find a file program which can recognise a shared library +AC_DEFUN([AC_PATH_MAGIC], +[AC_REQUIRE([AC_CHECK_TOOL_PREFIX])dnl +AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin:$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + AC_PATH_TOOL_PREFIX(file, /usr/bin:$PATH) + else + MAGIC_CMD=: + fi +fi +]) + + +# AC_PROG_LD - find the path to the GNU or non-GNU linker +AC_DEFUN([AC_PROG_LD], +[AC_ARG_WITH(gnu-ld, +[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], +test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | [[A-Za-z]]:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$lt_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" +else + lt_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$lt_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_PROG_LD_GNU +]) + +# AC_PROG_LD_GNU - +AC_DEFUN([AC_PROG_LD_GNU], +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then + lt_cv_prog_gnu_ld=yes +else + lt_cv_prog_gnu_ld=no +fi]) +with_gnu_ld=$lt_cv_prog_gnu_ld +]) + +# AC_PROG_LD_RELOAD_FLAG - find reload flag for linker +# -- PORTME Some linkers may need a different reload flag. +AC_DEFUN([AC_PROG_LD_RELOAD_FLAG], +[AC_CACHE_CHECK([for $LD option to reload object files], lt_cv_ld_reload_flag, +[lt_cv_ld_reload_flag='-r']) +reload_flag=$lt_cv_ld_reload_flag +test -n "$reload_flag" && reload_flag=" $reload_flag" +]) + +# AC_DEPLIBS_CHECK_METHOD - how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +AC_DEFUN([AC_DEPLIBS_CHECK_METHOD], +[AC_CACHE_CHECK([how to recognise dependent libraries], +lt_cv_deplibs_check_method, +[lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given egrep regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix4* | aix5*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi4*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin* | mingw* | pw32*) + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library' + lt_cv_file_magic_cmd='/usr/bin/file -L' + case "$host_os" in + rhapsody* | darwin1.[[012]]) + lt_cv_file_magic_test_file=`echo /System/Library/Frameworks/System.framework/Versions/*/System | head -1` + ;; + *) # Darwin 1.3 on + lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib' + ;; + esac + ;; + +freebsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20*|hpux11*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + irix5* | nonstopux*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" + ;; + *) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[[1234]] dynamic lib MIPS - version 1" + ;; + esac + lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*` + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux*) + case $host_cpu in + alpha* | hppa* | i*86 | m68* | mips | mipsel | powerpc* | s390* | sparc* | ia64* | x86_64*) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; + esac + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/\.]]+\.so\.[[0-9]]+\.[[0-9]]+$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/\.]]+\.so$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +openbsd*) + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object' + else + lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' + fi + ;; + +osf3* | osf4* | osf5*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method='file_magic COFF format alpha shared library' + lt_cv_file_magic_test_file=/shlib/libc.so + lt_cv_deplibs_check_method=pass_all + ;; + +sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + lt_cv_file_magic_test_file=/lib/libc.so + ;; + +sysv5uw[[78]]* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +]) + + +# AC_PROG_NM - find the path to a BSD-compatible name lister +AC_DEFUN([AC_PROG_NM], +[AC_REQUIRE([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR])dnl +AC_MSG_CHECKING([for BSD-compatible nm]) +AC_CACHE_VAL(lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/${ac_tool_prefix}nm + if test -f $tmp_nm || test -f $tmp_nm$ac_exeext ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + if ($tmp_nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep '(/dev/null|Invalid file or object type)' >/dev/null; then + lt_cv_path_NM="$tmp_nm -B" + break + elif ($tmp_nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + lt_cv_path_NM="$tmp_nm -p" + break + else + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + fi + fi + done + IFS="$ac_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi]) +NM="$lt_cv_path_NM" +AC_MSG_RESULT([$NM]) +]) + +# AC_CHECK_LIBM - check for math library +AC_DEFUN([AC_CHECK_LIBM], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32*) + # These system don't have libm + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, main, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, main, LIBM="-lm") + ;; +esac +]) + +# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for +# the libltdl convenience library and LTDLINCL to the include flags for +# the libltdl header and adds --enable-ltdl-convenience to the +# configure arguments. Note that LIBLTDL and LTDLINCL are not +# AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If DIR is not +# provided, it is assumed to be `libltdl'. LIBLTDL will be prefixed +# with '${top_builddir}/' and LTDLINCL will be prefixed with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and +# top_srcdir appropriately in the Makefiles. +AC_DEFUN([AC_LIBLTDL_CONVENIENCE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +]) + +# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for +# the libltdl installable library and LTDLINCL to the include flags for +# the libltdl header and adds --enable-ltdl-install to the configure +# arguments. Note that LIBLTDL and LTDLINCL are not AC_SUBSTed, nor is +# AC_CONFIG_SUBDIRS called. If DIR is not provided and an installed +# libltdl is not found, it is assumed to be `libltdl'. LIBLTDL will +# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed +# with '${top_srcdir}/' (note the single quotes!). If your package is +# not flat and you're not using automake, define top_builddir and +# top_srcdir appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN([AC_LIBLTDL_INSTALLABLE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, main, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + LTDLINCL= + fi + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +]) + +# old names +AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) +AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) +AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) +AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) +AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) + +# This is just to silence aclocal about the macro not being used +ifelse([AC_DISABLE_FAST_INSTALL]) + +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +# LT_AC_PROG_SED +# -------------- +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +AC_DEFUN([LT_AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_executable_p="test -f" +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + _sed_list="$_sed_list $as_dir/$ac_prog$ac_exec_ext" + fi + done + done +done + + # Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. +: ${TMPDIR=/tmp} +{ + tmp=`(umask 077 && mktemp -d -q "$TMPDIR/sedXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=$TMPDIR/sed$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + { (exit 1); exit 1; } +} + _max=0 + _count=0 + # Add /usr/xpg4/bin/sed as it is typically found on Solaris + # along with /bin/sed that truncates output. + for _sed in $_sed_list /usr/xpg4/bin/sed; do + test ! -f ${_sed} && break + cat /dev/null > "$tmp/sed.in" + _count=0 + echo ${ECHO_N-$ac_n} "0123456789${ECHO_C-$ac_c}" >"$tmp/sed.in" + # Check for GNU sed and select it if it is found. + if "${_sed}" --version 2>&1 < /dev/null | egrep '(GNU)' > /dev/null; then + lt_cv_path_SED=${_sed} + break + fi + while true; do + cat "$tmp/sed.in" "$tmp/sed.in" >"$tmp/sed.tmp" + mv "$tmp/sed.tmp" "$tmp/sed.in" + cp "$tmp/sed.in" "$tmp/sed.nl" + echo >>"$tmp/sed.nl" + ${_sed} -e 's/a$//' < "$tmp/sed.nl" >"$tmp/sed.out" || break + cmp -s "$tmp/sed.out" "$tmp/sed.nl" || break + # 40000 chars as input seems more than enough + test $_count -gt 10 && break + _count=`expr $_count + 1` + if test $_count -gt $_max; then + _max=$_count + lt_cv_path_SED=$_sed + fi + done + done + rm -rf "$tmp" +]) +if test "X$SED" != "X"; then + lt_cv_path_SED=$SED +else + SED=$lt_cv_path_SED +fi +AC_MSG_RESULT([$SED]) +]) + diff --git a/extern/solid/config.guess b/extern/solid/config.guess new file mode 100755 index 00000000000..791554753c8 --- /dev/null +++ b/extern/solid/config.guess @@ -0,0 +1,1410 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002 Free Software Foundation, Inc. + +timestamp='2002-11-30' + +# This file 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. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Per Bothner <per@bothner.com>. +# Please send patches to <config-patches@gnu.org>. Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to <config-patches@gnu.org>." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# This shell variable is my proudest work .. or something. --bje + +set_cc_for_build='tmpdir=${TMPDIR-/tmp}/config-guess-$$ ; +(old=`umask` && umask 077 && mkdir $tmpdir && umask $old && unset old) + || (echo "$me: cannot create $tmpdir" >&2 && exit 1) ; +dummy=$tmpdir/dummy ; +files="$dummy.c $dummy.o $dummy.rel $dummy" ; +trap '"'"'rm -f $files; rmdir $tmpdir; exit 1'"'"' 1 2 15 ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + rm -f $files ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; +unset files' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "${UNAME_MACHINE}" in + i?86) + test -z "$VENDOR" && VENDOR=pc + ;; + *) + test -z "$VENDOR" && VENDOR=unknown + ;; +esac +test -f /etc/SuSE-release -o -f /.buildenv && VENDOR=suse + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit 0 ;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + arc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + macppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvmeppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + pmax:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mipseb-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sun3:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + wgrisc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + alpha:OSF1:*:*) + if test $UNAME_RELEASE = "V4.0"; then + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + fi + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + eval $set_cc_for_build + cat <<EOF >$dummy.s + .data +\$Lformat: + .byte 37,100,45,37,120,10,0 # "%d-%x\n" + + .text + .globl main + .align 4 + .ent main +main: + .frame \$30,16,\$26,0 + ldgp \$29,0(\$27) + .prologue 1 + .long 0x47e03d80 # implver \$0 + lda \$2,-1 + .long 0x47e20c21 # amask \$2,\$1 + lda \$16,\$Lformat + mov \$0,\$17 + not \$1,\$18 + jsr \$26,printf + ldgp \$29,0(\$26) + mov 0,\$16 + jsr \$26,exit + .end main +EOF + $CC_FOR_BUILD -o $dummy $dummy.s 2>/dev/null + if test "$?" = 0 ; then + case `$dummy` in + 0-0) + UNAME_MACHINE="alpha" + ;; + 1-0) + UNAME_MACHINE="alphaev5" + ;; + 1-1) + UNAME_MACHINE="alphaev56" + ;; + 1-101) + UNAME_MACHINE="alphapca56" + ;; + 2-303) + UNAME_MACHINE="alphaev6" + ;; + 2-307) + UNAME_MACHINE="alphaev67" + ;; + 2-1307) + UNAME_MACHINE="alphaev68" + ;; + 3-1307) + UNAME_MACHINE="alphaev7" + ;; + esac + fi + rm -f $dummy.s $dummy && rmdir $tmpdir + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit 0;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit 0 ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit 0;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit 0 ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; + DRS?6000:UNIX_SV:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7 && exit 0 ;; + esac ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit 0 ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit 0 ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit 0 ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit 0 ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include <stdio.h> /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c \ + && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && rm -f $dummy.c $dummy && rmdir $tmpdir && exit 0 + rm -f $dummy.c $dummy && rmdir $tmpdir + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit 0 ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit 0 ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit 0 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit 0 ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit 0 ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit 0 ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit 0 ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit 0 ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit 0 ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include <sys/systemcfg.h> + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && rm -f $dummy.c $dummy && rmdir $tmpdir && exit 0 + rm -f $dummy.c $dummy && rmdir $tmpdir + echo rs6000-ibm-aix3.2.5 + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit 0 ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit 0 ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit 0 ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit 0 ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit 0 ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit 0 ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include <stdlib.h> + #include <unistd.h> + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi + rm -f $dummy.c $dummy && rmdir $tmpdir + fi ;; + esac + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include <unistd.h> + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && rm -f $dummy.c $dummy && rmdir $tmpdir && exit 0 + rm -f $dummy.c $dummy && rmdir $tmpdir + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit 0 ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit 0 ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit 0 ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit 0 ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3D:*:*:*) + echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:FreeBSD:*:*) + # Determine whether the default compiler uses glibc. + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include <features.h> + #if __GLIBC__ >= 2 + LIBC=gnu + #else + LIBC= + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + rm -f $dummy.c && rmdir $tmpdir + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} + exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit 0 ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit 0 ;; + x86:Interix*:3*) + echo i586-pc-interix3 + exit 0 ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit 0 ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit 0 ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit 0 ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit 0 ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-${VENDOR}-linux + exit 0 ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-${VENDOR}-linux + exit 0 ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-${VENDOR}-linux + exit 0 ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + rm -f $dummy.c && rmdir $tmpdir + test x"${CPU}" != x && echo "${CPU}-${VENDOR}-linux" && exit 0 + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + rm -f $dummy.c && rmdir $tmpdir + test x"${CPU}" != x && echo "${CPU}-${VENDOR}-linux" && exit 0 + ;; + ppc:Linux:*:*) + echo powerpc-${VENDOR}-linux + exit 0 ;; + ppc64:Linux:*:*) + echo powerpc64-${VENDOR}-linux + exit 0 ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-${VENDOR}-linux${LIBC} + exit 0 ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-${VENDOR}-linux ;; + PA8*) echo hppa2.0-${VENDOR}-linux ;; + *) echo hppa-${VENDOR}-linux ;; + esac + exit 0 ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-${VENDOR}-linux + exit 0 ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit 0 ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-${VENDOR}-linux + exit 0 ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-${VENDOR}-linux + exit 0 ;; + x86_64:Linux:*:*) + echo x86_64-${VENDOR}-linux + exit 0 ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-${VENDOR}-linux" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-${VENDOR}-linuxaout" + exit 0 ;; + coff-i386) + echo "${UNAME_MACHINE}-${VENDOR}-linuxcoff" + exit 0 ;; + "") + # Either a pre-BFD a.out linker (linuxoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-${VENDOR}-linuxoldld" + exit 0 ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include <features.h> + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #ifdef __INTEL_COMPILER + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + rm -f $dummy.c && rmdir $tmpdir + test x"${LIBC}" != x && echo "${UNAME_MACHINE}-${VENDOR}-linux-${LIBC}" | sed 's/linux-gnu/linux/' && exit 0 + test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit 0 ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit 0 ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit 0 ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit 0 ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit 0 ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit 0 ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit 0 ;; + i*86:*:5:[78]*) + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit 0 ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name` + echo ${UNAME_MACHINE}-pc-isc$UNAME_REL + elif /bin/uname -X 2>/dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit 0 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit 0 ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit 0 ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit 0 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit 0 ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit 0 ;; + M68*:*:R3V[567]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4.3${OS_REL} && exit 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit 0 ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says <Richard.M.Bartel@ccMail.Census.GOV> + echo i586-unisys-sysv4 + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes <hewes@openmarket.com>. + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit 0 ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit 0 ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit 0 ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit 0 ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit 0 ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit 0 ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit 0 ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit 0 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Darwin:*:*) + echo `uname -p`-apple-darwin${UNAME_RELEASE} + exit 0 ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit 0 ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit 0 ;; + NSR-[DGKLNPTVW]:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit 0 ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit 0 ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit 0 ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit 0 ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit 0 ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit 0 ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit 0 ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit 0 ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit 0 ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit 0 ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit 0 ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c <<EOF +#ifdef _SEQUENT_ +# include <sys/types.h> +# include <sys/utsname.h> +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include <sys/param.h> + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include <sys/param.h> +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && rm -f $dummy.c $dummy && rmdir $tmpdir && exit 0 +rm -f $dummy.c $dummy && rmdir $tmpdir + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac +fi + +cat >&2 <<EOF +$0: unable to guess system type + +This script, last modified $timestamp, has failed to recognize +the operating system you are using. It is advised that you +download the most up to date version of the config scripts from + + ftp://ftp.gnu.org/pub/gnu/config/ + +If the version you run ($0) is already up to date, please +send the following data and any information you think might be +pertinent to <config-patches@gnu.org> in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/extern/solid/config.sub b/extern/solid/config.sub new file mode 100755 index 00000000000..ba2252da589 --- /dev/null +++ b/extern/solid/config.sub @@ -0,0 +1,1466 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002 Free Software Foundation, Inc. + +timestamp='2002-11-30' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file 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. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Please send patches to <config-patches@gnu.org>. Submit a context +# diff and a properly formatted ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to <config-patches@gnu.org>." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit 0;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k \ + | m32r | m68000 | m68k | m88k | mcore \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64vr | mips64vrel \ + | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mipsisa32 | mipsisa32el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | ns16k | ns32k \ + | openrisc | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | sh | sh[1234] | sh3e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ + | strongarm \ + | tahoe | thumb | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xscale | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* \ + | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* \ + | clipper-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* \ + | m32r-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | mcore-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39 | mipstx39el \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[1234]-* | sh3e-* | sh[34]eb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ + | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* | tic30-* | tic4x-* | tic54x-* | tic80-* | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ + | xtensa-* \ + | ymp-* \ + | z8k-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + mmix*) + basic_machine=mmix-knuth + os=-mmixware + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + or32 | or32-*) + basic_machine=or32-unknown + os=-coff + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2) + basic_machine=i686-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3d) + basic_machine=alpha-cray + os=-unicos + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic4x | c4x*) + basic_machine=tic4x-unknown + os=-coff + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh3 | sh4 | sh3eb | sh4eb | sh[1234]le | sh3ele) + basic_machine=sh-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparc | sparcv9 | sparcv9b) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ + | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-ibm) + os=-aix + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/extern/solid/include/GEN_MinMax.h b/extern/solid/include/GEN_MinMax.h new file mode 100755 index 00000000000..9ea961cfe4f --- /dev/null +++ b/extern/solid/include/GEN_MinMax.h @@ -0,0 +1,76 @@ +/* + * 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 new file mode 100755 index 00000000000..4690a05511a --- /dev/null +++ b/extern/solid/include/GEN_random.h @@ -0,0 +1,49 @@ +/* + * 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 new file mode 100755 index 00000000000..8e1666c9c23 --- /dev/null +++ b/extern/solid/include/MT/Interval.h @@ -0,0 +1,175 @@ +/* + * 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 + +#include <cassert> +#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 << '[' << x.lower() << ", " << x.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 new file mode 100755 index 00000000000..73c5d838d6a --- /dev/null +++ b/extern/solid/include/MT/Matrix3x3.h @@ -0,0 +1,376 @@ +/* + * 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 + +#include <cassert> + +#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 new file mode 100755 index 00000000000..fd7149e95e8 --- /dev/null +++ b/extern/solid/include/MT/Quaternion.h @@ -0,0 +1,312 @@ +/* + * 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 + +#include <cassert> + +#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) + { + m_co[0] += q[0]; m_co[1] += q[1]; m_co[2] += q[2]; m_co[3] += q[3]; + return *this; + } + + Quaternion<Scalar>& operator-=(const Quaternion<Scalar>& q) + { + m_co[0] -= q[0]; m_co[1] -= q[1]; m_co[2] -= q[2]; m_co[3] -= q[3]; + return *this; + } + + Quaternion<Scalar>& operator*=(const Scalar& s) + { + m_co[0] *= s; m_co[1] *= s; m_co[2] *= s; 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(m_co[3] * q[0] + m_co[0] * q[3] + m_co[1] * q[2] - m_co[2] * q[1], + m_co[3] * q[1] + m_co[1] * q[3] + m_co[2] * q[0] - m_co[0] * q[2], + m_co[3] * q[2] + m_co[2] * q[3] + m_co[0] * q[1] - m_co[1] * q[0], + m_co[3] * q[3] - m_co[0] * q[0] - m_co[1] * q[1] - m_co[2] * q[2]); + return *this; + } + + Scalar dot(const Quaternion<Scalar>& q) const + { + return m_co[0] * q[0] + m_co[1] * q[1] + m_co[2] * q[2] + 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>(-m_co[0], -m_co[1], -m_co[2], 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>((m_co[0] * s0 + q[0] * s1) * d, + (m_co[1] * s0 + q[1] * s1) * d, + (m_co[2] * s0 + q[2] * s1) * d, + (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 new file mode 100755 index 00000000000..b80dc1bc18b --- /dev/null +++ b/extern/solid/include/MT/Transform.h @@ -0,0 +1,189 @@ +/* + * 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 new file mode 100755 index 00000000000..bdc046a0317 --- /dev/null +++ b/extern/solid/include/MT/Tuple3.h @@ -0,0 +1,115 @@ +/* + * 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 + +#include <cassert> +#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 new file mode 100755 index 00000000000..f88e5e3a29a --- /dev/null +++ b/extern/solid/include/MT/Tuple4.h @@ -0,0 +1,107 @@ +/* + * 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 + +#include <cassert> +#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 new file mode 100755 index 00000000000..6248a138092 --- /dev/null +++ b/extern/solid/include/MT/Vector3.h @@ -0,0 +1,279 @@ +/* + * 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 + +#include <cassert> + +#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) + { + m_co[0] += v[0]; m_co[1] += v[1]; m_co[2] += v[2]; + return *this; + } + + Vector3<Scalar>& operator-=(const Vector3<Scalar>& v) + { + m_co[0] -= v[0]; m_co[1] -= v[1]; m_co[2] -= v[2]; + return *this; + } + + Vector3<Scalar>& operator*=(const Scalar& s) + { + m_co[0] *= s; m_co[1] *= s; 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 m_co[0] * v[0] + m_co[1] * v[1] + 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(m_co[0]), + Scalar_traits<Scalar>::abs(m_co[1]), + Scalar_traits<Scalar>::abs(m_co[2])); + } + + Vector3<Scalar> cross(const Vector3<Scalar>& v) const + { + return Vector3<Scalar>(m_co[1] * v[2] - m_co[2] * v[1], + m_co[2] * v[0] - m_co[0] * v[2], + m_co[0] * v[1] - m_co[1] * v[0]); + } + + Scalar triple(const Vector3<Scalar>& v1, const Vector3<Scalar>& v2) const + { + return m_co[0] * (v1[1] * v2[2] - v1[2] * v2[1]) + + m_co[1] * (v1[2] * v2[0] - v1[0] * v2[2]) + + m_co[2] * (v1[0] * v2[1] - v1[1] * v2[0]); + } + + int minAxis() const + { + return m_co[0] < m_co[1] ? (m_co[0] < m_co[2] ? 0 : 2) : (m_co[1] < m_co[2] ? 1 : 2); + } + + int maxAxis() const + { + return m_co[0] < m_co[1] ? (m_co[1] < m_co[2] ? 2 : 1) : (m_co[0] < 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>(m_co[0] + (v[0] - m_co[0]) * t, + m_co[1] + (v[1] - m_co[1]) * t, + m_co[2] + (v[2] - 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 new file mode 100755 index 00000000000..b5dc537e0d9 --- /dev/null +++ b/extern/solid/include/MT_BBox.h @@ -0,0 +1,119 @@ +/* + * 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 new file mode 100755 index 00000000000..25ebfd0a67d --- /dev/null +++ b/extern/solid/include/MT_Interval.h @@ -0,0 +1,33 @@ +/* + * 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 new file mode 100755 index 00000000000..f7572f90fa2 --- /dev/null +++ b/extern/solid/include/MT_Matrix3x3.h @@ -0,0 +1,34 @@ +/* + * 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 new file mode 100755 index 00000000000..ca84f652b65 --- /dev/null +++ b/extern/solid/include/MT_Point3.h @@ -0,0 +1,31 @@ +/* + * 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 new file mode 100755 index 00000000000..ca860db711c --- /dev/null +++ b/extern/solid/include/MT_Quaternion.h @@ -0,0 +1,35 @@ +/* + * 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 new file mode 100755 index 00000000000..870aa6d38a1 --- /dev/null +++ b/extern/solid/include/MT_Scalar.h @@ -0,0 +1,134 @@ +/* + * 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 + +#include <cmath> + +#undef max + +#include <cstdlib> +#include <cfloat> +#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); } + 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); } +}; + +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 new file mode 100755 index 00000000000..66f92428054 --- /dev/null +++ b/extern/solid/include/MT_Transform.h @@ -0,0 +1,38 @@ +/* + * 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 new file mode 100755 index 00000000000..d50e80dc287 --- /dev/null +++ b/extern/solid/include/MT_Vector3.h @@ -0,0 +1,50 @@ +/* + * 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 new file mode 100755 index 00000000000..906be729ba0 --- /dev/null +++ b/extern/solid/include/SOLID.h @@ -0,0 +1,276 @@ +/* + * 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_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); + + +/* 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 new file mode 100755 index 00000000000..74e4214fa67 --- /dev/null +++ b/extern/solid/include/SOLID_broad.h @@ -0,0 +1,75 @@ +/* + * 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 new file mode 100755 index 00000000000..630594e447f --- /dev/null +++ b/extern/solid/include/SOLID_types.h @@ -0,0 +1,53 @@ +/* + * 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/src/DT_AlgoTable.h b/extern/solid/src/DT_AlgoTable.h new file mode 100755 index 00000000000..0749ca7fdd9 --- /dev/null +++ b/extern/solid/src/DT_AlgoTable.h @@ -0,0 +1,47 @@ +/* + * 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 new file mode 100755 index 00000000000..c07a3bb7ccc --- /dev/null +++ b/extern/solid/src/DT_C-api.cpp @@ -0,0 +1,573 @@ +/* + * 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_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 new file mode 100755 index 00000000000..49cc4bf3764 --- /dev/null +++ b/extern/solid/src/DT_Encounter.cpp @@ -0,0 +1,107 @@ +/* + * 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_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 new file mode 100755 index 00000000000..f20ea3936b0 --- /dev/null +++ b/extern/solid/src/DT_Encounter.h @@ -0,0 +1,84 @@ +/* + * 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 new file mode 100755 index 00000000000..ba36c889b22 --- /dev/null +++ b/extern/solid/src/DT_Object.cpp @@ -0,0 +1,252 @@ +/* + * 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) +{ + 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 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) +{ + 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 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) +{ + return penetration_depth((const DT_Complex&)a, a2w, a_margin, + DT_Transform(b2w, (const DT_Convex&)b), b_margin, v, pa, pb); +} + +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) +{ + 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); +} + +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 new file mode 100755 index 00000000000..78beee2ab57 --- /dev/null +++ b/extern/solid/src/DT_Object.h @@ -0,0 +1,157 @@ +/* + * 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 new file mode 100755 index 00000000000..20fbfc06aac --- /dev/null +++ b/extern/solid/src/DT_RespTable.cpp @@ -0,0 +1,184 @@ +/* + * 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 new file mode 100755 index 00000000000..9a17f562937 --- /dev/null +++ b/extern/solid/src/DT_RespTable.h @@ -0,0 +1,139 @@ +/* + * 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 new file mode 100755 index 00000000000..e58d9bb9944 --- /dev/null +++ b/extern/solid/src/DT_Response.h @@ -0,0 +1,63 @@ +/* + * 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 new file mode 100755 index 00000000000..56cea1633ca --- /dev/null +++ b/extern/solid/src/DT_Scene.cpp @@ -0,0 +1,183 @@ +/* + * 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 new file mode 100755 index 00000000000..9b061910312 --- /dev/null +++ b/extern/solid/src/DT_Scene.h @@ -0,0 +1,57 @@ +/* + * 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/broad/BP_C-api.cpp b/extern/solid/src/broad/BP_C-api.cpp new file mode 100755 index 00000000000..43e1172927b --- /dev/null +++ b/extern/solid/src/broad/BP_C-api.cpp @@ -0,0 +1,77 @@ +/* + * 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 new file mode 100755 index 00000000000..8de6e67ce65 --- /dev/null +++ b/extern/solid/src/broad/BP_Endpoint.h @@ -0,0 +1,108 @@ +/* + * 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 new file mode 100755 index 00000000000..aa094ffeb0a --- /dev/null +++ b/extern/solid/src/broad/BP_EndpointList.cpp @@ -0,0 +1,237 @@ +/* + * 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 new file mode 100755 index 00000000000..6154991ed3d --- /dev/null +++ b/extern/solid/src/broad/BP_EndpointList.h @@ -0,0 +1,109 @@ +/* + * 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 new file mode 100755 index 00000000000..e8007df240d --- /dev/null +++ b/extern/solid/src/broad/BP_Proxy.cpp @@ -0,0 +1,120 @@ +/* + * 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 new file mode 100755 index 00000000000..b4500ddca44 --- /dev/null +++ b/extern/solid/src/broad/BP_Proxy.h @@ -0,0 +1,78 @@ +/* + * 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 new file mode 100755 index 00000000000..dde5693904a --- /dev/null +++ b/extern/solid/src/broad/BP_ProxyList.h @@ -0,0 +1,69 @@ +/* + * 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, 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, 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 new file mode 100755 index 00000000000..c0cd83ba311 --- /dev/null +++ b/extern/solid/src/broad/BP_Scene.cpp @@ -0,0 +1,151 @@ +/* + * 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 new file mode 100755 index 00000000000..ef55374c43b --- /dev/null +++ b/extern/solid/src/broad/BP_Scene.h @@ -0,0 +1,79 @@ +/* + * 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/complex/DT_BBoxTree.cpp b/extern/solid/src/complex/DT_BBoxTree.cpp new file mode 100755 index 00000000000..4f10f61f2e2 --- /dev/null +++ b/extern/solid/src/complex/DT_BBoxTree.cpp @@ -0,0 +1,90 @@ +/* + * 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 new file mode 100755 index 00000000000..995da05573a --- /dev/null +++ b/extern/solid/src/complex/DT_BBoxTree.h @@ -0,0 +1,540 @@ +/* + * 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) + { + m_b_cbox += computeCBox(margin, 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 new file mode 100755 index 00000000000..7fc7c5df4db --- /dev/null +++ b/extern/solid/src/complex/DT_CBox.h @@ -0,0 +1,134 @@ +/* + * 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 new file mode 100755 index 00000000000..023383a8427 --- /dev/null +++ b/extern/solid/src/complex/DT_Complex.cpp @@ -0,0 +1,327 @@ +/* + * 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 new file mode 100755 index 00000000000..ae08a05d4c9 --- /dev/null +++ b/extern/solid/src/complex/DT_Complex.h @@ -0,0 +1,94 @@ +/* + * 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/convex/DT_Accuracy.cpp b/extern/solid/src/convex/DT_Accuracy.cpp new file mode 100755 index 00000000000..113275b0dbd --- /dev/null +++ b/extern/solid/src/convex/DT_Accuracy.cpp @@ -0,0 +1,30 @@ +/* + * 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 new file mode 100755 index 00000000000..9759a6fd4c5 --- /dev/null +++ b/extern/solid/src/convex/DT_Accuracy.h @@ -0,0 +1,47 @@ +/* + * 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 new file mode 100755 index 00000000000..603ebe978f1 --- /dev/null +++ b/extern/solid/src/convex/DT_Array.h @@ -0,0 +1,71 @@ +/* + * 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 + +#include <cassert> + +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 new file mode 100755 index 00000000000..0b46f566fe8 --- /dev/null +++ b/extern/solid/src/convex/DT_Box.cpp @@ -0,0 +1,112 @@ +/* + * 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 new file mode 100755 index 00000000000..ace9634b5e3 --- /dev/null +++ b/extern/solid/src/convex/DT_Box.h @@ -0,0 +1,62 @@ +/* + * 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 new file mode 100755 index 00000000000..1dd6a7ddbbe --- /dev/null +++ b/extern/solid/src/convex/DT_Cone.cpp @@ -0,0 +1,48 @@ +/* + * 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 new file mode 100755 index 00000000000..85e416877dd --- /dev/null +++ b/extern/solid/src/convex/DT_Cone.h @@ -0,0 +1,45 @@ +/* + * 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 new file mode 100755 index 00000000000..3be47f6ed02 --- /dev/null +++ b/extern/solid/src/convex/DT_Convex.cpp @@ -0,0 +1,426 @@ +/* + * 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 new file mode 100755 index 00000000000..dd620ac8b98 --- /dev/null +++ b/extern/solid/src/convex/DT_Convex.h @@ -0,0 +1,64 @@ +/* + * 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 new file mode 100755 index 00000000000..cff5ebcefb1 --- /dev/null +++ b/extern/solid/src/convex/DT_Cylinder.cpp @@ -0,0 +1,39 @@ +/* + * 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 new file mode 100755 index 00000000000..2a0c07fd579 --- /dev/null +++ b/extern/solid/src/convex/DT_Cylinder.h @@ -0,0 +1,42 @@ +/* + * 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 new file mode 100755 index 00000000000..87ae5c3e0be --- /dev/null +++ b/extern/solid/src/convex/DT_Facet.cpp @@ -0,0 +1,80 @@ +/* + * 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 new file mode 100755 index 00000000000..873706346b8 --- /dev/null +++ b/extern/solid/src/convex/DT_Facet.h @@ -0,0 +1,134 @@ +/* + * 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 new file mode 100755 index 00000000000..d8f44acf85e --- /dev/null +++ b/extern/solid/src/convex/DT_GJK.h @@ -0,0 +1,438 @@ +/* + * 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 new file mode 100755 index 00000000000..a5bf56ae59d --- /dev/null +++ b/extern/solid/src/convex/DT_Hull.h @@ -0,0 +1,53 @@ +/* + * 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 new file mode 100755 index 00000000000..95551fa8483 --- /dev/null +++ b/extern/solid/src/convex/DT_IndexArray.h @@ -0,0 +1,33 @@ +/* + * 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 new file mode 100755 index 00000000000..6c7ccf6b9b7 --- /dev/null +++ b/extern/solid/src/convex/DT_LineSegment.cpp @@ -0,0 +1,36 @@ +/* + * 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 new file mode 100755 index 00000000000..979ff8a18a9 --- /dev/null +++ b/extern/solid/src/convex/DT_LineSegment.h @@ -0,0 +1,52 @@ +/* + * 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 new file mode 100755 index 00000000000..e90fed6a8e0 --- /dev/null +++ b/extern/solid/src/convex/DT_Minkowski.h @@ -0,0 +1,51 @@ +/* + * 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 new file mode 100755 index 00000000000..e1c5c9a3949 --- /dev/null +++ b/extern/solid/src/convex/DT_PenDepth.cpp @@ -0,0 +1,376 @@ +/* + * 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 new file mode 100755 index 00000000000..97b3c6c0e0e --- /dev/null +++ b/extern/solid/src/convex/DT_PenDepth.h @@ -0,0 +1,36 @@ +/* + * 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 new file mode 100755 index 00000000000..770fe7775b7 --- /dev/null +++ b/extern/solid/src/convex/DT_Point.cpp @@ -0,0 +1,36 @@ +/* + * 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 new file mode 100755 index 00000000000..b35d158ee53 --- /dev/null +++ b/extern/solid/src/convex/DT_Point.h @@ -0,0 +1,46 @@ +/* + * 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 new file mode 100755 index 00000000000..f48ac6e4b6d --- /dev/null +++ b/extern/solid/src/convex/DT_Polyhedron.cpp @@ -0,0 +1,415 @@ +/* + * 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 new file mode 100755 index 00000000000..58c991bd152 --- /dev/null +++ b/extern/solid/src/convex/DT_Polyhedron.h @@ -0,0 +1,76 @@ +/* + * 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 new file mode 100755 index 00000000000..e757c3bfdb4 --- /dev/null +++ b/extern/solid/src/convex/DT_Polytope.cpp @@ -0,0 +1,69 @@ +/* + * 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 new file mode 100755 index 00000000000..c715598defe --- /dev/null +++ b/extern/solid/src/convex/DT_Polytope.h @@ -0,0 +1,51 @@ +/* + * 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 new file mode 100755 index 00000000000..d48942fe515 --- /dev/null +++ b/extern/solid/src/convex/DT_Shape.h @@ -0,0 +1,72 @@ +/* + * 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 new file mode 100755 index 00000000000..3f2443dcf53 --- /dev/null +++ b/extern/solid/src/convex/DT_Sphere.cpp @@ -0,0 +1,90 @@ +/* + * 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 new file mode 100755 index 00000000000..92386a66f3a --- /dev/null +++ b/extern/solid/src/convex/DT_Sphere.h @@ -0,0 +1,43 @@ +/* + * 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 new file mode 100755 index 00000000000..a976d48d22b --- /dev/null +++ b/extern/solid/src/convex/DT_Transform.h @@ -0,0 +1,53 @@ +/* + * 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 new file mode 100755 index 00000000000..1917910b39d --- /dev/null +++ b/extern/solid/src/convex/DT_Triangle.cpp @@ -0,0 +1,96 @@ +/* + * 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 new file mode 100755 index 00000000000..4192b5629ac --- /dev/null +++ b/extern/solid/src/convex/DT_Triangle.h @@ -0,0 +1,63 @@ +/* + * 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 new file mode 100755 index 00000000000..37646fdd935 --- /dev/null +++ b/extern/solid/src/convex/DT_VertexBase.h @@ -0,0 +1,84 @@ +/* + * 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 |