亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? incremental.cpp

?? hl2 source code. Do not use it illegal.
?? CPP
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
#include "incremental.h"
#include "lightmap.h"



static bool g_bFileError = false;


// -------------------------------------------------------------------------------- //
// Static helpers.
// -------------------------------------------------------------------------------- //

static bool CompareLights( dworldlight_t *a, dworldlight_t *b )
{
	static float flEpsilon = 1e-7;

	bool a1  = VectorsAreEqual( a->origin,    b->origin,    flEpsilon );
	bool a2  = VectorsAreEqual( a->intensity, b->intensity, 1.1f ); // intensities are huge numbers
	bool a3  = VectorsAreEqual( a->normal,    b->normal,    flEpsilon );
	bool a4  = fabs( a->constant_attn - b->constant_attn ) < flEpsilon;
	bool a5  = fabs( a->linear_attn - b->linear_attn ) < flEpsilon;
	bool a6  = fabs( a->quadratic_attn - b->quadratic_attn ) < flEpsilon;
	bool a7  = fabs( float( a->flags - b->flags ) ) < flEpsilon;
	bool a8  = fabs( a->stopdot - b->stopdot ) < flEpsilon;
	bool a9  = fabs( a->stopdot2 - b->stopdot2 ) < flEpsilon;
	bool a10 = fabs( a->exponent - b->exponent ) < flEpsilon;
	bool a11 = fabs( a->radius - b->radius ) < flEpsilon;

	return a1 && a2 && a3 && a4 && a5 && a6 && a7 && a8 && a9 && a10 && a11;
}


long FileOpen( char const *pFilename, bool bRead )
{
	g_bFileError = false;
	return (long)g_pFileSystem->Open( pFilename, bRead ? "rb" : "wb" );
}


void FileClose( long fp )
{
	if( fp )
		g_pFileSystem->Close( (FILE*)fp );
}


// Returns true if there was an error reading from the file.
bool FileError()
{
	return g_bFileError;
}

static inline void FileRead( long fp, void *pOut, int size )
{
	if( g_bFileError || g_pFileSystem->Read( pOut, size, (FileHandle_t)fp ) != size )
	{
		g_bFileError = true;
		memset( pOut, 0, size );
	}
}


template<class T>
static inline void FileRead( long fp, T &out )
{
	FileRead( fp, &out, sizeof(out) );
}


static inline void FileWrite( long fp, void const *pData, int size )
{
	if( g_bFileError || g_pFileSystem->Write( pData, size, (FileHandle_t)fp ) != size )
	{
		g_bFileError = true;
	}
}


template<class T>
static inline void FileWrite( long fp, T out )
{
	FileWrite( fp, &out, sizeof(out) );
}


IIncremental* GetIncremental()
{
	static CIncremental inc;
	return &inc;
}


// -------------------------------------------------------------------------------- //
// CIncremental.
// -------------------------------------------------------------------------------- //

CIncremental::CIncremental()
{
	m_TotalMemory = 0;
	m_pIncrementalFilename = NULL;
	m_pBSPFilename = NULL;
	m_bSuccessfulRun = false;
}


CIncremental::~CIncremental()
{
}


bool CIncremental::Init( char const *pBSPFilename, char const *pIncrementalFilename )
{
	m_pBSPFilename = pBSPFilename;
	m_pIncrementalFilename = pIncrementalFilename;
	return true;
}


