142 lines
3.9 KiB
TypeScript
142 lines
3.9 KiB
TypeScript
|
import {mat4} from 'gl-matrix';
|
||
|
|
||
|
|
||
|
(() => {
|
||
|
const body = document.getElementsByTagName('body')[0];
|
||
|
|
||
|
const canvas = document.getElementById('rpgedit') as HTMLCanvasElement;
|
||
|
if (!canvas)
|
||
|
return;
|
||
|
|
||
|
const gl = canvas.getContext('webgl') as WebGLRenderingContext;
|
||
|
if (!gl)
|
||
|
return;
|
||
|
|
||
|
gl.clearColor(0.0, 0.0, 0.0, 1.0);
|
||
|
gl.enable(gl.DEPTH_TEST);
|
||
|
|
||
|
|
||
|
function compileShader(type: number, src: string): WebGLShader|null {
|
||
|
let shader = gl.createShader(type);
|
||
|
if (!shader) {
|
||
|
console.error('Unable to create shader');
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
gl.shaderSource(shader, src);
|
||
|
gl.compileShader(shader);
|
||
|
|
||
|
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
||
|
console.error('Unable to compile shader');
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
return shader;
|
||
|
}
|
||
|
|
||
|
|
||
|
let shaderVertexPositionAttribute: number;
|
||
|
let shaderPMatrixUniform: WebGLUniformLocation|null;
|
||
|
let shaderVMatrixUniform: WebGLUniformLocation|null;
|
||
|
|
||
|
function initShaders(): void {
|
||
|
let shaderProgram = gl.createProgram();
|
||
|
|
||
|
let vertexShader = compileShader(gl.VERTEX_SHADER, require('./default.vs'));
|
||
|
|
||
|
let fragmentShaderSrc = require('./default.fs');
|
||
|
let fragmentShader = compileShader(gl.FRAGMENT_SHADER, require('./default.fs'));
|
||
|
|
||
|
if (!vertexShader || !fragmentShader)
|
||
|
return;
|
||
|
|
||
|
gl.attachShader(shaderProgram, vertexShader);
|
||
|
gl.attachShader(shaderProgram, fragmentShader);
|
||
|
|
||
|
gl.linkProgram(shaderProgram);
|
||
|
if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
|
||
|
console.error('Unable to link shader');
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
gl.useProgram(shaderProgram);
|
||
|
|
||
|
shaderVertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
|
||
|
gl.enableVertexAttribArray(shaderVertexPositionAttribute);
|
||
|
|
||
|
shaderPMatrixUniform = gl.getUniformLocation(shaderProgram, "uPMatrix");
|
||
|
shaderVMatrixUniform = gl.getUniformLocation(shaderProgram, "uVMatrix");
|
||
|
}
|
||
|
|
||
|
|
||
|
const triangleVertexPositionBuffer = gl.createBuffer();
|
||
|
const squareVertexPositionBuffer = gl.createBuffer();
|
||
|
|
||
|
function initScene(): void {
|
||
|
gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexPositionBuffer);
|
||
|
const triangleVertices = [
|
||
|
0.0, 1.0, 0.0,
|
||
|
-1.0, -1.0, 0.0,
|
||
|
1.0, -1.0, 0.0
|
||
|
];
|
||
|
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(triangleVertices), gl.STATIC_DRAW);
|
||
|
|
||
|
gl.bindBuffer(gl.ARRAY_BUFFER, squareVertexPositionBuffer);
|
||
|
const squareVertices = [
|
||
|
1.0, 1.0, 0.0,
|
||
|
-1.0, 1.0, 0.0,
|
||
|
1.0, -1.0, 0.0,
|
||
|
-1.0, -1.0, 0.0
|
||
|
];
|
||
|
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(squareVertices), gl.STATIC_DRAW);
|
||
|
}
|
||
|
|
||
|
initShaders();
|
||
|
initScene();
|
||
|
|
||
|
const pMatrix = mat4.create();
|
||
|
const vMatrix = mat4.create();
|
||
|
|
||
|
function drawScene(): void {
|
||
|
if (!shaderPMatrixUniform || !shaderVMatrixUniform)
|
||
|
return;
|
||
|
|
||
|
let width = canvas.width, height = canvas.height
|
||
|
|
||
|
gl.viewport(0, 0, width, height);
|
||
|
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
|
||
|
|
||
|
mat4.perspective(pMatrix, 45, width / height, 0.1, 100.0);
|
||
|
gl.uniformMatrix4fv(shaderPMatrixUniform, false, pMatrix);
|
||
|
|
||
|
mat4.identity(vMatrix);
|
||
|
mat4.translate(vMatrix, vMatrix, [-1.5, 0.0, -7.0]);
|
||
|
gl.uniformMatrix4fv(shaderVMatrixUniform, false, vMatrix);
|
||
|
|
||
|
gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexPositionBuffer);
|
||
|
gl.vertexAttribPointer(shaderVertexPositionAttribute, 3, gl.FLOAT, false, 0, 0);
|
||
|
gl.drawArrays(gl.TRIANGLES, 0, 3);
|
||
|
|
||
|
mat4.translate(vMatrix, vMatrix, [3.0, 0.0, 0.0]);
|
||
|
gl.uniformMatrix4fv(shaderVMatrixUniform, false, vMatrix);
|
||
|
|
||
|
gl.bindBuffer(gl.ARRAY_BUFFER, squareVertexPositionBuffer);
|
||
|
gl.vertexAttribPointer(shaderVertexPositionAttribute, 3, gl.FLOAT, false, 0, 0);
|
||
|
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
||
|
}
|
||
|
|
||
|
function setSize(): void {
|
||
|
var e = document.documentElement;
|
||
|
var w = window.innerWidth || e.clientWidth || body.clientWidth;
|
||
|
var h = window.innerHeight || e.clientHeight || body.clientHeight;
|
||
|
|
||
|
canvas.width = w;
|
||
|
canvas.height = h;
|
||
|
|
||
|
drawScene()
|
||
|
}
|
||
|
|
||
|
window.addEventListener('resize', () => setSize());
|
||
|
setSize();
|
||
|
})();
|