Added Embedding Lua Video #1
parent
5f650f3922
commit
d4cf430f9d
@ -0,0 +1,80 @@ |
|||||||
|
|
||||||
|
-- Embedding Lua in C++ Part #1 |
||||||
|
-- "Stupid 3D printer, I didn't want a nest..." - javidx9 |
||||||
|
-- |
||||||
|
-- License (OLC-3) |
||||||
|
-- ~~~~~~~~~~~~~~~ |
||||||
|
-- |
||||||
|
-- Copyright 2018-2019 OneLoneCoder.com |
||||||
|
-- |
||||||
|
-- Redistribution and use in source and binary forms, with or without |
||||||
|
-- modification, are permitted provided that the following conditions |
||||||
|
-- are met: |
||||||
|
-- |
||||||
|
-- 1. Redistributions or derivations of source code must retain the above |
||||||
|
-- copyright notice, this list of conditions and the following disclaimer. |
||||||
|
-- |
||||||
|
-- 2. Redistributions or derivative works in binary form must reproduce |
||||||
|
-- the above copyright notice. This list of conditions and the following |
||||||
|
-- disclaimer must be reproduced in the documentation and/or other |
||||||
|
-- materials provided with the distribution. |
||||||
|
-- |
||||||
|
-- 3. Neither the name of the copyright holder nor the names of its |
||||||
|
-- contributors may be used to endorse or promote products derived |
||||||
|
-- from this software without specific prior written permission. |
||||||
|
-- |
||||||
|
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
-- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
-- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
-- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
-- HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
-- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
-- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
-- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
-- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
-- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
-- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
-- |
||||||
|
-- Relevant Video: https://youtu.be/4l5HdmPoynw |
||||||
|
-- |
||||||
|
-- Links |
||||||
|
-- ~~~~~ |
||||||
|
-- YouTube: https://www.youtube.com/javidx9 |
||||||
|
-- https://www.youtube.com/javidx9extra |
||||||
|
-- Discord: https://discord.gg/WhwHUMV |
||||||
|
-- Twitter: https://www.twitter.com/javidx9 |
||||||
|
-- Twitch: https://www.twitch.tv/javidx9 |
||||||
|
-- GitHub: https://www.github.com/onelonecoder |
||||||
|
-- Patreon: https://www.patreon.com/javidx9 |
||||||
|
-- Homepage: https://www.onelonecoder.com |
||||||
|
-- |
||||||
|
-- Author |
||||||
|
-- ~~~~~~ |
||||||
|
-- David Barr, aka javidx9, ©OneLoneCoder 2019 |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- Stage 1: Reading Simple Values |
||||||
|
a = 5 |
||||||
|
b = 7 |
||||||
|
c = a + b |
||||||
|
d = "OneLoneCoder.com" |
||||||
|
|
||||||
|
-- Stage 2: Reading a simple object |
||||||
|
player = {Title = "Squire", Name = "Ciaran", Family = "Wirral", Level = 20} |
||||||
|
|
||||||
|
-- Stage 3: Calling a Lua Function |
||||||
|
function CalledFromCPP1(r1, r2, r3) |
||||||
|
io.write("[LUA S3] CalledFromCPP1("..r1..", "..r2..", "..r3..")\n") |
||||||
|
return r1 * r2 |
||||||
|
end |
||||||
|
|
||||||
|
-- Stage 4: Calling a C++ Function |
||||||
|
function CalledFromCPP2(r1, r2) |
||||||
|
io.write("[LUA S4] CalledFromCPP2("..r1..", "..r2..")\n") |
||||||
|
io.write("[LUA S4] Calling HostFunction("..r1..", "..r2..")\n") |
||||||
|
r = HostFunction(r1, r2) |
||||||
|
io.write("[LUA S4] HostFunction returned "..r.."\n") |
||||||
|
return r * 15 |
||||||
|
end |
||||||
|
|
@ -0,0 +1,200 @@ |
|||||||
|
/*
|
||||||
|
Embedding Lua in C++ Part #1 |
||||||
|
"Stupid 3D printer, I didn't want a nest..." - javidx9 |
||||||
|
|
||||||
|
License (OLC-3) |
||||||
|
~~~~~~~~~~~~~~~ |
||||||
|
|
||||||
|
Copyright 2018-2019 OneLoneCoder.com |
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without |
||||||
|
modification, are permitted provided that the following conditions |
||||||
|
are met: |
||||||
|
|
||||||
|
1. Redistributions or derivations of source code must retain the above |
||||||
|
copyright notice, this list of conditions and the following disclaimer. |
||||||
|
|
||||||
|
2. Redistributions or derivative works in binary form must reproduce |
||||||
|
the above copyright notice. This list of conditions and the following |
||||||
|
disclaimer must be reproduced in the documentation and/or other |
||||||
|
materials provided with the distribution. |
||||||
|
|
||||||
|
3. Neither the name of the copyright holder nor the names of its |
||||||
|
contributors may be used to endorse or promote products derived |
||||||
|
from this software without specific prior written permission. |
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
Relevant Video: https://youtu.be/4l5HdmPoynw
|
||||||
|
|
||||||
|
Links |
||||||
|
~~~~~ |
||||||
|
YouTube: https://www.youtube.com/javidx9
|
||||||
|
https://www.youtube.com/javidx9extra
|
||||||
|
Discord: https://discord.gg/WhwHUMV
|
||||||
|
Twitter: https://www.twitter.com/javidx9
|
||||||
|
Twitch: https://www.twitch.tv/javidx9
|
||||||
|
GitHub: https://www.github.com/onelonecoder
|
||||||
|
Patreon: https://www.patreon.com/javidx9
|
||||||
|
Homepage: https://www.onelonecoder.com
|
||||||
|
|
||||||
|
Author |
||||||
|
~~~~~~ |
||||||
|
David Barr, aka javidx9, ©OneLoneCoder 2019 |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <iostream> |
||||||
|
#include <string> |
||||||
|
|
||||||
|
// include Lua, assumes it is local to this file
|
||||||
|
extern "C" |
||||||
|
{ |
||||||
|
#include "lua535/include/lua.h" |
||||||
|
#include "lua535/include/lauxlib.h" |
||||||
|
#include "lua535/include/lualib.h" |
||||||
|
} |
||||||
|
|
||||||
|
// Link to lua library
|
||||||
|
#ifdef _WIN32 |
||||||
|
#pragma comment(lib, "lua535/liblua53.a") |
||||||
|
#endif |
||||||
|
|
||||||
|
|
||||||
|
// Little error checking utility function
|
||||||
|
bool CheckLua(lua_State *L, int r) |
||||||
|
{ |
||||||
|
if (r != LUA_OK) |
||||||
|
{ |
||||||
|
std::string errormsg = lua_tostring(L, -1); |
||||||
|
std::cout << errormsg << std::endl; |
||||||
|
return false; |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
int lua_HostFunction(lua_State *L) |
||||||
|
{ |
||||||
|
float a = (float)lua_tonumber(L, 1); |
||||||
|
float b = (float)lua_tonumber(L, 2); |
||||||
|
std::cout << "[CPP S4] HostFunction(" << a << ", " << b << ") called from Lua" << std::endl; |
||||||
|
float c = a * b; |
||||||
|
lua_pushnumber(L, c); |
||||||
|
return 1; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// NOTE !!!
|
||||||
|
// YOU WILL NEED THE "EmbeddingLua1.lua" FILE FROM GITHUB REPO
|
||||||
|
|
||||||
|
|
||||||
|
int main() |
||||||
|
{ |
||||||
|
|
||||||
|
struct Player |
||||||
|
{ |
||||||
|
std::string title; |
||||||
|
std::string name; |
||||||
|
std::string family; |
||||||
|
int level; |
||||||
|
} player; |
||||||
|
|
||||||
|
// Create Lua State
|
||||||
|
lua_State *L = luaL_newstate(); |
||||||
|
|
||||||
|
// Add standard libraries to Lua Virtual Machine
|
||||||
|
luaL_openlibs(L); |
||||||
|
|
||||||
|
// Register our C++ Function in the global Lua space
|
||||||
|
lua_register(L, "HostFunction", lua_HostFunction); |
||||||
|
|
||||||
|
|
||||||
|
// Load and parse the Lua File
|
||||||
|
if(CheckLua(L, luaL_dofile(L, "EmbeddingLua1.lua"))) |
||||||
|
{
|
||||||
|
// Stage 1: Just read simple variables
|
||||||
|
std::cout << "[CPP] Stage 1 - Read Simple Variables" << std::endl; |
||||||
|
lua_getglobal(L, "a"); |
||||||
|
if (lua_isnumber(L, -1)) std::cout << "[CPP S1] a = " << (int)lua_tointeger(L, -1) << std::endl; |
||||||
|
lua_getglobal(L, "b"); |
||||||
|
if (lua_isnumber(L, -1)) std::cout << "[CPP S1] b = " << (int)lua_tointeger(L, -1) << std::endl; |
||||||
|
lua_getglobal(L, "c"); |
||||||
|
if (lua_isnumber(L, -1)) std::cout << "[CPP S1] c = " << (int)lua_tointeger(L, -1) << std::endl; |
||||||
|
lua_getglobal(L, "d"); |
||||||
|
if (lua_isstring(L, -1)) std::cout << "[CPP S1] d = " << lua_tostring(L, -1) << std::endl << std::endl; |
||||||
|
|
||||||
|
// Stage 2: Read Table Object
|
||||||
|
std::cout << "[CPP] Stage 2 - Read Table (Key/Value pairs)" << std::endl; |
||||||
|
lua_getglobal(L, "player"); |
||||||
|
if (lua_istable(L, -1)) |
||||||
|
{ |
||||||
|
lua_pushstring(L, "Name"); |
||||||
|
lua_gettable(L, -2); |
||||||
|
player.name = lua_tostring(L, -1); |
||||||
|
lua_pop(L, 1); |
||||||
|
|
||||||
|
lua_pushstring(L, "Family"); |
||||||
|
lua_gettable(L, -2); |
||||||
|
player.family = lua_tostring(L, -1); |
||||||
|
lua_pop(L, 1); |
||||||
|
|
||||||
|
lua_pushstring(L, "Title"); |
||||||
|
lua_gettable(L, -2); |
||||||
|
player.title = lua_tostring(L, -1); |
||||||
|
lua_pop(L, 1); |
||||||
|
|
||||||
|
lua_pushstring(L, "Level"); |
||||||
|
lua_gettable(L, -2); |
||||||
|
player.level = (int)lua_tointeger(L, -1); |
||||||
|
lua_pop(L, 1); |
||||||
|
} |
||||||
|
std::cout << "[CPP S2] " << player.title << " " << player.name << " of " << player.family << " [Lvl: " << player.level << "]" << std::endl << std::endl;
|
||||||
|
|
||||||
|
// Stage 3: Call Lua Function
|
||||||
|
std::cout << "[CPP] Stage 3 - Call Lua Function" << std::endl; |
||||||
|
lua_getglobal(L, "CalledFromCPP1"); |
||||||
|
if (lua_isfunction(L, -1)) |
||||||
|
{ |
||||||
|
lua_pushnumber(L, 5.0f); |
||||||
|
lua_pushnumber(L, 6.0f); |
||||||
|
lua_pushstring(L, "Bwa ha ha!"); |
||||||
|
std::cout << "[CPP S3] Calling 'CalledFromCPP1' in lua script" << std::endl; |
||||||
|
if (CheckLua(L, lua_pcall(L, 3, 1, 0))) |
||||||
|
{ |
||||||
|
std::cout << "[CPP S3] 'CalledFromCPP1' returned " << (float)lua_tonumber(L, -1) << std::endl << std::endl; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Stage 4: Call Lua Function, which calls C++ Function
|
||||||
|
std::cout << "[CPP] Stage 4 - Call Lua Function, whcih in turn calls C++ Function" << std::endl; |
||||||
|
lua_getglobal(L, "CalledFromCPP2"); |
||||||
|
if (lua_isfunction(L, -1)) |
||||||
|
{ |
||||||
|
lua_pushnumber(L, 5.0f); |
||||||
|
lua_pushnumber(L, 6.0f); |
||||||
|
std::cout << "[CPP S4] Calling 'CalledFromCPP2' in lua script" << std::endl; |
||||||
|
if (CheckLua(L, lua_pcall(L, 2, 1, 0))) |
||||||
|
{ |
||||||
|
std::cout << "[CPP S4] 'CalledFromCPP2' returned " << (float)lua_tonumber(L, -1) << std::endl << std::endl; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
system("pause"); |
||||||
|
lua_close(L); |
||||||
|
return 0; |
||||||
|
} |
Loading…
Reference in new issue