irrlicht/tests/material.cpp
cutealien 1a6d8e2913 Replace polygon offsetting in SMaterial with a new implementation.
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
2019-05-29 19:48:08 +00:00

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;
}