Annotation of OpenXM/src/cfep/MyOpenGLView.m, Revision 1.1
1.1 ! takayama 1: //
! 2: // MyOpenGLView.m
! 3: // cfep
! 4: //
! 5: // Created by Nobuki Takayama on 06/02/18.
! 6: // Copyright 2006 OpenXM.org. All rights reserved.
! 7: //
! 8:
! 9: #import "MyOpenGLView.h"
! 10: #include "mygl.h"
! 11:
! 12: @implementation MyOpenGLView
! 13: -(id) initWithFrame: (NSRect) frame {
! 14: NSLog(@"initWithFrame\n");
! 15: oglComm = [NSMutableArray arrayWithCapacity: 100];
! 16: [oglComm retain];
! 17: oglInitComm = [NSMutableArray arrayWithCapacity: 1];
! 18: [oglInitComm retain];
! 19: xeye = 0.0;
! 20: yeye = 0.0;
! 21: zeye = 2.0;
! 22: initGl = 1;
! 23:
! 24: [super initWithFrame: frame];
! 25: if (self) {
! 26: NSOpenGLPixelFormatAttribute attributes[]={
! 27: NSOpenGLPFAAccelerated,
! 28: NSOpenGLPFADepthSize,16, // We need this, otherwise depth buffer will no be enabled.
! 29: NSOpenGLPFAMinimumPolicy,
! 30: NSOpenGLPFAClosestPolicy,
! 31: 0};
! 32: NSOpenGLPixelFormat *format;
! 33: format = [[[NSOpenGLPixelFormat alloc] initWithAttributes: attributes] autorelease];
! 34: [self initWithFrame: frame pixelFormat: format];
! 35: }
! 36: return self;
! 37: }
! 38:
! 39: -(IBAction) setXeye: (id) sender {
! 40: xeye=([sender floatValue]-50)*0.1; initGl = 1;
! 41: NSLog(@"xeye=%f\n",xeye);
! 42: [self setNeedsDisplay: YES];
! 43: }
! 44: -(IBAction) setYeye: (id) sender {
! 45: float y;
! 46: y=([sender floatValue]-50)*0.1; initGl = 1;
! 47: yeye=y;
! 48: //NSLog(@"yeye=%f\n",yeye);
! 49: [self setNeedsDisplay: YES];
! 50: }
! 51: -(IBAction) setZeye: (id) sender {
! 52: float z;
! 53: z=([sender floatValue]-50)*0.1+2.0; initGl = 1;
! 54: zeye=z;
! 55: //NSLog(@"zeye=%f\n",zeye);
! 56: [self setNeedsDisplay: YES];
! 57: }
! 58: -(void) drawRect: (NSRect) rect {
! 59: if (initGl) { [self initGL]; initGl = 0;}
! 60: [self drawOglComm];
! 61: //For testing. [self drawRectSimple: rect withColor: 0.0];
! 62: }
! 63: -(void) setFrameSize: (NSSize) newSize {
! 64: [super setFrameSize: newSize];
! 65: //[[self openGLContext] makeCurrentContext];
! 66: glViewport(0,0,(GLsizei)newSize.width,(GLsizei) newSize.height);
! 67: initGl=1;
! 68: [self setNeedsDisplay: YES];
! 69: }
! 70: -(void) initGL {
! 71: // Initialization codes are here.
! 72: glClearColor(1.0,1.0,1.0,1.0);
! 73: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
! 74: [self drawOglInitComm];
! 75: }
! 76: // It was for a test.
! 77: -(void) drawRectSimple: (NSRect) rect withColor: (double) c {
! 78: glClearColor(1.0,1.0,1.0,1.0);
! 79: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
! 80: glColor4f(1.0,1.0,c,1.0);
! 81: glRectf(-0.6,-0.6,0.6,0.6);
! 82:
! 83: glFlush();
! 84: [[self openGLContext] flushBuffer];
! 85: }
! 86:
! 87: -(void) drawOglComm {
! 88: int i,n;
! 89: MyOpenGLCommand *gc;
! 90: // Execute oglComm.
! 91: n = [oglComm count];
! 92: NSLog(@"drawRect is called with n=%d, oglComSize=%d\n",n,oglCommSize);
! 93: for (i=0; i<oglCommSize; i++) {
! 94: gc = [oglComm objectAtIndex: i];
! 95: [self execute: gc];
! 96: }
! 97: glFlush();
! 98: [[self openGLContext] flushBuffer];
! 99: }
! 100: -(void) addOglComm: (NSString *) comm by: (id) sender {
! 101: MyOpenGLCommand *oc;
! 102: oc = [MyOpenGLCommand allocAndCompile: comm by: sender];
! 103: if (oc != nil) {
! 104: [oglComm addObject: oc]; // retain is automatically done. // dealloc should be implemented.
! 105: @synchronized(self) {
! 106: if ([oc isEndGroup] == YES) oglCommSize=[oglComm count];
! 107: }
! 108: if ([oc getOpCode] == CFEPglib_flush) [self setNeedsDisplay: YES];
! 109: // If oc is glib_flush, then call drawRect. (Generate an event.)
! 110: // Calling [self drawOglComm] directly is not safe, because the window might not be ready.
! 111: }
! 112: }
! 113:
! 114: -(void) drawOglInitComm {
! 115: int i,n;
! 116: MyOpenGLCommand *gc;
! 117: // Execute oglComm.
! 118: n = [oglInitComm count];
! 119: NSLog(@"drawOglInitComm is called with n=%d, oglInitComSize=%d\n",n,oglInitCommSize);
! 120: for (i=0; i<oglInitCommSize; i++) {
! 121: gc = [oglInitComm objectAtIndex: i];
! 122: [self execute: gc];
! 123: }
! 124: }
! 125: -(void) addOglInitComm: (NSString *) comm by: (id) sender {
! 126: MyOpenGLCommand *oc;
! 127: oc = [MyOpenGLCommand allocAndCompile: comm by: sender];
! 128: if (oc != nil) {
! 129: [oglInitComm addObject: oc]; // retain is automatically done. // dealloc should be implemented.
! 130: @synchronized(self) {
! 131: if ([oc isEndGroup] == YES) oglInitCommSize=[oglInitComm count];
! 132: }
! 133: if ([oc getOpCode] == CFEPglib_flush) { initGl = 1; [self setNeedsDisplay: YES]; }
! 134: }
! 135: }
! 136:
! 137: // Byte compile is done by comple: in MyOpenGLCommand.m
! 138: -(void) execute: (MyOpenGLCommand *)gc {
! 139: int op;
! 140: float x,y,z,c;
! 141: int p,q,r,s;
! 142: double *v;
! 143: int *ii;
! 144: op = [gc getOpCode];
! 145: v = [gc getF4];
! 146: ii = [gc getI4];
! 147: x = v[0]; y = v[1]; z = v[2]; c = v[3];
! 148: p = ii[0]; q=ii[1]; r=ii[2]; s=ii[3];
! 149: // NSLog(@"opCode=%d, (x,y,z,c)=(%f,%f,%f,%f), (p,q,r,s)=(%d,%d,%d,%d)\n",op,x,y,z,c,p,q,r,s);
! 150: switch(op) {
! 151: case CFEPglBegin:
! 152: glBegin(p);
! 153: break;
! 154: case CFEPglColor4f:
! 155: glColor4f(x,y,z,c); break;
! 156: case CFEPglEnd:
! 157: glEnd(); break;
! 158: case CFEPglRectf:
! 159: glRectf(x,y,z,c); break;
! 160: case CFEPglVertex3f:
! 161: glVertex3f(x,y,z); break;
! 162:
! 163: case CFEPglib_line:
! 164: glib_line(x,y,z,c,p); break;
! 165: case CFEPglib_putpixel:
! 166: glib_putpixel(x,y,p); break;
! 167: case CFEPglib_flush:
! 168: [self setNeedsDisplay: YES]; break;
! 169:
! 170: case CFEPglib3_bounding_box:
! 171: glib3_bounding_box(x); break;
! 172: case CFEPglib3_icosahedron:
! 173: glib3_icosahedron(0.0f, 0.0f, -1.0f, 1.0f); break;
! 174: case CFEPglib3_ray:
! 175: [self glib3_ray]; break;
! 176: case CFEPglib3_ray_init:
! 177: glib3_ray_init(); break;
! 178: case CFEPglib3_ray_reshape:
! 179: glib3_ray_reshape(x,y); break;
! 180: case CFEPglib3_std_scene0:
! 181: [self glib3_std_scene0]; break;
! 182: default:
! 183: NSLog(@"Unknown opCode %d\n",op);
! 184: break;
! 185: }
! 186: }
! 187:
! 188: -(void) glib3_ray {
! 189: glib3_ray_change_alpha(-90.0+xeye*5);
! 190: glib3_ray_change_beta(90.0+yeye*3);
! 191: glib3_ray();
! 192: }
! 193: -(void) glib3_std_scene0 {
! 194: glib3_std_scene0(xeye,yeye,zeye);
! 195: }
! 196:
! 197: @end
! 198:
! 199: // Original glib functions
! 200: void glib_line(float x,float y, float x2,float y2, int color) {
! 201: glColor4f((color/0x10000)/256.0,((color/0x100)& 0xff)/256.0,(color % 0x100)/256.0,0.0);
! 202: // NSLog(@"color=%f,%f,%f\n",(color/0x10000)/256.0,((color/0x100)& 0xff)/256.0,(color % 0x100)/256.0);
! 203: glBegin(GL_LINES);
! 204: glVertex2f(x,y);
! 205: glVertex2f(x2,y2);
! 206: glEnd();
! 207: }
! 208: void glib_putpixel(float x,float y,int color) {
! 209: // NSLog(@"color=%f,%f,%f\n",(color/0x10000)/256.0,((color/0x100)& 0xff)/256.0,(color % 0x100)/256.0);
! 210: glBegin(GL_POINTS);
! 211: glColor4f((color/0x10000)/256.0,((color/0x100)& 0xff)/256.0,(color % 0x100)/256.0,0.0);
! 212: glVertex2f(x,y);
! 213: glEnd();
! 214: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>