You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Code/CryEngine/Cry3DEngine/GeomCacheDecoder.h

78 lines
3.1 KiB
C++

/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
// Original file Copyright Crytek GMBH or its affiliates, used under license.
// Description : Decodes geom cache data
#ifndef CRYINCLUDE_CRY3DENGINE_GEOMCACHEDECODER_H
#define CRYINCLUDE_CRY3DENGINE_GEOMCACHEDECODER_H
#pragma once
#if defined(USE_GEOM_CACHES)
#include "GeomCacheFileFormat.h"
class CGeomCache;
struct SGeomCacheRenderMeshUpdateContext;
struct SGeomCacheStaticMeshData;
struct SGeomCacheFrameHeader
{
enum EFrameHeaderState
{
eFHS_Uninitialized = 0,
eFHS_Undecoded = 1,
eFHS_Decoded = 2
};
EFrameHeaderState m_state;
uint32 m_offset;
};
namespace GeomCacheDecoder
{
// Decodes an index frame
void DecodeIFrame(const CGeomCache* pGeomCache, char* pData);
// Decodes a bi-directional predicted frame
void DecodeBFrame(const CGeomCache * pGeomCache, char* pData, char* pPrevFramesData[2],
char* pFloorIndexFrameData, char* pCeilIndexFrameData);
bool PrepareFillMeshData(SGeomCacheRenderMeshUpdateContext& updateContext, const SGeomCacheStaticMeshData& staticMeshData,
const char*& pFloorFrameMeshData, const char*& pCeilFrameMeshData, size_t& offsetToNextMesh, float& lerpFactor);
void FillMeshDataFromDecodedFrame(const bool bMotionBlur, SGeomCacheRenderMeshUpdateContext& updateContext,
const SGeomCacheStaticMeshData& staticMeshData, const char* pFloorFrameMeshData,
const char* pCeilFrameMeshData, float lerpFactor);
// Gets total needed space for uncompressing successive blocks
uint32 GetDecompressBufferSize(const char* const pStartBlock, const uint numFrames);
// Decompresses one block of compressed data with header for input
bool DecompressBlock(const GeomCacheFile::EBlockCompressionFormat compressionFormat, char* const pDest, const char* const pSource);
// Decompresses blocks of compressed data with headers for input and output
bool DecompressBlocks(const GeomCacheFile::EBlockCompressionFormat compressionFormat, char* const pDest,
const char* const pSource, const uint blockOffset, const uint numBlocks, const uint numHandleFrames);
Vec3 DecodePosition(const Vec3& aabbMin, const Vec3& aabbSize, const GeomCacheFile::Position& inPosition, const Vec3& convertFactor);
Vec2 DecodeTexcoord(const GeomCacheFile::Texcoords& inTexcoords, float uvMax);
Quat DecodeQTangent(const GeomCacheFile::QTangent& inQTangent);
void TransformAndConvertToTangentAndBitangent(const Quat& rotation, const Quat& inQTangent, SPipTangents& outTangents);
void ConvertToTangentAndBitangent(const Quat& inQTangent, SPipTangents& outTangents);
};
#endif
#endif // CRYINCLUDE_CRY3DENGINE_GEOMCACHEDECODER_H