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 "../DataStream.h"
\r
28 #include "../ComObject.h"
\r
29 #include "../Utilities.h"
\r
31 #include "../math/Vector2.h"
\r
35 #include "CubeTexture.h"
\r
37 #include "Direct3D9Exception.h"
\r
39 using namespace System;
\r
40 using namespace System::IO;
\r
41 using namespace System::Runtime::InteropServices;
\r
47 void WINAPI NativeD3DXFill2D(D3DXVECTOR4 *out, CONST D3DXVECTOR2 *pTexCoord, CONST D3DXVECTOR2 *pTexelSize, LPVOID data);
\r
48 void WINAPI NativeD3DXFill3D(D3DXVECTOR4 *out, CONST D3DXVECTOR3 *pTexCoord, CONST D3DXVECTOR3 *pTexelSize, LPVOID data);
\r
50 CubeTexture::CubeTexture( SlimDX::Direct3D9::Device^ device, int edgeLength, int numLevels, Usage usage, Format format, Pool pool )
\r
52 IDirect3DCubeTexture9* texture = NULL;
\r
53 HRESULT hr = device->InternalPointer->CreateCubeTexture( edgeLength, numLevels, static_cast<DWORD>( usage ),
\r
54 static_cast<D3DFORMAT>( format ), static_cast<D3DPOOL>( pool ), &texture, NULL );
\r
56 if( RECORD_D3D9(hr).IsFailure )
\r
57 throw gcnew Direct3D9Exception( Result::Last );
\r
60 if( pool == Pool::Default )
\r
61 this->IsDefaultPool = true;
\r
64 CubeTexture::CubeTexture( SlimDX::Direct3D9::Device^ device, int edgeLength, int numLevels, Usage usage, Format format, Pool pool, [Out] IntPtr% sharedHandle )
\r
66 IDirect3DCubeTexture9* texture = NULL;
\r
67 HANDLE sharedHandleNative = NULL;
\r
68 HRESULT hr = device->InternalPointer->CreateCubeTexture( edgeLength, numLevels, static_cast<DWORD>( usage ),
\r
69 static_cast<D3DFORMAT>( format ), static_cast<D3DPOOL>( pool ), &texture, &sharedHandleNative );
\r
71 if( RECORD_D3D9(hr).IsFailure )
\r
72 throw gcnew Direct3D9Exception( Result::Last );
\r
75 sharedHandle = IntPtr(sharedHandleNative);
\r
76 if( pool == Pool::Default )
\r
77 this->IsDefaultPool = true;
\r
80 CubeTextureRequirements CubeTexture::CheckRequirements(SlimDX::Direct3D9::Device^ device, int size,
\r
81 int numMipLevels, Usage usage, Format format, Pool pool)
\r
83 CubeTextureRequirements result; // Result.
\r
84 D3DFORMAT d3dFormat = static_cast<D3DFORMAT>( format ); // Format.
\r
85 HRESULT hr; // Error code.
\r
87 // Get texture requirements.
\r
88 hr = D3DXCheckCubeTextureRequirements(device->InternalPointer, reinterpret_cast<UINT*>( &size ),
\r
89 reinterpret_cast<UINT*>( &numMipLevels ), static_cast<DWORD>( usage ),
\r
90 reinterpret_cast<D3DFORMAT*>( &d3dFormat ), static_cast<D3DPOOL>( pool ) );
\r
92 if( RECORD_D3D9(hr).IsFailure )
\r
93 return CubeTextureRequirements();
\r
95 // Return proposed values.
\r
97 result.Format = format;
\r
98 result.MipLevelCount = numMipLevels;
\r
103 CubeTexture^ CubeTexture::FromMemory_Internal( SlimDX::Direct3D9::Device^ device, const void* memory, UINT sizeBytes,
\r
104 int size, int numLevels, Usage usage, Format format, Pool pool, Filter filter, Filter mipFilter, int colorKey,
\r
105 ImageInformation* imageInformation, PaletteEntry* palette )
\r
107 IDirect3DCubeTexture9* texture = NULL;
\r
109 HRESULT hr = D3DXCreateCubeTextureFromFileInMemoryEx( device->InternalPointer, memory, sizeBytes, size, numLevels,
\r
110 static_cast<DWORD>( usage ), static_cast<D3DFORMAT>( format ), static_cast<D3DPOOL>( pool ), static_cast<DWORD>( filter ), static_cast<DWORD>( mipFilter ),
\r
111 static_cast<D3DCOLOR>( colorKey ), reinterpret_cast<D3DXIMAGE_INFO*>( imageInformation ),
\r
112 reinterpret_cast<PALETTEENTRY*>( palette ), &texture );
\r
114 if( RECORD_D3D9(hr).IsFailure )
\r
120 CubeTexture^ result = gcnew CubeTexture( texture, nullptr );
\r
121 if( pool == Pool::Default )
\r
122 result->IsDefaultPool = true;
\r
126 CubeTexture^ CubeTexture::FromMemory( SlimDX::Direct3D9::Device^ device, array<Byte>^ memory, int size, int numLevels,
\r
127 Usage usage, Format format, Pool pool, Filter filter, Filter mipFilter, int colorKey,
\r
128 [Out] ImageInformation% imageInformation, [Out] array<PaletteEntry>^% palette )
\r
130 pin_ptr<unsigned char> pinnedMemory = &memory[0];
\r
131 imageInformation = ImageInformation();
\r
132 pin_ptr<ImageInformation> pinnedImageInfo = &imageInformation;
\r
133 palette = gcnew array<PaletteEntry>( 256 );
\r
134 pin_ptr<PaletteEntry> pinnedPalette = &palette[0];
\r
136 return FromMemory_Internal( device, pinnedMemory, static_cast<UINT>( memory->Length ), size, numLevels,
\r
137 usage, format, pool, filter, mipFilter, colorKey, pinnedImageInfo, pinnedPalette );
\r
140 CubeTexture^ CubeTexture::FromMemory( SlimDX::Direct3D9::Device^ device, array<Byte>^ memory, int size, int numLevels,
\r
141 Usage usage, Format format, Pool pool, Filter filter, Filter mipFilter, int colorKey,
\r
142 [Out] ImageInformation% imageInformation )
\r
144 pin_ptr<unsigned char> pinnedMemory = &memory[0];
\r
145 pin_ptr<ImageInformation> pinnedImageInfo = &imageInformation;
\r
147 return FromMemory_Internal( device, pinnedMemory, static_cast<UINT>( memory->Length ), size, numLevels,
\r
148 usage, format, pool, filter, mipFilter, colorKey, pinnedImageInfo, NULL );
\r
151 CubeTexture^ CubeTexture::FromMemory( SlimDX::Direct3D9::Device^ device, array<Byte>^ memory, int size, int numLevels,
\r
152 Usage usage, Format format, Pool pool, Filter filter, Filter mipFilter, int colorKey )
\r
154 pin_ptr<unsigned char> pinnedMemory = &memory[0];
\r
156 return FromMemory_Internal( device, pinnedMemory, static_cast<UINT>( memory->Length ), size, numLevels,
\r
157 usage, format, pool, filter, mipFilter, colorKey, NULL, NULL );
\r
160 CubeTexture^ CubeTexture::FromMemory( SlimDX::Direct3D9::Device^ device, array<Byte>^ memory, Usage usage, Pool pool )
\r
162 return CubeTexture::FromMemory( device, memory, D3DX::Default, D3DX::Default,
\r
163 usage, Format::Unknown, pool, Filter::Default, Filter::Default, 0 );
\r
166 CubeTexture^ CubeTexture::FromMemory( SlimDX::Direct3D9::Device^ device, array<Byte>^ memory )
\r
168 return CubeTexture::FromMemory( device, memory, Usage::None, Pool::Managed );
\r
171 CubeTexture^ CubeTexture::FromStream( SlimDX::Direct3D9::Device^ device, Stream^ stream, int sizeBytes, int size, int numLevels,
\r
172 Usage usage, Format format, Pool pool, Filter filter, Filter mipFilter, int colorKey,
\r
173 [Out] ImageInformation% imageInformation, [Out] array<PaletteEntry>^% palette )
\r
176 array<Byte>^ data = Utilities::ReadStream( stream, sizeBytes, &ds );
\r
178 if( data == nullptr )
\r
180 palette = gcnew array<PaletteEntry>( 256 );
\r
181 pin_ptr<PaletteEntry> pinnedPalette = &palette[0];
\r
182 imageInformation = ImageInformation();
\r
183 pin_ptr<ImageInformation> pinnedImageInfo = &imageInformation;
\r
185 CubeTexture^ texture = FromMemory_Internal( device, ds->PositionPointer, sizeBytes, size, numLevels,
\r
186 usage, format, pool, filter, mipFilter, colorKey, pinnedImageInfo, pinnedPalette );
\r
188 ds->Seek( sizeBytes, SeekOrigin::Current );
\r
192 return CubeTexture::FromMemory( device, data, size, numLevels, usage, format, pool, filter, mipFilter,
\r
193 colorKey, imageInformation, palette );
\r
196 CubeTexture^ CubeTexture::FromStream( SlimDX::Direct3D9::Device^ device, Stream^ stream, int sizeBytes, int size, int numLevels,
\r
197 Usage usage, Format format, Pool pool, Filter filter, Filter mipFilter, int colorKey,
\r
198 [Out] ImageInformation% imageInformation )
\r
201 array<Byte>^ data = Utilities::ReadStream( stream, sizeBytes, &ds );
\r
203 if( data == nullptr )
\r
205 imageInformation = ImageInformation();
\r
206 pin_ptr<ImageInformation> pinnedImageInfo = &imageInformation;
\r
208 CubeTexture^ texture = FromMemory_Internal( device, ds->PositionPointer, sizeBytes, size, numLevels,
\r
209 usage, format, pool, filter, mipFilter, colorKey, pinnedImageInfo, NULL );
\r
211 ds->Seek( sizeBytes, SeekOrigin::Current );
\r
215 return CubeTexture::FromMemory( device, data, size, numLevels, usage, format, pool, filter, mipFilter,
\r
216 colorKey, imageInformation );
\r
219 CubeTexture^ CubeTexture::FromStream( SlimDX::Direct3D9::Device^ device, Stream^ stream, int sizeBytes, int size, int numLevels,
\r
220 Usage usage, Format format, Pool pool, Filter filter, Filter mipFilter, int colorKey )
\r
223 array<Byte>^ data = Utilities::ReadStream( stream, sizeBytes, &ds );
\r
225 if( data == nullptr )
\r
227 CubeTexture^ texture = FromMemory_Internal( device, ds->PositionPointer, sizeBytes, size, numLevels,
\r
228 usage, format, pool, filter, mipFilter, colorKey, NULL, NULL );
\r
230 ds->Seek( sizeBytes, SeekOrigin::Current );
\r
234 return CubeTexture::FromMemory( device, data, size, numLevels, usage, format, pool, filter, mipFilter, colorKey );
\r
237 CubeTexture^ CubeTexture::FromStream( SlimDX::Direct3D9::Device^ device, Stream^ stream, int size, int numLevels,
\r
238 Usage usage, Format format, Pool pool, Filter filter, Filter mipFilter, int colorKey )
\r
240 return CubeTexture::FromStream( device, stream, 0, size, numLevels, usage, format, pool, filter, mipFilter, colorKey );
\r
243 CubeTexture^ CubeTexture::FromStream( SlimDX::Direct3D9::Device^ device, Stream^ stream, Usage usage, Pool pool )
\r
245 return CubeTexture::FromStream( device, stream, D3DX::Default, D3DX::Default,
\r
246 usage, Format::Unknown, pool, Filter::Default, Filter::Default, 0 );
\r
249 CubeTexture^ CubeTexture::FromStream( SlimDX::Direct3D9::Device^ device, Stream^ stream )
\r
251 return CubeTexture::FromStream( device, stream, Usage::None, Pool::Managed );
\r
254 CubeTexture^ CubeTexture::FromFile( SlimDX::Direct3D9::Device^ device, String^ fileName, int size, int numLevels,
\r
255 Usage usage, Format format, Pool pool, Filter filter, Filter mipFilter, int colorKey,
\r
256 [Out] ImageInformation% imageInformation, [Out] array<PaletteEntry>^% palette )
\r
258 IDirect3DCubeTexture9* texture = NULL;
\r
259 pin_ptr<const wchar_t> pinnedName = PtrToStringChars( fileName );
\r
260 imageInformation = ImageInformation();
\r
261 pin_ptr<ImageInformation> pinnedImageInfo = &imageInformation;
\r
262 palette = gcnew array<PaletteEntry>( 256 );
\r
263 pin_ptr<PaletteEntry> pinnedPalette = &palette[0];
\r
265 HRESULT hr = D3DXCreateCubeTextureFromFileEx( device->InternalPointer, pinnedName, size,
\r
266 numLevels, static_cast<DWORD>( usage ), static_cast<D3DFORMAT>( format ), static_cast<D3DPOOL>( pool ), static_cast<DWORD>( filter ), static_cast<DWORD>( mipFilter ),
\r
267 colorKey, reinterpret_cast<D3DXIMAGE_INFO*>( pinnedImageInfo ), reinterpret_cast<PALETTEENTRY*>( pinnedPalette ), &texture );
\r
269 if( RECORD_D3D9(hr).IsFailure )
\r
275 CubeTexture^ result = gcnew CubeTexture( texture, nullptr );;
\r
276 if( pool == Pool::Default )
\r
277 result->IsDefaultPool = true;
\r
281 CubeTexture^ CubeTexture::FromFile( SlimDX::Direct3D9::Device^ device, String^ fileName, int size, int numLevels,
\r
282 Usage usage, Format format, Pool pool, Filter filter, Filter mipFilter, int colorKey,
\r
283 [Out] ImageInformation% imageInformation )
\r
285 IDirect3DCubeTexture9* texture = NULL;
\r
286 pin_ptr<const wchar_t> pinnedName = PtrToStringChars( fileName );
\r
287 pin_ptr<ImageInformation> pinnedImageInfo = &imageInformation;
\r
289 HRESULT hr = D3DXCreateCubeTextureFromFileEx( device->InternalPointer, pinnedName, size,
\r
290 numLevels, static_cast<DWORD>( usage ), static_cast<D3DFORMAT>( format ), static_cast<D3DPOOL>( pool ), static_cast<DWORD>( filter ), static_cast<DWORD>( mipFilter ),
\r
291 colorKey, reinterpret_cast<D3DXIMAGE_INFO*>( pinnedImageInfo ), NULL, &texture );
\r
293 if( RECORD_D3D9(hr).IsFailure )
\r
296 CubeTexture^ result = gcnew CubeTexture( texture, nullptr );;
\r
297 if( pool == Pool::Default )
\r
298 result->IsDefaultPool = true;
\r
302 CubeTexture^ CubeTexture::FromFile( SlimDX::Direct3D9::Device^ device, String^ fileName, int size, int numLevels,
\r
303 Usage usage, Format format, Pool pool, Filter filter, Filter mipFilter, int colorKey )
\r
305 IDirect3DCubeTexture9* texture = NULL;
\r
306 pin_ptr<const wchar_t> pinnedName = PtrToStringChars( fileName );
\r
308 HRESULT hr = D3DXCreateCubeTextureFromFileEx( device->InternalPointer, pinnedName, size,
\r
309 numLevels, static_cast<DWORD>( usage ), static_cast<D3DFORMAT>( format ), static_cast<D3DPOOL>( pool ), static_cast<DWORD>( filter ), static_cast<DWORD>( mipFilter ),
\r
310 colorKey, NULL, NULL, &texture );
\r
312 if( RECORD_D3D9(hr).IsFailure )
\r
315 CubeTexture^ result = gcnew CubeTexture( texture, nullptr );;
\r
316 if( pool == Pool::Default )
\r
317 result->IsDefaultPool = true;
\r
321 CubeTexture^ CubeTexture::FromFile( SlimDX::Direct3D9::Device^ device, String^ fileName, Usage usage, Pool pool )
\r
323 return CubeTexture::FromFile( device, fileName, D3DX::Default, D3DX::Default,
\r
324 usage, Format::Unknown, pool, Filter::Default, Filter::Default, 0 );
\r
327 CubeTexture^ CubeTexture::FromFile( SlimDX::Direct3D9::Device^ device, String^ fileName )
\r
329 return CubeTexture::FromFile( device, fileName, Usage::None, Pool::Managed );
\r
332 DataRectangle^ CubeTexture::LockRectangle( CubeMapFace face, int level, System::Drawing::Rectangle rect, LockFlags flags )
\r
334 D3DLOCKED_RECT lockedRect;
\r
335 RECT nativeRect = { rect.Left, rect.Top, rect.Right, rect.Bottom };
\r
336 HRESULT hr = InternalPointer->LockRect( static_cast<D3DCUBEMAP_FACES>( face ), level, &lockedRect, &nativeRect, static_cast<DWORD>( flags ) );
\r
338 if( RECORD_D3D9(hr).IsFailure )
\r
341 int lockedSize = lockedRect.Pitch * GetLevelDescription( level ).Height;
\r
343 bool readOnly = (flags & LockFlags::ReadOnly) == LockFlags::ReadOnly;
\r
344 DataRectangle^ outRect = gcnew DataRectangle( lockedRect.Pitch, gcnew DataStream( lockedRect.pBits, lockedSize, true, !readOnly, false ) );
\r
348 DataRectangle^ CubeTexture::LockRectangle( CubeMapFace face, int level, LockFlags flags )
\r
350 D3DLOCKED_RECT lockedRect;
\r
351 HRESULT hr = InternalPointer->LockRect( static_cast<D3DCUBEMAP_FACES>( face ), level, &lockedRect, NULL, static_cast<DWORD>( flags ) );
\r
353 if( RECORD_D3D9(hr).IsFailure )
\r
356 int lockedSize = lockedRect.Pitch * GetLevelDescription( level ).Height;
\r
358 bool readOnly = (flags & LockFlags::ReadOnly) == LockFlags::ReadOnly;
\r
359 DataRectangle^ outRect = gcnew DataRectangle( lockedRect.Pitch, gcnew DataStream( lockedRect.pBits, lockedSize, true, !readOnly, false ) );
\r
363 Result CubeTexture::UnlockRectangle( CubeMapFace face, int level )
\r
365 HRESULT hr = InternalPointer->UnlockRect( static_cast<D3DCUBEMAP_FACES>( face ), level );
\r
366 return RECORD_D3D9( hr );
\r
369 Result CubeTexture::AddDirtyRectangle( CubeMapFace face )
\r
371 HRESULT hr = InternalPointer->AddDirtyRect( static_cast<D3DCUBEMAP_FACES>( face ), NULL );
\r
372 return RECORD_D3D9( hr );
\r
375 Result CubeTexture::AddDirtyRectangle( CubeMapFace face, System::Drawing::Rectangle rect )
\r
377 RECT nativeRect = { rect.Left, rect.Top, rect.Right, rect.Bottom };
\r
378 HRESULT hr = InternalPointer->AddDirtyRect( static_cast<D3DCUBEMAP_FACES>( face ), &nativeRect );
\r
379 return RECORD_D3D9( hr );
\r
382 SurfaceDescription CubeTexture::GetLevelDescription( int level )
\r
384 SurfaceDescription description;
\r
385 HRESULT hr = InternalPointer->GetLevelDesc( level, reinterpret_cast<D3DSURFACE_DESC*>( &description ) );
\r
387 return description;
\r
390 Surface^ CubeTexture::GetCubeMapSurface( CubeMapFace face, int level )
\r
392 IDirect3DSurface9* surface;
\r
393 HRESULT hr = InternalPointer->GetCubeMapSurface( static_cast<D3DCUBEMAP_FACES>( face ), level, &surface );
\r
395 if( RECORD_D3D9(hr).IsFailure )
\r
397 return Surface::FromPointer( surface );
\r
400 Result CubeTexture::Fill(Fill3DCallback^ callback)
\r
402 HRESULT hr; // Error code.
\r
404 // Call the function.
\r
405 hr = D3DXFillCubeTexture(InternalPointer, NativeD3DXFill3D, Marshal::GetFunctionPointerForDelegate(callback).ToPointer());
\r
407 return RECORD_D3D9(hr);
\r
410 Result CubeTexture::Fill( TextureShader^ shader )
\r
412 HRESULT hr = D3DXFillCubeTextureTX( InternalPointer, shader->InternalPointer );
\r
413 return RECORD_D3D9( hr );
\r