This is ssClassBlob.m in view mode; [Download] [Up]
/*
ssClassBlob.m - This is a sample NiteLite module which illustrates how a
NiteLite module is written. See the shell file 'ssClassModule.m' and the
document 'ToolsAPI.wn' for more information. You are welcome to use any
code in this file in your development of a MetroTools' NiteLite module.
Author: Ron Miller
Date: 6/17/92
Version: 1.0
Copyright: 1992 Metrosoft, All Rights Reserved.
*/
#import <libc.h>
#import <dpsclient/wraps.h>
#import <dpsclient/event.h>
#import <appkit/Application.h>
#import <appkit/Control.h>
#import <appkit/Button.h>
#import <appkit/Slider.h>
#import "ssClassBlob.h"
/* saved settings structure */
typedef struct
{
int delayTime;
int nSegs;
} blobSetRec, *blobSetPtr;
static void GetCurvePoints(curveRec *curves, int index, int nCurves, NXPoint *pts);
@implementation ssClassBlob
/* IB methods */
- NSegTextControl:sender
{
nSegs = [sender intValue];
if( nSegs < [nSegSlider minValue] )
nSegs = [nSegSlider minValue];
if( nSegs > [nSegSlider maxValue] )
nSegs = [nSegSlider maxValue];
[nSegSlider setIntValue:nSegs];
[nSegText setIntValue:nSegs];
[screenSaver ssModChanged];
return self;
}
- DelayControl:sender
{
delayTime = [(Control*)sender intValue];
[(mtClassNiteLite*)screenSaver ssModChanged];
return self;
}
- NSegSlideControl:sender
{
NXEvent *evt;
int n;
n = [(Control*)sender intValue];
[(Control*)nSegText setIntValue:n];
evt = [NXApp currentEvent];
if( evt->type == NX_MOUSEUP )
{
nSegs = n;
[(mtClassNiteLite*)screenSaver ssModChanged];
}
return self;
}
/* NiteLite module methods */
- initSelf:(BOOL)ifOnly
{
return( self );
}
- doActivate:(mtClassNiteLite*)ssTool
{
screenSaver = ssTool;
return( self );
}
- doDeactivate
{
return( self );
}
- unload
{
return( self );
}
- getSettings: (void**)data: (int*)size
{
blobSetPtr settings;
settings = (blobSetPtr)malloc( sizeof(blobSetRec) );
settings->delayTime = delayTime;
settings->nSegs = nSegs;
*data = (void*)settings;
*size = sizeof(blobSetRec);
return( self );
}
- setSettings: (void*)data: (int)size
{
if( data == NULL || size != sizeof(blobSetRec) )
{
delayTime = 0;
nSegs = 3;
}
else
{
delayTime = ((blobSetPtr)data)->delayTime;
nSegs = ((blobSetPtr)data)->nSegs;
if( nSegs > MAXSEGS )
nSegs = MAXSEGS;
}
[(Control*)delaySlider setIntValue:delayTime];
[(Control*)nSegSlider setIntValue:nSegs];
[(Control*)nSegText setIntValue:nSegs];
return( self );
}
- getControlsWindow:(Window**)theWind
{
*theWind = toolWind;
return( self );
}
- prepDraw:(BOOL)inFore
{
dispTime = 0;
blob.isNew = YES;
return( self );
}
- drawFrame:(View*)theView:(NXRect*)obsList:(int)nRects:(BOOL*)didDraw:
(NXColor)backColor
{
unsigned curTime;
NXRect bounds;
*didDraw = NO;
curTime = currentTimeInMs();
if( dispTime > curTime )
dispTime = curTime;
if( curTime < (dispTime+delayTime) )
return( self );
*didDraw = YES;
dispTime = curTime;
[theView getBounds:&bounds];
if( blob.isNew )
[self initBlob:&bounds];
[self drawBlob];
[self incBlob:&bounds];
return( self );
}
- endDraw
{
return( self );
}
/* support methods and routines */
- initBlob:(NXRect*)frame
{
int i, j;
blob.isNew = NO;
for( i=0; i<MAXSEGS; i++ )
{
for( j=0; j<2; j++ )
{
blob.segs[i].ctlPts[j].x =
(float)(random() % (int)(frame->size.width/4)) +
((frame->size.width*3)/8);
blob.segs[i].ctlPts[j].y =
(float)(random() % (int)(frame->size.height/4)) +
((frame->size.height*3)/8);
blob.segs[i].ctlIncs[j].x = (float)((random() % 40) - 20);
if(blob.segs[i].ctlIncs[j].x<2 && blob.segs[i].ctlIncs[j].x>-2)
blob.segs[i].ctlIncs[j].x = 2;
blob.segs[i].ctlIncs[j].y = (float)((random() % 40) - 20);
if(blob.segs[i].ctlIncs[j].y<2 && blob.segs[i].ctlIncs[j].y>-2)
blob.segs[i].ctlIncs[j].y = 2;
}
}
blob.hVal = ((float)(random() % 257)) / 256;
blob.sVal = ((float)(random() % 129)) / 256 + .5;
blob.bVal = .5;
blob.hInc = .0031;
blob.sInc = .0023;
blob.bInc = .0011;
return( self );
}
- drawBlob
{
int i;
NXPoint pts[4];
PSnewpath();
PSsethsbcolor( blob.hVal, blob.sVal, blob.bVal );
for( i=0; i<nSegs; i++ )
{
GetCurvePoints( blob.segs, i, nSegs, pts );
if( i==0 )
PSmoveto( pts[0].x, pts[0].y );
PScurveto(pts[1].x, pts[1].y, pts[2].x, pts[2].y, pts[3].x, pts[3].y);
}
PSclosepath();
PSfill();
return( self );
}
- incBlob:(NXRect*)frame
{
int i, j;
for( i=0; i<MAXSEGS; i++ )
{
for( j=0; j<2; j++ )
{
blob.segs[i].ctlPts[j].x += blob.segs[i].ctlIncs[j].x;
if( blob.segs[i].ctlPts[j].x < 0.0 )
{
blob.segs[i].ctlPts[j].x = -blob.segs[i].ctlPts[j].x;
blob.segs[i].ctlIncs[j].x = -blob.segs[i].ctlIncs[j].x;
}
else if( blob.segs[i].ctlPts[j].x > frame->size.width )
{
blob.segs[i].ctlPts[j].x =
(2*frame->size.width) - blob.segs[i].ctlPts[j].x;
blob.segs[i].ctlIncs[j].x = -blob.segs[i].ctlIncs[j].x;
}
blob.segs[i].ctlPts[j].y += blob.segs[i].ctlIncs[j].y;
if( blob.segs[i].ctlPts[j].y < 0.0 )
{
blob.segs[i].ctlPts[j].y = -blob.segs[i].ctlPts[j].y;
blob.segs[i].ctlIncs[j].y = -blob.segs[i].ctlIncs[j].y;
}
else if( blob.segs[i].ctlPts[j].y > frame->size.height )
{
blob.segs[i].ctlPts[j].y =
(2*frame->size.height) - blob.segs[i].ctlPts[j].y;
blob.segs[i].ctlIncs[j].y = -blob.segs[i].ctlIncs[j].y;
}
}
}
blob.hVal += blob.hInc;
if( blob.hVal > 1.0 )
blob.hVal = blob.hVal - 1.0;
blob.sVal += blob.sInc;
if( blob.sVal > 1.0 )
{
blob.sVal = 2.0 - blob.sVal;
blob.sInc = -blob.sInc;
}
else if( blob.sVal < .5 )
{
blob.sVal = 1.0 - blob.sVal;
blob.sInc = -blob.sInc;
}
blob.bVal += blob.bInc;
if( blob.bVal > 1.0 )
{
blob.bVal = 2.0 - blob.bVal;
blob.bInc = -blob.bInc;
}
else if( blob.bVal < 0.0 )
{
blob.bVal = -blob.bVal;
blob.bInc = -blob.bInc;
}
return( self );
}
static void GetCurvePoints( curveRec *curves, int index, int nCurves, NXPoint *pts )
{
NXPoint ancPt1, ancPt2;
NXPoint ctlPt1, ctlPt2;
if( index==0 )
ctlPt1 = curves[nCurves-1].ctlPts[1];
else
ctlPt1 = curves[index-1].ctlPts[1];
ctlPt2 = curves[index].ctlPts[0];
ancPt1.x = (ctlPt1.x + ctlPt2.x) / 2;
ancPt1.y = (ctlPt1.y + ctlPt2.y) / 2;
ctlPt1 = curves[index].ctlPts[1];
if( index >= (nCurves-1) )
ctlPt2 = curves[0].ctlPts[0];
else
ctlPt2 = curves[index+1].ctlPts[0];
ancPt2.x = (ctlPt1.x + ctlPt2.x) / 2;
ancPt2.y = (ctlPt1.y + ctlPt2.y) / 2;
pts[0] = ancPt1;
pts[1] = curves[index].ctlPts[0];
pts[2] = curves[index].ctlPts[1];
pts[3] = ancPt2;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.