mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-24 20:19:49 +02:00
feat: no splash zones
This commit is contained in:
1 parent
7fe35243db
commit
c9eee14b21
5 files changed
+9
-82
No files matched your search
@@ -36,7 +36,6 @@ export function TankDisplay() {
|
|||||||
const [isFullScreen, setIsFullScreen] = useState(false);
|
const [isFullScreen, setIsFullScreen] = useState(false);
|
||||||
const mode = useTankopedia((state) => state.mode);
|
const mode = useTankopedia((state) => state.mode);
|
||||||
const showGrid = useTankopedia((state) => state.model.showGrid);
|
const showGrid = useTankopedia((state) => state.model.showGrid);
|
||||||
const opaqueArmor = useTankopedia((state) => state.model.opaqueArmor);
|
|
||||||
const showSpacedArmor = useTankopedia((state) => state.model.showSpacedArmor);
|
const showSpacedArmor = useTankopedia((state) => state.model.showSpacedArmor);
|
||||||
const protagonist = useTankopedia((state) => {
|
const protagonist = useTankopedia((state) => {
|
||||||
if (!state.areTanksAssigned) return;
|
if (!state.areTanksAssigned) return;
|
||||||
@@ -174,17 +173,6 @@ export function TankDisplay() {
|
|||||||
Show grid
|
Show grid
|
||||||
</DropdownMenu.CheckboxItem>
|
</DropdownMenu.CheckboxItem>
|
||||||
|
|
||||||
<DropdownMenu.CheckboxItem
|
|
||||||
checked={opaqueArmor}
|
|
||||||
onCheckedChange={(checked) => {
|
|
||||||
mutateTankopedia((draft) => {
|
|
||||||
draft.model.opaqueArmor = checked;
|
|
||||||
});
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Opaque armor
|
|
||||||
</DropdownMenu.CheckboxItem>
|
|
||||||
|
|
||||||
<DropdownMenu.CheckboxItem
|
<DropdownMenu.CheckboxItem
|
||||||
checked={showSpacedArmor}
|
checked={showSpacedArmor}
|
||||||
onCheckedChange={(checked) => {
|
onCheckedChange={(checked) => {
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
import { MeshProps } from '@react-three/fiber';
|
import { MeshProps } from '@react-three/fiber';
|
||||||
import { MeshStandardMaterial } from 'three';
|
import { MeshStandardMaterial } from 'three';
|
||||||
import CustomShaderMaterial from 'three-custom-shader-material';
|
import CustomShaderMaterial from 'three-custom-shader-material';
|
||||||
import { useTankopedia } from '../../stores/tankopedia';
|
|
||||||
import fragment from './shaders/fragment.glsl';
|
import fragment from './shaders/fragment.glsl';
|
||||||
import fragmentOpaque from './shaders/fragmentOpaque.glsl';
|
|
||||||
import vertex from './shaders/vertex.glsl';
|
import vertex from './shaders/vertex.glsl';
|
||||||
|
|
||||||
interface ArmorMeshProps extends MeshProps {
|
interface ArmorMeshProps extends MeshProps {
|
||||||
@@ -32,8 +30,6 @@ export function ArmorMesh({
|
|||||||
spaced = false,
|
spaced = false,
|
||||||
...props
|
...props
|
||||||
}: ArmorMeshProps) {
|
}: ArmorMeshProps) {
|
||||||
const opaqueArmor = useTankopedia((state) => state.model.opaqueArmor);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{!spaced && (
|
{!spaced && (
|
||||||
@@ -67,7 +63,7 @@ export function ArmorMesh({
|
|||||||
isAffectedBySpaced: { value: isAffectedBySpaced },
|
isAffectedBySpaced: { value: isAffectedBySpaced },
|
||||||
}}
|
}}
|
||||||
vertexShader={vertex}
|
vertexShader={vertex}
|
||||||
fragmentShader={opaqueArmor && !spaced ? fragmentOpaque : fragment}
|
fragmentShader={fragment}
|
||||||
/>
|
/>
|
||||||
</mesh>
|
</mesh>
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -49,7 +49,14 @@ void main() {
|
|||||||
if (spaced) {
|
if (spaced) {
|
||||||
csm_FragColor = vec4(1.0, 0.0, 1.0, 0.5);
|
csm_FragColor = vec4(1.0, 0.0, 1.0, 0.5);
|
||||||
} else {
|
} 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 {
|
} else {
|
||||||
if (spaced) {
|
if (spaced) {
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -32,7 +32,6 @@ type Tankopedia = {
|
|||||||
gunPitch: number;
|
gunPitch: number;
|
||||||
controlsEnabled: boolean;
|
controlsEnabled: boolean;
|
||||||
showGrid: boolean;
|
showGrid: boolean;
|
||||||
opaqueArmor: boolean;
|
|
||||||
showSpacedArmor: boolean;
|
showSpacedArmor: boolean;
|
||||||
};
|
};
|
||||||
mode: TankopediaMode;
|
mode: TankopediaMode;
|
||||||
@@ -72,7 +71,6 @@ export const useTankopedia = create<Tankopedia>()(() => ({
|
|||||||
turretYaw: 0,
|
turretYaw: 0,
|
||||||
controlsEnabled: true,
|
controlsEnabled: true,
|
||||||
showGrid: true,
|
showGrid: true,
|
||||||
opaqueArmor: false,
|
|
||||||
showSpacedArmor: true,
|
showSpacedArmor: true,
|
||||||
},
|
},
|
||||||
areTanksAssigned: false,
|
areTanksAssigned: false,
|
||||||
|
|||||||
Reference in new issue
Block a user