mirror of
https://github.com/AdAstra-LD/DS-Pokemon-Rom-Editor.git
synced 2026-05-10 14:11:04 -05:00
226 lines
7.4 KiB
C#
226 lines
7.4 KiB
C#
using DSPRE;
|
|
using System;
|
|
using System.IO;
|
|
using System.Windows.Forms;
|
|
using static DSPRE.RomInfo;
|
|
|
|
public class GameCamera {
|
|
|
|
public const byte PERSPECTIVE = 0;
|
|
public const byte ORTHO = 1;
|
|
|
|
public uint distance { get; set; }
|
|
|
|
public short vertRot { get; private set; }
|
|
public short horiRot { get; private set; }
|
|
public short zRot { get; private set; }
|
|
public short unk1 { get; private set; }
|
|
|
|
public byte perspMode { get; private set; }
|
|
|
|
public byte unk2 { get; private set; }
|
|
|
|
|
|
public ushort fov { get; private set; }
|
|
public uint nearClip { get; private set; }
|
|
public uint farClip { get; private set; }
|
|
|
|
public int? xOffset { get; private set; }
|
|
public int? yOffset { get; private set; }
|
|
public int? zOffset { get; private set; }
|
|
|
|
public object this[int index] {
|
|
get {
|
|
switch (index) {
|
|
case 0:
|
|
return distance;
|
|
case 1:
|
|
return vertRot;
|
|
case 2:
|
|
return horiRot;
|
|
case 3:
|
|
return zRot;
|
|
case 4:
|
|
return perspMode;
|
|
case 5:
|
|
return fov;
|
|
case 6:
|
|
return nearClip;
|
|
case 7:
|
|
return farClip;
|
|
case 8:
|
|
return xOffset;
|
|
case 9:
|
|
return yOffset;
|
|
case 10:
|
|
return zOffset;
|
|
default:
|
|
throw new ArgumentOutOfRangeException();
|
|
}
|
|
}
|
|
set {
|
|
try {
|
|
switch (index) {
|
|
case 0:
|
|
distance = Convert.ToUInt32(value);
|
|
break;
|
|
case 1:
|
|
vertRot = Convert.ToInt16(value);
|
|
break;
|
|
case 2:
|
|
horiRot = Convert.ToInt16(value);
|
|
break;
|
|
case 3:
|
|
zRot = Convert.ToInt16(value);
|
|
break;
|
|
case 4:
|
|
perspMode = (byte)(Convert.ToBoolean(value) ? 1 : 0);
|
|
break;
|
|
case 5:
|
|
fov = Convert.ToUInt16(value);
|
|
break;
|
|
case 6:
|
|
nearClip = Convert.ToUInt32(value);
|
|
break;
|
|
case 7:
|
|
farClip = Convert.ToUInt32(value);
|
|
break;
|
|
case 8:
|
|
xOffset = Convert.ToInt32(value);
|
|
break;
|
|
case 9:
|
|
yOffset = Convert.ToInt32(value);
|
|
break;
|
|
case 10:
|
|
zOffset = Convert.ToInt32(value);
|
|
break;
|
|
}
|
|
} catch (OverflowException e) {
|
|
MessageBox.Show("The value you selected is invalid.\n\n" + '"' + e.Message + '"', "Overflow", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
} catch (FormatException) {
|
|
MessageBox.Show("Only numeric values are allowed.", "Invalid input", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
}
|
|
}
|
|
}
|
|
|
|
public GameCamera(uint distance = 0x29AEC1, short vertRot = 0xD62, short horiRot = 0, short zRot = 0,
|
|
short unk1 = 0, byte perspMode = PERSPECTIVE, byte unk2 = 0,
|
|
ushort fov = 1473, uint nearClip = 614400, uint farClip = 0x384000,
|
|
int? xOffset = null, int? yOffset = null, int? zOffset = null) {
|
|
|
|
this.distance = distance;
|
|
this.vertRot = vertRot;
|
|
this.horiRot = horiRot;
|
|
this.zRot = zRot;
|
|
|
|
this.unk1 = unk1;
|
|
this.perspMode = perspMode;
|
|
this.unk2 = unk2;
|
|
|
|
this.fov = fov;
|
|
this.nearClip = nearClip;
|
|
this.farClip = farClip;
|
|
|
|
this.xOffset = xOffset;
|
|
this.yOffset = yOffset;
|
|
this.zOffset = zOffset;
|
|
}
|
|
|
|
public GameCamera(byte[] camData) {
|
|
if (camData.Length != 36 && camData.Length != 24) {
|
|
MessageBox.Show("This is not a camera file.\nMake sure the file is 36 or 24 bytes long and try again.", "Wrong file!", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
return;
|
|
}
|
|
try {
|
|
using (BinaryReader b = new BinaryReader(new MemoryStream(camData))) {
|
|
distance = b.ReadUInt32();
|
|
vertRot = b.ReadInt16();
|
|
horiRot = b.ReadInt16();
|
|
zRot = b.ReadInt16();
|
|
|
|
unk1 = b.ReadInt16();
|
|
perspMode = b.ReadByte();
|
|
unk2 = b.ReadByte();
|
|
|
|
fov = b.ReadUInt16();
|
|
nearClip = b.ReadUInt32();
|
|
farClip = b.ReadUInt32();
|
|
|
|
if (RomInfo.gameFamily == GameFamilies.HGSS) {
|
|
xOffset = b.ReadInt32();
|
|
yOffset = b.ReadInt32();
|
|
zOffset = b.ReadInt32();
|
|
}
|
|
}
|
|
} catch (EndOfStreamException) {
|
|
MessageBox.Show("You might have to manually fill in the last three camera fields, since DPPt cameras don't have them.", "DPPt Cam detected", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
}
|
|
}
|
|
public byte[] ToByteArray() {
|
|
MemoryStream newData = new MemoryStream();
|
|
using (BinaryWriter writer = new BinaryWriter(newData)) {
|
|
writer.Write(distance);
|
|
writer.Write(vertRot);
|
|
writer.Write(horiRot);
|
|
writer.Write(zRot);
|
|
|
|
writer.Write(unk1);
|
|
writer.Write(perspMode);
|
|
writer.Write(unk2);
|
|
|
|
writer.Write(fov);
|
|
writer.Write(nearClip);
|
|
writer.Write(farClip);
|
|
|
|
if (xOffset != null) {
|
|
writer.Write((int)xOffset);
|
|
}
|
|
|
|
if (yOffset != null) {
|
|
writer.Write((int)yOffset);
|
|
}
|
|
|
|
if (zOffset != null) {
|
|
writer.Write((int)zOffset);
|
|
}
|
|
}
|
|
|
|
return newData.ToArray();
|
|
}
|
|
|
|
public void ShowInGridView(DataGridView dgv, int rowIndex) {
|
|
if (rowIndex > dgv.Rows.Count - 1) {
|
|
dgv.Rows.Add();
|
|
}
|
|
|
|
int colIndex = 0;
|
|
|
|
dgv.Rows[rowIndex].HeaderCell.Value = String.Format("{0}", dgv.Rows[rowIndex].Index);
|
|
|
|
dgv.Rows[rowIndex].Cells[colIndex++].Value = distance;
|
|
dgv.Rows[rowIndex].Cells[colIndex++].Value = vertRot;
|
|
dgv.Rows[rowIndex].Cells[colIndex++].Value = horiRot;
|
|
dgv.Rows[rowIndex].Cells[colIndex++].Value = zRot;
|
|
|
|
dgv.Rows[rowIndex].Cells[colIndex++].Value = perspMode == ORTHO;
|
|
|
|
dgv.Rows[rowIndex].Cells[colIndex++].Value = fov;
|
|
dgv.Rows[rowIndex].Cells[colIndex++].Value = nearClip;
|
|
dgv.Rows[rowIndex].Cells[colIndex++].Value = farClip;
|
|
|
|
if (colIndex < dgv.Columns.Count-3) {
|
|
if (xOffset != null) {
|
|
dgv.Rows[rowIndex].Cells[colIndex++].Value = xOffset;
|
|
}
|
|
|
|
if (yOffset != null) {
|
|
dgv.Rows[rowIndex].Cells[colIndex++].Value = yOffset;
|
|
}
|
|
|
|
if (zOffset != null) {
|
|
dgv.Rows[rowIndex].Cells[colIndex++].Value = zOffset;
|
|
}
|
|
}
|
|
}
|
|
}
|