mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-21 18:57:03 +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 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
|
||||
</DropdownMenu.CheckboxItem>
|
||||
|
||||
<DropdownMenu.CheckboxItem
|
||||
checked={opaqueArmor}
|
||||
onCheckedChange={(checked) => {
|
||||
mutateTankopedia((draft) => {
|
||||
draft.model.opaqueArmor = checked;
|
||||
});
|
||||
}}
|
||||
>
|
||||
Opaque armor
|
||||
</DropdownMenu.CheckboxItem>
|
||||
|
||||
<DropdownMenu.CheckboxItem
|
||||
checked={showSpacedArmor}
|
||||
onCheckedChange={(checked) => {
|
||||
|
||||
@@ -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}
|
||||
/>
|
||||
</mesh>
|
||||
</>
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
controlsEnabled: boolean;
|
||||
showGrid: boolean;
|
||||
opaqueArmor: boolean;
|
||||
showSpacedArmor: boolean;
|
||||
};
|
||||
mode: TankopediaMode;
|
||||
@@ -72,7 +71,6 @@ export const useTankopedia = create<Tankopedia>()(() => ({
|
||||
turretYaw: 0,
|
||||
controlsEnabled: true,
|
||||
showGrid: true,
|
||||
opaqueArmor: false,
|
||||
showSpacedArmor: true,
|
||||
},
|
||||
areTanksAssigned: false,
|
||||
|
||||
Reference in new issue
Block a user