Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions Spore ModAPI/SourceCode/App/App.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,27 +25,27 @@ namespace App
auto_METHOD(Thumbnail_cImportExport, bool, FolderPathFromLocale,
Args(uint32_t instanceID, eastl::string16& dst, uint32_t tableID), Args(instanceID, dst, tableID));

auto_METHOD(Thumbnail_cImportExport, bool, SavePNG,
auto_METHOD(Thumbnail_cImportExport, bool, SaveMIP,
Args(Resource::ResourceObject* pResource, RenderWare::Raster* pImage, Resource::Database* pDBPF,
bool forceReplace, bool disableSteganography),
Args(pResource, pImage, pDBPF, forceReplace, disableSteganography));

auto_METHOD(Thumbnail_cImportExport, bool, ImportPNG,
auto_METHOD(Thumbnail_cImportExport, bool, ImportMIP,
Args(const char16_t* path, ResourceKey& key), Args(path, key));

auto_METHOD(Thumbnail_cImportExport, bool, DecodePNG,
auto_METHOD(Thumbnail_cImportExport, bool, DecodeMIP,
Args(IO::IStream* stream, ThumbnailDecodedMetadata& dstMetadata, IStreamPtr& dstDataStream),
Args(stream, dstMetadata, dstDataStream));

auto_METHOD_(Thumbnail_cImportExport, bool, SaveFilePaths);

auto_METHOD(Thumbnail_cImportExport, bool, ImportDirectoryPNGs,
auto_METHOD(Thumbnail_cImportExport, bool, ImportDirectoryMIPs,
Args(const eastl::string16& path, eastl::hash_set<eastl::string16>& dstSkippedPaths, int& dstCount),
Args(path, dstSkippedPaths, dstCount));

auto_METHOD(PngEncoder, bool, EncodePNG,
Args(IO::IStream* stream, int mode),
Args(stream, mode));
auto_METHOD(MIPEncoder, bool, WriteImageToStream,
Args(IO::IStream* stream, App::MIPEncoder::Format format),
Args(stream, format));


auto_STATIC_METHOD_(cIDGenerator, cIDGenerator*, Get);
Expand Down
12 changes: 6 additions & 6 deletions Spore ModAPI/SourceCode/DLL/AddressesApp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -407,16 +407,16 @@ namespace App
DefineAddress(Get, SelectAddress(0x5F7750, 0x5F79C0));
DefineAddress(GetFolderPath, SelectAddress(0x5F9140, 0x5F92C0));
DefineAddress(FolderPathFromLocale, SelectAddress(0x5F9220, 0x5F93A0));
DefineAddress(SavePNG, SelectAddress(0x5FA7E0, 0x5FA960));
DefineAddress(ImportPNG, SelectAddress(0x5FC240, 0x5FC3C0));
DefineAddress(DecodePNG, SelectAddress(0x5FBA10, 0x5FBB90));
DefineAddress(SaveMIP, SelectAddress(0x5FA7E0, 0x5FA960));
DefineAddress(ImportMIP, SelectAddress(0x5FC240, 0x5FC3C0));
DefineAddress(DecodeMIP, SelectAddress(0x5FBA10, 0x5FBB90));
DefineAddress(SaveFilePaths, SelectAddress(0x5F89C0, 0x5F8B60));
DefineAddress(ImportDirectoryPNGs, SelectAddress(0x5FC900, 0x5FCA80));
DefineAddress(ImportDirectoryMIPs, SelectAddress(0x5FC900, 0x5FCA80));
}

namespace Addresses(PngEncoder)
namespace Addresses(MIPEncoder)
{
DefineAddress(EncodePNG, SelectAddress(0x68E660, 0x68e190));
DefineAddress(WriteImageToStream, SelectAddress(0x68E660, 0x68e190));
}

namespace Addresses(cLocaleManager)
Expand Down
48 changes: 48 additions & 0 deletions Spore ModAPI/SourceCode/DLL/AddressesIO.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include <Spore\IO\StreamFixedMemory.h>
#include <Spore\IO\StreamMemory.h>
#include <Spore\IO\StreamNull.h>
#include <Spore\IO\StreamCompressionZLib.h>
#include <Spore\IO\XmlWriter.h>

namespace Addresses(IO)
Expand Down Expand Up @@ -220,5 +221,52 @@ namespace IO
DefineAddress(Exists, SelectAddress(0x9327F0, 0x932280));
DefineAddress(Remove, SelectAddress(0x932510, 0x932860));
}

namespace Addresses(StreamCompressionZLib)
{
DefineAddress(AddRef, SelectAddress(0x614940, 0x7685A0));
DefineAddress(Release, SelectAddress(0x707F90, 0x67D9F0));
DefineAddress(GetType, SelectAddress(0x672FC0, 0x67DAB0));
DefineAddress(GetAccessFlags, SelectAddress(0x672850, 0x67D2C0));
DefineAddress(GetState, SelectAddress(0x672860, 0x67D2D0));
DefineAddress(Close, SelectAddress(0x672C70, 0x67D6E0));
DefineAddress(GetSize, SelectAddress(0x672A70, 0x67D3A0));
DefineAddress(SetSize, SelectAddress(0x9F8EB0, 0xDDE930));
DefineAddress(GetPosition, SelectAddress(0x672930, 0x67D3B0));
DefineAddress(SetPosition, SelectAddress(0x7A4230, 0x950E00));
DefineAddress(GetAvailable, SelectAddress(0x60C030, 0xE21A90));
DefineAddress(Read, SelectAddress(0xF95C60, 0x1097390));
DefineAddress(Flush, SelectAddress(0xC65B10, 0xB1FB30));
DefineAddress(Write, SelectAddress(0x672BD0, 0x67D640));
DefineAddress(SetCompressedFormat, SelectAddress(0x6727D0, 0x67D240));
DefineAddress(SetBufferSize, SelectAddress(0x6727F0, 0x67D260));
DefineAddress(SetCompressionHint, SelectAddress(0x672830, 0x67D2A0));
DefineAddress(Open, SelectAddress(0x672AA0, 0x67D510));
// destructor; private for ModAPI
DefineAddress(Dispose, SelectAddress(0x67DC30, 0x67DAD0));
}

namespace Addresses(StreamDecompressionZLib)
{
DefineAddress(AddRef, SelectAddress(0x614940, 0x7685A0));
DefineAddress(Release, SelectAddress(0x707F90, 0x67D9F0));
DefineAddress(GetType, SelectAddress(0x672DA0, 0x67D830));
DefineAddress(GetAccessFlags, SelectAddress(0x6729A0, 0x67D420));
DefineAddress(GetState, SelectAddress(0x6729B0, 0x67D430));
DefineAddress(Close, SelectAddress(0x672F40, 0x67D9D0));
DefineAddress(GetSize, SelectAddress(0x672A70, 0x67D3A0));
DefineAddress(SetSize, SelectAddress(0x9F8EB0, 0xDDE930));
DefineAddress(GetPosition, SelectAddress(0x672A80, 0x67D4F0));
DefineAddress(SetPosition, SelectAddress(0x7A4230, 0x950E00));
DefineAddress(GetAvailable, SelectAddress(0x60C030, 0xE21A90));
DefineAddress(Read, SelectAddress(0x672E90, 0x67D920));
DefineAddress(Flush, SelectAddress(0xAF5C80, 0xB1E410));
DefineAddress(Write, SelectAddress(0x7A4230, 0x950E00));
DefineAddress(SetCompressedFormat, SelectAddress(0x672950, 0x67D3D0));
DefineAddress(SetBufferSize, SelectAddress(0x672960, 0x67D3E0));
DefineAddress(Open, SelectAddress(0x672DC0, 0x67D850));
// destructor; private for ModAPI
DefineAddress(Dispose, SelectAddress(0x67DCE0, 0x67DB80));
}
}
#endif
97 changes: 97 additions & 0 deletions Spore ModAPI/SourceCode/IO/StreamDefinitions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include <Spore\IO\StreamFixedMemory.h>
#include <Spore\IO\StreamMemory.h>
#include <Spore\IO\StreamNull.h>
#include <Spore\IO\StreamCompressionZLib.h>

namespace IO
{
Expand Down Expand Up @@ -395,5 +396,101 @@ namespace IO
auto_METHOD(StreamNull, int, Write, Args(const void* pData, size_t nSize), Args(pData, nSize));

//////////////////////


/////////////////////////////////
//// StreamCompressionZLib.h ////
/////////////////////////////////

StreamCompressionZLib::StreamCompressionZLib(IStream* pOutputStream, int nHint)
: mpOutputStream(NULL),
mbOpen(false),
mbInited(false),
mpZLibStream(NULL),
mFormat(kCompressedFormatZLib),
mHint(nHint),
mpOutputBuffer(NULL),
mnOutputBufferSize(0x2000)
{
if (pOutputStream)
StreamCompressionZLib::Open(pOutputStream, nHint);
}

StreamCompressionZLib::~StreamCompressionZLib()
{
Dispose();
}

auto_METHOD_(StreamCompressionZLib, int, AddRef);
auto_METHOD_(StreamCompressionZLib, int, Release);

auto_METHOD_const_(StreamCompressionZLib, uint32_t, GetType);
auto_METHOD_const_(StreamCompressionZLib, AccessFlags, GetAccessFlags);
auto_METHOD_const_(StreamCompressionZLib, FileError, GetState);
auto_METHOD_(StreamCompressionZLib, bool, Close);

auto_METHOD_const_(StreamCompressionZLib, size_type, GetSize);
auto_METHOD(StreamCompressionZLib, bool, SetSize, Args(size_type size), Args(size));
auto_METHOD_const(StreamCompressionZLib, int, GetPosition, Args(PositionType positionType), Args(positionType));
auto_METHOD(StreamCompressionZLib, bool, SetPosition, Args(int distance, PositionType positionType), Args(distance, positionType));
auto_METHOD_const_(StreamCompressionZLib, int, GetAvailable);

auto_METHOD(StreamCompressionZLib, int, Read, Args(void* pData, size_t nSize), Args(pData, nSize));
auto_METHOD_(StreamCompressionZLib, bool, Flush);
auto_METHOD(StreamCompressionZLib, int, Write, Args(const void* pData, size_t nSize), Args(pData, nSize));

auto_METHOD(StreamCompressionZLib, bool, SetCompressedFormat, Args(CompressedFormat format), Args(format));
auto_METHOD(StreamCompressionZLib, bool, SetBufferSize, Args(size_t nOutputBufferSize), Args(nOutputBufferSize));
auto_METHOD(StreamCompressionZLib, bool, SetCompressionHint, Args(int hint), Args(hint));

auto_METHOD(StreamCompressionZLib, bool, Open, Args(IStream* pOutputStream, int nHint), Args(pOutputStream, nHint));

// destructor, private for ModAPI
auto_METHOD_VOID_(StreamCompressionZLib, Dispose);

StreamDecompressionZLib::StreamDecompressionZLib(IStream* pInputStream)
: mpInputStream(NULL),
mFormat(kCompressedFormatZLib),
mbOpen(false),
mbEOF(false),
mbInited(false),
mpZLibStream(NULL),
mpInputBuffer(NULL),
mnInputBufferSize(0x2000)
{}

StreamDecompressionZLib::~StreamDecompressionZLib()
{
Dispose();
}

auto_METHOD_(StreamDecompressionZLib, int, AddRef);
auto_METHOD_(StreamDecompressionZLib, int, Release);

auto_METHOD_const_(StreamDecompressionZLib, uint32_t, GetType);
auto_METHOD_const_(StreamDecompressionZLib, AccessFlags, GetAccessFlags);
auto_METHOD_const_(StreamDecompressionZLib, FileError, GetState);
auto_METHOD_(StreamDecompressionZLib, bool, Close);

auto_METHOD_const_(StreamDecompressionZLib, size_type, GetSize);
auto_METHOD(StreamDecompressionZLib, bool, SetSize, Args(size_type size), Args(size));
auto_METHOD_const(StreamDecompressionZLib, int, GetPosition, Args(PositionType positionType), Args(positionType));
auto_METHOD(StreamDecompressionZLib, bool, SetPosition, Args(int distance, PositionType positionType), Args(distance, positionType));
auto_METHOD_const_(StreamDecompressionZLib, int, GetAvailable);

auto_METHOD(StreamDecompressionZLib, int, Read, Args(void* pData, size_t nSize), Args(pData, nSize));
auto_METHOD_(StreamDecompressionZLib, bool, Flush);
auto_METHOD(StreamDecompressionZLib, int, Write, Args(const void* pData, size_t nSize), Args(pData, nSize));

auto_METHOD(StreamDecompressionZLib, bool, SetCompressedFormat, Args(CompressedFormat format), Args(format));
auto_METHOD(StreamDecompressionZLib, bool, SetBufferSize, Args(size_t nInputBufferSize), Args(nInputBufferSize));

auto_METHOD(StreamDecompressionZLib, bool, Open, Args(IStream* pInputStream), Args(pInputStream));

// destructor, private for ModAPI
auto_METHOD_VOID_(StreamDecompressionZLib, Dispose);

/////////////////////////////////

#endif
}
1 change: 1 addition & 0 deletions Spore ModAPI/Spore ModAPI.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,7 @@
<ClInclude Include="Spore\Editors\cSPEditorVerbTrayCollection.h" />
<ClInclude Include="Spore\Editors\cSPEditorVerbIcon.h" />
<ClInclude Include="Spore\Editors\cSPEditorVerbIconTray.h" />
<ClInclude Include="Spore\IO\StreamCompressionZLib.h" />
<ClInclude Include="Spore\UI\cSPUIPropertyLayout.h" />
<ClInclude Include="Spore\Editors\cSPVerbIconRollover.h" />
<ClInclude Include="Spore\Editors\cSPVerbTrayCollection.h" />
Expand Down
3 changes: 3 additions & 0 deletions Spore ModAPI/Spore ModAPI.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -2286,6 +2286,9 @@
<ClInclude Include="Spore\UI\cSPUIPropertyLayout.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Spore\IO\StreamCompressionZLib.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="SourceCode\Allocator.cpp">
Expand Down
42 changes: 25 additions & 17 deletions Spore ModAPI/Spore/App/Thumbnail_cImportExport.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,17 @@

namespace App
{
struct PngEncoder {
struct MIPEncoder {

enum Format {
kImageFormatPNG,
kImageFormatTGA,
kImageFormatBMP
};

bool WriteImageToStream(IO::IStream* outputStream, Format format);


bool EncodePNG(IO::IStream* outputStream, int mode);

/* 00h */ eastl::vector<int> mPixelBuf;
/* 14h */ uint32_t mnImageWidth;
Expand All @@ -39,7 +47,7 @@ namespace App
/* 58h */ eastl::vector<int8_t> mData;
/* 6Ch */ int field_6C;
};
ASSERT_SIZE(PngEncoder, 0x70);
ASSERT_SIZE(MIPEncoder, 0x70);

struct ThumbnailDecodedMetadata
{
Expand Down Expand Up @@ -83,11 +91,11 @@ namespace App
/// @param[out] dst The eastl::string where the path will be written.
bool GetFolderPath(uint32_t creationType, eastl::string16& dst);

/// Used to obtain a path from a locale file, by default `0x19F76D11.locale`, similar to the one that would
/// Used to obtain a path from a locale file, by default `SaveDataFolders.locale`, similar to the one that would
/// return GetFolderPath()
bool FolderPathFromLocale(uint32_t instanceID, eastl::string16& dst, uint32_t tableID = 0xFFFFFFFF);

/// Encodes the given resource into a `.png` image and saves it, both in the given package and in the
/// Encodes the given resource into a `.png` Model-in-Picture and saves it, both in the given package and in the
/// "My Spore Creations" in the user Documents folder.
///
/// In the package, the image will be saved using the same ResourceKey as the resource, but with a TypeIDs::png type.
Expand All @@ -100,21 +108,21 @@ namespace App
/// @param forceReplace [Optional] If false (by default), if the `.png` already exists in the folder, it will try writing variants like `(1)`, `(2)`,...
/// @param disableSteganography [Optional] If false (by default), the data in the `.png` will be stored in a special way meant to save space.
/// @returns `true` on success, `false` if something failed.
bool SavePNG(Resource::ResourceObject* pResource, RenderWare::Raster* pImage, Resource::Database* database,
bool SaveMIP(Resource::ResourceObject* pResource, RenderWare::Raster* pImage, Resource::Database* database,
bool forceReplace = false, bool disableSteganography = false);

/// Reads the PNG file from the given file path, and adds the creation found within to the Sporepedia if it hasn't been added yet.
///
/// @param path The full path to the file being read.
/// @param key Resource key to the creation being read.
/// @returns 'true' on success, 'false' if something failed.
bool ImportPNG(const char16_t* path, ResourceKey& key);
bool ImportMIP(const char16_t* path, ResourceKey& key);

/// Extracts information from a PNG file. It extracts both the metadata, and the data encoded within the image.
/// Extracts information from a Model-in-Picture PNG file. It extracts both the metadata, and the data encoded within the image.
/// @param[out] dstMetadata
/// @param[out] dstDataStream
/// @returns true on success, false if something failed
bool DecodePNG(IO::IStream* stream, ThumbnailDecodedMetadata& dstMetadata, IStreamPtr& dstDataStream);
bool DecodeMIP(IO::IStream* stream, ThumbnailDecodedMetadata& dstMetadata, IStreamPtr& dstDataStream);

/// Saves the file paths information that keeps track of which PNGs have been loaded.
/// It saves it in file `0x473C3E6!0x473C3E6.0x473C3E6` of Resource::SaveAreaID::Server (`Pollination.package`)
Expand All @@ -129,7 +137,7 @@ namespace App
/// @param[out] dstSkippedPaths A list of paths that were skipped because they were already in mPngPathToKey or too many files were loaded
/// @param[out] dstCount The number of PNGs that were imported is added to this value
/// @returns True if some PNG was loaded, false otherwise
bool ImportDirectoryPNGs(const eastl::string16& directoryPath, eastl::hash_set<eastl::string16>& dstSkippedPaths, int& dstCount);
bool ImportDirectoryMIPs(const eastl::string16& directoryPath, eastl::hash_set<eastl::string16>& dstSkippedPaths, int& dstCount);

static Thumbnail_cImportExport* Get();

Expand All @@ -140,7 +148,7 @@ namespace App
/* 44h */ uint32_t mMachineId; // not initialized
/* 48h */ eastl::hash_map<int, int> field_48;
/* 68h */ eastl::hash_map<int, int> field_68;
/* 88h */ PngEncoder mPngEncoder;
/* 88h */ MIPEncoder mMipEncoder;
/* F8h */ ResourceKey mCurImage;
/* 104h */ eastl::string16 mCellsPath;
/* 114h */ eastl::string16 mCreaturesPath;
Expand All @@ -159,15 +167,15 @@ namespace App
DeclareAddress(Get);
DeclareAddress(GetFolderPath);
DeclareAddress(FolderPathFromLocale);
DeclareAddress(SavePNG);
DeclareAddress(ImportPNG);
DeclareAddress(DecodePNG); // 0x5FBA10 0x5FBB90
DeclareAddress(SaveMIP);
DeclareAddress(ImportMIP);
DeclareAddress(DecodeMIP); // 0x5FBA10 0x5FBB90
DeclareAddress(SaveFilePaths); // 0x5F89C0 0x5F8B60
DeclareAddress(ImportDirectoryPNGs); // 0x5FC900 0x5FCA80
DeclareAddress(ImportDirectoryMIPs); // 0x5FC900 0x5FCA80
}

namespace Addresses(PngEncoder)
namespace Addresses(MIPEncoder)
{
DeclareAddress(EncodePNG); // 0x68E660 0x68e190
DeclareAddress(WriteImageToStream); // 0x68E660 0x68e190
}
}
Loading
Loading