|
|
1.1 root 1: #import <appkit/appkit.h>
2: #import "TeapotView.h"
3: #import "Teapot.h"
4:
5: // TeapotView -- by sam streeper 920704
6: // borrowing heavily from sources by Bill Bumgarner and Dave Springer.
7:
8: @implementation TeapotView
9:
10: - initFrame:(const NXRect *) theRect
11: {
12: // camera position points
13: RtPoint fromP = {0,0,-5.0}, toP = {0,0,0};
14:
15: // light position points
16: RtPoint lFromP = {30,20,-20};
17: RtPoint lFromP2 = {-10,10,-10};
18: RtPoint lFromP3 = {0,-10,-10};
19:
20: // the various 3Dkit object id''s that we will initialize here
21: id ambientLight;
22: id aLight;
23:
24: [super initFrame:theRect];
25: [self setEyeAt:fromP toward:toP roll:0.0];
26:
27: theShader=[[N3DShader alloc] init];
28: [theShader setUseColor:YES];
29: [self getTeapotColor];
30: [(N3DShader *)theShader setShader:"plastic"];
31:
32: teapot=[[Teapot alloc] init];
33: teapotsBox=[[N3DShape alloc] init];
34: [(N3DShape *) teapot setShader:theShader];
35:
36: [[self worldShape] linkDescendant:teapotsBox];
37: [teapotsBox linkDescendant:teapot];
38:
39: ambientLight=[[N3DLight alloc] init];
40: [ambientLight makeAmbientWithIntensity:0.1];
41: [self addLight:ambientLight];
42:
43: aLight=[[N3DLight alloc] init];
44: [aLight makeDistantFrom:lFromP to:toP intensity:0.2];
45: [self addLight:aLight];
46:
47: aLight=[[N3DLight alloc] init];
48: [aLight makeDistantFrom:lFromP2 to:toP intensity:0.9];
49: [self addLight:aLight];
50:
51: aLight=[[N3DLight alloc] init];
52: [aLight makeDistantFrom:lFromP3 to:toP intensity:0.3];
53: [self addLight:aLight];
54:
55: [self getSurfaceType];
56:
57: dx = randBetween(.05, .2);
58: dy = randBetween(.05, .2);
59: dz = randBetween(.05, .2);
60: rotationAxis[0] = 0;
61: theta = 0;
62:
63: return self;
64: }
65:
66: #define PI 3.14159
67:
68: - oneStep
69: {
70: RtMatrix m;
71:
72: rotationAxis[1] = sin(theta);
73: rotationAxis[2] = cos(theta);
74: theta += (2.0 * PI / 180.0);
75:
76: [teapot rotateAngle:5 axis:rotationAxis];
77: [teapotsBox translate:dx :dy :dz];
78:
79: [teapotsBox getTransformMatrix:m];
80:
81: // I can use these values directly only because teapot's box isn't rotated
82: if (m[3][0] < -1.5) dx = randBetween(.02, .1);
83: else if (m[3][0] > 1.5) dx = randBetween(-.02, -.1);
84: if (m[3][1] < -1.5) dy = randBetween(.02, .1);
85: else if (m[3][1] > 1.5) dy = randBetween(-.02, -.1);
86: if (m[3][2] < -2.25) dz = randBetween(.02, .1);
87: else if (m[3][2] > 4) dz = randBetween(-.02, -.1);
88:
89:
90: // [self render];
91: [self display];
92:
93: return self;
94: }
95:
96: - (BOOL) useBufferedWindow
97: {
98: return YES;
99: }
100:
101: - (const char *)windowTitle
102: { return "I'm a little teapot...";
103: }
104:
105: - inspector:sender
106: {
107: char buf[MAXPATHLEN];
108:
109: if (!inspectorPanel)
110: {
111: [NXBundle getPath:buf forResource:"teapot" ofType:"nib" inDirectory:[sender moduleDirectory:"Teapot"] withVersion:0];
112: [NXApp loadNibFile:buf owner:self withNames:NO];
113:
114: [surfaceMatrix selectCellAt:surfaceMatrixSelection :0];
115: [colorWell setColor:[theShader color]];
116: }
117: return inspectorPanel;
118: }
119:
120: - setResolutionFrom:sender
121: {
122: [teapot setResolution:[sender floatValue]];
123: [resolutionTextField setIntValue:[sender floatValue]];
124: return self;
125: }
126:
127: - setColorFrom:sender
128: {
129: float r,g,b;
130: char str[100];
131:
132: [theShader setColor:[sender color]];
133:
134: NXConvertColorToRGB([sender color], &r, &g, &b);
135: sprintf(str, "%5.3f %5.3f %5.3f", r, g, b );
136: NXWriteDefault([NXApp appName], "TeapotColor", str);
137:
138: return self;
139: }
140:
141: - getTeapotColor
142: {
143: float r = .757, g = .875, b = .898;
144: const char *ptr;
145:
146: ptr = NXGetDefaultValue([NXApp appName], "TeapotColor");
147: if (ptr) sscanf (ptr, "%f %f %f", &r, &g, &b );
148:
149: [theShader setColor:NXConvertRGBToColor(r,g,b)];
150: return self;
151: }
152:
153: - setSurfaceType:sender
154: {
155: char str[100];
156: int type, val = [sender selectedRow];
157:
158: switch (val)
159: {
160: case 0:
161: type = N3D_WireFrame; break;
162: case 1:
163: type = N3D_FacetedSolids; break;
164: case 2:
165: type = N3D_SmoothSolids; break;
166: default:
167: type = N3D_WireFrame; break;
168: }
169:
170: surfaceMatrixSelection = val;
171:
172: sprintf(str,"%d", val);
173: NXWriteDefault([NXApp appName], "TeapotSurface", str);
174:
175: [self setSurfaceTypeForAll:type chooseHider:YES];
176: return self;
177: }
178:
179: - getSurfaceType
180: {
181: const char *ptr;
182: int type, val = 0;
183:
184: ptr = NXGetDefaultValue([NXApp appName], "TeapotSurface");
185: if (ptr)
186: {
187: sscanf(ptr,"%d",&val);
188: if (val < 0 || val > 2) val = 0;
189: }
190:
191: surfaceMatrixSelection = val;
192:
193: switch (val)
194: {
195: case 0:
196: type = N3D_WireFrame; break;
197: case 1:
198: type = N3D_FacetedSolids; break;
199: case 2:
200: type = N3D_SmoothSolids; break;
201: default:
202: type = N3D_WireFrame; break;
203: }
204:
205: [self setSurfaceTypeForAll:type chooseHider:YES];
206:
207: return self;
208: }
209:
210:
211: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.