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

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

?? ch3rendr.cpp

?? Windows上的MUD客戶端程序
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
/*----------------------------------------------------------------------------
                        _                              _ _       
        /\             | |                            | (_)      
       /  \   _ __   __| |_ __ ___  _ __ ___   ___  __| |_  __ _ 
      / /\ \ | '_ \ / _` | '__/ _ \| '_ ` _ \ / _ \/ _` | |/ _` |
     / ____ \| | | | (_| | | | (_) | | | | | |  __/ (_| | | (_| |
    /_/    \_\_| |_|\__,_|_|  \___/|_| |_| |_|\___|\__,_|_|\__,_|

    The contents of this file are subject to the Andromedia Public
	License Version 1.0 (the "License"); you may not use this file
	except in compliance with the License. You may obtain a copy of
	the License at http://www.andromedia.com/APL/

    Software distributed under the License is distributed on an
	"AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
	implied. See the License for the specific language governing
	rights and limitations under the License.

    The Original Code is Pueblo client code, released November 4, 1998.

    The Initial Developer of the Original Code is Andromedia Incorporated.
	Portions created by Andromedia are Copyright (C) 1998 Andromedia
	Incorporated.  All Rights Reserved.

	Andromedia Incorporated                         415.365.6700
	818 Mission Street - 2nd Floor                  415.365.6701 fax
	San Francisco, CA 94103

    Contributor(s):
	--------------------------------------------------------------------------
	   Chaco team:  Dan Greening, Glenn Crocker, Jim Doubek,
	                Coyote Lussier, Pritham Shetty.

					Wrote and designed original codebase.

------------------------------------------------------------------------------

	Implementation for the ChRenderContext class for  Intel 3DR.

----------------------------------------------------------------------------*/

// $Header: /home/cvs/chaco/modules/client/msw/ChGraphx/Ch3Rendr.cpp,v 2.109 1996/09/26 02:06:59 pritham Exp $

#include "grheader.h"

#include <QvInfo.h>
#include <QvState.h>
#include "ChMaze.h"
#include "ChRenderData.h"
#include "ChMazDep.h"
#include "CvConvrt.h"
#include "CvTrnsfm.h"
#include "CvNormal.h"
#include "CvInstnc.h"
#include "CvTextur.h"
#include "CvType.h"
#include "CvHitTst.h"
#include "CvMaterl.h"
#include "ChSphere.h"
#include "ChRLImg.h"
#include <ChSFImage.h>
#include "ChCollision.h"

#if defined(CH_USE_D3D)
#include <d3d.h>
#endif

#include <malloc.h>
#if defined(WIN32)
#include <sys/timeb.h>
#endif

#include <ChCore.h>
#include <ChUtil.h>

// Even if we render purely retained, we need this if we use RL
#if (defined(CH_USE_RLAB))
#include "imode.h"
#endif

// Use our debugging allocator - caution do not use for production
// it's too slow and probably won't work for 2 dlls
//#define USE_OUR_RL_ALLOC	1
#define new DEBUG_NEW


#if (defined(CH_USE_RLAB))

const ChNrRenderQuality stdQuality = RenderGouraud ; // 	 // 	RLRenderPhong  
//const ChNrColorModel stdColorModel = RLColourRGB; //   RLColourRamp		
const ChNrColorModel stdColorModel = RLColourRamp; //   RLColourRGB	
	
#if defined(_DEBUG) && defined(USE_OUR_RL_ALLOC)
void* ChRLAlloc(size_t);           
void* ChRLRealloc(void*, size_t);   
void ChRLFree(void*);               

#endif // defined(_DEBUG) && defined(USE_OUR_RL_ALLOC)

#elif defined(CH_USE_D3D)

const ChNrRenderQuality stdQuality = RenderGouraud | D3DRMLIGHT_ON |  D3DRMFILL_SOLID; // 	 // 	RLRenderPhong  
//const ChNrColorModel stdColorModel = RLColourRGB; //   RLColourRamp		
//const ChNrColorModel stdColorModel = RLColourRamp; //   RLColourRGB		
#endif



