50 static consteval std::array<Type, 11>
getOrder() {
82 std::tuple<uint8_t, uint8_t, uint8_t, uint8_t>,
90 if (this->data.size() % PALETTE_FRAME_SIZE != 0 || PALETTE_FRAME_SIZE * frame > this->data.size()) {
93 return {this->data.data() + PALETTE_FRAME_SIZE * frame, this->data.data() + PALETTE_FRAME_SIZE * (frame + 1)};
109 return std::get<std::tuple<uint8_t, uint8_t, uint8_t, uint8_t>>(this->
convertData());
121 if (this->data.size() <
sizeof(uint32_t) * 2) {
124 return static_cast<int16_t
>(BufferStream{this->data}.skip<uint32_t>().read<uint32_t>() & 0xffff);
128 if (this->data.size() <
sizeof(uint32_t) * 2) {
131 const auto method =
static_cast<int16_t
>((BufferStream{this->data}.skip<uint32_t>().read<uint32_t>() & 0xffff0000) >> 16);
138 [[nodiscard]] uint32_t
getDataAsAuxCompressionLength(uint8_t mip, uint8_t mipCount, uint16_t frame, uint16_t frameCount, uint16_t face, uint16_t faceCount)
const {
139 if (this->data.size() < ((mipCount - 1 - mip) * frameCount * faceCount + frame * faceCount + face + 2) *
sizeof(uint32_t)) {
142 return BufferStream{this->data}.skip<uint32_t>((mipCount - 1 - mip) * frameCount * faceCount + frame * faceCount + face + 2).read<uint32_t>();
165 FLAG_V0_POINT_SAMPLE = 1u << 0,
166 FLAG_V0_TRILINEAR = 1u << 1,
167 FLAG_V0_CLAMP_S = 1u << 2,
168 FLAG_V0_CLAMP_T = 1u << 3,
169 FLAG_V0_ANISOTROPIC = 1u << 4,
170 FLAG_V0_VTEX_HINT_DXT5 = 1u << 5,
171 FLAG_V0_VTEX_NO_COMPRESS = 1u << 6,
172 FLAG_V0_NORMAL = 1u << 7,
173 FLAG_V0_NO_MIP = 1u << 8,
174 FLAG_V0_NO_LOD = 1u << 9,
175 FLAG_V0_LOAD_SMALL_MIPS = 1u << 10,
176 FLAG_V0_PROCEDURAL = 1u << 11,
177 FLAG_V0_ONE_BIT_ALPHA = 1u << 12,
178 FLAG_V0_MULTI_BIT_ALPHA = 1u << 13,
179 FLAG_V0_ENVMAP = 1u << 14,
180 FLAG_MASK_V0 = FLAG_V0_POINT_SAMPLE | FLAG_V0_TRILINEAR | FLAG_V0_CLAMP_S | FLAG_V0_CLAMP_T | FLAG_V0_ANISOTROPIC | FLAG_V0_VTEX_HINT_DXT5 | FLAG_V0_VTEX_NO_COMPRESS | FLAG_V0_NORMAL | FLAG_V0_NO_MIP | FLAG_V0_NO_LOD | FLAG_V0_LOAD_SMALL_MIPS | FLAG_V0_PROCEDURAL | FLAG_V0_ONE_BIT_ALPHA | FLAG_V0_MULTI_BIT_ALPHA | FLAG_V0_ENVMAP,
181 FLAG_MASK_V0_VTEX = FLAG_V0_VTEX_HINT_DXT5 | FLAG_V0_VTEX_NO_COMPRESS,
183 FLAG_V1_RENDERTARGET = 1u << 15,
184 FLAG_V1_DEPTH_RENDERTARGET = 1u << 16,
185 FLAG_V1_NO_DEBUG_OVERRIDE = 1u << 17,
186 FLAG_V1_SINGLE_COPY = 1u << 18,
187 FLAG_V1_VTEX_ONE_OVER_MIP_LEVEL_IN_ALPHA = 1u << 19,
188 FLAG_V1_VTEX_PREMULTIPLY_COLOR_BY_ONE_OVER_MIP_LEVEL = 1u << 20,
189 FLAG_V1_VTEX_CONVERT_NORMAL_TO_DUDV = 1u << 21,
190 FLAG_MASK_V1 = FLAG_V1_RENDERTARGET | FLAG_V1_DEPTH_RENDERTARGET | FLAG_V1_NO_DEBUG_OVERRIDE | FLAG_V1_SINGLE_COPY | FLAG_V1_VTEX_ONE_OVER_MIP_LEVEL_IN_ALPHA | FLAG_V1_VTEX_PREMULTIPLY_COLOR_BY_ONE_OVER_MIP_LEVEL | FLAG_V1_VTEX_CONVERT_NORMAL_TO_DUDV,
191 FLAG_MASK_V1_VTEX = FLAG_V1_VTEX_ONE_OVER_MIP_LEVEL_IN_ALPHA | FLAG_V1_VTEX_PREMULTIPLY_COLOR_BY_ONE_OVER_MIP_LEVEL | FLAG_V1_VTEX_CONVERT_NORMAL_TO_DUDV,
193 FLAG_V2_VTEX_ALPHA_TEST_MIP_GENERATION = 1u << 22,
194 FLAG_V2_NO_DEPTH_BUFFER = 1u << 23,
195 FLAG_V2_VTEX_NICE_FILTERED = 1u << 24,
196 FLAG_V2_CLAMP_U = 1u << 25,
197 FLAG_MASK_V2 = FLAG_V2_VTEX_ALPHA_TEST_MIP_GENERATION | FLAG_V2_NO_DEPTH_BUFFER | FLAG_V2_VTEX_NICE_FILTERED | FLAG_V2_CLAMP_U,
198 FLAG_MASK_V2_VTEX = FLAG_V2_VTEX_ALPHA_TEST_MIP_GENERATION | FLAG_V2_VTEX_NICE_FILTERED,
200 FLAG_XBOX_VTEX_PRESWIZZLED = 1u << 26,
201 FLAG_XBOX_CACHEABLE = 1u << 27,
202 FLAG_XBOX_UNFILTERABLE_OK = 1u << 28,
203 FLAG_MASK_XBOX = FLAG_XBOX_VTEX_PRESWIZZLED | FLAG_XBOX_CACHEABLE | FLAG_XBOX_UNFILTERABLE_OK,
204 FLAG_MASK_XBOX_VTEX = FLAG_XBOX_VTEX_PRESWIZZLED,
206 FLAG_V3_LOAD_ALL_MIPS = 1u << 10,
207 FLAG_V3_VERTEX_TEXTURE = 1u << 26,
208 FLAG_V3_SSBUMP = 1u << 27,
209 FLAG_V3_BORDER = 1u << 29,
210 FLAG_MASK_V3 = FLAG_V3_LOAD_ALL_MIPS | FLAG_V3_VERTEX_TEXTURE | FLAG_V3_SSBUMP | FLAG_V3_BORDER,
212 FLAG_V4_SRGB = 1u << 6,
213 FLAG_MASK_V4 = FLAG_V4_SRGB,
215 FLAG_V4_TF2_STAGING_MEMORY = 1u << 19,
216 FLAG_V4_TF2_IMMEDIATE_CLEANUP = 1u << 20,
217 FLAG_V4_TF2_IGNORE_PICMIP = 1u << 21,
218 FLAG_V4_TF2_STREAMABLE_COARSE = 1u << 30,
219 FLAG_V4_TF2_STREAMABLE_FINE = 1u << 31,
220 FLAG_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,
222 FLAG_V5_PWL_CORRECTED = 1u << 6,
223 FLAG_V5_SRGB = 1u << 19,
224 FLAG_V5_DEFAULT_POOL = 1u << 20,
225 FLAG_V5_LOAD_MOST_MIPS = 1u << 28,
226 FLAG_MASK_V5 = FLAG_V5_PWL_CORRECTED | FLAG_V5_SRGB | FLAG_V5_DEFAULT_POOL | FLAG_V5_LOAD_MOST_MIPS,
228 FLAG_V5_CSGO_COMBINED = 1u << 21,
229 FLAG_V5_CSGO_ASYNC_DOWNLOAD = 1u << 22,
230 FLAG_V5_CSGO_SKIP_INITIAL_DOWNLOAD = 1u << 24,
231 FLAG_V5_CSGO_YCOCG = 1u << 30,
232 FLAG_V5_CSGO_ASYNC_SKIP_INITIAL_LOW_RES = 1u << 31,
233 FLAG_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,
235 FLAG_MASK_INTERNAL = FLAG_V0_NO_MIP | FLAG_V0_ENVMAP,
239 PLATFORM_UNKNOWN = 0x000,
241 PLATFORM_XBOX = 0x005,
242 PLATFORM_X360 = 0x360,
243 PLATFORM_PS3_ORANGEBOX = 0x333,
244 PLATFORM_PS3_PORTAL2 = 0x334,
248 uint32_t version = 4;
250 float compressedFormatQuality = ImageConversion::DEFAULT_COMPRESSED_QUALITY;
255 uint16_t initialFrameCount = 1;
256 uint16_t startFrame = 0;
257 bool isCubeMap =
false;
258 uint16_t initialDepth = 1;
259 bool computeTransparencyFlags =
true;
260 bool computeMips =
true;
261 bool computeThumbnail =
true;
262 bool computeReflectivity =
true;
264 int16_t compressionLevel = -1;
266 float bumpMapScale = 1.f;
267 float gammaCorrection = 1.f;
268 bool invertGreenChannel =
false;
269 uint8_t consoleMipScale = 0;
273 static constexpr auto FORMAT_UNCHANGED =
static_cast<ImageFormat>(-2);
276 static constexpr auto FORMAT_DEFAULT =
static_cast<ImageFormat>(-1);
280 explicit VTF(std::vector<std::byte>&& vtfData,
bool parseHeaderOnly =
false);
282 explicit VTF(std::span<const std::byte> vtfData,
bool parseHeaderOnly =
false);
284 explicit VTF(
const std::string& vtfPath,
bool parseHeaderOnly =
false);
288 VTF& operator=(
const VTF& other);
292 VTF& operator=(
VTF&&) noexcept = default;
294 [[nodiscard]] explicit operator
bool() const;
296 static
bool create(std::span<const std::
byte> imageData,
ImageFormat format, uint16_t width, uint16_t height, const std::
string& vtfPath, const
CreationOptions& options);
298 static
bool create(
ImageFormat format, uint16_t width, uint16_t height, const std::
string& vtfPath, const
CreationOptions& options);
300 [[nodiscard]] static
VTF create(std::span<const std::
byte> imageData,
ImageFormat format, uint16_t width, uint16_t height, const
CreationOptions& options);
304 static
bool create(const std::
string& imagePath, const std::
string& vtfPath, const
CreationOptions& options);
306 [[nodiscard]] static
VTF create(const std::
string& imagePath, const
CreationOptions& options);
308 [[nodiscard]]
Platform getPlatform() const;
310 void setPlatform(
Platform newPlatform);
312 [[nodiscard]] uint32_t getVersion() const;
314 void setVersion(uint32_t newVersion);
316 [[nodiscard]] ImageConversion::ResizeMethod getImageWidthResizeMethod() const;
318 [[nodiscard]] ImageConversion::ResizeMethod getImageHeightResizeMethod() const;
320 void setImageResizeMethods(ImageConversion::ResizeMethod imageWidthResizeMethod_, ImageConversion::ResizeMethod imageHeightResizeMethod_);
322 void setImageWidthResizeMethod(ImageConversion::ResizeMethod imageWidthResizeMethod_);
324 void setImageHeightResizeMethod(ImageConversion::ResizeMethod imageHeightResizeMethod_);
326 [[nodiscard]] uint16_t getWidth(uint8_t mip = 0) const;
328 [[nodiscard]] uint16_t getHeight(uint8_t mip = 0) const;
330 void setSize(uint16_t newWidth, uint16_t newHeight, ImageConversion::ResizeFilter filter);
332 [[nodiscard]] uint32_t getFlags() const;
334 void setFlags(uint32_t flags_);
336 void addFlags(uint32_t flags_);
338 void removeFlags(uint32_t flags_);
340 [[nodiscard]]
bool isSRGB() const;
342 void setSRGB(
bool srgb);
344 void computeTransparencyFlags();
346 [[nodiscard]] static
ImageFormat getDefaultCompressedFormat(
ImageFormat inputFormat, uint32_t version,
bool isCubeMap);
350 void setFormat(
ImageFormat newFormat, ImageConversion::ResizeFilter filter = ImageConversion::ResizeFilter::DEFAULT,
float quality = ImageConversion::DEFAULT_COMPRESSED_QUALITY);
352 [[nodiscard]] uint8_t getMipCount() const;
354 bool setMipCount(uint8_t newMipCount);
356 bool setRecommendedMipCount();
358 void computeMips(ImageConversion::ResizeFilter filter = ImageConversion::ResizeFilter::DEFAULT);
360 [[nodiscard]] uint16_t getFrameCount() const;
362 bool setFrameCount(uint16_t newFrameCount);
364 [[nodiscard]] uint8_t getFaceCount() const;
366 bool setFaceCount(
bool isCubeMap);
368 [[nodiscard]] uint16_t getDepth() const;
370 bool setDepth(uint16_t newDepth);
372 bool setFrameFaceAndDepth(uint16_t newFrameCount,
bool isCubeMap, uint16_t newDepth = 1);
374 [[nodiscard]] uint16_t getStartFrame() const;
376 void setStartFrame(uint16_t newStartFrame);
378 [[nodiscard]]
sourcepp::math::Vec3f getReflectivity() const;
380 void setReflectivity(
sourcepp::math::Vec3f newReflectivity);
382 void computeReflectivity();
384 [[nodiscard]]
float getBumpMapScale() const;
386 void setBumpMapScale(
float newBumpMapScale);
388 [[nodiscard]]
ImageFormat getThumbnailFormat() const;
390 [[nodiscard]] uint8_t getThumbnailWidth() const;
392 [[nodiscard]] uint8_t getThumbnailHeight() const;
394 [[nodiscard]] uint8_t getFallbackWidth() const;
396 [[nodiscard]] uint8_t getFallbackHeight() const;
398 [[nodiscard]] uint8_t getFallbackMipCount() const;
400 [[nodiscard]] const std::vector<
Resource>& getResources() const;
404 [[nodiscard]] std::vector<std::
byte> getPaletteResourceFrame(uint16_t frame = 0) const;
407 [[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;
410 [[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;
413 [[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;
415 void setParticleSheetResource(const
SHT& value);
417 void removeParticleSheetResource();
419 void setCRCResource(uint32_t value);
421 void removeCRCResource();
423 void setLODResource(uint8_t u, uint8_t v, uint8_t u360 = 0, uint8_t v360 = 0);
425 void removeLODResource();
427 void setExtendedFlagsResource(uint32_t value);
429 void removeExtendedFlagsResource();
431 void setKeyValuesDataResource(const std::
string& value);
433 void removeKeyValuesDataResource();
435 void setHotspotDataResource(const
HOT& value);
437 void removeHotspotDataResource();
439 [[nodiscard]] int16_t getCompressionLevel() const;
441 void setCompressionLevel(int16_t newCompressionLevel);
447 [[nodiscard]]
bool hasImageData() const;
449 [[nodiscard]] std::span<const std::
byte> getImageDataRaw(uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0, uint16_t slice = 0) const;
451 [[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;
453 [[nodiscard]] std::vector<std::
byte> getImageDataAsRGBA8888(uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0, uint16_t slice = 0) const;
455 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);
457 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,
float quality = ImageConversion::DEFAULT_COMPRESSED_QUALITY);
459 [[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;
461 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;
463 [[nodiscard]]
bool hasThumbnailData() const;
465 [[nodiscard]] std::span<const std::
byte> getThumbnailDataRaw() const;
467 [[nodiscard]] std::vector<std::
byte> getThumbnailDataAs(
ImageFormat newFormat) const;
469 [[nodiscard]] std::vector<std::
byte> getThumbnailDataAsRGBA8888() const;
471 void setThumbnail(std::span<const std::
byte> imageData_,
ImageFormat format_, uint16_t width_, uint16_t height_,
float quality = ImageConversion::DEFAULT_COMPRESSED_QUALITY);
473 bool setThumbnail(const std::
string& imagePath,
float quality = ImageConversion::DEFAULT_COMPRESSED_QUALITY);
475 void computeThumbnail(ImageConversion::ResizeFilter filter = ImageConversion::ResizeFilter::DEFAULT,
float quality = ImageConversion::DEFAULT_COMPRESSED_QUALITY);
477 void removeThumbnail();
479 [[nodiscard]] std::vector<std::
byte> saveThumbnailToFile(ImageConversion::FileFormat fileFormat = ImageConversion::FileFormat::DEFAULT) const;
481 bool saveThumbnailToFile(const std::
string& imagePath, ImageConversion::FileFormat fileFormat = ImageConversion::FileFormat::DEFAULT) const;
483 [[nodiscard]]
bool hasFallbackData() const;
485 [[nodiscard]] std::span<const std::
byte> getFallbackDataRaw(uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0) const;
487 [[nodiscard]] std::vector<std::
byte> getFallbackDataAs(
ImageFormat newFormat, uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0) const;
489 [[nodiscard]] std::vector<std::
byte> getFallbackDataAsRGBA8888(uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0) const;
491 void computeFallback(ImageConversion::ResizeFilter filter = ImageConversion::ResizeFilter::DEFAULT);
493 void removeFallback();
495 [[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;
497 bool saveFallbackToFile(const std::
string& imagePath, uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0, ImageConversion::FileFormat fileFormat = ImageConversion::FileFormat::DEFAULT) const;
499 [[nodiscard]] uint8_t getConsoleMipScale() const;
501 void setConsoleMipScale(uint8_t consoleMipScale_);
503 [[nodiscard]] uint64_t estimateBakeSize() const;
505 [[nodiscard]] uint64_t estimateBakeSize(
bool& isExact) const;
507 [[nodiscard]] std::vector<std::
byte> bake() const;
509 bool bake(const std::
string& vtfPath) const;
516 void setResourceInternal(
Resource::Type type, std::span<const std::
byte> data_);
518 void removeResourceInternal(
Resource::Type type);
520 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);
524 std::vector<std::
byte> data;
526 uint32_t version = 4;
530 uint32_t flags = FLAG_V0_NO_MIP | FLAG_V0_NO_LOD;
532 uint16_t frameCount = 1;
533 uint16_t startFrame = 0;
535 sourcepp::math::Vec3f reflectivity{0.2f, 0.2f, 0.2f};
537 float bumpMapScale = 0.f;
539 uint8_t mipCount = 1;
542 uint8_t thumbnailWidth = 0;
543 uint8_t thumbnailHeight = 0;
545 uint8_t fallbackWidth = 0;
546 uint8_t fallbackHeight = 0;
547 uint8_t fallbackMipCount = 0;
550 uint8_t consoleMipScale = 0;
560 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 XTF_SIGNATURE
constexpr uint32_t VTFX_SIGNATURE
constexpr uint32_t VTF3_SIGNATURE
std::variant< std::monostate, SHT, uint32_t, std::tuple< uint8_t, uint8_t, uint8_t, uint8_t >, std::string, HOT > ConvertedData
SHT getDataAsParticleSheet() const
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
static consteval std::array< Type, 11 > getOrder()
std::tuple< uint8_t, uint8_t, uint8_t, uint8_t > getDataAsLODControlInfo() const
std::string getDataAsKeyValuesData() const
uint32_t getDataAsCRC() const
uint32_t getDataAsExtendedFlags() const
std::vector< std::byte > getDataAsPalette(uint16_t frame) const
int16_t getDataAsAuxCompressionLevel() const
HOT getDataAsHotspotData() const
@ TYPE_PARTICLE_SHEET_DATA
std::span< std::byte > data