Welcome, Guest. Please login or register.

Login with username, password and session length

 
Advanced search

1411482 Posts in 69370 Topics- by 58426 Members - Latest Member: shelton786

April 24, 2024, 01:46:08 AM

Need hosting? Check out Digital Ocean
(more details in this thread)
TIGSource ForumsCommunityDevLogsThe Resurrection - A game about (re)building the past
Pages: 1 ... 6 7 [8] 9 10 ... 12
Print
Author Topic: The Resurrection - A game about (re)building the past  (Read 24710 times)
JobLeonard
Level 10
*****



View Profile
« Reply #140 on: February 13, 2020, 01:52:26 AM »

EDIT: quoted because pagination.
Sounds Like Design Questions

Pardon the long delay.  I had a devlog post about audio almost done, but then ran into a few things which wouldn’t take but a morning or two to solve, and then I would post it.  Three weeks later and here we are.

(This is a looong post.)

Happy Anniversary!!!
This devlog is one year old!  I began it back in February 2019 for so many reasons.  I’d been working on the game for a couple of years, but the devlog was a means to share progress as well as to record the process for myself.  Also, I deal with regular depression (yay!) and last February was pretty dark.  The devlog was one piece of my life-raft.  I’m happy to report that this February is much brighter and that the devlog continues to be a source of joy and inspiration.  Thanks, everyone!

I should post some now-and-then comparisons, but I don’t think there has been a lot of change to the visuals of the game.  There have been significant changes everywhere else, but, visually the tone has been pretty steady.


Left: This was the whole world one year ago.  Right: Now, this is just one site of four.

What’s been happening over the past month?

Save Systems Please
The save system is still slot-based.  I just made a few tweaks to it, but I want to experiment with a branching save system a-la Papers Please.  And I want each node in the branch to be a screenshot of the moment the player saved their progress.  I have no idea how to lay all of that out graphically and programmatically – and how to limit it (each save takes up quite a bit of space – because I’m inefficient).  But I think it’s a brilliant way to visualize saves and it fits thematically with the game.  Thanks, everyone, for the stimulating discussion!

Modelling Help
I’m so pleased to announce that Geoff Arnott has agreed to contribute to the 3d content.  Geoff and I have worked together for … gosh … thirteen years on 3d projects for heritage in the UK.  We worked in the same office and on the same projects at the University of York for ages.  He has been interested in the game for a while and has offered to donate some of his time and skill, just because he doesn’t get a chance to work on things like this very often.  Also, he’s a Romanist at heart (which I am not) and he jumped at the chance to build the Roman signal station for the island.  So, we now have four sites: the parish church, the signal station, the hermitage, and the little Roman temple tomb!


Geoff Arnott’s Roman signal station (WiP).  Think “light the beacons!”


All four sites.

Audio
So, I’ve jumped straight into audio work and that’s where most of my dev time has gone for the past month.  This is a new area for me and that really shows in terms of the current quality of the sounds themselves.  But, I’ve been learning, which is a huge motivator for me.  I’ve also been learning that there’s so much I just don’t know.  And that’s okay.  The audio source material, for now, is placeholder.  When I find some funding it’s going to be so exciting to turn this stuff over to someone who knows what they are doing.  Thank you, everyone, for the kind offers of help.  When I can pay you, you will hear from me.  I want to make sure I don’t ask people to work for free (except Geoff, who said he’d donate for now).

Source Material
I’m getting source material primarily from freesound, which is an amazing site.  You never know what you’ll find.  And, if you’re an audio engineer, you can build on it.  I am not an audio engineer.  Nevermind.  I’ve also recorded some noodling around on my out-of-tune 1905 Gramer upright.  So, I’ve also learned a bit about the art of recording (mainly by being not good at it).  We had the piano tuned after I made the recording, which prompted it to go quickly further out-of-tune.  If we ever get it back into tune, I’ll re-record all of the music so far.  It’s just placeholder anyway.

Audio Systems
If the audio source material has been a little frustrating, the audio systems themselves have been a joy.  I like making systems.  Also, John Leonard French’s gamedevbeginner has a treasure trove of clear, high quality, introductory tutorials and tips about audio in Unity.  I have learned a lot from him.



The audio is composed of four interlocking systems: Music, environment, sound effects, and drones.  They are governed by a metronome to time audio events.  The metronome can also be used to time non-audio events, too – which has a lot of potential.  The game has a kind of heartbeat.

The music and environment systems are uncomplicated.  They listen for in-game events, or Ticks from the metronome, and queue audio accordingly.  They will grow as needed in the future, but they’re robust and good enough for now. 

