Skip to content

Commit

Permalink
Refactoring, threaded out bulk testing, made sure all jsons update wh…
Browse files Browse the repository at this point in the history
…en new files are added.
  • Loading branch information
AesirHod committed Feb 13, 2021
1 parent a61953f commit 1e58547
Show file tree
Hide file tree
Showing 7 changed files with 409 additions and 249 deletions.
20 changes: 17 additions & 3 deletions Recombobulator/AddFileForm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,26 +30,40 @@ public void Initialize(Repository repository, string fileName, bool isLevel, Lis
{
_repository = repository;

string textureSetName = fileName;

if (isLevel)
{
pathTextBox.Text = _repository.MakeAreaFilePath(fileName);
FullPath = _repository.MakeAreaFilePath(fileName, true);
pathTextBox.Text = _repository.MakeLevelFilePath(fileName);
FullPath = _repository.MakeLevelFilePath(fileName, true);

// Could find an unused one or even validate overwrites of existing levels.
FileID = _repository.Levels.NextAvailableID;

Level existingLevel = repository.Levels.Levels.Find(x => x.UnitName == fileName);
if (existingLevel != null && existingLevel.TextureSet != "")
{
textureSetName = existingLevel.TextureSet;
}
}
else
{
pathTextBox.Text = _repository.MakeObjectFilePath(fileName);
FullPath = _repository.MakeObjectFilePath(fileName, true);

SR1Repository.Object existingObject = repository.Objects.Objects.Find(x => x.ObjectName == fileName);
if (existingObject != null && existingObject.TextureSet != "")
{
textureSetName = existingObject.TextureSet;
}
}

TexSet currentTextureSet = null;
foreach (TexSet textureSet in _repository.TextureSets.TexSets)
{
textureSetCombo.Items.Add(textureSet.Name);

if (textureSet.Name == fileName)
if (textureSet.Name == textureSetName)
{
currentTextureSet = textureSet;
}
Expand Down
245 changes: 133 additions & 112 deletions Recombobulator/MainForm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -102,37 +102,9 @@ private void AddToProjectToolStripMenuItem_Click(object sender, EventArgs e)
try
{
#region Textures
bool isNewTextureSet = false;
TexSet textureSet = _repository.TextureSets.TexSets.Find(x => x.Index == addFileDialog.TextureSet);
TexDesc[] textures = new TexDesc[8];
if (textureSet == null)
{
isNewTextureSet = true;

textureSet = new TexSet();
textureSet.Name = fileName;
textureSet.Index = _repository.TextureSets.Count;

// For the moment, a new texture set contains all new textures.
ushort textureIndex = (ushort)_repository.Textures.Count;
for (int t = 0; t < textures.Length; t++)
{
textureSet.TextureIDs[t] = textureIndex;

textures[t] = new TexDesc();
textures[t].TextureIndex = textureIndex;
textures[t].FilePath = _repository.MakeTextureFilePath(textures[t].TextureIndex);
textures[t].IsNew = true;

textureIndex++;
}
}

if (isNewTextureSet)
{
_repository.Textures.Add(textures);
_repository.TextureSets.Add(textureSet);

CDC.Objects.ExportOptions options = new CDC.Objects.ExportOptions();
SRFile srFile = new SR1File(_file._FilePath, options);
string textureFileName = Path.ChangeExtension(_file._FilePath, "crm");
Expand Down Expand Up @@ -179,99 +151,77 @@ private void AddToProjectToolStripMenuItem_Click(object sender, EventArgs e)

textureFile.BuildTexturesFromPolygonData(polygons, false, true, options);

textureSet = new TexSet();
textureSet.Name = fileName;
textureSet.Index = _repository.TextureSets.Count;

TexDesc[] textures = new TexDesc[8];

ushort textureIndex = (ushort)_repository.Textures.Count;
for (int t = 0; t < textures.Length; t++)
{
Bitmap bitmap;
if (t >= textureFile.TextureCount)
{
bitmap = textureFile.GetTextureAsBitmap(0);
textureSet.TextureIDs[t] = textureIndex;
}
else
{
bitmap = textureFile.GetTextureAsBitmap(t);

int newTextureIndex = textureIndex + t;

string textureName = _repository.MakeTextureFilePath(newTextureIndex, true);
bitmap.Save(textureName);

textures[t] = new TexDesc();
textures[t].TextureIndex = textureIndex + t;
textures[t].FilePath = _repository.MakeTextureFilePath(newTextureIndex);
textures[t].IsNew = true;

_repository.Textures.Add(textures[t]);

textureSet.TextureIDs[t] = (ushort)newTextureIndex;
}
string textureName = _repository.MakeTextureFilePath(textures[t].TextureIndex, true);
bitmap.Save(textureName);
}

_repository.TextureSets.Add(textureSet);
}
catch (Exception)
{
}
}
#endregion

uint fileLength = _file.Export(addFileDialog.FullPath, SR1_File.Version.Retail_PC, textureSet.TextureIDs);
_file.Export(addFileDialog.FullPath, SR1_File.Version.Retail_PC, textureSet.TextureIDs);

object newObject = null;
string category = null;
if (_file._IsLevel)
{
if (_repository.Levels.Levels.Find(x => x.UnitName == fileName) == null)
{
Level level = new Level();
level.UnitName = fileName;
level.StreamUnitID = addFileDialog.FileID;
level.IsNew = true;
level.TextureSet = textureSet.Name;

_repository.Levels.Add(level);
_repository.Levels.NextAvailableID++;

TreeNode node = new TreeNode();
node.Text = level.UnitName;
node.Tag = level;

TreeNode[] nodes = projectTreeView.Nodes.Find("Levels", false);
if (nodes.Length > 0 && nodes[0] != null)
{
nodes[0].Nodes.Add(node);
projectTreeView.Sort();
}
}
newObject = _repository.AddNewLevel(fileName, addFileDialog.FileID, textureSet.Name);
category = "Levels";
}
else
{
if (_repository.Objects.Objects.Find(x => x.ObjectName == fileName) == null)
{
SR1Repository.Object obj = new SR1Repository.Object();
obj.ObjectName = fileName;
obj.IsNew = true;
obj.TextureSet = textureSet.Name;

_repository.Objects.Add(obj);

TreeNode node = new TreeNode();
node.Text = obj.ObjectName;
node.Tag = obj;

TreeNode[] nodes = projectTreeView.Nodes.Find("Objects", false);
if (nodes.Length > 0 && nodes[0] != null)
{
nodes[0].Nodes.Add(node);
projectTreeView.Sort();
}
}
newObject = _repository.AddNewObject(fileName, textureSet.Name);
category = "Objects";
}

string relativePath = addFileDialog.RelativePath;
string extension = Path.GetExtension(relativePath);
int endOfName = relativePath.Length - extension.Length;
uint fileHash = Repository.GetSR1HashName(relativePath);
if (_repository.Assets.Assets.Find(x => x.FileHash == fileHash) == null)
if (newObject != null && category != null)
{
AssetDesc asset = new AssetDesc();

asset.FilePath = relativePath;
asset.FileHash = fileHash;
asset.FileLength = fileLength;
asset.Code.code0 = char.ToUpperInvariant(relativePath[endOfName - 4]);
asset.Code.code1 = char.ToUpperInvariant(relativePath[endOfName - 3]);
asset.Code.code2 = char.ToUpperInvariant(relativePath[endOfName - 2]);
asset.Code.code3 = char.ToUpperInvariant(relativePath[endOfName - 1]);
asset.FileIndex = _repository.Assets.Count;
asset.IsNew = true;

_repository.Assets.Add(asset);
TreeNode[] nodes = projectTreeView.Nodes.Find(category, false);
if (nodes.Length > 0 && nodes[0] != null)
{
TreeNode node = new TreeNode();
node.Text = fileName;
node.Tag = newObject;
nodes[0].Nodes.Add(node);
projectTreeView.Sort();
}
}

_repository.AddNewAsset(addFileDialog.RelativePath);
_repository.SaveRepository();
}
catch (Exception exception)
Expand All @@ -297,17 +247,11 @@ private void DetailedExportToolStripMenuItem_Click(object sender, EventArgs e)

if (dialog.ShowDialog() == DialogResult.OK)
{
testResults.Clear();
string[] exportTestResults = SR1_File.TestFolder(dialog.SelectedPath, true);
foreach (string result in exportTestResults)
{
testResults.Text += result + "\r\n";
}
displayModeTabs.SelectedTab = testResultsTab;
}
Properties.Settings.Default.RecentFolder = dialog.SelectedPath;
Properties.Settings.Default.Save();

Properties.Settings.Default.RecentFolder = dialog.SelectedPath;
Properties.Settings.Default.Save();
DoBulkTesting(dialog.SelectedPath, true);
}
}

