From e280b82e5975de86cf736b9e615f18ef107fd03a Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Thu, 19 May 2016 18:34:36 +1000 Subject: [PATCH] [Likely broken] - change all draw op coordinates to use signed 32 bit integers instead of 16 bit unsigned integers, likely breaks things. --- Commands/building/CmdDraw.cs | 2 +- Commands/building/CmdRedo.cs | 2 +- Commands/building/CmdTree.cs | 2 +- Commands/building/CmdTriangle.cs | 4 +- Commands/building/CmdUndo.cs | 8 ++-- Drawing/DrawOps/AdvConeDrawOps.cs | 18 ++++----- Drawing/DrawOps/AdvDrawOps.cs | 12 +++--- Drawing/DrawOps/AdvPyramidDrawOps.cs | 12 +++--- Drawing/DrawOps/CuboidDrawOp.cs | 36 ++++++++---------- Drawing/DrawOps/CuboidDrawOps.cs | 19 +++++----- Drawing/DrawOps/DrawOp.Performer.cs | 17 +++------ Drawing/DrawOps/DrawOp.cs | 23 +++++++----- Drawing/DrawOps/FillDrawOp.cs | 6 +-- Drawing/DrawOps/LineDrawOp.cs | 10 ++--- Drawing/DrawOps/MazeDrawOp.cs | 33 +++++++++-------- Drawing/DrawOps/PasteDrawOp.cs | 16 +++----- Drawing/DrawOps/PyramidDrawOp.cs | 35 +++++++++++------- Drawing/DrawOps/RedoDrawOp.cs | 4 +- Drawing/DrawOps/ReplaceDrawOp.cs | 18 ++++----- Drawing/DrawOps/SpheroidDrawOp.cs | 55 +++++++++++++--------------- Drawing/DrawOps/TorusDrawOp.cs | 13 +++---- Drawing/DrawOps/TreeDrawOp.cs | 6 +-- Drawing/DrawOps/TriangleDrawOp.cs | 11 +++--- Drawing/DrawOps/UndoDrawOp.cs | 16 ++++---- Drawing/DrawOps/WriteDrawOp.cs | 8 ++-- GUI/PropertyWindow.Designer.cs | 8 ++-- Generator/RealisticMapGen.cs | 4 +- Levels/Physics/OtherPhysics.cs | 2 +- Player/Undo/UndoFile.cs | 6 +-- Player/Undo/UndoFileBin.cs | 4 +- Player/Undo/UndoFileCBin.cs | 4 +- Player/Undo/UndoFileText.cs | 4 +- util/Vectors.cs | 49 ++++++++++++++++++------- 33 files changed, 239 insertions(+), 228 deletions(-) diff --git a/Commands/building/CmdDraw.cs b/Commands/building/CmdDraw.cs index 773b417d4..347f96efd 100644 --- a/Commands/building/CmdDraw.cs +++ b/Commands/building/CmdDraw.cs @@ -80,7 +80,7 @@ namespace MCGalaxy.Commands { int brushOffset = op.UsesHeight ? 3 : 2; Brush brush = GetBrush(p, cpos, brushOffset); if (brush == null) return; - if (!DrawOp.DoDrawOp(op, brush, p, new [] { new Vec3U16(x, y, z) })) + if (!DrawOp.DoDrawOp(op, brush, p, new [] { new Vec3S32(x, y, z) })) return; if (p.staticCommands) p.Blockchange += new Player.BlockchangeEventHandler(Blockchange1); diff --git a/Commands/building/CmdRedo.cs b/Commands/building/CmdRedo.cs index b3a4c579b..ebee96b23 100644 --- a/Commands/building/CmdRedo.cs +++ b/Commands/building/CmdRedo.cs @@ -49,7 +49,7 @@ namespace MCGalaxy.Commands { RedoSelfDrawOp op = new RedoSelfDrawOp(); op.Start = entry.Start; op.End = entry.End; - DrawOp.DoDrawOp(op, null, p, new [] { Vec3U16.MaxVal, Vec3U16.MaxVal }); + DrawOp.DoDrawOp(op, null, p, new Vec3S32[] { Vec3U16.MaxVal, Vec3U16.MaxVal }); Player.Message(p, "Redo performed."); return; } diff --git a/Commands/building/CmdTree.cs b/Commands/building/CmdTree.cs index 7e1150b6b..35b699ae6 100644 --- a/Commands/building/CmdTree.cs +++ b/Commands/building/CmdTree.cs @@ -74,7 +74,7 @@ namespace MCGalaxy.Commands { if (brush == null) return; } - Vec3U16[] marks = { new Vec3U16(x, y, z) }; + Vec3S32[] marks = { new Vec3S32(x, y, z) }; if (!DrawOp.DoDrawOp(op, brush, p, marks)) return; if (p.staticCommands) diff --git a/Commands/building/CmdTriangle.cs b/Commands/building/CmdTriangle.cs index 2d011646d..ff9ca1d6b 100644 --- a/Commands/building/CmdTriangle.cs +++ b/Commands/building/CmdTriangle.cs @@ -41,8 +41,8 @@ namespace MCGalaxy.Commands { RevertAndClearState(p, x, y, z); CatchPos cpos = (CatchPos)p.blockchangeObject; GetRealBlock(type, extType, p, ref cpos); - Vec3U16[] marks = { new Vec3U16(cpos.x, cpos.y, cpos.z), - new Vec3U16(cpos.x2, cpos.y2, cpos.z2), new Vec3U16(x, y, z) }; + Vec3S32[] marks = { new Vec3S32(cpos.x, cpos.y, cpos.z), + new Vec3S32(cpos.x2, cpos.y2, cpos.z2), new Vec3S32(x, y, z) }; Brush brush = GetBrush(p, cpos, 0, null); if (brush == null) return; diff --git a/Commands/building/CmdUndo.cs b/Commands/building/CmdUndo.cs index a6b766740..81f332cea 100644 --- a/Commands/building/CmdUndo.cs +++ b/Commands/building/CmdUndo.cs @@ -102,7 +102,7 @@ namespace MCGalaxy.Commands UndoSelfDrawOp op = new UndoSelfDrawOp(); op.who = p; op.Start = entry.Start; op.End = entry.End; - DrawOp.DoDrawOp(op, null, p, new [] { Vec3U16.MaxVal, Vec3U16.MaxVal } ); + DrawOp.DoDrawOp(op, null, p, new Vec3S32[] { Vec3U16.MaxVal, Vec3U16.MaxVal } ); Player.Message(p, "Undo performed."); return; } @@ -120,7 +120,7 @@ namespace MCGalaxy.Commands else op = new UndoOnlineDrawOp(); op.Start = DateTime.UtcNow.AddTicks(-seconds * TimeSpan.TicksPerSecond); op.who = who; - DrawOp.DoDrawOp(op, null, p, new [] { Vec3U16.MaxVal, Vec3U16.MaxVal } ); + DrawOp.DoDrawOp(op, null, p, new Vec3S32[] { Vec3U16.MaxVal, Vec3U16.MaxVal } ); Level saveLevel = op.saveLevel; if (p == who) { @@ -138,7 +138,7 @@ namespace MCGalaxy.Commands UndoOfflineDrawOp op = new UndoOfflineDrawOp(); op.Start = DateTime.UtcNow.AddTicks(-seconds * TimeSpan.TicksPerSecond); op.whoName = whoName; - DrawOp.DoDrawOp(op, null, p, new [] { Vec3U16.MaxVal, Vec3U16.MaxVal } ); + DrawOp.DoDrawOp(op, null, p, new Vec3S32[] { Vec3U16.MaxVal, Vec3U16.MaxVal } ); if (op.foundUser) { Player.GlobalMessage(Server.FindColor(whoName) + whoName + "%S's actions for the past &b" + seconds + " %Sseconds were undone."); @@ -163,7 +163,7 @@ namespace MCGalaxy.Commands Command.all.Find("physics").Use(p, "0"); UndoPhysicsDrawOp op = new UndoPhysicsDrawOp(); op.seconds = seconds; - DrawOp.DoDrawOp(op, null, p, new [] { Vec3U16.MaxVal, Vec3U16.MaxVal } ); + DrawOp.DoDrawOp(op, null, p, new Vec3S32[] { Vec3U16.MaxVal, Vec3U16.MaxVal } ); Player.GlobalMessage("Physics were undone &b" + seconds + " %Sseconds"); Server.s.Log( "Physics were undone &b" + seconds + " %Sseconds"); diff --git a/Drawing/DrawOps/AdvConeDrawOps.cs b/Drawing/DrawOps/AdvConeDrawOps.cs index 5636eb287..168e99ad1 100644 --- a/Drawing/DrawOps/AdvConeDrawOps.cs +++ b/Drawing/DrawOps/AdvConeDrawOps.cs @@ -29,13 +29,13 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Adv Cone"; } } - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { long R = Radius, H = Height; return (long)(Math.PI / 3 * (R * R * H)); } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { - Vec3U16 P = marks[0]; + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { + Vec3U16 P = (Vec3U16)marks[0]; int minX = Math.Max(P.X - Radius, 0) - P.X, maxX = Math.Min(P.X + Radius, lvl.Width - 1) - P.X; int minZ = Math.Max(P.Z - Radius, 0) - P.Z, maxZ = Math.Min(P.Z + Radius, lvl.Length - 1) - P.Z; for (int yy = 0; yy <= Height; yy++) @@ -61,15 +61,15 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Adv Hollow Cone"; } } - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { long R = Radius, H = Height; double outer = (int)(Math.PI / 3 * (R * R * H)); double inner = (int)(Math.PI / 3 * ((R - 1) * (R - 1) * (H - 1))); return (long)(outer - inner); } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { - Vec3U16 P = marks[0]; + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { + Vec3U16 P = (Vec3U16)marks[0]; int minX = Math.Max(P.X - Radius, 0) - P.X, maxX = Math.Min(P.X + Radius, lvl.Width - 1) - P.X; int minZ = Math.Max(P.Z - Radius, 0) - P.Z, maxZ = Math.Min(P.Z + Radius, lvl.Length - 1) - P.Z; int maxY = Math.Min(P.Y + Height, lvl.Height - 1) - P.Y; @@ -97,13 +97,13 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Adv Volcano"; } } - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { long R = Radius, H = Height; return (long)(Math.PI / 3 * (R * R * H)); } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { - Vec3U16 P = marks[0]; + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { + Vec3U16 P = (Vec3U16)marks[0]; int minX = Math.Max(P.X - Radius, 0) - P.X, maxX = Math.Min(P.X + Radius, lvl.Width - 1) - P.X; int minZ = Math.Max(P.Z - Radius, 0) - P.Z, maxZ = Math.Min(P.Z + Radius, lvl.Length - 1) - P.Z; int maxY = Math.Min(P.Y + Height, lvl.Height - 1) - P.Y; diff --git a/Drawing/DrawOps/AdvDrawOps.cs b/Drawing/DrawOps/AdvDrawOps.cs index 9a0bf7376..f817a450a 100644 --- a/Drawing/DrawOps/AdvDrawOps.cs +++ b/Drawing/DrawOps/AdvDrawOps.cs @@ -36,13 +36,13 @@ namespace MCGalaxy.Drawing.Ops { public override bool UsesHeight { get { return false; } } public override string Name { get { return "Adv Sphere"; } } - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { long R = Radius; return (long)(Math.PI * 4.0 / 3.0 * (R * R * R)); } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { - Vec3U16 P = marks[0]; + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { + Vec3U16 P = (Vec3U16)marks[0]; int upper = (Radius + 1) * (Radius + 1); int minX = Math.Max(P.X - Radius, 0) - P.X, maxX = Math.Min(P.X + Radius, lvl.Width - 1) - P.X; int minY = Math.Max(P.Y - Radius, 0) - P.Y, maxY = Math.Min(P.Y + Radius, lvl.Height - 1) - P.Y; @@ -63,15 +63,15 @@ namespace MCGalaxy.Drawing.Ops { public override bool UsesHeight { get { return false; } } public override string Name { get { return "Adv Hollow Sphere"; } } - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { long R = Radius; double outer = (int)(Math.PI * 4.0 / 3.0 * (R * R * R)); double inner = (int)(Math.PI * 4.0 / 3.0 * ((R - 1) * (R - 1) * (R - 1))); return (long)(outer - inner); } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { - Vec3U16 P = marks[0]; + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { + Vec3U16 P = (Vec3U16)marks[0]; int upper = (Radius + 1) * (Radius + 1), inner = (Radius - 1) * (Radius - 1); int minX = Math.Max(P.X - Radius, 0) - P.X, maxX = Math.Min(P.X + Radius, lvl.Width - 1) - P.X; int minY = Math.Max(P.Y - Radius, 0) - P.Y, maxY = Math.Min(P.Y + Radius, lvl.Height - 1) - P.Y; diff --git a/Drawing/DrawOps/AdvPyramidDrawOps.cs b/Drawing/DrawOps/AdvPyramidDrawOps.cs index 6996d5419..7586c5737 100644 --- a/Drawing/DrawOps/AdvPyramidDrawOps.cs +++ b/Drawing/DrawOps/AdvPyramidDrawOps.cs @@ -29,13 +29,13 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Adv Pyramid"; } } - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { long R = Radius, H = Height; return (R * R * H) / 3; } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { - Vec3U16 P = marks[0]; + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { + Vec3U16 P = (Vec3U16)marks[0]; int minX = Math.Max(P.X - Radius, 0) - P.X, maxX = Math.Min(P.X + Radius, lvl.Width - 1) - P.X; int minZ = Math.Max(P.Z - Radius, 0) - P.Z, maxZ = Math.Min(P.Z + Radius, lvl.Length - 1) - P.Z; int maxY = Math.Min(P.Y + Height, lvl.Height - 1) - P.Y; @@ -61,15 +61,15 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Adv Hollow Pyramid"; } } - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { long R = Radius, H = Height; long outer = (R * R * H) / 3; long inner = ((R - 1) * (R - 1) * (H - 1)) / 3; return outer - inner; } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { - Vec3U16 P = marks[0]; + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { + Vec3U16 P = Clamp(marks[0]); int minX = Math.Max(P.X - Radius, 0) - P.X, maxX = Math.Min(P.X + Radius, lvl.Width - 1) - P.X; int minZ = Math.Max(P.Z - Radius, 0) - P.Z, maxZ = Math.Min(P.Z + Radius, lvl.Length - 1) - P.Z; int maxY = Math.Min(P.Y + Height, lvl.Height - 1) - P.Y; diff --git a/Drawing/DrawOps/CuboidDrawOp.cs b/Drawing/DrawOps/CuboidDrawOp.cs index c4ada86bb..4830f62e2 100644 --- a/Drawing/DrawOps/CuboidDrawOp.cs +++ b/Drawing/DrawOps/CuboidDrawOp.cs @@ -24,13 +24,12 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Cuboid"; } } - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { - Vec3U16 p1 = marks[0], p2 = marks[1]; - return (p2.X - p1.X + 1) * (p2.Y - p1.Y + 1) * (p2.Z - p1.Z + 1); + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { + return (Max.X - Min.X + 1) * (Max.Y - Min.Y + 1) * (Max.Z - Min.Z + 1); } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { - Vec3U16 p1 = marks[0], p2 = marks[1]; + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { + Vec3U16 p1 = Clamp(Min), p2 = Clamp(Max); for (ushort y = p1.Y; y <= p2.Y; y++) for (ushort z = p1.Z; z <= p2.Z; z++) for (ushort x = p1.X; x <= p2.X; x++) @@ -44,17 +43,16 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Cuboid Hollow"; } } - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { - Vec3U16 p1 = marks[0], p2 = marks[1]; - int lenX = (p2.X - p1.X + 1), lenY = (p2.Y - p1.Y + 1), lenZ = (p2.Z - p1.Z + 1); + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { + int lenX = (Max.X - Min.X + 1), lenY = (Max.Y - Min.Y + 1), lenZ = (Max.Z - Min.Z + 1); int xQuadsVol = Math.Min(lenX, 2) * (lenY * lenZ); int yQuadsVol = Math.Max(0, Math.Min(lenY, 2) * ((lenX - 2) * lenZ)); // we need to avoid double counting overlaps int zQuadzVol = Math.Max(0, Math.Min(lenZ, 2) * ((lenX - 2) * (lenY - 2))); return xQuadsVol + yQuadsVol + zQuadzVol; } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { - Vec3U16 p1 = marks[0], p2 = marks[1]; + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { + Vec3U16 p1 = Clamp(Min), p2 = Clamp(Max); int lenX = (p2.X - p1.X + 1), lenY = (p2.Y - p1.Y + 1); QuadY(p1.Y, p1.X, p1.Z, p2.X, p2.Z, p, lvl, brush); QuadY(p2.Y, p1.X, p1.Z, p2.X, p2.Z, p, lvl, brush); @@ -102,16 +100,15 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Cuboid Walls"; } } - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { - Vec3U16 p1 = marks[0], p2 = marks[1]; - int lenX = (p2.X - p1.X + 1), lenY = (p2.Y - p1.Y + 1), lenZ = (p2.Z - p1.Z + 1); + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { + int lenX = (Max.X - Min.X + 1), lenY = (Max.Y - Min.Y + 1), lenZ = (Max.Z - Min.Z + 1); int xQuadsVol = Math.Min(lenX, 2) * (lenY * lenZ); int zQuadsVol = Math.Max(0, Math.Min(lenZ, 2) * ((lenX - 2) * lenY)); // we need to avoid double counting overlaps return xQuadsVol + zQuadsVol; } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { - Vec3U16 p1 = marks[0], p2 = marks[1]; + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { + Vec3U16 p1 = Clamp(Min), p2 = Clamp(Max); int lenX = (p2.X - p1.X + 1); QuadX(p1.X, p1.Y, p1.Z, p2.Y, p2.Z, p, lvl, brush); QuadX(p2.X, p1.Y, p1.Z, p2.Y, p2.Z, p, lvl, brush); @@ -126,16 +123,15 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Cuboid Wireframe"; } } - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { - Vec3U16 p1 = marks[0], p2 = marks[1]; - int lenX = (p2.X - p1.X + 1), lenY = (p2.Y - p1.Y + 1), lenZ = (p2.Z - p1.Z + 1); + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { + int lenX = (Max.X - Min.X + 1), lenY = (Max.Y - Min.Y + 1), lenZ = (Max.Z - Min.Z + 1); int horSidesvol = 2 * (lenX * 2 + lenZ * 2); // TODO: slightly overestimated by at most four blocks. int verSidesVol = Math.Max(0, lenY - 2) * 4; return horSidesvol + verSidesVol; } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { - Vec3U16 p1 = marks[0], p2 = marks[1]; + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { + Vec3U16 p1 = Clamp(Min), p2 = Clamp(Max); for (ushort y = p1.Y; y <= p2.Y; y++ ) { PlaceBlock(p, lvl, p1.X, y, p1.Z, brush); PlaceBlock(p, lvl, p2.X, y, p1.Z, brush); diff --git a/Drawing/DrawOps/CuboidDrawOps.cs b/Drawing/DrawOps/CuboidDrawOps.cs index 7268f5990..f37a111dc 100644 --- a/Drawing/DrawOps/CuboidDrawOps.cs +++ b/Drawing/DrawOps/CuboidDrawOps.cs @@ -25,8 +25,8 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Hollow"; } } public byte Skip; - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { - Vec3U16 p1 = marks[0], p2 = marks[1]; + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { + Vec3U16 p1 = Clamp(Min), p2 = Clamp(Max); for (ushort y = p1.Y; y <= p2.Y; y++) for (ushort z = p1.Z; z <= p2.Z; z++) for (ushort x = p1.X; x <= p2.X; x++) @@ -60,8 +60,8 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Outline"; } } public byte Type, NewType; - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { - Vec3U16 p1 = marks[0], p2 = marks[1]; + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { + Vec3U16 p1 = Clamp(Min), p2 = Clamp(Max); for (ushort y = p1.Y; y <= p2.Y; y++) for (ushort z = p1.Z; z <= p2.Z; z++) for (ushort x = p1.X; x <= p2.X; x++) @@ -84,8 +84,8 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Rainbow"; } } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { - Vec3U16 p1 = marks[0], p2 = marks[1]; + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { + Vec3U16 p1 = Clamp(Min), p2 = Clamp(Max); int dx = Math.Abs(p1.X - p2.X), dy = Math.Abs(p1.Y - p2.Y), dz = Math.Abs(p1.Z - p2.Z); byte stepX = 0, stepY = 0, stepZ = 0; @@ -98,13 +98,13 @@ namespace MCGalaxy.Drawing.Ops { } int i = 12; - for (ushort y = Min.Y; y <= Max.Y; y++) { + for (ushort y = p1.Y; y <= p2.Y; y++) { i = (i + stepY) % 13; int startZ = i; - for (ushort z = Min.Z; z <= Max.Z; z++) { + for (ushort z = p1.Z; z <= p2.Z; z++) { i = (i + stepZ) % 13; int startX = i; - for (ushort x = Min.X; x <= Max.X; x++) { + for (ushort x = p1.X; x <= p2.X; x++) { i = (i + stepX) % 13; if (lvl.GetTile(x, y, z) != Block.air) PlaceBlock(p, lvl, x, y, z, (byte)(Block.red + i), 0); @@ -113,7 +113,6 @@ namespace MCGalaxy.Drawing.Ops { } i = startZ; } - } } } diff --git a/Drawing/DrawOps/DrawOp.Performer.cs b/Drawing/DrawOps/DrawOp.Performer.cs index 5261fc32a..63a4627fd 100644 --- a/Drawing/DrawOps/DrawOp.Performer.cs +++ b/Drawing/DrawOps/DrawOp.Performer.cs @@ -25,7 +25,7 @@ namespace MCGalaxy.Drawing { internal struct PendingDrawOp { public DrawOp Op; public Brush Brush; - public Vec3U16[] Marks; + public Vec3S32[] Marks; public long Affected; public Level Level; } @@ -37,20 +37,15 @@ namespace MCGalaxy.Drawing.Ops { public static bool DoDrawOp(DrawOp op, Brush brush, Player p, ushort x1, ushort y1, ushort z1, ushort x2, ushort y2, ushort z2) { - Vec3U16[] marks = new [] { new Vec3U16(x1, y1, z1), new Vec3U16(x2, y2, z2) }; - if (op.MinMaxCoords) { - marks[0].X = Math.Min(x1, x2); marks[1].X = Math.Max(x1, x2); - marks[0].Y = Math.Min(y1, y2); marks[1].Y = Math.Max(y1, y2); - marks[0].Z = Math.Min(z1, z2); marks[1].Z = Math.Max(z1, z2); - } + Vec3S32[] marks = new [] { new Vec3S32(x1, y1, z1), new Vec3S32(x2, y2, z2) }; return DoDrawOp(op, brush, p, marks); } - public static bool DoDrawOp(DrawOp op, Brush brush, Player p, Vec3U16[] marks) { + public static bool DoDrawOp(DrawOp op, Brush brush, Player p, Vec3S32[] marks) { op.Origin = marks[0]; op.Min = marks[0]; op.Max = marks[0]; for (int i = 1; i < marks.Length; i++) { - op.Min = Vec3U16.Min(op.Min, marks[i]); - op.Max = Vec3U16.Max(op.Max, marks[i]); + op.Min = Vec3S32.Min(op.Min, marks[i]); + op.Max = Vec3S32.Max(op.Max, marks[i]); } op.Level = p == null ? null : p.level; if (op.Level != null && !op.Level.DrawingAllowed) { @@ -73,7 +68,7 @@ namespace MCGalaxy.Drawing.Ops { return true; } - static void AppendDrawOp(Player p, DrawOp op, Brush brush, Vec3U16[] marks, long affected) { + static void AppendDrawOp(Player p, DrawOp op, Brush brush, Vec3S32[] marks, long affected) { if (p == null) { op.Perform(marks, p, op.Level, brush); return; } PendingDrawOp item = new PendingDrawOp(); diff --git a/Drawing/DrawOps/DrawOp.cs b/Drawing/DrawOps/DrawOp.cs index fdcc1ae8a..6d4aaadfa 100644 --- a/Drawing/DrawOps/DrawOp.cs +++ b/Drawing/DrawOps/DrawOp.cs @@ -41,13 +41,13 @@ namespace MCGalaxy.Drawing.Ops { protected internal int method; /// Minimum coordinates of the bounds of this drawing command. - public Vec3U16 Min; + public Vec3S32 Min; /// Maximum coordinates of the bounds of this drawing command. - public Vec3U16 Max; + public Vec3S32 Max; /// Coordinates of the first point selected by the user. - public Vec3U16 Origin; + public Vec3S32 Origin; /// Coordinates of the current block being processed by the drawing command. public Vec3U16 Coords; @@ -55,20 +55,16 @@ namespace MCGalaxy.Drawing.Ops { /// Level the draw operation is being performed upon. public Level Level; - /// Whether the two given coordinates from the user should be adjusted, - /// so that the first coordinate contains the minimum values on all three axes. - public virtual bool MinMaxCoords { get { return true; } } - /// Human friendly name of the draw operation. public abstract string Name { get; } /// Estimates the total number of blocks that the drawing commands affects.
/// Note that this estimate assumes that all possibly affected blocks will be changed by the drawing command.
- public abstract long GetBlocksAffected(Level lvl, Vec3U16[] marks); + public abstract long GetBlocksAffected(Level lvl, Vec3S32[] marks); - public abstract void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush); + public abstract void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush); - public virtual bool CanDraw(Vec3U16[] marks, Player p, out long affected) { + public virtual bool CanDraw(Vec3S32[] marks, Player p, out long affected) { affected = GetBlocksAffected(Level, marks); if (p != null && affected > p.group.maxBlocks) { Player.Message(p, "You tried to draw " + affected + " blocks."); @@ -149,5 +145,12 @@ namespace MCGalaxy.Drawing.Ops { internal const int M_PBlockQueue = 0, M_PBlockChange = 1, M_PSetTile = 2; internal const int M_BlockChange = 3, M_SetTile = 4; + + protected Vec3U16 Clamp(Vec3S32 pos) { + pos.X = Math.Max(0, Math.Min(pos.X, Level.Width - 1)); + pos.Y = Math.Max(0, Math.Min(pos.Y, Level.Height - 1)); + pos.Z = Math.Max(0, Math.Min(pos.Z, Level.Length - 1)); + return new Vec3U16((ushort)pos.X, (ushort)pos.Y, (ushort)pos.Z); + } } } diff --git a/Drawing/DrawOps/FillDrawOp.cs b/Drawing/DrawOps/FillDrawOp.cs index a82898ec1..5b5b29291 100644 --- a/Drawing/DrawOps/FillDrawOp.cs +++ b/Drawing/DrawOps/FillDrawOp.cs @@ -27,11 +27,11 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Fill"; } } - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { return Positions.Count; } - public override bool CanDraw(Vec3U16[] marks, Player p, out long affected) { + public override bool CanDraw(Vec3S32[] marks, Player p, out long affected) { affected = GetBlocksAffected(p.level, marks); if (affected > p.group.maxBlocks) { Player.Message(p, "You tried to fill over " + p.group.maxBlocks + " blocks."); @@ -41,7 +41,7 @@ namespace MCGalaxy.Drawing.Ops { return true; } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { ushort x, y, z; foreach (int pos in Positions) { lvl.IntToPos(pos, out x, out y, out z); diff --git a/Drawing/DrawOps/LineDrawOp.cs b/Drawing/DrawOps/LineDrawOp.cs index ee260bb00..777d295f7 100644 --- a/Drawing/DrawOps/LineDrawOp.cs +++ b/Drawing/DrawOps/LineDrawOp.cs @@ -28,10 +28,8 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Line"; } } - public override bool MinMaxCoords { get { return false; } } - - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { - Vec3U16 p1 = marks[0], p2 = marks[1]; + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { + Vec3S32 p1 = marks[0], p2 = marks[1]; double dx = Math.Abs(p2.X - p1.X) + 0.25, dy = Math.Abs(p2.Y - p1.Y) + 0.25, dz = Math.Abs(p2.Z - p1.Z) + 0.25; if (WallsMode) { int baseLen = (int)Math.Ceiling(Math.Sqrt(dx * dx + dz * dz)); @@ -42,8 +40,8 @@ namespace MCGalaxy.Drawing.Ops { } } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { - Vec3U16 p1 = marks[0], p2 = marks[1]; + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { + Vec3U16 p1 = Clamp(marks[0]), p2 = Clamp(marks[1]); List buffer = new List(); DrawLine(p1.X, p1.Y, p1.Z, MaxLength, p2.X, p2.Y, p2.Z, buffer); if (WallsMode) { diff --git a/Drawing/DrawOps/MazeDrawOp.cs b/Drawing/DrawOps/MazeDrawOp.cs index d9d747017..13f1cc95f 100644 --- a/Drawing/DrawOps/MazeDrawOp.cs +++ b/Drawing/DrawOps/MazeDrawOp.cs @@ -33,13 +33,13 @@ namespace MCGalaxy.Drawing.Ops { byte[] r = new byte[1]; int width, length; - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { - int lenX = (Math.Abs(marks[1].X - marks[0].X) + 1) / 2; - int lenZ = (Math.Abs(marks[1].Z - marks[0].Z) + 1) / 2; + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { + int lenX = (Math.Abs(Max.X - Min.X) + 1) / 2; + int lenZ = (Math.Abs(Max.Z - Min.Z) + 1) / 2; return lenX * lenZ * 3; } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { width = Max.X - Min.X; if (width % 2 != 0) { width++; Min.X--; } width -= 2; @@ -83,27 +83,28 @@ namespace MCGalaxy.Drawing.Ops { } Player.Message(p, "Generated maze, now drawing."); - ushort minX = Min.X, minZ = Min.Z, maxX = Max.X, maxZ = Max.Z, y = Min.Y; + Vec3U16 min = Clamp(Min), max = Clamp(Max); + ushort y = min.Y; for (ushort xx = 0; xx <= width; xx++) for (ushort zz = 0; zz <= length; zz++) if (wall[xx, zz]) { - PlaceBlock(p, lvl, (ushort)(xx + minX + 1), y, (ushort)(zz + minZ + 1), Block.staircasefull, 0); - PlaceBlock(p, lvl, (ushort)(xx + minX + 1), (ushort)(y + 1), (ushort)(zz + minZ + 1), Block.leaf, 0); - PlaceBlock(p, lvl, (ushort)(xx + minX + 1), (ushort)(y + 2), (ushort)(zz + minZ + 1), Block.leaf, 0); + PlaceBlock(p, lvl, (ushort)(xx + min.X + 1), y, (ushort)(zz + min.Z + 1), Block.staircasefull, 0); + PlaceBlock(p, lvl, (ushort)(xx + min.X + 1), (ushort)(y + 1), (ushort)(zz + min.Z + 1), Block.leaf, 0); + PlaceBlock(p, lvl, (ushort)(xx + min.X + 1), (ushort)(y + 2), (ushort)(zz + min.Z + 1), Block.leaf, 0); } brush = new SolidBrush(Block.staircasefull, 0); - QuadX(minX, y, minZ, y, maxZ, p, lvl, brush); - QuadX(maxX, y, minZ, y, maxZ, p, lvl, brush); - QuadZ(minZ, y, minX, y, maxX, p, lvl, brush); - QuadZ(maxZ, y, minX, y, maxX, p, lvl, brush); + QuadX(min.X, y, min.Z, y, max.Z, p, lvl, brush); + QuadX(max.X, y, min.Z, y, max.Z, p, lvl, brush); + QuadZ(min.Z, y, min.X, y, max.X, p, lvl, brush); + QuadZ(max.Z, y, min.X, y, max.X, p, lvl, brush); brush = new SolidBrush(Block.leaf, 0); - QuadX(minX, (ushort)(y + 1), minZ, (ushort)(y + 2), maxZ, p, lvl, brush); - QuadX(maxX, (ushort)(y + 1), minZ, (ushort)(y + 2), maxZ, p, lvl, brush); - QuadZ(minZ, (ushort)(y + 1), minX, (ushort)(y + 2), maxX, p, lvl, brush); - QuadZ(maxZ, (ushort)(y + 1), minX, (ushort)(y + 2), maxX, p, lvl, brush); + QuadX(min.X, (ushort)(y + 1), min.Z, (ushort)(y + 2), max.Z, p, lvl, brush); + QuadX(max.X, (ushort)(y + 1), min.Z, (ushort)(y + 2), max.Z, p, lvl, brush); + QuadZ(min.Z, (ushort)(y + 1), min.X, (ushort)(y + 2), max.X, p, lvl, brush); + QuadZ(max.Z, (ushort)(y + 1), min.X, (ushort)(y + 2), max.X, p, lvl, brush); Player.Message(p, "Maze painted. Build your entrance and exit yourself"); randomizer = 0; diff --git a/Drawing/DrawOps/PasteDrawOp.cs b/Drawing/DrawOps/PasteDrawOp.cs index 3cc209870..d1da3c269 100644 --- a/Drawing/DrawOps/PasteDrawOp.cs +++ b/Drawing/DrawOps/PasteDrawOp.cs @@ -27,14 +27,12 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Paste"; } } - public override bool MinMaxCoords { get { return false; } } - - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { return CopyState.UsedBlocks; } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { - Vec3U16 p1 = marks[0]; + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { + Vec3U16 p1 = Clamp(marks[0]); CopyState state = CopyState; bool pasteAir = state.PasteAir; // Adjust for the fact that paste origin may be outside the map. @@ -63,14 +61,12 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Paste"; } } - public override bool MinMaxCoords { get { return false; } } - - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { return CopyState.UsedBlocks; } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { - Vec3U16 p1 = marks[0]; + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { + Vec3U16 p1 = Clamp(marks[0]); CopyState state = CopyState; bool pasteAir = state.PasteAir; ExtBlock[] include = Include, exclude = Exclude; diff --git a/Drawing/DrawOps/PyramidDrawOp.cs b/Drawing/DrawOps/PyramidDrawOp.cs index 8dd8ad904..9b822c637 100644 --- a/Drawing/DrawOps/PyramidDrawOp.cs +++ b/Drawing/DrawOps/PyramidDrawOp.cs @@ -33,25 +33,27 @@ namespace MCGalaxy.Drawing.Ops { return baseOp.DetermineDrawOpMethod(lvl, affected); } - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { - Vec3U16 origP1 = marks[0], origP2 = marks[1]; - Vec3U16 p1 = marks[0], p2 = marks[1]; + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { + Vec3S32 oMin = Min, oMax = Max; + baseOp.Min = oMin; baseOp.Max = oMax; + Vec3S32 p1 = Min, p2 = Max; long total = 0; + while (true) { total += baseOp.GetBlocksAffected(lvl, marks); if (p1.Y >= lvl.Height || Math.Abs(p2.X - p1.X) <= 1 || Math.Abs(p2.Z - p1.Z) <= 1) - break; + break; p1.X++; p2.X--; p1.Z++; p2.Z--; p1.Y = (ushort)(p1.Y + yDir); p2.Y = p1.Y; - marks[0] = p1; marks[1] = p2; + baseOp.Min = p1; baseOp.Max = p2; } - marks[0] = origP1; marks[1] = origP2; + baseOp.Min = oMin; baseOp.Max = oMax; return total; } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { - Vec3U16 p1 = marks[0], p2 = marks[1]; + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { + Vec3S32 p1 = Min, p2 = Max; while (true) { baseOp.Perform(marks, p, lvl, brush); if (p1.Y >= lvl.Height || Math.Abs(p2.X - p1.X) <= 1 || Math.Abs(p2.Z - p1.Z) <= 1) @@ -59,12 +61,12 @@ namespace MCGalaxy.Drawing.Ops { p1.X++; p2.X--; p1.Z++; p2.Z--; p1.Y = (ushort)(p1.Y + yDir); p2.Y = p1.Y; - marks[0] = p1; marks[1] = p2; + baseOp.Min = p1; baseOp.Max = p2; } } } - public class PyramidSolidDrawOp : PyramidDrawOp { + public class PyramidSolidDrawOp : PyramidDrawOp { public PyramidSolidDrawOp() : base(new CuboidDrawOp(), 1) { } @@ -91,19 +93,24 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Pyramid reverse"; } } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { - Vec3U16 p1 = marks[0], p2 = marks[1]; + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { + Vec3U16 p1 = Clamp(Min), p2 = Clamp(Max); + wallOp.Min = Min; wallOp.Max = Max; + baseOp.Min = Min; baseOp.Max = Max; + while (true) { wallOp.Perform(marks, p, lvl, brush); if (p1.Y >= lvl.Height || Math.Abs(p2.X - p1.X) <= 1 || Math.Abs(p2.Z - p1.Z) <= 1) break; p1.X++; p2.X--; p1.Z++; p2.Z--; - marks[0] = p1; marks[1] = p2; + wallOp.Min = p1; wallOp.Max = p2; + baseOp.Min = p1; baseOp.Max = p2; baseOp.Perform(marks, p, lvl, airBrush); p1.Y = (ushort)(p1.Y + yDir); p2.Y = p1.Y; - marks[0] = p1; marks[1] = p2; + wallOp.Min = p1; wallOp.Max = p2; + baseOp.Min = p1; baseOp.Max = p2; } } } diff --git a/Drawing/DrawOps/RedoDrawOp.cs b/Drawing/DrawOps/RedoDrawOp.cs index 00b45eb62..af16868d9 100644 --- a/Drawing/DrawOps/RedoDrawOp.cs +++ b/Drawing/DrawOps/RedoDrawOp.cs @@ -33,9 +33,9 @@ namespace MCGalaxy.Drawing.Ops { /// Point in time that the /undo should start updating blocks. public DateTime End = DateTime.MaxValue; - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { return -1; } + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { return -1; } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { UndoCache cache = p.UndoBuffer; UndoCacheNode node = cache.Tail; if (node == null) return; diff --git a/Drawing/DrawOps/ReplaceDrawOp.cs b/Drawing/DrawOps/ReplaceDrawOp.cs index 2c542ad43..55270b3ba 100644 --- a/Drawing/DrawOps/ReplaceDrawOp.cs +++ b/Drawing/DrawOps/ReplaceDrawOp.cs @@ -30,13 +30,12 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Replace"; } } - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { - Vec3U16 p1 = marks[0], p2 = marks[1]; - return (p2.X - p1.X + 1) * (p2.Y - p1.Y + 1) * (p2.Z - p1.Z + 1); + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { + return (Max.X - Min.X + 1) * (Max.Y - Min.Y + 1) * (Max.Z - Min.Z + 1); } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { - Vec3U16 p1 = marks[0], p2 = marks[1]; + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { + Vec3U16 p1 = Clamp(Min), p2 = Clamp(Max); for (ushort y = p1.Y; y <= p2.Y; y++) for (ushort z = p1.Z; z <= p2.Z; z++) for (ushort x = p1.X; x <= p2.X; x++) @@ -60,13 +59,12 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "ReplaceNot"; } } - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { - Vec3U16 p1 = marks[0], p2 = marks[1]; - return (p2.X - p1.X + 1) * (p2.Y - p1.Y + 1) * (p2.Z - p1.Z + 1); + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { + return (Max.X - Min.X + 1) * (Max.Y - Min.Y + 1) * (Max.Z - Min.Z + 1); } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { - Vec3U16 p1 = marks[0], p2 = marks[1]; + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { + Vec3U16 p1 = Clamp(Min), p2 = Clamp(Max); for (ushort y = p1.Y; y <= p2.Y; y++) for (ushort z = p1.Z; z <= p2.Z; z++) for (ushort x = p1.X; x <= p2.X; x++) diff --git a/Drawing/DrawOps/SpheroidDrawOp.cs b/Drawing/DrawOps/SpheroidDrawOp.cs index 2290bf7e1..0465a3c0a 100644 --- a/Drawing/DrawOps/SpheroidDrawOp.cs +++ b/Drawing/DrawOps/SpheroidDrawOp.cs @@ -24,22 +24,21 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Ellipsoid"; } } - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { - Vec3U16 p1 = marks[0], p2 = marks[1]; - double rx = (p2.X - p1.X) / 2.0 + 0.25, ry = (p2.Y - p1.Y) / 2.0 + 0.25, rz = (p2.Z - p1.Z) / 2.0 + 0.25; + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { + double rx = (Max.X - Min.X) / 2.0 + 0.25, ry = (Max.Y - Min.Y) / 2.0 + 0.25, rz = (Max.Z - Min.Z) / 2.0 + 0.25; return (int)(Math.PI * 4.0/3.0 * rx * ry * rz); } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { - Vec3U16 p1 = marks[0], p2 = marks[1]; + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { /* Courtesy of fCraft's awesome Open-Source'ness :D */ - double cx = (p1.X + p2.X) / 2.0, cy = (p1.Y + p2.Y) / 2.0, cz = (p1.Z + p2.Z) / 2.0; - double rx = (p2.X - p1.X) / 2.0 + 0.25, ry = (p2.Y - p1.Y) / 2.0 + 0.25, rz = (p2.Z - p1.Z) / 2.0 + 0.25; + double cx = (Min.X + Max.X) / 2.0, cy = (Min.Y + Max.Y) / 2.0, cz = (Min.Z + Max.Z) / 2.0; + double rx = (Max.X - Min.X) / 2.0 + 0.25, ry = (Max.Y - Min.Y) / 2.0 + 0.25, rz = (Max.Z - Min.Z) / 2.0 + 0.25; double rx2 = 1 / (rx * rx), ry2 = 1 / (ry * ry), rz2 = 1 / (rz * rz); + Vec3U16 min = Clamp(Min), max = Clamp(Max); - for (ushort yy = p1.Y; yy <= p2.Y; yy++) - for (ushort zz = p1.Z; zz <= p2.Z; zz++) - for (ushort xx = p1.X; xx <= p2.X; xx++) + for (ushort yy = min.Y; yy <= max.Y; yy++) + for (ushort zz = min.Z; zz <= max.Z; zz++) + for (ushort xx = min.X; xx <= max.X; xx++) { double dx = xx - cx, dy = yy - cy, dz = zz - cz; if ((dx * dx) * rx2 + (dy * dy) * ry2 + (dz * dz) * rz2 <= 1) @@ -52,26 +51,25 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Ellipsoid Hollow"; } } - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { - Vec3U16 p1 = marks[0], p2 = marks[1]; - double rx = (p2.X - p1.X) / 2.0 + 0.25, ry = (p2.Y - p1.Y) / 2.0 + 0.25, rz = (p2.Z - p1.Z) / 2.0 + 0.25; + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { + double rx = (Max.X - Min.X) / 2.0 + 0.25, ry = (Max.Y - Min.Y) / 2.0 + 0.25, rz = (Max.Z - Min.Z) / 2.0 + 0.25; return (int)(Math.PI * 4.0/3.0 * rx * ry * rz); } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { - Vec3U16 p1 = marks[0], p2 = marks[1]; + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { /* Courtesy of fCraft's awesome Open-Source'ness :D */ - double cx = (p1.X + p2.X) / 2.0, cy = (p1.Y + p2.Y) / 2.0, cz = (p1.Z + p2.Z) / 2.0; - double rx = (p2.X - p1.X) / 2.0 + 0.25, ry = (p2.Y - p1.Y) / 2.0 + 0.25, rz = (p2.Z - p1.Z) / 2.0 + 0.25; + double cx = (Min.X + Max.X) / 2.0, cy = (Min.Y + Max.Y) / 2.0, cz = (Min.Z + Max.Z) / 2.0; + double rx = (Max.X - Min.X) / 2.0 + 0.25, ry = (Max.Y - Min.Y) / 2.0 + 0.25, rz = (Max.Z - Min.Z) / 2.0 + 0.25; double rx2 = 1 / (rx * rx), ry2 = 1 / (ry * ry), rz2 = 1 / (rz * rz); double smallrx2 = 1 / ((rx - 1) * (rx - 1)); double smallry2 = 1 / ((ry - 1) * (ry - 1)); double smallrz2 = 1 / ((rz - 1) * (rz - 1)); + Vec3U16 min = Clamp(Min), max = Clamp(Max); - for (ushort yy = p1.Y; yy <= p2.Y; yy++) - for (ushort zz = p1.Z; zz <= p2.Z; zz++) - for (ushort xx = p1.X; xx <= p2.X; xx++) + for (ushort yy = min.Y; yy <= max.Y; yy++) + for (ushort zz = min.Z; zz <= max.Z; zz++) + for (ushort xx = min.X; xx <= max.X; xx++) { double dx = xx - cx, dy = yy - cy, dz = zz - cz; dx *= dx; dy *= dy; dz *= dz; @@ -86,21 +84,20 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Cylinder"; } } - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { - Vec3U16 p1 = marks[0], p2 = marks[1]; - double rx = (p2.X - p1.X) / 2.0 + 0.25, rz = (p2.Z - p1.Z) / 2.0 + 0.25; - int height = (p2.Y - p1.Y + 1); + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { + double rx = (Max.X - Min.X) / 2.0 + 0.25, rz = (Max.Z - Min.Z) / 2.0 + 0.25; + int height = (Max.Y - Min.Y + 1); return (int)(Math.PI * rx * rz * height); } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { - Vec3U16 p1 = marks[0], p2 = marks[1]; + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { /* Courtesy of fCraft's awesome Open-Source'ness :D */ - double cx = (p1.X + p2.X) / 2.0, cz = (p1.Z + p2.Z) / 2.0; - double rx = (p2.X - p1.X) / 2.0 + 0.25, rz = (p2.Z - p1.Z) / 2.0 + 0.25; - double rx2= 1 / (rx * rx), rz2 = 1 / (rz * rz); + double cx = (Min.X + Max.X) / 2.0, cz = (Min.Z + Max.Z) / 2.0; + double rx = (Max.X - Min.X) / 2.0 + 0.25, rz = (Max.Z - Min.Z) / 2.0 + 0.25; + double rx2 = 1 / (rx * rx), rz2 = 1 / (rz * rz); double smallrx2 = 1 / ((rx - 1) * (rx - 1)); double smallrz2 = 1 / ((rz - 1) * (rz - 1)); + Vec3U16 p1 = Clamp(Min), p2 = Clamp(Max); for (ushort yy = p1.Y; yy <= p2.Y; yy++) for (ushort zz = p1.Z; zz <= p2.Z; zz++) diff --git a/Drawing/DrawOps/TorusDrawOp.cs b/Drawing/DrawOps/TorusDrawOp.cs index 012e45c3e..be1211ec2 100644 --- a/Drawing/DrawOps/TorusDrawOp.cs +++ b/Drawing/DrawOps/TorusDrawOp.cs @@ -24,18 +24,17 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Torus"; } } - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { - Vec3U16 p1 = marks[0], p2 = marks[1]; - double rx = (p2.X - p1.X) / 2.0 + 0.25, ry = (p2.Y - p1.Y) / 2.0 + 0.25, rz = (p2.Z - p1.Z) / 2.0 + 0.25; + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { + double rx = (Max.X - Min.X) / 2.0 + 0.25, ry = (Max.Y - Min.Y) / 2.0 + 0.25, rz = (Max.Z - Min.Z) / 2.0 + 0.25; double rTube = ry, rCentre = Math.Min(rx, rz) - rTube; return (int)(2 * Math.PI * Math.PI * rTube * rTube * rCentre); } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { - Vec3U16 p1 = marks[0], p2 = marks[1]; - double cx = (p1.X + p2.X) / 2.0, cy = (p1.Y + p2.Y) / 2.0, cz = (p1.Z + p2.Z) / 2.0; - double rx = (p2.X - p1.X) / 2.0 + 0.25, ry = (p2.Y - p1.Y) / 2.0 + 0.25, rz = (p2.Z - p1.Z) / 2.0 + 0.25; + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { + double cx = (Min.X + Max.X) / 2.0, cy = (Min.Y + Max.Y) / 2.0, cz = (Min.Z + Max.Z) / 2.0; + double rx = (Max.X - Min.X) / 2.0 + 0.25, ry = (Max.Y - Min.Y) / 2.0 + 0.25, rz = (Max.Z - Min.Z) / 2.0 + 0.25; double rTube = ry, rCentre = Math.Min(rx, rz) - rTube; + Vec3U16 p1 = Clamp(Min), p2 = Clamp(Max); for (ushort yy = p1.Y; yy <= p2.Y; yy++) for (ushort zz = p1.Z; zz <= p2.Z; zz++) diff --git a/Drawing/DrawOps/TreeDrawOp.cs b/Drawing/DrawOps/TreeDrawOp.cs index 187000805..a9329fbc0 100644 --- a/Drawing/DrawOps/TreeDrawOp.cs +++ b/Drawing/DrawOps/TreeDrawOp.cs @@ -39,11 +39,11 @@ namespace MCGalaxy.Drawing.Ops { public const int T_Tree = 0, T_NotchTree = 1, T_NotchSwamp = 2, T_Cactus = 3; static Brush defBrush = new SolidBrush(Block.leaf, 0); - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { return -1; } + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { return -1; } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { if (brush == null) brush = defBrush; - Vec3U16 P = marks[0]; + Vec3U16 P = Clamp(marks[0]); if (Type == T_Tree) AddTree(p, lvl, P.X, P.Y, P.Z, brush); if (Type == T_NotchTree) AddNotchTree(p, lvl, P.X, P.Y, P.Z, brush); if (Type == T_NotchSwamp) AddNotchSwampTree(p, lvl, P.X, P.Y, P.Z, brush); diff --git a/Drawing/DrawOps/TriangleDrawOp.cs b/Drawing/DrawOps/TriangleDrawOp.cs index 961772b0d..94a47a8ae 100644 --- a/Drawing/DrawOps/TriangleDrawOp.cs +++ b/Drawing/DrawOps/TriangleDrawOp.cs @@ -24,7 +24,7 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Triangle"; } } - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { // Applying Heron's Formula float a = (marks[0] - marks[2]).Length; float b = (marks[1] - marks[2]).Length; @@ -33,14 +33,15 @@ namespace MCGalaxy.Drawing.Ops { return (int)Math.Sqrt(s * (s - a) * (s - b) * (s - c)); } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { Vec3F32 V1 = marks[0], V2 = marks[1], V3 = marks[2]; Vec3F32 N = Vec3F32.Cross(V2 - V1, V3 - V1); N = Vec3F32.Normalise(N); + Vec3U16 min = Clamp(Min), max = Clamp(Max); - for (ushort yy = Min.Y; yy <= Max.Y; yy++) - for (ushort zz = Min.Z; zz <= Max.Z; zz++) - for (ushort xx = Min.X; xx <= Max.X; xx++) + for (ushort yy = min.Y; yy <= max.Y; yy++) + for (ushort zz = min.Z; zz <= max.Z; zz++) + for (ushort xx = min.X; xx <= max.X; xx++) { // Project point onto the plane Vec3F32 P = new Vec3F32(xx, yy, zz); diff --git a/Drawing/DrawOps/UndoDrawOp.cs b/Drawing/DrawOps/UndoDrawOp.cs index a7135eade..9d1422ae5 100644 --- a/Drawing/DrawOps/UndoDrawOp.cs +++ b/Drawing/DrawOps/UndoDrawOp.cs @@ -40,9 +40,9 @@ namespace MCGalaxy.Drawing.Ops { internal Player who; internal Level saveLevel = null; - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { return -1; } + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { return -1; } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { PerformUndo(p, ref saveLevel); bool foundUser = false; UndoFile.UndoPlayer(p, who.name.ToLower(), marks, Start, ref foundUser); @@ -53,8 +53,8 @@ namespace MCGalaxy.Drawing.Ops { UndoCacheNode node = cache.Tail; if (node == null) return; - Vec3U16 min = Min, max = Max; - bool undoArea = min.X != ushort.MaxValue; + Vec3U16 min = (Vec3U16)Min, max = (Vec3U16)Max; + bool undoArea = Min.X != ushort.MaxValue; Player.UndoPos Pos = default(Player.UndoPos); int timeDelta = (int)DateTime.UtcNow.Subtract(Server.StartTime).TotalSeconds; @@ -104,9 +104,9 @@ namespace MCGalaxy.Drawing.Ops { internal string whoName; internal bool foundUser = false; - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { return -1; } + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { return -1; } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { UndoFile.UndoPlayer(p, whoName.ToLower(), marks, Start, ref foundUser); } } @@ -117,9 +117,9 @@ namespace MCGalaxy.Drawing.Ops { internal long seconds; - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { return -1; } + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { return -1; } - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { if (lvl.UndoBuffer.Count != Server.physUndo) { int count = lvl.currentUndo; for (int i = count; i >= 0; i--) { diff --git a/Drawing/DrawOps/WriteDrawOp.cs b/Drawing/DrawOps/WriteDrawOp.cs index bd47d3892..289114236 100644 --- a/Drawing/DrawOps/WriteDrawOp.cs +++ b/Drawing/DrawOps/WriteDrawOp.cs @@ -28,9 +28,7 @@ namespace MCGalaxy.Drawing.Ops { public override string Name { get { return "Write"; } } - public override bool MinMaxCoords { get { return false; } } - - public override long GetBlocksAffected(Level lvl, Vec3U16[] marks) { + public override long GetBlocksAffected(Level lvl, Vec3S32[] marks) { int blocks = 0; foreach (char c in Text) { if ((int)c >= 256 || letters[(int)c] == null) { @@ -45,8 +43,8 @@ namespace MCGalaxy.Drawing.Ops { } int dirX, dirZ; - public override void Perform(Vec3U16[] marks, Player p, Level lvl, Brush brush) { - Vec3U16 p1 = marks[0], p2 = marks[1]; + public override void Perform(Vec3S32[] marks, Player p, Level lvl, Brush brush) { + Vec3U16 p1 = Clamp(marks[0]), p2 = Clamp(marks[1]); if (Math.Abs(p2.X - p1.X) > Math.Abs(p2.Z - p1.Z)) dirX = p2.X > p1.X? 1 : -1; else diff --git a/GUI/PropertyWindow.Designer.cs b/GUI/PropertyWindow.Designer.cs index e96a2e0ad..12397f33c 100644 --- a/GUI/PropertyWindow.Designer.cs +++ b/GUI/PropertyWindow.Designer.cs @@ -487,7 +487,7 @@ namespace MCGalaxy.Gui // // tabChat // - this.tabChat.BackColor = System.Drawing.Color.White; + this.tabChat.BackColor = System.Drawing.SystemColors.Control; this.tabChat.Controls.Add(this.chat_gbTab); this.tabChat.Controls.Add(this.chat_gbMessages); this.tabChat.Controls.Add(this.chat_gbOther); @@ -2221,7 +2221,7 @@ namespace MCGalaxy.Gui // // pageMisc // - this.pageMisc.BackColor = System.Drawing.Color.White; + this.pageMisc.BackColor = System.Drawing.SystemColors.Control; this.pageMisc.Controls.Add(this.economyGroupBox); this.pageMisc.Controls.Add(this.grpExtra); this.pageMisc.Controls.Add(this.grpMessages); @@ -2527,7 +2527,7 @@ namespace MCGalaxy.Gui // // pageIRC // - this.pageIRC.BackColor = System.Drawing.Color.White; + this.pageIRC.BackColor = System.Drawing.SystemColors.Control; this.pageIRC.Controls.Add(this.grpSQL); this.pageIRC.Controls.Add(this.grpIRC); this.pageIRC.Location = new System.Drawing.Point(4, 22); @@ -2759,7 +2759,7 @@ namespace MCGalaxy.Gui // // pageServer // - this.pageServer.BackColor = System.Drawing.Color.White; + this.pageServer.BackColor = System.Drawing.SystemColors.Control; this.pageServer.Controls.Add(this.grpLevels); this.pageServer.Controls.Add(this.grpAdvanced); this.pageServer.Controls.Add(this.grpGeneral); diff --git a/Generator/RealisticMapGen.cs b/Generator/RealisticMapGen.cs index f24d8cb20..81ecf67ef 100644 --- a/Generator/RealisticMapGen.cs +++ b/Generator/RealisticMapGen.cs @@ -40,7 +40,7 @@ namespace MCGalaxy { ushort LiquidLevel; MapGenParams genParams; TreeDrawOp treeDrawer; - Vec3U16[] treeCoords; + Vec3S32[] treeCoords; public bool GenerateMap(Level Lvl, string type, int seed = 0, bool useSeed = false) { DateTime startTime = DateTime.UtcNow; @@ -52,7 +52,7 @@ namespace MCGalaxy { treeDrawer = new TreeDrawOp(); treeDrawer.random = rand; treeDrawer.method = DrawOp.M_SetTile; - treeCoords = new Vec3U16[1]; + treeCoords = new Vec3S32[1]; } try diff --git a/Levels/Physics/OtherPhysics.cs b/Levels/Physics/OtherPhysics.cs index 59ec7441f..517eb2593 100644 --- a/Levels/Physics/OtherPhysics.cs +++ b/Levels/Physics/OtherPhysics.cs @@ -123,7 +123,7 @@ namespace MCGalaxy.BlockPhysics { TreeDrawOp op = new TreeDrawOp(); op.random = rand; op.method = DrawOp.M_BlockChange; - op.Perform(new [] { new Vec3U16(x, y, z) }, null, lvl, null); + op.Perform(new [] { new Vec3S32(x, y, z) }, null, lvl, null); C.data.Data = 255; } diff --git a/Player/Undo/UndoFile.cs b/Player/Undo/UndoFile.cs index d54b801b2..9f2dfa9ac 100644 --- a/Player/Undo/UndoFile.cs +++ b/Player/Undo/UndoFile.cs @@ -35,7 +35,7 @@ namespace MCGalaxy.Util { protected abstract void ReadUndoData(List buffer, string path); - protected abstract bool UndoEntry(Player p, string path, Vec3U16[] marks, + protected abstract bool UndoEntry(Player p, string path, Vec3S32[] marks, ref byte[] temp, DateTime start); protected abstract bool HighlightEntry(Player p, string path, @@ -62,7 +62,7 @@ namespace MCGalaxy.Util { NewFormat.SaveUndoData(p.UndoBuffer, path); } - public static void UndoPlayer(Player p, string target, Vec3U16[] marks, DateTime start, ref bool FoundUser) { + public static void UndoPlayer(Player p, string target, Vec3S32[] marks, DateTime start, ref bool FoundUser) { FilterEntries(p, undoDir, target, marks, start, false, ref FoundUser); FilterEntries(p, prevUndoDir, target, marks, start, false, ref FoundUser); } @@ -72,7 +72,7 @@ namespace MCGalaxy.Util { FilterEntries(p, prevUndoDir, target, null, start, true, ref FoundUser); } - static void FilterEntries(Player p, string dir, string name, Vec3U16[] marks, + static void FilterEntries(Player p, string dir, string name, Vec3S32[] marks, DateTime start, bool highlight, ref bool FoundUser) { string path = Path.Combine(dir, name); if (!Directory.Exists(path)) diff --git a/Player/Undo/UndoFileBin.cs b/Player/Undo/UndoFileBin.cs index 65f570674..9dcc77f08 100644 --- a/Player/Undo/UndoFileBin.cs +++ b/Player/Undo/UndoFileBin.cs @@ -60,12 +60,12 @@ namespace MCGalaxy.Util { } } - protected override bool UndoEntry(Player p, string path, Vec3U16[] marks, + protected override bool UndoEntry(Player p, string path, Vec3S32[] marks, ref byte[] temp, DateTime start) { List list = new List(); int timeDelta = (int)DateTime.UtcNow.Subtract(Server.StartTime).TotalSeconds; Player.UndoPos Pos = default(Player.UndoPos); - Vec3U16 min = marks[0], max = marks[1]; + Vec3U16 min = (Vec3U16)marks[0], max = (Vec3U16)marks[1]; bool undoArea = min.X != ushort.MaxValue; using (Stream fs = File.OpenRead(path)) diff --git a/Player/Undo/UndoFileCBin.cs b/Player/Undo/UndoFileCBin.cs index 3c21d8161..5c437ce90 100644 --- a/Player/Undo/UndoFileCBin.cs +++ b/Player/Undo/UndoFileCBin.cs @@ -131,12 +131,12 @@ namespace MCGalaxy.Util { } } - protected override bool UndoEntry(Player p, string path, Vec3U16[] marks, + protected override bool UndoEntry(Player p, string path, Vec3S32[] marks, ref byte[] temp, DateTime start) { List list = new List(); int timeDelta = (int)DateTime.UtcNow.Subtract(Server.StartTime).TotalSeconds; Player.UndoPos Pos = default(Player.UndoPos); - Vec3U16 min = marks[0], max = marks[1]; + Vec3U16 min = (Vec3U16)marks[0], max = (Vec3U16)marks[1]; bool undoArea = min.X != ushort.MaxValue; UndoCacheItem item = default(UndoCacheItem); diff --git a/Player/Undo/UndoFileText.cs b/Player/Undo/UndoFileText.cs index d671bb554..cc9c1810f 100644 --- a/Player/Undo/UndoFileText.cs +++ b/Player/Undo/UndoFileText.cs @@ -59,12 +59,12 @@ namespace MCGalaxy.Util { } } - protected override bool UndoEntry(Player p, string path, Vec3U16[] marks, + protected override bool UndoEntry(Player p, string path, Vec3S32[] marks, ref byte[] temp, DateTime start) { Player.UndoPos Pos = default(Player.UndoPos); int timeDelta = (int)DateTime.UtcNow.Subtract(Server.StartTime).TotalSeconds; string[] lines = File.ReadAllText(path).Split(' '); - Vec3U16 min = marks[0], max = marks[1]; + Vec3U16 min = (Vec3U16)marks[0], max = (Vec3U16)marks[1]; bool undoArea = min.X != ushort.MaxValue; BufferedBlockSender buffer = new BufferedBlockSender(null); string last = null; diff --git a/util/Vectors.cs b/util/Vectors.cs index 94c15a0be..ce4f82bdf 100644 --- a/util/Vectors.cs +++ b/util/Vectors.cs @@ -114,8 +114,12 @@ namespace MCGalaxy { return new Vec3U16((ushort)(a.X + b.X), (ushort)(a.Y + b.Y), (ushort)(a.Z + b.Z)); } - public static Vec3S16 operator - (Vec3U16 a, Vec3U16 b) { - return new Vec3S16((short)(a.X - b.X), (short)(a.Y - b.Y), (short)(a.Z - b.Z)); + public static Vec3S32 operator - (Vec3U16 a, Vec3U16 b) { + return new Vec3S32(a.X - b.X, a.Y - b.Y, a.Z - b.Z); + } + + public static explicit operator Vec3U16(Vec3S32 a) { + return new Vec3U16((ushort)a.X, (ushort)a.Y, (ushort)a.Z); } public override string ToString() { @@ -127,19 +131,19 @@ namespace MCGalaxy { } } - public struct Vec3S16 { + public struct Vec3S32 { - public short X, Y, Z; + public int X, Y, Z; - public Vec3S16(short x, short y, short z) { + public Vec3S32(int x, int y, int z) { X = x; Y = y; Z = z; } public override bool Equals(object obj) { - return (obj is Vec3S16) && Equals((Vec3S16)obj); + return (obj is Vec3S32) && Equals((Vec3S32)obj); } - public bool Equals(Vec3S16 other) { + public bool Equals(Vec3S32 other) { return X == other.X & Y == other.Y && Z == other.Z; } @@ -155,13 +159,33 @@ namespace MCGalaxy { public float Length { get { return (float)Math.Sqrt( X * X + Y * Y + Z * Z ); } } - public float Dot(Vec3S16 b) { return X * b.X + Y * b.Y + Z * b.Z; } + public float Dot(Vec3S32 b) { return X * b.X + Y * b.Y + Z * b.Z; } - public static bool operator == (Vec3S16 a, Vec3S16 b) { + public static Vec3S32 Max(Vec3S32 a, Vec3S32 b) { + return new Vec3S32(Math.Max(a.X, b.X), Math.Max(a.Y, b.Y), Math.Max(a.Z, b.Z)); + } + + public static Vec3S32 Min(Vec3S32 a, Vec3S32 b) { + return new Vec3S32(Math.Min(a.X, b.X), Math.Min(a.Y, b.Y), Math.Min(a.Z, b.Z)); + } + + public static implicit operator Vec3S32(Vec3U16 a) { + return new Vec3S32(a.X, a.Y, a.Z); + } + + public static Vec3S32 operator + (Vec3S32 a, Vec3S32 b) { + return new Vec3S32(a.X + b.X, a.Y + b.Y, a.Z + b.Z); + } + + public static Vec3S32 operator - (Vec3S32 a, Vec3S32 b) { + return new Vec3S32(a.X - b.X, a.Y - b.Y, a.Z - b.Z); + } + + public static bool operator == (Vec3S32 a, Vec3S32 b) { return a.X == b.X && a.Y == b.Y && a.Z == b.Z; } - public static bool operator != (Vec3S16 a, Vec3S16 b) { + public static bool operator != (Vec3S32 a, Vec3S32 b) { return a.X != b.X || a.Y != b.Y || a.Z != b.Z; } @@ -218,10 +242,9 @@ namespace MCGalaxy { return new Vec3F32(a.X + b.X, a.Y + b.Y, a.Z + b.Z); } - public static implicit operator Vec3F32(Vec3U16 a) { + public static implicit operator Vec3F32(Vec3S32 a) { return new Vec3F32(a.X, a.Y, a.Z); - } - + } public override bool Equals(object obj) { return (obj is Vec3F32) && Equals((Vec3F32)obj);