/// import vert_src from "./vertex.vert"; import frag_src from "./fragment.frag"; import {createProgramFromSource, ProgramError, ShaderError} from "./gl_util"; import { Camera } from "./camera"; import * as G from "./glWrapper"; import { Drawable, RenderState } from "./drawable"; import { Model } from "./model"; import { mat4, vec3 } from "gl-matrix"; export interface DirectionalLight{ color : vec3; ambientIntensity : number; direction : vec3; diffuseIntensity : number; } export interface Material{ specularIntensity: number; shininess: number; } export class PhongProgram extends G.GLProgram{ gl: WebGL2RenderingContext; constructor(gl: WebGL2RenderingContext){ super(createProgramFromSource(gl,vert_src,frag_src)); this.gl = gl; this._viewMat = mat4.create(); this._projectionMat = mat4.create(); this._modelMat = mat4.create(); } private _viewMat : mat4; public get viewMat() : mat4 { return this._viewMat; } public set viewMat(v : mat4) { if(!mat4.equals(v,this._viewMat)){ this.setUniformMat4f(this.gl,"viewMat",v); this._viewMat = v; } } private _projectionMat : mat4; public get projectionMat() : mat4 { return this._projectionMat; } public set projectionMat(v : mat4) { if(!mat4.equals(v,this._projectionMat)){ this.setUniformMat4f(this.gl,"projectionMat",v); this._projectionMat = v; } } private _modelMat : mat4; public get modelMat() : mat4 { return this._modelMat; } public set modelMat(v : mat4) { if(!mat4.equals(v,this._modelMat)){ this.setUniformMat4f(this.gl,"modelMat",v); this._modelMat = v; } } private _colorTextureID : number; public get colorTextureID() : number { return this._colorTextureID; } public set colorTextureID(v : number) { if(v !== this._colorTextureID){ this.setUniform1i(this.gl,"material.colorTexture",v); this._colorTextureID = v; } } updateDirectionalLight(light: DirectionalLight){ this.setUniform3fv(this.gl,"light.color",light.color); this.setUniform1f(this.gl,"light.ambientIntensity",light.ambientIntensity); this.setUniform3fv(this.gl,"light.direction",light.direction); this.setUniform1f(this.gl,"light.diffuseIntensity",light.diffuseIntensity); } updateMaterial(material: Material){ this.setUniform1f(this.gl,"material.shininess",material.shininess); this.setUniform1f(this.gl,"material.specularIntensity",material.specularIntensity); } }