47 static consteval std::array<Type, 9>
getOrder() {
74 std::tuple<uint8_t, uint8_t, uint8_t, uint8_t>,
94 return std::get<std::tuple<uint8_t, uint8_t, uint8_t, uint8_t>>(this->
convertData());
106 return static_cast<int16_t
>(std::get<std::span<uint32_t>>(this->
convertData())[1] & 0xffff);
110 auto method =
static_cast<int16_t
>((std::get<std::span<uint32_t>>(this->
convertData())[1] & 0xffff0000) >> 16);
117 [[nodiscard]] uint32_t
getDataAsAuxCompressionLength(uint8_t mip, uint8_t mipCount, uint16_t frame, uint16_t frameCount, uint16_t face, uint16_t faceCount)
const {
118 return std::get<std::span<uint32_t>>(this->
convertData())[((mipCount - 1 - mip) * frameCount * faceCount + frame * faceCount + face) + 2];
148 FLAG_POINT_SAMPLE = 1 << 0,
149 FLAG_TRILINEAR = 1 << 1,
150 FLAG_CLAMP_S = 1 << 2,
151 FLAG_CLAMP_T = 1 << 3,
152 FLAG_ANISOTROPIC = 1 << 4,
153 FLAG_HINT_DXT5 = 1 << 5,
154 FLAG_NORMAL = 1 << 7,
155 FLAG_NO_MIP = 1 << 8,
156 FLAG_NO_LOD = 1 << 9,
157 FLAG_MIN_MIP = 1 << 10,
158 FLAG_PROCEDURAL = 1 << 11,
159 FLAG_ONE_BIT_ALPHA = 1 << 12,
160 FLAG_MULTI_BIT_ALPHA = 1 << 13,
161 FLAG_ENVMAP = 1 << 14,
162 FLAG_RENDERTARGET = 1 << 15,
163 FLAG_DEPTH_RENDERTARGET = 1 << 16,
164 FLAG_NO_DEBUG_OVERRIDE = 1 << 17,
165 FLAG_SINGLE_COPY = 1 << 18,
167 static constexpr uint32_t FLAGS_MASK_V0 = FLAG_POINT_SAMPLE | FLAG_TRILINEAR | FLAG_CLAMP_S | FLAG_CLAMP_T | FLAG_ANISOTROPIC | FLAG_HINT_DXT5 | FLAG_NORMAL | FLAG_NO_MIP | FLAG_NO_LOD | FLAG_MIN_MIP | FLAG_PROCEDURAL | FLAG_ONE_BIT_ALPHA | FLAG_MULTI_BIT_ALPHA | FLAG_ENVMAP | FLAG_RENDERTARGET | FLAG_DEPTH_RENDERTARGET | FLAG_NO_DEBUG_OVERRIDE | FLAG_SINGLE_COPY;
170 FLAG_V2_NO_DEPTH_BUFFER = 1 << 23,
171 FLAG_V2_CLAMP_U = 1 << 25,
173 static constexpr uint32_t FLAGS_MASK_V2 = FLAG_V2_NO_DEPTH_BUFFER | FLAG_V2_CLAMP_U;
176 FLAG_V3_LOAD_ALL_MIPS = 1 << 10,
177 FLAG_V3_VERTEX_TEXTURE = 1 << 26,
178 FLAG_V3_SSBUMP = 1 << 27,
179 FLAG_V3_BORDER = 1 << 29,
181 static constexpr uint32_t FLAGS_MASK_V3 = FLAG_V3_LOAD_ALL_MIPS | FLAG_V3_VERTEX_TEXTURE | FLAG_V3_SSBUMP | FLAG_V3_BORDER;
184 FLAG_V4_SRGB = 1 << 6,
186 static constexpr uint32_t FLAGS_MASK_V4 = FLAG_V4_SRGB;
189 FLAG_V4_TF2_STAGING_MEMORY = 1 << 19,
190 FLAG_V4_TF2_IMMEDIATE_CLEANUP = 1 << 20,
191 FLAG_V4_TF2_IGNORE_PICMIP = 1 << 21,
192 FLAG_V4_TF2_STREAMABLE_COARSE = 1 << 30,
193 FLAG_V4_TF2_STREAMABLE_FINE =
static_cast<uint32_t
>(1 << 31),
195 static constexpr uint32_t FLAGS_MASK_V4_TF2 = FLAG_V4_TF2_STAGING_MEMORY | FLAG_V4_TF2_IMMEDIATE_CLEANUP | FLAG_V4_TF2_IGNORE_PICMIP | FLAG_V4_TF2_STREAMABLE_COARSE | FLAG_V4_TF2_STREAMABLE_FINE;
198 FLAG_V5_PWL_CORRECTED = 1 << 6,
199 FLAG_V5_SRGB = 1 << 19,
200 FLAG_V5_DEFAULT_POOL = 1 << 20,
201 FLAG_V5_LOAD_MOST_MIPS = 1 << 28,
203 static constexpr uint32_t FLAGS_MASK_V5 = FLAG_V5_PWL_CORRECTED | FLAG_V5_SRGB | FLAG_V5_DEFAULT_POOL | FLAG_V5_LOAD_MOST_MIPS;
206 FLAG_V5_CSGO_COMBINED = 1 << 21,
207 FLAG_V5_CSGO_ASYNC_DOWNLOAD = 1 << 22,
208 FLAG_V5_CSGO_SKIP_INITIAL_DOWNLOAD = 1 << 24,
209 FLAG_V5_CSGO_YCOCG = 1 << 30,
210 FLAG_V5_CSGO_ASYNC_SKIP_INITIAL_LOW_RES =
static_cast<uint32_t
>(1 << 31),
212 static constexpr uint32_t FLAGS_MASK_V5_CSGO = FLAG_V5_CSGO_COMBINED | FLAG_V5_CSGO_ASYNC_DOWNLOAD | FLAG_V5_CSGO_SKIP_INITIAL_DOWNLOAD | FLAG_V5_CSGO_YCOCG | FLAG_V5_CSGO_ASYNC_SKIP_INITIAL_LOW_RES;
214 static constexpr uint32_t FLAGS_MASK_INTERNAL = FLAG_NO_MIP | FLAG_ENVMAP;
217 PLATFORM_UNKNOWN = 0x000,
219 PLATFORM_X360 = 0x360,
220 PLATFORM_PS3_ORANGEBOX = 0x333,
221 PLATFORM_PS3_PORTAL2 = 0x003,
225 uint32_t version = 4;
231 uint16_t initialFrameCount = 1;
232 uint16_t startFrame = 0;
233 bool isCubeMap =
false;
234 uint16_t initialSliceCount = 1;
235 bool computeTransparencyFlags =
true;
236 bool computeMips =
true;
237 bool computeThumbnail =
true;
238 bool computeReflectivity =
true;
240 int16_t compressionLevel = -1;
242 float bumpMapScale = 1.f;
243 float gammaCorrection = 1.f;
244 bool invertGreenChannel =
false;
248 static constexpr auto FORMAT_UNCHANGED =
static_cast<ImageFormat>(-2);
251 static constexpr auto FORMAT_DEFAULT =
static_cast<ImageFormat>(-1);
255 explicit VTF(std::vector<std::byte>&& vtfData,
bool parseHeaderOnly =
false);
257 explicit VTF(std::span<const std::byte> vtfData,
bool parseHeaderOnly =
false);
259 explicit VTF(
const std::string& vtfPath,
bool parseHeaderOnly =
false);
263 VTF& operator=(
const VTF& other);
267 VTF& operator=(
VTF&&) noexcept = default;
269 [[nodiscard]] explicit operator
bool() const;
271 static
bool create(std::span<const std::
byte> imageData,
ImageFormat format, uint16_t width, uint16_t height, const std::
string& vtfPath,
CreationOptions options);
275 [[nodiscard]] static
VTF create(std::span<const std::
byte> imageData,
ImageFormat format, uint16_t width, uint16_t height,
CreationOptions options);
279 static
bool create(const std::
string& imagePath, const std::
string& vtfPath,
CreationOptions options);
281 [[nodiscard]] static
VTF create(const std::
string& imagePath,
CreationOptions options);
283 [[nodiscard]]
Platform getPlatform() const;
285 void setPlatform(
Platform newPlatform);
287 [[nodiscard]] uint32_t getVersion() const;
289 void setVersion(uint32_t newVersion);
291 [[nodiscard]] ImageConversion::ResizeMethod getImageWidthResizeMethod() const;
293 [[nodiscard]] ImageConversion::ResizeMethod getImageHeightResizeMethod() const;
295 void setImageResizeMethods(ImageConversion::ResizeMethod imageWidthResizeMethod_, ImageConversion::ResizeMethod imageHeightResizeMethod_);
297 void setImageWidthResizeMethod(ImageConversion::ResizeMethod imageWidthResizeMethod_);
299 void setImageHeightResizeMethod(ImageConversion::ResizeMethod imageHeightResizeMethod_);
301 [[nodiscard]] uint16_t getWidth(uint8_t mip = 0) const;
303 [[nodiscard]] uint16_t getHeight(uint8_t mip = 0) const;
305 void setSize(uint16_t newWidth, uint16_t newHeight, ImageConversion::ResizeFilter filter);
307 [[nodiscard]] uint32_t getFlags() const;
309 void setFlags(uint32_t flags_);
311 void addFlags(uint32_t flags_);
313 void removeFlags(uint32_t flags_);
315 [[nodiscard]]
bool isSRGB() const;
317 void setSRGB(
bool srgb);
319 void computeTransparencyFlags();
321 [[nodiscard]] static
ImageFormat getDefaultCompressedFormat(
ImageFormat inputFormat, uint32_t version,
bool isCubeMap);
325 void setFormat(
ImageFormat newFormat, ImageConversion::ResizeFilter filter = ImageConversion::ResizeFilter::DEFAULT);
327 [[nodiscard]] uint8_t getMipCount() const;
329 bool setMipCount(uint8_t newMipCount);
331 bool setRecommendedMipCount();
333 void computeMips(ImageConversion::ResizeFilter filter = ImageConversion::ResizeFilter::DEFAULT);
335 [[nodiscard]] uint16_t getFrameCount() const;
337 bool setFrameCount(uint16_t newFrameCount);
339 [[nodiscard]] uint8_t getFaceCount() const;
341 bool setFaceCount(
bool isCubeMap);
343 [[nodiscard]] uint16_t getSliceCount() const;
345 bool setSliceCount(uint16_t newSliceCount);
347 bool setFrameFaceAndSliceCount(uint16_t newFrameCount,
bool isCubeMap, uint16_t newSliceCount = 1);
349 [[nodiscard]] uint16_t getStartFrame() const;
351 void setStartFrame(uint16_t newStartFrame);
353 [[nodiscard]]
sourcepp::math::Vec3f getReflectivity() const;
355 void setReflectivity(
sourcepp::math::Vec3f newReflectivity);
357 void computeReflectivity();
359 [[nodiscard]]
float getBumpMapScale() const;
361 void setBumpMapScale(
float newBumpMapScale);
363 [[nodiscard]]
ImageFormat getThumbnailFormat() const;
365 [[nodiscard]] uint8_t getThumbnailWidth() const;
367 [[nodiscard]] uint8_t getThumbnailHeight() const;
369 [[nodiscard]] const std::vector<
Resource>& getResources() const;
374 [[nodiscard]] std::vector<std::
byte> getParticleSheetFrameDataRaw(uint16_t& spriteWidth, uint16_t& spriteHeight, uint32_t shtSequenceID, uint32_t shtFrame, uint8_t shtBounds = 0, uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0, uint16_t slice = 0) const;
377 [[nodiscard]] std::vector<std::
byte> getParticleSheetFrameDataAs(
ImageFormat newFormat, uint16_t& spriteWidth, uint16_t& spriteHeight, uint32_t shtSequenceID, uint32_t shtFrame, uint8_t shtBounds = 0, uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0, uint16_t slice = 0) const;
380 [[nodiscard]] std::vector<std::
byte> getParticleSheetFrameDataAsRGBA8888(uint16_t& spriteWidth, uint16_t& spriteHeight, uint32_t shtSequenceID, uint32_t shtFrame, uint8_t shtBounds = 0, uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0, uint16_t slice = 0) const;
382 void setParticleSheetResource(const
SHT& value);
384 void removeParticleSheetResource();
386 void setCRCResource(uint32_t value);
388 void removeCRCResource();
390 void setLODResource(uint8_t u, uint8_t v, uint8_t u360 = 0, uint8_t v360 = 0);
392 void removeLODResource();
394 void setExtendedFlagsResource(uint32_t value);
396 void removeExtendedFlagsResource();
398 void setKeyValuesDataResource(const std::
string& value);
400 void removeKeyValuesDataResource();
402 void setHotspotDataResource(const
HOT& value);
404 void removeHotspotDataResource();
406 [[nodiscard]] int16_t getCompressionLevel() const;
408 void setCompressionLevel(int16_t newCompressionLevel);
414 [[nodiscard]]
bool hasImageData() const;
416 [[nodiscard]] std::span<const std::
byte> getImageDataRaw(uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0, uint16_t slice = 0) const;
418 [[nodiscard]] std::vector<std::
byte> getImageDataAs(
ImageFormat newFormat, uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0, uint16_t slice = 0) const;
420 [[nodiscard]] std::vector<std::
byte> getImageDataAsRGBA8888(uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0, uint16_t slice = 0) const;
422 bool setImage(std::span<const std::
byte> imageData_,
ImageFormat format_, uint16_t width_, uint16_t height_, ImageConversion::ResizeFilter filter = ImageConversion::ResizeFilter::DEFAULT, uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0, uint16_t slice = 0);
424 bool setImage(const std::
string& imagePath, ImageConversion::ResizeFilter filter = ImageConversion::ResizeFilter::DEFAULT, uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0, uint16_t slice = 0);
426 [[nodiscard]] std::vector<std::
byte> saveImageToFile(uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0, uint16_t slice = 0, ImageConversion::FileFormat fileFormat = ImageConversion::FileFormat::DEFAULT) const;
428 bool saveImageToFile(const std::
string& imagePath, uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0, uint16_t slice = 0, ImageConversion::FileFormat fileFormat = ImageConversion::FileFormat::DEFAULT) const;
430 [[nodiscard]]
bool hasThumbnailData() const;
432 [[nodiscard]] std::span<const std::
byte> getThumbnailDataRaw() const;
434 [[nodiscard]] std::vector<std::
byte> getThumbnailDataAs(
ImageFormat newFormat) const;
436 [[nodiscard]] std::vector<std::
byte> getThumbnailDataAsRGBA8888() const;
438 void setThumbnail(std::span<const std::
byte> imageData_,
ImageFormat format_, uint16_t width_, uint16_t height_);
440 void computeThumbnail(ImageConversion::ResizeFilter filter = ImageConversion::ResizeFilter::DEFAULT);
442 void removeThumbnail();
444 [[nodiscard]] std::vector<std::
byte> saveThumbnailToFile(ImageConversion::FileFormat fileFormat = ImageConversion::FileFormat::DEFAULT) const;
446 bool saveThumbnailToFile(const std::
string& imagePath, ImageConversion::FileFormat fileFormat = ImageConversion::FileFormat::DEFAULT) const;
448 [[nodiscard]] std::vector<std::
byte> bake() const;
450 bool bake(const std::
string& vtfPath) const;
457 void setResourceInternal(
Resource::Type type, std::span<const std::
byte> data_);
459 void removeResourceInternal(
Resource::Type type);
461 void regenerateImageData(
ImageFormat newFormat, uint16_t newWidth, uint16_t newHeight, uint8_t newMipCount, uint16_t newFrameCount, uint8_t newFaceCount, uint16_t newSliceCount, ImageConversion::ResizeFilter filter = ImageConversion::ResizeFilter::DEFAULT);
465 std::vector<std::
byte> data;
475 uint16_t frameCount = 1;
476 uint16_t startFrame{};
479 sourcepp::math::Vec3f reflectivity{};
482 float bumpMapScale{};
484 uint8_t mipCount = 1;
487 uint8_t thumbnailWidth{};
488 uint8_t thumbnailHeight{};
491 uint16_t sliceCount = 1;
501 int16_t compressionLevel = 0;
#define SOURCEPP_BITFLAGS_ENUM(Enum)
Defines bitwise operators for an enum or enum class.
VTF(VTF &&) noexcept=default
std::vector< Resource > resources
consteval uint32_t makeFourCC(const char fourCC[4])
Creates a FourCC identifier from a string of 4 characters.
constexpr uint32_t VTF_SIGNATURE
constexpr uint32_t VTFX_SIGNATURE
constexpr uint32_t VTF3_SIGNATURE
SHT getDataAsParticleSheet() const
static consteval std::array< Type, 9 > getOrder()
CompressionMethod getDataAsAuxCompressionMethod() const
uint32_t getDataAsAuxCompressionLength(uint8_t mip, uint8_t mipCount, uint16_t frame, uint16_t frameCount, uint16_t face, uint16_t faceCount) const
ConvertedData convertData() const
std::tuple< uint8_t, uint8_t, uint8_t, uint8_t > getDataAsLODControlInfo() const
std::string getDataAsKeyValuesData() const
uint32_t getDataAsCRC() const
std::variant< std::monostate, SHT, uint32_t, std::tuple< uint8_t, uint8_t, uint8_t, uint8_t >, std::string, HOT, std::span< uint32_t > > ConvertedData
uint32_t getDataAsExtendedFlags() const
int16_t getDataAsAuxCompressionLevel() const
HOT getDataAsHotspotData() const
@ TYPE_PARTICLE_SHEET_DATA
std::span< std::byte > data