Instead of using my central "Paint Stamper" system, the Zone system painted the zone. But, that means the Paint Stamper is unaware of the changes so I currently have a questionable workaround that fires every frame.
Instead of using my central "Paint Stamper" system, the Zone system painted the zone. But, that means the Paint Stamper is unaware of the changes so I currently have a questionable workaround that fires every frame.
Instead, here's an image of my "version control".
I don't know how to set it up so I'm just packaging the plugin every week or so and zipping up the contents to a backup hard drive 🫡
Instead, here's an image of my "version control".
I don't know how to set it up so I'm just packaging the plugin every week or so and zipping up the contents to a backup hard drive 🫡
I can define any n-sided polygon and voila, we can detect paint in that area. Sampling resolution is kept low about 1px/m. Don't need to be too accurate.
Next, I'll introduce a fill operation, so when it hits 75%, it completely fills the zone with the winning team's color.
I can define any n-sided polygon and voila, we can detect paint in that area. Sampling resolution is kept low about 1px/m. Don't need to be too accurate.
Next, I'll introduce a fill operation, so when it hits 75%, it completely fills the zone with the winning team's color.
Tbh, I don't expect my detection zones to have any winding but I suppose it's a nice feature to have.
Tbh, I don't expect my detection zones to have any winding but I suppose it's a nice feature to have.
Spent the weekend researching the math for creating an irregular n-sided polygon to replace the previous primitive cube method.
Doesn't work with all shapes right now (such as a star) but I'll continue debugging it tomorrow.
Spent the weekend researching the math for creating an irregular n-sided polygon to replace the previous primitive cube method.
Doesn't work with all shapes right now (such as a star) but I'll continue debugging it tomorrow.
Modular contains a singular visible mesh with a single corresponding collision mesh.
Proxy allows multiple visible meshes correspond to a single collision mesh, useful for large collision meshes where multiple static meshes may be associated with it.
Modular contains a singular visible mesh with a single corresponding collision mesh.
Proxy allows multiple visible meshes correspond to a single collision mesh, useful for large collision meshes where multiple static meshes may be associated with it.
Before, I was using Dynamic Material Instances but it's a pain to set up the code per material instance. Custom Primitive Data instead only needs one node that applies to every material that shares the same index!
Before, I was using Dynamic Material Instances but it's a pain to set up the code per material instance. Custom Primitive Data instead only needs one node that applies to every material that shares the same index!
The paint UVs are fairly easy to create thanks to Blender's Data Transfer modifier.
The paint UVs are fairly easy to create thanks to Blender's Data Transfer modifier.
If a static mesh is added to the "Visible Mesh" variable, it will automatically create a component to show the added mesh. Perfect for modular paintable actors similar to Splatoon 3's single player campaign.
Will work on detached visible meshes next...
If a static mesh is added to the "Visible Mesh" variable, it will automatically create a component to show the added mesh. Perfect for modular paintable actors similar to Splatoon 3's single player campaign.
Will work on detached visible meshes next...
The paint system generally works but I've decided to create a test map that forces me to flesh out various features.
Currently, I'm working on a system where a single paintable collision mesh to distribute painting params to corresponding visible meshes.
The paint system generally works but I've decided to create a test map that forces me to flesh out various features.
Currently, I'm working on a system where a single paintable collision mesh to distribute painting params to corresponding visible meshes.
Dodge Offset causes the final hit of the rapier's YYY combo to bug out. I don't even know if it's some weird root motion or motion warping error but it's neat to see that the hitbox is independent from the animation.
Dodge Offset causes the final hit of the rapier's YYY combo to bug out. I don't even know if it's some weird root motion or motion warping error but it's neat to see that the hitbox is independent from the animation.
Using Dodge Offset, it's possible to infinitely loop between standard and Blood Raven combo strings.
In this example, I am looping between the dual swords' XXXXX string and the Blood Raven XXX string.
Using Dodge Offset, it's possible to infinitely loop between standard and Blood Raven combo strings.
In this example, I am looping between the dual swords' XXXXX string and the Blood Raven XXX string.
By using Dodge Offset, you can retain your offset combo even after an Obliteration Technique.
By using Dodge Offset, you can retain your offset combo even after an Obliteration Technique.
Dual Sword Combo: XXXXY
Blood Raven Combo: XXY
Input Sequence
XXXX (Dual Sword) -> Dodge Offset -> Y (Blood Raven)
Just keeping using Dodge Offset to infinitely loop Blood Raven XXY.
#NinjaGaiden4
Dual Sword Combo: XXXXY
Blood Raven Combo: XXY
Input Sequence
XXXX (Dual Sword) -> Dodge Offset -> Y (Blood Raven)
Just keeping using Dodge Offset to infinitely loop Blood Raven XXY.
#NinjaGaiden4
It'll be pretty interesting to compare this to the Ninja Gaiden 2 Black. I do feel that NG2B's lighting looks "better" but I appreciate that NG4's look is more stable and avoids some of the gathering artifacts that Lumen occasionally has.
It'll be pretty interesting to compare this to the Ninja Gaiden 2 Black. I do feel that NG2B's lighting looks "better" but I appreciate that NG4's look is more stable and avoids some of the gathering artifacts that Lumen occasionally has.
Not usually the biggest PC guy but hey, it looks pretty nice on my ultrawide. Could use a new graphics card though because it's struggling a bit (plus I hate fiddling with settings).
Not usually the biggest PC guy but hey, it looks pretty nice on my ultrawide. Could use a new graphics card though because it's struggling a bit (plus I hate fiddling with settings).
Hit a wall? Then it only affects the surface at that particular angle.
Hit a floor? Then it only affects floors within a certain depth like Splatoon.
Hit a wall? Then it only affects the surface at that particular angle.
Hit a floor? Then it only affects floors within a certain depth like Splatoon.
Converted the entirety of the wall normalization code from the material graph into Niagara using a single HLSL node.
Now, I've got perfectly packed Floor depth values and Wall normals in the alpha channel of my position map. On to depth masking experimentation!
Converted the entirety of the wall normalization code from the material graph into Niagara using a single HLSL node.
Now, I've got perfectly packed Floor depth values and Wall normals in the alpha channel of my position map. On to depth masking experimentation!
Porting over my material graph code into Niagara, piece by piece.
Not too much time tonight. Focused only on code that determines which parts of the paint map are considered floors vs. walls. These outputs will be used later in the script for compositing purposes.
Porting over my material graph code into Niagara, piece by piece.
Not too much time tonight. Focused only on code that determines which parts of the paint map are considered floors vs. walls. These outputs will be used later in the script for compositing purposes.
In this image, I only want the splatter to apply to the wall but it's showing on some undesired locations (wall side & floor). The masking solution should be able to remedy this. 3/🧵
In this image, I only want the splatter to apply to the wall but it's showing on some undesired locations (wall side & floor). The masking solution should be able to remedy this. 3/🧵
Allowed range is (-65504 <= z < -1) & (1 < z <= 65504). For simplicity, my paintable floors are placed within a range of (100 < z < 65504).
In this example, I'm only showing all floors that are located at 800cm.
2/🧵
Allowed range is (-65504 <= z < -1) & (1 < z <= 65504). For simplicity, my paintable floors are placed within a range of (100 < z < 65504).
In this example, I'm only showing all floors that are located at 800cm.
2/🧵
When a paint splatter hits a wall, the hit angle is from 0 to 360 degrees, which can be normalized to a value from -1 to 1 (think unit circle).
1/🧵
When a paint splatter hits a wall, the hit angle is from 0 to 360 degrees, which can be normalized to a value from -1 to 1 (think unit circle).
1/🧵
So depending on what sort of splatter you have (floor vs. wall), I can just use this single channel for masking and save on both memory (bye extra 64mb RT) and compute time.
So depending on what sort of splatter you have (floor vs. wall), I can just use this single channel for masking and save on both memory (bye extra 64mb RT) and compute time.
Before, I was doing two texture samples to mask a paint splatter but this doubles the compute time. It'd be nice if I could just use a single texture, so I'm trying to cram the normal map info into the unused alpha channel of my World Position texture.
Before, I was doing two texture samples to mask a paint splatter but this doubles the compute time. It'd be nice if I could just use a single texture, so I'm trying to cram the normal map info into the unused alpha channel of my World Position texture.