Spaces:
Running
Running
extern "C" { | |
void sort(float *viewProj, float *transforms, uint32_t *transformIndices, uint32_t vertexCount, float *positions, | |
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[2] = transform[0] * viewProj[2] + transform[1] * viewProj[6] + transform[2] * viewProj[10] + | |
transform[3] * viewProj[14]; | |
viewTransform[6] = transform[4] * viewProj[2] + transform[5] * viewProj[6] + transform[6] * viewProj[10] + | |
transform[7] * viewProj[14]; | |
viewTransform[10] = transform[8] * viewProj[2] + transform[9] * viewProj[6] + transform[10] * viewProj[10] + | |
transform[11] * viewProj[14]; | |
viewTransform[14] = transform[12] * viewProj[2] + transform[13] * viewProj[6] + transform[14] * viewProj[10] + | |
transform[15] * viewProj[14]; | |
} | |
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; | |
} | |
} | |
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]; | |
} | |
for (uint32_t i = 0; i < vertexCount; i++) { | |
depthIndex[starts[depthBuffer[i]]++] = i; | |
} | |
} | |
} | |