Simulation Starter Kit

SimulationStarterKit is a plugin-based graphical editor, engine and SDK for Windows and macOS (Linux version can be provided upon request).

For more details visit the itch.io page here or try it out below:

An educational coding aid

The downloadable editor, engine and SDK can be used in an educational setting to encourage students of all ages and abilities to explore art, programming and mathematics through the building of interactive scenes in a user friendly environment. Interactive Scenes can either be crafted within the editor (requiring no coding), in script using (the very accessible and popular) LUA language, in C++ or a hybrid of all three approaches. NB. Additional language bindings (i.e. Python, Java) can be provided upon request.

An example LUA script that generates a scene comprised of 50 randomly placed cubes:

require('fireflyscript')
sdk   = fireflyscript.SDK_GetInstance()
scene = sdk:GetScene()
root  = scene:Find('MyScene')
pos   = fireflyscript.Vector3Helper()
xForm = fireflyscript.Transform()
for count = 1,50 do
    pos:Init(math.random(0, 100) -50,math.random(0, 100) -50,math.random(0, 100) -50)
    item = sdk:CreateSceneItem(fireflyscript.SceneItemType_BoxSceneItem, 'TestBox')
    xForm:Position(pos:ToVector3())
    item:SetPropertyValueByName('Transform', xForm)
    root:InsertChildAtIndex(item)
end

Application code wizards

An application is created with a single C++ and CMake file generated using the in-editor code wizard. The example below constitutes a simple app that provides a scene composed of a first person camera and a simple mesh (a plane):

#include "firefly.h"
using namespace firefly;

SceneItem* scene;

int LoadScene(int argc, char* argv[])
{
    SDK::SceneSettings settings;
    settings.NormalPerVertex = true;
    SDK::GetInstance().SetSceneSettings(settings);

    // Scene root
    scene = static_cast<BranchSceneItem*>(SDK::GetInstance().CreateSceneItem(SceneItemType_Group));

    // Camera
    auto scamera = static_cast<EditorCamera*>(SDK::GetInstance().CreateSceneItem(SceneItemType_EditorCamera, "Editor Camera"));
    scamera->SetPosition(Vector3(0.f, 5.f, 20.f));
    scamera->SetLookAt(Vector3(0.f, 5.f, 0.f));
    scamera->SetPickingEnabled(true);
    scamera->SetSpeed(10.f);
    scene->InsertChildAtIndex(*scamera);
    scamera->SetActive(true);

    // Main scene
    auto mainScene = static_cast<BranchSceneItem*>(SDK::GetInstance().CreateSceneItem(SceneItemType_Group, "MainScene"));
    scamera->InsertChildAtIndex(*mainScene);

    // Light
    auto light = static_cast<Light*>(SDK::GetInstance().CreateSceneItem(SceneItemType_Light));
    light->SetPosition(Vector3(0.f, 10.f, 10.f));
    light->SetLightType(Light::Positional);
    mainScene->InsertChildAtIndex(*light);

    // Plane
    auto plane = static_cast<PickableSceneItem*>(SDK::GetInstance().CreateSceneItem(SceneItemType_Plane));
    mainScene->InsertChildAtIndex(*plane);
    return 0;
}

int DrawScene()
{
    SDK::GetInstance().Update(*scene);
    return 0;
}

int DestroyScene()
{
    scene->Release();   
    return 0;
}

Video log

Engine features are showcased in the videos below: