I swear this is a tutorial just bare with me

+ some unorganized thoughts on playing videogames as a kid.

----~~oOo~~----

When I was a kid, my neighbor and I had a Playstation. It was 98 or 99 when my dad came home with a unique game based on whatever criteria he felt I'd appreciate. I grew up playing his copy of Mega Bomberman, so I was vaguely familiar with this character, but here it seems he was driving a sickly kangaroo. Something was going on, and it was cool as hell.

With the discerning and highly critical taste of a 9 year old american boy, I cautiously gave "Bomberman Fantasy Race" a shot.

Bomberman Fantasy Race, North American cover, 1998

And I fell in love with it.

Part drunk driving animals at the zoo simulator, part ADHD stimulating directed energy weapon, Bomberman Fantasy Race had everything a malleable adolescent boy brain desired: Bright! Colorful! Loud! Japanese! Recently, one of my closest friends visited Kyoto and accomplished something I'd never been able to achieve in all my visits to Japan; he found a pristine complete original copy! And he gave it to me!

I was bricked up, man.

Just admit you're impressed and let's get this over with.

Just taking a moment to flex my latest save. Ladies? Ladies where are you going

The gameplay was secondary, to be honest. I was at the age that videogames were more than just a checklist of items to accomplish. I spent most of my time gaming just walking around the levels; investigating little corners of maps, admiring colors, textures, characters, etc. My neighbor and I would play house essentially, visiting different levels and pretending we were living in them, running banal errands between winning a race or saving the world. Fantasy Race quickly became a favorite - colorful and exciting level design, cute animals, bizarre weaponry, and a fantastic soundtrack that would go on to inspire a lot of my musical inclinations well into adulthood. Fun fact, my song Unlimited Fantasy samples a lot of this game.

I imagine modern games provide a much higher-def version of this kind of play time for kids now, but I have to think that there was something about the lofi qualities of early polygonal and sprite-based games that helped engage the imagination. There was no 'day / night cycle' - if I wanted to visit level 2 at night, I just had to sit there and rainman it. Chances are I'm just getting older and I'm nostalgic, but regardless, this is a pastime and capability that leaves us behind fairly young, I think. We grow up, we learn how to play "for real", and games quickly become a social tool, or escapist crutch, or something right in-between. The childlike wonder in which we navigate the virtual world and play pretend evaporates around the same time we stop playing with toys, or using our imaginations as vividly in our day to day lives.

Still, I find myself stopping to admire these scenes when I get the chance, in a much different capacity for certain. I'm now a tourist going down memory lane, stopping into all these intangible little nooks, instead of "guy riding my green kangaroo to get groceries" or whatever I was pretending back then. That's why I'm writing this now - I'm currently recovering from a medical procedure, so I thought:

"Why not go back for a moment? Why not try to recapture some of that imagination?

Let's make a diorama.

What I want to do is take a little corner of one of these worlds, and I want to turn it into a diorrama / wallpaper / 3D space that I can explore like I did when I was a kid. Now, unfortunately, I'm not able to recapture any childlike joy, or whimsy, or general happiness, but I CAN capture raw data. Even more specifically, I can lean on a series of people much smarter than me to make it easy.

The first problem - "How do we capture 3D geometry and texture data from a game in a way that's usable for our needs?"

If you've parsed through data before, you are already aware that most of the time it's encrypted, or not written in a way that humans are able to understand. We unfortunately can't just insert our disc, go to a "models" folder, find the corresponding textures, and pop that shit into our computers and hit render. No, we've gotta go a little bit deeper. So let's go!

Step 1: Acquire game data.

First things first, we need to dump the ROM. Now, this post isn't a tutorial on dumping ROMs, and this definitelyisn't a tutorial on utilizing google search to find plentiful archives of usable ROMs for nearly every game in existence, easily downloadable at just the click of a mouse for your use in following along with this tutorial or just your entertainment in general, so let's move on.

Step 2: The 3D 'Screenshot'

Thanks to a longstanding series of brilliant individuals, we have a few really amazing capabilities available for free. In this particular case, I'm going to lean on the work of stenzek and scurest, the authors of the incredible PS1 emulator DuckStation and it's 3D Screenshot plugin, respectively. Loading my ROM into DuckStation, I navigated to the first area that comes to mind when I think of this project - Bombercoaster Lake.

It's so weird to think how much time I spent here. I guess it reminded me of Kennywood, the theme park near where I grew up.

