This is Context3D.m in view mode; [Download] [Up]
/* Context3D.m */ #import "Context3D.h" #import "View3D.h" #import <dpsclient/wraps.h> @implementation Context3D + newFrame:(NXRect *)frameRect { self=[super newFrame:frameRect]; pictureDistance=1500.0; clippingDistance=1.0; currentPoint.x=0.0; currentPoint.y=0.0; currentPoint.z=0.0; [self setContentView:[View3D new]]; return self; } - moveto:(vector3D *)where { currentPoint=*where; return self; } - lineto:(const vector3D *)where { NXPoint start,end; vector3D current,to; if(currentPoint.z > -clippingDistance) { // we make to be the point if(where->z > -clippingDistance) { // less than clippingDistance currentPoint=*where; // if there is one. return self; // if both to and currentPoint } // are closer than to=currentPoint; // clippingDistance, we return current=*where; // out. } else { to=*where; current=currentPoint; } if(to.z > -clippingDistance) { // if to is closer than float temp; // clippingDistance, we vector3D tempVect; // know from the above temp=current.z+clippingDistance; // steps that current temp=temp/(current.z-to.z); // is not. tempVect.x=to.x-current.x; // We recalculate to such that tempVect.y=to.y-current.y; // it is at the intersection tempVect.z=to.z-current.z; // of the line segment and the to.x=current.x + tempVect.x*temp; // clipping plane. to.y=current.y + tempVect.y*temp; to.z=current.z + tempVect.z*temp; } // here we do a simple projection, since we now know that both current and // to are in front of the clipping plane. start.x=current.x*(-pictureDistance)/current.z; start.y=current.y*(-pictureDistance)/current.z; end.x=to.x*(-pictureDistance)/to.z; end.y=to.y*(-pictureDistance)/to.z; PSmoveto(start.x,start.y); PSlineto(end.x,end.y); PSstroke(); currentPoint=*where; return self; } - polygon:(vector3D *)vertices howMany:(int)count { int ctr; [self moveto:&vertices[0]]; for(ctr=1;ctr<count;++ctr) [self lineto:&vertices[ctr]]; [self lineto:&vertices[0]]; return self; } - contentView { return contentView; } - setContentView:anObject { contentView=anObject; [anObject setSuperView:self]; return self; } - setPictureDistance:(float)dist { if(dist > 0.0) { pictureDistance=dist; return self; } return nil; } - setClippingDistance:(float)dist { if(dist > 0.0) { clippingDistance=dist; return self; } return nil; } - drawSelf:(const NXRect *) rects:(int)rectCount { [contentView display]; return self; } - free { [contentView free]; return [super free]; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.