Ejemplo n.º 1
0
void Material::Draw(PolygonGroup * group, InstanceMaterialState * instanceMaterialState)
{
	if(!RenderManager::Instance()->GetOptions()->IsOptionEnabled(RenderOptions::MATERIAL_DRAW))
	{
		return;
	}

	if(isTranslucent && !RenderManager::Instance()->GetOptions()->IsOptionEnabled(RenderOptions::TRANSPARENT_DRAW))
	{
		return;
	}

	if(!isTranslucent && !RenderManager::Instance()->GetOptions()->IsOptionEnabled(RenderOptions::OPAQUE_DRAW))
	{
		return;
	}

	//Dizz: uniformFogDensity != -1 is a check if fog is inabled in shader
	if(isFogEnabled && (uniformFogDensity != -1) && !RenderManager::Instance()->GetOptions()->IsOptionEnabled(RenderOptions::FOG_ENABLE))
	{
		RebuildShader();
	}

	if(isFogEnabled && (uniformFogDensity == -1) && RenderManager::Instance()->GetOptions()->IsOptionEnabled(RenderOptions::FOG_ENABLE))
	{
		RebuildShader();
	}

	RenderManager::Instance()->SetRenderData(group->renderDataObject);

	eBlendMode oldSrc;
	eBlendMode oldDst;
	if(isAlphablend)
	{
		oldSrc = RenderManager::Instance()->GetSrcBlend();
		oldDst = RenderManager::Instance()->GetDestBlend();
	}

	PrepareRenderState(instanceMaterialState);

    // TODO: rethink this code
    if (group->renderDataObject->GetIndexBufferID() != 0)
    {
        RenderManager::Instance()->HWDrawElements(PRIMITIVETYPE_TRIANGLELIST, group->indexCount, EIF_16, 0);
    }
    else
    {
        RenderManager::Instance()->HWDrawElements(PRIMITIVETYPE_TRIANGLELIST, group->indexCount, EIF_16, group->indexArray);
    }

    
	//RenderManager::Instance()->SetTexture(0, 1); 
	//RenderManager::Instance()->SetState(RenderStateBlock::DEFAULT_3D_STATE);
	//if(isAlphablend)
	//{
	//	RenderManager::Instance()->SetBlendMode(oldSrc, oldDst);
	//}
}
Ejemplo n.º 2
0
void Material::Draw(PolygonGroup * group, InstanceMaterialState * instanceMaterialState)
{
	if(!RenderManager::Instance()->GetOptions()->IsOptionEnabled(RenderOptions::MATERIAL_DRAW))
	{
		return;
	}

	if(isOpaque && !RenderManager::Instance()->GetOptions()->IsOptionEnabled(RenderOptions::OPAQUE_DRAW))
	{
		return;
	}

	//Dizz: uniformFogDensity != -1 is a check if fog is inabled in shader
	if(isFogEnabled && (uniformFogDensity != -1) && !RenderManager::Instance()->GetOptions()->IsOptionEnabled(RenderOptions::FOG_ENABLE))
	{
		RebuildShader();
	}

	if(isFogEnabled && (uniformFogDensity == -1) && RenderManager::Instance()->GetOptions()->IsOptionEnabled(RenderOptions::FOG_ENABLE))
	{
		RebuildShader();
	}

	RenderManager::Instance()->SetRenderData(group->renderDataObject);

	eBlendMode oldSrc;
	eBlendMode oldDst;
	if(isAlphablend)
	{
		oldSrc = RenderManager::Instance()->GetSrcBlend();
		oldDst = RenderManager::Instance()->GetDestBlend();
	}

	PrepareRenderState();

    if (instanceMaterialState)
    {
        Camera * camera = scene->GetCurrentCamera();
        LightNode * lightNode0 = instanceMaterialState->GetLight(0);
        if (lightNode0 && camera)
        {
            if (uniformLightPosition0 != -1)
            {
                const Matrix4 & matrix = camera->GetMatrix();
                Vector3 lightPosition0InCameraSpace = lightNode0->GetPosition() * matrix;
                
                shader->SetUniformValue(uniformLightPosition0, lightPosition0InCameraSpace); 
            }
            if (uniformMaterialLightAmbientColor != -1)
            {
                shader->SetUniformValue(uniformMaterialLightAmbientColor, lightNode0->GetAmbientColor() * GetAmbientColor());
            }
            if (uniformMaterialLightDiffuseColor != -1)
            {
                shader->SetUniformValue(uniformMaterialLightDiffuseColor, lightNode0->GetDiffuseColor() * GetDiffuseColor());
            }
            if (uniformMaterialLightSpecularColor != -1)
            {
                shader->SetUniformValue(uniformMaterialLightSpecularColor, lightNode0->GetSpecularColor() * GetSpecularColor());
            }
            if (uniformMaterialSpecularShininess != -1)
            {
                shader->SetUniformValue(uniformMaterialSpecularShininess, shininess);
            }
            
            if (uniformLightIntensity0 != -1)
            {
                shader->SetUniformValue(uniformLightIntensity0, lightNode0->GetIntensity());
            }
            if (uniformLightAttenuationQ != -1)
            {
                //shader->SetUniformValue(uniformLightAttenuationQ, lightNode0->GetAttenuation());
            }
        }
    }
    
    // TODO: rethink this code
    if (group->renderDataObject->GetIndexBufferID() != 0)
	{
		RenderManager::Instance()->HWDrawElements(PRIMITIVETYPE_TRIANGLELIST, group->indexCount, EIF_16, 0);
	}else
	{
		RenderManager::Instance()->HWDrawElements(PRIMITIVETYPE_TRIANGLELIST, group->indexCount, EIF_16, group->indexArray);
	}
    
	RenderManager::Instance()->SetTexture(0, 1); 
	RenderManager::Instance()->SetState(RenderStateBlock::DEFAULT_3D_STATE);
	if(isAlphablend)
	{
		RenderManager::Instance()->SetBlendMode(oldSrc, oldDst);
	}
}