Exemplo n.º 1
0
/*
=====================
ActionLayer::LoadResources
=====================
*/
void ActionLayer::LoadResources()
{
	ListenFrame();

	/* Load MoveToActions */
	for (int x = -1; x <= 1; x += 2)
	{
		for (int y = -1; y <= 1; y += 2)
		{
			Pim::Sprite *sprite = new Pim::Sprite("lighttiles.png");
			sprite->position = Pim::Vec2(400.f + 100.f*x, 300.f + 100.f*y);
			AddChild(sprite);

			Pim::MoveToAction *action = new Pim::MoveToAction(Pim::Vec2(400.f, 300.f), 1.f);
			sprite->RunAction(action);
		}
	}

	/* Load MoveBy actions */
	for (int i = 0; i < 2; i++)
	{
		Pim::Sprite *sprite = new Pim::Sprite("lighttiles.png");
		sprite->position = Pim::Vec2( 50.f, 50.f + 500.f * i);
		AddChild(sprite);

		int fac = (!i) ? (1) : (-1);
		Pim::MoveByAction *action = new Pim::MoveByAction(Pim::Vec2(700.f, 500.f*fac), 2.f);
		sprite->RunAction(action);
	}

	/* Load RotateBy actions */
	for (int i = 0; i < 2; i++)
	{
		Pim::Sprite *sprite = new Pim::Sprite("lighttiles.png");
		sprite->position = Pim::Vec2(400.f, 50.f + 500.f * i);
		AddChild(sprite);

		Pim::RotateByAction *action = new Pim::RotateByAction(-720.f, 2.f);
		sprite->RunAction(action);
	}

	/* Load TintActions */
	for (int x = -1; x <= 1; x += 2)
	{
		for (int y = -1; y <= 1; y += 2)
		{
			Pim::Sprite *sprite = new Pim::Sprite("lighttiles.png");
			sprite->position = Pim::Vec2(400.f + 100.f*x, 300.f + 100.f*y);
			AddChild(sprite);

			Pim::Color color(
				0.5f + 0.25f*x,
				0.5f - 0.25f*y,
				1.f,
				1.f
				);

			Pim::TintAction *action = new Pim::TintAction(color, 2.f);
			sprite->RunAction(action);
		}
	}

	/* Load ActionQueue */
	for (int i = -1; i <= 1; i += 2)
	{
		Pim::DelayAction *delay = new Pim::DelayAction(0.5f);
		Pim::MoveByAction *a0 = new Pim::MoveByAction(Pim::Vec2(10.f*i, 10.f), 0.25f);
		Pim::MoveByAction *a1 = new Pim::MoveByAction(Pim::Vec2(10.f, 10.f*i), 0.25f);
		Pim::TintAction *a2 = new Pim::TintAction(Pim::Color(1.f, 1.f, 1.f, 0.f), 0.25f);
		Pim::TintAction *a3 = new Pim::TintAction(Pim::Color(1.f, 1.f, 1.f, 1.f), 0.25f);
		Pim::MoveToAction *a4 = new Pim::MoveToAction(Pim::Vec2(50.f, 300.f+250.f*i), 0.5f);

		Pim::TintAction *a5 = new Pim::TintAction(Pim::Color(0.f, 0.f, 0.f, 1.f), 0.5f);
		Pim::TintAction *a6 = new Pim::TintAction(Pim::Color(1.f, 1.f, 1.f, 1.f), 0.5f);
		Pim::ActionQueueRepeat *aqr = new Pim::ActionQueueRepeat(1,2,a5,a6);
		aqr->infinite = true;

		Pim::ActionQueue *aq = new Pim::ActionQueue(7, delay, a0, a1, a2, a3, a4, aqr);

		Pim::Sprite *sprite = new Pim::Sprite("lighttiles.png");
		sprite->position = Pim::Vec2(400.f + 200.f*i, 100.f);
		AddChild(sprite);

		sprite->RunActionQueue(aq);
	}
	
	/* Load ActionQueueRepeat */
	for (int i = -1; i <= 1; i += 2)
	{
		Pim::TintAction		*a0 = new Pim::TintAction(Pim::Color(1.f, 0.f, 0.f, 1.f), 0.25f);
		Pim::RotateByAction *a1 = new Pim::RotateByAction(180.f, 0.5f); 
		Pim::ScaleByAction	*a2 = new Pim::ScaleByAction(Pim::Vec2(1.f, 1.f), 0.25f);
		Pim::ScaleByAction	*a3 = new Pim::ScaleByAction(Pim::Vec2(-1.f, -1.f), 0.25f);
		Pim::MoveToAction	*a4 = new Pim::MoveToAction(Pim::Vec2(400.f, 300.f), 0.25f);
		Pim::MoveByAction	*a5 = new Pim::MoveByAction(Pim::Vec2(-300.f*i, 0.f), 0.25f);
		Pim::TintAction		*a6 = new Pim::TintAction(Pim::Color(1.f, 1.f, 1.f, 1.f), 0.25f);
		Pim::ActionQueueRepeat *aq = new Pim::ActionQueueRepeat(2, 7, a0,a1,a2,a3,a4,a5,a6);
		aq->infinite = true;

		Pim::Sprite *sprite = new Pim::Sprite("lighttiles.png");
		sprite->position = Pim::Vec2(400.f + 300.f*i, 300.f);
		AddChild(sprite);

		sprite->RunActionQueue(aq);
	}
	
	/* Load the shader */
	shader = Pim::ShaderManager::AddShader(
		"uniform sampler2D tex;\n"
		"uniform float time;\n"
		"void main(void)\n"
		"{\n"
		"	vec2 c = gl_TexCoord[0].xy;\n"
		"	float m = (sin(c.x*100.0)+1.0)/100.0;\n"
		"	c.x += m;\n"
		"	gl_FragColor = texture2D(tex, c);\n"
		"}\n",
		"void main(void){\n"
		"	gl_Position=ftransform();\n"
		"	gl_TexCoord[0] = gl_MultiTexCoord0;\n"
		"}\n",
		"actionShader");
	if (shader) {
		shader->SetUniform1i("tex", 0);
		SetShader(shader);
	} else {
		printf("Failed to compile ActionShader!!\n");
	}
}
Exemplo n.º 2
0
void Graphic::DrawTexture(TEXTURE_ID id, const Matrix4* mat_){
	SetShader(SHADER_ID::TEXTURE_SHADER);
	Matrix4 mat = *mat_;
	//texture[id].Draw(&RConvert(&mat),&shader[sID]);
	animBind = false;
}
Exemplo n.º 3
0
bool CRenderSystem::prepareMaterial(/*const */CMaterial& material, float fOpacity) // 由于使用了自动注册纹理的机制,很遗憾的导致不能用“const”
{
	CTextureMgr& TM = GetTextureMgr();
	for (size_t i=0;i<8;++i)
	{
		if (material.uTexture[i]==-1)
		{
			material.uTexture[i] = TM.RegisterTexture(material.getTexture(i));
		}
		// ----
		SetTexture(i, material.uTexture[i]);
		// ----
		if (material.uTexture[i]==0)
		{
			break;
		}
	}
	if (material.uShader==-1)
	{
		material.uShader = GetShaderMgr().registerItem(material.getShader());
	}
	// ----
	SetLightingEnabled(material.bLightingEnabled);
	SetCullingMode((CullingMode)material.uCull);
	// ----
	SetAlphaTestFunc(material.bAlphaTest, (CompareFunction)material.nAlphaTestCompare, material.uAlphaTestValue);
	SetBlendFunc(material.bBlend, (SceneBlendOperation)material.nBlendOP, (SceneBlendFactor)material.nBlendSrc, (SceneBlendFactor)material.nBlendDest);
	SetDepthBufferFunc(material.bDepthTest,material.bDepthWrite);
	// ----
	if (0==material.uShader)
	{
		for (size_t i=0;i<8;++i)
		{
			CMaterial::TextureOP& texOP = material.textureOP[i];
			SetTextureColorOP(i, (TextureBlendOperation)texOP.nColorOP, (TextureBlendSource)texOP.nColorSrc1, (TextureBlendSource)texOP.nColorSrc2);
			SetTextureColorOP(i, (TextureBlendOperation)texOP.nAlphaOP, (TextureBlendSource)texOP.nAlphaSrc1, (TextureBlendSource)texOP.nAlphaSrc2);
			if (TBOP_DISABLE == texOP.nColorOP)
			{
				break;
			}
		}
	}
	else
	{
		CShader* pShader = GetShaderMgr().getSharedShader();
		if (pShader)
		{
			// for Terrain
			pShader->setVec2D("g_fScaleUV",material.vUVScale);
		}
		SetShader(material.uShader);
	}
	return true;
/*	if (material.bLightingEnabled)
	{
		SetMaterial(material.vAmbient,material.vDiffuse);
	}

	if (0==material.uShader)
	{
		//SetSamplerAddressUV(0,ADDRESS_WRAP,ADDRESS_WRAP);
		if (material.vTexAnim.lengthSquared()>0.0f)
		{
			Matrix matTex=Matrix::UNIT;
			float fTime = (float)GetGlobalTimer().GetTime();
			matTex._13=fTime*material.vTexAnim.x;
			matTex._23=fTime*material.vTexAnim.y;
			setTextureMatrix(0, TTF_COUNT3, matTex);
		}

		Color32 cFactor = material.cEmissive;
		if (material.m_fOpacity<0.0f)
		{
			fOpacity = (float)(rand()%255)/255.0f;
		}
		else
		{
			fOpacity *= material.m_fOpacity;
		}

		if (material.uDiffuse)
		{
			SetTexture(0, material.uDiffuse);
			cFactor.a=(unsigned char)(cFactor.a*fOpacity);
			SetTextureFactor(cFactor);
			if (material.bLightingEnabled)
			{
				SetTextureColorOP(0, TBOP_MODULATE, TBS_TEXTURE, TBS_DIFFUSE);
			}
			else
			{
				SetTextureColorOP(0, TBOP_MODULATE, TBS_TEXTURE, TBS_TFACTOR);
			}
			if(material.bBlend||material.m_fOpacity<1.0f)
			{
				SetBlendFunc(true, BLENDOP_ADD, SBF_SOURCE_ALPHA, SBF_ONE_MINUS_SOURCE_ALPHA);
			}

			if (material.m_fOpacity<1.0f)
			{
				SetTextureAlphaOP(0, TBOP_MODULATE, TBS_TEXTURE, TBS_TFACTOR);
			}
			else if (material.bAlphaTest||material.bBlend)
			{
				SetTextureAlphaOP(0, TBOP_SOURCE1, TBS_TEXTURE);
			}
			else
			{
				SetTextureAlphaOP(0, TBOP_DISABLE);
			}

			//////////////////////////////////////////////////////////////////////////
			if (material.uSpecular)
			{
				SetTexture(1, material.uSpecular);
				SetTextureColorOP(0, TBOP_MODULATE, TBS_TEXTURE, TBS_DIFFUSE);
				setResultARGToTemp(1,true);
				SetTextureColorOP(1, TBOP_MODULATE_X2, TBS_TEXTURE, TBS_SPECULAR);
				SetTextureColorOP(2, TBOP_ADD, TBS_CURRENT, TBS_TEMP);

				SetTexCoordIndex(0,0);
				SetTexCoordIndex(1,0);
				SetTexCoordIndex(2,0);
			}
			else if (material.uReflection)
			{
				SetTextureColorOP(1, TBOP_MODULATE_X2, TBS_CURRENT, TBS_TEXTURE);
				SetTexCoordIndex(1,TCI_CAMERASPACE_NORMAL|TCI_CAMERASPACE_POSITION);
				SetTexture(1, material.uReflection);
			}
			else if (material.uLightMap)
			{
				SetTextureColorOP(1, TBOP_MODULATE, TBS_CURRENT, TBS_TEXTURE);
				SetTexCoordIndex(1,1);
				SetTexture(1, material.uLightMap);
			}
			else if (material.uEmissive)
			{
				SetTextureColorOP(1, TBOP_ADD, TBS_CURRENT, TBS_TEXTURE);
				SetTexture(1, material.uEmissive);
			}
			else if(!material.bBlend&&material.m_fOpacity>=1.0f)
			{
				SetTextureColorOP(0, TBOP_MODULATE, TBS_TEXTURE, TBS_DIFFUSE);
			}
		}
		else
		{
			SetTextureFactor(cFactor);
			if (material.uSpecular)
			{
				//SetTexture(0, material.uSpecular);
				SetTextureColorOP(0, TBOP_SOURCE1, TBS_SPECULAR);
				SetTexCoordIndex(0,0);
			}
			else if(material.uReflection)
			{
				cFactor.r=(unsigned char)(cFactor.r*fOpacity);
				cFactor.g=(unsigned char)(cFactor.g*fOpacity);
				cFactor.b=(unsigned char)(cFactor.b*fOpacity);
				SetTextureFactor(cFactor);
				if (material.bBlend)
				{
					SetBlendFunc(true, BLENDOP_ADD, SBF_DEST_COLOUR, SBF_ONE);
				}
				SetTextureColorOP(0, TBOP_MODULATE, TBS_TEXTURE, TBS_TFACTOR);
				SetTextureAlphaOP(0, TBOP_DISABLE);
				SetTexCoordIndex(0,TCI_CAMERASPACE_NORMAL|TCI_CAMERASPACE_POSITION);
				SetTexture(0, material.uReflection);
			}
			else if (material.uLightMap)
			{
				if (material.bBlend)
				{
					SetBlendFunc(true, BLENDOP_ADD, SBF_DEST_COLOUR, SBF_ZERO);
				}
				SetTextureColorOP(0, TBOP_MODULATE, TBS_TEXTURE, TBS_TFACTOR);
				SetTextureAlphaOP(0, TBOP_DISABLE);
				SetTexture(0, material.uLightMap);
			}
			else if (material.uEmissive)
			{
				cFactor.r=(unsigned char)(cFactor.r*fOpacity);
				cFactor.g=(unsigned char)(cFactor.g*fOpacity);
				cFactor.b=(unsigned char)(cFactor.b*fOpacity);
				SetTextureFactor(cFactor);
				if (material.bBlend)
				{
					SetBlendFunc(true, BLENDOP_ADD, SBF_ONE, SBF_ONE);
				}
				SetTextureColorOP(0, TBOP_MODULATE, TBS_TEXTURE, TBS_TFACTOR);
				SetTextureAlphaOP(0, TBOP_DISABLE);
				SetTexture(0, material.uEmissive);
			}
			else if (material.uNormal)
			{
				CShader* pShader = GetShaderMgr().getSharedShader();
				if (pShader)
				{
					static size_t s_uShaderID = GetShaderMgr().registerItem("EngineRes\\fx\\SpaceBump.fx");
					pShader->setTexture("g_texNormal",material.uNormal);
					SetShader(s_uShaderID);
				}
				//SetBlendFunc(true, BLENDOP_ADD, SBF_DEST_COLOUR, SBF_ZERO);
				//SetTextureColorOP(0, TBOP_MODULATE, TBS_TEXTURE, TBS_TFACTOR);
				//SetTextureAlphaOP(0, TBOP_DISABLE);
				//SetTexture(0, uLightMap);
			}
			else
			{
				SetTextureColorOP(0,TBOP_SOURCE2);
				if (material.bBlend)
				{
					SetTextureAlphaOP(0,TBOP_SOURCE2);
				}
				else
				{
					SetTextureAlphaOP(0,TBOP_DISABLE);
				}
				//return false;
			}
		}
	}
	else
	{
		CShader* pShader = GetShaderMgr().getSharedShader();
		if (pShader)
		{
			pShader->setTexture("g_texDiffuse",material.uDiffuse);
			pShader->setTexture("g_texLight",material.uLightMap);
			pShader->setTexture("g_texNormal",material.uNormal);
			//pShader->setTexture("g_texEnvironment",uEmissive);
			//pShader->setTexture("g_texEmissive",uEmissive);
			pShader->setTexture("g_texSpecular",material.uSpecular);
			// for Terrain
			pShader->setVec2D("g_fScaleUV",material.vUVScale);
		}
		SetShader(material.uShader);
	}
	return true;*/
}
Exemplo n.º 4
0
CModelSurface::CModelSurface():
_vertexBuffer(0),
_indexBuffer(0),
_dirty(~0){
	SetShader( App.ShaderUtil()->ModelShader() );
}
Exemplo n.º 5
0
GaussianBlurRender::~GaussianBlurRender()
{
	SetColorTex(0);
	SetShader(0);
}
Exemplo n.º 6
0
Material::Material()
{
	SetShader(SHADER_TYPE_VERTEXSHADER, "Resources/Shaders/default_shader.vs");
	SetShader(SHADER_TYPE_FRAGMENTSHADER, "Resources/Shaders/default_shader.fs");
	SetShader(SHADER_TYPE_GEOMETRYSHADER, "Resources/Shaders/default_shader.gs");
}
Exemplo n.º 7
0
mitk::ShaderProperty::ShaderProperty( const std::string& value )
{
  AddShaderTypes();
  SetShader(value);
}
Exemplo n.º 8
0
void object::render()
{
	SetShader();
	d3ddevice->SetVertexShaderConstant( 0, &D3DXVECTOR4(0,0,0,0), 1 );
	d3ddevice->SetVertexShaderConstant( 1, &D3DXVECTOR4(1,1,1,1), 1 );
	d3ddevice->SetVertexShaderConstant( 80, &D3DXVECTOR4(0.5f,0.5f,0.5f,0.5f), 1 );

	D3DXMATRIX mat;
	D3DXMATRIX matworldview;
	D3DXMATRIX temp;
	D3DXVECTOR4 light_vec;
	//D3DXVECTOR4 eye_vec;

	D3DXMatrixIdentity(&matworld);
	D3DXMatrixTranslation(&temp,radius_of_rotation,0,0);
	D3DXMatrixMultiply( &matworld, &matworld, &temp );
	D3DXMatrixRotationY(&temp,angle);
	D3DXMatrixMultiply( &matworld, &matworld, &temp );
	D3DXMatrixTranslation(&temp,center_pos.x,center_pos.y,center_pos.z);
	D3DXMatrixMultiply( &matworld, &matworld, &temp );
	
	D3DXMatrixMultiply( &matworldview, &matworld, &matView );
	
	D3DXMatrixMultiply( &mat, &matworldview, &matProj );
	D3DXMatrixTranspose( &mat, &mat );
	d3ddevice->SetVertexShaderConstant( 2, &mat, 4 );
	D3DXMatrixInverse(&temp,NULL,&matworld);
	light_vec.x = light_pos[0];
	light_vec.y = light_pos[1];
	light_vec.z = light_pos[2];
	light_vec.w = 1;
	
	eye_pos.x = 0;
	eye_pos.y = 0;
	eye_pos.z = -15;
	eye_pos.w = 1;

	D3DXVec4Transform(&light_vec,&light_vec,&temp);
	D3DXVec4Transform(&eye_pos,&eye_pos,&temp);
	//D3DXVec3Normalize(&light_vec,&light_vec);
	//D3DXMatrixTranspose( &temp, &temp );
	//d3ddevice->SetVertexShaderConstant( 6, &temp, 4 );

// Declare and define the constant vertex color.
	D3DXVECTOR4 diff_color;
	diff_color = color;
	diff_color *= diffuse_amount;
	diff_color.w = 1;
	d3ddevice->SetVertexShaderConstant( 10, &color, 1 );
	d3ddevice->SetPixelShaderConstant( 2, &diff_color, 1 );
	D3DXVECTOR4 spec_color;
	spec_color = color;
	spec_color += D3DXVECTOR4(1,1,1,1);
	spec_color *= 0.5;
	spec_color *= specular_amount;
	spec_color.w = 1;
	d3ddevice->SetPixelShaderConstant( 4, &spec_color, 1 );

	d3ddevice->SetVertexShaderConstant( 11, &light_vec, 1 );
	d3ddevice->SetVertexShaderConstant( 13, &eye_pos, 1 );
	d3ddevice->SetVertexShaderConstant( 12, &ambient, 1 );
	
	D3DXVECTOR4 amb_color;
	amb_color = diff_color+spec_color;
	amb_color *= 0.1f;
	//amb_color.x *= color[0];
	//amb_color.y *= color[1];
	//amb_color.z *= color[2];
	amb_color.w = 1;

	d3ddevice->SetPixelShaderConstant( 3, &amb_color, 1 );

	//d3ddevice->SetPixelShaderConstant( 5, &D3DXVECTOR4(0,0,0,0), 1 );

//set texture
	if(texture != NULL)
		d3ddevice->SetTexture(0,texture);
	if(power_texture != NULL)
		d3ddevice->SetTexture(1,power_texture);

	
	d3ddevice->SetStreamSource( 0, vertex_buffer, sizeof(CUSTOMVERTEX) );
	d3ddevice->SetIndices(index_buffer,0);
	d3ddevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0,size, 0,size2);

	//mesh->DrawSubset(1);
	
}
Exemplo n.º 9
0
mitk::ShaderProperty::ShaderProperty( )
{
  AddShaderTypes();
  SetShader( (IdType)0 );
}
Exemplo n.º 10
0
mitk::ShaderProperty::ShaderProperty( const IdType& value )
{
  AddShaderTypes();
  SetShader(value);
}
Exemplo n.º 11
0
/* Draws primitives on screen
 */
