Graphics: Add origin to all sprite-based renderables (and made it a factor)

This commit is contained in:
SirLynix
2022-12-17 14:48:50 +01:00
parent 0537be3201
commit d4422c4102
12 changed files with 98 additions and 38 deletions

View File

@@ -38,8 +38,10 @@ namespace Nz
const std::shared_ptr<MaterialInstance>& GetMaterial(std::size_t i = 0) const override;
std::size_t GetMaterialCount() const override;
inline Orientation GetOrientation() const;
inline const Vector2f& GetOrigin() const;
inline const Section& GetSection(std::size_t sectionIndex) const;
std::size_t GetSectionCount() const;
inline float GetSize() const;
inline const Rectf& GetTextureCoords() const;
Vector3ui GetTextureSize() const;
@@ -47,10 +49,11 @@ namespace Nz
inline void SetColor(const Color& color);
inline void SetMaterial(std::shared_ptr<MaterialInstance> material);
inline void SetOrigin(const Vector2f& origin);
inline void SetSection(std::size_t sectionIndex, float size, float textureCoord);
inline void SetSectionSize(std::size_t sectionIndex, float size);
inline void SetSectionTextureCoord(std::size_t sectionIndex, float textureCoord);
inline void SetSize(const Vector2f& size);
inline void SetSize(float size);
inline void SetTextureCoords(const Rectf& textureCoords);
inline void SetTextureRect(const Rectf& textureRect);
@@ -82,7 +85,8 @@ namespace Nz
Color m_color;
Orientation m_orientation;
Rectf m_textureCoords;
Vector2f m_size;
Vector2f m_origin;
float m_size;
};
}

View File

@@ -37,6 +37,11 @@ namespace Nz
return m_orientation;
}
inline const Vector2f& LinearSlicedSprite::GetOrigin() const
{
return m_origin;
}
inline auto LinearSlicedSprite::GetSection(std::size_t sectionIndex) const -> const Section&
{
NazaraAssert(sectionIndex < m_sectionCount, "out of range section");
@@ -48,6 +53,11 @@ namespace Nz
return m_sectionCount;
}
inline float LinearSlicedSprite::GetSize() const
{
return m_size;
}
inline const Rectf& LinearSlicedSprite::GetTextureCoords() const
{
return m_textureCoords;
@@ -84,6 +94,13 @@ namespace Nz
}
}
inline void LinearSlicedSprite::SetOrigin(const Vector2f& origin)
{
m_origin = origin;
UpdateVertices();
}
inline void LinearSlicedSprite::SetSection(std::size_t sectionIndex, float size, float textureCoord)
{
NazaraAssert(sectionIndex < m_sectionCount, "out of range section");
@@ -115,10 +132,9 @@ namespace Nz
UpdateVertices();
}
inline void LinearSlicedSprite::SetSize(const Vector2f& size)
inline void LinearSlicedSprite::SetSize(float size)
{
NazaraAssert(size.x >= 0.f, "width must be positive");
NazaraAssert(size.y >= 0.f, "height must be positive");
NazaraAssert(size >= 0.f, "size must be positive");
m_size = size;

View File

@@ -33,6 +33,8 @@ namespace Nz
inline const Corner& GetBottomRightCorner() const;
const std::shared_ptr<MaterialInstance>& GetMaterial(std::size_t i = 0) const override;
std::size_t GetMaterialCount() const override;
inline const Vector2f& GetOrigin() const;
inline const Vector2f& GetSize() const;
inline const Corner& GetTopLeftCorner() const;
inline const Rectf& GetTextureCoords() const;
Vector3ui GetTextureSize() const;
@@ -42,6 +44,7 @@ namespace Nz
inline void SetCornersSize(const Vector2f& topLeftSize, const Vector2f& bottomRightSize);
inline void SetCornersTextureCoords(const Vector2f& topLeftTextureCoords, const Vector2f& bottomRightTextureCoords);
inline void SetMaterial(std::shared_ptr<MaterialInstance> material);
inline void SetOrigin(const Vector2f& origin);
inline void SetSize(const Vector2f& size);
inline void SetTextureCoords(const Rectf& textureCoords);
inline void SetTextureRect(const Rectf& textureRect);
@@ -65,6 +68,7 @@ namespace Nz
Corner m_topLeftCorner;
Corner m_bottomRightCorner;
Rectf m_textureCoords;
Vector2f m_origin;
Vector2f m_size;
};
}

View File

