Example #1
0
def write_shaders():
    code = CodeWriter(os.path.join(get_base_path(), 'shaders.cpp'))

    for shader in SHADERS:
        shader_name = '%sShader' % shader.name
        code.putlnc('class %s : public BaseShader', shader_name)
        code.start_brace()
        code.put_access('public')

        for uniform in shader.uniforms:
            code.putlnc('static int %s;', uniform[0])

        if shader.uniforms:
            code.putln('')

        asset_name = 'SHADER_%s' % shader.asset_name.upper()
        args = [asset_name]
        options = []
        if shader.has_back:
            options.append('SHADER_HAS_BACK')
        if shader.has_tex_size:
            options.append('SHADER_HAS_TEX_SIZE')
        if not options:
            if shader.tex_param:
                args.append('0')
        else:
            args.append(' | '.join(options))
        if shader.tex_param:
            args.append('"%s"' % shader.tex_param)

        code.putlnc('%s()', shader_name)
        code.putlnc(': BaseShader(%s)', ', '.join(args))
        code.start_brace()
        code.end_brace()

        code.putln('')

        code.putmeth('void initialize_parameters')
        for uniform in shader.uniforms:
            code.putlnc('%s = get_uniform(%r);', uniform[0], uniform[0],
                        cpp=False)
        code.end_brace()
        code.putln('')

        code.putmeth('static void set_parameters', 'FrameObject * instance')

        for uniform in shader.uniforms:
            param = 'SHADER_PARAM_%s' % uniform[0].upper()
            code.putlnc('BaseShader::set_%s(instance, %s, %s);', uniform[1],
                        param, uniform[0])
        if shader.tex_param:
            param = 'SHADER_PARAM_%s' % shader.tex_param.upper()
            code.putlnc('BaseShader::set_image(instance, %s);', param)
        code.end_brace()

        code.end_brace(True)

        for uniform in shader.uniforms:
            code.putlnc('int %s::%s;', shader_name, uniform[0])

        code.putln('')

    # write static init code
    for shader in SHADERS:
        shader_type = '%sShader' % shader.name
        shader_name = '%s_shader' % shader.name.lower()
        code.putlnc('%s %s;', shader_type, shader_name)

    code.close()