void D3DRenderer::OnDrawBatch(const Otter::DrawBatch& batch)
{
	mModel = *(D3DXMATRIX*)&batch.mTransform;

	LPDIRECT3DTEXTURE9 texture = mTextureManager.GetTexture(batch.mTextureID); 

	const Otter::Property* pSetShader = batch.mProperties.GetProperty(SHADER_SET);
	if(pSetShader)
	{
		uint32 newShader = (uint32)pSetShader->mData;
		SetShader(newShader, false);
	}
				
	Shader& shader = mShaders[mCurrentShaderID];

	const Otter::Property* pShaderParamCount = batch.mProperties.GetProperty(SHADER_PARAM_COUNT);
	if(pShaderParamCount)
	{
		uint32 cnt = (uint32)pShaderParamCount->mData;
		for(uint32 i = 0; i < cnt; i++)
		{
			const Otter::Property* pParamType = batch.mProperties.GetProperty(SHADER_PARAM_TYPE + i);
			const Otter::Property* pParamID = batch.mProperties.GetProperty(SHADER_PARAM_ID + i);
			const Otter::Property* pParamData = batch.mProperties.GetProperty(SHADER_PARAM_DATA + i);
			const Otter::Property* pParamDataLen = batch.mProperties.GetProperty(SHADER_PARAM_DATA_LEN + i);

			if(pParamType == NULL || pParamID == NULL || pParamData == NULL)
				break;

			if(pParamType->mData == 0) // Texture
			{
				shader.mEffect->SetTexture(shader.GetParameterHandle((int)pParamID->mData), mTextureManager.GetTexture(pParamData->mData));
			}
			else if(pParamType->mData == 1 && pParamDataLen != NULL) // Float Array
			{
				shader.mEffect->SetFloatArray(shader.GetParameterHandle((int)pParamID->mData), (float*)pParamData->mData, (int)pParamDataLen->mData);
			}
			else if(pParamType->mData == 2 && pParamDataLen != NULL) // Int Array
			{
				shader.mEffect->SetIntArray(shader.GetParameterHandle((int)pParamID->mData), (int*)pParamData->mData, (int)pParamDataLen->mData);
			}
			else if(pParamType->mData == 3) // Int
			{
				shader.mEffect->SetInt(shader.GetParameterHandle((int)pParamID->mData), (int)pParamData->mData);
			}
		}
	}

	const Otter::Property* pTechnique = batch.mProperties.GetProperty(SHADER_TECHNIQUE);
	if(pTechnique)
		shader.mEffect->SetTechnique((const char*)pTechnique->mData);
	else
		shader.mEffect->SetTechnique(texture != NULL ? "WithTexture" : "WithoutTexture");

	shader.mEffect->SetTexture("DIFFUSE_TEXTURE", texture);
	shader.mEffect->SetMatrix("MATRIX_MODEL", &mModel);

	float lodBias = -1.0f;
	if(texture != NULL)
	{
		int numLevels = texture->GetLevelCount();
		mD3DDevice->SetSamplerState(0, D3DSAMP_MIPMAPLODBIAS, *(DWORD*)&lodBias);
	}

	if(batch.mRenderFlags & Otter::kRender_Wireframe)
	{
		mD3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
	}
	else 
	{
		mD3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); 
	}


	uint32 passes = 0;
	shader.mEffect->Begin(&passes, D3DXFX_DONOTSAVESAMPLERSTATE);
	{
		for(uint32 pass = 0; pass < passes; pass++)
		{
			shader.mEffect->BeginPass(pass);

			D3DPRIMITIVETYPE primType = D3DPT_TRIANGLELIST;
			switch(batch.mPrimitiveType)
			{
			case Otter::kPrim_TriangleFan:
				{
					primType = D3DPT_TRIANGLEFAN;
					break;
				}
			case Otter::kPrim_TriangleStrip:
				{
					primType = D3DPT_TRIANGLESTRIP;
					break;
				}
			}

			mD3DDevice->DrawPrimitive(primType, batch.mVertexStartIndex, batch.mPrimitiveCount);

			shader.mEffect->EndPass();
		}
	}
	shader.mEffect->End();
}
Exemplo n.º 12
0
Band::Band(const unsigned int max_length)
    : band_width_(0.2), max_length_(max_length) {
  SetShader();
  vertices_v_.reserve(max_length);
}
Exemplo n.º 13
0
void cRendererGLES2::SetShader( const EEGLES2_SHADERS& Shader ) {
	SetShader( mShaders[ Shader ] );
}
Exemplo n.º 14
0
void Graphic::DrawTexture(TEXTURE_ID id, const Vector2 pos, Vector2 size, D3DXCOLOR color, Vector2 center, float left, float top, float right, float bottom, float angle){
	SetShader(SHADER_ID::TEXTURE_SHADER);
	Matrix4 mat = RCMatrix4::Identity();
	texture[id].Draw(vector3(pos.x, pos.y, 0), vector3(size.x, size.y, 0), vector3(center.x, center.y, 0.0f), left, top, right, bottom, &shader[sID], color, angle);
	animBind = false;
}
Exemplo n.º 15
0
/*
================
idLight::BecomeBroken
================
*/
void idLight::BecomeBroken( idEntity *activator )
{
    const char *damageDefName;

    fl.takedamage = false;

    if ( brokenModel.Length() )
    {
        SetModel( brokenModel );

        if ( !spawnArgs.GetBool( "nonsolid" ) )
        {
            GetPhysics()->SetClipModel( new idClipModel( brokenModel.c_str() ), 1.0f );
            GetPhysics()->SetContents( CONTENTS_SOLID );
        }
    }
    else if ( spawnArgs.GetBool( "hideModelOnBreak" ) )
    {
        SetModel( "" );
        GetPhysics()->SetContents( 0 );
    }

    if ( gameLocal.isServer )
    {

        ServerSendEvent( EVENT_BECOMEBROKEN, NULL, true, -1 );

        if ( spawnArgs.GetString( "def_damage", "", &damageDefName ) )
        {
            idVec3 origin = renderEntity.origin + renderEntity.bounds.GetCenter() * renderEntity.axis;
            gameLocal.RadiusDamage( origin, activator, activator, this, this, damageDefName );
        }

    }

    ActivateTargets( activator );

    // offset the start time of the shader to sync it to the game time
    renderEntity.shaderParms[ SHADERPARM_TIMEOFFSET ] = -MS2SEC( gameLocal.time );
    renderLight.shaderParms[ SHADERPARM_TIMEOFFSET ] = -MS2SEC( gameLocal.time );

    // set the state parm
    renderEntity.shaderParms[ SHADERPARM_MODE ] = 1;
    renderLight.shaderParms[ SHADERPARM_MODE ] = 1;

    // if the light has a sound, either start the alternate (broken) sound, or stop the sound
    const char *parm = spawnArgs.GetString( "snd_broken" );
    if ( refSound.shader || ( parm && *parm ) )
    {
        StopSound( SND_CHANNEL_ANY, false );
        const idSoundShader *alternate = refSound.shader ? refSound.shader->GetAltSound() : declManager->FindSound( parm );
        if ( alternate )
        {
            // start it with no diversity, so the leadin break sound plays
            refSound.referenceSound->StartSound( alternate, SND_CHANNEL_ANY, 0.0, 0 );
        }
    }

    parm = spawnArgs.GetString( "mtr_broken" );
    if ( parm && *parm )
    {
        SetShader( parm );
    }

    UpdateVisuals();
}
Exemplo n.º 16
0
void Graphic::DrawFontDirect(FONT_ID id, const Vector2 pos, Vector2 size, float range, std::string s, const Vector3 color, const float alpha, bool center){
	SetShader(SHADER_ID::FONT_SHADER);
	font[id].Draw(pos, size, range, &shader[sID], s, &D3DXCOLOR(color.x, color.y,color.z, alpha),center);
	animBind = false;
}
Exemplo n.º 17
0
const bool Canodumb::Hit(int _damage) {
  (health - _damage < 0) ? health = 0 : health -= _damage;
  SetShader(whiteout);

  return health;
}
Exemplo n.º 18
0
void WINAPI QERApp_ReloadShaderFile (const char *name)
{
  brush_t *b;
  face_t *f;
  brush_t *active_brushes;
  brush_t *selected_brushes;
  brush_t *filtered_brushes;

//  Sys_Printf("TODO: QERApp_ReloadShaderFile\n");

  active_brushes = g_DataTable.m_pfnActiveBrushes ();
  selected_brushes = g_DataTable.m_pfnSelectedBrushes ();
  filtered_brushes = g_DataTable.m_pfnFilteredBrushes ();

#ifdef _DEBUG
  // check the shader name is a reletive path
  // I hacked together a few quick tests to make sure :-)
  if (strstr (name, ":\\") || !strstr (name, "scripts"))
    Sys_Printf ("WARNING: is %s a reletive path to a shader file? (QERApp_ReloadShaderFile\n");
#endif

  // in the actives and global shaders lists, decref and unhook the shaders
  //++timo NOTE: maybe we'd like to keep track of the shaders we are unhooking?
  g_ActiveShaders.ReleaseForShaderFile (name);
  g_Shaders.ReleaseForShaderFile (name);
  // go through a reload of the shader file
  QERApp_LoadShaderFile (name);
  // scan all the brushes, replace all the old ones by refs to their new equivalents
  for (b = active_brushes->next; b != NULL && b != active_brushes; b = b->next)
  {
    if (b->patchBrush && !strcmp (b->pPatch->pShader->getShaderFileName (), name))
      SetShader (b->pPatch);
    else
      for (f = b->brush_faces; f; f = f->next)
	if (!strcmp (f->pShader->getShaderFileName (), name))
	  SetShader (f);
  }
  for (b = selected_brushes->next; b != NULL && b != selected_brushes; b = b->next)
  {
    if (b->patchBrush && !strcmp (b->pPatch->pShader->getShaderFileName (), name))
      SetShader (b->pPatch);
    else
      for (f = b->brush_faces; f; f = f->next)
	if (!strcmp (f->pShader->getShaderFileName (), name))
	  SetShader (f);
  }
  // do that to the filtered brushes as well (we might have some region compiling going on)
  for (b = filtered_brushes->next; b != NULL && b != filtered_brushes; b = b->next)
  {
    if (b->patchBrush && !strcmp (b->pPatch->pShader->getShaderFileName (), name))
      SetShader (b->pPatch);
    else
      for (f = b->brush_faces; f; f = f->next)
	if (!strcmp (f->pShader->getShaderFileName (), name))
	  SetShader (f);
  }
  // call Texture_ShowInUse to clean and display only what's required
  g_ShadersTable.m_pfnTexture_ShowInuse ();
  QERApp_SortActiveShaders ();
  g_FuncTable.m_pfnSysUpdateWindows (W_TEXTURE);
}
Exemplo n.º 19
0
int CMQOMaterial::SetParams( int srcno, ARGBF sceneamb, char* srcchar, int srcleng )
{
	//"肌色" col(1.000 0.792 0.651 1.000) dif(0.490) amb(0.540) emi(0.530) spc(0.020) power(0.00)


//DbgOut( "check!!!: mqomat : SetParams : %d, %s, %d\r\n", srcno, srcchar, srcleng );

	materialno = srcno;

	m_sceneamb = sceneamb;//!!!!!!!!!!!!!!!!!

	char pat[12][20] = 
	{
		"col(",
		"dif(",
		"amb(",
		"emi(",
		"spc(",
		"power(",
		"tex(",
		"alpha(",
		"bump(",
		"shader(",
		"vcol(",
		"\"" //!!!tex, alpha, bumpよりも後でないとだめ。
	};

	int pos = 0;
	int stepnum;
	int ret;

	while( pos < srcleng ){
		while( (pos < srcleng) &&  
		( (*(srcchar + pos) == ' ') || (*(srcchar + pos) == '\t') )
		){
		pos++;
		}

		int cmp;
		int patno, patleng;

		int isfind = 0;

		for( patno = 0; patno < 12; patno++ ){
			if( isfind == 1 )
				break;

			patleng = (int)strlen( pat[patno] );
			if( srcleng - pos >= patleng ){
				cmp = strncmp( pat[patno], srcchar + pos, patleng );
				if( cmp == 0 ){
					isfind = 1;
					switch( patno ){
					case 0:
						ret = SetCol( srcchar, pos, srcleng, &stepnum );
						if( ret )
							return ret;
						break;
					case 1:
						ret = SetDif( srcchar, pos, srcleng, &stepnum );
						if( ret )
							return ret;
						break;
					case 2:
						ret = SetAmb( srcchar, pos, srcleng, &stepnum );
						if( ret )
							return ret;
						break;
					case 3:
						ret = SetEmi( srcchar, pos, srcleng, &stepnum );
						if( ret )
							return ret;
						break;
					case 4:
						ret = SetSpc( srcchar, pos, srcleng, &stepnum );
						if( ret )
							return ret;
						break;
					case 5:
						ret = SetPower( srcchar, pos, srcleng, &stepnum );
						if( ret )
							return ret;
						break;
					case 6:
						ret = SetTex( srcchar, pos, srcleng, &stepnum );
						if( ret )
							return ret;
						break;
					case 7:
						ret = SetAlpha( srcchar, pos, srcleng, &stepnum );
						if( ret )
							return ret;
						break;
					case 8:
						ret = SetBump( srcchar, pos, srcleng, &stepnum );
						if( ret )
							return ret;
						break;
					case 9:
						ret = SetShader( srcchar, pos, srcleng, &stepnum );
						if( ret )
							return ret;
						break;
					case 10:
						ret = SetVcolFlag( srcchar, pos, srcleng, &stepnum );
						if( ret )
							return ret;
						break;
					case 11:
						//DbgOut( "MQOMaterial : SetParams : SetName %d\n", pos );
						ret = SetName( srcchar, pos, srcleng, &stepnum );
						if( ret )
							return ret;
						break;
					default:
						_ASSERT( 0 );
						return 1;
						break;
					}

				}
			}
		}

		if( isfind == 1 ){
			pos += stepnum;
		}else{
			pos++;
		}

	}

	ret = ConvParamsTo3F();
	_ASSERT( !ret );


	return 0;
}
Exemplo n.º 20
0
bool VertexShaderCache::SetShader(D3DVertexFormat* vertex_format)
{
  if (g_ActiveConfig.bDisableSpecializedShaders)
    return SetUberShader(vertex_format);

  VertexShaderUid uid = GetVertexShaderUid();
  if (last_entry && uid == last_uid)
  {
    if (last_entry->pending)
      return SetUberShader(vertex_format);

    if (!last_entry->shader)
      return false;

    vertex_format->SetInputLayout(last_entry->bytecode);
    D3D::stateman->SetVertexShader(last_entry->shader);
    return true;
  }

  auto iter = vshaders.find(uid);
  if (iter != vshaders.end())
  {
    const VSCacheEntry& entry = iter->second;
    if (entry.pending)
      return SetUberShader(vertex_format);

    last_uid = uid;
    last_entry = &entry;

    GFX_DEBUGGER_PAUSE_AT(NEXT_VERTEX_SHADER_CHANGE, true);
    if (!last_entry->shader)
      return false;

    vertex_format->SetInputLayout(last_entry->bytecode);
    D3D::stateman->SetVertexShader(last_entry->shader);
    return true;
  }

  // Background compiling?
  if (g_ActiveConfig.CanBackgroundCompileShaders())
  {
    // Create a pending entry
    VSCacheEntry entry;
    entry.pending = true;
    vshaders[uid] = entry;

    // Queue normal shader compiling and use ubershader
    g_async_compiler->QueueWorkItem(
        g_async_compiler->CreateWorkItem<VertexShaderCompilerWorkItem>(uid));
    return SetUberShader(vertex_format);
  }

  // Need to compile a new shader
  D3DBlob* bytecode = nullptr;
  ShaderCode code =
      GenerateVertexShaderCode(APIType::D3D, ShaderHostConfig::GetCurrent(), uid.GetUidData());
  D3D::CompileVertexShader(code.GetBuffer(), &bytecode);
  if (!InsertByteCode(uid, bytecode))
  {
    SAFE_RELEASE(bytecode);
    return false;
  }

  g_vs_disk_cache.Append(uid, bytecode->Data(), bytecode->Size());
  bytecode->Release();
  return SetShader(vertex_format);
}
Exemplo n.º 21
0
bool Lighting::EvaluateLighting(LPDIRECT3DDEVICE9 Device, RenderMesh *RMesh, ShaderMat *Mat)
{
	D3DLIGHT9		DLight;
	D3DXVECTOR3		Pos,Dir;
	RenderLight		Light;
	int				i;

	if(!Device || !RMesh || !m_Ready)
	{
		return(false);
	}

	m_Device = Device;
	//
	//	Setup
	//
//	The force update is used when the scene is in an unknwon state - usual after a an undo of a light
	if(m_forceUpdate)
		GetLightsFromScene();

	UpdateLights();
	SetRenderStates();

//	m_Lights.clear();

	if(m_Lights.size())
	{
		for(i=0; i < m_Lights.size(); i++)
		{
			SetShader(m_Lights[i].m_Type,Mat);
			SetMaterialConst(Mat);
			SetShaderConst(i,&m_Lights[i],Mat);
			RMesh->Render(m_Device);
		}
	}
	else
	{
		m_Device->GetLight(0,&DLight);

		Light.m_Dir = Point3(-DLight.Direction.x,
							 -DLight.Direction.y,
							 -DLight.Direction.z);
				
		Light.m_Color.x	= DLight.Diffuse.r;
		Light.m_Color.y	= DLight.Diffuse.g;
		Light.m_Color.z	= DLight.Diffuse.b;

		Light.m_Pos.x	= DLight.Position.x;
		Light.m_Pos.y	= DLight.Position.y;
		Light.m_Pos.z	= DLight.Position.z;

		Light.m_InnerRange	= 1.0f;
		Light.m_OuterRange	= 1.0f / (DLight.Range * 2.0f);

		SetShader(LIGHT_DIR,Mat);
		SetMaterialConst(Mat);
		SetShaderConst(0,&Light,Mat);
		RMesh->Render(m_Device);
	}


	return(true);

}
Exemplo n.º 22
0
 Material(Shader::PShader shader) {
     SetShader(shader);
 }