The sound effects system is a little more complex.  The main feature is that it manages a pool of audio sources which get sent out into the 3d locations of events in the world so that sound effects have some sense of sounding near or far to the player.  Also, I made a loop of collapsing debris sounds which plays continually, and the volume fades in and out whenever a portion of a building is rebuilt.  Because it’s looping, you never start in the same place of the loop twice, and this helps keep the sound from being too repetitive (ironically).  I hope.  Same thing for the twinkling sound when artifacts are uncovered.

Drones
Drones, however, are a different story.  They are what has delayed this post for three weeks.  I had this “Great Idea” to incorporate a background drone to help establish mood and a sense of liveliness in the world.  I was thinking about Dunkirk’s sound design.  I built a system that pitched a single looping drone sampled from my piano anywhere along three octaves.  The pitch was tied to player actions and to the overall “mood” of the world.  It literally set the tone of the game.

Drones are stupid-powerful things.  I am not qualified to use them.  They overpower everything else in the game, even when barely audible.  After two weeks of code and experimentation, I’ve turned off the drone system entirely.  At some point I might feel confident enough to turn the system back on – but they have to be used VERY sparingly.

Audio Leads to Design Questions
In which I struggle to convey how audio builds worlds in the player’s mind.
The other thing that has stalled this update was that the sound system led to questions about some key aspects of the overall design and feel of the game.  This is as it should be.  The biggest issue is that I want the player to feel – not always consciously – that their choices really do impact the world they are (re)building.  Audio, mainly music, is an important part of setting the game feeling.  Drones are great at setting a mood.  But, they’re overpowering (see above) and I don’t have the skills to handle them properly.  Also, not every action a user takes will affect the mood of the world – it would be unmanageable and meaningless if they all did.  This is a design question beyond audio alone.

This game has always shared the philosophy of meaningful user choice expressed in Kentucky Route Zero.  Choices are meaningful to the player, but they do not always result in branching the narrative.  Most games which ask the player to make a narrative choice strongly imply that choice means a player will miss content.  KR0 is less interested in branching systems populated by unique content than it is interested in the player’s connection to the story, forged through little choices that are meaningful to them, personally.  The Resurrection does have content that will be missed depending on player choices, but it doesn’t want that to be a source of tension or concern for the player.  This is the player’s (re)construction and it’s okay that not all content will be encountered.

The player’s expectations should be treated with care and respect.  So, I don’t necessarily want the player to be conscious of the impact of all of their decisions, but I do want them to be conscious that the feel of their playthrough is evolving as they play.  So, some of their choices affect an invisible “World Mood” score which in turn affects things like the pitch of a drone (if I ever turn that system back on), which fragment of music plays, the saturation of the background color, the character of the weather.

Trying to manage this balance through audio pushed me toward having the player affect world mood as early as possible.  In fact, their first official act in the game now affects mood.  Immediately after starting a new game, the player is presented with three words to describe the island they are about to explore.  There is no “wrong” choice.  But each choice has a subtle effect on the world mood, and, hopefully, on the player’s own feelings as they move into the game proper.  From the first moment, the player is shaping the world.  The fragment of music the player hears as they encounter the ruins for the first time is based on their choice of word on the opening screen.  Word selection moments will become familiar to the player, because a choice of three descriptive words will be presented each time they discover an artifact.  So, this starting screen serves as a tutorial as well.


What would you choose?

Conclusion
It looks like I have done quite a bit more over the past month than I thought.  I feel like I’m pushing steadily toward a vertical slice, playable demo.  And it also feels like I have the core design nailed down, and so have more of a structure for creating the rest of the island.  I’ve said this before, so it must be true.  Here’s to another year!

Thank you for reading!

What a nice read to start off my morning! Fun to see that our devlogs both have anniversaries at around the same time. Congratulations! Your update was quite a bit more detailed than mine, haha. Coffee

Can relate to the ups and down, and how working on something like this can be a very helpful thing there. Hope you're doing as okay as you can right now. <3

I'd be really interested to hear some of that audio stuff, even the drones that you ended up deciding against, just to hear what it was all about.

Cool to hear you've got some help on the game now! Hello, Geoff!! Gomez Your work looks great too!

I like those choices for starting a new game, and how they're so similar to each other. Does make it tricky to make a pick tho! Not sure what I'd choose.

Best of luck going further! Still so very excited about this. Kiss

Quote
each save takes up quite a bit of space – because I’m inefficient

Well, why not try avoiding reinventing the wheel?


- use a version control system to check in a "root save"
- figure out a way to serialize the game state data to some standard data format (for example, to JSON)
- apply version control tool to create a new save point

Loading:

- use version control system to check out the save point you want to load

The built-in diffing tool of the version control should compress the save point by only saving the differences. And branching saves comes for "free" because the version control tool has support for it.

Subversion has the Apache license, in case that is a concern. https://subversion.apache.org/
Logged
ChrisLSound
Level 1
*



View Profile WWW
« Reply #141 on: February 13, 2020, 02:20:43 PM »

Happy devlog anniversary! It's been a joy following along!

