This is SpheresView.m in view mode; [Download] [Up]
//
// SpheresView.m
//
// Matt Pharr- pharr@cs.yale.edu
//
#import "SpheresView.h"
#import "SpheresWrap.c"
#import <appkit/graphics.h>
#import <dpsclient/wraps.h>
#import <libc.h>
#import <stdlib.h>
#define MAXSIZE 125
@implementation SpheresView
- oneStep
{
float red= 0.0, green= 0.0, blue= 0.0;
float color= 0.0;
NXPoint position;
NXPoint hilight;
int radius= 100;
float dx= 0.0, dy= 0.0;
float dcolor= 0.0;
float dred= 0.0, dgreen= 0.0, dblue= 0.0;
if (++nDrawn >= 75) {
usleep(1000000);
nDrawn= 0;
PSsetgray(0.0);
NXRectFill(&bounds);
}
// decide where to put the sphere after we draw it..
position.x= (int)randBetween(bounds.origin.x - MAXSIZE / 2,
bounds.origin.x + bounds.size.width - MAXSIZE/2);
position.y= (int)randBetween(bounds.origin.y - MAXSIZE / 2,
bounds.origin.y + bounds.size.height - MAXSIZE/2);
radius= (int)randBetween(30, MAXSIZE);
// where to put the hilight on the sphere- always in the same relative
// place
hilight.x= .4 * radius;
hilight.y= .6 * radius;
// distance by which we need to move each time when drawing the big highlight.
// basically what we do is start at the position of the hilight and draw a little
// circle that is all white there. Then we move out away from there and draw
// bigger and bigger circles that become darker and darker, until they hit the
// color we pick for the sphere below. This gives us the 3-d shading effect.
// Actually, though, we do the above in reverse, so as not to draw over the
// circles- we're actually drawing smaller and smaller concentric, filled circles.
// N.B. there's probably a more efficient way to do this...
dx= hilight.x / radius;
dy= hilight.y / radius;
if ([Window defaultDepthLimit] == NX_TwoBitGrayDepth) {
// Black And White Machines
color= randBetween(0.0, .4);
dcolor= (1 - color) / radius;
}
else {
red= randBetween(0.0, .4);
dred= (1 - red) / radius;
green= randBetween(0.0, .4);
dgreen= (1 - green) / radius;
blue= randBetween(0.0, .4);
dblue= (1 - blue) / radius;
}
NXRectClip(&bounds); // need to do this for when it's done in a window...
PStranslate(position.x, position.y);
if ([Window defaultDepthLimit] == NX_TwoBitGrayDepth) {
// draw a sphere in black and white...
drawSphereBW(color, radius, dcolor, dx, dy, MAXSIZE);
}
else {
// or in color...
drawSphereCL(red, green, blue, radius, dred, dgreen, dblue, dx, dy, MAXSIZE);
}
PStranslate(-position.x, -position.y);
return self;
}
- initFrame:(const NXRect *)frameRect
{
[super initFrame:frameRect];
nDrawn= 0;
return self;
}
- drawSelf:(const NXRect *)rects :(int)rectCount
{
if (!rects || !rectCount) {
return self;
}
PSsetgray(0.0);
NXRectFill(rects);
return self;
}
- (const char *)windowTitle
{
return "Spheres";
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.