curRow = patch.y Off set + row;
Компьютерная графика. Полигональные модели
if ( count + curRow >= tex -> height ) count = tex -> height - 1 - curRow;
colData++; // skip 1st pixel
texData = tex->data + col + patch.xOffset + curRow * tex -> width;
for ( register int y = 0; y < count; y++, curRow++ ) {
if ( curRow >= 0 )
*texData = colData [y];
texData += tex -> width;
}
colData += nonTransparentPixels + 1 ; } while ( *colData != '\xFF' );
}
freePic ( pic );
}
Texture * WadFile :: loadFloorTexture ( const char * name ) {
int index = locateResource ( name );
if ( index < 0 ) return NULL;
Texture * tex = new Texture;
if ( tex == NULL ) return NULL;
strncpy ( tex -> name, name, 8 );
tex -> width =64; tex -> height = 64;
tex -> data = (char *) malloc ( 4096 );
if ( tex -> data == NULL ) {
delete tex; return NULL;
}
Iseek ( file, directory [index].offset, SEEK_SET ); read ( file, tex -> data, 4096 );
return tex;
}
void WadFile :: loadTexturel () {
int index = locateResource ( "TEXTURE1" );
texturel = (long *) malloc ( directory [index].size );
if (texture 1 == NULL ). return;
Iseek ( file, directory [index].offset, SEEK_SET );
13. Элементы виртуальной реальности
read (file, texturel, directory [index].size );
}
void WadFile :: loadPNames () {
int index = locateResource ("PNAMES" );
if (index < 0 ) return;
Iseek (file, directory [index].offset, SEEK_SET ); read (file, &numPNames, sizeof ( numPNames ));
pnames = (char *) malloc ( numPNames * 8 );
if ( pnames == NULL ) return;
read (file, pnames, numPNames * 8 );
}
//////////////////////////Ш^^^ void freePic ( Pic * pic )
{
free ( pic -> data ); delete pic;
}
void freeTexture (Texture * tex ) {
free (tex -> data ); delete tex;
}
Замечание. В игре DOOM принята своя система измерения углов. Полный угол в 2л радиан соответствует 65536 единицам. Значению угла 0 соответствует направлению на восток, значению 16384 (0x4000) - на север и т. д. Одним из преимуществ подобного подхода является то обстоятельство, что угол всегда нормирован, т. е. находится в отведенном диапазоне при использовании 16-битовых чисел для работы с углами.