I love your ideas for the audio stuff. As soon as I read "world mood score", my mind immediately started swimming in thoughts of matching chords/musical fragments to subtle mood shifts. Sounds like such a fun challenge!

Huge fan of that descriptor choice concept.

I too am interested in hearing what you currently have for audio!

Really great and exciting stuff!
Logged

I make video/tabletop games and music!
amasinton
Level 1
*



View Profile
« Reply #142 on: February 14, 2020, 04:38:09 PM »

What a nice read to start off my morning! Fun to see that our devlogs both have anniversaries at around the same time. Congratulations! Your update was quite a bit more detailed than mine, haha. Coffee
When I read your post over on your dev log that reminded me that it was my anniversary, too!

Quote
Can relate to the ups and downs, and how working on something like this can be a very helpful thing there. Hope you're doing as okay as you can right now. <3
I'm doing so much better than I was a year ago - or even six months ago.  Thank you for asking and for your kind thoughts.

Quote
I'd be really interested to hear some of that audio stuff, even the drones that you ended up deciding against, just to hear what it was all about.
I'm hesitant to share - it's so amateur!  I suppose I'll have to when I release the demo.

Quote
Cool to hear you've got some help on the game now! Hello, Geoff!! Gomez Your work looks great too!
Geoff's great - and his perspective has already brought great things to the project.

Quote
I like those choices for starting a new game, and how they're so similar to each other. Does make it tricky to make a pick tho! Not sure what I'd choose.
The similarity is kind of the point here.  I want to emphasize that the player should choose between subtle shades of meaning rather than wider differences or even the sometimes polar decisions you're often presented with in other games.  It's about building player "ownership" through crafting feeling, here - which is what KR0 did so well, as I said.  Maybe this will work.

Thanks, as ever, for the encouragement!
Logged
amasinton
Level 1
*



View Profile
« Reply #143 on: February 28, 2020, 08:10:15 AM »

EDIT: quoted because pagination.
Thanks for doing the housekeeping (I think that's at least twice here!).

Quote
Well, why not try avoiding reinventing the wheel?


- use a version control system to check in a "root save"
- figure out a way to serialize the game state data to some standard data format (for example, to JSON)
- apply version control tool to create a new save point

Loading:

- use version control system to check out the save point you want to load

The built-in diffing tool of the version control should compress the save point by only saving the differences. And branching saves comes for "free" because the version control tool has support for it.

Subversion has the Apache license, in case that is a concern. https://subversion.apache.org/
This is an excellent suggestion.  One I've been thinking about quite a bit over the past couple of weeks.  It's a little out of my league right now, but I've been putting together some thoughts on how to do my own, dumb flavor of this (because I don't think anyone has created a version control system that works at runtime for Unity?Huh?  This is kind of a not-as-intended use case?).  But, I think I can do a form of version control, so that the saved game progres is split of an incremental series of files rather than duplicating itself and adding to it every time there is a save. 

This is relevant to some strategies I've been putting together for streaming in assets when they're needed.  The streaming system is the last big game system that needs to be built.  I've been writing the other systems with streaming in chunks of the world as needed in mind,  but I haven't put together the system itself.  This seems like a very big jog and one that's right on the edge of my coding/architecture skills.  I won't turn my attention to that task until after I get a demo produced.  But it seems like the streaming system, which also has to keep track of the state of chunks of the world, has some similar concepts to some kind of save/load versioning system, too.  I'll work on them together.

Thank you!
Logged
amasinton
Level 1
*



View Profile
« Reply #144 on: February 28, 2020, 08:57:51 AM »

Happy devlog anniversary! It's been a joy following along!

I love your ideas for the audio stuff. As soon as I read "world mood score", my mind immediately started swimming in thoughts of matching chords/musical fragments to subtle mood shifts. Sounds like such a fun challenge!

Huge fan of that descriptor choice concept.

I too am interested in hearing what you currently have for audio!

Really great and exciting stuff!
Thank you!

Hah!  "World mood score" could mean a musical score and not just a numeric score - nice - I hadn't noticed that!  The numeric score and the score of the soundtrack are linked - so, it does double-duty.  You are absolutely spot-on in terms of what is intended for the music and the world mood.  Subtle shifts, just fragments of music (very BoTW, I know).  All very ambient, and the shading of that ambience is driven by the world mood which is driven by player choice of descriptors for artifacts.  That's the idea, anyway!

The audio I currently have really should be re-done.  The music I recorded moves too quickly, has too much melody, too much of a through-line in terms of concept.  I didn't really understand what was needed until I put the "wrong" thing in.  So, now I've been working on some lighter, more "ambient" musical fragments.  The problem is, they need to be recorded and my old piano did not like being tuned recently.  It's lots its tune so badly now that I can hardly stand to play it.  So, I've got to get it re-tuned, and then I can re-record.  I've been learning a lot!

