Team Fortress 2 Source Code as on 22/4/2020
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.
|
|
//========= 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
|