feat: some stuff
This commit is contained in:
parent
7579c6c00b
commit
1da13523ea
7
Cargo.lock
generated
7
Cargo.lock
generated
@ -85,6 +85,12 @@ dependencies = [
|
|||||||
"rand",
|
"rand",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "glam"
|
||||||
|
version = "0.27.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9e05e7e6723e3455f4818c7b26e855439f7546cf617ef669d1adedb8669e5cb9"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "itoa"
|
name = "itoa"
|
||||||
version = "1.0.11"
|
version = "1.0.11"
|
||||||
@ -364,6 +370,7 @@ version = "0.1.0"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"console_error_panic_hook",
|
"console_error_panic_hook",
|
||||||
"gl_matrix",
|
"gl_matrix",
|
||||||
|
"glam",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"wasm-bindgen",
|
"wasm-bindgen",
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
<T.PointsMaterial size={0.25} />
|
<T.PointsMaterial size={0.25} />
|
||||||
</T.Points>
|
</T.Points>
|
||||||
<T.Mesh geometry={geo}>
|
<T.Mesh geometry={geo}>
|
||||||
<T.MeshBasicMaterial color="red" />
|
<T.MeshStandardMaterial color="hotpink" />
|
||||||
</T.Mesh>
|
</T.Mesh>
|
||||||
{:else}
|
{:else}
|
||||||
<T.Mesh>
|
<T.Mesh>
|
||||||
|
@ -1,12 +1,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { Canvas } from "@threlte/core";
|
import { Canvas } from "@threlte/core";
|
||||||
import Scene from "./Scene.svelte";
|
import Scene from "./Scene.svelte";
|
||||||
import {
|
import { BufferGeometry, Float32BufferAttribute } from "three";
|
||||||
BufferAttribute,
|
|
||||||
BufferGeometry,
|
|
||||||
Float32BufferAttribute,
|
|
||||||
} from "three";
|
|
||||||
import { decodeFloat } from "$lib/helpers/encode";
|
|
||||||
|
|
||||||
export let result: Int32Array;
|
export let result: Int32Array;
|
||||||
|
|
||||||
@ -24,15 +19,9 @@
|
|||||||
const faceCount = encodedData[index++];
|
const faceCount = encodedData[index++];
|
||||||
|
|
||||||
// Indices
|
// Indices
|
||||||
const indices = encodedData.subarray(index, index + faceCount * 3);
|
const indicesEnd = index + faceCount * 3;
|
||||||
index = index + faceCount * 3;
|
const indices = encodedData.subarray(index, indicesEnd);
|
||||||
|
index = indicesEnd;
|
||||||
const normals = new Float32Array(
|
|
||||||
encodedData.buffer,
|
|
||||||
index * 4,
|
|
||||||
faceCount * 3,
|
|
||||||
);
|
|
||||||
index = index + faceCount * 3;
|
|
||||||
|
|
||||||
// Vertices
|
// Vertices
|
||||||
const vertices = new Float32Array(
|
const vertices = new Float32Array(
|
||||||
@ -40,12 +29,21 @@
|
|||||||
index * 4,
|
index * 4,
|
||||||
vertexCount * 3,
|
vertexCount * 3,
|
||||||
);
|
);
|
||||||
|
index = index + vertexCount * 3;
|
||||||
|
|
||||||
|
const normals = new Float32Array(
|
||||||
|
encodedData.buffer,
|
||||||
|
index * 4,
|
||||||
|
vertexCount * 3,
|
||||||
|
);
|
||||||
|
index = index + vertexCount * 3;
|
||||||
|
|
||||||
// Add data to geometry
|
// Add data to geometry
|
||||||
geometry.setIndex([...indices]);
|
geometry.setIndex([...indices]);
|
||||||
geometry.setAttribute("position", new Float32BufferAttribute(vertices, 3));
|
geometry.setAttribute("position", new Float32BufferAttribute(vertices, 3));
|
||||||
// geometry.setAttribute("normal", new Float32BufferAttribute(normals, 3));
|
geometry.setAttribute("normal", new Float32BufferAttribute(normals, 3));
|
||||||
geometry.computeVertexNormals();
|
// geometry.computeVertexNormals();
|
||||||
|
//geometry.computeVertexNormals();
|
||||||
|
|
||||||
return geometry;
|
return geometry;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
|
use crate::geometry::calculate_normals::calculate_normals;
|
||||||
use macros::include_definition_file;
|
use macros::include_definition_file;
|
||||||
use utils::{decode_float, encode_float, evaluate_args, get_args, set_panic_hook, wrap_arg};
|
use utils::{
|
||||||
|
decode_float, encode_float, evaluate_args, geometry, get_args, set_panic_hook, wrap_arg,
|
||||||
|
};
|
||||||
use wasm_bindgen::prelude::*;
|
use wasm_bindgen::prelude::*;
|
||||||
use web_sys::console;
|
use web_sys::console;
|
||||||
|
|
||||||
@ -24,7 +27,7 @@ pub fn execute(input: &[i32]) -> Vec<i32> {
|
|||||||
|
|
||||||
|
|
||||||
// [[1,3, x, y, z, x, y,z,x,y,z]];
|
// [[1,3, x, y, z, x, y,z,x,y,z]];
|
||||||
wrap_arg(&[
|
let mut cube_geometry = [
|
||||||
|
|
||||||
1, // 1: geometry
|
1, // 1: geometry
|
||||||
8, // 8 vertices
|
8, // 8 vertices
|
||||||
@ -51,20 +54,6 @@ pub fn execute(input: &[i32]) -> Vec<i32> {
|
|||||||
3, 7, 4,
|
3, 7, 4,
|
||||||
7, 6, 4,
|
7, 6, 4,
|
||||||
4, 6, 5,
|
4, 6, 5,
|
||||||
|
|
||||||
// this is the normal for every single face 1065353216 == 1.0f encoded is i32
|
|
||||||
0, 1065353216, 0,
|
|
||||||
0, 1065353216, 0,
|
|
||||||
0, 1065353216, 0,
|
|
||||||
0, 1065353216, 0,
|
|
||||||
0, 1065353216, 0,
|
|
||||||
0, 1065353216, 0,
|
|
||||||
0, 1065353216, 0,
|
|
||||||
0, 1065353216, 0,
|
|
||||||
0, 1065353216, 0,
|
|
||||||
0, 1065353216, 0,
|
|
||||||
0, 1065353216, 0,
|
|
||||||
0, 1065353216, 0,
|
|
||||||
|
|
||||||
// Bottom plate
|
// Bottom plate
|
||||||
p, n, n,
|
p, n, n,
|
||||||
@ -78,6 +67,21 @@ pub fn execute(input: &[i32]) -> Vec<i32> {
|
|||||||
p, p, p,
|
p, p, p,
|
||||||
n, p, p,
|
n, p, p,
|
||||||
|
|
||||||
])
|
// this is the normal for every single vert 1065353216 == 1.0f encoded is i32
|
||||||
|
0, 0, 0,
|
||||||
|
0, 0, 0,
|
||||||
|
0, 0, 0,
|
||||||
|
0, 0, 0,
|
||||||
|
0, 0, 0,
|
||||||
|
0, 0, 0,
|
||||||
|
0, 0, 0,
|
||||||
|
0, 0, 0,
|
||||||
|
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
calculate_normals(&mut cube_geometry);
|
||||||
|
|
||||||
|
wrap_arg(&cube_geometry)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -12,3 +12,4 @@ serde = { version = "1.0", features = ["derive"] }
|
|||||||
serde_json = { version = "1.0", default-features = false, features = ["alloc"] }
|
serde_json = { version = "1.0", default-features = false, features = ["alloc"] }
|
||||||
console_error_panic_hook = { version = "0.1.7", optional = true }
|
console_error_panic_hook = { version = "0.1.7", optional = true }
|
||||||
gl_matrix = "0.0.2"
|
gl_matrix = "0.0.2"
|
||||||
|
glam = "0.27.0"
|
||||||
|
50
packages/utils/src/geometry/calculate_normals.rs
Normal file
50
packages/utils/src/geometry/calculate_normals.rs
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
use crate::{decode_float, encode_float};
|
||||||
|
use glam::Vec3;
|
||||||
|
|
||||||
|
pub fn calculate_normals(geometry: &mut [i32]) {
|
||||||
|
let vertex_count = geometry[1] as usize;
|
||||||
|
let face_count = geometry[2] as usize;
|
||||||
|
let index_start = 3;
|
||||||
|
let indices_end = index_start + face_count * 3;
|
||||||
|
let positions_start = indices_end;
|
||||||
|
let positions_end = positions_start + vertex_count * 3;
|
||||||
|
let normals_start = positions_end;
|
||||||
|
|
||||||
|
let mut last_normal = Vec3::ZERO;
|
||||||
|
|
||||||
|
for i in 0..face_count {
|
||||||
|
let base_idx1 = geometry[index_start + i * 3] as usize * 3;
|
||||||
|
let base_idx2 = geometry[index_start + i * 3 + 1] as usize * 3;
|
||||||
|
let base_idx3 = geometry[index_start + i * 3 + 2] as usize * 3;
|
||||||
|
|
||||||
|
let v1 = Vec3::new(
|
||||||
|
decode_float(geometry[positions_start + base_idx1]),
|
||||||
|
decode_float(geometry[positions_start + base_idx1 + 1]),
|
||||||
|
decode_float(geometry[positions_start + base_idx1 + 2]),
|
||||||
|
);
|
||||||
|
let v2 = Vec3::new(
|
||||||
|
decode_float(geometry[positions_start + base_idx2]) - v1.x,
|
||||||
|
decode_float(geometry[positions_start + base_idx2 + 1]) - v1.y,
|
||||||
|
decode_float(geometry[positions_start + base_idx2 + 2]) - v1.z,
|
||||||
|
);
|
||||||
|
let v3 = Vec3::new(
|
||||||
|
decode_float(geometry[positions_start + base_idx3]) - v1.x,
|
||||||
|
decode_float(geometry[positions_start + base_idx3 + 1]) - v1.y,
|
||||||
|
decode_float(geometry[positions_start + base_idx3 + 2]) - v1.z,
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut normal = v2.cross(v3).normalize();
|
||||||
|
if normal.length_squared() == 0.0 {
|
||||||
|
normal = last_normal;
|
||||||
|
} else {
|
||||||
|
last_normal = normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
for j in 0..3 {
|
||||||
|
let idx = geometry[index_start + i * 3 + j] as usize * 3;
|
||||||
|
geometry[normals_start + idx] = encode_float(normal.x);
|
||||||
|
geometry[normals_start + idx + 1] = encode_float(normal.y);
|
||||||
|
geometry[normals_start + idx + 2] = encode_float(normal.z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,2 +1 @@
|
|||||||
pub fn extrude_path(path: &[i32]) {}
|
pub fn extrude_path(path: &[i32]) {}
|
||||||
|
|
||||||
|
3
packages/utils/src/geometry/mod.rs
Normal file
3
packages/utils/src/geometry/mod.rs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
pub mod calculate_normals;
|
||||||
|
pub mod extrude_path;
|
||||||
|
|
@ -5,6 +5,7 @@ mod tree;
|
|||||||
pub use encoding::*;
|
pub use encoding::*;
|
||||||
pub use helpers::*;
|
pub use helpers::*;
|
||||||
pub use tree::*;
|
pub use tree::*;
|
||||||
|
pub mod geometry;
|
||||||
|
|
||||||
pub fn set_panic_hook() {
|
pub fn set_panic_hook() {
|
||||||
// When the `console_error_panic_hook` feature is enabled, we can call the
|
// When the `console_error_panic_hook` feature is enabled, we can call the
|
||||||
|
Loading…
Reference in New Issue
Block a user