📄 crender.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 + -