Autor Wątek: lua + ogre - wyjście z aplikacji  (Przeczytany 1437 razy)

Offline czoper

  • Użytkownik
    • czoper.devlog

# Luty 05, 2010, 16:11:16
Mam problem z LUA i Ogre.

W Ogre pisany jest symulator jazdy buggy po pustyni. Skrypty LUA są odpowiedzialne jak na razie za pozycjonowanie kamer ("TPP" i "FPP").

Problem jest następujący: po kilkunastu sekundach działania aplikacji (jazda samochodem itp.) aplikacja się po prostu zamyka, nie rzuca żadnego wyjątku etc. Błąd na pewno jest związany z LUA, bo wykomentowanie linii z wywołaniem skryptu i liczenie wartości explicite w kodzie wyeliminowało wyłączanie się aplikacji.

fragment z wywołaniem skryptu:

void CameraTPP::update(double deltaTime)
{
Ogre::Quaternion quat = m_buggy->getOrientation();
Ogre::Vector3 position = m_buggy->getPosition();

// ustawienie pozycji kamery
Ogre::Vector3 forward, up;
forward = quat.zAxis().normalisedCopy();
up = quat.yAxis().normalisedCopy();   
double retx, rety, retz;
        try
        {
        lua_instance::getInstance()->callFunction("GetTPPCameraPosition", "ddddddddd>ddd", position.x, position.y, position.z, forward.x, forward.y, forward.z, up.x, up.y, up.z, &retx, &rety, &retz);
                Ogre::Vector3 camPos(retx, rety, retz);
                m_ogreCamera->setPosition(camPos);
        }
        catch (...)
        {
                Ogre::Vector3 camPos = position + up * 10.0f - 30.0f * forward;
                m_ogreCamera->setPosition(camPos);
        }
        // ustawienie orientacji
if (!m_lookingBack)
{
// kamera nie patrzy w tył -> odwrócenie kamery
Ogre::Vector3 x, y, z;
quat.ToAxes(x, y, z);
z = -z;
x = -x;
quat.FromAxes(x, y, z);
}
m_ogreCamera->setOrientation(quat);
}

Metoda callFunction: (zaczerpnięta stąd: http://www.steve.org.uk/Software/lua-c++/lua-c++/)

void lua_instance::callFunction(const char *func, const char *sig, ...)
{
    va_list vl;
    int arguments_count, results_count;  /* number of arguments and results */
   
    va_start(vl, sig);
    lua_getglobal(luaState, func);  /* get function */
   
    /* push arguments */
    arguments_count = 0;
    while (*sig)
    {
        /* push arguments */
        switch (*sig++)
{
case 'd':  /* double argument */
lua_pushnumber(luaState, va_arg(vl, double));
break;

case 'i':  /* int argument */
lua_pushnumber(luaState, va_arg(vl, int));
break;

case 's':  /* string argument */
lua_pushstring(luaState, va_arg(vl, char*));
break;

case '>':
goto endwhile;

default:
callFunctionError("invalid option (%c)", *(sig - 1));
        }
        arguments_count++;
        luaL_checkstack(luaState, 1, "too many arguments");
    }
    endwhile:   

    results_count = strlen(sig);
    if (lua_pcall(luaState, arguments_count, results_count, 0) != 0) callFunctionError("error running function `%s': %s", func, lua_tostring(luaState, -1));
   
    results_count = -results_count;
    while (*sig)
    {
/* get results */
        switch (*sig++)
{
case 'd': /* double result */
if (!lua_isnumber(luaState, results_count)) callFunctionError("wrong result type");
*va_arg(vl, double*) = lua_tonumber(luaState, results_count);
break;
   
case 'i': /* int result */
if (!lua_isnumber(luaState, results_count)) callFunctionError("wrong result type");
*va_arg(vl, int*) = (int)lua_tonumber(luaState, results_count);
break;

case 's': /* string result */
if (!lua_isstring( luaState, results_count)) callFunctionError("wrong result type");
*va_arg(vl, const char**) = lua_tostring(luaState, results_count);
break;
   
default:
callFunctionError("invalid option (%c)", *(sig - 1));
        }
        results_count++;
    }
    va_end(vl);
}

/// <summary>
/// Call function error
/// </summary>
void lua_instance::callFunctionError(const char* fmt, ...)
{
    //va_list argp;
    //va_start(argp, fmt);
    //vfprintf(stderr, fmt, argp);
    //va_end(argp);
    //lua_close(luaState);
    throw "callFunctionError";
    //system("PAUSE");
    //exit(EXIT_FAILURE);
}

i wreszcie skrypt
function GetTPPCameraPosition(px, py, pz, fx, fy, fz, ux, uy, uz)
upFactor = 10;
forwardFactor = -30;

retx = px + ux * upFactor + forwardFactor * fx;
rety = py + uy * upFactor + forwardFactor * fy;
retz = pz + uz * upFactor + forwardFactor * fz;
return retx, rety, retz;
end

reszta kodu tutaj: http://code.assembla.com/Afro_Derby/subversion/nodes

Byłbym wdzięczny za jakikolwiek pomysł co z tym zrobić.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline WielkiPan

  • Użytkownik

# Luty 05, 2010, 16:23:44

Offline Khaine

  • Użytkownik

# Luty 05, 2010, 16:28:28
Cytuj
Punkt 2. "Jak nie lamić?"
http://wiki.warsztat.gd/Jak_nie_lami%C4%87
Akurat w tym temacie nie trafiles :P

Z lua tez mialem taki problem, ze nagle aplikacja sie wywala (lua_next :P). Probowales wywolywac funkcje lua bez tego callFunction? Bo jesli gdzies jest blad to w lua api.

Offline czoper

  • Użytkownik
    • czoper.devlog

# Luty 06, 2010, 20:18:38
Jak będę miał więcej czasu być może zajmę się wywołaniem funkcji ze skryptu bez opakowywania tego, jednak z racji tego, że termin oddania aplikacji jest bardzo bliski zrobiłem szybką przesiadkę na AngelScript.