Important Note:

Cave Engine 0.9.8 is not yet released publicly (it's Patreon only at the moment), but it will in the next couple of days. Please check our discord server for updates.


Cave Engine 0.9.8 Release Notes!

Welcome to the biggest Cave release yet!

In order to cheer this big release, let's start the notes by talking about the first official Uniday Studio game made using Cave:. The Looper's Bug is a game made in 72 hours for the Game Jam Ludum Dare 50 where you control Looper, a robot that loses his energy (in a shape of energy orbs) as you walk. When it runs out of energy, it explodes! The good news is that looper does have clones to help you walk throught the levels and their clones will recover energy from your past lost orbs. It's a puzzle game available for you to Play on Itch io.


After this game, Cave Engine finally got past a stage that I'd like to call "The battlefield test". In other words, it was used in production to an actual released game (that's not just a test project without a start and an end), testes "in battle" with lots of people playing it everywhere.

So there is no doubts that the engine is now perfectly capable (and stable enough) to make a full game using it.

It's also worth mentioning that this was not the first complete game made using cave. Back in the 0.9.6 release, @renatoaruffo made the game Sweet Shelter.


A Personal note from the Dev

Hi, it's Guilherme and thank you a lot for being here. It's been almost an year since the last engine's release (aug 17, 2021) and in the meanwhile, a lot of things happened! I got a Senior job in the Game Industry, as a Game Engine Dev, working with huge in house game engines (way bigger than Cave or anything I've worked before) and porting giant commercial games to consoles (such as Xbox One). I got hundreds of new students into my paid courses, made some new games and last, but not least, worked A TON in Cave!

It was a great time. I had an opportunity to meet many cool devs across the world and learn a lot in such a small period of time. Having this senior game engine dev role in the industry really made a lot of difference as well. During this past year I've also realized how I love to make game and tools (such as engines) and help people to get started in game development.

I'm very excited about this new release. As you saw, it's the first time ever I've used the engine to make a complete and released game. As a result, the engine received a lot of polish and fixed, which is awesome! To be honest, it would be a new dream becoming reality if I was able to work full time on Cave Engine some day. And with your help, that could be possible!

The engine is currently free and it is my Gift for you to help you making your amazing games!

But if you want to give something back by supporting Cave and future projects, I've setup a Patreon for you to help me get going with the project. I've setup 3 tier levels: starting at $3, you can be a general supporter. At $10, you'll have early access to future releases of Cave Engine and Dynami Engine, when they come out. Meaning that you'll not have to wait much to start using all the new features. Last, but not least, at $20 you'll get access to Cave PRO when it comes out (that's basically Cave, but with steroids). So don't forget to check the page and see if it is for you.

In any case, thank you a lot for the support and for the presence here.

You're awesome!

Now that's enough introduction. Let's jump to all the release notes!


New Project Manager UI

Remember that ugly Project Manager that the engine used to have?

Well, I don't, because here is how it looks like now: The new Project Manager now have Project thumbnails that you can mouse over to see details (such as last write date, engine version and project location), right click (to duplicate, reveal in explorer, open or simply delete the project) and, of course, open it. I've also added an "About" tab with a bunch of useful debug hints and informations.

The Project Manager now have a splash screen! The goal is to feature some amazing games made using Cave. Meaning that your game can also be highlighted over there, for the entire world to see!

New way to Edit Entity Templates!

Entity Template is something very important for game development using Cave: it is the official way for you to create a "base object" that can be used all across your game. For example, if you'd like to create a player, enemies and collectable items that can be used several times across different levels, you'll do them by creating entity templates. Creating a Template is simple:

Just right click in the Asset Browser, new asset, entity template. And now things gets interesting: you can now double click an EntityTemplate in the Asset Browser and it will open a special scene for you to edit it as you want. Changes gets applied to all entities using that template as soon as you leave its editing scene.

Some other smaller updates within this commit:

  • Added a thumbnail for the Templates
  • Thumbnails can now have a colored footer (like UE) to help recognize the asset type. For now, Templates are green, scenes are Blue and meshes are grey.
  • Added a green moldure in the Entity Template's Editor viewport

