Unity Web Shader IDE
Full source <CORE>/ShaderLibrary/VertexCubeSlicing.hlsl HLSL 55 lines 11 symbols 0 includes Hide source Show source
VertexCubeSlicing.hlsl <CORE>/ShaderLibrary/VertexCubeSlicing.hlsl
Language
HLSL
Lines
55
Symbols
11
Includes
0
Open IDE root

<CORE>/ShaderLibrary/VertexCubeSlicing.hlsl full source

#ifndef VERTEX_CUBE_SLICING
# define VERTEX_CUBE_SLICING

// Box - plane slicing from 'A Vertex Program for Efficient Box-Plane Intersection'
// Optimized with 'A COMPARISON OF GPU BOX-PLANE INTERSECTION ALGORITHMS FOR DIRECT VOLUME RENDERING'

static const int sequence[16] = {
    0, 1, 2, 3, 4, 5, 6, 7,
    1, 2, 3, 0, 7, 4, 5, 6,
};

static const int v1[24] = {
    0, 1, 4, -1,
    1, 0, 1, 4,
    0, 2, 5, -1,
    2, 0, 2, 5,
    0, 3, 6, -1,
    3, 0, 3, 6
};

static const int v2[24] = {
    1, 4, 7, -1,
    5, 1, 4, 7,
    2, 5, 7, -1,
    6, 2, 5, 7,
    3, 6, 7, -1,
    4, 3, 6, 7
};

#ifdef GET_CUBE_VERTEX_POSITION
float3 ComputeCubeSliceVertexPositionRWS(float3 cameraViewDirection, float planeDistance, int vertexId)
{
    float3 position = 0;

    for (int i = 0; i < 4; ++i)
    {
        int vidx1 = sequence[int(v1[vertexId * 4 + i])];
        int vidx2 = sequence[int(v2[vertexId * 4 + i])];
        float3 vecV1 = GET_CUBE_VERTEX_POSITION(vidx1);
        float3 vecV2 = GET_CUBE_VERTEX_POSITION(vidx2);

        float3 intersection = 0;
        if (RayPlaneSegmentIntersect(vecV1, vecV2 - vecV1, cameraViewDirection, planeDistance, intersection))
        {
            position = intersection;
            break;
        }
    }

    return position;
}
#endif // GET_CUBE_VERTEX_POSITION

#endif // VERTEX_CUBE_SLICING