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-e03cc46cb475master
parent
a4bb55c839
commit
9eccabce40
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -678,7 +678,6 @@ void CQuake3EventHandler::CreateGUI()
|
|||
env->addStaticText ( L"VideoDriver:", rect<s32>( dim.Width - 400, 24, dim.Width - 310, 40 ),false, false, gui.Window, -1, false );
|
||||
gui.VideoDriver = env->addComboBox(rect<s32>( 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
|
||||
|
|
|
@ -61,7 +61,6 @@ bool CMainMenu::run(bool& outFullscreen, bool& outMusic, bool& outShadows,
|
|||
|
||||
gui::IGUIListBox* box = guienv->addListBox(core::rect<int>(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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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; }
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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_
|
||||
|
|
|
@ -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<HWND>(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;
|
||||
};
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -230,7 +230,7 @@
|
|||
* int main()
|
||||
* {
|
||||
* // start up the engine
|
||||
* IrrlichtDevice *device = createDevice(video::EDT_DIRECT3D8,
|
||||
* IrrlichtDevice *device = createDevice(video::EDT_OPENGL,
|
||||
* core::dimension2d<u32>(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
|
||||
|
|
|
@ -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
|
|
@ -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
|
File diff suppressed because it is too large
Load Diff
|
@ -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 <windows.h>
|
||||
#endif
|
||||
|
||||
#include "SIrrCreationParameters.h"
|
||||
// always included for static createDriver function
|
||||
#include "CNullDriver.h"
|
||||
#include "IMaterialRendererServices.h"
|
||||
|
||||
#include <d3d8.h>
|
||||
|
||||
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<s32>* 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<s32>& area) _IRR_OVERRIDE_;
|
||||
|
||||
//! gets the area of the current viewport
|
||||
virtual const core::rect<s32>& 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<s32>& destPos,
|
||||
const core::rect<s32>& sourceRect, const core::rect<s32>* 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<s32>& destRect,
|
||||
const core::rect<s32>& sourceRect, const core::rect<s32>* 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<s32>& pos,
|
||||
SColor colorLeftUp, SColor colorRightUp, SColor colorLeftDown, SColor colorRightDown,
|
||||
const core::rect<s32>* clip = 0) _IRR_OVERRIDE_;
|
||||
|
||||
//! Draws a 2d line.
|
||||
virtual void draw2DLine(const core::position2d<s32>& start,
|
||||
const core::position2d<s32>& 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<core::vector3df>& 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<u32>& 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<u32>& 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<u32>& 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<u32> CurrentRendertargetSize;
|
||||
|
||||
HWND WindowId;
|
||||
core::rect<s32>* 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__
|
||||
|
|
@ -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 <d3d8.h>
|
||||
|
||||
#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
|
||||
|
|
@ -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 (i<cnt)
|
||||
light = driver->getDynamicLight(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<const f32*>(&light.Position), 12+(i*2), 1);
|
||||
services->setVertexShaderConstant(reinterpret_cast<const f32*>(&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_
|
||||
|
|
@ -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 <d3d8.h>
|
||||
|
||||
#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
|
||||
|
|
@ -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 (i<cnt)
|
||||
light = driver->getDynamicLight(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<const f32*>(&light.Position), 12+(i*2), 1);
|
||||
services->setVertexShaderConstant(reinterpret_cast<const f32*>(&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_
|
||||
|
|
@ -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 <d3d8.h>
|
||||
|
||||
#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
|
||||
|
|
@ -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 <d3d8.h>
|
||||
#include <d3dx8core.h>
|
||||
#pragma comment (lib, "d3dx8.lib")
|
||||
|
||||
#include "IShaderConstantSetCallBack.h"
|
||||
#include "IMaterialRendererServices.h"
|
||||
#include "IVideoDriver.h"
|
||||
#include "os.h"
|
||||
|
||||
#ifndef _IRR_D3D_NO_SHADER_DEBUGGING
|
||||
#include <stdio.h>
|
||||
#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_
|
||||
|
|
@ -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 <d3d8.h>
|
||||
#include <d3dx8core.h>
|
||||
|
||||
#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
|
||||
|
|
@ -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 <d3dx8tex.h>
|
||||
|
||||
#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<u32>& 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<u32> 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; y<height; ++y)
|
||||
{
|
||||
for (s32 x=0; x<width; ++x)
|
||||
{
|
||||
u32 a=0, r=0, g=0, b=0;
|
||||
for (s32 dy=0; dy<dy_max; ++dy)
|
||||
{
|
||||
const s32 tgy = (y*2)+dy;
|
||||
for (s32 dx=0; dx<dx_max; ++dx)
|
||||
{
|
||||
const s32 tgx = (x*2)+dx;
|
||||
|
||||
SColor c;
|
||||
if (ColorFormat == ECF_A1R5G5B5)
|
||||
c = A1R5G5B5toA8R8G8B8(*(u16*)(&src[(tgx*2)+(tgy*pitchsrc)]));
|
||||
else
|
||||
c = R5G6B5toA8R8G8B8(*(u16*)(&src[(tgx*2)+(tgy*pitchsrc)]));
|
||||
|
||||
a += c.getAlpha();
|
||||
r += c.getRed();
|
||||
g += c.getGreen();
|
||||
b += c.getBlue();
|
||||
}
|
||||
}
|
||||
|
||||
a /= blockcount;
|
||||
r /= blockcount;
|
||||
g /= blockcount;
|
||||
b /= blockcount;
|
||||
|
||||
u16 c;
|
||||
if (ColorFormat == ECF_A1R5G5B5)
|
||||
c = RGBA16(r,g,b,a);
|
||||
else
|
||||
c = A8R8G8B8toR5G6B5(SColor(a,r,g,b).color);
|
||||
*(u16*)(&tgt[(x*2)+(y*pitchtgt)]) = c;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CD3D8Texture::copy32BitMipMap(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; y<height; ++y)
|
||||
{
|
||||
for (s32 x=0; x<width; ++x)
|
||||
{
|
||||
u32 a=0, r=0, g=0, b=0;
|
||||
SColor c;
|
||||
|
||||
for (s32 dy=0; dy<dy_max; ++dy)
|
||||
{
|
||||
const s32 tgy = (y*2)+dy;
|
||||
for (s32 dx=0; dx<dx_max; ++dx)
|
||||
{
|
||||
const s32 tgx = (x*2)+dx;
|
||||
|
||||
c = *(u32*)(&src[(tgx*4)+(tgy*pitchsrc)]);
|
||||
|
||||
a += c.getAlpha();
|
||||
r += c.getRed();
|
||||
g += c.getGreen();
|
||||
b += c.getBlue();
|
||||
}
|
||||
}
|
||||
|
||||
a /= blockcount;
|
||||
r /= blockcount;
|
||||
g /= blockcount;
|
||||
b /= blockcount;
|
||||
|
||||
c.set(a, r, g, b);
|
||||
*(u32*)(&tgt[(x*4)+(y*pitchtgt)]) = c.color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CD3D8Texture::createRenderTarget()
|
||||
{
|
||||
Size = Size.getOptimalSize(!Driver->queryFeature(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_
|
||||
|
|
@ -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 <d3d8.h>
|
||||
|
||||
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<u32>& 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__
|
||||
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -12,18 +12,6 @@
|
|||
|
||||
#include <d3dx9tex.h>
|
||||
|
||||
#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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -633,17 +633,6 @@
|
|||
<Unit filename="CColorConverter.h" />
|
||||
<Unit filename="CCubeSceneNode.cpp" />
|
||||
<Unit filename="CCubeSceneNode.h" />
|
||||
<Unit filename="CD3D8Driver.cpp" />
|
||||
<Unit filename="CD3D8Driver.h" />
|
||||
<Unit filename="CD3D8MaterialRenderer.h" />
|
||||
<Unit filename="CD3D8NormalMapRenderer.cpp" />
|
||||
<Unit filename="CD3D8NormalMapRenderer.h" />
|
||||
<Unit filename="CD3D8ParallaxMapRenderer.cpp" />
|
||||
<Unit filename="CD3D8ParallaxMapRenderer.h" />
|
||||
<Unit filename="CD3D8ShaderMaterialRenderer.cpp" />
|
||||
<Unit filename="CD3D8ShaderMaterialRenderer.h" />
|
||||
<Unit filename="CD3D8Texture.cpp" />
|
||||
<Unit filename="CD3D8Texture.h" />
|
||||
<Unit filename="CD3D9Driver.cpp" />
|
||||
<Unit filename="CD3D9Driver.h" />
|
||||
<Unit filename="CD3D9HLSLMaterialRenderer.cpp" />
|
||||
|
|
|
@ -1101,12 +1101,6 @@
|
|||
<ClInclude Include="COpenGLTexture.h" />
|
||||
<ClInclude Include="glext.h" />
|
||||
<ClInclude Include="wglext.h" />
|
||||
<ClInclude Include="CD3D8Driver.h" />
|
||||
<ClInclude Include="CD3D8MaterialRenderer.h" />
|
||||
<ClInclude Include="CD3D8NormalMapRenderer.h" />
|
||||
<ClInclude Include="CD3D8ParallaxMapRenderer.h" />
|
||||
<ClInclude Include="CD3D8ShaderMaterialRenderer.h" />
|
||||
<ClInclude Include="CD3D8Texture.h" />
|
||||
<ClInclude Include="CColorConverter.h" />
|
||||
<ClInclude Include="CFPSCounter.h" />
|
||||
<ClInclude Include="CImage.h" />
|
||||
|
@ -1349,11 +1343,6 @@
|
|||
<ClCompile Include="COpenGLShaderMaterialRenderer.cpp" />
|
||||
<ClCompile Include="COpenGLSLMaterialRenderer.cpp" />
|
||||
<ClCompile Include="COpenGLTexture.cpp" />
|
||||
<ClCompile Include="CD3D8Driver.cpp" />
|
||||
<ClCompile Include="CD3D8NormalMapRenderer.cpp" />
|
||||
<ClCompile Include="CD3D8ParallaxMapRenderer.cpp" />
|
||||
<ClCompile Include="CD3D8ShaderMaterialRenderer.cpp" />
|
||||
<ClCompile Include="CD3D8Texture.cpp" />
|
||||
<ClCompile Include="CColorConverter.cpp" />
|
||||
<ClCompile Include="CFPSCounter.cpp" />
|
||||
<ClCompile Include="CImage.cpp" />
|
||||
|
|
|
@ -55,9 +55,6 @@
|
|||
<Filter Include="Irrlicht\video\OpenGL">
|
||||
<UniqueIdentifier>{834213c7-9515-49de-aa27-8d3ed9c0c87a}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Irrlicht\video\Direct3D8">
|
||||
<UniqueIdentifier>{19838bc4-396f-4d23-ad1b-3bb652e33e6d}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Irrlicht\video\Null">
|
||||
<UniqueIdentifier>{a9ca9d4d-7678-4687-b78b-15236c0dcf53}</UniqueIdentifier>
|
||||
</Filter>
|
||||
|
@ -882,24 +879,6 @@
|
|||
<ClInclude Include="wglext.h">
|
||||
<Filter>Irrlicht\video\OpenGL</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="CD3D8Driver.h">
|
||||
<Filter>Irrlicht\video\Direct3D8</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="CD3D8MaterialRenderer.h">
|
||||
<Filter>Irrlicht\video\Direct3D8</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="CD3D8NormalMapRenderer.h">
|
||||
<Filter>Irrlicht\video\Direct3D8</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="CD3D8ParallaxMapRenderer.h">
|
||||
<Filter>Irrlicht\video\Direct3D8</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="CD3D8ShaderMaterialRenderer.h">
|
||||
<Filter>Irrlicht\video\Direct3D8</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="CD3D8Texture.h">
|
||||
<Filter>Irrlicht\video\Direct3D8</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="CColorConverter.h">
|
||||
<Filter>Irrlicht\video\Null</Filter>
|
||||
</ClInclude>
|
||||
|
@ -1643,21 +1622,6 @@
|
|||
<ClCompile Include="COpenGLTexture.cpp">
|
||||
<Filter>Irrlicht\video\OpenGL</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="CD3D8Driver.cpp">
|
||||
<Filter>Irrlicht\video\Direct3D8</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="CD3D8NormalMapRenderer.cpp">
|
||||
<Filter>Irrlicht\video\Direct3D8</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="CD3D8ParallaxMapRenderer.cpp">
|
||||
<Filter>Irrlicht\video\Direct3D8</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="CD3D8ShaderMaterialRenderer.cpp">
|
||||
<Filter>Irrlicht\video\Direct3D8</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="CD3D8Texture.cpp">
|
||||
<Filter>Irrlicht\video\Direct3D8</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="CColorConverter.cpp">
|
||||
<Filter>Irrlicht\video\Null</Filter>
|
||||
</ClCompile>
|
||||
|
|
|
@ -1107,12 +1107,6 @@
|
|||
<ClInclude Include="COpenGLTexture.h" />
|
||||
<ClInclude Include="glext.h" />
|
||||
<ClInclude Include="wglext.h" />
|
||||
<ClInclude Include="CD3D8Driver.h" />
|
||||
<ClInclude Include="CD3D8MaterialRenderer.h" />
|
||||
<ClInclude Include="CD3D8NormalMapRenderer.h" />
|
||||
<ClInclude Include="CD3D8ParallaxMapRenderer.h" />
|
||||
<ClInclude Include="CD3D8ShaderMaterialRenderer.h" />
|
||||
<ClInclude Include="CD3D8Texture.h" />
|
||||
<ClInclude Include="CColorConverter.h" />
|
||||
<ClInclude Include="CFPSCounter.h" />
|
||||
<ClInclude Include="CImage.h" />
|
||||
|
@ -1356,11 +1350,6 @@
|
|||
<ClCompile Include="COpenGLShaderMaterialRenderer.cpp" />
|
||||
<ClCompile Include="COpenGLSLMaterialRenderer.cpp" />
|
||||
<ClCompile Include="COpenGLTexture.cpp" />
|
||||
<ClCompile Include="CD3D8Driver.cpp" />
|
||||
<ClCompile Include="CD3D8NormalMapRenderer.cpp" />
|
||||
<ClCompile Include="CD3D8ParallaxMapRenderer.cpp" />
|
||||
<ClCompile Include="CD3D8ShaderMaterialRenderer.cpp" />
|
||||
<ClCompile Include="CD3D8Texture.cpp" />
|
||||
<ClCompile Include="CColorConverter.cpp" />
|
||||
<ClCompile Include="CFPSCounter.cpp" />
|
||||
<ClCompile Include="CImage.cpp" />
|
||||
|
|
|
@ -1107,12 +1107,6 @@
|
|||
<ClInclude Include="COpenGLTexture.h" />
|
||||
<ClInclude Include="glext.h" />
|
||||
<ClInclude Include="wglext.h" />
|
||||
<ClInclude Include="CD3D8Driver.h" />
|
||||
<ClInclude Include="CD3D8MaterialRenderer.h" />
|
||||
<ClInclude Include="CD3D8NormalMapRenderer.h" />
|
||||
<ClInclude Include="CD3D8ParallaxMapRenderer.h" />
|
||||
<ClInclude Include="CD3D8ShaderMaterialRenderer.h" />
|
||||
<ClInclude Include="CD3D8Texture.h" />
|
||||
<ClInclude Include="CColorConverter.h" />
|
||||
<ClInclude Include="CFPSCounter.h" />
|
||||
<ClInclude Include="CImage.h" />
|
||||
|
@ -1356,11 +1350,6 @@
|
|||
<ClCompile Include="COpenGLShaderMaterialRenderer.cpp" />
|
||||
<ClCompile Include="COpenGLSLMaterialRenderer.cpp" />
|
||||
<ClCompile Include="COpenGLTexture.cpp" />
|
||||
<ClCompile Include="CD3D8Driver.cpp" />
|
||||
<ClCompile Include="CD3D8NormalMapRenderer.cpp" />
|
||||
<ClCompile Include="CD3D8ParallaxMapRenderer.cpp" />
|
||||
<ClCompile Include="CD3D8ShaderMaterialRenderer.cpp" />
|
||||
<ClCompile Include="CD3D8Texture.cpp" />
|
||||
<ClCompile Include="CColorConverter.cpp" />
|
||||
<ClCompile Include="CFPSCounter.cpp" />
|
||||
<ClCompile Include="CImage.cpp" />
|
||||
|
|
|
@ -55,9 +55,6 @@
|
|||
<Filter Include="Irrlicht\video\OpenGL">
|
||||
<UniqueIdentifier>{834213c7-9515-49de-aa27-8d3ed9c0c87a}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Irrlicht\video\Direct3D8">
|
||||
<UniqueIdentifier>{19838bc4-396f-4d23-ad1b-3bb652e33e6d}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Irrlicht\video\Null">
|
||||
<UniqueIdentifier>{a9ca9d4d-7678-4687-b78b-15236c0dcf53}</UniqueIdentifier>
|
||||
</Filter>
|
||||
|
@ -888,24 +885,6 @@
|
|||
<ClInclude Include="wglext.h">
|
||||
<Filter>Irrlicht\video\OpenGL</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="CD3D8Driver.h">
|
||||
<Filter>Irrlicht\video\Direct3D8</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="CD3D8MaterialRenderer.h">
|
||||
<Filter>Irrlicht\video\Direct3D8</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="CD3D8NormalMapRenderer.h">
|
||||
<Filter>Irrlicht\video\Direct3D8</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="CD3D8ParallaxMapRenderer.h">
|
||||
<Filter>Irrlicht\video\Direct3D8</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="CD3D8ShaderMaterialRenderer.h">
|
||||
<Filter>Irrlicht\video\Direct3D8</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="CD3D8Texture.h">
|
||||
<Filter>Irrlicht\video\Direct3D8</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="CColorConverter.h">
|
||||
<Filter>Irrlicht\video\Null</Filter>
|
||||
</ClInclude>
|
||||
|
@ -1643,21 +1622,6 @@
|
|||
<ClCompile Include="COpenGLTexture.cpp">
|
||||
<Filter>Irrlicht\video\OpenGL</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="CD3D8Driver.cpp">
|
||||
<Filter>Irrlicht\video\Direct3D8</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="CD3D8NormalMapRenderer.cpp">
|
||||
<Filter>Irrlicht\video\Direct3D8</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="CD3D8ParallaxMapRenderer.cpp">
|
||||
<Filter>Irrlicht\video\Direct3D8</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="CD3D8ShaderMaterialRenderer.cpp">
|
||||
<Filter>Irrlicht\video\Direct3D8</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="CD3D8Texture.cpp">
|
||||
<Filter>Irrlicht\video\Direct3D8</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="CColorConverter.cpp">
|
||||
<Filter>Irrlicht\video\Null</Filter>
|
||||
</ClCompile>
|
||||
|
|
|
@ -2244,54 +2244,6 @@
|
|||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Direct3D8"
|
||||
>
|
||||
<File
|
||||
RelativePath="CD3D8Driver.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="CD3D8Driver.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="CD3D8MaterialRenderer.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="CD3D8NormalMapRenderer.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="CD3D8NormalMapRenderer.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="CD3D8ParallaxMapRenderer.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="CD3D8ParallaxMapRenderer.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="CD3D8ShaderMaterialRenderer.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="CD3D8ShaderMaterialRenderer.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="CD3D8Texture.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="CD3D8Texture.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Null"
|
||||
>
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue