Deprecate PolygonOffsetFactor and PolygonOffsetDirection in SMaterial. Replace it by PolygonOffsetDepthBias and PolygonOffsetSlopeScale. Old values still work for now (as well as they did), but will be removed after Irrlicht 1.9. The old implementation was based a lot on the way Direct3D8 had worked. - We only had values -1 and 1 for the slope bias before, but sometimes other values are necessary. - An int value for PolygonOffsetFactor couldn't worked for Direct3D9 which (unlike D3D8) uses a value range of -1 to 1. Thx @ Criss and devsh for implementing some code which showed that different slope scaling is sometimes needed. git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@5817 dfc29bdd-3216-0410-991c-e03cc46cb475
80 lines
2.5 KiB
C++
80 lines
2.5 KiB
C++
#include "testUtils.h"
|
|
|
|
using namespace irr;
|
|
|
|
static bool polygonOffset(video::E_DRIVER_TYPE type)
|
|
{
|
|
IrrlichtDevice* device = createDevice(type, core::dimension2d<u32>(160, 120));
|
|
|
|
if (device == 0)
|
|
return true;
|
|
|
|
video::IVideoDriver* driver = device->getVideoDriver();
|
|
if (!driver->queryFeature(video::EVDF_POLYGON_OFFSET))
|
|
{
|
|
device->closeDevice();
|
|
device->run();
|
|
device->drop();
|
|
return true;
|
|
}
|
|
|
|
stabilizeScreenBackground(driver);
|
|
|
|
scene::ISceneManager* smgr = device->getSceneManager();
|
|
|
|
// create first plane
|
|
scene::ISceneNode* plane = smgr->addMeshSceneNode(smgr->addHillPlaneMesh(
|
|
"plane", core::dimension2df(10,10), core::dimension2du(2,2)), 0, -1,
|
|
core::vector3df(0,0,20), core::vector3df(270,0,0));
|
|
|
|
if (plane)
|
|
{
|
|
plane->setMaterialTexture(0, driver->getTexture("../media/t351sml.jpg"));
|
|
plane->setMaterialFlag(video::EMF_LIGHTING, false);
|
|
plane->setMaterialFlag(video::EMF_BACK_FACE_CULLING, true);
|
|
}
|
|
|
|
// create second plane exactly on top of the first one
|
|
scene::ISceneNode* plane2 = smgr->addMeshSceneNode(smgr->addHillPlaneMesh(
|
|
"plane2", core::dimension2df(5,5), core::dimension2du(2,2)), 0, -1,
|
|
core::vector3df(0,0,20), core::vector3df(270,0,0));
|
|
plane2->setMaterialFlag(video::EMF_BACK_FACE_CULLING, false);
|
|
|
|
smgr->addCameraSceneNode();
|
|
|
|
// test back plane to back
|
|
plane->getMaterial(0).PolygonOffsetSlopeScale = 1.f;
|
|
plane->getMaterial(0).PolygonOffsetDepthBias = 1.f;
|
|
if ( type == video::EDT_DIRECT3D9 )
|
|
plane->getMaterial(0).PolygonOffsetDepthBias *= 2.f*4.8e-7f;
|
|
|
|
driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(255,113,113,133));
|
|
smgr->drawAll();
|
|
driver->endScene();
|
|
bool result = takeScreenshotAndCompareAgainstReference(driver, "-polygonBack.png");
|
|
|
|
//reset back plane
|
|
plane->getMaterial(0).PolygonOffsetDepthBias=0;
|
|
// test front plane to front
|
|
plane2->getMaterial(0).PolygonOffsetSlopeScale=-1.f;
|
|
plane2->getMaterial(0).PolygonOffsetDepthBias=-1.f;
|
|
if ( type == video::EDT_DIRECT3D9 )
|
|
plane2->getMaterial(0).PolygonOffsetDepthBias *= 2.f*4.8e-7f;
|
|
driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, video::SColor(255,113,113,133));
|
|
smgr->drawAll();
|
|
driver->endScene();
|
|
result &= takeScreenshotAndCompareAgainstReference(driver, "-polygonFront.png");
|
|
|
|
device->closeDevice();
|
|
device->run();
|
|
device->drop();
|
|
return result;
|
|
}
|
|
|
|
bool material()
|
|
{
|
|
bool result = true;
|
|
TestWithAllDrivers(polygonOffset);
|
|
return result;
|
|
}
|