public void Execute(int index) { // copy storage data from unmanaged to managed using (var data = MemHelper.ToByteArray(Data[index], DataLength[index])) { // do the work, managed Engine.VPT.Table.TableLoader.LoadGameItem(data.Value, index, out var itemType, out var item); // convert result back to unmanaged ItemObj[index] = MemHelper.ToIntPtr(item); ItemType[index] = (int)itemType; } }
public static Table LoadTable(string path) { var table = Table.Load(path, false); var job = new GameItemJob(table.Data.NumGameItems); var gameItems = Engine.VPT.Table.TableLoader.ReadGameItems(path, table.Data.NumGameItems); for (var i = 0; i < table.Data.NumGameItems; i++) { job.Data[i] = MemHelper.FromByteArray(gameItems[i]); job.DataLength[i] = gameItems[i].Length; } // parse threaded var handle = job.Schedule(table.Data.NumGameItems, 64); handle.Complete(); // update table with results for (var i = 0; i < table.Data.NumGameItems; i++) { if (job.ItemObj[i].ToInt32() > 0) { var objHandle = (GCHandle)job.ItemObj[i]; switch ((ItemType)job.ItemType[i]) { case ItemType.Bumper: { table.Add(objHandle.Target as Bumper); break; } case ItemType.Decal: { table.Add(objHandle.Target as Decal); break; } case ItemType.DispReel: { table.Add(objHandle.Target as DispReel); break; } case ItemType.Flasher: { table.Add(objHandle.Target as Flasher); break; } case ItemType.Flipper: { table.Add(objHandle.Target as Flipper); break; } case ItemType.Gate: { table.Add(objHandle.Target as Gate); break; } case ItemType.HitTarget: { table.Add(objHandle.Target as HitTarget); break; } case ItemType.Kicker: { table.Add(objHandle.Target as Kicker); break; } case ItemType.Light: { table.Add(objHandle.Target as Light); break; } case ItemType.LightSeq: { table.Add(objHandle.Target as LightSeq); break; } case ItemType.Plunger: { table.Add(objHandle.Target as Plunger); break; } case ItemType.Primitive: { table.Add(objHandle.Target as Primitive); break; } case ItemType.Ramp: { table.Add(objHandle.Target as Ramp); break; } case ItemType.Rubber: { table.Add(objHandle.Target as Rubber); break; } case ItemType.Spinner: { table.Add(objHandle.Target as Spinner); break; } case ItemType.Surface: { table.Add(objHandle.Target as Surface); break; } case ItemType.TextBox: { table.Add(objHandle.Target as TextBox); break; } case ItemType.Timer: { table.Add(objHandle.Target as Timer); break; } case ItemType.Trigger: { table.Add(objHandle.Target as Trigger); break; } default: throw new ArgumentException("Unknown item type " + (ItemType)job.ItemType[i] + "."); } } } table.SetupPlayfieldMesh(); job.Dispose(); return(table); }