class ChCameraEntry
{
	protected:
		string m_name;
		QvNode *m_pCamera;
		ChGraphicPageID m_page;

	public:
		ChCameraEntry(string name, QvNode *pCamera, ChGraphicPageID page) :
			m_name(name), m_pCamera(pCamera), m_page(page) {};

		string &GetName() {return m_name;};
		QvNode *GetCamera(){ return m_pCamera;};
};


ChRenderContext::ChRenderContext() : 
				#if defined(CH_USE_3DR)
				m_hGC(0), 
				m_numLightsOn(0),
				#else
				m_pStack(0),
				m_sceneFrame(0),
				m_cameraFrame(0),
				m_headlightFrame(0),
				m_viewport(0), 
				m_boolContinueConstruction( true ),
				m_pCollisionSensor(0),
				m_maxTransparency(false),
				m_pBackgroundTexture(0),
				m_pBackGroundNode(0),
				m_backgroundFrame(0),
				#endif
				#if defined(CH_USE_D3D)
				m_DD(0),
				m_D3D(0),
				m_D3DRM(0),
				m_DDClipper(0),
				#endif
				m_hRC(0), 
				m_hDC(0), 
				m_pWnd(0),
				m_userShading( defaultShading ), 
				m_pRootInstance(0),
				m_cameraCount(0),
				m_pCamera(0),
				m_pDefaultCamera(0),
				m_boolDirty(false),
				m_boolSettingsDirty(false),
				m_boolAnimating(false),
				m_ppDefaults(0),
				m_iShapeCount( 0 ),
				m_iFrameCount( 0 ),
				m_iTotalWork( 0 )

{
	for(int j=0; j<CH_MAX_SPHERE_LEVEL+1; j++)
	{
		m_pSpheres[j] = 0;
	}
	
	#if (defined(CH_USE_RLAB))

	#if defined(_DEBUG) && defined(USE_OUR_RL_ALLOC)
	RLSetAllocator(ChRLAlloc, ChRLRealloc, ChRLFree );
	#endif // defined(_DEBUG) && defined(USE_OUR_RL_ALLOC)
	#else
	m_boolThreaded = false;
	#endif

	m_boolThreaded = !!(ChUtil::GetSystemProperties() & CH_PROP_MULTITHREADED);
 
 	if(IsThreaded())
	{
		::InitializeCriticalSection(&m_sceneCriticalSection);
		::InitializeCriticalSection(&m_qvCriticalSection);
		::InitializeCriticalSection(&m_constructionCriticalSection);
		::InitializeCriticalSection(&m_reconstructionCriticalSection);
	
		// Reconstruction thread events	
		m_hReconstructEvents[reconstructInstance] = ::CreateEvent( 0, false, false, 0 );
		ASSERT( m_hReconstructEvents[reconstructInstance]  );

		m_hReconstructEvents[abortReconstruct] = ::CreateEvent( 0, false, false, 0 );
		ASSERT( m_hReconstructEvents[abortReconstruct] );

		m_hReconstructEvents[endThread] 		  = ::CreateEvent( 0, false, false, 0 );
		ASSERT( m_hReconstructEvents[endThread] );

		// Start the reconstruction thread
		CWinThread *pThread = ::AfxBeginThread(ReConstructInstanceThread, 
										(void*)this, THREAD_PRIORITY_BELOW_NORMAL ); 
		ASSERT( pThread );


		// end of construction event
		m_hConstructDoneEvent  = ::CreateEvent( 0, false, false, 0 );
		ASSERT( m_hConstructDoneEvent );
	}

}

#if defined(_DEBUG) && defined(USE_OUR_RL_ALLOC)
static int numRLAllocs = 0;
static int numRLBytes = 0;

