December 23, 2014

Christmas Demo

And here is the last demo of World of Thieves, a 3D adventure/stealth game between "Zelda" and "Beyond Good and Evil". Don't hesitate to test/share/reblog/comment/like if you want to help me!






Survey: Don't forget to complete the online survey after playing the game!
Bug hunt: As usual, contact me for bugs or any feedback.
Get all the news: if you don't want to miss anything, subscribe, or follow me on facebook!


MAC OS X and Linux are back


It's been a while since I haven't posted a release for MacOS and Linux, so here they are! I recently optimized the demo filesize, so I can post 3 downloads again.

  • Linux

Under Linux, you have to change the execution rights on the game file:
chmod +x worldOfThieves.x86

If you use this 32-bit version of the game on a 64-bit operating system,
you may also have to install 32-bit libraries.
I was successful with the following commands:
On Ubuntu:
sudo apt-get install ia-libs
On Fedora:
yum install libstdc++.x86
... which doesn't seem to be the exact same thing. But it did the trick for me.

By the way, I noticed the game is really slow on my Linux systems. It was only playable with the lowest quality settings possible. Maybe this is due to my graphic drivers, but I'll have to test further. It even crashed at the beginning of the pirate warehouse level. Don't hesitate to tell me if you experiment such problems.

  • Mac OS

Haha... I didn't test on Mac, because I don't have a Mac. But the beauty of Unity is that I can release on Mac from a Windows system anyway.
So, if Mac users out there want to give it a try and tell me what's wrong (or what's right, hopefully ;) ), you're most welcome!

What's new since the last demo?

You have to know the demo quests are more or less final at the moment. The next official demos (including this one) will only provide bug fixes and graphics/sound/music enhancement. I now focus my work on adding levels and quests for the final release.

