mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-09 00:07:31 +02:00
Adding specific path for loading lightmaps
This commit is contained in:
parent
744da64c50
commit
762a241fa6
4 changed files with 91 additions and 4 deletions
|
@ -308,10 +308,9 @@ static NetworkMaterial* buildNetworkMaterial(const FBXMaterial& material, const
|
||||||
material._material->setTextureMap(model::MaterialKey::GLOSS_MAP, glossMap);
|
material._material->setTextureMap(model::MaterialKey::GLOSS_MAP, glossMap);
|
||||||
}
|
}
|
||||||
if (!material.emissiveTexture.filename.isEmpty()) {
|
if (!material.emissiveTexture.filename.isEmpty()) {
|
||||||
networkMaterial->emissiveTexture = textureCache->getTexture(textureBaseUrl.resolved(QUrl(material.emissiveTexture.filename)), EMISSIVE_TEXTURE, material.emissiveTexture.content);
|
networkMaterial->emissiveTexture = textureCache->getTexture(textureBaseUrl.resolved(QUrl(material.emissiveTexture.filename)), LIGHTMAP_TEXTURE, material.emissiveTexture.content);
|
||||||
networkMaterial->emissiveTextureName = material.emissiveTexture.name;
|
networkMaterial->emissiveTextureName = material.emissiveTexture.name;
|
||||||
|
|
||||||
//checkForTexcoordLightmap = true;
|
|
||||||
|
|
||||||
auto lightmapMap = model::TextureMapPointer(new model::TextureMap());
|
auto lightmapMap = model::TextureMapPointer(new model::TextureMap());
|
||||||
lightmapMap->setTextureSource(networkMaterial->emissiveTexture->_textureSource);
|
lightmapMap->setTextureSource(networkMaterial->emissiveTexture->_textureSource);
|
||||||
|
|
|
@ -29,7 +29,7 @@ class NetworkTexture;
|
||||||
|
|
||||||
typedef QSharedPointer<NetworkTexture> NetworkTexturePointer;
|
typedef QSharedPointer<NetworkTexture> NetworkTexturePointer;
|
||||||
|
|
||||||
enum TextureType { DEFAULT_TEXTURE, NORMAL_TEXTURE, BUMP_TEXTURE, SPECULAR_TEXTURE, EMISSIVE_TEXTURE, CUBE_TEXTURE, CUSTOM_TEXTURE };
|
enum TextureType { DEFAULT_TEXTURE, NORMAL_TEXTURE, BUMP_TEXTURE, SPECULAR_TEXTURE, EMISSIVE_TEXTURE, CUBE_TEXTURE, LIGHTMAP_TEXTURE, CUSTOM_TEXTURE };
|
||||||
|
|
||||||
/// Stores cached textures, including render-to-texture targets.
|
/// Stores cached textures, including render-to-texture targets.
|
||||||
class TextureCache : public ResourceCache, public Dependency {
|
class TextureCache : public ResourceCache, public Dependency {
|
||||||
|
|
|
@ -119,7 +119,7 @@ gpu::Texture* TextureUsage::create2DTextureFromImage(const QImage& srcImage, con
|
||||||
if ((image.width() > 0) && (image.height() > 0)) {
|
if ((image.width() > 0) && (image.height() > 0)) {
|
||||||
|
|
||||||
// bool isLinearRGB = true; //(_type == NORMAL_TEXTURE) || (_type == EMISSIVE_TEXTURE);
|
// bool isLinearRGB = true; //(_type == NORMAL_TEXTURE) || (_type == EMISSIVE_TEXTURE);
|
||||||
bool isLinearRGB = true; //(_type == NORMAL_TEXTURE) || (_type == EMISSIVE_TEXTURE);
|
bool isLinearRGB = false; //(_type == NORMAL_TEXTURE) || (_type == EMISSIVE_TEXTURE);
|
||||||
|
|
||||||
gpu::Element formatGPU = gpu::Element(gpu::VEC3, gpu::UINT8, (isLinearRGB ? gpu::RGB : gpu::SRGB));
|
gpu::Element formatGPU = gpu::Element(gpu::VEC3, gpu::UINT8, (isLinearRGB ? gpu::RGB : gpu::SRGB));
|
||||||
gpu::Element formatMip = gpu::Element(gpu::VEC3, gpu::UINT8, (isLinearRGB ? gpu::RGB : gpu::SRGB));
|
gpu::Element formatMip = gpu::Element(gpu::VEC3, gpu::UINT8, (isLinearRGB ? gpu::RGB : gpu::SRGB));
|
||||||
|
@ -520,3 +520,89 @@ gpu::Texture* TextureUsage::createCubeTextureFromImage(const QImage& srcImage, c
|
||||||
|
|
||||||
return theTexture;
|
return theTexture;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
gpu::Texture* TextureUsage::createLightmapTextureFromImage(const QImage& srcImage, const std::string& srcImageName) {
|
||||||
|
QImage image = srcImage;
|
||||||
|
|
||||||
|
int imageArea = image.width() * image.height();
|
||||||
|
|
||||||
|
int opaquePixels = 0;
|
||||||
|
int translucentPixels = 0;
|
||||||
|
//bool isTransparent = false;
|
||||||
|
int redTotal = 0, greenTotal = 0, blueTotal = 0, alphaTotal = 0;
|
||||||
|
const int EIGHT_BIT_MAXIMUM = 255;
|
||||||
|
QColor averageColor(EIGHT_BIT_MAXIMUM, EIGHT_BIT_MAXIMUM, EIGHT_BIT_MAXIMUM);
|
||||||
|
|
||||||
|
if (!image.hasAlphaChannel()) {
|
||||||
|
if (image.format() != QImage::Format_RGB888) {
|
||||||
|
image = image.convertToFormat(QImage::Format_RGB888);
|
||||||
|
}
|
||||||
|
// int redTotal = 0, greenTotal = 0, blueTotal = 0;
|
||||||
|
for (int y = 0; y < image.height(); y++) {
|
||||||
|
for (int x = 0; x < image.width(); x++) {
|
||||||
|
QRgb rgb = image.pixel(x, y);
|
||||||
|
redTotal += qRed(rgb);
|
||||||
|
greenTotal += qGreen(rgb);
|
||||||
|
blueTotal += qBlue(rgb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (imageArea > 0) {
|
||||||
|
averageColor.setRgb(redTotal / imageArea, greenTotal / imageArea, blueTotal / imageArea);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (image.format() != QImage::Format_ARGB32) {
|
||||||
|
image = image.convertToFormat(QImage::Format_ARGB32);
|
||||||
|
}
|
||||||
|
|
||||||
|
// check for translucency/false transparency
|
||||||
|
// int opaquePixels = 0;
|
||||||
|
// int translucentPixels = 0;
|
||||||
|
// int redTotal = 0, greenTotal = 0, blueTotal = 0, alphaTotal = 0;
|
||||||
|
for (int y = 0; y < image.height(); y++) {
|
||||||
|
for (int x = 0; x < image.width(); x++) {
|
||||||
|
QRgb rgb = image.pixel(x, y);
|
||||||
|
redTotal += qRed(rgb);
|
||||||
|
greenTotal += qGreen(rgb);
|
||||||
|
blueTotal += qBlue(rgb);
|
||||||
|
int alpha = qAlpha(rgb);
|
||||||
|
alphaTotal += alpha;
|
||||||
|
if (alpha == EIGHT_BIT_MAXIMUM) {
|
||||||
|
opaquePixels++;
|
||||||
|
} else if (alpha != 0) {
|
||||||
|
translucentPixels++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (opaquePixels == imageArea) {
|
||||||
|
qCDebug(modelLog) << "Image with alpha channel is completely opaque:" << QString(srcImageName.c_str());
|
||||||
|
image = image.convertToFormat(QImage::Format_RGB888);
|
||||||
|
}
|
||||||
|
|
||||||
|
averageColor = QColor(redTotal / imageArea,
|
||||||
|
greenTotal / imageArea, blueTotal / imageArea, alphaTotal / imageArea);
|
||||||
|
|
||||||
|
//isTransparent = (translucentPixels >= imageArea / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
gpu::Texture* theTexture = nullptr;
|
||||||
|
if ((image.width() > 0) && (image.height() > 0)) {
|
||||||
|
|
||||||
|
// bool isLinearRGB = true; //(_type == NORMAL_TEXTURE) || (_type == EMISSIVE_TEXTURE);
|
||||||
|
bool isLinearRGB = false; //(_type == NORMAL_TEXTURE) || (_type == EMISSIVE_TEXTURE);
|
||||||
|
|
||||||
|
gpu::Element formatGPU = gpu::Element(gpu::VEC3, gpu::UINT8, (isLinearRGB ? gpu::RGB : gpu::SRGB));
|
||||||
|
gpu::Element formatMip = gpu::Element(gpu::VEC3, gpu::UINT8, (isLinearRGB ? gpu::RGB : gpu::SRGB));
|
||||||
|
if (image.hasAlphaChannel()) {
|
||||||
|
formatGPU = gpu::Element(gpu::VEC4, gpu::UINT8, (isLinearRGB ? gpu::RGBA : gpu::SRGBA));
|
||||||
|
formatMip = gpu::Element(gpu::VEC4, gpu::UINT8, (isLinearRGB ? gpu::BGRA : gpu::SBGRA));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
theTexture = (gpu::Texture::create2D(formatGPU, image.width(), image.height(), gpu::Sampler(gpu::Sampler::FILTER_MIN_MAG_MIP_LINEAR)));
|
||||||
|
theTexture->assignStoredMip(0, formatMip, image.byteCount(), image.constBits());
|
||||||
|
theTexture->autoGenerateMips(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return theTexture;
|
||||||
|
}
|
||||||
|
|
|
@ -35,6 +35,8 @@ public:
|
||||||
static gpu::Texture* createNormalTextureFromNormalImage(const QImage& image, const std::string& srcImageName);
|
static gpu::Texture* createNormalTextureFromNormalImage(const QImage& image, const std::string& srcImageName);
|
||||||
static gpu::Texture* createNormalTextureFromBumpImage(const QImage& image, const std::string& srcImageName);
|
static gpu::Texture* createNormalTextureFromBumpImage(const QImage& image, const std::string& srcImageName);
|
||||||
static gpu::Texture* createCubeTextureFromImage(const QImage& image, const std::string& srcImageName);
|
static gpu::Texture* createCubeTextureFromImage(const QImage& image, const std::string& srcImageName);
|
||||||
|
static gpu::Texture* createLightmapTextureFromImage(const QImage& image, const std::string& srcImageName);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue