From 15740faf9fe9fe4be08965098bbf2947e096aeeb Mon Sep 17 00:00:00 2001 From: chai Date: Wed, 14 Aug 2019 22:50:43 +0800 Subject: +Unity Runtime code --- Runtime/Animation/MecanimArraySerialization.h | 178 ++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 Runtime/Animation/MecanimArraySerialization.h (limited to 'Runtime/Animation/MecanimArraySerialization.h') diff --git a/Runtime/Animation/MecanimArraySerialization.h b/Runtime/Animation/MecanimArraySerialization.h new file mode 100644 index 0000000..204e134 --- /dev/null +++ b/Runtime/Animation/MecanimArraySerialization.h @@ -0,0 +1,178 @@ +#pragma once + +#include "Runtime/mecanim/memory.h" + +template +struct StaticArrayTransfer +{ + enum + { + m_ArraySize = SIZE + }; + + size_t m_Size; + + typedef T* iterator; + typedef T value_type; + + T (&m_Data)[SIZE]; + + StaticArrayTransfer (T (&data)[SIZE]):m_Data(data),m_Size(m_ArraySize) + { + } + + void reserve(size_t size) + { + m_Size = std::min(size, m_ArraySize); + } + + iterator begin () { return &m_Data[0]; } + iterator end () { return &m_Data[m_Size]; } + size_t size() { return m_Size; } +}; + +template +class SerializeTraits< StaticArrayTransfer > : public SerializeTraitsBase< StaticArrayTransfer > +{ +public: + + DEFINE_GET_TYPESTRING_CONTAINER (staticvector) + + typedef StaticArrayTransfer value_type; + + static size_t GetAlignOf() {return ALIGN_OF(T);} + + template inline + static void Transfer (value_type& data, TransferFunction& transfer) + { + transfer.TransferSTLStyleArray (data); + } + + static bool IsContinousMemoryArray () { return true; } + static void ResizeSTLStyleArray (value_type& data, int rs) + { + data.reserve(rs); + } + + static void resource_image_assign_external (value_type& data, void* begin, void* end) + { + } +}; + +#define STATIC_ARRAY_TRANSFER(TYPE,DATA,SIZE) StaticArrayTransfer DATA##ArrayTransfer (DATA); transfer.Transfer(DATA##ArrayTransfer, #DATA); + + +template +struct ManualArrayTransfer +{ + typedef T* iterator; + typedef T value_type; + + T** m_Data; + mecanim::uint32_t* m_ArraySize; + void* m_Allocator; + TransferFunction& m_Transfer; + + ManualArrayTransfer (T*& data, mecanim::uint32_t& size, void* allocator, TransferFunction& transfer):m_Transfer(transfer) + { + m_Allocator = allocator; + m_Data = &data; + m_ArraySize = &size; + } + + T* begin () { return *m_Data; } + T* end () { return *m_Data + *m_ArraySize; } + size_t size() { return *m_ArraySize; } + + void resize (int size) + { + if(m_Transfer.IsReading() || m_Transfer.IsWriting() || m_Transfer.IsRemapPPtrTransfer()) + { + mecanim::memory::ChainedAllocator* allocator = static_cast (m_Allocator); + Assert(allocator != NULL); + + *m_Data = allocator->ConstructArray (size); + *m_ArraySize = size; + } + } +}; + +template +struct ManualArrayTransfer +{ + typedef T** iterator; + typedef T* value_type; + + value_type** m_Data; + mecanim::uint32_t* m_ArraySize; + void* m_Allocator; + TransferFunction& m_Transfer; + + ManualArrayTransfer (value_type *& data, mecanim::uint32_t& size, void* allocator, TransferFunction& transfer):m_Transfer(transfer) + { + m_Allocator = allocator; + m_Data = &data; + m_ArraySize = &size; + } + + value_type* begin () { return *m_Data; } + value_type* end () { return *m_Data + *m_ArraySize; } + size_t size() { return *m_ArraySize; } + + void resize (int size) + { + if(m_Transfer.IsReading() || m_Transfer.IsWriting() || m_Transfer.IsRemapPPtrTransfer()) + { + mecanim::memory::ChainedAllocator* allocator = static_cast (m_Allocator); + Assert(allocator != NULL); + + *m_Data = allocator->ConstructArray (size); + memset(*m_Data, 0, sizeof(value_type)*size); + *m_ArraySize = size; + } + } +}; + + + +template +class SerializeTraits > : public SerializeTraitsBase > +{ +public: + + typedef ManualArrayTransfer value_type; + DEFINE_GET_TYPESTRING_CONTAINER (vector) + + template inline + static void Transfer (value_type& data, TransferFunction& transfer) + { + transfer.TransferSTLStyleArray (data); + } + + static bool IsContinousMemoryArray () { return true; } + static void ResizeSTLStyleArray (value_type& data, int rs) + { + data.resize(rs); + } + + static void resource_image_assign_external (value_type& data, void* begin, void* end) + { + } +}; + +#define TRANSFER_NULLABLE(x,TYPE) \ +if (transfer.IsReading () || transfer.IsWriting ()) \ +{ \ + if (x == NULL) \ + { \ + mecanim::memory::ChainedAllocator* allocator = static_cast (transfer.GetUserData()); \ + x = allocator->Construct(); \ + } \ + transfer.Transfer(*x, #x); \ +} \ +else \ +{ \ + TYPE p; \ + transfer.Transfer(p, #x); \ +} + -- cgit v1.1-26-g67d0