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