#pragma once #include "model.h" #include "i_modelvertexbuffer.h" #include "tarray.h" #include "xs_Float.h" struct FVoxel; struct kvxslab_t; class FModelRenderer; class FGameTexture; struct FVoxelVertexHash { // Returns the hash value for a key. hash_t Hash(const FModelVertex &key) { int ix = xs_RoundToInt(key.x); int iy = xs_RoundToInt(key.y); int iz = xs_RoundToInt(key.z); return (hash_t)(ix + (iy<<9) + (iz<<18)); } // Compares two keys, returning zero if they are the same. int Compare(const FModelVertex &left, const FModelVertex &right) { return left.x != right.x || left.y != right.y || left.z != right.z || left.u != right.u || left.v != right.v; } }; struct FIndexInit { void Init(unsigned int &value) { value = 0xffffffff; } }; typedef TMap FVoxelMap; class FVoxelModel : public FModel { protected: FVoxel *mVoxel; bool mOwningVoxel; // if created through MODELDEF deleting this object must also delete the voxel object FTextureID mPalette; unsigned int mNumIndices; TArray mVertices; TArray mIndices; void MakeSlabPolys(int x, int y, kvxslab_t *voxptr, FVoxelMap &check); void AddFace(int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3, int x4, int y4, int z4, uint8_t color, FVoxelMap &check); unsigned int AddVertex(FModelVertex &vert, FVoxelMap &check); public: FVoxelModel(FVoxel *voxel, bool owned); ~FVoxelModel(); bool Load(const char * fn, int lumpnum, const char * buffer, int length) override; void Initialize(); virtual int FindFrame(const char * name) override; virtual void RenderFrame(FModelRenderer *renderer, FGameTexture * skin, int frame, int frame2, double inter, int translation=0) override; virtual void AddSkins(uint8_t *hitlist) override; FTextureID GetPaletteTexture() const { return mPalette; } void BuildVertexBuffer(FModelRenderer *renderer) override; float getAspectFactor(float vscale) override; };