Logged
amasinton
Level 1
*



View Profile
« Reply #145 on: March 13, 2020, 05:54:59 PM »

The Root of All Evil
(Premature Optimization)

(** An aside:  I wrote this post a week ago, but waited to post until I had some video of the two rebuilding effects ready – and, wouldn’t you know it, I discovered some bugs, so I had to fix those and then one thing lead to another and now it’s a week later.  It has also been really hard to concentrate over the past couple of days.  I run a rural public library for my day job and these are distractingly hard days just now for public services… **)


I like this so much I might make it cover art!

After last month’s post I jumped right off the roadmap and straight into optimization!  Premature optimization, so they say, is the root of all evil.  But what’s a dev to do?  We’re not quite at a demo yet, so we’re certainly not at any kind of maturity.  But it has been taking up to a minute to enter play mode in the editor.  Something needs optimization somewhere.  I didn’t intend to end up doing optimization for a month, though.

Let’s update to 2019.3!
Because development is still in a fairly fluid state, I have always updated the project to the latest major version of Unity within a few months of that version becoming available.  I know you’re not really supposed to do this with an active project, but I always figure I should try to use the latest version to take advantage of new features and bug fixes and to stay current.  For the past few years that has never been a problem.  

It seems like the project is far less fluid than I thought.  Also, Unity 2019.3 is a very different creature from 2019.2.

We’ll come back to this in a later post…

The low-hanging fruit
I knew the project was starting to slow down.  My code and my designs tend to be … let’s say, baroque … meaning, eventually, all of that burden of unnecessary crust is going to become overwhelming.  I don’t really know how to be more elegant.  But, I knew I was building up future debt.

I began picking the low-hanging fruit.  In Unity, a game is slow to enter play mode, or to load a scene, when it has to run Awake() and Start() on a lot of objects.  This game has thousands of objects with multiple scripts, all of which initialize themselves in Awake() and Start().  There are a handful of cross-references that need to be setup at runtime, but also, I don’t like dragging-and-dropping references in the inspector at design-time so I have the scripts do as much component fetching and setting as possible at startup.  I know this is slow, but it’s only at startup and I could live with that.  Except that now it turns out that I can’t – waiting 30-60 seconds every time I press play just to test changes was a pain.

I built an editor script to bake the work I was doing in Awake() and Start() in the editor.  But, this system was just a concept, it required some more crust on existing scripts, and I had to keep moving forward.  So, I just left it all as a stub and did more interesting things.

And then I did the upgrade to 2019.3.  Oh boy, the changes in 2019.3 compounded with my weighty systems showed me quite clearly that I needed to optimize.  Also, I should probably not use 2019.3 for now.

A downgrade to 2019.2 and a week implementing the editor-based Awake() and Start() baking and I’m happy to say that the game enters play mode in around 10-15 seconds (down from 30-60).  Just with that one weird trick.

But there’s plenty of other low-hanging fruit.

Surely there’s a shader for that?
One juicy bite is the fact that there’s thousands of GameObjects in just this one scene (the parish church).  Each fragment of a wall or voussoir of an arch is its own GameObject.  It’s so satisfying to see the pieces of a broken thing magically rebuild themselves.  But, it seems to me that each piece has to be its own GO if I am going to apply different translation and rotation and timing to each during the build effect.  Someone clever, someone like Phi Dinh or James Vincent Marshall, could do it using a single GO.  I haven’t attained their levels of mastery.  Sigh.

Luckily, Saint Keijiro Takahashi is a wizard and he likes to share.  Three years ago he created a system for skinned meshes which allowed their polygons to be broken up, offset, and scaled individually no matter where the mesh’s pivot point was located.  And the effect could be influenced by each polygon’s position in local space over time.  Super clever!  Here it is:  Keijiro’s Skinned Vertex Modifier.

So, I spent a week two weeks testing the system on my own meshes and adapting Keijiro’s shader into an Amplify Shader Editor version where I can tinker to my heart’s desire.  There’s some black magic in preparing the meshes (something about bitangents and centroids – I understand the principles but not the practice).  It’s an absolute gift.




Keijiro’s system (using his brilliant demo scene camera and environment) on my meshes.  The checkered mesh uses Keijiro’s shader and the plain-colored mesh uses my Amplify Shader Editor version of it.

It’s not ideal in every situation, but, if used in combination with the old system which uses a separate GO for each piece of rubble, I think I can get rid of thousands of GOs and lighten the load for the game.  It took another week to get Keijiro’s shader playing nicely with the rest of the project.  It needed to use vertex colors for object color (there are no textures), it needed to be combined with vertex displacement, and it needed to discard fragments based on the bounds of a box in world space.  Finally, it needed to be integrated into my rebuild systems so that the systems could handle either the old, hundreds of GOs way, or the new shader-based rebuild, or both.  And that took me a little while.