void* ChRLAlloc(size_t size)
{

	numRLAllocs++;
	numRLBytes+=size;
	if(!(numRLAllocs % 100))
	{
		TRACE2("Number RL allocs: %d, bytes %d\n", numRLAllocs, numRLBytes);
	}
	char *bytes = new char[size+8];
	int *pSize = (int*)bytes;
	*pSize++ = 0xcacacaca;
	*pSize = size;
	return (bytes+8);
}
           
void* ChRLRealloc(void* ptr, size_t size)
{
	// Not optimal - just for debugging
	char *bytes = new char[size+8];
	int *pSize = (int*)bytes;
	*pSize++ = 0xcacacaca;
	*pSize = size;
	char *oldPtr = ((char*)ptr)-8;

	int *pTag = (int*)oldPtr;
	if(*pTag == 0xcacacaca)
	{
		if(bytes)
		{
			int oldSize = *(((int*)oldPtr)+1);
			memcpy(bytes + 8, oldPtr + 8, min(size_t(oldSize), size));
			numRLBytes+=size;
			numRLBytes-=oldSize;
		}
		delete [] oldPtr;
	}
	else
	{
		TRACE("Attempt to resize block that's not ours!\n");
	}
	return (bytes+8);
}

void ChRLFree(void* ptr)
{
	numRLAllocs--;

	char *oldPtr = ((char*)ptr)-8;
	int *pSize = (int*)oldPtr;
	int oldSize = pSize[1];
	if(*pSize == 0xcacacaca)
	{
		delete [] oldPtr;
		numRLBytes-=oldSize;
	}
}               

#endif // defined(_DEBUG) && defined(USE_OUR_RL_ALLOC)

ChRenderContext::~ChRenderContext()
{

	RemoveCameras();
	#if (defined(CH_USE_D3D) || defined(CH_USE_RLAB))
	// cleanup the synchronization objects
	if(IsThreaded())
	{
		::CloseHandle( m_hReconstructEvents[reconstructInstance] );
		::CloseHandle( m_hReconstructEvents[abortReconstruct] );
		::CloseHandle( m_hReconstructEvents[endThread] );

		::CloseHandle( m_hConstructDoneEvent);

		::DeleteCriticalSection(&m_sceneCriticalSection);
		::DeleteCriticalSection(&m_qvCriticalSection);
		::DeleteCriticalSection(&m_constructionCriticalSection);
		::DeleteCriticalSection(&m_reconstructionCriticalSection);
	}
	delete m_pCollisionSensor;	// delete the collision sensor viewport
	m_pCollisionSensor = 0;
	#endif

	if ( ChMazeWnd::GetNumMazeObjects() == 0 )
	{ // This is the last object, cleanup all static renderdata objects
		ChQvRenderBaseData::Term();
	}

	#if (defined(CH_USE_D3D))
	// Clean up interfaces
	RELEASE_INTERFACE(m_DDClipper);
	RELEASE_INTERFACE(m_D3DRM);
	RELEASE_INTERFACE(m_D3D);
	RELEASE_INTERFACE(m_DD);
	#endif
}

ChRenderContext*  ChRenderContext::SetRoot(ChQvInstance *pRootInstance)
{
	if(m_pRootInstance != pRootInstance && m_pRootInstance) m_pRootInstance->Release();
	m_pRootInstance = pRootInstance; 
	return this;
};

#if ((defined(CH_USE_RLAB)) || defined(CH_USE_D3D))

#if (defined(CH_USE_RLAB))
void CameraCallback(ChNrFrame frame, void * arg)
#else
void CameraCallback(ChNrFrame frame, void * arg, float delta)
#endif
{
#if 1
	//ASSERT(arg);
	if(arg)
	{
		QvNode *pCamera = ((ChRenderContext*)arg)->GetCurrentCamera();
		if(pCamera)
		{
			ChQvPCameraRenderData *pRenderData = (ChQvPCameraRenderData *)(pCamera->GetRenderData());

			pRenderData->OnTick();
		}
	}
#endif
}
#endif


