diff --git a/src/bin/GPS.hx b/src/bin/GPS.hx index 21a49ca..9d9663c 100644 --- a/src/bin/GPS.hx +++ b/src/bin/GPS.hx @@ -2,7 +2,7 @@ package bin; import lib.CLIAppBase; import kernel.gps.INS; -import lib.Pos3; +import lib.WorldPos; import lib.Vec.Vec3; using tink.CoreApi; @@ -15,7 +15,7 @@ class GPS extends CLIAppBase { var y:Float = args.getFloat("y"); var z:Float = args.getFloat("z"); - var pos:Pos3 = new Vec3(x, y, z); + var pos:WorldPos = new Vec3(x, y, z); kernel.gps.GPS.setManualPosition(pos); diff --git a/src/bin/pathfinder/PFClient.hx b/src/bin/pathfinder/PFClient.hx index 3f8cf1a..ad0fab8 100644 --- a/src/bin/pathfinder/PFClient.hx +++ b/src/bin/pathfinder/PFClient.hx @@ -1,6 +1,6 @@ package bin.pathfinder; -import lib.Pos3; +import lib.WorldPos; import lib.ui.elements.IUIElement; import lib.ui.elements.TextElement; import lib.ui.elements.RootElement; @@ -36,7 +36,7 @@ class PFClient implements IProcess { private function render() { var acc = kernel.gps.GPS.getAccuracy(); - var pos:Pos3 = kernel.gps.GPS.getPosition() ?? {x: 0, y: 0, z: 0}; + var pos:WorldPos = kernel.gps.GPS.getPosition() ?? {x: 0, y: 0, z: 0}; var childre:Array = [ new TextElement('Acc: ${acc}'), diff --git a/src/kernel/KernelEvents.hx b/src/kernel/KernelEvents.hx index ef4534e..70aaf06 100644 --- a/src/kernel/KernelEvents.hx +++ b/src/kernel/KernelEvents.hx @@ -4,7 +4,7 @@ import kernel.turtle.TurtleMutex; import kernel.turtle.Turtle; import kernel.peripherals.Peripherals.Peripheral; import kernel.log.Log; -import lib.Pos; +import lib.ScreenPos; import cc.HTTP.HTTPResponse; import lua.TableTools; import lua.Coroutine; @@ -38,11 +38,11 @@ class KernelEvents { distance:Null }>; public static var onMonitorResize(default, null):Signal; - public static var onMonitorTouch(default, null):Signal<{addr:String, pos:Pos}>; - public static var onMouseClick(default, null):Signal<{button:ButtonType, pos:Pos}>; - public static var onMouseDrag(default, null):Signal<{button:ButtonType, pos:Pos}>; - public static var onMouseScroll(default, null):Signal<{dir:Int, pos:Pos}>; - public static var onMouseUp(default, null):Signal<{button:ButtonType, pos:Pos}>; + public static var onMonitorTouch(default, null):Signal<{addr:String, pos:ScreenPos}>; + public static var onMouseClick(default, null):Signal<{button:ButtonType, pos:ScreenPos}>; + public static var onMouseDrag(default, null):Signal<{button:ButtonType, pos:ScreenPos}>; + public static var onMouseScroll(default, null):Signal<{dir:Int, pos:ScreenPos}>; + public static var onMouseUp(default, null):Signal<{button:ButtonType, pos:ScreenPos}>; public static var onPaste(default, null):Signal; public static var onPeripheral(default, null):Signal; public static var onPeripheralDetach(default, null):Signal; @@ -75,11 +75,11 @@ class KernelEvents { distance:Null }> = Signal.trigger(); private static final onMonitorResizeTrigger:SignalTrigger = Signal.trigger(); - private static final onMonitorTouchTrigger:SignalTrigger<{addr:String, pos:Pos}> = Signal.trigger(); - private static final onMouseClickTrigger:SignalTrigger<{button:ButtonType, pos:Pos}> = Signal.trigger(); - private static final onMouseDragTrigger:SignalTrigger<{button:ButtonType, pos:Pos}> = Signal.trigger(); - private static final onMouseScrollTrigger:SignalTrigger<{dir:Int, pos:Pos}> = Signal.trigger(); - private static final onMouseUpTrigger:SignalTrigger<{button:ButtonType, pos:Pos}> = Signal.trigger(); + private static final onMonitorTouchTrigger:SignalTrigger<{addr:String, pos:ScreenPos}> = Signal.trigger(); + private static final onMouseClickTrigger:SignalTrigger<{button:ButtonType, pos:ScreenPos}> = Signal.trigger(); + private static final onMouseDragTrigger:SignalTrigger<{button:ButtonType, pos:ScreenPos}> = Signal.trigger(); + private static final onMouseScrollTrigger:SignalTrigger<{dir:Int, pos:ScreenPos}> = Signal.trigger(); + private static final onMouseUpTrigger:SignalTrigger<{button:ButtonType, pos:ScreenPos}> = Signal.trigger(); private static final onPasteTrigger:SignalTrigger = Signal.trigger(); private static final onPeripheralTrigger:SignalTrigger = Signal.trigger(); private static final onPeripheralDetachTrigger:SignalTrigger = Signal.trigger(); diff --git a/src/kernel/MainTerm.hx b/src/kernel/MainTerm.hx index 51bcef6..8c85ea0 100644 --- a/src/kernel/MainTerm.hx +++ b/src/kernel/MainTerm.hx @@ -1,6 +1,6 @@ package kernel; -import lib.Pos; +import lib.ScreenPos; import kernel.ui.ITermWriteable; import cc.Term; import lib.Vec.Vec2; @@ -39,7 +39,7 @@ class MainTerm implements ITermWriteable { Term.scroll(y); } - public function getCursorPos():Pos { + public function getCursorPos():ScreenPos { var rtn = Term.getCursorPos(); return { x: rtn.x - 1, @@ -60,7 +60,7 @@ class MainTerm implements ITermWriteable { Term.setCursorBlink(blink); } - public function getSize():Pos { + public function getSize():ScreenPos { var rtn = Term.getSize(); return { x: rtn.width, diff --git a/src/kernel/gps/GPS.hx b/src/kernel/gps/GPS.hx index 4b71648..f2c2a1f 100644 --- a/src/kernel/gps/GPS.hx +++ b/src/kernel/gps/GPS.hx @@ -5,7 +5,7 @@ import lib.KVStore; import kernel.net.Net; import kernel.net.INetworkInterface; import kernel.net.Package; -import lib.Pos3; +import lib.WorldPos; using tink.CoreApi; @@ -18,17 +18,17 @@ class GPS { private static var shouldRespond = true; private static var shouldDoWholeNumberCheck = true; private static var posAccuracy = 0; // 0 = unkown, 1 = (ins,best guess), 2 = (stored/manual,should be right), 3 = (gps,confirmed) - private static var cachedPosition:Pos3; - private static var lastPositionResponse:Array<{pos:Pos3, dist:Float}> = []; + private static var cachedPosition:WorldPos; + private static var lastPositionResponse:Array<{pos:WorldPos, dist:Float}> = []; - private static var futureResolve:(pos:Null) -> Void = null; + private static var futureResolve:(pos:Null) -> Void = null; @:allow(kernel.Init) private static function init() { loadCachedPosition(); } - public static function setManualPosition(pos:Pos3) { + public static function setManualPosition(pos:WorldPos) { var kvstore = new KVStore("gps"); kvstore.set("mpos", pos); kvstore.save(); @@ -40,12 +40,12 @@ class GPS { } @:allow(kernel.gps.INS) - private static function setINSPosition(pos:Pos3) { + private static function setINSPosition(pos:WorldPos) { cachedPosition = pos; posAccuracy = 1; } - public static function getPosition():Null { + public static function getPosition():Null { return cachedPosition; } @@ -58,17 +58,17 @@ class GPS { posAccuracy = 0; } - public static function locate():Future> { + public static function locate():Future> { // TODO: implenet a timeout // TODO: dont send a request twice if the last one is still pending or we moved - return new Future>((resolve) -> { + return new Future>((resolve) -> { futureResolve = resolve; sendPositionRequest(); return null; }); } - private static function resolveFuture(pos:Null) { + private static function resolveFuture(pos:Null) { futureResolve(pos); } @@ -85,8 +85,8 @@ class GPS { var kvstore = new KVStore("gps"); kvstore.load(); - var mPos:Null = kvstore.get("mpos"); // Manual set position - var cPos:Null = kvstore.get("cpos"); // Cached position + var mPos:Null = kvstore.get("mpos"); // Manual set position + var cPos:Null = kvstore.get("cpos"); // Cached position if (mPos != null && cPos != null && mPos == cPos) { // Both are the same, so we can use the cached position @@ -163,7 +163,7 @@ class GPS { } } - private static function calculatePosition():Null { + private static function calculatePosition():Null { if (lastPositionResponse.length < 3) return null; @@ -219,7 +219,7 @@ class GPS { /** Determines the position(s) of a point given 3 other points and the distance to each of them. **/ - private static function trilateration(p1:Pos3, p2:Pos3, p3:Pos3, r1:Float, r2:Float, r3:Float):Pair { + private static function trilateration(p1:WorldPos, p2:WorldPos, p3:WorldPos, r1:Float, r2:Float, r3:Float):Pair { var a2b = p2 - p1; var a2c = p3 - p1; diff --git a/src/kernel/gps/INS.hx b/src/kernel/gps/INS.hx index 7f30b17..d50667a 100644 --- a/src/kernel/gps/INS.hx +++ b/src/kernel/gps/INS.hx @@ -2,12 +2,12 @@ package kernel.gps; import kernel.log.Log; import kernel.turtle.Turtle; -import lib.Pos3; +import lib.WorldPos; using tink.CoreApi; class INS { - private static var heading:Null = null; + private static var heading:Null = null; private static var alingment:Int = 1; // 0 = degraded, 1 = not aligned, 2 = aligned @:allow(kernel.turtle.Turtle) @@ -68,7 +68,7 @@ class INS { } } - private static function move(dir:Null) { + private static function move(dir:Null) { var pos = GPS.getPosition(); if (pos == null || dir == null) return; @@ -76,7 +76,7 @@ class INS { GPS.setINSPosition(newPos); } - public static function getHeading():Null { + public static function getHeading():Null { return heading; } @@ -150,7 +150,7 @@ class INS { } } - private static function calcHeading(pos1:Pos3, pos2:Pos3, moved:Int):Null { + private static function calcHeading(pos1:WorldPos, pos2:WorldPos, moved:Int):Null { if (moved == 0) { return pos1 - pos2; } else if (moved == 1) { @@ -184,7 +184,7 @@ class INS { } } - private static function rotatePos3ToRight(pos:Pos3):Pos3 { + private static function rotatePos3ToRight(pos:WorldPos):WorldPos { if (pos.x == 0 && pos.z == -1) { return {x: 1, y: 0, z: 0}; } else if (pos.x == -1 && pos.z == 0) { @@ -198,7 +198,7 @@ class INS { } } - private static function rotatePos3ToLeft(pos3:Pos3):Pos3 { + private static function rotatePos3ToLeft(pos3:WorldPos):WorldPos { return rotatePos3ToRight(rotatePos3ToRight(rotatePos3ToRight(pos3))); } } diff --git a/src/kernel/net/Package.hx b/src/kernel/net/Package.hx index 99a021b..9774e3c 100644 --- a/src/kernel/net/Package.hx +++ b/src/kernel/net/Package.hx @@ -1,6 +1,6 @@ package kernel.net; -import lib.Pos3; +import lib.WorldPos; typedef NetworkID = Int; typedef GenericPackage = Package; @@ -12,7 +12,7 @@ enum PackageTypes { RouteDiscover(reachableIDs:Array<{id:NetworkID, cost:Int}>); RouteDiscoverResponse(reachableIDs:Array<{id:NetworkID, cost:Int}>); RouteDiscoverUpdate(reachableIDs:Array<{id:NetworkID, cost:Int}>); - GPSResponse(pos:Pos3); + GPSResponse(pos:WorldPos); GPSRequest(); } diff --git a/src/kernel/peripherals/Printer.hx b/src/kernel/peripherals/Printer.hx index f5eff70..11a60cb 100644 --- a/src/kernel/peripherals/Printer.hx +++ b/src/kernel/peripherals/Printer.hx @@ -2,7 +2,7 @@ package kernel.peripherals; import cc.Peripheral; import lib.Rect; -import lib.Pos; +import lib.ScreenPos; class Printer implements IPeripheral { public static inline final TYPE_NAME:String = "printer"; @@ -25,11 +25,11 @@ class Printer implements IPeripheral { public function write(text:String) {} - public function getCurserPos():Pos { - return new Pos({x: 0, y: 0}); + public function getCurserPos():ScreenPos { + return new ScreenPos({x: 0, y: 0}); } - public function setCurserPos(pos:Pos) { + public function setCurserPos(pos:ScreenPos) { this.native.setCursorPos(pos.x, pos.y); } diff --git a/src/kernel/peripherals/Screen.hx b/src/kernel/peripherals/Screen.hx index 7d2f5b5..0e1f32a 100644 --- a/src/kernel/peripherals/Screen.hx +++ b/src/kernel/peripherals/Screen.hx @@ -1,7 +1,7 @@ package kernel.peripherals; import cc.Peripheral; -import lib.Pos; +import lib.ScreenPos; import cc.Term.TerminalSize; import kernel.ui.ITermWriteable; import lib.Vec.Vec2; @@ -59,7 +59,7 @@ class Screen implements ITermWriteable implements IPeripheral { nativ.scroll(y); } - public function getCursorPos():Pos { + public function getCursorPos():ScreenPos { var rtn = nativ.getCursorPos(); return { x: rtn.x - 1, diff --git a/src/kernel/ui/BufferedVirtualTermWriter.hx b/src/kernel/ui/BufferedVirtualTermWriter.hx index bc48127..5f7b427 100644 --- a/src/kernel/ui/BufferedVirtualTermWriter.hx +++ b/src/kernel/ui/BufferedVirtualTermWriter.hx @@ -1,6 +1,6 @@ package kernel.ui; -import lib.Pos; +import lib.ScreenPos; import lib.Vec.Vec2; import lib.Color; import kernel.ui.ITermWriteable; @@ -86,7 +86,7 @@ class BufferedVirtualTermWriter implements IVirtualTermWriter extends TermBuffer super.scroll(y); } - public override function getCursorPos():Pos { + public override function getCursorPos():ScreenPos { if (isEnabled()) { return target.getCursorPos(); } else { diff --git a/src/kernel/ui/ITermWriteable.hx b/src/kernel/ui/ITermWriteable.hx index e307097..18f15c8 100644 --- a/src/kernel/ui/ITermWriteable.hx +++ b/src/kernel/ui/ITermWriteable.hx @@ -1,6 +1,6 @@ package kernel.ui; -import lib.Pos; +import lib.ScreenPos; import lib.Color; import lib.Vec.Vec2; @@ -18,7 +18,7 @@ interface ITermWriteable { /** Even though CC is 1 based we use a 0 based index. **/ - public function getCursorPos():Pos; + public function getCursorPos():ScreenPos; /** Even though CC is 1 based we use a 0 based index. diff --git a/src/kernel/ui/StatelessVirtualTermWriter.hx b/src/kernel/ui/StatelessVirtualTermWriter.hx index adafac7..6bc8269 100644 --- a/src/kernel/ui/StatelessVirtualTermWriter.hx +++ b/src/kernel/ui/StatelessVirtualTermWriter.hx @@ -1,7 +1,7 @@ package kernel.ui; import kernel.log.Log; -import lib.Pos; +import lib.ScreenPos; import lib.Vec.Vec2; import lib.Color; @@ -110,8 +110,8 @@ class StatelessVirtualTermWriter implements IVirtualTermWriter { target.scroll(y); } - public inline function getCursorPos():Pos { - return enabled ? target.getCursorPos() : new Pos({x: 0, y: 0}); + public inline function getCursorPos():ScreenPos { + return enabled ? target.getCursorPos() : new ScreenPos({x: 0, y: 0}); } public inline function setCursorPos(x:Int, y:Int) { diff --git a/src/kernel/ui/TermBuffer.hx b/src/kernel/ui/TermBuffer.hx index 8327c49..3060304 100644 --- a/src/kernel/ui/TermBuffer.hx +++ b/src/kernel/ui/TermBuffer.hx @@ -1,6 +1,6 @@ package kernel.ui; -import lib.Pos; +import lib.ScreenPos; import lib.Vec.Vec2; import lib.Color; import kernel.ui.ITermWriteable; @@ -18,7 +18,7 @@ class TermBuffer implements ITermWriteable { **/ private var screenBuffer:Array>; - private var cursorPos:Pos = {x: 0, y: 0}; + private var cursorPos:ScreenPos = {x: 0, y: 0}; private var currentTextColor:Color = White; private var currentBgColor:Color = Black; private var cursorBlink:Bool = false; @@ -91,7 +91,7 @@ class TermBuffer implements ITermWriteable { target.setCursorBlink(cursorBlink); } - private function safeWriteScreenBuffer(pos:Pos, char:String) { + private function safeWriteScreenBuffer(pos:ScreenPos, char:String) { if (screenBuffer.length > pos.y && screenBuffer[pos.y].length > pos.x) { screenBuffer[pos.y][pos.x].char = char; screenBuffer[pos.y][pos.x].bg = currentBgColor; @@ -121,7 +121,7 @@ class TermBuffer implements ITermWriteable { ]); } - public function getCursorPos():Pos { + public function getCursorPos():ScreenPos { return cursorPos; } diff --git a/src/kernel/ui/WindowContext.hx b/src/kernel/ui/WindowContext.hx index 237f08d..26ebe42 100644 --- a/src/kernel/ui/WindowContext.hx +++ b/src/kernel/ui/WindowContext.hx @@ -1,7 +1,7 @@ package kernel.ui; import lib.ui.rendere.IUIEventDelegate; -import lib.Pos; +import lib.ScreenPos; import lib.Color; import kernel.ButtonType; import lib.Vec.Vec2; @@ -17,21 +17,21 @@ class WindowContext implements ITermWriteable { @:allow(kernel.ui.WindowManager) private var eventDelegate:Null; - public var onClick(default, null):Signal<{button:ButtonType, pos:Pos}>; + public var onClick(default, null):Signal<{button:ButtonType, pos:ScreenPos}>; public var onKey(default, null):Signal<{keyCode:Int, isHeld:Bool}>; public var onKeyUp(default, null):Signal; - public var onMouseDrag(default, null):Signal<{button:ButtonType, pos:Pos}>; - public var onMouseScroll(default, null):Signal<{dir:Int, pos:Pos}>; - public var onMouseUp(default, null):Signal<{button:ButtonType, pos:Pos}>; + public var onMouseDrag(default, null):Signal<{button:ButtonType, pos:ScreenPos}>; + public var onMouseScroll(default, null):Signal<{dir:Int, pos:ScreenPos}>; + public var onMouseUp(default, null):Signal<{button:ButtonType, pos:ScreenPos}>; public var onPaste(default, null):Signal; public var onChar(default, null):Signal; - @:allow(kernel.ui.WindowManager) private final onClickTrigger:SignalTrigger<{button:ButtonType, pos:Pos}>; + @:allow(kernel.ui.WindowManager) private final onClickTrigger:SignalTrigger<{button:ButtonType, pos:ScreenPos}>; @:allow(kernel.ui.WindowManager) private final onKeyTrigger:SignalTrigger<{keyCode:Int, isHeld:Bool}>; @:allow(kernel.ui.WindowManager) private final onKeyUpTrigger:SignalTrigger; - @:allow(kernel.ui.WindowManager) private final onMouseDragTrigger:SignalTrigger<{button:ButtonType, pos:Pos}>; - @:allow(kernel.ui.WindowManager) private final onMouseScrollTrigger:SignalTrigger<{dir:Int, pos:Pos}>; - @:allow(kernel.ui.WindowManager) private final onMouseUpTrigger:SignalTrigger<{button:ButtonType, pos:Pos}>; + @:allow(kernel.ui.WindowManager) private final onMouseDragTrigger:SignalTrigger<{button:ButtonType, pos:ScreenPos}>; + @:allow(kernel.ui.WindowManager) private final onMouseScrollTrigger:SignalTrigger<{dir:Int, pos:ScreenPos}>; + @:allow(kernel.ui.WindowManager) private final onMouseUpTrigger:SignalTrigger<{button:ButtonType, pos:ScreenPos}>; @:allow(kernel.ui.WindowManager) private final onPasteTrigger:SignalTrigger; @:allow(kernel.ui.WindowManager) private final onCharTrigger:SignalTrigger; @@ -89,7 +89,7 @@ class WindowContext implements ITermWriteable { writer.scroll(y); } - public inline function getCursorPos():Pos { + public inline function getCursorPos():ScreenPos { return writer.getCursorPos(); } diff --git a/src/lib/BlockPos.hx b/src/lib/BlockPos.hx new file mode 100644 index 0000000..a82f3cd --- /dev/null +++ b/src/lib/BlockPos.hx @@ -0,0 +1,103 @@ +package lib; + +import lib.Vec.Vec3; + +/** + Represents a Point in a 3D `Int` System. + Basicly a wrapper for Vec3 with some extra functions. + `Y` represents the height of the point. +**/ +@:forward(x, y, z) +abstract BlockPos(Vec3) from Vec3 to Vec3 { + public inline function new(x:Int, y:Int, z:Int) { + this = new Vec3(x, y, z); + } + + @:op(A + B) + public function add(rhs:BlockPos):BlockPos { + return { + y: this.y + rhs.y, + x: this.x + rhs.x, + z: this.z + rhs.z + }; + } + + @:op(A - B) + public function sub(rhs:BlockPos):BlockPos { + return { + y: this.y - rhs.y, + x: this.x - rhs.x, + z: this.z - rhs.z + }; + } + + @:op(A * B) + public function multiplyScalar(rhs:Int):BlockPos { + return { + y: this.y * rhs, + x: this.x * rhs, + z: this.z * rhs + }; + } + + @:op(-A) + public function negate():BlockPos { + return { + y: -this.y, + x: -this.x, + z: -this.z + }; + } + + @:op(A == B) + public function equals(rhs:BlockPos):Bool { + return this.x == rhs.x && this.y == rhs.y && this.z == rhs.z; + } + + @:op(A != B) + public function notEquals(rhs:BlockPos):Bool { + return !equals(rhs); + } + + public function dot(rhs:BlockPos):Float { + return this.x * rhs.x + this.y * rhs.y + this.z * rhs.z; + } + + public function cross(rhs:BlockPos):BlockPos { + return { + x: this.x * rhs.y - this.y * rhs.x, + y: this.y * rhs.z - this.z * rhs.y, + z: this.z * rhs.x - this.x * rhs.z, + }; + } + + public function length():Float { + return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); + } + + public function hashCode():Int { + return (this.x * 73856093) ^ (this.y * 19349663) ^ (this.z * 83492791); + } + + public function toString():String { + return 'BlockPos(${this.x}, ${this.y}, ${this.z})'; + } + + public function distance(rhs:BlockPos):Float { + return Math.sqrt(Math.pow(this.x - rhs.x, 2) + Math.pow(this.y - rhs.y, 2) + Math.pow(this.z - rhs.z, 2)); + } + + /** + Returns a list of positions neighboring the block. No Diagonal. + **/ + public function neighbors():Array { + return [ + new BlockPos(this.x + 1, this.y + 0, this.z + 0), // Front + new BlockPos(this.x - 1, this.y + 0, this.z + 0), // Back + new BlockPos(this.x + 0, this.y + 0, this.z - 1), // Left + new BlockPos(this.x + 0, this.y + 0, this.z + 1), // Right + new BlockPos(this.x + 0, this.y - 1, this.z + 0), // Bot + new BlockPos(this.x + 0, this.y + 1, this.z + 0), // Top + ]; + } +} diff --git a/src/lib/Rect.hx b/src/lib/Rect.hx index 13052a1..b8811bd 100644 --- a/src/lib/Rect.hx +++ b/src/lib/Rect.hx @@ -1,10 +1,12 @@ package lib; -class Rect { - private final tl:Pos; - private final br:Pos; +import kernel.peripherals.Screen; - public function new(p1:Pos, p2:Pos) { +class Rect { + public final tl:ScreenPos; + public final br:ScreenPos; + + public function new(p1:ScreenPos, p2:ScreenPos) { this.tl = { x: MathI.min(p1.x, p2.x), y: MathI.min(p1.y, p2.y) @@ -20,11 +22,11 @@ class Rect { return getWidth() * getHight(); } - public function isInside(p:Pos):Bool { + public function isInside(p:ScreenPos):Bool { return (p.x >= tl.x && p.x <= br.x) && (p.y >= tl.y && p.y <= br.y); } - public function isOutside(p:Pos):Bool { + public function isOutside(p:ScreenPos):Bool { return !this.isInside(p); } @@ -36,7 +38,7 @@ class Rect { return br.x - tl.x; } - public function offset(pos:Pos) { + public function offset(pos:ScreenPos) { tl.x += pos.x; tl.y += pos.y; br.x += pos.x; diff --git a/src/lib/Pos.hx b/src/lib/ScreenPos.hx similarity index 57% rename from src/lib/Pos.hx rename to src/lib/ScreenPos.hx index 84003b0..f1cae0d 100644 --- a/src/lib/Pos.hx +++ b/src/lib/ScreenPos.hx @@ -7,38 +7,38 @@ import lib.Vec.Vec2; Basicly a wrapper for Vec2 with some extra functions. **/ @:forward(x, y) -abstract Pos(Vec2) from Vec2 to Vec2 { +abstract ScreenPos(Vec2) from Vec2 to Vec2 { inline public function new(i:Vec2) { this = i; } @:op(A + B) - public function add(rhs:Vec2):Pos { - return new Pos({ + public function add(rhs:Vec2):ScreenPos { + return new ScreenPos({ y: this.y + rhs.y, x: this.x + rhs.x, }); } @:op(A - B) - public function sub(rhs:Vec2):Pos { - return new Pos({ + public function sub(rhs:Vec2):ScreenPos { + return new ScreenPos({ y: this.y - rhs.y, x: this.x - rhs.x, }); } @:op(A * B) - public function multiply(rhs:Vec2):Pos { - return new Pos({ + public function multiply(rhs:Vec2):ScreenPos { + return new ScreenPos({ y: this.y * rhs.y, x: this.x * rhs.x, }); } @:op(-A) - public function negate():Pos { - return new Pos({ + public function negate():ScreenPos { + return new ScreenPos({ y: -this.y, x: -this.x, }); diff --git a/src/lib/Pos3.hx b/src/lib/WorldPos.hx similarity index 63% rename from src/lib/Pos3.hx rename to src/lib/WorldPos.hx index 99c144a..f5b1006 100644 --- a/src/lib/Pos3.hx +++ b/src/lib/WorldPos.hx @@ -8,14 +8,14 @@ import lib.Vec.Vec3; `Y` represents the height of the point. **/ @:forward(x, y, z) -abstract Pos3(Vec3) from Vec3 to Vec3 { +abstract WorldPos(Vec3) from Vec3 to Vec3 { inline public function new(i:Vec3) { this = i; } @:op(A + B) - public function add(rhs:Vec3):Pos3 { - return new Pos3({ + public function add(rhs:Vec3):WorldPos { + return new WorldPos({ y: this.y + rhs.y, x: this.x + rhs.x, z: this.z + rhs.z @@ -23,8 +23,8 @@ abstract Pos3(Vec3) from Vec3 to Vec3 { } @:op(A - B) - public function sub(rhs:Vec3):Pos3 { - return new Pos3({ + public function sub(rhs:Vec3):WorldPos { + return new WorldPos({ y: this.y - rhs.y, x: this.x - rhs.x, z: this.z - rhs.z @@ -32,8 +32,8 @@ abstract Pos3(Vec3) from Vec3 to Vec3 { } @:op(A * B) - public function multiplyScalar(rhs:Float):Pos3 { - return new Pos3({ + public function multiplyScalar(rhs:Float):WorldPos { + return new WorldPos({ y: this.y * rhs, x: this.x * rhs, z: this.z * rhs @@ -41,8 +41,8 @@ abstract Pos3(Vec3) from Vec3 to Vec3 { } @:op(A / B) - public function divideScalar(rhs:Float):Pos3 { - return new Pos3({ + public function divideScalar(rhs:Float):WorldPos { + return new WorldPos({ y: this.y / rhs, x: this.x / rhs, z: this.z / rhs @@ -50,8 +50,8 @@ abstract Pos3(Vec3) from Vec3 to Vec3 { } @:op(-A) - public function negate():Pos3 { - return new Pos3({ + public function negate():WorldPos { + return new WorldPos({ y: -this.y, x: -this.x, z: -this.z @@ -62,15 +62,15 @@ abstract Pos3(Vec3) from Vec3 to Vec3 { return this.x * rhs.x + this.y * rhs.y + this.z * rhs.z; } - public function cross(rhs:Vec3):Pos3 { - return new Pos3({ + public function cross(rhs:Vec3):WorldPos { + return new WorldPos({ x: this.y * rhs.z - this.z * rhs.y, y: this.z * rhs.x - this.x * rhs.z, z: this.x * rhs.y - this.y * rhs.x }); } - public function normalize():Pos3 { + public function normalize():WorldPos { var l = length(); return multiplyScalar(1 / l); } @@ -80,32 +80,32 @@ abstract Pos3(Vec3) from Vec3 to Vec3 { } @:op(A == B) - public function equals(rhs:Pos3):Bool { + public function equals(rhs:WorldPos):Bool { return close(rhs); } @:op(A != B) - public function notEquals(rhs:Pos3):Bool { + public function notEquals(rhs:WorldPos):Bool { return !close(rhs); } - public function close(rhs:Pos3, epsilon:Float = 0.001):Bool { + public function close(rhs:WorldPos, epsilon:Float = 0.001):Bool { return Math.abs(this.x - rhs.x) < epsilon && Math.abs(this.y - rhs.y) < epsilon && Math.abs(this.z - rhs.z) < epsilon; } public function toString():String { - return 'Pos3(${this.x}, ${this.y}, ${this.z})'; + return 'WorldPos(${this.x}, ${this.y}, ${this.z})'; } - public function round():Pos3 { - return new Pos3({ + public function round():WorldPos { + return new WorldPos({ x: Math.fround(this.x), y: Math.fround(this.y), z: Math.fround(this.z) }); } - public function distance(rhs:Pos3):Float { + public function distance(rhs:WorldPos):Float { return Math.sqrt(Math.pow(this.x - rhs.x, 2) + Math.pow(this.y - rhs.y, 2) + Math.pow(this.z - rhs.z, 2)); } } diff --git a/src/lib/ui/Canvas.hx b/src/lib/ui/Canvas.hx index 786c1e1..ad2a723 100644 --- a/src/lib/ui/Canvas.hx +++ b/src/lib/ui/Canvas.hx @@ -1,7 +1,7 @@ package lib.ui; import kernel.ui.WindowContext; -import lib.Pos; +import lib.ScreenPos; import lib.Rect; import kernel.ui.Pixel; @@ -10,7 +10,7 @@ abstract Canvas(Array>) to Array> from Array>) to Array> from Array { + public inline function get(i:ScreenPos):Null { if (this[i.y] == null) { return null; } @@ -26,11 +26,11 @@ abstract Canvas(Array>) to Array> from Array { + public function keyValueIterator():KeyValueIterator { return new CanvasKeyValueIterator(this); } - public function combine(other:Canvas, offset:Pos) { + public function combine(other:Canvas, offset:ScreenPos) { for (key => value in other) { if (value == null) { continue; @@ -127,8 +127,8 @@ abstract Canvas(Array>) to Array> from Array>; - private var index:Null = {x: 0, y: 0}; - private var nextIndex:Null = null; + private var index:Null = {x: 0, y: 0}; + private var nextIndex:Null = null; @:allow(lib.ui.Canvas) private function new(canvas:Array>) { @@ -141,7 +141,7 @@ class CanvasKeyValueIterator { this.nextIndex = nextValidPixel(); } - private function isValidPos(pos:Pos):Bool { + private function isValidPos(pos:ScreenPos):Bool { if (this.canvas[pos.y] == null) { return false; } @@ -157,7 +157,7 @@ class CanvasKeyValueIterator { return this.index != null; } - private function nextValidPixel():Null { + private function nextValidPixel():Null { if (this.index == null) { return null; } @@ -182,7 +182,7 @@ class CanvasKeyValueIterator { return null; } - public function next():{key:Pos, value:Pixel} { + public function next():{key:ScreenPos, value:Pixel} { var rtn = { key: this.index, value: this.canvas[this.index.y][this.index.x] diff --git a/src/lib/ui/UIEvents.hx b/src/lib/ui/UIEvents.hx index f603749..2fb8e5b 100644 --- a/src/lib/ui/UIEvents.hx +++ b/src/lib/ui/UIEvents.hx @@ -1,17 +1,17 @@ package lib.ui; -import lib.Pos; +import lib.ScreenPos; import kernel.ButtonType; using tink.CoreApi; typedef UIEvents = { - public var ?onClick:Callback<{button:ButtonType, pos:Pos}>; + public var ?onClick:Callback<{button:ButtonType, pos:ScreenPos}>; public var ?onKey:Callback<{keyCode:Int, isHeld:Bool}>; public var ?onKeyUp:Callback; - public var ?onMouseDrag:Callback<{button:ButtonType, pos:Pos}>; - public var ?onMouseScroll:Callback<{dir:Int, pos:Pos}>; - public var ?onMouseUp:Callback<{button:ButtonType, pos:Pos}>; + public var ?onMouseDrag:Callback<{button:ButtonType, pos:ScreenPos}>; + public var ?onMouseScroll:Callback<{dir:Int, pos:ScreenPos}>; + public var ?onMouseUp:Callback<{button:ButtonType, pos:ScreenPos}>; public var ?onPaste:Callback; public var ?onChar:Callback; } diff --git a/src/lib/ui/elements/EventMap.hx b/src/lib/ui/elements/EventMap.hx index 005b301..34cd70c 100644 --- a/src/lib/ui/elements/EventMap.hx +++ b/src/lib/ui/elements/EventMap.hx @@ -15,7 +15,7 @@ abstract EventMap(Array<{bound:Rect, delegate:IUIEventDelegate}>) { } } - public function findResponseableDelegate(pos:Pos):IUIEventDelegate { + public function findResponseableDelegate(pos:ScreenPos):IUIEventDelegate { for (i in 0...this.length) { var newi = (this.length - 1) - i; var element = this[newi]; diff --git a/src/lib/ui/elements/IUIElement.hx b/src/lib/ui/elements/IUIElement.hx index deda016..4e1b387 100644 --- a/src/lib/ui/elements/IUIElement.hx +++ b/src/lib/ui/elements/IUIElement.hx @@ -3,5 +3,5 @@ package lib.ui.elements; import lib.ui.rendere.IUIEventDelegate; interface IUIElement extends IUIEventDelegate { - public function render(bounds:Pos):Canvas; + public function render(bounds:ScreenPos):Canvas; } diff --git a/src/lib/ui/elements/RootElement.hx b/src/lib/ui/elements/RootElement.hx index 79538ef..20bea12 100644 --- a/src/lib/ui/elements/RootElement.hx +++ b/src/lib/ui/elements/RootElement.hx @@ -21,15 +21,15 @@ class RootElement implements IUIElement { this.children = children; } - public function render(bounds:Pos):Canvas { + public function render(bounds:ScreenPos):Canvas { var canvas = new Canvas(); - var offset = new Pos({x: 0, y: 0}); + var offset = new ScreenPos({x: 0, y: 0}); if (hasTitle()) { var title = new TextElement(this.title); var halfWidth = Math.floor(bounds.x / 2) - Math.floor(this.title.length / 2); canvas.combine(title.render(bounds), {x: halfWidth, y: offset.y}); - offset = new Pos({x: 0, y: 1}); + offset = new ScreenPos({x: 0, y: 1}); } this.eventManager.clearMap(); @@ -42,7 +42,7 @@ class RootElement implements IUIElement { this.eventManager.addMapElement(child, bounds); canvas.combine(childCanvas, offset); - offset = new Pos({x: 0, y: offset.y + bounds.getHight() + 1}); + offset = new ScreenPos({x: 0, y: offset.y + bounds.getHight() + 1}); } return canvas; diff --git a/src/lib/ui/elements/TextElement.hx b/src/lib/ui/elements/TextElement.hx index dfa78c4..bc7811e 100644 --- a/src/lib/ui/elements/TextElement.hx +++ b/src/lib/ui/elements/TextElement.hx @@ -26,7 +26,7 @@ class TextElement implements IUIElement { return uiEvents; } - public function render(bounds:Pos):Canvas { + public function render(bounds:ScreenPos):Canvas { var canvas = new Canvas(); var x = 0; diff --git a/src/lib/ui/elements/UIEventManager.hx b/src/lib/ui/elements/UIEventManager.hx index 44745a4..ad857f3 100644 --- a/src/lib/ui/elements/UIEventManager.hx +++ b/src/lib/ui/elements/UIEventManager.hx @@ -30,7 +30,7 @@ class UIEventManager implements IUIEventDelegate { }; } - private function handleClickEvent(params:{button:ButtonType, pos:Pos}) { + private function handleClickEvent(params:{button:ButtonType, pos:ScreenPos}) { var element = this.map.findResponseableDelegate(params.pos); if (element == null) { return; @@ -48,11 +48,11 @@ class UIEventManager implements IUIEventDelegate { private function handlePasteEvent(text:String) {} - private function handleMouseUpEvent(params:{button:ButtonType, pos:Pos}) {} + private function handleMouseUpEvent(params:{button:ButtonType, pos:ScreenPos}) {} - private function handleMouseScrollEvent(params:{dir:Int, pos:Pos}) {} + private function handleMouseScrollEvent(params:{dir:Int, pos:ScreenPos}) {} - private function handleMouseDragEvent(params:{button:ButtonType, pos:Pos}) {} + private function handleMouseDragEvent(params:{button:ButtonType, pos:ScreenPos}) {} private function handleKeyEvent(params:{keyCode:Int, isHeld:Bool}) {}