3 * Copyright (c) 2007-2010 SlimDX Group
\r
5 * Permission is hereby granted, free of charge, to any person obtaining a copy
\r
6 * of this software and associated documentation files (the "Software"), to deal
\r
7 * in the Software without restriction, including without limitation the rights
\r
8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
\r
9 * copies of the Software, and to permit persons to whom the Software is
\r
10 * furnished to do so, subject to the following conditions:
\r
12 * The above copyright notice and this permission notice shall be included in
\r
13 * all copies or substantial portions of the Software.
\r
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
\r
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
\r
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
\r
18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
\r
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
\r
20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
\r
27 #include "../ComObject.h"
\r
28 #include "../Math/Matrix.h"
\r
29 #include "../DataStream.h"
\r
30 #include "../Utilities.h"
\r
31 #include "../SlimDXException.h"
\r
35 #include "PixelShader9.h"
\r
36 #include "VertexShader9.h"
\r
37 #include "Texture.h"
\r
38 #include "Effect9.h"
\r
39 #include "EffectStateManager.h"
\r
41 using namespace System;
\r
42 using namespace System::Runtime::InteropServices;
\r
48 IEffectStateManagerShim::IEffectStateManagerShim( IEffectStateManager^ wrappedInterface, Effect^ effect )
\r
50 m_WrappedInterface = wrappedInterface;
\r
56 HRESULT IEffectStateManagerShim::QueryInterface( const IID &iid, LPVOID *ppv )
\r
58 if( iid == IID_ID3DXEffectStateManager )
\r
61 *reinterpret_cast<ID3DXEffectStateManager**>( ppv ) = this;
\r
68 ULONG IEffectStateManagerShim::AddRef()
\r
73 ULONG IEffectStateManagerShim::Release()
\r
75 if( --refCount == 0 )
\r
80 HRESULT IEffectStateManagerShim::LightEnable( DWORD Index, BOOL Enable )
\r
84 m_WrappedInterface->EnableLight( Index, Enable > 0 );
\r
86 catch( SlimDXException^ ex)
\r
88 return ex->ResultCode.Code;
\r
98 HRESULT IEffectStateManagerShim::SetFVF( DWORD FVF )
\r
102 m_WrappedInterface->SetFVF( static_cast<VertexFormat>( FVF ) );
\r
104 catch( SlimDXException^ ex)
\r
106 return ex->ResultCode.Code;
\r
108 catch( Exception^ )
\r
116 HRESULT IEffectStateManagerShim::SetLight( DWORD index, const D3DLIGHT9* pLight )
\r
121 light.Ambient = Color4::FromUnmanaged( pLight->Ambient );
\r
122 light.Diffuse = Color4::FromUnmanaged( pLight->Diffuse );
\r
123 light.Specular = Color4::FromUnmanaged( pLight->Specular );
\r
124 light.Attenuation0 = pLight->Attenuation0;
\r
125 light.Attenuation1 = pLight->Attenuation1;
\r
126 light.Attenuation2 = pLight->Attenuation2;
\r
127 light.Direction = Vector3( pLight->Direction.x, pLight->Direction.y, pLight->Direction.z );
\r
128 light.Position = Vector3( pLight->Position.x, pLight->Position.y, pLight->Position.z );
\r
129 light.Falloff = pLight->Falloff;
\r
130 light.Phi = pLight->Phi;
\r
131 light.Range = pLight->Range;
\r
132 light.Theta = pLight->Theta;
\r
133 light.Type = static_cast<LightType>( pLight->Type );
\r
135 m_WrappedInterface->SetLight( index, light );
\r
137 catch( SlimDXException^ ex)
\r
139 return ex->ResultCode.Code;
\r
141 catch( Exception^ )
\r
149 HRESULT IEffectStateManagerShim::SetMaterial( const D3DMATERIAL9* pMaterial )
\r
154 material.Ambient = Color4::FromUnmanaged( pMaterial->Ambient );
\r
155 material.Specular = Color4::FromUnmanaged( pMaterial->Specular );
\r
156 material.Diffuse = Color4::FromUnmanaged( pMaterial->Diffuse );
\r
157 material.Emissive = Color4::FromUnmanaged( pMaterial->Emissive );
\r
158 material.Power = pMaterial->Power;
\r
160 m_WrappedInterface->SetMaterial( material );
\r
162 catch( SlimDXException^ ex)
\r
164 return ex->ResultCode.Code;
\r
166 catch( Exception^ )
\r
174 HRESULT IEffectStateManagerShim::SetNPatchMode( FLOAT nSegments )
\r
178 m_WrappedInterface->SetNPatchMode( nSegments );
\r
180 catch( SlimDXException^ ex)
\r
182 return ex->ResultCode.Code;
\r
184 catch( Exception^ )
\r
192 HRESULT IEffectStateManagerShim::SetTransform( D3DTRANSFORMSTATETYPE State, const D3DMATRIX* pMatrix )
\r
196 m_WrappedInterface->SetTransform( static_cast<TransformState>( State ), Matrix::FromD3DXMATRIX( *pMatrix ) );
\r
198 catch( SlimDXException^ ex)
\r
200 return ex->ResultCode.Code;
\r
202 catch( Exception^ )
\r
210 HRESULT IEffectStateManagerShim::SetPixelShader( LPDIRECT3DPIXELSHADER9 pShader )
\r
214 if( pShader == NULL )
\r
215 m_WrappedInterface->SetPixelShader( nullptr );
\r
219 m_WrappedInterface->SetPixelShader( PixelShader::FromPointer( pShader, m_Effect ) );
\r
222 catch( SlimDXException^ ex)
\r
224 return ex->ResultCode.Code;
\r
226 catch( Exception^ )
\r
234 HRESULT IEffectStateManagerShim::SetPixelShaderConstantB( UINT StartRegister, const BOOL* pConstantData, UINT RegisterCount )
\r
238 array<bool>^ data = gcnew array<bool>( RegisterCount );
\r
239 for( UINT i = 0; i < RegisterCount; i++ )
\r
240 data[i] = ( pConstantData[i] > 0 );
\r
242 m_WrappedInterface->SetPixelShaderConstant( StartRegister, data );
\r
244 catch( SlimDXException^ ex)
\r
246 return ex->ResultCode.Code;
\r
248 catch( Exception^ )
\r
256 HRESULT IEffectStateManagerShim::SetPixelShaderConstantF( UINT StartRegister, const FLOAT* pConstantData, UINT RegisterCount )
\r
260 array<float>^ data = gcnew array<float>( RegisterCount * 4 );
\r
261 Marshal::Copy( IntPtr( const_cast<FLOAT*>( pConstantData ) ), data, 0, RegisterCount * 4 );
\r
263 m_WrappedInterface->SetPixelShaderConstant( StartRegister, data );
\r
265 catch( SlimDXException^ ex)
\r
267 return ex->ResultCode.Code;
\r
269 catch( Exception^ )
\r
277 HRESULT IEffectStateManagerShim::SetPixelShaderConstantI( UINT StartRegister, const INT* pConstantData, UINT RegisterCount )
\r
281 array<int>^ data = gcnew array<int>( RegisterCount * 4 );
\r
282 Marshal::Copy( IntPtr( const_cast<INT*>( pConstantData ) ), data, 0, RegisterCount * 4 );
\r
284 m_WrappedInterface->SetPixelShaderConstant( StartRegister, data );
\r
286 catch( SlimDXException^ ex)
\r
288 return ex->ResultCode.Code;
\r
290 catch( Exception^ )
\r
298 HRESULT IEffectStateManagerShim::SetVertexShader( LPDIRECT3DVERTEXSHADER9 pShader )
\r
302 if( pShader == NULL )
\r
303 m_WrappedInterface->SetVertexShader( nullptr );
\r
307 m_WrappedInterface->SetVertexShader( VertexShader::FromPointer( pShader, m_Effect ) );
\r
310 catch( SlimDXException^ ex)
\r
312 return ex->ResultCode.Code;
\r
314 catch( Exception^ )
\r
322 HRESULT IEffectStateManagerShim::SetVertexShaderConstantB( UINT StartRegister, const BOOL* pConstantData, UINT RegisterCount )
\r
326 array<bool>^ data = gcnew array<bool>( RegisterCount );
\r
327 for( UINT i = 0; i < RegisterCount; i++ )
\r
328 data[i] = ( pConstantData[i] > 0 );
\r
330 m_WrappedInterface->SetVertexShaderConstant( StartRegister, data );
\r
332 catch( SlimDXException^ ex)
\r
334 return ex->ResultCode.Code;
\r
336 catch( Exception^ )
\r
344 HRESULT IEffectStateManagerShim::SetVertexShaderConstantF( UINT StartRegister, const FLOAT* pConstantData, UINT RegisterCount )
\r
348 array<float>^ data = gcnew array<float>( RegisterCount * 4 );
\r
349 Marshal::Copy( IntPtr( const_cast<FLOAT*>( pConstantData ) ), data, 0, RegisterCount * 4 );
\r
351 m_WrappedInterface->SetVertexShaderConstant( StartRegister, data );
\r
353 catch( SlimDXException^ ex)
\r
355 return ex->ResultCode.Code;
\r
357 catch( Exception^ )
\r
365 HRESULT IEffectStateManagerShim::SetVertexShaderConstantI( UINT StartRegister, const INT* pConstantData, UINT RegisterCount )
\r
369 array<int>^ data = gcnew array<int>( RegisterCount * 4 );
\r
370 Marshal::Copy( IntPtr( const_cast<INT*>( pConstantData ) ), data, 0, RegisterCount * 4 );
\r
372 m_WrappedInterface->SetVertexShaderConstant( StartRegister, data );
\r
374 catch( SlimDXException^ ex)
\r
376 return ex->ResultCode.Code;
\r
378 catch( Exception^ )
\r
386 HRESULT IEffectStateManagerShim::SetRenderState( D3DRENDERSTATETYPE State, DWORD Value )
\r
390 m_WrappedInterface->SetRenderState( static_cast<RenderState>( State ), Value );
\r
392 catch( SlimDXException^ ex)
\r
394 return ex->ResultCode.Code;
\r
396 catch( Exception^ )
\r
404 HRESULT IEffectStateManagerShim::SetSamplerState( DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value )
\r
408 m_WrappedInterface->SetSamplerState( Sampler, static_cast<SamplerState>( Type ), Value );
\r
410 catch( SlimDXException^ ex)
\r
412 return ex->ResultCode.Code;
\r
414 catch( Exception^ )
\r
422 HRESULT IEffectStateManagerShim::SetTexture( DWORD Stage, LPDIRECT3DBASETEXTURE9 pTexture )
\r
426 if( pTexture == NULL )
\r
427 m_WrappedInterface->SetTexture( Stage, nullptr );
\r
430 pTexture->AddRef();
\r
431 m_WrappedInterface->SetTexture( Stage, BaseTexture::FromUnmanaged( pTexture ) );
\r
434 catch( SlimDXException^ ex)
\r
436 return ex->ResultCode.Code;
\r
438 catch( Exception^ )
\r
446 HRESULT IEffectStateManagerShim::SetTextureStageState( DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value )
\r
450 m_WrappedInterface->SetTextureStageState( Stage, static_cast<TextureStage>( Type ), Value );
\r
452 catch( SlimDXException^ ex)
\r
454 return ex->ResultCode.Code;
\r
456 catch( Exception^ )
\r