The original rebuild system which uses separate GameObjects for each fragment.




The new, hybrid system which uses separate GameObjects for some objects (the orders of the arch) and Keijiro’s shader for the block of wall over the arch.

(I think I really need to work on timing – but that’s polish and that’s for a different day.)

Meshes and memory
The final piece of low-hanging optimization fruit is mesh memory.  The game is mesh-heavy because of the need to have building blocks in little fragments and there are no textures to fake detail (I don’t like to texture models, I like geometry).  The shaders I have created rely heavily on vertex colors and UVs (to drive special effects like dither-fades and motion in vegetation).  Because I change these at runtime, especially for fx, all of the meshes are marked as Read/Write.  This means that all of the data for every mesh is loaded in memory when the game loads.  Ouch!

So, now I’m considering a system that turns toggles the Read/Write property of the meshes in the editor when I need to do vertex-level edits such as setting vertex colors, but that locks these meshes into Read Only at runtime.  For the dither-fade fx I think I’ll gather all of the objects that need to fade and swap in a dedicated material that drives the fade effect via a global shader variable, rather than altering every UV of every mesh.  When the fade is done, I’ll swap the materials back to the normal one that just uses vertex color.  I’ll try to never need to change vertex color at runtime.  For the swaying vegetation, though, I might have to stick with the Read/Write enabled meshes.  We’ll see.

Conclusion
So, back to the roadmap toward a demo, and we’re back to the content itself (yay!).  There are several periods to build for the Parish Church (it’s an old building).  These need to be imported and setup and then, maybe, maybe, we’ll have something like a demo?!...

(** Another aside:  For ... reasons ...  sometimes I really hate living in a small town where everyone thinks they know your business! **)
« Last Edit: March 13, 2020, 06:03:02 PM by amasinton » Logged
JobLeonard
Level 10
*****



View Profile
« Reply #146 on: March 14, 2020, 03:03:11 AM »

That doesn't sound like premature optimization, that sounds like paying off your technical debt...
Logged
oahda
Level 10
*****



View Profile
« Reply #147 on: March 14, 2020, 07:13:48 AM »

Nice work! Getting prettier by the day. Kiss Yay for people sharing cool stuff!

Also I see your Pink Floyd reference. Ninja
Logged

nova++
Level 4
****


Real life space alien (not fake)


View Profile
« Reply #148 on: March 14, 2020, 09:05:46 AM »

That doesn't sound like premature optimization, that sounds like paying off your technical debt...

Yeah. A lot of time "premature optimization" gets conflated with thinking about performant code in the first place, and leads to a lot of heartbreak down the road...
Logged

JobLeonard
Level 10
*****



View Profile
« Reply #149 on: March 14, 2020, 11:50:20 AM »

Well, better to deal with it now before you can't pay the interest rates any more Wink
Logged
amasinton
Level 1
*



View Profile
« Reply #150 on: April 12, 2020, 07:22:52 PM »

Easter 2020 – A Reflection

It’s Easter.  There’s a fresh blanket of snow on the ground.  Evening has drawn down into night.  Time for a little reflection.


Happy Easter!

In the Beginning …
Recently, I was digging through my files and I realized that I had first begun working on what would become The Resurrection three years ago.  At that time I was in the final year of a career that I loved very much, but in circumstances (some, of my own making) that made it very hard to continue working.  Every day I was engaged in creative work drawing on my unique experience and working with some of the most interesting people and places I know.  I was creating art but not Art and I deeply wanted to be a bit more expressive.


The ruins of St Mary's Abbey, York.  My office used to be on the grounds of these ruins - I walked through them every day.  Lovely place to work!  (Image: Wikimedia Commons

I remembered the ruins of St Mary’s Abbey, York and the thousands of carved architectural fragments that littered the grounds of Museum Gardens.  I used to walk through the Gardens, around the ruins, and imagine all of those fragments rising into the air, shaking off the dirt, and reassembling themselves into the buildings of one of the most impressive monasteries of medieval England.

I thought that might be fun to try to illustrate.  It might even be fun to play.

Because no one was going to support this I knew it was going to take a while.  I was not wrong!

What’s in a name?
As a practicing Christian, I have been fascinated by Christian mythology for years.  I especially like the ways in which this body of mythology is expressed in Japanese games.  There’s a reverent irreverence which I find inspiring – and a fresh point-of-view which is fascinating.  This mythology finds its way into western games either superficially or treated with so much reverence that it overwhelms the game itself.  I have no interest in making a Christian game, but I have an abiding interest in making a game in which Christian mythology is part of its deep fabric.  And I was also inspired by the work of Renaissance artists who’s bread-and-butter was commissions for churches.  How would a new medium – like games – translate into church commissions in the Renaissance tradition?  And also, I wanted to create a little devotion, a little meditation.

