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

📄 crender.cpp

📁 一个个人开发的rpg游戏<亚特兰蒂斯传奇>的源码
💻 CPP
字号:
//--------------------------------------------------------------------------------------------------------
//                        游戏流水线渲染模块
//CRender.cpp
//游戏引擎中的流水线渲染部分
//作者:吴振华(kylinx)(中国科大01级11系)
//E-mail:game-diy@163.com
//创建于:2003/6/28 by Kylinx
//--------------------------------------------------------------------------------------------------------
#include"CRender.h"
DWORD CRender::s_dwCurrentID=0;

CRenderTask::CRenderTask()
{
	this->m_dwTaskState=LOA_TASK_PAUSE;
	this->m_dwID=0;
	this->m_bAutoRelease=false;
	this->m_dwPriority=0;
	this->m_dwLastPriority=0;
}
CRenderTask::~CRenderTask()
{
}
 
DWORD CRenderTask::CreateTask(BOOL bAutoRelease,BOOL bActiveImedit,DWORD dwPriority)
{

	this->m_dwID=CRender::GetGlobleID();

	this->m_dwPriority=dwPriority;
	this->m_dwLastPriority=dwPriority;
	this->m_bAutoRelease=bAutoRelease;
	if(bActiveImedit)
		this->m_dwTaskState=LOA_TASK_RUN;
	else
		this->m_dwTaskState=LOA_TASK_PAUSE;
	return this->m_dwID;
}

