You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
3.3 KiB
110 lines
3.3 KiB
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
//=============================================================================
|
|
|
|
#ifndef LEDGEWRITER_H
|
|
#define LEDGEWRITER_H
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
#include "vphysics/virtualmesh.h"
|
|
|
|
// 2-sided triangle ledge rep
|
|
struct triangleledge_t
|
|
{
|
|
IVP_Compact_Ledge ledge;
|
|
IVP_Compact_Triangle faces[2];
|
|
};
|
|
|
|
// minimum footprint convex hull rep. Assume 8-bits of index space per edge/triangle/vert
|
|
// NOTE: EACH ELEMENT OF THESE STRUCTS MUST BE 8-bits OR YOU HAVE TO WRITE SWAPPING CODE FOR
|
|
// THE X360 IMPLEMENTATION. THERE IS NO SUCH CODE AS OF NOW.
|
|
#pragma pack(1)
|
|
struct packedtriangle_t
|
|
{
|
|
byte e0; // only bytes allowed see above
|
|
byte e1;
|
|
byte e2;
|
|
byte opposite;
|
|
};
|
|
|
|
struct packededge_t
|
|
{
|
|
byte v0; // only bytes allowed see above
|
|
byte v1;
|
|
};
|
|
|
|
struct packedhull_t
|
|
{
|
|
byte triangleCount; // only bytes allowed see above
|
|
byte vtriCount;
|
|
byte edgeCount;
|
|
byte vedgeCount;
|
|
byte baseVert;
|
|
inline size_t DataSize() const
|
|
{
|
|
return (sizeof(packedtriangle_t) * triangleCount) + (sizeof(packededge_t)*edgeCount);
|
|
}
|
|
};
|
|
|
|
struct virtualmeshhull_t
|
|
{
|
|
byte hullCount; // only bytes allowed see above
|
|
byte pad[3];
|
|
|
|
inline const packedhull_t *GetPackedHull( int hullIndex ) const
|
|
{
|
|
Assert(hullIndex<hullCount);
|
|
return ((const packedhull_t *)(this+1)) + hullIndex;
|
|
}
|
|
inline const packedtriangle_t *GetPackedTriangles( int hullIndex ) const
|
|
{
|
|
const packedhull_t *pHull = GetPackedHull(0);
|
|
// the first triangle is immediately following the memory for the packed hulls
|
|
const byte *pStart = reinterpret_cast<const byte *>(GetPackedHull(0) + hullCount);
|
|
for ( int i = 0; i < hullIndex; i++ )
|
|
{
|
|
pStart += pHull[i].DataSize();
|
|
}
|
|
return reinterpret_cast<const packedtriangle_t *>(pStart);
|
|
}
|
|
inline const packededge_t *GetPackedEdges( int hullIndex ) const
|
|
{
|
|
return reinterpret_cast<const packededge_t *>(GetPackedTriangles(hullIndex) + GetPackedHull(hullIndex)->triangleCount);
|
|
}
|
|
inline size_t TotalSize() const
|
|
{
|
|
size_t size = sizeof(*this) + sizeof(packedhull_t) * hullCount;
|
|
for ( int i = 0; i < hullCount; i++ )
|
|
{
|
|
size += GetPackedHull(i)->DataSize();
|
|
}
|
|
return size;
|
|
|
|
}
|
|
};
|
|
|
|
#pragma pack()
|
|
// end
|
|
// NOTE: EACH ELEMENT OF THE ABOVE STRUCTS MUST BE 8-bits OR YOU HAVE TO WRITE SWAPPING CODE FOR
|
|
// THE X360 IMPLEMENTATION. THERE IS NO SUCH CODE AS OF NOW.
|
|
|
|
|
|
// These statics are grouped in a class so they can be friends of IVP_Compact_Ledge and access its private data
|
|
class CVPhysicsVirtualMeshWriter
|
|
{
|
|
public:
|
|
// init a 2-sided triangle ledge
|
|
static void InitTwoSidedTriangleLege( triangleledge_t *pOut, const IVP_Compact_Poly_Point *pPoints, int v0, int v1, int v2, int materialIndex );
|
|
|
|
static virtualmeshhull_t *CreatePackedHullFromLedges( const virtualmeshlist_t &list, const IVP_Compact_Ledge **pLedges, int ledgeCount );
|
|
static void UnpackCompactLedgeFromHull( IVP_Compact_Ledge *pLedge, int materialIndex, const IVP_Compact_Poly_Point *pPointList, const virtualmeshhull_t *pHullHeader, int hullIndex, bool isVirtualLedge );
|
|
static void DestroyPackedHull( virtualmeshhull_t *pHull );
|
|
static bool LedgeCanBePacked(const IVP_Compact_Ledge *pLedge, const virtualmeshlist_t &list);
|
|
static unsigned int UnpackLedgeListFromHull( byte *pOut, virtualmeshhull_t *pHull, IVP_Compact_Poly_Point *pPoints );
|
|
};
|
|
|
|
#endif // LEDGEWRITER_H
|