From 59f8c7a28eefff1654f683a33c4d3182226349da Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Thu, 16 Sep 2010 21:12:38 +0000 Subject: [PATCH] changed OdeWorld::pickObjects and Engine::pickObjects to return distance, position, and normal information along with object identifier git-svn-id: svn://anubis/anaglym/trunk@304 99a6e188-d820-4881-8870-2d33a10e2619 --- Engine.cc | 28 ++++++++++++++++++++++------ Engine.h | 14 +++++++++++++- ag.cc | 7 ++++--- 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/Engine.cc b/Engine.cc index 0e3353c..f1de0ff 100644 --- a/Engine.cc +++ b/Engine.cc @@ -658,7 +658,7 @@ void Engine::clearWorld() } } -refptr< vector > Engine::pickObjects(int x, int y) +refptr< vector > Engine::pickObjects(int x, int y) { dMatrix3 r; dVector3 right, forward, up; @@ -678,17 +678,17 @@ refptr< vector > Engine::pickObjects(int x, int y) dMultiply0(rotated_direction, r, initial_direction, 3, 3, 1); normalize(rotated_direction); - refptr< vector > objects = + refptr< vector > objects = m_world.pickObjects(m_eye[0], m_eye[1], m_eye[2], rotated_direction[0], rotated_direction[1], rotated_direction[2]); - refptr< vector > ret = new vector(); - for (vector::const_iterator it = objects->begin(); + refptr< vector > ret = new vector(); + for (vector::const_iterator it + = objects->begin(); it != objects->end(); it++) { - Object * o = (Object *) (*it)->getUserData(); - ret->push_back(o->getID()); + ret->push_back(new PickedObject(*it)); } return ret; } @@ -1729,3 +1729,19 @@ string Engine::EngineFileLoader::resolvePath(const Path & path) file_path = path.fullPath; return file_path; } + + +/******** Engine::PickedObject functions ********/ + +Engine::PickedObject::PickedObject(OdeWorld::PickedObjectRef por) +{ + Object * o = (Object *) por->obj->getUserData(); + id = o->getID(); + dist = por->dist; + pos[0] = por->pos[0]; + pos[1] = por->pos[1]; + pos[2] = por->pos[2]; + normal[0] = por->normal[0]; + normal[1] = por->normal[1]; + normal[2] = por->normal[2]; +} diff --git a/Engine.h b/Engine.h index 41365e2..2d34e31 100644 --- a/Engine.h +++ b/Engine.h @@ -136,6 +136,18 @@ class Engine Engine * m_engine; }; + class PickedObject + { + public: + int id; + float dist; + float pos[3]; + float normal[3]; + + PickedObject(OdeWorld::PickedObjectRef por); + }; + typedef refptr PickedObjectRef; + Engine(const std::string & path, AV & av); ~Engine(); @@ -203,7 +215,7 @@ class Engine updateCursorVisibility(); } bool getScriptCursorVisible() { return m_script_cursor_visible; } - refptr< std::vector > pickObjects(int x, int y); + refptr< std::vector > pickObjects(int x, int y); void getScreenSize(int * width, int * height); void drawText(const char * text, GLfloat r, GLfloat g, GLfloat b, diff --git a/ag.cc b/ag.cc index 76889b7..c6da35d 100644 --- a/ag.cc +++ b/ag.cc @@ -97,15 +97,16 @@ namespace ag { lua_newtable(L); int next_index = 1; - refptr< vector > objects = + refptr< vector > objects = g_engine->pickObjects(lua_tointeger(L, 1), lua_tointeger(L, 2)); - for (vector::const_iterator it = objects->begin(); + for (vector::const_iterator it + = objects->begin(); it != objects->end(); it++) { lua_getfield(L, LUA_GLOBALSINDEX, "ag"); /* pushes 1 */ lua_getfield(L, -1, "_objects"); /* pushes 1 */ - lua_pushinteger(L, *it); /* pushes 1 */ + lua_pushinteger(L, (*it)->id); /* pushes 1 */ lua_gettable(L, -2); /* replace top */ lua_remove(L, -3); /* remove 1 */ lua_remove(L, -2); /* remove 1 */