ここ数年、私は Chris によって Mac OS X に移植された Noof スクリーンセーバーを使用しています。
私はそれを10.8で正常に実行しており、高解像度のアートワークでプロジェクトを更新し、設定パネルにその他の調整を加えて動作させていますが、ピクセルの代わりに高解像度のレンダリングを使用できるようにする方法がわかりません-Retina ディスプレイで倍増したもの。以下のコードは 2880x1800 でウィンドウを描画しているように見えますが、それでもピクセルが 2 倍になっています。
コードの関連部分と思われるものを貼り付けました。
コード
static void
reshape_noof(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h) {
wd = 1.0;
ht = (GLfloat) h / (GLfloat) w;
glOrtho(0.0, 1.0,
0.0, 1.0 * (GLfloat) h / (GLfloat) w,
-16.0, 4.0);
} else {
wd = (GLfloat) w / (GLfloat) h;
ht = 1.0;
glOrtho(0.0, 1.0 * (GLfloat) w / (GLfloat) h,
0.0, 1.0,
-16.0, 4.0);
}
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClearColor( 0.0, 0.0, 0.0, 1.0 );
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
をちょきちょきと切る
// ScreenSaverView methods
- (id)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview
{
self = [super initWithFrame:frame isPreview:isPreview];
if (self) {
[self loadSettings];
[self setAnimationTimeInterval:1.0/delay];
NSRect newFrame = frame;
newFrame.origin.x = 0.0;
newFrame.origin.y = 0.0;
glView = [[NSOpenGLView alloc] initWithFrame:newFrame pixelFormat:[NSOpenGLView defaultPixelFormat]];
if( glView ) {
[self setAutoresizesSubviews:YES];
[self addSubview:glView];
}
}
return self;
}
- (void)startAnimation
{
[super startAnimation];
// Load our settings
[self loadSettings];
// Turn off the cursor; this doesn't always seem to happen on Tiger. :-(
if( ![self isPreview] ) [NSCursor hide];
firstRun = YES;
// Prepare OpenGL.
[[glView openGLContext] makeCurrentContext];
[self setWantsBestResolutionOpenGLSurface:YES];
[self convertRectToBacking:[self bounds]];
// Get view dimensions in pixels
NSRect backingBounds = [self convertRectToBacking:[self bounds]];
GLsizei backingPixelWidth = (GLsizei)(backingBounds.size.width),
backingPixelHeight = (GLsizei)(backingBounds.size.height);
float w = backingPixelWidth;
float h = backingPixelHeight;
reshape_noof( w, h );
// from init_noof
glEnable(GL_LINE_SMOOTH);
glShadeModel(GL_FLAT);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
int i;
for (i = 0; i < N_SHAPES; i++)
initshapes(i);
//[self animateOneFrame];
glClearColor( 0.0, 0.0, 0.0, 0.0 );
glClear( GL_COLOR_BUFFER_BIT );
glFlush();
}
- (void)stopAnimation
{
// Turn on the cursor.
if( ![self isPreview] ) [NSCursor unhide];
[super stopAnimation];
}
- (void)animateOneFrame
{
int i;
if( firstRun ) {
// Make **** sure our view port is correct.
[self setWantsBestResolutionOpenGLSurface:YES];
[self convertRectToBacking:[self bounds]];
// Get view dimensions in pixels
NSRect backingBounds = [self convertRectToBacking:[self bounds]];
GLsizei backingPixelWidth = (GLsizei)(backingBounds.size.width),
backingPixelHeight = (GLsizei)(backingBounds.size.height);
// Set viewport
reshape_noof( backingPixelWidth, backingPixelHeight );
firstRun = NO;
}
gravity( -2.0 );
for( i = 0; i < N_SHAPES; i++ ) {
motionUpdate( i );
colorUpdate( i );
drawleaf( i );
}
glFinish();
}