This is CharenderView.m in view mode; [Download] [Up]
/*************************************************** ** ** CharenderView.m ** ** By Brian Hobbs (brian@ny.shl.com) ** ** This is the main class of the bundle, sets ** up the defaults, environment, text string, and ** stuff. Everything but the code in the initFrame: ** method should be quite unsurprising. ** ** This code is public domain. Feel free to use ** it in any way you wish. I'd like to see any ** changes you make, tho. ** ** Kudos to Sam Streeper for the Teapot code, from ** which most of the BackSpace 3-D setup was "acquired". ** ****************************************************/ #import "CharenderView.h" #define CHARENDERTEXTDEFAULT "CharenderText" #define CHARENDERFONTDEFAULT "CharenderFont" #define CHARENDERCOLORDEFAULT "CharenderColor" #define CHARENDERSURFDEFAULT "CharenderSurf" #define CHARENDERRESDEFAULT "CharenderRes" @implementation CharenderView + initialize { static NXDefaultsVector CharenderDefaults={ {CHARENDERTEXTDEFAULT,"Darkninja"}, {CHARENDERFONTDEFAULT,"Helvetica"}, {CHARENDERCOLORDEFAULT,"1.0 1.0 1.0"}, {CHARENDERSURFDEFAULT,"2"}, {CHARENDERRESDEFAULT,"30"}, {NULL}}; NXRegisterDefaults([NXApp appName], CharenderDefaults); return [super initialize]; } - initFrame:(const NXRect *) theRect { // camera position points RtPoint fromP = {0,0,-5.0}, toP = {0,0,0}; // light position points RtPoint lFromP = {30,20,-20}; RtPoint lFromP2 = {-10,10,-10}; RtPoint lFromP3 = {0,-10,-10}; // the various 3Dkit object id''s that we will initialize here id ambientLight; id aLight; [super initFrame:theRect]; // retrieve defaults [self getDefaults]; [self inspector:(BSThinker())]; [self setEyeAt:fromP toward:toP roll:0.0]; theShader=[[N3DShader alloc] init]; [theShader setUseColor:YES]; [theShader setColor:colorDefault]; [(N3DShader *)theShader setShader:"plastic"]; textShape= (DN3DString *)[[DN3DString alloc] init]; [textShape setTextFont:fontDefault]; [textShape setTextString:textDefault]; textBox = [[N3DShape alloc] init]; [textShape setShader:theShader]; // [[self setWorldShape:textShape] free]; [[self worldShape] linkDescendant:textBox]; [textBox linkDescendant:textShape]; ambientLight=[[N3DLight alloc] init]; [ambientLight makeAmbientWithIntensity:0.1]; [self addLight:ambientLight]; aLight=[[N3DLight alloc] init]; [aLight makeDistantFrom:lFromP to:toP intensity:0.2]; [self addLight:aLight]; aLight=[[N3DLight alloc] init]; [aLight makeDistantFrom:lFromP2 to:toP intensity:0.9]; [self addLight:aLight]; aLight=[[N3DLight alloc] init]; [aLight makeDistantFrom:lFromP3 to:toP intensity:0.3]; [self addLight:aLight]; [self setSurfaceTypeForAll:surfaceTypeDefault chooseHider:YES]; dx = randBetween(.05, .2); dy = randBetween(.05, .2); dz = randBetween(.05, .2); rotationAxis[0] = 0; theta = 0; return self; } #define PI 3.14159 - oneStep { RtMatrix m; rotationAxis[1] = sin(theta); rotationAxis[2] = cos(theta); theta += (2.0 * PI / 180.0); [textShape rotateAngle:5 axis:rotationAxis]; [textBox translate:dx :dy :dz]; [textBox getTransformMatrix:m]; // I can use these values directly only because string's box isn't rotated if (m[3][0] < -1.5) dx = randBetween(.02, .1); else if (m[3][0] > 1.5) dx = randBetween(-.02, -.1); if (m[3][1] < -1.0) dy = randBetween(.02, .1); else if (m[3][1] > 1.5) dy = randBetween(-.02, -.1); if (m[3][2] < -2.25) dz = randBetween(.02, .1); else if (m[3][2] > 4) dz = randBetween(-.02, -.1); [self display]; return self; } - (BOOL) useBufferedWindow { return YES; } - (const char *)windowTitle { return "Charender"; } - inspector:sender { char buf[MAXPATHLEN]; if (!inspectorPanel) { sprintf(buf,"%s/Charender.nib",[sender moduleDirectory:"Charender"]); [NXApp loadNibFile:buf owner:self withNames:NO]; [stringField setStringValue:textDefault]; [stringField setFont:[Font newFont:fontDefault size:12.0]]; [colorWell setColor:colorDefault]; [surfaceMatrix selectCellAt:surfaceTypeDefault :0]; [resolutionTextField setIntValue:resolutionDefault]; [resolutionSlider setIntValue:resolutionDefault]; [inspectorPanel display]; NXPing(); } return inspectorPanel; } - setStringAndFontFrom:sender { strcpy(textDefault, [sender stringValue]); strcpy(fontDefault, [[sender font] name]); [textShape setTextString:textDefault andFont:fontDefault]; NXWriteDefault([NXApp appName], CHARENDERTEXTDEFAULT, textDefault); NXWriteDefault([NXApp appName], CHARENDERFONTDEFAULT, fontDefault); [self display]; return self; } - setColorFrom:sender { float r,g,b; char str[100]; colorDefault = [sender color]; [theShader setColor:colorDefault]; NXConvertColorToRGB(colorDefault, &r, &g, &b); sprintf(str, "%5.3f %5.3f %5.3f", r, g, b ); NXWriteDefault([NXApp appName], CHARENDERCOLORDEFAULT, str); [self display]; return self; } - setSurfaceTypeFrom:sender { char str[100]; surfaceTypeDefault = [sender selectedRow]; sprintf(str,"%d", surfaceTypeDefault); NXWriteDefault([NXApp appName], CHARENDERSURFDEFAULT, str); [self setSurfaceTypeForAll:surfaceTypeDefault chooseHider:YES]; [self display]; return self; } - setResolutionFrom:sender { char str[100]; resolutionDefault = [sender intValue]; sprintf(str,"%d", resolutionDefault); NXWriteDefault([NXApp appName], CHARENDERRESDEFAULT, str); [textShape setResolution:(float)resolutionDefault]; [resolutionTextField setIntValue:resolutionDefault]; [self display]; return self; } - getDefaults { const char *ptr; float r, g, b; textDefault = (char *)NXZoneMalloc([self zone], sizeof(char) * 80); fontDefault = (char *)NXZoneMalloc([self zone], sizeof(char) * 80); ptr = NXGetDefaultValue([NXApp appName], CHARENDERTEXTDEFAULT); strcpy(textDefault, (char *)ptr); ptr = NXGetDefaultValue([NXApp appName], CHARENDERFONTDEFAULT); strcpy(fontDefault, (char *)ptr); ptr = NXGetDefaultValue([NXApp appName], CHARENDERCOLORDEFAULT); sscanf (ptr, "%f %f %f", &r, &g, &b ); colorDefault = NXConvertRGBToColor(r,g,b); surfaceTypeDefault = atoi(NXGetDefaultValue([NXApp appName], CHARENDERSURFDEFAULT)); resolutionDefault = atoi(NXGetDefaultValue([NXApp appName], CHARENDERRESDEFAULT)); return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.