Skip to content

Commit

Permalink
BA2 support
Browse files Browse the repository at this point in the history
  • Loading branch information
ousnius committed Nov 13, 2015
1 parent dcd1208 commit 3e46c11
Show file tree
Hide file tree
Showing 12 changed files with 816 additions and 416 deletions.
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "BSAManager/zlib"]
path = BSAManager/zlib
url = https://github.com/madler/zlib
43 changes: 29 additions & 14 deletions BSAManager/BSAManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,17 @@ bool BSAManagerApp::OnCmdLineParsed(wxCmdLineParser& parser)
void BSAManagerApp::InitBSA(wxArrayString files)
{
frame->bsaTree->Freeze();
frame->statusBar->SetStatusText("Initializing BSAs...");
frame->statusBar->SetStatusText("Initializing archives...");

frame->bsaTree->DeleteAllItems();
tree.clear();

std::vector<std::string> vecFiles;
for (auto &f : files)
vecFiles.push_back(f.ToStdString());

FSManager::del();
FSManager::addArchives(files);
FSManager::addArchives(vecFiles);

for (FSArchiveFile *archive : FSManager::archiveList())
{
Expand All @@ -69,7 +74,7 @@ void BSAManagerApp::InitBSA(wxArrayString files)
void BSAManagerApp::LoadTree()
{
if (frame->bsaTree && !frame->bsaTree->GetRootItem().IsOk())
frame->bsaTree->AddRoot("BSA");
frame->bsaTree->AddRoot("Archives");

std::string currentSub;
std::string bsaName;
Expand All @@ -80,7 +85,7 @@ void BSAManagerApp::LoadTree()
for (auto it : tree)
{
wxString iter(it);
if (iter.EndsWith(".bsa"))
if (iter.EndsWith(".bsa") || iter.EndsWith(".ba2"))
{
currentRoot = frame->bsaTree->GetRootItem();
currentSub.clear();
Expand Down Expand Up @@ -169,7 +174,7 @@ int BSAManagerApp::ExportFile(const wxString& bsaName, const wxString& fileName,
{
if (archive && archive->name() == bsaName)
{
if (!archive->exportFile(fileName, targetPath))
if (!archive->exportFile(fileName.ToStdString(), targetPath.ToStdString()))
return 1;

break;
Expand All @@ -185,7 +190,7 @@ int BSAManagerApp::ExportFolder(const wxString& bsaName, const wxString& folderN
{
if (archive && archive->name() == bsaName)
{
archive->addFilesOfFolders(folderName, bsaTree);
archive->addFilesOfFolders(folderName.ToStdString(), bsaTree);
}
}

Expand All @@ -211,7 +216,7 @@ BSAManager::BSAManager(wxWindow* parent, wxWindowID id, const wxString& title, c
SetSizeHints(wxDefaultSize, wxDefaultSize);

toolBar = CreateToolBar(wxTB_VERTICAL, wxID_ANY);
toolBar->AddTool(0, wxEmptyString, wxArtProvider::GetBitmap(wxART_FILE_OPEN), wxNullBitmap, wxITEM_NORMAL, "Open BSA...", "Open BSA...");
toolBar->AddTool(0, wxEmptyString, wxArtProvider::GetBitmap(wxART_FILE_OPEN), wxNullBitmap, wxITEM_NORMAL, "Open archive...", "Open archive...");
toolBar->AddTool(1, wxEmptyString, wxArtProvider::GetBitmap(wxART_GO_HOME), wxNullBitmap, wxITEM_NORMAL, "Set as default program", "Set as default program");
toolBar->Realize();

Expand Down Expand Up @@ -299,6 +304,9 @@ void BSAManager::bsaTreeOnContextMenu(wxCommandEvent& event)
text = ((BSATreeItemData*)bsaTree->GetItemData(id))->GetPath();

int bsaNamePos = text.Find(".bsa");
if (bsaNamePos == wxNOT_FOUND)
bsaNamePos = text.find(".ba2");

if (bsaNamePos != wxNOT_FOUND)
{
wxString bsaName(text.SubString(0, bsaNamePos + 3));
Expand Down Expand Up @@ -372,8 +380,11 @@ void BSAManager::toolBarOpenClicked(wxCommandEvent& event)
{
case 0: // Open
{
wxFileDialog file(this, "Choose one or more archives...", wxEmptyString, wxEmptyString, "BSA|*.bsa", wxFD_DEFAULT_STYLE | wxFD_MULTIPLE);
file.ShowModal();
wxFileDialog file(this, "Choose one or more archives...", wxEmptyString, wxEmptyString,
"Archives (*.bsa;*.ba2)|*.bsa;*.ba2", wxFD_DEFAULT_STYLE | wxFD_MULTIPLE);

if (file.ShowModal() != wxID_OK)
break;

wxArrayString files;
file.GetPaths(files);
Expand All @@ -384,7 +395,7 @@ void BSAManager::toolBarOpenClicked(wxCommandEvent& event)

case 1: // Set as default program
{
int res = wxMessageBox("Do you want to set this program as the .BSA default for all users (requires admin elevation)?", "BSA Manager", wxYES_NO);
int res = wxMessageBox("Do you want to set this program as the .BSA and .BA2 default for all users (requires admin elevation)?", "BSA Manager", wxYES_NO);
if (res == wxYES)
{
wxRegKey keyApp(wxRegKey::HKLM, "Software\\Classes\\Applications\\" + wxFileName::FileName(wxStandardPaths::Get().GetExecutablePath()).GetFullName() + "\\shell\\open\\command");
Expand All @@ -404,9 +415,13 @@ void BSAManager::toolBarOpenClicked(wxCommandEvent& event)
if (keyIcon.Create())
keyIcon.SetValue(wxEmptyString, wxStandardPaths::Get().GetExecutablePath() + ",0");

wxRegKey keyExt(wxRegKey::HKLM, "Software\\Classes\\.bsa");
if (keyExt.Create())
keyExt.SetValue(wxEmptyString, "BSAManager");
wxRegKey keyExtBSA(wxRegKey::HKLM, "Software\\Classes\\.bsa");
if (keyExtBSA.Create())
keyExtBSA.SetValue(wxEmptyString, "BSAManager");

wxRegKey keyExtBA2(wxRegKey::HKLM, "Software\\Classes\\.ba2");
if (keyExtBA2.Create())
keyExtBA2.SetValue(wxEmptyString, "BSAManager");
}
break;
}
Expand All @@ -420,7 +435,7 @@ bool DnDBSA::OnDropFiles(wxCoord, wxCoord, const wxArrayString& fileNames)
{
wxArrayString bsaFileNames;
for (auto &fn : fileNames)
if (fn.EndsWith(".bsa"))
if (fn.EndsWith(".bsa") || fn.EndsWith(".ba2"))
bsaFileNames.Add(fn);

if (!bsaFileNames.IsEmpty())
Expand Down
1 change: 1 addition & 0 deletions BSAManager/BSAManager.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="BSAManager.h" />
<ClInclude Include="DDS.h" />
<ClInclude Include="FSBSA.h" />
<ClInclude Include="FSEngine.h" />
<ClInclude Include="FSManager.h" />
Expand Down
3 changes: 3 additions & 0 deletions BSAManager/BSAManager.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@
<ClInclude Include="Resource.h">
<Filter>Headerdateien</Filter>
</ClInclude>
<ClInclude Include="DDS.h">
<Filter>Headerdateien</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="BSAManager.cpp">
Expand Down
112 changes: 112 additions & 0 deletions BSAManager/DDS.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
//--------------------------------------------------------------------------------------
// dds.h
//
// This header defines constants and structures that are useful when parsing
// DDS files. DDS files were originally designed to use several structures
// and constants that are native to DirectDraw and are defined in ddraw.h,
// such as DDSURFACEDESC2 and DDSCAPS2. This file defines similar
// (compatible) constants and structures so that one can use DDS files
// without needing to include ddraw.h.
//--------------------------------------------------------------------------------------

#pragma once

#include <windows.h>
#include <dxgiformat.h>

#pragma pack(push,1)

#define DDS_MAGIC 0x20534444 // "DDS "

struct DDS_PIXELFORMAT
{
DWORD dwSize;
DWORD dwFlags;
DWORD dwFourCC;
DWORD dwRGBBitCount;
DWORD dwRBitMask;
DWORD dwGBitMask;
DWORD dwBBitMask;
DWORD dwABitMask;
};

#define DDS_FOURCC 0x00000004 // DDPF_FOURCC
#define DDS_RGB 0x00000040 // DDPF_RGB
#define DDS_RGBA 0x00000041 // DDPF_RGB | DDPF_ALPHAPIXELS
#define DDS_LUMINANCE 0x00020000 // DDPF_LUMINANCE
#define DDS_ALPHA 0x00000002 // DDPF_ALPHA

const DDS_PIXELFORMAT DDSPF_DXT1 =
{ sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','1'), 0, 0, 0, 0, 0 };

const DDS_PIXELFORMAT DDSPF_DXT2 =
{ sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','2'), 0, 0, 0, 0, 0 };

const DDS_PIXELFORMAT DDSPF_DXT3 =
{ sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','3'), 0, 0, 0, 0, 0 };

const DDS_PIXELFORMAT DDSPF_DXT4 =
{ sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','4'), 0, 0, 0, 0, 0 };

const DDS_PIXELFORMAT DDSPF_DXT5 =
{ sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','5'), 0, 0, 0, 0, 0 };

const DDS_PIXELFORMAT DDSPF_A8R8G8B8 =
{ sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 };

const DDS_PIXELFORMAT DDSPF_A1R5G5B5 =
{ sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 16, 0x00007c00, 0x000003e0, 0x0000001f, 0x00008000 };

const DDS_PIXELFORMAT DDSPF_A4R4G4B4 =
{ sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 16, 0x00000f00, 0x000000f0, 0x0000000f, 0x0000f000 };

const DDS_PIXELFORMAT DDSPF_R8G8B8 =
{ sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 24, 0x00ff0000, 0x0000ff00, 0x000000ff, 0x00000000 };

const DDS_PIXELFORMAT DDSPF_R5G6B5 =
{ sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 16, 0x0000f800, 0x000007e0, 0x0000001f, 0x00000000 };

// This indicates the DDS_HEADER_DXT10 extension is present (the format is in dxgiFormat)
const DDS_PIXELFORMAT DDSPF_DX10 =
{ sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','1','0'), 0, 0, 0, 0, 0 };

#define DDS_HEADER_FLAGS_TEXTURE 0x00001007 // DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT
#define DDS_HEADER_FLAGS_MIPMAP 0x00020000 // DDSD_MIPMAPCOUNT
#define DDS_HEADER_FLAGS_VOLUME 0x00800000 // DDSD_DEPTH
#define DDS_HEADER_FLAGS_PITCH 0x00000008 // DDSD_PITCH
#define DDS_HEADER_FLAGS_LINEARSIZE 0x00080000 // DDSD_LINEARSIZE

#define DDS_SURFACE_FLAGS_TEXTURE 0x00001000 // DDSCAPS_TEXTURE
#define DDS_SURFACE_FLAGS_MIPMAP 0x00400008 // DDSCAPS_COMPLEX | DDSCAPS_MIPMAP
#define DDS_SURFACE_FLAGS_CUBEMAP 0x00000008 // DDSCAPS_COMPLEX

#define DDS_CUBEMAP_POSITIVEX 0x00000600 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEX
#define DDS_CUBEMAP_NEGATIVEX 0x00000a00 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEX
#define DDS_CUBEMAP_POSITIVEY 0x00001200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEY
#define DDS_CUBEMAP_NEGATIVEY 0x00002200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEY
#define DDS_CUBEMAP_POSITIVEZ 0x00004200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEZ
#define DDS_CUBEMAP_NEGATIVEZ 0x00008200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEZ

#define DDS_CUBEMAP_ALLFACES ( DDS_CUBEMAP_POSITIVEX | DDS_CUBEMAP_NEGATIVEX |\
DDS_CUBEMAP_POSITIVEY | DDS_CUBEMAP_NEGATIVEY |\
DDS_CUBEMAP_POSITIVEZ | DDS_CUBEMAP_NEGATIVEZ )

#define DDS_FLAGS_VOLUME 0x00200000 // DDSCAPS2_VOLUME

typedef struct
{
DWORD dwSize;
DWORD dwHeaderFlags;
DWORD dwHeight;
DWORD dwWidth;
DWORD dwPitchOrLinearSize;
DWORD dwDepth; // only if DDS_HEADER_FLAGS_VOLUME is set in dwHeaderFlags
DWORD dwMipMapCount;
DWORD dwReserved1[11];
DDS_PIXELFORMAT ddspf;
DWORD dwSurfaceFlags;
DWORD dwCubemapFlags;
DWORD dwReserved2[3];
} DDS_HEADER;

#pragma pack(pop)
Loading

0 comments on commit 3e46c11

Please sign in to comment.