From 2a7094889a1a69b5fefd52f3099b452de1cbfdb7 Mon Sep 17 00:00:00 2001 From: cutealien Date: Fri, 27 May 2016 19:47:59 +0000 Subject: [PATCH] Merge revision 5277:5302 from trunk to ogl-es git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/branches/ogl-es@5303 dfc29bdd-3216-0410-991c-e03cc46cb475 --- changes.txt | 5 + include/IAttributes.h | 122 +- include/IVideoDriver.h | 2 +- include/matrix4.h | 6 +- source/Irrlicht/CAttributes.cpp | 116 +- source/Irrlicht/CAttributes.h | 116 +- source/Irrlicht/CColladaFileLoader.cpp | 12 +- source/Irrlicht/CColladaMeshWriter.cpp | 6 +- source/Irrlicht/CD3D9Driver.cpp | 33 +- source/Irrlicht/CD3D9Driver.h | 1 + source/Irrlicht/CNullDriver.cpp | 2 +- source/Irrlicht/CNullDriver.h | 26 +- source/Irrlicht/CSceneCollisionManager.cpp | 2 +- source/Irrlicht/Irrlicht-gcc.cbp | 2679 ++++++++--------- source/Irrlicht/os.cpp | 3 +- tests/lights.cpp | 2 +- tests/media/Burning's Video-lightType.png | Bin 921 -> 1573 bytes .../media/Burning's Video-rttWith2DImage.png | Bin 14138 -> 14596 bytes tests/media/Direct3D 9.0-lightType.png | Bin 1856 -> 2744 bytes tests/media/Direct3D 9.0-rttWith2DImage.png | Bin 14069 -> 14555 bytes ...cht Software Driver 1.0-rttWith2DImage.png | Bin 5574 -> 5859 bytes tests/media/OpenGL-lightType.png | Bin 3291 -> 5526 bytes tests/media/OpenGL-rttWith2DImage.png | Bin 14069 -> 14555 bytes tests/renderTargetTexture.cpp | 4 +- 24 files changed, 1575 insertions(+), 1562 deletions(-) diff --git a/changes.txt b/changes.txt index 818e5af8..6f2f0a11 100644 --- a/changes.txt +++ b/changes.txt @@ -8,6 +8,8 @@ Changes in ogl-es (not yet released - will be merged with trunk at some point) -------------------------- Changes in 1.9 (not yet released) +- Fix: Collada writer now uses wrap_p for third texture wrap value instead of invalid wrap_w (thx @Yoran for bugreport) +- Several getter functions in IAttributes made const (thx @Erik Schultheis for the patch) - Fix: CTriangleSelector no longer ignores meshbuffer transformations from skinned meshes (thx @AlexAzazel for report and test-model). - Randomizer now returns range 0..randMax as documented and no longer 1..randMax as it did before. randMax got reduced by 1. Note: You will generally get different numbers than before! If you need the exact old calculations, please check the corresponding sources in Irrlicht 1.8 in os.cpp/.h @@ -141,6 +143,9 @@ Changes in 1.9 (not yet released) -------------------------- Changes in 1.8.4 + - Update lights and renderTargetTexture tests to work with Windows 10 (can't have so tiny Windows anymore). + - Deprecate CMatrix4::transformBox as the result is no longer a boundingbox. Use CMatrix4::transformBoxEx instead (which has been available for a long time). + - Fix CSceneCollisionManager::getPickedNodeBB which could sometimes miss collisions. - Add -U__STRICT_ANSI__ option to c::b project files to allow compiling with -std=c++11 and add an error when trying to compile with Irrlicht with __STRICT_ANSI__ - Update libpng to 1.6.21 - Update zlib to 1.2.8 diff --git a/include/IAttributes.h b/include/IAttributes.h index 6ddf571b..41101fee 100644 --- a/include/IAttributes.h +++ b/include/IAttributes.h @@ -47,31 +47,31 @@ public: //! Returns attribute name by index. //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual const c8* getAttributeName(s32 index) = 0; + virtual const c8* getAttributeName(s32 index) const = 0; //! Returns the type of an attribute //! \param attributeName: Name for the attribute - virtual E_ATTRIBUTE_TYPE getAttributeType(const c8* attributeName) = 0; + virtual E_ATTRIBUTE_TYPE getAttributeType(const c8* attributeName) const = 0; //! Returns attribute type by index. //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual E_ATTRIBUTE_TYPE getAttributeType(s32 index) = 0; + virtual E_ATTRIBUTE_TYPE getAttributeType(s32 index) const = 0; //! Returns the type string of the attribute //! \param attributeName: String for the attribute type //! \param defaultNotFound Value returned when attributeName was not found - virtual const wchar_t* getAttributeTypeString(const c8* attributeName, const wchar_t* defaultNotFound = L"unknown") = 0; + virtual const wchar_t* getAttributeTypeString(const c8* attributeName, const wchar_t* defaultNotFound = L"unknown") const = 0; //! Returns the type string of the attribute by index. //! \param index: Index value, must be between 0 and getAttributeCount()-1. //! \param defaultNotFound Value returned for an invalid index - virtual const wchar_t* getAttributeTypeString(s32 index, const wchar_t* defaultNotFound = L"unknown") = 0; + virtual const wchar_t* getAttributeTypeString(s32 index, const wchar_t* defaultNotFound = L"unknown") const = 0; //! Returns if an attribute with a name exists - virtual bool existsAttribute(const c8* attributeName) = 0; + virtual bool existsAttribute(const c8* attributeName) const = 0; //! Returns attribute index from name, -1 if not found - virtual s32 findAttribute(const c8* attributeName) const =0; + virtual s32 findAttribute(const c8* attributeName) const = 0; //! Removes all attributes virtual void clear() = 0; @@ -107,11 +107,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual s32 getAttributeAsInt(const c8* attributeName, irr::s32 defaultNotFound=0) const =0; + virtual s32 getAttributeAsInt(const c8* attributeName, irr::s32 defaultNotFound=0) const = 0; //! Gets an attribute as integer value //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual s32 getAttributeAsInt(s32 index) const =0; + virtual s32 getAttributeAsInt(s32 index) const = 0; //! Sets an attribute as integer value virtual void setAttribute(s32 index, s32 value) = 0; @@ -132,11 +132,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual f32 getAttributeAsFloat(const c8* attributeName, irr::f32 defaultNotFound=0.f) = 0; + virtual f32 getAttributeAsFloat(const c8* attributeName, irr::f32 defaultNotFound=0.f) const = 0; //! Gets an attribute as float value //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual f32 getAttributeAsFloat(s32 index) = 0; + virtual f32 getAttributeAsFloat(s32 index) const = 0; //! Sets an attribute as float value virtual void setAttribute(s32 index, f32 value) = 0; @@ -160,16 +160,16 @@ public: //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() //! or defaultNotFound if attribute is not set. - virtual core::stringc getAttributeAsString(const c8* attributeName, const core::stringc& defaultNotFound=core::stringc()) = 0; + virtual core::stringc getAttributeAsString(const c8* attributeName, const core::stringc& defaultNotFound=core::stringc()) const = 0; //! Gets an attribute as string. //! \param attributeName Name of the attribute to get. //! \param target Buffer where the string is copied to. - virtual void getAttributeAsString(const c8* attributeName, c8* target) = 0; + virtual void getAttributeAsString(const c8* attributeName, c8* target) const = 0; //! Returns attribute value as string by index. //! \param index Index value, must be between 0 and getAttributeCount()-1. - virtual core::stringc getAttributeAsString(s32 index) = 0; + virtual core::stringc getAttributeAsString(s32 index) const = 0; //! Sets an attribute value as string. //! \param index Index value, must be between 0 and getAttributeCount()-1. @@ -191,16 +191,16 @@ public: //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() //! or defaultNotFound if attribute is not set. - virtual core::stringw getAttributeAsStringW(const c8* attributeName, const core::stringw& defaultNotFound = core::stringw()) = 0; + virtual core::stringw getAttributeAsStringW(const c8* attributeName, const core::stringw& defaultNotFound = core::stringw()) const = 0; //! Gets an attribute as string. //! \param attributeName: Name of the attribute to get. //! \param target: Buffer where the string is copied to. - virtual void getAttributeAsStringW(const c8* attributeName, wchar_t* target) = 0; + virtual void getAttributeAsStringW(const c8* attributeName, wchar_t* target) const = 0; //! Returns attribute value as string by index. //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::stringw getAttributeAsStringW(s32 index) = 0; + virtual core::stringw getAttributeAsStringW(s32 index) const = 0; //! Sets an attribute value as string. //! \param index Index value, must be between 0 and getAttributeCount()-1. @@ -224,14 +224,14 @@ public: \param outData Pointer to buffer where data shall be stored. \param maxSizeInBytes Maximum number of bytes to write into outData. */ - virtual void getAttributeAsBinaryData(const c8* attributeName, void* outData, s32 maxSizeInBytes) = 0; + virtual void getAttributeAsBinaryData(const c8* attributeName, void* outData, s32 maxSizeInBytes) const = 0; //! Gets an attribute as binary data /** \param index: Index value, must be between 0 and getAttributeCount()-1. \param outData Pointer to buffer where data shall be stored. \param maxSizeInBytes Maximum number of bytes to write into outData. */ - virtual void getAttributeAsBinaryData(s32 index, void* outData, s32 maxSizeInBytes) = 0; + virtual void getAttributeAsBinaryData(s32 index, void* outData, s32 maxSizeInBytes) const = 0; //! Sets an attribute as binary data virtual void setAttribute(s32 index, void* data, s32 dataSizeInBytes ) = 0; @@ -254,11 +254,11 @@ public: //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() //! or defaultNotFound if attribute is not set. - virtual core::array getAttributeAsArray(const c8* attributeName, const core::array& defaultNotFound = core::array()) = 0; + virtual core::array getAttributeAsArray(const c8* attributeName, const core::array& defaultNotFound = core::array()) const = 0; //! Returns attribute value as an array of wide strings by index. //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::array getAttributeAsArray(s32 index) = 0; + virtual core::array getAttributeAsArray(s32 index) const = 0; //! Sets an attribute as an array of wide strings virtual void setAttribute(s32 index, const core::array& value) = 0; @@ -280,11 +280,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual bool getAttributeAsBool(const c8* attributeName, bool defaultNotFound=false) = 0; + virtual bool getAttributeAsBool(const c8* attributeName, bool defaultNotFound=false) const = 0; //! Gets an attribute as boolean value //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual bool getAttributeAsBool(s32 index) = 0; + virtual bool getAttributeAsBool(s32 index) const = 0; //! Sets an attribute as boolean value virtual void setAttribute(s32 index, bool value) = 0; @@ -308,7 +308,7 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual const c8* getAttributeAsEnumeration(const c8* attributeName, const c8* defaultNotFound = 0) = 0; + virtual const c8* getAttributeAsEnumeration(const c8* attributeName, const c8* defaultNotFound = 0) const = 0; //! Gets an attribute as enumeration /** \param attributeName: Name of the attribute to get. @@ -318,7 +318,7 @@ public: enumeration string, but no information about its index. \return Returns value of the attribute previously set by setAttribute() */ - virtual s32 getAttributeAsEnumeration(const c8* attributeName, const c8* const* enumerationLiteralsToUse) = 0; + virtual s32 getAttributeAsEnumeration(const c8* attributeName, const c8* const* enumerationLiteralsToUse) const = 0; //! Gets an attribute as enumeration /** \param index: Index value, must be between 0 and getAttributeCount()-1. @@ -328,21 +328,21 @@ public: enumeration string, but no information about its index. \return Returns value of the attribute previously set by setAttribute() */ - virtual s32 getAttributeAsEnumeration(s32 index, const c8* const* enumerationLiteralsToUse) = 0; + virtual s32 getAttributeAsEnumeration(s32 index, const c8* const* enumerationLiteralsToUse) const = 0; //! Gets an attribute as enumeration //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual const c8* getAttributeAsEnumeration(s32 index) = 0; + virtual const c8* getAttributeAsEnumeration(s32 index) const = 0; //! Gets the list of enumeration literals of an enumeration attribute //! \param attributeName Name of the attribute to get. //! \param outLiterals Set of strings to choose the enum name from. - virtual void getAttributeEnumerationLiteralsOfEnumeration(const c8* attributeName, core::array& outLiterals) = 0; + virtual void getAttributeEnumerationLiteralsOfEnumeration(const c8* attributeName, core::array& outLiterals) const = 0; //! Gets the list of enumeration literals of an enumeration attribute //! \param index: Index value, must be between 0 and getAttributeCount()-1. //! \param outLiterals Set of strings to choose the enum name from. - virtual void getAttributeEnumerationLiteralsOfEnumeration(s32 index, core::array& outLiterals) = 0; + virtual void getAttributeEnumerationLiteralsOfEnumeration(s32 index, core::array& outLiterals) const = 0; //! Sets an attribute as enumeration virtual void setAttribute(s32 index, const c8* enumValue, const c8* const* enumerationLiterals) = 0; @@ -365,11 +365,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual video::SColor getAttributeAsColor(const c8* attributeName, const video::SColor& defaultNotFound = video::SColor(0)) = 0; + virtual video::SColor getAttributeAsColor(const c8* attributeName, const video::SColor& defaultNotFound = video::SColor(0)) const = 0; //! Gets an attribute as color //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual video::SColor getAttributeAsColor(s32 index) = 0; + virtual video::SColor getAttributeAsColor(s32 index) const = 0; //! Sets an attribute as color virtual void setAttribute(s32 index, video::SColor color) = 0; @@ -390,11 +390,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual video::SColorf getAttributeAsColorf(const c8* attributeName, const video::SColorf& defaultNotFound = video::SColorf(0)) = 0; + virtual video::SColorf getAttributeAsColorf(const c8* attributeName, const video::SColorf& defaultNotFound = video::SColorf(0)) const = 0; //! Gets an attribute as floating point color //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual video::SColorf getAttributeAsColorf(s32 index) = 0; + virtual video::SColorf getAttributeAsColorf(s32 index) const = 0; //! Sets an attribute as floating point color virtual void setAttribute(s32 index, video::SColorf color) = 0; @@ -416,11 +416,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual core::vector3df getAttributeAsVector3d(const c8* attributeName, const core::vector3df& defaultNotFound=core::vector3df(0,0,0)) = 0; + virtual core::vector3df getAttributeAsVector3d(const c8* attributeName, const core::vector3df& defaultNotFound=core::vector3df(0,0,0)) const = 0; //! Gets an attribute as 3d vector //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::vector3df getAttributeAsVector3d(s32 index) = 0; + virtual core::vector3df getAttributeAsVector3d(s32 index) const = 0; //! Sets an attribute as vector virtual void setAttribute(s32 index, const core::vector3df& v) = 0; @@ -441,11 +441,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual core::vector2df getAttributeAsVector2d(const c8* attributeName, const core::vector2df& defaultNotFound=core::vector2df(0,0)) = 0; + virtual core::vector2df getAttributeAsVector2d(const c8* attributeName, const core::vector2df& defaultNotFound=core::vector2df(0,0)) const = 0; //! Gets an attribute as position //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::vector2df getAttributeAsVector2d(s32 index) = 0; + virtual core::vector2df getAttributeAsVector2d(s32 index) const = 0; //! Sets an attribute as 2d vector virtual void setAttribute(s32 index, const core::vector2df& v) = 0; @@ -466,11 +466,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual core::position2di getAttributeAsPosition2d(const c8* attributeName, const core::position2di& defaultNotFound=core::position2di(0,0)) = 0; + virtual core::position2di getAttributeAsPosition2d(const c8* attributeName, const core::position2di& defaultNotFound=core::position2di(0,0)) const = 0; //! Gets an attribute as position //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::position2di getAttributeAsPosition2d(s32 index) = 0; + virtual core::position2di getAttributeAsPosition2d(s32 index) const = 0; //! Sets an attribute as 2d position virtual void setAttribute(s32 index, const core::position2di& v) = 0; @@ -491,11 +491,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual core::rect getAttributeAsRect(const c8* attributeName, const core::rect& defaultNotFound = core::rect()) = 0; + virtual core::rect getAttributeAsRect(const c8* attributeName, const core::rect& defaultNotFound = core::rect()) const = 0; //! Gets an attribute as rectangle //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::rect getAttributeAsRect(s32 index) = 0; + virtual core::rect getAttributeAsRect(s32 index) const = 0; //! Sets an attribute as rectangle virtual void setAttribute(s32 index, const core::rect& v) = 0; @@ -517,11 +517,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual core::dimension2d getAttributeAsDimension2d(const c8* attributeName, const core::dimension2d& defaultNotFound = core::dimension2d()) = 0; + virtual core::dimension2d getAttributeAsDimension2d(const c8* attributeName, const core::dimension2d& defaultNotFound = core::dimension2d()) const = 0; //! Gets an attribute as dimension2d //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::dimension2d getAttributeAsDimension2d(s32 index) = 0; + virtual core::dimension2d getAttributeAsDimension2d(s32 index) const = 0; //! Sets an attribute as dimension2d virtual void setAttribute(s32 index, const core::dimension2d& v) = 0; @@ -541,11 +541,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual core::matrix4 getAttributeAsMatrix(const c8* attributeName, const core::matrix4& defaultNotFound=core::matrix4()) = 0; + virtual core::matrix4 getAttributeAsMatrix(const c8* attributeName, const core::matrix4& defaultNotFound=core::matrix4()) const = 0; //! Gets an attribute as matrix //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::matrix4 getAttributeAsMatrix(s32 index) = 0; + virtual core::matrix4 getAttributeAsMatrix(s32 index) const = 0; //! Sets an attribute as matrix virtual void setAttribute(s32 index, const core::matrix4& v) = 0; @@ -565,11 +565,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual core::quaternion getAttributeAsQuaternion(const c8* attributeName, const core::quaternion& defaultNotFound=core::quaternion(0,1,0, 0)) = 0; + virtual core::quaternion getAttributeAsQuaternion(const c8* attributeName, const core::quaternion& defaultNotFound=core::quaternion(0,1,0, 0)) const = 0; //! Gets an attribute as quaternion //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::quaternion getAttributeAsQuaternion(s32 index) = 0; + virtual core::quaternion getAttributeAsQuaternion(s32 index) const = 0; //! Sets an attribute as quaternion virtual void setAttribute(s32 index, const core::quaternion& v) = 0; @@ -590,11 +590,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual core::aabbox3df getAttributeAsBox3d(const c8* attributeName, const core::aabbox3df& defaultNotFound=core::aabbox3df(0,0,0, 0,0,0)) = 0; + virtual core::aabbox3df getAttributeAsBox3d(const c8* attributeName, const core::aabbox3df& defaultNotFound=core::aabbox3df(0,0,0, 0,0,0)) const = 0; //! Gets an attribute as axis aligned bounding box //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::aabbox3df getAttributeAsBox3d(s32 index) = 0; + virtual core::aabbox3df getAttributeAsBox3d(s32 index) const = 0; //! Sets an attribute as axis aligned bounding box virtual void setAttribute(s32 index, const core::aabbox3df& v) = 0; @@ -615,11 +615,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual core::plane3df getAttributeAsPlane3d(const c8* attributeName, const core::plane3df& defaultNotFound=core::plane3df(0,0,0, 0,1,0)) = 0; + virtual core::plane3df getAttributeAsPlane3d(const c8* attributeName, const core::plane3df& defaultNotFound=core::plane3df(0,0,0, 0,1,0)) const = 0; //! Gets an attribute as 3d plane //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::plane3df getAttributeAsPlane3d(s32 index) = 0; + virtual core::plane3df getAttributeAsPlane3d(s32 index) const = 0; //! Sets an attribute as 3d plane virtual void setAttribute(s32 index, const core::plane3df& v) = 0; @@ -641,11 +641,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual core::triangle3df getAttributeAsTriangle3d(const c8* attributeName, const core::triangle3df& defaultNotFound = core::triangle3df(core::vector3df(0,0,0), core::vector3df(0,0,0), core::vector3df(0,0,0))) = 0; + virtual core::triangle3df getAttributeAsTriangle3d(const c8* attributeName, const core::triangle3df& defaultNotFound = core::triangle3df(core::vector3df(0,0,0), core::vector3df(0,0,0), core::vector3df(0,0,0))) const = 0; //! Gets an attribute as 3d triangle //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::triangle3df getAttributeAsTriangle3d(s32 index) = 0; + virtual core::triangle3df getAttributeAsTriangle3d(s32 index) const = 0; //! Sets an attribute as 3d triangle virtual void setAttribute(s32 index, const core::triangle3df& v) = 0; @@ -667,11 +667,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual core::line2df getAttributeAsLine2d(const c8* attributeName, const core::line2df& defaultNotFound = core::line2df(0,0, 0,0)) = 0; + virtual core::line2df getAttributeAsLine2d(const c8* attributeName, const core::line2df& defaultNotFound = core::line2df(0,0, 0,0)) const = 0; //! Gets an attribute as a 2d line //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::line2df getAttributeAsLine2d(s32 index) = 0; + virtual core::line2df getAttributeAsLine2d(s32 index) const = 0; //! Sets an attribute as a 2d line virtual void setAttribute(s32 index, const core::line2df& v) = 0; @@ -693,11 +693,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual core::line3df getAttributeAsLine3d(const c8* attributeName, const core::line3df& defaultNotFound=core::line3df(0,0,0, 0,0,0)) = 0; + virtual core::line3df getAttributeAsLine3d(const c8* attributeName, const core::line3df& defaultNotFound=core::line3df(0,0,0, 0,0,0)) const = 0; //! Gets an attribute as a 3d line //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::line3df getAttributeAsLine3d(s32 index) = 0; + virtual core::line3df getAttributeAsLine3d(s32 index) const = 0; //! Sets an attribute as a 3d line virtual void setAttribute(s32 index, const core::line3df& v) = 0; @@ -718,11 +718,11 @@ public: //! Gets an attribute as texture reference //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found - virtual video::ITexture* getAttributeAsTexture(const c8* attributeName, video::ITexture* defaultNotFound=0) = 0; + virtual video::ITexture* getAttributeAsTexture(const c8* attributeName, video::ITexture* defaultNotFound=0) const = 0; //! Gets an attribute as texture reference //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual video::ITexture* getAttributeAsTexture(s32 index) = 0; + virtual video::ITexture* getAttributeAsTexture(s32 index) const = 0; //! Sets an attribute as texture reference virtual void setAttribute(s32 index, video::ITexture* texture, const io::path& filename = "") = 0; @@ -743,11 +743,11 @@ public: //! Gets an attribute as user pointer //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found - virtual void* getAttributeAsUserPointer(const c8* attributeName, void* defaultNotFound = 0) = 0; + virtual void* getAttributeAsUserPointer(const c8* attributeName, void* defaultNotFound = 0) const = 0; //! Gets an attribute as user pointer //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual void* getAttributeAsUserPointer(s32 index) = 0; + virtual void* getAttributeAsUserPointer(s32 index) const = 0; //! Sets an attribute as user pointer virtual void setAttribute(s32 index, void* userPointer) = 0; diff --git a/include/IVideoDriver.h b/include/IVideoDriver.h index 5b1c44f6..f2f0f3a8 100644 --- a/include/IVideoDriver.h +++ b/include/IVideoDriver.h @@ -982,7 +982,7 @@ namespace video \param color Color of the pixel to draw. */ virtual void drawPixel(u32 x, u32 y, const SColor& color) =0; - //! Draws a non filled concyclic regular 2d polyon. + //! Draws a non filled concyclic regular 2d polygon. /** This method can be used to draw circles, but also triangles, tetragons, pentagons, hexagons, heptagons, octagons, enneagons, decagons, hendecagons, dodecagon, triskaidecagons, diff --git a/include/matrix4.h b/include/matrix4.h index ff0de4a0..a9b8ab1f 100644 --- a/include/matrix4.h +++ b/include/matrix4.h @@ -1228,9 +1228,11 @@ namespace core transformPlane( out ); } - //! Transforms a axis aligned bounding box + //! Transforms the edge-points of a bounding box + //! Deprecated as it's usually not what people need (regards only 2 corners, but other corners might be outside the box after transformation) + //! Use transformBoxEx instead. template - inline void CMatrix4::transformBox(core::aabbox3d& box) const + _IRR_DEPRECATED_ inline void CMatrix4::transformBox(core::aabbox3d& box) const { #if defined ( USE_MATRIX_TEST ) if (isIdentity()) diff --git a/source/Irrlicht/CAttributes.cpp b/source/Irrlicht/CAttributes.cpp index f04e3ff3..083c19d0 100644 --- a/source/Irrlicht/CAttributes.cpp +++ b/source/Irrlicht/CAttributes.cpp @@ -76,7 +76,7 @@ void CAttributes::setAttribute(const c8* attributeName, const c8* value) //! \param attributeName: Name of the attribute to get. //! \return Returns value of the attribute previously set by setStringAttribute() //! or 0 if attribute is not set. -core::stringc CAttributes::getAttributeAsString(const c8* attributeName, const core::stringc& defaultNotFound) +core::stringc CAttributes::getAttributeAsString(const c8* attributeName, const core::stringc& defaultNotFound) const { IAttribute* att = getAttributeP(attributeName); if (att) @@ -88,7 +88,7 @@ core::stringc CAttributes::getAttributeAsString(const c8* attributeName, const c //! Gets a string attribute. //! \param attributeName: Name of the attribute to get. //! \param target: Buffer where the string is copied to. -void CAttributes::getAttributeAsString(const c8* attributeName, char* target) +void CAttributes::getAttributeAsString(const c8* attributeName, char* target) const { IAttribute* att = getAttributeP(attributeName); if (att) @@ -102,7 +102,7 @@ void CAttributes::getAttributeAsString(const c8* attributeName, char* target) //! Returns string attribute value by index. //! \param index: Index value, must be between 0 and getAttributeCount()-1. -core::stringc CAttributes::getAttributeAsString(s32 index) +core::stringc CAttributes::getAttributeAsString(s32 index) const { core::stringc str; @@ -144,7 +144,7 @@ void CAttributes::setAttribute(const c8* attributeName, const wchar_t* value) //! \param attributeName: Name of the attribute to get. //! \return Returns value of the attribute previously set by setStringAttribute() //! or 0 if attribute is not set. -core::stringw CAttributes::getAttributeAsStringW(const c8* attributeName, const core::stringw& defaultNotFound) +core::stringw CAttributes::getAttributeAsStringW(const c8* attributeName, const core::stringw& defaultNotFound) const { IAttribute* att = getAttributeP(attributeName); if (att) @@ -156,7 +156,7 @@ core::stringw CAttributes::getAttributeAsStringW(const c8* attributeName, const //! Gets a string attribute. //! \param attributeName: Name of the attribute to get. //! \param target: Buffer where the string is copied to. -void CAttributes::getAttributeAsStringW(const c8* attributeName, wchar_t* target) +void CAttributes::getAttributeAsStringW(const c8* attributeName, wchar_t* target) const { IAttribute* att = getAttributeP(attributeName); if (att) @@ -170,7 +170,7 @@ void CAttributes::getAttributeAsStringW(const c8* attributeName, wchar_t* target //! Returns string attribute value by index. //! \param index: Index value, must be between 0 and getAttributeCount()-1. -core::stringw CAttributes::getAttributeAsStringW(s32 index) +core::stringw CAttributes::getAttributeAsStringW(s32 index) const { if ((u32)index < Attributes.size()) @@ -199,7 +199,7 @@ void CAttributes::setAttribute(const c8* attributeName, const core::array CAttributes::getAttributeAsArray(const c8* attributeName, const core::array& defaultNotFound) +core::array CAttributes::getAttributeAsArray(const c8* attributeName, const core::array& defaultNotFound) const { IAttribute* att = getAttributeP(attributeName); if (att) @@ -209,7 +209,7 @@ core::array CAttributes::getAttributeAsArray(const c8* attributeN } //! Returns attribute value as an array of wide strings by index. -core::array CAttributes::getAttributeAsArray(s32 index) +core::array CAttributes::getAttributeAsArray(s32 index) const { core::array ret; @@ -266,7 +266,7 @@ void CAttributes::setAttribute(const c8* attributeName, bool value) //! \param attributeName: Name of the attribute to get. //! \return Returns value of the attribute previously set by setAttribute() as bool //! or 0 if attribute is not set. -bool CAttributes::getAttributeAsBool(const c8* attributeName, bool defaultNotFound) +bool CAttributes::getAttributeAsBool(const c8* attributeName, bool defaultNotFound) const { IAttribute* att = getAttributeP(attributeName); if (att) @@ -314,7 +314,7 @@ void CAttributes::setAttribute(const c8* attributeName, f32 value) //! \param attributeName: Name of the attribute to get. //! \return Returns value of the attribute previously set by setAttribute() as float value //! or 0 if attribute is not set. -f32 CAttributes::getAttributeAsFloat(const c8* attributeName, irr::f32 defaultNotFound) +f32 CAttributes::getAttributeAsFloat(const c8* attributeName, irr::f32 defaultNotFound) const { IAttribute* att = getAttributeP(attributeName); if (att) @@ -336,7 +336,7 @@ void CAttributes::setAttribute(const c8* attributeName, video::SColor value) //! Gets an attribute as color //! \param attributeName: Name of the attribute to get. //! \return Returns value of the attribute previously set by setAttribute() -video::SColor CAttributes::getAttributeAsColor(const c8* attributeName, const video::SColor& defaultNotFound) +video::SColor CAttributes::getAttributeAsColor(const c8* attributeName, const video::SColor& defaultNotFound) const { IAttribute* att = getAttributeP(attributeName); if (att) @@ -358,7 +358,7 @@ void CAttributes::setAttribute(const c8* attributeName, video::SColorf value) //! Gets an attribute as floating point color //! \param attributeName: Name of the attribute to get. //! \return Returns value of the attribute previously set by setAttribute() -video::SColorf CAttributes::getAttributeAsColorf(const c8* attributeName, const video::SColorf& defaultNotFound) +video::SColorf CAttributes::getAttributeAsColorf(const c8* attributeName, const video::SColorf& defaultNotFound) const { IAttribute* att = getAttributeP(attributeName); if (att) @@ -380,7 +380,7 @@ void CAttributes::setAttribute(const c8* attributeName, const core::position2di& //! Gets an attribute as 2d position //! \param attributeName: Name of the attribute to get. //! \return Returns value of the attribute previously set by setAttribute() -core::position2di CAttributes::getAttributeAsPosition2d(const c8* attributeName, const core::position2di& defaultNotFound) +core::position2di CAttributes::getAttributeAsPosition2d(const c8* attributeName, const core::position2di& defaultNotFound) const { IAttribute* att = getAttributeP(attributeName); if (att) @@ -402,7 +402,7 @@ void CAttributes::setAttribute(const c8* attributeName, const core::rect& v //! Gets an attribute as rectangle //! \param attributeName: Name of the attribute to get. //! \return Returns value of the attribute previously set by setAttribute() -core::rect CAttributes::getAttributeAsRect(const c8* attributeName, const core::rect& defaultNotFound) +core::rect CAttributes::getAttributeAsRect(const c8* attributeName, const core::rect& defaultNotFound) const { IAttribute* att = getAttributeP(attributeName); if (att) @@ -424,7 +424,7 @@ void CAttributes::setAttribute(const c8* attributeName, const core::dimension2d< //! Gets an attribute as dimension2d //! \param attributeName: Name of the attribute to get. //! \return Returns value of the attribute previously set by setAttribute() -core::dimension2d CAttributes::getAttributeAsDimension2d(const c8* attributeName, const core::dimension2d& defaultNotFound) +core::dimension2d CAttributes::getAttributeAsDimension2d(const c8* attributeName, const core::dimension2d& defaultNotFound) const { IAttribute* att = getAttributeP(attributeName); if (att) @@ -456,7 +456,7 @@ void CAttributes::setAttribute(const c8* attributeName, const core::vector2df& v //! Gets an attribute as vector //! \param attributeName: Name of the attribute to get. //! \return Returns value of the attribute previously set by setAttribute() -core::vector3df CAttributes::getAttributeAsVector3d(const c8* attributeName, const core::vector3df& defaultNotFound) +core::vector3df CAttributes::getAttributeAsVector3d(const c8* attributeName, const core::vector3df& defaultNotFound) const { IAttribute* att = getAttributeP(attributeName); if (att) @@ -466,7 +466,7 @@ core::vector3df CAttributes::getAttributeAsVector3d(const c8* attributeName, con } //! Gets an attribute as vector -core::vector2df CAttributes::getAttributeAsVector2d(const c8* attributeName, const core::vector2df& defaultNotFound) +core::vector2df CAttributes::getAttributeAsVector2d(const c8* attributeName, const core::vector2df& defaultNotFound) const { IAttribute* att = getAttributeP(attributeName); if (att) @@ -487,7 +487,7 @@ void CAttributes::setAttribute(const c8* attributeName, void* data, s32 dataSize //! Gets an attribute as binary data //! \param attributeName: Name of the attribute to get. -void CAttributes::getAttributeAsBinaryData(const c8* attributeName, void* outData, s32 maxSizeInBytes) +void CAttributes::getAttributeAsBinaryData(const c8* attributeName, void* outData, s32 maxSizeInBytes) const { IAttribute* att = getAttributeP(attributeName); if (att) @@ -507,7 +507,7 @@ void CAttributes::setAttribute(const c8* attributeName, const char* enumValue, c //! Gets an attribute as enumeration //! \param attributeName: Name of the attribute to get. //! \return Returns value of the attribute previously set by setAttribute() -const char* CAttributes::getAttributeAsEnumeration(const c8* attributeName, const c8* defaultNotFound) +const char* CAttributes::getAttributeAsEnumeration(const c8* attributeName, const c8* defaultNotFound) const { IAttribute* att = getAttributeP(attributeName); if (att) @@ -517,7 +517,7 @@ const char* CAttributes::getAttributeAsEnumeration(const c8* attributeName, cons } //! Gets an attribute as enumeration -s32 CAttributes::getAttributeAsEnumeration(const c8* attributeName, const char* const* enumerationLiteralsToUse) +s32 CAttributes::getAttributeAsEnumeration(const c8* attributeName, const char* const* enumerationLiteralsToUse) const { IAttribute* att = getAttributeP(attributeName); @@ -537,7 +537,7 @@ s32 CAttributes::getAttributeAsEnumeration(const c8* attributeName, const char* //! Gets the list of enumeration literals of an enumeration attribute //! \param attributeName: Name of the attribute to get. -void CAttributes::getAttributeEnumerationLiteralsOfEnumeration(const c8* attributeName, core::array& outLiterals) +void CAttributes::getAttributeEnumerationLiteralsOfEnumeration(const c8* attributeName, core::array& outLiterals) const { IAttribute* att = getAttributeP(attributeName); @@ -558,7 +558,7 @@ void CAttributes::setAttribute(const c8* attributeName, video::ITexture* value, //! Gets an attribute as texture reference //! \param attributeName: Name of the attribute to get. -video::ITexture* CAttributes::getAttributeAsTexture(const c8* attributeName, video::ITexture* defaultNotFound) +video::ITexture* CAttributes::getAttributeAsTexture(const c8* attributeName, video::ITexture* defaultNotFound) const { IAttribute* att = getAttributeP(attributeName); if (att) @@ -569,7 +569,7 @@ video::ITexture* CAttributes::getAttributeAsTexture(const c8* attributeName, vid //! Gets an attribute as texture reference //! \param index: Index value, must be between 0 and getAttributeCount()-1. -video::ITexture* CAttributes::getAttributeAsTexture(s32 index) +video::ITexture* CAttributes::getAttributeAsTexture(s32 index) const { if ((u32)index < Attributes.size()) return Attributes[index]->getTexture(); @@ -586,7 +586,7 @@ u32 CAttributes::getAttributeCount() const //! Returns string attribute name by index. //! \param index: Index value, must be between 0 and getStringAttributeCount()-1. -const c8* CAttributes::getAttributeName(s32 index) +const c8* CAttributes::getAttributeName(s32 index) const { if ((u32)index >= Attributes.size()) return 0; @@ -595,7 +595,7 @@ const c8* CAttributes::getAttributeName(s32 index) } //! Returns the type of an attribute -E_ATTRIBUTE_TYPE CAttributes::getAttributeType(const c8* attributeName) +E_ATTRIBUTE_TYPE CAttributes::getAttributeType(const c8* attributeName) const { E_ATTRIBUTE_TYPE ret = EAT_UNKNOWN; @@ -608,7 +608,7 @@ E_ATTRIBUTE_TYPE CAttributes::getAttributeType(const c8* attributeName) //! Returns attribute type by index. //! \param index: Index value, must be between 0 and getAttributeCount()-1. -E_ATTRIBUTE_TYPE CAttributes::getAttributeType(s32 index) +E_ATTRIBUTE_TYPE CAttributes::getAttributeType(s32 index) const { if ((u32)index >= Attributes.size()) return EAT_UNKNOWN; @@ -617,7 +617,7 @@ E_ATTRIBUTE_TYPE CAttributes::getAttributeType(s32 index) } //! Returns the type of an attribute -const wchar_t* CAttributes::getAttributeTypeString(const c8* attributeName, const wchar_t* defaultNotFound) +const wchar_t* CAttributes::getAttributeTypeString(const c8* attributeName, const wchar_t* defaultNotFound) const { IAttribute* att = getAttributeP(attributeName); if (att) @@ -628,7 +628,7 @@ const wchar_t* CAttributes::getAttributeTypeString(const c8* attributeName, cons //! Returns attribute type string by index. //! \param index: Index value, must be between 0 and getAttributeCount()-1. -const wchar_t* CAttributes::getAttributeTypeString(s32 index, const wchar_t* defaultNotFound) +const wchar_t* CAttributes::getAttributeTypeString(s32 index, const wchar_t* defaultNotFound) const { if ((u32)index >= Attributes.size()) return defaultNotFound; @@ -638,7 +638,7 @@ const wchar_t* CAttributes::getAttributeTypeString(s32 index, const wchar_t* def //! Gets an attribute as boolean value //! \param index: Index value, must be between 0 and getAttributeCount()-1. -bool CAttributes::getAttributeAsBool(s32 index) +bool CAttributes::getAttributeAsBool(s32 index) const { bool ret = false; @@ -660,7 +660,7 @@ s32 CAttributes::getAttributeAsInt(s32 index) const //! Gets an attribute as float value //! \param index: Index value, must be between 0 and getAttributeCount()-1. -f32 CAttributes::getAttributeAsFloat(s32 index) +f32 CAttributes::getAttributeAsFloat(s32 index) const { if ((u32)index < Attributes.size()) return Attributes[index]->getFloat(); @@ -670,7 +670,7 @@ f32 CAttributes::getAttributeAsFloat(s32 index) //! Gets an attribute as color //! \param index: Index value, must be between 0 and getAttributeCount()-1. -video::SColor CAttributes::getAttributeAsColor(s32 index) +video::SColor CAttributes::getAttributeAsColor(s32 index) const { video::SColor ret(0); @@ -682,7 +682,7 @@ video::SColor CAttributes::getAttributeAsColor(s32 index) //! Gets an attribute as floating point color //! \param index: Index value, must be between 0 and getAttributeCount()-1. -video::SColorf CAttributes::getAttributeAsColorf(s32 index) +video::SColorf CAttributes::getAttributeAsColorf(s32 index) const { if ((u32)index < Attributes.size()) return Attributes[index]->getColorf(); @@ -692,7 +692,7 @@ video::SColorf CAttributes::getAttributeAsColorf(s32 index) //! Gets an attribute as 3d vector //! \param index: Index value, must be between 0 and getAttributeCount()-1. -core::vector3df CAttributes::getAttributeAsVector3d(s32 index) +core::vector3df CAttributes::getAttributeAsVector3d(s32 index) const { if ((u32)index < Attributes.size()) return Attributes[index]->getVector(); @@ -701,7 +701,7 @@ core::vector3df CAttributes::getAttributeAsVector3d(s32 index) } //! Gets an attribute as 2d vector -core::vector2df CAttributes::getAttributeAsVector2d(s32 index) +core::vector2df CAttributes::getAttributeAsVector2d(s32 index) const { if ((u32)index < Attributes.size()) return Attributes[index]->getVector2d(); @@ -711,7 +711,7 @@ core::vector2df CAttributes::getAttributeAsVector2d(s32 index) //! Gets an attribute as position2d //! \param index: Index value, must be between 0 and getAttributeCount()-1. -core::position2di CAttributes::getAttributeAsPosition2d(s32 index) +core::position2di CAttributes::getAttributeAsPosition2d(s32 index) const { if ((u32)index < Attributes.size()) return Attributes[index]->getPosition(); @@ -721,7 +721,7 @@ core::position2di CAttributes::getAttributeAsPosition2d(s32 index) //! Gets an attribute as rectangle //! \param index: Index value, must be between 0 and getAttributeCount()-1. -core::rect CAttributes::getAttributeAsRect(s32 index) +core::rect CAttributes::getAttributeAsRect(s32 index) const { if ((u32)index < Attributes.size()) return Attributes[index]->getRect(); @@ -731,7 +731,7 @@ core::rect CAttributes::getAttributeAsRect(s32 index) //! Gets an attribute as dimension2d //! \param index: Index value, must be between 0 and getAttributeCount()-1. -core::dimension2d CAttributes::getAttributeAsDimension2d(s32 index) +core::dimension2d CAttributes::getAttributeAsDimension2d(s32 index) const { if ((u32)index < Attributes.size()) return Attributes[index]->getDimension2d(); @@ -742,7 +742,7 @@ core::dimension2d CAttributes::getAttributeAsDimension2d(s32 index) //! Gets an attribute as binary data ///! \param index: Index value, must be between 0 and getAttributeCount()-1. -void CAttributes::getAttributeAsBinaryData(s32 index, void* outData, s32 maxSizeInBytes) +void CAttributes::getAttributeAsBinaryData(s32 index, void* outData, s32 maxSizeInBytes) const { if ((u32)index < Attributes.size()) Attributes[index]->getBinary(outData, maxSizeInBytes); @@ -751,7 +751,7 @@ void CAttributes::getAttributeAsBinaryData(s32 index, void* outData, s32 maxSize //! Gets an attribute as enumeration //! \param index: Index value, must be between 0 and getAttributeCount()-1. -const char* CAttributes::getAttributeAsEnumeration(s32 index) +const char* CAttributes::getAttributeAsEnumeration(s32 index) const { if ((u32)index < Attributes.size()) return Attributes[index]->getEnum(); @@ -762,7 +762,7 @@ const char* CAttributes::getAttributeAsEnumeration(s32 index) //! Gets an attribute as enumeration //! \param index: Index value, must be between 0 and getAttributeCount()-1. -s32 CAttributes::getAttributeAsEnumeration(s32 index, const char* const* enumerationLiteralsToUse) +s32 CAttributes::getAttributeAsEnumeration(s32 index, const char* const* enumerationLiteralsToUse) const { if ((u32)index < Attributes.size()) { @@ -785,7 +785,7 @@ s32 CAttributes::getAttributeAsEnumeration(s32 index, const char* const* enumera //! Gets the list of enumeration literals of an enumeration attribute //! \param index: Index value, must be between 0 and getAttributeCount()-1. -void CAttributes::getAttributeEnumerationLiteralsOfEnumeration(s32 index, core::array& outLiterals) +void CAttributes::getAttributeEnumerationLiteralsOfEnumeration(s32 index, core::array& outLiterals) const { if ((u32)index < Attributes.size() && Attributes[index]->getType() == EAT_ENUM) @@ -892,7 +892,7 @@ void CAttributes::addTexture(const c8* attributeName, video::ITexture* texture, } //! Returns if an attribute with a name exists -bool CAttributes::existsAttribute(const c8* attributeName) +bool CAttributes::existsAttribute(const c8* attributeName) const { return getAttributeP(attributeName) != 0; } @@ -1025,7 +1025,7 @@ void CAttributes::setAttribute(const c8* attributeName, const core::matrix4& v) } //! Gets an attribute as a matrix4 -core::matrix4 CAttributes::getAttributeAsMatrix(const c8* attributeName, const core::matrix4& defaultNotFound) +core::matrix4 CAttributes::getAttributeAsMatrix(const c8* attributeName, const core::matrix4& defaultNotFound) const { IAttribute* att = getAttributeP(attributeName); if (att) @@ -1036,7 +1036,7 @@ core::matrix4 CAttributes::getAttributeAsMatrix(const c8* attributeName, const c } //! Gets an attribute as matrix -core::matrix4 CAttributes::getAttributeAsMatrix(s32 index) +core::matrix4 CAttributes::getAttributeAsMatrix(s32 index) const { if ((u32)index < Attributes.size()) return Attributes[index]->getMatrix(); @@ -1072,7 +1072,7 @@ void CAttributes::setAttribute(const c8* attributeName, const core::quaternion& } //! Gets an attribute as a quaternion -core::quaternion CAttributes::getAttributeAsQuaternion(const c8* attributeName, const core::quaternion& defaultNotFound) +core::quaternion CAttributes::getAttributeAsQuaternion(const c8* attributeName, const core::quaternion& defaultNotFound) const { IAttribute* att = getAttributeP(attributeName); if (att) @@ -1082,7 +1082,7 @@ core::quaternion CAttributes::getAttributeAsQuaternion(const c8* attributeName, } //! Gets an attribute as quaternion -core::quaternion CAttributes::getAttributeAsQuaternion(s32 index) +core::quaternion CAttributes::getAttributeAsQuaternion(s32 index) const { core::quaternion ret(0,1,0, 0); @@ -1118,7 +1118,7 @@ void CAttributes::setAttribute(const c8* attributeName, const core::aabbox3df& v } //! Gets an attribute as a axis aligned bounding box -core::aabbox3df CAttributes::getAttributeAsBox3d(const c8* attributeName, const core::aabbox3df& defaultNotFound) +core::aabbox3df CAttributes::getAttributeAsBox3d(const c8* attributeName, const core::aabbox3df& defaultNotFound) const { IAttribute* att = getAttributeP(attributeName); if (att) @@ -1128,7 +1128,7 @@ core::aabbox3df CAttributes::getAttributeAsBox3d(const c8* attributeName, const } //! Gets an attribute as axis aligned bounding box -core::aabbox3df CAttributes::getAttributeAsBox3d(s32 index) +core::aabbox3df CAttributes::getAttributeAsBox3d(s32 index) const { core::aabbox3df ret(0,0,0, 0,0,0); @@ -1164,7 +1164,7 @@ void CAttributes::setAttribute(const c8* attributeName, const core::plane3df& v) } //! Gets an attribute as a 3d plane -core::plane3df CAttributes::getAttributeAsPlane3d(const c8* attributeName, const core::plane3df& defaultNotFound) +core::plane3df CAttributes::getAttributeAsPlane3d(const c8* attributeName, const core::plane3df& defaultNotFound) const { IAttribute* att = getAttributeP(attributeName); if (att) @@ -1174,7 +1174,7 @@ core::plane3df CAttributes::getAttributeAsPlane3d(const c8* attributeName, const } //! Gets an attribute as 3d plane -core::plane3df CAttributes::getAttributeAsPlane3d(s32 index) +core::plane3df CAttributes::getAttributeAsPlane3d(s32 index) const { core::plane3df ret(0,0,0, 0,1,0); @@ -1210,7 +1210,7 @@ void CAttributes::setAttribute(const c8* attributeName, const core::triangle3df& } //! Gets an attribute as a 3d triangle -core::triangle3df CAttributes::getAttributeAsTriangle3d(const c8* attributeName, const core::triangle3df& defaultNotFound) +core::triangle3df CAttributes::getAttributeAsTriangle3d(const c8* attributeName, const core::triangle3df& defaultNotFound) const { IAttribute* att = getAttributeP(attributeName); if (att) @@ -1220,7 +1220,7 @@ core::triangle3df CAttributes::getAttributeAsTriangle3d(const c8* attributeName, } //! Gets an attribute as 3d triangle -core::triangle3df CAttributes::getAttributeAsTriangle3d(s32 index) +core::triangle3df CAttributes::getAttributeAsTriangle3d(s32 index) const { core::triangle3df ret; ret.pointA = ret.pointB = ret.pointC = core::vector3df(0,0,0); @@ -1257,7 +1257,7 @@ void CAttributes::setAttribute(const c8* attributeName, const core::line2df& v) } //! Gets an attribute as a 2d line -core::line2df CAttributes::getAttributeAsLine2d(const c8* attributeName, const core::line2df& defaultNotFound) +core::line2df CAttributes::getAttributeAsLine2d(const c8* attributeName, const core::line2df& defaultNotFound) const { IAttribute* att = getAttributeP(attributeName); if (att) @@ -1267,7 +1267,7 @@ core::line2df CAttributes::getAttributeAsLine2d(const c8* attributeName, const c } //! Gets an attribute as a 2d line -core::line2df CAttributes::getAttributeAsLine2d(s32 index) +core::line2df CAttributes::getAttributeAsLine2d(s32 index) const { core::line2df ret(0,0, 0,0); @@ -1303,7 +1303,7 @@ void CAttributes::setAttribute(const c8* attributeName, const core::line3df& v) } //! Gets an attribute as a 3d line -core::line3df CAttributes::getAttributeAsLine3d(const c8* attributeName, const core::line3df& defaultNotFound) +core::line3df CAttributes::getAttributeAsLine3d(const c8* attributeName, const core::line3df& defaultNotFound) const { IAttribute* att = getAttributeP(attributeName); if (att) @@ -1313,7 +1313,7 @@ core::line3df CAttributes::getAttributeAsLine3d(const c8* attributeName, const c } //! Gets an attribute as a 3d line -core::line3df CAttributes::getAttributeAsLine3d(s32 index) +core::line3df CAttributes::getAttributeAsLine3d(s32 index) const { core::line3df ret(0,0,0, 0,0,0); @@ -1352,7 +1352,7 @@ void CAttributes::setAttribute(const c8* attributeName, void* userPointer) //! Gets an attribute as user pointer //! \param attributeName: Name of the attribute to get. -void* CAttributes::getAttributeAsUserPointer(const c8* attributeName, void* defaultNotFound) +void* CAttributes::getAttributeAsUserPointer(const c8* attributeName, void* defaultNotFound) const { IAttribute* att = getAttributeP(attributeName); if (att) @@ -1363,7 +1363,7 @@ void* CAttributes::getAttributeAsUserPointer(const c8* attributeName, void* defa //! Gets an attribute as user pointer //! \param index: Index value, must be between 0 and getAttributeCount()-1. -void* CAttributes::getAttributeAsUserPointer(s32 index) +void* CAttributes::getAttributeAsUserPointer(s32 index) const { void* value = 0; diff --git a/source/Irrlicht/CAttributes.h b/source/Irrlicht/CAttributes.h index 87b4d118..e3feb091 100644 --- a/source/Irrlicht/CAttributes.h +++ b/source/Irrlicht/CAttributes.h @@ -34,27 +34,27 @@ public: //! Returns attribute name by index. //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual const c8* getAttributeName(s32 index) _IRR_OVERRIDE_; + virtual const c8* getAttributeName(s32 index) const _IRR_OVERRIDE_; //! Returns the type of an attribute //! \param attributeName: Name for the attribute - virtual E_ATTRIBUTE_TYPE getAttributeType(const c8* attributeName) _IRR_OVERRIDE_; + virtual E_ATTRIBUTE_TYPE getAttributeType(const c8* attributeName) const _IRR_OVERRIDE_; //! Returns attribute type by index. //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual E_ATTRIBUTE_TYPE getAttributeType(s32 index) _IRR_OVERRIDE_; + virtual E_ATTRIBUTE_TYPE getAttributeType(s32 index) const _IRR_OVERRIDE_; //! Returns the type string of the attribute //! \param attributeName: String for the attribute type //! \param defaultNotFound Value returned when attributeName was not found - virtual const wchar_t* getAttributeTypeString(const c8* attributeName, const wchar_t* defaultNotFound = L"unknown") _IRR_OVERRIDE_; + virtual const wchar_t* getAttributeTypeString(const c8* attributeName, const wchar_t* defaultNotFound = L"unknown") const _IRR_OVERRIDE_; //! Returns the type string of the attribute by index. //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual const wchar_t* getAttributeTypeString(s32 index, const wchar_t* defaultNotFound = L"unknown") _IRR_OVERRIDE_; + virtual const wchar_t* getAttributeTypeString(s32 index, const wchar_t* defaultNotFound = L"unknown") const _IRR_OVERRIDE_; //! Returns if an attribute with a name exists - virtual bool existsAttribute(const c8* attributeName) _IRR_OVERRIDE_; + virtual bool existsAttribute(const c8* attributeName) const _IRR_OVERRIDE_; //! Returns attribute index from name, -1 if not found virtual s32 findAttribute(const c8* attributeName) const _IRR_OVERRIDE_; @@ -113,11 +113,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual f32 getAttributeAsFloat(const c8* attributeName, irr::f32 defaultNotFound=0.f) _IRR_OVERRIDE_; + virtual f32 getAttributeAsFloat(const c8* attributeName, irr::f32 defaultNotFound=0.f) const _IRR_OVERRIDE_; //! Gets an attribute as float value //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual f32 getAttributeAsFloat(s32 index) _IRR_OVERRIDE_; + virtual f32 getAttributeAsFloat(s32 index) const _IRR_OVERRIDE_; //! Sets an attribute as float value virtual void setAttribute(s32 index, f32 value) _IRR_OVERRIDE_; @@ -141,16 +141,16 @@ public: //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() //! or defaultNotFound if attribute is not set. - virtual core::stringc getAttributeAsString(const c8* attributeName, const core::stringc& defaultNotFound=core::stringc()) _IRR_OVERRIDE_; + virtual core::stringc getAttributeAsString(const c8* attributeName, const core::stringc& defaultNotFound=core::stringc()) const _IRR_OVERRIDE_; //! Gets an attribute as string. //! \param attributeName: Name of the attribute to get. //! \param target: Buffer where the string is copied to. - virtual void getAttributeAsString(const c8* attributeName, c8* target) _IRR_OVERRIDE_; + virtual void getAttributeAsString(const c8* attributeName, c8* target) const _IRR_OVERRIDE_; //! Returns attribute value as string by index. //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::stringc getAttributeAsString(s32 index) _IRR_OVERRIDE_; + virtual core::stringc getAttributeAsString(s32 index) const _IRR_OVERRIDE_; //! Sets an attribute value as string. //! \param attributeName: Name for the attribute @@ -171,16 +171,16 @@ public: //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() //! or defaultNotFound if attribute is not set. - virtual core::stringw getAttributeAsStringW(const c8* attributeName, const core::stringw& defaultNotFound = core::stringw()) _IRR_OVERRIDE_; + virtual core::stringw getAttributeAsStringW(const c8* attributeName, const core::stringw& defaultNotFound = core::stringw()) const _IRR_OVERRIDE_; //! Gets an attribute as string. //! \param attributeName: Name of the attribute to get. //! \param target: Buffer where the string is copied to. - virtual void getAttributeAsStringW(const c8* attributeName, wchar_t* target) _IRR_OVERRIDE_; + virtual void getAttributeAsStringW(const c8* attributeName, wchar_t* target) const _IRR_OVERRIDE_; //! Returns attribute value as string by index. //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::stringw getAttributeAsStringW(s32 index) _IRR_OVERRIDE_; + virtual core::stringw getAttributeAsStringW(s32 index) const _IRR_OVERRIDE_; //! Sets an attribute value as string. //! \param attributeName: Name for the attribute @@ -200,11 +200,11 @@ public: //! Gets an attribute as binary data //! \param attributeName: Name of the attribute to get. - virtual void getAttributeAsBinaryData(const c8* attributeName, void* outData, s32 maxSizeInBytes) _IRR_OVERRIDE_; + virtual void getAttributeAsBinaryData(const c8* attributeName, void* outData, s32 maxSizeInBytes) const _IRR_OVERRIDE_; //! Gets an attribute as binary data //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual void getAttributeAsBinaryData(s32 index, void* outData, s32 maxSizeInBytes) _IRR_OVERRIDE_; + virtual void getAttributeAsBinaryData(s32 index, void* outData, s32 maxSizeInBytes) const _IRR_OVERRIDE_; //! Sets an attribute as binary data virtual void setAttribute(s32 index, void* data, s32 dataSizeInBytes) _IRR_OVERRIDE_; @@ -229,11 +229,11 @@ public: //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() //! or defaultNotFound if attribute is not set. - virtual core::array getAttributeAsArray(const c8* attributeName, const core::array& defaultNotFound = core::array()) _IRR_OVERRIDE_; + virtual core::array getAttributeAsArray(const c8* attributeName, const core::array& defaultNotFound = core::array()) const _IRR_OVERRIDE_; //! Returns attribute value as an array of wide strings by index. //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::array getAttributeAsArray(s32 index) _IRR_OVERRIDE_; + virtual core::array getAttributeAsArray(s32 index) const _IRR_OVERRIDE_; //! Sets an attribute as an array of wide strings virtual void setAttribute(s32 index, const core::array& value) _IRR_OVERRIDE_; @@ -254,11 +254,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual bool getAttributeAsBool(const c8* attributeName, bool defaultNotFound=false) _IRR_OVERRIDE_; + virtual bool getAttributeAsBool(const c8* attributeName, bool defaultNotFound=false) const _IRR_OVERRIDE_; //! Gets an attribute as boolean value //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual bool getAttributeAsBool(s32 index) _IRR_OVERRIDE_; + virtual bool getAttributeAsBool(s32 index) const _IRR_OVERRIDE_; //! Sets an attribute as boolean value virtual void setAttribute(s32 index, bool value) _IRR_OVERRIDE_; @@ -282,7 +282,7 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual const c8* getAttributeAsEnumeration(const c8* attributeName, const c8* defaultNotFound = 0) _IRR_OVERRIDE_; + virtual const c8* getAttributeAsEnumeration(const c8* attributeName, const c8* defaultNotFound = 0) const _IRR_OVERRIDE_; //! Gets an attribute as enumeration //! \param attributeName: Name of the attribute to get. @@ -290,23 +290,23 @@ public: //! This is useful when the attribute list maybe was read from an xml file, and only contains the enumeration string, but //! no information about its index. //! \return Returns value of the attribute previously set by setAttribute() - virtual s32 getAttributeAsEnumeration(const c8* attributeName, const c8* const* enumerationLiteralsToUse) _IRR_OVERRIDE_; + virtual s32 getAttributeAsEnumeration(const c8* attributeName, const c8* const* enumerationLiteralsToUse) const _IRR_OVERRIDE_; //! Gets an attribute as enumeration //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual s32 getAttributeAsEnumeration(s32 index, const c8* const* enumerationLiteralsToUse) _IRR_OVERRIDE_; + virtual s32 getAttributeAsEnumeration(s32 index, const c8* const* enumerationLiteralsToUse) const _IRR_OVERRIDE_; //! Gets an attribute as enumeration //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual const c8* getAttributeAsEnumeration(s32 index) _IRR_OVERRIDE_; + virtual const c8* getAttributeAsEnumeration(s32 index) const _IRR_OVERRIDE_; //! Gets the list of enumeration literals of an enumeration attribute //! \param attributeName: Name of the attribute to get. - virtual void getAttributeEnumerationLiteralsOfEnumeration(const c8* attributeName, core::array& outLiterals) _IRR_OVERRIDE_; + virtual void getAttributeEnumerationLiteralsOfEnumeration(const c8* attributeName, core::array& outLiterals) const _IRR_OVERRIDE_; //! Gets the list of enumeration literals of an enumeration attribute //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual void getAttributeEnumerationLiteralsOfEnumeration(s32 index, core::array& outLiterals) _IRR_OVERRIDE_; + virtual void getAttributeEnumerationLiteralsOfEnumeration(s32 index, core::array& outLiterals) const _IRR_OVERRIDE_; //! Sets an attribute as enumeration virtual void setAttribute(s32 index, const c8* enumValue, const c8* const* enumerationLiterals) _IRR_OVERRIDE_; @@ -328,11 +328,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual video::SColor getAttributeAsColor(const c8* attributeName, const video::SColor& defaultNotFound = video::SColor(0)) _IRR_OVERRIDE_; + virtual video::SColor getAttributeAsColor(const c8* attributeName, const video::SColor& defaultNotFound = video::SColor(0)) const _IRR_OVERRIDE_; //! Gets an attribute as color //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual video::SColor getAttributeAsColor(s32 index) _IRR_OVERRIDE_; + virtual video::SColor getAttributeAsColor(s32 index) const _IRR_OVERRIDE_; //! Sets an attribute as color virtual void setAttribute(s32 index, video::SColor color) _IRR_OVERRIDE_; @@ -353,11 +353,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual video::SColorf getAttributeAsColorf(const c8* attributeName, const video::SColorf& defaultNotFound = video::SColorf(0)) _IRR_OVERRIDE_; + virtual video::SColorf getAttributeAsColorf(const c8* attributeName, const video::SColorf& defaultNotFound = video::SColorf(0)) const _IRR_OVERRIDE_; //! Gets an attribute as floating point color //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual video::SColorf getAttributeAsColorf(s32 index) _IRR_OVERRIDE_; + virtual video::SColorf getAttributeAsColorf(s32 index) const _IRR_OVERRIDE_; //! Sets an attribute as floating point color virtual void setAttribute(s32 index, video::SColorf color) _IRR_OVERRIDE_; @@ -379,11 +379,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual core::vector3df getAttributeAsVector3d(const c8* attributeName, const core::vector3df& defaultNotFound=core::vector3df(0,0,0)) _IRR_OVERRIDE_; + virtual core::vector3df getAttributeAsVector3d(const c8* attributeName, const core::vector3df& defaultNotFound=core::vector3df(0,0,0)) const _IRR_OVERRIDE_; //! Gets an attribute as 3d vector //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::vector3df getAttributeAsVector3d(s32 index) _IRR_OVERRIDE_; + virtual core::vector3df getAttributeAsVector3d(s32 index) const _IRR_OVERRIDE_; //! Sets an attribute as vector virtual void setAttribute(s32 index, const core::vector3df& v) _IRR_OVERRIDE_; @@ -405,11 +405,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual core::vector2df getAttributeAsVector2d(const c8* attributeName, const core::vector2df& defaultNotFound=core::vector2df(0,0)) _IRR_OVERRIDE_; + virtual core::vector2df getAttributeAsVector2d(const c8* attributeName, const core::vector2df& defaultNotFound=core::vector2df(0,0)) const _IRR_OVERRIDE_; //! Gets an attribute as 3d vector //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::vector2df getAttributeAsVector2d(s32 index) _IRR_OVERRIDE_; + virtual core::vector2df getAttributeAsVector2d(s32 index) const _IRR_OVERRIDE_; //! Sets an attribute as vector virtual void setAttribute(s32 index, const core::vector2df& v) _IRR_OVERRIDE_; @@ -431,11 +431,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual core::position2di getAttributeAsPosition2d(const c8* attributeName, const core::position2di& defaultNotFound=core::position2di(0,0)) _IRR_OVERRIDE_; + virtual core::position2di getAttributeAsPosition2d(const c8* attributeName, const core::position2di& defaultNotFound=core::position2di(0,0)) const _IRR_OVERRIDE_; //! Gets an attribute as position //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::position2di getAttributeAsPosition2d(s32 index) _IRR_OVERRIDE_; + virtual core::position2di getAttributeAsPosition2d(s32 index) const _IRR_OVERRIDE_; //! Sets an attribute as 2d position virtual void setAttribute(s32 index, const core::position2di& v) _IRR_OVERRIDE_; @@ -456,11 +456,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual core::rect getAttributeAsRect(const c8* attributeName, const core::rect& defaultNotFound = core::rect()) _IRR_OVERRIDE_; + virtual core::rect getAttributeAsRect(const c8* attributeName, const core::rect& defaultNotFound = core::rect()) const _IRR_OVERRIDE_; //! Gets an attribute as rectangle //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::rect getAttributeAsRect(s32 index) _IRR_OVERRIDE_; + virtual core::rect getAttributeAsRect(s32 index) const _IRR_OVERRIDE_; //! Sets an attribute as rectangle virtual void setAttribute(s32 index, const core::rect& v) _IRR_OVERRIDE_; @@ -482,11 +482,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual core::dimension2d getAttributeAsDimension2d(const c8* attributeName, const core::dimension2d& defaultNotFound = core::dimension2d()) _IRR_OVERRIDE_; + virtual core::dimension2d getAttributeAsDimension2d(const c8* attributeName, const core::dimension2d& defaultNotFound = core::dimension2d()) const _IRR_OVERRIDE_; //! Gets an attribute as dimension2d //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::dimension2d getAttributeAsDimension2d(s32 index) _IRR_OVERRIDE_; + virtual core::dimension2d getAttributeAsDimension2d(s32 index) const _IRR_OVERRIDE_; //! Sets an attribute as dimension2d virtual void setAttribute(s32 index, const core::dimension2d& v) _IRR_OVERRIDE_; @@ -508,11 +508,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual core::matrix4 getAttributeAsMatrix(const c8* attributeName, const core::matrix4& defaultNotFound=core::matrix4()) _IRR_OVERRIDE_; + virtual core::matrix4 getAttributeAsMatrix(const c8* attributeName, const core::matrix4& defaultNotFound=core::matrix4()) const _IRR_OVERRIDE_; //! Gets an attribute as matrix //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::matrix4 getAttributeAsMatrix(s32 index) _IRR_OVERRIDE_; + virtual core::matrix4 getAttributeAsMatrix(s32 index) const _IRR_OVERRIDE_; //! Sets an attribute as matrix virtual void setAttribute(s32 index, const core::matrix4& v) _IRR_OVERRIDE_; @@ -532,11 +532,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual core::quaternion getAttributeAsQuaternion(const c8* attributeName, const core::quaternion& defaultNotFound=core::quaternion(0,1,0, 0)) _IRR_OVERRIDE_; + virtual core::quaternion getAttributeAsQuaternion(const c8* attributeName, const core::quaternion& defaultNotFound=core::quaternion(0,1,0, 0)) const _IRR_OVERRIDE_; //! Gets an attribute as quaternion //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::quaternion getAttributeAsQuaternion(s32 index) _IRR_OVERRIDE_; + virtual core::quaternion getAttributeAsQuaternion(s32 index) const _IRR_OVERRIDE_; //! Sets an attribute as quaternion virtual void setAttribute(s32 index, const core::quaternion& v) _IRR_OVERRIDE_; @@ -557,11 +557,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual core::aabbox3df getAttributeAsBox3d(const c8* attributeName, const core::aabbox3df& defaultNotFound=core::aabbox3df(0,0,0, 0,0,0)) _IRR_OVERRIDE_; + virtual core::aabbox3df getAttributeAsBox3d(const c8* attributeName, const core::aabbox3df& defaultNotFound=core::aabbox3df(0,0,0, 0,0,0)) const _IRR_OVERRIDE_; //! Gets an attribute as axis aligned bounding box //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::aabbox3df getAttributeAsBox3d(s32 index) _IRR_OVERRIDE_; + virtual core::aabbox3df getAttributeAsBox3d(s32 index) const _IRR_OVERRIDE_; //! Sets an attribute as axis aligned bounding box virtual void setAttribute(s32 index, const core::aabbox3df& v) _IRR_OVERRIDE_; @@ -582,11 +582,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual core::plane3df getAttributeAsPlane3d(const c8* attributeName, const core::plane3df& defaultNotFound=core::plane3df(0,0,0, 0,1,0)) _IRR_OVERRIDE_; + virtual core::plane3df getAttributeAsPlane3d(const c8* attributeName, const core::plane3df& defaultNotFound=core::plane3df(0,0,0, 0,1,0)) const _IRR_OVERRIDE_; //! Gets an attribute as 3d plane //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::plane3df getAttributeAsPlane3d(s32 index) _IRR_OVERRIDE_; + virtual core::plane3df getAttributeAsPlane3d(s32 index) const _IRR_OVERRIDE_; //! Sets an attribute as 3d plane virtual void setAttribute(s32 index, const core::plane3df& v) _IRR_OVERRIDE_; @@ -608,11 +608,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual core::triangle3df getAttributeAsTriangle3d(const c8* attributeName, const core::triangle3df& defaultNotFound = core::triangle3df(core::vector3df(0,0,0), core::vector3df(0,0,0), core::vector3df(0,0,0))) _IRR_OVERRIDE_; + virtual core::triangle3df getAttributeAsTriangle3d(const c8* attributeName, const core::triangle3df& defaultNotFound = core::triangle3df(core::vector3df(0,0,0), core::vector3df(0,0,0), core::vector3df(0,0,0))) const _IRR_OVERRIDE_; //! Gets an attribute as 3d triangle //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::triangle3df getAttributeAsTriangle3d(s32 index) _IRR_OVERRIDE_; + virtual core::triangle3df getAttributeAsTriangle3d(s32 index) const _IRR_OVERRIDE_; //! Sets an attribute as 3d triangle virtual void setAttribute(s32 index, const core::triangle3df& v) _IRR_OVERRIDE_; @@ -634,11 +634,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual core::line2df getAttributeAsLine2d(const c8* attributeName, const core::line2df& defaultNotFound = core::line2df(0,0, 0,0)) _IRR_OVERRIDE_; + virtual core::line2df getAttributeAsLine2d(const c8* attributeName, const core::line2df& defaultNotFound = core::line2df(0,0, 0,0)) const _IRR_OVERRIDE_; //! Gets an attribute as a 2d line //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::line2df getAttributeAsLine2d(s32 index) _IRR_OVERRIDE_; + virtual core::line2df getAttributeAsLine2d(s32 index) const _IRR_OVERRIDE_; //! Sets an attribute as a 2d line virtual void setAttribute(s32 index, const core::line2df& v) _IRR_OVERRIDE_; @@ -660,11 +660,11 @@ public: //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found //! \return Returns value of the attribute previously set by setAttribute() - virtual core::line3df getAttributeAsLine3d(const c8* attributeName, const core::line3df& defaultNotFound=core::line3df(0,0,0, 0,0,0)) _IRR_OVERRIDE_; + virtual core::line3df getAttributeAsLine3d(const c8* attributeName, const core::line3df& defaultNotFound=core::line3df(0,0,0, 0,0,0)) const _IRR_OVERRIDE_; //! Gets an attribute as a 3d line //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual core::line3df getAttributeAsLine3d(s32 index) _IRR_OVERRIDE_; + virtual core::line3df getAttributeAsLine3d(s32 index) const _IRR_OVERRIDE_; //! Sets an attribute as a 3d line virtual void setAttribute(s32 index, const core::line3df& v) _IRR_OVERRIDE_; @@ -685,11 +685,11 @@ public: //! Gets an attribute as texture reference //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found - virtual video::ITexture* getAttributeAsTexture(const c8* attributeName, video::ITexture* defaultNotFound=0) _IRR_OVERRIDE_; + virtual video::ITexture* getAttributeAsTexture(const c8* attributeName, video::ITexture* defaultNotFound=0) const _IRR_OVERRIDE_; //! Gets an attribute as texture reference //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual video::ITexture* getAttributeAsTexture(s32 index) _IRR_OVERRIDE_; + virtual video::ITexture* getAttributeAsTexture(s32 index) const _IRR_OVERRIDE_; //! Sets an attribute as texture reference virtual void setAttribute(s32 index, video::ITexture* texture, const io::path& filename = "") _IRR_OVERRIDE_; @@ -711,11 +711,11 @@ public: //! Gets an attribute as user pointer //! \param attributeName: Name of the attribute to get. //! \param defaultNotFound Value returned when attributeName was not found - virtual void* getAttributeAsUserPointer(const c8* attributeName, void* defaultNotFound = 0) _IRR_OVERRIDE_; + virtual void* getAttributeAsUserPointer(const c8* attributeName, void* defaultNotFound = 0) const _IRR_OVERRIDE_; //! Gets an attribute as user pointer //! \param index: Index value, must be between 0 and getAttributeCount()-1. - virtual void* getAttributeAsUserPointer(s32 index) _IRR_OVERRIDE_; + virtual void* getAttributeAsUserPointer(s32 index) const _IRR_OVERRIDE_; //! Sets an attribute as user pointer virtual void setAttribute(s32 index, void* userPointer) _IRR_OVERRIDE_; diff --git a/source/Irrlicht/CColladaFileLoader.cpp b/source/Irrlicht/CColladaFileLoader.cpp index c4491a3e..1647f8fd 100644 --- a/source/Irrlicht/CColladaFileLoader.cpp +++ b/source/Irrlicht/CColladaFileLoader.cpp @@ -108,7 +108,8 @@ namespace const core::stringc dataName = "data"; const core::stringc wrapsName = "wrap_s"; const core::stringc wraptName = "wrap_t"; - const core::stringc wraprName = "wrap_r"; + const core::stringc wraprName = "wrap_r"; // for downward compatibility to bug in old Irrlicht collada writer. Not standard but we wrote that accidentally up to Irrlicht 1.8, so we should still be able to load those files + const core::stringc wrappName = "wrap_p"; const core::stringc minfilterName = "minfilter"; const core::stringc magfilterName = "magfilter"; const core::stringc mipfilterName = "mipfilter"; @@ -1571,9 +1572,16 @@ void CColladaFileLoader::readEffect(io::IXMLReaderUTF8* reader, SColladaEffect * if ( idx >= 0 ) twv = (video::E_TEXTURE_CLAMP)(effect->Parameters->getAttributeAsInt(idx)); video::E_TEXTURE_CLAMP twr = video::ETC_REPEAT; - idx = effect->Parameters->findAttribute(wraprName.c_str()); + idx = effect->Parameters->findAttribute(wrappName.c_str()); if ( idx >= 0 ) twr = (video::E_TEXTURE_CLAMP)(effect->Parameters->getAttributeAsInt(idx)); + else + { + // for downward compatibility with older Irrlicht collada writer + idx = effect->Parameters->findAttribute(wraprName.c_str()); + if ( idx >= 0 ) + twr = (video::E_TEXTURE_CLAMP)(effect->Parameters->getAttributeAsInt(idx)); + } for (u32 i=0; iwriteClosingTag(L"wrap_t"); Writer->writeLineBreak(); - // WRAP - Writer->writeElement(L"wrap_r", false); + // WRAP + Writer->writeElement(L"wrap_p", false); Writer->writeText(toString((video::E_TEXTURE_CLAMP)layer.TextureWrapW).c_str()); - Writer->writeClosingTag(L"wrap_r"); + Writer->writeClosingTag(L"wrap_p"); Writer->writeLineBreak(); // LINEAR_MIPMAP_LINEAR diff --git a/source/Irrlicht/CD3D9Driver.cpp b/source/Irrlicht/CD3D9Driver.cpp index d8db7034..f63c1254 100644 --- a/source/Irrlicht/CD3D9Driver.cpp +++ b/source/Irrlicht/CD3D9Driver.cpp @@ -35,7 +35,7 @@ CD3D9Driver::CD3D9Driver(const SIrrlichtCreationParameters& params, io::IFileSys D3DLibrary(0), pID3D(0), pID3DDevice(0), BackBufferSurface(0), DepthStencilSurface(0), WindowId(0), SceneSourceRect(0), LastVertexType((video::E_VERTEX_TYPE)-1), VendorID(0), - MaxTextureUnits(0), MaxUserClipPlanes(0), + MaxTextureUnits(0), MaxFixedPipelineTextureUnits(0), MaxUserClipPlanes(0), MaxLightDistance(0.f), LastSetLight(-1), ColorFormat(ECF_A8R8G8B8), DeviceLost(false), DriverWasReset(true), OcclusionQuerySupport(false), @@ -426,7 +426,14 @@ bool CD3D9Driver::initDriver(HWND hwnd, bool pureSoftware) // create materials createMaterialRenderers(); - MaxTextureUnits = core::min_((u32)Caps.MaxSimultaneousTextures, MATERIAL_MAX_TEXTURES); + MaxFixedPipelineTextureUnits = (u32)Caps.MaxSimultaneousTextures; + + u32 maxTextureSamplers = (Caps.PixelShaderVersion >= D3DPS_VERSION(2, 0)) ? 16 : (Caps.PixelShaderVersion >= D3DPS_VERSION(1, 4)) ? + 6 : (Caps.PixelShaderVersion >= D3DPS_VERSION(1, 0)) ? 4 : 0; + + MaxTextureUnits = core::max_(MaxFixedPipelineTextureUnits, maxTextureSamplers); + MaxTextureUnits = core::min_(MaxTextureUnits, MATERIAL_MAX_TEXTURES); + MaxUserClipPlanes = (u32)Caps.MaxUserClipPlanes; OcclusionQuerySupport=(pID3DDevice->CreateQuery(D3DQUERYTYPE_OCCLUSION, NULL) == S_OK); @@ -443,7 +450,7 @@ bool CD3D9Driver::initDriver(HWND hwnd, bool pureSoftware) #endif DriverAttributes->setAttribute("MaxTextures", (s32)MaxTextureUnits); - DriverAttributes->setAttribute("MaxSupportedTextures", (s32)Caps.MaxSimultaneousTextures); + DriverAttributes->setAttribute("MaxSupportedTextures", (s32)MaxTextureUnits); DriverAttributes->setAttribute("MaxLights", (s32)Caps.MaxActiveLights); DriverAttributes->setAttribute("MaxAnisotropy", (s32)Caps.MaxAnisotropy); DriverAttributes->setAttribute("MaxUserClipPlanes", (s32)Caps.MaxUserClipPlanes); @@ -659,8 +666,7 @@ bool CD3D9Driver::queryFeature(E_VIDEO_DRIVER_FEATURE feature) const //! sets transformation -void CD3D9Driver::setTransform(E_TRANSFORMATION_STATE state, - const core::matrix4& mat) +void CD3D9Driver::setTransform(E_TRANSFORMATION_STATE state, const core::matrix4& mat) { Transformation3DChanged = true; @@ -678,15 +684,18 @@ void CD3D9Driver::setTransform(E_TRANSFORMATION_STATE state, case ETS_COUNT: return; default: - if (state-ETS_TEXTURE_0 < MATERIAL_MAX_TEXTURES) { - if (mat.isIdentity()) - pID3DDevice->SetTextureStageState( state - ETS_TEXTURE_0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE ); - else + const s32 stage = state - ETS_TEXTURE_0; + + if (stage < MATERIAL_MAX_TEXTURES && stage < static_cast(MaxFixedPipelineTextureUnits)) { - pID3DDevice->SetTextureStageState( state - ETS_TEXTURE_0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 ); - pID3DDevice->SetTransform((D3DTRANSFORMSTATETYPE)(D3DTS_TEXTURE0+ ( state - ETS_TEXTURE_0 )), - (D3DMATRIX*)((void*)mat.pointer())); + if (mat.isIdentity()) + pID3DDevice->SetTextureStageState(stage, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); + else + { + pID3DDevice->SetTextureStageState(stage, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2); + pID3DDevice->SetTransform((D3DTRANSFORMSTATETYPE)(D3DTS_TEXTURE0 + stage), (D3DMATRIX*)((void*)mat.pointer())); + } } } break; diff --git a/source/Irrlicht/CD3D9Driver.h b/source/Irrlicht/CD3D9Driver.h index 675442bf..2387362e 100644 --- a/source/Irrlicht/CD3D9Driver.h +++ b/source/Irrlicht/CD3D9Driver.h @@ -427,6 +427,7 @@ namespace video u16 VendorID; u32 MaxTextureUnits; + u32 MaxFixedPipelineTextureUnits; u32 MaxUserClipPlanes; f32 MaxLightDistance; s32 LastSetLight; diff --git a/source/Irrlicht/CNullDriver.cpp b/source/Irrlicht/CNullDriver.cpp index 3164861d..e599392d 100644 --- a/source/Irrlicht/CNullDriver.cpp +++ b/source/Irrlicht/CNullDriver.cpp @@ -938,7 +938,7 @@ void CNullDriver::drawPixel(u32 x, u32 y, const SColor & color) } -//! Draws a non filled concyclic regular 2d polyon. +//! Draws a non filled concyclic regular 2d polygon. void CNullDriver::draw2DPolygon(core::position2d center, f32 radius, video::SColor color, s32 count) { diff --git a/source/Irrlicht/CNullDriver.h b/source/Irrlicht/CNullDriver.h index 9f38786a..025599b2 100644 --- a/source/Irrlicht/CNullDriver.h +++ b/source/Irrlicht/CNullDriver.h @@ -219,7 +219,7 @@ namespace video //! Draws a pixel virtual void drawPixel(u32 x, u32 y, const SColor & color) _IRR_OVERRIDE_; - //! Draws a non filled concyclic reqular 2d polyon. + //! Draws a non filled concyclic reqular 2d polygon. virtual void draw2DPolygon(core::position2d center, f32 radius, video::SColor Color, s32 vertexCount) _IRR_OVERRIDE_; @@ -705,13 +705,13 @@ namespace video //! normal map lookup 32 bit version inline f32 nml32(int x, int y, int pitch, int height, s32 *p) const { - if (x < 0) - x = pitch-1; - if (x >= pitch) + if (x < 0) + x = pitch-1; + if (x >= pitch) x = 0; - if (y < 0) - y = height-1; - if (y >= height) + if (y < 0) + y = height-1; + if (y >= height) y = 0; return (f32)(((p[(y * pitch) + x])>>16) & 0xff); } @@ -719,13 +719,13 @@ namespace video //! normal map lookup 16 bit version inline f32 nml16(int x, int y, int pitch, int height, s16 *p) const { - if (x < 0) - x = pitch-1; - if (x >= pitch) + if (x < 0) + x = pitch-1; + if (x >= pitch) x = 0; - if (y < 0) - y = height-1; - if (y >= height) + if (y < 0) + y = height-1; + if (y >= height) y = 0; return (f32) getAverage ( p[(y * pitch) + x] ); diff --git a/source/Irrlicht/CSceneCollisionManager.cpp b/source/Irrlicht/CSceneCollisionManager.cpp index 48b870d2..67ec0aec 100644 --- a/source/Irrlicht/CSceneCollisionManager.cpp +++ b/source/Irrlicht/CSceneCollisionManager.cpp @@ -134,7 +134,7 @@ void CSceneCollisionManager::getPickedNodeBB(ISceneNode* root, // Now transform into world space, since we need to use world space // scales and distances. core::aabbox3df worldBox(objectBox); - current->getAbsoluteTransformation().transformBox(worldBox); + current->getAbsoluteTransformation().transformBoxEx(worldBox); core::vector3df edges[8]; worldBox.getEdges(edges); diff --git a/source/Irrlicht/Irrlicht-gcc.cbp b/source/Irrlicht/Irrlicht-gcc.cbp index 3af109be..31157a8b 100644 --- a/source/Irrlicht/Irrlicht-gcc.cbp +++ b/source/Irrlicht/Irrlicht-gcc.cbp @@ -1,1346 +1,1333 @@ - - - - - - + + + + + + diff --git a/source/Irrlicht/os.cpp b/source/Irrlicht/os.cpp index b4c557db..96b8abdf 100644 --- a/source/Irrlicht/os.cpp +++ b/source/Irrlicht/os.cpp @@ -313,7 +313,8 @@ namespace os timeinfo = localtime(&rawtime); // init with all 0 to indicate error - ITimer::RealTimeDate date={0}; + ITimer::RealTimeDate date; + memset(&date, 0, sizeof(date)); // at least Windows returns NULL on some illegal dates if (timeinfo) { diff --git a/tests/lights.cpp b/tests/lights.cpp index 5c0dce0d..cdc2af5a 100644 --- a/tests/lights.cpp +++ b/tests/lights.cpp @@ -7,7 +7,7 @@ using namespace irr; static bool testLightTypes(video::E_DRIVER_TYPE driverType) { - IrrlichtDevice *device = createDevice (driverType, core::dimension2d(128,128)); + IrrlichtDevice *device = createDevice (driverType, core::dimension2d(256,128)); if (!device) return true; // No error if device does not exist diff --git a/tests/media/Burning's Video-lightType.png b/tests/media/Burning's Video-lightType.png index 161513a18db4d0a95a63d1fbad15782ea36c55b1..a472e92dcc2a6e27115d5ef841ea07dbf484b281 100644 GIT binary patch literal 1573 zcmbuAdpOez7{`Abvz8r)+@)Mva@=LYa!{B{uDOn(MZ{(yijH*Cj^&cvPNdut zX^v~GrKaT?i-c`8LM|tcp7T8CIsf<1`@YZnyzldTpXd9$pEt)9>mUhLfdT*^>4>p& z0|3x&36OsR@5ZRNC_eyz@Eq-|J(7y}ljE@pL|E@qtZqiPZg@GQvCOkTCI{xDA=CH{ zO0iLB9V#Rkp4}_GO-#hwthcI`d>C+61n zT&l%Fk5u|-+*|)H)hUFlG4&I7d|I8 zYxnu;Q<@ZMX#pDdo0urpvKt^P?++EIw1?12g%KPgSHf+!3^+24=SpaJiKcLV=EA-= z)J}Q;VlI&UA)a_WlHP6T+ZH_K^(sAs zC=yXW1(7>Y4#tG*kTWWNAgw{rpo_Ie*Lj9}T9_#K47e!c8)4AYuJsB%g$*z7OcO^1 zVRq&1s(j%DIvO}^W-FGKvxMK*Z4c_mOeWiM#9c3{-VerHU23p4@(jF6%#!nEJ;+|^ z>rpD<7)&%Vhb-ii_3A9IKm|s_90x889}it5Oqyj)bUA@O(LZji?BH6hU#+x#xCcnu z3et&L?174%ETY8in-9RgWELBaxwoVc)t(uLz#FywK;4o`J8HD;xx z!qQqy0c8Z;npXMSeSI0_6fa}Zh*kSC{XUI6`Ug3A`-$qECI*-QW`YR}(~AtxAV@f4 z^p_#&;EgDG&7g_?llUCP5-r`Xl2>igT^25+O*efyEZ3UEk-6=*md)(KuL~^-QnseB zWBPBvAqL7)V$F@ufRCkjl&x5&B%dpn%+JsEyr{2VXwj-mfH6&;+Qez_!3zB1_Q&w> zO^*dlL0m$V%*Pscay6ACQj3i_=^rYd-|e8;?R(IZVn1g6ua&ir`hewPPpW@cQmAx| z2e~Fi{9Sa660t4=7Z?{b5PB=58aVM#cyC6J>jh2RletWH z+!@$j1HE?%))v}2RvLQgIDax5yVIB~j>rhsA&)FlI-j@w%4e?+2d=eKdA6;=8Y1CH znuv?9^6&s{yG*L8>Al`HBpy_7BX9DWfZ~_MJKa7wB$~RRx^GoXM-k=HHZ2L5~dmyTq^ z=W3LbK_kLGc?}Hu*EL5>!Y0BLR7dioGy@%cmvfux*!hfmhVy3+3Rq-How4#-bJ4oGFk$!Dz8py@~dnhR{H}>NXUxxG=5Gw}RWmtRg6?v>Gs= mrC(;l$7W57(vPqY#P5JtlNjhWzU<8RFW_j8wX3rUp!@^!9nIDN literal 921 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1SEZ8zRh7^U{3IKaSW-L^LB2amvo>=o4xb4 z1l5pTY^@E`emoM&;f{3*jPc7Tljqx?d<{VRja%$3Y%j#}lcGB#=9W$ZIlOJKKKZM@{@ zqz2s|Osii>WNuVBpsMKL!y%9yMRQ9VS|gjQOWRs*>}H-L z$aJKI!4Rxem{?|yC!_iY=edfa-&p1xGzS?Z{GdlbL5-yY=nw|+S3E%L6BufDgdF$i zR%J9VSbT1Rj5m{;K~TC!pCse+3;os(t=GR9Djq2O{Y3wPoZjDU{{NWnOy1oP?9M%3 zf6~?l;UBBcT`>8{rLnMflW2g)?OvEr%%R;&l-JvCu3*WR=W}KV_-ZFMVcTEv zn+?6~hXn$*{;%r{|Fi#9rRe1gPq*8j%sN?qprYvJ)vf$%#I+wV*fDKT;tN{R(0nWS zcgd9Raub4oi>NDX{-){eQ1>=?LW9ojERxa>3}E{Y)-ve%Ti*jCGpy8Sk>q%gm67 zXWG`gwcnhPjgv9SsX@Y>>6@_a@trYyIBuM-y;&(0$1+2er2{NC104UvF@fgfJzQ^f z_)&$R!M*8cALMP0GkYx&zTfikdZQz!WfP`>&HAXCz~L@ze=>gTe~DWM4f41I>F diff --git a/tests/media/Burning's Video-rttWith2DImage.png b/tests/media/Burning's Video-rttWith2DImage.png index 4bb33fd672246d01a8bb00b7305580f1d77f65fb..6fedf81dbc1ddebbad03763f2e871354dd68aa60 100644 GIT binary patch literal 14596 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 literal 14138 zcmcIrg;!M1-@f#MG>8ZY2#7RG2n#GJNT+mncXvp)w1i6uN(%@`H!Gs9h)TDxbS<6l z{r>)kch1@6oISJLxpQaciO;i%S{jNZM07*|0FWpv$?JfBBma9ru)%jV)6*gVUP;%4sZOQQ|a(oTzqM*8|7!n{|io}-k2@mxn! zQ*%{M?hDbr&jUJHL#s|3Ut{?P*ttZ{)wP2#%tRBdIKbn`|^va7o0{30q6WZ1S1)SARxQF?z!s01~~E|%cc*Ef68PU zr~Ya+F}tyt%R>k0=}{}_QyXR4Dredn<+3HBFZ9oh@pG9Yw>w(h47k?hO11bNxXmUZ zJ00vb!jCEJYP~#vY;44O!rpPHv>21%^9Pwf1Rz!nNRBGrnGHgdhUNJ3c&P;|jSk_W85@Wz!t*JawN$B*hr*6 z+#UFktG5Y_^ttZ;reZ)ICL`Zh*Nr&PmT-)j-=tjTj;-!@i#7&f)K)JgUROJpS+JJ z%N+9vcA#IXRZCVO@{xp|hEb6d1NSsr@5t7nNpG0`xO}gPr>2@^tcf{+L6Htm+htVQ z3A}ghMep|Gm1O?Xck`dU27mrE0RIy%EbS>SHXUT7d!pHe&BR zP@6bEZDS&dAAH4pZk)FYn{AaoUwXZ5%(Pn1O%kBDNnnK6n;-lHR}w$NLqzWAp}~3gvfOUrEF4k z4&YlI-!PFnpF{Jp`a<>}1s}*hpY&6IX=g;CfQ4lHBphkh_UDi0ue?=9@f$Cxh;gr^ z>X|$hNm@uuD79YAkIwxbhglH-iVwK@9$)8h+sw8~PEAbIRb!(tWgMHq%;XSQ+OQXw z4P54apOpW%47;N-i=Gz$-2z8puCXSMlC~0AH!cJ^ztV_UA@_u>7nbQc_$tzbt)6G%Byd4qNOHIz;ACZ){tkNDiVER`SCtg zXr*z0z5P_v2v#IHG{wgORoU6mGlIc>Y+51rLJ{?VD0b%4R*F0ANTJ8Avm?j-37-2xpr6|xee-Tjhfl1iAw!q7@FroU2rW^rd!SU9;i1D zc*(&R7Ut)10E7B>@$u4^=c^MwK0XY{#4_SOU@3~g`6~^;VOKxKK;T*^PI>|t6d9qT z;pC(yGBX>Mk(m@$&$TmqU_$(*)x_yXp>b;6mA&9Z?z4MZo%bH62;_b@-`%G7Wne53 z7V%flWHZ%C4Py!=cMUnZJaL6}No8!5XVbk9E0jbT=D+T{z+|!|*1L4pZ^Pc{R#Ow< z{l+qVluNHiqWRz2be%2x{W4o7BqWpksK%n(XX9ta#f6xWzFa9e@(`{GSXu&}QBZx8 z{Z@67K_TKvOo>jEyc`AYIFxwO4~v;Goh|E8qahDnDlRsb`b#|7e-}?ihNe~)X-ZmF z43!seuB6vLdv;6O5JRw#qu~ern~uVn8tHg0*M5WD`1sCDFw(DUpPbAmKe-RS`Bdu? z^V0^&)lpA`oo+}P&-%ytNiizfPsZ+JQ6BS>mg!^*&zKj_$keg#?M%y=X0cSr&1LO& zM^h~>wm9;zep@W9Gf3$4gF2y^9SXyMv`I0_{WVTOr9cQ+H-4})dd196nP}Z84|yEZ zQEy{Z$)+6RsSdfRZQKtsukvl@GrA`I_fHvkQ}pId$KlzGu=L%9vCy5tByXbnOQ(CUU^Pz*GO;O8i@>2Od-_m|X9!g}g|<>6y(g?ordNQ?Micb|;}BFJ#DTisrM zg{8fuj$J)>ZZWRY@42>X@KX6w&49#>`YPBRtd}zU$yJ0bQYU>iC=Km4@ySkXVz!1l zxqxl7j04m4)Ak;?{-Cr(Egc;LJt^8MnEGuUq7(tS$ki{)gLROrlZM5E7I$~@w3h(( zd(APphgjM!EUo%04$iiB`ztqzI4i^4wX!GX@oS9Qs~{!?BBXt|{FN=iL@I=-iK?nI zQ4fF*+rcq`DcT?6ca2j%R^pg~co;C2`@Q$}#42r7s~S22OIr;BPp;==K`H&wWVaRt zl@xLe$SVDsT)PX=nbx}dEXL2-j(R_Mu>HDs@bT`XpTJ;dT==^hyO5;hTaEYNa+qIO zsMt=^nK(}o_~@2L&H{Ob9yd%`4Pw0Cr*0NS&*Q9|$r!kFn~{-D7j6T%PE;1y81c|d z)?E=Hy%37LV_rqM>}Pd@Gbf`bE)vr7A>ms;XJ=J8`LrAO%-*<}WMxgj`Hznwub96! zm2nVpMVc@JHav{!bruo(IowVuXrQmdPlofkwve>6M*)HvifaB3^4TIGOFYs`FYfzh z*|&?~=ocw^GB`AbV{V3K)bpHw8gujY5Mn1CZBI5xqz!sCq1zE?tu28O00LOl72x35 zp|ZsI*vBaGRc?ewy;07moDXeG+DOyVHJ2t|gfKBlOI!R4TIu+t!&z9lJNp|Liw!GO zJJbI@uuSLdI{Shrp^Sr9@b;#r)$NMpKykKpH<;WglTA6ZfKK?tIhY1mQZGOx+zSs5 zzWi08nznk-sm0_x<8q~?dsIWaB z@Y0VSJ<4P=%JsWE-ZZcXJ6Rb{u5^kUT&^=|TZp*30Xt+Uu~8GGmfr#|sGLu#SC~3p< z>ufgV3qhRxX{aZ~k7kMpy{&6Y<4VFTMO!>#P~)wvb1EPpOY1uR6|SJIF66x!W--_5 zHff$ zVCmq1PUi1fP>P%wZ zG%|Zn2$`oXS^XT(NTkD6`m<`sk(a}}lYM@qlNJj_vw*B0AlKH*WW6}R$2^!f>yIJYPH5MP3#vpd| zOO+q1@8{2-LMV8aN=4=SotRhs7(AVFKr640a`_|PKMo=e72XM9!OS1%?>~M#A#by7 zjw|G0(l8-9-J4IQ4n7)vnl;MCx2(i=1TG^qCg`1_Fr6DUPo+~qWj+d>7fQny)PjJ% z6u9Fa18Mt&a4DnRKbSdn{TMnli1((gp0WWM+av4W53(CuC;#&uwCxdARZibQ!xx5;)%`#o(NbWZx z2=LK;zGElpVms)b5EM`;Ir&h=`RVK0*e29v!;v~lvpiHz}*Qv+R_bR=a7{X-$ zpd&p8u^z#U=#FP0B9zJ{`8lZPnwo8FyyttZZu77=Gb}>tw2$6Od9&RV-(ha^^SjD8 zG^KB*a(QtoooGi$#yow6!~Q8<4nH8XZZ_+rDd074IM12})Ja5KrvPBncSiWTDIZ!? zBKUYCm)8UVo{iB2WEz^9SAR7G^BHJqr&`@+!A%J^@1|{gTxK}`Mn|Pn2aihujc&G9 z6)wP*p_EX@rd-A|_Tig$s%mD8uw#c_D$r;M>S@NmCn83FsS<59QCuqB`45+18WXxa zG3M-*^R9ULmF)rh6ce}#+TamMXeo02N8GYmG9+#3)qIP~`!b-_NnW5#FmG&)z9bQU z!~B2U7eb|qHQo!@w}+hV`HFXYEK0rmt{xYj+~?KBk(5-%mBgi7UFK+U`HM9=y4a#^ zZ$XQLWh|42yP(p!pmMvTx|){SScE#tm4Y}fB!s|qmSz}QVOhX}0tM-2uncttx4{Te zEPRfKI~haw=q=+zWslk1t(~2@Mw^YkC|1?2NME`_5?_D+y}9($cpQ{yQ+wC153ZESEQ_i~$}#Eds8Ij8?XhSG;TPzE5 z>$k@phni~l_Uf$#$i5>!Vgn>E2gTl0R_)A(_*ybQOyo$HmJ${e6qj@pIT=U`IZGoZ ze#b&#hfFJ7UjF37mr$CY|M2)Doz>OpZa9wZfunBFWD^bzW#c4= z#K_6|KC(4(*Uo48og6}lx>v?QA!lb~KrKegGu2wY9i_x(O=}NhaQE;)N>yaK87WNQ z9@~=)7Uhr9$0b@&^j>s%E%kj#dxTR-2qN8LGa4d-6Ip2w-Uj?Oux|Rxmk(teZ{Lnp z;{N<2hZ4zA@$>gDn{5H1It;v@>1F~v4F?BjN5@$Z7}CDd2qbrZ>`dSO@k67F>{k`V z=Iu)mR%qUw8we~uRW3slG8nMp16g(onYQXLqx&tPw8XgB)zu=-OT$7e$h1d33=Zz@ zdowNE7);hM%kjwxF7{;(w*d(8Gc%NhB5t+1Tu(JpK-M%pJ-T?+9f9t6QEK^sD9&mM z;5eh7ya$|bj~V_THEo(+vUHxTH}2MU>EA6BO?CM@IhD$LgP&?ZFLBw?Jv^^A!9Y*n z>A5_xHkNm{!hgGxp}2QH2HZ8l3gchbR2&?TxxCSE6bV^zQGPok@s_0I{G&&^%bteX z)Wv|R#`|@{a_VY*1*3IrEJ?~lT6X%(iR z=a#S7a3WX`u2xw_67J1i+ErBRIPTS6!^@U_=TW{wh>M+F@PO~zKg_4{av{n@xjI|p zzQAZ6?*5X>Z93~-KRZ)ix$j;>7}znLuHLYYhC;@8ZYCRN#_O2B_oMti``%7Abe}$G zH8WFQy(=CVFTXJ56O{^gv$YMhxBp8f#Ekv?F~y%jUb`X4i1>vi2X?xGWq```Gur8AA6vlL7z^`xh;)N$g&e zHhYb?GtEvfuUvXVcdr)jq$HYov2=v>4>;!C}DoXdA(9xU^iiDK(GWw8UNmPmCT`19$m&(@#YESg^ zc6WAksg+2G<=D!IiT`c=l76f9D3zV{Tu(bdQtDu!zP~xde<#?L`JvG((lqJ1vFBpF5C;dxQP6$5X>DAQ zQ7UL18`zt-OqU{RC9$|OJNk>bJ6K76ba!NN>*($M>sw*OMe(gS`o~-K(!!|zs66vv z!tS;Aj1kUvw>KMP9*aFUjY!6qdMEpLxBH4OUf>fDq%%s2!{OJzUuveNr0gvA-mT?X zFw)X~S@V{jY4<@lcgDwoBsJ*v0$pCND64JBOo)@As}p49XnFkQTXICm^`El|p9=aN z67>mTbs_a{AN2$f#S#HOyox|q4>TI(N}(bmBat`PXacjgb@Qt*yi$FgFMb0U)ZKRP&8)?6 z=jz171ZbR!X3;Y-i4sR+;Y2#O1m9j?491f&Nrj$+S{m#?MMXtC_3fKlm2S0uO&-66 zeIGkJJI@&C8iS0i(kU%Hy`f$ob8&rs{&~9tgTXx2L|k8>BFuScLK1PB;EcLfT||+b z)Iw+qN*yM{3GG_(_O2RJt(bP^Jj0*9e6`0TH?$Qd?M_t=&Wa_@hr^x=;n+s z+|#SxIfR%N)X4nM5#P6^SVoK8F@L}EGSJDSJ(5`OaA(g_evhnt?@+FNfd~=#)Y4Kc z9pUfqA8NnOI(U9x#Ev-pC@U6`B7i7I+#3({o$o;Spx42g)H*GWO4P4{?sc+g@~LJ5 zfH`9$aoAB@l0F^zy!2=6_&uCrdZqVId#>ic9t*p8Jk6G?81NR;=X+i;5STWa>Agkl z$D^pfrpu+rL7h4J4>ahxhKUy7(^+b4lv!C>)9pKP>h$*Z_Dw$1e)NCsny0NBrxq8< zfExWeL3JNrUtyYLbv3oQkp1pF#TRfhB$=M9VY596z}7@1Miz+7l?jmqX{~_}HNyO39&lWbz7R5kJpJv3&Tq@3%_KV2l_ms1(s!4+M z5E&`5%F%iYhkRmgntUg08!aBe31+~v#vBjuJ@XIn^LrRqTD?`Fn&+L*0IYp3*rJLo z2N)v1MB$cr7IAsr2bMmENcg?}tSV;X|HF5F-PFCSuDe&7BPsFpRExO}X>CR?>Yh5h zVq=pBiYjLE%`Fu_U$AT!o>u&ly2liM%$@W(mgRTR z^^xXS705u&;F z@0`uO-rH=lPOr&3`>%Ybg|X{js9Jx0SV7Nk=jfY})FP*(Bo@_7j-)QI6jXf(C+mYe zP8)1n$o&mz@%#iDUbP2Z8$lWsI_xnU!I1)})+n9U0DfWDLg!qMyA_MbZ4v$mrtn+L zx}wOA_mhZY#XiFk408r^{k>t9F?%CEBy`UAMw}z552G^wI1g8LC@dcMhX^rN-&q-s zBM=;+^ni&#lZ8?e(Do!%CG-p zx3O}vv#n;6e0jYUJ1yACbGh1}kFE=;X^y zlk27~;6tmTn=rPlsg|1PB6NX5fuh`@?F9h$c}{(QkfX5Ds^A4PdBTfXte*ZUECwRs5`=&p zBor<24TUX zr+Yhbyy~B?B~e1eHsRs*ohBmcCB9ApoW%qean)oav|pNNN#nN_kH}@0o+#^3%jV{@ zB}T~zGkUDT>UFDiwnm%4ifHn=57lo-9|n$p084A*VJ-ZAe1aDea>W$vSjg<@@S}*2 z=3bNxIXaT{>Tg?u8-J(7-gi+GNk6oPeJlx239jjOBmuCZK|*5cgsoVV*Y(SDCNdZk)v@+%n$Lm03o_6i(9 zaDfgp`Sz|^q0*-ul?u7inER7SIM0kFNUkH>k-&GfIe9hH+`}S?79dAa$q7TYg zE#6KrKeR`yDm%~|bYd^wEDJWKy3fLLl<<^V{#j(*<7X zH+j6jI5YC(5Sv*wxqLM zLlW?k%jB+k!mMfaCjIOklIuhMV7jz8KD*CLmT`Qj2HhVilxij%3MG))W{(i!?>#fG zL5JOJt1>-_jJe+Rh$6Q(^5>x$uBJC5+vs3~fUg9kUc~AjYtj$8B{eR~F72k^5W)6+ zO%OPU8`y5%%B3u_1qgT_{ROBekF;>9CU0v;B3@*MQ>%`Vpkx9P> zv%)upg$^lkgX4klYNwg6C{knS^C!wg_|dud`SW<5ogYjs;KJt*-C?4!GxCL1Lo2$)(>%0#ZD0ZeF>E~2QYpcn;9qawniN(^M9)YJ2e z9p!c;Rycq+a5%G3`Z16JP1B)#c@4VNQIR8Fa2sl&A|WC7QZ2j>4{yH^K;p^Tf`2_H zYY~^LtZJ~!XJuurbP5Ov05Kjc>=DI62ipQKW?Q=>?)Z_&r%ltYX2DPdvZ_(9<_)?u zp}ansC)vbhd~7gM594lblnW&E=7YHmbh{zx5GJ%jhmQu6lVrq|b1#CQ;+Gx`~8|~UrEw%g1BBYO;Pu}oH zwEy{IcbPdp-kis07J5AX-DNUdfFVugmt0u9CXVh?ur_03GfC4tJd(N;bQ|pO0Umnj zdE(q{MS@8or-Xn46hIy}(t4S_H~kTWpduQs`Sa~$+rA=GTQ3#e?%nsCv@?E%+r^sQ~7X!N$=r=aUp{o5tf+nQ%C zL*Xz63Wd?uw+O~Oat-o?>Jb6Hr69f8Q`nEv--7CT6VA`#JL-p5$CcRVARAwp>g+oM z5vq)HNs5ZPHF|?klEIH|gTi2O3?b%Iq9dll2_wA~Kt-P|dYnWygzd&PNadBE8zVd* z0Q?97#Sa8BoL;##|EcM14Z=K!^B=$+j7)E?d0%i!MBHA-Glg$ZS?^)6f74y5JMf-25(!^RpO+{Y#O2nb1;(%kE#t7#o?l)` zGZ78j8qwfBOlKTWdsZQw@2dHJ!m#H-a)wImvxfyz|Gd=~XaKOxmXSaJUJ<>0WyGeP zea+ew$QY*g3}otq%iyM}uI3qgBhve%eGxL||GX2jg)aSEF9E+6Qqwxe4LmbzdN&_; z;CZ74^me18w*MNU%hTN*=RWx}hSSp8)ZeQl%pt1L?GrXKn3RDr*rX(s?Su>`FrzT8 zv*G8<4L2(fu5hpxzgY~-3aWqhD)#4H#{r@u8HqOk3yoB7W0}tTyq&S!qzptXu$a?G9)=MnC+ zEX4PMsW68~^?l(i)j%j+=o&II_QDd>L?7c*Iuev3K#sctYk71`8vu%>j{0)F6^}raZ4+n%)g{ln6Y9%H ziY}bZZvGtsY)nIc>n2h{p{x(BD_Y9q=HH%N;E86V8AP-k**+jv3dwd;K8w} zHRio=Vc;&yz#*S}`SRu6c{)EDb8)rLbiHtP3p{CN^8V}=JXiEz8KPQuA+F;f=;p)@ z#}hcH^LX~HHZE)(rd0=CEH2C_SHEtHEcR6btZ4A}Z(nBUUdVd{LF;#|Gi({?R6hoL z@7Yjcx#1ElO+Z9S>hYM4Fr8$`>2Zq-(;@s2uCrJ+Op7z&>a|33*#4#UyLBUZ>WiB} zdnnBqrpwN#q3cLGX_y6&2){mm&~qSTVZl_j-?1LlqaCwAITr(#f4l@nb8+vAl zu0U-?(!&=wDt%K1e620-zHTLa1rR|rCL?g0rOcOcwOnW&H>@4-4^_+F@U+TpGp0k%r?6`p^f9_T~USh?wF57I)&pdg|q!mbA5|aoh&L zAWp)~Wyaz&nS0`NscGrp5=ZFR(}MC~%o-pk@>?|my=xagEowV&?=1)Et9_Th2R&c? z%$#SxdBKrZ2qf^v>XW#uyVuvhUMb__=`0xy!HD=LZ7Gd9RlZAoCM3&5{_EfVLvv3U z&z~qB@o3A~pGiPG>7#G9;ZdqbCzGYI!|iS+&94=L)?l^9vB?j-sDx_G-^x*8YgcUt zmsc!z@IBr+-t=iD$syv-duX%N5v-^vL8&(JX(W}*qxS~%dfi4t7=0L=XMeYHIuigN z^i2}iWlAm{)KZG3><}<@g`gx&{??nh%${C{t{e0Qi)M{}oN1h*j^rc?y*^Ytn{PAH z(=(eiVMq#mX_yOu*&bxtO)5GHUHZ39Vkg=5=hD(I*S#RiSnFt z)9`ykhM|`(-DNa^2sL%R%1TluabMg)4M1v()275phSRhwu)bG%Er`*YX}4^ad9VpL za4m-^PvxP?bbmCUy8OuM=F%><7TrIbd~bZ-wkZo8Wcp><6ULa1v=$I<8!sN(>T%A= zXE&tLt@&vGeM^aLz>9(JlNLt|Qg)@MSc^kSEdNFOeh0O>CPU?RCOt_O{W&v(xp!BK z;6F9{WqFMhA28z85)G4kydH!bx#kTT0~lbbS6YTVW>#xhl?rt7C;82@T1mW3Hm@XYjl_(Em7+E6*5a_Dv4!7C1h>Nj^di~Pg-iY}Q zzg#=36cJql@C$CPGs5SGNF=8jW)(IuAw;rShxhK&)B`n$ZSxY7>cAV1 z;S~cqQk&cIb$EKZ#b98Ojx^)m#ByX}V&dKD;_aeJtcKdBt?B9MfzNT5l|wTdheZ@d zx!ULQEE$f%Ne)IARy@b{#epkiqHc6URLo7&JTtFO4pbo((!r%*XmoRHi;2E-#ip42 z*J3Z-BOCPzJ`0VjZTv~QZL{gmB%=;S$K#>%^rYq0?-2&~8o;pQ>}1!4h?1BF4M+ELGnJU6>Ocy3^@zp=rw_v$I`$|0%QBxl9OeJZ)HYf1dcW#h59 zBP+ebXj_4GrcR>L*C>Y#8yp+Zeb>}vN@9+n5uK;>@xgX1Xtf*r>j9Ej24uy==CC5f znQjT|B*9(!duoI#!iF0nr>U7<>6D=~gbZgU?;|2zoWqBE#_I@UX*=LX_k)wg5KV*= z-GV?L!h3^Hi~$Ymwfg#nKzLd=Ip?_JzsnObRC&xC?v?1?jr%(+0BWYVgM)~jonod; zELA!ti~0PAW0(?5&{_GdRO{8Wy3c>5Ei5WJHq$cdvDz>k-MPydQ0{kFi@o^fJ;(b!ZvT=?P_ps<^4>nJS=A8AcoW($tUYlngnz2M;BxcGP! zLUPQ@{gKhV4`)_Yydn3X0$%N%ot@*o7CY@FPvVmbR$)A$=%5AZqX7q>5!%a<@M#+3 z7}{dlVGf8KGx?k1Ub!k9K(%bREr_nN_dr{(s=?ATu!E5}mgP;xnU^}f^YdJx2YJ!@ z7r>lAqPLBw=f~dOySa8DDymK6D1mt456hmT1q@8q0v~kkf4r5*PzoJmT3cycd0uK> zi)JcLL3mCeOp1-APVJ0dw8!8s1tD~1W<&P>)Hpyl{wBDL&>`pGl%Ru_eQcS;{XmKeF37OQZX;)+4g_$#dyvaOzSQcao9bT&84NkH3ld_eeURk$61GyJCru0_z#1BzhVY8mnAeNQ1NkeAkvd_ zeOTW-c`9XhSj;NBF5LLDPF42UnogB2Xi}~ThHJd%H}5<(kp<-X(xLo>^YeXPeHi8> z`CQPq&UN8`-RO3{goED)OS{_cz1>cw7v&51RFZx<5*s%&fPsI)cAI@MNN7No1XFQp zF}@k*Kh@AM#|F}B+FPc17O;N)to4zpTbH69P-4L&7niuA)7~eDcs&Xge-%p&iWI3F zOJzf2+-Hfef^#(*bh#>YlqbPxf?2>1=m-iCOCwO$(^G(03L3z)plD5x;O7T}Gv6fB z5%3`IKh=61$8?JZzpXa{?@xB3NVMM5q%pZwe=lrf!P3fD_f7~-()o!NVlam$WaFo? zmVJJGbn-m@Hi$c1oH2i?vT(&f1?a*vrt4up*v`5ECDZiapyC{oS{0P_}2s<7R zi6^u0*!gAXAqQC+i_=ypNA$hJ2G0|y_?AsER^Nl(&u;}pL`CD#J5pG7$r{Rk|fLMRZ>GgB$iaGz!??OqgG*Q zS-N^Y^MWWJ+AthIWwSzc^H0s>rC>>qy6mxb?;Nc=5%*U@D!HWL6);lm!GLD4IY8ZY z!Gs1uGvIG7N6yzuF^}04ffa{J+^BQ4pD|&;)Mu~fjfV0js<~@g9RGU5) zHGJ!%DEn~1w%$v|{iH94yVu|BuVLb!k8%&WSbSdztE;k6=6{>}_b&+P1vMYSK%cGU z$@~$=k1n-snuw^t`gGrk7-Lc8PM{|Wt7`iS_2wNIxfKZB z{N?lwYEW|zjThkSyHaC+U!h;red!92x;W6+h@?G!7Sn&Ij32tKW{Gexfx}mJe(03>0^^}`7+2BlGY_7#)@I}MoYX1)ms;y5U=qIQ4(!to2}v&& zCySK}%!EH4YIV!z%24|EyXqyFfJC5A&d%CeTC5mIsBCFVNaF{?I}Trtd!#Pq{jges zu!cz)(`R)sAj2-k$lPX*!P7o#Z0+k>liO^}Yt0Q$UIOkl0EKCFowlCU7Y}O@5bg6a z4G9S_Fd!Rw&6=SEXY}|7NPi+vM}mPg)V&&mhLOl8*3ubD=bUuJ4G~*MNP@*++2Q2n zn9An2^sB1jo`jPsC8S@lioe1PobgJD!E;7Y)O{}Sc%u>gaxmh_m=15CVZ@k{e z?12ICU)%F%+r?kGjH+1I2^P!8H~!Y0H5mUf;GpKpAzJ@&jknS(M?EP8Fwa_t(sF87 z=`tW6$5>WA26#U4eR;r? z9rg+&&HT{kBSR?y_U_uTmxo@T_QI&hol2^?yn)BKlhj-?x?RQNM~aRV&zy@my$ORs z4qO_tp~`z4B|ThPuZ#PbF#~`x8|6~u0H2+tBTv}XlYWyOUTr>~5YF&`t|h-1e(!SC z7Fj4YKsH>CS>uNH7MxG$X>;F~{fv9vVCWe8L;zUIBfShFT+BIXr=NyMtkfQCub8er z!nGiI9lX};v40i3k`=Q+GpHg~A|ReVW-%e0tpKx@HhRn-9P4PK^aph;7oC2Y|MkWs z_Jwln-DQ9A2!1im95zxkBxQ8{rM T6;|*!ae%UdhJ3x8<*WY#IEpQd diff --git a/tests/media/Direct3D 9.0-lightType.png b/tests/media/Direct3D 9.0-lightType.png index d8589532ee6a2afd76e189561ebfc75f492584fc..a349a5b562d866c0f84fdf2e6ed51bd1bd9a9d25 100644 GIT binary patch literal 2744 zcmd5;={wX58~)9h!3@SW!bwbV=y23jLW?Cswk&1jIJOBD*~U_hW%vy;uOtc~JH>cW zavb|ILnS3cP8zc?mQXUL8cQR*-v8kJ_-q3}xS!{_@9TQfU7c;^kiQ@S0Fbk{ zv%UZTklhjhrJ=hV@&V%m0LUbJ>oa&#@p1_-8a<$5%S;HmXN^E;Slxm-v_!W1OCPfM z%Fjo;|7fl4O7mDqiSnO7q${7ZRCKjt^9l!XoqA?GvnrKQ0r&ArZ9}bR?5}a-y<_Bf z^JBw<{Zx78rortd2TilM<_+rikALIN&s9MW+W#+byUPP3v6J~DmT);E?N&Q=DjLoL zHChM~^Vk$*HGtPPaq>Jqh#*R=@nu*kbwt^xe4vL~Lp*)sd#*~(1Hgo@y`f}I^X%Q`_$@86U!gHlyChV7!52o2G$R)}K-A-pndFk;02M$GW4KR9Q99%Os!r{_EmceVM1gS*~8`+ox6 z7u31OuZ)3-&h3uaJM)~3;EaQK5VoQ4gd^&F19>QLknpPmUUxJ~6y4ZDa&HZ#Zx^DB zc$X!pSW4MR3#n2+Vx8?7IBA7N>1@3GS5JUPQ-S1p?qboZBT*Zy9p|A0+VT3a3{Wei?3{x)+SGAR?)Ce^w>rKxC}CMiN& zUHUrPeXVm=X#UR#y_Y|6yCq7U1}wRtdXvdTt6WcYH7WLDC#r3906`w}VJ=k|HLga&%pTR&22< zv)QlxiZ5a6n>8z`PyZ!KO2Ga@mGK%>nKmW7>gWU|PbRMCy*PJ}f2ix$)0aQOhcl3k z;R(<(c>9W1+)>g;h2f*z9c8DakM(nFVe>(aGRKSQ*Ms;GvkCSYRnU5svY5?ne@Y(F zk~jb&em_L+mdcZG5#swxC>(AY|Kmvod?kE8}h*V0d1N2hRW zlh`5;;$R{_pNN#wPVkbcgw`X%#of>Id2RVJL3}x=Vfd=n+1}4*Ejqkvqqf-tuKgZZ z2%)1RA|w(IUZ?XGlzSYmK8{Izchzdo^A961D4qg*7aZj_prhp0_$yZOYIVTOkRkTYM}IH1dg>u9X(7ywdZXA;3vBC_jIKt(cKFeMeoVc8RgJd)ytdxC&Jal zO2%>H)P2}CXfrv9Gf|Ykt~$>X>pgl_f5-xe&cQeZ}V?bN;W>iWt%g4Y9h;<9cghoBe$gpV~13YV_4bp+1d! za(4T{%>zEuXsh|5b_-6$SwJ7Oi;7Q+ju9*c^I!5F?cDeIElly-aC7?<_ce3w=wTSQBk5gckLUc(O)<`4@8aSlGf2!4Ox5QS<$WF7 zX&2zx1BPw;a@9u#NmX7yyrX;<8e;b_7IP6!oyotqrdZ0gRwP^a#&9N8 zR4g^anCu0*rPw5Fs<%tMCYbeH-M4Fu+9fe4z+`iF^siXeL!|?x!mZRDlQcP7TH_Xu zP8PfX-^;|efh1iU9xwala8Z&Z-6DVDAGj+-=aL|3W^#<-nA8k=_?oxA|q9*|#HL8W1>wpI_fidBEFG;eP#TF%+=i6aR_X zVQ?j9;81D|OaW(V`=v-B9wkkCwDSRLvPJ$dW%m&2xM+sflOq2%n0&_4SsaPVjD6v< z$Lp){4Llw=BD-Mzr*vjXDav!*d(=jp2wC=k=tRz&^4F@N`!F{cAYW7km9A_!z|F&o zC!H^x7k%t``c1K%g2bd#hL8S<$}G_=tFQUC{{cxo(*qKyTs^RK(dLM^P}(3-cGq4_ zgzktq%}d7|F⪚oPc|xdU!^2?3d*Wka5b|Gn=Is2f{St zJMloQ=yK)za>aUUKTcrFMYw{)Smr5bu*)&R<_OUX-GTa7T6%PyNW&X}p+p?SWR@8FOXEkE=^+BD! zrV4?5lHuVk(P^jSakCi6s0j_|Q==tR%7-i31RT!Pa<)h|a)ms{daqNNp~a4aBUwfa zpZ$H2{2;;uu7EhHZW(bPxWFgstRc-!v(#WmhUKVDxFp?Mh_ngz4VZNL-k><}UD^ zg;BVM0lE)o>zvaaA|I=YPecw-DmPg#uiROJ4RKqYl0pJvZn~Nx_JBx?>{!JN*Lu7N zm|OE)zV+A8GP%Gbwj?mX>y+GQt*6M_0;Q4(!+pE)RGYFytcP8U(!;g?Rm|bKlw^$T zEdUID3w2U8PjM?iom6N@_GPS0PrZp)@T39vNho?EcKvO!s7R6CY3u6s6U}?0o1bdG zgLWn$Yj`4gCS+*ET;*OO9;he~T^(-ve5Knk^)v*0XWkxU4{e4IA&S|e^|z4EiE@EL ZKl8f4PAS^I5B>KswYPD$equ#P{tvI=4*UQB literal 1856 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 Giu^xriT#)W literal 14069 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 diff --git a/tests/media/Irrlicht Software Driver 1.0-rttWith2DImage.png b/tests/media/Irrlicht Software Driver 1.0-rttWith2DImage.png index 1a994bd939b15086ce92bcf8027e2536c243d22c..98cdd8e5cbe7bb8299065d811af095836357ef21 100644 GIT binary patch literal 5859 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 literal 5574 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 N(ALm{*Qh;@`X7Is>$(5{ diff --git a/tests/media/OpenGL-lightType.png b/tests/media/OpenGL-lightType.png index 5e994bd28d92bb9f1614833e6a100f1b858f70f7..46af20bb8993c4189ed74b7eaadcd9fdf63529c4 100644 GIT binary patch literal 5526 zcmV;H6=~{;P)4srw8y(f_GYb=NkwRFbi#T6!|)a?qF!^tqvgj00S+Bv5z2mG+jk63QPp! zml63Plhge`6f%>+WRiR@B9g@_P7uMnZ{OvOrcjsddWdf2w|82$H7hXg*U8dg6tPa6 z#**1j|NP0np9jC`P8f>)M^V3+vP}fz?>5Bg)QM-S$!F;_)6rT0oi0GbogU)&djyB# zO&Wsi-AP2h68thK)j(4L9FqJT$o@m9e=Or|;IZxO=1W6CI{|z)>~Ce(P#z)6=9`x} z*QlG%TKZ)W!7y`x6S2RE&54pCu|vNq+9o{JNk2g&0qpOehGqZGks)f_3Vf$Kd-_Hi zXd!?X!u}BqLS{R|KLPM4AuEGMp~vcwzH3if(ilb?0DL-|673Xkj;Bh06qA1z`+IUXtF_J0rXCBV~`{Q&R|;Qoy3ZvcPancu~#@EFu=*gXHSm5^OqmJvBnB!DrKAJgm$ zfG+{QkZitK3%@mI|4{+KZ&t8*?-XBL+btCA9sxQfKRL4}fF~cZo&W&gqqFltRN*mb z1+t?(UA`@YA`Q&pEox5mLASKOWqH50qptzJ2l%sd3zhv@RBd z(H^zIu&24Ajg$0FHalCip*ql00HM>}#AE55{Ja*P0KVRS+x4SA?=SPs1+=c5A=s<@ z@MQmf_ph}?rE;=Ka6{BwRJ83sw(Y__pMGw>-au^88bbymvfs8AgXAepOTkTBFAxn^GIej~xL*GH4L{z5!o!DPs<`<8%C5!CbK#T)^>N~k^ zn`Ng2ZXEZ5jIQqAZ{L>vl@za(gw~=pIw87zsH1)X*ZpB3f`cN!{>jgP?C&RoCYhne zd+0-bQjYSzR0AWuA*KoZ!|2EU;&MYth%L^wVydI9T3S$_^SClZxH0M#4tk z1}fRF`TMLMqQW3$H}-u;*v{_1`R>Zt-%tjA4fIHaII_N9SAR7ckv#1!fMjuA~Z&2sv&P!Xf_v|i;UA|att^{C*V4sadKGIkq3|PCe z`OQN?G&1;)j$xQd@IEnG+*dUD39;X9k2Xg2V3ci$GDxdzc^G$rH1<0qfHNROu*+K_ zM|S^F_KU{NUA~k0HE}>}bmg?jcot7S?M3)(Rzl(FAQMEe#{ zNC{jL5ezHM@23aiILYY6#>cOwBtOkmLz@dMS?)1u` zKBExbe}O_cnVo;e8xe*sYa|%|XmHXGYs}*oH z8wz+MuV%UKDT|$F$DgoBWheDH`=fNs-v1%cqCo_wN`bn%f8LlaWO<+U&{5LcRjp5P zz}m^=8VFHeWWUB>BO2Iwj@V(`{lk&(2QUn3i0*g)9ya)QVSnOkmi^gknG*Pr3}Dg& zVm6imDH9n)i2f8P|Sxeu;HznGBq`X1hk&X}|mGv28OaY(p8kj;ExOZsVB zt8@Bl{P* z&Rh6$+wMzKg{FbDRVonP*SUWjfV=zf`{J^+aMtY-ai-C-a3|P#6oL*lP zz@7SYPzl)gld2X0@PWh=p}``62oKl&?%yD^v7zQcvyML%3LL*i?%7dr#sLn$@4q1y zrt*!6p+E^-24X1C(xC{>AOMb?-M?Rf+{Knr-@|gdD(XQTA%X4wvA-9o4{PJh3U|y! z(I6BGA{gnt9(!=yk? zbk$g;`{!k2F$|pk{<1Axly)N>A_FE90FC-r6a+B!uc%uMw{-wFHULa+trIO5I!y|s zp_tYpWu2SwLd|}O``7xkRY4s8w5`q(? zfn`AE1DyTheIYv+ieTXP15`SD%`rPSG#KpMOV;s=HU{qv(&J@jWpP$Of`H-vuc&YZ zxNO-!A@&<5WZ51UDDwf4;=mfouq%SV7!kmUN=X!SE?ygA?{WW{2AsT~9lR&YgQg66`pDiEb=J3_KA^ND+YNJkJ2n01p74 zko$jDcq{_T0GJYh^?+qSPCgF;fY?9i93bkFD_yv=PtC7KH`jbWnAbRQJxhHt)k%d% zMEA#S%Og_)4+04||G8`68L|JqTmU}lVI=i~J6yJLU|EmuUd0pQbXv3^U{F787{qxZ zKto9s6P;Ii3KVt!xN+VVv*0ND!(4nE(NwT+qE|SZ? zFK^IiS`zy`=Yg2rwtM`f`+n~DFY9M&oVNwdWr#t*;P<49B!@-<=#jA$@6pfBn%!~V z53I!#0mvfCfX{<*dh-Uc|IJ!`LhP?O57U}BE!!!C;ro|unNUB47fk~^2xMos6DXsLYJ3LqN+ zCdB*67Xi{xKa)8?S5;&)7V>HLU2`N1|s1KCNiCV;1Pd4mYr5P1Ggk{@xw?7y(J zlPLqDfpqpXiWjjTb`n56q4!U*I1D|Ap@3{i*w2FiPOR-oFbM*f{cl(HH$P*k!}~~{ zB;U^kz=Ht(8kpY<#b-v00NQaKJO?-yH5c2nZ8m)ZNB#rSHRkT0DAng8e+Vghh zWj}v$@BDEM0wm|Tt#rrVrX}{z=%LpRVjDM>hk!1%NI4vExq*R`RmF^_iUt`?DY@5y?3PP!EIIS_^OYBt;_o zVO!Ngfi?-gY}x;a^8Ve}59_xC>0u%K*c^`o^EL>O+yCO(z>c41LH3toZoCWuOsrs- zi8fBI^At$z*0}0~{Ui%|kS4)9vmYPD4DbN(#2%Z&Pfhc0IYbTc*kxxy#JDs&Y9WB) z^S<*1YXvb}Xfedjf3#KF1c1vR-Ry6E&nJufQ15qIpV8x@_os%gYY@0@CC#6O*5Uw( z0DWcxFCzkI@F>t3J+eJ(vJu^XRtXQ=Z+z?T_ZQ`hKs*oGOcKnNQj8}64kz12 z*e|(|-&UhOIO3tWBT_Yt9q2EB5iSow_RRX3tz7`y{gZCB94X0Q z+Oi*KK_i^ri4BaTJz`iBQy}Bg^f}VcD+1J`$yv_ktcK$Ush!^#9f$oG_*NCkf3(a8 zSV4@C7)_7*gaU{je_NIm_hwvpTosAJ*?&3W#=ng@LVYa)B#;&o1lk?=2?bD$edxmd znPH~o#AKED)!1b)0RT&W494HVPtop2^pXTHI0z5KENEiRbsTVs&N}bKq+fFx#>Ai+ zuL3Y3#$4mnJ1>=S?X@5vW<*0_isU?GLoqUNGi_A`Mmviy48}#}$+3q_$HHd3QLy{$ ziB|#iL6+HCRcjGr!cZ{AMl=li__^BcJyzpY0K1^f)fqGz858@2amV~BfLFX|yb53! zc%I@WFW*Y_CRIL?tXrRs6e=(KL{L7jG{FyxsN)P4OxK z6HY?6-522sXMg(P`A`DD!xNQ2EDbNfdlq-s0xwAb`_P5NcWtMf+@O?=w>1tW0NB1b zbbaO`pU3ydpr^Ir4912ty3nzzn$avlsHdUjE)L?X8S^ zVnO41W?2wP;j~x>(rFR*MXI(B%Ha$Gu#e65zB}(%OItNP!1fYy-t!1>+p_H$;8t>Q zjd5LHpoBHxpAUeP|A4fXufi>HoIwER0?%$We-GQME_!_}|4Hxdy4JeD2Dl;ibLwBE zP#~s2ysV*}*Beg&dtOM-z7|&SY$&>X-eSjrMW_B1y}0g9zN3)XZ)m`n41iPs)(*;r z;0W@kg#d~vd!W;*fpggW;@QqG^C-y;AIGa!&ZV}urPj$Hn5dk`dnDq$b4oN0cP}~cKp8HdHqYaN3`p%xDWCV zv?L8&*+OI>J|&@vfoDe|<4a|5P5~J7%`!W*Rn3kTNdu6hKGDFmW&ga@0RF3p3E*k3 zf6Ka$@DspCfR9oH;5S1<-whMe+tjbaIR)T^M+_kwBb7=QX4*Cq4RH4lThim7)!wVu zmExiX_z}-L3hzvI`=0C>Rg4jg>WnS6eLw)}>zzGj9 zC8V`P1HjlX1_2xarY+IMU!X4lZ`bsx$2m!v&qw6`|JdFFva=w3bXv}1u-}Ln#L|cV Y16eN%t{r_WXaE2J07*qoM6N<$f>-j9;{X5v literal 3291 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≈n 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 Giu^xriT#)W literal 14069 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 diff --git a/tests/renderTargetTexture.cpp b/tests/renderTargetTexture.cpp index 65daec33..15d26c22 100644 --- a/tests/renderTargetTexture.cpp +++ b/tests/renderTargetTexture.cpp @@ -9,7 +9,7 @@ using namespace irr; /** This test is very special in its setup, problematic situation was found by stefbuet. */ static bool testWith2DImage(video::E_DRIVER_TYPE driverType) { - IrrlichtDevice *device = createDevice(driverType, core::dimension2d (128, 128)); + IrrlichtDevice *device = createDevice(driverType, core::dimension2d (256, 128)); if (!device) return true; // No error if device does not exist @@ -29,7 +29,7 @@ static bool testWith2DImage(video::E_DRIVER_TYPE driverType) logTestString("Testing driver %ls\n", driver->getName()); video::ITexture *image = driver->getTexture ("../media/irrlichtlogo2.png"); - video::ITexture *RTT_texture = driver->addRenderTargetTexture (core::dimension2d < u32 > (128, 128)); + video::ITexture *RTT_texture = driver->addRenderTargetTexture (core::dimension2d < u32 > (256, 128)); smgr->addCameraSceneNode (0, core::vector3df (100, 100, 100), core::vector3df (0, 0, 0));