Files
o3de/Code/Editor/Controls/ReflectedPropertyControl/ReflectedVar.h
T
amzn-phist d6b268e84e Remove ResourceSelectorHost and clean up/refactor related bits (#3050)
* Sever dependency on legacy resource selector host

Audio resource selectors (browse dialogs) no longer need to be
registered with the legacy IResourceSelectorHost system.  Set up a new
EBus specifically to handle browse button presses and directly invokes
the dialog.

Signed-off-by: amzn-phist <52085794+amzn-phist@users.noreply.github.com>

* Hook up legacy audio control selector to new EBus

Remaining use of legacy audio selectors (trackview) need to be able to
bypass ResourceSelectorHost now.

Signed-off-by: amzn-phist <52085794+amzn-phist@users.noreply.github.com>

* Removes ResourceSelectorHost and legacy selectors

This removes various Variable types that were tied to resource
selectors, such as GeomCache, Model, Animation, File.  Removes the
ResourceSelectorHost completely.  The two things that still appeared to
have selectors in TrackView are Audio Controls and Texture.  Fixed the
audio control selector to work via EBus and the Texture selector didn't
seem to work at all, but left it in as it was.

Signed-off-by: amzn-phist <52085794+amzn-phist@users.noreply.github.com>

* Make the default audio selector return old value

Signed-off-by: amzn-phist <52085794+amzn-phist@users.noreply.github.com>

* Fix some signed/unsigned comparison warnings

Signed-off-by: amzn-phist <52085794+amzn-phist@users.noreply.github.com>

* Remove deleted function from Editor Mock

Signed-off-by: amzn-phist <52085794+amzn-phist@users.noreply.github.com>

* Change audio selector api to use string_view

Per feedback.

Signed-off-by: amzn-phist <52085794+amzn-phist@users.noreply.github.com>
2021-08-16 12:41:24 -05:00

406 lines
12 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#ifndef CRYINCLUDE_EDITOR_UTILS_REFLECTEDVAR_H
#define CRYINCLUDE_EDITOR_UTILS_REFLECTEDVAR_H
#pragma once
#include <AzCore/Serialization/SerializeContext.h>
#include <algorithm>
#include <limits>
#include "Util/VariablePropertyType.h"
#include <AzCore/Math/Vector2.h>
#include <AzCore/Math/Vector3.h>
#include <AzCore/Math/Vector4.h>
//Base class for generic reflected variables
class CReflectedVar
{
public:
AZ_RTTI(CReflectedVar, "{9CF461B5-4093-4F7E-9A28-75531F0D046C}")
CReflectedVar() = default;
CReflectedVar(const AZStd::string& name)
: m_varName(name){}
virtual ~CReflectedVar(){}
AZStd::string m_varName;
AZStd::string m_description;
};
// Reflected container of reflected values. Also holds ePropertyTable data
class CPropertyContainer
: public CReflectedVar
{
public:
AZ_RTTI(CPropertyContainer, "{99500790-241A-4274-BAD8-C4510E869FC6}", CReflectedVar)
CPropertyContainer(const AZStd::string& name)
: CReflectedVar(name) {}
CPropertyContainer() = default;
AZStd::string varName() const { return m_varName; }
AZStd::string description() const { return m_description; }
void AddProperty(CReflectedVar* property);
void Clear();
//If we're an unnamed container, just show our children in flat list. Otherwise show the container name with children underneath
AZ::u32 GetVisibility() const
{
return m_varName.empty() ? AZ_CRC("PropertyVisibility_ShowChildrenOnly", 0xef428f20) : AZ_CRC("PropertyVisibility_Show", 0xa43c82dd);
}
void SetAutoExpand(bool autoExpand) { m_autoExpand = autoExpand; }
bool AutoExpand() const { return m_autoExpand; }
AZStd::vector<CReflectedVar*> GetProperties() const { return m_properties; }
void SetValueText(const AZStd::string& valueText) { m_valueText = valueText; }
friend class ReflectedVarInit;
private:
AZStd::vector<CReflectedVar*> m_properties;
bool m_autoExpand = false;
AZStd::string m_valueText;
};
template<class T>
class CReflectedVarAny
: public CReflectedVar
{
public:
AZ_RTTI((CReflectedVarAny<T>, "{EE8293C3-9B1E-470B-9922-2CBB8DA13D78}", T), CReflectedVar)
CReflectedVarAny(const AZStd::string& name, const T& val = T())
: CReflectedVar(name)
, m_value(val) {}
CReflectedVarAny() = default;
AZStd::string varName() const { return m_varName; }
AZStd::string description() const { return m_description; }
static void reflect(AZ::SerializeContext* serializeContext);
T m_value;
};
// Class to hold values that have min/max
// T = data type held in this variable
// R = data type of the range
template<class T, class R>
class CReflectedVarRanged
: public CReflectedVar
{
public:
AZ_RTTI((CReflectedVarRanged, "{6AB4EC29-E17B-4B3B-A153-BFDAA48B8CF8}", T, R), CReflectedVar)
CReflectedVarRanged(const AZStd::string& name, const T& val = T())
: CReflectedVar(name)
, m_value(val)
, m_minVal(std::numeric_limits<R>::lowest())
, m_maxVal(std::numeric_limits<R>::max())
, m_stepSize(1)
, m_softMinVal(std::numeric_limits<R>::lowest())
, m_softMaxVal(std::numeric_limits<R>::max())
{}
CReflectedVarRanged()
: CReflectedVarRanged(AZStd::string(), T()){}
AZStd::string varName() const { return m_varName; }
AZStd::string description() const { return m_description; }
R minValue() const { return m_minVal; }
R maxValue() const { return m_maxVal; }
R stepSize() const { return m_stepSize; }
R softMinVal() const { return m_softMinVal; }
R softMaxVal() const { return m_softMaxVal; }
static void reflect(AZ::SerializeContext* serializeContext);
T m_value;
R m_minVal;
R m_maxVal;
R m_stepSize;
R m_softMinVal;
R m_softMaxVal;
};
//name some commonly-used variable types
template <class T>
using CReflectedVarNumeric = CReflectedVarRanged<T, T>;
//ePropertyFloat
using CReflectedVarFloat = CReflectedVarNumeric<float>;
//ePropertyInt
using CReflectedVarInt = CReflectedVarNumeric<int>;
//ePropertyString
using CReflectedVarString = CReflectedVarAny<AZStd::string>;
//ePropertyBool
using CReflectedVarBool = CReflectedVarAny<bool>;
//ePropertyVector2
using CReflectedVarVector2 = CReflectedVarRanged<AZ::Vector2, float>;
//ePropertyVector
using CReflectedVarVector3 = CReflectedVarRanged<AZ::Vector3, float>;
//ePropertyVector4
using CReflectedVarVector4 = CReflectedVarRanged<AZ::Vector4, float>;
// Class for holding enumerated values, ePropertySelection
// Keeps a key-value pair values (int, string, float, etc) and names corresponding to each value
// The names are displayed to user when editing, the values are used by underlying code.
template<class T>
class CReflectedVarEnum
: public CReflectedVar
{
public:
AZ_RTTI((CReflectedVarEnum<T>, "{40AE7D74-7E3A-41A9-8F71-2BBC3067118B}", T), CReflectedVar)
CReflectedVarEnum(const AZStd::string& name)
: CReflectedVar(name) {}
CReflectedVarEnum() = default;
void setEnums(const AZStd::vector<AZStd::pair<T, AZStd::string> >& enums)
{
m_enums = enums;
if (m_enums.size() > 0)
{
m_value = m_enums.at(0).first;
m_selectedEnumName = m_enums.at(0).second;
}
else
{
m_value = T();
m_selectedEnumName.clear();
}
}
void addEnum(const T& value, const AZStd::string& name)
{
m_enums.push_back(AZStd::pair<T, AZStd::string>(value, name));
if (m_enums.size() == 1)
{
m_selectedEnumName = name;
m_value = value;
}
}
void setEnumValue(const T& value)
{
auto it = std::find_if(m_enums.cbegin(), m_enums.cend(), [value](const AZStd::pair<T, AZStd::string>& item) -> bool { return item.first == value; });
if (it != m_enums.end())
{
m_value = it->first;
m_selectedEnumName = it->second;
}
}
void setEnumByName(const AZStd::string& name)
{
auto it = std::find_if(m_enums.cbegin(), m_enums.cend(), [name](const AZStd::pair<T, AZStd::string>& item) -> bool { return item.second == name; });
if (it != m_enums.end())
{
m_value = it->first;
m_selectedEnumName = it->second;
}
}
void OnEnumChanged()
{
setEnumByName(m_selectedEnumName);
}
AZStd::vector < AZStd::string> GetEnums() const
{
AZStd::vector < AZStd::string> returnVal;
for (const auto& i : m_enums)
{
returnVal.push_back(i.second);
}
return returnVal;
}
AZStd::string varName() const { return m_varName; }
AZStd::string description() const { return m_description; }
static void reflect(AZ::SerializeContext* serializeContext);
T m_value;
AZStd::string m_selectedEnumName;
AZStd::vector<AZStd::pair<T, AZStd::string> > m_enums;
};
//Class to hold ePropertyColor (IVariable::DT_COLOR)
class CReflectedVarColor
: public CReflectedVar
{
public:
AZ_RTTI(CReflectedVarColor, "{CC69E773-B4FA-4B6D-8A46-0B580097B6D2}", CReflectedVar)
CReflectedVarColor(const AZStd::string& name, AZ::Vector3 color = AZ::Vector3())
: CReflectedVar(name)
, m_color(color) {}
CReflectedVarColor() {}
AZStd::string varName() const { return m_varName; }
AZStd::string description() const { return m_description; }
AZ::Vector3 m_color;
};
//Class to hold:
// ePropertyTexture (IVariable::DT_TEXTURE)
// ePropertyAudioTrigger (IVariable::DT_AUDIO_TRIGGER)
// ePropertyAudioSwitch (IVariable::DT_AUDIO_SWITCH )
// ePropertyAudioSwitchState (IVariable::DT_AUDIO_SWITCH_STATE)
// ePropertyAudioRTPC (IVariable::DT_AUDIO_RTPC)
// ePropertyAudioEnvironment (IVariable::DT_AUDIO_ENVIRONMENT)
// ePropertyAudioPreloadRequest (IVariable::DT_AUDIO_PRELOAD_REQUEST)
class CReflectedVarResource
: public CReflectedVar
{
public:
AZ_RTTI(CReflectedVarResource, "{162864C2-0C3E-4B6A-84D3-BBAD975B4FD2}", CReflectedVar)
CReflectedVarResource(const AZStd::string& name)
: CReflectedVar(name)
, m_propertyType(ePropertyInvalid)
{}
CReflectedVarResource()
: m_propertyType(ePropertyInvalid){}
AZStd::string varName() const { return m_varName; }
AZStd::string description() const { return m_description; }
AZStd::string m_path;
PropertyType m_propertyType;
};
//Class to hold ePropertyUser (IVariable::DT_USERITEMCB)
class CReflectedVarUser
: public CReflectedVar
{
public:
AZ_RTTI(CReflectedVarUser, "{A901DA91-3893-4848-9AE8-62C0ED074970}", CReflectedVar)
CReflectedVarUser(const AZStd::string &name)
: CReflectedVar(name)
, m_enableEdit(false)
, m_useTree(false)
{}
CReflectedVarUser() : m_enableEdit(false), m_useTree(false) {}
AZStd::string varName() const { return m_varName; }
AZStd::string m_value;
bool m_enableEdit;
bool m_useTree;
AZStd::string m_dialogTitle;
AZStd::string m_treeSeparator;
AZStd::vector<AZStd::string> m_itemNames;
AZStd::vector<AZStd::string> m_itemDescriptions;
};
class CReflectedVarSpline
: public CReflectedVar
{
public:
AZ_RTTI(CReflectedVarSpline, "{9A928683-7C84-48BF-8A2E-F7BEC423EE4E}", CReflectedVar)
CReflectedVarSpline(PropertyType propertyType, const AZStd::string &name)
: CReflectedVar(name)
, m_spline(0)
, m_propertyType(propertyType)
{}
CReflectedVarSpline()
: m_spline(0)
, m_propertyType(ePropertyInvalid)
{}
AZStd::string varName() const { return m_varName; }
AZ::u32 handler();
uint64_t m_spline;
PropertyType m_propertyType;
};
//Class to wrap all the many properties that can be represented by a string and edited via a popup
class CReflectedVarGenericProperty
: public CReflectedVar
{
public:
AZ_RTTI(CReflectedVarGenericProperty, "{C4A34C95-3D71-40CE-86D2-DDE314B33CC5}", CReflectedVar)
CReflectedVarGenericProperty(PropertyType pType, const AZStd::string& name = AZStd::string(), const AZStd::string& val = AZStd::string())
: CReflectedVar(name)
, m_propertyType(pType)
, m_value(val) {}
CReflectedVarGenericProperty()
: CReflectedVar()
, m_propertyType(ePropertyInvalid){}
AZStd::string varName() const { return m_varName; }
AZStd::string description() const { return m_description; }
PropertyType propertyType() const { return m_propertyType; }
AZ::u32 handler();
static void reflect(AZ::SerializeContext* serializeContext);
PropertyType m_propertyType;
AZStd::string m_value;
};
class EDITOR_CORE_API ReflectedVarInit
{
public:
static void setupReflection(AZ::SerializeContext* serializeContext);
private:
static bool s_reflectionDone;
};
//Class to hold ePropertyMotion (IVariable::DT_MOTION )
class CReflectedVarMotion
: public CReflectedVar
{
public:
AZ_RTTI(CReflectedVarMotion, "{66397EFB-620A-40B8-8C66-D6AECF690DF5}", CReflectedVar)
CReflectedVarMotion(const AZStd::string& name)
: CReflectedVar(name)
, m_assetId(0) {}
CReflectedVarMotion()
: m_assetId(0) {}
AZStd::string varName() const { return m_varName; }
AZStd::string description() const { return m_description; }
AZStd::string m_motion;
AZ::Data::AssetId m_assetId;
};
#endif // CRYINCLUDE_EDITOR_UTILS_REFLECTEDVAR_H