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 | |
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')
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 |