Jump to content

Issues with ToLua++


reepblue
 Share

Recommended Posts

Hi,

 

Over the past few weeks, I've been looking into how to link objects to classes created in C++. Since I prefer to code in C++ but still value the flexibility of Lua, the goal of mine is to simply link a Object whether be a pivot, CSG, or a model to a C++ Class while having all the advantages of the Flowgraph communication, and such. When I came across ToLua++ (This File), I thought this would fix my problem.

 

The plan was to link an object to a class by doing something like this in the Start function:

 

self = self.class:new()

 

However, if the lua-gluecode.cpp is included in the project at all without any calls from the Interpreter, the game will just downright crash if any object has a lua script attached to it, even the ones included in the SDK. I thought it was lua-gluecode.cpp calling my class wrong, but if it's NULL, it still does the same thing.

 

luacommands.pkg:

class BaseEntity;

 

lua-gluecode.cpp:

/*
** Lua binding: luacommands
** Generated automatically by tolua++-1.0.92 on 01/15/15 17:09:26.
*/
#ifndef __cplusplus
#include "stdlib.h"
#endif
#include "string.h"
#include "tolua++.h"
/* Exported function */
TOLUA_API int tolua_luacommands_open (lua_State* tolua_S);

/* function to register type */
static void tolua_reg_types (lua_State* tolua_S)
{
tolua_usertype(tolua_S,"BaseEntity");
}
/* Open function */
TOLUA_API int tolua_luacommands_open (lua_State* tolua_S)
{
tolua_open(tolua_S);
tolua_reg_types(tolua_S);
tolua_module(tolua_S,NULL,0);
tolua_beginmodule(tolua_S,NULL);
tolua_cclass(tolua_S,"BaseEntity","BaseEntity","",NULL);
tolua_beginmodule(tolua_S,"BaseEntity");
tolua_endmodule(tolua_S);
tolua_endmodule(tolua_S);
return 1;
}

#if defined(LUA_VERSION_NUM) && LUA_VERSION_NUM >= 501
TOLUA_API int luaopen_luacommands (lua_State* tolua_S) {
return tolua_luacommands_open(tolua_S);
};
#endif

 

App.cpp::

#include "App.h"
using namespace Leadwerks;

App::App() : window(NULL), context(NULL), world(NULL), camera(NULL) {}

App::~App() { delete world; delete window; }

Vec3 camerarotation;
bool freelookmode=true;

bool App::Start()
{
//Initialize Steamworks (optional)
if (!Steamworks::Initialize())
{
System::Print("Error: Failed to initialize Steam.");
return false;
}

// Call ToLua++
if (Interpreter::L == NULL) Interpreter::Reset();
tolua_luacommands_open(Interpreter::L);

//Create a window
if (System::GetProperty("fullscreen") == "1")
{
window = Window::Create("Test v0.0", 0, 0, 1024, 768, Window::FullScreen);
}
else
{
window = Window::Create("Test v0.0", 0, 0, 1024, 768, Window::Titlebar);
}

//Create a context
context = Context::Create(window);

//Create a world
world = World::Create();

//Create a camera
camera = Camera::Create();
camera->Move(0,2,-5);

//Hide the mouse cursor
window->HideMouse();

std::string mapname = System::GetProperty("map","Maps/start.map");
Map::Load(mapname);

//Move the mouse to the center of the screen
window->SetMousePosition(context->GetWidth()/2,context->GetHeight()/2);

return true;
}

bool App::Loop()
{
//Close the window to end the program
if (window->Closed()) return false;

//Press escape to end freelook mode
if (window->KeyHit(Key::Escape))
{
if (!freelookmode) return false;
freelookmode=false;
window->ShowMouse();
}

if (freelookmode)
{
//Keyboard movement
float strafe = (window->KeyDown(Key:) - window->KeyDown(Key::A))*Time::GetSpeed() * 0.05;
float move = (window->KeyDown(Key::W) - window->KeyDown(Key::S))*Time::GetSpeed() * 0.05;
camera->Move(strafe,0,move);

//Get the mouse movement
float sx = context->GetWidth()/2;
float sy = context->GetHeight()/2;
Vec3 mouseposition = window->GetMousePosition();
float dx = mouseposition.x - sx;
float dy = mouseposition.y - sy;

//Adjust and set the camera rotation
camerarotation.x += dy / 10.0;
camerarotation.y += dx / 10.0;
camera->SetRotation(camerarotation);

//Move the mouse to the center of the screen
window->SetMousePosition(sx,sy);
}

Time::Update();
world->Update();
world->Render();

context->Sync();

return true;
}

 

If you want my BaseEntity.cpp/.h stuff, I can send it over, but it does absolutely nothing but print something on spawn. And as I said before, the luacommands.pkg can be totally empty and not be calling anything and it will still crash.

 

If anyone could help, or recommend me better ways of doing this, I'll appreciate it.

Thanks!

Cyclone - Ultra Game System - Component PreprocessorTex2TGA - Darkness Awaits Template (Leadwerks)

If you like my work, consider supporting me on Patreon!

Link to comment
Share on other sites

I did some poking around, it's the use of tolua_luacommands_open(lua_State* tolua_S) under "/* Open function */" ls what kills it. The function can just return 0, and it will still crash. So I assume this is an issue with the library?

Cyclone - Ultra Game System - Component PreprocessorTex2TGA - Darkness Awaits Template (Leadwerks)

If you like my work, consider supporting me on Patreon!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   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.

 Share

×
×
  • Create New...