private void BriefExportToolStripMenuItem_Click(object sender, EventArgs e)
Expand All @@ -324,17 +268,11 @@ private void BriefExportToolStripMenuItem_Click(object sender, EventArgs e)

if (dialog.ShowDialog() == DialogResult.OK)
{
testResults.Clear();
string[] exportTestResults = SR1_File.TestFolder(dialog.SelectedPath, false);
foreach (string result in exportTestResults)
{
testResults.Text += result + "\r\n";
}
displayModeTabs.SelectedTab = testResultsTab;
}
Properties.Settings.Default.RecentFolder = dialog.SelectedPath;
Properties.Settings.Default.Save();

Properties.Settings.Default.RecentFolder = dialog.SelectedPath;
Properties.Settings.Default.Save();
DoBulkTesting(dialog.SelectedPath, false);
}
}

private void ExitToolStripMenuItem_Click(object sender, EventArgs e)
Expand Down Expand Up @@ -417,6 +355,89 @@ private void EndPacking()
_progressWindow.Dispose();
}

private void BeginBulkTesting()
{
if (_progressWindow != null)
{
_progressWindow.Dispose();
}
_progressWindow = new ProgressWindow();
_progressWindow.Title = "Testing...";
_progressWindow.SetMessage("");
//_progressWindow.Icon = this.Icon;
_progressWindow.Owner = this;
_progressWindow.TopLevel = true;
_progressWindow.ShowInTaskbar = false;
this.Enabled = false;
_progressWindow.Show();
}

