Sto scrivendo un visualizzatore BSP per un progetto universitario. Finora ho caricato correttamente la geometria principale e il PVS funzionava.
Ora sto cercando di applicare le mappe luminose, ma non riesco a ottenere le coordinate della trama per le mappe luminose calcolate correttamente.
Secondo qui: http://developer.valvesoftware.com/wiki/The_Source_Engine_BSP_File_Format
struct texinfo_t
{
float textureVecs[2][4]; // [s/t][xyz offset]
float lightmapVecs[2][4]; // [s/t][xyz offset] - length is in units of texels/area
int flags; // miptex flags overrides
int texdata; // Pointer to texture name, size, etc.
}
La prima serie di float è essenzialmente due vettori che rappresentano come la trama è orientata e ridimensionata quando viene renderizzata sulla geometria del mondo. I due vettori, s e t, sono la mappatura delle direzioni da sinistra a destra e dall'alto verso il basso nello spazio delle coordinate dei pixel della trama, sul mondo. Ogni vettore ha un componente x, ye z, più un offset che è lo "spostamento" della trama in quella direzione rispetto al mondo. La lunghezza dei vettori rappresenta il ridimensionamento della trama in ciascuna direzione.
Le coordinate 2D (u, v) di un pixel di trama (o texel) sono mappate alle coordinate del mondo (x, y, z) di un punto su una faccia mediante:
u = tv0,0 * x + tv0,1 * y + tv0,2 * z + tv0,3
v = tv1,0 * x + tv1,1 * y + tv1,2 * z + tv1,3
(ad es. Il punto prodotto dei vettori con il vertice più l'offset in quella direzione. Dove tvA, B è textureVecs [A] [B].
Inoltre, dopo aver calcolato (u, v), per convertirli in coordinate di trama che invieresti alla tua scheda grafica, dividi rispettivamente u e v per la larghezza e l'altezza della trama.
Quindi sto facendo il calcolo come segue. Prendi il prodotto punto del vertice e il vettore lightmap (lightmapVecs [0] [0], lightmapVecs 0 , lightmapVecs [0] [2]) aggiungi l'offset (lightmapVecs [0] [3]), sottrai i minuti e dividi il risultato per larghezza / altezza.
float s = Vector3f.dot(v, new Vector3f(lightmapVecs[0][0], lightmapVecs[0][1], lightmapVecs[0][2])) + lightmapVecs[0][3] - f.LightmapTextureMinsInLuxels[0];
float t = Vector3f.dot(v, new Vector3f(lightmapVecs[1][0], lightmapVecs[1][1], lightmapVecs[1][2])) + lightmapVecs[1][3] - f.LightmapTextureMinsInLuxels[1];
s /= (f.LightmapTextureSizeInLuxels[0] + 1);
t /= (f.LightmapTextureSizeInLuxels[1] + 1);
Tuttavia finisce per apparire così:
Ecco un calcolo di esempio per la trama 't' per un vertice.
vertex = 352.0, -144.00027, -224.0
lightmap vector = -4, 0, 0
lightmap offset = 0
lightmap mins = 9
lightmap height = 14
Quindi il prodotto punto è -1408
(-1408 + 0 - 9) / 14
t = -101.21
Sembra lontano.