diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..96f9b6a --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,19 @@ +name: Test + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + docs-and-build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + - run: npm ci + - run: npm test diff --git a/package-lock.json b/package-lock.json index 5ae3434..11577c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,10 @@ "version": "0.1.0", "dependencies": { "astro": "^5.7.10" + }, + "devDependencies": { + "@bloomengine/engine": "^0.4.16", + "typescript": "^5.9.3" } }, "node_modules/@astrojs/compiler": { @@ -128,6 +132,23 @@ "node": ">=6.9.0" } }, + "node_modules/@bloomengine/engine": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/@bloomengine/engine/-/engine-0.4.16.tgz", + "integrity": "sha512-NeJGzUJdrjmgBVWr/06FKIdMnReDHuSgChEfAi3ThLr35SNf6s7Y132dbKk+qbAbneTtJX7snlZNw/+UC3jsfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bloomengine/jolt-prebuilt": "0.4.1" + } + }, + "node_modules/@bloomengine/jolt-prebuilt": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@bloomengine/jolt-prebuilt/-/jolt-prebuilt-0.4.1.tgz", + "integrity": "sha512-NMzqkpJO6E3jr5kYPg43w2SpiIOLOmOA3GMVeXRZsC/cHQ8mjqk1Yr/jWiGoC2RyerqNGbbh9EOiPqUAY6xeKw==", + "dev": true, + "license": "MIT" + }, "node_modules/@capsizecss/unpack": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.0.tgz", @@ -4528,7 +4549,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" diff --git a/package.json b/package.json index 5875da8..a98b06f 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,16 @@ "scripts": { "dev": "astro dev", "build": "astro build", - "preview": "astro preview" + "preview": "astro preview", + "check:docs": "node scripts/check-docs.mjs", + "check:snippets": "tsc --noEmit --strict --noResolve --module esnext --target es2022 scripts/bloom-docs-api.d.ts scripts/docs-smoke.ts", + "test": "npm run check:docs && npm run check:snippets && npm run build" }, "dependencies": { "astro": "^5.7.10" + }, + "devDependencies": { + "@bloomengine/engine": "^0.4.16", + "typescript": "^5.9.3" } } diff --git a/scripts/bloom-docs-api.d.ts b/scripts/bloom-docs-api.d.ts new file mode 100644 index 0000000..b0f8350 --- /dev/null +++ b/scripts/bloom-docs-api.d.ts @@ -0,0 +1,33 @@ +declare module "@bloomengine/engine" { + export interface Vec3 { x: number; y: number; z: number } + export interface Color { r: number; g: number; b: number; a: number } + export interface Camera3D { + position: Vec3; + target: Vec3; + up: Vec3; + fovy: number; + projection: "perspective" | "orthographic"; + } + export interface Model { handle: number } + + export const Colors: Record; + export function initWindow(width: number, height: number, title: string, fullscreen?: boolean): void; + export function runGame(frame: (dt: number) => void): void; + export function beginDrawing(): void; + export function endDrawing(): void; + export function clearBackground(color: Color): void; + export function drawText(text: string, x: number, y: number, size: number, color: Color): void; + export function beginMode3D(camera: Camera3D): void; + export function endMode3D(): void; + export function drawModel(model: Model, position: Vec3, scale: number, tint: Color): void; + export function drawGrid(slices: number, spacing: number): void; + export function updateModelAnimation(handle: number, animIndex: number, time: number, scale: number, px: number, py: number, pz: number, rotY: number): void; +} + +declare module "@bloomengine/engine/shapes" { + import type { Color } from "@bloomengine/engine"; + interface Rect { x: number; y: number; width: number; height: number } + export function drawRect(x: number, y: number, width: number, height: number, color: Color): void; + export function drawCircle(x: number, y: number, radius: number, color: Color): void; + export function checkCollisionRecs(a: Rect, b: Rect): boolean; +} diff --git a/scripts/check-docs.mjs b/scripts/check-docs.mjs new file mode 100644 index 0000000..d2da21d --- /dev/null +++ b/scripts/check-docs.mjs @@ -0,0 +1,120 @@ +#!/usr/bin/env node + +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); +const read = (relative) => fs.readFileSync(path.join(root, relative), "utf8"); +let failures = 0; +const fail = (message) => { + console.error(`FAIL ${message}`); + failures += 1; +}; + +const expectedModules = [ + "core", "shapes", "textures", "text", "audio", "models", "math", + "physics", "scene", "mobile", "world", "vfx", "quality", +]; +const numberWords = { + en: ["nine", "thirteen"], + de: ["neun", "dreizehn"], + es: ["nueve", "trece"], + fr: ["neuf", "treize"], + id: ["sembilan", "tiga belas"], + it: ["nove", "tredici"], + ja: ["9 ", "13 "], + ko: ["9", "13"], + pt: ["nove", "treze"], + th: ["เก้า", "สิบสาม"], + tr: ["dokuz", "on üç"], + vi: ["chín", "mười ba"], + "zh-Hans": ["九", "十三"], +}; + +const messageDir = path.join(root, "src/messages"); +const messageFiles = fs.readdirSync(messageDir).filter((name) => name.endsWith(".json")); +for (const file of messageFiles) { + const locale = file.slice(0, -5); + const messages = JSON.parse(read(`src/messages/${file}`)); + const ids = messages.home.modules.items.map((item) => item.id); + if (JSON.stringify(ids) !== JSON.stringify(expectedModules)) { + fail(`${file}: expected ${expectedModules.length} modules, got ${ids.join(", ")}`); + } + const [nine, thirteen] = numberWords[locale]; + if (!messages.home.heroDesc.toLocaleLowerCase(locale).includes(nine)) { + fail(`${file}: hero does not state the nine-target platform count`); + } + if (!messages.home.modules.desc.toLocaleLowerCase(locale).includes(thirteen)) { + fail(`${file}: module copy does not state the thirteen-module count`); + } + for (const platform of ["Android", "watchOS", "visionOS"]) { + if (!messages.home.why.shipEverywhere.desc.includes(platform)) { + fail(`${file}: ship-everywhere copy omits ${platform}`); + } + } + if (!messages.meta.defaultDescription.includes("WebAssembly") || + !messages.home.why.desc.includes("WebAssembly")) { + fail(`${file}: native-versus-Web copy does not explain the WebAssembly target`); + } +} + +const sourceFiles = [ + "src/pages/docs.astro", + "src/components/HomePage.astro", + "src/components/BlogPostWhereBloomStands.astro", +]; +const source = sourceFiles.map((file) => `${file}\n${read(file)}`).join("\n"); +for (const [label, pattern] of [ + ["removed Colors.RAYWHITE constant", /Colors\.RAYWHITE/], + ["legacy bloom package import", /"bloom(?:\/|"<)/], + ["legacy module label", /module-import">bloom\//], + ["numeric Camera3D projection", /projection:\s*[01](?:\.0)?<\/span>/], +]) { + if (pattern.test(source)) fail(`site source contains ${label}`); +} + +const docs = read("src/pages/docs.astro"); +for (const id of expectedModules) { + if (!docs.includes(`id="${id}"`)) fail(`docs page omits the ${id} module`); + if (!docs.includes(`@bloomengine/engine/${id}`)) fail(`docs page omits the ${id} public import`); +} +for (const required of [ + 'pathWithoutLocale="/docs"', + "localizedPathAvailable={false}", + "technical reference is maintained in English", +]) { + if (!docs.includes(required)) fail(`docs language policy omits: ${required}`); +} + +const home = read("src/components/HomePage.astro"); +if (!home.includes('9')) fail("home platform count is not 9"); +if (!home.includes('13')) fail("home module count is not 13"); + +const layout = read("src/layouts/Layout.astro"); +if (!layout.includes("alternateLocales") || !layout.includes("languageMenuPath")) { + fail("layout does not distinguish localized and English-only pages"); +} +if (!read("src/pages/[lang]/docs.astro").includes('Astro.redirect("/docs", 308)')) { + fail("localized docs routes do not redirect to the English reference"); +} + +const stableRoot = "node_modules/@bloomengine/engine"; +const stableTypes = read(`${stableRoot}/src/core/types.ts`); +const stableColors = read(`${stableRoot}/src/core/colors.ts`); +const stableModels = read(`${stableRoot}/src/models/index.ts`); +if (!/projection:\s*"perspective"\s*\|\s*"orthographic"/.test(stableTypes)) { + fail("stable npm package does not accept the documented Camera3D projection strings"); +} +if (!/^\s*SNOW:\s+Color\.Snow,/m.test(stableColors)) { + fail("stable npm package does not contain the documented Colors.SNOW constant"); +} +if (!/export function drawModel\([^)]*model:\s*Model,[^)]*position:\s*Vec3,[^)]*scale:\s*number,[^)]*tint:\s*Color[^)]*\)/s.test(stableModels)) { + fail("stable npm package drawModel signature differs from the website smoke test"); +} +if (!/export function updateModelAnimation\([^)]*handle:\s*number,[^)]*animIndex:\s*number,[^)]*time:\s*number,[^)]*scale:\s*number,[^)]*px:\s*number,[^)]*py:\s*number,[^)]*pz:\s*number,[^)]*rotY:\s*number[^)]*\)/s.test(stableModels)) { + fail("stable npm package updateModelAnimation signature differs from the website smoke test"); +} + +console.log(`${messageFiles.length} locales checked; ${failures} failures`); +process.exit(failures === 0 ? 0 : 1); diff --git a/scripts/docs-smoke.ts b/scripts/docs-smoke.ts new file mode 100644 index 0000000..354b2e4 --- /dev/null +++ b/scripts/docs-smoke.ts @@ -0,0 +1,50 @@ +import { + Colors, + beginDrawing, + beginMode3D, + clearBackground, + drawGrid, + drawModel, + drawText, + endDrawing, + endMode3D, + initWindow, + runGame, + updateModelAnimation, + type Camera3D, + type Model, +} from "@bloomengine/engine"; +import { checkCollisionRecs, drawCircle, drawRect } from "@bloomengine/engine/shapes"; + +// Compile-only copies of the high-traffic website examples. This file is never +// executed; CI type-checks it against the latest stable npm package. +initWindow(800, 450, "Hello Bloom"); +runGame(() => { + beginDrawing(); + clearBackground(Colors.SNOW); + drawText("Hello, Bloom!", 190, 200, 20, Colors.DARKGRAY); + endDrawing(); +}); + +declare const tree: Model; +declare const animation: number; +const camera: Camera3D = { + position: { x: 10, y: 10, z: 10 }, + target: { x: 0, y: 0, z: 0 }, + up: { x: 0, y: 1, z: 0 }, + fovy: 45, + projection: "perspective", +}; + +beginMode3D(camera); +drawModel(tree, { x: 0, y: 0, z: 0 }, 1, Colors.WHITE); +drawGrid(10, 1); +endMode3D(); + +updateModelAnimation(animation, 0, 0, 1, 0, 0, 0, 0); +drawRect(100, 100, 200, 80, Colors.GREEN); +drawCircle(400, 300, 50, Colors.GOLD); +checkCollisionRecs( + { x: 0, y: 0, width: 10, height: 10 }, + { x: 5, y: 5, width: 10, height: 10 }, +); diff --git a/src/components/BlogPostWhereBloomStands.astro b/src/components/BlogPostWhereBloomStands.astro index 2fe93be..bfb198c 100644 --- a/src/components/BlogPostWhereBloomStands.astro +++ b/src/components/BlogPostWhereBloomStands.astro @@ -89,13 +89,13 @@ const showcaseHref = localePath(locale, "/showcase");

{k("h.api")}

{k("p.api1")}

import {"{"} initWindow, windowShouldClose, beginDrawing,
-         endDrawing, clearBackground, drawText, Colors {"}"} from "bloom";
+         endDrawing, clearBackground, drawText, Colors {"}"} from "@bloomengine/engine";
 
 initWindow(800, 450, "Hello Bloom");
 
 while (!windowShouldClose()) {"{"}
   beginDrawing();
-  clearBackground(Colors.RAYWHITE);
+  clearBackground(Colors.SNOW);
   drawText("Hello, Bloom!", 190, 200, 20, Colors.DARKGRAY);
   endDrawing();
 {"}"}
