mirror of
https://github.com/Terncode/pixel.horse.git
synced 2026-09-25 06:05:52 +02:00
Archive update v0.53.2
This commit is contained in:
+57
-54
@@ -1,35 +1,41 @@
|
||||
import { spriteShader, paletteLayersShader, lightShader } from '../generated/shaders';
|
||||
import { FrameBuffer, createFrameBuffer, disposeFrameBuffer } from '../graphics/webgl/frameBuffer';
|
||||
import { SpriteSheet, CommonPalettes, PaletteManager, Camera } from '../common/interfaces';
|
||||
import { Shader, createShader, disposeShader } from '../graphics/webgl/shader';
|
||||
import { PaletteSpriteBatch, PALETTE_BATCH_BYTES_PER_VERTEX } from '../graphics/paletteSpriteBatch';
|
||||
import { getWebGLContext, getRenderTargetSize, unbindAllTexturesAndBuffers } from '../graphics/webgl/webglUtils';
|
||||
import { mergeShader, spriteShader, paletteLayersShader, lightShader } from '../generated/shaders';
|
||||
import { FrameBuffer, disposeFrameBuffer, createFrameBuffer } from '../graphics/webgl/frameBuffer';
|
||||
import { CommonPalettes, PaletteManager, Camera } from '../common/interfaces';
|
||||
import { Shader, ShaderProgramData, disposeShaderProgramData } from '../graphics/webgl/shader';
|
||||
import { PaletteSpriteBatch } from '../graphics/paletteSpriteBatch';
|
||||
import { getWebGLContext, unbindAllTexturesAndBuffers } from '../graphics/webgl/webglUtils';
|
||||
import { createCommonPalettes } from '../graphics/graphicsUtils';
|
||||
import { createTexturesForSpriteSheets, disposeTexturesForSpriteSheets } from '../graphics/spriteSheetUtils';
|
||||
import * as sprites from '../generated/sprites';
|
||||
import { SpriteBatch } from '../graphics/spriteBatch';
|
||||
import { BATCH_SIZE_MAX } from '../common/constants';
|
||||
import { BATCH_VERTEX_CAPACITY_MAX } from '../common/constants';
|
||||
|
||||
export interface WebGL {
|
||||
gl: WebGLRenderingContext;
|
||||
frameBuffer: FrameBuffer | undefined;
|
||||
frameBufferSheet: SpriteSheet;
|
||||
spriteShader: Shader;
|
||||
lightShader: Shader;
|
||||
paletteShader: Shader;
|
||||
frameBuffer?: FrameBuffer;
|
||||
frameBuffer2?: FrameBuffer;
|
||||
mergeShader: ShaderProgramData;
|
||||
paletteShader: ShaderProgramData;
|
||||
paletteShaderWithDepth: ShaderProgramData;
|
||||
spriteShader: ShaderProgramData;
|
||||
spriteShaderWithColor: ShaderProgramData;
|
||||
lightShader: ShaderProgramData;
|
||||
spriteBatch: SpriteBatch;
|
||||
paletteBatch: PaletteSpriteBatch;
|
||||
palettes: CommonPalettes;
|
||||
failedFBO: boolean;
|
||||
failedDepthBuffer: boolean;
|
||||
renderer: string;
|
||||
indexBuffer: WebGLBuffer;
|
||||
}
|
||||
|
||||
const mergeShaderSource = mergeShader;
|
||||
const spriteShaderSource = spriteShader;
|
||||
const paletteShaderSource = paletteLayersShader;
|
||||
const lightShaderSource = lightShader;
|
||||
|
||||
function createIndices(capacity: number) {
|
||||
const numIndices = (capacity * 6) | 0;
|
||||
function createIndices(vertexCount: number) {
|
||||
const numIndices = (vertexCount * 6 / 4) | 0;
|
||||
const indices = new Uint16Array(numIndices);
|
||||
|
||||
for (let i = 0, j = 0; i < numIndices; j = (j + 4) | 0) {
|
||||
@@ -52,62 +58,48 @@ export function initWebGL(canvas: HTMLCanvasElement, paletteManager: PaletteMana
|
||||
export function initWebGLResources(gl: WebGLRenderingContext, paletteManager: PaletteManager, camera: Camera): WebGL {
|
||||
let renderer = '';
|
||||
let failedFBO = false;
|
||||
let frameBuffer: FrameBuffer | undefined;
|
||||
let frameBufferSheet: SpriteSheet = { texture: undefined, sprites: [], palette: false };
|
||||
let failedDepthBuffer = false;
|
||||
let frameBuffer = {} as FrameBuffer;
|
||||
let frameBuffer2 = {} as FrameBuffer;
|
||||
|
||||
gl.enable(gl.DEPTH_TEST); // no reason to not have it enabled at all times, depth reads/writes are controlled by other parameters
|
||||
gl.disable(gl.DITHER);
|
||||
|
||||
try {
|
||||
const size = getRenderTargetSize(camera.w, camera.h);
|
||||
frameBuffer = createFrameBuffer(gl, size, size);
|
||||
frameBufferSheet.texture = frameBuffer.texture;
|
||||
createFrameBuffer(gl, frameBuffer, camera.w, camera.h, false, true, null);
|
||||
createFrameBuffer(gl, frameBuffer2, camera.w, camera.h, true, false, frameBuffer.depthStencilRenderbuffer);
|
||||
} catch (e) {
|
||||
DEVELOPMENT && console.warn(e);
|
||||
failedFBO = true;
|
||||
failedDepthBuffer = true;
|
||||
}
|
||||
|
||||
if (!failedFBO) {
|
||||
failedDepthBuffer = frameBuffer!.depthStencilRenderbuffer === null;
|
||||
}
|
||||
|
||||
createTexturesForSpriteSheets(gl, sprites.spriteSheets);
|
||||
const palettes = createCommonPalettes(paletteManager);
|
||||
|
||||
const paletteShader = createShader(gl, paletteShaderSource);
|
||||
const spriteShader = createShader(gl, spriteShaderSource);
|
||||
const lightShader = createShader(gl, lightShaderSource);
|
||||
|
||||
const VERTICES_PER_SPRITE = 4;
|
||||
const buffer = new ArrayBuffer(BATCH_SIZE_MAX * VERTICES_PER_SPRITE * PALETTE_BATCH_BYTES_PER_VERTEX);
|
||||
const vertexBuffer = gl.createBuffer();
|
||||
|
||||
if (!vertexBuffer) {
|
||||
throw new Error(`Failed to allocate vertex buffer`);
|
||||
}
|
||||
const mergeShaderRaw = new Shader(mergeShaderSource);
|
||||
const paletteShaderRaw = new Shader(paletteShaderSource);
|
||||
const spriteShaderRaw = new Shader(spriteShaderSource);
|
||||
const lightShaderRaw = new Shader(lightShaderSource);
|
||||
|
||||
const indexBuffer = gl.createBuffer();
|
||||
|
||||
if (!indexBuffer) {
|
||||
throw new Error(`Failed to allocate index buffer`);
|
||||
}
|
||||
|
||||
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
|
||||
gl.bufferData(gl.ARRAY_BUFFER, buffer, gl.STATIC_DRAW);
|
||||
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
|
||||
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, createIndices(BATCH_SIZE_MAX), gl.STATIC_DRAW);
|
||||
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, createIndices(BATCH_VERTEX_CAPACITY_MAX), gl.STATIC_DRAW);
|
||||
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
|
||||
|
||||
const vertexBuffer2 = gl.createBuffer();
|
||||
|
||||
if (!vertexBuffer2) {
|
||||
throw new Error(`Failed to allocate vertex buffer (2)`);
|
||||
}
|
||||
|
||||
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer2);
|
||||
gl.bufferData(gl.ARRAY_BUFFER, buffer, gl.STATIC_DRAW);
|
||||
|
||||
const spriteBatch = new SpriteBatch(gl, BATCH_SIZE_MAX, buffer, vertexBuffer2, indexBuffer);
|
||||
const paletteBatch = new PaletteSpriteBatch(gl, BATCH_SIZE_MAX, buffer, vertexBuffer, indexBuffer);
|
||||
const spriteBatch = new SpriteBatch(gl, BATCH_VERTEX_CAPACITY_MAX, indexBuffer);
|
||||
const paletteBatch = new PaletteSpriteBatch(gl, BATCH_VERTEX_CAPACITY_MAX, indexBuffer);
|
||||
spriteBatch.rectSprite = sprites.pixel;
|
||||
paletteBatch.rectSprite = sprites.pixel2;
|
||||
paletteBatch.defaultPalette = palettes.defaultPalette;
|
||||
|
||||
gl.bindBuffer(gl.ARRAY_BUFFER, null);
|
||||
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
|
||||
|
||||
paletteManager.init(gl);
|
||||
|
||||
const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
|
||||
@@ -116,9 +108,17 @@ export function initWebGLResources(gl: WebGLRenderingContext, paletteManager: Pa
|
||||
renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
|
||||
}
|
||||
|
||||
const mergeShader = mergeShaderRaw.compile(gl, []);
|
||||
const paletteShader = paletteShaderRaw.compile(gl, []);
|
||||
const paletteShaderWithDepth = paletteShaderRaw.compile(gl, ['DEPTH_BUFFERED']);
|
||||
const spriteShader = spriteShaderRaw.compile(gl, []);
|
||||
const spriteShaderWithColor = spriteShaderRaw.compile(gl, ['USE_COLOR']);
|
||||
const lightShader = lightShaderRaw.compile(gl, []);
|
||||
|
||||
return {
|
||||
gl, paletteShader, spriteShader, lightShader, spriteBatch, paletteBatch,
|
||||
frameBuffer, frameBufferSheet, palettes, failedFBO, renderer,
|
||||
gl, mergeShader: mergeShader, paletteShader: paletteShader, paletteShaderWithDepth: paletteShaderWithDepth,
|
||||
spriteShader: spriteShader, spriteShaderWithColor: spriteShaderWithColor, lightShader: lightShader,
|
||||
spriteBatch, paletteBatch, frameBuffer, frameBuffer2, palettes, failedFBO, failedDepthBuffer, renderer, indexBuffer
|
||||
};
|
||||
}
|
||||
|
||||
@@ -128,9 +128,12 @@ export function disposeWebGL(webgl: WebGL) {
|
||||
unbindAllTexturesAndBuffers(gl);
|
||||
disposeTexturesForSpriteSheets(gl, sprites.spriteSheets);
|
||||
disposeFrameBuffer(gl, webgl.frameBuffer);
|
||||
disposeShader(gl, webgl.lightShader);
|
||||
disposeShader(gl, webgl.spriteShader);
|
||||
disposeShader(gl, webgl.paletteShader);
|
||||
disposeShaderProgramData(gl, webgl.paletteShader);
|
||||
disposeShaderProgramData(gl, webgl.paletteShaderWithDepth);
|
||||
disposeShaderProgramData(gl, webgl.spriteShader);
|
||||
disposeShaderProgramData(gl, webgl.spriteShaderWithColor);
|
||||
disposeShaderProgramData(gl, webgl.lightShader);
|
||||
webgl.spriteBatch.dispose();
|
||||
webgl.paletteBatch.dispose();
|
||||
gl.deleteBuffer(webgl.indexBuffer);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user