0

我希望在我的光线投射器中实现 SLAB6,尤其是对体素模型的 kv6 支持。然而,Ken Silverman 的 SLAB6 源代码完全不可读(主要是 ASM),所以我希望有人能指出我正确的 C/Java 源代码来加载 kv6 模型,或者最好用一些伪代码解释我的工作原理(因为我想知道如何支持kv6,我知道它是如何工作的)。谢谢, 凯

编辑:实现将在 Java 中。

4

1 回答 1

0

我在一个名为 VoxelGL 的应用程序中找到了一些代码(源代码中未提及作者):

void CVoxelWorld::generateSlabFromData(unsigned char *data, VoxelData *vdata, Slab *slab)
{
    int currentpattern = 1;
    int i = 0;
    int n, totalcount, v, count;
    n = 0;
    v = 0;
    while (1)
    {
        while (data[i] == currentpattern)
        {
            if (currentpattern == 1)
                v++;
            i++;
            if (i == 256)
                break;
        }
        n++;
        if (i == 256)
        {
            if (currentpattern == 0)
                n--;
            break;
        }
        currentpattern ^= 1;
    }
    slab->nentries = n;
    if (slab->description != 0)delete [] slab->description;
    if (slab->data != 0)delete [] slab->data;
    slab->description = new int[n];
    slab->data = new VoxelData[v];

    totalcount = 0;
    v = 0;
    currentpattern = 1;

    for (i = 0; i < n; i++)
    {
        count = 0;
        while (data[totalcount] == currentpattern)
        {
            count++;
            totalcount++;
            if (totalcount == 256)
                break;
        }
        slab->description[i] = count-1;
        if (i % 2 == 0)
        {
            memcpy(slab->data + v, vdata + totalcount - count, 3 * count);
            v += count;
        }
        currentpattern ^= 1;
    }
}

和:

#define clustersize 8
Slab *CVoxelWorld::getSlab(int x, int z)
{
    int xgrid = x / clustersize;
    int ygrid = z / clustersize;
    int clusteroffset = xgrid * 1024 * clustersize + ygrid * clustersize * clustersize;

    return &m_data[clusteroffset + (x & (clustersize - 1)) + (z & (clustersize - 1)) * clustersize];
}

和:

int CVoxelWorld::isSolid(int x, int y, int z)
{
    Slab *slab;

    if (y < 0 || y > 256)
        return 0;

    slab = getSlab(x, z);
    int counter = 0;
    for (int i = 0; i < slab->nentries; i++)
    {
        int height = slab->description[i] + 1;
        if (i % 2 == 0)
        {
            if (y >= counter && y < counter + height)
                return 1;
        }
        counter += height;
    }
    return 0;
}
于 2011-07-12T11:21:06.280 回答