Get wasm build running in browser

This commit is contained in:
Danny McGee
2023-09-28 23:33:08 -04:00
parent 842f985c23
commit bc8994a780
28 changed files with 3832 additions and 131 deletions
+1
View File
@@ -0,0 +1 @@
**/*
+1
View File
@@ -0,0 +1 @@
{}
-7
View File
@@ -1,7 +0,0 @@
{
"recommendations": [
"nrwl.angular-console",
"esbenp.prettier-vscode"
]
}
Generated
+1
View File
@@ -1804,6 +1804,7 @@ version = "0.1.0"
dependencies = [
"bevy",
"console_error_panic_hook",
"wasm-bindgen",
]
[[package]]
+1
View File
@@ -6,6 +6,7 @@ members = [
[workspace.dependencies.bevy]
version = "0.11.2"
default-features = false
[profile.dev]
opt-level = 1
+5
View File
@@ -0,0 +1,5 @@
{
"presets": [
"@nx/js/babel"
]
}
+8
View File
@@ -0,0 +1,8 @@
{
"jsc": {
"parser": {
"syntax": "typescript"
},
"target": "es2016"
}
}
+16
View File
@@ -0,0 +1,16 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>HelloWeb</title>
<base href="/" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<link rel="stylesheet" href="/src/styles.scss" />
</head>
<body>
<app-root></app-root>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
+59
View File
@@ -0,0 +1,59 @@
{
"name": "hello-web",
"$schema": "../node_modules/nx/schemas/project-schema.json",
"projectType": "application",
"sourceRoot": "hello-web/src",
"tags": [],
"targets": {
"build": {
"executor": "@nx/vite:build",
"outputs": [
"{options.outputPath}"
],
"defaultConfiguration": "production",
"options": {
"outputPath": "dist/hello-web"
},
"configurations": {
"development": {
"mode": "development"
},
"production": {
"mode": "production"
}
}
},
"serve": {
"executor": "@nx/vite:dev-server",
"defaultConfiguration": "development",
"options": {
"buildTarget": "hello-web:build"
},
"configurations": {
"development": {
"buildTarget": "hello-web:build:development",
"hmr": true
},
"production": {
"buildTarget": "hello-web:build:production",
"hmr": false
}
}
},
"preview": {
"executor": "@nx/vite:preview-server",
"defaultConfiguration": "development",
"options": {
"buildTarget": "hello-web:build"
},
"configurations": {
"development": {
"buildTarget": "hello-web:build:development"
},
"production": {
"buildTarget": "hello-web:build:production"
}
}
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

+416
View File
@@ -0,0 +1,416 @@
/*
* Remove template code below
*/
html {
-webkit-text-size-adjust: 100%;
font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,
'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif,
'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',
'Noto Color Emoji';
line-height: 1.5;
tab-size: 4;
scroll-behavior: smooth;
}
body {
font-family: inherit;
line-height: inherit;
margin: 0;
}
h1,
h2,
p,
pre {
margin: 0;
}
*,
::before,
::after {
box-sizing: border-box;
border-width: 0;
border-style: solid;
border-color: currentColor;
}
h1,
h2 {
font-size: inherit;
font-weight: inherit;
}
a {
color: inherit;
text-decoration: inherit;
}
pre {
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
'Liberation Mono', 'Courier New', monospace;
}
svg {
display: block;
vertical-align: middle;
}
svg {
shape-rendering: auto;
text-rendering: optimizeLegibility;
}
pre {
background-color: rgba(55, 65, 81, 1);
border-radius: 0.25rem;
color: rgba(229, 231, 235, 1);
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
'Liberation Mono', 'Courier New', monospace;
overflow: scroll;
padding: 0.5rem 0.75rem;
}
.shadow {
box-shadow: 0 0 #0000, 0 0 #0000, 0 10px 15px -3px rgba(0, 0, 0, 0.1),
0 4px 6px -2px rgba(0, 0, 0, 0.05);
}
.rounded {
border-radius: 1.5rem;
}
.wrapper {
width: 100%;
}
.container {
margin-left: auto;
margin-right: auto;
max-width: 768px;
padding-bottom: 3rem;
padding-left: 1rem;
padding-right: 1rem;
color: rgba(55, 65, 81, 1);
width: 100%;
}
#welcome {
margin-top: 2.5rem;
}
#welcome h1 {
font-size: 3rem;
font-weight: 500;
letter-spacing: -0.025em;
line-height: 1;
}
#welcome span {
display: block;
font-size: 1.875rem;
font-weight: 300;
line-height: 2.25rem;
margin-bottom: 0.5rem;
}
#hero {
align-items: center;
background-color: hsla(214, 62%, 21%, 1);
border: none;
box-sizing: border-box;
color: rgba(55, 65, 81, 1);
display: grid;
grid-template-columns: 1fr;
margin-top: 3.5rem;
}
#hero .text-container {
color: rgba(255, 255, 255, 1);
padding: 3rem 2rem;
}
#hero .text-container h2 {
font-size: 1.5rem;
line-height: 2rem;
position: relative;
}
#hero .text-container h2 svg {
color: hsla(162, 47%, 50%, 1);
height: 2rem;
left: -0.25rem;
position: absolute;
top: 0;
width: 2rem;
}
#hero .text-container h2 span {
margin-left: 2.5rem;
}
#hero .text-container a {
background-color: rgba(255, 255, 255, 1);
border-radius: 0.75rem;
color: rgba(55, 65, 81, 1);
display: inline-block;
margin-top: 1.5rem;
padding: 1rem 2rem;
text-decoration: inherit;
}
#hero .logo-container {
display: none;
justify-content: center;
padding-left: 2rem;
padding-right: 2rem;
}
#hero .logo-container svg {
color: rgba(255, 255, 255, 1);
width: 66.666667%;
}
#middle-content {
align-items: flex-start;
display: grid;
gap: 4rem;
grid-template-columns: 1fr;
margin-top: 3.5rem;
}
#learning-materials {
padding: 2.5rem 2rem;
}
#learning-materials h2 {
font-weight: 500;
font-size: 1.25rem;
letter-spacing: -0.025em;
line-height: 1.75rem;
padding-left: 1rem;
padding-right: 1rem;
}
.list-item-link {
align-items: center;
border-radius: 0.75rem;
display: flex;
margin-top: 1rem;
padding: 1rem;
transition-property: background-color, border-color, color, fill, stroke,
opacity, box-shadow, transform, filter, backdrop-filter,
-webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
width: 100%;
}
.list-item-link svg:first-child {
margin-right: 1rem;
height: 1.5rem;
transition-property: background-color, border-color, color, fill, stroke,
opacity, box-shadow, transform, filter, backdrop-filter,
-webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
width: 1.5rem;
}
.list-item-link > span {
flex-grow: 1;
font-weight: 400;
transition-property: background-color, border-color, color, fill, stroke,
opacity, box-shadow, transform, filter, backdrop-filter,
-webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
}
.list-item-link > span > span {
color: rgba(107, 114, 128, 1);
display: block;
flex-grow: 1;
font-size: 0.75rem;
font-weight: 300;
line-height: 1rem;
transition-property: background-color, border-color, color, fill, stroke,
opacity, box-shadow, transform, filter, backdrop-filter,
-webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
}
.list-item-link svg:last-child {
height: 1rem;
transition-property: all;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
width: 1rem;
}
.list-item-link:hover {
color: rgba(255, 255, 255, 1);
background-color: hsla(162, 47%, 50%, 1);
}
.list-item-link:hover > span {
}
.list-item-link:hover > span > span {
color: rgba(243, 244, 246, 1);
}
.list-item-link:hover svg:last-child {
transform: translateX(0.25rem);
}
#other-links {
}
.button-pill {
padding: 1.5rem 2rem;
transition-duration: 300ms;
transition-property: background-color, border-color, color, fill, stroke,
opacity, box-shadow, transform, filter, backdrop-filter,
-webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
align-items: center;
display: flex;
}
.button-pill svg {
transition-property: background-color, border-color, color, fill, stroke,
opacity, box-shadow, transform, filter, backdrop-filter,
-webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
flex-shrink: 0;
width: 3rem;
}
.button-pill > span {
letter-spacing: -0.025em;
font-weight: 400;
font-size: 1.125rem;
line-height: 1.75rem;
padding-left: 1rem;
padding-right: 1rem;
}
.button-pill span span {
display: block;
font-size: 0.875rem;
font-weight: 300;
line-height: 1.25rem;
}
.button-pill:hover svg,
.button-pill:hover {
color: rgba(255, 255, 255, 1) !important;
}
#nx-console:hover {
background-color: rgba(0, 122, 204, 1);
}
#nx-console svg {
color: rgba(0, 122, 204, 1);
}
#nx-repo:hover {
background-color: rgba(24, 23, 23, 1);
}
#nx-repo svg {
color: rgba(24, 23, 23, 1);
}
#nx-cloud {
margin-bottom: 2rem;
margin-top: 2rem;
padding: 2.5rem 2rem;
}
#nx-cloud > div {
align-items: center;
display: flex;
}
#nx-cloud > div svg {
border-radius: 0.375rem;
flex-shrink: 0;
width: 3rem;
}
#nx-cloud > div h2 {
font-size: 1.125rem;
font-weight: 400;
letter-spacing: -0.025em;
line-height: 1.75rem;
padding-left: 1rem;
padding-right: 1rem;
}
#nx-cloud > div h2 span {
display: block;
font-size: 0.875rem;
font-weight: 300;
line-height: 1.25rem;
}
#nx-cloud p {
font-size: 1rem;
line-height: 1.5rem;
margin-top: 1rem;
}
#nx-cloud pre {
margin-top: 1rem;
}
#nx-cloud a {
color: rgba(107, 114, 128, 1);
display: block;
font-size: 0.875rem;
line-height: 1.25rem;
margin-top: 1.5rem;
text-align: right;
}
#nx-cloud a:hover {
text-decoration: underline;
}
#commands {
padding: 2.5rem 2rem;
margin-top: 3.5rem;
}
#commands h2 {
font-size: 1.25rem;
font-weight: 400;
letter-spacing: -0.025em;
line-height: 1.75rem;
padding-left: 1rem;
padding-right: 1rem;
}
#commands p {
font-size: 1rem;
font-weight: 300;
line-height: 1.5rem;
margin-top: 1rem;
padding-left: 1rem;
padding-right: 1rem;
}
details {
align-items: center;
display: flex;
margin-top: 1rem;
padding-left: 1rem;
padding-right: 1rem;
width: 100%;
}
details pre > span {
color: rgba(181, 181, 181, 1);
}
summary {
border-radius: 0.5rem;
display: flex;
font-weight: 400;
padding: 0.5rem;
cursor: pointer;
transition-property: background-color, border-color, color, fill, stroke,
opacity, box-shadow, transform, filter, backdrop-filter,
-webkit-backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
}
summary:hover {
background-color: rgba(243, 244, 246, 1);
}
summary svg {
height: 1.5rem;
margin-right: 1rem;
width: 1.5rem;
}
#love {
color: rgba(107, 114, 128, 1);
font-size: 0.875rem;
line-height: 1.25rem;
margin-top: 3.5rem;
opacity: 0.6;
text-align: center;
}
#love svg {
color: rgba(252, 165, 165, 1);
width: 1.25rem;
height: 1.25rem;
display: inline;
margin-top: -0.25rem;
}
@media screen and (min-width: 768px) {
#hero {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
#hero .logo-container {
display: flex;
}
#middle-content {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
+19
View File
@@ -0,0 +1,19 @@
import * as helloWorld from "@storyteller/hello-world";
import "./app.element.scss";
export class AppElement extends HTMLElement {
static observedAttributes = [];
connectedCallback(): void {
// TODO: This siezes up the whole browser for several seconds, presumably
// while the WASM binary is loading. Is there any way to do this
// asynchronously?
// TODO: Since we're using `#[wasm_bindgen]` attributes instead of the
// CLI, we can craft our own JS API to interact with Bevy! \o/ As a start,
// we should exploit this to pass an explicit canvas size to Bevy and keep
// it up to date with the browser viewport size.
helloWorld.init();
}
}
customElements.define("app-root", AppElement);
View File
+1
View File
@@ -0,0 +1 @@
import "./app/app.element";
+1
View File
@@ -0,0 +1 @@
/* You can add global styles to this file, and also import other style files */
+9
View File
@@ -0,0 +1,9 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "../dist/out-tsc",
"types": ["node"]
},
"exclude": ["src/**/*.spec.ts", "src/**/*.test.ts"],
"include": ["src/**/*.ts"]
}
+27
View File
@@ -0,0 +1,27 @@
{
"extends": "../tsconfig.base.json",
"files": [],
"compilerOptions": {
"target": "ESNext",
"useDefineForClassFields": true,
"module": "ESNext",
"lib": ["ESNext", "DOM"],
"moduleResolution": "Node",
"strict": true,
"resolveJsonModule": true,
"isolatedModules": true,
"esModuleInterop": true,
"noEmit": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noImplicitReturns": true,
"skipLibCheck": true,
"types": ["vite/client"]
},
"include": ["src"],
"references": [
{
"path": "./tsconfig.app.json"
}
]
}
+23
View File
@@ -0,0 +1,23 @@
/// <reference types='vitest' />
import { defineConfig } from "vite";
import { nxViteTsPaths } from "@nx/vite/plugins/nx-tsconfig-paths.plugin";
import wasm from "vite-plugin-wasm";
import topLevelAwait from "vite-plugin-top-level-await";
export default defineConfig({
cacheDir: "../node_modules/.vite/hello-web",
server:{
port: 4200,
host: "localhost",
},
preview:{
port: 4300,
host: "localhost",
},
plugins: [
nxViteTsPaths(),
wasm(),
topLevelAwait(),
],
});
+1
View File
@@ -0,0 +1 @@
RUSTFLAGS = "--cfg=web_sys_unstable_apis"
+72 -5
View File
@@ -3,17 +3,84 @@ name = "hello-world"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[lib]
crate-type = ["cdylib", "rlib"]
[dependencies]
bevy = { workspace = true }
wasm-bindgen = { version = "0.2.84", optional = true }
console_error_panic_hook = { version = "0.1.7", optional = true }
[target.'cfg(target_family = "wasm")'.dependencies]
console_error_panic_hook = "0.1.7"
[features]
wasm = [
"dep:wasm-bindgen",
"dep:console_error_panic_hook",
]
[dependencies.bevy]
workspace = true
default-features = false
# TODO: Narrow this down to the features we actually need
# FIXME: WebGPU is sparsely supported, but using the default WebGL backend
# causes a panic upstream: "Tex storage 2D multisample is not supported"
features = [
"animation",
"bevy_asset",
"bevy_audio",
"bevy_gilrs",
"bevy_scene",
"bevy_winit",
"bevy_core_pipeline",
"bevy_pbr",
"bevy_gltf",
"bevy_render",
"bevy_sprite",
"bevy_text",
"bevy_ui",
"png",
"hdr",
"ktx2",
"zstd",
"vorbis",
"x11",
"filesystem_watcher",
"bevy_gizmos",
"android_shared_stdcxx",
"tonemapping_luts",
"default_font",
]
[target.'cfg(not(target_family = "wasm"))'.dependencies.bevy]
workspace = true
features = ["dynamic_linking"]
default-features = false
features = [
"animation",
"bevy_asset",
"bevy_audio",
"bevy_gilrs",
"bevy_scene",
"bevy_winit",
"bevy_core_pipeline",
"bevy_pbr",
"bevy_gltf",
"bevy_render",
"bevy_sprite",
"bevy_text",
"bevy_ui",
"png",
"hdr",
"ktx2",
"zstd",
"vorbis",
"x11",
"filesystem_watcher",
"bevy_gizmos",
"android_shared_stdcxx",
"tonemapping_luts",
"default_font",
# TODO: This line is the only difference from default. Is there a way to
# deduplicate the feature list?
"dynamic_linking",
]
# FIXME: Profiles for the non-root package are ignored, but [target] keys are
# not allowed in the root package >_<
+8 -4
View File
@@ -12,13 +12,17 @@
"configurations": {
"production": {
"release": true
},
"web": {
"release": true,
"target": "wasm32-unknown-unknown"
}
}
},
"build:web": {
"executor": "nx:run-commands",
"options": {
"command": "wasm-pack build --out-dir ../dist/hello-world/ -- --features wasm",
"cwd": "hello-world",
"env": "hello-world/.env"
}
},
"run": {
"executor": "@nxrs/cargo:build",
"options": {
+41
View File
@@ -0,0 +1,41 @@
#![allow(clippy::type_complexity)]
use bevy::prelude::*;
use wasm_bindgen::prelude::*;
mod orbit_cam;
mod test_scene;
mod ui;
use orbit_cam::{OrbitCam, OrbitCamPlugin};
use test_scene::TestScenePlugin;
use ui::UiLayerPlugin;
#[wasm_bindgen]
pub fn init() {
#[cfg(target_arch = "wasm32")]
console_error_panic_hook::set_once();
App::new()
.add_plugins((
DefaultPlugins,
OrbitCamPlugin,
TestScenePlugin,
UiLayerPlugin,
))
.add_systems(Update, draw_world_axes.after(orbit_cam::pan_orbit_camera))
.run();
}
fn draw_world_axes(mut gizmos: Gizmos, q: Query<&OrbitCam>) {
let &OrbitCam { focus, radius, .. } = q.single();
let mut draw_axis = |direction: Vec3, color: Color| {
let end = focus + direction * radius / 15.;
gizmos.line(focus, end, color);
};
draw_axis(Vec3::X, Color::RED);
draw_axis(Vec3::Y, Color::GREEN);
draw_axis(Vec3::Z, Color::BLUE);
}
+1 -37
View File
@@ -1,39 +1,3 @@
#![allow(clippy::type_complexity)]
use bevy::prelude::*;
mod orbit_cam;
mod test_scene;
mod ui;
use orbit_cam::{OrbitCam, OrbitCamPlugin};
use test_scene::TestScenePlugin;
use ui::UiLayerPlugin;
fn main() {
#[cfg(target_arch = "wasm32")]
console_error_panic_hook::set_once();
App::new()
.add_plugins((
DefaultPlugins,
OrbitCamPlugin,
TestScenePlugin,
UiLayerPlugin,
))
.add_systems(Update, draw_world_axes.after(orbit_cam::pan_orbit_camera))
.run();
}
fn draw_world_axes(mut gizmos: Gizmos, q: Query<&OrbitCam>) {
let &OrbitCam { focus, radius, .. } = q.single();
let mut draw_axis = |direction: Vec3, color: Color| {
let end = focus + direction * radius / 15.;
gizmos.line(focus, end, color);
};
draw_axis(Vec3::X, Color::RED);
draw_axis(Vec3::Y, Color::GREEN);
draw_axis(Vec3::Z, Color::BLUE);
hello_world::init();
}
+69 -65
View File
@@ -1,37 +1,41 @@
// TODO: Figure out asset paths/loading for web
#[rustfmt::skip]
use bevy::{
pbr::NotShadowCaster,
// pbr::NotShadowCaster,
prelude::*,
reflect::{TypePath, TypeUuid},
render::render_resource::{AsBindGroup, ShaderRef},
// reflect::{TypePath, TypeUuid},
// render::render_resource::{AsBindGroup, ShaderRef},
};
use crate::orbit_cam::{self, OrbitCam};
// use crate::orbit_cam::{self, OrbitCam};
pub struct TestScenePlugin;
impl Plugin for TestScenePlugin {
fn build(&self, app: &mut App) {
app.insert_resource(ClearColor(Color::hsl(0.0, 0.0, 0.25)))
.add_plugins(MaterialPlugin::<ProceduralGridMaterial> {
prepass_enabled: true,
..default()
})
// .add_plugins(MaterialPlugin::<ProceduralGridMaterial> {
// prepass_enabled: true,
// ..default()
// })
.add_systems(Startup, spawn_scene)
.add_systems(
PostUpdate,
move_plane_with_camera.after(orbit_cam::pan_orbit_camera),
);
// .add_systems(
// PostUpdate,
// move_plane_with_camera.after(orbit_cam::pan_orbit_camera),
// );
;
}
}
#[derive(Component)]
struct WorldGridPlane;
// #[derive(Component)]
// struct WorldGridPlane;
fn spawn_scene(
mut cmd: Commands,
mut meshes: ResMut<Assets<Mesh>>,
mut std_mats: ResMut<Assets<StandardMaterial>>,
mut mat_proc_grid: ResMut<Assets<ProceduralGridMaterial>>,
// mut mat_proc_grid: ResMut<Assets<ProceduralGridMaterial>>,
) {
let mut light_xform = Transform::IDENTITY;
light_xform.rotation = Quat::from_rotation_y(f32::to_radians(-70.0)) * light_xform.rotation;
@@ -59,60 +63,60 @@ fn spawn_scene(
});
// Plane
let plane = meshes.add(Mesh::from(shape::Plane {
size: 200.0,
subdivisions: 0,
}));
let proc_grid = mat_proc_grid.add(ProceduralGridMaterial {});
// let plane = meshes.add(Mesh::from(shape::Plane {
// size: 200.0,
// subdivisions: 0,
// }));
// let proc_grid = mat_proc_grid.add(ProceduralGridMaterial {});
cmd.spawn((
SpatialBundle::from_transform(Transform::IDENTITY),
WorldGridPlane,
))
.with_children(|parent| {
parent.spawn((
MaterialMeshBundle {
mesh: plane.clone(),
material: proc_grid.clone(),
transform: Transform::IDENTITY,
..default()
},
NotShadowCaster,
));
parent.spawn((
MaterialMeshBundle {
mesh: plane,
material: proc_grid,
transform: Transform::IDENTITY.looking_to(Vec3::Z, Vec3::NEG_Y),
..default()
},
NotShadowCaster,
));
});
// cmd.spawn((
// SpatialBundle::from_transform(Transform::IDENTITY),
// WorldGridPlane,
// ))
// .with_children(|parent| {
// parent.spawn((
// MaterialMeshBundle {
// mesh: plane.clone(),
// material: proc_grid.clone(),
// transform: Transform::IDENTITY,
// ..default()
// },
// NotShadowCaster,
// ));
// parent.spawn((
// MaterialMeshBundle {
// mesh: plane,
// material: proc_grid,
// transform: Transform::IDENTITY.looking_to(Vec3::Z, Vec3::NEG_Y),
// ..default()
// },
// NotShadowCaster,
// ));
// });
}
fn move_plane_with_camera(
mut plane: Query<(&WorldGridPlane, &mut Transform)>,
camera: Query<&OrbitCam, Changed<OrbitCam>>,
) {
if let Ok(&OrbitCam { focus, .. }) = camera.get_single() {
let (_, mut xform) = plane.single_mut();
// fn move_plane_with_camera(
// mut plane: Query<(&WorldGridPlane, &mut Transform)>,
// camera: Query<&OrbitCam, Changed<OrbitCam>>,
// ) {
// if let Ok(&OrbitCam { focus, .. }) = camera.get_single() {
// let (_, mut xform) = plane.single_mut();
xform.translation.x = focus.x;
xform.translation.z = focus.z;
}
}
// xform.translation.x = focus.x;
// xform.translation.z = focus.z;
// }
// }
#[derive(AsBindGroup, Clone, TypePath, TypeUuid)]
#[uuid = "CE331A13-F247-4F5B-A75E-670B2BD5776A"]
struct ProceduralGridMaterial {}
// #[derive(AsBindGroup, Clone, TypePath, TypeUuid)]
// #[uuid = "CE331A13-F247-4F5B-A75E-670B2BD5776A"]
// struct ProceduralGridMaterial {}
impl Material for ProceduralGridMaterial {
fn fragment_shader() -> ShaderRef {
"shaders/procedural_grid.wgsl".into()
}
// impl Material for ProceduralGridMaterial {
// fn fragment_shader() -> ShaderRef {
// "shaders/procedural_grid.wgsl".into()
// }
fn alpha_mode(&self) -> AlphaMode {
AlphaMode::Blend
}
}
// fn alpha_mode(&self) -> AlphaMode {
// AlphaMode::Blend
// }
// }
+17 -1
View File
@@ -8,7 +8,9 @@
"sharedGlobals"
],
"production": [
"default"
"default",
"!{projectRoot}/**/?(*.)+(spec|test).[jt]s?(x)?(.snap)",
"!{projectRoot}/tsconfig.spec.json"
],
"sharedGlobals": []
},
@@ -21,6 +23,12 @@
"production",
"^production"
]
},
"test": {
"inputs": [
"default",
"^production"
]
}
},
"tasksRunnerOptions": {
@@ -35,5 +43,13 @@
]
}
}
},
"generators": {
"@nx/web:application": {
"style": "scss",
"linter": "none",
"unitTestRunner": "none",
"e2eTestRunner": "none"
}
}
}
+2994 -11
View File
File diff suppressed because it is too large Load Diff
+19 -1
View File
@@ -6,8 +6,26 @@
"private": true,
"devDependencies": {
"@nx/js": "16.9.1",
"@nx/vite": "16.9.1",
"@nx/web": "16.9.1",
"@nx/workspace": "16.9.1",
"@nxrs/cargo": "^0.3.3",
"nx": "16.9.1"
"@swc/core": "~1.3.85",
"@types/node": "18.7.1",
"@vitest/ui": "~0.32.0",
"jsdom": "~22.1.0",
"nx": "16.9.1",
"prettier": "^2.6.2",
"sass": "^1.68.0",
"swc-loader": "0.1.15",
"typescript": "~5.1.3",
"vite": "~4.3.9",
"vite-plugin-top-level-await": "^1.3.1",
"vite-plugin-wasm": "^3.2.2",
"vitest": "~0.32.0",
"wasm-pack": "^0.12.1"
},
"dependencies": {
"tslib": "^2.3.0"
}
}
+22
View File
@@ -0,0 +1,22 @@
{
"compileOnSave": false,
"compilerOptions": {
"rootDir": ".",
"sourceMap": true,
"declaration": false,
"moduleResolution": "node",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"importHelpers": true,
"target": "es2015",
"module": "esnext",
"lib": ["es2020", "dom"],
"skipLibCheck": true,
"skipDefaultLibCheck": true,
"baseUrl": ".",
"paths": {
"@storyteller/hello-world": ["dist/hello-world"]
}
},
"exclude": ["node_modules", "tmp"]
}