[BACK]Return to MyOpenGLCommand.m CVS log [TXT][DIR] Up to [local] / OpenXM / src / cfep

Annotation of OpenXM/src/cfep/MyOpenGLCommand.m, Revision 1.1

1.1     ! takayama    1: //
        !             2: //  MyOpenGLCommand.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 "MyOpenGLCommand.h"
        !            10: #define min(a,b) (a>b?b:a)
        !            11:
        !            12:
        !            13: @implementation MyOpenGLCommand
        !            14: -(id)init {
        !            15:   int i;
        !            16:   command = nil;
        !            17:   opCode = -1;
        !            18:   endGroup = NO;
        !            19:   for (i=0; i<4; i++) f4[i] = 0.0;
        !            20:   for (i=0; i<4; i++) i4[i] = 0;
        !            21:   return self;
        !            22: }
        !            23: -(void) dealloc {
        !            24:   if (argv) [argv autorelease];
        !            25: }
        !            26: -(void)print {
        !            27:   int i;
        !            28:   NSLog(@"command=%s, opCode=%d, [",command,opCode);
        !            29:   for (i=0; i<4; i++) NSLog(@"%f,",f4[i]);
        !            30:   NSLog(@"; ");
        !            31:   for (i=0; i<4; i++) NSLog(@"%d,",i4[i]);
        !            32:   NSLog(@"]\n");
        !            33: }
        !            34: +(MyOpenGLCommand *)allocAndCompile: (NSString *)cmd by: (id) sender {
        !            35:   MyOpenGLCommand *c;
        !            36:   c=[[MyOpenGLCommand alloc] init];
        !            37:   [c autorelease];
        !            38:   return [c compile: cmd by: sender];
        !            39: }
        !            40: -(BOOL) isEndGroup {
        !            41:   return endGroup;
        !            42: }
        !            43: -(MyOpenGLCommand *) compile: (NSString *)cmd by: (id) sender {
        !            44:    // parse cmd and set opCode and f4[].  opCode starts with CFEPgl.
        !            45:    // Interpreter code is in MyOpenGLView.m with the name execute:
        !            46:    NSArray *a;
        !            47:    NSString *s;
        !            48:    NSString *errmsg;
        !            49:    id x;
        !            50:    int fargc, iargc;
        !            51:    int i,n,ii;
        !            52:    double f;
        !            53:
        !            54:    a = [MyUtil arrayOfStringFrom: cmd]; //"[glColor4f,1.0,1.0,0.0,1.0]" -> array of [NSString, MyFloat, MyFloat,..]
        !            55:    [a retain]; argv = a;
        !            56:    n = [a count];
        !            57:    fargc = 0; iargc = 0;
        !            58:    // for (i=0; i<n; i++) { NSLog(@"%@,",[a objectAtIndex: i]); }
        !            59:    if (n == 0) return nil;
        !            60:    x = [a objectAtIndex: 0];
        !            61:    if ([x isKindOfClass: [NSString class]] == YES) s = x;  // isMemberOfClass does not work. ??
        !            62:    else {
        !            63:      NSLog(@"NSString is exected.\n");
        !            64:         s = @"";
        !            65:    }
        !            66:    if ([s compare: @"glBegin"] == NSOrderedSame) {
        !            67:        opCode = CFEPglBegin;  fargc = 0; iargc = 1;  endGroup = NO;
        !            68:
        !            69:    }else if ([s compare: @"glColor4f"] == NSOrderedSame) {
        !            70:        opCode = CFEPglColor4f;  fargc = 4; iargc = 0;  endGroup = NO;
        !            71:
        !            72:    }else if ([s compare: @"glEnd"] == NSOrderedSame) {
        !            73:        opCode = CFEPglEnd;  fargc = 0; iargc = 0;  endGroup = YES;
        !            74:
        !            75:    }else if ([s compare: @"glRectf"] == NSOrderedSame) {
        !            76:        opCode = CFEPglRectf;    fargc = 4; iargc = 0; endGroup = YES;
        !            77:
        !            78:    }else if ([s compare: @"glVertex3f"] == NSOrderedSame) {
        !            79:        opCode = CFEPglVertex3f;    fargc = 3; iargc = 0; endGroup = NO;
        !            80:
        !            81:    }else if ([s compare: @"glib_line"] == NSOrderedSame) {
        !            82:        opCode = CFEPglib_line;    fargc = 4; iargc = 1; endGroup = YES;
        !            83:
        !            84:    }else if ([s compare: @"glib_putpixel"] == NSOrderedSame) {
        !            85:        opCode = CFEPglib_putpixel;    fargc = 2; iargc = 1; endGroup = YES;
        !            86:
        !            87:    }else if ([s compare: @"glib_flush"] == NSOrderedSame) {
        !            88:        opCode = CFEPglib_flush;    fargc = 0; iargc = 0;   endGroup = YES;
        !            89:
        !            90:    }else if ([s compare: @"glib3_bounding_box"] == NSOrderedSame) {
        !            91:        opCode = CFEPglib3_bounding_box;    fargc = 1; iargc = 0;   endGroup = YES;
        !            92:
        !            93:    }else if ([s compare: @"glib3_ray_init"] == NSOrderedSame) {
        !            94:        opCode = CFEPglib3_ray_init;    fargc = 0; iargc = 0;   endGroup = YES;
        !            95:
        !            96:    }else if ([s compare: @"glib3_ray_reshape"] == NSOrderedSame) {
        !            97:        opCode = CFEPglib3_ray_reshape;    fargc = 0; iargc = 0;   endGroup = YES;
        !            98:
        !            99:    }else if ([s compare: @"glib3_ray"] == NSOrderedSame) {
        !           100:        opCode = CFEPglib3_ray;    fargc = 0; iargc = 0;   endGroup = YES;
        !           101:        [sender output: @"Ray by David Bucciarelli. (MesaDemo, GPL)"];
        !           102:
        !           103:    }else if ([s compare: @"glib3_std_scene0"] == NSOrderedSame) {
        !           104:        opCode = CFEPglib3_std_scene0;    fargc = 0; iargc = 0;   endGroup = YES;
        !           105:        [sender output: @"glib3_std_scene0(0,0,2) using glFrustum"];
        !           106:
        !           107:    }else if ([s compare: @"glib3_icosahedron"] == NSOrderedSame) {
        !           108:        opCode = CFEPglib3_icosahedron;    fargc = 0; iargc = 0;   endGroup = YES;
        !           109:        [sender output: @"Icosahedron"];
        !           110:
        !           111:    }else {
        !           112:     NSLog(@"Undefined command=<%@>\n",s);
        !           113:        errmsg = [NSString stringWithFormat: @"Undefined command=<%@>",s];
        !           114:        [sender output: errmsg];
        !           115:     return nil;
        !           116:    }
        !           117:    // Format glxxxpfqi  fargc=p, iargc=q.  Example: glxxx4f1i, 0.1,0.2,0.3,0.4,34
        !           118:    if (fargc > 0) {
        !           119:        for (i=1; i< min(n,fargc+1); i++) {
        !           120:            x = [a objectAtIndex: i];
        !           121:         if ([x isMemberOfClass: [MyFloat class]] == YES) f = [x getFValue];
        !           122:                else {
        !           123:                  NSLog(@"float is exected.\n");
        !           124:                  f = 0.0;
        !           125:                }
        !           126:                if (i-1 < 4) f4[i-1] = f;
        !           127:        }
        !           128:    }
        !           129:    if (iargc > 0) {
        !           130:        for (i=1+fargc; i< min(n,fargc+iargc+1); i++) {
        !           131:            x = [a objectAtIndex: i];
        !           132:         if ([x isMemberOfClass: [MyInt class]] == YES) ii = [x getIValue];
        !           133:                else {
        !           134:                  ii = 0;
        !           135:                  NSLog(@"int is exected.\n");
        !           136:                }
        !           137:                if (i-1-fargc < 4) i4[i-1-fargc] = ii;
        !           138:        }
        !           139:    }
        !           140:    return self;
        !           141: }
        !           142:
        !           143: -(int) getOpCode { return opCode; }
        !           144: -(double *)getF4 { return f4; }
        !           145: -(int *) getI4 { return i4; }
        !           146: -(NSArray *)getArgv { return argv; }
        !           147:
        !           148:
        !           149: @end
        !           150:
        !           151: /* Code to test MyFloat put in compile:
        !           152:    MyFloat *x;
        !           153:    NSLog(@"member test.\n"
        !           154:    x = [MyFloat allocWith: 1.0];
        !           155:    if ([x isMemberOfClass: [MyFloat class]] == YES) NSLog(@"[x class] is MyFloat\n");
        !           156:    if ([x isMemberOfClass: [MyInt class]] == YES) NSLog(@"[x class] is MyInt\n");
        !           157: */
        !           158: @implementation MyFloat
        !           159: +(MyFloat *)allocWith: (float) f {
        !           160:    MyFloat *ff;
        !           161:    ff=[MyFloat alloc];
        !           162:    [ff setFValue: f];
        !           163:    return ff;
        !           164: }
        !           165: -(void) setFValue: (float) f { fValue = f; }
        !           166: -(float) getFValue { return fValue; }
        !           167: -(NSString *)description { return [NSString stringWithFormat: @"(float)%f",fValue]; }
        !           168: @end
        !           169:
        !           170: @implementation MyInt
        !           171: +(MyInt *)allocWith: (int) i {
        !           172:   MyInt *ii;
        !           173:   ii=[MyInt alloc];
        !           174:   [ii setIValue: i];
        !           175:   return ii;
        !           176: }
        !           177: -(void) setIValue: (int) i { iValue = i; }
        !           178: -(int) getIValue { return iValue; }
        !           179: -(NSString *)description { return [NSString stringWithFormat: @"(int)%d",iValue]; }
        !           180: @end
        !           181:
        !           182: #define SMAX  0x1000   //4096*16
        !           183: @implementation MyUtil
        !           184: static int debugMyUtil = 0;
        !           185: +(void) setDebugMyUtil {
        !           186:   if (debugMyUtil) debugMyUtil = 0;
        !           187:   else debugMyUtil = 1;
        !           188: }
        !           189: +(NSMutableArray *) arrayOfStringFrom: (NSString *) args {
        !           190:   int n,i,k,type;
        !           191:   unichar c;
        !           192:   unichar s[SMAX];
        !           193:   NSMutableArray *a; // for debug
        !           194:   NSMutableArray *aa;
        !           195:   NSString *ss;
        !           196:   int status,level;
        !           197:   status = -1; level = 0; type = 0;
        !           198:   n = [args length];
        !           199:   if (n >= SMAX-1) {
        !           200:     NSLog(@"Too big string for stringToArrayOfString.\n");
        !           201:     return nil;
        !           202:   }
        !           203:   a = [NSMutableArray arrayWithCapacity: 1];
        !           204:   aa = [NSMutableArray arrayWithCapacity: 1];
        !           205:   for (i=0, k=0; i<n; i++) {
        !           206:     c = [args characterAtIndex: i];
        !           207:        if (level == 0) {
        !           208:                switch (status) {  // See my note on 2006-02-20.
        !           209:                case -1:
        !           210:                        if ( c == '[') { k=0; status=0;}
        !           211:                        break;
        !           212:                case 0:
        !           213:                        if ( c == '[') {
        !           214:                                k = 0; s[k] = c; k++; status = 1; type = 1; // type 1 : list
        !           215:                        } else if (c == ',') {
        !           216:                        } else if (c == '(') {
        !           217:                           k=0; status = 21; type=0;  //ex. (int)
        !           218:                    } else if ((('A' <= c) && (c <= 'Z')) || (('a' <= c) && (c <= 'z'))) {
        !           219:                           k=0; status = 2; type=3; s[k] = c; k++;      // type -1 : string.
        !           220:                        } else if (c > ' ') {
        !           221:                                k=0; status = 2; type=0; s[k] = c; k++;     // type 0 : float
        !           222:                        } else if (c == ']') status = -1;
        !           223:                        break;
        !           224:                case 2:
        !           225:                        if ((c == ',') || (c == ']')) {
        !           226:                           if (c == ',') status = 0; else status = -1;
        !           227:                if (k > 0) ss = [NSString stringWithCharacters: s length: k];
        !           228:                           else ss = @"";
        !           229:                           [a addObject: ss];
        !           230:                           if (type == 2) [aa addObject: [MyInt allocWith: [ss intValue]]];
        !           231:                           else if (type == 0) [aa addObject: [MyFloat allocWith: [ss floatValue]]];
        !           232:                           else [aa addObject: ss];
        !           233:                        }else{
        !           234:                                s[k] = c; k++;
        !           235:                        }
        !           236:                        break;
        !           237:                case 1:
        !           238:                        if (c == '[') {
        !           239:                           s[k] = c; k++;
        !           240:                           level++;
        !           241:                        }else if (c == ']') {
        !           242:                           s[k] = ']'; k++;
        !           243:                           if (k > 0) ss = [NSString stringWithCharacters: s length: k];
        !           244:                           else ss = @"";
        !           245:                           [a addObject: ss];
        !           246:                           [aa addObject: [MyUtil arrayOfStringFrom: ss]];
        !           247:                           status = 0;
        !           248:                        }else {
        !           249:                           s[k] = c; k++;
        !           250:                        }
        !           251:                        break;
        !           252:                case 21:
        !           253:             if (c == ')') {
        !           254:                          if ((s[0] == 'i') && (s[1] == 'n') && (s[2] == 't')) type=2;
        !           255:                          else type = 0;
        !           256:                          status = 2; k = 0; // starting to read data.
        !           257:                        }else if (c > ' ') {
        !           258:                          s[k] = c; k++;
        !           259:                        }
        !           260:                        break;
        !           261:                }
        !           262:        }else if (level > 0) {
        !           263:            s[k] = c; k++;
        !           264:                if (c == '[') level++;
        !           265:                else if (c == ']') level--;
        !           266:        }
        !           267:   }
        !           268:   if (debugMyUtil) {
        !           269:     NSLog(@"a=%@\n",a);
        !           270:     NSLog(@"aa=%@\n",aa);
        !           271:   }
        !           272:   return aa;
        !           273: }
        !           274:
        !           275: /*
        !           276:    NSLog(@"mytest=%@\n",[MyUtil arrayOfStringFrom: @"[]"]);
        !           277:    NSLog(@"mytest=%@\n",[MyUtil arrayOfStringFrom: @"[1,[]]"]);
        !           278:    NSLog(@"mytest=%@\n",[MyUtil arrayOfStringFrom: @"[1,2,[3,4],5]"]);
        !           279:    NSLog(@"mytest=%@\n",[MyUtil arrayOfStringFrom: @" [1, 2,3, 4,5]"]);
        !           280:    NSLog(@"mytest=%@\n",[MyUtil arrayOfStringFrom: @"[[1],2,[[3,[4]]],5]"]); // There is a bug. Output is 1,2,...
        !           281: */
        !           282:
        !           283: @end

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>