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;
}
示例#4
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);
}