mirror of
https://github.com/TomHarte/CLK.git
synced 2024-11-26 08:49:37 +00:00
Reinstated clipped CRT output, with more appropriate ownership of the decision.
This commit is contained in:
parent
3a689d14cc
commit
b5bcadb8d3
@ -35,6 +35,7 @@ Machine::Machine() :
|
||||
"float texValue = texture(texID, coordinate).r;"
|
||||
"return vec3(step(4.0/256.0, mod(texValue, 8.0/256.0)), step(2.0/256.0, mod(texValue, 4.0/256.0)), step(1.0/256.0, mod(texValue, 2.0/256.0)));"
|
||||
"}");
|
||||
_crt.set_visible_area(Outputs::Rect(0.2f, 0.0625f, 0.75f, 0.75f));
|
||||
|
||||
memset(_keyStates, 0, sizeof(_keyStates));
|
||||
memset(_palette, 0xf, sizeof(_palette));
|
||||
|
@ -28,7 +28,6 @@ class ElectronDocument: MachineDocument {
|
||||
super.windowControllerDidLoadNib(aController)
|
||||
electron.view = openGLView
|
||||
electron.audioQueue = self.audioQueue
|
||||
// openGLView.frameBounds = CGRectMake(0.0225, 0.0625, 0.75, 0.75)
|
||||
}
|
||||
|
||||
override var windowNibName: String? {
|
||||
|
@ -110,6 +110,7 @@ CRT::CRT() :
|
||||
_is_in_hsync(false),
|
||||
_is_in_vsync(false),
|
||||
_current_frame_mutex(new std::mutex),
|
||||
_visible_area(Rect(0, 0, 1, 1)),
|
||||
_rasterPosition({.x = 0, .y = 0})
|
||||
{
|
||||
construct_openGL();
|
||||
|
@ -19,6 +19,20 @@
|
||||
|
||||
namespace Outputs {
|
||||
|
||||
struct Rect {
|
||||
struct {
|
||||
float x, y;
|
||||
} origin;
|
||||
|
||||
struct {
|
||||
float width, height;
|
||||
} size;
|
||||
|
||||
Rect() {}
|
||||
Rect(float x, float y, float width, float height) :
|
||||
origin({.x = x, .y = y}), size({.width = width, .height =height}) {}
|
||||
};
|
||||
|
||||
class CRT {
|
||||
public:
|
||||
~CRT();
|
||||
@ -195,6 +209,10 @@ class CRT {
|
||||
// void set_phase_function(const char *shader);
|
||||
|
||||
void set_output_device(OutputDevice output_device);
|
||||
void set_visible_area(Rect visible_area)
|
||||
{
|
||||
_visible_area = visible_area;
|
||||
}
|
||||
|
||||
private:
|
||||
CRT();
|
||||
@ -303,6 +321,7 @@ class CRT {
|
||||
CRTFrame *_current_frame, *_last_drawn_frame;
|
||||
std::shared_ptr<std::mutex> _current_frame_mutex;
|
||||
int _frame_read_pointer;
|
||||
Rect _visible_area;
|
||||
|
||||
struct OpenGLState;
|
||||
OpenGLState *_openGL_state;
|
||||
|
@ -137,19 +137,19 @@ void CRT::push_size_uniforms(unsigned int output_width, unsigned int output_heig
|
||||
glUniform2f(_openGL_state->windowSizeUniform, output_width, output_height);
|
||||
}
|
||||
|
||||
// GLfloat outputAspectRatioMultiplier = 1.0;//(viewSize.x / viewSize.y) / (4.0 / 3.0);
|
||||
GLfloat outputAspectRatioMultiplier = ((float)output_width / (float)output_height) / (4.0f / 3.0f);
|
||||
|
||||
// _aspectRatioCorrectedBounds = _frameBounds;
|
||||
Rect _aspect_ratio_corrected_bounds = _visible_area;
|
||||
|
||||
// CGFloat bonusWidth = (outputAspectRatioMultiplier - 1.0f) * _frameBounds.size.width;
|
||||
// _aspectRatioCorrectedBounds.origin.x -= bonusWidth * 0.5f * _aspectRatioCorrectedBounds.size.width;
|
||||
// _aspectRatioCorrectedBounds.size.width *= outputAspectRatioMultiplier;
|
||||
GLfloat bonusWidth = (outputAspectRatioMultiplier - 1.0f) * _visible_area.size.width;
|
||||
_aspect_ratio_corrected_bounds.origin.x -= bonusWidth * 0.5f * _aspect_ratio_corrected_bounds.size.width;
|
||||
_aspect_ratio_corrected_bounds.size.width *= outputAspectRatioMultiplier;
|
||||
|
||||
if(_openGL_state->boundsOriginUniform >= 0)
|
||||
glUniform2f(_openGL_state->boundsOriginUniform, 0.0, 0.0); //(GLfloat)_aspectRatioCorrectedBounds.origin.x, (GLfloat)_aspectRatioCorrectedBounds.origin.y);
|
||||
glUniform2f(_openGL_state->boundsOriginUniform, (GLfloat)_aspect_ratio_corrected_bounds.origin.x, (GLfloat)_aspect_ratio_corrected_bounds.origin.y);
|
||||
|
||||
if(_openGL_state->boundsSizeUniform >= 0)
|
||||
glUniform2f(_openGL_state->boundsSizeUniform, 1.0, 1.0);//(GLfloat)_aspectRatioCorrectedBounds.size.width, (GLfloat)_aspectRatioCorrectedBounds.size.height);
|
||||
glUniform2f(_openGL_state->boundsSizeUniform, (GLfloat)_aspect_ratio_corrected_bounds.size.width, (GLfloat)_aspect_ratio_corrected_bounds.size.height);
|
||||
}
|
||||
|
||||
void CRT::set_composite_sampling_function(const char *shader)
|
||||
|
@ -51,7 +51,8 @@ Shader::Shader(const char *vertex_shader, const char *fragment_shader)
|
||||
|
||||
Shader::~Shader()
|
||||
{
|
||||
glDeleteProgram(_shader_program);
|
||||
// TODO: ensure this is destructed within the correct context.
|
||||
// glDeleteProgram(_shader_program);
|
||||
}
|
||||
|
||||
void Shader::bind()
|
||||
|
Loading…
Reference in New Issue
Block a user