Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/iksolver/test')
-rw-r--r--intern/iksolver/test/Makefile67
-rw-r--r--intern/iksolver/test/ik_glut_test/Makefile42
-rw-r--r--intern/iksolver/test/ik_glut_test/common/GlutDrawer.cpp95
-rw-r--r--intern/iksolver/test/ik_glut_test/common/GlutDrawer.h100
-rw-r--r--intern/iksolver/test/ik_glut_test/common/GlutKeyboardManager.cpp89
-rw-r--r--intern/iksolver/test/ik_glut_test/common/GlutKeyboardManager.h106
-rw-r--r--intern/iksolver/test/ik_glut_test/common/GlutMouseManager.cpp104
-rw-r--r--intern/iksolver/test/ik_glut_test/common/GlutMouseManager.h116
-rw-r--r--intern/iksolver/test/ik_glut_test/common/Makefile44
-rw-r--r--intern/iksolver/test/ik_glut_test/intern/ChainDrawer.h387
-rw-r--r--intern/iksolver/test/ik_glut_test/intern/Makefile51
-rw-r--r--intern/iksolver/test/ik_glut_test/intern/MyGlutKeyHandler.h84
-rw-r--r--intern/iksolver/test/ik_glut_test/intern/MyGlutMouseHandler.h211
-rw-r--r--intern/iksolver/test/ik_glut_test/intern/main.cpp361
-rw-r--r--intern/iksolver/test/ik_glut_test/make/msvc_6_0/ik_glut_test.dsp130
-rw-r--r--intern/iksolver/test/ik_glut_test/make/msvc_6_0/ik_glut_test.dsw49
16 files changed, 2036 insertions, 0 deletions
diff --git a/intern/iksolver/test/Makefile b/intern/iksolver/test/Makefile
new file mode 100644
index 00000000000..f59e487add0
--- /dev/null
+++ b/intern/iksolver/test/Makefile
@@ -0,0 +1,67 @@
+#
+# $Id$
+#
+# ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version. The Blender
+# Foundation also sells licenses for use in proprietary software under
+# the Blender License. See http://www.blender.org/BL/ for information
+# about this.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+# All rights reserved.
+#
+# The Original Code is: all of this file.
+#
+# Contributor(s): none yet.
+#
+# ***** END GPL/BL DUAL LICENSE BLOCK *****
+# iksolver test makefile.
+#
+
+LIBNAME = iksolver
+SOURCEDIR = intern/$(LIBNAME)/test
+DIR = $(OCGDIR)/$(SOURCEDIR)
+
+include nan_compile.mk
+
+DIRS = ik_glut_test
+
+include nan_subdirs.mk
+
+include nan_link.mk
+
+LIBS = $(OCGDIR)/intern/$(LIBNAME)/test/ik_glut_test/intern/$(DEBUG_DIR)libintern.a
+LIBS += $(OCGDIR)/intern/$(LIBNAME)/test/ik_glut_test/common/$(DEBUG_DIR)libcommon.a
+LIBS += $(OCGDIR)/intern/$(LIBNAME)/$(DEBUG_DIR)libiksolver.a
+
+SLIBS += $(NAN_MOTO)/lib/$(DEBUG_DIR)libmoto.a
+
+ifeq ($(OS),$(findstring $(OS), "beos darwin linux freebsd openbsd"))
+ LLIBS = -L/usr/X11R6/lib -lglut -pthread
+endif
+
+all debug:: $(LIBS) $(DIR)/$(DEBUG_DIR)iksolvertest
+
+$(DIR)/$(DEBUG_DIR)iksolvertest:
+ @echo "****> linking $@ in $(DIR)"
+ $(CCC) $(LDFLAGS) -o $(DIR)/$(DEBUG_DIR)iksolvertest $(LIBS) $(SLIBS) $(LLIBS) $(DADD)
+
+clean::
+ $(RM) $(DIR)/iksolvertest $(DIR)/debug/iksolvertest
+
+test:: all
+ $(DIR)/iksolvertest
+
diff --git a/intern/iksolver/test/ik_glut_test/Makefile b/intern/iksolver/test/ik_glut_test/Makefile
new file mode 100644
index 00000000000..4b47af16599
--- /dev/null
+++ b/intern/iksolver/test/ik_glut_test/Makefile
@@ -0,0 +1,42 @@
+#
+# $Id$
+#
+# ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version. The Blender
+# Foundation also sells licenses for use in proprietary software under
+# the Blender License. See http://www.blender.org/BL/ for information
+# about this.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+# All rights reserved.
+#
+# The Original Code is: all of this file.
+#
+# Contributor(s): none yet.
+#
+# ***** END GPL/BL DUAL LICENSE BLOCK *****
+# iksolver subdir bouncer. Pure waste.
+#
+
+include nan_definitions.mk
+
+LIBNAME = ik_glut_test
+SOURCEDIR = intern/iksolver/test/$(LIBNAME)
+DIR = $(OCGDIR)/$(SOURCEDIR)
+DIRS = common intern
+
+include nan_subdirs.mk
+
diff --git a/intern/iksolver/test/ik_glut_test/common/GlutDrawer.cpp b/intern/iksolver/test/ik_glut_test/common/GlutDrawer.cpp
new file mode 100644
index 00000000000..40c6a4a95c9
--- /dev/null
+++ b/intern/iksolver/test/ik_glut_test/common/GlutDrawer.cpp
@@ -0,0 +1,95 @@
+/**
+ * $Id$
+ * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#include "GlutDrawer.h"
+
+#include "MT_assert.h"
+
+MEM_SmartPtr<GlutDrawManager> GlutDrawManager::m_s_instance = MEM_SmartPtr<GlutDrawManager>();
+
+ GlutDrawManager *
+GlutDrawManager::
+Instance(
+){
+ if (m_s_instance == NULL) {
+ m_s_instance = new GlutDrawManager();
+ }
+
+ return m_s_instance;
+}
+
+
+// this is the function you should pass to glut
+
+ void
+GlutDrawManager::
+Draw(
+){
+ GlutDrawManager *manager = GlutDrawManager::Instance();
+
+ if (manager->m_drawer != NULL) {
+ manager->m_drawer->Draw();
+ }
+}
+
+ void
+GlutDrawManager::
+InstallDrawer(
+ GlutDrawer * drawer
+){
+
+ MT_assert(m_drawer == NULL);
+ m_drawer = drawer;
+}
+
+ void
+GlutDrawManager::
+ReleaseDrawer(
+){
+ m_drawer = NULL;
+}
+
+
+GlutDrawManager::
+~GlutDrawManager(
+){
+
+ delete(m_drawer);
+}
+
+
+
+
+
+
+
+
+
diff --git a/intern/iksolver/test/ik_glut_test/common/GlutDrawer.h b/intern/iksolver/test/ik_glut_test/common/GlutDrawer.h
new file mode 100644
index 00000000000..7e56a02dd47
--- /dev/null
+++ b/intern/iksolver/test/ik_glut_test/common/GlutDrawer.h
@@ -0,0 +1,100 @@
+/**
+ * $Id$
+ * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#ifndef NAN_INCLUDED_GlutDrawer
+
+#define NAN_INCLUDED_GlutDrawer
+
+#include "MEM_NonCopyable.h"
+#include "MEM_SmartPtr.h"
+
+// So pissed off with Glut callback stuff
+// that is impossible to call objects unless they are global
+
+// inherit from GlutDrawer and installl the drawer in the singleton
+// class GlutDrawManager.
+
+class GlutDrawer {
+public :
+
+ virtual
+ void
+ Draw(
+ )= 0;
+
+ virtual
+ ~GlutDrawer(
+ ){};
+};
+
+class GlutDrawManager : public MEM_NonCopyable{
+
+public :
+
+ static
+ GlutDrawManager *
+ Instance(
+ );
+
+ // this is the function you should pass to glut
+
+ static
+ void
+ Draw(
+ );
+
+ void
+ InstallDrawer(
+ GlutDrawer *
+ );
+
+ void
+ ReleaseDrawer(
+ );
+
+ ~GlutDrawManager(
+ );
+
+private :
+
+ GlutDrawManager (
+ ) :
+ m_drawer (0)
+ {
+ };
+
+ GlutDrawer * m_drawer;
+
+ static MEM_SmartPtr<GlutDrawManager> m_s_instance;
+};
+
+
+#endif \ No newline at end of file
diff --git a/intern/iksolver/test/ik_glut_test/common/GlutKeyboardManager.cpp b/intern/iksolver/test/ik_glut_test/common/GlutKeyboardManager.cpp
new file mode 100644
index 00000000000..0d1d52b542d
--- /dev/null
+++ b/intern/iksolver/test/ik_glut_test/common/GlutKeyboardManager.cpp
@@ -0,0 +1,89 @@
+/**
+ * $Id$
+ * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#include "GlutKeyboardManager.h"
+
+#include "MT_assert.h"
+
+MEM_SmartPtr<GlutKeyboardManager> GlutKeyboardManager::m_s_instance = MEM_SmartPtr<GlutKeyboardManager>();
+
+ GlutKeyboardManager *
+GlutKeyboardManager::
+Instance(
+){
+ if (m_s_instance == NULL) {
+ m_s_instance = new GlutKeyboardManager();
+ }
+
+ return m_s_instance;
+}
+
+
+// this is the function you should pass to glut
+
+ void
+GlutKeyboardManager::
+HandleKeyboard(
+ unsigned char key,
+ int x,
+ int y
+){
+ GlutKeyboardManager *manager = GlutKeyboardManager::Instance();
+
+ if (manager->m_handler != NULL) {
+ manager->m_handler->HandleKeyboard(key,x,y);
+ }
+}
+
+ void
+GlutKeyboardManager::
+InstallHandler(
+ GlutKeyboardHandler * handler
+){
+
+ MT_assert(m_handler == NULL);
+ m_handler = handler;
+}
+
+ void
+GlutKeyboardManager::
+ReleaseHandler(
+){
+ m_handler = NULL;
+}
+
+
+GlutKeyboardManager::
+~GlutKeyboardManager(
+){
+
+ delete(m_handler);
+} \ No newline at end of file
diff --git a/intern/iksolver/test/ik_glut_test/common/GlutKeyboardManager.h b/intern/iksolver/test/ik_glut_test/common/GlutKeyboardManager.h
new file mode 100644
index 00000000000..39174b5ff1a
--- /dev/null
+++ b/intern/iksolver/test/ik_glut_test/common/GlutKeyboardManager.h
@@ -0,0 +1,106 @@
+/**
+ * $Id$
+ * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#ifndef NAN_INCLUDED_GlutKeyboardManager
+
+#define NAN_INCLUDED_GlutKeyboardManager
+
+#include "MEM_NonCopyable.h"
+#include "MEM_SmartPtr.h"
+
+// So pissed off with Glut callback stuff
+// that is impossible to call objects unless they are global
+
+// inherit from GlutKeyboardHandler and installl the drawer in the singleton
+// class GlutKeyboardManager.
+
+class GlutKeyboardHandler : public MEM_NonCopyable {
+public :
+
+ virtual
+ void
+ HandleKeyboard(
+ unsigned char key,
+ int x,
+ int y
+ )= 0;
+
+ virtual
+ ~GlutKeyboardHandler(
+ ){};
+};
+
+class GlutKeyboardManager : public MEM_NonCopyable{
+
+public :
+
+ static
+ GlutKeyboardManager *
+ Instance(
+ );
+
+ // this is the function you should pass to glut
+
+ static
+ void
+ HandleKeyboard(
+ unsigned char key,
+ int x,
+ int y
+ );
+
+ void
+ InstallHandler(
+ GlutKeyboardHandler *
+ );
+
+ void
+ ReleaseHandler(
+ );
+
+ ~GlutKeyboardManager(
+ );
+
+private :
+
+ GlutKeyboardManager (
+ ) :
+ m_handler (0)
+ {
+ };
+
+ GlutKeyboardHandler * m_handler;
+
+ static MEM_SmartPtr<GlutKeyboardManager> m_s_instance;
+};
+
+
+#endif \ No newline at end of file
diff --git a/intern/iksolver/test/ik_glut_test/common/GlutMouseManager.cpp b/intern/iksolver/test/ik_glut_test/common/GlutMouseManager.cpp
new file mode 100644
index 00000000000..57f4a65327e
--- /dev/null
+++ b/intern/iksolver/test/ik_glut_test/common/GlutMouseManager.cpp
@@ -0,0 +1,104 @@
+/**
+ * $Id$
+ * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#include "GlutMouseManager.h"
+
+#include "MT_assert.h"
+
+MEM_SmartPtr<GlutMouseManager> GlutMouseManager::m_s_instance = MEM_SmartPtr<GlutMouseManager>();
+
+
+ GlutMouseManager *
+GlutMouseManager::
+Instance(
+){
+ if (m_s_instance == NULL) {
+ m_s_instance = new GlutMouseManager();
+ }
+
+ return m_s_instance;
+}
+
+// these are the functions you should pass to GLUT
+
+ void
+GlutMouseManager::
+Mouse(
+ int button,
+ int state,
+ int x,
+ int y
+){
+ GlutMouseManager *manager = GlutMouseManager::Instance();
+
+ if (manager->m_handler != NULL) {
+ manager->m_handler->Mouse(button,state,x,y);
+ }
+}
+
+ void
+GlutMouseManager::
+Motion(
+ int x,
+ int y
+){
+ GlutMouseManager *manager = GlutMouseManager::Instance();
+
+ if (manager->m_handler != NULL) {
+ manager->m_handler->Motion(x,y);
+ }
+}
+
+ void
+GlutMouseManager::
+InstallHandler(
+ GlutMouseHandler *handler
+){
+
+ MT_assert(m_handler == NULL);
+ m_handler = handler;
+}
+
+ void
+GlutMouseManager::
+ReleaseHandler(
+){
+ m_handler = NULL;
+}
+
+GlutMouseManager::
+~GlutMouseManager(
+){
+
+ delete(m_handler);
+}
+
+
diff --git a/intern/iksolver/test/ik_glut_test/common/GlutMouseManager.h b/intern/iksolver/test/ik_glut_test/common/GlutMouseManager.h
new file mode 100644
index 00000000000..95700bc14dd
--- /dev/null
+++ b/intern/iksolver/test/ik_glut_test/common/GlutMouseManager.h
@@ -0,0 +1,116 @@
+/**
+ * $Id$
+ * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#ifndef NAN_INCLUDED_GlutMouseManager_h
+
+#define NAN_INCLUDED_GlutMouseManager_h
+
+#include "MEM_NonCopyable.h"
+#include "MEM_SmartPtr.h"
+
+class GlutMouseHandler {
+public :
+
+ virtual
+ void
+ Mouse(
+ int button,
+ int state,
+ int x,
+ int y
+ ) = 0;
+
+ virtual
+ void
+ Motion(
+ int x,
+ int y
+ ) = 0;
+
+ virtual
+ ~GlutMouseHandler(
+ ){};
+};
+
+class GlutMouseManager : public MEM_NonCopyable{
+
+public :
+
+ static
+ GlutMouseManager *
+ Instance(
+ );
+
+ // these are the functions you should pass to GLUT
+
+ static
+ void
+ Mouse(
+ int button,
+ int state,
+ int x,
+ int y
+ );
+
+ static
+ void
+ Motion(
+ int x,
+ int y
+ );
+
+ void
+ InstallHandler(
+ GlutMouseHandler *
+ );
+
+ void
+ ReleaseHandler(
+ );
+
+ ~GlutMouseManager(
+ );
+
+private :
+
+ GlutMouseManager (
+ ) :
+ m_handler (0)
+ {
+ };
+
+ GlutMouseHandler * m_handler;
+
+ static MEM_SmartPtr<GlutMouseManager> m_s_instance;
+};
+
+
+#endif \ No newline at end of file
diff --git a/intern/iksolver/test/ik_glut_test/common/Makefile b/intern/iksolver/test/ik_glut_test/common/Makefile
new file mode 100644
index 00000000000..07ad1837a7d
--- /dev/null
+++ b/intern/iksolver/test/ik_glut_test/common/Makefile
@@ -0,0 +1,44 @@
+#
+# $Id$
+#
+# ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version. The Blender
+# Foundation also sells licenses for use in proprietary software under
+# the Blender License. See http://www.blender.org/BL/ for information
+# about this.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+# All rights reserved.
+#
+# The Original Code is: all of this file.
+#
+# Contributor(s): none yet.
+#
+# ***** END GPL/BL DUAL LICENSE BLOCK *****
+# iksolver test intern Makefile
+#
+
+LIBNAME = common
+SOURCEDIR = intern/iksolver/test/ik_glut_test/$(LIBNAME)
+DIR = $(OCGDIR)/$(SOURCEDIR)
+
+include nan_compile.mk
+
+CCFLAGS += $(LEVEL_2_CPP_WARNINGS)
+
+CPPFLAGS += -I$(NAN_MOTO)/include
+CPPFLAGS += -I$(NAN_MEMUTIL)/include
+
diff --git a/intern/iksolver/test/ik_glut_test/intern/ChainDrawer.h b/intern/iksolver/test/ik_glut_test/intern/ChainDrawer.h
new file mode 100644
index 00000000000..a164e686e37
--- /dev/null
+++ b/intern/iksolver/test/ik_glut_test/intern/ChainDrawer.h
@@ -0,0 +1,387 @@
+/**
+ * $Id$
+ * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#ifndef NAN_INCLUDED_ChainDrawer_h
+
+#define NAN_INCLUDED_ChainDrawer_h
+
+#include "../common/GlutDrawer.h"
+#include "MyGlutMouseHandler.h"
+#include "MyGlutKeyHandler.h"
+#include "MT_Transform.h"
+#ifdef USE_QUATERNIONS
+# include "IK_Qsolver.h"
+# include "../intern/IK_QChain.h"
+# include "../intern/IK_QSolver_Class.h"
+#else
+# include "IK_solver.h"
+# include "../intern/IK_Chain.h"
+# include "../intern/IK_Solver_Class.h"
+#endif
+#include <GL/glut.h>
+
+class ChainDrawer : public GlutDrawer
+{
+public :
+ static
+ ChainDrawer *
+ New(
+ ) {
+ return new ChainDrawer();
+ }
+
+ void
+ SetMouseHandler(
+ MyGlutMouseHandler *mouse_handler
+ ) {
+ m_mouse_handler = mouse_handler;
+ }
+
+ void
+ SetKeyHandler (
+ MyGlutKeyHandler *key_handler
+ ) {
+ m_key_handler = key_handler;
+ }
+
+ void
+ SetChain(
+ IK_Chain_ExternPtr *chains,int chain_num
+ ) {
+ m_chain_num = chain_num;
+ m_chains = chains;
+ }
+
+
+ // inherited from GlutDrawer
+ void
+ Draw(
+ ) {
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(m_mouse_handler->AngleX(), 0.0, 1.0, 0.0);
+ glRotatef(m_mouse_handler->AngleY(), 1.0, 0.0, 0.0);
+
+ DrawScene();
+ glutSwapBuffers();
+
+ }
+
+ ~ChainDrawer(
+ ){
+ // nothing to do
+ };
+
+private :
+
+ void
+ DrawScene(
+ ){
+
+ // draw a little cross at the position of the key handler
+ // coordinates
+
+ MT_Vector3 line_x(4,0,0);
+ MT_Vector3 line_y(0.0,4,0);
+ MT_Vector3 line_z(0.0,0.0,4);
+
+ MT_Vector3 cross_origin = m_mouse_handler->Position();
+ MT_Vector3 temp;
+
+ glDisable(GL_LIGHTING);
+
+
+ glBegin(GL_LINES);
+
+ glColor3f (1.0f,1.0f,1.0f);
+
+ temp = cross_origin - line_x;
+ glVertex3f(temp[0],temp[1],temp[2]);
+ temp = cross_origin + line_x;
+ glVertex3f(temp[0],temp[1],temp[2]);
+
+ temp = cross_origin - line_y;
+ glVertex3f(temp[0],temp[1],temp[2]);
+ temp = cross_origin + line_y;
+ glVertex3f(temp[0],temp[1],temp[2]);
+
+ temp = cross_origin - line_z;
+ glVertex3f(temp[0],temp[1],temp[2]);
+ temp = cross_origin + line_z;
+ glVertex3f(temp[0],temp[1],temp[2]);
+
+ glEnd();
+ glEnable(GL_LIGHTING);
+
+
+ IK_Chain_ExternPtr chain;
+
+ int chain_num;
+ for (chain_num = 0; chain_num < m_chain_num; chain_num++) {
+ chain = m_chains[chain_num];
+
+
+ IK_Segment_ExternPtr segs = chain->segments;
+ IK_Segment_ExternPtr seg_start = segs;
+ const IK_Segment_ExternPtr seg_end = segs + chain->num_segments;
+ float ogl_matrix[16];
+
+ glColor3f (0.0f,1.0f,0.0f);
+
+ MT_Vector3 previous_origin(0,0,0);
+
+ MT_Transform global_transform;
+ global_transform.setIdentity();
+
+ for (; seg_start != seg_end; ++seg_start) {
+
+ glPushMatrix();
+
+ // fill ogl_matrix with zeros
+
+ std::fill(ogl_matrix,ogl_matrix + 16,float(0));
+
+ // we have to do a bit of work here to compute the chain's
+ // bone values
+
+ // first compute all the matrices we need
+
+ MT_Transform translation;
+ translation.setIdentity();
+ translation.translate(MT_Vector3(0,seg_start->length,0));
+
+ MT_Matrix3x3 seg_rot(
+ seg_start->basis_change[0],seg_start->basis_change[1],seg_start->basis_change[2],
+ seg_start->basis_change[3],seg_start->basis_change[4],seg_start->basis_change[5],
+ seg_start->basis_change[6],seg_start->basis_change[7],seg_start->basis_change[8]
+ );
+
+ seg_rot.transpose();
+
+ MT_Matrix3x3 seg_pre_rot(
+ seg_start->basis[0],seg_start->basis[1],seg_start->basis[2],
+ seg_start->basis[3],seg_start->basis[4],seg_start->basis[5],
+ seg_start->basis[6],seg_start->basis[7],seg_start->basis[8]
+ );
+
+
+ MT_Transform seg_t_pre_rot(
+ MT_Point3(
+ seg_start->seg_start[0],
+ seg_start->seg_start[1],
+ seg_start->seg_start[2]
+ ),
+ seg_pre_rot
+ );
+ // start of the bone is just the current global transform
+ // multiplied by the seg_start vector
+
+
+
+ MT_Transform seg_t_rot(MT_Point3(0,0,0),seg_rot);
+ MT_Transform seg_local = seg_t_pre_rot * seg_t_rot * translation;
+
+ MT_Vector3 bone_start = global_transform *
+ MT_Point3(
+ seg_start->seg_start[0],
+ seg_start->seg_start[1],
+ seg_start->seg_start[2]
+ );
+
+
+ global_transform = global_transform * seg_local;
+
+ global_transform.getValue(ogl_matrix);
+ MT_Vector3 bone_end = global_transform.getOrigin();
+
+ glMultMatrixf(ogl_matrix);
+// glutSolidSphere(0.5,5,5);
+
+ glPopMatrix();
+
+ glDisable(GL_LIGHTING);
+
+ glBegin(GL_LINES);
+
+ // draw lines of the principle axis of the local transform
+
+ MT_Vector3 x_axis(1,0,0);
+ MT_Vector3 y_axis(0,1,0);
+ MT_Vector3 z_axis(0,0,1);
+
+ x_axis = global_transform.getBasis() * x_axis * 5;
+ y_axis = global_transform.getBasis() * y_axis * 5;
+ z_axis = global_transform.getBasis() * z_axis * 5;
+
+
+ x_axis = x_axis + bone_start;
+ y_axis = y_axis + bone_start;
+ z_axis = z_axis + bone_start;
+
+ glColor3f(1,0,0);
+
+ glVertex3f(x_axis.x(),x_axis.y(),x_axis.z());
+ glVertex3f(
+ bone_start.x(),
+ bone_start.y(),
+ bone_start.z()
+ );
+
+ glColor3f(0,1,0);
+
+ glVertex3f(y_axis.x(),y_axis.y(),y_axis.z());
+ glVertex3f(
+ bone_start.x(),
+ bone_start.y(),
+ bone_start.z()
+ );
+
+ glColor3f(0,1,1);
+
+ glVertex3f(z_axis.x(),z_axis.y(),z_axis.z());
+ glVertex3f(
+ bone_start.x(),
+ bone_start.y(),
+ bone_start.z()
+ );
+
+ glColor3f(0,0,1);
+
+ glVertex3f(
+ bone_start.x(),
+ bone_start.y(),
+ bone_start.z()
+ );
+ glVertex3f(bone_end[0],bone_end[1],bone_end[2]);
+
+ glEnd();
+ glEnable(GL_LIGHTING);
+ }
+#if 0
+ // draw jacobian column vectors
+
+ // hack access to internals
+
+ IK_Solver_Class * internals = static_cast<IK_Solver_Class *>(chain->intern);
+
+ glDisable(GL_LIGHTING);
+
+ glBegin(GL_LINES);
+
+ const TNT::Matrix<MT_Scalar> & jac = internals->Chain().TransposedJacobian();
+
+ int i = 0;
+ for (i=0; i < jac.num_rows(); i++) {
+ glColor3f(1,1,1);
+
+ previous_origin = internals->Chain().Segments()[i/3].GlobalSegmentStart();
+
+ glVertex3f(previous_origin[0],previous_origin[1],previous_origin[2]);
+ glVertex3f(jac[i][0] + previous_origin[0],jac[i][1] + previous_origin[1],jac[i][2] + previous_origin[2]);
+
+
+ }
+ glEnd();
+ glEnable(GL_LIGHTING);
+#endif
+
+ }
+
+ glColor3f(1.0,1.0,1.0);
+
+ glDisable(GL_LIGHTING);
+ glBegin(GL_LINES);
+
+ MT_Scalar cube_size = 50;
+ glVertex3f(cube_size,cube_size,cube_size);
+ glVertex3f(-cube_size,cube_size,cube_size);
+
+ glVertex3f(cube_size,-cube_size,cube_size);
+ glVertex3f(-cube_size,-cube_size,cube_size);
+
+ glVertex3f(cube_size,cube_size,-cube_size);
+ glVertex3f(-cube_size,cube_size,-cube_size);
+
+ glVertex3f(cube_size,-cube_size,-cube_size);
+ glVertex3f(-cube_size,-cube_size,-cube_size);
+
+
+ glVertex3f(-cube_size,cube_size,cube_size);
+ glVertex3f(-cube_size,-cube_size,cube_size);
+
+ glVertex3f(cube_size,cube_size,-cube_size);
+ glVertex3f(cube_size,-cube_size,-cube_size);
+
+ glVertex3f(cube_size,cube_size,cube_size);
+ glVertex3f(cube_size,-cube_size,cube_size);
+
+ glVertex3f(-cube_size,cube_size,-cube_size);
+ glVertex3f(-cube_size,-cube_size,-cube_size);
+
+
+ glVertex3f(cube_size,cube_size,cube_size);
+ glVertex3f(cube_size,cube_size,-cube_size);
+
+ glVertex3f(cube_size,-cube_size,cube_size);
+ glVertex3f(cube_size,-cube_size,-cube_size);
+
+ glVertex3f(-cube_size,cube_size,cube_size);
+ glVertex3f(-cube_size,cube_size,-cube_size);
+
+ glVertex3f(-cube_size,-cube_size,cube_size);
+ glVertex3f(-cube_size,-cube_size,-cube_size);
+ glEnd();
+ glEnable(GL_LIGHTING);
+
+ };
+
+
+
+private :
+
+ MyGlutMouseHandler * m_mouse_handler;
+ MyGlutKeyHandler *m_key_handler;
+ IK_Chain_ExternPtr *m_chains;
+
+ int m_chain_num;
+ ChainDrawer (
+ ) : m_chains (NULL),
+ m_mouse_handler (NULL),
+ m_chain_num (0)
+ {
+ };
+
+};
+
+
+
+#endif \ No newline at end of file
diff --git a/intern/iksolver/test/ik_glut_test/intern/Makefile b/intern/iksolver/test/ik_glut_test/intern/Makefile
new file mode 100644
index 00000000000..fe1f4b54182
--- /dev/null
+++ b/intern/iksolver/test/ik_glut_test/intern/Makefile
@@ -0,0 +1,51 @@
+#
+# $Id$
+#
+# ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version. The Blender
+# Foundation also sells licenses for use in proprietary software under
+# the Blender License. See http://www.blender.org/BL/ for information
+# about this.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+# All rights reserved.
+#
+# The Original Code is: all of this file.
+#
+# Contributor(s): none yet.
+#
+# ***** END GPL/BL DUAL LICENSE BLOCK *****
+# iksolver test intern Makefile
+#
+
+LIBNAME = intern
+SOURCEDIR = intern/iksolver/test/ik_glut_test/$(LIBNAME)
+DIR = $(OCGDIR)/$(SOURCEDIR)
+
+include nan_compile.mk
+
+CCFLAGS += $(LEVEL_2_CPP_WARNINGS)
+
+CPPFLAGS += -I$(OPENGL_HEADERS)
+CPPFLAGS += -I../../../extern
+CPPFLAGS += -I../common
+CPPFLAGS += -I$(NAN_MOTO)/include
+CPPFLAGS += -I$(NAN_MEMUTIL)/include
+
+ifeq ($(OS),windows)
+ CPPFLAGS += -I$(NAN_LIBDIR)/windows/glut-3.7/include
+endif
+
diff --git a/intern/iksolver/test/ik_glut_test/intern/MyGlutKeyHandler.h b/intern/iksolver/test/ik_glut_test/intern/MyGlutKeyHandler.h
new file mode 100644
index 00000000000..5f88bda378c
--- /dev/null
+++ b/intern/iksolver/test/ik_glut_test/intern/MyGlutKeyHandler.h
@@ -0,0 +1,84 @@
+/**
+ * $Id$
+ * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#ifndef NAN_INCLUDED_MyGlutKeyHandler_h
+
+#define NAN_INCLUDED_MyGlutKeyHandler_h
+
+#include "../common/GlutKeyboardManager.h"
+
+class MyGlutKeyHandler : public GlutKeyboardHandler
+{
+public :
+ static
+ MyGlutKeyHandler *
+ New(
+ ) {
+ MEM_SmartPtr<MyGlutKeyHandler> output = new MyGlutKeyHandler();
+
+ if (output == NULL
+ ) {
+ return NULL;
+ }
+ return output.Release();
+
+ }
+
+ void
+ HandleKeyboard(
+ unsigned char key,
+ int x,
+ int y
+ ){
+
+ switch (key) {
+
+ case 27 :
+
+ exit(0);
+ }
+ }
+
+ ~MyGlutKeyHandler(
+ )
+ {
+ };
+
+private :
+
+ MyGlutKeyHandler(
+ )
+ {
+ }
+
+};
+#endif
+
diff --git a/intern/iksolver/test/ik_glut_test/intern/MyGlutMouseHandler.h b/intern/iksolver/test/ik_glut_test/intern/MyGlutMouseHandler.h
new file mode 100644
index 00000000000..e7d210beffb
--- /dev/null
+++ b/intern/iksolver/test/ik_glut_test/intern/MyGlutMouseHandler.h
@@ -0,0 +1,211 @@
+/**
+ * $Id$
+ * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#ifndef NAN_INCLUDED_MyGlutMouseHandler_h
+
+#define NAN_INCLUDED_MyGlutMouseHandler_h
+
+#include "../common/GlutMouseManager.h"
+#include <GL/glut.h>
+#include "IK_solver.h"
+
+class MyGlutMouseHandler : public GlutMouseHandler
+{
+
+public :
+
+ static
+ MyGlutMouseHandler *
+ New(
+ ) {
+ MEM_SmartPtr<MyGlutMouseHandler> output = new MyGlutMouseHandler();
+ if (output == NULL
+ ) {
+ return NULL;
+ }
+ return output.Release();
+
+ }
+
+ void
+ SetChain(
+ IK_Chain_ExternPtr *chains, int num_chains
+ ){
+ m_chains = chains;
+ m_num_chains = num_chains;
+ }
+
+ void
+ Mouse(
+ int button,
+ int state,
+ int x,
+ int y
+ ){
+ if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
+ m_moving = true;
+ m_begin_x = x;
+ m_begin_y = y;
+ }
+ if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) {
+ m_moving = false;
+ }
+
+ if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN) {
+ m_tracking = true;
+ }
+ if (button == GLUT_RIGHT_BUTTON && state == GLUT_UP) {
+ m_tracking = false;
+ }
+
+ if (button == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) {
+ m_cg_on = true;
+ }
+ if (button == GLUT_MIDDLE_BUTTON && state == GLUT_UP) {
+ m_cg_on = false;
+ }
+
+ }
+
+
+ void
+ Motion(
+ int x,
+ int y
+ ){
+ if (m_moving) {
+ m_angle_x = m_angle_x + (x - m_begin_x);
+ m_begin_x = x;
+
+ m_angle_y = m_angle_y + (y - m_begin_y);
+ m_begin_y = y;
+
+ glutPostRedisplay();
+ }
+ if (m_tracking) {
+
+ int w_h = glutGet((GLenum)GLUT_WINDOW_HEIGHT);
+
+ y = w_h - y;
+
+ double mvmatrix[16];
+ double projmatrix[16];
+ GLint viewport[4];
+
+ double px, py, pz,sz;
+
+ /* Get the matrices needed for gluUnProject */
+ glGetIntegerv(GL_VIEWPORT, viewport);
+ glGetDoublev(GL_MODELVIEW_MATRIX, mvmatrix);
+ glGetDoublev(GL_PROJECTION_MATRIX, projmatrix);
+
+ // work out the position of the end effector in screen space
+
+ GLdouble ex,ey,ez;
+ ex = m_pos.x();
+ ey = m_pos.y();
+ ez = m_pos.z();
+
+ gluProject(ex, ey, ez, mvmatrix, projmatrix, viewport, &px, &py, &sz);
+ gluUnProject((GLdouble) x, (GLdouble) y, sz, mvmatrix, projmatrix, viewport, &px, &py, &pz);
+
+ m_pos = MT_Vector3(px,py,pz);
+
+ }
+ if (m_tracking || m_cg_on) {
+ float temp[3];
+ m_pos.getValue(temp);
+
+ IK_SolveChain(m_chains[0],temp,0.01,200,0.1,m_chains[1]->segments);
+ IK_LoadChain(m_chains[0],m_chains[0]->segments,m_chains[0]->num_segments);
+
+ glutPostRedisplay();
+ }
+
+
+ }
+
+ const
+ float
+ AngleX(
+ ) const {
+ return m_angle_x;
+ }
+
+ const
+ float
+ AngleY(
+ ) const {
+ return m_angle_y;
+ }
+
+ const
+ MT_Vector3
+ Position(
+ ) const {
+ return m_pos;
+ }
+
+
+private :
+
+ MyGlutMouseHandler (
+ ) :
+ m_angle_x(0),
+ m_angle_y(0),
+ m_begin_x(0),
+ m_begin_y(0),
+ m_moving (false),
+ m_tracking (false),
+ m_pos(0,0,0),
+ m_cg_on (false),
+ m_chains(NULL),
+ m_num_chains(0)
+ {
+ };
+
+ float m_angle_x;
+ float m_angle_y;
+ float m_begin_x;
+ float m_begin_y;
+
+ bool m_moving;
+ bool m_tracking;
+ bool m_cg_on;
+ MT_Vector3 m_pos;
+
+ IK_Chain_ExternPtr *m_chains;
+ int m_num_chains;
+
+};
+
+
+#endif \ No newline at end of file
diff --git a/intern/iksolver/test/ik_glut_test/intern/main.cpp b/intern/iksolver/test/ik_glut_test/intern/main.cpp
new file mode 100644
index 00000000000..137c9bd4470
--- /dev/null
+++ b/intern/iksolver/test/ik_glut_test/intern/main.cpp
@@ -0,0 +1,361 @@
+/**
+ * $Id$
+ * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+/**
+ * $Id$
+ * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+
+#include "MEM_SmartPtr.h"
+
+#ifdef USE_QUATERNIONS
+#include "IK_Qsolver.h"
+#else
+#include "IK_solver.h"
+#endif
+
+#include <GL/glut.h>
+#include "MT_Vector3.h"
+#include "MT_Quaternion.h"
+#include "MT_Matrix3x3.h"
+#include "MyGlutMouseHandler.h"
+#include "MyGlutKeyHandler.h"
+#include "ChainDrawer.h"
+
+void
+init(MT_Vector3 min,MT_Vector3 max)
+{
+
+ GLfloat light_diffuse0[] = {1.0, 0.0, 0.0, 1.0}; /* Red diffuse light. */
+ GLfloat light_position0[] = {1.0, 1.0, 1.0, 0.0}; /* Infinite light location. */
+
+ GLfloat light_diffuse1[] = {1.0, 1.0, 1.0, 1.0}; /* Red diffuse light. */
+ GLfloat light_position1[] = {1.0, 0, 0, 0.0}; /* Infinite light location. */
+
+ /* Enable a single OpenGL light. */
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse0);
+ glLightfv(GL_LIGHT0, GL_POSITION, light_position0);
+
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse1);
+ glLightfv(GL_LIGHT1, GL_POSITION, light_position1);
+
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ glEnable(GL_LIGHTING);
+
+ /* Use depth buffering for hidden surface elimination. */
+ glEnable(GL_DEPTH_TEST);
+
+ /* Setup the view of the cube. */
+ glMatrixMode(GL_PROJECTION);
+
+ // centre of the box + 3* depth of box
+
+ MT_Vector3 centre = (min + max) * 0.5;
+ MT_Vector3 diag = max - min;
+
+ float depth = diag.length();
+ float distance = 2;
+
+ gluPerspective(
+ /* field of view in degree */ 40.0,
+ /* aspect ratio */ 1.0,
+ /* Z near */ 1.0,
+ /* Z far */ distance * depth * 2
+ );
+ glMatrixMode(GL_MODELVIEW);
+
+
+ gluLookAt(
+ centre.x(), centre.y(), centre.z() + distance*depth, /* eye is at (0,0,5) */
+ centre.x(), centre.y(), centre.z(), /* center is at (0,0,0) */
+ 0.0, 1.0, 0.); /* up is in positive Y direction */
+
+ glPushMatrix();
+
+
+}
+int
+main(int argc, char **argv)
+{
+
+
+ const int seg_num = 5;
+ const MT_Scalar seg_length = 15;
+
+ const float seg_startA[3] = {0,0,0};
+ const float seg_startB[3] = {0,-20,0};
+
+ // create some segments to solve with
+
+ // First chain
+ //////////////
+
+
+ IK_Segment_ExternPtr const segmentsA = new IK_Segment_Extern[seg_num];
+ IK_Segment_ExternPtr const segmentsB = new IK_Segment_Extern[seg_num];
+
+ IK_Segment_ExternPtr seg_it = segmentsA;
+ IK_Segment_ExternPtr seg_itB = segmentsB;
+
+
+ {
+
+// MT_Quaternion qmat(MT_Vector3(0,0,1),-3.141/2);
+ MT_Quaternion qmat(MT_Vector3(0,0,1),0);
+ MT_Matrix3x3 mat(qmat);
+
+ seg_it->seg_start[0] = seg_startA[0];
+ seg_it->seg_start[1] = seg_startA[1];
+ seg_it->seg_start[2] = seg_startA[2];
+
+ float temp[12];
+ mat.getValue(temp);
+
+ seg_it->basis[0] = temp[0];
+ seg_it->basis[1] = temp[1];
+ seg_it->basis[2] = temp[2];
+
+ seg_it->basis[3] = temp[4];
+ seg_it->basis[4] = temp[5];
+ seg_it->basis[5] = temp[6];
+
+ seg_it->basis[6] = temp[8];
+ seg_it->basis[7] = temp[9];
+ seg_it->basis[8] = temp[10];
+
+ seg_it->length = seg_length;
+
+ MT_Quaternion q;
+ q.setEuler(0,0,0);
+
+
+ MT_Matrix3x3 qrot(q);
+
+ seg_it->basis_change[0] = 1;
+ seg_it->basis_change[1] = 0;
+ seg_it->basis_change[2] = 0;
+ seg_it->basis_change[3] = 0;
+ seg_it->basis_change[4] = 1;
+ seg_it->basis_change[5] = 0;
+ seg_it->basis_change[6] = 0;
+ seg_it->basis_change[7] = 0;
+ seg_it->basis_change[8] = 1;
+
+
+ seg_it ++;
+
+ seg_itB->seg_start[0] = seg_startA[0];
+ seg_itB->seg_start[1] = seg_startA[1];
+ seg_itB->seg_start[2] = seg_startA[2];
+
+ seg_itB->basis[0] = temp[0];
+ seg_itB->basis[1] = temp[1];
+ seg_itB->basis[2] = temp[2];
+
+ seg_itB->basis[3] = temp[4];
+ seg_itB->basis[4] = temp[5];
+ seg_itB->basis[5] = temp[6];
+
+ seg_itB->basis[6] = temp[8];
+ seg_itB->basis[7] = temp[9];
+ seg_itB->basis[8] = temp[10];
+
+ seg_itB->length = seg_length;
+
+ seg_itB->basis_change[0] = 1;
+ seg_itB->basis_change[1] = 0;
+ seg_itB->basis_change[2] = 0;
+ seg_itB->basis_change[3] = 0;
+ seg_itB->basis_change[4] = 1;
+ seg_itB->basis_change[5] = 0;
+ seg_itB->basis_change[6] = 0;
+ seg_itB->basis_change[7] = 0;
+ seg_itB->basis_change[8] = 1;
+
+
+ seg_itB ++;
+
+
+ }
+
+
+ int i;
+ for (i=1; i < seg_num; ++i, ++seg_it,++seg_itB) {
+
+ MT_Quaternion qmat(MT_Vector3(0,0,1),0.3);
+ MT_Matrix3x3 mat(qmat);
+
+ seg_it->seg_start[0] = 0;
+ seg_it->seg_start[1] = 0;
+ seg_it->seg_start[2] = 0;
+
+ float temp[12];
+ mat.getValue(temp);
+
+ seg_it->basis[0] = temp[0];
+ seg_it->basis[1] = temp[1];
+ seg_it->basis[2] = temp[2];
+
+ seg_it->basis[3] = temp[4];
+ seg_it->basis[4] = temp[5];
+ seg_it->basis[5] = temp[6];
+
+ seg_it->basis[6] = temp[8];
+ seg_it->basis[7] = temp[9];
+ seg_it->basis[8] = temp[10];
+
+ seg_it->length = seg_length;
+
+ MT_Quaternion q;
+ q.setEuler(0,0,0);
+
+
+ MT_Matrix3x3 qrot(q);
+
+ seg_it->basis_change[0] = 1;
+ seg_it->basis_change[1] = 0;
+ seg_it->basis_change[2] = 0;
+ seg_it->basis_change[3] = 0;
+ seg_it->basis_change[4] = 1;
+ seg_it->basis_change[5] = 0;
+ seg_it->basis_change[6] = 0;
+ seg_it->basis_change[7] = 0;
+ seg_it->basis_change[8] = 1;
+
+
+ ///////////////////////////////
+
+ seg_itB->seg_start[0] = 0;
+ seg_itB->seg_start[1] = 0;
+ seg_itB->seg_start[2] = 0;
+
+ seg_itB->basis[0] = temp[0];
+ seg_itB->basis[1] = temp[1];
+ seg_itB->basis[2] = temp[2];
+
+ seg_itB->basis[3] = temp[4];
+ seg_itB->basis[4] = temp[5];
+ seg_itB->basis[5] = temp[6];
+
+ seg_itB->basis[6] = temp[8];
+ seg_itB->basis[7] = temp[9];
+ seg_itB->basis[8] = temp[10];
+
+ seg_itB->length = seg_length;
+
+ seg_itB->basis_change[0] = 1;
+ seg_itB->basis_change[1] = 0;
+ seg_itB->basis_change[2] = 0;
+ seg_itB->basis_change[3] = 0;
+ seg_itB->basis_change[4] = 1;
+ seg_itB->basis_change[5] = 0;
+ seg_itB->basis_change[6] = 0;
+ seg_itB->basis_change[7] = 0;
+ seg_itB->basis_change[8] = 1;
+
+
+
+ }
+
+ // create the chains
+
+ const int num_chains = 2;
+
+ IK_Chain_ExternPtr chains[num_chains];
+
+ chains[0] = IK_CreateChain();
+ chains[1] = IK_CreateChain();
+
+ // load segments into chain
+
+ IK_LoadChain(chains[0],segmentsA,seg_num);
+ IK_LoadChain(chains[1],segmentsB,seg_num);
+
+ // make and install a mouse handler
+
+ MEM_SmartPtr<MyGlutMouseHandler> mouse_handler (MyGlutMouseHandler::New());
+ GlutMouseManager::Instance()->InstallHandler(mouse_handler);
+
+ mouse_handler->SetChain(chains,num_chains);
+
+ // make and install a keyhandler
+ MEM_SmartPtr<MyGlutKeyHandler> key_handler (MyGlutKeyHandler::New());
+ GlutKeyboardManager::Instance()->InstallHandler(key_handler);
+
+ // instantiate the drawing class
+
+ MEM_SmartPtr<ChainDrawer> drawer (ChainDrawer::New());
+ GlutDrawManager::Instance()->InstallDrawer(drawer);
+
+ drawer->SetMouseHandler(mouse_handler);
+ drawer->SetChain(chains,num_chains);
+ drawer->SetKeyHandler(key_handler);
+
+ glutInit(&argc, argv);
+ glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
+ glutCreateWindow("ik");
+ glutDisplayFunc(GlutDrawManager::Draw);
+ glutMouseFunc(GlutMouseManager::Mouse);
+ glutMotionFunc(GlutMouseManager::Motion);
+ glutKeyboardFunc(GlutKeyboardManager::HandleKeyboard);
+
+ init(MT_Vector3(-50,-50,-50),MT_Vector3(50,50,50));
+ glutMainLoop();
+ return 0; /* ANSI C requires main to return int. */
+}
diff --git a/intern/iksolver/test/ik_glut_test/make/msvc_6_0/ik_glut_test.dsp b/intern/iksolver/test/ik_glut_test/make/msvc_6_0/ik_glut_test.dsp
new file mode 100644
index 00000000000..8688b2fcc2c
--- /dev/null
+++ b/intern/iksolver/test/ik_glut_test/make/msvc_6_0/ik_glut_test.dsp
@@ -0,0 +1,130 @@
+# Microsoft Developer Studio Project File - Name="ik_glut_test" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=ik_glut_test - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "ik_glut_test.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "ik_glut_test.mak" CFG="ik_glut_test - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "ik_glut_test - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "ik_glut_test - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "ik_glut_test - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\..\..\extern" /I "..\..\..\..\..\..\lib\windows\glut-3.7\include" /I "..\..\..\..\..\..\lib\windows\moto\include" /I "..\..\..\..\..\..\lib\windows\memutil\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x413 /d "NDEBUG"
+# ADD RSC /l 0x413 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 iksolver_rmtd.lib libmoto.a /nologo /subsystem:console /machine:I386 /libpath:"..\..\..\..\lib\windows\release" /libpath:"..\..\..\..\..\..\lib\windows\glut-3.7\lib" /libpath:"..\..\..\..\..\..\lib\windows\moto\lib"
+
+!ELSEIF "$(CFG)" == "ik_glut_test - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\..\..\..\extern" /I "..\..\..\..\..\..\lib\windows\glut-3.7\include" /I "..\..\..\..\..\..\lib\windows\moto\include" /I "..\..\..\..\..\..\lib\windows\memutil\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x413 /d "_DEBUG"
+# ADD RSC /l 0x413 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 iksolver_dmtd.lib libmoto.a /nologo /subsystem:console /debug /machine:I386 /nodefaultlib:"LIBCMTD.lib" /pdbtype:sept /libpath:"..\..\..\..\lib\windows\debug" /libpath:"..\..\..\..\..\..\lib\windows\glut-3.7\lib" /libpath:"..\..\..\..\..\..\lib\windows\moto\lib\debug"
+
+!ENDIF
+
+# Begin Target
+
+# Name "ik_glut_test - Win32 Release"
+# Name "ik_glut_test - Win32 Debug"
+# Begin Group "common"
+
+# PROP Default_Filter ""
+# Begin Source File
+
+SOURCE=..\..\common\GlutDrawer.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\common\GlutDrawer.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\common\GlutKeyboardManager.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\common\GlutKeyboardManager.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\common\GlutMouseManager.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\common\GlutMouseManager.h
+# End Source File
+# End Group
+# Begin Source File
+
+SOURCE=..\..\intern\ChainDrawer.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\intern\main.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\intern\MyGlutKeyHandler.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\intern\MyGlutMouseHandler.h
+# End Source File
+# End Target
+# End Project
diff --git a/intern/iksolver/test/ik_glut_test/make/msvc_6_0/ik_glut_test.dsw b/intern/iksolver/test/ik_glut_test/make/msvc_6_0/ik_glut_test.dsw
new file mode 100644
index 00000000000..09b7094137b
--- /dev/null
+++ b/intern/iksolver/test/ik_glut_test/make/msvc_6_0/ik_glut_test.dsw
@@ -0,0 +1,49 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "ik_glut_test"=.\ik_glut_test.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name iksolver
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "iksolver"=..\..\..\..\make\msvc_6_0\iksolver.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
+
+
+
+
+