Esempio n. 1
0
    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);
    }
Esempio n. 2
0
	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();
	}
Esempio n. 3
0
    STARTDECL(gl_setshader) (Value &shader)
    {
        TestGL();

        auto sh = LookupShader(shader.sval->str());
        shader.DECRT();

        if (sh) currentshader = sh;

        return Value(sh != NULL);
    }
Esempio n. 4
0
///////////////////////////////////////////////////////////////////////////////
// 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;
	}
Esempio n. 5
0
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;		
	}
Esempio n. 8
0
	Renderable(const char *shname) : color(float4_1), sh(LookupShader(shname))
	{
		assert(sh);
	}