Exemplo n.º 23
0
int ContextD3D11::PushVertexShader(VertexShader* ptr) {
  if (shaders_.vs != nullptr)
    shaders_.vs_list.push_back(shaders_.vs);
  SetShader(*ptr);
  return S_OK;
}
Exemplo n.º 24
0
void nuiDrawContext::StopRendering()
{
  SetTexture(NULL);
  SetShader(NULL, NULL);
}
Exemplo n.º 25
0
int ContextD3D11::PushPixelShader(PixelShader* ptr) {
  if (shaders_.ps != nullptr)
    shaders_.ps_list.push_back(shaders_.ps);
  SetShader(*ptr);
  return S_OK;
}
Exemplo n.º 26
0
/*
================
idLight::Event_SetShader
================
*/
void idLight::Event_SetShader( const char *shadername ) {
	SetShader( shadername );
}
Exemplo n.º 27
0
void FRCPassPostProcessDeferredDecals::Process(FRenderingCompositePassContext& Context)
{
	FRHICommandListImmediate& RHICmdList = Context.RHICmdList;

	const bool bShaderComplexity = Context.View.Family->EngineShowFlags.ShaderComplexity;
	const bool bDBuffer = IsDBufferEnabled();
	const bool bStencilSizeThreshold = CVarStencilSizeThreshold.GetValueOnRenderThread() >= 0;

	SCOPED_DRAW_EVENT(RHICmdList, PostProcessDeferredDecals);

	if(RenderStage == 0)
	{
		// before BasePass, only if DBuffer is enabled

		check(bDBuffer);

		// DBuffer: Decal buffer
		FPooledRenderTargetDesc Desc(FPooledRenderTargetDesc::Create2DDesc(GSceneRenderTargets.GBufferA->GetDesc().Extent, 
			PF_B8G8R8A8, 
			TexCreate_None, 
			TexCreate_ShaderResource | TexCreate_RenderTargetable,
			false));

		if(!GSceneRenderTargets.DBufferA)
		{
			GRenderTargetPool.FindFreeElement(Desc, GSceneRenderTargets.DBufferA, TEXT("DBufferA"));
		}

		if(!GSceneRenderTargets.DBufferB)
		{
			GRenderTargetPool.FindFreeElement(Desc, GSceneRenderTargets.DBufferB, TEXT("DBufferB"));
		}

		Desc.Format = PF_R8G8;

		if(!GSceneRenderTargets.DBufferC)
		{
			GRenderTargetPool.FindFreeElement(Desc, GSceneRenderTargets.DBufferC, TEXT("DBufferC"));
		}

		// we assume views are non overlapping, then we need to clear only once in the beginning, otherwise we would need to set scissor rects
		// and don't get FastClear any more.
		bool bFirstView = Context.View.Family->Views[0] == &Context.View;

		if(bFirstView)
		{
			SCOPED_DRAW_EVENT(RHICmdList, DBufferClear);

			// could be optimized
			SetRenderTarget(RHICmdList, GSceneRenderTargets.DBufferA->GetRenderTargetItem().TargetableTexture, FTextureRHIParamRef());
			RHICmdList.Clear(true, FLinearColor(0, 0, 0, 1), false, (float)ERHIZBuffer::FarPlane, false, 0, FIntRect());
			SetRenderTarget(RHICmdList, GSceneRenderTargets.DBufferB->GetRenderTargetItem().TargetableTexture, FTextureRHIParamRef());
			// todo: some hardware would like to have 0 or 1 for faster clear, we chose 128/255 to represent 0 (8 bit cannot represent 0.5f)
			RHICmdList.Clear(true, FLinearColor(128.0f / 255.0f, 128.0f / 255.0f, 128.0f / 255.0f, 1), false, (float)ERHIZBuffer::FarPlane, false, 0, FIntRect());
			SetRenderTarget(RHICmdList, GSceneRenderTargets.DBufferC->GetRenderTargetItem().TargetableTexture, FTextureRHIParamRef());
			// R:roughness, G:roughness opacity
			RHICmdList.Clear(true, FLinearColor(0, 1, 0, 1), false, (float)ERHIZBuffer::FarPlane, false, 0, FIntRect());
		}
	}

	// this cast is safe as only the dedicated server implements this differently and this pass should not be executed on the dedicated server
	const FViewInfo& View = Context.View;
	const FSceneViewFamily& ViewFamily = *(View.Family);
	FScene& Scene = *(FScene*)ViewFamily.Scene;

	if(!Scene.Decals.Num())
	{
		// to avoid the stats showing up
		return;
	}

	TArray<FTransientDecalRenderData, SceneRenderingAllocator> SortedDecals;
	SortedDecals.Empty(Scene.Decals.Num());

	// Build a list of decals that need to be rendered for this view in SortedDecals
	for (TSparseArray<FDeferredDecalProxy*>::TConstIterator It(Scene.Decals); It; ++It)
	{
		FDeferredDecalProxy* DecalProxy = *It;
		bool bIsShown = true;

		// Handle the decal actor having bHidden set when we are in the editor, in G mode
#if WITH_EDITOR
		if (View.Family->EngineShowFlags.Editor)
#endif
		{
			if (!DecalProxy->DrawInGame)
			{
				bIsShown = false;
			}
		}

		const FMatrix ComponentToWorldMatrix = DecalProxy->ComponentTrans.ToMatrixWithScale();

		// can be optimized as we test against a sphere around the box instead of the box itself
		const float ConservativeRadius = FMath::Sqrt(
			ComponentToWorldMatrix.GetScaledAxis( EAxis::X ).SizeSquared() * FMath::Square(GDefaultDecalSize.X) +
			ComponentToWorldMatrix.GetScaledAxis( EAxis::Y ).SizeSquared() * FMath::Square(GDefaultDecalSize.Y) +
			ComponentToWorldMatrix.GetScaledAxis( EAxis::Z ).SizeSquared() * FMath::Square(GDefaultDecalSize.Z));

		// can be optimized as the test is too conservative (sphere instead of OBB)
		if(ConservativeRadius < SMALL_NUMBER || !View.ViewFrustum.IntersectSphere(ComponentToWorldMatrix.GetOrigin(), ConservativeRadius))
		{
			bIsShown = false;
		}

		if (bIsShown)
		{
			FTransientDecalRenderData Data(Scene, DecalProxy);

			uint32 DecalRenderStage = ComputeRenderStage(Data.DecalBlendMode);

			// we could do this test earlier to avoid the decal intersection but getting DecalBlendMode also costs
			if (Context.View.Family->EngineShowFlags.ShaderComplexity || RenderStage == DecalRenderStage)
			{
				SortedDecals.Add(Data);
			}
		}
	}

	if(SortedDecals.Num() > 0)
	{
		FIntRect SrcRect = View.ViewRect;
		FIntRect DestRect = View.ViewRect;

		bool bStencilDecals = true;

#if DBUFFER_DONT_USE_STENCIL_YET
		if(RenderStage == 0)
		{
			bStencilDecals = false;
		}
#endif

		// Setup a stencil mask to prevent certain pixels from receiving deferred decals
		if(bStencilDecals)
		{
			StencilDecalMask(RHICmdList, View);
		}

		// Sort by sort order to allow control over composited result
		// Then sort decals by state to reduce render target switches
		// Also sort by component since Sort() is not stable
		struct FCompareFTransientDecalRenderData
		{
			FORCEINLINE bool operator()( const FTransientDecalRenderData& A, const FTransientDecalRenderData& B ) const
			{
				if (B.DecalProxy->SortOrder != A.DecalProxy->SortOrder)
				{ 
					return A.DecalProxy->SortOrder < B.DecalProxy->SortOrder;
				}
				if (B.DecalBlendMode != A.DecalBlendMode)
				{
					return (int32)B.DecalBlendMode < (int32)A.DecalBlendMode;
				}
				if (B.bHasNormal != A.bHasNormal)
				{
					return B.bHasNormal < A.bHasNormal;
				}
				// Batch decals with the same material together
				if (B.MaterialProxy != A.MaterialProxy )
				{
					return B.MaterialProxy < A.MaterialProxy;
				}
				return (PTRINT)B.DecalProxy->Component < (PTRINT)A.DecalProxy->Component;
			}
		};

		// Sort decals by blend mode to reduce render target switches
		SortedDecals.Sort( FCompareFTransientDecalRenderData() );

		// optimization to have less state changes
		int32 LastDecalBlendMode = -1;
		int32 LastDecalHasNormal = -1; // Decal state can change based on its normal property.(SM5)
		ERenderTargetMode LastRenderTargetMode = RTM_Unknown;
		int32 WasInsideDecal = -1;
		const ERHIFeatureLevel::Type SMFeatureLevel = Context.GetFeatureLevel();

		SCOPED_DRAW_EVENT(RHICmdList, Decals);
		INC_DWORD_STAT_BY(STAT_Decals, SortedDecals.Num());

		enum EDecalResolveBufferIndex
		{
			SceneColorIndex,
			GBufferAIndex,
			GBufferBIndex,
			GBufferCIndex,
			DBufferAIndex,
			DBufferBIndex,
			DBufferCIndex,
			ResolveBufferMax,
		};
	
		FTextureRHIParamRef TargetsToResolve[ResolveBufferMax] = { nullptr };

		for (int32 DecalIndex = 0, DecalCount = SortedDecals.Num(); DecalIndex < DecalCount; DecalIndex++)
		{
			const FTransientDecalRenderData& DecalData = SortedDecals[DecalIndex];
			const FDeferredDecalProxy& DecalProxy = *DecalData.DecalProxy;
			const FMatrix ComponentToWorldMatrix = DecalProxy.ComponentTrans.ToMatrixWithScale();

			// Set vertex shader params
			const FMaterialShaderMap* MaterialShaderMap = DecalData.MaterialResource->GetRenderingThreadShaderMap();
			
			FScaleMatrix DecalScaleTransform(GDefaultDecalSize);
			FTranslationMatrix PreViewTranslation(View.ViewMatrices.PreViewTranslation);
			FMatrix FrustumComponentToClip = DecalScaleTransform * ComponentToWorldMatrix * PreViewTranslation * View.ViewMatrices.TranslatedViewProjectionMatrix;

			// can be optimized as we test against a sphere around the box instead of the box itself
			const float ConservativeRadius = FMath::Sqrt(
				ComponentToWorldMatrix.GetScaledAxis( EAxis::X ).SizeSquared() * FMath::Square(GDefaultDecalSize.X) +
				ComponentToWorldMatrix.GetScaledAxis( EAxis::Y ).SizeSquared() * FMath::Square(GDefaultDecalSize.Y) +
				ComponentToWorldMatrix.GetScaledAxis( EAxis::Z ).SizeSquared() * FMath::Square(GDefaultDecalSize.Z));

			EDecalBlendMode DecalBlendMode = DecalData.DecalBlendMode;

			bool bStencilThisDecal = bStencilDecals;
			
#if DBUFFER_DONT_USE_STENCIL_YET
			if(ComputeRenderStage(DecalBlendMode) == 0)
			{
				bStencilThisDecal = false;
			}
#endif				

			ERenderTargetMode CurrentRenderTargetMode = ComputeRenderTargetMode(DecalBlendMode);

			if(bShaderComplexity)
			{
				CurrentRenderTargetMode = RTM_SceneColor;
				// we want additive blending for the ShaderComplexity mode
				DecalBlendMode = DBM_Emissive;
			}

			// fewer rendertarget switches if possible
			if(CurrentRenderTargetMode != LastRenderTargetMode)
			{
				LastRenderTargetMode = CurrentRenderTargetMode;

				switch(CurrentRenderTargetMode)
				{
					case RTM_SceneColorAndGBuffer:
						{							
							TargetsToResolve[SceneColorIndex] = GSceneRenderTargets.GetSceneColor()->GetRenderTargetItem().TargetableTexture;
							TargetsToResolve[GBufferAIndex] = GSceneRenderTargets.GBufferA->GetRenderTargetItem().TargetableTexture;
							TargetsToResolve[GBufferBIndex] = GSceneRenderTargets.GBufferB->GetRenderTargetItem().TargetableTexture;
							TargetsToResolve[GBufferCIndex] = GSceneRenderTargets.GBufferC->GetRenderTargetItem().TargetableTexture;
							
							SetRenderTargets(RHICmdList, 4, TargetsToResolve, GSceneRenderTargets.GetSceneDepthSurface(), ESimpleRenderTargetMode::EExistingColorAndDepth, FExclusiveDepthStencil::DepthRead_StencilWrite);
						}
						break;

					case RTM_GBufferNormal:
						TargetsToResolve[GBufferAIndex] = GSceneRenderTargets.GBufferA->GetRenderTargetItem().TargetableTexture;
						SetRenderTarget(RHICmdList, TargetsToResolve[GBufferAIndex], GSceneRenderTargets.GetSceneDepthSurface(), ESimpleRenderTargetMode::EExistingColorAndDepth, FExclusiveDepthStencil::DepthRead_StencilWrite);
						break;
					
					case RTM_SceneColor:
						TargetsToResolve[SceneColorIndex] = GSceneRenderTargets.GetSceneColor()->GetRenderTargetItem().TargetableTexture;
						SetRenderTarget(RHICmdList, TargetsToResolve[SceneColorIndex], GSceneRenderTargets.GetSceneDepthSurface(), ESimpleRenderTargetMode::EExistingColorAndDepth, FExclusiveDepthStencil::DepthRead_StencilWrite);
						break;

					case RTM_DBuffer:
						{							
							TargetsToResolve[DBufferAIndex] = GSceneRenderTargets.DBufferA->GetRenderTargetItem().TargetableTexture;
							TargetsToResolve[DBufferBIndex] = GSceneRenderTargets.DBufferB->GetRenderTargetItem().TargetableTexture;
							TargetsToResolve[DBufferCIndex] = GSceneRenderTargets.DBufferC->GetRenderTargetItem().TargetableTexture;
							SetRenderTargets(RHICmdList, 3, &TargetsToResolve[DBufferAIndex], GSceneRenderTargets.GetSceneDepthSurface(), ESimpleRenderTargetMode::EExistingColorAndDepth, FExclusiveDepthStencil::DepthRead_StencilWrite);
						}
						break;

					default:
						check(0);	
						break;
				}
				Context.SetViewportAndCallRHI(DestRect);

				// we need to reset the stream source after any call to SetRenderTarget (at least for Metal, which doesn't queue up VB assignments)
				RHICmdList.SetStreamSource(0, GUnitCubeVertexBuffer.VertexBufferRHI, sizeof(FVector4), 0);
			}

			bool bThisDecalUsesStencil = false;

			if (bStencilThisDecal)
			{
				if (bStencilSizeThreshold)
				{
					// note this is after a SetStreamSource (in if CurrentRenderTargetMode != LastRenderTargetMode) call as it needs to get the VB input
					bThisDecalUsesStencil = RenderPreStencil(Context, MaterialShaderMap, ComponentToWorldMatrix, FrustumComponentToClip);

					WasInsideDecal = -1;
					LastDecalBlendMode = -1;
				}
			}

			const bool bBlendStateChange = DecalBlendMode != LastDecalBlendMode;// Has decal mode changed.
			const bool bDecalNormalChanged = GSupportsSeparateRenderTargetBlendState && // has normal changed for SM5 stain/translucent decals?
							(DecalBlendMode == DBM_Translucent || DecalBlendMode == DBM_Stain) &&
							(int32)DecalData.bHasNormal != LastDecalHasNormal;

			// fewer blend state changes if possible
			if (bBlendStateChange || bDecalNormalChanged)
			{
				LastDecalBlendMode = DecalBlendMode;
				LastDecalHasNormal = (int32)DecalData.bHasNormal;

				SetDecalBlendState(RHICmdList, SMFeatureLevel, RenderStage, (EDecalBlendMode)LastDecalBlendMode, DecalData.bHasNormal);
			}

			{
				TShaderMapRef<FDeferredDecalVS> VertexShader(Context.GetShaderMap());
				SetShader(Context, bShaderComplexity, DecalData, *VertexShader);

				VertexShader->SetParameters(RHICmdList, View, FrustumComponentToClip);

				const int32 IsInsideDecal = ((FVector)View.ViewMatrices.ViewOrigin - ComponentToWorldMatrix.GetOrigin()).SizeSquared() < FMath::Square(ConservativeRadius * 1.05f + View.NearClippingDistance * 2.0f) + ( bThisDecalUsesStencil ) ? 2 : 0;
				if ( WasInsideDecal != IsInsideDecal )
				{
					WasInsideDecal = IsInsideDecal;
					if ( !(IsInsideDecal & 1) )
					{
						// Render backfaces with depth tests disabled since the camera is inside (or close to inside) the light function geometry
						RHICmdList.SetRasterizerState(View.bReverseCulling ? TStaticRasterizerState<FM_Solid, CM_CCW>::GetRHI() : TStaticRasterizerState<FM_Solid, CM_CW>::GetRHI());
						if(bStencilDecals)
						{
							// Enable stencil testing, only write to pixels with stencil of 0
							if ( bThisDecalUsesStencil )
							{
								RHICmdList.SetDepthStencilState(TStaticDepthStencilState<
									false,CF_Always,
									true,CF_Equal,SO_Zero,SO_Zero,SO_Zero,
									true,CF_Equal,SO_Zero,SO_Zero,SO_Zero,
									0xff, 0x7f
								>::GetRHI(), 1);
							}
							else
							{
								RHICmdList.SetDepthStencilState(TStaticDepthStencilState<
									false,CF_Always,
									true,CF_Equal,SO_Keep,SO_Keep,SO_Keep,
									false,CF_Always,SO_Keep,SO_Keep,SO_Keep,
									0x80,0x00>::GetRHI(), 0);
							}
						}
						else
						{
							RHICmdList.SetDepthStencilState(TStaticDepthStencilState<false, CF_Always, true>::GetRHI(), 0);
						}
					}
					else
					{
						// Render frontfaces with depth tests on to get the speedup from HiZ since the camera is outside the light function geometry
						if(bStencilDecals)
						{
							// Render frontfaces with depth tests on to get the speedup from HiZ since the camera is outside the light function geometry
							// Enable stencil testing, only write to pixels with stencil of 0
							if ( bThisDecalUsesStencil )
							{
								RHICmdList.SetDepthStencilState(TStaticDepthStencilState<
									false,CF_DepthNearOrEqual,
									true,CF_Equal,SO_Zero,SO_Zero,SO_Zero,
									true,CF_Equal,SO_Zero,SO_Zero,SO_Zero,
									0xff, 0x7f
								>::GetRHI(), 1);
							}
							else
							{
								RHICmdList.SetDepthStencilState(TStaticDepthStencilState<
									false,CF_DepthNearOrEqual,
									true,CF_Equal,SO_Keep,SO_Keep,SO_Keep,
									false,CF_Always,SO_Keep,SO_Keep,SO_Keep,
									0x80,0x00>::GetRHI(), 0);
							}
							RHICmdList.SetRasterizerState(View.bReverseCulling ? TStaticRasterizerState<FM_Solid, CM_CW>::GetRHI() : TStaticRasterizerState<FM_Solid, CM_CCW>::GetRHI());
						}
						else
						{
							RHICmdList.SetDepthStencilState(TStaticDepthStencilState<false, CF_DepthNearOrEqual>::GetRHI(), 0);
						}
						RHICmdList.SetRasterizerState(View.bReverseCulling ? TStaticRasterizerState<FM_Solid, CM_CW>::GetRHI() : TStaticRasterizerState<FM_Solid, CM_CCW>::GetRHI());
					}
				}

				RHICmdList.DrawIndexedPrimitive(GUnitCubeIndexBuffer.IndexBufferRHI, PT_TriangleList, 0, 0, 8, 0, GUnitCubeIndexBuffer.GetIndexCount() / 3, 1);
			}
		}

		// we don't modify stencil but if out input was having stencil for us (after base pass - we need to clear)
		// Clear stencil to 0, which is the assumed default by other passes
		RHICmdList.Clear(false, FLinearColor::White, false, (float)ERHIZBuffer::FarPlane, true, 0, FIntRect());

		// resolve the targets we wrote to.
		FResolveParams ResolveParams;
		for (int32 i = 0; i < ResolveBufferMax; ++i)
		{
			if (TargetsToResolve[i])
			{
				RHICmdList.CopyToResolveTarget(TargetsToResolve[i], TargetsToResolve[i], true, ResolveParams);
			}
		}		
	}

	if(RenderStage == 0)
	{
		// before BasePass
		GRenderTargetPool.VisualizeTexture.SetCheckPoint(RHICmdList, GSceneRenderTargets.DBufferA);
		GRenderTargetPool.VisualizeTexture.SetCheckPoint(RHICmdList, GSceneRenderTargets.DBufferB);
		GRenderTargetPool.VisualizeTexture.SetCheckPoint(RHICmdList, GSceneRenderTargets.DBufferC);
	}
}