From 9eccabce407ba7970c5b56cfd9bdbaf02ea8ef7f Mon Sep 17 00:00:00 2001 From: cutealien Date: Sun, 1 Mar 2015 20:52:35 +0000 Subject: [PATCH] Support for Direct3D 8 removed. Missing people with interest in maintaining it. Anyone who still needs DX8 can branch the previous svn version or use Irrlicht 1.8. git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@5053 dfc29bdd-3216-0410-991c-e03cc46cb475 --- changes.txt | 7 +- examples/01.HelloWorld/main.cpp | 5 +- examples/02.Quake3Map/main.cpp | 13 +- examples/10.Shaders/main.cpp | 18 +- examples/16.Quake3MapShader/main.cpp | 1 - examples/21.Quake3Explorer/main.cpp | 6 +- examples/Demo/CMainMenu.cpp | 8 +- include/EDriverTypes.h | 18 +- include/IMaterialRenderer.h | 2 +- include/IVideoModeList.h | 8 +- include/IrrCompileConfig.h | 17 +- include/IrrlichtDevice.h | 15 +- include/SExposedVideoData.h | 14 - include/SIrrCreationParameters.h | 5 +- include/irrlicht.h | 4 +- media/d3d8.psh | 10 - media/d3d8.vsh | 37 - source/Irrlicht/CD3D8Driver.cpp | 2586 ----------------- source/Irrlicht/CD3D8Driver.h | 381 --- source/Irrlicht/CD3D8MaterialRenderer.h | 545 ---- source/Irrlicht/CD3D8NormalMapRenderer.cpp | 248 -- source/Irrlicht/CD3D8NormalMapRenderer.h | 56 - source/Irrlicht/CD3D8ParallaxMapRenderer.cpp | 318 -- source/Irrlicht/CD3D8ParallaxMapRenderer.h | 62 - .../Irrlicht/CD3D8ShaderMaterialRenderer.cpp | 331 --- source/Irrlicht/CD3D8ShaderMaterialRenderer.h | 82 - source/Irrlicht/CD3D8Texture.cpp | 640 ---- source/Irrlicht/CD3D8Texture.h | 100 - source/Irrlicht/CD3D9Driver.h | 4 +- source/Irrlicht/CD3D9Texture.cpp | 20 - source/Irrlicht/CIrrDeviceConsole.cpp | 2 +- source/Irrlicht/CIrrDeviceFB.cpp | 2 +- source/Irrlicht/CIrrDeviceLinux.cpp | 2 +- source/Irrlicht/CIrrDeviceSDL.cpp | 20 +- source/Irrlicht/CIrrDeviceWin32.cpp | 20 +- source/Irrlicht/Irrlicht-gcc.cbp | 11 - source/Irrlicht/Irrlicht10.0.vcxproj | 11 - source/Irrlicht/Irrlicht10.0.vcxproj.filters | 36 - source/Irrlicht/Irrlicht11.0.vcxproj | 11 - source/Irrlicht/Irrlicht12.0.vcxproj | 11 - source/Irrlicht/Irrlicht12.0.vcxproj.filters | 36 - source/Irrlicht/Irrlicht9.0.vcproj | 48 - source/Irrlicht/Makefile | 2 +- 43 files changed, 59 insertions(+), 5714 deletions(-) delete mode 100644 media/d3d8.psh delete mode 100644 media/d3d8.vsh delete mode 100644 source/Irrlicht/CD3D8Driver.cpp delete mode 100644 source/Irrlicht/CD3D8Driver.h delete mode 100644 source/Irrlicht/CD3D8MaterialRenderer.h delete mode 100644 source/Irrlicht/CD3D8NormalMapRenderer.cpp delete mode 100644 source/Irrlicht/CD3D8NormalMapRenderer.h delete mode 100644 source/Irrlicht/CD3D8ParallaxMapRenderer.cpp delete mode 100644 source/Irrlicht/CD3D8ParallaxMapRenderer.h delete mode 100644 source/Irrlicht/CD3D8ShaderMaterialRenderer.cpp delete mode 100644 source/Irrlicht/CD3D8ShaderMaterialRenderer.h delete mode 100644 source/Irrlicht/CD3D8Texture.cpp delete mode 100644 source/Irrlicht/CD3D8Texture.h diff --git a/changes.txt b/changes.txt index b6dde13a..fb215758 100644 --- a/changes.txt +++ b/changes.txt @@ -1,10 +1,11 @@ -------------------------- Changes in 1.9 (not yet released) +- Support for Direct3D 8 removed after svn revision 5052 due to lack of maintenance. - _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX removed. This was a bugfix for VS2003 (in combination with .NET) which we haven't supported in a while. -- VS 2005 support removed in svn revision 5048. -- WinCE 6 supported removed in svn revision 5046. -- NVidia CG support removed in svn revision 5045 due to lack of maintenance. NVidia has also stopped supporting this. +- VS 2005 support removed after svn revision 5048. +- WinCE 6 supported removed after svn revision 5046. +- NVidia CG support removed after svn revision 5045 due to lack of maintenance. NVidia has also stopped supporting this. - TA burningvideo: enabled triangle fan again so that skybox works.[need more testmeshes if other trianglefan than skybox doesn't work] correct vc2013 project files for x64,static lib diff --git a/examples/01.HelloWorld/main.cpp b/examples/01.HelloWorld/main.cpp index a53483cc..1e2e9917 100644 --- a/examples/01.HelloWorld/main.cpp +++ b/examples/01.HelloWorld/main.cpp @@ -95,10 +95,9 @@ int main() parameters: - deviceType: Type of the device. This can currently be the Null-device, - one of the two software renderers, D3D8, D3D9, or OpenGL. In this + one of the two software renderers, D3D9, or OpenGL. In this example we use EDT_SOFTWARE, but to try out, you might want to - change it to EDT_BURNINGSVIDEO, EDT_NULL, EDT_DIRECT3D8, - EDT_DIRECT3D9, or EDT_OPENGL. + change it to EDT_BURNINGSVIDEO, EDT_NULL, EDT_DIRECT3D9, or EDT_OPENGL. - windowSize: Size of the Window or screen in FullScreenMode to be created. In this example we use 640x480. diff --git a/examples/02.Quake3Map/main.cpp b/examples/02.Quake3Map/main.cpp index fc7461f6..83fac53d 100644 --- a/examples/02.Quake3Map/main.cpp +++ b/examples/02.Quake3Map/main.cpp @@ -57,9 +57,9 @@ int main() video::E_DRIVER_TYPE driverType; printf("Please select the driver you want for this example:\n"\ - " (a) OpenGL 1.5\n (b) Direct3D 9.0c\n (c) Direct3D 8.1\n"\ - " (d) Burning's Software Renderer\n (e) Software Renderer\n"\ - " (f) NullDevice\n (otherKey) exit\n\n"); + " (a) OpenGL 1.5\n (b) Direct3D 9.0c\n"\ + " (c) Burning's Software Renderer\n (d) Software Renderer\n"\ + " (e) NullDevice\n (otherKey) exit\n\n"); char i; std::cin >> i; @@ -68,10 +68,9 @@ int main() { case 'a': driverType = video::EDT_OPENGL; break; case 'b': driverType = video::EDT_DIRECT3D9;break; - case 'c': driverType = video::EDT_DIRECT3D8;break; - case 'd': driverType = video::EDT_BURNINGSVIDEO;break; - case 'e': driverType = video::EDT_SOFTWARE; break; - case 'f': driverType = video::EDT_NULL; break; + case 'c': driverType = video::EDT_BURNINGSVIDEO;break; + case 'd': driverType = video::EDT_SOFTWARE; break; + case 'e': driverType = video::EDT_NULL; break; default: return 1; } diff --git a/examples/10.Shaders/main.cpp b/examples/10.Shaders/main.cpp index 75b0c7a1..e59dcecc 100644 --- a/examples/10.Shaders/main.cpp +++ b/examples/10.Shaders/main.cpp @@ -1,6 +1,6 @@ /** Example 010 Shaders -This tutorial shows how to use shaders for D3D8, D3D9, and OpenGL with the +This tutorial shows how to use shaders for D3D9, and OpenGL with the engine and how to create new material types with them. It also shows how to disable the generation of mipmaps at texture loading, and how to use text scene nodes. @@ -187,12 +187,12 @@ int main() Now for the more interesting parts. If we are using Direct3D, we want to load vertex and pixel shader programs, if we have OpenGL, we want to use ARB fragment and vertex programs. I wrote the corresponding - programs down into the files d3d8.ps, d3d8.vs, d3d9.ps, d3d9.vs, - opengl.ps and opengl.vs. We only need the right filenames now. This is - done in the following switch. Note, that it is not necessary to write - the shaders into text files, like in this example. You can even write - the shaders directly as strings into the cpp source file, and use later - addShaderMaterial() instead of addShaderMaterialFromFiles(). + programs down into the files d3d9.ps, d3d9.vs, opengl.ps and opengl.vs. + We only need the right filenames now. This is done in the following switch. + Note, that it is not necessary to write the shaders into text files, + like in this example. You can even write the shaders directly as strings + into the cpp source file, and use later addShaderMaterial() instead of + addShaderMaterialFromFiles(). */ io::path vsFileName; // filename for the vertex shader @@ -200,10 +200,6 @@ int main() switch(driverType) { - case video::EDT_DIRECT3D8: - psFileName = "../../media/d3d8.psh"; - vsFileName = "../../media/d3d8.vsh"; - break; case video::EDT_DIRECT3D9: if (UseHighLevelShaders) { diff --git a/examples/16.Quake3MapShader/main.cpp b/examples/16.Quake3MapShader/main.cpp index 63917053..fd810864 100644 --- a/examples/16.Quake3MapShader/main.cpp +++ b/examples/16.Quake3MapShader/main.cpp @@ -329,7 +329,6 @@ int IRRCALLCONV main(int argc, char* argv[]) case video::EDT_OPENGL: gui->addImage(driver->getTexture("opengllogo.png"), pos); break; - case video::EDT_DIRECT3D8: case video::EDT_DIRECT3D9: gui->addImage(driver->getTexture("directxlogo.png"), pos); break; diff --git a/examples/21.Quake3Explorer/main.cpp b/examples/21.Quake3Explorer/main.cpp index bf2b8902..55326e0c 100644 --- a/examples/21.Quake3Explorer/main.cpp +++ b/examples/21.Quake3Explorer/main.cpp @@ -678,7 +678,6 @@ void CQuake3EventHandler::CreateGUI() env->addStaticText ( L"VideoDriver:", rect( dim.Width - 400, 24, dim.Width - 310, 40 ),false, false, gui.Window, -1, false ); gui.VideoDriver = env->addComboBox(rect( dim.Width - 300, 24, dim.Width - 10, 40 ),gui.Window); gui.VideoDriver->addItem(L"Direct3D 9.0c", EDT_DIRECT3D9 ); - gui.VideoDriver->addItem(L"Direct3D 8.1", EDT_DIRECT3D8 ); gui.VideoDriver->addItem(L"OpenGL 1.5", EDT_OPENGL); gui.VideoDriver->addItem(L"Software Renderer", EDT_SOFTWARE); gui.VideoDriver->addItem(L"Burning's Video (TM) Thomas Alten", EDT_BURNINGSVIDEO); @@ -1518,11 +1517,8 @@ bool CQuake3EventHandler::OnEvent(const SEvent& eve) rot = cam->getRotation (); } - static const c8 *dName[] = { "null", "software", "burning", - "d3d8", "d3d9", "opengl" }; - snprintf(buf, 256, "%s_%ls_%.0f_%.0f_%.0f_%.0f_%.0f_%.0f.jpg", - dName[Game->Device->getVideoDriver()->getDriverType()], + DRIVER_TYPE_NAMES_SHORT[Game->Device->getVideoDriver()->getDriverType()], Game->CurrentMapName.c_str(), pos.X, pos.Y, pos.Z, rot.X, rot.Y, rot.Z diff --git a/examples/Demo/CMainMenu.cpp b/examples/Demo/CMainMenu.cpp index aa963e5c..153a9646 100644 --- a/examples/Demo/CMainMenu.cpp +++ b/examples/Demo/CMainMenu.cpp @@ -61,7 +61,6 @@ bool CMainMenu::run(bool& outFullscreen, bool& outMusic, bool& outShadows, gui::IGUIListBox* box = guienv->addListBox(core::rect(10,10,220,120), optTab, 1); box->addItem(L"OpenGL 1.5"); - box->addItem(L"Direct3D 8.1"); box->addItem(L"Direct3D 9.0c"); box->addItem(L"Burning's Video 0.47"); box->addItem(L"Irrlicht Software Renderer 1.0"); @@ -253,10 +252,9 @@ bool CMainMenu::run(bool& outFullscreen, bool& outMusic, bool& outShadows, switch(selected) { case 0: outDriver = video::EDT_OPENGL; break; - case 1: outDriver = video::EDT_DIRECT3D8; break; - case 2: outDriver = video::EDT_DIRECT3D9; break; - case 3: outDriver = video::EDT_BURNINGSVIDEO; break; - case 4: outDriver = video::EDT_SOFTWARE; break; + case 1: outDriver = video::EDT_DIRECT3D9; break; + case 2: outDriver = video::EDT_BURNINGSVIDEO; break; + case 3: outDriver = video::EDT_SOFTWARE; break; } return start; diff --git a/include/EDriverTypes.h b/include/EDriverTypes.h index 3ab6e397..b0368be7 100644 --- a/include/EDriverTypes.h +++ b/include/EDriverTypes.h @@ -39,10 +39,8 @@ namespace video contribution. */ EDT_BURNINGSVIDEO, - //! Direct3D8 device, only available on Win32 platforms. - /** Performs hardware accelerated rendering of 3D and 2D - primitives. */ - EDT_DIRECT3D8, + //! Direct3D8 device is longer supported in Irrlicht. You have to go back to Irrlicht 1.8 if you still need that. + DEPRECATED_EDT_DIRECT3D8_NO_LONGER_EXISTS, // keep enum to avoid breaking enumeration order (might be used in ini-files, serialization, etc) //! Direct3D 9 device, only available on Win32 platforms. /** Performs hardware accelerated rendering of 3D and 2D @@ -68,7 +66,17 @@ namespace video "OpenGL 1.x/2.x/3.x", 0 }; - + + const c8* const DRIVER_TYPE_NAMES_SHORT[] = + { + "null", + "software", + "burning", + "d3d8", + "d3d9", + "opengl", + 0 + }; } // end namespace video } // end namespace irr diff --git a/include/IMaterialRenderer.h b/include/IMaterialRenderer.h index 1828a712..145782a0 100644 --- a/include/IMaterialRenderer.h +++ b/include/IMaterialRenderer.h @@ -66,7 +66,7 @@ public: \return Returns true if everything is ok, and false if nothing should be rendered. The material renderer can choose to return false for example if he doesn't support the specified vertex type. This is - actually done in D3D8 and D3D9 when using a normal mapped material with + actually done in D3D9 when using a normal mapped material with a vertex type other than EVT_TANGENTS. */ virtual bool OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype) { return true; } diff --git a/include/IVideoModeList.h b/include/IVideoModeList.h index 4fe2e69a..cc87b2e2 100644 --- a/include/IVideoModeList.h +++ b/include/IVideoModeList.h @@ -14,12 +14,8 @@ namespace video { //! A list of all available video modes. - /** You can get a list via IrrlichtDevice::getVideoModeList(). If you are confused - now, because you think you have to create an Irrlicht Device with a video - mode before being able to get the video mode list, let me tell you that - there is no need to start up an Irrlicht Device with EDT_DIRECT3D8, EDT_OPENGL or - EDT_SOFTWARE: For this (and for lots of other reasons) the null device, - EDT_NULL exists.*/ + /** You can get a list via IrrlichtDevice::getVideoModeList(). + You only need the null device (EDT_NULL) to get the video-modes. */ class IVideoModeList : public virtual IReferenceCounted { public: diff --git a/include/IrrCompileConfig.h b/include/IrrCompileConfig.h index 96ed300b..27b4dea2 100644 --- a/include/IrrCompileConfig.h +++ b/include/IrrCompileConfig.h @@ -135,20 +135,14 @@ while it runs and enabling it will slow down the engine. */ #undef _IRR_COMPILE_WITH_PROFILING_ #endif -//! Define _IRR_COMPILE_WITH_DIRECT3D_8_ and _IRR_COMPILE_WITH_DIRECT3D_9_ to -//! compile the Irrlicht engine with Direct3D8 and/or DIRECT3D9. +//! Define _IRR_COMPILE_WITH_DIRECT3D_9_ to compile the Irrlicht engine with DIRECT3D9. /** If you only want to use the software device or opengl you can disable those defines. This switch is mostly disabled because people do not get the g++ compiler compile directX header files, and directX is only available on Windows platforms. If you are using Dev-Cpp, and want to compile this using a DX dev pack, you can define _IRR_COMPILE_WITH_DX9_DEV_PACK_. So you simply need to add something like this to the compiler settings: -DIRR_COMPILE_WITH_DX9_DEV_PACK -and this to the linker settings: -ld3dx9 -ld3dx8 - -Microsoft have chosen to remove D3D8 headers from their recent DXSDKs, and -so D3D8 support is now disabled by default. If you really want to build -with D3D8 support, then you will have to source a DXSDK with the appropriate -headers, e.g. Summer 2004. This is a Microsoft issue, not an Irrlicht one. +and this to the linker settings: -ld3dx9 */ #if defined(_IRR_WINDOWS_API_) && (!defined(__GNUC__) || defined(IRR_COMPILE_WITH_DX9_DEV_PACK)) @@ -164,13 +158,8 @@ If not defined, Windows Multimedia library is used, which offers also broad supp #undef _IRR_COMPILE_WITH_DIRECTINPUT_JOYSTICK_ #endif -//! Only define _IRR_COMPILE_WITH_DIRECT3D_8_ if you have an appropriate DXSDK, e.g. Summer 2004 -// #define _IRR_COMPILE_WITH_DIRECT3D_8_ +//! enabled Direct3D 9 #define _IRR_COMPILE_WITH_DIRECT3D_9_ - -#ifdef NO_IRR_COMPILE_WITH_DIRECT3D_8_ -#undef _IRR_COMPILE_WITH_DIRECT3D_8_ -#endif #ifdef NO_IRR_COMPILE_WITH_DIRECT3D_9_ #undef _IRR_COMPILE_WITH_DIRECT3D_9_ #endif diff --git a/include/IrrlichtDevice.h b/include/IrrlichtDevice.h index cd4827c4..8a8825b6 100644 --- a/include/IrrlichtDevice.h +++ b/include/IrrlichtDevice.h @@ -108,12 +108,9 @@ namespace irr virtual ILogger* getLogger() = 0; //! Gets a list with all video modes available. - /** If you are confused now, because you think you have to - create an Irrlicht Device with a video mode before being able - to get the video mode list, let me tell you that there is no - need to start up an Irrlicht Device with EDT_DIRECT3D8, - EDT_OPENGL or EDT_SOFTWARE: For this (and for lots of other - reasons) the null driver, EDT_NULL exists. + /** You only need a null driver (ED_NULL) to access + those video modes. So you can get the available modes + before starting any other video driver. \return Pointer to a list with all video modes supported by the gfx adapter. */ virtual video::IVideoModeList* getVideoModeList() = 0; @@ -313,12 +310,6 @@ namespace irr return true; #else return false; -#endif - case video::EDT_DIRECT3D8: -#ifdef _IRR_COMPILE_WITH_DIRECT3D_8_ - return true; -#else - return false; #endif case video::EDT_DIRECT3D9: #ifdef _IRR_COMPILE_WITH_DIRECT3D_9_ diff --git a/include/SExposedVideoData.h b/include/SExposedVideoData.h index ede80fe7..e7c53d8c 100644 --- a/include/SExposedVideoData.h +++ b/include/SExposedVideoData.h @@ -40,19 +40,6 @@ struct SExposedVideoData void* HWnd; }; - struct SD3D8 - { - //! Pointer to the IDirect3D8 interface - IDirect3D8* D3D8; - - //! Pointer to the IDirect3DDevice8 interface - IDirect3DDevice8* D3DDev8; - - //! Window handle. - /** Get with for example with: HWND h = reinterpret_cast(exposedData.D3D8.HWnd) */ - void* HWnd; - }; - struct SOpenGLWin32 { //! Private GDI Device Context. @@ -79,7 +66,6 @@ struct SExposedVideoData union { SD3D9 D3D9; - SD3D8 D3D8; SOpenGLWin32 OpenGLWin32; SOpenGLLinux OpenGLLinux; }; diff --git a/include/SIrrCreationParameters.h b/include/SIrrCreationParameters.h index d6762283..c960f955 100644 --- a/include/SIrrCreationParameters.h +++ b/include/SIrrCreationParameters.h @@ -97,9 +97,8 @@ namespace irr //! Type of video driver used to render graphics. /** This can currently be video::EDT_NULL, video::EDT_SOFTWARE, - video::EDT_BURNINGSVIDEO, video::EDT_DIRECT3D8, - video::EDT_DIRECT3D9, and video::EDT_OPENGL. - Default: Software. */ + video::EDT_BURNINGSVIDEO, video::EDT_DIRECT3D9, and video::EDT_OPENGL. + Default: EDT_BURNINGSVIDEO. */ video::E_DRIVER_TYPE DriverType; //! Size of the window or the video mode in fullscreen mode. Default: 800x600 diff --git a/include/irrlicht.h b/include/irrlicht.h index 335999b7..64e4f92e 100644 --- a/include/irrlicht.h +++ b/include/irrlicht.h @@ -230,7 +230,7 @@ * int main() * { * // start up the engine - * IrrlichtDevice *device = createDevice(video::EDT_DIRECT3D8, + * IrrlichtDevice *device = createDevice(video::EDT_OPENGL, * core::dimension2d(640,480)); * * video::IVideoDriver* driver = device->getVideoDriver(); @@ -309,7 +309,7 @@ namespace irr /** If you need more parameters to be passed to the creation of the Irrlicht Engine device, use the createDeviceEx() function. \param deviceType: Type of the device. This can currently be video::EDT_NULL, - video::EDT_SOFTWARE, video::EDT_BURNINGSVIDEO, video::EDT_DIRECT3D8, video::EDT_DIRECT3D9 and video::EDT_OPENGL. + video::EDT_SOFTWARE, video::EDT_BURNINGSVIDEO, video::EDT_DIRECT3D9 and video::EDT_OPENGL. \param windowSize: Size of the window or the video mode in fullscreen mode. \param bits: Bits per pixel in fullscreen mode. Ignored if windowed mode. \param fullscreen: Should be set to true if the device should run in fullscreen. Otherwise diff --git a/media/d3d8.psh b/media/d3d8.psh deleted file mode 100644 index d38a3d61..00000000 --- a/media/d3d8.psh +++ /dev/null @@ -1,10 +0,0 @@ -; part of the Irrlicht Engine Shader example. -; This simple Direct3D9 pixel shader will be loaded by the engine. -; Please note that these example shaders don't do anything really useful. -; They only demonstrate that shaders can be used in Irrlicht. - -ps.1.1 - -tex t0 ; sample color map -mul_x2 t0, t0, v0 ; mulitply with color -add r0, t0, t0 ; make it brighter and store result diff --git a/media/d3d8.vsh b/media/d3d8.vsh deleted file mode 100644 index e0c24f70..00000000 --- a/media/d3d8.vsh +++ /dev/null @@ -1,37 +0,0 @@ -; part of the Irrlicht Engine Shader example. -; This Direct3D9 vertex shader will be loaded by the engine. -; Please note that these example shaders don't do anything really useful. -; They only demonstrate that shaders can be used in Irrlicht. - -vs.1.1 - -; transpose and transform position to clip space -mul r0, v0.x, c4 -mad r0, v0.y, c5, r0 -mad r0, v0.z, c6, r0 -add oPos, c7, r0 - -; transform normal -dp3 r1.x, v1, c0 -dp3 r1.y, v1, c1 -dp3 r1.z, v1, c2 - -; renormalize normal -dp3 r1.w, r1, r1 -rsq r1.w, r1.w -mul r1, r1, r1.w - -; calculate light vector -m4x4 r6, v0, c10 ; vertex into world position -add r2, c8, -r6 ; vtxpos - lightpos - -; normalize light vector -dp3 r2.w, r2, r2 -rsq r2.w, r2.w -mul r2, r2, r2.w - -; calculate light color -dp3 r3, r1, r2 ; dp3 with negative light vector -lit r5, r3 ; clamp to zero if r3 < 0, r5 has diffuce component in r5.y -mul oD0, r5.y, c9 ; ouput diffuse color -mov oT0, v3 ; store texture coordinates diff --git a/source/Irrlicht/CD3D8Driver.cpp b/source/Irrlicht/CD3D8Driver.cpp deleted file mode 100644 index f0454e67..00000000 --- a/source/Irrlicht/CD3D8Driver.cpp +++ /dev/null @@ -1,2586 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#include "IrrCompileConfig.h" - -#define _IRR_DONT_DO_MEMORY_DEBUGGING_HERE -#include "CD3D8Driver.h" - -#ifdef _IRR_COMPILE_WITH_DIRECT3D_8_ - -#include "os.h" -#include "S3DVertex.h" -#include "CD3D8Texture.h" -#include "CD3D8MaterialRenderer.h" -#include "CD3D8ShaderMaterialRenderer.h" -#include "CD3D8NormalMapRenderer.h" -#include "CD3D8ParallaxMapRenderer.h" -#include "SIrrCreationParameters.h" - -namespace irr -{ -namespace video -{ - - -//! constructor -CD3D8Driver::CD3D8Driver(const SIrrlichtCreationParameters& params, io::IFileSystem* io) - : CNullDriver(io, params.WindowSize), BridgeCalls(0), CurrentRenderMode(ERM_NONE), - ResetRenderStates(true), Transformation3DChanged(false), - D3DLibrary(0), pID3D(0), pID3DDevice(0), PrevRenderTarget(0), - WindowId(0), SceneSourceRect(0), - LastVertexType((video::E_VERTEX_TYPE)-1), - MaxTextureUnits(0), MaxUserClipPlanes(0), - MaxLightDistance(0), LastSetLight(-1), DeviceLost(false), - DriverWasReset(true), Params(params) -{ - #ifdef _DEBUG - setDebugName("CD3D8Driver"); - #endif - - printVersion(); - - for (u32 i=0; iRelease(); - - if (pID3D) - pID3D->Release(); -} - - -void CD3D8Driver::createMaterialRenderers() -{ - // create D3D8 material renderers - - addAndDropMaterialRenderer(new CD3D8MaterialRenderer_SOLID(pID3DDevice, this)); - addAndDropMaterialRenderer(new CD3D8MaterialRenderer_SOLID_2_LAYER(pID3DDevice, this)); - - // add the same renderer for all lightmap types - CD3D8MaterialRenderer_LIGHTMAP* lmr = new CD3D8MaterialRenderer_LIGHTMAP(pID3DDevice, this); - addMaterialRenderer(lmr); // for EMT_LIGHTMAP: - addMaterialRenderer(lmr); // for EMT_LIGHTMAP_ADD: - addMaterialRenderer(lmr); // for EMT_LIGHTMAP_M2: - addMaterialRenderer(lmr); // for EMT_LIGHTMAP_M4: - addMaterialRenderer(lmr); // for EMT_LIGHTMAP_LIGHTING: - addMaterialRenderer(lmr); // for EMT_LIGHTMAP_LIGHTING_M2: - addMaterialRenderer(lmr); // for EMT_LIGHTMAP_LIGHTING_M4: - lmr->drop(); - - // add remaining material renderers - addAndDropMaterialRenderer(new CD3D8MaterialRenderer_DETAIL_MAP(pID3DDevice, this)); - addAndDropMaterialRenderer(new CD3D8MaterialRenderer_SPHERE_MAP(pID3DDevice, this)); - addAndDropMaterialRenderer(new CD3D8MaterialRenderer_REFLECTION_2_LAYER(pID3DDevice, this)); - addAndDropMaterialRenderer(new CD3D8MaterialRenderer_TRANSPARENT_ADD_COLOR(pID3DDevice, this)); - addAndDropMaterialRenderer(new CD3D8MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL(pID3DDevice, this)); - addAndDropMaterialRenderer(new CD3D8MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL_REF(pID3DDevice, this)); - addAndDropMaterialRenderer(new CD3D8MaterialRenderer_TRANSPARENT_VERTEX_ALPHA(pID3DDevice, this)); - addAndDropMaterialRenderer(new CD3D8MaterialRenderer_TRANSPARENT_REFLECTION_2_LAYER(pID3DDevice, this)); - - // add normal map renderers - s32 tmp = 0; - video::IMaterialRenderer* renderer = 0; - - renderer = new CD3D8NormalMapRenderer(pID3DDevice, this, tmp, - MaterialRenderers[EMT_SOLID].Renderer); - renderer->drop(); - - renderer = new CD3D8NormalMapRenderer(pID3DDevice, this, tmp, - MaterialRenderers[EMT_TRANSPARENT_ADD_COLOR].Renderer); - renderer->drop(); - - renderer = new CD3D8NormalMapRenderer(pID3DDevice, this, tmp, - MaterialRenderers[EMT_TRANSPARENT_VERTEX_ALPHA].Renderer); - renderer->drop(); - - // add parallax map renderers - - renderer = new CD3D8ParallaxMapRenderer(pID3DDevice, this, tmp, - MaterialRenderers[EMT_SOLID].Renderer); - renderer->drop(); - - renderer = new CD3D8ParallaxMapRenderer(pID3DDevice, this, tmp, - MaterialRenderers[EMT_TRANSPARENT_ADD_COLOR].Renderer); - renderer->drop(); - - renderer = new CD3D8ParallaxMapRenderer(pID3DDevice, this, tmp, - MaterialRenderers[EMT_TRANSPARENT_VERTEX_ALPHA].Renderer); - renderer->drop(); - - // add basic 1 texture blending - addAndDropMaterialRenderer(new CD3D8MaterialRenderer_ONETEXTURE_BLEND(pID3DDevice, this)); -} - - -//! initialises the Direct3D API -bool CD3D8Driver::initDriver(HWND hwnd, bool pureSoftware) -{ - HRESULT hr; - typedef IDirect3D8 * (__stdcall *D3DCREATETYPE)(UINT); - -#if defined( _IRR_XBOX_PLATFORM_) - D3DCREATETYPE d3dCreate = (D3DCREATETYPE) &Direct3DCreate8; -#else - D3DLibrary = LoadLibrary( __TEXT("d3d8.dll") ); - - if (!D3DLibrary) - { - os::Printer::log("Error, could not load d3d8.dll.", ELL_ERROR); - return false; - } - - D3DCREATETYPE d3dCreate = (D3DCREATETYPE) GetProcAddress(D3DLibrary, "Direct3DCreate8"); - - if (!d3dCreate) - { - os::Printer::log("Error, could not get proc adress of Direct3DCreate8.", ELL_ERROR); - return false; - } -#endif - - //just like pID3D = Direct3DCreate8(D3D_SDK_VERSION); - pID3D = (*d3dCreate)(D3D_SDK_VERSION); - - if (!pID3D) - { - os::Printer::log("Error initializing D3D.", ELL_ERROR); - return false; - } - - // print device information - D3DADAPTER_IDENTIFIER8 dai; - if (!FAILED(pID3D->GetAdapterIdentifier(Params.DisplayAdapter, D3DENUM_NO_WHQL_LEVEL, &dai))) - { - char tmp[512]; - - s32 Product = HIWORD(dai.DriverVersion.HighPart); - s32 Version = LOWORD(dai.DriverVersion.HighPart); - s32 SubVersion = HIWORD(dai.DriverVersion.LowPart); - s32 Build = LOWORD(dai.DriverVersion.LowPart); - - sprintf(tmp, "%s %s %d.%d.%d.%d", dai.Description, dai.Driver, Product, Version, - SubVersion, Build); - os::Printer::log(tmp, ELL_INFORMATION); - } - - D3DDISPLAYMODE d3ddm; - hr = pID3D->GetAdapterDisplayMode(Params.DisplayAdapter, &d3ddm); - if (FAILED(hr)) - { - os::Printer::log("Error: Could not get Adapter Display mode.", ELL_ERROR); - return false; - } - - ZeroMemory(&present, sizeof(present)); - - present.SwapEffect = D3DSWAPEFFECT_DISCARD; - present.Windowed = TRUE; - present.BackBufferFormat = d3ddm.Format; - present.EnableAutoDepthStencil = TRUE; - - if (Params.Fullscreen) - { - present.SwapEffect = D3DSWAPEFFECT_FLIP; - present.Windowed = FALSE; - present.BackBufferWidth = Params.WindowSize.Width; - present.BackBufferHeight = Params.WindowSize.Height; - present.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; - - if (Params.Vsync) - present.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_ONE; - else - present.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; - - if (Params.Bits == 32) - present.BackBufferFormat = D3DFMT_X8R8G8B8; - else - present.BackBufferFormat = D3DFMT_R5G6B5; - } - - D3DDEVTYPE devtype = D3DDEVTYPE_HAL; - #ifndef _IRR_D3D_NO_SHADER_DEBUGGING - devtype = D3DDEVTYPE_REF; - #endif - - // enable anti alias if possible and whished - if (Params.AntiAlias > 0) - { - if(Params.AntiAlias > 16) - Params.AntiAlias = 16; - - while(Params.AntiAlias > 0) - { - if(!FAILED(pID3D->CheckDeviceMultiSampleType(Params.DisplayAdapter, - devtype , present.BackBufferFormat, !Params.Fullscreen, - (D3DMULTISAMPLE_TYPE)Params.AntiAlias))) - { - present.MultiSampleType = (D3DMULTISAMPLE_TYPE)Params.AntiAlias; - present.SwapEffect = D3DSWAPEFFECT_DISCARD; - break; - } - --Params.AntiAlias; - } - - if(Params.AntiAlias==0) - os::Printer::log("Anti aliasing disabled because hardware/driver lacks necessary caps.", ELL_WARNING); - } - - // check stencil buffer compatibility - if (Params.Stencilbuffer) - { - present.AutoDepthStencilFormat = D3DFMT_D24S8; - if(FAILED(pID3D->CheckDeviceFormat(Params.DisplayAdapter, devtype, - present.BackBufferFormat, D3DUSAGE_DEPTHSTENCIL, - D3DRTYPE_SURFACE, present.AutoDepthStencilFormat))) - { -#if !defined( _IRR_XBOX_PLATFORM_) - present.AutoDepthStencilFormat = D3DFMT_D24X4S4; - if(FAILED(pID3D->CheckDeviceFormat(Params.DisplayAdapter, devtype, - present.BackBufferFormat, D3DUSAGE_DEPTHSTENCIL, - D3DRTYPE_SURFACE, present.AutoDepthStencilFormat))) - { - present.AutoDepthStencilFormat = D3DFMT_D15S1; - if(FAILED(pID3D->CheckDeviceFormat(Params.DisplayAdapter, devtype, - present.BackBufferFormat, D3DUSAGE_DEPTHSTENCIL, - D3DRTYPE_SURFACE, present.AutoDepthStencilFormat))) - { - os::Printer::log("Device does not support stencilbuffer, disabling stencil buffer.", ELL_WARNING); - Params.Stencilbuffer = false; - } - } -#endif - } - else - if(FAILED(pID3D->CheckDepthStencilMatch(Params.DisplayAdapter, devtype, - present.BackBufferFormat, present.BackBufferFormat, present.AutoDepthStencilFormat))) - { - os::Printer::log("Depth-stencil format is not compatible with display format, disabling stencil buffer.", ELL_WARNING); - Params.Stencilbuffer = false; - } - } - // do not use else here to cope with flag change in previous block - if (!Params.Stencilbuffer) - { -#if !defined( _IRR_XBOX_PLATFORM_) - present.AutoDepthStencilFormat = D3DFMT_D32; - if(FAILED(pID3D->CheckDeviceFormat(Params.DisplayAdapter, devtype, - present.BackBufferFormat, D3DUSAGE_DEPTHSTENCIL, - D3DRTYPE_SURFACE, present.AutoDepthStencilFormat))) - { - present.AutoDepthStencilFormat = D3DFMT_D24X8; - if(FAILED(pID3D->CheckDeviceFormat(Params.DisplayAdapter, devtype, - present.BackBufferFormat, D3DUSAGE_DEPTHSTENCIL, - D3DRTYPE_SURFACE, present.AutoDepthStencilFormat))) - { - present.AutoDepthStencilFormat = D3DFMT_D16; - if(FAILED(pID3D->CheckDeviceFormat(Params.DisplayAdapter, devtype, - present.BackBufferFormat, D3DUSAGE_DEPTHSTENCIL, - D3DRTYPE_SURFACE, present.AutoDepthStencilFormat))) - { - os::Printer::log("Device does not support required depth buffer.", ELL_WARNING); - return false; - } - } - } -#else - present.AutoDepthStencilFormat = D3DFMT_D16; - if(FAILED(pID3D->CheckDeviceFormat(Params.DisplayAdapter, devtype, - present.BackBufferFormat, D3DUSAGE_DEPTHSTENCIL, - D3DRTYPE_SURFACE, present.AutoDepthStencilFormat))) - { - os::Printer::log("Device does not support required depth buffer.", ELL_WARNING); - return false; - } -#endif - } - - // create device -#if defined( _IRR_XBOX_PLATFORM_) - DWORD fpuPrecision = 0; -#else - DWORD fpuPrecision = Params.HighPrecisionFPU ? D3DCREATE_FPU_PRESERVE : 0; - DWORD multithreaded = Params.DriverMultithreaded ? D3DCREATE_MULTITHREADED : 0; -#endif - if (pureSoftware) - { - hr = pID3D->CreateDevice(Params.DisplayAdapter, D3DDEVTYPE_REF, hwnd, - fpuPrecision | multithreaded | D3DCREATE_SOFTWARE_VERTEXPROCESSING, &present, &pID3DDevice); - - if (FAILED(hr)) - os::Printer::log("Was not able to create Direct3D8 software device.", ELL_ERROR); - } - else - { - hr = pID3D->CreateDevice(Params.DisplayAdapter, devtype, hwnd, - fpuPrecision | multithreaded | D3DCREATE_HARDWARE_VERTEXPROCESSING, &present, &pID3DDevice); - - if(FAILED(hr)) - hr = pID3D->CreateDevice(Params.DisplayAdapter, devtype, hwnd, - fpuPrecision | multithreaded | D3DCREATE_MIXED_VERTEXPROCESSING , &present, &pID3DDevice); - if(FAILED(hr)) - hr = pID3D->CreateDevice(Params.DisplayAdapter, devtype, hwnd, - fpuPrecision | multithreaded | D3DCREATE_SOFTWARE_VERTEXPROCESSING, &present, &pID3DDevice); - if (FAILED(hr)) - os::Printer::log("Was not able to create Direct3D8 device.", ELL_ERROR); - } - - if (!pID3DDevice) - { - os::Printer::log("Was not able to create Direct3D8 device.", ELL_ERROR); - return false; - } - - // get caps - pID3DDevice->GetDeviceCaps(&Caps); - - if (Params.Stencilbuffer && - (!(Caps.StencilCaps & D3DSTENCILCAPS_DECRSAT) || - !(Caps.StencilCaps & D3DSTENCILCAPS_INCRSAT) || - !(Caps.StencilCaps & D3DSTENCILCAPS_KEEP))) - { - os::Printer::log("Device not able to use stencil buffer, disabling stencil buffer.", ELL_WARNING); - Params.Stencilbuffer = false; - } - - if (!BridgeCalls) - BridgeCalls = new CD3D8CallBridge(pID3DDevice); - - // set default vertex shader - setVertexShader(EVT_STANDARD); - - // enable antialiasing - if (Params.AntiAlias>0) - pID3DDevice->SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, TRUE); - - // set fog mode - setFog(FogColor, FogType, FogStart, FogEnd, FogDensity, PixelFog, RangeFog); - - // set exposed data - ExposedData.D3D8.D3D8 = pID3D; - ExposedData.D3D8.D3DDev8 = pID3DDevice; - ExposedData.D3D8.HWnd = hwnd; - - ResetRenderStates = true; - - // create materials - createMaterialRenderers(); - - MaxTextureUnits = core::min_((u32)Caps.MaxSimultaneousTextures, MATERIAL_MAX_TEXTURES); - MaxUserClipPlanes = (u32)Caps.MaxUserClipPlanes; - - DriverAttributes->setAttribute("MaxTextures", (s32)MaxTextureUnits); - DriverAttributes->setAttribute("MaxSupportedTextures", (s32)Caps.MaxSimultaneousTextures); - DriverAttributes->setAttribute("MaxLights", (s32)Caps.MaxActiveLights); - DriverAttributes->setAttribute("MaxAnisotropy", (s32)Caps.MaxAnisotropy); - DriverAttributes->setAttribute("MaxUserClipPlanes", (s32)Caps.MaxUserClipPlanes); - DriverAttributes->setAttribute("MaxIndices", (s32)Caps.MaxVertexIndex); - DriverAttributes->setAttribute("MaxTextureSize", (s32)core::min_(Caps.MaxTextureHeight,Caps.MaxTextureWidth)); - DriverAttributes->setAttribute("MaxTextureLODBias", 16.f); - DriverAttributes->setAttribute("Version", 800); - DriverAttributes->setAttribute("ShaderLanguageVersion", (s32)Caps.VertexShaderVersion*100); - DriverAttributes->setAttribute("AntiAlias", Params.AntiAlias); - - // set the renderstates - setRenderStates3DMode(); - - // so far so good. - return true; -} - - -//! applications must call this method before performing any rendering. returns false if failed. -bool CD3D8Driver::beginScene(bool backBuffer, bool zBuffer, SColor color, - const SExposedVideoData& videoData, core::rect* sourceRect) -{ - CNullDriver::beginScene(backBuffer, zBuffer, color, videoData, sourceRect); - WindowId = (HWND)videoData.D3D8.HWnd; - SceneSourceRect = sourceRect; - - if (!pID3DDevice) - return false; - - HRESULT hr; - if (DeviceLost) - { -#ifndef _IRR_XBOX_PLATFORM_ - if(FAILED(hr = pID3DDevice->TestCooperativeLevel())) - { - if (hr == D3DERR_DEVICELOST) - { - Sleep(100); - hr = pID3DDevice->TestCooperativeLevel(); - if (hr == D3DERR_DEVICELOST) - return false; - } - - if ((hr == D3DERR_DEVICENOTRESET) && !reset()) - return false; - } -#endif - } - - DWORD flags = 0; - - if (backBuffer) - flags |= D3DCLEAR_TARGET; - - if (zBuffer) - flags |= D3DCLEAR_ZBUFFER; - - if (Params.Stencilbuffer) - flags |= D3DCLEAR_STENCIL; - - if (flags) - { - hr = pID3DDevice->Clear( 0, NULL, flags, color.color, 1.0, 0); - if (FAILED(hr)) - os::Printer::log("Direct3D8 clear failed.", ELL_WARNING); - } - - hr = pID3DDevice->BeginScene(); - if (FAILED(hr)) - { - os::Printer::log("Direct3D8 begin scene failed.", ELL_WARNING); - return false; - } - - return true; -} - - -//! applications must call this method after performing any rendering. returns false if failed. -bool CD3D8Driver::endScene() -{ - CNullDriver::endScene(); - DriverWasReset=false; - - HRESULT hr = pID3DDevice->EndScene(); - if (FAILED(hr)) - { - os::Printer::log("DIRECT3D8 end scene failed.", ELL_WARNING); - return false; - } - - RECT* srcRct = 0; - RECT sourceRectData; - if ( SceneSourceRect) - { - srcRct = &sourceRectData; - sourceRectData.left = SceneSourceRect->UpperLeftCorner.X; - sourceRectData.top = SceneSourceRect->UpperLeftCorner.Y; - sourceRectData.right = SceneSourceRect->LowerRightCorner.X; - sourceRectData.bottom = SceneSourceRect->LowerRightCorner.Y; - } - - hr = pID3DDevice->Present(srcRct, NULL, WindowId, NULL); - - if (SUCCEEDED(hr)) - return true; - - if (hr == D3DERR_DEVICELOST) - { - DeviceLost = true; - os::Printer::log("DIRECT3D8 device lost.", ELL_WARNING); - } - else - os::Printer::log("DIRECT3D8 present failed.", ELL_WARNING); - return false; -} - - -//! resets the device -bool CD3D8Driver::reset() -{ - u32 i; - os::Printer::log("Resetting D3D8 device.", ELL_INFORMATION); - - for (i=0; iisRenderTarget()) - { - IDirect3DTexture8* tex = ((CD3D8Texture*)(Textures[i].Surface))->getDX8Texture(); - if (tex) - tex->Release(); - } - } - DriverWasReset=true; - - HRESULT hr = pID3DDevice->Reset(&present); - - for (i=0; iisRenderTarget()) - ((CD3D8Texture*)(Textures[i].Surface))->createRenderTarget(); - } - - if (FAILED(hr)) - { - if (hr == D3DERR_DEVICELOST) - { - DeviceLost = true; - os::Printer::log("Resetting failed due to device lost.", ELL_WARNING); - } - else - os::Printer::log("Resetting failed.", ELL_WARNING); - return false; - } - - DeviceLost = false; - ResetRenderStates = true; - LastVertexType = (E_VERTEX_TYPE)-1; - - for (i=0; i= D3DVS_VERSION(1,1); - case EVDF_VERTEX_SHADER_2_0: - return Caps.VertexShaderVersion >= D3DVS_VERSION(2,0); - case EVDF_VERTEX_SHADER_3_0: - return Caps.VertexShaderVersion >= D3DVS_VERSION(3,0); - case EVDF_PIXEL_SHADER_1_1: - return Caps.PixelShaderVersion >= D3DPS_VERSION(1,1); - case EVDF_PIXEL_SHADER_1_2: - return Caps.PixelShaderVersion >= D3DPS_VERSION(1,2); - case EVDF_PIXEL_SHADER_1_3: - return Caps.PixelShaderVersion >= D3DPS_VERSION(1,3); - case EVDF_PIXEL_SHADER_1_4: - return Caps.PixelShaderVersion >= D3DPS_VERSION(1,4); - case EVDF_PIXEL_SHADER_2_0: - return Caps.PixelShaderVersion >= D3DPS_VERSION(2,0); - case EVDF_PIXEL_SHADER_3_0: - return Caps.PixelShaderVersion >= D3DPS_VERSION(3,0); - case EVDF_TEXTURE_NSQUARE: - return (Caps.TextureCaps & D3DPTEXTURECAPS_SQUAREONLY) == 0; - case EVDF_TEXTURE_NPOT: - return (Caps.TextureCaps & D3DPTEXTURECAPS_POW2) == 0; - case EVDF_COLOR_MASK: - return (Caps.PrimitiveMiscCaps & D3DPMISCCAPS_COLORWRITEENABLE) != 0; - case EVDF_BLEND_OPERATIONS: - return true; - case EVDF_BLEND_SEPARATE: - return false; - case EVDF_TEXTURE_MATRIX: - return true; - case EVDF_TEXTURE_COMPRESSED_DXT: - return false; // TO-DO - default: - return false; - }; -} - - -//! sets transformation -void CD3D8Driver::setTransform(E_TRANSFORMATION_STATE state, - const core::matrix4& mat) -{ - switch(state) - { - case ETS_VIEW: - pID3DDevice->SetTransform(D3DTS_VIEW, (D3DMATRIX*)((void*)mat.pointer())); - Transformation3DChanged = true; - break; - case ETS_WORLD: - pID3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)((void*)mat.pointer())); - Transformation3DChanged = true; - break; - case ETS_PROJECTION: - pID3DDevice->SetTransform( D3DTS_PROJECTION, (D3DMATRIX*)((void*)mat.pointer())); - Transformation3DChanged = true; - break; - case ETS_COUNT: - return; - default: - if (state-ETS_TEXTURE_0 < MATERIAL_MAX_TEXTURES) - { - pID3DDevice->SetTextureStageState( state - ETS_TEXTURE_0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 ); - pID3DDevice->SetTransform((D3DTRANSFORMSTATETYPE)(D3DTS_TEXTURE0+ ( state - ETS_TEXTURE_0 )), - (D3DMATRIX*)((void*)mat.pointer())); - } - break; - } - - Matrices[state] = mat; -} - - -//! sets the current Texture -bool CD3D8Driver::setActiveTexture(u32 stage, const video::ITexture* texture) -{ - if (CurrentTexture[stage] == texture) - return true; - - if (texture && (texture->getDriverType() != EDT_DIRECT3D8)) - { - os::Printer::log("Fatal Error: Tried to set a texture not owned by this driver.", ELL_ERROR); - return false; - } - - CurrentTexture[stage] = texture; - - if (!texture) - { - pID3DDevice->SetTexture(stage, 0); - pID3DDevice->SetTextureStageState( stage, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE ); - } - else - { - pID3DDevice->SetTexture(stage, ((const CD3D8Texture*)texture)->getDX8Texture()); - } - return true; -} - - -//! sets a material -void CD3D8Driver::setMaterial(const SMaterial& material) -{ - Material = material; - OverrideMaterial.apply(Material); - - for (u32 i=0; igetDriverType() != EDT_DIRECT3D8) - { - os::Printer::log("Fatal Error: Tried to set a texture not owned by this driver.", ELL_ERROR); - return false; - } - - // check for valid render target - - CD3D8Texture* tex = (CD3D8Texture*)texture; - - if (texture && !tex->isRenderTarget()) - { - os::Printer::log("Fatal Error: Tried to set a non render target texture as render target.", ELL_ERROR); - return false; - } - - if (texture && (tex->getSize().Width > ScreenSize.Width || - tex->getSize().Height > ScreenSize.Height )) - { - os::Printer::log("Error: Tried to set a render target texture which is bigger than the screen.", ELL_ERROR); - return false; - } - - // check if we should set the previous RT back - - bool ret = true; - - if (tex == 0) - { - if (PrevRenderTarget) - { - IDirect3DSurface8* dss = 0; - pID3DDevice->GetDepthStencilSurface(&dss); - - if (FAILED(pID3DDevice->SetRenderTarget(PrevRenderTarget, dss))) - { - os::Printer::log("Error: Could not set back to previous render target.", ELL_ERROR); - ret = false; - } - - if (dss) - dss->Release(); - - CurrentRendertargetSize = core::dimension2d(0,0); - PrevRenderTarget->Release(); - PrevRenderTarget = 0; - } - } - else - { - // we want to set a new target. so do this. - - // store previous target - - if (!PrevRenderTarget && (FAILED(pID3DDevice->GetRenderTarget(&PrevRenderTarget)))) - { - os::Printer::log("Could not get previous render target.", ELL_ERROR); - return false; - } - - // set new render target - - IDirect3DSurface8* dss = 0; - pID3DDevice->GetDepthStencilSurface(&dss); - - if (FAILED(pID3DDevice->SetRenderTarget(tex->getRenderTargetSurface(), dss))) - { - os::Printer::log("Error: Could not set render target.", ELL_ERROR); - ret = false; - } - - if (dss) - dss->Release(); - - CurrentRendertargetSize = tex->getSize(); - } - Transformation3DChanged = true; - - if (clearBackBuffer || clearZBuffer) - { - DWORD flags = 0; - - if (clearBackBuffer) - flags |= D3DCLEAR_TARGET; - - if (clearZBuffer) - flags |= D3DCLEAR_ZBUFFER; - - pID3DDevice->Clear(0, NULL, flags, color.color, 1.0f, 0); - } - - return ret; -} - - -//! Creates a render target texture. -ITexture* CD3D8Driver::addRenderTargetTexture( - const core::dimension2d& size, const io::path& name, - const ECOLOR_FORMAT format) -{ - CD3D8Texture* tex = new CD3D8Texture(this, size, name); - if (tex) - { - if (!tex->Texture) - { - tex->drop(); - return 0; - } - addTexture(tex); - tex->drop(); - } - return tex; -} - - -//! sets a viewport -void CD3D8Driver::setViewPort(const core::rect& area) -{ - core::rect vp(area); - core::rect rendert(0,0, ScreenSize.Width, ScreenSize.Height); - vp.clipAgainst(rendert); - - D3DVIEWPORT8 viewPort; - viewPort.X = vp.UpperLeftCorner.X; - viewPort.Y = vp.UpperLeftCorner.Y; - viewPort.Width = vp.getWidth(); - viewPort.Height = vp.getHeight(); - viewPort.MinZ = 0.0f; - viewPort.MaxZ = 1.0f; - - HRESULT hr = D3DERR_INVALIDCALL; - if (vp.getHeight()>0 && vp.getWidth()>0) - hr = pID3DDevice->SetViewport(&viewPort); - - if (FAILED(hr)) - os::Printer::log("Failed setting the viewport.", ELL_WARNING); - - ViewPort = vp; -} - - -//! gets the area of the current viewport -const core::rect& CD3D8Driver::getViewPort() const -{ - return ViewPort; -} - - -//! draws a vertex primitive list -void CD3D8Driver::drawVertexPrimitiveList(const void* vertices, - u32 vertexCount, const void* indexList, u32 primitiveCount, - E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, - E_INDEX_TYPE iType) -{ - if (!checkPrimitiveCount(primitiveCount)) - return; - - CNullDriver::drawVertexPrimitiveList(vertices, vertexCount, indexList, primitiveCount, vType, pType,iType); - - if (!vertexCount || !primitiveCount) - return; - - draw2D3DVertexPrimitiveList(vertices, vertexCount, indexList, primitiveCount, - vType, pType, iType, true); -} - - -//! draws a vertex primitive list in 2d -void CD3D8Driver::draw2DVertexPrimitiveList(const void* vertices, - u32 vertexCount, const void* indexList, u32 primitiveCount, - E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, - E_INDEX_TYPE iType) -{ - if (!checkPrimitiveCount(primitiveCount)) - return; - - CNullDriver::draw2DVertexPrimitiveList(vertices, vertexCount, indexList, primitiveCount, vType, pType,iType); - - if (!vertexCount || !primitiveCount) - return; - - draw2D3DVertexPrimitiveList(vertices, vertexCount, indexList, primitiveCount, - vType, pType, iType, false); -} - - -void CD3D8Driver::draw2D3DVertexPrimitiveList(const void* vertices, - u32 vertexCount, const void* indexList, u32 primitiveCount, - E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, - E_INDEX_TYPE iType, bool is3D) -{ - setVertexShader(vType); - - const u32 stride = getVertexPitchFromType(vType); - - D3DFORMAT indexType=D3DFMT_UNKNOWN; - switch (iType) - { - case EIT_16BIT: - { - indexType=D3DFMT_INDEX16; - break; - } - case EIT_32BIT: - { -#if defined (_XBOX) - indexType=D3DFMT_INDEX16; -#else - indexType=D3DFMT_INDEX32; -#endif - break; - } - } - - if (is3D) - { - if (!setRenderStates3DMode()) - return; - } - else - { - if (Material.MaterialType==EMT_ONETEXTURE_BLEND) - { - E_BLEND_FACTOR srcFact; - E_BLEND_FACTOR dstFact; - E_MODULATE_FUNC modulo; - u32 alphaSource; - unpack_textureBlendFunc ( srcFact, dstFact, modulo, alphaSource, Material.MaterialTypeParam); - setRenderStates2DMode(alphaSource&video::EAS_VERTEX_COLOR, (Material.getTexture(0) != 0), (alphaSource&video::EAS_TEXTURE) != 0); - } - else - setRenderStates2DMode(Material.MaterialType==EMT_TRANSPARENT_VERTEX_ALPHA, (Material.getTexture(0) != 0), Material.MaterialType==EMT_TRANSPARENT_ALPHA_CHANNEL); - } - - switch (pType) - { - case scene::EPT_POINT_SPRITES: - case scene::EPT_POINTS: - { - f32 tmp=Material.Thickness/getScreenSize().Height; - if (pType==scene::EPT_POINT_SPRITES) - pID3DDevice->SetRenderState(D3DRS_POINTSPRITEENABLE, TRUE); - pID3DDevice->SetRenderState(D3DRS_POINTSCALEENABLE, TRUE); - pID3DDevice->SetRenderState(D3DRS_POINTSIZE, *(DWORD*)(&tmp)); - tmp=1.0f; - pID3DDevice->SetRenderState(D3DRS_POINTSCALE_A, *(DWORD*)(&tmp)); - pID3DDevice->SetRenderState(D3DRS_POINTSCALE_B, *(DWORD*)(&tmp)); - pID3DDevice->SetRenderState(D3DRS_POINTSIZE_MIN, *(DWORD*)(&tmp)); - tmp=0.0f; - pID3DDevice->SetRenderState(D3DRS_POINTSCALE_C, *(DWORD*)(&tmp)); - pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_POINTLIST, 0, vertexCount, - primitiveCount, indexList, indexType, vertices, stride); - pID3DDevice->SetRenderState(D3DRS_POINTSCALEENABLE, FALSE); - if (pType==scene::EPT_POINT_SPRITES) - pID3DDevice->SetRenderState(D3DRS_POINTSPRITEENABLE, FALSE); - } - break; - case scene::EPT_LINE_STRIP: - pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_LINESTRIP, 0, vertexCount, - primitiveCount, indexList, indexType, vertices, stride); - break; - case scene::EPT_LINE_LOOP: - { - pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_LINESTRIP, 0, vertexCount, - primitiveCount - 1, indexList, indexType, vertices, stride); - u16 tmpIndices[] = {primitiveCount - 1, 0}; - pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_LINELIST, 0, vertexCount, - 1, tmpIndices, indexType, vertices, stride); - } - break; - case scene::EPT_LINES: - pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_LINELIST, 0, vertexCount, - primitiveCount, indexList, indexType, vertices, stride); - break; - case scene::EPT_TRIANGLE_STRIP: - pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLESTRIP, 0, vertexCount, - primitiveCount, indexList, indexType, vertices, stride); - break; - case scene::EPT_TRIANGLE_FAN: - pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLEFAN, 0, vertexCount, - primitiveCount, indexList, indexType, vertices, stride); - break; - case scene::EPT_TRIANGLES: - pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, vertexCount, - primitiveCount, indexList, indexType, vertices, stride); - break; - } -} - - -//! draws an 2d image, using a color (if color is other then Color(255,255,255,255)) and the alpha channel of the texture if wanted. -void CD3D8Driver::draw2DImage(const video::ITexture* texture, - const core::position2d& pos, - const core::rect& sourceRect, - const core::rect* clipRect, SColor color, - bool useAlphaChannelOfTexture) -{ - if (!texture) - return; - - if (!sourceRect.isValid()) - return; - - if (!setActiveTexture(0, texture)) - return; - - core::position2d targetPos = pos; - core::position2d sourcePos = sourceRect.UpperLeftCorner; - // This needs to be signed as it may go negative. - core::dimension2d sourceSize(sourceRect.getSize()); - const core::dimension2d& renderTargetSize = getCurrentRenderTargetSize(); - - if (clipRect) - { - if (targetPos.X < clipRect->UpperLeftCorner.X) - { - sourceSize.Width += targetPos.X - clipRect->UpperLeftCorner.X; - if (sourceSize.Width <= 0) - return; - - sourcePos.X -= targetPos.X - clipRect->UpperLeftCorner.X; - targetPos.X = clipRect->UpperLeftCorner.X; - } - - if (targetPos.X + (s32)sourceSize.Width > clipRect->LowerRightCorner.X) - { - sourceSize.Width -= (targetPos.X + sourceSize.Width) - clipRect->LowerRightCorner.X; - if (sourceSize.Width <= 0) - return; - } - - if (targetPos.Y < clipRect->UpperLeftCorner.Y) - { - sourceSize.Height += targetPos.Y - clipRect->UpperLeftCorner.Y; - if (sourceSize.Height <= 0) - return; - - sourcePos.Y -= targetPos.Y - clipRect->UpperLeftCorner.Y; - targetPos.Y = clipRect->UpperLeftCorner.Y; - } - - if (targetPos.Y + (s32)sourceSize.Height > clipRect->LowerRightCorner.Y) - { - sourceSize.Height -= (targetPos.Y + sourceSize.Height) - clipRect->LowerRightCorner.Y; - if (sourceSize.Height <= 0) - return; - } - } - - // clip these coordinates - - if (targetPos.X<0) - { - sourceSize.Width += targetPos.X; - if (sourceSize.Width <= 0) - return; - - sourcePos.X -= targetPos.X; - targetPos.X = 0; - } - - if (targetPos.X + sourceSize.Width > (s32)renderTargetSize.Width) - { - sourceSize.Width -= (targetPos.X + sourceSize.Width) - renderTargetSize.Width; - if (sourceSize.Width <= 0) - return; - } - - if (targetPos.Y<0) - { - sourceSize.Height += targetPos.Y; - if (sourceSize.Height <= 0) - return; - - sourcePos.Y -= targetPos.Y; - targetPos.Y = 0; - } - - if (targetPos.Y + sourceSize.Height > (s32)renderTargetSize.Height) - { - sourceSize.Height -= (targetPos.Y + sourceSize.Height) - renderTargetSize.Height; - if (sourceSize.Height <= 0) - return; - } - - // ok, we've clipped everything. - // now draw it. - - core::rect tcoords; - tcoords.UpperLeftCorner.X = (f32)sourcePos.X / texture->getOriginalSize().Width ; - tcoords.UpperLeftCorner.Y = (f32)sourcePos.Y / texture->getOriginalSize().Height; - tcoords.LowerRightCorner.X = tcoords.UpperLeftCorner.X + (f32)sourceSize.Width / texture->getOriginalSize().Width; - tcoords.LowerRightCorner.Y = tcoords.UpperLeftCorner.Y + (f32)sourceSize.Height / texture->getOriginalSize().Height; - - const core::rect poss(targetPos, sourceSize); - - setRenderStates2DMode(color.getAlpha()<255, true, useAlphaChannelOfTexture); - - S3DVertex vtx[4]; - vtx[0] = S3DVertex((f32)poss.UpperLeftCorner.X, - (f32)poss.UpperLeftCorner.Y, 0.0f, - 0.0f, 0.0f, 0.0f, color, - tcoords.UpperLeftCorner.X, tcoords.UpperLeftCorner.Y); - vtx[1] = S3DVertex((f32)poss.LowerRightCorner.X, - (f32)poss.UpperLeftCorner.Y, 0.0f, - 0.0f, 0.0f, 0.0f, color, - tcoords.LowerRightCorner.X, tcoords.UpperLeftCorner.Y); - vtx[2] = S3DVertex((f32)poss.LowerRightCorner.X, - (f32)poss.LowerRightCorner.Y, 0.0f, - 0.0f, 0.0f, 0.0f, color, - tcoords.LowerRightCorner.X, tcoords.LowerRightCorner.Y); - vtx[3] = S3DVertex((f32)poss.UpperLeftCorner.X, - (f32)poss.LowerRightCorner.Y, 0.0f, - 0.0f, 0.0f, 0.0f, color, - tcoords.UpperLeftCorner.X, tcoords.LowerRightCorner.Y); - - const s16 indices[6] = {0,1,2,0,2,3}; - - setVertexShader(EVT_STANDARD); - - pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, 4, 2, &indices[0], - D3DFMT_INDEX16, &vtx[0], sizeof(S3DVertex)); -} - - -void CD3D8Driver::draw2DImage(const video::ITexture* texture, - const core::rect& destRect, - const core::rect& sourceRect, - const core::rect* clipRect, - const video::SColor* const colors, - bool useAlphaChannelOfTexture) -{ - if(!texture) - return; - - const core::dimension2d& ss = texture->getOriginalSize(); - core::rect tcoords; - tcoords.UpperLeftCorner.X = (f32)sourceRect.UpperLeftCorner.X / (f32)ss.Width; - tcoords.UpperLeftCorner.Y = (f32)sourceRect.UpperLeftCorner.Y / (f32)ss.Height; - tcoords.LowerRightCorner.X = (f32)sourceRect.LowerRightCorner.X / (f32)ss.Width; - tcoords.LowerRightCorner.Y = (f32)sourceRect.LowerRightCorner.Y / (f32)ss.Height; - - core::rect clippedRect(destRect); - if (clipRect) - { - clippedRect.clipAgainst(*clipRect); - - //tcoords must be clipped by the same factors - const f32 tcWidth = tcoords.getWidth(); - const f32 tcHeight = tcoords.getHeight(); - - const f32 invDestRectWidth = 1.f / (f32)(destRect.getWidth()); - f32 scale = (f32)(clippedRect.UpperLeftCorner.X - destRect.UpperLeftCorner.X) * invDestRectWidth; - tcoords.UpperLeftCorner.X += scale * tcWidth; - scale = (f32)(destRect.LowerRightCorner.X - clippedRect.LowerRightCorner.X) * invDestRectWidth; - tcoords.LowerRightCorner.X -= scale * tcWidth; - - const f32 invDestRectHeight = 1.f / (f32)(destRect.getHeight()); - scale = (f32)(clippedRect.UpperLeftCorner.Y - destRect.UpperLeftCorner.Y) * invDestRectHeight; - tcoords.UpperLeftCorner.Y += scale * tcHeight; - scale = (f32)(destRect.LowerRightCorner.Y - clippedRect.LowerRightCorner.Y) * invDestRectHeight; - tcoords.LowerRightCorner.Y -= scale * tcHeight; - } - - const video::SColor temp[4] = - { - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF - }; - - const video::SColor* const useColor = colors ? colors : temp; - - S3DVertex vtx[4]; // clock wise - vtx[0] = S3DVertex((f32)clippedRect.UpperLeftCorner.X, (f32)clippedRect.UpperLeftCorner.Y, 0.0f, - 0.0f, 0.0f, 0.0f, useColor[0], - tcoords.UpperLeftCorner.X, tcoords.UpperLeftCorner.Y); - vtx[1] = S3DVertex((f32)clippedRect.LowerRightCorner.X, (f32)clippedRect.UpperLeftCorner.Y, 0.0f, - 0.0f, 0.0f, 0.0f, useColor[3], - tcoords.LowerRightCorner.X, tcoords.UpperLeftCorner.Y); - vtx[2] = S3DVertex((f32)clippedRect.LowerRightCorner.X, (f32)clippedRect.LowerRightCorner.Y, 0.0f, - 0.0f, 0.0f, 0.0f, useColor[2], - tcoords.LowerRightCorner.X, tcoords.LowerRightCorner.Y); - vtx[3] = S3DVertex((f32)clippedRect.UpperLeftCorner.X, (f32)clippedRect.LowerRightCorner.Y, 0.0f, - 0.0f, 0.0f, 0.0f, useColor[1], - tcoords.UpperLeftCorner.X, tcoords.LowerRightCorner.Y); - - const s16 indices[6] = {0,1,2,0,2,3}; - - setRenderStates2DMode(useColor[0].getAlpha()<255 || useColor[1].getAlpha()<255 || - useColor[2].getAlpha()<255 || useColor[3].getAlpha()<255, - true, useAlphaChannelOfTexture); - - setActiveTexture(0, texture); - - setVertexShader(EVT_STANDARD); - - pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, 4, 2, &indices[0], - D3DFMT_INDEX16, &vtx[0], sizeof(S3DVertex)); -} - - -//!Draws an 2d rectangle with a gradient. -void CD3D8Driver::draw2DRectangle(const core::rect& position, - SColor colorLeftUp, SColor colorRightUp, SColor colorLeftDown, - SColor colorRightDown, const core::rect* clip) -{ - core::rect pos(position); - - if (clip) - pos.clipAgainst(*clip); - - if (!pos.isValid()) - return; - - S3DVertex vtx[4]; - vtx[0] = S3DVertex((f32)pos.UpperLeftCorner.X, (f32)pos.UpperLeftCorner.Y, 0.0f, - 0.0f, 0.0f, 0.0f, colorLeftUp, 0.0f, 0.0f); - vtx[1] = S3DVertex((f32)pos.LowerRightCorner.X, (f32)pos.UpperLeftCorner.Y, 0.0f, - 0.0f, 0.0f, 0.0f, colorRightUp, 0.0f, 1.0f); - vtx[2] = S3DVertex((f32)pos.LowerRightCorner.X, (f32)pos.LowerRightCorner.Y, 0.0f, - 0.0f, 0.0f, 0.0f, colorRightDown, 1.0f, 0.0f); - vtx[3] = S3DVertex((f32)pos.UpperLeftCorner.X, (f32)pos.LowerRightCorner.Y, 0.0f, - 0.0f, 0.0f, 0.0f, colorLeftDown, 1.0f, 1.0f); - - const s16 indices[6] = {0,1,2,0,2,3}; - - setRenderStates2DMode( - colorLeftUp.getAlpha() < 255 || - colorRightUp.getAlpha() < 255 || - colorLeftDown.getAlpha() < 255 || - colorRightDown.getAlpha() < 255, false, false); - - setActiveTexture(0,0); - - setVertexShader(EVT_STANDARD); - - pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, 4, 2, &indices[0], - D3DFMT_INDEX16, &vtx[0], sizeof(S3DVertex)); -} - - -//! Draws a 2d line. -void CD3D8Driver::draw2DLine(const core::position2d& start, - const core::position2d& end, - SColor color) -{ - if (start==end) - drawPixel(start.X, start.Y, color); - else - { - // thanks to Vash TheStampede who sent in his implementation - S3DVertex vtx[2]; - vtx[0] = S3DVertex((f32)start.X+0.375f, (f32)start.Y+0.375f, 0.0f, - 0.0f, 0.0f, 0.0f, // normal - color, 0.0f, 0.0f); // texture - - vtx[1] = S3DVertex((f32)end.X+0.375f, (f32)end.Y+0.375f, 0.0f, - 0.0f, 0.0f, 0.0f, - color, 0.0f, 0.0f); - - setRenderStates2DMode(color.getAlpha() < 255, false, false); - setActiveTexture(0,0); - - setVertexShader(EVT_STANDARD); - - pID3DDevice->DrawPrimitiveUP(D3DPT_LINELIST, 1, &vtx[0], sizeof(S3DVertex)); - } -} - - -//! Draws a pixel -void CD3D8Driver::drawPixel(u32 x, u32 y, const SColor & color) -{ - const core::dimension2d& renderTargetSize = getCurrentRenderTargetSize(); - if (x > (u32)renderTargetSize.Width || y > (u32)renderTargetSize.Height) - return; - - setRenderStates2DMode(color.getAlpha() < 255, false, false); - setActiveTexture(0,0); - - setVertexShader(EVT_STANDARD); - - S3DVertex vertex((f32)x+0.375f, (f32)y+0.375f, 0.f, 0.f, 0.f, 0.f, color, 0.f, 0.f); - - pID3DDevice->DrawPrimitiveUP(D3DPT_POINTLIST, 1, &vertex, sizeof(vertex)); -} - - -//! sets right vertex shader -void CD3D8Driver::setVertexShader(E_VERTEX_TYPE newType) -{ - // Because we don't know if a vertex shader was set in a material instead of a - // fvf, this call cannot be prevented in D3D8. - //if (newType != LastVertexType) - { - LastVertexType = newType; - HRESULT hr = 0; - - switch(newType) - { - case EVT_STANDARD: - hr = pID3DDevice->SetVertexShader(D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX1); - break; - case EVT_2TCOORDS: - hr = pID3DDevice->SetVertexShader(D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX2); - break; - case EVT_TANGENTS: - hr = pID3DDevice->SetVertexShader(D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX3 | - D3DFVF_TEXCOORDSIZE2(0) | // real texture coord - D3DFVF_TEXCOORDSIZE3(1) | // misuse texture coord 2 for tangent - D3DFVF_TEXCOORDSIZE3(2) // misuse texture coord 3 for binormal - ); - break; - } - - if (FAILED(hr)) - { - os::Printer::log("Could not set vertex Shader.", ELL_ERROR); - return; - } - } -} - - -//! sets the needed renderstates -bool CD3D8Driver::setRenderStates3DMode() -{ - if (!pID3DDevice) - return false; - - if (CurrentRenderMode != ERM_3D) - { - // switch back the matrices - pID3DDevice->SetTransform(D3DTS_VIEW, (D3DMATRIX*)((void*)&Matrices[ETS_VIEW])); - pID3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)((void*)&Matrices[ETS_WORLD])); - pID3DDevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)((void*)&Matrices[ETS_PROJECTION])); - - pID3DDevice->SetRenderState(D3DRS_STENCILENABLE, FALSE); - - ResetRenderStates = true; - } - - if (ResetRenderStates || LastMaterial != Material) - { - // unset old material - - if (CurrentRenderMode == ERM_3D && - LastMaterial.MaterialType != Material.MaterialType && - LastMaterial.MaterialType >= 0 && LastMaterial.MaterialType < (s32)MaterialRenderers.size()) - MaterialRenderers[LastMaterial.MaterialType].Renderer->OnUnsetMaterial(); - - // set new material. - - if (Material.MaterialType >= 0 && Material.MaterialType < (s32)MaterialRenderers.size()) - MaterialRenderers[Material.MaterialType].Renderer->OnSetMaterial( - Material, LastMaterial, ResetRenderStates, this); - } - - bool shaderOK = true; - - if (Material.MaterialType >= 0 && Material.MaterialType < (s32)MaterialRenderers.size()) - shaderOK = MaterialRenderers[Material.MaterialType].Renderer->OnRender(this, LastVertexType); - - LastMaterial = Material; - - ResetRenderStates = false; - - CurrentRenderMode = ERM_3D; - - return shaderOK; -} - - -//! Map Irrlicht texture wrap mode to native values -D3DTEXTUREADDRESS CD3D8Driver::getTextureWrapMode(const u8 clamp) -{ - switch (clamp) - { - case ETC_REPEAT: - if (Caps.TextureAddressCaps & D3DPTADDRESSCAPS_WRAP) - return D3DTADDRESS_WRAP; - case ETC_CLAMP: - case ETC_CLAMP_TO_EDGE: - if (Caps.TextureAddressCaps & D3DPTADDRESSCAPS_CLAMP) - return D3DTADDRESS_CLAMP; - case ETC_MIRROR: - if (Caps.TextureAddressCaps & D3DPTADDRESSCAPS_MIRROR) - return D3DTADDRESS_MIRROR; - case ETC_CLAMP_TO_BORDER: - if (Caps.TextureAddressCaps & D3DPTADDRESSCAPS_BORDER) - return D3DTADDRESS_BORDER; - else - return D3DTADDRESS_CLAMP; -#if defined(_XBOX ) - case ETC_MIRROR_CLAMP: - return D3DTADDRESS_CLAMP; - case ETC_MIRROR_CLAMP_TO_EDGE: - return D3DTADDRESS_CLAMPTOEDGE; - case ETC_MIRROR_CLAMP_TO_BORDER: - return D3DTADDRESS_BORDER; -#else - case ETC_MIRROR_CLAMP: - case ETC_MIRROR_CLAMP_TO_EDGE: - case ETC_MIRROR_CLAMP_TO_BORDER: - if (Caps.TextureAddressCaps & D3DPTADDRESSCAPS_MIRRORONCE) - return D3DTADDRESS_MIRRORONCE; - else - return D3DTADDRESS_CLAMP; - -#endif - default: - return D3DTADDRESS_WRAP; - } -} - - -//! Can be called by an IMaterialRenderer to make its work easier. -void CD3D8Driver::setBasicRenderStates(const SMaterial& material, const SMaterial& lastmaterial, - bool resetAllRenderstates) -{ - if (resetAllRenderstates || - lastmaterial.AmbientColor != material.AmbientColor || - lastmaterial.DiffuseColor != material.DiffuseColor || - lastmaterial.SpecularColor != material.SpecularColor || - lastmaterial.EmissiveColor != material.EmissiveColor || - lastmaterial.Shininess != material.Shininess) - { - D3DMATERIAL8 mat; - mat.Diffuse = colorToD3D(material.DiffuseColor); - mat.Ambient = colorToD3D(material.AmbientColor); - mat.Specular = colorToD3D(material.SpecularColor); - mat.Emissive = colorToD3D(material.EmissiveColor); - mat.Power = material.Shininess; - pID3DDevice->SetMaterial(&mat); - } - - if (lastmaterial.ColorMaterial != material.ColorMaterial) - { - pID3DDevice->SetRenderState(D3DRS_COLORVERTEX, (material.ColorMaterial != ECM_NONE)); - pID3DDevice->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, - ((material.ColorMaterial == ECM_DIFFUSE)|| - (material.ColorMaterial == ECM_DIFFUSE_AND_AMBIENT))?D3DMCS_COLOR1:D3DMCS_MATERIAL); - pID3DDevice->SetRenderState(D3DRS_AMBIENTMATERIALSOURCE, - ((material.ColorMaterial == ECM_AMBIENT)|| - (material.ColorMaterial == ECM_DIFFUSE_AND_AMBIENT))?D3DMCS_COLOR1:D3DMCS_MATERIAL); - pID3DDevice->SetRenderState(D3DRS_EMISSIVEMATERIALSOURCE, - (material.ColorMaterial == ECM_EMISSIVE)?D3DMCS_COLOR1:D3DMCS_MATERIAL); - pID3DDevice->SetRenderState(D3DRS_SPECULARMATERIALSOURCE, - (material.ColorMaterial == ECM_SPECULAR)?D3DMCS_COLOR1:D3DMCS_MATERIAL); - } - - // fillmode - if (resetAllRenderstates || lastmaterial.Wireframe != material.Wireframe || lastmaterial.PointCloud != material.PointCloud) - { - if (material.Wireframe) - pID3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); - else - if (material.PointCloud) - pID3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_POINT); - else - pID3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); - } - - // shademode - if (resetAllRenderstates || lastmaterial.GouraudShading != material.GouraudShading) - { - if (material.GouraudShading) - pID3DDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD); - else - pID3DDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT); - } - - // lighting - if (resetAllRenderstates || lastmaterial.Lighting != material.Lighting) - { - if (material.Lighting) - pID3DDevice->SetRenderState(D3DRS_LIGHTING, TRUE); - else - pID3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE); - } - - // zbuffer - if (resetAllRenderstates || lastmaterial.ZBuffer != material.ZBuffer) - { - switch (material.ZBuffer) - { - case ECFN_DISABLED: - pID3DDevice->SetRenderState(D3DRS_ZENABLE, FALSE); - break; - case ECFN_LESSEQUAL: - pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE); - pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL); - break; - case ECFN_EQUAL: - pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE); - pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_EQUAL); - break; - case ECFN_LESS: - pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE); - pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS); - break; - case ECFN_NOTEQUAL: - pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE); - pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_NOTEQUAL); - break; - case ECFN_GREATEREQUAL: - pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE); - pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_GREATEREQUAL); - break; - case ECFN_GREATER: - pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE); - pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_GREATER); - break; - case ECFN_ALWAYS: - pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE); - pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS); - break; - case ECFN_NEVER: - pID3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE); - pID3DDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_NEVER); - break; - } - } - - // zwrite -// if (resetAllRenderstates || lastmaterial.ZWriteEnable != material.ZWriteEnable) - { - if (material.ZWriteEnable && (AllowZWriteOnTransparent || (!material.isTransparent() && - !MaterialRenderers[material.MaterialType].Renderer->isTransparent()))) - { - pID3DDevice->SetRenderState( D3DRS_ZWRITEENABLE, TRUE); - } - else - pID3DDevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE); - } - - // back face culling - if (resetAllRenderstates || (lastmaterial.FrontfaceCulling != material.FrontfaceCulling) || (lastmaterial.BackfaceCulling != material.BackfaceCulling)) - { -// if (material.FrontfaceCulling && material.BackfaceCulling) -// pID3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW|D3DCULL_CCW); -// else - if (material.FrontfaceCulling) - pID3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); - else - if (material.BackfaceCulling) - pID3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); - else - pID3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); - } - - // fog - if (resetAllRenderstates || lastmaterial.FogEnable != material.FogEnable) - { - pID3DDevice->SetRenderState(D3DRS_FOGENABLE, material.FogEnable); - } - - // specular highlights - if (resetAllRenderstates || !core::equals(lastmaterial.Shininess, material.Shininess)) - { - bool enable = (material.Shininess!=0); - pID3DDevice->SetRenderState(D3DRS_SPECULARENABLE, enable); - pID3DDevice->SetRenderState(D3DRS_NORMALIZENORMALS, enable); - pID3DDevice->SetRenderState(D3DRS_SPECULARMATERIALSOURCE, D3DMCS_MATERIAL); - } - - // normalization - if (resetAllRenderstates || lastmaterial.NormalizeNormals != material.NormalizeNormals) - { - pID3DDevice->SetRenderState(D3DRS_NORMALIZENORMALS, material.NormalizeNormals); - } - - // Color Mask - if (queryFeature(EVDF_COLOR_MASK) && - (resetAllRenderstates || lastmaterial.ColorMask != material.ColorMask)) - { - const DWORD flag = - ((material.ColorMask & ECP_RED)?D3DCOLORWRITEENABLE_RED:0) | - ((material.ColorMask & ECP_GREEN)?D3DCOLORWRITEENABLE_GREEN:0) | - ((material.ColorMask & ECP_BLUE)?D3DCOLORWRITEENABLE_BLUE:0) | - ((material.ColorMask & ECP_ALPHA)?D3DCOLORWRITEENABLE_ALPHA:0); - pID3DDevice->SetRenderState(D3DRS_COLORWRITEENABLE, flag); - } - - // Blend Operation - if (material.BlendOperation == EBO_NONE) - BridgeCalls->setBlend(false); - else - { - BridgeCalls->setBlend(true); - - if (queryFeature(EVDF_BLEND_OPERATIONS)) - { - switch (material.BlendOperation) - { - case EBO_MAX: - case EBO_MAX_FACTOR: - case EBO_MAX_ALPHA: - BridgeCalls->setBlendOperation(D3DBLENDOP_MAX); - break; - case EBO_MIN: - case EBO_MIN_FACTOR: - case EBO_MIN_ALPHA: - BridgeCalls->setBlendOperation(D3DBLENDOP_MIN); - break; - case EBO_SUBTRACT: - BridgeCalls->setBlendOperation(D3DBLENDOP_SUBTRACT); - break; - case EBO_REVSUBTRACT: - BridgeCalls->setBlendOperation(D3DBLENDOP_REVSUBTRACT); - break; - default: - BridgeCalls->setBlendOperation(D3DBLENDOP_ADD); - break; - } - } - } - - // Blend Factor - if (IR(material.BlendFactor) & 0xFFFFFFFF) - { - E_BLEND_FACTOR srcFact = EBF_ZERO; - E_BLEND_FACTOR dstFact = EBF_ZERO; - E_MODULATE_FUNC modulo = EMFN_MODULATE_1X; - u32 alphaSource = 0; - - unpack_textureBlendFunc(srcFact, dstFact, modulo, alphaSource, material.BlendFactor); - - BridgeCalls->setBlendFunc(getD3DBlend(srcFact), getD3DBlend(dstFact)); - } - - // Polygon offset - if (queryFeature(EVDF_POLYGON_OFFSET) && (resetAllRenderstates || - lastmaterial.PolygonOffsetDirection != material.PolygonOffsetDirection || - lastmaterial.PolygonOffsetFactor != material.PolygonOffsetFactor)) - { - pID3DDevice->SetRenderState(D3DRS_ZBIAS, material.PolygonOffsetFactor); - } - - // thickness - if (resetAllRenderstates || lastmaterial.Thickness != material.Thickness) - { - pID3DDevice->SetRenderState(D3DRS_POINTSIZE, *((DWORD*)&material.Thickness)); - } - - // texture address mode - for (u32 st=0; stSetTextureStageState(st, D3DTSS_MIPMAPLODBIAS, *(DWORD*)(&tmp)); - } - - if (resetAllRenderstates || lastmaterial.TextureLayer[st].TextureWrapU != material.TextureLayer[st].TextureWrapU) - pID3DDevice->SetTextureStageState(st, D3DTSS_ADDRESSU, getTextureWrapMode(material.TextureLayer[st].TextureWrapU)); - // If separate UV not supported reuse U for V - if (!(Caps.TextureAddressCaps & D3DPTADDRESSCAPS_INDEPENDENTUV)) - pID3DDevice->SetTextureStageState(st, D3DTSS_ADDRESSV, getTextureWrapMode(material.TextureLayer[st].TextureWrapU)); - else if (resetAllRenderstates || lastmaterial.TextureLayer[st].TextureWrapV != material.TextureLayer[st].TextureWrapV) - pID3DDevice->SetTextureStageState(st, D3DTSS_ADDRESSV, getTextureWrapMode(material.TextureLayer[st].TextureWrapV)); - - // Bilinear and/or trilinear - if (resetAllRenderstates || - lastmaterial.TextureLayer[st].BilinearFilter != material.TextureLayer[st].BilinearFilter || - lastmaterial.TextureLayer[st].TrilinearFilter != material.TextureLayer[st].TrilinearFilter || - lastmaterial.TextureLayer[st].AnisotropicFilter != material.TextureLayer[st].AnisotropicFilter || - lastmaterial.UseMipMaps != material.UseMipMaps) - { - if (material.TextureLayer[st].BilinearFilter || material.TextureLayer[st].TrilinearFilter || material.TextureLayer[st].AnisotropicFilter>1) - { - const D3DTEXTUREFILTERTYPE tftMag = ((Caps.TextureFilterCaps & D3DPTFILTERCAPS_MAGFANISOTROPIC) && - material.TextureLayer[st].AnisotropicFilter) ? D3DTEXF_ANISOTROPIC : D3DTEXF_LINEAR; - const D3DTEXTUREFILTERTYPE tftMin = ((Caps.TextureFilterCaps & D3DPTFILTERCAPS_MINFANISOTROPIC) && - material.TextureLayer[st].AnisotropicFilter) ? D3DTEXF_ANISOTROPIC : D3DTEXF_LINEAR; - const D3DTEXTUREFILTERTYPE tftMip = material.UseMipMaps? (material.TextureLayer[st].TrilinearFilter ? D3DTEXF_LINEAR : D3DTEXF_POINT) : D3DTEXF_NONE; - - if (tftMag==D3DTEXF_ANISOTROPIC || tftMin == D3DTEXF_ANISOTROPIC) - pID3DDevice->SetTextureStageState(st, D3DTSS_MAXANISOTROPY, core::min_((DWORD)material.TextureLayer[st].AnisotropicFilter, Caps.MaxAnisotropy)); - pID3DDevice->SetTextureStageState(st, D3DTSS_MAGFILTER, tftMag); - pID3DDevice->SetTextureStageState(st, D3DTSS_MINFILTER, tftMin); - pID3DDevice->SetTextureStageState(st, D3DTSS_MIPFILTER, tftMip); - } - else - { - pID3DDevice->SetTextureStageState(st, D3DTSS_MINFILTER, D3DTEXF_POINT); - pID3DDevice->SetTextureStageState(st, D3DTSS_MIPFILTER, D3DTEXF_NONE); - pID3DDevice->SetTextureStageState(st, D3DTSS_MAGFILTER, D3DTEXF_POINT); - } - } - } -} - - -//! sets the needed renderstates -void CD3D8Driver::setRenderStatesStencilShadowMode(bool zfail, u32 debugDataVisible) -{ - if ((CurrentRenderMode != ERM_SHADOW_VOLUME_ZFAIL && - CurrentRenderMode != ERM_SHADOW_VOLUME_ZPASS) || - Transformation3DChanged) - { - // unset last 3d material - if (CurrentRenderMode == ERM_3D && - static_cast(Material.MaterialType) < MaterialRenderers.size()) - { - MaterialRenderers[Material.MaterialType].Renderer->OnUnsetMaterial(); - ResetRenderStates = true; - } - // switch back the matrices - pID3DDevice->SetTransform(D3DTS_VIEW, (D3DMATRIX*)((void*)&Matrices[ETS_VIEW])); - pID3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)((void*)&Matrices[ETS_WORLD])); - pID3DDevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)((void*)&Matrices[ETS_PROJECTION])); - - Transformation3DChanged = false; - - setActiveTexture(0,0); - setActiveTexture(1,0); - setActiveTexture(2,0); - setActiveTexture(3,0); - - pID3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_DISABLE); - - pID3DDevice->SetVertexShader(D3DFVF_XYZ); - LastVertexType = (video::E_VERTEX_TYPE)(-1); - - pID3DDevice->SetRenderState(D3DRS_ZWRITEENABLE, FALSE); - pID3DDevice->SetRenderState(D3DRS_STENCILENABLE, TRUE); - pID3DDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT); - //pID3DDevice->SetRenderState(D3DRS_FOGENABLE, FALSE); - //pID3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); - - pID3DDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS); - pID3DDevice->SetRenderState(D3DRS_STENCILREF, 0x0); - pID3DDevice->SetRenderState(D3DRS_STENCILMASK, 0xffffffff); - pID3DDevice->SetRenderState(D3DRS_STENCILWRITEMASK, 0xffffffff); - if (!(debugDataVisible & (scene::EDS_SKELETON|scene::EDS_MESH_WIRE_OVERLAY))) - pID3DDevice->SetRenderState(D3DRS_COLORWRITEENABLE, 0); - if ((debugDataVisible & scene::EDS_MESH_WIRE_OVERLAY)) - pID3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); - } - - if (CurrentRenderMode != ERM_SHADOW_VOLUME_ZPASS && !zfail) - { - // USE THE ZPASS METHOD - pID3DDevice->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP); - pID3DDevice->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP); - pID3DDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_INCR); - } - else - if (CurrentRenderMode != ERM_SHADOW_VOLUME_ZFAIL && zfail) - { - // USE THE ZFAIL METHOD - pID3DDevice->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP); - pID3DDevice->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_INCR); - pID3DDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP); - } - - CurrentRenderMode = zfail ? ERM_SHADOW_VOLUME_ZFAIL : ERM_SHADOW_VOLUME_ZPASS; -} - - -//! sets the needed renderstates -void CD3D8Driver::setRenderStatesStencilFillMode(bool alpha) -{ - if (CurrentRenderMode != ERM_STENCIL_FILL || Transformation3DChanged) - { - pID3DDevice->SetTransform(D3DTS_VIEW, &UnitMatrixD3D8); - pID3DDevice->SetTransform(D3DTS_WORLD, &UnitMatrixD3D8); - pID3DDevice->SetTransform(D3DTS_PROJECTION, &UnitMatrixD3D8); - - pID3DDevice->SetRenderState(D3DRS_ZENABLE, FALSE); - pID3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE); - pID3DDevice->SetRenderState(D3DRS_FOGENABLE, FALSE); - - pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); - pID3DDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); - pID3DDevice->SetTextureStageState(2, D3DTSS_COLOROP, D3DTOP_DISABLE); - pID3DDevice->SetTextureStageState(2, D3DTSS_ALPHAOP, D3DTOP_DISABLE); - pID3DDevice->SetTextureStageState(3, D3DTSS_COLOROP, D3DTOP_DISABLE); - pID3DDevice->SetTextureStageState(3, D3DTSS_ALPHAOP, D3DTOP_DISABLE); - - pID3DDevice->SetRenderState(D3DRS_STENCILREF, 0x1 ); - pID3DDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_LESSEQUAL); - //pID3DDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_GREATEREQUAL); - pID3DDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP ); - pID3DDevice->SetRenderState( D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP ); - pID3DDevice->SetRenderState( D3DRS_STENCILMASK, 0xffffffff ); - pID3DDevice->SetRenderState( D3DRS_STENCILWRITEMASK, 0xffffffff ); - - pID3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW); - - Transformation3DChanged = false; - - if (alpha) - { - pID3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE ); - pID3DDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); - pID3DDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); - pID3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); - pID3DDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE ); - BridgeCalls->setBlend(true); - BridgeCalls->setBlendFunc(D3DBLEND_SRCALPHA, D3DBLEND_INVSRCALPHA); - } - else - { - pID3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE ); - pID3DDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); - pID3DDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); - pID3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE); - BridgeCalls->setBlend(false); - } - } - - CurrentRenderMode = ERM_STENCIL_FILL; -} - - -//! sets the needed renderstates -void CD3D8Driver::setRenderStates2DMode(bool alpha, bool texture, bool alphaChannel) -{ - if (!pID3DDevice) - return; - - if (CurrentRenderMode != ERM_2D || Transformation3DChanged) - { - // unset last 3d material - if (CurrentRenderMode == ERM_3D) - { - if (static_cast(LastMaterial.MaterialType) < MaterialRenderers.size()) - MaterialRenderers[LastMaterial.MaterialType].Renderer->OnUnsetMaterial(); - } - if (!OverrideMaterial2DEnabled) - { - setBasicRenderStates(InitMaterial2D, LastMaterial, true); - LastMaterial=InitMaterial2D; - - // fix everything that is wrongly set by SMaterial default - pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); - pID3DDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); - pID3DDevice->SetTextureStageState(2, D3DTSS_COLOROP, D3DTOP_DISABLE); - pID3DDevice->SetTextureStageState(2, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); - pID3DDevice->SetTextureStageState(3, D3DTSS_COLOROP, D3DTOP_DISABLE); - pID3DDevice->SetTextureStageState(3, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); - - pID3DDevice->SetRenderState( D3DRS_STENCILENABLE, FALSE ); - - } - pID3DDevice->SetTransform(D3DTS_WORLD, &UnitMatrixD3D8); - core::matrix4 m; - m.setTranslation(core::vector3df(-0.5f,-0.5f,0)); - pID3DDevice->SetTransform(D3DTS_VIEW, (D3DMATRIX*)((void*)m.pointer())); - - const core::dimension2d& renderTargetSize = getCurrentRenderTargetSize(); - m.buildProjectionMatrixOrthoLH(f32(renderTargetSize.Width), f32(-(s32)(renderTargetSize.Height)), -1.0, 1.0); - m.setTranslation(core::vector3df(-1,1,0)); - pID3DDevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)((void*)m.pointer())); - - Transformation3DChanged = false; - } - if (OverrideMaterial2DEnabled) - { - OverrideMaterial2D.Lighting=false; - setBasicRenderStates(OverrideMaterial2D, LastMaterial, false); - LastMaterial = OverrideMaterial2D; - } - - // no alphaChannel without texture - alphaChannel &= texture; - - if (alpha || alphaChannel) - { - BridgeCalls->setBlend(true); - BridgeCalls->setBlendFunc(D3DBLEND_SRCALPHA, D3DBLEND_INVSRCALPHA); - } - else - BridgeCalls->setBlend(false); - pID3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); - pID3DDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); - pID3DDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); - if (texture) - { - setTransform(ETS_TEXTURE_0, core::IdentityMatrix); - // Due to the transformation change, the previous line would call a reset each frame - // but we can safely reset the variable as it was false before - Transformation3DChanged=false; - } - if (alphaChannel) - { - pID3DDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); - - if (alpha) - { - pID3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); - pID3DDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE); - } - else - { - pID3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); - } - - } - else - { - pID3DDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); - if (alpha) - { - pID3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2); - } - else - { - pID3DDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); - pID3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); - } - } - - CurrentRenderMode = ERM_2D; -} - - -//! deletes all dynamic lights there are -void CD3D8Driver::deleteAllDynamicLights() -{ - for (s32 i=0; iLightEnable(i, false); - - LastSetLight = -1; - - CNullDriver::deleteAllDynamicLights(); -} - - -//! adds a dynamic light -s32 CD3D8Driver::addDynamicLight(const SLight& dl) -{ - CNullDriver::addDynamicLight(dl); - - D3DLIGHT8 light; - - switch (dl.Type) - { - case ELT_POINT: - light.Type = D3DLIGHT_POINT; - break; - case ELT_SPOT: - light.Type = D3DLIGHT_SPOT; - break; - case ELT_DIRECTIONAL: - light.Type = D3DLIGHT_DIRECTIONAL; - break; - } - - light.Position = *(D3DVECTOR*)((void*)(&dl.Position)); - light.Direction = *(D3DVECTOR*)((void*)(&dl.Direction)); - - light.Range = core::min_(dl.Radius, MaxLightDistance); - light.Falloff = dl.Falloff; - - light.Diffuse = *(D3DCOLORVALUE*)((void*)(&dl.DiffuseColor)); - light.Specular = *(D3DCOLORVALUE*)((void*)(&dl.SpecularColor)); - light.Ambient = *(D3DCOLORVALUE*)((void*)(&dl.AmbientColor)); - - light.Attenuation0 = dl.Attenuation.X; - light.Attenuation1 = dl.Attenuation.Y; - light.Attenuation2 = dl.Attenuation.Z; - - light.Theta = dl.InnerCone * 2.0f * core::DEGTORAD; - light.Phi = dl.OuterCone * 2.0f * core::DEGTORAD; - - ++LastSetLight; - - if(D3D_OK == pID3DDevice->SetLight(LastSetLight, &light)) - { - // I don't care if this succeeds - (void)pID3DDevice->LightEnable(LastSetLight, true); - return LastSetLight; - } - - return -1; -} - - -void CD3D8Driver::turnLightOn(s32 lightIndex, bool turnOn) -{ - if(lightIndex < 0 || lightIndex > LastSetLight) - return; - - (void)pID3DDevice->LightEnable(lightIndex, turnOn); -} - - -//! returns the maximal amount of dynamic lights the device can handle -u32 CD3D8Driver::getMaximalDynamicLightAmount() const -{ - return Caps.MaxActiveLights; -} - - -//! Sets the dynamic ambient light color. The default color is -//! (0,0,0,0) which means it is dark. -//! \param color: New color of the ambient light. -void CD3D8Driver::setAmbientLight(const SColorf& color) -{ - if (!pID3DDevice) - return; - - AmbientLight = color; - D3DCOLOR col = color.toSColor().color; - pID3DDevice->SetRenderState(D3DRS_AMBIENT, col); -} - - -//! \return Returns the name of the video driver. Example: In case of the DIRECT3D8 -//! driver, it would return "Direct3D8.1". -const wchar_t* CD3D8Driver::getName() const -{ - return L"Direct3D 8.1"; -} - - -//! Draws a shadow volume into the stencil buffer. To draw a stencil shadow, do -//! this: First, draw all geometry. Then use this method, to draw the shadow -//! volume. Then, use IVideoDriver::drawStencilShadow() to visualize the shadow. -void CD3D8Driver::drawStencilShadowVolume(const core::array& triangles, bool zfail, u32 debugDataVisible) -{ - const u32 count = triangles.size(); - if (!Params.Stencilbuffer || !count) - return; - - setRenderStatesStencilShadowMode(zfail, debugDataVisible); - - if (!zfail) - { - // ZPASS Method - - // Draw front-side of shadow volume in stencil only - pID3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW ); - pID3DDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_INCRSAT); - pID3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, count / 3, triangles.const_pointer(), sizeof(core::vector3df)); - - // Now reverse cull order so front sides of shadow volume are written. - pID3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CW ); - pID3DDevice->SetRenderState( D3DRS_STENCILPASS, D3DSTENCILOP_DECRSAT); - pID3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, count / 3, triangles.const_pointer(), sizeof(core::vector3df)); - } - else - { - // ZFAIL Method - - // Draw front-side of shadow volume in stencil only - pID3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW ); - pID3DDevice->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_INCRSAT ); - pID3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, count / 3, triangles.const_pointer(), sizeof(core::vector3df)); - - // Now reverse cull order so front sides of shadow volume are written. - pID3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW ); - pID3DDevice->SetRenderState( D3DRS_STENCILZFAIL, D3DSTENCILOP_DECRSAT ); - pID3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, count / 3, triangles.const_pointer(), sizeof(core::vector3df)); - } -} - - -//! Fills the stencil shadow with color. After the shadow volume has been drawn -//! into the stencil buffer using IVideoDriver::drawStencilShadowVolume(), use this -//! to draw the color of the shadow. -void CD3D8Driver::drawStencilShadow(bool clearStencilBuffer, video::SColor leftUpEdge, - video::SColor rightUpEdge, video::SColor leftDownEdge, video::SColor rightDownEdge) -{ - if (!Params.Stencilbuffer) - return; - - S3DVertex vtx[4]; - vtx[0] = S3DVertex(1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, leftUpEdge, 0.0f, 0.0f); - vtx[1] = S3DVertex(1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, rightUpEdge, 0.0f, 1.0f); - vtx[2] = S3DVertex(-1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, leftDownEdge, 1.0f, 0.0f); - vtx[3] = S3DVertex(-1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, rightDownEdge, 1.0f, 1.0f); - - const s16 indices[6] = {0,1,2,1,3,2}; - - setRenderStatesStencilFillMode( - leftUpEdge.getAlpha() < 255 || - rightUpEdge.getAlpha() < 255 || - leftDownEdge.getAlpha() < 255 || - rightDownEdge.getAlpha() < 255); - - setActiveTexture(0,0); - - setVertexShader(EVT_STANDARD); - - pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, 4, 2, &indices[0], - D3DFMT_INDEX16, &vtx[0], sizeof(S3DVertex)); - - if (clearStencilBuffer) - pID3DDevice->Clear(0, NULL, D3DCLEAR_STENCIL,0, 1.0, 0); -} - - -//! Returns the maximum amount of primitives (mostly vertices) which -//! the device is able to render with one drawIndexedTriangleList -//! call. -u32 CD3D8Driver::getMaximalPrimitiveCount() const -{ - return Caps.MaxPrimitiveCount; -} - - -//! Sets the fog mode. -void CD3D8Driver::setFog(SColor color, E_FOG_TYPE fogType, f32 start, - f32 end, f32 density, bool pixelFog, bool rangeFog) -{ - CNullDriver::setFog(color, fogType, start, end, density, pixelFog, rangeFog); - - if (!pID3DDevice) - return; - - pID3DDevice->SetRenderState(D3DRS_FOGCOLOR, color.color); - - pID3DDevice->SetRenderState( -#if defined( _IRR_XBOX_PLATFORM_) - D3DRS_FOGTABLEMODE, -#else - pixelFog ? D3DRS_FOGTABLEMODE : D3DRS_FOGVERTEXMODE, -#endif - (fogType==EFT_FOG_LINEAR)? D3DFOG_LINEAR : (fogType==EFT_FOG_EXP)?D3DFOG_EXP:D3DFOG_EXP2); - - if (fogType==EFT_FOG_LINEAR) - { - pID3DDevice->SetRenderState(D3DRS_FOGSTART, *(DWORD*)(&start)); - pID3DDevice->SetRenderState(D3DRS_FOGEND, *(DWORD*)(&end)); - } - else - pID3DDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD*)(&density)); - - if(!pixelFog) - pID3DDevice->SetRenderState(D3DRS_RANGEFOGENABLE, rangeFog); -} - - -//! Draws a 3d line. -void CD3D8Driver::draw3DLine(const core::vector3df& start, - const core::vector3df& end, SColor color) -{ - setVertexShader(EVT_STANDARD); - setRenderStates3DMode(); - video::S3DVertex v[2]; - v[0].Color = color; - v[1].Color = color; - v[0].Pos = start; - v[1].Pos = end; - - pID3DDevice->DrawPrimitiveUP(D3DPT_LINELIST, 1, v, sizeof(S3DVertex)); -} - - -void CD3D8Driver::OnResize(const core::dimension2d& size) -{ - if (!pID3DDevice) - return; - - CNullDriver::OnResize(size); - reset(); -} - - -//! Returns type of video driver -E_DRIVER_TYPE CD3D8Driver::getDriverType() const -{ - return EDT_DIRECT3D8; -} - - -//! Returns the transformation set by setTransform -const core::matrix4& CD3D8Driver::getTransform(E_TRANSFORMATION_STATE state) const -{ - return Matrices[state]; -} - -//! Get a vertex shader constant index. -s32 CD3D8Driver::getVertexShaderConstantID(const c8* name) -{ - os::Printer::log("Cannot get constant index, no HLSL supported in D3D8"); - return -1; -} - -//! Get a pixel shader constant index. -s32 CD3D8Driver::getPixelShaderConstantID(const c8* name) -{ - os::Printer::log("Cannot get constant index, no HLSL supported in D3D8"); - return -1; -} - - -//! Sets a vertex shader constant. -void CD3D8Driver::setVertexShaderConstant(const f32* data, s32 startRegister, s32 constantAmount) -{ - if (data) - pID3DDevice->SetVertexShaderConstant(startRegister, data, constantAmount); -} - - -//! Sets a pixel shader constant. -void CD3D8Driver::setPixelShaderConstant(const f32* data, s32 startRegister, s32 constantAmount) -{ - if (data) - pID3DDevice->SetPixelShaderConstant(startRegister, data, constantAmount); -} - - -//! Sets a constant for the vertex shader based on an index. -bool CD3D8Driver::setVertexShaderConstant(s32 index, const f32* floats, int count) -{ - os::Printer::log("Cannot set constant, no HLSL supported in D3D8"); - return false; -} - - -//! Int interface for the above. -bool CD3D8Driver::setVertexShaderConstant(s32 index, const s32* ints, int count) -{ - os::Printer::log("Cannot set constant, no HLSL supported in D3D8"); - return false; -} - - -//! Sets a constant for the pixel shader based on an index. -bool CD3D8Driver::setPixelShaderConstant(s32 index, const f32* floats, int count) -{ - os::Printer::log("Cannot set constant, no HLSL supported in D3D8"); - return false; -} - - -//! Int interface for the above. -bool CD3D8Driver::setPixelShaderConstant(s32 index, const s32* ints, int count) -{ - os::Printer::log("Cannot set constant, no HLSL supported in D3D8"); - return false; -} - - -//! Adds a new material renderer to the VideoDriver, using pixel and/or -//! vertex shaders to render geometry. -s32 CD3D8Driver::addShaderMaterial(const c8* vertexShaderProgram, - const c8* pixelShaderProgram, - IShaderConstantSetCallBack* callback, - E_MATERIAL_TYPE baseMaterial, s32 userData) -{ - s32 nr = -1; - CD3D8ShaderMaterialRenderer* r = new CD3D8ShaderMaterialRenderer( - pID3DDevice, this, nr, vertexShaderProgram, pixelShaderProgram, - callback, getMaterialRenderer(baseMaterial), userData); - - r->drop(); - return nr; -} - - -//! Returns a pointer to the IVideoDriver interface. (Implementation for -//! IMaterialRendererServices) -IVideoDriver* CD3D8Driver::getVideoDriver() -{ - return this; -} - - -//! Clears the ZBuffer. -void CD3D8Driver::clearZBuffer() -{ - const HRESULT hr = pID3DDevice->Clear( 0, NULL, D3DCLEAR_ZBUFFER, 0, 1.0, 0); - - if (FAILED(hr)) - os::Printer::log("CD3D8Driver clearZBuffer() failed.", ELL_WARNING); -} - - -//! Returns an image created from the last rendered frame. -IImage* CD3D8Driver::createScreenShot(video::ECOLOR_FORMAT format, video::E_RENDER_TARGET target) -{ -#if defined( _IRR_XBOX_PLATFORM_) - return 0; -#else - if (target != video::ERT_FRAME_BUFFER) - return 0; - - // query the screen dimensions of the current adapter - D3DDISPLAYMODE displayMode; - pID3DDevice->GetDisplayMode(&displayMode); - - if (format==video::ECF_UNKNOWN) - format=video::ECF_A8R8G8B8; - - // create the image surface to store the front buffer image [always A8R8G8B8] - HRESULT hr; - LPDIRECT3DSURFACE8 lpSurface; - if (FAILED(hr = pID3DDevice->CreateImageSurface(displayMode.Width, displayMode.Height, D3DFMT_A8R8G8B8, &lpSurface))) - return 0; - - // read the front buffer into the image surface - if (FAILED(hr = pID3DDevice->GetFrontBuffer(lpSurface))) - { - lpSurface->Release(); - return 0; - } - - RECT clientRect; - { - POINT clientPoint; - clientPoint.x = 0; - clientPoint.y = 0; - - ClientToScreen( (HWND)getExposedVideoData().D3D8.HWnd, &clientPoint ); - - clientRect.left = clientPoint.x; - clientRect.top = clientPoint.y; - clientRect.right = clientRect.left + ScreenSize.Width; - clientRect.bottom = clientRect.top + ScreenSize.Height; - - // window can be off-screen partly, we can't take screenshots from that - clientRect.left = core::max_(clientRect.left, 0l); - clientRect.top = core::max_(clientRect.top, 0l); - clientRect.right = core::min_(clientRect.right, (long)displayMode.Width); - clientRect.bottom = core::min_(clientRect.bottom, (long)displayMode.Height ); - } - - // lock our area of the surface - D3DLOCKED_RECT lockedRect; - if (FAILED(lpSurface->LockRect(&lockedRect, &clientRect, D3DLOCK_READONLY))) - { - lpSurface->Release(); - return 0; - } - - irr::core::dimension2d shotSize; - shotSize.Width = core::min_( ScreenSize.Width, (u32)(clientRect.right-clientRect.left) ); - shotSize.Height = core::min_( ScreenSize.Height, (u32)(clientRect.bottom-clientRect.top) ); - - // this could throw, but we aren't going to worry about that case very much - IImage* newImage = createImage(format, shotSize); - - if (newImage) - { - // d3d pads the image, so we need to copy the correct number of bytes - u32* dP = (u32*)newImage->lock(); - u8 * sP = (u8 *)lockedRect.pBits; - - // If the display mode format doesn't promise anything about the Alpha value - // and it appears that it's not presenting 255, then we should manually - // set each pixel alpha value to 255. - if(D3DFMT_X8R8G8B8 == displayMode.Format && (0xFF000000 != (*dP & 0xFF000000))) - { - for (u32 y = 0; y < shotSize.Height; ++y) - { - for(u32 x = 0; x < shotSize.Width; ++x) - { - newImage->setPixel(x,y,*((u32*)sP) | 0xFF000000); - sP += 4; - } - - sP += lockedRect.Pitch - (4 * shotSize.Width); - } - } - else - { - for (u32 y = 0; y < shotSize.Height; ++y) - { - convertColor(sP, video::ECF_A8R8G8B8, shotSize.Width, dP, format); - sP += lockedRect.Pitch; - dP += shotSize.Width; - } - } - - newImage->unlock(); - } - - // we can unlock and release the surface - lpSurface->UnlockRect(); - - // release the image surface - lpSurface->Release(); - - // return status of save operation to caller - return newImage; -#endif -} - - -// returns the current size of the screen or rendertarget -const core::dimension2d& CD3D8Driver::getCurrentRenderTargetSize() const -{ - if ( CurrentRendertargetSize.Width == 0 ) - return ScreenSize; - else - return CurrentRendertargetSize; -} - - -// Set/unset a clipping plane. -bool CD3D8Driver::setClipPlane(u32 index, const core::plane3df& plane, bool enable) -{ -#if defined( _IRR_XBOX_PLATFORM_) - return false; -#else - if (index >= MaxUserClipPlanes) - return false; - pID3DDevice->SetClipPlane(index, (const float*)&plane); - enableClipPlane(index, enable); - return true; -#endif -} - - -// Enable/disable a clipping plane. -void CD3D8Driver::enableClipPlane(u32 index, bool enable) -{ -#if defined( _IRR_XBOX_PLATFORM_) - return; -#else - if (index >= MaxUserClipPlanes) - return; - DWORD renderstate; - pID3DDevice->GetRenderState(D3DRS_CLIPPLANEENABLE, &renderstate); - if (enable) - renderstate |= (1 << index); - else - renderstate &= ~(1 << index); - pID3DDevice->SetRenderState(D3DRS_CLIPPLANEENABLE, renderstate); -#endif -} - - -core::dimension2du CD3D8Driver::getMaxTextureSize() const -{ - return core::dimension2du(Caps.MaxTextureWidth, Caps.MaxTextureHeight); -} - - -u32 CD3D8Driver::getD3DBlend(E_BLEND_FACTOR factor) const -{ - u32 r = 0; - switch ( factor ) - { - case EBF_ZERO: r = D3DBLEND_ZERO; break; - case EBF_ONE: r = D3DBLEND_ONE; break; - case EBF_DST_COLOR: r = D3DBLEND_DESTCOLOR; break; - case EBF_ONE_MINUS_DST_COLOR: r = D3DBLEND_INVDESTCOLOR; break; - case EBF_SRC_COLOR: r = D3DBLEND_SRCCOLOR; break; - case EBF_ONE_MINUS_SRC_COLOR: r = D3DBLEND_INVSRCCOLOR; break; - case EBF_SRC_ALPHA: r = D3DBLEND_SRCALPHA; break; - case EBF_ONE_MINUS_SRC_ALPHA: r = D3DBLEND_INVSRCALPHA; break; - case EBF_DST_ALPHA: r = D3DBLEND_DESTALPHA; break; - case EBF_ONE_MINUS_DST_ALPHA: r = D3DBLEND_INVDESTALPHA; break; - case EBF_SRC_ALPHA_SATURATE: r = D3DBLEND_SRCALPHASAT; break; - } - return r; -} - - -u32 CD3D8Driver::getD3DModulate(E_MODULATE_FUNC func) const -{ - u32 r = D3DTOP_MODULATE; - switch ( func ) - { - case EMFN_MODULATE_1X: r = D3DTOP_MODULATE; break; - case EMFN_MODULATE_2X: r = D3DTOP_MODULATE2X; break; - case EMFN_MODULATE_4X: r = D3DTOP_MODULATE4X; break; - } - return r; -} - - -CD3D8CallBridge* CD3D8Driver::getBridgeCalls() const -{ - return BridgeCalls; -} - - -CD3D8CallBridge::CD3D8CallBridge(IDirect3DDevice8* p) : pID3DDevice(p), - BlendOperation(D3DBLENDOP_ADD), BlendSource(D3DBLEND_ONE), BlendDestination(D3DBLEND_ZERO), Blend(false) -{ - pID3DDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD); - pID3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); - pID3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO); - pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); -} - -void CD3D8CallBridge::setBlendOperation(DWORD mode) -{ - if (BlendOperation != mode) - { - pID3DDevice->SetRenderState(D3DRS_BLENDOP, mode); - - BlendOperation = mode; - } -} - -void CD3D8CallBridge::setBlendFunc(DWORD source, DWORD destination) -{ - if (BlendSource != source) - { - pID3DDevice->SetRenderState(D3DRS_SRCBLEND, source); - - BlendSource = source; - } - - if (BlendDestination != destination) - { - pID3DDevice->SetRenderState(D3DRS_DESTBLEND, destination); - - BlendDestination = destination; - } -} - -void CD3D8CallBridge::setBlend(bool enable) -{ - if (Blend != enable) - { - if (enable) - pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); - else - pID3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); - - Blend = enable; - } -} - - -} // end namespace video -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_DIRECT3D_8_ - - -namespace irr -{ -namespace video -{ - -#ifdef _IRR_COMPILE_WITH_DIRECT3D_8_ -//! creates a video driver -IVideoDriver* createDirectX8Driver(const SIrrlichtCreationParameters& params, - io::IFileSystem* io, HWND window) -{ - const bool pureSoftware = false; - CD3D8Driver* dx8 = new CD3D8Driver(params, io); - - if (!dx8->initDriver(window, pureSoftware)) - { - dx8->drop(); - dx8 = 0; - } - - return dx8; -} -#endif // _IRR_COMPILE_WITH_DIRECT3D_8_ - -} // end namespace video -} // end namespace irr diff --git a/source/Irrlicht/CD3D8Driver.h b/source/Irrlicht/CD3D8Driver.h deleted file mode 100644 index 9e51ede1..00000000 --- a/source/Irrlicht/CD3D8Driver.h +++ /dev/null @@ -1,381 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __C_VIDEO_DIRECTX_8_H_INCLUDED__ -#define __C_VIDEO_DIRECTX_8_H_INCLUDED__ - -#include "IrrCompileConfig.h" - -#ifdef _IRR_COMPILE_WITH_DIRECT3D_8_ - -#ifdef _IRR_WINDOWS_ - #define WIN32_LEAN_AND_MEAN - #include -#endif - -#include "SIrrCreationParameters.h" -// always included for static createDriver function -#include "CNullDriver.h" -#include "IMaterialRendererServices.h" - -#include - -namespace irr -{ -namespace video -{ - class CD3D8CallBridge; - - class CD3D8Driver : public CNullDriver, IMaterialRendererServices - { - friend class CD3D8CallBridge; - friend class CD3D8Texture; - - public: - - //! constructor - CD3D8Driver(const SIrrlichtCreationParameters& params, io::IFileSystem* io); - - //! destructor - virtual ~CD3D8Driver(); - - //! applications must call this method before performing any rendering. returns false if failed. - virtual bool beginScene(bool backBuffer=true, bool zBuffer=true, - SColor color=SColor(255,0,0,0), - const SExposedVideoData& videoData=SExposedVideoData(), - core::rect* sourceRect=0) _IRR_OVERRIDE_; - - //! applications must call this method after performing any rendering. returns false if failed. - virtual bool endScene() _IRR_OVERRIDE_; - - //! queries the features of the driver, returns true if feature is available - virtual bool queryFeature(E_VIDEO_DRIVER_FEATURE feature) const _IRR_OVERRIDE_; - - //! sets transformation - virtual void setTransform(E_TRANSFORMATION_STATE state, const core::matrix4& mat) _IRR_OVERRIDE_; - - //! sets a material - virtual void setMaterial(const SMaterial& material) _IRR_OVERRIDE_; - - //! sets a render target - virtual bool setRenderTarget(video::ITexture* texture, - bool clearBackBuffer=true, bool clearZBuffer=true, - SColor color=video::SColor(0,0,0,0), video::ITexture* depthStencil=0) _IRR_OVERRIDE_; - - //! sets a viewport - virtual void setViewPort(const core::rect& area) _IRR_OVERRIDE_; - - //! gets the area of the current viewport - virtual const core::rect& getViewPort() const _IRR_OVERRIDE_; - - //! draws a vertex primitive list - virtual void drawVertexPrimitiveList(const void* vertices, u32 vertexCount, - const void* indexList, u32 primitiveCount, - E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, - E_INDEX_TYPE iType) _IRR_OVERRIDE_; - - //! draws a vertex primitive list in 2d - virtual void draw2DVertexPrimitiveList(const void* vertices, u32 vertexCount, - const void* indexList, u32 primitiveCount, - E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, - E_INDEX_TYPE iType) _IRR_OVERRIDE_; - - //! draws an 2d image, using a color (if color is other then Color(255,255,255,255)) and the alpha channel of the texture if wanted. - virtual void draw2DImage(const video::ITexture* texture, const core::position2d& destPos, - const core::rect& sourceRect, const core::rect* clipRect = 0, - SColor color=SColor(255,255,255,255), bool useAlphaChannelOfTexture=false) _IRR_OVERRIDE_; - - //! Draws a part of the texture into the rectangle. - virtual void draw2DImage(const video::ITexture* texture, const core::rect& destRect, - const core::rect& sourceRect, const core::rect* clipRect = 0, - const video::SColor* const colors=0, bool useAlphaChannelOfTexture=false) _IRR_OVERRIDE_; - - //!Draws an 2d rectangle with a gradient. - virtual void draw2DRectangle(const core::rect& pos, - SColor colorLeftUp, SColor colorRightUp, SColor colorLeftDown, SColor colorRightDown, - const core::rect* clip = 0) _IRR_OVERRIDE_; - - //! Draws a 2d line. - virtual void draw2DLine(const core::position2d& start, - const core::position2d& end, - SColor color=SColor(255,255,255,255)) _IRR_OVERRIDE_; - - //! Draws a pixel. - virtual void drawPixel(u32 x, u32 y, const SColor & color) _IRR_OVERRIDE_; - - //! Draws a 3d line. - virtual void draw3DLine(const core::vector3df& start, - const core::vector3df& end, SColor color = SColor(255,255,255,255)) _IRR_OVERRIDE_; - - //! initialises the Direct3D API - bool initDriver(HWND hwnd, bool pureSoftware); - - //! \return Returns the name of the video driver. Example: In case of the DIRECT3D8 - //! driver, it would return "Direct3D8.1". - virtual const wchar_t* getName() const _IRR_OVERRIDE_; - - //! deletes all dynamic lights there are - virtual void deleteAllDynamicLights() _IRR_OVERRIDE_; - - //! adds a dynamic light, returning an index to the light - //! \param light: the light data to use to create the light - //! \return An index to the light, or -1 if an error occurs - virtual s32 addDynamicLight(const SLight& light) _IRR_OVERRIDE_; - - //! Turns a dynamic light on or off - //! \param lightIndex: the index returned by addDynamicLight - //! \param turnOn: true to turn the light on, false to turn it off - virtual void turnLightOn(s32 lightIndex, bool turnOn) _IRR_OVERRIDE_; - - //! returns the maximal amount of dynamic lights the device can handle - virtual u32 getMaximalDynamicLightAmount() const _IRR_OVERRIDE_; - - //! Sets the dynamic ambient light color. The default color is - //! (0,0,0,0) which means it is dark. - //! \param color: New color of the ambient light. - virtual void setAmbientLight(const SColorf& color) _IRR_OVERRIDE_; - - //! Draws a shadow volume into the stencil buffer. To draw a stencil shadow, do - //! this: Frist, draw all geometry. Then use this method, to draw the shadow - //! volume. Then, use IVideoDriver::drawStencilShadow() to visualize the shadow. - virtual void drawStencilShadowVolume(const core::array& triangles, bool zfail=true, u32 debugDataVisible=0) _IRR_OVERRIDE_; - - //! Fills the stencil shadow with color. After the shadow volume has been drawn - //! into the stencil buffer using IVideoDriver::drawStencilShadowVolume(), use this - //! to draw the color of the shadow. - virtual void drawStencilShadow(bool clearStencilBuffer=false, - video::SColor leftUpEdge = video::SColor(0,0,0,0), - video::SColor rightUpEdge = video::SColor(0,0,0,0), - video::SColor leftDownEdge = video::SColor(0,0,0,0), - video::SColor rightDownEdge = video::SColor(0,0,0,0)) _IRR_OVERRIDE_; - - //! Returns the maximum amount of primitives (mostly vertices) which - //! the device is able to render with one drawIndexedTriangleList - //! call. - virtual u32 getMaximalPrimitiveCount() const _IRR_OVERRIDE_; - - //! Enables or disables a texture creation flag. - virtual void setTextureCreationFlag(E_TEXTURE_CREATION_FLAG flag, bool enabled) _IRR_OVERRIDE_; - - //! Sets the fog mode. - virtual void setFog(SColor color, E_FOG_TYPE fogType, f32 start, - f32 end, f32 density, bool pixelFog, bool rangeFog) _IRR_OVERRIDE_; - - //! Only used by the internal engine. Used to notify the driver that - //! the window was resized. - virtual void OnResize(const core::dimension2d& size) _IRR_OVERRIDE_; - - //! Returns type of video driver - virtual E_DRIVER_TYPE getDriverType() const _IRR_OVERRIDE_; - - //! Returns the transformation set by setTransform - virtual const core::matrix4& getTransform(E_TRANSFORMATION_STATE state) const _IRR_OVERRIDE_; - - //! Can be called by an IMaterialRenderer to make its work easier. - virtual void setBasicRenderStates(const SMaterial& material, const SMaterial& lastMaterial, - bool resetAllRenderstates) _IRR_OVERRIDE_; - - //! Get a vertex shader constant index. - virtual s32 getVertexShaderConstantID(const c8* name) _IRR_OVERRIDE_; - - //! Get a pixel shader constant index. - virtual s32 getPixelShaderConstantID(const c8* name) _IRR_OVERRIDE_; - - //! Sets a vertex shader constant. - virtual void setVertexShaderConstant(const f32* data, s32 startRegister, s32 constantAmount=1) _IRR_OVERRIDE_; - - //! Sets a pixel shader constant. - virtual void setPixelShaderConstant(const f32* data, s32 startRegister, s32 constantAmount=1) _IRR_OVERRIDE_; - - //! Sets a constant for the vertex shader based on an index. - virtual bool setVertexShaderConstant(s32 index, const f32* floats, int count) _IRR_OVERRIDE_; - - //! Int interface for the above. - virtual bool setVertexShaderConstant(s32 index, const s32* ints, int count) _IRR_OVERRIDE_; - - //! Sets a constant for the pixel shader based on an index. - virtual bool setPixelShaderConstant(s32 index, const f32* floats, int count) _IRR_OVERRIDE_; - - //! Int interface for the above. - virtual bool setPixelShaderConstant(s32 index, const s32* ints, int count) _IRR_OVERRIDE_; - - //! Returns a pointer to the IVideoDriver interface. (Implementation for - //! IMaterialRendererServices) - virtual IVideoDriver* getVideoDriver() _IRR_OVERRIDE_; - - //! Creates a render target texture. - virtual ITexture* addRenderTargetTexture(const core::dimension2d& size, - const io::path& name, const ECOLOR_FORMAT format = ECF_UNKNOWN) _IRR_OVERRIDE_; - - //! Clears the ZBuffer. - virtual void clearZBuffer() _IRR_OVERRIDE_; - - //! Returns an image created from the last rendered frame. - virtual IImage* createScreenShot(video::ECOLOR_FORMAT format=video::ECF_UNKNOWN, video::E_RENDER_TARGET target=video::ERT_FRAME_BUFFER) _IRR_OVERRIDE_; - - //! Set/unset a clipping plane. - //! There are at least 6 clipping planes available for the user to set at will. - //! \param index: The plane index. Must be between 0 and MaxUserClipPlanes. - //! \param plane: The plane itself. - //! \param enable: If true, enable the clipping plane else disable it. - virtual bool setClipPlane(u32 index, const core::plane3df& plane, bool enable=false) _IRR_OVERRIDE_; - - //! Enable/disable a clipping plane. - //! There are at least 6 clipping planes available for the user to set at will. - //! \param index: The plane index. Must be between 0 and MaxUserClipPlanes. - //! \param enable: If true, enable the clipping plane else disable it. - virtual void enableClipPlane(u32 index, bool enable) _IRR_OVERRIDE_; - - //! Returns the maximum texture size supported. - virtual core::dimension2du getMaxTextureSize() const _IRR_OVERRIDE_; - - virtual bool checkDriverReset() _IRR_OVERRIDE_ {return DriverWasReset;} - - //! Get D3D blending factor. - u32 getD3DBlend(E_BLEND_FACTOR factor) const; - - //! Get D3D modulate. - u32 getD3DModulate(E_MODULATE_FUNC func) const; - - //! Get bridge calls. - CD3D8CallBridge* getBridgeCalls() const; - - private: - - // enumeration for rendering modes such as 2d and 3d for minizing the switching of renderStates. - enum E_RENDER_MODE - { - ERM_NONE = 0, // no render state has been set yet. - ERM_2D, // 2d drawing rendermode - ERM_3D, // 3d rendering mode - ERM_STENCIL_FILL, // stencil fill mode - ERM_SHADOW_VOLUME_ZFAIL, // stencil volume draw mode - ERM_SHADOW_VOLUME_ZPASS // stencil volume draw mode - }; - - //! sets right vertex shader - void setVertexShader(video::E_VERTEX_TYPE newType); - - //! sets the needed renderstates - bool setRenderStates3DMode(); - - //! sets the needed renderstates - void setRenderStates2DMode(bool alpha, bool texture, bool alphaChannel); - - //! sets the needed renderstates - void setRenderStatesStencilFillMode(bool alpha); - - //! sets the needed renderstates - void setRenderStatesStencilShadowMode(bool zfail, u32 debugDataVisible); - - //! sets the current Texture - bool setActiveTexture(u32 stage, const video::ITexture* texture); - - //! resets the device - bool reset(); - - //! returns a device dependent texture from a software surface (IImage) - //! THIS METHOD HAS TO BE OVERRIDDEN BY DERIVED DRIVERS WITH OWN TEXTURES - virtual video::ITexture* createDeviceDependentTexture(IImage* surface, const io::path& name, void* mipmapData=0) _IRR_OVERRIDE_; - - // returns the current size of the screen or rendertarget - virtual const core::dimension2d& getCurrentRenderTargetSize() const _IRR_OVERRIDE_; - - //! Adds a new material renderer to the VideoDriver, using pixel and/or - //! vertex shaders to render geometry. - s32 addShaderMaterial(const c8* vertexShaderProgram, const c8* pixelShaderProgram, - IShaderConstantSetCallBack* callback, - E_MATERIAL_TYPE baseMaterial, s32 userData); - - void createMaterialRenderers(); - - void draw2D3DVertexPrimitiveList(const void* vertices, - u32 vertexCount, const void* indexList, u32 primitiveCount, - E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, - E_INDEX_TYPE iType, bool is3D); - - D3DTEXTUREADDRESS getTextureWrapMode(const u8 clamp); - - inline D3DCOLORVALUE colorToD3D(const SColor& col) - { - const f32 f = 1.0f / 255.0f; - D3DCOLORVALUE v; - v.r = col.getRed() * f; - v.g = col.getGreen() * f; - v.b = col.getBlue() * f; - v.a = col.getAlpha() * f; - return v; - } - - CD3D8CallBridge* BridgeCalls; - - E_RENDER_MODE CurrentRenderMode; - D3DPRESENT_PARAMETERS present; - - SMaterial Material, LastMaterial; - bool ResetRenderStates; // bool to make all renderstates be reseted if set. - bool Transformation3DChanged; - const ITexture* CurrentTexture[MATERIAL_MAX_TEXTURES]; - core::matrix4 Matrices[ETS_COUNT]; // matrices of the 3d mode we need to restore when we switch back from the 2d mode. - - HINSTANCE D3DLibrary; - IDirect3D8* pID3D; - IDirect3DDevice8* pID3DDevice; - - IDirect3DSurface8* PrevRenderTarget; - core::dimension2d CurrentRendertargetSize; - - HWND WindowId; - core::rect* SceneSourceRect; - - D3DCAPS8 Caps; - - E_VERTEX_TYPE LastVertexType; - - D3DMATRIX UnitMatrix; - - u32 MaxTextureUnits; - u32 MaxUserClipPlanes; - f32 MaxLightDistance; - s32 LastSetLight; - bool DeviceLost; - bool DriverWasReset; - - SColorf AmbientLight; - - SIrrlichtCreationParameters Params; - }; - - //! This bridge between Irlicht pseudo D3D8 calls - //! and true D3D8 calls. - - class CD3D8CallBridge - { - public: - CD3D8CallBridge(IDirect3DDevice8* p); - - // Blending calls. - - void setBlendOperation(DWORD mode); - - void setBlendFunc(DWORD source, DWORD destination); - - void setBlend(bool enable); - - private: - IDirect3DDevice8* pID3DDevice; - - DWORD BlendOperation; - DWORD BlendSource; - DWORD BlendDestination; - bool Blend; - }; - -} // end namespace video -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_DIRECT3D_8_ - -#endif // __C_VIDEO_DIRECTX_8_H_INCLUDED__ - diff --git a/source/Irrlicht/CD3D8MaterialRenderer.h b/source/Irrlicht/CD3D8MaterialRenderer.h deleted file mode 100644 index ac6ec0d0..00000000 --- a/source/Irrlicht/CD3D8MaterialRenderer.h +++ /dev/null @@ -1,545 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __C_D3D8_MATERIAL_RENDERER_H_INCLUDED__ -#define __C_D3D8_MATERIAL_RENDERER_H_INCLUDED__ - -#include "IrrCompileConfig.h" -#ifdef _IRR_WINDOWS_API_ - -#ifdef _IRR_COMPILE_WITH_DIRECT3D_8_ -#include - -#include "IMaterialRenderer.h" -#include "CD3D8Driver.h" - -namespace irr -{ -namespace video -{ - -namespace -{ -D3DMATRIX UnitMatrixD3D8; -D3DMATRIX SphereMapMatrixD3D8; -inline void setTextureColorStage(IDirect3DDevice8* dev, DWORD i, - DWORD arg1, DWORD op, DWORD arg2) -{ - dev->SetTextureStageState(i, D3DTSS_COLOROP, op); - dev->SetTextureStageState(i, D3DTSS_COLORARG1, arg1); - dev->SetTextureStageState(i, D3DTSS_COLORARG2, arg2); -} -inline void setTextureColorStage(IDirect3DDevice8* dev, DWORD i, DWORD arg1) -{ - dev->SetTextureStageState(i, D3DTSS_COLOROP, D3DTOP_SELECTARG1); - dev->SetTextureStageState(i, D3DTSS_COLORARG1, arg1); -} - -inline void setTextureAlphaStage(IDirect3DDevice8* dev, DWORD i, - DWORD arg1, DWORD op, DWORD arg2) -{ - dev->SetTextureStageState(i, D3DTSS_ALPHAOP, op); - dev->SetTextureStageState(i, D3DTSS_ALPHAARG1, arg1); - dev->SetTextureStageState(i, D3DTSS_ALPHAARG2, arg2); -} -inline void setTextureAlphaStage(IDirect3DDevice8* dev, DWORD i, DWORD arg1) -{ - dev->SetTextureStageState(i, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); - dev->SetTextureStageState(i, D3DTSS_ALPHAARG1, arg1); -} -} // anonymous namespace - -//! Base class for all internal D3D8 material renderers -class CD3D8MaterialRenderer : public IMaterialRenderer -{ -public: - - //! Constructor - CD3D8MaterialRenderer(IDirect3DDevice8* d3ddev, CD3D8Driver* driver) - : pID3DDevice(d3ddev), Driver(driver) - { - } - -protected: - - IDirect3DDevice8* pID3DDevice; - CD3D8Driver* Driver; -}; - - -//! Solid material renderer -class CD3D8MaterialRenderer_SOLID : public CD3D8MaterialRenderer -{ -public: - - CD3D8MaterialRenderer_SOLID(IDirect3DDevice8* p, CD3D8Driver* d) - : CD3D8MaterialRenderer(p, d) {} - - virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, - bool resetAllRenderstates, IMaterialRendererServices* services) _IRR_OVERRIDE_ - { - services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); - - if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) - { - setTextureColorStage(pID3DDevice, 0, - D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); - } - - pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); - } -}; - -//! Generic Texture Blend -class CD3D8MaterialRenderer_ONETEXTURE_BLEND : public CD3D8MaterialRenderer -{ -public: - - CD3D8MaterialRenderer_ONETEXTURE_BLEND(IDirect3DDevice8* p, CD3D8Driver* d) - : CD3D8MaterialRenderer(p, d) {} - - virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, - bool resetAllRenderstates, IMaterialRendererServices* services) _IRR_OVERRIDE_ - { - services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); - -// if (material.MaterialType != lastMaterial.MaterialType || -// material.MaterialTypeParam != lastMaterial.MaterialTypeParam || -// resetAllRenderstates) - { - - E_BLEND_FACTOR srcFact,dstFact; - E_MODULATE_FUNC modulate; - u32 alphaSource; - unpack_textureBlendFunc ( srcFact, dstFact, modulate, alphaSource, material.MaterialTypeParam ); - - Driver->getBridgeCalls()->setBlend(true); - Driver->getBridgeCalls()->setBlendFunc(Driver->getD3DBlend(srcFact), Driver->getD3DBlend(dstFact)); - - setTextureColorStage(pID3DDevice, 0, - D3DTA_TEXTURE, Driver->getD3DModulate(modulate), D3DTA_DIFFUSE); - - if ( alphaSource && (textureBlendFunc_hasAlpha ( srcFact ) || textureBlendFunc_hasAlpha ( dstFact ) )) - { - if (alphaSource==EAS_VERTEX_COLOR) - { - setTextureAlphaStage(pID3DDevice, 0, D3DTA_DIFFUSE); - } - else if (alphaSource==EAS_TEXTURE) - { - setTextureAlphaStage(pID3DDevice, 0, D3DTA_TEXTURE); - } - else - { - setTextureAlphaStage(pID3DDevice, 0, - D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); - } - } - - pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); - - } - } - - virtual void OnUnsetMaterial() _IRR_OVERRIDE_ - { - Driver->getBridgeCalls()->setBlend(false); - } - - //! Returns if the material is transparent. - /** The scene management needs to know this for being able to sort the - materials by opaque and transparent. - The return value could be optimized, but we'd need to know the - MaterialTypeParam for it. */ - virtual bool isTransparent() const _IRR_OVERRIDE_ - { - return true; - } -}; - - -//! Solid 2 layer material renderer -class CD3D8MaterialRenderer_SOLID_2_LAYER : public CD3D8MaterialRenderer -{ -public: - - CD3D8MaterialRenderer_SOLID_2_LAYER(IDirect3DDevice8* p, CD3D8Driver* d) - : CD3D8MaterialRenderer(p, d) {} - - virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, - bool resetAllRenderstates, IMaterialRendererServices* services) _IRR_OVERRIDE_ - { - services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); - - if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) - { - setTextureColorStage(pID3DDevice, 0, D3DTA_TEXTURE); - - pID3DDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 0); - pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_BLENDDIFFUSEALPHA); - } - } -}; - - -//! Transparent add color material renderer -class CD3D8MaterialRenderer_TRANSPARENT_ADD_COLOR : public CD3D8MaterialRenderer -{ -public: - - CD3D8MaterialRenderer_TRANSPARENT_ADD_COLOR(IDirect3DDevice8* p, CD3D8Driver* d) - : CD3D8MaterialRenderer(p, d) {} - - virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, - bool resetAllRenderstates, IMaterialRendererServices* services) _IRR_OVERRIDE_ - { - services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); - - Driver->getBridgeCalls()->setBlend(true); - Driver->getBridgeCalls()->setBlendFunc(D3DBLEND_ONE, D3DBLEND_INVSRCCOLOR); - - if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) - { - setTextureColorStage(pID3DDevice, 0, - D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); - - pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); - } - } - - virtual void OnUnsetMaterial() _IRR_OVERRIDE_ - { - Driver->getBridgeCalls()->setBlend(false); - } - - //! Returns if the material is transparent. The scene management needs to know this - //! for being able to sort the materials by opaque and transparent. - virtual bool isTransparent() const _IRR_OVERRIDE_ - { - return true; - } -}; - - -//! Transparent vertex alpha material renderer -class CD3D8MaterialRenderer_TRANSPARENT_VERTEX_ALPHA : public CD3D8MaterialRenderer -{ -public: - - CD3D8MaterialRenderer_TRANSPARENT_VERTEX_ALPHA(IDirect3DDevice8* p, CD3D8Driver* d) - : CD3D8MaterialRenderer(p, d) {} - - virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, - bool resetAllRenderstates, IMaterialRendererServices* services) _IRR_OVERRIDE_ - { - services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); - - Driver->getBridgeCalls()->setBlend(true); - Driver->getBridgeCalls()->setBlendFunc(D3DBLEND_SRCALPHA, D3DBLEND_INVSRCALPHA); - - if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) - { - setTextureColorStage(pID3DDevice, 0, - D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); - setTextureAlphaStage(pID3DDevice, 0, D3DTA_DIFFUSE); - - pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); - } - } - - virtual void OnUnsetMaterial() _IRR_OVERRIDE_ - { - Driver->getBridgeCalls()->setBlend(false); - } - - //! Returns if the material is transparent. The scene managment needs to know this - //! for being able to sort the materials by opaque and transparent. - virtual bool isTransparent() const _IRR_OVERRIDE_ - { - return true; - } -}; - - -//! Transparent alpha channel material renderer -class CD3D8MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL : public CD3D8MaterialRenderer -{ -public: - - CD3D8MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL(IDirect3DDevice8* p, CD3D8Driver* d) - : CD3D8MaterialRenderer(p, d) {} - - virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, - bool resetAllRenderstates, IMaterialRendererServices* services) _IRR_OVERRIDE_ - { - services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); - - Driver->getBridgeCalls()->setBlend(true); - Driver->getBridgeCalls()->setBlendFunc(D3DBLEND_SRCALPHA, D3DBLEND_INVSRCALPHA); - - if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates - || material.MaterialTypeParam != lastMaterial.MaterialTypeParam ) - { - setTextureColorStage(pID3DDevice, 0, - D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_CURRENT); - setTextureAlphaStage(pID3DDevice, 0, D3DTA_TEXTURE); - - pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); - - pID3DDevice->SetRenderState(D3DRS_ALPHAREF, core::floor32(material.MaterialTypeParam * 255.f)); - pID3DDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL); - pID3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); - } - } - - virtual void OnUnsetMaterial() _IRR_OVERRIDE_ - { - pID3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); - Driver->getBridgeCalls()->setBlend(false); - } - - //! Returns if the material is transparent. The scene managment needs to know this - //! for being able to sort the materials by opaque and transparent. - virtual bool isTransparent() const _IRR_OVERRIDE_ - { - return true; - } -}; - - -//! Transparent alpha channel material renderer -class CD3D8MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL_REF : public CD3D8MaterialRenderer -{ -public: - - CD3D8MaterialRenderer_TRANSPARENT_ALPHA_CHANNEL_REF(IDirect3DDevice8* p, CD3D8Driver* d) - : CD3D8MaterialRenderer(p, d) {} - - virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, - bool resetAllRenderstates, IMaterialRendererServices* services) _IRR_OVERRIDE_ - { - services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); - - if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) - { - setTextureColorStage(pID3DDevice, 0, - D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_CURRENT); - setTextureAlphaStage(pID3DDevice, 0, D3DTA_TEXTURE); - - pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); - - // 127 is required by EMT_TRANSPARENT_ALPHA_CHANNEL_REF - pID3DDevice->SetRenderState(D3DRS_ALPHAREF, 127); - pID3DDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL); - pID3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); - } - } - - virtual void OnUnsetMaterial() _IRR_OVERRIDE_ - { - pID3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); - } - - //! Returns if the material is transparent. The scene managment needs to know this - //! for being able to sort the materials by opaque and transparent. - virtual bool isTransparent() const _IRR_OVERRIDE_ - { - return false; // this material is not really transparent because it does no blending. - } -}; - - -//! material renderer for all kinds of lightmaps -class CD3D8MaterialRenderer_LIGHTMAP : public CD3D8MaterialRenderer -{ -public: - - CD3D8MaterialRenderer_LIGHTMAP(IDirect3DDevice8* p, CD3D8Driver* d) - : CD3D8MaterialRenderer(p, d) {} - - virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, - bool resetAllRenderstates, IMaterialRendererServices* services) _IRR_OVERRIDE_ - { - services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); - - if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) - { - if (material.MaterialType >= EMT_LIGHTMAP_LIGHTING) - { - // with lighting - setTextureColorStage(pID3DDevice, 0, - D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); - } - else - { - setTextureColorStage(pID3DDevice, 0, D3DTA_TEXTURE); - } - - pID3DDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1); - - setTextureColorStage(pID3DDevice, 1, - D3DTA_TEXTURE, - (material.MaterialType == EMT_LIGHTMAP_ADD)? - D3DTOP_ADD: - (material.MaterialType == EMT_LIGHTMAP_M4 || material.MaterialType == EMT_LIGHTMAP_LIGHTING_M4)? - D3DTOP_MODULATE4X: - (material.MaterialType == EMT_LIGHTMAP_M2 || material.MaterialType == EMT_LIGHTMAP_LIGHTING_M2)? - D3DTOP_MODULATE2X: - D3DTOP_MODULATE, - D3DTA_CURRENT); - } - } -}; - - -//! material renderer for detail maps -class CD3D8MaterialRenderer_DETAIL_MAP : public CD3D8MaterialRenderer -{ -public: - - CD3D8MaterialRenderer_DETAIL_MAP(IDirect3DDevice8* p, CD3D8Driver* d) - : CD3D8MaterialRenderer(p, d) {} - - virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, - bool resetAllRenderstates, IMaterialRendererServices* services) _IRR_OVERRIDE_ - { - services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); - - if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) - { - setTextureColorStage(pID3DDevice, 0, - D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); - setTextureColorStage(pID3DDevice, 1, - D3DTA_TEXTURE, D3DTOP_ADDSIGNED, D3DTA_CURRENT); - pID3DDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1); - } - } -}; - - -//! sphere map material renderer -class CD3D8MaterialRenderer_SPHERE_MAP : public CD3D8MaterialRenderer -{ -public: - - CD3D8MaterialRenderer_SPHERE_MAP(IDirect3DDevice8* p, CD3D8Driver* d) - : CD3D8MaterialRenderer(p, d) {} - - virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, - bool resetAllRenderstates, IMaterialRendererServices* services) _IRR_OVERRIDE_ - { - services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); - - if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) - { - setTextureColorStage(pID3DDevice, 0, - D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); - - pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); - - pID3DDevice->SetTransform( D3DTS_TEXTURE0, &SphereMapMatrixD3D8 ); - pID3DDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 ); - pID3DDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACENORMAL ); - } - } - - virtual void OnUnsetMaterial() _IRR_OVERRIDE_ - { - pID3DDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE ); - pID3DDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0); - pID3DDevice->SetTransform( D3DTS_TEXTURE0, &UnitMatrixD3D8 ); - } -}; - - -//! reflection 2 layer material renderer -class CD3D8MaterialRenderer_REFLECTION_2_LAYER : public CD3D8MaterialRenderer -{ -public: - - CD3D8MaterialRenderer_REFLECTION_2_LAYER(IDirect3DDevice8* p, CD3D8Driver* d) - : CD3D8MaterialRenderer(p, d) {} - - virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, - bool resetAllRenderstates, IMaterialRendererServices* services) _IRR_OVERRIDE_ - { - services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); - - if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) - { - setTextureColorStage(pID3DDevice, 0, - D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); - - setTextureColorStage(pID3DDevice, 1, - D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_CURRENT); - - pID3DDevice->SetTransform( D3DTS_TEXTURE1, &SphereMapMatrixD3D8 ); - pID3DDevice->SetTextureStageState( 1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 ); - pID3DDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR); - } - } - - virtual void OnUnsetMaterial() _IRR_OVERRIDE_ - { - pID3DDevice->SetTextureStageState( 1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE ); - pID3DDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1); - pID3DDevice->SetTransform( D3DTS_TEXTURE1, &UnitMatrixD3D8 ); - } -}; - - -//! reflection 2 layer material renderer -class CD3D8MaterialRenderer_TRANSPARENT_REFLECTION_2_LAYER : public CD3D8MaterialRenderer -{ -public: - - CD3D8MaterialRenderer_TRANSPARENT_REFLECTION_2_LAYER(IDirect3DDevice8* p, CD3D8Driver* d) - : CD3D8MaterialRenderer(p, d) {} - - virtual void OnSetMaterial(const SMaterial& material, const SMaterial& lastMaterial, - bool resetAllRenderstates, IMaterialRendererServices* services) _IRR_OVERRIDE_ - { - services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); - - Driver->getBridgeCalls()->setBlend(true); - Driver->getBridgeCalls()->setBlendFunc(D3DBLEND_SRCALPHA, D3DBLEND_INVSRCALPHA); - - if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) - { - setTextureColorStage(pID3DDevice, 0, - D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE); - setTextureAlphaStage(pID3DDevice, 0, D3DTA_DIFFUSE); - setTextureColorStage(pID3DDevice, 1, - D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_CURRENT); - setTextureAlphaStage(pID3DDevice, 1, D3DTA_CURRENT); - - pID3DDevice->SetTransform(D3DTS_TEXTURE1, &SphereMapMatrixD3D8 ); - pID3DDevice->SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 ); - pID3DDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR); - } - } - - virtual void OnUnsetMaterial() _IRR_OVERRIDE_ - { - pID3DDevice->SetTextureStageState(1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); - pID3DDevice->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1); - pID3DDevice->SetTransform(D3DTS_TEXTURE1, &UnitMatrixD3D8); - Driver->getBridgeCalls()->setBlend(false); - } - - //! Returns if the material is transparent. The scene managment needs to know this - //! for being able to sort the materials by opaque and transparent. - virtual bool isTransparent() const _IRR_OVERRIDE_ - { - return true; - } -}; - -} // end namespace video -} // end namespace irr - -#endif -#endif -#endif - diff --git a/source/Irrlicht/CD3D8NormalMapRenderer.cpp b/source/Irrlicht/CD3D8NormalMapRenderer.cpp deleted file mode 100644 index 3cfb231c..00000000 --- a/source/Irrlicht/CD3D8NormalMapRenderer.cpp +++ /dev/null @@ -1,248 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#include "IrrCompileConfig.h" -#ifdef _IRR_COMPILE_WITH_DIRECT3D_8_ - -#include "CD3D8NormalMapRenderer.h" -#include "IMaterialRendererServices.h" -#include "IVideoDriver.h" -#include "os.h" -#include "SLight.h" - -namespace irr -{ -namespace video -{ - - // 1.1 Shaders with two lights and vertex based attenuation - - // Irrlicht Engine D3D8 render path normal map vertex shader - const char D3D8_NORMAL_MAP_VSH[] = - ";Irrlicht Engine 0.8 D3D8 render path normal map vertex shader\n"\ - "; c0-3: Transposed world matrix \n"\ - "; c8-11: Transposed worldViewProj matrix (Projection * View * World) \n"\ - "; c12: Light01 position \n"\ - "; c13: x,y,z: Light01 color; .w: 1/LightRadius˛ \n"\ - "; c14: Light02 position \n"\ - "; c15: x,y,z: Light02 color; .w: 1/LightRadius˛ \n"\ - "\n"\ - "; v0 - position \n"\ - "; v1 - normal \n"\ - "; v2 - color \n"\ - "; v3 - texture coord \n"\ - "; v4 - tangent \n"\ - "; v5 - binormal \n"\ - "\n"\ - "vs.1.1\n"\ - "\n"\ - "m4x4 oPos, v0, c8 ; transform position to clip space with worldViewProj matrix\n"\ - "\n"\ - "m3x3 r5, v4, c0 ; transform tangent U\n"\ - "m3x3 r7, v1, c0 ; transform normal W\n"\ - "m3x3 r6, v5, c0 ; transform binormal V\n"\ - "\n"\ - "m4x4 r4, v0, c0 ; vertex into world position\n"\ - "add r2, c12, -r4 ; vtxpos - lightpos1\n"\ - "add r3, c14, -r4 ; vtxpos - lightpos2\n"\ - "\n"\ - "dp3 r8.x, r5, r2 ; transform the light vector 1 with U, V, W\n"\ - "dp3 r8.y, r6, r2 \n"\ - "dp3 r8.z, r7, r2 \n"\ - "dp3 r9.x, r5, r3 ; transform the light vector 2 with U, V, W\n"\ - "dp3 r9.y, r6, r3 \n"\ - "dp3 r9.z, r7, r3 \n"\ - "\n"\ - "dp3 r8.w, r8, r8 ; normalize light vector 1 (r8)\n"\ - "rsq r8.w, r8.w \n"\ - "mul r8, r8, r8.w \n"\ - "dp3 r9.w, r9, r9 ; normalize light vector 2 (r9)\n"\ - "rsq r9.w, r9.w \n"\ - "mul r9, r9, r9.w \n"\ - "\n"\ - "mad oT2.xyz, r8.xyz, c95, c95 ; move light vector 1 from -1..1 into 0..1 \n"\ - "mad oT3.xyz, r9.xyz, c95, c95 ; move light vector 2 from -1..1 into 0..1 \n"\ - "\n"\ - " ; calculate attenuation of light 1 \n"\ - "dp3 r2.x, r2.xyz, r2.xyz ; r2.x = r2.x˛ + r2.y˛ + r2.z˛ \n"\ - "mul r2.x, r2.x, c13.w ; r2.x * attenutation \n"\ - "rsq r2, r2.x ; r2.xyzw = 1/sqrt(r2.x * attenutation)\n"\ - "mul oD0, r2, c13 ; resulting light color = lightcolor * attenuation \n"\ - "\n"\ - " ; calculate attenuation of light 2 \n"\ - "dp3 r3.x, r3.xyz, r3.xyz ; r3.x = r3.x˛ + r3.y˛ + r3.z˛ \n"\ - "mul r3.x, r3.x, c15.w ; r2.x * attenutation \n"\ - "rsq r3, r3.x ; r2.xyzw = 1/sqrt(r2.x * attenutation)\n"\ - "mul oD1, r3, c15 ; resulting light color = lightcolor * attenuation \n"\ - "\n"\ - "mov oT0.xy, v3.xy ; move out texture coordinates 1\n"\ - "mov oT1.xy, v3.xy ; move out texture coordinates 2\n"\ - "mov oD0.a, v2.a ; move out original alpha value \n"\ - "\n"; - - // Irrlicht Engine D3D8 render path normal map pixel shader - const char D3D8_NORMAL_MAP_PSH[] = - ";Irrlicht Engine 0.8 D3D8 render path normal map pixel shader\n"\ - ";Input: \n"\ - ";t0: color map texture coord \n"\ - ";t1: normal map texture coords \n"\ - ";t2: light 1 vector in tangent space \n"\ - ";v0: light 1 color \n"\ - ";t3: light 2 vector in tangent space \n"\ - ";v1: light 2 color \n"\ - ";v0.a: vertex alpha value \n"\ - "ps.1.1 \n"\ - "tex t0 ; sample color map \n"\ - "tex t1 ; sample normal map\n"\ - "texcoord t2 ; fetch light vector 1\n"\ - "texcoord t3 ; fetch light vector 2\n"\ - "\n"\ - "dp3_sat r0, t1_bx2, t2_bx2 ; normal dot light 1 (_bx2 because moved into 0..1)\n"\ - "mul r0, r0, v0 ; luminance1 * light color 1 \n"\ - "\n"\ - "dp3_sat r1, t1_bx2, t3_bx2 ; normal dot light 2 (_bx2 because moved into 0..1)\n"\ - "mad r0, r1, v1, r0 ; (luminance2 * light color 2) + luminance 1 \n"\ - "\n"\ - "mul r0, t0, r0 ; total luminance * base color\n"\ - "mov r0.a, v0.a ; write interpolated vertex alpha value \n"\ - "\n"\ - ""; - - CD3D8NormalMapRenderer::CD3D8NormalMapRenderer( - IDirect3DDevice8* d3ddev, video::IVideoDriver* driver, - s32& outMaterialTypeNr, IMaterialRenderer* baseMaterial) - : CD3D8ShaderMaterialRenderer(d3ddev, driver, 0, baseMaterial), - CompiledShaders(true) - { - - #ifdef _DEBUG - setDebugName("CD3D8NormalMapRenderer"); - #endif - - // set this as callback. We could have done this in - // the initialization list, but some compilers don't like it. - - CallBack = this; - - // basicly, this thing simply compiles these hardcoded shaders if the - // hardware is able to do them, otherwise it maps to the base material - - if (!driver->queryFeature(video::EVDF_PIXEL_SHADER_1_1) || - !driver->queryFeature(video::EVDF_VERTEX_SHADER_1_1)) - { - // this hardware is not able to do shaders. Fall back to - // base material. - outMaterialTypeNr = driver->addMaterialRenderer(this); - return; - } - - // check if already compiled normal map shaders are there. - - video::IMaterialRenderer* renderer = driver->getMaterialRenderer(EMT_NORMAL_MAP_SOLID); - if (renderer) - { - // use the already compiled shaders - video::CD3D8NormalMapRenderer* nmr = (video::CD3D8NormalMapRenderer*)renderer; - CompiledShaders = false; - - VertexShader = nmr->VertexShader; - PixelShader = nmr->PixelShader; - - outMaterialTypeNr = driver->addMaterialRenderer(this); - } - else - { - // compile shaders on our own - init(outMaterialTypeNr, D3D8_NORMAL_MAP_VSH, D3D8_NORMAL_MAP_PSH, EVT_TANGENTS); - } - // something failed, use base material - if (-1==outMaterialTypeNr) - driver->addMaterialRenderer(this); - } - - - CD3D8NormalMapRenderer::~CD3D8NormalMapRenderer() - { - if (CallBack == this) - CallBack = 0; - - if (!CompiledShaders) - { - // prevent this from deleting shaders we did not create - VertexShader = 0; - PixelShader = 0; - } - } - - - bool CD3D8NormalMapRenderer::OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype) - { - if (vtxtype != video::EVT_TANGENTS) - { - os::Printer::log("Error: Normal map renderer only supports vertices of type EVT_TANGENTS", ELL_ERROR); - return false; - } - - return CD3D8ShaderMaterialRenderer::OnRender(service, vtxtype); - } - - //! Returns the render capability of the material. - s32 CD3D8NormalMapRenderer::getRenderCapability() const - { - if (Driver->queryFeature(video::EVDF_PIXEL_SHADER_1_1) && - Driver->queryFeature(video::EVDF_VERTEX_SHADER_1_1)) - return 0; - - return 1; - } - - - //! Called by the engine when the vertex and/or pixel shader constants for an - //! material renderer should be set. - void CD3D8NormalMapRenderer::OnSetConstants(IMaterialRendererServices* services, s32 userData) - { - video::IVideoDriver* driver = services->getVideoDriver(); - - // set transposed world matrix - services->setVertexShaderConstant(driver->getTransform(video::ETS_WORLD).getTransposed().pointer(), 0, 4); - - // set transposed worldViewProj matrix - core::matrix4 worldViewProj(driver->getTransform(video::ETS_PROJECTION)); - worldViewProj *= driver->getTransform(video::ETS_VIEW); - worldViewProj *= driver->getTransform(video::ETS_WORLD); - services->setVertexShaderConstant(worldViewProj.getTransposed().pointer(), 8, 4); - - // here we've got to fetch the fixed function lights from the - // driver and set them as constants - - u32 cnt = driver->getDynamicLightCount(); - - for (u32 i=0; i<2; ++i) - { - SLight light; - - if (igetDynamicLight(i); - else - { - light.DiffuseColor.set(0,0,0); // make light dark - light.Radius = 1.0f; - } - - light.DiffuseColor.a = 1.0f/(light.Radius*light.Radius); // set attenuation - - services->setVertexShaderConstant(reinterpret_cast(&light.Position), 12+(i*2), 1); - services->setVertexShaderConstant(reinterpret_cast(&light.DiffuseColor), 13+(i*2), 1); - } - - f32 c95[] = {0.5f, 0.5f, 0.5f, 0.5f}; - services->setVertexShaderConstant(c95, 95, 1); - } - - -} // end namespace video -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_DIRECT3D_8_ - diff --git a/source/Irrlicht/CD3D8NormalMapRenderer.h b/source/Irrlicht/CD3D8NormalMapRenderer.h deleted file mode 100644 index 33ae8d9b..00000000 --- a/source/Irrlicht/CD3D8NormalMapRenderer.h +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __C_D3D8_NORMAL_MAPMATERIAL_RENDERER_H_INCLUDED__ -#define __C_D3D8_NORMAL_MAPMATERIAL_RENDERER_H_INCLUDED__ - -#include "IrrCompileConfig.h" -#ifdef _IRR_WINDOWS_API_ - -#ifdef _IRR_COMPILE_WITH_DIRECT3D_8_ -#include - -#include "CD3D8ShaderMaterialRenderer.h" -#include "IShaderConstantSetCallBack.h" - -namespace irr -{ -namespace video -{ - -//! Renderer for normal maps -class CD3D8NormalMapRenderer : public CD3D8ShaderMaterialRenderer, IShaderConstantSetCallBack -{ -public: - - CD3D8NormalMapRenderer( - IDirect3DDevice8* d3ddev, video::IVideoDriver* driver, - s32& outMaterialTypeNr, IMaterialRenderer* baseMaterial); - ~CD3D8NormalMapRenderer(); - - //! Called by the engine when the vertex and/or pixel shader constants for an - //! material renderer should be set. - virtual void OnSetConstants(IMaterialRendererServices* services, s32 userData) _IRR_OVERRIDE_; - - bool OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype); - - //! Returns the render capability of the material. - virtual s32 getRenderCapability() const _IRR_OVERRIDE_; - -private: - - //! stores if this shader compiled the shaders and is - //! allowed to delete them again. D3D8 lacks reference counting - //! support for shaders. - bool CompiledShaders; - -}; - -} // end namespace video -} // end namespace irr - -#endif -#endif -#endif - diff --git a/source/Irrlicht/CD3D8ParallaxMapRenderer.cpp b/source/Irrlicht/CD3D8ParallaxMapRenderer.cpp deleted file mode 100644 index 800cb66a..00000000 --- a/source/Irrlicht/CD3D8ParallaxMapRenderer.cpp +++ /dev/null @@ -1,318 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#include "IrrCompileConfig.h" -#ifdef _IRR_COMPILE_WITH_DIRECT3D_8_ - -#include "CD3D8ParallaxMapRenderer.h" -#include "IMaterialRendererServices.h" -#include "IVideoDriver.h" -#include "os.h" -#include "SLight.h" - -namespace irr -{ -namespace video -{ - // 1.1/1.4 Shaders with two lights and vertex based attenuation - - // Irrlicht Engine D3D8 render path normal map vertex shader - const char D3D8_PARALLAX_MAP_VSH[] = - ";Irrlicht Engine 0.10 D3D8 render path parallax mapping vertex shader\n"\ - "; c0-3: Transposed world matrix \n"\ - "; c4: Eye position \n"\ - "; c8-11: Transposed worldViewProj matrix (Projection * View * World) \n"\ - "; c12: Light01 position \n"\ - "; c13: x,y,z: Light01 color; .w: 1/LightRadius˛ \n"\ - "; c14: Light02 position \n"\ - "; c15: x,y,z: Light02 color; .w: 1/LightRadius˛ \n"\ - "vs.1.1\n"\ - "; v0 ; position \n"\ - "; v1 ; normal \n"\ - "; v2 ; color \n"\ - "; v3 ; texture coord \n"\ - "; v4 ; tangent \n"\ - "; v5 ; binormal \n"\ - "\n"\ - "def c95, 0.5, 0.5, 0.5, 0.5 ; used for moving light vector to ps \n"\ - "def c96, -1, 1, 1, 1 ; somewhere I've got a bug. flipping the vectors with this fixes it. \n"\ - "\n"\ - "m4x4 oPos, v0, c8 ; transform position to clip space with worldViewProj matrix\n"\ - "\n"\ - "m3x3 r5, v4, c0 ; transform tangent U\n"\ - "m3x3 r7, v1, c0 ; transform normal W\n"\ - "m3x3 r6, v5, c0 ; transform binormal V\n"\ - "\n"\ - "m4x4 r4, v0, c0 ; vertex into world position\n"\ - "add r2, c12, -r4 ; vtxpos - light1 pos\n"\ - "add r3, c14, -r4 ; vtxpos - light2 pos\n"\ - "add r1, -c4, r4 ; eye - vtxpos \n"\ - "\n"\ - "dp3 r8.x, r5, r2 ; transform the light1 vector with U, V, W\n"\ - "dp3 r8.y, r6, r2 \n"\ - "dp3 r8.z, r7, r2 \n"\ - "dp3 r9.x, r5, r3 ; transform the light2 vector with U, V, W\n"\ - "dp3 r9.y, r6, r3 \n"\ - "dp3 r9.z, r7, r3 \n"\ - "dp3 r10.x, r5, r1 ; transform the eye vector with U, V, W\n"\ - "dp3 r10.y, r6, r1 \n"\ - "dp3 r10.z, r7, r1 \n"\ - "\n"\ - "dp3 r8.w, r8, r8 ; normalize light vector 1 (r8)\n"\ - "rsq r8.w, r8.w \n"\ - "mul r8, r8, r8.w \n"\ - ";mul r8, r8, c96 \n"\ - "dp3 r9.w, r9, r9 ; normalize light vector 2 (r9)\n"\ - "rsq r9.w, r9.w \n"\ - "mul r9, r9, r9.w \n"\ - ";mul r9, r9, c96 \n"\ - "dp3 r10.w, r10, r10 ; normalize eye vector (r10)\n"\ - "rsq r10.w, r10.w \n"\ - "mul r10, r10, r10.w \n"\ - "mul r10, r10, c96 \n"\ - "\n"\ - "\n"\ - "mad oT2.xyz, r8.xyz, c95, c95 ; move light vector 1 from -1..1 into 0..1 \n"\ - "mad oT3.xyz, r9.xyz, c95, c95 ; move light vector 2 from -1..1 into 0..1 \n"\ - "mad oT4.xyz, r10.xyz, c95, c95 ; move eye vector from -1..1 into 0..1 \n"\ - "\n"\ - " ; calculate attenuation of light 1 \n"\ - "dp3 r2.x, r2.xyz, r2.xyz ; r2.x = r2.x˛ + r2.y˛ + r2.z˛ \n"\ - "mul r2.x, r2.x, c13.w ; r2.x * attenutation \n"\ - "rsq r2, r2.x ; r2.xyzw = 1/sqrt(r2.x * attenutation)\n"\ - "mul oD0, r2, c13 ; resulting light color = lightcolor * attenuation \n"\ - "\n"\ - " ; calculate attenuation of light 2 \n"\ - "dp3 r3.x, r3.xyz, r3.xyz ; r3.x = r3.x˛ + r3.y˛ + r3.z˛ \n"\ - "mul r3.x, r3.x, c15.w ; r2.x * attenutation \n"\ - "rsq r3, r3.x ; r2.xyzw = 1/sqrt(r2.x * attenutation)\n"\ - "mul oD1, r3, c15 ; resulting light color = lightcolor * attenuation \n"\ - "\n"\ - "mov oT0.xy, v3.xy ; move out texture coordinates 1\n"\ - "mov oT1.xy, v3.xy ; move out texture coordinates 2\n"\ - "mov oD0.a, v2.a ; move out original alpha value \n"\ - "\n"; - - - // Irrlicht Engine D3D8 render path normal map pixel shader version 1.4 - const char D3D8_PARALLAX_MAP_PSH[] = - ";Irrlicht Engine 0.10 D3D8 render path parallax mapping pixel shader \n"\ - ";Input: \n"\ - ";t0: color map texture coord \n"\ - ";t1: normal map texture coords \n"\ - ";t2: light 1 vector in tangent space \n"\ - ";t4: eye vector in tangent space \n"\ - ";v0: light 1 color \n"\ - ";t3: light 2 vector in tangent space \n"\ - ";v1: light 2 color \n"\ - ";v0.a: vertex alpha value \n"\ - " \n"\ - "ps.1.4 \n"\ - " \n"\ - ";def c6, 0.02f, 0.02f, 0.02f, 0.0f ; scale factor, now set in callback \n"\ - " \n"\ - "texld r1, t1 ; sample (normal.x, normal.y, normal.z, height) \n"\ - "texcrd r4.xyz, t4 ; fetch eye vector \n"\ - "texcrd r0.xyz, t0 ; color map \n"\ - " \n"\ - "; original parallax mapping: \n"\ - ";mul r3, r1_bx2.wwww, c6; ; r3 = (height, height, height) * scale \n"\ - ";mad r2.xyz, r3, r4_bx2, r0 ; newTexCoord = height * eye + oldTexCoord \n"\ - " \n"\ - "; modified parallax mapping to reduce swimming effect: \n"\ - "mul r3, r1_bx2.wwww, r1_bx2.zzzz ; (nh,nh,nh,nh) = (h,h,h,h) * (n.z,n.z,n.z,n.z,) \n"\ - "mul r3, r3, c6; ; r3 = (nh, nh, nh) * scale \n"\ - "mad r2.xyz, r3, r4_bx2, r0 ; newTexCoord = height * eye + oldTexCoord \n"\ - " \n"\ - "phase \n"\ - " \n"\ - "texld r0, r2 ; load diffuse texture with new tex coord \n"\ - "texld r1, r2 ; sample normal map \n"\ - "texcrd r2.xyz, t2 ; fetch light vector 1 \n"\ - "texcrd r3.xyz, t3 ; fetch light vector 2 \n"\ - " \n"\ - "dp3_sat r2, r1_bx2, r2_bx2 ; normal dot light 1 (_bx2 because moved into 0..1) \n"\ - "mul r2, r2, v0 ; luminance1 * light color 1 \n"\ - " \n"\ - "dp3_sat r3, r1_bx2, r3_bx2 ; normal dot light 2 (_bx2 because moved into 0..1) \n"\ - "mad r3, r3, v1, r2 ; (luminance2 * light color 2) + luminance1 \n"\ - " \n"\ - "mul r0.xyz, r0, r3 ; total luminance * base color \n"\ - "+mov r0.a, v0.a ; write original alpha value \n"\ - "\n"; - - - CD3D8ParallaxMapRenderer::CD3D8ParallaxMapRenderer( - IDirect3DDevice8* d3ddev, video::IVideoDriver* driver, - s32& outMaterialTypeNr, IMaterialRenderer* baseMaterial) - : CD3D8ShaderMaterialRenderer(d3ddev, driver, 0, baseMaterial), - CompiledShaders(true), CurrentScale(0.0f) - { - - #ifdef _DEBUG - setDebugName("CD3D8ParallaxMapRenderer"); - #endif - - // set this as callback. We could have done this in - // the initialization list, but some compilers don't like it. - - CallBack = this; - - // basicly, this thing simply compiles these hardcoded shaders if the - // hardware is able to do them, otherwise it maps to the base material - - if (!driver->queryFeature(video::EVDF_PIXEL_SHADER_1_4) || - !driver->queryFeature(video::EVDF_VERTEX_SHADER_1_1)) - { - // this hardware is not able to do shaders. Fall back to - // base material. - outMaterialTypeNr = driver->addMaterialRenderer(this); - return; - } - - // check if already compiled parallax map shaders are there. - - video::IMaterialRenderer* renderer = driver->getMaterialRenderer(EMT_PARALLAX_MAP_SOLID); - if (renderer) - { - // use the already compiled shaders - video::CD3D8ParallaxMapRenderer* nmr = (video::CD3D8ParallaxMapRenderer*)renderer; - CompiledShaders = false; - - VertexShader = nmr->VertexShader; - PixelShader = nmr->PixelShader; - - outMaterialTypeNr = driver->addMaterialRenderer(this); - } - else - { - // compile shaders on our own - init(outMaterialTypeNr, D3D8_PARALLAX_MAP_VSH, D3D8_PARALLAX_MAP_PSH, EVT_TANGENTS); - } - // something failed, use base material - if (-1==outMaterialTypeNr) - driver->addMaterialRenderer(this); - } - - - CD3D8ParallaxMapRenderer::~CD3D8ParallaxMapRenderer() - { - if (CallBack == this) - CallBack = 0; - - if (!CompiledShaders) - { - // prevent this from deleting shaders we did not create - VertexShader = 0; - PixelShader = 0; - } - } - - - bool CD3D8ParallaxMapRenderer::OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype) - { - if (vtxtype != video::EVT_TANGENTS) - { - os::Printer::log("Error: Normal map renderer only supports vertices of type EVT_TANGENTS", ELL_ERROR); - return false; - } - - return CD3D8ShaderMaterialRenderer::OnRender(service, vtxtype); - } - - - void CD3D8ParallaxMapRenderer::OnSetMaterial(const video::SMaterial& material, - const video::SMaterial& lastMaterial, - bool resetAllRenderstates, video::IMaterialRendererServices* services) - { - CD3D8ShaderMaterialRenderer::OnSetMaterial(material, lastMaterial, - resetAllRenderstates, services); - - CurrentScale = material.MaterialTypeParam; - } - - - //! Returns the render capability of the material. - s32 CD3D8ParallaxMapRenderer::getRenderCapability() const - { - if (Driver->queryFeature(video::EVDF_PIXEL_SHADER_1_4) && - Driver->queryFeature(video::EVDF_VERTEX_SHADER_1_1)) - return 0; - - return 1; - } - - - //! Called by the engine when the vertex and/or pixel shader constants - //! for an material renderer should be set. - void CD3D8ParallaxMapRenderer::OnSetConstants(IMaterialRendererServices* services, s32 userData) - { - video::IVideoDriver* driver = services->getVideoDriver(); - - // set transposed world matrix - services->setVertexShaderConstant(driver->getTransform(video::ETS_WORLD).getTransposed().pointer(), 0, 4); - - // set eye position - - // The viewpoint is at (0., 0., 0.) in eye space. - // Turning this into a vector [0 0 0 1] and multiply it by - // the inverse of the view matrix, the resulting vector is the - // object space location of the camera. - - f32 floats[4] = {0,0,0,1}; - core::matrix4 minv(driver->getTransform(video::ETS_VIEW)); - minv.makeInverse(); - minv.multiplyWith1x4Matrix(floats); - services->setVertexShaderConstant(floats, 4, 1); - - // set transposed worldViewProj matrix - core::matrix4 worldViewProj(driver->getTransform(video::ETS_PROJECTION)); - worldViewProj *= driver->getTransform(video::ETS_VIEW); - worldViewProj *= driver->getTransform(video::ETS_WORLD); - services->setVertexShaderConstant(worldViewProj.getTransposed().pointer(), 8, 4); - - // here we've got to fetch the fixed function lights from the driver - // and set them as constants - - const u32 cnt = driver->getDynamicLightCount(); - - for (u32 i=0; i<2; ++i) - { - SLight light; - - if (igetDynamicLight(i); - else - { - light.DiffuseColor.set(0,0,0); // make light dark - light.Radius = 1.0f; - } - - light.DiffuseColor.a = 1.0f/(light.Radius*light.Radius); // set attenuation - - services->setVertexShaderConstant(reinterpret_cast(&light.Position), 12+(i*2), 1); - services->setVertexShaderConstant(reinterpret_cast(&light.DiffuseColor), 13+(i*2), 1); - } - - // this is not really necessary in d3d9 (used a def instruction), but to be sure: - f32 c95[] = {0.5f, 0.5f, 0.5f, 0.5f}; - services->setVertexShaderConstant(c95, 95, 1); - f32 c96[] = {-1, 1, 1, 1}; - services->setVertexShaderConstant(c96, 96, 1); - - // set scale factor - f32 factor = 0.02f; // default value - if (CurrentScale != 0) - factor = CurrentScale; - - f32 c6[] = {factor, factor, factor, 0}; - services->setPixelShaderConstant(c6, 6, 1); - } - - -} // end namespace video -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_DIRECT3D_8_ - diff --git a/source/Irrlicht/CD3D8ParallaxMapRenderer.h b/source/Irrlicht/CD3D8ParallaxMapRenderer.h deleted file mode 100644 index 0d28db57..00000000 --- a/source/Irrlicht/CD3D8ParallaxMapRenderer.h +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __C_D3D8_PARALLAX_MAPMATERIAL_RENDERER_H_INCLUDED__ -#define __C_D3D8_PARALLAX_MAPMATERIAL_RENDERER_H_INCLUDED__ - -#include "IrrCompileConfig.h" -#ifdef _IRR_WINDOWS_API_ - -#ifdef _IRR_COMPILE_WITH_DIRECT3D_8_ -#include - -#include "CD3D8ShaderMaterialRenderer.h" -#include "IShaderConstantSetCallBack.h" - -namespace irr -{ -namespace video -{ - -//! Renderer for parallax maps -class CD3D8ParallaxMapRenderer : public CD3D8ShaderMaterialRenderer, IShaderConstantSetCallBack -{ -public: - - CD3D8ParallaxMapRenderer( - IDirect3DDevice8* d3ddev, video::IVideoDriver* driver, - s32& outMaterialTypeNr, IMaterialRenderer* baseMaterial); - ~CD3D8ParallaxMapRenderer(); - - //! Called by the engine when the vertex and/or pixel shader constants for an - //! material renderer should be set. - virtual void OnSetConstants(IMaterialRendererServices* services, s32 userData) _IRR_OVERRIDE_; - - virtual bool OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype) _IRR_OVERRIDE_; - - virtual void OnSetMaterial(const SMaterial& material) _IRR_OVERRIDE_ { } - virtual void OnSetMaterial(const video::SMaterial& material, - const video::SMaterial& lastMaterial, - bool resetAllRenderstates, video::IMaterialRendererServices* services) _IRR_OVERRIDE_; - - //! Returns the render capability of the material. - virtual s32 getRenderCapability() const _IRR_OVERRIDE_; - -private: - - //! stores if this shader compiled the shaders and is - //! allowed to delete them again. D3D8 lacks reference counting - //! support for shaders. - bool CompiledShaders; - - f32 CurrentScale; -}; - -} // end namespace video -} // end namespace irr - -#endif -#endif -#endif - diff --git a/source/Irrlicht/CD3D8ShaderMaterialRenderer.cpp b/source/Irrlicht/CD3D8ShaderMaterialRenderer.cpp deleted file mode 100644 index 8fe85f62..00000000 --- a/source/Irrlicht/CD3D8ShaderMaterialRenderer.cpp +++ /dev/null @@ -1,331 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#include "CD3D8ShaderMaterialRenderer.h" - -#include "IrrCompileConfig.h" -#ifdef _IRR_COMPILE_WITH_DIRECT3D_8_ -#include -#include -#pragma comment (lib, "d3dx8.lib") - -#include "IShaderConstantSetCallBack.h" -#include "IMaterialRendererServices.h" -#include "IVideoDriver.h" -#include "os.h" - -#ifndef _IRR_D3D_NO_SHADER_DEBUGGING -#include -#endif - -namespace irr -{ -namespace video -{ - -//! Public constructor -CD3D8ShaderMaterialRenderer::CD3D8ShaderMaterialRenderer(IDirect3DDevice8* d3ddev, video::IVideoDriver* driver, - s32& outMaterialTypeNr, const c8* vertexShaderProgram, const c8* pixelShaderProgram, - IShaderConstantSetCallBack* callback, IMaterialRenderer* baseMaterial, s32 userData) -: pID3DDevice(d3ddev), Driver(driver), CallBack(callback), BaseMaterial(baseMaterial), - VertexShader(0), OldVertexShader(0), PixelShader(0), UserData(userData) -{ - - #ifdef _DEBUG - setDebugName("CD3D8ShaderMaterialRenderer"); - #endif - - if (BaseMaterial) - BaseMaterial->grab(); - - if (CallBack) - CallBack->grab(); - - init(outMaterialTypeNr, vertexShaderProgram, pixelShaderProgram, EVT_STANDARD); -} - -//! constructor only for use by derived classes who want to -//! create a fall back material for example. -CD3D8ShaderMaterialRenderer::CD3D8ShaderMaterialRenderer(IDirect3DDevice8* d3ddev, - video::IVideoDriver* driver, - IShaderConstantSetCallBack* callback, - IMaterialRenderer* baseMaterial, - s32 userData) -: pID3DDevice(d3ddev), Driver(driver), BaseMaterial(baseMaterial), CallBack(callback), - VertexShader(0), PixelShader(0), UserData(userData) -{ - if (BaseMaterial) - BaseMaterial->grab(); - - if (CallBack) - CallBack->grab(); -} - - - -//! Destructor -CD3D8ShaderMaterialRenderer::~CD3D8ShaderMaterialRenderer() -{ - if (CallBack) - CallBack->drop(); - - if (VertexShader) - pID3DDevice->DeleteVertexShader(VertexShader); - - if (PixelShader) - pID3DDevice->DeletePixelShader(PixelShader); - - if (BaseMaterial) - BaseMaterial->drop (); -} - - -void CD3D8ShaderMaterialRenderer::init(s32& outMaterialTypeNr, const c8* vertexShaderProgram, - const c8* pixelShaderProgram, E_VERTEX_TYPE type) -{ - outMaterialTypeNr = -1; - - // create vertex shader - if (!createVertexShader(vertexShaderProgram, type)) - return; - - // create pixel shader - if (!createPixelShader(pixelShaderProgram)) - return; - - // register myself as new material - outMaterialTypeNr = Driver->addMaterialRenderer(this); -} - - -bool CD3D8ShaderMaterialRenderer::OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype) -{ - // call callback to set shader constants - if (CallBack && (VertexShader || PixelShader)) - CallBack->OnSetConstants(service, UserData); - - return true; -} - - -void CD3D8ShaderMaterialRenderer::OnSetMaterial(const video::SMaterial& material, const video::SMaterial& lastMaterial, - bool resetAllRenderstates, video::IMaterialRendererServices* services) -{ - if (material.MaterialType != lastMaterial.MaterialType || resetAllRenderstates) - { - if (VertexShader) - { - // We do not need to save and reset the old vertex shader, because - // in D3D8, this is mixed up with the fvf, and this is set by the driver - // every time. - //pID3DDevice->GetVertexShader(&OldVertexShader); - - // set new vertex shader - if (FAILED(pID3DDevice->SetVertexShader(VertexShader))) - os::Printer::log("Could not set vertex shader.", ELL_ERROR); - } - - // set new pixel shader - if (PixelShader) - { - if (FAILED(pID3DDevice->SetPixelShader(PixelShader))) - os::Printer::log("Could not set pixel shader.", ELL_ERROR); - } - } - - services->setBasicRenderStates(material, lastMaterial, resetAllRenderstates); - - if (BaseMaterial) - BaseMaterial->OnSetMaterial(material, lastMaterial, resetAllRenderstates, services); - - if (CallBack) - CallBack->OnSetMaterial(material); -} - -void CD3D8ShaderMaterialRenderer::OnUnsetMaterial() -{ - // We do not need to save and reset the old vertex shader, because - // in D3D8, this is mixed up with the fvf, and this is set by the driver - // every time. - // if (VertexShader) - // pID3DDevice->SetVertexShader(OldVertexShader); - - if (PixelShader) - pID3DDevice->SetPixelShader(0); - - if (BaseMaterial) - BaseMaterial->OnUnsetMaterial(); -} - - -//! Returns if the material is transparent. The scene managment needs to know this -//! for being able to sort the materials by opaque and transparent. -bool CD3D8ShaderMaterialRenderer::isTransparent() const -{ - return BaseMaterial ? BaseMaterial->isTransparent() : false; -} - -bool CD3D8ShaderMaterialRenderer::createPixelShader(const c8* pxsh) -{ - if (!pxsh) - return true; - -#if defined( _IRR_XBOX_PLATFORM_) - return false; -#else - // compile shader - - LPD3DXBUFFER code = 0; - LPD3DXBUFFER errors = 0; - - #ifdef _IRR_D3D_NO_SHADER_DEBUGGING - - // compile shader without debug info - D3DXAssembleShader(pxsh, (UINT)strlen(pxsh), 0, 0, &code, &errors); - - #else - - // compile shader and emitt some debug informations to - // make it possible to debug the shader in visual studio - - static int irr_dbg_file_nr = 0; - ++irr_dbg_file_nr; - char tmp[32]; - sprintf(tmp, "irr_d3d8_dbg_shader_%d.psh", irr_dbg_file_nr); - - FILE* f = fopen(tmp, "wb"); - fwrite(pxsh, strlen(pxsh), 1, f); - fflush(f); - fclose(f); - - D3DXAssembleShaderFromFile(tmp, D3DXASM_DEBUG, 0, &code, &errors); - #endif - if (errors) - { - // print out compilation errors. - os::Printer::log("Pixel shader compilation failed:", ELL_ERROR); - os::Printer::log((c8*)errors->GetBufferPointer(), ELL_ERROR); - - if (code) - code->Release(); - - errors->Release(); - return false; - } - - if (FAILED(pID3DDevice->CreatePixelShader((DWORD*)code->GetBufferPointer(), &PixelShader))) - { - os::Printer::log("Could not create pixel shader.", ELL_ERROR); - code->Release(); - return false; - } - - code->Release(); - return true; -#endif - -} - - - -bool CD3D8ShaderMaterialRenderer::createVertexShader(const char* vtxsh, E_VERTEX_TYPE type) -{ - if (!vtxsh) - return true; - - // compile shader -#if defined( _IRR_XBOX_PLATFORM_) - return false; -#else - - LPD3DXBUFFER code = 0; - LPD3DXBUFFER errors = 0; - - #ifdef _IRR_D3D_NO_SHADER_DEBUGGING - - // compile shader without debug info - D3DXAssembleShader(vtxsh, (UINT)strlen(vtxsh), 0, 0, &code, &errors); - - #else - - // compile shader and emitt some debug informations to - // make it possible to debug the shader in visual studio - static int irr_dbg_file_nr = 0; - ++irr_dbg_file_nr; - char tmp[32]; - sprintf(tmp, "irr_d3d8_dbg_shader_%d.vsh", irr_dbg_file_nr); - - FILE* f = fopen(tmp, "wb"); - fwrite(vtxsh, strlen(vtxsh), 1, f); - fflush(f); - fclose(f); - - D3DXAssembleShaderFromFile(tmp, D3DXASM_DEBUG, 0, &code, &errors); - - #endif - - - if (errors) - { - // print out compilation errors. - os::Printer::log("Vertex shader compilation failed:", ELL_ERROR); - os::Printer::log((c8*)errors->GetBufferPointer(), ELL_ERROR); - - if (code) - code->Release(); - - errors->Release(); - return false; - } - - DWORD* decl = 0; - - DWORD dwStdDecl[] = - { - D3DVSD_STREAM(0), - D3DVSD_REG(0, D3DVSDT_FLOAT3), // position 0 - D3DVSD_REG(1, D3DVSDT_FLOAT3), // normal 1 - D3DVSD_REG(2, D3DVSDT_D3DCOLOR ),// color 2 - D3DVSD_REG(3, D3DVSDT_FLOAT2 ), // tex1 3 - D3DVSD_REG(4, D3DVSDT_FLOAT2 ), // tex2 4 - D3DVSD_END() - }; - - DWORD dwTngtDecl[] = - { - D3DVSD_STREAM(0), - D3DVSD_REG(0 , D3DVSDT_FLOAT3), // position 0 - D3DVSD_REG(1 , D3DVSDT_FLOAT3), // normal 1 - D3DVSD_REG(2 , D3DVSDT_D3DCOLOR ),// color 2 - D3DVSD_REG(3 , D3DVSDT_FLOAT2 ), // tex1 3 - D3DVSD_REG(4, D3DVSDT_FLOAT3 ), // tangent 4 - D3DVSD_REG(5, D3DVSDT_FLOAT3 ), // binormal 5 - D3DVSD_END() - }; - - if (type == EVT_TANGENTS) - decl = dwTngtDecl; - else - decl = dwStdDecl; - - if (FAILED(pID3DDevice->CreateVertexShader(decl, - (DWORD*)code->GetBufferPointer(), &VertexShader, 0))) - { - os::Printer::log("Could not create vertex shader.", ELL_ERROR); - code->Release(); - return false; - } - - code->Release(); - return true; -#endif -} - - - -} // end namespace video -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_DIRECT3D_8_ - diff --git a/source/Irrlicht/CD3D8ShaderMaterialRenderer.h b/source/Irrlicht/CD3D8ShaderMaterialRenderer.h deleted file mode 100644 index f3a579fb..00000000 --- a/source/Irrlicht/CD3D8ShaderMaterialRenderer.h +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __C_D3D8_SHADER_MATERIAL_RENDERER_H_INCLUDED__ -#define __C_D3D8_SHADER_MATERIAL_RENDERER_H_INCLUDED__ - -#include "IrrCompileConfig.h" -#ifdef _IRR_WINDOWS_API_ - -#ifdef _IRR_COMPILE_WITH_DIRECT3D_8_ -#include -#include - -#include "IMaterialRenderer.h" -#include "S3DVertex.h" - -namespace irr -{ -namespace video -{ - -class IVideoDriver; -class IShaderConstantSetCallBack; -class IMaterialRenderer; - -//! Class for using vertex and pixel shaders with D3D8 -class CD3D8ShaderMaterialRenderer : public IMaterialRenderer -{ -public: - - //! Public constructor - CD3D8ShaderMaterialRenderer(IDirect3DDevice8* d3ddev, video::IVideoDriver* driver, - s32& outMaterialTypeNr, const c8* vertexShaderProgram, const c8* pixelShaderProgram, - IShaderConstantSetCallBack* callback, IMaterialRenderer* baseMaterial, s32 userData); - - //! Destructor - ~CD3D8ShaderMaterialRenderer(); - - virtual void OnSetMaterial(const video::SMaterial& material, const video::SMaterial& lastMaterial, - bool resetAllRenderstates, video::IMaterialRendererServices* services) _IRR_OVERRIDE_; - - virtual void OnUnsetMaterial() _IRR_OVERRIDE_; - - virtual bool OnRender(IMaterialRendererServices* service, E_VERTEX_TYPE vtxtype) _IRR_OVERRIDE_; - - //! Returns if the material is transparent. - virtual bool isTransparent() const _IRR_OVERRIDE_; - -protected: - - //! constructor only for use by derived classes who want to - //! create a fall back material for example. - CD3D8ShaderMaterialRenderer(IDirect3DDevice8* d3ddev, - video::IVideoDriver* driver, - IShaderConstantSetCallBack* callback, - IMaterialRenderer* baseMaterial, s32 userData=0); - - void init(s32& outMaterialTypeNr, const c8* vertexShaderProgram, const c8* pixelShaderProgram, - E_VERTEX_TYPE type); - bool createPixelShader(const c8* pxsh); - bool createVertexShader(const char* vtxsh, E_VERTEX_TYPE type); - - IDirect3DDevice8* pID3DDevice; - video::IVideoDriver* Driver; - IShaderConstantSetCallBack* CallBack; - IMaterialRenderer* BaseMaterial; - - DWORD VertexShader; - DWORD OldVertexShader; - DWORD PixelShader; - s32 UserData; -}; - - -} // end namespace video -} // end namespace irr - -#endif -#endif -#endif - diff --git a/source/Irrlicht/CD3D8Texture.cpp b/source/Irrlicht/CD3D8Texture.cpp deleted file mode 100644 index 21864707..00000000 --- a/source/Irrlicht/CD3D8Texture.cpp +++ /dev/null @@ -1,640 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#include "IrrCompileConfig.h" -#ifdef _IRR_COMPILE_WITH_DIRECT3D_8_ - -#define _IRR_DONT_DO_MEMORY_DEBUGGING_HERE -#include "CD3D8Texture.h" -#include "CD3D8Driver.h" -#include "os.h" - - -#ifndef _IRR_COMPILE_WITH_DIRECT3D_9_ -// The D3DXFilterTexture function seems to get linked wrong when -// compiling with both D3D8 and 9, causing it not to work in the D3D9 device. -// So mipmapgeneration is replaced with my own bad generation in d3d 8 when -// compiling with both D3D 8 and 9. -//#define _IRR_USE_D3DXFilterTexture_ -#endif // _IRR_COMPILE_WITH_DIRECT3D_9_ - -#include - -#ifdef _IRR_USE_D3DXFilterTexture_ -#pragma comment (lib, "d3dx8.lib") -#endif // _IRR_USE_D3DXFilterTexture_ - -namespace irr -{ -namespace video -{ - -//! rendertarget constructor -CD3D8Texture::CD3D8Texture(CD3D8Driver* driver, const core::dimension2d& size, const io::path& name) -: ITexture(name), Texture(0), RTTSurface(0), Driver(driver) -{ - #ifdef _DEBUG - setDebugName("CD3D8Texture"); - #endif - - Device=driver->getExposedVideoData().D3D8.D3DDev8; - if (Device) - Device->AddRef(); - - DriverType = EDT_DIRECT3D8; - OriginalSize = size; - Size = size; - IsRenderTarget = true; - - createRenderTarget(); -} - - -//! constructor -CD3D8Texture::CD3D8Texture(IImage* image, CD3D8Driver* driver, - u32 flags, const io::path& name, void* mipmapData) -: ITexture(name), Texture(0), RTTSurface(0), Driver(driver) -{ - #ifdef _DEBUG - setDebugName("CD3D8Texture"); - #endif - - DriverType = EDT_DIRECT3D8; - HasMipMaps = Driver->getTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS); - - Device=driver->getExposedVideoData().D3D8.D3DDev8; - if (Device) - Device->AddRef(); - - if (image) - { - if(image->getColorFormat() == ECF_DXT1 || image->getColorFormat() == ECF_DXT2 || image->getColorFormat() == ECF_DXT3 || image->getColorFormat() == ECF_DXT4 || image->getColorFormat() == ECF_DXT5) - { - if(!Driver->queryFeature(EVDF_TEXTURE_COMPRESSED_DXT)) - { - os::Printer::log("DXT texture compression not available.", ELL_ERROR); - return; - } - } - - if (createTexture(flags, image)) - { - if (copyTexture(image)) - { - regenerateMipMapLevels(mipmapData); - } - } - else - os::Printer::log("Could not create DIRECT3D8 Texture.", ELL_WARNING); - } -} - - -//! destructor -CD3D8Texture::~CD3D8Texture() -{ - if (Texture) - Texture->Release(); - - if (RTTSurface) - RTTSurface->Release(); - - if (Device) - Device->Release(); -} - - -//! creates the hardware texture -bool CD3D8Texture::createTexture(u32 flags, video::IImage* image) -{ - OriginalSize = image->getDimension(); - - core::dimension2d optSize = OriginalSize.getOptimalSize(!Driver->queryFeature(EVDF_TEXTURE_NPOT), !Driver->queryFeature(EVDF_TEXTURE_NSQUARE), true, Driver->Caps.MaxTextureWidth); - - D3DFORMAT format = D3DFMT_A1R5G5B5; - switch(getTextureFormatFromFlags(flags)) - { - case ETCF_ALWAYS_16_BIT: - format = D3DFMT_A1R5G5B5; break; - case ETCF_ALWAYS_32_BIT: - format = D3DFMT_A8R8G8B8; break; - case ETCF_OPTIMIZED_FOR_QUALITY: - { - switch(image->getColorFormat()) - { - case ECF_R8G8B8: - case ECF_A8R8G8B8: - format = D3DFMT_A8R8G8B8; break; - case ECF_A1R5G5B5: - case ECF_R5G6B5: - format = D3DFMT_A1R5G5B5; break; - } - } - break; - case ETCF_OPTIMIZED_FOR_SPEED: - format = D3DFMT_A1R5G5B5; break; - } - - if (Driver->getTextureCreationFlag(video::ETCF_NO_ALPHA_CHANNEL)) - { - if (format == D3DFMT_A8R8G8B8) - -#ifdef _IRR_XBOX_PLATFORM_ - format = D3DFMT_X8R8G8B8; -#else - format = D3DFMT_R8G8B8; -#endif - - else if (format == D3DFMT_A1R5G5B5) - format = D3DFMT_R5G6B5; - } - - const bool mipmaps = Driver->getTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS); - - HRESULT hr = Device->CreateTexture(optSize.Width, optSize.Height, - mipmaps ? 0 : 1, // number of mipmaplevels (0 = automatic all) - 0, format, D3DPOOL_MANAGED, &Texture); - - if (FAILED(hr)) - { - // try brute force 16 bit - if (format == D3DFMT_A8R8G8B8) - format = D3DFMT_A1R5G5B5; -#ifdef _IRR_XBOX_PLATFORM_ - else if (format == D3DFMT_X8R8G8B8) - format = D3DFMT_R5G6B5; -#else - else if (format == D3DFMT_R8G8B8) - format = D3DFMT_R5G6B5; -#endif - else - return false; - - hr = Device->CreateTexture(optSize.Width, optSize.Height, - mipmaps ? 0 : 1, // number of mipmaplevels (0 = automatic all) - 0, format, D3DPOOL_MANAGED, &Texture); - } - - ColorFormat = getColorFormatFromD3DFormat(format); - return (SUCCEEDED(hr)); -} - - -//! copies the image to the texture -bool CD3D8Texture::copyTexture(video::IImage* image) -{ - if (Texture && image) - { - D3DSURFACE_DESC desc; - Texture->GetLevelDesc(0, &desc); - - Size.Width = desc.Width; - Size.Height = desc.Height; - - D3DLOCKED_RECT rect; - HRESULT hr = Texture->LockRect(0, &rect, 0, 0); - if (FAILED(hr)) - { - os::Printer::log("Could not lock D3D8 Texture.", ELL_ERROR); - return false; - } - - Pitch = rect.Pitch; - image->copyToScaling(rect.pBits, Size.Width, Size.Height, ColorFormat, Pitch); - - hr = Texture->UnlockRect(0); - if (FAILED(hr)) - { - os::Printer::log("Could not unlock D3D8 Texture.", ELL_ERROR); - return false; - } - } - - return true; -} - - -//! lock function -void* CD3D8Texture::lock(E_TEXTURE_LOCK_MODE mode, u32 mipmapLevel) -{ - if (!Texture) - return 0; - - MipLevelLocked=mipmapLevel; - HRESULT hr; - D3DLOCKED_RECT rect; - if(!IsRenderTarget) - { - hr = Texture->LockRect(mipmapLevel, &rect, 0, (mode==ETLM_READ_ONLY)?D3DLOCK_READONLY:0); - if (FAILED(hr)) - { - os::Printer::log("Could not lock DIRECT3D9 Texture.", ELL_ERROR); - return 0; - } - } - else - { - if (!RTTSurface) - { - // Make RTT surface large enough for all miplevels (including 0) - D3DSURFACE_DESC desc; - Texture->GetLevelDesc(0, &desc); - hr = Device->CreateImageSurface(desc.Width, desc.Height, desc.Format, &RTTSurface); - if (FAILED(hr)) - { - os::Printer::log("Could not lock DIRECT3D8 Texture.", ELL_ERROR); - return 0; - } - } - - IDirect3DSurface8 *surface = 0; - hr = Texture->GetSurfaceLevel(mipmapLevel, &surface); - if (FAILED(hr)) - { - os::Printer::log("Could not lock DIRECT3D8 Texture.", "Could not get surface.", ELL_ERROR); - return 0; - } - hr = Device->CopyRects(surface, 0, 0, RTTSurface, 0); - surface->Release(); - if(FAILED(hr)) - { - os::Printer::log("Could not lock DIRECT3D8 Texture.", "Data copy failed.", ELL_ERROR); - return 0; - } - hr = RTTSurface->LockRect(&rect, 0, (mode==ETLM_READ_ONLY)?D3DLOCK_READONLY:0); - if(FAILED(hr)) - { - os::Printer::log("Could not lock DIRECT3D8 Texture.", "LockRect failed.", ELL_ERROR); - return 0; - } - } - return rect.pBits; -} - - -//! unlock function -void CD3D8Texture::unlock() -{ - if (!Texture) - return; - - if (!IsRenderTarget) - Texture->UnlockRect(MipLevelLocked); - else if (RTTSurface) - RTTSurface->UnlockRect(); -} - -//! returns the DIRECT3D8 Texture -IDirect3DTexture8* CD3D8Texture::getDX8Texture() const -{ - return Texture; -} - - -//! returns if texture has mipmap levels -bool CD3D8Texture::hasMipMaps() const -{ - return HasMipMaps; -} - - -// The D3DXFilterTexture function seems to get linked wrong when -// compiling with both D3D8 and 9, causing it not to work in the D3D9 device. -// So mipmapgeneration is replaced with my own bad generation in d3d 8 when -// compiling with both D3D 8 and 9. -bool CD3D8Texture::createMipMaps(u32 level) -{ - if (level==0) - return true; - - IDirect3DSurface8* upperSurface = 0; - IDirect3DSurface8* lowerSurface = 0; - - // get upper level - HRESULT hr = Texture->GetSurfaceLevel(level-1, &upperSurface); - if (FAILED(hr) || !upperSurface) - { - os::Printer::log("Could not get upper surface level for mip map generation", ELL_WARNING); - return false; - } - - // get lower level - hr = Texture->GetSurfaceLevel(level, &lowerSurface); - if (FAILED(hr) || !lowerSurface) - { - os::Printer::log("Could not get lower surface level for mip map generation", ELL_WARNING); - upperSurface->Release(); - return false; - } - - D3DSURFACE_DESC upperDesc, lowerDesc; - upperSurface->GetDesc(&upperDesc); - lowerSurface->GetDesc(&lowerDesc); - - D3DLOCKED_RECT upperlr; - D3DLOCKED_RECT lowerlr; - - // lock upper surface - if (FAILED(upperSurface->LockRect(&upperlr, NULL, 0))) - { - os::Printer::log("Could not lock upper texture for mip map generation", ELL_WARNING); - upperSurface->Release(); - lowerSurface->Release(); - return false; - } - - // lock lower surface - if (FAILED(lowerSurface->LockRect(&lowerlr, NULL, 0))) - { - os::Printer::log("Could not lock lower texture for mip map generation", ELL_WARNING); - upperSurface->UnlockRect(); - upperSurface->Release(); - lowerSurface->Release(); - return false; - } - - if (upperDesc.Format != lowerDesc.Format) - { - os::Printer::log("Cannot copy mip maps with different formats.", ELL_WARNING); - } - else - { - if (upperDesc.Format == D3DFMT_A1R5G5B5) - copy16BitMipMap((char*)upperlr.pBits, (char*)lowerlr.pBits, - upperDesc.Width, upperDesc.Height, - lowerDesc.Width, lowerDesc.Height, - upperlr.Pitch, lowerlr.Pitch); - else - if (upperDesc.Format == D3DFMT_A8R8G8B8) - copy32BitMipMap((char*)upperlr.pBits, (char*)lowerlr.pBits, - upperDesc.Width, upperDesc.Height, - lowerDesc.Width, lowerDesc.Height, - upperlr.Pitch, lowerlr.Pitch); - else - os::Printer::log("Unsupported mipmap format, cannot copy.", ELL_WARNING); - } - - bool result=true; - // unlock - if (FAILED(upperSurface->UnlockRect())) - result=false; - if (FAILED(lowerSurface->UnlockRect())) - result=false; - - // release - upperSurface->Release(); - lowerSurface->Release(); - - if (!result || upperDesc.Width < 3 || upperDesc.Height < 3) - return result; // stop generating levels - - // generate next level - return createMipMaps(level+1); -} - - -ECOLOR_FORMAT CD3D8Texture::getColorFormatFromD3DFormat(D3DFORMAT format) -{ - switch(format) - { - case D3DFMT_X1R5G5B5: - case D3DFMT_A1R5G5B5: - Pitch = Size.Width * 2; - return ECF_A1R5G5B5; - break; - case D3DFMT_A8R8G8B8: - case D3DFMT_X8R8G8B8: - Pitch = Size.Width * 4; - return ECF_A8R8G8B8; - break; - case D3DFMT_R5G6B5: - Pitch = Size.Width * 2; - return ECF_R5G6B5; - break; - default: - return (ECOLOR_FORMAT)0; - }; -} - - - -void CD3D8Texture::copy16BitMipMap(char* src, char* tgt, - const s32 srcWidth, const s32 srcHeight, - const s32 width, const s32 height, - const s32 pitchsrc, const s32 pitchtgt) const -{ - const s32 dy_max = (srcHeight==1?1:2); - const s32 dx_max = (srcWidth==1?1:2); - const s32 blockcount= dx_max*dy_max; - for (s32 y=0; yqueryFeature(EVDF_TEXTURE_NPOT), !Driver->queryFeature(EVDF_TEXTURE_NSQUARE), true, Driver->Caps.MaxTextureWidth); - - // get backbuffer format to create the render target in the - // same format - - IDirect3DSurface8* bb; - D3DFORMAT d3DFormat = D3DFMT_A8R8G8B8; - - if (!FAILED(Device->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &bb))) - { - D3DSURFACE_DESC desc; - bb->GetDesc(&desc); - d3DFormat = desc.Format; - - if (d3DFormat == D3DFMT_X8R8G8B8) - d3DFormat = D3DFMT_A8R8G8B8; - - bb->Release(); - } - else - { - os::Printer::log("Could not create RenderTarget texture: could not get BackBuffer.", - ELL_WARNING); - return; - } - - // create texture - HRESULT hr; - - hr = Device->CreateTexture( - Size.Width, - Size.Height, - 1, // mip map level count, we don't want mipmaps here - D3DUSAGE_RENDERTARGET, - d3DFormat, - D3DPOOL_DEFAULT, - &Texture); - - // get irrlicht format from D3D format - ColorFormat = getColorFormatFromD3DFormat(d3DFormat); - - if (FAILED(hr)) - os::Printer::log("Could not create render target texture"); -} - - -//! Regenerates the mip map levels of the texture. Useful after locking and -//! modifying the texture -void CD3D8Texture::regenerateMipMapLevels(void* mipmapData) -{ - if (mipmapData) - { - core::dimension2du size = Size; - u32 level=0; - do - { - if (size.Width>1) - size.Width /=2; - if (size.Height>1) - size.Height /=2; - ++level; - IDirect3DSurface8* mipSurface = 0; - HRESULT hr = Texture->GetSurfaceLevel(level, &mipSurface); - if (FAILED(hr) || !mipSurface) - { - os::Printer::log("Could not get mipmap level", ELL_WARNING); - return; - } - D3DSURFACE_DESC mipDesc; - mipSurface->GetDesc(&mipDesc); - D3DLOCKED_RECT miplr; - - // lock mipmap surface - if (FAILED(mipSurface->LockRect(&miplr, NULL, 0))) - { - mipSurface->Release(); - os::Printer::log("Could not lock texture", ELL_WARNING); - return; - } - - memcpy(miplr.pBits, mipmapData, size.getArea()*getPitch()/Size.Width); - mipmapData = (u8*)mipmapData+size.getArea()*getPitch()/Size.Width; - // unlock - mipSurface->UnlockRect(); - // release - mipSurface->Release(); - } while (size.Width != 1 || size.Height != 1); - } - else if (HasMipMaps) - { - // create mip maps. -#ifndef _IRR_USE_D3DXFilterTexture_ - // The D3DXFilterTexture function seems to get linked wrong when - // compiling with both D3D8 and 9, causing it not to work in the D3D9 device. - // So mipmapgeneration is replaced with my own bad generation in d3d 8 when - // compiling with both D3D 8 and 9. - HRESULT hr = D3DXFilterTexture(Texture, NULL, D3DX_DEFAULT , D3DX_DEFAULT ); - if (FAILED(hr)) -#endif - createMipMaps(); - } -} - -//! Returns pointer to the render target surface -IDirect3DSurface8* CD3D8Texture::getRenderTargetSurface() -{ - if (!IsRenderTarget) - return 0; - - IDirect3DSurface8 *pRTTSurface = 0; - if (Texture) - Texture->GetSurfaceLevel(0, &pRTTSurface); - - if (pRTTSurface) - pRTTSurface->Release(); - - return pRTTSurface; -} - - -} // end namespace video -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_DIRECT3D_8_ - diff --git a/source/Irrlicht/CD3D8Texture.h b/source/Irrlicht/CD3D8Texture.h deleted file mode 100644 index 7da68424..00000000 --- a/source/Irrlicht/CD3D8Texture.h +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright (C) 2002-2012 Nikolaus Gebhardt -// This file is part of the "Irrlicht Engine". -// For conditions of distribution and use, see copyright notice in irrlicht.h - -#ifndef __C_DIRECTX8_TEXTURE_H_INCLUDED__ -#define __C_DIRECTX8_TEXTURE_H_INCLUDED__ - -#include "IrrCompileConfig.h" -#ifdef _IRR_COMPILE_WITH_DIRECT3D_8_ - -#include "ITexture.h" -#include "IImage.h" - -#include - -namespace irr -{ -namespace video -{ - -class CD3D8Driver; - -/*! - interface for a Video Driver dependent Texture. -*/ -class CD3D8Texture : public ITexture -{ -public: - - //! constructor - CD3D8Texture(IImage* image, CD3D8Driver* driver, - u32 flags, const io::path& name, void* mipmapData=0); - - //! rendertarget constructor - CD3D8Texture(CD3D8Driver* driver, const core::dimension2d& size, const io::path& name); - - //! destructor - virtual ~CD3D8Texture(); - - //! lock function - virtual void* lock(E_TEXTURE_LOCK_MODE mode=ETLM_READ_WRITE, u32 mipmapLevel=0) _IRR_OVERRIDE_; - - //! unlock function - virtual void unlock() _IRR_OVERRIDE_; - - //! returns the DIRECT3D8 Texture - IDirect3DTexture8* getDX8Texture() const; - - //! returns if texture has mipmap levels - bool hasMipMaps() const; - - //! Regenerates the mip map levels of the texture. Useful after locking and - //! modifying the texture - virtual void regenerateMipMapLevels(void* mipmapData=0) _IRR_OVERRIDE_; - - //! Returns pointer to the render target surface - IDirect3DSurface8* getRenderTargetSurface(); - -private: - friend class CD3D8Driver; - - void createRenderTarget(); - - //! creates the hardware texture - bool createTexture(u32 flags, IImage* Image); - - //! copies the image to the texture - bool copyTexture(IImage* Image); - - //! convert color formats - ECOLOR_FORMAT getColorFormatFromD3DFormat(D3DFORMAT format); - - bool createMipMaps(u32 level=1); - - void copy16BitMipMap(char* src, char* tgt, - const s32 srcWidth, const s32 srcHeight, - const s32 width, const s32 height, - const s32 pitchsrc, const s32 pitchtgt) const; - - //! Helper function for mipmap generation. - void copy32BitMipMap(char* src, char* tgt, - const s32 srcWidth, const s32 srcHeight, - const s32 width, const s32 height, - const s32 pitchsrc, const s32 pitchtgt) const; - - IDirect3DDevice8* Device; - IDirect3DTexture8* Texture; - IDirect3DSurface8* RTTSurface; - CD3D8Driver* Driver; - u32 MipLevelLocked; -}; - - -} // end namespace video -} // end namespace irr - -#endif // _IRR_COMPILE_WITH_DIRECT3D_8_ - -#endif // __C_DIRECTX8_TEXTURE_H_INCLUDED__ - diff --git a/source/Irrlicht/CD3D9Driver.h b/source/Irrlicht/CD3D9Driver.h index 691da21b..712a5bd1 100644 --- a/source/Irrlicht/CD3D9Driver.h +++ b/source/Irrlicht/CD3D9Driver.h @@ -484,8 +484,8 @@ namespace video bool AlphaToCoverageSupport; }; - //! This bridge between Irlicht pseudo D3D8 calls - //! and true D3D8 calls. + //! This bridge between Irlicht pseudo D3D9 calls + //! and true D3D9 calls. class CD3D9CallBridge { diff --git a/source/Irrlicht/CD3D9Texture.cpp b/source/Irrlicht/CD3D9Texture.cpp index 713cbce8..e5668661 100644 --- a/source/Irrlicht/CD3D9Texture.cpp +++ b/source/Irrlicht/CD3D9Texture.cpp @@ -12,18 +12,6 @@ #include -#ifndef _IRR_COMPILE_WITH_DIRECT3D_8_ -// The D3DXFilterTexture function seems to get linked wrong when -// compiling with both D3D8 and 9, causing it not to work in the D3D9 device. -// So mipmapgeneration is replaced with my own bad generation in d3d 8 when -// compiling with both D3D 8 and 9. -// #define _IRR_USE_D3DXFilterTexture_ -#endif // _IRR_COMPILE_WITH_DIRECT3D_8_ - -#ifdef _IRR_USE_D3DXFilterTexture_ -#pragma comment(lib, "d3dx9.lib") -#endif - namespace irr { namespace video @@ -732,14 +720,6 @@ void CD3D9Texture::regenerateMipMapLevels(void* mipmapData) } else if (HasMipMaps) { - // create mip maps. -#ifdef _IRR_USE_D3DXFilterTexture_ - // The D3DXFilterTexture function seems to get linked wrong when - // compiling with both D3D8 and 9, causing it not to work in the D3D9 device. - // So mipmapgeneration is replaced with my own bad generation - HRESULT hr = D3DXFilterTexture(Texture, NULL, D3DX_DEFAULT, D3DX_DEFAULT); - if (FAILED(hr)) -#endif createMipMaps(); } } diff --git a/source/Irrlicht/CIrrDeviceConsole.cpp b/source/Irrlicht/CIrrDeviceConsole.cpp index 53892ee5..d067fa01 100644 --- a/source/Irrlicht/CIrrDeviceConsole.cpp +++ b/source/Irrlicht/CIrrDeviceConsole.cpp @@ -133,7 +133,6 @@ CIrrDeviceConsole::CIrrDeviceConsole(const SIrrlichtCreationParameters& params) #endif break; - case video::EDT_DIRECT3D8: case video::EDT_DIRECT3D9: case video::EDT_OPENGL: os::Printer::log("The console device cannot use hardware drivers yet.", ELL_ERROR); @@ -142,6 +141,7 @@ CIrrDeviceConsole::CIrrDeviceConsole(const SIrrlichtCreationParameters& params) VideoDriver = video::createNullDriver(FileSystem, CreationParams.WindowSize); break; default: + os::Printer::log("Unsupported device.", ELL_ERROR); break; } diff --git a/source/Irrlicht/CIrrDeviceFB.cpp b/source/Irrlicht/CIrrDeviceFB.cpp index 41dd997a..7c9936a7 100644 --- a/source/Irrlicht/CIrrDeviceFB.cpp +++ b/source/Irrlicht/CIrrDeviceFB.cpp @@ -206,8 +206,8 @@ void CIrrDeviceFB::createDriver() #endif break; + case DEPRECATED_EDT_DIRECT3D8_NO_LONGER_EXISTS: case video::EDT_OPENGL: - case video::EDT_DIRECT3D8: case video::EDT_DIRECT3D9: os::Printer::log("This driver is not available in FB. Try Software renderer.", ELL_WARNING); diff --git a/source/Irrlicht/CIrrDeviceLinux.cpp b/source/Irrlicht/CIrrDeviceLinux.cpp index 19ae0797..4251d909 100644 --- a/source/Irrlicht/CIrrDeviceLinux.cpp +++ b/source/Irrlicht/CIrrDeviceLinux.cpp @@ -860,7 +860,7 @@ void CIrrDeviceLinux::createDriver() #endif break; - case video::EDT_DIRECT3D8: + case video::DEPRECATED_EDT_DIRECT3D8_NO_LONGER_EXISTS: case video::EDT_DIRECT3D9: os::Printer::log("This driver is not available in Linux. Try OpenGL or Software renderer.", ELL_ERROR); diff --git a/source/Irrlicht/CIrrDeviceSDL.cpp b/source/Irrlicht/CIrrDeviceSDL.cpp index 37c7789d..d47e256f 100644 --- a/source/Irrlicht/CIrrDeviceSDL.cpp +++ b/source/Irrlicht/CIrrDeviceSDL.cpp @@ -28,12 +28,6 @@ namespace irr { namespace video { - - #ifdef _IRR_COMPILE_WITH_DIRECT3D_8_ - IVideoDriver* createDirectX8Driver(const irr::SIrrlichtCreationParameters& params, - io::IFileSystem* io, HWND window); - #endif - #ifdef _IRR_COMPILE_WITH_DIRECT3D_9_ IVideoDriver* createDirectX9Driver(const irr::SIrrlichtCreationParameters& params, io::IFileSystem* io, HWND window); @@ -218,18 +212,8 @@ void CIrrDeviceSDL::createDriver() { switch(CreationParams.DriverType) { - case video::EDT_DIRECT3D8: - #ifdef _IRR_COMPILE_WITH_DIRECT3D_8_ - - VideoDriver = video::createDirectX8Driver(CreationParams, FileSystem, HWnd); - if (!VideoDriver) - { - os::Printer::log("Could not create DIRECT3D8 Driver.", ELL_ERROR); - } - #else - os::Printer::log("DIRECT3D8 Driver was not compiled into this dll. Try another one.", ELL_ERROR); - #endif // _IRR_COMPILE_WITH_DIRECT3D_8_ - + case video::DEPRECATED_EDT_DIRECT3D8_NO_LONGER_EXISTS: + os::Printer::log("DIRECT3D8 Driver is no longer supported in Irrlicht. Try another one.", ELL_ERROR); break; case video::EDT_DIRECT3D9: diff --git a/source/Irrlicht/CIrrDeviceWin32.cpp b/source/Irrlicht/CIrrDeviceWin32.cpp index a22e43b4..e2061196 100644 --- a/source/Irrlicht/CIrrDeviceWin32.cpp +++ b/source/Irrlicht/CIrrDeviceWin32.cpp @@ -38,11 +38,6 @@ namespace irr { namespace video { - #ifdef _IRR_COMPILE_WITH_DIRECT3D_8_ - IVideoDriver* createDirectX8Driver(const irr::SIrrlichtCreationParameters& params, - io::IFileSystem* io, HWND window); - #endif - #ifdef _IRR_COMPILE_WITH_DIRECT3D_9_ IVideoDriver* createDirectX9Driver(const irr::SIrrlichtCreationParameters& params, io::IFileSystem* io, HWND window); @@ -1166,19 +1161,8 @@ void CIrrDeviceWin32::createDriver() { switch(CreationParams.DriverType) { - case video::EDT_DIRECT3D8: - #ifdef _IRR_COMPILE_WITH_DIRECT3D_8_ - - VideoDriver = video::createDirectX8Driver(CreationParams, FileSystem, HWnd); - - if (!VideoDriver) - { - os::Printer::log("Could not create DIRECT3D8 Driver.", ELL_ERROR); - } - #else - os::Printer::log("DIRECT3D8 Driver was not compiled into this dll. Try another one.", ELL_ERROR); - #endif // _IRR_COMPILE_WITH_DIRECT3D_8_ - + case video::DEPRECATED_EDT_DIRECT3D8_NO_LONGER_EXISTS: + os::Printer::log("DIRECT3D8 Driver is no longer supported in Irrlicht. Try another one.", ELL_ERROR); break; case video::EDT_DIRECT3D9: diff --git a/source/Irrlicht/Irrlicht-gcc.cbp b/source/Irrlicht/Irrlicht-gcc.cbp index 46402718..a7649e97 100644 --- a/source/Irrlicht/Irrlicht-gcc.cbp +++ b/source/Irrlicht/Irrlicht-gcc.cbp @@ -633,17 +633,6 @@ - - - - - - - - - - - diff --git a/source/Irrlicht/Irrlicht10.0.vcxproj b/source/Irrlicht/Irrlicht10.0.vcxproj index 7b3c1544..e72eacd4 100644 --- a/source/Irrlicht/Irrlicht10.0.vcxproj +++ b/source/Irrlicht/Irrlicht10.0.vcxproj @@ -1101,12 +1101,6 @@ - - - - - - @@ -1349,11 +1343,6 @@ - - - - - diff --git a/source/Irrlicht/Irrlicht10.0.vcxproj.filters b/source/Irrlicht/Irrlicht10.0.vcxproj.filters index cf1eac20..c93e742a 100644 --- a/source/Irrlicht/Irrlicht10.0.vcxproj.filters +++ b/source/Irrlicht/Irrlicht10.0.vcxproj.filters @@ -55,9 +55,6 @@ {834213c7-9515-49de-aa27-8d3ed9c0c87a} - - {19838bc4-396f-4d23-ad1b-3bb652e33e6d} - {a9ca9d4d-7678-4687-b78b-15236c0dcf53} @@ -882,24 +879,6 @@ Irrlicht\video\OpenGL - - Irrlicht\video\Direct3D8 - - - Irrlicht\video\Direct3D8 - - - Irrlicht\video\Direct3D8 - - - Irrlicht\video\Direct3D8 - - - Irrlicht\video\Direct3D8 - - - Irrlicht\video\Direct3D8 - Irrlicht\video\Null @@ -1643,21 +1622,6 @@ Irrlicht\video\OpenGL - - Irrlicht\video\Direct3D8 - - - Irrlicht\video\Direct3D8 - - - Irrlicht\video\Direct3D8 - - - Irrlicht\video\Direct3D8 - - - Irrlicht\video\Direct3D8 - Irrlicht\video\Null diff --git a/source/Irrlicht/Irrlicht11.0.vcxproj b/source/Irrlicht/Irrlicht11.0.vcxproj index 1894c7c2..c5bc913f 100644 --- a/source/Irrlicht/Irrlicht11.0.vcxproj +++ b/source/Irrlicht/Irrlicht11.0.vcxproj @@ -1107,12 +1107,6 @@ - - - - - - @@ -1356,11 +1350,6 @@ - - - - - diff --git a/source/Irrlicht/Irrlicht12.0.vcxproj b/source/Irrlicht/Irrlicht12.0.vcxproj index 311132fd..768d8a3e 100644 --- a/source/Irrlicht/Irrlicht12.0.vcxproj +++ b/source/Irrlicht/Irrlicht12.0.vcxproj @@ -1107,12 +1107,6 @@ - - - - - - @@ -1356,11 +1350,6 @@ - - - - - diff --git a/source/Irrlicht/Irrlicht12.0.vcxproj.filters b/source/Irrlicht/Irrlicht12.0.vcxproj.filters index 507d9794..028fea42 100644 --- a/source/Irrlicht/Irrlicht12.0.vcxproj.filters +++ b/source/Irrlicht/Irrlicht12.0.vcxproj.filters @@ -55,9 +55,6 @@ {834213c7-9515-49de-aa27-8d3ed9c0c87a} - - {19838bc4-396f-4d23-ad1b-3bb652e33e6d} - {a9ca9d4d-7678-4687-b78b-15236c0dcf53} @@ -888,24 +885,6 @@ Irrlicht\video\OpenGL - - Irrlicht\video\Direct3D8 - - - Irrlicht\video\Direct3D8 - - - Irrlicht\video\Direct3D8 - - - Irrlicht\video\Direct3D8 - - - Irrlicht\video\Direct3D8 - - - Irrlicht\video\Direct3D8 - Irrlicht\video\Null @@ -1643,21 +1622,6 @@ Irrlicht\video\OpenGL - - Irrlicht\video\Direct3D8 - - - Irrlicht\video\Direct3D8 - - - Irrlicht\video\Direct3D8 - - - Irrlicht\video\Direct3D8 - - - Irrlicht\video\Direct3D8 - Irrlicht\video\Null diff --git a/source/Irrlicht/Irrlicht9.0.vcproj b/source/Irrlicht/Irrlicht9.0.vcproj index b3aa7020..69544dce 100644 --- a/source/Irrlicht/Irrlicht9.0.vcproj +++ b/source/Irrlicht/Irrlicht9.0.vcproj @@ -2244,54 +2244,6 @@ > - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/source/Irrlicht/Makefile b/source/Irrlicht/Makefile index 4ff0b26a..5c148c0f 100644 --- a/source/Irrlicht/Makefile +++ b/source/Irrlicht/Makefile @@ -38,7 +38,7 @@ IRRMESHOBJ = $(IRRMESHLOADER) $(IRRMESHWRITER) \ IRROBJ = CBillboardSceneNode.o CCameraSceneNode.o CDummyTransformationSceneNode.o CEmptySceneNode.o CGeometryCreator.o CLightSceneNode.o CMeshManipulator.o CMetaTriangleSelector.o COctreeSceneNode.o COctreeTriangleSelector.o CSceneCollisionManager.o CSceneManager.o CShadowVolumeSceneNode.o CSkyBoxSceneNode.o CSkyDomeSceneNode.o CTerrainSceneNode.o CTerrainTriangleSelector.o CVolumeLightSceneNode.o CCubeSceneNode.o CSphereSceneNode.o CTextSceneNode.o CTriangleBBSelector.o CTriangleSelector.o CWaterSurfaceSceneNode.o CMeshCache.o CDefaultSceneNodeAnimatorFactory.o CDefaultSceneNodeFactory.o CSceneLoaderIrr.o IRRPARTICLEOBJ = CParticleAnimatedMeshSceneNodeEmitter.o CParticleBoxEmitter.o CParticleCylinderEmitter.o CParticleMeshEmitter.o CParticlePointEmitter.o CParticleRingEmitter.o CParticleSphereEmitter.o CParticleAttractionAffector.o CParticleFadeOutAffector.o CParticleGravityAffector.o CParticleRotationAffector.o CParticleSystemSceneNode.o CParticleScaleAffector.o IRRANIMOBJ = CSceneNodeAnimatorCameraFPS.o CSceneNodeAnimatorCameraMaya.o CSceneNodeAnimatorCollisionResponse.o CSceneNodeAnimatorDelete.o CSceneNodeAnimatorFlyCircle.o CSceneNodeAnimatorFlyStraight.o CSceneNodeAnimatorFollowSpline.o CSceneNodeAnimatorRotation.o CSceneNodeAnimatorTexture.o -IRRDRVROBJ = CNullDriver.o COpenGLDriver.o COpenGLNormalMapRenderer.o COpenGLParallaxMapRenderer.o COpenGLShaderMaterialRenderer.o COpenGLTexture.o COpenGLSLMaterialRenderer.o COpenGLExtensionHandler.o CD3D8Driver.o CD3D8NormalMapRenderer.o CD3D8ParallaxMapRenderer.o CD3D8ShaderMaterialRenderer.o CD3D8Texture.o CD3D9Driver.o CD3D9HLSLMaterialRenderer.o CD3D9NormalMapRenderer.o CD3D9ParallaxMapRenderer.o CD3D9ShaderMaterialRenderer.o CD3D9Texture.o +IRRDRVROBJ = CNullDriver.o COpenGLDriver.o COpenGLNormalMapRenderer.o COpenGLParallaxMapRenderer.o COpenGLShaderMaterialRenderer.o COpenGLTexture.o COpenGLSLMaterialRenderer.o COpenGLExtensionHandler.o CD3D9Driver.o CD3D9HLSLMaterialRenderer.o CD3D9NormalMapRenderer.o CD3D9ParallaxMapRenderer.o CD3D9ShaderMaterialRenderer.o CD3D9Texture.o IRRIMAGEOBJ = CColorConverter.o CImage.o CImageLoaderBMP.o CImageLoaderDDS.o CImageLoaderJPG.o CImageLoaderPCX.o CImageLoaderPNG.o CImageLoaderPSD.o CImageLoaderTGA.o CImageLoaderPPM.o CImageLoaderWAL.o CImageLoaderRGB.o \ CImageWriterBMP.o CImageWriterJPG.o CImageWriterPCX.o CImageWriterPNG.o CImageWriterPPM.o CImageWriterPSD.o CImageWriterTGA.o IRRVIDEOOBJ = CVideoModeList.o CFPSCounter.o $(IRRDRVROBJ) $(IRRIMAGEOBJ)