The main new things (most of which can't be seen in the demo) are:
  • new animals: geckos and fennec fox
  • new characters: Turtle Master on Aqualums, Rodrig the retired pirate on Zephyr Island, both with full dialog tree and quests.
  • new enemies: guards and robots (still prototype)
  • new flower: lilypads
  • optimisation on my tools for level edition
  • automatic tests on very usual mistakes I tend to repeat on each release (systematic non-regression tests)
  • more avatars/images completed
  • dialogs can now use a dynamic camera
  • sun lens flares
  • use of real-time clothe animation for pirates headbands and guards hat
  • heavy optimisation on grass rendering, ia code, dynamic loading zones
  • optimized texture sizes, resulting in 50% smaller game files
  • use of deferred rendering which slightly boosts the framerate
  • trails appear when the player falls for a long time
  • saving the game now displays a screenshot
  • whole new level: mines, with a bunch of new textures and props, effects and gameplay items...
  • new island (quite empty at the moment) with its own dynamic skybox/light rig
  • design and integration of the 1st boss!
  • map display can now manage multiple floor levels
  • a few more props: bed, various jars, metal crates, books, plants at Iris', 
  • new gameplay items: mine trolleys, lasers, energy-based switches, energy capsules, ...
  • bug fix on various shaders with depth-of-field effect
  • bug fix on several enemy freezes
  • various bug fixes on switchs/platforms dependency and state save (I bet there are still some of them in there...)
  • lots lots lots of minor bug fixes.

I spent quite some time trying to port every shader to DirectX 11, but I still have graphical artifacts despite the better overall performances.

What's broken ?


You didn't expect everything to work perfectly, did you? I'm aware of a few bugs/regressions:
  • Environments are still a bit empty
  • Some sounds must be re-designed  
  • The game lacks some music/sounds
  • You won't always know what switches activate especially in the Bo Trial Dungeon)... Try to understand :) 
  • Some pirates may not be as aggressive as before in the pirate warehouse level.

 

Controls


  • ZQSD or WASD: move the character. It's both AZERTY and QWERTY compatible
  • Space: jump and climb
  • Shift: crouch, fall and block
  • Mouse move: move the camera
  • E: weapon selection menu
  • Left click: main weapon (Bo) or contextual action
  • Right click: secondary weapon
  • Tab: inventory/map/missions


Have fun! Peace!

October 3, 2014

New Demo

And here is the last demo of World of Thieves, a 3D adventure/stealth game between "Zelda" and "Beyond Good and Evil". Don't hesitate to test/share/reblog/comment/like if you want to help me!





Download for Windows

All downloads are 32-bits 

Survey: Don't forget to complete the online survey after playing the game!
Bug hunt: As usual, contact me for bugs or any feedback.
Get all the news: if you don't want to miss anything, subscribe, or follow me on facebook!


No MAC OS or Linux ?


The demo filesize is getting bigger and bigger on every new release. That's why I only share the Windows demo on this post. If you're really interested in Linux/MacOS demos, send me a mail/comment/contact form/whatever to tell me. But the final release will be on Windows, MacOS and Linux.


What's new since the last demo?


The main new things are:

  • A few concepts/tries for a villa design (new level) (not in the demo)
  • Better HUD effects and lighting for pickable items
  • 3 new aquatic animals (not in the demo)
  • 1 "boss theme" music (not in the demo)
  • 1 new level in the thief Guild (that was quite long...)
  • New props: jars, rocks, decals, water particles ...
  • Lia's quest is now only available after the pirate level
  • Enemies and breakable items now generate power ups. 
  • A few additional dialog lines
  • Better map display with local and global/world view, taking into acount map items.
  • Lots of bug fixes:input priority fix while on the turtle back, recoding of switch mechanics enabling the activation of various gameplay blocks (platforms, doors, ...) with multiple links, bug fix of annoying auto-slide when trying to climb on a wall edge, smoother transition from slide to jump, better scene bounds computation for nav graph generation, ...

What's broken ?


You didn't expect everything to work perfectly, did you? I'm aware of a few bugs/regressions:
  • A little display bug when you get the package from Reno, near the end of the demo
  • Some of the enemies might get "stuck" on a wall in the dungeon of the "Bo Trial"
  • Environments are still a bit empty
  • Some sounds must be re-designed 
  • You won't always know what switches activate especially in the Bo Trial Dungeon)... Try to understand :)

 

Controls


  • ZQSD or WASD: move the character. It's both AZERTY and QWERTY compatible
  • Space: jump and climb
  • Shift: crouch, fall and block
  • Mouse move: move the camera
  • E: weapon selection menu
  • Left click: main weapon (Bo) or contextual action
  • Right click: secondary weapon
  • Tab: inventory/map/missions


Have fun! Peace!

August 5, 2014

New Demo

And here is the last demo of World of Thieves, a 3D adventure/stealth game between "Zelda" and "Beyond Good and Evil". Don't hesitate to test/share/reblog/comment/like if you want to help me!





Download for Windows

All downloads are 32-bits 

Survey: Don't forget to complete the online survey after playing the game!
Bug hunt: As usual, contact me for bugs or any feedback.
Get all the news: if you don't want to miss anything, subscribe, or follow me on facebook!


Beware!


If you complete Lia's quest, this will take you to the end of the demo. You may want to wander around and find other quests before completing this one.

Furthermore, demo filesize is getting bigger and bigger on every new release. That's why I only share the Windows demo on this post. If you're really interested in Linux/MacOS demos, send me a mail/comment/contact form/whatever to tell me.


What's new since the last demo?


The main new things are:

  • New GUI/HUD design for the Link menu
  • 3 new menu items for collectibles in the Link menu: flowers, animals and paintings (not all in the demo)
  • 6 animals to cure (only 1 in the demo)
  • Better weapon control explanation in the Link menu
  • Better item pictures in the Link menu
  • Apples can now be stored and used from the item wheel menu
  • Better visual effects on bomb explosion (not in the demo)
  • Better visual effects on Bo mega attack charge
  • New item: magnetic arrow/bow
  • Enemies sometimes drop items
  • 3 new characters: Lia, Garnet and Iris
  • 1 new place: Aqualums (not playable in the demo, but you can see it). See the dedicated post here.
  • 1 place re-design: Zephyr Island (formerly Tera) including huge windmills, beaches and stone houses
  • Skybox re-design with dawn and dusk variations and better clouds
  • Sun and cloud color variations following day/night cycle
  • New animated banner for the website
  • New presentation cutscene on Eagle Islands
  • New cutscene on Aqualums Island
  • Most of the cutscenes can now be skipped (mouse click)
  • 3 new musics: 2 for Aqualums, 1 for Eagle Islands
  • Better audio mixing and mastering of musics
  • New credits screen
  • New sidequests: collecting flowers and curing animals (partially in the demo)
  • Lots of bug fixes: character now disappears when the camera is too close, no aiming animation for range weapons if no ammo, swinging lanterns can now be parented to moving platforms, giant windmills still turn when looked at from far away, better scene structure for dynamic loading, and many other things you won't even notice ;)

What's broken ?


You didn't expect everything to work perfectly, did you? I'm aware of a few bugs/regressions:
  • The color of the slingshot target is not always accurate depending on what you aim.
  • Completing Lia's quest directly leads to the end of the demo. You may want to postpone this one. 
  • Environments are still a bit empty.

 

Controls


  • ZQSD or WASD: move the character. It's both AZERTY and QWERTY compatible
  • Space: jump and climb
  • Shift: crouch and block
  • Mouse move: move the camera
  • E: weapon selection menu
  • Left click: main weapon (Bo) or contextual action
  • Right click: secondary weapon
  • Tab: inventory/map/missions


Have fun! Peace!

July 3, 2014

Aqualums, the main island

Hi there!

It's been a while since I haven't posted anything game-dev related. But, don't worry, I won't write a very technical article this time. I'll just speak about a new content in the game: Aqualums, the main island (which is NOT the hero home, on which I still have to work by the way...)


I - Concept


So, for this new island, I had a precise idea in mind. I made some concept works using any tool I thought was good for the job: this included a textual description (in a text document), a color scheme and a logical/quest plan (in Inkscape), a digital concept art and a few traditional paper sketches. This is all very rough, but I wanted to have some kind of basis to set the mood. The goal is not to be perfect at this stage.

So here are a few snapshots of my base material (in French for the text, sorry):
 
Of course, a real concept artist would be horrified by this... Everything is loose, perspective is off, and texts are full of mistakes. BUT, this gives me a good idea of the way I want to go. And I don't have the time to make it better anyways :p.


II - Prototyping


So right after this, I jumped into the "blocking" phase: the goal is simply to create ugly 3D blocks to check the dimensions and proportions of the island. Not very pretty, but very useful to make the first tests in the game and "feel" the level.

Here's how it looks in the game:

The block level. If you look carefully, you may spot 3D texts here and there. It's just a hint (for me) to know what I'll put there in the final graphics.


In this stage, I can also check the masses and forms of the buildings and see if there are mainly good visual compositions from the player point of view. The camera/player moves of course, but I just check that there aren't any ugly/unbalanced spots. I also tried to avoid a too square-y plan of the city.


III - Finalizing


And once everything seems OK, I start to create the final graphics, using textures, and finer 3D modelisation:


The island during the refining step: some blocks are still there, but I slowly replace them by cartoonish houses (with no windows at this point)

This process is very long! And lucky for me, I already had a lot of wood and stone textures as well as nice wood pontoons from the previous levels. Of course, I reused some of the items, but not all of them! I don't want this island to have the same look as the other ones. So I also had to create new items: bridges, carpets, a tree, small boats, paper lanterns... There are currently 1300 objets in this level... for now.

The thing is, creating a graphical appearance is good, but this is not enough for a game. I must specify other properties for some of the elements in there: Is it solid? Can the hero collide with it? Does it move? If yes, how?

And some elements have a complex appearance/rendering stage (the tree for example), so, in the end, I also had to code additionnal stuff to create a believable city in the game: flying leaves around the tree, occasional halo around swinging lanterns, and of course, I had to optimize everything to make it run smoothly enough. Because, I'll have to add characters on top of that.

And the final look is like this:



Soooo finally, this took me nearly a week of work (I only talk about blocking and finalizing; concepts were done long before and went through a lot of changes). But, at this point, you can't do anything in this city, except walk/climb around. And you can't go inside any of the buildings. Useless, isn't it?

IV - Other stuff


In addition to this new island, I also worked on various stuff, including (but not limited to):
  • A redesign of the "Link" menu with a better inventory,  map navigation and other surprises
  • A redesign of some weapons (slingshot and bow)
  • New items: a magnetic bow and a flute
  • A new character giving a "collecting" sidequest
  • A very big ocean animal to track (more on that later)
  • Better smoke effects on bombs, 
  • 2 new musics for ocean exploration and for the Eagle Islands
  • And more recently a new sky/cloud system. By the way, the city above looks like this now:




Yes you can ride a turtle in the canals of the city.

In the end, it's kinda cool to see that I started with a simple text paragraph describing the city and it's finally taking shape! But the work is not finished yet...

So that's all for today!
Peace :)