#if 0 && defined(_DEBUG)
int GetHeapDetails(HANDLE heap, int &numBlocks, int &numBytes)
{
	numBlocks = 0;
	numBytes = 0;
	PROCESS_HEAP_ENTRY entry;
	entry.lpData = 0;

	HeapLock(heap);
	while(HeapWalk(heap, &entry))
	{
		numBlocks ++;
		numBytes += entry.cbData;
		
	}
	HeapUnlock(heap);
	return numBlocks;
}
void CheckMemory()
{
	#if 0 && defined(_DEBUG)
	HANDLE heaps[200];
	int numHeaps = 	GetProcessHeaps( sizeof(heaps) / sizeof(heaps[0]), heaps);
	TRACE1("Number of heaps = %d\n", numHeaps);
	HANDLE sysHeap = GetProcessHeap();
	int numBytes, numBlocks;

	for(int j=0; j < numHeaps; j++)
	{
		GetHeapDetails(heaps[j], numBlocks, numBytes);
		TRACE2("Heap blocks = %d, bytes = %d", numBlocks, numBytes);
		if(heaps[j] == sysHeap) TRACE(" (process heap)");
		if(!HeapValidate(heaps[j], 0, 0)) TRACE(" INVALID HEAP!");
		TRACE("\n");
	}

	_HEAPINFO heapInfo;
	int heapRet;
	numBlocks = numBytes = 0;
	int numInUseBlocks = 0, numInUseBytes = 0;

	memset(&heapInfo, 0, sizeof(heapInfo));
	while((heapRet = _heapwalk( &heapInfo)) == _HEAPOK)
	{
		numBlocks ++;
		numBytes += heapInfo._size;
		if(heapInfo._useflag)
		{
			numInUseBlocks ++;
			numInUseBytes += heapInfo._size;
		}
	}				
	TRACE2("CRT Heap total blocks = %d, bytes = %d", numBlocks, numBytes);
	TRACE("\n");
	TRACE2("CRT Heap in use blocks = %d, bytes = %d", numInUseBlocks, numInUseBytes);
	TRACE("\n");
	if(heapRet != _HEAPEND) TRACE("CRT Heap invalid!\n");

	char *p = (char*)malloc(2);
	free(p);

	static int passCount = 0;
	static CMemoryState msLast;

	passCount++;
	if (passCount >= 3)
	{
	//AfxDumpMemoryLeaks();
		CMemoryState msNow;
		msNow.Checkpoint();

	if (msNow.m_lCounts[CMemoryState::objectBlock] != 0 ||
		msNow.m_lCounts[CMemoryState::bitBlock] != 0)
	{
		// dump objects since since difference detected.
		TRACE0("Detected memory growth!\n");
		afxDump.SetDepth(1);    // just 1 line each
		//CMemoryState msEmpty;   // construct empty memory state object
		msLast.DumpAllObjectsSince();
	}
	msLast.Checkpoint();


	}
	#endif
}
#else
#define CheckMemory()
#endif

#if (defined(CH_USE_RLAB) || defined(CH_USE_D3D))
void SceneDestroyCallback(ChNrObject obj, void * arg)
{
	//TRACE("Scene Destroyed\n");
}
void ViewportDestroyCallback(ChNrObject obj, void * arg)
{
	//TRACE("Viewport Destroyed\n");
}
void CameraDestroyCallback(ChNrObject obj, void * arg)
{
	//TRACE("Camera frame Destroyed\n");
}
#endif

