diff --git a/ChangeLog.md b/ChangeLog.md index dbf4dfa24..5eb093e46 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -111,6 +111,10 @@ Nazara Engine: - InstancedRenderable::SetMaterial methods are now public. - Fixed Model copy constructor not copying materials - ⚠️ Added InstancedRenderable::Clone() method +- Fixed a lot of classes not having their move constructor/assignation operator marked noexcept +- ⚠️ SocketPoller::Wait now returns the number of socket marked as ready, and takes an additional optional parameter allowing to query the last error. +- SocketPoller will now silently ignore "interrupt errors" +- Added RigidBody2D::ClosestPointQuery Nazara Development Kit: - Added ImageWidget (#139) @@ -160,6 +164,8 @@ Nazara Development Kit: - Fixed Entity::OnEntityDestruction signal not being properly moved and thus not being called. - Fixed EntityOwner move assignment which was losing entity ownership - Add GraphicsComponent:ForEachRenderable method +- Fixed GraphicsComponent reflective material count which was not initialized +- Added PhysicsComponent2D::ClosestPointQuery # 0.4: diff --git a/SDK/include/NDK/BaseComponent.hpp b/SDK/include/NDK/BaseComponent.hpp index 013fe255f..3dd90bb75 100644 --- a/SDK/include/NDK/BaseComponent.hpp +++ b/SDK/include/NDK/BaseComponent.hpp @@ -23,7 +23,7 @@ namespace Ndk using Factory = std::function; BaseComponent(ComponentIndex componentIndex); - BaseComponent(BaseComponent&&) = default; + BaseComponent(BaseComponent&&) noexcept = default; virtual ~BaseComponent(); virtual std::unique_ptr Clone() const = 0; @@ -34,7 +34,7 @@ namespace Ndk inline static ComponentIndex GetMaxComponentIndex(); BaseComponent& operator=(const BaseComponent&) = delete; - BaseComponent& operator=(BaseComponent&&) = default; + BaseComponent& operator=(BaseComponent&&) noexcept = default; protected: BaseComponent(const BaseComponent&) = default; diff --git a/SDK/include/NDK/BaseWidget.hpp b/SDK/include/NDK/BaseWidget.hpp index a8c3e5cd4..12ab85cd1 100644 --- a/SDK/include/NDK/BaseWidget.hpp +++ b/SDK/include/NDK/BaseWidget.hpp @@ -30,7 +30,7 @@ namespace Ndk BaseWidget(BaseWidget* parent); BaseWidget(const BaseWidget&) = delete; - BaseWidget(BaseWidget&&) = default; + BaseWidget(BaseWidget&&) = delete; virtual ~BaseWidget(); template T* Add(Args&&... args); @@ -72,7 +72,7 @@ namespace Ndk void Show(bool show = true); BaseWidget& operator=(const BaseWidget&) = delete; - BaseWidget& operator=(BaseWidget&&) = default; + BaseWidget& operator=(BaseWidget&&) = delete; struct Padding { diff --git a/SDK/include/NDK/Components/GraphicsComponent.hpp b/SDK/include/NDK/Components/GraphicsComponent.hpp index 896e17c09..3e7b05def 100644 --- a/SDK/include/NDK/Components/GraphicsComponent.hpp +++ b/SDK/include/NDK/Components/GraphicsComponent.hpp @@ -28,7 +28,7 @@ namespace Ndk public: using RenderableList = std::vector; - GraphicsComponent(); + inline GraphicsComponent(); inline GraphicsComponent(const GraphicsComponent& graphicsComponent); ~GraphicsComponent() = default; diff --git a/SDK/include/NDK/Components/GraphicsComponent.inl b/SDK/include/NDK/Components/GraphicsComponent.inl index 55e9706fb..adf653351 100644 --- a/SDK/include/NDK/Components/GraphicsComponent.inl +++ b/SDK/include/NDK/Components/GraphicsComponent.inl @@ -10,6 +10,7 @@ namespace Ndk { inline GraphicsComponent::GraphicsComponent() : + m_reflectiveMaterialCount(0), m_scissorRect(-1, -1) { } @@ -22,6 +23,7 @@ namespace Ndk inline GraphicsComponent::GraphicsComponent(const GraphicsComponent& graphicsComponent) : Component(graphicsComponent), HandledObject(graphicsComponent), + m_reflectiveMaterialCount(0), m_boundingVolume(graphicsComponent.m_boundingVolume), m_transformMatrix(graphicsComponent.m_transformMatrix), m_boundingVolumeUpdated(graphicsComponent.m_boundingVolumeUpdated), diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.hpp b/SDK/include/NDK/Components/PhysicsComponent2D.hpp index 5c4081652..efd30602a 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.hpp +++ b/SDK/include/NDK/Components/PhysicsComponent2D.hpp @@ -30,6 +30,8 @@ namespace Ndk void AddImpulse(const Nz::Vector2f& impulse, const Nz::Vector2f& point, Nz::CoordSys coordSys = Nz::CoordSys_Global); void AddTorque(float torque); + bool ClosestPointQuery(const Nz::Vector2f& position, Nz::Vector2f* closestPoint, float* closestDistance) const; + Nz::Rectf GetAABB() const; float GetAngularVelocity() const; Nz::Vector2f GetCenterOfGravity(Nz::CoordSys coordSys = Nz::CoordSys_Local) const; diff --git a/SDK/include/NDK/Components/PhysicsComponent2D.inl b/SDK/include/NDK/Components/PhysicsComponent2D.inl index 03f98bf0b..b6628467d 100644 --- a/SDK/include/NDK/Components/PhysicsComponent2D.inl +++ b/SDK/include/NDK/Components/PhysicsComponent2D.inl @@ -2,6 +2,7 @@ // This file is part of the "Nazara Development Kit" // For conditions of distribution and use, see copyright notice in Prerequisites.hpp +#include #include namespace Ndk @@ -97,6 +98,23 @@ namespace Ndk m_object->AddTorque(torque); } + /*! + * \brief Finds the closest point on the entity relative to a position + * \return True if such a point exists (will return false if no collider exists) + * + * \param position The starting point which will be used for the query + * \param closestPoint The closest point on entity surface + * \param closestDistance The distance between the closest point and the starting point, may be negative if starting point is inside the entity + * + * \remark Produces a NazaraAssert if the physics object is invalid + */ + inline bool PhysicsComponent2D::ClosestPointQuery(const Nz::Vector2f& position, Nz::Vector2f* closestPoint, float* closestDistance) const + { + NazaraAssert(m_object, "Invalid physics object"); + + return m_object->ClosestPointQuery(position, closestPoint, closestDistance); + } + /*! * \brief Gets the AABB of the physics object * \return AABB of the object diff --git a/SDK/include/NDK/System.hpp b/SDK/include/NDK/System.hpp index d1b3cc39e..538fe097c 100644 --- a/SDK/include/NDK/System.hpp +++ b/SDK/include/NDK/System.hpp @@ -17,11 +17,11 @@ namespace Ndk public: System(); System(const System&) = delete; - System(System&&) = default; + System(System&&) noexcept = default; virtual ~System(); System& operator=(const System&) = delete; - System& operator=(System&&) = default; + System& operator=(System&&) noexcept = default; static SystemIndex RegisterSystem(); }; diff --git a/SDK/include/NDK/Widgets/CheckboxWidget.hpp b/SDK/include/NDK/Widgets/CheckboxWidget.hpp index c938740e4..9d175fdbe 100644 --- a/SDK/include/NDK/Widgets/CheckboxWidget.hpp +++ b/SDK/include/NDK/Widgets/CheckboxWidget.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2017 Samy Bensaid +// Copyright (C) 2017 Samy Bensaid // This file is part of the "Nazara Development Kit" // For conditions of distribution and use, see copyright notice in Prerequisites.hpp diff --git a/SDK/src/NDK/Lua/LuaBinding_Network.cpp b/SDK/src/NDK/Lua/LuaBinding_Network.cpp index c54ef89a0..f3f82264a 100644 --- a/SDK/src/NDK/Lua/LuaBinding_Network.cpp +++ b/SDK/src/NDK/Lua/LuaBinding_Network.cpp @@ -266,14 +266,15 @@ namespace Ndk state.SetGlobal("ResolveError"); // Nz::SocketError - static_assert(Nz::SocketError_Max + 1 == 15, "Nz::ResolveError has been updated but change was not reflected to Lua binding"); - state.PushTable(0, 15); + static_assert(Nz::SocketError_Max + 1 == 16, "Nz::SocketError has been updated but change was not reflected to Lua binding"); + state.PushTable(0, 16); { state.PushField("AddressNotAvailable", Nz::SocketError_AddressNotAvailable); state.PushField("ConnectionClosed", Nz::SocketError_ConnectionClosed); state.PushField("ConnectionRefused", Nz::SocketError_ConnectionRefused); state.PushField("DatagramSize", Nz::SocketError_DatagramSize); state.PushField("Internal", Nz::SocketError_Internal); + state.PushField("Interrupted", Nz::SocketError_Interrupted); state.PushField("Packet", Nz::SocketError_Packet); state.PushField("NetworkError", Nz::SocketError_NetworkError); state.PushField("NoError", Nz::SocketError_NoError); diff --git a/build/scripts/common.lua b/build/scripts/common.lua index 6eb1cfa64..5c1298fb1 100644 --- a/build/scripts/common.lua +++ b/build/scripts/common.lua @@ -4,12 +4,13 @@ NazaraBuild = {} local clangGccActions = "action:" .. table.concat({"codeblocks", "codelite", "gmake*", "xcode3", "xcode4"}, " or ") function NazaraBuild:AddExecutablePath(path) - table.insert(self.ExecutableDir, path) + self.ExecutableDir[path] = true + self:AddInstallPath(path) end function NazaraBuild:AddInstallPath(path) - table.insert(self.InstallDir, path) + self.InstallDir[path] = true end function NazaraBuild:FilterLibDirectory(prefix, func) @@ -613,9 +614,15 @@ function NazaraBuild:MakeInstallCommands(infoTable) postbuildmessage("Copying " .. infoTable.Name .. " library and its dependencies to install/executable directories...") -- Copy built file to install directory - for k,installPath in pairs(self.InstallDir) do + local installCommands = {} + for installPath,_ in pairs(self.InstallDir) do local destPath = path.translate(path.isabsolute(installPath) and installPath or "../../" .. installPath) - postbuildcommands({[[xcopy "%{path.translate(cfg.buildtarget.relpath)}" "]] .. destPath .. [[\" /E /Y]]}) + table.insert(installCommands, [[xcopy "%{path.translate(cfg.buildtarget.relpath)}" "]] .. destPath .. [[\" /E /Y]]) + end + table.sort(installCommands) + + for k,command in pairs(installCommands) do + postbuildcommands({command}) end -- Copy additional dependencies to executable directories too @@ -641,10 +648,17 @@ function NazaraBuild:MakeInstallCommands(infoTable) filter("architecture:" .. arch) - for k,execPath in pairs(self.ExecutableDir) do + local executableCommands = {} + for execPath,_ in pairs(self.ExecutableDir) do local srcPath = path.isabsolute(srcPath) and path.translate(srcPath) or [[%{path.translate(cfg.linktarget.relpath:sub(1, -#cfg.linktarget.name - 1) .. "../../]] .. srcPath .. [[")}]] local destPath = path.translate(path.isabsolute(execPath) and execPath or "../../" .. execPath) - postbuildcommands({[[xcopy "]] .. srcPath .. [[" "]] .. destPath .. [[\" /E /Y]]}) + table.insert(executableCommands, [[xcopy "]] .. srcPath .. [[" "]] .. destPath .. [[\" /E /Y]]) + end + + table.sort(executableCommands) + + for k,command in pairs(executableCommands) do + postbuildcommands({command}) end end end diff --git a/include/Nazara/Core/AbstractHash.hpp b/include/Nazara/Core/AbstractHash.hpp index dc227d0f7..e99e174db 100644 --- a/include/Nazara/Core/AbstractHash.hpp +++ b/include/Nazara/Core/AbstractHash.hpp @@ -20,7 +20,7 @@ namespace Nz public: AbstractHash() = default; AbstractHash(const AbstractHash&) = delete; - AbstractHash(AbstractHash&&) = default; + AbstractHash(AbstractHash&&) noexcept = default; virtual ~AbstractHash(); virtual void Append(const UInt8* data, std::size_t len) = 0; @@ -31,7 +31,7 @@ namespace Nz virtual const char* GetHashName() const = 0; AbstractHash& operator=(const AbstractHash&) = delete; - AbstractHash& operator=(AbstractHash&&) = default; + AbstractHash& operator=(AbstractHash&&) noexcept = default; static std::unique_ptr Get(HashType hash); }; diff --git a/include/Nazara/Core/ByteArray.hpp b/include/Nazara/Core/ByteArray.hpp index 9cc226c1d..ac378b366 100644 --- a/include/Nazara/Core/ByteArray.hpp +++ b/include/Nazara/Core/ByteArray.hpp @@ -41,7 +41,7 @@ namespace Nz inline ByteArray(size_type n, value_type value); template ByteArray(InputIterator first, InputIterator last); ByteArray(const ByteArray& other) = default; - ByteArray(ByteArray&& other) = default; + ByteArray(ByteArray&& other) noexcept = default; ~ByteArray() = default; inline iterator Append(const void* buffer, size_type size); diff --git a/include/Nazara/Core/ByteStream.hpp b/include/Nazara/Core/ByteStream.hpp index 58dd138cd..2f1dba4b6 100644 --- a/include/Nazara/Core/ByteStream.hpp +++ b/include/Nazara/Core/ByteStream.hpp @@ -24,7 +24,7 @@ namespace Nz ByteStream(void* ptr, Nz::UInt64 size); ByteStream(const void* ptr, Nz::UInt64 size); ByteStream(const ByteStream&) = delete; - inline ByteStream(ByteStream&& stream); + ByteStream(ByteStream&& stream) noexcept = default; virtual ~ByteStream(); inline Endianness GetDataEndianness() const; @@ -50,7 +50,7 @@ namespace Nz ByteStream& operator<<(const T& value); ByteStream& operator=(const ByteStream&) = delete; - inline ByteStream& operator=(ByteStream&&); + ByteStream& operator=(ByteStream&&) noexcept = default; private: virtual void OnEmptyStream(); diff --git a/include/Nazara/Core/ByteStream.inl b/include/Nazara/Core/ByteStream.inl index afd9f1fd3..b0c4c8233 100644 --- a/include/Nazara/Core/ByteStream.inl +++ b/include/Nazara/Core/ByteStream.inl @@ -16,19 +16,6 @@ namespace Nz m_context.stream = stream; } - /*! - * \brief Constructs a ByteStream object by move semantic - * - * \param stream ByteStream to move into this - */ - - inline ByteStream::ByteStream(ByteStream&& stream) : - m_ownedStream(std::move(stream.m_ownedStream)), - m_context(stream.m_context) - { - stream.m_context.stream = nullptr; - } - /*! * \brief Destructs the object and calls FlushBits * @@ -204,23 +191,6 @@ namespace Nz return *this; } - - /*! - * \brief Moves the other byte stream into this - * \return A reference to this - * - * \param stream ByteStream to move in this - */ - - inline ByteStream& ByteStream::operator=(ByteStream&& stream) - { - m_context = stream.m_context; - m_ownedStream = std::move(stream.m_ownedStream); - - stream.m_context.stream = nullptr; - - return *this; - } } #include diff --git a/include/Nazara/Core/CallOnExit.hpp b/include/Nazara/Core/CallOnExit.hpp index 3b38a3fb2..c4d90e171 100644 --- a/include/Nazara/Core/CallOnExit.hpp +++ b/include/Nazara/Core/CallOnExit.hpp @@ -19,14 +19,14 @@ namespace Nz public: CallOnExit(Func func = nullptr); CallOnExit(const CallOnExit&) = delete; - CallOnExit(CallOnExit&&) = delete; + CallOnExit(CallOnExit&&) noexcept = delete; ~CallOnExit(); void CallAndReset(Func func = nullptr); void Reset(Func func = nullptr); CallOnExit& operator=(const CallOnExit&) = delete; - CallOnExit& operator=(CallOnExit&&) = default; + CallOnExit& operator=(CallOnExit&&) noexcept = default; private: Func m_func; diff --git a/include/Nazara/Core/FileLogger.hpp b/include/Nazara/Core/FileLogger.hpp index 8f4e4fb60..c722b3290 100644 --- a/include/Nazara/Core/FileLogger.hpp +++ b/include/Nazara/Core/FileLogger.hpp @@ -19,7 +19,7 @@ namespace Nz public: FileLogger(const String& logPath = "NazaraLog.log"); FileLogger(const FileLogger&) = default; - FileLogger(FileLogger&&) = default; + FileLogger(FileLogger&&) noexcept = default; ~FileLogger(); void EnableTimeLogging(bool enable); @@ -32,7 +32,7 @@ namespace Nz void WriteError(ErrorType type, const String& error, unsigned int line = 0, const char* file = nullptr, const char* function = nullptr) override; FileLogger& operator=(const FileLogger&) = default; - FileLogger& operator=(FileLogger&&) = default; + FileLogger& operator=(FileLogger&&) noexcept = default; private: File m_outputFile; diff --git a/include/Nazara/Core/GuillotineBinPack.hpp b/include/Nazara/Core/GuillotineBinPack.hpp index d9f2590a5..8c82bb5d5 100644 --- a/include/Nazara/Core/GuillotineBinPack.hpp +++ b/include/Nazara/Core/GuillotineBinPack.hpp @@ -26,7 +26,7 @@ namespace Nz GuillotineBinPack(unsigned int width, unsigned int height); GuillotineBinPack(const Vector2ui& size); GuillotineBinPack(const GuillotineBinPack&) = default; - GuillotineBinPack(GuillotineBinPack&&) = default; + GuillotineBinPack(GuillotineBinPack&&) noexcept = default; ~GuillotineBinPack() = default; void Clear(); @@ -52,7 +52,7 @@ namespace Nz void Reset(const Vector2ui& size); GuillotineBinPack& operator=(const GuillotineBinPack&) = default; - GuillotineBinPack& operator=(GuillotineBinPack&&) = default; + GuillotineBinPack& operator=(GuillotineBinPack&&) noexcept = default; enum FreeRectChoiceHeuristic : int { diff --git a/include/Nazara/Core/MemoryStream.hpp b/include/Nazara/Core/MemoryStream.hpp index fed53fe3b..808b410c8 100644 --- a/include/Nazara/Core/MemoryStream.hpp +++ b/include/Nazara/Core/MemoryStream.hpp @@ -8,6 +8,7 @@ #define NAZARA_MEMORYSTREAM_HPP #include +#include #include namespace Nz @@ -20,7 +21,7 @@ namespace Nz inline MemoryStream(); inline MemoryStream(ByteArray* byteArray, OpenModeFlags openMode = OpenMode_ReadWrite); MemoryStream(const MemoryStream&) = default; - MemoryStream(MemoryStream&&) = default; + MemoryStream(MemoryStream&&) noexcept = default; ~MemoryStream() = default; void Clear(); @@ -36,14 +37,14 @@ namespace Nz bool SetCursorPos(UInt64 offset) override; MemoryStream& operator=(const MemoryStream&) = default; - MemoryStream& operator=(MemoryStream&&) = default; + MemoryStream& operator=(MemoryStream&&) noexcept = default; private: void FlushStream() override; std::size_t ReadBlock(void* buffer, std::size_t size) override; std::size_t WriteBlock(const void* buffer, std::size_t size) override; - ByteArray* m_buffer; + MovablePtr m_buffer; UInt64 m_pos; }; } diff --git a/include/Nazara/Core/ParameterList.hpp b/include/Nazara/Core/ParameterList.hpp index bc0d33a81..4dba23207 100644 --- a/include/Nazara/Core/ParameterList.hpp +++ b/include/Nazara/Core/ParameterList.hpp @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -72,7 +73,7 @@ namespace Nz std::atomic_uint counter; Destructor destructor; - void* ptr; + MovablePtr ptr; }; ParameterType type; @@ -81,6 +82,7 @@ namespace Nz // We define an empty constructor/destructor, to be able to put classes in the union Value() {} Value(const Value&) {} // Placeholder + Value(Value&&) noexcept {} // Placeholder ~Value() {} bool boolVal; diff --git a/include/Nazara/Core/PrimitiveList.hpp b/include/Nazara/Core/PrimitiveList.hpp index 98c132279..34014de47 100644 --- a/include/Nazara/Core/PrimitiveList.hpp +++ b/include/Nazara/Core/PrimitiveList.hpp @@ -19,7 +19,7 @@ namespace Nz public: PrimitiveList() = default; PrimitiveList(const PrimitiveList&) = default; - PrimitiveList(PrimitiveList&&) = default; + PrimitiveList(PrimitiveList&&) noexcept = default; ~PrimitiveList() = default; void AddBox(const Vector3f& lengths, const Vector3ui& subdivision = Vector3ui(0U), const Matrix4f& transformMatrix = Matrix4f::Identity()); @@ -41,7 +41,7 @@ namespace Nz std::size_t GetSize() const; PrimitiveList& operator=(const PrimitiveList&) = default; - PrimitiveList& operator=(PrimitiveList&&) = default; + PrimitiveList& operator=(PrimitiveList&&) noexcept = default; Primitive& operator()(unsigned int i); const Primitive& operator()(unsigned int i) const; diff --git a/include/Nazara/Core/RefCounted.hpp b/include/Nazara/Core/RefCounted.hpp index 421da4c0e..d348d9280 100644 --- a/include/Nazara/Core/RefCounted.hpp +++ b/include/Nazara/Core/RefCounted.hpp @@ -23,7 +23,7 @@ namespace Nz public: RefCounted(bool persistent = true); RefCounted(const RefCounted&) = delete; - RefCounted(RefCounted&&) = default; + RefCounted(RefCounted&&) = delete; virtual ~RefCounted(); void AddReference() const; @@ -37,7 +37,7 @@ namespace Nz bool SetPersistent(bool persistent = true, bool checkReferenceCount = false); RefCounted& operator=(const RefCounted&) = delete; - RefCounted& operator=(RefCounted&&) = default; + RefCounted& operator=(RefCounted&&) = delete; private: std::atomic_bool m_persistent; diff --git a/include/Nazara/Core/SerializationContext.hpp b/include/Nazara/Core/SerializationContext.hpp index 4111f7a7b..122fc41dc 100644 --- a/include/Nazara/Core/SerializationContext.hpp +++ b/include/Nazara/Core/SerializationContext.hpp @@ -10,6 +10,7 @@ #include #include #include +#include #include namespace Nz @@ -18,7 +19,7 @@ namespace Nz struct NAZARA_CORE_API SerializationContext { - Stream* stream; + MovablePtr stream; Endianness endianness = Endianness_BigEndian; //< Default to Big Endian encoding UInt8 readBitPos = 8; //< 8 means no bit is currently read UInt8 readByte; //< Undefined value, will be initialized at the first bit read diff --git a/include/Nazara/Core/StdLogger.hpp b/include/Nazara/Core/StdLogger.hpp index 998ec7b53..5330d22ab 100644 --- a/include/Nazara/Core/StdLogger.hpp +++ b/include/Nazara/Core/StdLogger.hpp @@ -17,7 +17,7 @@ namespace Nz public: StdLogger() = default; StdLogger(const StdLogger&) = default; - StdLogger(StdLogger&&) = default; + StdLogger(StdLogger&&) noexcept = default; ~StdLogger(); void EnableStdReplication(bool enable) override; @@ -28,7 +28,7 @@ namespace Nz void WriteError(ErrorType type, const String& error, unsigned int line = 0, const char* file = nullptr, const char* function = nullptr) override; StdLogger& operator=(const StdLogger&) = default; - StdLogger& operator=(StdLogger&&) = default; + StdLogger& operator=(StdLogger&&) noexcept = default; }; } diff --git a/include/Nazara/Core/Stream.hpp b/include/Nazara/Core/Stream.hpp index 2c140c144..a1f86e12e 100644 --- a/include/Nazara/Core/Stream.hpp +++ b/include/Nazara/Core/Stream.hpp @@ -20,7 +20,7 @@ namespace Nz { public: Stream(const Stream&) = default; - Stream(Stream&&) = default; + Stream(Stream&&) noexcept = default; virtual ~Stream(); virtual bool EndOfStream() const = 0; @@ -52,7 +52,7 @@ namespace Nz inline std::size_t Write(const void* buffer, std::size_t size); Stream& operator=(const Stream&) = default; - Stream& operator=(Stream&&) = default; + Stream& operator=(Stream&&) noexcept = default; protected: inline Stream(StreamOptionFlags streamOptions = StreamOption_None, OpenModeFlags openMode = OpenMode_NotOpen); diff --git a/include/Nazara/Graphics/AbstractRenderQueue.hpp b/include/Nazara/Graphics/AbstractRenderQueue.hpp index f4d268786..341d61607 100644 --- a/include/Nazara/Graphics/AbstractRenderQueue.hpp +++ b/include/Nazara/Graphics/AbstractRenderQueue.hpp @@ -32,7 +32,7 @@ namespace Nz AbstractRenderQueue() = default; AbstractRenderQueue(const AbstractRenderQueue&) = delete; - AbstractRenderQueue(AbstractRenderQueue&&) = default; + AbstractRenderQueue(AbstractRenderQueue&&) noexcept = default; virtual ~AbstractRenderQueue(); // Je ne suis vraiment pas fan du nombre de surcharges pour AddBillboards, @@ -55,7 +55,7 @@ namespace Nz virtual void Clear(bool fully = false); AbstractRenderQueue& operator=(const AbstractRenderQueue&) = delete; - AbstractRenderQueue& operator=(AbstractRenderQueue&&) = default; + AbstractRenderQueue& operator=(AbstractRenderQueue&&) noexcept = default; struct DirectionalLight { diff --git a/include/Nazara/Graphics/AbstractRenderTechnique.hpp b/include/Nazara/Graphics/AbstractRenderTechnique.hpp index 0897c5312..ede4225f7 100644 --- a/include/Nazara/Graphics/AbstractRenderTechnique.hpp +++ b/include/Nazara/Graphics/AbstractRenderTechnique.hpp @@ -22,7 +22,7 @@ namespace Nz public: AbstractRenderTechnique(); AbstractRenderTechnique(const AbstractRenderTechnique&) = delete; - AbstractRenderTechnique(AbstractRenderTechnique&&) = default; + AbstractRenderTechnique(AbstractRenderTechnique&&) noexcept = default; virtual ~AbstractRenderTechnique(); virtual void Clear(const SceneData& sceneData) const = 0; @@ -37,7 +37,7 @@ namespace Nz virtual bool IsInstancingEnabled() const; AbstractRenderTechnique& operator=(const AbstractRenderTechnique&) = delete; - AbstractRenderTechnique& operator=(AbstractRenderTechnique&&) = default; + AbstractRenderTechnique& operator=(AbstractRenderTechnique&&) noexcept = default; protected: bool m_instancingEnabled; diff --git a/include/Nazara/Graphics/ForwardRenderTechnique.hpp b/include/Nazara/Graphics/ForwardRenderTechnique.hpp index 640986e62..f041e1246 100644 --- a/include/Nazara/Graphics/ForwardRenderTechnique.hpp +++ b/include/Nazara/Graphics/ForwardRenderTechnique.hpp @@ -83,9 +83,17 @@ namespace Nz int textureOverlay; }; + struct SpriteBatch + { + std::size_t spriteCount; + const Material* material; + const Texture* overlayTexture; + Recti scissorRect; + }; + mutable std::unordered_map m_shaderUniforms; mutable std::vector m_lights; - mutable std::vector> m_spriteChains; + mutable std::vector m_spriteBatches; Buffer m_vertexBuffer; mutable BasicRenderQueue m_renderQueue; TextureRef m_whiteCubemap; diff --git a/include/Nazara/Graphics/RenderQueue.hpp b/include/Nazara/Graphics/RenderQueue.hpp index 8ddb725ca..0d1f1fb81 100644 --- a/include/Nazara/Graphics/RenderQueue.hpp +++ b/include/Nazara/Graphics/RenderQueue.hpp @@ -19,8 +19,13 @@ namespace Nz using Index = Nz::UInt64; RenderQueueInternal() = default; + RenderQueueInternal(const RenderQueueInternal&) = default; + RenderQueueInternal(RenderQueueInternal&&) = default; ~RenderQueueInternal() = default; + RenderQueueInternal& operator=(const RenderQueueInternal&) = default; + RenderQueueInternal& operator=(RenderQueueInternal&&) = default; + protected: using RenderDataPair = std::pair; @@ -39,7 +44,7 @@ namespace Nz RenderQueue() = default; RenderQueue(const RenderQueue&) = default; - RenderQueue(RenderQueue&&) = default; + RenderQueue(RenderQueue&&) noexcept = default; ~RenderQueue() = default; void Clear(); @@ -55,7 +60,7 @@ namespace Nz inline size_type size() const; RenderQueue& operator=(const RenderQueue&) = default; - RenderQueue& operator=(RenderQueue&&) = default; + RenderQueue& operator=(RenderQueue&&) noexcept = default; private: const RenderData& GetData(std::size_t i) const; diff --git a/include/Nazara/Graphics/Renderable.hpp b/include/Nazara/Graphics/Renderable.hpp index 62cf861c6..22b76d423 100644 --- a/include/Nazara/Graphics/Renderable.hpp +++ b/include/Nazara/Graphics/Renderable.hpp @@ -21,7 +21,7 @@ namespace Nz public: Renderable() = default; Renderable(const Renderable& renderable) = default; - Renderable(Renderable&&) = default; + Renderable(Renderable&&) noexcept = default; virtual ~Renderable(); virtual void AddToRenderQueue(AbstractRenderQueue* renderQueue, const Matrix4f& transformMatrix) const = 0; @@ -33,7 +33,7 @@ namespace Nz virtual void UpdateBoundingVolume(const Matrix4f& transformMatrix); Renderable& operator=(const Renderable& renderable) = default; - Renderable& operator=(Renderable&& renderable) = default; + Renderable& operator=(Renderable&& renderable) noexcept = default; protected: virtual void MakeBoundingVolume() const = 0; diff --git a/include/Nazara/Network/AbstractSocket.hpp b/include/Nazara/Network/AbstractSocket.hpp index 0af1c8b19..315364e8d 100644 --- a/include/Nazara/Network/AbstractSocket.hpp +++ b/include/Nazara/Network/AbstractSocket.hpp @@ -19,7 +19,7 @@ namespace Nz { public: AbstractSocket(const AbstractSocket&) = delete; - AbstractSocket(AbstractSocket&& abstractSocket); + AbstractSocket(AbstractSocket&& abstractSocket) noexcept; virtual ~AbstractSocket(); void Close(); diff --git a/include/Nazara/Network/ENetHost.hpp b/include/Nazara/Network/ENetHost.hpp index d6e1a8018..28a2d2da5 100644 --- a/include/Nazara/Network/ENetHost.hpp +++ b/include/Nazara/Network/ENetHost.hpp @@ -135,7 +135,7 @@ namespace Nz std::vector m_peers; std::vector m_pendingIncomingPackets; std::vector m_pendingOutgoingPackets; - UInt8* m_receivedData; + MovablePtr m_receivedData; Bitset m_dispatchQueue; MemoryPool m_packetPool; IpAddress m_address; diff --git a/include/Nazara/Network/ENetPeer.hpp b/include/Nazara/Network/ENetPeer.hpp index c1822e761..f2435f579 100644 --- a/include/Nazara/Network/ENetPeer.hpp +++ b/include/Nazara/Network/ENetPeer.hpp @@ -1,4 +1,4 @@ -/* +/* Copyright(c) 2002 - 2016 Lee Salzman Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions : @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -176,8 +177,8 @@ namespace Nz static constexpr std::size_t unsequencedWindow = ENetPeer_ReliableWindowSize / 32; - ENetHost* m_host; - IpAddress m_address; /**< Internet address of the peer */ + MovablePtr m_host; + IpAddress m_address; //< Internet address of the peer std::array m_unsequencedWindow; std::bernoulli_distribution m_packetLossProbability; std::list m_dispatchedCommands; diff --git a/include/Nazara/Network/Enums.hpp b/include/Nazara/Network/Enums.hpp index 42089b6a4..dc082deba 100644 --- a/include/Nazara/Network/Enums.hpp +++ b/include/Nazara/Network/Enums.hpp @@ -78,6 +78,7 @@ namespace Nz SocketError_ConnectionRefused, //< The connection attempt was refused SocketError_DatagramSize, //< The datagram size is over the system limit SocketError_Internal, //< The error is coming from the engine + SocketError_Interrupted, //< The operation was interrupted by a signal SocketError_Packet, //< The packet encoding/decoding failed, probably because of corrupted data SocketError_NetworkError, //< The network system has failed (maybe network is down) SocketError_NotInitialized, //< Nazara network has not been initialized diff --git a/include/Nazara/Network/IpAddress.hpp b/include/Nazara/Network/IpAddress.hpp index 965ad924f..9ef8823e7 100644 --- a/include/Nazara/Network/IpAddress.hpp +++ b/include/Nazara/Network/IpAddress.hpp @@ -32,7 +32,7 @@ namespace Nz inline explicit IpAddress(const char* address); inline explicit IpAddress(const String& address); IpAddress(const IpAddress&) = default; - IpAddress(IpAddress&&) = default; + IpAddress(IpAddress&&) noexcept = default; ~IpAddress() = default; bool BuildFromAddress(const char* address); @@ -53,7 +53,7 @@ namespace Nz inline explicit operator bool() const; IpAddress& operator=(const IpAddress&) = default; - IpAddress& operator=(IpAddress&&) = default; + IpAddress& operator=(IpAddress&&) noexcept = default; static String ResolveAddress(const IpAddress& address, String* service = nullptr, ResolveError* error = nullptr); static std::vector ResolveHostname(NetProtocol procol, const String& hostname, const String& protocol = "http", ResolveError* error = nullptr); diff --git a/include/Nazara/Network/RUdpConnection.hpp b/include/Nazara/Network/RUdpConnection.hpp index 64a30c0b8..0740b4647 100644 --- a/include/Nazara/Network/RUdpConnection.hpp +++ b/include/Nazara/Network/RUdpConnection.hpp @@ -1,4 +1,4 @@ -// Copyright (C) 2017 Jérôme Leclercq +// Copyright (C) 2017 Jérôme Leclercq // This file is part of the "Nazara Engine - Network module" // For conditions of distribution and use, see copyright notice in Config.hpp diff --git a/include/Nazara/Network/SocketPoller.hpp b/include/Nazara/Network/SocketPoller.hpp index 9a5af5452..bbe446c08 100644 --- a/include/Nazara/Network/SocketPoller.hpp +++ b/include/Nazara/Network/SocketPoller.hpp @@ -31,7 +31,7 @@ namespace Nz bool RegisterSocket(AbstractSocket& socket, SocketPollEventFlags eventFlags); void UnregisterSocket(AbstractSocket& socket); - bool Wait(int msTimeout); + unsigned int Wait(int msTimeout, SocketError* error = nullptr); SocketPoller& operator=(SocketPoller&&) noexcept = default; diff --git a/include/Nazara/Network/TcpClient.hpp b/include/Nazara/Network/TcpClient.hpp index 39ac2d9ac..43b299994 100644 --- a/include/Nazara/Network/TcpClient.hpp +++ b/include/Nazara/Network/TcpClient.hpp @@ -24,7 +24,7 @@ namespace Nz public: inline TcpClient(); - TcpClient(TcpClient&& tcpClient) = default; + TcpClient(TcpClient&& tcpClient) noexcept = default; ~TcpClient() = default; SocketState Connect(const IpAddress& remoteAddress); diff --git a/include/Nazara/Network/UdpSocket.hpp b/include/Nazara/Network/UdpSocket.hpp index 0b7c8d4d9..47a3a3bbc 100644 --- a/include/Nazara/Network/UdpSocket.hpp +++ b/include/Nazara/Network/UdpSocket.hpp @@ -21,7 +21,7 @@ namespace Nz public: inline UdpSocket(); inline UdpSocket(NetProtocol protocol); - inline UdpSocket(UdpSocket&& udpSocket); + inline UdpSocket(UdpSocket&& udpSocket) noexcept; ~UdpSocket() = default; inline SocketState Bind(UInt16 port); diff --git a/include/Nazara/Network/UdpSocket.inl b/include/Nazara/Network/UdpSocket.inl index ed43b3428..1879c1a8a 100644 --- a/include/Nazara/Network/UdpSocket.inl +++ b/include/Nazara/Network/UdpSocket.inl @@ -33,7 +33,7 @@ namespace Nz * \param udpSocket UdpSocket to move into this */ - inline UdpSocket::UdpSocket(UdpSocket&& udpSocket) : + inline UdpSocket::UdpSocket(UdpSocket&& udpSocket) noexcept : AbstractSocket(std::move(udpSocket)), m_boundAddress(std::move(udpSocket.m_boundAddress)) { diff --git a/include/Nazara/Physics2D/RigidBody2D.hpp b/include/Nazara/Physics2D/RigidBody2D.hpp index 4ca95717f..3b74a1943 100644 --- a/include/Nazara/Physics2D/RigidBody2D.hpp +++ b/include/Nazara/Physics2D/RigidBody2D.hpp @@ -36,6 +36,8 @@ namespace Nz void AddImpulse(const Vector2f& impulse, const Vector2f& point, CoordSys coordSys = CoordSys_Global); void AddTorque(float torque); + bool ClosestPointQuery(const Nz::Vector2f& position, Nz::Vector2f* closestPoint = nullptr, float* closestDistance = nullptr) const; + void EnableSimulation(bool simulation); Rectf GetAABB() const; diff --git a/include/Nazara/Physics3D/PhysWorld3D.hpp b/include/Nazara/Physics3D/PhysWorld3D.hpp index e32ba2528..223fce4fe 100644 --- a/include/Nazara/Physics3D/PhysWorld3D.hpp +++ b/include/Nazara/Physics3D/PhysWorld3D.hpp @@ -33,7 +33,7 @@ namespace Nz PhysWorld3D(); PhysWorld3D(const PhysWorld3D&) = delete; - PhysWorld3D(PhysWorld3D&&) = default; + PhysWorld3D(PhysWorld3D&&) noexcept = default; ~PhysWorld3D(); int CreateMaterial(String name = String()); @@ -61,7 +61,7 @@ namespace Nz void Step(float timestep); PhysWorld3D& operator=(const PhysWorld3D&) = delete; - PhysWorld3D& operator=(PhysWorld3D&&) = default; + PhysWorld3D& operator=(PhysWorld3D&&) noexcept = default; private: struct Callback diff --git a/include/Nazara/Platform/CursorController.hpp b/include/Nazara/Platform/CursorController.hpp index 8c4f8ed15..d27384d18 100644 --- a/include/Nazara/Platform/CursorController.hpp +++ b/include/Nazara/Platform/CursorController.hpp @@ -25,13 +25,13 @@ namespace Nz public: CursorController() = default; CursorController(const CursorController&) = delete; - CursorController(CursorController&&) = default; + CursorController(CursorController&&) noexcept = default; ~CursorController() = default; inline void UpdateCursor(const CursorRef& cursor); CursorController& operator=(const CursorController&) = delete; - CursorController& operator=(CursorController&&) = default; + CursorController& operator=(CursorController&&) noexcept = default; NazaraSignal(OnCursorUpdated, const CursorController* /*cursorController*/, const CursorRef& /*cursor*/); }; diff --git a/include/Nazara/Platform/EventHandler.hpp b/include/Nazara/Platform/EventHandler.hpp index 5aa12bae5..7404a26d6 100644 --- a/include/Nazara/Platform/EventHandler.hpp +++ b/include/Nazara/Platform/EventHandler.hpp @@ -25,13 +25,13 @@ namespace Nz public: EventHandler() = default; explicit EventHandler(const EventHandler&); - EventHandler(EventHandler&&) = default; + EventHandler(EventHandler&&) noexcept = default; ~EventHandler() = default; inline void Dispatch(const WindowEvent& event); EventHandler& operator=(const EventHandler&) = delete; - EventHandler& operator=(EventHandler&&) = default; + EventHandler& operator=(EventHandler&&) noexcept = default; NazaraSignal(OnEvent, const EventHandler* /*eventHandler*/, const WindowEvent& /*event*/); NazaraSignal(OnGainedFocus, const EventHandler* /*eventHandler*/); diff --git a/include/Nazara/Utility/Buffer.hpp b/include/Nazara/Utility/Buffer.hpp index 1b7709efb..e125c63e9 100644 --- a/include/Nazara/Utility/Buffer.hpp +++ b/include/Nazara/Utility/Buffer.hpp @@ -33,7 +33,7 @@ namespace Nz Buffer(BufferType type); Buffer(BufferType type, UInt32 size, DataStorage storage = DataStorage_Software, BufferUsageFlags usage = 0); Buffer(const Buffer&) = delete; - Buffer(Buffer&&) = default; + Buffer(Buffer&&) = delete; ~Buffer(); bool CopyContent(const BufferRef& buffer); @@ -61,7 +61,7 @@ namespace Nz void Unmap() const; Buffer& operator=(const Buffer&) = delete; - Buffer& operator=(Buffer&&) = default; + Buffer& operator=(Buffer&&) = delete; static bool IsStorageSupported(DataStorage storage); template static BufferRef New(Args&&... args); diff --git a/include/Nazara/Utility/Mesh.inl b/include/Nazara/Utility/Mesh.inl index 5dbe349d0..8913aa89c 100644 --- a/include/Nazara/Utility/Mesh.inl +++ b/include/Nazara/Utility/Mesh.inl @@ -10,7 +10,8 @@ namespace Nz { Mesh::Mesh() : m_materialData(1), - m_aabbUpdated(false) + m_aabbUpdated(false), + m_isValid(false) { } diff --git a/src/Nazara/Graphics/BasicRenderQueue.cpp b/src/Nazara/Graphics/BasicRenderQueue.cpp index fb358d8a8..2068a21ff 100644 --- a/src/Nazara/Graphics/BasicRenderQueue.cpp +++ b/src/Nazara/Graphics/BasicRenderQueue.cpp @@ -36,6 +36,8 @@ namespace Nz { NazaraAssert(material, "Invalid material"); + RegisterLayer(renderOrder); + Vector2f defaultSinCos(0.f, 1.f); // sin(0) = 0, cos(0) = 1 if (!sinCosPtr) @@ -104,6 +106,8 @@ namespace Nz { NazaraAssert(material, "Invalid material"); + RegisterLayer(renderOrder); + Vector2f defaultSinCos(0.f, 1.f); // sin(0) = 0, cos(0) = 1 if (!sinCosPtr) @@ -174,6 +178,8 @@ namespace Nz { NazaraAssert(material, "Invalid material"); + RegisterLayer(renderOrder); + float defaultRotation = 0.f; if (!anglePtr) @@ -242,6 +248,8 @@ namespace Nz { NazaraAssert(material, "Invalid material"); + RegisterLayer(renderOrder); + float defaultRotation = 0.f; if (!anglePtr) @@ -312,6 +320,8 @@ namespace Nz { NazaraAssert(material, "Invalid material"); + RegisterLayer(renderOrder); + Vector2f defaultSinCos(0.f, 1.f); // sin(0) = 0, cos(0) = 1 if (!sinCosPtr) @@ -380,6 +390,8 @@ namespace Nz { NazaraAssert(material, "Invalid material"); + RegisterLayer(renderOrder); + Vector2f defaultSinCos(0.f, 1.f); // sin(0) = 0, cos(0) = 1 if (!sinCosPtr) @@ -450,6 +462,8 @@ namespace Nz { NazaraAssert(material, "Invalid material"); + RegisterLayer(renderOrder); + float defaultRotation = 0.f; if (!anglePtr) @@ -518,6 +532,8 @@ namespace Nz { NazaraAssert(material, "Invalid material"); + RegisterLayer(renderOrder); + float defaultRotation = 0.f; if (!anglePtr) diff --git a/src/Nazara/Graphics/ForwardRenderTechnique.cpp b/src/Nazara/Graphics/ForwardRenderTechnique.cpp index cf3611362..934d54d6d 100644 --- a/src/Nazara/Graphics/ForwardRenderTechnique.cpp +++ b/src/Nazara/Graphics/ForwardRenderTechnique.cpp @@ -618,61 +618,51 @@ namespace Nz const RenderTarget* renderTarget = sceneData.viewer->GetTarget(); Recti fullscreenScissorRect = Recti(Vector2i(renderTarget->GetSize())); - Renderer::SetIndexBuffer(&s_quadIndexBuffer); - Renderer::SetMatrix(MatrixType_World, Matrix4f::Identity()); - Renderer::SetVertexBuffer(&m_spriteBuffer); - const unsigned int overlayTextureUnit = Material::GetTextureUnit(TextureMap_Overlay); const std::size_t maxSpriteCount = std::min(s_maxQuads, m_spriteBuffer.GetVertexCount() / 4); - m_spriteChains.clear(); - - auto Commit = [&]() + m_spriteBatches.clear(); { - std::size_t spriteChainCount = m_spriteChains.size(); - if (spriteChainCount > 0) + BufferMapper vertexMapper(m_spriteBuffer, BufferAccess_DiscardAndWrite); + VertexStruct_XYZ_Color_UV* vertices = static_cast(vertexMapper.GetPointer()); + + std::size_t remainingSprite = maxSpriteCount; + + const Material* lastMaterial = nullptr; + const Texture* lastOverlay = nullptr; + Recti lastScissorRect = Recti(-1, -1); + + for (const BasicRenderQueue::SpriteChain& basicSprites : spriteList) { - std::size_t spriteChain = 0; // Which chain of sprites are we treating - std::size_t spriteChainOffset = 0; // Where was the last offset where we stopped in the last chain - - do + const Nz::Texture* overlayTexture = (basicSprites.overlay) ? basicSprites.overlay.Get() : m_whiteTexture.Get(); + const Nz::Recti& scissorRect = (basicSprites.scissorRect.width > 0) ? basicSprites.scissorRect : fullscreenScissorRect; + if (basicSprites.material != lastMaterial || overlayTexture != lastOverlay || (basicSprites.material->IsScissorTestEnabled() && scissorRect != lastScissorRect)) { - // We open the buffer in writing mode - BufferMapper vertexMapper(m_spriteBuffer, BufferAccess_DiscardAndWrite); - VertexStruct_XYZ_Color_UV* vertices = static_cast(vertexMapper.GetPointer()); + m_spriteBatches.emplace_back(); + SpriteBatch& newBatch = m_spriteBatches.back(); + newBatch.material = basicSprites.material; + newBatch.overlayTexture = overlayTexture; + newBatch.scissorRect = scissorRect; + newBatch.spriteCount = 0; - std::size_t spriteCount = 0; - - do - { - const VertexStruct_XYZ_Color_UV* currentChain = m_spriteChains[spriteChain].first; - std::size_t currentChainSpriteCount = m_spriteChains[spriteChain].second; - std::size_t count = std::min(maxSpriteCount - spriteCount, currentChainSpriteCount - spriteChainOffset); - - std::memcpy(vertices, currentChain + spriteChainOffset * 4, 4 * count * sizeof(VertexStruct_XYZ_Color_UV)); - vertices += count * 4; - - spriteCount += count; - spriteChainOffset += count; - - // Have we treated the entire chain ? - if (spriteChainOffset == currentChainSpriteCount) - { - spriteChain++; - spriteChainOffset = 0; - } - } - while (spriteCount < maxSpriteCount && spriteChain < spriteChainCount); - - vertexMapper.Unmap(); - - Renderer::DrawIndexedPrimitives(PrimitiveMode_TriangleList, 0, spriteCount * 6); + lastMaterial = basicSprites.material; + lastOverlay = overlayTexture; + lastScissorRect = scissorRect; } - while (spriteChain < spriteChainCount); - } - m_spriteChains.clear(); - }; + SpriteBatch& currentBatch = m_spriteBatches.back(); + + std::size_t spriteCount = std::min(remainingSprite, basicSprites.spriteCount); + std::memcpy(vertices, basicSprites.vertices, spriteCount * 4 * sizeof(VertexStruct_XYZ_Color_UV)); + vertices += spriteCount * 4; + + currentBatch.spriteCount += spriteCount; + + remainingSprite -= spriteCount; + if (remainingSprite == 0) + break; + } + } const Material* lastMaterial = nullptr; const MaterialPipeline* lastPipeline = nullptr; @@ -683,66 +673,63 @@ namespace Nz const MaterialPipeline::Instance* pipelineInstance = nullptr; - for (const BasicRenderQueue::SpriteChain& basicSprites : spriteList) + Renderer::SetIndexBuffer(&s_quadIndexBuffer); + Renderer::SetMatrix(MatrixType_World, Matrix4f::Identity()); + Renderer::SetVertexBuffer(&m_spriteBuffer); + + unsigned int firstIndex = 0; + for (const auto& batch : m_spriteBatches) { - const Nz::Recti& scissorRect = (basicSprites.scissorRect.width > 0) ? basicSprites.scissorRect : fullscreenScissorRect; - - if (basicSprites.material != lastMaterial || basicSprites.overlay != lastOverlay || (basicSprites.material->IsScissorTestEnabled() && scissorRect != lastScissorRect)) + const MaterialPipeline* pipeline = batch.material->GetPipeline(); + if (pipeline != lastPipeline) { - Commit(); + pipelineInstance = &batch.material->GetPipeline()->Apply(ShaderFlags_TextureOverlay | ShaderFlags_VertexColor); - const MaterialPipeline* pipeline = basicSprites.material->GetPipeline(); - if (lastPipeline != pipeline) + const Shader* shader = pipelineInstance->uberInstance->GetShader(); + if (shader != lastShader) { - pipelineInstance = &basicSprites.material->GetPipeline()->Apply(ShaderFlags_TextureOverlay | ShaderFlags_VertexColor); + // Index of uniforms in the shader + shaderUniforms = GetShaderUniforms(shader); - const Shader* shader = pipelineInstance->uberInstance->GetShader(); - if (shader != lastShader) - { - // Index of uniforms in the shader - shaderUniforms = GetShaderUniforms(shader); + // Ambient color of the scene + shader->SendColor(shaderUniforms->sceneAmbient, sceneData.ambientColor); + // Position of the camera + shader->SendVector(shaderUniforms->eyePosition, sceneData.viewer->GetEyePosition()); - // Ambient color of the scene - shader->SendColor(shaderUniforms->sceneAmbient, sceneData.ambientColor); - // Position of the camera - shader->SendVector(shaderUniforms->eyePosition, sceneData.viewer->GetEyePosition()); + // Overlay texture unit + shader->SendInteger(shaderUniforms->textureOverlay, overlayTextureUnit); - // Overlay texture unit - shader->SendInteger(shaderUniforms->textureOverlay, overlayTextureUnit); - - lastShader = shader; - } - - lastPipeline = pipeline; + lastShader = shader; } - if (lastMaterial != basicSprites.material) - { - basicSprites.material->Apply(*pipelineInstance); - - Renderer::SetTextureSampler(overlayTextureUnit, basicSprites.material->GetDiffuseSampler()); - - lastMaterial = basicSprites.material; - } - - const Nz::Texture* overlayTexture = (basicSprites.overlay) ? basicSprites.overlay.Get() : m_whiteTexture.Get(); - if (overlayTexture != lastOverlay) - { - Renderer::SetTexture(overlayTextureUnit, overlayTexture); - lastOverlay = overlayTexture; - } - - if (basicSprites.material->IsScissorTestEnabled() && scissorRect != lastScissorRect) - { - Renderer::SetScissorRect(scissorRect); - lastScissorRect = scissorRect; - } + lastPipeline = pipeline; } - m_spriteChains.emplace_back(basicSprites.vertices, basicSprites.spriteCount); - } + if (batch.material != lastMaterial) + { + batch.material->Apply(*pipelineInstance); - Commit(); + Renderer::SetTextureSampler(overlayTextureUnit, batch.material->GetDiffuseSampler()); + + lastMaterial = batch.material; + } + + if (batch.overlayTexture != lastOverlay) + { + Renderer::SetTexture(overlayTextureUnit, batch.overlayTexture); + lastOverlay = batch.overlayTexture; + } + + if (batch.material->IsScissorTestEnabled() && batch.scissorRect != lastScissorRect) + { + Renderer::SetScissorRect(batch.scissorRect); + lastScissorRect = batch.scissorRect; + } + + unsigned int indexCount = batch.spriteCount * 6; + Renderer::DrawIndexedPrimitives(PrimitiveMode_TriangleList, firstIndex, indexCount); + firstIndex += indexCount; + } } const ForwardRenderTechnique::ShaderUniforms* ForwardRenderTechnique::GetShaderUniforms(const Shader* shader) const diff --git a/src/Nazara/Network/AbstractSocket.cpp b/src/Nazara/Network/AbstractSocket.cpp index 879589cd6..64bdd0e0d 100644 --- a/src/Nazara/Network/AbstractSocket.cpp +++ b/src/Nazara/Network/AbstractSocket.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2017 Jérôme Leclercq +// Copyright (C) 2017 Jérôme Leclercq // This file is part of the "Nazara Engine - Utility module" // For conditions of distribution and use, see copyright notice in Config.hpp @@ -45,7 +45,7 @@ namespace Nz * \param abstractSocket AbstractSocket to move into this */ - AbstractSocket::AbstractSocket(AbstractSocket&& abstractSocket) : + AbstractSocket::AbstractSocket(AbstractSocket&& abstractSocket) noexcept : m_protocol(abstractSocket.m_protocol), m_lastError(abstractSocket.m_lastError), m_handle(abstractSocket.m_handle), diff --git a/src/Nazara/Network/AlgorithmNetwork.cpp b/src/Nazara/Network/AlgorithmNetwork.cpp index 9a593db39..55d6a5569 100644 --- a/src/Nazara/Network/AlgorithmNetwork.cpp +++ b/src/Nazara/Network/AlgorithmNetwork.cpp @@ -84,35 +84,35 @@ namespace Nz * * \param resolveError Error enumeration */ - const char* ErrorToString(Nz::ResolveError resolveError) + const char* ErrorToString(ResolveError resolveError) { switch (resolveError) { - case Nz::ResolveError_NoError: + case ResolveError_NoError: return "No error"; - case Nz::ResolveError_Internal: + case ResolveError_Internal: return "An internal error occurred"; - case Nz::ResolveError_ResourceError: + case ResolveError_ResourceError: return "The operating system lacks the resources to proceed"; - case Nz::ResolveError_NonRecoverable: + case ResolveError_NonRecoverable: return "A nonrecoverable error occurred"; - case Nz::ResolveError_NotFound: + case ResolveError_NotFound: return "No such host is known"; - case Nz::ResolveError_NotInitialized: + case ResolveError_NotInitialized: return "Nazara Network has not been initialized"; - case Nz::ResolveError_ProtocolNotSupported: + case ResolveError_ProtocolNotSupported: return "A specified protocol is not supported by the server"; - case Nz::ResolveError_TemporaryFailure: + case ResolveError_TemporaryFailure: return "A temporary failure occurred, try again"; - case Nz::ResolveError_Unknown: + case ResolveError_Unknown: return "An unknown error occurred"; default: @@ -127,53 +127,56 @@ namespace Nz * * \param socketError Error enumeration */ - const char* ErrorToString(Nz::SocketError socketError) + const char* ErrorToString(SocketError socketError) { switch (socketError) { - case Nz::SocketError_NoError: + case SocketError_NoError: return "No error"; - case Nz::SocketError_AddressNotAvailable: + case SocketError_AddressNotAvailable: return "The address is already in use"; - case Nz::SocketError_ConnectionClosed: + case SocketError_ConnectionClosed: return "The connection has been closed"; - case Nz::SocketError_ConnectionRefused: + case SocketError_ConnectionRefused: return "The connection attempt was refused"; - case Nz::SocketError_DatagramSize: + case SocketError_DatagramSize: return "The datagram size is over the system limit"; - case Nz::SocketError_Internal: + case SocketError_Internal: return "An internal error occurred"; - case Nz::SocketError_Packet: + case SocketError_Interrupted: + return "The operation was interrupted by a signal"; + + case SocketError_Packet: return "Packet encoding or decoding failed"; - case Nz::SocketError_NetworkError: + case SocketError_NetworkError: return "Networking subsystem failed"; - case Nz::SocketError_NotInitialized: + case SocketError_NotInitialized: return "Network module has not been initialized"; - case Nz::SocketError_NotSupported: + case SocketError_NotSupported: return "This operation is not supported"; - case Nz::SocketError_ResolveError: + case SocketError_ResolveError: return "The hostname couldn't be resolved"; - case Nz::SocketError_ResourceError: + case SocketError_ResourceError: return "The operating system lacks the resources to proceed"; - case Nz::SocketError_TimedOut: + case SocketError_TimedOut: return "The operation timed out"; - case Nz::SocketError_Unknown: + case SocketError_Unknown: return "An unknown error occurred"; - case Nz::SocketError_UnreachableHost: + case SocketError_UnreachableHost: return "The host is not reachable"; default: diff --git a/src/Nazara/Network/ENetHost.cpp b/src/Nazara/Network/ENetHost.cpp index 5eb8d5862..5744b8743 100644 --- a/src/Nazara/Network/ENetHost.cpp +++ b/src/Nazara/Network/ENetHost.cpp @@ -489,7 +489,7 @@ namespace Nz if (m_receivedDataLength < NazaraOffsetOf(ENetProtocolHeader, sentTime)) return false; - ENetProtocolHeader* header = reinterpret_cast(m_receivedData); + ENetProtocolHeader* header = reinterpret_cast(m_receivedData.Get()); UInt16 peerID = NetToHost(header->peerID); UInt8 sessionID = (peerID & ENetProtocolHeaderSessionMask) >> ENetProtocolHeaderSessionShift; diff --git a/src/Nazara/Network/Linux/SocketPollerImpl.cpp b/src/Nazara/Network/Linux/SocketPollerImpl.cpp index b35a37ca5..53de22a70 100644 --- a/src/Nazara/Network/Linux/SocketPollerImpl.cpp +++ b/src/Nazara/Network/Linux/SocketPollerImpl.cpp @@ -81,7 +81,7 @@ namespace Nz NazaraWarning("An error occured while removing socket from epoll structure (errno " + String::Number(errno) + ": " + Error::GetLastSystemError() + ')'); } - int SocketPollerImpl::Wait(int msTimeout, SocketError* error) + unsigned int SocketPollerImpl::Wait(int msTimeout, SocketError* error) { int activeSockets; @@ -93,7 +93,7 @@ namespace Nz if (activeSockets == -1) { if (error) - *error = SocketImpl::TranslateErrnoToResolveError(errno); + *error = SocketImpl::TranslateErrnoToSocketError(errno); return 0; } diff --git a/src/Nazara/Network/Linux/SocketPollerImpl.hpp b/src/Nazara/Network/Linux/SocketPollerImpl.hpp index 882141d38..4200dff79 100644 --- a/src/Nazara/Network/Linux/SocketPollerImpl.hpp +++ b/src/Nazara/Network/Linux/SocketPollerImpl.hpp @@ -30,7 +30,7 @@ namespace Nz bool RegisterSocket(SocketHandle socket, SocketPollEventFlags eventFlags); void UnregisterSocket(SocketHandle socket); - int Wait(int msTimeout, SocketError* error); + unsigned int Wait(int msTimeout, SocketError* error); private: std::unordered_set m_readyToReadSockets; diff --git a/src/Nazara/Network/Posix/SocketImpl.cpp b/src/Nazara/Network/Posix/SocketImpl.cpp index d372d6fff..c8140f019 100644 --- a/src/Nazara/Network/Posix/SocketImpl.cpp +++ b/src/Nazara/Network/Posix/SocketImpl.cpp @@ -41,7 +41,7 @@ namespace Nz else { if (error) - *error = TranslateErrnoToResolveError(GetLastErrorCode()); + *error = TranslateErrnoToSocketError(GetLastErrorCode()); } return newClient; @@ -58,7 +58,7 @@ namespace Nz if (bind(handle, reinterpret_cast(&nameBuffer), bufferLength) == SOCKET_ERROR) { if (error) - *error = TranslateErrnoToResolveError(GetLastErrorCode()); + *error = TranslateErrnoToSocketError(GetLastErrorCode()); return SocketState_NotConnected; } @@ -76,7 +76,7 @@ namespace Nz SocketHandle handle = socket(TranslateNetProtocolToAF(protocol), TranslateSocketTypeToSock(type), 0); if (handle == InvalidHandle && error != nullptr) - *error = TranslateErrnoToResolveError(GetLastErrorCode()); + *error = TranslateErrnoToSocketError(GetLastErrorCode()); return handle; } @@ -129,7 +129,7 @@ namespace Nz if (errorCode == EADDRNOTAVAIL) *error = SocketError_ConnectionRefused; //< ConnectionRefused seems more legit than AddressNotAvailable in connect case else - *error = TranslateErrnoToResolveError(errorCode); + *error = TranslateErrnoToSocketError(errorCode); } return SocketState_NotConnected; @@ -162,7 +162,7 @@ namespace Nz if (code) { if (error) - *error = TranslateErrnoToResolveError(code); + *error = TranslateErrnoToSocketError(code); return SocketState_NotConnected; } @@ -177,7 +177,7 @@ namespace Nz else { if (error) - *error = TranslateErrnoToResolveError(GetLastErrorCode()); + *error = TranslateErrnoToSocketError(GetLastErrorCode()); return SocketState_NotConnected; } @@ -202,7 +202,7 @@ namespace Nz if (code < 0) return SocketError_Internal; - return TranslateErrnoToResolveError(code); + return TranslateErrnoToSocketError(code); } int SocketImpl::GetLastErrorCode() @@ -218,7 +218,7 @@ namespace Nz if (getsockopt(handle, SOL_SOCKET, SO_ERROR, &code, &codeLength) == SOCKET_ERROR) { if (error) - *error = TranslateErrnoToResolveError(GetLastErrorCode()); + *error = TranslateErrnoToSocketError(GetLastErrorCode()); return -1; } @@ -240,7 +240,7 @@ namespace Nz if (bind(handle, reinterpret_cast(&nameBuffer), bufferLength) == SOCKET_ERROR) { if (error) - *error = TranslateErrnoToResolveError(GetLastErrorCode()); + *error = TranslateErrnoToSocketError(GetLastErrorCode()); return SocketState_NotConnected; } @@ -248,7 +248,7 @@ namespace Nz if (listen(handle, queueSize) == SOCKET_ERROR) { if (error) - *error = TranslateErrnoToResolveError(GetLastErrorCode()); + *error = TranslateErrnoToSocketError(GetLastErrorCode()); return SocketState_NotConnected; } @@ -267,7 +267,7 @@ namespace Nz if (ioctl(handle, FIONREAD, &availableBytes) == SOCKET_ERROR) { if (error) - *error = TranslateErrnoToResolveError(GetLastErrorCode()); + *error = TranslateErrnoToSocketError(GetLastErrorCode()); return 0; } @@ -286,7 +286,7 @@ namespace Nz if (getsockopt(handle, SOL_SOCKET, SO_BROADCAST, &code, &codeLength) == SOCKET_ERROR) { if (error) - *error = TranslateErrnoToResolveError(GetLastErrorCode()); + *error = TranslateErrnoToSocketError(GetLastErrorCode()); return false; } @@ -305,7 +305,7 @@ namespace Nz if (getsockopt(handle, SOL_SOCKET, SO_KEEPALIVE, &code, &codeLength) == SOCKET_ERROR) { if (error) - *error = TranslateErrnoToResolveError(GetLastErrorCode()); + *error = TranslateErrnoToSocketError(GetLastErrorCode()); return false; } @@ -324,7 +324,7 @@ namespace Nz if (getsockopt(handle, IPPROTO_IP, IP_MTU, &code, &codeLength) == SOCKET_ERROR) { if (error) - *error = TranslateErrnoToResolveError(GetLastErrorCode()); + *error = TranslateErrnoToSocketError(GetLastErrorCode()); return 0; } @@ -343,7 +343,7 @@ namespace Nz if (getsockopt(handle, IPPROTO_TCP, TCP_NODELAY, &code, &codeLength) == SOCKET_ERROR) { if (error) - *error = TranslateErrnoToResolveError(GetLastErrorCode()); + *error = TranslateErrnoToSocketError(GetLastErrorCode()); return false; } @@ -362,7 +362,7 @@ namespace Nz if (getsockopt(handle, SOL_SOCKET, SO_RCVBUF, reinterpret_cast(&code), &codeLength) == SOCKET_ERROR) { if (error) - *error = TranslateErrnoToResolveError(GetLastErrorCode()); + *error = TranslateErrnoToSocketError(GetLastErrorCode()); return 0; } @@ -385,7 +385,7 @@ namespace Nz if (getpeername(handle, reinterpret_cast(nameBuffer.data()), &bufferLength) == SOCKET_ERROR) { if (error) - *error = TranslateErrnoToResolveError(GetLastErrorCode()); + *error = TranslateErrnoToSocketError(GetLastErrorCode()); return IpAddress(); } @@ -404,7 +404,7 @@ namespace Nz if (getsockopt(handle, SOL_SOCKET, SO_SNDBUF, reinterpret_cast(&code), &codeLength) == SOCKET_ERROR) { if (error) - *error = TranslateErrnoToResolveError(GetLastErrorCode()); + *error = TranslateErrnoToSocketError(GetLastErrorCode()); return 0; } @@ -432,7 +432,7 @@ namespace Nz if (errorCode == EINVAL) *error = SocketError_NoError; else - *error = TranslateErrnoToResolveError(errorCode); + *error = TranslateErrnoToSocketError(errorCode); } return IpAddress(); @@ -444,7 +444,7 @@ namespace Nz return IpAddressImpl::FromSockAddr(reinterpret_cast(nameBuffer.data())); } - int SocketImpl::Poll(PollSocket* fdarray, std::size_t nfds, int timeout, SocketError* error) + unsigned int SocketImpl::Poll(PollSocket* fdarray, std::size_t nfds, int timeout, SocketError* error) { NazaraAssert(fdarray && nfds > 0, "Invalid fdarray"); @@ -454,12 +454,12 @@ namespace Nz if (result < 0) { if (error) - *error = TranslateErrnoToResolveError(GetLastErrorCode()); + *error = TranslateErrnoToSocketError(GetLastErrorCode()); return 0; } - return result; + return static_cast(result); } bool SocketImpl::Receive(SocketHandle handle, void* buffer, int length, int* read, SocketError* error) @@ -486,7 +486,7 @@ namespace Nz default: { if (error) - *error = TranslateErrnoToResolveError(errorCode); + *error = TranslateErrnoToSocketError(errorCode); return false; //< Error } @@ -541,7 +541,7 @@ namespace Nz default: { if (error) - *error = TranslateErrnoToResolveError(errorCode); + *error = TranslateErrnoToSocketError(errorCode); return false; //< Error } @@ -618,7 +618,7 @@ namespace Nz default: { if (error) - *error = TranslateErrnoToResolveError(errorCode); + *error = TranslateErrnoToSocketError(errorCode); return false; //< Error } @@ -677,7 +677,7 @@ namespace Nz default: { if (error) - *error = TranslateErrnoToResolveError(errorCode); + *error = TranslateErrnoToSocketError(errorCode); return false; //< Error } @@ -730,7 +730,7 @@ namespace Nz default: { if (error) - *error = TranslateErrnoToResolveError(errorCode); + *error = TranslateErrnoToSocketError(errorCode); return false; //< Error } @@ -770,7 +770,7 @@ namespace Nz default: { if (error) - *error = TranslateErrnoToResolveError(errorCode); + *error = TranslateErrnoToSocketError(errorCode); return false; //< Error } @@ -794,7 +794,7 @@ namespace Nz if (ioctl(handle, FIONBIO, &block) == SOCKET_ERROR) { if (error) - *error = TranslateErrnoToResolveError(GetLastErrorCode()); + *error = TranslateErrnoToSocketError(GetLastErrorCode()); return false; //< Error } @@ -813,7 +813,7 @@ namespace Nz if (setsockopt(handle, SOL_SOCKET, SO_BROADCAST, reinterpret_cast(&option), sizeof(option)) == SOCKET_ERROR) { if (error) - *error = TranslateErrnoToResolveError(GetLastErrorCode()); + *error = TranslateErrnoToSocketError(GetLastErrorCode()); return false; //< Error } @@ -832,7 +832,7 @@ namespace Nz if (setsockopt(handle, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast(&option), sizeof(option)) == SOCKET_ERROR) { if (error) - *error = TranslateErrnoToResolveError(GetLastErrorCode()); + *error = TranslateErrnoToSocketError(GetLastErrorCode()); return false; //< Error } @@ -854,7 +854,7 @@ namespace Nz if (setsockopt(handle, SOL_SOCKET, SO_KEEPALIVE, &keepAlive , sizeof(keepAlive)) == SOCKET_ERROR) { if (error) - *error = TranslateErrnoToResolveError(GetLastErrorCode()); + *error = TranslateErrnoToSocketError(GetLastErrorCode()); return false; //< Error } @@ -862,7 +862,7 @@ namespace Nz if (setsockopt(handle, IPPROTO_TCP, TCP_KEEPIDLE, &keepIdle, sizeof(keepIdle)) == SOCKET_ERROR) { if (error) - *error = TranslateErrnoToResolveError(GetLastErrorCode()); + *error = TranslateErrnoToSocketError(GetLastErrorCode()); return false; //< Error } @@ -870,7 +870,7 @@ namespace Nz if (setsockopt(handle, IPPROTO_TCP, TCP_KEEPINTVL, &keepInterval, sizeof(keepInterval)) == SOCKET_ERROR) { if (error) - *error = TranslateErrnoToResolveError(GetLastErrorCode()); + *error = TranslateErrnoToSocketError(GetLastErrorCode()); return false; //< Error } @@ -889,7 +889,7 @@ namespace Nz if (setsockopt(handle, IPPROTO_TCP, TCP_NODELAY, &option, sizeof(option)) == SOCKET_ERROR) { if (error) - *error = TranslateErrnoToResolveError(GetLastErrorCode()); + *error = TranslateErrnoToSocketError(GetLastErrorCode()); return false; //< Error } @@ -908,7 +908,7 @@ namespace Nz if (setsockopt(handle, SOL_SOCKET, SO_RCVBUF, reinterpret_cast(&option), sizeof(option)) == SOCKET_ERROR) { if (error) - *error = TranslateErrnoToResolveError(GetLastErrorCode()); + *error = TranslateErrnoToSocketError(GetLastErrorCode()); return false; //< Error } @@ -927,7 +927,7 @@ namespace Nz if (setsockopt(handle, SOL_SOCKET, SO_SNDBUF, reinterpret_cast(&option), sizeof(option)) == SOCKET_ERROR) { if (error) - *error = TranslateErrnoToResolveError(GetLastErrorCode()); + *error = TranslateErrnoToSocketError(GetLastErrorCode()); return false; //< Error } @@ -938,7 +938,7 @@ namespace Nz return true; } - SocketError SocketImpl::TranslateErrnoToResolveError(int error) + SocketError SocketImpl::TranslateErrnoToSocketError(int error) { switch (error) { @@ -974,6 +974,9 @@ namespace Nz case ECONNREFUSED: return SocketError_ConnectionRefused; + case EINTR: + return SocketError_Interrupted; + case EMSGSIZE: return SocketError_DatagramSize; diff --git a/src/Nazara/Network/Posix/SocketImpl.hpp b/src/Nazara/Network/Posix/SocketImpl.hpp index 4bd38380d..af22eb8dd 100644 --- a/src/Nazara/Network/Posix/SocketImpl.hpp +++ b/src/Nazara/Network/Posix/SocketImpl.hpp @@ -60,7 +60,7 @@ namespace Nz static std::size_t QueryReceiveBufferSize(SocketHandle handle, SocketError* error = nullptr); static std::size_t QuerySendBufferSize(SocketHandle handle, SocketError* error = nullptr); - static int Poll(PollSocket* fdarray, std::size_t nfds, int timeout, SocketError* error); + static unsigned int Poll(PollSocket* fdarray, std::size_t nfds, int timeout, SocketError* error); static bool Receive(SocketHandle handle, void* buffer, int length, int* read, SocketError* error); static bool ReceiveFrom(SocketHandle handle, void* buffer, int length, IpAddress* from, int* read, SocketError* error); @@ -78,7 +78,7 @@ namespace Nz static bool SetReceiveBufferSize(SocketHandle handle, std::size_t size, SocketError* error = nullptr); static bool SetSendBufferSize(SocketHandle handle, std::size_t size, SocketError* error = nullptr); - static SocketError TranslateErrnoToResolveError(int error); + static SocketError TranslateErrnoToSocketError(int error); static int TranslateNetProtocolToAF(NetProtocol protocol); static int TranslateSocketTypeToSock(SocketType type); diff --git a/src/Nazara/Network/Posix/SocketPollerImpl.cpp b/src/Nazara/Network/Posix/SocketPollerImpl.cpp index 01cc9ffa9..fc100d8eb 100644 --- a/src/Nazara/Network/Posix/SocketPollerImpl.cpp +++ b/src/Nazara/Network/Posix/SocketPollerImpl.cpp @@ -76,9 +76,9 @@ namespace Nz m_readyToWriteSockets.erase(socket); } - int SocketPollerImpl::Wait(int msTimeout, SocketError* error) + unsigned int SocketPollerImpl::Wait(int msTimeout, SocketError* error) { - int activeSockets; + unsigned int activeSockets; // Reset status of sockets activeSockets = SocketImpl::Poll(m_sockets.data(), m_sockets.size(), static_cast(msTimeout), error); @@ -87,7 +87,7 @@ namespace Nz m_readyToWriteSockets.clear(); if (activeSockets > 0U) { - int socketRemaining = activeSockets; + unsigned int socketRemaining = activeSockets; for (PollSocket& entry : m_sockets) { if (!entry.revents) @@ -103,7 +103,7 @@ namespace Nz } else { - NazaraWarning("Socket " + String::Number(entry.fd) + " was returned by WSAPoll without POLLRDNORM nor POLLWRNORM events (events: 0x" + String::Number(entry.revents, 16) + ')'); + NazaraWarning("Socket " + String::Number(entry.fd) + " was returned by poll without POLLRDNORM nor POLLWRNORM events (events: 0x" + String::Number(entry.revents, 16) + ')'); activeSockets--; } diff --git a/src/Nazara/Network/Posix/SocketPollerImpl.hpp b/src/Nazara/Network/Posix/SocketPollerImpl.hpp index 5c4ad1743..294f462a6 100644 --- a/src/Nazara/Network/Posix/SocketPollerImpl.hpp +++ b/src/Nazara/Network/Posix/SocketPollerImpl.hpp @@ -23,13 +23,14 @@ namespace Nz void Clear(); - bool IsReady(SocketHandle socket) const; + bool IsReadyToRead(SocketHandle socket) const; + bool IsReadyToWrite(SocketHandle socket) const; bool IsRegistered(SocketHandle socket) const; bool RegisterSocket(SocketHandle socket, SocketPollEventFlags eventFlags); void UnregisterSocket(SocketHandle socket); - int Wait(int msTimeout, SocketError* error); + unsigned int Wait(int msTimeout, SocketError* error); private: std::unordered_set m_readyToReadSockets; diff --git a/src/Nazara/Network/SocketPoller.cpp b/src/Nazara/Network/SocketPoller.cpp index 50eeb5cdf..20b575b62 100644 --- a/src/Nazara/Network/SocketPoller.cpp +++ b/src/Nazara/Network/SocketPoller.cpp @@ -3,6 +3,7 @@ // For conditions of distribution and use, see copyright notice in Config.hpp #include +#include #if defined(NAZARA_PLATFORM_WINDOWS) #include @@ -170,24 +171,33 @@ namespace Nz * Waits a specific/undetermined amount of time until at least one socket part of the SocketPoller becomes ready. * To query the ready state of the registered socket, use the IsReadyToRead or IsReadyToWrite functions. * + * If error is a valid pointer, it will be used to report the last error occurred (if no error occurred, a value of NoError will be reported) + * * \param msTimeout Maximum time to wait in milliseconds, 0 will returns immediately and -1 will block indefinitely + * \param error If valid, this will be used to report the error status from the poller (if no error occurred, a value of NoError will be reported). * - * \return True if at least one socket registered to the poller is ready. + * \return The number of socket reported ready (may be zero if no socket is ready or if an error occurred) * - * \remark It is an error to try to unregister a non-registered socket from a SocketPoller. + * \remark In case of error, a NazaraError is triggered (except for interrupted errors) * * \see IsReady * \see RegisterSocket */ - bool SocketPoller::Wait(int msTimeout) + unsigned int SocketPoller::Wait(int msTimeout, SocketError* error) { - SocketError error; + SocketError waitError; - int readySockets = m_impl->Wait(msTimeout, &error); - if (error != SocketError_NoError) + unsigned int readySockets = m_impl->Wait(msTimeout, &waitError); + + if (error) + *error = waitError; + + if (waitError != SocketError_NoError) { - NazaraError("SocketPoller encountered an error (code: 0x" + String::Number(error, 16) + ')'); - return false; + if (waitError != SocketError_Interrupted) //< Do not log interrupted error + NazaraError("SocketPoller encountered an error (code: 0x" + String::Number(waitError, 16) + "): " + ErrorToString(waitError)); + + return 0; } return readySockets > 0; diff --git a/src/Nazara/Network/Win32/SocketImpl.cpp b/src/Nazara/Network/Win32/SocketImpl.cpp index a0ebe5948..6d2e33f7f 100644 --- a/src/Nazara/Network/Win32/SocketImpl.cpp +++ b/src/Nazara/Network/Win32/SocketImpl.cpp @@ -467,7 +467,7 @@ namespace Nz return code; } - int SocketImpl::Poll(PollSocket* fdarray, std::size_t nfds, int timeout, SocketError* error) + unsigned int SocketImpl::Poll(PollSocket* fdarray, std::size_t nfds, int timeout, SocketError* error) { NazaraAssert(fdarray && nfds > 0, "Invalid fdarray"); @@ -484,10 +484,12 @@ namespace Nz return 0; } + assert(result >= 0); + if (error) *error = SocketError_NoError; - return result; + return static_cast(result); #else NazaraUnused(fdarray); NazaraUnused(nfds); diff --git a/src/Nazara/Network/Win32/SocketImpl.hpp b/src/Nazara/Network/Win32/SocketImpl.hpp index 1aa4a0495..ef49cd14d 100644 --- a/src/Nazara/Network/Win32/SocketImpl.hpp +++ b/src/Nazara/Network/Win32/SocketImpl.hpp @@ -60,7 +60,7 @@ namespace Nz static IpAddress QuerySocketAddress(SocketHandle handle, SocketError* error = nullptr); static std::size_t QuerySendBufferSize(SocketHandle handle, SocketError* error = nullptr); - static int Poll(PollSocket* fdarray, std::size_t nfds, int timeout, SocketError* error); + static unsigned int Poll(PollSocket* fdarray, std::size_t nfds, int timeout, SocketError* error); static bool Receive(SocketHandle handle, void* buffer, int length, int* read, SocketError* error); static bool ReceiveFrom(SocketHandle handle, void* buffer, int length, IpAddress* from, int* read, SocketError* error); diff --git a/src/Nazara/Network/Win32/SocketPollerImpl.cpp b/src/Nazara/Network/Win32/SocketPollerImpl.cpp index 5fa5ac5a2..f6272b246 100644 --- a/src/Nazara/Network/Win32/SocketPollerImpl.cpp +++ b/src/Nazara/Network/Win32/SocketPollerImpl.cpp @@ -130,9 +130,9 @@ namespace Nz #endif } - int SocketPollerImpl::Wait(int msTimeout, SocketError* error) + unsigned int SocketPollerImpl::Wait(int msTimeout, SocketError* error) { - int activeSockets; + unsigned int activeSockets; #if NAZARA_NETWORK_POLL_SUPPORT activeSockets = SocketImpl::Poll(m_sockets.data(), m_sockets.size(), static_cast(msTimeout), error); @@ -187,8 +187,8 @@ namespace Nz tv.tv_sec = static_cast(msTimeout / 1000ULL); tv.tv_usec = static_cast((msTimeout % 1000ULL) * 1000ULL); - activeSockets = ::select(0xDEADBEEF, readSet, writeSet, nullptr, (msTimeout >= 0) ? &tv : nullptr); //< The first argument is ignored on Windows - if (activeSockets == SOCKET_ERROR) + int selectValue = ::select(0xDEADBEEF, readSet, writeSet, nullptr, (msTimeout >= 0) ? &tv : nullptr); //< The first argument is ignored on Windows + if (selectValue == SOCKET_ERROR) { if (error) *error = SocketImpl::TranslateWSAErrorToSocketError(WSAGetLastError()); @@ -196,6 +196,9 @@ namespace Nz return 0; } + assert(selectValue >= 0); + activeSockets = static_cast(selectValue); + if (error) *error = SocketError_NoError; #endif diff --git a/src/Nazara/Network/Win32/SocketPollerImpl.hpp b/src/Nazara/Network/Win32/SocketPollerImpl.hpp index 2dfb32070..611548591 100644 --- a/src/Nazara/Network/Win32/SocketPollerImpl.hpp +++ b/src/Nazara/Network/Win32/SocketPollerImpl.hpp @@ -32,7 +32,7 @@ namespace Nz bool RegisterSocket(SocketHandle socket, SocketPollEventFlags eventFlags); void UnregisterSocket(SocketHandle socket); - int Wait(int msTimeout, SocketError* error); + unsigned int Wait(int msTimeout, SocketError* error); private: #if NAZARA_NETWORK_POLL_SUPPORT diff --git a/src/Nazara/Physics2D/RigidBody2D.cpp b/src/Nazara/Physics2D/RigidBody2D.cpp index 6e61af384..c2cb31c4f 100644 --- a/src/Nazara/Physics2D/RigidBody2D.cpp +++ b/src/Nazara/Physics2D/RigidBody2D.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include namespace Nz @@ -127,6 +128,37 @@ namespace Nz cpBodySetTorque(m_handle, cpBodyGetTorque(m_handle) + ToRadians(torque)); } + bool RigidBody2D::ClosestPointQuery(const Nz::Vector2f& position, Nz::Vector2f* closestPoint, float* closestDistance) const + { + cpVect pos = cpv(cpFloat(position.x), cpFloat(position.y)); + + float minDistance = std::numeric_limits::infinity(); + Nz::Vector2f closest; + for (cpShape* shape : m_shapes) + { + cpPointQueryInfo result; + cpShapePointQuery(shape, pos, &result); + + float resultDistance = float(result.distance); + if (resultDistance < minDistance) + { + closest.Set(float(result.point.x), float(result.point.y)); + minDistance = resultDistance; + } + } + + if (std::isinf(minDistance)) + return false; + + if (closestPoint) + *closestPoint = closest; + + if (minDistance) + *closestDistance = minDistance; + + return true; + } + void RigidBody2D::EnableSimulation(bool simulation) { if (m_isRegistered != simulation)