June 11, 2014

Presentation in secondary school

Hi there,

This is just a quick post to share a little presentation I made in a secondary school to introduce the job of "game developer" to young guys between 11 et 15 years old. By the way, thanks a lot to my friend Mathieu for inviting me and thanks also to his colleague Richard! And of course, thanks a lot to all the pupils of the computer science club of Jacqueline Auriol school in Villeneuve for their enthusiam.
It was really fun to discuss with them. It's quite funny to see that they had the exact same questions I had in mind when I was their age...

For the curious guys out there, I share my presentation here below:

http://www.oneiricworlds.com/siteResources/presentation/creationJeuVideo.pdf


It's in French and it's a very introductory/simple presentation, but if it can be of some interest to somebody...
And surprisingly enough, it was quite difficult to prepare this presentation, because I had so much to say, but I had to simplify a lot the complexity of the problem to make it understandable for teenagers. A very interesting exercise!

Apart from that, I still work on my game of course. But more on that later!

Peace!


May 17, 2014

New Demo

And here is the last demo of World of Thieves, a 3D adventure/stealth game between "Zelda" and "Beyond Good and Evil". Don't hesitate to test/share/reblog/comment/like if you want to help me!



Survey: Don't forget to complete the online survey after playing the game!
Bug hunt: As usual, contact me for bugs or any feedback.
Get all the news: if you don't want to miss anything, subscribe!

Install Notes


  • Linux

Under Linux, you have to change the execution rights on the game file:
chmod +x worldOfThieves.x86

If you use this 32-bit version of the game on a 64-bit operating system,
you may also have to install 32-bit libraries.
I was successful with the following commands:
On Ubuntu:
sudo apt-get install ia-libs
On Fedora:
yum install libstdc++.x86
... which doesn't seem to be the exact same thing. But it did the trick for me.

By the way, I noticed the game is really slow on my Linux systems. It was only playable with the lowest quality settings possible. Maybe this is due to my graphic drivers, but I'll have to test further. It even crashed at the beginning of the pirate warehouse level. Don't hesitate to tell me if you experiment such problems.

  • Mac OS

Haha... I didn't test on Mac, because I don't have a Mac. But the beauty of Unity is that I can release on Mac from a Windows system anyway.
So, if Mac users out there want to give it a try and tell me what's wrong (or what's right, hopefully ;) ), you're most welcome!


What's new since the last demo?


A lot less than for the last demo, since it's been only 1 month since then. And it's still a lot of "core invisible thankless" stuff:

  • different font for dialogs and HUD/GUI
  • slow motion to accentuate the character KO/game over
  • big jump landing animation
  • turtle travelling (see the detailed last post) with various feedback effects (not in the demo)
  • cyclic/infinite map (not in the demo)
  • floating barrels and crates that can be crashed by the turtle (not in the demo)
  • new barrel design
  • moving platforms (not in the demo)
  • better visual feedback when curing animals (not in the demo)
  • recoding/debugging of the slide movement on slopes when the character can't climb (I bet you didn't even notice that the character could slide, did you?)
  • lots of bug fixes on the climbing and graple aiming algorithm
  • bug fix on the water splashes when the character falls into water
  • bombs can hit the player (not in the demo)
  • lots of optimisations on animals and pirates reducing the computation time by 70%
  • other optimisation on various objects, making the game running smoother
  • lots lots lots of "minor" bug fixes:  music volume transitions, avoid sound saturation, avoid slow camera moves when fastest render quality is selectionned, fixed locally inverted image on several graphical effects under Linux, better state transitions for the player, better gamepad compatibility during weapon selection, switch activation from slingshot, many other fixes...


What's broken ?


You didn't expect everything to work perfectly, did you? I'm aware of a few bugs/regressions:
  • The inventory is not fully functionnal yet: you have to use the keyboard to change the current page (missions/inventory/map) but the mouse to select items inside each page. And sometimes the current page changes when you click somewhere else.
  • The color of the slingshot target is not always accurate depending on what you aim.

 

Controls


  • ZQSD or WASD: move the character. It's both AZERTY and QWERTY compatible
  • Space: jump and climb
  • Shift: crouch and block
  • Mouse move: move the camera
  • E: weapon selection menu(useless in this demo)
  • Left click: main weapon (Bo) or contextual action
  • Right click: secondary weapon
  • Tab: inventory/map/missions


Have fun! Peace!

April 28, 2014

Turtle travelling

Hello everyone,

These last days, I've been working on 2 new features in the game:
  • Travelling on the back of a turtle
  • Having a cyclic world (well, technically, this is a torus)
OK, these 2 features are slightly linked...

I - The Turtle


At some point in the game, the player can travel the whole world without restriction. Of course, this means he can't only swim because it would be waaaaay too slow. So I wanted to create a cool means of travelling... and, thinking about my creation creed "freedom, humour, oneiric", I chose to make him ride a turtle! I first created the 3D model in Blender and the texture in GIMP as usual.

Another texture far from optimized...

But creating a new feature is not that easy. A lot of questions are raised about this turtle:
  • How is it controlled? 
  • How fast should it be? How long would a player travel between islands without being bored? How can I reconcile this with the minimum necessary distance between islands to be sure that I don't clutter memory or slow down the game?
  • Can the player use items while being on the turtle back? If yes, which ones?
  • Can the player jump? Or crouch? Is it interesting/useless?
  • How can the player switch from the turtle riding to swimming?
I didn't answer to all of these questions, but I made a few choices. 
I implemented the same kind of controls for the turtle as for the player.
Using the Bo (the melee weapon) seemed kind of useless on the turtle's back. Range weapons, however, can be interesting for water fights. The problem is that shooting from the turtle back at high speed gives the impression that all projectiles are very slow in comparison... It's even possible for the turtle to be faster than an arrow.

So I set up 2 different travelling speeds:
  • At low speed, the player can shoot
  • At higher speed, no shooting is possible, but the turtle can quickly travel between islands.

The turtle in-game.

In order to give more feedback to the player while travelling on the turtle, I used lots of little tricks:
  • Foam and ripples behind the turtle
  • Little water splashes
  • Random bigger water splashes
  • Water trail behind the fins
And for the highest speed
  • Wind trails around the turtle
  • Shorter camera focal length
  • Fish eye effect to accentuate the speed feel

And in both cases, additionnal turtles randomly spawn around to accompany the player for a few seconds. This gives a bit of life to the travel!

Riding turtles!


II - Cyclic world


