This repository has been archived on 2023-10-09. You can view files and clone it, but cannot push or open issues or pull requests.
Files
blender-archive/intern/iksolver/test/ik_glut_test/intern/MyGlutMouseHandler.h
Kent Mein f78de74b20 WooHoo me again ;)
I took out the following from the includes in the intern dir that still had
it:
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif

Kent
--
mein@cs.umn.edu
2002-12-26 18:25:17 +00:00

211 lines
4.1 KiB
C++

/**
* $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