bool CIncremental::PrepareForLighting()
{
	if( !m_pBSPFilename )
		return false;

	// Clear the touched faces list.
	m_FacesTouched.SetSize( numfaces );
	memset( m_FacesTouched.Base(), 0, numfaces );

	// If we haven't done a complete successful run yet, then we either haven't
	// loaded the lights, or a run was aborted and our lights are half-done so we
	// should reload them.
	if( !m_bSuccessfulRun )
		LoadIncrementalFile();

	// unmatched = a list of the lights we have
	CUtlLinkedList<int,int> unmatched;
	for( int i=m_Lights.Head(); i != m_Lights.InvalidIndex(); i = m_Lights.Next(i) )
		unmatched.AddToTail( i );

	// Match the light lists and get rid of lights that we already have all the data for.
	directlight_t *pNext;
	directlight_t **pPrev = &activelights;
	for( directlight_t *dl=activelights; dl != NULL; dl = pNext )
	{
		pNext = dl->next;

		//float flClosest = 3000000000;
		//CIncLight *pClosest = 0;

		// Look for this light in our light list.
		int iNextUnmatched, iUnmatched;
		for( iUnmatched=unmatched.Head(); iUnmatched != unmatched.InvalidIndex(); iUnmatched = iNextUnmatched )
		{
			iNextUnmatched = unmatched.Next( iUnmatched );

			CIncLight *pLight = m_Lights[ unmatched[iUnmatched] ];

			//float flTest = (pLight->m_Light.origin - dl->light.origin).Length();
			//if( flTest < flClosest )
			//{
			//	flClosest = flTest;
			//	pClosest = pLight;
			//}

			if( CompareLights( &dl->light, &pLight->m_Light ) )
			{
				unmatched.Remove( iUnmatched );

				// Ok, we have this light's data already, yay!
				// Get rid of it from the active light list.
				*pPrev = dl->next;
				free( dl );
				dl = 0;
				break;
			}
		}

		//bool bTest=false;
		//if(bTest)
		//	CompareLights( &dl->light, &pClosest->m_Light );

		if( iUnmatched == unmatched.InvalidIndex() )
			pPrev = &dl->next;
	}

	// Remove any of our lights that were unmatched.
	for( int iUnmatched=unmatched.Head(); iUnmatched != unmatched.InvalidIndex(); iUnmatched = unmatched.Next( iUnmatched ) )
	{
		CIncLight *pLight = m_Lights[ unmatched[iUnmatched] ];
		
		// First tag faces that it touched so they get recomposited.
		for( unsigned short iFace=pLight->m_LightFaces.Head(); iFace != pLight->m_LightFaces.InvalidIndex(); iFace = pLight->m_LightFaces.Next( iFace ) )
		{
			m_FacesTouched[ pLight->m_LightFaces[iFace]->m_FaceIndex ] = 1;
		}
		
		delete pLight;
		m_Lights.Remove( unmatched[iUnmatched] );
	}

	// Now add a light structure for each new light.
	AddLightsForActiveLights();
	
	return true;
}


bool CIncremental::ReadIncrementalHeader( long fp, CIncrementalHeader *pHeader )
{
	int version;
	FileRead( fp, version );
	if( version != INCREMENTALFILE_VERSION )
		return false;

	int nFaces;
	FileRead( fp, nFaces );

	pHeader->m_FaceLightmapSizes.SetSize( nFaces );
	FileRead( fp, pHeader->m_FaceLightmapSizes.Base(), sizeof(CIncrementalHeader::CLMSize) * nFaces );

	return !FileError();
}


bool CIncremental::WriteIncrementalHeader( long fp )
{
	int version = INCREMENTALFILE_VERSION;
	FileWrite( fp, version );

	int nFaces = numfaces;
	FileWrite( fp, nFaces );

	CIncrementalHeader hdr;
	hdr.m_FaceLightmapSizes.SetSize( nFaces );

	for( int i=0; i < nFaces; i++ )
	{
		hdr.m_FaceLightmapSizes[i].m_Width = dfaces[i].m_LightmapTextureSizeInLuxels[0];
		hdr.m_FaceLightmapSizes[i].m_Height = dfaces[i].m_LightmapTextureSizeInLuxels[1];
	}

	FileWrite( fp, hdr.m_FaceLightmapSizes.Base(), sizeof(CIncrementalHeader::CLMSize) * nFaces );
	
	return !FileError();
}


bool CIncremental::IsIncrementalFileValid()
{
	long fp = FileOpen( m_pIncrementalFilename, true );
	if( !fp )
		return false;

	bool bValid = false;
	CIncrementalHeader hdr;
	if( ReadIncrementalHeader( fp, &hdr ) )
	{
		// If the number of faces is the same and their lightmap sizes are the same,
		// then this file is considered a legitimate incremental file.
		if( hdr.m_FaceLightmapSizes.Count() == numfaces )
		{
			int i;
			for( i=0; i < numfaces; i++ )
			{
				if( hdr.m_FaceLightmapSizes[i].m_Width  != dfaces[i].m_LightmapTextureSizeInLuxels[0] ||							
					hdr.m_FaceLightmapSizes[i].m_Height != dfaces[i].m_LightmapTextureSizeInLuxels[1] )
				{
					break;
				}
			}

			// Were all faces valid?
			if( i == numfaces )
				bValid = true;
		}
	}

	FileClose( fp );
	return bValid && !FileError();
}


