From 07cdb0788c4fb7ca6d428c7c5c348ae681f9d3ef Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com>
Date: Tue, 27 Feb 2024 17:44:18 -0600
Subject: [PATCH] feat: opaque mode
---
.../components/Model/components/Options.tsx | 38 +++++++++++++------
.../Armor/components/CoreArmor/index.tsx | 2 +
.../CoreArmor/shaders/fragment.glsl | 4 +-
src/stores/tankopedia.ts | 2 +
4 files changed, 33 insertions(+), 13 deletions(-)
diff --git a/src/app/tools/tankopedia/[id]/components/Model/components/Options.tsx b/src/app/tools/tankopedia/[id]/components/Model/components/Options.tsx
index 9896894d8..e3ac0d6c9 100644
--- a/src/app/tools/tankopedia/[id]/components/Model/components/Options.tsx
+++ b/src/app/tools/tankopedia/[id]/components/Model/components/Options.tsx
@@ -30,6 +30,7 @@ export function Options({ isFullScreen, canvasWrapper }: OptionsProps) {
const wireframe = useTankopediaPersistent(
(state) => state.model.visual.wireframe,
);
+ const opaque = useTankopediaPersistent((state) => state.model.visual.opaque);
const fullScreenAvailable =
typeof document !== 'undefined' && document.fullscreenEnabled;
const environment = useTankopediaPersistent(
@@ -78,6 +79,8 @@ export function Options({ isFullScreen, canvasWrapper }: OptionsProps) {
+ Armor
+
{
@@ -89,6 +92,30 @@ export function Options({ isFullScreen, canvasWrapper }: OptionsProps) {
Green penetration
+ {
+ mutateTankopediaPersistent((draft) => {
+ draft.model.visual.wireframe = checked;
+ });
+ }}
+ >
+ Wireframe
+
+
+ {
+ mutateTankopediaPersistent((draft) => {
+ draft.model.visual.opaque = checked;
+ });
+ }}
+ >
+ Opaque
+
+
+ Environment
+
{
@@ -132,17 +159,6 @@ export function Options({ isFullScreen, canvasWrapper }: OptionsProps) {
-
- {
- mutateTankopediaPersistent((draft) => {
- draft.model.visual.wireframe = checked;
- });
- }}
- >
- Wireframe
-
)}
diff --git a/src/components/Armor/components/CoreArmor/index.tsx b/src/components/Armor/components/CoreArmor/index.tsx
index b34b50326..8ddb62118 100644
--- a/src/components/Armor/components/CoreArmor/index.tsx
+++ b/src/components/Armor/components/CoreArmor/index.tsx
@@ -51,6 +51,7 @@ export function CoreArmor({ node, thickness }: CoreArmorProps) {
explosionRadius: { value: null },
greenPenetration: { value: null },
wireframe: { value: null },
+ opaque: { value: null },
resolution: { value: new Vector2() },
spacedArmorBuffer: { value: null },
@@ -78,6 +79,7 @@ export function CoreArmor({ node, thickness }: CoreArmorProps) {
) {
material.uniforms.greenPenetration.value = visual.greenPenetration;
material.uniforms.wireframe.value = visual.wireframe;
+ material.uniforms.opaque.value = visual.opaque || visual.wireframe;
material.wireframe = visual.wireframe;
}
diff --git a/src/components/Armor/components/CoreArmor/shaders/fragment.glsl b/src/components/Armor/components/CoreArmor/shaders/fragment.glsl
index eb579b1cf..b5ad53518 100644
--- a/src/components/Armor/components/CoreArmor/shaders/fragment.glsl
+++ b/src/components/Armor/components/CoreArmor/shaders/fragment.glsl
@@ -14,6 +14,7 @@ uniform float damage;
uniform float explosionRadius;
uniform bool greenPenetration;
uniform bool wireframe;
+uniform bool opaque;
uniform highp sampler2D spacedArmorBuffer;
uniform highp sampler2D spacedArmorDepth;
@@ -74,7 +75,7 @@ void main() {
}
}
- float alpha = wireframe ? 1.0 : 0.5;
+ float alpha = opaque ? 1.0 : 0.5;
vec3 color = vec3(1.0, splashChance * 0.392, 0.0);
if (greenPenetration) {
// non-trigonometric red-green mixing: https://www.desmos.com/calculator/ceo1oq7l67
@@ -84,5 +85,4 @@ void main() {
} else {
gl_FragColor = vec4(color, (1.0 - penetrationChance) * alpha);
}
-
}
\ No newline at end of file
diff --git a/src/stores/tankopedia.ts b/src/stores/tankopedia.ts
index 357d87d83..817492ab1 100644
--- a/src/stores/tankopedia.ts
+++ b/src/stores/tankopedia.ts
@@ -17,6 +17,7 @@ export interface TankopediaPersistent {
model: {
visual: {
wireframe: boolean;
+ opaque: boolean;
environment: (typeof ENVIRONMENTS)[number];
controlsEnabled: boolean;
showGrid: boolean;
@@ -105,6 +106,7 @@ export const useTankopediaPersistent = create()(
model: {
visual: {
wireframe: false,
+ opaque: false,
environment: ENVIRONMENTS[0],
controlsEnabled: true,
showGrid: true,