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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? incremental.cpp

?? hl2 source code. Do not use it illegal.
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
	{
		unsigned short flCurValue = (unsigned short)pValues[i].m_Dot;

		if( i == 0 )
		{
			flLastValue = flCurValue;
			runLength = 1;
		}
		else if( flCurValue == flLastValue && runLength < 255 )
		{
			++runLength;
		}
		else
		{
			pBuf->PutUnsignedChar( runLength );
			EncodeCharOrShort( pBuf, flLastValue );

			flLastValue = flCurValue;
			runLength = 1;
		}
	}

	// Write the end..
	if( runLength )
	{
		pBuf->PutUnsignedChar( runLength );
		EncodeCharOrShort( pBuf, flLastValue );
	}
}

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

void MultiplyValues( CUtlVector<CLightValue> &values, float scale )
{
	for( int i=0; i < values.Count(); i++ )
		values[i].m_Dot *= scale;
}


void CIncremental::FinishFace(
	IncrementalLightID lightID,
	int iFace,
	int iThread )
{
	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];

		// Compress the data.
		MultiplyValues( pFace->m_LightValues, pLight->m_flMaxIntensity );
		
		pFace->m_CompressedData.SeekPut( CUtlBuffer::SEEK_HEAD, 0 );
		CompressLightData( 
			pFace->m_LightValues.Base(), 
			pFace->m_LightValues.Count(), 
			&pFace->m_CompressedData );

#if 0
	// test decompression
	CUtlVector<CLightValue> test;
	test.SetSize( 2048 );
	pFace->m_CompressedData.SeekGet( CUtlBuffer::SEEK_HEAD, 0 );
	DecompressLightData( &pFace->m_CompressedData, &test );
#endif

		if( pFace->m_CompressedData.TellPut() == 0 )
		{
			// No contribution.. delete this face from the light.
			EnterCriticalSection( &pLight->m_CS );
				pLight->m_LightFaces.Remove( pFace->m_LightFacesIndex );
				delete pFace;
			LeaveCriticalSection( &pLight->m_CS );
		}
		else
		{
			// Discard the uncompressed data.
			pFace->m_LightValues.Purge();
			m_FacesTouched[ pFace->m_FaceIndex ] = 1;
		}
	}
}


bool CIncremental::Finalize()
{
	// If we're not being used, don't do anything.
	if( !m_pIncrementalFilename || !m_pBSPFilename )
		return false;

	CUtlVector<CFaceLightList> faceLights;
	LinkLightsToFaces( faceLights );
	
	Vector faceLight[(MAX_LIGHTMAP_DIM_WITHOUT_BORDER+2) * (MAX_LIGHTMAP_DIM_WITHOUT_BORDER+2)];
	CUtlVector<CLightValue> faceLightValues;
	faceLightValues.SetSize( (MAX_LIGHTMAP_DIM_WITHOUT_BORDER+2) * (MAX_LIGHTMAP_DIM_WITHOUT_BORDER+2) );

	// Only update the faces we've touched.
    for( int facenum = 0; facenum < numfaces; facenum++ )
    {
        if( !m_FacesTouched[facenum] || !faceLights[facenum].Count() )
			continue;

		int w = dfaces[facenum].m_LightmapTextureSizeInLuxels[0]+1;
		int h = dfaces[facenum].m_LightmapTextureSizeInLuxels[1]+1;
		int nLuxels = w * h;
		assert( nLuxels <= sizeof(faceLight) / sizeof(faceLight[0]) );

		// Clear the lighting for this face.
		memset( faceLight, 0, nLuxels * sizeof(Vector) );

		// Composite all the light contributions.
		for( int iFace=0; iFace < faceLights[facenum].Count(); iFace++ )
		{
			CLightFace *pFace = faceLights[facenum][iFace];
		
			pFace->m_CompressedData.SeekGet( CUtlBuffer::SEEK_HEAD, 0 );
			DecompressLightData( &pFace->m_CompressedData, &faceLightValues );

			for( int iSample=0; iSample < nLuxels; iSample++ )
			{
				float flDot = faceLightValues[iSample].m_Dot;
				if( flDot )
				{
					VectorMA( 
						faceLight[iSample], 
						flDot / pFace->m_pLight->m_flMaxIntensity,
						pFace->m_pLight->m_Light.intensity, 
						faceLight[iSample] );
				}
			}
		}

		// Convert to the floating-point representation in the BSP file.
		Vector *pSrc = faceLight;
		unsigned char *pDest = &dlightdata[ dfaces[facenum].lightofs ];

		for( int iSample=0; iSample < nLuxels; iSample++ )
		{
			extern void Vec3toColorRGBExp32( Vector& v, colorRGBExp32 *c );
			Vec3toColorRGBExp32( *pSrc, ( colorRGBExp32 *)pDest );
			pDest += 4;
			pSrc++;
		}
	}
	
	m_bSuccessfulRun = true;
	return true;
}


