1
// Copyright (C) 2008-2011 Christian Stehno, Colin MacDonald
2
// No rights reserved: this software is in the public domain.
9
static bool manyTextures(video::E_DRIVER_TYPE driverType)
11
IrrlichtDevice *device = createDevice(driverType, dimension2d<u32>(160, 120), 32);
13
return true; // Treat a failure to create a driver as benign; this saves a lot of #ifdefs
15
video::IVideoDriver* driver = device->getVideoDriver();
16
scene::ISceneManager * smgr = device->getSceneManager();
18
logTestString("Testing driver %ls\n", driver->getName());
20
(void)smgr->addCameraSceneNode();
22
scene::SMeshBufferLightMap* mesh = new scene::SMeshBufferLightMap;
24
mesh->Vertices.reallocate(4);
25
mesh->Indices.reallocate(6);
27
mesh->Vertices.push_back(video::S3DVertex2TCoords(-50,50,80,irr::video::SColor(255,100,100,100),0,1,0,1));
28
mesh->Vertices.push_back(video::S3DVertex2TCoords(50,50,80,irr::video::SColor(255,100,100,100),1,1,1,1));
29
mesh->Vertices.push_back(video::S3DVertex2TCoords(50,-50,80,irr::video::SColor(255,100,100,100),1,0,1,0));
30
mesh->Vertices.push_back(video::S3DVertex2TCoords(-50,-50,80,irr::video::SColor(255,100,100,100),0,0,0,0));
32
mesh->Indices.push_back(0);
33
mesh->Indices.push_back(1);
34
mesh->Indices.push_back(2);
35
mesh->Indices.push_back(2);
36
mesh->Indices.push_back(3);
37
mesh->Indices.push_back(0);
39
video::SMaterial& mat = mesh->getMaterial();
41
mat.setTexture(0,driver->getTexture("../media/fire.bmp"));
42
mat.setTexture(1,driver->getTexture("../media/fire.bmp"));
43
mat.setTexture(2,driver->getTexture("../media/fire.bmp"));
44
mat.setTexture(3,driver->getTexture("../media/fire.bmp"));
48
driver->beginScene(true, true, video::SColor(255,100,101,140));
52
driver->setMaterial(mat);
53
driver->drawMeshBuffer(mesh);
57
bool result = takeScreenshotAndCompareAgainstReference(driver, "-multiTexture.png", 99.31f);
59
device->closeDevice();
66
//! Tests interleaved loading and rendering of textures
67
/** The test loads a texture, renders it using draw2dimage, loads another
68
texture and renders the first one again. Due to the texture cache this
69
can lead to rendering of the second texture in second place. */
70
static bool renderAndLoad(video::E_DRIVER_TYPE driverType)
72
IrrlichtDevice *device = createDevice( driverType, dimension2d<u32>(160, 120), 32);
74
return true; // Treat a failure to create a driver as benign; this saves a lot of #ifdefs
76
video::IVideoDriver* driver = device->getVideoDriver();
77
scene::ISceneManager * smgr = device->getSceneManager();
79
logTestString("Testing driver %ls\n", driver->getName());
81
video::ITexture* tex1 = driver->getTexture("../media/wall.bmp");
83
(void)smgr->addCameraSceneNode();
85
driver->beginScene(true, true, video::SColor(255,100,101,140));
86
driver->draw2DImage(tex1, position2di(0,0));
89
driver->getTexture("../media/tools.png");
91
driver->beginScene(true, true, video::SColor(255,100,101,140));
92
driver->draw2DImage(tex1, position2di(0,0));
95
bool result = takeScreenshotAndCompareAgainstReference(driver, "-textureRenderStates.png", 99.85f);
97
device->closeDevice();
105
// This test would cause a crash if it does not work
106
// in 1.5.1 and 1.6 an illegal access in the OpenGL driver caused this
107
static bool renderAndRemove(video::E_DRIVER_TYPE driverType)
109
IrrlichtDevice *device = createDevice( driverType, dimension2d<u32>(160, 120), 32);
111
return true; // Treat a failure to create a driver as benign; this saves a lot of #ifdefs
113
video::IVideoDriver* driver = device->getVideoDriver();
114
scene::ISceneManager * smgr = device->getSceneManager();
116
logTestString("Testing driver %ls\n", driver->getName());
118
driver->beginScene (true, true, video::SColor(255, 0, 255, 0));
122
smgr->addCameraSceneNode();
123
video::ITexture* texture = driver->getTexture ("media/tools.png");
124
scene::ISceneNode * img = smgr->addCubeSceneNode();
125
img->setMaterialTexture(0, texture);
127
driver->beginScene (true, true, video::SColor (255, 0, 255, 0));
131
smgr->clear(); // Remove anything that used the texture
132
driver->removeTexture(texture);
134
driver->beginScene(true, true, video::SColor(255,100,101,140));
138
smgr->addCameraSceneNode();
139
texture = driver->getTexture("media/tools.png");
140
img = smgr->addCubeSceneNode();
141
img->setMaterialTexture(0, texture);
143
driver->beginScene (true, true, irr::video::SColor (255, 0, 255, 0));
147
device->closeDevice();
155
static bool testTextureMatrixInMixedScenes(video::E_DRIVER_TYPE driverType)
157
irr::IrrlichtDevice* device = createDevice(driverType, dimension2du(160,120));
161
video::IVideoDriver* driver = device->getVideoDriver();
162
scene::ISceneManager* sceneManager = device->getSceneManager();
163
gui::IGUIEnvironment* gui = device->getGUIEnvironment();
165
if (!driver->queryFeature(video::EVDF_TEXTURE_MATRIX))
167
device->closeDevice();
173
logTestString("Testing driver %ls\n", driver->getName());
175
scene::ICameraSceneNode* camera = sceneManager->addCameraSceneNode();
176
camera->setPosition(vector3df(0,10,0));
178
gui::IGUIStaticText* stext = gui->addStaticText(L" ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 ",
179
rect<s32>(5,100,150,125),false,false,0,false);
180
stext->setBackgroundColor(video::SColor(255,128,0,0));
181
stext->setOverrideColor(video::SColor(255,255,255,255));
183
gui->addEditBox(L"Test edit box", rect<s32>(5,50,150,75));
185
gui->addCheckBox(true, rect<s32>(5, 20, 150, 45),0,-1,L"Test CheckBox");
187
video::SMaterial mat;
188
mat.MaterialType = video::EMT_SOLID;
189
mat.setFlag(video::EMF_LIGHTING, false);
190
// problem doesn't occur if the scale defaults: (1.f,1.f).
191
mat.getTextureMatrix(0).setTextureScale(2.0,2.0);
193
scene::IAnimatedMesh* pmesh = sceneManager->addHillPlaneMesh("testMesh",dimension2d<f32>(50,50),dimension2d<u32>(6,6),&mat);
194
sceneManager->addAnimatedMeshSceneNode(pmesh);
196
driver->beginScene(true, true, video::SColor(255,100,101,140));
197
sceneManager->drawAll();
201
bool result = takeScreenshotAndCompareAgainstReference(driver, "-textureMatrixInMixedScenes.png", 99.34f);
203
device->closeDevice();
210
// animated texture matrix test.
211
static bool textureMatrix(video::E_DRIVER_TYPE driverType)
213
irr::IrrlichtDevice* device = createDevice(driverType, dimension2du(160,120));
217
video::IVideoDriver* driver = device->getVideoDriver();
218
scene::ISceneManager* sceneManager = device->getSceneManager();
220
if (!driver->queryFeature(video::EVDF_TEXTURE_MATRIX))
222
device->closeDevice();
228
logTestString("Testing driver %ls\n", driver->getName());
230
scene::ICameraSceneNode* camera = sceneManager->addCameraSceneNode();
231
camera->setPosition(vector3df(0,0,-10));
233
// set up plane mesh to face the camera
234
scene::IMesh* mesh = sceneManager->getGeometryCreator()->createPlaneMesh(dimension2df(150,150), core::dimension2du(1,1),0,core::dimension2df(1,1));
235
scene::IMeshSceneNode* node = sceneManager->addMeshSceneNode(mesh, 0, -1, vector3df(0, 0, 150), vector3df(-90, 0, 0));
239
// set the hillplane material texture & save a reference
240
// to the texture matrix.
241
video::SMaterial& material = node->getMaterial(0);
242
video::ITexture* tex = driver->getTexture("../media/water.jpg");
244
material.setTexture(0,tex);
245
material.setFlag(video::EMF_LIGHTING,false);
246
matrix4& textureMatrix = material.TextureLayer[0].getTextureMatrix();
248
const vector2df rcenter, scale(1.f, 1.f);
252
textureMatrix.buildTextureTransform(0.f, rcenter, trans, scale);
254
driver->beginScene(true, true, video::SColor(255,100,101,140));
255
sceneManager->drawAll();
258
bool result = takeScreenshotAndCompareAgainstReference(driver, "-textureMatrix.png");
261
textureMatrix.buildTextureTransform(0.f, rcenter, trans, scale);
263
driver->beginScene(true, true, video::SColor(255,100,101,140));
264
sceneManager->drawAll();
267
result &= takeScreenshotAndCompareAgainstReference(driver, "-textureMatrix2.png");
269
device->closeDevice();
276
bool textureRenderStates(void)
280
TestWithAllDrivers(renderAndLoad);
281
TestWithAllDrivers(renderAndRemove);
282
TestWithAllDrivers(testTextureMatrixInMixedScenes);
283
TestWithAllDrivers(manyTextures);
284
TestWithAllDrivers(textureMatrix);