0

レイキャスター、特にボクセルモデルのkv6サポートにSLAB6を実装したいと考えています。ただし、Ken SilvermanによるSLAB6ソースは完全に読めない(ほとんどがASM)ので、誰かがkv6モデルをロードするための適切なC / Javaソースを示したり、擬似コードで動作を説明してくれることを期待していました(知りたいので) kv6をサポートする方法、私はそれがどのように機能するかを知っています)。ありがとう、Kaj

編集:実装は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 に答える