int ProcTexTerrainRender::render_Init() { // // load terrain // heightMapX = heightMapY = 513; heightMapXFull = heightMapYFull = 2049; FILE *f = fopen( "data/rainier2049.raw", "rb" ); if ( f == NULL ) return -1; HeightMap16Full = new WORD[ heightMapXFull * heightMapYFull ]; fread( HeightMap16Full, 1, heightMapXFull * heightMapYFull * sizeof( WORD ), f ); fclose( f ); // create low res heightmap for triangle mesh HeightMap16 = new WORD[ heightMapX * heightMapY ]; int step = (heightMapXFull-1) / (heightMapX-1); for ( int y = 0; y < heightMapY; y++ ) for ( int x = 0; x < heightMapX; x++ ) { HeightMap16[ x + y * heightMapX ] = HeightMap16Full[ Min( heightMapXFull-1, x * step ) + Min( heightMapYFull-1, y * step ) * heightMapXFull ]; } // // create texturing // createSurfaceNodes(); CreateRenderTargets(); Reset(); }
void UIScreenTransition::StartTransition(UIScreen * _prevScreen, UIScreen * _nextScreen) { CreateRenderTargets(); nextScreen = _nextScreen; prevScreen = _prevScreen; Rect screenRect = Rect(Core::Instance()->GetVirtualScreenXMin() , Core::Instance()->GetVirtualScreenYMin() , Core::Instance()->GetVirtualScreenXMax() - Core::Instance()->GetVirtualScreenXMin() , Core::Instance()->GetVirtualScreenYMax() - Core::Instance()->GetVirtualScreenYMin()); RenderManager::Instance()->SetRenderTarget(renderTargetPrevScreen); RenderManager::Instance()->SetVirtualViewOffset(); RenderManager::Instance()->SetColor(0.0f, 0.0f, 0.0f, 1.0f); RenderHelper::Instance()->FillRect(screenRect); RenderManager::Instance()->ResetColor(); //SetColor(1.0f, 1.0f, 1.0f, 1.0f); // int32 prevScreenGroupId = 0; if (prevScreen) { prevScreen->SystemDraw(UIControlSystem::Instance()->GetBaseGeometricData()); prevScreen->SystemWillDisappear(); // prevScreen->UnloadResources(); if (prevScreen->GetGroupId() != nextScreen->GetGroupId()) prevScreen->UnloadGroup(); prevScreen->SystemDidDisappear(); SafeRelease(prevScreen); } RenderManager::Instance()->RestoreRenderTarget(); nextScreen->LoadGroup(); nextScreen->SystemWillAppear(); // RenderManager::Instance()->SetRenderTarget(renderTargetNextScreen); RenderManager::Instance()->SetVirtualViewOffset(); RenderManager::Instance()->SetColor(0.0f, 0.0f, 0.0f, 1.0f); RenderHelper::Instance()->FillRect(screenRect); RenderManager::Instance()->ResetColor();//SetColor(1.0f, 1.0f, 1.0f, 1.0f); float32 timeElapsed = SystemTimer::FrameDelta(); nextScreen->SystemUpdate(timeElapsed); nextScreen->SystemDraw(UIControlSystem::Instance()->GetBaseGeometricData()); RenderManager::Instance()->RestoreRenderTarget(); currentTime = 0; }
void UIScreenTransition::StartTransition(UIScreen * _prevScreen, UIScreen * _nextScreen) { CreateRenderTargets(); nextScreen = _nextScreen; prevScreen = _prevScreen; RenderManager::Instance()->SetRenderTarget(renderTargetPrevScreen); RenderManager::Instance()->SetVirtualViewOffset(); RenderManager::Instance()->ResetColor(); //SetColor(1.0f, 1.0f, 1.0f, 1.0f); RenderManager::Instance()->SetRenderState(RenderState::RENDERSTATE_3D_BLEND); RenderManager::Instance()->FlushState(); RenderManager::Instance()->Clear(Color(0.0f, 0.0f, 0.0f, 1.0f), 1.0f, 0); if (prevScreen) { prevScreen->SystemDraw(UIControlSystem::Instance()->GetBaseGeometricData()); if (prevScreen->IsOnScreen()) prevScreen->SystemWillBecomeInvisible(); prevScreen->SystemWillDisappear(); // prevScreen->UnloadResources(); if (prevScreen->GetGroupId() != nextScreen->GetGroupId()) prevScreen->UnloadGroup(); prevScreen->SystemDidDisappear(); SafeRelease(prevScreen); } /*clear alpha*/ RenderManager::Instance()->SetRenderState(alphaClearStateHandle); RenderManager::Instance()->FlushState(); RenderManager::Instance()->ClearWithColor(0.0, 0.0, 0.0, 1.0); // RenderManager::Instance()->SetColor(1.0, 0.0, 0.0, 1.0); // RenderHelper::Instance()->FillRect(Rect(screenRect.x, screenRect.y, screenRect.dx / 2, screenRect.dy)); // RenderManager::Instance()->RestoreRenderTarget(); nextScreen->LoadGroup(); nextScreen->SystemWillAppear(); // RenderManager::Instance()->SetRenderTarget(renderTargetNextScreen); RenderManager::Instance()->SetVirtualViewOffset(); RenderManager::Instance()->ResetColor(); //SetColor(1.0f, 1.0f, 1.0f, 1.0f); RenderManager::Instance()->SetRenderState(RenderState::RENDERSTATE_3D_BLEND); RenderManager::Instance()->FlushState(); RenderManager::Instance()->Clear(Color(0.0f, 0.0f, 0.0f, 1.0f), 1.0f, 0); float32 timeElapsed = SystemTimer::FrameDelta(); nextScreen->SystemUpdate(timeElapsed); nextScreen->SystemDraw(UIControlSystem::Instance()->GetBaseGeometricData()); // RenderManager::Instance()->SetColor(0.0, 1.0, 0.0, 1.0); // RenderHelper::Instance()->FillRect(Rect(screenRect.x, screenRect.y, screenRect.dx / 2, screenRect.dy)); /*clear alpha*/ RenderManager::Instance()->SetRenderState(alphaClearStateHandle); RenderManager::Instance()->FlushState(); RenderManager::Instance()->ClearWithColor(0.0, 0.0, 0.0, 1.0); RenderManager::Instance()->RestoreRenderTarget(); // Debug images. Left here for future bugs :) // Image * image = renderTargetPrevScreen->GetTexture()->CreateImageFromMemory(); // ImageLoader::Save(image, "~doc:/render_target_prev.png"); // SafeRelease(image); // // Image * image2 = renderTargetNextScreen->GetTexture()->CreateImageFromMemory(); // ImageLoader::Save(image2, "~doc:/render_target_next.png"); // SafeRelease(image2); currentTime = 0; }
ERet FxUtil_LoadShaderLibrary( AStreamReader& stream, Clump &clump, const Resolution& screen ) { FxLibraryHeader_d libraryHeader; mxDO(stream.Get(libraryHeader)); // Load shader library structures. #if mxUSE_BINARY_EFFECT_FILE_FORMAT UNDONE; //mxTRY(Serialization::LoadClumpImage(stream, clump)); #else ByteBuffer32 buffer; buffer.SetNum(libraryHeader.runtimeSize); stream.Read(buffer.ToPtr(), buffer.Num()); SON::Parser parser; parser.buffer = (char*)buffer.ToPtr(); parser.length = libraryHeader.runtimeSize; parser.line = 1; parser.file = ""; SON::Allocator allocator; SON::Node* root = SON::ParseBuffer(parser, allocator); chkRET_X_IF_NIL(root, ERR_FAILED_TO_PARSE_DATA); mxTRY(SON::LoadClump( root, clump )); #endif // Initialization order: // 1) Render targets // 2) State objects // 3) Shaders // 4) Input layouts // 5) Everything else // render targets should be sorted by size // shader resources should be sorted by size // constant buffers should be sorted by size CreateRenderTargets(screen, clump, false); // Ideally, render states should be sorted by state deltas (so that changes between adjacent states are minimized). { TObjectIterator< FxSamplerState > samplerStateIt( clump ); while( samplerStateIt.IsValid() ) { FxSamplerState& samplerState = samplerStateIt.Value(); samplerState.handle = llgl::CreateSamplerState( samplerState ); samplerStateIt.MoveToNext(); } } { TObjectIterator< FxDepthStencilState > depthStencilStateIt( clump ); while( depthStencilStateIt.IsValid() ) { FxDepthStencilState& depthStencilState = depthStencilStateIt.Value(); depthStencilState.handle = llgl::CreateDepthStencilState( depthStencilState ); depthStencilStateIt.MoveToNext(); } } { TObjectIterator< FxRasterizerState > rasterizerStateIt( clump ); while( rasterizerStateIt.IsValid() ) { FxRasterizerState& rasterizerState = rasterizerStateIt.Value(); rasterizerState.handle = llgl::CreateRasterizerState( rasterizerState ); rasterizerStateIt.MoveToNext(); } } { TObjectIterator< FxBlendState > blendStateIt( clump ); while( blendStateIt.IsValid() ) { FxBlendState& blendState = blendStateIt.Value(); blendState.handle = llgl::CreateBlendState( blendState ); blendStateIt.MoveToNext(); } } FxRenderResources* renderStates = FindSingleInstance<FxRenderResources>(clump); if(renderStates) { for( UINT32 iStateBlock = 0; iStateBlock < renderStates->state_blocks.Num(); iStateBlock++ ) { FxStateBlock* stateBlock = renderStates->state_blocks[ iStateBlock ]; stateBlock->blendState = renderStates->blend_states[ stateBlock->blendState.id ]->handle; stateBlock->rasterizerState = renderStates->rasterizer_states[ stateBlock->rasterizerState.id ]->handle; stateBlock->depthStencilState= renderStates->depth_stencil_states[ stateBlock->depthStencilState.id ]->handle; } } // Create constant buffers and shader resources. { TObjectIterator< FxCBuffer > cbufferIt( clump ); while( cbufferIt.IsValid() ) { FxCBuffer& ubo = cbufferIt.Value(); ubo.handle = llgl::CreateBuffer( Buffer_Uniform, ubo.size, NULL ); cbufferIt.MoveToNext(); } } CacheHeader_d cacheHeader; mxDO(stream.Get(cacheHeader)); // Create shaders. FxShaderHandles shaders; ScopedStackAlloc tempAlloc( gCore.frameAlloc ); for( UINT32 shaderType = 0; shaderType < ShaderTypeCount; shaderType++ ) { const UINT32 shaderCount = cacheHeader.numShaders[shaderType]; if( shaderCount ) { HShader* shaderHandlesStorage = tempAlloc.AllocMany< HShader >( shaderCount ); shaders.handles[shaderType].SetExternalStorage( shaderHandlesStorage, shaderCount ); shaders.handles[shaderType].SetNum( shaderCount ); } } mxDO(ShaderCache_d::CreateShaders( cacheHeader, stream, shaders )); // Create programs. TArray< HProgram > programHandles; { const UINT32 programsCount = cacheHeader.numPrograms; HProgram* programHandlesStorage = tempAlloc.AllocMany< HProgram >( programsCount ); programHandles.SetExternalStorage( programHandlesStorage, programsCount ); programHandles.SetNum( programsCount ); ScopedStackAlloc programAlloc( gCore.frameAlloc ); char * tempBuffer = programAlloc.Alloc( cacheHeader.bufferSize ); ByteArrayT programBlob( tempBuffer, cacheHeader.bufferSize ); for( UINT32 programIndex = 0; programIndex < programsCount; programIndex++ ) { stream >> programBlob; CachedProgram_d * program; mxDO(Serialization::LoadInPlace( programBlob.ToPtr(), programBlob.Num(), program )); HShader* shaderIds = program->pd.shaders; for( UINT32 shaderType = 0; shaderType < ShaderTypeCount; shaderType++ ) { const UINT16 shaderIndex = shaderIds[shaderType].id; if( shaderIndex != (UINT16)~0 ) { shaderIds[shaderType] = shaders.handles[shaderType][shaderIndex]; } } const HProgram programHandle = llgl::CreateProgram( program->pd ); programHandles[programIndex] = programHandle; } } { TObjectIterator< FxShader > shaderIt( clump ); while( shaderIt.IsValid() ) { FxShader& shader = shaderIt.Value(); for( UINT32 i = 0; i < shader.programs.Num(); i++ ) { int programIndex = shader.programs[i].id; shader.programs[i] = programHandles[programIndex]; } shaderIt.MoveToNext(); } } return ALL_OK; }
//-------------------------------------------------------------------------------------- // //-------------------------------------------------------------------------------------- void ResizeScreenSizedBuffers(ID3D11Device* pd3dDevice) { CreateRenderTargets(pd3dDevice); CreateDepthBuffer(pd3dDevice); }