-#ifndef __DALI_INTERNAL_PROPERTY_INPUT_IMPL_H__
-#define __DALI_INTERNAL_PROPERTY_INPUT_IMPL_H__
+#ifndef DALI_INTERNAL_PROPERTY_INPUT_IMPL_H
+#define DALI_INTERNAL_PROPERTY_INPUT_IMPL_H
/*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include <iostream>
// INTERNAL INCLUDES
-#include <dali/public-api/object/property-input.h>
+#include <dali/internal/common/buffer-index.h>
+#include <dali/public-api/math/matrix.h>
+#include <dali/public-api/math/matrix3.h>
+#include <dali/public-api/math/quaternion.h>
#include <dali/public-api/math/vector2.h>
#include <dali/public-api/math/vector3.h>
#include <dali/public-api/math/vector4.h>
-#include <dali/public-api/math/quaternion.h>
-#include <dali/public-api/math/matrix3.h>
-#include <dali/public-api/math/matrix.h>
-#include <dali/internal/common/buffer-index.h>
+#include <dali/public-api/object/property-input.h>
-namespace Dali
+#if defined(ANDROID) || defined(WIN32) || defined(__APPLE__)
+namespace std
{
+uint64_t _Hash_bytes(const void* bytes, uint64_t size, uint64_t seed);
+
+}
+#endif
+namespace Dali
+{
namespace Internal
{
-
-/**
- * These dummy values are used to handle PropertyInputImpl errors
- */
-static const bool DUMMY_BOOLEAN_VALUE( false );
-static const float DUMMY_FLOAT_VALUE( 0.0f );
-static const int DUMMY_INTEGER_VALUE( 0 );
-static const unsigned int DUMMY_UNSIGNED_INTEGER_VALUE( 0u );
-static const Vector2 DUMMY_VECTOR2_VALUE( 0.0f, 0.0f );
-static const Vector3 DUMMY_VECTOR3_VALUE( 0.0f, 0.0f, 0.0f );
-static const Vector4 DUMMY_VECTOR4_VALUE( 0.0f, 0.0f, 0.0f, 0.0f );
-static const Matrix3 DUMMY_MATRIX3_VALUE;
-static const Matrix DUMMY_MATRIX_VALUE;
-static const Quaternion DUMMY_QUATERNION_VALUE( 1.0f, 0.0f, 0.0f, 0.0f );
-
/**
* An abstract interface for receiving property values, and for querying whether
* a property value has changed i.e. whether a constraint needs to be reapplied.
class PropertyInputImpl
{
public:
-
/**
* Virtual destructor.
*/
- virtual ~PropertyInputImpl()
- {
- }
+ virtual ~PropertyInputImpl() = default;
/**
* Query the type of property input.
* @param[in] bufferIndex The buffer to read from.
* @return The boolean value.
*/
- virtual const bool& GetBoolean( BufferIndex bufferIndex ) const
+ virtual const bool& GetBoolean(BufferIndex bufferIndex) const
{
- DALI_ASSERT_ALWAYS( false && "Property type mismatch" );
- return DUMMY_BOOLEAN_VALUE;
+ // the return will never be executed, it's just to keep the compiler happy
+ return reinterpret_cast<const bool&>(*this);
}
/**
* @param[in] bufferIndex The buffer to read from.
* @return The integer value.
*/
- virtual const int& GetInteger( BufferIndex bufferIndex ) const
+ virtual const int& GetInteger(BufferIndex bufferIndex) const
{
- DALI_ASSERT_ALWAYS( false && "Property type mismatch" );
- return DUMMY_INTEGER_VALUE;
- }
-
- /**
- * Retrieve an integer value.
- * @pre GetType() returns Property::UNSIGNED_INTEGER.
- * @param[in] bufferIndex The buffer to read from.
- * @return The integer value.
- */
- virtual const unsigned int& GetUnsignedInteger( BufferIndex bufferIndex ) const
- {
- DALI_ASSERT_ALWAYS( false && "Property type mismatch" );
- return DUMMY_UNSIGNED_INTEGER_VALUE;
+ // the return will never be executed, it's just to keep the compiler happy
+ return reinterpret_cast<const int&>(*this);
}
/**
* @param[in] bufferIndex The buffer to read from.
* @return The float value.
*/
- virtual const float& GetFloat( BufferIndex bufferIndex ) const
+ virtual const float& GetFloat(BufferIndex bufferIndex) const
{
- DALI_ASSERT_ALWAYS( false && "Property type mismatch" );
- return DUMMY_FLOAT_VALUE;
+ // the return will never be executed, it's just to keep the compiler happy
+ return reinterpret_cast<const float&>(*this);
}
/**
* @param[in] bufferIndex The buffer to read from.
* @return The Vector2 value.
*/
- virtual const Vector2& GetVector2( BufferIndex bufferIndex ) const
+ virtual const Vector2& GetVector2(BufferIndex bufferIndex) const
{
- DALI_ASSERT_ALWAYS( false && "Property type mismatch" );
- return DUMMY_VECTOR2_VALUE;
+ // the return will never be executed, it's just to keep the compiler happy
+ return reinterpret_cast<const Vector2&>(*this);
}
/**
* @param[in] bufferIndex The buffer to read from.
* @return The Vector3 value.
*/
- virtual const Vector3& GetVector3( BufferIndex bufferIndex ) const
+ virtual const Vector3& GetVector3(BufferIndex bufferIndex) const
{
- DALI_ASSERT_ALWAYS( false && "Property type mismatch" );
- return DUMMY_VECTOR3_VALUE;
+ // the return will never be executed, it's just to keep the compiler happy
+ return reinterpret_cast<const Vector3&>(*this);
}
/**
* @param[in] bufferIndex The buffer to read from.
* @return The Vector4 value.
*/
- virtual const Vector4& GetVector4( BufferIndex bufferIndex ) const
+ virtual const Vector4& GetVector4(BufferIndex bufferIndex) const
{
- DALI_ASSERT_ALWAYS( false && "Property type mismatch" );
- return DUMMY_VECTOR4_VALUE;
+ // the return will never be executed, it's just to keep the compiler happy
+ return reinterpret_cast<const Vector4&>(*this);
}
/**
* @param[in] bufferIndex The buffer to read from.
* @return The Quaternion value.
*/
- virtual const Quaternion& GetQuaternion( BufferIndex bufferIndex ) const
+ virtual const Quaternion& GetQuaternion(BufferIndex bufferIndex) const
{
- DALI_ASSERT_ALWAYS( false && "Property type mismatch" );
- return DUMMY_QUATERNION_VALUE;
+ // the return will never be executed, it's just to keep the compiler happy
+ return reinterpret_cast<const Quaternion&>(*this);
}
/**
* @param[in] bufferIndex The buffer to read from.
* @return The Matrix value.
*/
- virtual const Matrix3& GetMatrix3( BufferIndex bufferIndex ) const
+ virtual const Matrix3& GetMatrix3(BufferIndex bufferIndex) const
{
- DALI_ASSERT_ALWAYS( false && "Property type mismatch" );
- return DUMMY_MATRIX3_VALUE;
+ // the return will never be executed, it's just to keep the compiler happy
+ return reinterpret_cast<const Matrix3&>(*this);
}
/**
* @param[in] bufferIndex The buffer to read from.
* @return The Matrix value.
*/
- virtual const Matrix& GetMatrix( BufferIndex bufferIndex ) const
+ virtual const Matrix& GetMatrix(BufferIndex bufferIndex) const
{
- DALI_ASSERT_ALWAYS( false && "Property type mismatch" );
- return DUMMY_MATRIX_VALUE;
+ // the return will never be executed, it's just to keep the compiler happy
+ return reinterpret_cast<const Matrix&>(*this);
}
+ /**
+ * Retrieve the address of the property value. Only for use
+ * when writing uniforms.
+ */
+ virtual const void* GetValueAddress(BufferIndex bufferIndex) const = 0;
+
+ /**
+ * Retrieve the size of the property value for use in copying.
+ * Only for use when writing uniforms.
+ */
+ virtual size_t GetValueSize() const = 0;
+
// Accessors for Constraint functions
/**
* @param[in] updateBufferIndex The current update buffer index.
* @return The boolean value.
*/
- virtual const bool& GetConstraintInputBoolean( BufferIndex updateBufferIndex ) const
+ virtual const bool& GetConstraintInputBoolean(BufferIndex updateBufferIndex) const
{
- return GetBoolean( updateBufferIndex );
+ return GetBoolean(updateBufferIndex);
}
/**
* @param[in] updateBufferIndex The current update buffer index.
* @return The integer value.
*/
- virtual const int& GetConstraintInputInteger( BufferIndex updateBufferIndex ) const
- {
- return GetInteger( updateBufferIndex );
- }
-
- /**
- * Retrieve an unsigned integer input for a constraint function.
- * @note For inherited properties, this method should be overriden to return the value
- * from the previous frame i.e. not from the current update buffer.
- * @pre GetType() returns Property::UNSIGNED_INTEGER.
- * @param[in] updateBufferIndex The current update buffer index.
- * @return The integer value.
- */
- virtual const unsigned int& GetConstraintInputUnsignedInteger( BufferIndex updateBufferIndex ) const
+ virtual const int& GetConstraintInputInteger(BufferIndex updateBufferIndex) const
{
- return GetUnsignedInteger( updateBufferIndex );
+ return GetInteger(updateBufferIndex);
}
/**
* @param[in] updateBufferIndex The current update buffer index.
* @return The float value.
*/
- virtual const float& GetConstraintInputFloat( BufferIndex updateBufferIndex ) const
+ virtual const float& GetConstraintInputFloat(BufferIndex updateBufferIndex) const
{
- return GetFloat( updateBufferIndex );
+ return GetFloat(updateBufferIndex);
}
/**
* @param[in] updateBufferIndex The buffer to read from.
* @return The Vector2 value.
*/
- virtual const Vector2& GetConstraintInputVector2( BufferIndex updateBufferIndex ) const
+ virtual const Vector2& GetConstraintInputVector2(BufferIndex updateBufferIndex) const
{
- return GetVector2( updateBufferIndex );
+ return GetVector2(updateBufferIndex);
}
/**
* @param[in] updateBufferIndex The buffer to read from.
* @return The Vector3 value.
*/
- virtual const Vector3& GetConstraintInputVector3( BufferIndex updateBufferIndex ) const
+ virtual const Vector3& GetConstraintInputVector3(BufferIndex updateBufferIndex) const
{
- return GetVector3( updateBufferIndex );
+ return GetVector3(updateBufferIndex);
}
/**
* @param[in] updateBufferIndex The buffer to read from.
* @return The Vector4 value.
*/
- virtual const Vector4& GetConstraintInputVector4( BufferIndex updateBufferIndex ) const
+ virtual const Vector4& GetConstraintInputVector4(BufferIndex updateBufferIndex) const
{
- return GetVector4( updateBufferIndex );
+ return GetVector4(updateBufferIndex);
}
/**
* @param[in] updateBufferIndex The buffer to read from.
* @return The Quaternion value.
*/
- virtual const Quaternion& GetConstraintInputQuaternion( BufferIndex updateBufferIndex ) const
+ virtual const Quaternion& GetConstraintInputQuaternion(BufferIndex updateBufferIndex) const
{
- return GetQuaternion( updateBufferIndex );
+ return GetQuaternion(updateBufferIndex);
}
/**
* @param[in] updateBufferIndex The buffer to read from.
* @return The Matrix value.
*/
- virtual const Matrix3& GetConstraintInputMatrix3( BufferIndex updateBufferIndex ) const
+ virtual const Matrix3& GetConstraintInputMatrix3(BufferIndex updateBufferIndex) const
{
- return GetMatrix3( updateBufferIndex );
+ return GetMatrix3(updateBufferIndex);
}
/**
* @param[in] updateBufferIndex The buffer to read from.
* @return The Matrix value.
*/
- virtual const Matrix& GetConstraintInputMatrix( BufferIndex updateBufferIndex ) const
+ virtual const Matrix& GetConstraintInputMatrix(BufferIndex updateBufferIndex) const
{
- return GetMatrix( updateBufferIndex );
+ return GetMatrix(updateBufferIndex);
+ }
+
+ /**
+ * Query whether the property belongs to the
+ * transform manager or not.
+ * @return True if it is a transform manager property, false otherwise
+ */
+ virtual bool IsTransformManagerProperty() const
+ {
+ return false;
+ }
+
+ std::uint64_t Hash(BufferIndex bufferIndex, uint64_t seed) const
+ {
+ switch(GetType())
+ {
+ case Property::BOOLEAN:
+ {
+ return std::_Hash_bytes(&GetBoolean(bufferIndex), sizeof(bool), seed);
+ }
+
+ case Property::INTEGER:
+ {
+ return std::_Hash_bytes(&GetInteger(bufferIndex), sizeof(int), seed);
+ }
+
+ case Property::FLOAT:
+ {
+ return std::_Hash_bytes(&GetFloat(bufferIndex), sizeof(float), seed);
+ }
+
+ case Property::VECTOR2:
+ {
+ return std::_Hash_bytes(&GetVector2(bufferIndex), sizeof(Vector2), seed);
+ }
+
+ case Property::VECTOR3:
+ {
+ return std::_Hash_bytes(&GetVector3(bufferIndex), sizeof(Vector3), seed);
+ }
+
+ case Property::VECTOR4:
+ {
+ return std::_Hash_bytes(&GetVector4(bufferIndex), sizeof(Vector4), seed);
+ }
+
+ case Property::ROTATION:
+ {
+ return std::_Hash_bytes(&GetQuaternion(bufferIndex), sizeof(Quaternion), seed);
+ }
+
+ case Property::MATRIX:
+ {
+ return std::_Hash_bytes(&GetMatrix(bufferIndex), sizeof(Matrix), seed);
+ }
+
+ case Property::MATRIX3:
+ {
+ return std::_Hash_bytes(&GetMatrix3(bufferIndex), sizeof(Matrix3), seed);
+ }
+
+ default:
+ break; // print nothing
+ }
+
+ return seed;
}
/**
* @param[in] bufferIndex The buffer to read from.
* @todo Place this far-too-large-to-be-inlined function in a cpp and remove <iostream> header dependency from this file.
*/
- void DebugPrint( std::ostream& debugStream, BufferIndex bufferIndex ) const
+ void DebugPrint(std::ostream& debugStream, BufferIndex bufferIndex) const
{
- switch ( GetType() )
+ switch(GetType())
{
case Property::BOOLEAN:
{
- debugStream << GetBoolean( bufferIndex );
+ debugStream << GetBoolean(bufferIndex);
break;
}
case Property::INTEGER:
{
- debugStream << GetInteger( bufferIndex );
- break;
- }
-
- case Property::UNSIGNED_INTEGER:
- {
- debugStream << GetUnsignedInteger( bufferIndex );
+ debugStream << GetInteger(bufferIndex);
break;
}
case Property::FLOAT:
{
- debugStream << GetFloat( bufferIndex );
+ debugStream << GetFloat(bufferIndex);
break;
}
case Property::VECTOR2:
{
- debugStream << GetVector2( bufferIndex );
+ debugStream << GetVector2(bufferIndex);
break;
}
case Property::VECTOR3:
{
- debugStream << GetVector3( bufferIndex );
+ debugStream << GetVector3(bufferIndex);
break;
}
case Property::VECTOR4:
{
- debugStream << GetVector4( bufferIndex );
+ debugStream << GetVector4(bufferIndex);
break;
}
case Property::ROTATION:
{
- debugStream << GetQuaternion( bufferIndex );
+ debugStream << GetQuaternion(bufferIndex);
break;
}
case Property::MATRIX:
{
- debugStream << GetMatrix( bufferIndex );
+ debugStream << GetMatrix(bufferIndex);
break;
}
case Property::MATRIX3:
{
- debugStream << GetMatrix3( bufferIndex );
+ debugStream << GetMatrix3(bufferIndex);
break;
}
} // namespace Dali
-#endif // __DALI_INTERNAL_PROPERTY_INPUT_IMPL_H__
+#endif // DALI_INTERNAL_PROPERTY_INPUT_IMPL_H