2011-07-11 60 views
0

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

編輯:執行將在Java中。

回答

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; 
}