I waited for the right time to capture my image (when the looping rollercoaster in the background hit it's apex), and pressed 'capture'. You can grab multiple frames in a row as well, which we'll explore in another post someday. This immediately processed an OBJ, an MTL, and several texture images in a newly created 'screenshots_3d' folder.

Check that shit out! Wow.

Step 3: Importing the Data

Now the (surprisingly) easy part - that MTL file holds the key to all of the proper texture assignments for the OBJ, so we simply import this into Blender (or whatever 3D software you're using, in this case I'm using Blender so translate as you must) and then..

Grayscale modern art lookin ass

Well... If you're not familiar with 3D software, this might feel like a failure. "What the hell is this?" you say, before packing up a mysterious white powder and mailing it to me in a fit of rage. Hold on, friend - a quick and simple fix gets us exactly where we want to be. The entire mesh here is imported in as a SINGULAR object, so you can either:

1. Scale this object down by clicking on it, pressing S on your keyboard, and then wiping your mouse around your desk like a chimp.

2. Open up your 'View' menu on the right hand side and change your 'Clip End' distance to something ridiculously high.

Whichever path you take, you should be able to see the full object now. Next, to see if your textures have assigned correctly, you can enable 'Viewport Shading' in the top right corner, and it should suddenly look a little something like this:

It's just like I remember! Sort of.. I mean, isn't it weird how so few triangles and some compressed 16x16 images can completely alter your worldview? Art is incredible, man.

Step 4: Fix er' up.

Wow! That's almost something! However, this is missing a certain quality... Nostalgia goggles, perhaps? Seeing these as simple pieces of geometry with some JPGs plastered all over it certainly doesn't make me feel whimsical, after all. If anything, what little childhood wonder still remained was just stamped out unceremoniously, seeing beyond the veil of the flimsy construction I'd based so many happy memories. But not for long! Let's fix that and resuscitate the little guy.

First things first, let's tidy this up a bit. As you can see between the in-game capture above and the data capture here, there's a few things that weren't processed quite right. That's okay, that just means it's up to us to fill in the blanks!

Now, since this is all one solid mesh, we can click Tab to enter 'Edit Mode', press A to select all, then press P to seParate by Loose Parts. However! In the particular case of floor geometry, you may want to deselect those polygons before separation: separating those from eachother usually highlights the differences between the close-to-camera and farther-from-camera geometry, giving you lots of shitty looking issues with lighting and what not. I went ahead and kept the floor all one solid piece, while separating out all of the buildings and background elements. Luckily, since this is all fairly low poly, it shouldn't take more than a few moments to make those selections.

Cool septadecohedron, man.

I took some creative liberties here, filling in some of the false memories I didn't realize I had until I saw the game again, such as the big top tent being to the right of the rollercoaster instead of where it actually is, further down the track. Basically, I just wanted to make this look pretty and a bit more like it does in my head. Once I got that all situated, I ran into another unique issue that you'll find in a lot of these older games - Where is the fucking sky?

How games usually handle the sky is through aptly named Skyboxes, large dome-like geometry that either encapsulates the level or rotates against the player camera. In this particular capture, I found I didn't have shit. That's okay though, because thanks to Lab 313 at the ROMHacking forums, we have Tim2View, a utility for extracting, viewing, and exporting TIM files (IE Playstation texture files). Simply load up your ROM and start parsing!

I always thought this Potato Knight character was interesting. He's in the Amusement park map specifically, but has this medieval decorum about him? I guess there is a strange floating cathedral in this map, too. Maybe Bomberland is similar to Europe, with a rich culturual heritage permeating modern architecture and habits in regular daily life.

I combed through and eventually pulled up a hilariously small file that represented my skybox. Loading that onto a hastily constructed dome I placed over my full model, I got the sky back in place. However, we ran into another unique issue that I'm sure you'll find as well..

What the FUCK is going on here! My lord! My lord!

Step 5: Why are some things textured and others aren't? I'm scared.

Calm down, it has to do with the Playstation architecture and not your inability to handle small amounts of stress. Now if you'll entertain me for a second, let me put on my virginal coating and poorly explain what's going on here 🤓

The original Playstation does not render 3D. I know, I know. The CPU can function in 3D gridspace, but for rendering on screen, it uses 2D triangles stacked on top of eachother in a very confined space. Have you noticed when you're playing any '3D' game on this console, you're constantly getting warbles, tears, and general shakiness out of all of the geometry and textures, especially those close to camera, or during rotations? Those 2D triangles cannot intersect because they stack on one another, and do not exist in any 3D space. Sometimes they stack incorrectly, which is the main culrpit behind clipping, items blinking in and out of reality on any given frame, or being able to see through walls and characters occasionally. Looking at any of these triangles from angles other than directly head on forces the texture to wrap unnaturally, trying to force perspective in one direction while you're viewing it from another. Additionally, the PS1 did not have sub-pixel accuracy in it's polygonal rendering; it rounds up to the nearest whole integer when rendering, causing geometry to 'snap' into place, giving that very distinct geometry and texture 'swimming' effect we've all come to identify with the era.

Because of this, not every single item we grab is going to have a texture associated with it. Check out the Louie and Rollercoaster Train above - this has no associated textures, yet in game we can see that they are colored. For a myriad of reasons (excessive movement, saving memory / space, details deemed uncessecary, etc), some objects won't be textured utilizing images, and instead will be vertex shaded. This means the color data for these specific objects was added during rendering operations to the vertex data directly, so there's nothing we can pull using this screenshot method.

That is all okay though, because remember, we are living in the future and using 3D software already - we can fill in the objects by applying simple color-only shaders to the polygons directly, as I did with the rollercoaster. Now, with all that out of the way, we can position our camera where we'd like, then click on View > Viewport Render Image, and Voila!

'It's like a distant memory of a dream' - Sora, Kingdom Heart

In a matter of minutes, we're able to put together a render of any of our old favorite virtual environments. The amount of time I spent exploring this tiny imaginary theme park back in the day would surely shock me now, but here I can utilize its digital grounds for anything - making images like this, using it as sets for 3D animations, taking the textures for any number of artistic projects, you name it - virtual skies the limit. Which got me thinking..

Step 6: Above and beyond, baby

Since this already exists within our 3D software of choice, we can quickly switch over to a modern rendering method and remake the scene however we see fit: some fresh lights, emission shaders, volumetrics, and bang! We can see this theme park how it would look early in the morning before all the denizens of Bomberland arrive to stand in line for $16 churros, or late in the evening just after the last guest puked in the garbage next to the guy in the IED costume.

I used to work at Epcot, and I did 14 hour shifts pretty regularly. Seeing a theme park at 6am and 11pm sits somewhere between a happy thought and a PTSD flashback.

And there you have it, folks. I hope this was somewhat informative, and if you end up creating any cool art with it, please send it to me! I'm always keen to see things like this, which is why I wanted to make this pseudo-tutorial in the first place. Oh, I made some nice 4k renders of each of these images as well, Available for download here!

Catch you next time.

osmo@cosmicosmo.co

----~~oOo~~----