If the player can go everywhere on his turtle, this raises the question of the world limits. I can simply put some kind of uncrossable wall/mountain/obstacle at the edge of the map, but I don't like this idea. It goes against the freedom feeling I want to give to the player.

So I chose to make a cyclic/tile-able world. The idea is that if the player leaves the map on a side, it re-appears on the other side. Basically, this is a "simple" translation of the player. However, there is a lot of other objects to "teleport" to the other side of the map: particle effects around the turtle, other turtles, all the projectiles that the player can shoot, and of course the camera, which is a bit tricky, because it has a very smooth movement based on previous position and velocity that I must recompute after teleportation.

Another problem is that there is a specific kind of object that I can't translate: trails... because they are dynamically computed in the world space and I can't access the information of vertex position (this is a limitation of Unity, I guess because it is cached in the GPU in some way). So I can't move them, and I can't recreate them on the other side of the map by copying and translating vertex positions.
If I don't teleport the trails, this creates a very visible glitch during teleportation: they suddenly disappear. I finally chose to make them disappear progressively while the player approaches the map border, which is hardly noticeable.

If the player sails exactly on a border, a new problem appears: I don't want to teleport him on nearly every frame (this can be a heavy operation depending on the number of objects to teleport). So, I wait for the player to go past X meters beyond the map border before teleporting him to X meter inside the opposite map border. This creates an "hysteresis" behaviour which prevents multiple teleportation calls and drastically improves the frame rate on map edges.

Additionally, instantly teleporting the player and the camera can create a break in the ocean animation. To avoid this behaviour, I had to carefully tune all ocean texture scales to be sure the global period matches the world size, but at the same time I wanted to avoid obvious repetitions... Another compromise to make by playing with prime numbers!

I also had to work on a few other "little" things: adding wave/water sound while moving the turtle, creating the "horn" sound which is used to call the turtle (this will be justified in the story), collision tests with islands, ... I can't talk about everything here!
And here's how it feels at the moment:

You can notice the cyclic world thanks to the basic grass square island. Of course, in the end game, it will be real islands. This is only a technical test.

Finally, riding the turtle is kinda cool! Of course, I should add more objects on the ocean to give it more life (floating barrels, plants, barges, boats, fishes, and other sea animals), but, each time, I'll have to deal with the teleportation problem. I'll also have to carefully position islands far enough from the map edges so that they won't suddenly appear when the player is teleported.

See you next time!
Peace!





April 14, 2014

New Demo !

And here is the last demo of World of Thieves, a 3D adventure/stealth game between "Zelda" and "Beyond Good and Evil". Don't hesitate to test/share/reblog/comment/like if you want to help me!




Survey: Don't forget to complete the online survey after playing the game!
Bug hunt: As usual, contact me for bugs or any feedback.
Get all the news:if you don't want to miss anything, subscribe!

Install Notes


  • Linux

Under Linux, you have to change the execution rights on the game file:
chmod +x worldOfThieves.x86

If you use this 32-bit version of the game on a 64-bit operating system,
you may also have to install 32-bit libraries.
I was successful with the following commands:
On Ubuntu:
sudo apt-get install ia-libs
On Fedora:
yum install libstdc++.x86
... which doesn't seem to be the exact same thing. But it did the trick for me.

By the way, I noticed the game is really slow on my Linux systems. It was only playable with the lowest quality settings possible. Maybe this is due to my graphic drivers, but I'll have to test further. It even crashed at the beginning of the pirate warehouse level. Don't hesitate to tell me if you experiment such problems.

  • Mac OS

Haha... I didn't test on Mac, because I don't have a Mac. But the beauty of Unity is that I can release on Mac from a Windows system anyway.
So, if Mac users out there want to give it a try and tell me what's wrong (or what's right, hopefully ;) ), you're most welcome!


What's new since the last demo?


