dragonbones-runtime
Version:
the tools to build dragonbones file for diffrent framework
144 lines (108 loc) • 5.42 kB
text/typescript
//////////////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2014-present, Egret Technology.
// All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
// * Neither the name of the Egret nor the
// names of its contributors may be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY EGRET AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
// IN NO EVENT SHALL EGRET AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE, DATA,
// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//////////////////////////////////////////////////////////////////////////////////////
namespace egret.web {
function loadShader(gl:WebGLRenderingContext, type:number, source:string):WebGLShader {
let shader = gl.createShader(type);
gl.shaderSource(shader, source);
gl.compileShader(shader);
let compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
if(!compiled) {
console.log("shader not compiled!");
console.log(gl.getShaderInfoLog(shader));
}
return shader;
}
function createWebGLProgram(gl:WebGLRenderingContext, vertexShader:WebGLShader, fragmentShader:WebGLShader):WebGLProgram {
let program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
return program;
}
function extractAttributes(gl:WebGLRenderingContext, program:WebGLProgram):Attributes {
let attributes:Attributes = {};
let totalAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);
for (let i = 0; i < totalAttributes; i++) {
let attribData = gl.getActiveAttrib(program, i);
let name = attribData.name;
let attribute = new EgretWebGLAttribute(gl, program, attribData);
attributes[name] = attribute;
}
return attributes;
}
function extractUniforms(gl:WebGLRenderingContext, program:WebGLProgram):Uniforms {
let uniforms:Uniforms = {};
let totalUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);
for(let i = 0; i < totalUniforms; i++) {
let uniformData = gl.getActiveUniform(program, i);
let name = uniformData.name;
let uniform = new EgretWebGLUniform(gl, program, uniformData);
uniforms[name] = uniform;
}
return uniforms;
}
type ProgramCache = {[index:string]:EgretWebGLProgram};
type Uniforms = {[index:string]:EgretWebGLUniform};
type Attributes = {[index:string]:EgretWebGLAttribute};
/**
* @private
*/
export class EgretWebGLProgram {
private static programCache:ProgramCache = {};
/**
* 获取所需的WebGL Program
* @param key {string} 对于唯一的program程序,对应唯一的key
*/
public static getProgram(gl:WebGLRenderingContext, vertSource:string, fragSource:string, key:string):EgretWebGLProgram {
if(!this.programCache[key]) {
this.programCache[key] = new EgretWebGLProgram(gl, vertSource, fragSource);
}
return this.programCache[key];
}
public static deleteProgram(gl:WebGLRenderingContext, vertSource:string, fragSource:string, key:string):void {
// TODO delete
}
private vshaderSource:string;
private fshaderSource:string;
private vertexShader:WebGLShader;
private fragmentShader:WebGLShader;
public id:WebGLProgram;
public attributes:Attributes;
public uniforms:Uniforms;
private constructor(gl:WebGLRenderingContext, vertSource:string, fragSource:string) {
this.vshaderSource = vertSource;
this.fshaderSource = fragSource;
this.vertexShader = loadShader(gl, gl.VERTEX_SHADER, this.vshaderSource);
this.fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, this.fshaderSource);
this.id = createWebGLProgram(gl, this.vertexShader, this.fragmentShader);
this.uniforms = extractUniforms(gl, this.id);
this.attributes = extractAttributes(gl, this.id);
}
}
}