# TO-DO - [ ] Animation system from multiple PNG files - [ ] Aseprite support - [ ] Load Aseprite files as images - [ ] Load Aseprite files as tilesets - [ ] Show resources in a nicer way (draw_debug_gui) - [ ] Debug tooling for physics? - [ ] A low/no-code way to get started?? - [ ] Play/pause the project in the editor - [ ] Add a command palette to the editor - [ ] Modular system - [x] Load shared library - [x] Make shared library be able to access and edit Lua - [x] Move plugin interface to an SDK rust module as otherwise: "This may cause spurious casting failures and mysterious crashes" - [x] Add all runtime hooks (preframe, postframe, load, unload) - [x] Turn preferences into a window to have proper editor settings - [x] Add a way to pick the prefered text editor (with vscode as default) - [x] Write the bundle.py script to watch the specs defined in plugins.md - [x] Manage files that the editor needs to work that are not inside the editor binary in a cross-platform way. - [ ] Automatically manage the `luau-api` folder (create it when the project is created, verify its integrity on load, etc...) - [ ] Show plugins in the editor - [ ] Add all editor hooks (debug menu) - [ ] Reload plugins in the editor - [ ] Show supported platforms in the editor - [ ] Add ability to load/unload plugins from the editor from the filesystem - [ ] Add ability to download plugins from the editor - [ ] Add documentation on how to create and use plugins - [ ] Test that it works on Linux - [ ] Test that it works on Windows - [ ] Emscripten compatibility using JS as a bridge - [ ] Move generic resource trait to the SDK so that plugins can define custom resources. (the plugin will need access to the resources object.) - [ ] Screens (from the screen API) should be called layers. You should have a stack of layers. - [ ] Screenshot API - [ ] Lua function to screenshot (probably just turn a canvas into a PNG) - [ ] Button to screenshot in the editor - [ ] Button to record a short gif in the editor - [ ] Add a CLI version of the editor - [ ] The editor is compiled with -mwindow - [ ] The CLI can scafold project, automate exports and run the editor with a console if needed - [ ] Use SDL pref_path for editor settings and cache. - [ ] The runtime and editor have separate logger implementation - [ ] The logger is easily accessible from anywhere in the code even without Lua. - [ ] Enable errors and warnings, even for release builds - [ ] Add error logs in the code when relevant (to avoid black screens with no other failure message.) - [ ] Event system, part II - [ ] Action system (you map actions to keys and actions to functions) - [ ] Add event channels (you can have an on-hit event with per-entity filtering. Channels are strings with a hashmap lookup, They are cheap) - [ ] Timer event? - [ ] Borderless window & better styling - [ ] See https://github.com/OlaProeis/Ferrite/ for how to do it using egui. - [ ] Borderless window - [ ] Customize theme - [ ] Add a basic code editor with syntax highlighting - [ ] See: https://github.com/p4ymak/egui_code_editor - [ ] Modding API - [ ] Add a way to load scripts in a separate environment with a subset of available functions - [ ] Add a way to pass data to and from the sandbox - [ ] The 3D API!! - [ ] See how Three.js does things. - [ ] Camera - [ ] Scene - [ ] Geometries + Materials = Mesh - [ ] Load 3d models - [ ] Allow 2d meshs with 'paper style' - [ ] Lights and shadows (set a max number of lights to 20 in the API) - [ ] Reflective objects like water - [ ] Drawing a depth buffer - [ ] Try using SDL3 - [ ] Rewrite the sokoban using Vectarine - [ ] Joystick support - [ ] Android support # Done - [x] Add more types in the watcher - [x] Entity system - [x] Add a concept of a 'PhysicsWorld2D' - [x] You can add 'objects' to the physics world - [x] Rectangles - [x] Circles - [x] Convex polygons - [x] The objects can have 'tags' (player, enemy, projectile, etc...) - [x] You can easily move and rotate objects in the physics world - [x] You can 'efficiently' get objects by tag - [x] Fix the memory ownership bug preventing collider reuse - [x] You can efficiently get all objects that are inside a point - [x] You can efficiently get all objects that are inside a rectangular area - [x] You can efficiently get all objects that touch another object - [x] You can efficiently see what objects collide with a ray. - [x] Allow locking rotation of objects - [x] Allow having the debug GUI in a detachable window or have a way to make them translucent? - [x] Open-source the project - [x] Rework the resource API to use futures to prevent use of unloaded resources - [x] Splash screen depending on the loading_animation field in the manifest - [x] Investigate special characters in text rendering (like å, ç, ...) - [x] In loader add a way to load a text resource - [x] Add API to return if we are minimized. Explain that delta_time can be very big when minimized and to not run the physics simulation in that case. - [x] Better errors: - [x] Fix bug where only 1 error is printed where there are 2 different errors - [x] Show the line that produced the error instead of just the line number. Make the text clickable to open the file - [x] Add a help button to the editor menu with the options: - [x] Open Manual - [x] Open Github - [x] About (opens a popup with the version and the commit hash) - [x] Add search in the resource window - [x] Allow opening the game folder in the resource window - [x] Lua performance helper: - [x] Add a lua function which computes AV + B for a list of V efficiently - [x] Add drawing functions that operate on lists of Lua objects and can perform common linear transformations before drawing - [x] Generate true releases using the CI - [x] We need static linking - [x] The python script needs to produce 1 zip per platform and be more verbose. - [x] True MacOS exports with an app folder - [x] Add a CI - [x] The font size of drawText should work with the Coords API - [x] The radius of drawCircle should work with the Coords API - [x] noise function: simplex and worley for v2 and v4 - [x] Use vec2 for drawing 2d shapes instead of vec3 (inside default shaders) - [x] Put the console system outside of Lua Env - [x] Create a logger in console.rs - [x] The logger is easily accessible from anywhere in the code even without Lua. - [x] 3 levels: Info, Warning, Error - [x] V4 is a color (provide default colors and a Color(r,g,b,a) function) - [x] Default values (if a color is nil, it is infered to be black) - [x] Add more convenience functions for V2 such as a:distance(b) for (a-b):length() - [x] Profiler tool - [x] Drawcall counter - [x] FPS graph - [x] Show Luau heap size (as returned by gcinfo()) over time - [x] Lua API to measure time taken by sections of code - [x] Save system - [x] Design a simple saving API (probably a KV store with a simple Lua serializer) - [x] Implement the API in Rust - [x] Tiled parsing - [x] Sprites/Tilesets as an asset class - [x] Reading tiled tileset files - [x] Tilemaps as an asset class - [x] Reading tiled tilemap files - [x] Canvas API should be `canvas:paint` instead of `Canvas.paint(canvas)`. In general, the API should have a more OOP style. - [x] Add `Io.isKeyJustPressed` - [x] Allow fake fullscreen as an option - [x] Make the "create new project" button actually work. - [x] Make a game with it!!! - [x] Add a gallery - [x] Create a gallery folder with a sample game - [x] Show the gallery by default in the editor - [x] Show off parts of the API in various gallery games - [x] Audio API - [x] Create an Audio resource - [x] Play a sound - [x] Add a way to set shader uniforms from Luau - [x] Project System in the editor - [x] 'assets' should be 'gamedata' - [x] Refactor to make the project path a variable - [x] Have a game.vecta inside 'gamedata'. It is loaded first instead of game.lua - [x] Manifest contains name of the game, logo, tags, and root source. - [x] Load the manifest and store its data - [x] Set window title to the name of the project - [x] Add a reload button to reload the whole project (and a keyboard shortcut, probably Ctrl+R for it) - [x] Remember the last opened project and open it at startup - [x] Allow closing the current project - [x] Allow reopening aka 'reset' of games - [x] Fix live-reload as we need to only live-reload the current opened project - [x] Open manifest in the editor from the file menu - [x] Add Luau API to set window title - [x] Have an export feature in the editor to make zips - [x] Allow opening zips that are "compiled projects" (from the runtime) - [x] Expose Stencil API to Lua - [x] Define in Luau types: drawWithMask(drawFunction, maskFunction) - [x] Implement in Rust - [x] 'Screen' system (Menu, Settings, Game, Pause...) - [x] Design an API for the screen system - [x] Implement the types of the Rust side - [x] Add a unit API with proper coordinate management instead of V2. - [x] Define a simple to understand and to use API - [x] Implement the types on the Rust side - [x] Make the graphics functions accept these types in addition to Vec2 - [x] Update the user manual - [x] Proper coordinate computation when drawing on a canvas - [x] Make the environment ready before loading lua scripts - [x] Add debugger tab to inspect values of Lua Constants - [x] Add more room in the debug ui to show loading errors - [x] Fix image orientation issue - [x] From lua, enable/disable gl_linear/gl_nearest when drawing images - [x] Shader API - [x] Write the luau functions for the API - [x] Add a shader resource - [x] Set shader to canvas - [x] Canvas API 'framebuffer' - [x] Write the luau functions for the API - [x] Write a framebuffer in glframebuffer (inspiration from glium / vectarine 1) - [x] Find a way to pass the canvas object to lua? - [x] Check for memory leaks when reloading. - [x] Allow 'always on top' in the editor using a menu checkbox. - [x] Always enable vsync - [x] Implement the require typing technique - [x] Console improvements - [x] Make it easy to print to the console from anywhere in the code - [x] Clear logs - [x] Better scrolling - [x] Verbosity (info/warn/error) - [x] Event system, part I - [x] Add an event system to Lua - [x] Auto-unsubscribe on module reload. - [x] Add a console command event - [x] Add a resource loaded/reloaded event - [x] Add a mouse click / key down event - [x] Lua API Reorg - [x] Organize functions in namespace better and use metamethods - [x] Compatible luau types and requires - [x] Add a results variable to `loadScript` to make it convinient to access module exports with types. - [x] Resource update - [x] Move loading state management out of the individual resources - [x] Scripts are resources - [x] Prevent loading twice the same resource - [x] Check resource status from Lua (Loaded, Error, Loading, ...) - [x] Allow loading a script from Lua - [x] More complete drawing API - [x] Draw portions of images (the super general case with 8 vec2 as arguments, so 16 floats) - [x] Arrows - [x] Polygons - [x] Vector API for Lua - [x] Use V2 for all pairs of coordinate in APIs - [x] Handle high DPI screens (MacOS...) - [x] Fullscreen API - [x] Allow window resizing and handle aspect ratios - [x] Draw text with proper aspect ratio - [x] Draw circle with proper aspect ratio - [x] Lua API to toggle resizable window - [x] Lua API to set window size - [x] Lua API to get screen size - [x] Loading fonts and drawing text from lua code - [x] Draw text - [x] Measure text - [x] Assets "resource" system - [x] Resource tab in editor - [x] Error system when asset fails to load - [x] Hot reloading for assets - [x] Loading images and drawing them from lua code - [x] Performance: Batch drawing implementation - [x] Window size - [x] Mouse input - [x] Editor console - [x] pthread support (requires rust nightly, but it works) - [x] Setup the editor - [x] When no CLI arguments are passed, open the editor - [x] Show EGui widget in the editor - [x] Use OpenGL for quad drawing in the runtime - [x] Be able to load a game.lua file - [x] Cross-platform keyboard input - [x] Access to keyboard from lua - [x] Loading external files (like lua) from rust, for web. - [x] Call JS from rust - [x] Call rust from JS - [x] Calling async function from both platforms - [x] Reading a lua file - [x] Properly manage the different build types (using cargo workspaces probably?) - [x] Make web build and native build work without config changes - [x] Web build - [x] Luau : hot reload for script - [x] Luau (with a function to draw rects probably)