IK Solver: remove unused and outdated test code.
This commit is contained in:
@@ -1,91 +0,0 @@
|
|||||||
/**
|
|
||||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License
|
|
||||||
* as published by the Free Software Foundation; either version 2
|
|
||||||
* of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software Foundation,
|
|
||||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
||||||
*
|
|
||||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* The Original Code is: all of this file.
|
|
||||||
*
|
|
||||||
* Contributor(s): none yet.
|
|
||||||
*
|
|
||||||
* ***** END GPL LICENSE BLOCK *****
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "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);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@@ -1,95 +0,0 @@
|
|||||||
/**
|
|
||||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License
|
|
||||||
* as published by the Free Software Foundation; either version 2
|
|
||||||
* of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software Foundation,
|
|
||||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
||||||
*
|
|
||||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* The Original Code is: all of this file.
|
|
||||||
*
|
|
||||||
* Contributor(s): none yet.
|
|
||||||
*
|
|
||||||
* ***** END GPL LICENSE BLOCK *****
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __GLUTDRAWER_H__
|
|
||||||
#define __GLUTDRAWER_H__
|
|
||||||
|
|
||||||
#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
|
|
||||||
|
|
@@ -1,84 +0,0 @@
|
|||||||
/**
|
|
||||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License
|
|
||||||
* as published by the Free Software Foundation; either version 2
|
|
||||||
* of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software Foundation,
|
|
||||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
||||||
*
|
|
||||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* The Original Code is: all of this file.
|
|
||||||
*
|
|
||||||
* Contributor(s): none yet.
|
|
||||||
*
|
|
||||||
* ***** END GPL LICENSE BLOCK *****
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "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);
|
|
||||||
}
|
|
@@ -1,101 +0,0 @@
|
|||||||
/**
|
|
||||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License
|
|
||||||
* as published by the Free Software Foundation; either version 2
|
|
||||||
* of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software Foundation,
|
|
||||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
||||||
*
|
|
||||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* The Original Code is: all of this file.
|
|
||||||
*
|
|
||||||
* Contributor(s): none yet.
|
|
||||||
*
|
|
||||||
* ***** END GPL LICENSE BLOCK *****
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __GLUTKEYBOARDMANAGER_H__
|
|
||||||
#define __GLUTKEYBOARDMANAGER_H__
|
|
||||||
|
|
||||||
#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
|
|
||||||
|
|
@@ -1,99 +0,0 @@
|
|||||||
/**
|
|
||||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License
|
|
||||||
* as published by the Free Software Foundation; either version 2
|
|
||||||
* of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software Foundation,
|
|
||||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
||||||
*
|
|
||||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* The Original Code is: all of this file.
|
|
||||||
*
|
|
||||||
* Contributor(s): none yet.
|
|
||||||
*
|
|
||||||
* ***** END GPL LICENSE BLOCK *****
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "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);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@@ -1,111 +0,0 @@
|
|||||||
/**
|
|
||||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License
|
|
||||||
* as published by the Free Software Foundation; either version 2
|
|
||||||
* of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software Foundation,
|
|
||||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
||||||
*
|
|
||||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* The Original Code is: all of this file.
|
|
||||||
*
|
|
||||||
* Contributor(s): none yet.
|
|
||||||
*
|
|
||||||
* ***** END GPL LICENSE BLOCK *****
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __GLUTMOUSEMANAGER_H__
|
|
||||||
#define __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
|
|
||||||
|
|
@@ -1,375 +0,0 @@
|
|||||||
/**
|
|
||||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License
|
|
||||||
* as published by the Free Software Foundation; either version 2
|
|
||||||
* of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software Foundation,
|
|
||||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
||||||
*
|
|
||||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* The Original Code is: all of this file.
|
|
||||||
*
|
|
||||||
* Contributor(s): none yet.
|
|
||||||
*
|
|
||||||
* ***** END GPL LICENSE BLOCK *****
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __CHAINDRAWER_H__
|
|
||||||
#define __CHAINDRAWER_H__
|
|
||||||
|
|
||||||
#include "../common/GlutDrawer.h"
|
|
||||||
#include "MyGlutMouseHandler.h"
|
|
||||||
#include "MyGlutKeyHandler.h"
|
|
||||||
#include "MT_Transform.h"
|
|
||||||
# include "IK_Qsolver.h"
|
|
||||||
# include "../intern/IK_QChain.h"
|
|
||||||
# include "../intern/IK_QSolver_Class.h"
|
|
||||||
#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
|
|
||||||
|
|
@@ -1,80 +0,0 @@
|
|||||||
/**
|
|
||||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License
|
|
||||||
* as published by the Free Software Foundation; either version 2
|
|
||||||
* of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software Foundation,
|
|
||||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
||||||
*
|
|
||||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* The Original Code is: all of this file.
|
|
||||||
*
|
|
||||||
* Contributor(s): none yet.
|
|
||||||
*
|
|
||||||
* ***** END GPL LICENSE BLOCK *****
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __MYGLUTKEYHANDLER_H__
|
|
||||||
#define __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
|
|
||||||
|
|
@@ -1,206 +0,0 @@
|
|||||||
/**
|
|
||||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License
|
|
||||||
* as published by the Free Software Foundation; either version 2
|
|
||||||
* of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software Foundation,
|
|
||||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
||||||
*
|
|
||||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* The Original Code is: all of this file.
|
|
||||||
*
|
|
||||||
* Contributor(s): none yet.
|
|
||||||
*
|
|
||||||
* ***** END GPL LICENSE BLOCK *****
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __MYGLUTMOUSEHANDLER_H__
|
|
||||||
#define __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
|
|
||||||
|
|
@@ -1,321 +0,0 @@
|
|||||||
/**
|
|
||||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License
|
|
||||||
* as published by the Free Software Foundation; either version 2
|
|
||||||
* of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software Foundation,
|
|
||||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
||||||
*
|
|
||||||
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* The Original Code is: all of this file.
|
|
||||||
*
|
|
||||||
* Contributor(s): none yet.
|
|
||||||
*
|
|
||||||
* ***** END GPL LICENSE BLOCK *****
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "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);
|
|
||||||
|
|
||||||
// center of the box + 3* depth of box
|
|
||||||
|
|
||||||
MT_Vector3 center = (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(center.x(), center.y(), center.z() + distance*depth, /* eye is at (0,0,5) */
|
|
||||||
center.x(), center.y(), center.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. */
|
|
||||||
}
|
|
Reference in New Issue
Block a user