public override void SetTextureBlendMode( int stage, LayerBlendModeEx bm )
{
TextureStage tss;
ColorEx manualD3D;
// choose type of blend.
switch ( bm.blendType )
{
case LayerBlendType.Color:
tss = TextureStage.ColorOperation;
break;
case LayerBlendType.Alpha:
tss = TextureStage.AlphaOperation;
break;
default:
throw new AxiomException("Invalid blend type");
}
// set manual factor if required by operation
if (bm.operation == LayerBlendOperationEx.BlendManual)
{
SetRenderState( RenderState.TextureFactor, new Color4( bm.blendFactor, 0.0f, 0.0f, 0.0f ) );
}
// set operation
SetTextureStageState( stage, tss, D3DHelper.ConvertEnum(bm.operation, _deviceManager.ActiveDevice.D3D9DeviceCaps) );
// choose source 1
switch ( bm.blendType )
{
case LayerBlendType.Color:
tss = TextureStage.ColorArg1;
manualD3D = bm.colorArg1;
manualBlendColors[ stage, 0 ] = manualD3D;
break;
case LayerBlendType.Alpha:
tss = TextureStage.AlphaArg1;
manualD3D = manualBlendColors[ stage, 0 ];
manualD3D.a = bm.alphaArg1;
break;
default:
throw new AxiomException("Invalid blend type");
}
// Set manual factor if required
if (bm.source1 == LayerBlendSource.Manual)
{
if (currentCapabilities.HasCapability(Graphics.Capabilities.PerStageConstant))
{
// Per-stage state
SetTextureStageState(stage, TextureStage.Constant, manualD3D.ToARGB());
}
else
{
// Global state
SetRenderState( RenderState.TextureFactor, manualD3D.ToARGB() );
}
}
// set source 1
SetTextureStageState(stage, tss, D3DHelper.ConvertEnum(bm.source1, currentCapabilities.HasCapability(Graphics.Capabilities.PerStageConstant)));
// choose source 2
switch ( bm.blendType )
{
case LayerBlendType.Color:
tss = TextureStage.ColorArg2;
manualD3D = bm.colorArg2;
manualBlendColors[stage, 1] = manualD3D;
break;
case LayerBlendType.Alpha:
tss = TextureStage.AlphaArg2;
manualD3D = manualBlendColors[ stage, 1 ];
manualD3D.a = bm.alphaArg2;
break;
}
// Set manual factor if required
if (bm.source2 == LayerBlendSource.Manual)
{
if (currentCapabilities.HasCapability(Graphics.Capabilities.PerStageConstant))
{
// Per-stage state
SetTextureStageState(stage, TextureStage.Constant, manualD3D.ToARGB());
}
else
{
SetRenderState( RenderState.TextureFactor, manualD3D.ToARGB() );
}
}
// Now set source 2
SetTextureStageState( stage, tss,D3DHelper.ConvertEnum(bm.source2, currentCapabilities.HasCapability(Graphics.Capabilities.PerStageConstant)) );
// Set interpolation factor if lerping
if ( bm.operation != LayerBlendOperationEx.BlendDiffuseColor ||
( _deviceManager.ActiveDevice.D3D9DeviceCaps.TextureOperationCaps & TextureOperationCaps.Lerp ) == 0 )
return;
// choose source 0 (lerp factor)
switch ( bm.blendType )
{
case LayerBlendType.Color:
tss = TextureStage.ColorArg0;
break;
case LayerBlendType.Alpha:
tss = TextureStage.AlphaArg0;
break;
}
SetTextureStageState(stage, tss, TextureArgument.Diffuse);
}