Note: You can't start the game while editing a template.

Rendering Features:

The Cave Engine rendered received a lot of love in this version as well. Here is the main highlights:

  • Exposed the Alpha threshold variable for opaque materials.
  • Reduced the default texture format size to increase performance
  • Added a post processing pass:

It does not do much at the moment, but it will be essential in future releases to allow you to easily tweak the visuals of your game.

  • Setting the proper OpenGL Context + forcing the offboard GPU to be used:

Previously, for some unknown reason, the engine was not using the offboard GPU in some computers, meaning that, in some cases (just as an example) if you had an intel CPU and an RTX 3090 installed, it will attempt to use Intel Graphics instead. Now fixed.

  • Improved the Shadow Bias and Peter Panning:

Cascade shadow mapping is still planned for future releases. But for now, at least the shadows are way better then before!

  • Fixed the previously Sketchy font rendering (in game)...(now it works)

Mesh Component Tint

Now every mesh component have a "Tint" variable that allows you to tint the material color as you want.

The default color is white but you can use it to do a lot of cool stuff, such as a red color animation when a character takes damage, for example. It also allows the particle system to have a custom tint over life.

Particle System

  • Added an "Use Parenting" option:

If enabled, the particles will move with the Entity.

  • Improved the Particle Component's UI
  • Particle life tint (as a curve!)

Logic and Python API

Writting your game logic using Cave ws never so easy and versatile as it is right now! Check all the new features and improvements made to this:

  • Added a python properties dict to the Scenes:

You can now store anything you want at a scene level by using the scene.properties python dictionary.

  • Entity now have a "properties" field (python dict) as well (just like the scenes)

  • CharacterComponent can now dettect collision

You can use the methods getCollisions and collidedWith in order to get collisions from the CharacterComponent.

  • Entity's children options added to the API

Now you can find the following classmethods in the Entity:

entity.add(...)
entity.get(...) # Returns a given component
entity.getScene(...)
entity.getAll(...) # Returns a list of all components
entity.getParent(...)
entity.getChild(...)
entity.getChildren(...)
entity.getChildrenRecursive(...)
entity.getTransform(...)
  • Added an "isAlive()" method to the Entities

After you attempt to kill an entity (entity.kill()), while it is still there, the method isAlive() will no longer return true. Remember that when calling kill(), the action will only be performed by the engine by the end of the frame. That's why the isAlive() is useful.

  • Added some Smooth PlayerComponent Movement options
  • Now you can Schedule to Kill an Entity. Awesome!

If you want to add an entity to the scene (or any given entity) and kill them after some time, you can do it so by typing:

entity.scheduleKill(5) # The entity will be killed within 5 seconds.
  • Improved the Scene::AddFromTemplate(...) API

When creating a new entity from a template (scene.addFromTemplate("TemplateName")), you can now pass three optional parameters: position, rotation and scale.

  • New Transform's LookAtSmooth method + fixed the LookAt
  • UIElement: quadAlpha added to the Python API
  • Character::IsFalling + more Python APIs

The Character Component received even more love with all those new methods: isMoving(), isFalling() and onGround(). The Mesh Component also received:getArmature() and getAnimation().

  • Cave.ui backends refactored

Previously it was caveui and now it's cave.ui. Meaning that:

# This:
import caveui as ui

# Is now this:
import cave.ui as ui

The math functions also received an upgrade, with its own cave submodule as well: cave.math.

  • Added mouselook limits to the Mouselook Component
  • Added some new math utility functions

Some math functions are really useful when creating games. Such as:

# Lerp a to b, it works with floats, vectors and quaternions:
out = cave.math.lerp(a, b, value)

# We also now have an slerp variant, for quaternions only:
out = cave.math.slerp(a, b, value)

# Clamping floats:
out = cave.math.clamp(x, 1.0, 3.0)

# Mapping ranges, from [0,1] to [35,60], in this example:
out = cave.math.mapRange(value, 0.0, 1.0, 35.0, 60.0)

# It's worth mentioning that it also works if the range is backwards, such as:
out = cave.math.mapRange(value, 0.0, 1.0, 60.0, 35.0)

