⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 r_data.c

📁 PIXIL is a small footprint operating environment, complete with PDA PIM applications, a browser and
💻 C
📖 第 1 页 / 共 2 页
字号:
    int			numtextures1;    int			numtextures2;    int*		directory;        int			temp1;    int			temp2;    int			temp3;        // Load the patch names from pnames.lmp.    name[8] = 0;	    names = W_CacheLumpName ("PNAMES", PU_STATIC);    nummappatches = LONG ( *((int *)names) );    name_p = names+4;    //    printf("nummappatches = %d\n",nummappatches);    patchlookup = alloca (nummappatches*sizeof(*patchlookup));        for (i=0 ; i<nummappatches ; i++)    {	strncpy (name,name_p+i*8, 8);	patchlookup[i] = W_CheckNumForName (name);    }    Z_Free (names);        // Load the map texture definitions from textures.lmp.    // The data is contained in one or two lumps,    //  TEXTURE1 for shareware, plus TEXTURE2 for commercial.    maptex = maptex1 = W_CacheLumpName ("TEXTURE1", PU_STATIC);    numtextures1 = LONG(*maptex);    maxoff = W_LumpLength (W_GetNumForName ("TEXTURE1"));    directory = maptex+1;    //    printf("read in lump TEXTURE1 size %d\n",maxoff);/*    for(i=0; i<maxoff; i++) {      if(!(i%16))	 printf("\n");      printf("%02x ", (int)*(((unsigned char * )maptex) + i) );    }*/	    if (W_CheckNumForName ("TEXTURE2") != -1)    {	maptex2 = W_CacheLumpName ("TEXTURE2", PU_STATIC);	numtextures2 = LONG(*maptex2);	maxoff2 = W_LumpLength (W_GetNumForName ("TEXTURE2"));    }    else    {	maptex2 = NULL;	numtextures2 = 0;	maxoff2 = 0;    }    numtextures = numtextures1 + numtextures2;	    textures = Z_Malloc (numtextures*4, PU_STATIC, 0);    texturecolumnlump = Z_Malloc (numtextures*4, PU_STATIC, 0);    texturecolumnofs = Z_Malloc (numtextures*4, PU_STATIC, 0);    texturecomposite = Z_Malloc (numtextures*4, PU_STATIC, 0);    texturecompositesize = Z_Malloc (numtextures*4, PU_STATIC, 0);    texturewidthmask = Z_Malloc (numtextures*4, PU_STATIC, 0);    textureheight = Z_Malloc (numtextures*4, PU_STATIC, 0);    totalwidth = 0;        //	Really complex printing shit...    temp1 = W_GetNumForName ("S_START");  // P_???????    temp2 = W_GetNumForName ("S_END") - 1;    temp3 = ((temp2-temp1+63)/64) + ((numtextures+63)/64);    printf("[");    for (i = 0; i < temp3; i++)	printf(" ");    printf("         ]");    for (i = 0; i < temp3; i++)	printf("\x8");    printf("\x8\x8\x8\x8\x8\x8\x8\x8\x8\x8");		    for (i=0 ; i<numtextures ; i++, directory++)    {	if (!(i&63))	    printf (".");	if (i == numtextures1)	{	    // Start looking in second texture file.	    maptex = maptex2;	    maxoff = maxoff2;	    directory = maptex+1;	}	offset = LONG(*directory);	if (offset > maxoff)	    I_Error ("R_InitTextures: bad texture directory");		mtexture = (maptexture_t *) ( (byte *)maptex + offset);	texture = textures[i] =	    Z_Malloc (sizeof(texture_t)		      + sizeof(texpatch_t)*(SHORT(mtexture->patchcount)-1),		      PU_STATIC, 0);		texture->width = SHORT(mtexture->width);	texture->height = SHORT(mtexture->height);	texture->patchcount = SHORT(mtexture->patchcount);	/* memcpy() generates a BUS error on Solaris with optimization on */#if 0	memcpy (texture->name, mtexture->name, sizeof(texture->name));#else	{ char *src; char *dst;	  src = (char *)mtexture->name;	  dst = (char *)texture->name;	  for (j=0; j<sizeof(texture->name); ++j )	    *dst++ = *src++;	}#endif	mpatch = &mtexture->patches[0];	patch = &texture->patches[0];	//	printf("  ** i = %d offset = %d mtexture = %x mpatch = %x\n",	//	       i,offset,mtexture,mpatch);	//	printf("  ** numpatches for texture %s is %d\n",mtexture->name, 	//	       texture->patchcount);	for (j=0 ; j<texture->patchcount ; j++, mpatch++, patch++)	{	    patch->originx = SHORT(mpatch->originx);	    patch->originy = SHORT(mpatch->originy);	    //	    printf("   ** Getting patchlookup %x %d\n",mpatch,(int)mpatch->patch);	    patch->patch = patchlookup[SHORT(mpatch->patch)];	    if (patch->patch == -1)	    {		I_Error ("R_InitTextures: Missing patch in texture %s",			 texture->name);	    }	}			texturecolumnlump[i] = Z_Malloc (texture->width*2, PU_STATIC,0);	texturecolumnofs[i] = Z_Malloc (texture->width*2, PU_STATIC,0);	j = 1;	while (j*2 <= texture->width)	    j<<=1;	texturewidthmask[i] = j-1;	textureheight[i] = texture->height<<FRACBITS;			totalwidth += texture->width;    }    Z_Free (maptex1);    if (maptex2)	Z_Free (maptex2);        // Precalculate whatever possible.	    for (i=0 ; i<numtextures ; i++)	R_GenerateLookup (i);        // Create translation table for global animation.    texturetranslation = Z_Malloc ((numtextures+1)*4, PU_STATIC, 0);        for (i=0 ; i<numtextures ; i++)	texturetranslation[i] = i;}//// R_InitFlats//void R_InitFlats (void){    int		i;	    firstflat = W_GetNumForName ("F_START") + 1;    lastflat = W_GetNumForName ("F_END") - 1;    numflats = lastflat - firstflat + 1;	    // Create translation table for global animation.    flattranslation = Z_Malloc ((numflats+1)*4, PU_STATIC, 0);        for (i=0 ; i<numflats ; i++)	flattranslation[i] = i;}//// R_InitSpriteLumps// Finds the width and hoffset of all sprites in the wad,//  so the sprite does not need to be cached completely//  just for having the header info ready during rendering.//void R_InitSpriteLumps (void){    int		i;    patch_t	*patch;	    firstspritelump = W_GetNumForName ("S_START") + 1;    lastspritelump = W_GetNumForName ("S_END") - 1;        numspritelumps = lastspritelump - firstspritelump + 1;    spritewidth = Z_Malloc (numspritelumps*4, PU_STATIC, 0);    spriteoffset = Z_Malloc (numspritelumps*4, PU_STATIC, 0);    spritetopoffset = Z_Malloc (numspritelumps*4, PU_STATIC, 0);	    for (i=0 ; i< numspritelumps ; i++)    {	if (!(i&63))	    printf (".");	patch = W_CacheLumpNum (firstspritelump+i, PU_CACHE);	spritewidth[i] = SHORT(patch->width)<<FRACBITS;	spriteoffset[i] = SHORT(patch->leftoffset)<<FRACBITS;	spritetopoffset[i] = SHORT(patch->topoffset)<<FRACBITS;    }}//// R_InitColormaps//void R_InitColormaps (void){    int	lump, length;        // Load in the light tables,     //  256 byte align tables.    lump = W_GetNumForName("COLORMAP");     length = W_LumpLength (lump) + 255;     colormaps = Z_Malloc (length, PU_STATIC, 0);     colormaps = (byte *)( ((int)colormaps + 255)&~0xff);     W_ReadLump (lump,colormaps); }//// R_InitData// Locates all the lumps//  that will be used by all views// Must be called after W_Init.//void R_InitData (void){    R_InitTextures ();    printf ("\nInitTextures");    R_InitFlats ();    printf ("\nInitFlats");    R_InitSpriteLumps ();    printf ("\nInitSprites");    R_InitColormaps ();    printf ("\nInitColormaps");}//// R_FlatNumForName// Retrieval, get a flat number for a flat name.//int R_FlatNumForName (char* name){    int		i;    char	namet[9];    i = W_CheckNumForName (name);    if (i == -1)    {	namet[8] = 0;	memcpy (namet, name,8);	I_Error ("R_FlatNumForName: %s not found",namet);    }    return i - firstflat;}//// R_CheckTextureNumForName// Check whether texture is available.// Filter out NoTexture indicator.//int	R_CheckTextureNumForName (char *name){    int		i;    // "NoTexture" marker.    if (name[0] == '-')			return 0;		    for (i=0 ; i<numtextures ; i++)	if (!I_strncasecmp (textures[i]->name, name, 8) )	    return i;		    return -1;}//// R_TextureNumForName// Calls R_CheckTextureNumForName,//  aborts with error message.//int	R_TextureNumForName (char* name){    int		i;	    i = R_CheckTextureNumForName (name);    if (i==-1)    {	I_Error ("R_TextureNumForName: %s not found",		 name);    }    return i;}//// R_PrecacheLevel// Preloads all relevant graphics for the level.//int		flatmemory;int		texturememory;int		spritememory;void R_PrecacheLevel (void){    char*		flatpresent;    char*		texturepresent;    char*		spritepresent;    int			i;    int			j;    int			k;    int			lump;        texture_t*		texture;    thinker_t*		th;    spriteframe_t*	sf;    if (demoplayback)	return;        // Precache flats.    flatpresent = alloca(numflats);    memset (flatpresent,0,numflats);	    for (i=0 ; i<numsectors ; i++)    {	flatpresent[sectors[i].floorpic] = 1;	flatpresent[sectors[i].ceilingpic] = 1;    }	    flatmemory = 0;    for (i=0 ; i<numflats ; i++)    {	if (flatpresent[i])	{	    lump = firstflat + i;	    flatmemory += lumpinfo[lump].size;	    W_CacheLumpNum(lump, PU_CACHE);	}    }        // Precache textures.    texturepresent = alloca(numtextures);    memset (texturepresent,0, numtextures);	    for (i=0 ; i<numsides ; i++)    {	texturepresent[sides[i].toptexture] = 1;	texturepresent[sides[i].midtexture] = 1;	texturepresent[sides[i].bottomtexture] = 1;    }    // Sky texture is always present.    // Note that F_SKY1 is the name used to    //  indicate a sky floor/ceiling as a flat,    //  while the sky texture is stored like    //  a wall texture, with an episode dependend    //  name.    texturepresent[skytexture] = 1;	    texturememory = 0;    for (i=0 ; i<numtextures ; i++)    {	if (!texturepresent[i])	    continue;	texture = textures[i];		for (j=0 ; j<texture->patchcount ; j++)	{	    lump = texture->patches[j].patch;	    texturememory += lumpinfo[lump].size;	    W_CacheLumpNum(lump , PU_CACHE);	}    }        // Precache sprites.    spritepresent = alloca(numsprites);    memset (spritepresent,0, numsprites);	    for (th = thinkercap.next ; th != &thinkercap ; th=th->next)    {	if (th->function.acp1 == (actionf_p1)P_MobjThinker)	    spritepresent[((mobj_t *)th)->sprite] = 1;    }	    spritememory = 0;    for (i=0 ; i<numsprites ; i++)    {	if (!spritepresent[i])	    continue;	for (j=0 ; j<sprites[i].numframes ; j++)	{	    sf = &sprites[i].spriteframes[j];	    for (k=0 ; k<8 ; k++)	    {		lump = firstspritelump + sf->lump[k];		spritememory += lumpinfo[lump].size;		W_CacheLumpNum(lump , PU_CACHE);	    }	}    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -