From 202977fe385c3b6d82a9663b3ed0448908ddab31 Mon Sep 17 00:00:00 2001 From: cutealien Date: Thu, 17 Jan 2019 23:15:56 +0000 Subject: [PATCH] Merging r5679 through r5685 from trunk to ogl-es branch - Fix several problems with SMaterial serialization. - SMaterial.ZWriteFineControl only using 1 bit now. - Remove compile warnings. - Switch Irrlicht to 8 textures per Material as default by increasing value of _IRR_MATERIAL_MAX_TEXTURES_. git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/branches/ogl-es@5686 dfc29bdd-3216-0410-991c-e03cc46cb475 --- changes.txt | 4 ++ include/IrrCompileConfig.h | 2 +- include/SMaterial.h | 3 +- include/SMaterialLayer.h | 1 + source/Irrlicht/CIrrDeviceWin32.cpp | 2 +- source/Irrlicht/CIrrMeshFileLoader.cpp | 2 + source/Irrlicht/CNullDriver.cpp | 87 +++++++++++++------------ tests/media/scene.irr | Bin 42352 -> 65720 bytes tests/media/scene2.irr | Bin 14146 -> 21886 bytes tests/testUtils.cpp | 4 ++ tests/tests-last-passed-at.txt | 2 +- 11 files changed, 61 insertions(+), 46 deletions(-) diff --git a/changes.txt b/changes.txt index 4cead245..1ea822aa 100644 --- a/changes.txt +++ b/changes.txt @@ -9,6 +9,10 @@ Changes in ogl-es (not yet released - will be merged with trunk at some point) -------------------------- Changes in 1.9 (not yet released) +- _IRR_MATERIAL_MAX_TEXTURES_ now set to 8 by default. So we can use now 8 textures per material without recompiling the engine. + Additionally there's a new global variable irr::video::MATERIAL_MAX_TEXTURES_USED which can be set to lower numbers to avoid most of the costs coming with this for people not needing more textures. + But using more textures via _IRR_MATERIAL_MAX_TEXTURES_ also has become less calculation intensive than it was in the past, so in release builds the difference is hardly noticeable. +- Serialization fixes for materials in irr format (in IVideoDriver::createAttributesFromMaterial/fillMaterialStructureFromAttributes). - Add serialization for ToolTip to IGUIElement. Thanks @chronologicaldot for patch (http://irrlicht.sourceforge.net/forum/viewtopic.php?f=2&t=52374) - Try recovering lost device in D3D9 for 3 seconds when device reset fails after resizing Window. - Add typedefs like value_type and size_type to array, list and map like std containers have. Thanks @SLC for idea (http://irrlicht.sourceforge.net/forum/viewtopic.php?f=1&t=52363) diff --git a/include/IrrCompileConfig.h b/include/IrrCompileConfig.h index 0de411bf..9257875c 100644 --- a/include/IrrCompileConfig.h +++ b/include/IrrCompileConfig.h @@ -147,7 +147,7 @@ //! Maximum number of texture an SMaterial can have, up to 8 are supported by Irrlicht. -#define _IRR_MATERIAL_MAX_TEXTURES_ 4 +#define _IRR_MATERIAL_MAX_TEXTURES_ 8 //! Whether to support XML and XML-based formats (irrmesh, collada...) #define _IRR_COMPILE_WITH_XML_ diff --git a/include/SMaterial.h b/include/SMaterial.h index 4a47728b..567b4598 100644 --- a/include/SMaterial.h +++ b/include/SMaterial.h @@ -282,6 +282,7 @@ namespace video IRRLICHT_API extern u32 MATERIAL_MAX_TEXTURES_USED; //! Struct for holding parameters for a material renderer + // Note for implementors: Serialization is in CNullDriver class SMaterial { public: @@ -510,7 +511,7 @@ namespace video //! Give more control how the ZWriteEnable flag is interpreted /** Note that there is also the global flag AllowZWriteOnTransparent which when set acts like all materials have set EZI_ALLOW_ON_TRANSPARENT. */ - E_ZWRITE_FINE_CONTROL ZWriteFineControl; + E_ZWRITE_FINE_CONTROL ZWriteFineControl:1; //! Gets the texture transformation matrix for level i /** \param i The desired level. Must not be larger than MATERIAL_MAX_TEXTURES diff --git a/include/SMaterialLayer.h b/include/SMaterialLayer.h index 15af753b..2ef72c82 100644 --- a/include/SMaterialLayer.h +++ b/include/SMaterialLayer.h @@ -45,6 +45,7 @@ namespace video "texture_clamp_mirror_clamp_to_border", 0}; //! Struct for holding material parameters which exist per texture layer + // Note for implementors: Serialization is in CNullDriver class SMaterialLayer { public: diff --git a/source/Irrlicht/CIrrDeviceWin32.cpp b/source/Irrlicht/CIrrDeviceWin32.cpp index 959da36f..c242e187 100644 --- a/source/Irrlicht/CIrrDeviceWin32.cpp +++ b/source/Irrlicht/CIrrDeviceWin32.cpp @@ -2022,7 +2022,7 @@ bool CIrrDeviceWin32::isWindowsVistaOrGreater() return false; } - return VerifyVersionInfo(&osvi, VER_MAJORVERSION, VerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL)); + return VerifyVersionInfo(&osvi, VER_MAJORVERSION, VerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL)) ? true : false; #else return false; #endif diff --git a/source/Irrlicht/CIrrMeshFileLoader.cpp b/source/Irrlicht/CIrrMeshFileLoader.cpp index 6478aaf7..f92b2dc8 100644 --- a/source/Irrlicht/CIrrMeshFileLoader.cpp +++ b/source/Irrlicht/CIrrMeshFileLoader.cpp @@ -171,6 +171,8 @@ IMeshBuffer* CIrrMeshFileLoader::readMeshBuffer(io::IXMLReader* reader) { //we've got a material + material = video::SMaterial(); // reset + io::IAttributes* attributes = FileSystem->createEmptyAttributes(SceneManager->getVideoDriver()); attributes->read(reader, true, L"material"); diff --git a/source/Irrlicht/CNullDriver.cpp b/source/Irrlicht/CNullDriver.cpp index f45ed074..61b19f1e 100644 --- a/source/Irrlicht/CNullDriver.cpp +++ b/source/Irrlicht/CNullDriver.cpp @@ -2140,22 +2140,27 @@ io::IAttributes* CNullDriver::createAttributesFromMaterial(const video::SMateria attr->addFloat("Shininess", material.Shininess); attr->addFloat("Param1", material.MaterialTypeParam); attr->addFloat("Param2", material.MaterialTypeParam2); + attr->addFloat("Thickness", material.Thickness); core::stringc prefix="Texture"; u32 i; for (i=0; iFlags&io::EARWF_USE_RELATIVE_PATHS) && options->Filename && material.getTexture(i)) + video::ITexture* texture = material.getTexture(i); + if (options && (options->Flags&io::EARWF_USE_RELATIVE_PATHS) && options->Filename && texture) { io::path path = FileSystem->getRelativeFilename( FileSystem->getAbsolutePath(material.getTexture(i)->getName()), options->Filename); attr->addTexture((prefix+core::stringc(i+1)).c_str(), material.getTexture(i), path); } else - attr->addTexture((prefix+core::stringc(i+1)).c_str(), material.getTexture(i)); + { + attr->addTexture((prefix+core::stringc(i+1)).c_str(), texture); + } } attr->addBool("Wireframe", material.Wireframe); + attr->addBool("PointCloud", material.PointCloud); attr->addBool("GouraudShading", material.GouraudShading); attr->addBool("Lighting", material.Lighting); attr->addBool("ZWriteEnable", material.ZWriteEnable); @@ -2168,9 +2173,13 @@ io::IAttributes* CNullDriver::createAttributesFromMaterial(const video::SMateria attr->addInt("AntiAliasing", material.AntiAliasing); attr->addInt("ColorMask", material.ColorMask); attr->addInt("ColorMaterial", material.ColorMaterial); + attr->addInt("BlendOperation", material.BlendOperation); + attr->addFloat("BlendFactor", material.BlendFactor); attr->addInt("PolygonOffsetFactor", material.PolygonOffsetFactor); attr->addEnum("PolygonOffsetDirection", material.PolygonOffsetDirection, video::PolygonOffsetDirectionNames); + attr->addInt("ZWriteFineControl", material.ZWriteFineControl); + // TODO: Would be nice to have a flag that only serializes rest of texture data when a texture pointer exists. prefix = "BilinearFilter"; for (i=0; iaddBool((prefix+core::stringc(i+1)).c_str(), material.TextureLayer[i].BilinearFilter); @@ -2213,63 +2222,60 @@ void CNullDriver::fillMaterialStructureFromAttributes(video::SMaterial& outMater break; } - outMaterial.AmbientColor = attr->getAttributeAsColor("Ambient"); - outMaterial.DiffuseColor = attr->getAttributeAsColor("Diffuse"); - outMaterial.EmissiveColor = attr->getAttributeAsColor("Emissive"); - outMaterial.SpecularColor = attr->getAttributeAsColor("Specular"); + outMaterial.AmbientColor = attr->getAttributeAsColor("Ambient", outMaterial.AmbientColor); + outMaterial.DiffuseColor = attr->getAttributeAsColor("Diffuse", outMaterial.DiffuseColor); + outMaterial.EmissiveColor = attr->getAttributeAsColor("Emissive", outMaterial.EmissiveColor); + outMaterial.SpecularColor = attr->getAttributeAsColor("Specular", outMaterial.SpecularColor); - outMaterial.Shininess = attr->getAttributeAsFloat("Shininess"); - outMaterial.MaterialTypeParam = attr->getAttributeAsFloat("Param1"); - outMaterial.MaterialTypeParam2 = attr->getAttributeAsFloat("Param2"); + outMaterial.Shininess = attr->getAttributeAsFloat("Shininess", outMaterial.Shininess); + outMaterial.MaterialTypeParam = attr->getAttributeAsFloat("Param1", outMaterial.MaterialTypeParam); + outMaterial.MaterialTypeParam2 = attr->getAttributeAsFloat("Param2", outMaterial.MaterialTypeParam2); + outMaterial.Thickness = attr->getAttributeAsFloat("Thickness", outMaterial.Thickness); core::stringc prefix="Texture"; for (i=0; igetAttributeAsTexture((prefix+core::stringc(i+1)).c_str())); - outMaterial.Wireframe = attr->getAttributeAsBool("Wireframe"); - outMaterial.GouraudShading = attr->getAttributeAsBool("GouraudShading"); - outMaterial.Lighting = attr->getAttributeAsBool("Lighting"); - outMaterial.ZWriteEnable = attr->getAttributeAsBool("ZWriteEnable"); - outMaterial.ZBuffer = (u8)attr->getAttributeAsInt("ZBuffer"); - outMaterial.BackfaceCulling = attr->getAttributeAsBool("BackfaceCulling"); - outMaterial.FrontfaceCulling = attr->getAttributeAsBool("FrontfaceCulling"); - outMaterial.FogEnable = attr->getAttributeAsBool("FogEnable"); - outMaterial.NormalizeNormals = attr->getAttributeAsBool("NormalizeNormals"); - if (attr->existsAttribute("UseMipMaps")) // legacy - outMaterial.UseMipMaps = attr->getAttributeAsBool("UseMipMaps"); - else - outMaterial.UseMipMaps = true; + outMaterial.Wireframe = attr->getAttributeAsBool("Wireframe", outMaterial.Wireframe); + outMaterial.PointCloud = attr->getAttributeAsBool("PointCloud", outMaterial.PointCloud); + outMaterial.GouraudShading = attr->getAttributeAsBool("GouraudShading", outMaterial.GouraudShading); + outMaterial.Lighting = attr->getAttributeAsBool("Lighting", outMaterial.Lighting); + outMaterial.ZWriteEnable = attr->getAttributeAsBool("ZWriteEnable", outMaterial.ZWriteEnable); + outMaterial.ZBuffer = (u8)attr->getAttributeAsInt("ZBuffer", outMaterial.ZBuffer); + outMaterial.BackfaceCulling = attr->getAttributeAsBool("BackfaceCulling", outMaterial.BackfaceCulling); + outMaterial.FrontfaceCulling = attr->getAttributeAsBool("FrontfaceCulling", outMaterial.FrontfaceCulling); + outMaterial.FogEnable = attr->getAttributeAsBool("FogEnable", outMaterial.FogEnable); + outMaterial.NormalizeNormals = attr->getAttributeAsBool("NormalizeNormals", outMaterial.NormalizeNormals); + outMaterial.UseMipMaps = attr->getAttributeAsBool("UseMipMaps", outMaterial.UseMipMaps); - // default 0 is ok - outMaterial.AntiAliasing = attr->getAttributeAsInt("AntiAliasing"); - if (attr->existsAttribute("ColorMask")) - outMaterial.ColorMask = attr->getAttributeAsInt("ColorMask"); - if (attr->existsAttribute("ColorMaterial")) - outMaterial.ColorMaterial = attr->getAttributeAsInt("ColorMaterial"); - if (attr->existsAttribute("PolygonOffsetFactor")) - outMaterial.PolygonOffsetFactor = attr->getAttributeAsInt("PolygonOffsetFactor"); - if (attr->existsAttribute("PolygonOffsetDirection")) - outMaterial.PolygonOffsetDirection = (video::E_POLYGON_OFFSET)attr->getAttributeAsEnumeration("PolygonOffsetDirection", video::PolygonOffsetDirectionNames); + outMaterial.AntiAliasing = attr->getAttributeAsInt("AntiAliasing", outMaterial.AntiAliasing); + outMaterial.ColorMask = attr->getAttributeAsInt("ColorMask", outMaterial.ColorMask); + outMaterial.ColorMaterial = attr->getAttributeAsInt("ColorMaterial", outMaterial.ColorMaterial); + outMaterial.BlendOperation = (video::E_BLEND_OPERATION)attr->getAttributeAsInt("BlendOperation", outMaterial.BlendOperation); + outMaterial.BlendFactor = attr->getAttributeAsFloat("BlendFactor", outMaterial.BlendFactor); + outMaterial.PolygonOffsetFactor = attr->getAttributeAsInt("PolygonOffsetFactor", outMaterial.PolygonOffsetFactor); + outMaterial.PolygonOffsetDirection = (video::E_POLYGON_OFFSET)attr->getAttributeAsEnumeration("PolygonOffsetDirection", video::PolygonOffsetDirectionNames, outMaterial.PolygonOffsetDirection); + outMaterial.ZWriteFineControl = (video::E_ZWRITE_FINE_CONTROL)attr->getAttributeAsInt("ZWriteFineControl", outMaterial.ZWriteFineControl); prefix = "BilinearFilter"; if (attr->existsAttribute(prefix.c_str())) // legacy outMaterial.setFlag(EMF_BILINEAR_FILTER, attr->getAttributeAsBool(prefix.c_str())); else for (i=0; igetAttributeAsBool((prefix+core::stringc(i+1)).c_str()); + outMaterial.TextureLayer[i].BilinearFilter = attr->getAttributeAsBool((prefix+core::stringc(i+1)).c_str(), outMaterial.TextureLayer[i].BilinearFilter); prefix = "TrilinearFilter"; if (attr->existsAttribute(prefix.c_str())) // legacy outMaterial.setFlag(EMF_TRILINEAR_FILTER, attr->getAttributeAsBool(prefix.c_str())); else for (i=0; igetAttributeAsBool((prefix+core::stringc(i+1)).c_str()); + outMaterial.TextureLayer[i].TrilinearFilter = attr->getAttributeAsBool((prefix+core::stringc(i+1)).c_str(), outMaterial.TextureLayer[i].TrilinearFilter); prefix = "AnisotropicFilter"; if (attr->existsAttribute(prefix.c_str())) // legacy outMaterial.setFlag(EMF_ANISOTROPIC_FILTER, attr->getAttributeAsBool(prefix.c_str())); else for (i=0; igetAttributeAsInt((prefix+core::stringc(i+1)).c_str()); + outMaterial.TextureLayer[i].AnisotropicFilter = attr->getAttributeAsInt((prefix+core::stringc(i+1)).c_str(), outMaterial.TextureLayer[i].AnisotropicFilter); prefix = "TextureWrap"; if (attr->existsAttribute(prefix.c_str())) // legacy @@ -2285,18 +2291,15 @@ void CNullDriver::fillMaterialStructureFromAttributes(video::SMaterial& outMater { for (i=0; igetAttributeAsEnumeration((prefix+"U"+core::stringc(i+1)).c_str(), aTextureClampNames); - outMaterial.TextureLayer[i].TextureWrapV = (E_TEXTURE_CLAMP)attr->getAttributeAsEnumeration((prefix+"V"+core::stringc(i+1)).c_str(), aTextureClampNames); - - if (attr->existsAttribute((prefix+"W"+core::stringc(i+1)).c_str())) // legacy - outMaterial.TextureLayer[i].TextureWrapW = (E_TEXTURE_CLAMP)attr->getAttributeAsEnumeration((prefix+"W"+core::stringc(i+1)).c_str(), aTextureClampNames); + outMaterial.TextureLayer[i].TextureWrapU = (E_TEXTURE_CLAMP)attr->getAttributeAsEnumeration((prefix+"U"+core::stringc(i+1)).c_str(), aTextureClampNames, outMaterial.TextureLayer[i].TextureWrapU); + outMaterial.TextureLayer[i].TextureWrapV = (E_TEXTURE_CLAMP)attr->getAttributeAsEnumeration((prefix+"V"+core::stringc(i+1)).c_str(), aTextureClampNames, outMaterial.TextureLayer[i].TextureWrapV); + outMaterial.TextureLayer[i].TextureWrapW = (E_TEXTURE_CLAMP)attr->getAttributeAsEnumeration((prefix+"W"+core::stringc(i+1)).c_str(), aTextureClampNames, outMaterial.TextureLayer[i].TextureWrapW); } } - // default 0 is ok prefix="LODBias"; for (i=0; igetAttributeAsInt((prefix+core::stringc(i+1)).c_str()); + outMaterial.TextureLayer[i].LODBias = attr->getAttributeAsInt((prefix+core::stringc(i+1)).c_str(), outMaterial.TextureLayer[i].LODBias); } diff --git a/tests/media/scene.irr b/tests/media/scene.irr index d090fd9a95cc8b5b2ca701228b229a9fd0d1cd4f..8249bb14cccf5a4659f6de3968713b935f22fe04 100644 GIT binary patch delta 3356 zcmeHJ&rcIk5Z*@{q6A6{ZL^{&MH^5owTaSQ4`?fi1Q4i25s69>2_Oo!rAAb+B|?CB zpgRcysia&yl9HDgkM-ci7}Ibx#_%V=oe<}3?G_S#B-}JT^xK*DX1<;6o6P$*zU6!l ztK(C7Xf{Y?!9V8?-I1M~LP4J*m59^&9VDG$y@vGKejAtmwC_<$0B29Xy2>5sh z27GDk!T^SXj3SUa7lcAQXy@Dzs^pnXw{DCP)ordCmd9Jti2v6{bx7?NRUjzZ2Hg&Sty@?c&}m5Dapa(f6gyKNaJ7LuWoJ%vm5 zQe<|sh59^21lCK-G5MLN36mHKGK#S3sHea4G}$i7b`gK%E~2ZB_qp)!UJ>o6@f_Yt z&5+Po!R=Z*@=R(_XXlYTz%n!AKbl8NHGTr^Q)X(v`kEYmy@7o&AG|Xq*{5os1yC@p3^T#xDy)Fyj18~Nv?VAO6HgUV z@cBOa$@xNrXnO-q1o{2vm0t3zRoI*r-6s)HSNh0748kwGAQew1P@lf;Z@K8$Z@I<;i`jyC~*lnkoj2L5LjUmbi zL=mwHHo{g&Uhq)w+^3YL(#?fg5r|j>B9kOx8V%>>sM=)7#kO$?w;761wiu@7#h-*x zsqSD1E?@{lK}N>Vn)**X8XB7@A&?m1A@0$z&zWdpe2B=0DALH}(*sVLZcmSAPg&`J QfAy3hGTB5sJ{XVv0e(P%WB>pF delta 724 zcmc&xze@sf6z6*$A{s|fNMsx$5g{g*NgPf=4Pjs+2@MX1lY!9D9CB?A4(6wJTbvrc z`HZ4K9GWCTB80-IAqXNwoSdQ~&3~Yx>AlAXK0n^)d{6Au1)jAtb^mDWP-7md+Wi(Z zBrkH@M~#J9hS8)>t)wiX==Q-#iioD1g;cS;RWh-fOqwgrNZZab(sz6Uq;?F7GD%Bo z2Mls|aIB|HI1^-O8BKH?A-ZGD&|*AdWx+u*RPA@*BOc-j^;T|sjNpw-m!i=82QHUYl83gvMM4Yv$s#XH>jYXSO|zx-wuNNU>zlDjRF;dC7N gITf9U33E!wH|ogrrm1@C?wd(BH~-TNWqKjoCoKOh*#H0l diff --git a/tests/media/scene2.irr b/tests/media/scene2.irr index 207b1847b0ae36bfdb2067890c99275fbd1f557c..9338b17db78e2a36c46fb4c37b6858e5015bb07d 100644 GIT binary patch delta 1039 zcmeH_&r1S97=~xGLrUtVt{81*wH4W>iRSJhhzbgVXt5uM@FFExi7xhoj&<`8VSKlU z4jnpl$(UPo>fEJ!M1Mi_7ewETtLM(q<^A5>eP-twnCJ5M9c|Rya5Ls-m+q_+>YlJ~ zjTFfa*&=(SObTQl@-7)PhXf}>A+XdKD5}Qhyiv*@=oDOdS7}D1F4DjpgJ^dMj(wW} zlT`3$WpY5~NeTNQ*@n{r8S4HtdmCQr2+ZN@0s`A)g;?0CBoFtoUNFO9ZsTfyhnd&_ zNFEg$fgmWsM={T&E_p$0P{0i;Vxua~63hn2*+=Y_f+;I#`6_RrB~M+Xfw>5uS_G!U zL5NPQ!L^uQU}a0-&JLbb!?qZz0LBVWtoUO=Y0eQd4f8;)Fp5vy&w0MCk p)8+-5R~RP?=qYX97bL{E`GLLx*pAI}j00$3{^SSxN|UuhLja7VOn?9Y diff --git a/tests/testUtils.cpp b/tests/testUtils.cpp index a34c947f..fe5a043a 100644 --- a/tests/testUtils.cpp +++ b/tests/testUtils.cpp @@ -12,6 +12,10 @@ #include // For OutputDebugString() #endif // _MSC_VER || _IRR_WINDOWS_API_ +#ifdef _MSC_VER +#pragma warning( disable: 4996) +#endif + using namespace irr; bool binaryCompareFiles(const char * fileName1, const char * fileName2) diff --git a/tests/tests-last-passed-at.txt b/tests/tests-last-passed-at.txt index 4dc6fcf9..19710940 100644 --- a/tests/tests-last-passed-at.txt +++ b/tests/tests-last-passed-at.txt @@ -1,4 +1,4 @@ Tests finished. 1 test of 1 passed. Compiled as DEBUG -Test suite pass at GMT Mon Nov 19 21:48:32 2018 +Test suite pass at GMT Thu Jan 17 14:29:44 2019