Skip to content
Snippets Groups Projects
Select Git revision
  • acad04cb412c9e8d7896d24b1d50ef1490f06f2c
  • master default protected
  • devel
  • hruska-feature-clients-api
  • malostik-#5066-deduplicate-idea-ids
  • warden-postgresql-port
  • hruska-feature-#6799-filter-keys
  • hruska-feature-5066-duplicateIdeaID
  • warden-client-3.0-beta3
  • warden-server-3.0-beta3
  • warden-client-2.2-final
  • warden-server-2.2-final
  • warden-client-3.0-beta2
  • warden-server-3.0-beta2
  • warden-client-2.2
  • warden-server-2.2-patch3
  • warden-client-3.0-beta1
  • warden-server-3.0-beta1
  • warden-server-2.2-patch1
  • warden-client-3.0-beta0
  • warden-server-3.0-beta0
  • warden-server-2.2
  • warden-server-2.1-patch1
  • warden-client-2.1
  • warden-server-2.1
  • warden-server-2.1-beta6
  • warden-server-2.1-beta5
  • warden-server-2.1-beta4
28 results

package_version

Blame
  • shader.ts 1.84 KiB
    /**
     * Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
     *
     * @author Alexander Rose <alexander.rose@weirdbyte.de>
     */
    
    import { idFactory } from '../../mol-util/id-factory';
    import { GLRenderingContext } from './compat';
    import { isDebugMode } from '../../mol-util/debug';
    
    const getNextShaderId = idFactory();
    
    function addLineNumbers(source: string) {
        const lines = source.split('\n');
        for (let i = 0; i < lines.length; ++i) {
            lines[i] = (i + 1) + ': ' + lines[i];
        }
        return lines.join('\n');
    }
    
    export type ShaderType = 'vert' | 'frag'
    export type ShaderProps = { type: ShaderType, source: string }
    export interface Shader {
        readonly id: number
        attach: (program: WebGLProgram) => void
        reset: () => void
        destroy: () => void
    }
    
    export function getShader(gl: GLRenderingContext, props: ShaderProps) {
        const { type, source } = props;
        const shader = gl.createShader(type === 'vert' ? gl.VERTEX_SHADER : gl.FRAGMENT_SHADER);
        if (shader === null) {
            throw new Error(`Error creating ${type} shader`);
        }
    
        gl.shaderSource(shader, source);
        gl.compileShader(shader);
    
        if (isDebugMode && gl.getShaderParameter(shader, gl.COMPILE_STATUS) === false) {
            console.warn(`'${type}' shader info log '${gl.getShaderInfoLog(shader)}'\n${addLineNumbers(source)}`);
            throw new Error(`Error compiling ${type} shader`);
        }
    
        return shader;
    }
    
    export function createShader(gl: GLRenderingContext, props: ShaderProps): Shader {
        let shader = getShader(gl, props);
    
        return {
            id: getNextShaderId(),
            attach: (program: WebGLProgram) => {
                gl.attachShader(program, shader);
            },
    
            reset: () => {
                shader = getShader(gl, props);
            },
            destroy: () => {
                gl.deleteShader(shader);
            }
        };
    }