UNIFIED GRAPHICS
One WGSL Shader → Four GPUs
Our custom shader compiler emits SPIR-V, Apple Metal, WebGPU, and WebGL 2 from one source with verified visual parity.
47–53 dB PSNR parity vs. native Vulkan
GANBATE ENGINE · PROPRIETARY RUST CORE
A zero-dependency 3D graphics, deterministic physics, and 5× compact world-streaming runtime—built in-house so players join instantly and our studio ships everywhere.
| Backend | Target Platforms | Shader Emission | Verification & Telemetry |
|---|---|---|---|
| Vulkan 1.3 | Linux (X11/XWayland), Windows (Win32), Android offscreen | Direct SPIR-V emission |
Direct system loader ABI · 41 driver validation tests |
| Apple Metal | macOS (arm64), iOS / iPhone (arm64 & Simulator) | Metal Shading Language (MSL) |
Objective-C runtime direct bind · byte-exact WGSL layouts |
| WebGPU | Chrome / Edge 113+, Safari 26 (macOS, iOS, iPadOS) | Standard WGSL + dynamic ring |
47–50 dB PSNR parity against native Vulkan |
| WebGL 2 | Universal fallback across phones, Linux & legacy GPUs | Lowered GLSL ES 3.00 |
Automatic std140 & RGBA32UI storage fetch · 49–53 dB PSNR |
IN-HOUSE ENGINE · GANBATE ENGINE
Engineered from scratch in pure Rust so players step into rich 3D venues in seconds—and our studio ships across web, desktop, and mobile from a single codebase.
UNIFIED GRAPHICS
Our custom shader compiler emits SPIR-V, Apple Metal, WebGPU, and WebGL 2 from one source with verified visual parity.
47–53 dB PSNR parity vs. native Vulkan
INSTANT DISTRIBUTION
ABEW v4 cooks 694K-triangle venues down to ~7 bytes per triangle so mobile and desktop players join tables in seconds.
≥98% frame cadence at 120 Hz & 240 Hz
DETERMINISTIC 60 HZ
Rigid bodies, joints, and continuous collision produce identical 64-bit state hashes on native GPUs and WebAssembly.
698 automated tests · Hash c9df1e2e6456329b
MODERN PIPELINE
Canonical JSON scenes, semantic CLI diffs, and headless GPU renders accelerate engineering and AI-assisted content creation.
Zero external crates · 100% Git-diffable
Zero external runtime crates · Sustained 60 / 120 / 240 Hz pacing across devices
Direct X11, Win32, Metal, and Canvas hosts with zero external crates.
Canonical JSON hierarchies cooked down to ~7 B/triangle for instant web play.
Single-source WGSL compiled across Vulkan, Metal, WebGPU, and WebGL 2.
Bit-exact rigid bodies, joints, GPU skinning, and sparse facial morphs.
3D-to-HUD anchors, triangle picking, and authoritative server snapshots.
Atomic JSON scene ops, undo journal, visual diffs, and frame-rate gates.
UNDER THE HOOD
Clean TypeScript/WASM APIs, cross-compiled WGSL shaders, zero-crate Rust physics, and scriptable scene pipelines.
Boot a cooked 3D venue in the browser, drive dynamic time-of-day lighting, and project 3D table anchors onto crisp HUD coordinates.
import { createEngine } from '@ganbate/engine-web';
const engine = await createEngine({
canvas,
wasm: '/engine/ganbate_web.wasm',
world: '/worlds/yozakura-v5-live.abew', // 627 entities · 617 lights
look: yozakuraLookV5,
});
engine.fitCanvas();
engine.setView({
eye: [0, 2.15, 3.25],
target: [0, 0.78, 0],
fov: 44,
focus: { distance: 3.4, depth: 4.5, blur: 0.018 },
});
engine.setClock(20.5, performance.now() / 1000);
engine.setWeather('petals');
const tableSpot = engine.createLight({
kind: 'spot',
position: [0, 2.6, 0.2],
direction: [0, -1, -0.08],
color: [1.0, 0.84, 0.62],
intensity: 16.0,
shadow: 0.85,
});
engine.render();
const hudAnchor = engine.project([0, 0.92, 0]);
const hitProp = engine.pick(pointerX, pointerY);
Write one concise WGSL shader; ganbate-shader compiles it to Vulkan SPIR-V, Apple Metal, WebGPU, and WebGL 2 automatically.
// Compiled across Vulkan, Metal, WebGPU & WebGL 2 by ganbate-shader
fn shade(in: ShadeInput) -> vec4f {
let peel_line = in.params[0].x; // Live frame parameter (no pipeline rebuild)
let curl_radius = in.params[0].y;
let reveal = smoothstep(peel_line - 0.02, peel_line + 0.02, in.uv.y);
// Sample card back & face textures with mip-bias control
let card_back = textureSampleBias(base_tex, material_sampler, in.uv, -0.25);
let mirrored_uv = vec2f(1.0 - in.uv.x, in.uv.y);
let card_face = textureSampleBias(emissive_tex, material_sampler, mirrored_uv, -0.25);
// Subtle crease shadow along the live squeeze fold
let crease = 1.0 - 0.32 * exp(-pow((in.uv.y - peel_line) / curl_radius, 2.0));
let rgb = mix(card_back.rgb, card_face.rgb, reveal) * crease;
return vec4f(rgb * in.tint.rgb, card_back.a * in.tint.a);
}
Pure-Rust rigid-body simulation with continuous collision detection and bit-identical 64-bit state hashes on native GPUs and WASM.
use ganbate_physics::{BodyDesc, BodyKind, ColliderDesc, PhysicsWorld, Shape, Vec3};
let mut world = PhysicsWorld::new(Vec3::new(0.0, -9.81, 0.0));
let felt = world.add_body(BodyDesc::new(BodyKind::Static, Vec3::ZERO));
world.add_collider(
felt,
ColliderDesc::new(Shape::Box(Vec3::new(1.35, 0.05, 0.75)))
.friction(0.62)
.restitution(0.18),
);
let chip = world.add_body(
BodyDesc::new(BodyKind::Dynamic, Vec3::new(-0.42, 0.38, 0.12))
.linear_velocity(Vec3::new(1.85, -0.40, 0.0))
.ccd(true),
);
world.add_collider(chip, ColliderDesc::new(Shape::Cylinder { half_y: 0.0017, radius: 0.02 }));
for _ in 0..120 {
world.step(1.0 / 60.0); // Identical 64-bit state hash on native & wasm32
}
assert_eq!(world.state_hash(), 0xc9df_1e2e_6456_329b);
Apply schema-validated JSON scene transactions from scripts or AI workflows, inspect semantic Git diffs, and render headless verification frames.
# 1. Apply an atomic, schema-validated scene transaction
ganbate-engine scene apply ./yozakura scenes/harbor.scene.json - <<'EOF'
{
"label": "Warm harbor lanterns & add terrace hero camera",
"edits": [
{ "op": "set", "entity": "Bridge/Lantern 04", "path": "light.intensity", "value": 18.5 },
{ "op": "create", "name": "Terrace Hero Cam", "components": {
"camera": { "fov": 42 },
"transform": { "translation": [-4.2, 2.6, 8.4], "rotation": [0, 0.38, 0, 0.92] }
}}
]
}
EOF
# → {"ok":true,"written":true,"edits":2,"issues":[],"hash":"2c983daa91f04e1b"}
# 2. Semantic diff vs. Git HEAD & headless GPU verification frame
git show HEAD:scenes/harbor.scene.json | ganbate-engine scene diff - scenes/harbor.scene.json
ganbate-engine render ./yozakura scenes/harbor.scene.json --camera "Terrace Hero Cam" --out verify.png
Pack 3D scenes 5× smaller into streamable ABEW v4 bundles, enforce 120/240 Hz frame pacing, and mount custom tools inside Ganbate Studio.
# Cook scene into compact ABEW v4 package (~1/5 download size, preserves all 627 entities)
ganbate-build import ./yozakura content/models/harbor.glb content/scenes/harbor.scene.json
ganbate-build cook-scene --compact --keep-images ./yozakura content/scenes/harbor.scene.json dist/harbor.abew
# Verify 120 Hz mobile & 240 Hz desktop ≥98% presentation cadence
ganbate-framecheck 120 1200 mobile-120hz-trace.txt
ganbate-framecheck 240 600 desktop-240hz-trace.txt
# editor/project-tools.json — mounts game authoring tools inside Ganbate Studio
{
"version": 1,
"origin": "https://play.ganbate.io",
"tools": [
{ "label": "Action Flow Sequencer", "path": "/dev/sequencer" },
{ "label": "Audio Cue Mixer (128 cues)", "path": "/dev/audio" },
{ "label": "Character Expression Studio", "path": "/dev/expressions" }
]
}
PLAY GANBATE LIVE
Instant social poker, Blackjack, and Baccarat on desktop and mobile—no download needed.
18+ · Fictional play chips only. No cash-out or real-money prizes.