#include "dxstdafx.h" #include ".\TerrainRenderer.h" #include "GameManager.h" TerrainRenderer::TerrainRenderer(void) : Renderer() { this->setRenderPriority(10); this->rendererType |= Renderer::RENDERER_TERRAIN; } TerrainRenderer::~TerrainRenderer(void) { this->myScene->manager->releaseEffect(this->TerrainEffect); this->TerrainEffect = NULL; } void TerrainRenderer::init() { } void TerrainRenderer::setEffect(ID3DXEffect* effect) { this->TerrainEffect = effect; //set technique handles: ShaderTechHandle = TerrainEffect->GetTechniqueByName("TerrainShader"); ShaderTechHandleRay = TerrainEffect->GetTechniqueByName("TerrainShaderRay"); ShaderTechHandleDepth = TerrainEffect->GetTechniqueByName("TerrainShaderDepth"); //new texture handles: //shader: WorldViewProjectionHandle = TerrainEffect->GetParameterByName(0, "g_mWorldViewProjection"); WorldViewHandle = TerrainEffect->GetParameterByName(0, "g_mWorldView"); float nearPlane = this->myScene->getActiveCamera()->getNearClipping(); float farPlane = this->myScene->getActiveCamera()->getFarClipping(); FarPlaneMinusNearPlaneHandle = TerrainEffect->GetParameterByName(0, "FarPlaneMinusNearPlane"); TerrainEffect->SetFloat(FarPlaneMinusNearPlaneHandle, farPlane - nearPlane); } void TerrainRenderer::render() { this->device->BeginScene(); SPTR node = this->myNode.lock(); Object3d *obj = (Object3d *) (node.get()); if(obj!=NULL && obj->isModelLoaded()) { //Habe das von this->myScene->getActiveRenderPass() == NULL auf switch cases umgebaut.. //if(this->myScene->getActiveRenderPass() == NULL) { UINT numPasses = 0; switch(this->myScene->getActivePassId()) { case Scene::PASS_NORMAL: this->device->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); // set the technique to use TerrainEffect->SetTechnique( ShaderTechHandle ); D3DXMatrixMultiply(&this->worldViewMat, &this->myScene->getWorldMatrix(), &this->myScene->getViewMatrix()); D3DXMatrixMultiply(&this->worldViewProjMat, &this->worldViewMat, &this->myScene->getProjectionMatrix()); TerrainEffect->SetMatrix(WorldViewProjectionHandle, &this->worldViewProjMat); TerrainEffect->Begin(&numPasses, 0); for(UINT j = 0; j < numPasses; j++) { this->device->SetTexture(0, obj->Textures[0]); // begin effect render pass TerrainEffect->BeginPass(j); this->device->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW ); if(obj->isPMesh()) { (*obj->getProgressiveMesh())->DrawSubset(0); } else { (*obj->getMesh())->DrawSubset(0); } // end effect render pass TerrainEffect->EndPass(); } TerrainEffect->End(); break; case Scene::PASS_RAYTRACE: //this->device->SetRenderState( D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_BLUE|D3DCOLORWRITEENABLE_GREEN|D3DCOLORWRITEENABLE_RED ); this->device->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); // set the technique to use TerrainEffect->SetTechnique( ShaderTechHandleRay ); D3DXMatrixMultiply(&this->worldViewMat, &this->myScene->getWorldMatrix(), &this->myScene->getViewMatrix()); TerrainEffect->SetMatrix(WorldViewHandle, &this->worldViewMat); D3DXMatrixMultiply(&this->worldViewProjMat, &this->worldViewMat, &this->myScene->getProjectionMatrix()); TerrainEffect->SetMatrix(WorldViewProjectionHandle, &this->worldViewProjMat); TerrainEffect->Begin(&numPasses, 0); for(UINT j = 0; j < numPasses; j++) { this->device->SetTexture(0, obj->Textures[0]); // begin effect render pass TerrainEffect->BeginPass(j); this->device->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW ); if(obj->isPMesh()) { (*obj->getProgressiveMesh())->DrawSubset(0); } else { (*obj->getMesh())->DrawSubset(0); } // end effect render pass TerrainEffect->EndPass(); } TerrainEffect->End(); //this->device->SetRenderState( D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA|D3DCOLORWRITEENABLE_BLUE|D3DCOLORWRITEENABLE_GREEN|D3DCOLORWRITEENABLE_RED ); break; case Scene::PASS_DEPTH: //habs im fx file noch nicht umgestellt this->device->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); // set the technique to use TerrainEffect->SetTechnique( ShaderTechHandleDepth ); D3DXMatrixMultiply(&this->worldViewMat, &this->myScene->getWorldMatrix(), &this->myScene->getViewMatrix()); D3DXMatrixMultiply(&this->worldViewProjMat, &this->worldViewMat, &this->myScene->getProjectionMatrix()); TerrainEffect->SetMatrix(WorldViewProjectionHandle, &this->worldViewProjMat); TerrainEffect->Begin(&numPasses, 0); for(UINT j = 0; j < numPasses; j++) { this->device->SetTexture(0, obj->Textures[0]); // begin effect render pass TerrainEffect->BeginPass(j); this->device->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW ); if(obj->isPMesh()) { (*obj->getProgressiveMesh())->DrawSubset(0); } else { (*obj->getMesh())->DrawSubset(0); } // end effect render pass TerrainEffect->EndPass(); } TerrainEffect->End(); break; } } this->device->EndScene(); } void TerrainRenderer::OnLostDevice( void* pUserContext ) { HRESULT hr; this->myScene->manager->printToConsole(" OnLostDevice TerrainRenderer"); V( this->TerrainEffect->OnLostDevice() ); } void TerrainRenderer::OnDestroyDevice( void* pUserContext ) { this->myScene->manager->printToConsole(" OnDestroyDevice TerrainRenderer"); //SAFE_RELEASE(this->TerrainEffect); this->myScene->manager->releaseEffect(this->TerrainEffect); this->TerrainEffect = NULL; } HRESULT TerrainRenderer::OnResetDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext ) { this->device = pd3dDevice; this->TerrainEffect = this->myScene->manager->getEffect(GameManager::EFFECT_TERRAIN); if(!this->TerrainEffect) { this->TerrainEffect = this->myScene->manager->loadEffect(GameManager::EFFECT_TERRAIN, L"shaders/terrain.obj"); } this->setEffect(this->TerrainEffect); return S_OK; } bool TerrainRenderer::isLowerThan(Renderer* renderer) { return this->getRenderPriority() < renderer->getRenderPriority(); }