It's been 3 months since the last demo, so what's new you may ask? Well, probably nothing that you will notice :(... Because the main story, quests and levels are almost identical. So what did I do? I worked a lot on more core/fundamental stuff. This is the injustice of working on the development side... Almost all the work is invisible:

  • smoother camera moves
  • better camera collisions
  • lots of feedback added during fights: camera shake, blur, vignetting and chromatic abberations when a hit is taken
  • visualisation of sound waves on impacts
  • various post-processing effects: depth of field, bloom and screen space ambient occlusion
  • speech bubbles for the pirates
  • crouch position for the hero
  • blocking skills for the hero and the enemies
  • better collision tests for the climbing moves
  • charge animation for the hero mega attack
  • a few more items (not usable in the demo however): bomb, flute, cure fruit
  • hud/gui improvement for contextual actions, hints and help
  • 2 more collectable categories (not in the demo): ill animals that you'll have to cure (only sheeps at the moment) and flowers
  • control redesign for item use
  • black stripes during dialogs/cutscenes
  • fully open world with continuous dynamic background loading (you won't notice in the demo)
  • better path finding for enemies
  • music management system with music depending on the location of the player  and with smooth audio transition between zones
  • a few more buildings on Tera Island and some funky sheeps
  • re-recording of the intro music with better sound and rythm quality
  • music for Tera Island
  • shoot cool down for range weapons
  • different target icons for each range weapon (not in the demo)
  • game (and menus) playable with a joypad
  • fog with dynamic color changing
  • flag with physical simulation on the Thief Guild
  • redesign of the day skybox
  • better rendering of far away objects
  • dynamic light variation of "thin" objects (grass, ropes, ...)
  • better answer selection in dialogs



What's broken since the last demo?


You didn't expect everything to be better did you? I'm aware of a few bugs/regressions:
  • The inventory is a bit less functionnal: you have to use the keyboard to change the current page (missions/inventory/map) but the mouse to select items inside each page. And sometimes the current page changes when you click somewhere else.
  • The new camera positionning algorithm is nicer, but less stable. It totally crashes the game in some very specific locations and I can't spot why at the moment. I'm working on it...
  • On Linux, the image is locally reversed on impacts... This makes a strange effect.

 

Controls


  • ZQSD or WASD: move the character. It's both AZERTY and QWERTY compatible
  • Space: jump and climb
  • Shift: crouch and block
  • Mouse move: move the camera
  • E: weapon selection menu(useless in this demo)
  • Left click: main weapon (Bo) or contextual action
  • Right click: secondary weapon
  • Tab: inventory/map/missions


Have fun! Peace!

April 5, 2014

Music!

Hi everybody,

After a long silence, I'm going to talk today about music in the game, and more specifically how I make it. I recently tried to re-record the intro music because I had made it quite quickly in the first place.

I - First audio tests: Ardour


For the first music recording, I used the Linux software "Ardour", which is the "equivalent" of Protools, a famous recording software in the audio/musical industry. It may not have all of its features, but it was enough for me. I quickly described this setup at the beginning of this post.

The sound softwares are really great (and free) under linux, and they have a very different philosophy than the ones of Windows or Mac: they all rely on a "sound server" software (called JACK) which is designed to treat the audio information with a minimum delay to have a real-time response, but, above all, ALL audio softwares are compatible between them because they use the same Input/Output interface (relying on JACK, the sound server). So, under linux, each software has a speciality (audio recording, post processing, effects, synthetizers, drum pattern creation, score editing, midi recording) and you can mix them as you want, whereas on other OS, it is generally difficult to make softwares from concurrent companies communicate between themselves.


The incredibly powerful and intimidating interface of Ardour, the reference of audio recording softwares on Linux.

However, in my case, the problem is, Ardour is above all an audio recording software, which means it is designed to record REAL instruments, if you have the good microphones, and hardware setup. It is very powerful, and I recorded the intro music with my simple Yamaha Keyboard, but I'm not a perfect musician, and I could hear a lot of mistakes (on the rhythm especially). In this case, there is no other solution than to re-record again and again to correct the mistakes. Moreover, I am limited to the (poor) sound quality of my little keyboard, which sounds a bit cheap.It's not a big problem in the kind of video game I plan to do (because, except in big productions, it's quite rare to have a symphonic orchestra recording the music), nevertheless, this poor sound quality annoyed me.

Here is the first try of the intro theme recorded directly in audio from my keyboard:



If you can't see the audio player above, try this link
 
So after testing "real" instrument recording, I switched to another pipeline: MIDI recording.



II - The promise of MIDI tools


As a lot of compositors, I finally chose to use a MIDI sequencer in order to create the musics. I use LMMS, a simple but powerful software from the Linux world (again) but which works also under Windows.

[By the way, at the moment, I use it with Windows because my full pipeline production is a Windows-based (for development, graphics, audio...) but all the softwares I use also work under Linux... except Unity, my software development tool. But when they'll decide to port it to Linux, I can switch my full pipeline production under Linux for better stability while keeping the exact same softwares.]

Anyways, what is a MIDI sequencer?

A MIDI (Musical Instrument Digital Interface) sequencer is a software that enables you to write/record musical scores, but in a simplified version (not the real classical notation, even if it is sometimes also possible): when I "record"/"write", the computer doesn't actually record the SOUND coming out of my Yamaha keyboard, it records the NOTE, its PITCH and DURATION (with a few more informations), and it creates a simplified musical score with these notes. The 3 big advantages of this method are:
  • You can make many change AFTER having recorded the musical part: change the sound of the instrument by using what we call "soundfonts", change the tempo, ...
  • You can correct errors with a simple click on the score (move a note, change a duration, change the velocity...)
  • You can "quantize" the score, that is to say that every note is played with a perfect timing according to the tempo of the song (thus, there is no rhythm approximations).

Of course, not everything is perfect, but this new process simplifies a bit the musical creation.

For each recorded instrument part, you have to select a "soundfont". This is pretty much the same thing than a "font" for a text except it doesn't define how characters will look like, it defines how notes will sound. This is some kind of instrument bank. And there are lots of them on the internet, with different qualities, sizes, and instrument types. In the end, I've got many more sounds available than the simple sounds from my Yamaha keyboard, with a better quality too.


The LMMS MIDI sequencer. In the left window, the blue segments represent different pattern/melody parts. Each line is a different instrument with different settings. For each blue segment, you can modify it note by note on the right window (the "piano roll") where you can add notes, delete them, move them, change their duration or velocity... As you can see, it's not a real musical score; the visual representation is quite simplified and intuitive.

III - Installing LMMS


[This part is a bit technical, so go to the next one if you want]

So this seems quite cool, but setting up the software correctly took me some time, because I have a basic soundcard. Indeed, on Windows, the sound drivers always introduce some "lag" when recording from audio devices. It seems to be a known issue. Thus it is impossible to record from my keyboard because each note is systematically played 1/4 beat late. This drived me crazy.
Fortunately, the ASIO company has some kind of "generic no lag driver" which seems to do the trick. But this new driver seemed not to be supported by LMMS natively. I had to find a precompiled DLL driver library with the ASIO driver support and replace the native LMMS DLL driver library.
I wouldn't have had those problems under Linux, but this finally saved me a lot of reboots when working on audio composition.

However the version of LMMS I got also had a MIDI recording problem with soundfonts tracks (Haaa, free software ;) ). But the community is great, and a new version correcting the problem was released a few days after.

The last problem was using soundfonts. I found a huge soundfont with great quality but it needs more than 1.5 GB in memory (yes, you read well), and the 32-bit version of LMMS can't load it. So I finally had to re-setup my whole pipeline in 64 bits (LMMS + real-time DLL drivers). To this point, I still have a few audio output problems from time to time, but it's globally OK.

Achieving to have a "stable" setup is sometimes long and difficult, but once it's done, you can finally work! Because yes, until now, I haven't produced anything.

But after trying various instruments, learning how to use the software (I read the documentation and tutorials for a few hours), I finally could re-create the intro theme! And here is the same song than before, but recorded in MIDI with a better sound quality (I hope):



If you can't see the audio player above, try this link
 
All this work for this 1 mn of the same music... Depressing isn't it? But now I know I can easily create other music, and that's the good part. This first part took me several days to achieve, but after that, I created another test track in a few hours only. Meanwhile, I keep listening to the original soundtracks of my favorite games on youtube for hours to understand how they are built. Very enlightening :)


IV - Integrating the music in the game


Now I have musics of better quality, but how are they played in the game?
In the game, I created a few different "musical zones". When the character enters a zone, it starts the corresponding music (with a little fading-in for a smooth start). An when the character leaves, it stops the music.
But this is not as simple as that, because sometimes, I want a different music for a little cinematic taking place somewhere where there is already a musical zone. So I added some kind of priority information for nested musical zones. Moreover, I also have to deal with memory managerment (musics have a huge impact on memory use) and I must clean them when the character leaves a zone, especially now that the world is streamed into memory...

Anyways, that's the basic process of creating a music for a video game. That was a bit complicated to setup (especially using LMMS under Windows with my poor sound card), but this should be easier now to create additional musics.

Thanks a lot for reading until here, and see you next time, maybe for an updated demo!

Peace.

PS: The final news which made me depressed: the last version of Ardour (the soft I first used) now handles MIDI recording/editing... But I didn't see that before. Anyways, my work in MIDI is not lost, since I should be able to import it in the new Ardour version. I might give it a try one day, but I'll have to update all my linux installs. I guess I'm not finished with all that musical stuff...



March 5, 2014

Game communities and vote!

Hello everybody!

I just post a quick news to tell you that World of Thieves is now visible on Indie DB and Steam Greenlight communities, and if you want to help, now is the time :)

Game Communities?


For those of you who don't know, these are the most active indie game communities on the net.
They are dedicated to expose the games of indie developers to players in order to build a community around each game. It enables players to give their opinion and propose improvements directly to the developer. This is incredibly valuable for me, as I already got a lot of feedback on what is good or bad about my game.

Vote for World of Thieves!


Steam Greenlight is also dedicated to submit game ideas/prototypes to players to see if they want it on Steam (the biggest online video game store...). If enough votes are reached, the game is distributed via Steam. So, if you want to see World of Thieves on Steam (even if it's only in a few months), don't hesitate to vote for it on this page. You'll need to have a Steam account to do so.

Oh, and by the way, you may have noticed, but I recently redesigned the website to get a nicer presentation.

See you!

February 20, 2014

World of Thieves goes Open World

Hi again folks...

[WARNING: This is a crazy technical article. Pursue only if you're mad]

As promised in my last post, here is a pretty technical article to show you the kind of problem I run into and to give you a hint on how I spend my days losing my hair. This one is a pretty complicated one and kept me occupied for the last 2 weeks, because it forced me to change a lot of things in the code of the game even if I though "no problem, I planned it well, everything's gonna be okay". How naïve...

The final goal is to have a continuous world without any loading time between zones.
Why an open world you may ask? Because, at the beginning, I set myself 3 major guidelines about my game:
- freedom
- humour
- oneiric world

And every choice I make at any step of the development follows these 3 "rules". This ensures me that the game, even if not perfect, will have some coherent content and some kind of art/feel direction. Thus... having an open world helps a lot for the freedom feel. Plus it's a crazy challenge, and I'm a crazy guy :).

As you may have seen in the demos and videos, the world of my game is a big ocean with various islands on it (yes, just like Zelda Windwaker). At some point the player will have the ability to travel on the ocean (on a turtle's back ;) ) and can go pretty much everywhere he wants. This means islands/levels must be loaded dynamically according to the player's position/direction in the world.


I - Unity Limits (Yes I finally reached some)


I use Unity to create my game and (luckily?), Unity provides 2 functions to load a new level "in the background" so that you don't notice any lag:
  • LoadLevelAsync: loads a new level in background. Once loaded, the new level replaces the current one.
  • LoadLevelAdditiveAsync: Same thing, but adds the content of the new level to the current one. This is obviously what I'm going for here.

But this is theoretical only. Unity is a great software, but some points are still under heavy development. These ones are. And it impacts the game in a way I didn't think about: after using LoadLevelAdditiveAsync, all the IA agents of the new level crash.

This occurs because the IA uses a "NavMesh" (= Navigation Mesh) to represent the walkable areas in the level. The IA can only walk/move/search a path on the NavMesh. Problem is, Unity only authorizes 1 NavMesh to be loaded in memory at a time, and you can't load a NavMesh using LoadLevelAdditiveAsync. Technical limitation. I can't argue.


The NavMesh: enemies can only walk on the blue zone. The computation of this 3D NavMesh is a quite complex task...


II - Time for Hacks


I found a hack on a forum post : using LoadLevelAsync (which actually loads the new NavMesh in memory) and tagging all objects of the current level not to be destroyed (a cool feature I discovered while reading the forums. Great community by the way).
This is supposed to do the trick but it rises 2 more problems:
  • LoadLevelAsync is not actually a background task. It really freezes the game for a few ms, and it IS visible.
  • Cool, the NavMesh of the new level is OK, and the IA too, but what happens if I go back towards the 1st level (which is still visible but with no corresponding NavMesh and no IA)? If I wan't to reload only the NavMesh of the 1st level... I can't without reloading the whole level, which may result in objects flickering during the reload.


At this point, I'm faced with Unity bugs I can't fix and I'm left with a few options:
  • Wait for a bug fix from Unity about the NavMesh+LoadLevelAdditiveAsync problem. I don't think it will come before I release my game, the Unity guys have loads to do and this is not a priority.
  • Use a 3rd-party library. I must find one that does NavMesh generation and path-finding, is real-time, and dynamically loads levels.
  • Recode everything that is not working. Not impossible (I already coded a real-time A* path-finding algorithm for World of Ninjas, but it works only on a 2D grid)... but hardly realistic. Good guys spent months developping systems much more reliable than anything I could do in a few weeks.
  • Find another workaround. I didn't find any when I spent a few hours on forums and faqs.
  • Give up. This is a serious option. I can perform the navigation part on a 2D map where you click where you wan't to go. All islands would be accessible too, and it won't change the gameplay on each island. Maybe I'll even consider that if I achieve to create  a "real" open world but it's not fun to explore.

But before giving up I heard a lot of good things about a 3rd-party library implementing the classical A* path-finding algorithm: Aron Granberg A* path-finding library.


 Lots of levels loaded together!


III - A new lib: A*


Cool! A new library full of promises. But before commiting to this, I have to test that every basic IA feature already provided by Unity is implemented in this library.

I start with the free version of the library, which means... there is no NavMesh generation available (only on the full 100$ version). Of course, I can buy the full version, but I'm not sure this library solves my "dynamic loading" problem. I must first test it on this specific point.

I know that Unity can generate NavMeshes (I used them before). So I write a script to convert Unity NavMeshes to the library NavMesh format, which enables me to use the library path-finding on NavMeshes from my real levels.

But there is already a problem: the path-finding behaves weirdly and sometimes IA makes huge detours to get to some point. It seems to be a known issue... This is because of the NavMesh topology: a "good" NavMesh for the A* library is supposed to have some kind of grid pattern on it to avoid big triangles next to small triangles. Unluckily, NavMesh generation in Unity doesn't expose some "grid size" or "max edge length" parameters, which means I can't test that the path-finding behaves correctly with a "good" NavMesh.


IV - Another new lib : RAIN


I heard about another path-finding library: RAIN. Totally Free, but sparse documentation. I tested it mainly to assess its NavMesh generation algorithm and hurrah! It can generated "grid"-NavMeshes. So I write another script to convert RAIN NavMeshes to A* NavMeshes, with very few documentation... Tough time! And... I get a few errors during the convertion but the NavMesh seems to be generated anyway. I test it with the A* path-finding, and it seems OK! The IA behaves well.

Now, by combining 2 external libs, I have some basic IA behavior. I am at the same point that with Unity path-finding before.
I must now tackle the REAL problem: dynamic NavMesh/IA loading.


V - NavMesh dynamic loading


It seems the A* library provides a way to export a NavMesh in a text file to load it dynamically at run time. Exactly what I need (theorically ;) ). After a few tests, it seems to work at least for "little" files. But of course loading a new NavMesh gets rid of the previous one. I have to be cautious while activating/deactivating IA agents. But this means I need to write another script to convert the A* NavMesh in a text file during level generation.


The usual test level for enemy/IA behavior


VI - Integrating everything


OK. Every test I've made until now was of course on temporary/separate IA agents. I must know rewrite the code of the real enemy IA in my game to make them use the new A* library. And of course, I have a few problems because the library doesn't provide exactly the same callbacks/hooks for various states (path is computing, agent has arrived at destination, etc...). But finally, the IA works just like before, and I can dynamically load a new level with correct IA behaviour.


VII - Final surprise: progressive activation


But... for larger levels, the loading seems to lag. How it this possible? I made all this to finally realize that the Unity fonction LoadLevelAdditiveAsync lags? Did I do something wrong?

And indeed, after a few tests, it seems that the loading itself doesn't lag. It's the activation and start scripts of all the loaded objects (IA/vegetation/animals...) that occur on the same frame that makes the game lag!

So I have to disable all the loaded objects, and activate them one by one on each frame. But this leads to 30 seconds to load a 1800 element level. So I optimized this to load many objects on one frame if they are light (a simple crate), and only one if it's a complex one (enemies). I dropped down to 3 seconds to load the same 1800 elements.


VIII - Making it automatic


Cool! It works on a few levels that I placed "by hand" on the global world! But, in the end, I'll have many levels, some of which may change in location. I have to set up a pipeline to ensure that every step I manually made is correctly and systematically handled for every new level.


I set up a special "world" mesh file made in Blender to precisely locate every level in the world. Each individual level is stored in a separate Blender file and centered on a (0,0,0) position.


The simple world mesh locating all levels in Blender. The big and small spheres respectively represent the loading and activation zones.


When loading a level from Blender in Unity here's the (almost automatic) process:
  • Find the final level position in the "world" mesh
  • Move the whole level to the final world position (while converting coordinates conventions)
  • Convert every Blender object in a "smart"/"scripted" Unity object
  • Create the NavMesh using either the Unity or RAIN NavMesh generation
  • Convert the Unity/RAIN NavMesh to A* NavMesh
  • Plug the generated A* NavMesh into the A* path-finding Object
  • Convert the A* NavMesh to a text file
  • Deactive all objects in the scene so that they won't be activated simultaneously after a dynamic load

... And that's pretty much it... For the offline level edition part.

At run-time here's what happens:
  • If you enter a level zone, the level is dynamically loaded, but nothing is activated yet. Only basic (and huge) island meshes are visible
  • If you get closer, the text file NavMesh is loaded, object activation starts and within a few seconds the whole level comes to life.
  • When you leave the activation zone, all objects are deactived, but the NavMesh is still in memory (in case you want to come back ;) )
  • When you leave the level zone, the whole level is destroyed.

I had to carefully study the distance at which each loading/activation occurs. Because I don't want to start activating very far away levels, but I still want them to be visible at a fair distance. I must also care about the distance between the islands: if 2 or more activation zones overlap,  many levels are loaded at the same time, and this may seriously slow down the game.
In brief... all this things are to be tuned and balanced.

Sooooo.... This was a huge journey through incredibly complex features, but I now have an open world running at 50 fps in average and at least at 20 fps during loading. Now, you know why the game hardly changes between 2 releases ;)

