MCPcopy Create free account
hub / github.com/danomatika/ofxLua

github.com/danomatika/ofxLua @1.5.2

Chat with this repo
repository ↗ · DeepWiki ↗ · release 1.5.2 ↗ · + Follow
2,311 symbols 7,965 edges 77 files 648 documented · 28% updated 15mo ago★ 173

Browse by type

Functions 2,184 Types & classes 127
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

ofxLua

A Lua instance addon

Copyright (c) Dan Wilcox 2011-2023

BSD Simplified License.

For information on usage and redistribution, and for a DISCLAIMER OF ALL WARRANTIES, see the file, "LICENSE.txt," in this distribution.

See https://github.com/danomatika/ofxLua and the Openframeworks Forum post for documentation

If you want to use Lua + openFrameworks without building your own app, check out loaf: danomatika.com/code/loaf.

This project has been supported by the CMU Frank-Ratchey STUDIO for Creative Inquiry, the DU Emergent Digital Practices Program, and my time at the ZKM | Hertz-Lab.

Description

ofxLua is an openFrameworks addon for running a Lua embedded scripting interpreter within an openFrameworks application. Using the SWIG (Simple Wrapper and Interface Generator) tool, C++ functions and classes can be bound to the Lua api allowing them to be called within a Lua script. This is useful in separating the upper level logic from the lower level application and is utilized in numerous video games and applications.

In addition, ofxLua provides bindings for the openFrameworks API.

Lua combines simple procedural syntax with powerful data description constructs based on associative arrays and extensible semantics. Lua is dynamically typed, runs by interpreting bytecode for a register-based virtual machine, and has automatic memory management with incremental garbage collection, making it ideal for configuration, scripting, and rapid prototyping.

SWIG is a software development tool that connects programs written in C and C++ with a variety of high-level programming languages. It is used to generate the C++ bindings which wrap the openFrameworks API for Lua.

(Optional) LuaJIT is a Just-In-Time Compiler (JIT) for the Lua programming language. It implements the Lua API but is optimized for performance over the standard Lua distribution. It is recommended to use LuaJIT when speed is a concern and it is enabled on embedded Linux in addon_config.mk for this reason.

openFrameworks is a cross platform open source toolkit for creative coding in C++.

Why not Javascript?

Those coming from a Javascript background may ask "Why Lua? Why not Javascript? I like Javascript!"

Lua has a long history of use as a embedded scripting language and, as such, is both smaller & much easier to embed on pretty much every platform. The compiled language adds less than 500kb to your app binary versus many Mbs for Javascript or Python. Speed-wise, the base Lua interpreter is oftentimes faster than either language due to it's simplicity and using LuaJIT may add a speed increase of many orders of magnitude. As an embedded language, Lua makes it relatively easy to bind C/C++ functions & objects to it's scripting environment.

For these reasons, Lua has been used for game development for many years:

Those coming from an embedded computing or game development background are probably familiar with Lua while those coming from design and/or web development are used to Javascript. In many ways, both languages share a number of similarities and the rest is due to simple syntax or design differences. When it comes down to it, no one language or environment is better than another, they just have different focuses and design backgrounds. Do not dismiss Lua because you are unfamiliar with it as not every nail needs the same hammer.

Lua is not scary, trust me :)

See:

Build Requirements

To use ofxLua, first you need to download and install openFrameworks. The examples are developed against the latest release version of openFrameworks on http://openframeworks.cc/download.

OF github repository

Currently, ofxLua is being developed on macOS and has been tested on macOS, iOS, & Linux. Android should work but has not been tested extensively.

Installation and Build

Place ofxLua within a folder in the apps folder of the OF directory tree:

openframeworks/addons/ofxLua

The easiest way to do this is via cloning with git:

cd openframeworks/addons/
git clone git://github.com/danomatika/ofxLua.git

You'll need to checkout the swig-openframeworks submodule as well using:

cd ofxLua
git submodule init
git submodule update

Which version to use?

The master branch of ofxLua will work with the current stable version of openFrameworks and can be considered relatively stable.

