Thanks for using Compiler Explorer
Sponsors
Jakt
C++
Ada
Algol68
Analysis
Android Java
Android Kotlin
Assembly
C
C3
Carbon
C with Coccinelle
C++ with Coccinelle
C++ (Circle)
CIRCT
Clean
CMake
CMakeScript
COBOL
C++ for OpenCL
MLIR
Cppx
Cppx-Blue
Cppx-Gold
Cpp2-cppfront
Crystal
C#
CUDA C++
D
Dart
Elixir
Erlang
Fortran
F#
GLSL
Go
Haskell
HLSL
Hook
Hylo
IL
ispc
Java
Julia
Kotlin
LLVM IR
LLVM MIR
Modula-2
Mojo
Nim
Numba
Nix
Objective-C
Objective-C++
OCaml
Odin
OpenCL C
Pascal
Pony
PTX
Python
Racket
Raku
Ruby
Rust
Sail
Snowball
Scala
Slang
Solidity
Spice
SPIR-V
Swift
LLVM TableGen
Toit
Triton
TypeScript Native
V
Vala
Visual Basic
Vyper
WASM
Zig
Javascript
GIMPLE
Ygen
sway
rust source #1
Output
Compile to binary object
Link to binary
Execute the code
Intel asm syntax
Demangle identifiers
Verbose demangling
Filters
Unused labels
Library functions
Directives
Comments
Horizontal whitespace
Debug intrinsics
Compiler
mrustc (master)
rustc 1.0.0
rustc 1.1.0
rustc 1.10.0
rustc 1.11.0
rustc 1.12.0
rustc 1.13.0
rustc 1.14.0
rustc 1.15.1
rustc 1.16.0
rustc 1.17.0
rustc 1.18.0
rustc 1.19.0
rustc 1.2.0
rustc 1.20.0
rustc 1.21.0
rustc 1.22.0
rustc 1.23.0
rustc 1.24.0
rustc 1.25.0
rustc 1.26.0
rustc 1.27.0
rustc 1.27.1
rustc 1.28.0
rustc 1.29.0
rustc 1.3.0
rustc 1.30.0
rustc 1.31.0
rustc 1.32.0
rustc 1.33.0
rustc 1.34.0
rustc 1.35.0
rustc 1.36.0
rustc 1.37.0
rustc 1.38.0
rustc 1.39.0
rustc 1.4.0
rustc 1.40.0
rustc 1.41.0
rustc 1.42.0
rustc 1.43.0
rustc 1.44.0
rustc 1.45.0
rustc 1.45.2
rustc 1.46.0
rustc 1.47.0
rustc 1.48.0
rustc 1.49.0
rustc 1.5.0
rustc 1.50.0
rustc 1.51.0
rustc 1.52.0
rustc 1.53.0
rustc 1.54.0
rustc 1.55.0
rustc 1.56.0
rustc 1.57.0
rustc 1.58.0
rustc 1.59.0
rustc 1.6.0
rustc 1.60.0
rustc 1.61.0
rustc 1.62.0
rustc 1.63.0
rustc 1.64.0
rustc 1.65.0
rustc 1.66.0
rustc 1.67.0
rustc 1.68.0
rustc 1.69.0
rustc 1.7.0
rustc 1.70.0
rustc 1.71.0
rustc 1.72.0
rustc 1.73.0
rustc 1.74.0
rustc 1.75.0
rustc 1.76.0
rustc 1.77.0
rustc 1.78.0
rustc 1.79.0
rustc 1.8.0
rustc 1.80.0
rustc 1.81.0
rustc 1.82.0
rustc 1.83.0
rustc 1.84.0
rustc 1.85.0
rustc 1.86.0
rustc 1.87.0
rustc 1.88.0
rustc 1.89.0
rustc 1.9.0
rustc beta
rustc nightly
rustc-cg-gcc (master)
x86-64 GCCRS (GCC master)
x86-64 GCCRS (GCCRS master)
x86-64 GCCRS 14.1 (GCC assertions)
x86-64 GCCRS 14.1 (GCC)
x86-64 GCCRS 14.2 (GCC assertions)
x86-64 GCCRS 14.2 (GCC)
x86-64 GCCRS 14.3 (GCC assertions)
x86-64 GCCRS 14.3 (GCC)
x86-64 GCCRS 15.1 (GCC assertions)
x86-64 GCCRS 15.1 (GCC)
x86-64 GCCRS 15.2 (GCC assertions)
x86-64 GCCRS 15.2 (GCC)
Options
Source code
// Compute normals for given positions and indices // @param positions an array of vertex positions, [...., x, y, z, ......] // @param indices an array of indices in groups of three for each triangular facet, [...., i, j, k, ......] // @param normals an array of vertex normals, [...., x, y, z, ......] // https://github.com/BabylonJS/Babylon.js/blob/master/src/Meshes/mesh.vertexData.ts#L1102 pub fn ComputeNormals(positions : & [f32], indices : & [u32], normals : & mut [f32]) { // temporary scalar variables let mut p1p2x: f32; // p1p2 vector x coordinate let mut p1p2y: f32; // p1p2 vector y coordinate let mut p1p2z: f32; // p1p2 vector z coordinate let mut p3p2x: f32; // p3p2 vector x coordinate let mut p3p2y: f32; // p3p2 vector y coordinate let mut p3p2z: f32; // p3p2 vector z coordinate let mut faceNormalx: f32; // facet normal x coordinate let mut faceNormaly: f32; // facet normal y coordinate let mut faceNormalz: f32; // facet normal z coordinate let mut length: f32; // facet normal length before normalization let mut v1x: usize; // vector1 x index in the positions array let mut v1y: usize; // vector1 y index in the positions array let mut v1z: usize; // vector1 z index in the positions array let mut v2x: usize; // vector2 x index in the positions array let mut v2y: usize; // vector2 y index in the positions array let mut v2z: usize; // vector2 z index in the positions array let mut v3x: usize; // vector3 x index in the positions array let mut v3y: usize; // vector3 y index in the positions array let mut v3z: usize; // vector3 z index in the positions array // reset the normals normals.fill(0.); // Loop : 1 indice triplet = 1 facet let nbFaces = (indices.len() / 3) | 0; for index in 0..nbFaces { // get the indexes of the coordinates of each vertex of the facet v1x = indices[index as usize * 3] as usize * 3; v1y = v1x + 1; v1z = v1x + 2; v2x = indices[index as usize * 3 + 1] as usize * 3; v2y = v2x + 1; v2z = v2x + 2; v3x = indices[index as usize * 3 + 2] as usize * 3; v3y = v3x + 1; v3z = v3x + 2; p1p2x = positions[v1x] - positions[v2x]; // compute two vectors per facet : p1p2 and p3p2 p1p2y = positions[v1y] - positions[v2y]; p1p2z = positions[v1z] - positions[v2z]; p3p2x = positions[v3x] - positions[v2x]; p3p2y = positions[v3y] - positions[v2y]; p3p2z = positions[v3z] - positions[v2z]; // compute the face normal with the cross product faceNormalx = p1p2y * p3p2z - p1p2z * p3p2y; faceNormaly = p1p2z * p3p2x - p1p2x * p3p2z; faceNormalz = p1p2x * p3p2y - p1p2y * p3p2x; // normalize this normal and store it in the array facetData length = (faceNormalx * faceNormalx + faceNormaly * faceNormaly + faceNormalz * faceNormalz).sqrt(); length = if length == 0. { 1.0 } else { length }; faceNormalx /= length; faceNormaly /= length; faceNormalz /= length; // compute the normals anyway normals[v1x] = normals[v1x] + faceNormalx; // accumulate all the normals per face normals[v1y] = normals[v1y] + faceNormaly; normals[v1z] = normals[v1z] + faceNormalz; normals[v2x] = normals[v2x] + faceNormalx; normals[v2y] = normals[v2y] + faceNormaly; normals[v2z] = normals[v2z] + faceNormalz; normals[v3x] = normals[v3x] + faceNormalx; normals[v3y] = normals[v3y] + faceNormaly; normals[v3z] = normals[v3z] + faceNormalz; } // last normalization of each normal for index in 0..normals.len() / 3 { faceNormalx = normals[index * 3]; faceNormaly = normals[index * 3 + 1]; faceNormalz = normals[index * 3 + 2]; length = (faceNormalx * faceNormalx + faceNormaly * faceNormaly + faceNormalz * faceNormalz).sqrt(); length = if length == 0. { 1.0 } else { length }; faceNormalx /= length; faceNormaly /= length; faceNormalz /= length; normals[index * 3] = faceNormalx; normals[index * 3 + 1] = faceNormaly; normals[index * 3 + 2] = faceNormalz; } }
Become a Patron
Sponsor on GitHub
Donate via PayPal
Compiler Explorer Shop
Source on GitHub
Mailing list
Installed libraries
Wiki
Report an issue
How it works
Contact the author
CE on Mastodon
CE on Bluesky
Statistics
Changelog
Version tree