diff options
| author | Erik Kundiman <erik@megapahit.org> | 2024-06-11 09:12:53 +0800 | 
|---|---|---|
| committer | Erik Kundiman <erik@megapahit.org> | 2024-06-11 09:12:53 +0800 | 
| commit | dedd91fdcabe5af455bbbb1cb0149aea30b0faf9 (patch) | |
| tree | 246d37024406883c917e0c54ce61306552b1671c /indra/newview/lltinygltfhelper.cpp | |
| parent | b0e7f040658132d398fd2b29585ed5ae782c1fdd (diff) | |
| parent | 730d94779c0e798ec91b269b530a08f0eebaa13d (diff) | |
Merge tag '7.1.8-release'
source for viewer 7.1.8.9375512768
Diffstat (limited to 'indra/newview/lltinygltfhelper.cpp')
| -rw-r--r-- | indra/newview/lltinygltfhelper.cpp | 61 | 
1 files changed, 39 insertions, 22 deletions
| diff --git a/indra/newview/lltinygltfhelper.cpp b/indra/newview/lltinygltfhelper.cpp index cd1b071574..4e41f9959a 100644 --- a/indra/newview/lltinygltfhelper.cpp +++ b/indra/newview/lltinygltfhelper.cpp @@ -87,20 +87,30 @@ void LLTinyGLTFHelper::initFetchedTextures(tinygltf::Material& material,      {          strip_alpha_channel(mr_img); -        if (occlusion_img && material.pbrMetallicRoughness.metallicRoughnessTexture.index != material.occlusionTexture.index) +        if (occlusion_img)          { -            // occlusion is a distinct texture from pbrMetallicRoughness -            // pack into mr red channel -            int occlusion_idx = material.occlusionTexture.index; -            int mr_idx = material.pbrMetallicRoughness.metallicRoughnessTexture.index; -            if (occlusion_idx != mr_idx) +            if (material.pbrMetallicRoughness.metallicRoughnessTexture.index != material.occlusionTexture.index)              { -                //scale occlusion image to match resolution of mr image -                occlusion_img->scale(mr_img->getWidth(), mr_img->getHeight()); - -                copy_red_channel(occlusion_img, mr_img); +                // occlusion is a distinct texture from pbrMetallicRoughness +                // pack into mr red channel +                int occlusion_idx = material.occlusionTexture.index; +                int mr_idx = material.pbrMetallicRoughness.metallicRoughnessTexture.index; +                if (occlusion_idx != mr_idx) +                { +                    //scale occlusion image to match resolution of mr image +                    occlusion_img->scale(mr_img->getWidth(), mr_img->getHeight()); + +                    copy_red_channel(occlusion_img, mr_img); +                }              }          } +        else if (material.occlusionTexture.index == -1) +        { +            // no occlusion, make sure red channel of ORM is all 255 +            occlusion_img = new LLImageRaw(mr_img->getWidth(), mr_img->getHeight(), 3); +            occlusion_img->clear(255, 255, 255); +            copy_red_channel(occlusion_img, mr_img); +        }      }      else if (occlusion_img)      { @@ -147,7 +157,7 @@ const tinygltf::Image * LLTinyGLTFHelper::getImageFromTextureIndex(const tinyglt      return nullptr;  } -LLImageRaw * LLTinyGLTFHelper::getTexture(const std::string & folder, const tinygltf::Model & model, S32 texture_index, std::string & name) +LLImageRaw * LLTinyGLTFHelper::getTexture(const std::string & folder, const tinygltf::Model & model, S32 texture_index, std::string & name, bool flip)  {      const tinygltf::Image* image = getImageFromTextureIndex(model, texture_index);      LLImageRaw* rawImage = nullptr; @@ -159,14 +169,17 @@ LLImageRaw * LLTinyGLTFHelper::getTexture(const std::string & folder, const tiny      {          name = image->name;          rawImage = new LLImageRaw(&image->image[0], image->width, image->height, image->component); -        rawImage->verticalFlip(); +        if (flip) +        { +            rawImage->verticalFlip(); +        }          rawImage->optimizeAwayAlpha();      }      return rawImage;  } -LLImageRaw * LLTinyGLTFHelper::getTexture(const std::string & folder, const tinygltf::Model & model, S32 texture_index) +LLImageRaw * LLTinyGLTFHelper::getTexture(const std::string & folder, const tinygltf::Model & model, S32 texture_index, bool flip)  {      const tinygltf::Image* image = getImageFromTextureIndex(model, texture_index);      LLImageRaw* rawImage = nullptr; @@ -177,7 +190,10 @@ LLImageRaw * LLTinyGLTFHelper::getTexture(const std::string & folder, const tiny          image->component <= 4)      {          rawImage = new LLImageRaw(&image->image[0], image->width, image->height, image->component); -        rawImage->verticalFlip(); +        if (flip) +        { +            rawImage->verticalFlip(); +        }          rawImage->optimizeAwayAlpha();      } @@ -187,7 +203,7 @@ LLImageRaw * LLTinyGLTFHelper::getTexture(const std::string & folder, const tiny  bool LLTinyGLTFHelper::loadModel(const std::string& filename, tinygltf::Model& model_in)  {      std::string exten = gDirUtilp->getExtension(filename); - +          if (exten == "gltf" || exten == "glb")      {          tinygltf::TinyGLTF loader; @@ -224,7 +240,7 @@ bool LLTinyGLTFHelper::loadModel(const std::string& filename, tinygltf::Model& m              LL_WARNS("GLTF") << "Cannot load. File has no materials " << filename << LL_ENDL;              return false;          } - +                  return true;      } @@ -237,7 +253,8 @@ bool LLTinyGLTFHelper::getMaterialFromModel(      const tinygltf::Model& model_in,      S32 mat_index,      LLFetchedGLTFMaterial* material, -    std::string& material_name) +    std::string& material_name, +    bool flip)  {      llassert(material); @@ -256,18 +273,18 @@ bool LLTinyGLTFHelper::getMaterialFromModel(      material_name = material_in.name;      // get base color texture -    LLPointer<LLImageRaw> base_img = LLTinyGLTFHelper::getTexture(folder, model_in, material_in.pbrMetallicRoughness.baseColorTexture.index); +    LLPointer<LLImageRaw> base_img = LLTinyGLTFHelper::getTexture(folder, model_in, material_in.pbrMetallicRoughness.baseColorTexture.index, flip);      // get normal map -    LLPointer<LLImageRaw> normal_img = LLTinyGLTFHelper::getTexture(folder, model_in, material_in.normalTexture.index); +    LLPointer<LLImageRaw> normal_img = LLTinyGLTFHelper::getTexture(folder, model_in, material_in.normalTexture.index, flip);      // get metallic-roughness texture -    LLPointer<LLImageRaw> mr_img = LLTinyGLTFHelper::getTexture(folder, model_in, material_in.pbrMetallicRoughness.metallicRoughnessTexture.index); +    LLPointer<LLImageRaw> mr_img = LLTinyGLTFHelper::getTexture(folder, model_in, material_in.pbrMetallicRoughness.metallicRoughnessTexture.index, flip);      // get emissive texture -    LLPointer<LLImageRaw> emissive_img = LLTinyGLTFHelper::getTexture(folder, model_in, material_in.emissiveTexture.index); +    LLPointer<LLImageRaw> emissive_img = LLTinyGLTFHelper::getTexture(folder, model_in, material_in.emissiveTexture.index, flip);      // get occlusion map if needed      LLPointer<LLImageRaw> occlusion_img;      if (material_in.occlusionTexture.index != material_in.pbrMetallicRoughness.metallicRoughnessTexture.index)      { -        occlusion_img = LLTinyGLTFHelper::getTexture(folder, model_in, material_in.occlusionTexture.index); +        occlusion_img = LLTinyGLTFHelper::getTexture(folder, model_in, material_in.occlusionTexture.index, flip);      }      LLPointer<LLViewerFetchedTexture> base_color_tex; | 
