diff --git a/Engine.cc b/Engine.cc index f1de0ff..603e5b4 100644 --- a/Engine.cc +++ b/Engine.cc @@ -693,6 +693,40 @@ refptr< vector > Engine::pickObjects(int x, int y) return ret; } +Engine::PickedObjectRef Engine::pickOne(int x, int y, Engine::Object *obj) +{ + dMatrix3 r; + dVector3 right, forward, up; + dVector3 rotated_direction, initial_direction; + up[0] = m_up[0]; + up[1] = m_up[1]; + up[2] = m_up[2]; + forward[0] = m_center[0] - m_eye[0]; + forward[1] = m_center[1] - m_eye[1]; + forward[2] = m_center[2] - m_eye[2]; + cross_product(right, forward, up); + dRFrom2Axes(r, right[0], right[1], right[2], + forward[0], forward[1], forward[2]); + initial_direction[0] = x - m_av.getWidth() / 2; + initial_direction[1] = m_screen_dist; + initial_direction[2] = y - m_av.getHeight() / 2; + dMultiply0(rotated_direction, r, initial_direction, 3, 3, 1); + normalize(rotated_direction); + + OdeWorld::PickedObjectRef owpor = + m_world.pickOne(m_eye[0], m_eye[1], m_eye[2], + rotated_direction[0], rotated_direction[1], rotated_direction[2], + obj->getOdeWorldObject()); + + PickedObjectRef ret; + + if (!owpor.isNull()) + { + ret = new PickedObject(owpor); + } + return ret; +} + void Engine::debug_hook(lua_Debug * debug) { Uint32 ticks = SDL_GetTicks(); diff --git a/Engine.h b/Engine.h index 2d34e31..1d0e0d3 100644 --- a/Engine.h +++ b/Engine.h @@ -93,6 +93,7 @@ class Engine } void setID(int id) { m_id = id; } int getID() { return m_id; } + OdeWorld::Object *getOdeWorldObject() { return m_ode_object; } protected: void createManagedObject(); @@ -216,6 +217,7 @@ class Engine } bool getScriptCursorVisible() { return m_script_cursor_visible; } refptr< std::vector > pickObjects(int x, int y); + PickedObjectRef pickOne(int x, int y, Object *obj); void getScreenSize(int * width, int * height); void drawText(const char * text, GLfloat r, GLfloat g, GLfloat b,