ChRenderContext*  ChRenderContext::ResetScene()
{

	// Before we reset the scene we need to terminate all threads currently
	// running for this instance
	#if (defined(CH_USE_RLAB)) || defined(CH_USE_D3D)
	// Stop all currently active construction threads because we have a new scene
	AbortConstruction();
	
	// at this point there should be only one
	// thread running

	#endif
	
	CheckMemory();

	// remove all textures in our queue for this scene
	if ( !m_textureQueue.IsEmpty() ) 
	{
		ChPosition pos  = m_textureQueue.GetHeadPosition();

		while( pos )
		{
			ChMazeTextureHTTPReq* pReq  = m_textureQueue.GetNext( pos );
			#if defined(CH_USE_3DR)	
				#pragma message("3DR textures leak")
			#elif (defined(CH_USE_RLAB)) || defined(CH_USE_D3D)
				//delete ((ChRLImage *)pReq->GetTextureHandle())->Release();
				if ( pReq->GetTextureHandle() )
				{
					((ChRLImage *)pReq->GetTextureHandle())->Release();
				}
			#endif
			delete pReq;
		
		}
		m_textureQueue.Empty();
	}

	
	SetRoot(0); 
	m_iShapeCount = 0; // This will be incremented by the construction thread

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线一区二区三区四区五区 | 欧美综合视频在线观看| 国产欧美日韩亚州综合| 日韩av一区二区三区| 日韩一区二区三区免费观看 | 欧美日韩一级大片网址| 蜜臀国产一区二区三区在线播放| 欧美日韩精品一区二区天天拍小说 | 日韩欧美高清一区| 国产成人午夜片在线观看高清观看| 久久蜜桃av一区二区天堂| 粉嫩高潮美女一区二区三区| 国产精品白丝在线| 欧洲色大大久久| 91国产丝袜在线播放| 在线免费观看日本一区| 欧美三区在线视频| 欧美一卡2卡3卡4卡| 成人黄页在线观看| 午夜精品国产更新| 国产日韩欧美精品在线| 国产精品美女久久久久久久久| 欧美精品色一区二区三区| 国产精品77777| 一区二区高清视频在线观看| 欧美一级免费观看| 精品裸体舞一区二区三区| a级高清视频欧美日韩| 日韩福利电影在线观看| 久久国产精品色| 亚洲国产aⅴ天堂久久| 中文字幕不卡在线| 日韩视频一区二区三区在线播放| 精品久久久久久久久久久久久久久| 久久综合狠狠综合久久激情| 制服丝袜中文字幕亚洲| 91看片淫黄大片一级在线观看| 国产真实乱子伦精品视频| 亚洲成人免费观看| 亚洲黄色尤物视频| 亚洲特级片在线| 久久综合国产精品| 一区二区三区在线视频播放| 久久国产尿小便嘘嘘| 97aⅴ精品视频一二三区| 成人高清视频在线| 欧美日韩国产免费一区二区| 国产欧美日韩久久| 亚洲成人第一页| 不卡的电影网站| 欧美一区二区三区成人| 亚洲丝袜精品丝袜在线| 久久精品国产亚洲一区二区三区| 成人蜜臀av电影| 99国产精品国产精品毛片| 日韩一区二区三区电影在线观看| 国产精品视频第一区| 美女一区二区视频| 欧美综合亚洲图片综合区| 国产精品久久久久精k8 | 精品少妇一区二区三区| 一区二区久久久久久| zzijzzij亚洲日本少妇熟睡| 久久婷婷一区二区三区| 偷拍日韩校园综合在线| 色网站国产精品| 欧美日韩国产综合久久 | 欧美疯狂性受xxxxx喷水图片| 欧美国产欧美综合| 国产高清精品久久久久| 日韩一级完整毛片| 青青草一区二区三区| 国产毛片精品一区| 99久久精品免费看国产 | 一二三四区精品视频| 99热在这里有精品免费| 国产欧美日韩精品在线| 国产成人综合在线观看| 久久综合五月天婷婷伊人| 精品一区二区三区蜜桃| 成人免费av在线| 国产精品毛片大码女人| 成人精品视频一区二区三区| 国产精品素人一区二区| 成人av在线电影| 亚洲桃色在线一区| 欧美性大战久久久久久久 | 国产精品自拍av| 国产欧美一区二区精品性色| 大美女一区二区三区| 综合激情网...| 色婷婷综合久久久中文字幕| 一区二区三区中文免费| 欧美精品欧美精品系列| 日韩专区在线视频| 99久久免费精品| 一区二区三区视频在线看| 欧美午夜一区二区三区| 午夜精品久久一牛影视| 精品免费一区二区三区| jlzzjlzz亚洲女人18| 亚洲国产乱码最新视频| 日韩美女视频在线| 国产91在线观看丝袜| 亚洲综合无码一区二区| www.欧美日韩国产在线| 亚洲精品国产高清久久伦理二区| 欧美日韩国产精品成人| 国产精品资源在线看| 成人免费在线观看入口| 国产精品77777| 亚洲一区二区三区不卡国产欧美| 91精品国产综合久久久久久漫画 | 成人一级视频在线观看| 亚洲乱码精品一二三四区日韩在线| 精品视频全国免费看| 激情另类小说区图片区视频区| 国产精品国产三级国产| 7777精品久久久大香线蕉| 国产福利不卡视频| 日韩成人免费电影| 综合久久给合久久狠狠狠97色 | 一区二区三区在线不卡| 精品久久久久久久人人人人传媒| 99视频精品全部免费在线| 麻豆91精品91久久久的内涵| 亚洲欧洲三级电影| 精品国产乱码久久久久久久 | 亚洲精品一线二线三线无人区| 99久久伊人网影院| 理论电影国产精品| 亚洲午夜免费电影| 亚洲国产精品精华液ab| 欧美一区二区在线免费播放| 色综合中文字幕国产 | 99久久国产综合精品女不卡| 蜜臀精品久久久久久蜜臀| 亚洲狠狠爱一区二区三区| 国产精品进线69影院| 精品国产a毛片| 91精品国产手机| 欧美美女直播网站| 色偷偷88欧美精品久久久| 99re这里只有精品视频首页| 国产一区不卡视频| 国产资源在线一区| 国产一区二三区| 久久激五月天综合精品| 免费高清在线视频一区·| 亚洲va欧美va人人爽午夜| 亚洲伦理在线免费看| 亚洲男女一区二区三区| 欧美日韩久久一区二区| 欧美日精品一区视频| 欧美三级在线视频| 欧美日韩精品一区二区在线播放| 欧美在线观看视频在线| 欧美性做爰猛烈叫床潮| 不卡电影免费在线播放一区| 国产伦精品一区二区三区在线观看| 亚洲成av人片一区二区梦乃| 亚洲另类中文字| 国产精品麻豆一区二区| 国产精品毛片久久久久久久| 日韩一区在线看| 中文字幕一区二区三区在线观看| 欧美一区二区三区视频在线观看 | 成人av电影免费在线播放| 国产一区久久久| 国产麻豆视频一区二区| 国产乱码精品1区2区3区| 国产美女视频91| 毛片av一区二区| 久久草av在线| 国产一区二区不卡| 国产乱妇无码大片在线观看| 国产综合色产在线精品| 91小视频免费观看| 色狠狠一区二区三区香蕉| 色婷婷久久久综合中文字幕| 正在播放一区二区| 日韩精品一区二区三区中文精品| 91精品国产综合久久精品性色| 欧美一区二区三区系列电影| 久久美女艺术照精彩视频福利播放| 精品国产99国产精品| 久久这里都是精品| 国产日韩欧美制服另类| 中文字幕中文字幕在线一区 | 色诱视频网站一区| 在线观看中文字幕不卡| 4438x成人网最大色成网站| 久久亚洲捆绑美女| 中文字幕av一区二区三区高| 一区在线观看免费| 亚洲黄色小说网站| 国产成人aaa| 91国在线观看| 久久久久久久久久久久久久久99 | 欧美吞精做爰啪啪高潮|