@@ -643,6 +643,76 @@ static int GetRealTextureOffset_MH(const UTexture2D *Obj, int MipIndex)
643
643
644
644
#endif // MARVEL_HEROES
645
645
646
+ #if SMITE
647
+ #include < md5/md5.h>
648
+ #include " ../FileSystem/GameFileSystemSmite.h"
649
+ #include " ../UnrealPackage/UnPackageUE3Reader.h"
650
+
651
+ static bool LoadBulkTextureSMITE (const UTexture2D* texture, const TArray<FTexture2DMipMap> &MipsArray, int MipIndex, bool verbose) {
652
+ static char buf[2048 ];
653
+ texture->GetFullName (ARRAY_ARG (buf), true , true , true ); char *s = buf;
654
+ int len = 0 ;
655
+ if (verbose) {
656
+ appPrintf (" Smite: Finding %s (Mip %d) in MergedFileIndexCache\n " , buf, MipIndex);
657
+ }
658
+ while (*s) {
659
+ *s = toupper ((unsigned char ) *s);
660
+ len++;
661
+ s++;
662
+ }
663
+ MD5Context ctx;
664
+ md5Init (&ctx);
665
+ md5Update (&ctx, (unsigned char *)buf, len);
666
+ md5Finalize (&ctx);
667
+
668
+ const FTexture2DMipMap &Mip = MipsArray[MipIndex];
669
+ FArchive* Ar = GetSmiteBlob (*reinterpret_cast <FGuid*>(ctx.digest ), MipIndex, " tfc" );
670
+ if (Ar == NULL ) {
671
+ appPrintf (" Smite: unable to find %s (Mip %d) in MergedFileIndexCache\n " , buf, MipIndex);
672
+ return false ;
673
+ }
674
+ FArchive* free = Ar;
675
+
676
+ FCompressedChunkHeader H;
677
+ *Ar << H;
678
+ TArray<FCompressedChunk> Chunks;
679
+ FCompressedChunk *Chunk = new (Chunks) FCompressedChunk;
680
+ Chunk->UncompressedOffset = 0 ;
681
+ Chunk->UncompressedSize = H.Sum .UncompressedSize ;
682
+ Chunk->CompressedOffset = 0 ;
683
+ Chunk->CompressedSize = H.Sum .CompressedSize ;
684
+ FByteBulkData *Bulk = const_cast <FByteBulkData*>(&Mip.Data );
685
+ int flags = 0 ;
686
+ if (Bulk->BulkDataFlags & BULKDATA_CompressedOodle_SMITE) flags = COMPRESS_OODLE;
687
+ else if (Bulk->BulkDataFlags & BULKDATA_CompressedZlib) flags = COMPRESS_ZLIB;
688
+ else if (Bulk->BulkDataFlags & BULKDATA_CompressedLzo) flags = COMPRESS_LZO;
689
+ else if (Bulk->BulkDataFlags & BULKDATA_CompressedLzx) flags = COMPRESS_LZX;
690
+
691
+ if (flags > 0 ) {
692
+ FUE3ArchiveReader* UE3Loader = new FUE3ArchiveReader (Ar, flags, Chunks);
693
+ UE3Loader->IsFullyCompressed = true ;
694
+ Ar = UE3Loader;
695
+ }
696
+
697
+ if (verbose)
698
+ {
699
+ appPrintf (" Reading %s mip level %d (%dx%d) from TFC\n " , texture->Name , MipIndex, Mip.SizeX , Mip.SizeY );
700
+ }
701
+
702
+ Bulk->BulkDataSizeOnDisk = H.Sum .UncompressedSize ;
703
+ Bulk->ElementCount = H.Sum .UncompressedSize ;
704
+ Bulk->BulkDataOffsetInFile = 0 ;
705
+ int backup = Bulk->BulkDataFlags ;
706
+ Bulk->BulkDataFlags = 0 ; // wipe compression flags temporarily
707
+ Bulk->SerializeData (*Ar);
708
+ Bulk->BulkDataFlags = backup;
709
+
710
+ reinterpret_cast <FMemReader*>(free)->Free ();
711
+ delete Ar;
712
+ return true ;
713
+ }
714
+ #endif // SMITE
715
+
646
716
647
717
bool UTexture2D::LoadBulkTexture (const TArray<FTexture2DMipMap> &MipsArray, int MipIndex, const char * tfcSuffix, bool verbose) const
648
718
{
@@ -656,6 +726,13 @@ bool UTexture2D::LoadBulkTexture(const TArray<FTexture2DMipMap> &MipsArray, int
656
726
FStaticString<MAX_PACKAGE_PATH> bulkFileName;
657
727
if (TextureFileCacheName != " None" )
658
728
{
729
+ #if SMITE
730
+ if (GForceGame == GAME_Smite) {
731
+ if (LoadBulkTextureSMITE (this , MipsArray, MipIndex, verbose)) {
732
+ return true ;
733
+ }
734
+ }
735
+ #endif
659
736
// TFC file is assigned
660
737
bulkFileName = *TextureFileCacheName;
661
738
0 commit comments