Table of Contents:
- Discovering Cyberpunk 2077's photo mode
- The initial spark
- Getting ready for the long haul
- Building the foundation
- Screenshotavaganza
- Cruising speed
- It's alive!
- Screenshotavaganza Redux
- It's alive! No, really now.
Discovering Cyberpunk 2077's photo mode
As a long time gamer, Cyberpunk 2077's clothing system and photo mode really impressed me. I believe that this innovative technical foundation largely contributed to the game's success. It seems to me that this, combined with the unique world they created, really brought game photography to life as a whole. At least it made players realize that they can be virtual photographers. As I found out, there is a very active community that already does this semi-professionally. Developers like Otis_Inf even create game photo mode tools that simulate real world cameras.
After playing Cyberpunk, I now find myself wishing that the other games I play had the same tools, a wish I saw mirrored in comments on steam. Starfield, for example, has a great photo mode that includes character expressions and poses, but (at the time I am writing this in april 2025) it does not have any way to adjust your character's position. This severely limits what you can do.
With its three main stylistic directions (Nomads, Street Rats and Corpo), Cyberpunk lends itself to all kinds of fun blends. During my playthroughs, I created a number of outfits, and I had a lot of fun visiting all the vendors and trying out the clothes I could find. Every so often, the game studio (CD Project Red, or CDPR for short) would also add new NPC outfits, which are a constant source of inspiration.
The initial spark
I wanted to save the outfits I created, so I took some screenshots and put them up into the gallery on my website. After adding a few more, I added information on the clothing items I used, including the mod links. This way I could recreate them later, and also allow others to easily find the mods I used.
This process was a bit tedious, and I kept referencing the same mods. I thought that it would be a good idea to just create a JSON file to keep track of the mods in a centralized way. It was deciding on the ideal structure of the file that the first plan for a mod database took form. Because if I was to add the mod information, I should also have a screenshot of the mod to go with it. Of course, it should include the CET item codes as well, because they are often a hassle to find.
I also remembered getting annoyed that there is no way, either in the game or on Nexusmods, to get a list of all pants, for example. The virtual ateliers are an awesome tool, but even so, there is no "central atelier" with a search function. The status quo is that every modder has their own atelier mod (and even more than one for different themes). If you are a clothing aficionado like me, you end up swamped in ateliers and lost in frustration looking for that one item you remember seeing, but you'll be damned if you can find the atelier it was in.
It was decided then: I would build a mod database that would include the items, searchable and filterable with screenshots, so I could find the items I wanted.
Getting ready for the long haul
I could already see the database in my mind, in all its finished glory. I could see myself browsing through a list of shoes to select the best match for my current outfit. Ideas were flooding my mind, and I got overwhelmed by the sheer number of possibilities.
This is when my experience as a long time developer helps a lot to control the impulse to just start coding. Experience and philosophy: I knew that it would take a long time to get close to that vision, and that I would have to pace myself to keep it fun.
"It's not the destination that's important, it's the way to get there".
It arguably can't get much more cheesy than that rote (okay, a good contender would be "Rome wasn't built in a day"), but if you pick it apart, there is a beautiful and simple truth in it. You know that you have a long way to go, so should you not do everything you can to make it enjoyable? For me, in development terms, this means channeling the impatience into attention to detail and taking satisfaction in every little bit that I add. Being okay with opening the project, and just adding a few lines. Knowing that the feature I'm currently working on will not be finished in this programming session.
That's how I see iterative development. Combine this with the realization that it's okay if it looks bad, and you can handle big projects in a way that will keep you coming back to it.
On a sidenote, this is also true for professional projects. It can even help a lot, because your progress is much more visible. Management and clients both like seeing progress, even if it looks bad at first. They appreciate very much to experience the progress firsthand. It makes them feel more in control. It opens the way for early feedback, which is great to avoid project-related misunderstandings.
More importantly, it raises their awareness of the time it takes to develop features, and helps to make them more accepting of delays. Since its inception, the programming industry has been stigmatized by the "it should be fast and easy to do" mentality, which even affects management in the industry. Working like this has helped me a lot to mitigate that stigma.
Building the foundation
Thus prepared, I decided on the project's structure and data format. The use of JSON files was the easiest decision, as I wanted an easy-to-read and structured format. While XML would have been a valid alternative, I feel that more people are familiar with JSON nowadays. That, and virtually every programming language has tools to work with JSON which require less effort to set up than XML.
I decided to use a simple flat file structure, with one JSON file per mod. While being almost certain that this would bite me later on, that moment was still very far away, and my future self would have to tackle it. I knew what kind of information I wanted to include, which was pretty much everything except for the mod's official description text. I wanted the database to be an index, not a replacement for Nexusmods.
Screenshotavaganza
I added the first mod JSON files in August 2024, and had to decide on what kind of screenshots to use for the mods. I rummaged through the mod's galleries, thinking to use some of those, but I dismissed that idea very quickly. Copyright issues aside, I realized that I wanted the screenshots to focus on the items. I wanted as few visual distractions as possible, and the mod screenshot galleries often leave you wondering which items are actually included in the mod. There are a lot of awesome pictures and impressive shots, but for the database, something normalized was needed with a barebone character design.
I simply had to create my own screenshots. Granted, there was nothing remotely simple about it, but once I thought about it, I knew there was no way around it. To prepare my screenshot studio, I created a dedicated female character, and finished the game's introduction with her. Then I went searching for a good place to take the screenshots. I wanted a neutral background, which is not easy to find in Night City. I specifically did not want to use an AMM studio as scenery, as it was critical both to reduce the steps needed to start taking screenshots and to limit the technical requirements.
As it happened, I lucked out in a random street with a big mostly featureless building, which also faced the sun directly in the afternoon. From there, it took me about 40-ish screenshots until I had the optimal setup and methodology. I later went back to those early screenshots to remaster them. These were my findings:
- Use the grid lines to align the character with the scenery.
- Use AMM to set the time and day for consistent lighting.
- Use the photo mode's save slots to save useful starting positions.
- Have a pose reference ready to choose a good pose for the item to show.
The grid lines were really the biggest help. The screenshots I had to come back to later were those where the street was not level with the character, which led to a visually unappealing patchwork when putting the screenshots together.
Cruising speed
Once I had a good number of mods with matching screenshots, I started building the separate PHP-based Mod DB Library to make the data searchable.
A separate library because of several reasons:
- To keep the database as lean as possible
- To not limit the database to the PHP technology.
- To allow updating the DB and library separately.
As parsing all those JSON files manually is clumsy at best, I had planned to use an indexing engine with search capabilities. I had chanced upon the Loupe project a while back (an open source data indexing engine). This was the ideal project to try it out. After a simple proof of concept, I knew I had found what I needed. I was impressed with how well it worked.
From there, I built up the data model classes to make working with the data as comfortable and transparent as possible. This included filtering classes to abstract working with the search index.
It's alive!
Once the indexing library was in a usable state, I designed and created the database user interface to the website. Even as a very rough first draft, bringing it to life was a really cool experience. I enjoyed tinkering here and there very much to improve it and add small details. This was a part of the iterative development process that made everything I did before it worthwhile.
Fast-forward to a few months later, and the mod database had reached a state that was useful and fun to use. However, my initial wish to see all shoes in one list was still not fulfilled...
Yes, I could browse the mods and see their items, but that item-centric view was still not ready. The data was all there waiting to be used, but I had neglected the item-based tooling. Still, little was missing, and soon I had the PHP library ready.
As I wrote down some lines of code and opened the item browser page for the first time, I had to think to myself:
"I love it when a plan comes together!" ^^
...and this is exactly the kind of feeling that made me learn to write code as a graphics artist: To bring life to my ideas, and make stuff work.
Screenshotavaganza Redux
Yes, well. That might have been a tad too soon, as something was still missing.
The text-based list of items was a great start, but when I tried to add the mod screenshots in the list, I realized that they were far from ideal. Not only are they in widescreen format, they also do not necessarily show the item listed. Even if the item is present in the screenshot, it is not typically its sole focus.
I had originally dismissed creating item screenshots because it would have been an even more massive undertaking than the mod screenshots. However, I had to accept that my vision would never be complete without them. At that point, I already had 200 mods in the database, so this was going to... take a while.
I considered again decompiling mod files to extract the item icons, but I had never liked that idea. While technically feasible with the WolvenKit, it simply felt wrong. A bit disheartened, I vowed to let the topic stew for a few days—to let the facts settle and sort themselves out in my brain.
This turned out to be a good decision, as I came to a realization: I did not have to create screenshots for every single item. One representative example for each item category would be enough. Even larger mods like raemaze's "Chain Jewelry Collection" with a whopping 300 items only has 10 categories. While it was still a daunting task, I felt confident that I could handle it.
Thus, newly inspired and motivated, I decided on the format for the item screenshots and how to integrate them into the database. Then I started creating a few to get a feel for the process. It turned out to be rather pleasant, and a nice bonus was that I had everything I needed by that time: I could use the existing mod database as a reference with access the item CET codes. Moreover, the item screenshots are simpler to make. Focusing on the items means that only minimal character posing is needed.
It's alive! No, really now.
With all item screenshots done, I was finally able to continue building the item browser. A lot is still missing at the time I am writing this, but the foundation is there.
I will update this space as it evolves :D
Without further ado, here it is: The item browser.