For the brave guys who read until here, here's a video of the dynamic loading of the levels. I use a super-graple enabling me to move from one island to the other, even if the aiming is sometimes a bit difficult... And you may notice the distance between islands is perhaps a bit long.



To avoid seeing islands popping from nowhere when the player enters a loading zone, I added fog (classical trick in video games).



IX - Even more problems


For the sake of clarity I didn't talk about every problem I had, but for the guys who would like to set up a similar structure, you have to know:
  • The A* lib has some cache information about the NavMesh, and it's sometimes necessary to "rebake"/"rescan" the NavMesh after loading it. But this is absolutely not real-time friendly.  I have to make additionnal tests, but it seems to be necessary only when playing in the editor when you modify a preexisting NavMesh. In the release, this may not be necessary.
  • LoadLevelAdditiveAsync is absolutely not async in the editor. It freezes the game. You have to make a release exe to truly test real-time loading.
  • Loading lots of level simultaneously totally messed up with all the automatic triggers I used to launch dialogs/cinematics or whatever. I had to fix all those things happening at the same time while I was still far away from the actual islands.
  • Because I now dynamically load levels, I also must dynamically save all the local modifications of the player: if he takes a pickable item, unlocks a door or a chest, I must keep track of it even if the level is unloaded before he gets to a save point.
  • A few objects don't support activation/deactivation at all: clothes. This breaks the physics simulation in the best case, crashes in the worst. I had to find a workaround consisting in only disabling the cloth component instead of the full object... which makes my code look like crap.


