]> git.lizzy.rs Git - irrlicht.git/blob - tests/drawVertexPrimitive.cpp
Remove bundled libraries
[irrlicht.git] / tests / drawVertexPrimitive.cpp
1 #include "testUtils.h"\r
2 \r
3 using namespace irr;\r
4 \r
5 namespace\r
6 {\r
7 \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
12 {\r
13         IrrlichtDevice *device =\r
14                 createDevice(driverType, core::dimension2du(160, 120));\r
15         if (!device)\r
16                 return true;\r
17         \r
18         scene::ISceneManager* smgr = device->getSceneManager();\r
19         video::IVideoDriver* driver = device->getVideoDriver();\r
20 \r
21         stabilizeScreenBackground(driver);\r
22 \r
23         logTestString("Testing driver %ls\n", driver->getName());\r
24 \r
25         smgr->addCameraSceneNode(0, core::vector3df(128,128,-100), core::vector3df(128,128,128));\r
26 \r
27         scene::SMeshBuffer Buffer;\r
28 \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
34 \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
39         {\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
45         }\r
46         Buffer.recalculateBoundingBox();\r
47         for (u32 i=0; i<Buffer.Vertices.size(); ++i)\r
48         {\r
49                 Buffer.Indices.push_back(i);\r
50         }\r
51 \r
52         bool result = true;\r
53         for (u32 Type=scene::EPT_POINTS; Type <= scene::EPT_POINT_SPRITES; ++Type)\r
54         {\r
55                 driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(255,100,101,140));\r
56                 smgr->drawAll();\r
57                 u32 primCount = 0;\r
58                 switch (Type)\r
59                 {\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
71                         default: break;\r
72                 }\r
73  \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
76                         continue;\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
82                                         video::EIT_16BIT);\r
83                 driver->endScene();\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
89         }\r
90 \r
91         device->closeDevice();\r
92         device->run();\r
93         device->drop();\r
94 \r
95         return result ;\r
96 }\r
97 }\r
98 \r
99 bool drawVertexPrimitive(void)\r
100 {\r
101         bool result = true;\r
102         TestWithAllDrivers(testWithDriver);\r
103         return result;\r
104 }\r