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 bool hasSphereMap =
false;
189 uint16_t initialSliceCount = 1;
190 bool computeTransparencyFlags =
true;
191 bool computeMips =
true;
192 bool computeThumbnail =
true;
193 bool computeReflectivity =
true;
195 int16_t compressionLevel = -1;
197 float bumpMapScale = 1.f;
201 static constexpr auto FORMAT_UNCHANGED =
static_cast<ImageFormat>(-2);
204 static constexpr auto FORMAT_DEFAULT =
static_cast<ImageFormat>(-1);
208 explicit VTF(std::vector<std::byte>&& vtfData,
bool parseHeaderOnly =
false);
210 explicit VTF(std::span<const std::byte> vtfData,
bool parseHeaderOnly =
false);
212 explicit VTF(
const std::string& vtfPath,
bool parseHeaderOnly =
false);
216 VTF& operator=(
const VTF& other);
220 VTF& operator=(
VTF&&) noexcept = default;
222 [[nodiscard]] explicit operator
bool() const;
224 static
bool create(std::span<const std::
byte> imageData,
ImageFormat format, uint16_t width, uint16_t height, const std::
string& vtfPath,
CreationOptions options);
228 [[nodiscard]] static
VTF create(std::span<const std::
byte> imageData,
ImageFormat format, uint16_t width, uint16_t height,
CreationOptions options);
232 static
bool create(const std::
string& imagePath, const std::
string& vtfPath,
CreationOptions options);
234 [[nodiscard]] static
VTF create(const std::
string& imagePath,
CreationOptions options);
236 [[nodiscard]]
Platform getPlatform() const;
238 void setPlatform(
Platform newPlatform);
240 [[nodiscard]] uint32_t getMajorVersion() const;
242 [[nodiscard]] uint32_t getMinorVersion() const;
244 void setVersion(uint32_t newMajorVersion, uint32_t newMinorVersion);
246 void setMajorVersion(uint32_t newMajorVersion);
248 void setMinorVersion(uint32_t newMinorVersion);
250 [[nodiscard]] ImageConversion::ResizeMethod getImageWidthResizeMethod() const;
252 [[nodiscard]] ImageConversion::ResizeMethod getImageHeightResizeMethod() const;
254 void setImageResizeMethods(ImageConversion::ResizeMethod imageWidthResizeMethod_, ImageConversion::ResizeMethod imageHeightResizeMethod_);
256 void setImageWidthResizeMethod(ImageConversion::ResizeMethod imageWidthResizeMethod_);
258 void setImageHeightResizeMethod(ImageConversion::ResizeMethod imageHeightResizeMethod_);
260 [[nodiscard]] uint16_t getWidth(uint8_t mip = 0) const;
262 [[nodiscard]] uint16_t getHeight(uint8_t mip = 0) const;
264 void setSize(uint16_t newWidth, uint16_t newHeight, ImageConversion::ResizeFilter filter);
266 [[nodiscard]]
Flags getFlags() const;
268 void setFlags(
Flags flags_);
270 void addFlags(
Flags flags_);
272 void removeFlags(
Flags flags_);
274 void computeTransparencyFlags();
276 [[nodiscard]] static
ImageFormat getDefaultCompressedFormat(
ImageFormat inputFormat, uint32_t majorVersion, uint32_t minorVersion);
280 void setFormat(
ImageFormat newFormat, ImageConversion::ResizeFilter filter = ImageConversion::ResizeFilter::DEFAULT);
282 [[nodiscard]] uint8_t getMipCount() const;
284 bool setMipCount(uint8_t newMipCount);
286 bool setRecommendedMipCount();
288 void computeMips(ImageConversion::ResizeFilter filter = ImageConversion::ResizeFilter::DEFAULT);
290 [[nodiscard]] uint16_t getFrameCount() const;
292 bool setFrameCount(uint16_t newFrameCount);
294 [[nodiscard]] uint8_t getFaceCount() const;
296 bool setFaceCount(
bool isCubemap,
bool hasSphereMap = false);
298 [[nodiscard]] uint16_t getSliceCount() const;
300 bool setSliceCount(uint16_t newSliceCount);
302 bool setFrameFaceAndSliceCount(uint16_t newFrameCount,
bool isCubemap,
bool hasSphereMap = false, uint16_t newSliceCount = 1);
304 [[nodiscard]] uint16_t getStartFrame() const;
306 void setStartFrame(uint16_t newStartFrame);
308 [[nodiscard]]
sourcepp::math::Vec3f getReflectivity() const;
310 void setReflectivity(
sourcepp::math::Vec3f newReflectivity);
312 void computeReflectivity();
314 [[nodiscard]]
float getBumpMapScale() const;
316 void setBumpMapScale(
float newBumpMapScale);
318 [[nodiscard]]
ImageFormat getThumbnailFormat() const;
320 [[nodiscard]] uint8_t getThumbnailWidth() const;
322 [[nodiscard]] uint8_t getThumbnailHeight() const;
324 [[nodiscard]] const std::vector<
Resource>& getResources() const;
329 [[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;
332 [[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;
335 [[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;
337 void setParticleSheetResource(const
SHT& value);
339 void removeParticleSheetResource();
341 void setCRCResource(uint32_t value);
343 void removeCRCResource();
345 void setLODResource(uint8_t u, uint8_t v, uint8_t u360 = 0, uint8_t v360 = 0);
347 void removeLODResource();
349 void setExtendedFlagsResource(uint32_t value);
351 void removeExtendedFlagsResource();
353 void setKeyValuesDataResource(const std::
string& value);
355 void removeKeyValuesDataResource();
357 [[nodiscard]] int16_t getCompressionLevel() const;
359 void setCompressionLevel(int16_t newCompressionLevel);
365 [[nodiscard]]
bool hasImageData() const;
367 [[nodiscard]]
bool imageDataIsSRGB() const;
369 [[nodiscard]] std::span<const std::
byte> getImageDataRaw(uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0, uint16_t slice = 0) const;
371 [[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;
373 [[nodiscard]] std::vector<std::
byte> getImageDataAsRGBA8888(uint8_t mip = 0, uint16_t frame = 0, uint8_t face = 0, uint16_t slice = 0) const;
375 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);
377 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);
379 [[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;
381 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;
383 [[nodiscard]]
bool hasThumbnailData() const;
385 [[nodiscard]] std::span<const std::
byte> getThumbnailDataRaw() const;
387 [[nodiscard]] std::vector<std::
byte> getThumbnailDataAs(
ImageFormat newFormat) const;
389 [[nodiscard]] std::vector<std::
byte> getThumbnailDataAsRGBA8888() const;
391 void setThumbnail(std::span<const std::
byte> imageData_,
ImageFormat format_, uint16_t width_, uint16_t height_);
393 void computeThumbnail(ImageConversion::ResizeFilter filter = ImageConversion::ResizeFilter::DEFAULT);
395 void removeThumbnail();
397 [[nodiscard]] std::vector<std::
byte> saveThumbnailToFile(ImageConversion::FileFormat fileFormat = ImageConversion::FileFormat::DEFAULT) const;
399 bool saveThumbnailToFile(const std::
string& imagePath, ImageConversion::FileFormat fileFormat = ImageConversion::FileFormat::DEFAULT) const;
401 [[nodiscard]] std::vector<std::
byte> bake() const;
403 bool bake(const std::
string& vtfPath) const;
410 void setResourceInternal(
Resource::Type type, std::span<const std::
byte> data_);
412 void removeResourceInternal(
Resource::Type type);
414 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);
418 std::vector<std::
byte> data;
421 uint32_t majorVersion{};
422 uint32_t minorVersion{};
429 uint16_t frameCount = 1;
430 uint16_t startFrame{};
433 sourcepp::math::Vec3f reflectivity{};
436 float bumpMapScale{};
438 uint8_t mipCount = 1;
441 uint8_t thumbnailWidth{};
442 uint8_t thumbnailHeight{};
445 uint16_t sliceCount = 1;
455 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