Summer Punchball is my latest project. A free to play arcade mobile game, set in a playful beachery scenery, the game asks its players to play an odd game of punching a beach ball into a bucket. If you're interested in learning how this project has been designed and implemented check out the project breakdown.
tech art & vfx
Hover the items to play their videos, if available. Click for more details.
résumé pdfView / Download
- Tools Creation
- 3D Modeling
- Unity Game Development
- Game Design
- Tutorial Writing
- Particles FX
- Shader Authoring
- Material Creation
- Sound Design
- Front-end Web Development
- Server back-end Development
- Native Android Development
(software / language) proficiency
- Substance Designer
- Substance Painter
- Rider IDE
Independent Software Developer
Sr. Software Engineer
Little Green Software
Sr. Sofware Developer
Universidade Federal do Espírito Santo
Museu do Corpo Humano
Universidade Federal do Espírito Santo
Thank you for coming this far, here's some of my old projects for your appreciation.
Gerstner wave & color gradients
This shader has been created for the Summer Punchball game level selection aesthetics transformation. When I've started implementing the game, the level selection was being done completely in 2D, but since I'm more skilled in 3D art I was able to leverage this knowledge to create a much more pleasing overall level selection scene. And it was also an excuse for creating a cartoony water shader.
There are two basic principles behind this shader. For coloring is the use of the depth texture for choosing between the shore color (white) or a gradient also based on the depth that goes from teal to marine blue. Second, for the wave movement, done in the vertex shader, Gertner waves are used, a single wave was sufficient since the shoreline is only present in the edge of the screen and Summer Punchball has a cartoony look.
Bounding boxes at work
This plugin has been born out of my frustration of always having to do the same thing when positioning objects perfectly over the ground plane. It's a minor thing, but I always feel relieved whenever I use this addon because I know I'm avoiding some pain.
It was also my first blender addon, which served as a good opportunity to learn more about blender internals and of course, to start learning how to create addons in blender using python. Creating addons helped me to understand far more than I was expecting since it's not obvious for beginners how should your addon achieve the result wanted. I ended up using a operator since it looked and felt like a traditional blender operator to me, but also because the undo and change of parameters worked really well without extra work from my part. The main calculation behind this is already given by blender as a bounding box property.
This addon has been well received in the blender's reddit community with more than 65 upvotes (post link). This made me realize two things. First, I'm starting to fulfill my initial objective for studying 3d, that is, to be able to work as a programmer in the CG industry I should start as a user. Finally, some times really tiny things can make a good difference in the daily work of an artist, and being able to notice these issues is more than half of the battle.
Confirm changes before importing
This toolone doesn’t have a fancy name yet, but it got the fanciest functionality. More than just importing the data (exporting is simple), the importer first lists all the changes and additions that it will make when the user presses the confirm button.
I’ve always wanted to create such tool, for so much time I’ve spent altering tables using MySQLWorkbench and getting very useful reports back before commiting to a decision. This was work worth the time, whenever I add or change glove designs on my spreadsheet application of choice (Numbers) I can get a good sense of what’s going to happen to my scriptable object asset files, and more than once this helped me find issues with my manual data editing.
Abstract syntax trees creation API
Hephaestus is the artisan of Olympus, doing a silly joke with his name and at the same time paying a tribute, I’ve named my C# source code generator library Hefescos. Hefescos is heavily influenced by its Java counterpart Java Poet. Since I’ve been an Android Application Engineer for a very long time, I’m acquainted with a lot of techniques from the Java world, and I’m a big fan of the open source work from Square (the fintech). After observing that the C# ecosystem lacked something as simple to use as Java poet I’ve accepted the self-imposed challenge of creating a subset of what would be an adaptation of Java poet to C#, the result is the Hefescos lib.
The need for generating C# code from a high-level API came from the fact that Unity requires its users to pass a bunch of strings around as arguments, and that’s extremely error-prone, and worst, it’s only noticeable on run-time. To alleviate some of this horror, I’ve hooked the creation of a few static classes containing important string definitions, namely: LayerNames, TagNames, and SceneNames.
It certainly required a lot more work than just manually creating these files, but this subproject was more than successful, every time I’ve changed or created a new Tag I’ve felt such a relief knowing that my code would still work or warn me that something’s off even before running the game, in compile time.
For the code generation, think of an AST created without parsing. Hefescos offer classes and calls like NamespaceDeclaration, ClassDeclaration, FieldDeclaration.WithInitializationExpression(...) and so on. Creating these objects and calling these methods it’s possible to specify, using high-level code, no string templates, what code you want to generate. This is good because now the C# compiler can help you with this code generation with its type safety features and we can also run our own analysis and efficient string generation. Hefescos has been implemented in a different .NET assembly.
Unity scene tab tooling
Positioning coins in a perfect manner can take a lot of time. Not every coin setup needed to be perfect, but some did, and I didn’t want to create sloppy work, so I was typing values in the inspector, something extremely boring.
AlignTools started as just a couple of buttons to align objects vertically and horizontally, later evolved into its own EditorWindow with more buttons such as circle positioning and horizontal and vertical uniform distribution among the selected objects. It does not work on all axes, but it doesn’t matter, it’s a specialized tool done to do a very specific task.
Gameplay dependent VFX
The extra touch of polish of this particle fx comes from the fact that the direction that it goes is the exact opposite of the ball's velocity the moment it touches the coin. This makes the feedback feel more dynamic and responsive to the player's action. That was made programatically by adjusting the rotation of the shape module of the particle system.
For the texture creation, Substance Designer has been used, I'm a big fan of procedural workflows, and that seemed like the perfect workflow for finding an interesting star shape that could be used for this particle system.
Pre-rendered cloth simulation
To do a beautiful confetti I knew that simply using a single frame particle system wouldn’t be enough and relied once again on Blender to create a spreadsheet animation of a small piece of paper bending around itself, this sprite sheet animation is used by the several particle systems that compose the effect.
Speaking of sprite sheets, to create this one I've leveraged the knowledge I've been accumulating about tools creation on Unity to create a sprite sheet image exporter right in unity. Ideally this should've been done in blender, but I've found the portions of the API that deals with image files to be too complicated for what I know about blender addons creation.
The particle system is very simple, uses the gravity and noise module, but they spawn just in time coinciding with the opening of the shells, creating an energetic and rewarding sense of rhythm. They are also randomly colored by the particle system using vertex coloring picking from a rainbow gradient.
Masks that look good when stretched
This transition was the first fx created for the game, it gave the game charm and thematic unity.
The image texture has been produced as an absolute, no shading, top-view of an oyster I've modelled using subdivison surfaces.
For a long time I’ve been struggling to grasp the basics of shader programming. On one of my many sessions trying to code something with it I ended up creating a nice looking enclosure ellipse animation. Problem was that this had been created using the OnRenderImage callback which is full of drawbacks, and since I wasn’t processing the image itself, I just was doing a layer masking, it was just a waste, on the low-end device I was testing the game on, a Samsung Galaxy J5, it was always lagging a lot during the transitions.
After some investigation, I’ve decided to reimplement it using some kind of UI element, an Image, or ImageRaw component. To my surprise, the shader worked just fine with almost no changes and since I wasn’t reading the screen texture grab anymore it ran pretty smoothly on the J5.
Liquid simulation in Houdini
This is a study I've done to get acquainted with liquid simulation in houdini and how to get these things working on a game. It's a slightly altered version of the Partikel vfx tutorials for Unreal. Most of the work was translating some ideas from Unreal to the Unity way of doing things, but it was not much.
That also taught me a very important lesson on fx for games. On games we take big shortcuts as long as there's some visual fidelity being respected. What in an animation would be created frame-by-frame, on a game we reuse the same asset aiming maximum return, in that particular case there's only a single mesh, and if we were creating an animation we would have different ones, one for each frame. There are ways to have these more flexible workflows on games, but they require a lot of optimization to run smoothly.
Mesh deformation & custom vertex streams
To make the punch to feel stronger a deformation has been applied using the excellent Deform library. This could've been done using a vertex shader, but this way is waaay easier to integrate the deformation direction with other aspects of the game such as the glove position or the ball velocity.
The shockwave effect has a tiny detail, it's sutble, but adds polish, and when all the subtleties are combined they get indeed very noticeable in the overall experience. To make the shockwave fade-out from the inside, a custom vertex stream has been passed to the shader, this vertex stream is a stream of numbers from 1 to 0 modeled using a standard unity curve.