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

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

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;
1.3       takayama   28:   NSLog(@"command=%@s, opCode=%d, [",command,opCode);
1.1       takayama   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: }
1.3       takayama   34: -(NSString *)toString {
                     35:   return [NSString stringWithFormat: @"%@[%d], %f, %f, %f, %f; %d, %d, %d, %d",command,opCode,f4[0],f4[1],f4[2],f4[3],i4[0],i4[1],i4[2],i4[3]];
                     36: }
1.1       takayama   37: +(MyOpenGLCommand *)allocAndCompile: (NSString *)cmd by: (id) sender {
                     38:   MyOpenGLCommand *c;
                     39:   c=[[MyOpenGLCommand alloc] init];
                     40:   [c autorelease];
                     41:   return [c compile: cmd by: sender];
                     42: }
                     43: -(BOOL) isEndGroup {
                     44:   return endGroup;
                     45: }
                     46: -(MyOpenGLCommand *) compile: (NSString *)cmd by: (id) sender {
                     47:    // parse cmd and set opCode and f4[].  opCode starts with CFEPgl.
                     48:    // Interpreter code is in MyOpenGLView.m with the name execute:
                     49:    NSArray *a;
                     50:    NSString *s;
                     51:    NSString *errmsg;
                     52:    id x;
                     53:    int fargc, iargc;
                     54:    int i,n,ii;
                     55:    double f;
                     56:
                     57:    a = [MyUtil arrayOfStringFrom: cmd]; //"[glColor4f,1.0,1.0,0.0,1.0]" -> array of [NSString, MyFloat, MyFloat,..]
                     58:    [a retain]; argv = a;
                     59:    n = [a count];
                     60:    fargc = 0; iargc = 0;
                     61:    // for (i=0; i<n; i++) { NSLog(@"%@,",[a objectAtIndex: i]); }
                     62:    if (n == 0) return nil;
                     63:    x = [a objectAtIndex: 0];
                     64:    if ([x isKindOfClass: [NSString class]] == YES) s = x;  // isMemberOfClass does not work. ??
                     65:    else {
                     66:      NSLog(@"NSString is exected.\n");
                     67:         s = @"";
                     68:    }
                     69:    if ([s compare: @"glBegin"] == NSOrderedSame) {
                     70:        opCode = CFEPglBegin;  fargc = 0; iargc = 1;  endGroup = NO;
                     71:
                     72:    }else if ([s compare: @"glColor4f"] == NSOrderedSame) {
                     73:        opCode = CFEPglColor4f;  fargc = 4; iargc = 0;  endGroup = NO;
                     74:
1.3       takayama   75:    }else if ([s compare: @"glClear"] == NSOrderedSame) {
                     76:        opCode = CFEPglClear;  fargc = 0; iargc = 1;  endGroup = YES;
                     77:
                     78:    }else if ([s compare: @"glClearColor"] == NSOrderedSame) {
                     79:        opCode = CFEPglClearColor;  fargc = 4; iargc = 0;  endGroup = YES;
                     80:
                     81:    }else if ([s compare: @"glClearDepth"] == NSOrderedSame) {
                     82:        opCode = CFEPglClearDepth;  fargc = 1; iargc = 0;  endGroup = YES;
                     83:
1.5       takayama   84:    }else if ([s compare: @"glDisable"] == NSOrderedSame) {
                     85:        opCode = CFEPglDisable;  fargc = 0; iargc = 1;  endGroup = YES;
                     86:
                     87:    }else if ([s compare: @"glEnable"] == NSOrderedSame) {
                     88:        opCode = CFEPglEnable;  fargc = 0; iargc = 1;  endGroup = YES;
                     89:
1.1       takayama   90:    }else if ([s compare: @"glEnd"] == NSOrderedSame) {
                     91:        opCode = CFEPglEnd;  fargc = 0; iargc = 0;  endGroup = YES;
                     92:
1.3       takayama   93:    }else if ([s compare: @"glFlush"] == NSOrderedSame) {
                     94:        opCode = CFEPglFlush;  fargc = 0; iargc = 0;  endGroup = YES;
1.5       takayama   95:
                     96:    }else if ([s compare: @"glLineStipple"] == NSOrderedSame) {
                     97:        opCode = CFEPglLineStipple;  fargc = 0; iargc = 2;  endGroup = YES;
                     98:
                     99:    }else if ([s compare: @"glLineWidth"] == NSOrderedSame) {
                    100:        opCode = CFEPglLineWidth;  fargc = 1; iargc = 0;  endGroup = YES;
                    101:
                    102:    }else if ([s compare: @"glNormal3f"] == NSOrderedSame) {
                    103:        opCode = CFEPglNormal3f;  fargc = 3; iargc = 0;  endGroup = YES;
1.3       takayama  104:
                    105:    }else if ([s compare: @"glPointSize"] == NSOrderedSame) {
                    106:        opCode = CFEPglPointSize;    fargc = 1; iargc = 0; endGroup = NO;
                    107:
1.1       takayama  108:    }else if ([s compare: @"glRectf"] == NSOrderedSame) {
                    109:        opCode = CFEPglRectf;    fargc = 4; iargc = 0; endGroup = YES;
                    110:
                    111:    }else if ([s compare: @"glVertex3f"] == NSOrderedSame) {
                    112:        opCode = CFEPglVertex3f;    fargc = 3; iargc = 0; endGroup = NO;
                    113:
1.6     ! takayama  114:    }else if ([s compare: @"glVertex2f"] == NSOrderedSame) {
        !           115:        opCode = CFEPglVertex2f;    fargc = 2; iargc = 0; endGroup = NO;
        !           116:
1.1       takayama  117:    }else if ([s compare: @"glib_line"] == NSOrderedSame) {
                    118:        opCode = CFEPglib_line;    fargc = 4; iargc = 1; endGroup = YES;
                    119:
                    120:    }else if ([s compare: @"glib_putpixel"] == NSOrderedSame) {
                    121:        opCode = CFEPglib_putpixel;    fargc = 2; iargc = 1; endGroup = YES;
                    122:
                    123:    }else if ([s compare: @"glib_flush"] == NSOrderedSame) {
                    124:        opCode = CFEPglib_flush;    fargc = 0; iargc = 0;   endGroup = YES;
                    125:
                    126:    }else if ([s compare: @"glib3_bounding_box"] == NSOrderedSame) {
                    127:        opCode = CFEPglib3_bounding_box;    fargc = 1; iargc = 0;   endGroup = YES;
                    128:
                    129:    }else if ([s compare: @"glib3_ray_init"] == NSOrderedSame) {
                    130:        opCode = CFEPglib3_ray_init;    fargc = 0; iargc = 0;   endGroup = YES;
                    131:
                    132:    }else if ([s compare: @"glib3_ray_reshape"] == NSOrderedSame) {
                    133:        opCode = CFEPglib3_ray_reshape;    fargc = 0; iargc = 0;   endGroup = YES;
                    134:
                    135:    }else if ([s compare: @"glib3_ray"] == NSOrderedSame) {
                    136:        opCode = CFEPglib3_ray;    fargc = 0; iargc = 0;   endGroup = YES;
                    137:        [sender output: @"Ray by David Bucciarelli. (MesaDemo, GPL)"];
                    138:
                    139:    }else if ([s compare: @"glib3_std_scene0"] == NSOrderedSame) {
                    140:        opCode = CFEPglib3_std_scene0;    fargc = 0; iargc = 0;   endGroup = YES;
                    141:        [sender output: @"glib3_std_scene0(0,0,2) using glFrustum"];
                    142:
                    143:    }else if ([s compare: @"glib3_icosahedron"] == NSOrderedSame) {
                    144:        opCode = CFEPglib3_icosahedron;    fargc = 0; iargc = 0;   endGroup = YES;
                    145:        [sender output: @"Icosahedron"];
                    146:
                    147:    }else {
                    148:     NSLog(@"Undefined command=<%@>\n",s);
                    149:        errmsg = [NSString stringWithFormat: @"Undefined command=<%@>",s];
                    150:        [sender output: errmsg];
                    151:     return nil;
                    152:    }
                    153:    // Format glxxxpfqi  fargc=p, iargc=q.  Example: glxxx4f1i, 0.1,0.2,0.3,0.4,34
1.3       takayama  154:    command = s;
                    155:    [command retain]; // bug. How to release?
1.1       takayama  156:    if (fargc > 0) {
                    157:        for (i=1; i< min(n,fargc+1); i++) {
                    158:            x = [a objectAtIndex: i];
                    159:         if ([x isMemberOfClass: [MyFloat class]] == YES) f = [x getFValue];
                    160:                else {
                    161:                  NSLog(@"float is exected.\n");
                    162:                  f = 0.0;
                    163:                }
                    164:                if (i-1 < 4) f4[i-1] = f;
                    165:        }
                    166:    }
                    167:    if (iargc > 0) {
                    168:        for (i=1+fargc; i< min(n,fargc+iargc+1); i++) {
                    169:            x = [a objectAtIndex: i];
                    170:         if ([x isMemberOfClass: [MyInt class]] == YES) ii = [x getIValue];
                    171:                else {
                    172:                  ii = 0;
                    173:                  NSLog(@"int is exected.\n");
                    174:                }
                    175:                if (i-1-fargc < 4) i4[i-1-fargc] = ii;
                    176:        }
                    177:    }
                    178:    return self;
                    179: }
                    180:
                    181: -(int) getOpCode { return opCode; }
                    182: -(double *)getF4 { return f4; }
                    183: -(int *) getI4 { return i4; }
                    184: -(NSArray *)getArgv { return argv; }
                    185:
                    186: @end
                    187:
                    188: /* Code to test MyFloat put in compile:
                    189:    MyFloat *x;
                    190:    NSLog(@"member test.\n"
                    191:    x = [MyFloat allocWith: 1.0];
                    192:    if ([x isMemberOfClass: [MyFloat class]] == YES) NSLog(@"[x class] is MyFloat\n");
                    193:    if ([x isMemberOfClass: [MyInt class]] == YES) NSLog(@"[x class] is MyInt\n");
                    194: */
                    195: @implementation MyFloat
                    196: +(MyFloat *)allocWith: (float) f {
                    197:    MyFloat *ff;
                    198:    ff=[MyFloat alloc];
                    199:    [ff setFValue: f];
                    200:    return ff;
                    201: }
                    202: -(void) setFValue: (float) f { fValue = f; }
                    203: -(float) getFValue { return fValue; }
                    204: -(NSString *)description { return [NSString stringWithFormat: @"(float)%f",fValue]; }
                    205: @end
                    206:
                    207: @implementation MyInt
                    208: +(MyInt *)allocWith: (int) i {
                    209:   MyInt *ii;
                    210:   ii=[MyInt alloc];
                    211:   [ii setIValue: i];
                    212:   return ii;
                    213: }
                    214: -(void) setIValue: (int) i { iValue = i; }
                    215: -(int) getIValue { return iValue; }
                    216: -(NSString *)description { return [NSString stringWithFormat: @"(int)%d",iValue]; }
                    217: @end
                    218:
                    219: #define SMAX  0x1000   //4096*16
                    220: @implementation MyUtil
                    221: static int debugMyUtil = 0;
                    222: +(void) setDebugMyUtil {
                    223:   if (debugMyUtil) debugMyUtil = 0;
                    224:   else debugMyUtil = 1;
                    225: }
                    226: +(NSMutableArray *) arrayOfStringFrom: (NSString *) args {
                    227:   int n,i,k,type;
                    228:   unichar c;
                    229:   unichar s[SMAX];
                    230:   NSMutableArray *a; // for debug
                    231:   NSMutableArray *aa;
                    232:   NSString *ss;
                    233:   int status,level;
                    234:   status = -1; level = 0; type = 0;
                    235:   n = [args length];
                    236:   if (n >= SMAX-1) {
                    237:     NSLog(@"Too big string for stringToArrayOfString.\n");
                    238:     return nil;
                    239:   }
                    240:   a = [NSMutableArray arrayWithCapacity: 1];
                    241:   aa = [NSMutableArray arrayWithCapacity: 1];
                    242:   for (i=0, k=0; i<n; i++) {
                    243:     c = [args characterAtIndex: i];
                    244:        if (level == 0) {
                    245:                switch (status) {  // See my note on 2006-02-20.
                    246:                case -1:
                    247:                        if ( c == '[') { k=0; status=0;}
                    248:                        break;
                    249:                case 0:
                    250:                        if ( c == '[') {
                    251:                                k = 0; s[k] = c; k++; status = 1; type = 1; // type 1 : list
                    252:                        } else if (c == ',') {
                    253:                        } else if (c == '(') {
                    254:                           k=0; status = 21; type=0;  //ex. (int)
                    255:                    } else if ((('A' <= c) && (c <= 'Z')) || (('a' <= c) && (c <= 'z'))) {
                    256:                           k=0; status = 2; type=3; s[k] = c; k++;      // type -1 : string.
                    257:                        } else if (c > ' ') {
                    258:                                k=0; status = 2; type=0; s[k] = c; k++;     // type 0 : float
                    259:                        } else if (c == ']') status = -1;
                    260:                        break;
                    261:                case 2:
                    262:                        if ((c == ',') || (c == ']')) {
                    263:                           if (c == ',') status = 0; else status = -1;
                    264:                if (k > 0) ss = [NSString stringWithCharacters: s length: k];
                    265:                           else ss = @"";
                    266:                           [a addObject: ss];
                    267:                           if (type == 2) [aa addObject: [MyInt allocWith: [ss intValue]]];
                    268:                           else if (type == 0) [aa addObject: [MyFloat allocWith: [ss floatValue]]];
                    269:                           else [aa addObject: ss];
                    270:                        }else{
                    271:                                s[k] = c; k++;
                    272:                        }
                    273:                        break;
                    274:                case 1:
                    275:                        if (c == '[') {
                    276:                           s[k] = c; k++;
                    277:                           level++;
                    278:                        }else if (c == ']') {
                    279:                           s[k] = ']'; k++;
                    280:                           if (k > 0) ss = [NSString stringWithCharacters: s length: k];
                    281:                           else ss = @"";
                    282:                           [a addObject: ss];
                    283:                           [aa addObject: [MyUtil arrayOfStringFrom: ss]];
                    284:                           status = 0;
                    285:                        }else {
                    286:                           s[k] = c; k++;
                    287:                        }
                    288:                        break;
                    289:                case 21:
                    290:             if (c == ')') {
                    291:                          if ((s[0] == 'i') && (s[1] == 'n') && (s[2] == 't')) type=2;
                    292:                          else type = 0;
                    293:                          status = 2; k = 0; // starting to read data.
                    294:                        }else if (c > ' ') {
                    295:                          s[k] = c; k++;
                    296:                        }
                    297:                        break;
                    298:                }
                    299:        }else if (level > 0) {
                    300:            s[k] = c; k++;
                    301:                if (c == '[') level++;
                    302:                else if (c == ']') level--;
                    303:        }
                    304:   }
                    305:   if (debugMyUtil) {
                    306:     NSLog(@"a=%@\n",a);
                    307:     NSLog(@"aa=%@\n",aa);
                    308:   }
                    309:   return aa;
                    310: }
                    311:
                    312: /*
                    313:    NSLog(@"mytest=%@\n",[MyUtil arrayOfStringFrom: @"[]"]);
                    314:    NSLog(@"mytest=%@\n",[MyUtil arrayOfStringFrom: @"[1,[]]"]);
                    315:    NSLog(@"mytest=%@\n",[MyUtil arrayOfStringFrom: @"[1,2,[3,4],5]"]);
                    316:    NSLog(@"mytest=%@\n",[MyUtil arrayOfStringFrom: @" [1, 2,3, 4,5]"]);
                    317:    NSLog(@"mytest=%@\n",[MyUtil arrayOfStringFrom: @"[[1],2,[[3,[4]]],5]"]); // There is a bug. Output is 1,2,...
                    318: */
                    319:
