STARTDECL(gl_window) (Value &title, Value &xs, Value &ys) { if (graphics_initialized) g_vm->BuiltinError("cannot call gl_window() twice"); screensize = int2(xs.ival, ys.ival); string err = SDLInit(title.sval->str(), screensize); title.DECRT(); if (err.empty()) { OpenGLInit(); err = LoadMaterialFile("shaders/default.materials"); } if (!err.empty()) { DebugLog(1, err.c_str()); return Value(g_vm->NewString(err)); } colorshader = LookupShader("color"); assert(colorshader); meshes = new IntResourceManagerCompact<Mesh>(); DebugLog(-1, "graphics fully initialized..."); graphics_initialized = true; return Value(0, V_NIL); }
STARTDECL(ph_setshader) (Value &fixture_id, Value &shader) { auto r = GetRenderable(fixture_id.ival); auto sh = LookupShader(shader.sval->str()); shader.DECRT(); if (r && sh) r->sh = sh; return Value(); }
STARTDECL(gl_setshader) (Value &shader) { TestGL(); auto sh = LookupShader(shader.sval->str()); shader.DECRT(); if (sh) currentshader = sh; return Value(sh != NULL); }
/////////////////////////////////////////////////////////////////////////////// // Load a shader pair from file. The shader pair root is added to the shader // lookup table and can be found again if necessary with LookupShader. GLuint GLShaderManager::LoadShaderPair(const char *szVertexProgFileName, const char *szFragProgFileName) { SHADERLOOKUPETRY shaderEntry; // Make sure it's not already loaded GLuint uiReturn = LookupShader(szVertexProgFileName, szFragProgFileName); if(uiReturn != 0) return uiReturn; // Load shader and test for fail shaderEntry.uiShaderID = gltLoadShaderPair(szVertexProgFileName, szFragProgFileName); if(shaderEntry.uiShaderID == 0) return 0; // Add to the table strncpy(shaderEntry.szVertexShaderName, szVertexProgFileName, MAX_SHADER_NAME_LENGTH); strncpy(shaderEntry.szFragShaderName, szFragProgFileName, MAX_SHADER_NAME_LENGTH); // shaderTable.push_back(shaderEntry); return shaderEntry.uiShaderID; }
GLuint GLShaderManager::LoadShaderPair( const char* _vertexShaderFileName, const char* _pixelShaderFileName ) { SHADERLOOKUPETRY shaderEntry; // Make sure it's not already loaded GLuint uiReturn = LookupShader( _vertexShaderFileName, _pixelShaderFileName ); if( uiReturn != 0 ) return uiReturn; // Load shader and test for fail shaderEntry.shaderID = glsLoadShaderPair( _vertexShaderFileName, _pixelShaderFileName ); if(shaderEntry.shaderID == 0) return 0; // Add to the table strncpy_s( shaderEntry.vertexShaderName, _vertexShaderFileName, MAX_SHADER_NAME_LENGTH ); strncpy_s( shaderEntry.pixelShaderName, _pixelShaderFileName, MAX_SHADER_NAME_LENGTH ); // shaderTable.push_back(shaderEntry); return shaderEntry.shaderID; }
/////////////////////////////////////////////////////////////////////////////////////////////////////////// // Load shaders from source text. If the szName is NULL, just make it and return the handle // (useful for stock shaders). Otherwize, make sure it's not already there, then add to list GLuint GLShaderManager::LoadShaderPairSrc(const char *szName, const char *szVertexSrc, const char *szFragSrc) { // Just make it and return if(szName == NULL) return gltLoadShaderPairSrc(szVertexSrc, szFragSrc); // It has a name, check for duplicate GLuint uiShader = LookupShader(szName, szName); if(uiShader != 0) return uiShader; // Ok, make it and add to table SHADERLOOKUPETRY shaderEntry; shaderEntry.uiShaderID = gltLoadShaderPairSrc(szVertexSrc, szFragSrc); if(shaderEntry.uiShaderID == 0) return 0; // Game over, won't compile // Add it... strncpy_s(shaderEntry.szVertexShaderName, MAX_SHADER_NAME_LENGTH, szName, MAX_SHADER_NAME_LENGTH); strncpy_s(shaderEntry.szFragShaderName, MAX_SHADER_NAME_LENGTH, szName, MAX_SHADER_NAME_LENGTH); // shaderTable.push_back(shaderEntry); return shaderEntry.uiShaderID; }
/////////////////////////////////////////////////////////////////////////////////////////////// // Load the shader from source, with the supplied named attributes GLuint GLShaderManager::LoadShaderPairSrcWithAttributes(const char *szName, const char *szVertexProg, const char *szFragmentProg, ...) { // Check for duplicate GLuint uiShader = LookupShader(szName, szName); if(uiShader != 0) return uiShader; SHADERLOOKUPETRY shaderEntry; // Temporary Shader objects GLuint hVertexShader; GLuint hFragmentShader; GLint testVal; // Create shader objects hVertexShader = glCreateShader(GL_VERTEX_SHADER); hFragmentShader = glCreateShader(GL_FRAGMENT_SHADER); // Load them. gltLoadShaderSrc(szVertexProg, hVertexShader); gltLoadShaderSrc(szFragmentProg, hFragmentShader); // Compile them glCompileShader(hVertexShader); glCompileShader(hFragmentShader); // Check for errors glGetShaderiv(hVertexShader, GL_COMPILE_STATUS, &testVal); if(testVal == GL_FALSE) { glDeleteShader(hVertexShader); glDeleteShader(hFragmentShader); return 0; } glGetShaderiv(hFragmentShader, GL_COMPILE_STATUS, &testVal); if(testVal == GL_FALSE) { glDeleteShader(hVertexShader); glDeleteShader(hFragmentShader); return 0; } // Link them - assuming it works... shaderEntry.uiShaderID = glCreateProgram(); glAttachShader(shaderEntry.uiShaderID, hVertexShader); glAttachShader(shaderEntry.uiShaderID, hFragmentShader); // List of attributes va_list attributeList; va_start(attributeList, szFragmentProg); char *szNextArg; int iArgCount = va_arg(attributeList, int); // Number of attributes for(int i = 0; i < iArgCount; i++) { int index = va_arg(attributeList, int); szNextArg = va_arg(attributeList, char*); glBindAttribLocation(shaderEntry.uiShaderID, index, szNextArg); } va_end(attributeList); glLinkProgram(shaderEntry.uiShaderID); // These are no longer needed glDeleteShader(hVertexShader); glDeleteShader(hFragmentShader); // Make sure link worked too glGetProgramiv(shaderEntry.uiShaderID, GL_LINK_STATUS, &testVal); if(testVal == GL_FALSE) { glDeleteProgram(shaderEntry.uiShaderID); return 0; } // Add it... strncpy_s(shaderEntry.szVertexShaderName, MAX_SHADER_NAME_LENGTH, szName, MAX_SHADER_NAME_LENGTH); strncpy_s(shaderEntry.szFragShaderName, MAX_SHADER_NAME_LENGTH, szName, MAX_SHADER_NAME_LENGTH); // shaderTable.push_back(shaderEntry); return shaderEntry.uiShaderID; }
Renderable(const char *shname) : color(float4_1), sh(LookupShader(shname)) { assert(sh); }