private delegate void StringParamInvoker(string results);

private void EndBulkTesting(string results)
{
testResults.Text = results;
displayModeTabs.SelectedTab = testResultsTab;

Enabled = true;
_progressWindow.Hide();
_progressWindow.Dispose();
}

private void DoBulkTesting(string folderName, bool listAllFiles)
{
testResults.Clear();

Invoke(new MethodInvoker(BeginBulkTesting));

int filesRead = 0;
int filesToRead = 0;
string recentMessage = "";

Thread loadingThread = new Thread((() =>
{
string testResults = "";
string[] exportTestResults = SR1_File.TestFolder(folderName, listAllFiles, ref filesRead, ref filesToRead, ref recentMessage);
foreach (string result in exportTestResults)
{
testResults += result + "\r\n";
}

Invoke(new StringParamInvoker(EndBulkTesting), testResults);
}));

loadingThread.Name = "BulkTestingThread";
loadingThread.SetApartmentState(ApartmentState.STA);
loadingThread.Start();
//loadingThread.Join();

Thread progressThread = new Thread((() =>
{
do
{
lock (recentMessage)
{
_progressWindow.SetMessage(recentMessage);
}

if (filesToRead > 0)
{
_progressWindow.SetProgress((100 * filesRead) / filesToRead);
}
else
{
_progressWindow.SetProgress(0);
}
Thread.Sleep(20);
}
while (loadingThread.IsAlive);
}));

progressThread.Name = "ProgressThread";
progressThread.SetApartmentState(ApartmentState.STA);
progressThread.Start();
}

private void NewProjectToolStripMenuItem_Click(object sender, EventArgs e)
{
FolderBrowserDialog folderDialog = new FolderBrowserDialog();
Expand Down
Loading

0 comments on commit 1e58547

Please sign in to comment.