|
|
1.1 root 1: #include <CC/jerq.h>
2: #include "frame.pri"
3: #include "camera.pri"
4: #include "clock.pub"
5:
6: static Rectangle part(Rectangle, int, int);
7: int sprintf(...);
8: int latitude(int);
9: long vscale;
10: extern long vscale;
11:
12: Texture32 blup = {
13: #include "lup.icon"
14: }, bldown = {
15: #include "ldown.icon"
16: }, brup = {
17: #include "rup.icon"
18: }, brdown = {
19: #include "rdown.icon"
20: }, a1 = {
21: #include "b1.icon"
22: }, a2 = {
23: #include "b2.icon"
24: }, a3 = {
25: #include "b3.icon"
26: }, a4 = {
27: #include "b4.icon"
28: };
29:
30: Camera.Camera(Rectangle arena, Rectangle *leftover)
31: {
32: Rectangle r;
33: Point o;
34:
35: o = arena.o;
36: obs = new Globepot(raddp(Rect(10, 10, 130, 130), o), 0,
37: 45, 45, Pt(160, 0));
38: obs->help = "angle of camera from center of data";
39: dist = new Rulepot(raddp(Rect(200, 70, 400, 90), o), P_HORIZ|P_TICKS, 300,
40: Point(130, -25), Point(50, -25), "distance", 250);
41: dist->help = "distance of camera from center of data";
42: ospin = new Bmappot(raddp(Rect(530, 54, 562, 86), o), P_CIRC,
43: Point(-25, -35), "SPIN TYPE");
44: dist->help = "how the camera position changes over time";
45: ospin->item(Point(21, -25), "none", &a1);
46: ospin->item(Point(21, 11), "lat=c", &a2);
47: ospin->item(Point(-75, 11), "long=c", &a3);
48: ospin->item(Point(-75, -25), "circle", &a4);
49: ospinr = new Rulepot(raddp(Rect(650, 10, 670, 130), o), P_VERT|P_TICKS, 60,
50: Point(72, 60), Point(35, 40), "Spin Rate");
51: ospinr->help = "degrees of spin per time interval";
52: r = arena;
53: r.o.y = o.y+142; r.c.y = o.y+150;
54: rectf(&display, r, F_OR);
55: r.o = add(o, Pt(324, 104));
56: r.c = add(o, Pt(491, 150));
57: string(&defont, "CAMERA POSITION", &display, add(o, Pt(340, 120)), F_OR);
58: bord(&display, r, 8, F_OR);
59:
60: o.y += 150;
61: cam = new Globepot(raddp(Rect(10, 10, 130, 130), o), 0,
62: -45, 225, Pt(160, 0));
63: cam->help = "direction of camera at center to the spot";
64: aim = new Bmappot(raddp(Rect(190, 65, 220, 95), o), P_VERT,
65: Point(-34, 40), "AUTO-CENTER", 1);
66: aim->help = "keep camera aimed at the origin";
67: aim->item(Point(2, -20), "OFF", &blup);
68: aim->item(Point(0, 0), "", &bldown);
69: perspective = new Bmappot(raddp(Rect(320, 65, 350, 95), o), P_VERT,
70: Point(-35, 40), "PERSPECTIVE", 0);
71: perspective->help = "render scaled or perspective";
72: perspective->item(Point(2, -20), "OFF", &brup);
73: perspective->item(Point(0, 0), "", &brdown);
74: cspin = new Bmappot(raddp(Rect(530, 54, 562, 86), o), P_CIRC,
75: Point(-25, -35), "SPIN TYPE");
76: cspin->help = "motion of the camera aim";
77: cspin->item(Point(21, -25), "none", &a1);
78: cspin->item(Point(21, 11), "lat=c", &a2);
79: cspin->item(Point(-75, 11), "long=c", &a3);
80: cspin->item(Point(-75, -25), "circle", &a4);
81: cspinr = new Rulepot(raddp(Rect(650, 10, 670, 130), o), P_VERT|P_TICKS, 60,
82: Point(72, 60), Point(35, 40), "Spin Rate");
83: cspinr->help = "degrees of spin per time interval";
84: r = arena;
85: r.o.y = o.y+142; r.c.y = o.y+150;
86: rectf(&display, r, F_OR);
87: r.o = add(o, Pt(404, 104));
88: r.c = add(o, Pt(526, 150));
89: string(&defont, "CAMERA AIM", &display, add(o, Pt(420, 120)), F_OR);
90: bord(&display, r, 8, F_OR);
91:
92: o.y += 150;
93: m->adv = new Bmappot(raddp(Rect(60, 40, 90, 70), o), P_VERT,
94: Point(-43, 40), "FRAME ADVANCE", 1);
95: m->adv->help = "advance frames while spinning";
96: m->adv->item(Point(2, -20), "OFF", &brup);
97: m->adv->item(Point(0, 0), "", &brdown);
98: m->run = new Bmappot(raddp(Rect(160, 40, 190, 70), o), P_VERT,
99: Point(2, 40), "RUN", 1);
100: m->run->help = "run movie";
101: m->run->item(Point(2, -20), "OFF", &blup);
102: m->run->item(Point(0, 0), "", &bldown);
103: clock->speed = new Rulepot(raddp(Rect(250, 50, 450, 70), o),
104: P_HORIZ|P_TICKS, SPEED, Point(86, 35), Point(1, -25),
105: "delay between frames", 5);
106: clock->speed->help = "delay (in ticks) between frames";
107: m->hide = new Bmappot(raddp(Rect(520, 40, 550, 70), o), P_VERT,
108: Point(-52, 40), "HIDDEN SURFACES", 0);
109: m->hide->help = "eliminate hidden lines";
110: m->hide->item(Point(2, -20), "OFF", &blup);
111: m->hide->item(Point(0, 0), "", &bldown);
112: vertscale = new Rulepot(raddp(Rect(650, 10, 670, 90), o),
113: P_VERT|P_TICKS, 100, Point(56, 60), Point(35, 40), "V Scale", 100);
114: vertscale->help = "vertical scale";
115: r = arena;
116: r.o.y = o.y+112; r.c.y = o.y+120;
117: rectf(&display, r, F_OR);
118: drawpot();
119:
120: *leftover = arena;
121: leftover->o.y = o.y+150;
122: }
123:
124: void
125: Camera.adjust()
126: {
127: if(aim->val)
128: cam->setval(-obs->val, (180+obs->w)%360);
129: clat = obs->val;
130: clon = obs->w;
131: cdist = dist->val;
132: alat = cam->val;
133: alon = cam->w;
134: persp = perspective->val;
135: vscale = muldiv(32768, vertscale->val, 100);
136: }
137:
138: void
139: Camera.advance()
140: {
141: int a, b;
142:
143: switch(ospin->val)
144: {
145: case 0:
146: case 3:
147: break;
148: case 1:
149: obs->setval(obs->val, (obs->w+ospinr->val)%360);
150: break;
151: case 2:
152: b = obs->w;
153: if(obs->front)
154: {
155: if((a = obs->val+ospinr->val) > 90)
156: {
157: a = 180-a;
158: b = (b+180)%360;
159: }
160: }
161: else
162: {
163: if((a = obs->val-ospinr->val) < -90)
164: {
165: a = -180-a;
166: b = (b+180)%360;
167: }
168: }
169: obs->setval(a, b);
170: break;
171: }
172: switch(cspin->val)
173: {
174: case 0:
175: case 3:
176: break;
177: case 1:
178: cam->setval(cam->val, (cam->w+cspinr->val)%360);
179: break;
180: case 2:
181: b = cam->w;
182: if(cam->front)
183: {
184: if((a = cam->val+cspinr->val) > 90)
185: {
186: a = 180-a;
187: b = (b+180)%360;
188: }
189: }
190: else
191: {
192: if((a = cam->val-cspinr->val) < -90)
193: {
194: a = -180-a;
195: b = (b+180)%360;
196: }
197: }
198: cam->setval(a, b);
199: break;
200: }
201: adjust();
202: }
203:
204: static Rectangle
205: part(Rectangle r, int n, int i)
206: {
207: int ox;
208:
209: ox = ((n-i)*r.o.x + i*r.c.x)/n;
210: r.c.x = ((n-i-1)*r.o.x + (i+1)*r.c.x)/n;
211: r.o.x = ox;
212: return(r);
213: }
214:
215: Hcoord
216: direct(short lat, short lon, short dist)
217: {
218: Hcoord e(0, 0, muldiv(dist, isin(mkangle((lat+360)%360)), ONE), 1);
219: register xx;
220:
221: xx = muldiv(dist, icos(mkangle((lat+360)%360)), ONE);
222: e.x = muldiv(xx, icos(mkangle(lon)), ONE);
223: e.y = muldiv(xx, isin(mkangle(lon)), ONE);
224: return(e);
225: }
226:
227: latitude(int lat)
228: {
229: lat = (lat%360 + 360)%360;
230: if(lat > 180)
231: lat -= 360;
232: return(lat);
233: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.