Previous versions are tagged using Semantic Versioning with the updates to newer versions of openFrameworks and Lua noted in the changelog, CHANGES.txt. You can select the tag in the Github "Current Branch" menu or clone and check it out using git.

If you want to use ofxLua with a previous version of openFrameworks, find the tag corresponding to your OF version by looking at the changelog or releases. Note that the ofxLua tag and OF version do not match.

For example,

git clone git://github.com/danomatika/ofxLua.git
cd ofxLua
git checkout 1.3.0

will checkout a version that's compatible with OF 0.11.0.

Dependencies

For embedded Linux (arm, Raspberry Pi, etc), LuaJIT is used for better performance. Make sure you have the luajit-5.1 development package installed.

Visual Studio

If you run into compilation issues in Visual Studio (ie. "unresolved external symbol" errors with "_lua_*" library functions), you may need to tell the VS to build the Lua library using the C compiler instead of the C++ compiler:

In the Solution Explorer:

  1. Select the Lua C files in addons/ofxLua/libs/lua, e.g. lapi.c + lauxlib.c ...
  2. Right click -> choose Properties
  3. Select C/C++ -> Advanced from left tree
  4. Change Compile As -> Compile as C Code (/TC)

If there is an alternate solution to this issue in the addons_config.mk, please let us know!

Android Studio

Contributed by Zach Lee

In Android Studio, the addon_config.mk exclude flags may not have an effect when using the OF ProjectGenerator app, and the following platform-specific bindings folders may need to be manually removed from the AS project:

  • ofxLua/src/bindings/desktop
  • ofxLua/src/bindings/linuxarm

Next, to make Android Studio read the C flags from the addon_config.mk file, add the following code below cppFlags.addAll(addonCppFlags(abi, ofRoot())) in build.gradle file:

CFlags.addAll(addonCppFlags(abi, ofRoot()))

After the fix, the ofxLua project should hopefully build and run on an Android device.

Running the Example Projects

The example projects are located in the luaExample & luaExampleIOS folders.

Project files for the examples are not included so you will need to generate the project files for your operating system and development environment using the OF ProjectGenerator which is included with the openFrameworks distribution.

To (re)generate project files for an existing project:

  • Click the "Import" button in the ProjectGenerator
  • Navigate to the project's parent folder ie. "ofxLua", select the base folder for the example project ie. "luaExample", and click the Open button
  • Click the "Update" button

If everything went Ok, you should now be able to open the generated project and build/run the example.

macOS

Open the Xcode project, select the "luaExample Debug" scheme, and hit "Run".

Linux

Open the Code::Blocks .cbp and hit F9 to build. Optionally, you can build the example with the Makefile.

To build and run it on the terminal:

make
make run

How to Create a New ofxLua Project

ProjectGenerator

Simply select ofxLua from the available addons in the ProjectGenerator before generating a new project.

Manual Method

To develop your own project based on ofxLua, simply copy an example project and rename it. You probably want to put it in your apps folder, for example, after copying:

openFrameworks/addons/ofxLua/example/ => openFrameworks/apps/myApps/example/

It must be 3 levels down in the openframeworks folder structure.

Then after renaming:

openFrameworks/apps/myApps/myLuaProject/

On Mac, rename the project in Xcode (do not rename the .xcodeproj file in Finder!): Long click on the project name in the project tree.

Adding ofxLua to an Existing Project

ProjectGenerator

Select ofxLua and other addons used by your project from the available addons in the ProjectGenerator, select the parent folder of your project, and set the exact name of the existing project in the text box. This will overwrite the existing project files with new ones that now include ofxLua.

Note: you will lose any custom settings you've added manually to your project.

Manual Method

If you want to add ofxLua to another project, you need to make sure you add the following src files:

openFrameworks/addons/ofxLua/src/ofxLua.h
openFrameworks/addons/ofxLua/src/ofxLua.cpp
openFrameworks/addons/ofxLua/src/ofxLuaFileWriter.h
openFrameworks/addons/ofxLua/src/ofxLuaFileWriter.cpp

and optionally

openFrameworks/addons/ofxLua/src/bindings/ofBindings.h
openFrameworks/addons/ofxLua/src/bindings/YOURPLATFORM/ofBindings.cpp
openFrameworks/addons/ofxLua/src/bindings/glmBindings.h

