Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2|回复: 0
打印 上一主题 下一主题

[Engine]R_LoadSkys

[复制链接]

189

主题

189

帖子

580

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
580
跳转到指定楼层
楼主
发表于 2017-7-13 15:56:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Engine Version: 6153(Steam)
Function Name: R_LoadSkys
Function Name in Disassembling: sub_1D4E772
Address: 0x1D4E772
Function Signature: \x55\x8B\xEC\x83\xEC\x6C\xA1\x44
Function Prototype:

  1. void R_LoadSkys (void)
  2. {
  3.         int                i, j, skipBMP;
  4.         char        name[64];
  5.         byte        *buffer;
  6.         qboolean printed;

  7.         if ( !gLoadSky )
  8.         {
  9.                 for ( i = 0; i < 6; i++ )
  10.                 {
  11.                         if ( gSkyTexNumber )
  12.                         {
  13.                                 qglDeleteTextures( 1, &gSkyTexNumber );
  14.                                 gSkyTexNumber = 0;
  15.                         }
  16.                 }

  17.                 return;
  18.         }

  19.         if ( qglColorTableEXT && gl_palette_tex.value )
  20.                 GL_PaletteClearSky();
  21.         else
  22.                 skipBMP = true;

  23.         buffer = Mem_Malloc( 0x40000 );

  24. retry:
  25.         printed = false;

  26.         for (i=0 ; i<6 ; i++)
  27.         {
  28.                 int loadedBMP, palCount, bmpWidth, bmpHeight, paletteIndex;
  29.                 byte *packPalette, *pImage;
  30.                 FileHandle_t hFile;

  31.                 loadedBMP = false;
  32.                 Q_snprintf (name, sizeof( name ), "gfx/env/%s%s.bmp", movevars.skyName, suf);

  33.                 if ( !skipBMP )
  34.                 {
  35.                         hFile = FS_Open( name, "rb" );

  36.                         if ( hFile )
  37.                         {
  38.                                 LoadBMP8( hFile, &packPalette, &palCount, &pImage, &bmpWidth, &bmpHeight );

  39.                                 if ( bmpHeight * bmpWidth > 0 )
  40.                                 {
  41.                                         paletteIndex = GL_PaletteAdd( packPalette, true );

  42.                                         if ( paletteIndex >= 0 )
  43.                                         {
  44.                                                 if ( !gSkyTexNumber )
  45.                                                         gSkyTexNumber = GL_GenTexture();

  46.                                                 GL_Bind (gSkyTexNumber);
  47.                                                 qglTexImage2D (GL_TEXTURE_2D, 0, GL_COLOR_INDEX8_EXT, 256, 256, 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, pImage);

  48.                                                 skipBMP = false;
  49.                                                 loadedBMP = true;
  50.                                                 gSkyTexNumber = gSkyTexNumber | ((paletteIndex + 1) << 16);
  51.                                         }

  52.                                         Mem_Free( pImage );
  53.                                         Mem_Free( packPalette );
  54.                                 }
  55.                         }
  56.                 }

  57.                 if ( !loadedBMP )
  58.                 {
  59.                         int w, h, bpp;

  60.                         Q_snprintf (name, sizeof( name ), "gfx/env/%s%s.tga", movevars.skyName, suf);

  61.                         if ( !LoadTGA ( name, buffer, 0x40000, NULL, NULL ) )
  62.                         {
  63.                                 Con_Printf ("Couldn't load %s\n", name);

  64.                                 if ( i == 0 && Q_strcmp( movevars.skyName, "desert" ) != 0 )
  65.                                 {
  66.                                         Q_strcpy( movevars.skyName, "desert" );
  67.                                         goto retry;
  68.                                 }

  69.                                 continue;
  70.                         }

  71.                         if ( gl_dither.value )
  72.                         {
  73.                                 for ( j = 0; j < 256 * 256 * 4; j++ )
  74.                                 {
  75.                                         buffer[j] |= (buffer[j] >> 6);
  76.                                         buffer[j] = texgammatable[buffer[j]];
  77.                                 }
  78.                         }

  79.                         if ( !gSkyTexNumber )
  80.                                 gSkyTexNumber = GL_GenTexture();

  81.                         GL_Bind (gSkyTexNumber);
  82.                         VideoMode_GetCurrentVideoMode( &w, &h, &bpp );
  83.                         qglTexImage2D (GL_TEXTURE_2D, 0, bpp == 32 ? GL_RGBA8 : GL_RGB5_A1, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
  84.                 }

  85.                 qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  86.                 qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

  87.                 if ( !printed )
  88.                 {
  89.                         Con_DPrintf( "SKY:  " );
  90.                         printed = true;
  91.                 }

  92.                 if ( loadedBMP )
  93.                 {
  94.                         Con_DPrintf( "%s%s - paletted, ", movevars.skyName, suf );
  95.                 }
  96.                 else
  97.                 {
  98.                         Con_DPrintf( "%s%s, ", movevars.skyName, suf );
  99.                 }
  100.         }

  101.         if ( printed )
  102.         {
  103.                 Con_DPrintf( "done\n" );
  104.         }

  105.         Mem_Free( buffer );
  106.         gLoadSky = false;
  107. }
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Comsenz Inc.  

GMT+8, 2026-10-26 07:03 , Processed in 0.205480 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表