SL-17619 Add support for embedded textures to GLTF importer
parent
f5d66e79ee
commit
18b0aa0371
|
|
@ -815,6 +815,15 @@ LLImageRaw::LLImageRaw(U16 width, U16 height, S8 components)
|
|||
++sRawImageCount;
|
||||
}
|
||||
|
||||
LLImageRaw::LLImageRaw(const U8* data, U16 width, U16 height, S8 components)
|
||||
: LLImageBase()
|
||||
{
|
||||
if (allocateDataSize(width, height, components))
|
||||
{
|
||||
memcpy(getData(), data, width * height * components);
|
||||
}
|
||||
}
|
||||
|
||||
LLImageRaw::LLImageRaw(U8 *data, U16 width, U16 height, S8 components, bool no_copy)
|
||||
: LLImageBase()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -184,6 +184,7 @@ protected:
|
|||
public:
|
||||
LLImageRaw();
|
||||
LLImageRaw(U16 width, U16 height, S8 components);
|
||||
LLImageRaw(const U8* data, U16 width, U16 height, S8 components);
|
||||
LLImageRaw(U8 *data, U16 width, U16 height, S8 components, bool no_copy = false);
|
||||
// Construct using createFromFile (used by tools)
|
||||
//LLImageRaw(const std::string& filename, bool j2c_lowest_mip_only = false);
|
||||
|
|
|
|||
|
|
@ -295,35 +295,40 @@ void LLMaterialFilePicker::notify(const std::vector<std::string>& filenames)
|
|||
}
|
||||
}
|
||||
|
||||
static std::string get_texture_uri(const tinygltf::Model& model, S32 texture_index)
|
||||
const tinygltf::Image* get_image_from_texture_index(const tinygltf::Model& model, S32 texture_index)
|
||||
{
|
||||
std::string ret;
|
||||
|
||||
if (texture_index >= 0)
|
||||
{
|
||||
S32 source_idx = model.textures[texture_index].source;
|
||||
if (source_idx >= 0)
|
||||
{
|
||||
ret = model.images[source_idx].uri;
|
||||
return &(model.images[source_idx]);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static LLViewerFetchedTexture* get_texture(const std::string& folder, const tinygltf::Model& model, S32 texture_index)
|
||||
{
|
||||
LLViewerFetchedTexture* ret = nullptr;
|
||||
std::string file = get_texture_uri(model, texture_index);
|
||||
if (!file.empty())
|
||||
{
|
||||
std::string uri = folder;
|
||||
gDirUtilp->append(uri, file);
|
||||
|
||||
ret = LLViewerTextureManager::getFetchedTextureFromUrl("file://" + LLURI::unescape(uri), FTT_LOCAL_FILE, TRUE, LLGLTexture::BOOST_PREVIEW);
|
||||
//ret->setLoadedCallback(LLMaterialFilePicker::textureLoadedCallback, 0, TRUE, FALSE, opaque, NULL, FALSE);
|
||||
const tinygltf::Image* image = get_image_from_texture_index(model, texture_index);
|
||||
|
||||
if (image != nullptr &&
|
||||
image->bits == 8 &&
|
||||
!image->image.empty() &&
|
||||
image->component <= 4)
|
||||
{
|
||||
LLPointer<LLImageRaw> rawImage = new LLImageRaw(&image->image[0], image->width, image->height, image->component);
|
||||
|
||||
ret = LLViewerTextureManager::getFetchedTexture(rawImage, FTType::FTT_LOCAL_FILE, true);
|
||||
|
||||
ret->forceToSaveRawImage(0, F32_MAX);
|
||||
}
|
||||
|
||||
// TODO: provide helpful error message if image fails to load
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -287,6 +287,13 @@ LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(const U32 wid
|
|||
return tex;
|
||||
}
|
||||
|
||||
LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTexture(const LLImageRaw* raw, FTType type, bool usemipmaps)
|
||||
{
|
||||
LLViewerFetchedTexture* ret = new LLViewerFetchedTexture(raw, type, usemipmaps);
|
||||
gTextureList.addImage(ret, TEX_LIST_STANDARD);
|
||||
return ret;
|
||||
}
|
||||
|
||||
LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTexture(
|
||||
const LLUUID &image_id,
|
||||
FTType f_type,
|
||||
|
|
|
|||
|
|
@ -668,6 +668,8 @@ public:
|
|||
static LLPointer<LLViewerTexture> getLocalTexture(const LLImageRaw* raw, BOOL usemipmaps) ;
|
||||
static LLPointer<LLViewerTexture> getLocalTexture(const U32 width, const U32 height, const U8 components, BOOL usemipmaps, BOOL generate_gl_tex = TRUE) ;
|
||||
|
||||
static LLViewerFetchedTexture* getFetchedTexture(const LLImageRaw* raw, FTType type, bool usemipmaps);
|
||||
|
||||
static LLViewerFetchedTexture* getFetchedTexture(const LLUUID &image_id,
|
||||
FTType f_type = FTT_DEFAULT,
|
||||
BOOL usemipmap = TRUE,
|
||||
|
|
|
|||
Loading…
Reference in New Issue