I used clothes simulation to add huge flags above the Thief Guild (the only graphical change for 2 weeks...)


That's all for the crazy stuff. See you next time! Peace!





February 19, 2014

Interview

Hi everybody,

It's been  a while! Don't worry, I still work on World of Thieves... Lately, I've been trying to add continuous background loading of the levels. This means I should be able to create a small "open world" within the game. But more on that later!

This quick post is just to share a little interview with you. I recently came across the dev blog of Genesia, an excellent old strategy game we played a lot with my brother when we were kids. The developper is trying to create a remake on new platforms (Android, IOS...). I contacted him as a huge fan and as an indie colleague to ask him a few questions about his work. The guy was very cool and took the time to explain me a lot of things. It was very nice and motivating to speak with him!

You can see the "interview" (in French, sorry) here: http://www.genesia-game.com/fr/blog/35-courrier-des-fans.html


January 30, 2014

The indie life 2

It's a bit difficult to keep the motivation this week, so here's another little comic about how I spend my days. It's not that obvious to track bugs...


January 27, 2014

The Indie life

An old little comic I made when I started to create my game... I originally wanted to create a few strips like this one to share what I do in another way than technical articles. Maybe I'll do more of these in the future.


Maybe some of you already saw this on my deviant art profile or my art blog...

January 17, 2014

