From b5b92293bf478345b83217b8a0e0db4f718c1bc1 Mon Sep 17 00:00:00 2001 From: dylanebert Date: Sun, 10 Mar 2024 16:10:36 -0400 Subject: [PATCH] formatting --- .gitignore | 3 + wasm/data.cpp | 176 ++++++++++++++++++++++---------------------------- wasm/sort.cpp | 169 ++++++++++++++++++++++++------------------------ 3 files changed, 167 insertions(+), 181 deletions(-) diff --git a/.gitignore b/.gitignore index c6bba59..c27580c 100644 --- a/.gitignore +++ b/.gitignore @@ -128,3 +128,6 @@ dist .yarn/build-state.yml .yarn/install-state.gz .pnp.* + +# IDE +.vscode/ \ No newline at end of file diff --git a/wasm/data.cpp b/wasm/data.cpp index f6c8b97..feb774b 100644 --- a/wasm/data.cpp +++ b/wasm/data.cpp @@ -1,11 +1,11 @@ #include -#include #include +#include #include + #include -uint16_t floatToHalf(float value) -{ +uint16_t floatToHalf(float value) { uint32_t f = *reinterpret_cast(&value); uint32_t sign = (f >> 31) & 0x0001; @@ -13,27 +13,19 @@ uint16_t floatToHalf(float value) uint32_t frac = f & 0x007fffff; uint32_t newExp; - if (exp == 0) - { + if (exp == 0) { newExp = 0; - } - else if (exp < 113) - { + } else if (exp < 113) { newExp = 0; frac |= 0x00800000; frac >>= (113 - exp); - if (frac & 0x01000000) - { + if (frac & 0x01000000) { newExp = 1; frac = 0; } - } - else if (exp < 142) - { + } else if (exp < 142) { newExp = exp - 112; - } - else - { + } else { newExp = 31; frac = 0; } @@ -41,23 +33,20 @@ uint16_t floatToHalf(float value) return (sign << 15) | (newExp << 10) | (frac >> 13); } -uint32_t packHalf2x16(float x, float y) -{ +uint32_t packHalf2x16(float x, float y) { uint16_t hx = floatToHalf(x); uint16_t hy = floatToHalf(y); return (uint32_t)hx | ((uint32_t)hy << 16); } -void multiplyQuaternion(float *a, float *b, float *result) -{ +void multiplyQuaternion(float *a, float *b, float *result) { result[0] = a[3] * b[1] + a[0] * b[0] + a[1] * b[3] - a[2] * b[2]; result[1] = a[3] * b[2] - a[0] * b[3] + a[1] * b[0] + a[2] * b[1]; result[2] = a[3] * b[3] + a[0] * b[2] - a[1] * b[1] + a[2] * b[0]; result[3] = a[3] * b[0] - a[0] * b[1] - a[1] * b[2] - a[2] * b[3]; } -void quaternionToMatrix3(float *q, float *result) -{ +void quaternionToMatrix3(float *q, float *result) { result[0] = 1 - 2 * q[1] * q[1] - 2 * q[2] * q[2]; result[1] = 2 * q[0] * q[1] - 2 * q[2] * q[3]; result[2] = 2 * q[0] * q[2] + 2 * q[1] * q[3]; @@ -69,8 +58,7 @@ void quaternionToMatrix3(float *q, float *result) result[8] = 1 - 2 * q[0] * q[0] - 2 * q[1] * q[1]; } -void multiplyMatrix3(float *a, float *b, float *result) -{ +void multiplyMatrix3(float *a, float *b, float *result) { result[0] = b[0] * a[0] + b[3] * a[1] + b[6] * a[2]; result[1] = b[1] * a[0] + b[4] * a[1] + b[7] * a[2]; result[2] = b[2] * a[0] + b[5] * a[1] + b[8] * a[2]; @@ -82,79 +70,73 @@ void multiplyMatrix3(float *a, float *b, float *result) result[8] = b[2] * a[6] + b[5] * a[7] + b[8] * a[8]; } -extern "C" -{ - void pack( - bool selected, - uint32_t vertexCount, float *positions, float *rotations, float *scales, - uint8_t *colors, uint8_t *selection, uint32_t *data, float *worldPositions, - float *worldRotations, float *worldScales) - { - float rot[4]; - float rotMat[9]; - float scaleMat[9] = {0}; - float M[9]; - float sigma[6]; - - for (uint32_t i = 0; i < vertexCount; i++) - { - float x = positions[i * 3 + 0]; - float y = positions[i * 3 + 1]; - float z = positions[i * 3 + 2]; - - worldPositions[i * 3 + 0] = x; - worldPositions[i * 3 + 1] = y; - worldPositions[i * 3 + 2] = z; - - data[8 * i + 0] = *(uint32_t *)&x; - data[8 * i + 1] = *(uint32_t *)&y; - data[8 * i + 2] = *(uint32_t *)&z; - - data[8 * i + 3] = 0; - if (selected || selection[i] > 0) - { - data[8 * i + 3] |= 0x01000000; - } - - uint32_t color = 0; - color |= (uint32_t)colors[i * 4 + 0] << 0; - color |= (uint32_t)colors[i * 4 + 1] << 8; - color |= (uint32_t)colors[i * 4 + 2] << 16; - color |= (uint32_t)colors[i * 4 + 3] << 24; - data[8 * i + 7] = color; - - rot[0] = rotations[i * 4 + 1]; - rot[1] = rotations[i * 4 + 2]; - rot[2] = rotations[i * 4 + 3]; - rot[3] = -rotations[i * 4 + 0]; - - quaternionToMatrix3(rot, rotMat); - - worldRotations[i * 4 + 0] = rot[0]; - worldRotations[i * 4 + 1] = rot[1]; - worldRotations[i * 4 + 2] = rot[2]; - worldRotations[i * 4 + 3] = rot[3]; - - scaleMat[0] = scales[i * 3 + 0]; - scaleMat[4] = scales[i * 3 + 1]; - scaleMat[8] = scales[i * 3 + 2]; - - worldScales[i * 3 + 0] = scaleMat[0]; - worldScales[i * 3 + 1] = scaleMat[4]; - worldScales[i * 3 + 2] = scaleMat[8]; - - multiplyMatrix3(scaleMat, rotMat, M); - - sigma[0] = M[0] * M[0] + M[3] * M[3] + M[6] * M[6]; - sigma[1] = M[0] * M[1] + M[3] * M[4] + M[6] * M[7]; - sigma[2] = M[0] * M[2] + M[3] * M[5] + M[6] * M[8]; - sigma[3] = M[1] * M[1] + M[4] * M[4] + M[7] * M[7]; - sigma[4] = M[1] * M[2] + M[4] * M[5] + M[7] * M[8]; - sigma[5] = M[2] * M[2] + M[5] * M[5] + M[8] * M[8]; - - data[8 * i + 4] = packHalf2x16(4 * sigma[0], 4 * sigma[1]); - data[8 * i + 5] = packHalf2x16(4 * sigma[2], 4 * sigma[3]); - data[8 * i + 6] = packHalf2x16(4 * sigma[4], 4 * sigma[5]); +extern "C" { +void pack(bool selected, uint32_t vertexCount, float *positions, float *rotations, float *scales, uint8_t *colors, + uint8_t *selection, uint32_t *data, float *worldPositions, float *worldRotations, float *worldScales, + uint8_t *changedPoints) { + float rot[4]; + float rotMat[9]; + float scaleMat[9] = {0}; + float M[9]; + float sigma[6]; + + for (uint32_t i = 0; i < vertexCount; i++) { + float x = positions[i * 3 + 0]; + float y = positions[i * 3 + 1]; + float z = positions[i * 3 + 2]; + + worldPositions[i * 3 + 0] = x; + worldPositions[i * 3 + 1] = y; + worldPositions[i * 3 + 2] = z; + + data[8 * i + 0] = *(uint32_t *)&x; + data[8 * i + 1] = *(uint32_t *)&y; + data[8 * i + 2] = *(uint32_t *)&z; + + data[8 * i + 3] = 0; + if (selected || selection[i] > 0) { + data[8 * i + 3] |= 0x01000000; } + + uint32_t color = 0; + color |= (uint32_t)colors[i * 4 + 0] << 0; + color |= (uint32_t)colors[i * 4 + 1] << 8; + color |= (uint32_t)colors[i * 4 + 2] << 16; + color |= (uint32_t)colors[i * 4 + 3] << 24; + data[8 * i + 7] = color; + + rot[0] = rotations[i * 4 + 1]; + rot[1] = rotations[i * 4 + 2]; + rot[2] = rotations[i * 4 + 3]; + rot[3] = -rotations[i * 4 + 0]; + + quaternionToMatrix3(rot, rotMat); + + worldRotations[i * 4 + 0] = rot[0]; + worldRotations[i * 4 + 1] = rot[1]; + worldRotations[i * 4 + 2] = rot[2]; + worldRotations[i * 4 + 3] = rot[3]; + + scaleMat[0] = scales[i * 3 + 0]; + scaleMat[4] = scales[i * 3 + 1]; + scaleMat[8] = scales[i * 3 + 2]; + + worldScales[i * 3 + 0] = scaleMat[0]; + worldScales[i * 3 + 1] = scaleMat[4]; + worldScales[i * 3 + 2] = scaleMat[8]; + + multiplyMatrix3(scaleMat, rotMat, M); + + sigma[0] = M[0] * M[0] + M[3] * M[3] + M[6] * M[6]; + sigma[1] = M[0] * M[1] + M[3] * M[4] + M[6] * M[7]; + sigma[2] = M[0] * M[2] + M[3] * M[5] + M[6] * M[8]; + sigma[3] = M[1] * M[1] + M[4] * M[4] + M[7] * M[7]; + sigma[4] = M[1] * M[2] + M[4] * M[5] + M[7] * M[8]; + sigma[5] = M[2] * M[2] + M[5] * M[5] + M[8] * M[8]; + + data[8 * i + 4] = packHalf2x16(4 * sigma[0], 4 * sigma[1]); + data[8 * i + 5] = packHalf2x16(4 * sigma[2], 4 * sigma[3]); + data[8 * i + 6] = packHalf2x16(4 * sigma[4], 4 * sigma[5]); } +} } \ No newline at end of file diff --git a/wasm/sort.cpp b/wasm/sort.cpp index e35d5a4..7b0ef40 100644 --- a/wasm/sort.cpp +++ b/wasm/sort.cpp @@ -1,98 +1,99 @@ #include -#include #include +#include #include -extern "C" -{ - void sort( - float *viewProj, float *transforms, - uint32_t *transformIndices, uint32_t vertexCount, - float *positions, uint8_t *chunks, - uint32_t *depthBuffer, uint32_t *depthIndex, - uint32_t *starts, uint32_t *counts) - { - int32_t minDepth = 0x7fffffff; - int32_t maxDepth = 0x80000000; - int32_t previousTransformIndex = -1; - float viewTransform[16]; - for (uint32_t i = 0; i < vertexCount; i++) - { - float x = positions[3 * i + 0]; - float y = positions[3 * i + 1]; - float z = positions[3 * i + 2]; +extern "C" { +void sort(float *viewProj, float *transforms, uint32_t *transformIndices, uint32_t vertexCount, float *positions, + uint8_t *chunks, uint32_t *depthBuffer, uint32_t *depthIndex, uint32_t *starts, uint32_t *counts) { + int32_t minDepth = 0x7fffffff; + int32_t maxDepth = 0x80000000; + int32_t previousTransformIndex = -1; + float viewTransform[16]; + for (uint32_t i = 0; i < vertexCount; i++) { + float x = positions[3 * i + 0]; + float y = positions[3 * i + 1]; + float z = positions[3 * i + 2]; - uint32_t transformIndex = transformIndices[i]; - if (transformIndex != previousTransformIndex) - { - previousTransformIndex = transformIndex; - float *transform = &transforms[20 * transformIndex]; - viewTransform[0] = transform[0] * viewProj[0] + transform[1] * viewProj[4] + transform[2] * viewProj[8] + transform[3] * viewProj[12]; - viewTransform[1] = transform[0] * viewProj[1] + transform[1] * viewProj[5] + transform[2] * viewProj[9] + transform[3] * viewProj[13]; - viewTransform[2] = transform[0] * viewProj[2] + transform[1] * viewProj[6] + transform[2] * viewProj[10] + transform[3] * viewProj[14]; - viewTransform[3] = transform[0] * viewProj[3] + transform[1] * viewProj[7] + transform[2] * viewProj[11] + transform[3] * viewProj[15]; - viewTransform[4] = transform[4] * viewProj[0] + transform[5] * viewProj[4] + transform[6] * viewProj[8] + transform[7] * viewProj[12]; - viewTransform[5] = transform[4] * viewProj[1] + transform[5] * viewProj[5] + transform[6] * viewProj[9] + transform[7] * viewProj[13]; - viewTransform[6] = transform[4] * viewProj[2] + transform[5] * viewProj[6] + transform[6] * viewProj[10] + transform[7] * viewProj[14]; - viewTransform[7] = transform[4] * viewProj[3] + transform[5] * viewProj[7] + transform[6] * viewProj[11] + transform[7] * viewProj[15]; - viewTransform[8] = transform[8] * viewProj[0] + transform[9] * viewProj[4] + transform[10] * viewProj[8] + transform[11] * viewProj[12]; - viewTransform[9] = transform[8] * viewProj[1] + transform[9] * viewProj[5] + transform[10] * viewProj[9] + transform[11] * viewProj[13]; - viewTransform[10] = transform[8] * viewProj[2] + transform[9] * viewProj[6] + transform[10] * viewProj[10] + transform[11] * viewProj[14]; - viewTransform[11] = transform[8] * viewProj[3] + transform[9] * viewProj[7] + transform[10] * viewProj[11] + transform[11] * viewProj[15]; - viewTransform[12] = transform[12] * viewProj[0] + transform[13] * viewProj[4] + transform[14] * viewProj[8] + transform[15] * viewProj[12]; - viewTransform[13] = transform[12] * viewProj[1] + transform[13] * viewProj[5] + transform[14] * viewProj[9] + transform[15] * viewProj[13]; - viewTransform[14] = transform[12] * viewProj[2] + transform[13] * viewProj[6] + transform[14] * viewProj[10] + transform[15] * viewProj[14]; - viewTransform[15] = transform[12] * viewProj[3] + transform[13] * viewProj[7] + transform[14] * viewProj[11] + transform[15] * viewProj[15]; - } + uint32_t transformIndex = transformIndices[i]; + if (transformIndex != previousTransformIndex) { + previousTransformIndex = transformIndex; + float *transform = &transforms[20 * transformIndex]; + viewTransform[0] = transform[0] * viewProj[0] + transform[1] * viewProj[4] + transform[2] * viewProj[8] + + transform[3] * viewProj[12]; + viewTransform[1] = transform[0] * viewProj[1] + transform[1] * viewProj[5] + transform[2] * viewProj[9] + + transform[3] * viewProj[13]; + viewTransform[2] = transform[0] * viewProj[2] + transform[1] * viewProj[6] + transform[2] * viewProj[10] + + transform[3] * viewProj[14]; + viewTransform[3] = transform[0] * viewProj[3] + transform[1] * viewProj[7] + transform[2] * viewProj[11] + + transform[3] * viewProj[15]; + viewTransform[4] = transform[4] * viewProj[0] + transform[5] * viewProj[4] + transform[6] * viewProj[8] + + transform[7] * viewProj[12]; + viewTransform[5] = transform[4] * viewProj[1] + transform[5] * viewProj[5] + transform[6] * viewProj[9] + + transform[7] * viewProj[13]; + viewTransform[6] = transform[4] * viewProj[2] + transform[5] * viewProj[6] + transform[6] * viewProj[10] + + transform[7] * viewProj[14]; + viewTransform[7] = transform[4] * viewProj[3] + transform[5] * viewProj[7] + transform[6] * viewProj[11] + + transform[7] * viewProj[15]; + viewTransform[8] = transform[8] * viewProj[0] + transform[9] * viewProj[4] + transform[10] * viewProj[8] + + transform[11] * viewProj[12]; + viewTransform[9] = transform[8] * viewProj[1] + transform[9] * viewProj[5] + transform[10] * viewProj[9] + + transform[11] * viewProj[13]; + viewTransform[10] = transform[8] * viewProj[2] + transform[9] * viewProj[6] + transform[10] * viewProj[10] + + transform[11] * viewProj[14]; + viewTransform[11] = transform[8] * viewProj[3] + transform[9] * viewProj[7] + transform[10] * viewProj[11] + + transform[11] * viewProj[15]; + viewTransform[12] = transform[12] * viewProj[0] + transform[13] * viewProj[4] + transform[14] * viewProj[8] + + transform[15] * viewProj[12]; + viewTransform[13] = transform[12] * viewProj[1] + transform[13] * viewProj[5] + transform[14] * viewProj[9] + + transform[15] * viewProj[13]; + viewTransform[14] = transform[12] * viewProj[2] + transform[13] * viewProj[6] + transform[14] * viewProj[10] + + transform[15] * viewProj[14]; + viewTransform[15] = transform[12] * viewProj[3] + transform[13] * viewProj[7] + transform[14] * viewProj[11] + + transform[15] * viewProj[15]; + } - float projectedZ = viewTransform[2] * x + viewTransform[6] * y + viewTransform[10] * z + viewTransform[14]; - int32_t depth = projectedZ * 4096; - depthBuffer[i] = depth; - if (depth > maxDepth) - { - maxDepth = depth; - } - if (depth < minDepth) - { - minDepth = depth; - } + float projectedZ = viewTransform[2] * x + viewTransform[6] * y + viewTransform[10] * z + viewTransform[14]; + int32_t depth = projectedZ * 4096; + depthBuffer[i] = depth; + if (depth > maxDepth) { + maxDepth = depth; + } + if (depth < minDepth) { + minDepth = depth; + } - float projectedX = viewTransform[0] * x + viewTransform[4] * y + viewTransform[8] * z + viewTransform[12]; - float projectedY = viewTransform[1] * x + viewTransform[5] * y + viewTransform[9] * z + viewTransform[13]; - float projectedW = viewTransform[3] * x + viewTransform[7] * y + viewTransform[11] * z + viewTransform[15]; - uint8_t chunk = 0xff; - if (projectedW != 0) - { - float normalizedX = (projectedX / projectedW + 1) / 2; - float normalizedY = (projectedY / projectedW + 1) / 2; - if (normalizedX >= 0 && normalizedX < 1 && normalizedY >= 0 && normalizedY < 1) - { - uint8_t screenSpaceX = (uint8_t)(normalizedX * 15); - uint8_t screenSpaceY = (uint8_t)(normalizedY * 15); - chunk = screenSpaceX + screenSpaceY * 15; - } + float projectedX = viewTransform[0] * x + viewTransform[4] * y + viewTransform[8] * z + viewTransform[12]; + float projectedY = viewTransform[1] * x + viewTransform[5] * y + viewTransform[9] * z + viewTransform[13]; + float projectedW = viewTransform[3] * x + viewTransform[7] * y + viewTransform[11] * z + viewTransform[15]; + uint8_t chunk = 0xff; + if (projectedW != 0) { + float normalizedX = (projectedX / projectedW + 1) / 2; + float normalizedY = (projectedY / projectedW + 1) / 2; + if (normalizedX >= 0 && normalizedX < 1 && normalizedY >= 0 && normalizedY < 1) { + uint8_t screenSpaceX = (uint8_t)(normalizedX * 15); + uint8_t screenSpaceY = (uint8_t)(normalizedY * 15); + chunk = screenSpaceX + screenSpaceY * 15; } - chunks[i] = chunk; } + chunks[i] = chunk; + } - const uint32_t depthRange = 256 * 256; - const float depthInv = (float)(depthRange - 1) / (maxDepth - minDepth); - memset(counts, 0, depthRange * sizeof(uint32_t)); - for (uint32_t i = 0; i < vertexCount; i++) - { - depthBuffer[i] = (depthBuffer[i] - minDepth) * depthInv; - counts[depthBuffer[i]]++; - } + const uint32_t depthRange = 256 * 256; + const float depthInv = (float)(depthRange - 1) / (maxDepth - minDepth); + memset(counts, 0, depthRange * sizeof(uint32_t)); + for (uint32_t i = 0; i < vertexCount; i++) { + depthBuffer[i] = (depthBuffer[i] - minDepth) * depthInv; + counts[depthBuffer[i]]++; + } - starts[0] = 0; - for (uint32_t i = 1; i < depthRange; i++) - { - starts[i] = starts[i - 1] + counts[i - 1]; - } + starts[0] = 0; + for (uint32_t i = 1; i < depthRange; i++) { + starts[i] = starts[i - 1] + counts[i - 1]; + } - for (uint32_t i = 0; i < vertexCount; i++) - { - depthIndex[starts[depthBuffer[i]]++] = i; - } + for (uint32_t i = 0; i < vertexCount; i++) { + depthIndex[starts[depthBuffer[i]]++] = i; } } +}