@@ -23,6 +23,16 @@ namespace Nz
return m_textureCoords;
}
inline const Vector2f& SlicedSprite::GetOrigin() const
{
return m_origin;
}
inline const Vector2f& SlicedSprite::GetSize() const
{
return m_size;
}
inline auto SlicedSprite::GetTopLeftCorner() const -> const Corner&
{
return m_topLeftCorner;
@@ -72,6 +82,13 @@ namespace Nz
}
}
inline void SlicedSprite::SetOrigin(const Vector2f& origin)
{
m_origin = origin;
UpdateVertices();
}
inline void SlicedSprite::SetSize(const Vector2f& size)
{
m_size = size;

View File

@@ -31,7 +31,7 @@ namespace Nz
inline const Color& GetCornerColor(RectCorner corner) const;
const std::shared_ptr<MaterialInstance>& GetMaterial(std::size_t i = 0) const override;
std::size_t GetMaterialCount() const override;
inline const Vector3f& GetOrigin() const;
inline const Vector2f& GetOrigin() const;
inline const Vector2f& GetSize() const;
inline const Rectf& GetTextureCoords() const;
Vector3ui GetTextureSize() const;
@@ -39,7 +39,7 @@ namespace Nz
inline void SetColor(const Color& color);
inline void SetCornerColor(RectCorner corner, const Color& color);
inline void SetMaterial(std::shared_ptr<MaterialInstance> material);
inline void SetOrigin(const Vector3f& origin);
inline void SetOrigin(const Vector2f& origin);
inline void SetSize(const Vector2f& size);
inline void SetTextureCoords(const Rectf& textureCoords);
inline void SetTextureRect(const Rectf& textureRect);
@@ -55,8 +55,8 @@ namespace Nz
std::shared_ptr<MaterialInstance> m_material;
Color m_color;
Rectf m_textureCoords;
Vector2f m_origin;
Vector2f m_size;
Vector3f m_origin;
};
}

View File

@@ -18,7 +18,7 @@ namespace Nz
return m_cornerColor[UnderlyingCast(corner)];
}
inline const Vector3f& Sprite::GetOrigin() const
inline const Vector2f& Sprite::GetOrigin() const
{
return m_origin;
}
@@ -60,7 +60,7 @@ namespace Nz
}
}
inline void Sprite::SetOrigin(const Vector3f& origin)
inline void Sprite::SetOrigin(const Vector2f& origin)
{
m_origin = origin;
@@ -99,10 +99,12 @@ namespace Nz
cornerExtent[UnderlyingCast(RectCorner::LeftTop)] = Vector2f(0.f, 1.f);
cornerExtent[UnderlyingCast(RectCorner::RightTop)] = Vector2f(1.f, 1.f);
Vector3f originShift = m_origin * m_size;
for (RectCorner corner : { RectCorner::LeftBottom, RectCorner::RightBottom, RectCorner::LeftTop, RectCorner::RightTop })
{
vertices->color = m_color * m_cornerColor[UnderlyingCast(corner)];
vertices->position = Vector3f(m_size * cornerExtent[UnderlyingCast(corner)], 0.f) - m_origin;
vertices->position = Vector3f(m_size * cornerExtent[UnderlyingCast(corner)], 0.f) - originShift;
vertices->uv = m_textureCoords.GetCorner(corner);
if (aabb.IsValid())

View File

@@ -47,6 +47,7 @@ namespace Nz
inline const Vector2ui& GetMapSize() const;
const std::shared_ptr<MaterialInstance>& GetMaterial(std::size_t i) const override;
std::size_t GetMaterialCount() const override;
inline const Vector2f& GetOrigin() const;
inline Vector2f GetSize() const;
inline const Tile& GetTile(const Vector2ui& tilePos) const;
inline const Vector2f& GetTileSize() const;
@@ -54,7 +55,7 @@ namespace Nz
inline bool IsIsometricModeEnabled() const;
void SetMaterial(std::size_t matIndex, std::shared_ptr<MaterialInstance> material);
inline void SetOrigin(const Vector3f& origin);
inline void SetOrigin(const Vector2f& origin);
struct Tile
{
@@ -82,8 +83,8 @@ namespace Nz
std::vector<Tile> m_tiles;
std::vector<Layer> m_layers;
Vector2ui m_mapSize;
Vector2f m_origin;
Vector2f m_tileSize;
Vector3f m_origin;
bool m_isometricModeEnabled;
mutable bool m_shouldRebuildVertices;
};

View File

@@ -310,6 +310,15 @@ namespace Nz
return m_mapSize;
}
/*!
* \brief Gets the tilemap origin
* \return Tilemap origin
*/
inline const Vector2f& Tilemap::GetOrigin() const
{
return m_origin;
}
/*!
* \brief Returns the size of the tilemap in units (which is equivalent to GetMapSize() * GetTileSize())
* \return Maximum size in units occupied by this tilemap
@@ -359,7 +368,7 @@ namespace Nz
return m_isometricModeEnabled;
}
inline void Tilemap::SetOrigin(const Vector3f& origin)
inline void Tilemap::SetOrigin(const Vector2f& origin)
{
m_origin = origin;