This is CubePlane.m in view mode; [Download] [Up]
#import "CubePlane.h" #import "Plane.h" #import "Cubicle.h" extern "C" { #import <dpsclient/psops.h> } extern "Objective-C" { #import <objc/List.h> } #define ZAlloc(CLASS) [CLASS allocFromZone:[self zone]] enum {FRONT, SIDE, TOP, VSMAX} ViewSides; static const NXCoord scale = 0.01; static const NXCoord angle[] = {0.0, 0.85, -0.4}; #define N_FACES 8 static id iconList; static NXColor colorList[N_FACES] = { NX_COLORBLUE, NX_COLORPURPLE, NX_COLORRED, NX_COLORMAGENTA, NX_COLORCYAN, NX_COLORYELLOW, NX_COLORGREEN, NX_COLORWHITE}; @implementation CubePlane + initialize { iconList = [ZAlloc(List) initCount:N_FACES]; return [super initialize]; } - initPlane:(Plane *)plane tag:(CubeInt)tag { [super init]; myPlane = plane; myTag = tag; return self; } -free { delete myPlane; return [super free]; } - resizeTo:(NXPoint)unit { /* Should we unrotate first? */ switch (myTag) { case FRONT: [[self moveTo:0.0 :0.0] sizeTo:(3*unit.x) :(2*unit.y)]; break; case SIDE: [[self moveTo:(3*unit.x) :0.0] sizeTo:unit.x :(3*unit.y)]; [[self scale:scale :1.0] rotate:angle[SIDE]]; break; case TOP: [[self moveTo:0.0 :(2*unit.y)] sizeTo:(4*unit.x) :unit.y]; [[self scale:1.0 :scale] rotate:angle[TOP]]; break; break; } return self; } /* This should be a PSWrap someday */ static void drawFace(NXRect *aRect, CubeFace face) { #ifdef GRAY const float temp= face/(float)(CubeNSides-1); NXSetColor(NXConvertGrayToColor(temp)); #else NXSetColor(colorList[face]); #endif PSrectfill(NX_X(aRect), NX_Y(aRect), NX_WIDTH(aRect), NX_HEIGHT(aRect)); PSsetgray(NX_BLACK); NXFrameRect(aRect); } #ifdef THREED #define DEPTH 1 static const short face[DEPTH] = {-1}; static const short level[DEPTH] = {0}; #else #define DEPTH 4 static const short face[DEPTH] = {T, -1, -1, T}; static const short level[DEPTH] = {1, 1, 0, 0}; #endif #define NFACES CubeSide*CubeSide - drawSelf:(const NXRect *)rects :(int)rectCount { enum {X,Y,XYMAX}; NXRect oneFace; static CubeInt map[VSMAX][NFACES][XYMAX] = { {{0,0},{1,0},{1,1},{0,1}}, {{1,0},{0,0},{0,1},{1,1}}, {{0,1},{0,0},{1,0},{1,1}} }; NXCoord size[] = {NX_MIDX(&bounds), NX_MIDY(&bounds)}; NXCoord off[] = {size[X]/DEPTH, size[Y]/DEPTH}; for (CubeInt cube = 0; cube < NFACES; cube++) { CubeInt* cMap = map[myTag % VSMAX][cube]; NXCoord base[2][2] = {{0.0, 0.0}, {size[X], size[Y]}}; short i,j; for (i=0; i < DEPTH; i++) { NXSetRect(&oneFace, base[cMap[X]][X], base[cMap[Y]][Y], base[1][X] - base[0][X], base[1][Y] - base[0][Y]); drawFace(&oneFace, myPlane[level[i]].face(cube,face[i])); for (j=X; j < XYMAX; j++) base[0][j] += off[j]; } } return self; } /* Need outer Planes different than Inner ones */ @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.