void CIncremental::AddLightToFace( 
	IncrementalLightID lightID, 
	int iFace, 
	int iSample,
	int lmSize,
	float dot,
	int iThread )
{
	// If we're not being used, don't do anything.
	if( !m_pIncrementalFilename )
		return;

	CIncLight *pLight = m_Lights[lightID];

	// Check for the 99.99% case in which the face already exists.
	CLightFace *pFace;
	if( pLight->m_pCachedFaces[iThread] && pLight->m_pCachedFaces[iThread]->m_FaceIndex == iFace )
	{
		pFace = pLight->m_pCachedFaces[iThread];
	}
	else
	{
		bool bNew;
		
		EnterCriticalSection( &pLight->m_CS );
			pFace = pLight->FindOrCreateLightFace( iFace, lmSize, &bNew );
		LeaveCriticalSection( &pLight->m_CS );

		pLight->m_pCachedFaces[iThread] = pFace;

		if( bNew )
			m_TotalMemory += pFace->m_LightValues.Count() * sizeof( pFace->m_LightValues[0] );
	}

	// Add this into the light's data.
	pFace->m_LightValues[iSample].m_Dot = dot;
}


unsigned short DecodeCharOrShort( CUtlBuffer *pIn )
{
	unsigned short val = pIn->GetUnsignedChar();
	if( val & 0x80 )
	{
		val = ((val & 0x7F) << 8) | pIn->GetUnsignedChar();
	}

	return val;
}


void EncodeCharOrShort( CUtlBuffer *pBuf, unsigned short val )
{
	if( (val & 0xFF80) == 0 )
	{
		pBuf->PutUnsignedChar( (unsigned char)val );
	}
	else
	{
		if( val > 32767 )
			val = 32767;

		pBuf->PutUnsignedChar( (val >> 8) | 0x80 );
		pBuf->PutUnsignedChar( val & 0xFF );
	}
}


void DecompressLightData( CUtlBuffer *pIn, CUtlVector<CLightValue> *pOut )
{
	int iOut = 0;
	while( pIn->TellGet() < pIn->TellPut() )
	{
		unsigned char runLength = pIn->GetUnsignedChar();
		unsigned short usVal = DecodeCharOrShort( pIn );

		while( runLength > 0 )
		{
			--runLength;

			pOut->Element(iOut).m_Dot = usVal;
			++iOut;
		}
	}
}

#ifdef _WIN32
#pragma warning (disable:4701)
#endif

