BVB Source Codes

CRYENGINE Show AttachmentMerger.h Source code

Return Download CRYENGINE: download AttachmentMerger.h Source code - Download CRYENGINE Source code - Type:.h
  1. // Copyright 2001-2016 Crytek GmbH / Crytek Group. All rights reserved.
  2.  
  3. #pragma once
  4.  
  5. #include <utility>
  6.  
  7. #include "AttachmentBase.h"
  8. #include "ModelSkin.h"
  9.  
  10. class CAttachmentMerged;
  11. struct ISkin;
  12.  
  13. class CAttachmentMerger : public IAttachmentMerger
  14. {
  15.         static const EVertexFormat TargetVertexFormat = eVF_P3F;
  16.  
  17. public:
  18.  
  19.         struct ShadowChunkRange
  20.         {
  21.                 struct IsShadowChunk
  22.                 {
  23.                         IsShadowChunk(IMaterial* pMat)
  24.                                 : pMaterial(pMat) {}
  25.  
  26.                         bool operator()(const CRenderChunk& chunk) const
  27.                         {
  28.                                 IMaterial* pSubMtl = pMaterial->GetSafeSubMtl(chunk.m_nMatID);
  29.                                 return (pSubMtl->GetFlags() & (MTL_FLAG_NODRAW | MTL_FLAG_NOSHADOW)) == 0;
  30.                         }
  31.  
  32.                         IMaterial* pMaterial;
  33.                 };
  34.  
  35.                 struct ShadowChunkIterator
  36.                 {
  37.                         ShadowChunkIterator(TRenderChunkArray::const_iterator curPos, TRenderChunkArray::const_iterator rangeEnd, IMaterial* pMtl);
  38.  
  39.                         ShadowChunkIterator& operator++();
  40.                         const CRenderChunk& operator*()  const                                 { return  (*itCurPos); }
  41.                         const CRenderChunk* operator->() const                                 { return &(*itCurPos); }
  42.                         bool                operator!=(const ShadowChunkIterator& other) const { return itCurPos != other.itCurPos; }
  43.  
  44.                         TRenderChunkArray::const_iterator itCurPos;
  45.                         TRenderChunkArray::const_iterator itEnd;
  46.  
  47.                         IsShadowChunk                     isShadowChunk;
  48.                 };
  49.  
  50.                 ShadowChunkRange(IRenderMesh* pRM, IMaterial* pMtl)
  51.                         : pRenderMesh(pRM), pMaterial(pMtl) {}
  52.  
  53.                 ShadowChunkIterator begin();
  54.                 ShadowChunkIterator end();
  55.  
  56.                 IRenderMesh*        pRenderMesh;
  57.                 IMaterial*          pMaterial;
  58.         };
  59.  
  60.         struct AttachmentLodData
  61.         {
  62.                 IRenderMesh*     pMesh;
  63.                 IMaterial*       pMaterial;
  64.                 Matrix34         mTransform;
  65.  
  66.                 ShadowChunkRange GetShadowChunks() const { return ShadowChunkRange(pMesh, pMaterial); }
  67.         };
  68.  
  69.         struct AttachmentRenderData
  70.         {
  71.                 IAttachment* pAttachment;
  72.                 uint         nLodCount;
  73.                 uint         nBoneCount;
  74.                 StaticArray<AttachmentLodData, MAX_STATOBJ_LODS_NUM> arrLods;
  75.  
  76.                 AttachmentRenderData(IAttachment* pAtt);
  77.                 const AttachmentLodData& GetLod(int lod) const { return arrLods[lod]; }
  78.         };
  79.  
  80.         struct MeshStreams
  81.         {
  82.                 void*        pPositions;
  83.                 void*        pSkinningInfos;
  84.                 vtx_idx*     pIndices;
  85.  
  86.                 int          nPositionStride;
  87.                 int          nSkinningInfoStride;
  88.  
  89.                 IRenderMesh* pMesh;
  90.  
  91.                 MeshStreams(IRenderMesh* pRenderMesh, uint32 lockFlags = FSL_READ, bool bGetSkinningInfos = true);
  92.                 ~MeshStreams();
  93.  
  94.                 template<typename T>
  95.                 T& GetVertex(int nVtxIndex)
  96.                 {
  97.                         CRY_ASSERT(nVtxIndex < pMesh->GetVerticesCount());
  98.                         return static_cast<T*>(pPositions)[nVtxIndex];
  99.                 }
  100.  
  101.                 SVF_W4B_I4S&  GetSkinningInfo(int nVtxIndex);
  102.                 vtx_idx&      GetVertexIndex(int i);
  103.                 EVertexFormat GetVertexFormat();
  104.         };
  105.  
  106.         struct MergeContext
  107.         {
  108.                 enum TrinaryState { eStateOn = 0, eStateOff = 1, eStateMixed = 2 };
  109.  
  110.                 uint         nAccumulatedBoneCount;
  111.                 uint         nAccumulatedVertexCount[MAX_STATOBJ_LODS_NUM];
  112.                 uint         nAccumulatedIndexCount[MAX_STATOBJ_LODS_NUM];
  113.                 uint         nMaxLodCount;
  114.  
  115.                 TrinaryState nTwoSided;
  116.                 bool         bAlphaTested;
  117.                 bool         bEightWeightSkinning;
  118.  
  119.                 MergeContext(IAttachment* pAttachment);
  120.                 MergeContext(const AttachmentRenderData& renderData);
  121.                 void Update(const AttachmentRenderData& renderData);
  122.                 uint EstimateRequiredMemory() const;
  123.         };
  124.  
  125. public:
  126.         CAttachmentMerger()
  127.                 : m_nBytesAllocated(0)
  128.                 , m_nMergedSkinCount(0)
  129.                 , m_bOutOfMemory(false)
  130.         {}
  131.  
  132.         static CAttachmentMerger& Instance()                                 { static CAttachmentMerger instance; return instance; }
  133.  
  134.         virtual uint              GetAllocatedBytes() const override         { return m_nBytesAllocated; }
  135.         virtual bool              IsOutOfMemory() const override             { return m_bOutOfMemory; }
  136.         virtual uint              GetMergedAttachmentsCount() const override { return m_nMergedSkinCount; }
  137.  
  138.         void                      MergeAttachments(DynArray<_smart_ptr<SAttachmentBase>>& arrAttachments, DynArray<_smart_ptr<CAttachmentMerged>>& arrMergedAttachments, CAttachmentManager* pAttachmentManager);
  139.         void                      UpdateIndices(CAttachmentMerged* pAttachment, int lod, const DynArray<std::pair<uint32, uint32>>& srcRanges);
  140.         void                      OnDeleteMergedAttachment(CAttachmentMerged* pAttachment);
  141.  
  142.         static bool               CanMerge(IAttachment* pAttachment1, IAttachment* pAttachment2);
  143.  
  144. private:
  145.         void              Merge(CAttachmentMerged* pDstAttachment, const DynArray<AttachmentRenderData>& attachmentData, CAttachmentManager* pAttachmentManager);
  146.  
  147.         uint              CopyVertices(MeshStreams& dstStreams, uint dstVtxOffset, MeshStreams& srcStreams, uint numVertices);
  148.         uint              CopyVertices(MeshStreams& dstStreams, uint dstVtxOffset, MeshStreams& srcStreams, uint numVertices, const Matrix34& transform);
  149.         uint              CopyIndices(MeshStreams& dstStreams, uint dstVtxOffset, uint dstIdxOffset, MeshStreams& srcStreams, const CRenderChunk& chunk);
  150.         uint              CopySkinning(MeshStreams& dstStreams, uint dstVtxOffset, MeshStreams& srcStreams, uint numVertices, const DynArray<JointIdType>& boneIDs);
  151.         void              SkinToBone(MeshStreams& dstStreams, uint dstVtxOffset, MeshStreams& srcStreams, uint numVertices, JointIdType jointID);
  152.  
  153.         static bool       CanMerge(const MergeContext& context1, const MergeContext& context2);
  154.         static IMaterial* GetAttachmentMaterial(const IAttachment* pAttachment, int lod);
  155.  
  156.         uint m_nMergedSkinCount;
  157.         uint m_nBytesAllocated;
  158.         bool m_bOutOfMemory;
  159. };
  160.  
downloadAttachmentMerger.h Source code - Download CRYENGINE Source code
Related Source Codes/Software:
postal - 2017-06-11
reactide - Reactide is the first dedicated IDE for React web ... 2017-06-11
rkt - rkt is a pod-native container engine for Linux. It... 2017-06-11
uWebSockets - Tiny WebSockets https://for... 2017-06-11
realworld - TodoMVC for the RealWorld - Exemplary fullstack Me... 2017-06-11
CRYENGINE - CRYENGINE is a powerful real-time game development... 2017-06-11
goreplay - GoReplay is an open-source tool for capturing and ... 2017-06-10
pyenv - Simple Python version management 2017-06-10
redux-saga - An alternative side effect model for Redux apps ... 2017-06-10
angular-starter - 2017-06-10

 Back to top