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
23 #include <windows.h>
\r
28 #include "../stack_array.h"
\r
29 #include "../ComObject.h"
\r
30 #include "../Utilities.h"
\r
31 #include "../DataStream.h"
\r
33 #include "Direct3D9Exception.h"
\r
35 #include "Effect9.h"
\r
36 #include "ConstantTable.h"
\r
39 using namespace System;
\r
40 using namespace System::Globalization;
\r
46 EffectHandle^ ConstantTable::GetConstant(SlimDX::Direct3D9::EffectHandle ^handle, int index)
\r
48 D3DXHANDLE parentHandle = handle != nullptr ? handle->InternalHandle : NULL;
\r
49 D3DXHANDLE result = InternalPointer->GetConstant( parentHandle, index );
\r
50 GC::KeepAlive( handle );
\r
52 if( result == NULL )
\r
54 return gcnew EffectHandle( result );
\r
57 EffectHandle^ ConstantTable::GetConstant(SlimDX::Direct3D9::EffectHandle ^handle, String^ name )
\r
59 array<unsigned char>^ rawName = System::Text::ASCIIEncoding::ASCII->GetBytes( name );
\r
60 pin_ptr<unsigned char> pinnedName = &rawName[0];
\r
62 D3DXHANDLE parentHandle = handle != nullptr ? handle->InternalHandle : NULL;
\r
63 D3DXHANDLE result = InternalPointer->GetConstantByName( parentHandle, reinterpret_cast<const char*>( pinnedName ) );
\r
64 GC::KeepAlive( handle );
\r
66 if( result == NULL )
\r
68 return gcnew EffectHandle( result );
\r
71 EffectHandle^ ConstantTable::GetConstantElement( EffectHandle^ handle, int index )
\r
73 D3DXHANDLE parentHandle = handle != nullptr ? handle->InternalHandle : NULL;
\r
74 D3DXHANDLE result = InternalPointer->GetConstantElement( parentHandle, index );
\r
75 GC::KeepAlive( handle );
\r
77 if( result == NULL )
\r
79 return gcnew EffectHandle( result );
\r
82 ConstantDescription ConstantTable::GetConstantDescription( EffectHandle^ handle )
\r
84 D3DXCONSTANT_DESC nativeDesc;
\r
85 ConstantDescription description;
\r
87 D3DXHANDLE nativeHandle = handle != nullptr ? handle->InternalHandle : NULL;
\r
88 unsigned int count = 1;
\r
90 HRESULT hr = InternalPointer->GetConstantDesc( nativeHandle, &nativeDesc, &count );
\r
91 GC::KeepAlive( handle );
\r
92 if( RECORD_D3D9( hr ).IsFailure )
\r
93 return ConstantDescription();
\r
95 description.Initialize( nativeDesc );
\r
99 array<ConstantDescription>^ ConstantTable::GetConstantDescriptionArray( EffectHandle^ handle )
\r
101 D3DXHANDLE nativeHandle = handle != nullptr ? handle->InternalHandle : NULL;
\r
102 unsigned int count = 0;
\r
104 HRESULT hr = InternalPointer->GetConstantDesc( nativeHandle, NULL, &count );
\r
106 if( RECORD_D3D9( hr ).IsFailure )
\r
109 stack_array<D3DXCONSTANT_DESC> nativeDescArray = stackalloc( D3DXCONSTANT_DESC, count );
\r
110 hr = InternalPointer->GetConstantDesc( nativeHandle, &nativeDescArray[0], &count );
\r
112 if( RECORD_D3D9( hr ).IsFailure )
\r
115 array<ConstantDescription>^ descArray = gcnew array<ConstantDescription>( count );
\r
116 for( unsigned int i = 0; i < count; ++i )
\r
118 descArray[i].Initialize( nativeDescArray[i] );
\r
121 GC::KeepAlive( handle );
\r
125 int ConstantTable::GetSamplerIndex( EffectHandle^ sampler )
\r
127 D3DXHANDLE handle = sampler != nullptr ? sampler->InternalHandle : NULL;
\r
128 int result = InternalPointer->GetSamplerIndex( handle );
\r
129 GC::KeepAlive( sampler );
\r
133 DataStream^ ConstantTable::Buffer::get()
\r
135 return gcnew DataStream( InternalPointer->GetBufferPointer(), InternalPointer->GetBufferSize(), true, true, false );
\r
138 Result ConstantTable::SetDefaults( Device^ device )
\r
140 HRESULT hr = InternalPointer->SetDefaults( device->InternalPointer );
\r
141 return RECORD_D3D9( hr );
\r
144 generic<typename T> where T : value class
\r
145 Result ConstantTable::SetValue( Device^ device, EffectHandle^ parameter, T value )
\r
148 D3DXHANDLE handle = parameter != nullptr ? parameter->InternalHandle : NULL;
\r
150 if( T::typeid == bool::typeid )
\r
152 BOOL newValue = Convert::ToInt32( value, CultureInfo::InvariantCulture );
\r
153 hr = InternalPointer->SetBool( device->InternalPointer, handle, newValue );
\r
155 else if( T::typeid == float::typeid )
\r
157 hr = InternalPointer->SetFloat( device->InternalPointer, handle, static_cast<FLOAT>( value ) );
\r
159 else if( T::typeid == int::typeid )
\r
161 hr = InternalPointer->SetInt( device->InternalPointer, handle, static_cast<INT>( value ) );
\r
163 else if( T::typeid == Matrix::typeid )
\r
165 hr = InternalPointer->SetMatrix( device->InternalPointer, handle, reinterpret_cast<D3DXMATRIX*>( &value ) );
\r
167 else if( T::typeid == Vector4::typeid )
\r
169 hr = InternalPointer->SetVector( device->InternalPointer, handle, reinterpret_cast<D3DXVECTOR4*>( &value ) );
\r
173 hr = InternalPointer->SetValue( device->InternalPointer, handle, &value, static_cast<DWORD>( sizeof(T) ) );
\r
176 GC::KeepAlive( parameter );
\r
177 return RECORD_D3D9( hr );
\r
180 generic<typename T> where T : value class
\r
181 Result ConstantTable::SetValue( Device^ device, EffectHandle^ parameter, array<T>^ values )
\r
184 D3DXHANDLE handle = parameter != nullptr ? parameter->InternalHandle : NULL;
\r
186 if( T::typeid == bool::typeid )
\r
188 array<BOOL>^ newValues = Array::ConvertAll<bool, int>( safe_cast<array<bool>>( values ), gcnew Converter<bool, int>( Convert::ToInt32 ) );
\r
189 pin_ptr<BOOL> pinnedValues = &newValues[0];
\r
191 hr = InternalPointer->SetBoolArray( device->InternalPointer, handle, pinnedValues, values->Length );
\r
193 else if( T::typeid == float::typeid )
\r
195 pin_ptr<T> pinnedData = &values[0];
\r
196 hr = InternalPointer->SetFloatArray( device->InternalPointer, handle, reinterpret_cast<FLOAT*>( pinnedData ), values->Length );
\r
198 else if( T::typeid == int::typeid )
\r
200 pin_ptr<T> pinnedData = &values[0];
\r
201 hr = InternalPointer->SetIntArray( device->InternalPointer, handle, reinterpret_cast<INT*>( pinnedData ), values->Length );
\r
203 else if( T::typeid == Matrix::typeid )
\r
205 pin_ptr<T> pinnedData = &values[0];
\r
206 hr = InternalPointer->SetMatrixArray( device->InternalPointer, handle, reinterpret_cast<D3DXMATRIX*>( pinnedData ), values->Length );
\r
208 else if( T::typeid == Vector4::typeid )
\r
210 pin_ptr<T> pinnedData = &values[0];
\r
211 hr = InternalPointer->SetVectorArray( device->InternalPointer, handle, reinterpret_cast<D3DXVECTOR4*>( pinnedData ), values->Length );
\r
215 pin_ptr<T> pinnedData = &values[0];
\r
216 hr = InternalPointer->SetValue( device->InternalPointer, handle, pinnedData, static_cast<DWORD>( sizeof(T) ) * values->Length );
\r
219 GC::KeepAlive( parameter );
\r
220 return RECORD_D3D9( hr );
\r
223 ConstantTableDescription ConstantTable::Description::get()
\r
225 D3DXCONSTANTTABLE_DESC nativeDesc;
\r
226 ConstantTableDescription description;
\r
228 HRESULT hr = InternalPointer->GetDesc( &nativeDesc );
\r
230 if( RECORD_D3D9( hr ).IsFailure )
\r
231 return ConstantTableDescription();
\r
233 description.Creator = gcnew String( nativeDesc.Creator );
\r
234 description.Version = gcnew Version( D3DSHADER_VERSION_MAJOR( nativeDesc.Version ), D3DSHADER_VERSION_MINOR( nativeDesc.Version ) );
\r
235 description.Constants = nativeDesc.Constants;
\r
236 return description;
\r