void CompressLightData( 
	CLightValue const *pValues, 
	int nValues, 
	CUtlBuffer *pBuf )
{
	unsigned char runLength=0;
	unsigned short flLastValue;

	for( int i=0; i < nValues; i++ )

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
www.亚洲精品| 欧美日韩一区二区三区在线| 亚洲欧美乱综合| 欧美精品一级二级三级| 国产精品夜夜嗨| 亚洲第一久久影院| 国产女主播在线一区二区| 欧美性受极品xxxx喷水| 国产精品影音先锋| 日韩电影在线免费观看| 中文字幕字幕中文在线中不卡视频| 7777精品伊人久久久大香线蕉超级流畅 | 色综合久久综合网97色综合| 日韩精品一二三| 国产精品久久久久天堂| 欧美成人精品高清在线播放| 欧美三级韩国三级日本一级| 欧美mv日韩mv国产| 91蝌蚪porny九色| 国产精品亚洲午夜一区二区三区 | 欧美一区二区福利视频| 91福利社在线观看| 成人免费视频免费观看| 狠狠色综合色综合网络| 视频一区二区中文字幕| 亚洲精品国久久99热| 国产精品拍天天在线| 久久综合久久综合久久综合| 欧美一区二区视频在线观看2020| 色婷婷亚洲一区二区三区| 成人高清免费观看| 国产美女主播视频一区| 精品在线一区二区三区| 午夜视黄欧洲亚洲| 亚洲一区二区成人在线观看| 亚洲精品欧美专区| 亚洲伦在线观看| 亚洲欧美日韩一区二区三区在线观看| 日本一区二区视频在线观看| 久久香蕉国产线看观看99| 欧美不卡激情三级在线观看| 欧美一区二区国产| 亚洲一区二区三区四区不卡| 亚洲欧洲av在线| 中文字幕一区在线观看视频| 国产精品―色哟哟| 国产精品久久久久aaaa樱花 | 亚洲国产精品天堂| 亚洲成人你懂的| 亚洲成人先锋电影| 日产欧产美韩系列久久99| 日韩中文欧美在线| 免费在线一区观看| 黑人巨大精品欧美一区| 国产精品综合在线视频| 国产一区二区三区最好精华液| 国产尤物一区二区在线| 国产成人在线视频网址| 99久久综合色| 一本大道久久a久久综合| 欧美色爱综合网| 91精品国模一区二区三区| 日韩欧美一区二区视频| 一本色道亚洲精品aⅴ| 亚洲欧洲精品天堂一级| 亚洲免费观看高清完整| 午夜影院久久久| 麻豆国产欧美日韩综合精品二区| 毛片av一区二区| 国产麻豆精品在线观看| 99re这里都是精品| 欧美理论电影在线| 成人av电影在线网| 欧美午夜在线一二页| 91久久免费观看| 欧美日韩精品电影| 久久视频一区二区| 亚洲免费观看高清| 日韩不卡一区二区| 国产成人免费视频网站| 色婷婷一区二区| 日韩欧美国产一区在线观看| 国产日产欧美一区二区三区| 亚洲精品日产精品乱码不卡| 蜜臀av性久久久久蜜臀aⅴ流畅| 激情综合色播激情啊| 91视频在线观看免费| 欧美一区二区三区视频在线观看| 国产亚洲一区二区在线观看| 一二三区精品视频| 国内精品久久久久影院一蜜桃| av在线这里只有精品| 在线不卡的av| 国产精品黄色在线观看| 奇米影视7777精品一区二区| 成人免费av网站| 91精品国产综合久久国产大片| 日本一区二区三区四区在线视频| 亚洲综合丁香婷婷六月香| 蜜桃精品视频在线观看| 91老司机福利 在线| 337p粉嫩大胆噜噜噜噜噜91av| 一区二区三区美女| 成人伦理片在线| 欧美一区二区三区在线观看视频| 国产精品福利电影一区二区三区四区 | 51午夜精品国产| 1024成人网| 国产乱一区二区| 337p亚洲精品色噜噜狠狠| 综合在线观看色| 国产最新精品免费| 欧美日韩精品一区二区天天拍小说| 国产欧美日韩一区二区三区在线观看| 婷婷久久综合九色国产成人 | 亚洲一区二区五区| 成人午夜av影视| 精品99999| 日本在线不卡视频一二三区| 色综合av在线| 国产精品欧美久久久久无广告| 欧美在线观看一区二区| 日韩理论电影院| 国产精品一区二区三区网站| 91精品国产欧美日韩| 夜夜嗨av一区二区三区网页 | 高清shemale亚洲人妖| 日韩欧美一二三| 蜜桃视频免费观看一区| 欧美日韩国产高清一区| 亚洲国产wwwccc36天堂| 日本韩国一区二区三区视频| 国产精品水嫩水嫩| 粉嫩13p一区二区三区| 久久午夜免费电影| 激情亚洲综合在线| 精品电影一区二区三区| 激情图区综合网| 日韩色视频在线观看| 日韩精品亚洲一区| 日韩亚洲欧美在线| 日本成人在线电影网| 欧美精选一区二区| 喷白浆一区二区| 日韩三级在线观看| 精彩视频一区二区三区| 亚洲精品一区二区三区精华液| 九九视频精品免费| 亚洲精品一区二区三区蜜桃下载 | 国产成人小视频| 国产欧美精品在线观看| 成人av在线播放网址| 自拍偷拍亚洲欧美日韩| 91看片淫黄大片一级在线观看| 一区二区三区四区精品在线视频| 亚洲三级小视频| 91老师片黄在线观看| 亚洲高清久久久| 91精品国产色综合久久不卡电影 | 一区二区三区免费观看| 欧美系列在线观看| 日韩专区中文字幕一区二区| 日韩午夜激情av| 国产精品2024| 亚洲欧美一区二区久久| 欧美日韩一卡二卡三卡 | 成人av免费在线| 亚洲黄一区二区三区| 7777精品伊人久久久大香线蕉经典版下载| 日韩在线一区二区| 久久亚洲一区二区三区四区| 成人精品国产免费网站| 一片黄亚洲嫩模| 日韩一区二区视频在线观看| 国产精品69毛片高清亚洲| 亚洲免费在线观看| 日韩亚洲欧美在线观看| 成人免费毛片嘿嘿连载视频| 亚洲国产欧美另类丝袜| 久久免费午夜影院| 99免费精品视频| 蜜臀av亚洲一区中文字幕| 极品少妇一区二区三区精品视频 | 亚洲综合清纯丝袜自拍| 日韩一级高清毛片| 99综合影院在线| 蜜桃传媒麻豆第一区在线观看| 国产三级三级三级精品8ⅰ区| 色av一区二区| 国产最新精品免费| 亚洲在线观看免费| 久久精品亚洲国产奇米99| 欧美丝袜自拍制服另类| 国产专区欧美精品| 亚洲动漫第一页| 日本一区二区三区久久久久久久久不| 91福利在线导航| 成人性生交大片免费看在线播放| 亚洲777理论| 亚洲同性同志一二三专区|