Commit bde7b62f authored by hybrid's avatar hybrid

Add some more tests and fix a problem with transparency in the...

Add some more tests and fix a problem with transparency in the transparent_refelction_2_layers material as found by xDan.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@3390 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 000efed8
......@@ -730,7 +730,7 @@ public:
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
}
}
......
......@@ -104,7 +104,7 @@ int main(int argumentCount, char * arguments[])
TEST(renderTargetTexture);
TEST(textureFeatures);
TEST(textureRenderStates);
TEST(transparentAlphaChannelRef);
TEST(transparentMaterials);
TEST(antiAliasing);
TEST(draw2DImage);
TEST(lights);
......
......@@ -80,6 +80,39 @@ bool testGeometryCreator(void)
result = takeScreenshotAndCompareAgainstReference(driver, "-testGeometryCreator.png", 99.999f);
}
smgr->clear();
driver->setTextureCreationFlag(video::ETCF_ALWAYS_32_BIT, true);
// add camera
scene::ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS(0,100.0f,2.0f);
camera->setPosition(core::vector3df(2000.0f,5000.f,0.0f));
camera->setTarget(core::vector3df(0.0f,0.0f,0.0f));
camera->setFarValue(20000.0f);
device->getCursorControl()->setVisible(false); // disable mouse cursor
video::IImage* colorMapImage = driver->createImageFromFile("../media/terrain-texture.jpg");
video::IImage* heightMapImage = driver->createImageFromFile("../media/terrain-heightmap.bmp");
scene::IAnimatedMesh* terrain = smgr->addTerrainMesh("TerrainMeshName", colorMapImage, heightMapImage,
core::dimension2d<f32>(40, 40), // size of a pixel
8*40); // maximum height
scene::IAnimatedMeshSceneNode* anode = smgr->addAnimatedMeshSceneNode(terrain);
if (anode)
{
anode->setMaterialFlag(video::EMF_LIGHTING, false);
anode->setPosition(core::vector3df(-5000,0,-5000));
}
driver->beginScene();
smgr->drawAll();
driver->endScene();
// This screenshot shows some mipmap problems, but this seems to be
// no fault of the mesh
result = takeScreenshotAndCompareAgainstReference(driver, "-testTerrainMesh.png", 99.999f);
device->drop();
return result;
......
......@@ -10,7 +10,7 @@ using namespace video;
//! Check that EMT_TRANSPARENT_ALPHA_CHANNEL_REF works as expected
bool testWithDriver(video::E_DRIVER_TYPE driverType)
bool testTransparentAlphaChannelRef(video::E_DRIVER_TYPE driverType)
{
IrrlichtDevice* device = createDevice(driverType, core::dimension2d<u32>(160, 120), 32);
if(!device)
......@@ -25,12 +25,12 @@ bool testWithDriver(video::E_DRIVER_TYPE driverType)
backCube->setPosition(vector3df(0, 0, 10));
backCube->setScale(vector3df(5, 5, 1));
backCube->setMaterialTexture(0, driver->getTexture("../media/wall.bmp"));
backCube->setMaterialType(video::EMT_SOLID ); //solid.....?
backCube->setMaterialType(video::EMT_SOLID);
backCube->setMaterialFlag(video::EMF_LIGHTING, false);
ISceneNode * frontCube = smgr->addCubeSceneNode();
frontCube->setMaterialTexture(0, driver->getTexture("../media/help.png"));
frontCube->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF ); //solid.....?
frontCube->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF);
frontCube->setMaterialFlag(video::EMF_LIGHTING, false);
(void)smgr->addCameraSceneNode(0, vector3df(0, 0, -15));
......@@ -47,15 +47,201 @@ bool testWithDriver(video::E_DRIVER_TYPE driverType)
}
bool transparentAlphaChannelRef(void)
//! Check that EMT_TRANSPARENT_ALPHA_CHANNEL works as expected
bool testTransparentAlphaChannel(video::E_DRIVER_TYPE driverType)
{
bool result = testWithDriver(EDT_DIRECT3D9);
result &= testWithDriver(EDT_OPENGL);
IrrlichtDevice* device = createDevice(driverType, core::dimension2d<u32>(160, 120), 32);
if(!device)
return true;
video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager* smgr = device->getSceneManager();
driver->setTextureCreationFlag(video::ETCF_ALWAYS_32_BIT, true);
ISceneNode * backCube = smgr->addCubeSceneNode();
backCube->setPosition(vector3df(0, 0, 10));
backCube->setScale(vector3df(5, 5, 1));
backCube->setMaterialTexture(0, driver->getTexture("../media/wall.bmp"));
backCube->setMaterialType(video::EMT_SOLID);
backCube->setMaterialFlag(video::EMF_LIGHTING, false);
ISceneNode * frontCube = smgr->addCubeSceneNode();
frontCube->setMaterialTexture(0, driver->getTexture("../media/help.png"));
frontCube->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL);
frontCube->setMaterialFlag(video::EMF_LIGHTING, false);
(void)smgr->addCameraSceneNode(0, vector3df(0, 0, -15));
driver->beginScene(true, true, video::SColor(255,113,113,133));
smgr->drawAll();
driver->endScene();
bool result = takeScreenshotAndCompareAgainstReference(driver, "-transparentAlphaChannel.png");
device->drop();
return result;
}
//! Check that EMT_TRANSPARENT_VERTEX_ALPHA works as expected
bool testTransparentVertexAlpha(video::E_DRIVER_TYPE driverType)
{
IrrlichtDevice* device = createDevice(driverType, core::dimension2d<u32>(160, 120), 32);
if(!device)
return true;
video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager* smgr = device->getSceneManager();
driver->setTextureCreationFlag(video::ETCF_ALWAYS_32_BIT, true);
ISceneNode * backCube = smgr->addCubeSceneNode();
backCube->setPosition(vector3df(0, 0, 10));
backCube->setScale(vector3df(5, 5, 1));
backCube->setMaterialTexture(0, driver->getTexture("../media/wall.bmp"));
// vertex color has alpha 255, hence solid
backCube->setMaterialType(video::EMT_TRANSPARENT_VERTEX_ALPHA);
backCube->setMaterialFlag(video::EMF_LIGHTING, false);
IMeshSceneNode * frontCube = smgr->addCubeSceneNode(10,0,-1,core::vector3df(-10,0,0));
frontCube->setMaterialTexture(0, driver->getTexture("../media/help.png"));
frontCube->setMaterialType(video::EMT_TRANSPARENT_VERTEX_ALPHA);
frontCube->setMaterialFlag(video::EMF_LIGHTING, false);
driver->getMeshManipulator()->setVertexColorAlpha(frontCube->getMesh(), 128);
frontCube = smgr->addCubeSceneNode(10,0,-1,core::vector3df(10,0,0));
frontCube->setMaterialTexture(0, driver->getTexture("../media/help.png"));
frontCube->setMaterialType(video::EMT_TRANSPARENT_VERTEX_ALPHA);
frontCube->setMaterialFlag(video::EMF_LIGHTING, false);
driver->getMeshManipulator()->setVertexColorAlpha(frontCube->getMesh(), 1);
(void)smgr->addCameraSceneNode(0, vector3df(0, 0, -15));
driver->beginScene(true, true, video::SColor(255,113,113,133));
smgr->drawAll();
driver->endScene();
bool result = takeScreenshotAndCompareAgainstReference(driver, "-transparentVertexAlpha.png");
device->drop();
return result;
}
//! Check that EMT_TRANSPARENT_REFLECTION_2_LAYER works as expected
bool testTransparentReflection2Layer(video::E_DRIVER_TYPE driverType)
{
IrrlichtDevice* device = createDevice(driverType, core::dimension2d<u32>(160, 120), 32);
if(!device)
return true;
video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager* smgr = device->getSceneManager();
driver->setTextureCreationFlag(video::ETCF_ALWAYS_32_BIT, true);
ISceneNode * backCube = smgr->addCubeSceneNode();
backCube->setPosition(vector3df(0, 0, 10));
backCube->setScale(vector3df(5, 5, 1));
backCube->setMaterialTexture(0, driver->getTexture("../media/wall.bmp"));
backCube->setMaterialTexture(1, driver->getTexture("../media/water.jpg"));
// vertex color has alpha 255, hence solid
backCube->setMaterialType(video::EMT_TRANSPARENT_REFLECTION_2_LAYER);
backCube->setMaterialFlag(video::EMF_LIGHTING, false);
IMeshSceneNode * frontCube = smgr->addCubeSceneNode(10,0,-1,core::vector3df(-10,0,0));
frontCube->setMaterialTexture(0, driver->getTexture("../media/help.png"));
frontCube->setMaterialTexture(1, driver->getTexture("../media/water.jpg"));
frontCube->setMaterialType(video::EMT_TRANSPARENT_REFLECTION_2_LAYER);
frontCube->setMaterialFlag(video::EMF_LIGHTING, false);
driver->getMeshManipulator()->setVertexColorAlpha(frontCube->getMesh(), 128);
frontCube = smgr->addCubeSceneNode(10,0,-1,core::vector3df(10,0,0));
frontCube->setMaterialTexture(0, driver->getTexture("../media/help.png"));
frontCube->setMaterialTexture(1, driver->getTexture("../media/water.jpg"));
frontCube->setMaterialType(video::EMT_TRANSPARENT_REFLECTION_2_LAYER);
frontCube->setMaterialFlag(video::EMF_LIGHTING, false);
driver->getMeshManipulator()->setVertexColorAlpha(frontCube->getMesh(), 45);
(void)smgr->addCameraSceneNode(0, vector3df(0, 0, -15));
driver->beginScene(true, true, video::SColor(255,113,113,133));
smgr->drawAll();
driver->endScene();
bool result = takeScreenshotAndCompareAgainstReference(driver, "-transparentReflection2Layer.png");
device->drop();
return result;
}
//! Check that EMT_TRANSPARENT_ADD_COLOR works as expected
bool testTransparentAddColor(video::E_DRIVER_TYPE driverType)
{
IrrlichtDevice* device = createDevice(driverType, core::dimension2d<u32>(160, 120), 32);
if(!device)
return true;
video::IVideoDriver* driver = device->getVideoDriver();
scene::ISceneManager* smgr = device->getSceneManager();
driver->setTextureCreationFlag(video::ETCF_ALWAYS_32_BIT, true);
ISceneNode * backCube = smgr->addCubeSceneNode();
backCube->setPosition(vector3df(0, 0, 10));
backCube->setScale(vector3df(5, 5, 1));
backCube->setMaterialTexture(0, driver->getTexture("../media/wall.bmp"));
backCube->setMaterialType(video::EMT_SOLID);
backCube->setMaterialFlag(video::EMF_LIGHTING, false);
IMeshSceneNode * frontCube = smgr->addCubeSceneNode();
frontCube->setMaterialTexture(0, driver->getTexture("../media/help.png"));
frontCube->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR);
frontCube->setMaterialFlag(video::EMF_LIGHTING, false);
(void)smgr->addCameraSceneNode(0, vector3df(0, 0, -15));
driver->beginScene(true, true, video::SColor(255,113,113,133));
smgr->drawAll();
driver->endScene();
bool result = takeScreenshotAndCompareAgainstReference(driver, "-transparentAddColor.png");
device->drop();
return result;
}
bool transparentMaterials(void)
{
bool result = testTransparentAlphaChannel(EDT_DIRECT3D9);
result &= testTransparentAlphaChannel(EDT_OPENGL);
result &= testTransparentAlphaChannel(EDT_BURNINGSVIDEO);
result &= testTransparentAlphaChannelRef(EDT_DIRECT3D9);
result &= testTransparentAlphaChannelRef(EDT_OPENGL);
// FIXME Rogerborg 8-January-2009. Burning's video currently produces unexpected results,
// blending using the full alpha value instead of using a boolean mask. This test is being
// added now anyway to help verify the fix when it's done; it should just require an
// update of the reference image.
result &= testWithDriver(EDT_BURNINGSVIDEO);
result &= testTransparentAlphaChannelRef(EDT_BURNINGSVIDEO);
result &= testTransparentVertexAlpha(EDT_DIRECT3D9);
result &= testTransparentVertexAlpha(EDT_OPENGL);
// This type seems to be broken as well for Burning's video.
result &= testTransparentVertexAlpha(EDT_BURNINGSVIDEO);
result &= testTransparentAddColor(EDT_DIRECT3D9);
result &= testTransparentAddColor(EDT_OPENGL);
result &= testTransparentAddColor(EDT_BURNINGSVIDEO);
result &= testTransparentReflection2Layer(EDT_DIRECT3D9);
result &= testTransparentReflection2Layer(EDT_OPENGL);
result &= testTransparentReflection2Layer(EDT_BURNINGSVIDEO);
return result;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment