This is ShaderInspector.m in view mode; [Download] [Up]
// Copyright 1992 Thomas A. Dilligan
// All Rights Reserved
//
// For best results, set tabstop=4
#import "ShaderInspector.h"
int CheckExtension(char *check,char *ext)
{
int cnt;
int lencheck;
int lenext;
int good=0;
lencheck=strlen(check);
lenext=strlen(ext);
if(lencheck>lenext)
{
lencheck-=lenext;
for(cnt=0,good=1;cnt<lenext;cnt++)
good=good && (check[lencheck+cnt]==ext[cnt]);
}
return good;
}
@implementation ShaderInspector
- fillShaders:listObj
{
DIR *dirstream;
struct direct *currentdir;
int i;
id tid;
char *path;
char *paths[]={"~/Library/Shaders","/NextLibrary/Shaders","/LocalLibrary/Shaders"};
char name[255];
for(i=0;i<3;i++)
{
path=paths[i];
dirstream=opendir(path);
if(dirstream)
for(currentdir=readdir(dirstream);currentdir;currentdir=readdir(dirstream))
if(CheckExtension(currentdir->d_name,".slo"))
{
strcpy(name, currentdir->d_name);
name[strlen(name)-4]=0;
tid=[[N3DShader alloc] initWithShader:name];
[listObj addObject:tid];
}
}
return self;
}
- appDidInit:sender
{
char text[MAX_STLN];
char *finalSlash;
int i,j;
id temp=NULL;
RtPoint point = {0.0,0.0,0.0};
shaders=[[List alloc] initCount:0];
strcpy(text, NXArgv[0]);
finalSlash = rindex(text, '/');
for(i=0;i<6;i++)
currentShaders[i]=NULL;
if (finalSlash)
{
*finalSlash = '\0';
chdir(text);
}
[self fillShaders:shaders];
for(j=0;j<6;j++)
{
for(i=0;i<[shaders count];i++)
if([[shaders objectAt:i] shaderType]==SLO_TYPE_SURFACE+j)
{
switch(j)
{
case 0:
temp=[[surfacePopUp popUpList] addItem:[[shaders objectAt:i] shader]];
break;
case 1:
temp=[[lightPopUp popUpList] addItem:[[shaders objectAt:i] shader]];
break;
case 2:
temp=[[displacementPopUp popUpList] addItem:[[shaders objectAt:i] shader]];
break;
case 3:
temp=[[volumePopUp popUpList] addItem:[[shaders objectAt:i] shader]];
break;
case 4:
temp=[[transformationPopUp popUpList] addItem:[[shaders objectAt:i] shader]];
break;
case 5:
temp=[[imagerPopUp popUpList] addItem:[[shaders objectAt:i] shader]];
break;
}
[temp setTarget:self];
[temp setTag:i];
[temp setAction:@selector(shaderChange:)];
}
[[inspectionButtons findCellWithTag:j] setEnabled:NO];
}
temp=[[surfacePopUp popUpList] addItem:"None"];
[surfacePopUp setTitle:"None"];
[temp setTarget:self];
[temp setTag:-1];
[temp setAction:@selector(shaderChange:)];
temp=[[lightPopUp popUpList] addItem:"None"];
[lightPopUp setTitle:"None"];
[temp setTarget:self];
[temp setTag:-3];
[temp setAction:@selector(shaderChange:)];
temp=[[displacementPopUp popUpList] addItem:"None"];
[displacementPopUp setTitle:"None"];
[temp setTarget:self];
[temp setTag:-2];
[temp setAction:@selector(shaderChange:)];
temp=[[volumePopUp popUpList] addItem:"None"];
[volumePopUp setTitle:"None"];
[temp setTarget:self];
[temp setTag:-4];
[temp setAction:@selector(shaderChange:)];
temp=[[transformationPopUp popUpList] addItem:"None"];
[transformationPopUp setTitle:"None"];
[temp setTarget:self];
[temp setTag:-5];
[temp setAction:@selector(shaderChange:)];
temp=[[imagerPopUp popUpList] addItem:"None"];
[imagerPopUp setTitle:"None"];
[temp setTarget:self];
[temp setTag:-6];
[temp setAction:@selector(shaderChange:)];
for(i=0;i<5;i++)
{
lights[i]=[[N3DLight alloc] init];
switch(i)
{
case 0:
[lights[0] makeAmbientWithIntensity:4.0];
break;
case 1:
point[0]=1;
point[1]=-1;
point[2]=1;
[lights[i] makePointFrom:point intensity:0.0];
break;
case 2:
point[0]=0;
point[1]=0;
point[2]=3;
[lights[i] makePointFrom:point intensity:0.0];
break;
case 3:
point[0]=1;
point[1]=1;
point[2]=0;
[lights[i] makePointFrom:point intensity:0.0];
break;
case 4:
point[0]=-1;
point[1]=-1;
point[2]=3;
[lights[i] makePointFrom:point intensity:0.0];
break;
}
[view addLight:lights[i]];
}
[[view window] orderFront:self];
return self;
}
- shaderChange:sender
{
int i;
if([[sender selectedCell] tag]<0)
{
i=-[[sender selectedCell] tag] - 1;
currentShaders[i]=NULL;
}
else
{
i=[[shaders objectAt:[[sender selectedCell] tag]] shaderType]-5;
currentShaders[i]=[shaders objectAt:[[sender selectedCell] tag]];
}
[[inspectionButtons findCellWithTag:i] setEnabled:(int)[shaders objectAt:[[sender selectedCell] tag]]];
return self;
}
- shaderInspect:sender
{
while(!shaderInspector)
{
shaderInspector=[GenericShaderInspector alloc];
[NXApp loadNibSection:"Inspector.nib" owner:shaderInspector];
}
[shaderInspector showSelfAndInspect:currentShaders[[[sender selectedCell] tag]]];
return self;
}
- pointLightLevelsChange:sender;
{
[[pointLevels findCellWithTag:[[sender selectedCell] tag]] setFloatValue:[[sender selectedCell] floatValue]];
return self;
}
- ambientLightLevelChange:sender;
{
[ambientLevel setFloatValue:[sender floatValue]];
return self;
}
- renderPhotoreal:sender;
{
int i;
for(i=0;i<5;i++)
switch(i)
{
case 0:
[lights[0] setIntensity:[ambientLevel floatValue]];
break;
case 1:
case 2:
case 3:
case 4:
[lights[i] setIntensity:[[pointLevels findCellWithTag:(i-1)] floatValue]];
break;
}
[[view worldShape] resetShaders];
for(i=0;i<6;i++)
if(currentShaders[i])
[(N3DShape *)[view worldShape] setShader:currentShaders[i]];
[view displayPhotoreal];
[[view worldShape] resetShaders];
for(i=0;i<5;i++)
[lights[i] setIntensity:0];
return self;
}
- showInfoPanel:sender
{
if(!infoPanel)
infoPanel=[NXApp loadNibSection:"Info.nib" owner:self];
[infoPanel orderFront:self];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.