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

📄 clcrnivector.cpp

📁 在GPU上实现数值模拟技术(线性方程组)的通用架构
💻 CPP
字号:
/****************************************************************
 *																*
 * decr     : Crank-Nicholson vector for the water surface demo	*
 * version  : 1.01												*
 * author   : Jens Kr黦er										*
 * date     : 16.09.2003										*
 * modified	: 06.10.2003										*
 * e-mail   : jens.krueger@in.tum.de							*
 *																*
 ****************************************************************/

#include "clunpackedvector.h"

#include "clCrNiVector.h"


int				clCrNiVector::s_iShaderClCrNiUser=0;
LPD3DXEFFECT	clCrNiVector::ms_pShaderclCrNi=NULL;
D3DXHANDLE		clCrNiVector::ms_f4Shift;
D3DXHANDLE		clCrNiVector::ms_fPreFac;
D3DXHANDLE		clCrNiVector::ms_tLast;
D3DXHANDLE		clCrNiVector::ms_tCurrent;
D3DXHANDLE		clCrNiVector::ms_tCompRHS;

clCrNiVector::~clCrNiVector(void){
	s_iShaderClCrNiUser--;
	if (s_iShaderClCrNiUser==0) 	SAFE_RELEASE( ms_pShaderclCrNi );
}

clCrNiVector::clCrNiVector(LPDIRECT3DDEVICE9 pd3dDevice, int iSizeX,int iSizeY, bool bConstant) 
{
	init(pd3dDevice, iSizeX,iSizeY, bConstant, FLOAT_TEX_R);
}

clCrNiVector::clCrNiVector(LPDIRECT3DDEVICE9 pd3dDevice, int iSize, bool bConstant) 
{
	init(pd3dDevice, iSize, bConstant, FLOAT_TEX_R);
}


void clCrNiVector::setC(float fC) {
	setSimulParam(m_fDt, fC, m_fDX, m_fDY);
}

void clCrNiVector::setSimulParam(float fDt,float fC,float fDX,float fDY) {
	m_fDt = fDt;
	m_fC  = fC;
	m_fDX = fDX;
	m_fDY = fDY;

	m_fPreFactor = (m_fDt*m_fDt*m_fC*m_fC) / (2.0f*m_fDX*m_fDY);  
}

void clCrNiVector::getSimulParam(float &fDt,float &fC,float &fDX,float &fDY) {
	fDt = m_fDt;
	fC  = m_fC;
	fDX = m_fDX;
	fDY = m_fDY;
}

void clCrNiVector::computeRHS(clUnpackedVector *cluULast, clUnpackedVector *cluUCurrent) {
	m_pd3dDevice->SetRenderTarget(0,m_pVectorTextureSurface);

		ms_pShaderclCrNi->SetVector(ms_f4Shift,&m_vSize);
		ms_pShaderclCrNi->SetFloat(ms_fPreFac,m_fPreFactor);
		ms_pShaderclCrNi->SetTexture(ms_tLast,     cluULast->m_pVectorTexture);
		ms_pShaderclCrNi->SetTexture(ms_tCurrent,  cluUCurrent->m_pVectorTexture);
		
		ms_pShaderclCrNi->SetTechnique(ms_tCompRHS);

		RenderViewPortCover(ms_pShaderclCrNi);
	m_pd3dDevice->SetRenderTarget(0,m_lpBackBuffer);
}

void clCrNiVector::loadShaders() {
	// load the standart shaders
	clUnpackedVector::loadShaders();
	// load the aditional shaders
	if (s_iShaderClCrNiUser < 1) {
		if (FAILED(DirectXUtils::checkLoadShader(_T("clCrNiVector.fx"), ms_pShaderclCrNi, m_pd3dDevice,clFrameworkShaderPath, NULL, clClass::ms_clPSProfile))) exit(-1);
		// precache shader parameters 

		// parameters 
		ms_f4Shift			= ms_pShaderclCrNi->GetParameterByName(NULL,"f4Shift");
		ms_fPreFac			= ms_pShaderclCrNi->GetParameterByName(NULL,"fPreFac");
		ms_tLast			= ms_pShaderclCrNi->GetParameterByName(NULL,"tLast");
		ms_tCurrent			= ms_pShaderclCrNi->GetParameterByName(NULL,"tCurrent");

		// techniques
		ms_tCompRHS			= ms_pShaderclCrNi->GetTechniqueByName("tCompRHS");
	}
	s_iShaderClCrNiUser++;
}

⌨️ 快捷键说明

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