diff --git a/examples/30.Profiling/main.cpp b/examples/30.Profiling/main.cpp index 938e9978..e2b3e4b1 100644 --- a/examples/30.Profiling/main.cpp +++ b/examples/30.Profiling/main.cpp @@ -288,9 +288,23 @@ int main() if (driverType==video::EDT_COUNT) return 1; + /* + Profiler is independent of the device - so we can time the device setup + */ + MY_PROFILE(s32 pDev = getProfiler().add(L"createDevice", L"group a");) + MY_PROFILE(getProfiler().start(pDev);) + IrrlichtDevice * device = createDevice(driverType, core::dimension2d(640, 480)); if (device == 0) + { + /* + When working with start/stop you should add a stop to all exit paths. + Although in this case it wouldn't matter as we don't do anything with it when we quit here. + */ + MY_PROFILE(getProfiler().stop(pDev);) return 1; // could not create selected driver. + } + MY_PROFILE(getProfiler().stop(pDev);) video::IVideoDriver* driver = device->getVideoDriver(); IGUIEnvironment* env = device->getGUIEnvironment(); diff --git a/examples/BuildAllExamples.workspace b/examples/BuildAllExamples.workspace index 07c0f451..7ddbb5b4 100644 --- a/examples/BuildAllExamples.workspace +++ b/examples/BuildAllExamples.workspace @@ -27,7 +27,7 @@ - + diff --git a/examples/buildAllExamples.sh b/examples/buildAllExamples.sh index 272a3291..e9de098a 100755 --- a/examples/buildAllExamples.sh +++ b/examples/buildAllExamples.sh @@ -1,7 +1,7 @@ #! /bin/bash [ -z $1 ] || TARGET=$1 [ -z $TARGET ] && TARGET=all -for i in [012]* Demo; do +for i in [0123]* Demo; do echo "Building $i"; pushd $i && make clean $TARGET; popd; diff --git a/include/CProfiler.h b/include/IProfiler.h similarity index 63% rename from include/CProfiler.h rename to include/IProfiler.h index b17babb8..975f728b 100644 --- a/include/CProfiler.h +++ b/include/IProfiler.h @@ -2,23 +2,34 @@ // For conditions of distribution and use, see copyright notice in irrlicht.h // Written by Michael Zeilfelder -#ifndef __PROFILER_H_INCLUDED__ -#define __PROFILER_H_INCLUDED__ +#ifndef __I_PROFILER_H_INCLUDED__ +#define __I_PROFILER_H_INCLUDED__ #include "IrrCompileConfig.h" #include "irrString.h" #include "irrArray.h" #include "ITimer.h" +#include // for INT_MAX (we should have a S32_MAX...) namespace irr { class ITimer; +//! For internal engine use: +//! Code inside IRR_PROFILE is only executed when _IRR_COMPILE_WITH_PROFILING_ is set +//! This allows disabling all profiler code completely by changing that define. +//! It's generally useful to wrap profiler-calls in application code with a similar macro. +#ifdef _IRR_COMPILE_WITH_PROFILING_ + #define IRR_PROFILE(X) X +#else + #define IRR_PROFILE(X) +#endif // IRR_PROFILE + //! Used to store the profile data (and also used for profile group data). struct SProfileData { - friend class CProfiler; + friend class IProfiler; SProfileData() { @@ -66,16 +77,16 @@ struct SProfileData private: - //! Convert the whole data into a string - core::stringw getAsString() const; - - //! Return a string which describes the columns returned by getAsString - static core::stringw makeTitleString(); - // just to be used for searching as it does no initialization besides id SProfileData(u32 id) : Id(id) {} - void reset(); + void reset() + { + CountCalls = 0; + LongestTime = 0; + TimeSum = 0; + LastTimeStarted = 0; + } s32 Id; u32 GroupIndex; @@ -95,13 +106,15 @@ private: // And also why it works with id's instead of strings in the start/stop functions even if it makes using // the class slightly harder. // The class comes without reference-counting because the profiler-instance is never released (TBD). -class IRRLICHT_API CProfiler +class IProfiler { public: //! Constructor. You could use this to create a new profiler, but usually getProfiler() is used to access the global instance. - CProfiler(); + IProfiler() : Timer(0), NextAutoId(INT_MAX) + {} - ~CProfiler(); + virtual ~IProfiler() + {} //! Add an id with given name and group which can be used for profiling with start/stop /** After calling this once you can start/stop profiling for the given id. @@ -109,14 +122,14 @@ public: have been added automatically by the other add function. \param name: Name for displaying profile data. \param groupName: Each id belongs into a group - this helps on displaying profile data. */ - void add(s32 id, const core::stringw &name, const core::stringw &groupName); + inline void add(s32 id, const core::stringw &name, const core::stringw &groupName); //! Add an automatically generated for the given name and group which can be used for profiling with start/stop. /** After calling this once you can start/stop profiling with the returned id. \param name: Name for displaying profile data. \param groupName: Each id belongs into a group - this helps on displaying profile data. \return Automatic id's start at INT_MAX and count down for each new id. If the name already has an id then that id will be returned. */ - s32 add(const core::stringw &name, const core::stringw &groupName); + inline s32 add(const core::stringw &name, const core::stringw &groupName); //! Return the number of profile data blocks. There is one for each id. u32 getProfileDataCount() const @@ -128,7 +141,7 @@ public: /** \param result Receives the resulting data index when one was found. \param name String with name to search for \return true when found, false when not found */ - bool findDataIndex(u32 & result, const core::stringw &name) const; + inline bool findDataIndex(u32 & result, const core::stringw &name) const; //! Get the profile data /** \param index A value between 0 and getProfileDataCount()-1. Indices can change when new id's are added.*/ @@ -140,25 +153,18 @@ public: //! Get the profile data /** \param id Same value as used in ::add \return Profile data for the given id or 0 when it does not exist. */ - const SProfileData* getProfileDataById(u32 id) - { - SProfileData data(id); - s32 idx = ProfileDatas.binary_search(data); - if ( idx >= 0 ) - return &ProfileDatas[idx]; - return NULL; - } + inline const SProfileData* getProfileDataById(u32 id); //! Get the number of profile groups. Will be at least 1. /** NOTE: The first groups is always L"overview" which is an overview for all existing groups */ - u32 getGroupCount() const + inline u32 getGroupCount() const { return ProfileGroups.size(); } //! Get profile data for a group. /** NOTE: The first groups is always L"overview" which is an overview for all existing groups */ - const SProfileData& getGroupData(u32 index) const + inline const SProfileData& getGroupData(u32 index) const { return ProfileGroups[index]; } @@ -167,7 +173,7 @@ public: /** \param result Receives the resulting group index when one was found. \param name String with name to search for \return true when found, false when not found */ - bool findGroupIndex(u32 & result, const core::stringw &name) const; + inline bool findGroupIndex(u32 & result, const core::stringw &name) const; //! Start profile-timing for the given id @@ -179,41 +185,103 @@ public: inline void stop(s32 id); //! Reset profile data for the given id - void resetDataById(s32 id); + inline void resetDataById(s32 id); //! Reset profile data for the given index - void resetDataByIndex(u32 index); + inline void resetDataByIndex(u32 index); //! Reset profile data for a whole group - void resetGroup(u32 index); + inline void resetGroup(u32 index); //! Reset all profile data /** NOTE: This is not deleting id's or groups, just resetting all timers to 0. */ - void resetAll(); + inline void resetAll(); //! Write all profile-data into a string /** \param result Receives the result string. \param includeOverview When true a group-overview is attached first \param suppressUncalled When true elements which got never called are not printed */ - void printAll(core::stringw &result, bool includeOverview=false,bool suppressUncalled=true) const; + virtual void printAll(core::stringw &result, bool includeOverview=false,bool suppressUncalled=true) const = 0; //! Write the profile data of one group into a string /** \param result Receives the result string. \param groupIndex_ */ - void printGroup(core::stringw &result, u32 groupIndex, bool suppressUncalled) const; + virtual void printGroup(core::stringw &result, u32 groupIndex, bool suppressUncalled) const = 0; protected: - u32 addGroup(const core::stringw &name); + inline u32 addGroup(const core::stringw &name); -private: - ITimer * Timer; // I would prefer using os::Timer, but os.h is not in the public interface so far. - s32 NextAutoId; // for giving out id's automatically + // I would prefer using os::Timer, but os.h is not in the public interface so far. + // Timer must be initialized by the implementation. + ITimer * Timer; core::array ProfileDatas; core::array ProfileGroups; + +private: + s32 NextAutoId; // for giving out id's automatically }; -void CProfiler::start(s32 id) +//! Access the Irrlicht profiler object. +/** Profiler is always accessible, except in destruction of global objects. +If you want to get internal profiling information about the engine itself +you will have to re-compile the engine with _IRR_COMPILE_WITH_PROFILING_ enabled. +But you can use the profiler for profiling your own projects without that. */ +IRRLICHT_API IProfiler& IRRCALLCONV getProfiler(); + +//! Class where the objects profile their own life-time. +/** This is a comfort wrapper around the IProfiler start/stop mechanism which is easier to use +when you want to profile a scope. You only have to create an object and it will profile it's own lifetime +for the given id. */ +class CProfileScope +{ +public: + //! Construct with an known id. + /** This is the fastest scope constructor, but the id must have been added before. + \param id Any id which you did add to the profiler before. */ + CProfileScope(s32 id) + : Id(id), Profiler(getProfiler()) + { + Profiler.start(Id); + } + + //! Object will create the given name, groupName combination for the id if it doesn't exist already + /** \param id: Should be >= 0 as negative id's are reserved for Irrlicht. Also very large numbers (near INT_MAX) might + have been created already by the automatic add function of ::IProfiler. + \param name: Name for displaying profile data. + \param groupName: Each id belongs into a group - this helps on displaying profile data. */ + CProfileScope(s32 id, const core::stringw &name, const core::stringw &groupName) + : Id(id), Profiler(getProfiler()) + { + Profiler.add(Id, name, groupName); + Profiler.start(Id); + } + + //! Object will create an id for the given name, groupName combination if they don't exist already + /** Slowest scope constructor, but usually still fine unless speed is very critical. + \param name: Name for displaying profile data. + \param groupName: Each id belongs into a group - this helps on displaying profile data. */ + CProfileScope(const core::stringw &name, const core::stringw &groupName) + : Profiler(getProfiler()) + { + Id = Profiler.add(name, groupName); + Profiler.start(Id); + } + + ~CProfileScope() + { + Profiler.stop(Id); + } + +protected: + s32 Id; + IProfiler& Profiler; +}; + + +// IMPLEMENTATION for in-line stuff + +void IProfiler::start(s32 id) { s32 idx = ProfileDatas.binary_search(SProfileData(id)); if ( idx >= 0 && Timer ) @@ -222,7 +290,7 @@ void CProfiler::start(s32 id) } } -void CProfiler::stop(s32 id) +void IProfiler::stop(s32 id) { if ( Timer ) { @@ -253,71 +321,145 @@ void CProfiler::stop(s32 id) } } -//! Access the Irrlicht profiler object. -/** Profiler is always accessible, except in destruction of global objects. -If you want to get internal profiling information about the engine itself -you will have to re-compile the engine with _IRR_COMPILE_WITH_PROFILING_ enabled. -But you can use the profiler for profiling your own projects without that. */ -IRRLICHT_API CProfiler& IRRCALLCONV getProfiler(); - -//! Class where the objects profile their own life-time. -/** This is a comfort wrapper around the CProfiler start/stop mechanism which is easier to use -when you want to profile a scope. You only have to create an object and it will profile it's own lifetime -for the given id. */ -class CProfileScope +s32 IProfiler::add(const core::stringw &name, const core::stringw &groupName) { -public: - //! Construct with an known id. - /** This is the fastest scope constructor, but the id must have been added before. - \param id Any id which you did add to the profiler before. */ - CProfileScope(s32 id) - : Id(id), Profiler(getProfiler()) + u32 index; + if ( findDataIndex(index, name) ) { - Profiler.start(Id); + add( ProfileDatas[index].Id, name, groupName ); + return ProfileDatas[index].Id; + } + else + { + s32 id = NextAutoId; + --NextAutoId; + add( id, name, groupName ); + return id; + } +} + +void IProfiler::add(s32 id, const core::stringw &name, const core::stringw &groupName) +{ + u32 groupIdx; + if ( !findGroupIndex(groupIdx, groupName) ) + { + groupIdx = addGroup(groupName); } - //! Object will create the given name, groupName combination for the id if it doesn't exist already - /** \param id: Should be >= 0 as negative id's are reserved for Irrlicht. Also very large numbers (near INT_MAX) might - have been created already by the automatic add function of ::CProfiler. - \param name: Name for displaying profile data. - \param groupName: Each id belongs into a group - this helps on displaying profile data. */ - CProfileScope(s32 id, const core::stringw &name, const core::stringw &groupName) - : Id(id), Profiler(getProfiler()) + SProfileData data(id); + s32 idx = ProfileDatas.binary_search(data); + if ( idx < 0 ) { - Profiler.add(Id, name, groupName); - Profiler.start(Id); + data.reset(); + data.GroupIndex = groupIdx; + data.Name = name; + + ProfileDatas.push_back(data); + ProfileDatas.sort(); + } + else + { + // only reset on group changes, otherwise we want to keep the data or coding CProfileScope would become tricky. + if ( groupIdx != ProfileDatas[idx].GroupIndex ) + { + resetDataByIndex((u32)idx); + ProfileDatas[idx].GroupIndex = groupIdx; + } + ProfileDatas[idx].Name = name; + } +} + +u32 IProfiler::addGroup(const core::stringw &name) +{ + SProfileData group; + group.Id = -1; // Id for groups doesn't matter so far + group.Name = name; + ProfileGroups.push_back(group); + return ProfileGroups.size()-1; +} + +bool IProfiler::findDataIndex(u32 & result, const core::stringw &name) const +{ + for ( u32 i=0; i < ProfileDatas.size(); ++i ) + { + if ( ProfileDatas[i].Name == name ) + { + result = i; + return true; + } } - //! Object will create an id for the given name, groupName combination if they don't exist already - /** Slowest scope constructor, but usually still fine unless speed is very critical. - \param name: Name for displaying profile data. - \param groupName: Each id belongs into a group - this helps on displaying profile data. */ - CProfileScope(const core::stringw &name, const core::stringw &groupName) - : Profiler(getProfiler()) + return false; +} + +const SProfileData* IProfiler::getProfileDataById(u32 id) +{ + SProfileData data(id); + s32 idx = ProfileDatas.binary_search(data); + if ( idx >= 0 ) + return &ProfileDatas[idx]; + return NULL; +} + +bool IProfiler::findGroupIndex(u32 & result, const core::stringw &name) const +{ + for ( u32 i=0; i < ProfileGroups.size(); ++i ) { - Id = Profiler.add(name, groupName); - Profiler.start(Id); + if ( ProfileGroups[i].Name == name ) + { + result = i; + return true; + } } - ~CProfileScope() - { - Profiler.stop(Id); - } + return false; +} + +void IProfiler::resetDataById(s32 id) +{ + s32 idx = ProfileDatas.binary_search(SProfileData(id)); + if ( idx >= 0 ) + { + resetDataByIndex((u32)idx); + } +} + +void IProfiler::resetDataByIndex(u32 index) +{ + SProfileData &data = ProfileDatas[index]; + + SProfileData & group = ProfileGroups[data.GroupIndex]; + group.CountCalls -= data.CountCalls; + group.TimeSum -= data.TimeSum; + + data.reset(); +} + +//! Reset profile data for a whole group +void IProfiler::resetGroup(u32 index) +{ + for ( u32 i=0; iwriteText(str.c_str()); } - if (i % maxIndicesPerLine != maxIndicesPerLine) - { - if (i % maxIndicesPerLine == maxIndicesPerLine-1) - Writer->writeLineBreak(); - else - Writer->writeText(L" "); - } + if (i % maxIndicesPerLine == maxIndicesPerLine-1) + Writer->writeLineBreak(); + else + Writer->writeText(L" "); } if ((indexCount-1) % maxIndicesPerLine != maxIndicesPerLine-1) diff --git a/source/Irrlicht/COctreeSceneNode.cpp b/source/Irrlicht/COctreeSceneNode.cpp index a8c23040..52ce73ec 100644 --- a/source/Irrlicht/COctreeSceneNode.cpp +++ b/source/Irrlicht/COctreeSceneNode.cpp @@ -13,7 +13,7 @@ #include "os.h" #include "CShadowVolumeSceneNode.h" #include "EProfileIDs.h" -#include "CProfiler.h" +#include "IProfiler.h" namespace irr { diff --git a/source/Irrlicht/CProfiler.cpp b/source/Irrlicht/CProfiler.cpp index 33d173eb..537bea44 100644 --- a/source/Irrlicht/CProfiler.cpp +++ b/source/Irrlicht/CProfiler.cpp @@ -4,63 +4,16 @@ #include "CProfiler.h" #include "CTimer.h" -#include namespace irr { -IRRLICHT_API CProfiler& IRRCALLCONV getProfiler() +IRRLICHT_API IProfiler& IRRCALLCONV getProfiler() { static CProfiler profiler; return profiler; } - -//! Convert the whole data into a string -core::stringw SProfileData::getAsString() const -{ - if ( CountCalls > 0 ) - { -#ifdef _MSC_VER -#pragma warning(disable:4996) // 'sprintf' was declared deprecated -#endif - // Can't use swprintf as it fails on some platforms (especially mobile platforms) - // Can't use Irrlicht functions because we have no string formatting. - char dummy[1023]; - sprintf(dummy, "%-15.15s%-12u%-12u%-12u%-12u", - core::stringc(Name).c_str(), CountCalls, TimeSum, - TimeSum / CountCalls, LongestTime); - dummy[1022] = 0; - - return core::stringw(dummy); -#ifdef _MSC_VER -#pragma warning(default :4996) // 'sprintf' was declared deprecated -#endif - } - else - { - return Name; - } -} - -//! Return a string which describes the columns returned by getAsString -core::stringw SProfileData::makeTitleString() -{ - return core::stringw("name calls time(sum) time(avg) time(max)"); -} - -void SProfileData::reset() -{ - CountCalls = 0; - LongestTime = 0; - TimeSum = 0; - LastTimeStarted = 0; -} - - - CProfiler::CProfiler() -: Timer(0) -, NextAutoId(INT_MAX) { Timer = new CTimer(true); @@ -73,139 +26,9 @@ CProfiler::~CProfiler() Timer->drop(); } -s32 CProfiler::add(const core::stringw &name, const core::stringw &groupName) -{ - u32 index; - if ( findDataIndex(index, name) ) - { - add( ProfileDatas[index].Id, name, groupName ); - return ProfileDatas[index].Id; - } - else - { - s32 id = NextAutoId; - --NextAutoId; - add( id, name, groupName ); - return id; - } -} - -void CProfiler::add(s32 id, const core::stringw &name, const core::stringw &groupName) -{ - u32 groupIdx; - if ( !findGroupIndex(groupIdx, groupName) ) - { - groupIdx = addGroup(groupName); - } - - SProfileData data(id); - s32 idx = ProfileDatas.binary_search(data); - if ( idx < 0 ) - { - data.reset(); - data.GroupIndex = groupIdx; - data.Name = name; - - ProfileDatas.push_back(data); - ProfileDatas.sort(); - } - else - { - // only reset on group changes, otherwise we want to keep the data or coding CProfileScope would become tricky. - if ( groupIdx != ProfileDatas[idx].GroupIndex ) - { - resetDataByIndex((u32)idx); - ProfileDatas[idx].GroupIndex = groupIdx; - } - ProfileDatas[idx].Name = name; - } -} - -u32 CProfiler::addGroup(const core::stringw &name) -{ - SProfileData group; - group.Id = -1; // Id for groups doesn't matter so far - group.Name = name; - ProfileGroups.push_back(group); - return ProfileGroups.size()-1; -} - -bool CProfiler::findDataIndex(u32 & result, const core::stringw &name) const -{ - for ( u32 i=0; i < ProfileDatas.size(); ++i ) - { - if ( ProfileDatas[i].Name == name ) - { - result = i; - return true; - } - } - - return false; -} - -bool CProfiler::findGroupIndex(u32 & result, const core::stringw &name) const -{ - for ( u32 i=0; i < ProfileGroups.size(); ++i ) - { - if ( ProfileGroups[i].Name == name ) - { - result = i; - return true; - } - } - - return false; -} - -void CProfiler::resetDataById(s32 id) -{ - s32 idx = ProfileDatas.binary_search(SProfileData(id)); - if ( idx >= 0 ) - { - resetDataByIndex((u32)idx); - } -} - -void CProfiler::resetDataByIndex(u32 index) -{ - SProfileData &data = ProfileDatas[index]; - - SProfileData & group = ProfileGroups[data.GroupIndex]; - group.CountCalls -= data.CountCalls; - group.TimeSum -= data.TimeSum; - - data.reset(); -} - -//! Reset profile data for a whole group -void CProfiler::resetGroup(u32 index) -{ - for ( u32 i=0; i 0) + if ( !suppressUncalled || ProfileGroups[i].getCallsCounter() > 0) { - ostream += ProfileGroups[i].getAsString(); + ostream += getAsString(ProfileGroups[i]); ostream += L"\n"; } } @@ -235,14 +58,47 @@ void CProfiler::printGroup(core::stringw &ostream, u32 idxGroup, bool suppressUn { for ( u32 i=0; i 0) - && ProfileDatas[i].GroupIndex == idxGroup ) + if ( (!suppressUncalled || ProfileDatas[i].getCallsCounter() > 0) + && ProfileDatas[i].getGroupIndex() == idxGroup ) { - ostream += ProfileDatas[i].getAsString(); + ostream += getAsString(ProfileDatas[i]); ostream += L"\n"; } } } } +//! Convert the whole data into a string +core::stringw CProfiler::getAsString(const SProfileData& data) const +{ + if ( data.getCallsCounter() > 0 ) + { +#ifdef _MSC_VER +#pragma warning(disable:4996) // 'sprintf' was declared deprecated +#endif + // Can't use swprintf as it fails on some platforms (especially mobile platforms) + // Can't use Irrlicht functions because we have no string formatting. + char dummy[1023]; + sprintf(dummy, "%-15.15s%-12u%-12u%-12u%-12u", + core::stringc(data.getName()).c_str(), data.getCallsCounter(), data.getTimeSum(), + data.getTimeSum() / data.getCallsCounter(), data.getLongestTime()); + dummy[1022] = 0; + + return core::stringw(dummy); +#ifdef _MSC_VER +#pragma warning(default :4996) // 'sprintf' was declared deprecated +#endif + } + else + { + return data.getName(); + } +} + +//! Return a string which describes the columns returned by getAsString +core::stringw CProfiler::makeTitleString() const +{ + return core::stringw("name calls time(sum) time(avg) time(max)"); +} + } // namespace irr diff --git a/source/Irrlicht/CProfiler.h b/source/Irrlicht/CProfiler.h new file mode 100644 index 00000000..d86f9e0a --- /dev/null +++ b/source/Irrlicht/CProfiler.h @@ -0,0 +1,32 @@ +// This file is part of the "Irrlicht Engine". +// For conditions of distribution and use, see copyright notice in irrlicht.h +// Written by Michael Zeilfelder + +#ifndef __C_PROFILER_H_INCLUDED__ +#define __C_PROFILER_H_INCLUDED__ + +#include "IrrCompileConfig.h" +#include "IProfiler.h" + +namespace irr +{ +class CProfiler : public IProfiler +{ +public: + + CProfiler(); + virtual ~CProfiler(); + + //! Write all profile-data into a string + virtual void printAll(core::stringw &result, bool includeOverview,bool suppressUncalled) const _IRR_OVERRIDE_; + + //! Write the profile data of one group into a string + virtual void printGroup(core::stringw &result, u32 groupIndex, bool suppressUncalled) const _IRR_OVERRIDE_; + +protected: + core::stringw makeTitleString() const; + core::stringw getAsString(const SProfileData& data) const; +}; +} // namespace irr + +#endif // __C_PROFILER_H_INCLUDED__ diff --git a/source/Irrlicht/CSceneManager.cpp b/source/Irrlicht/CSceneManager.cpp index c2f8d4b7..1f326427 100644 --- a/source/Irrlicht/CSceneManager.cpp +++ b/source/Irrlicht/CSceneManager.cpp @@ -16,7 +16,7 @@ #include "IWriteFile.h" #include "ISceneLoader.h" #include "EProfileIDs.h" -#include "CProfiler.h" +#include "IProfiler.h" #include "os.h" diff --git a/source/Irrlicht/Irrlicht-gcc.cbp b/source/Irrlicht/Irrlicht-gcc.cbp index 69416ed6..c21fdcdb 100644 --- a/source/Irrlicht/Irrlicht-gcc.cbp +++ b/source/Irrlicht/Irrlicht-gcc.cbp @@ -8,8 +8,8 @@ @@ -410,193 +410,193 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -896,6 +896,7 @@ + @@ -1025,300 +1026,300 @@ - - + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - + - + - - - + + + - + - + - + - - + + - + - + - + - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - - + + - + - - + + - + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - - + + - + - - - - - + + + + + - + - + - + - + - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - + - - + + - - + + - - - + + + - + - - + + - - + + - - - + + + - + diff --git a/source/Irrlicht/Irrlicht10.0.vcxproj b/source/Irrlicht/Irrlicht10.0.vcxproj index fc8234c0..b0237fc0 100644 --- a/source/Irrlicht/Irrlicht10.0.vcxproj +++ b/source/Irrlicht/Irrlicht10.0.vcxproj @@ -838,9 +838,9 @@ - + @@ -923,7 +923,7 @@ - + @@ -969,7 +969,7 @@ - + @@ -986,7 +986,7 @@ - + @@ -1017,6 +1017,7 @@ + @@ -1035,7 +1036,7 @@ - + @@ -1168,7 +1169,7 @@ - + @@ -1247,7 +1248,7 @@ - + @@ -1300,7 +1301,7 @@ - + @@ -1448,7 +1449,7 @@ - + @@ -1579,7 +1580,7 @@ - + diff --git a/source/Irrlicht/Irrlicht10.0.vcxproj.filters b/source/Irrlicht/Irrlicht10.0.vcxproj.filters index b1c913cf..04c2a03b 100644 --- a/source/Irrlicht/Irrlicht10.0.vcxproj.filters +++ b/source/Irrlicht/Irrlicht10.0.vcxproj.filters @@ -111,10 +111,7 @@ - - include - - + include @@ -363,7 +360,7 @@ include\scene - + include\scene @@ -498,7 +495,7 @@ include\gui - + include\gui @@ -549,7 +546,7 @@ include\gui - + include\gui @@ -642,7 +639,7 @@ Irrlicht\scene\loaders - + Irrlicht\scene\loaders @@ -1035,7 +1032,7 @@ Irrlicht\irr - + Irrlicht\irr @@ -1272,7 +1269,7 @@ Irrlicht\gui - + Irrlicht\gui @@ -1384,6 +1381,12 @@ include\video + + include + + + Irrlicht\irr + @@ -1454,7 +1457,7 @@ Irrlicht\scene\loaders - + Irrlicht\scene\loaders @@ -1889,7 +1892,7 @@ Irrlicht\irr - + Irrlicht\irr @@ -2282,7 +2285,7 @@ Irrlicht\gui - + Irrlicht\gui diff --git a/source/Irrlicht/Irrlicht11.0.vcxproj b/source/Irrlicht/Irrlicht11.0.vcxproj index 3dc16a28..190da6a2 100644 --- a/source/Irrlicht/Irrlicht11.0.vcxproj +++ b/source/Irrlicht/Irrlicht11.0.vcxproj @@ -842,7 +842,7 @@ - + @@ -1173,6 +1173,7 @@ + diff --git a/source/Irrlicht/Irrlicht11.0.vcxproj.filters b/source/Irrlicht/Irrlicht11.0.vcxproj.filters index ad776d28..8acde121 100644 --- a/source/Irrlicht/Irrlicht11.0.vcxproj.filters +++ b/source/Irrlicht/Irrlicht11.0.vcxproj.filters @@ -114,7 +114,7 @@ include - + include @@ -1037,6 +1037,9 @@ Irrlicht\irr + + + Irrlicht\irr Irrlicht\irr diff --git a/source/Irrlicht/Irrlicht8.0.vcproj b/source/Irrlicht/Irrlicht8.0.vcproj index e9829991..d311f018 100644 --- a/source/Irrlicht/Irrlicht8.0.vcproj +++ b/source/Irrlicht/Irrlicht8.0.vcproj @@ -587,7 +587,7 @@ > + + diff --git a/source/Irrlicht/Irrlicht9.0.vcproj b/source/Irrlicht/Irrlicht9.0.vcproj index d89c47c1..26ba9882 100644 --- a/source/Irrlicht/Irrlicht9.0.vcproj +++ b/source/Irrlicht/Irrlicht9.0.vcproj @@ -686,7 +686,7 @@ > + + diff --git a/source/Irrlicht/Irrlicht_mobile6.vcproj b/source/Irrlicht/Irrlicht_mobile6.vcproj index 1efea4d3..f9b5c6b0 100644 --- a/source/Irrlicht/Irrlicht_mobile6.vcproj +++ b/source/Irrlicht/Irrlicht_mobile6.vcproj @@ -330,7 +330,7 @@ > + + diff --git a/source/Irrlicht/Irrlicht_xbox.vcproj b/source/Irrlicht/Irrlicht_xbox.vcproj index 71b00609..93852279 100644 --- a/source/Irrlicht/Irrlicht_xbox.vcproj +++ b/source/Irrlicht/Irrlicht_xbox.vcproj @@ -310,7 +310,7 @@ RelativePath="..\..\include\IEventReceiver.h"> + RelativePath="..\..\include\IProfiler.h"> @@ -1443,6 +1443,9 @@ + + diff --git a/source/Irrlicht/SConstruct b/source/Irrlicht/SConstruct index 8b0024c5..bbc03897 100644 --- a/source/Irrlicht/SConstruct +++ b/source/Irrlicht/SConstruct @@ -376,7 +376,7 @@ if "osx" in env["platform"] : # sources of the examples -srcexamples = ["01.HelloWorld", "02.Quake3Map", "03.CustomSceneNode", "04.Movement", "05.UserInterface", "06.2DGraphics", "07.Collision", "08.SpecialFX", "09.Meshviewer", "10.Shaders", "11.PerPixelLighting", "12.TerrainRendering", "13.RenderToTexture", "15.LoadIrrFile", "16.Quake3MapShader", "17.HelloWorld_Mobile", "18.SplitScreen", "19.MouseAndJoystick", "20.ManagedLights", "22.MaterialViewer", "23.SMeshHandling", "24.CursorControl", "25.XmlHandling", "26.OcclusionQuery"] +srcexamples = ["01.HelloWorld", "02.Quake3Map", "03.CustomSceneNode", "04.Movement", "05.UserInterface", "06.2DGraphics", "07.Collision", "08.SpecialFX", "09.Meshviewer", "10.Shaders", "11.PerPixelLighting", "12.TerrainRendering", "13.RenderToTexture", "15.LoadIrrFile", "16.Quake3MapShader", "17.HelloWorld_Mobile", "18.SplitScreen", "19.MouseAndJoystick", "20.ManagedLights", "22.MaterialViewer", "23.SMeshHandling", "24.CursorControl", "25.XmlHandling", "26.OcclusionQuery", "30.Profiling"] if "win" in env["platform"] : srcexamples.append("14.Win32Window") # ===================================================================================================================