diff --git a/Machines/Typer.cpp b/Machines/Typer.cpp index 5fed58a28..241dc3810 100644 --- a/Machines/Typer.cpp +++ b/Machines/Typer.cpp @@ -15,7 +15,7 @@ Typer::Typer(const char *string, int delay, int frequency, Delegate *delegate) : counter_(-delay), frequency_(frequency), string_pointer_(0), delegate_(delegate), phase_(0) { size_t string_size = strlen(string) + 3; string_ = (char *)malloc(string_size); - snprintf(string_, strlen(string) + 3, "%c%s%c", Typer::BeginString, string, Typer::EndString); + snprintf(string_, string_size, "%c%s%c", Typer::BeginString, string, Typer::EndString); } void Typer::update(int duration) { diff --git a/Machines/Typer.hpp b/Machines/Typer.hpp index a94de9438..dc089d4c4 100644 --- a/Machines/Typer.hpp +++ b/Machines/Typer.hpp @@ -51,7 +51,6 @@ class TypeRecipient: public Typer::Delegate { void typer_reset(Typer *typer) { clear_all_keys(); - typer_.reset(); } protected: diff --git a/Outputs/CRT/CRT.cpp b/Outputs/CRT/CRT.cpp index 5b4cf0cdc..c5ba7ee68 100644 --- a/Outputs/CRT/CRT.cpp +++ b/Outputs/CRT/CRT.cpp @@ -113,7 +113,7 @@ Flywheel::SyncEvent CRT::get_next_horizontal_sync_event(bool hsync_is_requested, #define source_output_position_y() (*(uint16_t *)&next_run[SourceVertexOffsetOfOutputStart + 2]) #define source_output_position_x2() (*(uint16_t *)&next_run[SourceVertexOffsetOfEnds + 2]) #define source_phase() next_run[SourceVertexOffsetOfPhaseTimeAndAmplitude + 0] -#define source_amplitude() next_run[SourceVertexOffsetOfPhaseTimeAndAmplitude + 2] +#define source_amplitude() next_run[SourceVertexOffsetOfPhaseTimeAndAmplitude + 1] void CRT::advance_cycles(unsigned int number_of_cycles, bool hsync_requested, bool vsync_requested, const Scan::Type type) { std::unique_lock output_lock = openGL_output_builder_.get_output_lock(); diff --git a/Outputs/CRT/Internals/Shaders/IntermediateShader.cpp b/Outputs/CRT/Internals/Shaders/IntermediateShader.cpp index 670effaeb..4103230a5 100644 --- a/Outputs/CRT/Internals/Shaders/IntermediateShader.cpp +++ b/Outputs/CRT/Internals/Shaders/IntermediateShader.cpp @@ -47,7 +47,7 @@ std::unique_ptr IntermediateShader::make_shader(const std::s "uniform float outputVerticalOffset;" "uniform float textureHeightDivisor;" - "out vec2 phaseAndAmplitudeVarying;" + "out vec3 phaseAndAmplitudeVarying;" "out vec2 inputPositionsVarying[11];" "out vec2 iInputPositionVarying;" "out vec2 delayLinePositionVarying;" @@ -94,9 +94,11 @@ std::unique_ptr IntermediateShader::make_shader(const std::s "delayLinePositionVarying = mappedInputPosition - vec2(0.0, 1.0);" // setup phaseAndAmplitudeVarying.x as colour burst subcarrier phase, in radians; - // setup phaseAndAmplitudeVarying.x as colour burst amplitude + // setup phaseAndAmplitudeVarying.y as colour burst amplitude; + // setup phaseAndAmplitudeVarying.z as 1 / (colour burst amplitude), or 0.0 if amplitude is 0.0; "phaseAndAmplitudeVarying.x = (extendedOutputPosition.x + (phaseTimeAndAmplitude.x / 64.0)) * 0.5 * 3.141592654;" - "phaseAndAmplitudeVarying.y = 0.33;" // TODO: reinstate connection with (phaseTimeAndAmplitude.y/256.0) + "phaseAndAmplitudeVarying.y = phaseTimeAndAmplitude.y / 255.0;" + "phaseAndAmplitudeVarying.z = (phaseAndAmplitudeVarying.y > 0.0) ? 1.0 / phaseAndAmplitudeVarying.y : 0.0;" // determine output position by scaling the output position according to the texture size "vec2 eyePosition = 2.0*(extendedOutputPosition / outputTextureSize) - vec2(1.0);" @@ -133,7 +135,7 @@ std::unique_ptr IntermediateShader::make_source_conversion_s "in vec2 inputPositionsVarying[11];" "in vec2 iInputPositionVarying;" - "in vec2 phaseAndAmplitudeVarying;" + "in vec3 phaseAndAmplitudeVarying;" "out vec4 fragColour;" @@ -161,7 +163,7 @@ std::unique_ptr IntermediateShader::make_rgb_source_shader(c "in vec2 inputPositionsVarying[11];" "in vec2 iInputPositionVarying;" - "in vec2 phaseAndAmplitudeVarying;" + "in vec3 phaseAndAmplitudeVarying;" "out vec3 fragColour;" @@ -185,7 +187,7 @@ std::unique_ptr IntermediateShader::make_chroma_luma_separat return make_shader( "#version 150\n" - "in vec2 phaseAndAmplitudeVarying;" + "in vec3 phaseAndAmplitudeVarying;" "in vec2 inputPositionsVarying[11];" "out vec3 fragColour;" @@ -200,10 +202,10 @@ std::unique_ptr IntermediateShader::make_chroma_luma_separat "texture(texID, inputPositionsVarying[5]).r," "texture(texID, inputPositionsVarying[6]).r" ");" - "float luminance = dot(samples, vec4(0.25));" + "float luminance = mix(dot(samples, vec4(0.25)), dot(samples, vec4(0.0, 0.16, 0.66, 0.16)), step(phaseAndAmplitudeVarying.z, 0.0));" // define chroma to be whatever was here, minus luma - "float chrominance = 0.5 * (samples.z - luminance) / phaseAndAmplitudeVarying.y;" + "float chrominance = 0.5 * (samples.z - luminance) * phaseAndAmplitudeVarying.z;" "luminance /= (1.0 - phaseAndAmplitudeVarying.y);" // split choma colours here, as the most direct place, writing out