1 #include "testUtils.h"
\r
8 // this test renders random point clouds using different primitives on top
\r
9 // tests the primitives type support in general and can hint to differences
\r
10 // between the drivers
\r
11 bool testWithDriver(video::E_DRIVER_TYPE driverType)
\r
13 IrrlichtDevice *device =
\r
14 createDevice(driverType, core::dimension2du(160, 120));
\r
18 scene::ISceneManager* smgr = device->getSceneManager();
\r
19 video::IVideoDriver* driver = device->getVideoDriver();
\r
21 stabilizeScreenBackground(driver);
\r
23 logTestString("Testing driver %ls\n", driver->getName());
\r
25 smgr->addCameraSceneNode(0, core::vector3df(128,128,-100), core::vector3df(128,128,128));
\r
27 scene::SMeshBuffer Buffer;
\r
29 Buffer.Material.Wireframe = false;
\r
30 Buffer.Material.Lighting = false;
\r
31 Buffer.Material.FogEnable = false;
\r
32 Buffer.Material.BackfaceCulling = false;
\r
33 Buffer.Material.MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA;
\r
35 device->getRandomizer()->reset();
\r
36 const u32 points=256;
\r
37 Buffer.Vertices.reallocate(points);
\r
38 for (u32 i=0; i<points; ++i)
\r
40 f32 x = (f32)(1+device->getRandomizer()->rand()%points);
\r
41 f32 y = (f32)(1+device->getRandomizer()->rand()%points);
\r
42 f32 z = (f32)(1+device->getRandomizer()->rand()%points);
\r
43 video::SColor color(255, device->getRandomizer()->rand()%255, device->getRandomizer()->rand()%255, device->getRandomizer()->rand()%255);
\r
44 Buffer.Vertices.push_back( video::S3DVertex(x,y,z,0,1,0,color,0,0) );
\r
46 Buffer.recalculateBoundingBox();
\r
47 for (u32 i=0; i<Buffer.Vertices.size(); ++i)
\r
49 Buffer.Indices.push_back(i);
\r
53 for (u32 Type=scene::EPT_POINTS; Type <= scene::EPT_POINT_SPRITES; ++Type)
\r
55 driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(255,100,101,140));
\r
60 case scene::EPT_POINTS: primCount = Buffer.Indices.size(); break;
\r
61 case scene::EPT_LINE_STRIP: primCount = Buffer.Indices.size()-1; break;
\r
62 case scene::EPT_LINE_LOOP: primCount = Buffer.Indices.size()-1; break;
\r
63 case scene::EPT_LINES: primCount = Buffer.Indices.size()/2; break;
\r
64 case scene::EPT_TRIANGLE_STRIP: primCount = Buffer.Indices.size()-2; break;
\r
65 case scene::EPT_TRIANGLE_FAN: primCount = Buffer.Indices.size()-2; break;
\r
66 case scene::EPT_TRIANGLES: primCount = Buffer.Indices.size()/3; break;
\r
67 case scene::EPT_QUAD_STRIP: primCount = (Buffer.Indices.size()-2)/4; break;
\r
68 case scene::EPT_QUADS: primCount = Buffer.Indices.size()/4; break;
\r
69 case scene::EPT_POLYGON: primCount = Buffer.Indices.size()-1; break;
\r
70 case scene::EPT_POINT_SPRITES: primCount = Buffer.Indices.size(); break;
\r
74 // TODO: mode is buggy, but required for skybox. So driver supports it, but would core dump here.
\r
75 if (driverType==video::EDT_BURNINGSVIDEO && Type==scene::EPT_TRIANGLE_FAN)
\r
77 driver->setMaterial(Buffer.Material);
\r
78 driver->setTransform(video::ETS_WORLD, core::IdentityMatrix);
\r
79 driver->drawVertexPrimitiveList(Buffer.getVertices(),
\r
80 Buffer.getVertexCount(), Buffer.getIndices(), primCount,
\r
81 video::EVT_STANDARD, (scene::E_PRIMITIVE_TYPE)Type,
\r
84 core::stringc name = "-drawVPL_";
\r
85 // we use character enumeration as we have more than 9 types
\r
86 name.append(Type-scene::EPT_POINTS+'a');
\r
87 name.append(".png");
\r
88 result &= takeScreenshotAndCompareAgainstReference(driver, name.c_str(), 99.5f);
\r
91 device->closeDevice();
\r
99 bool drawVertexPrimitive(void)
\r
101 bool result = true;
\r
102 TestWithAllDrivers(testWithDriver);
\r