static int motion_cb(Ihandle *ih,int x,int y,char* status) { (void)status; if (move) { double dif_x, dif_y; double dx, dy, dz; double x1, y1, z1; double x2, y2, z2; double angle, norma; int height = IupGetInt2(ih, "RASTERSIZE"); double mv[16]; double pm[16]; int vp[4]; IupGLMakeCurrent(ih); glGetDoublev(GL_MODELVIEW_MATRIX, mv); glGetDoublev(GL_PROJECTION_MATRIX, pm); glGetIntegerv(GL_VIEWPORT, vp); dif_x = x - pos_x; dif_y = y - pos_y; if (dif_x == 0 && dif_y == 0) return IUP_DEFAULT; pos_x = x; pos_y = y; angle = sqrt(dif_x*dif_x + dif_y*dif_y); gluUnProject(pos_x, INVERT_Y(pos_y), 0.0, mv, pm, vp, &x1, &y1, &z1); gluUnProject((double)(dif_y + pos_x), (double)(dif_x + INVERT_Y(pos_y)), 0.0, mv, pm, vp, &x2, &y2, &z2); dx = x2-x1; dy = y2-y1; dz = z2-z1; norma = sqrt(dx*dx + dy*dy + dz*dz); dx /= norma; dy /= norma; dz /= norma; glMatrixMode(GL_MODELVIEW); glTranslated(0.5, 0.5, 0.5); glRotated (angle, dx, dy, dz); glTranslated(-0.5, -0.5, -0.5); glGetDoublev(GL_MODELVIEW_MATRIX, model_view_matrix); use_model_matrix = 1; draw_cube(); IupGLSwapBuffers(ih); } return IUP_DEFAULT; }
static int motion_cb(Ihandle *ih,int x,int y,char* status) { (void)status; if (move) { double dif_x, dif_y; double dx, dy, dz; double x1, y1, z1; double x2, y2, z2; double angle, norma; int height = IupGetInt2(ih, "RASTERSIZE"); IupGLMakeCurrent(ih); dif_x = x - pos_x; dif_y = y - pos_y; pos_x = x; pos_y = y; angle = sqrt(dif_x*dif_x + dif_y*dif_y); unproject (pos_x, INVERT_Y(pos_y), &x1, &y1, &z1); unproject ((double)(dif_y+pos_x), (double)(dif_x+INVERT_Y(pos_y)), &x2, &y2, &z2); dx = x2-x1; dy = y2-y1; dz = z2-z1; norma = sqrt(dx*dx + dy*dy + dz*dz); dx /= norma; dy /= norma; dz /= norma; glTranslated(0.5, 0.5, 0.5); glRotated (angle, dx, dy, dz); glTranslated(-0.5, -0.5, -0.5); draw_cube(); glFlush(); IupGLSwapBuffers(ih); } return IUP_DEFAULT; }
void Beetle::drawUpdate() { if (!_data) error("Beetle::drawUpdate: sequences have not been loaded!"); if (_data->frame != NULL) { getScenes()->setCoordinates(_data->frame); getScenes()->removeFromQueue(_data->frame); } // Update current frame switch (_data->indexes[_data->offset]) { default: _data->currentFrame += 10; break; case 3: case 6: case 9: case 12: case 15: case 18: case 21: case 24: case 25: case 26: case 27: case 28: _data->currentFrame++; break; } // Update current sequence if (_data->currentSequence->count() <= _data->currentFrame) { switch (_data->indexes[_data->offset]) { default: _data->offset++; _data->currentSequence = _data->sequences[_data->indexes[_data->offset]]; break; case 3: case 6: case 9: case 12: case 15: case 18: case 21: break; } _data->currentFrame = 0; if (_data->indexes[_data->offset] == 29) { SAFE_DELETE(_data->frame); _data->currentSequence = NULL; // pointer to existing sequence return; } } // Update coordinates switch (_data->indexes[_data->offset]) { default: break; case 0: _data->coordY -= _data->coordOffset; break; case 3: _data->coordX += _data->coordOffset; _data->coordY -= _data->coordOffset; break; case 6: _data->coordX += _data->coordOffset; break; case 9: _data->coordX += _data->coordOffset; _data->coordY += _data->coordOffset; break; case 12: _data->coordY += _data->coordOffset; break; case 15: _data->coordX -= _data->coordOffset; _data->coordY += _data->coordOffset; break; case 18: _data->coordX -= _data->coordOffset; break; case 21: _data->coordX -= _data->coordOffset; _data->coordY -= _data->coordOffset; break; } // Update beetle data int rnd = rnd(100); if (_data->coordX < 165 || _data->coordX > 465) { uint index = 0; if (rnd >= 30) { if (rnd >= 70) index = (_data->coordX < 165) ? 9 : 15; else index = (_data->coordX < 165) ? 6 : 18; } else { index = (_data->coordX < 165) ? 3 : 21; } updateData(index); } if (_data->coordY < 178) { switch (_data->indexes[_data->offset]) { default: updateData(26); break; case 3: updateData(25); break; case 21: updateData(27); break; } } if (_data->coordY > 354) { switch (_data->indexes[_data->offset]) { default: break; case 9: case 12: case 15: updateData(28); break; } } #define INVERT_Y() \ switch (_data->indexes[_data->offset]) { \ default: \ break; \ case 24: \ case 25: \ case 26: \ case 27: \ case 28: \ _data->coordY = -_data->coordY; \ break; \ } // Invert direction INVERT_Y(); SequenceFrame *frame = new SequenceFrame(_data->currentSequence, (uint16)_data->currentFrame); updateFrame(frame); INVERT_Y(); getScenes()->addToQueue(frame); SAFE_DELETE(_data->frame); _data->frame = frame; }