Merge branch 'master' into reflection-mapping
This commit is contained in:
commit
ead54e1c30
2
Doxyfile
2
Doxyfile
|
|
@ -38,7 +38,7 @@ PROJECT_NAME = "Nazara Engine"
|
|||
# could be handy for archiving the generated documentation or if some version
|
||||
# control system is used.
|
||||
|
||||
PROJECT_NUMBER = 0.2
|
||||
PROJECT_NUMBER = 0.3
|
||||
|
||||
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
||||
# for a project that appears at the top of each page and should give viewer a
|
||||
|
|
|
|||
|
|
@ -158,11 +158,16 @@ namespace Ndk
|
|||
}
|
||||
m_systemBits.Clear();
|
||||
|
||||
UnregisterAllHandles();
|
||||
// We properly destroy each component
|
||||
for (std::size_t i = m_componentBits.FindFirst(); i != m_componentBits.npos; i = m_componentBits.FindNext(i))
|
||||
m_components[i]->SetEntity(nullptr);
|
||||
|
||||
m_components.clear();
|
||||
m_componentBits.Reset();
|
||||
|
||||
// And then free every handle
|
||||
UnregisterAllHandles();
|
||||
|
||||
m_valid = false;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ namespace Nz
|
|||
public:
|
||||
using BitField = typename std::conditional<(EnumAsFlags<E>::max > 32), UInt64, UInt32>::type;
|
||||
|
||||
constexpr Flags(BitField value);
|
||||
constexpr Flags(BitField value = 0);
|
||||
constexpr Flags(E enumVal);
|
||||
|
||||
explicit constexpr operator bool() const;
|
||||
|
|
@ -54,13 +54,13 @@ namespace Nz
|
|||
private:
|
||||
BitField m_value;
|
||||
};
|
||||
|
||||
template<typename E> constexpr std::enable_if_t<EnumAsFlags<E>::value, Flags<E>> operator~(E lhs);
|
||||
template<typename E> constexpr std::enable_if_t<EnumAsFlags<E>::value, Flags<E>> operator|(E lhs, E rhs);
|
||||
template<typename E> constexpr std::enable_if_t<EnumAsFlags<E>::value, Flags<E>> operator&(E lhs, E rhs);
|
||||
template<typename E> constexpr std::enable_if_t<EnumAsFlags<E>::value, Flags<E>> operator^(E lhs, E rhs);
|
||||
}
|
||||
|
||||
template<typename E> constexpr std::enable_if_t<Nz::EnumAsFlags<E>::value, Nz::Flags<E>> operator~(E lhs);
|
||||
template<typename E> constexpr std::enable_if_t<Nz::EnumAsFlags<E>::value, Nz::Flags<E>> operator|(E lhs, E rhs);
|
||||
template<typename E> constexpr std::enable_if_t<Nz::EnumAsFlags<E>::value, Nz::Flags<E>> operator&(E lhs, E rhs);
|
||||
template<typename E> constexpr std::enable_if_t<Nz::EnumAsFlags<E>::value, Nz::Flags<E>> operator^(E lhs, E rhs);
|
||||
|
||||
#include <Nazara/Core/Flags.inl>
|
||||
|
||||
#endif // NAZARA_FLAGS_HPP
|
||||
|
|
|
|||
|
|
@ -13,13 +13,13 @@ namespace Nz
|
|||
* \brief Core class used to combine enumeration values into flags bitfield
|
||||
*/
|
||||
|
||||
/*!
|
||||
* \brief Constructs a Flags object using a bitfield
|
||||
*
|
||||
* \param value Bitfield to be used
|
||||
/*!
|
||||
* \brief Constructs a Flags object using a bitfield
|
||||
*
|
||||
* \param value Bitfield to be used
|
||||
*
|
||||
* Uses a bitfield to builds the flag value. (e.g. if bit 0 is active, then Enum value 0 will be set as active).
|
||||
*/
|
||||
*/
|
||||
template<typename E>
|
||||
constexpr Flags<E>::Flags(BitField value) :
|
||||
m_value(value)
|
||||
|
|
@ -209,68 +209,67 @@ namespace Nz
|
|||
{
|
||||
return 1U << static_cast<BitField>(enumValue);
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Override binary NOT operator on enum to turns into a Flags object.
|
||||
* \return A Flags object with reversed bits.
|
||||
*
|
||||
* \param lhs Enumeration value to reverse.
|
||||
*
|
||||
* Returns a Flags object with all state enabled except for the enum one.
|
||||
*/
|
||||
template<typename E>
|
||||
constexpr std::enable_if_t<Nz::EnumAsFlags<E>::value, Nz::Flags<E>> operator~(E lhs)
|
||||
{
|
||||
return ~Nz::Flags<E>(lhs);
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Override binary NOT operator on enum to turns into a Flags object.
|
||||
* \return A Flags object with reversed bits.
|
||||
*
|
||||
* \param lhs Enumeration value to reverse.
|
||||
*
|
||||
* Returns a Flags object with all state enabled except for the enum one.
|
||||
*/
|
||||
template<typename E>
|
||||
constexpr std::enable_if_t<EnumAsFlags<E>::value, Flags<E>> operator~(E lhs)
|
||||
{
|
||||
return ~Flags<E>(lhs);
|
||||
}
|
||||
/*!
|
||||
* \brief Override binary OR operator on enum to turns into a Flags object.
|
||||
* \return A Flags object with combined enum states.
|
||||
*
|
||||
* \param lhs First enumeration value to combine.
|
||||
* \param rhs Second enumeration value to combine.
|
||||
*
|
||||
* Returns a Flags object with combined states from the two enumeration values.
|
||||
*/
|
||||
template<typename E>
|
||||
constexpr std::enable_if_t<Nz::EnumAsFlags<E>::value, Nz::Flags<E>> operator|(E lhs, E rhs)
|
||||
{
|
||||
return Nz::Flags<E>(lhs) | rhs;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Override binary OR operator on enum to turns into a Flags object.
|
||||
* \return A Flags object with combined enum states.
|
||||
*
|
||||
* \param lhs First enumeration value to combine.
|
||||
* \param rhs Second enumeration value to combine.
|
||||
*
|
||||
* Returns a Flags object with combined states from the two enumeration values.
|
||||
*/
|
||||
template<typename E>
|
||||
constexpr std::enable_if_t<EnumAsFlags<E>::value, Flags<E>> operator|(E lhs, E rhs)
|
||||
{
|
||||
return Flags<E>(lhs) | rhs;
|
||||
}
|
||||
/*!
|
||||
* \brief Override binary AND operator on enum to turns into a Flags object.
|
||||
* \return A Flags object with compare enum states.
|
||||
*
|
||||
* \param lhs First enumeration value to compare.
|
||||
* \param rhs Second enumeration value to compare.
|
||||
*
|
||||
* Returns a Flags object with compared states from the two enumeration values.
|
||||
* In this case, only one flag will be enabled if both enumeration values are the same.
|
||||
*/
|
||||
template<typename E>
|
||||
constexpr std::enable_if_t<Nz::EnumAsFlags<E>::value, Nz::Flags<E>> operator&(E lhs, E rhs)
|
||||
{
|
||||
return Nz::Flags<E>(lhs) & rhs;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Override binary AND operator on enum to turns into a Flags object.
|
||||
* \return A Flags object with compare enum states.
|
||||
*
|
||||
* \param lhs First enumeration value to compare.
|
||||
* \param rhs Second enumeration value to compare.
|
||||
*
|
||||
* Returns a Flags object with compared states from the two enumeration values.
|
||||
* In this case, only one flag will be enabled if both enumeration values are the same.
|
||||
*/
|
||||
template<typename E>
|
||||
constexpr std::enable_if_t<EnumAsFlags<E>::value, Flags<E>> operator&(E lhs, E rhs)
|
||||
{
|
||||
return Flags<E>(lhs) & rhs;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Override binary XOR operator on enum to turns into a Flags object.
|
||||
* \return A Flags object with XORed enum states.
|
||||
*
|
||||
* \param lhs First enumeration value to compare.
|
||||
* \param rhs Second enumeration value to compare.
|
||||
*
|
||||
* Returns a Flags object with XORed states from the two enumeration values.
|
||||
* In this case, two flags will be enabled if both the enumeration values are different.
|
||||
*/
|
||||
template<typename E>
|
||||
constexpr std::enable_if_t<EnumAsFlags<E>::value, Flags<E>> operator^(E lhs, E rhs)
|
||||
{
|
||||
return Flags<E>(lhs) ^ rhs;
|
||||
}
|
||||
/*!
|
||||
* \brief Override binary XOR operator on enum to turns into a Flags object.
|
||||
* \return A Flags object with XORed enum states.
|
||||
*
|
||||
* \param lhs First enumeration value to compare.
|
||||
* \param rhs Second enumeration value to compare.
|
||||
*
|
||||
* Returns a Flags object with XORed states from the two enumeration values.
|
||||
* In this case, two flags will be enabled if both the enumeration values are different.
|
||||
*/
|
||||
template<typename E>
|
||||
constexpr std::enable_if_t<Nz::EnumAsFlags<E>::value, Nz::Flags<E>> operator^(E lhs, E rhs)
|
||||
{
|
||||
return Nz::Flags<E>(lhs) ^ rhs;
|
||||
}
|
||||
|
||||
#include <Nazara/Core/DebugOff.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 - Core module"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
|
|
@ -38,6 +38,9 @@ namespace Nz
|
|||
template<typename T, typename... Args>
|
||||
T* PlacementNew(T* ptr, Args&&... args);
|
||||
|
||||
template<typename T>
|
||||
void PlacementDestroy(T* ptr);
|
||||
|
||||
class StackAllocation
|
||||
{
|
||||
public:
|
||||
|
|
|
|||
|
|
@ -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 - Core module"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
|
|
@ -64,6 +64,17 @@ namespace Nz
|
|||
return new (ptr) T(std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Calls the object destructor explicitly
|
||||
*
|
||||
* \param ptr Pointer to a previously constructed pointer on raw memory
|
||||
*/
|
||||
template<typename T>
|
||||
void PlacementDestroy(T* ptr)
|
||||
{
|
||||
ptr->~T();
|
||||
}
|
||||
|
||||
/*!
|
||||
* \ingroup core
|
||||
* \class Nz::StackAllocation
|
||||
|
|
|
|||
|
|
@ -22,12 +22,14 @@ namespace Nz
|
|||
~MemoryPool() = default;
|
||||
|
||||
void* Allocate(unsigned int size);
|
||||
|
||||
template<typename T> void Delete(T* ptr);
|
||||
|
||||
void Free(void* ptr);
|
||||
|
||||
unsigned int GetBlockSize() const;
|
||||
unsigned int GetFreeBlocks() const;
|
||||
unsigned int GetSize() const;
|
||||
inline unsigned int GetBlockSize() const;
|
||||
inline unsigned int GetFreeBlocks() const;
|
||||
inline unsigned int GetSize() const;
|
||||
|
||||
template<typename T, typename... Args> T* New(Args&&... args);
|
||||
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
// This file is part of the "Nazara Engine - Core module"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#include <Nazara/Core/MemoryPool.hpp>
|
||||
#include <Nazara/Core/MemoryHelper.hpp>
|
||||
#include <utility>
|
||||
#include <stdexcept>
|
||||
|
|
@ -95,9 +96,8 @@ namespace Nz
|
|||
*
|
||||
* \remark If ptr is null, nothing is done
|
||||
*/
|
||||
|
||||
template<typename T>
|
||||
inline void MemoryPool::Delete(T* ptr)
|
||||
void MemoryPool::Delete(T* ptr)
|
||||
{
|
||||
if (ptr)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ namespace Nz
|
|||
template<typename T> bool operator<(const T& lhs, const ObjectHandle<T>& rhs);
|
||||
template<typename T> bool operator<(const ObjectHandle<T>& lhs, const T& rhs);
|
||||
|
||||
template<typename T> bool operator<=(const ObjectHandle<T>, const ObjectHandle<T>& rhs);
|
||||
template<typename T> bool operator<=(const ObjectHandle<T>&, const ObjectHandle<T>& rhs);
|
||||
template<typename T> bool operator<=(const T& lhs, const ObjectHandle<T>& rhs);
|
||||
template<typename T> bool operator<=(const ObjectHandle<T>& lhs, const T& rhs);
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
@ -68,4 +68,4 @@ namespace Nz
|
|||
|
||||
#include <Nazara/Network/AbstractSocket.inl>
|
||||
|
||||
#endif // NAZARA_ABSTRACTSOCKET_HPP
|
||||
#endif // NAZARA_ABSTRACTSOCKET_HPP
|
||||
|
|
|
|||
|
|
@ -7,6 +7,8 @@
|
|||
#ifndef NAZARA_ENUMS_NETWORK_HPP
|
||||
#define NAZARA_ENUMS_NETWORK_HPP
|
||||
|
||||
#include <Nazara/Prerequesites.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
enum NetCode : UInt16
|
||||
|
|
|
|||
|
|
@ -0,0 +1,21 @@
|
|||
// 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
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef NAZARA_NETBUFFER_HPP
|
||||
#define NAZARA_NETBUFFER_HPP
|
||||
|
||||
#include <Nazara/Prerequesites.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
struct NetBuffer
|
||||
{
|
||||
void* data;
|
||||
std::size_t dataLength;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // NAZARA_NETBUFFER_HPP
|
||||
|
|
@ -13,6 +13,7 @@
|
|||
#include <Nazara/Core/Stream.hpp>
|
||||
#include <Nazara/Network/AbstractSocket.hpp>
|
||||
#include <Nazara/Network/IpAddress.hpp>
|
||||
#include <Nazara/Network/NetBuffer.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
|
|
@ -49,6 +50,7 @@ namespace Nz
|
|||
bool ReceivePacket(NetPacket* packet);
|
||||
|
||||
bool Send(const void* buffer, std::size_t size, std::size_t* sent);
|
||||
bool SendMultiple(const NetBuffer* buffers, std::size_t bufferCount, std::size_t* sent);
|
||||
bool SendPacket(const NetPacket& packet);
|
||||
|
||||
bool SetCursorPos(UInt64 offset) override;
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
#include <Nazara/Prerequesites.hpp>
|
||||
#include <Nazara/Network/AbstractSocket.hpp>
|
||||
#include <Nazara/Network/IpAddress.hpp>
|
||||
#include <Nazara/Network/NetBuffer.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
|
|
@ -29,7 +30,7 @@ namespace Nz
|
|||
inline bool Create(NetProtocol protocol);
|
||||
|
||||
void EnableBroadcasting(bool broadcasting);
|
||||
|
||||
|
||||
inline IpAddress GetBoundAddress() const;
|
||||
inline UInt16 GetBoundPort() const;
|
||||
inline SocketState GetState() const;
|
||||
|
|
@ -42,6 +43,7 @@ namespace Nz
|
|||
bool ReceivePacket(NetPacket* packet, IpAddress* from);
|
||||
|
||||
bool Send(const IpAddress& to, const void* buffer, std::size_t size, std::size_t* sent);
|
||||
bool SendMultiple(const IpAddress& to, const NetBuffer* buffers, std::size_t bufferCount, std::size_t* sent);
|
||||
bool SendPacket(const IpAddress& to, const NetPacket& packet);
|
||||
|
||||
private:
|
||||
|
|
@ -55,4 +57,4 @@ namespace Nz
|
|||
|
||||
#include <Nazara/Network/UdpSocket.inl>
|
||||
|
||||
#endif // NAZARA_UDPSOCKET_HPP
|
||||
#endif // NAZARA_UDPSOCKET_HPP
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ namespace Nz
|
|||
static std::array<Vector4f, 2 * 2 * 2 * 2 * 2> s_gradients4;
|
||||
|
||||
private:
|
||||
std::default_random_engine m_randomEngine;
|
||||
std::mt19937 m_randomEngine;
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -77,8 +77,8 @@
|
|||
|
||||
// Nazara version macro
|
||||
#define NAZARA_VERSION_MAJOR 0
|
||||
#define NAZARA_VERSION_MINOR 2
|
||||
#define NAZARA_VERSION_PATCH 1
|
||||
#define NAZARA_VERSION_MINOR 3
|
||||
#define NAZARA_VERSION_PATCH 0
|
||||
|
||||
#include <Nazara/Core/Config.hpp>
|
||||
|
||||
|
|
|
|||
|
|
@ -5102,10 +5102,14 @@ namespace Nz
|
|||
*/
|
||||
String String::FormatVA(const char* format, va_list args)
|
||||
{
|
||||
// Copy va_list to use it twice
|
||||
va_list args2;
|
||||
va_copy(args2, args);
|
||||
|
||||
std::size_t length = std::vsnprintf(nullptr, 0, format, args);
|
||||
|
||||
auto str = std::make_shared<SharedString>(length);
|
||||
std::vsnprintf(str->string.get(), length + 1, format, args);
|
||||
std::vsnprintf(str->string.get(), length + 1, format, args2);
|
||||
|
||||
return String(std::move(str));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -68,7 +68,7 @@ namespace Nz
|
|||
* \param sceneData Data of the scene
|
||||
*/
|
||||
|
||||
void DepthRenderTechnique::Clear(const SceneData& sceneData) const
|
||||
void DepthRenderTechnique::Clear(const SceneData& /*sceneData*/) const
|
||||
{
|
||||
Renderer::Enable(RendererParameter_DepthBuffer, true);
|
||||
Renderer::Enable(RendererParameter_DepthWrite, true);
|
||||
|
|
|
|||
|
|
@ -1011,7 +1011,6 @@ namespace Nz
|
|||
if (uniforms.locations.shadowMapping != -1)
|
||||
shader->SendBoolean(uniforms.locations.shadowMapping + uniformOffset, light.shadowMap != nullptr);
|
||||
|
||||
unsigned int textureUnit = Material::GetTextureUnit(static_cast<TextureMap>(TextureMap_ShadowCube_1 + index));
|
||||
if (light.shadowMap)
|
||||
{
|
||||
unsigned int textureUnitCube = Material::GetTextureUnit(static_cast<TextureMap>(TextureMap_ShadowCube_1 + index));
|
||||
|
|
@ -1035,7 +1034,6 @@ namespace Nz
|
|||
if (uniforms.locations.shadowMapping != -1)
|
||||
shader->SendBoolean(uniforms.locations.shadowMapping + uniformOffset, light.shadowMap != nullptr);
|
||||
|
||||
unsigned int textureUnit = Material::GetTextureUnit(static_cast<TextureMap>(TextureMap_Shadow2D_1 + index));
|
||||
if (light.shadowMap)
|
||||
{
|
||||
unsigned int textureUnit2D = Material::GetTextureUnit(static_cast<TextureMap>(TextureMap_Shadow2D_1 + index));
|
||||
|
|
|
|||
|
|
@ -40,9 +40,9 @@ namespace Nz
|
|||
|
||||
ParticleGroup::ParticleGroup(unsigned int maxParticleCount, ParticleDeclarationConstRef declaration) :
|
||||
m_declaration(std::move(declaration)),
|
||||
m_processing(false),
|
||||
m_maxParticleCount(maxParticleCount),
|
||||
m_particleCount(0)
|
||||
m_particleCount(0),
|
||||
m_processing(false)
|
||||
{
|
||||
// In case of error, the constructor can only throw an exception
|
||||
ErrorFlags flags(ErrorFlag_ThrowException, true);
|
||||
|
|
@ -64,10 +64,10 @@ namespace Nz
|
|||
m_generators(system.m_generators),
|
||||
m_declaration(system.m_declaration),
|
||||
m_renderer(system.m_renderer),
|
||||
m_processing(false),
|
||||
m_maxParticleCount(system.m_maxParticleCount),
|
||||
m_particleCount(system.m_particleCount),
|
||||
m_particleSize(system.m_particleSize)
|
||||
m_particleSize(system.m_particleSize),
|
||||
m_processing(false)
|
||||
{
|
||||
ErrorFlags flags(ErrorFlag_ThrowException, true);
|
||||
|
||||
|
|
|
|||
|
|
@ -117,8 +117,7 @@ namespace Nz
|
|||
*/
|
||||
std::size_t AbstractSocket::QueryReceiveBufferSize() const
|
||||
{
|
||||
if (m_handle == SocketImpl::InvalidHandle)
|
||||
return 0;
|
||||
NazaraAssert(m_handle != SocketImpl::InvalidHandle, "Socket must be created first");
|
||||
|
||||
return SocketImpl::QueryReceiveBufferSize(m_handle);
|
||||
}
|
||||
|
|
@ -129,8 +128,7 @@ namespace Nz
|
|||
*/
|
||||
std::size_t AbstractSocket::QuerySendBufferSize() const
|
||||
{
|
||||
if (m_handle == SocketImpl::InvalidHandle)
|
||||
return 0;
|
||||
NazaraAssert(m_handle != SocketImpl::InvalidHandle, "Socket must be created first");
|
||||
|
||||
return SocketImpl::QuerySendBufferSize(m_handle);
|
||||
}
|
||||
|
|
@ -142,8 +140,9 @@ namespace Nz
|
|||
*/
|
||||
void AbstractSocket::SetReceiveBufferSize(std::size_t size)
|
||||
{
|
||||
if (m_handle != SocketImpl::InvalidHandle)
|
||||
SocketImpl::SetReceiveBufferSize(m_handle, size);
|
||||
NazaraAssert(m_handle != SocketImpl::InvalidHandle, "Socket must be created first");
|
||||
|
||||
SocketImpl::SetReceiveBufferSize(m_handle, size);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
|
@ -153,8 +152,9 @@ namespace Nz
|
|||
*/
|
||||
void AbstractSocket::SetSendBufferSize(std::size_t size)
|
||||
{
|
||||
if (m_handle != SocketImpl::InvalidHandle)
|
||||
SocketImpl::SetSendBufferSize(m_handle, size);
|
||||
NazaraAssert(m_handle != SocketImpl::InvalidHandle, "Socket must be created first");
|
||||
|
||||
SocketImpl::SetSendBufferSize(m_handle, size);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
|
|
|||
|
|
@ -5,10 +5,12 @@
|
|||
#include <Nazara/Network/Posix/SocketImpl.hpp>
|
||||
#include <Nazara/Core/Error.hpp>
|
||||
#include <Nazara/Core/Log.hpp>
|
||||
#include <Nazara/Core/MemoryHelper.hpp>
|
||||
#include <Nazara/Network/Posix/IpAddressImpl.hpp>
|
||||
#include <netinet/tcp.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/uio.h>
|
||||
#include <poll.h>
|
||||
#include <unistd.h>
|
||||
#include <cstring>
|
||||
|
|
@ -463,6 +465,9 @@ namespace Nz
|
|||
if (byteRead == SOCKET_ERROR)
|
||||
{
|
||||
int errorCode = GetLastErrorCode();
|
||||
if (errorCode == EAGAIN)
|
||||
errorCode = EWOULDBLOCK;
|
||||
|
||||
switch (errorCode)
|
||||
{
|
||||
case EWOULDBLOCK:
|
||||
|
|
@ -512,6 +517,9 @@ namespace Nz
|
|||
if (byteRead == SOCKET_ERROR)
|
||||
{
|
||||
int errorCode = GetLastErrorCode();
|
||||
if (errorCode == EAGAIN)
|
||||
errorCode = EWOULDBLOCK;
|
||||
|
||||
switch (errorCode)
|
||||
{
|
||||
case EWOULDBLOCK:
|
||||
|
|
@ -561,10 +569,24 @@ namespace Nz
|
|||
int byteSent = send(handle, reinterpret_cast<const char*>(buffer), length, 0);
|
||||
if (byteSent == SOCKET_ERROR)
|
||||
{
|
||||
if (error)
|
||||
*error = TranslateErrnoToResolveError(GetLastErrorCode());
|
||||
int errorCode = GetLastErrorCode();
|
||||
if (errorCode == EAGAIN)
|
||||
errorCode = EWOULDBLOCK;
|
||||
|
||||
return false; //< Error
|
||||
switch (errorCode)
|
||||
{
|
||||
case EWOULDBLOCK:
|
||||
byteSent = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
if (error)
|
||||
*error = TranslateErrnoToResolveError(errorCode);
|
||||
|
||||
return false; //< Error
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (sent)
|
||||
|
|
@ -576,6 +598,60 @@ namespace Nz
|
|||
return true;
|
||||
}
|
||||
|
||||
bool SocketImpl::SendMultiple(SocketHandle handle, const NetBuffer* buffers, std::size_t bufferCount, const IpAddress& to, int* sent, SocketError* error)
|
||||
{
|
||||
NazaraAssert(handle != InvalidHandle, "Invalid handle");
|
||||
NazaraAssert(buffers && bufferCount > 0, "Invalid buffers");
|
||||
|
||||
StackAllocation memory = NazaraStackAllocation(bufferCount * sizeof(iovec));
|
||||
struct iovec* sysBuffers = static_cast<struct iovec*>(memory.GetPtr());
|
||||
for (std::size_t i = 0; i < bufferCount; ++i)
|
||||
{
|
||||
sysBuffers[i].iov_base = buffers[i].data;
|
||||
sysBuffers[i].iov_len = buffers[i].dataLength;
|
||||
}
|
||||
|
||||
struct msghdr msgHdr;
|
||||
std::memset(&msgHdr, 0, sizeof(msgHdr));
|
||||
|
||||
IpAddressImpl::SockAddrBuffer nameBuffer;
|
||||
msgHdr.msg_namelen = IpAddressImpl::ToSockAddr(to, nameBuffer.data());
|
||||
msgHdr.msg_name = nameBuffer.data();
|
||||
msgHdr.msg_iov = sysBuffers;
|
||||
msgHdr.msg_iovlen = static_cast<int>(bufferCount);
|
||||
|
||||
int byteSent = sendmsg(handle, &msgHdr, MSG_NOSIGNAL);
|
||||
if (byteSent == SOCKET_ERROR)
|
||||
{
|
||||
int errorCode = GetLastErrorCode();
|
||||
if (errorCode == EAGAIN)
|
||||
errorCode = EWOULDBLOCK;
|
||||
|
||||
switch (errorCode)
|
||||
{
|
||||
case EWOULDBLOCK:
|
||||
byteSent = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
if (error)
|
||||
*error = TranslateErrnoToResolveError(errorCode);
|
||||
|
||||
return false; //< Error
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (sent)
|
||||
*sent = static_cast<int>(byteSent);
|
||||
|
||||
if (error)
|
||||
*error = SocketError_NoError;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SocketImpl::SendTo(SocketHandle handle, const void* buffer, int length, const IpAddress& to, int* sent, SocketError* error)
|
||||
{
|
||||
NazaraAssert(handle != InvalidHandle, "Invalid handle");
|
||||
|
|
@ -587,10 +663,24 @@ namespace Nz
|
|||
int byteSent = sendto(handle, reinterpret_cast<const char*>(buffer), length, 0, reinterpret_cast<const sockaddr*>(nameBuffer.data()), bufferLength);
|
||||
if (byteSent == SOCKET_ERROR)
|
||||
{
|
||||
if (error)
|
||||
*error = TranslateErrnoToResolveError(GetLastErrorCode());
|
||||
int errorCode = GetLastErrorCode();
|
||||
if (errorCode == EAGAIN)
|
||||
errorCode = EWOULDBLOCK;
|
||||
|
||||
return false; //< Error
|
||||
switch (errorCode)
|
||||
{
|
||||
case EWOULDBLOCK:
|
||||
byteSent = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
if (error)
|
||||
*error = TranslateErrnoToResolveError(errorCode);
|
||||
|
||||
return false; //< Error
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (sent)
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
#include <Nazara/Network/SocketHandle.hpp>
|
||||
#include <Nazara/Network/Enums.hpp>
|
||||
#include <Nazara/Network/IpAddress.hpp>
|
||||
#include <Nazara/Network/NetBuffer.hpp>
|
||||
|
||||
#define NAZARA_NETWORK_POLL_SUPPORT 1
|
||||
|
||||
|
|
@ -64,6 +65,7 @@ namespace Nz
|
|||
static bool ReceiveFrom(SocketHandle handle, void* buffer, int length, IpAddress* from, int* read, SocketError* error);
|
||||
|
||||
static bool Send(SocketHandle handle, const void* buffer, int length, int* sent, SocketError* error);
|
||||
static bool SendMultiple(SocketHandle handle, const NetBuffer* buffers, std::size_t bufferCount, const IpAddress& to, int* sent, SocketError* error);
|
||||
static bool SendTo(SocketHandle handle, const void* buffer, int length, const IpAddress& to, int* sent, SocketError* error);
|
||||
|
||||
static bool SetBlocking(SocketHandle handle, bool blocking, SocketError* error = nullptr);
|
||||
|
|
@ -87,4 +89,4 @@ namespace Nz
|
|||
};
|
||||
}
|
||||
|
||||
#endif // NAZARA_SOCKETIMPL_HPP
|
||||
#endif // NAZARA_SOCKETIMPL_HPP
|
||||
|
|
|
|||
|
|
@ -353,6 +353,45 @@ namespace Nz
|
|||
return true;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Sends multiple buffers at once
|
||||
* \return true If data were sent
|
||||
*
|
||||
* \param buffers A pointer to an array of NetBuffer containing buffers and size data
|
||||
* \param size Number of NetBuffer to send
|
||||
* \param sent Optional argument to get the number of bytes sent
|
||||
*/
|
||||
bool TcpClient::SendMultiple(const NetBuffer* buffers, std::size_t bufferCount, std::size_t* sent)
|
||||
{
|
||||
NazaraAssert(buffers && bufferCount > 0, "Invalid buffer");
|
||||
|
||||
int byteSent;
|
||||
if (!SocketImpl::SendMultiple(m_handle, buffers, bufferCount, m_peerAddress, &byteSent, &m_lastError))
|
||||
{
|
||||
switch (m_lastError)
|
||||
{
|
||||
case SocketError_ConnectionClosed:
|
||||
case SocketError_ConnectionRefused:
|
||||
UpdateState(SocketState_NotConnected);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (sent)
|
||||
*sent = byteSent;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if (sent)
|
||||
*sent = byteSent;
|
||||
|
||||
UpdateState(SocketState_Connected);
|
||||
return true;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Sends the packet available
|
||||
* \return true If packet sent
|
||||
|
|
|
|||
|
|
@ -17,6 +17,12 @@
|
|||
|
||||
namespace Nz
|
||||
{
|
||||
/*!
|
||||
* \ingroup network
|
||||
* \class Nz::UdpSocket
|
||||
* \brief Network class that represents a UDP socket, allowing for sending/receiving datagrams.
|
||||
*/
|
||||
|
||||
/*!
|
||||
* \brief Binds a specific IpAddress
|
||||
* \return State of the socket
|
||||
|
|
@ -93,7 +99,18 @@ namespace Nz
|
|||
|
||||
int read;
|
||||
if (!SocketImpl::ReceiveFrom(m_handle, buffer, static_cast<int>(size), from, &read, &m_lastError))
|
||||
return false;
|
||||
{
|
||||
switch (m_lastError)
|
||||
{
|
||||
case SocketError_ConnectionClosed:
|
||||
m_lastError = SocketError_NoError;
|
||||
read = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (received)
|
||||
*received = read;
|
||||
|
|
@ -179,6 +196,31 @@ namespace Nz
|
|||
return true;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Sends multiple buffers as one datagram
|
||||
* \return true If data were sent
|
||||
*
|
||||
* \param to Destination IpAddress (must match socket protocol)
|
||||
* \param buffers A pointer to an array of NetBuffer containing buffers and size data
|
||||
* \param size Number of NetBuffer to send
|
||||
* \param sent Optional argument to get the number of bytes sent
|
||||
*/
|
||||
bool UdpSocket::SendMultiple(const IpAddress& to, const NetBuffer* buffers, std::size_t bufferCount, std::size_t* sent)
|
||||
{
|
||||
NazaraAssert(to.IsValid(), "Invalid ip address");
|
||||
NazaraAssert(to.GetProtocol() == m_protocol, "IP Address has a different protocol than the socket");
|
||||
NazaraAssert(buffers && bufferCount > 0, "Invalid buffer");
|
||||
|
||||
int byteSent;
|
||||
if (!SocketImpl::SendMultiple(m_handle, buffers, bufferCount, to, &byteSent, &m_lastError))
|
||||
return false;
|
||||
|
||||
if (sent)
|
||||
*sent = byteSent;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Sends the packet available
|
||||
* \return true If packet sent
|
||||
|
|
|
|||
|
|
@ -1,10 +1,11 @@
|
|||
// 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
|
||||
|
||||
#include <Nazara/Network/Win32/SocketImpl.hpp>
|
||||
#include <Nazara/Core/Error.hpp>
|
||||
#include <Nazara/Core/Log.hpp>
|
||||
#include <Nazara/Core/MemoryHelper.hpp>
|
||||
#include <Nazara/Network/Win32/IpAddressImpl.hpp>
|
||||
|
||||
#if defined(NAZARA_COMPILER_MINGW) && __GNUC__ < 5
|
||||
|
|
@ -593,10 +594,23 @@ namespace Nz
|
|||
int byteSent = send(handle, reinterpret_cast<const char*>(buffer), length, 0);
|
||||
if (byteSent == SOCKET_ERROR)
|
||||
{
|
||||
if (error)
|
||||
*error = TranslateWSAErrorToSocketError(WSAGetLastError());
|
||||
int errorCode = WSAGetLastError();
|
||||
switch (errorCode)
|
||||
{
|
||||
case WSAEWOULDBLOCK:
|
||||
{
|
||||
byteSent = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return false; //< Error
|
||||
default:
|
||||
{
|
||||
if (error)
|
||||
*error = TranslateWSAErrorToSocketError(errorCode);
|
||||
|
||||
return false; //< Error
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (sent)
|
||||
|
|
@ -608,6 +622,53 @@ namespace Nz
|
|||
return true;
|
||||
}
|
||||
|
||||
bool SocketImpl::SendMultiple(SocketHandle handle, const NetBuffer* buffers, std::size_t bufferCount, const IpAddress& to, int* sent, SocketError* error)
|
||||
{
|
||||
NazaraAssert(handle != InvalidHandle, "Invalid handle");
|
||||
NazaraAssert(buffers && bufferCount > 0, "Invalid buffers");
|
||||
|
||||
IpAddressImpl::SockAddrBuffer nameBuffer;
|
||||
int bufferLength = IpAddressImpl::ToSockAddr(to, nameBuffer.data());
|
||||
|
||||
StackAllocation memory = NazaraStackAllocation(bufferCount * sizeof(WSABUF));
|
||||
WSABUF* winBuffers = static_cast<WSABUF*>(memory.GetPtr());
|
||||
for (std::size_t i = 0; i < bufferCount; ++i)
|
||||
{
|
||||
winBuffers[i].buf = static_cast<CHAR*>(buffers[i].data);
|
||||
winBuffers[i].len = static_cast<ULONG>(buffers[i].dataLength);
|
||||
}
|
||||
|
||||
DWORD byteSent;
|
||||
if (WSASendTo(handle, winBuffers, static_cast<DWORD>(bufferCount), &byteSent, 0, reinterpret_cast<const sockaddr*>(nameBuffer.data()), bufferLength, nullptr, nullptr) == SOCKET_ERROR)
|
||||
{
|
||||
int errorCode = WSAGetLastError();
|
||||
switch (errorCode)
|
||||
{
|
||||
case WSAEWOULDBLOCK:
|
||||
{
|
||||
byteSent = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
if (error)
|
||||
*error = TranslateWSAErrorToSocketError(errorCode);
|
||||
|
||||
return false; //< Error
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (sent)
|
||||
*sent = static_cast<int>(byteSent);
|
||||
|
||||
if (error)
|
||||
*error = SocketError_NoError;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SocketImpl::SendTo(SocketHandle handle, const void* buffer, int length, const IpAddress& to, int* sent, SocketError* error)
|
||||
{
|
||||
NazaraAssert(handle != InvalidHandle, "Invalid handle");
|
||||
|
|
@ -619,10 +680,23 @@ namespace Nz
|
|||
int byteSent = sendto(handle, reinterpret_cast<const char*>(buffer), length, 0, reinterpret_cast<const sockaddr*>(nameBuffer.data()), bufferLength);
|
||||
if (byteSent == SOCKET_ERROR)
|
||||
{
|
||||
if (error)
|
||||
*error = TranslateWSAErrorToSocketError(WSAGetLastError());
|
||||
int errorCode = WSAGetLastError();
|
||||
switch (errorCode)
|
||||
{
|
||||
case WSAEWOULDBLOCK:
|
||||
{
|
||||
byteSent = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return false; //< Error
|
||||
default:
|
||||
{
|
||||
if (error)
|
||||
*error = TranslateWSAErrorToSocketError(errorCode);
|
||||
|
||||
return false; //< Error
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (sent)
|
||||
|
|
@ -719,7 +793,7 @@ namespace Nz
|
|||
{
|
||||
NazaraAssert(handle != InvalidHandle, "Invalid handle");
|
||||
|
||||
DWORD option = size;
|
||||
DWORD option = static_cast<DWORD>(size);
|
||||
if (setsockopt(handle, SOL_SOCKET, SO_RCVBUF, reinterpret_cast<const char*>(&option), sizeof(option)) == SOCKET_ERROR)
|
||||
{
|
||||
if (error)
|
||||
|
|
@ -738,7 +812,7 @@ namespace Nz
|
|||
{
|
||||
NazaraAssert(handle != InvalidHandle, "Invalid handle");
|
||||
|
||||
DWORD option = size;
|
||||
DWORD option = static_cast<DWORD>(size);
|
||||
if (setsockopt(handle, SOL_SOCKET, SO_SNDBUF, reinterpret_cast<const char*>(&option), sizeof(option)) == SOCKET_ERROR)
|
||||
{
|
||||
if (error)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
@ -7,9 +7,10 @@
|
|||
#ifndef NAZARA_SOCKETIMPL_HPP
|
||||
#define NAZARA_SOCKETIMPL_HPP
|
||||
|
||||
#include <Nazara/Network/SocketHandle.hpp>
|
||||
#include <Nazara/Network/Enums.hpp>
|
||||
#include <Nazara/Network/IpAddress.hpp>
|
||||
#include <Nazara/Network/NetBuffer.hpp>
|
||||
#include <Nazara/Network/SocketHandle.hpp>
|
||||
#include <winsock2.h>
|
||||
|
||||
#define NAZARA_NETWORK_POLL_SUPPORT NAZARA_CORE_WINDOWS_NT6
|
||||
|
|
@ -34,7 +35,7 @@ namespace Nz
|
|||
static SocketState Bind(SocketHandle handle, const IpAddress& address, SocketError* error);
|
||||
|
||||
static SocketHandle Create(NetProtocol protocol, SocketType type, SocketError* error);
|
||||
|
||||
|
||||
static void ClearErrorCode(SocketHandle handle);
|
||||
static void Close(SocketHandle handle);
|
||||
|
||||
|
|
@ -65,6 +66,7 @@ namespace Nz
|
|||
static bool ReceiveFrom(SocketHandle handle, void* buffer, int length, IpAddress* from, int* read, SocketError* error);
|
||||
|
||||
static bool Send(SocketHandle handle, const void* buffer, int length, int* sent, SocketError* error);
|
||||
static bool SendMultiple(SocketHandle handle, const NetBuffer* buffers, std::size_t bufferCount, const IpAddress& to, int* sent, SocketError* error);
|
||||
static bool SendTo(SocketHandle handle, const void* buffer, int length, const IpAddress& to, int* sent, SocketError* error);
|
||||
|
||||
static bool SetBlocking(SocketHandle handle, bool blocking, SocketError* error = nullptr);
|
||||
|
|
@ -87,4 +89,4 @@ namespace Nz
|
|||
};
|
||||
}
|
||||
|
||||
#endif // NAZARA_SOCKETIMPL_HPP
|
||||
#endif // NAZARA_SOCKETIMPL_HPP
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ namespace Nz
|
|||
unsigned int width;
|
||||
};
|
||||
|
||||
unsigned int attachmentIndex[AttachmentPoint_Max+1] =
|
||||
unsigned int s_attachmentIndex[AttachmentPoint_Max+1] =
|
||||
{
|
||||
3, // AttachmentPoint_Color
|
||||
0, // AttachmentPoint_Depth
|
||||
|
|
@ -117,7 +117,7 @@ namespace Nz
|
|||
return false;
|
||||
}
|
||||
|
||||
unsigned int depthStencilIndex = attachmentIndex[AttachmentPoint_DepthStencil];
|
||||
unsigned int depthStencilIndex = s_attachmentIndex[AttachmentPoint_DepthStencil];
|
||||
if (m_impl->attachments.size() > depthStencilIndex && m_impl->attachments[depthStencilIndex].isUsed)
|
||||
{
|
||||
if (attachmentPoint == AttachmentPoint_Depth)
|
||||
|
|
@ -154,7 +154,7 @@ namespace Nz
|
|||
|
||||
Unlock();
|
||||
|
||||
unsigned int attachIndex = attachmentIndex[attachmentPoint] + index;
|
||||
unsigned int attachIndex = s_attachmentIndex[attachmentPoint] + index;
|
||||
if (attachIndex >= m_impl->attachments.size())
|
||||
m_impl->attachments.resize(attachIndex+1);
|
||||
|
||||
|
|
@ -223,7 +223,7 @@ namespace Nz
|
|||
return false;
|
||||
}
|
||||
|
||||
unsigned int depthStencilIndex = attachmentIndex[AttachmentPoint_DepthStencil];
|
||||
unsigned int depthStencilIndex = s_attachmentIndex[AttachmentPoint_DepthStencil];
|
||||
if (attachmentPoint == AttachmentPoint_Depth && m_impl->attachments.size() > depthStencilIndex &&
|
||||
m_impl->attachments[depthStencilIndex].isUsed)
|
||||
{
|
||||
|
|
@ -288,7 +288,7 @@ namespace Nz
|
|||
|
||||
Unlock();
|
||||
|
||||
unsigned int attachIndex = attachmentIndex[attachmentPoint] + index;
|
||||
unsigned int attachIndex = s_attachmentIndex[attachmentPoint] + index;
|
||||
if (attachIndex >= m_impl->attachments.size())
|
||||
m_impl->attachments.resize(attachIndex+1);
|
||||
|
||||
|
|
@ -394,7 +394,7 @@ namespace Nz
|
|||
}
|
||||
#endif
|
||||
|
||||
unsigned int attachIndex = attachmentIndex[attachmentPoint] + index;
|
||||
unsigned int attachIndex = s_attachmentIndex[attachmentPoint] + index;
|
||||
if (attachIndex >= m_impl->attachments.size())
|
||||
return;
|
||||
|
||||
|
|
@ -575,7 +575,7 @@ namespace Nz
|
|||
#if NAZARA_RENDERER_SAFE
|
||||
for (unsigned int i = 0; i < targetCount; ++i)
|
||||
{
|
||||
unsigned int index = attachmentIndex[AttachmentPoint_Color] + targets[i];
|
||||
unsigned int index = s_attachmentIndex[AttachmentPoint_Color] + targets[i];
|
||||
if (index >= m_impl->attachments.size() || !m_impl->attachments[index].isUsed)
|
||||
{
|
||||
NazaraError("Target " + String::Number(targets[i]) + " not attached");
|
||||
|
|
@ -598,7 +598,7 @@ namespace Nz
|
|||
#if NAZARA_RENDERER_SAFE
|
||||
for (UInt8 target : targets)
|
||||
{
|
||||
unsigned int index = attachmentIndex[AttachmentPoint_Color] + target;
|
||||
unsigned int index = s_attachmentIndex[AttachmentPoint_Color] + target;
|
||||
if (index >= m_impl->attachments.size() || !m_impl->attachments[index].isUsed)
|
||||
{
|
||||
NazaraError("Target " + String::Number(target) + " not attached");
|
||||
|
|
@ -752,7 +752,7 @@ namespace Nz
|
|||
|
||||
for (UInt8 index : m_impl->colorTargets)
|
||||
{
|
||||
Attachment& attachment = m_impl->attachments[attachmentIndex[AttachmentPoint_Color] + index];
|
||||
Attachment& attachment = m_impl->attachments[s_attachmentIndex[AttachmentPoint_Color] + index];
|
||||
if (!attachment.isBuffer)
|
||||
attachment.texture->InvalidateMipmaps();
|
||||
}
|
||||
|
|
@ -833,7 +833,7 @@ namespace Nz
|
|||
m_impl->colorTargets.clear();
|
||||
|
||||
unsigned int colorIndex = 0;
|
||||
for (unsigned int index = attachmentIndex[AttachmentPoint_Color]; index < m_impl->attachments.size(); ++index)
|
||||
for (unsigned int index = s_attachmentIndex[AttachmentPoint_Color]; index < m_impl->attachments.size(); ++index)
|
||||
m_impl->colorTargets.push_back(colorIndex++);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -93,7 +93,7 @@ namespace Nz
|
|||
}
|
||||
catch (const std::exception&)
|
||||
{
|
||||
ErrorFlags errFlags(ErrorFlag_ThrowExceptionDisabled);
|
||||
ErrorFlags errFlags2(ErrorFlag_ThrowExceptionDisabled);
|
||||
|
||||
NazaraError("Shader code failed to compile (" + stage.GetLog() + ")\n" + code.ToString());
|
||||
throw;
|
||||
|
|
|
|||
|
|
@ -835,7 +835,6 @@ namespace Nz
|
|||
if (!PixelFormat::IsCompressed(m_sharedImage->format))
|
||||
{
|
||||
const PixelFormatInfo& info = PixelFormat::GetInfo(m_sharedImage->format);
|
||||
const UInt8* pixel = GetConstPixels();
|
||||
|
||||
Bitset<> workingBitset;
|
||||
std::size_t pixelCount = m_sharedImage->width * m_sharedImage->height * ((m_sharedImage->type == ImageType_Cubemap) ? 6 : m_sharedImage->depth);
|
||||
|
|
|
|||
|
|
@ -35,10 +35,10 @@ namespace Nz
|
|||
IndexBuffer::IndexBuffer(const IndexBuffer& indexBuffer) :
|
||||
RefCounted(),
|
||||
m_buffer(indexBuffer.m_buffer),
|
||||
m_largeIndices(indexBuffer.m_largeIndices),
|
||||
m_endOffset(indexBuffer.m_endOffset),
|
||||
m_indexCount(indexBuffer.m_indexCount),
|
||||
m_startOffset(indexBuffer.m_startOffset)
|
||||
m_startOffset(indexBuffer.m_startOffset),
|
||||
m_largeIndices(indexBuffer.m_largeIndices)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -365,12 +365,14 @@ namespace Nz
|
|||
{
|
||||
case '\n':
|
||||
{
|
||||
// Extend the line bounding rect to the last glyph it contains, thus extending upon all glyphs of the line
|
||||
if (!m_glyphs.empty())
|
||||
{
|
||||
Glyph& glyph = m_glyphs.back();
|
||||
Glyph& lastGlyph = m_glyphs.back();
|
||||
m_lines.back().bounds.ExtendTo(glyph.bounds);
|
||||
}
|
||||
|
||||
// Reset cursor
|
||||
advance = 0;
|
||||
m_drawPos.x = 0;
|
||||
m_drawPos.y += sizeInfo.lineHeight;
|
||||
|
|
|
|||
|
|
@ -31,10 +31,10 @@ namespace Nz
|
|||
VertexBuffer::VertexBuffer(const VertexBuffer& vertexBuffer) :
|
||||
RefCounted(),
|
||||
m_buffer(vertexBuffer.m_buffer),
|
||||
m_vertexDeclaration(vertexBuffer.m_vertexDeclaration),
|
||||
m_endOffset(vertexBuffer.m_endOffset),
|
||||
m_startOffset(vertexBuffer.m_startOffset),
|
||||
m_vertexCount(vertexBuffer.m_vertexCount)
|
||||
m_vertexCount(vertexBuffer.m_vertexCount),
|
||||
m_vertexDeclaration(vertexBuffer.m_vertexDeclaration)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -164,8 +164,19 @@ namespace Nz
|
|||
ScopedXCBConnection connection;
|
||||
xcb_screen_t* screen = X11::XCBDefaultScreen(connection);
|
||||
|
||||
if (xcb_cursor_context_new(connection, screen, &m_cursorContext) >= 0)
|
||||
m_cursor = xcb_cursor_load_cursor(m_cursorContext, s_systemCursorIds[cursor]);
|
||||
const char* cursorName = s_systemCursorIds[cursor];
|
||||
if (cursorName)
|
||||
{
|
||||
if (xcb_cursor_context_new(connection, screen, &m_cursorContext) >= 0)
|
||||
m_cursor = xcb_cursor_load_cursor(m_cursorContext, cursorName);
|
||||
else
|
||||
{
|
||||
NazaraError("Failed to create cursor context");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
m_cursor = s_hiddenCursor;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
@ -232,25 +243,27 @@ namespace Nz
|
|||
|
||||
std::array<const char*, SystemCursor_Max + 1> CursorImpl::s_systemCursorIds =
|
||||
{
|
||||
// http://gnome-look.org/content/preview.php?preview=1&id=128170&file1=128170-1.png&file2=&file3=&name=Dummy+X11+cursors&PHPSESSID=6
|
||||
"crosshair", // SystemCursor_Crosshair
|
||||
"left_ptr", // SystemCursor_Default
|
||||
"hand", // SystemCursor_Hand
|
||||
"help", // SystemCursor_Help
|
||||
"fleur", // SystemCursor_Move
|
||||
nullptr, // SystemCursor_None
|
||||
"hand", // SystemCursor_Pointer
|
||||
"watch", // SystemCursor_Progress
|
||||
"right_side", // SystemCursor_ResizeE
|
||||
"top_side", // SystemCursor_ResizeN
|
||||
"top_right_corner", // SystemCursor_ResizeNE
|
||||
"top_left_corner", // SystemCursor_ResizeNW
|
||||
"bottom_side", // SystemCursor_ResizeS
|
||||
"bottom_right_corner", // SystemCursor_ResizeSE
|
||||
"bottom_left_corner", // SystemCursor_ResizeSW
|
||||
"left_side", // SystemCursor_ResizeW
|
||||
"xterm", // SystemCursor_Text
|
||||
"watch" // SystemCursor_Wait
|
||||
{
|
||||
// http://gnome-look.org/content/preview.php?preview=1&id=128170&file1=128170-1.png&file2=&file3=&name=Dummy+X11+cursors&PHPSESSID=6
|
||||
"crosshair", // SystemCursor_Crosshair
|
||||
"left_ptr", // SystemCursor_Default
|
||||
"hand", // SystemCursor_Hand
|
||||
"help", // SystemCursor_Help
|
||||
"fleur", // SystemCursor_Move
|
||||
nullptr, // SystemCursor_None
|
||||
"hand", // SystemCursor_Pointer
|
||||
"watch", // SystemCursor_Progress
|
||||
"right_side", // SystemCursor_ResizeE
|
||||
"top_side", // SystemCursor_ResizeN
|
||||
"top_right_corner", // SystemCursor_ResizeNE
|
||||
"top_left_corner", // SystemCursor_ResizeNW
|
||||
"bottom_side", // SystemCursor_ResizeS
|
||||
"bottom_right_corner", // SystemCursor_ResizeSE
|
||||
"bottom_left_corner", // SystemCursor_ResizeSW
|
||||
"left_side", // SystemCursor_ResizeW
|
||||
"xterm", // SystemCursor_Text
|
||||
"watch" // SystemCursor_Wait
|
||||
}
|
||||
};
|
||||
|
||||
static_assert(SystemCursor_Max + 1 == 18, "System cursor array is incomplete");
|
||||
|
|
|
|||
|
|
@ -229,14 +229,14 @@ namespace Nz
|
|||
return screen_nbr;
|
||||
}
|
||||
|
||||
xcb_screen_t* X11::XCBScreenOfDisplay(xcb_connection_t* connection, int screen_nbr)
|
||||
xcb_screen_t* X11::XCBScreenOfDisplay(xcb_connection_t* connection, int screenIndex)
|
||||
{
|
||||
NazaraAssert(connection == sharedConnection, "The model is meant for one connection to X11 server");
|
||||
xcb_screen_iterator_t iter = xcb_setup_roots_iterator(xcb_get_setup(connection));
|
||||
|
||||
for (; iter.rem; --screen_nbr, xcb_screen_next (&iter))
|
||||
for (; iter.rem; --screenIndex, xcb_screen_next (&iter))
|
||||
{
|
||||
if (screen_nbr == 0)
|
||||
if (screenIndex == 0)
|
||||
return iter.data;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -58,7 +58,6 @@ namespace Nz
|
|||
m_style(0),
|
||||
m_parent(parent),
|
||||
m_smoothScrolling(false),
|
||||
m_scrolling(0),
|
||||
m_mousePos(0, 0),
|
||||
m_keyRepeat(true)
|
||||
{
|
||||
|
|
@ -1134,7 +1133,6 @@ namespace Nz
|
|||
|
||||
// if (std::isprint(codePoint)) Is not working ? + handle combining ?
|
||||
{
|
||||
WindowEvent event;
|
||||
event.type = Nz::WindowEventType_TextEntered;
|
||||
event.text.character = codePoint;
|
||||
event.text.repeated = false;
|
||||
|
|
@ -1396,7 +1394,7 @@ namespace Nz
|
|||
hints.functions |= MWM_FUNC_CLOSE;
|
||||
}
|
||||
|
||||
ScopedXCB<xcb_generic_error_t> error(xcb_request_check(
|
||||
ScopedXCB<xcb_generic_error_t> propertyError(xcb_request_check(
|
||||
connection,
|
||||
xcb_change_property_checked(
|
||||
connection,
|
||||
|
|
@ -1410,7 +1408,7 @@ namespace Nz
|
|||
)
|
||||
));
|
||||
|
||||
if (error)
|
||||
if (propertyError)
|
||||
NazaraError("xcb_change_property failed, could not set window hints");
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -111,7 +111,6 @@ namespace Nz
|
|||
bool m_ownsWindow;
|
||||
bool m_smoothScrolling;
|
||||
bool m_threadActive;
|
||||
short m_scrolling;
|
||||
Vector2i m_mousePos;
|
||||
bool m_keyRepeat;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue