~baltix/+junk/irrlicht-test

« back to all changes in this revision

Viewing changes to tests/mrt.cpp

  • Committer: Mantas Kriaučiūnas
  • Date: 2011-07-18 13:06:25 UTC
  • Revision ID: mantas@akl.lt-20110718130625-c5pvifp61e7kj1ol
Included whole irrlicht SVN libraries to work around launchpad recipe issue with quilt, see https://answers.launchpad.net/launchpad/+question/165193

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Copyright (C) 2008-2011 Christian Stehno, Colin MacDonald
 
2
// No rights reserved: this software is in the public domain.
 
3
 
 
4
#include "testUtils.h"
 
5
 
 
6
using namespace irr;
 
7
 
 
8
//! Tests rendering MRTs
 
9
static bool testWithDriver(video::E_DRIVER_TYPE driverType)
 
10
{
 
11
        IrrlichtDevice *device = createDevice (driverType, core::dimension2d < u32 > (220, 80));
 
12
        if (!device)
 
13
                return true; // No error if device does not exist
 
14
 
 
15
        video::IVideoDriver* driver = device->getVideoDriver();
 
16
        // We need at least GLSL 1.10 or HLSL 1.1
 
17
//      if (driver->getDriverAttributes().getAttributeAsInt("ShaderLanguageVersion")<=100)
 
18
//              return true;
 
19
 
 
20
        logTestString("Testing driver %ls\n", driver->getName());
 
21
 
 
22
        const char* const ps1="struct PS_INPUT\n {\n float4 Position      : POSITION0;\n };\n\n struct PS_OUTPUT\n {\n float4   Color      : COLOR0;\n float4   Normal      : COLOR1;\n float4   Depth      : COLOR2;\n };\n PS_OUTPUT pixelMain( PS_INPUT Input )\n {\n PS_OUTPUT Output;\n Output.Color = float4(1.0,1.0,1.0,1.0);\n Output.Normal = float4(0.0,1.0,0.0,1.0);\n Output.Depth = float4(0.0,0.0,1.0,1.0);\n return Output;\n }";
 
23
        const char* const ps2="void main(void)\n {\n gl_FragData[0] = vec4(1.0,1.0,1.0,1.0);\n gl_FragData[1] = vec4(0.0,1.0,0.0,1.0);\n gl_FragData[2] = vec4(0.0,0.0,1.0,1.0);\n }";
 
24
 
 
25
        // variable
 
26
        video::ITexture* gbuffer[3];
 
27
        core::array<video::IRenderTarget> gbufferlist;
 
28
        const core::dimension2du texsize(64,64);
 
29
        bool result=true;
 
30
        s32 newMaterialType = -1;
 
31
 
 
32
        if (device->getVideoDriver()->getDriverAttributes().getAttributeAsInt("MaxMultipleRenderTargets") > 2)
 
33
        {
 
34
                // allocate buffer
 
35
                gbuffer[0] = driver->addRenderTargetTexture(texsize, "rta", video::ECF_A8R8G8B8);
 
36
                gbuffer[1] = driver->addRenderTargetTexture(texsize, "rtb", video::ECF_A8R8G8B8);
 
37
                gbuffer[2] = driver->addRenderTargetTexture(texsize, "rtc", video::ECF_A8R8G8B8);
 
38
                for( u32 i = 0; i < 3; ++i )
 
39
                   gbufferlist.push_back( video::IRenderTarget(gbuffer[i]) );
 
40
 
 
41
                video::IGPUProgrammingServices* gpu = driver->getGPUProgrammingServices();
 
42
 
 
43
                if (gpu)
 
44
                {
 
45
                        newMaterialType = gpu->addHighLevelShaderMaterial(
 
46
                                0, "vertexMain", video::EVST_VS_1_1,
 
47
                                driverType==video::EDT_DIRECT3D9?ps1:ps2, "pixelMain", video::EPST_PS_1_1);
 
48
                }
 
49
        }
 
50
 
 
51
        // shader creation succeeded
 
52
        if (newMaterialType!=-1)
 
53
        {
 
54
                scene::ISceneNode* node = device->getSceneManager()->addCubeSceneNode();
 
55
                node->setMaterialType((video::E_MATERIAL_TYPE)newMaterialType);
 
56
                device->getSceneManager()->addCameraSceneNode(0, core::vector3df(0,0,-10));
 
57
 
 
58
                driver->beginScene (true, true, video::SColor (255, 200, 200, 200));
 
59
                // render
 
60
                driver->setRenderTarget( gbufferlist );
 
61
                device->getSceneManager()->drawAll();
 
62
                driver->setRenderTarget(0);
 
63
 
 
64
                // draw debug rt
 
65
                driver->draw2DImage(gbuffer[0], core::position2d<s32>(0,0));
 
66
                driver->draw2DImage(gbuffer[1], core::position2d<s32>(64,0));
 
67
                driver->draw2DImage(gbuffer[2], core::position2d<s32>(128,0)); 
 
68
 
 
69
                driver->endScene();
 
70
 
 
71
                result = takeScreenshotAndCompareAgainstReference(driver, "-mrt.png");
 
72
 
 
73
                driver->beginScene (true, true, video::SColor (255, 200, 200, 200));
 
74
                // render
 
75
                device->getSceneManager()->getActiveCamera()->setPosition(core::vector3df(0,0,-15));
 
76
                driver->setRenderTarget( gbufferlist );
 
77
                device->getSceneManager()->drawAll();
 
78
                driver->setRenderTarget(0);
 
79
 
 
80
                // draw debug rt
 
81
                driver->draw2DImage(gbuffer[0], core::position2d<s32>(0,0));
 
82
                driver->draw2DImage(gbuffer[1], core::position2d<s32>(64,0));
 
83
                driver->draw2DImage(gbuffer[2], core::position2d<s32>(128,0)); 
 
84
 
 
85
                driver->endScene();
 
86
 
 
87
                result &= takeScreenshotAndCompareAgainstReference(driver, "-mrt2.png");
 
88
        }
 
89
 
 
90
        device->closeDevice();
 
91
        device->run();
 
92
        device->drop();
 
93
 
 
94
        return result;
 
95
}
 
96
 
 
97
 
 
98
bool mrt(void)
 
99
{
 
100
        bool result = true;
 
101
 
 
102
        TestWithAllHWDrivers(testWithDriver);
 
103
 
 
104
        return result;
 
105
}