4jcraft/Minecraft.Client/Textures/TextureHolder.cpp
2026-03-13 17:10:10 -05:00

68 lines
2.1 KiB
C++

#include "../Platform/stdafx.h"
#include "Stitching/Stitcher.h"
#include "Texture.h"
#include "../../Minecraft.World/Util/StringHelpers.h"
#include "TextureHolder.h"
TextureHolder::TextureHolder(Texture* texture) {
scale = 1.0f;
this->texture = texture;
this->width = texture->getWidth();
this->height = texture->getHeight();
this->rotated =
smallestFittingMinTexel(height) > smallestFittingMinTexel(width);
}
Texture* TextureHolder::getTexture() { return texture; }
int TextureHolder::getWidth() const {
return rotated ? smallestFittingMinTexel((int)(height * scale))
: smallestFittingMinTexel((int)(width * scale));
}
int TextureHolder::getHeight() const {
return rotated ? smallestFittingMinTexel((int)(width * scale))
: smallestFittingMinTexel((int)(height * scale));
}
void TextureHolder::rotate() { rotated = !rotated; }
bool TextureHolder::isRotated() { return rotated; }
int TextureHolder::smallestFittingMinTexel(int input) const {
return ((input >> Stitcher::MAX_MIPLEVEL) +
((input & (Stitcher::MIN_TEXEL - 1)) == 0 ? 0 : 1))
<< Stitcher::MAX_MIPLEVEL;
}
void TextureHolder::setForcedScale(int targetSize) {
if (width <= targetSize || height <= targetSize) {
return;
}
scale = (float)targetSize / std::min(width, height);
}
//@Override
std::wstring TextureHolder::toString() {
return L"TextureHolder{width=" + _toString(width) + L", height=" +
_toString(height) + L'}';
}
int TextureHolder::compareTo(const TextureHolder* other) const {
int result = 0;
if (this->getHeight() == other->getHeight()) {
if (this->getWidth() == other->getWidth()) {
if (texture->getName().empty()) {
return other->texture->getName().empty() ? 0 : -1;
}
return texture->getName().compare(other->texture->getName());
}
result = this->getWidth() < other->getWidth() ? 1 : -1;
} else {
result = this->getHeight() < other->getHeight() ? 1 : -1;
}
return result;
}