Add support for drawing SpriteHandle in Sprite Render

This commit is contained in:
Wojtek Figat
2021-02-23 13:57:51 +01:00
parent 24d31d024d
commit 3ddd64df2a
5 changed files with 60 additions and 19 deletions

View File

@@ -17,7 +17,7 @@ SpriteRender::SpriteRender(const SpawnParams& params)
{
_quadModel = Content::LoadAsyncInternal<Model>(TEXT("Engine/Models/Quad"));
Material.Loaded.Bind<SpriteRender, &SpriteRender::OnMaterialLoaded>(this);
Image.Changed.Bind<SpriteRender, &SpriteRender::OnImageChanged>(this);
Image.Changed.Bind<SpriteRender, &SpriteRender::SetImage>(this);
}
Vector2 SpriteRender::GetSize() const
@@ -45,6 +45,17 @@ void SpriteRender::SetColor(const Color& value)
_paramColor->SetValue(value);
}
SpriteHandle SpriteRender::GetSprite() const
{
return _sprite;
}
void SpriteRender::SetSprite(const SpriteHandle& value)
{
_sprite = value;
SetImage();
}
void SpriteRender::OnMaterialLoaded()
{
// Setup material instance
@@ -56,11 +67,14 @@ void SpriteRender::OnMaterialLoaded()
_materialInstance->SetBaseMaterial(Material);
// Cache parameters
_paramImageMAD = _materialInstance->GetParameter(TEXT("ImageMAD"));
if (_paramImageMAD && _paramImageMAD->GetParameterType() != MaterialParameterType::Vector4)
_paramImageMAD = nullptr;
_paramImage = _materialInstance->GetParameter(TEXT("Image"));
if (_paramImage && _paramImage->GetParameterType() != MaterialParameterType::Texture)
_paramImage = nullptr;
else if (_paramImage)
_paramImage->SetValue(Image.Get());
SetImage();
_paramColor = _materialInstance->GetParameter(TEXT("Color"));
if (_paramColor && _paramColor->GetParameterType() != MaterialParameterType::Color && _paramColor->GetParameterType() != MaterialParameterType::Vector4 && _paramColor->GetParameterType() != MaterialParameterType::Vector3)
_paramColor = nullptr;
@@ -68,10 +82,20 @@ void SpriteRender::OnMaterialLoaded()
_paramColor->SetValue(_color);
}
void SpriteRender::OnImageChanged()
void SpriteRender::SetImage()
{
TextureBase* image = Image.Get();
Vector4 imageMAD(Vector2::One, Vector2::Zero);
if (!image && _sprite.IsValid())
{
image = _sprite.Atlas.Get();
Sprite* sprite = &_sprite.Atlas->Sprites.At(_sprite.Index);
imageMAD = Vector4(sprite->Area.Size, sprite->Area.Location);
}
if (_paramImage)
_paramImage->SetValue(Image.Get());
_paramImage->SetValue(image);
if (_paramImageMAD)
_paramImageMAD->SetValue(imageMAD);
}
bool SpriteRender::HasContentLoaded() const
@@ -120,6 +144,7 @@ void SpriteRender::Serialize(SerializeStream& stream, const void* otherObj)
SERIALIZE_MEMBER(Size, _size);
SERIALIZE_MEMBER(Color, _color);
SERIALIZE_MEMBER(Sprite, _sprite);
SERIALIZE(Image);
SERIALIZE(Material);
SERIALIZE(FaceCamera);
@@ -133,13 +158,13 @@ void SpriteRender::Deserialize(DeserializeStream& stream, ISerializeModifier* mo
DESERIALIZE_MEMBER(Size, _size);
DESERIALIZE_MEMBER(Color, _color);
DESERIALIZE_MEMBER(Sprite, _sprite);
DESERIALIZE(Image);
DESERIALIZE(Material);
DESERIALIZE(FaceCamera);
DESERIALIZE(DrawModes);
if (_paramImage)
_paramImage->SetValue(Image.Get());
SetImage();
if (_paramColor)
_paramColor->SetValue(_color);
}

View File

@@ -5,6 +5,7 @@
#include "Engine/Level/Actor.h"
#include "Engine/Content/Assets/MaterialBase.h"
#include "Engine/Content/Assets/Texture.h"
#include "Engine/Render2D/SpriteAtlas.h"
/// <summary>
/// Sprite rendering object.
@@ -16,8 +17,10 @@ private:
Color _color;
Vector2 _size;
SpriteHandle _sprite;
MaterialInstance* _materialInstance = nullptr;
MaterialParameter* _paramImage = nullptr;
MaterialParameter* _paramImageMAD = nullptr;
MaterialParameter* _paramColor = nullptr;
AssetReference<Asset> _quadModel;
@@ -52,27 +55,39 @@ public:
AssetReference<Texture> Image;
/// <summary>
/// The material used for the sprite rendering. It should contain texture parameter named Image and color parameter named Color.
/// Gets the sprite to draw. Used only if Image is unset.
/// </summary>
API_FIELD(Attributes="EditorOrder(20), DefaultValue(null), EditorDisplay(\"Sprite\")")
API_PROPERTY(Attributes="EditorOrder(25), EditorDisplay(\"Sprite\")")
SpriteHandle GetSprite() const;
/// <summary>
/// Sets the sprite to draw. Used only if Image is unset.
/// </summary>
API_PROPERTY()
void SetSprite(const SpriteHandle& value);
/// <summary>
/// The material used for the sprite rendering. It should contain texture parameter named Image and color parameter named Color. For showing sprites from sprite atlas ensure to add Vector4 param ImageMAD for UVs transformation.
/// </summary>
API_FIELD(Attributes="EditorOrder(30), DefaultValue(null), EditorDisplay(\"Sprite\")")
AssetReference<MaterialBase> Material;
/// <summary>
/// If checked, the sprite will automatically face the view camera, otherwise it will be oriented as an actor.
/// </summary>
API_FIELD(Attributes="EditorOrder(30), EditorDisplay(\"Sprite\")")
API_FIELD(Attributes="EditorOrder(40), EditorDisplay(\"Sprite\")")
bool FaceCamera = true;
/// <summary>
/// The draw passes to use for rendering this object. Uncheck `Depth` to disable sprite casting shadows.
/// </summary>
API_FIELD(Attributes="EditorOrder(40), DefaultValue(DrawPass.Default), EditorDisplay(\"Sprite\")")
API_FIELD(Attributes="EditorOrder(50), DefaultValue(DrawPass.Default), EditorDisplay(\"Sprite\")")
DrawPass DrawModes = DrawPass::Default;
private:
void OnMaterialLoaded();
void OnImageChanged();
void SetImage();
public: