home *** CD-ROM | disk | FTP | other *** search
- #include "Shader.h"
-
- #include "RendererInfo.h"
- #include "Renderer.h"
- #include "TextureHandler.h"
- #include "log.h"
-
- #include <stdlib.h>
-
- AnimFunction::AnimFunction(int numSamples, char** samples){
- this->numSamples=numSamples<SHADER_ANIM_FUNCTION_MAX_SAMPLES ? numSamples : SHADER_ANIM_FUNCTION_MAX_SAMPLES;
- for(int i=0;i<this->numSamples;i++){
- sscanf(samples[i], "%i %f", &this->samples[i].time, &this->samples[i].value);
- // printf("sample: %i, %f ; numSamples: %i\n", this->samples[i].time, this->samples[i].value, this->numSamples);
- }
- }
- AnimFunction::~AnimFunction(){
- }
- float AnimFunction::getValue(int time){
- int sample;
-
- for(sample=0;sample<numSamples-1;sample++){
- if(time>=samples[sample].time && time<samples[sample+1].time)
- break;
- }
- if(sample>=numSamples-1)
- return 0.0f;
-
- float t=(time-samples[sample].time)/(float)(samples[sample+1].time-samples[sample].time);
-
- return (t*samples[sample+1].value + (1.0f-t)*samples[sample].value);
- }
-
-
- ColAnim::ColAnim(){
- red=NULL;
- green=NULL;
- blue=NULL;
- alpha=NULL;
- duration=0;
- combineMode=SHADER_COMBINE_MODE_ADD;
- }
- ColAnim::~ColAnim(){
- if(red!=NULL)
- delete red;
- if(green!=NULL)
- delete green;
- if(blue!=NULL)
- delete blue;
- if(alpha!=NULL)
- delete alpha;
- }
- void ColAnim::setup(unsigned int time){
- if(duration==0)
- return;
-
- vec4_t col;
- int modTime=time % duration;
- float r=0.0f;
- float g=0.0f;
- float b=0.0f;
- float a=0.0f;
-
- if(red!=NULL)
- r=red->getValue(modTime);
- if(green!=NULL)
- g=green->getValue(modTime);
- if(blue!=NULL)
- b=blue->getValue(modTime);
- if(alpha!=NULL)
- a=alpha->getValue(modTime);
-
- vectorInit4d(r, g, b, a, col);
- if(combineMode==SHADER_COMBINE_MODE_ADD){
- // get glcolor;
- // add...
- }else if(combineMode==SHADER_COMBINE_MODE_MODULATE){
- // get glcolor;
- // add...
- }else if(combineMode==SHADER_COMBINE_MODE_REPLACE){
- glColor4fv(col);
- }
- }
- void ColAnim::setdown(){
- }
- bool ColAnim::readFromFile(File* f){
- char buff[256];
- Tokenizer t(" =\t\n\r\"", "\"");
-
- while(f->readLine(256, buff, true) != -1){
- //printf("COLANIM: line: %s\n", buff);
- t.tokenize(buff);
-
- if(t.tokc==0)
- continue;
- /*
- if(t.tokc!=2){
- warn("(in Arena::readFromFile()): Wrong number of tokens in line %i (needed 2 but read %i).\n\n", line, t.tokc);
- continue;
- }
- */
- if(streq(t.tokv[0], "red") && t.tokc>1){
- red=new AnimFunction(t.tokc-1, &t.tokv[1]);
- if(red->samples[red->numSamples-1].time > duration)
- duration=red->samples[red->numSamples-1].time;
- }else if(streq(t.tokv[0], "green") && t.tokc>1){
- green=new AnimFunction(t.tokc-1, &t.tokv[1]);
- if(green->samples[green->numSamples-1].time > duration)
- duration=green->samples[green->numSamples-1].time;
- }else if(streq(t.tokv[0], "blue") && t.tokc>1){
- blue=new AnimFunction(t.tokc-1, &t.tokv[1]);
- if(blue->samples[blue->numSamples-1].time > duration)
- duration=blue->samples[blue->numSamples-1].time;
- }else if(streq(t.tokv[0], "alpha") && t.tokc>1){
- alpha=new AnimFunction(t.tokc-1, &t.tokv[1]);
- if(alpha->samples[alpha->numSamples-1].time > duration)
- duration=alpha->samples[alpha->numSamples-1].time;
- }else if(streq(t.tokv[0], "combineMode")){
- if(streq(t.tokv[1], "ADD")){
- combineMode=SHADER_COMBINE_MODE_ADD;
- }else if(streq(t.tokv[1], "MODULATE")){
- combineMode=SHADER_COMBINE_MODE_MODULATE;
- }else if(streq(t.tokv[1], "REPLACE")){
- combineMode=SHADER_COMBINE_MODE_REPLACE;
- }else{
- warn("(in TexCoordAnim::readFromFile() (%s, line %i)): Unknown combineMode '%s'.\n\n", f->filename, f->line, t.tokv[1]);
- }
-
- }else if(streq(t.tokv[0], "{")){
- continue;
- }else if(streq(t.tokv[0], "}")){
- break;//return true;
- }else{
- warn("(in TexCoordAnim::readFromFile() (%s, line %i)): Unknown token '%s'.\n\n", f->filename, f->line, t.tokv[0]);
- }
- }
-
- return true;
- }
-
-
- BaseOptions::BaseOptions(){
- flags=0;
- collisionFlags=COLLISION_FLAG_NONE;
- surfaceType = MATERIAL_SURFACE_TYPE_METAL;
- vectorInit4d(1.0f, 1.0f, 1.0f, 1.0f, color);
- colAnim=NULL;
- alphaFunc_id=0; // oder GL_GREATER??
- alphaFunc_val=0.0f;
- depthFunc_id=0;
- depthFunc_val=0.0f;
- blendFunc_srcFactor=GL_SRC_ALPHA;
- blendFunc_dstFactor=GL_ONE_MINUS_SRC_ALPHA;
- polygonOffset = 0.0f;
- }
-
- BaseOptions::~BaseOptions(){
- if(colAnim!=NULL)
- delete colAnim;
- }
-
-
- void BaseOptions::setup(unsigned int time){
- glColor4fv(color);
-
- if(flags & SHADER_FLAG_BLEND){
- glEnable(GL_BLEND);
- glBlendFunc(blendFunc_srcFactor, blendFunc_dstFactor);
- }
- if(flags & SHADER_FLAG_ALPHA_TEST){
- glAlphaFunc(alphaFunc_id, alphaFunc_val);
- glEnable(GL_ALPHA_TEST);
- }
- if(flags & SHADER_FLAG_NO_LIGHTING){
- Renderer::disableLighting();
- }
- // if(flags & SHADER_FLAG_NO_DEPTH_WRITE){
- // glDisable(GL_DEPTH_WRITE);
- // }
- if(flags & SHADER_FLAG_TWO_SIDED){
- glDisable(GL_CULL_FACE);
- }
-
- if(flags & SHADER_FLAG_POLYGON_OFFSET){
- glEnable(GL_POLYGON_OFFSET_FILL);
- glPolygonOffset(polygonOffset, polygonOffset);
- }
-
- if(colAnim!=NULL){
- colAnim->setup(time);
- }
- }
-
- void BaseOptions::setdown(){
-
- if(flags & SHADER_FLAG_BLEND){
- glDisable(GL_BLEND);
- }
- if(flags & SHADER_FLAG_ALPHA_TEST){
- glDisable(GL_ALPHA_TEST);
- }
- if(flags & SHADER_FLAG_NO_LIGHTING){
- Renderer::enableLighting();
- }
- // if(flags & SHADER_FLAG_NO_DEPTH_WRITE){
- // glEnable(GL_DEPTH_WRITE);
- // }
- if(flags & SHADER_FLAG_TWO_SIDED){
- glEnable(GL_CULL_FACE);
- }
-
- if(flags & SHADER_FLAG_POLYGON_OFFSET){
- glDisable(GL_POLYGON_OFFSET_FILL);
- }
-
- if(colAnim!=NULL){
- colAnim->setdown();
- }
- }
-
- bool BaseOptions::readFromFile(File* f){
- char buff[256];
- Tokenizer t(" =\t\n\r\"|", "\"");
-
- while(f->readLine(256, buff, true) != -1){
- //printf("BASE: line: %s\n", buff);
- t.tokenize(buff);
-
- if(t.tokc==0)
- continue;
- /*
- if(t.tokc!=2){
- warn("(in Arena::readFromFile()): Wrong number of tokens in line %i (needed 2 but read %i).\n\n", line, t.tokc);
- continue;
- }
- */
- if(streq(t.tokv[0], "flags")){
- for(int i=1;i<t.tokc;i++){
- if(streq(t.tokv[i], "BLEND")){
- flags |= SHADER_FLAG_BLEND;
- }else if(streq(t.tokv[i], "ALPHA_TEST")){
- flags |= SHADER_FLAG_ALPHA_TEST;
- }else if(streq(t.tokv[i], "NO_DEPTH_TEST")){
- flags |= SHADER_FLAG_NO_DEPTH_TEST;
- }else if(streq(t.tokv[i], "NO_DEPTH_WRITE")){
- flags |= SHADER_FLAG_NO_DEPTH_WRITE;
- }else if(streq(t.tokv[i], "NO_LIGHTING")){
- flags |= SHADER_FLAG_NO_LIGHTING;
- }else if(streq(t.tokv[i], "TWO_SIDED")){
- flags |= SHADER_FLAG_TWO_SIDED;
- }else if(streq(t.tokv[i], "POLYGON_OFFSET")){
- flags |= SHADER_FLAG_POLYGON_OFFSET;
- }else{
- warn("(in BaseOptions::readFromFile() (%s, line %i)): Unknown flag '%s'.\n\n", f->filename, f->line, t.tokv[i]);
- }
-
- }
- }else if(streq(t.tokv[0], "collisionFlags")){
- for(int i=1;i<t.tokc;i++){
- if(streq(t.tokv[i], "WALK_THROUGH")){
- collisionFlags |= COLLISION_FLAG_WALK_THROUGH;
- }else if(streq(t.tokv[i], "SHOOT_THROUGH")){
- collisionFlags |= COLLISION_FLAG_SHOOT_THROUGH;
- }else{
- warn("(in BaseOptions::readFromFile() (%s, line %i)): Unknown collisionFlag '%s'.\n\n", f->filename, f->line, t.tokv[i]);
- }
-
- }
- }else if(streq(t.tokv[0], "blendFunc") && t.tokc==3){
- if(streq(t.tokv[1], "SRC_ALPHA")){
- blendFunc_srcFactor=GL_SRC_ALPHA;
- }else if(streq(t.tokv[1], "ONE_MINUS_SRC_ALPHA")){
- blendFunc_srcFactor=GL_ONE_MINUS_SRC_ALPHA;
- }else{
- warn("(in BaseOptions::readFromFile() (%s, line %i)): Unknown source blend factor '%s'.\n\n", f->filename, f->line, t.tokv[1]);
- }
-
- if(streq(t.tokv[2], "SRC_ALPHA")){
- blendFunc_dstFactor=GL_SRC_ALPHA;
- }else if(streq(t.tokv[2], "ONE_MINUS_SRC_ALPHA")){
- blendFunc_dstFactor=GL_ONE_MINUS_SRC_ALPHA;
- }else{
- warn("(in BaseOptions::readFromFile() (%s, line %i)): Unknown destination blend factor '%s'.\n\n", f->filename, f->line, t.tokv[2]);
- }
- }else if(streq(t.tokv[0], "alphaFunc") && t.tokc==3){
- if(streq(t.tokv[1], "NEVER")){
- alphaFunc_id=GL_NEVER;
- }else if(streq(t.tokv[1], "ALWAYS")){
- alphaFunc_id=GL_ALWAYS;
- }else if(streq(t.tokv[1], "GREATER")){
- alphaFunc_id=GL_GREATER;
- }else if(streq(t.tokv[1], "LESS")){
- alphaFunc_id=GL_LESS;
- }else if(streq(t.tokv[1], "EQUAL")){
- alphaFunc_id=GL_EQUAL;
- }else if(streq(t.tokv[1], "NOTEQUAL")){
- alphaFunc_id=GL_NOTEQUAL;
- }else{
- warn("(in BaseOptions::readFromFile() (%s, line %i)): Unknown alphaFunc id '%s'.\n\n", f->filename, f->line, t.tokv[1]);
- }
-
- alphaFunc_val=(float)atof(t.tokv[2]);
- }else if(streq(t.tokv[0], "polygonOffset") && t.tokc==2){
- polygonOffset = (float)atof(t.tokv[1]);
- }else if(streq(t.tokv[0], "color")){
- sscanf(t.tokv[1], "%f %f %f %f", &color[0], &color[1], &color[2], &color[3]);
- }else if(streq(t.tokv[0], "colAnim")){
- colAnim=new ColAnim();
- colAnim->readFromFile(f);
-
- }else if(streq(t.tokv[0], "{")){
- continue;
- }else if(streq(t.tokv[0], "}")){
- break;//return true;
- }else{
- warn("(in BaseOptions::readFromFile() (%s, line %i)): Unknown token '%s'.\n\n", f->filename, f->line, t.tokv[0]);
- }
- }
-
- return true;
- }
-
-
-
-
-
-
- TexAnim::TexAnim(){
- numFrames=0;
- duration=0;
- }
-
- TexAnim::~TexAnim(){
- for(int i=0;i<numFrames;i++){
- TextureHandler::releaseTexture(frames[i].texture);
- }
- }
-
- void TexAnim::setup(unsigned int time){
- if(duration==0)
- return;
-
- int frame=0;
- int modTime=time % duration;
-
- for(frame=0;frame<numFrames;frame++){
- if(modTime>=frames[frame].startTime && modTime<frames[frame].startTime+frames[frame].delayTime)
- break;
- }
- if(frame<numFrames){
- glBindTexture(GL_TEXTURE_2D, frames[frame].texture->texName);
- }
- }
-
- void TexAnim::setdown(){
- }
-
- bool TexAnim::readFromFile(File* f){
- char buff[256];
- Tokenizer t(" =\t\n\r\"|", "\"");
-
- while(f->readLine(256, buff, true) != -1){
- //printf("TEXANIM: line: %s\n", buff);
- t.tokenize(buff);
-
- if(t.tokc==0)
- continue;
- /*
- if(t.tokc!=2){
- warn("(in TexAnim::readFromFile()): Wrong number of tokens (needed 2 but read %i).\n\n", t.tokc);
- continue;
- }
- */
- if(streq(t.tokv[0], "{")){
- continue;
- }else if(streq(t.tokv[0], "}")){
- break;//return true;
- }else if(t.tokc==2){
- Tokenizer t2(t.tokv[0], "[]", "");
- if(t2.tokc==3)
- readRange(&t2, atoi(t.tokv[1]));
- else{
- frames[numFrames].texture=TextureHandler::getTexture(t.tokv[0]);
- frames[numFrames].delayTime=atoi(t.tokv[1]);
- frames[numFrames].startTime=duration;
- duration+=frames[numFrames].delayTime;
- numFrames++;
- if(numFrames==SHADER_MAX_TEX_ANIM_FRAMES)
- break;
- }
- }else{
- warn("(in TexAnim::readFromFile() (%s, line %i)): Unknown token '%s'.\n\n", f->filename, f->line, t.tokv[0]);
- }
-
- }
-
- return true;
- }
-
- bool TexAnim::readRange(Tokenizer* t, int delayTime){
- int first=0;
- int last=0;
- int i;
- char name[256];
-
- // if(sscanf(t->tokv[1], "%i...%i", &first, &last) != 2)
- // return false;
- first=atoi(t->tokv[1]);
- last=atoi(&t->tokv[1][5]);
-
- //printf("READ RANGE: %i...%i (%s)\n", first, last, t->tokv[1]);
-
- for(i=first; i<=last; i++){
- strcpy(name, t->tokv[0]);
- if(i<10)
- strcat(name, "0");
- sprintf(&name[strlen(name)], "%i", i);
- strcat(name, t->tokv[2]);
-
- frames[numFrames].texture=TextureHandler::getTexture(name);
- frames[numFrames].delayTime=delayTime;
- frames[numFrames].startTime=duration;
- duration+=frames[numFrames].delayTime;
- numFrames++;
- if(numFrames==SHADER_MAX_TEX_ANIM_FRAMES)
- break;
- }
-
- return true;
- }
-
-
- TexCoordAnim::TexCoordAnim(){
- duration=0;
- // combineMode=SHADER_COMBINE_MODE_ADD;
- uModFunc=NULL;
- vModFunc=NULL;
- uAddFunc=NULL;
- vAddFunc=NULL;
- }
- TexCoordAnim::~TexCoordAnim(){
- if(uModFunc!=NULL)
- delete uModFunc;
- if(vModFunc!=NULL)
- delete vModFunc;
- if(uAddFunc!=NULL)
- delete uAddFunc;
- if(vAddFunc!=NULL)
- delete vAddFunc;
- }
-
- void TexCoordAnim::setup(unsigned int time){
- int modTime=0;
- if(duration!=0)
- modTime = time % duration;
-
- float uMod=1.0f;
- float vMod=1.0f;
- float uAdd=0.0f;
- float vAdd=0.0f;
-
- float m[16]={ 1.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 1.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 1.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 1.0f
- };
-
- glMatrixMode(GL_TEXTURE);
- glPushMatrix();
-
- if(uModFunc!=NULL)
- uMod=uModFunc->getValue(modTime);
- if(vModFunc!=NULL)
- vMod=vModFunc->getValue(modTime);
- if(uAddFunc!=NULL)
- uAdd=uAddFunc->getValue(modTime);
- if(vAddFunc!=NULL)
- vAdd=vAddFunc->getValue(modTime);
-
- m[0]=uMod;
- m[5]=vMod;
- m[12]=uAdd;
- m[13]=vAdd;
- /*
- if(combineMode==SHADER_COMBINE_MODE_ADD){
- m[12]=u;
- m[13]=v;
- // printf("u: %f, v: %f\n", u, v);
- }else if(combineMode==SHADER_COMBINE_MODE_REPLACE){
- m[0]=0.0f;
- m[5]=0.0f;
- m[12]=u;
- m[13]=v;
- }else if(combineMode==SHADER_COMBINE_MODE_MODULATE){
- m[0]=u;
- m[5]=v;
- }
- */
- glLoadMatrixf(m);
-
- glMatrixMode(GL_MODELVIEW);
- }
-
- void TexCoordAnim::setdown(){
- glMatrixMode(GL_TEXTURE);
- glPopMatrix();
-
- glMatrixMode(GL_MODELVIEW);
-
- }
-
- bool TexCoordAnim::readFromFile(File* f){
- char buff[256];
- Tokenizer t(" =\t\n\r\"", "\"");
-
- while(f->readLine( 256, buff, true) != -1){
- //printf("TEXCOORDANIM: line: %s\n", buff);
- t.tokenize(buff);
-
- if(t.tokc==0)
- continue;
- /*
- if(t.tokc!=2){
- warn("(in Arena::readFromFile()): Wrong number of tokens in line %i (needed 2 but read %i).\n\n", line, t.tokc);
- continue;
- }
- */
- if(streq(t.tokv[0], "uMod") && t.tokc>1){
- uModFunc=new AnimFunction(t.tokc-1, &t.tokv[1]);
- if(uModFunc->samples[uModFunc->numSamples-1].time > duration)
- duration=uModFunc->samples[uModFunc->numSamples-1].time;
- }else if(streq(t.tokv[0], "vMod") && t.tokc>1){
- vModFunc=new AnimFunction(t.tokc-1, &t.tokv[1]);
- if(vModFunc->samples[vModFunc->numSamples-1].time > duration)
- duration=vModFunc->samples[vModFunc->numSamples-1].time;
- }else if(streq(t.tokv[0], "uAdd") && t.tokc>1){
- uAddFunc=new AnimFunction(t.tokc-1, &t.tokv[1]);
- if(uAddFunc->samples[uAddFunc->numSamples-1].time > duration)
- duration=uAddFunc->samples[uAddFunc->numSamples-1].time;
- }else if(streq(t.tokv[0], "vAdd") && t.tokc>1){
- vAddFunc=new AnimFunction(t.tokc-1, &t.tokv[1]);
- if(vAddFunc->samples[vAddFunc->numSamples-1].time > duration)
- duration=vAddFunc->samples[vAddFunc->numSamples-1].time;
- /* }else if(streq(t.tokv[0], "combineMode")){
- if(streq(t.tokv[1], "ADD")){
- combineMode=SHADER_COMBINE_MODE_ADD;
- }else if(streq(t.tokv[1], "MODULATE")){
- combineMode=SHADER_COMBINE_MODE_MODULATE;
- }else if(streq(t.tokv[1], "REPLACE")){
- combineMode=SHADER_COMBINE_MODE_REPLACE;
- }
- */
- }else if(streq(t.tokv[0], "{")){
- continue;
- }else if(streq(t.tokv[0], "}")){
- break;//return true;
- }else{
- warn("(in TexCoordAnim::readFromFile() (%s, line %i)): Unknown token '%s'.\n\n", f->filename, f->line, t.tokv[0]);
- }
- }
-
- return true;
- }
-
-
-
- MapChannelOptions::MapChannelOptions(){
- texUnit=GL_TEXTURE0_ARB;
- map=NULL;
- texAnim=NULL;
- texCoordAnim=NULL;
- texMode=GL_MODULATE;
- }
-
- MapChannelOptions::~MapChannelOptions(){
- if(texAnim!=NULL)
- delete texAnim;
- if(texCoordAnim!=NULL)
- delete texCoordAnim;
- if(map!=NULL)
- TextureHandler::releaseTexture(map);
- }
-
- void MapChannelOptions::setup(unsigned int time){
- if(map!=NULL){
- glEnable(GL_TEXTURE_2D);
- glBindTexture(GL_TEXTURE_2D, map->texName);
- glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, texMode);
- }else if(texAnim!=NULL){
- glEnable(GL_TEXTURE_2D);
- texAnim->setup(time);
- glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, texMode);
- }
-
- if(texCoordAnim!=NULL){
- texCoordAnim->setup(time);
- }
- }
-
- void MapChannelOptions::setdown(){
- if(map!=NULL || texAnim!=NULL){
- glDisable(GL_TEXTURE_2D);
- }
-
- if(texCoordAnim!=NULL){
- texCoordAnim->setdown();
- }
- }
-
- bool MapChannelOptions::readFromFile(File* f){
- char buff[256];
- Tokenizer t(" =\t\n\r\"|", "\"");
-
- while(f->readLine(256, buff, true) != -1){
- //printf("MAP: line: %s\n", buff);
- t.tokenize(buff);
-
- if(t.tokc==0)
- continue;
- /*
- if(t.tokc!=2){
- warn("(in Arena::readFromFile()): Wrong number of tokens in line %i (needed 2 but read %i).\n\n", line, t.tokc);
- continue;
- }
- */
- if(streq(t.tokv[0], "texMode")){
- if(t.tokc==2){
- if(streq(t.tokv[1], "ADD")){
- texMode=GL_ADD;
- }else if(streq(t.tokv[1], "MODULATE")){
- texMode=GL_MODULATE;
- }else if(streq(t.tokv[1], "REPLACE")){
- texMode=GL_REPLACE;
- }else if(streq(t.tokv[1], "DECAL")){
- texMode=GL_DECAL;
- }else if(streq(t.tokv[1], "BLEND")){
- texMode=GL_BLEND;
- }else{
- warn("(in MapChannelOptions::readFromFile() (%s, line %i)): Unknown texmode '%s'.\n\n", f->filename, f->line, t.tokv[1]);
- }
- }else{
- warn("(in MapChannelOptions::readFromFile() (%s, line %i)): Expected texMode identifier after token 'texMode'.\n\n", f->filename, f->line);
- }
- }else if(streq(t.tokv[0], "map")){
- if(t.tokc==2){
- map=TextureHandler::getTexture(t.tokv[1]);
- }else{
- warn("(in MapChannelOptions::readFromFile() (%s, line %i)): Expected map filename after token 'map'.\n\n", f->filename, f->line);
- }
- }else if(streq(t.tokv[0], "texAnim")){
- texAnim=new TexAnim();
- texAnim->readFromFile(f);
- }else if(streq(t.tokv[0], "texCoordAnim")){
- texCoordAnim=new TexCoordAnim();
- texCoordAnim->readFromFile(f);
-
- }else if(streq(t.tokv[0], "{")){
- continue;
- }else if(streq(t.tokv[0], "}")){
- break;//return true;
- }else{
- warn("(in MapChannelOptions::readFromFile() (%s, line %i)): Unknown token '%s'.\n\n", f->filename, f->line, t.tokv[0]);
- }
- }
-
- return true;
- }
-
-
-
- Shader::Shader(const char* filename){
- this->filename=findShaderForImageFile(filename);
-
- name=NULL;
- base=NULL;
- mapChannel1=NULL;
- mapChannel2=NULL;
-
- if(this->filename==NULL){
- error("(in Shader::Shader()): Couldn't find shader for image file '%s'.\n\n", filename);
- return;
- }
-
- File* f=new File(this->filename, "rt");
- if(f->isOpen()){
- readFromFile(f);
- f->close();
- log("Shader loaded: '%s'.\n", name);
- }else{
- error("(in Shader::Shader()): Couldn't open file '%s'.\n\n", this->filename);
- }
- }
-
- Shader::~Shader(){
- if(filename!=NULL){
- delete filename;
- }
- if(name!=NULL){
- delete name;
- }
- if(base!=NULL){
- delete base;
- }
- if(mapChannel1!=NULL){
- delete mapChannel1;
- }
- if(mapChannel2!=NULL){
- delete mapChannel2;
- }
- }
-
- char* Shader::findShaderForImageFile(const char* filename){
- Tokenizer t(filename, ".", "");
- char buff[256];
-
- strcpy(buff, t.tokv[0]);
- strcat(buff, ".shader");
-
- return File::searchAndCreatePath(buff, Renderer::info.var.textureSearchPath);
- }
-
-
-
- void Shader::setup(unsigned int time){
- if(base!=NULL)
- base->setup(time);
- if(mapChannel1!=NULL){
- mapChannel1->setup(time);
- }
- if(mapChannel2!=NULL && _glActiveTextureARB!=NULL){
- _glActiveTextureARB(GL_TEXTURE1_ARB);
- mapChannel2->setup(time);
- _glActiveTextureARB(GL_TEXTURE0_ARB);
- }
- }
-
- void Shader::setdown(){
- if(base!=NULL)
- base->setdown();
- if(mapChannel1!=NULL){
- mapChannel1->setdown();
- }
- if(mapChannel2!=NULL && _glActiveTextureARB!=NULL){
- _glActiveTextureARB(GL_TEXTURE1_ARB);
- mapChannel2->setdown();
- _glActiveTextureARB(GL_TEXTURE0_ARB);
- }
- }
-
- bool Shader::readFromFile(File* f){
- char buff[256];
- Tokenizer t(" =\t\n\r\"", "\"");
-
- while(f->readLine(256, buff, true) != -1){
-
- //printf("SHADER: line: %s\n", buff);
- t.tokenize(buff);
-
- if(t.tokc==0)
- continue;
- /*
- if(t.tokc!=2){
- warn("(in Arena::readFromFile()): Wrong number of tokens in line %i (needed 2 but read %i).\n\n", line, t.tokc);
- continue;
- }
- */
- if(streq(t.tokv[0], "shader")){
- if(t.tokc==2){
- name=newString(t.tokv[1]);
- }else{
- warn("(in Shader::readFromFile() (%s, line %i)): Expected name after token 'shader'.\n\n", f->filename, f->line);
- name=newString("unnamed");
- }
- }else if(streq(t.tokv[0], "base")){
- base=new BaseOptions();
- base->readFromFile(f);
- }else if(streq(t.tokv[0], "mapChannel1")){
- mapChannel1=new MapChannelOptions();
- mapChannel1->readFromFile(f);
- }else if(streq(t.tokv[0], "mapChannel2")){
- mapChannel2=new MapChannelOptions();
- mapChannel2->readFromFile(f);
-
- }else if(streq(t.tokv[0], "{")){
- continue;
- }else if(streq(t.tokv[0], "}")){
- break;//return true;
- }else{
- warn("(in Shader::readFromFile() (%s, line %i)): Unknown token '%s'.\n\n", f->filename, f->line, t.tokv[0]);
- }
- }
-
- return true;
- }
-
-