The idea of a triptych came to mind.  I adore medieval and Renaissance altar pieces, with their moving panels interactively telling the stories and mythology of their faith, reconfigured season by season, for public use or private reflection.  Tale of Tales had recently announced their Cathedral in the Clouds.  I was going to make a digital altar piece, too.

A triptych is a three-paneled altar piece.  It can be monumental, or it can be personal and portable.  The panels fold up, with different scenes painted on both sides, the subjects fitting a theme.  The theme itself is not always a linear story (sound familiar?), it could be based on the life of a saint, or a Biblical character, or a concept such as mercy or sin.  The panels are opened and closed in different configurations at different times of the year to tie the art in with the worship in with the space of the church or of the owner’s own home.


A small triptych used for personal devotion.  Italian, 14th century.  (Image: The Walters Art Museum.  Go check out alternate views of this object, included ones of the piece folded up!)

I was going to make a triptych of games, each standalone, but each part of a wider theme.  In this case, it was going to be the history of Salvation, which is the history of the universe.  From beginning to end.  Like the great East Window of York Minster.  Often, the titles of each panel of an altarpiece are derived from the standard subject matter they portray (The Passion, The Deposition, St Anthony in the Wilderness, etc.).  My triptych would portray Creation, The Crucifixion, and The Resurrection.  And I would begin at the end, which is, in itself a new beginning.  Easter.

Logos
The logo for the game is an empty tomb.  In medieval Western art, Christ’s tomb is commonly shown as a stone coffin – a form which would have been instantly familiar to everyone.  By using a medieval form rather than the historically-accurate Romano-Judean rock-cut cave/tomb, artists gave the story they were telling immediate relevance to the viewer.  A hook to hang the viewer’s own experience on.  A way to help them enter into the story.  

In medieval and Renaissance depictions of Christ’s resurrection, he is shown stepping from one of these medieval coffins, the lid (instead of a big, round stone) off to one side, the Roman soldiers (in the finest medieval armor) asleep.  Christ is victorious – banner waving, arm often extended skyward.


The Resurrection - c1440, French - from Sept articles de la foy by Jean de Meun, Royal 19 A XXII, f. 16.  (Image: Copyright British Library here)

In the logo, I have woven medieval Roman Catholic and modern American Protestant expressions of this story together.  The tomb is a medieval form, the lid to one side, but Christ himself is not depicted.  Protestant tradition places emphasis on the tomb without Christ.  In both traditions the empty tomb is environmental storytelling.  The tomb is empty – that’s the important thing to take away from the image.

Work continues
So, that’s the story behind the game’s origins, its title, and its logo.  The game is about many, many things, and, ultimately, it will be about whatever you, the player, takes away from it.  It is a story you tell.  If you are of any faith or none at all, I hope you find something here.  And, happy Easter!

PS
There has been a lot of progress on the game.  For reasons outside the game itself I’ve not posted anything for a month.  A vertical slice demo seems close!
« Last Edit: May 25, 2020, 09:19:03 AM by amasinton » Logged
Mark Mayers
Level 10
*****



View Profile WWW
« Reply #151 on: May 07, 2020, 12:44:18 PM »

I think I've mentioned this before, but this is really great work and I enjoy reading this DevLog Toast Right
Logged

Desolus Twitter: @DesolusDev Website: http://www.desolus.com DevLog: On TIG!
amasinton
Level 1
*



View Profile
« Reply #152 on: May 22, 2020, 09:29:59 PM »

Content, Content, Content (Part I) – Shaders and Code


It’s a remarkable historical moment; an illustration of just how fast human society and culture, people’s long-worn traditions and beliefs, can change.  As an archaeologist, I feel like I’m living through one of those periods that we only glimpse in layers of ash and pieces of bone.

You’d also think that this would have been a fantastic opportunity to make unprecedented progress on The Resurrection.  Although I have been at my day job every day all day during the closure (the only staff member to do so - paperwork never stops), I’ve still managed to make headway on the game, too.

So much so, in fact, that I’m going to have to split this devlog into several installments.  They will cover shaders and code, art, and design.

Shaders
Water.  Water!  So, the game takes place on an island (what indie game doesn’t?) and that means water.  In fact, it means at least two kinds of water: ocean and freshwater.  Last year at one point toon water shaders were all the rage.  Everyone was making them, inspired, I think, by Erik Roystan Ross’ excellent toon water shader tutorial.  And also, very probably, the amazing Harry Alisavakis’ tutorials and compilations over on Technically Art (an amazing resource and all-round good guy – currently serving in the Greek army!)

The Resurrection has some special requirements when it comes to shaders.  Most of them need to be able to use vertex colors for albedo and to clip geometry based on a bounding volume while also doing whatever special thing they might be made for.  And they need to be a shader graph using Amplify Shader Editor (because I don’t talk shader so much).  I wish I didn’t need the crutch, but, there you are. 

