@agent-native/toolkit 0.201.1 → 0.202.0-nightly-20261006033736
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent-native.eject.json +39 -12
- package/dist/app/agentkit/react/components.d.ts.map +1 -1
- package/dist/app/agentkit/react/components.js +292 -23
- package/dist/app/agentkit/react/components.js.map +1 -1
- package/dist/app/agentkit/react/context.d.ts +5 -0
- package/dist/app/agentkit/react/context.d.ts.map +1 -1
- package/dist/app/agentkit/react/context.js +5 -0
- package/dist/app/agentkit/react/context.js.map +1 -1
- package/dist/app/agentkit/react/styles.css +78 -3
- package/dist/app/auth/AuthPage.d.ts.map +1 -1
- package/dist/app/auth/AuthPage.js +7 -14
- package/dist/app/auth/AuthPage.js.map +1 -1
- package/dist/app/auth/server.d.ts +6 -0
- package/dist/app/auth/server.d.ts.map +1 -0
- package/dist/app/auth/server.js +19 -0
- package/dist/app/auth/server.js.map +1 -0
- package/dist/app/chat/AgentKitAssistantChat.d.ts.map +1 -1
- package/dist/app/chat/AgentKitAssistantChat.js +164 -83
- package/dist/app/chat/AgentKitAssistantChat.js.map +1 -1
- package/dist/app/chat/AgentSidebar.d.ts +2 -1
- package/dist/app/chat/AgentSidebar.d.ts.map +1 -1
- package/dist/app/chat/AgentSidebar.js +2 -2
- package/dist/app/chat/AgentSidebar.js.map +1 -1
- package/dist/app/chat/agentkit-chat/guided-questions.d.ts.map +1 -1
- package/dist/app/chat/agentkit-chat/guided-questions.js +13 -3
- package/dist/app/chat/agentkit-chat/guided-questions.js.map +1 -1
- package/dist/app/chat/chat/surface-types.d.ts +2 -0
- package/dist/app/chat/chat/surface-types.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/ar-SA.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/ar-SA.js +41 -0
- package/dist/app/i18n/catalogs/ar-SA.js.map +1 -1
- package/dist/app/i18n/catalogs/de-DE.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/de-DE.js +41 -0
- package/dist/app/i18n/catalogs/de-DE.js.map +1 -1
- package/dist/app/i18n/catalogs/en-US.d.ts +41 -0
- package/dist/app/i18n/catalogs/en-US.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/en-US.js +41 -0
- package/dist/app/i18n/catalogs/en-US.js.map +1 -1
- package/dist/app/i18n/catalogs/es-ES.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/es-ES.js +41 -0
- package/dist/app/i18n/catalogs/es-ES.js.map +1 -1
- package/dist/app/i18n/catalogs/fr-FR.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/fr-FR.js +41 -0
- package/dist/app/i18n/catalogs/fr-FR.js.map +1 -1
- package/dist/app/i18n/catalogs/hi-IN.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/hi-IN.js +41 -0
- package/dist/app/i18n/catalogs/hi-IN.js.map +1 -1
- package/dist/app/i18n/catalogs/ja-JP.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/ja-JP.js +41 -0
- package/dist/app/i18n/catalogs/ja-JP.js.map +1 -1
- package/dist/app/i18n/catalogs/ko-KR.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/ko-KR.js +41 -0
- package/dist/app/i18n/catalogs/ko-KR.js.map +1 -1
- package/dist/app/i18n/catalogs/pt-BR.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/pt-BR.js +41 -0
- package/dist/app/i18n/catalogs/pt-BR.js.map +1 -1
- package/dist/app/i18n/catalogs/zh-CN.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/zh-CN.js +41 -0
- package/dist/app/i18n/catalogs/zh-CN.js.map +1 -1
- package/dist/app/i18n/catalogs/zh-TW.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/zh-TW.js +41 -0
- package/dist/app/i18n/catalogs/zh-TW.js.map +1 -1
- package/dist/app/shared/StarfieldBackground.d.ts +1 -6
- package/dist/app/shared/StarfieldBackground.d.ts.map +1 -1
- package/dist/app/shared/StarfieldBackground.js +1 -368
- package/dist/app/shared/StarfieldBackground.js.map +1 -1
- package/dist/app/shared/WaveBackground.d.ts +5 -0
- package/dist/app/shared/WaveBackground.d.ts.map +1 -0
- package/dist/app/shared/WaveBackground.js +34 -0
- package/dist/app/shared/WaveBackground.js.map +1 -0
- package/dist/app/shared/WebGlWaveBackground.d.ts +9 -0
- package/dist/app/shared/WebGlWaveBackground.d.ts.map +1 -0
- package/dist/app/shared/WebGlWaveBackground.js +433 -0
- package/dist/app/shared/WebGlWaveBackground.js.map +1 -0
- package/dist/app/shared/index.d.ts +1 -0
- package/dist/app/shared/index.d.ts.map +1 -1
- package/dist/app/shared/index.js +1 -0
- package/dist/app/shared/index.js.map +1 -1
- package/dist/app/shared/ocean/bloom-blur.wgsl +43 -0
- package/dist/app/shared/ocean/bloom-blur.wgsl.js +1 -0
- package/dist/app/shared/ocean/bloom-bright.wgsl +21 -0
- package/dist/app/shared/ocean/bloom-bright.wgsl.js +1 -0
- package/dist/app/shared/ocean/bloom-composite.wgsl +40 -0
- package/dist/app/shared/ocean/bloom-composite.wgsl.js +1 -0
- package/dist/app/shared/ocean/brand-colors.d.ts +9 -0
- package/dist/app/shared/ocean/brand-colors.d.ts.map +1 -0
- package/dist/app/shared/ocean/brand-colors.js +45 -0
- package/dist/app/shared/ocean/brand-colors.js.map +1 -0
- package/dist/app/shared/ocean/camera.d.ts +5 -0
- package/dist/app/shared/ocean/camera.d.ts.map +1 -0
- package/dist/app/shared/ocean/camera.js +24 -0
- package/dist/app/shared/ocean/camera.js.map +1 -0
- package/dist/app/shared/ocean/hero-ocean-background.d.ts +8 -0
- package/dist/app/shared/ocean/hero-ocean-background.d.ts.map +1 -0
- package/dist/app/shared/ocean/hero-ocean-background.js +186 -0
- package/dist/app/shared/ocean/hero-ocean-background.js.map +1 -0
- package/dist/app/shared/ocean/ifft-stage.wgsl +36 -0
- package/dist/app/shared/ocean/ifft-stage.wgsl.js +1 -0
- package/dist/app/shared/ocean/initial-spectrum.wgsl +36 -0
- package/dist/app/shared/ocean/initial-spectrum.wgsl.js +1 -0
- package/dist/app/shared/ocean/noise.wgsl +24 -0
- package/dist/app/shared/ocean/noise.wgsl.js +1 -0
- package/dist/app/shared/ocean/normal-foam.wgsl +32 -0
- package/dist/app/shared/ocean/normal-foam.wgsl.js +1 -0
- package/dist/app/shared/ocean/ocean-colors.d.ts +6 -0
- package/dist/app/shared/ocean/ocean-colors.d.ts.map +1 -0
- package/dist/app/shared/ocean/ocean-colors.js +6 -0
- package/dist/app/shared/ocean/ocean-colors.js.map +1 -0
- package/dist/app/shared/ocean/ocean-common.wgsl +15 -0
- package/dist/app/shared/ocean/ocean-common.wgsl.js +1 -0
- package/dist/app/shared/ocean/ocean-graph.d.ts +12 -0
- package/dist/app/shared/ocean/ocean-graph.d.ts.map +1 -0
- package/dist/app/shared/ocean/ocean-graph.js +16 -0
- package/dist/app/shared/ocean/ocean-graph.js.map +1 -0
- package/dist/app/shared/ocean/particles.wgsl +139 -0
- package/dist/app/shared/ocean/particles.wgsl.js +1 -0
- package/dist/app/shared/ocean/present.wgsl +40 -0
- package/dist/app/shared/ocean/present.wgsl.js +1 -0
- package/dist/app/shared/ocean/renderer.d.ts +66 -0
- package/dist/app/shared/ocean/renderer.d.ts.map +1 -0
- package/dist/app/shared/ocean/renderer.js +535 -0
- package/dist/app/shared/ocean/renderer.js.map +1 -0
- package/dist/app/shared/ocean/spectrum.wgsl +35 -0
- package/dist/app/shared/ocean/spectrum.wgsl.js +1 -0
- package/dist/app/shared/ocean/tuning.d.ts +48 -0
- package/dist/app/shared/ocean/tuning.d.ts.map +1 -0
- package/dist/app/shared/ocean/tuning.js +74 -0
- package/dist/app/shared/ocean/tuning.js.map +1 -0
- package/dist/app/shared/ocean/webgpu-support.d.ts +3 -0
- package/dist/app/shared/ocean/webgpu-support.d.ts.map +1 -0
- package/dist/app/shared/ocean/webgpu-support.js +13 -0
- package/dist/app/shared/ocean/webgpu-support.js.map +1 -0
- package/dist/app/sharing/AccessRequestApprovalPage.d.ts +23 -0
- package/dist/app/sharing/AccessRequestApprovalPage.d.ts.map +1 -0
- package/dist/app/sharing/AccessRequestApprovalPage.js +95 -0
- package/dist/app/sharing/AccessRequestApprovalPage.js.map +1 -0
- package/dist/app/sharing/AccessRequestsSection.d.ts +5 -0
- package/dist/app/sharing/AccessRequestsSection.d.ts.map +1 -0
- package/dist/app/sharing/AccessRequestsSection.js +47 -0
- package/dist/app/sharing/AccessRequestsSection.js.map +1 -0
- package/dist/app/sharing/ResourceAccessScreen.d.ts +53 -0
- package/dist/app/sharing/ResourceAccessScreen.d.ts.map +1 -0
- package/dist/app/sharing/ResourceAccessScreen.js +132 -0
- package/dist/app/sharing/ResourceAccessScreen.js.map +1 -0
- package/dist/app/sharing/ShareButton.d.ts.map +1 -1
- package/dist/app/sharing/ShareButton.js +4 -2
- package/dist/app/sharing/ShareButton.js.map +1 -1
- package/dist/app/sharing/ShareDialog.d.ts.map +1 -1
- package/dist/app/sharing/ShareDialog.js +7 -5
- package/dist/app/sharing/ShareDialog.js.map +1 -1
- package/dist/app/sharing/index.d.ts +2 -0
- package/dist/app/sharing/index.d.ts.map +1 -1
- package/dist/app/sharing/index.js +2 -0
- package/dist/app/sharing/index.js.map +1 -1
- package/dist/app/styles/agent-native.css +21 -1
- package/dist/app/styles/tokens/agent-kit.css +3 -1
- package/dist/composer/AgentSuggestionBar.d.ts +1 -1
- package/dist/composer/AgentSuggestionBar.d.ts.map +1 -1
- package/dist/composer/AgentSuggestionBar.js +75 -6
- package/dist/composer/AgentSuggestionBar.js.map +1 -1
- package/package.json +14 -4
- package/src/app/agentkit/react/components.tsx +492 -60
- package/src/app/agentkit/react/context.tsx +10 -0
- package/src/app/agentkit/react/lifecycle.spec.tsx +487 -1
- package/src/app/agentkit/react/styles.css +78 -3
- package/src/app/auth/AuthPage.spec.tsx +11 -7
- package/src/app/auth/AuthPage.tsx +16 -35
- package/src/app/auth/server.spec.ts +68 -0
- package/src/app/auth/server.ts +29 -0
- package/src/app/chat/AgentKitAssistantChat.spec.tsx +287 -290
- package/src/app/chat/AgentKitAssistantChat.tsx +219 -116
- package/src/app/chat/AgentSidebar.tsx +3 -0
- package/src/app/chat/agentkit-chat/guided-questions.flow.spec.tsx +85 -0
- package/src/app/chat/agentkit-chat/guided-questions.tsx +12 -5
- package/src/app/chat/chat/surface-types.ts +2 -0
- package/src/app/i18n/catalogs/ar-SA.ts +44 -0
- package/src/app/i18n/catalogs/de-DE.ts +55 -0
- package/src/app/i18n/catalogs/en-US.ts +46 -0
- package/src/app/i18n/catalogs/es-ES.ts +53 -0
- package/src/app/i18n/catalogs/fr-FR.ts +53 -0
- package/src/app/i18n/catalogs/hi-IN.ts +47 -0
- package/src/app/i18n/catalogs/ja-JP.ts +54 -0
- package/src/app/i18n/catalogs/ko-KR.ts +50 -0
- package/src/app/i18n/catalogs/pt-BR.ts +52 -0
- package/src/app/i18n/catalogs/zh-CN.ts +42 -0
- package/src/app/i18n/catalogs/zh-TW.ts +43 -0
- package/src/app/shared/StarfieldBackground.tsx +4 -423
- package/src/app/shared/WaveBackground.spec.tsx +104 -0
- package/src/app/shared/WaveBackground.tsx +60 -0
- package/src/app/shared/WebGlWaveBackground.spec.tsx +106 -0
- package/src/app/shared/WebGlWaveBackground.tsx +499 -0
- package/src/app/shared/index.ts +1 -0
- package/src/app/shared/ocean/bloom-blur.wgsl +43 -0
- package/src/app/shared/ocean/bloom-bright.wgsl +21 -0
- package/src/app/shared/ocean/bloom-composite.wgsl +40 -0
- package/src/app/shared/ocean/brand-colors.ts +49 -0
- package/src/app/shared/ocean/camera.ts +28 -0
- package/src/app/shared/ocean/hero-ocean-background.spec.tsx +369 -0
- package/src/app/shared/ocean/hero-ocean-background.tsx +238 -0
- package/src/app/shared/ocean/ifft-stage.wgsl +36 -0
- package/src/app/shared/ocean/initial-spectrum.wgsl +36 -0
- package/src/app/shared/ocean/noise.wgsl +24 -0
- package/src/app/shared/ocean/normal-foam.wgsl +32 -0
- package/src/app/shared/ocean/ocean-colors.ts +11 -0
- package/src/app/shared/ocean/ocean-common.wgsl +15 -0
- package/src/app/shared/ocean/ocean-graph.ts +29 -0
- package/src/app/shared/ocean/particles.wgsl +139 -0
- package/src/app/shared/ocean/present.wgsl +40 -0
- package/src/app/shared/ocean/renderer.spec.ts +100 -0
- package/src/app/shared/ocean/renderer.ts +693 -0
- package/src/app/shared/ocean/spectrum.wgsl +35 -0
- package/src/app/shared/ocean/tuning.ts +131 -0
- package/src/app/shared/ocean/webgpu-support.ts +12 -0
- package/src/app/sharing/AccessRequestApprovalPage.spec.tsx +276 -0
- package/src/app/sharing/AccessRequestApprovalPage.tsx +307 -0
- package/src/app/sharing/AccessRequestsSection.tsx +163 -0
- package/src/app/sharing/ResourceAccessScreen.spec.tsx +235 -0
- package/src/app/sharing/ResourceAccessScreen.tsx +331 -0
- package/src/app/sharing/ShareButton.spec.tsx +171 -5
- package/src/app/sharing/ShareButton.tsx +15 -2
- package/src/app/sharing/ShareDialog.spec.tsx +71 -2
- package/src/app/sharing/ShareDialog.tsx +24 -2
- package/src/app/sharing/index.ts +2 -0
- package/src/app/styles/agent-native.css +21 -1
- package/src/app/styles/agent-native.spec.ts +16 -3
- package/src/app/styles/tokens/agent-kit.css +3 -1
- package/src/composer/AgentSuggestionBar.overflow.spec.tsx +277 -0
- package/src/composer/AgentSuggestionBar.tsx +113 -8
- package/src/wgsl-env.d.ts +6 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { DEFAULT_OCEAN_COLORS } from "./ocean-colors.js";
|
|
2
|
+
// guard:allow-raw-color - These fixed values calibrate the standalone GPU shader to the docs brand.
|
|
3
|
+
const DARK_COLORS = { fg: "#aeadac", bg: "#0a0a0a" };
|
|
4
|
+
// guard:allow-raw-color - These fixed values calibrate the standalone GPU shader to the docs brand.
|
|
5
|
+
const LIGHT_COLORS = { fg: "#00677f", bg: "#faf9f5" };
|
|
6
|
+
/**
|
|
7
|
+
* Returns null for anything that is not a full six-digit hex. Callers fall back
|
|
8
|
+
* to the packaged defaults -- an unreadable token and a legitimately dark token
|
|
9
|
+
* must not produce the same silent black.
|
|
10
|
+
*/
|
|
11
|
+
export function hexToLinearRgb(hex) {
|
|
12
|
+
const normalized = hex.trim().replace("#", "");
|
|
13
|
+
if (!/^[0-9a-fA-F]{6}$/.test(normalized))
|
|
14
|
+
return null;
|
|
15
|
+
const value = Number.parseInt(normalized, 16);
|
|
16
|
+
return [
|
|
17
|
+
srgbToLinear(((value >> 16) & 255) / 255),
|
|
18
|
+
srgbToLinear(((value >> 8) & 255) / 255),
|
|
19
|
+
srgbToLinear((value & 255) / 255),
|
|
20
|
+
];
|
|
21
|
+
}
|
|
22
|
+
function srgbToLinear(channel) {
|
|
23
|
+
return channel <= 0.04045
|
|
24
|
+
? channel / 12.92
|
|
25
|
+
: ((channel + 0.055) / 1.055) ** 2.4;
|
|
26
|
+
}
|
|
27
|
+
export function readOceanColors(element) {
|
|
28
|
+
const styles = getComputedStyle(element);
|
|
29
|
+
const fg = hexToLinearRgb(styles.getPropertyValue("--b-hero-shader-fg"));
|
|
30
|
+
const bg = hexToLinearRgb(styles.getPropertyValue("--b-bg-page"));
|
|
31
|
+
if (fg && bg)
|
|
32
|
+
return { fg, bg };
|
|
33
|
+
const root = document.documentElement;
|
|
34
|
+
const dark = root.classList.contains("dark")
|
|
35
|
+
? true
|
|
36
|
+
: root.classList.contains("light")
|
|
37
|
+
? false
|
|
38
|
+
: root.getAttribute("data-theme") === "dark";
|
|
39
|
+
const colors = dark ? DARK_COLORS : LIGHT_COLORS;
|
|
40
|
+
return {
|
|
41
|
+
fg: hexToLinearRgb(colors.fg) ?? DEFAULT_OCEAN_COLORS.fg,
|
|
42
|
+
bg: hexToLinearRgb(colors.bg) ?? DEFAULT_OCEAN_COLORS.bg,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=brand-colors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brand-colors.js","sourceRoot":"","sources":["../../../../src/app/shared/ocean/brand-colors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAoB,MAAM,mBAAmB,CAAC;AAE3E,oGAAoG;AACpG,MAAM,WAAW,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;AACrD,oGAAoG;AACpG,MAAM,YAAY,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;AAEtD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,GAAW;IAEX,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC/C,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACtD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC9C,OAAO;QACL,YAAY,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QACzC,YAAY,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QACxC,YAAY,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;KAClC,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACnC,OAAO,OAAO,IAAI,OAAO;QACvB,CAAC,CAAC,OAAO,GAAG,KAAK;QACjB,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC,CAAC;IACzE,MAAM,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC;IAClE,IAAI,EAAE,IAAI,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAEhC,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC1C,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;YAChC,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,KAAK,MAAM,CAAC;IACjD,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC;IACjD,OAAO;QACL,EAAE,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,oBAAoB,CAAC,EAAE;QACxD,EAAE,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,oBAAoB,CAAC,EAAE;KACzD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"camera.d.ts","sourceRoot":"","sources":["../../../../src/app/shared/ocean/camera.ts"],"names":[],"mappings":"AAEA,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;;;EAyB1D"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { OCEAN_TUNING } from "./tuning.js";
|
|
2
|
+
export function oceanCamera(size) {
|
|
3
|
+
const { eye, target, pitchDegrees, fovDegrees, near, far } = OCEAN_TUNING.camera;
|
|
4
|
+
const angle = Math.atan2(eye[1] - target[1], eye[2] - target[2]) -
|
|
5
|
+
(pitchDegrees * Math.PI) / 180;
|
|
6
|
+
const c = Math.cos(angle);
|
|
7
|
+
const s = Math.sin(angle);
|
|
8
|
+
const f = 1 / Math.tan((fovDegrees * Math.PI) / 360);
|
|
9
|
+
const view = new Float32Array(16);
|
|
10
|
+
view[0] = view[15] = 1;
|
|
11
|
+
view[5] = view[10] = c;
|
|
12
|
+
view[6] = s;
|
|
13
|
+
view[9] = -s;
|
|
14
|
+
view[13] = -(c * eye[1] - s * eye[2]);
|
|
15
|
+
view[14] = -(s * eye[1] + c * eye[2]);
|
|
16
|
+
const projection = new Float32Array(16);
|
|
17
|
+
projection[0] = f / (size[0] / Math.max(1, size[1]));
|
|
18
|
+
projection[5] = f;
|
|
19
|
+
projection[10] = far / (near - far);
|
|
20
|
+
projection[11] = -1;
|
|
21
|
+
projection[14] = (far * near) / (near - far);
|
|
22
|
+
return { view, projection };
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=camera.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"camera.js","sourceRoot":"","sources":["../../../../src/app/shared/ocean/camera.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,UAAU,WAAW,CAAC,IAA+B;IACzD,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,GACxD,YAAY,CAAC,MAAM,CAAC;IACtB,MAAM,KAAK,GACT,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IACjC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1B,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;IAErD,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;IAClC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACvB,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACvB,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACZ,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACb,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtC,MAAM,UAAU,GAAG,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;IACxC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAClB,UAAU,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACpB,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;IAC7C,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface HeroOceanBackgroundProps {
|
|
2
|
+
onError: (error: unknown) => void;
|
|
3
|
+
onReady: () => void;
|
|
4
|
+
frameRate?: number;
|
|
5
|
+
className?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function HeroOceanBackground({ onError, onReady, frameRate, className, }: HeroOceanBackgroundProps): import("react").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=hero-ocean-background.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hero-ocean-background.d.ts","sourceRoot":"","sources":["../../../../src/app/shared/ocean/hero-ocean-background.tsx"],"names":[],"mappings":"AAUA,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAClC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,wBAAgB,mBAAmB,CAAC,EAClC,OAAO,EACP,OAAO,EACP,SAAc,EACd,SAAqC,GACtC,EAAE,wBAAwB,+BAqN1B"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
|
+
import { readOceanColors } from "./brand-colors.js";
|
|
4
|
+
import { OCEAN_TUNING } from "./tuning.js";
|
|
5
|
+
const FADE_IN_MS = 700;
|
|
6
|
+
const RENDERER_INIT_TIMEOUT_MS = 30_000;
|
|
7
|
+
const FIRST_FRAME_TIMEOUT_MS = 6000;
|
|
8
|
+
export function HeroOceanBackground({ onError, onReady, frameRate = 30, className = "absolute inset-0 z-[-1]", }) {
|
|
9
|
+
const containerRef = useRef(null);
|
|
10
|
+
const canvasRef = useRef(null);
|
|
11
|
+
const [ready, setReady] = useState(false);
|
|
12
|
+
const onErrorRef = useRef(onError);
|
|
13
|
+
const onReadyRef = useRef(onReady);
|
|
14
|
+
onErrorRef.current = onError;
|
|
15
|
+
onReadyRef.current = onReady;
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
const container = containerRef.current;
|
|
18
|
+
const canvas = canvasRef.current;
|
|
19
|
+
if (!container || !canvas)
|
|
20
|
+
return;
|
|
21
|
+
let renderer;
|
|
22
|
+
let cancelled = false;
|
|
23
|
+
let rendererFailed = false;
|
|
24
|
+
const cleanups = [];
|
|
25
|
+
let firstFrameTimeout;
|
|
26
|
+
let firstFrameStartedAt;
|
|
27
|
+
let firstFrameRemainingMs = FIRST_FRAME_TIMEOUT_MS;
|
|
28
|
+
let waitingForFirstFrame = false;
|
|
29
|
+
const pauseFirstFrameDeadline = () => {
|
|
30
|
+
if (firstFrameTimeout === undefined)
|
|
31
|
+
return;
|
|
32
|
+
window.clearTimeout(firstFrameTimeout);
|
|
33
|
+
firstFrameTimeout = undefined;
|
|
34
|
+
firstFrameRemainingMs = Math.max(0, firstFrameRemainingMs -
|
|
35
|
+
(Date.now() - (firstFrameStartedAt ?? Date.now())));
|
|
36
|
+
firstFrameStartedAt = undefined;
|
|
37
|
+
};
|
|
38
|
+
const resumeFirstFrameDeadline = () => {
|
|
39
|
+
if (cancelled ||
|
|
40
|
+
rendererFailed ||
|
|
41
|
+
!waitingForFirstFrame ||
|
|
42
|
+
document.hidden ||
|
|
43
|
+
firstFrameTimeout !== undefined) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
firstFrameStartedAt = Date.now();
|
|
47
|
+
firstFrameTimeout = window.setTimeout(() => failRenderer(new Error("The ocean wave did not draw a frame")), firstFrameRemainingMs);
|
|
48
|
+
};
|
|
49
|
+
const stopFirstFrameDeadline = () => {
|
|
50
|
+
waitingForFirstFrame = false;
|
|
51
|
+
pauseFirstFrameDeadline();
|
|
52
|
+
};
|
|
53
|
+
const rendererInitTimeout = window.setTimeout(() => {
|
|
54
|
+
failRenderer(new Error("The ocean wave renderer did not initialize"));
|
|
55
|
+
}, RENDERER_INIT_TIMEOUT_MS);
|
|
56
|
+
cleanups.push(() => {
|
|
57
|
+
window.clearTimeout(rendererInitTimeout);
|
|
58
|
+
stopFirstFrameDeadline();
|
|
59
|
+
});
|
|
60
|
+
const failRenderer = (error) => {
|
|
61
|
+
if (cancelled || rendererFailed)
|
|
62
|
+
return;
|
|
63
|
+
rendererFailed = true;
|
|
64
|
+
window.clearTimeout(rendererInitTimeout);
|
|
65
|
+
stopFirstFrameDeadline();
|
|
66
|
+
renderer?.dispose();
|
|
67
|
+
onErrorRef.current(error);
|
|
68
|
+
};
|
|
69
|
+
const handleDocumentVisibility = () => {
|
|
70
|
+
if (document.hidden)
|
|
71
|
+
pauseFirstFrameDeadline();
|
|
72
|
+
else
|
|
73
|
+
resumeFirstFrameDeadline();
|
|
74
|
+
};
|
|
75
|
+
document.addEventListener("visibilitychange", handleDocumentVisibility);
|
|
76
|
+
cleanups.push(() => document.removeEventListener("visibilitychange", handleDocumentVisibility));
|
|
77
|
+
let pointerTarget = [0, 0, 0];
|
|
78
|
+
let lastPointer;
|
|
79
|
+
const updatePointer = (clientX, clientY) => {
|
|
80
|
+
const rect = container.getBoundingClientRect();
|
|
81
|
+
if (rect.width <= 0 || rect.height <= 0)
|
|
82
|
+
return;
|
|
83
|
+
const x = clientX - rect.left;
|
|
84
|
+
const y = clientY - rect.top;
|
|
85
|
+
const inside = x >= 0 && x <= rect.width && y >= 0 && y <= rect.height;
|
|
86
|
+
pointerTarget = [
|
|
87
|
+
(x / rect.width) * 2 - 1,
|
|
88
|
+
1 - (y / rect.height) * 2,
|
|
89
|
+
inside ? 1 : 0,
|
|
90
|
+
];
|
|
91
|
+
renderer?.setPointer(pointerTarget);
|
|
92
|
+
};
|
|
93
|
+
const handleMouseMove = (event) => {
|
|
94
|
+
lastPointer = [event.clientX, event.clientY];
|
|
95
|
+
updatePointer(event.clientX, event.clientY);
|
|
96
|
+
};
|
|
97
|
+
const handleScroll = () => {
|
|
98
|
+
if (!lastPointer)
|
|
99
|
+
return;
|
|
100
|
+
updatePointer(lastPointer[0], lastPointer[1]);
|
|
101
|
+
};
|
|
102
|
+
const fadePointer = () => {
|
|
103
|
+
lastPointer = undefined;
|
|
104
|
+
pointerTarget = [pointerTarget[0], pointerTarget[1], 0];
|
|
105
|
+
renderer?.setPointer(pointerTarget);
|
|
106
|
+
};
|
|
107
|
+
document.body.addEventListener("mousemove", handleMouseMove, {
|
|
108
|
+
passive: true,
|
|
109
|
+
});
|
|
110
|
+
document.body.addEventListener("mouseleave", fadePointer, {
|
|
111
|
+
passive: true,
|
|
112
|
+
});
|
|
113
|
+
window.addEventListener("scroll", handleScroll, { passive: true });
|
|
114
|
+
window.addEventListener("blur", fadePointer);
|
|
115
|
+
cleanups.push(() => {
|
|
116
|
+
document.body.removeEventListener("mousemove", handleMouseMove);
|
|
117
|
+
document.body.removeEventListener("mouseleave", fadePointer);
|
|
118
|
+
window.removeEventListener("scroll", handleScroll);
|
|
119
|
+
window.removeEventListener("blur", fadePointer);
|
|
120
|
+
});
|
|
121
|
+
void import("./renderer.js")
|
|
122
|
+
.then(({ createRenderer }) => {
|
|
123
|
+
if (cancelled || rendererFailed)
|
|
124
|
+
return;
|
|
125
|
+
renderer = createRenderer({
|
|
126
|
+
canvas,
|
|
127
|
+
colors: readOceanColors(container),
|
|
128
|
+
fps: frameRate,
|
|
129
|
+
onError: failRenderer,
|
|
130
|
+
});
|
|
131
|
+
renderer.setPointer(pointerTarget);
|
|
132
|
+
void renderer.ready
|
|
133
|
+
.then(() => {
|
|
134
|
+
if (cancelled || rendererFailed)
|
|
135
|
+
return;
|
|
136
|
+
window.clearTimeout(rendererInitTimeout);
|
|
137
|
+
waitingForFirstFrame = true;
|
|
138
|
+
resumeFirstFrameDeadline();
|
|
139
|
+
return renderer?.firstFrame;
|
|
140
|
+
})
|
|
141
|
+
.then(() => {
|
|
142
|
+
if (cancelled || rendererFailed)
|
|
143
|
+
return;
|
|
144
|
+
stopFirstFrameDeadline();
|
|
145
|
+
setReady(true);
|
|
146
|
+
onReadyRef.current();
|
|
147
|
+
})
|
|
148
|
+
.catch(failRenderer);
|
|
149
|
+
const themeObserver = new MutationObserver(() => {
|
|
150
|
+
renderer?.setColors(readOceanColors(container));
|
|
151
|
+
});
|
|
152
|
+
themeObserver.observe(document.documentElement, {
|
|
153
|
+
attributes: true,
|
|
154
|
+
attributeFilter: ["class", "data-theme"],
|
|
155
|
+
});
|
|
156
|
+
cleanups.push(() => themeObserver.disconnect());
|
|
157
|
+
const visibility = new IntersectionObserver(([entry]) => renderer?.setPaused(!(entry?.isIntersecting ?? true)), { threshold: 0 });
|
|
158
|
+
visibility.observe(container);
|
|
159
|
+
cleanups.push(() => visibility.disconnect());
|
|
160
|
+
})
|
|
161
|
+
.catch((error) => {
|
|
162
|
+
failRenderer(error);
|
|
163
|
+
});
|
|
164
|
+
return () => {
|
|
165
|
+
cancelled = true;
|
|
166
|
+
for (const cleanup of cleanups)
|
|
167
|
+
cleanup();
|
|
168
|
+
renderer?.dispose();
|
|
169
|
+
};
|
|
170
|
+
}, [frameRate]);
|
|
171
|
+
const { bottomFadeStartPercent } = OCEAN_TUNING;
|
|
172
|
+
const mask = bottomFadeStartPercent >= 100
|
|
173
|
+
? undefined
|
|
174
|
+
: // guard:allow-raw-color - The mask channel requires opaque black, not a theme color.
|
|
175
|
+
`linear-gradient(to bottom, #000 ${bottomFadeStartPercent}%, transparent 100%)`;
|
|
176
|
+
return (_jsx("div", { ref: containerRef, "aria-hidden": "true", "data-agent-native-wave": "true",
|
|
177
|
+
// Opacity is inline rather than a class because it animates between 0
|
|
178
|
+
// and a token value; the page background remains visible until the
|
|
179
|
+
// first wave frame is ready.
|
|
180
|
+
className: className, style: {
|
|
181
|
+
opacity: ready ? 0.3 : 0,
|
|
182
|
+
transition: `opacity ${FADE_IN_MS}ms ease-out`,
|
|
183
|
+
...(mask ? { maskImage: mask, WebkitMaskImage: mask } : {}),
|
|
184
|
+
}, children: _jsx("canvas", { ref: canvasRef, className: "block h-full w-full", style: { display: "block", height: "100%", width: "100%" } }) }));
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=hero-ocean-background.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hero-ocean-background.js","sourceRoot":"","sources":["../../../../src/app/shared/ocean/hero-ocean-background.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEpD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,UAAU,GAAG,GAAG,CAAC;AACvB,MAAM,wBAAwB,GAAG,MAAM,CAAC;AACxC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAWpC,MAAM,UAAU,mBAAmB,CAAC,EAClC,OAAO,EACP,OAAO,EACP,SAAS,GAAG,EAAE,EACd,SAAS,GAAG,yBAAyB,GACZ;IACzB,MAAM,YAAY,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;IAC7B,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;IAE7B,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;QACvC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC;QACjC,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM;YAAE,OAAO;QAElC,IAAI,QAAmC,CAAC;QACxC,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,MAAM,QAAQ,GAAmB,EAAE,CAAC;QACpC,IAAI,iBAAqC,CAAC;QAC1C,IAAI,mBAAuC,CAAC;QAC5C,IAAI,qBAAqB,GAAG,sBAAsB,CAAC;QACnD,IAAI,oBAAoB,GAAG,KAAK,CAAC;QACjC,MAAM,uBAAuB,GAAG,GAAG,EAAE;YACnC,IAAI,iBAAiB,KAAK,SAAS;gBAAE,OAAO;YAC5C,MAAM,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;YACvC,iBAAiB,GAAG,SAAS,CAAC;YAC9B,qBAAqB,GAAG,IAAI,CAAC,GAAG,CAC9B,CAAC,EACD,qBAAqB;gBACnB,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,mBAAmB,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CACrD,CAAC;YACF,mBAAmB,GAAG,SAAS,CAAC;QAClC,CAAC,CAAC;QACF,MAAM,wBAAwB,GAAG,GAAG,EAAE;YACpC,IACE,SAAS;gBACT,cAAc;gBACd,CAAC,oBAAoB;gBACrB,QAAQ,CAAC,MAAM;gBACf,iBAAiB,KAAK,SAAS,EAC/B,CAAC;gBACD,OAAO;YACT,CAAC;YACD,mBAAmB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACjC,iBAAiB,GAAG,MAAM,CAAC,UAAU,CACnC,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC,EACpE,qBAAqB,CACtB,CAAC;QACJ,CAAC,CAAC;QACF,MAAM,sBAAsB,GAAG,GAAG,EAAE;YAClC,oBAAoB,GAAG,KAAK,CAAC;YAC7B,uBAAuB,EAAE,CAAC;QAC5B,CAAC,CAAC;QACF,MAAM,mBAAmB,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YACjD,YAAY,CAAC,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC,CAAC;QACxE,CAAC,EAAE,wBAAwB,CAAC,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE;YACjB,MAAM,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC;YACzC,sBAAsB,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,CAAC,KAAc,EAAE,EAAE;YACtC,IAAI,SAAS,IAAI,cAAc;gBAAE,OAAO;YACxC,cAAc,GAAG,IAAI,CAAC;YACtB,MAAM,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC;YACzC,sBAAsB,EAAE,CAAC;YACzB,QAAQ,EAAE,OAAO,EAAE,CAAC;YACpB,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC;QACF,MAAM,wBAAwB,GAAG,GAAG,EAAE;YACpC,IAAI,QAAQ,CAAC,MAAM;gBAAE,uBAAuB,EAAE,CAAC;;gBAC1C,wBAAwB,EAAE,CAAC;QAClC,CAAC,CAAC;QACF,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,wBAAwB,CAAC,CAAC;QACxE,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CACjB,QAAQ,CAAC,mBAAmB,CAC1B,kBAAkB,EAClB,wBAAwB,CACzB,CACF,CAAC;QACF,IAAI,aAAa,GAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,IAAI,WAAkD,CAAC;QAEvD,MAAM,aAAa,GAAG,CAAC,OAAe,EAAE,OAAe,EAAE,EAAE;YACzD,MAAM,IAAI,GAAG,SAAS,CAAC,qBAAqB,EAAE,CAAC;YAC/C,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC;gBAAE,OAAO;YAEhD,MAAM,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;YAC9B,MAAM,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC;YAC7B,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC;YAEvE,aAAa,GAAG;gBACd,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;gBACxB,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;gBACzB,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACf,CAAC;YACF,QAAQ,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC;QACtC,CAAC,CAAC;QAEF,MAAM,eAAe,GAAG,CAAC,KAAiB,EAAE,EAAE;YAC5C,WAAW,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7C,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC,CAAC;QAEF,MAAM,YAAY,GAAG,GAAG,EAAE;YACxB,IAAI,CAAC,WAAW;gBAAE,OAAO;YACzB,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,GAAG,EAAE;YACvB,WAAW,GAAG,SAAS,CAAC;YACxB,aAAa,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxD,QAAQ,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC;QACtC,CAAC,CAAC;QAEF,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,eAAe,EAAE;YAC3D,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,WAAW,EAAE;YACxD,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC7C,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE;YACjB,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;YAChE,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;YAC7D,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACnD,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,KAAK,MAAM,CAAC,eAAe,CAAC;aACzB,IAAI,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE;YAC3B,IAAI,SAAS,IAAI,cAAc;gBAAE,OAAO;YACxC,QAAQ,GAAG,cAAc,CAAC;gBACxB,MAAM;gBACN,MAAM,EAAE,eAAe,CAAC,SAAS,CAAC;gBAClC,GAAG,EAAE,SAAS;gBACd,OAAO,EAAE,YAAY;aACtB,CAAC,CAAC;YACH,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;YAEnC,KAAK,QAAQ,CAAC,KAAK;iBAChB,IAAI,CAAC,GAAG,EAAE;gBACT,IAAI,SAAS,IAAI,cAAc;oBAAE,OAAO;gBACxC,MAAM,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC;gBACzC,oBAAoB,GAAG,IAAI,CAAC;gBAC5B,wBAAwB,EAAE,CAAC;gBAC3B,OAAO,QAAQ,EAAE,UAAU,CAAC;YAC9B,CAAC,CAAC;iBACD,IAAI,CAAC,GAAG,EAAE;gBACT,IAAI,SAAS,IAAI,cAAc;oBAAE,OAAO;gBACxC,sBAAsB,EAAE,CAAC;gBACzB,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACf,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,CAAC,CAAC;iBACD,KAAK,CAAC,YAAY,CAAC,CAAC;YAEvB,MAAM,aAAa,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE;gBAC9C,QAAQ,EAAE,SAAS,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;YACH,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE;gBAC9C,UAAU,EAAE,IAAI;gBAChB,eAAe,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC;aACzC,CAAC,CAAC;YACH,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC;YAEhD,MAAM,UAAU,GAAG,IAAI,oBAAoB,CACzC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,cAAc,IAAI,IAAI,CAAC,CAAC,EAClE,EAAE,SAAS,EAAE,CAAC,EAAE,CACjB,CAAC;YACF,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACxB,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;QAEL,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;YACjB,KAAK,MAAM,OAAO,IAAI,QAAQ;gBAAE,OAAO,EAAE,CAAC;YAC1C,QAAQ,EAAE,OAAO,EAAE,CAAC;QACtB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,MAAM,EAAE,sBAAsB,EAAE,GAAG,YAAY,CAAC;IAChD,MAAM,IAAI,GACR,sBAAsB,IAAI,GAAG;QAC3B,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,qFAAqF;YACrF,mCAAmC,sBAAsB,sBAAsB,CAAC;IAEtF,OAAO,CACL,cACE,GAAG,EAAE,YAAY,iBACL,MAAM,4BACK,MAAM;QAC7B,sEAAsE;QACtE,mEAAmE;QACnE,6BAA6B;QAC7B,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE;YACL,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxB,UAAU,EAAE,WAAW,UAAU,aAAa;YAC9C,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5D,YAED,iBACE,GAAG,EAAE,SAAS,EACd,SAAS,EAAC,qBAAqB,EAC/B,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAC1D,GACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
struct IfftStageUniforms {
|
|
2
|
+
resolution: f32,
|
|
3
|
+
subtransformSize: f32,
|
|
4
|
+
horizontal: f32,
|
|
5
|
+
};
|
|
6
|
+
@group(0) @binding(0) var<uniform> u: IfftStageUniforms;
|
|
7
|
+
@group(0) @binding(1) var u_input: texture_2d<f32>;
|
|
8
|
+
|
|
9
|
+
@fragment fn fs_main(@builtin(position) position: vec4f) -> @location(0) vec4f {
|
|
10
|
+
let N = i32(u.resolution);
|
|
11
|
+
let horizontal = u.horizontal > 0.5;
|
|
12
|
+
let index = select(position.y - 0.5, position.x - 0.5, horizontal);
|
|
13
|
+
|
|
14
|
+
let evenIndex = floor(index / u.subtransformSize) * (u.subtransformSize * 0.5)
|
|
15
|
+
+ (index % (u.subtransformSize * 0.5));
|
|
16
|
+
|
|
17
|
+
let evenCoord = select(
|
|
18
|
+
vec2i(i32(position.x - 0.5), i32(evenIndex)),
|
|
19
|
+
vec2i(i32(evenIndex), i32(position.y - 0.5)),
|
|
20
|
+
horizontal,
|
|
21
|
+
);
|
|
22
|
+
let oddCoord = select(
|
|
23
|
+
vec2i(i32(position.x - 0.5), i32(evenIndex + u.resolution * 0.5)),
|
|
24
|
+
vec2i(i32(evenIndex + u.resolution * 0.5), i32(position.y - 0.5)),
|
|
25
|
+
horizontal,
|
|
26
|
+
);
|
|
27
|
+
let even = wrapLoad(u_input, evenCoord, N);
|
|
28
|
+
let odd = wrapLoad(u_input, oddCoord, N);
|
|
29
|
+
|
|
30
|
+
let twiddleArg = 2.0 * PI * (index / u.subtransformSize);
|
|
31
|
+
let twiddle = vec2f(cos(twiddleArg), sin(twiddleArg));
|
|
32
|
+
|
|
33
|
+
let outA = even.xy + cmul(twiddle, odd.xy);
|
|
34
|
+
let outB = even.zw + cmul(twiddle, odd.zw);
|
|
35
|
+
return vec4f(outA, outB);
|
|
36
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default "struct IfftStageUniforms {\n resolution: f32,\n subtransformSize: f32,\n horizontal: f32,\n};\n@group(0) @binding(0) var<uniform> u: IfftStageUniforms;\n@group(0) @binding(1) var u_input: texture_2d<f32>;\n\n@fragment fn fs_main(@builtin(position) position: vec4f) -> @location(0) vec4f {\n let N = i32(u.resolution);\n let horizontal = u.horizontal > 0.5;\n let index = select(position.y - 0.5, position.x - 0.5, horizontal);\n\n let evenIndex = floor(index / u.subtransformSize) * (u.subtransformSize * 0.5)\n + (index % (u.subtransformSize * 0.5));\n\n let evenCoord = select(\n vec2i(i32(position.x - 0.5), i32(evenIndex)),\n vec2i(i32(evenIndex), i32(position.y - 0.5)),\n horizontal,\n );\n let oddCoord = select(\n vec2i(i32(position.x - 0.5), i32(evenIndex + u.resolution * 0.5)),\n vec2i(i32(evenIndex + u.resolution * 0.5), i32(position.y - 0.5)),\n horizontal,\n );\n let even = wrapLoad(u_input, evenCoord, N);\n let odd = wrapLoad(u_input, oddCoord, N);\n\n let twiddleArg = 2.0 * PI * (index / u.subtransformSize);\n let twiddle = vec2f(cos(twiddleArg), sin(twiddleArg));\n\n let outA = even.xy + cmul(twiddle, odd.xy);\n let outB = even.zw + cmul(twiddle, odd.zw);\n return vec4f(outA, outB);\n}\n";
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
struct InitialSpectrumUniforms {
|
|
2
|
+
resolution: f32,
|
|
3
|
+
size: f32,
|
|
4
|
+
windSpeed: f32,
|
|
5
|
+
windAngle: f32,
|
|
6
|
+
amplitude: f32,
|
|
7
|
+
};
|
|
8
|
+
@group(0) @binding(0) var<uniform> u: InitialSpectrumUniforms;
|
|
9
|
+
@group(0) @binding(1) var u_noise: texture_2d<f32>;
|
|
10
|
+
|
|
11
|
+
fn phillips(k: vec2f) -> f32 {
|
|
12
|
+
let kk = dot(k, k);
|
|
13
|
+
if (kk < 1e-8) { return 0.0; }
|
|
14
|
+
let w = vec2f(cos(u.windAngle), sin(u.windAngle));
|
|
15
|
+
let L = (u.windSpeed * u.windSpeed) / G;
|
|
16
|
+
let kdotw = dot(normalize(k), w);
|
|
17
|
+
var ph = u.amplitude * exp(-1.0 / (kk * L * L)) / (kk * kk) * (kdotw * kdotw);
|
|
18
|
+
let l = L * 0.001;
|
|
19
|
+
ph *= exp(-kk * l * l);
|
|
20
|
+
if (kdotw < 0.0) { ph *= 0.07; }
|
|
21
|
+
return ph;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
@fragment fn fs_main(@builtin(position) position: vec4f) -> @location(0) vec4f {
|
|
25
|
+
let coord = position.xy - vec2f(0.5);
|
|
26
|
+
let n = select(coord.x - u.resolution, coord.x, coord.x < u.resolution * 0.5);
|
|
27
|
+
let m = select(coord.y - u.resolution, coord.y, coord.y < u.resolution * 0.5);
|
|
28
|
+
let k = (2.0 * PI / u.size) * vec2f(n, m);
|
|
29
|
+
|
|
30
|
+
let rnd = textureLoad(u_noise, vec2u(coord), 0);
|
|
31
|
+
|
|
32
|
+
let h0k = (1.0 / sqrt(2.0)) * vec2f(rnd.x, rnd.y) * sqrt(phillips(k));
|
|
33
|
+
let h0negk = (1.0 / sqrt(2.0)) * vec2f(rnd.z, rnd.w) * sqrt(phillips(-k));
|
|
34
|
+
|
|
35
|
+
return vec4f(h0k, h0negk.x, -h0negk.y);
|
|
36
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default "struct InitialSpectrumUniforms {\n resolution: f32,\n size: f32,\n windSpeed: f32,\n windAngle: f32,\n amplitude: f32,\n};\n@group(0) @binding(0) var<uniform> u: InitialSpectrumUniforms;\n@group(0) @binding(1) var u_noise: texture_2d<f32>;\n\nfn phillips(k: vec2f) -> f32 {\n let kk = dot(k, k);\n if (kk < 1e-8) { return 0.0; }\n let w = vec2f(cos(u.windAngle), sin(u.windAngle));\n let L = (u.windSpeed * u.windSpeed) / G;\n let kdotw = dot(normalize(k), w);\n var ph = u.amplitude * exp(-1.0 / (kk * L * L)) / (kk * kk) * (kdotw * kdotw);\n let l = L * 0.001;\n ph *= exp(-kk * l * l);\n if (kdotw < 0.0) { ph *= 0.07; }\n return ph;\n}\n\n@fragment fn fs_main(@builtin(position) position: vec4f) -> @location(0) vec4f {\n let coord = position.xy - vec2f(0.5);\n let n = select(coord.x - u.resolution, coord.x, coord.x < u.resolution * 0.5);\n let m = select(coord.y - u.resolution, coord.y, coord.y < u.resolution * 0.5);\n let k = (2.0 * PI / u.size) * vec2f(n, m);\n\n let rnd = textureLoad(u_noise, vec2u(coord), 0);\n\n let h0k = (1.0 / sqrt(2.0)) * vec2f(rnd.x, rnd.y) * sqrt(phillips(k));\n let h0negk = (1.0 / sqrt(2.0)) * vec2f(rnd.z, rnd.w) * sqrt(phillips(-k));\n\n return vec4f(h0k, h0negk.x, -h0negk.y);\n}\n";
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const SEED: u32 = 0x6f636561u;
|
|
2
|
+
const RESOLUTION: u32 = 512u;
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
fn mulberryAt(callIndex: u32) -> f32 {
|
|
7
|
+
let state = SEED + 0x6d2b79f5u * (callIndex + 1u);
|
|
8
|
+
var t = state;
|
|
9
|
+
t = (t ^ (t >> 15u)) * (t | 1u);
|
|
10
|
+
t = t ^ (t + ((t ^ (t >> 7u)) * (t | 61u)));
|
|
11
|
+
return f32(t ^ (t >> 14u)) / 4294967296.0;
|
|
12
|
+
}
|
|
13
|
+
fn gaussianPair(callIndex: u32) -> vec2f {
|
|
14
|
+
let u1 = max(mulberryAt(callIndex), 1.17549435e-38);
|
|
15
|
+
let u2 = mulberryAt(callIndex + 1u);
|
|
16
|
+
let magnitude = sqrt(-2.0 * log(u1));
|
|
17
|
+
let angle = 6.283185307179586 * u2;
|
|
18
|
+
return magnitude * vec2f(cos(angle), sin(angle));
|
|
19
|
+
}
|
|
20
|
+
@fragment fn fs_main(@builtin(position) position: vec4f) -> @location(0) vec4f {
|
|
21
|
+
let coord = vec2u(position.xy - vec2f(0.5));
|
|
22
|
+
let base = (coord.y * RESOLUTION + coord.x) * 4u;
|
|
23
|
+
return vec4f(gaussianPair(base), gaussianPair(base + 2u));
|
|
24
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default "const SEED: u32 = 0x6f636561u;\nconst RESOLUTION: u32 = 512u;\n\n\n\nfn mulberryAt(callIndex: u32) -> f32 {\n let state = SEED + 0x6d2b79f5u * (callIndex + 1u);\n var t = state;\n t = (t ^ (t >> 15u)) * (t | 1u);\n t = t ^ (t + ((t ^ (t >> 7u)) * (t | 61u)));\n return f32(t ^ (t >> 14u)) / 4294967296.0;\n}\nfn gaussianPair(callIndex: u32) -> vec2f {\n let u1 = max(mulberryAt(callIndex), 1.17549435e-38);\n let u2 = mulberryAt(callIndex + 1u);\n let magnitude = sqrt(-2.0 * log(u1));\n let angle = 6.283185307179586 * u2;\n return magnitude * vec2f(cos(angle), sin(angle));\n}\n@fragment fn fs_main(@builtin(position) position: vec4f) -> @location(0) vec4f {\n let coord = vec2u(position.xy - vec2f(0.5));\n let base = (coord.y * RESOLUTION + coord.x) * 4u;\n return vec4f(gaussianPair(base), gaussianPair(base + 2u));\n}\n";
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
struct NormalFoamUniforms {
|
|
2
|
+
resolution: f32,
|
|
3
|
+
worldSize: f32,
|
|
4
|
+
displacementScale: f32,
|
|
5
|
+
foamThreshold: f32,
|
|
6
|
+
};
|
|
7
|
+
@group(0) @binding(0) var<uniform> u: NormalFoamUniforms;
|
|
8
|
+
@group(0) @binding(1) var u_displacement: texture_2d<f32>;
|
|
9
|
+
|
|
10
|
+
@fragment fn fs_main(@builtin(position) position: vec4f) -> @location(0) vec4f {
|
|
11
|
+
let N = i32(u.resolution);
|
|
12
|
+
let coord = vec2i(position.xy - vec2f(0.5));
|
|
13
|
+
let dx = u.worldSize / u.resolution;
|
|
14
|
+
|
|
15
|
+
let r = wrapLoad(u_displacement, coord + vec2i(1, 0), N).xyz * u.displacementScale;
|
|
16
|
+
let l = wrapLoad(u_displacement, coord - vec2i(1, 0), N).xyz * u.displacementScale;
|
|
17
|
+
let t = wrapLoad(u_displacement, coord + vec2i(0, 1), N).xyz * u.displacementScale;
|
|
18
|
+
let b = wrapLoad(u_displacement, coord - vec2i(0, 1), N).xyz * u.displacementScale;
|
|
19
|
+
|
|
20
|
+
let dhdx = (r.y - l.y) / (2.0 * dx);
|
|
21
|
+
let dhdz = (t.y - b.y) / (2.0 * dx);
|
|
22
|
+
let normal = normalize(vec3f(-dhdx, 1.0, -dhdz));
|
|
23
|
+
|
|
24
|
+
let dDxdx = (r.x - l.x) / (2.0 * dx);
|
|
25
|
+
let dDzdz = (t.z - b.z) / (2.0 * dx);
|
|
26
|
+
let dDxdz = (t.x - b.x) / (2.0 * dx);
|
|
27
|
+
let dDzdx = (r.z - l.z) / (2.0 * dx);
|
|
28
|
+
let J = (1.0 + dDxdx) * (1.0 + dDzdz) - dDxdz * dDzdx;
|
|
29
|
+
|
|
30
|
+
let foam = 1.0 - smoothstep(u.foamThreshold, u.foamThreshold + 0.8, J);
|
|
31
|
+
return vec4f(normal, foam);
|
|
32
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default "struct NormalFoamUniforms {\n resolution: f32,\n worldSize: f32,\n displacementScale: f32,\n foamThreshold: f32,\n};\n@group(0) @binding(0) var<uniform> u: NormalFoamUniforms;\n@group(0) @binding(1) var u_displacement: texture_2d<f32>;\n\n@fragment fn fs_main(@builtin(position) position: vec4f) -> @location(0) vec4f {\n let N = i32(u.resolution);\n let coord = vec2i(position.xy - vec2f(0.5));\n let dx = u.worldSize / u.resolution;\n\n let r = wrapLoad(u_displacement, coord + vec2i(1, 0), N).xyz * u.displacementScale;\n let l = wrapLoad(u_displacement, coord - vec2i(1, 0), N).xyz * u.displacementScale;\n let t = wrapLoad(u_displacement, coord + vec2i(0, 1), N).xyz * u.displacementScale;\n let b = wrapLoad(u_displacement, coord - vec2i(0, 1), N).xyz * u.displacementScale;\n\n let dhdx = (r.y - l.y) / (2.0 * dx);\n let dhdz = (t.y - b.y) / (2.0 * dx);\n let normal = normalize(vec3f(-dhdx, 1.0, -dhdz));\n\n let dDxdx = (r.x - l.x) / (2.0 * dx);\n let dDzdz = (t.z - b.z) / (2.0 * dx);\n let dDxdz = (t.x - b.x) / (2.0 * dx);\n let dDzdx = (r.z - l.z) / (2.0 * dx);\n let J = (1.0 + dDxdx) * (1.0 + dDzdz) - dDxdz * dDzdx;\n\n let foam = 1.0 - smoothstep(u.foamThreshold, u.foamThreshold + 0.8, J);\n return vec4f(normal, foam);\n}\n";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ocean-colors.d.ts","sourceRoot":"","sources":["../../../../src/app/shared/ocean/ocean-colors.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CAChD;AAED,eAAO,MAAM,oBAAoB,EAAE,WAGlC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ocean-colors.js","sourceRoot":"","sources":["../../../../src/app/shared/ocean/ocean-colors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAO3C,MAAM,CAAC,MAAM,oBAAoB,GAAgB;IAC/C,EAAE,EAAE,YAAY,CAAC,OAAO,CAAC,OAAO;IAChC,EAAE,EAAE,YAAY,CAAC,OAAO,CAAC,OAAO;CACjC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const PI: f32 = 3.141592653589793;
|
|
2
|
+
const G: f32 = 9.81;
|
|
3
|
+
|
|
4
|
+
fn cmul(a: vec2f, b: vec2f) -> vec2f {
|
|
5
|
+
return vec2f(a.x * b.x - a.y * b.y, a.x * b.y + a.y * b.x);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
fn wrapCoord(coord: vec2i, N: i32) -> vec2u {
|
|
9
|
+
let wrapped = (coord % vec2i(N) + vec2i(N)) % vec2i(N);
|
|
10
|
+
return vec2u(wrapped);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
fn wrapLoad(tex: texture_2d<f32>, coord: vec2i, N: i32) -> vec4f {
|
|
14
|
+
return textureLoad(tex, wrapCoord(coord, N), 0);
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default "const PI: f32 = 3.141592653589793;\nconst G: f32 = 9.81;\n\nfn cmul(a: vec2f, b: vec2f) -> vec2f {\n return vec2f(a.x * b.x - a.y * b.y, a.x * b.y + a.y * b.x);\n}\n\nfn wrapCoord(coord: vec2i, N: i32) -> vec2u {\n let wrapped = (coord % vec2i(N) + vec2i(N)) % vec2i(N);\n return vec2u(wrapped);\n}\n\nfn wrapLoad(tex: texture_2d<f32>, coord: vec2i, N: i32) -> vec4f {\n return textureLoad(tex, wrapCoord(coord, N), 0);\n}\n";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type SimulationTargetName = "spectrum" | "ping" | "pong";
|
|
2
|
+
export interface IfftStage {
|
|
3
|
+
readonly index: number;
|
|
4
|
+
readonly axisStage: number;
|
|
5
|
+
readonly horizontal: boolean;
|
|
6
|
+
readonly subtransformSize: number;
|
|
7
|
+
readonly input: SimulationTargetName;
|
|
8
|
+
readonly output: Exclude<SimulationTargetName, "spectrum">;
|
|
9
|
+
}
|
|
10
|
+
export declare const OCEAN_RESOLUTION: 512;
|
|
11
|
+
export declare function createIfftStageTable(): readonly IfftStage[];
|
|
12
|
+
//# sourceMappingURL=ocean-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ocean-graph.d.ts","sourceRoot":"","sources":["../../../../src/app/shared/ocean/ocean-graph.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,CAAC;AAEhE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC;CAC5D;AAED,eAAO,MAAM,gBAAgB,EAAG,GAAY,CAAC;AAG7C,wBAAgB,oBAAoB,IAAI,SAAS,SAAS,EAAE,CAc3D"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export const OCEAN_RESOLUTION = 512;
|
|
2
|
+
const AXIS_STAGES = 9;
|
|
3
|
+
export function createIfftStageTable() {
|
|
4
|
+
return Object.freeze(Array.from({ length: AXIS_STAGES * 2 }, (_, index) => {
|
|
5
|
+
const output = index % 2 ? "pong" : "ping";
|
|
6
|
+
return Object.freeze({
|
|
7
|
+
index,
|
|
8
|
+
axisStage: index % AXIS_STAGES,
|
|
9
|
+
horizontal: index < AXIS_STAGES,
|
|
10
|
+
subtransformSize: 2 ** ((index % AXIS_STAGES) + 1),
|
|
11
|
+
input: index === 0 ? "spectrum" : output === "ping" ? "pong" : "ping",
|
|
12
|
+
output,
|
|
13
|
+
});
|
|
14
|
+
}));
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=ocean-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ocean-graph.js","sourceRoot":"","sources":["../../../../src/app/shared/ocean/ocean-graph.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAY,CAAC;AAC7C,MAAM,WAAW,GAAG,CAAC,CAAC;AAEtB,MAAM,UAAU,oBAAoB;IAClC,OAAO,MAAM,CAAC,MAAM,CAClB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAa,EAAE;QAC9D,MAAM,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QAC3C,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,KAAK;YACL,SAAS,EAAE,KAAK,GAAG,WAAW;YAC9B,UAAU,EAAE,KAAK,GAAG,WAAW;YAC/B,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YAClD,KAAK,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;YACrE,MAAM;SACP,CAAC,CAAC;IACL,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
|