Jump to content

LUA CPP "how to" 5/7

Charrua

969 views

4) How to call an entity's script LUA function passing parameters

 

following code is some what weird but you only have to pay attention on a few things

 

the idea is Push the parameters in the order they are declared in the lua function (from left to right)

and pay attention in the Interpreter:Invoke method. You have to set the first parameter (number of staked values) one more of the amount of parameters passed.

 

consider the following LUA function:

 

function Script:turnMe(turn)
  System:Print("calling me from C")
  self.entity:Turn(turn.x,turn.y,turn.z,true)
end
 

 

note that "turn" is a Vec3 variable

 

so you have to push the correct type of variable to lua stack and then tell Interpreter::Invoke that there are 2 things on the stack (as the code explains, one is always present: thank's Josh for that beautiful piece of code!)

 

here is a generic function to call any LUA script function that has one parameter of type Vec3:

bool call_turnMe(Entity* e, string funcName, Vec3 vec3){

  if (e->component == NULL) return false;
  bool success = false;

  //Get the component table
  int stacksize = Interpreter::GetStackSize();

  //Get the global error handler function
  int errorfunctionindex = 0;

#ifdef DEBUG
  Interpreter::GetGlobal("LuaErrorHandler");
  errorfunctionindex = Interpreter::GetStackSize();
#endif

  e->Push();
  Interpreter::GetField("script"); //test if entity has a script
  if (Interpreter::IsTable())
  {
    System::Print(" entity has script");
    Interpreter::GetField(funcName);
    if (Interpreter::IsFunction()) //test if funcName is a function
    {
      System::Print(" " + funcName + " defined");
      Interpreter::PushValue(-2); //Push script table onto stack
      Interpreter::PushVec3(vec3); //we only pass one variable but stack has one more
#ifdef DEBUG
  errorfunctionindex = -(Interpreter::GetStackSize() - errorfunctionindex + 1);
#endif
      success = Interpreter::Invoke(2, 0, errorfunctionindex); // send 2 params, receive none (next tut for receive parameters)
      }
    }
  Interpreter::SetStackSize(stacksize); //keep stack under control
}

 

 

Interpreter has a nice amount of pushes:

 

pushAABB, pushFloat, pushInt, pushString, pushCObject, pushObject, pushBool, pushNull,

pushMat3, pushMat4, pushVec2, pushVec3, pushVec4, pushValue

 

just remember: push parameters with the correct type and in order in which they was declared in the LUA function.

 

next tut, show how to pass 3 ints and receive a float, and also show how to receive more than one value from a lua script, because Return in lua may contain a list of values.

 

that's it

 

Next, Home, Previous



2 Comments


Recommended Comments

Oh, this one is very nice. I didn't realize how to call entity script functions. I've been calling global functions all the time. This is very handy! Ty.

 

Now if only we could pin stuff like this :(

Share this comment


Link to comment

have to admit that i learn it that yesterday! :)

now i'm cleaning the app before post the "allincluded" one with tolua++ examples also.

i'm very happy with the new knowledge so i decided to post it, before it get lost on my mind... and my machine!

Share this comment


Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...