summaryrefslogtreecommitdiff
path: root/libs/ode-0.16.1/GIMPACT/include
diff options
context:
space:
mode:
authorsanine <sanine.not@pm.me>2022-10-01 20:59:36 -0500
committersanine <sanine.not@pm.me>2022-10-01 20:59:36 -0500
commitc5fc66ee58f2c60f2d226868bb1cf5b91badaf53 (patch)
tree277dd280daf10bf77013236b8edfa5f88708c7e0 /libs/ode-0.16.1/GIMPACT/include
parent1cf9cc3408af7008451f9133fb95af66a9697d15 (diff)
add ode
Diffstat (limited to 'libs/ode-0.16.1/GIMPACT/include')
-rw-r--r--libs/ode-0.16.1/GIMPACT/include/GIMPACT/Makefile.am6
-rw-r--r--libs/ode-0.16.1/GIMPACT/include/GIMPACT/Makefile.in533
-rw-r--r--libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_boxpruning.h323
-rw-r--r--libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_contact.h115
-rw-r--r--libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_geometry.h1885
-rw-r--r--libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_math.h164
-rw-r--r--libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_memory.h1056
-rw-r--r--libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_radixsort.h258
-rw-r--r--libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_tri_capsule_collision.h111
-rw-r--r--libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_tri_collision.h253
-rw-r--r--libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_tri_sphere_collision.h51
-rw-r--r--libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_trimesh.h544
-rw-r--r--libs/ode-0.16.1/GIMPACT/include/GIMPACT/gimpact.h45
-rw-r--r--libs/ode-0.16.1/GIMPACT/include/Makefile.am1
-rw-r--r--libs/ode-0.16.1/GIMPACT/include/Makefile.in640
15 files changed, 5985 insertions, 0 deletions
diff --git a/libs/ode-0.16.1/GIMPACT/include/GIMPACT/Makefile.am b/libs/ode-0.16.1/GIMPACT/include/GIMPACT/Makefile.am
new file mode 100644
index 0000000..347ae72
--- /dev/null
+++ b/libs/ode-0.16.1/GIMPACT/include/GIMPACT/Makefile.am
@@ -0,0 +1,6 @@
+noinst_HEADERS = \
+ gim_boxpruning.h gim_contact.h gim_geometry.h \
+ gim_math.h gim_memory.h gimpact.h \
+ gim_radixsort.h gim_tri_capsule_collision.h gim_tri_collision.h \
+ gim_trimesh.h gim_tri_sphere_collision.h
+
diff --git a/libs/ode-0.16.1/GIMPACT/include/GIMPACT/Makefile.in b/libs/ode-0.16.1/GIMPACT/include/GIMPACT/Makefile.in
new file mode 100644
index 0000000..78758f7
--- /dev/null
+++ b/libs/ode-0.16.1/GIMPACT/include/GIMPACT/Makefile.in
@@ -0,0 +1,533 @@
+# Makefile.in generated by automake 1.15 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
+# This Makefile.in 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.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = GIMPACT/include/GIMPACT
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \
+ $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/ode/src/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+HEADERS = $(noinst_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CCD_CFLAGS = @CCD_CFLAGS@
+CCD_LIBS = @CCD_LIBS@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOXYGEN = @DOXYGEN@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+EXTRA_LIBTOOL_LDFLAGS = @EXTRA_LIBTOOL_LDFLAGS@
+FGREP = @FGREP@
+GL_LIBS = @GL_LIBS@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBSTDCXX = @LIBSTDCXX@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+ODE_PRECISION = @ODE_PRECISION@
+ODE_VERSION = @ODE_VERSION@
+ODE_VERSION_INFO = @ODE_VERSION_INFO@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+X11_CFLAGS = @X11_CFLAGS@
+X11_LIBS = @X11_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_WINDRES = @ac_ct_WINDRES@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+subdirs = @subdirs@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+noinst_HEADERS = \
+ gim_boxpruning.h gim_contact.h gim_geometry.h \
+ gim_math.h gim_memory.h gimpact.h \
+ gim_radixsort.h gim_tri_capsule_collision.h gim_tri_collision.h \
+ gim_trimesh.h gim_tri_sphere_collision.h
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign GIMPACT/include/GIMPACT/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign GIMPACT/include/GIMPACT/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(HEADERS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+ clean-libtool cscopelist-am ctags ctags-am distclean \
+ distclean-generic distclean-libtool distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-pdf \
+ install-pdf-am install-ps install-ps-am install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+ uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_boxpruning.h b/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_boxpruning.h
new file mode 100644
index 0000000..cfa6c79
--- /dev/null
+++ b/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_boxpruning.h
@@ -0,0 +1,323 @@
+#ifndef GIM_BOXPRUNING_H_INCLUDED
+#define GIM_BOXPRUNING_H_INCLUDED
+
+/*! \file gim_boxpruning.h
+\author Francisco León
+*/
+/*
+-----------------------------------------------------------------------------
+This source file is part of GIMPACT Library.
+
+For the latest info, see http://gimpact.sourceforge.net/
+
+Copyright (c) 2006 Francisco Leon. C.C. 80087371.
+email: projectileman@yahoo.com
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of EITHER:
+ (1) The GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 2.1 of the License, or (at
+ your option) any later version. The text of the GNU Lesser
+ General Public License is included with this library in the
+ file GIMPACT-LICENSE-LGPL.TXT.
+ (2) The BSD-style license that is included with this library in
+ the file GIMPACT-LICENSE-BSD.TXT.
+
+ This library 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 files
+ GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details.
+
+-----------------------------------------------------------------------------
+*/
+
+
+#include "GIMPACT/gim_radixsort.h"
+#include "GIMPACT/gim_geometry.h"
+
+/*! \defgroup BOX_PRUNNING
+
+\brief
+Tools for find overlapping objects on a scenary. These functions sort boxes for faster collisioin queries, using radix sort or quick sort as convenience. See \ref SORTING .
+<ul>
+<li> For using these collision routines, you must create a \ref GIM_AABB_SET by using this function : \ref gim_aabbset_alloc.
+<li> The GIM_AABB_SET objects must be updated on their boxes on each query, and they must be update by calling \ref gim_aabbset_update
+<li> Before calling collision functions, you must create a pair set with \ref GIM_CREATE_PAIR_SET
+<li> For finding collision pairs on a scene (common space for objects), call \ref gim_aabbset_self_intersections
+<li> For finding collision pairs between two box sets , call \ref gim_aabbset_box_collision
+<li> After using collision routines, you must destroy the pairset with \ref GIM_DESTROY_PAIR_SET
+<li> When the box set is no longer used, you must destroy it by calling \ref gim_aabbset_destroy
+</ul>
+*/
+//! @{
+//! Overlapping pair
+struct GIM_PAIR
+{
+ GUINT32 m_index1;
+ GUINT32 m_index2;
+};
+//typedef struct _GIM_PAIR GIM_PAIR;
+
+//! Box container
+struct GIM_AABB_SET
+{
+ GUINT32 m_count;
+ aabb3f m_global_bound;//!< Global calculated bound of all boxes
+ aabb3f * m_boxes;
+ GUINT32 * m_maxcoords;//!<Upper corners of the boxes, in integer representation
+ GIM_RSORT_TOKEN * m_sorted_mincoords;//!< sorted min coords (lower corners), with their coord value as the m_key and m_value as the box index
+ char m_shared;//!< if m_shared == 0 then the memory is allocated and the set must be destroyed, else the pointers are shared and the set should't be destroyed
+};
+//typedef struct _GIM_AABB_SET GIM_AABB_SET;
+
+//! Function for creating an overlapping pair set
+#define GIM_CREATE_PAIR_SET(dynarray) GIM_DYNARRAY_CREATE(GIM_PAIR,dynarray,G_ARRAY_GROW_SIZE)
+//! Function for destroying an overlapping pair set
+#define GIM_DESTROY_PAIR_SET(dynarray) GIM_DYNARRAY_DESTROY(dynarray)
+
+//! Allocate memory for all aabb set.
+void gim_aabbset_alloc(GIM_AABB_SET * aabbset, GUINT32 count);
+
+//! Destroys the aabb set.
+void gim_aabbset_destroy(GIM_AABB_SET * aabbset);
+
+//! Calcs the global bound only
+/*!
+\pre aabbset must be allocated. And the boxes must be already set.
+*/
+void gim_aabbset_calc_global_bound(GIM_AABB_SET * aabbset);
+
+//! Sorts the boxes for box prunning.
+/*!
+1) find the integer representation of the aabb coords
+2) Sorts the min coords
+3) Calcs the global bound
+\pre aabbset must be allocated. And the boxes must be already set.
+\param aabbset
+\param calc_global_bound If 1 , calcs the global bound
+\post If aabbset->m_sorted_mincoords == 0, then it allocs the sorted coordinates
+*/
+void gim_aabbset_sort(GIM_AABB_SET * aabbset, char calc_global_bound);
+
+//! log(N) Complete box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to the same set.
+/*!
+\pre aabbset must be allocated and sorted, the boxes must be already set.
+\param aabbset Must be sorted. Global bound isn't required
+\param collision_pairs Array of GIM_PAIR elements. Must be initialized before (Reserve size ~ 100)
+*/
+void gim_aabbset_self_intersections_sorted(GIM_AABB_SET * aabbset, GDYNAMIC_ARRAY * collision_pairs);
+
+//! NxN Complete box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to the same set.
+/*!
+\pre aabbset must be allocated, the boxes must be already set.
+\param aabbset Global bound isn't required. Doen't need to be sorted.
+\param collision_pairs Array of GIM_PAIR elements. Must be initialized before (Reserve size ~ 100)
+*/
+void gim_aabbset_self_intersections_brute_force(GIM_AABB_SET * aabbset, GDYNAMIC_ARRAY * collision_pairs);
+
+//! log(N) Bipartite box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to a different set.
+/*!
+\pre aabbset1 and aabbset2 must be allocated and sorted, the boxes must be already set.
+\param aabbset1 Must be sorted, Global bound is required.
+\param aabbset2 Must be sorted, Global bound is required.
+\param collision_pairs Array of GIM_PAIR elements. Must be initialized before (Reserve size ~ 100)
+*/
+void gim_aabbset_bipartite_intersections_sorted(GIM_AABB_SET * aabbset1, GIM_AABB_SET * aabbset2, GDYNAMIC_ARRAY * collision_pairs);
+
+//! NxM Bipartite box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to a different set.
+/*!
+\pre aabbset1 and aabbset2 must be allocated and sorted, the boxes must be already set.
+\param aabbset1 Must be sorted, Global bound is required.
+\param aabbset2 Must be sorted, Global bound is required.
+\param collision_pairs Array of GIM_PAIR elements. Must be initialized before (Reserve size ~ 100)
+*/
+void gim_aabbset_bipartite_intersections_brute_force(GIM_AABB_SET * aabbset1,GIM_AABB_SET * aabbset2, GDYNAMIC_ARRAY * collision_pairs);
+
+
+/*
+ Brute-Force Vs Sorted pruning
+Different approaches must be applied when colliding sets with different number of
+elements. When sets have less of 100 boxes, is often better to apply force brute
+approach instead of sorted methods, because at lowlevel bruteforce routines gives
+better perormance and consumes less resources, due of their simplicity.
+But when sets are larger, the complexiity of bruteforce increases exponencially.
+In the case of large sets, sorted approach is applied. So GIMPACT has the following
+strategies:
+
+On Sorting sets:
+!) When sets have more of 140 boxes, the boxes are sorted by its coded min coord
+and the global box is calculated. But when sets are smaller (less of 140 boxes),
+Is convenient to apply brute force approach.
+
+*******************************************************************************/
+
+//! Constant for apply approaches between brute force and sorted pruning on bipartite queries
+#define GIM_MIN_SORTED_BIPARTITE_PRUNING_BOXES 600
+//! Constant for apply approaches between brute force and sorted pruning for box collision
+#define GIM_MIN_SORTED_PRUNING_BOXES 140
+
+
+//Use these functions for general initialization
+
+//! Initalizes the set. Sort Boxes if needed.
+/*!
+\pre aabbset must be allocated. And the boxes must be already set.
+\post If the set has less of GIM_MIN_SORTED_BIPARTITE_PRUNING_BOXES boxes, only calcs the global box,
+ else it Sorts the entire set( Only applicable for large sets)
+*/
+void gim_aabbset_update(GIM_AABB_SET * aabbset);
+
+///Use these functions for general collision
+
+//! Complete box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to the same set.
+/*!
+This function sorts the set and then it calls to gim_aabbset_self_intersections_brute_force or gim_aabbset_self_intersections_sorted. This is an example of how to use this function:
+\code
+//Create contact list
+GDYNAMIC_ARRAY collision_pairs;
+GIM_CREATE_PAIR_SET(collision_pairs);
+//Do collision
+gim_aabbset_self_intersections(&aabbset,&collision_pairs);
+if(collision_pairs.m_size==0)
+{
+ GIM_DYNARRAY_DESTROY(collision_pairs);//
+ return; //no collisioin
+}
+
+//pair pointer
+GIM_PAIR *pairs = GIM_DYNARRAY_POINTER(GIM_PAIR,collision_pairs);
+GUINT i, ti1,ti2;
+for (i=0;i<collision_pairs.m_size; i++)
+{
+ ti1 = pairs[i].m_index1;
+ ti2 = pairs[i].m_index2;
+ //Do something with the pairs
+ ....
+ ....
+ ...
+
+}
+//Terminate
+GIM_DYNARRAY_DESTROY(dummycontacts);
+GIM_DYNARRAY_DESTROY(collision_pairs);
+\endcode
+\param aabbset Set of boxes. Sorting isn't required.
+\param collision_pairs Array of GIM_PAIR elements. Must be initialized before (Reserve size ~ 100)
+\pre aabbset must be allocated and initialized.
+\post If aabbset->m_count >= GIM_MIN_SORTED_PRUNING_BOXES, then it calls to gim_aabbset_sort and then to gim_aabbset_self_intersections_sorted. Global box won't be calculated.
+*/
+void gim_aabbset_self_intersections(GIM_AABB_SET * aabbset, GDYNAMIC_ARRAY * collision_pairs);
+
+//! Collides two sets. Returns a list of overlapping pairs of boxes, each box of the pair belongs to a different set.
+/*!
+\pre aabbset1 and aabbset2 must be allocated and updated. See gim_aabbset_update.
+\param aabbset1 Must be updated.
+\param aabbset2 Must be updated.
+\param collision_pairs Array of GIM_PAIR elements. Must be initialized before (Reserve size ~ 100)
+*/
+void gim_aabbset_bipartite_intersections(GIM_AABB_SET * aabbset1, GIM_AABB_SET * aabbset2, GDYNAMIC_ARRAY * collision_pairs);
+
+///Function for create Box collision result set
+
+#define GIM_CREATE_BOXQUERY_LIST(dynarray) GIM_DYNARRAY_CREATE(GUINT32,dynarray,G_ARRAY_GROW_SIZE)
+
+//! Finds intersections between a box and a set. Return the colliding boxes of the set
+/*!
+\pre aabbset must be allocated and initialized.
+\param test_aabb Box for collision query
+\param aabbset Set of boxes .Global bound is required.
+\param collided Array of GUINT elements, indices of boxes. Must be initialized before (Reserve size ~ 100)
+*/
+void gim_aabbset_box_collision(aabb3f *test_aabb, GIM_AABB_SET * aabbset, GDYNAMIC_ARRAY * collided);
+
+//! Finds intersections between a box and a set. Return the colliding boxes of the set
+/*!
+\pre aabbset must be allocated and initialized.
+\param vorigin Origin point of ray.
+\param vdir Direction vector of ray.
+\param tmax Max distance param for ray.
+\param aabbset Set of boxes .Global bound is required.
+\param collided Array of GUINT elements, indices of boxes. Must be initialized before (Reserve size ~ 100)
+*/
+void gim_aabbset_ray_collision(vec3f vorigin,vec3f vdir, GREAL tmax, GIM_AABB_SET * aabbset, GDYNAMIC_ARRAY * collided);
+
+
+/*
+For sorting, each box corner must be discretized to a 32 bit integer.
+For this, we take the x and z coordinates from the box corner (a vector vec3f)
+Then convert the (x,z) pair to an integer. For convenience, we choose an error
+constant for converting the coordinates (0.05).
+*******************************************************************************/
+
+/**
+ For fitting the coordinate to an integer, we need to constraint the range of its values. So each coord component (x, z) must lie between 0 and 65536.
+ 20 give us a 0.05 floating point error
+*/
+#define ERROR_AABB 20.0f
+
+/**
+An error of 0.05 allows to make coordinates up to 1638.0f and no less of -1638.0f.
+So the maximum size of a room should be about 3276x3276 . Its dimensions must lie between [-1638,1638.0f]
+*/
+#define MAX_AABB_SIZE 1638.0f
+
+//! Converts a vector coordinate to an integer for box sorting
+/*!
+\param vx X component
+\param vz Z component
+\param uint_key a GUINT
+*/
+#define GIM_CONVERT_VEC3F_GUINT_XZ(vx,vz,uint_key)\
+{\
+ GUINT32 _z = ((GUINT32)(vz*ERROR_AABB))+32768;\
+ uint_key = ((GUINT32)(vx*ERROR_AABB))+32768;\
+ uint_key = (uint_key<<16) + _z;\
+}\
+
+//! Converts a vector coordinate to an integer for box sorting,rounding to the upper int
+/*!
+\param vx X component
+\param vz Z component
+\param uint_key a GUINT
+*/
+#define GIM_CONVERT_VEC3F_GUINT_XZ_UPPER(vx,vz,uint_key)\
+{\
+ GUINT32 _z = ((GUINT32)ceilf(vz*ERROR_AABB))+32768;\
+ uint_key = ((GUINT32)ceilf(vx*ERROR_AABB))+32768;\
+ uint_key = (uint_key<<16) + _z;\
+}\
+
+
+//! Converts a vector coordinate to an integer for box sorting. Secure clamped
+/*!
+\param vx X component
+\param vz Z component
+\param uint_key a GUINT
+*/
+#define GIM_CONVERT_VEC3F_GUINT_XZ_CLAMPED(vx,vz,uint_key)\
+{\
+ GREAL _cx = CLAMP(vx,-MAX_AABB_SIZE,MAX_AABB_SIZE);\
+ GREAL _cz = CLAMP(vz,-MAX_AABB_SIZE,MAX_AABB_SIZE);\
+ GUINT32 _z = ((GUINT32)(_cz*ERROR_AABB))+32768;\
+ uint_key = ((GUINT32)(_cx*ERROR_AABB))+32768;\
+ uint_key = (uint_key<<16) + _z;\
+}\
+
+//! Converts a vector coordinate to an integer for box sorting. Secure clamped, rounded
+/*!
+\param vx X component
+\param vz Z component
+\param uint_key a GUINT
+*/
+#define GIM_CONVERT_VEC3F_GUINT_XZ_UPPER_CLAMPED(vx,vz,uint_key)\
+{\
+ GREAL _cx = CLAMP(vx,-MAX_AABB_SIZE,MAX_AABB_SIZE);\
+ GREAL _cz = CLAMP(vz,-MAX_AABB_SIZE,MAX_AABB_SIZE);\
+ GUINT32 _z = ((GUINT32)ceilf(_cz*ERROR_AABB))+32768;\
+ uint_key = ((GUINT32)ceilf(_cx*ERROR_AABB))+32768;\
+ uint_key = (uint_key<<16) + _z;\
+}\
+
+//! @}
+
+#endif // GIM_BOXPRUNING_H_INCLUDED
diff --git a/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_contact.h b/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_contact.h
new file mode 100644
index 0000000..e7f5b5e
--- /dev/null
+++ b/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_contact.h
@@ -0,0 +1,115 @@
+#ifndef GIM_CONTACT_H_INCLUDED
+#define GIM_CONTACT_H_INCLUDED
+
+/*! \file gim_contact.h
+\author Francisco León
+*/
+/*
+-----------------------------------------------------------------------------
+This source file is part of GIMPACT Library.
+
+For the latest info, see http://gimpact.sourceforge.net/
+
+Copyright (c) 2006 Francisco Leon. C.C. 80087371.
+email: projectileman@yahoo.com
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of EITHER:
+ (1) The GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 2.1 of the License, or (at
+ your option) any later version. The text of the GNU Lesser
+ General Public License is included with this library in the
+ file GIMPACT-LICENSE-LGPL.TXT.
+ (2) The BSD-style license that is included with this library in
+ the file GIMPACT-LICENSE-BSD.TXT.
+
+ This library 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 files
+ GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details.
+
+-----------------------------------------------------------------------------
+*/
+
+
+#include "GIMPACT/gim_geometry.h"
+#include "GIMPACT/gim_radixsort.h"
+
+/*! \defgroup CONTACTS
+\brief
+Functions for managing and sorting contacts resulting from a collision query.
+<ul>
+<li> Contact lists must be create by calling \ref GIM_CREATE_CONTACT_LIST
+<li> After querys, contact lists must be destroy by calling \ref GIM_DYNARRAY_DESTROY
+<li> Contacts can be merge for avoid duplicate results by calling \ref gim_merge_contacts
+</ul>
+
+*/
+//! @{
+/// Structure for collision results
+struct GIM_CONTACT
+{
+ vec3f m_point;
+ vec3f m_normal;
+ GREAL m_depth;//Positive value indicates interpenetration
+ void * m_handle1;
+ void * m_handle2;
+ GUINT32 m_feature1;//Face number
+ GUINT32 m_feature2;//Face number
+};
+//typedef struct _GIM_CONTACT GIM_CONTACT;
+
+#define CONTACT_DIFF_EPSILON 0.00001f
+
+#define GIM_CALC_KEY_CONTACT(pos,hash)\
+{\
+ GINT32 _coords[] = {(GINT32)(pos[0]*1000.0f+1.0f),(GINT32)(pos[1]*1333.0f),(GINT32)(pos[2]*2133.0f+3.0f)};\
+ GUINT32 _hash=0;\
+ GUINT32 *_uitmp = (GUINT32 *)(&_coords[0]);\
+ _hash = *_uitmp;\
+ _uitmp++;\
+ _hash += (*_uitmp)<<4;\
+ _uitmp++;\
+ _hash += (*_uitmp)<<8;\
+ hash = _hash;\
+}\
+
+///Creates a contact list for queries
+#define GIM_CREATE_CONTACT_LIST(contact_array) GIM_DYNARRAY_CREATE(GIM_CONTACT,contact_array,100)
+
+#define GIM_PUSH_CONTACT(contact_array, point, normal, deep,handle1, handle2, feat1, feat2)\
+{\
+ GIM_DYNARRAY_PUSH_EMPTY(GIM_CONTACT,contact_array);\
+ GIM_CONTACT * _last = GIM_DYNARRAY_POINTER_LAST(GIM_CONTACT,contact_array);\
+ VEC_COPY(_last->m_point,point);\
+ VEC_COPY(_last->m_normal,normal);\
+ _last->m_depth = deep;\
+ _last->m_handle1 = handle1;\
+ _last->m_handle2 = handle2;\
+ _last->m_feature1 = feat1;\
+ _last->m_feature2 = feat2;\
+}\
+
+///Receive pointer to contacts
+#define GIM_COPY_CONTACTS(dest_contact, source_contact)\
+{\
+ VEC_COPY(dest_contact->m_point,source_contact->m_point);\
+ VEC_COPY(dest_contact->m_normal,source_contact->m_normal);\
+ dest_contact->m_depth = source_contact->m_depth;\
+ dest_contact->m_handle1 = source_contact->m_handle1;\
+ dest_contact->m_handle2 = source_contact->m_handle2;\
+ dest_contact->m_feature1 = source_contact->m_feature1;\
+ dest_contact->m_feature2 = source_contact->m_feature2;\
+}\
+
+//! Merges duplicate contacts with minimum depth criterion
+void gim_merge_contacts(GDYNAMIC_ARRAY * source_contacts,
+ GDYNAMIC_ARRAY * dest_contacts);
+
+
+//! Merges to an unique contact
+void gim_merge_contacts_unique(GDYNAMIC_ARRAY * source_contacts,
+ GDYNAMIC_ARRAY * dest_contacts);
+
+//! @}
+#endif // GIM_CONTACT_H_INCLUDED
diff --git a/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_geometry.h b/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_geometry.h
new file mode 100644
index 0000000..f2b5ccb
--- /dev/null
+++ b/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_geometry.h
@@ -0,0 +1,1885 @@
+#ifndef GIM_VECTOR_H_INCLUDED
+#define GIM_VECTOR_H_INCLUDED
+
+/*! \file gim_geometry.h
+\author Francisco León
+*/
+/*
+-----------------------------------------------------------------------------
+This source file is part of GIMPACT Library.
+
+For the latest info, see http://gimpact.sourceforge.net/
+
+Copyright (c) 2006 Francisco Leon. C.C. 80087371.
+email: projectileman@yahoo.com
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of EITHER:
+ (1) The GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 2.1 of the License, or (at
+ your option) any later version. The text of the GNU Lesser
+ General Public License is included with this library in the
+ file GIMPACT-LICENSE-LGPL.TXT.
+ (2) The BSD-style license that is included with this library in
+ the file GIMPACT-LICENSE-BSD.TXT.
+
+ This library 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 files
+ GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details.
+
+-----------------------------------------------------------------------------
+*/
+
+
+#include "GIMPACT/gim_math.h"
+
+/*! \defgroup GEOMETRIC_TYPES
+\brief
+Basic types and constants for geometry
+*/
+//! @{
+
+//! Integer vector 2D
+typedef GINT32 vec2i[2];
+//! Integer vector 3D
+typedef GINT32 vec3i[3];
+//! Integer vector 4D
+typedef GINT32 vec4i[4];
+
+//! Float vector 2D
+typedef GREAL vec2f[2];
+//! Float vector 3D
+typedef GREAL vec3f[3];
+//! Float vector 4D
+typedef GREAL vec4f[4];
+
+//! Matrix 2D, row ordered
+typedef GREAL mat2f[2][2];
+//! Matrix 3D, row ordered
+typedef GREAL mat3f[3][3];
+//! Matrix 4D, row ordered
+typedef GREAL mat4f[4][4];
+
+//! Quaternion
+typedef GREAL quatf[4];
+
+//! Axis aligned box
+struct aabb3f{
+ aabb3f() {}
+
+ template<typename tboundfloat>
+ aabb3f(const tboundfloat &_minX, const tboundfloat &_maxX, const tboundfloat &_minY, const tboundfloat &_maxY, const tboundfloat &_minZ, const tboundfloat &_maxZ):
+ minX((GREAL)_minX),
+ maxX((GREAL)_maxX),
+ minY((GREAL)_minY),
+ maxY((GREAL)_maxY),
+ minZ((GREAL)_minZ),
+ maxZ((GREAL)_maxZ)
+ {
+ }
+
+ GREAL minX;
+ GREAL maxX;
+ GREAL minY;
+ GREAL maxY;
+ GREAL minZ;
+ GREAL maxZ;
+};
+//typedef struct _aabb3f aabb3f;
+//! @}
+
+
+/*! \defgroup VECTOR_OPERATIONS
+Operations for vectors : vec2f,vec3f and vec4f
+*/
+//! @{
+
+//! Zero out a 2D vector
+#define VEC_ZERO_2(a) \
+{ \
+ (a)[0] = (a)[1] = 0.0f; \
+}\
+
+
+//! Zero out a 3D vector
+#define VEC_ZERO(a) \
+{ \
+ (a)[0] = (a)[1] = (a)[2] = 0.0f; \
+}\
+
+
+/// Zero out a 4D vector
+#define VEC_ZERO_4(a) \
+{ \
+ (a)[0] = (a)[1] = (a)[2] = (a)[3] = 0.0f; \
+}\
+
+
+/// Vector copy
+#define VEC_COPY_2(b,a) \
+{ \
+ (b)[0] = (a)[0]; \
+ (b)[1] = (a)[1]; \
+}\
+
+
+/// Copy 3D vector
+#define VEC_COPY(b,a) \
+{ \
+ (b)[0] = (a)[0]; \
+ (b)[1] = (a)[1]; \
+ (b)[2] = (a)[2]; \
+}\
+
+
+/// Copy 4D vector
+#define VEC_COPY_4(b,a) \
+{ \
+ (b)[0] = (a)[0]; \
+ (b)[1] = (a)[1]; \
+ (b)[2] = (a)[2]; \
+ (b)[3] = (a)[3]; \
+}\
+
+
+/// Vector difference
+#define VEC_DIFF_2(v21,v2,v1) \
+{ \
+ (v21)[0] = (v2)[0] - (v1)[0]; \
+ (v21)[1] = (v2)[1] - (v1)[1]; \
+}\
+
+
+/// Vector difference
+#define VEC_DIFF(v21,v2,v1) \
+{ \
+ (v21)[0] = (v2)[0] - (v1)[0]; \
+ (v21)[1] = (v2)[1] - (v1)[1]; \
+ (v21)[2] = (v2)[2] - (v1)[2]; \
+}\
+
+
+/// Vector difference
+#define VEC_DIFF_4(v21,v2,v1) \
+{ \
+ (v21)[0] = (v2)[0] - (v1)[0]; \
+ (v21)[1] = (v2)[1] - (v1)[1]; \
+ (v21)[2] = (v2)[2] - (v1)[2]; \
+ (v21)[3] = (v2)[3] - (v1)[3]; \
+}\
+
+
+/// Vector sum
+#define VEC_SUM_2(v21,v2,v1) \
+{ \
+ (v21)[0] = (v2)[0] + (v1)[0]; \
+ (v21)[1] = (v2)[1] + (v1)[1]; \
+}\
+
+
+/// Vector sum
+#define VEC_SUM(v21,v2,v1) \
+{ \
+ (v21)[0] = (v2)[0] + (v1)[0]; \
+ (v21)[1] = (v2)[1] + (v1)[1]; \
+ (v21)[2] = (v2)[2] + (v1)[2]; \
+}\
+
+
+/// Vector sum
+#define VEC_SUM_4(v21,v2,v1) \
+{ \
+ (v21)[0] = (v2)[0] + (v1)[0]; \
+ (v21)[1] = (v2)[1] + (v1)[1]; \
+ (v21)[2] = (v2)[2] + (v1)[2]; \
+ (v21)[3] = (v2)[3] + (v1)[3]; \
+}\
+
+
+/// scalar times vector
+#define VEC_SCALE_2(c,a,b) \
+{ \
+ (c)[0] = (a)*(b)[0]; \
+ (c)[1] = (a)*(b)[1]; \
+}\
+
+
+/// scalar times vector
+#define VEC_SCALE(c,a,b) \
+{ \
+ (c)[0] = (a)*(b)[0]; \
+ (c)[1] = (a)*(b)[1]; \
+ (c)[2] = (a)*(b)[2]; \
+}\
+
+
+/// scalar times vector
+#define VEC_SCALE_4(c,a,b) \
+{ \
+ (c)[0] = (a)*(b)[0]; \
+ (c)[1] = (a)*(b)[1]; \
+ (c)[2] = (a)*(b)[2]; \
+ (c)[3] = (a)*(b)[3]; \
+}\
+
+
+/// accumulate scaled vector
+#define VEC_ACCUM_2(c,a,b) \
+{ \
+ (c)[0] += (a)*(b)[0]; \
+ (c)[1] += (a)*(b)[1]; \
+}\
+
+
+/// accumulate scaled vector
+#define VEC_ACCUM(c,a,b) \
+{ \
+ (c)[0] += (a)*(b)[0]; \
+ (c)[1] += (a)*(b)[1]; \
+ (c)[2] += (a)*(b)[2]; \
+}\
+
+
+/// accumulate scaled vector
+#define VEC_ACCUM_4(c,a,b) \
+{ \
+ (c)[0] += (a)*(b)[0]; \
+ (c)[1] += (a)*(b)[1]; \
+ (c)[2] += (a)*(b)[2]; \
+ (c)[3] += (a)*(b)[3]; \
+}\
+
+
+/// Vector dot product
+#define VEC_DOT_2(a,b) ((a)[0]*(b)[0] + (a)[1]*(b)[1])
+
+
+/// Vector dot product
+#define VEC_DOT(a,b) ((a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2])
+
+/// Vector dot product
+#define VEC_DOT_4(a,b) ((a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2] + (a)[3]*(b)[3])
+
+/// vector impact parameter (squared)
+#define VEC_IMPACT_SQ(bsq,direction,position) {\
+ GREAL _llel_ = VEC_DOT(direction, position);\
+ bsq = VEC_DOT(position, position) - _llel_*_llel_;\
+}\
+
+
+/// vector impact parameter
+#define VEC_IMPACT(bsq,direction,position) {\
+ VEC_IMPACT_SQ(bsq,direction,position); \
+ GIM_SQRT(bsq,bsq); \
+}\
+
+/// Vector length
+#define VEC_LENGTH_2(a,l)\
+{\
+ GREAL _pp = VEC_DOT_2(a,a);\
+ GIM_SQRT(_pp,l);\
+}\
+
+
+/// Vector length
+#define VEC_LENGTH(a,l)\
+{\
+ GREAL _pp = VEC_DOT(a,a);\
+ GIM_SQRT(_pp,l);\
+}\
+
+
+/// Vector length
+#define VEC_LENGTH_4(a,l)\
+{\
+ GREAL _pp = VEC_DOT_4(a,a);\
+ GIM_SQRT(_pp,l);\
+}\
+
+/// Vector inv length
+#define VEC_INV_LENGTH_2(a,l)\
+{\
+ GREAL _pp = VEC_DOT_2(a,a);\
+ GIM_INV_SQRT(_pp,l);\
+}\
+
+
+/// Vector inv length
+#define VEC_INV_LENGTH(a,l)\
+{\
+ GREAL _pp = VEC_DOT(a,a);\
+ GIM_INV_SQRT(_pp,l);\
+}\
+
+
+/// Vector inv length
+#define VEC_INV_LENGTH_4(a,l)\
+{\
+ GREAL _pp = VEC_DOT_4(a,a);\
+ GIM_INV_SQRT(_pp,l);\
+}\
+
+
+
+/// distance between two points
+#define VEC_DISTANCE(_len,_va,_vb) {\
+ vec3f _tmp_; \
+ VEC_DIFF(_tmp_, _vb, _va); \
+ VEC_LENGTH(_tmp_,_len); \
+}\
+
+
+/// Vector length
+#define VEC_CONJUGATE_LENGTH(a,l)\
+{\
+ GREAL _pp = 1.0 - a[0]*a[0] - a[1]*a[1] - a[2]*a[2];\
+ GIM_SQRT(_pp,l);\
+}\
+
+
+/// Vector length
+#define VEC_NORMALIZE(a) { \
+ GREAL len;\
+ VEC_INV_LENGTH(a,len); \
+ if(len<G_REAL_INFINITY)\
+ {\
+ a[0] *= len; \
+ a[1] *= len; \
+ a[2] *= len; \
+ } \
+}\
+
+/// Set Vector size
+#define VEC_RENORMALIZE(a,newlen) { \
+ GREAL len;\
+ VEC_INV_LENGTH(a,len); \
+ if(len<G_REAL_INFINITY)\
+ {\
+ len *= newlen;\
+ a[0] *= len; \
+ a[1] *= len; \
+ a[2] *= len; \
+ } \
+}\
+
+/// Vector cross
+#define VEC_CROSS(c,a,b) \
+{ \
+ c[0] = (a)[1] * (b)[2] - (a)[2] * (b)[1]; \
+ c[1] = (a)[2] * (b)[0] - (a)[0] * (b)[2]; \
+ c[2] = (a)[0] * (b)[1] - (a)[1] * (b)[0]; \
+}\
+
+
+/*! Vector perp -- assumes that n is of unit length
+ * accepts vector v, subtracts out any component parallel to n */
+#define VEC_PERPENDICULAR(vp,v,n) \
+{ \
+ GREAL dot = VEC_DOT(v, n); \
+ vp[0] = (v)[0] - dot*(n)[0]; \
+ vp[1] = (v)[1] - dot*(n)[1]; \
+ vp[2] = (v)[2] - dot*(n)[2]; \
+}\
+
+
+/*! Vector parallel -- assumes that n is of unit length */
+#define VEC_PARALLEL(vp,v,n) \
+{ \
+ GREAL dot = VEC_DOT(v, n); \
+ vp[0] = (dot) * (n)[0]; \
+ vp[1] = (dot) * (n)[1]; \
+ vp[2] = (dot) * (n)[2]; \
+}\
+
+/*! Same as Vector parallel -- n can have any length
+ * accepts vector v, subtracts out any component perpendicular to n */
+#define VEC_PROJECT(vp,v,n) \
+{ \
+ GREAL scalar = VEC_DOT(v, n); \
+ scalar/= VEC_DOT(n, n); \
+ vp[0] = (scalar) * (n)[0]; \
+ vp[1] = (scalar) * (n)[1]; \
+ vp[2] = (scalar) * (n)[2]; \
+}\
+
+
+/*! accepts vector v*/
+#define VEC_UNPROJECT(vp,v,n) \
+{ \
+ GREAL scalar = VEC_DOT(v, n); \
+ scalar = VEC_DOT(n, n)/scalar; \
+ vp[0] = (scalar) * (n)[0]; \
+ vp[1] = (scalar) * (n)[1]; \
+ vp[2] = (scalar) * (n)[2]; \
+}\
+
+
+/*! Vector reflection -- assumes n is of unit length
+ Takes vector v, reflects it against reflector n, and returns vr */
+#define VEC_REFLECT(vr,v,n) \
+{ \
+ GREAL dot = VEC_DOT(v, n); \
+ vr[0] = (v)[0] - 2.0 * (dot) * (n)[0]; \
+ vr[1] = (v)[1] - 2.0 * (dot) * (n)[1]; \
+ vr[2] = (v)[2] - 2.0 * (dot) * (n)[2]; \
+}\
+
+
+/*! Vector blending
+Takes two vectors a, b, blends them together with two scalars */
+#define VEC_BLEND_AB(vr,sa,a,sb,b) \
+{ \
+ vr[0] = (sa) * (a)[0] + (sb) * (b)[0]; \
+ vr[1] = (sa) * (a)[1] + (sb) * (b)[1]; \
+ vr[2] = (sa) * (a)[2] + (sb) * (b)[2]; \
+}\
+
+/*! Vector blending
+Takes two vectors a, b, blends them together with s <=1 */
+#define VEC_BLEND(vr,a,b,s) VEC_BLEND_AB(vr,1-s,a,sb,s)
+
+#define VEC_SET3(a,b,op,c) a[0]=b[0] op c[0]; a[1]=b[1] op c[1]; a[2]=b[2] op c[2];
+//! @}
+
+
+/*! \defgroup MATRIX_OPERATIONS
+Operations for matrices : mat2f, mat3f and mat4f
+*/
+//! @{
+
+/// initialize matrix
+#define IDENTIFY_MATRIX_3X3(m) \
+{ \
+ m[0][0] = 1.0; \
+ m[0][1] = 0.0; \
+ m[0][2] = 0.0; \
+ \
+ m[1][0] = 0.0; \
+ m[1][1] = 1.0; \
+ m[1][2] = 0.0; \
+ \
+ m[2][0] = 0.0; \
+ m[2][1] = 0.0; \
+ m[2][2] = 1.0; \
+}\
+
+/*! initialize matrix */
+#define IDENTIFY_MATRIX_4X4(m) \
+{ \
+ m[0][0] = 1.0; \
+ m[0][1] = 0.0; \
+ m[0][2] = 0.0; \
+ m[0][3] = 0.0; \
+ \
+ m[1][0] = 0.0; \
+ m[1][1] = 1.0; \
+ m[1][2] = 0.0; \
+ m[1][3] = 0.0; \
+ \
+ m[2][0] = 0.0; \
+ m[2][1] = 0.0; \
+ m[2][2] = 1.0; \
+ m[2][3] = 0.0; \
+ \
+ m[3][0] = 0.0; \
+ m[3][1] = 0.0; \
+ m[3][2] = 0.0; \
+ m[3][3] = 1.0; \
+}\
+
+/*! initialize matrix */
+#define ZERO_MATRIX_4X4(m) \
+{ \
+ m[0][0] = 0.0; \
+ m[0][1] = 0.0; \
+ m[0][2] = 0.0; \
+ m[0][3] = 0.0; \
+ \
+ m[1][0] = 0.0; \
+ m[1][1] = 0.0; \
+ m[1][2] = 0.0; \
+ m[1][3] = 0.0; \
+ \
+ m[2][0] = 0.0; \
+ m[2][1] = 0.0; \
+ m[2][2] = 0.0; \
+ m[2][3] = 0.0; \
+ \
+ m[3][0] = 0.0; \
+ m[3][1] = 0.0; \
+ m[3][2] = 0.0; \
+ m[3][3] = 0.0; \
+}\
+
+/*! matrix rotation X */
+#define ROTX_CS(m,cosine,sine) \
+{ \
+ /* rotation about the x-axis */ \
+ \
+ m[0][0] = 1.0; \
+ m[0][1] = 0.0; \
+ m[0][2] = 0.0; \
+ m[0][3] = 0.0; \
+ \
+ m[1][0] = 0.0; \
+ m[1][1] = (cosine); \
+ m[1][2] = (sine); \
+ m[1][3] = 0.0; \
+ \
+ m[2][0] = 0.0; \
+ m[2][1] = -(sine); \
+ m[2][2] = (cosine); \
+ m[2][3] = 0.0; \
+ \
+ m[3][0] = 0.0; \
+ m[3][1] = 0.0; \
+ m[3][2] = 0.0; \
+ m[3][3] = 1.0; \
+}\
+
+/*! matrix rotation Y */
+#define ROTY_CS(m,cosine,sine) \
+{ \
+ /* rotation about the y-axis */ \
+ \
+ m[0][0] = (cosine); \
+ m[0][1] = 0.0; \
+ m[0][2] = -(sine); \
+ m[0][3] = 0.0; \
+ \
+ m[1][0] = 0.0; \
+ m[1][1] = 1.0; \
+ m[1][2] = 0.0; \
+ m[1][3] = 0.0; \
+ \
+ m[2][0] = (sine); \
+ m[2][1] = 0.0; \
+ m[2][2] = (cosine); \
+ m[2][3] = 0.0; \
+ \
+ m[3][0] = 0.0; \
+ m[3][1] = 0.0; \
+ m[3][2] = 0.0; \
+ m[3][3] = 1.0; \
+}\
+
+/*! matrix rotation Z */
+#define ROTZ_CS(m,cosine,sine) \
+{ \
+ /* rotation about the z-axis */ \
+ \
+ m[0][0] = (cosine); \
+ m[0][1] = (sine); \
+ m[0][2] = 0.0; \
+ m[0][3] = 0.0; \
+ \
+ m[1][0] = -(sine); \
+ m[1][1] = (cosine); \
+ m[1][2] = 0.0; \
+ m[1][3] = 0.0; \
+ \
+ m[2][0] = 0.0; \
+ m[2][1] = 0.0; \
+ m[2][2] = 1.0; \
+ m[2][3] = 0.0; \
+ \
+ m[3][0] = 0.0; \
+ m[3][1] = 0.0; \
+ m[3][2] = 0.0; \
+ m[3][3] = 1.0; \
+}\
+
+/*! matrix copy */
+#define COPY_MATRIX_2X2(b,a) \
+{ \
+ b[0][0] = a[0][0]; \
+ b[0][1] = a[0][1]; \
+ \
+ b[1][0] = a[1][0]; \
+ b[1][1] = a[1][1]; \
+ \
+}\
+
+
+/*! matrix copy */
+#define COPY_MATRIX_2X3(b,a) \
+{ \
+ b[0][0] = a[0][0]; \
+ b[0][1] = a[0][1]; \
+ b[0][2] = a[0][2]; \
+ \
+ b[1][0] = a[1][0]; \
+ b[1][1] = a[1][1]; \
+ b[1][2] = a[1][2]; \
+}\
+
+
+/*! matrix copy */
+#define COPY_MATRIX_3X3(b,a) \
+{ \
+ b[0][0] = a[0][0]; \
+ b[0][1] = a[0][1]; \
+ b[0][2] = a[0][2]; \
+ \
+ b[1][0] = a[1][0]; \
+ b[1][1] = a[1][1]; \
+ b[1][2] = a[1][2]; \
+ \
+ b[2][0] = a[2][0]; \
+ b[2][1] = a[2][1]; \
+ b[2][2] = a[2][2]; \
+}\
+
+
+/*! matrix copy */
+#define COPY_MATRIX_4X4(b,a) \
+{ \
+ b[0][0] = a[0][0]; \
+ b[0][1] = a[0][1]; \
+ b[0][2] = a[0][2]; \
+ b[0][3] = a[0][3]; \
+ \
+ b[1][0] = a[1][0]; \
+ b[1][1] = a[1][1]; \
+ b[1][2] = a[1][2]; \
+ b[1][3] = a[1][3]; \
+ \
+ b[2][0] = a[2][0]; \
+ b[2][1] = a[2][1]; \
+ b[2][2] = a[2][2]; \
+ b[2][3] = a[2][3]; \
+ \
+ b[3][0] = a[3][0]; \
+ b[3][1] = a[3][1]; \
+ b[3][2] = a[3][2]; \
+ b[3][3] = a[3][3]; \
+}\
+
+
+/*! matrix transpose */
+#define TRANSPOSE_MATRIX_2X2(b,a) \
+{ \
+ b[0][0] = a[0][0]; \
+ b[0][1] = a[1][0]; \
+ \
+ b[1][0] = a[0][1]; \
+ b[1][1] = a[1][1]; \
+}\
+
+
+/*! matrix transpose */
+#define TRANSPOSE_MATRIX_3X3(b,a) \
+{ \
+ b[0][0] = a[0][0]; \
+ b[0][1] = a[1][0]; \
+ b[0][2] = a[2][0]; \
+ \
+ b[1][0] = a[0][1]; \
+ b[1][1] = a[1][1]; \
+ b[1][2] = a[2][1]; \
+ \
+ b[2][0] = a[0][2]; \
+ b[2][1] = a[1][2]; \
+ b[2][2] = a[2][2]; \
+}\
+
+
+/*! matrix transpose */
+#define TRANSPOSE_MATRIX_4X4(b,a) \
+{ \
+ b[0][0] = a[0][0]; \
+ b[0][1] = a[1][0]; \
+ b[0][2] = a[2][0]; \
+ b[0][3] = a[3][0]; \
+ \
+ b[1][0] = a[0][1]; \
+ b[1][1] = a[1][1]; \
+ b[1][2] = a[2][1]; \
+ b[1][3] = a[3][1]; \
+ \
+ b[2][0] = a[0][2]; \
+ b[2][1] = a[1][2]; \
+ b[2][2] = a[2][2]; \
+ b[2][3] = a[3][2]; \
+ \
+ b[3][0] = a[0][3]; \
+ b[3][1] = a[1][3]; \
+ b[3][2] = a[2][3]; \
+ b[3][3] = a[3][3]; \
+}\
+
+
+/*! multiply matrix by scalar */
+#define SCALE_MATRIX_2X2(b,s,a) \
+{ \
+ b[0][0] = (s) * a[0][0]; \
+ b[0][1] = (s) * a[0][1]; \
+ \
+ b[1][0] = (s) * a[1][0]; \
+ b[1][1] = (s) * a[1][1]; \
+}\
+
+
+/*! multiply matrix by scalar */
+#define SCALE_MATRIX_3X3(b,s,a) \
+{ \
+ b[0][0] = (s) * a[0][0]; \
+ b[0][1] = (s) * a[0][1]; \
+ b[0][2] = (s) * a[0][2]; \
+ \
+ b[1][0] = (s) * a[1][0]; \
+ b[1][1] = (s) * a[1][1]; \
+ b[1][2] = (s) * a[1][2]; \
+ \
+ b[2][0] = (s) * a[2][0]; \
+ b[2][1] = (s) * a[2][1]; \
+ b[2][2] = (s) * a[2][2]; \
+}\
+
+
+/*! multiply matrix by scalar */
+#define SCALE_MATRIX_4X4(b,s,a) \
+{ \
+ b[0][0] = (s) * a[0][0]; \
+ b[0][1] = (s) * a[0][1]; \
+ b[0][2] = (s) * a[0][2]; \
+ b[0][3] = (s) * a[0][3]; \
+ \
+ b[1][0] = (s) * a[1][0]; \
+ b[1][1] = (s) * a[1][1]; \
+ b[1][2] = (s) * a[1][2]; \
+ b[1][3] = (s) * a[1][3]; \
+ \
+ b[2][0] = (s) * a[2][0]; \
+ b[2][1] = (s) * a[2][1]; \
+ b[2][2] = (s) * a[2][2]; \
+ b[2][3] = (s) * a[2][3]; \
+ \
+ b[3][0] = s * a[3][0]; \
+ b[3][1] = s * a[3][1]; \
+ b[3][2] = s * a[3][2]; \
+ b[3][3] = s * a[3][3]; \
+}\
+
+
+/*! multiply matrix by scalar */
+#define ACCUM_SCALE_MATRIX_2X2(b,s,a) \
+{ \
+ b[0][0] += (s) * a[0][0]; \
+ b[0][1] += (s) * a[0][1]; \
+ \
+ b[1][0] += (s) * a[1][0]; \
+ b[1][1] += (s) * a[1][1]; \
+}\
+
+
+/*! multiply matrix by scalar */
+#define ACCUM_SCALE_MATRIX_3X3(b,s,a) \
+{ \
+ b[0][0] += (s) * a[0][0]; \
+ b[0][1] += (s) * a[0][1]; \
+ b[0][2] += (s) * a[0][2]; \
+ \
+ b[1][0] += (s) * a[1][0]; \
+ b[1][1] += (s) * a[1][1]; \
+ b[1][2] += (s) * a[1][2]; \
+ \
+ b[2][0] += (s) * a[2][0]; \
+ b[2][1] += (s) * a[2][1]; \
+ b[2][2] += (s) * a[2][2]; \
+}\
+
+
+/*! multiply matrix by scalar */
+#define ACCUM_SCALE_MATRIX_4X4(b,s,a) \
+{ \
+ b[0][0] += (s) * a[0][0]; \
+ b[0][1] += (s) * a[0][1]; \
+ b[0][2] += (s) * a[0][2]; \
+ b[0][3] += (s) * a[0][3]; \
+ \
+ b[1][0] += (s) * a[1][0]; \
+ b[1][1] += (s) * a[1][1]; \
+ b[1][2] += (s) * a[1][2]; \
+ b[1][3] += (s) * a[1][3]; \
+ \
+ b[2][0] += (s) * a[2][0]; \
+ b[2][1] += (s) * a[2][1]; \
+ b[2][2] += (s) * a[2][2]; \
+ b[2][3] += (s) * a[2][3]; \
+ \
+ b[3][0] += (s) * a[3][0]; \
+ b[3][1] += (s) * a[3][1]; \
+ b[3][2] += (s) * a[3][2]; \
+ b[3][3] += (s) * a[3][3]; \
+}\
+
+/*! matrix product */
+/*! c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/
+#define MATRIX_PRODUCT_2X2(c,a,b) \
+{ \
+ c[0][0] = a[0][0]*b[0][0]+a[0][1]*b[1][0]; \
+ c[0][1] = a[0][0]*b[0][1]+a[0][1]*b[1][1]; \
+ \
+ c[1][0] = a[1][0]*b[0][0]+a[1][1]*b[1][0]; \
+ c[1][1] = a[1][0]*b[0][1]+a[1][1]*b[1][1]; \
+ \
+}\
+
+/*! matrix product */
+/*! c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/
+#define MATRIX_PRODUCT_3X3(c,a,b) \
+{ \
+ c[0][0] = a[0][0]*b[0][0]+a[0][1]*b[1][0]+a[0][2]*b[2][0]; \
+ c[0][1] = a[0][0]*b[0][1]+a[0][1]*b[1][1]+a[0][2]*b[2][1]; \
+ c[0][2] = a[0][0]*b[0][2]+a[0][1]*b[1][2]+a[0][2]*b[2][2]; \
+ \
+ c[1][0] = a[1][0]*b[0][0]+a[1][1]*b[1][0]+a[1][2]*b[2][0]; \
+ c[1][1] = a[1][0]*b[0][1]+a[1][1]*b[1][1]+a[1][2]*b[2][1]; \
+ c[1][2] = a[1][0]*b[0][2]+a[1][1]*b[1][2]+a[1][2]*b[2][2]; \
+ \
+ c[2][0] = a[2][0]*b[0][0]+a[2][1]*b[1][0]+a[2][2]*b[2][0]; \
+ c[2][1] = a[2][0]*b[0][1]+a[2][1]*b[1][1]+a[2][2]*b[2][1]; \
+ c[2][2] = a[2][0]*b[0][2]+a[2][1]*b[1][2]+a[2][2]*b[2][2]; \
+}\
+
+
+/*! matrix product */
+/*! c[x][y] = a[x][0]*b[0][y]+a[x][1]*b[1][y]+a[x][2]*b[2][y]+a[x][3]*b[3][y];*/
+#define MATRIX_PRODUCT_4X4(c,a,b) \
+{ \
+ c[0][0] = a[0][0]*b[0][0]+a[0][1]*b[1][0]+a[0][2]*b[2][0]+a[0][3]*b[3][0];\
+ c[0][1] = a[0][0]*b[0][1]+a[0][1]*b[1][1]+a[0][2]*b[2][1]+a[0][3]*b[3][1];\
+ c[0][2] = a[0][0]*b[0][2]+a[0][1]*b[1][2]+a[0][2]*b[2][2]+a[0][3]*b[3][2];\
+ c[0][3] = a[0][0]*b[0][3]+a[0][1]*b[1][3]+a[0][2]*b[2][3]+a[0][3]*b[3][3];\
+ \
+ c[1][0] = a[1][0]*b[0][0]+a[1][1]*b[1][0]+a[1][2]*b[2][0]+a[1][3]*b[3][0];\
+ c[1][1] = a[1][0]*b[0][1]+a[1][1]*b[1][1]+a[1][2]*b[2][1]+a[1][3]*b[3][1];\
+ c[1][2] = a[1][0]*b[0][2]+a[1][1]*b[1][2]+a[1][2]*b[2][2]+a[1][3]*b[3][2];\
+ c[1][3] = a[1][0]*b[0][3]+a[1][1]*b[1][3]+a[1][2]*b[2][3]+a[1][3]*b[3][3];\
+ \
+ c[2][0] = a[2][0]*b[0][0]+a[2][1]*b[1][0]+a[2][2]*b[2][0]+a[2][3]*b[3][0];\
+ c[2][1] = a[2][0]*b[0][1]+a[2][1]*b[1][1]+a[2][2]*b[2][1]+a[2][3]*b[3][1];\
+ c[2][2] = a[2][0]*b[0][2]+a[2][1]*b[1][2]+a[2][2]*b[2][2]+a[2][3]*b[3][2];\
+ c[2][3] = a[2][0]*b[0][3]+a[2][1]*b[1][3]+a[2][2]*b[2][3]+a[2][3]*b[3][3];\
+ \
+ c[3][0] = a[3][0]*b[0][0]+a[3][1]*b[1][0]+a[3][2]*b[2][0]+a[3][3]*b[3][0];\
+ c[3][1] = a[3][0]*b[0][1]+a[3][1]*b[1][1]+a[3][2]*b[2][1]+a[3][3]*b[3][1];\
+ c[3][2] = a[3][0]*b[0][2]+a[3][1]*b[1][2]+a[3][2]*b[2][2]+a[3][3]*b[3][2];\
+ c[3][3] = a[3][0]*b[0][3]+a[3][1]*b[1][3]+a[3][2]*b[2][3]+a[3][3]*b[3][3];\
+}\
+
+
+/*! matrix times vector */
+#define MAT_DOT_VEC_2X2(p,m,v) \
+{ \
+ p[0] = m[0][0]*v[0] + m[0][1]*v[1]; \
+ p[1] = m[1][0]*v[0] + m[1][1]*v[1]; \
+}\
+
+
+/*! matrix times vector */
+#define MAT_DOT_VEC_3X3(p,m,v) \
+{ \
+ p[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]*v[2]; \
+ p[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]*v[2]; \
+ p[2] = m[2][0]*v[0] + m[2][1]*v[1] + m[2][2]*v[2]; \
+}\
+
+
+/*! matrix times vector
+v is a vec4f
+*/
+#define MAT_DOT_VEC_4X4(p,m,v) \
+{ \
+ p[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]*v[2] + m[0][3]*v[3]; \
+ p[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]*v[2] + m[1][3]*v[3]; \
+ p[2] = m[2][0]*v[0] + m[2][1]*v[1] + m[2][2]*v[2] + m[2][3]*v[3]; \
+ p[3] = m[3][0]*v[0] + m[3][1]*v[1] + m[3][2]*v[2] + m[3][3]*v[3]; \
+}\
+
+/*! matrix times vector
+v is a vec3f
+and m is a mat4f<br>
+Last column is added as the position
+*/
+#define MAT_DOT_VEC_3X4(p,m,v) \
+{ \
+ p[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]*v[2] + m[0][3]; \
+ p[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]*v[2] + m[1][3]; \
+ p[2] = m[2][0]*v[0] + m[2][1]*v[1] + m[2][2]*v[2] + m[2][3]; \
+}\
+
+/*! vector transpose times matrix */
+/*! p[j] = v[0]*m[0][j] + v[1]*m[1][j] + v[2]*m[2][j]; */
+#define VEC_DOT_MAT_3X3(p,v,m) \
+{ \
+ p[0] = v[0]*m[0][0] + v[1]*m[1][0] + v[2]*m[2][0]; \
+ p[1] = v[0]*m[0][1] + v[1]*m[1][1] + v[2]*m[2][1]; \
+ p[2] = v[0]*m[0][2] + v[1]*m[1][2] + v[2]*m[2][2]; \
+}\
+
+
+/*! affine matrix times vector */
+/** The matrix is assumed to be an affine matrix, with last two
+ * entries representing a translation */
+#define MAT_DOT_VEC_2X3(p,m,v) \
+{ \
+ p[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]; \
+ p[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]; \
+}\
+
+
+/** inverse transpose of matrix times vector
+ *
+ * This macro computes inverse transpose of matrix m,
+ * and multiplies vector v into it, to yeild vector p
+ *
+ * DANGER !!! Do Not use this on normal vectors!!!
+ * It will leave normals the wrong length !!!
+ * See macro below for use on normals.
+ */
+#define INV_TRANSP_MAT_DOT_VEC_2X2(p,m,v) \
+{ \
+ GREAL det; \
+ \
+ det = m[0][0]*m[1][1] - m[0][1]*m[1][0]; \
+ p[0] = m[1][1]*v[0] - m[1][0]*v[1]; \
+ p[1] = - m[0][1]*v[0] + m[0][0]*v[1]; \
+ \
+ /* if matrix not singular, and not orthonormal, then renormalize */ \
+ if ((det!=1.0f) && (det != 0.0f)) { \
+ det = 1.0f / det; \
+ p[0] *= det; \
+ p[1] *= det; \
+ } \
+}\
+
+
+/** transform normal vector by inverse transpose of matrix
+ * and then renormalize the vector
+ *
+ * This macro computes inverse transpose of matrix m,
+ * and multiplies vector v into it, to yeild vector p
+ * Vector p is then normalized.
+ */
+#define NORM_XFORM_2X2(p,m,v) \
+{ \
+ double len; \
+ \
+ /* do nothing if off-diagonals are zero and diagonals are \
+ * equal */ \
+ if ((m[0][1] != 0.0) || (m[1][0] != 0.0) || (m[0][0] != m[1][1])) { \
+ p[0] = m[1][1]*v[0] - m[1][0]*v[1]; \
+ p[1] = - m[0][1]*v[0] + m[0][0]*v[1]; \
+ \
+ len = p[0]*p[0] + p[1]*p[1]; \
+ GIM_INV_SQRT(len,len); \
+ p[0] *= len; \
+ p[1] *= len; \
+ } else { \
+ VEC_COPY_2 (p, v); \
+ } \
+}\
+
+
+/** outer product of vector times vector transpose
+ *
+ * The outer product of vector v and vector transpose t yeilds
+ * dyadic matrix m.
+ */
+#define OUTER_PRODUCT_2X2(m,v,t) \
+{ \
+ m[0][0] = v[0] * t[0]; \
+ m[0][1] = v[0] * t[1]; \
+ \
+ m[1][0] = v[1] * t[0]; \
+ m[1][1] = v[1] * t[1]; \
+}\
+
+
+/** outer product of vector times vector transpose
+ *
+ * The outer product of vector v and vector transpose t yeilds
+ * dyadic matrix m.
+ */
+#define OUTER_PRODUCT_3X3(m,v,t) \
+{ \
+ m[0][0] = v[0] * t[0]; \
+ m[0][1] = v[0] * t[1]; \
+ m[0][2] = v[0] * t[2]; \
+ \
+ m[1][0] = v[1] * t[0]; \
+ m[1][1] = v[1] * t[1]; \
+ m[1][2] = v[1] * t[2]; \
+ \
+ m[2][0] = v[2] * t[0]; \
+ m[2][1] = v[2] * t[1]; \
+ m[2][2] = v[2] * t[2]; \
+}\
+
+
+/** outer product of vector times vector transpose
+ *
+ * The outer product of vector v and vector transpose t yeilds
+ * dyadic matrix m.
+ */
+#define OUTER_PRODUCT_4X4(m,v,t) \
+{ \
+ m[0][0] = v[0] * t[0]; \
+ m[0][1] = v[0] * t[1]; \
+ m[0][2] = v[0] * t[2]; \
+ m[0][3] = v[0] * t[3]; \
+ \
+ m[1][0] = v[1] * t[0]; \
+ m[1][1] = v[1] * t[1]; \
+ m[1][2] = v[1] * t[2]; \
+ m[1][3] = v[1] * t[3]; \
+ \
+ m[2][0] = v[2] * t[0]; \
+ m[2][1] = v[2] * t[1]; \
+ m[2][2] = v[2] * t[2]; \
+ m[2][3] = v[2] * t[3]; \
+ \
+ m[3][0] = v[3] * t[0]; \
+ m[3][1] = v[3] * t[1]; \
+ m[3][2] = v[3] * t[2]; \
+ m[3][3] = v[3] * t[3]; \
+}\
+
+
+/** outer product of vector times vector transpose
+ *
+ * The outer product of vector v and vector transpose t yeilds
+ * dyadic matrix m.
+ */
+#define ACCUM_OUTER_PRODUCT_2X2(m,v,t) \
+{ \
+ m[0][0] += v[0] * t[0]; \
+ m[0][1] += v[0] * t[1]; \
+ \
+ m[1][0] += v[1] * t[0]; \
+ m[1][1] += v[1] * t[1]; \
+}\
+
+
+/** outer product of vector times vector transpose
+ *
+ * The outer product of vector v and vector transpose t yeilds
+ * dyadic matrix m.
+ */
+#define ACCUM_OUTER_PRODUCT_3X3(m,v,t) \
+{ \
+ m[0][0] += v[0] * t[0]; \
+ m[0][1] += v[0] * t[1]; \
+ m[0][2] += v[0] * t[2]; \
+ \
+ m[1][0] += v[1] * t[0]; \
+ m[1][1] += v[1] * t[1]; \
+ m[1][2] += v[1] * t[2]; \
+ \
+ m[2][0] += v[2] * t[0]; \
+ m[2][1] += v[2] * t[1]; \
+ m[2][2] += v[2] * t[2]; \
+}\
+
+
+/** outer product of vector times vector transpose
+ *
+ * The outer product of vector v and vector transpose t yeilds
+ * dyadic matrix m.
+ */
+#define ACCUM_OUTER_PRODUCT_4X4(m,v,t) \
+{ \
+ m[0][0] += v[0] * t[0]; \
+ m[0][1] += v[0] * t[1]; \
+ m[0][2] += v[0] * t[2]; \
+ m[0][3] += v[0] * t[3]; \
+ \
+ m[1][0] += v[1] * t[0]; \
+ m[1][1] += v[1] * t[1]; \
+ m[1][2] += v[1] * t[2]; \
+ m[1][3] += v[1] * t[3]; \
+ \
+ m[2][0] += v[2] * t[0]; \
+ m[2][1] += v[2] * t[1]; \
+ m[2][2] += v[2] * t[2]; \
+ m[2][3] += v[2] * t[3]; \
+ \
+ m[3][0] += v[3] * t[0]; \
+ m[3][1] += v[3] * t[1]; \
+ m[3][2] += v[3] * t[2]; \
+ m[3][3] += v[3] * t[3]; \
+}\
+
+
+/** determinant of matrix
+ *
+ * Computes determinant of matrix m, returning d
+ */
+#define DETERMINANT_2X2(d,m) \
+{ \
+ d = m[0][0] * m[1][1] - m[0][1] * m[1][0]; \
+}\
+
+
+/** determinant of matrix
+ *
+ * Computes determinant of matrix m, returning d
+ */
+#define DETERMINANT_3X3(d,m) \
+{ \
+ d = m[0][0] * (m[1][1]*m[2][2] - m[1][2] * m[2][1]); \
+ d -= m[0][1] * (m[1][0]*m[2][2] - m[1][2] * m[2][0]); \
+ d += m[0][2] * (m[1][0]*m[2][1] - m[1][1] * m[2][0]); \
+}\
+
+
+/** i,j,th cofactor of a 4x4 matrix
+ *
+ */
+#define COFACTOR_4X4_IJ(fac,m,i,j) \
+{ \
+ int __ii[4], __jj[4], __k; \
+ \
+ for (__k=0; __k<i; __k++) __ii[__k] = __k; \
+ for (__k=i; __k<3; __k++) __ii[__k] = __k+1; \
+ for (__k=0; __k<j; __k++) __jj[__k] = __k; \
+ for (__k=j; __k<3; __k++) __jj[__k] = __k+1; \
+ \
+ (fac) = m[__ii[0]][__jj[0]] * (m[__ii[1]][__jj[1]]*m[__ii[2]][__jj[2]] \
+ - m[__ii[1]][__jj[2]]*m[__ii[2]][__jj[1]]); \
+ (fac) -= m[__ii[0]][__jj[1]] * (m[__ii[1]][__jj[0]]*m[__ii[2]][__jj[2]] \
+ - m[__ii[1]][__jj[2]]*m[__ii[2]][__jj[0]]);\
+ (fac) += m[__ii[0]][__jj[2]] * (m[__ii[1]][__jj[0]]*m[__ii[2]][__jj[1]] \
+ - m[__ii[1]][__jj[1]]*m[__ii[2]][__jj[0]]);\
+ \
+ __k = i+j; \
+ if ( __k != (__k/2)*2) { \
+ (fac) = -(fac); \
+ } \
+}\
+
+
+/** determinant of matrix
+ *
+ * Computes determinant of matrix m, returning d
+ */
+#define DETERMINANT_4X4(d,m) \
+{ \
+ double cofac; \
+ COFACTOR_4X4_IJ (cofac, m, 0, 0); \
+ d = m[0][0] * cofac; \
+ COFACTOR_4X4_IJ (cofac, m, 0, 1); \
+ d += m[0][1] * cofac; \
+ COFACTOR_4X4_IJ (cofac, m, 0, 2); \
+ d += m[0][2] * cofac; \
+ COFACTOR_4X4_IJ (cofac, m, 0, 3); \
+ d += m[0][3] * cofac; \
+}\
+
+
+/** cofactor of matrix
+ *
+ * Computes cofactor of matrix m, returning a
+ */
+#define COFACTOR_2X2(a,m) \
+{ \
+ a[0][0] = (m)[1][1]; \
+ a[0][1] = - (m)[1][0]; \
+ a[1][0] = - (m)[0][1]; \
+ a[1][1] = (m)[0][0]; \
+}\
+
+
+/** cofactor of matrix
+ *
+ * Computes cofactor of matrix m, returning a
+ */
+#define COFACTOR_3X3(a,m) \
+{ \
+ a[0][0] = m[1][1]*m[2][2] - m[1][2]*m[2][1]; \
+ a[0][1] = - (m[1][0]*m[2][2] - m[2][0]*m[1][2]); \
+ a[0][2] = m[1][0]*m[2][1] - m[1][1]*m[2][0]; \
+ a[1][0] = - (m[0][1]*m[2][2] - m[0][2]*m[2][1]); \
+ a[1][1] = m[0][0]*m[2][2] - m[0][2]*m[2][0]; \
+ a[1][2] = - (m[0][0]*m[2][1] - m[0][1]*m[2][0]); \
+ a[2][0] = m[0][1]*m[1][2] - m[0][2]*m[1][1]; \
+ a[2][1] = - (m[0][0]*m[1][2] - m[0][2]*m[1][0]); \
+ a[2][2] = m[0][0]*m[1][1] - m[0][1]*m[1][0]); \
+}\
+
+
+/** cofactor of matrix
+ *
+ * Computes cofactor of matrix m, returning a
+ */
+#define COFACTOR_4X4(a,m) \
+{ \
+ int i,j; \
+ \
+ for (i=0; i<4; i++) { \
+ for (j=0; j<4; j++) { \
+ COFACTOR_4X4_IJ (a[i][j], m, i, j); \
+ } \
+ } \
+}\
+
+
+/** adjoint of matrix
+ *
+ * Computes adjoint of matrix m, returning a
+ * (Note that adjoint is just the transpose of the cofactor matrix)
+ */
+#define ADJOINT_2X2(a,m) \
+{ \
+ a[0][0] = (m)[1][1]; \
+ a[1][0] = - (m)[1][0]; \
+ a[0][1] = - (m)[0][1]; \
+ a[1][1] = (m)[0][0]; \
+}\
+
+
+/** adjoint of matrix
+ *
+ * Computes adjoint of matrix m, returning a
+ * (Note that adjoint is just the transpose of the cofactor matrix)
+ */
+#define ADJOINT_3X3(a,m) \
+{ \
+ a[0][0] = m[1][1]*m[2][2] - m[1][2]*m[2][1]; \
+ a[1][0] = - (m[1][0]*m[2][2] - m[2][0]*m[1][2]); \
+ a[2][0] = m[1][0]*m[2][1] - m[1][1]*m[2][0]; \
+ a[0][1] = - (m[0][1]*m[2][2] - m[0][2]*m[2][1]); \
+ a[1][1] = m[0][0]*m[2][2] - m[0][2]*m[2][0]; \
+ a[2][1] = - (m[0][0]*m[2][1] - m[0][1]*m[2][0]); \
+ a[0][2] = m[0][1]*m[1][2] - m[0][2]*m[1][1]; \
+ a[1][2] = - (m[0][0]*m[1][2] - m[0][2]*m[1][0]); \
+ a[2][2] = m[0][0]*m[1][1] - m[0][1]*m[1][0]); \
+}\
+
+
+/** adjoint of matrix
+ *
+ * Computes adjoint of matrix m, returning a
+ * (Note that adjoint is just the transpose of the cofactor matrix)
+ */
+#define ADJOINT_4X4(a,m) \
+{ \
+ char _i_,_j_; \
+ \
+ for (_i_=0; _i_<4; _i_++) { \
+ for (_j_=0; _j_<4; _j_++) { \
+ COFACTOR_4X4_IJ (a[_j_][_i_], m, _i_, _j_); \
+ } \
+ } \
+}\
+
+
+/** compute adjoint of matrix and scale
+ *
+ * Computes adjoint of matrix m, scales it by s, returning a
+ */
+#define SCALE_ADJOINT_2X2(a,s,m) \
+{ \
+ a[0][0] = (s) * m[1][1]; \
+ a[1][0] = - (s) * m[1][0]; \
+ a[0][1] = - (s) * m[0][1]; \
+ a[1][1] = (s) * m[0][0]; \
+}\
+
+
+/** compute adjoint of matrix and scale
+ *
+ * Computes adjoint of matrix m, scales it by s, returning a
+ */
+#define SCALE_ADJOINT_3X3(a,s,m) \
+{ \
+ a[0][0] = (s) * (m[1][1] * m[2][2] - m[1][2] * m[2][1]); \
+ a[1][0] = (s) * (m[1][2] * m[2][0] - m[1][0] * m[2][2]); \
+ a[2][0] = (s) * (m[1][0] * m[2][1] - m[1][1] * m[2][0]); \
+ \
+ a[0][1] = (s) * (m[0][2] * m[2][1] - m[0][1] * m[2][2]); \
+ a[1][1] = (s) * (m[0][0] * m[2][2] - m[0][2] * m[2][0]); \
+ a[2][1] = (s) * (m[0][1] * m[2][0] - m[0][0] * m[2][1]); \
+ \
+ a[0][2] = (s) * (m[0][1] * m[1][2] - m[0][2] * m[1][1]); \
+ a[1][2] = (s) * (m[0][2] * m[1][0] - m[0][0] * m[1][2]); \
+ a[2][2] = (s) * (m[0][0] * m[1][1] - m[0][1] * m[1][0]); \
+}\
+
+
+/** compute adjoint of matrix and scale
+ *
+ * Computes adjoint of matrix m, scales it by s, returning a
+ */
+#define SCALE_ADJOINT_4X4(a,s,m) \
+{ \
+ char _i_,_j_; \
+ for (_i_=0; _i_<4; _i_++) { \
+ for (_j_=0; _j_<4; _j_++) { \
+ COFACTOR_4X4_IJ (a[_j_][_i_], m, _i_, _j_); \
+ a[_j_][_i_] *= s; \
+ } \
+ } \
+}\
+
+/** inverse of matrix
+ *
+ * Compute inverse of matrix a, returning determinant m and
+ * inverse b
+ */
+#define INVERT_2X2(b,det,a) \
+{ \
+ GREAL _tmp_; \
+ DETERMINANT_2X2 (det, a); \
+ _tmp_ = 1.0 / (det); \
+ SCALE_ADJOINT_2X2 (b, _tmp_, a); \
+}\
+
+
+/** inverse of matrix
+ *
+ * Compute inverse of matrix a, returning determinant m and
+ * inverse b
+ */
+#define INVERT_3X3(b,det,a) \
+{ \
+ GREAL _tmp_; \
+ DETERMINANT_3X3 (det, a); \
+ _tmp_ = 1.0 / (det); \
+ SCALE_ADJOINT_3X3 (b, _tmp_, a); \
+}\
+
+
+/** inverse of matrix
+ *
+ * Compute inverse of matrix a, returning determinant m and
+ * inverse b
+ */
+#define INVERT_4X4(b,det,a) \
+{ \
+ GREAL _tmp_; \
+ DETERMINANT_4X4 (det, a); \
+ _tmp_ = 1.0 / (det); \
+ SCALE_ADJOINT_4X4 (b, _tmp_, a); \
+}\
+
+//! @}
+
+/*! \defgroup BOUND_AABB_OPERATIONS
+*/
+//! @{
+
+//!Initializes an AABB
+#define INVALIDATE_AABB(aabb) {\
+ (aabb).minX = G_REAL_INFINITY;\
+ (aabb).maxX = -G_REAL_INFINITY;\
+ (aabb).minY = G_REAL_INFINITY;\
+ (aabb).maxY = -G_REAL_INFINITY;\
+ (aabb).minZ = G_REAL_INFINITY;\
+ (aabb).maxZ = -G_REAL_INFINITY;\
+}\
+
+#define AABB_GET_MIN(aabb,vmin) {\
+ vmin[0] = (aabb).minX;\
+ vmin[1] = (aabb).minY;\
+ vmin[2] = (aabb).minZ;\
+}\
+
+#define AABB_GET_MAX(aabb,vmax) {\
+ vmax[0] = (aabb).maxX;\
+ vmax[1] = (aabb).maxY;\
+ vmax[2] = (aabb).maxZ;\
+}\
+
+//!Copy boxes
+#define AABB_COPY(dest_aabb,src_aabb)\
+{\
+ (dest_aabb).minX = (src_aabb).minX;\
+ (dest_aabb).maxX = (src_aabb).maxX;\
+ (dest_aabb).minY = (src_aabb).minY;\
+ (dest_aabb).maxY = (src_aabb).maxY;\
+ (dest_aabb).minZ = (src_aabb).minZ;\
+ (dest_aabb).maxZ = (src_aabb).maxZ;\
+}\
+
+//! Computes an Axis aligned box from a triangle
+#define COMPUTEAABB_FOR_TRIANGLE(aabb,V1,V2,V3) {\
+ (aabb).minX = MIN3(V1[0],V2[0],V3[0]);\
+ (aabb).maxX = MAX3(V1[0],V2[0],V3[0]);\
+ (aabb).minY = MIN3(V1[1],V2[1],V3[1]);\
+ (aabb).maxY = MAX3(V1[1],V2[1],V3[1]);\
+ (aabb).minZ = MIN3(V1[2],V2[2],V3[2]);\
+ (aabb).maxZ = MAX3(V1[2],V2[2],V3[2]);\
+}\
+
+//! Merge two boxes to destaabb
+#define MERGEBOXES(destaabb,aabb) {\
+ (destaabb).minX = MIN((aabb).minX,(destaabb).minX);\
+ (destaabb).minY = MIN((aabb).minY,(destaabb).minY);\
+ (destaabb).minZ = MIN((aabb).minZ,(destaabb).minZ);\
+ (destaabb).maxX = MAX((aabb).maxX,(destaabb).maxX);\
+ (destaabb).maxY = MAX((aabb).maxY,(destaabb).maxY);\
+ (destaabb).maxZ = MAX((aabb).maxZ,(destaabb).maxZ);\
+}\
+
+//! Extends the box
+#define AABB_POINT_EXTEND(destaabb,p) {\
+ (destaabb).minX = MIN(p[0],(destaabb).minX);\
+ (destaabb).maxX = MAX(p[0],(destaabb).maxX);\
+ (destaabb).minY = MIN(p[1],(destaabb).minY);\
+ (destaabb).maxY = MAX(p[1],(destaabb).maxY);\
+ (destaabb).minZ = MIN(p[2],(destaabb).minZ);\
+ (destaabb).maxZ = MAX(p[2],(destaabb).maxZ);\
+}\
+
+//! Finds the intersection box of two boxes
+#define BOXINTERSECTION(aabb1, aabb2, iaabb) {\
+ (iaabb).minX = MAX((aabb1).minX,(aabb2).minX);\
+ (iaabb).minY = MAX((aabb1).minY,(aabb2).minY);\
+ (iaabb).minZ = MAX((aabb1).minZ,(aabb2).minZ);\
+ (iaabb).maxX = MIN((aabb1).maxX,(aabb2).maxX);\
+ (iaabb).maxY = MIN((aabb1).maxY,(aabb2).maxY);\
+ (iaabb).maxZ = MIN((aabb1).maxZ,(aabb2).maxZ);\
+}\
+
+//! Determines if two aligned boxes do intersect
+#define AABBCOLLISION(intersected,aabb1,aabb2) {\
+ intersected = 1;\
+ if ((aabb1).minX > (aabb2).maxX ||\
+ (aabb1).maxX < (aabb2).minX ||\
+ (aabb1).minY > (aabb2).maxY ||\
+ (aabb1).maxY < (aabb2).minY ||\
+ (aabb1).minZ > (aabb2).maxZ ||\
+ (aabb1).maxZ < (aabb2).minZ )\
+ {\
+ intersected = 0;\
+ }\
+}\
+
+#define AXIS_INTERSECT(min,max, a, d,tfirst, tlast,is_intersected) {\
+ if(IS_ZERO(d))\
+ {\
+ is_intersected = !(a < min || a > max);\
+ }\
+ else\
+ {\
+ GREAL a0, a1;\
+ a0 = (min - a) / (d);\
+ a1 = (max - a) / (d);\
+ if(a0 > a1) SWAP_NUMBERS(a0, a1);\
+ tfirst = MAX(a0, tfirst);\
+ tlast = MIN(a1, tlast);\
+ if (tlast < tfirst)\
+ {\
+ is_intersected = 0;\
+ }\
+ else\
+ {\
+ is_intersected = 1;\
+ }\
+ }\
+}\
+
+/*! \brief Finds the Ray intersection parameter.
+
+\param aabb Aligned box
+\param vorigin A vec3f with the origin of the ray
+\param vdir A vec3f with the direction of the ray
+\param tparam Output parameter
+\param tmax Max lenght of the ray
+\param is_intersected 1 if the ray collides the box, else false
+
+*/
+#define BOX_INTERSECTS_RAY(aabb, vorigin, vdir, tparam, tmax,is_intersected) { \
+ GREAL _tfirst = 0.0f, _tlast = tmax;\
+ AXIS_INTERSECT(aabb.minX,aabb.maxX,vorigin[0], vdir[0], _tfirst, _tlast,is_intersected);\
+ if(is_intersected)\
+ {\
+ AXIS_INTERSECT(aabb.minY,aabb.maxY,vorigin[1], vdir[1], _tfirst, _tlast,is_intersected);\
+ }\
+ if(is_intersected)\
+ {\
+ AXIS_INTERSECT(aabb.minZ,aabb.maxZ,vorigin[2], vdir[2], _tfirst, _tlast,is_intersected);\
+ }\
+ tparam = _tfirst;\
+}\
+
+#define AABB_PROJECTION_INTERVAL(aabb,direction, vmin, vmax)\
+{\
+ GREAL _center[] = {(aabb.minX + aabb.maxX)*0.5f, (aabb.minY + aabb.maxY)*0.5f, (aabb.minZ + aabb.maxZ)*0.5f};\
+ \
+ GREAL _extend[] = {aabb.maxX-_center[0],aabb.maxY-_center[1],aabb.maxZ-_center[2]};\
+ GREAL _fOrigin = VEC_DOT(direction,_center);\
+ GREAL _fMaximumExtent = _extend[0]*fabsf(direction[0]) + \
+ _extend[1]*fabsf(direction[1]) + \
+ _extend[2]*fabsf(direction[2]); \
+\
+ vmin = _fOrigin - _fMaximumExtent; \
+ vmax = _fOrigin + _fMaximumExtent; \
+}\
+
+/*!
+classify values:
+<ol>
+<li> 0 : In back of plane
+<li> 1 : Spanning
+<li> 2 : In front of
+</ol>
+*/
+#define PLANE_CLASSIFY_BOX(plane,aabb,classify)\
+{\
+ GREAL _fmin,_fmax; \
+ AABB_PROJECTION_INTERVAL(aabb,plane, _fmin, _fmax); \
+ if(plane[3] >= _fmax) \
+ { \
+ classify = 0;/*In back of*/ \
+ } \
+ else \
+ { \
+ if(plane[3]+0.000001f>=_fmin) \
+ { \
+ classify = 1;/*Spanning*/ \
+ } \
+ else \
+ { \
+ classify = 2;/*In front of*/ \
+ } \
+ } \
+}\
+//! @}
+
+/*! \defgroup GEOMETRIC_OPERATIONS
+*/
+//! @{
+
+
+#define PLANEDIREPSILON 0.0000001f
+#define PARALELENORMALS 0.000001f
+
+#define TRIANGLE_NORMAL(v1,v2,v3,n){\
+ vec3f _dif1,_dif2; \
+ VEC_DIFF(_dif1,v2,v1); \
+ VEC_DIFF(_dif2,v3,v1); \
+ VEC_CROSS(n,_dif1,_dif2); \
+ VEC_NORMALIZE(n); \
+}\
+
+/// plane is a vec4f
+#define TRIANGLE_PLANE(v1,v2,v3,plane) {\
+ TRIANGLE_NORMAL(v1,v2,v3,plane);\
+ plane[3] = VEC_DOT(v1,plane);\
+}\
+
+/// Calc a plane from an edge an a normal. plane is a vec4f
+#define EDGE_PLANE(e1,e2,n,plane) {\
+ vec3f _dif; \
+ VEC_DIFF(_dif,e2,e1); \
+ VEC_CROSS(plane,_dif,n); \
+ VEC_NORMALIZE(plane); \
+ plane[3] = VEC_DOT(e1,plane);\
+}\
+
+#define DISTANCE_PLANE_POINT(plane,point) (VEC_DOT(plane,point) - plane[3])
+
+#define PROJECT_POINT_PLANE(point,plane,projected) {\
+ GREAL _dis;\
+ _dis = DISTANCE_PLANE_POINT(plane,point);\
+ VEC_SCALE(projected,-_dis,plane);\
+ VEC_SUM(projected,projected,point); \
+}\
+
+#define POINT_IN_HULL(point,planes,plane_count,outside)\
+{\
+ GREAL _dis;\
+ outside = 0;\
+ GUINT32 _i = 0;\
+ do\
+ {\
+ _dis = DISTANCE_PLANE_POINT(planes[_i],point);\
+ if(_dis>0.0f) outside = 1;\
+ _i++;\
+ }while(_i<plane_count&&outside==0);\
+}\
+
+
+#define PLANE_CLIP_SEGMENT(s1,s2,plane,clipped) {\
+ GREAL _dis1,_dis2;\
+ _dis1 = DISTANCE_PLANE_POINT(plane,s1);\
+ VEC_DIFF(clipped,s2,s1);\
+ _dis2 = VEC_DOT(clipped,plane);\
+ VEC_SCALE(clipped,-_dis1/_dis2,clipped);\
+ VEC_SUM(clipped,clipped,s1); \
+}\
+
+//! Confirms if the plane intersect the edge or nor
+/*!
+intersection type must have the following values
+<ul>
+<li> 0 : Segment in front of plane, s1 closest
+<li> 1 : Segment in front of plane, s2 closest
+<li> 2 : Segment in back of plane, s1 closest
+<li> 3 : Segment in back of plane, s2 closest
+<li> 4 : Segment collides plane, s1 in back
+<li> 5 : Segment collides plane, s2 in back
+</ul>
+*/
+#define PLANE_CLIP_SEGMENT2(s1,s2,plane,clipped,intersection_type) \
+{\
+ GREAL _dis1,_dis2;\
+ _dis1 = DISTANCE_PLANE_POINT(plane,s1);\
+ _dis2 = DISTANCE_PLANE_POINT(plane,s2);\
+ if(_dis1 >-G_EPSILON && _dis2 >-G_EPSILON)\
+ {\
+ if(_dis1<_dis2) intersection_type = 0;\
+ else intersection_type = 1;\
+ }\
+ else if(_dis1 <G_EPSILON && _dis2 <G_EPSILON)\
+ {\
+ if(_dis1>_dis2) intersection_type = 2;\
+ else intersection_type = 3; \
+ }\
+ else\
+ {\
+ if(_dis1<_dis2) intersection_type = 4;\
+ else intersection_type = 5;\
+ VEC_DIFF(clipped,s2,s1);\
+ _dis2 = VEC_DOT(clipped,plane);\
+ VEC_SCALE(clipped,-_dis1/_dis2,clipped);\
+ VEC_SUM(clipped,clipped,s1); \
+ }\
+}\
+
+//! Confirms if the plane intersect the edge or not
+/*!
+clipped1 and clipped2 are the vertices behind the plane.
+clipped1 is the closest
+
+intersection_type must have the following values
+<ul>
+<li> 0 : Segment in front of plane, s1 closest
+<li> 1 : Segment in front of plane, s2 closest
+<li> 2 : Segment in back of plane, s1 closest
+<li> 3 : Segment in back of plane, s2 closest
+<li> 4 : Segment collides plane, s1 in back
+<li> 5 : Segment collides plane, s2 in back
+</ul>
+*/
+#define PLANE_CLIP_SEGMENT_CLOSEST(s1,s2,plane,clipped1,clipped2,intersection_type)\
+{\
+ PLANE_CLIP_SEGMENT2(s1,s2,plane,clipped1,intersection_type);\
+ if(intersection_type == 0)\
+ {\
+ VEC_COPY(clipped1,s1);\
+ VEC_COPY(clipped2,s2);\
+ }\
+ else if(intersection_type == 1)\
+ {\
+ VEC_COPY(clipped1,s2);\
+ VEC_COPY(clipped2,s1);\
+ }\
+ else if(intersection_type == 2)\
+ {\
+ VEC_COPY(clipped1,s1);\
+ VEC_COPY(clipped2,s2);\
+ }\
+ else if(intersection_type == 3)\
+ {\
+ VEC_COPY(clipped1,s2);\
+ VEC_COPY(clipped2,s1);\
+ }\
+ else if(intersection_type == 4)\
+ { \
+ VEC_COPY(clipped2,s1);\
+ }\
+ else if(intersection_type == 5)\
+ { \
+ VEC_COPY(clipped2,s2);\
+ }\
+}\
+
+
+//! Finds the 2 smallest cartesian coordinates of a plane normal
+#define PLANE_MINOR_AXES(plane, i0, i1)\
+{\
+ GREAL A[] = {fabs(plane[0]),fabs(plane[1]),fabs(plane[2])};\
+ if(A[0]>A[1])\
+ {\
+ if(A[0]>A[2])\
+ {\
+ i0=1; /* A[0] is greatest */ \
+ i1=2;\
+ }\
+ else \
+ {\
+ i0=0; /* A[2] is greatest */ \
+ i1=1; \
+ }\
+ }\
+ else /* A[0]<=A[1] */ \
+ {\
+ if(A[2]>A[1]) \
+ { \
+ i0=0; /* A[2] is greatest */ \
+ i1=1; \
+ }\
+ else \
+ {\
+ i0=0; /* A[1] is greatest */ \
+ i1=2; \
+ }\
+ } \
+}\
+
+//! Ray plane collision
+#define RAY_PLANE_COLLISION(plane,vDir,vPoint,pout,tparam,does_intersect)\
+{\
+ GREAL _dis,_dotdir; \
+ _dotdir = VEC_DOT(plane,vDir);\
+ if(_dotdir<PLANEDIREPSILON)\
+ {\
+ does_intersect = 0;\
+ }\
+ else\
+ {\
+ _dis = DISTANCE_PLANE_POINT(plane,vPoint); \
+ tparam = -_dis/_dotdir;\
+ VEC_SCALE(pout,tparam,vDir);\
+ VEC_SUM(pout,vPoint,pout); \
+ does_intersect = 1;\
+ }\
+}\
+
+//! Bidireccional ray
+#define LINE_PLANE_COLLISION(plane,vDir,vPoint,pout,tparam, tmin, tmax)\
+{\
+ tparam = -DISTANCE_PLANE_POINT(plane,vPoint);\
+ tparam /= VEC_DOT(plane,vDir);\
+ tparam = CLAMP(tparam,tmin,tmax);\
+ VEC_SCALE(pout,tparam,vDir);\
+ VEC_SUM(pout,vPoint,pout); \
+}\
+
+/*! \brief Returns the Ray on which 2 planes intersect if they do.
+ Written by Rodrigo Hernandez on ODE convex collision
+
+ \param p1 Plane 1
+ \param p2 Plane 2
+ \param p Contains the origin of the ray upon returning if planes intersect
+ \param d Contains the direction of the ray upon returning if planes intersect
+ \param dointersect 1 if the planes intersect, 0 if paralell.
+
+*/
+#define INTERSECT_PLANES(p1,p2,p,d,dointersect) \
+{ \
+ VEC_CROSS(d,p1,p2); \
+ GREAL denom = VEC_DOT(d, d);\
+ if (IS_ZERO(denom)) \
+ { \
+ dointersect = 0; \
+ } \
+ else \
+ { \
+ vec3f _n;\
+ _n[0]=p1[3]*p2[0] - p2[3]*p1[0]; \
+ _n[1]=p1[3]*p2[1] - p2[3]*p1[1]; \
+ _n[2]=p1[3]*p2[2] - p2[3]*p1[2]; \
+ VEC_CROSS(p,_n,d); \
+ p[0]/=denom; \
+ p[1]/=denom; \
+ p[2]/=denom; \
+ dointersect = 1; \
+ }\
+}\
+
+//***************** SEGMENT and LINE FUNCTIONS **********************************///
+
+/*! Finds the closest point(cp) to (v) on a segment (e1,e2)
+ */
+#define CLOSEST_POINT_ON_SEGMENT(cp,v,e1,e2) \
+{ \
+ vec3f _n;\
+ VEC_DIFF(_n,e2,e1);\
+ VEC_DIFF(cp,v,e1);\
+ GREAL _scalar = VEC_DOT(cp, _n); \
+ _scalar/= VEC_DOT(_n, _n); \
+ if(_scalar <0.0f)\
+ {\
+ VEC_COPY(cp,e1);\
+ }\
+ else if(_scalar >1.0f)\
+ {\
+ VEC_COPY(cp,e2);\
+ }\
+ else \
+ {\
+ VEC_SCALE(cp,_scalar,_n);\
+ VEC_SUM(cp,cp,e1);\
+ } \
+}\
+
+
+/*! \brief Finds the line params where these lines intersect.
+
+\param dir1 Direction of line 1
+\param point1 Point of line 1
+\param dir2 Direction of line 2
+\param point2 Point of line 2
+\param t1 Result Parameter for line 1
+\param t2 Result Parameter for line 2
+\param dointersect 0 if the lines won't intersect, else 1
+
+*/
+#define LINE_INTERSECTION_PARAMS(dir1,point1, dir2, point2,t1,t2,dointersect) {\
+ GREAL det;\
+ GREAL e1e1 = VEC_DOT(dir1,dir1);\
+ GREAL e1e2 = VEC_DOT(dir1,dir2);\
+ GREAL e2e2 = VEC_DOT(dir2,dir2);\
+ vec3f p1p2;\
+ VEC_DIFF(p1p2,point1,point2);\
+ GREAL p1p2e1 = VEC_DOT(p1p2,dir1);\
+ GREAL p1p2e2 = VEC_DOT(p1p2,dir2);\
+ det = e1e2*e1e2 - e1e1*e2e2;\
+ if(IS_ZERO(det))\
+ {\
+ dointersect = 0;\
+ }\
+ else\
+ {\
+ t1 = (e1e2*p1p2e2 - e2e2*p1p2e1)/det;\
+ t2 = (e1e1*p1p2e2 - e1e2*p1p2e1)/det;\
+ dointersect = 1;\
+ }\
+}\
+
+//! Find closest points on segments
+#define SEGMENT_COLLISION(vA1,vA2,vB1,vB2,vPointA,vPointB)\
+{\
+ vec3f _AD,_BD,_N;\
+ vec4f _M;\
+ VEC_DIFF(_AD,vA2,vA1);\
+ VEC_DIFF(_BD,vB2,vB1);\
+ VEC_CROSS(_N,_AD,_BD);\
+ VEC_CROSS(_M,_N,_BD);\
+ _M[3] = VEC_DOT(_M,vB1);\
+ float _tp; \
+ LINE_PLANE_COLLISION(_M,_AD,vA1,vPointA,_tp,0.0f, 1.0f);\
+ /*Closest point on segment*/ \
+ VEC_DIFF(vPointB,vPointA,vB1);\
+ _tp = VEC_DOT(vPointB, _BD); \
+ _tp/= VEC_DOT(_BD, _BD); \
+ _tp = CLAMP(_tp,0.0f,1.0f); \
+ VEC_SCALE(vPointB,_tp,_BD);\
+ VEC_SUM(vPointB,vPointB,vB1);\
+}\
+
+//! @}
+
+///Additional Headers for Collision
+#include "GIMPACT/gim_tri_collision.h"
+#include "GIMPACT/gim_tri_sphere_collision.h"
+#include "GIMPACT/gim_tri_capsule_collision.h"
+
+#endif // GIM_VECTOR_H_INCLUDED
diff --git a/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_math.h b/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_math.h
new file mode 100644
index 0000000..97fdad2
--- /dev/null
+++ b/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_math.h
@@ -0,0 +1,164 @@
+#ifndef GIM_MATH_H_INCLUDED
+#define GIM_MATH_H_INCLUDED
+
+/*! \file gim_math.h
+\author Francisco León
+*/
+/*
+-----------------------------------------------------------------------------
+This source file is part of GIMPACT Library.
+
+For the latest info, see http://gimpact.sourceforge.net/
+
+Copyright (c) 2006 Francisco Leon. C.C. 80087371.
+email: projectileman@yahoo.com
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of EITHER:
+ (1) The GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 2.1 of the License, or (at
+ your option) any later version. The text of the GNU Lesser
+ General Public License is included with this library in the
+ file GIMPACT-LICENSE-LGPL.TXT.
+ (2) The BSD-style license that is included with this library in
+ the file GIMPACT-LICENSE-BSD.TXT.
+
+ This library 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 files
+ GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details.
+
+-----------------------------------------------------------------------------
+*/
+
+#include "config.h"
+
+#include <math.h>
+#include <float.h>
+#if HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#elif defined(_MSC_VER)
+typedef __int32 int32_t;
+typedef unsigned __int32 uint32_t;
+#elif defined(__GNUC__)
+#include <inttypes.h>
+#else
+#error "GIMPACT: Must define int32_t and uint32_t"
+#endif
+
+
+/*! \defgroup BASIC_TYPES
+Basic types and constants
+Conventions:
+Types starting with G
+Constants starting with G_
+*/
+//! @{
+/*! Types */
+#define GREAL float
+#define GINT32 int32_t
+#define GUINT32 uint32_t
+
+#ifdef GPTR
+#undef GPTR
+#endif
+#define GPTR void*
+
+/*! Constants for integers*/
+#define GUINT32_BIT_COUNT 32
+#define GUINT32_EXPONENT 5
+
+#define G_FASTMATH 1
+#define G_PI 3.14159265358979f
+#define G_HALF_PI 1.5707963f
+//267948966
+#define G_TWO_PI 6.28318530f
+//71795864
+#define G_ROOT3 1.73205f
+#define G_ROOT2 1.41421f
+#define G_UINT_INFINITY 65534
+#define G_REAL_INFINITY FLT_MAX
+#define G_SIGN_BITMASK 0x80000000
+#define G_USE_EPSILON_TEST
+#define G_EPSILON 0.0000001f
+//! @}
+
+/*! \defgroup MATH_FUNCTIONS
+mathematical functions
+*/
+//! @{
+#define G_DEGTORAD(X) ((X)*3.1415926f/180.0f)
+#define G_RADTODEG(X) ((X)*180.0f/3.1415926f)
+
+//! Integer representation of a floating-point value.
+#define IR(x) ((GUINT32&)(x))
+
+//! Signed integer representation of a floating-point value.
+#define SIR(x) ((GINT32&)(x))
+
+//! Absolute integer representation of a floating-point value
+#define AIR(x) (IR(x)&0x7fffffff)
+
+//! Floating-point representation of an integer value.
+#define FR(x) ((GREAL&)(x))
+
+#define MAX(a,b) ((a)<(b)?(b):(a))
+#define MIN(a,b) ((a)>(b)?(b):(a))
+
+#define MAX3(a,b,c) MAX(a,MAX(b,c))
+#define MIN3(a,b,c) MIN(a,MIN(b,c))
+
+#define IS_ZERO(value) ((value) < G_EPSILON && (value) > -G_EPSILON)
+
+#define IS_NEGATIVE(value) ((value) <= -G_EPSILON)
+
+#define IS_POSISITVE(value) ((value) >= G_EPSILON)
+
+///returns a clamped number
+#define CLAMP(number,minval,maxval) ((number)<(minval)?(minval):((number)>(maxval)?(maxval):(number)))
+
+///Swap numbers
+#define SWAP_NUMBERS(a,b){ \
+ (a) = (a)+(b); \
+ (b) = (a)-(b); \
+ (a) = (a)-(b); \
+}\
+
+#define GIM_INV_SQRT(va,isva)\
+{\
+ if((va)<=0.0000001f)\
+ {\
+ (isva) = G_REAL_INFINITY;\
+ }\
+ else\
+ {\
+ GREAL _x = (va) * 0.5f;\
+ GUINT32 _y = 0x5f3759df - ( IR(va) >> 1);\
+ (isva) = FR(_y);\
+ (isva) = (isva) * ( 1.5f - ( _x * (isva) * (isva) ) );\
+ }\
+}\
+
+#define GIM_SQRT(va,sva)\
+{\
+ GIM_INV_SQRT(va,sva);\
+ (sva) = 1.0f/(sva);\
+}\
+
+//! Computes 1.0f / sqrtf(x). Comes from Quake3. See http://www.magic-software.com/3DGEDInvSqrt.html
+GREAL gim_inv_sqrt(GREAL f);
+
+//! Computes sqrtf(x) faster.
+/*!
+\sa gim_inv_sqrt
+*/
+GREAL gim_sqrt(GREAL f);
+
+//!Initializes mathematical functions
+void gim_init_math();
+
+//! Generates an unit random
+GREAL gim_unit_random();
+//! @}
+
+#endif // GIM_MATH_H_INCLUDED
diff --git a/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_memory.h b/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_memory.h
new file mode 100644
index 0000000..d007bda
--- /dev/null
+++ b/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_memory.h
@@ -0,0 +1,1056 @@
+#ifndef GIM_MEMORY_H_INCLUDED
+#define GIM_MEMORY_H_INCLUDED
+/*! \file gim_memory.h
+\author Francisco León
+*/
+/*
+-----------------------------------------------------------------------------
+This source file is part of GIMPACT Library.
+
+For the latest info, see http://gimpact.sourceforge.net/
+
+Copyright (c) 2006 Francisco Leon. C.C. 80087371.
+email: projectileman@yahoo.com
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of EITHER:
+ (1) The GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 2.1 of the License, or (at
+ your option) any later version. The text of the GNU Lesser
+ General Public License is included with this library in the
+ file GIMPACT-LICENSE-LGPL.TXT.
+ (2) The BSD-style license that is included with this library in
+ the file GIMPACT-LICENSE-BSD.TXT.
+
+ This library 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 files
+ GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details.
+
+-----------------------------------------------------------------------------
+*/
+
+
+#include "GIMPACT/gim_math.h"
+#include <memory.h>
+
+//#define PREFETCH 1
+//! \defgroup PREFETCH
+//! @{
+#ifdef PREFETCH
+#include <xmmintrin.h> // for prefetch
+#define pfval 64
+#define pfval2 128
+//! Prefetch 64
+#define pf(_x,_i) _mm_prefetch((void *)(_x + _i + pfval), 0)
+//! Prefetch 128
+#define pf2(_x,_i) _mm_prefetch((void *)(_x + _i + pfval2), 0)
+#else
+//! Prefetch 64
+#define pf(_x,_i)
+//! Prefetch 128
+#define pf2(_x,_i)
+#endif
+//! @}
+
+/*! \defgroup ARRAY_UTILITIES
+\brief
+Functions for manip packed arrays of numbers
+*/
+//! @{
+#define GIM_COPY_ARRAYS(dest_array, source_array, element_count)\
+{\
+ GUINT32 _i_;\
+ for (_i_ = 0; _i_ < (element_count); _i_++)\
+ {\
+ (dest_array)[_i_] = (source_array)[_i_];\
+ }\
+}\
+
+#define GIM_COPY_ARRAYS_1(dest_array, source_array, element_count, copy_macro)\
+{\
+ GUINT32 _i_;\
+ for (_i_=0; _i_ < (element_count); _i_++)\
+ {\
+ copy_macro((dest_array)[_i_], (source_array)[_i_]);\
+ }\
+}\
+
+
+#define GIM_ZERO_ARRAY(array, element_count)\
+{\
+ GUINT32 _i_;\
+ for (_i_=0; _i_ < (element_count); _i_++)\
+ {\
+ (array)[_i_] = 0;\
+ }\
+}\
+
+#define GIM_CONSTANT_ARRAY(array, element_count, constant)\
+{\
+ GUINT32 _i_;\
+ for (_i_ = 0; _i_ < (element_count); _i_++)\
+ {\
+ (array)[_i_] = (constant);\
+ }\
+}\
+//! @}
+
+/*! \defgroup MEMORY_FUNCTION_PROTOTYPES
+Function prototypes to allocate and free memory.
+*/
+//! @{
+typedef void * gim_alloc_function (size_t size);
+typedef void * gim_alloca_function (size_t size);//Allocs on the heap
+typedef void * gim_realloc_function (void *ptr, size_t oldsize, size_t newsize);
+typedef void gim_free_function (void *ptr, size_t size);
+//! @}
+
+/*! \defgroup MEMORY_FUNCTION_HANDLERS
+\brief
+Memory Function Handlers
+ set new memory management functions. if fn is 0, the default handlers are
+ used. */
+//! @{
+void gim_set_alloc_handler (gim_alloc_function *fn);
+// void gim_set_alloca_handler (gim_alloca_function *fn); -- a nonsense
+void gim_set_realloc_handler (gim_realloc_function *fn);
+void gim_set_free_handler (gim_free_function *fn);
+//! @}
+
+/*! \defgroup MEMORY_FUNCTION_GET_HANDLERS
+\brief
+get current memory management functions.
+*/
+//! @{
+gim_alloc_function *gim_get_alloc_handler (void);
+// gim_alloca_function *gim_get_alloca_handler(void); -- a nonsense
+gim_realloc_function *gim_get_realloc_handler (void);
+gim_free_function *gim_get_free_handler (void);
+//! @}
+
+/*! \defgroup MEMORY_FUNCTIONS
+Standar Memory functions
+*/
+//! @{
+void * gim_alloc(size_t size);
+// void * gim_alloca(size_t size); -- a nonsense
+void * gim_realloc(void *ptr, size_t oldsize, size_t newsize);
+void gim_free(void *ptr, size_t size);
+//! @}
+
+/*! \defgroup DYNAMIC_ARRAYS
+\brief
+Dynamic Arrays. Allocated from system memory.
+<ul>
+<li> For initializes a dynamic array, use GIM_DYNARRAY_CREATE or GIM_DYNARRAY_CREATE_SIZED.
+<li> When an array is no longer used, must be terminated with the macro GIM_DYNARRAY_DESTROY.
+</ul>
+*/
+//! @{
+#define G_ARRAY_GROW_SIZE 64
+#define G_ARRAY_BUFFERMANAGER_INIT_SIZE 2
+
+//! Dynamic array handle.
+struct GDYNAMIC_ARRAY
+{
+ char * m_pdata;
+ GUINT32 m_size;
+ GUINT32 m_reserve_size;
+};
+//typedef struct _GDYNAMIC_ARRAY GDYNAMIC_ARRAY;
+
+//! Creates a dynamic array zero sized
+#define GIM_DYNARRAY_CREATE(type, array_data, reserve_size) \
+{ \
+ (array_data).m_pdata = (char *)gim_alloc((reserve_size) * sizeof(type)); \
+ (array_data).m_size = 0; \
+ (array_data).m_reserve_size = (reserve_size); \
+} \
+
+//! Creates a dynamic array with n = size elements
+#define GIM_DYNARRAY_CREATE_SIZED(type, array_data, size) \
+{ \
+ (array_data).m_pdata = (char *)gim_alloc((size) * sizeof(type)); \
+ (array_data).m_size = (size); \
+ (array_data).m_reserve_size = (size); \
+} \
+
+//! Reserves memory for a dynamic array.
+#define GIM_DYNARRAY_RESERVE_SIZE(type, array_data, old_size, reserve_size) \
+{ \
+ if ((reserve_size) > (array_data).m_reserve_size) \
+ { \
+ (array_data).m_pdata = (char *) gim_realloc((array_data).m_pdata, (old_size) * sizeof(type), (reserve_size) * sizeof(type)); \
+ (array_data).m_reserve_size = (reserve_size); \
+ } \
+} \
+
+//! Set the size of the array
+#define GIM_DYNARRAY_SET_SIZE(type, array_data, size) \
+{ \
+ GIM_DYNARRAY_RESERVE_SIZE(type, array_data, (array_data).m_size, size); \
+ (array_data).m_size = size; \
+} \
+
+//! Gets a pointer from the beginning of the array
+#define GIM_DYNARRAY_POINTER(type, array_data) ((type *)((array_data).m_pdata))
+
+//! Gets a pointer from the last elemento of the array
+#define GIM_DYNARRAY_POINTER_LAST(type, array_data) (((type *)(array_data).m_pdata) + ((array_data).m_size - 1))
+
+//! Inserts an element at the last position
+#define GIM_DYNARRAY_PUSH_ITEM(type, array_data, item)\
+{ \
+ if ((array_data).m_reserve_size <= (array_data).m_size)\
+ {\
+ GIM_DYNARRAY_RESERVE_SIZE(type, array_data, (array_data).m_size, (array_data).m_size + G_ARRAY_GROW_SIZE); \
+ }\
+ type * _pt = GIM_DYNARRAY_POINTER(type, array_data); \
+ memcpy(&_pt[(array_data).m_size], &(item), sizeof(type)); \
+ (array_data).m_size++; \
+} \
+
+//! Inserts an element at the last position
+#define GIM_DYNARRAY_PUSH_EMPTY(type, array_data) \
+{ \
+ if ((array_data).m_reserve_size <= (array_data).m_size) \
+ { \
+ GIM_DYNARRAY_RESERVE_SIZE(type, array_data, (array_data).m_size, (array_data).m_size + G_ARRAY_GROW_SIZE); \
+ } \
+ (array_data).m_size++; \
+} \
+
+//! Inserts an element
+#define GIM_DYNARRAY_INSERT_ITEM(type, array_data, item, index) \
+{ \
+ if ((array_data).m_reserve_size <= (array_data).m_size) \
+ { \
+ GIM_DYNARRAY_RESERVE_SIZE(type, array_data, (array_data).m_size, (array_data).m_size + G_ARRAY_GROW_SIZE); \
+ } \
+ type * _pt = GIM_DYNARRAY_POINTER(type, array_data); \
+ if ((index) < (array_data).m_size - 1) \
+ { \
+ memmove(&_pt[(index) + 1], &_pt[(index)], ((array_data).m_size - (index)) * sizeof(type)); \
+ } \
+ memcpy(&_pt[(index)], &(item), sizeof(type)); \
+ array_data.m_size++; \
+} \
+
+//! Removes an element
+#define GIM_DYNARRAY_DELETE_ITEM(type, array_data, index) \
+{ \
+ if ((index) < (array_data).m_size - 1) \
+ { \
+ type * _pt = GIM_DYNARRAY_POINTER(type, array_data);\
+ memmove(&_pt[(index)], &_pt[(index) + 1], ((array_data).m_size - (index) - 1) * sizeof(type)); \
+ } \
+ (array_data).m_size--; \
+} \
+
+//! Removes an element at the last position
+#define GIM_DYNARRAY_POP_ITEM(array_data) \
+{ \
+ if ((array_data).m_size > 0) \
+ { \
+ (array_data).m_size--; \
+ } \
+}\
+
+//! Destroys the array
+void GIM_DYNARRAY_DESTROY(GDYNAMIC_ARRAY & array_data);
+//! @}
+
+/*! \defgroup BITSET
+\brief
+Bitsets , based on \ref DYNAMIC_ARRAYS .
+<ul>
+<li> For initializes a bitset array, use \ref GIM_BITSET_CREATE or \ref GIM_BITSET_CREATE_SIZED.
+<li> When the bitset is no longer used, must be terminated with the macro \ref GIM_DYNARRAY_DESTROY.
+<li> For putting a mark on the bitset, call \ref GIM_BITSET_SET
+<li> For clearing a mark on the bitset, call \ref GIM_BITSET_CLEAR
+<li> For retrieving a bit value from a bitset, call \ref GIM_BITSET_GET-
+</ul>
+*/
+//! @{
+
+//! Creates a bitset
+#define GIM_BITSET_CREATE(array_data) GIM_DYNARRAY_CREATE(GUINT32, array_data, G_ARRAY_GROW_SIZE)
+
+//! Creates a bitset, with their bits set to 0.
+#define GIM_BITSET_CREATE_SIZED(array_data, bits_count) \
+{ \
+ GUINT32 array_size = (bits_count) / GUINT32_BIT_COUNT + 1; \
+ GIM_DYNARRAY_CREATE(GUINT32, array_data, array_size); \
+ GUINT32 * _pt = GIM_DYNARRAY_POINTER(GUINT32, array_data); \
+ memset(_pt, 0, sizeof(GUINT32) * ((array_data).m_size)); \
+} \
+
+//! Gets the bitset bit count.
+#define GIM_BITSET_SIZE(array_data) ((array_data).m_size * GUINT32_BIT_COUNT)
+
+//! Resizes a bitset, with their bits set to 0.
+#define GIM_BITSET_RESIZE(array_data, new_bits_count) \
+{ \
+ GUINT32 _oldsize = (array_data).m_size; \
+ (array_data).m_size = (new_bits_count) / GUINT32_BIT_COUNT + 1; \
+ if (_oldsize < (array_data).m_size) \
+ { \
+ if ((array_data).m_size > (array_data).m_reserve_size) \
+ { \
+ GIM_DYNARRAY_RESERVE_SIZE(GUINT32, array_data, _oldsize, (array_data).m_size + G_ARRAY_GROW_SIZE); \
+ } \
+ GUINT32 * _pt = GIM_DYNARRAY_POINTER(GUINT32, array_data); \
+ memset(&_pt[_oldsize], 0, sizeof(GUINT32) * ((array_data).m_size - _oldsize)); \
+ } \
+} \
+
+//! Sets all bitset bit to 0.
+#define GIM_BITSET_CLEAR_ALL(array_data) \
+{ \
+ memset((array_data).m_pdata, 0, sizeof(GUINT32) * (array_data).m_size); \
+} \
+
+//! Sets all bitset bit to 1.
+#define GIM_BITSET_SET_ALL(array_data) \
+{ \
+ memset((array_data).m_pdata, 0xFF, sizeof(GUINT32) * (array_data).m_size); \
+} \
+
+///Sets the desired bit to 1
+#define GIM_BITSET_SET(array_data, bit_index) \
+{ \
+ if ((bit_index) >= GIM_BITSET_SIZE(array_data)) \
+ { \
+ GIM_BITSET_RESIZE(array_data, bit_index); \
+ } \
+ GUINT32 * _pt = GIM_DYNARRAY_POINTER(GUINT32, array_data); \
+ _pt[(bit_index) >> GUINT32_EXPONENT] |= (1 << ((bit_index) & (GUINT32_BIT_COUNT - 1))); \
+} \
+
+///Return 0 or 1
+#define GIM_BITSET_GET(array_data, bit_index, get_value) \
+{ \
+ if ((bit_index) >= GIM_BITSET_SIZE(array_data)) \
+ { \
+ (get_value) = 0; \
+ } \
+ else \
+ { \
+ GUINT32 * _pt = GIM_DYNARRAY_POINTER(GUINT32, array_data); \
+ (get_value) = _pt[(bit_index) >> GUINT32_EXPONENT] & (1 << ((bit_index) & (GUINT32_BIT_COUNT - 1))); \
+ } \
+} \
+
+///Sets the desired bit to 0
+#define GIM_BITSET_CLEAR(array_data, bit_index) \
+{ \
+ if ((bit_index) < GIM_BITSET_SIZE(array_data)) \
+ { \
+ GUINT32 * _pt = GIM_DYNARRAY_POINTER(GUINT32, array_data); \
+ _pt[(bit_index) >> GUINT32_EXPONENT] &= ~(1 << ((bit_index) & (GUINT32_BIT_COUNT - 1))); \
+ } \
+} \
+//! @}
+
+/*! \defgroup MEMORY_ACCESS_CONSTANTS
+\brief
+Memory Access constants.
+\sa BUFFERS
+*/
+//! @{
+#define G_MA_READ_ONLY 1
+#define G_MA_WRITE_ONLY 2
+#define G_MA_READ_WRITE 3
+//! @}
+
+/*! \defgroup MEMORY_USAGE_CONSTANTS
+\brief
+Memory usage constants.
+\sa BUFFERS
+*/
+//! @{
+/// Don't care how memory is used
+#define G_MU_EITHER 0
+/// specified once, doesn't allow read information
+#define G_MU_STATIC_WRITE 1
+/// specified once, allows to read information from a shadow buffer
+#define G_MU_STATIC_READ 2
+/// write directly on buffer, allows to read information from a shadow buffer
+#define G_MU_STATIC_READ_DYNAMIC_WRITE 3
+/// upload data to buffer from the shadow buffer, allows to read information from a shadow buffer
+#define G_MU_STATIC_READ_DYNAMIC_WRITE_COPY 4
+/// specified once, allows to read information directly from memory
+#define G_MU_STATIC_WRITE_DYNAMIC_READ 5
+/// write directly on buffer, allows to read information directly from memory
+#define G_MU_DYNAMIC_READ_WRITE 6
+//! @}
+
+/*! \defgroup BUFFER_ERRORS
+\brief
+Buffer operation errors
+\sa BUFFERS
+*/
+//! @{
+#define G_BUFFER_OP_SUCCESS 0
+#define G_BUFFER_OP_INVALID 1
+#define G_BUFFER_OP_STILLREFCOUNTED 2
+//! @}
+
+/*! \defgroup BUFFER_MANAGER_IDS
+\brief
+Buffer manager identifiers
+\sa BUFFERS, BUFFER_MANAGERS
+*/
+//! @{
+enum
+{
+ G_BUFFER_MANAGER_SYSTEM,
+ G_BUFFER_MANAGER_SHARED,
+
+ G_BUFFER_MANAGER__MAX
+};
+//! @}
+
+/*! \defgroup BUFFERS
+\brief
+Buffer operations and structs.
+<ul>
+<li> Before using buffers you must initializes GIMPACT buffer managers by calling \ref gimpact_init.
+<li> For initializes a buffer, use \ref gim_create_buffer, \ref gim_create_buffer_from_data , \ref gim_create_common_buffer, \ref gim_create_common_buffer_from_data or \ref gim_create_shared_buffer_from_data.
+<li> For accessing to the buffer memory, you must call \ref gim_lock_buffer, and then \ref gim_unlock_buffer for finish the access.
+<li> When a buffer is no longer needed, you must free it by calling \ref gim_buffer_free.
+<li> You must call \ref gimpact_terminate when finish your application.
+<li> For a safe manipulation of buffers, use \ref BUFFER_ARRAYS
+</ul>
+\sa BUFFER_MANAGERS, BUFFER_ARRAYS
+*/
+//! @{
+
+struct GBUFFER_MANAGER_DATA;
+
+//! Buffer handle.
+struct GBUFFER_ID
+{
+ GBUFFER_MANAGER_DATA * m_bm_data;
+ GUINT32 m_buffer_id;
+};
+//typedef struct _GBUFFER_ID GBUFFER_ID;
+
+//! Buffer internal data
+struct GBUFFER_DATA
+{
+ GPTR m_buffer_handle;//!< if 0, buffer doesn't exists
+ GUINT32 m_size;
+ GUINT32 m_usage;
+ GINT32 m_access;
+ GUINT32 m_lock_count;
+ char * m_mapped_pointer;
+ GBUFFER_ID m_shadow_buffer;
+ GUINT32 m_refcount;//! Reference counting for safe garbage collection
+};
+//typedef struct _GBUFFER_DATA GBUFFER_DATA;
+//! @}
+
+/*! \defgroup BUFFERS_MANAGER_PROTOTYPES
+\brief
+Function prototypes to allocate and free memory for buffers
+\sa BUFFER_MANAGERS, BUFFERS
+*/
+//! @{
+
+//! Returns a Buffer handle
+typedef GPTR gim_buffer_alloc_function(GUINT32 size,int usage);
+
+//! Returns a Buffer handle, and copies the pdata to the buffer
+typedef GPTR gim_buffer_alloc_data_function(const void * pdata,GUINT32 size,int usage);
+
+//! Changes the size of the buffer preserving the content, and returns the new buffer id
+typedef GPTR gim_buffer_realloc_function(GPTR buffer_handle,GUINT32 oldsize,int old_usage,GUINT32 newsize,int new_usage);
+
+//! It changes the m_buffer_handle member to 0/0
+typedef void gim_buffer_free_function(GPTR buffer_handle,GUINT32 size);
+
+//! It maps the m_mapped_pointer. Returns a pointer
+typedef char * gim_lock_buffer_function(GPTR buffer_handle,int access);
+
+//! It sets the m_mapped_pointer to 0
+typedef void gim_unlock_buffer_function(GPTR buffer_handle);
+
+typedef void gim_download_from_buffer_function(
+ GPTR source_buffer_handle,
+ GUINT32 source_pos,
+ void * destdata,
+ GUINT32 copysize);
+
+typedef void gim_upload_to_buffer_function(
+ GPTR dest_buffer_handle,
+ GUINT32 dest_pos,
+ void * sourcedata,
+ GUINT32 copysize);
+
+typedef void gim_copy_buffers_function(
+ GPTR source_buffer_handle,
+ GUINT32 source_pos,
+ GPTR dest_buffer_handle,
+ GUINT32 dest_pos,
+ GUINT32 copysize);
+//! @}
+
+
+/*! \defgroup BUFFER_MANAGERS
+\brief
+Buffer Manager operations
+*/
+//! @{
+//! Buffer manager prototype
+struct GBUFFER_MANAGER_PROTOTYPE
+{
+ gim_buffer_alloc_function * alloc_fn;
+ gim_buffer_alloc_data_function *alloc_data_fn;
+ gim_buffer_realloc_function * realloc_fn;
+ gim_buffer_free_function * free_fn;
+ gim_lock_buffer_function * lock_buffer_fn;
+ gim_unlock_buffer_function * unlock_buffer_fn;
+ gim_download_from_buffer_function * download_from_buffer_fn;
+ gim_upload_to_buffer_function * upload_to_buffer_fn;
+ gim_copy_buffers_function * copy_buffers_fn;
+};
+//typedef struct _GBUFFER_MANAGER_PROTOTYPE GBUFFER_MANAGER_PROTOTYPE;
+
+//! Buffer manager
+struct GBUFFER_MANAGER_DATA
+{
+ GDYNAMIC_ARRAY m_buffer_array;//!< Array of GBUFFER_DATA objects
+ GDYNAMIC_ARRAY m_free_positions;//!< Array of GUINT elements. Free positions
+ const GBUFFER_MANAGER_PROTOTYPE *m_prototype;//!< Prototype of functions
+ GUINT32 m_buffer_manager_id;//!< Buffer manager id
+};
+//typedef struct _GBUFFER_MANAGER_DATA GBUFFER_MANAGER_DATA;
+
+//! Checks if buffer manager is used
+int gim_is_buffer_manager_active(GBUFFER_MANAGER_DATA buffer_managers[],
+ GUINT32 buffer_manager_id);
+//! Adds a buffer Manager to the Memory Singleton
+void gim_create_buffer_manager(GBUFFER_MANAGER_DATA buffer_managers[],
+ GUINT32 buffer_manager_id);
+//! Destroys a buffer manager
+void gim_destroy_buffer_manager(GBUFFER_MANAGER_DATA buffer_managers[], GUINT32 buffer_manager_id);
+void gim_get_buffer_manager_data(GBUFFER_MANAGER_DATA buffer_managers[],
+ GUINT32 buffer_manager_id,GBUFFER_MANAGER_DATA ** pbm_data);
+void gim_init_buffer_managers(GBUFFER_MANAGER_DATA buffer_managers[]);
+void gim_terminate_buffer_managers(GBUFFER_MANAGER_DATA buffer_managers[]);
+
+//! @}
+
+
+/*! \addtogroup BUFFERS
+*/
+//! @{
+
+//!Creates a buffer on the buffer manager specified by buffer_manager_id
+/*!
+\param buffer_manager_id
+\param buffer_size
+\param usage An usage constant. Use G_MU_DYNAMIC_READ_WRITE as default.
+\param buffer_id a pointer for receive the new buffer id
+\return An error code. 0 if success.
+\post m_refcount = 0
+*/
+GUINT32 gim_create_buffer(
+ GBUFFER_MANAGER_DATA buffer_managers[],
+ GUINT32 buffer_manager_id,
+ GUINT32 buffer_size,
+ int usage,
+ GBUFFER_ID * buffer_id);
+
+//!Creates a buffer on the buffer manager specified by buffer_manager_id
+/*!
+\param buffer_manager_id
+\param pdata Data for allocating
+\param buffer_size Size of the data buffer
+\param usage An usage constant. Use G_MU_DYNAMIC_READ_WRITE as default.
+\param buffer_id a pointer for receive the new buffer id
+\return An error code. 0 if success.
+\post m_refcount = 0
+*/
+GUINT32 gim_create_buffer_from_data(
+ GBUFFER_MANAGER_DATA buffer_managers[],
+ GUINT32 buffer_manager_id,
+ const void * pdata,
+ GUINT32 buffer_size,
+ int usage,
+ GBUFFER_ID * buffer_id);
+
+//!Allocates on the G_BUFFER_MANAGER_SYSTEM
+GUINT32 gim_create_common_buffer(GBUFFER_MANAGER_DATA buffer_managers[],
+ GUINT32 buffer_size, GBUFFER_ID * buffer_id);
+//!Allocates on the G_BUFFER_MANAGER_SYSTEM, and copies the data
+GUINT32 gim_create_common_buffer_from_data(GBUFFER_MANAGER_DATA buffer_managers[],
+ const void * pdata, GUINT32 buffer_size, GBUFFER_ID * buffer_id);
+//!Creates a buffer with shared data
+GUINT32 gim_create_shared_buffer_from_data(GBUFFER_MANAGER_DATA buffer_managers[],
+ const void * pdata, GUINT32 buffer_size, GBUFFER_ID * buffer_id);
+
+
+//! Add reference counting to buffer.
+GINT32 gim_buffer_add_ref(GBUFFER_ID * buffer_id);
+
+//! Function for resize buffer, preserving the content
+/*!
+\param buffer_id
+\param newsize
+\return An error code. 0 if success.
+\post If m_refcount>0 then it decrements it.
+*/
+GINT32 gim_buffer_realloc(GBUFFER_ID * buffer_id,GUINT32 newsize);
+
+//! Eliminates the buffer.
+/*!
+If the buffer reference counting is <= 1 and is unlocked, then it eliminates the buffer.
+*/
+GINT32 gim_buffer_free(GBUFFER_ID * buffer_id);
+
+//! Locks the buffer for memory access.
+/*!
+\param buffer_id Id from buffer.
+\param access Must have the following values: G_MA_READ_ONLY,G_MA_WRITE_ONLY or G_MA_READ_WRITE.
+\param map_pointer Dest Pointer of the memory address from buffer.
+\post m_lock_count increases.
+*/
+GINT32 gim_lock_buffer(GBUFFER_ID * buffer_id,int access,char ** map_pointer);
+
+//! Unlocks the buffer for memory access.
+GINT32 gim_unlock_buffer(GBUFFER_ID * buffer_id);
+
+//! Gets the buffer size in bytes
+GINT32 gim_get_buffer_size(GBUFFER_ID * buffer_id,GUINT32 * buffer_size);
+
+//! Determines if the buffer is locked
+GINT32 gim_get_buffer_is_locked(GBUFFER_ID * buffer_id,GUINT32 * lock_count);
+
+//! Copies the content of the buffer to a dest pointer
+GINT32 gim_download_from_buffer(
+ GBUFFER_ID * buffer_id,
+ GUINT32 source_pos,
+ void * destdata,
+ GUINT32 copysize);
+
+//! Copies the content of a memory pointer to the buffer
+GINT32 gim_upload_to_buffer(
+ GBUFFER_ID * buffer_id,
+ GUINT32 dest_pos,
+ void * sourcedata,
+ GUINT32 copysize);
+
+//! Copies two buffers.
+GINT32 gim_copy_buffers(
+ GBUFFER_ID * source_buffer_id,
+ GUINT32 source_pos,
+ GBUFFER_ID * dest_buffer_id,
+ GUINT32 dest_pos,
+ GUINT32 copysize);
+//! @}
+
+
+/*! \defgroup BUFFER_ARRAYS
+
+\brief
+Buffered Arrays, for manip elements on a buffer and treat it as an array.
+<ul>
+<li> Before using buffer arrays you must initializes GIMPACT buffer managers by calling gimpact_init.
+<li> Before creating buffer arrays, you must create a buffer. see \ref BUFFERS.
+<li> Create a buffer narray by calling \ref GIM_BUFFER_ARRAY_INIT_TYPE, \ref GIM_BUFFER_ARRAY_INIT_TYPE_OFFSET or \ref GIM_BUFFER_ARRAY_INIT_OFFSET_STRIDE.
+<li> For accessing to the array elements, you must call \ref gim_buffer_array_lock, and then \ref gim_buffer_array_unlock for finish the access.
+<li> When a buffer array is no longer needed, you must free it by calling \ref GIM_BUFFER_ARRAY_DESTROY.
+</ul>
+The following example shows how Buffer arrays can be used:
+
+\code
+int main()
+{
+ //init gimpact
+ gimpact_init();
+
+ //Buffer handle to use
+ GBUFFER_ID bufferhandle;
+
+ //Create a memory buffer of 100 float numbers
+ gim_create_common_buffer(100*sizeof(float), &bufferhandle);
+
+ //Create a buffer array from the bufferhandle
+ GBUFFER_ARRAY buffer_float_array;
+ GIM_BUFFER_ARRAY_INIT_TYPE(float,buffer_float_array,bufferhandle,100);
+
+ ////Access to the buffer data, set all elements of the array
+
+ int i, count;
+ count = buffer_float_array.m_element_count;
+ //Locks the array
+ gim_buffer_array_lock(&buffer_float_array,G_MA_READ_WRITE);
+ float * pelements = GIM_BUFFER_ARRAY_POINTER(float, buffer_float_array, 0); // A pointer to the buffer memory
+
+ //fill the array with random numbers
+ for (i = 0;i < count;i++ )
+ {
+ pelements[i] = gim_unit_random();
+ }
+ //unlock buffer
+ gim_buffer_array_unlock(&buffer_float_array);
+
+ //Program code
+ ....
+ ....
+
+ //Destroy array
+ GIM_BUFFER_ARRAY_DESTROY(buffer_float_array);
+
+ //terminate gimpact
+ gimpact_terminate();
+}
+\endcode
+
+\sa BUFFERS
+*/
+//! @{
+
+//! Buffer managed array struct.
+struct GBUFFER_ARRAY
+{
+ GBUFFER_ID m_buffer_id;
+ char * m_buffer_data;
+ char m_byte_stride;
+ GUINT32 m_byte_offset;
+ GUINT32 m_element_count;
+};
+//typedef struct _GBUFFER_ARRAY GBUFFER_ARRAY;
+
+//! Sets offset for a buffered array.
+#define GIM_BUFFER_ARRAY_SET_OFFSET(_array_data,_offset) (_array_data).m_byte_offset = (_offset)*(_array_data).m_byte_stride;
+
+//! Sets offset for a buffered array.
+#define GIM_BUFFER_ARRAY_GET_OFFSET(_array_data,_offset) (_offset) = (_array_data).m_byte_offset/(_array_data).m_byte_stride;
+
+//!Return a pointer of the element at the _index
+#define GIM_BUFFER_ARRAY_POINTER(_type,_array_data,_index) (_type *)((_array_data).m_buffer_data + (_index)*(_array_data).m_byte_stride)
+
+//! Sets stride for a buffered array.
+#define GIM_BUFFER_ARRAY_SET_STRIDE(_type,_array_data) (_array_data).m_byte_stride = sizeof(_type);
+
+//! Is array stride equal to the size of the type ?
+#define GIM_BUFFER_ARRAY_IS_ALIGNED(_type,_array_data) ((_array_data).m_byte_stride == sizeof(_type))
+
+///Verify if two arrays have the same data
+#define GIM_BUFFER_ARRAY_ARE_SAME(_array_data1,_array_data2,aresame) \
+{ \
+ (aresame) = 1; \
+ if ((_array_data1).m_buffer_id.m_buffer_id != (_array_data2).m_buffer_id.m_buffer_id || (_array_data1).m_buffer_id.m_buffer_manager_id != (_array_data2).m_buffer_id.m_buffer_manager_id || (_array_data1).m_byte_offset != (_array_data2).m_byte_offset) \
+ { \
+ (aresame) = 0; \
+ } \
+} \
+
+//! Reserve size for a buffered array.
+/*!
+\pre array_data must be unlocked, and must be the aligned (GIM_BUFFER_ARRAY_IS_ALIGNED )
+*/
+#define GIM_BUFFER_ARRAY_RESERVE_SIZE(type, array_data, reserve_size) \
+{ \
+ if ((reserve_size) > (array_data).m_element_count) \
+ { \
+ GUINT32 _buffer_size, _newarray_size; \
+ gim_get_buffer_size(&(array_data).m_buffer_id, _buffer_size); \
+ _newarray_size = (reserve_size) * (array_data).m_byte_stride; \
+ if(_newarray_size > _buffer_size) \
+ { \
+ _newarray_size += G_ARRAY_GROW_SIZE * (array_data).m_byte_stride; \
+ gim_buffer_realloc(&(array_data).m_buffer_id, _newarray_size); \
+ } \
+ } \
+} \
+
+//! Pushes an element at last position
+/*!
+\pre array_data must be unlocked, and must be the aligned (GIM_BUFFER_ARRAY_IS_ALIGNED )
+*/
+#define GIM_BUFFER_ARRAY_PUSH_ITEM(type, array_data, item) \
+{ \
+ GIM_BUFFER_ARRAY_RESERVE_SIZE(type, array_data, (array_data).m_element_count + 1); \
+ gim_buffer_array_lock(&(array_data), G_MA_WRITE_ONLY); \
+ type * _pt = GIM_BUFFER_ARRAY_POINTER(type, array_data, (array_data).m_element_count); \
+ memcpy(_pt, &(item), sizeof(type)); \
+ gim_buffer_array_unlock(&(array_data)); \
+ (array_data)->m_element_count++; \
+} \
+
+//! Pushes a new element at last position
+/*!
+\pre array_data must be unlocked, and must be the aligned (GIM_BUFFER_ARRAY_IS_ALIGNED )
+*/
+#define GIM_BUFFER_ARRAY_PUSH_EMPTY(type, array_data) \
+{\
+ GIM_BUFFER_ARRAY_RESERVE_SIZE(type, array_data, (array_data).m_element_count + 1); \
+ (array_data)->m_element_count++; \
+}\
+
+//! Inserts an element
+/*!
+\pre array_data must be unlocked, and must be the aligned (GIM_BUFFER_ARRAY_IS_ALIGNED )
+*/
+#define GIM_BUFFER_ARRAY_INSERT_ITEM(type, array_data, item, index) \
+{ \
+ GIM_BUFFER_ARRAY_RESERVE_SIZE(type, array_data, (array_data).m_element_count + 1); \
+ gim_buffer_array_lock(&(array_data), G_MA_WRITE_ONLY); \
+ type * _pt = GIM_BUFFER_ARRAY_POINTER(type, array_data, 0); \
+ if ((index) < (array_data)->m_element_count - 1) \
+ { \
+ memmove(&_pt[(index) + 1], &_pt[(index)], ((array_data).m_element_count - (index)) * sizeof(type)); \
+ } \
+ memcpy(&_pt[(index)], &(item), sizeof(type)); \
+ gim_buffer_array_unlock(&(array_data)); \
+ (array_data).m_element_count++; \
+} \
+
+//! Deletes an element
+/*!
+\pre array_data must be unlocked, and must be the aligned (GIM_BUFFER_ARRAY_IS_ALIGNED )
+*/
+#define GIM_BUFFER_ARRAY_DELETE_ITEM(type, array_data, index) \
+{ \
+ if ((index) < (array_data).m_element_count - 1) \
+ { \
+ gim_buffer_array_lock(&(array_data), G_MA_WRITE_ONLY); \
+ type * _pt = GIM_BUFFER_ARRAY_POINTER(type, array_data, 0); \
+ memmove(&_pt[(index)], &_pt[(index) + 1],((array_data).m_element_count - (index) - 1) * sizeof(type)); \
+ gim_buffer_array_unlock(&(array_data)); \
+ } \
+ (array_data).m_element_count--; \
+} \
+
+//! Deletes an element at last position
+/*!
+\pre array_data must be unlocked, and must be the aligned (GIM_BUFFER_ARRAY_IS_ALIGNED )
+*/
+#define GIM_BUFFER_ARRAY_POP_ITEM(array_data) \
+{ \
+ if ((array_data).m_element_count > 0) \
+ { \
+ (array_data).m_element_count--; \
+ } \
+} \
+
+
+//! Initializes an GBUFFER_ARRAY object from a buffer ID
+/*!
+m_buffer_data will be 0, for acces to the elements, you'd need to call lock_array
+\param array_data Array structure to be filled
+\param buffer_id A GBUFFER_ID structure which this array_daya will refer to
+\param element_count Number of elements
+\param offset element offset, it isn't byte offset. 0 is recomended
+\param byte_stride size of each element. 0 is recomended.
+\post Adds reference to the buffer
+\sa gim_buffer_add_ref
+*/
+#define GIM_BUFFER_ARRAY_INIT_OFFSET_STRIDE(array_data, buffer_id, element_count, offset, byte_stride) \
+{ \
+ (array_data).m_buffer_id.m_buffer_id = (buffer_id).m_buffer_id; \
+ (array_data).m_buffer_id.m_buffer_manager_id = (buffer_id).m_buffer_manager_id; \
+ (array_data).m_buffer_data = 0; \
+ (array_data).m_element_count = (element_count); \
+ (array_data).m_byte_stride = (byte_stride); \
+ GIM_BUFFER_ARRAY_SET_OFFSET(array_data, offset); \
+ gim_buffer_add_ref(&(buffer_id)); \
+} \
+
+//! Initializes an GBUFFER_ARRAY object from a buffer ID and a Given type
+/*!
+m_buffer_data will be 0, for acces to the elements, you'd need to call lock_array
+\param type Type of the Array. It determines the stride.
+\param array_data Array structure to be filled
+\param buffer_id A GBUFFER_ID structure which this array_daya will refer to
+\param element_count Number of elements
+\param offset element offset, it isn't byte offset. 0 is recomended
+\post Adds reference to the buffer
+\sa gim_buffer_add_ref
+*/
+#define GIM_BUFFER_ARRAY_INIT_TYPE_OFFSET(type, array_data, buffer_id, element_count, offset) \
+{ \
+ (array_data).m_buffer_id.m_buffer_id = (buffer_id).m_buffer_id; \
+ (array_data).m_buffer_id.m_bm_data = (buffer_id).m_bm_data; \
+ (array_data).m_buffer_data = 0; \
+ (array_data).m_element_count = (element_count);\
+ GIM_BUFFER_ARRAY_SET_STRIDE(type, array_data); \
+ GIM_BUFFER_ARRAY_SET_OFFSET(array_data, offset); \
+ gim_buffer_add_ref(&(buffer_id)); \
+}\
+
+//! Initializes a buffer array giving a data type and a buffer id
+/*!
+m_buffer_data will be 0, for acces to the elements, you'd need to call lock_array.
+\param type Type of the Array. It determines the stride.
+\param array_data Array structure to be filled
+\param buffer_id A GBUFFER_ID structure which this array_daya will refer to
+\param element_count Number of elements
+\post Adds reference to the buffer
+\sa gim_buffer_add_ref
+*/
+#define GIM_BUFFER_ARRAY_INIT_TYPE(type, array_data, buffer_id, element_count) GIM_BUFFER_ARRAY_INIT_TYPE_OFFSET(type, array_data, buffer_id, element_count, 0)
+
+//! Gain access to the array buffer through the m_buffer_data element
+/*!
+m_buffer_data pointer will be located at the m_byte_offset position of the buffer m_buffer
+Then, You'd need to call unlock_array when finish to using the array access.
+
+\pre if m_buffer_data != 0, the function returns
+\param array_data Array structure to be locked
+\param access A constant for access to the buffer. can be G_MA_READ_ONLY,G_MA_WRITE_ONLY or G_MA_READ_WRITE
+\return an Buffer error code
+*/
+GINT32 gim_buffer_array_lock(GBUFFER_ARRAY * array_data, int access);
+
+//! close the access to the array buffer through the m_buffer_data element
+/*!
+\param array_data Array structure to be locked
+\return an Buffer error code
+*/
+GINT32 gim_buffer_array_unlock(GBUFFER_ARRAY * array_data);
+
+//! Copy an array by reference
+/*!
+\post A reference to the m_buffer_id is increased.
+*/
+void gim_buffer_array_copy_ref(GBUFFER_ARRAY * source_data,GBUFFER_ARRAY * dest_data);
+
+
+//! Copy an array by value
+/*!
+\post A new buffer is created
+*/
+void gim_buffer_array_copy_value(GBUFFER_ARRAY * source_data,
+ GBUFFER_MANAGER_DATA dest_buffer_managers[],GBUFFER_ARRAY * dest_data,
+ GUINT32 buffer_manager_id,int usage);
+
+//! Destroys an GBUFFER_ARRAY object
+/*!
+\post Attemps to destroy the buffer, decreases reference counting
+*/
+void GIM_BUFFER_ARRAY_DESTROY(GBUFFER_ARRAY & array_data);
+
+//! Copy the content of the array to a pointer
+/*!
+\pre dest_data must have the same size as the array_data
+\param type
+\param array_data A GBUFFERED_ARRAY structure
+\param dest_data A type pointer
+*/
+#define GIM_BUFFER_ARRAY_DOWNLOAD(type,array_data,dest_data) \
+{ \
+ if (GIM_BUFFER_ARRAY_IS_ALIGNED(type, array_data)) \
+ { \
+ gim_download_from_buffer(&(array_data).m_buffer_id, (array_data).m_byte_offset, (void *)(dest_data), (array_data).m_element_count * (array_data).m_byte_stride); \
+ } \
+ else \
+ { \
+ GUINT32 _k_, _ecount_= (array_data).m_element_count; \
+ type * _source_vert_; \
+ type * _dest_vert_ = (dest_data); \
+ gim_buffer_array_lock(&(array_data), G_MA_READ_ONLY); \
+ for (_k_ = 0; _k_ < _ecount_; _k_++) \
+ { \
+ _source_vert_ = GIM_BUFFER_ARRAY_POINTER(type, array_data, _k_); \
+ memcpy(_dest_vert_, _source_vert_, sizeof(type)); \
+ _dest_vert_++; \
+ } \
+ gim_buffer_array_unlock(&(array_data)); \
+ } \
+} \
+
+//! Upload the content of a a pointer to a buffered array
+/*!
+\pre source_data must have the same size as the array_data
+\param type
+\param array_data A GBUFFERED_ARRAY structure
+\param source_data A void pointer
+*/
+#define GIM_BUFFER_ARRAY_UPLOAD(type, array_data, source_data) \
+{ \
+ if (GIM_BUFFER_ARRAY_IS_ALIGNED(type, array_data)) \
+ { \
+ gim_upload_to_buffer(&(array_data).m_buffer_id, (array_data).m_byte_offset, (void *)(source_data), (array_data).m_element_count * (array_data).m_byte_stride); \
+ } \
+ else \
+ { \
+ GUINT32 _k_, _ecount_= (array_data).m_element_count; \
+ type * _source_vert_ = (source_data); \
+ type * _dest_vert_; \
+ gim_buffer_array_lock(&(array_data), G_MA_WRITE_ONLY); \
+ for (_k_ = 0; _k_ < _ecount_; _k_++) \
+ { \
+ _dest_vert_ = GIM_BUFFER_ARRAY_POINTER(type, array_data, _k_); \
+ memcpy(_dest_vert_, _source_vert_, sizeof(type)); \
+ _source_vert_++; \
+ } \
+ gim_buffer_array_unlock(&(array_data)); \
+ } \
+} \
+
+
+//!Kernel function prototype for process streams, given a buffered array as source and
+/*!
+\param 1 the uniform arguments
+\param 2 the source stream
+\param 3 the destination stream
+*/
+typedef void (* gim_kernel_func)(void *,GBUFFER_ARRAY *,GBUFFER_ARRAY *);
+
+//! Generic Stream Processingp loop
+/*!
+
+This macro executes a kernel macro or function for each element of the streams
+\pre _src_array->m_count <= _dst_array->m_count
+
+\param _uniform_data An argument to be passed to the Kernel function
+\param _src_array An GBUFFER_ARRAY structure passed as the source stream
+\param _dst_array An GBUFFER_ARRAY structure passed as the source stream
+\param _kernel Macro or function of the kernel
+\param _src_type Required. Type of all elements of the source stream
+\param _dst_type Required. Type of all elements of the dest stream
+*/
+#define GIM_PROCESS_BUFFER_ARRAY(_uniform_data, _src_array, _dst_array, _kernel, _src_type, _dst_type) \
+{ \
+\
+ gim_buffer_array_lock(&(_src_array), G_MA_READ_ONLY); \
+ gim_buffer_array_lock(&(_dst_array), G_MA_WRITE_ONLY); \
+\
+ GUINT32 _i_, _count_=(_src_array).m_element_count; \
+\
+ _src_type * _source_vert_; \
+ _dst_type * _dest_vert_; \
+ if (GIM_BUFFER_ARRAY_IS_ALIGNED(_src_type, _src_array) && GIM_BUFFER_ARRAY_IS_ALIGNED(_dst_type, _dst_array)) \
+ { \
+\
+ _source_vert_ = GIM_BUFFER_ARRAY_POINTER(_src_type, _src_array, 0); \
+ _dest_vert_ = GIM_BUFFER_ARRAY_POINTER(_dst_type, _dst_array, 0); \
+ for (_i_ = 0;_i_< _count_; _i_++) \
+ { \
+ _kernel(_uniform_data, *_source_vert_, *_dest_vert_); \
+ _source_vert_++; \
+ _dest_vert_++; \
+ } \
+ } \
+ else \
+ { \
+ for (_i_ = 0; _i_ < _count_; _i_++) \
+ { \
+ _source_vert_ = GIM_BUFFER_ARRAY_POINTER(_src_type, _src_array, _i_); \
+ _dest_vert_ = GIM_BUFFER_ARRAY_POINTER(_dst_type, _dst_array, _i_); \
+ _kernel(_uniform_data, *_source_vert_, *_dest_vert_); \
+ } \
+ } \
+ gim_buffer_array_unlock(&(_src_array)); \
+ gim_buffer_array_unlock(&(_dst_array)); \
+} \
+
+//! @}
+
+#endif // GIM_MEMORY_H_INCLUDED
diff --git a/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_radixsort.h b/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_radixsort.h
new file mode 100644
index 0000000..8572b92
--- /dev/null
+++ b/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_radixsort.h
@@ -0,0 +1,258 @@
+#ifndef GIM_RADIXSORT_H_INCLUDED
+#define GIM_RADIXSORT_H_INCLUDED
+/*! \file gim_radixsort.h
+\author Francisco León.
+Based on the work of Michael Herf : "fast floating-point radix sort"
+Avaliable on http://www.stereopsis.com/radix.html
+*/
+/*
+-----------------------------------------------------------------------------
+This source file is part of GIMPACT Library.
+
+For the latest info, see http://gimpact.sourceforge.net/
+
+Copyright (c) 2006 Francisco Leon. C.C. 80087371.
+email: projectileman@yahoo.com
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of EITHER:
+ (1) The GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 2.1 of the License, or (at
+ your option) any later version. The text of the GNU Lesser
+ General Public License is included with this library in the
+ file GIMPACT-LICENSE-LGPL.TXT.
+ (2) The BSD-style license that is included with this library in
+ the file GIMPACT-LICENSE-BSD.TXT.
+
+ This library 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 files
+ GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details.
+
+-----------------------------------------------------------------------------
+*/
+
+#include "GIMPACT/gim_memory.h"
+
+/*! \defgroup SORTING
+\brief
+Macros for sorting.
+*/
+//! @{
+struct GIM_RSORT_TOKEN
+{
+ GUINT32 m_key;
+ GUINT32 m_value;
+};
+//typedef struct _GIM_RSORT_TOKEN GIM_RSORT_TOKEN;
+
+//comparator for sorting
+#define RSORT_TOKEN_COMPARATOR(x, y) ((int)((x.m_key) - (y.m_key)))
+
+// ---- utils for accessing 11-bit quantities
+#define D11_0(x) (x & 0x7FF)
+#define D11_1(x) (x >> 11 & 0x7FF)
+#define D11_2(x) (x >> 22 )
+
+
+//COMMON FUNCTIONS FOR ACCESSING THE KEY OF AN ELEMENT
+
+
+//For the type of your array, you need to declare a macro for obtaining the key, like these:
+#define SIMPLE_GET_FLOAT32KEY(e,key) {key =(GREAL)(e);}
+
+#define SIMPLE_GET_INTKEY(e,key) {key =(GINT32)(e);}
+
+#define SIMPLE_GET_UINTKEY(e,key) {key =(GUINT32)(e);}
+
+//For the type of your array, you need to declare a macro for copy elements, like this:
+
+#define SIMPLE_COPY_ELEMENTS(dest,src) {dest = src;}
+
+#define kHist 2048
+
+///Radix sort for unsigned integer keys
+
+#define GIM_RADIX_SORT_RTOKENS(array,sorted,element_count)\
+{\
+ GUINT32 i;\
+ GUINT32 b0[kHist * 3];\
+ GUINT32 *b1 = b0 + kHist;\
+ GUINT32 *b2 = b1 + kHist;\
+ for (i = 0; i < kHist * 3; i++)\
+ {\
+ b0[i] = 0;\
+ }\
+ GUINT32 fi;\
+ GUINT32 pos;\
+ for (i = 0; i < element_count; i++)\
+ {\
+ fi = array[i].m_key;\
+ b0[D11_0(fi)] ++;\
+ b1[D11_1(fi)] ++;\
+ b2[D11_2(fi)] ++;\
+ }\
+ {\
+ GUINT32 sum0 = 0, sum1 = 0, sum2 = 0;\
+ GUINT32 tsum;\
+ for (i = 0; i < kHist; i++)\
+ {\
+ tsum = b0[i] + sum0;\
+ b0[i] = sum0 - 1;\
+ sum0 = tsum;\
+ tsum = b1[i] + sum1;\
+ b1[i] = sum1 - 1;\
+ sum1 = tsum;\
+ tsum = b2[i] + sum2;\
+ b2[i] = sum2 - 1;\
+ sum2 = tsum;\
+ }\
+ }\
+ for (i = 0; i < element_count; i++)\
+ {\
+ fi = array[i].m_key;\
+ pos = D11_0(fi);\
+ pos = ++b0[pos];\
+ sorted[pos].m_key = array[i].m_key;\
+ sorted[pos].m_value = array[i].m_value;\
+ }\
+ for (i = 0; i < element_count; i++)\
+ {\
+ fi = sorted[i].m_key;\
+ pos = D11_1(fi);\
+ pos = ++b1[pos];\
+ array[pos].m_key = sorted[i].m_key;\
+ array[pos].m_value = sorted[i].m_value;\
+ }\
+ for (i = 0; i < element_count; i++)\
+ {\
+ fi = array[i].m_key;\
+ pos = D11_2(fi);\
+ pos = ++b2[pos];\
+ sorted[pos].m_key = array[i].m_key;\
+ sorted[pos].m_value = array[i].m_value;\
+ }\
+}\
+
+/// Get the sorted tokens from an array. For generic use. Tokens are GIM_RSORT_TOKEN
+#define GIM_RADIX_SORT_ARRAY_TOKENS(array, sorted_tokens, element_count, get_uintkey_macro)\
+{\
+ GIM_RSORT_TOKEN * _unsorted = (GIM_RSORT_TOKEN *) gim_alloc(sizeof(GIM_RSORT_TOKEN )*element_count);\
+ GUINT32 _i;\
+ for (_i=0;_i<element_count;_i++)\
+ {\
+ get_uintkey_macro(array[_i],_unsorted[_i].m_key);\
+ _unsorted[_i].m_value = _i;\
+ }\
+ GIM_RADIX_SORT_RTOKENS(_unsorted,sorted_tokens,element_count);\
+ gim_free(_unsorted,sizeof(GIM_RSORT_TOKEN )*element_count);\
+}\
+
+/// Sorts array in place. For generic use
+#define GIM_RADIX_SORT(type,array,element_count,get_uintkey_macro,copy_elements_macro)\
+{\
+ GIM_RSORT_TOKEN * _sorted = (GIM_RSORT_TOKEN *) gim_alloc(sizeof(GIM_RSORT_TOKEN )*element_count);\
+ GIM_RADIX_SORT_ARRAY_TOKENS(array,_sorted,element_count,get_uintkey_macro);\
+ type * _original_array = (type *) gim_alloc(sizeof(type)*element_count); \
+ memcpy(_original_array,array,sizeof(type)*element_count);\
+ GUINT32 _i;\
+ for (_i=0;_i<element_count;_i++)\
+ {\
+ copy_elements_macro(array[_i],_original_array[_sorted[_i].m_value]);\
+ }\
+ gim_free(_original_array,sizeof(type)*element_count);\
+ gim_free(_sorted,sizeof(GIM_RSORT_TOKEN )*element_count);\
+}\
+
+/// Sorts array in place using quick sort
+#define GIM_QUICK_SORT_ARRAY(type, array, array_count, comp_macro, exchange_macro) \
+{\
+ GINT32 _i_, _j_, _p_, _stack_index_, _start_, _end_;\
+ GINT32 _start_stack_[64]; \
+ GINT32 _end_stack_[64];\
+ _start_stack_[0] = 0;\
+ _end_stack_[0] = (array_count);\
+ _stack_index_ = 1;\
+ while (_stack_index_ > 0)\
+ {\
+ _stack_index_ --;\
+ _start_ = _start_stack_[_stack_index_];\
+ _end_ = _end_stack_[_stack_index_];\
+ while (_end_ - _start_ > 2)\
+ {\
+ _p_ = _start_;\
+ _i_ = _start_ + 1;\
+ _j_ = _end_ - 1;\
+ while (_i_<_j_) \
+ {\
+ for(; _i_<=_j_ && comp_macro(((array)[_i_]),((array)[_p_]))<=0; _i_++) ;\
+ if (_i_ > _j_) \
+ {\
+ exchange_macro(type, array, _j_, _p_);\
+ _i_ = _j_;\
+ }\
+ else\
+ {\
+ for(; _i_<=_j_ && comp_macro(((array)[_j_]),((array)[_p_]))>=0; _j_--) ;\
+ if (_i_ > _j_) \
+ {\
+ exchange_macro(type, array, _j_, _p_);\
+ _i_ = _j_;\
+ }\
+ else if (_i_ < _j_)\
+ {\
+ exchange_macro(type, array, _i_, _j_);\
+ if (_i_+2 < _j_) {_i_++; _j_--;}\
+ else if (_i_+1 < _j_) _i_++;\
+ }\
+ }\
+ }\
+ if (_i_-_start_ > 1 && _end_-_j_ > 1) \
+ {\
+ if (_i_-_start_ < _end_-_j_-1) \
+ {\
+ _start_stack_[_stack_index_] = _j_+1;\
+ _end_stack_[_stack_index_] = _end_;\
+ _stack_index_ ++;\
+ _end_ = _i_;\
+ }\
+ else\
+ {\
+ _start_stack_[_stack_index_] = _start_;\
+ _end_stack_[_stack_index_] = _i_;\
+ _stack_index_ ++;\
+ _start_ = _j_+1;\
+ }\
+ }\
+ else\
+ {\
+ if (_i_-_start_ > 1)\
+ {\
+ _end_ = _i_;\
+ }\
+ else \
+ {\
+ _start_ = _j_+1;\
+ }\
+ }\
+ }\
+ if (_end_ - _start_ == 2) \
+ {\
+ if (comp_macro(((array)[_start_]),((array)[_end_-1])) > 0) \
+ {\
+ exchange_macro(type, array, _start_, _end_-1);\
+ }\
+ }\
+ }\
+}\
+
+#define GIM_DEF_EXCHANGE_MACRO(type, _array, _i, _j)\
+{\
+ type _e_tmp_ =(_array)[(_i)];\
+ (_array)[(_i)]=(_array)[(_j)];\
+ (_array)[(_j)]= _e_tmp_;\
+}\
+
+#define GIM_COMP_MACRO(x, y) ((GINT32)((x) - (y)))
+//! @}
+#endif // GIM_RADIXSORT_H_INCLUDED
diff --git a/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_tri_capsule_collision.h b/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_tri_capsule_collision.h
new file mode 100644
index 0000000..2b31604
--- /dev/null
+++ b/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_tri_capsule_collision.h
@@ -0,0 +1,111 @@
+#ifndef GIM_TRI_CAPSULE_COLLISION_H_INCLUDED
+#define GIM_TRI_CAPSULE_COLLISION_H_INCLUDED
+
+/*! \file gim_tri_capsule_collision.h
+\author Francisco León
+*/
+/*
+-----------------------------------------------------------------------------
+This source file is part of GIMPACT Library.
+
+For the latest info, see http://gimpact.sourceforge.net/
+
+Copyright (c) 2006 Francisco Leon. C.C. 80087371.
+email: projectileman@yahoo.com
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of EITHER:
+ (1) The GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 2.1 of the License, or (at
+ your option) any later version. The text of the GNU Lesser
+ General Public License is included with this library in the
+ file GIMPACT-LICENSE-LGPL.TXT.
+ (2) The BSD-style license that is included with this library in
+ the file GIMPACT-LICENSE-BSD.TXT.
+
+ This library 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 files
+ GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details.
+
+-----------------------------------------------------------------------------
+*/
+
+#include "GIMPACT/gim_memory.h"
+
+/*! \addtogroup GEOMETRIC_OPERATIONS
+*/
+//! @{
+
+//! Capsule struct
+struct GIM_CAPSULE_DATA
+{
+ GREAL m_radius;
+ vec3f m_point1;
+ vec3f m_point2;
+};
+//typedef struct _GIM_CAPSULE_DATA GIM_CAPSULE_DATA;
+
+#define CALC_CAPSULE_AABB(capsule,aabb)\
+{\
+ if(capsule.m_point1[0]<capsule.m_point2[0])\
+ {\
+ aabb.minX = capsule.m_point1[0] - capsule.m_radius;\
+ aabb.maxX = capsule.m_point2[0] + capsule.m_radius;\
+ }\
+ else\
+ {\
+ aabb.minX = capsule.m_point2[0] - capsule.m_radius;\
+ aabb.maxX = capsule.m_point1[0] + capsule.m_radius;\
+ }\
+ if(capsule.m_point1[1]<capsule.m_point2[1])\
+ {\
+ aabb.minY = capsule.m_point1[1] - capsule.m_radius;\
+ aabb.maxY = capsule.m_point2[1] + capsule.m_radius;\
+ }\
+ else\
+ {\
+ aabb.minY = capsule.m_point2[1] - capsule.m_radius;\
+ aabb.maxY = capsule.m_point1[1] + capsule.m_radius;\
+ }\
+ if(capsule.m_point1[2]<capsule.m_point2[2])\
+ {\
+ aabb.minZ = capsule.m_point1[2] - capsule.m_radius;\
+ aabb.maxZ = capsule.m_point2[2] + capsule.m_radius;\
+ }\
+ else\
+ {\
+ aabb.minZ = capsule.m_point2[2] - capsule.m_radius;\
+ aabb.maxZ = capsule.m_point1[2] + capsule.m_radius;\
+ }\
+}\
+
+//! Utility function for find the closest point between a segment and a triangle
+/*!
+
+\param triangle
+\param s1
+\param s2
+\param contacts Contains the closest points on the segment (1,2), and the normal points to segment, and m_depth contains the distance
+
+\post The contacts array is not set to 0. It adds aditional contacts
+*/
+void gim_closest_point_triangle_segment(GIM_TRIANGLE_DATA * triangle, vec3f s1,vec3f s2, GDYNAMIC_ARRAY * contacts);
+
+
+
+
+
+//! Utility function for find the closest point between a capsule and a triangle
+/*!
+
+\param triangle
+\param capsule
+\param contacts Contains the closest points on the capsule, and the normal points to triangle
+\return 1 if the triangle collides the capsule
+\post The contacts array is not set to 0. It adds aditional contacts
+*/
+int gim_triangle_capsule_collision(GIM_TRIANGLE_DATA * triangle, GIM_CAPSULE_DATA * capsule, GDYNAMIC_ARRAY * contacts);
+//! @}
+
+#endif // GIM_TRI_CAPSULE_COLLISION_H_INCLUDED
diff --git a/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_tri_collision.h b/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_tri_collision.h
new file mode 100644
index 0000000..ae63252
--- /dev/null
+++ b/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_tri_collision.h
@@ -0,0 +1,253 @@
+#ifndef GIM_TRI_COLLISION_H_INCLUDED
+#define GIM_TRI_COLLISION_H_INCLUDED
+
+/*! \file gim_tri_collision.h
+\author Francisco León Nájera
+*/
+/*
+-----------------------------------------------------------------------------
+This source file is part of GIMPACT Library.
+
+For the latest info, see http://gimpact.sourceforge.net/
+
+Copyright (c) 2006 Francisco Leon Najera. C.C. 80087371.
+email: projectileman@yahoo.com
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of EITHER:
+ (1) The GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 2.1 of the License, or (at
+ your option) any later version. The text of the GNU Lesser
+ General Public License is included with this library in the
+ file GIMPACT-LICENSE-LGPL.TXT.
+ (2) The BSD-style license that is included with this library in
+ the file GIMPACT-LICENSE-BSD.TXT.
+
+ This library 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 files
+ GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details.
+
+-----------------------------------------------------------------------------
+*/
+
+/*! \addtogroup GEOMETRIC_OPERATIONS
+*/
+//! @{
+
+
+#define MAX_TRI_CLIPPING 8
+
+//! Clips a polygon by a plane
+#define PLANE_CLIP_POLYGON(plane,polygon_points,polygon_point_count,clipped,clipped_count,max_clipped) \
+{ \
+ clipped_count = 0; \
+ GUINT32 _i, _vi, _prevclassif=32000, _classif; \
+ GREAL _d; \
+ for(_i=0;_i<=polygon_point_count;_i++) \
+ { \
+ _vi = _i%polygon_point_count; \
+ _d = DISTANCE_PLANE_POINT(plane,polygon_points[_vi]); \
+ _classif = _d>G_EPSILON ?1:0; \
+ if(_classif == 0) \
+ { \
+ if(_prevclassif==1) \
+ {\
+ if(clipped_count<max_clipped) \
+ {\
+ PLANE_CLIP_SEGMENT(polygon_points[_i-1],polygon_points[_vi],plane,clipped[clipped_count]); \
+ clipped_count++; \
+ } \
+ } \
+ if(clipped_count<max_clipped&&_i<polygon_point_count) \
+ { \
+ VEC_COPY(clipped[clipped_count],polygon_points[_vi]); \
+ clipped_count++; \
+ } \
+ } \
+ else \
+ { \
+ if(_prevclassif==0) \
+ { \
+ if(clipped_count<max_clipped) \
+ { \
+ PLANE_CLIP_SEGMENT(polygon_points[_i-1],polygon_points[_vi],plane,clipped[clipped_count]); \
+ clipped_count++; \
+ } \
+ } \
+ } \
+ _prevclassif = _classif; \
+ } \
+}\
+
+
+struct GIM_TRIPLANES_CACHE
+{
+ /*!
+ Planes are:
+ 0 : Face normal plane (0,3)
+ 1 : Edge 1 plane (4,7)
+ 2 : Edge 2 plane (8,11)
+ 3 : Edge 3 plane (12,15)
+ */
+ vec4f m_planes[4];
+};
+//typedef struct _GIM_TRIPLANES_CACHE GIM_TRIPLANES_CACHE;
+
+
+struct GIM_TRIANGLE_DATA
+{
+ vec3f m_vertices[3];
+ GIM_TRIPLANES_CACHE m_planes;
+};
+//typedef struct _GIM_TRIANGLE_DATA GIM_TRIANGLE_DATA;
+
+//! tri_data is a GIM_TRIANGLE_DATA
+#define GIM_CALC_TRIANGLE_DATA_PLANES(tri_data)\
+{\
+ TRIANGLE_PLANE((tri_data).m_vertices[0],(tri_data).m_vertices[1],(tri_data).m_vertices[2],(tri_data).m_planes.m_planes[0]);\
+ EDGE_PLANE((tri_data).m_vertices[0],(tri_data).m_vertices[1],((tri_data).m_planes.m_planes[0]),((tri_data).m_planes.m_planes[1]));\
+ EDGE_PLANE((tri_data).m_vertices[1],(tri_data).m_vertices[2],((tri_data).m_planes.m_planes[0]),((tri_data).m_planes.m_planes[2]));\
+ EDGE_PLANE((tri_data).m_vertices[2],(tri_data).m_vertices[0],((tri_data).m_planes.m_planes[0]), ((tri_data).m_planes.m_planes[3]));\
+}\
+
+//Structure for collision
+
+struct GIM_TRIANGLE_CONTACT_DATA
+{
+ GREAL m_penetration_depth;
+ GUINT32 m_point_count;
+ vec3f m_separating_normal;
+ vec3f m_points[MAX_TRI_CLIPPING];
+};
+//typedef struct _GIM_TRIANGLE_CONTACT_DATA GIM_TRIANGLE_CONTACT_DATA;
+
+struct GIM_TRIANGLE_RAY_CONTACT_DATA
+{
+ GREAL u;
+ GREAL v;
+ GREAL tparam;
+ GUINT32 m_face_id;
+ vec3f m_point;
+ vec3f m_normal;
+};
+//typedef struct _GIM_TRIANGLE_RAY_CONTACT_DATA GIM_TRIANGLE_RAY_CONTACT_DATA;
+
+//! Fast Triangle Triangle overlapping test
+int gim_triangle_triangle_overlap(
+ GIM_TRIANGLE_DATA *tri1,
+ GIM_TRIANGLE_DATA *tri2);
+
+
+//! Fast but inacurate conservative Triangle Triangle overlapping test
+int gim_triangle_triangle_overlap_fast(
+ GIM_TRIANGLE_DATA *tri1,
+ GIM_TRIANGLE_DATA *tri2);
+
+
+//! Finds the contact points from a collision of two triangles
+/*!
+Returns the contact points, the penetration depth and the separating normal of the collision
+between two triangles. The normal is pointing toward triangle 1 from triangle 2
+*/
+int gim_triangle_triangle_collision(
+ GIM_TRIANGLE_DATA *tri1,
+ GIM_TRIANGLE_DATA *tri2,
+ GIM_TRIANGLE_CONTACT_DATA * contact_data);
+
+//Ray triangle
+
+
+/*!
+ Solve the System for u,v parameters:
+
+ u*axe1[i1] + v*axe2[i1] = vecproj[i1]
+ u*axe1[i2] + v*axe2[i2] = vecproj[i2]
+
+ sustitute:
+ v = (vecproj[i2] - u*axe1[i2])/axe2[i2]
+
+ then the first equation in terms of 'u':
+
+ --> u*axe1[i1] + ((vecproj[i2] - u*axe1[i2])/axe2[i2])*axe2[i1] = vecproj[i1]
+
+ --> u*axe1[i1] + vecproj[i2]*axe2[i1]/axe2[i2] - u*axe1[i2]*axe2[i1]/axe2[i2] = vecproj[i1]
+
+ --> u*(axe1[i1] - axe1[i2]*axe2[i1]/axe2[i2]) = vecproj[i1] - vecproj[i2]*axe2[i1]/axe2[i2]
+
+ --> u*((axe1[i1]*axe2[i2] - axe1[i2]*axe2[i1])/axe2[i2]) = (vecproj[i1]*axe2[i2] - vecproj[i2]*axe2[i1])/axe2[i2]
+
+ --> u*(axe1[i1]*axe2[i2] - axe1[i2]*axe2[i1]) = vecproj[i1]*axe2[i2] - vecproj[i2]*axe2[i1]
+
+ --> u = (vecproj[i1]*axe2[i2] - vecproj[i2]*axe2[i1]) /(axe1[i1]*axe2[i2] - axe1[i2]*axe2[i1])
+
+if 0.0<= u+v <=1.0 then they are inside of triangle
+
+ */
+#define TRIANGLE_GET_UVPARAMETERS(point,vec1,vec2,vec3,tri_plane,u,v,outside)\
+{\
+ vec3f _axe1, _axe2, _vecproj;\
+ VEC_DIFF(_axe1,vec2,vec1);\
+ VEC_DIFF(_axe2,vec3,vec1);\
+ VEC_DIFF(_vecproj,point,vec1);\
+ GUINT32 _i1,_i2;\
+ PLANE_MINOR_AXES(tri_plane, _i1, _i2);\
+ if(fabsf(_axe2[_i2])<G_EPSILON)\
+ {\
+ u = (_vecproj[_i2]*_axe2[_i1] - _vecproj[_i1]*_axe2[_i2]) /(_axe1[_i2]*_axe2[_i1] - _axe1[_i1]*_axe2[_i2]);\
+ v = (_vecproj[_i1] - u*_axe1[_i1])/_axe2[_i1];\
+ }\
+ else\
+ {\
+ u = (_vecproj[_i1]*_axe2[_i2] - _vecproj[_i2]*_axe2[_i1]) /(_axe1[_i1]*_axe2[_i2] - _axe1[_i2]*_axe2[_i1]);\
+ v = (_vecproj[_i2] - u*_axe1[_i2])/_axe2[_i2];\
+ }\
+ if(u<-G_EPSILON)\
+ {\
+ outside = 1;\
+ }\
+ else if(v<-G_EPSILON)\
+ {\
+ outside = 1;\
+ }\
+ else\
+ {\
+ float sumuv;\
+ sumuv = u+v;\
+ if(sumuv<-G_EPSILON)\
+ {\
+ outside = 1;\
+ }\
+ else if(sumuv-1.0f>G_EPSILON)\
+ {\
+ outside = 1;\
+ }\
+ else\
+ {\
+ outside = 0;\
+ }\
+ }\
+}\
+
+//! Finds the collision of a ray and a triangle.
+#define RAY_TRIANGLE_INTERSECTION(vOrigin,vDir,vec1,vec2,vec3,tri_plane,pout,u,v,tparam,tmax,does_intersect)\
+{\
+ RAY_PLANE_COLLISION(tri_plane,vDir,vOrigin,pout,tparam,does_intersect);\
+ if(does_intersect != 0)\
+ {\
+ if(tparam<-G_EPSILON||tparam>tmax+G_EPSILON)\
+ {\
+ does_intersect = 0;\
+ }\
+ else\
+ {\
+ TRIANGLE_GET_UVPARAMETERS(pout,vec1,vec2,vec3,tri_plane,u,v,does_intersect);\
+ does_intersect = !does_intersect;\
+ }\
+ }\
+}\
+
+
+//! @}
+
+#endif // GIM_TRI_COLLISION_H_INCLUDED
diff --git a/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_tri_sphere_collision.h b/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_tri_sphere_collision.h
new file mode 100644
index 0000000..a2a81d6
--- /dev/null
+++ b/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_tri_sphere_collision.h
@@ -0,0 +1,51 @@
+#ifndef GIM_TRI_SPHERE_COLLISION_H_INCLUDED
+#define GIM_TRI_SPHERE_COLLISION_H_INCLUDED
+
+/*! \file gim_tri_sphere_collision.h
+\author Francisco León
+*/
+/*
+-----------------------------------------------------------------------------
+This source file is part of GIMPACT Library.
+
+For the latest info, see http://gimpact.sourceforge.net/
+
+Copyright (c) 2006 Francisco Leon. C.C. 80087371.
+email: projectileman@yahoo.com
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of EITHER:
+ (1) The GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 2.1 of the License, or (at
+ your option) any later version. The text of the GNU Lesser
+ General Public License is included with this library in the
+ file GIMPACT-LICENSE-LGPL.TXT.
+ (2) The BSD-style license that is included with this library in
+ the file GIMPACT-LICENSE-BSD.TXT.
+
+ This library 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 files
+ GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details.
+
+-----------------------------------------------------------------------------
+*/
+
+/*! \addtogroup GEOMETRIC_OPERATIONS
+*/
+//! @{
+
+//! Finds the contact points from a collision of a triangle and a sphere
+/*!
+\param tri
+\param center
+\param radius
+\param contact_data Contains the closest points on the Sphere, and the normal is pointing to triangle
+*/
+int gim_triangle_sphere_collision(
+ GIM_TRIANGLE_DATA *tri,
+ vec3f center, GREAL radius,
+ GIM_TRIANGLE_CONTACT_DATA * contact_data);
+
+//! @}
+#endif // GIM_TRI_SPHERE_COLLISION_H_INCLUDED
diff --git a/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_trimesh.h b/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_trimesh.h
new file mode 100644
index 0000000..2983fca
--- /dev/null
+++ b/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gim_trimesh.h
@@ -0,0 +1,544 @@
+#ifndef GIM_TRIMESH_H_INCLUDED
+#define GIM_TRIMESH_H_INCLUDED
+/*! \file gim_trimesh.h
+\author Francisco León
+*/
+/*
+-----------------------------------------------------------------------------
+This source file is part of GIMPACT Library.
+
+For the latest info, see http://gimpact.sourceforge.net/
+
+Copyright (c) 2006 Francisco Leon. C.C. 80087371.
+email: projectileman@yahoo.com
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of EITHER:
+ (1) The GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 2.1 of the License, or (at
+ your option) any later version. The text of the GNU Lesser
+ General Public License is included with this library in the
+ file GIMPACT-LICENSE-LGPL.TXT.
+ (2) The BSD-style license that is included with this library in
+ the file GIMPACT-LICENSE-BSD.TXT.
+
+ This library 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 files
+ GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details.
+
+-----------------------------------------------------------------------------
+*/
+
+#include "GIMPACT/gim_boxpruning.h"
+#include "GIMPACT/gim_contact.h"
+
+
+///MAsk defines
+#define GIM_TRIMESH_TRANSFORMED_REPLY 1
+#define GIM_TRIMESH_NEED_UPDATE 2
+
+/*! \addtogroup TRIMESH
+\brief
+A Trimesh is the basic geometric structure for representing solid objects.
+<p><strong>CREATING TRIMESHES</strong></p>
+<ul>
+<li> For creating trimeshes, you must initialize Buffer managers by calling \ref gimpact_init
+<li> Then you must define the vertex and index sources by creating them with \ref BUFFER_ARRAYS routines, and then call \ref gim_trimesh_create_from_arrays.
+<li> An alternative way for creaing trimesh objects is calling \ref gim_trimesh_create_from_data.
+<li> For access to the trimesh data (vertices, triangle indices), you must call \ref gim_trimesh_locks_work_data , and \ref gim_trimesh_unlocks_work_data for finish the access.
+<li> Each time when the trimesh data is modified, you must call \ref gim_trimesh_update after.
+<li> When a trimesh is no longer needed, you must call \ref gim_trimesh_destroy.
+</ul>
+
+<p>This is an example of how to create a deformable trimesh that shares vertices with the user application:</p>
+\code
+//Declaration of vertices
+vec3f trimeshvertices[200];
+//Declaration of indices
+GUINT trimeshindices[100];
+
+... Initializing vertices and triangle indices at beginning
+
+//Then create trimesh
+GIM_TRIMESH mytrimesh;
+
+//Calling trimesh create function
+
+gim_trimesh_create_from_data(
+&mytrimesh,
+trimeshvertices,200,
+0 ,//copy_vertices is 0
+trimeshindices,
+100,
+0, //copy_indices is 0
+0 //transformed_reply is 0
+);
+\endcode
+<p>Note that parameter transformed_reply is 0, that means that m_transformed_vertex_buffer is a reference to m_source_vertex on the trimesh, and transformations are not avaliable. Use that configuration if you have to simulate a deformable trimesh like cloth or elastic bodies.</p>
+<p>When the trimesh is no longer needed, destroy it safely with gim_trimesh_destroy()</p>
+<p><strong>UPDATING TRIMESHES</strong></p>
+<p>On simulation loops, is needed to update trimeshes every time for update vertices althought updating triangle boxes and planes cache. There is two ways for update trimeshes: </p>
+<ul>
+<li> Updating vertices directly. You need to access to the \ref GIM_TRIMESH.m_source_vertex_buffer member; a vertex buffer which has access to the source vertices.
+\code
+// Access to the source vertices
+gim_buffer_array_lock(&mytrimesh.m_source_vertex_buffer, G_MA_READ_WRITE);
+
+//Get a pointer to the vertex buffer
+vec3f * vertexpointer = GIM_BUFFER_ARRAY_POINTER(vec3f,mytrimesh.m_source_vertex_buffer,0);
+
+//Get the amount of vertices
+int veccount = mytrimesh.m_source_vertex_buffer.m_element_count;
+
+//Modify vertices
+for (int i=0;i<veccount ;i++ )
+{
+ .....
+ .....
+ processing vertices
+ .....
+ .....
+}
+
+// Don't forget to unlock the source vertex array
+gim_buffer_array_unlock(&mytrimesh.m_source_vertex_buffer);
+
+// Notify that the state of the trimesh is changed
+gim_trimesh_post_update(&mytrimesh.m_source_vertex_buffer);
+
+\endcode
+For making trimeshes that allow to update their vertices, use \ref gim_trimesh_create_from_data with parameter <strong>transformed_reply</strong> = 0.
+</ul>
+<ul>
+<li> Aplying a transformation. Simply use \ref gim_trimesh_set_tranform . Remember that with this method trimeshes must be created with \ref gim_trimesh_create_from_data with parameter <strong>transformed_reply</strong> = 1.
+</ul>
+<p> After updating vertices, you must call \ref gim_trimesh_update()</p>
+<p><strong>TRIMESHES COLLISION</strong></p>
+<p>Before collide trimeshes, you need to update them first.</p>
+<p>Then you must use \ref gim_trimesh_trimesh_collision().</p>
+
+*/
+//! @{
+
+//! Prototype for updating vertices
+typedef void * gim_update_trimesh_function(struct _GIM_TRIMESH *);
+
+//! Trimesh
+struct GIM_TRIMESH
+{
+ ///Original
+ //@{
+ GBUFFER_ARRAY m_source_vertex_buffer;//!< Buffer of vec3f coordinates
+
+ //! (GUINT) Indices of triangles,groups of three elements.
+ /*!
+ Array of GUINT. Triangle indices. Each triple contains indices of the vertices for each triangle.
+ \invariant must be aligned
+ */
+ GBUFFER_ARRAY m_tri_index_buffer;
+ //@}
+ ///Allocated
+ //@{
+ char m_mask;//!< Don't use directly
+
+ //! Allocated transformed vertices vec3f
+ /*!
+ Array of vec3f.If gim_trimesh_has_tranformed_reply(this) == 1 then it refers to the m_source_vertex_buffer
+ \invariant must be aligned
+ */
+ GBUFFER_ARRAY m_transformed_vertex_buffer;
+ //@}
+ ///Auxiliary data
+ //@{
+ GIM_AABB_SET m_aabbset;
+ GDYNAMIC_ARRAY m_planes_cache_buffer;//! Allocated GIM_TRIPLANES_CACHE
+ GDYNAMIC_ARRAY m_planes_cache_bitset;
+ gim_update_trimesh_function * m_update_callback;//! If null, then m_transform is applied.
+ mat4f m_transform;
+ //@}
+};
+//typedef struct _GIM_TRIMESH GIM_TRIMESH;
+
+/// Info about mesh
+//! Return the trimesh triangle count
+GUINT32 gim_trimesh_get_triangle_count(GIM_TRIMESH * trimesh);
+
+//! Returns 1 if the m_transformed_vertex_buffer is a reply of m_source_vertex_buffer
+char gim_trimesh_has_tranformed_reply(GIM_TRIMESH * trimesh);
+
+//! Returns 1 if the trimesh needs to update their aabbset and the planes cache.
+char gim_trimesh_needs_update(GIM_TRIMESH * trimesh);
+
+//! Change the state of the trimesh for force it to update
+/*!
+Call it after made changes to the trimesh.
+\post gim_trimesh_need_update(trimesh) will return 1
+\sa gim_trimesh_needs_update,gim_trimesh_has_tranformed_reply
+*/
+void gim_trimesh_post_update(GIM_TRIMESH * trimesh);
+
+//! Creates the aabb set and the triangles cache
+/*!
+
+\param trimesh
+\param vertex_array
+\param triindex_array
+\param transformed_reply If 1, then the m_transformed_vertices is a reply of the source vertices. Else it just be a reference to the original array.
+\post it copies the arrays by reference, and creates the auxiliary data (m_aabbset,m_planes_cache_buffer)
+*/
+void gim_trimesh_create_from_arrays(GBUFFER_MANAGER_DATA buffer_managers[],
+ GIM_TRIMESH * trimesh, GBUFFER_ARRAY * vertex_array, GBUFFER_ARRAY * triindex_array,char transformed_reply);
+
+
+
+//! Create a trimesh from vertex array and an index array
+/*!
+\param trimesh An uninitialized GIM_TRIMESH structure
+\param vertex_array A buffer to a vec3f array
+\param vertex_count
+\param triindex_array
+\param index_count
+\param copy_vertices If 1, it copies the source vertices in another buffer. Else (0) it constructs a reference to the data.
+\param copy_indices If 1, it copies the source vertices in another buffer. Else (0) it constructs a reference to the data.
+\param transformed_reply If 1, then the m_transformed_vertices is a reply of the source vertices. Else it just be a reference to the original array. Use 1 if you will apply transformations to the trimesh. See \ref gim_trimesh_set_tranform().
+*/
+void gim_trimesh_create_from_data(GBUFFER_MANAGER_DATA buffer_managers[],
+ GIM_TRIMESH * trimesh, vec3f * vertex_array, GUINT32 vertex_count,char copy_vertices,
+ GUINT32 * triindex_array, GUINT32 index_count,char copy_indices,char transformed_reply);
+
+//! Clears auxiliary data and releases buffer arrays
+void gim_trimesh_destroy(GIM_TRIMESH * trimesh);
+
+//! Copies two meshes
+/*!
+\param source_trimesh
+\param dest_trimesh
+\param copy_by_reference If 1, it attach a reference to the source vertices, else it copies the vertices
+\param transformed_reply If 1, transformed vertices are reply of source vertives. 1 Is recommended
+*/
+void gim_trimesh_copy(GIM_TRIMESH * source_trimesh,
+ GBUFFER_MANAGER_DATA dest_buffer_managers[], GIM_TRIMESH * dest_trimesh,
+ char copy_by_reference, char transformed_reply);
+
+
+//! Locks the trimesh for working with it
+/*!
+\post locks m_tri_index_buffer and m_transformed_vertex_buffer.
+\param trimesh
+*/
+void gim_trimesh_locks_work_data(GIM_TRIMESH * trimesh);
+
+
+//! unlocks the trimesh
+/*!
+\post unlocks m_tri_index_buffer and m_transformed_vertex_buffer.
+\param trimesh
+*/
+void gim_trimesh_unlocks_work_data(GIM_TRIMESH * trimesh);
+
+//! Updates m_transformed_vertex_buffer
+/*!
+\pre m_transformed_vertex_buffer must be unlocked
+*/
+void gim_trimesh_update_vertices(GIM_TRIMESH * trimesh);
+
+//! Updates m_aabbset and m_planes_cache_bitset
+/*!
+\pre gim_trimesh_locks_work_data must be called before
+*/
+void gim_trimesh_update_aabbset(GIM_TRIMESH * trimesh);
+
+//! Calls before perfom collisions. Updates the trimesh if needed
+/*!
+\post If gim_trimesh_needs_update returns 1, then it calls gim_trimesh_update_vertices and gim_trimesh_update_aabbset
+*/
+void gim_trimesh_update(GIM_TRIMESH * trimesh);
+
+//! Set the transform of a trimesh
+/*!
+\post This function calls to gim_trimesh_post_update
+*/
+void gim_trimesh_set_tranform(GIM_TRIMESH * trimesh, mat4f transform);
+
+//! Fetch triangle data
+/*!
+\pre gim_trimesh_locks_work_data must be called before
+*/
+void gim_trimesh_get_triangle_data(GIM_TRIMESH * trimesh, GUINT32 triangle_index, GIM_TRIANGLE_DATA * tri_data);
+
+//! Fetch triangle vertices
+/*!
+\pre gim_trimesh_locks_work_data must be called before
+*/
+void gim_trimesh_get_triangle_vertices(GIM_TRIMESH * trimesh, GUINT32 triangle_index, vec3f v1,vec3f v2,vec3f v3);
+
+//! Trimesh Trimesh Collisions
+/*!
+Before use this function you must update each trimesh:
+\code
+gim_trimesh_update(TriMesh1);
+gim_trimesh_update(TriMesh2);
+\endcode
+Then you must use the trimesh collision in this way:
+\code
+int collide_trimeshes(GIM_TRIMESH * TriMesh1, GIM_TRIMESH * TriMesh2)
+{
+ //Create contact list
+ GDYNAMIC_ARRAY trimeshcontacts;
+ GIM_CREATE_CONTACT_LIST(trimeshcontacts);
+
+ //Collide trimeshes
+ gim_trimesh_trimesh_collision(TriMesh1,TriMesh2,&trimeshcontacts);
+
+ if(trimeshcontacts.m_size == 0) //do nothing
+ {
+ GIM_DYNARRAY_DESTROY(trimeshcontacts);//clean contact array
+ return 0;
+ }
+
+ //Getting a pointer to the contact array
+ GIM_CONTACT * ptrimeshcontacts = GIM_DYNARRAY_POINTER(GIM_CONTACT,trimeshcontacts);
+
+ int contactcount = trimeshcontacts.m_size;
+ int i;
+ //Process contacts
+ for (i=0;i<contactcount ;i++)
+ {
+ //Do something with the contact (ptrimeshcontacts)
+ ......
+ ......
+ // Like creating joints or anything else
+ ......
+ ......
+ ptrimeshcontacts++;
+ }
+ GIM_DYNARRAY_DESTROY(trimeshcontacts);
+ return contactcount;
+}
+\endcode
+In each contact
+<ul>
+<li> m_handle1 points to trimesh1.
+<li> m_handle2 points to trimesh2.
+<li> m_feature1 Is a triangle index of trimesh1.
+<li> m_feature2 Is a triangle index of trimesh2.
+</ul>
+
+\param trimesh1 Collider
+\param trimesh2 Collidee
+\param contacts A GIM_CONTACT array. Must be initialized
+*/
+void gim_trimesh_trimesh_collision(GIM_TRIMESH * trimesh1, GIM_TRIMESH * trimesh2, GDYNAMIC_ARRAY * contacts);
+
+
+//! Trimesh Sphere Collisions
+/*!
+Before use this function you must update the trimesh:
+\code
+gim_trimesh_update(trimesh);
+\endcode
+Then you must use this function in this way:
+\code
+int collide_trimesh_sphere(GIM_TRIMESH * trimesh, vec3f center,GREAL radius)
+{
+ //Create contact list
+ GDYNAMIC_ARRAY trimeshcontacts;
+ GIM_CREATE_CONTACT_LIST(trimeshcontacts);
+
+ //Collide trimeshes
+ gim_trimesh_sphere_collision(trimesh,center,radius,&trimeshcontacts);
+
+ if(trimeshcontacts.m_size == 0) //do nothing
+ {
+ GIM_DYNARRAY_DESTROY(trimeshcontacts);//clean contact array
+ return 0;
+ }
+
+ //Getting a pointer to the contact array
+ GIM_CONTACT * ptrimeshcontacts = GIM_DYNARRAY_POINTER(GIM_CONTACT,trimeshcontacts);
+
+ int contactcount = trimeshcontacts.m_size;
+ int i;
+ //Process contacts
+ for (i=0;i<contactcount ;i++)
+ {
+ //Do something with the contact (ptrimeshcontacts)
+ ......
+ ......
+ // Like creating joints or anything else
+ ......
+ ......
+ ptrimeshcontacts++;
+ }
+ GIM_DYNARRAY_DESTROY(trimeshcontacts);
+ return contactcount;
+}
+\endcode
+
+In each contact
+<ul>
+<li> m_handle1 points to trimesh.
+<li> m_handle2 points to NULL.
+<li> m_feature1 Is a triangle index of trimesh.
+</ul>
+
+\param trimesh
+\param center
+\param radius
+\param contacts A GIM_CONTACT array. Must be initialized
+*/
+void gim_trimesh_sphere_collision(GIM_TRIMESH * trimesh,vec3f center,GREAL radius, GDYNAMIC_ARRAY * contacts);
+
+
+//! Trimesh Capsule collision
+/*!
+Find the closest primitive collided by the ray.
+
+Before use this function you must update the trimesh:
+\code
+gim_trimesh_update(trimesh);
+\endcode
+Then you must use this function in this way:
+\code
+int collide_trimesh_capsule(GIM_TRIMESH * trimesh, GIM_CAPSULE_DATA * capsule)
+{
+ //Create contact list
+ GDYNAMIC_ARRAY trimeshcontacts;
+ GIM_CREATE_CONTACT_LIST(trimeshcontacts);
+
+ //Collide trimeshes
+ gim_trimesh_capsule_collision(trimesh,capsule,&trimeshcontacts);
+
+ if(trimeshcontacts.m_size == 0) //do nothing
+ {
+ GIM_DYNARRAY_DESTROY(trimeshcontacts);//clean contact array
+ return 0;
+ }
+
+ //Getting a pointer to the contact array
+ GIM_CONTACT * ptrimeshcontacts = GIM_DYNARRAY_POINTER(GIM_CONTACT,trimeshcontacts);
+
+ int contactcount = trimeshcontacts.m_size;
+ int i;
+ //Process contacts
+ for (i=0;i<contactcount ;i++)
+ {
+ //Do something with the contact (ptrimeshcontacts)
+ ......
+ ......
+ // Like creating joints or anything else
+ ......
+ ......
+ ptrimeshcontacts++;
+ }
+ GIM_DYNARRAY_DESTROY(trimeshcontacts);
+ return contactcount;
+}
+\endcode
+
+In each contact
+<ul>
+<li> m_handle1 points to trimesh.
+<li> m_handle2 points to NULL.
+<li> m_feature1 Is a triangle index of trimesh.
+</ul>
+
+\param trimesh
+\param capsule
+\param contacts A GIM_CONTACT array. Must be initialized
+*/
+void gim_trimesh_capsule_collision(GIM_TRIMESH * trimesh, GIM_CAPSULE_DATA * capsule, GDYNAMIC_ARRAY * contacts);
+
+
+///Function for create Trimesh Plane collision result
+#define GIM_CREATE_TRIMESHPLANE_CONTACTS(dynarray) GIM_DYNARRAY_CREATE(vec4f,dynarray,G_ARRAY_GROW_SIZE)
+
+//! Trimesh Plane Collisions
+/*!
+
+Before use this function you must update the trimesh:
+\code
+gim_trimesh_update(trimesh);
+\endcode
+Then you must use this function in this way:
+\code
+int collide_trimesh_plane(GIM_TRIMESH * trimesh, vec4f plane)
+{
+ //Create contact list
+ GDYNAMIC_ARRAY tri_plane_contacts;
+ GIM_CREATE_TRIMESHPLANE_CONTACTS(tri_plane_contacts);
+
+ //Collide trimeshes
+ gim_trimesh_plane_collision(trimesh,plane,&tri_plane_contacts);
+
+ if(tri_plane_contacts.m_size == 0) //do nothing
+ {
+ GIM_DYNARRAY_DESTROY(tri_plane_contacts);//clean contact array
+ return 0;
+ }
+
+ //Getting a pointer to the contact array
+ vec4f * planecontacts = GIM_DYNARRAY_POINTER(vec4f,tri_plane_contacts);
+
+ int contactcount = tri_plane_contacts.m_size;
+ int i;
+ //Process contacts
+ for (i=0;i<contactcount ;i++)
+ {
+ vec3f contactpoint;
+ GREAL contactdis;
+
+ VEC_COPY(contactpoint,planecontacts[i]); //Get contact point
+ contactdis = planecontacts[i][3]; // Get distance depth
+
+ //Do something with the contact
+ ......
+ ......
+ // Like creating joints or anything else
+ ......
+ ......
+ }
+ GIM_DYNARRAY_DESTROY(tri_plane_contacts);
+ return contactcount;
+}
+\endcode
+
+In each contact the 3 first coordinates refers to the contact point, the fourth refers to the distance depth and the normal is the normal of the plane.
+
+\param trimesh
+\param plane vec4f plane
+\param contacts A vec4f array. Must be initialized (~100). Each element have the coordinate point in the first 3 elements, and vec4f[3] has the penetration depth.
+*/
+void gim_trimesh_plane_collision(GIM_TRIMESH * trimesh,vec4f plane, GDYNAMIC_ARRAY * contacts);
+
+
+//! Trimesh Ray Collisions
+/*!
+\param trimesh
+\param origin
+\param dir
+\param tmax
+\param contact
+\return 1 if the ray collides, else 0
+*/
+int gim_trimesh_ray_collision(GIM_TRIMESH * trimesh,vec3f origin,vec3f dir, GREAL tmax, GIM_TRIANGLE_RAY_CONTACT_DATA * contact);
+
+
+//! Trimesh Ray Collisions closest
+/*!
+Find the closest primitive collided by the ray
+\param trimesh
+\param origin
+\param dir
+\param tmax
+\param contact
+\return 1 if the ray collides, else 0
+*/
+int gim_trimesh_ray_closest_collision(GIM_TRIMESH * trimesh,vec3f origin,vec3f dir, GREAL tmax, GIM_TRIANGLE_RAY_CONTACT_DATA * contact);
+
+//! @}
+
+
+
+#endif // GIM_TRIMESH_H_INCLUDED
diff --git a/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gimpact.h b/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gimpact.h
new file mode 100644
index 0000000..bcd22a1
--- /dev/null
+++ b/libs/ode-0.16.1/GIMPACT/include/GIMPACT/gimpact.h
@@ -0,0 +1,45 @@
+#ifndef GIMPACT_H_INCLUDED
+#define GIMPACT_H_INCLUDED
+
+/*! \file gimpact.h
+\author Francisco León
+*/
+/*
+-----------------------------------------------------------------------------
+This source file is part of GIMPACT Library.
+
+For the latest info, see http://gimpact.sourceforge.net/
+
+Copyright (c) 2006 Francisco Leon. C.C. 80087371.
+email: projectileman@yahoo.com
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of EITHER:
+ (1) The GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 2.1 of the License, or (at
+ your option) any later version. The text of the GNU Lesser
+ General Public License is included with this library in the
+ file GIMPACT-LICENSE-LGPL.TXT.
+ (2) The BSD-style license that is included with this library in
+ the file GIMPACT-LICENSE-BSD.TXT.
+
+ This library 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 files
+ GIMPACT-LICENSE-LGPL.TXT and GIMPACT-LICENSE-BSD.TXT for more details.
+
+-----------------------------------------------------------------------------
+*/
+
+
+#include "GIMPACT/gim_trimesh.h"
+
+/*! \defgroup GIMPACT_INIT
+*/
+//! @{
+//! Call this for initialize GIMPACT system structures.
+void gimpact_init();
+//! Call this for clean GIMPACT system structures.
+void gimpact_terminate();
+//! @}
+#endif // GIMPACT_H_INCLUDED
diff --git a/libs/ode-0.16.1/GIMPACT/include/Makefile.am b/libs/ode-0.16.1/GIMPACT/include/Makefile.am
new file mode 100644
index 0000000..e247258
--- /dev/null
+++ b/libs/ode-0.16.1/GIMPACT/include/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = GIMPACT
diff --git a/libs/ode-0.16.1/GIMPACT/include/Makefile.in b/libs/ode-0.16.1/GIMPACT/include/Makefile.in
new file mode 100644
index 0000000..79b367d
--- /dev/null
+++ b/libs/ode-0.16.1/GIMPACT/include/Makefile.in
@@ -0,0 +1,640 @@
+# Makefile.in generated by automake 1.15 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
+# This Makefile.in 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.
+
+@SET_MAKE@
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = GIMPACT/include
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
+ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+ $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/ode/src/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ distdir
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CCD_CFLAGS = @CCD_CFLAGS@
+CCD_LIBS = @CCD_LIBS@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DOXYGEN = @DOXYGEN@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+EXTRA_LIBTOOL_LDFLAGS = @EXTRA_LIBTOOL_LDFLAGS@
+FGREP = @FGREP@
+GL_LIBS = @GL_LIBS@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBSTDCXX = @LIBSTDCXX@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+ODE_PRECISION = @ODE_PRECISION@
+ODE_VERSION = @ODE_VERSION@
+ODE_VERSION_INFO = @ODE_VERSION_INFO@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+X11_CFLAGS = @X11_CFLAGS@
+X11_LIBS = @X11_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_WINDRES = @ac_ct_WINDRES@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+subdirs = @subdirs@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+SUBDIRS = GIMPACT
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign GIMPACT/include/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign GIMPACT/include/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+ check-am clean clean-generic clean-libtool cscopelist-am ctags \
+ ctags-am distclean distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ installdirs-am maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+ ps ps-am tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT: