This is TesterApp.m in view mode; [Download] [Up]
/* TesterApp.m */ #import "TesterApp.h" #import "Cube.h" #import "Context3D.h" #import "Linear3D.h" #import <objc/List.h> @implementation TesterApp - setTheContext:anObject { int ctr; id newCube,transform,temptransform; NXRect bounds; theContext = anObject; [theContext getBounds:&bounds]; [theContext setDrawOrigin:-bounds.size.width/2.0:-bounds.size.height/2.0]; temptransform=[Linear3D new]; for(ctr=0;ctr<4;++ctr) { newCube=[Cube new]; transform=[Linear3D new]; [transform scaling:5.0:5.0:5.0]; [temptransform translation:ctr * 3.5: ctr * 5.5 : - ctr * 10.0]; [transform concatBefore:temptransform]; [newCube setTransformation:transform]; [[theContext contentView] addSubView:newCube]; } transform=[Linear3D new]; [transform translation:0.0: 0.0 : -40.0]; [[theContext contentView] setTransformation:transform]; [temptransform free]; return self; } - rotateCubes:sender { unsigned ctr,count; id transform,theViewList; theViewList=[[theContext contentView] subviews]; count=[theViewList count]; transform=[Linear3D new]; for(ctr=0;ctr<count;++ctr) { [transform rotation:L3D_X_AXIS:(float)(ctr+1)]; [[[theViewList objectAt:ctr] transformation] concatAfter:transform]; } for(ctr=0;ctr<count;++ctr) { [transform rotation:L3D_Y_AXIS:(float)(ctr+1)*2.0]; [[[theViewList objectAt:ctr] transformation] concatAfter:transform]; } [transform free]; [[theContext window] display]; return self; } - closer:sender { id transform; transform=[Linear3D new]; [transform translation:0.0: 0.0 : 1.0]; [[[theContext contentView] transformation] concatBefore:transform]; [transform free]; [[theContext window] display]; return self; } - farther:sender { id transform; transform=[Linear3D new]; [transform translation:0.0: 0.0 : -1.0]; [[[theContext contentView] transformation] concatBefore:transform]; [transform free]; [[theContext window] display]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.