This is EyeView.m in view mode; [Download] [Up]
/* Generated by Interface Builder */
#import "EyeView.h"
#import "eye.h"
#import <stdlib.h>
#import <math.h>
#import <dpsclient/dpsclient.h>
#import <dpsclient/psops.h>
#import <appkit/Application.h>
#import <appkit/Window.h>
#import <appkit/defaults.h>
#define MAX_BALL_RAD 9.0
#define PUPIL_RAD 2.0
#define GAP 4.0
#define SQR(x) ((x)*(x))
static void notifyTimer(DPSTimedEntry teNumber, double now, id self)
{
[self drawBalls];
}
@implementation EyeView
- initFrame:(const NXRect *) frm;
{
self = [super initFrame:frm];
[self allocateGState];
updateTime = atof(NXGetDefaultValue([NXApp appName],"EyeUpdateTime"));
leftCenter.x = bounds.size.width / 4;
rightCenter.x = bounds.size.width * 3 / 4;
leftCenter.y = rightCenter.y = bounds.size.height / 2;
eyeball_init(PUPIL_RAD,MAX_BALL_RAD + GAP +1 ,leftCenter.x, leftCenter.y, rightCenter.x, rightCenter.y);
return self;
}
- initializeEyes
{
// draw the eye background
[self lockFocus];
eyebackground(bounds.size.width, bounds.size.height,leftCenter.x, leftCenter.y,
rightCenter.x, rightCenter.y, MAX_BALL_RAD + PUPIL_RAD + GAP);
[self unlockFocus];
[window flushWindow];
NXPing();
timedEntry = DPSAddTimedEntry(updateTime, (DPSTimedEntryProc) ¬ifyTimer, self, NX_BASETHRESHOLD);
return self;
}
- free
{
DPSRemoveTimedEntry(timedEntry);
return [super free];
}
- setUpdateTime:(double)value
{
updateTime = value;
DPSRemoveTimedEntry(timedEntry);
timedEntry = DPSAddTimedEntry(updateTime, (DPSTimedEntryProc) ¬ifyTimer, self, NX_BASETHRESHOLD);
return self;
}
- (double)updateTime
{
return updateTime;
}
- stopTimer
{
DPSRemoveTimedEntry(timedEntry);
return self;
}
- startTimer
{
timedEntry = DPSAddTimedEntry(updateTime, (DPSTimedEntryProc) ¬ifyTimer, self, NX_BASETHRESHOLD);
return self;
}
- drawBalls
{
mouseTemp = mouseLoc;
[window getMouseLocation: &mouseLoc];
[self convertPoint: &mouseLoc fromView: nil];
if (mouseLoc.x == mouseTemp.x && mouseLoc.y == mouseTemp.y)
return self;
mag = sqrt(SQR(mouseLoc.x - leftCenter.x) + SQR(mouseLoc.y - leftCenter.y));
if (mag < MAX_BALL_RAD) {
leftBall.x = mouseLoc.x;
leftBall.y = mouseLoc.y;
} else {
leftBall.x = MAX_BALL_RAD * (mouseLoc.x - leftCenter.x) / mag + leftCenter.x ;
leftBall.y = MAX_BALL_RAD * (mouseLoc.y - leftCenter.y) / mag + leftCenter.y ;
}
mag = sqrt(SQR(mouseLoc.x - rightCenter.x) + SQR(mouseLoc.y - rightCenter.y));
if (mag < MAX_BALL_RAD) {
rightBall.x = mouseLoc.x;
rightBall.y = mouseLoc.y;
} else {
rightBall.x = MAX_BALL_RAD * (mouseLoc.x - rightCenter.x) / mag + rightCenter.x;
rightBall.y = MAX_BALL_RAD * (mouseLoc.y - rightCenter.y) / mag + rightCenter.y;
}
[self lockFocus];
eyeball(leftBall.x, leftBall.y, rightBall.x, rightBall.y);
[window flushWindow];
[self unlockFocus];
NXPing();
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.