Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Sep 25, 2006, 12:10:07 PM (18 years ago)
Author:
bensch
Message:

Switching to new Shader layout, with Shader and ShaderData. Shaders do not render for the time being

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/new_class_id/src/lib/graphics/shader.cc

    r9806 r9818  
    7474
    7575
    76 
     76Shader::Shader()
     77  : data(new ShaderData)
     78{
     79 
     80}
    7781
    7882/**
     
    8084*/
    8185Shader::Shader (const std::string& vertexShaderFile, const std::string& fragmentShaderFile)
     86  : data(new ShaderData)
    8287{
    83   this->registerObject(this, Shader::_objectList);
    84   this->shaderProgram = 0;
    85   this->vertexShader = 0;
    86   this->fragmentShader = 0;
     88  if (!Shader::checkShaderAbility())
     89    PRINTF(2)("Your system does not support shaders\n");
     90  else
     91    this->load(vertexShaderFile, fragmentShaderFile);
    8792
    88   if (GLEW_ARB_shader_objects && GLEW_ARB_shading_language_100)
    89   {
    90     this->shaderProgram = glCreateProgramObjectARB();
    91 
    92     if (!vertexShaderFile.empty())
    93       this->loadShaderProgramm(Shader::Vertex, vertexShaderFile);
    94     if (!fragmentShaderFile.empty())
    95       this->loadShaderProgramm(Shader::Fragment, fragmentShaderFile);
    96 
    97     this->linkShaderProgram();
    98 
    99   }
    100   else
    101   {
    102     PRINTF(2)("Shaders are not supported on your hardware\n");
    103   }
    10493}
    10594
     95const Shader* Shader::storedShader = NULL;
    10696
    107 /**
    108  * standard deconstructor
    109  */
    110 Shader::~Shader ()
     97void Shader::activateShader() const
    11198{
    112   if (this->shaderProgram == glGetHandleARB(GL_PROGRAM_OBJECT_ARB))
    113     Shader::deactivateShader();
    114 
    115   // delete what has to be deleted here
    116   this->deleteProgram(Shader::Vertex);
    117   this->deleteProgram(Shader::Fragment);
    118 
    119   if (this->fragmentShader != 0)
     99  if (likely (this->getProgram() != 0))
    120100  {
    121     glDetachObjectARB(this->shaderProgram, this->fragmentShader);
    122     glDeleteObjectARB(this->fragmentShader);
    123   }
    124   if (this->vertexShader != 0)
    125   {
    126     glDetachObjectARB(this->shaderProgram, this->vertexShader);
    127     glDeleteObjectARB(this->vertexShader);
    128   }
    129   if (this->shaderProgram != 0)
    130   {
    131     GLint status = 0;
    132     //glLinkProgramARB(this->shaderProgram);
    133     glDeleteObjectARB(this->shaderProgram);
    134     // link error checking
    135     glGetObjectParameterivARB(this->shaderProgram, GL_OBJECT_DELETE_STATUS_ARB, &status);
    136     if (status == GL_INVALID_VALUE || status == GL_INVALID_OPERATION)
    137       this->printError(this->shaderProgram);
    138   }
    139 }
    140 
    141 Shader* Shader::storedShader = NULL;
    142 
    143 
    144 bool Shader::loadShaderProgramm(Shader::Type type, const std::string& fileName)
    145 {
    146   GLhandleARB shader = 0;
    147 
    148   if (type != Shader::Vertex && type != Shader::Fragment)
    149     return false;
    150   this->deleteProgram(type);
    151 
    152 
    153   std::string program;
    154   if (!readShader(fileName, program))
    155     return false;
    156 
    157   if (type == Shader::Vertex && GLEW_ARB_vertex_shader)
    158   {
    159     this->vertexShaderFile = fileName;
    160 
    161     shader = this->vertexShader = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
    162   }
    163 
    164   if (type == Shader::Fragment && GLEW_ARB_fragment_shader)
    165   {
    166     this->fragmentShaderFile = fileName;
    167 
    168     shader = this->fragmentShader = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
    169   }
    170 
    171   if (shader != 0)
    172   {
    173     GLint status = 0;
    174     const char* prog = program.c_str();
    175 
    176     glShaderSourceARB(shader, 1, &prog, NULL);
    177     glCompileShaderARB(shader);
    178     // checking on error.
    179     glGetObjectParameterivARB(shader, GL_OBJECT_COMPILE_STATUS_ARB, &status);
    180     if (status == GL_INVALID_VALUE || status == GL_INVALID_OPERATION)
    181       this->printError(shader);
    182     else
    183       glAttachObjectARB(this->shaderProgram, shader);
    184   }
    185   return true;
    186 }
    187 
    188 
    189 void Shader::linkShaderProgram()
    190 {
    191   GLint status = 0;
    192 
    193   glLinkProgramARB(this->shaderProgram);
    194   // link error checking
    195   glGetObjectParameterivARB(this->shaderProgram, GL_OBJECT_LINK_STATUS_ARB, &status);
    196   if (status == GL_INVALID_VALUE || status == GL_INVALID_OPERATION)
    197     this->printError(this->shaderProgram);
    198 }
    199 
    200 
    201 bool Shader::readShader(const std::string& fileName, std::string& output)
    202 {
    203   char lineBuffer[PARSELINELENGTH];
    204 
    205   std::ifstream shader;
    206   shader.open(fileName.c_str());
    207   if (!shader.is_open())
    208     return false;
    209 
    210 
    211   while (!shader.eof())
    212   {
    213     shader.getline(lineBuffer, PARSELINELENGTH);
    214     output += lineBuffer;
    215     output += "\n";
    216   }
    217 
    218 
    219   shader.close();
    220   return true;
    221 }
    222 
    223 
    224 
    225 void Shader::activateShader()
    226 {
    227   if (likely (this->shaderProgram != 0))
    228   {
    229     glUseProgramObjectARB(this->shaderProgram);
     101    glUseProgramObjectARB(this->getProgram());
    230102    Shader::storedShader = this;
    231103  }
    232104}
    233 
    234 void Shader::bindShader(const char* name, const float* value, size_t size)
    235 {
    236   if (likely (this->shaderProgram != 0))
    237   {
    238     glUseProgramObjectARB(this->shaderProgram);
    239 
    240     unsigned int location = glGetUniformLocationARB(this->shaderProgram, name);
    241     /* This is EXPENSIVE and should be avoided. */
    242 
    243     if      (size == 1)  glUniform1fvARB(location, 1, value);
    244     else if (size == 2)  glUniform2fvARB(location, 1, value);
    245     else if (size == 3)  glUniform3fvARB(location, 1, value);
    246     else if (size == 4)  glUniform4fvARB(location, 1, value);
    247     else if (size == 9)  glUniformMatrix3fvARB(location, 1, false, value);
    248     else if (size == 16) glUniformMatrix4fvARB(location, 1, false, value);
    249 
    250   }
    251 }
    252 
    253105void Shader::deactivateShader()
    254106{
     
    256108    glUseProgramObjectARB(0);
    257109  Shader::storedShader = NULL;
    258 }
    259 
    260 
    261 void Shader::deleteProgram(Shader::Type type)
    262 {
    263   GLint status = 0;
    264   if (type == Shader::Vertex && this->vertexShader != 0)
    265   {
    266     this->vertexShaderFile = "";
    267     glDetachObjectARB(this->shaderProgram, this->vertexShader);
    268     glDeleteObjectARB(this->vertexShader);
    269     glGetObjectParameterivARB(this->vertexShader, GL_OBJECT_DELETE_STATUS_ARB, &status);
    270     if (status == GL_INVALID_VALUE || status == GL_INVALID_OPERATION)
    271       Shader::printError(this->vertexShader);
    272     this->vertexShader = 0;
    273   }
    274   else if (type == Shader::Fragment && this->fragmentShader != 0)
    275   {
    276     this->fragmentShaderFile = "";
    277     glDetachObjectARB(this->shaderProgram, this->fragmentShader);
    278     glDeleteObjectARB(this->fragmentShader);
    279     glGetObjectParameterivARB(this->fragmentShader, GL_OBJECT_DELETE_STATUS_ARB, &status);
    280     if (status == GL_INVALID_VALUE || status == GL_INVALID_OPERATION)
    281       Shader::printError(this->fragmentShader);
    282     this->fragmentShader = 0;
    283   }
    284   else
    285     return;
    286 }
    287 
    288 
    289 void Shader::printError(GLhandleARB program)
    290 {
    291   if (program == 0)
    292     return;
    293 
    294   int infologLength = 0;
    295   int charsWritten  = 0;
    296   char *infoLog;
    297 
    298   glGetObjectParameterivARB(program, GL_OBJECT_INFO_LOG_LENGTH_ARB,
    299                             &infologLength);
    300 
    301   if (infologLength > 0)
    302   {
    303     infoLog = new char[infologLength+1];
    304     glGetInfoLogARB(program, infologLength, &charsWritten, infoLog);
    305     printf("%s\n", infoLog);
    306     delete[] infoLog;
    307   }
    308110}
    309111
     
    319121}
    320122
    321 void Shader::debug() const
    322 {
    323   PRINT(3)("Shader info: (SHADER: %d)\n", this->shaderProgram);
    324   if (this->vertexShader != 0)
    325   {
    326     /*    PRINT(3)("VertexShaderProgramm: number=%d, file='%s'\n", this->vertexShader, this->vertexShaderFile);
    327         if (this->vertexShaderSource != NULL)
    328           for (unsigned int i = 0; i < this->vertexShaderSource->getCount(); i++)
    329             PRINT(3)("%d: %s\n", i, this->vertexShaderSource->getEntry(i));
    330       }
    331       if (this->fragmentShader != 0)
    332       {
    333         PRINT(3)("FragmentShaderProgramm: number=%d, file='%s'\n", this->fragmentShader, this->fragmentShaderFile);
    334         if (this->fragmentShaderSource != NULL)
    335           for (unsigned int i = 0; i < this->fragmentShaderSource->getCount(); i++)
    336             PRINT(3)("%d: %s\n", i, this->fragmentShaderSource->getEntry(i));*/
    337   }
    338 }
    339123
Note: See TracChangeset for help on using the changeset viewer.