void CIncremental::GetFacesTouched( CUtlVector<unsigned char> &touched )
{
	touched.CopyArray( m_FacesTouched.Base(), m_FacesTouched.Count() );
}


bool CIncremental::Serialize()
{
	if( !SaveIncrementalFile() )
		return false;

	WriteBSPFile( (char*)m_pBSPFilename );
	return true;
}


void CIncremental::Term()
{
	m_Lights.PurgeAndDeleteElements();
	m_TotalMemory = 0;
}


void CIncremental::AddLightsForActiveLights()
{
	// Create our lights.
	for( directlight_t *dl=activelights; dl != NULL; dl = dl->next )
	{
		CIncLight *pLight = new CIncLight;
		dl->m_IncrementalID = m_Lights.AddToTail( pLight );

		// Copy the light information.
		pLight->m_Light = dl->light;
		pLight->m_flMaxIntensity = max( dl->light.intensity[0], max( dl->light.intensity[1], dl->light.intensity[2] ) );
	}
}


bool CIncremental::LoadIncrementalFile()
{
	Term();

	if( !IsIncrementalFileValid() )
		return false;

	long fp = FileOpen( m_pIncrementalFilename, true );
	if( !fp )
		return false;

	// Read the header.
	CIncrementalHeader hdr;
	if( !ReadIncrementalHeader( fp, &hdr ) )
	{
		FileClose( fp );
		return false;
	}


	// Read the lights.
	int nLights;
	FileRead( fp, nLights );
	for( int iLight=0; iLight < nLights; iLight++ )
	{
		CIncLight *pLight = new CIncLight;
		m_Lights.AddToTail( pLight );

		FileRead( fp, pLight->m_Light );
		pLight->m_flMaxIntensity = 
			max( pLight->m_Light.intensity.x, 
				max( pLight->m_Light.intensity.y, pLight->m_Light.intensity.z ) );

		int nFaces;
		FileRead( fp, nFaces );
		assert( nFaces < 70000 );

		for( int iFace=0; iFace < nFaces; iFace++ )
		{
			CLightFace *pFace = new CLightFace;
			pLight->m_LightFaces.AddToTail( pFace );

			pFace->m_pLight = pLight;
			FileRead( fp, pFace->m_FaceIndex );

			int dataSize;
			FileRead( fp, dataSize );

			pFace->m_CompressedData.SeekPut( CUtlBuffer::SEEK_HEAD, 0 );
			while( dataSize )
			{
				--dataSize;
				
				unsigned char ucData;
				FileRead( fp, ucData );

				pFace->m_CompressedData.PutUnsignedChar( ucData );
			}
		}
	}

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


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

	if( !WriteIncrementalHeader( fp ) )
	{
		FileClose( fp );
		return false;
	}

	// Write the lights.
	int nLights = m_Lights.Count();
	FileWrite( fp, nLights );
	for( int iLight=m_Lights.Head(); iLight != m_Lights.InvalidIndex(); iLight = m_Lights.Next( iLight ) )
	{
		CIncLight *pLight = m_Lights[iLight];
		
		FileWrite( fp, pLight->m_Light );

		int nFaces = pLight->m_LightFaces.Count();
		FileWrite( fp, nFaces );
		for( int iFace=pLight->m_LightFaces.Head(); iFace != pLight->m_LightFaces.InvalidIndex(); iFace = pLight->m_LightFaces.Next( iFace ) )
		{
			CLightFace *pFace = pLight->m_LightFaces[iFace];

			FileWrite( fp, pFace->m_FaceIndex );
			
			int dataSize = pFace->m_CompressedData.TellPut();
			FileWrite( fp, dataSize );

			pFace->m_CompressedData.SeekGet( CUtlBuffer::SEEK_HEAD, 0 );
			while( dataSize )
			{
				--dataSize;
				FileWrite( fp, pFace->m_CompressedData.GetUnsignedChar() );
			}
		}
	}


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


void CIncremental::LinkLightsToFaces( CUtlVector<CFaceLightList> &faceLights )
{
	faceLights.SetSize( numfaces );
	
	for( int iLight=m_Lights.Head(); iLight != m_Lights.InvalidIndex(); iLight = m_Lights.Next( iLight ) )
	{
		CIncLight *pLight = m_Lights[iLight];

		for( int iFace=pLight->m_LightFaces.Head(); iFace != pLight->m_LightFaces.InvalidIndex(); iFace = pLight->m_LightFaces.Next( iFace ) )
		{
			CLightFace *pFace = pLight->m_LightFaces[iFace];

			if( m_FacesTouched[pFace->m_FaceIndex] )
				faceLights[ pFace->m_FaceIndex ].AddToTail( pFace );
		}
	}
}


// ------------------------------------------------------------------ //
// CIncLight
// ------------------------------------------------------------------ //

CIncLight::CIncLight()
{
	memset( m_pCachedFaces, 0, sizeof(m_pCachedFaces) );
	InitializeCriticalSection( &m_CS );
}


CIncLight::~CIncLight()
{
	m_LightFaces.PurgeAndDeleteElements();
	DeleteCriticalSection( &m_CS );
}


CLightFace* CIncLight::FindOrCreateLightFace( int iFace, int lmSize, bool *bNew )
{
	if( bNew )
		*bNew = false;


	// Look for it.
	for( int i=m_LightFaces.Head(); i != m_LightFaces.InvalidIndex(); i=m_LightFaces.Next(i) )
	{
		CLightFace *pFace = m_LightFaces[i];

		if( pFace->m_FaceIndex == iFace )
		{
			assert( pFace->m_LightValues.Count() == lmSize );
			return pFace;
		}
	}

	// Ok, create one.
	CLightFace *pFace = new CLightFace;
	pFace->m_LightFacesIndex = m_LightFaces.AddToTail( pFace );
	pFace->m_pLight = this;
	
	pFace->m_FaceIndex = iFace;
	pFace->m_LightValues.SetSize( lmSize );
	memset( pFace->m_LightValues.Base(), 0, sizeof( CLightValue ) * lmSize );

	if( bNew )
		*bNew = true;

	return pFace;
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品久久99| 成人激情午夜影院| 一区二区三区在线免费观看| 久久久久久久综合| 日韩精品中文字幕一区| 日韩午夜在线影院| 欧美一区二视频| 欧美大片在线观看一区二区| 制服丝袜激情欧洲亚洲| 日韩欧美亚洲国产精品字幕久久久 | 91精品国产综合久久精品麻豆 | 午夜国产精品一区| 亚洲一区欧美一区| 午夜不卡av在线| 日韩高清不卡一区二区三区| 免费在线欧美视频| 韩国成人精品a∨在线观看| 精品中文字幕一区二区小辣椒| 免费人成在线不卡| 国产精品1024| 99视频在线观看一区三区| 日本道免费精品一区二区三区| 91传媒视频在线播放| 欧美绝品在线观看成人午夜影视| 欧美丰满一区二区免费视频| 精品国产电影一区二区| 国产精品美女久久久久久久| 亚洲自拍都市欧美小说| 日韩电影一区二区三区四区| 国内成人精品2018免费看| 成人免费视频一区| 欧美高清dvd| 日本一区二区免费在线| 亚洲无线码一区二区三区| 麻豆国产欧美日韩综合精品二区 | 日韩免费在线观看| 国产精品乱人伦| 亚洲大片在线观看| 国产精品99久| 91精品国产综合久久国产大片 | 亚洲精品国产一区二区精华液| 偷拍一区二区三区| 成人午夜视频在线| 日韩欧美中文字幕制服| 亚洲欧洲日韩av| 韩国精品一区二区| 欧美色涩在线第一页| 国产欧美综合色| 日韩综合在线视频| 色国产综合视频| 国产日本一区二区| 精品影视av免费| 欧美日韩精品一区二区| 一区二区三区在线视频免费观看| 日本不卡一区二区| 一本色道a无线码一区v| 久久色视频免费观看| 日韩激情一区二区| 91小视频免费观看| 中文字幕av资源一区| 韩国v欧美v亚洲v日本v| 欧美精品色一区二区三区| 综合中文字幕亚洲| 成人妖精视频yjsp地址| 久久色在线观看| 久久精品国产一区二区三区免费看| 欧美色图在线观看| 亚洲欧美偷拍另类a∨色屁股| 国产成人自拍网| 亚洲精品在线观看视频| 黄网站免费久久| 精品久久国产老人久久综合| 美女mm1313爽爽久久久蜜臀| 91.xcao| 久久精品国产亚洲aⅴ| 在线不卡中文字幕播放| 日韩国产欧美在线视频| 精品成人免费观看| 国产在线国偷精品产拍免费yy| 6080国产精品一区二区| 午夜精品成人在线视频| 欧美日韩一区不卡| 日本成人在线一区| 日韩午夜在线观看| 极品少妇xxxx精品少妇偷拍| 日韩欧美亚洲国产另类| 狠狠狠色丁香婷婷综合激情| 久久亚洲影视婷婷| 成人在线视频一区二区| 国产精品免费网站在线观看| 91日韩在线专区| 亚洲在线中文字幕| 欧美一区二区人人喊爽| 美女爽到高潮91| 久久精品亚洲精品国产欧美kt∨| 国产乱码精品一区二区三区忘忧草 | 99精品国产一区二区三区不卡| 国产精品盗摄一区二区三区| 日本久久一区二区| 日韩精彩视频在线观看| 精品国精品自拍自在线| 成人午夜在线免费| 亚洲一区影音先锋| 久久奇米777| 色偷偷久久人人79超碰人人澡| 婷婷综合五月天| 国产亚洲婷婷免费| 欧美性生活一区| 国产中文一区二区三区| 亚洲色图另类专区| 日韩一区国产二区欧美三区| 丰满岳乱妇一区二区三区| 亚洲欧美视频一区| 欧美成人猛片aaaaaaa| 99久久国产综合精品色伊| 亚洲va韩国va欧美va| 一区二区三区中文字幕精品精品 | 久久免费看少妇高潮| 99精品欧美一区| 久久99精品久久只有精品| 亚洲女女做受ⅹxx高潮| 欧美成人三级电影在线| 91黄色免费观看| 国产九色精品成人porny | 日韩一区二区免费高清| 99久久99久久综合| 免费观看在线综合| 一区二区在线观看av| 国产欧美一区二区精品秋霞影院| 欧美在线小视频| 99久久精品免费看国产| 久久精品av麻豆的观看方式| 亚洲成av人片一区二区三区| 国产精品视频观看| 久久精品视频网| 日韩一级大片在线| 欧美日本视频在线| 在线视频国内一区二区| 不卡视频在线观看| 国产一区二区三区电影在线观看 | 亚洲美腿欧美偷拍| 久久亚洲综合色一区二区三区| 欧美高清视频www夜色资源网| 色综合久久久久| av在线一区二区三区| 粉嫩蜜臀av国产精品网站| 国产又粗又猛又爽又黄91精品| 蜜臀久久99精品久久久久久9| 亚洲成人激情av| 亚洲成人资源网| 午夜精品在线看| 香蕉影视欧美成人| 日韩福利视频导航| 午夜不卡av在线| 亚洲6080在线| 日本午夜精品视频在线观看 | 亚洲精品中文字幕在线观看| 国产精品国产三级国产aⅴ入口| 日本一区二区在线不卡| 日本一区二区电影| 国产精品亲子伦对白| 国产精品美女一区二区| 亚洲少妇中出一区| 亚洲一区在线看| 日韩精品成人一区二区三区| 免费三级欧美电影| 国产激情一区二区三区四区 | 洋洋av久久久久久久一区| 激情综合色播五月| 精品亚洲免费视频| 国产不卡在线视频| 91视频在线看| 6080yy午夜一二三区久久| 日韩午夜激情免费电影| 国产亚洲欧美一区在线观看| 国产精品毛片无遮挡高清| 亚洲在线中文字幕| 久久国产生活片100| 高潮精品一区videoshd| 91浏览器入口在线观看| 91麻豆精品91久久久久久清纯| 欧美tk—视频vk| 亚洲视频精选在线| 视频一区免费在线观看| 国模大尺度一区二区三区| 97精品久久久久中文字幕| 欧美日韩亚洲综合在线| 精品91自产拍在线观看一区| 国产精品第五页| 久久国产福利国产秒拍| 波多野结衣一区二区三区| 69堂国产成人免费视频| 国产日韩av一区| 日本系列欧美系列| 99久久精品国产麻豆演员表| 欧美大白屁股肥臀xxxxxx| 亚洲精品日产精品乱码不卡| 国产综合久久久久久鬼色| 欧美午夜影院一区| 日本一区二区三区四区|