From c9eee14b21cf29899a8bc28db692edcc90d8219f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com>
Date: Thu, 11 Jan 2024 21:30:34 -0600
Subject: [PATCH] feat: no splash zones
---
.../[id]/components/Model/TankDisplay.tsx | 12 ----
src/components/ArmorMesh/index.tsx | 6 +-
.../ArmorMesh/shaders/fragment.glsl | 9 ++-
.../ArmorMesh/shaders/fragmentOpaque.glsl | 62 -------------------
src/stores/tankopedia.ts | 2 -
5 files changed, 9 insertions(+), 82 deletions(-)
delete mode 100644 src/components/ArmorMesh/shaders/fragmentOpaque.glsl
diff --git a/src/app/tools/tankopedia/[id]/components/Model/TankDisplay.tsx b/src/app/tools/tankopedia/[id]/components/Model/TankDisplay.tsx
index 1c729cdb9..2211f5e9c 100644
--- a/src/app/tools/tankopedia/[id]/components/Model/TankDisplay.tsx
+++ b/src/app/tools/tankopedia/[id]/components/Model/TankDisplay.tsx
@@ -36,7 +36,6 @@ export function TankDisplay() {
const [isFullScreen, setIsFullScreen] = useState(false);
const mode = useTankopedia((state) => state.mode);
const showGrid = useTankopedia((state) => state.model.showGrid);
- const opaqueArmor = useTankopedia((state) => state.model.opaqueArmor);
const showSpacedArmor = useTankopedia((state) => state.model.showSpacedArmor);
const protagonist = useTankopedia((state) => {
if (!state.areTanksAssigned) return;
@@ -174,17 +173,6 @@ export function TankDisplay() {
Show grid
- {
- mutateTankopedia((draft) => {
- draft.model.opaqueArmor = checked;
- });
- }}
- >
- Opaque armor
-
-
{
diff --git a/src/components/ArmorMesh/index.tsx b/src/components/ArmorMesh/index.tsx
index 21848a2f1..0c320d30b 100644
--- a/src/components/ArmorMesh/index.tsx
+++ b/src/components/ArmorMesh/index.tsx
@@ -1,9 +1,7 @@
import { MeshProps } from '@react-three/fiber';
import { MeshStandardMaterial } from 'three';
import CustomShaderMaterial from 'three-custom-shader-material';
-import { useTankopedia } from '../../stores/tankopedia';
import fragment from './shaders/fragment.glsl';
-import fragmentOpaque from './shaders/fragmentOpaque.glsl';
import vertex from './shaders/vertex.glsl';
interface ArmorMeshProps extends MeshProps {
@@ -32,8 +30,6 @@ export function ArmorMesh({
spaced = false,
...props
}: ArmorMeshProps) {
- const opaqueArmor = useTankopedia((state) => state.model.opaqueArmor);
-
return (
<>
{!spaced && (
@@ -67,7 +63,7 @@ export function ArmorMesh({
isAffectedBySpaced: { value: isAffectedBySpaced },
}}
vertexShader={vertex}
- fragmentShader={opaqueArmor && !spaced ? fragmentOpaque : fragment}
+ fragmentShader={fragment}
/>
>
diff --git a/src/components/ArmorMesh/shaders/fragment.glsl b/src/components/ArmorMesh/shaders/fragment.glsl
index b13bde55c..12866bf0d 100644
--- a/src/components/ArmorMesh/shaders/fragment.glsl
+++ b/src/components/ArmorMesh/shaders/fragment.glsl
@@ -49,7 +49,14 @@ void main() {
if (spaced) {
csm_FragColor = vec4(1.0, 0.0, 1.0, 0.5);
} else {
- csm_FragColor = vec4(1.0, 0.392, 0.0, alpha);
+ float angledThickness = thickness / cos(angle);
+
+ if (angledThickness * (5.0 / 11.0) > penetration) {
+ csm_FragColor = vec4(1.0, 0.0, 0.0, alpha);
+ } else {
+ csm_FragColor = vec4(1.0, 0.392, 0.0, alpha);
+ }
+
}
} else {
if (spaced) {
diff --git a/src/components/ArmorMesh/shaders/fragmentOpaque.glsl b/src/components/ArmorMesh/shaders/fragmentOpaque.glsl
deleted file mode 100644
index 894a4386d..000000000
--- a/src/components/ArmorMesh/shaders/fragmentOpaque.glsl
+++ /dev/null
@@ -1,62 +0,0 @@
-// split shaders due to https://github.com/FarazzShaikh/THREE-CustomShaderMaterial/issues/48
-
-varying vec3 vCSMViewPosition;
-uniform float thickness;
-uniform float penetration;
-uniform float ricochet;
-uniform float caliber;
-uniform float normalization;
-uniform bool canRichochet;
-uniform bool canSplash;
-
-void main() {
- vec3 normalizedNormal = normalize(vNormal);
- vec3 normalizedViewPosition = normalize(vCSMViewPosition);
- float dotProduct = dot(normalizedNormal, -normalizedViewPosition);
- float angle = acos(dotProduct);
-
- float penetrationChance = -1.0;
- bool threeCaliberRule = caliber > 3.0 * thickness;
-
- if (canRichochet && !threeCaliberRule && angle >= ricochet) {
- // auto ricochet angle and three caliber rule not met
- penetrationChance = 0.0;
- } else {
- bool twoCaliberRule = caliber > 2.0 * thickness;
- float finalNormalization = twoCaliberRule ? (normalization * 1.4 * caliber) / (2.0 * thickness) : normalization;
- float effectiveArmor = thickness / cos(angle - finalNormalization);
- float penetrationRandomRadius = penetration * 0.05;
- float penetrationDifference = effectiveArmor - penetration;
-
- if (penetrationDifference > penetrationRandomRadius) {
- // even with a +5% buff, can't penetrate
- penetrationChance = 0.0;
- } else if (penetrationDifference < -penetrationRandomRadius) {
- // event with a -5% nerf, can penetrate
- penetrationChance = 1.0;
- } else {
- // penetration gradiant
- penetrationChance = 1.0 - (penetrationDifference + penetrationRandomRadius) / (2.0 * penetrationRandomRadius);
- }
- }
-
- if (canSplash) {
- float h = mix(20.0 / 360.0, 1.0 / PI, penetrationChance);
- float s = 1.0;
- float v = 1.0;
- vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
- vec3 p = abs(fract(h + K.xyz) * 6.0 - K.www);
- vec3 rgb = v * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), s);
-
- csm_DiffuseColor = vec4(rgb, 1.0);
- } else {
- float h = mix(0.0, 1.0 / PI, penetrationChance);
- float s = 1.0;
- float v = 1.0;
- vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
- vec3 p = abs(fract(h + K.xyz) * 6.0 - K.www);
- vec3 rgb = v * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), s);
-
- csm_DiffuseColor = vec4(rgb, 1.0);
- }
-}
\ No newline at end of file
diff --git a/src/stores/tankopedia.ts b/src/stores/tankopedia.ts
index 292c16f0f..ff28a2009 100644
--- a/src/stores/tankopedia.ts
+++ b/src/stores/tankopedia.ts
@@ -32,7 +32,6 @@ type Tankopedia = {
gunPitch: number;
controlsEnabled: boolean;
showGrid: boolean;
- opaqueArmor: boolean;
showSpacedArmor: boolean;
};
mode: TankopediaMode;
@@ -72,7 +71,6 @@ export const useTankopedia = create()(() => ({
turretYaw: 0,
controlsEnabled: true,
showGrid: true,
- opaqueArmor: false,
showSpacedArmor: true,
},
areTanksAssigned: false,