|
|
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.