New updated demo for Windows, Linux and MacOS

And here is the last demo of World of Thieves, a 3D adventure/stealth game between "Zelda" and "Beyond Good and Evil". After all the amazing feedbacks I got, I thought it would be cool to fix all the biggest (and really annoying) bugs of the last demo. Don't hesitate to test/share/reblog/comment/like if you want to help me!



Survey: Don't forget to complete the online survey after playing the game!
Bug hunt: As usual, contact me for bugs or any feedback.
Get all the news:if you don't want to miss anything, subscribe!

Install Notes


  • Linux

Under Linux, you have to change the execution rights on the game file:
chmod +x worldOfThieves.x86

If you use this 32-bit version of the game on a 64-bit operating system,
you may also have to install 32-bit libraries.
I was successful with the following commands:
On Ubuntu:
sudo apt-get install ia-libs
On Fedora:
yum install libstdc++.x86
... which doesn't seem to be the exact same thing. But it did the trick for me.

By the way, I noticed the game is really slow on my Linux systems. It was only playable with the lowest quality settings possible. Maybe this is due to my graphic drivers, but I'll have to test further. It even crashed at the beginning of the pirate warehouse level. Don't hesitate to tell me if you experiment such problems.

  • Mac OS

Haha... I didn't test on Mac, because I don't have a Mac. But the beauty of Unity is that I can release on Mac from a Windows system anyway.
So, if Mac users out there want to give it a try and tell me what's wrong (or what's right, hopefully ;) ), you're most welcome!


What's new?


  • QWERTY and AZERTY compatible controls by default
  • save bug fixed
  • more save points
  • inventory interface actually showing and describing the objects
  • real 2D map system accessible with TAB
  • (hopefully) better missions/tutorials timeline
  • presentation screen when new weapon is received
  • music (test ;) ) during the introduction cutscene
  • sound and music fading during load screens
  • chest opening animation
  • waterfall shader
  • both clicks available in the weapon selection menu
  • various HUD/GUI fixes
  • Linux and Mac versions


Controls

  • ZQSD or WASD: move the character. It's both AZERTY and QWERTY compatible
  • Space: jump and climb
  • Mouse move: move the camera
  • E: weapon selection menu
  • Left click: main weapon
  • Right click: secondary weapon
  • Tab: inventory/map/missions


Have fun! Peace!

January 13, 2014

Waterfalls and sleeping water

Hi there!

I will just write a quick article on this week's work: creating the appearance of waterfalls and water/lakes which are not the main sea.

The final look of waterfalls.

Indeed, I want a world with various (floating) islands and some waterfalls. Maybe you noticed it, but there is already water in the video game. I previously worked on the main sea of the world, and it wasn't that easy to set up a look that I found OK. I finally chose to have a purely reflective water. The big problem is that displaying the main sea is quite computationally expensive.

If I want to add other water planes (for example a lake on an island) or waterfalls, I can't use the exact same approach because it will seriously slow down the game. Plus, for a simple plane, computing the reflection is "quite" straight-forward, but for complex shapes (a waterfall), the computations are more difficult and the graphical pipeline of the GPU is not well suited for such a task. So I have to use a work around if I don't want to spend days developing an incredibly complex material that nobody will notice anyway.

I finally choose a combination of various classical techniques used in video game/real-time applications...


I - Environment(cube) map


An environment map is some kind of "spherical" texture (actually it's computed from the faces of a cube) that is applied on a mesh according to its normals. The idea is to "fake" the reflection of the environment on the object.

The environment map fakes a perfect reflection of the environment. This works well with a sphere, but it's less convincing with other mesh primitives.

Technically, it is possible to compute such a normal map in real-time to obtain a "true" reflection of the environment. However, as usual, this is quite GPU-heavy (you have to make 6 renders of the scene to create the real-time reflection texture). Furthermore, even with real-time computed reflections, the mapping itselft is still a fake one, which won't fool the careful viewer's eye.

Thus, I choose to use a pre-computed environment map: I simply use the cube map of the sky (see this post for more details).


II - Moving normal maps to create waves


Then, to break the perfect flatness of the water, I add 2 normal maps that moves at 2 different speeds. It creates a nice effect of moving waves. By the way, it's the same trick that is used to create the waves on the main sea material.

 The environment map with normal maps to simulate waves


III - Moving foam texture


This one is a simple classical moving texture added on top of the moving waves. To keep consistency with the rendering of the main sea, I use pure white for the foam, and I play with the alpha channel to modulate the visual impact.

The white foam above the water.


IV - Distortion of the foam texture


Because I want the foam not to be straight on this moving water, I add distortion to it by altering the texture coordinates with a noise texture (actually, this is the wave normal map with a different scale and speed).

Foam with distortion!


V - Day time aware material


The final step is to make the material reacting to the day time. Indeed, the sky/environment is evolving (there is a day/night cycle in the game) and I can't have a night reflection in full day, this totally breaks the visual integrity of the scene. So I need to carefully blend the day and night environment map of the sky according to the virtual time of the game.

Day reflection

 Noon reflection


VI - Tweaking and particles


The final difficulty is adjusting all the material parameters of this "fake" water, to match most closely the main sea water. Because the algorithms behind the rendering of these 2 water styles are different, it's strictly impossible, but I have to minimize the visual gap.

The main sea water material with real reflections.

The lake water material with fake reflections.

As you can see on the above screenshots, for lake and other "sleeping" water planes, the differences with the main sea water can be obvious according to the camera viewing direction. But for the moment, I can't do better.

Maybe, later, I'll modify the main water rendering shader to make it structurally closer to the fake water one, so that it can be easier to have a similar look (without losing real reflection on the main water of course). Or maybe I'll find anoter way to have real-time reflections on lakes too without hurting too much the GPU (I already tried... but failed... for now).

For waterfalls however, this fake water is quite OK, I guess because all waterfalls have the same material. By the way, I must add particles to create the splashing waters.

A waterfall with splashing water particles.

So, that's all for today! I hope this detailed water material post was interesting for you...

And, I didn't talk about it in this post, but I made a loooot of bug fixes thanks to all of you guys who tested the last demo. Thanks for your amazing feedback! I plan to release a new demo with lots of major fixes at the end of the week, so that new testers can find new bugs ;)

See you! Peace!