CRender::CRender()
{
	this->m_pHead=NULL;
	this->m_pTail=NULL;
	this->m_dwLength=0;
}
CRender::~CRender()
{
	Release();
}
void CRender::Release()
{
	while(m_pHead)
	{
		m_pTail=m_pHead;
		m_pHead=m_pHead->pNext;
	
		if(m_pTail->pTask->m_bAutoRelease)
		{
			m_pTail->pTask->Release();
			delete m_pTail->pTask;

		}
	
		delete m_pTail;
	}
	m_pTail=NULL;
	m_dwLength=0;
}
BOOL CRender::InsertNode(CRender::STRenderTaskNode *pNode)
{
	if(!m_pHead)
	{
		m_pHead=pNode;
		m_pTail=m_pHead;
		m_dwLength=1;
		return true;
	}
	m_dwLength++;
/*
	if(pNode->pTask->m_dwPriority==0)
	{
		m_pTail->pNext=pNode;
		if(m_pHead==m_pTail)
		{
			m_pHead->pNext=pNode;
		}
		m_pTail=m_pTail->pNext;
		return true;
	}
*/	STRenderTaskNode*pHeadTemp=m_pHead;
	STRenderTaskNode*pPrevTemp=m_pHead;
	while(pHeadTemp)
	{
		if(pHeadTemp->pTask->m_dwPriority < pNode->pTask->m_dwPriority)
		{
			if(pHeadTemp==m_pHead)								//如果是头指针
			{
				pNode->pNext=m_pHead;
				m_pHead=pNode;
				return true;
			}
			else
			{
				pPrevTemp->pNext=pNode;
				pNode->pNext=pHeadTemp;
				return true;
			}
		}
		pPrevTemp=pHeadTemp;									//保留上一个指针
		pHeadTemp=pHeadTemp->pNext;								//下一个
	}
	m_pTail=pPrevTemp;
	m_pTail->pNext=pNode;										//尾部
	m_pTail=m_pTail->pNext;										//尾指针后移
	return true;
}
BOOL CRender::AddTask(CRenderTask*pTask)
{
	STRenderTaskNode*pNode=new STRenderTaskNode(pTask);
	if(!pNode)
		return false;

	return InsertNode(pNode);
}
BOOL CRender::PauseTask(DWORD dwID)
{
	STRenderTaskNode*pHeadTemp=m_pHead;
	while(pHeadTemp)
	{
		if(pHeadTemp->pTask->m_dwID==dwID)
		{
			pHeadTemp->pTask->m_dwTaskState=LOA_TASK_PAUSE;
			return true;
		}
		pHeadTemp=pHeadTemp->pNext;
	}
	return false;
}
BOOL CRender::ResumeTask(DWORD dwID)
{
	STRenderTaskNode*pHeadTemp=m_pHead;
	while(pHeadTemp)
	{
		if(pHeadTemp->pTask->m_dwID==dwID)
		{
			pHeadTemp->pTask->m_dwTaskState=LOA_TASK_RUN;
			return true;
		}
		pHeadTemp=pHeadTemp->pNext;
	}
	return false;
}
BOOL CRender::SetTaskPriority(DWORD dwID,DWORD dwPriority)
{
	STRenderTaskNode*pHeadTemp=m_pHead;
	while(pHeadTemp)
	{
		if(pHeadTemp->pTask->m_dwID==dwID)
		{
			pHeadTemp->pTask->m_dwPriority=dwPriority;
			return true;
		}
		pHeadTemp=pHeadTemp->pNext;
	}
	return false;
}
BOOL CRender::FindTask(DWORD dwID,CRenderTask**ppTask)
{
	STRenderTaskNode*pHeadTemp=m_pHead;
	while(pHeadTemp)
	{
		if(pHeadTemp->pTask->m_dwID==dwID)
		{
			if(ppTask)
				*ppTask=pHeadTemp->pTask;
			return true;
		}
		pHeadTemp=pHeadTemp->pNext;
	}
	return false;
}
BOOL CRender::StopTask(DWORD dwID)
{
	STRenderTaskNode*pHeadTemp=m_pHead;
	while(pHeadTemp)
	{
		if(pHeadTemp->pTask->m_dwID==dwID)
		{
			pHeadTemp->pTask->m_dwTaskState=LOA_TASK_COMPLETE;
			return true;
		}
		pHeadTemp=pHeadTemp->pNext;
	}
	return false;
}
void CRender::Render()
{
	STRenderTaskNode*pHeadTemp=m_pHead;
	STRenderTaskNode*pNode;
	STRenderTaskNode*pPrevTemp=m_pHead;
	while(pHeadTemp)
	{
		if(pHeadTemp->pTask->m_dwTaskState==LOA_TASK_PAUSE)		//如果任务被挂起
		{
			pHeadTemp=pHeadTemp->pNext;
			continue;
		}

		if(pHeadTemp->pTask->m_dwPriority != pHeadTemp->pTask->m_dwLastPriority)
																//如果优先级已经被修改
		{
			pNode=pHeadTemp;
			
			if(pNode==m_pHead)									//如果是头指针
			{
				m_pHead=m_pHead->pNext;
			}
			else
			{
				pPrevTemp->pNext=pHeadTemp->pNext;				//脱离出节点pNode
			}

			pNode->pTask->m_dwLastPriority=pNode->pTask->m_dwPriority;
																//设置旧的优先级
			m_dwLength--;

			pHeadTemp=pHeadTemp->pNext;

			pNode->pNext=NULL;

			InsertNode(pNode);									//重新插入
			
			continue;
		}
		else
		{
			
			if(pHeadTemp->pTask->m_dwTaskState==LOA_TASK_COMPLETE)//如果任务已经完成
			{
				pNode=pHeadTemp;
				
				if(pNode==m_pHead)								//如果是头指针
				{
					m_pHead=m_pHead->pNext;
				}
				else
				{
					pPrevTemp->pNext=pHeadTemp->pNext;			//脱离出节点pNode
				}
				pHeadTemp=pHeadTemp->pNext;

				pNode->pTask->m_dwTaskState=LOA_TASK_COMPLETE;

				if(pNode->pTask->m_bAutoRelease)				//如果自动释放
				{
					pNode->pTask->Release();
					delete pNode->pTask;

				}

				m_dwLength--;
				delete pNode;
			
			}
			else
			{
				pHeadTemp->pTask->Render();
				if(pHeadTemp->pTask->IsRenderComplete())
					pHeadTemp->pTask->m_dwTaskState=LOA_TASK_COMPLETE;
				pPrevTemp=pHeadTemp;
				pHeadTemp=pHeadTemp->pNext;
			}
		}
	}
}
DWORD CRender::GetGlobleID()
{
	return ++s_dwCurrentID;
}

⌨️ 快捷键说明

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