You also need to add the Lua library files in the libs directory:

openFrameworks/addons/ofxLua/libs/lua

For Xcode:

  • Right-click and create a new group "ofxLua"
  • Drag ofxLua/src into "ofxLua"
  • Drag ofxLua/libs into "ofxLua"
  • Remove bindings files that do not match your platform aka remove src/bindings/desktop for iOS

On older macOS versions (pre 10.8), a header file which is included with the OS contains some macros which conflict with several lua macros. They can be renamed by setting this CFLAG:

-D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=0

OF API Bindings

SWIG generated bindings for the OF API can be found in src/bindings. Currently it covers most of the api while leaving out base classes. More specific documentation may come at a future date, but for now check the example scripts on usage.

Basic documentation:

There is a main "of" module and functions, classes, constants, & enums are renamed:

  • function: ofBackground -> of.background
  • class: ofColor -> of.Color
  • constant: OF_LOG_VERBOSE -> of.LOG_VERBOSE
  • enum: ofShader::POSITION_ATTRIBUTE -> of.Shader.POSITION_ATTRIBUTE
  • begin & end: these are lua keywords, so functions with this name are renamed in the following classes:
  • ofFbo: beginFbo() & endFbo()
  • ofCamera: beginCamera() & endCamera()
  • ofMaterial: beginMaterial() & endMaterial()
  • ofShader: beginShader() & endShader()

Base classes, deprecations, variable arguments (...), ofThread, ofPtr, ofMutex, & ofScopedLock are ignored for now.

Functions that return a std::vector return a wrapped std::vector in Lua. As with Lua tables, indexes start at 1.

glm

As of OF 0.10.0, there is also a "glm" module for the glm types and math functions. Note that the OF math types cannot be implicitly cast to glm types in Lua as they are in C++, so you need to use special conversion functions:

-- error!
local v = of.Vec2f(100, 100)
of.drawRectangle(v, 20, 20) -- needs a glm::vec2

-- convert
of.drawRectangle(v:vec2(), 20, 20) -- ofVec2f -> glm::vec2

-- or use the ofVec2f attributes directly
of.drawRectangle(v.x, v.y, 20, 20)

It looks as those ofVec*, ofMatrix*, and ofQuaternion may be deprecated in the future, so it's probably best to transition to using glm::vec*, glm::mat*, and glm::quat over time:

-- using glm::vec2
local v = glm.vec2(100, 100)
of.drawRectangle(v, 20, 20)

See swig/README.txt for details.

Math & String

The basic string and math functions are provided by built-in Lua libraries:

Other standard Lua libraries are: table, io, and os.

Comparing Key Values

OF uses integers for the key event values so comparisons can be made using character literals in C++:

if(key == 'f') {
    ofToggleFullscreen();
}
else if(key == OF_KEY_UP) {
    ofLog() << "up pressed";
}

Lua does not have character literals so 'f' is treated as a string. In order to do the same comparison, convert 'f' to a number using the string library string.byte function:

if key == string.byte("f") then
    of.toggleFullscreen()
elseif key == of.KEY_UP then
    print("up pressed")
end

Working with Class Instances

Calling class member functions requires using a : character -> image:draw(20, 100, 100, 100)

Calling class member variables require

Core symbols most depended-on inside this repo

Shape

Function 2,037
Method 147
Class 122
Enum 5

Languages

C++52%
C48%
Python1%

Modules by API surface

src/bindings/glmBindings.cpp900 symbols
libs/lua/lcode.c103 symbols
libs/lua/lparser.c101 symbols
libs/lua/lapi.c94 symbols
src/bindings/ofBindings.h85 symbols
libs/lua/lstrlib.c82 symbols
src/ofxLua.cpp73 symbols
libs/lua/lgc.c73 symbols
libs/lua/lauxlib.c70 symbols
libs/lua/lmathlib.c49 symbols
libs/lua/ldebug.c47 symbols
libs/lua/liolib.c46 symbols

For agents

$ claude mcp add ofxLua \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page