LÖVR – An open source framework for rapidly building immersive 3D experiences
lovr.org
lovr.org
This looks pretty awesome and all but I can't see the benefits over something like unity or unreal or the amazing for the cost and features Godot.
I really like Lua. I've always recommended it to beginners or anyone curious about programming for fun over every other language. I've used it myself extensively
But in this day and age, I can't really see recommendating this or even LÖVE2d anymore to anyone interested in getting into game programming.
There's just too many high quality alternatives these days.
I gave PICO-8 a try and ... I found peace.
The strict limitations are strangely liberating. Asset production (one of the most time-consuming parts of game development for me) is a breeze when you are limited to a 8x8 image and a 16-color palette. A similar thing happens with sound and music.
It is the missing link between developing a text-based roguelike and LÖVE.
Then there are a lot of small details like the fact that sin and cos return numbers in the 0..1 range instead of 0..2Pi range. And there is a reason for that (most things in Pico-8 work on the 0..1 range, it saves tokens). And there are "secrets" as well. It might not be something that I would use to create a commercial product, but it is FUN.
And then you realize you are being strangled by artificial, arbitrary limits that don't actually have any reason nor justification for existing.
Thankfully TIC-80 offers almost the exact same experience with more lenient restrictions.
The [0,2pi) interval is rather strange for an output or do you mean the arcus functions?
But recently, I've been really interested in the idea of a framework over an engine. For my non game-dev job, I of course don't use an engine, I use an editor like everyone else, and the idea of having that kind of workflow for game dev seems really appealing to me.
I've been trying to learn Bevy or maybe Raylib, but LOVE always interested me the most for its incredible combination of performance and ease of use, but didn't want to typecast myself to only 2D. Maybe now, that can change.
If someone wants to get into game dev, I'd recommend Godot or Unity, or possibly Unreal if they're the right sort of person, but if Im talking to another game dev, my first recommendation would be to look into a framework.
Do you have any links? If I just go to the normal Love page I don't see any mention of 3D support
Personally for me, the dream is a framework that can do 2D and 3D. The game I'm currently working on will most likely be 2D, but I'm experimenting with 3D and its nice to be able to do all that with the stuff framework. I think Bevy is currently my favourite, but I'm always looking for others as well
I don't use it much at all anymore (though I have heavily in the past), but I would still recommend it to everyone for which it would be a great fit. If you just want to have a game running asap, then yes, maybe Godot is a better fit, but it's not categorically.
In that regard, it's a lot easier than Unity 2D, which doesn't. It also has commercial support, uses pretty standard de facto formats, like Tiled, for its levels, and has been in development for several years.
It's the most starred Lua game engine on GitHub to my knowledge.[3]
Planimeter also publishes lgf[4], which is a LÖVE 11.3 drop-in replacement which provides PBR support, among other things, out of the box for those concerned with advanced workflows.
[1]: https://www.planimeter.org/grid-sdk/
[2]: https://www.planimeter.org/grid-sdk/api/Tick_rate_and_bandwi...
Planimeter looks interesting and all, but I find Lua itself to be limiting for large scale programs. It's great as an embedded scripting language.
This is much the same as love or dgame though. The api is nice, but offers less than godot and doesn't provide any kind of IDE or development tools.
When I click tutorials, I get some installation tutorials some small one or two line code about making entities, whereas with godot or unity or even love, and such by the end you've got a small basic game going.
Actually, to go on a tangent about game tutorials in general...
This:
Making an entity
class "npc_monster" ( "npc" )
function npc_monster:npc_monster() npc.npc( self ) self:setSprite( "images/monster.png" ) end
entities.linkToClassname( npc_monster, "npc_monster" )
Is not an entity as planimeter seems to suggest. It's a sprite drawn on the screen.
There is a huge difference between functional entity and that above code that every single beginner, come learn my engine now and make a game totally misrepresents. Same with player code and every other beginner tutorial. It's not the reality of any game. No entity is a sprite with nothing else.
I appreciate what Godot provides, but we are not interested in building IDEs, because an IDE is not a game engine. We would rather have features that contribute to games than nice editors, which everyone else already builds. Why would we compete with Tiled? Just go use Tiled. We're not competing with 2D animation software either, just go use them, export those files, and see them reload in the engine in real-time.
If Lua is good enough for for major game studios, and nginx, and other software used by the Fortune 500, it's good enough for us.
The point of Planimeter's Grid Engine isn't to provide a game engine for Lua, despite its tagline, it's to provide a game engine that you can build a game with, out of the box, with opt-in multiplayer as simple as setting `maxplayers`.
You cannot do that with Unity 2D. You can't even do it with Unreal. There is no starting up those engines within 5 minutes, launching a server, having a friend connect, and modifying entities in real-time scripting and having them see those changes.
You receive an abstraction over `:spawn()`, `:update(dt)`, and `:draw()`, and can `:getNetworkVar()` and `:setNetworkVar()` for entities, which automatically serializes and sends data and lets the engine perform engine-level, not framework-level decisions on those entities.
They tie into a save restore lifecycle, and have optional physics, that you make a single call to and it's all networked.
Even if you didn't want to do top-down or side-scroller games with this, you have all of the out of the box engine-level mechanics for building card games, strategy games, or anything else in 2D.
To my knowledge, you cannot do that, even with Unreal out-of-the-box.
I think you’re looking at the front-page examples and thinking this is what the engine does, but really it was put up to show a parallel between Grid and LOVE’s front page examples to show how one graduates from sprites, audio, and printing text to networkable entities, emitting networked spacial audio, and creating GUI elements that are composite rasterized.
The fact that they look as simple as they do is the point.
You seem to think this is an afternoon hobby project, but it’s a very old product.
We of course need to update our documentation and marketing to make that all clear, but the parent company has larger priorities and we bring in more revenue than Godot; Grid just isn’t a primary revenue stream.
In the end it comes down to whatever's the easiest, most efficient to use to get a final product. It's the only thing that really matters when it comes to a tool.
If two tools offer the same things, but one tool offers the ability to do it faster, more easily and more efficiently, that's the ideal tool of choice.
No documentation whatsoever besides a sloppy "getting started", despite being at version 9. By contrast LÖVE has a very comprehensive multilanguage wiki.
Isn't your project an abstraction _over_ LÖVE2D? Odd way to choose to market yourself
That repo hasn't been updated in over a year. Have there been any success stories for grid-sdk other than what you've used it for?
We are held up by releasing the next version due to existing contracts we’re working on, and expanding the business.
The next version will have explicit commercial support on the website and a community version.
Such a curious thing, how we all want to love Lua so much, and yet it's so cumbersome sometimes to get work done with it. It's the beauty of it, I guess.
We're a bit tied up with with some consulting projects at the moment, so Grid Engine 10 has been in slower development than the last few years.
We're planning on providing commercial licenses for small studios at something like a one-time $999/license with things like out-of-the-box community server support and at-cost multiplayer infrastructure, which is something like $15/yr for roughly 1,000 concurrent players at 20-tick.
I find it to be a competitive advantage that we provide community server browsers in the engine directly (think Source or further back, Gamespy/Quakespy) and no one else seems to do this? We also use the common Gamespy server browser protocol, which is also a de facto standard.
I would be curious as to why major studios don't also do the same, but the answer is that most of them want to control the servers today and not let you run your own communities anymore.
Unity allows Multiplay to basically own that, which I think is telling that they don't care about that developer experience.
Godot has no answer to any of this. You also have to roll your own multiplayer entirely.
Planimeter doesn't compete with Unity 2D mobile games. We try and stay away from that sort of image. Our software and licensing is intended to compete with desktop 2D games.
The company has been around for 11 years and was previously a Source Engine contractor. So if it seems strange that company has been doing nothing for a decade, it’s because it’s not our primary revenue stream, but up until now has been our largest open source product that I plan on commercializing.
It’s a very slow process, but one that I think we can still outpace Unity’s 2D offering on, considering that they do not deliver solutions our organization has needed for several years. And that’s their primary revenue source.
What is it missing? I'm honestly racking my brains here trying to think of stuff I've tried to do that was unexpectedly hard, and I can't think of anything. Maybe passing large arrays of vertexes to be drawn can be awkward.
* I haven't used Unreal Engine in 6 years.
with a lot of low-effort unreal trash games that all look the same and doesn't have good artistic direction nor game mechanics.
I think this is because unreal gives you so much by default that the developer doesn't really push any boundaries and innovate. Case in point : movement from different games made in unreal all feels "the same".
Contrast this with more ambitious games and you'll usually end up with an array of custom shaders, a stack of custom post effects, etc. That really lets you define a look that's all your own.
of course you can achieve any art style. I'm saying that low effort games you can find on steam, for example, don't do this.
Is this really a problem? Would we be better of if the process was a lot more difficult?
The lower the barrier of entry, the more people have the opportunity to try their hand at game development. That means more developers providing more exciting ideas! It might mean there's more low-effort stuff out there, but there's always been tons of low-effort stuff out there, anyway.
People are often complaining about a lot of poor quality stuff on the market. I don't actively seek it out and I rarely come across it. So, why would it bother me?
On the other hand, even if you use cookie cutter approach to game mechanics you could make other stuff more unique (like story or universe).
I went through Unity and Godot before picking it up. I like LOVR because it's so code-based, with boring boilerplate parts hidden away. I'm no artist and I prefer simple code editor to full engine IDE. The Lua API is easy to understand and remember, and even the framework code is simple to read and modify as needed.
Beside this trade off, the one "downside" is that this is largely a single person's effort with small community around it. LOVR is quite ambitious with supported platforms, and some platforms will exhibit bugs. Anyone working on a serious project will have to get their hands dirty with the framework code, which is thankfully rather easy on eyes.
I think others already mentioned that LOVR is closer to raylib than to Godot. Once I experienced the flow of quickly iterating and hot-loading Lua code, I couldn't go back to Godot's flow adding entities in an editor, clicking around their properties, making OOP scripts and compiling to target platform to test.
LOVR's sweet spot for me is making weird one-afternoon VR projects, for example conjuring thousand or so shapes and moving them around in interesting ways. I like having the option to evolve any those projects into something full fledged and more serious, even if it would require a substantial effort. That's just me thought, some other people in community are building a full business/social platform [1] and a full indie game [2] using the LOVR framework.
[1] https://alloverse.com/ [2] https://www.youtube.com/watch?v=HLBAjKQNmFI&
I love LÖVE. It's a great way to throw together rapid prototypes, and Lua is a joy to work with. Exciting to see a 3D framework along the same lines, hope it can work well for non-VR apps.
I don't like LÖVE because of Lua, I like LÖVE because the framework itself is so well-designed and easy to use. Other people seem to agree to the point of reimplementing LÖVE's API in Rust, as ggez.
Though, for a 'simple C library for 2d (and actually 3d) game development' -- I would highly recommend https://www.raylib.com/. I really, really dig the API design there. One of the main 'downsides' I guess is it doesn't out of the box build natively for iOS -- but the Wasm support makes it run there pretty fine out of the box and raylib-fork can be used to get a native iOS build going with some work. It's got a lot of stuff out of the box including a GLTF loader and skeletal animation.
But raylib sounds pretty simple to use if you want a library-driven approach, and the WASM support is interesting. There was at one point a project that ported LOVE to asm.js but it's since went unmaintained. I was actually able to run one of my >100MB projects on it, but it was pretty unstable and I soon ran into asset size limitations.
Agreed re: C API -- would definitely need a wrapper there. The C++ API is also a bit less ergonomic in some ways than the Lua one (particularly how images are initialized) but also more in others (type checking and autocomplete is great). Lovr (topic of this post) uses LuaJIT's C FFI actually with a C API internally so it's more in that direction, FWIW.
What does "library-driven approach" mean in raylib's case and how is it different from Love's approach? In both cases I just have a CMake project that builds my application to either a native executable (including mobile in Love) or web, with all dependencies vendored, calling functions and using types from either API.
I do think raylib's C API fits this well and with the least impedance mismatch, having used all of them -- Love in Lua, Love in C++ and raylib in C -- extensively. eg. you can directly manage and render vertex buffers in raylib and go down to the 'rlgl' level, in constrast I found Love's default image rendering to have perf issues in web (it uses buffer orphaning) and I had to do something more manual with Love's meshes.
I still think that a C API would be a better option than trying to fork the project to replace Lua with Squirrel or some other language, so that at least others can have a chance to write bindings for their favorite languages without having to do all the porting work again.
Here is the tracking issue: https://github.com/love2d/love/issues/1640
- Get direct Love C++ project working without Lua
- Make some level of test cases with it to get a sense of C++ API usage
- Embed squirrel interpreter into test
- Start binding API to squirrel and testing more and more of API incrementally from squirrel
- Port more and more test cases till it's all covered (or prioritize based on need of game(s))
The nature of the thing you are increasingly covering in Squirrel could be a particular game or a set of demos (maybe both).
It can work well for non-VR apps as well by just disabling the headset module.
Show HN: LÖVR – VR framework for Lua - https://news.ycombinator.com/item?id=15177549 - Sept 2017 (23 comments)
I hated Love though. Not for any technical reason. I really wanted to use it. But, every damn library seemed to be a play on Anal or Lube.
I realize that's a silly reason to give up on a piece of technology. But it's also silly those things had to have unfortunate names to begin with.
Saying, "Sorry guys, I just can't get past the names," is totally a legitimate thing to do. At some point you have to be able to talk to other people about this stuff and it's going to help a lot if you can say the names of the things you're working on without dying of shame. And it's not just about common decency. People are going to believe you're messing with them if you say something like, "Oh yeah, I've been working on getting `buttplug` to send ip packets correctly, however it's been giving me some problems."
A library called "huge red buttplug"? I don't love the length, but I'll use it, why not.
As a really smart, sometimes empathetic young person I used to think that I could understand most issues by observation, without having to live through them. One of the bitter lessons of getting older is that this is just incredibly irritatingly wrong. The phrase "lived experience" makes me barf a bit in my mouth due to weaponization, so maybe I'll say "walk a mile in someone else's shoes".
EDIT> Try to imagine what it's like to be creeped on almost all the time, everywhere you go. Want to forget for a bit and concentrate on some coding? Nope, the dude you work with is going to giggle about anal something when he's not trying to catch some side-boob or blather nonsense to you because he's crushing hard on his brilliant female coworker.
EDIT 2> I'm okay with kink, but I don't want to be distracted in a professional context saying ridiculous things like "butt blug". It's just juvenile and dumb. I really wouldn't take a pro-sex, anti-prude stand on such nonsense.
I don't see anything called out about this on the website. LÖVE is a great 2d game framework written in Lua
Is this "VR and 3D" or "VR...or traditional 3D". The second one implies its not really "meant" to be used for traditional 3D, but can be, which would be disappointing to me at least.
Edit: To be clear, I'm fairly new to 3D game dev, up until this point I'm far more familiar with 2D, and never done any VR dev, so maybe its the case that a VR engine handles 3D without a problem
By disabling the headset module (lovr.graphics.headset = false) the app functions as a normal desktop app.
You can trivially disable VR in LÖVR and use it for 3D.
Maybe my concern with it comes with using 3D engines that can "also do 2D", but then when you try to do 2D with them, you find out its a bit of a hack job
On shell start-up the ~/.bin directory is added to my PATH env variable.
Then I can just open terminal, navigate to project directory and do:
$ lovr .
To run examples or develop.
I'm curious if there is still ideas to discover in the space of code-only 3d engines. Something more tied to modern API concepts, such as render passes and pipeline states.
Does it support interactive applications, I mean does it handle inputs? Does it have physics/collision detection?
I got stuck because I couldn't get over the lack of AAA graphics and physics that LOVR lacks, compared to Unreal... Lua also shouldn't be used. It's a beautiful tiny embedded language, but I don't want to use it, and I don't want you to use it either.
That's an artist problem. Not a programmer problem.
I've used Lua for gamedev before. I've also used C#, C++, Python, and Javascript. Nothing was more fun to work with than Lua. If Unity announced they were dropping C# support and switching over to Lua, I'd probably buy a bottle of top shelf champagne to celebrate.
I agree it is much harder than clicking a checkbox in Unreal/Godot. The LOVR exposes low-level OpenGL to Lua, but in a boilerplate-free way, hiding many obscure and obsolete options. This means that there is a steep learning curve, on the other hand you have power to do things differently. Not only the code architecture of project (functional and dynamic VS object-oriented and stateful), but also how you utilize the graphics card. While it can be painful and frustrating, iterating Lua with low level bindings gives you a powerful way to experiment with gfx.
I guess LOVR would mostly appeal to people who want to learn details of hardware, but don't necessary want to create (and support) another engine. LOVR is high quality readable C code and Lua API is well thought out.
Of course, this only matters because you're pretensions about what other people ought to use to develop or script games.
It seems like you have some unresolved issues with it. If a language is "beautiful" then, yes, I would like to use it.
But many modern engines lean more in the data driven direction. Most or all of the game logic is implemented in config files and the embedded language. You're not writing scripts that manipulate game systems built into the engine, you're building your game systems in the embedded language. Now you want a bit more heft from your language.
The main issue I have with the language is with table accesses and 'nil'. Tables in Lua are the most fundamental type of object in the language, it can be either an array (1-based index) or a hashtable. In this language objects are basically just tables with fields in them, and with metatables you can basically emulate all the features in a typical OOP language (classes, inheritance, traits, operator overloading, etc.) Field access in objects are just table accesses (like what you can imagine with Javascript).
However, when you try to access a field in a table that doesn't exist (such as 'print(table.key_that_doesnt_exist)'): no errors or exceptions are explicitly raised, it just silently returns nil. This is such a dealbreaker that makes the language much harder to debug than other languages (at least Javascript returns undefined, which is different from null! Oh well, that actually has problems of its own though....) Some more horror: global variables are also implemented as tables (imagine that there's a table _G at the top of the scope). This means that any spelling mistakes with variables will also just silently return nil, since if it doesn't find any variable names at the local scope, it tries to find at the global scope.
The global variable thing was actually such a big problem that people came up with some voodoo metatable trickery script like strict.lua (https://github.com/deepmind/strict/blob/master/strict.lua) that prevents this from happening (a showcase of the language's power, but probably not its proudest). I'm sure you could also do this with table creation (make a wrapper function tbl() that automatically adds metatables to tables to prevent invalid field access, so every time you need to do things like 'pos = tbl({x = 1, y = 2})') But still, there isn't a solution baked into the language, and it's cumbersome to do this (and I'm not sure about the performance implications of this addition).
Right now I'm trying to integrate Squirrel (http://www.squirrel-lang.org/) instead of Lua as a scripting language into my game. Squirrel is an embedded scripting language that's hugely inspired from Lua, but also fixes this shortcoming of the language by making invalid table accesses runtime errors. And when you want to add new fields to a table you need to explicitly do so via the <- operator:
table = {}
// print(table.x) (Runtime error)
// table.x = 1 (Runtime error)
table.x <- 1
table.y <- 2
print(table.x) // Outputs 1
which is much more explicit and less error-prone. local p = { x = 1, y = 2 }
print( p.x, p.y )
setmetatable( p,
{
__newindex = function() assert( false ) end,
__index = function() assert( false ) end
} )
print( p.z ) -- you get assertion failure
p.k = 12 -- you get assertion failure tooUsually when programming Lua I can remember every detail of the language without having to consult a reference or wonder which library does what, because it's so simple. I understand that too much simplicity might be an issue for other people, though. I sometimes wish that JavaScript was as simple and easy to understand as Lua is, and Lua is also free of many of JavaScript's warts, but the lack of proper OOP support seemed to kill adoption of the language in projects like Torch. It's still possible to use Lua's prototype-based paradigms to implement OOP, but the implementation details vary depending on which OOP library you choose, and the lack of first-class support is unsatisfying for many people. For me it was more of a mindset thing, and I found I was happier settling for a limited version of OOP or eschewing it for prototype-based programming instead, as it was simpler and satisfied all my needs.
It might as well be Perl. I don't want you to use Perl either.