The New Python Code Component

Some times you want to write some Python code, but it's not as important or big to justify creating an entire new Python Component...

Well, now that's no longer a concern: you can simply create a Python Code Component an inline all that code directly into the component's UI. It's a very handy feature to make small python procedures.

UI/UX:

I'll not gonna lie: the engine is looking good now. Check this screenshot:

And that also reflects to the usability! I've made a lot of quality of life improvements on it:

  • Better Search bars to the engine!

Now the search bars are no longer case sensitive (so if you're looking for an asset called "TestingAsset" and type "test", it will appear in the results). Lots of smaller tweaks were made as well.

  • Improved the Asset Browser Thumbnails
  • Increased the Editor's font resolution
  • New Asset Picking (by clicking in the Viewport)

Now it uses a pixel perfect approach, so it's no longer annoying to point and click to select an asset.

  • Selected entity highlight in the Viewport:

Now it's also easier to see the selected entities, since they'll be highlighted.

  • Drag and Drop to Viewport: EntityTemplates, Textures and Materials are now possible!

If you drop a template, it will automatically build it into the world for you. For the materials, you can drop it to a mesh to instantly apply. Last but not least, if you drop a texture directly to a mesh, it will automatically create a material for you (and apply to that mesh). Awesome!

  • Material UI Refactored
  • New "Curve" editor property type
  • Asset Browser: added an "Empty Folder" text when, well, there is nothing in the folder (lol)
  • Refactored the New Entity's names and settings

If you drop a template to the viewport, the entity created will have the template name. I've also fixed the new "Rigid Body Mesh" option that was not making any sense...

  • Entity's tree nodes are now open by default (in the scene graph)
  • Better Scene thumbnail generator

Previously the scene's thumbnails in the editor were mostly all the time blank or wrong. Now fixed.

  • Editor: Allow TAB Key on multiline UI text
  • Improved the Entity's UI a bit more
  • Asset Importer UI: Option to batch [de]select assets to import
  • Changed the drag and drop message to a more informative one.
  • MeshComponent: Option to build a RigidBody based on the mesh used

Previously it was annoying to create a blank rigid body and then selecting the same mesh as the one in the mesh component from a dropdown. Now there is a ... icon in the MeshComponent that allows you to automatically build the rigid body from it.

  • Changed some RenderGraph UI icons

  • Scene Graph: new Entity Right Click Menu!

Now you have a lot of useful options when right clicking an entity in the Scene Graph. Awesome!

  • Main Menu Bar improved + Play/Stop Button
  • Removed that ugly "Add" Button (bottom right of entity's UI)

There was a button in the entity menu and project browser that was supposed to serve as a way to add new components/projects. But it never worked as good as expected so I've removed it.

  • The Editor's thumbnail system received a complete rewrite as well to allow all those cool new features.

Viewport UI and Editing Enhancements

  • Hold CTRL to toggle snapping
  • Hold ALT before moving an Entity to duplicate it
  • Controls gets disabled when you play the game. You can toggle them on/off using F3 (during the play mode)
  • Shortcut: Alt+W/E/R to reset pos, rot, scl
  • Now it Displays the current Scene's name in the Viewport (bottom left)
  • Improved the CameraCmp Gizmo (Viewport)

Now it also indicated the "up" direction of the camera view, making it easier to not place the cameras upside down.


General Features:

Animation:

There is not a lot "visible" in terms of new features, but the Animation (skeletal) system received a lot of internal work, including fixes and improvements. I'm making it versatile enough to support multiple types of custom animations in the future, such as blend spaces and automatic character controllers.

Physics:

  • Rigid Bodies can how be in "Ghost mode"
  • More Draw Debug Physics Backends

Exported Game (Standalone):

  • Option to use the Desktop Resolution on Standalone

Created the Stats For Nerds Tab!

Now the engine saves the time you spent on your projects + some other cool information about it. It's so cool! :)

Added a Loading Screen:

Now both the editor and the standalone game does have a pulsing loading screen before it starts up, while all the game resources are being loaded. It also means that the window will not appear as "not responding".


Fixes:

  • Fix: Python Script being edited was being closed when you quit game
  • Fix: Broken Material Editor UI
  • Fix: Text Editor Zoom was not working
  • Fix: RigidBodyComponent was crashing with no shape
  • Fix: Project Sorting by date in the Project Manager was wrong
  • Fix: Crash when closing the Editor/Game
  • Fix: Crash when creating an empty mesh + disabled grid in thumbnail
  • Fix: First rendered mesh outline (when selected) was wrong
  • Fix: Alpha not working after drawing texts in the UI
  • Fix: Particle was not working when selecting the Entity
  • Fix: Crash when creating a new project
  • Fix: Ghost point lamp

This one was almost a classic bug in Cave by now. If you notice, until v0.9.7, there was always a ghost point lamp casting light into the world. Now gone (sorry, ghost!).

  • Fix: Inactive PlayerComponent was not resetting the walk
  • Fix: Viewport was not drawing gizmos
  • Fix: Crash when Killing the same Entity multiple times
  • Fix: Crash Closing the engine with no Scene Opened
  • Fix: UIButton was working while disabled (that was not supposed to happen)
  • Fix: disabled Button wrongly receiving input
  • Fix: Transform::lookAt method was doing some weird stuff in some corner cases
  • Fix: UIElement layer was not being copied
  • Fix: GetCollisions(obj) was returning ALL collisions

No way I let that pass for so many time... but, well, now it's fixed. :)

  • Fix: It was possible to select invisible UI elements
  • Fix: Particle reload was incorrect in the Editor
  • Fix: Py setAnimation was not working
  • Fix: Sketchy font rendering...
  • Fix: AudioTrackInst was not stopping on stop()
  • Fix: FaceCulling not working in standalone

I'll tell you a small story on how I figure out this bug... As you may know, I've made a game in 72 hours using cave for the Ludum Dare 50. In the final hour before submitting the game, I exported it as runtime and tested... And I was only able to see a black screen. I freaked out thinking that I messed up the engine really bad during the jam (I've changed a lot or things during it). It ended up being an one line fix. :P

  • Fix: Wrong RenderToTexture Aspect
  • Fix: Scene Thumbnails was sometimes Empty
  • Fix: deleting some assets was not working 100%

It was removing the asset from the Asset Browser, but not deleting it from the project itself. That bug was happening with inherinted assets (such as ImageTexture, that inherits from Texture). Now fixed.

  • Fix: Misaligned UI Icons (all of them)
  • Fix Proj Manager thumbnail sizes
  • Fix: Dropping stuff in the viewport was not working
  • Fix: Possible template duplication issue
  • Fix: Crash when loading a Project

Still Work in Progress

I was also working in some exciting new features that unfortunately didn't make to the 0.9.8 release.

Initial Network layer (not available yet)

In the future, Cave will have native methods to make online games.

Logic Bricks: Visual Scripting (not available yet)

It already allows me to create new nodes, logic bricks, attach them to a component, run and so on. Serialization is also 100% working as well. What's left is to write the front end (the node UIs) so the use will be able to create their own logic bricks trees as they want to. I'm almost there! :)

Animation System (not available yet)

As I said, I'm working on a versatile animation system for the engine to make your life way easier. I'm still not sure how it will be released, since I'm also working on Cave Engine PRO (paid, for the ones who want to support the engine and also use some extra features). Here is the plan so far:

  • Animation inherits (from IAnimation):
    • The animation types can use the Entity's properties to gather the necessary variables
    • Character animation:
      • With slots for:
        • idle
        • walk
        • run
        • jump (up, idle, landing)
        • die (dying, dead idle)
    • 4-directional animation (plus idle in the middle)
    • 8-directional anumation (plus idle in the middle)
    • Animation Blender (to blend anims):
      • Allows you to have a base IAnimation and multiple layers on top.
      • For each layer:
        • An IAnimation + blend weight
        • A list will all the bones to select/unselect the ones you want to influence

The way I'm writting this system will also allow you to nest animations. For example, you can use a Character Animation for your player, but instead of a simple walk animation, you can use a 4 or 8-directional animation.