home *** CD-ROM | disk | FTP | other *** search
/ Altsys Virtuoso 2.0K / virtuoso_20k.iso / DemoApps / Graphics / 2D_3D / ShaderInspector / Source / ShaderInspector.m < prev    next >
Encoding:
Text File  |  1992-12-02  |  5.6 KB  |  249 lines

  1. //    Copyright 1992  Thomas A. Dilligan
  2. //        All Rights Reserved
  3. //
  4. // For best results, set tabstop=4
  5.  
  6. #import "ShaderInspector.h"
  7.  
  8. int CheckExtension(char *check,char *ext)
  9. {
  10.     int cnt;
  11.     int lencheck;
  12.     int lenext;
  13.     int good=0;
  14.     lencheck=strlen(check);
  15.     lenext=strlen(ext);
  16.     if(lencheck>lenext)
  17.     {
  18.         lencheck-=lenext;
  19.         for(cnt=0,good=1;cnt<lenext;cnt++)
  20.             good=good && (check[lencheck+cnt]==ext[cnt]);
  21.     }
  22.     return good;
  23. }
  24.  
  25. @implementation ShaderInspector
  26.  
  27. - fillShaders:listObj 
  28. {
  29.     DIR *dirstream;
  30.     struct direct *currentdir;
  31.     int i;
  32.     id tid;
  33.     char *path;
  34.     char *paths[]={"~/Library/Shaders","/NextLibrary/Shaders","/LocalLibrary/Shaders"};
  35.     char name[255];
  36.     for(i=0;i<3;i++)
  37.     {
  38.         path=paths[i];
  39.         dirstream=opendir(path);
  40.         if(dirstream)
  41.             for(currentdir=readdir(dirstream);currentdir;currentdir=readdir(dirstream))
  42.                 if(CheckExtension(currentdir->d_name,".slo"))
  43.                 {
  44.                     strcpy(name, currentdir->d_name);
  45.                     name[strlen(name)-4]=0;
  46.                     tid=[[N3DShader alloc] initWithShader:name];
  47.                     [listObj addObject:tid];
  48.                 }
  49.     }
  50.     return self;
  51. }
  52.  
  53. - appDidInit:sender
  54. {
  55.     char text[MAX_STLN];
  56.     char *finalSlash;
  57.     int i,j;
  58.     id temp=NULL;
  59.     RtPoint point = {0.0,0.0,0.0};
  60.     shaders=[[List alloc] initCount:0];
  61.     strcpy(text, NXArgv[0]);
  62.     finalSlash = rindex(text, '/');
  63.     for(i=0;i<6;i++)
  64.         currentShaders[i]=NULL;
  65.     if (finalSlash)
  66.     {
  67.         *finalSlash = '\0';
  68.         chdir(text);
  69.     }
  70.     [self fillShaders:shaders];
  71.     for(j=0;j<6;j++)
  72.     {
  73.         for(i=0;i<[shaders count];i++)
  74.             if([[shaders objectAt:i] shaderType]==SLO_TYPE_SURFACE+j)
  75.             {
  76.                 switch(j)
  77.                 {
  78.                     case 0:
  79.                         temp=[[surfacePopUp popUpList] addItem:[[shaders objectAt:i] shader]];
  80.                     break;
  81.                     case 1:
  82.                         temp=[[lightPopUp popUpList] addItem:[[shaders objectAt:i] shader]];
  83.                     break;
  84.                     case 2:
  85.                         temp=[[displacementPopUp popUpList] addItem:[[shaders objectAt:i] shader]];
  86.                     break;
  87.                     case 3:
  88.                         temp=[[volumePopUp popUpList] addItem:[[shaders objectAt:i] shader]];
  89.                     break;
  90.                     case 4:
  91.                         temp=[[transformationPopUp popUpList] addItem:[[shaders objectAt:i] shader]];
  92.                     break;
  93.                     case 5:
  94.                         temp=[[imagerPopUp popUpList] addItem:[[shaders objectAt:i] shader]];
  95.                     break;
  96.                 }
  97.                 [temp setTarget:self];
  98.                 [temp setTag:i];
  99.                 [temp setAction:@selector(shaderChange:)];
  100.             }
  101.         [[inspectionButtons findCellWithTag:j] setEnabled:NO];
  102.     }
  103.     temp=[[surfacePopUp popUpList] addItem:"None"];
  104.     [surfacePopUp setTitle:"None"];
  105.     [temp setTarget:self];
  106.     [temp setTag:-1];
  107.     [temp setAction:@selector(shaderChange:)];
  108.     temp=[[lightPopUp popUpList] addItem:"None"];
  109.     [lightPopUp setTitle:"None"];
  110.     [temp setTarget:self];
  111.     [temp setTag:-3];
  112.     [temp setAction:@selector(shaderChange:)];
  113.     temp=[[displacementPopUp popUpList] addItem:"None"];
  114.     [displacementPopUp setTitle:"None"];
  115.     [temp setTarget:self];
  116.     [temp setTag:-2];
  117.     [temp setAction:@selector(shaderChange:)];
  118.     temp=[[volumePopUp popUpList] addItem:"None"];
  119.     [volumePopUp setTitle:"None"];
  120.     [temp setTarget:self];
  121.     [temp setTag:-4];
  122.     [temp setAction:@selector(shaderChange:)];
  123.     temp=[[transformationPopUp popUpList] addItem:"None"];
  124.     [transformationPopUp setTitle:"None"];
  125.     [temp setTarget:self];
  126.     [temp setTag:-5];
  127.     [temp setAction:@selector(shaderChange:)];
  128.     temp=[[imagerPopUp popUpList] addItem:"None"];
  129.     [imagerPopUp setTitle:"None"];
  130.     [temp setTarget:self];
  131.     [temp setTag:-6];
  132.     [temp setAction:@selector(shaderChange:)];
  133.  
  134.     for(i=0;i<5;i++)
  135.     {
  136.         lights[i]=[[N3DLight alloc] init];
  137.         switch(i)
  138.         {
  139.             case 0:
  140.                 [lights[0] makeAmbientWithIntensity:4.0];
  141.             break;
  142.             case 1:
  143.                 point[0]=1;
  144.                 point[1]=-1;
  145.                 point[2]=1;
  146.                 [lights[i] makePointFrom:point intensity:0.0];
  147.             break;
  148.             case 2:
  149.                 point[0]=0;
  150.                 point[1]=0;
  151.                 point[2]=3;
  152.                 [lights[i] makePointFrom:point intensity:0.0];
  153.             break;
  154.             case 3:
  155.                 point[0]=1;
  156.                 point[1]=1;
  157.                 point[2]=0;
  158.                 [lights[i] makePointFrom:point intensity:0.0];
  159.             break;
  160.             case 4:
  161.                 point[0]=-1;
  162.                 point[1]=-1;
  163.                 point[2]=3;
  164.                 [lights[i] makePointFrom:point intensity:0.0];
  165.             break;
  166.         }            
  167.         [view addLight:lights[i]];
  168.     }
  169.     [[view window] orderFront:self];
  170.     return self; 
  171. }
  172.  
  173. - shaderChange:sender
  174. {
  175.     int i;
  176.     if([[sender selectedCell] tag]<0)
  177.     {
  178.         i=-[[sender selectedCell] tag] - 1;
  179.         currentShaders[i]=NULL;
  180.     }
  181.     else
  182.     {
  183.         i=[[shaders objectAt:[[sender selectedCell] tag]] shaderType]-5;
  184.         currentShaders[i]=[shaders objectAt:[[sender selectedCell] tag]];
  185.     }
  186.     [[inspectionButtons findCellWithTag:i] setEnabled:(int)[shaders objectAt:[[sender selectedCell] tag]]];
  187.     return self;
  188. }
  189.  
  190. - shaderInspect:sender
  191. {
  192.     while(!shaderInspector)
  193.     {
  194.         shaderInspector=[GenericShaderInspector alloc];
  195.         [NXApp loadNibSection:"Inspector.nib" owner:shaderInspector];    
  196.     }
  197.     [shaderInspector showSelfAndInspect:currentShaders[[[sender selectedCell] tag]]];    
  198.     return self;
  199. }
  200.  
  201. - pointLightLevelsChange:sender;
  202. {
  203.     [[pointLevels findCellWithTag:[[sender selectedCell] tag]] setFloatValue:[[sender selectedCell] floatValue]];
  204.     return self;
  205. }
  206.  
  207. - ambientLightLevelChange:sender;
  208. {
  209.     [ambientLevel setFloatValue:[sender floatValue]];
  210.     return self;
  211. }
  212.  
  213. - renderPhotoreal:sender;
  214. {
  215.     int i;
  216.     for(i=0;i<5;i++)
  217.         switch(i)
  218.         {
  219.             case 0:
  220.                 [lights[0] setIntensity:[ambientLevel floatValue]];
  221.             break;
  222.             case 1:
  223.             case 2:
  224.             case 3:
  225.             case 4:
  226.                 [lights[i] setIntensity:[[pointLevels findCellWithTag:(i-1)] floatValue]];
  227.             break;
  228.         }
  229.     [[view worldShape] resetShaders];
  230.     for(i=0;i<6;i++)
  231.         if(currentShaders[i])
  232.             [(N3DShape *)[view worldShape] setShader:currentShaders[i]];
  233.     [view displayPhotoreal];
  234.     [[view worldShape] resetShaders];
  235.     for(i=0;i<5;i++)
  236.         [lights[i] setIntensity:0];
  237.     return self;
  238. }
  239.  
  240. - showInfoPanel:sender
  241. {
  242.     if(!infoPanel)
  243.         infoPanel=[NXApp loadNibSection:"Info.nib" owner:self];
  244.     [infoPanel orderFront:self];
  245.     return self;
  246. }
  247.  
  248. @end
  249.