#include "WgdMouse.h" #include #include #include #include #include using namespace wgd; using namespace doste; wgd::Mouse* WgdMouse::mouse; doste::dvm::OID WgdMouse::scene; float WgdMouse::_top, WgdMouse::_left; float WgdMouse::_width, WgdMouse::_height; wgd::vector2d WgdMouse::_pos; wgd::vector2d WgdMouse::_aim; wgd::vector2d WgdMouse::_delta; wgd::vector2d WgdMouse::_lastPos; bool WgdMouse::buttons[MOUSE_BTN_COUNT]; bool WgdMouse::lastButtons[MOUSE_BTN_COUNT]; bool WgdMouse::mouseMovedSinceClick[MOUSE_BTN_COUNT]; void WgdMouse::init() { //Get pointers to wgdlib objects mouse = wgd::WGD["input"]["mouse"].get(); scene = wgd::WGD["widgets"]["root"]["children"]["scene"]["scene"]["instances"].get(); //Get dimensions of 'scene' widget updateDimensions(); //Misc _lastPos.x = 0.5f; _lastPos.y = 0.5f; } void WgdMouse::updateDimensions() { OID scene = wgd::WGD["widgets"]["root"]["children"]["scene"]; _left = scene.get("x"); _top = scene.get("y"); _width = scene.get("width"); _height = scene.get("height"); return; //OID scene = wgd::WGD["widgets"]["root"]["children"]["scene"]; _left = 0; _top = 0; _width = scene.get("width"); _width = scene.get("height"); } bool WgdMouse::isOnScreen() { return _pos.x >= 0.0f && _pos.x <= 1.0f && _pos.y >= 0.0f && _pos.y <= 1.0f; } void WgdMouse::update() { //Current mouse position - will eventually be modified to take scene widget into account _pos.x = ((float)mouse->x() - _left) / _width; _pos.y = ((float)mouse->y() - _top) / _height; _aim = (_pos * 2.0f) - vector2d(1.0f, 1.0f); //Calculate delta _delta = _pos - _lastPos; //Update lastPos _lastPos = _pos; /* //Show standard pointer for menu bar if (_pos.y < 0.0f) mouse->visible(true); else mouse->visible(cursor->model() ? false : true); //Move 3D cursor if (cursor->model()) cursor->position(WgdOai::toWGD(getPos3D(snapCursor))); */ //Buttons memcpy(&lastButtons, buttons, sizeof buttons); buttons[MOUSE_BTN_LEFT] = mouse->btnPressed(wgd::Mouse::BTN_LEFT); buttons[MOUSE_BTN_MIDDLE] = mouse->btnPressed(wgd::Mouse::BTN_MIDDLE); buttons[MOUSE_BTN_RIGHT] = mouse->btnPressed(wgd::Mouse::BTN_RIGHT); //Update mouseMovedSinceClick[] for(int i=0; i 0.001f) mouseMovedSinceClick[i] = true; else if (buttonPressed((MouseBtn)i)) mouseMovedSinceClick[i] = false; } } /*vector3d WgdMouse::getPos3D(bool snap) { //Clipmap intersection wgd::vector3d target, normal; wgd::vector3d v = camera->unProject(wgd::vector3d(_pos.x * _width, _pos.y * _height, 1.0f)); wgd::ClipMap* clip = Game::getInstance()->getClipMap(); if (clip->test(camera->position(), v, target, normal) == 0) { //ray-plane intersection (Check ray against ground plane) wgd::vector3d v0(0.0f, 0.0f, 0.0f); wgd::vector3d n(0.0f, 1.0f, 0.0f); wgd::vector3d p0 = camera->position(); wgd::vector3d w = p0 - v0; wgd::Camera3D* camera = WgdOai::getBase().get("camera"); wgd::vector2d m(_pos.x * 1024.0f, _pos.y * 738.0f); wgd::vector3d u = (camera->unProject(m) - camera->position()).normalise(); float s = wgd::vector3d::dotProduct(-n, w) / wgd::vector3d::dotProduct(n, u); target = p0 + (s * u); } if (snap) { target.x = floorf(target.x + 0.5f); target.y = floorf(target.y + 0.5f); target.z = floorf(target.z + 0.5f); } return WgdOai::toOAI(target); } oai::VertexPath* WgdMouse::getTarget() { //Find where we're pointing at vector3d _pos = getPos3D(false); vector3d pos(_pos.x, _pos.y, _pos.z); //Find closest vertex to mouse pointer oai::VertexPath* v = Core::getWorld()->getGraph()->quantise(pos); //Check distance to vertex if (v && (v->pos - pos).length() < 0.5f) return v; else return NULL; } */