I was able to adapt Keijiro’s amazing polygon shattering shader in ASE to handle vertex colors and clipping.  I thought I could do it for Roystan’s toon water shader, too.  In the end I got about halfway.  It works in ASE (mostly) but it doesn’t clip and it doesn’t use vertex colors.  The vertex colors aren’t such a big deal, but I really would like to figure out how to make it clip.  I don’t think that will ever happen, though because of whatever it does with the depth buffer while not writing itself to that buffer makes it impossible to then also do the clipping.  I dunno.  Still, it looks good for my little pond scene in-game, and that’s very satisfying.


A little tarn, 11,000 years ago.

Now, what about an ocean shader?  It really really does need to clip.

I’ve also bought a couple of off-the-peg shader solutions: Amplify Impostors and GPU Instancer.  They’re like magic and they make me very happy.  So far, the Impostors work well enough for things at a distance (exactly what they’re for) and GPUI is a tool I will put to work in other special cases – like the cutscenes.  Like the toon water shader, all of these tools need to play nicely with each other, and with the overall visual design of the game.


50k trees rendered at 30fps on a MacBook Pro with integrated graphics.

Code
There are a few small but fun additions.  The most fun is something that controls the visibility of objects that don’t need to clip, but do need to only be visible within the bounds of the clipping volume.  It just does a simple bounds check and turns the mesh renderers on and off but it does it with a quick little scaling tween which is kind of fun to watch.  I noticed that grass in AC Odyssey scales up rather than fades in and I liked it as an alternative to alpha fading or dithering.  (I also adjusted the camera navigation a bit to slow down when the user is zoomed in.)




Plants scaling in and out as they enter and leave the clipping volume.

The other thing I built was an editor script which reads in text files containing the PSR of objects and spawns the appropriate prefabs in their places.  This dovetails with GPUI which is able to replace in-scene prefabs at runtime with GPU instanced versions.  Perhaps eventually I’ll be able to take advantage of that asset’s power.  It’s also a nice bridge between my preferred modeling package (Cinema 4D) and Unity.  I’m more comfortable doing object placement across landscapes in C4D than I am using in-Unity tools (I’m not working with Unity’s terrain system, for example), and this is really helpful.

Addressables…
The game is a dialogue tree.  But instead of words, it uses buildings and objects.  That means there’s a lot of content, and a lot of content that depends on player choice.  This seems exciting from a design and experience perspective but poses problems from an optimization point-of-view.  How do I structure the game so that I minimize the number of individual assets loaded into memory when many situations in the game require a pool of possibilities?

My mind keeps going back to the question of where Optimus Prime’s trailer goes when he transforms into a robot in the original cartoon series.  There was an online debate, back in the mid-90s in some BBS somewhere, about the physics of mass in Transformers.  This was exemplified by Optimus’ trailer which would just kind of scale away to nothing when he transformed.  This happened for their weapons too, especially in the early (first?) episode where Optimus and Megatron fought using energy weapons on a dam.  Someone in the discussion suggested that Cybertronian technology had discovered a way to give each transformer a cubbyhole in subspace where they could store their stuff.  It didn’t exist until they needed it, and then they could just reach into their cubby and get their gun, or their light-battleaxe, or their trailer or whatever.


Where’d you get that axe, Optimus? (Image from tfwiki.net. Copyright Sunbow Productions, Marvel Productions, and Hasbro.)

I want a subspace cubby for pieces of my game.

Apparently, that might be what Addressables are for?  They’re supposed to allow you to asynchronously load objects in a memory-efficient way just when you need them and then get rid of them when you’re done.  I like this idea a lot.  It’s kind of a link in the Unity DOTS chain and, like so many DOTS things, it’s poorly documented and liable to project-breaking changes.  Ruben Torres Bonet might have gotten to me with his cheerful envangelism of this feature…

Also, this will help with the world streaming and LOD systems I have yet to craft (because I’m not certain about the rules of time travel - still!!!).

Next time
And this lead us on to progress in the content and therefore art of the game.  The landscape is composed of 20m “tiles” and I’m currently weighing the advantages of whether to simply parent everything on a landscape tile to the tile itself and just stream in the lot when needed, or whether the base streaming unit of the game should be entire areas, like the church area everyone is so tired of seeing by now.  Should the game art be organized strictly by location or by content?  Both.  Probably both.

So, next time, I’ll go over some of that art what it has revealed about the story of the island.  There’s 11,000+ years to cover…
Logged
oahda
Level 10
*****



View Profile
« Reply #153 on: May 23, 2020, 06:27:14 AM »

Yay, new updates! Kiss

The backstory of how you would watch those buildings IRL and think about them coming back together as the inspiration for actually making it happen in a game is really cool.

