SourcePP
Several modern C++20 libraries for sanely parsing Valve's formats.
Loading...
Searching...
No Matches
VTF.h
Go to the documentation of this file.
1#pragma once
2
3#include <array>
4#include <cstddef>
5#include <filesystem>
6#include <span>
7#include <string>
8#include <string_view>
9#include <tuple>
10#include <utility>
11#include <variant>
12#include <vector>
13
15#include <sourcepp/Macros.h>
16
17#include "HOT.h"
18#include "ImageConversion.h"
19#include "SHT.h"
20
21namespace vtfpp {
22
27
28enum class CompressionMethod : int16_t {
29 // Strata Source v7.6 defines
31 ZSTD = 93,
32
33 // Signify the image resource should be compressed with LZMA on console
34 CONSOLE_LZMA = 0x360,
35};
36
37struct Resource {
52
53 enum Flags : uint8_t {
56 };
57
60 std::span<std::byte> data;
61
62 using ConvertedData = std::variant<
63 std::monostate, // Anything that would be equivalent to just returning data directly, or used as an error
64 SHT, // Particle Sheet
65 uint32_t, // CRC, TS0
66 std::tuple<uint8_t, uint8_t, uint8_t, uint8_t>, // LOD
67 std::string, // KVD
68 HOT // Hotspot data
69 >;
70 [[nodiscard]] ConvertedData convertData() const;
71
72 [[nodiscard]] std::vector<std::byte> getDataAsPalette(uint16_t frame) const {
73 static constexpr auto PALETTE_FRAME_SIZE = 256 * sizeof(ImagePixel::BGRA8888);
74 if (this->data.size() % PALETTE_FRAME_SIZE != 0 || PALETTE_FRAME_SIZE * frame > this->data.size()) {
75 return {};
76 }
77 return {this->data.data() + PALETTE_FRAME_SIZE * frame, this->data.data() + PALETTE_FRAME_SIZE * (frame + 1)};
78 }
79
80 [[nodiscard]] SHT getDataAsParticleSheet() const {
81 return std::get<SHT>(this->convertData());
82 }
83
84 [[nodiscard]] uint32_t getDataAsCRC() const {
85 return std::get<uint32_t>(this->convertData());
86 }
87
88 [[nodiscard]] uint32_t getDataAsExtendedFlags() const {
89 return std::get<uint32_t>(this->convertData());
90 }
91
92 [[nodiscard]] std::tuple<uint8_t, uint8_t, uint8_t, uint8_t> getDataAsLODControlInfo() const {
93 return std::get<std::tuple<uint8_t, uint8_t, uint8_t, uint8_t>>(this->convertData());
94 }
95
96 [[nodiscard]] std::string getDataAsKeyValuesData() const {
97 return std::get<std::string>(this->convertData());
98 }
99
100 [[nodiscard]] HOT getDataAsHotspotData() const {
101 return std::get<HOT>(this->convertData());
102 }
103
104 [[nodiscard]] int16_t getDataAsAuxCompressionLevel() const {
105 if (this->data.size() < sizeof(uint32_t) * 2) {
106 return 0;
107 }
108 return static_cast<int16_t>(BufferStream{this->data}.skip<uint32_t>().read<uint32_t>() & 0xffff);
109 }
110
112 if (this->data.size() < sizeof(uint32_t) * 2) {
114 }
115 const auto method = static_cast<int16_t>((BufferStream{this->data}.skip<uint32_t>().read<uint32_t>() & 0xffff0000) >> 16);
116 if (method <= 0) {
118 }
119 return static_cast<CompressionMethod>(method);
120 }
121
122 [[nodiscard]] uint32_t getDataAsAuxCompressionLength(uint8_t mip, uint8_t mipCount, uint16_t frame, uint16_t frameCount, uint16_t face, uint16_t faceCount) const {
123 if (this->data.size() < ((mipCount - 1 - mip) * frameCount * faceCount + frame * faceCount + face + 2) * sizeof(uint32_t)) {
124 return 0;
125 }
126 return BufferStream{this->data}.skip<uint32_t>((mipCount - 1 - mip) * frameCount * faceCount + frame * faceCount + face + 2).read<uint32_t>();
127 }
128};
130
131/*
132 * === EASY DIFFICULTY WRITER API ===
133 *
134 * Use a static helper function to create a VTF in one function call - VTF::create
135 *
136 * === MEDIUM DIFFICULTY WRITER API ===
137 *
138 * Constructing a VTF instance from existing VTF data will let you modify that data.
139 *
140 * When constructing a VTF instance from scratch, this class has methods that should be
141 * called in a particular order. If they aren't your output VTF will look incorrect or
142 * have heavy artifacting. Some of these steps are optional, but the steps actually taken
143 * should be done in this order. Reference VTF::create and VTF::createInternal to see the
144 * intended "order of operations".
145 */
146class VTF {
147public:
148 enum Flags : uint32_t {
154 FLAG_V0_VTEX_HINT_DXT5 = 1u << 5, // Internal to vtex
155 FLAG_V0_VTEX_NO_COMPRESS = 1u << 6, // Internal to vtex
156 FLAG_V0_NORMAL = 1u << 7,
157 FLAG_V0_NO_MIP = 1u << 8, // Controlled by mip count
158 FLAG_V0_NO_LOD = 1u << 9,
163 FLAG_V0_ENVMAP = 1u << 14, // Controlled by face count
166
171 FLAG_V1_VTEX_ONE_OVER_MIP_LEVEL_IN_ALPHA = 1u << 19, // Internal to vtex
173 FLAG_V1_VTEX_CONVERT_NORMAL_TO_DUDV = 1u << 21, // Internal to vtex
176
177 FLAG_V2_VTEX_ALPHA_TEST_MIP_GENERATION = 1u << 22, // Internal to vtex
179 FLAG_V2_VTEX_NICE_FILTERED = 1u << 24, // Internal to vtex
180 FLAG_V2_CLAMP_U = 1u << 25,
183
189
192 FLAG_V3_SSBUMP = 1u << 27,
193 FLAG_V3_BORDER = 1u << 29,
195
196 FLAG_V4_SRGB = 1u << 6,
198
205
207 FLAG_V5_SRGB = 1u << 19,
211
218
220 };
221
230
255
257 static constexpr auto FORMAT_UNCHANGED = static_cast<ImageFormat>(-2);
258
260 static constexpr auto FORMAT_DEFAULT = static_cast<ImageFormat>(-1);
261
262 VTF();
263
264 explicit VTF(std::vector<std::byte>&& vtfData, bool parseHeaderOnly = false);
265
266 explicit VTF(std::span<const std::byte> vtfData, bool parseHeaderOnly = false);
267
268 explicit VTF(const std::filesystem::path& vtfPath, bool parseHeaderOnly = false);
269
270 VTF(const VTF& other);
271
272 VTF& operator=(const VTF& other);
273
274 VTF(VTF&&) noexcept = default;
275
276 VTF& operator=(VTF&&) noexcept = default;
277
278 [[nodiscard]] explicit operator bool() const;
279
280 static bool create(std::span<const std::byte> imageData, ImageFormat format, uint16_t width, uint16_t height, const std::filesystem::path& vtfPath, const CreationOptions& options);
281
282 static bool create(ImageFormat format, uint16_t width, uint16_t height, const std::filesystem::path& vtfPath, const CreationOptions& options);
283
284 [[nodiscard]] static VTF create(std::span<const std::byte> imageData, ImageFormat format, uint16_t width, uint16_t height, const CreationOptions& options);
285
286 [[nodiscard]] static VTF create(ImageFormat format, uint16_t width, uint16_t height, const CreationOptions& options);
287
288 static bool create(const std::filesystem::path& imagePath, const std::filesystem::path& vtfPath, const CreationOptions& options);
289
290 [[nodiscard]] static VTF create(const std::filesystem::path& imagePath, const CreationOptions& options);
291
292 [[nodiscard]] Platform getPlatform() const;
293
294 void setPlatform(Platform newPlatform);
295
296 [[nodiscard]] uint32_t getVersion() const;
297
298 void setVersion(uint32_t newVersion);
299
300 [[nodiscard]] ImageConversion::ResizeMethod getImageWidthResizeMethod() const;
301
302 [[nodiscard]] ImageConversion::ResizeMethod getImageHeightResizeMethod() const;
303
304 void setImageResizeMethods(ImageConversion::ResizeMethod imageWidthResizeMethod_, ImageConversion::ResizeMethod imageHeightResizeMethod_);
305
306 void setImageWidthResizeMethod(ImageConversion::ResizeMethod imageWidthResizeMethod_);
307
308 void setImageHeightResizeMethod(ImageConversion::ResizeMethod imageHeightResizeMethod_);
309
310 [[nodiscard]] uint16_t getWidth(uint8_t mip = 0) const;
311
312 [[nodiscard]] uint16_t getPaddedWidth(uint8_t mip = 0) const;
313
314 [[nodiscard]] uint16_t getHeight(uint8_t mip = 0) const;
315
316 [[nodiscard]] uint16_t getPaddedHeight(uint8_t mip = 0) const;
317
318 void setSize(uint16_t newWidth, uint16_t newHeight, ImageConversion::ResizeFilter filter);
319
320 [[nodiscard]] uint32_t getFlags() const;
321
322 void setFlags(uint32_t flags_);
323
324 void addFlags(uint32_t flags_);
325
326 void removeFlags(uint32_t flags_);
327
328 [[nodiscard]] bool isSRGB() const;
329
330 void setSRGB(bool srgb);
331
333
334 [[nodiscard]] static ImageFormat getDefaultCompressedFormat(ImageFormat inputFormat, uint32_t version, bool isCubeMap);
335
336 [[nodiscard]] ImageFormat getFormat() const;
337
338 void setFormat(ImageFormat newFormat, ImageConversion::ResizeFilter filter = ImageConversion::ResizeFilter::DEFAULT, float quality = ImageConversion::DEFAULT_COMPRESSED_QUALITY);
339
340 [[nodiscard]] uint8_t getMipCount() const;
341
342 bool setMipCount(uint8_t newMipCount);
343
345
346 void computeMips(ImageConversion::ResizeFilter filter = ImageConversion::ResizeFilter::DEFAULT);
347
348 [[nodiscard]] uint16_t getFrameCount() const;
349
350 bool setFrameCount(uint16_t newFrameCount);
351
352 [[nodiscard]] uint8_t getFaceCount() const;
353
354 bool setFaceCount(bool isCubeMap);
355
356 [[nodiscard]] uint16_t getDepth(uint8_t mip = 0) const;
357
358 bool setDepth(uint16_t newDepth);
359
360 bool setFrameFaceAndDepth(uint16_t newFrameCount, bool isCubeMap, uint16_t newDepth = 1);
361
362 [[nodiscard]] uint16_t getStartFrame() const;
363
364 void setStartFrame(uint16_t newStartFrame);
365
366 [[nodiscard]] sourcepp::math::Vec3f getReflectivity() const;
367
368 void setReflectivity(sourcepp::math::Vec3f newReflectivity);
369
370 void computeReflectivity();
371
372 [[nodiscard]] float getBumpMapScale() const;
373
374 void setBumpMapScale(float newBumpMapScale);
375
376 [[nodiscard]] ImageFormat getThumbnailFormat() const;
377
378 [[nodiscard]] uint8_t getThumbnailWidth() const;
379
380 [[nodiscard]] uint8_t getThumbnailHeight() const;
381
382 [[nodiscard]] uint8_t getFallbackWidth() const;
383
384 [[nodiscard]] uint8_t getFallbackHeight() const;
385
386 [[nodiscard]] uint8_t getFallbackMipCount() const;
387
388 [[nodiscard]] const std::vector<Resource>& getResources() const;
389
390 [[nodiscard]] const Resource* getResource(Resource::Type type) const;
391
392 [[nodiscard]] std::vector<std::byte> getPaletteResourceFrame(uint16_t frame = 0) const;
393
395 [[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;
396
398 [[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;
399
401 [[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;
402
403 void setParticleSheetResource(const SHT& value);
404
406
407 void setCRCResource(uint32_t value);
408
409 void removeCRCResource();
410
411 void setLODResource(uint8_t u, uint8_t v, uint8_t u360 = 0, uint8_t v360 = 0);
412
413 void removeLODResource();
414
415 void setExtendedFlagsResource(uint32_t value);
416
418
419 void setKeyValuesDataResource(std::string_view value);
420
422
423 void setHotspotDataResource(const HOT& value);
424
426
427 [[nodiscard]] int16_t getCompressionLevel() const;
428
429 void setCompressionLevel(int16_t newCompressionLevel);
430
431 [[nodiscard]] CompressionMethod getCompressionMethod() const;
432
433 void setCompressionMethod(CompressionMethod newCompressionMethod);
434
435 [[nodiscard]] bool hasImageData() const;
436
437 [[nodiscard]] std::span<const std::byte> getImageDataRaw(uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0, uint16_t slice = 0) const;
438
439 [[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;
440
441 [[nodiscard]] std::vector<std::byte> getImageDataAsRGBA8888(uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0, uint16_t slice = 0) const;
442
443 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, float quality = ImageConversion::DEFAULT_COMPRESSED_QUALITY);
444
445 bool setImage(const std::filesystem::path& imagePath, ImageConversion::ResizeFilter filter = ImageConversion::ResizeFilter::DEFAULT, uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0, uint16_t slice = 0, float quality = ImageConversion::DEFAULT_COMPRESSED_QUALITY);
446
447 [[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;
448
449 bool saveImageToFile(const std::filesystem::path& imagePath, uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0, uint16_t slice = 0, ImageConversion::FileFormat fileFormat = ImageConversion::FileFormat::DEFAULT) const; // NOLINT(*-use-nodiscard)
450
451 [[nodiscard]] bool hasThumbnailData() const;
452
453 [[nodiscard]] std::span<const std::byte> getThumbnailDataRaw() const;
454
455 [[nodiscard]] std::vector<std::byte> getThumbnailDataAs(ImageFormat newFormat) const;
456
457 [[nodiscard]] std::vector<std::byte> getThumbnailDataAsRGBA8888() const;
458
459 void setThumbnail(std::span<const std::byte> imageData_, ImageFormat format_, uint16_t width_, uint16_t height_, float quality = ImageConversion::DEFAULT_COMPRESSED_QUALITY);
460
461 bool setThumbnail(const std::filesystem::path& imagePath, float quality = ImageConversion::DEFAULT_COMPRESSED_QUALITY); // NOLINT(*-use-nodiscard)
462
463 void computeThumbnail(ImageConversion::ResizeFilter filter = ImageConversion::ResizeFilter::DEFAULT, float quality = ImageConversion::DEFAULT_COMPRESSED_QUALITY);
464
465 void removeThumbnail();
466
467 [[nodiscard]] std::vector<std::byte> saveThumbnailToFile(ImageConversion::FileFormat fileFormat = ImageConversion::FileFormat::DEFAULT) const;
468
469 bool saveThumbnailToFile(const std::filesystem::path& imagePath, ImageConversion::FileFormat fileFormat = ImageConversion::FileFormat::DEFAULT) const; // NOLINT(*-use-nodiscard)
470
471 [[nodiscard]] bool hasFallbackData() const;
472
473 [[nodiscard]] std::span<const std::byte> getFallbackDataRaw(uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0) const;
474
475 [[nodiscard]] std::vector<std::byte> getFallbackDataAs(ImageFormat newFormat, uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0) const;
476
477 [[nodiscard]] std::vector<std::byte> getFallbackDataAsRGBA8888(uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0) const;
478
479 void computeFallback(ImageConversion::ResizeFilter filter = ImageConversion::ResizeFilter::DEFAULT);
480
481 void removeFallback();
482
483 [[nodiscard]] std::vector<std::byte> saveFallbackToFile(uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0, ImageConversion::FileFormat fileFormat = ImageConversion::FileFormat::DEFAULT) const;
484
485 bool saveFallbackToFile(const std::filesystem::path& imagePath, uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0, ImageConversion::FileFormat fileFormat = ImageConversion::FileFormat::DEFAULT) const; // NOLINT(*-use-nodiscard)
486
487 [[nodiscard]] uint8_t getConsoleMipScale() const;
488
489 void setConsoleMipScale(uint8_t consoleMipScale_);
490
491 [[nodiscard]] uint64_t estimateBakeSize() const;
492
493 [[nodiscard]] uint64_t estimateBakeSize(bool& isExact) const;
494
495 [[nodiscard]] std::vector<std::byte> bake() const;
496
497 bool bake(const std::filesystem::path& vtfPath) const; // NOLINT(*-use-nodiscard)
498
499protected:
500 static bool createInternal(VTF& writer, CreationOptions options);
501
502 [[nodiscard]] Resource* getResourceInternal(Resource::Type type);
503
504 void setResourceInternal(Resource::Type type, std::span<const std::byte> data_);
505
506 void removeResourceInternal(Resource::Type type);
507
508 void regenerateImageData(ImageFormat newFormat, uint16_t newWidth, uint16_t newHeight, uint8_t newMipCount, uint16_t newFrameCount, uint8_t newFaceCount, uint16_t newDepth, ImageConversion::ResizeFilter filter = ImageConversion::ResizeFilter::DEFAULT, float quality = ImageConversion::DEFAULT_COMPRESSED_QUALITY);
509
510 bool opened = false;
511
512 std::vector<std::byte> data;
513
514 uint32_t version = 4;
515
516 uint16_t width = 0;
517 uint16_t height = 0;
519
520 uint16_t frameCount = 1;
521 uint16_t startFrame = 0;
522
523 sourcepp::math::Vec3f reflectivity{0.2f, 0.2f, 0.2f};
524
525 float bumpMapScale = 0.f;
527 uint8_t mipCount = 1;
528
530 uint8_t thumbnailWidth = 0;
531 uint8_t thumbnailHeight = 0;
532
533 uint8_t fallbackWidth = 0;
534 uint8_t fallbackHeight = 0;
535 uint8_t fallbackMipCount = 0;
536
537 // Number of times to multiply the scale of each mip by 2 when rendering on console
538 uint8_t consoleMipScale = 0;
539
540 // 1 for v7.1 and lower
541 uint16_t depth = 1;
542
543 // Technically added in v7.3, but we use it to store image and thumbnail data in v7.2 and lower anyway
544 std::vector<Resource> resources;
545
546 // These aren't in the header
548 int16_t compressionLevel = 0;
552};
554
555} // namespace vtfpp
#define SOURCEPP_BITFLAGS_ENUM(Enum)
Defines bitwise operators for an enum or enum class.
Definition Macros.h:26
uint16_t width
Definition VTF.h:516
@ PLATFORM_PC
Definition VTF.h:224
@ PLATFORM_X360
Definition VTF.h:226
@ PLATFORM_PS3_PORTAL2
Definition VTF.h:228
@ PLATFORM_PS3_ORANGEBOX
Definition VTF.h:227
@ PLATFORM_UNKNOWN
Definition VTF.h:223
@ PLATFORM_XBOX
Definition VTF.h:225
void setImageHeightResizeMethod(ImageConversion::ResizeMethod imageHeightResizeMethod_)
Definition VTF.cpp:1006
bool setFrameFaceAndDepth(uint16_t newFrameCount, bool isCubeMap, uint16_t newDepth=1)
Definition VTF.cpp:1281
void removeKeyValuesDataResource()
Definition VTF.cpp:1682
void computeFallback(ImageConversion::ResizeFilter filter=ImageConversion::ResizeFilter::DEFAULT)
Definition VTF.cpp:1966
uint8_t getFallbackHeight() const
Definition VTF.cpp:1394
CompressionMethod compressionMethod
Definition VTF.h:549
void computeReflectivity()
Definition VTF.cpp:1305
uint8_t getThumbnailWidth() const
Definition VTF.cpp:1382
std::vector< std::byte > saveThumbnailToFile(ImageConversion::FileFormat fileFormat=ImageConversion::FileFormat::DEFAULT) const
Definition VTF.cpp:1925
uint8_t consoleMipScale
Definition VTF.h:538
uint8_t fallbackWidth
Definition VTF.h:533
ImageFormat getFormat() const
Definition VTF.cpp:1120
void setPlatform(Platform newPlatform)
Definition VTF.cpp:889
uint16_t getHeight(uint8_t mip=0) const
Definition VTF.cpp:1018
VTF & operator=(const VTF &other)
Definition VTF.cpp:717
void removeFallback()
Definition VTF.cpp:1993
uint8_t getFallbackWidth() const
Definition VTF.cpp:1390
int16_t compressionLevel
Definition VTF.h:548
sourcepp::math::Vec3f reflectivity
Definition VTF.h:523
uint16_t getWidth(uint8_t mip=0) const
Definition VTF.cpp:1010
uint16_t startFrame
Definition VTF.h:521
void setThumbnail(std::span< const std::byte > imageData_, ImageFormat format_, uint16_t width_, uint16_t height_, float quality=ImageConversion::DEFAULT_COMPRESSED_QUALITY)
Definition VTF.cpp:1863
uint8_t mipCount
Definition VTF.h:527
bool setRecommendedMipCount()
Definition VTF.cpp:1164
static bool createInternal(VTF &writer, CreationOptions options)
Definition VTF.cpp:760
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
This is a convenience function. You're best off uploading the bounds to the GPU and scaling the UV th...
Definition VTF.cpp:1624
void regenerateImageData(ImageFormat newFormat, uint16_t newWidth, uint16_t newHeight, uint8_t newMipCount, uint16_t newFrameCount, uint8_t newFaceCount, uint16_t newDepth, ImageConversion::ResizeFilter filter=ImageConversion::ResizeFilter::DEFAULT, float quality=ImageConversion::DEFAULT_COMPRESSED_QUALITY)
Definition VTF.cpp:1483
bool hasFallbackData() const
Definition VTF.cpp:1936
void computeMips(ImageConversion::ResizeFilter filter=ImageConversion::ResizeFilter::DEFAULT)
Definition VTF.cpp:1171
void setImageWidthResizeMethod(ImageConversion::ResizeMethod imageWidthResizeMethod_)
Definition VTF.cpp:1002
uint8_t thumbnailWidth
Definition VTF.h:530
VTF(VTF &&) noexcept=default
void setCompressionLevel(int16_t newCompressionLevel)
Definition VTF.cpp:1705
uint8_t fallbackHeight
Definition VTF.h:534
ImageConversion::ResizeMethod imageHeightResizeMethod
Definition VTF.h:551
void setFormat(ImageFormat newFormat, ImageConversion::ResizeFilter filter=ImageConversion::ResizeFilter::DEFAULT, float quality=ImageConversion::DEFAULT_COMPRESSED_QUALITY)
Definition VTF.cpp:1124
void setImageResizeMethods(ImageConversion::ResizeMethod imageWidthResizeMethod_, ImageConversion::ResizeMethod imageHeightResizeMethod_)
Definition VTF.cpp:997
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
This is a convenience function. You're best off uploading the bounds to the GPU and scaling the UV th...
Definition VTF.cpp:1620
float getBumpMapScale() const
Definition VTF.cpp:1370
void setKeyValuesDataResource(std::string_view value)
Definition VTF.cpp:1672
void computeTransparencyFlags()
Definition VTF.cpp:1093
std::vector< std::byte > saveFallbackToFile(uint8_t mip=0, uint16_t frame=0, uint8_t face=0, ImageConversion::FileFormat fileFormat=ImageConversion::FileFormat::DEFAULT) const
Definition VTF.cpp:2000
std::vector< std::byte > data
Definition VTF.h:512
ImageFormat format
Definition VTF.h:526
Platform getPlatform() const
Definition VTF.cpp:885
std::vector< std::byte > getPaletteResourceFrame(uint16_t frame=0) const
Definition VTF.cpp:1571
void addFlags(uint32_t flags_)
Definition VTF.cpp:1065
uint8_t getFaceCount() const
Definition VTF.cpp:1235
ImageFormat thumbnailFormat
Definition VTF.h:529
void setFlags(uint32_t flags_)
Definition VTF.cpp:1061
void setSize(uint16_t newWidth, uint16_t newHeight, ImageConversion::ResizeFilter filter)
Definition VTF.cpp:1026
void removeLODResource()
Definition VTF.cpp:1660
ImageConversion::ResizeMethod getImageHeightResizeMethod() const
Definition VTF.cpp:993
void setBumpMapScale(float newBumpMapScale)
Definition VTF.cpp:1374
ImageFormat getThumbnailFormat() const
Definition VTF.cpp:1378
uint16_t getStartFrame() const
Definition VTF.cpp:1289
static constexpr auto FORMAT_DEFAULT
This value is only valid when passed to VTF::create through CreationOptions or VTF::setFormat.
Definition VTF.h:260
bool hasThumbnailData() const
Definition VTF.cpp:1840
void setReflectivity(sourcepp::math::Vec3f newReflectivity)
Definition VTF.cpp:1301
void setSRGB(bool srgb)
Definition VTF.cpp:1077
const std::vector< Resource > & getResources() const
Definition VTF.cpp:1402
void removeHotspotDataResource()
Definition VTF.cpp:1697
void setVersion(uint32_t newVersion)
Definition VTF.cpp:955
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
Definition VTF.cpp:1829
Resource * getResourceInternal(Resource::Type type)
Definition VTF.cpp:1415
void computeThumbnail(ImageConversion::ResizeFilter filter=ImageConversion::ResizeFilter::DEFAULT, float quality=ImageConversion::DEFAULT_COMPRESSED_QUALITY)
Definition VTF.cpp:1895
std::vector< std::byte > bake() const
Definition VTF.cpp:2120
bool hasImageData() const
Definition VTF.cpp:1723
ImageConversion::ResizeMethod imageWidthResizeMethod
Definition VTF.h:550
std::span< const std::byte > getFallbackDataRaw(uint8_t mip=0, uint16_t frame=0, uint8_t face=0) const
Definition VTF.cpp:1940
uint8_t fallbackMipCount
Definition VTF.h:535
void removeParticleSheetResource()
Definition VTF.cpp:1639
std::vector< std::byte > getFallbackDataAs(ImageFormat newFormat, uint8_t mip=0, uint16_t frame=0, uint8_t face=0) const
Definition VTF.cpp:1949
static bool create(std::span< const std::byte > imageData, ImageFormat format, uint16_t width, uint16_t height, const std::filesystem::path &vtfPath, const CreationOptions &options)
Definition VTF.cpp:815
std::vector< std::byte > getImageDataAsRGBA8888(uint8_t mip=0, uint16_t frame=0, uint8_t face=0, uint16_t slice=0) const
Definition VTF.cpp:1751
uint16_t getFrameCount() const
Definition VTF.cpp:1223
uint8_t getMipCount() const
Definition VTF.cpp:1148
void setLODResource(uint8_t u, uint8_t v, uint8_t u360=0, uint8_t v360=0)
Definition VTF.cpp:1651
void removeResourceInternal(Resource::Type type)
Definition VTF.cpp:1479
std::vector< std::byte > getFallbackDataAsRGBA8888(uint8_t mip=0, uint16_t frame=0, uint8_t face=0) const
Definition VTF.cpp:1962
bool setFrameCount(uint16_t newFrameCount)
Definition VTF.cpp:1227
ImageConversion::ResizeMethod getImageWidthResizeMethod() const
Definition VTF.cpp:989
std::vector< std::byte > getImageDataAs(ImageFormat newFormat, uint8_t mip=0, uint16_t frame=0, uint8_t face=0, uint16_t slice=0) const
Definition VTF.cpp:1736
static ImageFormat getDefaultCompressedFormat(ImageFormat inputFormat, uint32_t version, bool isCubeMap)
Definition VTF.cpp:1107
void setStartFrame(uint16_t newStartFrame)
Definition VTF.cpp:1293
std::vector< std::byte > getThumbnailDataAs(ImageFormat newFormat) const
Definition VTF.cpp:1851
std::span< const std::byte > getImageDataRaw(uint8_t mip=0, uint16_t frame=0, uint8_t face=0, uint16_t slice=0) const
Definition VTF.cpp:1727
uint16_t depth
Definition VTF.h:541
sourcepp::math::Vec3f getReflectivity() const
Definition VTF.cpp:1297
uint8_t getFallbackMipCount() const
Definition VTF.cpp:1398
std::vector< std::byte > getThumbnailDataAsRGBA8888() const
Definition VTF.cpp:1859
uint8_t getConsoleMipScale() const
Definition VTF.cpp:2012
uint16_t getDepth(uint8_t mip=0) const
Definition VTF.cpp:1269
bool isSRGB() const
Definition VTF.cpp:1073
uint32_t flags
Definition VTF.h:518
uint16_t getPaddedHeight(uint8_t mip=0) const
Definition VTF.cpp:1022
void removeThumbnail()
Definition VTF.cpp:1918
static constexpr auto FORMAT_UNCHANGED
This value is only valid when passed to VTF::create through CreationOptions.
Definition VTF.h:257
uint32_t version
Definition VTF.h:514
std::span< const std::byte > getThumbnailDataRaw() const
Definition VTF.cpp:1844
bool setMipCount(uint8_t newMipCount)
Definition VTF.cpp:1152
void setExtendedFlagsResource(uint32_t value)
Definition VTF.cpp:1664
CompressionMethod getCompressionMethod() const
Definition VTF.cpp:1709
uint16_t getPaddedWidth(uint8_t mip=0) const
Definition VTF.cpp:1014
void setCRCResource(uint32_t value)
Definition VTF.cpp:1643
void setCompressionMethod(CompressionMethod newCompressionMethod)
Definition VTF.cpp:1713
bool setFaceCount(bool isCubeMap)
Definition VTF.cpp:1261
uint8_t getThumbnailHeight() const
Definition VTF.cpp:1386
void setConsoleMipScale(uint8_t consoleMipScale_)
Definition VTF.cpp:2016
const Resource * getResource(Resource::Type type) const
Definition VTF.cpp:1406
uint32_t getFlags() const
Definition VTF.cpp:1057
void setParticleSheetResource(const SHT &value)
Definition VTF.cpp:1628
@ FLAG_MASK_XBOX_VTEX
Definition VTF.h:188
@ FLAG_MASK_V5
Definition VTF.h:210
@ FLAG_V1_RENDERTARGET
Definition VTF.h:167
@ FLAG_V1_VTEX_PREMULTIPLY_COLOR_BY_ONE_OVER_MIP_LEVEL
Definition VTF.h:172
@ FLAG_V1_DEPTH_RENDERTARGET
Definition VTF.h:168
@ FLAG_MASK_V2_VTEX
Definition VTF.h:182
@ FLAG_V5_DEFAULT_POOL
Definition VTF.h:208
@ FLAG_V0_ONE_BIT_ALPHA
Definition VTF.h:161
@ FLAG_MASK_V4_TF2
Definition VTF.h:204
@ FLAG_V4_TF2_IGNORE_PICMIP
Definition VTF.h:201
@ FLAG_V5_CSGO_COMBINED
Definition VTF.h:212
@ FLAG_V2_NO_DEPTH_BUFFER
Definition VTF.h:178
@ FLAG_V0_MULTI_BIT_ALPHA
Definition VTF.h:162
@ FLAG_V5_CSGO_YCOCG
Definition VTF.h:215
@ FLAG_MASK_V2
Definition VTF.h:181
@ FLAG_V2_VTEX_NICE_FILTERED
Definition VTF.h:179
@ FLAG_V5_CSGO_SKIP_INITIAL_DOWNLOAD
Definition VTF.h:214
@ FLAG_MASK_V5_CSGO
Definition VTF.h:217
@ FLAG_V0_VTEX_NO_COMPRESS
Definition VTF.h:155
@ FLAG_V2_CLAMP_U
Definition VTF.h:180
@ FLAG_V0_NO_LOD
Definition VTF.h:158
@ FLAG_V0_VTEX_HINT_DXT5
Definition VTF.h:154
@ FLAG_V3_VERTEX_TEXTURE
Definition VTF.h:191
@ FLAG_V4_SRGB
Definition VTF.h:196
@ FLAG_V0_NORMAL
Definition VTF.h:156
@ FLAG_V0_NO_MIP
Definition VTF.h:157
@ FLAG_V1_VTEX_ONE_OVER_MIP_LEVEL_IN_ALPHA
Definition VTF.h:171
@ FLAG_V2_VTEX_ALPHA_TEST_MIP_GENERATION
Definition VTF.h:177
@ FLAG_V5_SRGB
Definition VTF.h:207
@ FLAG_MASK_XBOX
Definition VTF.h:187
@ FLAG_V0_CLAMP_T
Definition VTF.h:152
@ FLAG_V3_LOAD_ALL_MIPS
Definition VTF.h:190
@ FLAG_XBOX_VTEX_PRESWIZZLED
Definition VTF.h:184
@ FLAG_V0_PROCEDURAL
Definition VTF.h:160
@ FLAG_V4_TF2_STREAMABLE_FINE
Definition VTF.h:203
@ FLAG_V5_CSGO_ASYNC_SKIP_INITIAL_LOW_RES
Definition VTF.h:216
@ FLAG_V5_CSGO_ASYNC_DOWNLOAD
Definition VTF.h:213
@ FLAG_V0_POINT_SAMPLE
Definition VTF.h:149
@ FLAG_V1_SINGLE_COPY
Definition VTF.h:170
@ FLAG_MASK_V0_VTEX
Definition VTF.h:165
@ FLAG_V3_BORDER
Definition VTF.h:193
@ FLAG_V5_LOAD_MOST_MIPS
Definition VTF.h:209
@ FLAG_V0_TRILINEAR
Definition VTF.h:150
@ FLAG_V5_PWL_CORRECTED
Definition VTF.h:206
@ FLAG_V0_ANISOTROPIC
Definition VTF.h:153
@ FLAG_MASK_V4
Definition VTF.h:197
@ FLAG_XBOX_CACHEABLE
Definition VTF.h:185
@ FLAG_MASK_V3
Definition VTF.h:194
@ FLAG_V1_VTEX_CONVERT_NORMAL_TO_DUDV
Definition VTF.h:173
@ FLAG_V0_ENVMAP
Definition VTF.h:163
@ FLAG_V0_CLAMP_S
Definition VTF.h:151
@ FLAG_MASK_V1
Definition VTF.h:174
@ FLAG_V0_LOAD_SMALL_MIPS
Definition VTF.h:159
@ FLAG_MASK_INTERNAL
Definition VTF.h:219
@ FLAG_V3_SSBUMP
Definition VTF.h:192
@ FLAG_V4_TF2_IMMEDIATE_CLEANUP
Definition VTF.h:200
@ FLAG_V4_TF2_STREAMABLE_COARSE
Definition VTF.h:202
@ FLAG_XBOX_UNFILTERABLE_OK
Definition VTF.h:186
@ FLAG_V4_TF2_STAGING_MEMORY
Definition VTF.h:199
@ FLAG_MASK_V0
Definition VTF.h:164
@ FLAG_V1_NO_DEBUG_OVERRIDE
Definition VTF.h:169
@ FLAG_MASK_V1_VTEX
Definition VTF.h:175
uint16_t height
Definition VTF.h:517
void removeCRCResource()
Definition VTF.cpp:1647
uint16_t frameCount
Definition VTF.h:520
uint32_t getVersion() const
Definition VTF.cpp:951
int16_t getCompressionLevel() const
Definition VTF.cpp:1701
void setHotspotDataResource(const HOT &value)
Definition VTF.cpp:1686
void removeFlags(uint32_t flags_)
Definition VTF.cpp:1069
void setResourceInternal(Resource::Type type, std::span< const std::byte > data_)
Definition VTF.cpp:1424
bool setDepth(uint16_t newDepth)
Definition VTF.cpp:1273
uint64_t estimateBakeSize() const
Definition VTF.cpp:2020
std::vector< Resource > resources
Definition VTF.h:544
uint8_t thumbnailHeight
Definition VTF.h:531
Platform platform
Definition VTF.h:547
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, float quality=ImageConversion::DEFAULT_COMPRESSED_QUALITY)
Definition VTF.cpp:1755
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
This is a convenience function. You're best off uploading the bounds to the GPU and scaling the UV th...
Definition VTF.cpp:1578
void removeExtendedFlagsResource()
Definition VTF.cpp:1668
bool opened
Definition VTF.h:510
float bumpMapScale
Definition VTF.h:525
consteval uint32_t makeFourCC(const char fourCC[4])
Creates a FourCC identifier from a string of 4 characters.
Definition Binary.h:20
constexpr float DEFAULT_COMPRESSED_QUALITY
Definition HOT.h:11
constexpr uint32_t VTF_SIGNATURE
Definition VTF.h:23
constexpr uint32_t XTF_SIGNATURE
Definition VTF.h:24
constexpr uint32_t VTFX_SIGNATURE
Definition VTF.h:25
constexpr uint32_t VTF3_SIGNATURE
Definition VTF.h:26
CompressionMethod
Definition VTF.h:28
SHT getDataAsParticleSheet() const
Definition VTF.h:80
CompressionMethod getDataAsAuxCompressionMethod() const
Definition VTF.h:111
uint32_t getDataAsAuxCompressionLength(uint8_t mip, uint8_t mipCount, uint16_t frame, uint16_t frameCount, uint16_t face, uint16_t faceCount) const
Definition VTF.h:122
Type type
Definition VTF.h:58
ConvertedData convertData() const
Definition VTF.cpp:238
std::variant< std::monostate, SHT, uint32_t, std::tuple< uint8_t, uint8_t, uint8_t, uint8_t >, std::string, HOT > ConvertedData
Definition VTF.h:62
std::tuple< uint8_t, uint8_t, uint8_t, uint8_t > getDataAsLODControlInfo() const
Definition VTF.h:92
std::string getDataAsKeyValuesData() const
Definition VTF.h:96
uint32_t getDataAsCRC() const
Definition VTF.h:84
uint32_t getDataAsExtendedFlags() const
Definition VTF.h:88
@ FLAG_LOCAL_DATA
Definition VTF.h:55
std::vector< std::byte > getDataAsPalette(uint16_t frame) const
Definition VTF.h:72
int16_t getDataAsAuxCompressionLevel() const
Definition VTF.h:104
HOT getDataAsHotspotData() const
Definition VTF.h:100
@ TYPE_KEYVALUES_DATA
Definition VTF.h:50
@ TYPE_FALLBACK_DATA
Definition VTF.h:42
@ TYPE_PALETTE_DATA
Definition VTF.h:41
@ TYPE_PARTICLE_SHEET_DATA
Definition VTF.h:43
@ TYPE_EXTENDED_FLAGS
Definition VTF.h:46
@ TYPE_UNKNOWN
Definition VTF.h:39
@ TYPE_IMAGE_DATA
Definition VTF.h:45
@ TYPE_AUX_COMPRESSION
Definition VTF.h:48
@ TYPE_LOD_CONTROL_INFO
Definition VTF.h:49
@ TYPE_THUMBNAIL_DATA
Definition VTF.h:40
@ TYPE_HOTSPOT_DATA
Definition VTF.h:44
Flags flags
Definition VTF.h:59
std::span< std::byte > data
Definition VTF.h:60
uint16_t initialFrameCount
Definition VTF.h:239
ImageConversion::ResizeFilter filter
Definition VTF.h:237
ImageConversion::ResizeMethod heightResizeMethod
Definition VTF.h:236
CompressionMethod compressionMethod
Definition VTF.h:249
ImageConversion::ResizeMethod widthResizeMethod
Definition VTF.h:235
ImageFormat outputFormat
Definition VTF.h:233