0
我正在尋找SLAB6到我的raycaster中,尤其是voxelmodels的kv6支持。然而,Ken Silverman的SLAB6源代碼是完全不可讀的(主要是ASM),所以我希望有人可以指向我的一個合適的C/Java源碼來加載kv6模型,或者最好是用一些僞代碼解釋我的工作原理(因爲我想知道如何支持kv6,我知道它是如何工作的)。謝謝,Kaj尋找SLAB6實現
編輯:執行將在Java中。
我正在尋找SLAB6到我的raycaster中,尤其是voxelmodels的kv6支持。然而,Ken Silverman的SLAB6源代碼是完全不可讀的(主要是ASM),所以我希望有人可以指向我的一個合適的C/Java源碼來加載kv6模型,或者最好是用一些僞代碼解釋我的工作原理(因爲我想知道如何支持kv6,我知道它是如何工作的)。謝謝,Kaj尋找SLAB6實現
編輯:執行將在Java中。
我發現在一個名爲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;
}