// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

import {GlslContext, GlslLib, GlslLibRoutine} from './glsl-definitions';
import {getGlsl} from './glsl-source';

/**
 * This GLSL library handles routines around reading a texlet and writing to it
 * Reading and writing could be more than just dealing with one channel
 * It may require encoding/decoding to/from 4 channels into one
 */
export class FragColorGlslLib extends GlslLib {
  constructor(context: GlslContext) {
    super(context);
  }
  getFunctions(): {[name: string]: GlslLibRoutine} {
    return {...this.setFragColor(), ...this.getColorAsFloat()};
  }
  getCustomTypes(): {[name: string]: string} {
    return {};
  }
  protected setFragColor(): {[name: string]: GlslLibRoutine} {
    const glsl = getGlsl(this.context.glContext.version);
    return {
      setFragColor: new GlslLibRoutine(
          `
        void setFragColor(float value) {
            ${glsl.output} = encode(value);
        }
        `,
          ['encoding.encode'])
    };
  }
  protected getColorAsFloat(): {[name: string]: GlslLibRoutine} {
    return {
      getColorAsFloat: new GlslLibRoutine(
          `
        float getColorAsFloat(vec4 color) {
            return decode(color);
        }
        `,
          ['encoding.decode'])
    };
  }
}
