refactoring for object cloning
git-svn-id: svn://anubis/anaglym/trunk@62 99a6e188-d820-4881-8870-2d33a10e2619
This commit is contained in:
parent
9ca4338d32
commit
f237390761
2
Makefile
2
Makefile
@ -35,7 +35,7 @@ else
|
|||||||
GLLIBS := -lGL -lGLU
|
GLLIBS := -lGL -lGLU
|
||||||
endif
|
endif
|
||||||
|
|
||||||
export CFLAGS := $(LUAINCLUDE) $(SDLINCLUDE) $(ODEINCLUDE) -O2
|
export CFLAGS := $(LUAINCLUDE) $(SDLINCLUDE) $(ODEINCLUDE) -O2 -Wall
|
||||||
export CXXFLAGS := $(CFLAGS)
|
export CXXFLAGS := $(CFLAGS)
|
||||||
export LDFLAGS := $(LUALIBS) $(ODELIBS) $(GLLIBS) $(WINDOWSLIBS) $(SDLLIBS)
|
export LDFLAGS := $(LUALIBS) $(ODELIBS) $(GLLIBS) $(WINDOWSLIBS) $(SDLLIBS)
|
||||||
|
|
||||||
|
50
ag.cc
50
ag.cc
@ -35,7 +35,7 @@ namespace ag
|
|||||||
luaL_register(L, "ag", functions);
|
luaL_register(L, "ag", functions);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int print_val(lua_State * L, int index)
|
static void print_val(lua_State * L, int index)
|
||||||
{
|
{
|
||||||
int type = lua_type(L, index);
|
int type = lua_type(L, index);
|
||||||
switch (type)
|
switch (type)
|
||||||
@ -99,6 +99,21 @@ namespace ag
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void createLuaObject(lua_State * L, int id)
|
||||||
|
{
|
||||||
|
lua_newtable(L);
|
||||||
|
lua_pushinteger(L, id);
|
||||||
|
lua_setfield(L, -2, "id");
|
||||||
|
lua_pushcfunction(L, object::draw);
|
||||||
|
lua_setfield(L, -2, "draw");
|
||||||
|
lua_pushcfunction(L, object::setPosition);
|
||||||
|
lua_setfield(L, -2, "setPosition");
|
||||||
|
lua_pushcfunction(L, object::getPosition);
|
||||||
|
lua_setfield(L, -2, "getPosition");
|
||||||
|
lua_pushcfunction(L, object::clone);
|
||||||
|
lua_setfield(L, -2, "clone");
|
||||||
|
}
|
||||||
|
|
||||||
static int loadModelSpecify(lua_State * L, bool static_data)
|
static int loadModelSpecify(lua_State * L, bool static_data)
|
||||||
{
|
{
|
||||||
int argc = lua_gettop(L);
|
int argc = lua_gettop(L);
|
||||||
@ -118,15 +133,7 @@ namespace ag
|
|||||||
if (obj->load(path))
|
if (obj->load(path))
|
||||||
{
|
{
|
||||||
int id = g_engine->addObject(obj, static_data);
|
int id = g_engine->addObject(obj, static_data);
|
||||||
lua_newtable(L);
|
createLuaObject(L, id);
|
||||||
lua_pushinteger(L, id);
|
|
||||||
lua_setfield(L, -2, "id");
|
|
||||||
lua_pushcfunction(L, object::draw);
|
|
||||||
lua_setfield(L, -2, "draw");
|
|
||||||
lua_pushcfunction(L, object::setPosition);
|
|
||||||
lua_setfield(L, -2, "setPosition");
|
|
||||||
lua_pushcfunction(L, object::getPosition);
|
|
||||||
lua_setfield(L, -2, "getPosition");
|
|
||||||
if (physpath != "")
|
if (physpath != "")
|
||||||
{
|
{
|
||||||
Engine::Object * obj = g_engine->getObject(id);
|
Engine::Object * obj = g_engine->getObject(id);
|
||||||
@ -152,12 +159,12 @@ namespace ag
|
|||||||
|
|
||||||
int loadModel(lua_State * L)
|
int loadModel(lua_State * L)
|
||||||
{
|
{
|
||||||
loadModelSpecify(L, false);
|
return loadModelSpecify(L, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
int loadStaticModel(lua_State * L)
|
int loadStaticModel(lua_State * L)
|
||||||
{
|
{
|
||||||
loadModelSpecify(L, true);
|
return loadModelSpecify(L, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
int sleep(lua_State * L)
|
int sleep(lua_State * L)
|
||||||
@ -279,5 +286,24 @@ namespace ag
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int clone(lua_State * L)
|
||||||
|
{
|
||||||
|
int argc = lua_gettop(L);
|
||||||
|
bool found = false;
|
||||||
|
if (argc == 1)
|
||||||
|
{
|
||||||
|
Engine::Object * obj = getObject(L, 1);
|
||||||
|
if (obj != NULL)
|
||||||
|
{
|
||||||
|
found = true;
|
||||||
|
int id = g_engine->cloneObject(obj);
|
||||||
|
createLuaObject(L, id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found)
|
||||||
|
lua_pushnil(L);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
1
ag.h
1
ag.h
@ -23,6 +23,7 @@ namespace ag
|
|||||||
int draw(lua_State * L);
|
int draw(lua_State * L);
|
||||||
int setPosition(lua_State * L);
|
int setPosition(lua_State * L);
|
||||||
int getPosition(lua_State * L);
|
int getPosition(lua_State * L);
|
||||||
|
int clone(lua_State * L);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
23
anaglym.cc
23
anaglym.cc
@ -183,10 +183,17 @@ bool Engine::fileExists(const string & path)
|
|||||||
|
|
||||||
int Engine::addObject(WFObj * obj, bool is_static)
|
int Engine::addObject(WFObj * obj, bool is_static)
|
||||||
{
|
{
|
||||||
int id = m_next_object_index;
|
int id = m_next_object_index++;
|
||||||
Object * o = createObject(is_static, obj->render());
|
Object * o = createObject(is_static, obj->render());
|
||||||
m_objects[id] = o;
|
m_objects[id] = o;
|
||||||
m_next_object_index++;
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Engine::cloneObject(const Engine::Object * obj)
|
||||||
|
{
|
||||||
|
int id = m_next_object_index++;
|
||||||
|
Object * o = new Object(*obj);
|
||||||
|
m_objects[id] = o;
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -277,11 +284,9 @@ void Engine::run()
|
|||||||
switch (event.type)
|
switch (event.type)
|
||||||
{
|
{
|
||||||
case SDL_KEYDOWN:
|
case SDL_KEYDOWN:
|
||||||
switch (event.key.keysym.sym)
|
if (event.key.keysym.sym == SDLK_ESCAPE)
|
||||||
{
|
{
|
||||||
case SDLK_ESCAPE:
|
|
||||||
goto RET;
|
goto RET;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SDL_QUIT:
|
case SDL_QUIT:
|
||||||
@ -323,12 +328,18 @@ void Engine::doPhysics()
|
|||||||
if (last_updated > 0)
|
if (last_updated > 0)
|
||||||
{
|
{
|
||||||
Uint32 msec_steps = current_ticks - last_updated;
|
Uint32 msec_steps = current_ticks - last_updated;
|
||||||
for (int i = 0; i < msec_steps; i++)
|
for (Uint32 i = 0; i < msec_steps; i++)
|
||||||
m_world.step();
|
m_world.step();
|
||||||
}
|
}
|
||||||
last_updated = current_ticks;
|
last_updated = current_ticks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Engine::Object::Object(const Engine::Object & orig)
|
||||||
|
{
|
||||||
|
m_display_list = orig.m_display_list;
|
||||||
|
m_ode_object = new OdeWorld::Object(*m_ode_object);
|
||||||
|
}
|
||||||
|
|
||||||
void Engine::Object::draw()
|
void Engine::Object::draw()
|
||||||
{
|
{
|
||||||
const dReal * pos = m_ode_object->getPosition();
|
const dReal * pos = m_ode_object->getPosition();
|
||||||
|
@ -22,6 +22,7 @@ class Engine
|
|||||||
m_ode_object = world.createObject(is_static);
|
m_ode_object = world.createObject(is_static);
|
||||||
m_display_list = dl;
|
m_display_list = dl;
|
||||||
}
|
}
|
||||||
|
Object(const Object & orig);
|
||||||
~Object()
|
~Object()
|
||||||
{
|
{
|
||||||
delete m_ode_object;
|
delete m_ode_object;
|
||||||
@ -57,6 +58,7 @@ class Engine
|
|||||||
void reportErrors(int status);
|
void reportErrors(int status);
|
||||||
OdeWorld & getWorld() { return m_world; }
|
OdeWorld & getWorld() { return m_world; }
|
||||||
int addObject(WFObj * obj, bool is_static);
|
int addObject(WFObj * obj, bool is_static);
|
||||||
|
int cloneObject(const Object * obj);
|
||||||
Object * getObject(int id);
|
Object * getObject(int id);
|
||||||
void doPhysics();
|
void doPhysics();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user