diff --git a/src/components/HomePage.astro b/src/components/HomePage.astro index e9c6234..4a54cef 100644 --- a/src/components/HomePage.astro +++ b/src/components/HomePage.astro @@ -19,7 +19,10 @@ const platforms = [ { name: "Linux", api: "Vulkan" }, { name: "iOS", api: "Metal" }, { name: "tvOS", api: "Metal" }, - { name: "Web", api: "WebGPU / WASM" }, + { name: "watchOS", api: "SwiftUI / SceneKit" }, + { name: "visionOS", api: "Metal" }, + { name: "Android", api: "Vulkan / OpenGL ES" }, + { name: "Web", api: "WebGPU / WebGL" }, ]; --- @@ -28,11 +31,11 @@ const platforms = [
-

{t("home.heroBadge")}

+

{t("home.heroBadge")} · 0.5 preview

{t("home.heroTitlePrefix")}{t("home.heroTitleHighlight")}

{t("home.heroDesc")}

- + {t("home.getStarted")} @@ -52,13 +55,13 @@ const platforms = [
import {"{"} initWindow, windowShouldClose,
          beginDrawing, endDrawing,
          clearBackground, drawText,
-         Colors {"}"} from "bloom";
+         Colors {"}"} from "@bloomengine/engine";
 
 initWindow(800, 450, "My Game");
 
 while (!windowShouldClose()) {"{"}
   beginDrawing();
-  clearBackground(Colors.RAYWHITE);
+  clearBackground(Colors.SNOW);
   drawText("Hello, Bloom!",
     190, 200, 20, Colors.DARKGRAY);
   endDrawing();
@@ -77,11 +80,11 @@ initWindow(800, 450, {t("home.proof.runtimeOverhead")}
         
- 6 + 9 {t("home.proof.targetPlatforms")}
- 9 + 13 {t("home.proof.modules")}
@@ -134,7 +137,7 @@ initWindow(800, 450,

{m.title}

{m.desc}

- bloom/{m.id} + @bloomengine/engine/{m.id}
))}
@@ -210,7 +213,7 @@ initWindow(800, 450,
import {"{"} drawRect, drawCircle,
-         checkCollisionRecs {"}"} from "bloom/shapes";
+         checkCollisionRecs {"}"} from "@bloomengine/engine/shapes";
 
 drawRect(100, 100, 200, 80, Colors.GREEN);
 drawCircle(400, 300, 50, Colors.GOLD);
@@ -232,11 +235,11 @@ drawCircle(400, 300, 10, y: 10, z: 10 {"}"},
   target: {"{"} x: 0, y: 0, z: 0 {"}"},
   up: {"{"} x: 0, y: 1, z: 0 {"}"},
-  fovy: 45, projection: 0
+  fovy: 45, projection: "perspective"
 {"}"};
 
 beginMode3D(camera);
-drawModel(tree, {"{"} x: 0, y: 0, z: 0 {"}"});
+drawModel(tree, {"{"} x: 0, y: 0, z: 0 {"}"}, 1.0, Colors.WHITE);
 drawGrid(10, 1);
 endMode3D();
diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro index 084634d..daad760 100644 --- a/src/layouts/Layout.astro +++ b/src/layouts/Layout.astro @@ -15,18 +15,23 @@ interface Props { locale?: Locale; /** Path within the site without locale prefix, e.g. "/", "/blog", "/blog/where-bloom-stands". Used for hreflang + language switcher. */ pathWithoutLocale?: string; + /** False for English-only pages such as technical and legal documentation. */ + localizedPathAvailable?: boolean; } const { title, locale = defaultLocale, pathWithoutLocale = "/", + localizedPathAvailable = true, } = Astro.props; const t = tFor(locale); const description = Astro.props.description ?? t("meta.defaultDescription"); const site = "https://bloomengine.dev"; +const alternateLocales = localizedPathAvailable ? locales : [defaultLocale]; +const languageMenuPath = localizedPathAvailable ? pathWithoutLocale : "/"; --- @@ -37,7 +42,7 @@ const site = "https://bloomengine.dev"; {title} - {locales.map((alt) => ( + {alternateLocales.map((alt) => ( {locales.map((alt) => ( wgpu geschrieben. Shader sind WGSL. Wir bekommen Metal auf Apple-Plattformen, DirectX 12 auf Windows, Vulkan auf Linux und Android und WebGPU (mit WebGL-Fallback) im Browser — aus einer Codebasis. Der Preis ist, dass wir an wgpus Feature-Set gebunden sind, und ein paar exotische Dinge (Mesh-Shader, Raytracing) sind vorerst vom Tisch. Wir halten das für einen fairen Deal für ein kleines Team.", "h.box": "Was heute tatsächlich drin ist", "p.box": "Wir versuchen, nichts auf die Marketing-Site zu schreiben, was nicht funktioniert. Hier ist, was heute echt ist:", - "li.box1": "Neun importierbare Modulebloom/core, bloom/shapes, bloom/textures, bloom/text, bloom/audio, bloom/models, bloom/math, bloom/physics und bloom/scene.", + "li.box1": "Neun importierbare Module@bloomengine/engine/core, @bloomengine/engine/shapes, @bloomengine/engine/textures, @bloomengine/engine/text, @bloomengine/engine/audio, @bloomengine/engine/models, @bloomengine/engine/math, @bloomengine/engine/physics und @bloomengine/engine/scene.", "li.box2": "Ein echter PBR-Renderer — geschichtete Materialien im Substrate-Stil, Cascaded Shadow Maps mit Caching für statische Geometrie, ACES/AgX-Tonemapping, Auto-Exposure, Bloom, Tiefenschärfe, Motion Blur, SSGI, SSAO, TAA und ein CAS-Schärfungs-Pass für fraktionale Render-Skalierungen.", "li.box3": "GPU-Skelettanimation — glTF 2.0-Import, Linear Blend Skinning mit vier Knochen auf der GPU, bis zu 128 Joints pro Skelett.", "li.box4": "Jolt-Physik — Rigid- und Soft-Bodies, Charaktercontroller, Fahrzeuge, Raycasts, Constraints, Kontakt-Callbacks. Das Web-Target nutzt den JoltPhysics.js-Fallback, sodass derselbe Code im Browser läuft.", diff --git a/src/messages/en.json b/src/messages/en.json index 6e6596b..c5e63fd 100644 --- a/src/messages/en.json +++ b/src/messages/en.json @@ -1,6 +1,6 @@ { "meta": { - "defaultDescription": "Native games from TypeScript. Write TypeScript. Ship native games. No browser, no C++.", + "defaultDescription": "Native games from TypeScript: ahead-of-time native builds without an embedded browser, plus WebAssembly for the web.", "languageLabel": "Language" }, "nav": { @@ -25,7 +25,7 @@ "heroBadge": "Open Source Game Engine", "heroTitlePrefix": "Native games from ", "heroTitleHighlight": "TypeScript", - "heroDesc": "Write TypeScript. Ship native games. No browser, no C++. Bloom compiles your game ahead-of-time and runs it on Metal, DirectX 12, Vulkan and WebGPU — one codebase, six targets, real PBR rendering and physics out of the box.", + "heroDesc": "Write TypeScript. Ship native games without an embedded browser or C++. Bloom compiles your game ahead-of-time and runs it on Metal, DirectX 12, Vulkan and WebGPU — one codebase, nine targets, real PBR rendering and physics out of the box.", "getStarted": "Get Started", "viewOnGithub": "View on GitHub", "proof": { @@ -36,10 +36,10 @@ }, "why": { "title": "Why Bloom?", - "desc": "Bloom is the only game engine that lets you write TypeScript and ship truly native games. No Electron, no WebView, no browser runtime. Your code is compiled ahead-of-time by the Perry compiler and runs against a Rust core.", + "desc": "Bloom compiles TypeScript games ahead-of-time against a Rust core. Native targets use no Electron, WebView, or embedded browser runtime; the Web target emits WebAssembly.", "simpleApi": { "title": "Simple API", - "desc": "The entire API fits on a cheatsheet. No classes, no inheritance, no magic. Just functions you call." + "desc": "The gameplay API is function-first: plain data, explicit handles, and functions you call. Specialized tooling adds only small helper abstractions." }, "trueNative": { "title": "True Native", @@ -47,12 +47,12 @@ }, "shipEverywhere": { "title": "Ship Everywhere", - "desc": "macOS, Windows, Linux, iOS, tvOS and the Web from one codebase. Steam, App Store and itch.io ready." + "desc": "macOS, Windows, Linux, iOS, tvOS, watchOS, visionOS, Android and the Web from one codebase." } }, "modules": { "title": "Everything you need", - "desc": "Nine modular subsystems, each independently importable. Use only what you need.", + "desc": "Thirteen modular subsystems, each independently importable. Use only what you need.", "items": [ { "id": "core", "title": "Core", "desc": "Window creation, game loop, input handling, timing, and frame control." }, { "id": "shapes", "title": "Shapes", "desc": "2D shape drawing — lines, rects, circles, polygons — plus collision detection." }, @@ -62,7 +62,11 @@ { "id": "models", "title": "Models", "desc": "glTF 2.0 loading, GPU skeletal animation, PBR materials, mesh primitives." }, { "id": "math", "title": "Math", "desc": "Vectors, matrices, quaternions, easing functions, and random number generation." }, { "id": "physics", "title": "Physics", "desc": "Jolt-powered rigid & soft bodies, character controllers, vehicles, raycasts, constraints." }, - { "id": "scene", "title": "Scene", "desc": "Retained-mode scene graph — transforms, visibility, shadows, material binding." } + { "id": "scene", "title": "Scene", "desc": "Retained-mode scene graph — transforms, visibility, shadows, material binding." }, + { "id": "mobile", "title": "Mobile", "desc": "Virtual controls, safe areas, and touch-input helpers." }, + { "id": "world", "title": "World", "desc": "Versioned world loading, validation, prefabs, and runtime instantiation." }, + { "id": "vfx", "title": "VFX", "desc": "GPU particle systems, emitters, and decals." }, + { "id": "quality", "title": "Quality", "desc": "Deterministic quality runs, captures, and telemetry." } ] }, "platforms": { @@ -143,7 +147,7 @@ "p.whyWgpu2": "Instead, the entire renderer is written once on top of wgpu. Shaders are WGSL. We get Metal on Apple platforms, DirectX 12 on Windows, Vulkan on Linux and Android, and WebGPU (with a WebGL fallback) in the browser — from one codebase. The cost is that we are bound to wgpu's feature set, and a few exotic things (mesh shaders, ray tracing) are off the table for now. We think that's a fair trade for a small team.", "h.box": "What's actually in the box today", "p.box": "We try not to put anything on the marketing site that does not work. Here is what is real, today:", - "li.box1": "Nine importable modulesbloom/core, bloom/shapes, bloom/textures, bloom/text, bloom/audio, bloom/models, bloom/math, bloom/physics and bloom/scene.", + "li.box1": "Nine importable modules@bloomengine/engine/core, @bloomengine/engine/shapes, @bloomengine/engine/textures, @bloomengine/engine/text, @bloomengine/engine/audio, @bloomengine/engine/models, @bloomengine/engine/math, @bloomengine/engine/physics and @bloomengine/engine/scene.", "li.box2": "A real PBR renderer — substrate-style layered materials, cascaded shadow maps with caching for static geometry, ACES/AgX tone mapping, auto-exposure, bloom, depth of field, motion blur, SSGI, SSAO, TAA, and a CAS sharpen pass for fractional render scales.", "li.box3": "GPU skeletal animation — glTF 2.0 import, four-bone linear blend skinning on the GPU, up to 128 joints per skeleton.", "li.box4": "Jolt physics — rigid and soft bodies, character controllers, vehicles, raycasts, constraints, contact callbacks. The web target uses the JoltPhysics.js fallback so the same code runs in the browser.", diff --git a/src/messages/es.json b/src/messages/es.json index 85f41e1..6a1109f 100644 --- a/src/messages/es.json +++ b/src/messages/es.json @@ -1,6 +1,6 @@ { "meta": { - "defaultDescription": "Juegos nativos desde TypeScript. Escribe TypeScript. Publica juegos nativos. Sin navegador, sin C++.", + "defaultDescription": "Juegos nativos desde TypeScript: compilaciones anticipadas sin navegador integrado y WebAssembly para la web.", "languageLabel": "Idioma" }, "nav": { @@ -25,7 +25,7 @@ "heroBadge": "Motor de juego de código abierto", "heroTitlePrefix": "Juegos nativos desde ", "heroTitleHighlight": "TypeScript", - "heroDesc": "Escribe TypeScript. Publica juegos nativos. Sin navegador, sin C++. Bloom compila tu juego de forma anticipada y lo ejecuta en Metal, DirectX 12, Vulkan y WebGPU — una sola base de código, seis destinos, renderizado PBR real y físicas listas desde el primer momento.", + "heroDesc": "Escribe TypeScript y publica juegos nativos sin navegador integrado ni C++. Bloom compila tu juego de forma anticipada y lo ejecuta en Metal, DirectX 12, Vulkan y WebGPU — una sola base de código, nueve destinos, renderizado PBR real y físicas listas desde el primer momento.", "getStarted": "Comenzar", "viewOnGithub": "Ver en GitHub", "proof": { @@ -36,10 +36,10 @@ }, "why": { "title": "¿Por qué Bloom?", - "desc": "Bloom es el único motor de juego que te permite escribir TypeScript y publicar juegos verdaderamente nativos. Sin Electron, sin WebView, sin runtime de navegador. Tu código se compila de forma anticipada con el compilador Perry y corre sobre un núcleo en Rust.", + "desc": "Bloom compila juegos TypeScript de forma anticipada sobre un núcleo en Rust. Los destinos nativos no usan Electron, WebView ni un runtime de navegador integrado; el destino Web genera WebAssembly.", "simpleApi": { "title": "API sencilla", - "desc": "Toda la API cabe en una hoja de referencia. Sin clases, sin herencia, sin magia. Solo funciones que invocas." + "desc": "La API de juego prioriza funciones: datos simples, identificadores explícitos y funciones directas. Las herramientas especializadas solo añaden pequeñas abstracciones auxiliares." }, "trueNative": { "title": "Verdaderamente nativo", @@ -47,12 +47,12 @@ }, "shipEverywhere": { "title": "Publica en todas partes", - "desc": "macOS, Windows, Linux, iOS, tvOS y la Web desde una sola base de código. Listo para Steam, App Store e itch.io." + "desc": "macOS, Windows, Linux, iOS, tvOS, watchOS, visionOS, Android y la Web desde una sola base de código." } }, "modules": { "title": "Todo lo que necesitas", - "desc": "Nueve subsistemas modulares, cada uno importable de forma independiente. Usa solo lo que necesites.", + "desc": "Trece subsistemas modulares, cada uno importable de forma independiente. Usa solo lo que necesites.", "items": [ { "id": "core", "title": "Core", "desc": "Creación de ventanas, bucle de juego, manejo de entrada, temporización y control de cuadros." }, { "id": "shapes", "title": "Shapes", "desc": "Dibujo de formas 2D — líneas, rectángulos, círculos, polígonos — más detección de colisiones." }, @@ -62,7 +62,11 @@ { "id": "models", "title": "Models", "desc": "Carga glTF 2.0, animación esqueletal por GPU, materiales PBR, primitivas de malla." }, { "id": "math", "title": "Math", "desc": "Vectores, matrices, cuaterniones, funciones de easing y generación de números aleatorios." }, { "id": "physics", "title": "Physics", "desc": "Cuerpos rígidos y blandos con Jolt, controladores de personaje, vehículos, raycasts y restricciones." }, - { "id": "scene", "title": "Scene", "desc": "Grafo de escena en modo retenido — transformaciones, visibilidad, sombras y enlace de materiales." } + { "id": "scene", "title": "Scene", "desc": "Grafo de escena en modo retenido — transformaciones, visibilidad, sombras y enlace de materiales." }, + { "id": "mobile", "title": "Móvil", "desc": "Controles virtuales, áreas seguras y ayudas para entrada táctil." }, + { "id": "world", "title": "Mundo", "desc": "Carga y validación versionada de mundos, prefabs e instanciación en tiempo de ejecución." }, + { "id": "vfx", "title": "VFX", "desc": "Sistemas de partículas GPU, emisores y calcomanías." }, + { "id": "quality", "title": "Calidad", "desc": "Pruebas de calidad deterministas, capturas y telemetría." } ] }, "platforms": { @@ -143,7 +147,7 @@ "p.whyWgpu2": "En cambio, todo el renderer está escrito una sola vez sobre wgpu. Los shaders son WGSL. Obtenemos Metal en plataformas Apple, DirectX 12 en Windows, Vulkan en Linux y Android, y WebGPU (con un respaldo en WebGL) en el navegador — desde una sola base de código. El costo es que estamos atados al conjunto de funcionalidades de wgpu, y algunas cosas exóticas (mesh shaders, ray tracing) están fuera de la mesa por ahora. Pensamos que es un trato justo para un equipo pequeño.", "h.box": "Qué hay realmente listo hoy", "p.box": "Tratamos de no poner nada en el sitio de marketing que no funcione. Esto es lo que es real, hoy:", - "li.box1": "Nueve módulos importablesbloom/core, bloom/shapes, bloom/textures, bloom/text, bloom/audio, bloom/models, bloom/math, bloom/physics y bloom/scene.", + "li.box1": "Nueve módulos importables@bloomengine/engine/core, @bloomengine/engine/shapes, @bloomengine/engine/textures, @bloomengine/engine/text, @bloomengine/engine/audio, @bloomengine/engine/models, @bloomengine/engine/math, @bloomengine/engine/physics y @bloomengine/engine/scene.", "li.box2": "Un renderer PBR real — materiales en capas estilo substrate, mapas de sombras en cascada con caché para geometría estática, tone mapping ACES/AgX, autoexposición, bloom, profundidad de campo, motion blur, SSGI, SSAO, TAA y un paso de nitidez CAS para escalas de renderizado fraccionarias.", "li.box3": "Animación esqueletal por GPU — importación de glTF 2.0, linear blend skinning de cuatro huesos en la GPU, hasta 128 articulaciones por esqueleto.", "li.box4": "Físicas con Jolt — cuerpos rígidos y blandos, controladores de personaje, vehículos, raycasts, restricciones, callbacks de contacto. El destino web usa el respaldo de JoltPhysics.js para que el mismo código corra en el navegador.", diff --git a/src/messages/fr.json b/src/messages/fr.json index b516aca..5087bb1 100644 --- a/src/messages/fr.json +++ b/src/messages/fr.json @@ -1,6 +1,6 @@ { "meta": { - "defaultDescription": "Des jeux natifs en TypeScript. Écrivez du TypeScript. Livrez des jeux natifs. Pas de navigateur, pas de C++.", + "defaultDescription": "Des jeux natifs en TypeScript : builds compilés en amont sans navigateur intégré, plus WebAssembly pour le web.", "languageLabel": "Langue" }, "nav": { @@ -25,7 +25,7 @@ "heroBadge": "Moteur de jeu open source", "heroTitlePrefix": "Des jeux natifs en ", "heroTitleHighlight": "TypeScript", - "heroDesc": "Écrivez du TypeScript. Livrez des jeux natifs. Pas de navigateur, pas de C++. Bloom compile votre jeu en amont et l'exécute sur Metal, DirectX 12, Vulkan et WebGPU — un seul code, six cibles, du vrai rendu PBR et de la physique prêts à l'emploi.", + "heroDesc": "Écrivez du TypeScript et livrez des jeux natifs sans navigateur intégré ni C++. Bloom compile votre jeu en amont et l'exécute sur Metal, DirectX 12, Vulkan et WebGPU — un seul code, neuf cibles, du vrai rendu PBR et de la physique prêts à l'emploi.", "getStarted": "Commencer", "viewOnGithub": "Voir sur GitHub", "proof": { @@ -36,10 +36,10 @@ }, "why": { "title": "Pourquoi Bloom ?", - "desc": "Bloom est le seul moteur de jeu qui vous permet d'écrire du TypeScript et de livrer des jeux véritablement natifs. Pas d'Electron, pas de WebView, pas de runtime de navigateur. Votre code est compilé en amont par le compilateur Perry et s'exécute sur un cœur écrit en Rust.", + "desc": "Bloom compile les jeux TypeScript en amont sur un cœur Rust. Les cibles natives n'utilisent ni Electron, ni WebView, ni navigateur intégré ; la cible Web produit du WebAssembly.", "simpleApi": { "title": "API simple", - "desc": "Toute l'API tient sur un aide-mémoire. Pas de classes, pas d'héritage, pas de magie. Juste des fonctions que vous appelez." + "desc": "L'API de jeu privilégie les fonctions : données simples, handles explicites et appels directs. Les outils spécialisés n'ajoutent que de petites abstractions pratiques." }, "trueNative": { "title": "Vraiment natif", @@ -47,12 +47,12 @@ }, "shipEverywhere": { "title": "Livrez partout", - "desc": "macOS, Windows, Linux, iOS, tvOS et le Web depuis une seule base de code. Prêt pour Steam, App Store et itch.io." + "desc": "macOS, Windows, Linux, iOS, tvOS, watchOS, visionOS, Android et le Web depuis une seule base de code." } }, "modules": { "title": "Tout ce dont vous avez besoin", - "desc": "Neuf sous-systèmes modulaires, chacun importable indépendamment. N'utilisez que ce dont vous avez besoin.", + "desc": "Treize sous-systèmes modulaires, chacun importable indépendamment. N'utilisez que ce dont vous avez besoin.", "items": [ { "id": "core", "title": "Core", "desc": "Création de fenêtre, boucle de jeu, gestion des entrées, timing et contrôle des frames." }, { "id": "shapes", "title": "Shapes", "desc": "Dessin de formes 2D — lignes, rectangles, cercles, polygones — plus la détection de collisions." }, @@ -62,7 +62,11 @@ { "id": "models", "title": "Models", "desc": "Chargement glTF 2.0, animation squelettique GPU, matériaux PBR, primitives de mesh." }, { "id": "math", "title": "Math", "desc": "Vecteurs, matrices, quaternions, fonctions d'easing et génération de nombres aléatoires." }, { "id": "physics", "title": "Physics", "desc": "Corps rigides et mous propulsés par Jolt, contrôleurs de personnage, véhicules, raycasts, contraintes." }, - { "id": "scene", "title": "Scene", "desc": "Graphe de scène en mode retenu — transformations, visibilité, ombres, liaison de matériaux." } + { "id": "scene", "title": "Scene", "desc": "Graphe de scène en mode retenu — transformations, visibilité, ombres, liaison de matériaux." }, + { "id": "mobile", "title": "Mobile", "desc": "Commandes virtuelles, zones sûres et aides à la saisie tactile." }, + { "id": "world", "title": "Monde", "desc": "Chargement et validation versionnés des mondes, préfabriqués et instanciation à l'exécution." }, + { "id": "vfx", "title": "VFX", "desc": "Systèmes de particules GPU, émetteurs et décalcomanies." }, + { "id": "quality", "title": "Qualité", "desc": "Tests qualité déterministes, captures et télémétrie." } ] }, "platforms": { @@ -143,7 +147,7 @@ "p.whyWgpu2": "À la place, tout le renderer est écrit une seule fois au-dessus de wgpu. Les shaders sont en WGSL. Nous obtenons Metal sur les plateformes Apple, DirectX 12 sur Windows, Vulkan sur Linux et Android, et WebGPU (avec un repli WebGL) dans le navigateur — depuis une seule base de code. Le coût, c'est que nous sommes liés à l'ensemble des fonctionnalités de wgpu, et que quelques choses exotiques (mesh shaders, ray tracing) sont hors de portée pour l'instant. Nous trouvons que c'est un compromis honnête pour une petite équipe.", "h.box": "Ce qui est réellement disponible aujourd'hui", "p.box": "Nous essayons de ne rien mettre sur le site marketing qui ne fonctionne pas. Voici ce qui est réel, aujourd'hui :", - "li.box1": "Neuf modules importablesbloom/core, bloom/shapes, bloom/textures, bloom/text, bloom/audio, bloom/models, bloom/math, bloom/physics et bloom/scene.", + "li.box1": "Neuf modules importables@bloomengine/engine/core, @bloomengine/engine/shapes, @bloomengine/engine/textures, @bloomengine/engine/text, @bloomengine/engine/audio, @bloomengine/engine/models, @bloomengine/engine/math, @bloomengine/engine/physics et @bloomengine/engine/scene.", "li.box2": "Un véritable renderer PBR — matériaux en couches façon substrate, shadow maps en cascade avec mise en cache pour la géométrie statique, tone mapping ACES/AgX, auto-exposition, bloom, profondeur de champ, motion blur, SSGI, SSAO, TAA, et une passe de netteté CAS pour les échelles de rendu fractionnaires.", "li.box3": "Animation squelettique GPU — import glTF 2.0, skinning à mélange linéaire à quatre os sur le GPU, jusqu'à 128 articulations par squelette.", "li.box4": "Physique Jolt — corps rigides et mous, contrôleurs de personnage, véhicules, raycasts, contraintes, callbacks de contact. La cible web utilise le repli JoltPhysics.js pour que le même code tourne dans le navigateur.", diff --git a/src/messages/id.json b/src/messages/id.json index 5378d8e..9fe315c 100644 --- a/src/messages/id.json +++ b/src/messages/id.json @@ -1,6 +1,6 @@ { "meta": { - "defaultDescription": "Game native dari TypeScript. Tulis TypeScript. Rilis game native. Tanpa browser, tanpa C++.", + "defaultDescription": "Game native dari TypeScript: build ahead-of-time tanpa browser tertanam, plus WebAssembly untuk web.", "languageLabel": "Bahasa" }, "nav": { @@ -25,7 +25,7 @@ "heroBadge": "Game Engine Open Source", "heroTitlePrefix": "Game native dari ", "heroTitleHighlight": "TypeScript", - "heroDesc": "Tulis TypeScript. Rilis game native. Tanpa browser, tanpa C++. Bloom mengompilasi game kamu secara ahead-of-time dan menjalankannya di Metal, DirectX 12, Vulkan dan WebGPU — satu codebase, enam target, rendering PBR sungguhan dan physics siap pakai.", + "heroDesc": "Tulis TypeScript dan rilis game native tanpa browser tertanam atau C++. Bloom mengompilasi game kamu secara ahead-of-time dan menjalankannya di Metal, DirectX 12, Vulkan dan WebGPU — satu codebase, sembilan target, rendering PBR sungguhan dan physics siap pakai.", "getStarted": "Mulai Sekarang", "viewOnGithub": "Lihat di GitHub", "proof": { @@ -36,10 +36,10 @@ }, "why": { "title": "Kenapa Bloom?", - "desc": "Bloom adalah satu-satunya game engine yang memungkinkan kamu menulis TypeScript dan merilis game yang benar-benar native. Tanpa Electron, tanpa WebView, tanpa runtime browser. Kode kamu dikompilasi ahead-of-time oleh kompiler Perry dan berjalan di atas core Rust.", + "desc": "Bloom mengompilasi game TypeScript secara ahead-of-time di atas core Rust. Target native tidak memakai Electron, WebView, atau runtime browser tertanam; target Web menghasilkan WebAssembly.", "simpleApi": { "title": "API Sederhana", - "desc": "Seluruh API muat di satu cheatsheet. Tanpa class, tanpa inheritance, tanpa sihir. Hanya fungsi yang kamu panggil." + "desc": "API gameplay mengutamakan fungsi: data sederhana, handle eksplisit, dan fungsi langsung. Tool khusus hanya menambahkan abstraksi bantuan kecil." }, "trueNative": { "title": "Benar-benar Native", @@ -47,12 +47,12 @@ }, "shipEverywhere": { "title": "Rilis ke Mana Saja", - "desc": "macOS, Windows, Linux, iOS, tvOS dan Web dari satu codebase. Siap untuk Steam, App Store dan itch.io." + "desc": "macOS, Windows, Linux, iOS, tvOS, watchOS, visionOS, Android dan Web dari satu codebase." } }, "modules": { "title": "Semua yang kamu butuhkan", - "desc": "Sembilan subsistem modular, masing-masing bisa diimpor secara terpisah. Pakai hanya yang kamu butuhkan.", + "desc": "Tiga belas subsistem modular, masing-masing bisa diimpor secara terpisah. Pakai hanya yang kamu butuhkan.", "items": [ { "id": "core", "title": "Core", "desc": "Pembuatan window, game loop, penanganan input, timing, dan kontrol frame." }, { "id": "shapes", "title": "Shapes", "desc": "Menggambar bentuk 2D — garis, persegi, lingkaran, poligon — plus deteksi tabrakan." }, @@ -62,7 +62,11 @@ { "id": "models", "title": "Models", "desc": "Pemuatan glTF 2.0, animasi skeletal di GPU, material PBR, mesh primitif." }, { "id": "math", "title": "Math", "desc": "Vektor, matriks, kuaternion, fungsi easing, dan pembangkit angka acak." }, { "id": "physics", "title": "Physics", "desc": "Rigid & soft body bertenaga Jolt, character controller, kendaraan, raycast, constraint." }, - { "id": "scene", "title": "Scene", "desc": "Scene graph mode retained — transform, visibilitas, bayangan, binding material." } + { "id": "scene", "title": "Scene", "desc": "Scene graph mode retained — transform, visibilitas, bayangan, binding material." }, + { "id": "mobile", "title": "Mobile", "desc": "Kontrol virtual, safe area, dan helper input sentuh." }, + { "id": "world", "title": "World", "desc": "Pemuatan dan validasi world berversi, prefab, serta instansiasi runtime." }, + { "id": "vfx", "title": "VFX", "desc": "Sistem partikel GPU, emitter, dan decal." }, + { "id": "quality", "title": "Quality", "desc": "Pengujian kualitas deterministik, capture, dan telemetri." } ] }, "platforms": { @@ -143,7 +147,7 @@ "p.whyWgpu2": "Sebagai gantinya, seluruh renderer ditulis sekali di atas wgpu. Shader pakai WGSL. Kami dapat Metal di platform Apple, DirectX 12 di Windows, Vulkan di Linux dan Android, serta WebGPU (dengan fallback WebGL) di browser — dari satu codebase. Konsekuensinya, kami terikat ke set fitur wgpu, dan beberapa hal eksotis (mesh shader, ray tracing) belum bisa untuk sekarang. Buat tim kecil, kami pikir itu pertukaran yang adil.", "h.box": "Apa yang sebenarnya sudah ada hari ini", "p.box": "Kami berusaha tidak menaruh apa pun di situs marketing yang belum berfungsi. Berikut yang sudah nyata, hari ini:", - "li.box1": "Sembilan modul yang bisa diimporbloom/core, bloom/shapes, bloom/textures, bloom/text, bloom/audio, bloom/models, bloom/math, bloom/physics dan bloom/scene.", + "li.box1": "Sembilan modul yang bisa diimpor@bloomengine/engine/core, @bloomengine/engine/shapes, @bloomengine/engine/textures, @bloomengine/engine/text, @bloomengine/engine/audio, @bloomengine/engine/models, @bloomengine/engine/math, @bloomengine/engine/physics dan @bloomengine/engine/scene.", "li.box2": "Renderer PBR sungguhan — material berlapis bergaya substrate, cascaded shadow map dengan caching untuk geometri statis, tone mapping ACES/AgX, auto-exposure, bloom, depth of field, motion blur, SSGI, SSAO, TAA, dan CAS sharpen pass untuk skala render pecahan.", "li.box3": "Animasi skeletal di GPU — impor glTF 2.0, linear blend skinning empat-tulang di GPU, hingga 128 sendi per skeleton.", "li.box4": "Physics Jolt — rigid dan soft body, character controller, kendaraan, raycast, constraint, callback kontak. Target web menggunakan fallback JoltPhysics.js sehingga kode yang sama berjalan di browser.", diff --git a/src/messages/it.json b/src/messages/it.json index 845ddbb..5ef49dd 100644 --- a/src/messages/it.json +++ b/src/messages/it.json @@ -1,6 +1,6 @@ { "meta": { - "defaultDescription": "Giochi nativi da TypeScript. Scrivi TypeScript. Pubblica giochi nativi. Niente browser, niente C++.", + "defaultDescription": "Giochi nativi da TypeScript: build ahead-of-time senza browser incorporato e WebAssembly per il web.", "languageLabel": "Lingua" }, "nav": { @@ -25,7 +25,7 @@ "heroBadge": "Game Engine Open Source", "heroTitlePrefix": "Giochi nativi da ", "heroTitleHighlight": "TypeScript", - "heroDesc": "Scrivi TypeScript. Pubblica giochi nativi. Niente browser, niente C++. Bloom compila il tuo gioco ahead-of-time e lo esegue su Metal, DirectX 12, Vulkan e WebGPU — un'unica codebase, sei target, rendering PBR reale e fisica pronti all'uso.", + "heroDesc": "Scrivi TypeScript e pubblica giochi nativi senza browser incorporato né C++. Bloom compila il tuo gioco ahead-of-time e lo esegue su Metal, DirectX 12, Vulkan e WebGPU — un'unica codebase, nove target, rendering PBR reale e fisica pronti all'uso.", "getStarted": "Inizia subito", "viewOnGithub": "Guarda su GitHub", "proof": { @@ -36,10 +36,10 @@ }, "why": { "title": "Perché Bloom?", - "desc": "Bloom è l'unico game engine che ti permette di scrivere TypeScript e distribuire giochi davvero nativi. Niente Electron, niente WebView, niente runtime browser. Il tuo codice viene compilato ahead-of-time dal compilatore Perry e gira su un core in Rust.", + "desc": "Bloom compila i giochi TypeScript ahead-of-time su un core Rust. I target nativi non usano Electron, WebView o un runtime browser incorporato; il target Web genera WebAssembly.", "simpleApi": { "title": "API semplice", - "desc": "L'intera API ci sta su un foglio riassuntivo. Niente classi, niente ereditarietà, niente magia. Solo funzioni che chiami." + "desc": "L'API di gioco privilegia le funzioni: dati semplici, handle espliciti e chiamate dirette. Gli strumenti specializzati aggiungono solo piccole astrazioni di supporto." }, "trueNative": { "title": "Davvero nativo", @@ -47,12 +47,12 @@ }, "shipEverywhere": { "title": "Pubblica ovunque", - "desc": "macOS, Windows, Linux, iOS, tvOS e Web da un'unica codebase. Pronto per Steam, App Store e itch.io." + "desc": "macOS, Windows, Linux, iOS, tvOS, watchOS, visionOS, Android e Web da un'unica codebase." } }, "modules": { "title": "Tutto ciò che ti serve", - "desc": "Nove sottosistemi modulari, ciascuno importabile in modo indipendente. Usa solo ciò di cui hai bisogno.", + "desc": "Tredici sottosistemi modulari, ciascuno importabile in modo indipendente. Usa solo ciò di cui hai bisogno.", "items": [ { "id": "core", "title": "Core", "desc": "Creazione finestre, game loop, gestione input, timing e controllo dei frame." }, { "id": "shapes", "title": "Shapes", "desc": "Disegno di forme 2D — linee, rettangoli, cerchi, poligoni — più rilevamento collisioni." }, @@ -62,7 +62,11 @@ { "id": "models", "title": "Models", "desc": "Caricamento glTF 2.0, animazione scheletrica su GPU, materiali PBR, primitive mesh." }, { "id": "math", "title": "Math", "desc": "Vettori, matrici, quaternioni, funzioni di easing e generazione di numeri casuali." }, { "id": "physics", "title": "Physics", "desc": "Corpi rigidi e soft basati su Jolt, character controller, veicoli, raycast, vincoli." }, - { "id": "scene", "title": "Scene", "desc": "Scene graph in retained-mode — trasformazioni, visibilità, ombre, binding dei materiali." } + { "id": "scene", "title": "Scene", "desc": "Scene graph in retained-mode — trasformazioni, visibilità, ombre, binding dei materiali." }, + { "id": "mobile", "title": "Mobile", "desc": "Controlli virtuali, aree sicure e helper per l'input touch." }, + { "id": "world", "title": "Mondo", "desc": "Caricamento e validazione versionati dei mondi, prefab e istanziazione runtime." }, + { "id": "vfx", "title": "VFX", "desc": "Sistemi di particelle GPU, emettitori e decal." }, + { "id": "quality", "title": "Qualità", "desc": "Sessioni di qualità deterministiche, acquisizioni e telemetria." } ] }, "platforms": { @@ -143,7 +147,7 @@ "p.whyWgpu2": "Invece, l'intero renderer è scritto una sola volta sopra wgpu. Gli shader sono in WGSL. Otteniamo Metal sulle piattaforme Apple, DirectX 12 su Windows, Vulkan su Linux e Android e WebGPU (con fallback WebGL) nel browser — da un'unica codebase. Il prezzo è che siamo legati al feature set di wgpu, e alcune cose esotiche (mesh shader, ray tracing) sono fuori discussione per ora. Ci sembra uno scambio equo per un piccolo team.", "h.box": "Cosa c'è davvero dentro oggi", "p.box": "Cerchiamo di non mettere sul sito di marketing nulla che non funzioni. Ecco cos'è reale, oggi:", - "li.box1": "Nove moduli importabilibloom/core, bloom/shapes, bloom/textures, bloom/text, bloom/audio, bloom/models, bloom/math, bloom/physics e bloom/scene.", + "li.box1": "Nove moduli importabili@bloomengine/engine/core, @bloomengine/engine/shapes, @bloomengine/engine/textures, @bloomengine/engine/text, @bloomengine/engine/audio, @bloomengine/engine/models, @bloomengine/engine/math, @bloomengine/engine/physics e @bloomengine/engine/scene.", "li.box2": "Un vero renderer PBR — materiali a strati in stile substrate, cascaded shadow map con caching per la geometria statica, tone mapping ACES/AgX, esposizione automatica, bloom, depth of field, motion blur, SSGI, SSAO, TAA e un passaggio di sharpening CAS per scale di rendering frazionarie.", "li.box3": "Animazione scheletrica su GPU — import glTF 2.0, linear blend skinning a quattro ossa sulla GPU, fino a 128 joint per scheletro.", "li.box4": "Fisica Jolt — corpi rigidi e soft, character controller, veicoli, raycast, vincoli, callback di contatto. Il target web usa il fallback JoltPhysics.js, così lo stesso codice gira nel browser.", diff --git a/src/messages/ja.json b/src/messages/ja.json index ab02073..d04d261 100644 --- a/src/messages/ja.json +++ b/src/messages/ja.json @@ -1,6 +1,6 @@ { "meta": { - "defaultDescription": "TypeScript からネイティブゲームを。TypeScript で書き、ネイティブゲームを出荷します。ブラウザも C++ も不要です。", + "defaultDescription": "TypeScript からネイティブゲームを。組み込みブラウザなしの事前コンパイルと、Web 向け WebAssembly に対応します。", "languageLabel": "言語" }, "nav": { @@ -25,7 +25,7 @@ "heroBadge": "オープンソースゲームエンジン", "heroTitlePrefix": "ネイティブゲームを ", "heroTitleHighlight": "TypeScript", - "heroDesc": "TypeScript で書き、ネイティブゲームを出荷します。ブラウザも C++ も不要です。Bloom はゲームを事前コンパイルし、Metal、DirectX 12、Vulkan、WebGPU 上で動作させます。1 つのコードベースで 6 つのターゲット、本格的な PBR レンダリングと物理演算を標準で備えます。", + "heroDesc": "TypeScript で書き、組み込みブラウザや C++ なしでネイティブゲームを出荷します。Bloom はゲームを事前コンパイルし、Metal、DirectX 12、Vulkan、WebGPU 上で動作させます。1 つのコードベースで 9 つのターゲット、本格的な PBR レンダリングと物理演算を標準で備えます。", "getStarted": "はじめる", "viewOnGithub": "GitHub で見る", "proof": { @@ -36,10 +36,10 @@ }, "why": { "title": "なぜ Bloom なのか?", - "desc": "Bloom は TypeScript で書いて真にネイティブなゲームを出荷できる唯一のゲームエンジンです。Electron も WebView もブラウザランタイムも使いません。コードは Perry コンパイラによって事前コンパイルされ、Rust コアの上で動作します。", + "desc": "Bloom は TypeScript ゲームを Rust コア向けに事前コンパイルします。ネイティブターゲットは Electron、WebView、組み込みブラウザランタイムを使わず、Web ターゲットは WebAssembly を生成します。", "simpleApi": { "title": "シンプルな API", - "desc": "API 全体がチートシート 1 枚に収まります。クラスも継承も魔法もありません。呼び出すのは関数だけです。" + "desc": "ゲームプレイ API は関数中心です。単純なデータ、明示的なハンドル、直接呼び出す関数で構成され、専用ツールだけが小さな補助抽象を追加します。" }, "trueNative": { "title": "真のネイティブ", @@ -47,12 +47,12 @@ }, "shipEverywhere": { "title": "あらゆる場所へ出荷", - "desc": "macOS、Windows、Linux、iOS、tvOS、Web を 1 つのコードベースから。Steam、App Store、itch.io にすぐ対応できます。" + "desc": "macOS、Windows、Linux、iOS、tvOS、watchOS、visionOS、Android、Web を 1 つのコードベースから。" } }, "modules": { "title": "必要なものはすべて揃っています", - "desc": "9 つのモジュール式サブシステムが、それぞれ独立してインポート可能です。必要なものだけをご利用いただけます。", + "desc": "13 のモジュール式サブシステムが、それぞれ独立してインポート可能です。必要なものだけをご利用いただけます。", "items": [ { "id": "core", "title": "Core", "desc": "ウィンドウ生成、ゲームループ、入力処理、タイミング制御、フレーム制御。" }, { "id": "shapes", "title": "Shapes", "desc": "2D 図形描画 — 線、矩形、円、ポリゴン — に加えて衝突判定。" }, @@ -62,7 +62,11 @@ { "id": "models", "title": "Models", "desc": "glTF 2.0 読み込み、GPU スケルタルアニメーション、PBR マテリアル、メッシュプリミティブ。" }, { "id": "math", "title": "Math", "desc": "ベクトル、行列、クォータニオン、イージング関数、乱数生成。" }, { "id": "physics", "title": "Physics", "desc": "Jolt によるリジッドボディとソフトボディ、キャラクターコントローラー、車両、レイキャスト、コンストレイント。" }, - { "id": "scene", "title": "Scene", "desc": "保持モードのシーングラフ — トランスフォーム、可視性、シャドウ、マテリアルバインディング。" } + { "id": "scene", "title": "Scene", "desc": "保持モードのシーングラフ — トランスフォーム、可視性、シャドウ、マテリアルバインディング。" }, + { "id": "mobile", "title": "Mobile", "desc": "仮想コントロール、セーフエリア、タッチ入力ヘルパー。" }, + { "id": "world", "title": "World", "desc": "バージョン管理されたワールドの読み込み、検証、プレハブ、ランタイム生成。" }, + { "id": "vfx", "title": "VFX", "desc": "GPU パーティクルシステム、エミッター、デカール。" }, + { "id": "quality", "title": "Quality", "desc": "決定論的な品質テスト、キャプチャ、テレメトリ。" } ] }, "platforms": { @@ -143,7 +147,7 @@ "p.whyWgpu2": "代わりに、レンダラー全体を wgpu の上に一度だけ書きました。シェーダーは WGSL です。Apple プラットフォームでは Metal、Windows では DirectX 12、Linux と Android では Vulkan、ブラウザでは WebGPU (WebGL フォールバック付き) を 1 つのコードベースから得ています。コストとして wgpu の機能セットに縛られ、いくつかのエキゾチックなもの (メッシュシェーダー、レイトレーシング) は当面利用できません。小さなチームにとっては、これは妥当な取引だと考えています。", "h.box": "今日、実際に箱の中に入っているもの", "p.box": "動かないものをマーケティングサイトに載せないようにしています。今日、実在するのはこちらです:", - "li.box1": "9 つのインポート可能なモジュールbloom/corebloom/shapesbloom/texturesbloom/textbloom/audiobloom/modelsbloom/mathbloom/physics、そして bloom/scene。", + "li.box1": "9 つのインポート可能なモジュール@bloomengine/engine/core@bloomengine/engine/shapes@bloomengine/engine/textures@bloomengine/engine/text@bloomengine/engine/audio@bloomengine/engine/models@bloomengine/engine/math@bloomengine/engine/physics、そして @bloomengine/engine/scene。", "li.box2": "本格的な PBR レンダラー — サブストレート方式のレイヤードマテリアル、静的ジオメトリ向けにキャッシュされるカスケードシャドウマップ、ACES/AgX トーンマッピング、自動露出、ブルーム、被写界深度、モーションブラー、SSGI、SSAO、TAA、そして分数レンダースケール用の CAS シャープニングパス。", "li.box3": "GPU スケルタルアニメーション — glTF 2.0 インポート、GPU 上での 4 ボーンリニアブレンドスキニング、スケルトンあたり最大 128 ジョイント。", "li.box4": "Jolt 物理 — リジッドボディとソフトボディ、キャラクターコントローラー、車両、レイキャスト、コンストレイント、コンタクトコールバック。Web ターゲットでは JoltPhysics.js フォールバックを使用するため、同じコードがブラウザでも動作します。", diff --git a/src/messages/ko.json b/src/messages/ko.json index a45f3da..94cce0e 100644 --- a/src/messages/ko.json +++ b/src/messages/ko.json @@ -1,6 +1,6 @@ { "meta": { - "defaultDescription": "TypeScript로 만드는 네이티브 게임. TypeScript로 작성하고, 네이티브 게임으로 출시하세요. 브라우저도, C++도 필요 없습니다.", + "defaultDescription": "TypeScript 네이티브 게임: 내장 브라우저 없는 사전 컴파일 빌드와 웹용 WebAssembly를 지원합니다.", "languageLabel": "언어" }, "nav": { @@ -25,7 +25,7 @@ "heroBadge": "오픈 소스 게임 엔진", "heroTitlePrefix": "네이티브 게임을 만드는 언어, ", "heroTitleHighlight": "TypeScript", - "heroDesc": "TypeScript로 작성하고, 네이티브 게임으로 출시하세요. 브라우저도, C++도 필요 없습니다. Bloom은 게임을 사전 컴파일(AOT)하여 Metal, DirectX 12, Vulkan, WebGPU에서 실행합니다 — 하나의 코드베이스로 6개의 타깃, 진짜 PBR 렌더링과 물리를 기본 제공합니다.", + "heroDesc": "TypeScript로 작성하고 내장 브라우저나 C++ 없이 네이티브 게임으로 출시하세요. Bloom은 게임을 사전 컴파일(AOT)하여 Metal, DirectX 12, Vulkan, WebGPU에서 실행합니다 — 하나의 코드베이스로 9개의 타깃, 진짜 PBR 렌더링과 물리를 기본 제공합니다.", "getStarted": "시작하기", "viewOnGithub": "GitHub에서 보기", "proof": { @@ -36,10 +36,10 @@ }, "why": { "title": "왜 Bloom인가?", - "desc": "Bloom은 TypeScript로 작성하면서도 진짜 네이티브 게임을 출시할 수 있는 유일한 게임 엔진입니다. Electron도, WebView도, 브라우저 런타임도 없습니다. 코드는 Perry 컴파일러로 사전 컴파일되어 Rust 코어 위에서 실행됩니다.", + "desc": "Bloom은 TypeScript 게임을 Rust 코어 대상으로 사전 컴파일합니다. 네이티브 타깃은 Electron, WebView, 내장 브라우저 런타임을 사용하지 않으며 Web 타깃은 WebAssembly를 생성합니다.", "simpleApi": { "title": "간결한 API", - "desc": "전체 API가 치트시트 한 장에 들어갑니다. 클래스도, 상속도, 마법 같은 동작도 없습니다. 호출하는 함수들뿐입니다." + "desc": "게임플레이 API는 함수 중심입니다. 단순 데이터, 명시적 핸들, 직접 호출하는 함수로 구성되며 전문 도구만 작은 보조 추상화를 추가합니다." }, "trueNative": { "title": "진짜 네이티브", @@ -47,12 +47,12 @@ }, "shipEverywhere": { "title": "모든 곳으로 출시", - "desc": "macOS, Windows, Linux, iOS, tvOS, 웹까지 하나의 코드베이스로. Steam, App Store, itch.io 출시 준비 완료." + "desc": "macOS, Windows, Linux, iOS, tvOS, watchOS, visionOS, Android, 웹까지 하나의 코드베이스로 지원합니다." } }, "modules": { "title": "필요한 모든 것", - "desc": "9개의 모듈형 서브시스템, 각각 독립적으로 임포트 가능합니다. 필요한 것만 골라 쓰세요.", + "desc": "13개의 모듈형 서브시스템, 각각 독립적으로 임포트 가능합니다. 필요한 것만 골라 쓰세요.", "items": [ { "id": "core", "title": "Core", "desc": "윈도우 생성, 게임 루프, 입력 처리, 타이밍, 프레임 제어." }, { "id": "shapes", "title": "Shapes", "desc": "2D 도형 그리기 — 선, 사각형, 원, 다각형 — 그리고 충돌 감지까지." }, @@ -62,7 +62,11 @@ { "id": "models", "title": "Models", "desc": "glTF 2.0 로딩, GPU 스켈레탈 애니메이션, PBR 머티리얼, 메시 프리미티브." }, { "id": "math", "title": "Math", "desc": "벡터, 행렬, 쿼터니언, 이징 함수, 난수 생성." }, { "id": "physics", "title": "Physics", "desc": "Jolt 기반 강체 및 연체, 캐릭터 컨트롤러, 차량, 레이캐스트, 컨스트레인트." }, - { "id": "scene", "title": "Scene", "desc": "리테인드 모드 씬 그래프 — 트랜스폼, 가시성, 그림자, 머티리얼 바인딩." } + { "id": "scene", "title": "Scene", "desc": "리테인드 모드 씬 그래프 — 트랜스폼, 가시성, 그림자, 머티리얼 바인딩." }, + { "id": "mobile", "title": "Mobile", "desc": "가상 컨트롤, 안전 영역, 터치 입력 도우미." }, + { "id": "world", "title": "World", "desc": "버전 관리 월드 로딩과 검증, 프리팹, 런타임 인스턴스화." }, + { "id": "vfx", "title": "VFX", "desc": "GPU 파티클 시스템, 이미터, 데칼." }, + { "id": "quality", "title": "Quality", "desc": "결정론적 품질 실행, 캡처, 텔레메트리." } ] }, "platforms": { @@ -143,7 +147,7 @@ "p.whyWgpu2": "대신 전체 렌더러를 wgpu 위에서 한 번만 작성했습니다. 셰이더는 WGSL입니다. 그 결과 Apple 플랫폼에서는 Metal, Windows에서는 DirectX 12, Linux와 Android에서는 Vulkan, 브라우저에서는 WebGPU(WebGL 폴백 포함)를 — 하나의 코드베이스로 얻습니다. 비용은 wgpu의 기능 집합에 묶인다는 점이고, 일부 특수한 기능들(메시 셰이더, 레이 트레이싱)은 당분간 사용할 수 없습니다. 작은 팀에게는 충분히 합리적인 거래라고 생각합니다.", "h.box": "오늘 실제로 들어 있는 것", "p.box": "마케팅 사이트에 동작하지 않는 것은 올리지 않으려고 합니다. 오늘 실제로 동작하는 것은 다음과 같습니다:", - "li.box1": "임포트 가능한 9개의 모듈bloom/core, bloom/shapes, bloom/textures, bloom/text, bloom/audio, bloom/models, bloom/math, bloom/physics, 그리고 bloom/scene.", + "li.box1": "임포트 가능한 9개의 모듈@bloomengine/engine/core, @bloomengine/engine/shapes, @bloomengine/engine/textures, @bloomengine/engine/text, @bloomengine/engine/audio, @bloomengine/engine/models, @bloomengine/engine/math, @bloomengine/engine/physics, 그리고 @bloomengine/engine/scene.", "li.box2": "진짜 PBR 렌더러 — substrate 스타일의 레이어드 머티리얼, 정적 지오메트리에 대한 캐싱이 적용된 캐스케이드 섀도 맵, ACES/AgX 톤 매핑, 자동 노출, 블룸, 피사계 심도, 모션 블러, SSGI, SSAO, TAA, 그리고 분수 렌더 스케일을 위한 CAS 샤픈 패스.", "li.box3": "GPU 스켈레탈 애니메이션 — glTF 2.0 임포트, GPU 위에서의 4본 선형 블렌드 스키닝, 스켈레톤당 최대 128개의 조인트.", "li.box4": "Jolt 물리 — 강체 및 연체, 캐릭터 컨트롤러, 차량, 레이캐스트, 컨스트레인트, 컨택트 콜백. 웹 타깃은 JoltPhysics.js 폴백을 사용하여 동일한 코드가 브라우저에서도 실행됩니다.", diff --git a/src/messages/pt.json b/src/messages/pt.json index c4c68a3..b62593d 100644 --- a/src/messages/pt.json +++ b/src/messages/pt.json @@ -1,6 +1,6 @@ { "meta": { - "defaultDescription": "Jogos nativos a partir de TypeScript. Escreva TypeScript. Publique jogos nativos. Sem navegador, sem C++.", + "defaultDescription": "Jogos nativos a partir de TypeScript: builds ahead-of-time sem navegador incorporado e WebAssembly para a web.", "languageLabel": "Idioma" }, "nav": { @@ -25,7 +25,7 @@ "heroBadge": "Game Engine de Código Aberto", "heroTitlePrefix": "Jogos nativos a partir de ", "heroTitleHighlight": "TypeScript", - "heroDesc": "Escreva TypeScript. Publique jogos nativos. Sem navegador, sem C++. A Bloom compila seu jogo ahead-of-time e o executa em Metal, DirectX 12, Vulkan e WebGPU — uma única base de código, seis alvos, renderização PBR de verdade e física prontos para uso.", + "heroDesc": "Escreva TypeScript e publique jogos nativos sem navegador incorporado nem C++. A Bloom compila seu jogo ahead-of-time e o executa em Metal, DirectX 12, Vulkan e WebGPU — uma única base de código, nove alvos, renderização PBR de verdade e física prontos para uso.", "getStarted": "Começar", "viewOnGithub": "Ver no GitHub", "proof": { @@ -36,10 +36,10 @@ }, "why": { "title": "Por que a Bloom?", - "desc": "A Bloom é a única game engine que permite escrever TypeScript e publicar jogos verdadeiramente nativos. Sem Electron, sem WebView, sem runtime de navegador. Seu código é compilado ahead-of-time pelo compilador Perry e roda sobre um core em Rust.", + "desc": "A Bloom compila jogos TypeScript ahead-of-time sobre um core em Rust. Os alvos nativos não usam Electron, WebView ou runtime de navegador incorporado; o alvo Web gera WebAssembly.", "simpleApi": { "title": "API Simples", - "desc": "A API inteira cabe em um cheatsheet. Sem classes, sem herança, sem mágica. Apenas funções que você chama." + "desc": "A API de gameplay prioriza funções: dados simples, handles explícitos e chamadas diretas. Ferramentas especializadas adicionam apenas pequenas abstrações auxiliares." }, "trueNative": { "title": "Verdadeiramente Nativo", @@ -47,12 +47,12 @@ }, "shipEverywhere": { "title": "Publique em Qualquer Lugar", - "desc": "macOS, Windows, Linux, iOS, tvOS e Web a partir de uma única base de código. Pronto para Steam, App Store e itch.io." + "desc": "macOS, Windows, Linux, iOS, tvOS, watchOS, visionOS, Android e Web a partir de uma única base de código." } }, "modules": { "title": "Tudo o que você precisa", - "desc": "Nove subsistemas modulares, cada um importável de forma independente. Use somente o que você precisa.", + "desc": "Treze subsistemas modulares, cada um importável de forma independente. Use somente o que você precisa.", "items": [ { "id": "core", "title": "Core", "desc": "Criação de janela, game loop, tratamento de input, temporização e controle de frame." }, { "id": "shapes", "title": "Shapes", "desc": "Desenho de formas 2D — linhas, retângulos, círculos, polígonos — além de detecção de colisão." }, @@ -62,7 +62,11 @@ { "id": "models", "title": "Models", "desc": "Carregamento de glTF 2.0, animação esqueletal na GPU, materiais PBR, primitivas de mesh." }, { "id": "math", "title": "Math", "desc": "Vetores, matrizes, quatérnios, funções de easing e geração de números aleatórios." }, { "id": "physics", "title": "Physics", "desc": "Corpos rígidos e moles com Jolt, controladores de personagem, veículos, raycasts, restrições." }, - { "id": "scene", "title": "Scene", "desc": "Scene graph em modo retido — transformações, visibilidade, sombras, vinculação de materiais." } + { "id": "scene", "title": "Scene", "desc": "Scene graph em modo retido — transformações, visibilidade, sombras, vinculação de materiais." }, + { "id": "mobile", "title": "Mobile", "desc": "Controles virtuais, áreas seguras e auxiliares de entrada por toque." }, + { "id": "world", "title": "World", "desc": "Carregamento e validação versionados de mundos, prefabs e instanciação em runtime." }, + { "id": "vfx", "title": "VFX", "desc": "Sistemas de partículas na GPU, emissores e decals." }, + { "id": "quality", "title": "Quality", "desc": "Execuções de qualidade determinísticas, capturas e telemetria." } ] }, "platforms": { @@ -143,7 +147,7 @@ "p.whyWgpu2": "Em vez disso, o renderer inteiro é escrito uma única vez sobre o wgpu. Os shaders são WGSL. Temos Metal nas plataformas Apple, DirectX 12 no Windows, Vulkan no Linux e Android, e WebGPU (com fallback WebGL) no navegador — a partir de uma única base de código. O custo é estarmos atrelados ao conjunto de recursos do wgpu, e algumas coisas exóticas (mesh shaders, ray tracing) estão fora de cogitação por ora. Achamos que é uma troca justa para um time pequeno.", "h.box": "O que de fato está incluso hoje", "p.box": "Tentamos não colocar nada no site de marketing que não funcione. Eis o que é real, hoje:", - "li.box1": "Nove módulos importáveisbloom/core, bloom/shapes, bloom/textures, bloom/text, bloom/audio, bloom/models, bloom/math, bloom/physics e bloom/scene.", + "li.box1": "Nove módulos importáveis@bloomengine/engine/core, @bloomengine/engine/shapes, @bloomengine/engine/textures, @bloomengine/engine/text, @bloomengine/engine/audio, @bloomengine/engine/models, @bloomengine/engine/math, @bloomengine/engine/physics e @bloomengine/engine/scene.", "li.box2": "Um renderer PBR de verdade — materiais em camadas estilo substrate, shadow maps em cascata com cache para geometria estática, tone mapping ACES/AgX, exposição automática, bloom, depth of field, motion blur, SSGI, SSAO, TAA, e um passe de CAS sharpen para escalas de renderização fracionárias.", "li.box3": "Animação esqueletal na GPU — importação de glTF 2.0, linear blend skinning de quatro ossos na GPU, até 128 juntas por esqueleto.", "li.box4": "Física com Jolt — corpos rígidos e moles, controladores de personagem, veículos, raycasts, restrições, callbacks de contato. O alvo web usa o fallback JoltPhysics.js para que o mesmo código rode no navegador.", diff --git a/src/messages/th.json b/src/messages/th.json index ae999fc..7a0d4f8 100644 --- a/src/messages/th.json +++ b/src/messages/th.json @@ -1,6 +1,6 @@ { "meta": { - "defaultDescription": "เกมเนทีฟจาก TypeScript เขียน TypeScript ส่งมอบเกมเนทีฟ ไม่ต้องใช้เบราว์เซอร์ ไม่ต้องใช้ C++", + "defaultDescription": "เกมเนทีฟจาก TypeScript: บิลด์แบบ ahead-of-time ที่ไม่ฝังเบราว์เซอร์ พร้อม WebAssembly สำหรับเว็บ", "languageLabel": "ภาษา" }, "nav": { @@ -25,7 +25,7 @@ "heroBadge": "เกมเอนจินโอเพนซอร์ส", "heroTitlePrefix": "เกมเนทีฟที่สร้างด้วย ", "heroTitleHighlight": "TypeScript", - "heroDesc": "เขียน TypeScript ส่งมอบเกมเนทีฟ ไม่ต้องใช้เบราว์เซอร์ ไม่ต้องใช้ C++ Bloom คอมไพล์เกมของคุณแบบ ahead-of-time และรันบน Metal, DirectX 12, Vulkan และ WebGPU — โค้ดเบสเดียว หกแพลตฟอร์มเป้าหมาย พร้อมการเรนเดอร์ PBR และฟิสิกส์จริงในตัว", + "heroDesc": "เขียน TypeScript และส่งมอบเกมเนทีฟโดยไม่ต้องฝังเบราว์เซอร์หรือใช้ C++ Bloom คอมไพล์เกมของคุณแบบ ahead-of-time และรันบน Metal, DirectX 12, Vulkan และ WebGPU — โค้ดเบสเดียว เก้าแพลตฟอร์มเป้าหมาย พร้อมการเรนเดอร์ PBR และฟิสิกส์จริงในตัว", "getStarted": "เริ่มต้นใช้งาน", "viewOnGithub": "ดูบน GitHub", "proof": { @@ -36,10 +36,10 @@ }, "why": { "title": "ทำไมต้อง Bloom?", - "desc": "Bloom เป็นเกมเอนจินเดียวที่ให้คุณเขียน TypeScript และส่งมอบเกมเนทีฟอย่างแท้จริง ไม่มี Electron ไม่มี WebView ไม่มีรันไทม์ของเบราว์เซอร์ โค้ดของคุณถูกคอมไพล์แบบ ahead-of-time ด้วยคอมไพเลอร์ Perry และทำงานบนคอร์ที่เขียนด้วย Rust", + "desc": "Bloom คอมไพล์เกม TypeScript แบบ ahead-of-time บนคอร์ Rust เป้าหมายเนทีฟไม่ใช้ Electron, WebView หรือรันไทม์เบราว์เซอร์แบบฝัง ส่วนเป้าหมาย Web สร้าง WebAssembly", "simpleApi": { "title": "API เรียบง่าย", - "desc": "API ทั้งหมดอยู่ในชีตเดียว ไม่มีคลาส ไม่มีการสืบทอด ไม่มีอะไรลึกลับ มีเพียงฟังก์ชันที่คุณเรียกใช้" + "desc": "API เกมเน้นฟังก์ชันเป็นหลัก: ข้อมูลเรียบง่าย แฮนเดิลชัดเจน และฟังก์ชันที่เรียกโดยตรง เครื่องมือเฉพาะทางเพิ่มเพียงตัวช่วยขนาดเล็ก" }, "trueNative": { "title": "เนทีฟอย่างแท้จริง", @@ -47,12 +47,12 @@ }, "shipEverywhere": { "title": "ส่งมอบได้ทุกที่", - "desc": "macOS, Windows, Linux, iOS, tvOS และเว็บจากโค้ดเบสเดียว พร้อมส่งขึ้น Steam, App Store และ itch.io" + "desc": "macOS, Windows, Linux, iOS, tvOS, watchOS, visionOS, Android และเว็บจากโค้ดเบสเดียว" } }, "modules": { "title": "ทุกสิ่งที่คุณต้องการ", - "desc": "เก้าระบบย่อยแบบโมดูลาร์ แต่ละตัวสามารถนำเข้าได้อิสระ ใช้เฉพาะที่คุณต้องการ", + "desc": "สิบสามระบบย่อยแบบโมดูลาร์ แต่ละตัวสามารถนำเข้าได้อิสระ ใช้เฉพาะที่คุณต้องการ", "items": [ { "id": "core", "title": "Core", "desc": "การสร้างหน้าต่าง, ลูปเกม, การจัดการอินพุต, การจับเวลา และการควบคุมเฟรม" }, { "id": "shapes", "title": "Shapes", "desc": "การวาดรูปทรง 2D — เส้น, สี่เหลี่ยม, วงกลม, รูปหลายเหลี่ยม — พร้อมการตรวจจับการชน" }, @@ -62,7 +62,11 @@ { "id": "models", "title": "Models", "desc": "การโหลด glTF 2.0, แอนิเมชันโครงกระดูกบน GPU, วัสดุ PBR และเมชพื้นฐาน" }, { "id": "math", "title": "Math", "desc": "เวกเตอร์, เมทริกซ์, ควอเทอร์เนียน, ฟังก์ชัน easing และการสุ่มตัวเลข" }, { "id": "physics", "title": "Physics", "desc": "วัตถุแข็งและอ่อนที่ขับเคลื่อนด้วย Jolt, ตัวควบคุมตัวละคร, ยานพาหนะ, raycast และข้อจำกัด" }, - { "id": "scene", "title": "Scene", "desc": "ซีนกราฟแบบ retained-mode — การแปลง, การมองเห็น, เงา และการผูกวัสดุ" } + { "id": "scene", "title": "Scene", "desc": "ซีนกราฟแบบ retained-mode — การแปลง, การมองเห็น, เงา และการผูกวัสดุ" }, + { "id": "mobile", "title": "Mobile", "desc": "ตัวควบคุมเสมือน พื้นที่ปลอดภัย และตัวช่วยอินพุตแบบสัมผัส" }, + { "id": "world", "title": "World", "desc": "การโหลดและตรวจสอบเวิลด์แบบมีเวอร์ชัน prefab และการสร้างอินสแตนซ์ขณะรัน" }, + { "id": "vfx", "title": "VFX", "desc": "ระบบอนุภาค GPU ตัวปล่อย และ decal" }, + { "id": "quality", "title": "Quality", "desc": "การทดสอบคุณภาพแบบกำหนดผลได้ การจับภาพ และเทเลเมทรี" } ] }, "platforms": { @@ -143,7 +147,7 @@ "p.whyWgpu2": "แทนที่จะเป็นเช่นนั้น เรนเดอเรอร์ทั้งหมดเขียนเพียงครั้งเดียวบน wgpu Shader คือ WGSL เราได้ Metal บนแพลตฟอร์ม Apple, DirectX 12 บน Windows, Vulkan บน Linux และ Android และ WebGPU (พร้อม WebGL เป็นทางสำรอง) ในเบราว์เซอร์ — จากโค้ดเบสเดียว ค่าใช้จ่ายคือเราถูกผูกกับชุดฟีเจอร์ของ wgpu และสิ่งแปลกใหม่บางอย่าง (mesh shader, ray tracing) อยู่นอกเหนือความเป็นไปได้ในตอนนี้ เราคิดว่านั่นเป็นการแลกเปลี่ยนที่ยุติธรรมสำหรับทีมเล็ก ๆ", "h.box": "อะไรอยู่ในกล่องจริง ๆ ในวันนี้", "p.box": "เราพยายามไม่ใส่อะไรบนเว็บไซต์การตลาดที่ไม่ทำงาน นี่คือสิ่งที่เป็นจริง วันนี้:", - "li.box1": "เก้าโมดูลที่นำเข้าได้bloom/core, bloom/shapes, bloom/textures, bloom/text, bloom/audio, bloom/models, bloom/math, bloom/physics และ bloom/scene", + "li.box1": "เก้าโมดูลที่นำเข้าได้@bloomengine/engine/core, @bloomengine/engine/shapes, @bloomengine/engine/textures, @bloomengine/engine/text, @bloomengine/engine/audio, @bloomengine/engine/models, @bloomengine/engine/math, @bloomengine/engine/physics และ @bloomengine/engine/scene", "li.box2": "เรนเดอเรอร์ PBR ของจริง — วัสดุแบบเลเยอร์สไตล์ substrate, แผนที่เงาแบบ cascaded พร้อมแคชสำหรับเรขาคณิตคงที่, ACES/AgX tone mapping, auto-exposure, bloom, depth of field, motion blur, SSGI, SSAO, TAA และ CAS sharpen pass สำหรับ render scale แบบเศษส่วน", "li.box3": "แอนิเมชันโครงกระดูกบน GPU — การนำเข้า glTF 2.0, four-bone linear blend skinning บน GPU, สูงสุด 128 joint ต่อโครงกระดูก", "li.box4": "ฟิสิกส์ Jolt — วัตถุแข็งและอ่อน, ตัวควบคุมตัวละคร, ยานพาหนะ, raycast, ข้อจำกัด, callback การสัมผัส เป้าหมายเว็บใช้ JoltPhysics.js เป็นทางสำรองเพื่อให้โค้ดเดียวกันทำงานในเบราว์เซอร์", diff --git a/src/messages/tr.json b/src/messages/tr.json index fccf4a1..b406c4b 100644 --- a/src/messages/tr.json +++ b/src/messages/tr.json @@ -1,6 +1,6 @@ { "meta": { - "defaultDescription": "TypeScript ile native oyunlar. TypeScript yaz. Native oyun yayınla. Tarayıcı yok, C++ yok.", + "defaultDescription": "TypeScript ile native oyunlar: gömülü tarayıcısız önceden derlenen yapılar ve web için WebAssembly.", "languageLabel": "Dil" }, "nav": { @@ -25,7 +25,7 @@ "heroBadge": "Açık Kaynak Oyun Motoru", "heroTitlePrefix": "Native oyunlar, doğrudan ", "heroTitleHighlight": "TypeScript", - "heroDesc": "TypeScript yaz. Native oyun yayınla. Tarayıcı yok, C++ yok. Bloom oyununu önceden derler ve Metal, DirectX 12, Vulkan ile WebGPU üzerinde çalıştırır — tek kod tabanı, altı hedef, kutudan çıkar çıkmaz gerçek PBR render ve fizik.", + "heroDesc": "TypeScript yaz ve gömülü tarayıcı ya da C++ olmadan native oyun yayınla. Bloom oyununu önceden derler ve Metal, DirectX 12, Vulkan ile WebGPU üzerinde çalıştırır — tek kod tabanı, dokuz hedef, kutudan çıkar çıkmaz gerçek PBR render ve fizik.", "getStarted": "Başla", "viewOnGithub": "GitHub'da Görüntüle", "proof": { @@ -36,10 +36,10 @@ }, "why": { "title": "Neden Bloom?", - "desc": "Bloom, TypeScript yazıp gerçek anlamda native oyunlar yayınlamana izin veren tek oyun motorudur. Electron yok, WebView yok, tarayıcı çalışma zamanı yok. Kodun Perry derleyicisi tarafından önceden derlenir ve bir Rust çekirdeğine karşı çalışır.", + "desc": "Bloom, TypeScript oyunlarını bir Rust çekirdeğine karşı önceden derler. Native hedefler Electron, WebView veya gömülü tarayıcı çalışma zamanı kullanmaz; Web hedefi WebAssembly üretir.", "simpleApi": { "title": "Basit API", - "desc": "API'nin tamamı bir kopya kağıdına sığar. Sınıf yok, kalıtım yok, sihir yok. Sadece çağırdığın fonksiyonlar." + "desc": "Oynanış API'si fonksiyon odaklıdır: sade veriler, açık handle'lar ve doğrudan çağrılan fonksiyonlar. Uzman araçlar yalnızca küçük yardımcı soyutlamalar ekler." }, "trueNative": { "title": "Gerçek Native", @@ -47,12 +47,12 @@ }, "shipEverywhere": { "title": "Her Yere Yayınla", - "desc": "Tek bir kod tabanından macOS, Windows, Linux, iOS, tvOS ve Web. Steam, App Store ve itch.io'ya hazır." + "desc": "Tek bir kod tabanından macOS, Windows, Linux, iOS, tvOS, watchOS, visionOS, Android ve Web." } }, "modules": { "title": "İhtiyacın olan her şey", - "desc": "Dokuz modüler alt sistem, her biri bağımsız olarak içe aktarılabilir. Sadece ihtiyacın olanı kullan.", + "desc": "On üç modüler alt sistem, her biri bağımsız olarak içe aktarılabilir. Sadece ihtiyacın olanı kullan.", "items": [ { "id": "core", "title": "Core", "desc": "Pencere oluşturma, oyun döngüsü, girdi yönetimi, zamanlama ve kare kontrolü." }, { "id": "shapes", "title": "Shapes", "desc": "2B şekil çizimi — çizgiler, dikdörtgenler, daireler, çokgenler — artı çarpışma tespiti." }, @@ -62,7 +62,11 @@ { "id": "models", "title": "Models", "desc": "glTF 2.0 yükleme, GPU iskelet animasyonu, PBR materyaller, mesh ilkel cisimleri." }, { "id": "math", "title": "Math", "desc": "Vektörler, matrisler, kuaterniyonlar, easing fonksiyonları ve rastgele sayı üretimi." }, { "id": "physics", "title": "Physics", "desc": "Jolt destekli katı ve yumuşak cisimler, karakter denetleyicileri, araçlar, ışın izleri, kısıtlar." }, - { "id": "scene", "title": "Scene", "desc": "Tutulan kipte sahne grafiği — dönüşümler, görünürlük, gölgeler, materyal bağlama." } + { "id": "scene", "title": "Scene", "desc": "Tutulan kipte sahne grafiği — dönüşümler, görünürlük, gölgeler, materyal bağlama." }, + { "id": "mobile", "title": "Mobile", "desc": "Sanal kontroller, güvenli alanlar ve dokunmatik girdi yardımcıları." }, + { "id": "world", "title": "World", "desc": "Sürümlü dünya yükleme ve doğrulama, prefab'lar ve çalışma zamanı örnekleme." }, + { "id": "vfx", "title": "VFX", "desc": "GPU parçacık sistemleri, yayıcılar ve decal'lar." }, + { "id": "quality", "title": "Quality", "desc": "Deterministik kalite koşuları, yakalamalar ve telemetri." } ] }, "platforms": { @@ -143,7 +147,7 @@ "p.whyWgpu2": "Bunun yerine, render motorunun tamamı bir kez wgpu üzerine yazıldı. Shader'lar WGSL. Apple platformlarında Metal, Windows'ta DirectX 12, Linux ve Android'de Vulkan ve tarayıcıda WebGPU (WebGL yedeği ile) — tek bir kod tabanından alıyoruz. Bedeli, wgpu'nun özellik setine bağlı kalmamız ve birkaç egzotik şeyin (mesh shader'lar, ray tracing) şimdilik masada olmaması. Küçük bir ekip için bunun adil bir takas olduğunu düşünüyoruz.", "h.box": "Bugün gerçekten kutuda olanlar", "p.box": "Pazarlama sitesine çalışmayan hiçbir şeyi koymamaya çalışıyoruz. Bugün gerçek olan şu:", - "li.box1": "Dokuz içe aktarılabilir modülbloom/core, bloom/shapes, bloom/textures, bloom/text, bloom/audio, bloom/models, bloom/math, bloom/physics ve bloom/scene.", + "li.box1": "Dokuz içe aktarılabilir modül@bloomengine/engine/core, @bloomengine/engine/shapes, @bloomengine/engine/textures, @bloomengine/engine/text, @bloomengine/engine/audio, @bloomengine/engine/models, @bloomengine/engine/math, @bloomengine/engine/physics ve @bloomengine/engine/scene.", "li.box2": "Gerçek bir PBR render motoru — substrate tarzı katmanlı materyaller, statik geometri için önbellekli kademeli gölge haritaları, ACES/AgX ton eşleme, otomatik pozlama, bloom, alan derinliği, hareket bulanıklığı, SSGI, SSAO, TAA ve kesirli render ölçekleri için bir CAS keskinleştirme geçişi.", "li.box3": "GPU iskelet animasyonu — glTF 2.0 içe aktarımı, GPU üzerinde dört kemikli doğrusal karışım skinning, iskelet başına 128'e kadar eklem.", "li.box4": "Jolt fizik — katı ve yumuşak cisimler, karakter denetleyicileri, araçlar, ışın izleri, kısıtlar, temas geri çağrımları. Web hedefi JoltPhysics.js yedeğini kullanır, böylece aynı kod tarayıcıda çalışır.", diff --git a/src/messages/vi.json b/src/messages/vi.json index e8e988e..e4f9151 100644 --- a/src/messages/vi.json +++ b/src/messages/vi.json @@ -1,6 +1,6 @@ { "meta": { - "defaultDescription": "Game native từ TypeScript. Viết TypeScript. Xuất bản game native. Không trình duyệt, không C++.", + "defaultDescription": "Game native từ TypeScript: build biên dịch trước không nhúng trình duyệt và WebAssembly cho web.", "languageLabel": "Ngôn ngữ" }, "nav": { @@ -25,7 +25,7 @@ "heroBadge": "Game Engine Mã nguồn mở", "heroTitlePrefix": "Game native viết bằng ", "heroTitleHighlight": "TypeScript", - "heroDesc": "Viết TypeScript. Xuất bản game native. Không trình duyệt, không C++. Bloom biên dịch game của bạn trước thời gian chạy và chạy trên Metal, DirectX 12, Vulkan và WebGPU — một codebase, sáu nền tảng, kết xuất PBR thực thụ và vật lý có sẵn.", + "heroDesc": "Viết TypeScript và xuất bản game native không cần trình duyệt nhúng hay C++. Bloom biên dịch game của bạn trước thời gian chạy và chạy trên Metal, DirectX 12, Vulkan và WebGPU — một codebase, chín nền tảng, kết xuất PBR thực thụ và vật lý có sẵn.", "getStarted": "Bắt đầu", "viewOnGithub": "Xem trên GitHub", "proof": { @@ -36,10 +36,10 @@ }, "why": { "title": "Vì sao chọn Bloom?", - "desc": "Bloom là game engine duy nhất cho phép bạn viết TypeScript và xuất bản game native thực sự. Không Electron, không WebView, không runtime trình duyệt. Mã nguồn của bạn được biên dịch trước thời gian chạy bởi trình biên dịch Perry và chạy trên một lõi viết bằng Rust.", + "desc": "Bloom biên dịch trước game TypeScript trên một lõi Rust. Các nền tảng native không dùng Electron, WebView hay runtime trình duyệt nhúng; nền tảng Web tạo WebAssembly.", "simpleApi": { "title": "API Đơn giản", - "desc": "Toàn bộ API gói gọn trong một tờ cheatsheet. Không class, không kế thừa, không phép thuật. Chỉ là các hàm bạn gọi." + "desc": "API gameplay ưu tiên hàm: dữ liệu đơn giản, handle tường minh và các hàm gọi trực tiếp. Công cụ chuyên biệt chỉ thêm những lớp trừu tượng hỗ trợ nhỏ." }, "trueNative": { "title": "Native Thực thụ", @@ -47,12 +47,12 @@ }, "shipEverywhere": { "title": "Xuất bản Khắp nơi", - "desc": "macOS, Windows, Linux, iOS, tvOS và Web từ một codebase. Sẵn sàng cho Steam, App Store và itch.io." + "desc": "macOS, Windows, Linux, iOS, tvOS, watchOS, visionOS, Android và Web từ một codebase." } }, "modules": { "title": "Mọi thứ bạn cần", - "desc": "Chín hệ thống con dạng module, mỗi cái có thể import độc lập. Chỉ dùng những gì bạn cần.", + "desc": "Mười ba hệ thống con dạng module, mỗi cái có thể import độc lập. Chỉ dùng những gì bạn cần.", "items": [ { "id": "core", "title": "Core", "desc": "Tạo cửa sổ, vòng lặp game, xử lý đầu vào, định thời và điều khiển khung hình." }, { "id": "shapes", "title": "Shapes", "desc": "Vẽ hình khối 2D — đường, hình chữ nhật, hình tròn, đa giác — cùng phát hiện va chạm." }, @@ -62,7 +62,11 @@ { "id": "models", "title": "Models", "desc": "Tải glTF 2.0, hoạt hình xương trên GPU, vật liệu PBR, các mesh nguyên mẫu." }, { "id": "math", "title": "Math", "desc": "Vector, ma trận, quaternion, hàm easing và sinh số ngẫu nhiên." }, { "id": "physics", "title": "Physics", "desc": "Vật thể cứng và mềm bằng Jolt, bộ điều khiển nhân vật, phương tiện, raycast, ràng buộc." }, - { "id": "scene", "title": "Scene", "desc": "Đồ thị scene retained-mode — biến đổi, hiển thị, đổ bóng, gắn vật liệu." } + { "id": "scene", "title": "Scene", "desc": "Đồ thị scene retained-mode — biến đổi, hiển thị, đổ bóng, gắn vật liệu." }, + { "id": "mobile", "title": "Mobile", "desc": "Điều khiển ảo, vùng an toàn và trợ giúp nhập liệu cảm ứng." }, + { "id": "world", "title": "World", "desc": "Tải và xác thực world có phiên bản, prefab và khởi tạo lúc chạy." }, + { "id": "vfx", "title": "VFX", "desc": "Hệ thống hạt GPU, bộ phát và decal." }, + { "id": "quality", "title": "Quality", "desc": "Chạy kiểm thử chất lượng xác định, chụp ảnh và telemetry." } ] }, "platforms": { @@ -143,7 +147,7 @@ "p.whyWgpu2": "Thay vào đó, toàn bộ bộ kết xuất được viết một lần trên nền wgpu. Shader là WGSL. Chúng tôi có Metal trên các nền tảng Apple, DirectX 12 trên Windows, Vulkan trên Linux và Android, và WebGPU (với WebGL dự phòng) trong trình duyệt — từ một codebase. Cái giá phải trả là chúng tôi bị ràng buộc bởi bộ tính năng của wgpu, và một vài thứ kỳ lạ (mesh shader, ray tracing) tạm thời không khả dụng. Chúng tôi nghĩ đó là một cuộc đánh đổi công bằng cho một đội nhỏ.", "h.box": "Hôm nay thực sự có gì trong hộp", "p.box": "Chúng tôi cố gắng không để bất cứ thứ gì lên trang marketing mà không hoạt động. Đây là những gì có thật, ngay hôm nay:", - "li.box1": "Chín module có thể importbloom/core, bloom/shapes, bloom/textures, bloom/text, bloom/audio, bloom/models, bloom/math, bloom/physicsbloom/scene.", + "li.box1": "Chín module có thể import@bloomengine/engine/core, @bloomengine/engine/shapes, @bloomengine/engine/textures, @bloomengine/engine/text, @bloomengine/engine/audio, @bloomengine/engine/models, @bloomengine/engine/math, @bloomengine/engine/physics@bloomengine/engine/scene.", "li.box2": "Một bộ kết xuất PBR thực thụ — vật liệu phân tầng kiểu substrate, bản đồ bóng phân tầng có cache cho hình học tĩnh, tone mapping ACES/AgX, auto-exposure, bloom, độ sâu trường ảnh, motion blur, SSGI, SSAO, TAA, và một lượt CAS sharpen cho các tỉ lệ kết xuất phân số.", "li.box3": "Hoạt hình xương trên GPU — import glTF 2.0, linear blend skinning bốn xương trên GPU, lên đến 128 khớp mỗi bộ xương.", "li.box4": "Vật lý Jolt — vật thể cứng và mềm, bộ điều khiển nhân vật, phương tiện, raycast, ràng buộc, callback va chạm. Mục tiêu web sử dụng JoltPhysics.js làm dự phòng để cùng một mã nguồn chạy được trong trình duyệt.", diff --git a/src/messages/zh-Hans.json b/src/messages/zh-Hans.json index e728495..09ff038 100644 --- a/src/messages/zh-Hans.json +++ b/src/messages/zh-Hans.json @@ -1,6 +1,6 @@ { "meta": { - "defaultDescription": "使用 TypeScript 构建原生游戏。编写 TypeScript,发布原生游戏。无需浏览器,无需 C++。", + "defaultDescription": "使用 TypeScript 构建原生游戏:无需嵌入式浏览器的提前编译构建,以及面向 Web 的 WebAssembly。", "languageLabel": "语言" }, "nav": { @@ -25,7 +25,7 @@ "heroBadge": "开源游戏引擎", "heroTitlePrefix": "原生游戏,源自 ", "heroTitleHighlight": "TypeScript", - "heroDesc": "编写 TypeScript,发布原生游戏。无需浏览器,无需 C++。Bloom 会提前编译你的游戏,并在 Metal、DirectX 12、Vulkan 和 WebGPU 上运行 —— 一套代码库,六个目标平台,开箱即用的真正 PBR 渲染与物理。", + "heroDesc": "编写 TypeScript,无需嵌入式浏览器或 C++ 即可发布原生游戏。Bloom 会提前编译你的游戏,并在 Metal、DirectX 12、Vulkan 和 WebGPU 上运行 —— 一套代码库,九个目标平台,开箱即用的真正 PBR 渲染与物理。", "getStarted": "立即开始", "viewOnGithub": "在 GitHub 上查看", "proof": { @@ -36,10 +36,10 @@ }, "why": { "title": "为什么选择 Bloom?", - "desc": "Bloom 是唯一一款让你用 TypeScript 编写并发布真正原生游戏的引擎。无需 Electron、无需 WebView、无需浏览器运行时。你的代码由 Perry 编译器提前编译,并基于 Rust 核心运行。", + "desc": "Bloom 将 TypeScript 游戏提前编译到 Rust 核心。原生目标无需 Electron、WebView 或嵌入式浏览器运行时;Web 目标生成 WebAssembly。", "simpleApi": { "title": "简洁 API", - "desc": "整个 API 一张速查表就能装下。没有类,没有继承,没有黑魔法,只有你调用的函数。" + "desc": "游戏 API 以函数为核心:简单数据、明确句柄和直接调用的函数。专业工具只增加少量辅助抽象。" }, "trueNative": { "title": "真正原生", @@ -47,12 +47,12 @@ }, "shipEverywhere": { "title": "处处可发布", - "desc": "一套代码库即可覆盖 macOS、Windows、Linux、iOS、tvOS 和 Web。Steam、App Store 和 itch.io 均可发布。" + "desc": "一套代码库即可覆盖 macOS、Windows、Linux、iOS、tvOS、watchOS、visionOS、Android 和 Web。" } }, "modules": { "title": "你需要的一切", - "desc": "九个模块化子系统,均可独立导入。只用你需要的部分。", + "desc": "十三个模块化子系统,均可独立导入。只用你需要的部分。", "items": [ { "id": "core", "title": "Core", "desc": "窗口创建、游戏循环、输入处理、计时与帧控制。" }, { "id": "shapes", "title": "Shapes", "desc": "2D 图形绘制 —— 直线、矩形、圆形、多边形 —— 以及碰撞检测。" }, @@ -62,7 +62,11 @@ { "id": "models", "title": "Models", "desc": "glTF 2.0 加载、GPU 骨骼动画、PBR 材质、网格基本体。" }, { "id": "math", "title": "Math", "desc": "向量、矩阵、四元数、缓动函数与随机数生成。" }, { "id": "physics", "title": "Physics", "desc": "由 Jolt 驱动的刚体与软体、角色控制器、载具、射线检测、约束。" }, - { "id": "scene", "title": "Scene", "desc": "保留模式场景图 —— 变换、可见性、阴影、材质绑定。" } + { "id": "scene", "title": "Scene", "desc": "保留模式场景图 —— 变换、可见性、阴影、材质绑定。" }, + { "id": "mobile", "title": "Mobile", "desc": "虚拟控件、安全区域与触控输入辅助。" }, + { "id": "world", "title": "World", "desc": "带版本的世界加载与验证、预制体和运行时实例化。" }, + { "id": "vfx", "title": "VFX", "desc": "GPU 粒子系统、发射器与贴花。" }, + { "id": "quality", "title": "Quality", "desc": "确定性的质量测试、截图与遥测。" } ] }, "platforms": { @@ -143,7 +147,7 @@ "p.whyWgpu2": "取而代之的是,整个渲染器只在 wgpu 之上写了一遍。着色器使用 WGSL。我们在 Apple 平台获得 Metal,在 Windows 上获得 DirectX 12,在 Linux 与 Android 上获得 Vulkan,在浏览器中获得 WebGPU(并以 WebGL 作为回退) —— 全部来自一套代码库。代价是我们被绑定在 wgpu 的特性集上,一些奇特的功能(网格着色器、光线追踪)目前无法实现。对于一个小团队来说,我们认为这是一笔公平的交易。", "h.box": "今天盒子里实际有什么", "p.box": "我们尽量不在营销网站上放任何不能用的东西。以下是今天真正可用的内容:", - "li.box1": "九个可导入模块 —— bloom/corebloom/shapesbloom/texturesbloom/textbloom/audiobloom/modelsbloom/mathbloom/physicsbloom/scene。", + "li.box1": "九个可导入模块 —— @bloomengine/engine/core@bloomengine/engine/shapes@bloomengine/engine/textures@bloomengine/engine/text@bloomengine/engine/audio@bloomengine/engine/models@bloomengine/engine/math@bloomengine/engine/physics@bloomengine/engine/scene。", "li.box2": "一套真正的 PBR 渲染器 —— substrate 风格的分层材质、为静态几何体缓存的级联阴影贴图、ACES/AgX 色调映射、自动曝光、bloom、景深、运动模糊、SSGI、SSAO、TAA,以及用于分数渲染缩放的 CAS 锐化通道。", "li.box3": "GPU 骨骼动画 —— glTF 2.0 导入、GPU 上的四骨骼线性混合蒙皮,每副骨架最多 128 个关节。", "li.box4": "Jolt 物理 —— 刚体与软体、角色控制器、载具、射线检测、约束、接触回调。Web 目标使用 JoltPhysics.js 回退,因此同一份代码也能在浏览器中运行。", diff --git a/src/pages/[lang]/docs.astro b/src/pages/[lang]/docs.astro new file mode 100644 index 0000000..289414b --- /dev/null +++ b/src/pages/[lang]/docs.astro @@ -0,0 +1,11 @@ +--- +import { defaultLocale, locales } from "../../i18n/ui"; + +export function getStaticPaths() { + return locales + .filter((lang) => lang !== defaultLocale) + .map((lang) => ({ params: { lang } })); +} + +return Astro.redirect("/docs", 308); +--- diff --git a/src/pages/docs.astro b/src/pages/docs.astro index 0045b52..0b18028 100644 --- a/src/pages/docs.astro +++ b/src/pages/docs.astro @@ -2,11 +2,18 @@ import Layout from "../layouts/Layout.astro"; --- - +
@@ -28,6 +35,12 @@ import Layout from "../layouts/Layout.astro"; Audio Models Math + Mobile + Scene + Physics + World + VFX + Quality