1.2       takayama  320: +(NSString *)pruneThings: (NSString *)ss {
                    321:   int n,i, start,end;
                    322:   unichar c;
                    323:   unichar s[SMAX];
                    324:   NSString *ans;
                    325:   n = [ss length];
                    326:   if (n >= SMAX-1) {
                    327:     NSLog(@"Too big string for pruneThings.\n");
                    328:     return nil;
                    329:   }
                    330:   start = 0; end = n-1;
                    331:   for (i=0; i<n; i++) {
                    332:     c = [ss characterAtIndex: i];
                    333:        start = i;
                    334:        if (c > 0x20) break;
                    335:   }
                    336:   for (i=n-1; i>=0; i--) {
                    337:     c = [ss characterAtIndex: i];
                    338:     end = i;
                    339:        if (c > 0x20) break;
                    340:   }
                    341:   if (start > end) return nil;
                    342:   for (i=0; i<= end-start ;  i++) {
                    343:     s[i] = [ss characterAtIndex: (start+i)];
                    344:        s[i+1] =0;
                    345:   }
                    346:   ans = [NSString stringWithCharacters: s length: (end-start+1)];
                    347:   return ans;
                    348: }
                    349:
                    350: +(id)attributedStringWithPath: (NSString *)path {
                    351:    NSFileWrapper *theWrapper;
                    352:    NSTextAttachment *theAttachment;
                    353:    NSAttributedString *aStr;
                    354:    theWrapper = [[NSFileWrapper alloc] initWithPath:  path];
                    355:    if (!theWrapper) NSLog(@"theWrapper is nil. Path=[%@]\n",path);
                    356:    if (!theWrapper) return nil;
                    357:    theAttachment = [[NSTextAttachment alloc] initWithFileWrapper:theWrapper];
                    358:    aStr = [NSAttributedString attributedStringWithAttachment:theAttachment];
                    359:    return aStr;   // How should I do autorelease?
                    360: }
                    361:
                    362:
                    363: @end

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