Add mouse position to world coord translation.
parent
b8b724204b
commit
feac7aea69
|
@ -22,6 +22,7 @@ int drawText(int x, int y, char *text);
|
||||||
int drawPrintf(int x, int y, const char *fmt, ...);
|
int drawPrintf(int x, int y, const char *fmt, ...);
|
||||||
int drawDebugPrintf(const char *fmt, ...);
|
int drawDebugPrintf(const char *fmt, ...);
|
||||||
void drawDebugPoint(vec3 *origin, int colorIndex);
|
void drawDebugPoint(vec3 *origin, int colorIndex);
|
||||||
|
void drawTestUnproject(void);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ static const float bmeshBallColors[][4] {
|
||||||
|
|
||||||
static const float bmeshBoneColor[3] = {1, 1, 0};
|
static const float bmeshBoneColor[3] = {1, 1, 0};
|
||||||
|
|
||||||
static QGLWidget *_this = 0;
|
static Render *_this = 0;
|
||||||
static int debugOutputTop = 0;
|
static int debugOutputTop = 0;
|
||||||
|
|
||||||
int drawDebugPrintf(const char *fmt, ...) {
|
int drawDebugPrintf(const char *fmt, ...) {
|
||||||
|
@ -35,7 +35,14 @@ int drawDebugPrintf(const char *fmt, ...) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int drawBmeshBall(bmesh *bm, bmeshBall *ball) {
|
static int drawBmeshBall(bmesh *bm, bmeshBall *ball) {
|
||||||
glColor4fv(bmeshBallColors[ball->type]);
|
float color[4];
|
||||||
|
memcpy(color, bmeshBallColors[ball->type], sizeof(color));
|
||||||
|
vec3 mousePos[] = {{_this->mouseWorldX, _this->mouseWorldY,
|
||||||
|
_this->mouseWorldZ}};
|
||||||
|
if (vec3Distance(&ball->position, mousePos) <= ball->radius * 5) {
|
||||||
|
color[3] = 1;
|
||||||
|
}
|
||||||
|
glColor4fv(color);
|
||||||
drawSphere(&ball->position, ball->radius, 36, 24);
|
drawSphere(&ball->position, ball->radius, 36, 24);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -43,7 +50,7 @@ static int drawBmeshBall(bmesh *bm, bmeshBall *ball) {
|
||||||
static void drawBmeshBallRecursively(bmesh *bm, bmeshBall *ball) {
|
static void drawBmeshBallRecursively(bmesh *bm, bmeshBall *ball) {
|
||||||
bmeshBallIterator iterator;
|
bmeshBallIterator iterator;
|
||||||
bmeshBall *child;
|
bmeshBall *child;
|
||||||
//drawBmeshBall(bm, ball);
|
drawBmeshBall(bm, ball);
|
||||||
for (child = bmeshGetBallFirstChild(bm, ball, &iterator);
|
for (child = bmeshGetBallFirstChild(bm, ball, &iterator);
|
||||||
child;
|
child;
|
||||||
child = bmeshGetBallNextChild(bm, ball, &iterator)) {
|
child = bmeshGetBallNextChild(bm, ball, &iterator)) {
|
||||||
|
@ -213,6 +220,31 @@ void Render::initializeGL() {
|
||||||
drawInit();
|
drawInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void screenCoordsToWorld(float winX, float winY,
|
||||||
|
float *worldX, float *worldY, float *worldZ){
|
||||||
|
GLint viewport[4];
|
||||||
|
GLdouble modelview[16];
|
||||||
|
GLdouble projection[16];
|
||||||
|
GLfloat winZ = 0;
|
||||||
|
GLdouble x, y, z;
|
||||||
|
|
||||||
|
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
|
||||||
|
glGetDoublev(GL_PROJECTION_MATRIX, projection);
|
||||||
|
glGetIntegerv(GL_VIEWPORT, viewport);
|
||||||
|
|
||||||
|
winX = (float)winX;
|
||||||
|
winY = (float)viewport[3] - (float)winY;
|
||||||
|
winZ = 0;
|
||||||
|
|
||||||
|
gluUnProject((GLdouble)winX, (GLdouble)winY, (GLdouble)winZ,
|
||||||
|
(const GLdouble *)modelview, (const GLdouble *)projection, viewport,
|
||||||
|
&x, &y, &z);
|
||||||
|
|
||||||
|
*worldX = (float)x;
|
||||||
|
*worldY = (float)y;
|
||||||
|
*worldZ = (float)z;
|
||||||
|
}
|
||||||
|
|
||||||
#include "../data/bmesh_test_2.h"
|
#include "../data/bmesh_test_2.h"
|
||||||
|
|
||||||
void Render::paintGL() {
|
void Render::paintGL() {
|
||||||
|
@ -237,6 +269,12 @@ void Render::paintGL() {
|
||||||
|
|
||||||
glEnable(GL_LIGHTING);
|
glEnable(GL_LIGHTING);
|
||||||
|
|
||||||
|
screenCoordsToWorld(_this->mouseX, _this->mouseY,
|
||||||
|
&_this->mouseWorldX, &_this->mouseWorldY, &_this->mouseWorldZ);
|
||||||
|
glColor3f(0.0f, 0.0f, 0.0f);
|
||||||
|
drawDebugPrintf("%d,%d -> %f,%f,%f", _this->mouseX, _this->mouseY,
|
||||||
|
_this->mouseWorldX, _this->mouseWorldY, _this->mouseWorldZ);
|
||||||
|
|
||||||
if (0 == bm) {
|
if (0 == bm) {
|
||||||
bmeshBall ball;
|
bmeshBall ball;
|
||||||
bmeshBone bone;
|
bmeshBone bone;
|
||||||
|
@ -313,6 +351,9 @@ void Render::paintGL() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//glColor3f(0.0f, 0.0f, 0.0f);
|
||||||
|
//drawTestUnproject();
|
||||||
|
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
|
||||||
//if (bm) {
|
//if (bm) {
|
||||||
|
@ -332,6 +373,17 @@ void Render::resizeGL(int w, int h) {
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
void drawTestUnproject(void) {
|
||||||
|
float worldX, worldY, worldZ;
|
||||||
|
if (_this) {
|
||||||
|
screenCoordsToWorld(_this->mouseX, _this->mouseY, &worldX, &worldY, &worldZ);
|
||||||
|
glColor3f(0.0f, 0.0f, 0.0f);
|
||||||
|
drawDebugPrintf("%d,%d -> %f,%f,%f", _this->mouseX, _this->mouseY,
|
||||||
|
worldX, worldY, worldZ);
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
void Render::mousePressEvent(QMouseEvent *event) {
|
void Render::mousePressEvent(QMouseEvent *event) {
|
||||||
mouseX = event->x();
|
mouseX = event->x();
|
||||||
mouseY = event->y();
|
mouseY = event->y();
|
||||||
|
|
|
@ -18,9 +18,12 @@ protected:
|
||||||
void mouseMoveEvent(QMouseEvent *event);
|
void mouseMoveEvent(QMouseEvent *event);
|
||||||
void wheelEvent(QWheelEvent * event);
|
void wheelEvent(QWheelEvent * event);
|
||||||
|
|
||||||
private:
|
public:
|
||||||
int mouseX;
|
int mouseX;
|
||||||
int mouseY;
|
int mouseY;
|
||||||
|
float mouseWorldX;
|
||||||
|
float mouseWorldY;
|
||||||
|
float mouseWorldZ;
|
||||||
float cameraAngleX;
|
float cameraAngleX;
|
||||||
float cameraAngleY;
|
float cameraAngleY;
|
||||||
float cameraDistance;
|
float cameraDistance;
|
||||||
|
|
Loading…
Reference in New Issue