From 864fe39adb94e3eaa64734564bbd449516fbdab2 Mon Sep 17 00:00:00 2001 From: Holly Date: Sat, 26 Apr 2025 12:43:09 +0100 Subject: [PATCH] Add Martin M2, M3, and M4 --- .../src/{Martin1.gd => MartinM1.gd} | 2 +- .../src/{Martin1.gd.uid => MartinM1.gd.uid} | 0 addons/godot-sstv/src/MartinM2.gd | 50 +++++++++++++++++++ addons/godot-sstv/src/MartinM2.gd.uid | 1 + addons/godot-sstv/src/MartinM3.gd | 50 +++++++++++++++++++ addons/godot-sstv/src/MartinM3.gd.uid | 1 + addons/godot-sstv/src/MartinM4.gd | 50 +++++++++++++++++++ addons/godot-sstv/src/MartinM4.gd.uid | 1 + addons/godot-sstv/tests/node_3d.gd | 5 +- 9 files changed, 158 insertions(+), 2 deletions(-) rename addons/godot-sstv/src/{Martin1.gd => MartinM1.gd} (98%) rename addons/godot-sstv/src/{Martin1.gd.uid => MartinM1.gd.uid} (100%) create mode 100644 addons/godot-sstv/src/MartinM2.gd create mode 100644 addons/godot-sstv/src/MartinM2.gd.uid create mode 100644 addons/godot-sstv/src/MartinM3.gd create mode 100644 addons/godot-sstv/src/MartinM3.gd.uid create mode 100644 addons/godot-sstv/src/MartinM4.gd create mode 100644 addons/godot-sstv/src/MartinM4.gd.uid diff --git a/addons/godot-sstv/src/Martin1.gd b/addons/godot-sstv/src/MartinM1.gd similarity index 98% rename from addons/godot-sstv/src/Martin1.gd rename to addons/godot-sstv/src/MartinM1.gd index 5f2887d..47c0af5 100644 --- a/addons/godot-sstv/src/Martin1.gd +++ b/addons/godot-sstv/src/MartinM1.gd @@ -1,5 +1,5 @@ extends SSTVEncoder -class_name Martin1 +class_name MartinM1 const COLOR_FREQ_MULT = 3.1372549 diff --git a/addons/godot-sstv/src/Martin1.gd.uid b/addons/godot-sstv/src/MartinM1.gd.uid similarity index 100% rename from addons/godot-sstv/src/Martin1.gd.uid rename to addons/godot-sstv/src/MartinM1.gd.uid diff --git a/addons/godot-sstv/src/MartinM2.gd b/addons/godot-sstv/src/MartinM2.gd new file mode 100644 index 0000000..1ad56a7 --- /dev/null +++ b/addons/godot-sstv/src/MartinM2.gd @@ -0,0 +1,50 @@ +extends SSTVEncoder +class_name MartinM2 + +const COLOR_FREQ_MULT = 3.1372549 + +func PixelRGBAsFrequencies(image: Image, scanLine: int, scanLinePos: int) -> Array: + var color = image.get_pixel(scanLinePos, scanLine) + var redFreq = float(color.r8) * COLOR_FREQ_MULT + 1500.0 + var greenFreq = float(color.g8) * COLOR_FREQ_MULT + 1500.0 + var blueFreq = float(color.b8) * COLOR_FREQ_MULT + 1500.0 + return [redFreq, greenFreq, blueFreq] + +const IMAGE_WIDTH = 160.0 +const IMAGE_HEIGHT = 256.0 +const BLANKING_INTERVAL = 0.000572 +const SCAN_LINE_LENGTH = 0.073216 +const SYNC_PULSE_LENGTH = 0.004862 + +var preparedImage = [] + +func PrepareImage(image: Image): + image.resize(IMAGE_WIDTH, IMAGE_HEIGHT) + image.convert(Image.FORMAT_RGB8) + + for scanLine in range(0, IMAGE_HEIGHT): + var red = [] + var green = [] + var blue = [] + for vertPos in range(0, IMAGE_WIDTH): + var freqs = PixelRGBAsFrequencies(image, scanLine, vertPos) + red.push_back(freqs[0]) + green.push_back(freqs[1]) + blue.push_back(freqs[2]) + preparedImage.push_back([green, blue, red]) + +func EncodeSSTV(image: Image, skipHeader: bool = false): + PrepareImage(image) + + if not skipHeader: + EncodePrefix() + EncodeHeader([false, true, false, true, false, false, false]) + + for scanLine in range(0, IMAGE_HEIGHT): + outputFloats.append_array(GenerateTone(SYNC_PULSE_FREQ, SYNC_PULSE_LENGTH)) + outputFloats.append_array(GenerateTone(BLANKING_PULSE_FREQ, BLANKING_INTERVAL)) + for dataLine in range(0, 3): + outputFloats.append_array(GenerateToneFromCurve(preparedImage[scanLine][dataLine], SCAN_LINE_LENGTH)) + outputFloats.append_array(GenerateTone(BLANKING_PULSE_FREQ, BLANKING_INTERVAL)) + + return outputFloats diff --git a/addons/godot-sstv/src/MartinM2.gd.uid b/addons/godot-sstv/src/MartinM2.gd.uid new file mode 100644 index 0000000..bc7b46a --- /dev/null +++ b/addons/godot-sstv/src/MartinM2.gd.uid @@ -0,0 +1 @@ +uid://70y3sjnd0v3r diff --git a/addons/godot-sstv/src/MartinM3.gd b/addons/godot-sstv/src/MartinM3.gd new file mode 100644 index 0000000..22318b1 --- /dev/null +++ b/addons/godot-sstv/src/MartinM3.gd @@ -0,0 +1,50 @@ +extends SSTVEncoder +class_name MartinM3 + +const COLOR_FREQ_MULT = 3.1372549 + +func PixelRGBAsFrequencies(image: Image, scanLine: int, scanLinePos: int) -> Array: + var color = image.get_pixel(scanLinePos, scanLine) + var redFreq = float(color.r8) * COLOR_FREQ_MULT + 1500.0 + var greenFreq = float(color.g8) * COLOR_FREQ_MULT + 1500.0 + var blueFreq = float(color.b8) * COLOR_FREQ_MULT + 1500.0 + return [redFreq, greenFreq, blueFreq] + +const IMAGE_WIDTH = 320.0 +const IMAGE_HEIGHT = 128.0 +const BLANKING_INTERVAL = 0.000572 +const SCAN_LINE_LENGTH = 0.146432 +const SYNC_PULSE_LENGTH = 0.004862 + +var preparedImage = [] + +func PrepareImage(image: Image): + image.resize(IMAGE_WIDTH, IMAGE_HEIGHT) + image.convert(Image.FORMAT_RGB8) + + for scanLine in range(0, IMAGE_HEIGHT): + var red = [] + var green = [] + var blue = [] + for vertPos in range(0, IMAGE_WIDTH): + var freqs = PixelRGBAsFrequencies(image, scanLine, vertPos) + red.push_back(freqs[0]) + green.push_back(freqs[1]) + blue.push_back(freqs[2]) + preparedImage.push_back([green, blue, red]) + +func EncodeSSTV(image: Image, skipHeader: bool = false): + PrepareImage(image) + + if not skipHeader: + EncodePrefix() + EncodeHeader([false, true, false, false, true, false, false]) + + for scanLine in range(0, IMAGE_HEIGHT): + outputFloats.append_array(GenerateTone(SYNC_PULSE_FREQ, SYNC_PULSE_LENGTH)) + outputFloats.append_array(GenerateTone(BLANKING_PULSE_FREQ, BLANKING_INTERVAL)) + for dataLine in range(0, 3): + outputFloats.append_array(GenerateToneFromCurve(preparedImage[scanLine][dataLine], SCAN_LINE_LENGTH)) + outputFloats.append_array(GenerateTone(BLANKING_PULSE_FREQ, BLANKING_INTERVAL)) + + return outputFloats diff --git a/addons/godot-sstv/src/MartinM3.gd.uid b/addons/godot-sstv/src/MartinM3.gd.uid new file mode 100644 index 0000000..e6baf34 --- /dev/null +++ b/addons/godot-sstv/src/MartinM3.gd.uid @@ -0,0 +1 @@ +uid://ccf7kch1577re diff --git a/addons/godot-sstv/src/MartinM4.gd b/addons/godot-sstv/src/MartinM4.gd new file mode 100644 index 0000000..9d05dd1 --- /dev/null +++ b/addons/godot-sstv/src/MartinM4.gd @@ -0,0 +1,50 @@ +extends SSTVEncoder +class_name MartinM4 + +const COLOR_FREQ_MULT = 3.1372549 + +func PixelRGBAsFrequencies(image: Image, scanLine: int, scanLinePos: int) -> Array: + var color = image.get_pixel(scanLinePos, scanLine) + var redFreq = float(color.r8) * COLOR_FREQ_MULT + 1500.0 + var greenFreq = float(color.g8) * COLOR_FREQ_MULT + 1500.0 + var blueFreq = float(color.b8) * COLOR_FREQ_MULT + 1500.0 + return [redFreq, greenFreq, blueFreq] + +const IMAGE_WIDTH = 160.0 +const IMAGE_HEIGHT = 128.0 +const BLANKING_INTERVAL = 0.000572 +const SCAN_LINE_LENGTH = 0.073216 +const SYNC_PULSE_LENGTH = 0.004862 + +var preparedImage = [] + +func PrepareImage(image: Image): + image.resize(IMAGE_WIDTH, IMAGE_HEIGHT) + image.convert(Image.FORMAT_RGB8) + + for scanLine in range(0, IMAGE_HEIGHT): + var red = [] + var green = [] + var blue = [] + for vertPos in range(0, IMAGE_WIDTH): + var freqs = PixelRGBAsFrequencies(image, scanLine, vertPos) + red.push_back(freqs[0]) + green.push_back(freqs[1]) + blue.push_back(freqs[2]) + preparedImage.push_back([green, blue, red]) + +func EncodeSSTV(image: Image, skipHeader: bool = false): + PrepareImage(image) + + if not skipHeader: + EncodePrefix() + EncodeHeader([false, true, false, false, false, false, false]) + + for scanLine in range(0, IMAGE_HEIGHT): + outputFloats.append_array(GenerateTone(SYNC_PULSE_FREQ, SYNC_PULSE_LENGTH)) + outputFloats.append_array(GenerateTone(BLANKING_PULSE_FREQ, BLANKING_INTERVAL)) + for dataLine in range(0, 3): + outputFloats.append_array(GenerateToneFromCurve(preparedImage[scanLine][dataLine], SCAN_LINE_LENGTH)) + outputFloats.append_array(GenerateTone(BLANKING_PULSE_FREQ, BLANKING_INTERVAL)) + + return outputFloats diff --git a/addons/godot-sstv/src/MartinM4.gd.uid b/addons/godot-sstv/src/MartinM4.gd.uid new file mode 100644 index 0000000..5b90365 --- /dev/null +++ b/addons/godot-sstv/src/MartinM4.gd.uid @@ -0,0 +1 @@ +uid://cj7mcnr5e463v diff --git a/addons/godot-sstv/tests/node_3d.gd b/addons/godot-sstv/tests/node_3d.gd index 6c3c55b..c3c340b 100644 --- a/addons/godot-sstv/tests/node_3d.gd +++ b/addons/godot-sstv/tests/node_3d.gd @@ -1,7 +1,10 @@ extends Node3D func encode_sstv(): - var encoder = Martin1.new() + #var encoder = MartinM4.new() + #var encoder = MartinM3.new() + #var encoder = MartinM1.new() + var encoder = Scottie1.new() #var encoder = RobotBW8.new() var cameraImage = get_viewport().get_texture().get_image() #var cameraImage = load("res://tests/checker.png").get_image()