So do the shaders! I wonder if you can't just do some simple world-space cube volume check and discard the fragments outside, without getting into depth buffers and stuff? That's how the bubbles work in my game at least.

The scaling looks really neat. All this instancing and so on… Looks like this world is going to be a lot bigger than I thought? And that huge scale of time as well‽ Can't wait to see more and learn how this is all going to work! Shocked
« Last Edit: May 23, 2020, 07:03:00 AM by Prinsessa » Logged

ChrisLSound
Level 1
*



View Profile WWW
« Reply #154 on: May 25, 2020, 07:19:05 AM »

Great to see these updates! Can't wait to see what's coming in the other installments.
Hope you and your people are healthy and safe Smiley
Logged

I make video/tabletop games and music!
amasinton
Level 1
*



View Profile
« Reply #155 on: May 25, 2020, 08:30:11 AM »

I think I've mentioned this before, but this is really great work and I enjoy reading this DevLog Toast Right

Thank you, Mark!   Grin

I've been a huge fan of your devlog here and of Desolus - I've followed it for a while now.  It was one of the things that inspired me to start a devlog, too. 

The fact that you built your own render pipeline in Unity from the ground up is amazing.  I don't have that level of technical ability (wish I did, sometimes), but I really, really appreciated your posts on that process - I guess I should probably be saying this over on your actual devlog.

(Also, I'm enjoying Manifold Garden - which you worked on, too, I think!?)

Thanks again!
Logged
amasinton
Level 1
*



View Profile
« Reply #156 on: May 25, 2020, 08:34:07 AM »

That doesn't sound like premature optimization, that sounds like paying off your technical debt...

Yeah. A lot of time "premature optimization" gets conflated with thinking about performant code in the first place, and leads to a lot of heartbreak down the road...

I know!  I'm doing my best on performant code, learning all the time.  But, when I start into a new part of the project, I also start creating systems where I build in way too much "flexibility" and too many "features" which I'll never use and which only cause trouble later on.

"Why does changing the color of the grass cause the sun to move backwards?" - Those sorts of head-scratchers which suck up a lot of time later.
Logged
amasinton
Level 1
*



View Profile
« Reply #157 on: May 25, 2020, 08:37:05 AM »

Well, better to deal with it now before you can't pay the interest rates any more Wink

Starting to feel that now! I'm just about to embark on designing a world streaming system.  It seems like such a shiny new toy - I'm sure its' worth it taking out a big technical loan ...

Logged
amasinton
Level 1
*



View Profile
« Reply #158 on: May 25, 2020, 08:47:33 AM »

I wonder if you can't just do some simple world-space cube volume check and discard the fragments outside, without getting into depth buffers and stuff? That's how the bubbles work in my game at least.

That's what I'm doing - checking against a Vector4 representing the bounds of a cubic "clipping" volume and discarding fragments that fall outside.  I didn't think that meant I was dealing with depth buffers.  But when I port the volume/bounds-checking "code" (bear in mind I'm working in Amplify Shader Editor, because I'm just not that great with actual shader code) over to the toon water shader, it just doesn't clip.  The only think I can see that would be causing trouble would be the depth stuff in the water shader that does all of that lovely gradient depth - faking stuff.  The camera depth node in ASE is a bit of a black box to me, so I'm not sure what's really going on there.  It's not a big issue, though, as this toon water shader will get relatively minimal use overall.

Quote
The scaling looks really neat. All this instancing and so on… Looks like this world is going to be a lot bigger than I thought? And that huge scale of time as well‽ Can't wait to see more and learn how this is all going to work! Shocked

(Glad you like the scaling!  I thought it looked cute - but not so cute that it broke the art style overall.)

You and me both!  I'm getting a better and better handle on all of the moving parts here.  I can even explain it at a high level pretty simply - which I take is a good sign.  When I used to supervise MA and PhD students I used to tell them to strive to put their theses into something you could print on a T-shirt or a bumper sticker.  If they could do that, I felt they had a good understanding of their research.  I'm getting to that point on this one, too.

Rereading my previous update post, though, I notice that I said the world was made of "20m tiles".  I realize now that that looks like "twenty million tiles"!!!   Shocked  That's supposed to read "twenty meter tiles". As in chunks of ground that are 20 x 20 meters square.  The church scene has 20 of those 20m tiles.  I suppose the whole island might have 500+ eventually?  In the update post I have planned for the end of this week you'll see that I'm aware that this might be an unmanageable amount and am thinking about ways to get that under control!

Scope!  It's fun.
Logged
oahda
Level 10
*****



View Profile
« Reply #159 on: May 25, 2020, 11:19:35 AM »

Oh, I didn't even consider the possibility of it meaning anything other than meters haha
Logged

Pages: 1 ... 6 7 [8] 9 10 ... 12
Print
Jump to:  

Theme orange-lt created by panic