45 static const std::array<Type, 8>&
getOrder();
60 std::tuple<uint8_t, uint8_t, uint8_t, uint8_t>,
79 return std::get<std::tuple<uint8_t, uint8_t, uint8_t, uint8_t>>(this->
convertData());
87 return static_cast<int16_t
>(std::get<std::span<uint32_t>>(this->
convertData())[1] & 0xffff);
91 auto method =
static_cast<int16_t
>((std::get<std::span<uint32_t>>(this->
convertData())[1] & 0xffff0000) >> 16);
98 [[nodiscard]] uint32_t
getDataAsAuxCompressionLength(uint8_t mip, uint8_t mipCount, uint16_t frame, uint16_t frameCount, uint16_t face, uint16_t faceCount)
const {
99 return std::get<std::span<uint32_t>>(this->
convertData())[((mipCount - 1 - mip) * frameCount * faceCount + frame * faceCount + face) + 2];
130 FLAG_POINT_SAMPLE = 1 << 0,
131 FLAG_TRILINEAR = 1 << 1,
132 FLAG_CLAMP_S = 1 << 2,
133 FLAG_CLAMP_T = 1 << 3,
134 FLAG_ANISOTROPIC = 1 << 4,
135 FLAG_HINT_DXT5 = 1 << 5,
136 FLAG_PWL_CORRECTED = 1 << 6,
137 FLAG_NORMAL = 1 << 7,
138 FLAG_NO_MIP = 1 << 8,
139 FLAG_NO_LOD = 1 << 9,
140 FLAG_LOAD_ALL_MIPS = 1 << 10,
141 FLAG_PROCEDURAL = 1 << 11,
142 FLAG_ONE_BIT_ALPHA = 1 << 12,
143 FLAG_MULTI_BIT_ALPHA = 1 << 13,
144 FLAG_ENVMAP = 1 << 14,
145 FLAG_RENDERTARGET = 1 << 15,
146 FLAG_DEPTH_RENDERTARGET = 1 << 16,
147 FLAG_NO_DEBUG_OVERRIDE = 1 << 17,
148 FLAG_SINGLE_COPY = 1 << 18,
150 FLAG_DEFAULT_POOL = 1 << 20,
151 FLAG_COMBINED = 1 << 21,
152 FLAG_ASYNC_DOWNLOAD = 1 << 22,
153 FLAG_NO_DEPTH_BUFFER = 1 << 23,
154 FLAG_SKIP_INITIAL_DOWNLOAD = 1 << 24,
155 FLAG_CLAMP_U = 1 << 25,
156 FLAG_VERTEX_TEXTURE = 1 << 26,
157 FLAG_XBOX_PRESWIZZLED = 1 << 26,
158 FLAG_SSBUMP = 1 << 27,
159 FLAG_XBOX_CACHEABLE = 1 << 27,
160 FLAG_LOAD_MOST_MIPS = 1 << 28,
161 FLAG_BORDER = 1 << 29,
162 FLAG_YCOCG = 1 << 30,
163 FLAG_ASYNC_SKIP_INITIAL_LOW_RES = 1 << 31,
165 static constexpr std::underlying_type_t<Flags> FLAG_MASK_AFTER_V7_3 = FLAG_LOAD_ALL_MIPS | FLAG_SRGB | FLAG_DEFAULT_POOL | FLAG_COMBINED | FLAG_ASYNC_DOWNLOAD | FLAG_SKIP_INITIAL_DOWNLOAD | FLAG_LOAD_MOST_MIPS | FLAG_YCOCG | FLAG_ASYNC_SKIP_INITIAL_LOW_RES;
166 static constexpr std::underlying_type_t<Flags> FLAG_MASK_INTERNAL = FLAG_NO_MIP | FLAG_ENVMAP;
167 static constexpr std::underlying_type_t<Flags> FLAG_MASK_SRGB = FLAG_PWL_CORRECTED | FLAG_SRGB;
170 PLATFORM_UNKNOWN = 0x000,
172 PLATFORM_PS3_PORTAL2 = 0x003,
173 PLATFORM_PS3_ORANGEBOX = 0x333,
174 PLATFORM_X360 = 0x360,
178 uint32_t majorVersion = 7;
179 uint32_t minorVersion = 4;
185 uint16_t initialFrameCount = 1;
186 uint16_t startFrame = 0;
187 bool isCubeMap =
false;
188 uint16_t initialSliceCount = 1;
189 bool computeTransparencyFlags =
true;
190 bool computeMips =
true;
191 bool computeThumbnail =
true;
192 bool computeReflectivity =
true;
194 int16_t compressionLevel = -1;
196 float bumpMapScale = 1.f;
197 float gammaCorrection = 1.f;
198 bool invertGreenChannel =
false;
202 static constexpr auto FORMAT_UNCHANGED =
static_cast<ImageFormat>(-2);
205 static constexpr auto FORMAT_DEFAULT =
static_cast<ImageFormat>(-1);
209 explicit VTF(std::vector<std::byte>&& vtfData,
bool parseHeaderOnly =
false);
211 explicit VTF(std::span<const std::byte> vtfData,
bool parseHeaderOnly =
false);
213 explicit VTF(
const std::string& vtfPath,
bool parseHeaderOnly =
false);
217 VTF& operator=(
const VTF& other);
221 VTF& operator=(
VTF&&) noexcept = default;
223 [[nodiscard]] explicit operator
bool() const;
225 static
bool create(std::span<const std::
byte> imageData,
ImageFormat format, uint16_t width, uint16_t height, const std::
string& vtfPath,
CreationOptions options);
229 [[nodiscard]] static
VTF create(std::span<const std::
byte> imageData,
ImageFormat format, uint16_t width, uint16_t height,
CreationOptions options);
233 static
bool create(const std::
string& imagePath, const std::
string& vtfPath,
CreationOptions options);
235 [[nodiscard]] static
VTF create(const std::
string& imagePath,
CreationOptions options);
237 [[nodiscard]]
Platform getPlatform() const;
239 void setPlatform(
Platform newPlatform);
241 [[nodiscard]] uint32_t getMajorVersion() const;
243 [[nodiscard]] uint32_t getMinorVersion() const;
245 void setVersion(uint32_t newMajorVersion, uint32_t newMinorVersion);
247 void setMajorVersion(uint32_t newMajorVersion);
249 void setMinorVersion(uint32_t newMinorVersion);
251 [[nodiscard]] ImageConversion::ResizeMethod getImageWidthResizeMethod() const;
253 [[nodiscard]] ImageConversion::ResizeMethod getImageHeightResizeMethod() const;
255 void setImageResizeMethods(ImageConversion::ResizeMethod imageWidthResizeMethod_, ImageConversion::ResizeMethod imageHeightResizeMethod_);
257 void setImageWidthResizeMethod(ImageConversion::ResizeMethod imageWidthResizeMethod_);
259 void setImageHeightResizeMethod(ImageConversion::ResizeMethod imageHeightResizeMethod_);
261 [[nodiscard]] uint16_t getWidth(uint8_t mip = 0) const;
263 [[nodiscard]] uint16_t getHeight(uint8_t mip = 0) const;
265 void setSize(uint16_t newWidth, uint16_t newHeight, ImageConversion::ResizeFilter filter);
267 [[nodiscard]]
Flags getFlags() const;
269 void setFlags(
Flags flags_);
271 void addFlags(
Flags flags_);
273 void removeFlags(
Flags flags_);
275 void computeTransparencyFlags();
277 [[nodiscard]] static
ImageFormat getDefaultCompressedFormat(
ImageFormat inputFormat, uint32_t majorVersion, uint32_t minorVersion,
bool isCubeMap);
281 void setFormat(
ImageFormat newFormat, ImageConversion::ResizeFilter filter = ImageConversion::ResizeFilter::DEFAULT);
283 [[nodiscard]] uint8_t getMipCount() const;
285 bool setMipCount(uint8_t newMipCount);
287 bool setRecommendedMipCount();
289 void computeMips(ImageConversion::ResizeFilter filter = ImageConversion::ResizeFilter::DEFAULT);
291 [[nodiscard]] uint16_t getFrameCount() const;
293 bool setFrameCount(uint16_t newFrameCount);
295 [[nodiscard]] uint8_t getFaceCount() const;
297 bool setFaceCount(
bool isCubeMap);
299 [[nodiscard]] uint16_t getSliceCount() const;
301 bool setSliceCount(uint16_t newSliceCount);
303 bool setFrameFaceAndSliceCount(uint16_t newFrameCount,
bool isCubeMap, uint16_t newSliceCount = 1);
305 [[nodiscard]] uint16_t getStartFrame() const;
307 void setStartFrame(uint16_t newStartFrame);
309 [[nodiscard]]
sourcepp::math::Vec3f getReflectivity() const;
311 void setReflectivity(
sourcepp::math::Vec3f newReflectivity);
313 void computeReflectivity();
315 [[nodiscard]]
float getBumpMapScale() const;
317 void setBumpMapScale(
float newBumpMapScale);
319 [[nodiscard]]
ImageFormat getThumbnailFormat() const;
321 [[nodiscard]] uint8_t getThumbnailWidth() const;
323 [[nodiscard]] uint8_t getThumbnailHeight() const;
325 [[nodiscard]] const std::vector<
Resource>& getResources() const;
330 [[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;
333 [[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;
336 [[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;
338 void setParticleSheetResource(const
SHT& value);
340 void removeParticleSheetResource();
342 void setCRCResource(uint32_t value);
344 void removeCRCResource();
346 void setLODResource(uint8_t u, uint8_t v, uint8_t u360 = 0, uint8_t v360 = 0);
348 void removeLODResource();
350 void setExtendedFlagsResource(uint32_t value);
352 void removeExtendedFlagsResource();
354 void setKeyValuesDataResource(const std::
string& value);
356 void removeKeyValuesDataResource();
358 [[nodiscard]] int16_t getCompressionLevel() const;
360 void setCompressionLevel(int16_t newCompressionLevel);
366 [[nodiscard]]
bool hasImageData() const;
368 [[nodiscard]]
bool imageDataIsSRGB() const;
370 [[nodiscard]] std::span<const std::
byte> getImageDataRaw(uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0, uint16_t slice = 0) const;
372 [[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;
374 [[nodiscard]] std::vector<std::
byte> getImageDataAsRGBA8888(uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0, uint16_t slice = 0) const;
376 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);
378 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);
380 [[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;
382 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;
384 [[nodiscard]]
bool hasThumbnailData() const;
386 [[nodiscard]] std::span<const std::
byte> getThumbnailDataRaw() const;
388 [[nodiscard]] std::vector<std::
byte> getThumbnailDataAs(
ImageFormat newFormat) const;
390 [[nodiscard]] std::vector<std::
byte> getThumbnailDataAsRGBA8888() const;
392 void setThumbnail(std::span<const std::
byte> imageData_,
ImageFormat format_, uint16_t width_, uint16_t height_);
394 void computeThumbnail(ImageConversion::ResizeFilter filter = ImageConversion::ResizeFilter::DEFAULT);
396 void removeThumbnail();
398 [[nodiscard]] std::vector<std::
byte> saveThumbnailToFile(ImageConversion::FileFormat fileFormat = ImageConversion::FileFormat::DEFAULT) const;
400 bool saveThumbnailToFile(const std::
string& imagePath, ImageConversion::FileFormat fileFormat = ImageConversion::FileFormat::DEFAULT) const;
402 [[nodiscard]] std::vector<std::
byte> bake() const;
404 bool bake(const std::
string& vtfPath) const;
411 void setResourceInternal(
Resource::Type type, std::span<const std::
byte> data_);
413 void removeResourceInternal(
Resource::Type type);
415 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);
419 std::vector<std::
byte> data;
422 uint32_t majorVersion{};
423 uint32_t minorVersion{};
430 uint16_t frameCount = 1;
431 uint16_t startFrame{};
434 sourcepp::math::Vec3f reflectivity{};
437 float bumpMapScale{};
439 uint8_t mipCount = 1;
442 uint8_t thumbnailWidth{};
443 uint8_t thumbnailHeight{};
446 uint16_t sliceCount = 1;
456 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
std::variant< std::monostate, SHT, uint32_t, std::tuple< uint8_t, uint8_t, uint8_t, uint8_t >, std::string, std::span< uint32_t > > ConvertedData
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
uint32_t getDataAsExtendedFlags() const
int16_t getDataAsAuxCompressionLevel() const
@ TYPE_PARTICLE_SHEET_DATA
static const std::array< Type, 8 > & getOrder()
std::span< std::byte > data