|
|
1.1 root 1:
2: /*
3: RotatorCamera.m
4:
5: RotatorCamera is an N3DCamera that tracks the mouse to rotate the
6: contents of the camera using a N3DRotator.
7:
8: You may freely copy, distribute, and reuse the code in this example.
9: NeXT disclaims any warranty of any kind, expressed or implied, as to its
10: fitness for any particular use.
11: */
12:
13: #import "Graph.h"
14:
15: #define MOUSE_MASK (NX_LMOUSEDOWNMASK|NX_LMOUSEDRAGGEDMASK|NX_LMOUSEUPMASK)
16:
17: @implementation RotatorCamera
18:
19: /*
20: * As we track the mouse, we use a N3DRotator object to calculate the new
21: * viewing transforms, and then apply those to the camera's world shape.
22: * If our window's delegate is interested, we notify it that we've changed
23: * the document.
24: */
25: - mouseDown:(NXEvent *)event {
26: N3DRotator *rotator = [[N3DRotator allocFromZone:[self zone]] initWithCamera:self];
27: RtMatrix rotationXForm;
28: RtMatrix inverseRotationXForm;
29: NXEvent newEvent;
30: NXPoint oldLocation, newLocation;
31:
32: oldLocation = event->location;
33: [self convertPoint:&oldLocation fromView:nil];
34: [window addToEventMask:NX_LMOUSEDRAGGEDMASK];
35: do {
36: newEvent = *[NXApp getNextEvent:MOUSE_MASK];
37: newLocation = newEvent.location;
38: [self convertPoint:&newLocation fromView:nil];
39: if (oldLocation.x != newLocation.x || oldLocation.y != newLocation.y) {
40: [rotator trackMouseFrom:&oldLocation to:&newLocation
41: rotationMatrix:rotationXForm andInverse:inverseRotationXForm];
42: [worldShape concatTransformMatrix:rotationXForm premultiply:NO];
43: [self display];
44: if ([[window delegate] respondsTo:@selector(docChanged)])
45: [[window delegate] docChanged];
46: }
47: oldLocation = newLocation;
48: } while (newEvent.type != NX_LMOUSEDOWN && newEvent.type != NX_LMOUSEUP);
49: [rotator free];
50: return self;
51: }
52:
53: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.